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*8cca5668SAndrew Jones #include <asm/page.h> 9*8cca5668SAndrew Jones #include <asm/barrier.h> 10*8cca5668SAndrew Jones #include <alloc.h> 11db866895SAndrew Jones 12153d1936SAndrew Jones #define PTRS_PER_PGD 4 13153d1936SAndrew Jones #define PGDIR_SHIFT 30 14153d1936SAndrew Jones #define PGDIR_SIZE (1UL << PGDIR_SHIFT) 15153d1936SAndrew Jones #define PGDIR_MASK (~((1 << PGDIR_SHIFT) - 1)) 16153d1936SAndrew Jones 17153d1936SAndrew Jones #define pgd_free(pgd) free(pgd) 18153d1936SAndrew Jones static inline pgd_t *pgd_alloc(void) 19153d1936SAndrew Jones { 20153d1936SAndrew Jones pgd_t *pgd = memalign(L1_CACHE_BYTES, PTRS_PER_PGD * sizeof(pgd_t)); 21153d1936SAndrew Jones memset(pgd, 0, PTRS_PER_PGD * sizeof(pgd_t)); 22153d1936SAndrew Jones return pgd; 23153d1936SAndrew Jones } 24153d1936SAndrew Jones 25153d1936SAndrew Jones static inline void local_flush_tlb_all(void) 26153d1936SAndrew Jones { 27153d1936SAndrew Jones asm volatile("mcr p15, 0, %0, c8, c7, 0" :: "r" (0)); 28153d1936SAndrew Jones dsb(); 29153d1936SAndrew Jones isb(); 30153d1936SAndrew Jones } 31153d1936SAndrew Jones 32153d1936SAndrew Jones static inline void flush_tlb_all(void) 33153d1936SAndrew Jones { 34153d1936SAndrew Jones //TODO 35153d1936SAndrew Jones local_flush_tlb_all(); 36153d1936SAndrew Jones } 37153d1936SAndrew Jones 38153d1936SAndrew Jones extern bool mmu_enabled(void); 39153d1936SAndrew Jones extern void mmu_enable(pgd_t *pgtable); 40153d1936SAndrew Jones extern void mmu_enable_idmap(void); 41153d1936SAndrew Jones extern void mmu_init_io_sect(pgd_t *pgtable); 42db866895SAndrew Jones 43db866895SAndrew Jones #endif /* __ASMARM_MMU_H_ */ 44