Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
0004  */
0005 #ifndef __ASM_ARC_PAGE_H
0006 #define __ASM_ARC_PAGE_H
0007 
0008 #include <uapi/asm/page.h>
0009 
0010 #ifdef CONFIG_ARC_HAS_PAE40
0011 
0012 #define MAX_POSSIBLE_PHYSMEM_BITS   40
0013 #define PAGE_MASK_PHYS          (0xff00000000ull | PAGE_MASK)
0014 
0015 #else /* CONFIG_ARC_HAS_PAE40 */
0016 
0017 #define MAX_POSSIBLE_PHYSMEM_BITS   32
0018 #define PAGE_MASK_PHYS          PAGE_MASK
0019 
0020 #endif /* CONFIG_ARC_HAS_PAE40 */
0021 
0022 #ifndef __ASSEMBLY__
0023 
0024 #define clear_page(paddr)       memset((paddr), 0, PAGE_SIZE)
0025 #define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
0026 #define copy_page(to, from)     memcpy((to), (from), PAGE_SIZE)
0027 
0028 struct vm_area_struct;
0029 struct page;
0030 
0031 #define __HAVE_ARCH_COPY_USER_HIGHPAGE
0032 
0033 void copy_user_highpage(struct page *to, struct page *from,
0034             unsigned long u_vaddr, struct vm_area_struct *vma);
0035 void clear_user_page(void *to, unsigned long u_vaddr, struct page *page);
0036 
0037 typedef struct {
0038     unsigned long pgd;
0039 } pgd_t;
0040 
0041 #define pgd_val(x)  ((x).pgd)
0042 #define __pgd(x)    ((pgd_t) { (x) })
0043 
0044 #if CONFIG_PGTABLE_LEVELS > 3
0045 
0046 typedef struct {
0047     unsigned long pud;
0048 } pud_t;
0049 
0050 #define pud_val(x)          ((x).pud)
0051 #define __pud(x)            ((pud_t) { (x) })
0052 
0053 #endif
0054 
0055 #if CONFIG_PGTABLE_LEVELS > 2
0056 
0057 typedef struct {
0058     unsigned long pmd;
0059 } pmd_t;
0060 
0061 #define pmd_val(x)  ((x).pmd)
0062 #define __pmd(x)    ((pmd_t) { (x) })
0063 
0064 #endif
0065 
0066 typedef struct {
0067 #ifdef CONFIG_ARC_HAS_PAE40
0068     unsigned long long pte;
0069 #else
0070     unsigned long pte;
0071 #endif
0072 } pte_t;
0073 
0074 #define pte_val(x)  ((x).pte)
0075 #define __pte(x)    ((pte_t) { (x) })
0076 
0077 typedef struct {
0078     unsigned long pgprot;
0079 } pgprot_t;
0080 
0081 #define pgprot_val(x)   ((x).pgprot)
0082 #define __pgprot(x) ((pgprot_t) { (x) })
0083 #define pte_pgprot(x)   __pgprot(pte_val(x))
0084 
0085 typedef struct page *pgtable_t;
0086 
0087 /*
0088  * Use virt_to_pfn with caution:
0089  * If used in pte or paddr related macros, it could cause truncation
0090  * in PAE40 builds
0091  * As a rule of thumb, only use it in helpers starting with virt_
0092  * You have been warned !
0093  */
0094 #define virt_to_pfn(kaddr)  (__pa(kaddr) >> PAGE_SHIFT)
0095 
0096 /*
0097  * When HIGHMEM is enabled we have holes in the memory map so we need
0098  * pfn_valid() that takes into account the actual extents of the physical
0099  * memory
0100  */
0101 #ifdef CONFIG_HIGHMEM
0102 
0103 extern unsigned long arch_pfn_offset;
0104 #define ARCH_PFN_OFFSET     arch_pfn_offset
0105 
0106 extern int pfn_valid(unsigned long pfn);
0107 #define pfn_valid       pfn_valid
0108 
0109 #else /* CONFIG_HIGHMEM */
0110 
0111 #define ARCH_PFN_OFFSET     virt_to_pfn(CONFIG_LINUX_RAM_BASE)
0112 #define pfn_valid(pfn)      (((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
0113 
0114 #endif /* CONFIG_HIGHMEM */
0115 
0116 /*
0117  * __pa, __va, virt_to_page (ALERT: deprecated, don't use them)
0118  *
0119  * These macros have historically been misnamed
0120  * virt here means link-address/program-address as embedded in object code.
0121  * And for ARC, link-addr = physical address
0122  */
0123 #define __pa(vaddr)         ((unsigned long)(vaddr))
0124 #define __va(paddr)         ((void *)((unsigned long)(paddr)))
0125 
0126 #define virt_to_page(kaddr) pfn_to_page(virt_to_pfn(kaddr))
0127 #define virt_addr_valid(kaddr)  pfn_valid(virt_to_pfn(kaddr))
0128 
0129 /* Default Permissions for stack/heaps pages (Non Executable) */
0130 #define VM_DATA_DEFAULT_FLAGS   VM_DATA_FLAGS_NON_EXEC
0131 
0132 #define WANT_PAGE_VIRTUAL   1
0133 
0134 #include <asm-generic/memory_model.h>   /* page_to_pfn, pfn_to_page */
0135 #include <asm-generic/getorder.h>
0136 
0137 #endif /* !__ASSEMBLY__ */
0138 
0139 #endif