nios2: flush_tlb_all use TLBMISC way auto-increment feature
Writes to TLBACC cause TLBMISC way to be incremented, which can be used to iterate over ways in a set, then wrap back to zero ready for the next set. This reduces register writes significantly. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
This commit is contained in:
parent
c6b1d363f8
commit
737a3fa20f
|
@ -242,21 +242,20 @@ void flush_tlb_all(void)
|
||||||
unsigned long addr = 0;
|
unsigned long addr = 0;
|
||||||
unsigned int line;
|
unsigned int line;
|
||||||
unsigned int way;
|
unsigned int way;
|
||||||
unsigned long org_misc, pid_misc, tlbmisc;
|
unsigned long org_misc, pid_misc;
|
||||||
|
|
||||||
/* remember pid/way until we return */
|
/* remember pid/way until we return */
|
||||||
get_misc_and_pid(&org_misc, &pid_misc);
|
get_misc_and_pid(&org_misc, &pid_misc);
|
||||||
|
|
||||||
|
/* Start at way 0, way is auto-incremented after each TLBACC write */
|
||||||
|
WRCTL(CTL_TLBMISC, TLBMISC_WE);
|
||||||
|
|
||||||
/* Map each TLB entry to physcal address 0 with no-access and a
|
/* Map each TLB entry to physcal address 0 with no-access and a
|
||||||
bad ptbase */
|
bad ptbase */
|
||||||
for (line = 0; line < cpuinfo.tlb_num_lines; line++) {
|
for (line = 0; line < cpuinfo.tlb_num_lines; line++) {
|
||||||
WRCTL(CTL_PTEADDR, pteaddr_invalid(addr));
|
WRCTL(CTL_PTEADDR, pteaddr_invalid(addr));
|
||||||
|
for (way = 0; way < cpuinfo.tlb_num_ways; way++)
|
||||||
for (way = 0; way < cpuinfo.tlb_num_ways; way++) {
|
|
||||||
tlbmisc = TLBMISC_WE | (way << TLBMISC_WAY_SHIFT);
|
|
||||||
WRCTL(CTL_TLBMISC, tlbmisc);
|
|
||||||
WRCTL(CTL_TLBACC, 0);
|
WRCTL(CTL_TLBACC, 0);
|
||||||
}
|
|
||||||
|
|
||||||
addr += PAGE_SIZE;
|
addr += PAGE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue