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