162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci#ifndef __ASM_ARC_PAGE_H 662306a36Sopenharmony_ci#define __ASM_ARC_PAGE_H 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <uapi/asm/page.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifdef CONFIG_ARC_HAS_PAE40 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#define MAX_POSSIBLE_PHYSMEM_BITS 40 1362306a36Sopenharmony_ci#define PAGE_MASK_PHYS (0xff00000000ull | PAGE_MASK) 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#else /* CONFIG_ARC_HAS_PAE40 */ 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define MAX_POSSIBLE_PHYSMEM_BITS 32 1862306a36Sopenharmony_ci#define PAGE_MASK_PHYS PAGE_MASK 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#endif /* CONFIG_ARC_HAS_PAE40 */ 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define clear_page(paddr) memset((paddr), 0, PAGE_SIZE) 2562306a36Sopenharmony_ci#define copy_user_page(to, from, vaddr, pg) copy_page(to, from) 2662306a36Sopenharmony_ci#define copy_page(to, from) memcpy((to), (from), PAGE_SIZE) 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistruct vm_area_struct; 2962306a36Sopenharmony_cistruct page; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#define __HAVE_ARCH_COPY_USER_HIGHPAGE 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_civoid copy_user_highpage(struct page *to, struct page *from, 3462306a36Sopenharmony_ci unsigned long u_vaddr, struct vm_area_struct *vma); 3562306a36Sopenharmony_civoid clear_user_page(void *to, unsigned long u_vaddr, struct page *page); 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_citypedef struct { 3862306a36Sopenharmony_ci unsigned long pgd; 3962306a36Sopenharmony_ci} pgd_t; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci#define pgd_val(x) ((x).pgd) 4262306a36Sopenharmony_ci#define __pgd(x) ((pgd_t) { (x) }) 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#if CONFIG_PGTABLE_LEVELS > 3 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_citypedef struct { 4762306a36Sopenharmony_ci unsigned long pud; 4862306a36Sopenharmony_ci} pud_t; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci#define pud_val(x) ((x).pud) 5162306a36Sopenharmony_ci#define __pud(x) ((pud_t) { (x) }) 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci#endif 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci#if CONFIG_PGTABLE_LEVELS > 2 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_citypedef struct { 5862306a36Sopenharmony_ci unsigned long pmd; 5962306a36Sopenharmony_ci} pmd_t; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci#define pmd_val(x) ((x).pmd) 6262306a36Sopenharmony_ci#define __pmd(x) ((pmd_t) { (x) }) 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci#endif 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_citypedef struct { 6762306a36Sopenharmony_ci#ifdef CONFIG_ARC_HAS_PAE40 6862306a36Sopenharmony_ci unsigned long long pte; 6962306a36Sopenharmony_ci#else 7062306a36Sopenharmony_ci unsigned long pte; 7162306a36Sopenharmony_ci#endif 7262306a36Sopenharmony_ci} pte_t; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci#define pte_val(x) ((x).pte) 7562306a36Sopenharmony_ci#define __pte(x) ((pte_t) { (x) }) 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_citypedef struct { 7862306a36Sopenharmony_ci unsigned long pgprot; 7962306a36Sopenharmony_ci} pgprot_t; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci#define pgprot_val(x) ((x).pgprot) 8262306a36Sopenharmony_ci#define __pgprot(x) ((pgprot_t) { (x) }) 8362306a36Sopenharmony_ci#define pte_pgprot(x) __pgprot(pte_val(x)) 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_citypedef struct page *pgtable_t; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci/* 8862306a36Sopenharmony_ci * Use virt_to_pfn with caution: 8962306a36Sopenharmony_ci * If used in pte or paddr related macros, it could cause truncation 9062306a36Sopenharmony_ci * in PAE40 builds 9162306a36Sopenharmony_ci * As a rule of thumb, only use it in helpers starting with virt_ 9262306a36Sopenharmony_ci * You have been warned ! 9362306a36Sopenharmony_ci */ 9462306a36Sopenharmony_ci#define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT) 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci/* 9762306a36Sopenharmony_ci * When HIGHMEM is enabled we have holes in the memory map so we need 9862306a36Sopenharmony_ci * pfn_valid() that takes into account the actual extents of the physical 9962306a36Sopenharmony_ci * memory 10062306a36Sopenharmony_ci */ 10162306a36Sopenharmony_ci#ifdef CONFIG_HIGHMEM 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ciextern unsigned long arch_pfn_offset; 10462306a36Sopenharmony_ci#define ARCH_PFN_OFFSET arch_pfn_offset 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ciextern int pfn_valid(unsigned long pfn); 10762306a36Sopenharmony_ci#define pfn_valid pfn_valid 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci#else /* CONFIG_HIGHMEM */ 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci#define ARCH_PFN_OFFSET virt_to_pfn((void *)CONFIG_LINUX_RAM_BASE) 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci#endif /* CONFIG_HIGHMEM */ 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci/* 11662306a36Sopenharmony_ci * __pa, __va, virt_to_page (ALERT: deprecated, don't use them) 11762306a36Sopenharmony_ci * 11862306a36Sopenharmony_ci * These macros have historically been misnamed 11962306a36Sopenharmony_ci * virt here means link-address/program-address as embedded in object code. 12062306a36Sopenharmony_ci * And for ARC, link-addr = physical address 12162306a36Sopenharmony_ci */ 12262306a36Sopenharmony_ci#define __pa(vaddr) ((unsigned long)(vaddr)) 12362306a36Sopenharmony_ci#define __va(paddr) ((void *)((unsigned long)(paddr))) 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci#define virt_to_page(kaddr) pfn_to_page(virt_to_pfn(kaddr)) 12662306a36Sopenharmony_ci#define virt_addr_valid(kaddr) pfn_valid(virt_to_pfn(kaddr)) 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci/* Default Permissions for stack/heaps pages (Non Executable) */ 12962306a36Sopenharmony_ci#define VM_DATA_DEFAULT_FLAGS VM_DATA_FLAGS_NON_EXEC 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci#define WANT_PAGE_VIRTUAL 1 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci#include <asm-generic/memory_model.h> /* page_to_pfn, pfn_to_page */ 13462306a36Sopenharmony_ci#include <asm-generic/getorder.h> 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci#endif /* !__ASSEMBLY__ */ 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci#endif 139