Module Name: src
Committed By: matt
Date: Fri Dec 23 22:45:27 UTC 2011
Modified Files:
src/sys/arch/mips/mips [matt-nb5-mips64]: mips_machdep.c
Log Message:
add entries for MIPS 1074K and RMI XLP3XX and XLP8XX.
for mipsNN, use TLB random register in case there are more than 64 TLB entries.
Add cpuname argument to cpu_identify. Fix bug in mips_page_physaddr.
Print out number of ASIDs in cpu_identify.
To generate a diff of this commit:
cvs rdiff -u -r1.205.4.1.2.1.2.55 -r1.205.4.1.2.1.2.56 \
src/sys/arch/mips/mips/mips_machdep.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/mips/mips/mips_machdep.c
diff -u src/sys/arch/mips/mips/mips_machdep.c:1.205.4.1.2.1.2.55 src/sys/arch/mips/mips/mips_machdep.c:1.205.4.1.2.1.2.56
--- src/sys/arch/mips/mips/mips_machdep.c:1.205.4.1.2.1.2.55 Tue Dec 13 07:34:29 2011
+++ src/sys/arch/mips/mips/mips_machdep.c Fri Dec 23 22:45:27 2011
@@ -259,6 +259,8 @@ extern const mips_locore_jumpvec_t mips6
void std_splsw_test(void);
#endif
+CTASSERT(CPU_ARCH_MIPS64R2 / CPU_ARCH_MIPS64 == CPU_ARCH_MIPS32R2 / CPU_ARCH_MIPS32);
+
mips_locore_jumpvec_t mips_locore_jumpvec;
struct locoresw mips_locoresw;
@@ -471,6 +473,13 @@ static const struct pridtab cputab[] = {
MIPS_CP0FL_CONFIG | MIPS_CP0FL_CONFIG1 | MIPS_CP0FL_CONFIG2 |
MIPS_CP0FL_CONFIG3 | MIPS_CP0FL_CONFIG7,
0, "34K" },
+ { MIPS_PRID_CID_MTI, MIPS_1004K, -1, -1, -1, 0,
+ MIPS32_FLAGS | CPU_MIPS_DOUBLE_COUNT,
+ MIPS_CP0FL_USE |
+ MIPS_CP0FL_EBASE | MIPS_CP0FL_USERLOCAL | MIPS_CP0FL_HWRENA |
+ MIPS_CP0FL_CONFIG | MIPS_CP0FL_CONFIG1 | MIPS_CP0FL_CONFIG2 |
+ MIPS_CP0FL_CONFIG3 | MIPS_CP0FL_CONFIG7,
+ 0, "1004K" },
{ MIPS_PRID_CID_MTI, MIPS_74K, -1, -1, -1, 0,
MIPS32_FLAGS | CPU_MIPS_DOUBLE_COUNT,
MIPS_CP0FL_USE |
@@ -478,13 +487,13 @@ static const struct pridtab cputab[] = {
MIPS_CP0FL_CONFIG | MIPS_CP0FL_CONFIG1 | MIPS_CP0FL_CONFIG2 |
MIPS_CP0FL_CONFIG3 | MIPS_CP0FL_CONFIG6 | MIPS_CP0FL_CONFIG7,
0, "74K" },
- { MIPS_PRID_CID_MTI, MIPS_1004K, -1, -1, -1, 0,
+ { MIPS_PRID_CID_MTI, MIPS_1074K, -1, -1, -1, 0,
MIPS32_FLAGS | CPU_MIPS_DOUBLE_COUNT,
MIPS_CP0FL_USE |
MIPS_CP0FL_EBASE | MIPS_CP0FL_USERLOCAL | MIPS_CP0FL_HWRENA |
MIPS_CP0FL_CONFIG | MIPS_CP0FL_CONFIG1 | MIPS_CP0FL_CONFIG2 |
MIPS_CP0FL_CONFIG3 | MIPS_CP0FL_CONFIG6 | MIPS_CP0FL_CONFIG7,
- 0, "1004K" },
+ 0, "1074K" },
{ MIPS_PRID_CID_ALCHEMY, MIPS_AU_REV1, -1, MIPS_AU1000, -1, 0,
MIPS32_FLAGS | CPU_MIPS_NO_WAIT | CPU_MIPS_I_D_CACHE_COHERENT, 0, 0,
@@ -616,6 +625,30 @@ static const struct pridtab cputab[] = {
CIDFL_RMI_TYPE_XLS|MIPS_CIDFL_RMI_CPUS(1,4)|MIPS_CIDFL_RMI_L2(256KB),
"XLS104" },
+ { MIPS_PRID_CID_RMI, MIPS_XLP3XX, -1, -1, -1, 0,
+ MIPS64_FLAGS | CPU_MIPS_D_CACHE_COHERENT | CPU_MIPS_NO_LLADDR |
+ CPU_MIPS_I_D_CACHE_COHERENT | CPU_MIPS_HAVE_MxCR,
+ MIPS_CP0FL_USE |
+ MIPS_CP0FL_EBASE | MIPS_CP0FL_USERLOCAL | MIPS_CP0FL_HWRENA |
+ MIPS_CP0FL_EIRR | MIPS_CP0FL_EIMR |
+ MIPS_CP0FL_CONFIG | MIPS_CP0FL_CONFIG1 | MIPS_CP0FL_CONFIG2 |
+ MIPS_CP0FL_CONFIG3 | MIPS_CP0FL_CONFIG6 | MIPS_CP0FL_CONFIG7,
+ CIDFL_RMI_TYPE_XLP | MIPS_CIDFL_RMI_CPUS(1,4) |
+ MIPS_CIDFL_RMI_L2(512KB) | MIPS_CIDFL_RMI_L3(1MB),
+ "XLP3XX" },
+
+ { MIPS_PRID_CID_RMI, MIPS_XLP8XX, -1, -1, -1, 0,
+ MIPS64_FLAGS | CPU_MIPS_D_CACHE_COHERENT | CPU_MIPS_NO_LLADDR |
+ CPU_MIPS_I_D_CACHE_COHERENT | CPU_MIPS_HAVE_MxCR,
+ MIPS_CP0FL_USE |
+ MIPS_CP0FL_EBASE | MIPS_CP0FL_USERLOCAL | MIPS_CP0FL_HWRENA |
+ MIPS_CP0FL_EIRR | MIPS_CP0FL_EIMR |
+ MIPS_CP0FL_CONFIG | MIPS_CP0FL_CONFIG1 | MIPS_CP0FL_CONFIG2 |
+ MIPS_CP0FL_CONFIG3 | MIPS_CP0FL_CONFIG6 | MIPS_CP0FL_CONFIG7,
+ CIDFL_RMI_TYPE_XLP | MIPS_CIDFL_RMI_CPUS(8,4) |
+ MIPS_CIDFL_RMI_L2(512KB) | MIPS_CIDFL_RMI_L3(1MB),
+ "XLP8XX" },
+
{ 0, 0, 0, 0, 0, 0,
0, 0, 0, NULL }
};
@@ -1176,7 +1209,7 @@ mips_vector_init(const struct splsw *spl
case MIPSNN_CFG_AR_REV1:
break;
case MIPSNN_CFG_AR_REV2:
- opts->mips_cpu_arch += CPU_ARCH_MIPS32R2 - CPU_ARCH_MIPS32;
+ opts->mips_cpu_arch *= CPU_ARCH_MIPS32R2 / CPU_ARCH_MIPS32;
break;
default:
printf("WARNING: MIPS32/64 arch revision %d "
@@ -1187,7 +1220,15 @@ mips_vector_init(const struct splsw *spl
/* figure out MMU type (and number of TLB entries) */
switch (MIPSNN_GET(CFG_MT, cfg)) {
case MIPSNN_CFG_MT_TLB:
- opts->mips_num_tlb_entries = MIPSNN_CFG1_MS(cfg1);
+ /*
+ * Use the larger value from TLB random instead or the
+ * CFG1 value (in case the number of TLB entries
+ * exceeds what can be encoded in CFG1).
+ */
+ mips3_cp0_wired_write(0); /* force random to reset */
+ uint32_t cfg_ms = MIPSNN_CFG1_MS(cfg1);
+ uint32_t tlb_random = mips3_cp0_random_read() + 1;
+ opts->mips_num_tlb_entries = MAX(cfg_ms, tlb_random);
break;
case MIPSNN_CFG_MT_NONE:
case MIPSNN_CFG_MT_BAT:
@@ -1274,6 +1315,7 @@ mips_vector_init(const struct splsw *spl
switch (opts->mips_cpu_arch) {
#if defined(MIPS1)
case CPU_ARCH_MIPS1:
+ opts->mips_num_tlb_asids = MIPS1_NUM_TLB_PIDS;
(*mips1_locore_vec.ljv_tlb_invalidate_all)();
mips1_vector_init(splsw);
mips_locoresw = mips1_locoresw;
@@ -1416,6 +1458,12 @@ mips3_tlb_probe(void)
opts->mips3_tlb_vpn_mask >>= 2;
opts->mips3_tlb_pfn_mask = mips3_cp0_tlb_entry_lo_probe();
}
+ if (CPUISMIPSNN) {
+ opts->mips_num_tlb_asids =
+ (opts->mips3_tlb_vpn_mask & MIPS3_PG_ASID) + 1;
+ } else {
+ opts->mips_num_tlb_asids = opts->mips_num_tlb_entries;
+ }
}
#endif
@@ -1423,7 +1471,7 @@ mips3_tlb_probe(void)
* Identify product revision IDs of CPU and FPU.
*/
void
-cpu_identify(device_t dev)
+cpu_identify(device_t dev, const char *cpuname)
{
const struct mips_options * const opts = &mips_options;
const struct mips_cache_info * const mci = &mips_cache_info;
@@ -1445,10 +1493,11 @@ cpu_identify(device_t dev)
"write-back",
"write-through",
};
- const char *cpuname, *fpuname;
+ const char *fpuname;
int i;
- cpuname = opts->mips_cpu->cpu_name;
+ if (cpuname == NULL)
+ cpuname = opts->mips_cpu->cpu_name;
fpuname = NULL;
for (i = 0; i < sizeof(fputab)/sizeof(fputab[0]); i++) {
@@ -1535,7 +1584,8 @@ cpu_identify(device_t dev)
case CPU_ARCH_MIPS64R2: {
const char *sufx = "KMGTPE";
uint32_t pg_mask;
- aprint_normal_dev(dev, "%d TLB entries", opts->mips_num_tlb_entries);
+ aprint_normal_dev(dev, "%u TLB entries (%u ASIDs)",
+ opts->mips_num_tlb_entries, opts->mips_num_tlb_asids);
#if !defined(__mips_o32)
if (CPUIS64BITS) {
int64_t pfn_mask;
@@ -2107,7 +2157,7 @@ mips_page_physload(vaddr_t vkernstart, v
paddr_t segstart = round_page(segs->start);
const paddr_t segfinish = trunc_page(segs->start + segs->size);
- printf("phys segment: %#"PRIxPADDR" @ %#"PRIxPADDR"\n",
+ printf("phys segment: %#"PRIxPSIZE" @ %#"PRIxPADDR"\n",
segfinish - segstart, segstart);
/*
@@ -2127,6 +2177,7 @@ mips_page_physload(vaddr_t vkernstart, v
if (segstart >= flp[i].fl_end
|| segend <= flp[i].fl_start)
continue;
+
/*
* If the start of this segment starts before
* the start of the freelist, then limit the
@@ -2135,7 +2186,8 @@ mips_page_physload(vaddr_t vkernstart, v
* freelist matching.
*/
if (segstart < flp[i].fl_start) {
- segstart = flp[i].fl_start;
+ segend = flp[i].fl_start;
+ KASSERT(freelist == -1);
break;
}