patch-2.4.25 linux-2.4.25/arch/mips/mm/tlb-r4k.c
Next file: linux-2.4.25/arch/mips/mm/tlb-sb1.c
Previous file: linux-2.4.25/arch/mips/mm/sc-rm7k.c
Back to the patch index
Back to the overall index
- Lines: 81
- Date:
2004-02-18 05:36:30.000000000 -0800
- Orig file:
linux-2.4.24/arch/mips/mm/tlb-r4k.c
- Orig date:
2003-08-25 04:44:40.000000000 -0700
diff -urN linux-2.4.24/arch/mips/mm/tlb-r4k.c linux-2.4.25/arch/mips/mm/tlb-r4k.c
@@ -170,6 +170,36 @@
}
}
+/*
+ * Remove one kernel space TLB entry. This entry is assumed to be marked
+ * global so we don't do the ASID thing.
+ */
+void local_flush_tlb_one(unsigned long page)
+{
+ unsigned long flags;
+ int oldpid, idx;
+
+ page &= (PAGE_MASK << 1);
+ oldpid = read_c0_entryhi() & ASID_MASK;
+
+ local_irq_save(flags);
+ write_c0_entryhi(page);
+ BARRIER;
+ tlb_probe();
+ BARRIER;
+ idx = read_c0_index();
+ write_c0_entrylo0(0);
+ write_c0_entrylo1(0);
+ if (idx >= 0) {
+ /* Make sure all entries differ. */
+ write_c0_entryhi(KSEG0+idx*0x2000);
+ tlb_write_indexed();
+ }
+ BARRIER;
+ write_c0_entryhi(oldpid);
+ local_irq_restore(flags);
+}
+
/* We will need multiple versions of update_mmu_cache(), one that just
* updates the TLB with the new pte(s), and another which also checks
* for the R4k "end of page" hardware bug and does the needy.
@@ -339,24 +369,22 @@
static void __init probe_tlb(unsigned long config)
{
+ struct cpuinfo_mips *c = ¤t_cpu_data;
unsigned int reg;
- reg = read_c0_prid() & 0xff00;
- if (reg == PRID_IMP_RM7000 || !(config & (1 << 31)))
- /*
- * Not a MIPS32 compliant CPU. Config 1 register not
- * supported, we assume R4k style. Cpu probing already figured
- * out the number of tlb entries.
- */
+ /*
+ * If this isn't a MIPS32 / MIPS64 compliant CPU. Config 1 register
+ * is not supported, we assume R4k style. Cpu probing already figured
+ * out the number of tlb entries.
+ */
+ if ((c->processor_id & 0xff0000) == PRID_COMP_LEGACY)
return;
-#if defined(CONFIG_CPU_MIPS32) || defined (CONFIG_CPU_MIPS64)
reg = read_c0_config1();
if (!((config >> 7) & 3))
- panic("No MMU present");
- else
- current_cpu_data.tlbsize = ((reg >> 25) & 0x3f) + 1;
-#endif
+ panic("No TLB present");
+
+ c->tlbsize = ((reg >> 25) & 0x3f) + 1;
}
void __init r4k_tlb_init(void)
@@ -371,7 +399,7 @@
* be set for 4kb pages.
*/
probe_tlb(config);
- write_c0_pagemask(PM_4K);
+ write_c0_pagemask(PM_DEFAULT_MASK);
write_c0_wired(0);
temp_tlb_entry = current_cpu_data.tlbsize - 1;
local_flush_tlb_all();
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)