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:
Nicholas Piggin 2018-11-07 10:21:02 +08:00 committed by Ley Foon Tan
parent c6b1d363f8
commit 737a3fa20f
1 changed files with 5 additions and 6 deletions

View File

@ -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;
} }