Lots and lots of fixes to the cpu identification code, and dealing with

L2 and L3 cache initialization.  Mostly to get the L2 enabled on the
pegasos, but since I had the manual, I fixed a few other things I saw
while I was there.
This commit is contained in:
garbled 2007-12-27 05:40:49 +00:00
parent b7d6181694
commit 07cb4134b6
1 changed files with 66 additions and 17 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: cpu_subr.c,v 1.35 2007/11/17 08:30:35 kefren Exp $ */
/* $NetBSD: cpu_subr.c,v 1.36 2007/12/27 05:40:49 garbled Exp $ */
/*-
* Copyright (c) 2001 Matt Thomas.
@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.35 2007/11/17 08:30:35 kefren Exp $");
__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.36 2007/12/27 05:40:49 garbled Exp $");
#include "opt_ppcparam.h"
#include "opt_multiprocessor.h"
@ -83,6 +83,8 @@ static const struct fmttab cpu_7450_l2cr_formats[] = {
{ L2CR_L2DO|L2CR_L2IO, L2CR_L2IO, " instruction-only" },
{ L2CR_L2DO|L2CR_L2IO, L2CR_L2DO|L2CR_L2IO, " locked" },
{ L2CR_L2E, ~0, " 256KB L2 cache" },
{ L2CR_L2PE, 0, " no parity" },
{ L2CR_L2PE, ~0, " parity enabled" },
{ 0, 0, NULL }
};
@ -92,6 +94,8 @@ static const struct fmttab cpu_7448_l2cr_formats[] = {
{ L2CR_L2DO|L2CR_L2IO, L2CR_L2IO, " instruction-only" },
{ L2CR_L2DO|L2CR_L2IO, L2CR_L2DO|L2CR_L2IO, " locked" },
{ L2CR_L2E, ~0, " 1MB L2 cache" },
{ L2CR_L2PE, 0, " no parity" },
{ L2CR_L2PE, ~0, " parity enabled" },
{ 0, 0, NULL }
};
@ -101,6 +105,8 @@ static const struct fmttab cpu_7457_l2cr_formats[] = {
{ L2CR_L2DO|L2CR_L2IO, L2CR_L2IO, " instruction-only" },
{ L2CR_L2DO|L2CR_L2IO, L2CR_L2DO|L2CR_L2IO, " locked" },
{ L2CR_L2E, ~0, " 512KB L2 cache" },
{ L2CR_L2PE, 0, " no parity" },
{ L2CR_L2PE, ~0, " parity enabled" },
{ 0, 0, NULL }
};
@ -540,14 +546,23 @@ cpu_setup(self, ci)
cpu_probe_speed(ci);
aprint_normal("%u.%02u MHz",
ci->ci_khz / 1000, (ci->ci_khz / 10) % 100);
if (vers == IBM750FX || vers == MPC750 ||
vers == MPC7400 || vers == MPC7410 || MPC745X_P(vers)) {
if (MPC745X_P(vers)) {
cpu_config_l3cr(vers);
} else {
cpu_config_l2cr(pvr);
}
switch (vers) {
case IBM750FX:
case MPC750:
case MPC7400:
case MPC7410:
cpu_config_l3cr(vers);
break;
case MPC7450: /* 7441 does not have L3! */
case MPC7455: /* 7445 does not have L3! */
case MPC7457: /* 7447 does not have L3! */
/* do something special XXX */
case MPC7447A:
case MPC7448:
cpu_config_l2cr(pvr);
break;
default:
break;
}
aprint_normal("\n");
break;
@ -612,6 +627,16 @@ cpu_setup(self, ci)
NULL, self->dv_xname, "IPIs");
}
/*
* According to a document labeled "PVR Register Settings":
** For integrated microprocessors the PVR register inside the device
** will identify the version of the microprocessor core. You must also
** read the Device ID, PCI register 02, to identify the part and the
** Revision ID, PCI register 08, to identify the revision of the
** integrated microprocessor.
* This apparently applies to 8240/8245/8241, PVR 00810101 and 80811014
*/
void
cpu_identify(char *str, size_t len)
{
@ -630,8 +655,12 @@ cpu_identify(char *str, size_t len)
minor = (pvr >> 0) & 0xff;
major = minor <= 4 ? 1 : 2;
break;
case MPCG2: /*XXX see note above */
major = (pvr >> 4) & 0xf;
minor = (pvr >> 0) & 0xf;
break;
default:
major = (pvr >> 4) & 0xf;
major = (pvr >> 8) & 0xf;
minor = (pvr >> 0) & 0xf;
}
@ -708,7 +737,7 @@ cpu_enable_l2cr(register_t l2cr)
mtspr(SPR_L2CR, l2cr | L2CR_L2I);
do {
x = mfspr(SPR_L2CR);
} while (x & L2CR_L2IP);
} while (x & L2CR_L2I);
/* Enable L2 cache. */
l2cr |= L2CR_L2E;
@ -768,6 +797,7 @@ void
cpu_config_l2cr(int pvr)
{
register_t l2cr;
u_int vers = (pvr >> 16) & 0xffff;
l2cr = mfspr(SPR_L2CR);
@ -792,14 +822,33 @@ cpu_config_l2cr(int pvr)
aprint_normal(" L2 cache present but not enabled ");
return;
}
aprint_normal(",");
if ((pvr >> 16) == IBM750FX ||
(pvr & 0xffffff00) == 0x00082200 /* IBM750CX */ ||
(pvr & 0xffffef00) == 0x00082300 /* IBM750CXe */) {
switch (vers) {
case IBM750FX:
cpu_fmttab_print(cpu_ibm750_l2cr_formats, l2cr);
} else {
break;
case MPC750:
if ((pvr & 0xffffff00) == 0x00082200 /* IBM750CX */ ||
(pvr & 0xffffef00) == 0x00082300 /* IBM750CXe */)
cpu_fmttab_print(cpu_ibm750_l2cr_formats, l2cr);
else
cpu_fmttab_print(cpu_l2cr_formats, l2cr);
break;
case MPC7447A:
case MPC7457:
cpu_fmttab_print(cpu_7457_l2cr_formats, l2cr);
return;
case MPC7448:
cpu_fmttab_print(cpu_7448_l2cr_formats, l2cr);
return;
case MPC7450:
case MPC7455:
cpu_fmttab_print(cpu_7450_l2cr_formats, l2cr);
break;
default:
cpu_fmttab_print(cpu_l2cr_formats, l2cr);
break;
}
}