162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifdef CONFIG_MMU 362306a36Sopenharmony_ci#include <linux/list.h> 462306a36Sopenharmony_ci#include <linux/vmalloc.h> 562306a36Sopenharmony_ci#include <linux/pgtable.h> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci/* the upper-most page table pointer */ 862306a36Sopenharmony_ciextern pmd_t *top_pmd; 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ciextern int icache_size; 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/* 1362306a36Sopenharmony_ci * 0xffff8000 to 0xffffffff is reserved for any ARM architecture 1462306a36Sopenharmony_ci * specific hacks for copying pages efficiently, while 0xffff4000 1562306a36Sopenharmony_ci * is reserved for VIPT aliasing flushing by generic code. 1662306a36Sopenharmony_ci * 1762306a36Sopenharmony_ci * Note that we don't allow VIPT aliasing caches with SMP. 1862306a36Sopenharmony_ci */ 1962306a36Sopenharmony_ci#define COPYPAGE_MINICACHE 0xffff8000 2062306a36Sopenharmony_ci#define COPYPAGE_V6_FROM 0xffff8000 2162306a36Sopenharmony_ci#define COPYPAGE_V6_TO 0xffffc000 2262306a36Sopenharmony_ci/* PFN alias flushing, for VIPT caches */ 2362306a36Sopenharmony_ci#define FLUSH_ALIAS_START 0xffff4000 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cistatic inline void set_top_pte(unsigned long va, pte_t pte) 2662306a36Sopenharmony_ci{ 2762306a36Sopenharmony_ci pte_t *ptep = pte_offset_kernel(top_pmd, va); 2862306a36Sopenharmony_ci set_pte_ext(ptep, pte, 0); 2962306a36Sopenharmony_ci local_flush_tlb_kernel_page(va); 3062306a36Sopenharmony_ci} 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistatic inline pte_t get_top_pte(unsigned long va) 3362306a36Sopenharmony_ci{ 3462306a36Sopenharmony_ci pte_t *ptep = pte_offset_kernel(top_pmd, va); 3562306a36Sopenharmony_ci return *ptep; 3662306a36Sopenharmony_ci} 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistruct mem_type { 3962306a36Sopenharmony_ci pteval_t prot_pte; 4062306a36Sopenharmony_ci pteval_t prot_pte_s2; 4162306a36Sopenharmony_ci pmdval_t prot_l1; 4262306a36Sopenharmony_ci pmdval_t prot_sect; 4362306a36Sopenharmony_ci unsigned int domain; 4462306a36Sopenharmony_ci}; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ciconst struct mem_type *get_mem_type(unsigned int type); 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_civoid __flush_dcache_folio(struct address_space *mapping, struct folio *folio); 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci/* 5162306a36Sopenharmony_ci * ARM specific vm_struct->flags bits. 5262306a36Sopenharmony_ci */ 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/* (super)section-mapped I/O regions used by ioremap()/iounmap() */ 5562306a36Sopenharmony_ci#define VM_ARM_SECTION_MAPPING 0x80000000 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci/* permanent static mappings from iotable_init() */ 5862306a36Sopenharmony_ci#define VM_ARM_STATIC_MAPPING 0x40000000 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci/* empty mapping */ 6162306a36Sopenharmony_ci#define VM_ARM_EMPTY_MAPPING 0x20000000 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci/* mapping type (attributes) for permanent static mappings */ 6462306a36Sopenharmony_ci#define VM_ARM_MTYPE(mt) ((mt) << 20) 6562306a36Sopenharmony_ci#define VM_ARM_MTYPE_MASK (0x1f << 20) 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_cistruct static_vm { 6962306a36Sopenharmony_ci struct vm_struct vm; 7062306a36Sopenharmony_ci struct list_head list; 7162306a36Sopenharmony_ci}; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ciextern struct list_head static_vmlist; 7462306a36Sopenharmony_ciextern struct static_vm *find_static_vm_vaddr(void *vaddr); 7562306a36Sopenharmony_ciextern __init void add_static_vm_early(struct static_vm *svm); 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci#endif 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci#ifdef CONFIG_ZONE_DMA 8062306a36Sopenharmony_ciextern phys_addr_t arm_dma_limit; 8162306a36Sopenharmony_ciextern unsigned long arm_dma_pfn_limit; 8262306a36Sopenharmony_ci#else 8362306a36Sopenharmony_ci#define arm_dma_limit ((phys_addr_t)~0) 8462306a36Sopenharmony_ci#define arm_dma_pfn_limit (~0ul >> PAGE_SHIFT) 8562306a36Sopenharmony_ci#endif 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ciextern phys_addr_t arm_lowmem_limit; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_civoid __init bootmem_init(void); 9062306a36Sopenharmony_civoid arm_mm_memblock_reserve(void); 9162306a36Sopenharmony_ci#ifdef CONFIG_CMA_AREAS 9262306a36Sopenharmony_civoid dma_contiguous_remap(void); 9362306a36Sopenharmony_ci#else 9462306a36Sopenharmony_cistatic inline void dma_contiguous_remap(void) { } 9562306a36Sopenharmony_ci#endif 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ciunsigned long __clear_cr(unsigned long mask); 98