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