diff options
Diffstat (limited to 'include/asm-frv')
106 files changed, 9217 insertions, 0 deletions
diff --git a/include/asm-frv/a.out.h b/include/asm-frv/a.out.h new file mode 100644 index 000000000000..dd3b7e5754c9 --- /dev/null +++ b/include/asm-frv/a.out.h | |||
@@ -0,0 +1,5 @@ | |||
1 | /* | ||
2 | * FRV doesn't do AOUT format. This header file should be removed as | ||
3 | * soon as fs/exec.c and fs/proc/kcore.c and the archs that require | ||
4 | * them to include linux/a.out.h are fixed. | ||
5 | */ | ||
diff --git a/include/asm-frv/atomic.h b/include/asm-frv/atomic.h new file mode 100644 index 000000000000..e75968463428 --- /dev/null +++ b/include/asm-frv/atomic.h | |||
@@ -0,0 +1,417 @@ | |||
1 | /* atomic.h: atomic operation emulation for FR-V | ||
2 | * | ||
3 | * For an explanation of how atomic ops work in this arch, see: | ||
4 | * Documentation/fujitsu/frv/atomic-ops.txt | ||
5 | * | ||
6 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
7 | * Written by David Howells (dhowells@redhat.com) | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or | ||
10 | * modify it under the terms of the GNU General Public License | ||
11 | * as published by the Free Software Foundation; either version | ||
12 | * 2 of the License, or (at your option) any later version. | ||
13 | */ | ||
14 | #ifndef _ASM_ATOMIC_H | ||
15 | #define _ASM_ATOMIC_H | ||
16 | |||
17 | #include <linux/config.h> | ||
18 | #include <linux/types.h> | ||
19 | #include <asm/spr-regs.h> | ||
20 | |||
21 | #ifdef CONFIG_SMP | ||
22 | #error not SMP safe | ||
23 | #endif | ||
24 | |||
25 | /* | ||
26 | * Atomic operations that C can't guarantee us. Useful for | ||
27 | * resource counting etc.. | ||
28 | * | ||
29 | * We do not have SMP systems, so we don't have to deal with that. | ||
30 | */ | ||
31 | |||
32 | /* Atomic operations are already serializing */ | ||
33 | #define smp_mb__before_atomic_dec() barrier() | ||
34 | #define smp_mb__after_atomic_dec() barrier() | ||
35 | #define smp_mb__before_atomic_inc() barrier() | ||
36 | #define smp_mb__after_atomic_inc() barrier() | ||
37 | |||
38 | typedef struct { | ||
39 | int counter; | ||
40 | } atomic_t; | ||
41 | |||
42 | #define ATOMIC_INIT(i) { (i) } | ||
43 | #define atomic_read(v) ((v)->counter) | ||
44 | #define atomic_set(v, i) (((v)->counter) = (i)) | ||
45 | |||
46 | #ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS | ||
47 | static inline int atomic_add_return(int i, atomic_t *v) | ||
48 | { | ||
49 | unsigned long val; | ||
50 | |||
51 | asm("0: \n" | ||
52 | " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */ | ||
53 | " ckeq icc3,cc7 \n" | ||
54 | " ld.p %M0,%1 \n" /* LD.P/ORCR must be atomic */ | ||
55 | " orcr cc7,cc7,cc3 \n" /* set CC3 to true */ | ||
56 | " add%I2 %1,%2,%1 \n" | ||
57 | " cst.p %1,%M0 ,cc3,#1 \n" | ||
58 | " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* clear ICC3.Z if store happens */ | ||
59 | " beq icc3,#0,0b \n" | ||
60 | : "+U"(v->counter), "=&r"(val) | ||
61 | : "NPr"(i) | ||
62 | : "memory", "cc7", "cc3", "icc3" | ||
63 | ); | ||
64 | |||
65 | return val; | ||
66 | } | ||
67 | |||
68 | static inline int atomic_sub_return(int i, atomic_t *v) | ||
69 | { | ||
70 | unsigned long val; | ||
71 | |||
72 | asm("0: \n" | ||
73 | " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */ | ||
74 | " ckeq icc3,cc7 \n" | ||
75 | " ld.p %M0,%1 \n" /* LD.P/ORCR must be atomic */ | ||
76 | " orcr cc7,cc7,cc3 \n" /* set CC3 to true */ | ||
77 | " sub%I2 %1,%2,%1 \n" | ||
78 | " cst.p %1,%M0 ,cc3,#1 \n" | ||
79 | " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* clear ICC3.Z if store happens */ | ||
80 | " beq icc3,#0,0b \n" | ||
81 | : "+U"(v->counter), "=&r"(val) | ||
82 | : "NPr"(i) | ||
83 | : "memory", "cc7", "cc3", "icc3" | ||
84 | ); | ||
85 | |||
86 | return val; | ||
87 | } | ||
88 | |||
89 | #else | ||
90 | |||
91 | extern int atomic_add_return(int i, atomic_t *v); | ||
92 | extern int atomic_sub_return(int i, atomic_t *v); | ||
93 | |||
94 | #endif | ||
95 | |||
96 | static inline int atomic_add_negative(int i, atomic_t *v) | ||
97 | { | ||
98 | return atomic_add_return(i, v) < 0; | ||
99 | } | ||
100 | |||
101 | static inline void atomic_add(int i, atomic_t *v) | ||
102 | { | ||
103 | atomic_add_return(i, v); | ||
104 | } | ||
105 | |||
106 | static inline void atomic_sub(int i, atomic_t *v) | ||
107 | { | ||
108 | atomic_sub_return(i, v); | ||
109 | } | ||
110 | |||
111 | static inline void atomic_inc(atomic_t *v) | ||
112 | { | ||
113 | atomic_add_return(1, v); | ||
114 | } | ||
115 | |||
116 | static inline void atomic_dec(atomic_t *v) | ||
117 | { | ||
118 | atomic_sub_return(1, v); | ||
119 | } | ||
120 | |||
121 | #define atomic_dec_return(v) atomic_sub_return(1, (v)) | ||
122 | #define atomic_inc_return(v) atomic_add_return(1, (v)) | ||
123 | |||
124 | #define atomic_sub_and_test(i,v) (atomic_sub_return((i), (v)) == 0) | ||
125 | #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) | ||
126 | #define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0) | ||
127 | |||
128 | #ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS | ||
129 | static inline | ||
130 | unsigned long atomic_test_and_ANDNOT_mask(unsigned long mask, volatile unsigned long *v) | ||
131 | { | ||
132 | unsigned long old, tmp; | ||
133 | |||
134 | asm volatile( | ||
135 | "0: \n" | ||
136 | " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */ | ||
137 | " ckeq icc3,cc7 \n" | ||
138 | " ld.p %M0,%1 \n" /* LD.P/ORCR are atomic */ | ||
139 | " orcr cc7,cc7,cc3 \n" /* set CC3 to true */ | ||
140 | " and%I3 %1,%3,%2 \n" | ||
141 | " cst.p %2,%M0 ,cc3,#1 \n" /* if store happens... */ | ||
142 | " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* ... clear ICC3.Z */ | ||
143 | " beq icc3,#0,0b \n" | ||
144 | : "+U"(*v), "=&r"(old), "=r"(tmp) | ||
145 | : "NPr"(~mask) | ||
146 | : "memory", "cc7", "cc3", "icc3" | ||
147 | ); | ||
148 | |||
149 | return old; | ||
150 | } | ||
151 | |||
152 | static inline | ||
153 | unsigned long atomic_test_and_OR_mask(unsigned long mask, volatile unsigned long *v) | ||
154 | { | ||
155 | unsigned long old, tmp; | ||
156 | |||
157 | asm volatile( | ||
158 | "0: \n" | ||
159 | " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */ | ||
160 | " ckeq icc3,cc7 \n" | ||
161 | " ld.p %M0,%1 \n" /* LD.P/ORCR are atomic */ | ||
162 | " orcr cc7,cc7,cc3 \n" /* set CC3 to true */ | ||
163 | " or%I3 %1,%3,%2 \n" | ||
164 | " cst.p %2,%M0 ,cc3,#1 \n" /* if store happens... */ | ||
165 | " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* ... clear ICC3.Z */ | ||
166 | " beq icc3,#0,0b \n" | ||
167 | : "+U"(*v), "=&r"(old), "=r"(tmp) | ||
168 | : "NPr"(mask) | ||
169 | : "memory", "cc7", "cc3", "icc3" | ||
170 | ); | ||
171 | |||
172 | return old; | ||
173 | } | ||
174 | |||
175 | static inline | ||
176 | unsigned long atomic_test_and_XOR_mask(unsigned long mask, volatile unsigned long *v) | ||
177 | { | ||
178 | unsigned long old, tmp; | ||
179 | |||
180 | asm volatile( | ||
181 | "0: \n" | ||
182 | " orcc gr0,gr0,gr0,icc3 \n" /* set ICC3.Z */ | ||
183 | " ckeq icc3,cc7 \n" | ||
184 | " ld.p %M0,%1 \n" /* LD.P/ORCR are atomic */ | ||
185 | " orcr cc7,cc7,cc3 \n" /* set CC3 to true */ | ||
186 | " xor%I3 %1,%3,%2 \n" | ||
187 | " cst.p %2,%M0 ,cc3,#1 \n" /* if store happens... */ | ||
188 | " corcc gr29,gr29,gr0 ,cc3,#1 \n" /* ... clear ICC3.Z */ | ||
189 | " beq icc3,#0,0b \n" | ||
190 | : "+U"(*v), "=&r"(old), "=r"(tmp) | ||
191 | : "NPr"(mask) | ||
192 | : "memory", "cc7", "cc3", "icc3" | ||
193 | ); | ||
194 | |||
195 | return old; | ||
196 | } | ||
197 | |||
198 | #else | ||
199 | |||
200 | extern unsigned long atomic_test_and_ANDNOT_mask(unsigned long mask, volatile unsigned long *v); | ||
201 | extern unsigned long atomic_test_and_OR_mask(unsigned long mask, volatile unsigned long *v); | ||
202 | extern unsigned long atomic_test_and_XOR_mask(unsigned long mask, volatile unsigned long *v); | ||
203 | |||
204 | #endif | ||
205 | |||
206 | #define atomic_clear_mask(mask, v) atomic_test_and_ANDNOT_mask((mask), (v)) | ||
207 | #define atomic_set_mask(mask, v) atomic_test_and_OR_mask((mask), (v)) | ||
208 | |||
209 | /*****************************************************************************/ | ||
210 | /* | ||
211 | * exchange value with memory | ||
212 | */ | ||
213 | #ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS | ||
214 | |||
215 | #define xchg(ptr, x) \ | ||
216 | ({ \ | ||
217 | __typeof__(ptr) __xg_ptr = (ptr); \ | ||
218 | __typeof__(*(ptr)) __xg_orig; \ | ||
219 | \ | ||
220 | switch (sizeof(__xg_orig)) { \ | ||
221 | case 1: \ | ||
222 | asm volatile( \ | ||
223 | "0: \n" \ | ||
224 | " orcc gr0,gr0,gr0,icc3 \n" \ | ||
225 | " ckeq icc3,cc7 \n" \ | ||
226 | " ldub.p %M0,%1 \n" \ | ||
227 | " orcr cc7,cc7,cc3 \n" \ | ||
228 | " cstb.p %2,%M0 ,cc3,#1 \n" \ | ||
229 | " corcc gr29,gr29,gr0 ,cc3,#1 \n" \ | ||
230 | " beq icc3,#0,0b \n" \ | ||
231 | : "+U"(*__xg_ptr), "=&r"(__xg_orig) \ | ||
232 | : "r"(x) \ | ||
233 | : "memory", "cc7", "cc3", "icc3" \ | ||
234 | ); \ | ||
235 | break; \ | ||
236 | \ | ||
237 | case 2: \ | ||
238 | asm volatile( \ | ||
239 | "0: \n" \ | ||
240 | " orcc gr0,gr0,gr0,icc3 \n" \ | ||
241 | " ckeq icc3,cc7 \n" \ | ||
242 | " lduh.p %M0,%1 \n" \ | ||
243 | " orcr cc7,cc7,cc3 \n" \ | ||
244 | " csth.p %2,%M0 ,cc3,#1 \n" \ | ||
245 | " corcc gr29,gr29,gr0 ,cc3,#1 \n" \ | ||
246 | " beq icc3,#0,0b \n" \ | ||
247 | : "+U"(*__xg_ptr), "=&r"(__xg_orig) \ | ||
248 | : "r"(x) \ | ||
249 | : "memory", "cc7", "cc3", "icc3" \ | ||
250 | ); \ | ||
251 | break; \ | ||
252 | \ | ||
253 | case 4: \ | ||
254 | asm volatile( \ | ||
255 | "0: \n" \ | ||
256 | " orcc gr0,gr0,gr0,icc3 \n" \ | ||
257 | " ckeq icc3,cc7 \n" \ | ||
258 | " ld.p %M0,%1 \n" \ | ||
259 | " orcr cc7,cc7,cc3 \n" \ | ||
260 | " cst.p %2,%M0 ,cc3,#1 \n" \ | ||
261 | " corcc gr29,gr29,gr0 ,cc3,#1 \n" \ | ||
262 | " beq icc3,#0,0b \n" \ | ||
263 | : "+U"(*__xg_ptr), "=&r"(__xg_orig) \ | ||
264 | : "r"(x) \ | ||
265 | : "memory", "cc7", "cc3", "icc3" \ | ||
266 | ); \ | ||
267 | break; \ | ||
268 | \ | ||
269 | default: \ | ||
270 | __xg_orig = 0; \ | ||
271 | asm volatile("break"); \ | ||
272 | break; \ | ||
273 | } \ | ||
274 | \ | ||
275 | __xg_orig; \ | ||
276 | }) | ||
277 | |||
278 | #else | ||
279 | |||
280 | extern uint8_t __xchg_8 (uint8_t i, volatile void *v); | ||
281 | extern uint16_t __xchg_16(uint16_t i, volatile void *v); | ||
282 | extern uint32_t __xchg_32(uint32_t i, volatile void *v); | ||
283 | |||
284 | #define xchg(ptr, x) \ | ||
285 | ({ \ | ||
286 | __typeof__(ptr) __xg_ptr = (ptr); \ | ||
287 | __typeof__(*(ptr)) __xg_orig; \ | ||
288 | \ | ||
289 | switch (sizeof(__xg_orig)) { \ | ||
290 | case 1: __xg_orig = (__typeof__(*(ptr))) __xchg_8 ((uint8_t) x, __xg_ptr); break; \ | ||
291 | case 2: __xg_orig = (__typeof__(*(ptr))) __xchg_16((uint16_t) x, __xg_ptr); break; \ | ||
292 | case 4: __xg_orig = (__typeof__(*(ptr))) __xchg_32((uint32_t) x, __xg_ptr); break; \ | ||
293 | default: \ | ||
294 | __xg_orig = 0; \ | ||
295 | asm volatile("break"); \ | ||
296 | break; \ | ||
297 | } \ | ||
298 | __xg_orig; \ | ||
299 | }) | ||
300 | |||
301 | #endif | ||
302 | |||
303 | #define tas(ptr) (xchg((ptr), 1)) | ||
304 | |||
305 | /*****************************************************************************/ | ||
306 | /* | ||
307 | * compare and conditionally exchange value with memory | ||
308 | * - if (*ptr == test) then orig = *ptr; *ptr = test; | ||
309 | * - if (*ptr != test) then orig = *ptr; | ||
310 | */ | ||
311 | #ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS | ||
312 | |||
313 | #define cmpxchg(ptr, test, new) \ | ||
314 | ({ \ | ||
315 | __typeof__(ptr) __xg_ptr = (ptr); \ | ||
316 | __typeof__(*(ptr)) __xg_orig, __xg_tmp; \ | ||
317 | __typeof__(*(ptr)) __xg_test = (test); \ | ||
318 | __typeof__(*(ptr)) __xg_new = (new); \ | ||
319 | \ | ||
320 | switch (sizeof(__xg_orig)) { \ | ||
321 | case 1: \ | ||
322 | asm volatile( \ | ||
323 | "0: \n" \ | ||
324 | " orcc gr0,gr0,gr0,icc3 \n" \ | ||
325 | " ckeq icc3,cc7 \n" \ | ||
326 | " ldub.p %M0,%1 \n" \ | ||
327 | " orcr cc7,cc7,cc3 \n" \ | ||
328 | " sub%I4 %1,%4,%2 \n" \ | ||
329 | " sllcc %2,#24,gr0,icc0 \n" \ | ||
330 | " bne icc0,#0,1f \n" \ | ||
331 | " cstb.p %3,%M0 ,cc3,#1 \n" \ | ||
332 | " corcc gr29,gr29,gr0 ,cc3,#1 \n" \ | ||
333 | " beq icc3,#0,0b \n" \ | ||
334 | "1: \n" \ | ||
335 | : "+U"(*__xg_ptr), "=&r"(__xg_orig), "=&r"(__xg_tmp) \ | ||
336 | : "r"(__xg_new), "NPr"(__xg_test) \ | ||
337 | : "memory", "cc7", "cc3", "icc3", "icc0" \ | ||
338 | ); \ | ||
339 | break; \ | ||
340 | \ | ||
341 | case 2: \ | ||
342 | asm volatile( \ | ||
343 | "0: \n" \ | ||
344 | " orcc gr0,gr0,gr0,icc3 \n" \ | ||
345 | " ckeq icc3,cc7 \n" \ | ||
346 | " lduh.p %M0,%1 \n" \ | ||
347 | " orcr cc7,cc7,cc3 \n" \ | ||
348 | " sub%I4 %1,%4,%2 \n" \ | ||
349 | " sllcc %2,#16,gr0,icc0 \n" \ | ||
350 | " bne icc0,#0,1f \n" \ | ||
351 | " csth.p %3,%M0 ,cc3,#1 \n" \ | ||
352 | " corcc gr29,gr29,gr0 ,cc3,#1 \n" \ | ||
353 | " beq icc3,#0,0b \n" \ | ||
354 | "1: \n" \ | ||
355 | : "+U"(*__xg_ptr), "=&r"(__xg_orig), "=&r"(__xg_tmp) \ | ||
356 | : "r"(__xg_new), "NPr"(__xg_test) \ | ||
357 | : "memory", "cc7", "cc3", "icc3", "icc0" \ | ||
358 | ); \ | ||
359 | break; \ | ||
360 | \ | ||
361 | case 4: \ | ||
362 | asm volatile( \ | ||
363 | "0: \n" \ | ||
364 | " orcc gr0,gr0,gr0,icc3 \n" \ | ||
365 | " ckeq icc3,cc7 \n" \ | ||
366 | " ld.p %M0,%1 \n" \ | ||
367 | " orcr cc7,cc7,cc3 \n" \ | ||
368 | " sub%I4cc %1,%4,%2,icc0 \n" \ | ||
369 | " bne icc0,#0,1f \n" \ | ||
370 | " cst.p %3,%M0 ,cc3,#1 \n" \ | ||
371 | " corcc gr29,gr29,gr0 ,cc3,#1 \n" \ | ||
372 | " beq icc3,#0,0b \n" \ | ||
373 | "1: \n" \ | ||
374 | : "+U"(*__xg_ptr), "=&r"(__xg_orig), "=&r"(__xg_tmp) \ | ||
375 | : "r"(__xg_new), "NPr"(__xg_test) \ | ||
376 | : "memory", "cc7", "cc3", "icc3", "icc0" \ | ||
377 | ); \ | ||
378 | break; \ | ||
379 | \ | ||
380 | default: \ | ||
381 | __xg_orig = 0; \ | ||
382 | asm volatile("break"); \ | ||
383 | break; \ | ||
384 | } \ | ||
385 | \ | ||
386 | __xg_orig; \ | ||
387 | }) | ||
388 | |||
389 | #else | ||
390 | |||
391 | extern uint8_t __cmpxchg_8 (uint8_t *v, uint8_t test, uint8_t new); | ||
392 | extern uint16_t __cmpxchg_16(uint16_t *v, uint16_t test, uint16_t new); | ||
393 | extern uint32_t __cmpxchg_32(uint32_t *v, uint32_t test, uint32_t new); | ||
394 | |||
395 | #define cmpxchg(ptr, test, new) \ | ||
396 | ({ \ | ||
397 | __typeof__(ptr) __xg_ptr = (ptr); \ | ||
398 | __typeof__(*(ptr)) __xg_orig; \ | ||
399 | __typeof__(*(ptr)) __xg_test = (test); \ | ||
400 | __typeof__(*(ptr)) __xg_new = (new); \ | ||
401 | \ | ||
402 | switch (sizeof(__xg_orig)) { \ | ||
403 | case 1: __xg_orig = __cmpxchg_8 (__xg_ptr, __xg_test, __xg_new); break; \ | ||
404 | case 2: __xg_orig = __cmpxchg_16(__xg_ptr, __xg_test, __xg_new); break; \ | ||
405 | case 4: __xg_orig = __cmpxchg_32(__xg_ptr, __xg_test, __xg_new); break; \ | ||
406 | default: \ | ||
407 | __xg_orig = 0; \ | ||
408 | asm volatile("break"); \ | ||
409 | break; \ | ||
410 | } \ | ||
411 | \ | ||
412 | __xg_orig; \ | ||
413 | }) | ||
414 | |||
415 | #endif | ||
416 | |||
417 | #endif /* _ASM_ATOMIC_H */ | ||
diff --git a/include/asm-frv/ax88796.h b/include/asm-frv/ax88796.h new file mode 100644 index 000000000000..637e980393c5 --- /dev/null +++ b/include/asm-frv/ax88796.h | |||
@@ -0,0 +1,22 @@ | |||
1 | /* ax88796.h: access points to the driver for the AX88796 NE2000 clone | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_AX88796_H | ||
13 | #define _ASM_AX88796_H | ||
14 | |||
15 | #include <asm/mb-regs.h> | ||
16 | |||
17 | #define AX88796_IOADDR (__region_CS1 + 0x200) | ||
18 | #define AX88796_IRQ IRQ_CPU_EXTERNAL7 | ||
19 | #define AX88796_FULL_DUPLEX 0 /* force full duplex */ | ||
20 | #define AX88796_BUS_INFO "CS1#+0x200" /* bus info for ethtool */ | ||
21 | |||
22 | #endif /* _ASM_AX88796_H */ | ||
diff --git a/include/asm-frv/bitops.h b/include/asm-frv/bitops.h new file mode 100644 index 000000000000..b664bd5b6663 --- /dev/null +++ b/include/asm-frv/bitops.h | |||
@@ -0,0 +1,341 @@ | |||
1 | /* bitops.h: bit operations for the Fujitsu FR-V CPUs | ||
2 | * | ||
3 | * For an explanation of how atomic ops work in this arch, see: | ||
4 | * Documentation/fujitsu/frv/atomic-ops.txt | ||
5 | * | ||
6 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
7 | * Written by David Howells (dhowells@redhat.com) | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or | ||
10 | * modify it under the terms of the GNU General Public License | ||
11 | * as published by the Free Software Foundation; either version | ||
12 | * 2 of the License, or (at your option) any later version. | ||
13 | */ | ||
14 | #ifndef _ASM_BITOPS_H | ||
15 | #define _ASM_BITOPS_H | ||
16 | |||
17 | #include <linux/config.h> | ||
18 | #include <linux/compiler.h> | ||
19 | #include <asm/byteorder.h> | ||
20 | #include <asm/system.h> | ||
21 | #include <asm/atomic.h> | ||
22 | |||
23 | #ifdef __KERNEL__ | ||
24 | |||
25 | /* | ||
26 | * ffz = Find First Zero in word. Undefined if no zero exists, | ||
27 | * so code should check against ~0UL first.. | ||
28 | */ | ||
29 | static inline unsigned long ffz(unsigned long word) | ||
30 | { | ||
31 | unsigned long result = 0; | ||
32 | |||
33 | while (word & 1) { | ||
34 | result++; | ||
35 | word >>= 1; | ||
36 | } | ||
37 | return result; | ||
38 | } | ||
39 | |||
40 | /* | ||
41 | * clear_bit() doesn't provide any barrier for the compiler. | ||
42 | */ | ||
43 | #define smp_mb__before_clear_bit() barrier() | ||
44 | #define smp_mb__after_clear_bit() barrier() | ||
45 | |||
46 | static inline int test_and_clear_bit(int nr, volatile void *addr) | ||
47 | { | ||
48 | volatile unsigned long *ptr = addr; | ||
49 | unsigned long mask = 1UL << (nr & 31); | ||
50 | ptr += nr >> 5; | ||
51 | return (atomic_test_and_ANDNOT_mask(mask, ptr) & mask) != 0; | ||
52 | } | ||
53 | |||
54 | static inline int test_and_set_bit(int nr, volatile void *addr) | ||
55 | { | ||
56 | volatile unsigned long *ptr = addr; | ||
57 | unsigned long mask = 1UL << (nr & 31); | ||
58 | ptr += nr >> 5; | ||
59 | return (atomic_test_and_OR_mask(mask, ptr) & mask) != 0; | ||
60 | } | ||
61 | |||
62 | static inline int test_and_change_bit(int nr, volatile void *addr) | ||
63 | { | ||
64 | volatile unsigned long *ptr = addr; | ||
65 | unsigned long mask = 1UL << (nr & 31); | ||
66 | ptr += nr >> 5; | ||
67 | return (atomic_test_and_XOR_mask(mask, ptr) & mask) != 0; | ||
68 | } | ||
69 | |||
70 | static inline void clear_bit(int nr, volatile void *addr) | ||
71 | { | ||
72 | test_and_clear_bit(nr, addr); | ||
73 | } | ||
74 | |||
75 | static inline void set_bit(int nr, volatile void *addr) | ||
76 | { | ||
77 | test_and_set_bit(nr, addr); | ||
78 | } | ||
79 | |||
80 | static inline void change_bit(int nr, volatile void * addr) | ||
81 | { | ||
82 | test_and_change_bit(nr, addr); | ||
83 | } | ||
84 | |||
85 | static inline void __clear_bit(int nr, volatile void * addr) | ||
86 | { | ||
87 | volatile unsigned long *a = addr; | ||
88 | int mask; | ||
89 | |||
90 | a += nr >> 5; | ||
91 | mask = 1 << (nr & 31); | ||
92 | *a &= ~mask; | ||
93 | } | ||
94 | |||
95 | static inline void __set_bit(int nr, volatile void * addr) | ||
96 | { | ||
97 | volatile unsigned long *a = addr; | ||
98 | int mask; | ||
99 | |||
100 | a += nr >> 5; | ||
101 | mask = 1 << (nr & 31); | ||
102 | *a |= mask; | ||
103 | } | ||
104 | |||
105 | static inline void __change_bit(int nr, volatile void *addr) | ||
106 | { | ||
107 | volatile unsigned long *a = addr; | ||
108 | int mask; | ||
109 | |||
110 | a += nr >> 5; | ||
111 | mask = 1 << (nr & 31); | ||
112 | *a ^= mask; | ||
113 | } | ||
114 | |||
115 | static inline int __test_and_clear_bit(int nr, volatile void * addr) | ||
116 | { | ||
117 | volatile unsigned long *a = addr; | ||
118 | int mask, retval; | ||
119 | |||
120 | a += nr >> 5; | ||
121 | mask = 1 << (nr & 31); | ||
122 | retval = (mask & *a) != 0; | ||
123 | *a &= ~mask; | ||
124 | return retval; | ||
125 | } | ||
126 | |||
127 | static inline int __test_and_set_bit(int nr, volatile void * addr) | ||
128 | { | ||
129 | volatile unsigned long *a = addr; | ||
130 | int mask, retval; | ||
131 | |||
132 | a += nr >> 5; | ||
133 | mask = 1 << (nr & 31); | ||
134 | retval = (mask & *a) != 0; | ||
135 | *a |= mask; | ||
136 | return retval; | ||
137 | } | ||
138 | |||
139 | static inline int __test_and_change_bit(int nr, volatile void * addr) | ||
140 | { | ||
141 | volatile unsigned long *a = addr; | ||
142 | int mask, retval; | ||
143 | |||
144 | a += nr >> 5; | ||
145 | mask = 1 << (nr & 31); | ||
146 | retval = (mask & *a) != 0; | ||
147 | *a ^= mask; | ||
148 | return retval; | ||
149 | } | ||
150 | |||
151 | /* | ||
152 | * This routine doesn't need to be atomic. | ||
153 | */ | ||
154 | static inline int __constant_test_bit(int nr, const volatile void * addr) | ||
155 | { | ||
156 | return ((1UL << (nr & 31)) & (((const volatile unsigned int *) addr)[nr >> 5])) != 0; | ||
157 | } | ||
158 | |||
159 | static inline int __test_bit(int nr, const volatile void * addr) | ||
160 | { | ||
161 | int * a = (int *) addr; | ||
162 | int mask; | ||
163 | |||
164 | a += nr >> 5; | ||
165 | mask = 1 << (nr & 0x1f); | ||
166 | return ((mask & *a) != 0); | ||
167 | } | ||
168 | |||
169 | #define test_bit(nr,addr) \ | ||
170 | (__builtin_constant_p(nr) ? \ | ||
171 | __constant_test_bit((nr),(addr)) : \ | ||
172 | __test_bit((nr),(addr))) | ||
173 | |||
174 | extern int find_next_bit(const unsigned long *addr, int size, int offset); | ||
175 | |||
176 | #define find_first_bit(addr, size) find_next_bit(addr, size, 0) | ||
177 | |||
178 | #define find_first_zero_bit(addr, size) \ | ||
179 | find_next_zero_bit((addr), (size), 0) | ||
180 | |||
181 | static inline int find_next_zero_bit(const void *addr, int size, int offset) | ||
182 | { | ||
183 | const unsigned long *p = ((const unsigned long *) addr) + (offset >> 5); | ||
184 | unsigned long result = offset & ~31UL; | ||
185 | unsigned long tmp; | ||
186 | |||
187 | if (offset >= size) | ||
188 | return size; | ||
189 | size -= result; | ||
190 | offset &= 31UL; | ||
191 | if (offset) { | ||
192 | tmp = *(p++); | ||
193 | tmp |= ~0UL >> (32-offset); | ||
194 | if (size < 32) | ||
195 | goto found_first; | ||
196 | if (~tmp) | ||
197 | goto found_middle; | ||
198 | size -= 32; | ||
199 | result += 32; | ||
200 | } | ||
201 | while (size & ~31UL) { | ||
202 | if (~(tmp = *(p++))) | ||
203 | goto found_middle; | ||
204 | result += 32; | ||
205 | size -= 32; | ||
206 | } | ||
207 | if (!size) | ||
208 | return result; | ||
209 | tmp = *p; | ||
210 | |||
211 | found_first: | ||
212 | tmp |= ~0UL >> size; | ||
213 | found_middle: | ||
214 | return result + ffz(tmp); | ||
215 | } | ||
216 | |||
217 | #define ffs(x) generic_ffs(x) | ||
218 | #define __ffs(x) (ffs(x) - 1) | ||
219 | |||
220 | /* | ||
221 | * fls: find last bit set. | ||
222 | */ | ||
223 | #define fls(x) \ | ||
224 | ({ \ | ||
225 | int bit; \ | ||
226 | \ | ||
227 | asm("scan %1,gr0,%0" : "=r"(bit) : "r"(x)); \ | ||
228 | \ | ||
229 | bit ? 33 - bit : bit; \ | ||
230 | }) | ||
231 | |||
232 | /* | ||
233 | * Every architecture must define this function. It's the fastest | ||
234 | * way of searching a 140-bit bitmap where the first 100 bits are | ||
235 | * unlikely to be set. It's guaranteed that at least one of the 140 | ||
236 | * bits is cleared. | ||
237 | */ | ||
238 | static inline int sched_find_first_bit(const unsigned long *b) | ||
239 | { | ||
240 | if (unlikely(b[0])) | ||
241 | return __ffs(b[0]); | ||
242 | if (unlikely(b[1])) | ||
243 | return __ffs(b[1]) + 32; | ||
244 | if (unlikely(b[2])) | ||
245 | return __ffs(b[2]) + 64; | ||
246 | if (b[3]) | ||
247 | return __ffs(b[3]) + 96; | ||
248 | return __ffs(b[4]) + 128; | ||
249 | } | ||
250 | |||
251 | |||
252 | /* | ||
253 | * hweightN: returns the hamming weight (i.e. the number | ||
254 | * of bits set) of a N-bit word | ||
255 | */ | ||
256 | |||
257 | #define hweight32(x) generic_hweight32(x) | ||
258 | #define hweight16(x) generic_hweight16(x) | ||
259 | #define hweight8(x) generic_hweight8(x) | ||
260 | |||
261 | #define ext2_set_bit(nr, addr) test_and_set_bit ((nr) ^ 0x18, (addr)) | ||
262 | #define ext2_clear_bit(nr, addr) test_and_clear_bit((nr) ^ 0x18, (addr)) | ||
263 | |||
264 | #define ext2_set_bit_atomic(lock,nr,addr) ext2_set_bit((nr), addr) | ||
265 | #define ext2_clear_bit_atomic(lock,nr,addr) ext2_clear_bit((nr), addr) | ||
266 | |||
267 | static inline int ext2_test_bit(int nr, const volatile void * addr) | ||
268 | { | ||
269 | const volatile unsigned char *ADDR = (const unsigned char *) addr; | ||
270 | int mask; | ||
271 | |||
272 | ADDR += nr >> 3; | ||
273 | mask = 1 << (nr & 0x07); | ||
274 | return ((mask & *ADDR) != 0); | ||
275 | } | ||
276 | |||
277 | #define ext2_find_first_zero_bit(addr, size) \ | ||
278 | ext2_find_next_zero_bit((addr), (size), 0) | ||
279 | |||
280 | static inline unsigned long ext2_find_next_zero_bit(const void *addr, | ||
281 | unsigned long size, | ||
282 | unsigned long offset) | ||
283 | { | ||
284 | const unsigned long *p = ((const unsigned long *) addr) + (offset >> 5); | ||
285 | unsigned long result = offset & ~31UL; | ||
286 | unsigned long tmp; | ||
287 | |||
288 | if (offset >= size) | ||
289 | return size; | ||
290 | size -= result; | ||
291 | offset &= 31UL; | ||
292 | if(offset) { | ||
293 | /* We hold the little endian value in tmp, but then the | ||
294 | * shift is illegal. So we could keep a big endian value | ||
295 | * in tmp, like this: | ||
296 | * | ||
297 | * tmp = __swab32(*(p++)); | ||
298 | * tmp |= ~0UL >> (32-offset); | ||
299 | * | ||
300 | * but this would decrease preformance, so we change the | ||
301 | * shift: | ||
302 | */ | ||
303 | tmp = *(p++); | ||
304 | tmp |= __swab32(~0UL >> (32-offset)); | ||
305 | if(size < 32) | ||
306 | goto found_first; | ||
307 | if(~tmp) | ||
308 | goto found_middle; | ||
309 | size -= 32; | ||
310 | result += 32; | ||
311 | } | ||
312 | while(size & ~31UL) { | ||
313 | if(~(tmp = *(p++))) | ||
314 | goto found_middle; | ||
315 | result += 32; | ||
316 | size -= 32; | ||
317 | } | ||
318 | if(!size) | ||
319 | return result; | ||
320 | tmp = *p; | ||
321 | |||
322 | found_first: | ||
323 | /* tmp is little endian, so we would have to swab the shift, | ||
324 | * see above. But then we have to swab tmp below for ffz, so | ||
325 | * we might as well do this here. | ||
326 | */ | ||
327 | return result + ffz(__swab32(tmp) | (~0UL << size)); | ||
328 | found_middle: | ||
329 | return result + ffz(__swab32(tmp)); | ||
330 | } | ||
331 | |||
332 | /* Bitmap functions for the minix filesystem. */ | ||
333 | #define minix_test_and_set_bit(nr,addr) ext2_set_bit(nr,addr) | ||
334 | #define minix_set_bit(nr,addr) ext2_set_bit(nr,addr) | ||
335 | #define minix_test_and_clear_bit(nr,addr) ext2_clear_bit(nr,addr) | ||
336 | #define minix_test_bit(nr,addr) ext2_test_bit(nr,addr) | ||
337 | #define minix_find_first_zero_bit(addr,size) ext2_find_first_zero_bit(addr,size) | ||
338 | |||
339 | #endif /* __KERNEL__ */ | ||
340 | |||
341 | #endif /* _ASM_BITOPS_H */ | ||
diff --git a/include/asm-frv/bug.h b/include/asm-frv/bug.h new file mode 100644 index 000000000000..011860b28818 --- /dev/null +++ b/include/asm-frv/bug.h | |||
@@ -0,0 +1,51 @@ | |||
1 | /* bug.h: FRV bug trapping | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | #ifndef _ASM_BUG_H | ||
12 | #define _ASM_BUG_H | ||
13 | |||
14 | #include <linux/config.h> | ||
15 | |||
16 | /* | ||
17 | * Tell the user there is some problem. | ||
18 | */ | ||
19 | extern asmlinkage void __debug_bug_trap(int signr); | ||
20 | |||
21 | #ifdef CONFIG_NO_KERNEL_MSG | ||
22 | #define _debug_bug_printk() | ||
23 | #else | ||
24 | extern void __debug_bug_printk(const char *file, unsigned line); | ||
25 | #define _debug_bug_printk() __debug_bug_printk(__FILE__, __LINE__) | ||
26 | #endif | ||
27 | |||
28 | #define _debug_bug_trap(signr) \ | ||
29 | do { \ | ||
30 | __debug_bug_trap(signr); \ | ||
31 | asm volatile("nop"); \ | ||
32 | } while(0) | ||
33 | |||
34 | #define HAVE_ARCH_BUG | ||
35 | #define BUG() \ | ||
36 | do { \ | ||
37 | _debug_bug_printk(); \ | ||
38 | _debug_bug_trap(6 /*SIGABRT*/); \ | ||
39 | } while (0) | ||
40 | |||
41 | #ifdef CONFIG_GDBSTUB | ||
42 | #define HAVE_ARCH_KGDB_RAISE | ||
43 | #define kgdb_raise(signr) do { _debug_bug_trap(signr); } while(0) | ||
44 | |||
45 | #define HAVE_ARCH_KGDB_BAD_PAGE | ||
46 | #define kgdb_bad_page(page) do { kgdb_raise(SIGABRT); } while(0) | ||
47 | #endif | ||
48 | |||
49 | #include <asm-generic/bug.h> | ||
50 | |||
51 | #endif | ||
diff --git a/include/asm-frv/bugs.h b/include/asm-frv/bugs.h new file mode 100644 index 000000000000..f2382be2b46c --- /dev/null +++ b/include/asm-frv/bugs.h | |||
@@ -0,0 +1,14 @@ | |||
1 | /* bugs.h: arch bug checking entry | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | static inline void check_bugs(void) | ||
13 | { | ||
14 | } | ||
diff --git a/include/asm-frv/busctl-regs.h b/include/asm-frv/busctl-regs.h new file mode 100644 index 000000000000..bb0ff4816e27 --- /dev/null +++ b/include/asm-frv/busctl-regs.h | |||
@@ -0,0 +1,41 @@ | |||
1 | /* busctl-regs.h: FR400-series CPU bus controller registers | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_BUSCTL_REGS_H | ||
13 | #define _ASM_BUSCTL_REGS_H | ||
14 | |||
15 | /* bus controller registers */ | ||
16 | #define __get_LGCR() ({ *(volatile unsigned long *)(0xfe000010); }) | ||
17 | #define __get_LMAICR() ({ *(volatile unsigned long *)(0xfe000030); }) | ||
18 | #define __get_LEMBR() ({ *(volatile unsigned long *)(0xfe000040); }) | ||
19 | #define __get_LEMAM() ({ *(volatile unsigned long *)(0xfe000048); }) | ||
20 | #define __get_LCR(R) ({ *(volatile unsigned long *)(0xfe000100 + 8*(R)); }) | ||
21 | #define __get_LSBR(R) ({ *(volatile unsigned long *)(0xfe000c00 + 8*(R)); }) | ||
22 | #define __get_LSAM(R) ({ *(volatile unsigned long *)(0xfe000d00 + 8*(R)); }) | ||
23 | |||
24 | #define __set_LGCR(V) do { *(volatile unsigned long *)(0xfe000010) = (V); } while(0) | ||
25 | #define __set_LMAICR(V) do { *(volatile unsigned long *)(0xfe000030) = (V); } while(0) | ||
26 | #define __set_LEMBR(V) do { *(volatile unsigned long *)(0xfe000040) = (V); } while(0) | ||
27 | #define __set_LEMAM(V) do { *(volatile unsigned long *)(0xfe000048) = (V); } while(0) | ||
28 | #define __set_LCR(R,V) do { *(volatile unsigned long *)(0xfe000100 + 8*(R)) = (V); } while(0) | ||
29 | #define __set_LSBR(R,V) do { *(volatile unsigned long *)(0xfe000c00 + 8*(R)) = (V); } while(0) | ||
30 | #define __set_LSAM(R,V) do { *(volatile unsigned long *)(0xfe000d00 + 8*(R)) = (V); } while(0) | ||
31 | |||
32 | /* FR401 SDRAM controller registers */ | ||
33 | #define __get_DBR(R) ({ *(volatile unsigned long *)(0xfe000e00 + 8*(R)); }) | ||
34 | #define __get_DAM(R) ({ *(volatile unsigned long *)(0xfe000f00 + 8*(R)); }) | ||
35 | |||
36 | /* FR551 SDRAM controller registers */ | ||
37 | #define __get_DARS(R) ({ *(volatile unsigned long *)(0xfeff0100 + 8*(R)); }) | ||
38 | #define __get_DAMK(R) ({ *(volatile unsigned long *)(0xfeff0110 + 8*(R)); }) | ||
39 | |||
40 | |||
41 | #endif /* _ASM_BUSCTL_REGS_H */ | ||
diff --git a/include/asm-frv/byteorder.h b/include/asm-frv/byteorder.h new file mode 100644 index 000000000000..411bec3cc1fc --- /dev/null +++ b/include/asm-frv/byteorder.h | |||
@@ -0,0 +1,13 @@ | |||
1 | #ifndef _ASM_BYTEORDER_H | ||
2 | #define _ASM_BYTEORDER_H | ||
3 | |||
4 | #include <asm/types.h> | ||
5 | |||
6 | #if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__) | ||
7 | # define __BYTEORDER_HAS_U64__ | ||
8 | # define __SWAB_64_THRU_32__ | ||
9 | #endif | ||
10 | |||
11 | #include <linux/byteorder/big_endian.h> | ||
12 | |||
13 | #endif /* _ASM_BYTEORDER_H */ | ||
diff --git a/include/asm-frv/cache.h b/include/asm-frv/cache.h new file mode 100644 index 000000000000..cf69b6373b34 --- /dev/null +++ b/include/asm-frv/cache.h | |||
@@ -0,0 +1,24 @@ | |||
1 | /* cache.h: FRV cache definitions | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef __ASM_CACHE_H | ||
13 | #define __ASM_CACHE_H | ||
14 | |||
15 | #include <linux/config.h> | ||
16 | |||
17 | /* bytes per L1 cache line */ | ||
18 | #define L1_CACHE_SHIFT (CONFIG_FRV_L1_CACHE_SHIFT) | ||
19 | #define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) | ||
20 | |||
21 | #define __cacheline_aligned __attribute__((aligned(L1_CACHE_BYTES))) | ||
22 | #define ____cacheline_aligned __attribute__((aligned(L1_CACHE_BYTES))) | ||
23 | |||
24 | #endif | ||
diff --git a/include/asm-frv/cacheflush.h b/include/asm-frv/cacheflush.h new file mode 100644 index 000000000000..3007deccb490 --- /dev/null +++ b/include/asm-frv/cacheflush.h | |||
@@ -0,0 +1,91 @@ | |||
1 | /* cacheflush.h: FRV cache flushing routines | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_CACHEFLUSH_H | ||
13 | #define _ASM_CACHEFLUSH_H | ||
14 | |||
15 | /* Keep includes the same across arches. */ | ||
16 | #include <linux/mm.h> | ||
17 | |||
18 | /* | ||
19 | * virtually-indexed cache management (our cache is physically indexed) | ||
20 | */ | ||
21 | #define flush_cache_all() do {} while(0) | ||
22 | #define flush_cache_mm(mm) do {} while(0) | ||
23 | #define flush_cache_range(mm, start, end) do {} while(0) | ||
24 | #define flush_cache_page(vma, vmaddr, pfn) do {} while(0) | ||
25 | #define flush_cache_vmap(start, end) do {} while(0) | ||
26 | #define flush_cache_vunmap(start, end) do {} while(0) | ||
27 | #define flush_dcache_mmap_lock(mapping) do {} while(0) | ||
28 | #define flush_dcache_mmap_unlock(mapping) do {} while(0) | ||
29 | |||
30 | /* | ||
31 | * physically-indexed cache managment | ||
32 | * - see arch/frv/lib/cache.S | ||
33 | */ | ||
34 | extern void frv_dcache_writeback(unsigned long start, unsigned long size); | ||
35 | extern void frv_cache_invalidate(unsigned long start, unsigned long size); | ||
36 | extern void frv_icache_invalidate(unsigned long start, unsigned long size); | ||
37 | extern void frv_cache_wback_inv(unsigned long start, unsigned long size); | ||
38 | |||
39 | static inline void __flush_cache_all(void) | ||
40 | { | ||
41 | asm volatile(" dcef @(gr0,gr0),#1 \n" | ||
42 | " icei @(gr0,gr0),#1 \n" | ||
43 | " membar \n" | ||
44 | : : : "memory" | ||
45 | ); | ||
46 | } | ||
47 | |||
48 | /* dcache/icache coherency... */ | ||
49 | #ifdef CONFIG_MMU | ||
50 | extern void flush_dcache_page(struct page *page); | ||
51 | #else | ||
52 | static inline void flush_dcache_page(struct page *page) | ||
53 | { | ||
54 | unsigned long addr = page_to_phys(page); | ||
55 | frv_dcache_writeback(addr, addr + PAGE_SIZE); | ||
56 | } | ||
57 | #endif | ||
58 | |||
59 | static inline void flush_page_to_ram(struct page *page) | ||
60 | { | ||
61 | flush_dcache_page(page); | ||
62 | } | ||
63 | |||
64 | static inline void flush_icache(void) | ||
65 | { | ||
66 | __flush_cache_all(); | ||
67 | } | ||
68 | |||
69 | static inline void flush_icache_range(unsigned long start, unsigned long end) | ||
70 | { | ||
71 | frv_cache_wback_inv(start, end); | ||
72 | } | ||
73 | |||
74 | #ifdef CONFIG_MMU | ||
75 | extern void flush_icache_user_range(struct vm_area_struct *vma, struct page *page, | ||
76 | unsigned long start, unsigned long len); | ||
77 | #else | ||
78 | static inline void flush_icache_user_range(struct vm_area_struct *vma, struct page *page, | ||
79 | unsigned long start, unsigned long len) | ||
80 | { | ||
81 | frv_cache_wback_inv(start, start + len); | ||
82 | } | ||
83 | #endif | ||
84 | |||
85 | static inline void flush_icache_page(struct vm_area_struct *vma, struct page *page) | ||
86 | { | ||
87 | flush_icache_user_range(vma, page, page_to_phys(page), PAGE_SIZE); | ||
88 | } | ||
89 | |||
90 | |||
91 | #endif /* _ASM_CACHEFLUSH_H */ | ||
diff --git a/include/asm-frv/checksum.h b/include/asm-frv/checksum.h new file mode 100644 index 000000000000..10236f6802db --- /dev/null +++ b/include/asm-frv/checksum.h | |||
@@ -0,0 +1,183 @@ | |||
1 | /* checksum.h: FRV checksumming | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_CHECKSUM_H | ||
13 | #define _ASM_CHECKSUM_H | ||
14 | |||
15 | #include <linux/in6.h> | ||
16 | |||
17 | /* | ||
18 | * computes the checksum of a memory block at buff, length len, | ||
19 | * and adds in "sum" (32-bit) | ||
20 | * | ||
21 | * returns a 32-bit number suitable for feeding into itself | ||
22 | * or csum_tcpudp_magic | ||
23 | * | ||
24 | * this function must be called with even lengths, except | ||
25 | * for the last fragment, which may be odd | ||
26 | * | ||
27 | * it's best to have buff aligned on a 32-bit boundary | ||
28 | */ | ||
29 | unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum); | ||
30 | |||
31 | /* | ||
32 | * the same as csum_partial, but copies from src while it | ||
33 | * checksums | ||
34 | * | ||
35 | * here even more important to align src and dst on a 32-bit (or even | ||
36 | * better 64-bit) boundary | ||
37 | */ | ||
38 | unsigned int csum_partial_copy(const char *src, char *dst, int len, int sum); | ||
39 | |||
40 | /* | ||
41 | * the same as csum_partial_copy, but copies from user space. | ||
42 | * | ||
43 | * here even more important to align src and dst on a 32-bit (or even | ||
44 | * better 64-bit) boundary | ||
45 | */ | ||
46 | extern unsigned int csum_partial_copy_from_user(const char *src, char *dst, | ||
47 | int len, int sum, int *csum_err); | ||
48 | |||
49 | #define csum_partial_copy_nocheck(src, dst, len, sum) \ | ||
50 | csum_partial_copy((src), (dst), (len), (sum)) | ||
51 | |||
52 | /* | ||
53 | * This is a version of ip_compute_csum() optimized for IP headers, | ||
54 | * which always checksum on 4 octet boundaries. | ||
55 | * | ||
56 | */ | ||
57 | static inline | ||
58 | unsigned short ip_fast_csum(unsigned char *iph, unsigned int ihl) | ||
59 | { | ||
60 | unsigned int tmp, inc, sum = 0; | ||
61 | |||
62 | asm(" addcc gr0,gr0,gr0,icc0\n" /* clear icc0.C */ | ||
63 | " subi %1,#4,%1 \n" | ||
64 | "0: \n" | ||
65 | " ldu.p @(%1,%3),%4 \n" | ||
66 | " subicc %2,#1,%2,icc1 \n" | ||
67 | " addxcc.p %4,%0,%0,icc0 \n" | ||
68 | " bhi icc1,#2,0b \n" | ||
69 | |||
70 | /* fold the 33-bit result into 16-bits */ | ||
71 | " addxcc gr0,%0,%0,icc0 \n" | ||
72 | " srli %0,#16,%1 \n" | ||
73 | " sethi #0,%0 \n" | ||
74 | " add %1,%0,%0 \n" | ||
75 | " srli %0,#16,%1 \n" | ||
76 | " add %1,%0,%0 \n" | ||
77 | |||
78 | : "=r" (sum), "=r" (iph), "=r" (ihl), "=r" (inc), "=&r"(tmp) | ||
79 | : "0" (sum), "1" (iph), "2" (ihl), "3" (4), | ||
80 | "m"(*(volatile struct { int _[100]; } *)iph) | ||
81 | : "icc0", "icc1" | ||
82 | ); | ||
83 | |||
84 | return ~sum; | ||
85 | } | ||
86 | |||
87 | /* | ||
88 | * Fold a partial checksum | ||
89 | */ | ||
90 | static inline unsigned int csum_fold(unsigned int sum) | ||
91 | { | ||
92 | unsigned int tmp; | ||
93 | |||
94 | asm(" srli %0,#16,%1 \n" | ||
95 | " sethi #0,%0 \n" | ||
96 | " add %1,%0,%0 \n" | ||
97 | " srli %0,#16,%1 \n" | ||
98 | " add %1,%0,%0 \n" | ||
99 | : "=r"(sum), "=&r"(tmp) | ||
100 | : "0"(sum) | ||
101 | ); | ||
102 | |||
103 | return ~sum; | ||
104 | } | ||
105 | |||
106 | /* | ||
107 | * computes the checksum of the TCP/UDP pseudo-header | ||
108 | * returns a 16-bit checksum, already complemented | ||
109 | */ | ||
110 | static inline unsigned int | ||
111 | csum_tcpudp_nofold(unsigned long saddr, unsigned long daddr, unsigned short len, | ||
112 | unsigned short proto, unsigned int sum) | ||
113 | { | ||
114 | asm(" addcc %1,%0,%0,icc0 \n" | ||
115 | " addxcc %2,%0,%0,icc0 \n" | ||
116 | " addxcc %3,%0,%0,icc0 \n" | ||
117 | " addxcc gr0,%0,%0,icc0 \n" | ||
118 | : "=r" (sum) | ||
119 | : "r" (daddr), "r" (saddr), "r" (len + proto), "0"(sum) | ||
120 | : "icc0" | ||
121 | ); | ||
122 | return sum; | ||
123 | } | ||
124 | |||
125 | static inline unsigned short int | ||
126 | csum_tcpudp_magic(unsigned long saddr, unsigned long daddr, unsigned short len, | ||
127 | unsigned short proto, unsigned int sum) | ||
128 | { | ||
129 | return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum)); | ||
130 | } | ||
131 | |||
132 | /* | ||
133 | * this routine is used for miscellaneous IP-like checksums, mainly | ||
134 | * in icmp.c | ||
135 | */ | ||
136 | extern unsigned short ip_compute_csum(const unsigned char * buff, int len); | ||
137 | |||
138 | #define _HAVE_ARCH_IPV6_CSUM | ||
139 | static inline unsigned short int | ||
140 | csum_ipv6_magic(struct in6_addr *saddr, struct in6_addr *daddr, | ||
141 | __u32 len, unsigned short proto, unsigned int sum) | ||
142 | { | ||
143 | unsigned long tmp, tmp2; | ||
144 | |||
145 | asm(" addcc %2,%0,%0,icc0 \n" | ||
146 | |||
147 | /* add up the source addr */ | ||
148 | " ldi @(%3,0),%1 \n" | ||
149 | " addxcc %1,%0,%0,icc0 \n" | ||
150 | " ldi @(%3,4),%2 \n" | ||
151 | " addxcc %2,%0,%0,icc0 \n" | ||
152 | " ldi @(%3,8),%1 \n" | ||
153 | " addxcc %1,%0,%0,icc0 \n" | ||
154 | " ldi @(%3,12),%2 \n" | ||
155 | " addxcc %2,%0,%0,icc0 \n" | ||
156 | |||
157 | /* add up the dest addr */ | ||
158 | " ldi @(%4,0),%1 \n" | ||
159 | " addxcc %1,%0,%0,icc0 \n" | ||
160 | " ldi @(%4,4),%2 \n" | ||
161 | " addxcc %2,%0,%0,icc0 \n" | ||
162 | " ldi @(%4,8),%1 \n" | ||
163 | " addxcc %1,%0,%0,icc0 \n" | ||
164 | " ldi @(%4,12),%2 \n" | ||
165 | " addxcc %2,%0,%0,icc0 \n" | ||
166 | |||
167 | /* fold the 33-bit result into 16-bits */ | ||
168 | " addxcc gr0,%0,%0,icc0 \n" | ||
169 | " srli %0,#16,%1 \n" | ||
170 | " sethi #0,%0 \n" | ||
171 | " add %1,%0,%0 \n" | ||
172 | " srli %0,#16,%1 \n" | ||
173 | " add %1,%0,%0 \n" | ||
174 | |||
175 | : "=r" (sum), "=&r" (tmp), "=r" (tmp2) | ||
176 | : "r" (saddr), "r" (daddr), "0" (sum), "2" (len + proto) | ||
177 | : "icc0" | ||
178 | ); | ||
179 | |||
180 | return ~sum; | ||
181 | } | ||
182 | |||
183 | #endif /* _ASM_CHECKSUM_H */ | ||
diff --git a/include/asm-frv/cpu-irqs.h b/include/asm-frv/cpu-irqs.h new file mode 100644 index 000000000000..5cd691e1f8c4 --- /dev/null +++ b/include/asm-frv/cpu-irqs.h | |||
@@ -0,0 +1,87 @@ | |||
1 | /* cpu-irqs.h: on-CPU peripheral irqs | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_CPU_IRQS_H | ||
13 | #define _ASM_CPU_IRQS_H | ||
14 | |||
15 | #ifndef __ASSEMBLY__ | ||
16 | |||
17 | #include <asm/irq-routing.h> | ||
18 | |||
19 | #define IRQ_BASE_CPU (NR_IRQ_ACTIONS_PER_GROUP * 0) | ||
20 | |||
21 | /* IRQ IDs presented to drivers */ | ||
22 | enum { | ||
23 | IRQ_CPU__UNUSED = IRQ_BASE_CPU, | ||
24 | IRQ_CPU_UART0, | ||
25 | IRQ_CPU_UART1, | ||
26 | IRQ_CPU_TIMER0, | ||
27 | IRQ_CPU_TIMER1, | ||
28 | IRQ_CPU_TIMER2, | ||
29 | IRQ_CPU_DMA0, | ||
30 | IRQ_CPU_DMA1, | ||
31 | IRQ_CPU_DMA2, | ||
32 | IRQ_CPU_DMA3, | ||
33 | IRQ_CPU_DMA4, | ||
34 | IRQ_CPU_DMA5, | ||
35 | IRQ_CPU_DMA6, | ||
36 | IRQ_CPU_DMA7, | ||
37 | IRQ_CPU_EXTERNAL0, | ||
38 | IRQ_CPU_EXTERNAL1, | ||
39 | IRQ_CPU_EXTERNAL2, | ||
40 | IRQ_CPU_EXTERNAL3, | ||
41 | IRQ_CPU_EXTERNAL4, | ||
42 | IRQ_CPU_EXTERNAL5, | ||
43 | IRQ_CPU_EXTERNAL6, | ||
44 | IRQ_CPU_EXTERNAL7, | ||
45 | }; | ||
46 | |||
47 | /* IRQ to level mappings */ | ||
48 | #define IRQ_GDBSTUB_LEVEL 15 | ||
49 | #define IRQ_UART_LEVEL 13 | ||
50 | |||
51 | #ifdef CONFIG_GDBSTUB_UART0 | ||
52 | #define IRQ_UART0_LEVEL IRQ_GDBSTUB_LEVEL | ||
53 | #else | ||
54 | #define IRQ_UART0_LEVEL IRQ_UART_LEVEL | ||
55 | #endif | ||
56 | |||
57 | #ifdef CONFIG_GDBSTUB_UART1 | ||
58 | #define IRQ_UART1_LEVEL IRQ_GDBSTUB_LEVEL | ||
59 | #else | ||
60 | #define IRQ_UART1_LEVEL IRQ_UART_LEVEL | ||
61 | #endif | ||
62 | |||
63 | #define IRQ_DMA0_LEVEL 14 | ||
64 | #define IRQ_DMA1_LEVEL 14 | ||
65 | #define IRQ_DMA2_LEVEL 14 | ||
66 | #define IRQ_DMA3_LEVEL 14 | ||
67 | #define IRQ_DMA4_LEVEL 14 | ||
68 | #define IRQ_DMA5_LEVEL 14 | ||
69 | #define IRQ_DMA6_LEVEL 14 | ||
70 | #define IRQ_DMA7_LEVEL 14 | ||
71 | |||
72 | #define IRQ_TIMER0_LEVEL 12 | ||
73 | #define IRQ_TIMER1_LEVEL 11 | ||
74 | #define IRQ_TIMER2_LEVEL 10 | ||
75 | |||
76 | #define IRQ_XIRQ0_LEVEL 1 | ||
77 | #define IRQ_XIRQ1_LEVEL 2 | ||
78 | #define IRQ_XIRQ2_LEVEL 3 | ||
79 | #define IRQ_XIRQ3_LEVEL 4 | ||
80 | #define IRQ_XIRQ4_LEVEL 5 | ||
81 | #define IRQ_XIRQ5_LEVEL 6 | ||
82 | #define IRQ_XIRQ6_LEVEL 7 | ||
83 | #define IRQ_XIRQ7_LEVEL 8 | ||
84 | |||
85 | #endif /* !__ASSEMBLY__ */ | ||
86 | |||
87 | #endif /* _ASM_CPU_IRQS_H */ | ||
diff --git a/include/asm-frv/cpumask.h b/include/asm-frv/cpumask.h new file mode 100644 index 000000000000..d999c20c84d2 --- /dev/null +++ b/include/asm-frv/cpumask.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef _ASM_CPUMASK_H | ||
2 | #define _ASM_CPUMASK_H | ||
3 | |||
4 | #include <asm-generic/cpumask.h> | ||
5 | |||
6 | #endif /* _ASM_CPUMASK_H */ | ||
diff --git a/include/asm-frv/cputime.h b/include/asm-frv/cputime.h new file mode 100644 index 000000000000..f6c373ad2b80 --- /dev/null +++ b/include/asm-frv/cputime.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef _ASM_CPUTIME_H | ||
2 | #define _ASM_CPUTIME_H | ||
3 | |||
4 | #include <asm-generic/cputime.h> | ||
5 | |||
6 | #endif /* _ASM_CPUTIME_H */ | ||
diff --git a/include/asm-frv/current.h b/include/asm-frv/current.h new file mode 100644 index 000000000000..86b027491b08 --- /dev/null +++ b/include/asm-frv/current.h | |||
@@ -0,0 +1,30 @@ | |||
1 | /* current.h: FRV current task pointer | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_CURRENT_H | ||
13 | #define _ASM_CURRENT_H | ||
14 | |||
15 | #ifndef __ASSEMBLY__ | ||
16 | |||
17 | /* | ||
18 | * dedicate GR29 to keeping the current task pointer | ||
19 | */ | ||
20 | register struct task_struct *current asm("gr29"); | ||
21 | |||
22 | #define get_current() current | ||
23 | |||
24 | #else | ||
25 | |||
26 | #define CURRENT gr29 | ||
27 | |||
28 | #endif | ||
29 | |||
30 | #endif /* _ASM_CURRENT_H */ | ||
diff --git a/include/asm-frv/delay.h b/include/asm-frv/delay.h new file mode 100644 index 000000000000..597b4ebf03b4 --- /dev/null +++ b/include/asm-frv/delay.h | |||
@@ -0,0 +1,50 @@ | |||
1 | /* delay.h: FRV delay code | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_DELAY_H | ||
13 | #define _ASM_DELAY_H | ||
14 | |||
15 | #include <asm/param.h> | ||
16 | #include <asm/timer-regs.h> | ||
17 | |||
18 | /* | ||
19 | * delay loop - runs at __core_clock_speed_HZ / 2 [there are 2 insns in the loop] | ||
20 | */ | ||
21 | extern unsigned long __delay_loops_MHz; | ||
22 | |||
23 | static inline void __delay(unsigned long loops) | ||
24 | { | ||
25 | asm volatile("1: subicc %0,#1,%0,icc0 \n" | ||
26 | " bnc icc0,#2,1b \n" | ||
27 | : "=r" (loops) | ||
28 | : "0" (loops) | ||
29 | : "icc0" | ||
30 | ); | ||
31 | } | ||
32 | |||
33 | /* | ||
34 | * Use only for very small delays ( < 1 msec). Should probably use a | ||
35 | * lookup table, really, as the multiplications take much too long with | ||
36 | * short delays. This is a "reasonable" implementation, though (and the | ||
37 | * first constant multiplications gets optimized away if the delay is | ||
38 | * a constant) | ||
39 | */ | ||
40 | |||
41 | extern unsigned long loops_per_jiffy; | ||
42 | |||
43 | static inline void udelay(unsigned long usecs) | ||
44 | { | ||
45 | __delay(usecs * __delay_loops_MHz); | ||
46 | } | ||
47 | |||
48 | #define ndelay(n) udelay((n) * 5) | ||
49 | |||
50 | #endif /* _ASM_DELAY_H */ | ||
diff --git a/include/asm-frv/div64.h b/include/asm-frv/div64.h new file mode 100644 index 000000000000..6cd978cefb28 --- /dev/null +++ b/include/asm-frv/div64.h | |||
@@ -0,0 +1 @@ | |||
#include <asm-generic/div64.h> | |||
diff --git a/include/asm-frv/dm9000.h b/include/asm-frv/dm9000.h new file mode 100644 index 000000000000..f6f48fd9ec6e --- /dev/null +++ b/include/asm-frv/dm9000.h | |||
@@ -0,0 +1,37 @@ | |||
1 | /* dm9000.h: Davicom DM9000 adapter configuration | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_DM9000_H | ||
13 | #define _ASM_DM9000_H | ||
14 | |||
15 | #include <asm/mb-regs.h> | ||
16 | |||
17 | #define DM9000_ARCH_IOBASE (__region_CS6 + 0x300) | ||
18 | #define DM9000_ARCH_IRQ IRQ_CPU_EXTERNAL3 /* XIRQ #3 (shared with FPGA) */ | ||
19 | #undef DM9000_ARCH_IRQ_ACTLOW /* IRQ pin active high */ | ||
20 | #define DM9000_ARCH_BUS_INFO "CS6#+0x300" /* bus info for ethtool */ | ||
21 | |||
22 | #undef __is_PCI_IO | ||
23 | #define __is_PCI_IO(addr) 0 /* not PCI */ | ||
24 | |||
25 | #undef inl | ||
26 | #define inl(addr) \ | ||
27 | ({ \ | ||
28 | unsigned long __ioaddr = (unsigned long) addr; \ | ||
29 | uint32_t x = readl(__ioaddr); \ | ||
30 | ((x & 0xff) << 24) | ((x & 0xff00) << 8) | ((x >> 8) & 0xff00) | ((x >> 24) & 0xff); \ | ||
31 | }) | ||
32 | |||
33 | #undef insl | ||
34 | #define insl(a,b,l) __insl(a,b,l,0) /* don't byte-swap */ | ||
35 | |||
36 | |||
37 | #endif /* _ASM_DM9000_H */ | ||
diff --git a/include/asm-frv/dma-mapping.h b/include/asm-frv/dma-mapping.h new file mode 100644 index 000000000000..0206ab35eae0 --- /dev/null +++ b/include/asm-frv/dma-mapping.h | |||
@@ -0,0 +1,184 @@ | |||
1 | #ifndef _ASM_DMA_MAPPING_H | ||
2 | #define _ASM_DMA_MAPPING_H | ||
3 | |||
4 | #include <linux/device.h> | ||
5 | #include <asm/cache.h> | ||
6 | #include <asm/cacheflush.h> | ||
7 | #include <asm/scatterlist.h> | ||
8 | #include <asm/io.h> | ||
9 | |||
10 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) | ||
11 | #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) | ||
12 | |||
13 | extern unsigned long __nongprelbss dma_coherent_mem_start; | ||
14 | extern unsigned long __nongprelbss dma_coherent_mem_end; | ||
15 | |||
16 | void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, int gfp); | ||
17 | void dma_free_coherent(struct device *dev, size_t size, void *vaddr, dma_addr_t dma_handle); | ||
18 | |||
19 | /* | ||
20 | * These macros should be used after a pci_map_sg call has been done | ||
21 | * to get bus addresses of each of the SG entries and their lengths. | ||
22 | * You should only work with the number of sg entries pci_map_sg | ||
23 | * returns, or alternatively stop on the first sg_dma_len(sg) which | ||
24 | * is 0. | ||
25 | */ | ||
26 | #define sg_dma_address(sg) ((unsigned long) (page_to_phys((sg)->page) + (sg)->offset)) | ||
27 | #define sg_dma_len(sg) ((sg)->length) | ||
28 | |||
29 | /* | ||
30 | * Map a single buffer of the indicated size for DMA in streaming mode. | ||
31 | * The 32-bit bus address to use is returned. | ||
32 | * | ||
33 | * Once the device is given the dma address, the device owns this memory | ||
34 | * until either pci_unmap_single or pci_dma_sync_single is performed. | ||
35 | */ | ||
36 | extern dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size, | ||
37 | enum dma_data_direction direction); | ||
38 | |||
39 | /* | ||
40 | * Unmap a single streaming mode DMA translation. The dma_addr and size | ||
41 | * must match what was provided for in a previous pci_map_single call. All | ||
42 | * other usages are undefined. | ||
43 | * | ||
44 | * After this call, reads by the cpu to the buffer are guarenteed to see | ||
45 | * whatever the device wrote there. | ||
46 | */ | ||
47 | static inline | ||
48 | void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, | ||
49 | enum dma_data_direction direction) | ||
50 | { | ||
51 | BUG_ON(direction == DMA_NONE); | ||
52 | } | ||
53 | |||
54 | /* | ||
55 | * Map a set of buffers described by scatterlist in streaming | ||
56 | * mode for DMA. This is the scather-gather version of the | ||
57 | * above pci_map_single interface. Here the scatter gather list | ||
58 | * elements are each tagged with the appropriate dma address | ||
59 | * and length. They are obtained via sg_dma_{address,length}(SG). | ||
60 | * | ||
61 | * NOTE: An implementation may be able to use a smaller number of | ||
62 | * DMA address/length pairs than there are SG table elements. | ||
63 | * (for example via virtual mapping capabilities) | ||
64 | * The routine returns the number of addr/length pairs actually | ||
65 | * used, at most nents. | ||
66 | * | ||
67 | * Device ownership issues as mentioned above for pci_map_single are | ||
68 | * the same here. | ||
69 | */ | ||
70 | extern int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, | ||
71 | enum dma_data_direction direction); | ||
72 | |||
73 | /* | ||
74 | * Unmap a set of streaming mode DMA translations. | ||
75 | * Again, cpu read rules concerning calls here are the same as for | ||
76 | * pci_unmap_single() above. | ||
77 | */ | ||
78 | static inline | ||
79 | void dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries, | ||
80 | enum dma_data_direction direction) | ||
81 | { | ||
82 | BUG_ON(direction == DMA_NONE); | ||
83 | } | ||
84 | |||
85 | extern | ||
86 | dma_addr_t dma_map_page(struct device *dev, struct page *page, unsigned long offset, | ||
87 | size_t size, enum dma_data_direction direction); | ||
88 | |||
89 | static inline | ||
90 | void dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size, | ||
91 | enum dma_data_direction direction) | ||
92 | { | ||
93 | BUG_ON(direction == DMA_NONE); | ||
94 | } | ||
95 | |||
96 | |||
97 | static inline | ||
98 | void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, | ||
99 | enum dma_data_direction direction) | ||
100 | { | ||
101 | } | ||
102 | |||
103 | static inline | ||
104 | void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size, | ||
105 | enum dma_data_direction direction) | ||
106 | { | ||
107 | flush_write_buffers(); | ||
108 | } | ||
109 | |||
110 | static inline | ||
111 | void dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle, | ||
112 | unsigned long offset, size_t size, | ||
113 | enum dma_data_direction direction) | ||
114 | { | ||
115 | } | ||
116 | |||
117 | static inline | ||
118 | void dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle, | ||
119 | unsigned long offset, size_t size, | ||
120 | enum dma_data_direction direction) | ||
121 | { | ||
122 | flush_write_buffers(); | ||
123 | } | ||
124 | |||
125 | static inline | ||
126 | void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems, | ||
127 | enum dma_data_direction direction) | ||
128 | { | ||
129 | } | ||
130 | |||
131 | static inline | ||
132 | void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems, | ||
133 | enum dma_data_direction direction) | ||
134 | { | ||
135 | flush_write_buffers(); | ||
136 | } | ||
137 | |||
138 | static inline | ||
139 | int dma_mapping_error(dma_addr_t dma_addr) | ||
140 | { | ||
141 | return 0; | ||
142 | } | ||
143 | |||
144 | static inline | ||
145 | int dma_supported(struct device *dev, u64 mask) | ||
146 | { | ||
147 | /* | ||
148 | * we fall back to GFP_DMA when the mask isn't all 1s, | ||
149 | * so we can't guarantee allocations that must be | ||
150 | * within a tighter range than GFP_DMA.. | ||
151 | */ | ||
152 | if (mask < 0x00ffffff) | ||
153 | return 0; | ||
154 | |||
155 | return 1; | ||
156 | } | ||
157 | |||
158 | static inline | ||
159 | int dma_set_mask(struct device *dev, u64 mask) | ||
160 | { | ||
161 | if (!dev->dma_mask || !dma_supported(dev, mask)) | ||
162 | return -EIO; | ||
163 | |||
164 | *dev->dma_mask = mask; | ||
165 | |||
166 | return 0; | ||
167 | } | ||
168 | |||
169 | static inline | ||
170 | int dma_get_cache_alignment(void) | ||
171 | { | ||
172 | return 1 << L1_CACHE_SHIFT; | ||
173 | } | ||
174 | |||
175 | #define dma_is_consistent(d) (1) | ||
176 | |||
177 | static inline | ||
178 | void dma_cache_sync(void *vaddr, size_t size, | ||
179 | enum dma_data_direction direction) | ||
180 | { | ||
181 | flush_write_buffers(); | ||
182 | } | ||
183 | |||
184 | #endif /* _ASM_DMA_MAPPING_H */ | ||
diff --git a/include/asm-frv/dma.h b/include/asm-frv/dma.h new file mode 100644 index 000000000000..d8f9a2f21521 --- /dev/null +++ b/include/asm-frv/dma.h | |||
@@ -0,0 +1,129 @@ | |||
1 | /* dma.h: FRV DMA controller management | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_DMA_H | ||
13 | #define _ASM_DMA_H | ||
14 | |||
15 | //#define DMA_DEBUG 1 | ||
16 | |||
17 | #include <linux/config.h> | ||
18 | #include <linux/interrupt.h> | ||
19 | |||
20 | #undef MAX_DMA_CHANNELS /* don't use kernel/dma.c */ | ||
21 | |||
22 | /* under 2.4 this is actually needed by the new bootmem allocator */ | ||
23 | #define MAX_DMA_ADDRESS PAGE_OFFSET | ||
24 | |||
25 | /* | ||
26 | * FRV DMA controller management | ||
27 | */ | ||
28 | struct pt_regs; | ||
29 | |||
30 | typedef irqreturn_t (*dma_irq_handler_t)(int dmachan, unsigned long cstr, void *data, | ||
31 | struct pt_regs *regs); | ||
32 | |||
33 | extern void frv_dma_init(void); | ||
34 | |||
35 | extern int frv_dma_open(const char *devname, | ||
36 | unsigned long dmamask, | ||
37 | int dmacap, | ||
38 | dma_irq_handler_t handler, | ||
39 | unsigned long irq_flags, | ||
40 | void *data); | ||
41 | |||
42 | /* channels required */ | ||
43 | #define FRV_DMA_MASK_ANY ULONG_MAX /* any channel */ | ||
44 | |||
45 | /* capabilities required */ | ||
46 | #define FRV_DMA_CAP_DREQ 0x01 /* DMA request pin */ | ||
47 | #define FRV_DMA_CAP_DACK 0x02 /* DMA ACK pin */ | ||
48 | #define FRV_DMA_CAP_DONE 0x04 /* DMA done pin */ | ||
49 | |||
50 | extern void frv_dma_close(int dma); | ||
51 | |||
52 | extern void frv_dma_config(int dma, unsigned long ccfr, unsigned long cctr, unsigned long apr); | ||
53 | |||
54 | extern void frv_dma_start(int dma, | ||
55 | unsigned long sba, unsigned long dba, | ||
56 | unsigned long pix, unsigned long six, unsigned long bcl); | ||
57 | |||
58 | extern void frv_dma_restart_circular(int dma, unsigned long six); | ||
59 | |||
60 | extern void frv_dma_stop(int dma); | ||
61 | |||
62 | extern int is_frv_dma_interrupting(int dma); | ||
63 | |||
64 | extern void frv_dma_dump(int dma); | ||
65 | |||
66 | extern void frv_dma_status_clear(int dma); | ||
67 | |||
68 | #define FRV_DMA_NCHANS 8 | ||
69 | #define FRV_DMA_4CHANS 4 | ||
70 | #define FRV_DMA_8CHANS 8 | ||
71 | |||
72 | #define DMAC_CCFRx 0x00 /* channel configuration reg */ | ||
73 | #define DMAC_CCFRx_CM_SHIFT 16 | ||
74 | #define DMAC_CCFRx_CM_DA 0x00000000 | ||
75 | #define DMAC_CCFRx_CM_SCA 0x00010000 | ||
76 | #define DMAC_CCFRx_CM_DCA 0x00020000 | ||
77 | #define DMAC_CCFRx_CM_2D 0x00030000 | ||
78 | #define DMAC_CCFRx_ATS_SHIFT 8 | ||
79 | #define DMAC_CCFRx_RS_INTERN 0x00000000 | ||
80 | #define DMAC_CCFRx_RS_EXTERN 0x00000001 | ||
81 | #define DMAC_CCFRx_RS_SHIFT 0 | ||
82 | |||
83 | #define DMAC_CSTRx 0x08 /* channel status reg */ | ||
84 | #define DMAC_CSTRx_FS 0x0000003f | ||
85 | #define DMAC_CSTRx_NE 0x00000100 | ||
86 | #define DMAC_CSTRx_FED 0x00000200 | ||
87 | #define DMAC_CSTRx_WER 0x00000800 | ||
88 | #define DMAC_CSTRx_RER 0x00001000 | ||
89 | #define DMAC_CSTRx_CE 0x00002000 | ||
90 | #define DMAC_CSTRx_INT 0x00800000 | ||
91 | #define DMAC_CSTRx_BUSY 0x80000000 | ||
92 | |||
93 | #define DMAC_CCTRx 0x10 /* channel control reg */ | ||
94 | #define DMAC_CCTRx_DSIZ_1 0x00000000 | ||
95 | #define DMAC_CCTRx_DSIZ_2 0x00000001 | ||
96 | #define DMAC_CCTRx_DSIZ_4 0x00000002 | ||
97 | #define DMAC_CCTRx_DSIZ_32 0x00000005 | ||
98 | #define DMAC_CCTRx_DAU_HOLD 0x00000000 | ||
99 | #define DMAC_CCTRx_DAU_INC 0x00000010 | ||
100 | #define DMAC_CCTRx_DAU_DEC 0x00000020 | ||
101 | #define DMAC_CCTRx_SSIZ_1 0x00000000 | ||
102 | #define DMAC_CCTRx_SSIZ_2 0x00000100 | ||
103 | #define DMAC_CCTRx_SSIZ_4 0x00000200 | ||
104 | #define DMAC_CCTRx_SSIZ_32 0x00000500 | ||
105 | #define DMAC_CCTRx_SAU_HOLD 0x00000000 | ||
106 | #define DMAC_CCTRx_SAU_INC 0x00001000 | ||
107 | #define DMAC_CCTRx_SAU_DEC 0x00002000 | ||
108 | #define DMAC_CCTRx_FC 0x08000000 | ||
109 | #define DMAC_CCTRx_ICE 0x10000000 | ||
110 | #define DMAC_CCTRx_IE 0x40000000 | ||
111 | #define DMAC_CCTRx_ACT 0x80000000 | ||
112 | |||
113 | #define DMAC_SBAx 0x18 /* source base address reg */ | ||
114 | #define DMAC_DBAx 0x20 /* data base address reg */ | ||
115 | #define DMAC_PIXx 0x28 /* primary index reg */ | ||
116 | #define DMAC_SIXx 0x30 /* secondary index reg */ | ||
117 | #define DMAC_BCLx 0x38 /* byte count limit reg */ | ||
118 | #define DMAC_APRx 0x40 /* alternate pointer reg */ | ||
119 | |||
120 | /* | ||
121 | * required for PCI + MODULES | ||
122 | */ | ||
123 | #ifdef CONFIG_PCI | ||
124 | extern int isa_dma_bridge_buggy; | ||
125 | #else | ||
126 | #define isa_dma_bridge_buggy (0) | ||
127 | #endif | ||
128 | |||
129 | #endif /* _ASM_DMA_H */ | ||
diff --git a/include/asm-frv/elf.h b/include/asm-frv/elf.h new file mode 100644 index 000000000000..7d2098f0476b --- /dev/null +++ b/include/asm-frv/elf.h | |||
@@ -0,0 +1,147 @@ | |||
1 | /* elf.h: FR-V ELF definitions | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * - Derived from include/asm-m68knommu/elf.h | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License | ||
9 | * as published by the Free Software Foundation; either version | ||
10 | * 2 of the License, or (at your option) any later version. | ||
11 | */ | ||
12 | #ifndef __ASM_ELF_H | ||
13 | #define __ASM_ELF_H | ||
14 | |||
15 | #include <linux/config.h> | ||
16 | #include <asm/ptrace.h> | ||
17 | #include <asm/user.h> | ||
18 | |||
19 | struct elf32_hdr; | ||
20 | |||
21 | /* | ||
22 | * ELF header e_flags defines. | ||
23 | */ | ||
24 | #define EF_FRV_GPR_MASK 0x00000003 /* mask for # of gprs */ | ||
25 | #define EF_FRV_GPR32 0x00000001 /* Only uses GR on 32-register */ | ||
26 | #define EF_FRV_GPR64 0x00000002 /* Only uses GR on 64-register */ | ||
27 | #define EF_FRV_FPR_MASK 0x0000000c /* mask for # of fprs */ | ||
28 | #define EF_FRV_FPR32 0x00000004 /* Only uses FR on 32-register */ | ||
29 | #define EF_FRV_FPR64 0x00000008 /* Only uses FR on 64-register */ | ||
30 | #define EF_FRV_FPR_NONE 0x0000000C /* Uses software floating-point */ | ||
31 | #define EF_FRV_DWORD_MASK 0x00000030 /* mask for dword support */ | ||
32 | #define EF_FRV_DWORD_YES 0x00000010 /* Assumes stack aligned to 8-byte boundaries. */ | ||
33 | #define EF_FRV_DWORD_NO 0x00000020 /* Assumes stack aligned to 4-byte boundaries. */ | ||
34 | #define EF_FRV_DOUBLE 0x00000040 /* Uses double instructions. */ | ||
35 | #define EF_FRV_MEDIA 0x00000080 /* Uses media instructions. */ | ||
36 | #define EF_FRV_PIC 0x00000100 /* Uses position independent code. */ | ||
37 | #define EF_FRV_NON_PIC_RELOCS 0x00000200 /* Does not use position Independent code. */ | ||
38 | #define EF_FRV_MULADD 0x00000400 /* -mmuladd */ | ||
39 | #define EF_FRV_BIGPIC 0x00000800 /* -fPIC */ | ||
40 | #define EF_FRV_LIBPIC 0x00001000 /* -mlibrary-pic */ | ||
41 | #define EF_FRV_G0 0x00002000 /* -G 0, no small data ptr */ | ||
42 | #define EF_FRV_NOPACK 0x00004000 /* -mnopack */ | ||
43 | #define EF_FRV_FDPIC 0x00008000 /* -mfdpic */ | ||
44 | #define EF_FRV_CPU_MASK 0xff000000 /* specific cpu bits */ | ||
45 | #define EF_FRV_CPU_GENERIC 0x00000000 /* Set CPU type is FR-V */ | ||
46 | #define EF_FRV_CPU_FR500 0x01000000 /* Set CPU type is FR500 */ | ||
47 | #define EF_FRV_CPU_FR300 0x02000000 /* Set CPU type is FR300 */ | ||
48 | #define EF_FRV_CPU_SIMPLE 0x03000000 /* SIMPLE */ | ||
49 | #define EF_FRV_CPU_TOMCAT 0x04000000 /* Tomcat, FR500 prototype */ | ||
50 | #define EF_FRV_CPU_FR400 0x05000000 /* Set CPU type is FR400 */ | ||
51 | #define EF_FRV_CPU_FR550 0x06000000 /* Set CPU type is FR550 */ | ||
52 | #define EF_FRV_CPU_FR405 0x07000000 /* Set CPU type is FR405 */ | ||
53 | #define EF_FRV_CPU_FR450 0x08000000 /* Set CPU type is FR450 */ | ||
54 | |||
55 | /* | ||
56 | * FR-V ELF relocation types | ||
57 | */ | ||
58 | |||
59 | |||
60 | /* | ||
61 | * ELF register definitions.. | ||
62 | */ | ||
63 | typedef unsigned long elf_greg_t; | ||
64 | |||
65 | #define ELF_NGREG (sizeof(struct pt_regs) / sizeof(elf_greg_t)) | ||
66 | typedef elf_greg_t elf_gregset_t[ELF_NGREG]; | ||
67 | |||
68 | typedef struct fpmedia_struct elf_fpregset_t; | ||
69 | |||
70 | /* | ||
71 | * This is used to ensure we don't load something for the wrong architecture. | ||
72 | */ | ||
73 | extern int elf_check_arch(const struct elf32_hdr *hdr); | ||
74 | |||
75 | #define elf_check_fdpic(x) ((x)->e_flags & EF_FRV_FDPIC && !((x)->e_flags & EF_FRV_NON_PIC_RELOCS)) | ||
76 | #define elf_check_const_displacement(x) ((x)->e_flags & EF_FRV_PIC) | ||
77 | |||
78 | /* | ||
79 | * These are used to set parameters in the core dumps. | ||
80 | */ | ||
81 | #define ELF_CLASS ELFCLASS32 | ||
82 | #define ELF_DATA ELFDATA2MSB | ||
83 | #define ELF_ARCH EM_FRV | ||
84 | |||
85 | #define ELF_PLAT_INIT(_r) \ | ||
86 | do { \ | ||
87 | __kernel_frame0_ptr->gr16 = 0; \ | ||
88 | __kernel_frame0_ptr->gr17 = 0; \ | ||
89 | __kernel_frame0_ptr->gr18 = 0; \ | ||
90 | __kernel_frame0_ptr->gr19 = 0; \ | ||
91 | __kernel_frame0_ptr->gr20 = 0; \ | ||
92 | __kernel_frame0_ptr->gr21 = 0; \ | ||
93 | __kernel_frame0_ptr->gr22 = 0; \ | ||
94 | __kernel_frame0_ptr->gr23 = 0; \ | ||
95 | __kernel_frame0_ptr->gr24 = 0; \ | ||
96 | __kernel_frame0_ptr->gr25 = 0; \ | ||
97 | __kernel_frame0_ptr->gr26 = 0; \ | ||
98 | __kernel_frame0_ptr->gr27 = 0; \ | ||
99 | __kernel_frame0_ptr->gr29 = 0; \ | ||
100 | } while(0) | ||
101 | |||
102 | #define ELF_FDPIC_PLAT_INIT(_regs, _exec_map_addr, _interp_map_addr, _dynamic_addr) \ | ||
103 | do { \ | ||
104 | __kernel_frame0_ptr->gr16 = _exec_map_addr; \ | ||
105 | __kernel_frame0_ptr->gr17 = _interp_map_addr; \ | ||
106 | __kernel_frame0_ptr->gr18 = _dynamic_addr; \ | ||
107 | __kernel_frame0_ptr->gr19 = 0; \ | ||
108 | __kernel_frame0_ptr->gr20 = 0; \ | ||
109 | __kernel_frame0_ptr->gr21 = 0; \ | ||
110 | __kernel_frame0_ptr->gr22 = 0; \ | ||
111 | __kernel_frame0_ptr->gr23 = 0; \ | ||
112 | __kernel_frame0_ptr->gr24 = 0; \ | ||
113 | __kernel_frame0_ptr->gr25 = 0; \ | ||
114 | __kernel_frame0_ptr->gr26 = 0; \ | ||
115 | __kernel_frame0_ptr->gr27 = 0; \ | ||
116 | __kernel_frame0_ptr->gr29 = 0; \ | ||
117 | } while(0) | ||
118 | |||
119 | #define USE_ELF_CORE_DUMP | ||
120 | #define ELF_EXEC_PAGESIZE 16384 | ||
121 | |||
122 | /* This is the location that an ET_DYN program is loaded if exec'ed. Typical | ||
123 | use of this is to invoke "./ld.so someprog" to test out a new version of | ||
124 | the loader. We need to make sure that it is out of the way of the program | ||
125 | that it will "exec", and that there is sufficient room for the brk. */ | ||
126 | |||
127 | #define ELF_ET_DYN_BASE 0x08000000UL | ||
128 | |||
129 | #define ELF_CORE_COPY_REGS(pr_reg, regs) \ | ||
130 | memcpy(&pr_reg[0], ®s->sp, 31 * sizeof(uint32_t)); | ||
131 | |||
132 | /* This yields a mask that user programs can use to figure out what | ||
133 | instruction set this cpu supports. */ | ||
134 | |||
135 | #define ELF_HWCAP (0) | ||
136 | |||
137 | /* This yields a string that ld.so will use to load implementation | ||
138 | specific libraries for optimization. This is more specific in | ||
139 | intent than poking at uname or /proc/cpuinfo. */ | ||
140 | |||
141 | #define ELF_PLATFORM (NULL) | ||
142 | |||
143 | #ifdef __KERNEL__ | ||
144 | #define SET_PERSONALITY(ex, ibcs2) set_personality((ibcs2)?PER_SVR4:PER_LINUX) | ||
145 | #endif | ||
146 | |||
147 | #endif | ||
diff --git a/include/asm-frv/errno.h b/include/asm-frv/errno.h new file mode 100644 index 000000000000..d010795ceefe --- /dev/null +++ b/include/asm-frv/errno.h | |||
@@ -0,0 +1,7 @@ | |||
1 | #ifndef _ASM_ERRNO_H | ||
2 | #define _ASM_ERRNO_H | ||
3 | |||
4 | #include <asm-generic/errno.h> | ||
5 | |||
6 | #endif /* _ASM_ERRNO_H */ | ||
7 | |||
diff --git a/include/asm-frv/fcntl.h b/include/asm-frv/fcntl.h new file mode 100644 index 000000000000..d61b999f9973 --- /dev/null +++ b/include/asm-frv/fcntl.h | |||
@@ -0,0 +1,88 @@ | |||
1 | #ifndef _ASM_FCNTL_H | ||
2 | #define _ASM_FCNTL_H | ||
3 | |||
4 | /* open/fcntl - O_SYNC is only implemented on blocks devices and on files | ||
5 | located on an ext2 file system */ | ||
6 | #define O_ACCMODE 0003 | ||
7 | #define O_RDONLY 00 | ||
8 | #define O_WRONLY 01 | ||
9 | #define O_RDWR 02 | ||
10 | #define O_CREAT 0100 /* not fcntl */ | ||
11 | #define O_EXCL 0200 /* not fcntl */ | ||
12 | #define O_NOCTTY 0400 /* not fcntl */ | ||
13 | #define O_TRUNC 01000 /* not fcntl */ | ||
14 | #define O_APPEND 02000 | ||
15 | #define O_NONBLOCK 04000 | ||
16 | #define O_NDELAY O_NONBLOCK | ||
17 | #define O_SYNC 010000 | ||
18 | #define FASYNC 020000 /* fcntl, for BSD compatibility */ | ||
19 | #define O_DIRECT 040000 /* direct disk access hint */ | ||
20 | #define O_LARGEFILE 0100000 | ||
21 | #define O_DIRECTORY 0200000 /* must be a directory */ | ||
22 | #define O_NOFOLLOW 0400000 /* don't follow links */ | ||
23 | #define O_NOATIME 01000000 | ||
24 | |||
25 | #define F_DUPFD 0 /* dup */ | ||
26 | #define F_GETFD 1 /* get close_on_exec */ | ||
27 | #define F_SETFD 2 /* set/clear close_on_exec */ | ||
28 | #define F_GETFL 3 /* get file->f_flags */ | ||
29 | #define F_SETFL 4 /* set file->f_flags */ | ||
30 | #define F_GETLK 5 | ||
31 | #define F_SETLK 6 | ||
32 | #define F_SETLKW 7 | ||
33 | |||
34 | #define F_SETOWN 8 /* for sockets. */ | ||
35 | #define F_GETOWN 9 /* for sockets. */ | ||
36 | #define F_SETSIG 10 /* for sockets. */ | ||
37 | #define F_GETSIG 11 /* for sockets. */ | ||
38 | |||
39 | #define F_GETLK64 12 /* using 'struct flock64' */ | ||
40 | #define F_SETLK64 13 | ||
41 | #define F_SETLKW64 14 | ||
42 | |||
43 | /* for F_[GET|SET]FL */ | ||
44 | #define FD_CLOEXEC 1 /* actually anything with low bit set goes */ | ||
45 | |||
46 | /* for posix fcntl() and lockf() */ | ||
47 | #define F_RDLCK 0 | ||
48 | #define F_WRLCK 1 | ||
49 | #define F_UNLCK 2 | ||
50 | |||
51 | /* for old implementation of bsd flock () */ | ||
52 | #define F_EXLCK 4 /* or 3 */ | ||
53 | #define F_SHLCK 8 /* or 4 */ | ||
54 | |||
55 | /* for leases */ | ||
56 | #define F_INPROGRESS 16 | ||
57 | |||
58 | /* operations for bsd flock(), also used by the kernel implementation */ | ||
59 | #define LOCK_SH 1 /* shared lock */ | ||
60 | #define LOCK_EX 2 /* exclusive lock */ | ||
61 | #define LOCK_NB 4 /* or'd with one of the above to prevent | ||
62 | blocking */ | ||
63 | #define LOCK_UN 8 /* remove lock */ | ||
64 | |||
65 | #define LOCK_MAND 32 /* This is a mandatory flock */ | ||
66 | #define LOCK_READ 64 /* ... Which allows concurrent read operations */ | ||
67 | #define LOCK_WRITE 128 /* ... Which allows concurrent write operations */ | ||
68 | #define LOCK_RW 192 /* ... Which allows concurrent read & write ops */ | ||
69 | |||
70 | struct flock { | ||
71 | short l_type; | ||
72 | short l_whence; | ||
73 | off_t l_start; | ||
74 | off_t l_len; | ||
75 | pid_t l_pid; | ||
76 | }; | ||
77 | |||
78 | struct flock64 { | ||
79 | short l_type; | ||
80 | short l_whence; | ||
81 | loff_t l_start; | ||
82 | loff_t l_len; | ||
83 | pid_t l_pid; | ||
84 | }; | ||
85 | |||
86 | #define F_LINUX_SPECIFIC_BASE 1024 | ||
87 | #endif /* _ASM_FCNTL_H */ | ||
88 | |||
diff --git a/include/asm-frv/fpu.h b/include/asm-frv/fpu.h new file mode 100644 index 000000000000..b1178f8ca5ce --- /dev/null +++ b/include/asm-frv/fpu.h | |||
@@ -0,0 +1,12 @@ | |||
1 | #ifndef __ASM_FPU_H | ||
2 | #define __ASM_FPU_H | ||
3 | |||
4 | #include <linux/config.h> | ||
5 | |||
6 | /* | ||
7 | * MAX floating point unit state size (FSAVE/FRESTORE) | ||
8 | */ | ||
9 | |||
10 | #define kernel_fpu_end() do { asm volatile("bar":::"memory"); preempt_enable(); } while(0) | ||
11 | |||
12 | #endif /* __ASM_FPU_H */ | ||
diff --git a/include/asm-frv/gdb-stub.h b/include/asm-frv/gdb-stub.h new file mode 100644 index 000000000000..c58479a4be99 --- /dev/null +++ b/include/asm-frv/gdb-stub.h | |||
@@ -0,0 +1,118 @@ | |||
1 | /* gdb-stub.h: FRV GDB stub | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * - Derived from asm-mips/gdb-stub.h (c) 1995 Andreas Busse | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License | ||
9 | * as published by the Free Software Foundation; either version | ||
10 | * 2 of the License, or (at your option) any later version. | ||
11 | */ | ||
12 | #ifndef __ASM_GDB_STUB_H | ||
13 | #define __ASM_GDB_STUB_H | ||
14 | |||
15 | #undef GDBSTUB_DEBUG_PROTOCOL | ||
16 | |||
17 | #include <asm/ptrace.h> | ||
18 | |||
19 | /* | ||
20 | * important register numbers in GDB protocol | ||
21 | * - GR0, GR1, GR2, GR3, GR4, GR5, GR6, GR7, | ||
22 | * - GR8, GR9, GR10, GR11, GR12, GR13, GR14, GR15, | ||
23 | * - GR16, GR17, GR18, GR19, GR20, GR21, GR22, GR23, | ||
24 | * - GR24, GR25, GR26, GR27, GR28, GR29, GR30, GR31, | ||
25 | * - GR32, GR33, GR34, GR35, GR36, GR37, GR38, GR39, | ||
26 | * - GR40, GR41, GR42, GR43, GR44, GR45, GR46, GR47, | ||
27 | * - GR48, GR49, GR50, GR51, GR52, GR53, GR54, GR55, | ||
28 | * - GR56, GR57, GR58, GR59, GR60, GR61, GR62, GR63, | ||
29 | * - FR0, FR1, FR2, FR3, FR4, FR5, FR6, FR7, | ||
30 | * - FR8, FR9, FR10, FR11, FR12, FR13, FR14, FR15, | ||
31 | * - FR16, FR17, FR18, FR19, FR20, FR21, FR22, FR23, | ||
32 | * - FR24, FR25, FR26, FR27, FR28, FR29, FR30, FR31, | ||
33 | * - FR32, FR33, FR34, FR35, FR36, FR37, FR38, FR39, | ||
34 | * - FR40, FR41, FR42, FR43, FR44, FR45, FR46, FR47, | ||
35 | * - FR48, FR49, FR50, FR51, FR52, FR53, FR54, FR55, | ||
36 | * - FR56, FR57, FR58, FR59, FR60, FR61, FR62, FR63, | ||
37 | * - PC, PSR, CCR, CCCR, | ||
38 | * - _X132, _X133, _X134 | ||
39 | * - TBR, BRR, DBAR0, DBAR1, DBAR2, DBAR3, | ||
40 | * - SCR0, SCR1, SCR2, SCR3, | ||
41 | * - LR, LCR, | ||
42 | * - IACC0H, IACC0L, | ||
43 | * - FSR0, | ||
44 | * - ACC0, ACC1, ACC2, ACC3, ACC4, ACC5, ACC6, ACC7, | ||
45 | * - ACCG0123, ACCG4567, | ||
46 | * - MSR0, MSR1, | ||
47 | * - GNER0, GNER1, | ||
48 | * - FNER0, FNER1, | ||
49 | */ | ||
50 | #define GDB_REG_GR(N) (N) | ||
51 | #define GDB_REG_FR(N) (64+(N)) | ||
52 | #define GDB_REG_PC 128 | ||
53 | #define GDB_REG_PSR 129 | ||
54 | #define GDB_REG_CCR 130 | ||
55 | #define GDB_REG_CCCR 131 | ||
56 | #define GDB_REG_TBR 135 | ||
57 | #define GDB_REG_BRR 136 | ||
58 | #define GDB_REG_DBAR(N) (137+(N)) | ||
59 | #define GDB_REG_SCR(N) (141+(N)) | ||
60 | #define GDB_REG_LR 145 | ||
61 | #define GDB_REG_LCR 146 | ||
62 | #define GDB_REG_FSR0 149 | ||
63 | #define GDB_REG_ACC(N) (150+(N)) | ||
64 | #define GDB_REG_ACCG(N) (158+(N)/4) | ||
65 | #define GDB_REG_MSR(N) (160+(N)) | ||
66 | #define GDB_REG_GNER(N) (162+(N)) | ||
67 | #define GDB_REG_FNER(N) (164+(N)) | ||
68 | |||
69 | #define GDB_REG_SP GDB_REG_GR(1) | ||
70 | #define GDB_REG_FP GDB_REG_GR(2) | ||
71 | |||
72 | #ifndef _LANGUAGE_ASSEMBLY | ||
73 | |||
74 | /* | ||
75 | * Prototypes | ||
76 | */ | ||
77 | extern void show_registers_only(struct pt_regs *regs); | ||
78 | |||
79 | extern void gdbstub_init(void); | ||
80 | extern void gdbstub(int type); | ||
81 | extern void gdbstub_exit(int status); | ||
82 | |||
83 | extern void gdbstub_io_init(void); | ||
84 | extern void gdbstub_set_baud(unsigned baud); | ||
85 | extern int gdbstub_rx_char(unsigned char *_ch, int nonblock); | ||
86 | extern void gdbstub_tx_char(unsigned char ch); | ||
87 | extern void gdbstub_tx_flush(void); | ||
88 | extern void gdbstub_do_rx(void); | ||
89 | |||
90 | extern asmlinkage void __debug_stub_init_break(void); | ||
91 | extern asmlinkage void __break_hijack_kernel_event(void); | ||
92 | extern asmlinkage void start_kernel(void); | ||
93 | |||
94 | extern asmlinkage void gdbstub_rx_handler(void); | ||
95 | extern asmlinkage void gdbstub_rx_irq(void); | ||
96 | extern asmlinkage void gdbstub_intercept(void); | ||
97 | |||
98 | extern uint32_t __entry_usertrap_table[]; | ||
99 | extern uint32_t __entry_kerneltrap_table[]; | ||
100 | |||
101 | extern volatile u8 gdbstub_rx_buffer[PAGE_SIZE]; | ||
102 | extern volatile u32 gdbstub_rx_inp; | ||
103 | extern volatile u32 gdbstub_rx_outp; | ||
104 | extern volatile u8 gdbstub_rx_overflow; | ||
105 | extern u8 gdbstub_rx_unget; | ||
106 | |||
107 | extern void gdbstub_printk(const char *fmt, ...); | ||
108 | extern void debug_to_serial(const char *p, int n); | ||
109 | extern void console_set_baud(unsigned baud); | ||
110 | |||
111 | #ifdef GDBSTUB_DEBUG_PROTOCOL | ||
112 | #define gdbstub_proto(FMT,...) gdbstub_printk(FMT,##__VA_ARGS__) | ||
113 | #else | ||
114 | #define gdbstub_proto(FMT,...) ({ 0; }) | ||
115 | #endif | ||
116 | |||
117 | #endif /* _LANGUAGE_ASSEMBLY */ | ||
118 | #endif /* __ASM_GDB_STUB_H */ | ||
diff --git a/include/asm-frv/gpio-regs.h b/include/asm-frv/gpio-regs.h new file mode 100644 index 000000000000..9edf5d5d4d3f --- /dev/null +++ b/include/asm-frv/gpio-regs.h | |||
@@ -0,0 +1,116 @@ | |||
1 | /* gpio-regs.h: on-chip general purpose I/O registers | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_GPIO_REGS | ||
13 | #define _ASM_GPIO_REGS | ||
14 | |||
15 | #define __reg(ADDR) (*(volatile unsigned long *)(ADDR)) | ||
16 | |||
17 | #define __get_PDR() ({ __reg(0xfeff0400); }) | ||
18 | #define __set_PDR(V) do { __reg(0xfeff0400) = (V); mb(); } while(0) | ||
19 | |||
20 | #define __get_GPDR() ({ __reg(0xfeff0408); }) | ||
21 | #define __set_GPDR(V) do { __reg(0xfeff0408) = (V); mb(); } while(0) | ||
22 | |||
23 | #define __get_SIR() ({ __reg(0xfeff0410); }) | ||
24 | #define __set_SIR(V) do { __reg(0xfeff0410) = (V); mb(); } while(0) | ||
25 | |||
26 | #define __get_SOR() ({ __reg(0xfeff0418); }) | ||
27 | #define __set_SOR(V) do { __reg(0xfeff0418) = (V); mb(); } while(0) | ||
28 | |||
29 | #define __set_PDSR(V) do { __reg(0xfeff0420) = (V); mb(); } while(0) | ||
30 | |||
31 | #define __set_PDCR(V) do { __reg(0xfeff0428) = (V); mb(); } while(0) | ||
32 | |||
33 | #define __get_RSTR() ({ __reg(0xfeff0500); }) | ||
34 | #define __set_RSTR(V) do { __reg(0xfeff0500) = (V); mb(); } while(0) | ||
35 | |||
36 | |||
37 | |||
38 | /* PDR definitions */ | ||
39 | #define PDR_GPIO_DATA(X) (1 << (X)) | ||
40 | |||
41 | /* GPDR definitions */ | ||
42 | #define GPDR_INPUT 0 | ||
43 | #define GPDR_OUTPUT 1 | ||
44 | #define GPDR_DREQ0_BIT 0x00001000 | ||
45 | #define GPDR_DREQ1_BIT 0x00008000 | ||
46 | #define GPDR_DREQ2_BIT 0x00040000 | ||
47 | #define GPDR_DREQ3_BIT 0x00080000 | ||
48 | #define GPDR_DREQ4_BIT 0x00004000 | ||
49 | #define GPDR_DREQ5_BIT 0x00020000 | ||
50 | #define GPDR_DREQ6_BIT 0x00100000 | ||
51 | #define GPDR_DREQ7_BIT 0x00200000 | ||
52 | #define GPDR_DACK0_BIT 0x00002000 | ||
53 | #define GPDR_DACK1_BIT 0x00010000 | ||
54 | #define GPDR_DACK2_BIT 0x00100000 | ||
55 | #define GPDR_DACK3_BIT 0x00200000 | ||
56 | #define GPDR_DONE0_BIT 0x00004000 | ||
57 | #define GPDR_DONE1_BIT 0x00020000 | ||
58 | #define GPDR_GPIO_DIR(X,D) ((D) << (X)) | ||
59 | |||
60 | /* SIR definitions */ | ||
61 | #define SIR_GPIO_INPUT 0 | ||
62 | #define SIR_DREQ7_INPUT 0x00200000 | ||
63 | #define SIR_DREQ6_INPUT 0x00100000 | ||
64 | #define SIR_DREQ3_INPUT 0x00080000 | ||
65 | #define SIR_DREQ2_INPUT 0x00040000 | ||
66 | #define SIR_DREQ5_INPUT 0x00020000 | ||
67 | #define SIR_DREQ1_INPUT 0x00008000 | ||
68 | #define SIR_DREQ4_INPUT 0x00004000 | ||
69 | #define SIR_DREQ0_INPUT 0x00001000 | ||
70 | #define SIR_RXD1_INPUT 0x00000400 | ||
71 | #define SIR_CTS0_INPUT 0x00000100 | ||
72 | #define SIR_RXD0_INPUT 0x00000040 | ||
73 | #define SIR_GATE1_INPUT 0x00000020 | ||
74 | #define SIR_GATE0_INPUT 0x00000010 | ||
75 | #define SIR_IRQ3_INPUT 0x00000008 | ||
76 | #define SIR_IRQ2_INPUT 0x00000004 | ||
77 | #define SIR_IRQ1_INPUT 0x00000002 | ||
78 | #define SIR_IRQ0_INPUT 0x00000001 | ||
79 | #define SIR_DREQ_BITS (SIR_DREQ0_INPUT | SIR_DREQ1_INPUT | \ | ||
80 | SIR_DREQ2_INPUT | SIR_DREQ3_INPUT | \ | ||
81 | SIR_DREQ4_INPUT | SIR_DREQ5_INPUT | \ | ||
82 | SIR_DREQ6_INPUT | SIR_DREQ7_INPUT) | ||
83 | |||
84 | /* SOR definitions */ | ||
85 | #define SOR_GPIO_OUTPUT 0 | ||
86 | #define SOR_DACK3_OUTPUT 0x00200000 | ||
87 | #define SOR_DACK2_OUTPUT 0x00100000 | ||
88 | #define SOR_DONE1_OUTPUT 0x00020000 | ||
89 | #define SOR_DACK1_OUTPUT 0x00010000 | ||
90 | #define SOR_DONE0_OUTPUT 0x00004000 | ||
91 | #define SOR_DACK0_OUTPUT 0x00002000 | ||
92 | #define SOR_TXD1_OUTPUT 0x00000800 | ||
93 | #define SOR_RTS0_OUTPUT 0x00000200 | ||
94 | #define SOR_TXD0_OUTPUT 0x00000080 | ||
95 | #define SOR_TOUT1_OUTPUT 0x00000020 | ||
96 | #define SOR_TOUT0_OUTPUT 0x00000010 | ||
97 | #define SOR_DONE_BITS (SOR_DONE0_OUTPUT | SOR_DONE1_OUTPUT) | ||
98 | #define SOR_DACK_BITS (SOR_DACK0_OUTPUT | SOR_DACK1_OUTPUT | \ | ||
99 | SOR_DACK2_OUTPUT | SOR_DACK3_OUTPUT) | ||
100 | |||
101 | /* PDSR definitions */ | ||
102 | #define PDSR_UNCHANGED 0 | ||
103 | #define PDSR_SET_BIT(X) (1 << (X)) | ||
104 | |||
105 | /* PDCR definitions */ | ||
106 | #define PDCR_UNCHANGED 0 | ||
107 | #define PDCR_CLEAR_BIT(X) (1 << (X)) | ||
108 | |||
109 | /* RSTR definitions */ | ||
110 | /* Read Only */ | ||
111 | #define RSTR_POWERON 0x00000400 | ||
112 | #define RSTR_SOFTRESET_STATUS 0x00000100 | ||
113 | /* Write Only */ | ||
114 | #define RSTR_SOFTRESET 0x00000001 | ||
115 | |||
116 | #endif /* _ASM_GPIO_REGS */ | ||
diff --git a/include/asm-frv/hardirq.h b/include/asm-frv/hardirq.h new file mode 100644 index 000000000000..5248ca054909 --- /dev/null +++ b/include/asm-frv/hardirq.h | |||
@@ -0,0 +1,30 @@ | |||
1 | /* hardirq.h: FRV hardware IRQ management | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef __ASM_HARDIRQ_H | ||
13 | #define __ASM_HARDIRQ_H | ||
14 | |||
15 | #include <linux/config.h> | ||
16 | #include <linux/threads.h> | ||
17 | |||
18 | typedef struct { | ||
19 | unsigned int __softirq_pending; | ||
20 | unsigned long idle_timestamp; | ||
21 | } ____cacheline_aligned irq_cpustat_t; | ||
22 | |||
23 | #include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */ | ||
24 | |||
25 | #ifdef CONFIG_SMP | ||
26 | #error SMP not available on FR-V | ||
27 | #endif /* CONFIG_SMP */ | ||
28 | |||
29 | |||
30 | #endif | ||
diff --git a/include/asm-frv/highmem.h b/include/asm-frv/highmem.h new file mode 100644 index 000000000000..295f74a57f22 --- /dev/null +++ b/include/asm-frv/highmem.h | |||
@@ -0,0 +1,181 @@ | |||
1 | /* highmem.h: virtual kernel memory mappings for high memory | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * - Derived from include/asm-i386/highmem.h | ||
6 | * | ||
7 | * See Documentation/fujitsu/frv/mmu-layout.txt for more information. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or | ||
10 | * modify it under the terms of the GNU General Public License | ||
11 | * as published by the Free Software Foundation; either version | ||
12 | * 2 of the License, or (at your option) any later version. | ||
13 | */ | ||
14 | |||
15 | #ifndef _ASM_HIGHMEM_H | ||
16 | #define _ASM_HIGHMEM_H | ||
17 | |||
18 | #ifdef __KERNEL__ | ||
19 | |||
20 | #include <linux/config.h> | ||
21 | #include <linux/init.h> | ||
22 | #include <asm/mem-layout.h> | ||
23 | #include <asm/spr-regs.h> | ||
24 | #include <asm/mb-regs.h> | ||
25 | |||
26 | #define NR_TLB_LINES 64 /* number of lines in the TLB */ | ||
27 | |||
28 | #ifndef __ASSEMBLY__ | ||
29 | |||
30 | #include <linux/interrupt.h> | ||
31 | #include <asm/kmap_types.h> | ||
32 | #include <asm/pgtable.h> | ||
33 | |||
34 | #ifdef CONFIG_DEBUG_HIGHMEM | ||
35 | #define HIGHMEM_DEBUG 1 | ||
36 | #else | ||
37 | #define HIGHMEM_DEBUG 0 | ||
38 | #endif | ||
39 | |||
40 | /* declarations for highmem.c */ | ||
41 | extern unsigned long highstart_pfn, highend_pfn; | ||
42 | |||
43 | #define kmap_prot PAGE_KERNEL | ||
44 | #define kmap_pte ______kmap_pte_in_TLB | ||
45 | extern pte_t *pkmap_page_table; | ||
46 | |||
47 | #define flush_cache_kmaps() do { } while (0) | ||
48 | |||
49 | /* | ||
50 | * Right now we initialize only a single pte table. It can be extended | ||
51 | * easily, subsequent pte tables have to be allocated in one physical | ||
52 | * chunk of RAM. | ||
53 | */ | ||
54 | #define LAST_PKMAP PTRS_PER_PTE | ||
55 | #define LAST_PKMAP_MASK (LAST_PKMAP - 1) | ||
56 | #define PKMAP_NR(virt) ((virt - PKMAP_BASE) >> PAGE_SHIFT) | ||
57 | #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT)) | ||
58 | |||
59 | extern void *kmap_high(struct page *page); | ||
60 | extern void kunmap_high(struct page *page); | ||
61 | |||
62 | extern void *kmap(struct page *page); | ||
63 | extern void kunmap(struct page *page); | ||
64 | |||
65 | extern struct page *kmap_atomic_to_page(void *ptr); | ||
66 | |||
67 | #endif /* !__ASSEMBLY__ */ | ||
68 | |||
69 | /* | ||
70 | * The use of kmap_atomic/kunmap_atomic is discouraged - kmap/kunmap | ||
71 | * gives a more generic (and caching) interface. But kmap_atomic can | ||
72 | * be used in IRQ contexts, so in some (very limited) cases we need | ||
73 | * it. | ||
74 | */ | ||
75 | #define KMAP_ATOMIC_CACHE_DAMR 8 | ||
76 | |||
77 | #ifndef __ASSEMBLY__ | ||
78 | |||
79 | #define __kmap_atomic_primary(type, paddr, ampr) \ | ||
80 | ({ \ | ||
81 | unsigned long damlr, dampr; \ | ||
82 | \ | ||
83 | dampr = paddr | xAMPRx_L | xAMPRx_M | xAMPRx_S | xAMPRx_SS_16Kb | xAMPRx_V; \ | ||
84 | \ | ||
85 | if (type != __KM_CACHE) \ | ||
86 | asm volatile("movgs %0,dampr"#ampr :: "r"(dampr)); \ | ||
87 | else \ | ||
88 | asm volatile("movgs %0,iampr"#ampr"\n" \ | ||
89 | "movgs %0,dampr"#ampr"\n" \ | ||
90 | :: "r"(dampr) \ | ||
91 | ); \ | ||
92 | \ | ||
93 | asm("movsg damlr"#ampr",%0" : "=r"(damlr)); \ | ||
94 | \ | ||
95 | /*printk("DAMR"#ampr": PRIM sl=%d L=%08lx P=%08lx\n", type, damlr, dampr);*/ \ | ||
96 | \ | ||
97 | (void *) damlr; \ | ||
98 | }) | ||
99 | |||
100 | #define __kmap_atomic_secondary(slot, paddr) \ | ||
101 | ({ \ | ||
102 | unsigned long damlr = KMAP_ATOMIC_SECONDARY_FRAME + (slot) * PAGE_SIZE; \ | ||
103 | unsigned long dampr = paddr | xAMPRx_L | xAMPRx_M | xAMPRx_S | xAMPRx_SS_16Kb | xAMPRx_V; \ | ||
104 | \ | ||
105 | asm volatile("movgs %0,tplr \n" \ | ||
106 | "movgs %1,tppr \n" \ | ||
107 | "tlbpr %0,gr0,#2,#1" \ | ||
108 | : : "r"(damlr), "r"(dampr)); \ | ||
109 | \ | ||
110 | /*printk("TLB: SECN sl=%d L=%08lx P=%08lx\n", slot, damlr, dampr);*/ \ | ||
111 | \ | ||
112 | (void *) damlr; \ | ||
113 | }) | ||
114 | |||
115 | static inline void *kmap_atomic(struct page *page, enum km_type type) | ||
116 | { | ||
117 | unsigned long paddr; | ||
118 | |||
119 | preempt_disable(); | ||
120 | paddr = page_to_phys(page); | ||
121 | |||
122 | switch (type) { | ||
123 | case 0: return __kmap_atomic_primary(0, paddr, 2); | ||
124 | case 1: return __kmap_atomic_primary(1, paddr, 3); | ||
125 | case 2: return __kmap_atomic_primary(2, paddr, 4); | ||
126 | case 3: return __kmap_atomic_primary(3, paddr, 5); | ||
127 | case 4: return __kmap_atomic_primary(4, paddr, 6); | ||
128 | case 5: return __kmap_atomic_primary(5, paddr, 7); | ||
129 | case 6: return __kmap_atomic_primary(6, paddr, 8); | ||
130 | case 7: return __kmap_atomic_primary(7, paddr, 9); | ||
131 | case 8: return __kmap_atomic_primary(8, paddr, 10); | ||
132 | |||
133 | case 9 ... 9 + NR_TLB_LINES - 1: | ||
134 | return __kmap_atomic_secondary(type - 9, paddr); | ||
135 | |||
136 | default: | ||
137 | BUG(); | ||
138 | return 0; | ||
139 | } | ||
140 | } | ||
141 | |||
142 | #define __kunmap_atomic_primary(type, ampr) \ | ||
143 | do { \ | ||
144 | asm volatile("movgs gr0,dampr"#ampr"\n"); \ | ||
145 | if (type == __KM_CACHE) \ | ||
146 | asm volatile("movgs gr0,iampr"#ampr"\n"); \ | ||
147 | } while(0) | ||
148 | |||
149 | #define __kunmap_atomic_secondary(slot, vaddr) \ | ||
150 | do { \ | ||
151 | asm volatile("tlbpr %0,gr0,#4,#1" : : "r"(vaddr)); \ | ||
152 | } while(0) | ||
153 | |||
154 | static inline void kunmap_atomic(void *kvaddr, enum km_type type) | ||
155 | { | ||
156 | switch (type) { | ||
157 | case 0: __kunmap_atomic_primary(0, 2); break; | ||
158 | case 1: __kunmap_atomic_primary(1, 3); break; | ||
159 | case 2: __kunmap_atomic_primary(2, 4); break; | ||
160 | case 3: __kunmap_atomic_primary(3, 5); break; | ||
161 | case 4: __kunmap_atomic_primary(4, 6); break; | ||
162 | case 5: __kunmap_atomic_primary(5, 7); break; | ||
163 | case 6: __kunmap_atomic_primary(6, 8); break; | ||
164 | case 7: __kunmap_atomic_primary(7, 9); break; | ||
165 | case 8: __kunmap_atomic_primary(8, 10); break; | ||
166 | |||
167 | case 9 ... 9 + NR_TLB_LINES - 1: | ||
168 | __kunmap_atomic_secondary(type - 9, kvaddr); | ||
169 | break; | ||
170 | |||
171 | default: | ||
172 | BUG(); | ||
173 | } | ||
174 | preempt_enable(); | ||
175 | } | ||
176 | |||
177 | #endif /* !__ASSEMBLY__ */ | ||
178 | |||
179 | #endif /* __KERNEL__ */ | ||
180 | |||
181 | #endif /* _ASM_HIGHMEM_H */ | ||
diff --git a/include/asm-frv/hw_irq.h b/include/asm-frv/hw_irq.h new file mode 100644 index 000000000000..522ad37923d8 --- /dev/null +++ b/include/asm-frv/hw_irq.h | |||
@@ -0,0 +1,16 @@ | |||
1 | /* hw_irq.h: FR-V specific h/w IRQ stuff | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_HW_IRQ_H | ||
13 | #define _ASM_HW_IRQ_H | ||
14 | |||
15 | |||
16 | #endif /* _ASM_HW_IRQ_H */ | ||
diff --git a/include/asm-frv/ide.h b/include/asm-frv/ide.h new file mode 100644 index 000000000000..f9caecf7e3c0 --- /dev/null +++ b/include/asm-frv/ide.h | |||
@@ -0,0 +1,43 @@ | |||
1 | /* ide.h: FRV IDE declarations | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_IDE_H | ||
13 | #define _ASM_IDE_H | ||
14 | |||
15 | #ifdef __KERNEL__ | ||
16 | |||
17 | #include <linux/config.h> | ||
18 | #include <asm/setup.h> | ||
19 | #include <asm/io.h> | ||
20 | #include <asm/irq.h> | ||
21 | |||
22 | #undef SUPPORT_SLOW_DATA_PORTS | ||
23 | #define SUPPORT_SLOW_DATA_PORTS 0 | ||
24 | |||
25 | #undef SUPPORT_VLB_SYNC | ||
26 | #define SUPPORT_VLB_SYNC 0 | ||
27 | |||
28 | #ifndef MAX_HWIFS | ||
29 | #define MAX_HWIFS 8 | ||
30 | #endif | ||
31 | |||
32 | /****************************************************************************/ | ||
33 | /* | ||
34 | * some bits needed for parts of the IDE subsystem to compile | ||
35 | */ | ||
36 | #define __ide_mm_insw(port, addr, n) insw(port, addr, n) | ||
37 | #define __ide_mm_insl(port, addr, n) insl(port, addr, n) | ||
38 | #define __ide_mm_outsw(port, addr, n) outsw(port, addr, n) | ||
39 | #define __ide_mm_outsl(port, addr, n) outsl(port, addr, n) | ||
40 | |||
41 | |||
42 | #endif /* __KERNEL__ */ | ||
43 | #endif /* _ASM_IDE_H */ | ||
diff --git a/include/asm-frv/init.h b/include/asm-frv/init.h new file mode 100644 index 000000000000..8b15838de216 --- /dev/null +++ b/include/asm-frv/init.h | |||
@@ -0,0 +1,12 @@ | |||
1 | #ifndef _ASM_INIT_H | ||
2 | #define _ASM_INIT_H | ||
3 | |||
4 | #define __init __attribute__ ((__section__ (".text.init"))) | ||
5 | #define __initdata __attribute__ ((__section__ (".data.init"))) | ||
6 | /* For assembly routines */ | ||
7 | #define __INIT .section ".text.init",#alloc,#execinstr | ||
8 | #define __FINIT .previous | ||
9 | #define __INITDATA .section ".data.init",#alloc,#write | ||
10 | |||
11 | #endif | ||
12 | |||
diff --git a/include/asm-frv/io.h b/include/asm-frv/io.h new file mode 100644 index 000000000000..48829f727242 --- /dev/null +++ b/include/asm-frv/io.h | |||
@@ -0,0 +1,290 @@ | |||
1 | /* io.h: FRV I/O operations | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | * | ||
11 | * This gets interesting when talking to the PCI bus - the CPU is in big endian | ||
12 | * mode, the PCI bus is little endian and the hardware in the middle can do | ||
13 | * byte swapping | ||
14 | */ | ||
15 | #ifndef _ASM_IO_H | ||
16 | #define _ASM_IO_H | ||
17 | |||
18 | #ifdef __KERNEL__ | ||
19 | |||
20 | #include <linux/config.h> | ||
21 | #include <asm/virtconvert.h> | ||
22 | #include <asm/string.h> | ||
23 | #include <asm/mb-regs.h> | ||
24 | #include <linux/delay.h> | ||
25 | |||
26 | /* | ||
27 | * swap functions are sometimes needed to interface little-endian hardware | ||
28 | */ | ||
29 | |||
30 | static inline unsigned short _swapw(unsigned short v) | ||
31 | { | ||
32 | return ((v << 8) | (v >> 8)); | ||
33 | } | ||
34 | |||
35 | static inline unsigned long _swapl(unsigned long v) | ||
36 | { | ||
37 | return ((v << 24) | ((v & 0xff00) << 8) | ((v & 0xff0000) >> 8) | (v >> 24)); | ||
38 | } | ||
39 | |||
40 | //#define __iormb() asm volatile("membar") | ||
41 | //#define __iowmb() asm volatile("membar") | ||
42 | |||
43 | #define __raw_readb(addr) __builtin_read8((void *) (addr)) | ||
44 | #define __raw_readw(addr) __builtin_read16((void *) (addr)) | ||
45 | #define __raw_readl(addr) __builtin_read32((void *) (addr)) | ||
46 | |||
47 | #define __raw_writeb(datum, addr) __builtin_write8((void *) (addr), datum) | ||
48 | #define __raw_writew(datum, addr) __builtin_write16((void *) (addr), datum) | ||
49 | #define __raw_writel(datum, addr) __builtin_write32((void *) (addr), datum) | ||
50 | |||
51 | static inline void io_outsb(unsigned int addr, const void *buf, int len) | ||
52 | { | ||
53 | unsigned long __ioaddr = (unsigned long) addr; | ||
54 | const uint8_t *bp = buf; | ||
55 | |||
56 | while (len--) | ||
57 | __builtin_write8((volatile void __iomem *) __ioaddr, *bp++); | ||
58 | } | ||
59 | |||
60 | static inline void io_outsw(unsigned int addr, const void *buf, int len) | ||
61 | { | ||
62 | unsigned long __ioaddr = (unsigned long) addr; | ||
63 | const uint16_t *bp = buf; | ||
64 | |||
65 | while (len--) | ||
66 | __builtin_write16((volatile void __iomem *) __ioaddr, (*bp++)); | ||
67 | } | ||
68 | |||
69 | extern void __outsl_ns(unsigned int addr, const void *buf, int len); | ||
70 | extern void __outsl_sw(unsigned int addr, const void *buf, int len); | ||
71 | static inline void __outsl(unsigned int addr, const void *buf, int len, int swap) | ||
72 | { | ||
73 | unsigned long __ioaddr = (unsigned long) addr; | ||
74 | |||
75 | if (!swap) | ||
76 | __outsl_ns(__ioaddr, buf, len); | ||
77 | else | ||
78 | __outsl_sw(__ioaddr, buf, len); | ||
79 | } | ||
80 | |||
81 | static inline void io_insb(unsigned long addr, void *buf, int len) | ||
82 | { | ||
83 | uint8_t *bp = buf; | ||
84 | |||
85 | while (len--) | ||
86 | *bp++ = __builtin_read8((volatile void __iomem *) addr); | ||
87 | } | ||
88 | |||
89 | static inline void io_insw(unsigned long addr, void *buf, int len) | ||
90 | { | ||
91 | uint16_t *bp = buf; | ||
92 | |||
93 | while (len--) | ||
94 | *bp++ = __builtin_read16((volatile void __iomem *) addr); | ||
95 | } | ||
96 | |||
97 | extern void __insl_ns(unsigned long addr, void *buf, int len); | ||
98 | extern void __insl_sw(unsigned long addr, void *buf, int len); | ||
99 | static inline void __insl(unsigned long addr, void *buf, int len, int swap) | ||
100 | { | ||
101 | if (!swap) | ||
102 | __insl_ns(addr, buf, len); | ||
103 | else | ||
104 | __insl_sw(addr, buf, len); | ||
105 | } | ||
106 | |||
107 | /* | ||
108 | * make the short names macros so specific devices | ||
109 | * can override them as required | ||
110 | */ | ||
111 | |||
112 | static inline void memset_io(volatile void __iomem *addr, unsigned char val, int count) | ||
113 | { | ||
114 | memset((void __force *) addr, val, count); | ||
115 | } | ||
116 | |||
117 | static inline void memcpy_fromio(void *dst, volatile void __iomem *src, int count) | ||
118 | { | ||
119 | memcpy(dst, (void __force *) src, count); | ||
120 | } | ||
121 | |||
122 | static inline void memcpy_toio(volatile void __iomem *dst, const void *src, int count) | ||
123 | { | ||
124 | memcpy((void __force *) dst, src, count); | ||
125 | } | ||
126 | |||
127 | static inline uint8_t inb(unsigned long addr) | ||
128 | { | ||
129 | return __builtin_read8((void *)addr); | ||
130 | } | ||
131 | |||
132 | static inline uint16_t inw(unsigned long addr) | ||
133 | { | ||
134 | uint16_t ret = __builtin_read16((void *)addr); | ||
135 | |||
136 | if (__is_PCI_IO(addr)) | ||
137 | ret = _swapw(ret); | ||
138 | |||
139 | return ret; | ||
140 | } | ||
141 | |||
142 | static inline uint32_t inl(unsigned long addr) | ||
143 | { | ||
144 | uint32_t ret = __builtin_read32((void *)addr); | ||
145 | |||
146 | if (__is_PCI_IO(addr)) | ||
147 | ret = _swapl(ret); | ||
148 | |||
149 | return ret; | ||
150 | } | ||
151 | |||
152 | static inline void outb(uint8_t datum, unsigned long addr) | ||
153 | { | ||
154 | __builtin_write8((void *)addr, datum); | ||
155 | } | ||
156 | |||
157 | static inline void outw(uint16_t datum, unsigned long addr) | ||
158 | { | ||
159 | if (__is_PCI_IO(addr)) | ||
160 | datum = _swapw(datum); | ||
161 | __builtin_write16((void *)addr, datum); | ||
162 | } | ||
163 | |||
164 | static inline void outl(uint32_t datum, unsigned long addr) | ||
165 | { | ||
166 | if (__is_PCI_IO(addr)) | ||
167 | datum = _swapl(datum); | ||
168 | __builtin_write32((void *)addr, datum); | ||
169 | } | ||
170 | |||
171 | #define inb_p(addr) inb(addr) | ||
172 | #define inw_p(addr) inw(addr) | ||
173 | #define inl_p(addr) inl(addr) | ||
174 | #define outb_p(x,addr) outb(x,addr) | ||
175 | #define outw_p(x,addr) outw(x,addr) | ||
176 | #define outl_p(x,addr) outl(x,addr) | ||
177 | |||
178 | #define outsb(a,b,l) io_outsb(a,b,l) | ||
179 | #define outsw(a,b,l) io_outsw(a,b,l) | ||
180 | #define outsl(a,b,l) __outsl(a,b,l,0) | ||
181 | |||
182 | #define insb(a,b,l) io_insb(a,b,l) | ||
183 | #define insw(a,b,l) io_insw(a,b,l) | ||
184 | #define insl(a,b,l) __insl(a,b,l,0) | ||
185 | |||
186 | #define IO_SPACE_LIMIT 0xffffffff | ||
187 | |||
188 | static inline uint8_t readb(const volatile void __iomem *addr) | ||
189 | { | ||
190 | return __builtin_read8((volatile uint8_t __force *) addr); | ||
191 | } | ||
192 | |||
193 | static inline uint16_t readw(const volatile void __iomem *addr) | ||
194 | { | ||
195 | uint16_t ret = __builtin_read16((volatile uint16_t __force *)addr); | ||
196 | |||
197 | if (__is_PCI_MEM(addr)) | ||
198 | ret = _swapw(ret); | ||
199 | return ret; | ||
200 | } | ||
201 | |||
202 | static inline uint32_t readl(const volatile void __iomem *addr) | ||
203 | { | ||
204 | uint32_t ret = __builtin_read32((volatile uint32_t __force *)addr); | ||
205 | |||
206 | if (__is_PCI_MEM(addr)) | ||
207 | ret = _swapl(ret); | ||
208 | |||
209 | return ret; | ||
210 | } | ||
211 | |||
212 | static inline void writeb(uint8_t datum, volatile void __iomem *addr) | ||
213 | { | ||
214 | __builtin_write8((volatile uint8_t __force *) addr, datum); | ||
215 | if (__is_PCI_MEM(addr)) | ||
216 | __flush_PCI_writes(); | ||
217 | } | ||
218 | |||
219 | static inline void writew(uint16_t datum, volatile void __iomem *addr) | ||
220 | { | ||
221 | if (__is_PCI_MEM(addr)) | ||
222 | datum = _swapw(datum); | ||
223 | |||
224 | __builtin_write16((volatile uint16_t __force *) addr, datum); | ||
225 | if (__is_PCI_MEM(addr)) | ||
226 | __flush_PCI_writes(); | ||
227 | } | ||
228 | |||
229 | static inline void writel(uint32_t datum, volatile void __iomem *addr) | ||
230 | { | ||
231 | if (__is_PCI_MEM(addr)) | ||
232 | datum = _swapl(datum); | ||
233 | |||
234 | __builtin_write32((volatile uint32_t __force *) addr, datum); | ||
235 | if (__is_PCI_MEM(addr)) | ||
236 | __flush_PCI_writes(); | ||
237 | } | ||
238 | |||
239 | |||
240 | /* Values for nocacheflag and cmode */ | ||
241 | #define IOMAP_FULL_CACHING 0 | ||
242 | #define IOMAP_NOCACHE_SER 1 | ||
243 | #define IOMAP_NOCACHE_NONSER 2 | ||
244 | #define IOMAP_WRITETHROUGH 3 | ||
245 | |||
246 | extern void __iomem *__ioremap(unsigned long physaddr, unsigned long size, int cacheflag); | ||
247 | extern void __iounmap(void __iomem *addr, unsigned long size); | ||
248 | |||
249 | static inline void __iomem *ioremap(unsigned long physaddr, unsigned long size) | ||
250 | { | ||
251 | return __ioremap(physaddr, size, IOMAP_NOCACHE_SER); | ||
252 | } | ||
253 | |||
254 | static inline void __iomem *ioremap_nocache(unsigned long physaddr, unsigned long size) | ||
255 | { | ||
256 | return __ioremap(physaddr, size, IOMAP_NOCACHE_SER); | ||
257 | } | ||
258 | |||
259 | static inline void __iomem *ioremap_writethrough(unsigned long physaddr, unsigned long size) | ||
260 | { | ||
261 | return __ioremap(physaddr, size, IOMAP_WRITETHROUGH); | ||
262 | } | ||
263 | |||
264 | static inline void __iomem *ioremap_fullcache(unsigned long physaddr, unsigned long size) | ||
265 | { | ||
266 | return __ioremap(physaddr, size, IOMAP_FULL_CACHING); | ||
267 | } | ||
268 | |||
269 | extern void iounmap(void __iomem *addr); | ||
270 | |||
271 | static inline void flush_write_buffers(void) | ||
272 | { | ||
273 | __asm__ __volatile__ ("membar" : : :"memory"); | ||
274 | } | ||
275 | |||
276 | |||
277 | /* | ||
278 | * Convert a physical pointer to a virtual kernel pointer for /dev/mem | ||
279 | * access | ||
280 | */ | ||
281 | #define xlate_dev_mem_ptr(p) __va(p) | ||
282 | |||
283 | /* | ||
284 | * Convert a virtual cached pointer to an uncached pointer | ||
285 | */ | ||
286 | #define xlate_dev_kmem_ptr(p) p | ||
287 | |||
288 | #endif /* __KERNEL__ */ | ||
289 | |||
290 | #endif /* _ASM_IO_H */ | ||
diff --git a/include/asm-frv/ioctl.h b/include/asm-frv/ioctl.h new file mode 100644 index 000000000000..8aee76905545 --- /dev/null +++ b/include/asm-frv/ioctl.h | |||
@@ -0,0 +1,80 @@ | |||
1 | /* | ||
2 | * linux/ioctl.h for Linux by H.H. Bergman. | ||
3 | */ | ||
4 | |||
5 | #ifndef _ASM_IOCTL_H | ||
6 | #define _ASM_IOCTL_H | ||
7 | |||
8 | /* ioctl command encoding: 32 bits total, command in lower 16 bits, | ||
9 | * size of the parameter structure in the lower 14 bits of the | ||
10 | * upper 16 bits. | ||
11 | * Encoding the size of the parameter structure in the ioctl request | ||
12 | * is useful for catching programs compiled with old versions | ||
13 | * and to avoid overwriting user space outside the user buffer area. | ||
14 | * The highest 2 bits are reserved for indicating the ``access mode''. | ||
15 | * NOTE: This limits the max parameter size to 16kB -1 ! | ||
16 | */ | ||
17 | |||
18 | /* | ||
19 | * I don't really have any idea about what this should look like, so | ||
20 | * for the time being, this is heavily based on the PC definitions. | ||
21 | */ | ||
22 | |||
23 | /* | ||
24 | * The following is for compatibility across the various Linux | ||
25 | * platforms. The i386 ioctl numbering scheme doesn't really enforce | ||
26 | * a type field. De facto, however, the top 8 bits of the lower 16 | ||
27 | * bits are indeed used as a type field, so we might just as well make | ||
28 | * this explicit here. Please be sure to use the decoding macros | ||
29 | * below from now on. | ||
30 | */ | ||
31 | #define _IOC_NRBITS 8 | ||
32 | #define _IOC_TYPEBITS 8 | ||
33 | #define _IOC_SIZEBITS 14 | ||
34 | #define _IOC_DIRBITS 2 | ||
35 | |||
36 | #define _IOC_NRMASK ((1 << _IOC_NRBITS)-1) | ||
37 | #define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1) | ||
38 | #define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1) | ||
39 | #define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1) | ||
40 | |||
41 | #define _IOC_NRSHIFT 0 | ||
42 | #define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) | ||
43 | #define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS) | ||
44 | #define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS) | ||
45 | |||
46 | /* | ||
47 | * Direction bits. | ||
48 | */ | ||
49 | #define _IOC_NONE 0U | ||
50 | #define _IOC_WRITE 1U | ||
51 | #define _IOC_READ 2U | ||
52 | |||
53 | #define _IOC(dir,type,nr,size) \ | ||
54 | (((dir) << _IOC_DIRSHIFT) | \ | ||
55 | ((type) << _IOC_TYPESHIFT) | \ | ||
56 | ((nr) << _IOC_NRSHIFT) | \ | ||
57 | ((size) << _IOC_SIZESHIFT)) | ||
58 | |||
59 | /* used to create numbers */ | ||
60 | #define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0) | ||
61 | #define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size)) | ||
62 | #define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size)) | ||
63 | #define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size)) | ||
64 | |||
65 | /* used to decode ioctl numbers.. */ | ||
66 | #define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) | ||
67 | #define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK) | ||
68 | #define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK) | ||
69 | #define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK) | ||
70 | |||
71 | /* ...and for the drivers/sound files... */ | ||
72 | |||
73 | #define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT) | ||
74 | #define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT) | ||
75 | #define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT) | ||
76 | #define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT) | ||
77 | #define IOCSIZE_SHIFT (_IOC_SIZESHIFT) | ||
78 | |||
79 | #endif /* _ASM_IOCTL_H */ | ||
80 | |||
diff --git a/include/asm-frv/ioctls.h b/include/asm-frv/ioctls.h new file mode 100644 index 000000000000..341c7ddef2a3 --- /dev/null +++ b/include/asm-frv/ioctls.h | |||
@@ -0,0 +1,82 @@ | |||
1 | #ifndef __ASM_IOCTLS_H__ | ||
2 | #define __ASM_IOCTLS_H__ | ||
3 | |||
4 | #include <asm/ioctl.h> | ||
5 | |||
6 | /* 0x54 is just a magic number to make these relatively unique ('T') */ | ||
7 | |||
8 | #define TCGETS 0x5401 | ||
9 | #define TCSETS 0x5402 | ||
10 | #define TCSETSW 0x5403 | ||
11 | #define TCSETSF 0x5404 | ||
12 | #define TCGETA 0x5405 | ||
13 | #define TCSETA 0x5406 | ||
14 | #define TCSETAW 0x5407 | ||
15 | #define TCSETAF 0x5408 | ||
16 | #define TCSBRK 0x5409 | ||
17 | #define TCXONC 0x540A | ||
18 | #define TCFLSH 0x540B | ||
19 | #define TIOCEXCL 0x540C | ||
20 | #define TIOCNXCL 0x540D | ||
21 | #define TIOCSCTTY 0x540E | ||
22 | #define TIOCGPGRP 0x540F | ||
23 | #define TIOCSPGRP 0x5410 | ||
24 | #define TIOCOUTQ 0x5411 | ||
25 | #define TIOCSTI 0x5412 | ||
26 | #define TIOCGWINSZ 0x5413 | ||
27 | #define TIOCSWINSZ 0x5414 | ||
28 | #define TIOCMGET 0x5415 | ||
29 | #define TIOCMBIS 0x5416 | ||
30 | #define TIOCMBIC 0x5417 | ||
31 | #define TIOCMSET 0x5418 | ||
32 | #define TIOCGSOFTCAR 0x5419 | ||
33 | #define TIOCSSOFTCAR 0x541A | ||
34 | #define FIONREAD 0x541B | ||
35 | #define TIOCINQ FIONREAD | ||
36 | #define TIOCLINUX 0x541C | ||
37 | #define TIOCCONS 0x541D | ||
38 | #define TIOCGSERIAL 0x541E | ||
39 | #define TIOCSSERIAL 0x541F | ||
40 | #define TIOCPKT 0x5420 | ||
41 | #define FIONBIO 0x5421 | ||
42 | #define TIOCNOTTY 0x5422 | ||
43 | #define TIOCSETD 0x5423 | ||
44 | #define TIOCGETD 0x5424 | ||
45 | #define TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */ | ||
46 | #define TIOCTTYGSTRUCT 0x5426 /* For debugging only */ | ||
47 | #define TIOCSBRK 0x5427 /* BSD compatibility */ | ||
48 | #define TIOCCBRK 0x5428 /* BSD compatibility */ | ||
49 | #define TIOCGSID 0x5429 /* Return the session ID of FD */ | ||
50 | #define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ | ||
51 | #define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */ | ||
52 | |||
53 | #define FIONCLEX 0x5450 /* these numbers need to be adjusted. */ | ||
54 | #define FIOCLEX 0x5451 | ||
55 | #define FIOASYNC 0x5452 | ||
56 | #define TIOCSERCONFIG 0x5453 | ||
57 | #define TIOCSERGWILD 0x5454 | ||
58 | #define TIOCSERSWILD 0x5455 | ||
59 | #define TIOCGLCKTRMIOS 0x5456 | ||
60 | #define TIOCSLCKTRMIOS 0x5457 | ||
61 | #define TIOCSERGSTRUCT 0x5458 /* For debugging only */ | ||
62 | #define TIOCSERGETLSR 0x5459 /* Get line status register */ | ||
63 | #define TIOCSERGETMULTI 0x545A /* Get multiport config */ | ||
64 | #define TIOCSERSETMULTI 0x545B /* Set multiport config */ | ||
65 | |||
66 | #define TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */ | ||
67 | #define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ | ||
68 | #define FIOQSIZE 0x545E | ||
69 | |||
70 | /* Used for packet mode */ | ||
71 | #define TIOCPKT_DATA 0 | ||
72 | #define TIOCPKT_FLUSHREAD 1 | ||
73 | #define TIOCPKT_FLUSHWRITE 2 | ||
74 | #define TIOCPKT_STOP 4 | ||
75 | #define TIOCPKT_START 8 | ||
76 | #define TIOCPKT_NOSTOP 16 | ||
77 | #define TIOCPKT_DOSTOP 32 | ||
78 | |||
79 | #define TIOCSER_TEMT 0x01 /* Transmitter physically empty */ | ||
80 | |||
81 | #endif /* __ASM_IOCTLS_H__ */ | ||
82 | |||
diff --git a/include/asm-frv/ipc.h b/include/asm-frv/ipc.h new file mode 100644 index 000000000000..a46e3d9c2a3f --- /dev/null +++ b/include/asm-frv/ipc.h | |||
@@ -0,0 +1 @@ | |||
#include <asm-generic/ipc.h> | |||
diff --git a/include/asm-frv/ipcbuf.h b/include/asm-frv/ipcbuf.h new file mode 100644 index 000000000000..b546f67e455f --- /dev/null +++ b/include/asm-frv/ipcbuf.h | |||
@@ -0,0 +1,30 @@ | |||
1 | #ifndef __ASM_IPCBUF_H__ | ||
2 | #define __ASM_IPCBUF_H__ | ||
3 | |||
4 | /* | ||
5 | * The user_ipc_perm structure for FR-V architecture. | ||
6 | * Note extra padding because this structure is passed back and forth | ||
7 | * between kernel and user space. | ||
8 | * | ||
9 | * Pad space is left for: | ||
10 | * - 32-bit mode_t and seq | ||
11 | * - 2 miscellaneous 32-bit values | ||
12 | */ | ||
13 | |||
14 | struct ipc64_perm | ||
15 | { | ||
16 | __kernel_key_t key; | ||
17 | __kernel_uid32_t uid; | ||
18 | __kernel_gid32_t gid; | ||
19 | __kernel_uid32_t cuid; | ||
20 | __kernel_gid32_t cgid; | ||
21 | __kernel_mode_t mode; | ||
22 | unsigned short __pad1; | ||
23 | unsigned short seq; | ||
24 | unsigned short __pad2; | ||
25 | unsigned long __unused1; | ||
26 | unsigned long __unused2; | ||
27 | }; | ||
28 | |||
29 | #endif /* __ASM_IPCBUF_H__ */ | ||
30 | |||
diff --git a/include/asm-frv/irc-regs.h b/include/asm-frv/irc-regs.h new file mode 100644 index 000000000000..afa30aeacc82 --- /dev/null +++ b/include/asm-frv/irc-regs.h | |||
@@ -0,0 +1,53 @@ | |||
1 | /* irc-regs.h: on-chip interrupt controller registers | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_IRC_REGS | ||
13 | #define _ASM_IRC_REGS | ||
14 | |||
15 | #define __reg(ADDR) (*(volatile unsigned long *)(ADDR)) | ||
16 | |||
17 | #define __get_TM0() ({ __reg(0xfeff9800); }) | ||
18 | #define __get_TM1() ({ __reg(0xfeff9808); }) | ||
19 | #define __set_TM1(V) do { __reg(0xfeff9808) = (V); mb(); } while(0) | ||
20 | |||
21 | #define __set_TM1x(XI,V) \ | ||
22 | do { \ | ||
23 | int shift = (XI) * 2 + 16; \ | ||
24 | unsigned long tm1 = __reg(0xfeff9808); \ | ||
25 | tm1 &= ~(0x3 << shift); \ | ||
26 | tm1 |= (V) << shift; \ | ||
27 | __reg(0xfeff9808) = tm1; \ | ||
28 | mb(); \ | ||
29 | } while(0) | ||
30 | |||
31 | #define __get_RS(C) ({ (__reg(0xfeff9810) >> ((C)+16)) & 1; }) | ||
32 | |||
33 | #define __clr_RC(C) do { __reg(0xfeff9818) = 1 << ((C)+16); mb(); } while(0) | ||
34 | |||
35 | #define __get_MASK(C) ({ (__reg(0xfeff9820) >> ((C)+16)) & 1; }) | ||
36 | #define __set_MASK(C) do { __reg(0xfeff9820) |= 1 << ((C)+16); mb(); } while(0) | ||
37 | #define __clr_MASK(C) do { __reg(0xfeff9820) &= ~(1 << ((C)+16)); mb(); } while(0) | ||
38 | |||
39 | #define __get_MASK_all() __get_MASK(0) | ||
40 | #define __set_MASK_all() __set_MASK(0) | ||
41 | #define __clr_MASK_all() __clr_MASK(0) | ||
42 | |||
43 | #define __get_IRL() ({ (__reg(0xfeff9828) >> 16) & 0xf; }) | ||
44 | #define __clr_IRL() do { __reg(0xfeff9828) = 0x100000; mb(); } while(0) | ||
45 | |||
46 | #define __get_IRR(N) ({ __reg(0xfeff9840 + (N) * 8); }) | ||
47 | #define __set_IRR(N,V) do { __reg(0xfeff9840 + (N) * 8) = (V); } while(0) | ||
48 | |||
49 | #define __get_IITMR(N) ({ __reg(0xfeff9880 + (N) * 8); }) | ||
50 | #define __set_IITMR(N,V) do { __reg(0xfeff9880 + (N) * 8) = (V); } while(0) | ||
51 | |||
52 | |||
53 | #endif /* _ASM_IRC_REGS */ | ||
diff --git a/include/asm-frv/irq-routing.h b/include/asm-frv/irq-routing.h new file mode 100644 index 000000000000..686fb2b39d6a --- /dev/null +++ b/include/asm-frv/irq-routing.h | |||
@@ -0,0 +1,70 @@ | |||
1 | /* irq-routing.h: multiplexed IRQ routing | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_IRQ_ROUTING_H | ||
13 | #define _ASM_IRQ_ROUTING_H | ||
14 | |||
15 | #ifndef __ASSEMBLY__ | ||
16 | |||
17 | #include <linux/spinlock.h> | ||
18 | #include <asm/irq.h> | ||
19 | |||
20 | struct irq_source; | ||
21 | struct irq_level; | ||
22 | |||
23 | /* | ||
24 | * IRQ action distribution sets | ||
25 | */ | ||
26 | struct irq_group { | ||
27 | int first_irq; /* first IRQ distributed here */ | ||
28 | void (*control)(struct irq_group *group, int index, int on); | ||
29 | |||
30 | struct irqaction *actions[NR_IRQ_ACTIONS_PER_GROUP]; /* IRQ action chains */ | ||
31 | struct irq_source *sources[NR_IRQ_ACTIONS_PER_GROUP]; /* IRQ sources */ | ||
32 | int disable_cnt[NR_IRQ_ACTIONS_PER_GROUP]; /* disable counts */ | ||
33 | }; | ||
34 | |||
35 | /* | ||
36 | * IRQ source manager | ||
37 | */ | ||
38 | struct irq_source { | ||
39 | struct irq_source *next; | ||
40 | struct irq_level *level; | ||
41 | const char *muxname; | ||
42 | volatile void __iomem *muxdata; | ||
43 | unsigned long irqmask; | ||
44 | |||
45 | void (*doirq)(struct irq_source *source); | ||
46 | }; | ||
47 | |||
48 | /* | ||
49 | * IRQ level management (per CPU IRQ priority / entry vector) | ||
50 | */ | ||
51 | struct irq_level { | ||
52 | int usage; | ||
53 | int disable_count; | ||
54 | unsigned long flags; /* current SA_INTERRUPT and SA_SHIRQ settings */ | ||
55 | spinlock_t lock; | ||
56 | struct irq_source *sources; | ||
57 | }; | ||
58 | |||
59 | extern struct irq_level frv_irq_levels[16]; | ||
60 | extern struct irq_group *irq_groups[NR_IRQ_GROUPS]; | ||
61 | |||
62 | extern void frv_irq_route(struct irq_source *source, int irqlevel); | ||
63 | extern void frv_irq_route_external(struct irq_source *source, int irq); | ||
64 | extern void frv_irq_set_group(struct irq_group *group); | ||
65 | extern void distribute_irqs(struct irq_group *group, unsigned long irqmask); | ||
66 | extern void route_cpu_irqs(void); | ||
67 | |||
68 | #endif /* !__ASSEMBLY__ */ | ||
69 | |||
70 | #endif /* _ASM_IRQ_ROUTING_H */ | ||
diff --git a/include/asm-frv/irq.h b/include/asm-frv/irq.h new file mode 100644 index 000000000000..2c16d8dc02fd --- /dev/null +++ b/include/asm-frv/irq.h | |||
@@ -0,0 +1,44 @@ | |||
1 | /* irq.h: FRV IRQ definitions | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_IRQ_H_ | ||
13 | #define _ASM_IRQ_H_ | ||
14 | |||
15 | #include <linux/config.h> | ||
16 | |||
17 | /* | ||
18 | * the system has an on-CPU PIC and another PIC on the FPGA and other PICs on other peripherals, | ||
19 | * so we do some routing in irq-routing.[ch] to reduce the number of false-positives seen by | ||
20 | * drivers | ||
21 | */ | ||
22 | |||
23 | /* this number is used when no interrupt has been assigned */ | ||
24 | #define NO_IRQ (-1) | ||
25 | |||
26 | #define NR_IRQ_LOG2_ACTIONS_PER_GROUP 5 | ||
27 | #define NR_IRQ_ACTIONS_PER_GROUP (1 << NR_IRQ_LOG2_ACTIONS_PER_GROUP) | ||
28 | #define NR_IRQ_GROUPS 4 | ||
29 | #define NR_IRQS (NR_IRQ_ACTIONS_PER_GROUP * NR_IRQ_GROUPS) | ||
30 | |||
31 | /* probe returns a 32-bit IRQ mask:-/ */ | ||
32 | #define MIN_PROBE_IRQ (NR_IRQS - 32) | ||
33 | |||
34 | static inline int irq_canonicalize(int irq) | ||
35 | { | ||
36 | return irq; | ||
37 | } | ||
38 | |||
39 | extern void disable_irq_nosync(unsigned int irq); | ||
40 | extern void disable_irq(unsigned int irq); | ||
41 | extern void enable_irq(unsigned int irq); | ||
42 | |||
43 | |||
44 | #endif /* _ASM_IRQ_H_ */ | ||
diff --git a/include/asm-frv/kmap_types.h b/include/asm-frv/kmap_types.h new file mode 100644 index 000000000000..f8e16b2a5804 --- /dev/null +++ b/include/asm-frv/kmap_types.h | |||
@@ -0,0 +1,29 @@ | |||
1 | |||
2 | #ifndef _ASM_KMAP_TYPES_H | ||
3 | #define _ASM_KMAP_TYPES_H | ||
4 | |||
5 | enum km_type { | ||
6 | /* arch specific kmaps - change the numbers attached to these at your peril */ | ||
7 | __KM_CACHE, /* cache flush page attachment point */ | ||
8 | __KM_PGD, /* current page directory */ | ||
9 | __KM_ITLB_PTD, /* current instruction TLB miss page table lookup */ | ||
10 | __KM_DTLB_PTD, /* current data TLB miss page table lookup */ | ||
11 | |||
12 | /* general kmaps */ | ||
13 | KM_BOUNCE_READ, | ||
14 | KM_SKB_SUNRPC_DATA, | ||
15 | KM_SKB_DATA_SOFTIRQ, | ||
16 | KM_USER0, | ||
17 | KM_USER1, | ||
18 | KM_BIO_SRC_IRQ, | ||
19 | KM_BIO_DST_IRQ, | ||
20 | KM_PTE0, | ||
21 | KM_PTE1, | ||
22 | KM_IRQ0, | ||
23 | KM_IRQ1, | ||
24 | KM_SOFTIRQ0, | ||
25 | KM_SOFTIRQ1, | ||
26 | KM_TYPE_NR | ||
27 | }; | ||
28 | |||
29 | #endif | ||
diff --git a/include/asm-frv/linkage.h b/include/asm-frv/linkage.h new file mode 100644 index 000000000000..636c1bced7d4 --- /dev/null +++ b/include/asm-frv/linkage.h | |||
@@ -0,0 +1,7 @@ | |||
1 | #ifndef __ASM_LINKAGE_H | ||
2 | #define __ASM_LINKAGE_H | ||
3 | |||
4 | #define __ALIGN .align 4 | ||
5 | #define __ALIGN_STR ".align 4" | ||
6 | |||
7 | #endif | ||
diff --git a/include/asm-frv/local.h b/include/asm-frv/local.h new file mode 100644 index 000000000000..c27bdf04630e --- /dev/null +++ b/include/asm-frv/local.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef _ASM_LOCAL_H | ||
2 | #define _ASM_LOCAL_H | ||
3 | |||
4 | #include <asm-generic/local.h> | ||
5 | |||
6 | #endif /* _ASM_LOCAL_H */ | ||
diff --git a/include/asm-frv/math-emu.h b/include/asm-frv/math-emu.h new file mode 100644 index 000000000000..0c8f731b2180 --- /dev/null +++ b/include/asm-frv/math-emu.h | |||
@@ -0,0 +1,301 @@ | |||
1 | #ifndef _ASM_MATH_EMU_H | ||
2 | #define _ASM_MATH_EMU_H | ||
3 | |||
4 | #include <asm/setup.h> | ||
5 | #include <linux/linkage.h> | ||
6 | |||
7 | /* Status Register bits */ | ||
8 | |||
9 | /* accrued exception bits */ | ||
10 | #define FPSR_AEXC_INEX 3 | ||
11 | #define FPSR_AEXC_DZ 4 | ||
12 | #define FPSR_AEXC_UNFL 5 | ||
13 | #define FPSR_AEXC_OVFL 6 | ||
14 | #define FPSR_AEXC_IOP 7 | ||
15 | |||
16 | /* exception status bits */ | ||
17 | #define FPSR_EXC_INEX1 8 | ||
18 | #define FPSR_EXC_INEX2 9 | ||
19 | #define FPSR_EXC_DZ 10 | ||
20 | #define FPSR_EXC_UNFL 11 | ||
21 | #define FPSR_EXC_OVFL 12 | ||
22 | #define FPSR_EXC_OPERR 13 | ||
23 | #define FPSR_EXC_SNAN 14 | ||
24 | #define FPSR_EXC_BSUN 15 | ||
25 | |||
26 | /* quotient byte, assumes big-endian, of course */ | ||
27 | #define FPSR_QUOTIENT(fpsr) (*((signed char *) &(fpsr) + 1)) | ||
28 | |||
29 | /* condition code bits */ | ||
30 | #define FPSR_CC_NAN 24 | ||
31 | #define FPSR_CC_INF 25 | ||
32 | #define FPSR_CC_Z 26 | ||
33 | #define FPSR_CC_NEG 27 | ||
34 | |||
35 | |||
36 | /* Control register bits */ | ||
37 | |||
38 | /* rounding mode */ | ||
39 | #define FPCR_ROUND_RN 0 /* round to nearest/even */ | ||
40 | #define FPCR_ROUND_RZ 1 /* round to zero */ | ||
41 | #define FPCR_ROUND_RM 2 /* minus infinity */ | ||
42 | #define FPCR_ROUND_RP 3 /* plus infinity */ | ||
43 | |||
44 | /* rounding precision */ | ||
45 | #define FPCR_PRECISION_X 0 /* long double */ | ||
46 | #define FPCR_PRECISION_S 1 /* double */ | ||
47 | #define FPCR_PRECISION_D 2 /* float */ | ||
48 | |||
49 | |||
50 | /* Flags to select the debugging output */ | ||
51 | #define PDECODE 0 | ||
52 | #define PEXECUTE 1 | ||
53 | #define PCONV 2 | ||
54 | #define PNORM 3 | ||
55 | #define PREGISTER 4 | ||
56 | #define PINSTR 5 | ||
57 | #define PUNIMPL 6 | ||
58 | #define PMOVEM 7 | ||
59 | |||
60 | #define PMDECODE (1<<PDECODE) | ||
61 | #define PMEXECUTE (1<<PEXECUTE) | ||
62 | #define PMCONV (1<<PCONV) | ||
63 | #define PMNORM (1<<PNORM) | ||
64 | #define PMREGISTER (1<<PREGISTER) | ||
65 | #define PMINSTR (1<<PINSTR) | ||
66 | #define PMUNIMPL (1<<PUNIMPL) | ||
67 | #define PMMOVEM (1<<PMOVEM) | ||
68 | |||
69 | #ifndef __ASSEMBLY__ | ||
70 | |||
71 | #include <linux/kernel.h> | ||
72 | #include <linux/sched.h> | ||
73 | |||
74 | union fp_mant64 { | ||
75 | unsigned long long m64; | ||
76 | unsigned long m32[2]; | ||
77 | }; | ||
78 | |||
79 | union fp_mant128 { | ||
80 | unsigned long long m64[2]; | ||
81 | unsigned long m32[4]; | ||
82 | }; | ||
83 | |||
84 | /* internal representation of extended fp numbers */ | ||
85 | struct fp_ext { | ||
86 | unsigned char lowmant; | ||
87 | unsigned char sign; | ||
88 | unsigned short exp; | ||
89 | union fp_mant64 mant; | ||
90 | }; | ||
91 | |||
92 | /* C representation of FPU registers */ | ||
93 | /* NOTE: if you change this, you have to change the assembler offsets | ||
94 | below and the size in <asm/fpu.h>, too */ | ||
95 | struct fp_data { | ||
96 | struct fp_ext fpreg[8]; | ||
97 | unsigned int fpcr; | ||
98 | unsigned int fpsr; | ||
99 | unsigned int fpiar; | ||
100 | unsigned short prec; | ||
101 | unsigned short rnd; | ||
102 | struct fp_ext temp[2]; | ||
103 | }; | ||
104 | |||
105 | #if FPU_EMU_DEBUG | ||
106 | extern unsigned int fp_debugprint; | ||
107 | |||
108 | #define dprint(bit, fmt, args...) ({ \ | ||
109 | if (fp_debugprint & (1 << (bit))) \ | ||
110 | printk(fmt, ## args); \ | ||
111 | }) | ||
112 | #else | ||
113 | #define dprint(bit, fmt, args...) | ||
114 | #endif | ||
115 | |||
116 | #define uprint(str) ({ \ | ||
117 | static int __count = 3; \ | ||
118 | \ | ||
119 | if (__count > 0) { \ | ||
120 | printk("You just hit an unimplemented " \ | ||
121 | "fpu instruction (%s)\n", str); \ | ||
122 | printk("Please report this to ....\n"); \ | ||
123 | __count--; \ | ||
124 | } \ | ||
125 | }) | ||
126 | |||
127 | #define FPDATA ((struct fp_data *)current->thread.fp) | ||
128 | |||
129 | #else /* __ASSEMBLY__ */ | ||
130 | |||
131 | #define FPDATA %a2 | ||
132 | |||
133 | /* offsets from the base register to the floating point data in the task struct */ | ||
134 | #define FPD_FPREG (TASK_THREAD+THREAD_FPREG+0) | ||
135 | #define FPD_FPCR (TASK_THREAD+THREAD_FPREG+96) | ||
136 | #define FPD_FPSR (TASK_THREAD+THREAD_FPREG+100) | ||
137 | #define FPD_FPIAR (TASK_THREAD+THREAD_FPREG+104) | ||
138 | #define FPD_PREC (TASK_THREAD+THREAD_FPREG+108) | ||
139 | #define FPD_RND (TASK_THREAD+THREAD_FPREG+110) | ||
140 | #define FPD_TEMPFP1 (TASK_THREAD+THREAD_FPREG+112) | ||
141 | #define FPD_TEMPFP2 (TASK_THREAD+THREAD_FPREG+124) | ||
142 | #define FPD_SIZEOF (TASK_THREAD+THREAD_FPREG+136) | ||
143 | |||
144 | /* offsets on the stack to access saved registers, | ||
145 | * these are only used during instruction decoding | ||
146 | * where we always know how deep we're on the stack. | ||
147 | */ | ||
148 | #define FPS_DO (PT_D0) | ||
149 | #define FPS_D1 (PT_D1) | ||
150 | #define FPS_D2 (PT_D2) | ||
151 | #define FPS_A0 (PT_A0) | ||
152 | #define FPS_A1 (PT_A1) | ||
153 | #define FPS_A2 (PT_A2) | ||
154 | #define FPS_SR (PT_SR) | ||
155 | #define FPS_PC (PT_PC) | ||
156 | #define FPS_EA (PT_PC+6) | ||
157 | #define FPS_PC2 (PT_PC+10) | ||
158 | |||
159 | .macro fp_get_fp_reg | ||
160 | lea (FPD_FPREG,FPDATA,%d0.w*4),%a0 | ||
161 | lea (%a0,%d0.w*8),%a0 | ||
162 | .endm | ||
163 | |||
164 | /* Macros used to get/put the current program counter. | ||
165 | * 020/030 use a different stack frame then 040/060, for the | ||
166 | * 040/060 the return pc points already to the next location, | ||
167 | * so this only needs to be modified for jump instructions. | ||
168 | */ | ||
169 | .macro fp_get_pc dest | ||
170 | move.l (FPS_PC+4,%sp),\dest | ||
171 | .endm | ||
172 | |||
173 | .macro fp_put_pc src,jump=0 | ||
174 | move.l \src,(FPS_PC+4,%sp) | ||
175 | .endm | ||
176 | |||
177 | .macro fp_get_instr_data f,s,dest,label | ||
178 | getuser \f,%sp@(FPS_PC+4)@(0),\dest,\label,%sp@(FPS_PC+4) | ||
179 | addq.l #\s,%sp@(FPS_PC+4) | ||
180 | .endm | ||
181 | |||
182 | .macro fp_get_instr_word dest,label,addr | ||
183 | fp_get_instr_data w,2,\dest,\label,\addr | ||
184 | .endm | ||
185 | |||
186 | .macro fp_get_instr_long dest,label,addr | ||
187 | fp_get_instr_data l,4,\dest,\label,\addr | ||
188 | .endm | ||
189 | |||
190 | /* These macros are used to read from/write to user space | ||
191 | * on error we jump to the fixup section, load the fault | ||
192 | * address into %a0 and jump to the exit. | ||
193 | * (derived from <asm/uaccess.h>) | ||
194 | */ | ||
195 | .macro getuser size,src,dest,label,addr | ||
196 | | printf ,"[\size<%08x]",1,\addr | ||
197 | .Lu1\@: moves\size \src,\dest | ||
198 | |||
199 | .section .fixup,"ax" | ||
200 | .even | ||
201 | .Lu2\@: move.l \addr,%a0 | ||
202 | jra \label | ||
203 | .previous | ||
204 | |||
205 | .section __ex_table,"a" | ||
206 | .align 4 | ||
207 | .long .Lu1\@,.Lu2\@ | ||
208 | .previous | ||
209 | .endm | ||
210 | |||
211 | .macro putuser size,src,dest,label,addr | ||
212 | | printf ,"[\size>%08x]",1,\addr | ||
213 | .Lu1\@: moves\size \src,\dest | ||
214 | .Lu2\@: | ||
215 | |||
216 | .section .fixup,"ax" | ||
217 | .even | ||
218 | .Lu3\@: move.l \addr,%a0 | ||
219 | jra \label | ||
220 | .previous | ||
221 | |||
222 | .section __ex_table,"a" | ||
223 | .align 4 | ||
224 | .long .Lu1\@,.Lu3\@ | ||
225 | .long .Lu2\@,.Lu3\@ | ||
226 | .previous | ||
227 | .endm | ||
228 | |||
229 | |||
230 | .macro movestack nr,arg1,arg2,arg3,arg4,arg5 | ||
231 | .if \nr | ||
232 | movestack (\nr-1),\arg2,\arg3,\arg4,\arg5 | ||
233 | move.l \arg1,-(%sp) | ||
234 | .endif | ||
235 | .endm | ||
236 | |||
237 | .macro printf bit=-1,string,nr=0,arg1,arg2,arg3,arg4,arg5 | ||
238 | #ifdef FPU_EMU_DEBUG | ||
239 | .data | ||
240 | .Lpdata\@: | ||
241 | .string "\string" | ||
242 | .previous | ||
243 | |||
244 | movem.l %d0/%d1/%a0/%a1,-(%sp) | ||
245 | .if \bit+1 | ||
246 | #if 0 | ||
247 | moveq #\bit,%d0 | ||
248 | andw #7,%d0 | ||
249 | btst %d0,fp_debugprint+((31-\bit)/8) | ||
250 | #else | ||
251 | btst #\bit,fp_debugprint+((31-\bit)/8) | ||
252 | #endif | ||
253 | jeq .Lpskip\@ | ||
254 | .endif | ||
255 | movestack \nr,\arg1,\arg2,\arg3,\arg4,\arg5 | ||
256 | pea .Lpdata\@ | ||
257 | jsr printk | ||
258 | lea ((\nr+1)*4,%sp),%sp | ||
259 | .Lpskip\@: | ||
260 | movem.l (%sp)+,%d0/%d1/%a0/%a1 | ||
261 | #endif | ||
262 | .endm | ||
263 | |||
264 | .macro printx bit,fp | ||
265 | #ifdef FPU_EMU_DEBUG | ||
266 | movem.l %d0/%a0,-(%sp) | ||
267 | lea \fp,%a0 | ||
268 | #if 0 | ||
269 | moveq #'+',%d0 | ||
270 | tst.w (%a0) | ||
271 | jeq .Lx1\@ | ||
272 | moveq #'-',%d0 | ||
273 | .Lx1\@: printf \bit," %c",1,%d0 | ||
274 | move.l (4,%a0),%d0 | ||
275 | bclr #31,%d0 | ||
276 | jne .Lx2\@ | ||
277 | printf \bit,"0." | ||
278 | jra .Lx3\@ | ||
279 | .Lx2\@: printf \bit,"1." | ||
280 | .Lx3\@: printf \bit,"%08x%08x",2,%d0,%a0@(8) | ||
281 | move.w (2,%a0),%d0 | ||
282 | ext.l %d0 | ||
283 | printf \bit,"E%04x",1,%d0 | ||
284 | #else | ||
285 | printf \bit," %08x%08x%08x",3,%a0@,%a0@(4),%a0@(8) | ||
286 | #endif | ||
287 | movem.l (%sp)+,%d0/%a0 | ||
288 | #endif | ||
289 | .endm | ||
290 | |||
291 | .macro debug instr,args | ||
292 | #ifdef FPU_EMU_DEBUG | ||
293 | \instr \args | ||
294 | #endif | ||
295 | .endm | ||
296 | |||
297 | |||
298 | #endif /* __ASSEMBLY__ */ | ||
299 | |||
300 | #endif /* _ASM_FRV_MATH_EMU_H */ | ||
301 | |||
diff --git a/include/asm-frv/mb-regs.h b/include/asm-frv/mb-regs.h new file mode 100644 index 000000000000..c8f575fc42fa --- /dev/null +++ b/include/asm-frv/mb-regs.h | |||
@@ -0,0 +1,185 @@ | |||
1 | /* mb-regs.h: motherboard registers | ||
2 | * | ||
3 | * Copyright (C) 2003, 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_MB_REGS_H | ||
13 | #define _ASM_MB_REGS_H | ||
14 | |||
15 | #include <asm/cpu-irqs.h> | ||
16 | #include <asm/sections.h> | ||
17 | #include <asm/mem-layout.h> | ||
18 | |||
19 | #define __region_IO KERNEL_IO_START /* the region from 0xe0000000 to 0xffffffff has suitable | ||
20 | * protection laid over the top for use in memory-mapped | ||
21 | * I/O | ||
22 | */ | ||
23 | |||
24 | #define __region_CS0 0xff000000 /* Boot ROMs area */ | ||
25 | |||
26 | #ifdef CONFIG_MB93091_VDK | ||
27 | /* | ||
28 | * VDK motherboard and CPU card specific stuff | ||
29 | */ | ||
30 | |||
31 | #include <asm/mb93091-fpga-irqs.h> | ||
32 | |||
33 | #define IRQ_CPU_MB93493_0 IRQ_CPU_EXTERNAL0 | ||
34 | #define IRQ_CPU_MB93493_1 IRQ_CPU_EXTERNAL1 | ||
35 | |||
36 | #define __region_CS2 0xe0000000 /* SLBUS/PCI I/O space */ | ||
37 | #define __region_CS2_M 0x0fffffff /* mask */ | ||
38 | #define __region_CS2_C 0x00000000 /* control */ | ||
39 | #define __region_CS5 0xf0000000 /* MB93493 CSC area (DAV daughter board) */ | ||
40 | #define __region_CS5_M 0x00ffffff | ||
41 | #define __region_CS5_C 0x00010000 | ||
42 | #define __region_CS7 0xf1000000 /* CB70 CPU-card PCMCIA port I/O space */ | ||
43 | #define __region_CS7_M 0x00ffffff | ||
44 | #define __region_CS7_C 0x00410701 | ||
45 | #define __region_CS1 0xfc000000 /* SLBUS/PCI bridge control registers */ | ||
46 | #define __region_CS1_M 0x000fffff | ||
47 | #define __region_CS1_C 0x00000000 | ||
48 | #define __region_CS6 0xfc100000 /* CB70 CPU-card DM9000 LAN I/O space */ | ||
49 | #define __region_CS6_M 0x000fffff | ||
50 | #define __region_CS6_C 0x00400707 | ||
51 | #define __region_CS3 0xfc200000 /* MB93493 CSR area (DAV daughter board) */ | ||
52 | #define __region_CS3_M 0x000fffff | ||
53 | #define __region_CS3_C 0xc8100000 | ||
54 | #define __region_CS4 0xfd000000 /* CB70 CPU-card extra flash space */ | ||
55 | #define __region_CS4_M 0x00ffffff | ||
56 | #define __region_CS4_C 0x00000f07 | ||
57 | |||
58 | #define __region_PCI_IO (__region_CS2 + 0x04000000UL) | ||
59 | #define __region_PCI_MEM (__region_CS2 + 0x08000000UL) | ||
60 | #define __flush_PCI_writes() \ | ||
61 | do { \ | ||
62 | __builtin_write8((volatile void *) __region_PCI_MEM, 0); \ | ||
63 | } while(0) | ||
64 | |||
65 | #define __is_PCI_IO(addr) \ | ||
66 | (((unsigned long)(addr) >> 24) - (__region_PCI_IO >> 24) < (0x04000000UL >> 24)) | ||
67 | |||
68 | #define __is_PCI_MEM(addr) \ | ||
69 | ((unsigned long)(addr) - __region_PCI_MEM < 0x08000000UL) | ||
70 | |||
71 | #define __get_CLKSW() ({ *(volatile unsigned long *)(__region_CS2 + 0x0130000cUL) & 0xffUL; }) | ||
72 | #define __get_CLKIN() (__get_CLKSW() * 125U * 100000U / 24U) | ||
73 | |||
74 | #ifndef __ASSEMBLY__ | ||
75 | extern int __nongprelbss mb93090_mb00_detected; | ||
76 | #endif | ||
77 | |||
78 | #define __addr_LEDS() (__region_CS2 + 0x01200004UL) | ||
79 | #ifdef CONFIG_MB93090_MB00 | ||
80 | #define __set_LEDS(X) \ | ||
81 | do { \ | ||
82 | if (mb93090_mb00_detected) \ | ||
83 | __builtin_write32((void *) __addr_LEDS(), ~(X)); \ | ||
84 | } while (0) | ||
85 | #else | ||
86 | #define __set_LEDS(X) | ||
87 | #endif | ||
88 | |||
89 | #define __addr_LCD() (__region_CS2 + 0x01200008UL) | ||
90 | #define __get_LCD(B) __builtin_read32((volatile void *) (B)) | ||
91 | #define __set_LCD(B,X) __builtin_write32((volatile void *) (B), (X)) | ||
92 | |||
93 | #define LCD_D 0x000000ff /* LCD data bus */ | ||
94 | #define LCD_RW 0x00000100 /* LCD R/W signal */ | ||
95 | #define LCD_RS 0x00000200 /* LCD Register Select */ | ||
96 | #define LCD_E 0x00000400 /* LCD Start Enable Signal */ | ||
97 | |||
98 | #define LCD_CMD_CLEAR (LCD_E|0x001) | ||
99 | #define LCD_CMD_HOME (LCD_E|0x002) | ||
100 | #define LCD_CMD_CURSOR_INC (LCD_E|0x004) | ||
101 | #define LCD_CMD_SCROLL_INC (LCD_E|0x005) | ||
102 | #define LCD_CMD_CURSOR_DEC (LCD_E|0x006) | ||
103 | #define LCD_CMD_SCROLL_DEC (LCD_E|0x007) | ||
104 | #define LCD_CMD_OFF (LCD_E|0x008) | ||
105 | #define LCD_CMD_ON(CRSR,BLINK) (LCD_E|0x00c|(CRSR<<1)|BLINK) | ||
106 | #define LCD_CMD_CURSOR_MOVE_L (LCD_E|0x010) | ||
107 | #define LCD_CMD_CURSOR_MOVE_R (LCD_E|0x014) | ||
108 | #define LCD_CMD_DISPLAY_SHIFT_L (LCD_E|0x018) | ||
109 | #define LCD_CMD_DISPLAY_SHIFT_R (LCD_E|0x01c) | ||
110 | #define LCD_CMD_FUNCSET(DL,N,F) (LCD_E|0x020|(DL<<4)|(N<<3)|(F<<2)) | ||
111 | #define LCD_CMD_SET_CG_ADDR(X) (LCD_E|0x040|X) | ||
112 | #define LCD_CMD_SET_DD_ADDR(X) (LCD_E|0x080|X) | ||
113 | #define LCD_CMD_READ_BUSY (LCD_E|LCD_RW) | ||
114 | #define LCD_DATA_WRITE(X) (LCD_E|LCD_RS|(X)) | ||
115 | #define LCD_DATA_READ (LCD_E|LCD_RS|LCD_RW) | ||
116 | |||
117 | #else | ||
118 | /* | ||
119 | * PDK unit specific stuff | ||
120 | */ | ||
121 | |||
122 | #include <asm/mb93093-fpga-irqs.h> | ||
123 | |||
124 | #define IRQ_CPU_MB93493_0 IRQ_CPU_EXTERNAL0 | ||
125 | #define IRQ_CPU_MB93493_1 IRQ_CPU_EXTERNAL1 | ||
126 | |||
127 | #define __region_CS5 0xf0000000 /* MB93493 CSC area (DAV daughter board) */ | ||
128 | #define __region_CS5_M 0x00ffffff /* mask */ | ||
129 | #define __region_CS5_C 0x00010000 /* control */ | ||
130 | #define __region_CS2 0x20000000 /* FPGA registers */ | ||
131 | #define __region_CS2_M 0x000fffff | ||
132 | #define __region_CS2_C 0x00000000 | ||
133 | #define __region_CS1 0xfc100000 /* LAN registers */ | ||
134 | #define __region_CS1_M 0x000fffff | ||
135 | #define __region_CS1_C 0x00010404 | ||
136 | #define __region_CS3 0xfc200000 /* MB93493 CSR area (DAV daughter board) */ | ||
137 | #define __region_CS3_M 0x000fffff | ||
138 | #define __region_CS3_C 0xc8000000 | ||
139 | #define __region_CS4 0xfd000000 /* extra ROMs area */ | ||
140 | #define __region_CS4_M 0x00ffffff | ||
141 | #define __region_CS4_C 0x00000f07 | ||
142 | |||
143 | #define __region_CS6 0xfe000000 /* not used - hide behind CPU resource I/O regs */ | ||
144 | #define __region_CS6_M 0x000fffff | ||
145 | #define __region_CS6_C 0x00000f07 | ||
146 | #define __region_CS7 0xfe000000 /* not used - hide behind CPU resource I/O regs */ | ||
147 | #define __region_CS7_M 0x000fffff | ||
148 | #define __region_CS7_C 0x00000f07 | ||
149 | |||
150 | #define __is_PCI_IO(addr) 0 /* no PCI */ | ||
151 | #define __is_PCI_MEM(addr) 0 | ||
152 | #define __region_PCI_IO 0 | ||
153 | #define __region_PCI_MEM 0 | ||
154 | #define __flush_PCI_writes() do { } while(0) | ||
155 | |||
156 | #define __get_CLKSW() 0UL | ||
157 | #define __get_CLKIN() 66000000UL | ||
158 | |||
159 | #define __addr_LEDS() (__region_CS2 + 0x00000023UL) | ||
160 | #define __set_LEDS(X) __builtin_write8((volatile void *) __addr_LEDS(), (X)) | ||
161 | |||
162 | #define __addr_FPGATR() (__region_CS2 + 0x00000030UL) | ||
163 | #define __set_FPGATR(X) __builtin_write32((volatile void *) __addr_FPGATR(), (X)) | ||
164 | #define __get_FPGATR() __builtin_read32((volatile void *) __addr_FPGATR()) | ||
165 | |||
166 | #define MB93093_FPGA_FPGATR_AUDIO_CLK 0x00000003 | ||
167 | |||
168 | #define __set_FPGATR_AUDIO_CLK(V) \ | ||
169 | __set_FPGATR((__get_FPGATR() & ~MB93093_FPGA_FPGATR_AUDIO_CLK) | (V)) | ||
170 | |||
171 | #define MB93093_FPGA_FPGATR_AUDIO_CLK_OFF 0x0 | ||
172 | #define MB93093_FPGA_FPGATR_AUDIO_CLK_11MHz 0x1 | ||
173 | #define MB93093_FPGA_FPGATR_AUDIO_CLK_12MHz 0x2 | ||
174 | #define MB93093_FPGA_FPGATR_AUDIO_CLK_02MHz 0x3 | ||
175 | |||
176 | #define MB93093_FPGA_SWR_PUSHSWMASK (0x1F<<26) | ||
177 | #define MB93093_FPGA_SWR_PUSHSW4 (1<<29) | ||
178 | |||
179 | #define __addr_FPGA_SWR ((volatile void *)(__region_CS2 + 0x28UL)) | ||
180 | #define __get_FPGA_PUSHSW1_5() (__builtin_read32(__addr_FPGA_SWR) & MB93093_FPGA_SWR_PUSHSWMASK) | ||
181 | |||
182 | |||
183 | #endif | ||
184 | |||
185 | #endif /* _ASM_MB_REGS_H */ | ||
diff --git a/include/asm-frv/mb86943a.h b/include/asm-frv/mb86943a.h new file mode 100644 index 000000000000..b89fd0b56bb3 --- /dev/null +++ b/include/asm-frv/mb86943a.h | |||
@@ -0,0 +1,39 @@ | |||
1 | /* mb86943a.h: MB86943 SPARClite <-> PCI bridge registers | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_MB86943A_H | ||
13 | #define _ASM_MB86943A_H | ||
14 | |||
15 | #include <asm/mb-regs.h> | ||
16 | |||
17 | #define __reg_MB86943_sl_ctl *(volatile uint32_t *) (__region_CS1 + 0x00) | ||
18 | |||
19 | #define MB86943_SL_CTL_BUS_WIDTH_64 0x00000001 | ||
20 | #define MB86943_SL_CTL_AS_HOST 0x00000002 | ||
21 | #define MB86943_SL_CTL_DRCT_MASTER_SWAP 0x00000004 | ||
22 | #define MB86943_SL_CTL_DRCT_SLAVE_SWAP 0x00000008 | ||
23 | #define MB86943_SL_CTL_PCI_CONFIG_SWAP 0x00000010 | ||
24 | #define MB86943_SL_CTL_ECS0_ENABLE 0x00000020 | ||
25 | #define MB86943_SL_CTL_ECS1_ENABLE 0x00000040 | ||
26 | #define MB86943_SL_CTL_ECS2_ENABLE 0x00000080 | ||
27 | |||
28 | #define __reg_MB86943_ecs_ctl(N) *(volatile uint32_t *) (__region_CS1 + 0x08 + (0x08*(N))) | ||
29 | #define __reg_MB86943_ecs_range(N) *(volatile uint32_t *) (__region_CS1 + 0x20 + (0x10*(N))) | ||
30 | #define __reg_MB86943_ecs_base(N) *(volatile uint32_t *) (__region_CS1 + 0x28 + (0x10*(N))) | ||
31 | |||
32 | #define __reg_MB86943_sl_pci_io_range *(volatile uint32_t *) (__region_CS1 + 0x50) | ||
33 | #define __reg_MB86943_sl_pci_io_base *(volatile uint32_t *) (__region_CS1 + 0x58) | ||
34 | #define __reg_MB86943_sl_pci_mem_range *(volatile uint32_t *) (__region_CS1 + 0x60) | ||
35 | #define __reg_MB86943_sl_pci_mem_base *(volatile uint32_t *) (__region_CS1 + 0x68) | ||
36 | #define __reg_MB86943_pci_sl_io_base *(volatile uint32_t *) (__region_CS1 + 0x70) | ||
37 | #define __reg_MB86943_pci_sl_mem_base *(volatile uint32_t *) (__region_CS1 + 0x78) | ||
38 | |||
39 | #endif /* _ASM_MB86943A_H */ | ||
diff --git a/include/asm-frv/mb93091-fpga-irqs.h b/include/asm-frv/mb93091-fpga-irqs.h new file mode 100644 index 000000000000..341bfc52a0eb --- /dev/null +++ b/include/asm-frv/mb93091-fpga-irqs.h | |||
@@ -0,0 +1,44 @@ | |||
1 | /* mb93091-fpga-irqs.h: MB93091 CPU board FPGA IRQs | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_MB93091_FPGA_IRQS_H | ||
13 | #define _ASM_MB93091_FPGA_IRQS_H | ||
14 | |||
15 | #ifndef __ASSEMBLY__ | ||
16 | |||
17 | #include <asm/irq-routing.h> | ||
18 | |||
19 | #define IRQ_BASE_FPGA (NR_IRQ_ACTIONS_PER_GROUP * 1) | ||
20 | |||
21 | /* IRQ IDs presented to drivers */ | ||
22 | enum { | ||
23 | IRQ_FPGA__UNUSED = IRQ_BASE_FPGA, | ||
24 | IRQ_FPGA_SYSINT_BUS_EXPANSION_1, | ||
25 | IRQ_FPGA_SL_BUS_EXPANSION_2, | ||
26 | IRQ_FPGA_PCI_INTD, | ||
27 | IRQ_FPGA_PCI_INTC, | ||
28 | IRQ_FPGA_PCI_INTB, | ||
29 | IRQ_FPGA_PCI_INTA, | ||
30 | IRQ_FPGA_SL_BUS_EXPANSION_7, | ||
31 | IRQ_FPGA_SYSINT_BUS_EXPANSION_8, | ||
32 | IRQ_FPGA_SL_BUS_EXPANSION_9, | ||
33 | IRQ_FPGA_MB86943_PCI_INTA, | ||
34 | IRQ_FPGA_MB86943_SLBUS_SIDE, | ||
35 | IRQ_FPGA_RTL8029_INTA, | ||
36 | IRQ_FPGA_SYSINT_BUS_EXPANSION_13, | ||
37 | IRQ_FPGA_SL_BUS_EXPANSION_14, | ||
38 | IRQ_FPGA_NMI, | ||
39 | }; | ||
40 | |||
41 | |||
42 | #endif /* !__ASSEMBLY__ */ | ||
43 | |||
44 | #endif /* _ASM_MB93091_FPGA_IRQS_H */ | ||
diff --git a/include/asm-frv/mb93093-fpga-irqs.h b/include/asm-frv/mb93093-fpga-irqs.h new file mode 100644 index 000000000000..1e0f11c2fcdb --- /dev/null +++ b/include/asm-frv/mb93093-fpga-irqs.h | |||
@@ -0,0 +1,31 @@ | |||
1 | /* mb93093-fpga-irqs.h: MB93093 CPU board FPGA IRQs | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_MB93093_FPGA_IRQS_H | ||
13 | #define _ASM_MB93093_FPGA_IRQS_H | ||
14 | |||
15 | #ifndef __ASSEMBLY__ | ||
16 | |||
17 | #include <asm/irq-routing.h> | ||
18 | |||
19 | #define IRQ_BASE_FPGA (NR_IRQ_ACTIONS_PER_GROUP * 1) | ||
20 | |||
21 | /* IRQ IDs presented to drivers */ | ||
22 | enum { | ||
23 | IRQ_FPGA_PUSH_BUTTON_SW1_5 = IRQ_BASE_FPGA + 8, | ||
24 | IRQ_FPGA_ROCKER_C_SW8 = IRQ_BASE_FPGA + 9, | ||
25 | IRQ_FPGA_ROCKER_C_SW9 = IRQ_BASE_FPGA + 10, | ||
26 | }; | ||
27 | |||
28 | |||
29 | #endif /* !__ASSEMBLY__ */ | ||
30 | |||
31 | #endif /* _ASM_MB93093_FPGA_IRQS_H */ | ||
diff --git a/include/asm-frv/mb93493-irqs.h b/include/asm-frv/mb93493-irqs.h new file mode 100644 index 000000000000..15096e731325 --- /dev/null +++ b/include/asm-frv/mb93493-irqs.h | |||
@@ -0,0 +1,52 @@ | |||
1 | /* mb93493-irqs.h: MB93493 companion chip IRQs | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_MB93493_IRQS_H | ||
13 | #define _ASM_MB93493_IRQS_H | ||
14 | |||
15 | #ifndef __ASSEMBLY__ | ||
16 | |||
17 | #include <asm/irq-routing.h> | ||
18 | |||
19 | #define IRQ_BASE_MB93493 (NR_IRQ_ACTIONS_PER_GROUP * 2) | ||
20 | |||
21 | /* IRQ IDs presented to drivers */ | ||
22 | enum { | ||
23 | IRQ_MB93493_VDC = IRQ_BASE_MB93493 + 0, | ||
24 | IRQ_MB93493_VCC = IRQ_BASE_MB93493 + 1, | ||
25 | IRQ_MB93493_AUDIO_OUT = IRQ_BASE_MB93493 + 2, | ||
26 | IRQ_MB93493_I2C_0 = IRQ_BASE_MB93493 + 3, | ||
27 | IRQ_MB93493_I2C_1 = IRQ_BASE_MB93493 + 4, | ||
28 | IRQ_MB93493_USB = IRQ_BASE_MB93493 + 5, | ||
29 | IRQ_MB93493_LOCAL_BUS = IRQ_BASE_MB93493 + 7, | ||
30 | IRQ_MB93493_PCMCIA = IRQ_BASE_MB93493 + 8, | ||
31 | IRQ_MB93493_GPIO = IRQ_BASE_MB93493 + 9, | ||
32 | IRQ_MB93493_AUDIO_IN = IRQ_BASE_MB93493 + 10, | ||
33 | }; | ||
34 | |||
35 | /* IRQ multiplexor mappings */ | ||
36 | #define ROUTE_VIA_IRQ0 0 /* route IRQ by way of CPU external IRQ 0 */ | ||
37 | #define ROUTE_VIA_IRQ1 1 /* route IRQ by way of CPU external IRQ 1 */ | ||
38 | |||
39 | #define IRQ_MB93493_VDC_ROUTE ROUTE_VIA_IRQ0 | ||
40 | #define IRQ_MB93493_VCC_ROUTE ROUTE_VIA_IRQ1 | ||
41 | #define IRQ_MB93493_AUDIO_OUT_ROUTE ROUTE_VIA_IRQ1 | ||
42 | #define IRQ_MB93493_I2C_0_ROUTE ROUTE_VIA_IRQ1 | ||
43 | #define IRQ_MB93493_I2C_1_ROUTE ROUTE_VIA_IRQ1 | ||
44 | #define IRQ_MB93493_USB_ROUTE ROUTE_VIA_IRQ1 | ||
45 | #define IRQ_MB93493_LOCAL_BUS_ROUTE ROUTE_VIA_IRQ1 | ||
46 | #define IRQ_MB93493_PCMCIA_ROUTE ROUTE_VIA_IRQ1 | ||
47 | #define IRQ_MB93493_GPIO_ROUTE ROUTE_VIA_IRQ1 | ||
48 | #define IRQ_MB93493_AUDIO_IN_ROUTE ROUTE_VIA_IRQ1 | ||
49 | |||
50 | #endif /* !__ASSEMBLY__ */ | ||
51 | |||
52 | #endif /* _ASM_MB93493_IRQS_H */ | ||
diff --git a/include/asm-frv/mb93493-regs.h b/include/asm-frv/mb93493-regs.h new file mode 100644 index 000000000000..c54aa9d14468 --- /dev/null +++ b/include/asm-frv/mb93493-regs.h | |||
@@ -0,0 +1,279 @@ | |||
1 | /* mb93493-regs.h: MB93493 companion chip registers | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_MB93493_REGS_H | ||
13 | #define _ASM_MB93493_REGS_H | ||
14 | |||
15 | #include <asm/mb-regs.h> | ||
16 | #include <asm/mb93493-irqs.h> | ||
17 | |||
18 | #define __get_MB93493(X) ({ *(volatile unsigned long *)(__region_CS3 + (X)); }) | ||
19 | |||
20 | #define __set_MB93493(X,V) \ | ||
21 | do { \ | ||
22 | *(volatile unsigned long *)(__region_CS3 + (X)) = (V); mb(); \ | ||
23 | } while(0) | ||
24 | |||
25 | #define __get_MB93493_STSR(X) __get_MB93493(0x3c0 + (X) * 4) | ||
26 | #define __set_MB93493_STSR(X,V) __set_MB93493(0x3c0 + (X) * 4, (V)) | ||
27 | #define MB93493_STSR_EN | ||
28 | |||
29 | #define __get_MB93493_IQSR(X) __get_MB93493(0x3d0 + (X) * 4) | ||
30 | #define __set_MB93493_IQSR(X,V) __set_MB93493(0x3d0 + (X) * 4, (V)) | ||
31 | |||
32 | #define __get_MB93493_DQSR(X) __get_MB93493(0x3e0 + (X) * 4) | ||
33 | #define __set_MB93493_DQSR(X,V) __set_MB93493(0x3e0 + (X) * 4, (V)) | ||
34 | |||
35 | #define __get_MB93493_LBSER() __get_MB93493(0x3f0) | ||
36 | #define __set_MB93493_LBSER(V) __set_MB93493(0x3f0, (V)) | ||
37 | |||
38 | #define MB93493_LBSER_VDC 0x00010000 | ||
39 | #define MB93493_LBSER_VCC 0x00020000 | ||
40 | #define MB93493_LBSER_AUDIO 0x00040000 | ||
41 | #define MB93493_LBSER_I2C_0 0x00080000 | ||
42 | #define MB93493_LBSER_I2C_1 0x00100000 | ||
43 | #define MB93493_LBSER_USB 0x00200000 | ||
44 | #define MB93493_LBSER_GPIO 0x00800000 | ||
45 | #define MB93493_LBSER_PCMCIA 0x01000000 | ||
46 | |||
47 | #define __get_MB93493_LBSR() __get_MB93493(0x3fc) | ||
48 | #define __set_MB93493_LBSR(V) __set_MB93493(0x3fc, (V)) | ||
49 | |||
50 | /* | ||
51 | * video display controller | ||
52 | */ | ||
53 | #define __get_MB93493_VDC(X) __get_MB93493(MB93493_VDC_##X) | ||
54 | #define __set_MB93493_VDC(X,V) __set_MB93493(MB93493_VDC_##X, (V)) | ||
55 | |||
56 | #define MB93493_VDC_RCURSOR 0x140 /* cursor position */ | ||
57 | #define MB93493_VDC_RCT1 0x144 /* cursor colour 1 */ | ||
58 | #define MB93493_VDC_RCT2 0x148 /* cursor colour 2 */ | ||
59 | #define MB93493_VDC_RHDC 0x150 /* horizontal display period */ | ||
60 | #define MB93493_VDC_RH_MARGINS 0x154 /* horizontal margin sizes */ | ||
61 | #define MB93493_VDC_RVDC 0x158 /* vertical display period */ | ||
62 | #define MB93493_VDC_RV_MARGINS 0x15c /* vertical margin sizes */ | ||
63 | #define MB93493_VDC_RC 0x170 /* VDC control */ | ||
64 | #define MB93493_VDC_RCLOCK 0x174 /* clock divider, DMA req delay */ | ||
65 | #define MB93493_VDC_RBLACK 0x178 /* black insert sizes */ | ||
66 | #define MB93493_VDC_RS 0x17c /* VDC status */ | ||
67 | |||
68 | #define __addr_MB93493_VDC_BCI(X) ({ (volatile unsigned long *)(__region_CS3 + 0x000 + (X)); }) | ||
69 | #define __addr_MB93493_VDC_TPO(X) (__region_CS3 + 0x1c0 + (X)) | ||
70 | |||
71 | #define VDC_TPO_WIDTH 32 | ||
72 | |||
73 | #define VDC_RC_DSR 0x00000080 /* VDC master reset */ | ||
74 | |||
75 | #define VDC_RS_IT 0x00060000 /* interrupt indicators */ | ||
76 | #define VDC_RS_IT_UNDERFLOW 0x00040000 /* - underflow event */ | ||
77 | #define VDC_RS_IT_VSYNC 0x00020000 /* - VSYNC event */ | ||
78 | #define VDC_RS_DFI 0x00010000 /* current interlace field number */ | ||
79 | #define VDC_RS_DFI_TOP 0x00000000 /* - top field */ | ||
80 | #define VDC_RS_DFI_BOTTOM 0x00010000 /* - bottom field */ | ||
81 | #define VDC_RS_DCSR 0x00000010 /* cursor state */ | ||
82 | #define VDC_RS_DCM 0x00000003 /* display mode */ | ||
83 | #define VDC_RS_DCM_DISABLED 0x00000000 /* - display disabled */ | ||
84 | #define VDC_RS_DCM_STOPPED 0x00000001 /* - VDC stopped */ | ||
85 | #define VDC_RS_DCM_FREERUNNING 0x00000002 /* - VDC free-running */ | ||
86 | #define VDC_RS_DCM_TRANSFERRING 0x00000003 /* - data being transferred to VDC */ | ||
87 | |||
88 | /* | ||
89 | * video capture controller | ||
90 | */ | ||
91 | #define __get_MB93493_VCC(X) __get_MB93493(MB93493_VCC_##X) | ||
92 | #define __set_MB93493_VCC(X,V) __set_MB93493(MB93493_VCC_##X, (V)) | ||
93 | |||
94 | #define MB93493_VCC_RREDUCT 0x104 /* reduction rate */ | ||
95 | #define MB93493_VCC_RHY 0x108 /* horizontal brightness filter coefficients */ | ||
96 | #define MB93493_VCC_RHC 0x10c /* horizontal colour-difference filter coefficients */ | ||
97 | #define MB93493_VCC_RHSIZE 0x110 /* horizontal cycle sizes */ | ||
98 | #define MB93493_VCC_RHBC 0x114 /* horizontal back porch size */ | ||
99 | #define MB93493_VCC_RVCC 0x118 /* vertical capture period */ | ||
100 | #define MB93493_VCC_RVBC 0x11c /* vertical back porch period */ | ||
101 | #define MB93493_VCC_RV 0x120 /* vertical filter coefficients */ | ||
102 | #define MB93493_VCC_RDTS 0x128 /* DMA transfer size */ | ||
103 | #define MB93493_VCC_RDTS_4B 0x01000000 /* 4-byte transfer */ | ||
104 | #define MB93493_VCC_RDTS_32B 0x03000000 /* 32-byte transfer */ | ||
105 | #define MB93493_VCC_RDTS_SHIFT 24 | ||
106 | #define MB93493_VCC_RCC 0x130 /* VCC control */ | ||
107 | #define MB93493_VCC_RIS 0x134 /* VCC interrupt status */ | ||
108 | |||
109 | #define __addr_MB93493_VCC_TPI(X) (__region_CS3 + 0x180 + (X)) | ||
110 | |||
111 | #define VCC_RHSIZE_RHCC 0x000007ff | ||
112 | #define VCC_RHSIZE_RHCC_SHIFT 0 | ||
113 | #define VCC_RHSIZE_RHTCC 0x0fff0000 | ||
114 | #define VCC_RHSIZE_RHTCC_SHIFT 16 | ||
115 | |||
116 | #define VCC_RVBC_RVBC 0x00003f00 | ||
117 | #define VCC_RVBC_RVBC_SHIFT 8 | ||
118 | |||
119 | #define VCC_RREDUCT_RHR 0x07ff0000 | ||
120 | #define VCC_RREDUCT_RHR_SHIFT 16 | ||
121 | #define VCC_RREDUCT_RVR 0x000007ff | ||
122 | #define VCC_RREDUCT_RVR_SHIFT 0 | ||
123 | |||
124 | #define VCC_RCC_CE 0x00000001 /* VCC enable */ | ||
125 | #define VCC_RCC_CS 0x00000002 /* request video capture start */ | ||
126 | #define VCC_RCC_CPF 0x0000000c /* pixel format */ | ||
127 | #define VCC_RCC_CPF_YCBCR_16 0x00000000 /* - YCbCr 4:2:2 16-bit format */ | ||
128 | #define VCC_RCC_CPF_RGB 0x00000004 /* - RGB 4:4:4 format */ | ||
129 | #define VCC_RCC_CPF_YCBCR_24 0x00000008 /* - YCbCr 4:2:2 24-bit format */ | ||
130 | #define VCC_RCC_CPF_BT656 0x0000000c /* - ITU R-BT.656 format */ | ||
131 | #define VCC_RCC_CPF_SHIFT 2 | ||
132 | #define VCC_RCC_CSR 0x00000080 /* request reset */ | ||
133 | #define VCC_RCC_HSIP 0x00000100 /* HSYNC polarity */ | ||
134 | #define VCC_RCC_HSIP_LOACT 0x00000000 /* - low active */ | ||
135 | #define VCC_RCC_HSIP_HIACT 0x00000100 /* - high active */ | ||
136 | #define VCC_RCC_VSIP 0x00000200 /* VSYNC polarity */ | ||
137 | #define VCC_RCC_VSIP_LOACT 0x00000000 /* - low active */ | ||
138 | #define VCC_RCC_VSIP_HIACT 0x00000200 /* - high active */ | ||
139 | #define VCC_RCC_CIE 0x00000800 /* interrupt enable */ | ||
140 | #define VCC_RCC_CFP 0x00001000 /* RGB pixel packing */ | ||
141 | #define VCC_RCC_CFP_4TO3 0x00000000 /* - pack 4 pixels into 3 words */ | ||
142 | #define VCC_RCC_CFP_1TO1 0x00001000 /* - pack 1 pixel into 1 words */ | ||
143 | #define VCC_RCC_CSM 0x00006000 /* interlace specification */ | ||
144 | #define VCC_RCC_CSM_ONEPASS 0x00002000 /* - non-interlaced */ | ||
145 | #define VCC_RCC_CSM_INTERLACE 0x00004000 /* - interlaced */ | ||
146 | #define VCC_RCC_CSM_SHIFT 13 | ||
147 | #define VCC_RCC_ES 0x00008000 /* capture start polarity */ | ||
148 | #define VCC_RCC_ES_NEG 0x00000000 /* - negative edge */ | ||
149 | #define VCC_RCC_ES_POS 0x00008000 /* - positive edge */ | ||
150 | #define VCC_RCC_IFI 0x00080000 /* inferlace field evaluation reverse */ | ||
151 | #define VCC_RCC_FDTS 0x00300000 /* interlace field start */ | ||
152 | #define VCC_RCC_FDTS_3_8 0x00000000 /* - 3/8 of horizontal entire cycle */ | ||
153 | #define VCC_RCC_FDTS_1_4 0x00100000 /* - 1/4 of horizontal entire cycle */ | ||
154 | #define VCC_RCC_FDTS_7_16 0x00200000 /* - 7/16 of horizontal entire cycle */ | ||
155 | #define VCC_RCC_FDTS_SHIFT 20 | ||
156 | #define VCC_RCC_MOV 0x00400000 /* test bit - always set to 1 */ | ||
157 | #define VCC_RCC_STP 0x00800000 /* request video capture stop */ | ||
158 | #define VCC_RCC_TO 0x01000000 /* input during top-field only */ | ||
159 | |||
160 | #define VCC_RIS_VSYNC 0x01000000 /* VSYNC interrupt */ | ||
161 | #define VCC_RIS_OV 0x02000000 /* overflow interrupt */ | ||
162 | #define VCC_RIS_BOTTOM 0x08000000 /* interlace bottom field */ | ||
163 | #define VCC_RIS_STARTED 0x10000000 /* capture started */ | ||
164 | |||
165 | /* | ||
166 | * I2C | ||
167 | */ | ||
168 | #define MB93493_I2C_BSR 0x340 /* bus status */ | ||
169 | #define MB93493_I2C_BCR 0x344 /* bus control */ | ||
170 | #define MB93493_I2C_CCR 0x348 /* clock control */ | ||
171 | #define MB93493_I2C_ADR 0x34c /* address */ | ||
172 | #define MB93493_I2C_DTR 0x350 /* data */ | ||
173 | #define MB93493_I2C_BC2R 0x35c /* bus control 2 */ | ||
174 | |||
175 | #define __addr_MB93493_I2C(port,X) (__region_CS3 + MB93493_I2C_##X + ((port)*0x20)) | ||
176 | #define __get_MB93493_I2C(port,X) __get_MB93493(MB93493_I2C_##X + ((port)*0x20)) | ||
177 | #define __set_MB93493_I2C(port,X,V) __set_MB93493(MB93493_I2C_##X + ((port)*0x20), (V)) | ||
178 | |||
179 | #define I2C_BSR_BB (1 << 7) | ||
180 | |||
181 | /* | ||
182 | * audio controller (I2S) registers | ||
183 | */ | ||
184 | #define __get_MB93493_I2S(X) __get_MB93493(MB93493_I2S_##X) | ||
185 | #define __set_MB93493_I2S(X,V) __set_MB93493(MB93493_I2S_##X, (V)) | ||
186 | |||
187 | #define MB93493_I2S_ALDR 0x300 /* L-channel data */ | ||
188 | #define MB93493_I2S_ARDR 0x304 /* R-channel data */ | ||
189 | #define MB93493_I2S_APDR 0x308 /* 16-bit packed data */ | ||
190 | #define MB93493_I2S_AISTR 0x310 /* status */ | ||
191 | #define MB93493_I2S_AICR 0x314 /* control */ | ||
192 | |||
193 | #define __addr_MB93493_I2S_ALDR(X) (__region_CS3 + MB93493_I2S_ALDR + (X)) | ||
194 | #define __addr_MB93493_I2S_ARDR(X) (__region_CS3 + MB93493_I2S_ARDR + (X)) | ||
195 | #define __addr_MB93493_I2S_APDR(X) (__region_CS3 + MB93493_I2S_APDR + (X)) | ||
196 | #define __addr_MB93493_I2S_ADR(X) (__region_CS3 + 0x320 + (X)) | ||
197 | |||
198 | #define I2S_AISTR_OTST 0x00000003 /* status of output data transfer */ | ||
199 | #define I2S_AISTR_OTR 0x00000010 /* output transfer request pending */ | ||
200 | #define I2S_AISTR_OUR 0x00000020 /* output FIFO underrun detected */ | ||
201 | #define I2S_AISTR_OOR 0x00000040 /* output FIFO overrun detected */ | ||
202 | #define I2S_AISTR_ODS 0x00000100 /* output DMA transfer size */ | ||
203 | #define I2S_AISTR_ODE 0x00000400 /* output DMA transfer request enable */ | ||
204 | #define I2S_AISTR_OTRIE 0x00001000 /* output transfer request interrupt enable */ | ||
205 | #define I2S_AISTR_OURIE 0x00002000 /* output FIFO underrun interrupt enable */ | ||
206 | #define I2S_AISTR_OORIE 0x00004000 /* output FIFO overrun interrupt enable */ | ||
207 | #define I2S_AISTR__OUT_MASK 0x00007570 | ||
208 | #define I2S_AISTR_ITST 0x00030000 /* status of input data transfer */ | ||
209 | #define I2S_AISTR_ITST_SHIFT 16 | ||
210 | #define I2S_AISTR_ITR 0x00100000 /* input transfer request pending */ | ||
211 | #define I2S_AISTR_IUR 0x00200000 /* input FIFO underrun detected */ | ||
212 | #define I2S_AISTR_IOR 0x00400000 /* input FIFO overrun detected */ | ||
213 | #define I2S_AISTR_IDS 0x01000000 /* input DMA transfer size */ | ||
214 | #define I2S_AISTR_IDE 0x04000000 /* input DMA transfer request enable */ | ||
215 | #define I2S_AISTR_ITRIE 0x10000000 /* input transfer request interrupt enable */ | ||
216 | #define I2S_AISTR_IURIE 0x20000000 /* input FIFO underrun interrupt enable */ | ||
217 | #define I2S_AISTR_IORIE 0x40000000 /* input FIFO overrun interrupt enable */ | ||
218 | #define I2S_AISTR__IN_MASK 0x75700000 | ||
219 | |||
220 | #define I2S_AICR_MI 0x00000001 /* mono input requested */ | ||
221 | #define I2S_AICR_AMI 0x00000002 /* relation between LRCKI/FS1 and SDI */ | ||
222 | #define I2S_AICR_LRI 0x00000004 /* function of LRCKI pin */ | ||
223 | #define I2S_AICR_SDMI 0x00000070 /* format of input audio data */ | ||
224 | #define I2S_AICR_SDMI_SHIFT 4 | ||
225 | #define I2S_AICR_CLI 0x00000080 /* input FIFO clearing control */ | ||
226 | #define I2S_AICR_IM 0x00000300 /* input state control */ | ||
227 | #define I2S_AICR_IM_SHIFT 8 | ||
228 | #define I2S_AICR__IN_MASK 0x000003f7 | ||
229 | #define I2S_AICR_MO 0x00001000 /* mono output requested */ | ||
230 | #define I2S_AICR_AMO 0x00002000 /* relation between LRCKO/FS0 and SDO */ | ||
231 | #define I2S_AICR_AMO_SHIFT 13 | ||
232 | #define I2S_AICR_LRO 0x00004000 /* function of LRCKO pin */ | ||
233 | #define I2S_AICR_SDMO 0x00070000 /* format of output audio data */ | ||
234 | #define I2S_AICR_SDMO_SHIFT 16 | ||
235 | #define I2S_AICR_CLO 0x00080000 /* output FIFO clearing control */ | ||
236 | #define I2S_AICR_OM 0x00100000 /* output state control */ | ||
237 | #define I2S_AICR__OUT_MASK 0x001f7000 | ||
238 | #define I2S_AICR_DIV 0x03000000 /* frequency division rate */ | ||
239 | #define I2S_AICR_DIV_SHIFT 24 | ||
240 | #define I2S_AICR_FL 0x20000000 /* frame length */ | ||
241 | #define I2S_AICR_FS 0x40000000 /* frame sync method */ | ||
242 | #define I2S_AICR_ME 0x80000000 /* master enable */ | ||
243 | |||
244 | /* | ||
245 | * PCMCIA | ||
246 | */ | ||
247 | #define __addr_MB93493_PCMCIA(X) ((volatile unsigned long *)(__region_CS5 + (X))) | ||
248 | |||
249 | /* | ||
250 | * GPIO | ||
251 | */ | ||
252 | #define __get_MB93493_GPIO_PDR(X) __get_MB93493(0x380 + (X) * 0xc0) | ||
253 | #define __set_MB93493_GPIO_PDR(X,V) __set_MB93493(0x380 + (X) * 0xc0, (V)) | ||
254 | |||
255 | #define __get_MB93493_GPIO_GPDR(X) __get_MB93493(0x384 + (X) * 0xc0) | ||
256 | #define __set_MB93493_GPIO_GPDR(X,V) __set_MB93493(0x384 + (X) * 0xc0, (V)) | ||
257 | |||
258 | #define __get_MB93493_GPIO_SIR(X) __get_MB93493(0x388 + (X) * 0xc0) | ||
259 | #define __set_MB93493_GPIO_SIR(X,V) __set_MB93493(0x388 + (X) * 0xc0, (V)) | ||
260 | |||
261 | #define __get_MB93493_GPIO_SOR(X) __get_MB93493(0x38c + (X) * 0xc0) | ||
262 | #define __set_MB93493_GPIO_SOR(X,V) __set_MB93493(0x38c + (X) * 0xc0, (V)) | ||
263 | |||
264 | #define __get_MB93493_GPIO_PDSR(X) __get_MB93493(0x390 + (X) * 0xc0) | ||
265 | #define __set_MB93493_GPIO_PDSR(X,V) __set_MB93493(0x390 + (X) * 0xc0, (V)) | ||
266 | |||
267 | #define __get_MB93493_GPIO_PDCR(X) __get_MB93493(0x394 + (X) * 0xc0) | ||
268 | #define __set_MB93493_GPIO_PDCR(X,V) __set_MB93493(0x394 + (X) * 0xc0, (V)) | ||
269 | |||
270 | #define __get_MB93493_GPIO_INTST(X) __get_MB93493(0x398 + (X) * 0xc0) | ||
271 | #define __set_MB93493_GPIO_INTST(X,V) __set_MB93493(0x398 + (X) * 0xc0, (V)) | ||
272 | |||
273 | #define __get_MB93493_GPIO_IEHL(X) __get_MB93493(0x39c + (X) * 0xc0) | ||
274 | #define __set_MB93493_GPIO_IEHL(X,V) __set_MB93493(0x39c + (X) * 0xc0, (V)) | ||
275 | |||
276 | #define __get_MB93493_GPIO_IELH(X) __get_MB93493(0x3a0 + (X) * 0xc0) | ||
277 | #define __set_MB93493_GPIO_IELH(X,V) __set_MB93493(0x3a0 + (X) * 0xc0, (V)) | ||
278 | |||
279 | #endif /* _ASM_MB93493_REGS_H */ | ||
diff --git a/include/asm-frv/mem-layout.h b/include/asm-frv/mem-layout.h new file mode 100644 index 000000000000..a025dd4514e7 --- /dev/null +++ b/include/asm-frv/mem-layout.h | |||
@@ -0,0 +1,78 @@ | |||
1 | /* mem-layout.h: memory layout | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_MEM_LAYOUT_H | ||
13 | #define _ASM_MEM_LAYOUT_H | ||
14 | |||
15 | #ifndef __ASSEMBLY__ | ||
16 | #define __UL(X) ((unsigned long) (X)) | ||
17 | #else | ||
18 | #define __UL(X) (X) | ||
19 | #endif | ||
20 | |||
21 | /* | ||
22 | * PAGE_SHIFT determines the page size | ||
23 | */ | ||
24 | #define PAGE_SHIFT 14 | ||
25 | |||
26 | #ifndef __ASSEMBLY__ | ||
27 | #define PAGE_SIZE (1UL << PAGE_SHIFT) | ||
28 | #else | ||
29 | #define PAGE_SIZE (1 << PAGE_SHIFT) | ||
30 | #endif | ||
31 | |||
32 | #define PAGE_MASK (~(PAGE_SIZE-1)) | ||
33 | |||
34 | /*****************************************************************************/ | ||
35 | /* | ||
36 | * virtual memory layout from kernel's point of view | ||
37 | */ | ||
38 | #define PAGE_OFFSET ((unsigned long) &__page_offset) | ||
39 | |||
40 | #ifdef CONFIG_MMU | ||
41 | |||
42 | /* see Documentation/fujitsu/frv/mmu-layout.txt */ | ||
43 | #define KERNEL_LOWMEM_START __UL(0xc0000000) | ||
44 | #define KERNEL_LOWMEM_END __UL(0xd0000000) | ||
45 | #define VMALLOC_START __UL(0xd0000000) | ||
46 | #define VMALLOC_END __UL(0xd8000000) | ||
47 | #define PKMAP_BASE __UL(0xd8000000) | ||
48 | #define PKMAP_END __UL(0xdc000000) | ||
49 | #define KMAP_ATOMIC_SECONDARY_FRAME __UL(0xdc000000) | ||
50 | #define KMAP_ATOMIC_PRIMARY_FRAME __UL(0xdd000000) | ||
51 | |||
52 | #endif | ||
53 | |||
54 | #define KERNEL_IO_START __UL(0xe0000000) | ||
55 | |||
56 | |||
57 | /*****************************************************************************/ | ||
58 | /* | ||
59 | * memory layout from userspace's point of view | ||
60 | */ | ||
61 | #define BRK_BASE __UL(2 * 1024 * 1024 + PAGE_SIZE) | ||
62 | #define STACK_TOP __UL(2 * 1024 * 1024) | ||
63 | |||
64 | /* userspace process size */ | ||
65 | #ifdef CONFIG_MMU | ||
66 | #define TASK_SIZE (PAGE_OFFSET) | ||
67 | #else | ||
68 | #define TASK_SIZE __UL(0xFFFFFFFFUL) | ||
69 | #endif | ||
70 | |||
71 | /* base of area at which unspecified mmaps will start */ | ||
72 | #ifdef CONFIG_BINFMT_ELF_FDPIC | ||
73 | #define TASK_UNMAPPED_BASE __UL(16 * 1024 * 1024) | ||
74 | #else | ||
75 | #define TASK_UNMAPPED_BASE __UL(TASK_SIZE / 3) | ||
76 | #endif | ||
77 | |||
78 | #endif /* _ASM_MEM_LAYOUT_H */ | ||
diff --git a/include/asm-frv/mman.h b/include/asm-frv/mman.h new file mode 100644 index 000000000000..c684720dfbdd --- /dev/null +++ b/include/asm-frv/mman.h | |||
@@ -0,0 +1,44 @@ | |||
1 | #ifndef __ASM_MMAN_H__ | ||
2 | #define __ASM_MMAN_H__ | ||
3 | |||
4 | #define PROT_READ 0x1 /* page can be read */ | ||
5 | #define PROT_WRITE 0x2 /* page can be written */ | ||
6 | #define PROT_EXEC 0x4 /* page can be executed */ | ||
7 | #define PROT_SEM 0x8 /* page may be used for atomic ops */ | ||
8 | #define PROT_NONE 0x0 /* page can not be accessed */ | ||
9 | #define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ | ||
10 | #define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ | ||
11 | |||
12 | #define MAP_SHARED 0x01 /* Share changes */ | ||
13 | #define MAP_PRIVATE 0x02 /* Changes are private */ | ||
14 | #define MAP_TYPE 0x0f /* Mask for type of mapping */ | ||
15 | #define MAP_FIXED 0x10 /* Interpret addr exactly */ | ||
16 | #define MAP_ANONYMOUS 0x20 /* don't use a file */ | ||
17 | |||
18 | #define MAP_GROWSDOWN 0x0100 /* stack-like segment */ | ||
19 | #define MAP_DENYWRITE 0x0800 /* ETXTBSY */ | ||
20 | #define MAP_EXECUTABLE 0x1000 /* mark it as an executable */ | ||
21 | #define MAP_LOCKED 0x2000 /* pages are locked */ | ||
22 | #define MAP_NORESERVE 0x4000 /* don't check for reservations */ | ||
23 | #define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ | ||
24 | #define MAP_NONBLOCK 0x10000 /* do not block on IO */ | ||
25 | |||
26 | #define MS_ASYNC 1 /* sync memory asynchronously */ | ||
27 | #define MS_INVALIDATE 2 /* invalidate the caches */ | ||
28 | #define MS_SYNC 4 /* synchronous memory sync */ | ||
29 | |||
30 | #define MCL_CURRENT 1 /* lock all current mappings */ | ||
31 | #define MCL_FUTURE 2 /* lock all future mappings */ | ||
32 | |||
33 | #define MADV_NORMAL 0x0 /* default page-in behavior */ | ||
34 | #define MADV_RANDOM 0x1 /* page-in minimum required */ | ||
35 | #define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ | ||
36 | #define MADV_WILLNEED 0x3 /* pre-fault pages */ | ||
37 | #define MADV_DONTNEED 0x4 /* discard these pages */ | ||
38 | |||
39 | /* compatibility flags */ | ||
40 | #define MAP_ANON MAP_ANONYMOUS | ||
41 | #define MAP_FILE 0 | ||
42 | |||
43 | #endif /* __ASM_MMAN_H__ */ | ||
44 | |||
diff --git a/include/asm-frv/mmu.h b/include/asm-frv/mmu.h new file mode 100644 index 000000000000..22c03714fb14 --- /dev/null +++ b/include/asm-frv/mmu.h | |||
@@ -0,0 +1,42 @@ | |||
1 | /* mmu.h: memory management context for FR-V with or without MMU support | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | #ifndef _ASM_MMU_H | ||
12 | #define _ASM_MMU_H | ||
13 | |||
14 | typedef struct { | ||
15 | #ifdef CONFIG_MMU | ||
16 | struct list_head id_link; /* link in list of context ID owners */ | ||
17 | unsigned short id; /* MMU context ID */ | ||
18 | unsigned short id_busy; /* true if ID is in CXNR */ | ||
19 | unsigned long itlb_cached_pge; /* [SCR0] PGE cached for insn TLB handler */ | ||
20 | unsigned long itlb_ptd_mapping; /* [DAMR4] PTD mapping for itlb cached PGE */ | ||
21 | unsigned long dtlb_cached_pge; /* [SCR1] PGE cached for data TLB handler */ | ||
22 | unsigned long dtlb_ptd_mapping; /* [DAMR5] PTD mapping for dtlb cached PGE */ | ||
23 | |||
24 | #else | ||
25 | struct vm_list_struct *vmlist; | ||
26 | unsigned long end_brk; | ||
27 | |||
28 | #endif | ||
29 | |||
30 | #ifdef CONFIG_BINFMT_ELF_FDPIC | ||
31 | unsigned long exec_fdpic_loadmap; | ||
32 | unsigned long interp_fdpic_loadmap; | ||
33 | #endif | ||
34 | |||
35 | } mm_context_t; | ||
36 | |||
37 | #ifdef CONFIG_MMU | ||
38 | extern int __nongpreldata cxn_pinned; | ||
39 | extern int cxn_pin_by_pid(pid_t pid); | ||
40 | #endif | ||
41 | |||
42 | #endif /* _ASM_MMU_H */ | ||
diff --git a/include/asm-frv/mmu_context.h b/include/asm-frv/mmu_context.h new file mode 100644 index 000000000000..4fb9ea3c5bc9 --- /dev/null +++ b/include/asm-frv/mmu_context.h | |||
@@ -0,0 +1,50 @@ | |||
1 | /* mmu_context.h: MMU context management routines | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_MMU_CONTEXT_H | ||
13 | #define _ASM_MMU_CONTEXT_H | ||
14 | |||
15 | #include <linux/config.h> | ||
16 | #include <asm/setup.h> | ||
17 | #include <asm/page.h> | ||
18 | #include <asm/pgalloc.h> | ||
19 | |||
20 | static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) | ||
21 | { | ||
22 | } | ||
23 | |||
24 | #ifdef CONFIG_MMU | ||
25 | extern int init_new_context(struct task_struct *tsk, struct mm_struct *mm); | ||
26 | extern void change_mm_context(mm_context_t *old, mm_context_t *ctx, pgd_t *_pgd); | ||
27 | extern void destroy_context(struct mm_struct *mm); | ||
28 | |||
29 | #else | ||
30 | #define init_new_context(tsk, mm) ({ 0; }) | ||
31 | #define change_mm_context(old, ctx, _pml4) do {} while(0) | ||
32 | #define destroy_context(mm) do {} while(0) | ||
33 | #endif | ||
34 | |||
35 | #define switch_mm(prev, next, tsk) \ | ||
36 | do { \ | ||
37 | if (prev != next) \ | ||
38 | change_mm_context(&prev->context, &next->context, next->pgd); \ | ||
39 | } while(0) | ||
40 | |||
41 | #define activate_mm(prev, next) \ | ||
42 | do { \ | ||
43 | change_mm_context(&prev->context, &next->context, next->pgd); \ | ||
44 | } while(0) | ||
45 | |||
46 | #define deactivate_mm(tsk, mm) \ | ||
47 | do { \ | ||
48 | } while(0) | ||
49 | |||
50 | #endif | ||
diff --git a/include/asm-frv/module.h b/include/asm-frv/module.h new file mode 100644 index 000000000000..3223cfaef743 --- /dev/null +++ b/include/asm-frv/module.h | |||
@@ -0,0 +1,20 @@ | |||
1 | /* module.h: FRV module stuff | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | #ifndef _ASM_MODULE_H | ||
12 | #define _ASM_MODULE_H | ||
13 | |||
14 | #define module_map(x) vmalloc(x) | ||
15 | #define module_unmap(x) vfree(x) | ||
16 | #define module_arch_init(x) (0) | ||
17 | #define arch_init_modules(x) do { } while (0) | ||
18 | |||
19 | #endif /* _ASM_MODULE_H */ | ||
20 | |||
diff --git a/include/asm-frv/msgbuf.h b/include/asm-frv/msgbuf.h new file mode 100644 index 000000000000..97ceb55a06fb --- /dev/null +++ b/include/asm-frv/msgbuf.h | |||
@@ -0,0 +1,32 @@ | |||
1 | #ifndef _ASM_MSGBUF_H | ||
2 | #define _ASM_MSGBUF_H | ||
3 | |||
4 | /* | ||
5 | * The msqid64_ds structure for FR-V architecture. | ||
6 | * Note extra padding because this structure is passed back and forth | ||
7 | * between kernel and user space. | ||
8 | * | ||
9 | * Pad space is left for: | ||
10 | * - 64-bit time_t to solve y2038 problem | ||
11 | * - 2 miscellaneous 32-bit values | ||
12 | */ | ||
13 | |||
14 | struct msqid64_ds { | ||
15 | struct ipc64_perm msg_perm; | ||
16 | __kernel_time_t msg_stime; /* last msgsnd time */ | ||
17 | unsigned long __unused1; | ||
18 | __kernel_time_t msg_rtime; /* last msgrcv time */ | ||
19 | unsigned long __unused2; | ||
20 | __kernel_time_t msg_ctime; /* last change time */ | ||
21 | unsigned long __unused3; | ||
22 | unsigned long msg_cbytes; /* current number of bytes on queue */ | ||
23 | unsigned long msg_qnum; /* number of messages in queue */ | ||
24 | unsigned long msg_qbytes; /* max number of bytes on queue */ | ||
25 | __kernel_pid_t msg_lspid; /* pid of last msgsnd */ | ||
26 | __kernel_pid_t msg_lrpid; /* last receive pid */ | ||
27 | unsigned long __unused4; | ||
28 | unsigned long __unused5; | ||
29 | }; | ||
30 | |||
31 | #endif /* _ASM_MSGBUF_H */ | ||
32 | |||
diff --git a/include/asm-frv/namei.h b/include/asm-frv/namei.h new file mode 100644 index 000000000000..84ddd6445f23 --- /dev/null +++ b/include/asm-frv/namei.h | |||
@@ -0,0 +1,18 @@ | |||
1 | /* | ||
2 | * asm/namei.h | ||
3 | * | ||
4 | * Included from linux/fs/namei.c | ||
5 | */ | ||
6 | |||
7 | #ifndef __ASM_NAMEI_H | ||
8 | #define __ASM_NAMEI_H | ||
9 | |||
10 | /* This dummy routine maybe changed to something useful | ||
11 | * for /usr/gnemul/ emulation stuff. | ||
12 | * Look at asm-sparc/namei.h for details. | ||
13 | */ | ||
14 | |||
15 | #define __emul_prefix() NULL | ||
16 | |||
17 | #endif | ||
18 | |||
diff --git a/include/asm-frv/page.h b/include/asm-frv/page.h new file mode 100644 index 000000000000..f7914f1782b0 --- /dev/null +++ b/include/asm-frv/page.h | |||
@@ -0,0 +1,105 @@ | |||
1 | #ifndef _ASM_PAGE_H | ||
2 | #define _ASM_PAGE_H | ||
3 | |||
4 | #ifdef __KERNEL__ | ||
5 | |||
6 | #include <linux/config.h> | ||
7 | #include <asm/virtconvert.h> | ||
8 | #include <asm/mem-layout.h> | ||
9 | #include <asm/sections.h> | ||
10 | #include <asm/setup.h> | ||
11 | |||
12 | #ifndef __ASSEMBLY__ | ||
13 | |||
14 | #define get_user_page(vaddr) __get_free_page(GFP_KERNEL) | ||
15 | #define free_user_page(page, addr) free_page(addr) | ||
16 | |||
17 | #define clear_page(pgaddr) memset((pgaddr), 0, PAGE_SIZE) | ||
18 | #define copy_page(to,from) memcpy((to), (from), PAGE_SIZE) | ||
19 | |||
20 | #define clear_user_page(pgaddr, vaddr, page) memset((pgaddr), 0, PAGE_SIZE) | ||
21 | #define copy_user_page(vto, vfrom, vaddr, topg) memcpy((vto), (vfrom), PAGE_SIZE) | ||
22 | |||
23 | /* | ||
24 | * These are used to make use of C type-checking.. | ||
25 | */ | ||
26 | typedef struct { unsigned long pte; } pte_t; | ||
27 | typedef struct { unsigned long ste[64];} pmd_t; | ||
28 | typedef struct { pmd_t pue[1]; } pud_t; | ||
29 | typedef struct { pud_t pge[1]; } pgd_t; | ||
30 | typedef struct { unsigned long pgprot; } pgprot_t; | ||
31 | |||
32 | #define pte_val(x) ((x).pte) | ||
33 | #define pmd_val(x) ((x).ste[0]) | ||
34 | #define pud_val(x) ((x).pue[0]) | ||
35 | #define pgd_val(x) ((x).pge[0]) | ||
36 | #define pgprot_val(x) ((x).pgprot) | ||
37 | |||
38 | #define __pte(x) ((pte_t) { (x) } ) | ||
39 | #define __pmd(x) ((pmd_t) { (x) } ) | ||
40 | #define __pud(x) ((pud_t) { (x) } ) | ||
41 | #define __pgd(x) ((pgd_t) { (x) } ) | ||
42 | #define __pgprot(x) ((pgprot_t) { (x) } ) | ||
43 | #define PTE_MASK PAGE_MASK | ||
44 | |||
45 | /* to align the pointer to the (next) page boundary */ | ||
46 | #define PAGE_ALIGN(addr) (((addr) + PAGE_SIZE - 1) & PAGE_MASK) | ||
47 | |||
48 | /* Pure 2^n version of get_order */ | ||
49 | static inline int get_order(unsigned long size) __attribute_const__; | ||
50 | static inline int get_order(unsigned long size) | ||
51 | { | ||
52 | int order; | ||
53 | |||
54 | size = (size - 1) >> (PAGE_SHIFT - 1); | ||
55 | order = -1; | ||
56 | do { | ||
57 | size >>= 1; | ||
58 | order++; | ||
59 | } while (size); | ||
60 | return order; | ||
61 | } | ||
62 | |||
63 | #define devmem_is_allowed(pfn) 1 | ||
64 | |||
65 | #define __pa(vaddr) virt_to_phys((void *) vaddr) | ||
66 | #define __va(paddr) phys_to_virt((unsigned long) paddr) | ||
67 | |||
68 | #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) | ||
69 | |||
70 | extern unsigned long max_low_pfn; | ||
71 | extern unsigned long min_low_pfn; | ||
72 | extern unsigned long max_pfn; | ||
73 | |||
74 | #ifdef CONFIG_MMU | ||
75 | #define pfn_to_page(pfn) (mem_map + (pfn)) | ||
76 | #define page_to_pfn(page) ((unsigned long) ((page) - mem_map)) | ||
77 | #define pfn_valid(pfn) ((pfn) < max_mapnr) | ||
78 | |||
79 | #else | ||
80 | #define pfn_to_page(pfn) (&mem_map[(pfn) - (PAGE_OFFSET >> PAGE_SHIFT)]) | ||
81 | #define page_to_pfn(page) ((PAGE_OFFSET >> PAGE_SHIFT) + (unsigned long) ((page) - mem_map)) | ||
82 | #define pfn_valid(pfn) ((pfn) >= min_low_pfn && (pfn) < max_low_pfn) | ||
83 | |||
84 | #endif | ||
85 | |||
86 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) | ||
87 | #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) | ||
88 | |||
89 | |||
90 | #ifdef CONFIG_MMU | ||
91 | #define VM_DATA_DEFAULT_FLAGS \ | ||
92 | (VM_READ | VM_WRITE | \ | ||
93 | ((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \ | ||
94 | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) | ||
95 | #endif | ||
96 | |||
97 | #endif /* __ASSEMBLY__ */ | ||
98 | |||
99 | #endif /* __KERNEL__ */ | ||
100 | |||
101 | #ifdef CONFIG_CONTIGUOUS_PAGE_ALLOC | ||
102 | #define WANT_PAGE_VIRTUAL 1 | ||
103 | #endif | ||
104 | |||
105 | #endif /* _ASM_PAGE_H */ | ||
diff --git a/include/asm-frv/param.h b/include/asm-frv/param.h new file mode 100644 index 000000000000..168381ebb41a --- /dev/null +++ b/include/asm-frv/param.h | |||
@@ -0,0 +1,23 @@ | |||
1 | #ifndef _ASM_PARAM_H | ||
2 | #define _ASM_PARAM_H | ||
3 | |||
4 | #ifdef __KERNEL__ | ||
5 | #define HZ 1000 /* Internal kernel timer frequency */ | ||
6 | #define USER_HZ 100 /* .. some user interfaces are in "ticks" */ | ||
7 | #define CLOCKS_PER_SEC (USER_HZ) /* like times() */ | ||
8 | #endif | ||
9 | |||
10 | #ifndef HZ | ||
11 | #define HZ 100 | ||
12 | #endif | ||
13 | |||
14 | #define EXEC_PAGESIZE 16384 | ||
15 | |||
16 | #ifndef NOGROUP | ||
17 | #define NOGROUP (-1) | ||
18 | #endif | ||
19 | |||
20 | #define MAXHOSTNAMELEN 64 /* max length of hostname */ | ||
21 | #define COMMAND_LINE_SIZE 512 | ||
22 | |||
23 | #endif /* _ASM_PARAM_H */ | ||
diff --git a/include/asm-frv/pci.h b/include/asm-frv/pci.h new file mode 100644 index 000000000000..a6a469231f62 --- /dev/null +++ b/include/asm-frv/pci.h | |||
@@ -0,0 +1,108 @@ | |||
1 | /* pci.h: FR-V specific PCI declarations | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * - Derived from include/asm-m68k/pci.h | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License | ||
9 | * as published by the Free Software Foundation; either version | ||
10 | * 2 of the License, or (at your option) any later version. | ||
11 | */ | ||
12 | |||
13 | #ifndef ASM_PCI_H | ||
14 | #define ASM_PCI_H | ||
15 | |||
16 | #include <linux/config.h> | ||
17 | #include <linux/mm.h> | ||
18 | #include <asm/scatterlist.h> | ||
19 | #include <asm-generic/pci-dma-compat.h> | ||
20 | #include <asm-generic/pci.h> | ||
21 | |||
22 | struct pci_dev; | ||
23 | |||
24 | #define pcibios_assign_all_busses() 0 | ||
25 | |||
26 | static inline void pcibios_add_platform_entries(struct pci_dev *dev) | ||
27 | { | ||
28 | } | ||
29 | |||
30 | extern void pcibios_set_master(struct pci_dev *dev); | ||
31 | |||
32 | extern void pcibios_penalize_isa_irq(int irq); | ||
33 | |||
34 | #ifdef CONFIG_MMU | ||
35 | extern void *consistent_alloc(int gfp, size_t size, dma_addr_t *dma_handle); | ||
36 | extern void consistent_free(void *vaddr); | ||
37 | extern void consistent_sync(void *vaddr, size_t size, int direction); | ||
38 | extern void consistent_sync_page(struct page *page, unsigned long offset, | ||
39 | size_t size, int direction); | ||
40 | #endif | ||
41 | |||
42 | extern void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size, | ||
43 | dma_addr_t *dma_handle); | ||
44 | |||
45 | extern void pci_free_consistent(struct pci_dev *hwdev, size_t size, | ||
46 | void *vaddr, dma_addr_t dma_handle); | ||
47 | |||
48 | /* This is always fine. */ | ||
49 | #define pci_dac_dma_supported(pci_dev, mask) (1) | ||
50 | |||
51 | /* Return the index of the PCI controller for device PDEV. */ | ||
52 | #define pci_controller_num(PDEV) (0) | ||
53 | |||
54 | /* The PCI address space does equal the physical memory | ||
55 | * address space. The networking and block device layers use | ||
56 | * this boolean for bounce buffer decisions. | ||
57 | */ | ||
58 | #define PCI_DMA_BUS_IS_PHYS (1) | ||
59 | |||
60 | /* | ||
61 | * These are pretty much arbitary with the CoMEM implementation. | ||
62 | * We have the whole address space to ourselves. | ||
63 | */ | ||
64 | #define PCIBIOS_MIN_IO 0x100 | ||
65 | #define PCIBIOS_MIN_MEM 0x00010000 | ||
66 | |||
67 | /* Make physical memory consistent for a single | ||
68 | * streaming mode DMA translation after a transfer. | ||
69 | * | ||
70 | * If you perform a pci_map_single() but wish to interrogate the | ||
71 | * buffer using the cpu, yet do not wish to teardown the PCI dma | ||
72 | * mapping, you must call this function before doing so. At the | ||
73 | * next point you give the PCI dma address back to the card, the | ||
74 | * device again owns the buffer. | ||
75 | */ | ||
76 | static inline void pci_dma_sync_single(struct pci_dev *hwdev, | ||
77 | dma_addr_t dma_handle, | ||
78 | size_t size, int direction) | ||
79 | { | ||
80 | if (direction == PCI_DMA_NONE) | ||
81 | BUG(); | ||
82 | |||
83 | frv_cache_wback_inv((unsigned long)bus_to_virt(dma_handle), | ||
84 | (unsigned long)bus_to_virt(dma_handle) + size); | ||
85 | } | ||
86 | |||
87 | /* Make physical memory consistent for a set of streaming | ||
88 | * mode DMA translations after a transfer. | ||
89 | * | ||
90 | * The same as pci_dma_sync_single but for a scatter-gather list, | ||
91 | * same rules and usage. | ||
92 | */ | ||
93 | static inline void pci_dma_sync_sg(struct pci_dev *hwdev, | ||
94 | struct scatterlist *sg, | ||
95 | int nelems, int direction) | ||
96 | { | ||
97 | int i; | ||
98 | |||
99 | if (direction == PCI_DMA_NONE) | ||
100 | BUG(); | ||
101 | |||
102 | for (i = 0; i < nelems; i++) | ||
103 | frv_cache_wback_inv(sg_dma_address(&sg[i]), | ||
104 | sg_dma_address(&sg[i])+sg_dma_len(&sg[i])); | ||
105 | } | ||
106 | |||
107 | |||
108 | #endif | ||
diff --git a/include/asm-frv/percpu.h b/include/asm-frv/percpu.h new file mode 100644 index 000000000000..2cad3f874ded --- /dev/null +++ b/include/asm-frv/percpu.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef __ASM_PERCPU_H | ||
2 | #define __ASM_PERCPU_H | ||
3 | |||
4 | #include <asm-generic/percpu.h> | ||
5 | |||
6 | #endif /* __ASM_PERCPU_H */ | ||
diff --git a/include/asm-frv/pgalloc.h b/include/asm-frv/pgalloc.h new file mode 100644 index 000000000000..1bd28f41bfa8 --- /dev/null +++ b/include/asm-frv/pgalloc.h | |||
@@ -0,0 +1,64 @@ | |||
1 | /* pgalloc.h: Page allocation routines for FRV | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | * | ||
11 | * Derived from: | ||
12 | * include/asm-m68knommu/pgalloc.h | ||
13 | * include/asm-i386/pgalloc.h | ||
14 | */ | ||
15 | #ifndef _ASM_PGALLOC_H | ||
16 | #define _ASM_PGALLOC_H | ||
17 | |||
18 | #include <linux/config.h> | ||
19 | #include <asm/setup.h> | ||
20 | #include <asm/virtconvert.h> | ||
21 | |||
22 | #ifdef CONFIG_MMU | ||
23 | |||
24 | #define pmd_populate_kernel(mm, pmd, pte) __set_pmd(pmd, __pa(pte) | _PAGE_TABLE) | ||
25 | #define pmd_populate(MM, PMD, PAGE) \ | ||
26 | do { \ | ||
27 | __set_pmd((PMD), page_to_pfn(PAGE) << PAGE_SHIFT | _PAGE_TABLE); \ | ||
28 | } while(0) | ||
29 | |||
30 | /* | ||
31 | * Allocate and free page tables. | ||
32 | */ | ||
33 | |||
34 | extern pgd_t *pgd_alloc(struct mm_struct *); | ||
35 | extern void pgd_free(pgd_t *); | ||
36 | |||
37 | extern pte_t *pte_alloc_one_kernel(struct mm_struct *, unsigned long); | ||
38 | |||
39 | extern struct page *pte_alloc_one(struct mm_struct *, unsigned long); | ||
40 | |||
41 | static inline void pte_free_kernel(pte_t *pte) | ||
42 | { | ||
43 | free_page((unsigned long)pte); | ||
44 | } | ||
45 | |||
46 | static inline void pte_free(struct page *pte) | ||
47 | { | ||
48 | __free_page(pte); | ||
49 | } | ||
50 | |||
51 | #define __pte_free_tlb(tlb,pte) tlb_remove_page((tlb),(pte)) | ||
52 | |||
53 | /* | ||
54 | * allocating and freeing a pmd is trivial: the 1-entry pmd is | ||
55 | * inside the pgd, so has no extra memory associated with it. | ||
56 | * (In the PAE case we free the pmds as part of the pgd.) | ||
57 | */ | ||
58 | #define pmd_alloc_one(mm, addr) ({ BUG(); ((pmd_t *) 2); }) | ||
59 | #define pmd_free(x) do { } while (0) | ||
60 | #define __pmd_free_tlb(tlb,x) do { } while (0) | ||
61 | |||
62 | #endif /* CONFIG_MMU */ | ||
63 | |||
64 | #endif /* _ASM_PGALLOC_H */ | ||
diff --git a/include/asm-frv/pgtable.h b/include/asm-frv/pgtable.h new file mode 100644 index 000000000000..cc1373c4b790 --- /dev/null +++ b/include/asm-frv/pgtable.h | |||
@@ -0,0 +1,555 @@ | |||
1 | /* pgtable.h: FR-V page table mangling | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | * | ||
11 | * Derived from: | ||
12 | * include/asm-m68knommu/pgtable.h | ||
13 | * include/asm-i386/pgtable.h | ||
14 | */ | ||
15 | |||
16 | #ifndef _ASM_PGTABLE_H | ||
17 | #define _ASM_PGTABLE_H | ||
18 | |||
19 | #include <linux/config.h> | ||
20 | #include <asm/mem-layout.h> | ||
21 | #include <asm/setup.h> | ||
22 | #include <asm/processor.h> | ||
23 | |||
24 | #ifndef __ASSEMBLY__ | ||
25 | #include <linux/threads.h> | ||
26 | #include <linux/slab.h> | ||
27 | #include <linux/list.h> | ||
28 | #include <linux/spinlock.h> | ||
29 | #endif | ||
30 | |||
31 | #ifndef __ASSEMBLY__ | ||
32 | #if defined(CONFIG_HIGHPTE) | ||
33 | typedef unsigned long pte_addr_t; | ||
34 | #else | ||
35 | typedef pte_t *pte_addr_t; | ||
36 | #endif | ||
37 | #endif | ||
38 | |||
39 | /*****************************************************************************/ | ||
40 | /* | ||
41 | * MMU-less operation case first | ||
42 | */ | ||
43 | #ifndef CONFIG_MMU | ||
44 | |||
45 | #define pgd_present(pgd) (1) /* pages are always present on NO_MM */ | ||
46 | #define pgd_none(pgd) (0) | ||
47 | #define pgd_bad(pgd) (0) | ||
48 | #define pgd_clear(pgdp) | ||
49 | #define kern_addr_valid(addr) (1) | ||
50 | #define pmd_offset(a, b) ((void *) 0) | ||
51 | |||
52 | #define PAGE_NONE __pgprot(0) /* these mean nothing to NO_MM */ | ||
53 | #define PAGE_SHARED __pgprot(0) /* these mean nothing to NO_MM */ | ||
54 | #define PAGE_COPY __pgprot(0) /* these mean nothing to NO_MM */ | ||
55 | #define PAGE_READONLY __pgprot(0) /* these mean nothing to NO_MM */ | ||
56 | #define PAGE_KERNEL __pgprot(0) /* these mean nothing to NO_MM */ | ||
57 | |||
58 | #define __swp_type(x) (0) | ||
59 | #define __swp_offset(x) (0) | ||
60 | #define __swp_entry(typ,off) ((swp_entry_t) { ((typ) | ((off) << 7)) }) | ||
61 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) | ||
62 | #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) | ||
63 | |||
64 | #ifndef __ASSEMBLY__ | ||
65 | static inline int pte_file(pte_t pte) { return 0; } | ||
66 | #endif | ||
67 | |||
68 | #define ZERO_PAGE(vaddr) ({ BUG(); NULL; }) | ||
69 | |||
70 | #define swapper_pg_dir ((pgd_t *) NULL) | ||
71 | |||
72 | #define pgtable_cache_init() do {} while(0) | ||
73 | |||
74 | #else /* !CONFIG_MMU */ | ||
75 | /*****************************************************************************/ | ||
76 | /* | ||
77 | * then MMU operation | ||
78 | */ | ||
79 | |||
80 | /* | ||
81 | * ZERO_PAGE is a global shared page that is always zero: used | ||
82 | * for zero-mapped memory areas etc.. | ||
83 | */ | ||
84 | #ifndef __ASSEMBLY__ | ||
85 | extern unsigned long empty_zero_page; | ||
86 | #define ZERO_PAGE(vaddr) virt_to_page(empty_zero_page) | ||
87 | #endif | ||
88 | |||
89 | /* | ||
90 | * we use 2-level page tables, folding the PMD (mid-level table) into the PGE (top-level entry) | ||
91 | * [see Documentation/fujitsu/frv/mmu-layout.txt] | ||
92 | * | ||
93 | * Page Directory: | ||
94 | * - Size: 16KB | ||
95 | * - 64 PGEs per PGD | ||
96 | * - Each PGE holds 1 PUD and covers 64MB | ||
97 | * | ||
98 | * Page Upper Directory: | ||
99 | * - Size: 256B | ||
100 | * - 1 PUE per PUD | ||
101 | * - Each PUE holds 1 PMD and covers 64MB | ||
102 | * | ||
103 | * Page Mid-Level Directory | ||
104 | * - Size: 256B | ||
105 | * - 1 PME per PMD | ||
106 | * - Each PME holds 64 STEs, all of which point to separate chunks of the same Page Table | ||
107 | * - All STEs are instantiated at the same time | ||
108 | * | ||
109 | * Page Table | ||
110 | * - Size: 16KB | ||
111 | * - 4096 PTEs per PT | ||
112 | * - Each Linux PT is subdivided into 64 FR451 PT's, each of which holds 64 entries | ||
113 | * | ||
114 | * Pages | ||
115 | * - Size: 4KB | ||
116 | * | ||
117 | * total PTEs | ||
118 | * = 1 PML4E * 64 PGEs * 1 PUEs * 1 PMEs * 4096 PTEs | ||
119 | * = 1 PML4E * 64 PGEs * 64 STEs * 64 PTEs/FR451-PT | ||
120 | * = 262144 (or 256 * 1024) | ||
121 | */ | ||
122 | #define PGDIR_SHIFT 26 | ||
123 | #define PGDIR_SIZE (1UL << PGDIR_SHIFT) | ||
124 | #define PGDIR_MASK (~(PGDIR_SIZE - 1)) | ||
125 | #define PTRS_PER_PGD 64 | ||
126 | |||
127 | #define PUD_SHIFT 26 | ||
128 | #define PTRS_PER_PUD 1 | ||
129 | #define PUD_SIZE (1UL << PUD_SHIFT) | ||
130 | #define PUD_MASK (~(PUD_SIZE - 1)) | ||
131 | #define PUE_SIZE 256 | ||
132 | |||
133 | #define PMD_SHIFT 26 | ||
134 | #define PMD_SIZE (1UL << PMD_SHIFT) | ||
135 | #define PMD_MASK (~(PMD_SIZE - 1)) | ||
136 | #define PTRS_PER_PMD 1 | ||
137 | #define PME_SIZE 256 | ||
138 | |||
139 | #define __frv_PT_SIZE 256 | ||
140 | |||
141 | #define PTRS_PER_PTE 4096 | ||
142 | |||
143 | #define USER_PGDS_IN_LAST_PML4 (TASK_SIZE / PGDIR_SIZE) | ||
144 | #define FIRST_USER_PGD_NR 0 | ||
145 | |||
146 | #define USER_PGD_PTRS (PAGE_OFFSET >> PGDIR_SHIFT) | ||
147 | #define KERNEL_PGD_PTRS (PTRS_PER_PGD - USER_PGD_PTRS) | ||
148 | |||
149 | #define TWOLEVEL_PGDIR_SHIFT 26 | ||
150 | #define BOOT_USER_PGD_PTRS (__PAGE_OFFSET >> TWOLEVEL_PGDIR_SHIFT) | ||
151 | #define BOOT_KERNEL_PGD_PTRS (PTRS_PER_PGD - BOOT_USER_PGD_PTRS) | ||
152 | |||
153 | #ifndef __ASSEMBLY__ | ||
154 | |||
155 | extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; | ||
156 | |||
157 | #define pte_ERROR(e) \ | ||
158 | printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, (e).pte) | ||
159 | #define pmd_ERROR(e) \ | ||
160 | printk("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pmd_val(e)) | ||
161 | #define pud_ERROR(e) \ | ||
162 | printk("%s:%d: bad pud %08lx.\n", __FILE__, __LINE__, pmd_val(pud_val(e))) | ||
163 | #define pgd_ERROR(e) \ | ||
164 | printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pmd_val(pud_val(pgd_val(e)))) | ||
165 | |||
166 | /* | ||
167 | * Certain architectures need to do special things when PTEs | ||
168 | * within a page table are directly modified. Thus, the following | ||
169 | * hook is made available. | ||
170 | */ | ||
171 | #define set_pte(pteptr, pteval) \ | ||
172 | do { \ | ||
173 | *(pteptr) = (pteval); \ | ||
174 | asm volatile("dcf %M0" :: "U"(*pteptr)); \ | ||
175 | } while(0) | ||
176 | #define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) | ||
177 | |||
178 | #define set_pte_atomic(pteptr, pteval) set_pte((pteptr), (pteval)) | ||
179 | |||
180 | /* | ||
181 | * pgd_offset() returns a (pgd_t *) | ||
182 | * pgd_index() is used get the offset into the pgd page's array of pgd_t's; | ||
183 | */ | ||
184 | #define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address)) | ||
185 | |||
186 | /* | ||
187 | * a shortcut which implies the use of the kernel's pgd, instead | ||
188 | * of a process's | ||
189 | */ | ||
190 | #define pgd_offset_k(address) pgd_offset(&init_mm, address) | ||
191 | |||
192 | /* | ||
193 | * The "pgd_xxx()" functions here are trivial for a folded two-level | ||
194 | * setup: the pud is never bad, and a pud always exists (as it's folded | ||
195 | * into the pgd entry) | ||
196 | */ | ||
197 | static inline int pgd_none(pgd_t pgd) { return 0; } | ||
198 | static inline int pgd_bad(pgd_t pgd) { return 0; } | ||
199 | static inline int pgd_present(pgd_t pgd) { return 1; } | ||
200 | static inline void pgd_clear(pgd_t *pgd) { } | ||
201 | |||
202 | #define pgd_populate(mm, pgd, pud) do { } while (0) | ||
203 | /* | ||
204 | * (puds are folded into pgds so this doesn't get actually called, | ||
205 | * but the define is needed for a generic inline function.) | ||
206 | */ | ||
207 | #define set_pgd(pgdptr, pgdval) \ | ||
208 | do { \ | ||
209 | memcpy((pgdptr), &(pgdval), sizeof(pgd_t)); \ | ||
210 | asm volatile("dcf %M0" :: "U"(*(pgdptr))); \ | ||
211 | } while(0) | ||
212 | |||
213 | static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address) | ||
214 | { | ||
215 | return (pud_t *) pgd; | ||
216 | } | ||
217 | |||
218 | #define pgd_page(pgd) (pud_page((pud_t){ pgd })) | ||
219 | #define pgd_page_kernel(pgd) (pud_page_kernel((pud_t){ pgd })) | ||
220 | |||
221 | /* | ||
222 | * allocating and freeing a pud is trivial: the 1-entry pud is | ||
223 | * inside the pgd, so has no extra memory associated with it. | ||
224 | */ | ||
225 | #define pud_alloc_one(mm, address) NULL | ||
226 | #define pud_free(x) do { } while (0) | ||
227 | #define __pud_free_tlb(tlb, x) do { } while (0) | ||
228 | |||
229 | /* | ||
230 | * The "pud_xxx()" functions here are trivial for a folded two-level | ||
231 | * setup: the pmd is never bad, and a pmd always exists (as it's folded | ||
232 | * into the pud entry) | ||
233 | */ | ||
234 | static inline int pud_none(pud_t pud) { return 0; } | ||
235 | static inline int pud_bad(pud_t pud) { return 0; } | ||
236 | static inline int pud_present(pud_t pud) { return 1; } | ||
237 | static inline void pud_clear(pud_t *pud) { } | ||
238 | |||
239 | #define pud_populate(mm, pmd, pte) do { } while (0) | ||
240 | |||
241 | /* | ||
242 | * (pmds are folded into puds so this doesn't get actually called, | ||
243 | * but the define is needed for a generic inline function.) | ||
244 | */ | ||
245 | #define set_pud(pudptr, pudval) set_pmd((pmd_t *)(pudptr), (pmd_t) { pudval }) | ||
246 | |||
247 | #define pud_page(pud) (pmd_page((pmd_t){ pud })) | ||
248 | #define pud_page_kernel(pud) (pmd_page_kernel((pmd_t){ pud })) | ||
249 | |||
250 | /* | ||
251 | * (pmds are folded into pgds so this doesn't get actually called, | ||
252 | * but the define is needed for a generic inline function.) | ||
253 | */ | ||
254 | extern void __set_pmd(pmd_t *pmdptr, unsigned long __pmd); | ||
255 | |||
256 | #define set_pmd(pmdptr, pmdval) \ | ||
257 | do { \ | ||
258 | __set_pmd((pmdptr), (pmdval).ste[0]); \ | ||
259 | } while(0) | ||
260 | |||
261 | #define __pmd_index(address) 0 | ||
262 | |||
263 | static inline pmd_t *pmd_offset(pud_t *dir, unsigned long address) | ||
264 | { | ||
265 | return (pmd_t *) dir + __pmd_index(address); | ||
266 | } | ||
267 | |||
268 | #define pte_same(a, b) ((a).pte == (b).pte) | ||
269 | #define pte_page(x) (mem_map + ((unsigned long)(((x).pte >> PAGE_SHIFT)))) | ||
270 | #define pte_none(x) (!(x).pte) | ||
271 | #define pte_pfn(x) ((unsigned long)(((x).pte >> PAGE_SHIFT))) | ||
272 | #define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) | ||
273 | #define pfn_pmd(pfn, prot) __pmd(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) | ||
274 | |||
275 | #define VMALLOC_VMADDR(x) ((unsigned long) (x)) | ||
276 | |||
277 | #endif /* !__ASSEMBLY__ */ | ||
278 | |||
279 | /* | ||
280 | * control flags in AMPR registers and TLB entries | ||
281 | */ | ||
282 | #define _PAGE_BIT_PRESENT xAMPRx_V_BIT | ||
283 | #define _PAGE_BIT_WP DAMPRx_WP_BIT | ||
284 | #define _PAGE_BIT_NOCACHE xAMPRx_C_BIT | ||
285 | #define _PAGE_BIT_SUPER xAMPRx_S_BIT | ||
286 | #define _PAGE_BIT_ACCESSED xAMPRx_RESERVED8_BIT | ||
287 | #define _PAGE_BIT_DIRTY xAMPRx_M_BIT | ||
288 | #define _PAGE_BIT_NOTGLOBAL xAMPRx_NG_BIT | ||
289 | |||
290 | #define _PAGE_PRESENT xAMPRx_V | ||
291 | #define _PAGE_WP DAMPRx_WP | ||
292 | #define _PAGE_NOCACHE xAMPRx_C | ||
293 | #define _PAGE_SUPER xAMPRx_S | ||
294 | #define _PAGE_ACCESSED xAMPRx_RESERVED8 /* accessed if set */ | ||
295 | #define _PAGE_DIRTY xAMPRx_M | ||
296 | #define _PAGE_NOTGLOBAL xAMPRx_NG | ||
297 | |||
298 | #define _PAGE_RESERVED_MASK (xAMPRx_RESERVED8 | xAMPRx_RESERVED13) | ||
299 | |||
300 | #define _PAGE_FILE 0x002 /* set:pagecache unset:swap */ | ||
301 | #define _PAGE_PROTNONE 0x000 /* If not present */ | ||
302 | |||
303 | #define _PAGE_CHG_MASK (PTE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY) | ||
304 | |||
305 | #define __PGPROT_BASE \ | ||
306 | (_PAGE_PRESENT | xAMPRx_SS_16Kb | xAMPRx_D | _PAGE_NOTGLOBAL | _PAGE_ACCESSED) | ||
307 | |||
308 | #define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED) | ||
309 | #define PAGE_SHARED __pgprot(__PGPROT_BASE) | ||
310 | #define PAGE_COPY __pgprot(__PGPROT_BASE | _PAGE_WP) | ||
311 | #define PAGE_READONLY __pgprot(__PGPROT_BASE | _PAGE_WP) | ||
312 | |||
313 | #define __PAGE_KERNEL (__PGPROT_BASE | _PAGE_SUPER | _PAGE_DIRTY) | ||
314 | #define __PAGE_KERNEL_NOCACHE (__PGPROT_BASE | _PAGE_SUPER | _PAGE_DIRTY | _PAGE_NOCACHE) | ||
315 | #define __PAGE_KERNEL_RO (__PGPROT_BASE | _PAGE_SUPER | _PAGE_DIRTY | _PAGE_WP) | ||
316 | |||
317 | #define MAKE_GLOBAL(x) __pgprot((x) & ~_PAGE_NOTGLOBAL) | ||
318 | |||
319 | #define PAGE_KERNEL MAKE_GLOBAL(__PAGE_KERNEL) | ||
320 | #define PAGE_KERNEL_RO MAKE_GLOBAL(__PAGE_KERNEL_RO) | ||
321 | #define PAGE_KERNEL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_NOCACHE) | ||
322 | |||
323 | #define _PAGE_TABLE (_PAGE_PRESENT | xAMPRx_SS_16Kb) | ||
324 | |||
325 | #ifndef __ASSEMBLY__ | ||
326 | |||
327 | /* | ||
328 | * The FR451 can do execute protection by virtue of having separate TLB miss handlers for | ||
329 | * instruction access and for data access. However, we don't have enough reserved bits to say | ||
330 | * "execute only", so we don't bother. If you can read it, you can execute it and vice versa. | ||
331 | */ | ||
332 | #define __P000 PAGE_NONE | ||
333 | #define __P001 PAGE_READONLY | ||
334 | #define __P010 PAGE_COPY | ||
335 | #define __P011 PAGE_COPY | ||
336 | #define __P100 PAGE_READONLY | ||
337 | #define __P101 PAGE_READONLY | ||
338 | #define __P110 PAGE_COPY | ||
339 | #define __P111 PAGE_COPY | ||
340 | |||
341 | #define __S000 PAGE_NONE | ||
342 | #define __S001 PAGE_READONLY | ||
343 | #define __S010 PAGE_SHARED | ||
344 | #define __S011 PAGE_SHARED | ||
345 | #define __S100 PAGE_READONLY | ||
346 | #define __S101 PAGE_READONLY | ||
347 | #define __S110 PAGE_SHARED | ||
348 | #define __S111 PAGE_SHARED | ||
349 | |||
350 | /* | ||
351 | * Define this to warn about kernel memory accesses that are | ||
352 | * done without a 'verify_area(VERIFY_WRITE,..)' | ||
353 | */ | ||
354 | #undef TEST_VERIFY_AREA | ||
355 | |||
356 | #define pte_present(x) (pte_val(x) & _PAGE_PRESENT) | ||
357 | #define pte_clear(mm,addr,xp) do { set_pte_at(mm, addr, xp, __pte(0)); } while (0) | ||
358 | |||
359 | #define pmd_none(x) (!pmd_val(x)) | ||
360 | #define pmd_present(x) (pmd_val(x) & _PAGE_PRESENT) | ||
361 | #define pmd_bad(x) (pmd_val(x) & xAMPRx_SS) | ||
362 | #define pmd_clear(xp) do { __set_pmd(xp, 0); } while(0) | ||
363 | |||
364 | #define pmd_page_kernel(pmd) \ | ||
365 | ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK)) | ||
366 | |||
367 | #ifndef CONFIG_DISCONTIGMEM | ||
368 | #define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT)) | ||
369 | #endif | ||
370 | |||
371 | #define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT)) | ||
372 | |||
373 | /* | ||
374 | * The following only work if pte_present() is true. | ||
375 | * Undefined behaviour if not.. | ||
376 | */ | ||
377 | static inline int pte_read(pte_t pte) { return !((pte).pte & _PAGE_SUPER); } | ||
378 | static inline int pte_exec(pte_t pte) { return !((pte).pte & _PAGE_SUPER); } | ||
379 | static inline int pte_dirty(pte_t pte) { return (pte).pte & _PAGE_DIRTY; } | ||
380 | static inline int pte_young(pte_t pte) { return (pte).pte & _PAGE_ACCESSED; } | ||
381 | static inline int pte_write(pte_t pte) { return !((pte).pte & _PAGE_WP); } | ||
382 | |||
383 | static inline pte_t pte_rdprotect(pte_t pte) { (pte).pte |= _PAGE_SUPER; return pte; } | ||
384 | static inline pte_t pte_exprotect(pte_t pte) { (pte).pte |= _PAGE_SUPER; return pte; } | ||
385 | static inline pte_t pte_mkclean(pte_t pte) { (pte).pte &= ~_PAGE_DIRTY; return pte; } | ||
386 | static inline pte_t pte_mkold(pte_t pte) { (pte).pte &= ~_PAGE_ACCESSED; return pte; } | ||
387 | static inline pte_t pte_wrprotect(pte_t pte) { (pte).pte |= _PAGE_WP; return pte; } | ||
388 | static inline pte_t pte_mkread(pte_t pte) { (pte).pte &= ~_PAGE_SUPER; return pte; } | ||
389 | static inline pte_t pte_mkexec(pte_t pte) { (pte).pte &= ~_PAGE_SUPER; return pte; } | ||
390 | static inline pte_t pte_mkdirty(pte_t pte) { (pte).pte |= _PAGE_DIRTY; return pte; } | ||
391 | static inline pte_t pte_mkyoung(pte_t pte) { (pte).pte |= _PAGE_ACCESSED; return pte; } | ||
392 | static inline pte_t pte_mkwrite(pte_t pte) { (pte).pte &= ~_PAGE_WP; return pte; } | ||
393 | |||
394 | static inline int ptep_test_and_clear_dirty(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep) | ||
395 | { | ||
396 | int i = test_and_clear_bit(_PAGE_BIT_DIRTY, ptep); | ||
397 | asm volatile("dcf %M0" :: "U"(*ptep)); | ||
398 | return i; | ||
399 | } | ||
400 | |||
401 | static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep) | ||
402 | { | ||
403 | int i = test_and_clear_bit(_PAGE_BIT_ACCESSED, ptep); | ||
404 | asm volatile("dcf %M0" :: "U"(*ptep)); | ||
405 | return i; | ||
406 | } | ||
407 | |||
408 | static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) | ||
409 | { | ||
410 | unsigned long x = xchg(&ptep->pte, 0); | ||
411 | asm volatile("dcf %M0" :: "U"(*ptep)); | ||
412 | return __pte(x); | ||
413 | } | ||
414 | |||
415 | static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep) | ||
416 | { | ||
417 | set_bit(_PAGE_BIT_WP, ptep); | ||
418 | asm volatile("dcf %M0" :: "U"(*ptep)); | ||
419 | } | ||
420 | |||
421 | /* | ||
422 | * Conversion functions: convert a page and protection to a page entry, | ||
423 | * and a page entry and page directory to the page they refer to. | ||
424 | */ | ||
425 | |||
426 | #define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot)) | ||
427 | #define mk_pte_huge(entry) ((entry).pte_low |= _PAGE_PRESENT | _PAGE_PSE) | ||
428 | |||
429 | /* This takes a physical page address that is used by the remapping functions */ | ||
430 | #define mk_pte_phys(physpage, pgprot) pfn_pte((physpage) >> PAGE_SHIFT, pgprot) | ||
431 | |||
432 | static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | ||
433 | { | ||
434 | pte.pte &= _PAGE_CHG_MASK; | ||
435 | pte.pte |= pgprot_val(newprot); | ||
436 | return pte; | ||
437 | } | ||
438 | |||
439 | #define page_pte(page) page_pte_prot((page), __pgprot(0)) | ||
440 | |||
441 | /* to find an entry in a page-table-directory. */ | ||
442 | #define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1)) | ||
443 | #define pgd_index_k(addr) pgd_index(addr) | ||
444 | |||
445 | /* Find an entry in the bottom-level page table.. */ | ||
446 | #define __pte_index(address) (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) | ||
447 | |||
448 | /* | ||
449 | * the pte page can be thought of an array like this: pte_t[PTRS_PER_PTE] | ||
450 | * | ||
451 | * this macro returns the index of the entry in the pte page which would | ||
452 | * control the given virtual address | ||
453 | */ | ||
454 | #define pte_index(address) \ | ||
455 | (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) | ||
456 | #define pte_offset_kernel(dir, address) \ | ||
457 | ((pte_t *) pmd_page_kernel(*(dir)) + pte_index(address)) | ||
458 | |||
459 | #if defined(CONFIG_HIGHPTE) | ||
460 | #define pte_offset_map(dir, address) \ | ||
461 | ((pte_t *)kmap_atomic(pmd_page(*(dir)),KM_PTE0) + pte_index(address)) | ||
462 | #define pte_offset_map_nested(dir, address) \ | ||
463 | ((pte_t *)kmap_atomic(pmd_page(*(dir)),KM_PTE1) + pte_index(address)) | ||
464 | #define pte_unmap(pte) kunmap_atomic(pte, KM_PTE0) | ||
465 | #define pte_unmap_nested(pte) kunmap_atomic((pte), KM_PTE1) | ||
466 | #else | ||
467 | #define pte_offset_map(dir, address) \ | ||
468 | ((pte_t *)page_address(pmd_page(*(dir))) + pte_index(address)) | ||
469 | #define pte_offset_map_nested(dir, address) pte_offset_map((dir), (address)) | ||
470 | #define pte_unmap(pte) do { } while (0) | ||
471 | #define pte_unmap_nested(pte) do { } while (0) | ||
472 | #endif | ||
473 | |||
474 | /* | ||
475 | * Handle swap and file entries | ||
476 | * - the PTE is encoded in the following format: | ||
477 | * bit 0: Must be 0 (!_PAGE_PRESENT) | ||
478 | * bit 1: Type: 0 for swap, 1 for file (_PAGE_FILE) | ||
479 | * bits 2-7: Swap type | ||
480 | * bits 8-31: Swap offset | ||
481 | * bits 2-31: File pgoff | ||
482 | */ | ||
483 | #define __swp_type(x) (((x).val >> 2) & 0x1f) | ||
484 | #define __swp_offset(x) ((x).val >> 8) | ||
485 | #define __swp_entry(type, offset) ((swp_entry_t) { ((type) << 2) | ((offset) << 8) }) | ||
486 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { (pte).pte }) | ||
487 | #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) | ||
488 | |||
489 | static inline int pte_file(pte_t pte) | ||
490 | { | ||
491 | return pte.pte & _PAGE_FILE; | ||
492 | } | ||
493 | |||
494 | #define PTE_FILE_MAX_BITS 29 | ||
495 | |||
496 | #define pte_to_pgoff(PTE) ((PTE).pte >> 2) | ||
497 | #define pgoff_to_pte(off) __pte((off) << 2 | _PAGE_FILE) | ||
498 | |||
499 | /* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ | ||
500 | #define PageSkip(page) (0) | ||
501 | #define kern_addr_valid(addr) (1) | ||
502 | |||
503 | #define io_remap_page_range(vma, vaddr, paddr, size, prot) \ | ||
504 | remap_pfn_range(vma, vaddr, (paddr) >> PAGE_SHIFT, size, prot) | ||
505 | |||
506 | #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ | ||
507 | remap_pfn_range(vma, vaddr, pfn, size, prot) | ||
508 | |||
509 | #define MK_IOSPACE_PFN(space, pfn) (pfn) | ||
510 | #define GET_IOSPACE(pfn) 0 | ||
511 | #define GET_PFN(pfn) (pfn) | ||
512 | |||
513 | #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG | ||
514 | #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY | ||
515 | #define __HAVE_ARCH_PTEP_GET_AND_CLEAR | ||
516 | #define __HAVE_ARCH_PTEP_SET_WRPROTECT | ||
517 | #define __HAVE_ARCH_PTE_SAME | ||
518 | #include <asm-generic/pgtable.h> | ||
519 | |||
520 | /* | ||
521 | * preload information about a newly instantiated PTE into the SCR0/SCR1 PGE cache | ||
522 | */ | ||
523 | static inline void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte) | ||
524 | { | ||
525 | unsigned long ampr; | ||
526 | pgd_t *pge = pgd_offset(current->mm, address); | ||
527 | pud_t *pue = pud_offset(pge, address); | ||
528 | pmd_t *pme = pmd_offset(pue, address); | ||
529 | |||
530 | ampr = pme->ste[0] & 0xffffff00; | ||
531 | ampr |= xAMPRx_L | xAMPRx_SS_16Kb | xAMPRx_S | xAMPRx_C | xAMPRx_V; | ||
532 | |||
533 | asm volatile("movgs %0,scr0\n" | ||
534 | "movgs %0,scr1\n" | ||
535 | "movgs %1,dampr4\n" | ||
536 | "movgs %1,dampr5\n" | ||
537 | : | ||
538 | : "r"(address), "r"(ampr) | ||
539 | ); | ||
540 | } | ||
541 | |||
542 | #ifdef CONFIG_PROC_FS | ||
543 | extern char *proc_pid_status_frv_cxnr(struct mm_struct *mm, char *buffer); | ||
544 | #endif | ||
545 | |||
546 | extern void __init pgtable_cache_init(void); | ||
547 | |||
548 | #endif /* !__ASSEMBLY__ */ | ||
549 | #endif /* !CONFIG_MMU */ | ||
550 | |||
551 | #ifndef __ASSEMBLY__ | ||
552 | extern void __init paging_init(void); | ||
553 | #endif /* !__ASSEMBLY__ */ | ||
554 | |||
555 | #endif /* _ASM_PGTABLE_H */ | ||
diff --git a/include/asm-frv/poll.h b/include/asm-frv/poll.h new file mode 100644 index 000000000000..8cbcd60e334f --- /dev/null +++ b/include/asm-frv/poll.h | |||
@@ -0,0 +1,23 @@ | |||
1 | #ifndef _ASM_POLL_H | ||
2 | #define _ASM_POLL_H | ||
3 | |||
4 | #define POLLIN 1 | ||
5 | #define POLLPRI 2 | ||
6 | #define POLLOUT 4 | ||
7 | #define POLLERR 8 | ||
8 | #define POLLHUP 16 | ||
9 | #define POLLNVAL 32 | ||
10 | #define POLLRDNORM 64 | ||
11 | #define POLLWRNORM POLLOUT | ||
12 | #define POLLRDBAND 128 | ||
13 | #define POLLWRBAND 256 | ||
14 | #define POLLMSG 0x0400 | ||
15 | |||
16 | struct pollfd { | ||
17 | int fd; | ||
18 | short events; | ||
19 | short revents; | ||
20 | }; | ||
21 | |||
22 | #endif | ||
23 | |||
diff --git a/include/asm-frv/posix_types.h b/include/asm-frv/posix_types.h new file mode 100644 index 000000000000..73c2ba8d76b4 --- /dev/null +++ b/include/asm-frv/posix_types.h | |||
@@ -0,0 +1,66 @@ | |||
1 | #ifndef _ASM_POSIX_TYPES_H | ||
2 | #define _ASM_POSIX_TYPES_H | ||
3 | |||
4 | /* | ||
5 | * This file is generally used by user-level software, so you need to | ||
6 | * be a little careful about namespace pollution etc. Also, we cannot | ||
7 | * assume GCC is being used. | ||
8 | */ | ||
9 | |||
10 | typedef unsigned long __kernel_ino_t; | ||
11 | typedef unsigned short __kernel_mode_t; | ||
12 | typedef unsigned short __kernel_nlink_t; | ||
13 | typedef long __kernel_off_t; | ||
14 | typedef int __kernel_pid_t; | ||
15 | typedef unsigned short __kernel_ipc_pid_t; | ||
16 | typedef unsigned short __kernel_uid_t; | ||
17 | typedef unsigned short __kernel_gid_t; | ||
18 | typedef unsigned int __kernel_size_t; | ||
19 | typedef int __kernel_ssize_t; | ||
20 | typedef int __kernel_ptrdiff_t; | ||
21 | typedef long __kernel_time_t; | ||
22 | typedef long __kernel_suseconds_t; | ||
23 | typedef long __kernel_clock_t; | ||
24 | typedef int __kernel_timer_t; | ||
25 | typedef int __kernel_clockid_t; | ||
26 | typedef int __kernel_daddr_t; | ||
27 | typedef char * __kernel_caddr_t; | ||
28 | typedef unsigned short __kernel_uid16_t; | ||
29 | typedef unsigned short __kernel_gid16_t; | ||
30 | typedef unsigned int __kernel_uid32_t; | ||
31 | typedef unsigned int __kernel_gid32_t; | ||
32 | |||
33 | typedef unsigned short __kernel_old_uid_t; | ||
34 | typedef unsigned short __kernel_old_gid_t; | ||
35 | typedef unsigned short __kernel_old_dev_t; | ||
36 | |||
37 | #ifdef __GNUC__ | ||
38 | typedef long long __kernel_loff_t; | ||
39 | #endif | ||
40 | |||
41 | typedef struct { | ||
42 | #if defined(__KERNEL__) || defined(__USE_ALL) | ||
43 | int val[2]; | ||
44 | #else /* !defined(__KERNEL__) && !defined(__USE_ALL) */ | ||
45 | int __val[2]; | ||
46 | #endif /* !defined(__KERNEL__) && !defined(__USE_ALL) */ | ||
47 | } __kernel_fsid_t; | ||
48 | |||
49 | #if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) | ||
50 | |||
51 | #undef __FD_SET | ||
52 | #define __FD_SET(d, set) ((set)->fds_bits[__FDELT(d)] |= __FDMASK(d)) | ||
53 | |||
54 | #undef __FD_CLR | ||
55 | #define __FD_CLR(d, set) ((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d)) | ||
56 | |||
57 | #undef __FD_ISSET | ||
58 | #define __FD_ISSET(d, set) (!!((set)->fds_bits[__FDELT(d)] & __FDMASK(d))) | ||
59 | |||
60 | #undef __FD_ZERO | ||
61 | #define __FD_ZERO(fdsetp) (memset (fdsetp, 0, sizeof(*(fd_set *)fdsetp))) | ||
62 | |||
63 | #endif /* defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) */ | ||
64 | |||
65 | #endif | ||
66 | |||
diff --git a/include/asm-frv/processor.h b/include/asm-frv/processor.h new file mode 100644 index 000000000000..5228c18b7f78 --- /dev/null +++ b/include/asm-frv/processor.h | |||
@@ -0,0 +1,153 @@ | |||
1 | /* processor.h: FRV processor definitions | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_PROCESSOR_H | ||
13 | #define _ASM_PROCESSOR_H | ||
14 | |||
15 | #include <linux/config.h> | ||
16 | #include <asm/mem-layout.h> | ||
17 | |||
18 | #ifndef __ASSEMBLY__ | ||
19 | /* | ||
20 | * Default implementation of macro that returns current | ||
21 | * instruction pointer ("program counter"). | ||
22 | */ | ||
23 | #define current_text_addr() ({ __label__ _l; _l: &&_l;}) | ||
24 | |||
25 | #include <linux/linkage.h> | ||
26 | #include <asm/sections.h> | ||
27 | #include <asm/segment.h> | ||
28 | #include <asm/fpu.h> | ||
29 | #include <asm/registers.h> | ||
30 | #include <asm/ptrace.h> | ||
31 | #include <asm/current.h> | ||
32 | #include <asm/cache.h> | ||
33 | |||
34 | /* Forward declaration, a strange C thing */ | ||
35 | struct task_struct; | ||
36 | |||
37 | /* | ||
38 | * CPU type and hardware bug flags. Kept separately for each CPU. | ||
39 | */ | ||
40 | struct cpuinfo_frv { | ||
41 | #ifdef CONFIG_MMU | ||
42 | unsigned long *pgd_quick; | ||
43 | unsigned long *pte_quick; | ||
44 | unsigned long pgtable_cache_sz; | ||
45 | #endif | ||
46 | } __cacheline_aligned; | ||
47 | |||
48 | extern struct cpuinfo_frv __nongprelbss boot_cpu_data; | ||
49 | |||
50 | #define cpu_data (&boot_cpu_data) | ||
51 | #define current_cpu_data boot_cpu_data | ||
52 | |||
53 | /* | ||
54 | * Bus types | ||
55 | */ | ||
56 | #define EISA_bus 0 | ||
57 | #define MCA_bus 0 | ||
58 | |||
59 | struct thread_struct { | ||
60 | struct pt_regs *frame; /* [GR28] exception frame ptr for this thread */ | ||
61 | struct task_struct *curr; /* [GR29] current pointer for this thread */ | ||
62 | unsigned long sp; /* [GR1 ] kernel stack pointer */ | ||
63 | unsigned long fp; /* [GR2 ] kernel frame pointer */ | ||
64 | unsigned long lr; /* link register */ | ||
65 | unsigned long pc; /* program counter */ | ||
66 | unsigned long gr[12]; /* [GR16-GR27] */ | ||
67 | unsigned long sched_lr; /* LR from schedule() */ | ||
68 | |||
69 | union { | ||
70 | struct pt_regs *frame0; /* top (user) stack frame */ | ||
71 | struct user_context *user; /* userspace context */ | ||
72 | }; | ||
73 | } __attribute__((aligned(8))); | ||
74 | |||
75 | extern struct pt_regs *__kernel_frame0_ptr; | ||
76 | extern struct task_struct *__kernel_current_task; | ||
77 | |||
78 | #endif | ||
79 | |||
80 | #ifndef __ASSEMBLY__ | ||
81 | #define INIT_THREAD_FRAME0 \ | ||
82 | ((struct pt_regs *) \ | ||
83 | (sizeof(init_stack) + (unsigned long) init_stack - sizeof(struct user_context))) | ||
84 | |||
85 | #define INIT_THREAD { \ | ||
86 | NULL, \ | ||
87 | (struct task_struct *) init_stack, \ | ||
88 | 0, 0, 0, 0, \ | ||
89 | { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, \ | ||
90 | 0, \ | ||
91 | { INIT_THREAD_FRAME0 }, \ | ||
92 | } | ||
93 | |||
94 | /* | ||
95 | * do necessary setup to start up a newly executed thread. | ||
96 | * - need to discard the frame stacked by init() invoking the execve syscall | ||
97 | */ | ||
98 | #define start_thread(_regs, _pc, _usp) \ | ||
99 | do { \ | ||
100 | set_fs(USER_DS); /* reads from user space */ \ | ||
101 | __frame = __kernel_frame0_ptr; \ | ||
102 | __frame->pc = (_pc); \ | ||
103 | __frame->psr &= ~PSR_S; \ | ||
104 | __frame->sp = (_usp); \ | ||
105 | } while(0) | ||
106 | |||
107 | extern void prepare_to_copy(struct task_struct *tsk); | ||
108 | |||
109 | /* Free all resources held by a thread. */ | ||
110 | static inline void release_thread(struct task_struct *dead_task) | ||
111 | { | ||
112 | } | ||
113 | |||
114 | extern asmlinkage int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); | ||
115 | extern asmlinkage void save_user_regs(struct user_context *target); | ||
116 | extern asmlinkage void *restore_user_regs(const struct user_context *target, ...); | ||
117 | |||
118 | #define copy_segments(tsk, mm) do { } while (0) | ||
119 | #define release_segments(mm) do { } while (0) | ||
120 | #define forget_segments() do { } while (0) | ||
121 | |||
122 | /* | ||
123 | * Free current thread data structures etc.. | ||
124 | */ | ||
125 | static inline void exit_thread(void) | ||
126 | { | ||
127 | } | ||
128 | |||
129 | /* | ||
130 | * Return saved PC of a blocked thread. | ||
131 | */ | ||
132 | extern unsigned long thread_saved_pc(struct task_struct *tsk); | ||
133 | |||
134 | unsigned long get_wchan(struct task_struct *p); | ||
135 | |||
136 | #define KSTK_EIP(tsk) ((tsk)->thread.frame0->pc) | ||
137 | #define KSTK_ESP(tsk) ((tsk)->thread.frame0->sp) | ||
138 | |||
139 | /* Allocation and freeing of basic task resources. */ | ||
140 | extern struct task_struct *alloc_task_struct(void); | ||
141 | extern void free_task_struct(struct task_struct *p); | ||
142 | |||
143 | #define cpu_relax() do { } while (0) | ||
144 | |||
145 | /* data cache prefetch */ | ||
146 | #define ARCH_HAS_PREFETCH | ||
147 | static inline void prefetch(const void *x) | ||
148 | { | ||
149 | asm volatile("dcpl %0,gr0,#0" : : "r"(x)); | ||
150 | } | ||
151 | |||
152 | #endif /* __ASSEMBLY__ */ | ||
153 | #endif /* _ASM_PROCESSOR_H */ | ||
diff --git a/include/asm-frv/ptrace.h b/include/asm-frv/ptrace.h new file mode 100644 index 000000000000..b2cce0718e57 --- /dev/null +++ b/include/asm-frv/ptrace.h | |||
@@ -0,0 +1,86 @@ | |||
1 | /* ptrace.h: ptrace() relevant definitions | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | #ifndef _ASM_PTRACE_H | ||
12 | #define _ASM_PTRACE_H | ||
13 | |||
14 | #include <asm/registers.h> | ||
15 | |||
16 | #define in_syscall(regs) (((regs)->tbr & TBR_TT) == TBR_TT_TRAP0) | ||
17 | |||
18 | |||
19 | #define PT_PSR 0 | ||
20 | #define PT_ISR 1 | ||
21 | #define PT_CCR 2 | ||
22 | #define PT_CCCR 3 | ||
23 | #define PT_LR 4 | ||
24 | #define PT_LCR 5 | ||
25 | #define PT_PC 6 | ||
26 | |||
27 | #define PT__STATUS 7 /* exception status */ | ||
28 | #define PT_SYSCALLNO 8 /* syscall number or -1 */ | ||
29 | #define PT_ORIG_GR8 9 /* saved GR8 for signal handling */ | ||
30 | #define PT_GNER0 10 | ||
31 | #define PT_GNER1 11 | ||
32 | #define PT_IACC0H 12 | ||
33 | #define PT_IACC0L 13 | ||
34 | |||
35 | #define PT_GR(j) ( 14 + (j)) /* GRj for 0<=j<=63 */ | ||
36 | #define PT_FR(j) ( 78 + (j)) /* FRj for 0<=j<=63 */ | ||
37 | #define PT_FNER(j) (142 + (j)) /* FNERj for 0<=j<=1 */ | ||
38 | #define PT_MSR(j) (144 + (j)) /* MSRj for 0<=j<=2 */ | ||
39 | #define PT_ACC(j) (146 + (j)) /* ACCj for 0<=j<=7 */ | ||
40 | #define PT_ACCG(jklm) (154 + (jklm)) /* ACCGjklm for 0<=jklm<=1 (reads four regs per slot) */ | ||
41 | #define PT_FSR(j) (156 + (j)) /* FSRj for 0<=j<=0 */ | ||
42 | #define PT__GPEND 78 | ||
43 | #define PT__END 157 | ||
44 | |||
45 | #define PT_TBR PT_GR(0) | ||
46 | #define PT_SP PT_GR(1) | ||
47 | #define PT_FP PT_GR(2) | ||
48 | #define PT_PREV_FRAME PT_GR(28) /* previous exception frame pointer (old gr28 value) */ | ||
49 | #define PT_CURR_TASK PT_GR(29) /* current task */ | ||
50 | |||
51 | |||
52 | /* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */ | ||
53 | #define PTRACE_GETREGS 12 | ||
54 | #define PTRACE_SETREGS 13 | ||
55 | #define PTRACE_GETFPREGS 14 | ||
56 | #define PTRACE_SETFPREGS 15 | ||
57 | #define PTRACE_GETFDPIC 31 /* get the ELF fdpic loadmap address */ | ||
58 | |||
59 | #define PTRACE_GETFDPIC_EXEC 0 /* [addr] request the executable loadmap */ | ||
60 | #define PTRACE_GETFDPIC_INTERP 1 /* [addr] request the interpreter loadmap */ | ||
61 | |||
62 | #ifndef __ASSEMBLY__ | ||
63 | |||
64 | /* | ||
65 | * dedicate GR28; to keeping the a pointer to the current exception frame | ||
66 | */ | ||
67 | register struct pt_regs *__frame asm("gr28"); | ||
68 | register struct pt_regs *__debug_frame asm("gr31"); | ||
69 | |||
70 | #ifndef container_of | ||
71 | #define container_of(ptr, type, member) ({ \ | ||
72 | const typeof( ((type *)0)->member ) *__mptr = (ptr); \ | ||
73 | (type *)( (char *)__mptr - offsetof(type,member) );}) | ||
74 | #endif | ||
75 | |||
76 | #define __debug_regs container_of(__debug_frame, struct pt_debug_regs, normal_regs) | ||
77 | |||
78 | #define user_mode(regs) (!((regs)->psr & PSR_S)) | ||
79 | #define instruction_pointer(regs) ((regs)->pc) | ||
80 | |||
81 | extern unsigned long user_stack(const struct pt_regs *); | ||
82 | extern void show_regs(struct pt_regs *); | ||
83 | #define profile_pc(regs) ((regs)->pc) | ||
84 | |||
85 | #endif /* !__ASSEMBLY__ */ | ||
86 | #endif /* _ASM_PTRACE_H */ | ||
diff --git a/include/asm-frv/registers.h b/include/asm-frv/registers.h new file mode 100644 index 000000000000..fccfd95cff68 --- /dev/null +++ b/include/asm-frv/registers.h | |||
@@ -0,0 +1,255 @@ | |||
1 | /* registers.h: register frame declarations | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | /* | ||
13 | * notes: | ||
14 | * | ||
15 | * (1) that the members of all these structures are carefully aligned to permit | ||
16 | * usage of STD/STDF instructions | ||
17 | * | ||
18 | * (2) if you change these structures, you must change the code in | ||
19 | * arch/frvnommu/kernel/{break.S,entry.S,switch_to.S,gdb-stub.c} | ||
20 | * | ||
21 | * | ||
22 | * the kernel stack space block looks like this: | ||
23 | * | ||
24 | * +0x2000 +---------------------- | ||
25 | * | union { | ||
26 | * | struct user_context | ||
27 | * | struct pt_regs [user exception] | ||
28 | * | } | ||
29 | * +---------------------- <-- __kernel_frame0_ptr (maybe GR28) | ||
30 | * | | ||
31 | * | kernel stack | ||
32 | * | | ||
33 | * |...................... | ||
34 | * | struct pt_regs [kernel exception] | ||
35 | * |...................... <-- __kernel_frame0_ptr (maybe GR28) | ||
36 | * | | ||
37 | * | kernel stack | ||
38 | * | | ||
39 | * |...................... <-- stack pointer (GR1) | ||
40 | * | | ||
41 | * | unused stack space | ||
42 | * | | ||
43 | * +---------------------- | ||
44 | * | struct thread_info | ||
45 | * +0x0000 +---------------------- <-- __current_thread_info (GR15); | ||
46 | * | ||
47 | * note that GR28 points to the current exception frame | ||
48 | */ | ||
49 | |||
50 | #ifndef _ASM_REGISTERS_H | ||
51 | #define _ASM_REGISTERS_H | ||
52 | |||
53 | #ifndef __ASSEMBLY__ | ||
54 | #define __OFFSET(X) (X) | ||
55 | #define __OFFSETC(X,N) xxxxxxxxxxxxxxxxxxxxxxxx | ||
56 | #else | ||
57 | #define __OFFSET(X) ((X)*4) | ||
58 | #define __OFFSETC(X,N) ((X)*4+(N)) | ||
59 | #endif | ||
60 | |||
61 | /*****************************************************************************/ | ||
62 | /* | ||
63 | * Exception/Interrupt frame | ||
64 | * - held on kernel stack | ||
65 | * - 8-byte aligned on stack (old SP is saved in frame) | ||
66 | * - GR0 is fixed 0, so we don't save it | ||
67 | */ | ||
68 | #ifndef __ASSEMBLY__ | ||
69 | |||
70 | struct pt_regs { | ||
71 | unsigned long psr; /* Processor Status Register */ | ||
72 | unsigned long isr; /* Integer Status Register */ | ||
73 | unsigned long ccr; /* Condition Code Register */ | ||
74 | unsigned long cccr; /* Condition Code for Conditional Insns Register */ | ||
75 | unsigned long lr; /* Link Register */ | ||
76 | unsigned long lcr; /* Loop Count Register */ | ||
77 | unsigned long pc; /* Program Counter Register */ | ||
78 | unsigned long __status; /* exception status */ | ||
79 | unsigned long syscallno; /* syscall number or -1 */ | ||
80 | unsigned long orig_gr8; /* original syscall arg #1 */ | ||
81 | unsigned long gner0; | ||
82 | unsigned long gner1; | ||
83 | unsigned long long iacc0; | ||
84 | unsigned long tbr; /* GR0 is fixed zero, so we use this for TBR */ | ||
85 | unsigned long sp; /* GR1: USP/KSP */ | ||
86 | unsigned long fp; /* GR2: FP */ | ||
87 | unsigned long gr3; | ||
88 | unsigned long gr4; | ||
89 | unsigned long gr5; | ||
90 | unsigned long gr6; | ||
91 | unsigned long gr7; /* syscall number */ | ||
92 | unsigned long gr8; /* 1st syscall param; syscall return */ | ||
93 | unsigned long gr9; /* 2nd syscall param */ | ||
94 | unsigned long gr10; /* 3rd syscall param */ | ||
95 | unsigned long gr11; /* 4th syscall param */ | ||
96 | unsigned long gr12; /* 5th syscall param */ | ||
97 | unsigned long gr13; /* 6th syscall param */ | ||
98 | unsigned long gr14; | ||
99 | unsigned long gr15; | ||
100 | unsigned long gr16; /* GP pointer */ | ||
101 | unsigned long gr17; /* small data */ | ||
102 | unsigned long gr18; /* PIC/PID */ | ||
103 | unsigned long gr19; | ||
104 | unsigned long gr20; | ||
105 | unsigned long gr21; | ||
106 | unsigned long gr22; | ||
107 | unsigned long gr23; | ||
108 | unsigned long gr24; | ||
109 | unsigned long gr25; | ||
110 | unsigned long gr26; | ||
111 | unsigned long gr27; | ||
112 | struct pt_regs *next_frame; /* GR28 - next exception frame */ | ||
113 | unsigned long gr29; /* GR29 - OS reserved */ | ||
114 | unsigned long gr30; /* GR30 - OS reserved */ | ||
115 | unsigned long gr31; /* GR31 - OS reserved */ | ||
116 | } __attribute__((aligned(8))); | ||
117 | |||
118 | #endif | ||
119 | |||
120 | #define REG_PSR __OFFSET( 0) /* Processor Status Register */ | ||
121 | #define REG_ISR __OFFSET( 1) /* Integer Status Register */ | ||
122 | #define REG_CCR __OFFSET( 2) /* Condition Code Register */ | ||
123 | #define REG_CCCR __OFFSET( 3) /* Condition Code for Conditional Insns Register */ | ||
124 | #define REG_LR __OFFSET( 4) /* Link Register */ | ||
125 | #define REG_LCR __OFFSET( 5) /* Loop Count Register */ | ||
126 | #define REG_PC __OFFSET( 6) /* Program Counter */ | ||
127 | |||
128 | #define REG__STATUS __OFFSET( 7) /* exception status */ | ||
129 | #define REG__STATUS_STEP 0x00000001 /* - reenable single stepping on return */ | ||
130 | #define REG__STATUS_STEPPED 0x00000002 /* - single step caused exception */ | ||
131 | #define REG__STATUS_BROKE 0x00000004 /* - BREAK insn caused exception */ | ||
132 | #define REG__STATUS_SYSC_ENTRY 0x40000000 /* - T on syscall entry (ptrace.c only) */ | ||
133 | #define REG__STATUS_SYSC_EXIT 0x80000000 /* - T on syscall exit (ptrace.c only) */ | ||
134 | |||
135 | #define REG_SYSCALLNO __OFFSET( 8) /* syscall number or -1 */ | ||
136 | #define REG_ORIG_GR8 __OFFSET( 9) /* saved GR8 for signal handling */ | ||
137 | #define REG_GNER0 __OFFSET(10) | ||
138 | #define REG_GNER1 __OFFSET(11) | ||
139 | #define REG_IACC0 __OFFSET(12) | ||
140 | |||
141 | #define REG_TBR __OFFSET(14) /* Trap Vector Register */ | ||
142 | #define REG_GR(R) __OFFSET((14+(R))) | ||
143 | #define REG__END REG_GR(32) | ||
144 | |||
145 | #define REG_SP REG_GR(1) | ||
146 | #define REG_FP REG_GR(2) | ||
147 | #define REG_PREV_FRAME REG_GR(28) /* previous exception frame pointer (old gr28 value) */ | ||
148 | #define REG_CURR_TASK REG_GR(29) /* current task */ | ||
149 | |||
150 | /*****************************************************************************/ | ||
151 | /* | ||
152 | * extension tacked in front of the exception frame in debug mode | ||
153 | */ | ||
154 | #ifndef __ASSEMBLY__ | ||
155 | |||
156 | struct pt_debug_regs | ||
157 | { | ||
158 | unsigned long bpsr; | ||
159 | unsigned long dcr; | ||
160 | unsigned long brr; | ||
161 | unsigned long nmar; | ||
162 | struct pt_regs normal_regs; | ||
163 | } __attribute__((aligned(8))); | ||
164 | |||
165 | #endif | ||
166 | |||
167 | #define REG_NMAR __OFFSET(-1) | ||
168 | #define REG_BRR __OFFSET(-2) | ||
169 | #define REG_DCR __OFFSET(-3) | ||
170 | #define REG_BPSR __OFFSET(-4) | ||
171 | #define REG__DEBUG_XTRA __OFFSET(4) | ||
172 | |||
173 | /*****************************************************************************/ | ||
174 | /* | ||
175 | * userspace registers | ||
176 | */ | ||
177 | #ifndef __ASSEMBLY__ | ||
178 | |||
179 | struct user_int_regs | ||
180 | { | ||
181 | /* integer registers | ||
182 | * - up to gr[31] mirror pt_regs | ||
183 | * - total size must be multiple of 8 bytes | ||
184 | */ | ||
185 | unsigned long psr; /* Processor Status Register */ | ||
186 | unsigned long isr; /* Integer Status Register */ | ||
187 | unsigned long ccr; /* Condition Code Register */ | ||
188 | unsigned long cccr; /* Condition Code for Conditional Insns Register */ | ||
189 | unsigned long lr; /* Link Register */ | ||
190 | unsigned long lcr; /* Loop Count Register */ | ||
191 | unsigned long pc; /* Program Counter Register */ | ||
192 | unsigned long __status; /* exception status */ | ||
193 | unsigned long syscallno; /* syscall number or -1 */ | ||
194 | unsigned long orig_gr8; /* original syscall arg #1 */ | ||
195 | unsigned long gner[2]; | ||
196 | unsigned long long iacc[1]; | ||
197 | |||
198 | union { | ||
199 | unsigned long tbr; | ||
200 | unsigned long gr[64]; | ||
201 | }; | ||
202 | }; | ||
203 | |||
204 | struct user_fpmedia_regs | ||
205 | { | ||
206 | /* FP/Media registers */ | ||
207 | unsigned long fr[64]; | ||
208 | unsigned long fner[2]; | ||
209 | unsigned long msr[2]; | ||
210 | unsigned long acc[8]; | ||
211 | unsigned char accg[8]; | ||
212 | unsigned long fsr[1]; | ||
213 | }; | ||
214 | |||
215 | struct user_context | ||
216 | { | ||
217 | struct user_int_regs i; | ||
218 | struct user_fpmedia_regs f; | ||
219 | |||
220 | /* we provide a context extension so that we can save the regs for CPUs that | ||
221 | * implement many more of Fujitsu's lavish register spec | ||
222 | */ | ||
223 | void *extension; | ||
224 | } __attribute__((aligned(8))); | ||
225 | |||
226 | #endif | ||
227 | |||
228 | #define NR_USER_INT_REGS (14 + 64) | ||
229 | #define NR_USER_FPMEDIA_REGS (64 + 2 + 2 + 8 + 8/4 + 1) | ||
230 | #define NR_USER_CONTEXT (NR_USER_INT_REGS + NR_USER_FPMEDIA_REGS + 1) | ||
231 | |||
232 | #define USER_CONTEXT_SIZE (((NR_USER_CONTEXT + 1) & ~1) * 4) | ||
233 | |||
234 | #define __THREAD_FRAME __OFFSET(0) | ||
235 | #define __THREAD_CURR __OFFSET(1) | ||
236 | #define __THREAD_SP __OFFSET(2) | ||
237 | #define __THREAD_FP __OFFSET(3) | ||
238 | #define __THREAD_LR __OFFSET(4) | ||
239 | #define __THREAD_PC __OFFSET(5) | ||
240 | #define __THREAD_GR(R) __OFFSET(6 + (R) - 16) | ||
241 | #define __THREAD_FRAME0 __OFFSET(19) | ||
242 | #define __THREAD_USER __OFFSET(19) | ||
243 | |||
244 | #define __USER_INT __OFFSET(0) | ||
245 | #define __INT_GR(R) __OFFSET(14 + (R)) | ||
246 | |||
247 | #define __USER_FPMEDIA __OFFSET(NR_USER_INT_REGS) | ||
248 | #define __FPMEDIA_FR(R) __OFFSET(NR_USER_INT_REGS + (R)) | ||
249 | #define __FPMEDIA_FNER(R) __OFFSET(NR_USER_INT_REGS + 64 + (R)) | ||
250 | #define __FPMEDIA_MSR(R) __OFFSET(NR_USER_INT_REGS + 66 + (R)) | ||
251 | #define __FPMEDIA_ACC(R) __OFFSET(NR_USER_INT_REGS + 68 + (R)) | ||
252 | #define __FPMEDIA_ACCG(R) __OFFSETC(NR_USER_INT_REGS + 76, (R)) | ||
253 | #define __FPMEDIA_FSR(R) __OFFSET(NR_USER_INT_REGS + 78 + (R)) | ||
254 | |||
255 | #endif /* _ASM_REGISTERS_H */ | ||
diff --git a/include/asm-frv/resource.h b/include/asm-frv/resource.h new file mode 100644 index 000000000000..5fc60548fd02 --- /dev/null +++ b/include/asm-frv/resource.h | |||
@@ -0,0 +1,7 @@ | |||
1 | #ifndef _ASM_RESOURCE_H | ||
2 | #define _ASM_RESOURCE_H | ||
3 | |||
4 | #include <asm-generic/resource.h> | ||
5 | |||
6 | #endif /* _ASM_RESOURCE_H */ | ||
7 | |||
diff --git a/include/asm-frv/scatterlist.h b/include/asm-frv/scatterlist.h new file mode 100644 index 000000000000..fb38fd329a5f --- /dev/null +++ b/include/asm-frv/scatterlist.h | |||
@@ -0,0 +1,32 @@ | |||
1 | #ifndef _ASM_SCATTERLIST_H | ||
2 | #define _ASM_SCATTERLIST_H | ||
3 | |||
4 | /* | ||
5 | * Drivers must set either ->address or (preferred) ->page and ->offset | ||
6 | * to indicate where data must be transferred to/from. | ||
7 | * | ||
8 | * Using ->page is recommended since it handles highmem data as well as | ||
9 | * low mem. ->address is restricted to data which has a virtual mapping, and | ||
10 | * it will go away in the future. Updating to ->page can be automated very | ||
11 | * easily -- something like | ||
12 | * | ||
13 | * sg->address = some_ptr; | ||
14 | * | ||
15 | * can be rewritten as | ||
16 | * | ||
17 | * sg->page = virt_to_page(some_ptr); | ||
18 | * sg->offset = (unsigned long) some_ptr & ~PAGE_MASK; | ||
19 | * | ||
20 | * and that's it. There's no excuse for not highmem enabling YOUR driver. /jens | ||
21 | */ | ||
22 | struct scatterlist { | ||
23 | struct page *page; /* Location for highmem page, if any */ | ||
24 | unsigned int offset; /* for highmem, page offset */ | ||
25 | |||
26 | dma_addr_t dma_address; | ||
27 | unsigned int length; | ||
28 | }; | ||
29 | |||
30 | #define ISA_DMA_THRESHOLD (0xffffffffUL) | ||
31 | |||
32 | #endif /* !_ASM_SCATTERLIST_H */ | ||
diff --git a/include/asm-frv/sections.h b/include/asm-frv/sections.h new file mode 100644 index 000000000000..17d0fb171bba --- /dev/null +++ b/include/asm-frv/sections.h | |||
@@ -0,0 +1,46 @@ | |||
1 | /* sections.h: linkage layout variables | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_SECTIONS_H | ||
13 | #define _ASM_SECTIONS_H | ||
14 | |||
15 | #ifndef __ASSEMBLY__ | ||
16 | |||
17 | #include <linux/types.h> | ||
18 | #include <asm-generic/sections.h> | ||
19 | |||
20 | #ifdef __KERNEL__ | ||
21 | |||
22 | /* | ||
23 | * we don't want to put variables in the GP-REL section if they're not used very much - that would | ||
24 | * be waste since GP-REL addressing is limited to GP16+/-2048 | ||
25 | */ | ||
26 | #define __nongpreldata __attribute__((section(".data"))) | ||
27 | #define __nongprelbss __attribute__((section(".bss"))) | ||
28 | |||
29 | /* | ||
30 | * linker symbols | ||
31 | */ | ||
32 | extern const void __kernel_image_start, __kernel_image_end, __page_offset; | ||
33 | |||
34 | extern unsigned long __nongprelbss memory_start; | ||
35 | extern unsigned long __nongprelbss memory_end; | ||
36 | extern unsigned long __nongprelbss rom_length; | ||
37 | |||
38 | /* determine if we're running from ROM */ | ||
39 | static inline int is_in_rom(unsigned long addr) | ||
40 | { | ||
41 | return 0; /* default case: not in ROM */ | ||
42 | } | ||
43 | |||
44 | #endif | ||
45 | #endif | ||
46 | #endif /* _ASM_SECTIONS_H */ | ||
diff --git a/include/asm-frv/segment.h b/include/asm-frv/segment.h new file mode 100644 index 000000000000..61222f00dfc1 --- /dev/null +++ b/include/asm-frv/segment.h | |||
@@ -0,0 +1,46 @@ | |||
1 | /* segment.h: MMU segment settings | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_SEGMENT_H | ||
13 | #define _ASM_SEGMENT_H | ||
14 | |||
15 | #include <linux/config.h> | ||
16 | |||
17 | #ifndef __ASSEMBLY__ | ||
18 | |||
19 | typedef struct { | ||
20 | unsigned long seg; | ||
21 | } mm_segment_t; | ||
22 | |||
23 | #define MAKE_MM_SEG(s) ((mm_segment_t) { (s) }) | ||
24 | |||
25 | #define KERNEL_DS MAKE_MM_SEG(0xdfffffffUL) | ||
26 | |||
27 | #ifdef CONFIG_MMU | ||
28 | #define USER_DS MAKE_MM_SEG(TASK_SIZE - 1) | ||
29 | #else | ||
30 | #define USER_DS KERNEL_DS | ||
31 | #endif | ||
32 | |||
33 | #define get_ds() (KERNEL_DS) | ||
34 | #define get_fs() (__current_thread_info->addr_limit) | ||
35 | #define segment_eq(a,b) ((a).seg == (b).seg) | ||
36 | #define __kernel_ds_p() segment_eq(get_fs(), KERNEL_DS) | ||
37 | #define get_addr_limit() (get_fs().seg) | ||
38 | |||
39 | #define set_fs(_x) \ | ||
40 | do { \ | ||
41 | __current_thread_info->addr_limit = (_x); \ | ||
42 | } while(0) | ||
43 | |||
44 | |||
45 | #endif /* __ASSEMBLY__ */ | ||
46 | #endif /* _ASM_SEGMENT_H */ | ||
diff --git a/include/asm-frv/semaphore.h b/include/asm-frv/semaphore.h new file mode 100644 index 000000000000..393545630806 --- /dev/null +++ b/include/asm-frv/semaphore.h | |||
@@ -0,0 +1,161 @@ | |||
1 | /* semaphore.h: semaphores for the FR-V | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | #ifndef _ASM_SEMAPHORE_H | ||
12 | #define _ASM_SEMAPHORE_H | ||
13 | |||
14 | #define RW_LOCK_BIAS 0x01000000 | ||
15 | |||
16 | #ifndef __ASSEMBLY__ | ||
17 | |||
18 | #include <linux/linkage.h> | ||
19 | #include <linux/wait.h> | ||
20 | #include <linux/spinlock.h> | ||
21 | #include <linux/rwsem.h> | ||
22 | |||
23 | #define SEMAPHORE_DEBUG WAITQUEUE_DEBUG | ||
24 | |||
25 | /* | ||
26 | * the semaphore definition | ||
27 | * - if counter is >0 then there are tokens available on the semaphore for down to collect | ||
28 | * - if counter is <=0 then there are no spare tokens, and anyone that wants one must wait | ||
29 | * - if wait_list is not empty, then there are processes waiting for the semaphore | ||
30 | */ | ||
31 | struct semaphore { | ||
32 | unsigned counter; | ||
33 | spinlock_t wait_lock; | ||
34 | struct list_head wait_list; | ||
35 | #if SEMAPHORE_DEBUG | ||
36 | unsigned __magic; | ||
37 | #endif | ||
38 | }; | ||
39 | |||
40 | #if SEMAPHORE_DEBUG | ||
41 | # define __SEM_DEBUG_INIT(name) , (long)&(name).__magic | ||
42 | #else | ||
43 | # define __SEM_DEBUG_INIT(name) | ||
44 | #endif | ||
45 | |||
46 | |||
47 | #define __SEMAPHORE_INITIALIZER(name,count) \ | ||
48 | { count, SPIN_LOCK_UNLOCKED, LIST_HEAD_INIT((name).wait_list) __SEM_DEBUG_INIT(name) } | ||
49 | |||
50 | #define __MUTEX_INITIALIZER(name) \ | ||
51 | __SEMAPHORE_INITIALIZER(name,1) | ||
52 | |||
53 | #define __DECLARE_SEMAPHORE_GENERIC(name,count) \ | ||
54 | struct semaphore name = __SEMAPHORE_INITIALIZER(name,count) | ||
55 | |||
56 | #define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name,1) | ||
57 | #define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC(name,0) | ||
58 | |||
59 | static inline void sema_init (struct semaphore *sem, int val) | ||
60 | { | ||
61 | *sem = (struct semaphore) __SEMAPHORE_INITIALIZER(*sem, val); | ||
62 | } | ||
63 | |||
64 | static inline void init_MUTEX (struct semaphore *sem) | ||
65 | { | ||
66 | sema_init(sem, 1); | ||
67 | } | ||
68 | |||
69 | static inline void init_MUTEX_LOCKED (struct semaphore *sem) | ||
70 | { | ||
71 | sema_init(sem, 0); | ||
72 | } | ||
73 | |||
74 | extern void __down(struct semaphore *sem, unsigned long flags); | ||
75 | extern int __down_interruptible(struct semaphore *sem, unsigned long flags); | ||
76 | extern void __up(struct semaphore *sem); | ||
77 | |||
78 | static inline void down(struct semaphore *sem) | ||
79 | { | ||
80 | unsigned long flags; | ||
81 | |||
82 | #if SEMAPHORE_DEBUG | ||
83 | CHECK_MAGIC(sem->__magic); | ||
84 | #endif | ||
85 | |||
86 | spin_lock_irqsave(&sem->wait_lock, flags); | ||
87 | if (likely(sem->counter > 0)) { | ||
88 | sem->counter--; | ||
89 | spin_unlock_irqrestore(&sem->wait_lock, flags); | ||
90 | } | ||
91 | else { | ||
92 | __down(sem, flags); | ||
93 | } | ||
94 | } | ||
95 | |||
96 | static inline int down_interruptible(struct semaphore *sem) | ||
97 | { | ||
98 | unsigned long flags; | ||
99 | int ret = 0; | ||
100 | |||
101 | #if SEMAPHORE_DEBUG | ||
102 | CHECK_MAGIC(sem->__magic); | ||
103 | #endif | ||
104 | |||
105 | spin_lock_irqsave(&sem->wait_lock, flags); | ||
106 | if (likely(sem->counter > 0)) { | ||
107 | sem->counter--; | ||
108 | spin_unlock_irqrestore(&sem->wait_lock, flags); | ||
109 | } | ||
110 | else { | ||
111 | ret = __down_interruptible(sem, flags); | ||
112 | } | ||
113 | return ret; | ||
114 | } | ||
115 | |||
116 | /* | ||
117 | * non-blockingly attempt to down() a semaphore. | ||
118 | * - returns zero if we acquired it | ||
119 | */ | ||
120 | static inline int down_trylock(struct semaphore *sem) | ||
121 | { | ||
122 | unsigned long flags; | ||
123 | int success = 0; | ||
124 | |||
125 | #if SEMAPHORE_DEBUG | ||
126 | CHECK_MAGIC(sem->__magic); | ||
127 | #endif | ||
128 | |||
129 | spin_lock_irqsave(&sem->wait_lock, flags); | ||
130 | if (sem->counter > 0) { | ||
131 | sem->counter--; | ||
132 | success = 1; | ||
133 | } | ||
134 | spin_unlock_irqrestore(&sem->wait_lock, flags); | ||
135 | return !success; | ||
136 | } | ||
137 | |||
138 | static inline void up(struct semaphore *sem) | ||
139 | { | ||
140 | unsigned long flags; | ||
141 | |||
142 | #if SEMAPHORE_DEBUG | ||
143 | CHECK_MAGIC(sem->__magic); | ||
144 | #endif | ||
145 | |||
146 | spin_lock_irqsave(&sem->wait_lock, flags); | ||
147 | if (!list_empty(&sem->wait_list)) | ||
148 | __up(sem); | ||
149 | else | ||
150 | sem->counter++; | ||
151 | spin_unlock_irqrestore(&sem->wait_lock, flags); | ||
152 | } | ||
153 | |||
154 | static inline int sem_getcount(struct semaphore *sem) | ||
155 | { | ||
156 | return sem->counter; | ||
157 | } | ||
158 | |||
159 | #endif /* __ASSEMBLY__ */ | ||
160 | |||
161 | #endif | ||
diff --git a/include/asm-frv/sembuf.h b/include/asm-frv/sembuf.h new file mode 100644 index 000000000000..164b12786d6d --- /dev/null +++ b/include/asm-frv/sembuf.h | |||
@@ -0,0 +1,26 @@ | |||
1 | #ifndef _ASM_SEMBUF_H | ||
2 | #define _ASM_SEMBUF_H | ||
3 | |||
4 | /* | ||
5 | * The semid64_ds structure for FR-V architecture. | ||
6 | * Note extra padding because this structure is passed back and forth | ||
7 | * between kernel and user space. | ||
8 | * | ||
9 | * Pad space is left for: | ||
10 | * - 64-bit time_t to solve y2038 problem | ||
11 | * - 2 miscellaneous 32-bit values | ||
12 | */ | ||
13 | |||
14 | struct semid64_ds { | ||
15 | struct ipc64_perm sem_perm; /* permissions .. see ipc.h */ | ||
16 | __kernel_time_t sem_otime; /* last semop time */ | ||
17 | unsigned long __unused1; | ||
18 | __kernel_time_t sem_ctime; /* last change time */ | ||
19 | unsigned long __unused2; | ||
20 | unsigned long sem_nsems; /* no. of semaphores in array */ | ||
21 | unsigned long __unused3; | ||
22 | unsigned long __unused4; | ||
23 | }; | ||
24 | |||
25 | #endif /* _ASM_SEMBUF_H */ | ||
26 | |||
diff --git a/include/asm-frv/serial-regs.h b/include/asm-frv/serial-regs.h new file mode 100644 index 000000000000..e1286bda00eb --- /dev/null +++ b/include/asm-frv/serial-regs.h | |||
@@ -0,0 +1,44 @@ | |||
1 | /* serial-regs.h: serial port registers | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_SERIAL_REGS_H | ||
13 | #define _ASM_SERIAL_REGS_H | ||
14 | |||
15 | #include <linux/serial_reg.h> | ||
16 | #include <asm/irc-regs.h> | ||
17 | |||
18 | #define SERIAL_ICLK 33333333 /* the target serial input clock */ | ||
19 | #define UART0_BASE 0xfeff9c00 | ||
20 | #define UART1_BASE 0xfeff9c40 | ||
21 | |||
22 | #define __get_UART0(R) ({ __reg(UART0_BASE + (R) * 8) >> 24; }) | ||
23 | #define __get_UART1(R) ({ __reg(UART1_BASE + (R) * 8) >> 24; }) | ||
24 | #define __set_UART0(R,V) do { __reg(UART0_BASE + (R) * 8) = (V) << 24; } while(0) | ||
25 | #define __set_UART1(R,V) do { __reg(UART1_BASE + (R) * 8) = (V) << 24; } while(0) | ||
26 | |||
27 | #define __get_UART0_LSR() ({ __get_UART0(UART_LSR); }) | ||
28 | #define __get_UART1_LSR() ({ __get_UART1(UART_LSR); }) | ||
29 | |||
30 | #define __set_UART0_IER(V) __set_UART0(UART_IER,(V)) | ||
31 | #define __set_UART1_IER(V) __set_UART1(UART_IER,(V)) | ||
32 | |||
33 | /* serial prescaler select register */ | ||
34 | #define __get_UCPSR() ({ *(volatile unsigned long *)(0xfeff9c90); }) | ||
35 | #define __set_UCPSR(V) do { *(volatile unsigned long *)(0xfeff9c90) = (V); } while(0) | ||
36 | #define UCPSR_SELECT0 0x07000000 | ||
37 | #define UCPSR_SELECT1 0x38000000 | ||
38 | |||
39 | /* serial prescaler base value register */ | ||
40 | #define __get_UCPVR() ({ *(volatile unsigned long *)(0xfeff9c98); mb(); }) | ||
41 | #define __set_UCPVR(V) do { *(volatile unsigned long *)(0xfeff9c98) = (V) << 24; mb(); } while(0) | ||
42 | |||
43 | |||
44 | #endif /* _ASM_SERIAL_REGS_H */ | ||
diff --git a/include/asm-frv/serial.h b/include/asm-frv/serial.h new file mode 100644 index 000000000000..6917d556a1e1 --- /dev/null +++ b/include/asm-frv/serial.h | |||
@@ -0,0 +1,19 @@ | |||
1 | /* | ||
2 | * serial.h | ||
3 | * | ||
4 | * Copyright (C) 2003 Develer S.r.l. (http://www.develer.com/) | ||
5 | * Author: Bernardo Innocenti <bernie@codewiz.org> | ||
6 | * | ||
7 | * Based on linux/include/asm-i386/serial.h | ||
8 | */ | ||
9 | #include <linux/config.h> | ||
10 | #include <asm/serial-regs.h> | ||
11 | |||
12 | /* | ||
13 | * the base baud is derived from the clock speed and so is variable | ||
14 | */ | ||
15 | #define BASE_BAUD 0 | ||
16 | |||
17 | #define STD_COM_FLAGS ASYNC_BOOT_AUTOCONF | ||
18 | |||
19 | #define SERIAL_PORT_DFNS | ||
diff --git a/include/asm-frv/setup.h b/include/asm-frv/setup.h new file mode 100644 index 000000000000..0d293b9a5857 --- /dev/null +++ b/include/asm-frv/setup.h | |||
@@ -0,0 +1,25 @@ | |||
1 | /* setup.h: setup stuff | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_SETUP_H | ||
13 | #define _ASM_SETUP_H | ||
14 | |||
15 | #include <linux/init.h> | ||
16 | |||
17 | #ifndef __ASSEMBLY__ | ||
18 | |||
19 | #ifdef CONFIG_MMU | ||
20 | extern unsigned long __initdata num_mappedpages; | ||
21 | #endif | ||
22 | |||
23 | #endif /* !__ASSEMBLY__ */ | ||
24 | |||
25 | #endif /* _ASM_SETUP_H */ | ||
diff --git a/include/asm-frv/shmbuf.h b/include/asm-frv/shmbuf.h new file mode 100644 index 000000000000..4c6e711a4779 --- /dev/null +++ b/include/asm-frv/shmbuf.h | |||
@@ -0,0 +1,43 @@ | |||
1 | #ifndef _ASM_SHMBUF_H | ||
2 | #define _ASM_SHMBUF_H | ||
3 | |||
4 | /* | ||
5 | * The shmid64_ds structure for FR-V architecture. | ||
6 | * Note extra padding because this structure is passed back and forth | ||
7 | * between kernel and user space. | ||
8 | * | ||
9 | * Pad space is left for: | ||
10 | * - 64-bit time_t to solve y2038 problem | ||
11 | * - 2 miscellaneous 32-bit values | ||
12 | */ | ||
13 | |||
14 | struct shmid64_ds { | ||
15 | struct ipc64_perm shm_perm; /* operation perms */ | ||
16 | size_t shm_segsz; /* size of segment (bytes) */ | ||
17 | __kernel_time_t shm_atime; /* last attach time */ | ||
18 | unsigned long __unused1; | ||
19 | __kernel_time_t shm_dtime; /* last detach time */ | ||
20 | unsigned long __unused2; | ||
21 | __kernel_time_t shm_ctime; /* last change time */ | ||
22 | unsigned long __unused3; | ||
23 | __kernel_pid_t shm_cpid; /* pid of creator */ | ||
24 | __kernel_pid_t shm_lpid; /* pid of last operator */ | ||
25 | unsigned long shm_nattch; /* no. of current attaches */ | ||
26 | unsigned long __unused4; | ||
27 | unsigned long __unused5; | ||
28 | }; | ||
29 | |||
30 | struct shminfo64 { | ||
31 | unsigned long shmmax; | ||
32 | unsigned long shmmin; | ||
33 | unsigned long shmmni; | ||
34 | unsigned long shmseg; | ||
35 | unsigned long shmall; | ||
36 | unsigned long __unused1; | ||
37 | unsigned long __unused2; | ||
38 | unsigned long __unused3; | ||
39 | unsigned long __unused4; | ||
40 | }; | ||
41 | |||
42 | #endif /* _ASM_SHMBUF_H */ | ||
43 | |||
diff --git a/include/asm-frv/shmparam.h b/include/asm-frv/shmparam.h new file mode 100644 index 000000000000..ab711009cfaa --- /dev/null +++ b/include/asm-frv/shmparam.h | |||
@@ -0,0 +1,7 @@ | |||
1 | #ifndef _ASM_SHMPARAM_H | ||
2 | #define _ASM_SHMPARAM_H | ||
3 | |||
4 | #define SHMLBA PAGE_SIZE /* attach addr a multiple of this */ | ||
5 | |||
6 | #endif /* _ASM_SHMPARAM_H */ | ||
7 | |||
diff --git a/include/asm-frv/sigcontext.h b/include/asm-frv/sigcontext.h new file mode 100644 index 000000000000..3b263f3cc96f --- /dev/null +++ b/include/asm-frv/sigcontext.h | |||
@@ -0,0 +1,26 @@ | |||
1 | /* sigcontext.h: FRV signal context | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | #ifndef _ASM_SIGCONTEXT_H | ||
12 | #define _ASM_SIGCONTEXT_H | ||
13 | |||
14 | #include <asm/registers.h> | ||
15 | |||
16 | /* | ||
17 | * Signal context structure - contains all info to do with the state | ||
18 | * before the signal handler was invoked. Note: only add new entries | ||
19 | * to the end of the structure. | ||
20 | */ | ||
21 | struct sigcontext { | ||
22 | struct user_context sc_context; | ||
23 | unsigned long sc_oldmask; /* old sigmask */ | ||
24 | } __attribute__((aligned(8))); | ||
25 | |||
26 | #endif | ||
diff --git a/include/asm-frv/siginfo.h b/include/asm-frv/siginfo.h new file mode 100644 index 000000000000..d3fd1ca45653 --- /dev/null +++ b/include/asm-frv/siginfo.h | |||
@@ -0,0 +1,12 @@ | |||
1 | #ifndef _ASM_SIGINFO_H | ||
2 | #define _ASM_SIGINFO_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | #include <asm-generic/siginfo.h> | ||
6 | |||
7 | #define FPE_MDAOVF (__SI_FAULT|9) /* media overflow */ | ||
8 | #undef NSIGFPE | ||
9 | #define NSIGFPE 9 | ||
10 | |||
11 | #endif | ||
12 | |||
diff --git a/include/asm-frv/signal.h b/include/asm-frv/signal.h new file mode 100644 index 000000000000..f18952f86a80 --- /dev/null +++ b/include/asm-frv/signal.h | |||
@@ -0,0 +1,187 @@ | |||
1 | #ifndef _ASM_SIGNAL_H | ||
2 | #define _ASM_SIGNAL_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | |||
6 | /* Avoid too many header ordering problems. */ | ||
7 | struct siginfo; | ||
8 | |||
9 | #ifdef __KERNEL__ | ||
10 | /* Most things should be clean enough to redefine this at will, if care | ||
11 | is taken to make libc match. */ | ||
12 | |||
13 | #define _NSIG 64 | ||
14 | #define _NSIG_BPW 32 | ||
15 | #define _NSIG_WORDS (_NSIG / _NSIG_BPW) | ||
16 | |||
17 | typedef unsigned long old_sigset_t; /* at least 32 bits */ | ||
18 | |||
19 | typedef struct { | ||
20 | unsigned long sig[_NSIG_WORDS]; | ||
21 | } sigset_t; | ||
22 | |||
23 | #else | ||
24 | /* Here we must cater to libcs that poke about in kernel headers. */ | ||
25 | |||
26 | #define NSIG 32 | ||
27 | typedef unsigned long sigset_t; | ||
28 | |||
29 | #endif /* __KERNEL__ */ | ||
30 | |||
31 | #define SIGHUP 1 | ||
32 | #define SIGINT 2 | ||
33 | #define SIGQUIT 3 | ||
34 | #define SIGILL 4 | ||
35 | #define SIGTRAP 5 | ||
36 | #define SIGABRT 6 | ||
37 | #define SIGIOT 6 | ||
38 | #define SIGBUS 7 | ||
39 | #define SIGFPE 8 | ||
40 | #define SIGKILL 9 | ||
41 | #define SIGUSR1 10 | ||
42 | #define SIGSEGV 11 | ||
43 | #define SIGUSR2 12 | ||
44 | #define SIGPIPE 13 | ||
45 | #define SIGALRM 14 | ||
46 | #define SIGTERM 15 | ||
47 | #define SIGSTKFLT 16 | ||
48 | #define SIGCHLD 17 | ||
49 | #define SIGCONT 18 | ||
50 | #define SIGSTOP 19 | ||
51 | #define SIGTSTP 20 | ||
52 | #define SIGTTIN 21 | ||
53 | #define SIGTTOU 22 | ||
54 | #define SIGURG 23 | ||
55 | #define SIGXCPU 24 | ||
56 | #define SIGXFSZ 25 | ||
57 | #define SIGVTALRM 26 | ||
58 | #define SIGPROF 27 | ||
59 | #define SIGWINCH 28 | ||
60 | #define SIGIO 29 | ||
61 | #define SIGPOLL SIGIO | ||
62 | /* | ||
63 | #define SIGLOST 29 | ||
64 | */ | ||
65 | #define SIGPWR 30 | ||
66 | #define SIGSYS 31 | ||
67 | #define SIGUNUSED 31 | ||
68 | |||
69 | /* These should not be considered constants from userland. */ | ||
70 | #define SIGRTMIN 32 | ||
71 | #define SIGRTMAX (_NSIG-1) | ||
72 | |||
73 | /* | ||
74 | * SA_FLAGS values: | ||
75 | * | ||
76 | * SA_ONSTACK indicates that a registered stack_t will be used. | ||
77 | * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the | ||
78 | * SA_RESTART flag to get restarting signals (which were the default long ago) | ||
79 | * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. | ||
80 | * SA_RESETHAND clears the handler when the signal is delivered. | ||
81 | * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. | ||
82 | * SA_NODEFER prevents the current signal from being masked in the handler. | ||
83 | * | ||
84 | * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single | ||
85 | * Unix names RESETHAND and NODEFER respectively. | ||
86 | */ | ||
87 | #define SA_NOCLDSTOP 0x00000001 | ||
88 | #define SA_NOCLDWAIT 0x00000002 /* not supported yet */ | ||
89 | #define SA_SIGINFO 0x00000004 | ||
90 | #define SA_ONSTACK 0x08000000 | ||
91 | #define SA_RESTART 0x10000000 | ||
92 | #define SA_NODEFER 0x40000000 | ||
93 | #define SA_RESETHAND 0x80000000 | ||
94 | |||
95 | #define SA_NOMASK SA_NODEFER | ||
96 | #define SA_ONESHOT SA_RESETHAND | ||
97 | #define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ | ||
98 | |||
99 | #define SA_RESTORER 0x04000000 | ||
100 | |||
101 | /* | ||
102 | * sigaltstack controls | ||
103 | */ | ||
104 | #define SS_ONSTACK 1 | ||
105 | #define SS_DISABLE 2 | ||
106 | |||
107 | #define MINSIGSTKSZ 2048 | ||
108 | #define SIGSTKSZ 8192 | ||
109 | |||
110 | #ifdef __KERNEL__ | ||
111 | |||
112 | /* | ||
113 | * These values of sa_flags are used only by the kernel as part of the | ||
114 | * irq handling routines. | ||
115 | * | ||
116 | * SA_INTERRUPT is also used by the irq handling routines. | ||
117 | * SA_SHIRQ is for shared interrupt support on PCI and EISA. | ||
118 | */ | ||
119 | #define SA_PROBE SA_ONESHOT | ||
120 | #define SA_SAMPLE_RANDOM SA_RESTART | ||
121 | #define SA_SHIRQ 0x04000000 | ||
122 | #endif | ||
123 | |||
124 | #define SIG_BLOCK 0 /* for blocking signals */ | ||
125 | #define SIG_UNBLOCK 1 /* for unblocking signals */ | ||
126 | #define SIG_SETMASK 2 /* for setting the signal mask */ | ||
127 | |||
128 | /* Type of a signal handler. */ | ||
129 | typedef void (*__sighandler_t)(int); | ||
130 | |||
131 | #define SIG_DFL ((__sighandler_t)0) /* default signal handling */ | ||
132 | #define SIG_IGN ((__sighandler_t)1) /* ignore signal */ | ||
133 | #define SIG_ERR ((__sighandler_t)-1) /* error return from signal */ | ||
134 | |||
135 | #ifdef __KERNEL__ | ||
136 | struct old_sigaction { | ||
137 | __sighandler_t sa_handler; | ||
138 | old_sigset_t sa_mask; | ||
139 | unsigned long sa_flags; | ||
140 | void (*sa_restorer)(void); | ||
141 | }; | ||
142 | |||
143 | struct sigaction { | ||
144 | __sighandler_t sa_handler; | ||
145 | unsigned long sa_flags; | ||
146 | void (*sa_restorer)(void); | ||
147 | sigset_t sa_mask; /* mask last for extensibility */ | ||
148 | }; | ||
149 | |||
150 | struct k_sigaction { | ||
151 | struct sigaction sa; | ||
152 | }; | ||
153 | #else | ||
154 | /* Here we must cater to libcs that poke about in kernel headers. */ | ||
155 | |||
156 | struct sigaction { | ||
157 | union { | ||
158 | __sighandler_t _sa_handler; | ||
159 | void (*_sa_sigaction)(int, struct siginfo *, void *); | ||
160 | } _u; | ||
161 | sigset_t sa_mask; | ||
162 | unsigned long sa_flags; | ||
163 | void (*sa_restorer)(void); | ||
164 | }; | ||
165 | |||
166 | #define sa_handler _u._sa_handler | ||
167 | #define sa_sigaction _u._sa_sigaction | ||
168 | |||
169 | #endif /* __KERNEL__ */ | ||
170 | |||
171 | typedef struct sigaltstack { | ||
172 | void *ss_sp; | ||
173 | int ss_flags; | ||
174 | size_t ss_size; | ||
175 | } stack_t; | ||
176 | |||
177 | extern int do_signal(struct pt_regs *regs, sigset_t *oldset); | ||
178 | #define ptrace_signal_deliver(regs, cookie) do { } while (0) | ||
179 | |||
180 | #ifdef __KERNEL__ | ||
181 | |||
182 | #include <asm/sigcontext.h> | ||
183 | #undef __HAVE_ARCH_SIG_BITOPS | ||
184 | |||
185 | #endif /* __KERNEL__ */ | ||
186 | |||
187 | #endif /* _ASM_SIGNAL_H */ | ||
diff --git a/include/asm-frv/smp.h b/include/asm-frv/smp.h new file mode 100644 index 000000000000..5ca771631fd8 --- /dev/null +++ b/include/asm-frv/smp.h | |||
@@ -0,0 +1,10 @@ | |||
1 | #ifndef __ASM_SMP_H | ||
2 | #define __ASM_SMP_H | ||
3 | |||
4 | #include <linux/config.h> | ||
5 | |||
6 | #ifdef CONFIG_SMP | ||
7 | #error SMP not supported | ||
8 | #endif | ||
9 | |||
10 | #endif | ||
diff --git a/include/asm-frv/socket.h b/include/asm-frv/socket.h new file mode 100644 index 000000000000..c3be17c7de4b --- /dev/null +++ b/include/asm-frv/socket.h | |||
@@ -0,0 +1,51 @@ | |||
1 | #ifndef _ASM_SOCKET_H | ||
2 | #define _ASM_SOCKET_H | ||
3 | |||
4 | #include <asm/sockios.h> | ||
5 | |||
6 | /* For setsockopt(2) */ | ||
7 | #define SOL_SOCKET 1 | ||
8 | |||
9 | #define SO_DEBUG 1 | ||
10 | #define SO_REUSEADDR 2 | ||
11 | #define SO_TYPE 3 | ||
12 | #define SO_ERROR 4 | ||
13 | #define SO_DONTROUTE 5 | ||
14 | #define SO_BROADCAST 6 | ||
15 | #define SO_SNDBUF 7 | ||
16 | #define SO_RCVBUF 8 | ||
17 | #define SO_KEEPALIVE 9 | ||
18 | #define SO_OOBINLINE 10 | ||
19 | #define SO_NO_CHECK 11 | ||
20 | #define SO_PRIORITY 12 | ||
21 | #define SO_LINGER 13 | ||
22 | #define SO_BSDCOMPAT 14 | ||
23 | /* To add :#define SO_REUSEPORT 15 */ | ||
24 | #define SO_PASSCRED 16 | ||
25 | #define SO_PEERCRED 17 | ||
26 | #define SO_RCVLOWAT 18 | ||
27 | #define SO_SNDLOWAT 19 | ||
28 | #define SO_RCVTIMEO 20 | ||
29 | #define SO_SNDTIMEO 21 | ||
30 | |||
31 | /* Security levels - as per NRL IPv6 - don't actually do anything */ | ||
32 | #define SO_SECURITY_AUTHENTICATION 22 | ||
33 | #define SO_SECURITY_ENCRYPTION_TRANSPORT 23 | ||
34 | #define SO_SECURITY_ENCRYPTION_NETWORK 24 | ||
35 | |||
36 | #define SO_BINDTODEVICE 25 | ||
37 | |||
38 | /* Socket filtering */ | ||
39 | #define SO_ATTACH_FILTER 26 | ||
40 | #define SO_DETACH_FILTER 27 | ||
41 | |||
42 | #define SO_PEERNAME 28 | ||
43 | #define SO_TIMESTAMP 29 | ||
44 | #define SCM_TIMESTAMP SO_TIMESTAMP | ||
45 | |||
46 | #define SO_ACCEPTCONN 30 | ||
47 | |||
48 | #define SO_PEERSEC 31 | ||
49 | |||
50 | #endif /* _ASM_SOCKET_H */ | ||
51 | |||
diff --git a/include/asm-frv/sockios.h b/include/asm-frv/sockios.h new file mode 100644 index 000000000000..8a6e4b2074b7 --- /dev/null +++ b/include/asm-frv/sockios.h | |||
@@ -0,0 +1,13 @@ | |||
1 | #ifndef _ASM_SOCKIOS__ | ||
2 | #define _ASM_SOCKIOS__ | ||
3 | |||
4 | /* Socket-level I/O control calls. */ | ||
5 | #define FIOSETOWN 0x8901 | ||
6 | #define SIOCSPGRP 0x8902 | ||
7 | #define FIOGETOWN 0x8903 | ||
8 | #define SIOCGPGRP 0x8904 | ||
9 | #define SIOCATMARK 0x8905 | ||
10 | #define SIOCGSTAMP 0x8906 /* Get stamp */ | ||
11 | |||
12 | #endif /* _ASM_SOCKIOS__ */ | ||
13 | |||
diff --git a/include/asm-frv/spinlock.h b/include/asm-frv/spinlock.h new file mode 100644 index 000000000000..fe385f45d1fd --- /dev/null +++ b/include/asm-frv/spinlock.h | |||
@@ -0,0 +1,17 @@ | |||
1 | /* spinlock.h: spinlocks for FR-V | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_SPINLOCK_H | ||
13 | #define _ASM_SPINLOCK_H | ||
14 | |||
15 | #error no spinlocks for FR-V yet | ||
16 | |||
17 | #endif /* _ASM_SPINLOCK_H */ | ||
diff --git a/include/asm-frv/spr-regs.h b/include/asm-frv/spr-regs.h new file mode 100644 index 000000000000..ef472f058d9c --- /dev/null +++ b/include/asm-frv/spr-regs.h | |||
@@ -0,0 +1,401 @@ | |||
1 | /* spr-regs.h: special-purpose registers on the FRV | ||
2 | * | ||
3 | * Copyright (C) 2003, 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_SPR_REGS_H | ||
13 | #define _ASM_SPR_REGS_H | ||
14 | |||
15 | /* | ||
16 | * PSR - Processor Status Register | ||
17 | */ | ||
18 | #define PSR_ET 0x00000001 /* enable interrupts/exceptions flag */ | ||
19 | #define PSR_PS 0x00000002 /* previous supervisor mode flag */ | ||
20 | #define PSR_S 0x00000004 /* supervisor mode flag */ | ||
21 | #define PSR_PIL 0x00000078 /* processor external interrupt level */ | ||
22 | #define PSR_PIL_0 0x00000000 /* - no interrupt in progress */ | ||
23 | #define PSR_PIL_13 0x00000068 /* - debugging only */ | ||
24 | #define PSR_PIL_14 0x00000070 /* - debugging in progress */ | ||
25 | #define PSR_PIL_15 0x00000078 /* - NMI in progress */ | ||
26 | #define PSR_EM 0x00000080 /* enable media operation */ | ||
27 | #define PSR_EF 0x00000100 /* enable FPU operation */ | ||
28 | #define PSR_BE 0x00001000 /* endianness mode */ | ||
29 | #define PSR_BE_LE 0x00000000 /* - little endian mode */ | ||
30 | #define PSR_BE_BE 0x00001000 /* - big endian mode */ | ||
31 | #define PSR_CM 0x00002000 /* conditional mode */ | ||
32 | #define PSR_NEM 0x00004000 /* non-excepting mode */ | ||
33 | #define PSR_ICE 0x00010000 /* in-circuit emulation mode */ | ||
34 | #define PSR_VERSION_SHIFT 24 /* CPU silicon ID */ | ||
35 | #define PSR_IMPLE_SHIFT 28 /* CPU core ID */ | ||
36 | |||
37 | #define PSR_VERSION(psr) (((psr) >> PSR_VERSION_SHIFT) & 0xf) | ||
38 | #define PSR_IMPLE(psr) (((psr) >> PSR_IMPLE_SHIFT) & 0xf) | ||
39 | |||
40 | #define PSR_IMPLE_FR401 0x2 | ||
41 | #define PSR_VERSION_FR401_MB93401 0x0 | ||
42 | #define PSR_VERSION_FR401_MB93401A 0x1 | ||
43 | #define PSR_VERSION_FR401_MB93403 0x2 | ||
44 | |||
45 | #define PSR_IMPLE_FR405 0x4 | ||
46 | #define PSR_VERSION_FR405_MB93405 0x0 | ||
47 | |||
48 | #define PSR_IMPLE_FR451 0x5 | ||
49 | #define PSR_VERSION_FR451_MB93451 0x0 | ||
50 | |||
51 | #define PSR_IMPLE_FR501 0x1 | ||
52 | #define PSR_VERSION_FR501_MB93501 0x1 | ||
53 | #define PSR_VERSION_FR501_MB93501A 0x2 | ||
54 | |||
55 | #define PSR_IMPLE_FR551 0x3 | ||
56 | #define PSR_VERSION_FR551_MB93555 0x1 | ||
57 | |||
58 | #define __get_PSR() ({ unsigned long x; asm volatile("movsg psr,%0" : "=r"(x)); x; }) | ||
59 | #define __set_PSR(V) do { asm volatile("movgs %0,psr" : : "r"(V)); } while(0) | ||
60 | |||
61 | /* | ||
62 | * TBR - Trap Base Register | ||
63 | */ | ||
64 | #define TBR_TT 0x00000ff0 | ||
65 | #define TBR_TT_INSTR_MMU_MISS (0x01 << 4) | ||
66 | #define TBR_TT_INSTR_ACC_ERROR (0x02 << 4) | ||
67 | #define TBR_TT_INSTR_ACC_EXCEP (0x03 << 4) | ||
68 | #define TBR_TT_PRIV_INSTR (0x06 << 4) | ||
69 | #define TBR_TT_ILLEGAL_INSTR (0x07 << 4) | ||
70 | #define TBR_TT_FP_EXCEPTION (0x0d << 4) | ||
71 | #define TBR_TT_MP_EXCEPTION (0x0e << 4) | ||
72 | #define TBR_TT_DATA_ACC_ERROR (0x11 << 4) | ||
73 | #define TBR_TT_DATA_MMU_MISS (0x12 << 4) | ||
74 | #define TBR_TT_DATA_ACC_EXCEP (0x13 << 4) | ||
75 | #define TBR_TT_DATA_STR_ERROR (0x14 << 4) | ||
76 | #define TBR_TT_DIVISION_EXCEP (0x17 << 4) | ||
77 | #define TBR_TT_COMMIT_EXCEP (0x19 << 4) | ||
78 | #define TBR_TT_INSTR_TLB_MISS (0x1a << 4) | ||
79 | #define TBR_TT_DATA_TLB_MISS (0x1b << 4) | ||
80 | #define TBR_TT_DATA_DAT_EXCEP (0x1d << 4) | ||
81 | #define TBR_TT_DECREMENT_TIMER (0x1f << 4) | ||
82 | #define TBR_TT_COMPOUND_EXCEP (0x20 << 4) | ||
83 | #define TBR_TT_INTERRUPT_1 (0x21 << 4) | ||
84 | #define TBR_TT_INTERRUPT_2 (0x22 << 4) | ||
85 | #define TBR_TT_INTERRUPT_3 (0x23 << 4) | ||
86 | #define TBR_TT_INTERRUPT_4 (0x24 << 4) | ||
87 | #define TBR_TT_INTERRUPT_5 (0x25 << 4) | ||
88 | #define TBR_TT_INTERRUPT_6 (0x26 << 4) | ||
89 | #define TBR_TT_INTERRUPT_7 (0x27 << 4) | ||
90 | #define TBR_TT_INTERRUPT_8 (0x28 << 4) | ||
91 | #define TBR_TT_INTERRUPT_9 (0x29 << 4) | ||
92 | #define TBR_TT_INTERRUPT_10 (0x2a << 4) | ||
93 | #define TBR_TT_INTERRUPT_11 (0x2b << 4) | ||
94 | #define TBR_TT_INTERRUPT_12 (0x2c << 4) | ||
95 | #define TBR_TT_INTERRUPT_13 (0x2d << 4) | ||
96 | #define TBR_TT_INTERRUPT_14 (0x2e << 4) | ||
97 | #define TBR_TT_INTERRUPT_15 (0x2f << 4) | ||
98 | #define TBR_TT_TRAP0 (0x80 << 4) | ||
99 | #define TBR_TT_TRAP1 (0x81 << 4) | ||
100 | #define TBR_TT_TRAP2 (0x82 << 4) | ||
101 | #define TBR_TT_TRAP126 (0xfe << 4) | ||
102 | #define TBR_TT_BREAK (0xff << 4) | ||
103 | |||
104 | #define __get_TBR() ({ unsigned long x; asm volatile("movsg tbr,%0" : "=r"(x)); x; }) | ||
105 | |||
106 | /* | ||
107 | * HSR0 - Hardware Status Register 0 | ||
108 | */ | ||
109 | #define HSR0_PDM 0x00000007 /* power down mode */ | ||
110 | #define HSR0_PDM_NORMAL 0x00000000 /* - normal mode */ | ||
111 | #define HSR0_PDM_CORE_SLEEP 0x00000001 /* - CPU core sleep mode */ | ||
112 | #define HSR0_PDM_BUS_SLEEP 0x00000003 /* - bus sleep mode */ | ||
113 | #define HSR0_PDM_PLL_RUN 0x00000005 /* - PLL run */ | ||
114 | #define HSR0_PDM_PLL_STOP 0x00000007 /* - PLL stop */ | ||
115 | #define HSR0_GRLE 0x00000040 /* GR lower register set enable */ | ||
116 | #define HSR0_GRHE 0x00000080 /* GR higher register set enable */ | ||
117 | #define HSR0_FRLE 0x00000100 /* FR lower register set enable */ | ||
118 | #define HSR0_FRHE 0x00000200 /* FR higher register set enable */ | ||
119 | #define HSR0_GRN 0x00000400 /* GR quantity */ | ||
120 | #define HSR0_GRN_64 0x00000000 /* - 64 GR registers */ | ||
121 | #define HSR0_GRN_32 0x00000400 /* - 32 GR registers */ | ||
122 | #define HSR0_FRN 0x00000800 /* FR quantity */ | ||
123 | #define HSR0_FRN_64 0x00000000 /* - 64 FR registers */ | ||
124 | #define HSR0_FRN_32 0x00000800 /* - 32 FR registers */ | ||
125 | #define HSR0_SA 0x00001000 /* start address (RAMBOOT#) */ | ||
126 | #define HSR0_ETMI 0x00008000 /* enable TIMERI (64-bit up timer) */ | ||
127 | #define HSR0_ETMD 0x00004000 /* enable TIMERD (32-bit down timer) */ | ||
128 | #define HSR0_PEDAT 0x00010000 /* previous DAT mode */ | ||
129 | #define HSR0_XEDAT 0x00020000 /* exception DAT mode */ | ||
130 | #define HSR0_EDAT 0x00080000 /* enable DAT mode */ | ||
131 | #define HSR0_RME 0x00400000 /* enable RAM mode */ | ||
132 | #define HSR0_EMEM 0x00800000 /* enable MMU_Miss mask */ | ||
133 | #define HSR0_EXMMU 0x01000000 /* enable extended MMU mode */ | ||
134 | #define HSR0_EDMMU 0x02000000 /* enable data MMU */ | ||
135 | #define HSR0_EIMMU 0x04000000 /* enable instruction MMU */ | ||
136 | #define HSR0_CBM 0x08000000 /* copy back mode */ | ||
137 | #define HSR0_CBM_WRITE_THRU 0x00000000 /* - write through */ | ||
138 | #define HSR0_CBM_COPY_BACK 0x08000000 /* - copy back */ | ||
139 | #define HSR0_NWA 0x10000000 /* no write allocate */ | ||
140 | #define HSR0_DCE 0x40000000 /* data cache enable */ | ||
141 | #define HSR0_ICE 0x80000000 /* instruction cache enable */ | ||
142 | |||
143 | #define __get_HSR(R) ({ unsigned long x; asm volatile("movsg hsr"#R",%0" : "=r"(x)); x; }) | ||
144 | #define __set_HSR(R,V) do { asm volatile("movgs %0,hsr"#R : : "r"(V)); } while(0) | ||
145 | |||
146 | /* | ||
147 | * CCR - Condition Codes Register | ||
148 | */ | ||
149 | #define CCR_FCC0 0x0000000f /* FP/Media condition 0 (fcc0 reg) */ | ||
150 | #define CCR_FCC1 0x000000f0 /* FP/Media condition 1 (fcc1 reg) */ | ||
151 | #define CCR_FCC2 0x00000f00 /* FP/Media condition 2 (fcc2 reg) */ | ||
152 | #define CCR_FCC3 0x0000f000 /* FP/Media condition 3 (fcc3 reg) */ | ||
153 | #define CCR_ICC0 0x000f0000 /* Integer condition 0 (icc0 reg) */ | ||
154 | #define CCR_ICC0_C 0x00010000 /* - Carry flag */ | ||
155 | #define CCR_ICC0_V 0x00020000 /* - Overflow flag */ | ||
156 | #define CCR_ICC0_Z 0x00040000 /* - Zero flag */ | ||
157 | #define CCR_ICC0_N 0x00080000 /* - Negative flag */ | ||
158 | #define CCR_ICC1 0x00f00000 /* Integer condition 1 (icc1 reg) */ | ||
159 | #define CCR_ICC2 0x0f000000 /* Integer condition 2 (icc2 reg) */ | ||
160 | #define CCR_ICC3 0xf0000000 /* Integer condition 3 (icc3 reg) */ | ||
161 | |||
162 | /* | ||
163 | * CCCR - Condition Codes for Conditional Instructions Register | ||
164 | */ | ||
165 | #define CCCR_CC0 0x00000003 /* condition 0 (cc0 reg) */ | ||
166 | #define CCCR_CC0_FALSE 0x00000002 /* - condition is false */ | ||
167 | #define CCCR_CC0_TRUE 0x00000003 /* - condition is true */ | ||
168 | #define CCCR_CC1 0x0000000c /* condition 1 (cc1 reg) */ | ||
169 | #define CCCR_CC2 0x00000030 /* condition 2 (cc2 reg) */ | ||
170 | #define CCCR_CC3 0x000000c0 /* condition 3 (cc3 reg) */ | ||
171 | #define CCCR_CC4 0x00000300 /* condition 4 (cc4 reg) */ | ||
172 | #define CCCR_CC5 0x00000c00 /* condition 5 (cc5 reg) */ | ||
173 | #define CCCR_CC6 0x00003000 /* condition 6 (cc6 reg) */ | ||
174 | #define CCCR_CC7 0x0000c000 /* condition 7 (cc7 reg) */ | ||
175 | |||
176 | /* | ||
177 | * ISR - Integer Status Register | ||
178 | */ | ||
179 | #define ISR_EMAM 0x00000001 /* memory misaligned access handling */ | ||
180 | #define ISR_EMAM_EXCEPTION 0x00000000 /* - generate exception */ | ||
181 | #define ISR_EMAM_FUDGE 0x00000001 /* - mask out invalid address bits */ | ||
182 | #define ISR_AEXC 0x00000004 /* accrued [overflow] exception */ | ||
183 | #define ISR_DTT 0x00000018 /* division type trap */ | ||
184 | #define ISR_DTT_IGNORE 0x00000000 /* - ignore division error */ | ||
185 | #define ISR_DTT_DIVBYZERO 0x00000008 /* - generate exception */ | ||
186 | #define ISR_DTT_OVERFLOW 0x00000010 /* - record overflow */ | ||
187 | #define ISR_EDE 0x00000020 /* enable division exception */ | ||
188 | #define ISR_PLI 0x20000000 /* pre-load instruction information */ | ||
189 | #define ISR_QI 0x80000000 /* quad data implementation information */ | ||
190 | |||
191 | /* | ||
192 | * EPCR0 - Exception PC Register | ||
193 | */ | ||
194 | #define EPCR0_V 0x00000001 /* register content validity indicator */ | ||
195 | #define EPCR0_PC 0xfffffffc /* faulting instruction address */ | ||
196 | |||
197 | /* | ||
198 | * ESR0/14/15 - Exception Status Register | ||
199 | */ | ||
200 | #define ESRx_VALID 0x00000001 /* register content validity indicator */ | ||
201 | #define ESRx_EC 0x0000003e /* exception type */ | ||
202 | #define ESRx_EC_DATA_STORE 0x00000000 /* - data_store_error */ | ||
203 | #define ESRx_EC_INSN_ACCESS 0x00000006 /* - instruction_access_error */ | ||
204 | #define ESRx_EC_PRIV_INSN 0x00000008 /* - privileged_instruction */ | ||
205 | #define ESRx_EC_ILL_INSN 0x0000000a /* - illegal_instruction */ | ||
206 | #define ESRx_EC_MP_EXCEP 0x0000001c /* - mp_exception */ | ||
207 | #define ESRx_EC_DATA_ACCESS 0x00000020 /* - data_access_error */ | ||
208 | #define ESRx_EC_DIVISION 0x00000026 /* - division_exception */ | ||
209 | #define ESRx_EC_ITLB_MISS 0x00000034 /* - instruction_access_TLB_miss */ | ||
210 | #define ESRx_EC_DTLB_MISS 0x00000036 /* - data_access_TLB_miss */ | ||
211 | #define ESRx_EC_DATA_ACCESS_DAT 0x0000003a /* - data_access_DAT_exception */ | ||
212 | |||
213 | #define ESR0_IAEC 0x00000100 /* info for instruction-access-exception */ | ||
214 | #define ESR0_IAEC_RESV 0x00000000 /* - reserved */ | ||
215 | #define ESR0_IAEC_PROT_VIOL 0x00000100 /* - protection violation */ | ||
216 | |||
217 | #define ESR0_ATXC 0x00f00000 /* address translation exception code */ | ||
218 | #define ESR0_ATXC_MMU_MISS 0x00000000 /* - MMU miss exception and more (?) */ | ||
219 | #define ESR0_ATXC_MULTI_DAT 0x00800000 /* - multiple DAT entry hit */ | ||
220 | #define ESR0_ATXC_MULTI_SAT 0x00900000 /* - multiple SAT entry hit */ | ||
221 | #define ESR0_ATXC_AMRTLB_MISS 0x00a00000 /* - MMU/TLB miss exception */ | ||
222 | #define ESR0_ATXC_PRIV_EXCEP 0x00c00000 /* - privilege protection fault */ | ||
223 | #define ESR0_ATXC_WP_EXCEP 0x00d00000 /* - write protection fault */ | ||
224 | |||
225 | #define ESR0_EAV 0x00000800 /* true if EAR0 register valid */ | ||
226 | #define ESR15_EAV 0x00000800 /* true if EAR15 register valid */ | ||
227 | |||
228 | /* | ||
229 | * ESFR1 - Exception Status Valid Flag Register | ||
230 | */ | ||
231 | #define ESFR1_ESR0 0x00000001 /* true if ESR0 is valid */ | ||
232 | #define ESFR1_ESR14 0x00004000 /* true if ESR14 is valid */ | ||
233 | #define ESFR1_ESR15 0x00008000 /* true if ESR15 is valid */ | ||
234 | |||
235 | /* | ||
236 | * MSR - Media Status Register | ||
237 | */ | ||
238 | #define MSR0_AOVF 0x00000001 /* overflow exception accrued */ | ||
239 | #define MSRx_OVF 0x00000002 /* overflow exception detected */ | ||
240 | #define MSRx_SIE 0x0000003c /* last SIMD instruction exception detected */ | ||
241 | #define MSRx_SIE_NONE 0x00000000 /* - none detected */ | ||
242 | #define MSRx_SIE_FRkHI_ACCk 0x00000020 /* - exception at FRkHI or ACCk */ | ||
243 | #define MSRx_SIE_FRkLO_ACCk1 0x00000010 /* - exception at FRkLO or ACCk+1 */ | ||
244 | #define MSRx_SIE_FRk1HI_ACCk2 0x00000008 /* - exception at FRk+1HI or ACCk+2 */ | ||
245 | #define MSRx_SIE_FRk1LO_ACCk3 0x00000004 /* - exception at FRk+1LO or ACCk+3 */ | ||
246 | #define MSR0_MTT 0x00007000 /* type of last media trap detected */ | ||
247 | #define MSR0_MTT_NONE 0x00000000 /* - none detected */ | ||
248 | #define MSR0_MTT_OVERFLOW 0x00001000 /* - overflow detected */ | ||
249 | #define MSR0_HI 0x00c00000 /* hardware implementation */ | ||
250 | #define MSR0_HI_ROUNDING 0x00000000 /* - rounding mode */ | ||
251 | #define MSR0_HI_NONROUNDING 0x00c00000 /* - non-rounding mode */ | ||
252 | #define MSR0_EMCI 0x01000000 /* enable media custom instructions */ | ||
253 | #define MSR0_SRDAV 0x10000000 /* select rounding mode of MAVEH */ | ||
254 | #define MSR0_SRDAV_RDAV 0x00000000 /* - controlled by MSR.RDAV */ | ||
255 | #define MSR0_SRDAV_RD 0x10000000 /* - controlled by MSR.RD */ | ||
256 | #define MSR0_RDAV 0x20000000 /* rounding mode of MAVEH */ | ||
257 | #define MSR0_RDAV_NEAREST_MI 0x00000000 /* - round to nearest minus */ | ||
258 | #define MSR0_RDAV_NEAREST_PL 0x20000000 /* - round to nearest plus */ | ||
259 | #define MSR0_RD 0xc0000000 /* rounding mode */ | ||
260 | #define MSR0_RD_NEAREST 0x00000000 /* - nearest */ | ||
261 | #define MSR0_RD_ZERO 0x40000000 /* - zero */ | ||
262 | #define MSR0_RD_POS_INF 0x80000000 /* - postive infinity */ | ||
263 | #define MSR0_RD_NEG_INF 0xc0000000 /* - negative infinity */ | ||
264 | |||
265 | /* | ||
266 | * IAMPR0-7 - Instruction Address Mapping Register | ||
267 | * DAMPR0-7 - Data Address Mapping Register | ||
268 | */ | ||
269 | #define xAMPRx_V 0x00000001 /* register content validity indicator */ | ||
270 | #define DAMPRx_WP 0x00000002 /* write protect */ | ||
271 | #define DAMPRx_WP_RW 0x00000000 /* - read/write */ | ||
272 | #define DAMPRx_WP_RO 0x00000002 /* - read-only */ | ||
273 | #define xAMPRx_C 0x00000004 /* cached/uncached */ | ||
274 | #define xAMPRx_C_CACHED 0x00000000 /* - cached */ | ||
275 | #define xAMPRx_C_UNCACHED 0x00000004 /* - uncached */ | ||
276 | #define xAMPRx_S 0x00000008 /* supervisor only */ | ||
277 | #define xAMPRx_S_USER 0x00000000 /* - userspace can access */ | ||
278 | #define xAMPRx_S_KERNEL 0x00000008 /* - kernel only */ | ||
279 | #define xAMPRx_SS 0x000000f0 /* segment size */ | ||
280 | #define xAMPRx_SS_16Kb 0x00000000 /* - 16 kilobytes */ | ||
281 | #define xAMPRx_SS_64Kb 0x00000010 /* - 64 kilobytes */ | ||
282 | #define xAMPRx_SS_256Kb 0x00000020 /* - 256 kilobytes */ | ||
283 | #define xAMPRx_SS_1Mb 0x00000030 /* - 1 megabyte */ | ||
284 | #define xAMPRx_SS_2Mb 0x00000040 /* - 2 megabytes */ | ||
285 | #define xAMPRx_SS_4Mb 0x00000050 /* - 4 megabytes */ | ||
286 | #define xAMPRx_SS_8Mb 0x00000060 /* - 8 megabytes */ | ||
287 | #define xAMPRx_SS_16Mb 0x00000070 /* - 16 megabytes */ | ||
288 | #define xAMPRx_SS_32Mb 0x00000080 /* - 32 megabytes */ | ||
289 | #define xAMPRx_SS_64Mb 0x00000090 /* - 64 megabytes */ | ||
290 | #define xAMPRx_SS_128Mb 0x000000a0 /* - 128 megabytes */ | ||
291 | #define xAMPRx_SS_256Mb 0x000000b0 /* - 256 megabytes */ | ||
292 | #define xAMPRx_SS_512Mb 0x000000c0 /* - 512 megabytes */ | ||
293 | #define xAMPRx_RESERVED8 0x00000100 /* reserved bit */ | ||
294 | #define xAMPRx_NG 0x00000200 /* non-global */ | ||
295 | #define xAMPRx_L 0x00000400 /* locked */ | ||
296 | #define xAMPRx_M 0x00000800 /* modified */ | ||
297 | #define xAMPRx_D 0x00001000 /* DAT entry */ | ||
298 | #define xAMPRx_RESERVED13 0x00002000 /* reserved bit */ | ||
299 | #define xAMPRx_PPFN 0xfff00000 /* physical page frame number */ | ||
300 | |||
301 | #define xAMPRx_V_BIT 0 | ||
302 | #define DAMPRx_WP_BIT 1 | ||
303 | #define xAMPRx_C_BIT 2 | ||
304 | #define xAMPRx_S_BIT 3 | ||
305 | #define xAMPRx_RESERVED8_BIT 8 | ||
306 | #define xAMPRx_NG_BIT 9 | ||
307 | #define xAMPRx_L_BIT 10 | ||
308 | #define xAMPRx_M_BIT 11 | ||
309 | #define xAMPRx_D_BIT 12 | ||
310 | #define xAMPRx_RESERVED13_BIT 13 | ||
311 | |||
312 | #define __get_IAMPR(R) ({ unsigned long x; asm volatile("movsg iampr"#R",%0" : "=r"(x)); x; }) | ||
313 | #define __get_DAMPR(R) ({ unsigned long x; asm volatile("movsg dampr"#R",%0" : "=r"(x)); x; }) | ||
314 | |||
315 | #define __get_IAMLR(R) ({ unsigned long x; asm volatile("movsg iamlr"#R",%0" : "=r"(x)); x; }) | ||
316 | #define __get_DAMLR(R) ({ unsigned long x; asm volatile("movsg damlr"#R",%0" : "=r"(x)); x; }) | ||
317 | |||
318 | #define __set_IAMPR(R,V) do { asm volatile("movgs %0,iampr"#R : : "r"(V)); } while(0) | ||
319 | #define __set_DAMPR(R,V) do { asm volatile("movgs %0,dampr"#R : : "r"(V)); } while(0) | ||
320 | |||
321 | #define __set_IAMLR(R,V) do { asm volatile("movgs %0,iamlr"#R : : "r"(V)); } while(0) | ||
322 | #define __set_DAMLR(R,V) do { asm volatile("movgs %0,damlr"#R : : "r"(V)); } while(0) | ||
323 | |||
324 | #define save_dampr(R, _dampr) \ | ||
325 | do { \ | ||
326 | asm volatile("movsg dampr"R",%0" : "=r"(_dampr)); \ | ||
327 | } while(0) | ||
328 | |||
329 | #define restore_dampr(R, _dampr) \ | ||
330 | do { \ | ||
331 | asm volatile("movgs %0,dampr"R :: "r"(_dampr)); \ | ||
332 | } while(0) | ||
333 | |||
334 | /* | ||
335 | * AMCR - Address Mapping Control Register | ||
336 | */ | ||
337 | #define AMCR_IAMRN 0x000000ff /* quantity of IAMPR registers */ | ||
338 | #define AMCR_DAMRN 0x0000ff00 /* quantity of DAMPR registers */ | ||
339 | |||
340 | /* | ||
341 | * TTBR - Address Translation Table Base Register | ||
342 | */ | ||
343 | #define __get_TTBR() ({ unsigned long x; asm volatile("movsg ttbr,%0" : "=r"(x)); x; }) | ||
344 | |||
345 | /* | ||
346 | * TPXR - TLB Probe Extend Register | ||
347 | */ | ||
348 | #define TPXR_E 0x00000001 | ||
349 | #define TPXR_LMAX_SHIFT 20 | ||
350 | #define TPXR_LMAX_SMASK 0xf | ||
351 | #define TPXR_WMAX_SHIFT 24 | ||
352 | #define TPXR_WMAX_SMASK 0xf | ||
353 | #define TPXR_WAY_SHIFT 28 | ||
354 | #define TPXR_WAY_SMASK 0xf | ||
355 | |||
356 | /* | ||
357 | * DCR - Debug Control Register | ||
358 | */ | ||
359 | #define DCR_IBCE3 0x00000001 /* break on conditional insn pointed to by IBAR3 */ | ||
360 | #define DCR_IBE3 0x00000002 /* break on insn pointed to by IBAR3 */ | ||
361 | #define DCR_IBCE1 0x00000004 /* break on conditional insn pointed to by IBAR2 */ | ||
362 | #define DCR_IBE1 0x00000008 /* break on insn pointed to by IBAR2 */ | ||
363 | #define DCR_IBCE2 0x00000010 /* break on conditional insn pointed to by IBAR1 */ | ||
364 | #define DCR_IBE2 0x00000020 /* break on insn pointed to by IBAR1 */ | ||
365 | #define DCR_IBCE0 0x00000040 /* break on conditional insn pointed to by IBAR0 */ | ||
366 | #define DCR_IBE0 0x00000080 /* break on insn pointed to by IBAR0 */ | ||
367 | |||
368 | #define DCR_DDBE1 0x00004000 /* use DBDR1x when checking DBAR1 */ | ||
369 | #define DCR_DWBE1 0x00008000 /* break on store to address in DBAR1/DBMR1x */ | ||
370 | #define DCR_DRBE1 0x00010000 /* break on load from address in DBAR1/DBMR1x */ | ||
371 | #define DCR_DDBE0 0x00020000 /* use DBDR0x when checking DBAR0 */ | ||
372 | #define DCR_DWBE0 0x00040000 /* break on store to address in DBAR0/DBMR0x */ | ||
373 | #define DCR_DRBE0 0x00080000 /* break on load from address in DBAR0/DBMR0x */ | ||
374 | |||
375 | #define DCR_EIM 0x0c000000 /* external interrupt disable */ | ||
376 | #define DCR_IBM 0x10000000 /* instruction break disable */ | ||
377 | #define DCR_SE 0x20000000 /* single step enable */ | ||
378 | #define DCR_EBE 0x40000000 /* exception break enable */ | ||
379 | |||
380 | /* | ||
381 | * BRR - Break Interrupt Request Register | ||
382 | */ | ||
383 | #define BRR_ST 0x00000001 /* single-step detected */ | ||
384 | #define BRR_SB 0x00000002 /* break instruction detected */ | ||
385 | #define BRR_BB 0x00000004 /* branch with hint detected */ | ||
386 | #define BRR_CBB 0x00000008 /* branch to LR detected */ | ||
387 | #define BRR_IBx 0x000000f0 /* hardware breakpoint detected */ | ||
388 | #define BRR_DBx 0x00000f00 /* hardware watchpoint detected */ | ||
389 | #define BRR_DBNEx 0x0000f000 /* ? */ | ||
390 | #define BRR_EBTT 0x00ff0000 /* trap type of exception break */ | ||
391 | #define BRR_TB 0x10000000 /* external break request detected */ | ||
392 | #define BRR_CB 0x20000000 /* ICE break command detected */ | ||
393 | #define BRR_EB 0x40000000 /* exception break detected */ | ||
394 | |||
395 | /* | ||
396 | * BPSR - Break PSR Save Register | ||
397 | */ | ||
398 | #define BPSR_BET 0x00000001 /* former PSR.ET */ | ||
399 | #define BPSR_BS 0x00001000 /* former PSR.S */ | ||
400 | |||
401 | #endif /* _ASM_SPR_REGS_H */ | ||
diff --git a/include/asm-frv/stat.h b/include/asm-frv/stat.h new file mode 100644 index 000000000000..ce56de9b37ba --- /dev/null +++ b/include/asm-frv/stat.h | |||
@@ -0,0 +1,100 @@ | |||
1 | #ifndef _ASM_STAT_H | ||
2 | #define _ASM_STAT_H | ||
3 | |||
4 | struct __old_kernel_stat { | ||
5 | unsigned short st_dev; | ||
6 | unsigned short st_ino; | ||
7 | unsigned short st_mode; | ||
8 | unsigned short st_nlink; | ||
9 | unsigned short st_uid; | ||
10 | unsigned short st_gid; | ||
11 | unsigned short st_rdev; | ||
12 | unsigned long st_size; | ||
13 | unsigned long st_atime; | ||
14 | unsigned long st_mtime; | ||
15 | unsigned long st_ctime; | ||
16 | }; | ||
17 | |||
18 | /* This matches struct stat in uClibc/glibc. */ | ||
19 | struct stat { | ||
20 | unsigned char __pad1[6]; | ||
21 | unsigned short st_dev; | ||
22 | |||
23 | unsigned long __pad2; | ||
24 | unsigned long st_ino; | ||
25 | |||
26 | unsigned short __pad3; | ||
27 | unsigned short st_mode; | ||
28 | unsigned short __pad4; | ||
29 | unsigned short st_nlink; | ||
30 | |||
31 | unsigned short __pad5; | ||
32 | unsigned short st_uid; | ||
33 | unsigned short __pad6; | ||
34 | unsigned short st_gid; | ||
35 | |||
36 | unsigned char __pad7[6]; | ||
37 | unsigned short st_rdev; | ||
38 | |||
39 | unsigned long __pad8; | ||
40 | unsigned long st_size; | ||
41 | |||
42 | unsigned long __pad9; /* align 64-bit st_blocks to 2-word */ | ||
43 | unsigned long st_blksize; | ||
44 | |||
45 | unsigned long __pad10; /* future possible st_blocks high bits */ | ||
46 | unsigned long st_blocks; /* Number 512-byte blocks allocated. */ | ||
47 | |||
48 | unsigned long __unused1; | ||
49 | unsigned long st_atime; | ||
50 | |||
51 | unsigned long __unused2; | ||
52 | unsigned long st_mtime; | ||
53 | |||
54 | unsigned long __unused3; | ||
55 | unsigned long st_ctime; | ||
56 | |||
57 | unsigned long long __unused4; | ||
58 | }; | ||
59 | |||
60 | /* This matches struct stat64 in uClibc/glibc. The layout is exactly | ||
61 | the same as that of struct stat above, with 64-bit types taking up | ||
62 | space that was formerly used by padding. stat syscalls are still | ||
63 | different from stat64, though, in that the former tests for | ||
64 | overflow. */ | ||
65 | struct stat64 { | ||
66 | unsigned char __pad1[6]; | ||
67 | unsigned short st_dev; | ||
68 | |||
69 | unsigned long long st_ino; | ||
70 | |||
71 | unsigned int st_mode; | ||
72 | unsigned int st_nlink; | ||
73 | |||
74 | unsigned long st_uid; | ||
75 | unsigned long st_gid; | ||
76 | |||
77 | unsigned char __pad2[6]; | ||
78 | unsigned short st_rdev; | ||
79 | |||
80 | long long st_size; | ||
81 | |||
82 | unsigned long __pad3; /* align 64-bit st_blocks to 2-word */ | ||
83 | unsigned long st_blksize; | ||
84 | |||
85 | unsigned long __pad4; /* future possible st_blocks high bits */ | ||
86 | unsigned long st_blocks; /* Number 512-byte blocks allocated. */ | ||
87 | |||
88 | unsigned long st_atime_nsec; | ||
89 | unsigned long st_atime; | ||
90 | |||
91 | unsigned int st_mtime_nsec; | ||
92 | unsigned long st_mtime; | ||
93 | |||
94 | unsigned long st_ctime_nsec; | ||
95 | unsigned long st_ctime; | ||
96 | |||
97 | unsigned long long __unused4; | ||
98 | }; | ||
99 | |||
100 | #endif /* _ASM_STAT_H */ | ||
diff --git a/include/asm-frv/statfs.h b/include/asm-frv/statfs.h new file mode 100644 index 000000000000..741f586045ba --- /dev/null +++ b/include/asm-frv/statfs.h | |||
@@ -0,0 +1,7 @@ | |||
1 | #ifndef _ASM_STATFS_H | ||
2 | #define _ASM_STATFS_H | ||
3 | |||
4 | #include <asm-generic/statfs.h> | ||
5 | |||
6 | #endif /* _ASM_STATFS_H */ | ||
7 | |||
diff --git a/include/asm-frv/string.h b/include/asm-frv/string.h new file mode 100644 index 000000000000..5ed310f64b7e --- /dev/null +++ b/include/asm-frv/string.h | |||
@@ -0,0 +1,51 @@ | |||
1 | /* string.h: FRV string handling | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_STRING_H_ | ||
13 | #define _ASM_STRING_H_ | ||
14 | |||
15 | #ifdef __KERNEL__ /* only set these up for kernel code */ | ||
16 | |||
17 | #define __HAVE_ARCH_MEMSET 1 | ||
18 | #define __HAVE_ARCH_MEMCPY 1 | ||
19 | |||
20 | extern void *memset(void *, int, __kernel_size_t); | ||
21 | extern void *memcpy(void *, const void *, __kernel_size_t); | ||
22 | |||
23 | #else /* KERNEL */ | ||
24 | |||
25 | /* | ||
26 | * let user libraries deal with these, | ||
27 | * IMHO the kernel has no place defining these functions for user apps | ||
28 | */ | ||
29 | |||
30 | #define __HAVE_ARCH_STRCPY 1 | ||
31 | #define __HAVE_ARCH_STRNCPY 1 | ||
32 | #define __HAVE_ARCH_STRCAT 1 | ||
33 | #define __HAVE_ARCH_STRNCAT 1 | ||
34 | #define __HAVE_ARCH_STRCMP 1 | ||
35 | #define __HAVE_ARCH_STRNCMP 1 | ||
36 | #define __HAVE_ARCH_STRNICMP 1 | ||
37 | #define __HAVE_ARCH_STRCHR 1 | ||
38 | #define __HAVE_ARCH_STRRCHR 1 | ||
39 | #define __HAVE_ARCH_STRSTR 1 | ||
40 | #define __HAVE_ARCH_STRLEN 1 | ||
41 | #define __HAVE_ARCH_STRNLEN 1 | ||
42 | #define __HAVE_ARCH_MEMSET 1 | ||
43 | #define __HAVE_ARCH_MEMCPY 1 | ||
44 | #define __HAVE_ARCH_MEMMOVE 1 | ||
45 | #define __HAVE_ARCH_MEMSCAN 1 | ||
46 | #define __HAVE_ARCH_MEMCMP 1 | ||
47 | #define __HAVE_ARCH_MEMCHR 1 | ||
48 | #define __HAVE_ARCH_STRTOK 1 | ||
49 | |||
50 | #endif /* KERNEL */ | ||
51 | #endif /* _ASM_STRING_H_ */ | ||
diff --git a/include/asm-frv/suspend.h b/include/asm-frv/suspend.h new file mode 100644 index 000000000000..5fa7b5a6ee40 --- /dev/null +++ b/include/asm-frv/suspend.h | |||
@@ -0,0 +1,20 @@ | |||
1 | /* suspend.h: suspension stuff | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_SUSPEND_H | ||
13 | #define _ASM_SUSPEND_H | ||
14 | |||
15 | static inline int arch_prepare_suspend(void) | ||
16 | { | ||
17 | return 0; | ||
18 | } | ||
19 | |||
20 | #endif /* _ASM_SUSPEND_H */ | ||
diff --git a/include/asm-frv/system.h b/include/asm-frv/system.h new file mode 100644 index 000000000000..d2aea70a5f64 --- /dev/null +++ b/include/asm-frv/system.h | |||
@@ -0,0 +1,128 @@ | |||
1 | /* system.h: FR-V CPU control definitions | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_SYSTEM_H | ||
13 | #define _ASM_SYSTEM_H | ||
14 | |||
15 | #include <linux/config.h> /* get configuration macros */ | ||
16 | #include <linux/linkage.h> | ||
17 | #include <asm/atomic.h> | ||
18 | |||
19 | struct thread_struct; | ||
20 | |||
21 | #define prepare_to_switch() do { } while(0) | ||
22 | |||
23 | /* | ||
24 | * switch_to(prev, next) should switch from task `prev' to `next' | ||
25 | * `prev' will never be the same as `next'. | ||
26 | * The `mb' is to tell GCC not to cache `current' across this call. | ||
27 | */ | ||
28 | extern asmlinkage | ||
29 | struct task_struct *__switch_to(struct thread_struct *prev_thread, | ||
30 | struct thread_struct *next_thread, | ||
31 | struct task_struct *prev); | ||
32 | |||
33 | #define switch_to(prev, next, last) \ | ||
34 | do { \ | ||
35 | (prev)->thread.sched_lr = \ | ||
36 | (unsigned long) __builtin_return_address(0); \ | ||
37 | (last) = __switch_to(&(prev)->thread, &(next)->thread, (prev)); \ | ||
38 | mb(); \ | ||
39 | } while(0) | ||
40 | |||
41 | /* | ||
42 | * interrupt flag manipulation | ||
43 | */ | ||
44 | #define local_irq_disable() \ | ||
45 | do { \ | ||
46 | unsigned long psr; \ | ||
47 | asm volatile(" movsg psr,%0 \n" \ | ||
48 | " andi %0,%2,%0 \n" \ | ||
49 | " ori %0,%1,%0 \n" \ | ||
50 | " movgs %0,psr \n" \ | ||
51 | : "=r"(psr) \ | ||
52 | : "i" (PSR_PIL_14), "i" (~PSR_PIL) \ | ||
53 | : "memory"); \ | ||
54 | } while(0) | ||
55 | |||
56 | #define local_irq_enable() \ | ||
57 | do { \ | ||
58 | unsigned long psr; \ | ||
59 | asm volatile(" movsg psr,%0 \n" \ | ||
60 | " andi %0,%1,%0 \n" \ | ||
61 | " movgs %0,psr \n" \ | ||
62 | : "=r"(psr) \ | ||
63 | : "i" (~PSR_PIL) \ | ||
64 | : "memory"); \ | ||
65 | } while(0) | ||
66 | |||
67 | #define local_save_flags(flags) \ | ||
68 | do { \ | ||
69 | typecheck(unsigned long, flags); \ | ||
70 | asm("movsg psr,%0" \ | ||
71 | : "=r"(flags) \ | ||
72 | : \ | ||
73 | : "memory"); \ | ||
74 | } while(0) | ||
75 | |||
76 | #define local_irq_save(flags) \ | ||
77 | do { \ | ||
78 | unsigned long npsr; \ | ||
79 | typecheck(unsigned long, flags); \ | ||
80 | asm volatile(" movsg psr,%0 \n" \ | ||
81 | " andi %0,%3,%1 \n" \ | ||
82 | " ori %1,%2,%1 \n" \ | ||
83 | " movgs %1,psr \n" \ | ||
84 | : "=r"(flags), "=r"(npsr) \ | ||
85 | : "i" (PSR_PIL_14), "i" (~PSR_PIL) \ | ||
86 | : "memory"); \ | ||
87 | } while(0) | ||
88 | |||
89 | #define local_irq_restore(flags) \ | ||
90 | do { \ | ||
91 | typecheck(unsigned long, flags); \ | ||
92 | asm volatile(" movgs %0,psr \n" \ | ||
93 | : \ | ||
94 | : "r" (flags) \ | ||
95 | : "memory"); \ | ||
96 | } while(0) | ||
97 | |||
98 | #define irqs_disabled() \ | ||
99 | ((__get_PSR() & PSR_PIL) >= PSR_PIL_14) | ||
100 | |||
101 | /* | ||
102 | * Force strict CPU ordering. | ||
103 | */ | ||
104 | #define nop() asm volatile ("nop"::) | ||
105 | #define mb() asm volatile ("membar" : : :"memory") | ||
106 | #define rmb() asm volatile ("membar" : : :"memory") | ||
107 | #define wmb() asm volatile ("membar" : : :"memory") | ||
108 | #define set_mb(var, value) do { var = value; mb(); } while (0) | ||
109 | #define set_wmb(var, value) do { var = value; wmb(); } while (0) | ||
110 | |||
111 | #define smp_mb() mb() | ||
112 | #define smp_rmb() rmb() | ||
113 | #define smp_wmb() wmb() | ||
114 | |||
115 | #define read_barrier_depends() do {} while(0) | ||
116 | #define smp_read_barrier_depends() read_barrier_depends() | ||
117 | |||
118 | #define HARD_RESET_NOW() \ | ||
119 | do { \ | ||
120 | cli(); \ | ||
121 | } while(1) | ||
122 | |||
123 | extern void die_if_kernel(const char *, ...) __attribute__((format(printf, 1, 2))); | ||
124 | extern void free_initmem(void); | ||
125 | |||
126 | #define arch_align_stack(x) (x) | ||
127 | |||
128 | #endif /* _ASM_SYSTEM_H */ | ||
diff --git a/include/asm-frv/termbits.h b/include/asm-frv/termbits.h new file mode 100644 index 000000000000..74f20d6e292f --- /dev/null +++ b/include/asm-frv/termbits.h | |||
@@ -0,0 +1,177 @@ | |||
1 | #ifndef _ASM_TERMBITS_H__ | ||
2 | #define _ASM_TERMBITS_H__ | ||
3 | |||
4 | #include <linux/posix_types.h> | ||
5 | |||
6 | typedef unsigned char cc_t; | ||
7 | typedef unsigned int speed_t; | ||
8 | typedef unsigned int tcflag_t; | ||
9 | |||
10 | #define NCCS 19 | ||
11 | struct termios { | ||
12 | tcflag_t c_iflag; /* input mode flags */ | ||
13 | tcflag_t c_oflag; /* output mode flags */ | ||
14 | tcflag_t c_cflag; /* control mode flags */ | ||
15 | tcflag_t c_lflag; /* local mode flags */ | ||
16 | cc_t c_line; /* line discipline */ | ||
17 | cc_t c_cc[NCCS]; /* control characters */ | ||
18 | }; | ||
19 | |||
20 | /* c_cc characters */ | ||
21 | #define VINTR 0 | ||
22 | #define VQUIT 1 | ||
23 | #define VERASE 2 | ||
24 | #define VKILL 3 | ||
25 | #define VEOF 4 | ||
26 | #define VTIME 5 | ||
27 | #define VMIN 6 | ||
28 | #define VSWTC 7 | ||
29 | #define VSTART 8 | ||
30 | #define VSTOP 9 | ||
31 | #define VSUSP 10 | ||
32 | #define VEOL 11 | ||
33 | #define VREPRINT 12 | ||
34 | #define VDISCARD 13 | ||
35 | #define VWERASE 14 | ||
36 | #define VLNEXT 15 | ||
37 | #define VEOL2 16 | ||
38 | |||
39 | |||
40 | /* c_iflag bits */ | ||
41 | #define IGNBRK 0000001 | ||
42 | #define BRKINT 0000002 | ||
43 | #define IGNPAR 0000004 | ||
44 | #define PARMRK 0000010 | ||
45 | #define INPCK 0000020 | ||
46 | #define ISTRIP 0000040 | ||
47 | #define INLCR 0000100 | ||
48 | #define IGNCR 0000200 | ||
49 | #define ICRNL 0000400 | ||
50 | #define IUCLC 0001000 | ||
51 | #define IXON 0002000 | ||
52 | #define IXANY 0004000 | ||
53 | #define IXOFF 0010000 | ||
54 | #define IMAXBEL 0020000 | ||
55 | #define IUTF8 0040000 | ||
56 | |||
57 | /* c_oflag bits */ | ||
58 | #define OPOST 0000001 | ||
59 | #define OLCUC 0000002 | ||
60 | #define ONLCR 0000004 | ||
61 | #define OCRNL 0000010 | ||
62 | #define ONOCR 0000020 | ||
63 | #define ONLRET 0000040 | ||
64 | #define OFILL 0000100 | ||
65 | #define OFDEL 0000200 | ||
66 | #define NLDLY 0000400 | ||
67 | #define NL0 0000000 | ||
68 | #define NL1 0000400 | ||
69 | #define CRDLY 0003000 | ||
70 | #define CR0 0000000 | ||
71 | #define CR1 0001000 | ||
72 | #define CR2 0002000 | ||
73 | #define CR3 0003000 | ||
74 | #define TABDLY 0014000 | ||
75 | #define TAB0 0000000 | ||
76 | #define TAB1 0004000 | ||
77 | #define TAB2 0010000 | ||
78 | #define TAB3 0014000 | ||
79 | #define XTABS 0014000 | ||
80 | #define BSDLY 0020000 | ||
81 | #define BS0 0000000 | ||
82 | #define BS1 0020000 | ||
83 | #define VTDLY 0040000 | ||
84 | #define VT0 0000000 | ||
85 | #define VT1 0040000 | ||
86 | #define FFDLY 0100000 | ||
87 | #define FF0 0000000 | ||
88 | #define FF1 0100000 | ||
89 | |||
90 | /* c_cflag bit meaning */ | ||
91 | #define CBAUD 0010017 | ||
92 | #define B0 0000000 /* hang up */ | ||
93 | #define B50 0000001 | ||
94 | #define B75 0000002 | ||
95 | #define B110 0000003 | ||
96 | #define B134 0000004 | ||
97 | #define B150 0000005 | ||
98 | #define B200 0000006 | ||
99 | #define B300 0000007 | ||
100 | #define B600 0000010 | ||
101 | #define B1200 0000011 | ||
102 | #define B1800 0000012 | ||
103 | #define B2400 0000013 | ||
104 | #define B4800 0000014 | ||
105 | #define B9600 0000015 | ||
106 | #define B19200 0000016 | ||
107 | #define B38400 0000017 | ||
108 | #define EXTA B19200 | ||
109 | #define EXTB B38400 | ||
110 | #define CSIZE 0000060 | ||
111 | #define CS5 0000000 | ||
112 | #define CS6 0000020 | ||
113 | #define CS7 0000040 | ||
114 | #define CS8 0000060 | ||
115 | #define CSTOPB 0000100 | ||
116 | #define CREAD 0000200 | ||
117 | #define PARENB 0000400 | ||
118 | #define PARODD 0001000 | ||
119 | #define HUPCL 0002000 | ||
120 | #define CLOCAL 0004000 | ||
121 | #define CBAUDEX 0010000 | ||
122 | #define B57600 0010001 | ||
123 | #define B115200 0010002 | ||
124 | #define B230400 0010003 | ||
125 | #define B460800 0010004 | ||
126 | #define B500000 0010005 | ||
127 | #define B576000 0010006 | ||
128 | #define B921600 0010007 | ||
129 | #define B1000000 0010010 | ||
130 | #define B1152000 0010011 | ||
131 | #define B1500000 0010012 | ||
132 | #define B2000000 0010013 | ||
133 | #define B2500000 0010014 | ||
134 | #define B3000000 0010015 | ||
135 | #define B3500000 0010016 | ||
136 | #define B4000000 0010017 | ||
137 | #define CIBAUD 002003600000 /* input baud rate (not used) */ | ||
138 | #define CTVB 004000000000 /* VisioBraille Terminal flow control */ | ||
139 | #define CMSPAR 010000000000 /* mark or space (stick) parity */ | ||
140 | #define CRTSCTS 020000000000 /* flow control */ | ||
141 | |||
142 | /* c_lflag bits */ | ||
143 | #define ISIG 0000001 | ||
144 | #define ICANON 0000002 | ||
145 | #define XCASE 0000004 | ||
146 | #define ECHO 0000010 | ||
147 | #define ECHOE 0000020 | ||
148 | #define ECHOK 0000040 | ||
149 | #define ECHONL 0000100 | ||
150 | #define NOFLSH 0000200 | ||
151 | #define TOSTOP 0000400 | ||
152 | #define ECHOCTL 0001000 | ||
153 | #define ECHOPRT 0002000 | ||
154 | #define ECHOKE 0004000 | ||
155 | #define FLUSHO 0010000 | ||
156 | #define PENDIN 0040000 | ||
157 | #define IEXTEN 0100000 | ||
158 | |||
159 | |||
160 | /* tcflow() and TCXONC use these */ | ||
161 | #define TCOOFF 0 | ||
162 | #define TCOON 1 | ||
163 | #define TCIOFF 2 | ||
164 | #define TCION 3 | ||
165 | |||
166 | /* tcflush() and TCFLSH use these */ | ||
167 | #define TCIFLUSH 0 | ||
168 | #define TCOFLUSH 1 | ||
169 | #define TCIOFLUSH 2 | ||
170 | |||
171 | /* tcsetattr uses these */ | ||
172 | #define TCSANOW 0 | ||
173 | #define TCSADRAIN 1 | ||
174 | #define TCSAFLUSH 2 | ||
175 | |||
176 | #endif /* _ASM_TERMBITS_H__ */ | ||
177 | |||
diff --git a/include/asm-frv/termios.h b/include/asm-frv/termios.h new file mode 100644 index 000000000000..b4a664e7f55c --- /dev/null +++ b/include/asm-frv/termios.h | |||
@@ -0,0 +1,74 @@ | |||
1 | #ifndef _ASM_TERMIOS_H | ||
2 | #define _ASM_TERMIOS_H | ||
3 | |||
4 | #include <asm/termbits.h> | ||
5 | #include <asm/ioctls.h> | ||
6 | |||
7 | struct winsize { | ||
8 | unsigned short ws_row; | ||
9 | unsigned short ws_col; | ||
10 | unsigned short ws_xpixel; | ||
11 | unsigned short ws_ypixel; | ||
12 | }; | ||
13 | |||
14 | #define NCC 8 | ||
15 | struct termio { | ||
16 | unsigned short c_iflag; /* input mode flags */ | ||
17 | unsigned short c_oflag; /* output mode flags */ | ||
18 | unsigned short c_cflag; /* control mode flags */ | ||
19 | unsigned short c_lflag; /* local mode flags */ | ||
20 | unsigned char c_line; /* line discipline */ | ||
21 | unsigned char c_cc[NCC]; /* control characters */ | ||
22 | }; | ||
23 | |||
24 | #ifdef __KERNEL__ | ||
25 | /* intr=^C quit=^| erase=del kill=^U | ||
26 | eof=^D vtime=\0 vmin=\1 sxtc=\0 | ||
27 | start=^Q stop=^S susp=^Z eol=\0 | ||
28 | reprint=^R discard=^U werase=^W lnext=^V | ||
29 | eol2=\0 | ||
30 | */ | ||
31 | #define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0" | ||
32 | #endif | ||
33 | |||
34 | /* modem lines */ | ||
35 | #define TIOCM_LE 0x001 | ||
36 | #define TIOCM_DTR 0x002 | ||
37 | #define TIOCM_RTS 0x004 | ||
38 | #define TIOCM_ST 0x008 | ||
39 | #define TIOCM_SR 0x010 | ||
40 | #define TIOCM_CTS 0x020 | ||
41 | #define TIOCM_CAR 0x040 | ||
42 | #define TIOCM_RNG 0x080 | ||
43 | #define TIOCM_DSR 0x100 | ||
44 | #define TIOCM_CD TIOCM_CAR | ||
45 | #define TIOCM_RI TIOCM_RNG | ||
46 | #define TIOCM_OUT1 0x2000 | ||
47 | #define TIOCM_OUT2 0x4000 | ||
48 | #define TIOCM_LOOP 0x8000 | ||
49 | |||
50 | #define TIOCM_MODEM_BITS TIOCM_OUT2 /* IRDA support */ | ||
51 | |||
52 | /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */ | ||
53 | |||
54 | /* line disciplines */ | ||
55 | #define N_TTY 0 | ||
56 | #define N_SLIP 1 | ||
57 | #define N_MOUSE 2 | ||
58 | #define N_PPP 3 | ||
59 | #define N_STRIP 4 | ||
60 | #define N_AX25 5 | ||
61 | #define N_X25 6 /* X.25 async */ | ||
62 | #define N_6PACK 7 | ||
63 | #define N_MASC 8 /* Reserved for Mobitex module <kaz@cafe.net> */ | ||
64 | #define N_R3964 9 /* Reserved for Simatic R3964 module */ | ||
65 | #define N_PROFIBUS_FDL 10 /* Reserved for Profibus <Dave@mvhi.com> */ | ||
66 | #define N_IRDA 11 /* Linux IrDa - http://irda.sourceforge.net/ */ | ||
67 | #define N_SMSBLOCK 12 /* SMS block mode - for talking to GSM data cards about SMS messages */ | ||
68 | #define N_HDLC 13 /* synchronous HDLC */ | ||
69 | #define N_SYNC_PPP 14 | ||
70 | #define N_HCI 15 /* Bluetooth HCI UART */ | ||
71 | |||
72 | #include <asm-generic/termios.h> | ||
73 | |||
74 | #endif /* _ASM_TERMIOS_H */ | ||
diff --git a/include/asm-frv/thread_info.h b/include/asm-frv/thread_info.h new file mode 100644 index 000000000000..b80a97f50af6 --- /dev/null +++ b/include/asm-frv/thread_info.h | |||
@@ -0,0 +1,159 @@ | |||
1 | /* thread_info.h: description | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * Derived from include/asm-i386/thread_info.h | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License | ||
9 | * as published by the Free Software Foundation; either version | ||
10 | * 2 of the License, or (at your option) any later version. | ||
11 | */ | ||
12 | |||
13 | #ifndef _ASM_THREAD_INFO_H | ||
14 | #define _ASM_THREAD_INFO_H | ||
15 | |||
16 | #ifdef __KERNEL__ | ||
17 | |||
18 | #ifndef __ASSEMBLY__ | ||
19 | #include <asm/processor.h> | ||
20 | #endif | ||
21 | |||
22 | /* | ||
23 | * low level task data that entry.S needs immediate access to | ||
24 | * - this struct should fit entirely inside of one cache line | ||
25 | * - this struct shares the supervisor stack pages | ||
26 | * - if the contents of this structure are changed, the assembly constants must also be changed | ||
27 | */ | ||
28 | #ifndef __ASSEMBLY__ | ||
29 | |||
30 | struct thread_info { | ||
31 | struct task_struct *task; /* main task structure */ | ||
32 | struct exec_domain *exec_domain; /* execution domain */ | ||
33 | unsigned long flags; /* low level flags */ | ||
34 | unsigned long status; /* thread-synchronous flags */ | ||
35 | __u32 cpu; /* current CPU */ | ||
36 | __s32 preempt_count; /* 0 => preemptable, <0 => BUG */ | ||
37 | |||
38 | mm_segment_t addr_limit; /* thread address space: | ||
39 | 0-0xBFFFFFFF for user-thead | ||
40 | 0-0xFFFFFFFF for kernel-thread | ||
41 | */ | ||
42 | struct restart_block restart_block; | ||
43 | |||
44 | __u8 supervisor_stack[0]; | ||
45 | }; | ||
46 | |||
47 | #else /* !__ASSEMBLY__ */ | ||
48 | |||
49 | /* offsets into the thread_info struct for assembly code access */ | ||
50 | #define TI_TASK 0x00000000 | ||
51 | #define TI_EXEC_DOMAIN 0x00000004 | ||
52 | #define TI_FLAGS 0x00000008 | ||
53 | #define TI_STATUS 0x0000000C | ||
54 | #define TI_CPU 0x00000010 | ||
55 | #define TI_PRE_COUNT 0x00000014 | ||
56 | #define TI_ADDR_LIMIT 0x00000018 | ||
57 | #define TI_RESTART_BLOCK 0x0000001C | ||
58 | |||
59 | #endif | ||
60 | |||
61 | #define PREEMPT_ACTIVE 0x4000000 | ||
62 | |||
63 | /* | ||
64 | * macros/functions for gaining access to the thread information structure | ||
65 | * | ||
66 | * preempt_count needs to be 1 initially, until the scheduler is functional. | ||
67 | */ | ||
68 | #ifndef __ASSEMBLY__ | ||
69 | |||
70 | #define INIT_THREAD_INFO(tsk) \ | ||
71 | { \ | ||
72 | .task = &tsk, \ | ||
73 | .exec_domain = &default_exec_domain, \ | ||
74 | .flags = 0, \ | ||
75 | .cpu = 0, \ | ||
76 | .preempt_count = 1, \ | ||
77 | .addr_limit = KERNEL_DS, \ | ||
78 | .restart_block = { \ | ||
79 | .fn = do_no_restart_syscall, \ | ||
80 | }, \ | ||
81 | } | ||
82 | |||
83 | #define init_thread_info (init_thread_union.thread_info) | ||
84 | #define init_stack (init_thread_union.stack) | ||
85 | |||
86 | #ifdef CONFIG_SMALL_TASKS | ||
87 | #define THREAD_SIZE 4096 | ||
88 | #else | ||
89 | #define THREAD_SIZE 8192 | ||
90 | #endif | ||
91 | |||
92 | /* how to get the thread information struct from C */ | ||
93 | register struct thread_info *__current_thread_info asm("gr15"); | ||
94 | |||
95 | #define current_thread_info() ({ __current_thread_info; }) | ||
96 | |||
97 | /* thread information allocation */ | ||
98 | #ifdef CONFIG_DEBUG_STACK_USAGE | ||
99 | #define alloc_thread_info(tsk) \ | ||
100 | ({ \ | ||
101 | struct thread_info *ret; \ | ||
102 | \ | ||
103 | ret = kmalloc(THREAD_SIZE, GFP_KERNEL); \ | ||
104 | if (ret) \ | ||
105 | memset(ret, 0, THREAD_SIZE); \ | ||
106 | ret; \ | ||
107 | }) | ||
108 | #else | ||
109 | #define alloc_thread_info(tsk) kmalloc(THREAD_SIZE, GFP_KERNEL) | ||
110 | #endif | ||
111 | |||
112 | #define free_thread_info(info) kfree(info) | ||
113 | #define get_thread_info(ti) get_task_struct((ti)->task) | ||
114 | #define put_thread_info(ti) put_task_struct((ti)->task) | ||
115 | |||
116 | #else /* !__ASSEMBLY__ */ | ||
117 | |||
118 | #define THREAD_SIZE 8192 | ||
119 | |||
120 | #endif | ||
121 | |||
122 | /* | ||
123 | * thread information flags | ||
124 | * - these are process state flags that various assembly files may need to access | ||
125 | * - pending work-to-be-done flags are in LSW | ||
126 | * - other flags in MSW | ||
127 | */ | ||
128 | #define TIF_SYSCALL_TRACE 0 /* syscall trace active */ | ||
129 | #define TIF_NOTIFY_RESUME 1 /* resumption notification requested */ | ||
130 | #define TIF_SIGPENDING 2 /* signal pending */ | ||
131 | #define TIF_NEED_RESCHED 3 /* rescheduling necessary */ | ||
132 | #define TIF_SINGLESTEP 4 /* restore singlestep on return to user mode */ | ||
133 | #define TIF_IRET 5 /* return with iret */ | ||
134 | #define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */ | ||
135 | #define TIF_MEMDIE 17 /* OOM killer killed process */ | ||
136 | |||
137 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) | ||
138 | #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) | ||
139 | #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) | ||
140 | #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) | ||
141 | #define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) | ||
142 | #define _TIF_IRET (1 << TIF_IRET) | ||
143 | #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) | ||
144 | |||
145 | #define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */ | ||
146 | #define _TIF_ALLWORK_MASK 0x0000FFFF /* work to do on any return to u-space */ | ||
147 | |||
148 | /* | ||
149 | * Thread-synchronous status. | ||
150 | * | ||
151 | * This is different from the flags in that nobody else | ||
152 | * ever touches our thread-synchronous status, so we don't | ||
153 | * have to worry about atomic accesses. | ||
154 | */ | ||
155 | #define TS_USEDFPM 0x0001 /* FPU/Media was used by this task this quantum (SMP) */ | ||
156 | |||
157 | #endif /* __KERNEL__ */ | ||
158 | |||
159 | #endif /* _ASM_THREAD_INFO_H */ | ||
diff --git a/include/asm-frv/timer-regs.h b/include/asm-frv/timer-regs.h new file mode 100644 index 000000000000..6c5a871ce5e9 --- /dev/null +++ b/include/asm-frv/timer-regs.h | |||
@@ -0,0 +1,106 @@ | |||
1 | /* timer-regs.h: hardware timer register definitions | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_TIMER_REGS_H | ||
13 | #define _ASM_TIMER_REGS_H | ||
14 | |||
15 | #include <asm/sections.h> | ||
16 | |||
17 | extern unsigned long __nongprelbss __clkin_clock_speed_HZ; | ||
18 | extern unsigned long __nongprelbss __ext_bus_clock_speed_HZ; | ||
19 | extern unsigned long __nongprelbss __res_bus_clock_speed_HZ; | ||
20 | extern unsigned long __nongprelbss __sdram_clock_speed_HZ; | ||
21 | extern unsigned long __nongprelbss __core_bus_clock_speed_HZ; | ||
22 | extern unsigned long __nongprelbss __core_clock_speed_HZ; | ||
23 | extern unsigned long __nongprelbss __dsu_clock_speed_HZ; | ||
24 | extern unsigned long __nongprelbss __serial_clock_speed_HZ; | ||
25 | |||
26 | #define __get_CLKC() ({ *(volatile unsigned long *)(0xfeff9a00); }) | ||
27 | |||
28 | static inline void __set_CLKC(unsigned long v) | ||
29 | { | ||
30 | int tmp; | ||
31 | |||
32 | asm volatile(" st%I0.p %2,%M0 \n" | ||
33 | " setlos %3,%1 \n" | ||
34 | " membar \n" | ||
35 | "0: \n" | ||
36 | " subicc %1,#1,%1,icc0 \n" | ||
37 | " bnc icc0,#1,0b \n" | ||
38 | : "=m"(*(volatile unsigned long *) 0xfeff9a00), "=r"(tmp) | ||
39 | : "r"(v), "i"(256) | ||
40 | : "icc0"); | ||
41 | } | ||
42 | |||
43 | #define __get_TCTR() ({ *(volatile unsigned long *)(0xfeff9418); }) | ||
44 | #define __get_TPRV() ({ *(volatile unsigned long *)(0xfeff9420); }) | ||
45 | #define __get_TPRCKSL() ({ *(volatile unsigned long *)(0xfeff9428); }) | ||
46 | #define __get_TCSR(T) ({ *(volatile unsigned long *)(0xfeff9400 + 8 * (T)); }) | ||
47 | #define __get_TxCKSL(T) ({ *(volatile unsigned long *)(0xfeff9430 + 8 * (T)); }) | ||
48 | |||
49 | #define __get_TCSR_DATA(T) ({ __get_TCSR(T) >> 24; }) | ||
50 | |||
51 | #define __set_TCTR(V) do { *(volatile unsigned long *)(0xfeff9418) = (V); mb(); } while(0) | ||
52 | #define __set_TPRV(V) do { *(volatile unsigned long *)(0xfeff9420) = (V) << 24; mb(); } while(0) | ||
53 | #define __set_TPRCKSL(V) do { *(volatile unsigned long *)(0xfeff9428) = (V); mb(); } while(0) | ||
54 | #define __set_TCSR(T,V) \ | ||
55 | do { *(volatile unsigned long *)(0xfeff9400 + 8 * (T)) = (V); mb(); } while(0) | ||
56 | |||
57 | #define __set_TxCKSL(T,V) \ | ||
58 | do { *(volatile unsigned long *)(0xfeff9430 + 8 * (T)) = (V); mb(); } while(0) | ||
59 | |||
60 | #define __set_TCSR_DATA(T,V) __set_TCSR(T, (V) << 24) | ||
61 | #define __set_TxCKSL_DATA(T,V) __set_TxCKSL(T, TxCKSL_EIGHT | __TxCKSL_SELECT((V))) | ||
62 | |||
63 | /* clock control register */ | ||
64 | #define CLKC_CMODE 0x0f000000 | ||
65 | #define CLKC_SLPL 0x000f0000 | ||
66 | #define CLKC_P0 0x00000100 | ||
67 | #define CLKC_CM 0x00000003 | ||
68 | |||
69 | #define CLKC_CMODE_s 24 | ||
70 | |||
71 | /* timer control register - non-readback mode */ | ||
72 | #define TCTR_MODE_0 0x00000000 | ||
73 | #define TCTR_MODE_2 0x04000000 | ||
74 | #define TCTR_MODE_4 0x08000000 | ||
75 | #define TCTR_MODE_5 0x0a000000 | ||
76 | #define TCTR_RL_LATCH 0x00000000 | ||
77 | #define TCTR_RL_RW_LOW8 0x10000000 | ||
78 | #define TCTR_RL_RW_HIGH8 0x20000000 | ||
79 | #define TCTR_RL_RW_LH8 0x30000000 | ||
80 | #define TCTR_SC_CTR0 0x00000000 | ||
81 | #define TCTR_SC_CTR1 0x40000000 | ||
82 | #define TCTR_SC_CTR2 0x80000000 | ||
83 | |||
84 | /* timer control register - readback mode */ | ||
85 | #define TCTR_CNT0 0x02000000 | ||
86 | #define TCTR_CNT1 0x04000000 | ||
87 | #define TCTR_CNT2 0x08000000 | ||
88 | #define TCTR_NSTATUS 0x10000000 | ||
89 | #define TCTR_NCOUNT 0x20000000 | ||
90 | #define TCTR_SC_READBACK 0xc0000000 | ||
91 | |||
92 | /* timer control status registers - non-readback mode */ | ||
93 | #define TCSRx_DATA 0xff000000 | ||
94 | |||
95 | /* timer control status registers - readback mode */ | ||
96 | #define TCSRx_OUTPUT 0x80000000 | ||
97 | #define TCSRx_NULLCOUNT 0x40000000 | ||
98 | #define TCSRx_RL 0x30000000 | ||
99 | #define TCSRx_MODE 0x07000000 | ||
100 | |||
101 | /* timer clock select registers */ | ||
102 | #define TxCKSL_SELECT 0x0f000000 | ||
103 | #define __TxCKSL_SELECT(X) ((X) << 24) | ||
104 | #define TxCKSL_EIGHT 0xf0000000 | ||
105 | |||
106 | #endif /* _ASM_TIMER_REGS_H */ | ||
diff --git a/include/asm-frv/timex.h b/include/asm-frv/timex.h new file mode 100644 index 000000000000..2aa562fa067b --- /dev/null +++ b/include/asm-frv/timex.h | |||
@@ -0,0 +1,25 @@ | |||
1 | /* timex.h: FR-V architecture timex specifications | ||
2 | */ | ||
3 | #ifndef _ASM_TIMEX_H | ||
4 | #define _ASM_TIMEX_H | ||
5 | |||
6 | #define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ | ||
7 | #define CLOCK_TICK_FACTOR 20 /* Factor of both 1000000 and CLOCK_TICK_RATE */ | ||
8 | |||
9 | #define FINETUNE \ | ||
10 | ((((((long)LATCH * HZ - CLOCK_TICK_RATE) << SHIFT_HZ) * \ | ||
11 | (1000000/CLOCK_TICK_FACTOR) / (CLOCK_TICK_RATE/CLOCK_TICK_FACTOR)) \ | ||
12 | << (SHIFT_SCALE-SHIFT_HZ)) / HZ) | ||
13 | |||
14 | typedef unsigned long cycles_t; | ||
15 | |||
16 | static inline cycles_t get_cycles(void) | ||
17 | { | ||
18 | return 0; | ||
19 | } | ||
20 | |||
21 | #define vxtime_lock() do {} while (0) | ||
22 | #define vxtime_unlock() do {} while (0) | ||
23 | |||
24 | #endif | ||
25 | |||
diff --git a/include/asm-frv/tlb.h b/include/asm-frv/tlb.h new file mode 100644 index 000000000000..f94fe5cb9b3a --- /dev/null +++ b/include/asm-frv/tlb.h | |||
@@ -0,0 +1,23 @@ | |||
1 | #ifndef _ASM_TLB_H | ||
2 | #define _ASM_TLB_H | ||
3 | |||
4 | #include <asm/tlbflush.h> | ||
5 | |||
6 | #define check_pgt_cache() do {} while(0) | ||
7 | |||
8 | /* | ||
9 | * we don't need any special per-pte or per-vma handling... | ||
10 | */ | ||
11 | #define tlb_start_vma(tlb, vma) do { } while (0) | ||
12 | #define tlb_end_vma(tlb, vma) do { } while (0) | ||
13 | #define __tlb_remove_tlb_entry(tlb, ptep, address) do { } while (0) | ||
14 | |||
15 | /* | ||
16 | * .. because we flush the whole mm when it fills up | ||
17 | */ | ||
18 | #define tlb_flush(tlb) flush_tlb_mm((tlb)->mm) | ||
19 | |||
20 | #include <asm-generic/tlb.h> | ||
21 | |||
22 | #endif /* _ASM_TLB_H */ | ||
23 | |||
diff --git a/include/asm-frv/tlbflush.h b/include/asm-frv/tlbflush.h new file mode 100644 index 000000000000..bc3462625084 --- /dev/null +++ b/include/asm-frv/tlbflush.h | |||
@@ -0,0 +1,77 @@ | |||
1 | /* tlbflush.h: TLB flushing functions | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_TLBFLUSH_H | ||
13 | #define _ASM_TLBFLUSH_H | ||
14 | |||
15 | #include <linux/config.h> | ||
16 | #include <linux/mm.h> | ||
17 | #include <asm/processor.h> | ||
18 | |||
19 | #ifdef CONFIG_MMU | ||
20 | |||
21 | #ifndef __ASSEMBLY__ | ||
22 | extern void asmlinkage __flush_tlb_all(void); | ||
23 | extern void asmlinkage __flush_tlb_mm(unsigned long contextid); | ||
24 | extern void asmlinkage __flush_tlb_page(unsigned long contextid, unsigned long start); | ||
25 | extern void asmlinkage __flush_tlb_range(unsigned long contextid, | ||
26 | unsigned long start, unsigned long end); | ||
27 | #endif /* !__ASSEMBLY__ */ | ||
28 | |||
29 | #define flush_tlb_all() \ | ||
30 | do { \ | ||
31 | preempt_disable(); \ | ||
32 | __flush_tlb_all(); \ | ||
33 | preempt_enable(); \ | ||
34 | } while(0) | ||
35 | |||
36 | #define flush_tlb_mm(mm) \ | ||
37 | do { \ | ||
38 | preempt_disable(); \ | ||
39 | __flush_tlb_mm((mm)->context.id); \ | ||
40 | preempt_enable(); \ | ||
41 | } while(0) | ||
42 | |||
43 | #define flush_tlb_range(vma,start,end) \ | ||
44 | do { \ | ||
45 | preempt_disable(); \ | ||
46 | __flush_tlb_range((vma)->vm_mm->context.id, start, end); \ | ||
47 | preempt_enable(); \ | ||
48 | } while(0) | ||
49 | |||
50 | #define flush_tlb_page(vma,addr) \ | ||
51 | do { \ | ||
52 | preempt_disable(); \ | ||
53 | __flush_tlb_page((vma)->vm_mm->context.id, addr); \ | ||
54 | preempt_enable(); \ | ||
55 | } while(0) | ||
56 | |||
57 | |||
58 | #define __flush_tlb_global() flush_tlb_all() | ||
59 | #define flush_tlb() flush_tlb_all() | ||
60 | #define flush_tlb_kernel_range(start, end) flush_tlb_all() | ||
61 | #define flush_tlb_pgtables(mm,start,end) \ | ||
62 | asm volatile("movgs %0,scr0 ! movgs %0,scr1" :: "r"(ULONG_MAX) : "memory"); | ||
63 | |||
64 | #else | ||
65 | |||
66 | #define flush_tlb() BUG() | ||
67 | #define flush_tlb_all() BUG() | ||
68 | #define flush_tlb_mm(mm) BUG() | ||
69 | #define flush_tlb_page(vma,addr) BUG() | ||
70 | #define flush_tlb_range(mm,start,end) BUG() | ||
71 | #define flush_tlb_pgtables(mm,start,end) BUG() | ||
72 | #define flush_tlb_kernel_range(start, end) BUG() | ||
73 | |||
74 | #endif | ||
75 | |||
76 | |||
77 | #endif /* _ASM_TLBFLUSH_H */ | ||
diff --git a/include/asm-frv/topology.h b/include/asm-frv/topology.h new file mode 100644 index 000000000000..abe7298742ac --- /dev/null +++ b/include/asm-frv/topology.h | |||
@@ -0,0 +1,14 @@ | |||
1 | #ifndef _ASM_TOPOLOGY_H | ||
2 | #define _ASM_TOPOLOGY_H | ||
3 | |||
4 | #ifdef CONFIG_NUMA | ||
5 | |||
6 | #error NUMA not supported yet | ||
7 | |||
8 | #else /* !CONFIG_NUMA */ | ||
9 | |||
10 | #include <asm-generic/topology.h> | ||
11 | |||
12 | #endif /* CONFIG_NUMA */ | ||
13 | |||
14 | #endif /* _ASM_TOPOLOGY_H */ | ||
diff --git a/include/asm-frv/types.h b/include/asm-frv/types.h new file mode 100644 index 000000000000..1a5b6546bb41 --- /dev/null +++ b/include/asm-frv/types.h | |||
@@ -0,0 +1,74 @@ | |||
1 | /* types.h: FRV types | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_TYPES_H | ||
13 | #define _ASM_TYPES_H | ||
14 | |||
15 | #ifndef __ASSEMBLY__ | ||
16 | |||
17 | typedef unsigned short umode_t; | ||
18 | |||
19 | /* | ||
20 | * __xx is ok: it doesn't pollute the POSIX namespace. Use these in the | ||
21 | * header files exported to user space | ||
22 | */ | ||
23 | |||
24 | typedef __signed__ char __s8; | ||
25 | typedef unsigned char __u8; | ||
26 | |||
27 | typedef __signed__ short __s16; | ||
28 | typedef unsigned short __u16; | ||
29 | |||
30 | typedef __signed__ int __s32; | ||
31 | typedef unsigned int __u32; | ||
32 | |||
33 | #if defined(__GNUC__) && !defined(__STRICT_ANSI__) | ||
34 | typedef __signed__ long long __s64; | ||
35 | typedef unsigned long long __u64; | ||
36 | #endif | ||
37 | |||
38 | #endif /* __ASSEMBLY__ */ | ||
39 | |||
40 | /* | ||
41 | * These aren't exported outside the kernel to avoid name space clashes | ||
42 | */ | ||
43 | #ifdef __KERNEL__ | ||
44 | |||
45 | #define BITS_PER_LONG 32 | ||
46 | |||
47 | #ifndef __ASSEMBLY__ | ||
48 | |||
49 | #include <linux/config.h> | ||
50 | |||
51 | typedef signed char s8; | ||
52 | typedef unsigned char u8; | ||
53 | |||
54 | typedef signed short s16; | ||
55 | typedef unsigned short u16; | ||
56 | |||
57 | typedef signed int s32; | ||
58 | typedef unsigned int u32; | ||
59 | |||
60 | typedef signed long long s64; | ||
61 | typedef unsigned long long u64; | ||
62 | typedef u64 u_quad_t; | ||
63 | |||
64 | /* Dma addresses are 32-bits wide. */ | ||
65 | |||
66 | typedef u32 dma_addr_t; | ||
67 | |||
68 | typedef unsigned short kmem_bufctl_t; | ||
69 | |||
70 | #endif /* __ASSEMBLY__ */ | ||
71 | |||
72 | #endif /* __KERNEL__ */ | ||
73 | |||
74 | #endif /* _ASM_TYPES_H */ | ||
diff --git a/include/asm-frv/uaccess.h b/include/asm-frv/uaccess.h new file mode 100644 index 000000000000..32dc52e883e5 --- /dev/null +++ b/include/asm-frv/uaccess.h | |||
@@ -0,0 +1,318 @@ | |||
1 | /* uaccess.h: userspace accessor functions | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_UACCESS_H | ||
13 | #define _ASM_UACCESS_H | ||
14 | |||
15 | /* | ||
16 | * User space memory access functions | ||
17 | */ | ||
18 | #include <linux/sched.h> | ||
19 | #include <linux/mm.h> | ||
20 | #include <asm/segment.h> | ||
21 | #include <asm/sections.h> | ||
22 | |||
23 | #define HAVE_ARCH_UNMAPPED_AREA /* we decide where to put mmaps */ | ||
24 | |||
25 | #define __ptr(x) ((unsigned long *)(x)) | ||
26 | |||
27 | #define VERIFY_READ 0 | ||
28 | #define VERIFY_WRITE 1 | ||
29 | |||
30 | #define __addr_ok(addr) ((unsigned long)(addr) < get_addr_limit()) | ||
31 | |||
32 | /* | ||
33 | * check that a range of addresses falls within the current address limit | ||
34 | */ | ||
35 | static inline int ___range_ok(unsigned long addr, unsigned long size) | ||
36 | { | ||
37 | #ifdef CONFIG_MMU | ||
38 | int flag = -EFAULT, tmp; | ||
39 | |||
40 | asm volatile ( | ||
41 | " addcc %3,%2,%1,icc0 \n" /* set C-flag if addr+size>4GB */ | ||
42 | " subcc.p %1,%4,gr0,icc1 \n" /* jump if addr+size>limit */ | ||
43 | " bc icc0,#0,0f \n" | ||
44 | " bhi icc1,#0,0f \n" | ||
45 | " setlos #0,%0 \n" /* mark okay */ | ||
46 | "0: \n" | ||
47 | : "=r"(flag), "=&r"(tmp) | ||
48 | : "r"(addr), "r"(size), "r"(get_addr_limit()), "0"(flag) | ||
49 | ); | ||
50 | |||
51 | return flag; | ||
52 | |||
53 | #else | ||
54 | |||
55 | if (addr < memory_start || | ||
56 | addr > memory_end || | ||
57 | size > memory_end - memory_start || | ||
58 | addr + size > memory_end) | ||
59 | return -EFAULT; | ||
60 | |||
61 | return 0; | ||
62 | #endif | ||
63 | } | ||
64 | |||
65 | #define __range_ok(addr,size) ___range_ok((unsigned long) (addr), (unsigned long) (size)) | ||
66 | |||
67 | #define access_ok(type,addr,size) (__range_ok((addr), (size)) == 0) | ||
68 | #define __access_ok(addr,size) (__range_ok((addr), (size)) == 0) | ||
69 | |||
70 | /* this function will go away soon - use access_ok() / __range_ok() instead */ | ||
71 | static inline int __deprecated verify_area(int type, const void * addr, unsigned long size) | ||
72 | { | ||
73 | return __range_ok(addr, size); | ||
74 | } | ||
75 | |||
76 | /* | ||
77 | * The exception table consists of pairs of addresses: the first is the | ||
78 | * address of an instruction that is allowed to fault, and the second is | ||
79 | * the address at which the program should continue. No registers are | ||
80 | * modified, so it is entirely up to the continuation code to figure out | ||
81 | * what to do. | ||
82 | * | ||
83 | * All the routines below use bits of fixup code that are out of line | ||
84 | * with the main instruction path. This means when everything is well, | ||
85 | * we don't even have to jump over them. Further, they do not intrude | ||
86 | * on our cache or tlb entries. | ||
87 | */ | ||
88 | struct exception_table_entry | ||
89 | { | ||
90 | unsigned long insn, fixup; | ||
91 | }; | ||
92 | |||
93 | /* Returns 0 if exception not found and fixup otherwise. */ | ||
94 | extern unsigned long search_exception_table(unsigned long); | ||
95 | |||
96 | |||
97 | /* | ||
98 | * These are the main single-value transfer routines. They automatically | ||
99 | * use the right size if we just have the right pointer type. | ||
100 | */ | ||
101 | #define __put_user(x, ptr) \ | ||
102 | ({ \ | ||
103 | int __pu_err = 0; \ | ||
104 | \ | ||
105 | typeof(*(ptr)) __pu_val = (x); \ | ||
106 | \ | ||
107 | switch (sizeof (*(ptr))) { \ | ||
108 | case 1: \ | ||
109 | __put_user_asm(__pu_err, __pu_val, ptr, "b", "r"); \ | ||
110 | break; \ | ||
111 | case 2: \ | ||
112 | __put_user_asm(__pu_err, __pu_val, ptr, "h", "r"); \ | ||
113 | break; \ | ||
114 | case 4: \ | ||
115 | __put_user_asm(__pu_err, __pu_val, ptr, "", "r"); \ | ||
116 | break; \ | ||
117 | case 8: \ | ||
118 | __put_user_asm(__pu_err, __pu_val, ptr, "d", "e"); \ | ||
119 | break; \ | ||
120 | default: \ | ||
121 | __pu_err = __put_user_bad(); \ | ||
122 | break; \ | ||
123 | } \ | ||
124 | __pu_err; \ | ||
125 | }) | ||
126 | |||
127 | #define put_user(x, ptr) \ | ||
128 | ({ \ | ||
129 | typeof(&*ptr) _p = (ptr); \ | ||
130 | int _e; \ | ||
131 | \ | ||
132 | _e = __range_ok(_p, sizeof(*_p)); \ | ||
133 | if (_e == 0) \ | ||
134 | _e = __put_user((x), _p); \ | ||
135 | _e; \ | ||
136 | }) | ||
137 | |||
138 | extern int __put_user_bad(void); | ||
139 | |||
140 | /* | ||
141 | * Tell gcc we read from memory instead of writing: this is because | ||
142 | * we do not write to any memory gcc knows about, so there are no | ||
143 | * aliasing issues. | ||
144 | */ | ||
145 | |||
146 | #ifdef CONFIG_MMU | ||
147 | |||
148 | #define __put_user_asm(err,x,ptr,dsize,constraint) \ | ||
149 | do { \ | ||
150 | asm volatile("1: st"dsize"%I1 %2,%M1 \n" \ | ||
151 | "2: \n" \ | ||
152 | ".subsection 2 \n" \ | ||
153 | "3: setlos %3,%0 \n" \ | ||
154 | " bra 2b \n" \ | ||
155 | ".previous \n" \ | ||
156 | ".section __ex_table,\"a\" \n" \ | ||
157 | " .balign 8 \n" \ | ||
158 | " .long 1b,3b \n" \ | ||
159 | ".previous" \ | ||
160 | : "=r" (err) \ | ||
161 | : "m" (*__ptr(ptr)), constraint (x), "i"(-EFAULT), "0"(err) \ | ||
162 | : "memory"); \ | ||
163 | } while (0) | ||
164 | |||
165 | #else | ||
166 | |||
167 | #define __put_user_asm(err,x,ptr,bwl,con) \ | ||
168 | do { \ | ||
169 | asm(" st"bwl"%I0 %1,%M0 \n" \ | ||
170 | " membar \n" \ | ||
171 | : \ | ||
172 | : "m" (*__ptr(ptr)), con (x) \ | ||
173 | : "memory"); \ | ||
174 | } while (0) | ||
175 | |||
176 | #endif | ||
177 | |||
178 | /*****************************************************************************/ | ||
179 | /* | ||
180 | * | ||
181 | */ | ||
182 | #define __get_user(x, ptr) \ | ||
183 | ({ \ | ||
184 | typeof(*(ptr)) __gu_val = 0; \ | ||
185 | int __gu_err = 0; \ | ||
186 | \ | ||
187 | switch (sizeof(*(ptr))) { \ | ||
188 | case 1: \ | ||
189 | __get_user_asm(__gu_err, __gu_val, ptr, "ub", "=r"); \ | ||
190 | break; \ | ||
191 | case 2: \ | ||
192 | __get_user_asm(__gu_err, __gu_val, ptr, "uh", "=r"); \ | ||
193 | break; \ | ||
194 | case 4: \ | ||
195 | __get_user_asm(__gu_err, __gu_val, ptr, "", "=r"); \ | ||
196 | break; \ | ||
197 | case 8: \ | ||
198 | __get_user_asm(__gu_err, __gu_val, ptr, "d", "=e"); \ | ||
199 | break; \ | ||
200 | default: \ | ||
201 | __gu_err = __get_user_bad(); \ | ||
202 | break; \ | ||
203 | } \ | ||
204 | (x) = __gu_val; \ | ||
205 | __gu_err; \ | ||
206 | }) | ||
207 | |||
208 | #define get_user(x, ptr) \ | ||
209 | ({ \ | ||
210 | typeof(&*ptr) _p = (ptr); \ | ||
211 | int _e; \ | ||
212 | \ | ||
213 | _e = __range_ok(_p, sizeof(*_p)); \ | ||
214 | if (likely(_e == 0)) \ | ||
215 | _e = __get_user((x), _p); \ | ||
216 | else \ | ||
217 | (x) = (typeof(x)) 0; \ | ||
218 | _e; \ | ||
219 | }) | ||
220 | |||
221 | extern int __get_user_bad(void); | ||
222 | |||
223 | #ifdef CONFIG_MMU | ||
224 | |||
225 | #define __get_user_asm(err,x,ptr,dtype,constraint) \ | ||
226 | do { \ | ||
227 | asm("1: ld"dtype"%I2 %M2,%1 \n" \ | ||
228 | "2: \n" \ | ||
229 | ".subsection 2 \n" \ | ||
230 | "3: setlos %3,%0 \n" \ | ||
231 | " setlos #0,%1 \n" \ | ||
232 | " bra 2b \n" \ | ||
233 | ".previous \n" \ | ||
234 | ".section __ex_table,\"a\" \n" \ | ||
235 | " .balign 8 \n" \ | ||
236 | " .long 1b,3b \n" \ | ||
237 | ".previous" \ | ||
238 | : "=r" (err), constraint (x) \ | ||
239 | : "m" (*__ptr(ptr)), "i"(-EFAULT), "0"(err) \ | ||
240 | ); \ | ||
241 | } while(0) | ||
242 | |||
243 | #else | ||
244 | |||
245 | #define __get_user_asm(err,x,ptr,bwl,con) \ | ||
246 | asm(" ld"bwl"%I1 %M1,%0 \n" \ | ||
247 | " membar \n" \ | ||
248 | : con(x) \ | ||
249 | : "m" (*__ptr(ptr))) | ||
250 | |||
251 | #endif | ||
252 | |||
253 | /*****************************************************************************/ | ||
254 | /* | ||
255 | * | ||
256 | */ | ||
257 | #ifdef CONFIG_MMU | ||
258 | extern long __memset_user(void *dst, unsigned long count); | ||
259 | extern long __memcpy_user(void *dst, const void *src, unsigned long count); | ||
260 | |||
261 | #define clear_user(dst,count) __memset_user((dst), (count)) | ||
262 | #define __copy_from_user_inatomic(to, from, n) __memcpy_user((to), (from), (n)) | ||
263 | #define __copy_to_user_inatomic(to, from, n) __memcpy_user((to), (from), (n)) | ||
264 | |||
265 | #else | ||
266 | |||
267 | #define clear_user(dst,count) (memset((dst), 0, (count)), 0) | ||
268 | #define __copy_from_user_inatomic(to, from, n) (memcpy((to), (from), (n)), 0) | ||
269 | #define __copy_to_user_inatomic(to, from, n) (memcpy((to), (from), (n)), 0) | ||
270 | |||
271 | #endif | ||
272 | |||
273 | static inline unsigned long __must_check | ||
274 | __copy_to_user(void __user *to, const void *from, unsigned long n) | ||
275 | { | ||
276 | might_sleep(); | ||
277 | return __copy_to_user_inatomic(to, from, n); | ||
278 | } | ||
279 | |||
280 | static inline unsigned long | ||
281 | __copy_from_user(void *to, const void __user *from, unsigned long n) | ||
282 | { | ||
283 | might_sleep(); | ||
284 | return __copy_from_user_inatomic(to, from, n); | ||
285 | } | ||
286 | |||
287 | static inline long copy_from_user(void *to, const void *from, unsigned long n) | ||
288 | { | ||
289 | unsigned long ret = n; | ||
290 | |||
291 | if (likely(__access_ok(from, n))) | ||
292 | ret = __copy_from_user(to, from, n); | ||
293 | |||
294 | if (unlikely(ret != 0)) | ||
295 | memset(to + (n - ret), 0, ret); | ||
296 | |||
297 | return ret; | ||
298 | } | ||
299 | |||
300 | static inline long copy_to_user(void *to, const void *from, unsigned long n) | ||
301 | { | ||
302 | return likely(__access_ok(to, n)) ? __copy_to_user(to, from, n) : n; | ||
303 | } | ||
304 | |||
305 | #define copy_to_user_ret(to,from,n,retval) ({ if (copy_to_user(to,from,n)) return retval; }) | ||
306 | #define copy_from_user_ret(to,from,n,retval) ({ if (copy_from_user(to,from,n)) return retval; }) | ||
307 | |||
308 | extern long strncpy_from_user(char *dst, const char *src, long count); | ||
309 | extern long strnlen_user(const char *src, long count); | ||
310 | |||
311 | #define strlen_user(str) strnlen_user(str, 32767) | ||
312 | |||
313 | extern unsigned long search_exception_table(unsigned long addr); | ||
314 | |||
315 | #define copy_to_user_page(vma, page, vaddr, dst, src, len) memcpy(dst, src, len) | ||
316 | #define copy_from_user_page(vma, page, vaddr, dst, src, len) memcpy(dst, src, len) | ||
317 | |||
318 | #endif /* _ASM_UACCESS_H */ | ||
diff --git a/include/asm-frv/ucontext.h b/include/asm-frv/ucontext.h new file mode 100644 index 000000000000..8d8c0c948007 --- /dev/null +++ b/include/asm-frv/ucontext.h | |||
@@ -0,0 +1,12 @@ | |||
1 | #ifndef _ASM_UCONTEXT_H | ||
2 | #define _ASM_UCONTEXT_H | ||
3 | |||
4 | struct ucontext { | ||
5 | unsigned long uc_flags; | ||
6 | struct ucontext *uc_link; | ||
7 | stack_t uc_stack; | ||
8 | struct sigcontext uc_mcontext; | ||
9 | sigset_t uc_sigmask; /* mask last for extensibility */ | ||
10 | }; | ||
11 | |||
12 | #endif | ||
diff --git a/include/asm-frv/unaligned.h b/include/asm-frv/unaligned.h new file mode 100644 index 000000000000..a0d199bf01d9 --- /dev/null +++ b/include/asm-frv/unaligned.h | |||
@@ -0,0 +1,203 @@ | |||
1 | /* unaligned.h: unaligned access handler | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_UNALIGNED_H | ||
13 | #define _ASM_UNALIGNED_H | ||
14 | |||
15 | #include <linux/config.h> | ||
16 | |||
17 | /* | ||
18 | * Unaligned accesses on uClinux can't be performed in a fault handler - the | ||
19 | * CPU detects them as imprecise exceptions making this impossible. | ||
20 | * | ||
21 | * With the FR451, however, they are precise, and so we used to fix them up in | ||
22 | * the memory access fault handler. However, instruction bundling make this | ||
23 | * impractical. So, now we fall back to using memcpy. | ||
24 | */ | ||
25 | #ifdef CONFIG_MMU | ||
26 | |||
27 | /* | ||
28 | * The asm statement in the macros below is a way to get GCC to copy a | ||
29 | * value from one variable to another without having any clue it's | ||
30 | * actually doing so, so that it won't have any idea that the values | ||
31 | * in the two variables are related. | ||
32 | */ | ||
33 | |||
34 | #define get_unaligned(ptr) ({ \ | ||
35 | typeof((*(ptr))) __x; \ | ||
36 | void *__ptrcopy; \ | ||
37 | asm("" : "=r" (__ptrcopy) : "0" (ptr)); \ | ||
38 | memcpy(&__x, __ptrcopy, sizeof(*(ptr))); \ | ||
39 | __x; \ | ||
40 | }) | ||
41 | |||
42 | #define put_unaligned(val, ptr) ({ \ | ||
43 | typeof((*(ptr))) __x = (val); \ | ||
44 | void *__ptrcopy; \ | ||
45 | asm("" : "=r" (__ptrcopy) : "0" (ptr)); \ | ||
46 | memcpy(__ptrcopy, &__x, sizeof(*(ptr))); \ | ||
47 | }) | ||
48 | |||
49 | extern int handle_misalignment(unsigned long esr0, unsigned long ear0, unsigned long epcr0); | ||
50 | |||
51 | #else | ||
52 | |||
53 | #define get_unaligned(ptr) \ | ||
54 | ({ \ | ||
55 | typeof(*(ptr)) x; \ | ||
56 | const char *__p = (const char *) (ptr); \ | ||
57 | \ | ||
58 | switch (sizeof(x)) { \ | ||
59 | case 1: \ | ||
60 | x = *(ptr); \ | ||
61 | break; \ | ||
62 | case 2: \ | ||
63 | { \ | ||
64 | uint8_t a; \ | ||
65 | asm(" ldub%I2 %M2,%0 \n" \ | ||
66 | " ldub%I3.p %M3,%1 \n" \ | ||
67 | " slli %0,#8,%0 \n" \ | ||
68 | " or %0,%1,%0 \n" \ | ||
69 | : "=&r"(x), "=&r"(a) \ | ||
70 | : "m"(__p[0]), "m"(__p[1]) \ | ||
71 | ); \ | ||
72 | break; \ | ||
73 | } \ | ||
74 | \ | ||
75 | case 4: \ | ||
76 | { \ | ||
77 | uint8_t a; \ | ||
78 | asm(" ldub%I2 %M2,%0 \n" \ | ||
79 | " ldub%I3.p %M3,%1 \n" \ | ||
80 | " slli %0,#8,%0 \n" \ | ||
81 | " or %0,%1,%0 \n" \ | ||
82 | " ldub%I4.p %M4,%1 \n" \ | ||
83 | " slli %0,#8,%0 \n" \ | ||
84 | " or %0,%1,%0 \n" \ | ||
85 | " ldub%I5.p %M5,%1 \n" \ | ||
86 | " slli %0,#8,%0 \n" \ | ||
87 | " or %0,%1,%0 \n" \ | ||
88 | : "=&r"(x), "=&r"(a) \ | ||
89 | : "m"(__p[0]), "m"(__p[1]), "m"(__p[2]), "m"(__p[3]) \ | ||
90 | ); \ | ||
91 | break; \ | ||
92 | } \ | ||
93 | \ | ||
94 | case 8: \ | ||
95 | { \ | ||
96 | union { uint64_t x; u32 y[2]; } z; \ | ||
97 | uint8_t a; \ | ||
98 | asm(" ldub%I3 %M3,%0 \n" \ | ||
99 | " ldub%I4.p %M4,%2 \n" \ | ||
100 | " slli %0,#8,%0 \n" \ | ||
101 | " or %0,%2,%0 \n" \ | ||
102 | " ldub%I5.p %M5,%2 \n" \ | ||
103 | " slli %0,#8,%0 \n" \ | ||
104 | " or %0,%2,%0 \n" \ | ||
105 | " ldub%I6.p %M6,%2 \n" \ | ||
106 | " slli %0,#8,%0 \n" \ | ||
107 | " or %0,%2,%0 \n" \ | ||
108 | " ldub%I7 %M7,%1 \n" \ | ||
109 | " ldub%I8.p %M8,%2 \n" \ | ||
110 | " slli %1,#8,%1 \n" \ | ||
111 | " or %1,%2,%1 \n" \ | ||
112 | " ldub%I9.p %M9,%2 \n" \ | ||
113 | " slli %1,#8,%1 \n" \ | ||
114 | " or %1,%2,%1 \n" \ | ||
115 | " ldub%I10.p %M10,%2 \n" \ | ||
116 | " slli %1,#8,%1 \n" \ | ||
117 | " or %1,%2,%1 \n" \ | ||
118 | : "=&r"(z.y[0]), "=&r"(z.y[1]), "=&r"(a) \ | ||
119 | : "m"(__p[0]), "m"(__p[1]), "m"(__p[2]), "m"(__p[3]), \ | ||
120 | "m"(__p[4]), "m"(__p[5]), "m"(__p[6]), "m"(__p[7]) \ | ||
121 | ); \ | ||
122 | x = z.x; \ | ||
123 | break; \ | ||
124 | } \ | ||
125 | \ | ||
126 | default: \ | ||
127 | x = 0; \ | ||
128 | BUG(); \ | ||
129 | break; \ | ||
130 | } \ | ||
131 | \ | ||
132 | x; \ | ||
133 | }) | ||
134 | |||
135 | #define put_unaligned(val, ptr) \ | ||
136 | do { \ | ||
137 | char *__p = (char *) (ptr); \ | ||
138 | int x; \ | ||
139 | \ | ||
140 | switch (sizeof(*ptr)) { \ | ||
141 | case 2: \ | ||
142 | { \ | ||
143 | asm(" stb%I1.p %0,%M1 \n" \ | ||
144 | " srli %0,#8,%0 \n" \ | ||
145 | " stb%I2 %0,%M2 \n" \ | ||
146 | : "=r"(x), "=m"(__p[1]), "=m"(__p[0]) \ | ||
147 | : "0"(val) \ | ||
148 | ); \ | ||
149 | break; \ | ||
150 | } \ | ||
151 | \ | ||
152 | case 4: \ | ||
153 | { \ | ||
154 | asm(" stb%I1.p %0,%M1 \n" \ | ||
155 | " srli %0,#8,%0 \n" \ | ||
156 | " stb%I2.p %0,%M2 \n" \ | ||
157 | " srli %0,#8,%0 \n" \ | ||
158 | " stb%I3.p %0,%M3 \n" \ | ||
159 | " srli %0,#8,%0 \n" \ | ||
160 | " stb%I4 %0,%M4 \n" \ | ||
161 | : "=r"(x), "=m"(__p[3]), "=m"(__p[2]), "=m"(__p[1]), "=m"(__p[0]) \ | ||
162 | : "0"(val) \ | ||
163 | ); \ | ||
164 | break; \ | ||
165 | } \ | ||
166 | \ | ||
167 | case 8: \ | ||
168 | { \ | ||
169 | uint32_t __high, __low; \ | ||
170 | __high = (uint64_t)val >> 32; \ | ||
171 | __low = val & 0xffffffff; \ | ||
172 | asm(" stb%I2.p %0,%M2 \n" \ | ||
173 | " srli %0,#8,%0 \n" \ | ||
174 | " stb%I3.p %0,%M3 \n" \ | ||
175 | " srli %0,#8,%0 \n" \ | ||
176 | " stb%I4.p %0,%M4 \n" \ | ||
177 | " srli %0,#8,%0 \n" \ | ||
178 | " stb%I5.p %0,%M5 \n" \ | ||
179 | " srli %0,#8,%0 \n" \ | ||
180 | " stb%I6.p %1,%M6 \n" \ | ||
181 | " srli %1,#8,%1 \n" \ | ||
182 | " stb%I7.p %1,%M7 \n" \ | ||
183 | " srli %1,#8,%1 \n" \ | ||
184 | " stb%I8.p %1,%M8 \n" \ | ||
185 | " srli %1,#8,%1 \n" \ | ||
186 | " stb%I9 %1,%M9 \n" \ | ||
187 | : "=&r"(__low), "=&r"(__high), "=m"(__p[7]), "=m"(__p[6]), \ | ||
188 | "=m"(__p[5]), "=m"(__p[4]), "=m"(__p[3]), "=m"(__p[2]), \ | ||
189 | "=m"(__p[1]), "=m"(__p[0]) \ | ||
190 | : "0"(__low), "1"(__high) \ | ||
191 | ); \ | ||
192 | break; \ | ||
193 | } \ | ||
194 | \ | ||
195 | default: \ | ||
196 | *(ptr) = (val); \ | ||
197 | break; \ | ||
198 | } \ | ||
199 | } while(0) | ||
200 | |||
201 | #endif | ||
202 | |||
203 | #endif | ||
diff --git a/include/asm-frv/unistd.h b/include/asm-frv/unistd.h new file mode 100644 index 000000000000..5cf989b448d5 --- /dev/null +++ b/include/asm-frv/unistd.h | |||
@@ -0,0 +1,501 @@ | |||
1 | #ifndef _ASM_UNISTD_H_ | ||
2 | #define _ASM_UNISTD_H_ | ||
3 | |||
4 | /* | ||
5 | * This file contains the system call numbers. | ||
6 | */ | ||
7 | |||
8 | #define __NR_restart_syscall 0 | ||
9 | #define __NR_exit 1 | ||
10 | #define __NR_fork 2 | ||
11 | #define __NR_read 3 | ||
12 | #define __NR_write 4 | ||
13 | #define __NR_open 5 | ||
14 | #define __NR_close 6 | ||
15 | #define __NR_waitpid 7 | ||
16 | #define __NR_creat 8 | ||
17 | #define __NR_link 9 | ||
18 | #define __NR_unlink 10 | ||
19 | #define __NR_execve 11 | ||
20 | #define __NR_chdir 12 | ||
21 | #define __NR_time 13 | ||
22 | #define __NR_mknod 14 | ||
23 | #define __NR_chmod 15 | ||
24 | #define __NR_lchown 16 | ||
25 | #define __NR_break 17 | ||
26 | #define __NR_oldstat 18 | ||
27 | #define __NR_lseek 19 | ||
28 | #define __NR_getpid 20 | ||
29 | #define __NR_mount 21 | ||
30 | #define __NR_umount 22 | ||
31 | #define __NR_setuid 23 | ||
32 | #define __NR_getuid 24 | ||
33 | #define __NR_stime 25 | ||
34 | #define __NR_ptrace 26 | ||
35 | #define __NR_alarm 27 | ||
36 | #define __NR_oldfstat 28 | ||
37 | #define __NR_pause 29 | ||
38 | #define __NR_utime 30 | ||
39 | #define __NR_stty 31 | ||
40 | #define __NR_gtty 32 | ||
41 | #define __NR_access 33 | ||
42 | #define __NR_nice 34 | ||
43 | #define __NR_ftime 35 | ||
44 | #define __NR_sync 36 | ||
45 | #define __NR_kill 37 | ||
46 | #define __NR_rename 38 | ||
47 | #define __NR_mkdir 39 | ||
48 | #define __NR_rmdir 40 | ||
49 | #define __NR_dup 41 | ||
50 | #define __NR_pipe 42 | ||
51 | #define __NR_times 43 | ||
52 | #define __NR_prof 44 | ||
53 | #define __NR_brk 45 | ||
54 | #define __NR_setgid 46 | ||
55 | #define __NR_getgid 47 | ||
56 | #define __NR_signal 48 | ||
57 | #define __NR_geteuid 49 | ||
58 | #define __NR_getegid 50 | ||
59 | #define __NR_acct 51 | ||
60 | #define __NR_umount2 52 | ||
61 | #define __NR_lock 53 | ||
62 | #define __NR_ioctl 54 | ||
63 | #define __NR_fcntl 55 | ||
64 | #define __NR_mpx 56 | ||
65 | #define __NR_setpgid 57 | ||
66 | #define __NR_ulimit 58 | ||
67 | // #define __NR_oldolduname /* 59 */ obsolete | ||
68 | #define __NR_umask 60 | ||
69 | #define __NR_chroot 61 | ||
70 | #define __NR_ustat 62 | ||
71 | #define __NR_dup2 63 | ||
72 | #define __NR_getppid 64 | ||
73 | #define __NR_getpgrp 65 | ||
74 | #define __NR_setsid 66 | ||
75 | #define __NR_sigaction 67 | ||
76 | #define __NR_sgetmask 68 | ||
77 | #define __NR_ssetmask 69 | ||
78 | #define __NR_setreuid 70 | ||
79 | #define __NR_setregid 71 | ||
80 | #define __NR_sigsuspend 72 | ||
81 | #define __NR_sigpending 73 | ||
82 | #define __NR_sethostname 74 | ||
83 | #define __NR_setrlimit 75 | ||
84 | #define __NR_getrlimit 76 /* Back compatible 2Gig limited rlimit */ | ||
85 | #define __NR_getrusage 77 | ||
86 | #define __NR_gettimeofday 78 | ||
87 | #define __NR_settimeofday 79 | ||
88 | #define __NR_getgroups 80 | ||
89 | #define __NR_setgroups 81 | ||
90 | #define __NR_select 82 | ||
91 | #define __NR_symlink 83 | ||
92 | #define __NR_oldlstat 84 | ||
93 | #define __NR_readlink 85 | ||
94 | #define __NR_uselib 86 | ||
95 | #define __NR_swapon 87 | ||
96 | #define __NR_reboot 88 | ||
97 | #define __NR_readdir 89 | ||
98 | // #define __NR_mmap 90 /* obsolete - not implemented */ | ||
99 | #define __NR_munmap 91 | ||
100 | #define __NR_truncate 92 | ||
101 | #define __NR_ftruncate 93 | ||
102 | #define __NR_fchmod 94 | ||
103 | #define __NR_fchown 95 | ||
104 | #define __NR_getpriority 96 | ||
105 | #define __NR_setpriority 97 | ||
106 | // #define __NR_profil /* 98 */ obsolete | ||
107 | #define __NR_statfs 99 | ||
108 | #define __NR_fstatfs 100 | ||
109 | // #define __NR_ioperm /* 101 */ not supported | ||
110 | #define __NR_socketcall 102 | ||
111 | #define __NR_syslog 103 | ||
112 | #define __NR_setitimer 104 | ||
113 | #define __NR_getitimer 105 | ||
114 | #define __NR_stat 106 | ||
115 | #define __NR_lstat 107 | ||
116 | #define __NR_fstat 108 | ||
117 | // #define __NR_olduname /* 109 */ obsolete | ||
118 | // #define __NR_iopl /* 110 */ not supported | ||
119 | #define __NR_vhangup 111 | ||
120 | // #define __NR_idle /* 112 */ Obsolete | ||
121 | // #define __NR_vm86old /* 113 */ not supported | ||
122 | #define __NR_wait4 114 | ||
123 | #define __NR_swapoff 115 | ||
124 | #define __NR_sysinfo 116 | ||
125 | #define __NR_ipc 117 | ||
126 | #define __NR_fsync 118 | ||
127 | #define __NR_sigreturn 119 | ||
128 | #define __NR_clone 120 | ||
129 | #define __NR_setdomainname 121 | ||
130 | #define __NR_uname 122 | ||
131 | // #define __NR_modify_ldt /* 123 */ not supported | ||
132 | #define __NR_cacheflush 123 | ||
133 | #define __NR_adjtimex 124 | ||
134 | #define __NR_mprotect 125 | ||
135 | #define __NR_sigprocmask 126 | ||
136 | #define __NR_create_module 127 | ||
137 | #define __NR_init_module 128 | ||
138 | #define __NR_delete_module 129 | ||
139 | #define __NR_get_kernel_syms 130 | ||
140 | #define __NR_quotactl 131 | ||
141 | #define __NR_getpgid 132 | ||
142 | #define __NR_fchdir 133 | ||
143 | #define __NR_bdflush 134 | ||
144 | #define __NR_sysfs 135 | ||
145 | #define __NR_personality 136 | ||
146 | #define __NR_afs_syscall 137 /* Syscall for Andrew File System */ | ||
147 | #define __NR_setfsuid 138 | ||
148 | #define __NR_setfsgid 139 | ||
149 | #define __NR__llseek 140 | ||
150 | #define __NR_getdents 141 | ||
151 | #define __NR__newselect 142 | ||
152 | #define __NR_flock 143 | ||
153 | #define __NR_msync 144 | ||
154 | #define __NR_readv 145 | ||
155 | #define __NR_writev 146 | ||
156 | #define __NR_getsid 147 | ||
157 | #define __NR_fdatasync 148 | ||
158 | #define __NR__sysctl 149 | ||
159 | #define __NR_mlock 150 | ||
160 | #define __NR_munlock 151 | ||
161 | #define __NR_mlockall 152 | ||
162 | #define __NR_munlockall 153 | ||
163 | #define __NR_sched_setparam 154 | ||
164 | #define __NR_sched_getparam 155 | ||
165 | #define __NR_sched_setscheduler 156 | ||
166 | #define __NR_sched_getscheduler 157 | ||
167 | #define __NR_sched_yield 158 | ||
168 | #define __NR_sched_get_priority_max 159 | ||
169 | #define __NR_sched_get_priority_min 160 | ||
170 | #define __NR_sched_rr_get_interval 161 | ||
171 | #define __NR_nanosleep 162 | ||
172 | #define __NR_mremap 163 | ||
173 | #define __NR_setresuid 164 | ||
174 | #define __NR_getresuid 165 | ||
175 | // #define __NR_vm86 /* 166 */ not supported | ||
176 | #define __NR_query_module 167 | ||
177 | #define __NR_poll 168 | ||
178 | #define __NR_nfsservctl 169 | ||
179 | #define __NR_setresgid 170 | ||
180 | #define __NR_getresgid 171 | ||
181 | #define __NR_prctl 172 | ||
182 | #define __NR_rt_sigreturn 173 | ||
183 | #define __NR_rt_sigaction 174 | ||
184 | #define __NR_rt_sigprocmask 175 | ||
185 | #define __NR_rt_sigpending 176 | ||
186 | #define __NR_rt_sigtimedwait 177 | ||
187 | #define __NR_rt_sigqueueinfo 178 | ||
188 | #define __NR_rt_sigsuspend 179 | ||
189 | #define __NR_pread 180 | ||
190 | #define __NR_pwrite 181 | ||
191 | #define __NR_chown 182 | ||
192 | #define __NR_getcwd 183 | ||
193 | #define __NR_capget 184 | ||
194 | #define __NR_capset 185 | ||
195 | #define __NR_sigaltstack 186 | ||
196 | #define __NR_sendfile 187 | ||
197 | #define __NR_getpmsg 188 /* some people actually want streams */ | ||
198 | #define __NR_putpmsg 189 /* some people actually want streams */ | ||
199 | #define __NR_vfork 190 | ||
200 | #define __NR_ugetrlimit 191 /* SuS compliant getrlimit */ | ||
201 | #define __NR_mmap2 192 | ||
202 | #define __NR_truncate64 193 | ||
203 | #define __NR_ftruncate64 194 | ||
204 | #define __NR_stat64 195 | ||
205 | #define __NR_lstat64 196 | ||
206 | #define __NR_fstat64 197 | ||
207 | #define __NR_lchown32 198 | ||
208 | #define __NR_getuid32 199 | ||
209 | #define __NR_getgid32 200 | ||
210 | #define __NR_geteuid32 201 | ||
211 | #define __NR_getegid32 202 | ||
212 | #define __NR_setreuid32 203 | ||
213 | #define __NR_setregid32 204 | ||
214 | #define __NR_getgroups32 205 | ||
215 | #define __NR_setgroups32 206 | ||
216 | #define __NR_fchown32 207 | ||
217 | #define __NR_setresuid32 208 | ||
218 | #define __NR_getresuid32 209 | ||
219 | #define __NR_setresgid32 210 | ||
220 | #define __NR_getresgid32 211 | ||
221 | #define __NR_chown32 212 | ||
222 | #define __NR_setuid32 213 | ||
223 | #define __NR_setgid32 214 | ||
224 | #define __NR_setfsuid32 215 | ||
225 | #define __NR_setfsgid32 216 | ||
226 | #define __NR_pivot_root 217 | ||
227 | #define __NR_mincore 218 | ||
228 | #define __NR_madvise 219 | ||
229 | |||
230 | #define __NR_getdents64 220 | ||
231 | #define __NR_fcntl64 221 | ||
232 | #define __NR_security 223 /* syscall for security modules */ | ||
233 | #define __NR_gettid 224 | ||
234 | #define __NR_readahead 225 | ||
235 | #define __NR_setxattr 226 | ||
236 | #define __NR_lsetxattr 227 | ||
237 | #define __NR_fsetxattr 228 | ||
238 | #define __NR_getxattr 229 | ||
239 | #define __NR_lgetxattr 230 | ||
240 | #define __NR_fgetxattr 231 | ||
241 | #define __NR_listxattr 232 | ||
242 | #define __NR_llistxattr 233 | ||
243 | #define __NR_flistxattr 234 | ||
244 | #define __NR_removexattr 235 | ||
245 | #define __NR_lremovexattr 236 | ||
246 | #define __NR_fremovexattr 237 | ||
247 | #define __NR_tkill 238 | ||
248 | #define __NR_sendfile64 239 | ||
249 | #define __NR_futex 240 | ||
250 | #define __NR_sched_setaffinity 241 | ||
251 | #define __NR_sched_getaffinity 242 | ||
252 | #define __NR_set_thread_area 243 | ||
253 | #define __NR_get_thread_area 244 | ||
254 | #define __NR_io_setup 245 | ||
255 | #define __NR_io_destroy 246 | ||
256 | #define __NR_io_getevents 247 | ||
257 | #define __NR_io_submit 248 | ||
258 | #define __NR_io_cancel 249 | ||
259 | #define __NR_fadvise64 250 | ||
260 | |||
261 | #define __NR_exit_group 252 | ||
262 | #define __NR_lookup_dcookie 253 | ||
263 | #define __NR_epoll_create 254 | ||
264 | #define __NR_epoll_ctl 255 | ||
265 | #define __NR_epoll_wait 256 | ||
266 | #define __NR_remap_file_pages 257 | ||
267 | #define __NR_set_tid_address 258 | ||
268 | #define __NR_timer_create 259 | ||
269 | #define __NR_timer_settime (__NR_timer_create+1) | ||
270 | #define __NR_timer_gettime (__NR_timer_create+2) | ||
271 | #define __NR_timer_getoverrun (__NR_timer_create+3) | ||
272 | #define __NR_timer_delete (__NR_timer_create+4) | ||
273 | #define __NR_clock_settime (__NR_timer_create+5) | ||
274 | #define __NR_clock_gettime (__NR_timer_create+6) | ||
275 | #define __NR_clock_getres (__NR_timer_create+7) | ||
276 | #define __NR_clock_nanosleep (__NR_timer_create+8) | ||
277 | #define __NR_statfs64 268 | ||
278 | #define __NR_fstatfs64 269 | ||
279 | #define __NR_tgkill 270 | ||
280 | #define __NR_utimes 271 | ||
281 | #define __NR_fadvise64_64 272 | ||
282 | #define __NR_vserver 273 | ||
283 | #define __NR_mbind 274 | ||
284 | #define __NR_get_mempolicy 275 | ||
285 | #define __NR_set_mempolicy 276 | ||
286 | #define __NR_mq_open 277 | ||
287 | #define __NR_mq_unlink (__NR_mq_open+1) | ||
288 | #define __NR_mq_timedsend (__NR_mq_open+2) | ||
289 | #define __NR_mq_timedreceive (__NR_mq_open+3) | ||
290 | #define __NR_mq_notify (__NR_mq_open+4) | ||
291 | #define __NR_mq_getsetattr (__NR_mq_open+5) | ||
292 | #define __NR_sys_kexec_load 283 | ||
293 | #define __NR_waitid 284 | ||
294 | /* #define __NR_sys_setaltroot 285 */ | ||
295 | #define __NR_add_key 286 | ||
296 | #define __NR_request_key 287 | ||
297 | #define __NR_keyctl 288 | ||
298 | #define __NR_vperfctr_open 289 | ||
299 | #define __NR_vperfctr_control (__NR_perfctr_info+1) | ||
300 | #define __NR_vperfctr_unlink (__NR_perfctr_info+2) | ||
301 | #define __NR_vperfctr_iresume (__NR_perfctr_info+3) | ||
302 | #define __NR_vperfctr_read (__NR_perfctr_info+4) | ||
303 | |||
304 | #define NR_syscalls 294 | ||
305 | |||
306 | /* | ||
307 | * process the return value of a syscall, consigning it to one of two possible fates | ||
308 | * - user-visible error numbers are in the range -1 - -4095: see <asm-frv/errno.h> | ||
309 | */ | ||
310 | #undef __syscall_return | ||
311 | #define __syscall_return(type, res) \ | ||
312 | do { \ | ||
313 | unsigned long __sr2 = (res); \ | ||
314 | if (__builtin_expect(__sr2 >= (unsigned long)(-4095), 0)) { \ | ||
315 | errno = (-__sr2); \ | ||
316 | __sr2 = ULONG_MAX; \ | ||
317 | } \ | ||
318 | return (type) __sr2; \ | ||
319 | } while (0) | ||
320 | |||
321 | /* XXX - _foo needs to be __foo, while __NR_bar could be _NR_bar. */ | ||
322 | |||
323 | #undef _syscall0 | ||
324 | #define _syscall0(type,name) \ | ||
325 | type name(void) \ | ||
326 | { \ | ||
327 | register unsigned long __scnum __asm__ ("gr7") = (__NR_##name); \ | ||
328 | register unsigned long __sc0 __asm__ ("gr8"); \ | ||
329 | __asm__ __volatile__ ("tira gr0,#0" \ | ||
330 | : "=r" (__sc0) \ | ||
331 | : "r" (__scnum)); \ | ||
332 | __syscall_return(type, __sc0); \ | ||
333 | } | ||
334 | |||
335 | #undef _syscall1 | ||
336 | #define _syscall1(type,name,type1,arg1) \ | ||
337 | type name(type1 arg1) \ | ||
338 | { \ | ||
339 | register unsigned long __scnum __asm__ ("gr7") = (__NR_##name); \ | ||
340 | register unsigned long __sc0 __asm__ ("gr8") = (unsigned long) arg1; \ | ||
341 | __asm__ __volatile__ ("tira gr0,#0" \ | ||
342 | : "+r" (__sc0) \ | ||
343 | : "r" (__scnum)); \ | ||
344 | __syscall_return(type, __sc0); \ | ||
345 | } | ||
346 | |||
347 | #undef _syscall2 | ||
348 | #define _syscall2(type,name,type1,arg1,type2,arg2) \ | ||
349 | type name(type1 arg1,type2 arg2) \ | ||
350 | { \ | ||
351 | register unsigned long __scnum __asm__ ("gr7") = (__NR_##name); \ | ||
352 | register unsigned long __sc0 __asm__ ("gr8") = (unsigned long) arg1; \ | ||
353 | register unsigned long __sc1 __asm__ ("gr9") = (unsigned long) arg2; \ | ||
354 | __asm__ __volatile__ ("tira gr0,#0" \ | ||
355 | : "+r" (__sc0) \ | ||
356 | : "r" (__scnum), "r" (__sc1)); \ | ||
357 | __syscall_return(type, __sc0); \ | ||
358 | } | ||
359 | |||
360 | #undef _syscall3 | ||
361 | #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ | ||
362 | type name(type1 arg1,type2 arg2,type3 arg3) \ | ||
363 | { \ | ||
364 | register unsigned long __scnum __asm__ ("gr7") = (__NR_##name); \ | ||
365 | register unsigned long __sc0 __asm__ ("gr8") = (unsigned long) arg1; \ | ||
366 | register unsigned long __sc1 __asm__ ("gr9") = (unsigned long) arg2; \ | ||
367 | register unsigned long __sc2 __asm__ ("gr10") = (unsigned long) arg3; \ | ||
368 | __asm__ __volatile__ ("tira gr0,#0" \ | ||
369 | : "+r" (__sc0) \ | ||
370 | : "r" (__scnum), "r" (__sc1), "r" (__sc2)); \ | ||
371 | __syscall_return(type, __sc0); \ | ||
372 | } | ||
373 | |||
374 | #undef _syscall4 | ||
375 | #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ | ||
376 | type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \ | ||
377 | { \ | ||
378 | register unsigned long __scnum __asm__ ("gr7") = (__NR_##name); \ | ||
379 | register unsigned long __sc0 __asm__ ("gr8") = (unsigned long) arg1; \ | ||
380 | register unsigned long __sc1 __asm__ ("gr9") = (unsigned long) arg2; \ | ||
381 | register unsigned long __sc2 __asm__ ("gr10") = (unsigned long) arg3; \ | ||
382 | register unsigned long __sc3 __asm__ ("gr11") = (unsigned long) arg4; \ | ||
383 | __asm__ __volatile__ ("tira gr0,#0" \ | ||
384 | : "+r" (__sc0) \ | ||
385 | : "r" (__scnum), "r" (__sc1), "r" (__sc2), "r" (__sc3)); \ | ||
386 | __syscall_return(type, __sc0); \ | ||
387 | } | ||
388 | |||
389 | #undef _syscall5 | ||
390 | #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \ | ||
391 | type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \ | ||
392 | { \ | ||
393 | register unsigned long __scnum __asm__ ("gr7") = (__NR_##name); \ | ||
394 | register unsigned long __sc0 __asm__ ("gr8") = (unsigned long) arg1; \ | ||
395 | register unsigned long __sc1 __asm__ ("gr9") = (unsigned long) arg2; \ | ||
396 | register unsigned long __sc2 __asm__ ("gr10") = (unsigned long) arg3; \ | ||
397 | register unsigned long __sc3 __asm__ ("gr11") = (unsigned long) arg4; \ | ||
398 | register unsigned long __sc4 __asm__ ("gr12") = (unsigned long) arg5; \ | ||
399 | __asm__ __volatile__ ("tira gr0,#0" \ | ||
400 | : "+r" (__sc0) \ | ||
401 | : "r" (__scnum), "r" (__sc1), "r" (__sc2), \ | ||
402 | "r" (__sc3), "r" (__sc4)); \ | ||
403 | __syscall_return(type, __sc0); \ | ||
404 | } | ||
405 | |||
406 | #undef _syscall6 | ||
407 | #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5, type6, arg6) \ | ||
408 | type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6) \ | ||
409 | { \ | ||
410 | register unsigned long __scnum __asm__ ("gr7") = (__NR_##name); \ | ||
411 | register unsigned long __sc0 __asm__ ("gr8") = (unsigned long) arg1; \ | ||
412 | register unsigned long __sc1 __asm__ ("gr9") = (unsigned long) arg2; \ | ||
413 | register unsigned long __sc2 __asm__ ("gr10") = (unsigned long) arg3; \ | ||
414 | register unsigned long __sc3 __asm__ ("gr11") = (unsigned long) arg4; \ | ||
415 | register unsigned long __sc4 __asm__ ("gr12") = (unsigned long) arg5; \ | ||
416 | register unsigned long __sc5 __asm__ ("gr13") = (unsigned long) arg6; \ | ||
417 | __asm__ __volatile__ ("tira gr0,#0" \ | ||
418 | : "+r" (__sc0) \ | ||
419 | : "r" (__scnum), "r" (__sc1), "r" (__sc2), \ | ||
420 | "r" (__sc3), "r" (__sc4), "r" (__sc5)); \ | ||
421 | __syscall_return(type, __sc0); \ | ||
422 | } | ||
423 | |||
424 | |||
425 | #ifdef __KERNEL_SYSCALLS__ | ||
426 | |||
427 | #include <linux/compiler.h> | ||
428 | #include <linux/types.h> | ||
429 | #include <linux/linkage.h> | ||
430 | #include <asm/ptrace.h> | ||
431 | |||
432 | /* | ||
433 | * we need this inline - forking from kernel space will result | ||
434 | * in NO COPY ON WRITE (!!!), until an execve is executed. This | ||
435 | * is no problem, but for the stack. This is handled by not letting | ||
436 | * main() use the stack at all after fork(). Thus, no function | ||
437 | * calls - which means inline code for fork too, as otherwise we | ||
438 | * would use the stack upon exit from 'fork()'. | ||
439 | * | ||
440 | * Actually only pause and fork are needed inline, so that there | ||
441 | * won't be any messing with the stack from main(), but we define | ||
442 | * some others too. | ||
443 | */ | ||
444 | #define __NR__exit __NR_exit | ||
445 | static inline _syscall0(int,pause) | ||
446 | static inline _syscall0(int,sync) | ||
447 | static inline _syscall0(pid_t,setsid) | ||
448 | static inline _syscall3(int,write,int,fd,const char *,buf,off_t,count) | ||
449 | static inline _syscall3(int,read,int,fd,char *,buf,off_t,count) | ||
450 | static inline _syscall3(off_t,lseek,int,fd,off_t,offset,int,count) | ||
451 | static inline _syscall1(int,dup,int,fd) | ||
452 | static inline _syscall3(int,execve,const char *,file,char **,argv,char **,envp) | ||
453 | static inline _syscall3(int,open,const char *,file,int,flag,int,mode) | ||
454 | static inline _syscall1(int,close,int,fd) | ||
455 | static inline _syscall1(int,_exit,int,exitcode) | ||
456 | static inline _syscall3(pid_t,waitpid,pid_t,pid,int *,wait_stat,int,options) | ||
457 | static inline _syscall1(int,delete_module,const char *,name) | ||
458 | |||
459 | static inline pid_t wait(int * wait_stat) | ||
460 | { | ||
461 | return waitpid(-1,wait_stat,0); | ||
462 | } | ||
463 | |||
464 | #endif | ||
465 | |||
466 | #ifdef __KERNEL__ | ||
467 | #define __ARCH_WANT_IPC_PARSE_VERSION | ||
468 | /* #define __ARCH_WANT_OLD_READDIR */ | ||
469 | #define __ARCH_WANT_OLD_STAT | ||
470 | #define __ARCH_WANT_STAT64 | ||
471 | #define __ARCH_WANT_SYS_ALARM | ||
472 | /* #define __ARCH_WANT_SYS_GETHOSTNAME */ | ||
473 | #define __ARCH_WANT_SYS_PAUSE | ||
474 | /* #define __ARCH_WANT_SYS_SGETMASK */ | ||
475 | /* #define __ARCH_WANT_SYS_SIGNAL */ | ||
476 | #define __ARCH_WANT_SYS_TIME | ||
477 | #define __ARCH_WANT_SYS_UTIME | ||
478 | #define __ARCH_WANT_SYS_WAITPID | ||
479 | #define __ARCH_WANT_SYS_SOCKETCALL | ||
480 | #define __ARCH_WANT_SYS_FADVISE64 | ||
481 | #define __ARCH_WANT_SYS_GETPGRP | ||
482 | #define __ARCH_WANT_SYS_LLSEEK | ||
483 | #define __ARCH_WANT_SYS_NICE | ||
484 | /* #define __ARCH_WANT_SYS_OLD_GETRLIMIT */ | ||
485 | #define __ARCH_WANT_SYS_OLDUMOUNT | ||
486 | /* #define __ARCH_WANT_SYS_SIGPENDING */ | ||
487 | #define __ARCH_WANT_SYS_SIGPROCMASK | ||
488 | #define __ARCH_WANT_SYS_RT_SIGACTION | ||
489 | #endif | ||
490 | |||
491 | /* | ||
492 | * "Conditional" syscalls | ||
493 | * | ||
494 | * What we want is __attribute__((weak,alias("sys_ni_syscall"))), | ||
495 | * but it doesn't work on all toolchains, so we just do it by hand | ||
496 | */ | ||
497 | #ifndef cond_syscall | ||
498 | #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") | ||
499 | #endif | ||
500 | |||
501 | #endif /* _ASM_UNISTD_H_ */ | ||
diff --git a/include/asm-frv/user.h b/include/asm-frv/user.h new file mode 100644 index 000000000000..82fa8fab64ae --- /dev/null +++ b/include/asm-frv/user.h | |||
@@ -0,0 +1,80 @@ | |||
1 | /* user.h: FR-V core file format stuff | ||
2 | * | ||
3 | * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | #ifndef _ASM_USER_H | ||
12 | #define _ASM_USER_H | ||
13 | |||
14 | #include <asm/page.h> | ||
15 | #include <asm/registers.h> | ||
16 | |||
17 | /* Core file format: The core file is written in such a way that gdb | ||
18 | * can understand it and provide useful information to the user (under | ||
19 | * linux we use the 'trad-core' bfd). There are quite a number of | ||
20 | * obstacles to being able to view the contents of the floating point | ||
21 | * registers, and until these are solved you will not be able to view | ||
22 | * the contents of them. Actually, you can read in the core file and | ||
23 | * look at the contents of the user struct to find out what the | ||
24 | * floating point registers contain. | ||
25 | * | ||
26 | * The actual file contents are as follows: | ||
27 | * UPAGE: | ||
28 | * 1 page consisting of a user struct that tells gdb what is present | ||
29 | * in the file. Directly after this is a copy of the task_struct, | ||
30 | * which is currently not used by gdb, but it may come in useful at | ||
31 | * some point. All of the registers are stored as part of the | ||
32 | * upage. The upage should always be only one page. | ||
33 | * | ||
34 | * DATA: | ||
35 | * The data area is stored. We use current->end_text to | ||
36 | * current->brk to pick up all of the user variables, plus any | ||
37 | * memory that may have been malloced. No attempt is made to | ||
38 | * determine if a page is demand-zero or if a page is totally | ||
39 | * unused, we just cover the entire range. All of the addresses are | ||
40 | * rounded in such a way that an integral number of pages is | ||
41 | * written. | ||
42 | * | ||
43 | * STACK: | ||
44 | * We need the stack information in order to get a meaningful | ||
45 | * backtrace. We need to write the data from (esp) to | ||
46 | * current->start_stack, so we round each of these off in order to | ||
47 | * be able to write an integer number of pages. The minimum core | ||
48 | * file size is 3 pages, or 12288 bytes. | ||
49 | */ | ||
50 | |||
51 | /* When the kernel dumps core, it starts by dumping the user struct - | ||
52 | * this will be used by gdb to figure out where the data and stack segments | ||
53 | * are within the file, and what virtual addresses to use. | ||
54 | */ | ||
55 | struct user { | ||
56 | /* We start with the registers, to mimic the way that "memory" is returned | ||
57 | * from the ptrace(3,...) function. */ | ||
58 | struct user_context regs; | ||
59 | |||
60 | /* The rest of this junk is to help gdb figure out what goes where */ | ||
61 | unsigned long u_tsize; /* Text segment size (pages). */ | ||
62 | unsigned long u_dsize; /* Data segment size (pages). */ | ||
63 | unsigned long u_ssize; /* Stack segment size (pages). */ | ||
64 | unsigned long start_code; /* Starting virtual address of text. */ | ||
65 | unsigned long start_stack; /* Starting virtual address of stack area. | ||
66 | * This is actually the bottom of the stack, | ||
67 | * the top of the stack is always found in the | ||
68 | * esp register. */ | ||
69 | long int signal; /* Signal that caused the core dump. */ | ||
70 | |||
71 | unsigned long magic; /* To uniquely identify a core file */ | ||
72 | char u_comm[32]; /* User command that was responsible */ | ||
73 | }; | ||
74 | |||
75 | #define NBPG PAGE_SIZE | ||
76 | #define UPAGES 1 | ||
77 | #define HOST_TEXT_START_ADDR (u.start_code) | ||
78 | #define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG) | ||
79 | |||
80 | #endif | ||
diff --git a/include/asm-frv/virtconvert.h b/include/asm-frv/virtconvert.h new file mode 100644 index 000000000000..a29a0aec291f --- /dev/null +++ b/include/asm-frv/virtconvert.h | |||
@@ -0,0 +1,42 @@ | |||
1 | /* virtconvert.h: virtual/physical/page address convertion | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | #ifndef _ASM_VIRTCONVERT_H | ||
12 | #define _ASM_VIRTCONVERT_H | ||
13 | |||
14 | /* | ||
15 | * Macros used for converting between virtual and physical mappings. | ||
16 | */ | ||
17 | |||
18 | #ifdef __KERNEL__ | ||
19 | |||
20 | #include <linux/config.h> | ||
21 | #include <asm/setup.h> | ||
22 | |||
23 | #ifdef CONFIG_MMU | ||
24 | |||
25 | #define phys_to_virt(vaddr) ((void *) ((unsigned long)(vaddr) + PAGE_OFFSET)) | ||
26 | #define virt_to_phys(vaddr) ((unsigned long) (vaddr) - PAGE_OFFSET) | ||
27 | |||
28 | #else | ||
29 | |||
30 | #define phys_to_virt(vaddr) ((void *) (vaddr)) | ||
31 | #define virt_to_phys(vaddr) ((unsigned long) (vaddr)) | ||
32 | |||
33 | #endif | ||
34 | |||
35 | #define virt_to_bus virt_to_phys | ||
36 | #define bus_to_virt phys_to_virt | ||
37 | |||
38 | #define __page_address(page) (PAGE_OFFSET + (((page) - mem_map) << PAGE_SHIFT)) | ||
39 | #define page_to_phys(page) virt_to_phys((void *)__page_address(page)) | ||
40 | |||
41 | #endif | ||
42 | #endif | ||