1 #ifndef _ASMARM64_PAGE_H_ 2 #define _ASMARM64_PAGE_H_ 3 /* 4 * Adapted from 5 * arch/arm64/include/asm/pgtable-types.h 6 * include/asm-generic/pgtable-nopmd.h 7 * 8 * Copyright (C) 2017, Red Hat Inc, Andrew Jones <drjones@redhat.com> 9 * 10 * This work is licensed under the terms of the GNU GPL, version 2. 11 */ 12 13 #include <config.h> 14 #include <linux/const.h> 15 #include <libcflat.h> 16 17 #define VA_BITS 48 18 19 #define PAGE_SIZE CONFIG_PAGE_SIZE 20 #if PAGE_SIZE == SZ_64K 21 #define PAGE_SHIFT 16 22 #elif PAGE_SIZE == SZ_16K 23 #define PAGE_SHIFT 14 24 #elif PAGE_SIZE == SZ_4K 25 #define PAGE_SHIFT 12 26 #else 27 #error Unsupported PAGE_SIZE 28 #endif 29 #define PAGE_MASK (~(PAGE_SIZE-1)) 30 31 /* 32 * Since a page table descriptor is 8 bytes we have (PAGE_SHIFT - 3) bits 33 * of virtual address at each page table level. So, to get the number of 34 * page table levels needed, we round up the division of the number of 35 * address bits (VA_BITS - PAGE_SHIFT) by (PAGE_SHIFT - 3). 36 */ 37 #define PGTABLE_LEVELS \ 38 (((VA_BITS - PAGE_SHIFT) + ((PAGE_SHIFT - 3) - 1)) / (PAGE_SHIFT - 3)) 39 40 #ifndef __ASSEMBLER__ 41 42 #define PAGE_ALIGN(addr) ALIGN(addr, PAGE_SIZE) 43 44 typedef u64 pteval_t; 45 typedef u64 pmdval_t; 46 typedef u64 pudval_t; 47 typedef u64 pgdval_t; 48 typedef struct { pteval_t pte; } pte_t; 49 typedef struct { pmdval_t pmd; } pmd_t; 50 typedef struct { pudval_t pud; } pud_t; 51 typedef struct { pgdval_t pgd; } pgd_t; 52 typedef struct { pteval_t pgprot; } pgprot_t; 53 54 #define pte_val(x) ((x).pte) 55 #define pmd_val(x) ((x).pmd) 56 #define pud_val(x) ((x).pud) 57 #define pgd_val(x) ((x).pgd) 58 #define pgprot_val(x) ((x).pgprot) 59 60 #define __pte(x) ((pte_t) { (x) } ) 61 #define __pmd(x) ((pmd_t) { (x) } ) 62 #define __pud(x) ((pud_t) { (x) } ) 63 #define __pgd(x) ((pgd_t) { (x) } ) 64 #define __pgprot(x) ((pgprot_t) { (x) } ) 65 66 #define __va(x) ((void *)__phys_to_virt((phys_addr_t)(x))) 67 #define __pa(x) __virt_to_phys((unsigned long)(x)) 68 69 #define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT) 70 #define pfn_to_virt(pfn) __va((pfn) << PAGE_SHIFT) 71 72 extern phys_addr_t __virt_to_phys(unsigned long addr); 73 extern unsigned long __phys_to_virt(phys_addr_t addr); 74 75 extern void *__ioremap(phys_addr_t phys_addr, size_t size); 76 77 #endif /* !__ASSEMBLER__ */ 78 #endif /* _ASMARM64_PAGE_H_ */ 79