1 #ifndef __ASMARM_MMU_H_ 2 #define __ASMARM_MMU_H_ 3 /* 4 * Copyright (C) 2014, Red Hat Inc, Andrew Jones <drjones@redhat.com> 5 * 6 * This work is licensed under the terms of the GNU LGPL, version 2. 7 */ 8 #include "asm/page.h" 9 #include "asm/barrier.h" 10 #include "alloc.h" 11 12 #define PTRS_PER_PGD 4 13 #define PGDIR_SHIFT 30 14 #define PGDIR_SIZE (1UL << PGDIR_SHIFT) 15 #define PGDIR_MASK (~((1 << PGDIR_SHIFT) - 1)) 16 17 #define pgd_free(pgd) free(pgd) 18 static inline pgd_t *pgd_alloc(void) 19 { 20 pgd_t *pgd = memalign(L1_CACHE_BYTES, PTRS_PER_PGD * sizeof(pgd_t)); 21 memset(pgd, 0, PTRS_PER_PGD * sizeof(pgd_t)); 22 return pgd; 23 } 24 25 static inline void local_flush_tlb_all(void) 26 { 27 asm volatile("mcr p15, 0, %0, c8, c7, 0" :: "r" (0)); 28 dsb(); 29 isb(); 30 } 31 32 static inline void flush_tlb_all(void) 33 { 34 //TODO 35 local_flush_tlb_all(); 36 } 37 38 extern bool mmu_enabled(void); 39 extern void mmu_enable(pgd_t *pgtable); 40 extern void mmu_enable_idmap(void); 41 extern void mmu_init_io_sect(pgd_t *pgtable); 42 43 #endif /* __ASMARM_MMU_H_ */ 44