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