Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * page.h:  Various defines and such for MMU operations on the Sparc for
0004  *          the Linux kernel.
0005  *
0006  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
0007  */
0008 
0009 #ifndef _SPARC_PAGE_H
0010 #define _SPARC_PAGE_H
0011 
0012 #include <linux/const.h>
0013 
0014 #define PAGE_SHIFT   12
0015 #define PAGE_SIZE    (_AC(1, UL) << PAGE_SHIFT)
0016 #define PAGE_MASK    (~(PAGE_SIZE-1))
0017 
0018 #ifndef __ASSEMBLY__
0019 
0020 #define clear_page(page)     memset((void *)(page), 0, PAGE_SIZE)
0021 #define copy_page(to,from)  memcpy((void *)(to), (void *)(from), PAGE_SIZE)
0022 #define clear_user_page(addr, vaddr, page)  \
0023     do {    clear_page(addr);       \
0024         sparc_flush_page_to_ram(page);  \
0025     } while (0)
0026 #define copy_user_page(to, from, vaddr, page)   \
0027     do {    copy_page(to, from);        \
0028         sparc_flush_page_to_ram(page);  \
0029     } while (0)
0030 
0031 /* The following structure is used to hold the physical
0032  * memory configuration of the machine.  This is filled in
0033  * prom_meminit() and is later used by mem_init() to set up
0034  * mem_map[].  We statically allocate SPARC_PHYS_BANKS+1 of
0035  * these structs, this is arbitrary.  The entry after the
0036  * last valid one has num_bytes==0.
0037  */
0038 struct sparc_phys_banks {
0039   unsigned long base_addr;
0040   unsigned long num_bytes;
0041 };
0042 
0043 #define SPARC_PHYS_BANKS 32
0044 
0045 extern struct sparc_phys_banks sp_banks[SPARC_PHYS_BANKS+1];
0046 
0047 /* passing structs on the Sparc slow us down tremendously... */
0048 
0049 /* #define STRICT_MM_TYPECHECKS */
0050 
0051 #ifdef STRICT_MM_TYPECHECKS
0052 /*
0053  * These are used to make use of C type-checking..
0054  */
0055 typedef struct { unsigned long pte; } pte_t;
0056 typedef struct { unsigned long iopte; } iopte_t;
0057 typedef struct { unsigned long pmd; } pmd_t;
0058 typedef struct { unsigned long pgd; } pgd_t;
0059 typedef struct { unsigned long ctxd; } ctxd_t;
0060 typedef struct { unsigned long pgprot; } pgprot_t;
0061 typedef struct { unsigned long iopgprot; } iopgprot_t;
0062 
0063 #define pte_val(x)  ((x).pte)
0064 #define iopte_val(x)    ((x).iopte)
0065 #define pmd_val(x)      ((x).pmd)
0066 #define pgd_val(x)  ((x).pgd)
0067 #define ctxd_val(x) ((x).ctxd)
0068 #define pgprot_val(x)   ((x).pgprot)
0069 #define iopgprot_val(x) ((x).iopgprot)
0070 
0071 #define __pte(x)    ((pte_t) { (x) } )
0072 #define __pmd(x)    ((pmd_t) { { (x) }, })
0073 #define __iopte(x)  ((iopte_t) { (x) } )
0074 #define __pgd(x)    ((pgd_t) { (x) } )
0075 #define __ctxd(x)   ((ctxd_t) { (x) } )
0076 #define __pgprot(x) ((pgprot_t) { (x) } )
0077 #define __iopgprot(x)   ((iopgprot_t) { (x) } )
0078 
0079 #else
0080 /*
0081  * .. while these make it easier on the compiler
0082  */
0083 typedef unsigned long pte_t;
0084 typedef unsigned long iopte_t;
0085 typedef unsigned long pmd_t;
0086 typedef unsigned long pgd_t;
0087 typedef unsigned long ctxd_t;
0088 typedef unsigned long pgprot_t;
0089 typedef unsigned long iopgprot_t;
0090 
0091 #define pte_val(x)  (x)
0092 #define iopte_val(x)    (x)
0093 #define pmd_val(x)      (x)
0094 #define pgd_val(x)  (x)
0095 #define ctxd_val(x) (x)
0096 #define pgprot_val(x)   (x)
0097 #define iopgprot_val(x) (x)
0098 
0099 #define __pte(x)    (x)
0100 #define __pmd(x)    (x)
0101 #define __iopte(x)  (x)
0102 #define __pgd(x)    (x)
0103 #define __ctxd(x)   (x)
0104 #define __pgprot(x) (x)
0105 #define __iopgprot(x)   (x)
0106 
0107 #endif
0108 
0109 typedef pte_t *pgtable_t;
0110 
0111 #define TASK_UNMAPPED_BASE  0x50000000
0112 
0113 #else /* !(__ASSEMBLY__) */
0114 
0115 #define __pgprot(x) (x)
0116 
0117 #endif /* !(__ASSEMBLY__) */
0118 
0119 #define PAGE_OFFSET 0xf0000000
0120 #ifndef __ASSEMBLY__
0121 extern unsigned long phys_base;
0122 extern unsigned long pfn_base;
0123 #endif
0124 #define __pa(x)         ((unsigned long)(x) - PAGE_OFFSET + phys_base)
0125 #define __va(x)         ((void *)((unsigned long) (x) - phys_base + PAGE_OFFSET))
0126 
0127 #define virt_to_phys        __pa
0128 #define phys_to_virt        __va
0129 
0130 #define ARCH_PFN_OFFSET     (pfn_base)
0131 #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
0132 
0133 #define pfn_valid(pfn)      (((pfn) >= (pfn_base)) && (((pfn)-(pfn_base)) < max_mapnr))
0134 #define virt_addr_valid(kaddr)  ((((unsigned long)(kaddr)-PAGE_OFFSET)>>PAGE_SHIFT) < max_mapnr)
0135 
0136 #include <asm-generic/memory_model.h>
0137 #include <asm-generic/getorder.h>
0138 
0139 #endif /* _SPARC_PAGE_H */