sparc32: mm: Restructure sparc32 MMU page-table layout
The "SRMMU" supports 4k pages using a fixed three-level walk with a
256-entry PGD and 64-entry PMD/PTE levels. In order to fill a page
with a 'pgtable_t', the SRMMU code allocates four native PTE tables
into a single PTE allocation and similarly for the PMD level, leading
to an array of 16 physical pointers in a 'pmd_t'
This breaks the generic code which assumes READ_ONCE(*pmd) will be
word sized.
In a manner similar to ef22d8abd8
("m68k: mm: Restructure Motorola
MMU page-table layout"), this patch implements the native page-table
setup directly. This significantly increases the page-table memory
overhead, but will be addresses in a subsequent patch.
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Will Deacon <will@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
ed894bf5a7
commit
8e958839e4
@@ -10,6 +10,7 @@
|
||||
|
||||
#include <asm/asi.h>
|
||||
#include <asm/mxcc.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/pgtsrmmu.h>
|
||||
|
||||
/* Bits in the SRMMU control register for GNU/Viking modules.
|
||||
@@ -227,7 +228,7 @@ static inline unsigned long viking_hwprobe(unsigned long vaddr)
|
||||
: "=r" (val)
|
||||
: "r" (vaddr | 0x200), "i" (ASI_M_FLUSH_PROBE));
|
||||
if ((val & SRMMU_ET_MASK) == SRMMU_ET_PTE) {
|
||||
vaddr &= ~SRMMU_PGDIR_MASK;
|
||||
vaddr &= ~PGDIR_MASK;
|
||||
vaddr >>= PAGE_SHIFT;
|
||||
return val | (vaddr << 8);
|
||||
}
|
||||
@@ -237,7 +238,7 @@ static inline unsigned long viking_hwprobe(unsigned long vaddr)
|
||||
: "=r" (val)
|
||||
: "r" (vaddr | 0x100), "i" (ASI_M_FLUSH_PROBE));
|
||||
if ((val & SRMMU_ET_MASK) == SRMMU_ET_PTE) {
|
||||
vaddr &= ~SRMMU_REAL_PMD_MASK;
|
||||
vaddr &= ~PMD_MASK;
|
||||
vaddr >>= PAGE_SHIFT;
|
||||
return val | (vaddr << 8);
|
||||
}
|
||||
|
Reference in New Issue
Block a user