[Skiboot] [PATCH 07/16] core: hardcode P9 large decrementer width

Nicholas Piggin npiggin at gmail.com
Tue Jan 8 01:04:19 AEDT 2019


There is no good reason to "discover" the large decremeter width.
We are firmware, we know the large decrementer width.

Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
---
 core/cpu.c | 43 +++++++------------------------------------
 1 file changed, 7 insertions(+), 36 deletions(-)

diff --git a/core/cpu.c b/core/cpu.c
index 5d933bf5c..e7ffe3003 100644
--- a/core/cpu.c
+++ b/core/cpu.c
@@ -1044,48 +1044,19 @@ void init_boot_cpu(void)
 	init_hid();
 }
 
-static void enable_large_dec(bool on)
-{
-	u64 lpcr = mfspr(SPR_LPCR);
-
-	if (on)
-		lpcr |= SPR_LPCR_P9_LD;
-	else
-		lpcr &= ~SPR_LPCR_P9_LD;
-
-	mtspr(SPR_LPCR, lpcr);
-	isync();
-}
-
-#define HIGH_BIT (1ull << 63)
-
 static int find_dec_bits(void)
 {
-	int bits = 65; /* we always decrement once */
-	u64 mask = ~0ull;
+	int bits;
 
 	if (proc_gen < proc_gen_p9)
-		return 32;
-
-	/* The ISA doesn't specify the width of the decrementer register so we
-	 * need to discover it. When in large mode (LPCR.LD = 1) reads from the
-	 * DEC SPR are sign extended to 64 bits and writes are truncated to the
-	 * physical register width. We can use this behaviour to detect the
-	 * width by starting from an all 1s value and left shifting until we
-	 * read a value from the DEC with it's high bit cleared.
-	 */
-
-	enable_large_dec(true);
-
-	do {
-		bits--;
-		mask = mask >> 1;
-		mtspr(SPR_DEC, mask);
-	} while (mfspr(SPR_DEC) & HIGH_BIT);
-
-	enable_large_dec(false);
+		bits = 32;
+	else if (proc_gen == proc_gen_p9)
+		bits = 56;
+	else
+		assert(0);
 
 	prlog(PR_DEBUG, "CPU: decrementer bits %d\n", bits);
+
 	return bits;
 }
 
-- 
2.18.0



More information about the Skiboot mailing list