summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/powerpc/powerpc/cpu.c150
1 files changed, 47 insertions, 103 deletions
diff --git a/sys/powerpc/powerpc/cpu.c b/sys/powerpc/powerpc/cpu.c
index 93cb655..e2a4f71 100644
--- a/sys/powerpc/powerpc/cpu.c
+++ b/sys/powerpc/powerpc/cpu.c
@@ -107,10 +107,11 @@ static const struct cputab models[] = {
static char model[64];
SYSCTL_STRING(_hw, HW_MODEL, model, CTLFLAG_RD, model, 0, "");
-static register_t l2cr_config = 0;
+register_t l2cr_config = 0;
+register_t l3cr_config = 0;
static void cpu_print_speed(void);
-static void cpu_config_l2cr(u_int, uint16_t);
+static void cpu_print_cacheinfo(u_int, uint16_t);
void
cpu_setup(u_int cpuid)
@@ -261,7 +262,12 @@ cpu_setup(u_int cpuid)
case MPC7457:
cpu_print_speed();
printf("\n");
- cpu_config_l2cr(cpuid, vers);
+
+ l2cr_config = mfspr(SPR_L2CR);
+ l3cr_config = mfspr(SPR_L3CR);
+
+ if (bootverbose)
+ cpu_print_cacheinfo(cpuid, vers);
break;
default:
printf("\n");
@@ -285,114 +291,52 @@ cpu_print_speed(void)
}
void
-cpu_config_l2cr(u_int cpuid, uint16_t vers)
+cpu_print_cacheinfo(u_int cpuid, uint16_t vers)
{
- u_int l2cr, x, msr;
+ uint32_t hid;
- l2cr = mfspr(SPR_L2CR);
- /*
- * For MP systems, the firmware may only configure the L2 cache
- * on the first CPU. In this case, assume that the other CPUs
- * should use the same value for L2CR.
- */
- if ((l2cr & L2CR_L2E) != 0 && l2cr_config == 0) {
- l2cr_config = l2cr;
- }
+ hid = mfspr(SPR_HID0);
+ printf("cpu%u: ", cpuid);
+ printf("L1 I-cache %sabled, ", (hid & HID0_ICE) ? "en" : "dis");
+ printf("L1 D-cache %sabled\n", (hid & HID0_DCE) ? "en" : "dis");
- /*
- * Configure L2 cache if not enabled.
- */
- if ((l2cr & L2CR_L2E) == 0 && l2cr_config != 0) {
- l2cr = l2cr_config;
-
- /* Disable interrupts and set the cache config bits. */
- msr = mfmsr();
- mtmsr(msr & ~PSL_EE);
-#ifdef ALTIVEC
- if (cpu_altivec)
- __asm __volatile("dssall");
-#endif
- __asm __volatile("sync");
- mtspr(SPR_L2CR, l2cr & ~L2CR_L2E);
- __asm __volatile("sync");
-
- /* Wait for L2 clock to be stable (640 L2 clocks). */
- DELAY(100);
-
- /* Invalidate all L2 contents. */
- mtspr(SPR_L2CR, l2cr | L2CR_L2I);
- do {
- x = mfspr(SPR_L2CR);
- } while (x & L2CR_L2IP);
-
- /* Enable L2 cache. */
- l2cr |= L2CR_L2E;
- mtspr(SPR_L2CR, l2cr);
- mtmsr(msr);
- }
-
- if (!bootverbose)
- return;
-
- printf("cpu%d: ", cpuid);
-
- if (l2cr & L2CR_L2E) {
- if (vers == MPC7450 ||
- vers == MPC7455 ||
- vers == MPC7457) {
- u_int l3cr;
-
- printf("256KB L2 cache");
-
- l3cr = mfspr(SPR_L3CR);
- if (l3cr & L3CR_L3E)
- printf(", %cMB L3 backside cache",
- l3cr & L3CR_L3SIZ ? '2' : '1');
+ printf("cpu%u: ", cpuid);
+ if (l2cr_config & L2CR_L2E) {
+ switch (vers) {
+ case MPC7450:
+ case MPC7455:
+ case MPC7457:
+ printf("256KB L2 cache, ");
+ if (l3cr_config & L3CR_L3E)
+ printf("%cMB L3 backside cache",
+ l3cr_config & L3CR_L3SIZ ? '2' : '1');
+ else
+ printf("L3 cache disabled");
printf("\n");
- return;
- }
- if (vers == IBM750FX) {
- printf("512KB L2 cache\n");
- return;
- }
- switch (l2cr & L2CR_L2SIZ) {
- case L2SIZ_256K:
- printf("256KB");
- break;
- case L2SIZ_512K:
- printf("512KB");
- break;
- case L2SIZ_1M:
- printf("1MB");
break;
+ case IBM750FX:
+ printf("512KB L2 cache\n");
+ break;
default:
- printf("unknown size");
- }
- if (l2cr & L2CR_L2WT) {
- printf(" write-through");
- } else {
- printf(" write-back");
- }
- switch (l2cr & L2CR_L2RAM) {
- case L2RAM_FLOWTHRU_BURST:
- printf(" flow-through synchronous burst SRAM");
- break;
- case L2RAM_PIPELINE_BURST:
- printf(" pipelined synchronous burst SRAM");
- break;
- case L2RAM_PIPELINE_LATE:
- printf(" pipelined synchronous late-write SRAM");
+ switch (l2cr_config & L2CR_L2SIZ) {
+ case L2SIZ_256K:
+ printf("256KB ");
+ break;
+ case L2SIZ_512K:
+ printf("512KB ");
+ break;
+ case L2SIZ_1M:
+ printf("1MB ");
+ break;
+ }
+ printf("write-%s", (l2cr_config & L2CR_L2WT)
+ ? "through" : "back");
+ if (l2cr_config & L2CR_L2PE)
+ printf(", with parity");
+ printf(" backside cache\n");
break;
- default:
- printf(" unknown type");
}
-
- if (l2cr & L2CR_L2PE)
- printf(" with parity");
- printf(" backside cache");
} else
- printf("L2 cache not enabled");
-
- printf("\n");
+ printf("L2 cache disabled\n");
}
OpenPOWER on IntegriCloud