summaryrefslogtreecommitdiffstats
path: root/include/asm-sparc/page.h
blob: b014e1739a98d8d2abb07a85c3c0ef95206fcfa7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
/* $Id: page.h,v 1.43 1998/05/11 08:40:11 davem Exp $
 * page.h:  Various defines and such for MMU operations on the Sparc for
 *          the Linux kernel.
 *
 * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
 */

#ifndef _SPARC_PAGE_H
#define _SPARC_PAGE_H

#include <linux/config.h>
#ifdef CONFIG_SUN4
#define PAGE_SHIFT   13
#else
#define PAGE_SHIFT   12
#endif
#define PAGE_SIZE    (1 << PAGE_SHIFT)
#define PAGE_MASK    (~(PAGE_SIZE-1))

#ifdef __KERNEL__

#include <linux/config.h>
#include <asm/head.h>       /* for KERNBASE */
#include <asm/btfixup.h>

/* This is always 2048*sizeof(long), doesn't change with PAGE_SIZE */
#define TASK_UNION_SIZE		8192

#ifndef __ASSEMBLY__

#define BUG() do { printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); *(int *)0=0; } while (0)
#define PAGE_BUG(page) do { \
				BUG(); } while (0)

#define clear_page(page)	memset((void *)(page), 0, PAGE_SIZE)
#define copy_page(to,from)	memcpy((void *)(to), (void *)(from), PAGE_SIZE)

extern unsigned long page_offset;

BTFIXUPDEF_SETHI_INIT(page_offset,0xf0000000)

#ifdef MODULE
#define 	PAGE_OFFSET  (page_offset)
#else
#define		PAGE_OFFSET  BTFIXUP_SETHI(page_offset)
#endif

/* translate between physical and virtual addresses */
BTFIXUPDEF_CALL_CONST(unsigned long, mmu_v2p, unsigned long)
BTFIXUPDEF_CALL_CONST(unsigned long, mmu_p2v, unsigned long)

#define mmu_v2p(vaddr) BTFIXUP_CALL(mmu_v2p)(vaddr)
#define mmu_p2v(paddr) BTFIXUP_CALL(mmu_p2v)(paddr)

#define __pa(x)    (mmu_v2p((unsigned long)(x)))
#define __va(x)    ((void *)(mmu_p2v((unsigned long)(x))))

/* The following structure is used to hold the physical
 * memory configuration of the machine.  This is filled in
 * probe_memory() and is later used by mem_init() to set up
 * mem_map[].  We statically allocate SPARC_PHYS_BANKS of
 * these structs, this is arbitrary.  The entry after the
 * last valid one has num_bytes==0.
 */

struct sparc_phys_banks {
  unsigned long base_addr;
  unsigned long num_bytes;
};

#define SPARC_PHYS_BANKS 32

extern struct sparc_phys_banks sp_banks[SPARC_PHYS_BANKS];

/* Cache alias structure.  Entry is valid if context != -1. */
struct cache_palias {
	unsigned long vaddr;
	int context;
};

extern struct cache_palias *sparc_aliases;

/* passing structs on the Sparc slow us down tremendously... */

/* #define STRICT_MM_TYPECHECKS */

#ifdef STRICT_MM_TYPECHECKS
/*
 * These are used to make use of C type-checking..
 */
typedef struct { unsigned long pte; } pte_t;
typedef struct { unsigned long iopte; } iopte_t;
typedef struct { unsigned long pmd; } pmd_t;
typedef struct { unsigned long pgd; } pgd_t;
typedef struct { unsigned long ctxd; } ctxd_t;
typedef struct { unsigned long pgprot; } pgprot_t;
typedef struct { unsigned long iopgprot; } iopgprot_t;

#define pte_val(x)	((x).pte)
#define iopte_val(x)	((x).iopte)
#define pmd_val(x)      ((x).pmd)
#define pgd_val(x)	((x).pgd)
#define ctxd_val(x)	((x).ctxd)
#define pgprot_val(x)	((x).pgprot)
#define iopgprot_val(x)	((x).iopgprot)

#define __pte(x)	((pte_t) { (x) } )
#define __iopte(x)	((iopte_t) { (x) } )
#define __pmd(x)        ((pmd_t) { (x) } )
#define __pgd(x)	((pgd_t) { (x) } )
#define __ctxd(x)	((ctxd_t) { (x) } )
#define __pgprot(x)	((pgprot_t) { (x) } )
#define __iopgprot(x)	((iopgprot_t) { (x) } )

#elif CONFIG_AP1000_DEBUG

typedef struct { unsigned long pte; } pte_t;
typedef struct { unsigned long iopte; } iopte_t;
typedef struct { unsigned long pmd; } pmd_t;
typedef struct { unsigned long pgd; } pgd_t;
typedef struct { unsigned long ctxd; } ctxd_t;
typedef struct { unsigned long pgprot; } pgprot_t;
typedef struct { unsigned long iopgprot; } iopgprot_t;

static inline unsigned long __get_val(unsigned long x)
{
	if ((x & 0xF0000000) == (8<<28))
		return x & 0x0FFFFFFF;
	return x;
}

static inline unsigned long __set_val(unsigned long x)
{
	if ((x & 0xF0000000) == (0<<28))
		return x | 0x80000000;
	return x;
}

#define __pte_val(x)	((x).pte)
#define __iopte_val(x)	((x).iopte)
#define __pmd_val(x)      ((x).pmd)
#define __pgd_val(x)	((x).pgd)
#define __ctxd_val(x)	((x).ctxd)
#define __pgprot_val(x)	((x).pgprot)
#define __iopgprot_val(x)	((x).iopgprot)

#define ___pte(x)	((pte_t) { (x) } )
#define ___iopte(x)	((iopte_t) { (x) } )
#define ___pmd(x)        ((pmd_t) { (x) } )
#define ___pgd(x)	((pgd_t) { (x) } )
#define ___ctxd(x)	((ctxd_t) { (x) } )
#define ___pgprot(x)	((pgprot_t) { (x) } )
#define ___iopgprot(x)	((iopgprot_t) { (x) } )


#define pte_val(x) __get_val(__pte_val(x))
#define iopte_val(x) __get_val(__iopte_val(x))
#define pmd_val(x) __get_val(__pmd_val(x))
#define pgd_val(x) __get_val(__pgd_val(x))
#define ctxd_val(x) __get_val(__ctxd_val(x))
#define pgprot_val(x) __get_val(__pgprot_val(x))
#define iopgprot_val(x) __get_val(__iopgprot_val(x))

#define __pte(x) ___pte(__set_val(x))
#define __iopte(x) ___iopte(__set_val(x))
#define __pmd(x) ___pmd(__set_val(x))
#define __pgd(x) ___pgd(__set_val(x))
#define __ctxd(x) ___ctxd(__set_val(x))
#define __pgprot(x) ___pgprot(x)
#define __iopgprot(x) ___iopgprot(__set_val(x))

#elif CONFIG_AP1000

typedef unsigned long pte_t;
typedef unsigned long iopte_t;
typedef unsigned long pmd_t;
typedef unsigned long pgd_t;
typedef unsigned long ctxd_t;
typedef unsigned long pgprot_t;
typedef unsigned long iopgprot_t;

static inline unsigned long __get_val(unsigned long x)
{
#if 0
	extern void ap_panic(char *fmt,...);
	if (x && (x & 0xF0000000) == 0) {
		ap_panic("get_val got 0x%x\n",x);
	}
#endif
	if ((x & 0xF0000000) == (8<<28))
		return x & 0x0FFFFFFF;
	return x;
}

static inline unsigned long __set_val(unsigned long x)
{
#if 0
	extern void ap_panic(char *fmt,...);
	if ((x & 0xF0000000) == (8<<28)) {
		ap_panic("set_val got 0x%x\n",x);
	}
#endif
	if ((x & 0xF0000000) == (0<<28))
		return x | 0x80000000;
	return x;
}

#define __pte_val(x)	(x)
#define __iopte_val(x)	(x)
#define __pmd_val(x)      (x)
#define __pgd_val(x)	(x)
#define __ctxd_val(x)	(x)
#define __pgprot_val(x)	(x)
#define __iopgprot_val(x)	(x)

#define ___pte(x)	((pte_t) { (x) } )
#define ___iopte(x)	((iopte_t) { (x) } )
#define ___pmd(x)        ((pmd_t) { (x) } )
#define ___pgd(x)	((pgd_t) { (x) } )
#define ___ctxd(x)	((ctxd_t) { (x) } )
#define ___pgprot(x)	((pgprot_t) { (x) } )
#define ___iopgprot(x)	((iopgprot_t) { (x) } )


#define pte_val(x) __get_val(__pte_val(x))
#define iopte_val(x) __get_val(__iopte_val(x))
#define pmd_val(x) __get_val(__pmd_val(x))
#define pgd_val(x) __get_val(__pgd_val(x))
#define ctxd_val(x) __get_val(__ctxd_val(x))
#define pgprot_val(x) __get_val(__pgprot_val(x))
#define iopgprot_val(x) __get_val(__iopgprot_val(x))

#define __pte(x) ___pte(__set_val(x))
#define __iopte(x) ___iopte(__set_val(x))
#define __pmd(x) ___pmd(__set_val(x))
#define __pgd(x) ___pgd(__set_val(x))
#define __ctxd(x) ___ctxd(__set_val(x))
#define __pgprot(x) ___pgprot(x)
#define __iopgprot(x) ___iopgprot(__set_val(x))

#else
/*
 * .. while these make it easier on the compiler
 */
typedef unsigned long pte_t;
typedef unsigned long iopte_t;
typedef unsigned long pmd_t;
typedef unsigned long pgd_t;
typedef unsigned long ctxd_t;
typedef unsigned long pgprot_t;
typedef unsigned long iopgprot_t;

#define pte_val(x)	(x)
#define iopte_val(x)	(x)
#define pmd_val(x)      (x)
#define pgd_val(x)	(x)
#define ctxd_val(x)	(x)
#define pgprot_val(x)	(x)
#define iopgprot_val(x)	(x)

#define __pte(x)	(x)
#define __iopte(x)	(x)
#define __pmd(x)        (x)
#define __pgd(x)	(x)
#define __ctxd(x)	(x)
#define __pgprot(x)	(x)
#define __iopgprot(x)	(x)

#endif

extern unsigned long sparc_unmapped_base;

BTFIXUPDEF_SETHI(sparc_unmapped_base)

#define TASK_UNMAPPED_BASE	BTFIXUP_SETHI(sparc_unmapped_base)

/* to align the pointer to the (next) page boundary */
#define PAGE_ALIGN(addr)  (((addr)+PAGE_SIZE-1)&PAGE_MASK)

/* Now, to allow for very large physical memory configurations we
 * place the page pool both above the kernel and below the kernel.
 */
#define MAP_NR(addr) ((((unsigned long) (addr)) - PAGE_OFFSET) >> PAGE_SHIFT)

#else /* !(__ASSEMBLY__) */

#define __pgprot(x)	(x)

#endif /* !(__ASSEMBLY__) */

#endif /* __KERNEL__ */

#endif /* _SPARC_PAGE_H */