xref: /OK3568_Linux_fs/kernel/arch/nios2/include/asm/page.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2011 Tobias Klauser <tklauser@distanz.ch>
3*4882a593Smuzhiyun  * Copyright (C) 2004 Microtronix Datacom Ltd.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * MMU support based on asm/page.h from mips which is:
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Copyright (C) 1994 - 1999, 2000, 03 Ralf Baechle
8*4882a593Smuzhiyun  * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * This file is subject to the terms and conditions of the GNU General Public
11*4882a593Smuzhiyun  * License.  See the file "COPYING" in the main directory of this archive
12*4882a593Smuzhiyun  * for more details.
13*4882a593Smuzhiyun  */
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #ifndef _ASM_NIOS2_PAGE_H
16*4882a593Smuzhiyun #define _ASM_NIOS2_PAGE_H
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #include <linux/pfn.h>
19*4882a593Smuzhiyun #include <linux/const.h>
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun /*
22*4882a593Smuzhiyun  * PAGE_SHIFT determines the page size
23*4882a593Smuzhiyun  */
24*4882a593Smuzhiyun #define PAGE_SHIFT	12
25*4882a593Smuzhiyun #define PAGE_SIZE	(_AC(1, UL) << PAGE_SHIFT)
26*4882a593Smuzhiyun #define PAGE_MASK	(~(PAGE_SIZE - 1))
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun /*
29*4882a593Smuzhiyun  * PAGE_OFFSET -- the first address of the first page of memory.
30*4882a593Smuzhiyun  */
31*4882a593Smuzhiyun #define PAGE_OFFSET	\
32*4882a593Smuzhiyun 	(CONFIG_NIOS2_MEM_BASE + CONFIG_NIOS2_KERNEL_REGION_BASE)
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #ifndef __ASSEMBLY__
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /*
37*4882a593Smuzhiyun  * This gives the physical RAM offset.
38*4882a593Smuzhiyun  */
39*4882a593Smuzhiyun #define PHYS_OFFSET		CONFIG_NIOS2_MEM_BASE
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun /*
42*4882a593Smuzhiyun  * It's normally defined only for FLATMEM config but it's
43*4882a593Smuzhiyun  * used in our early mem init code for all memory models.
44*4882a593Smuzhiyun  * So always define it.
45*4882a593Smuzhiyun  */
46*4882a593Smuzhiyun #define ARCH_PFN_OFFSET		PFN_UP(PHYS_OFFSET)
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun #define clear_page(page)	memset((page), 0, PAGE_SIZE)
49*4882a593Smuzhiyun #define copy_page(to, from)	memcpy((to), (from), PAGE_SIZE)
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun struct page;
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun extern void clear_user_page(void *addr, unsigned long vaddr, struct page *page);
54*4882a593Smuzhiyun extern void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
55*4882a593Smuzhiyun 				struct page *to);
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun /*
58*4882a593Smuzhiyun  * These are used to make use of C type-checking.
59*4882a593Smuzhiyun  */
60*4882a593Smuzhiyun typedef struct page *pgtable_t;
61*4882a593Smuzhiyun typedef struct { unsigned long pte; } pte_t;
62*4882a593Smuzhiyun typedef struct { unsigned long pgd; } pgd_t;
63*4882a593Smuzhiyun typedef struct { unsigned long pgprot; } pgprot_t;
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun #define pte_val(x)	((x).pte)
66*4882a593Smuzhiyun #define pgd_val(x)	((x).pgd)
67*4882a593Smuzhiyun #define pgprot_val(x)	((x).pgprot)
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun #define __pte(x)	((pte_t) { (x) })
70*4882a593Smuzhiyun #define __pgd(x)	((pgd_t) { (x) })
71*4882a593Smuzhiyun #define __pgprot(x)	((pgprot_t) { (x) })
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun extern unsigned long memory_start;
74*4882a593Smuzhiyun extern unsigned long memory_end;
75*4882a593Smuzhiyun extern unsigned long memory_size;
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun extern struct page *mem_map;
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun # define __pa(x)		\
80*4882a593Smuzhiyun 	((unsigned long)(x) - PAGE_OFFSET + PHYS_OFFSET)
81*4882a593Smuzhiyun # define __va(x)		\
82*4882a593Smuzhiyun 	((void *)((unsigned long)(x) + PAGE_OFFSET - PHYS_OFFSET))
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun #define page_to_virt(page)	\
85*4882a593Smuzhiyun 	((void *)(((page) - mem_map) << PAGE_SHIFT) + PAGE_OFFSET)
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun # define pfn_to_kaddr(pfn)	__va((pfn) << PAGE_SHIFT)
88*4882a593Smuzhiyun 
pfn_valid(unsigned long pfn)89*4882a593Smuzhiyun static inline bool pfn_valid(unsigned long pfn)
90*4882a593Smuzhiyun {
91*4882a593Smuzhiyun 	/* avoid <linux/mm.h> include hell */
92*4882a593Smuzhiyun 	extern unsigned long max_mapnr;
93*4882a593Smuzhiyun 	unsigned long pfn_offset = ARCH_PFN_OFFSET;
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun 	return pfn >= pfn_offset && pfn < max_mapnr;
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun # define virt_to_page(vaddr)	pfn_to_page(PFN_DOWN(virt_to_phys(vaddr)))
99*4882a593Smuzhiyun # define virt_addr_valid(vaddr)	pfn_valid(PFN_DOWN(virt_to_phys(vaddr)))
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun # define VM_DATA_DEFAULT_FLAGS	VM_DATA_FLAGS_NON_EXEC
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun #include <asm-generic/memory_model.h>
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun #include <asm-generic/getorder.h>
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun #endif /* !__ASSEMBLY__ */
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun #endif /* _ASM_NIOS2_PAGE_H */
110