150acfb2bSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 207037db5SPalmer Dabbelt /* 307037db5SPalmer Dabbelt * Copyright (C) 2009 Chen Liqin <liqin.chen@sunplusct.com> 407037db5SPalmer Dabbelt * Copyright (C) 2012 Regents of the University of California 507037db5SPalmer Dabbelt * Copyright (C) 2017 SiFive 607037db5SPalmer Dabbelt * Copyright (C) 2017 XiaojingZhu <zhuxiaoj@ict.ac.cn> 707037db5SPalmer Dabbelt */ 807037db5SPalmer Dabbelt 907037db5SPalmer Dabbelt #ifndef _ASM_RISCV_PAGE_H 1007037db5SPalmer Dabbelt #define _ASM_RISCV_PAGE_H 1107037db5SPalmer Dabbelt 1207037db5SPalmer Dabbelt #include <linux/pfn.h> 1307037db5SPalmer Dabbelt #include <linux/const.h> 1407037db5SPalmer Dabbelt 1507037db5SPalmer Dabbelt #define PAGE_SHIFT (12) 1607037db5SPalmer Dabbelt #define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT) 1707037db5SPalmer Dabbelt #define PAGE_MASK (~(PAGE_SIZE - 1)) 1807037db5SPalmer Dabbelt 199e953cdaSAlexandre Ghiti #ifdef CONFIG_64BIT 209e953cdaSAlexandre Ghiti #define HUGE_MAX_HSTATE 2 219e953cdaSAlexandre Ghiti #else 229e953cdaSAlexandre Ghiti #define HUGE_MAX_HSTATE 1 239e953cdaSAlexandre Ghiti #endif 249e953cdaSAlexandre Ghiti #define HPAGE_SHIFT PMD_SHIFT 259e953cdaSAlexandre Ghiti #define HPAGE_SIZE (_AC(1, UL) << HPAGE_SHIFT) 269e953cdaSAlexandre Ghiti #define HPAGE_MASK (~(HPAGE_SIZE - 1)) 279e953cdaSAlexandre Ghiti #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) 289e953cdaSAlexandre Ghiti 2907037db5SPalmer Dabbelt /* 3007037db5SPalmer Dabbelt * PAGE_OFFSET -- the first address of the first page of memory. 3107037db5SPalmer Dabbelt * When not using MMU this corresponds to the first free page in 3207037db5SPalmer Dabbelt * physical memory (aligned on a page boundary). 3307037db5SPalmer Dabbelt */ 3407037db5SPalmer Dabbelt #define PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL) 3507037db5SPalmer Dabbelt 3607037db5SPalmer Dabbelt #define KERN_VIRT_SIZE (-PAGE_OFFSET) 3707037db5SPalmer Dabbelt 3807037db5SPalmer Dabbelt #ifndef __ASSEMBLY__ 3907037db5SPalmer Dabbelt 4007037db5SPalmer Dabbelt #define PAGE_UP(addr) (((addr)+((PAGE_SIZE)-1))&(~((PAGE_SIZE)-1))) 4107037db5SPalmer Dabbelt #define PAGE_DOWN(addr) ((addr)&(~((PAGE_SIZE)-1))) 4207037db5SPalmer Dabbelt 4307037db5SPalmer Dabbelt /* align addr on a size boundary - adjust address up/down if needed */ 4407037db5SPalmer Dabbelt #define _ALIGN_UP(addr, size) (((addr)+((size)-1))&(~((size)-1))) 4507037db5SPalmer Dabbelt #define _ALIGN_DOWN(addr, size) ((addr)&(~((size)-1))) 4607037db5SPalmer Dabbelt 4707037db5SPalmer Dabbelt /* align addr on a size boundary - adjust address up if needed */ 4807037db5SPalmer Dabbelt #define _ALIGN(addr, size) _ALIGN_UP(addr, size) 4907037db5SPalmer Dabbelt 5007037db5SPalmer Dabbelt #define clear_page(pgaddr) memset((pgaddr), 0, PAGE_SIZE) 5107037db5SPalmer Dabbelt #define copy_page(to, from) memcpy((to), (from), PAGE_SIZE) 5207037db5SPalmer Dabbelt 5307037db5SPalmer Dabbelt #define clear_user_page(pgaddr, vaddr, page) memset((pgaddr), 0, PAGE_SIZE) 5407037db5SPalmer Dabbelt #define copy_user_page(vto, vfrom, vaddr, topg) \ 5507037db5SPalmer Dabbelt memcpy((vto), (vfrom), PAGE_SIZE) 5607037db5SPalmer Dabbelt 5707037db5SPalmer Dabbelt /* 5807037db5SPalmer Dabbelt * Use struct definitions to apply C type checking 5907037db5SPalmer Dabbelt */ 6007037db5SPalmer Dabbelt 6107037db5SPalmer Dabbelt /* Page Global Directory entry */ 6207037db5SPalmer Dabbelt typedef struct { 6307037db5SPalmer Dabbelt unsigned long pgd; 6407037db5SPalmer Dabbelt } pgd_t; 6507037db5SPalmer Dabbelt 6607037db5SPalmer Dabbelt /* Page Table entry */ 6707037db5SPalmer Dabbelt typedef struct { 6807037db5SPalmer Dabbelt unsigned long pte; 6907037db5SPalmer Dabbelt } pte_t; 7007037db5SPalmer Dabbelt 7107037db5SPalmer Dabbelt typedef struct { 7207037db5SPalmer Dabbelt unsigned long pgprot; 7307037db5SPalmer Dabbelt } pgprot_t; 7407037db5SPalmer Dabbelt 7507037db5SPalmer Dabbelt typedef struct page *pgtable_t; 7607037db5SPalmer Dabbelt 7707037db5SPalmer Dabbelt #define pte_val(x) ((x).pte) 7807037db5SPalmer Dabbelt #define pgd_val(x) ((x).pgd) 7907037db5SPalmer Dabbelt #define pgprot_val(x) ((x).pgprot) 8007037db5SPalmer Dabbelt 8107037db5SPalmer Dabbelt #define __pte(x) ((pte_t) { (x) }) 8207037db5SPalmer Dabbelt #define __pgd(x) ((pgd_t) { (x) }) 8307037db5SPalmer Dabbelt #define __pgprot(x) ((pgprot_t) { (x) }) 8407037db5SPalmer Dabbelt 858581f387SAntony Pavlov #ifdef CONFIG_64BIT 8607037db5SPalmer Dabbelt #define PTE_FMT "%016lx" 8707037db5SPalmer Dabbelt #else 8807037db5SPalmer Dabbelt #define PTE_FMT "%08lx" 8907037db5SPalmer Dabbelt #endif 9007037db5SPalmer Dabbelt 91*6bd33e1eSChristoph Hellwig #ifdef CONFIG_MMU 9207037db5SPalmer Dabbelt extern unsigned long va_pa_offset; 9307037db5SPalmer Dabbelt extern unsigned long pfn_base; 94*6bd33e1eSChristoph Hellwig #define ARCH_PFN_OFFSET (pfn_base) 95*6bd33e1eSChristoph Hellwig #else 96*6bd33e1eSChristoph Hellwig #define va_pa_offset 0 97*6bd33e1eSChristoph Hellwig #define ARCH_PFN_OFFSET (PAGE_OFFSET >> PAGE_SHIFT) 98*6bd33e1eSChristoph Hellwig #endif /* CONFIG_MMU */ 9907037db5SPalmer Dabbelt 10007037db5SPalmer Dabbelt extern unsigned long max_low_pfn; 10107037db5SPalmer Dabbelt extern unsigned long min_low_pfn; 10207037db5SPalmer Dabbelt 10307037db5SPalmer Dabbelt #define __pa(x) ((unsigned long)(x) - va_pa_offset) 10407037db5SPalmer Dabbelt #define __va(x) ((void *)((unsigned long) (x) + va_pa_offset)) 10507037db5SPalmer Dabbelt 10607037db5SPalmer Dabbelt #define phys_to_pfn(phys) (PFN_DOWN(phys)) 10707037db5SPalmer Dabbelt #define pfn_to_phys(pfn) (PFN_PHYS(pfn)) 10807037db5SPalmer Dabbelt 10907037db5SPalmer Dabbelt #define virt_to_pfn(vaddr) (phys_to_pfn(__pa(vaddr))) 11007037db5SPalmer Dabbelt #define pfn_to_virt(pfn) (__va(pfn_to_phys(pfn))) 11107037db5SPalmer Dabbelt 11207037db5SPalmer Dabbelt #define virt_to_page(vaddr) (pfn_to_page(virt_to_pfn(vaddr))) 11307037db5SPalmer Dabbelt #define page_to_virt(page) (pfn_to_virt(page_to_pfn(page))) 11407037db5SPalmer Dabbelt 11507037db5SPalmer Dabbelt #define page_to_phys(page) (pfn_to_phys(page_to_pfn(page))) 11607037db5SPalmer Dabbelt #define page_to_bus(page) (page_to_phys(page)) 11707037db5SPalmer Dabbelt #define phys_to_page(paddr) (pfn_to_page(phys_to_pfn(paddr))) 11807037db5SPalmer Dabbelt 119d95f1a54SLogan Gunthorpe #ifdef CONFIG_FLATMEM 12007037db5SPalmer Dabbelt #define pfn_valid(pfn) \ 121*6bd33e1eSChristoph Hellwig (((pfn) >= ARCH_PFN_OFFSET) && (((pfn) - ARCH_PFN_OFFSET) < max_mapnr)) 122d95f1a54SLogan Gunthorpe #endif 12307037db5SPalmer Dabbelt 12407037db5SPalmer Dabbelt #endif /* __ASSEMBLY__ */ 12507037db5SPalmer Dabbelt 12607037db5SPalmer Dabbelt #define virt_addr_valid(vaddr) (pfn_valid(virt_to_pfn(vaddr))) 12707037db5SPalmer Dabbelt 12807037db5SPalmer Dabbelt #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | \ 12907037db5SPalmer Dabbelt VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) 13007037db5SPalmer Dabbelt 13107037db5SPalmer Dabbelt #include <asm-generic/memory_model.h> 13207037db5SPalmer Dabbelt #include <asm-generic/getorder.h> 13307037db5SPalmer Dabbelt 13407037db5SPalmer Dabbelt #endif /* _ASM_RISCV_PAGE_H */ 135