1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _SPARC64_PAGE_H 3*4882a593Smuzhiyun #define _SPARC64_PAGE_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/const.h> 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #define PAGE_SHIFT 13 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) 10*4882a593Smuzhiyun #define PAGE_MASK (~(PAGE_SIZE-1)) 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /* Flushing for D-cache alias handling is only needed if 13*4882a593Smuzhiyun * the page size is smaller than 16K. 14*4882a593Smuzhiyun */ 15*4882a593Smuzhiyun #if PAGE_SHIFT < 14 16*4882a593Smuzhiyun #define DCACHE_ALIASING_POSSIBLE 17*4882a593Smuzhiyun #endif 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define HPAGE_SHIFT 23 20*4882a593Smuzhiyun #define REAL_HPAGE_SHIFT 22 21*4882a593Smuzhiyun #define HPAGE_16GB_SHIFT 34 22*4882a593Smuzhiyun #define HPAGE_2GB_SHIFT 31 23*4882a593Smuzhiyun #define HPAGE_256MB_SHIFT 28 24*4882a593Smuzhiyun #define HPAGE_64K_SHIFT 16 25*4882a593Smuzhiyun #define REAL_HPAGE_SIZE (_AC(1,UL) << REAL_HPAGE_SHIFT) 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE) 28*4882a593Smuzhiyun #define HPAGE_SIZE (_AC(1,UL) << HPAGE_SHIFT) 29*4882a593Smuzhiyun #define HPAGE_MASK (~(HPAGE_SIZE - 1UL)) 30*4882a593Smuzhiyun #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) 31*4882a593Smuzhiyun #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA 32*4882a593Smuzhiyun #define REAL_HPAGE_PER_HPAGE (_AC(1,UL) << (HPAGE_SHIFT - REAL_HPAGE_SHIFT)) 33*4882a593Smuzhiyun #define HUGE_MAX_HSTATE 5 34*4882a593Smuzhiyun #endif 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #ifndef __ASSEMBLY__ 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun #if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE) 39*4882a593Smuzhiyun struct pt_regs; 40*4882a593Smuzhiyun void hugetlb_setup(struct pt_regs *regs); 41*4882a593Smuzhiyun #endif 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #define WANT_PAGE_VIRTUAL 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun void _clear_page(void *page); 46*4882a593Smuzhiyun #define clear_page(X) _clear_page((void *)(X)) 47*4882a593Smuzhiyun struct page; 48*4882a593Smuzhiyun void clear_user_page(void *addr, unsigned long vaddr, struct page *page); 49*4882a593Smuzhiyun #define copy_page(X,Y) memcpy((void *)(X), (void *)(Y), PAGE_SIZE) 50*4882a593Smuzhiyun void copy_user_page(void *to, void *from, unsigned long vaddr, struct page *topage); 51*4882a593Smuzhiyun #define __HAVE_ARCH_COPY_USER_HIGHPAGE 52*4882a593Smuzhiyun struct vm_area_struct; 53*4882a593Smuzhiyun void copy_user_highpage(struct page *to, struct page *from, 54*4882a593Smuzhiyun unsigned long vaddr, struct vm_area_struct *vma); 55*4882a593Smuzhiyun #define __HAVE_ARCH_COPY_HIGHPAGE 56*4882a593Smuzhiyun void copy_highpage(struct page *to, struct page *from); 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /* Unlike sparc32, sparc64's parameter passing API is more 59*4882a593Smuzhiyun * sane in that structures which as small enough are passed 60*4882a593Smuzhiyun * in registers instead of on the stack. Thus, setting 61*4882a593Smuzhiyun * STRICT_MM_TYPECHECKS does not generate worse code so 62*4882a593Smuzhiyun * let's enable it to get the type checking. 63*4882a593Smuzhiyun */ 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun #define STRICT_MM_TYPECHECKS 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #ifdef STRICT_MM_TYPECHECKS 68*4882a593Smuzhiyun /* These are used to make use of C type-checking.. */ 69*4882a593Smuzhiyun typedef struct { unsigned long pte; } pte_t; 70*4882a593Smuzhiyun typedef struct { unsigned long iopte; } iopte_t; 71*4882a593Smuzhiyun typedef struct { unsigned long pmd; } pmd_t; 72*4882a593Smuzhiyun typedef struct { unsigned long pud; } pud_t; 73*4882a593Smuzhiyun typedef struct { unsigned long pgd; } pgd_t; 74*4882a593Smuzhiyun typedef struct { unsigned long pgprot; } pgprot_t; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun #define pte_val(x) ((x).pte) 77*4882a593Smuzhiyun #define iopte_val(x) ((x).iopte) 78*4882a593Smuzhiyun #define pmd_val(x) ((x).pmd) 79*4882a593Smuzhiyun #define pud_val(x) ((x).pud) 80*4882a593Smuzhiyun #define pgd_val(x) ((x).pgd) 81*4882a593Smuzhiyun #define pgprot_val(x) ((x).pgprot) 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun #define __pte(x) ((pte_t) { (x) } ) 84*4882a593Smuzhiyun #define __iopte(x) ((iopte_t) { (x) } ) 85*4882a593Smuzhiyun #define __pmd(x) ((pmd_t) { (x) } ) 86*4882a593Smuzhiyun #define __pud(x) ((pud_t) { (x) } ) 87*4882a593Smuzhiyun #define __pgd(x) ((pgd_t) { (x) } ) 88*4882a593Smuzhiyun #define __pgprot(x) ((pgprot_t) { (x) } ) 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun #else 91*4882a593Smuzhiyun /* .. while these make it easier on the compiler */ 92*4882a593Smuzhiyun typedef unsigned long pte_t; 93*4882a593Smuzhiyun typedef unsigned long iopte_t; 94*4882a593Smuzhiyun typedef unsigned long pmd_t; 95*4882a593Smuzhiyun typedef unsigned long pud_t; 96*4882a593Smuzhiyun typedef unsigned long pgd_t; 97*4882a593Smuzhiyun typedef unsigned long pgprot_t; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun #define pte_val(x) (x) 100*4882a593Smuzhiyun #define iopte_val(x) (x) 101*4882a593Smuzhiyun #define pmd_val(x) (x) 102*4882a593Smuzhiyun #define pud_val(x) (x) 103*4882a593Smuzhiyun #define pgd_val(x) (x) 104*4882a593Smuzhiyun #define pgprot_val(x) (x) 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun #define __pte(x) (x) 107*4882a593Smuzhiyun #define __iopte(x) (x) 108*4882a593Smuzhiyun #define __pmd(x) (x) 109*4882a593Smuzhiyun #define __pud(x) (x) 110*4882a593Smuzhiyun #define __pgd(x) (x) 111*4882a593Smuzhiyun #define __pgprot(x) (x) 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun #endif /* (STRICT_MM_TYPECHECKS) */ 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun typedef pte_t *pgtable_t; 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun extern unsigned long sparc64_va_hole_top; 118*4882a593Smuzhiyun extern unsigned long sparc64_va_hole_bottom; 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun /* The next two defines specify the actual exclusion region we 121*4882a593Smuzhiyun * enforce, wherein we use a 4GB red zone on each side of the VA hole. 122*4882a593Smuzhiyun */ 123*4882a593Smuzhiyun #define VA_EXCLUDE_START (sparc64_va_hole_bottom - (1UL << 32UL)) 124*4882a593Smuzhiyun #define VA_EXCLUDE_END (sparc64_va_hole_top + (1UL << 32UL)) 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun #define TASK_UNMAPPED_BASE (test_thread_flag(TIF_32BIT) ? \ 127*4882a593Smuzhiyun _AC(0x0000000070000000,UL) : \ 128*4882a593Smuzhiyun VA_EXCLUDE_END) 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun #include <asm-generic/memory_model.h> 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun extern unsigned long PAGE_OFFSET; 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun #endif /* !(__ASSEMBLY__) */ 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun /* The maximum number of physical memory address bits we support. The 137*4882a593Smuzhiyun * largest value we can support is whatever "KPGD_SHIFT + KPTE_BITS" 138*4882a593Smuzhiyun * evaluates to. 139*4882a593Smuzhiyun */ 140*4882a593Smuzhiyun #define MAX_PHYS_ADDRESS_BITS 53 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun #define ILOG2_4MB 22 143*4882a593Smuzhiyun #define ILOG2_256MB 28 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun #ifndef __ASSEMBLY__ 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun #define __pa(x) ((unsigned long)(x) - PAGE_OFFSET) 148*4882a593Smuzhiyun #define __va(x) ((void *)((unsigned long) (x) + PAGE_OFFSET)) 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr)>>PAGE_SHIFT) 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun #define virt_to_phys __pa 157*4882a593Smuzhiyun #define phys_to_virt __va 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun #endif /* !(__ASSEMBLY__) */ 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun #include <asm-generic/getorder.h> 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun #endif /* _SPARC64_PAGE_H */ 164