18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2020 Loongson Technology Corporation Limited 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci#ifndef _ASM_PAGE_H 68c2ecf20Sopenharmony_ci#define _ASM_PAGE_H 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <linux/const.h> 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci/* 118c2ecf20Sopenharmony_ci * PAGE_SHIFT determines the page size 128c2ecf20Sopenharmony_ci */ 138c2ecf20Sopenharmony_ci#ifdef CONFIG_PAGE_SIZE_4KB 148c2ecf20Sopenharmony_ci#define PAGE_SHIFT 12 158c2ecf20Sopenharmony_ci#endif 168c2ecf20Sopenharmony_ci#ifdef CONFIG_PAGE_SIZE_16KB 178c2ecf20Sopenharmony_ci#define PAGE_SHIFT 14 188c2ecf20Sopenharmony_ci#endif 198c2ecf20Sopenharmony_ci#ifdef CONFIG_PAGE_SIZE_64KB 208c2ecf20Sopenharmony_ci#define PAGE_SHIFT 16 218c2ecf20Sopenharmony_ci#endif 228c2ecf20Sopenharmony_ci#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) 238c2ecf20Sopenharmony_ci#define PAGE_MASK (~(PAGE_SIZE - 1)) 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci#define HPAGE_SHIFT (PAGE_SHIFT + PAGE_SHIFT - 3) 268c2ecf20Sopenharmony_ci#define HPAGE_SIZE (_AC(1,UL) << HPAGE_SHIFT) 278c2ecf20Sopenharmony_ci#define HPAGE_MASK (~(HPAGE_SIZE - 1)) 288c2ecf20Sopenharmony_ci#define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci#ifndef __ASSEMBLY__ 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci#include <linux/kernel.h> 338c2ecf20Sopenharmony_ci#include <linux/pfn.h> 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci/* 368c2ecf20Sopenharmony_ci * It's normally defined only for FLATMEM config but it's 378c2ecf20Sopenharmony_ci * used in our early mem init code for all memory models. 388c2ecf20Sopenharmony_ci * So always define it. 398c2ecf20Sopenharmony_ci */ 408c2ecf20Sopenharmony_ci#define ARCH_PFN_OFFSET PFN_UP(PHYS_OFFSET) 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ciextern void clear_page(void * page); 438c2ecf20Sopenharmony_ciextern void copy_page(void * to, void * from); 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci#define clear_user_page(page, vaddr, pg) clear_page(page) 468c2ecf20Sopenharmony_ci#define copy_user_page(to, from, vaddr, pg) copy_page(to, from) 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ciextern unsigned long shm_align_mask; 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_cistruct page; 518c2ecf20Sopenharmony_cistruct vm_area_struct; 528c2ecf20Sopenharmony_civoid copy_user_highpage(struct page *to, struct page *from, 538c2ecf20Sopenharmony_ci unsigned long vaddr, struct vm_area_struct *vma); 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci#define __HAVE_ARCH_COPY_USER_HIGHPAGE 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_citypedef struct { unsigned long pte; } pte_t; 588c2ecf20Sopenharmony_ci#define pte_val(x) ((x).pte) 598c2ecf20Sopenharmony_ci#define __pte(x) ((pte_t) { (x) } ) 608c2ecf20Sopenharmony_citypedef struct page *pgtable_t; 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_citypedef struct { unsigned long pgd; } pgd_t; 638c2ecf20Sopenharmony_ci#define pgd_val(x) ((x).pgd) 648c2ecf20Sopenharmony_ci#define __pgd(x) ((pgd_t) { (x) } ) 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci/* 678c2ecf20Sopenharmony_ci * Manipulate page protection bits 688c2ecf20Sopenharmony_ci */ 698c2ecf20Sopenharmony_citypedef struct { unsigned long pgprot; } pgprot_t; 708c2ecf20Sopenharmony_ci#define pgprot_val(x) ((x).pgprot) 718c2ecf20Sopenharmony_ci#define __pgprot(x) ((pgprot_t) { (x) } ) 728c2ecf20Sopenharmony_ci#define pte_pgprot(x) __pgprot(pte_val(x) & ~_PFN_MASK) 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci#define ptep_buddy(x) ((pte_t *)((unsigned long)(x) ^ sizeof(pte_t))) 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci/* 778c2ecf20Sopenharmony_ci * __pa()/__va() should be used only during mem init. 788c2ecf20Sopenharmony_ci */ 798c2ecf20Sopenharmony_ci#define __pa(x) PHYSADDR(x) 808c2ecf20Sopenharmony_ci#define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET - PHYS_OFFSET)) 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) 838c2ecf20Sopenharmony_ci#define sym_to_pfn(x) __phys_to_pfn(__pa_symbol(x)) 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci#ifdef CONFIG_FLATMEM 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_cistatic inline int pfn_valid(unsigned long pfn) 888c2ecf20Sopenharmony_ci{ 898c2ecf20Sopenharmony_ci /* avoid <linux/mm.h> include hell */ 908c2ecf20Sopenharmony_ci extern unsigned long max_mapnr; 918c2ecf20Sopenharmony_ci unsigned long pfn_offset = ARCH_PFN_OFFSET; 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci return pfn >= pfn_offset && pfn < max_mapnr; 948c2ecf20Sopenharmony_ci} 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci#endif 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci#define virt_to_pfn(kaddr) PFN_DOWN(PHYSADDR(kaddr)) 998c2ecf20Sopenharmony_ci#define virt_to_page(kaddr) pfn_to_page(virt_to_pfn(kaddr)) 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ciextern int __virt_addr_valid(volatile void *kaddr); 1028c2ecf20Sopenharmony_ci#define virt_addr_valid(kaddr) __virt_addr_valid((volatile void *)(kaddr)) 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci#define VM_DATA_DEFAULT_FLAGS \ 1058c2ecf20Sopenharmony_ci (VM_READ | VM_WRITE | \ 1068c2ecf20Sopenharmony_ci ((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0) | \ 1078c2ecf20Sopenharmony_ci VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ciextern unsigned long __kaslr_offset; 1108c2ecf20Sopenharmony_cistatic inline unsigned long kaslr_offset(void) 1118c2ecf20Sopenharmony_ci{ 1128c2ecf20Sopenharmony_ci return __kaslr_offset; 1138c2ecf20Sopenharmony_ci} 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_ci#include <asm-generic/memory_model.h> 1168c2ecf20Sopenharmony_ci#include <asm-generic/getorder.h> 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_ci#endif /* !__ASSEMBLY__ */ 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ci#endif /* _ASM_PAGE_H */ 121