1
2
3
4
5
6
7
8
9
10
11#ifndef _XTENSA_PAGE_H
12#define _XTENSA_PAGE_H
13
14#include <asm/processor.h>
15#include <asm/types.h>
16#include <asm/cache.h>
17#include <platform/hardware.h>
18#include <asm/kmem_layout.h>
19
20
21
22
23
24#define PAGE_SHIFT 12
25#define PAGE_SIZE (__XTENSA_UL_CONST(1) << PAGE_SHIFT)
26#define PAGE_MASK (~(PAGE_SIZE-1))
27
28#ifdef CONFIG_MMU
29#define PAGE_OFFSET XCHAL_KSEG_CACHED_VADDR
30#define PHYS_OFFSET XCHAL_KSEG_PADDR
31#define MAX_LOW_PFN (PHYS_PFN(XCHAL_KSEG_PADDR) + \
32 PHYS_PFN(XCHAL_KSEG_SIZE))
33#else
34#define PAGE_OFFSET PLATFORM_DEFAULT_MEM_START
35#define PHYS_OFFSET PLATFORM_DEFAULT_MEM_START
36#define MAX_LOW_PFN PHYS_PFN(0xfffffffful)
37#endif
38
39#define PGTABLE_START 0x80000000
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69#if DCACHE_WAY_SIZE > PAGE_SIZE
70# define DCACHE_ALIAS_ORDER (DCACHE_WAY_SHIFT - PAGE_SHIFT)
71# define DCACHE_ALIAS_MASK (PAGE_MASK & (DCACHE_WAY_SIZE - 1))
72# define DCACHE_ALIAS(a) (((a) & DCACHE_ALIAS_MASK) >> PAGE_SHIFT)
73# define DCACHE_ALIAS_EQ(a,b) ((((a) ^ (b)) & DCACHE_ALIAS_MASK) == 0)
74#else
75# define DCACHE_ALIAS_ORDER 0
76# define DCACHE_ALIAS(a) ((void)(a), 0)
77#endif
78#define DCACHE_N_COLORS (1 << DCACHE_ALIAS_ORDER)
79
80#if ICACHE_WAY_SIZE > PAGE_SIZE
81# define ICACHE_ALIAS_ORDER (ICACHE_WAY_SHIFT - PAGE_SHIFT)
82# define ICACHE_ALIAS_MASK (PAGE_MASK & (ICACHE_WAY_SIZE - 1))
83# define ICACHE_ALIAS(a) (((a) & ICACHE_ALIAS_MASK) >> PAGE_SHIFT)
84# define ICACHE_ALIAS_EQ(a,b) ((((a) ^ (b)) & ICACHE_ALIAS_MASK) == 0)
85#else
86# define ICACHE_ALIAS_ORDER 0
87#endif
88
89
90#ifdef __ASSEMBLY__
91
92#define __pgprot(x) (x)
93
94#else
95
96
97
98
99
100typedef struct { unsigned long pte; } pte_t;
101typedef struct { unsigned long pgd; } pgd_t;
102typedef struct { unsigned long pgprot; } pgprot_t;
103typedef struct page *pgtable_t;
104
105#define pte_val(x) ((x).pte)
106#define pgd_val(x) ((x).pgd)
107#define pgprot_val(x) ((x).pgprot)
108
109#define __pte(x) ((pte_t) { (x) } )
110#define __pgd(x) ((pgd_t) { (x) } )
111#define __pgprot(x) ((pgprot_t) { (x) } )
112
113
114
115
116
117
118#if XCHAL_HAVE_NSA
119
120static inline __attribute_const__ int get_order(unsigned long size)
121{
122 int lz;
123 asm ("nsau %0, %1" : "=r" (lz) : "r" ((size - 1) >> PAGE_SHIFT));
124 return 32 - lz;
125}
126
127#else
128
129# include <asm-generic/getorder.h>
130
131#endif
132
133struct page;
134struct vm_area_struct;
135extern void clear_page(void *page);
136extern void copy_page(void *to, void *from);
137
138
139
140
141
142
143#if defined(CONFIG_MMU) && DCACHE_WAY_SIZE > PAGE_SIZE
144extern void clear_page_alias(void *vaddr, unsigned long paddr);
145extern void copy_page_alias(void *to, void *from,
146 unsigned long to_paddr, unsigned long from_paddr);
147
148#define clear_user_highpage clear_user_highpage
149void clear_user_highpage(struct page *page, unsigned long vaddr);
150#define __HAVE_ARCH_COPY_USER_HIGHPAGE
151void copy_user_highpage(struct page *to, struct page *from,
152 unsigned long vaddr, struct vm_area_struct *vma);
153#else
154# define clear_user_page(page, vaddr, pg) clear_page(page)
155# define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
156#endif
157
158
159
160
161
162
163
164
165#define ARCH_PFN_OFFSET (PHYS_OFFSET >> PAGE_SHIFT)
166
167#ifdef CONFIG_MMU
168static inline unsigned long ___pa(unsigned long va)
169{
170 unsigned long off = va - PAGE_OFFSET;
171
172 if (off >= XCHAL_KSEG_SIZE)
173 off -= XCHAL_KSEG_SIZE;
174
175 return off + PHYS_OFFSET;
176}
177#define __pa(x) ___pa((unsigned long)(x))
178#else
179#define __pa(x) \
180 ((unsigned long) (x) - PAGE_OFFSET + PHYS_OFFSET)
181#endif
182#define __va(x) \
183 ((void *)((unsigned long) (x) - PHYS_OFFSET + PAGE_OFFSET))
184#define pfn_valid(pfn) \
185 ((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
186
187#ifdef CONFIG_DISCONTIGMEM
188# error CONFIG_DISCONTIGMEM not supported
189#endif
190
191#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
192#define page_to_virt(page) __va(page_to_pfn(page) << PAGE_SHIFT)
193#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
194#define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT)
195
196#endif
197
198#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \
199 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
200
201#include <asm-generic/memory_model.h>
202#endif
203