1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * page.h: Various defines and such for MMU operations on the Sparc for 4*4882a593Smuzhiyun * the Linux kernel. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef _SPARC_PAGE_H 10*4882a593Smuzhiyun #define _SPARC_PAGE_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <linux/const.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #define PAGE_SHIFT 12 15*4882a593Smuzhiyun #define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT) 16*4882a593Smuzhiyun #define PAGE_MASK (~(PAGE_SIZE-1)) 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #ifndef __ASSEMBLY__ 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) 21*4882a593Smuzhiyun #define copy_page(to,from) memcpy((void *)(to), (void *)(from), PAGE_SIZE) 22*4882a593Smuzhiyun #define clear_user_page(addr, vaddr, page) \ 23*4882a593Smuzhiyun do { clear_page(addr); \ 24*4882a593Smuzhiyun sparc_flush_page_to_ram(page); \ 25*4882a593Smuzhiyun } while (0) 26*4882a593Smuzhiyun #define copy_user_page(to, from, vaddr, page) \ 27*4882a593Smuzhiyun do { copy_page(to, from); \ 28*4882a593Smuzhiyun sparc_flush_page_to_ram(page); \ 29*4882a593Smuzhiyun } while (0) 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun /* The following structure is used to hold the physical 32*4882a593Smuzhiyun * memory configuration of the machine. This is filled in 33*4882a593Smuzhiyun * prom_meminit() and is later used by mem_init() to set up 34*4882a593Smuzhiyun * mem_map[]. We statically allocate SPARC_PHYS_BANKS+1 of 35*4882a593Smuzhiyun * these structs, this is arbitrary. The entry after the 36*4882a593Smuzhiyun * last valid one has num_bytes==0. 37*4882a593Smuzhiyun */ 38*4882a593Smuzhiyun struct sparc_phys_banks { 39*4882a593Smuzhiyun unsigned long base_addr; 40*4882a593Smuzhiyun unsigned long num_bytes; 41*4882a593Smuzhiyun }; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #define SPARC_PHYS_BANKS 32 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun extern struct sparc_phys_banks sp_banks[SPARC_PHYS_BANKS+1]; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun /* passing structs on the Sparc slow us down tremendously... */ 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /* #define STRICT_MM_TYPECHECKS */ 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun #ifdef STRICT_MM_TYPECHECKS 52*4882a593Smuzhiyun /* 53*4882a593Smuzhiyun * These are used to make use of C type-checking.. 54*4882a593Smuzhiyun */ 55*4882a593Smuzhiyun typedef struct { unsigned long pte; } pte_t; 56*4882a593Smuzhiyun typedef struct { unsigned long iopte; } iopte_t; 57*4882a593Smuzhiyun typedef struct { unsigned long pmd; } pmd_t; 58*4882a593Smuzhiyun typedef struct { unsigned long pgd; } pgd_t; 59*4882a593Smuzhiyun typedef struct { unsigned long ctxd; } ctxd_t; 60*4882a593Smuzhiyun typedef struct { unsigned long pgprot; } pgprot_t; 61*4882a593Smuzhiyun typedef struct { unsigned long iopgprot; } iopgprot_t; 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun #define pte_val(x) ((x).pte) 64*4882a593Smuzhiyun #define iopte_val(x) ((x).iopte) 65*4882a593Smuzhiyun #define pmd_val(x) ((x).pmd) 66*4882a593Smuzhiyun #define pgd_val(x) ((x).pgd) 67*4882a593Smuzhiyun #define ctxd_val(x) ((x).ctxd) 68*4882a593Smuzhiyun #define pgprot_val(x) ((x).pgprot) 69*4882a593Smuzhiyun #define iopgprot_val(x) ((x).iopgprot) 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun #define __pte(x) ((pte_t) { (x) } ) 72*4882a593Smuzhiyun #define __pmd(x) ((pmd_t) { { (x) }, }) 73*4882a593Smuzhiyun #define __iopte(x) ((iopte_t) { (x) } ) 74*4882a593Smuzhiyun #define __pgd(x) ((pgd_t) { (x) } ) 75*4882a593Smuzhiyun #define __ctxd(x) ((ctxd_t) { (x) } ) 76*4882a593Smuzhiyun #define __pgprot(x) ((pgprot_t) { (x) } ) 77*4882a593Smuzhiyun #define __iopgprot(x) ((iopgprot_t) { (x) } ) 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun #else 80*4882a593Smuzhiyun /* 81*4882a593Smuzhiyun * .. while these make it easier on the compiler 82*4882a593Smuzhiyun */ 83*4882a593Smuzhiyun typedef unsigned long pte_t; 84*4882a593Smuzhiyun typedef unsigned long iopte_t; 85*4882a593Smuzhiyun typedef unsigned long pmd_t; 86*4882a593Smuzhiyun typedef unsigned long pgd_t; 87*4882a593Smuzhiyun typedef unsigned long ctxd_t; 88*4882a593Smuzhiyun typedef unsigned long pgprot_t; 89*4882a593Smuzhiyun typedef unsigned long iopgprot_t; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun #define pte_val(x) (x) 92*4882a593Smuzhiyun #define iopte_val(x) (x) 93*4882a593Smuzhiyun #define pmd_val(x) (x) 94*4882a593Smuzhiyun #define pgd_val(x) (x) 95*4882a593Smuzhiyun #define ctxd_val(x) (x) 96*4882a593Smuzhiyun #define pgprot_val(x) (x) 97*4882a593Smuzhiyun #define iopgprot_val(x) (x) 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun #define __pte(x) (x) 100*4882a593Smuzhiyun #define __pmd(x) (x) 101*4882a593Smuzhiyun #define __iopte(x) (x) 102*4882a593Smuzhiyun #define __pgd(x) (x) 103*4882a593Smuzhiyun #define __ctxd(x) (x) 104*4882a593Smuzhiyun #define __pgprot(x) (x) 105*4882a593Smuzhiyun #define __iopgprot(x) (x) 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun #endif 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun typedef pte_t *pgtable_t; 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun #define TASK_UNMAPPED_BASE 0x50000000 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun #else /* !(__ASSEMBLY__) */ 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun #define __pgprot(x) (x) 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun #endif /* !(__ASSEMBLY__) */ 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun #define PAGE_OFFSET 0xf0000000 120*4882a593Smuzhiyun #ifndef __ASSEMBLY__ 121*4882a593Smuzhiyun extern unsigned long phys_base; 122*4882a593Smuzhiyun extern unsigned long pfn_base; 123*4882a593Smuzhiyun #endif 124*4882a593Smuzhiyun #define __pa(x) ((unsigned long)(x) - PAGE_OFFSET + phys_base) 125*4882a593Smuzhiyun #define __va(x) ((void *)((unsigned long) (x) - phys_base + PAGE_OFFSET)) 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun #define virt_to_phys __pa 128*4882a593Smuzhiyun #define phys_to_virt __va 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun #define ARCH_PFN_OFFSET (pfn_base) 131*4882a593Smuzhiyun #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun #define pfn_valid(pfn) (((pfn) >= (pfn_base)) && (((pfn)-(pfn_base)) < max_mapnr)) 134*4882a593Smuzhiyun #define virt_addr_valid(kaddr) ((((unsigned long)(kaddr)-PAGE_OFFSET)>>PAGE_SHIFT) < max_mapnr) 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun #include <asm-generic/memory_model.h> 137*4882a593Smuzhiyun #include <asm-generic/getorder.h> 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun #endif /* _SPARC_PAGE_H */ 140