Better PowerPC / POWER CPU detection from Linux cpu_specs[] table.

This commit is contained in:
gbeauche
2004-07-10 06:15:42 +00:00
parent 9a93480546
commit b60874907e

View File

@@ -612,6 +612,55 @@ int main(int argc, char **argv)
#else #else
proc_file = fopen("/proc/cpuinfo", "r"); proc_file = fopen("/proc/cpuinfo", "r");
if (proc_file) { if (proc_file) {
// CPU specs from Linux kernel
// TODO: make it more generic with features (e.g. AltiVec) and
// cache information and friends for NameRegistry
static const struct {
uint32 pvr_mask;
uint32 pvr_value;
const char *cpu_name;
}
cpu_specs[] = {
{ 0xffff0000, 0x00010000, "601" },
{ 0xffff0000, 0x00030000, "603" },
{ 0xffff0000, 0x00060000, "603e" },
{ 0xffff0000, 0x00070000, "603ev" },
{ 0xffff0000, 0x00040000, "604" },
{ 0xfffff000, 0x00090000, "604e" },
{ 0xffff0000, 0x00090000, "604r" },
{ 0xffff0000, 0x000a0000, "604ev" },
{ 0xffffffff, 0x00084202, "740/750" },
{ 0xfffff000, 0x00083000, "745/755" },
{ 0xfffffff0, 0x00080100, "750CX" },
{ 0xfffffff0, 0x00082200, "750CX" },
{ 0xfffffff0, 0x00082210, "750CXe" },
{ 0xffffff00, 0x70000100, "750FX" },
{ 0xffffffff, 0x70000200, "750FX" },
{ 0xffff0000, 0x70000000, "750FX" },
{ 0xffff0000, 0x70020000, "750GX" },
{ 0xffff0000, 0x00080000, "740/750" },
{ 0xffffffff, 0x000c1101, "7400 (1.1)" },
{ 0xffff0000, 0x000c0000, "7400" },
{ 0xffff0000, 0x800c0000, "7410" },
{ 0xffffffff, 0x80000200, "7450" },
{ 0xffffffff, 0x80000201, "7450" },
{ 0xffff0000, 0x80000000, "7450" },
{ 0xffffff00, 0x80010100, "7455" },
{ 0xffffffff, 0x80010200, "7455" },
{ 0xffff0000, 0x80010000, "7455" },
{ 0xffff0000, 0x80020000, "7457" },
{ 0xffff0000, 0x80030000, "7447A" },
{ 0x7fff0000, 0x00810000, "82xx" },
{ 0x7fff0000, 0x00820000, "8280" },
{ 0xffff0000, 0x00400000, "Power3 (630)" },
{ 0xffff0000, 0x00410000, "Power3 (630+)" },
{ 0xffff0000, 0x00360000, "I-star" },
{ 0xffff0000, 0x00370000, "S-star" },
{ 0xffff0000, 0x00350000, "Power4" },
{ 0xffff0000, 0x00390000, "PPC970" },
{ 0, 0, 0 }
};
char line[256]; char line[256];
while(fgets(line, 255, proc_file)) { while(fgets(line, 255, proc_file)) {
// Read line // Read line
@@ -624,42 +673,19 @@ int main(int argc, char **argv)
int i; int i;
char value[256]; char value[256];
if (sscanf(line, "cpu : %[0-9A-Za-a]", value) == 1) { if (sscanf(line, "cpu : %[0-9A-Za-a]", value) == 1) {
if (strcmp(value, "601") == 0) // Search by name
PVR = 0x00010000; const char *cpu_name = NULL;
else if (strcmp(value, "603") == 0) for (int i = 0; cpu_specs[i].pvr_mask != 0; i++) {
PVR = 0x00030000; if (strcmp(cpu_specs[i].cpu_name, value) == 0) {
else if (strcmp(value, "604") == 0) cpu_name = cpu_specs[i].cpu_name;
PVR = 0x00040000; PVR = cpu_specs[i].pvr_value;
else if (strcmp(value, "603e") == 0) break;
PVR = 0x00060000; }
else if (strcmp(value, "603ev") == 0) }
PVR = 0x00070000; if (cpu_name == NULL)
else if (strcmp(value, "604e") == 0)
PVR = 0x00090000;
else if (strcmp(value, "604ev5") == 0)
PVR = 0x000a0000;
else if (strcmp(value, "750") == 0)
PVR = 0x00080000;
else if (strcmp(value, "750FX") == 0)
PVR = 0x70000000;
else if (strcmp(value, "821") == 0)
PVR = 0x00320000;
else if (strcmp(value, "860") == 0)
PVR = 0x00500000;
else if (strcmp(value, "7400") == 0)
PVR = 0x000c0000;
else if (strcmp(value, "7410") == 0)
PVR = 0x800c0000;
else if (strcmp(value, "7450") == 0)
PVR = 0x80000000;
else if (strcmp(value, "7455") == 0)
PVR = 0x80010000;
else if (strcmp(value, "7457") == 0)
PVR = 0x80020000;
else if (strcmp(value, "PPC970") == 0)
PVR = 0x00390000;
else
printf("WARNING: Unknown CPU type '%s', assuming 604\n", value); printf("WARNING: Unknown CPU type '%s', assuming 604\n", value);
else
printf("Found a PowerPC %s processor\n", cpu_name);
} }
if (sscanf(line, "clock : %dMHz", &i) == 1) if (sscanf(line, "clock : %dMHz", &i) == 1)
CPUClockSpeed = BusClockSpeed = i * 1000000; CPUClockSpeed = BusClockSpeed = i * 1000000;