diff options
Diffstat (limited to 'arch/arm/include')
33 files changed, 358 insertions, 222 deletions
diff --git a/arch/arm/include/asm/Kbuild b/arch/arm/include/asm/Kbuild index 73237bd130a2..6550db3aa5c7 100644 --- a/arch/arm/include/asm/Kbuild +++ b/arch/arm/include/asm/Kbuild | |||
@@ -1,3 +1,3 @@ | |||
1 | include include/asm-generic/Kbuild.asm | 1 | include include/asm-generic/Kbuild.asm |
2 | 2 | ||
3 | unifdef-y += hwcap.h | 3 | header-y += hwcap.h |
diff --git a/arch/arm/include/asm/atomic.h b/arch/arm/include/asm/atomic.h index a0162fa94564..7e79503ab89b 100644 --- a/arch/arm/include/asm/atomic.h +++ b/arch/arm/include/asm/atomic.h | |||
@@ -40,12 +40,12 @@ static inline void atomic_add(int i, atomic_t *v) | |||
40 | int result; | 40 | int result; |
41 | 41 | ||
42 | __asm__ __volatile__("@ atomic_add\n" | 42 | __asm__ __volatile__("@ atomic_add\n" |
43 | "1: ldrex %0, [%2]\n" | 43 | "1: ldrex %0, [%3]\n" |
44 | " add %0, %0, %3\n" | 44 | " add %0, %0, %4\n" |
45 | " strex %1, %0, [%2]\n" | 45 | " strex %1, %0, [%3]\n" |
46 | " teq %1, #0\n" | 46 | " teq %1, #0\n" |
47 | " bne 1b" | 47 | " bne 1b" |
48 | : "=&r" (result), "=&r" (tmp) | 48 | : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) |
49 | : "r" (&v->counter), "Ir" (i) | 49 | : "r" (&v->counter), "Ir" (i) |
50 | : "cc"); | 50 | : "cc"); |
51 | } | 51 | } |
@@ -58,12 +58,12 @@ static inline int atomic_add_return(int i, atomic_t *v) | |||
58 | smp_mb(); | 58 | smp_mb(); |
59 | 59 | ||
60 | __asm__ __volatile__("@ atomic_add_return\n" | 60 | __asm__ __volatile__("@ atomic_add_return\n" |
61 | "1: ldrex %0, [%2]\n" | 61 | "1: ldrex %0, [%3]\n" |
62 | " add %0, %0, %3\n" | 62 | " add %0, %0, %4\n" |
63 | " strex %1, %0, [%2]\n" | 63 | " strex %1, %0, [%3]\n" |
64 | " teq %1, #0\n" | 64 | " teq %1, #0\n" |
65 | " bne 1b" | 65 | " bne 1b" |
66 | : "=&r" (result), "=&r" (tmp) | 66 | : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) |
67 | : "r" (&v->counter), "Ir" (i) | 67 | : "r" (&v->counter), "Ir" (i) |
68 | : "cc"); | 68 | : "cc"); |
69 | 69 | ||
@@ -78,12 +78,12 @@ static inline void atomic_sub(int i, atomic_t *v) | |||
78 | int result; | 78 | int result; |
79 | 79 | ||
80 | __asm__ __volatile__("@ atomic_sub\n" | 80 | __asm__ __volatile__("@ atomic_sub\n" |
81 | "1: ldrex %0, [%2]\n" | 81 | "1: ldrex %0, [%3]\n" |
82 | " sub %0, %0, %3\n" | 82 | " sub %0, %0, %4\n" |
83 | " strex %1, %0, [%2]\n" | 83 | " strex %1, %0, [%3]\n" |
84 | " teq %1, #0\n" | 84 | " teq %1, #0\n" |
85 | " bne 1b" | 85 | " bne 1b" |
86 | : "=&r" (result), "=&r" (tmp) | 86 | : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) |
87 | : "r" (&v->counter), "Ir" (i) | 87 | : "r" (&v->counter), "Ir" (i) |
88 | : "cc"); | 88 | : "cc"); |
89 | } | 89 | } |
@@ -96,12 +96,12 @@ static inline int atomic_sub_return(int i, atomic_t *v) | |||
96 | smp_mb(); | 96 | smp_mb(); |
97 | 97 | ||
98 | __asm__ __volatile__("@ atomic_sub_return\n" | 98 | __asm__ __volatile__("@ atomic_sub_return\n" |
99 | "1: ldrex %0, [%2]\n" | 99 | "1: ldrex %0, [%3]\n" |
100 | " sub %0, %0, %3\n" | 100 | " sub %0, %0, %4\n" |
101 | " strex %1, %0, [%2]\n" | 101 | " strex %1, %0, [%3]\n" |
102 | " teq %1, #0\n" | 102 | " teq %1, #0\n" |
103 | " bne 1b" | 103 | " bne 1b" |
104 | : "=&r" (result), "=&r" (tmp) | 104 | : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) |
105 | : "r" (&v->counter), "Ir" (i) | 105 | : "r" (&v->counter), "Ir" (i) |
106 | : "cc"); | 106 | : "cc"); |
107 | 107 | ||
@@ -118,11 +118,11 @@ static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new) | |||
118 | 118 | ||
119 | do { | 119 | do { |
120 | __asm__ __volatile__("@ atomic_cmpxchg\n" | 120 | __asm__ __volatile__("@ atomic_cmpxchg\n" |
121 | "ldrex %1, [%2]\n" | 121 | "ldrex %1, [%3]\n" |
122 | "mov %0, #0\n" | 122 | "mov %0, #0\n" |
123 | "teq %1, %3\n" | 123 | "teq %1, %4\n" |
124 | "strexeq %0, %4, [%2]\n" | 124 | "strexeq %0, %5, [%3]\n" |
125 | : "=&r" (res), "=&r" (oldval) | 125 | : "=&r" (res), "=&r" (oldval), "+Qo" (ptr->counter) |
126 | : "r" (&ptr->counter), "Ir" (old), "r" (new) | 126 | : "r" (&ptr->counter), "Ir" (old), "r" (new) |
127 | : "cc"); | 127 | : "cc"); |
128 | } while (res); | 128 | } while (res); |
@@ -137,12 +137,12 @@ static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr) | |||
137 | unsigned long tmp, tmp2; | 137 | unsigned long tmp, tmp2; |
138 | 138 | ||
139 | __asm__ __volatile__("@ atomic_clear_mask\n" | 139 | __asm__ __volatile__("@ atomic_clear_mask\n" |
140 | "1: ldrex %0, [%2]\n" | 140 | "1: ldrex %0, [%3]\n" |
141 | " bic %0, %0, %3\n" | 141 | " bic %0, %0, %4\n" |
142 | " strex %1, %0, [%2]\n" | 142 | " strex %1, %0, [%3]\n" |
143 | " teq %1, #0\n" | 143 | " teq %1, #0\n" |
144 | " bne 1b" | 144 | " bne 1b" |
145 | : "=&r" (tmp), "=&r" (tmp2) | 145 | : "=&r" (tmp), "=&r" (tmp2), "+Qo" (*addr) |
146 | : "r" (addr), "Ir" (mask) | 146 | : "r" (addr), "Ir" (mask) |
147 | : "cc"); | 147 | : "cc"); |
148 | } | 148 | } |
@@ -249,7 +249,7 @@ static inline u64 atomic64_read(atomic64_t *v) | |||
249 | __asm__ __volatile__("@ atomic64_read\n" | 249 | __asm__ __volatile__("@ atomic64_read\n" |
250 | " ldrexd %0, %H0, [%1]" | 250 | " ldrexd %0, %H0, [%1]" |
251 | : "=&r" (result) | 251 | : "=&r" (result) |
252 | : "r" (&v->counter) | 252 | : "r" (&v->counter), "Qo" (v->counter) |
253 | ); | 253 | ); |
254 | 254 | ||
255 | return result; | 255 | return result; |
@@ -260,11 +260,11 @@ static inline void atomic64_set(atomic64_t *v, u64 i) | |||
260 | u64 tmp; | 260 | u64 tmp; |
261 | 261 | ||
262 | __asm__ __volatile__("@ atomic64_set\n" | 262 | __asm__ __volatile__("@ atomic64_set\n" |
263 | "1: ldrexd %0, %H0, [%1]\n" | 263 | "1: ldrexd %0, %H0, [%2]\n" |
264 | " strexd %0, %2, %H2, [%1]\n" | 264 | " strexd %0, %3, %H3, [%2]\n" |
265 | " teq %0, #0\n" | 265 | " teq %0, #0\n" |
266 | " bne 1b" | 266 | " bne 1b" |
267 | : "=&r" (tmp) | 267 | : "=&r" (tmp), "=Qo" (v->counter) |
268 | : "r" (&v->counter), "r" (i) | 268 | : "r" (&v->counter), "r" (i) |
269 | : "cc"); | 269 | : "cc"); |
270 | } | 270 | } |
@@ -275,13 +275,13 @@ static inline void atomic64_add(u64 i, atomic64_t *v) | |||
275 | unsigned long tmp; | 275 | unsigned long tmp; |
276 | 276 | ||
277 | __asm__ __volatile__("@ atomic64_add\n" | 277 | __asm__ __volatile__("@ atomic64_add\n" |
278 | "1: ldrexd %0, %H0, [%2]\n" | 278 | "1: ldrexd %0, %H0, [%3]\n" |
279 | " adds %0, %0, %3\n" | 279 | " adds %0, %0, %4\n" |
280 | " adc %H0, %H0, %H3\n" | 280 | " adc %H0, %H0, %H4\n" |
281 | " strexd %1, %0, %H0, [%2]\n" | 281 | " strexd %1, %0, %H0, [%3]\n" |
282 | " teq %1, #0\n" | 282 | " teq %1, #0\n" |
283 | " bne 1b" | 283 | " bne 1b" |
284 | : "=&r" (result), "=&r" (tmp) | 284 | : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) |
285 | : "r" (&v->counter), "r" (i) | 285 | : "r" (&v->counter), "r" (i) |
286 | : "cc"); | 286 | : "cc"); |
287 | } | 287 | } |
@@ -294,13 +294,13 @@ static inline u64 atomic64_add_return(u64 i, atomic64_t *v) | |||
294 | smp_mb(); | 294 | smp_mb(); |
295 | 295 | ||
296 | __asm__ __volatile__("@ atomic64_add_return\n" | 296 | __asm__ __volatile__("@ atomic64_add_return\n" |
297 | "1: ldrexd %0, %H0, [%2]\n" | 297 | "1: ldrexd %0, %H0, [%3]\n" |
298 | " adds %0, %0, %3\n" | 298 | " adds %0, %0, %4\n" |
299 | " adc %H0, %H0, %H3\n" | 299 | " adc %H0, %H0, %H4\n" |
300 | " strexd %1, %0, %H0, [%2]\n" | 300 | " strexd %1, %0, %H0, [%3]\n" |
301 | " teq %1, #0\n" | 301 | " teq %1, #0\n" |
302 | " bne 1b" | 302 | " bne 1b" |
303 | : "=&r" (result), "=&r" (tmp) | 303 | : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) |
304 | : "r" (&v->counter), "r" (i) | 304 | : "r" (&v->counter), "r" (i) |
305 | : "cc"); | 305 | : "cc"); |
306 | 306 | ||
@@ -315,13 +315,13 @@ static inline void atomic64_sub(u64 i, atomic64_t *v) | |||
315 | unsigned long tmp; | 315 | unsigned long tmp; |
316 | 316 | ||
317 | __asm__ __volatile__("@ atomic64_sub\n" | 317 | __asm__ __volatile__("@ atomic64_sub\n" |
318 | "1: ldrexd %0, %H0, [%2]\n" | 318 | "1: ldrexd %0, %H0, [%3]\n" |
319 | " subs %0, %0, %3\n" | 319 | " subs %0, %0, %4\n" |
320 | " sbc %H0, %H0, %H3\n" | 320 | " sbc %H0, %H0, %H4\n" |
321 | " strexd %1, %0, %H0, [%2]\n" | 321 | " strexd %1, %0, %H0, [%3]\n" |
322 | " teq %1, #0\n" | 322 | " teq %1, #0\n" |
323 | " bne 1b" | 323 | " bne 1b" |
324 | : "=&r" (result), "=&r" (tmp) | 324 | : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) |
325 | : "r" (&v->counter), "r" (i) | 325 | : "r" (&v->counter), "r" (i) |
326 | : "cc"); | 326 | : "cc"); |
327 | } | 327 | } |
@@ -334,13 +334,13 @@ static inline u64 atomic64_sub_return(u64 i, atomic64_t *v) | |||
334 | smp_mb(); | 334 | smp_mb(); |
335 | 335 | ||
336 | __asm__ __volatile__("@ atomic64_sub_return\n" | 336 | __asm__ __volatile__("@ atomic64_sub_return\n" |
337 | "1: ldrexd %0, %H0, [%2]\n" | 337 | "1: ldrexd %0, %H0, [%3]\n" |
338 | " subs %0, %0, %3\n" | 338 | " subs %0, %0, %4\n" |
339 | " sbc %H0, %H0, %H3\n" | 339 | " sbc %H0, %H0, %H4\n" |
340 | " strexd %1, %0, %H0, [%2]\n" | 340 | " strexd %1, %0, %H0, [%3]\n" |
341 | " teq %1, #0\n" | 341 | " teq %1, #0\n" |
342 | " bne 1b" | 342 | " bne 1b" |
343 | : "=&r" (result), "=&r" (tmp) | 343 | : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) |
344 | : "r" (&v->counter), "r" (i) | 344 | : "r" (&v->counter), "r" (i) |
345 | : "cc"); | 345 | : "cc"); |
346 | 346 | ||
@@ -358,12 +358,12 @@ static inline u64 atomic64_cmpxchg(atomic64_t *ptr, u64 old, u64 new) | |||
358 | 358 | ||
359 | do { | 359 | do { |
360 | __asm__ __volatile__("@ atomic64_cmpxchg\n" | 360 | __asm__ __volatile__("@ atomic64_cmpxchg\n" |
361 | "ldrexd %1, %H1, [%2]\n" | 361 | "ldrexd %1, %H1, [%3]\n" |
362 | "mov %0, #0\n" | 362 | "mov %0, #0\n" |
363 | "teq %1, %3\n" | 363 | "teq %1, %4\n" |
364 | "teqeq %H1, %H3\n" | 364 | "teqeq %H1, %H4\n" |
365 | "strexdeq %0, %4, %H4, [%2]" | 365 | "strexdeq %0, %5, %H5, [%3]" |
366 | : "=&r" (res), "=&r" (oldval) | 366 | : "=&r" (res), "=&r" (oldval), "+Qo" (ptr->counter) |
367 | : "r" (&ptr->counter), "r" (old), "r" (new) | 367 | : "r" (&ptr->counter), "r" (old), "r" (new) |
368 | : "cc"); | 368 | : "cc"); |
369 | } while (res); | 369 | } while (res); |
@@ -381,11 +381,11 @@ static inline u64 atomic64_xchg(atomic64_t *ptr, u64 new) | |||
381 | smp_mb(); | 381 | smp_mb(); |
382 | 382 | ||
383 | __asm__ __volatile__("@ atomic64_xchg\n" | 383 | __asm__ __volatile__("@ atomic64_xchg\n" |
384 | "1: ldrexd %0, %H0, [%2]\n" | 384 | "1: ldrexd %0, %H0, [%3]\n" |
385 | " strexd %1, %3, %H3, [%2]\n" | 385 | " strexd %1, %4, %H4, [%3]\n" |
386 | " teq %1, #0\n" | 386 | " teq %1, #0\n" |
387 | " bne 1b" | 387 | " bne 1b" |
388 | : "=&r" (result), "=&r" (tmp) | 388 | : "=&r" (result), "=&r" (tmp), "+Qo" (ptr->counter) |
389 | : "r" (&ptr->counter), "r" (new) | 389 | : "r" (&ptr->counter), "r" (new) |
390 | : "cc"); | 390 | : "cc"); |
391 | 391 | ||
@@ -402,16 +402,16 @@ static inline u64 atomic64_dec_if_positive(atomic64_t *v) | |||
402 | smp_mb(); | 402 | smp_mb(); |
403 | 403 | ||
404 | __asm__ __volatile__("@ atomic64_dec_if_positive\n" | 404 | __asm__ __volatile__("@ atomic64_dec_if_positive\n" |
405 | "1: ldrexd %0, %H0, [%2]\n" | 405 | "1: ldrexd %0, %H0, [%3]\n" |
406 | " subs %0, %0, #1\n" | 406 | " subs %0, %0, #1\n" |
407 | " sbc %H0, %H0, #0\n" | 407 | " sbc %H0, %H0, #0\n" |
408 | " teq %H0, #0\n" | 408 | " teq %H0, #0\n" |
409 | " bmi 2f\n" | 409 | " bmi 2f\n" |
410 | " strexd %1, %0, %H0, [%2]\n" | 410 | " strexd %1, %0, %H0, [%3]\n" |
411 | " teq %1, #0\n" | 411 | " teq %1, #0\n" |
412 | " bne 1b\n" | 412 | " bne 1b\n" |
413 | "2:" | 413 | "2:" |
414 | : "=&r" (result), "=&r" (tmp) | 414 | : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) |
415 | : "r" (&v->counter) | 415 | : "r" (&v->counter) |
416 | : "cc"); | 416 | : "cc"); |
417 | 417 | ||
@@ -429,18 +429,18 @@ static inline int atomic64_add_unless(atomic64_t *v, u64 a, u64 u) | |||
429 | smp_mb(); | 429 | smp_mb(); |
430 | 430 | ||
431 | __asm__ __volatile__("@ atomic64_add_unless\n" | 431 | __asm__ __volatile__("@ atomic64_add_unless\n" |
432 | "1: ldrexd %0, %H0, [%3]\n" | 432 | "1: ldrexd %0, %H0, [%4]\n" |
433 | " teq %0, %4\n" | 433 | " teq %0, %5\n" |
434 | " teqeq %H0, %H4\n" | 434 | " teqeq %H0, %H5\n" |
435 | " moveq %1, #0\n" | 435 | " moveq %1, #0\n" |
436 | " beq 2f\n" | 436 | " beq 2f\n" |
437 | " adds %0, %0, %5\n" | 437 | " adds %0, %0, %6\n" |
438 | " adc %H0, %H0, %H5\n" | 438 | " adc %H0, %H0, %H6\n" |
439 | " strexd %2, %0, %H0, [%3]\n" | 439 | " strexd %2, %0, %H0, [%4]\n" |
440 | " teq %2, #0\n" | 440 | " teq %2, #0\n" |
441 | " bne 1b\n" | 441 | " bne 1b\n" |
442 | "2:" | 442 | "2:" |
443 | : "=&r" (val), "=&r" (ret), "=&r" (tmp) | 443 | : "=&r" (val), "+r" (ret), "=&r" (tmp), "+Qo" (v->counter) |
444 | : "r" (&v->counter), "r" (u), "r" (a) | 444 | : "r" (&v->counter), "r" (u), "r" (a) |
445 | : "cc"); | 445 | : "cc"); |
446 | 446 | ||
diff --git a/arch/arm/include/asm/cache.h b/arch/arm/include/asm/cache.h index 66c160b8547f..9d6122096fbe 100644 --- a/arch/arm/include/asm/cache.h +++ b/arch/arm/include/asm/cache.h | |||
@@ -14,7 +14,7 @@ | |||
14 | * cache before the transfer is done, causing old data to be seen by | 14 | * cache before the transfer is done, causing old data to be seen by |
15 | * the CPU. | 15 | * the CPU. |
16 | */ | 16 | */ |
17 | #define ARCH_KMALLOC_MINALIGN L1_CACHE_BYTES | 17 | #define ARCH_DMA_MINALIGN L1_CACHE_BYTES |
18 | 18 | ||
19 | /* | 19 | /* |
20 | * With EABI on ARMv5 and above we must have 64-bit aligned slab pointers. | 20 | * With EABI on ARMv5 and above we must have 64-bit aligned slab pointers. |
diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h index 69ce0727edb5..c226fe10553e 100644 --- a/arch/arm/include/asm/dma-mapping.h +++ b/arch/arm/include/asm/dma-mapping.h | |||
@@ -144,16 +144,6 @@ static inline int dma_set_mask(struct device *dev, u64 dma_mask) | |||
144 | return 0; | 144 | return 0; |
145 | } | 145 | } |
146 | 146 | ||
147 | static inline int dma_get_cache_alignment(void) | ||
148 | { | ||
149 | return 32; | ||
150 | } | ||
151 | |||
152 | static inline int dma_is_consistent(struct device *dev, dma_addr_t handle) | ||
153 | { | ||
154 | return !!arch_is_coherent(); | ||
155 | } | ||
156 | |||
157 | /* | 147 | /* |
158 | * DMA errors are defined by all-bits-set in the DMA address. | 148 | * DMA errors are defined by all-bits-set in the DMA address. |
159 | */ | 149 | */ |
@@ -298,7 +288,15 @@ extern void dmabounce_unregister_dev(struct device *); | |||
298 | * DMA access and 1 if the buffer needs to be bounced. | 288 | * DMA access and 1 if the buffer needs to be bounced. |
299 | * | 289 | * |
300 | */ | 290 | */ |
291 | #ifdef CONFIG_SA1111 | ||
301 | extern int dma_needs_bounce(struct device*, dma_addr_t, size_t); | 292 | extern int dma_needs_bounce(struct device*, dma_addr_t, size_t); |
293 | #else | ||
294 | static inline int dma_needs_bounce(struct device *dev, dma_addr_t addr, | ||
295 | size_t size) | ||
296 | { | ||
297 | return 0; | ||
298 | } | ||
299 | #endif | ||
302 | 300 | ||
303 | /* | 301 | /* |
304 | * The DMA API, implemented by dmabounce.c. See below for descriptions. | 302 | * The DMA API, implemented by dmabounce.c. See below for descriptions. |
diff --git a/arch/arm/include/asm/elf.h b/arch/arm/include/asm/elf.h index 51662feb9f1d..5747a8baa413 100644 --- a/arch/arm/include/asm/elf.h +++ b/arch/arm/include/asm/elf.h | |||
@@ -59,6 +59,8 @@ typedef struct user_fp elf_fpregset_t; | |||
59 | 59 | ||
60 | #define R_ARM_THM_CALL 10 | 60 | #define R_ARM_THM_CALL 10 |
61 | #define R_ARM_THM_JUMP24 30 | 61 | #define R_ARM_THM_JUMP24 30 |
62 | #define R_ARM_THM_MOVW_ABS_NC 47 | ||
63 | #define R_ARM_THM_MOVT_ABS 48 | ||
62 | 64 | ||
63 | /* | 65 | /* |
64 | * These are used to set parameters in the core dumps. | 66 | * These are used to set parameters in the core dumps. |
@@ -121,4 +123,8 @@ int dump_task_regs(struct task_struct *t, elf_gregset_t *elfregs); | |||
121 | extern void elf_set_personality(const struct elf32_hdr *); | 123 | extern void elf_set_personality(const struct elf32_hdr *); |
122 | #define SET_PERSONALITY(ex) elf_set_personality(&(ex)) | 124 | #define SET_PERSONALITY(ex) elf_set_personality(&(ex)) |
123 | 125 | ||
126 | struct mm_struct; | ||
127 | extern unsigned long arch_randomize_brk(struct mm_struct *mm); | ||
128 | #define arch_randomize_brk arch_randomize_brk | ||
129 | |||
124 | #endif | 130 | #endif |
diff --git a/arch/arm/include/asm/hardware/coresight.h b/arch/arm/include/asm/hardware/coresight.h index f82b25d4f73e..212e47828c79 100644 --- a/arch/arm/include/asm/hardware/coresight.h +++ b/arch/arm/include/asm/hardware/coresight.h | |||
@@ -48,8 +48,6 @@ struct tracectx { | |||
48 | /* CoreSight Component Registers */ | 48 | /* CoreSight Component Registers */ |
49 | #define CSCR_CLASS 0xff4 | 49 | #define CSCR_CLASS 0xff4 |
50 | 50 | ||
51 | #define CSCR_PRSR 0x314 | ||
52 | |||
53 | #define UNLOCK_MAGIC 0xc5acce55 | 51 | #define UNLOCK_MAGIC 0xc5acce55 |
54 | 52 | ||
55 | /* ETM control register, "ETM Architecture", 3.3.1 */ | 53 | /* ETM control register, "ETM Architecture", 3.3.1 */ |
@@ -132,6 +130,12 @@ struct tracectx { | |||
132 | ETMCTRL_BRANCH_OUTPUT | \ | 130 | ETMCTRL_BRANCH_OUTPUT | \ |
133 | ETMCTRL_DO_CONTEXTID) | 131 | ETMCTRL_DO_CONTEXTID) |
134 | 132 | ||
133 | /* ETM management registers, "ETM Architecture", 3.5.24 */ | ||
134 | #define ETMMR_OSLAR 0x300 | ||
135 | #define ETMMR_OSLSR 0x304 | ||
136 | #define ETMMR_OSSRR 0x308 | ||
137 | #define ETMMR_PDSR 0x314 | ||
138 | |||
135 | /* ETB registers, "CoreSight Components TRM", 9.3 */ | 139 | /* ETB registers, "CoreSight Components TRM", 9.3 */ |
136 | #define ETBR_DEPTH 0x04 | 140 | #define ETBR_DEPTH 0x04 |
137 | #define ETBR_STATUS 0x0c | 141 | #define ETBR_STATUS 0x0c |
diff --git a/arch/arm/include/asm/hardware/pl080.h b/arch/arm/include/asm/hardware/pl080.h index 6a6c66be7f65..f35b86e68dd5 100644 --- a/arch/arm/include/asm/hardware/pl080.h +++ b/arch/arm/include/asm/hardware/pl080.h | |||
@@ -43,7 +43,7 @@ | |||
43 | 43 | ||
44 | /* Per channel configuration registers */ | 44 | /* Per channel configuration registers */ |
45 | 45 | ||
46 | #define PL008_Cx_STRIDE (0x20) | 46 | #define PL080_Cx_STRIDE (0x20) |
47 | #define PL080_Cx_BASE(x) ((0x100 + (x * 0x20))) | 47 | #define PL080_Cx_BASE(x) ((0x100 + (x * 0x20))) |
48 | #define PL080_Cx_SRC_ADDR(x) ((0x100 + (x * 0x20))) | 48 | #define PL080_Cx_SRC_ADDR(x) ((0x100 + (x * 0x20))) |
49 | #define PL080_Cx_DST_ADDR(x) ((0x104 + (x * 0x20))) | 49 | #define PL080_Cx_DST_ADDR(x) ((0x104 + (x * 0x20))) |
@@ -68,6 +68,8 @@ | |||
68 | #define PL080_CONTROL_TC_IRQ_EN (1 << 31) | 68 | #define PL080_CONTROL_TC_IRQ_EN (1 << 31) |
69 | #define PL080_CONTROL_PROT_MASK (0x7 << 28) | 69 | #define PL080_CONTROL_PROT_MASK (0x7 << 28) |
70 | #define PL080_CONTROL_PROT_SHIFT (28) | 70 | #define PL080_CONTROL_PROT_SHIFT (28) |
71 | #define PL080_CONTROL_PROT_CACHE (1 << 30) | ||
72 | #define PL080_CONTROL_PROT_BUFF (1 << 29) | ||
71 | #define PL080_CONTROL_PROT_SYS (1 << 28) | 73 | #define PL080_CONTROL_PROT_SYS (1 << 28) |
72 | #define PL080_CONTROL_DST_INCR (1 << 27) | 74 | #define PL080_CONTROL_DST_INCR (1 << 27) |
73 | #define PL080_CONTROL_SRC_INCR (1 << 26) | 75 | #define PL080_CONTROL_SRC_INCR (1 << 26) |
diff --git a/arch/arm/include/asm/hardware/scoop.h b/arch/arm/include/asm/hardware/scoop.h index 46492a63a7c4..ebb3ceaa8fac 100644 --- a/arch/arm/include/asm/hardware/scoop.h +++ b/arch/arm/include/asm/hardware/scoop.h | |||
@@ -22,18 +22,23 @@ | |||
22 | #define SCOOP_GPWR 0x24 | 22 | #define SCOOP_GPWR 0x24 |
23 | #define SCOOP_GPRR 0x28 | 23 | #define SCOOP_GPRR 0x28 |
24 | 24 | ||
25 | #define SCOOP_GPCR_PA22 ( 1 << 12 ) | 25 | #define SCOOP_CPR_OUT (1 << 7) |
26 | #define SCOOP_GPCR_PA21 ( 1 << 11 ) | 26 | #define SCOOP_CPR_SD_3V (1 << 2) |
27 | #define SCOOP_GPCR_PA20 ( 1 << 10 ) | 27 | #define SCOOP_CPR_CF_XV (1 << 1) |
28 | #define SCOOP_GPCR_PA19 ( 1 << 9 ) | 28 | #define SCOOP_CPR_CF_3V (1 << 0) |
29 | #define SCOOP_GPCR_PA18 ( 1 << 8 ) | 29 | |
30 | #define SCOOP_GPCR_PA17 ( 1 << 7 ) | 30 | #define SCOOP_GPCR_PA22 (1 << 12) |
31 | #define SCOOP_GPCR_PA16 ( 1 << 6 ) | 31 | #define SCOOP_GPCR_PA21 (1 << 11) |
32 | #define SCOOP_GPCR_PA15 ( 1 << 5 ) | 32 | #define SCOOP_GPCR_PA20 (1 << 10) |
33 | #define SCOOP_GPCR_PA14 ( 1 << 4 ) | 33 | #define SCOOP_GPCR_PA19 (1 << 9) |
34 | #define SCOOP_GPCR_PA13 ( 1 << 3 ) | 34 | #define SCOOP_GPCR_PA18 (1 << 8) |
35 | #define SCOOP_GPCR_PA12 ( 1 << 2 ) | 35 | #define SCOOP_GPCR_PA17 (1 << 7) |
36 | #define SCOOP_GPCR_PA11 ( 1 << 1 ) | 36 | #define SCOOP_GPCR_PA16 (1 << 6) |
37 | #define SCOOP_GPCR_PA15 (1 << 5) | ||
38 | #define SCOOP_GPCR_PA14 (1 << 4) | ||
39 | #define SCOOP_GPCR_PA13 (1 << 3) | ||
40 | #define SCOOP_GPCR_PA12 (1 << 2) | ||
41 | #define SCOOP_GPCR_PA11 (1 << 1) | ||
37 | 42 | ||
38 | struct scoop_config { | 43 | struct scoop_config { |
39 | unsigned short io_out; | 44 | unsigned short io_out; |
diff --git a/arch/arm/include/asm/highmem.h b/arch/arm/include/asm/highmem.h index feb988a7ec37..5aff58126602 100644 --- a/arch/arm/include/asm/highmem.h +++ b/arch/arm/include/asm/highmem.h | |||
@@ -36,7 +36,7 @@ extern void kunmap_high_l1_vipt(struct page *page, pte_t saved_pte); | |||
36 | extern void *kmap(struct page *page); | 36 | extern void *kmap(struct page *page); |
37 | extern void kunmap(struct page *page); | 37 | extern void kunmap(struct page *page); |
38 | extern void *kmap_atomic(struct page *page, enum km_type type); | 38 | extern void *kmap_atomic(struct page *page, enum km_type type); |
39 | extern void kunmap_atomic(void *kvaddr, enum km_type type); | 39 | extern void kunmap_atomic_notypecheck(void *kvaddr, enum km_type type); |
40 | extern void *kmap_atomic_pfn(unsigned long pfn, enum km_type type); | 40 | extern void *kmap_atomic_pfn(unsigned long pfn, enum km_type type); |
41 | extern struct page *kmap_atomic_to_page(const void *ptr); | 41 | extern struct page *kmap_atomic_to_page(const void *ptr); |
42 | #endif | 42 | #endif |
diff --git a/arch/arm/include/asm/hwcap.h b/arch/arm/include/asm/hwcap.h index f7bd52b1c365..c1062c317103 100644 --- a/arch/arm/include/asm/hwcap.h +++ b/arch/arm/include/asm/hwcap.h | |||
@@ -19,6 +19,7 @@ | |||
19 | #define HWCAP_NEON 4096 | 19 | #define HWCAP_NEON 4096 |
20 | #define HWCAP_VFPv3 8192 | 20 | #define HWCAP_VFPv3 8192 |
21 | #define HWCAP_VFPv3D16 16384 | 21 | #define HWCAP_VFPv3D16 16384 |
22 | #define HWCAP_TLS 32768 | ||
22 | 23 | ||
23 | #if defined(__KERNEL__) && !defined(__ASSEMBLY__) | 24 | #if defined(__KERNEL__) && !defined(__ASSEMBLY__) |
24 | /* | 25 | /* |
diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h index c980156f3263..1261b1f928d9 100644 --- a/arch/arm/include/asm/io.h +++ b/arch/arm/include/asm/io.h | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/types.h> | 26 | #include <linux/types.h> |
27 | #include <asm/byteorder.h> | 27 | #include <asm/byteorder.h> |
28 | #include <asm/memory.h> | 28 | #include <asm/memory.h> |
29 | #include <asm/system.h> | ||
29 | 30 | ||
30 | /* | 31 | /* |
31 | * ISA I/O bus memory addresses are 1:1 with the physical address. | 32 | * ISA I/O bus memory addresses are 1:1 with the physical address. |
@@ -179,25 +180,38 @@ extern void _memset_io(volatile void __iomem *, int, size_t); | |||
179 | * IO port primitives for more information. | 180 | * IO port primitives for more information. |
180 | */ | 181 | */ |
181 | #ifdef __mem_pci | 182 | #ifdef __mem_pci |
182 | #define readb(c) ({ __u8 __v = __raw_readb(__mem_pci(c)); __v; }) | 183 | #define readb_relaxed(c) ({ u8 __v = __raw_readb(__mem_pci(c)); __v; }) |
183 | #define readw(c) ({ __u16 __v = le16_to_cpu((__force __le16) \ | 184 | #define readw_relaxed(c) ({ u16 __v = le16_to_cpu((__force __le16) \ |
184 | __raw_readw(__mem_pci(c))); __v; }) | 185 | __raw_readw(__mem_pci(c))); __v; }) |
185 | #define readl(c) ({ __u32 __v = le32_to_cpu((__force __le32) \ | 186 | #define readl_relaxed(c) ({ u32 __v = le32_to_cpu((__force __le32) \ |
186 | __raw_readl(__mem_pci(c))); __v; }) | 187 | __raw_readl(__mem_pci(c))); __v; }) |
187 | #define readb_relaxed(addr) readb(addr) | 188 | |
188 | #define readw_relaxed(addr) readw(addr) | 189 | #define writeb_relaxed(v,c) ((void)__raw_writeb(v,__mem_pci(c))) |
189 | #define readl_relaxed(addr) readl(addr) | 190 | #define writew_relaxed(v,c) ((void)__raw_writew((__force u16) \ |
191 | cpu_to_le16(v),__mem_pci(c))) | ||
192 | #define writel_relaxed(v,c) ((void)__raw_writel((__force u32) \ | ||
193 | cpu_to_le32(v),__mem_pci(c))) | ||
194 | |||
195 | #ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE | ||
196 | #define __iormb() rmb() | ||
197 | #define __iowmb() wmb() | ||
198 | #else | ||
199 | #define __iormb() do { } while (0) | ||
200 | #define __iowmb() do { } while (0) | ||
201 | #endif | ||
202 | |||
203 | #define readb(c) ({ u8 __v = readb_relaxed(c); __iormb(); __v; }) | ||
204 | #define readw(c) ({ u16 __v = readw_relaxed(c); __iormb(); __v; }) | ||
205 | #define readl(c) ({ u32 __v = readl_relaxed(c); __iormb(); __v; }) | ||
206 | |||
207 | #define writeb(v,c) ({ __iowmb(); writeb_relaxed(v,c); }) | ||
208 | #define writew(v,c) ({ __iowmb(); writew_relaxed(v,c); }) | ||
209 | #define writel(v,c) ({ __iowmb(); writel_relaxed(v,c); }) | ||
190 | 210 | ||
191 | #define readsb(p,d,l) __raw_readsb(__mem_pci(p),d,l) | 211 | #define readsb(p,d,l) __raw_readsb(__mem_pci(p),d,l) |
192 | #define readsw(p,d,l) __raw_readsw(__mem_pci(p),d,l) | 212 | #define readsw(p,d,l) __raw_readsw(__mem_pci(p),d,l) |
193 | #define readsl(p,d,l) __raw_readsl(__mem_pci(p),d,l) | 213 | #define readsl(p,d,l) __raw_readsl(__mem_pci(p),d,l) |
194 | 214 | ||
195 | #define writeb(v,c) __raw_writeb(v,__mem_pci(c)) | ||
196 | #define writew(v,c) __raw_writew((__force __u16) \ | ||
197 | cpu_to_le16(v),__mem_pci(c)) | ||
198 | #define writel(v,c) __raw_writel((__force __u32) \ | ||
199 | cpu_to_le32(v),__mem_pci(c)) | ||
200 | |||
201 | #define writesb(p,d,l) __raw_writesb(__mem_pci(p),d,l) | 215 | #define writesb(p,d,l) __raw_writesb(__mem_pci(p),d,l) |
202 | #define writesw(p,d,l) __raw_writesw(__mem_pci(p),d,l) | 216 | #define writesw(p,d,l) __raw_writesw(__mem_pci(p),d,l) |
203 | #define writesl(p,d,l) __raw_writesl(__mem_pci(p),d,l) | 217 | #define writesl(p,d,l) __raw_writesl(__mem_pci(p),d,l) |
@@ -244,13 +258,13 @@ extern void _memset_io(volatile void __iomem *, int, size_t); | |||
244 | * io{read,write}{8,16,32} macros | 258 | * io{read,write}{8,16,32} macros |
245 | */ | 259 | */ |
246 | #ifndef ioread8 | 260 | #ifndef ioread8 |
247 | #define ioread8(p) ({ unsigned int __v = __raw_readb(p); __v; }) | 261 | #define ioread8(p) ({ unsigned int __v = __raw_readb(p); __iormb(); __v; }) |
248 | #define ioread16(p) ({ unsigned int __v = le16_to_cpu((__force __le16)__raw_readw(p)); __v; }) | 262 | #define ioread16(p) ({ unsigned int __v = le16_to_cpu((__force __le16)__raw_readw(p)); __iormb(); __v; }) |
249 | #define ioread32(p) ({ unsigned int __v = le32_to_cpu((__force __le32)__raw_readl(p)); __v; }) | 263 | #define ioread32(p) ({ unsigned int __v = le32_to_cpu((__force __le32)__raw_readl(p)); __iormb(); __v; }) |
250 | 264 | ||
251 | #define iowrite8(v,p) __raw_writeb(v, p) | 265 | #define iowrite8(v,p) ({ __iowmb(); (void)__raw_writeb(v, p); }) |
252 | #define iowrite16(v,p) __raw_writew((__force __u16)cpu_to_le16(v), p) | 266 | #define iowrite16(v,p) ({ __iowmb(); (void)__raw_writew((__force __u16)cpu_to_le16(v), p); }) |
253 | #define iowrite32(v,p) __raw_writel((__force __u32)cpu_to_le32(v), p) | 267 | #define iowrite32(v,p) ({ __iowmb(); (void)__raw_writel((__force __u32)cpu_to_le32(v), p); }) |
254 | 268 | ||
255 | #define ioread8_rep(p,d,c) __raw_readsb(p,d,c) | 269 | #define ioread8_rep(p,d,c) __raw_readsb(p,d,c) |
256 | #define ioread16_rep(p,d,c) __raw_readsw(p,d,c) | 270 | #define ioread16_rep(p,d,c) __raw_readsw(p,d,c) |
diff --git a/arch/arm/include/asm/ioctls.h b/arch/arm/include/asm/ioctls.h index 7f0b6d13296a..0b30894b5482 100644 --- a/arch/arm/include/asm/ioctls.h +++ b/arch/arm/include/asm/ioctls.h | |||
@@ -52,6 +52,7 @@ | |||
52 | #define TCSETSF2 _IOW('T',0x2D, struct termios2) | 52 | #define TCSETSF2 _IOW('T',0x2D, struct termios2) |
53 | #define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ | 53 | #define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ |
54 | #define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */ | 54 | #define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */ |
55 | #define TIOCSIG _IOW('T',0x36, int) /* Generate signal on Pty slave */ | ||
55 | 56 | ||
56 | #define TIOCGRS485 0x542E | 57 | #define TIOCGRS485 0x542E |
57 | #define TIOCSRS485 0x542F | 58 | #define TIOCSRS485 0x542F |
@@ -81,6 +82,7 @@ | |||
81 | #define TIOCPKT_START 8 | 82 | #define TIOCPKT_START 8 |
82 | #define TIOCPKT_NOSTOP 16 | 83 | #define TIOCPKT_NOSTOP 16 |
83 | #define TIOCPKT_DOSTOP 32 | 84 | #define TIOCPKT_DOSTOP 32 |
85 | #define TIOCPKT_IOCTL 64 | ||
84 | 86 | ||
85 | #define TIOCSER_TEMT 0x01 /* Transmitter physically empty */ | 87 | #define TIOCSER_TEMT 0x01 /* Transmitter physically empty */ |
86 | 88 | ||
diff --git a/arch/arm/include/asm/irq.h b/arch/arm/include/asm/irq.h index 237282f7c762..2721a5814cb9 100644 --- a/arch/arm/include/asm/irq.h +++ b/arch/arm/include/asm/irq.h | |||
@@ -7,6 +7,8 @@ | |||
7 | #define irq_canonicalize(i) (i) | 7 | #define irq_canonicalize(i) (i) |
8 | #endif | 8 | #endif |
9 | 9 | ||
10 | #define NR_IRQS_LEGACY 16 | ||
11 | |||
10 | /* | 12 | /* |
11 | * Use this value to indicate lack of interrupt | 13 | * Use this value to indicate lack of interrupt |
12 | * capability | 14 | * capability |
diff --git a/arch/arm/include/asm/kexec.h b/arch/arm/include/asm/kexec.h index df15a0dc228e..8ec9ef5c3c7b 100644 --- a/arch/arm/include/asm/kexec.h +++ b/arch/arm/include/asm/kexec.h | |||
@@ -19,10 +19,26 @@ | |||
19 | 19 | ||
20 | #ifndef __ASSEMBLY__ | 20 | #ifndef __ASSEMBLY__ |
21 | 21 | ||
22 | struct kimage; | 22 | /** |
23 | /* Provide a dummy definition to avoid build failures. */ | 23 | * crash_setup_regs() - save registers for the panic kernel |
24 | * @newregs: registers are saved here | ||
25 | * @oldregs: registers to be saved (may be %NULL) | ||
26 | * | ||
27 | * Function copies machine registers from @oldregs to @newregs. If @oldregs is | ||
28 | * %NULL then current registers are stored there. | ||
29 | */ | ||
24 | static inline void crash_setup_regs(struct pt_regs *newregs, | 30 | static inline void crash_setup_regs(struct pt_regs *newregs, |
25 | struct pt_regs *oldregs) { } | 31 | struct pt_regs *oldregs) |
32 | { | ||
33 | if (oldregs) { | ||
34 | memcpy(newregs, oldregs, sizeof(*newregs)); | ||
35 | } else { | ||
36 | __asm__ __volatile__ ("stmia %0, {r0 - r15}" | ||
37 | : : "r" (&newregs->ARM_r0)); | ||
38 | __asm__ __volatile__ ("mrs %0, cpsr" | ||
39 | : "=r" (newregs->ARM_cpsr)); | ||
40 | } | ||
41 | } | ||
26 | 42 | ||
27 | #endif /* __ASSEMBLY__ */ | 43 | #endif /* __ASSEMBLY__ */ |
28 | 44 | ||
diff --git a/arch/arm/include/asm/kgdb.h b/arch/arm/include/asm/kgdb.h index 67af4b841984..08265993227f 100644 --- a/arch/arm/include/asm/kgdb.h +++ b/arch/arm/include/asm/kgdb.h | |||
@@ -70,11 +70,11 @@ extern int kgdb_fault_expected; | |||
70 | #define _GP_REGS 16 | 70 | #define _GP_REGS 16 |
71 | #define _FP_REGS 8 | 71 | #define _FP_REGS 8 |
72 | #define _EXTRA_REGS 2 | 72 | #define _EXTRA_REGS 2 |
73 | #define GDB_MAX_REGS (_GP_REGS + (_FP_REGS * 3) + _EXTRA_REGS) | 73 | #define DBG_MAX_REG_NUM (_GP_REGS + (_FP_REGS * 3) + _EXTRA_REGS) |
74 | 74 | ||
75 | #define KGDB_MAX_NO_CPUS 1 | 75 | #define KGDB_MAX_NO_CPUS 1 |
76 | #define BUFMAX 400 | 76 | #define BUFMAX 400 |
77 | #define NUMREGBYTES (GDB_MAX_REGS << 2) | 77 | #define NUMREGBYTES (DBG_MAX_REG_NUM << 2) |
78 | #define NUMCRITREGBYTES (32 << 2) | 78 | #define NUMCRITREGBYTES (32 << 2) |
79 | 79 | ||
80 | #define _R0 0 | 80 | #define _R0 0 |
@@ -93,7 +93,7 @@ extern int kgdb_fault_expected; | |||
93 | #define _SPT 13 | 93 | #define _SPT 13 |
94 | #define _LR 14 | 94 | #define _LR 14 |
95 | #define _PC 15 | 95 | #define _PC 15 |
96 | #define _CPSR (GDB_MAX_REGS - 1) | 96 | #define _CPSR (DBG_MAX_REG_NUM - 1) |
97 | 97 | ||
98 | /* | 98 | /* |
99 | * So that we can denote the end of a frame for tracing, | 99 | * So that we can denote the end of a frame for tracing, |
diff --git a/arch/arm/include/asm/local64.h b/arch/arm/include/asm/local64.h new file mode 100644 index 000000000000..36c93b5cc239 --- /dev/null +++ b/arch/arm/include/asm/local64.h | |||
@@ -0,0 +1 @@ | |||
#include <asm-generic/local64.h> | |||
diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h index c59842dc7cb8..8a0dd18ba642 100644 --- a/arch/arm/include/asm/mach/arch.h +++ b/arch/arm/include/asm/mach/arch.h | |||
@@ -20,6 +20,7 @@ struct machine_desc { | |||
20 | * by assembler code in head.S, head-common.S | 20 | * by assembler code in head.S, head-common.S |
21 | */ | 21 | */ |
22 | unsigned int nr; /* architecture number */ | 22 | unsigned int nr; /* architecture number */ |
23 | unsigned int nr_irqs; /* number of IRQs */ | ||
23 | unsigned int phys_io; /* start of physical io */ | 24 | unsigned int phys_io; /* start of physical io */ |
24 | unsigned int io_pg_offst; /* byte offset for io | 25 | unsigned int io_pg_offst; /* byte offset for io |
25 | * page tabe entry */ | 26 | * page tabe entry */ |
@@ -37,6 +38,7 @@ struct machine_desc { | |||
37 | void (*fixup)(struct machine_desc *, | 38 | void (*fixup)(struct machine_desc *, |
38 | struct tag *, char **, | 39 | struct tag *, char **, |
39 | struct meminfo *); | 40 | struct meminfo *); |
41 | void (*reserve)(void);/* reserve mem blocks */ | ||
40 | void (*map_io)(void);/* IO mapping function */ | 42 | void (*map_io)(void);/* IO mapping function */ |
41 | void (*init_irq)(void); | 43 | void (*init_irq)(void); |
42 | struct sys_timer *timer; /* system tick timer */ | 44 | struct sys_timer *timer; /* system tick timer */ |
diff --git a/arch/arm/include/asm/mach/irq.h b/arch/arm/include/asm/mach/irq.h index 8920b2d6e3b8..ce3eee9fe26c 100644 --- a/arch/arm/include/asm/mach/irq.h +++ b/arch/arm/include/asm/mach/irq.h | |||
@@ -17,6 +17,7 @@ struct seq_file; | |||
17 | /* | 17 | /* |
18 | * This is internal. Do not use it. | 18 | * This is internal. Do not use it. |
19 | */ | 19 | */ |
20 | extern unsigned int arch_nr_irqs; | ||
20 | extern void (*init_arch_irq)(void); | 21 | extern void (*init_arch_irq)(void); |
21 | extern void init_FIQ(void); | 22 | extern void init_FIQ(void); |
22 | extern int show_fiq_list(struct seq_file *, void *); | 23 | extern int show_fiq_list(struct seq_file *, void *); |
diff --git a/arch/arm/include/asm/mach/map.h b/arch/arm/include/asm/mach/map.h index 742c2aaeb020..d2fedb5aeb1f 100644 --- a/arch/arm/include/asm/mach/map.h +++ b/arch/arm/include/asm/mach/map.h | |||
@@ -27,6 +27,8 @@ struct map_desc { | |||
27 | #define MT_MEMORY 9 | 27 | #define MT_MEMORY 9 |
28 | #define MT_ROM 10 | 28 | #define MT_ROM 10 |
29 | #define MT_MEMORY_NONCACHED 11 | 29 | #define MT_MEMORY_NONCACHED 11 |
30 | #define MT_MEMORY_DTCM 12 | ||
31 | #define MT_MEMORY_ITCM 13 | ||
30 | 32 | ||
31 | #ifdef CONFIG_MMU | 33 | #ifdef CONFIG_MMU |
32 | extern void iotable_init(struct map_desc *, int); | 34 | extern void iotable_init(struct map_desc *, int); |
diff --git a/arch/arm/include/asm/mach/pci.h b/arch/arm/include/asm/mach/pci.h index 52f0da1e97df..16330bd0657c 100644 --- a/arch/arm/include/asm/mach/pci.h +++ b/arch/arm/include/asm/mach/pci.h | |||
@@ -46,6 +46,7 @@ struct pci_sys_data { | |||
46 | /* IRQ mapping */ | 46 | /* IRQ mapping */ |
47 | int (*map_irq)(struct pci_dev *, u8, u8); | 47 | int (*map_irq)(struct pci_dev *, u8, u8); |
48 | struct hw_pci *hw; | 48 | struct hw_pci *hw; |
49 | void *private_data; /* platform controller private data */ | ||
49 | }; | 50 | }; |
50 | 51 | ||
51 | /* | 52 | /* |
diff --git a/arch/arm/include/asm/mach/udc_pxa2xx.h b/arch/arm/include/asm/mach/udc_pxa2xx.h index f3eabf1ecec3..833306ee9e7f 100644 --- a/arch/arm/include/asm/mach/udc_pxa2xx.h +++ b/arch/arm/include/asm/mach/udc_pxa2xx.h | |||
@@ -21,8 +21,8 @@ struct pxa2xx_udc_mach_info { | |||
21 | * here. Note that sometimes the signals go through inverters... | 21 | * here. Note that sometimes the signals go through inverters... |
22 | */ | 22 | */ |
23 | bool gpio_vbus_inverted; | 23 | bool gpio_vbus_inverted; |
24 | u16 gpio_vbus; /* high == vbus present */ | 24 | int gpio_vbus; /* high == vbus present */ |
25 | bool gpio_pullup_inverted; | 25 | bool gpio_pullup_inverted; |
26 | u16 gpio_pullup; /* high == pullup activated */ | 26 | int gpio_pullup; /* high == pullup activated */ |
27 | }; | 27 | }; |
28 | 28 | ||
diff --git a/arch/arm/include/asm/memblock.h b/arch/arm/include/asm/memblock.h new file mode 100644 index 000000000000..fdbc43b2e6c0 --- /dev/null +++ b/arch/arm/include/asm/memblock.h | |||
@@ -0,0 +1,16 @@ | |||
1 | #ifndef _ASM_ARM_MEMBLOCK_H | ||
2 | #define _ASM_ARM_MEMBLOCK_H | ||
3 | |||
4 | #ifdef CONFIG_MMU | ||
5 | extern phys_addr_t lowmem_end_addr; | ||
6 | #define MEMBLOCK_REAL_LIMIT lowmem_end_addr | ||
7 | #else | ||
8 | #define MEMBLOCK_REAL_LIMIT 0 | ||
9 | #endif | ||
10 | |||
11 | struct meminfo; | ||
12 | struct machine_desc; | ||
13 | |||
14 | extern void arm_memblock_init(struct meminfo *, struct machine_desc *); | ||
15 | |||
16 | #endif | ||
diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h index 4312ee5e3d0b..23c2e8e5c0fa 100644 --- a/arch/arm/include/asm/memory.h +++ b/arch/arm/include/asm/memory.h | |||
@@ -124,6 +124,15 @@ | |||
124 | #endif /* !CONFIG_MMU */ | 124 | #endif /* !CONFIG_MMU */ |
125 | 125 | ||
126 | /* | 126 | /* |
127 | * We fix the TCM memories max 32 KiB ITCM resp DTCM at these | ||
128 | * locations | ||
129 | */ | ||
130 | #ifdef CONFIG_HAVE_TCM | ||
131 | #define ITCM_OFFSET UL(0xfffe0000) | ||
132 | #define DTCM_OFFSET UL(0xfffe8000) | ||
133 | #endif | ||
134 | |||
135 | /* | ||
127 | * Physical vs virtual RAM address space conversion. These are | 136 | * Physical vs virtual RAM address space conversion. These are |
128 | * private definitions which should NOT be used outside memory.h | 137 | * private definitions which should NOT be used outside memory.h |
129 | * files. Use virt_to_phys/phys_to_virt/__pa/__va instead. | 138 | * files. Use virt_to_phys/phys_to_virt/__pa/__va instead. |
@@ -158,7 +167,7 @@ | |||
158 | #endif | 167 | #endif |
159 | 168 | ||
160 | #ifndef arch_adjust_zones | 169 | #ifndef arch_adjust_zones |
161 | #define arch_adjust_zones(node,size,holes) do { } while (0) | 170 | #define arch_adjust_zones(size,holes) do { } while (0) |
162 | #elif !defined(CONFIG_ZONE_DMA) | 171 | #elif !defined(CONFIG_ZONE_DMA) |
163 | #error "custom arch_adjust_zones() requires CONFIG_ZONE_DMA" | 172 | #error "custom arch_adjust_zones() requires CONFIG_ZONE_DMA" |
164 | #endif | 173 | #endif |
@@ -234,76 +243,11 @@ static inline __deprecated void *bus_to_virt(unsigned long x) | |||
234 | * virt_to_page(k) convert a _valid_ virtual address to struct page * | 243 | * virt_to_page(k) convert a _valid_ virtual address to struct page * |
235 | * virt_addr_valid(k) indicates whether a virtual address is valid | 244 | * virt_addr_valid(k) indicates whether a virtual address is valid |
236 | */ | 245 | */ |
237 | #ifndef CONFIG_DISCONTIGMEM | ||
238 | |||
239 | #define ARCH_PFN_OFFSET PHYS_PFN_OFFSET | 246 | #define ARCH_PFN_OFFSET PHYS_PFN_OFFSET |
240 | 247 | ||
241 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) | 248 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) |
242 | #define virt_addr_valid(kaddr) ((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory) | 249 | #define virt_addr_valid(kaddr) ((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory) |
243 | 250 | ||
244 | #define PHYS_TO_NID(addr) (0) | ||
245 | |||
246 | #else /* CONFIG_DISCONTIGMEM */ | ||
247 | |||
248 | /* | ||
249 | * This is more complex. We have a set of mem_map arrays spread | ||
250 | * around in memory. | ||
251 | */ | ||
252 | #include <linux/numa.h> | ||
253 | |||
254 | #define arch_pfn_to_nid(pfn) PFN_TO_NID(pfn) | ||
255 | #define arch_local_page_offset(pfn, nid) LOCAL_MAP_NR((pfn) << PAGE_SHIFT) | ||
256 | |||
257 | #define virt_to_page(kaddr) \ | ||
258 | (ADDR_TO_MAPBASE(kaddr) + LOCAL_MAP_NR(kaddr)) | ||
259 | |||
260 | #define virt_addr_valid(kaddr) (KVADDR_TO_NID(kaddr) < MAX_NUMNODES) | ||
261 | |||
262 | /* | ||
263 | * Common discontigmem stuff. | ||
264 | * PHYS_TO_NID is used by the ARM kernel/setup.c | ||
265 | */ | ||
266 | #define PHYS_TO_NID(addr) PFN_TO_NID((addr) >> PAGE_SHIFT) | ||
267 | |||
268 | /* | ||
269 | * Given a kaddr, ADDR_TO_MAPBASE finds the owning node of the memory | ||
270 | * and returns the mem_map of that node. | ||
271 | */ | ||
272 | #define ADDR_TO_MAPBASE(kaddr) NODE_MEM_MAP(KVADDR_TO_NID(kaddr)) | ||
273 | |||
274 | /* | ||
275 | * Given a page frame number, find the owning node of the memory | ||
276 | * and returns the mem_map of that node. | ||
277 | */ | ||
278 | #define PFN_TO_MAPBASE(pfn) NODE_MEM_MAP(PFN_TO_NID(pfn)) | ||
279 | |||
280 | #ifdef NODE_MEM_SIZE_BITS | ||
281 | #define NODE_MEM_SIZE_MASK ((1 << NODE_MEM_SIZE_BITS) - 1) | ||
282 | |||
283 | /* | ||
284 | * Given a kernel address, find the home node of the underlying memory. | ||
285 | */ | ||
286 | #define KVADDR_TO_NID(addr) \ | ||
287 | (((unsigned long)(addr) - PAGE_OFFSET) >> NODE_MEM_SIZE_BITS) | ||
288 | |||
289 | /* | ||
290 | * Given a page frame number, convert it to a node id. | ||
291 | */ | ||
292 | #define PFN_TO_NID(pfn) \ | ||
293 | (((pfn) - PHYS_PFN_OFFSET) >> (NODE_MEM_SIZE_BITS - PAGE_SHIFT)) | ||
294 | |||
295 | /* | ||
296 | * Given a kaddr, LOCAL_MEM_MAP finds the owning node of the memory | ||
297 | * and returns the index corresponding to the appropriate page in the | ||
298 | * node's mem_map. | ||
299 | */ | ||
300 | #define LOCAL_MAP_NR(addr) \ | ||
301 | (((unsigned long)(addr) & NODE_MEM_SIZE_MASK) >> PAGE_SHIFT) | ||
302 | |||
303 | #endif /* NODE_MEM_SIZE_BITS */ | ||
304 | |||
305 | #endif /* !CONFIG_DISCONTIGMEM */ | ||
306 | |||
307 | /* | 251 | /* |
308 | * Optional coherency support. Currently used only by selected | 252 | * Optional coherency support. Currently used only by selected |
309 | * Intel XSC3-based systems. | 253 | * Intel XSC3-based systems. |
diff --git a/arch/arm/include/asm/mmzone.h b/arch/arm/include/asm/mmzone.h deleted file mode 100644 index ae63a4fd28c8..000000000000 --- a/arch/arm/include/asm/mmzone.h +++ /dev/null | |||
@@ -1,30 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/mmzone.h | ||
3 | * | ||
4 | * 1999-12-29 Nicolas Pitre Created | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | #ifndef __ASM_MMZONE_H | ||
11 | #define __ASM_MMZONE_H | ||
12 | |||
13 | /* | ||
14 | * Currently defined in arch/arm/mm/discontig.c | ||
15 | */ | ||
16 | extern pg_data_t discontig_node_data[]; | ||
17 | |||
18 | /* | ||
19 | * Return a pointer to the node data for node n. | ||
20 | */ | ||
21 | #define NODE_DATA(nid) (&discontig_node_data[nid]) | ||
22 | |||
23 | /* | ||
24 | * NODE_MEM_MAP gives the kaddr for the mem_map of the node. | ||
25 | */ | ||
26 | #define NODE_MEM_MAP(nid) (NODE_DATA(nid)->node_mem_map) | ||
27 | |||
28 | #include <mach/memory.h> | ||
29 | |||
30 | #endif | ||
diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h index 6a89567ffc5b..7bed3daf83b8 100644 --- a/arch/arm/include/asm/processor.h +++ b/arch/arm/include/asm/processor.h | |||
@@ -91,7 +91,11 @@ extern void release_thread(struct task_struct *); | |||
91 | 91 | ||
92 | unsigned long get_wchan(struct task_struct *p); | 92 | unsigned long get_wchan(struct task_struct *p); |
93 | 93 | ||
94 | #if __LINUX_ARM_ARCH__ == 6 | ||
95 | #define cpu_relax() smp_mb() | ||
96 | #else | ||
94 | #define cpu_relax() barrier() | 97 | #define cpu_relax() barrier() |
98 | #endif | ||
95 | 99 | ||
96 | /* | 100 | /* |
97 | * Create a new kernel thread | 101 | * Create a new kernel thread |
diff --git a/arch/arm/include/asm/ptrace.h b/arch/arm/include/asm/ptrace.h index 9dcb11e59026..c974be8913a7 100644 --- a/arch/arm/include/asm/ptrace.h +++ b/arch/arm/include/asm/ptrace.h | |||
@@ -184,6 +184,42 @@ extern unsigned long profile_pc(struct pt_regs *regs); | |||
184 | #define predicate(x) ((x) & 0xf0000000) | 184 | #define predicate(x) ((x) & 0xf0000000) |
185 | #define PREDICATE_ALWAYS 0xe0000000 | 185 | #define PREDICATE_ALWAYS 0xe0000000 |
186 | 186 | ||
187 | /* | ||
188 | * kprobe-based event tracer support | ||
189 | */ | ||
190 | #include <linux/stddef.h> | ||
191 | #include <linux/types.h> | ||
192 | #define MAX_REG_OFFSET (offsetof(struct pt_regs, ARM_ORIG_r0)) | ||
193 | |||
194 | extern int regs_query_register_offset(const char *name); | ||
195 | extern const char *regs_query_register_name(unsigned int offset); | ||
196 | extern bool regs_within_kernel_stack(struct pt_regs *regs, unsigned long addr); | ||
197 | extern unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, | ||
198 | unsigned int n); | ||
199 | |||
200 | /** | ||
201 | * regs_get_register() - get register value from its offset | ||
202 | * @regs: pt_regs from which register value is gotten | ||
203 | * @offset: offset number of the register. | ||
204 | * | ||
205 | * regs_get_register returns the value of a register whose offset from @regs. | ||
206 | * The @offset is the offset of the register in struct pt_regs. | ||
207 | * If @offset is bigger than MAX_REG_OFFSET, this returns 0. | ||
208 | */ | ||
209 | static inline unsigned long regs_get_register(struct pt_regs *regs, | ||
210 | unsigned int offset) | ||
211 | { | ||
212 | if (unlikely(offset > MAX_REG_OFFSET)) | ||
213 | return 0; | ||
214 | return *(unsigned long *)((unsigned long)regs + offset); | ||
215 | } | ||
216 | |||
217 | /* Valid only for Kernel mode traps. */ | ||
218 | static inline unsigned long kernel_stack_pointer(struct pt_regs *regs) | ||
219 | { | ||
220 | return regs->ARM_sp; | ||
221 | } | ||
222 | |||
187 | #endif /* __KERNEL__ */ | 223 | #endif /* __KERNEL__ */ |
188 | 224 | ||
189 | #endif /* __ASSEMBLY__ */ | 225 | #endif /* __ASSEMBLY__ */ |
diff --git a/arch/arm/include/asm/setup.h b/arch/arm/include/asm/setup.h index f392fb4437af..f1e5a9bca249 100644 --- a/arch/arm/include/asm/setup.h +++ b/arch/arm/include/asm/setup.h | |||
@@ -201,8 +201,7 @@ static struct tagtable __tagtable_##fn __tag = { tag, fn } | |||
201 | struct membank { | 201 | struct membank { |
202 | unsigned long start; | 202 | unsigned long start; |
203 | unsigned long size; | 203 | unsigned long size; |
204 | unsigned short node; | 204 | unsigned int highmem; |
205 | unsigned short highmem; | ||
206 | }; | 205 | }; |
207 | 206 | ||
208 | struct meminfo { | 207 | struct meminfo { |
@@ -212,9 +211,8 @@ struct meminfo { | |||
212 | 211 | ||
213 | extern struct meminfo meminfo; | 212 | extern struct meminfo meminfo; |
214 | 213 | ||
215 | #define for_each_nodebank(iter,mi,no) \ | 214 | #define for_each_bank(iter,mi) \ |
216 | for (iter = 0; iter < (mi)->nr_banks; iter++) \ | 215 | for (iter = 0; iter < (mi)->nr_banks; iter++) |
217 | if ((mi)->bank[iter].node == no) | ||
218 | 216 | ||
219 | #define bank_pfn_start(bank) __phys_to_pfn((bank)->start) | 217 | #define bank_pfn_start(bank) __phys_to_pfn((bank)->start) |
220 | #define bank_pfn_end(bank) __phys_to_pfn((bank)->start + (bank)->size) | 218 | #define bank_pfn_end(bank) __phys_to_pfn((bank)->start + (bank)->size) |
diff --git a/arch/arm/include/asm/stackprotector.h b/arch/arm/include/asm/stackprotector.h new file mode 100644 index 000000000000..de003327be97 --- /dev/null +++ b/arch/arm/include/asm/stackprotector.h | |||
@@ -0,0 +1,38 @@ | |||
1 | /* | ||
2 | * GCC stack protector support. | ||
3 | * | ||
4 | * Stack protector works by putting predefined pattern at the start of | ||
5 | * the stack frame and verifying that it hasn't been overwritten when | ||
6 | * returning from the function. The pattern is called stack canary | ||
7 | * and gcc expects it to be defined by a global variable called | ||
8 | * "__stack_chk_guard" on ARM. This unfortunately means that on SMP | ||
9 | * we cannot have a different canary value per task. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ASM_STACKPROTECTOR_H | ||
13 | #define _ASM_STACKPROTECTOR_H 1 | ||
14 | |||
15 | #include <linux/random.h> | ||
16 | #include <linux/version.h> | ||
17 | |||
18 | extern unsigned long __stack_chk_guard; | ||
19 | |||
20 | /* | ||
21 | * Initialize the stackprotector canary value. | ||
22 | * | ||
23 | * NOTE: this must only be called from functions that never return, | ||
24 | * and it must always be inlined. | ||
25 | */ | ||
26 | static __always_inline void boot_init_stack_canary(void) | ||
27 | { | ||
28 | unsigned long canary; | ||
29 | |||
30 | /* Try to get a semi random initial value. */ | ||
31 | get_random_bytes(&canary, sizeof(canary)); | ||
32 | canary ^= LINUX_VERSION_CODE; | ||
33 | |||
34 | current->stack_canary = canary; | ||
35 | __stack_chk_guard = current->stack_canary; | ||
36 | } | ||
37 | |||
38 | #endif /* _ASM_STACKPROTECTOR_H */ | ||
diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h index 5f4f48002734..8ba1ccf82a02 100644 --- a/arch/arm/include/asm/system.h +++ b/arch/arm/include/asm/system.h | |||
@@ -83,7 +83,7 @@ void arm_notify_die(const char *str, struct pt_regs *regs, struct siginfo *info, | |||
83 | 83 | ||
84 | void hook_fault_code(int nr, int (*fn)(unsigned long, unsigned int, | 84 | void hook_fault_code(int nr, int (*fn)(unsigned long, unsigned int, |
85 | struct pt_regs *), | 85 | struct pt_regs *), |
86 | int sig, const char *name); | 86 | int sig, int code, const char *name); |
87 | 87 | ||
88 | #define xchg(ptr,x) \ | 88 | #define xchg(ptr,x) \ |
89 | ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr)))) | 89 | ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr)))) |
diff --git a/arch/arm/include/asm/termbits.h b/arch/arm/include/asm/termbits.h index f784d11f40b5..704135d28d1d 100644 --- a/arch/arm/include/asm/termbits.h +++ b/arch/arm/include/asm/termbits.h | |||
@@ -177,6 +177,7 @@ struct ktermios { | |||
177 | #define FLUSHO 0010000 | 177 | #define FLUSHO 0010000 |
178 | #define PENDIN 0040000 | 178 | #define PENDIN 0040000 |
179 | #define IEXTEN 0100000 | 179 | #define IEXTEN 0100000 |
180 | #define EXTPROC 0200000 | ||
180 | 181 | ||
181 | /* tcflow() and TCXONC use these */ | 182 | /* tcflow() and TCXONC use these */ |
182 | #define TCOOFF 0 | 183 | #define TCOOFF 0 |
diff --git a/arch/arm/include/asm/tlbflush.h b/arch/arm/include/asm/tlbflush.h index bd863d8608cd..33b546ae72d4 100644 --- a/arch/arm/include/asm/tlbflush.h +++ b/arch/arm/include/asm/tlbflush.h | |||
@@ -378,7 +378,11 @@ static inline void local_flush_tlb_mm(struct mm_struct *mm) | |||
378 | if (tlb_flag(TLB_V6_I_ASID)) | 378 | if (tlb_flag(TLB_V6_I_ASID)) |
379 | asm("mcr p15, 0, %0, c8, c5, 2" : : "r" (asid) : "cc"); | 379 | asm("mcr p15, 0, %0, c8, c5, 2" : : "r" (asid) : "cc"); |
380 | if (tlb_flag(TLB_V7_UIS_ASID)) | 380 | if (tlb_flag(TLB_V7_UIS_ASID)) |
381 | #ifdef CONFIG_ARM_ERRATA_720789 | ||
382 | asm("mcr p15, 0, %0, c8, c3, 0" : : "r" (zero) : "cc"); | ||
383 | #else | ||
381 | asm("mcr p15, 0, %0, c8, c3, 2" : : "r" (asid) : "cc"); | 384 | asm("mcr p15, 0, %0, c8, c3, 2" : : "r" (asid) : "cc"); |
385 | #endif | ||
382 | 386 | ||
383 | if (tlb_flag(TLB_BTB)) { | 387 | if (tlb_flag(TLB_BTB)) { |
384 | /* flush the branch target cache */ | 388 | /* flush the branch target cache */ |
@@ -424,7 +428,11 @@ local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) | |||
424 | if (tlb_flag(TLB_V6_I_PAGE)) | 428 | if (tlb_flag(TLB_V6_I_PAGE)) |
425 | asm("mcr p15, 0, %0, c8, c5, 1" : : "r" (uaddr) : "cc"); | 429 | asm("mcr p15, 0, %0, c8, c5, 1" : : "r" (uaddr) : "cc"); |
426 | if (tlb_flag(TLB_V7_UIS_PAGE)) | 430 | if (tlb_flag(TLB_V7_UIS_PAGE)) |
431 | #ifdef CONFIG_ARM_ERRATA_720789 | ||
432 | asm("mcr p15, 0, %0, c8, c3, 3" : : "r" (uaddr & PAGE_MASK) : "cc"); | ||
433 | #else | ||
427 | asm("mcr p15, 0, %0, c8, c3, 1" : : "r" (uaddr) : "cc"); | 434 | asm("mcr p15, 0, %0, c8, c3, 1" : : "r" (uaddr) : "cc"); |
435 | #endif | ||
428 | 436 | ||
429 | if (tlb_flag(TLB_BTB)) { | 437 | if (tlb_flag(TLB_BTB)) { |
430 | /* flush the branch target cache */ | 438 | /* flush the branch target cache */ |
diff --git a/arch/arm/include/asm/tls.h b/arch/arm/include/asm/tls.h new file mode 100644 index 000000000000..e71d6ff8d104 --- /dev/null +++ b/arch/arm/include/asm/tls.h | |||
@@ -0,0 +1,46 @@ | |||
1 | #ifndef __ASMARM_TLS_H | ||
2 | #define __ASMARM_TLS_H | ||
3 | |||
4 | #ifdef __ASSEMBLY__ | ||
5 | .macro set_tls_none, tp, tmp1, tmp2 | ||
6 | .endm | ||
7 | |||
8 | .macro set_tls_v6k, tp, tmp1, tmp2 | ||
9 | mcr p15, 0, \tp, c13, c0, 3 @ set TLS register | ||
10 | .endm | ||
11 | |||
12 | .macro set_tls_v6, tp, tmp1, tmp2 | ||
13 | ldr \tmp1, =elf_hwcap | ||
14 | ldr \tmp1, [\tmp1, #0] | ||
15 | mov \tmp2, #0xffff0fff | ||
16 | tst \tmp1, #HWCAP_TLS @ hardware TLS available? | ||
17 | mcrne p15, 0, \tp, c13, c0, 3 @ yes, set TLS register | ||
18 | streq \tp, [\tmp2, #-15] @ set TLS value at 0xffff0ff0 | ||
19 | .endm | ||
20 | |||
21 | .macro set_tls_software, tp, tmp1, tmp2 | ||
22 | mov \tmp1, #0xffff0fff | ||
23 | str \tp, [\tmp1, #-15] @ set TLS value at 0xffff0ff0 | ||
24 | .endm | ||
25 | #endif | ||
26 | |||
27 | #ifdef CONFIG_TLS_REG_EMUL | ||
28 | #define tls_emu 1 | ||
29 | #define has_tls_reg 1 | ||
30 | #define set_tls set_tls_none | ||
31 | #elif __LINUX_ARM_ARCH__ >= 7 || \ | ||
32 | (__LINUX_ARM_ARCH__ == 6 && defined(CONFIG_CPU_32v6K)) | ||
33 | #define tls_emu 0 | ||
34 | #define has_tls_reg 1 | ||
35 | #define set_tls set_tls_v6k | ||
36 | #elif __LINUX_ARM_ARCH__ == 6 | ||
37 | #define tls_emu 0 | ||
38 | #define has_tls_reg (elf_hwcap & HWCAP_TLS) | ||
39 | #define set_tls set_tls_v6 | ||
40 | #else | ||
41 | #define tls_emu 0 | ||
42 | #define has_tls_reg 0 | ||
43 | #define set_tls set_tls_software | ||
44 | #endif | ||
45 | |||
46 | #endif /* __ASMARM_TLS_H */ | ||
diff --git a/arch/arm/include/asm/vfpmacros.h b/arch/arm/include/asm/vfpmacros.h index 422f3cc204a2..3d5fc41ae8d3 100644 --- a/arch/arm/include/asm/vfpmacros.h +++ b/arch/arm/include/asm/vfpmacros.h | |||
@@ -3,6 +3,8 @@ | |||
3 | * | 3 | * |
4 | * Assembler-only file containing VFP macros and register definitions. | 4 | * Assembler-only file containing VFP macros and register definitions. |
5 | */ | 5 | */ |
6 | #include <asm/hwcap.h> | ||
7 | |||
6 | #include "vfp.h" | 8 | #include "vfp.h" |
7 | 9 | ||
8 | @ Macros to allow building with old toolkits (with no VFP support) | 10 | @ Macros to allow building with old toolkits (with no VFP support) |
@@ -22,12 +24,20 @@ | |||
22 | LDC p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d0-d15} | 24 | LDC p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d0-d15} |
23 | #endif | 25 | #endif |
24 | #ifdef CONFIG_VFPv3 | 26 | #ifdef CONFIG_VFPv3 |
27 | #if __LINUX_ARM_ARCH__ <= 6 | ||
28 | ldr \tmp, =elf_hwcap @ may not have MVFR regs | ||
29 | ldr \tmp, [\tmp, #0] | ||
30 | tst \tmp, #HWCAP_VFPv3D16 | ||
31 | ldceq p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31} | ||
32 | addne \base, \base, #32*4 @ step over unused register space | ||
33 | #else | ||
25 | VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0 | 34 | VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0 |
26 | and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field | 35 | and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field |
27 | cmp \tmp, #2 @ 32 x 64bit registers? | 36 | cmp \tmp, #2 @ 32 x 64bit registers? |
28 | ldceql p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31} | 37 | ldceql p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31} |
29 | addne \base, \base, #32*4 @ step over unused register space | 38 | addne \base, \base, #32*4 @ step over unused register space |
30 | #endif | 39 | #endif |
40 | #endif | ||
31 | .endm | 41 | .endm |
32 | 42 | ||
33 | @ write all the working registers out of the VFP | 43 | @ write all the working registers out of the VFP |
@@ -38,10 +48,18 @@ | |||
38 | STC p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d0-d15} | 48 | STC p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d0-d15} |
39 | #endif | 49 | #endif |
40 | #ifdef CONFIG_VFPv3 | 50 | #ifdef CONFIG_VFPv3 |
51 | #if __LINUX_ARM_ARCH__ <= 6 | ||
52 | ldr \tmp, =elf_hwcap @ may not have MVFR regs | ||
53 | ldr \tmp, [\tmp, #0] | ||
54 | tst \tmp, #HWCAP_VFPv3D16 | ||
55 | stceq p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31} | ||
56 | addne \base, \base, #32*4 @ step over unused register space | ||
57 | #else | ||
41 | VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0 | 58 | VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0 |
42 | and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field | 59 | and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field |
43 | cmp \tmp, #2 @ 32 x 64bit registers? | 60 | cmp \tmp, #2 @ 32 x 64bit registers? |
44 | stceql p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31} | 61 | stceql p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31} |
45 | addne \base, \base, #32*4 @ step over unused register space | 62 | addne \base, \base, #32*4 @ step over unused register space |
46 | #endif | 63 | #endif |
64 | #endif | ||
47 | .endm | 65 | .endm |