1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2deae26bfSKyle McMartin #ifndef _PARISC_PAGE_H 3deae26bfSKyle McMartin #define _PARISC_PAGE_H 4deae26bfSKyle McMartin 5deae26bfSKyle McMartin #include <linux/const.h> 6deae26bfSKyle McMartin 7deae26bfSKyle McMartin #if defined(CONFIG_PARISC_PAGE_SIZE_4KB) 8deae26bfSKyle McMartin # define PAGE_SHIFT 12 9deae26bfSKyle McMartin #elif defined(CONFIG_PARISC_PAGE_SIZE_16KB) 10deae26bfSKyle McMartin # define PAGE_SHIFT 14 11deae26bfSKyle McMartin #elif defined(CONFIG_PARISC_PAGE_SIZE_64KB) 12deae26bfSKyle McMartin # define PAGE_SHIFT 16 13deae26bfSKyle McMartin #else 14deae26bfSKyle McMartin # error "unknown default kernel page size" 15deae26bfSKyle McMartin #endif 16deae26bfSKyle McMartin #define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) 17deae26bfSKyle McMartin #define PAGE_MASK (~(PAGE_SIZE-1)) 18deae26bfSKyle McMartin 19*6de4da0fSHelge Deller #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA 20deae26bfSKyle McMartin 21deae26bfSKyle McMartin #ifndef __ASSEMBLY__ 22deae26bfSKyle McMartin 23deae26bfSKyle McMartin #include <asm/types.h> 24deae26bfSKyle McMartin #include <asm/cache.h> 25deae26bfSKyle McMartin 2676334539SJohn David Anglin #define clear_page(page) clear_page_asm((void *)(page)) 2776334539SJohn David Anglin #define copy_page(to, from) copy_page_asm((void *)(to), (void *)(from)) 28deae26bfSKyle McMartin 29deae26bfSKyle McMartin struct page; 302de8b4ccSJohn David Anglin struct vm_area_struct; 31deae26bfSKyle McMartin 3276334539SJohn David Anglin void clear_page_asm(void *page); 3376334539SJohn David Anglin void copy_page_asm(void *to, void *from); 34f8dae006SJohn David Anglin #define clear_user_page(vto, vaddr, page) clear_page_asm(vto) 352de8b4ccSJohn David Anglin void copy_user_highpage(struct page *to, struct page *from, unsigned long vaddr, 362de8b4ccSJohn David Anglin struct vm_area_struct *vma); 372de8b4ccSJohn David Anglin #define __HAVE_ARCH_COPY_USER_HIGHPAGE 3876334539SJohn David Anglin 39deae26bfSKyle McMartin /* 40deae26bfSKyle McMartin * These are used to make use of C type-checking.. 41deae26bfSKyle McMartin */ 42deae26bfSKyle McMartin #define STRICT_MM_TYPECHECKS 43deae26bfSKyle McMartin #ifdef STRICT_MM_TYPECHECKS 4448d27cb2SHelge Deller typedef struct { unsigned long pte; } pte_t; /* either 32 or 64bit */ 45deae26bfSKyle McMartin 46deae26bfSKyle McMartin /* NOTE: even on 64 bits, these entries are __u32 because we allocate 47deae26bfSKyle McMartin * the pmd and pgd in ZONE_DMA (i.e. under 4GB) */ 48deae26bfSKyle McMartin typedef struct { __u32 pgd; } pgd_t; 49deae26bfSKyle McMartin typedef struct { unsigned long pgprot; } pgprot_t; 50deae26bfSKyle McMartin 51d96885e2SMike Rapoport #if CONFIG_PGTABLE_LEVELS == 3 52d96885e2SMike Rapoport typedef struct { __u32 pmd; } pmd_t; 53d96885e2SMike Rapoport #define __pmd(x) ((pmd_t) { (x) } ) 54d96885e2SMike Rapoport /* pXd_val() do not work as lvalues, so make sure we don't use them as such. */ 55deae26bfSKyle McMartin #define pmd_val(x) ((x).pmd + 0) 56d96885e2SMike Rapoport #endif 57d96885e2SMike Rapoport 58d96885e2SMike Rapoport #define pte_val(x) ((x).pte) 59deae26bfSKyle McMartin #define pgd_val(x) ((x).pgd + 0) 60deae26bfSKyle McMartin #define pgprot_val(x) ((x).pgprot) 61deae26bfSKyle McMartin 62deae26bfSKyle McMartin #define __pte(x) ((pte_t) { (x) } ) 63deae26bfSKyle McMartin #define __pgd(x) ((pgd_t) { (x) } ) 64deae26bfSKyle McMartin #define __pgprot(x) ((pgprot_t) { (x) } ) 65deae26bfSKyle McMartin 66deae26bfSKyle McMartin #else 67deae26bfSKyle McMartin /* 68deae26bfSKyle McMartin * .. while these make it easier on the compiler 69deae26bfSKyle McMartin */ 70deae26bfSKyle McMartin typedef unsigned long pte_t; 71d96885e2SMike Rapoport 72d96885e2SMike Rapoport #if CONFIG_PGTABLE_LEVELS == 3 73deae26bfSKyle McMartin typedef __u32 pmd_t; 74d96885e2SMike Rapoport #define pmd_val(x) (x) 75d96885e2SMike Rapoport #define __pmd(x) (x) 76d96885e2SMike Rapoport #endif 77d96885e2SMike Rapoport 78deae26bfSKyle McMartin typedef __u32 pgd_t; 79deae26bfSKyle McMartin typedef unsigned long pgprot_t; 80deae26bfSKyle McMartin 81deae26bfSKyle McMartin #define pte_val(x) (x) 82deae26bfSKyle McMartin #define pgd_val(x) (x) 83deae26bfSKyle McMartin #define pgprot_val(x) (x) 84deae26bfSKyle McMartin 85deae26bfSKyle McMartin #define __pte(x) (x) 86deae26bfSKyle McMartin #define __pgd(x) (x) 87deae26bfSKyle McMartin #define __pgprot(x) (x) 88deae26bfSKyle McMartin 89deae26bfSKyle McMartin #endif /* STRICT_MM_TYPECHECKS */ 90deae26bfSKyle McMartin 91d96885e2SMike Rapoport #define set_pmd(pmdptr, pmdval) (*(pmdptr) = (pmdval)) 92d96885e2SMike Rapoport #if CONFIG_PGTABLE_LEVELS == 3 93d96885e2SMike Rapoport #define set_pud(pudptr, pudval) (*(pudptr) = (pudval)) 94d96885e2SMike Rapoport #endif 95d96885e2SMike Rapoport 96deae26bfSKyle McMartin typedef struct page *pgtable_t; 97deae26bfSKyle McMartin 98deae26bfSKyle McMartin typedef struct __physmem_range { 99deae26bfSKyle McMartin unsigned long start_pfn; 100deae26bfSKyle McMartin unsigned long pages; /* PAGE_SIZE pages */ 101deae26bfSKyle McMartin } physmem_range_t; 102deae26bfSKyle McMartin 103deae26bfSKyle McMartin extern physmem_range_t pmem_ranges[]; 104deae26bfSKyle McMartin extern int npmem_ranges; 105deae26bfSKyle McMartin 106deae26bfSKyle McMartin #endif /* !__ASSEMBLY__ */ 107deae26bfSKyle McMartin 108deae26bfSKyle McMartin /* WARNING: The definitions below must match exactly to sizeof(pte_t) 109deae26bfSKyle McMartin * etc 110deae26bfSKyle McMartin */ 111deae26bfSKyle McMartin #ifdef CONFIG_64BIT 112deae26bfSKyle McMartin #define BITS_PER_PTE_ENTRY 3 113deae26bfSKyle McMartin #define BITS_PER_PMD_ENTRY 2 114deae26bfSKyle McMartin #define BITS_PER_PGD_ENTRY 2 115deae26bfSKyle McMartin #else 11648d27cb2SHelge Deller #define BITS_PER_PTE_ENTRY 2 117deae26bfSKyle McMartin #define BITS_PER_PMD_ENTRY 2 118b7795074SHelge Deller #define BITS_PER_PGD_ENTRY 2 119deae26bfSKyle McMartin #endif 120deae26bfSKyle McMartin #define PGD_ENTRY_SIZE (1UL << BITS_PER_PGD_ENTRY) 121deae26bfSKyle McMartin #define PMD_ENTRY_SIZE (1UL << BITS_PER_PMD_ENTRY) 122deae26bfSKyle McMartin #define PTE_ENTRY_SIZE (1UL << BITS_PER_PTE_ENTRY) 123deae26bfSKyle McMartin 124deae26bfSKyle McMartin #define LINUX_GATEWAY_SPACE 0 125deae26bfSKyle McMartin 126deae26bfSKyle McMartin /* This governs the relationship between virtual and physical addresses. 127deae26bfSKyle McMartin * If you alter it, make sure to take care of our various fixed mapping 128deae26bfSKyle McMartin * segments in fixmap.h */ 12934c201aeSHelge Deller #ifdef CONFIG_64BIT 13034c201aeSHelge Deller #define __PAGE_OFFSET_DEFAULT (0x40000000) /* 1GB */ 13134c201aeSHelge Deller #else 13234c201aeSHelge Deller #define __PAGE_OFFSET_DEFAULT (0x10000000) /* 256MB */ 13334c201aeSHelge Deller #endif 13434c201aeSHelge Deller 135f5213b2cSHelge Deller #if defined(BOOTLOADER) 136f5213b2cSHelge Deller #define __PAGE_OFFSET (0) /* bootloader uses physical addresses */ 137f5213b2cSHelge Deller #else 13834c201aeSHelge Deller #define __PAGE_OFFSET __PAGE_OFFSET_DEFAULT 139f5213b2cSHelge Deller #endif /* BOOTLOADER */ 140deae26bfSKyle McMartin 141deae26bfSKyle McMartin #define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET) 142deae26bfSKyle McMartin 143deae26bfSKyle McMartin /* The size of the gateway page (we leave lots of room for expansion) */ 144deae26bfSKyle McMartin #define GATEWAY_PAGE_SIZE 0x4000 145deae26bfSKyle McMartin 146deae26bfSKyle McMartin /* The start of the actual kernel binary---used in vmlinux.lds.S 147deae26bfSKyle McMartin * Leave some space after __PAGE_OFFSET for detecting kernel null 148deae26bfSKyle McMartin * ptr derefs */ 149deae26bfSKyle McMartin #define KERNEL_BINARY_TEXT_START (__PAGE_OFFSET + 0x100000) 150deae26bfSKyle McMartin 151deae26bfSKyle McMartin /* These macros don't work for 64-bit C code -- don't allow in C at all */ 152deae26bfSKyle McMartin #ifdef __ASSEMBLY__ 153deae26bfSKyle McMartin # define PA(x) ((x)-__PAGE_OFFSET) 154deae26bfSKyle McMartin # define VA(x) ((x)+__PAGE_OFFSET) 155deae26bfSKyle McMartin #endif 156deae26bfSKyle McMartin #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) 157deae26bfSKyle McMartin #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) 158deae26bfSKyle McMartin 159deae26bfSKyle McMartin #ifdef CONFIG_HUGETLB_PAGE 1601f25ad26SHelge Deller #define HPAGE_SHIFT PMD_SHIFT /* fixed for transparent huge pages */ 161deae26bfSKyle McMartin #define HPAGE_SIZE ((1UL) << HPAGE_SHIFT) 162deae26bfSKyle McMartin #define HPAGE_MASK (~(HPAGE_SIZE - 1)) 163deae26bfSKyle McMartin #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) 1641f25ad26SHelge Deller 1651f25ad26SHelge Deller #if defined(CONFIG_64BIT) && defined(CONFIG_PARISC_PAGE_SIZE_4KB) 1661f25ad26SHelge Deller # define REAL_HPAGE_SHIFT 20 /* 20 = 1MB */ 1671f25ad26SHelge Deller # define _HUGE_PAGE_SIZE_ENCODING_DEFAULT _PAGE_SIZE_ENCODING_1M 1681f25ad26SHelge Deller #elif !defined(CONFIG_64BIT) && defined(CONFIG_PARISC_PAGE_SIZE_4KB) 1691f25ad26SHelge Deller # define REAL_HPAGE_SHIFT 22 /* 22 = 4MB */ 1701f25ad26SHelge Deller # define _HUGE_PAGE_SIZE_ENCODING_DEFAULT _PAGE_SIZE_ENCODING_4M 1711f25ad26SHelge Deller #else 1721f25ad26SHelge Deller # define REAL_HPAGE_SHIFT 24 /* 24 = 16MB */ 1731f25ad26SHelge Deller # define _HUGE_PAGE_SIZE_ENCODING_DEFAULT _PAGE_SIZE_ENCODING_16M 174deae26bfSKyle McMartin #endif 1751f25ad26SHelge Deller #endif /* CONFIG_HUGETLB_PAGE */ 176deae26bfSKyle McMartin 177deae26bfSKyle McMartin #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) 178deae26bfSKyle McMartin 179deae26bfSKyle McMartin #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) 180deae26bfSKyle McMartin #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) 181deae26bfSKyle McMartin 182deae26bfSKyle McMartin #include <asm-generic/memory_model.h> 1835b17e1cdSArnd Bergmann #include <asm-generic/getorder.h> 1844a8a0788SRolf Eike Beer #include <asm/pdc.h> 1854a8a0788SRolf Eike Beer 18690cc7bedSHelge Deller #define PAGE0 ((struct zeropage *)absolute_pointer(__PAGE_OFFSET)) 1874a8a0788SRolf Eike Beer 1884a8a0788SRolf Eike Beer /* DEFINITION OF THE ZERO-PAGE (PAG0) */ 1894a8a0788SRolf Eike Beer /* based on work by Jason Eckhardt (jason@equator.com) */ 190deae26bfSKyle McMartin 191deae26bfSKyle McMartin #endif /* _PARISC_PAGE_H */ 192