1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 23be80aaeSVineet Gupta /* 33be80aaeSVineet Gupta * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) 43be80aaeSVineet Gupta */ 53be80aaeSVineet Gupta #ifndef __ASM_ARC_PAGE_H 63be80aaeSVineet Gupta #define __ASM_ARC_PAGE_H 73be80aaeSVineet Gupta 88c2f4a8dSVineet Gupta #include <uapi/asm/page.h> 93be80aaeSVineet Gupta 10c5f756d8SVladimir Isaev #ifdef CONFIG_ARC_HAS_PAE40 11c5f756d8SVladimir Isaev 12c5f756d8SVladimir Isaev #define MAX_POSSIBLE_PHYSMEM_BITS 40 13c5f756d8SVladimir Isaev #define PAGE_MASK_PHYS (0xff00000000ull | PAGE_MASK) 14c5f756d8SVladimir Isaev 15c5f756d8SVladimir Isaev #else /* CONFIG_ARC_HAS_PAE40 */ 16c5f756d8SVladimir Isaev 17c5f756d8SVladimir Isaev #define MAX_POSSIBLE_PHYSMEM_BITS 32 18c5f756d8SVladimir Isaev #define PAGE_MASK_PHYS PAGE_MASK 19c5f756d8SVladimir Isaev 20c5f756d8SVladimir Isaev #endif /* CONFIG_ARC_HAS_PAE40 */ 21c5f756d8SVladimir Isaev 225dda4dc5SVineet Gupta #ifndef __ASSEMBLY__ 235dda4dc5SVineet Gupta 245dda4dc5SVineet Gupta #define clear_page(paddr) memset((paddr), 0, PAGE_SIZE) 258a48c0a3SRandy Dunlap #define copy_user_page(to, from, vaddr, pg) copy_page(to, from) 265dda4dc5SVineet Gupta #define copy_page(to, from) memcpy((to), (from), PAGE_SIZE) 275dda4dc5SVineet Gupta 284102b533SVineet Gupta struct vm_area_struct; 294102b533SVineet Gupta struct page; 304102b533SVineet Gupta 314102b533SVineet Gupta #define __HAVE_ARCH_COPY_USER_HIGHPAGE 324102b533SVineet Gupta 334102b533SVineet Gupta void copy_user_highpage(struct page *to, struct page *from, 344102b533SVineet Gupta unsigned long u_vaddr, struct vm_area_struct *vma); 354102b533SVineet Gupta void clear_user_page(void *to, unsigned long u_vaddr, struct page *page); 364102b533SVineet Gupta 375dda4dc5SVineet Gupta typedef struct { 38be43b096SVineet Gupta unsigned long pgd; 39be43b096SVineet Gupta } pgd_t; 40be43b096SVineet Gupta 41be43b096SVineet Gupta #define pgd_val(x) ((x).pgd) 42be43b096SVineet Gupta #define __pgd(x) ((pgd_t) { (x) }) 43be43b096SVineet Gupta 448747ff70SVineet Gupta #if CONFIG_PGTABLE_LEVELS > 3 458747ff70SVineet Gupta 468747ff70SVineet Gupta typedef struct { 478747ff70SVineet Gupta unsigned long pud; 488747ff70SVineet Gupta } pud_t; 498747ff70SVineet Gupta 508747ff70SVineet Gupta #define pud_val(x) ((x).pud) 518747ff70SVineet Gupta #define __pud(x) ((pud_t) { (x) }) 528747ff70SVineet Gupta 538747ff70SVineet Gupta #endif 548747ff70SVineet Gupta 552dde02abSVineet Gupta #if CONFIG_PGTABLE_LEVELS > 2 562dde02abSVineet Gupta 572dde02abSVineet Gupta typedef struct { 582dde02abSVineet Gupta unsigned long pmd; 592dde02abSVineet Gupta } pmd_t; 602dde02abSVineet Gupta 612dde02abSVineet Gupta #define pmd_val(x) ((x).pmd) 622dde02abSVineet Gupta #define __pmd(x) ((pmd_t) { (x) }) 632dde02abSVineet Gupta 642dde02abSVineet Gupta #endif 652dde02abSVineet Gupta 66be43b096SVineet Gupta typedef struct { 675035cd5bSVineet Gupta #ifdef CONFIG_ARC_HAS_PAE40 685035cd5bSVineet Gupta unsigned long long pte; 695035cd5bSVineet Gupta #else 705dda4dc5SVineet Gupta unsigned long pte; 715035cd5bSVineet Gupta #endif 725dda4dc5SVineet Gupta } pte_t; 73be43b096SVineet Gupta 74be43b096SVineet Gupta #define pte_val(x) ((x).pte) 75be43b096SVineet Gupta #define __pte(x) ((pte_t) { (x) }) 76be43b096SVineet Gupta 775dda4dc5SVineet Gupta typedef struct { 785dda4dc5SVineet Gupta unsigned long pgprot; 795dda4dc5SVineet Gupta } pgprot_t; 805dda4dc5SVineet Gupta 815dda4dc5SVineet Gupta #define pgprot_val(x) ((x).pgprot) 825dda4dc5SVineet Gupta #define __pgprot(x) ((pgprot_t) { (x) }) 834368902bSGilad Ben-Yossef #define pte_pgprot(x) __pgprot(pte_val(x)) 844368902bSGilad Ben-Yossef 85d9820ff7SVineet Gupta typedef struct page *pgtable_t; 86e8a75963SVineet Gupta 872519d753SVineet Gupta /* 882519d753SVineet Gupta * Use virt_to_pfn with caution: 892519d753SVineet Gupta * If used in pte or paddr related macros, it could cause truncation 902519d753SVineet Gupta * in PAE40 builds 912519d753SVineet Gupta * As a rule of thumb, only use it in helpers starting with virt_ 922519d753SVineet Gupta * You have been warned ! 932519d753SVineet Gupta */ 94c2ff5cf2SVineet Gupta #define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT) 95c2ff5cf2SVineet Gupta 96050b2da2SMike Rapoport /* 97050b2da2SMike Rapoport * When HIGHMEM is enabled we have holes in the memory map so we need 98050b2da2SMike Rapoport * pfn_valid() that takes into account the actual extents of the physical 99050b2da2SMike Rapoport * memory 100050b2da2SMike Rapoport */ 101050b2da2SMike Rapoport #ifdef CONFIG_HIGHMEM 1025dda4dc5SVineet Gupta 103050b2da2SMike Rapoport extern unsigned long arch_pfn_offset; 104050b2da2SMike Rapoport #define ARCH_PFN_OFFSET arch_pfn_offset 105050b2da2SMike Rapoport 106050b2da2SMike Rapoport extern int pfn_valid(unsigned long pfn); 107050b2da2SMike Rapoport #define pfn_valid pfn_valid 108050b2da2SMike Rapoport 109050b2da2SMike Rapoport #else /* CONFIG_HIGHMEM */ 110050b2da2SMike Rapoport 111*ee12fe28SLinus Walleij #define ARCH_PFN_OFFSET virt_to_pfn((void *)CONFIG_LINUX_RAM_BASE) 112050b2da2SMike Rapoport 113050b2da2SMike Rapoport #endif /* CONFIG_HIGHMEM */ 1145dda4dc5SVineet Gupta 1155dda4dc5SVineet Gupta /* 1165dda4dc5SVineet Gupta * __pa, __va, virt_to_page (ALERT: deprecated, don't use them) 1175dda4dc5SVineet Gupta * 1185dda4dc5SVineet Gupta * These macros have historically been misnamed 1195dda4dc5SVineet Gupta * virt here means link-address/program-address as embedded in object code. 120c2ff5cf2SVineet Gupta * And for ARC, link-addr = physical address 1215dda4dc5SVineet Gupta */ 1222519d753SVineet Gupta #define __pa(vaddr) ((unsigned long)(vaddr)) 1235dda4dc5SVineet Gupta #define __va(paddr) ((void *)((unsigned long)(paddr))) 1245dda4dc5SVineet Gupta 12526f9d5fdSVineet Gupta #define virt_to_page(kaddr) pfn_to_page(virt_to_pfn(kaddr)) 126c2ff5cf2SVineet Gupta #define virt_addr_valid(kaddr) pfn_valid(virt_to_pfn(kaddr)) 1275dda4dc5SVineet Gupta 1283abc9448SVineet Gupta /* Default Permissions for stack/heaps pages (Non Executable) */ 129c62da0c3SAnshuman Khandual #define VM_DATA_DEFAULT_FLAGS VM_DATA_FLAGS_NON_EXEC 1305dda4dc5SVineet Gupta 1315dda4dc5SVineet Gupta #define WANT_PAGE_VIRTUAL 1 1325dda4dc5SVineet Gupta 1335dda4dc5SVineet Gupta #include <asm-generic/memory_model.h> /* page_to_pfn, pfn_to_page */ 1345dda4dc5SVineet Gupta #include <asm-generic/getorder.h> 1355dda4dc5SVineet Gupta 1363be80aaeSVineet Gupta #endif /* !__ASSEMBLY__ */ 1373be80aaeSVineet Gupta 1383be80aaeSVineet Gupta #endif 139