diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2018-03-08 13:24:33 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2018-03-23 07:43:27 +0100 |
commit | 77446c78219e5432f6690001c404a40819cc7e16 (patch) | |
tree | 6e0da669092b4fbeb887a4ad09deb64041d11d38 /arch/arm/cpu/mmu_64.c | |
parent | 7ca5bc00f65db4931fb262e1bfbc0b562dadd737 (diff) | |
download | barebox-77446c78219e5432f6690001c404a40819cc7e16.tar.gz barebox-77446c78219e5432f6690001c404a40819cc7e16.tar.xz |
ARM: aarch64: mmu: use PTE_* definitions from U-Boot
'PMD' (Page Middle Directory) is a Linuxism that is not really
helpful in the barebox MMU code. Use the U-Boot definitions
which only use PTE_* and seem to be more consistent for our
usecase.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/cpu/mmu_64.c')
-rw-r--r-- | arch/arm/cpu/mmu_64.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/arch/arm/cpu/mmu_64.c b/arch/arm/cpu/mmu_64.c index 695a73262d..baa443f9e2 100644 --- a/arch/arm/cpu/mmu_64.c +++ b/arch/arm/cpu/mmu_64.c @@ -34,8 +34,12 @@ #include "mmu.h" -#define CACHED_MEM (PMD_ATTRINDX(MT_NORMAL) | PMD_SECT_S | PMD_SECT_AF | PMD_TYPE_SECT) -#define UNCACHED_MEM (PMD_ATTRINDX(MT_DEVICE_nGnRnE) | PMD_SECT_AF) +#define CACHED_MEM (PTE_BLOCK_MEMTYPE(MT_NORMAL) | \ + PTE_BLOCK_OUTER_SHARE | \ + PTE_BLOCK_AF) +#define UNCACHED_MEM (PTE_BLOCK_MEMTYPE(MT_DEVICE_nGnRnE) | \ + PTE_BLOCK_OUTER_SHARE | \ + PTE_BLOCK_AF) static uint64_t *ttb; @@ -94,14 +98,14 @@ static uint64_t level2mask(int level) static int pte_type(uint64_t *pte) { - return *pte & PMD_TYPE_MASK; + return *pte & PTE_TYPE_MASK; } static void set_table(uint64_t *pt, uint64_t *table_addr) { uint64_t val; - val = PMD_TYPE_TABLE | (uint64_t)table_addr; + val = PTE_TYPE_TABLE | (uint64_t)table_addr; *pt = val; } @@ -119,7 +123,7 @@ static uint64_t *get_level_table(uint64_t *pte) { uint64_t *table = (uint64_t *)(*pte & XLAT_ADDR_MASK); - if (pte_type(pte) != PMD_TYPE_TABLE) { + if (pte_type(pte) != PTE_TYPE_TABLE) { table = create_table(); set_table(pte, table); } @@ -141,7 +145,7 @@ static __maybe_unused uint64_t *find_pte(uint64_t addr) idx = (addr & level2mask(i)) >> block_shift; pte += idx; - if ((pte_type(pte) != PMD_TYPE_TABLE) || (block_shift <= GRANULE_SIZE_SHIFT)) + if ((pte_type(pte) != PTE_TYPE_TABLE) || (block_shift <= GRANULE_SIZE_SHIFT)) break; else pte = (uint64_t *)(*pte & XLAT_ADDR_MASK); @@ -165,21 +169,21 @@ static void map_region(uint64_t virt, uint64_t phys, uint64_t size, uint64_t att addr = virt; - attr &= ~(PMD_TYPE_SECT); + attr &= ~PTE_TYPE_MASK; while (size) { table = ttb; for (level = 1; level < 4; level++) { block_shift = level2shift(level); idx = (addr & level2mask(level)) >> block_shift; - block_size = (1 << block_shift); + block_size = (1ULL << block_shift); pte = table + idx; if (level == 3) attr |= PTE_TYPE_PAGE; else - attr |= PMD_TYPE_SECT; + attr |= PTE_TYPE_BLOCK; if (size >= block_size && IS_ALIGNED(addr, block_size)) { *pte = phys | attr; |