00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00035 #include <arch/cpu.h>
00036 #include <cpu.h>
00037
00038 #include <arch.h>
00039
00040 #include <arch/cp0.h>
00041
00042 #include <typedefs.h>
00043 #include <print.h>
00044
00045 struct data_t {
00046 char *vendor;
00047 char *model;
00048 };
00049
00050 static struct data_t imp_data[] = {
00051 { "Invalid", "Invalid" },
00052 { "MIPS", "R2000" },
00053 { "MIPS", "R3000" },
00054 { "MIPS", "R6000" },
00055 { "MIPS", " R4000/R4400" },
00056 { "LSI Logic", "R3000" },
00057 { "MIPS", "R6000A" },
00058 { "IDT", "3051/3052" },
00059 { "Invalid", "Invalid" },
00060 { "MIPS", "R10000/T5" },
00061 { "MIPS", "R4200" },
00062 { "Unknown", "Unknown" },
00063 { "Unknown", "Unknown" },
00064 { "Invalid", "Invalid" },
00065 { "Invalid", "Invalid" },
00066 { "Invalid", "Invalid" },
00067 { "MIPS", "R8000" },
00068 { "Invalid", "Invalid" },
00069 { "Invalid", "Invalid" },
00070 { "Invalid", "Invalid" },
00071 { "Invalid", "Invalid" },
00072 { "Invalid", "Invalid" },
00073 { "Invalid", "Invalid" },
00074 { "Invalid", "Invalid" },
00075 { "Invalid", "Invalid" },
00076 { "Invalid", "Invalid" },
00077 { "Invalid", "Invalid" },
00078 { "Invalid", "Invalid" },
00079 { "Invalid", "Invalid" },
00080 { "Invalid", "Invalid" },
00081 { "Invalid", "Invalid" },
00082 { "Invalid", "Invalid" },
00083 { "QED", "R4600" },
00084 { "Sony", "R3000" },
00085 { "Toshiba", "R3000" },
00086 { "NKK", "R3000" },
00087 { NULL, NULL }
00088 };
00089
00090 static struct data_t imp_data80[] = {
00091 { "MIPS", "4Kc" },
00092 {"Invalid","Invalid"},
00093 {"Invalid","Invalid"},
00094 {"MIPS","4Km & 4Kp"},
00095 { NULL, NULL}
00096 };
00097
00098 void cpu_arch_init(void)
00099 {
00100 }
00101
00102 void cpu_identify(void)
00103 {
00104 CPU->arch.rev_num = cp0_prid_read() & 0xff;
00105 CPU->arch.imp_num = (cp0_prid_read() >> 8) & 0xff;
00106 }
00107
00108 void cpu_print_report(cpu_t *m)
00109 {
00110 struct data_t *data;
00111 int i;
00112
00113 if (m->arch.imp_num & 0x80) {
00114
00115 for (i=0;imp_data80[i].vendor;i++)
00116 ;
00117 if ((m->arch.imp_num & 0x7f) >= i) {
00118 printf("imp=%d\n",m->arch.imp_num);
00119 return;
00120 }
00121 data = &imp_data80[m->arch.imp_num & 0x7f];
00122 } else {
00123 for (i=0;imp_data[i].vendor;i++)
00124 ;
00125 if (m->arch.imp_num >= i) {
00126 printf("imp=%d\n",m->arch.imp_num);
00127 return;
00128 }
00129 data = &imp_data[m->arch.imp_num];
00130 }
00131
00132 printf("cpu%d: %s %s (rev=%d.%d, imp=%d)\n",
00133 m->id, data->vendor, data->model, m->arch.rev_num >> 4,
00134 m->arch.rev_num & 0xf, m->arch.imp_num);
00135 }
00136