diff options
author | Jeff Garzik <jeff@garzik.org> | 2006-03-29 17:18:49 -0500 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2006-03-29 17:18:49 -0500 |
commit | e02a4cabfcb9a999b74a2e2e6f13ffcb7ff2d606 (patch) | |
tree | 2f3db60be4c57eca2a4c3ab3f3122dcf1ec0c624 /include | |
parent | 600511e86babe3727264a0883a3a264f6fb6caf5 (diff) | |
parent | f3cab8a0b1a772dc8b055b7affa567a366627c9e (diff) |
Merge branch 'master'
Diffstat (limited to 'include')
389 files changed, 5417 insertions, 7481 deletions
diff --git a/include/asm-alpha/bitops.h b/include/asm-alpha/bitops.h index 302201f1a097..3f88715e811e 100644 --- a/include/asm-alpha/bitops.h +++ b/include/asm-alpha/bitops.h | |||
@@ -261,7 +261,7 @@ static inline unsigned long ffz_b(unsigned long x) | |||
261 | 261 | ||
262 | static inline unsigned long ffz(unsigned long word) | 262 | static inline unsigned long ffz(unsigned long word) |
263 | { | 263 | { |
264 | #if defined(__alpha_cix__) && defined(__alpha_fix__) | 264 | #if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67) |
265 | /* Whee. EV67 can calculate it directly. */ | 265 | /* Whee. EV67 can calculate it directly. */ |
266 | return __kernel_cttz(~word); | 266 | return __kernel_cttz(~word); |
267 | #else | 267 | #else |
@@ -281,7 +281,7 @@ static inline unsigned long ffz(unsigned long word) | |||
281 | */ | 281 | */ |
282 | static inline unsigned long __ffs(unsigned long word) | 282 | static inline unsigned long __ffs(unsigned long word) |
283 | { | 283 | { |
284 | #if defined(__alpha_cix__) && defined(__alpha_fix__) | 284 | #if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67) |
285 | /* Whee. EV67 can calculate it directly. */ | 285 | /* Whee. EV67 can calculate it directly. */ |
286 | return __kernel_cttz(word); | 286 | return __kernel_cttz(word); |
287 | #else | 287 | #else |
@@ -313,20 +313,20 @@ static inline int ffs(int word) | |||
313 | /* | 313 | /* |
314 | * fls: find last bit set. | 314 | * fls: find last bit set. |
315 | */ | 315 | */ |
316 | #if defined(__alpha_cix__) && defined(__alpha_fix__) | 316 | #if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67) |
317 | static inline int fls(int word) | 317 | static inline int fls(int word) |
318 | { | 318 | { |
319 | return 64 - __kernel_ctlz(word & 0xffffffff); | 319 | return 64 - __kernel_ctlz(word & 0xffffffff); |
320 | } | 320 | } |
321 | #else | 321 | #else |
322 | #define fls generic_fls | 322 | #include <asm-generic/bitops/fls.h> |
323 | #endif | 323 | #endif |
324 | #define fls64 generic_fls64 | 324 | #include <asm-generic/bitops/fls64.h> |
325 | 325 | ||
326 | /* Compute powers of two for the given integer. */ | 326 | /* Compute powers of two for the given integer. */ |
327 | static inline long floor_log2(unsigned long word) | 327 | static inline long floor_log2(unsigned long word) |
328 | { | 328 | { |
329 | #if defined(__alpha_cix__) && defined(__alpha_fix__) | 329 | #if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67) |
330 | return 63 - __kernel_ctlz(word); | 330 | return 63 - __kernel_ctlz(word); |
331 | #else | 331 | #else |
332 | long bit; | 332 | long bit; |
@@ -347,7 +347,7 @@ static inline long ceil_log2(unsigned long word) | |||
347 | * of bits set) of a N-bit word | 347 | * of bits set) of a N-bit word |
348 | */ | 348 | */ |
349 | 349 | ||
350 | #if defined(__alpha_cix__) && defined(__alpha_fix__) | 350 | #if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67) |
351 | /* Whee. EV67 can calculate it directly. */ | 351 | /* Whee. EV67 can calculate it directly. */ |
352 | static inline unsigned long hweight64(unsigned long w) | 352 | static inline unsigned long hweight64(unsigned long w) |
353 | { | 353 | { |
@@ -358,112 +358,12 @@ static inline unsigned long hweight64(unsigned long w) | |||
358 | #define hweight16(x) (unsigned int) hweight64((x) & 0xfffful) | 358 | #define hweight16(x) (unsigned int) hweight64((x) & 0xfffful) |
359 | #define hweight8(x) (unsigned int) hweight64((x) & 0xfful) | 359 | #define hweight8(x) (unsigned int) hweight64((x) & 0xfful) |
360 | #else | 360 | #else |
361 | static inline unsigned long hweight64(unsigned long w) | 361 | #include <asm-generic/bitops/hweight.h> |
362 | { | ||
363 | unsigned long result; | ||
364 | for (result = 0; w ; w >>= 1) | ||
365 | result += (w & 1); | ||
366 | return result; | ||
367 | } | ||
368 | |||
369 | #define hweight32(x) generic_hweight32(x) | ||
370 | #define hweight16(x) generic_hweight16(x) | ||
371 | #define hweight8(x) generic_hweight8(x) | ||
372 | #endif | 362 | #endif |
373 | 363 | ||
374 | #endif /* __KERNEL__ */ | 364 | #endif /* __KERNEL__ */ |
375 | 365 | ||
376 | /* | 366 | #include <asm-generic/bitops/find.h> |
377 | * Find next zero bit in a bitmap reasonably efficiently.. | ||
378 | */ | ||
379 | static inline unsigned long | ||
380 | find_next_zero_bit(const void *addr, unsigned long size, unsigned long offset) | ||
381 | { | ||
382 | const unsigned long *p = addr; | ||
383 | unsigned long result = offset & ~63UL; | ||
384 | unsigned long tmp; | ||
385 | |||
386 | p += offset >> 6; | ||
387 | if (offset >= size) | ||
388 | return size; | ||
389 | size -= result; | ||
390 | offset &= 63UL; | ||
391 | if (offset) { | ||
392 | tmp = *(p++); | ||
393 | tmp |= ~0UL >> (64-offset); | ||
394 | if (size < 64) | ||
395 | goto found_first; | ||
396 | if (~tmp) | ||
397 | goto found_middle; | ||
398 | size -= 64; | ||
399 | result += 64; | ||
400 | } | ||
401 | while (size & ~63UL) { | ||
402 | if (~(tmp = *(p++))) | ||
403 | goto found_middle; | ||
404 | result += 64; | ||
405 | size -= 64; | ||
406 | } | ||
407 | if (!size) | ||
408 | return result; | ||
409 | tmp = *p; | ||
410 | found_first: | ||
411 | tmp |= ~0UL << size; | ||
412 | if (tmp == ~0UL) /* Are any bits zero? */ | ||
413 | return result + size; /* Nope. */ | ||
414 | found_middle: | ||
415 | return result + ffz(tmp); | ||
416 | } | ||
417 | |||
418 | /* | ||
419 | * Find next one bit in a bitmap reasonably efficiently. | ||
420 | */ | ||
421 | static inline unsigned long | ||
422 | find_next_bit(const void * addr, unsigned long size, unsigned long offset) | ||
423 | { | ||
424 | const unsigned long *p = addr; | ||
425 | unsigned long result = offset & ~63UL; | ||
426 | unsigned long tmp; | ||
427 | |||
428 | p += offset >> 6; | ||
429 | if (offset >= size) | ||
430 | return size; | ||
431 | size -= result; | ||
432 | offset &= 63UL; | ||
433 | if (offset) { | ||
434 | tmp = *(p++); | ||
435 | tmp &= ~0UL << offset; | ||
436 | if (size < 64) | ||
437 | goto found_first; | ||
438 | if (tmp) | ||
439 | goto found_middle; | ||
440 | size -= 64; | ||
441 | result += 64; | ||
442 | } | ||
443 | while (size & ~63UL) { | ||
444 | if ((tmp = *(p++))) | ||
445 | goto found_middle; | ||
446 | result += 64; | ||
447 | size -= 64; | ||
448 | } | ||
449 | if (!size) | ||
450 | return result; | ||
451 | tmp = *p; | ||
452 | found_first: | ||
453 | tmp &= ~0UL >> (64 - size); | ||
454 | if (!tmp) | ||
455 | return result + size; | ||
456 | found_middle: | ||
457 | return result + __ffs(tmp); | ||
458 | } | ||
459 | |||
460 | /* | ||
461 | * The optimizer actually does good code for this case. | ||
462 | */ | ||
463 | #define find_first_zero_bit(addr, size) \ | ||
464 | find_next_zero_bit((addr), (size), 0) | ||
465 | #define find_first_bit(addr, size) \ | ||
466 | find_next_bit((addr), (size), 0) | ||
467 | 367 | ||
468 | #ifdef __KERNEL__ | 368 | #ifdef __KERNEL__ |
469 | 369 | ||
@@ -487,21 +387,12 @@ sched_find_first_bit(unsigned long b[3]) | |||
487 | return __ffs(b0) + ofs; | 387 | return __ffs(b0) + ofs; |
488 | } | 388 | } |
489 | 389 | ||
390 | #include <asm-generic/bitops/ext2-non-atomic.h> | ||
490 | 391 | ||
491 | #define ext2_set_bit __test_and_set_bit | ||
492 | #define ext2_set_bit_atomic(l,n,a) test_and_set_bit(n,a) | 392 | #define ext2_set_bit_atomic(l,n,a) test_and_set_bit(n,a) |
493 | #define ext2_clear_bit __test_and_clear_bit | ||
494 | #define ext2_clear_bit_atomic(l,n,a) test_and_clear_bit(n,a) | 393 | #define ext2_clear_bit_atomic(l,n,a) test_and_clear_bit(n,a) |
495 | #define ext2_test_bit test_bit | 394 | |
496 | #define ext2_find_first_zero_bit find_first_zero_bit | 395 | #include <asm-generic/bitops/minix.h> |
497 | #define ext2_find_next_zero_bit find_next_zero_bit | ||
498 | |||
499 | /* Bitmap functions for the minix filesystem. */ | ||
500 | #define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,addr) | ||
501 | #define minix_set_bit(nr,addr) __set_bit(nr,addr) | ||
502 | #define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit(nr,addr) | ||
503 | #define minix_test_bit(nr,addr) test_bit(nr,addr) | ||
504 | #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) | ||
505 | 396 | ||
506 | #endif /* __KERNEL__ */ | 397 | #endif /* __KERNEL__ */ |
507 | 398 | ||
diff --git a/include/asm-alpha/fpu.h b/include/asm-alpha/fpu.h index c203fc2fa5cd..ecb17a72acc3 100644 --- a/include/asm-alpha/fpu.h +++ b/include/asm-alpha/fpu.h | |||
@@ -130,7 +130,7 @@ rdfpcr(void) | |||
130 | { | 130 | { |
131 | unsigned long tmp, ret; | 131 | unsigned long tmp, ret; |
132 | 132 | ||
133 | #if defined(__alpha_cix__) || defined(__alpha_fix__) | 133 | #if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67) |
134 | __asm__ __volatile__ ( | 134 | __asm__ __volatile__ ( |
135 | "ftoit $f0,%0\n\t" | 135 | "ftoit $f0,%0\n\t" |
136 | "mf_fpcr $f0\n\t" | 136 | "mf_fpcr $f0\n\t" |
@@ -154,7 +154,7 @@ wrfpcr(unsigned long val) | |||
154 | { | 154 | { |
155 | unsigned long tmp; | 155 | unsigned long tmp; |
156 | 156 | ||
157 | #if defined(__alpha_cix__) || defined(__alpha_fix__) | 157 | #if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67) |
158 | __asm__ __volatile__ ( | 158 | __asm__ __volatile__ ( |
159 | "ftoit $f0,%0\n\t" | 159 | "ftoit $f0,%0\n\t" |
160 | "itoft %1,$f0\n\t" | 160 | "itoft %1,$f0\n\t" |
diff --git a/include/asm-alpha/mmzone.h b/include/asm-alpha/mmzone.h index a011ef4cf3d3..192d80c875b0 100644 --- a/include/asm-alpha/mmzone.h +++ b/include/asm-alpha/mmzone.h | |||
@@ -59,9 +59,6 @@ PLAT_NODE_DATA_LOCALNR(unsigned long p, int n) | |||
59 | #define kvaddr_to_nid(kaddr) pa_to_nid(__pa(kaddr)) | 59 | #define kvaddr_to_nid(kaddr) pa_to_nid(__pa(kaddr)) |
60 | #define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn) | 60 | #define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn) |
61 | 61 | ||
62 | #define local_mapnr(kvaddr) \ | ||
63 | ((__pa(kvaddr) >> PAGE_SHIFT) - node_start_pfn(kvaddr_to_nid(kvaddr))) | ||
64 | |||
65 | /* | 62 | /* |
66 | * Given a kaddr, LOCAL_BASE_ADDR finds the owning node of the memory | 63 | * Given a kaddr, LOCAL_BASE_ADDR finds the owning node of the memory |
67 | * and returns the kaddr corresponding to first physical page in the | 64 | * and returns the kaddr corresponding to first physical page in the |
@@ -86,8 +83,7 @@ PLAT_NODE_DATA_LOCALNR(unsigned long p, int n) | |||
86 | pte_t pte; \ | 83 | pte_t pte; \ |
87 | unsigned long pfn; \ | 84 | unsigned long pfn; \ |
88 | \ | 85 | \ |
89 | pfn = ((unsigned long)((page)-page_zone(page)->zone_mem_map)) << 32; \ | 86 | pfn = page_to_pfn(page) << 32; \ |
90 | pfn += page_zone(page)->zone_start_pfn << 32; \ | ||
91 | pte_val(pte) = pfn | pgprot_val(pgprot); \ | 87 | pte_val(pte) = pfn | pgprot_val(pgprot); \ |
92 | \ | 88 | \ |
93 | pte; \ | 89 | pte; \ |
@@ -104,19 +100,8 @@ PLAT_NODE_DATA_LOCALNR(unsigned long p, int n) | |||
104 | __xx; \ | 100 | __xx; \ |
105 | }) | 101 | }) |
106 | 102 | ||
107 | #define pfn_to_page(pfn) \ | ||
108 | ({ \ | ||
109 | unsigned long kaddr = (unsigned long)__va((pfn) << PAGE_SHIFT); \ | ||
110 | (NODE_DATA(kvaddr_to_nid(kaddr))->node_mem_map + local_mapnr(kaddr)); \ | ||
111 | }) | ||
112 | |||
113 | #define page_to_pfn(page) \ | ||
114 | ((page) - page_zone(page)->zone_mem_map + \ | ||
115 | (page_zone(page)->zone_start_pfn)) | ||
116 | |||
117 | #define page_to_pa(page) \ | 103 | #define page_to_pa(page) \ |
118 | ((( (page) - page_zone(page)->zone_mem_map ) \ | 104 | (page_to_pfn(page) << PAGE_SHIFT) |
119 | + page_zone(page)->zone_start_pfn) << PAGE_SHIFT) | ||
120 | 105 | ||
121 | #define pfn_to_nid(pfn) pa_to_nid(((u64)(pfn) << PAGE_SHIFT)) | 106 | #define pfn_to_nid(pfn) pa_to_nid(((u64)(pfn) << PAGE_SHIFT)) |
122 | #define pfn_valid(pfn) \ | 107 | #define pfn_valid(pfn) \ |
diff --git a/include/asm-alpha/page.h b/include/asm-alpha/page.h index fa0b41b164a7..61bcf70b5eac 100644 --- a/include/asm-alpha/page.h +++ b/include/asm-alpha/page.h | |||
@@ -85,8 +85,6 @@ typedef unsigned long pgprot_t; | |||
85 | #define __pa(x) ((unsigned long) (x) - PAGE_OFFSET) | 85 | #define __pa(x) ((unsigned long) (x) - PAGE_OFFSET) |
86 | #define __va(x) ((void *)((unsigned long) (x) + PAGE_OFFSET)) | 86 | #define __va(x) ((void *)((unsigned long) (x) + PAGE_OFFSET)) |
87 | #ifndef CONFIG_DISCONTIGMEM | 87 | #ifndef CONFIG_DISCONTIGMEM |
88 | #define pfn_to_page(pfn) (mem_map + (pfn)) | ||
89 | #define page_to_pfn(page) ((unsigned long)((page) - mem_map)) | ||
90 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) | 88 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) |
91 | 89 | ||
92 | #define pfn_valid(pfn) ((pfn) < max_mapnr) | 90 | #define pfn_valid(pfn) ((pfn) < max_mapnr) |
@@ -95,9 +93,9 @@ typedef unsigned long pgprot_t; | |||
95 | 93 | ||
96 | #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ | 94 | #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ |
97 | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) | 95 | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) |
98 | |||
99 | #endif /* __KERNEL__ */ | 96 | #endif /* __KERNEL__ */ |
100 | 97 | ||
98 | #include <asm-generic/memory_model.h> | ||
101 | #include <asm-generic/page.h> | 99 | #include <asm-generic/page.h> |
102 | 100 | ||
103 | #endif /* _ALPHA_PAGE_H */ | 101 | #endif /* _ALPHA_PAGE_H */ |
diff --git a/include/asm-alpha/poll.h b/include/asm-alpha/poll.h index 34f333b762a0..76f89356b6a7 100644 --- a/include/asm-alpha/poll.h +++ b/include/asm-alpha/poll.h | |||
@@ -12,7 +12,9 @@ | |||
12 | #define POLLWRNORM (1 << 8) | 12 | #define POLLWRNORM (1 << 8) |
13 | #define POLLWRBAND (1 << 9) | 13 | #define POLLWRBAND (1 << 9) |
14 | #define POLLMSG (1 << 10) | 14 | #define POLLMSG (1 << 10) |
15 | #define POLLREMOVE (1 << 11) | 15 | #define POLLREMOVE (1 << 12) |
16 | #define POLLRDHUP (1 << 13) | ||
17 | |||
16 | 18 | ||
17 | struct pollfd { | 19 | struct pollfd { |
18 | int fd; | 20 | int fd; |
diff --git a/include/asm-arm/arch-aaec2000/uncompress.h b/include/asm-arm/arch-aaec2000/uncompress.h index fff0c94b75c4..300f4bf3bc74 100644 --- a/include/asm-arm/arch-aaec2000/uncompress.h +++ b/include/asm-arm/arch-aaec2000/uncompress.h | |||
@@ -15,7 +15,7 @@ | |||
15 | 15 | ||
16 | #define UART(x) (*(volatile unsigned long *)(serial_port + (x))) | 16 | #define UART(x) (*(volatile unsigned long *)(serial_port + (x))) |
17 | 17 | ||
18 | static void putstr( const char *s ) | 18 | static void putc(int c) |
19 | { | 19 | { |
20 | unsigned long serial_port; | 20 | unsigned long serial_port; |
21 | do { | 21 | do { |
@@ -28,17 +28,16 @@ static void putstr( const char *s ) | |||
28 | return; | 28 | return; |
29 | } while (0); | 29 | } while (0); |
30 | 30 | ||
31 | for (; *s; s++) { | 31 | /* wait for space in the UART's transmitter */ |
32 | /* wait for space in the UART's transmitter */ | 32 | while ((UART(UART_SR) & UART_SR_TxFF)) |
33 | while ((UART(UART_SR) & UART_SR_TxFF)); | 33 | barrier(); |
34 | /* send the character out. */ | 34 | |
35 | UART(UART_DR) = *s; | 35 | /* send the character out. */ |
36 | /* if a LF, also do CR... */ | 36 | UART(UART_DR) = c; |
37 | if (*s == 10) { | 37 | } |
38 | while ((UART(UART_SR) & UART_SR_TxFF)); | 38 | |
39 | UART(UART_DR) = 13; | 39 | static inline void flush(void) |
40 | } | 40 | { |
41 | } | ||
42 | } | 41 | } |
43 | 42 | ||
44 | #define arch_decomp_setup() | 43 | #define arch_decomp_setup() |
diff --git a/include/asm-arm/arch-at91rm9200/at91rm9200_emac.h b/include/asm-arm/arch-at91rm9200/at91rm9200_emac.h new file mode 100644 index 000000000000..fbc091e61e2f --- /dev/null +++ b/include/asm-arm/arch-at91rm9200/at91rm9200_emac.h | |||
@@ -0,0 +1,138 @@ | |||
1 | /* | ||
2 | * include/asm-arm/arch-at91rm9200/at91rm9200_emac.h | ||
3 | * | ||
4 | * Copyright (C) 2005 Ivan Kokshaysky | ||
5 | * Copyright (C) SAN People | ||
6 | * | ||
7 | * Ethernet MAC registers. | ||
8 | * Based on AT91RM9200 datasheet revision E. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License as published by | ||
12 | * the Free Software Foundation; either version 2 of the License, or | ||
13 | * (at your option) any later version. | ||
14 | */ | ||
15 | |||
16 | #ifndef AT91RM9200_EMAC_H | ||
17 | #define AT91RM9200_EMAC_H | ||
18 | |||
19 | #define AT91_EMAC_CTL 0x00 /* Control Register */ | ||
20 | #define AT91_EMAC_LB (1 << 0) /* Loopback */ | ||
21 | #define AT91_EMAC_LBL (1 << 1) /* Loopback Local */ | ||
22 | #define AT91_EMAC_RE (1 << 2) /* Receive Enable */ | ||
23 | #define AT91_EMAC_TE (1 << 3) /* Transmit Enable */ | ||
24 | #define AT91_EMAC_MPE (1 << 4) /* Management Port Enable */ | ||
25 | #define AT91_EMAC_CSR (1 << 5) /* Clear Statistics Registers */ | ||
26 | #define AT91_EMAC_INCSTAT (1 << 6) /* Increment Statistics Registers */ | ||
27 | #define AT91_EMAC_WES (1 << 7) /* Write Enable for Statistics Registers */ | ||
28 | #define AT91_EMAC_BP (1 << 8) /* Back Pressure */ | ||
29 | |||
30 | #define AT91_EMAC_CFG 0x04 /* Configuration Register */ | ||
31 | #define AT91_EMAC_SPD (1 << 0) /* Speed */ | ||
32 | #define AT91_EMAC_FD (1 << 1) /* Full Duplex */ | ||
33 | #define AT91_EMAC_BR (1 << 2) /* Bit Rate */ | ||
34 | #define AT91_EMAC_CAF (1 << 4) /* Copy All Frames */ | ||
35 | #define AT91_EMAC_NBC (1 << 5) /* No Broadcast */ | ||
36 | #define AT91_EMAC_MTI (1 << 6) /* Multicast Hash Enable */ | ||
37 | #define AT91_EMAC_UNI (1 << 7) /* Unicast Hash Enable */ | ||
38 | #define AT91_EMAC_BIG (1 << 8) /* Receive 1522 Bytes */ | ||
39 | #define AT91_EMAC_EAE (1 << 9) /* External Address Match Enable */ | ||
40 | #define AT91_EMAC_CLK (3 << 10) /* MDC Clock Divisor */ | ||
41 | #define AT91_EMAC_CLK_DIV8 (0 << 10) | ||
42 | #define AT91_EMAC_CLK_DIV16 (1 << 10) | ||
43 | #define AT91_EMAC_CLK_DIV32 (2 << 10) | ||
44 | #define AT91_EMAC_CLK_DIV64 (3 << 10) | ||
45 | #define AT91_EMAC_RTY (1 << 12) /* Retry Test */ | ||
46 | #define AT91_EMAC_RMII (1 << 13) /* Reduce MII (RMII) */ | ||
47 | |||
48 | #define AT91_EMAC_SR 0x08 /* Status Register */ | ||
49 | #define AT91_EMAC_SR_LINK (1 << 0) /* Link */ | ||
50 | #define AT91_EMAC_SR_MDIO (1 << 1) /* MDIO pin */ | ||
51 | #define AT91_EMAC_SR_IDLE (1 << 2) /* PHY idle */ | ||
52 | |||
53 | #define AT91_EMAC_TAR 0x0c /* Transmit Address Register */ | ||
54 | |||
55 | #define AT91_EMAC_TCR 0x10 /* Transmit Control Register */ | ||
56 | #define AT91_EMAC_LEN (0x7ff << 0) /* Transmit Frame Length */ | ||
57 | #define AT91_EMAC_NCRC (1 << 15) /* No CRC */ | ||
58 | |||
59 | #define AT91_EMAC_TSR 0x14 /* Transmit Status Register */ | ||
60 | #define AT91_EMAC_TSR_OVR (1 << 0) /* Transmit Buffer Overrun */ | ||
61 | #define AT91_EMAC_TSR_COL (1 << 1) /* Collision Occurred */ | ||
62 | #define AT91_EMAC_TSR_RLE (1 << 2) /* Retry Limit Exceeded */ | ||
63 | #define AT91_EMAC_TSR_IDLE (1 << 3) /* Transmitter Idle */ | ||
64 | #define AT91_EMAC_TSR_BNQ (1 << 4) /* Transmit Buffer not Queued */ | ||
65 | #define AT91_EMAC_TSR_COMP (1 << 5) /* Transmit Complete */ | ||
66 | #define AT91_EMAC_TSR_UND (1 << 6) /* Transmit Underrun */ | ||
67 | |||
68 | #define AT91_EMAC_RBQP 0x18 /* Receive Buffer Queue Pointer */ | ||
69 | |||
70 | #define AT91_EMAC_RSR 0x20 /* Receive Status Register */ | ||
71 | #define AT91_EMAC_RSR_BNA (1 << 0) /* Buffer Not Available */ | ||
72 | #define AT91_EMAC_RSR_REC (1 << 1) /* Frame Received */ | ||
73 | #define AT91_EMAC_RSR_OVR (1 << 2) /* RX Overrun */ | ||
74 | |||
75 | #define AT91_EMAC_ISR 0x24 /* Interrupt Status Register */ | ||
76 | #define AT91_EMAC_DONE (1 << 0) /* Management Done */ | ||
77 | #define AT91_EMAC_RCOM (1 << 1) /* Receive Complete */ | ||
78 | #define AT91_EMAC_RBNA (1 << 2) /* Receive Buffer Not Available */ | ||
79 | #define AT91_EMAC_TOVR (1 << 3) /* Transmit Buffer Overrun */ | ||
80 | #define AT91_EMAC_TUND (1 << 4) /* Transmit Buffer Underrun */ | ||
81 | #define AT91_EMAC_RTRY (1 << 5) /* Retry Limit */ | ||
82 | #define AT91_EMAC_TBRE (1 << 6) /* Transmit Buffer Register Empty */ | ||
83 | #define AT91_EMAC_TCOM (1 << 7) /* Transmit Complete */ | ||
84 | #define AT91_EMAC_TIDLE (1 << 8) /* Transmit Idle */ | ||
85 | #define AT91_EMAC_LINK (1 << 9) /* Link */ | ||
86 | #define AT91_EMAC_ROVR (1 << 10) /* RX Overrun */ | ||
87 | #define AT91_EMAC_ABT (1 << 11) /* Abort */ | ||
88 | |||
89 | #define AT91_EMAC_IER 0x28 /* Interrupt Enable Register */ | ||
90 | #define AT91_EMAC_IDR 0x2c /* Interrupt Disable Register */ | ||
91 | #define AT91_EMAC_IMR 0x30 /* Interrupt Mask Register */ | ||
92 | |||
93 | #define AT91_EMAC_MAN 0x34 /* PHY Maintenance Register */ | ||
94 | #define AT91_EMAC_DATA (0xffff << 0) /* MDIO Data */ | ||
95 | #define AT91_EMAC_REGA (0x1f << 18) /* MDIO Register */ | ||
96 | #define AT91_EMAC_PHYA (0x1f << 23) /* MDIO PHY Address */ | ||
97 | #define AT91_EMAC_RW (3 << 28) /* Read/Write operation */ | ||
98 | #define AT91_EMAC_RW_W (1 << 28) | ||
99 | #define AT91_EMAC_RW_R (2 << 28) | ||
100 | #define AT91_EMAC_MAN_802_3 0x40020000 /* IEEE 802.3 value */ | ||
101 | |||
102 | /* | ||
103 | * Statistics Registers. | ||
104 | */ | ||
105 | #define AT91_EMAC_FRA 0x40 /* Frames Transmitted OK */ | ||
106 | #define AT91_EMAC_SCOL 0x44 /* Single Collision Frame */ | ||
107 | #define AT91_EMAC_MCOL 0x48 /* Multiple Collision Frame */ | ||
108 | #define AT91_EMAC_OK 0x4c /* Frames Received OK */ | ||
109 | #define AT91_EMAC_SEQE 0x50 /* Frame Check Sequence Error */ | ||
110 | #define AT91_EMAC_ALE 0x54 /* Alignmemt Error */ | ||
111 | #define AT91_EMAC_DTE 0x58 /* Deffered Transmission Frame */ | ||
112 | #define AT91_EMAC_LCOL 0x5c /* Late Collision */ | ||
113 | #define AT91_EMAC_ECOL 0x60 /* Excessive Collision */ | ||
114 | #define AT91_EMAC_TUE 0x64 /* Transmit Underrun Error */ | ||
115 | #define AT91_EMAC_CSE 0x68 /* Carrier Sense Error */ | ||
116 | #define AT91_EMAC_DRFC 0x6c /* Discard RX Frame */ | ||
117 | #define AT91_EMAC_ROV 0x70 /* Receive Overrun */ | ||
118 | #define AT91_EMAC_CDE 0x74 /* Code Error */ | ||
119 | #define AT91_EMAC_ELR 0x78 /* Excessive Length Error */ | ||
120 | #define AT91_EMAC_RJB 0x7c /* Receive Jabber */ | ||
121 | #define AT91_EMAC_USF 0x80 /* Undersize Frame */ | ||
122 | #define AT91_EMAC_SQEE 0x84 /* SQE Test Error */ | ||
123 | |||
124 | /* | ||
125 | * Address Registers. | ||
126 | */ | ||
127 | #define AT91_EMAC_HSL 0x90 /* Hash Address Low [31:0] */ | ||
128 | #define AT91_EMAC_HSH 0x94 /* Hash Address High [63:32] */ | ||
129 | #define AT91_EMAC_SA1L 0x98 /* Specific Address 1 Low, bytes 0-3 */ | ||
130 | #define AT91_EMAC_SA1H 0x9c /* Specific Address 1 High, bytes 4-5 */ | ||
131 | #define AT91_EMAC_SA2L 0xa0 /* Specific Address 2 Low, bytes 0-3 */ | ||
132 | #define AT91_EMAC_SA2H 0xa4 /* Specific Address 2 High, bytes 4-5 */ | ||
133 | #define AT91_EMAC_SA3L 0xa8 /* Specific Address 3 Low, bytes 0-3 */ | ||
134 | #define AT91_EMAC_SA3H 0xac /* Specific Address 3 High, bytes 4-5 */ | ||
135 | #define AT91_EMAC_SA4L 0xb0 /* Specific Address 4 Low, bytes 0-3 */ | ||
136 | #define AT91_EMAC_SA4H 0xb4 /* Specific Address 4 High, bytes 4-5 */ | ||
137 | |||
138 | #endif | ||
diff --git a/include/asm-arm/arch-at91rm9200/at91rm9200_sys.h b/include/asm-arm/arch-at91rm9200/at91rm9200_sys.h index 9bfffdbf1e0b..2910d359f919 100644 --- a/include/asm-arm/arch-at91rm9200/at91rm9200_sys.h +++ b/include/asm-arm/arch-at91rm9200/at91rm9200_sys.h | |||
@@ -172,6 +172,7 @@ | |||
172 | #define AT91_PMC_MDIV_4 (3 << 8) | 172 | #define AT91_PMC_MDIV_4 (3 << 8) |
173 | 173 | ||
174 | #define AT91_PMC_PCKR(n) (AT91_PMC + 0x40 + ((n) * 4)) /* Programmable Clock 0-3 Registers */ | 174 | #define AT91_PMC_PCKR(n) (AT91_PMC + 0x40 + ((n) * 4)) /* Programmable Clock 0-3 Registers */ |
175 | |||
175 | #define AT91_PMC_IER (AT91_PMC + 0x60) /* Interrupt Enable Register */ | 176 | #define AT91_PMC_IER (AT91_PMC + 0x60) /* Interrupt Enable Register */ |
176 | #define AT91_PMC_IDR (AT91_PMC + 0x64) /* Interrupt Disable Register */ | 177 | #define AT91_PMC_IDR (AT91_PMC + 0x64) /* Interrupt Disable Register */ |
177 | #define AT91_PMC_SR (AT91_PMC + 0x68) /* Status Register */ | 178 | #define AT91_PMC_SR (AT91_PMC + 0x68) /* Status Register */ |
@@ -286,8 +287,32 @@ | |||
286 | #define AT91_MC_RCB (1 << 0) /* Remap Command Bit */ | 287 | #define AT91_MC_RCB (1 << 0) /* Remap Command Bit */ |
287 | 288 | ||
288 | #define AT91_MC_ASR (AT91_MC + 0x04) /* MC Abort Status Register */ | 289 | #define AT91_MC_ASR (AT91_MC + 0x04) /* MC Abort Status Register */ |
290 | #define AT91_MC_UNADD (1 << 0) /* Undefined Address Abort Status */ | ||
291 | #define AT91_MC_MISADD (1 << 1) /* Misaligned Address Abort Status */ | ||
292 | #define AT91_MC_ABTSZ (3 << 8) /* Abort Size Status */ | ||
293 | #define AT91_MC_ABTSZ_BYTE (0 << 8) | ||
294 | #define AT91_MC_ABTSZ_HALFWORD (1 << 8) | ||
295 | #define AT91_MC_ABTSZ_WORD (2 << 8) | ||
296 | #define AT91_MC_ABTTYP (3 << 10) /* Abort Type Status */ | ||
297 | #define AT91_MC_ABTTYP_DATAREAD (0 << 10) | ||
298 | #define AT91_MC_ABTTYP_DATAWRITE (1 << 10) | ||
299 | #define AT91_MC_ABTTYP_FETCH (2 << 10) | ||
300 | #define AT91_MC_MST0 (1 << 16) /* ARM920T Abort Source */ | ||
301 | #define AT91_MC_MST1 (1 << 17) /* PDC Abort Source */ | ||
302 | #define AT91_MC_MST2 (1 << 18) /* UHP Abort Source */ | ||
303 | #define AT91_MC_MST3 (1 << 19) /* EMAC Abort Source */ | ||
304 | #define AT91_MC_SVMST0 (1 << 24) /* Saved ARM920T Abort Source */ | ||
305 | #define AT91_MC_SVMST1 (1 << 25) /* Saved PDC Abort Source */ | ||
306 | #define AT91_MC_SVMST2 (1 << 26) /* Saved UHP Abort Source */ | ||
307 | #define AT91_MC_SVMST3 (1 << 27) /* Saved EMAC Abort Source */ | ||
308 | |||
289 | #define AT91_MC_AASR (AT91_MC + 0x08) /* MC Abort Address Status Register */ | 309 | #define AT91_MC_AASR (AT91_MC + 0x08) /* MC Abort Address Status Register */ |
310 | |||
290 | #define AT91_MC_MPR (AT91_MC + 0x0c) /* MC Master Priority Register */ | 311 | #define AT91_MC_MPR (AT91_MC + 0x0c) /* MC Master Priority Register */ |
312 | #define AT91_MPR_MSTP0 (7 << 0) /* ARM920T Priority */ | ||
313 | #define AT91_MPR_MSTP1 (7 << 4) /* PDC Priority */ | ||
314 | #define AT91_MPR_MSTP2 (7 << 8) /* UHP Priority */ | ||
315 | #define AT91_MPR_MSTP3 (7 << 12) /* EMAC Priority */ | ||
291 | 316 | ||
292 | /* External Bus Interface (EBI) registers */ | 317 | /* External Bus Interface (EBI) registers */ |
293 | #define AT91_EBI_CSA (AT91_MC + 0x60) /* Chip Select Assignment Register */ | 318 | #define AT91_EBI_CSA (AT91_MC + 0x60) /* Chip Select Assignment Register */ |
@@ -309,8 +334,10 @@ | |||
309 | /* Static Memory Controller (SMC) registers */ | 334 | /* Static Memory Controller (SMC) registers */ |
310 | #define AT91_SMC_CSR(n) (AT91_MC + 0x70 + ((n) * 4))/* SMC Chip Select Register */ | 335 | #define AT91_SMC_CSR(n) (AT91_MC + 0x70 + ((n) * 4))/* SMC Chip Select Register */ |
311 | #define AT91_SMC_NWS (0x7f << 0) /* Number of Wait States */ | 336 | #define AT91_SMC_NWS (0x7f << 0) /* Number of Wait States */ |
337 | #define AT91_SMC_NWS_(x) ((x) << 0) | ||
312 | #define AT91_SMC_WSEN (1 << 7) /* Wait State Enable */ | 338 | #define AT91_SMC_WSEN (1 << 7) /* Wait State Enable */ |
313 | #define AT91_SMC_TDF (0xf << 8) /* Data Float Time */ | 339 | #define AT91_SMC_TDF (0xf << 8) /* Data Float Time */ |
340 | #define AT91_SMC_TDF_(x) ((x) << 8) | ||
314 | #define AT91_SMC_BAT (1 << 12) /* Byte Access Type */ | 341 | #define AT91_SMC_BAT (1 << 12) /* Byte Access Type */ |
315 | #define AT91_SMC_DBW (3 << 13) /* Data Bus Width */ | 342 | #define AT91_SMC_DBW (3 << 13) /* Data Bus Width */ |
316 | #define AT91_SMC_DBW_16 (1 << 13) | 343 | #define AT91_SMC_DBW_16 (1 << 13) |
@@ -322,7 +349,78 @@ | |||
322 | #define AT91_SMC_ACSS_2 (2 << 16) | 349 | #define AT91_SMC_ACSS_2 (2 << 16) |
323 | #define AT91_SMC_ACSS_3 (3 << 16) | 350 | #define AT91_SMC_ACSS_3 (3 << 16) |
324 | #define AT91_SMC_RWSETUP (7 << 24) /* Read & Write Signal Time Setup */ | 351 | #define AT91_SMC_RWSETUP (7 << 24) /* Read & Write Signal Time Setup */ |
352 | #define AT91_SMC_RWSETUP_(x) ((x) << 24) | ||
325 | #define AT91_SMC_RWHOLD (7 << 28) /* Read & Write Signal Hold Time */ | 353 | #define AT91_SMC_RWHOLD (7 << 28) /* Read & Write Signal Hold Time */ |
326 | 354 | #define AT91_SMC_RWHOLD_(x) ((x) << 28) | |
355 | |||
356 | /* SDRAM Controller registers */ | ||
357 | #define AT91_SDRAMC_MR (AT91_MC + 0x90) /* Mode Register */ | ||
358 | #define AT91_SDRAMC_MODE (0xf << 0) /* Command Mode */ | ||
359 | #define AT91_SDRAMC_MODE_NORMAL (0 << 0) | ||
360 | #define AT91_SDRAMC_MODE_NOP (1 << 0) | ||
361 | #define AT91_SDRAMC_MODE_PRECHARGE (2 << 0) | ||
362 | #define AT91_SDRAMC_MODE_LMR (3 << 0) | ||
363 | #define AT91_SDRAMC_MODE_REFRESH (4 << 0) | ||
364 | #define AT91_SDRAMC_DBW (1 << 4) /* Data Bus Width */ | ||
365 | #define AT91_SDRAMC_DBW_32 (0 << 4) | ||
366 | #define AT91_SDRAMC_DBW_16 (1 << 4) | ||
367 | |||
368 | #define AT91_SDRAMC_TR (AT91_MC + 0x94) /* Refresh Timer Register */ | ||
369 | #define AT91_SDRAMC_COUNT (0xfff << 0) /* Refresh Timer Count */ | ||
370 | |||
371 | #define AT91_SDRAMC_CR (AT91_MC + 0x98) /* Configuration Register */ | ||
372 | #define AT91_SDRAMC_NC (3 << 0) /* Number of Column Bits */ | ||
373 | #define AT91_SDRAMC_NC_8 (0 << 0) | ||
374 | #define AT91_SDRAMC_NC_9 (1 << 0) | ||
375 | #define AT91_SDRAMC_NC_10 (2 << 0) | ||
376 | #define AT91_SDRAMC_NC_11 (3 << 0) | ||
377 | #define AT91_SDRAMC_NR (3 << 2) /* Number of Row Bits */ | ||
378 | #define AT91_SDRAMC_NR_11 (0 << 2) | ||
379 | #define AT91_SDRAMC_NR_12 (1 << 2) | ||
380 | #define AT91_SDRAMC_NR_13 (2 << 2) | ||
381 | #define AT91_SDRAMC_NB (1 << 4) /* Number of Banks */ | ||
382 | #define AT91_SDRAMC_NB_2 (0 << 4) | ||
383 | #define AT91_SDRAMC_NB_4 (1 << 4) | ||
384 | #define AT91_SDRAMC_CAS (3 << 5) /* CAS Latency */ | ||
385 | #define AT91_SDRAMC_CAS_2 (2 << 5) | ||
386 | #define AT91_SDRAMC_TWR (0xf << 7) /* Write Recovery Delay */ | ||
387 | #define AT91_SDRAMC_TRC (0xf << 11) /* Row Cycle Delay */ | ||
388 | #define AT91_SDRAMC_TRP (0xf << 15) /* Row Precharge Delay */ | ||
389 | #define AT91_SDRAMC_TRCD (0xf << 19) /* Row to Column Delay */ | ||
390 | #define AT91_SDRAMC_TRAS (0xf << 23) /* Active to Precharge Delay */ | ||
391 | #define AT91_SDRAMC_TXSR (0xf << 27) /* Exit Self Refresh to Active Delay */ | ||
392 | |||
393 | #define AT91_SDRAMC_SRR (AT91_MC + 0x9c) /* Self Refresh Register */ | ||
394 | #define AT91_SDRAMC_LPR (AT91_MC + 0xa0) /* Low Power Register */ | ||
395 | #define AT91_SDRAMC_IER (AT91_MC + 0xa4) /* Interrupt Enable Register */ | ||
396 | #define AT91_SDRAMC_IDR (AT91_MC + 0xa8) /* Interrupt Disable Register */ | ||
397 | #define AT91_SDRAMC_IMR (AT91_MC + 0xac) /* Interrupt Mask Register */ | ||
398 | #define AT91_SDRAMC_ISR (AT91_MC + 0xb0) /* Interrupt Status Register */ | ||
399 | |||
400 | /* Burst Flash Controller register */ | ||
401 | #define AT91_BFC_MR (AT91_MC + 0xc0) /* Mode Register */ | ||
402 | #define AT91_BFC_BFCOM (3 << 0) /* Burst Flash Controller Operating Mode */ | ||
403 | #define AT91_BFC_BFCOM_DISABLED (0 << 0) | ||
404 | #define AT91_BFC_BFCOM_ASYNC (1 << 0) | ||
405 | #define AT91_BFC_BFCOM_BURST (2 << 0) | ||
406 | #define AT91_BFC_BFCC (3 << 2) /* Burst Flash Controller Clock */ | ||
407 | #define AT91_BFC_BFCC_MCK (1 << 2) | ||
408 | #define AT91_BFC_BFCC_DIV2 (2 << 2) | ||
409 | #define AT91_BFC_BFCC_DIV4 (3 << 2) | ||
410 | #define AT91_BFC_AVL (0xf << 4) /* Address Valid Latency */ | ||
411 | #define AT91_BFC_PAGES (7 << 8) /* Page Size */ | ||
412 | #define AT91_BFC_PAGES_NO_PAGE (0 << 8) | ||
413 | #define AT91_BFC_PAGES_16 (1 << 8) | ||
414 | #define AT91_BFC_PAGES_32 (2 << 8) | ||
415 | #define AT91_BFC_PAGES_64 (3 << 8) | ||
416 | #define AT91_BFC_PAGES_128 (4 << 8) | ||
417 | #define AT91_BFC_PAGES_256 (5 << 8) | ||
418 | #define AT91_BFC_PAGES_512 (6 << 8) | ||
419 | #define AT91_BFC_PAGES_1024 (7 << 8) | ||
420 | #define AT91_BFC_OEL (3 << 12) /* Output Enable Latency */ | ||
421 | #define AT91_BFC_BAAEN (1 << 16) /* Burst Address Advance Enable */ | ||
422 | #define AT91_BFC_BFOEH (1 << 17) /* Burst Flash Output Enable Handling */ | ||
423 | #define AT91_BFC_MUXEN (1 << 18) /* Multiplexed Bus Enable */ | ||
424 | #define AT91_BFC_RDYEN (1 << 19) /* Ready Enable Mode */ | ||
327 | 425 | ||
328 | #endif | 426 | #endif |
diff --git a/include/asm-arm/arch-at91rm9200/uncompress.h b/include/asm-arm/arch-at91rm9200/uncompress.h index b30dd5520713..7b38497c24b5 100644 --- a/include/asm-arm/arch-at91rm9200/uncompress.h +++ b/include/asm-arm/arch-at91rm9200/uncompress.h | |||
@@ -31,21 +31,22 @@ | |||
31 | * | 31 | * |
32 | * This does not append a newline | 32 | * This does not append a newline |
33 | */ | 33 | */ |
34 | static void putstr(const char *s) | 34 | static void putc(int c) |
35 | { | ||
36 | void __iomem *sys = (void __iomem *) AT91_BASE_SYS; /* physical address */ | ||
37 | |||
38 | while (!(__raw_readl(sys + AT91_DBGU_SR) & AT91_DBGU_TXRDY)) | ||
39 | barrier(); | ||
40 | __raw_writel(c, sys + AT91_DBGU_THR); | ||
41 | } | ||
42 | |||
43 | static inline void flush(void) | ||
35 | { | 44 | { |
36 | void __iomem *sys = (void __iomem *) AT91_BASE_SYS; /* physical address */ | 45 | void __iomem *sys = (void __iomem *) AT91_BASE_SYS; /* physical address */ |
37 | 46 | ||
38 | while (*s) { | ||
39 | while (!(__raw_readl(sys + AT91_DBGU_SR) & AT91_DBGU_TXRDY)) { barrier(); } | ||
40 | __raw_writel(*s, sys + AT91_DBGU_THR); | ||
41 | if (*s == '\n') { | ||
42 | while (!(__raw_readl(sys + AT91_DBGU_SR) & AT91_DBGU_TXRDY)) { barrier(); } | ||
43 | __raw_writel('\r', sys + AT91_DBGU_THR); | ||
44 | } | ||
45 | s++; | ||
46 | } | ||
47 | /* wait for transmission to complete */ | 47 | /* wait for transmission to complete */ |
48 | while (!(__raw_readl(sys + AT91_DBGU_SR) & AT91_DBGU_TXEMPTY)) { barrier(); } | 48 | while (!(__raw_readl(sys + AT91_DBGU_SR) & AT91_DBGU_TXEMPTY)) |
49 | barrier(); | ||
49 | } | 50 | } |
50 | 51 | ||
51 | #define arch_decomp_setup() | 52 | #define arch_decomp_setup() |
diff --git a/include/asm-arm/arch-cl7500/uncompress.h b/include/asm-arm/arch-cl7500/uncompress.h index 68601b3e3b95..c437e0c88c3f 100644 --- a/include/asm-arm/arch-cl7500/uncompress.h +++ b/include/asm-arm/arch-cl7500/uncompress.h | |||
@@ -3,27 +3,19 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 1999, 2000 Nexus Electronics Ltd. | 4 | * Copyright (C) 1999, 2000 Nexus Electronics Ltd. |
5 | */ | 5 | */ |
6 | |||
7 | #define BASE 0x03010000 | 6 | #define BASE 0x03010000 |
8 | #define SERBASE (BASE + (0x2f8 << 2)) | 7 | #define SERBASE (BASE + (0x2f8 << 2)) |
9 | 8 | ||
10 | static __inline__ void putc(char c) | 9 | static inline void putc(char c) |
11 | { | 10 | { |
12 | while (!(*((volatile unsigned int *)(SERBASE + 0x14)) & 0x20)); | 11 | while (!(*((volatile unsigned int *)(SERBASE + 0x14)) & 0x20)) |
12 | barrier(); | ||
13 | |||
13 | *((volatile unsigned int *)(SERBASE)) = c; | 14 | *((volatile unsigned int *)(SERBASE)) = c; |
14 | } | 15 | } |
15 | 16 | ||
16 | /* | 17 | static inline void flush(void) |
17 | * This does not append a newline | ||
18 | */ | ||
19 | static void putstr(const char *s) | ||
20 | { | 18 | { |
21 | while (*s) { | ||
22 | putc(*s); | ||
23 | if (*s == '\n') | ||
24 | putc('\r'); | ||
25 | s++; | ||
26 | } | ||
27 | } | 19 | } |
28 | 20 | ||
29 | static __inline__ void arch_decomp_setup(void) | 21 | static __inline__ void arch_decomp_setup(void) |
diff --git a/include/asm-arm/arch-clps711x/uncompress.h b/include/asm-arm/arch-clps711x/uncompress.h index 9fc4bcfa1681..07157b7e4b20 100644 --- a/include/asm-arm/arch-clps711x/uncompress.h +++ b/include/asm-arm/arch-clps711x/uncompress.h | |||
@@ -25,7 +25,6 @@ | |||
25 | #undef CLPS7111_BASE | 25 | #undef CLPS7111_BASE |
26 | #define CLPS7111_BASE CLPS7111_PHYS_BASE | 26 | #define CLPS7111_BASE CLPS7111_PHYS_BASE |
27 | 27 | ||
28 | #define barrier() __asm__ __volatile__("": : :"memory") | ||
29 | #define __raw_readl(p) (*(unsigned long *)(p)) | 28 | #define __raw_readl(p) (*(unsigned long *)(p)) |
30 | #define __raw_writel(v,p) (*(unsigned long *)(p) = (v)) | 29 | #define __raw_writel(v,p) (*(unsigned long *)(p) = (v)) |
31 | 30 | ||
@@ -40,21 +39,15 @@ | |||
40 | /* | 39 | /* |
41 | * This does not append a newline | 40 | * This does not append a newline |
42 | */ | 41 | */ |
43 | static void putstr(const char *s) | 42 | static inline void putc(int c) |
44 | { | 43 | { |
45 | char c; | 44 | while (clps_readl(SYSFLGx) & SYSFLG_UTXFF) |
46 | 45 | barrier(); | |
47 | while ((c = *s++) != '\0') { | 46 | clps_writel(c, UARTDRx); |
48 | while (clps_readl(SYSFLGx) & SYSFLG_UTXFF) | 47 | } |
49 | barrier(); | ||
50 | clps_writel(c, UARTDRx); | ||
51 | 48 | ||
52 | if (c == '\n') { | 49 | static inline void flush(void) |
53 | while (clps_readl(SYSFLGx) & SYSFLG_UTXFF) | 50 | { |
54 | barrier(); | ||
55 | clps_writel('\r', UARTDRx); | ||
56 | } | ||
57 | } | ||
58 | while (clps_readl(SYSFLGx) & SYSFLG_UBUSY) | 51 | while (clps_readl(SYSFLGx) & SYSFLG_UBUSY) |
59 | barrier(); | 52 | barrier(); |
60 | } | 53 | } |
diff --git a/include/asm-arm/arch-ebsa110/uncompress.h b/include/asm-arm/arch-ebsa110/uncompress.h index eee95581a923..66b19c7fd908 100644 --- a/include/asm-arm/arch-ebsa110/uncompress.h +++ b/include/asm-arm/arch-ebsa110/uncompress.h | |||
@@ -8,33 +8,34 @@ | |||
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <linux/serial_reg.h> | ||
12 | |||
13 | #define SERIAL_BASE ((unsigned char *)0xfe000be0) | ||
14 | |||
11 | /* | 15 | /* |
12 | * This does not append a newline | 16 | * This does not append a newline |
13 | */ | 17 | */ |
14 | static void putstr(const char *s) | 18 | static inline void putc(int c) |
19 | { | ||
20 | unsigned char v, *base = SERIAL_BASE; | ||
21 | |||
22 | do { | ||
23 | v = base[UART_LSR << 2]; | ||
24 | barrier(); | ||
25 | } while (!(v & UART_LSR_THRE)); | ||
26 | |||
27 | base[UART_TX << 2] = c; | ||
28 | } | ||
29 | |||
30 | static inline void flush(void) | ||
15 | { | 31 | { |
16 | unsigned long tmp1, tmp2; | 32 | unsigned char v, *base = SERIAL_BASE; |
17 | __asm__ __volatile__( | 33 | |
18 | "ldrb %0, [%2], #1\n" | 34 | do { |
19 | " teq %0, #0\n" | 35 | v = base[UART_LSR << 2]; |
20 | " beq 3f\n" | 36 | barrier(); |
21 | "1: strb %0, [%3]\n" | 37 | } while ((v & (UART_LSR_TEMT|UART_LSR_THRE)) != |
22 | "2: ldrb %1, [%3, #0x14]\n" | 38 | (UART_LSR_TEMT|UART_LSR_THRE)); |
23 | " and %1, %1, #0x60\n" | ||
24 | " teq %1, #0x60\n" | ||
25 | " bne 2b\n" | ||
26 | " teq %0, #'\n'\n" | ||
27 | " moveq %0, #'\r'\n" | ||
28 | " beq 1b\n" | ||
29 | " ldrb %0, [%2], #1\n" | ||
30 | " teq %0, #0\n" | ||
31 | " bne 1b\n" | ||
32 | "3: ldrb %1, [%3, #0x14]\n" | ||
33 | " and %1, %1, #0x60\n" | ||
34 | " teq %1, #0x60\n" | ||
35 | " bne 3b" | ||
36 | : "=&r" (tmp1), "=&r" (tmp2) | ||
37 | : "r" (s), "r" (0xf0000be0) : "cc"); | ||
38 | } | 39 | } |
39 | 40 | ||
40 | /* | 41 | /* |
diff --git a/include/asm-arm/arch-ebsa285/uncompress.h b/include/asm-arm/arch-ebsa285/uncompress.h index c2fd84e2d90e..86142c882b3a 100644 --- a/include/asm-arm/arch-ebsa285/uncompress.h +++ b/include/asm-arm/arch-ebsa285/uncompress.h | |||
@@ -15,10 +15,11 @@ | |||
15 | #define DC21285_BASE ((volatile unsigned int *)0x42000160) | 15 | #define DC21285_BASE ((volatile unsigned int *)0x42000160) |
16 | #define SER0_BASE ((volatile unsigned char *)0x7c0003f8) | 16 | #define SER0_BASE ((volatile unsigned char *)0x7c0003f8) |
17 | 17 | ||
18 | static __inline__ void putc(char c) | 18 | static inline void putc(char c) |
19 | { | 19 | { |
20 | if (machine_is_netwinder()) { | 20 | if (machine_is_netwinder()) { |
21 | while ((SER0_BASE[5] & 0x60) != 0x60); | 21 | while ((SER0_BASE[5] & 0x60) != 0x60) |
22 | barrier(); | ||
22 | SER0_BASE[0] = c; | 23 | SER0_BASE[0] = c; |
23 | } else { | 24 | } else { |
24 | while (DC21285_BASE[6] & 8); | 25 | while (DC21285_BASE[6] & 8); |
@@ -26,17 +27,8 @@ static __inline__ void putc(char c) | |||
26 | } | 27 | } |
27 | } | 28 | } |
28 | 29 | ||
29 | /* | 30 | static inline void flush(void) |
30 | * This does not append a newline | ||
31 | */ | ||
32 | static void putstr(const char *s) | ||
33 | { | 31 | { |
34 | while (*s) { | ||
35 | putc(*s); | ||
36 | if (*s == '\n') | ||
37 | putc('\r'); | ||
38 | s++; | ||
39 | } | ||
40 | } | 32 | } |
41 | 33 | ||
42 | /* | 34 | /* |
diff --git a/include/asm-arm/arch-ep93xx/uncompress.h b/include/asm-arm/arch-ep93xx/uncompress.h index 4410d217077e..c15274c85d5d 100644 --- a/include/asm-arm/arch-ep93xx/uncompress.h +++ b/include/asm-arm/arch-ep93xx/uncompress.h | |||
@@ -16,17 +16,27 @@ static unsigned char __raw_readb(unsigned int ptr) | |||
16 | return *((volatile unsigned char *)ptr); | 16 | return *((volatile unsigned char *)ptr); |
17 | } | 17 | } |
18 | 18 | ||
19 | static unsigned int __raw_readl(unsigned int ptr) | ||
20 | { | ||
21 | return *((volatile unsigned int *)ptr); | ||
22 | } | ||
23 | |||
19 | static void __raw_writeb(unsigned char value, unsigned int ptr) | 24 | static void __raw_writeb(unsigned char value, unsigned int ptr) |
20 | { | 25 | { |
21 | *((volatile unsigned char *)ptr) = value; | 26 | *((volatile unsigned char *)ptr) = value; |
22 | } | 27 | } |
23 | 28 | ||
29 | static void __raw_writel(unsigned int value, unsigned int ptr) | ||
30 | { | ||
31 | *((volatile unsigned int *)ptr) = value; | ||
32 | } | ||
33 | |||
24 | 34 | ||
25 | #define PHYS_UART1_DATA 0x808c0000 | 35 | #define PHYS_UART1_DATA 0x808c0000 |
26 | #define PHYS_UART1_FLAG 0x808c0018 | 36 | #define PHYS_UART1_FLAG 0x808c0018 |
27 | #define UART1_FLAG_TXFF 0x20 | 37 | #define UART1_FLAG_TXFF 0x20 |
28 | 38 | ||
29 | static __inline__ void putc(char c) | 39 | static inline void putc(int c) |
30 | { | 40 | { |
31 | int i; | 41 | int i; |
32 | 42 | ||
@@ -39,15 +49,37 @@ static __inline__ void putc(char c) | |||
39 | __raw_writeb(c, PHYS_UART1_DATA); | 49 | __raw_writeb(c, PHYS_UART1_DATA); |
40 | } | 50 | } |
41 | 51 | ||
42 | static void putstr(const char *s) | 52 | static inline void flush(void) |
43 | { | 53 | { |
44 | while (*s) { | ||
45 | putc(*s); | ||
46 | if (*s == '\n') | ||
47 | putc('\r'); | ||
48 | s++; | ||
49 | } | ||
50 | } | 54 | } |
51 | 55 | ||
52 | #define arch_decomp_setup() | 56 | |
57 | /* | ||
58 | * Some bootloaders don't turn off DMA from the ethernet MAC before | ||
59 | * jumping to linux, which means that we might end up with bits of RX | ||
60 | * status and packet data scribbled over the uncompressed kernel image. | ||
61 | * Work around this by resetting the ethernet MAC before we uncompress. | ||
62 | */ | ||
63 | #define PHYS_ETH_SELF_CTL 0x80010020 | ||
64 | #define ETH_SELF_CTL_RESET 0x00000001 | ||
65 | |||
66 | static void ethernet_reset(void) | ||
67 | { | ||
68 | unsigned int v; | ||
69 | |||
70 | /* Reset the ethernet MAC. */ | ||
71 | v = __raw_readl(PHYS_ETH_SELF_CTL); | ||
72 | __raw_writel(v | ETH_SELF_CTL_RESET, PHYS_ETH_SELF_CTL); | ||
73 | |||
74 | /* Wait for reset to finish. */ | ||
75 | while (__raw_readl(PHYS_ETH_SELF_CTL) & ETH_SELF_CTL_RESET) | ||
76 | ; | ||
77 | } | ||
78 | |||
79 | |||
80 | static void arch_decomp_setup(void) | ||
81 | { | ||
82 | ethernet_reset(); | ||
83 | } | ||
84 | |||
53 | #define arch_decomp_wdog() | 85 | #define arch_decomp_wdog() |
diff --git a/include/asm-arm/arch-h720x/uncompress.h b/include/asm-arm/arch-h720x/uncompress.h index 9535764bcc71..18c69e0f3585 100644 --- a/include/asm-arm/arch-h720x/uncompress.h +++ b/include/asm-arm/arch-h720x/uncompress.h | |||
@@ -12,22 +12,20 @@ | |||
12 | #define LSR 0x14 | 12 | #define LSR 0x14 |
13 | #define TEMPTY 0x40 | 13 | #define TEMPTY 0x40 |
14 | 14 | ||
15 | static void putstr(const char *s) | 15 | static inline void putc(int c) |
16 | { | 16 | { |
17 | char c; | ||
18 | volatile unsigned char *p = (volatile unsigned char *)(IO_PHYS+0x20000); | 17 | volatile unsigned char *p = (volatile unsigned char *)(IO_PHYS+0x20000); |
19 | 18 | ||
20 | while ( (c = *s++) != '\0') { | 19 | /* wait until transmit buffer is empty */ |
21 | /* wait until transmit buffer is empty */ | 20 | while((p[LSR] & TEMPTY) == 0x0) |
22 | while((p[LSR] & TEMPTY) == 0x0); | 21 | barrier(); |
23 | /* write next character */ | 22 | |
24 | *p = c; | 23 | /* write next character */ |
25 | 24 | *p = c; | |
26 | if(c == '\n') { | 25 | } |
27 | while((p[LSR] & TEMPTY) == 0x0); | 26 | |
28 | *p = '\r'; | 27 | static inline void flush(void) |
29 | } | 28 | { |
30 | } | ||
31 | } | 29 | } |
32 | 30 | ||
33 | /* | 31 | /* |
diff --git a/include/asm-arm/arch-imx/uncompress.h b/include/asm-arm/arch-imx/uncompress.h index 096077f2750b..da333f69136f 100644 --- a/include/asm-arm/arch-imx/uncompress.h +++ b/include/asm-arm/arch-imx/uncompress.h | |||
@@ -39,8 +39,7 @@ | |||
39 | * | 39 | * |
40 | * This does not append a newline | 40 | * This does not append a newline |
41 | */ | 41 | */ |
42 | static void | 42 | static void putc(int c) |
43 | putstr(const char *s) | ||
44 | { | 43 | { |
45 | unsigned long serial_port; | 44 | unsigned long serial_port; |
46 | 45 | ||
@@ -54,20 +53,14 @@ putstr(const char *s) | |||
54 | return; | 53 | return; |
55 | } while(0); | 54 | } while(0); |
56 | 55 | ||
57 | while (*s) { | 56 | while (!(UART(USR2) & USR2_TXFE)) |
58 | while ( !(UART(USR2) & USR2_TXFE) ) | 57 | barrier(); |
59 | barrier(); | ||
60 | 58 | ||
61 | UART(TXR) = *s; | 59 | UART(TXR) = c; |
62 | 60 | } | |
63 | if (*s == '\n') { | ||
64 | while ( !(UART(USR2) & USR2_TXFE) ) | ||
65 | barrier(); | ||
66 | 61 | ||
67 | UART(TXR) = '\r'; | 62 | static inline void flush(void) |
68 | } | 63 | { |
69 | s++; | ||
70 | } | ||
71 | } | 64 | } |
72 | 65 | ||
73 | /* | 66 | /* |
diff --git a/include/asm-arm/arch-integrator/uncompress.h b/include/asm-arm/arch-integrator/uncompress.h index 3957402741d3..f61825c4d901 100644 --- a/include/asm-arm/arch-integrator/uncompress.h +++ b/include/asm-arm/arch-integrator/uncompress.h | |||
@@ -28,21 +28,18 @@ | |||
28 | /* | 28 | /* |
29 | * This does not append a newline | 29 | * This does not append a newline |
30 | */ | 30 | */ |
31 | static void putstr(const char *s) | 31 | static void putc(int c) |
32 | { | 32 | { |
33 | while (*s) { | 33 | while (AMBA_UART_FR & (1 << 5)) |
34 | while (AMBA_UART_FR & (1 << 5)); | 34 | barrier(); |
35 | 35 | ||
36 | AMBA_UART_DR = *s; | 36 | AMBA_UART_DR = c; |
37 | 37 | } | |
38 | if (*s == '\n') { | ||
39 | while (AMBA_UART_FR & (1 << 5)); | ||
40 | 38 | ||
41 | AMBA_UART_DR = '\r'; | 39 | static inline void flush(void) |
42 | } | 40 | { |
43 | s++; | 41 | while (AMBA_UART_FR & (1 << 3)) |
44 | } | 42 | barrier(); |
45 | while (AMBA_UART_FR & (1 << 3)); | ||
46 | } | 43 | } |
47 | 44 | ||
48 | /* | 45 | /* |
diff --git a/include/asm-arm/arch-iop3xx/uncompress.h b/include/asm-arm/arch-iop3xx/uncompress.h index 82b88762c3cc..c98eb6254b1f 100644 --- a/include/asm-arm/arch-iop3xx/uncompress.h +++ b/include/asm-arm/arch-iop3xx/uncompress.h | |||
@@ -19,23 +19,15 @@ static volatile UTYPE uart_base; | |||
19 | 19 | ||
20 | #define TX_DONE (UART_LSR_TEMT|UART_LSR_THRE) | 20 | #define TX_DONE (UART_LSR_TEMT|UART_LSR_THRE) |
21 | 21 | ||
22 | static __inline__ void putc(char c) | 22 | static inline void putc(char c) |
23 | { | 23 | { |
24 | while ((uart_base[UART_LSR] & TX_DONE) != TX_DONE); | 24 | while ((uart_base[UART_LSR] & TX_DONE) != TX_DONE) |
25 | barrier(); | ||
25 | *uart_base = c; | 26 | *uart_base = c; |
26 | } | 27 | } |
27 | 28 | ||
28 | /* | 29 | static inline void flush(void) |
29 | * This does not append a newline | ||
30 | */ | ||
31 | static void putstr(const char *s) | ||
32 | { | 30 | { |
33 | while (*s) { | ||
34 | putc(*s); | ||
35 | if (*s == '\n') | ||
36 | putc('\r'); | ||
37 | s++; | ||
38 | } | ||
39 | } | 31 | } |
40 | 32 | ||
41 | static __inline__ void __arch_decomp_setup(unsigned long arch_id) | 33 | static __inline__ void __arch_decomp_setup(unsigned long arch_id) |
diff --git a/include/asm-arm/arch-ixp2000/uncompress.h b/include/asm-arm/arch-ixp2000/uncompress.h index 3d3d5b2ed6e9..f66b408f363e 100644 --- a/include/asm-arm/arch-ixp2000/uncompress.h +++ b/include/asm-arm/arch-ixp2000/uncompress.h | |||
@@ -29,23 +29,18 @@ | |||
29 | #define UARTSR PHYS(0x14) /* Status reg */ | 29 | #define UARTSR PHYS(0x14) /* Status reg */ |
30 | 30 | ||
31 | 31 | ||
32 | static __inline__ void putc(char c) | 32 | static inline void putc(int c) |
33 | { | 33 | { |
34 | int j = 0x1000; | 34 | int j = 0x1000; |
35 | 35 | ||
36 | while (--j && !(*UARTSR & UART_LSR_THRE)); | 36 | while (--j && !(*UARTSR & UART_LSR_THRE)) |
37 | barrier(); | ||
38 | |||
37 | *UARTDR = c; | 39 | *UARTDR = c; |
38 | } | 40 | } |
39 | 41 | ||
40 | static void putstr(const char *s) | 42 | static inline void flush(void) |
41 | { | 43 | { |
42 | while (*s) | ||
43 | { | ||
44 | putc(*s); | ||
45 | if (*s == '\n') | ||
46 | putc('\r'); | ||
47 | s++; | ||
48 | } | ||
49 | } | 44 | } |
50 | 45 | ||
51 | #define arch_decomp_setup() | 46 | #define arch_decomp_setup() |
diff --git a/include/asm-arm/arch-ixp23xx/debug-macro.S b/include/asm-arm/arch-ixp23xx/debug-macro.S new file mode 100644 index 000000000000..eb99fd69fd24 --- /dev/null +++ b/include/asm-arm/arch-ixp23xx/debug-macro.S | |||
@@ -0,0 +1,23 @@ | |||
1 | /* | ||
2 | * include/asm-arm/arch-ixp23xx/debug-macro.S | ||
3 | * | ||
4 | * Debugging macro include header | ||
5 | * | ||
6 | * Copyright (C) 1994-1999 Russell King | ||
7 | * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | */ | ||
13 | #include <asm/arch/ixp23xx.h> | ||
14 | |||
15 | .macro addruart,rx | ||
16 | mrc p15, 0, \rx, c1, c0 | ||
17 | tst \rx, #1 @ mmu enabled? | ||
18 | ldreq \rx, =IXP23XX_PERIPHERAL_PHYS @ physical | ||
19 | ldrne \rx, =IXP23XX_PERIPHERAL_VIRT @ virtual | ||
20 | .endm | ||
21 | |||
22 | #define UART_SHIFT 2 | ||
23 | #include <asm/hardware/debug-8250.S> | ||
diff --git a/include/asm-arm/arch-ixp23xx/dma.h b/include/asm-arm/arch-ixp23xx/dma.h new file mode 100644 index 000000000000..2f4335e3b836 --- /dev/null +++ b/include/asm-arm/arch-ixp23xx/dma.h | |||
@@ -0,0 +1,3 @@ | |||
1 | /* | ||
2 | * include/asm-arm/arch-ixp23xx/dma.h | ||
3 | */ | ||
diff --git a/include/asm-arm/arch-ixp23xx/entry-macro.S b/include/asm-arm/arch-ixp23xx/entry-macro.S new file mode 100644 index 000000000000..0ef4e6016ac4 --- /dev/null +++ b/include/asm-arm/arch-ixp23xx/entry-macro.S | |||
@@ -0,0 +1,31 @@ | |||
1 | /* | ||
2 | * include/asm-arm/arch-ixp23xx/entry-macro.S | ||
3 | */ | ||
4 | |||
5 | .macro disable_fiq | ||
6 | .endm | ||
7 | |||
8 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
9 | ldr \irqnr, =(IXP23XX_INTC_VIRT + IXP23XX_INTR_IRQ_ENC_ST_OFFSET) | ||
10 | ldr \irqnr, [\irqnr] @ get interrupt number | ||
11 | cmp \irqnr, #0x0 @ suprious interrupt ? | ||
12 | movne \irqnr, \irqnr, lsr #2 @ skip unwanted low order bits | ||
13 | subne \irqnr, \irqnr, #1 @ convert to 0 based | ||
14 | |||
15 | #if 0 | ||
16 | cmp \irqnr, #IRQ_IXP23XX_PCI_INT_RPH | ||
17 | bne 1001f | ||
18 | mov \irqnr, #IRQ_IXP23XX_INTA | ||
19 | |||
20 | ldr \irqnr, =0xf5000030 | ||
21 | |||
22 | mov \tmp, #(1<<26) | ||
23 | tst \irqnr, \tmp | ||
24 | movne \irqnr, #IRQ_IXP23XX_INTB | ||
25 | |||
26 | mov \tmp, #(1<<27) | ||
27 | tst \irqnr, \tmp | ||
28 | movne \irqnr, #IRQ_IXP23XX_INTA | ||
29 | 1001: | ||
30 | #endif | ||
31 | .endm | ||
diff --git a/include/asm-arm/arch-ixp23xx/hardware.h b/include/asm-arm/arch-ixp23xx/hardware.h new file mode 100644 index 000000000000..c0010d21a684 --- /dev/null +++ b/include/asm-arm/arch-ixp23xx/hardware.h | |||
@@ -0,0 +1,37 @@ | |||
1 | /* | ||
2 | * include/asm-arm/arch-ixp23xx/hardware.h | ||
3 | * | ||
4 | * Copyright (C) 2002-2004 Intel Corporation. | ||
5 | * Copyricht (C) 2005 MontaVista Software, Inc. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * Hardware definitions for IXP23XX based systems | ||
12 | */ | ||
13 | |||
14 | #ifndef __ASM_ARCH_HARDWARE_H | ||
15 | #define __ASM_ARCH_HARDWARE_H | ||
16 | |||
17 | /* PCI IO info */ | ||
18 | #define PCIO_BASE IXP23XX_PCI_IO_VIRT | ||
19 | #define PCIBIOS_MIN_IO 0x00000000 | ||
20 | #define PCIBIOS_MIN_MEM 0xe0000000 | ||
21 | |||
22 | #include "ixp23xx.h" | ||
23 | |||
24 | #define pcibios_assign_all_busses() 0 | ||
25 | |||
26 | /* | ||
27 | * Platform helper functions | ||
28 | */ | ||
29 | #include "platform.h" | ||
30 | |||
31 | /* | ||
32 | * Platform-specific headers | ||
33 | */ | ||
34 | #include "ixdp2351.h" | ||
35 | |||
36 | |||
37 | #endif | ||
diff --git a/include/asm-arm/arch-ixp23xx/io.h b/include/asm-arm/arch-ixp23xx/io.h new file mode 100644 index 000000000000..18415a81ac74 --- /dev/null +++ b/include/asm-arm/arch-ixp23xx/io.h | |||
@@ -0,0 +1,54 @@ | |||
1 | /* | ||
2 | * include/asm-arm/arch-ixp23xx/io.h | ||
3 | * | ||
4 | * Original Author: Naeem M Afzal <naeem.m.afzal@intel.com> | ||
5 | * Maintainer: Deepak Saxena <dsaxena@plexity.net> | ||
6 | * | ||
7 | * Copyright (C) 2003-2005 Intel Corp. | ||
8 | * Copyright (C) 2005 MontaVista Software, Inc | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #ifndef __ASM_ARCH_IO_H | ||
16 | #define __ASM_ARCH_IO_H | ||
17 | |||
18 | #define IO_SPACE_LIMIT 0xffffffff | ||
19 | |||
20 | #define __io(p) ((void __iomem*)((p) + IXP23XX_PCI_IO_VIRT)) | ||
21 | #define __mem_pci(a) (a) | ||
22 | |||
23 | #include <linux/kernel.h> /* For BUG */ | ||
24 | |||
25 | static inline void __iomem * | ||
26 | ixp23xx_ioremap(unsigned long addr, unsigned long size, unsigned long flags) | ||
27 | { | ||
28 | if (addr >= IXP23XX_PCI_MEM_START && | ||
29 | addr <= IXP23XX_PCI_MEM_START + IXP23XX_PCI_MEM_SIZE) { | ||
30 | if (addr + size > IXP23XX_PCI_MEM_START + IXP23XX_PCI_MEM_SIZE) | ||
31 | return NULL; | ||
32 | |||
33 | return (void __iomem *) | ||
34 | ((addr - IXP23XX_PCI_MEM_START) + IXP23XX_PCI_MEM_VIRT); | ||
35 | } | ||
36 | |||
37 | return __ioremap(addr, size, flags); | ||
38 | } | ||
39 | |||
40 | static inline void | ||
41 | ixp23xx_iounmap(void __iomem *addr) | ||
42 | { | ||
43 | if ((((u32)addr) >= IXP23XX_PCI_MEM_VIRT) && | ||
44 | (((u32)addr) < IXP23XX_PCI_MEM_VIRT + IXP23XX_PCI_MEM_SIZE)) | ||
45 | return; | ||
46 | |||
47 | __iounmap(addr); | ||
48 | } | ||
49 | |||
50 | #define __arch_ioremap(a,s,f) ixp23xx_ioremap(a,s,f) | ||
51 | #define __arch_iounmap(a) ixp23xx_iounmap(a) | ||
52 | |||
53 | |||
54 | #endif | ||
diff --git a/include/asm-arm/arch-ixp23xx/irqs.h b/include/asm-arm/arch-ixp23xx/irqs.h new file mode 100644 index 000000000000..e69639585721 --- /dev/null +++ b/include/asm-arm/arch-ixp23xx/irqs.h | |||
@@ -0,0 +1,223 @@ | |||
1 | /* | ||
2 | * include/asm-arm/arch-ixp23xx/irqs.h | ||
3 | * | ||
4 | * IRQ definitions for IXP23XX based systems | ||
5 | * | ||
6 | * Author: Naeem Afzal <naeem.m.afzal@intel.com> | ||
7 | * | ||
8 | * Copyright (C) 2003-2004 Intel Corporation. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #ifndef __ASM_ARCH_IRQS_H | ||
16 | #define __ASM_ARCH_IRQS_H | ||
17 | |||
18 | #define NR_IXP23XX_IRQS IRQ_IXP23XX_INTB+1 | ||
19 | #define IRQ_IXP23XX_EXTIRQS NR_IXP23XX_IRQS | ||
20 | |||
21 | |||
22 | #define IRQ_IXP23XX_DBG0 0 /* Debug/Execution/MBox */ | ||
23 | #define IRQ_IXP23XX_DBG1 1 /* Debug/Execution/MBox */ | ||
24 | #define IRQ_IXP23XX_NPE_TRG 2 /* npe_trigger */ | ||
25 | #define IRQ_IXP23XX_TIMER1 3 /* Timer[0] */ | ||
26 | #define IRQ_IXP23XX_TIMER2 4 /* Timer[1] */ | ||
27 | #define IRQ_IXP23XX_TIMESTAMP 5 /* Timer[2], Time-stamp */ | ||
28 | #define IRQ_IXP23XX_WDOG 6 /* Time[3], Watchdog Timer */ | ||
29 | #define IRQ_IXP23XX_PCI_DBELL 7 /* PCI Doorbell */ | ||
30 | #define IRQ_IXP23XX_PCI_DMA1 8 /* PCI DMA Channel 1 */ | ||
31 | #define IRQ_IXP23XX_PCI_DMA2 9 /* PCI DMA Channel 2 */ | ||
32 | #define IRQ_IXP23XX_PCI_DMA3 10 /* PCI DMA Channel 3 */ | ||
33 | #define IRQ_IXP23XX_PCI_INT_RPH 11 /* pcxg_pci_int_rph */ | ||
34 | #define IRQ_IXP23XX_CPP_PMU 12 /* xpxg_pm_int_rpl */ | ||
35 | #define IRQ_IXP23XX_SWINT0 13 /* S/W Interrupt0 */ | ||
36 | #define IRQ_IXP23XX_SWINT1 14 /* S/W Interrupt1 */ | ||
37 | #define IRQ_IXP23XX_UART2 15 /* UART1 Interrupt */ | ||
38 | #define IRQ_IXP23XX_UART1 16 /* UART0 Interrupt */ | ||
39 | #define IRQ_IXP23XX_XSI_PMU_ROLLOVER 17 /* AHB Performance M. Unit counter rollover */ | ||
40 | #define IRQ_IXP23XX_XSI_AHB_PM0 18 /* intr_pm_o */ | ||
41 | #define IRQ_IXP23XX_XSI_AHB_ECE0 19 /* intr_ece_o */ | ||
42 | #define IRQ_IXP23XX_XSI_AHB_GASKET 20 /* gas_intr_o */ | ||
43 | #define IRQ_IXP23XX_XSI_CPP 21 /* xsi2cpp_int */ | ||
44 | #define IRQ_IXP23XX_CPP_XSI 22 /* cpp2xsi_int */ | ||
45 | #define IRQ_IXP23XX_ME_ATTN0 23 /* ME_ATTN */ | ||
46 | #define IRQ_IXP23XX_ME_ATTN1 24 /* ME_ATTN */ | ||
47 | #define IRQ_IXP23XX_ME_ATTN2 25 /* ME_ATTN */ | ||
48 | #define IRQ_IXP23XX_ME_ATTN3 26 /* ME_ATTN */ | ||
49 | #define IRQ_IXP23XX_PCI_ERR_RPH 27 /* PCXG_PCI_ERR_RPH */ | ||
50 | #define IRQ_IXP23XX_D0XG_ECC_CORR 28 /* D0XG_DRAM_ECC_CORR */ | ||
51 | #define IRQ_IXP23XX_D0XG_ECC_UNCORR 29 /* D0XG_DRAM_ECC_UNCORR */ | ||
52 | #define IRQ_IXP23XX_SRAM_ERR1 30 /* SRAM1_ERR */ | ||
53 | #define IRQ_IXP23XX_SRAM_ERR0 31 /* SRAM0_ERR */ | ||
54 | #define IRQ_IXP23XX_MEDIA_ERR 32 /* MEDIA_ERR */ | ||
55 | #define IRQ_IXP23XX_STH_DRAM_ECC_MAJ 33 /* STH_DRAM0_ECC_MAJ */ | ||
56 | #define IRQ_IXP23XX_GPIO6 34 /* GPIO0 interrupts */ | ||
57 | #define IRQ_IXP23XX_GPIO7 35 /* GPIO1 interrupts */ | ||
58 | #define IRQ_IXP23XX_GPIO8 36 /* GPIO2 interrupts */ | ||
59 | #define IRQ_IXP23XX_GPIO9 37 /* GPIO3 interrupts */ | ||
60 | #define IRQ_IXP23XX_GPIO10 38 /* GPIO4 interrupts */ | ||
61 | #define IRQ_IXP23XX_GPIO11 39 /* GPIO5 interrupts */ | ||
62 | #define IRQ_IXP23XX_GPIO12 40 /* GPIO6 interrupts */ | ||
63 | #define IRQ_IXP23XX_GPIO13 41 /* GPIO7 interrupts */ | ||
64 | #define IRQ_IXP23XX_GPIO14 42 /* GPIO8 interrupts */ | ||
65 | #define IRQ_IXP23XX_GPIO15 43 /* GPIO9 interrupts */ | ||
66 | #define IRQ_IXP23XX_SHAC_RING0 44 /* SHAC Ring Full */ | ||
67 | #define IRQ_IXP23XX_SHAC_RING1 45 /* SHAC Ring Full */ | ||
68 | #define IRQ_IXP23XX_SHAC_RING2 46 /* SHAC Ring Full */ | ||
69 | #define IRQ_IXP23XX_SHAC_RING3 47 /* SHAC Ring Full */ | ||
70 | #define IRQ_IXP23XX_SHAC_RING4 48 /* SHAC Ring Full */ | ||
71 | #define IRQ_IXP23XX_SHAC_RING5 49 /* SHAC Ring Full */ | ||
72 | #define IRQ_IXP23XX_SHAC_RING6 50 /* SHAC RING Full */ | ||
73 | #define IRQ_IXP23XX_SHAC_RING7 51 /* SHAC Ring Full */ | ||
74 | #define IRQ_IXP23XX_SHAC_RING8 52 /* SHAC Ring Full */ | ||
75 | #define IRQ_IXP23XX_SHAC_RING9 53 /* SHAC Ring Full */ | ||
76 | #define IRQ_IXP23XX_SHAC_RING10 54 /* SHAC Ring Full */ | ||
77 | #define IRQ_IXP23XX_SHAC_RING11 55 /* SHAC Ring Full */ | ||
78 | #define IRQ_IXP23XX_ME_THREAD_A0_ME0 56 /* ME_THREAD_A */ | ||
79 | #define IRQ_IXP23XX_ME_THREAD_A1_ME0 57 /* ME_THREAD_A */ | ||
80 | #define IRQ_IXP23XX_ME_THREAD_A2_ME0 58 /* ME_THREAD_A */ | ||
81 | #define IRQ_IXP23XX_ME_THREAD_A3_ME0 59 /* ME_THREAD_A */ | ||
82 | #define IRQ_IXP23XX_ME_THREAD_A4_ME0 60 /* ME_THREAD_A */ | ||
83 | #define IRQ_IXP23XX_ME_THREAD_A5_ME0 61 /* ME_THREAD_A */ | ||
84 | #define IRQ_IXP23XX_ME_THREAD_A6_ME0 62 /* ME_THREAD_A */ | ||
85 | #define IRQ_IXP23XX_ME_THREAD_A7_ME0 63 /* ME_THREAD_A */ | ||
86 | #define IRQ_IXP23XX_ME_THREAD_A8_ME1 64 /* ME_THREAD_A */ | ||
87 | #define IRQ_IXP23XX_ME_THREAD_A9_ME1 65 /* ME_THREAD_A */ | ||
88 | #define IRQ_IXP23XX_ME_THREAD_A10_ME1 66 /* ME_THREAD_A */ | ||
89 | #define IRQ_IXP23XX_ME_THREAD_A11_ME1 67 /* ME_THREAD_A */ | ||
90 | #define IRQ_IXP23XX_ME_THREAD_A12_ME1 68 /* ME_THREAD_A */ | ||
91 | #define IRQ_IXP23XX_ME_THREAD_A13_ME1 69 /* ME_THREAD_A */ | ||
92 | #define IRQ_IXP23XX_ME_THREAD_A14_ME1 70 /* ME_THREAD_A */ | ||
93 | #define IRQ_IXP23XX_ME_THREAD_A15_ME1 71 /* ME_THREAD_A */ | ||
94 | #define IRQ_IXP23XX_ME_THREAD_A16_ME2 72 /* ME_THREAD_A */ | ||
95 | #define IRQ_IXP23XX_ME_THREAD_A17_ME2 73 /* ME_THREAD_A */ | ||
96 | #define IRQ_IXP23XX_ME_THREAD_A18_ME2 74 /* ME_THREAD_A */ | ||
97 | #define IRQ_IXP23XX_ME_THREAD_A19_ME2 75 /* ME_THREAD_A */ | ||
98 | #define IRQ_IXP23XX_ME_THREAD_A20_ME2 76 /* ME_THREAD_A */ | ||
99 | #define IRQ_IXP23XX_ME_THREAD_A21_ME2 77 /* ME_THREAD_A */ | ||
100 | #define IRQ_IXP23XX_ME_THREAD_A22_ME2 78 /* ME_THREAD_A */ | ||
101 | #define IRQ_IXP23XX_ME_THREAD_A23_ME2 79 /* ME_THREAD_A */ | ||
102 | #define IRQ_IXP23XX_ME_THREAD_A24_ME3 80 /* ME_THREAD_A */ | ||
103 | #define IRQ_IXP23XX_ME_THREAD_A25_ME3 81 /* ME_THREAD_A */ | ||
104 | #define IRQ_IXP23XX_ME_THREAD_A26_ME3 82 /* ME_THREAD_A */ | ||
105 | #define IRQ_IXP23XX_ME_THREAD_A27_ME3 83 /* ME_THREAD_A */ | ||
106 | #define IRQ_IXP23XX_ME_THREAD_A28_ME3 84 /* ME_THREAD_A */ | ||
107 | #define IRQ_IXP23XX_ME_THREAD_A29_ME3 85 /* ME_THREAD_A */ | ||
108 | #define IRQ_IXP23XX_ME_THREAD_A30_ME3 86 /* ME_THREAD_A */ | ||
109 | #define IRQ_IXP23XX_ME_THREAD_A31_ME3 87 /* ME_THREAD_A */ | ||
110 | #define IRQ_IXP23XX_ME_THREAD_B0_ME0 88 /* ME_THREAD_B */ | ||
111 | #define IRQ_IXP23XX_ME_THREAD_B1_ME0 89 /* ME_THREAD_B */ | ||
112 | #define IRQ_IXP23XX_ME_THREAD_B2_ME0 90 /* ME_THREAD_B */ | ||
113 | #define IRQ_IXP23XX_ME_THREAD_B3_ME0 91 /* ME_THREAD_B */ | ||
114 | #define IRQ_IXP23XX_ME_THREAD_B4_ME0 92 /* ME_THREAD_B */ | ||
115 | #define IRQ_IXP23XX_ME_THREAD_B5_ME0 93 /* ME_THREAD_B */ | ||
116 | #define IRQ_IXP23XX_ME_THREAD_B6_ME0 94 /* ME_THREAD_B */ | ||
117 | #define IRQ_IXP23XX_ME_THREAD_B7_ME0 95 /* ME_THREAD_B */ | ||
118 | #define IRQ_IXP23XX_ME_THREAD_B8_ME1 96 /* ME_THREAD_B */ | ||
119 | #define IRQ_IXP23XX_ME_THREAD_B9_ME1 97 /* ME_THREAD_B */ | ||
120 | #define IRQ_IXP23XX_ME_THREAD_B10_ME1 98 /* ME_THREAD_B */ | ||
121 | #define IRQ_IXP23XX_ME_THREAD_B11_ME1 99 /* ME_THREAD_B */ | ||
122 | #define IRQ_IXP23XX_ME_THREAD_B12_ME1 100 /* ME_THREAD_B */ | ||
123 | #define IRQ_IXP23XX_ME_THREAD_B13_ME1 101 /* ME_THREAD_B */ | ||
124 | #define IRQ_IXP23XX_ME_THREAD_B14_ME1 102 /* ME_THREAD_B */ | ||
125 | #define IRQ_IXP23XX_ME_THREAD_B15_ME1 103 /* ME_THREAD_B */ | ||
126 | #define IRQ_IXP23XX_ME_THREAD_B16_ME2 104 /* ME_THREAD_B */ | ||
127 | #define IRQ_IXP23XX_ME_THREAD_B17_ME2 105 /* ME_THREAD_B */ | ||
128 | #define IRQ_IXP23XX_ME_THREAD_B18_ME2 106 /* ME_THREAD_B */ | ||
129 | #define IRQ_IXP23XX_ME_THREAD_B19_ME2 107 /* ME_THREAD_B */ | ||
130 | #define IRQ_IXP23XX_ME_THREAD_B20_ME2 108 /* ME_THREAD_B */ | ||
131 | #define IRQ_IXP23XX_ME_THREAD_B21_ME2 109 /* ME_THREAD_B */ | ||
132 | #define IRQ_IXP23XX_ME_THREAD_B22_ME2 110 /* ME_THREAD_B */ | ||
133 | #define IRQ_IXP23XX_ME_THREAD_B23_ME2 111 /* ME_THREAD_B */ | ||
134 | #define IRQ_IXP23XX_ME_THREAD_B24_ME3 112 /* ME_THREAD_B */ | ||
135 | #define IRQ_IXP23XX_ME_THREAD_B25_ME3 113 /* ME_THREAD_B */ | ||
136 | #define IRQ_IXP23XX_ME_THREAD_B26_ME3 114 /* ME_THREAD_B */ | ||
137 | #define IRQ_IXP23XX_ME_THREAD_B27_ME3 115 /* ME_THREAD_B */ | ||
138 | #define IRQ_IXP23XX_ME_THREAD_B28_ME3 116 /* ME_THREAD_B */ | ||
139 | #define IRQ_IXP23XX_ME_THREAD_B29_ME3 117 /* ME_THREAD_B */ | ||
140 | #define IRQ_IXP23XX_ME_THREAD_B30_ME3 118 /* ME_THREAD_B */ | ||
141 | #define IRQ_IXP23XX_ME_THREAD_B31_ME3 119 /* ME_THREAD_B */ | ||
142 | |||
143 | #define NUM_IXP23XX_RAW_IRQS 120 | ||
144 | |||
145 | #define IRQ_IXP23XX_INTA 120 /* Indirect pcxg_pci_int_rph */ | ||
146 | #define IRQ_IXP23XX_INTB 121 /* Indirect pcxg_pci_int_rph */ | ||
147 | |||
148 | #define NR_IXP23XX_IRQ (IRQ_IXP23XX_INTB + 1) | ||
149 | |||
150 | /* | ||
151 | * We default to 32 per-board IRQs. Increase this number if you need | ||
152 | * more, but keep it realistic. | ||
153 | */ | ||
154 | #define NR_IXP23XX_MACH_IRQS 32 | ||
155 | |||
156 | #define NR_IRQS NR_IXP23XX_IRQS + NR_IXP23XX_MACH_IRQS | ||
157 | |||
158 | #define IXP23XX_MACH_IRQ(irq) (NR_IXP23XX_IRQ + (irq)) | ||
159 | |||
160 | |||
161 | /* | ||
162 | * IXDP2351-specific interrupts | ||
163 | */ | ||
164 | |||
165 | /* | ||
166 | * External PCI interrupts signaled through INTB | ||
167 | * | ||
168 | */ | ||
169 | #define IXDP2351_INTB_IRQ_BASE 0 | ||
170 | #define IRQ_IXDP2351_INTA_82546 IXP23XX_MACH_IRQ(0) | ||
171 | #define IRQ_IXDP2351_INTB_82546 IXP23XX_MACH_IRQ(1) | ||
172 | #define IRQ_IXDP2351_SPCI_DB_0 IXP23XX_MACH_IRQ(2) | ||
173 | #define IRQ_IXDP2351_SPCI_DB_1 IXP23XX_MACH_IRQ(3) | ||
174 | #define IRQ_IXDP2351_SPCI_PMC_INTA IXP23XX_MACH_IRQ(4) | ||
175 | #define IRQ_IXDP2351_SPCI_PMC_INTB IXP23XX_MACH_IRQ(5) | ||
176 | #define IRQ_IXDP2351_SPCI_PMC_INTC IXP23XX_MACH_IRQ(6) | ||
177 | #define IRQ_IXDP2351_SPCI_PMC_INTD IXP23XX_MACH_IRQ(7) | ||
178 | #define IRQ_IXDP2351_SPCI_FIC IXP23XX_MACH_IRQ(8) | ||
179 | |||
180 | #define IXDP2351_INTB_IRQ_BIT(irq) (irq - IXP23XX_MACH_IRQ(0)) | ||
181 | #define IXDP2351_INTB_IRQ_MASK(irq) (1 << IXDP2351_INTB_IRQ_BIT(irq)) | ||
182 | #define IXDP2351_INTB_IRQ_VALID 0x01FF | ||
183 | #define IXDP2351_INTB_IRQ_NUM 16 | ||
184 | |||
185 | /* | ||
186 | * Other external interrupts signaled through INTA | ||
187 | */ | ||
188 | #define IXDP2351_INTA_IRQ_BASE 16 | ||
189 | #define IRQ_IXDP2351_IPMI_FROM IXP23XX_MACH_IRQ(16) | ||
190 | #define IRQ_IXDP2351_125US IXP23XX_MACH_IRQ(17) | ||
191 | #define IRQ_IXDP2351_DB_0_ADD IXP23XX_MACH_IRQ(18) | ||
192 | #define IRQ_IXDP2351_DB_1_ADD IXP23XX_MACH_IRQ(19) | ||
193 | #define IRQ_IXDP2351_DEBUG1 IXP23XX_MACH_IRQ(20) | ||
194 | #define IRQ_IXDP2351_ADD_UART IXP23XX_MACH_IRQ(21) | ||
195 | #define IRQ_IXDP2351_FIC_ADD IXP23XX_MACH_IRQ(24) | ||
196 | #define IRQ_IXDP2351_CS8900 IXP23XX_MACH_IRQ(25) | ||
197 | #define IRQ_IXDP2351_BBSRAM IXP23XX_MACH_IRQ(26) | ||
198 | #define IRQ_IXDP2351_CONFIG_MEDIA IXP23XX_MACH_IRQ(27) | ||
199 | #define IRQ_IXDP2351_CLOCK_REF IXP23XX_MACH_IRQ(28) | ||
200 | #define IRQ_IXDP2351_A10_NP IXP23XX_MACH_IRQ(29) | ||
201 | #define IRQ_IXDP2351_A11_NP IXP23XX_MACH_IRQ(30) | ||
202 | #define IRQ_IXDP2351_DEBUG_NP IXP23XX_MACH_IRQ(31) | ||
203 | |||
204 | #define IXDP2351_INTA_IRQ_BIT(irq) (irq - IXP23XX_MACH_IRQ(16)) | ||
205 | #define IXDP2351_INTA_IRQ_MASK(irq) (1 << IXDP2351_INTA_IRQ_BIT(irq)) | ||
206 | #define IXDP2351_INTA_IRQ_VALID 0xFF3F | ||
207 | #define IXDP2351_INTA_IRQ_NUM 16 | ||
208 | |||
209 | |||
210 | /* | ||
211 | * ADI RoadRunner IRQs | ||
212 | */ | ||
213 | #define IRQ_ROADRUNNER_PCI_INTA IRQ_IXP23XX_INTA | ||
214 | #define IRQ_ROADRUNNER_PCI_INTB IRQ_IXP23XX_INTB | ||
215 | #define IRQ_ROADRUNNER_PCI_INTC IRQ_IXP23XX_GPIO11 | ||
216 | #define IRQ_ROADRUNNER_PCI_INTD IRQ_IXP23XX_GPIO12 | ||
217 | |||
218 | /* | ||
219 | * Put new board definitions here | ||
220 | */ | ||
221 | |||
222 | |||
223 | #endif | ||
diff --git a/include/asm-arm/arch-ixp23xx/ixdp2351.h b/include/asm-arm/arch-ixp23xx/ixdp2351.h new file mode 100644 index 000000000000..4a24f8f15655 --- /dev/null +++ b/include/asm-arm/arch-ixp23xx/ixdp2351.h | |||
@@ -0,0 +1,89 @@ | |||
1 | /* | ||
2 | * include/asm-arm/arch-ixp23xx/ixdp2351.h | ||
3 | * | ||
4 | * Register and other defines for IXDP2351 | ||
5 | * | ||
6 | * Copyright (c) 2002-2004 Intel Corp. | ||
7 | * Copytight (c) 2005 MontaVista Software, Inc. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License as published by the | ||
11 | * Free Software Foundation; either version 2 of the License, or (at your | ||
12 | * option) any later version. | ||
13 | */ | ||
14 | |||
15 | #ifndef __ASM_ARCH_IXDP2351_H | ||
16 | #define __ASM_ARCH_IXDP2351_H | ||
17 | |||
18 | /* | ||
19 | * NP module memory map | ||
20 | */ | ||
21 | #define IXDP2351_NP_PHYS_BASE (IXP23XX_EXP_BUS_CS4_BASE) | ||
22 | #define IXDP2351_NP_PHYS_SIZE 0x00100000 | ||
23 | #define IXDP2351_NP_VIRT_BASE 0xeff00000 | ||
24 | |||
25 | #define IXDP2351_VIRT_CS8900_BASE (IXDP2351_NP_VIRT_BASE) | ||
26 | #define IXDP2351_VIRT_CS8900_END (IXDP2351_VIRT_CS8900_BASE + 16) | ||
27 | |||
28 | #define IXDP2351_VIRT_NP_CPLD_BASE (IXP23XX_EXP_BUS_CS4_BASE_VIRT + 0x00010000) | ||
29 | |||
30 | #define IXDP2351_NP_CPLD_REG(reg) ((volatile u16 *)(IXDP2351_VIRT_NP_CPLD_BASE + reg)) | ||
31 | |||
32 | #define IXDP2351_NP_CPLD_RESET1_REG IXDP2351_NP_CPLD_REG(0x00) | ||
33 | #define IXDP2351_NP_CPLD_LED_REG IXDP2351_NP_CPLD_REG(0x02) | ||
34 | #define IXDP2351_NP_CPLD_VERSION_REG IXDP2351_NP_CPLD_REG(0x04) | ||
35 | |||
36 | /* | ||
37 | * Base board module memory map | ||
38 | */ | ||
39 | |||
40 | #define IXDP2351_BB_BASE_PHYS (IXP23XX_EXP_BUS_CS5_BASE) | ||
41 | #define IXDP2351_BB_SIZE 0x01000000 | ||
42 | #define IXDP2351_BB_BASE_VIRT (0xee000000) | ||
43 | |||
44 | #define IXDP2351_BB_AREA_BASE(offset) (IXDP2351_BB_BASE_VIRT + offset) | ||
45 | |||
46 | #define IXDP2351_VIRT_NVRAM_BASE IXDP2351_BB_AREA_BASE(0x0) | ||
47 | #define IXDP2351_NVRAM_SIZE (0x20000) | ||
48 | |||
49 | #define IXDP2351_VIRT_MB_IXF1104_BASE IXDP3251_BB_AREA_BASE(0x00020000) | ||
50 | #define IXDP2351_VIRT_ADD_UART_BASE IXDP2351_BB_AREA_BASE(0x000240C0) | ||
51 | #define IXDP2351_VIRT_FIC_BASE IXDP2351_BB_AREA_BASE(0x00200000) | ||
52 | #define IXDP2351_VIRT_DB0_BASE IXDP2351_BB_AREA_BASE(0x00400000) | ||
53 | #define IXDP2351_VIRT_DB1_BASE IXDP2351_BB_AREA_BASE(0x00600000) | ||
54 | #define IXDP2351_VIRT_CPLD_BASE IXDP2351_BB_AREA_BASE(0x00024000) | ||
55 | |||
56 | /* | ||
57 | * On board CPLD registers | ||
58 | */ | ||
59 | #define IXDP2351_CPLD_BB_REG(reg) ((volatile u16 *)(IXDP2351_VIRT_CPLD_BASE + reg)) | ||
60 | |||
61 | #define IXDP2351_CPLD_RESET0_REG IXDP2351_CPLD_BB_REG(0x00) | ||
62 | #define IXDP2351_CPLD_RESET1_REG IXDP2351_CPLD_BB_REG(0x04) | ||
63 | |||
64 | #define IXDP2351_CPLD_RESET1_MAGIC 0x55AA | ||
65 | #define IXDP2351_CPLD_RESET1_ENABLE 0x8000 | ||
66 | |||
67 | #define IXDP2351_CPLD_FPGA_CONFIG_REG IXDP2351_CPLD_BB_REG(0x08) | ||
68 | #define IXDP2351_CPLD_INTB_MASK_SET_REG IXDP2351_CPLD_BB_REG(0x10) | ||
69 | #define IXDP2351_CPLD_INTA_MASK_SET_REG IXDP2351_CPLD_BB_REG(0x14) | ||
70 | #define IXDP2351_CPLD_INTB_STAT_REG IXDP2351_CPLD_BB_REG(0x18) | ||
71 | #define IXDP2351_CPLD_INTA_STAT_REG IXDP2351_CPLD_BB_REG(0x1C) | ||
72 | #define IXDP2351_CPLD_INTB_RAW_REG IXDP2351_CPLD_BB_REG(0x20) /* read */ | ||
73 | #define IXDP2351_CPLD_INTA_RAW_REG IXDP2351_CPLD_BB_REG(0x24) /* read */ | ||
74 | #define IXDP2351_CPLD_INTB_MASK_CLR_REG IXDP2351_CPLD_INTB_RAW_REG /* write */ | ||
75 | #define IXDP2351_CPLD_INTA_MASK_CLR_REG IXDP2351_CPLD_INTA_RAW_REG /* write */ | ||
76 | #define IXDP2351_CPLD_INTB_SIM_REG IXDP2351_CPLD_BB_REG(0x28) | ||
77 | #define IXDP2351_CPLD_INTA_SIM_REG IXDP2351_CPLD_BB_REG(0x2C) | ||
78 | /* Interrupt bits are defined in irqs.h */ | ||
79 | #define IXDP2351_CPLD_BB_GBE0_REG IXDP2351_CPLD_BB_REG(0x30) | ||
80 | #define IXDP2351_CPLD_BB_GBE1_REG IXDP2351_CPLD_BB_REG(0x34) | ||
81 | |||
82 | /* #define IXDP2351_CPLD_BB_MISC_REG IXDP2351_CPLD_REG(0x1C) */ | ||
83 | /* #define IXDP2351_CPLD_BB_MISC_REV_MASK 0xFF */ | ||
84 | /* #define IXDP2351_CPLD_BB_GDXCS0_REG IXDP2351_CPLD_REG(0x24) */ | ||
85 | /* #define IXDP2351_CPLD_BB_GDXCS1_REG IXDP2351_CPLD_REG(0x28) */ | ||
86 | /* #define IXDP2351_CPLD_BB_CLOCK_REG IXDP2351_CPLD_REG(0x04) */ | ||
87 | |||
88 | |||
89 | #endif | ||
diff --git a/include/asm-arm/arch-ixp23xx/ixp23xx.h b/include/asm-arm/arch-ixp23xx/ixp23xx.h new file mode 100644 index 000000000000..e49e1ca61b1a --- /dev/null +++ b/include/asm-arm/arch-ixp23xx/ixp23xx.h | |||
@@ -0,0 +1,306 @@ | |||
1 | /* | ||
2 | * include/asm-arm/arch-ixp23xx/ixp23xx.h | ||
3 | * | ||
4 | * Register definitions for IXP23XX | ||
5 | * | ||
6 | * Copyright (C) 2003-2005 Intel Corporation. | ||
7 | * Copyright (C) 2005 MontaVista Software, Inc. | ||
8 | * | ||
9 | * Maintainer: Deepak Saxena <dsaxena@plexity.net> | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or modify | ||
12 | * it under the terms of the GNU General Public License version 2 as | ||
13 | * published by the Free Software Foundation. | ||
14 | */ | ||
15 | |||
16 | #ifndef __ASM_ARCH_IXP23XX_H | ||
17 | #define __ASM_ARCH_IXP23XX_H | ||
18 | |||
19 | /* | ||
20 | * IXP2300 linux memory map: | ||
21 | * | ||
22 | * virt phys size | ||
23 | * fffd0000 a0000000 64K XSI2CPP_CSR | ||
24 | * fffc0000 c4000000 4K EXP_CFG | ||
25 | * fff00000 c8000000 64K PERIPHERAL | ||
26 | * fe000000 1c0000000 16M CAP_CSR | ||
27 | * fd000000 1c8000000 16M MSF_CSR | ||
28 | * fb000000 16M --- | ||
29 | * fa000000 1d8000000 32M PCI_IO | ||
30 | * f8000000 1da000000 32M PCI_CFG | ||
31 | * f6000000 1de000000 32M PCI_CREG | ||
32 | * f4000000 32M --- | ||
33 | * f0000000 1e0000000 64M PCI_MEM | ||
34 | * e[c-f]000000 per-platform mappings | ||
35 | */ | ||
36 | |||
37 | |||
38 | /**************************************************************************** | ||
39 | * Static mappings. | ||
40 | ****************************************************************************/ | ||
41 | #define IXP23XX_XSI2CPP_CSR_PHYS 0xa0000000 | ||
42 | #define IXP23XX_XSI2CPP_CSR_VIRT 0xfffd0000 | ||
43 | #define IXP23XX_XSI2CPP_CSR_SIZE 0x00010000 | ||
44 | |||
45 | #define IXP23XX_EXP_CFG_PHYS 0xc4000000 | ||
46 | #define IXP23XX_EXP_CFG_VIRT 0xfffc0000 | ||
47 | #define IXP23XX_EXP_CFG_SIZE 0x00001000 | ||
48 | |||
49 | #define IXP23XX_PERIPHERAL_PHYS 0xc8000000 | ||
50 | #define IXP23XX_PERIPHERAL_VIRT 0xfff00000 | ||
51 | #define IXP23XX_PERIPHERAL_SIZE 0x00010000 | ||
52 | |||
53 | #define IXP23XX_CAP_CSR_PHYS 0x1c0000000ULL | ||
54 | #define IXP23XX_CAP_CSR_VIRT 0xfe000000 | ||
55 | #define IXP23XX_CAP_CSR_SIZE 0x01000000 | ||
56 | |||
57 | #define IXP23XX_MSF_CSR_PHYS 0x1c8000000ULL | ||
58 | #define IXP23XX_MSF_CSR_VIRT 0xfd000000 | ||
59 | #define IXP23XX_MSF_CSR_SIZE 0x01000000 | ||
60 | |||
61 | #define IXP23XX_PCI_IO_PHYS 0x1d8000000ULL | ||
62 | #define IXP23XX_PCI_IO_VIRT 0xfa000000 | ||
63 | #define IXP23XX_PCI_IO_SIZE 0x02000000 | ||
64 | |||
65 | #define IXP23XX_PCI_CFG_PHYS 0x1da000000ULL | ||
66 | #define IXP23XX_PCI_CFG_VIRT 0xf8000000 | ||
67 | #define IXP23XX_PCI_CFG_SIZE 0x02000000 | ||
68 | #define IXP23XX_PCI_CFG0_VIRT IXP23XX_PCI_CFG_VIRT | ||
69 | #define IXP23XX_PCI_CFG1_VIRT (IXP23XX_PCI_CFG_VIRT + 0x01000000) | ||
70 | |||
71 | #define IXP23XX_PCI_CREG_PHYS 0x1de000000ULL | ||
72 | #define IXP23XX_PCI_CREG_VIRT 0xf6000000 | ||
73 | #define IXP23XX_PCI_CREG_SIZE 0x02000000 | ||
74 | #define IXP23XX_PCI_CSR_VIRT (IXP23XX_PCI_CREG_VIRT + 0x01000000) | ||
75 | |||
76 | #define IXP23XX_PCI_MEM_START 0xe0000000 | ||
77 | #define IXP23XX_PCI_MEM_PHYS 0x1e0000000ULL | ||
78 | #define IXP23XX_PCI_MEM_VIRT 0xf0000000 | ||
79 | #define IXP23XX_PCI_MEM_SIZE 0x04000000 | ||
80 | |||
81 | |||
82 | /**************************************************************************** | ||
83 | * XSI2CPP CSRs. | ||
84 | ****************************************************************************/ | ||
85 | #define IXP23XX_XSI2CPP_REG(x) ((volatile unsigned long *)(IXP23XX_XSI2CPP_CSR_VIRT + (x))) | ||
86 | #define IXP23XX_CPP2XSI_CURR_XFER_REG3 IXP23XX_XSI2CPP_REG(0xf8) | ||
87 | #define IXP23XX_CPP2XSI_ADDR_31 (1 << 19) | ||
88 | #define IXP23XX_CPP2XSI_PSH_OFF (1 << 20) | ||
89 | #define IXP23XX_CPP2XSI_COH_OFF (1 << 21) | ||
90 | |||
91 | |||
92 | /**************************************************************************** | ||
93 | * Expansion Bus Config. | ||
94 | ****************************************************************************/ | ||
95 | #define IXP23XX_EXP_CFG_REG(x) ((volatile unsigned long *)(IXP23XX_EXP_CFG_VIRT + (x))) | ||
96 | #define IXP23XX_EXP_CS0 IXP23XX_EXP_CFG_REG(0x00) | ||
97 | #define IXP23XX_EXP_CS1 IXP23XX_EXP_CFG_REG(0x04) | ||
98 | #define IXP23XX_EXP_CS2 IXP23XX_EXP_CFG_REG(0x08) | ||
99 | #define IXP23XX_EXP_CS3 IXP23XX_EXP_CFG_REG(0x0c) | ||
100 | #define IXP23XX_EXP_CS4 IXP23XX_EXP_CFG_REG(0x10) | ||
101 | #define IXP23XX_EXP_CS5 IXP23XX_EXP_CFG_REG(0x14) | ||
102 | #define IXP23XX_EXP_CS6 IXP23XX_EXP_CFG_REG(0x18) | ||
103 | #define IXP23XX_EXP_CS7 IXP23XX_EXP_CFG_REG(0x1c) | ||
104 | #define IXP23XX_FLASH_WRITABLE (0x2) | ||
105 | #define IXP23XX_FLASH_BUS8 (0x1) | ||
106 | |||
107 | #define IXP23XX_EXP_CFG0 IXP23XX_EXP_CFG_REG(0x20) | ||
108 | #define IXP23XX_EXP_CFG1 IXP23XX_EXP_CFG_REG(0x24) | ||
109 | #define IXP23XX_EXP_CFG0_MEM_MAP (1 << 31) | ||
110 | #define IXP23XX_EXP_CFG0_XSCALE_SPEED_SEL (3 << 22) | ||
111 | #define IXP23XX_EXP_CFG0_XSCALE_SPEED_EN (1 << 21) | ||
112 | #define IXP23XX_EXP_CFG0_CPP_SPEED_SEL (3 << 19) | ||
113 | #define IXP23XX_EXP_CFG0_CPP_SPEED_EN (1 << 18) | ||
114 | #define IXP23XX_EXP_CFG0_PCI_SWIN (3 << 16) | ||
115 | #define IXP23XX_EXP_CFG0_PCI_DWIN (3 << 14) | ||
116 | #define IXP23XX_EXP_CFG0_PCI33_MODE (1 << 13) | ||
117 | #define IXP23XX_EXP_CFG0_QDR_SPEED_SEL (1 << 12) | ||
118 | #define IXP23XX_EXP_CFG0_CPP_DIV_SEL (1 << 5) | ||
119 | #define IXP23XX_EXP_CFG0_XSI_NOT_PRES (1 << 4) | ||
120 | #define IXP23XX_EXP_CFG0_PROM_BOOT (1 << 3) | ||
121 | #define IXP23XX_EXP_CFG0_PCI_ARB (1 << 2) | ||
122 | #define IXP23XX_EXP_CFG0_PCI_HOST (1 << 1) | ||
123 | #define IXP23XX_EXP_CFG0_FLASH_WIDTH (1 << 0) | ||
124 | |||
125 | #define IXP23XX_EXP_UNIT_FUSE IXP23XX_EXP_CFG_REG(0x28) | ||
126 | #define IXP23XX_EXP_MSF_MUX IXP23XX_EXP_CFG_REG(0x30) | ||
127 | |||
128 | #define IXP23XX_EXP_BUS_PHYS 0x90000000 | ||
129 | #define IXP23XX_EXP_BUS_WINDOW_SIZE 0x01000000 | ||
130 | |||
131 | #define IXP23XX_EXP_BUS_CS0_BASE (IXP23XX_EXP_BUS_PHYS + 0x00000000) | ||
132 | #define IXP23XX_EXP_BUS_CS1_BASE (IXP23XX_EXP_BUS_PHYS + 0x01000000) | ||
133 | #define IXP23XX_EXP_BUS_CS2_BASE (IXP23XX_EXP_BUS_PHYS + 0x02000000) | ||
134 | #define IXP23XX_EXP_BUS_CS3_BASE (IXP23XX_EXP_BUS_PHYS + 0x03000000) | ||
135 | #define IXP23XX_EXP_BUS_CS4_BASE (IXP23XX_EXP_BUS_PHYS + 0x04000000) | ||
136 | #define IXP23XX_EXP_BUS_CS5_BASE (IXP23XX_EXP_BUS_PHYS + 0x05000000) | ||
137 | #define IXP23XX_EXP_BUS_CS6_BASE (IXP23XX_EXP_BUS_PHYS + 0x06000000) | ||
138 | #define IXP23XX_EXP_BUS_CS7_BASE (IXP23XX_EXP_BUS_PHYS + 0x07000000) | ||
139 | |||
140 | |||
141 | /**************************************************************************** | ||
142 | * Peripherals. | ||
143 | ****************************************************************************/ | ||
144 | #define IXP23XX_UART1_VIRT (IXP23XX_PERIPHERAL_VIRT + 0x0000) | ||
145 | #define IXP23XX_UART2_VIRT (IXP23XX_PERIPHERAL_VIRT + 0x1000) | ||
146 | #define IXP23XX_PMU_VIRT (IXP23XX_PERIPHERAL_VIRT + 0x2000) | ||
147 | #define IXP23XX_INTC_VIRT (IXP23XX_PERIPHERAL_VIRT + 0x3000) | ||
148 | #define IXP23XX_GPIO_VIRT (IXP23XX_PERIPHERAL_VIRT + 0x4000) | ||
149 | #define IXP23XX_TIMER_VIRT (IXP23XX_PERIPHERAL_VIRT + 0x5000) | ||
150 | #define IXP23XX_NPE0_VIRT (IXP23XX_PERIPHERAL_VIRT + 0x6000) | ||
151 | #define IXP23XX_DSR_VIRT (IXP23XX_PERIPHERAL_VIRT + 0x7000) | ||
152 | #define IXP23XX_NPE1_VIRT (IXP23XX_PERIPHERAL_VIRT + 0x8000) | ||
153 | #define IXP23XX_ETH0_VIRT (IXP23XX_PERIPHERAL_VIRT + 0x9000) | ||
154 | #define IXP23XX_ETH1_VIRT (IXP23XX_PERIPHERAL_VIRT + 0xA000) | ||
155 | #define IXP23XX_GIG0_VIRT (IXP23XX_PERIPHERAL_VIRT + 0xB000) | ||
156 | #define IXP23XX_GIG1_VIRT (IXP23XX_PERIPHERAL_VIRT + 0xC000) | ||
157 | #define IXP23XX_DDRS_VIRT (IXP23XX_PERIPHERAL_VIRT + 0xD000) | ||
158 | |||
159 | #define IXP23XX_UART1_PHYS (IXP23XX_PERIPHERAL_PHYS + 0x0000) | ||
160 | #define IXP23XX_UART2_PHYS (IXP23XX_PERIPHERAL_PHYS + 0x1000) | ||
161 | #define IXP23XX_PMU_PHYS (IXP23XX_PERIPHERAL_PHYS + 0x2000) | ||
162 | #define IXP23XX_INTC_PHYS (IXP23XX_PERIPHERAL_PHYS + 0x3000) | ||
163 | #define IXP23XX_GPIO_PHYS (IXP23XX_PERIPHERAL_PHYS + 0x4000) | ||
164 | #define IXP23XX_TIMER_PHYS (IXP23XX_PERIPHERAL_PHYS + 0x5000) | ||
165 | #define IXP23XX_NPE0_PHYS (IXP23XX_PERIPHERAL_PHYS + 0x6000) | ||
166 | #define IXP23XX_DSR_PHYS (IXP23XX_PERIPHERAL_PHYS + 0x7000) | ||
167 | #define IXP23XX_NPE1_PHYS (IXP23XX_PERIPHERAL_PHYS + 0x8000) | ||
168 | #define IXP23XX_ETH0_PHYS (IXP23XX_PERIPHERAL_PHYS + 0x9000) | ||
169 | #define IXP23XX_ETH1_PHYS (IXP23XX_PERIPHERAL_PHYS + 0xA000) | ||
170 | #define IXP23XX_GIG0_PHYS (IXP23XX_PERIPHERAL_PHYS + 0xB000) | ||
171 | #define IXP23XX_GIG1_PHYS (IXP23XX_PERIPHERAL_PHYS + 0xC000) | ||
172 | #define IXP23XX_DDRS_PHYS (IXP23XX_PERIPHERAL_PHYS + 0xD000) | ||
173 | |||
174 | |||
175 | /**************************************************************************** | ||
176 | * Interrupt controller. | ||
177 | ****************************************************************************/ | ||
178 | #define IXP23XX_INTC_REG(x) ((volatile unsigned long *)(IXP23XX_INTC_VIRT + (x))) | ||
179 | #define IXP23XX_INTR_ST1 IXP23XX_INTC_REG(0x00) | ||
180 | #define IXP23XX_INTR_ST2 IXP23XX_INTC_REG(0x04) | ||
181 | #define IXP23XX_INTR_ST3 IXP23XX_INTC_REG(0x08) | ||
182 | #define IXP23XX_INTR_ST4 IXP23XX_INTC_REG(0x0c) | ||
183 | #define IXP23XX_INTR_EN1 IXP23XX_INTC_REG(0x10) | ||
184 | #define IXP23XX_INTR_EN2 IXP23XX_INTC_REG(0x14) | ||
185 | #define IXP23XX_INTR_EN3 IXP23XX_INTC_REG(0x18) | ||
186 | #define IXP23XX_INTR_EN4 IXP23XX_INTC_REG(0x1c) | ||
187 | #define IXP23XX_INTR_SEL1 IXP23XX_INTC_REG(0x20) | ||
188 | #define IXP23XX_INTR_SEL2 IXP23XX_INTC_REG(0x24) | ||
189 | #define IXP23XX_INTR_SEL3 IXP23XX_INTC_REG(0x28) | ||
190 | #define IXP23XX_INTR_SEL4 IXP23XX_INTC_REG(0x2c) | ||
191 | #define IXP23XX_INTR_IRQ_ST1 IXP23XX_INTC_REG(0x30) | ||
192 | #define IXP23XX_INTR_IRQ_ST2 IXP23XX_INTC_REG(0x34) | ||
193 | #define IXP23XX_INTR_IRQ_ST3 IXP23XX_INTC_REG(0x38) | ||
194 | #define IXP23XX_INTR_IRQ_ST4 IXP23XX_INTC_REG(0x3c) | ||
195 | #define IXP23XX_INTR_IRQ_ENC_ST_OFFSET 0x54 | ||
196 | |||
197 | |||
198 | /**************************************************************************** | ||
199 | * GPIO. | ||
200 | ****************************************************************************/ | ||
201 | #define IXP23XX_GPIO_REG(x) ((volatile unsigned long *)(IXP23XX_GPIO_VIRT + (x))) | ||
202 | #define IXP23XX_GPIO_GPOUTR IXP23XX_GPIO_REG(0x00) | ||
203 | #define IXP23XX_GPIO_GPOER IXP23XX_GPIO_REG(0x04) | ||
204 | #define IXP23XX_GPIO_GPINR IXP23XX_GPIO_REG(0x08) | ||
205 | #define IXP23XX_GPIO_GPISR IXP23XX_GPIO_REG(0x0c) | ||
206 | #define IXP23XX_GPIO_GPIT1R IXP23XX_GPIO_REG(0x10) | ||
207 | #define IXP23XX_GPIO_GPIT2R IXP23XX_GPIO_REG(0x14) | ||
208 | #define IXP23XX_GPIO_GPCLKR IXP23XX_GPIO_REG(0x18) | ||
209 | #define IXP23XX_GPIO_GPDBSELR IXP23XX_GPIO_REG(0x1c) | ||
210 | |||
211 | #define IXP23XX_GPIO_STYLE_MASK 0x7 | ||
212 | #define IXP23XX_GPIO_STYLE_ACTIVE_HIGH 0x0 | ||
213 | #define IXP23XX_GPIO_STYLE_ACTIVE_LOW 0x1 | ||
214 | #define IXP23XX_GPIO_STYLE_RISING_EDGE 0x2 | ||
215 | #define IXP23XX_GPIO_STYLE_FALLING_EDGE 0x3 | ||
216 | #define IXP23XX_GPIO_STYLE_TRANSITIONAL 0x4 | ||
217 | |||
218 | #define IXP23XX_GPIO_STYLE_SIZE 3 | ||
219 | |||
220 | |||
221 | /**************************************************************************** | ||
222 | * Timer. | ||
223 | ****************************************************************************/ | ||
224 | #define IXP23XX_TIMER_REG(x) ((volatile unsigned long *)(IXP23XX_TIMER_VIRT + (x))) | ||
225 | #define IXP23XX_TIMER_CONT IXP23XX_TIMER_REG(0x00) | ||
226 | #define IXP23XX_TIMER1_TIMESTAMP IXP23XX_TIMER_REG(0x04) | ||
227 | #define IXP23XX_TIMER1_RELOAD IXP23XX_TIMER_REG(0x08) | ||
228 | #define IXP23XX_TIMER2_TIMESTAMP IXP23XX_TIMER_REG(0x0c) | ||
229 | #define IXP23XX_TIMER2_RELOAD IXP23XX_TIMER_REG(0x10) | ||
230 | #define IXP23XX_TIMER_WDOG IXP23XX_TIMER_REG(0x14) | ||
231 | #define IXP23XX_TIMER_WDOG_EN IXP23XX_TIMER_REG(0x18) | ||
232 | #define IXP23XX_TIMER_WDOG_KEY IXP23XX_TIMER_REG(0x1c) | ||
233 | #define IXP23XX_TIMER_WDOG_KEY_MAGIC 0x482e | ||
234 | #define IXP23XX_TIMER_STATUS IXP23XX_TIMER_REG(0x20) | ||
235 | #define IXP23XX_TIMER_SOFT_RESET IXP23XX_TIMER_REG(0x24) | ||
236 | #define IXP23XX_TIMER_SOFT_RESET_EN IXP23XX_TIMER_REG(0x28) | ||
237 | |||
238 | #define IXP23XX_TIMER_ENABLE (1 << 0) | ||
239 | #define IXP23XX_TIMER_ONE_SHOT (1 << 1) | ||
240 | /* Low order bits of reload value ignored */ | ||
241 | #define IXP23XX_TIMER_RELOAD_MASK (0x3) | ||
242 | #define IXP23XX_TIMER_DISABLED (0x0) | ||
243 | #define IXP23XX_TIMER1_INT_PEND (1 << 0) | ||
244 | #define IXP23XX_TIMER2_INT_PEND (1 << 1) | ||
245 | #define IXP23XX_TIMER_STATUS_TS_PEND (1 << 2) | ||
246 | #define IXP23XX_TIMER_STATUS_WDOG_PEND (1 << 3) | ||
247 | #define IXP23XX_TIMER_STATUS_WARM_RESET (1 << 4) | ||
248 | |||
249 | |||
250 | /**************************************************************************** | ||
251 | * CAP CSRs. | ||
252 | ****************************************************************************/ | ||
253 | #define IXP23XX_GLOBAL_REG(x) ((volatile unsigned long *)(IXP23XX_CAP_CSR_VIRT + 0x4a00 + (x))) | ||
254 | #define IXP23XX_PROD_IDG IXP23XX_GLOBAL_REG(0x00) | ||
255 | #define IXP23XX_MISC_CONTROL IXP23XX_GLOBAL_REG(0x04) | ||
256 | #define IXP23XX_MSF_CLK_CNTRL IXP23XX_GLOBAL_REG(0x08) | ||
257 | #define IXP23XX_RESET0 IXP23XX_GLOBAL_REG(0x0c) | ||
258 | #define IXP23XX_RESET1 IXP23XX_GLOBAL_REG(0x10) | ||
259 | #define IXP23XX_STRAP_OPTIONS IXP23XX_GLOBAL_REG(0x18) | ||
260 | |||
261 | #define IXP23XX_ENABLE_WATCHDOG (1 << 24) | ||
262 | #define IXP23XX_SHPC_INIT_COMP (1 << 21) | ||
263 | #define IXP23XX_RST_ALL (1 << 16) | ||
264 | #define IXP23XX_RESET_PCI (1 << 2) | ||
265 | #define IXP23XX_PCI_UNIT_RESET (1 << 1) | ||
266 | #define IXP23XX_XSCALE_RESET (1 << 0) | ||
267 | |||
268 | |||
269 | /**************************************************************************** | ||
270 | * PCI CSRs. | ||
271 | ****************************************************************************/ | ||
272 | #define IXP23XX_PCI_CREG(x) ((volatile unsigned long *)(IXP23XX_PCI_CREG_VIRT + (x))) | ||
273 | #define IXP23XX_PCI_CMDSTAT IXP23XX_PCI_CREG(0x04) | ||
274 | #define IXP23XX_PCI_SRAM_BAR IXP23XX_PCI_CREG(0x14) | ||
275 | #define IXP23XX_PCI_SDRAM_BAR IXP23XX_PCI_CREG(0x18) | ||
276 | |||
277 | |||
278 | #define IXP23XX_PCI_CSR(x) ((volatile unsigned long *)(IXP23XX_PCI_CREG_VIRT + 0x01000000 + (x))) | ||
279 | #define IXP23XX_PCI_OUT_INT_STATUS IXP23XX_PCI_CSR(0x0030) | ||
280 | #define IXP23XX_PCI_OUT_INT_MASK IXP23XX_PCI_CSR(0x0034) | ||
281 | #define IXP23XX_PCI_SRAM_BASE_ADDR_MASK IXP23XX_PCI_CSR(0x00fc) | ||
282 | #define IXP23XX_PCI_DRAM_BASE_ADDR_MASK IXP23XX_PCI_CSR(0x0100) | ||
283 | #define IXP23XX_PCI_CONTROL IXP23XX_PCI_CSR(0x013c) | ||
284 | #define IXP23XX_PCI_ADDR_EXT IXP23XX_PCI_CSR(0x0140) | ||
285 | #define IXP23XX_PCI_ME_PUSH_STATUS IXP23XX_PCI_CSR(0x0148) | ||
286 | #define IXP23XX_PCI_ME_PUSH_EN IXP23XX_PCI_CSR(0x014c) | ||
287 | #define IXP23XX_PCI_ERR_STATUS IXP23XX_PCI_CSR(0x0150) | ||
288 | #define IXP23XX_PCI_ERROR_STATUS IXP23XX_PCI_CSR(0x0150) | ||
289 | #define IXP23XX_PCI_ERR_ENABLE IXP23XX_PCI_CSR(0x0154) | ||
290 | #define IXP23XX_PCI_XSCALE_INT_STATUS IXP23XX_PCI_CSR(0x0158) | ||
291 | #define IXP23XX_PCI_XSCALE_INT_ENABLE IXP23XX_PCI_CSR(0x015c) | ||
292 | #define IXP23XX_PCI_CPP_ADDR_BITS IXP23XX_PCI_CSR(0x0160) | ||
293 | |||
294 | |||
295 | #ifndef __ASSEMBLY__ | ||
296 | /* | ||
297 | * Is system memory on the XSI or CPP bus? | ||
298 | */ | ||
299 | static inline unsigned ixp23xx_cpp_boot(void) | ||
300 | { | ||
301 | return (*IXP23XX_EXP_CFG0 & IXP23XX_EXP_CFG0_XSI_NOT_PRES); | ||
302 | } | ||
303 | #endif | ||
304 | |||
305 | |||
306 | #endif | ||
diff --git a/include/asm-arm/arch-ixp23xx/memory.h b/include/asm-arm/arch-ixp23xx/memory.h new file mode 100644 index 000000000000..bebcf0aa0d72 --- /dev/null +++ b/include/asm-arm/arch-ixp23xx/memory.h | |||
@@ -0,0 +1,46 @@ | |||
1 | /* | ||
2 | * include/asm-arm/arch-ixp23xx/memory.h | ||
3 | * | ||
4 | * Copyright (c) 2003-2004 Intel Corp. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the | ||
8 | * Free Software Foundation; either version 2 of the License, or (at your | ||
9 | * option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef __ASM_ARCH_MEMORY_H | ||
13 | #define __ASM_ARCH_MEMORY_H | ||
14 | |||
15 | #include <asm/hardware.h> | ||
16 | |||
17 | /* | ||
18 | * Physical DRAM offset. | ||
19 | */ | ||
20 | #define PHYS_OFFSET (0x00000000) | ||
21 | |||
22 | |||
23 | /* | ||
24 | * Virtual view <-> DMA view memory address translations | ||
25 | * virt_to_bus: Used to translate the virtual address to an | ||
26 | * address suitable to be passed to set_dma_addr | ||
27 | * bus_to_virt: Used to convert an address for DMA operations | ||
28 | * to an address that the kernel can use. | ||
29 | */ | ||
30 | #ifndef __ASSEMBLY__ | ||
31 | |||
32 | #define __virt_to_bus(v) \ | ||
33 | ({ unsigned int ret; \ | ||
34 | ret = ((__virt_to_phys(v) - 0x00000000) + \ | ||
35 | (*((volatile int *)IXP23XX_PCI_SDRAM_BAR) & 0xfffffff0)); \ | ||
36 | ret; }) | ||
37 | |||
38 | #define __bus_to_virt(b) \ | ||
39 | ({ unsigned int data; \ | ||
40 | data = *((volatile int *)IXP23XX_PCI_SDRAM_BAR); \ | ||
41 | __phys_to_virt((((b - (data & 0xfffffff0)) + 0x00000000))); }) | ||
42 | |||
43 | #endif | ||
44 | |||
45 | |||
46 | #endif | ||
diff --git a/include/asm-arm/arch-ixp23xx/platform.h b/include/asm-arm/arch-ixp23xx/platform.h new file mode 100644 index 000000000000..f85b4685a491 --- /dev/null +++ b/include/asm-arm/arch-ixp23xx/platform.h | |||
@@ -0,0 +1,31 @@ | |||
1 | /* | ||
2 | * include/asm-arm/arch-ixp23xx/platform.h | ||
3 | * | ||
4 | * Various bits of code used by platform-level code. | ||
5 | * | ||
6 | * Author: Deepak Saxena <dsaxena@plexity.net> | ||
7 | * | ||
8 | * Copyright 2005 (c) MontaVista Software, Inc. | ||
9 | * | ||
10 | * This file is licensed under the terms of the GNU General Public | ||
11 | * License version 2. This program is licensed "as is" without any | ||
12 | * warranty of any kind, whether express or implied. | ||
13 | */ | ||
14 | |||
15 | #ifndef __ASSEMBLY__ | ||
16 | |||
17 | struct pci_sys_data; | ||
18 | |||
19 | void ixp23xx_map_io(void); | ||
20 | void ixp23xx_init_irq(void); | ||
21 | void ixp23xx_sys_init(void); | ||
22 | int ixp23xx_pci_setup(int, struct pci_sys_data *); | ||
23 | void ixp23xx_pci_preinit(void); | ||
24 | struct pci_bus *ixp23xx_pci_scan_bus(int, struct pci_sys_data*); | ||
25 | |||
26 | extern struct sys_timer ixp23xx_timer; | ||
27 | |||
28 | #define IXP23XX_UART_XTAL 14745600 | ||
29 | |||
30 | |||
31 | #endif | ||
diff --git a/include/asm-arm/arch-ixp23xx/system.h b/include/asm-arm/arch-ixp23xx/system.h new file mode 100644 index 000000000000..925e6b0c338b --- /dev/null +++ b/include/asm-arm/arch-ixp23xx/system.h | |||
@@ -0,0 +1,33 @@ | |||
1 | /* | ||
2 | * include/asm-arm/arch-ixp23xx/system.h | ||
3 | * | ||
4 | * Copyright (C) 2003 Intel Corporation. | ||
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 | |||
11 | #include <asm/hardware.h> | ||
12 | #include <asm/mach-types.h> | ||
13 | |||
14 | static inline void arch_idle(void) | ||
15 | { | ||
16 | #if 0 | ||
17 | if (!hlt_counter) | ||
18 | cpu_do_idle(); | ||
19 | #endif | ||
20 | } | ||
21 | |||
22 | static inline void arch_reset(char mode) | ||
23 | { | ||
24 | /* First try machine specific support */ | ||
25 | if (machine_is_ixdp2351()) { | ||
26 | *IXDP2351_CPLD_RESET1_REG = IXDP2351_CPLD_RESET1_MAGIC; | ||
27 | (void) *IXDP2351_CPLD_RESET1_REG; | ||
28 | *IXDP2351_CPLD_RESET1_REG = IXDP2351_CPLD_RESET1_ENABLE; | ||
29 | } | ||
30 | |||
31 | /* Use on-chip reset capability */ | ||
32 | *IXP23XX_RESET0 |= IXP23XX_RST_ALL; | ||
33 | } | ||
diff --git a/include/asm-arm/arch-ixp23xx/time.h b/include/asm-arm/arch-ixp23xx/time.h new file mode 100644 index 000000000000..f6828fdd2883 --- /dev/null +++ b/include/asm-arm/arch-ixp23xx/time.h | |||
@@ -0,0 +1,3 @@ | |||
1 | /* | ||
2 | * include/asm-arm/arch-ixp23xx/time.h | ||
3 | */ | ||
diff --git a/include/asm-arm/arch-ixp23xx/timex.h b/include/asm-arm/arch-ixp23xx/timex.h new file mode 100644 index 000000000000..516f72fe6082 --- /dev/null +++ b/include/asm-arm/arch-ixp23xx/timex.h | |||
@@ -0,0 +1,7 @@ | |||
1 | /* | ||
2 | * include/asm-arm/arch-ixp23xx/timex.h | ||
3 | * | ||
4 | * XScale architecture timex specifications | ||
5 | */ | ||
6 | |||
7 | #define CLOCK_TICK_RATE 75000000 | ||
diff --git a/include/asm-arm/arch-ixp23xx/uncompress.h b/include/asm-arm/arch-ixp23xx/uncompress.h new file mode 100644 index 000000000000..62623fa9b2f7 --- /dev/null +++ b/include/asm-arm/arch-ixp23xx/uncompress.h | |||
@@ -0,0 +1,45 @@ | |||
1 | /* | ||
2 | * include/asm-arm/arch-ixp23xx/uncompress.h | ||
3 | * | ||
4 | * Copyright (C) 2002-2004 Intel Corporation. | ||
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 | |||
11 | #ifndef __ASM_ARCH_UNCOMPRESS_H | ||
12 | #define __ASM_ARCH_UNCOMPRESS_H | ||
13 | |||
14 | #include <asm/hardware.h> | ||
15 | #include <linux/serial_reg.h> | ||
16 | |||
17 | #define UART_BASE ((volatile u32 *)IXP23XX_UART1_PHYS) | ||
18 | |||
19 | static __inline__ void putc(char c) | ||
20 | { | ||
21 | int j; | ||
22 | |||
23 | for (j = 0; j < 0x1000; j++) { | ||
24 | if (UART_BASE[UART_LSR] & UART_LSR_THRE) | ||
25 | break; | ||
26 | } | ||
27 | |||
28 | UART_BASE[UART_TX] = c; | ||
29 | } | ||
30 | |||
31 | static void putstr(const char *s) | ||
32 | { | ||
33 | while (*s) { | ||
34 | putc(*s); | ||
35 | if (*s == '\n') | ||
36 | putc('\r'); | ||
37 | s++; | ||
38 | } | ||
39 | } | ||
40 | |||
41 | #define arch_decomp_setup() | ||
42 | #define arch_decomp_wdog() | ||
43 | |||
44 | |||
45 | #endif | ||
diff --git a/include/asm-arm/arch-ixp23xx/vmalloc.h b/include/asm-arm/arch-ixp23xx/vmalloc.h new file mode 100644 index 000000000000..9f2566658541 --- /dev/null +++ b/include/asm-arm/arch-ixp23xx/vmalloc.h | |||
@@ -0,0 +1,10 @@ | |||
1 | /* | ||
2 | * include/asm-arm/arch-ixp23xx/vmalloc.h | ||
3 | * | ||
4 | * Copyright (c) 2005 MontaVista Software, Inc. | ||
5 | * | ||
6 | * NPU mappings end at 0xf0000000 and we allocate 64MB for board | ||
7 | * specific static I/O. | ||
8 | */ | ||
9 | |||
10 | #define VMALLOC_END (0xec000000) | ||
diff --git a/include/asm-arm/arch-ixp4xx/uncompress.h b/include/asm-arm/arch-ixp4xx/uncompress.h index 960c35810a22..09ae6c91be60 100644 --- a/include/asm-arm/arch-ixp4xx/uncompress.h +++ b/include/asm-arm/arch-ixp4xx/uncompress.h | |||
@@ -21,26 +21,18 @@ | |||
21 | 21 | ||
22 | static volatile u32* uart_base; | 22 | static volatile u32* uart_base; |
23 | 23 | ||
24 | static __inline__ void putc(char c) | 24 | static inline void putc(int c) |
25 | { | 25 | { |
26 | /* Check THRE and TEMT bits before we transmit the character. | 26 | /* Check THRE and TEMT bits before we transmit the character. |
27 | */ | 27 | */ |
28 | while ((uart_base[UART_LSR] & TX_DONE) != TX_DONE); | 28 | while ((uart_base[UART_LSR] & TX_DONE) != TX_DONE) |
29 | barrier(); | ||
30 | |||
29 | *uart_base = c; | 31 | *uart_base = c; |
30 | } | 32 | } |
31 | 33 | ||
32 | /* | 34 | static void flush(void) |
33 | * This does not append a newline | ||
34 | */ | ||
35 | static void putstr(const char *s) | ||
36 | { | 35 | { |
37 | while (*s) | ||
38 | { | ||
39 | putc(*s); | ||
40 | if (*s == '\n') | ||
41 | putc('\r'); | ||
42 | s++; | ||
43 | } | ||
44 | } | 36 | } |
45 | 37 | ||
46 | static __inline__ void __arch_decomp_setup(unsigned long arch_id) | 38 | static __inline__ void __arch_decomp_setup(unsigned long arch_id) |
diff --git a/include/asm-arm/arch-l7200/uncompress.h b/include/asm-arm/arch-l7200/uncompress.h index 1caa2b560f53..9fcd40aee3e3 100644 --- a/include/asm-arm/arch-l7200/uncompress.h +++ b/include/asm-arm/arch-l7200/uncompress.h | |||
@@ -16,22 +16,17 @@ | |||
16 | #define __raw_writeb(v,p) (*(volatile unsigned char *)(p) = (v)) | 16 | #define __raw_writeb(v,p) (*(volatile unsigned char *)(p) = (v)) |
17 | #define __raw_readb(p) (*(volatile unsigned char *)(p)) | 17 | #define __raw_readb(p) (*(volatile unsigned char *)(p)) |
18 | 18 | ||
19 | static __inline__ void putc(char c) | 19 | static inline void putc(int c) |
20 | { | 20 | { |
21 | while(__raw_readb(IO_UART + 0x18) & 0x20 || | 21 | while(__raw_readb(IO_UART + 0x18) & 0x20 || |
22 | __raw_readb(IO_UART + 0x18) & 0x08); | 22 | __raw_readb(IO_UART + 0x18) & 0x08) |
23 | barrier(); | ||
24 | |||
23 | __raw_writeb(c, IO_UART + 0x00); | 25 | __raw_writeb(c, IO_UART + 0x00); |
24 | } | 26 | } |
25 | 27 | ||
26 | static void putstr(const char *s) | 28 | static inline void flush(void) |
27 | { | 29 | { |
28 | while (*s) { | ||
29 | if (*s == 10) { /* If a LF, add CR */ | ||
30 | putc(10); | ||
31 | putc(13); | ||
32 | } | ||
33 | putc(*(s++)); | ||
34 | } | ||
35 | } | 30 | } |
36 | 31 | ||
37 | static __inline__ void arch_decomp_setup(void) | 32 | static __inline__ void arch_decomp_setup(void) |
diff --git a/include/asm-arm/arch-lh7a40x/uncompress.h b/include/asm-arm/arch-lh7a40x/uncompress.h index ec8ab67122f3..f8053346f608 100644 --- a/include/asm-arm/arch-lh7a40x/uncompress.h +++ b/include/asm-arm/arch-lh7a40x/uncompress.h | |||
@@ -22,20 +22,15 @@ | |||
22 | #define UART_STATUS (*(volatile unsigned long*) (UART2_PHYS + UART_R_STATUS)) | 22 | #define UART_STATUS (*(volatile unsigned long*) (UART2_PHYS + UART_R_STATUS)) |
23 | #define UART_DATA (*(volatile unsigned long*) (UART2_PHYS + UART_R_DATA)) | 23 | #define UART_DATA (*(volatile unsigned long*) (UART2_PHYS + UART_R_DATA)) |
24 | 24 | ||
25 | static __inline__ void putc (char ch) | 25 | static inline void putc(int ch) |
26 | { | 26 | { |
27 | while (UART_STATUS & nTxRdy) | 27 | while (UART_STATUS & nTxRdy) |
28 | ; | 28 | barrier(); |
29 | UART_DATA = ch; | 29 | UART_DATA = ch; |
30 | } | 30 | } |
31 | 31 | ||
32 | static void putstr (const char* sz) | 32 | static inline void flush(void) |
33 | { | 33 | { |
34 | for (; *sz; ++sz) { | ||
35 | putc (*sz); | ||
36 | if (*sz == '\n') | ||
37 | putc ('\r'); | ||
38 | } | ||
39 | } | 34 | } |
40 | 35 | ||
41 | /* NULL functions; we don't presently need them */ | 36 | /* NULL functions; we don't presently need them */ |
diff --git a/include/asm-arm/arch-omap/uncompress.h b/include/asm-arm/arch-omap/uncompress.h index c718264affbd..ca2c8bec82e7 100644 --- a/include/asm-arm/arch-omap/uncompress.h +++ b/include/asm-arm/arch-omap/uncompress.h | |||
@@ -30,8 +30,7 @@ unsigned int system_rev; | |||
30 | #define check_port(base, shift) ((base[UART_OMAP_MDR1 << shift] & 7) == 0) | 30 | #define check_port(base, shift) ((base[UART_OMAP_MDR1 << shift] & 7) == 0) |
31 | #define omap_get_id() ((*(volatile unsigned int *)(0xfffed404)) >> 12) & ID_MASK | 31 | #define omap_get_id() ((*(volatile unsigned int *)(0xfffed404)) >> 12) & ID_MASK |
32 | 32 | ||
33 | static void | 33 | static void putc(int c) |
34 | putstr(const char *s) | ||
35 | { | 34 | { |
36 | volatile u8 * uart = 0; | 35 | volatile u8 * uart = 0; |
37 | int shift = 2; | 36 | int shift = 2; |
@@ -69,16 +68,13 @@ putstr(const char *s) | |||
69 | /* | 68 | /* |
70 | * Now, xmit each character | 69 | * Now, xmit each character |
71 | */ | 70 | */ |
72 | while (*s) { | 71 | while (!(uart[UART_LSR << shift] & UART_LSR_THRE)) |
73 | while (!(uart[UART_LSR << shift] & UART_LSR_THRE)) | 72 | barrier(); |
74 | barrier(); | 73 | uart[UART_TX << shift] = c; |
75 | uart[UART_TX << shift] = *s; | 74 | } |
76 | if (*s++ == '\n') { | 75 | |
77 | while (!(uart[UART_LSR << shift] & UART_LSR_THRE)) | 76 | static inline void flush(void) |
78 | barrier(); | 77 | { |
79 | uart[UART_TX << shift] = '\r'; | ||
80 | } | ||
81 | } | ||
82 | } | 78 | } |
83 | 79 | ||
84 | /* | 80 | /* |
diff --git a/include/asm-arm/arch-pxa/irqs.h b/include/asm-arm/arch-pxa/irqs.h index 05c4b7027592..67af238a8f8e 100644 --- a/include/asm-arm/arch-pxa/irqs.h +++ b/include/asm-arm/arch-pxa/irqs.h | |||
@@ -176,6 +176,7 @@ | |||
176 | #elif defined(CONFIG_SHARP_LOCOMO) | 176 | #elif defined(CONFIG_SHARP_LOCOMO) |
177 | #define NR_IRQS (IRQ_LOCOMO_SPI_TEND + 1) | 177 | #define NR_IRQS (IRQ_LOCOMO_SPI_TEND + 1) |
178 | #elif defined(CONFIG_ARCH_LUBBOCK) || \ | 178 | #elif defined(CONFIG_ARCH_LUBBOCK) || \ |
179 | defined(CONFIG_MACH_LOGICPD_PXA270) || \ | ||
179 | defined(CONFIG_MACH_MAINSTONE) | 180 | defined(CONFIG_MACH_MAINSTONE) |
180 | #define NR_IRQS (IRQ_BOARD_END) | 181 | #define NR_IRQS (IRQ_BOARD_END) |
181 | #else | 182 | #else |
@@ -196,6 +197,11 @@ | |||
196 | #define LUBBOCK_USB_DISC_IRQ LUBBOCK_IRQ(6) /* usb disconnect */ | 197 | #define LUBBOCK_USB_DISC_IRQ LUBBOCK_IRQ(6) /* usb disconnect */ |
197 | #define LUBBOCK_LAST_IRQ LUBBOCK_IRQ(6) | 198 | #define LUBBOCK_LAST_IRQ LUBBOCK_IRQ(6) |
198 | 199 | ||
200 | #define LPD270_IRQ(x) (IRQ_BOARD_START + (x)) | ||
201 | #define LPD270_USBC_IRQ LPD270_IRQ(2) | ||
202 | #define LPD270_ETHERNET_IRQ LPD270_IRQ(3) | ||
203 | #define LPD270_AC97_IRQ LPD270_IRQ(4) | ||
204 | |||
199 | #define MAINSTONE_IRQ(x) (IRQ_BOARD_START + (x)) | 205 | #define MAINSTONE_IRQ(x) (IRQ_BOARD_START + (x)) |
200 | #define MAINSTONE_MMC_IRQ MAINSTONE_IRQ(0) | 206 | #define MAINSTONE_MMC_IRQ MAINSTONE_IRQ(0) |
201 | #define MAINSTONE_USIM_IRQ MAINSTONE_IRQ(1) | 207 | #define MAINSTONE_USIM_IRQ MAINSTONE_IRQ(1) |
diff --git a/include/asm-arm/arch-pxa/lpd270.h b/include/asm-arm/arch-pxa/lpd270.h new file mode 100644 index 000000000000..501d240ac120 --- /dev/null +++ b/include/asm-arm/arch-pxa/lpd270.h | |||
@@ -0,0 +1,38 @@ | |||
1 | /* | ||
2 | * include/asm-arm/arch-pxa/lpd270.h | ||
3 | * | ||
4 | * Author: Lennert Buytenhek | ||
5 | * Created: Feb 10, 2006 | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #ifndef __ASM_ARCH_LPD270_H | ||
13 | #define __ASM_ARCH_LPD270_H | ||
14 | |||
15 | #define LPD270_CPLD_PHYS PXA_CS2_PHYS | ||
16 | #define LPD270_CPLD_VIRT 0xf0000000 | ||
17 | #define LPD270_CPLD_SIZE 0x00100000 | ||
18 | |||
19 | #define LPD270_ETH_PHYS (PXA_CS2_PHYS + 0x01000000) | ||
20 | |||
21 | /* CPLD registers */ | ||
22 | #define LPD270_CPLD_REG(x) ((unsigned long)(LPD270_CPLD_VIRT + (x))) | ||
23 | #define LPD270_CONTROL LPD270_CPLD_REG(0x00) | ||
24 | #define LPD270_PERIPHERAL0 LPD270_CPLD_REG(0x04) | ||
25 | #define LPD270_PERIPHERAL1 LPD270_CPLD_REG(0x08) | ||
26 | #define LPD270_CPLD_REVISION LPD270_CPLD_REG(0x14) | ||
27 | #define LPD270_EEPROM_SPI_ITF LPD270_CPLD_REG(0x20) | ||
28 | #define LPD270_MODE_PINS LPD270_CPLD_REG(0x24) | ||
29 | #define LPD270_EGPIO LPD270_CPLD_REG(0x30) | ||
30 | #define LPD270_INT_MASK LPD270_CPLD_REG(0x40) | ||
31 | #define LPD270_INT_STATUS LPD270_CPLD_REG(0x50) | ||
32 | |||
33 | #define LPD270_INT_AC97 (1 << 4) /* AC'97 CODEC IRQ */ | ||
34 | #define LPD270_INT_ETHERNET (1 << 3) /* Ethernet controller IRQ */ | ||
35 | #define LPD270_INT_USBC (1 << 2) /* USB client cable detection IRQ */ | ||
36 | |||
37 | |||
38 | #endif | ||
diff --git a/include/asm-arm/arch-pxa/uncompress.h b/include/asm-arm/arch-pxa/uncompress.h index fe38090444e0..178aa2e073ac 100644 --- a/include/asm-arm/arch-pxa/uncompress.h +++ b/include/asm-arm/arch-pxa/uncompress.h | |||
@@ -17,23 +17,18 @@ | |||
17 | #define UART FFUART | 17 | #define UART FFUART |
18 | 18 | ||
19 | 19 | ||
20 | static __inline__ void putc(char c) | 20 | static inline void putc(char c) |
21 | { | 21 | { |
22 | while (!(UART[5] & 0x20)); | 22 | while (!(UART[5] & 0x20)) |
23 | barrier(); | ||
23 | UART[0] = c; | 24 | UART[0] = c; |
24 | } | 25 | } |
25 | 26 | ||
26 | /* | 27 | /* |
27 | * This does not append a newline | 28 | * This does not append a newline |
28 | */ | 29 | */ |
29 | static void putstr(const char *s) | 30 | static inline void flush(void) |
30 | { | 31 | { |
31 | while (*s) { | ||
32 | putc(*s); | ||
33 | if (*s == '\n') | ||
34 | putc('\r'); | ||
35 | s++; | ||
36 | } | ||
37 | } | 32 | } |
38 | 33 | ||
39 | /* | 34 | /* |
diff --git a/include/asm-arm/arch-realview/uncompress.h b/include/asm-arm/arch-realview/uncompress.h index b5e4d360665b..f05631d76743 100644 --- a/include/asm-arm/arch-realview/uncompress.h +++ b/include/asm-arm/arch-realview/uncompress.h | |||
@@ -27,22 +27,16 @@ | |||
27 | /* | 27 | /* |
28 | * This does not append a newline | 28 | * This does not append a newline |
29 | */ | 29 | */ |
30 | static void putstr(const char *s) | 30 | static inline void putc(int c) |
31 | { | 31 | { |
32 | while (*s) { | 32 | while (AMBA_UART_FR & (1 << 5)) |
33 | while (AMBA_UART_FR & (1 << 5)) | 33 | barrier(); |
34 | barrier(); | ||
35 | |||
36 | AMBA_UART_DR = *s; | ||
37 | 34 | ||
38 | if (*s == '\n') { | 35 | AMBA_UART_DR = c; |
39 | while (AMBA_UART_FR & (1 << 5)) | 36 | } |
40 | barrier(); | ||
41 | 37 | ||
42 | AMBA_UART_DR = '\r'; | 38 | static inline void flush(void) |
43 | } | 39 | { |
44 | s++; | ||
45 | } | ||
46 | while (AMBA_UART_FR & (1 << 3)) | 40 | while (AMBA_UART_FR & (1 << 3)) |
47 | barrier(); | 41 | barrier(); |
48 | } | 42 | } |
diff --git a/include/asm-arm/arch-rpc/uncompress.h b/include/asm-arm/arch-rpc/uncompress.h index 43035fec64d2..06231ede54e5 100644 --- a/include/asm-arm/arch-rpc/uncompress.h +++ b/include/asm-arm/arch-rpc/uncompress.h | |||
@@ -67,31 +67,28 @@ extern __attribute__((pure)) struct param_struct *params(void); | |||
67 | /* | 67 | /* |
68 | * This does not append a newline | 68 | * This does not append a newline |
69 | */ | 69 | */ |
70 | static void putstr(const char *s) | 70 | static void putc(int c) |
71 | { | 71 | { |
72 | extern void ll_write_char(char *, char c, char white); | 72 | extern void ll_write_char(char *, char c, char white); |
73 | int x,y; | 73 | int x,y; |
74 | unsigned char c; | ||
75 | char *ptr; | 74 | char *ptr; |
76 | 75 | ||
77 | x = params->video_x; | 76 | x = params->video_x; |
78 | y = params->video_y; | 77 | y = params->video_y; |
79 | 78 | ||
80 | while ( ( c = *(unsigned char *)s++ ) != '\0' ) { | 79 | if (c == '\n') { |
81 | if ( c == '\n' ) { | 80 | if (++y >= video_num_lines) |
81 | y--; | ||
82 | } else if (c == '\r') { | ||
83 | x = 0; | ||
84 | } else { | ||
85 | ptr = VIDMEM + ((y*video_num_columns*params->bytes_per_char_v+x)*bytes_per_char_h); | ||
86 | ll_write_char(ptr, c, white); | ||
87 | if (++x >= video_num_columns) { | ||
82 | x = 0; | 88 | x = 0; |
83 | if ( ++y >= video_num_lines ) { | 89 | if ( ++y >= video_num_lines ) { |
84 | y--; | 90 | y--; |
85 | } | 91 | } |
86 | } else { | ||
87 | ptr = VIDMEM + ((y*video_num_columns*params->bytes_per_char_v+x)*bytes_per_char_h); | ||
88 | ll_write_char(ptr, c, white); | ||
89 | if ( ++x >= video_num_columns ) { | ||
90 | x = 0; | ||
91 | if ( ++y >= video_num_lines ) { | ||
92 | y--; | ||
93 | } | ||
94 | } | ||
95 | } | 92 | } |
96 | } | 93 | } |
97 | 94 | ||
@@ -99,6 +96,10 @@ static void putstr(const char *s) | |||
99 | params->video_y = y; | 96 | params->video_y = y; |
100 | } | 97 | } |
101 | 98 | ||
99 | static inline void flush(void) | ||
100 | { | ||
101 | } | ||
102 | |||
102 | static void error(char *x); | 103 | static void error(char *x); |
103 | 104 | ||
104 | /* | 105 | /* |
diff --git a/include/asm-arm/arch-s3c2410/uncompress.h b/include/asm-arm/arch-s3c2410/uncompress.h index 4367ec054b51..a6f6a0e44afa 100644 --- a/include/asm-arm/arch-s3c2410/uncompress.h +++ b/include/asm-arm/arch-s3c2410/uncompress.h | |||
@@ -67,8 +67,7 @@ uart_rd(unsigned int reg) | |||
67 | * waiting for tx to happen... | 67 | * waiting for tx to happen... |
68 | */ | 68 | */ |
69 | 69 | ||
70 | static void | 70 | static void putc(int ch) |
71 | putc(char ch) | ||
72 | { | 71 | { |
73 | int cpuid = S3C2410_GSTATUS1_2410; | 72 | int cpuid = S3C2410_GSTATUS1_2410; |
74 | 73 | ||
@@ -77,9 +76,6 @@ putc(char ch) | |||
77 | cpuid &= S3C2410_GSTATUS1_IDMASK; | 76 | cpuid &= S3C2410_GSTATUS1_IDMASK; |
78 | #endif | 77 | #endif |
79 | 78 | ||
80 | if (ch == '\n') | ||
81 | putc('\r'); /* expand newline to \r\n */ | ||
82 | |||
83 | if (uart_rd(S3C2410_UFCON) & S3C2410_UFCON_FIFOMODE) { | 79 | if (uart_rd(S3C2410_UFCON) & S3C2410_UFCON_FIFOMODE) { |
84 | int level; | 80 | int level; |
85 | 81 | ||
@@ -101,19 +97,16 @@ putc(char ch) | |||
101 | } else { | 97 | } else { |
102 | /* not using fifos */ | 98 | /* not using fifos */ |
103 | 99 | ||
104 | while ((uart_rd(S3C2410_UTRSTAT) & S3C2410_UTRSTAT_TXE) != S3C2410_UTRSTAT_TXE); | 100 | while ((uart_rd(S3C2410_UTRSTAT) & S3C2410_UTRSTAT_TXE) != S3C2410_UTRSTAT_TXE) |
101 | barrier(); | ||
105 | } | 102 | } |
106 | 103 | ||
107 | /* write byte to transmission register */ | 104 | /* write byte to transmission register */ |
108 | uart_wr(S3C2410_UTXH, ch); | 105 | uart_wr(S3C2410_UTXH, ch); |
109 | } | 106 | } |
110 | 107 | ||
111 | static void | 108 | static inline void flush(void) |
112 | putstr(const char *ptr) | ||
113 | { | 109 | { |
114 | for (; *ptr != '\0'; ptr++) { | ||
115 | putc(*ptr); | ||
116 | } | ||
117 | } | 110 | } |
118 | 111 | ||
119 | #define __raw_writel(d,ad) do { *((volatile unsigned int *)(ad)) = (d); } while(0) | 112 | #define __raw_writel(d,ad) do { *((volatile unsigned int *)(ad)) = (d); } while(0) |
diff --git a/include/asm-arm/arch-sa1100/uncompress.h b/include/asm-arm/arch-sa1100/uncompress.h index 43453501ee66..2601a77a6dda 100644 --- a/include/asm-arm/arch-sa1100/uncompress.h +++ b/include/asm-arm/arch-sa1100/uncompress.h | |||
@@ -17,7 +17,7 @@ | |||
17 | 17 | ||
18 | #define UART(x) (*(volatile unsigned long *)(serial_port + (x))) | 18 | #define UART(x) (*(volatile unsigned long *)(serial_port + (x))) |
19 | 19 | ||
20 | static void putstr( const char *s ) | 20 | static void putc(int c) |
21 | { | 21 | { |
22 | unsigned long serial_port; | 22 | unsigned long serial_port; |
23 | 23 | ||
@@ -31,19 +31,16 @@ static void putstr( const char *s ) | |||
31 | return; | 31 | return; |
32 | } while (0); | 32 | } while (0); |
33 | 33 | ||
34 | for (; *s; s++) { | 34 | /* wait for space in the UART's transmitter */ |
35 | /* wait for space in the UART's transmitter */ | 35 | while (!(UART(UTSR1) & UTSR1_TNF)) |
36 | while (!(UART(UTSR1) & UTSR1_TNF)); | 36 | barrier(); |
37 | 37 | ||
38 | /* send the character out. */ | 38 | /* send the character out. */ |
39 | UART(UTDR) = *s; | 39 | UART(UTDR) = c; |
40 | } | ||
40 | 41 | ||
41 | /* if a LF, also do CR... */ | 42 | static inline void flush(void) |
42 | if (*s == 10) { | 43 | { |
43 | while (!(UART(UTSR1) & UTSR1_TNF)); | ||
44 | UART(UTDR) = 13; | ||
45 | } | ||
46 | } | ||
47 | } | 44 | } |
48 | 45 | ||
49 | /* | 46 | /* |
diff --git a/include/asm-arm/arch-shark/uncompress.h b/include/asm-arm/arch-shark/uncompress.h index 910a8e0a0ca5..7eca6534f1bb 100644 --- a/include/asm-arm/arch-shark/uncompress.h +++ b/include/asm-arm/arch-shark/uncompress.h | |||
@@ -9,7 +9,7 @@ | |||
9 | 9 | ||
10 | #define SERIAL_BASE ((volatile unsigned char *)0x400003f8) | 10 | #define SERIAL_BASE ((volatile unsigned char *)0x400003f8) |
11 | 11 | ||
12 | static __inline__ void putc(char c) | 12 | static inline void putc(int c) |
13 | { | 13 | { |
14 | int t; | 14 | int t; |
15 | 15 | ||
@@ -18,17 +18,8 @@ static __inline__ void putc(char c) | |||
18 | while (t--); | 18 | while (t--); |
19 | } | 19 | } |
20 | 20 | ||
21 | /* | 21 | static inline void flush(void) |
22 | * This does not append a newline | ||
23 | */ | ||
24 | static void putstr(const char *s) | ||
25 | { | 22 | { |
26 | while (*s) { | ||
27 | putc(*s); | ||
28 | if (*s == '\n') | ||
29 | putc('\r'); | ||
30 | s++; | ||
31 | } | ||
32 | } | 23 | } |
33 | 24 | ||
34 | #ifdef DEBUG | 25 | #ifdef DEBUG |
diff --git a/include/asm-arm/arch-versatile/uncompress.h b/include/asm-arm/arch-versatile/uncompress.h index 2f57499c7b92..7215133d0514 100644 --- a/include/asm-arm/arch-versatile/uncompress.h +++ b/include/asm-arm/arch-versatile/uncompress.h | |||
@@ -25,22 +25,16 @@ | |||
25 | /* | 25 | /* |
26 | * This does not append a newline | 26 | * This does not append a newline |
27 | */ | 27 | */ |
28 | static void putstr(const char *s) | 28 | static inline void putc(int c) |
29 | { | 29 | { |
30 | while (*s) { | 30 | while (AMBA_UART_FR & (1 << 5)) |
31 | while (AMBA_UART_FR & (1 << 5)) | 31 | barrier(); |
32 | barrier(); | ||
33 | |||
34 | AMBA_UART_DR = *s; | ||
35 | 32 | ||
36 | if (*s == '\n') { | 33 | AMBA_UART_DR = c; |
37 | while (AMBA_UART_FR & (1 << 5)) | 34 | } |
38 | barrier(); | ||
39 | 35 | ||
40 | AMBA_UART_DR = '\r'; | 36 | static inline void flush(void) |
41 | } | 37 | { |
42 | s++; | ||
43 | } | ||
44 | while (AMBA_UART_FR & (1 << 3)) | 38 | while (AMBA_UART_FR & (1 << 3)) |
45 | barrier(); | 39 | barrier(); |
46 | } | 40 | } |
diff --git a/include/asm-arm/assembler.h b/include/asm-arm/assembler.h index f31ac92b6c7f..d53bafa9bf1c 100644 --- a/include/asm-arm/assembler.h +++ b/include/asm-arm/assembler.h | |||
@@ -80,16 +80,33 @@ | |||
80 | instr regs | 80 | instr regs |
81 | 81 | ||
82 | /* | 82 | /* |
83 | * Save the current IRQ state and disable IRQs. Note that this macro | 83 | * Enable and disable interrupts |
84 | * assumes FIQs are enabled, and that the processor is in SVC mode. | ||
85 | */ | 84 | */ |
86 | .macro save_and_disable_irqs, oldcpsr | ||
87 | mrs \oldcpsr, cpsr | ||
88 | #if __LINUX_ARM_ARCH__ >= 6 | 85 | #if __LINUX_ARM_ARCH__ >= 6 |
86 | .macro disable_irq | ||
89 | cpsid i | 87 | cpsid i |
88 | .endm | ||
89 | |||
90 | .macro enable_irq | ||
91 | cpsie i | ||
92 | .endm | ||
90 | #else | 93 | #else |
91 | msr cpsr_c, #PSR_I_BIT | MODE_SVC | 94 | .macro disable_irq |
95 | msr cpsr_c, #PSR_I_BIT | SVC_MODE | ||
96 | .endm | ||
97 | |||
98 | .macro enable_irq | ||
99 | msr cpsr_c, #SVC_MODE | ||
100 | .endm | ||
92 | #endif | 101 | #endif |
102 | |||
103 | /* | ||
104 | * Save the current IRQ state and disable IRQs. Note that this macro | ||
105 | * assumes FIQs are enabled, and that the processor is in SVC mode. | ||
106 | */ | ||
107 | .macro save_and_disable_irqs, oldcpsr | ||
108 | mrs \oldcpsr, cpsr | ||
109 | disable_irq | ||
93 | .endm | 110 | .endm |
94 | 111 | ||
95 | /* | 112 | /* |
diff --git a/include/asm-arm/bitops.h b/include/asm-arm/bitops.h index d02de721ecc1..0ac54b1a8bad 100644 --- a/include/asm-arm/bitops.h +++ b/include/asm-arm/bitops.h | |||
@@ -117,65 +117,7 @@ ____atomic_test_and_change_bit(unsigned int bit, volatile unsigned long *p) | |||
117 | return res & mask; | 117 | return res & mask; |
118 | } | 118 | } |
119 | 119 | ||
120 | /* | 120 | #include <asm-generic/bitops/non-atomic.h> |
121 | * Now the non-atomic variants. We let the compiler handle all | ||
122 | * optimisations for these. These are all _native_ endian. | ||
123 | */ | ||
124 | static inline void __set_bit(int nr, volatile unsigned long *p) | ||
125 | { | ||
126 | p[nr >> 5] |= (1UL << (nr & 31)); | ||
127 | } | ||
128 | |||
129 | static inline void __clear_bit(int nr, volatile unsigned long *p) | ||
130 | { | ||
131 | p[nr >> 5] &= ~(1UL << (nr & 31)); | ||
132 | } | ||
133 | |||
134 | static inline void __change_bit(int nr, volatile unsigned long *p) | ||
135 | { | ||
136 | p[nr >> 5] ^= (1UL << (nr & 31)); | ||
137 | } | ||
138 | |||
139 | static inline int __test_and_set_bit(int nr, volatile unsigned long *p) | ||
140 | { | ||
141 | unsigned long oldval, mask = 1UL << (nr & 31); | ||
142 | |||
143 | p += nr >> 5; | ||
144 | |||
145 | oldval = *p; | ||
146 | *p = oldval | mask; | ||
147 | return oldval & mask; | ||
148 | } | ||
149 | |||
150 | static inline int __test_and_clear_bit(int nr, volatile unsigned long *p) | ||
151 | { | ||
152 | unsigned long oldval, mask = 1UL << (nr & 31); | ||
153 | |||
154 | p += nr >> 5; | ||
155 | |||
156 | oldval = *p; | ||
157 | *p = oldval & ~mask; | ||
158 | return oldval & mask; | ||
159 | } | ||
160 | |||
161 | static inline int __test_and_change_bit(int nr, volatile unsigned long *p) | ||
162 | { | ||
163 | unsigned long oldval, mask = 1UL << (nr & 31); | ||
164 | |||
165 | p += nr >> 5; | ||
166 | |||
167 | oldval = *p; | ||
168 | *p = oldval ^ mask; | ||
169 | return oldval & mask; | ||
170 | } | ||
171 | |||
172 | /* | ||
173 | * This routine doesn't need to be atomic. | ||
174 | */ | ||
175 | static inline int __test_bit(int nr, const volatile unsigned long * p) | ||
176 | { | ||
177 | return (p[nr >> 5] >> (nr & 31)) & 1UL; | ||
178 | } | ||
179 | 121 | ||
180 | /* | 122 | /* |
181 | * A note about Endian-ness. | 123 | * A note about Endian-ness. |
@@ -261,7 +203,6 @@ extern int _find_next_bit_be(const unsigned long *p, int size, int offset); | |||
261 | #define test_and_set_bit(nr,p) ATOMIC_BITOP_LE(test_and_set_bit,nr,p) | 203 | #define test_and_set_bit(nr,p) ATOMIC_BITOP_LE(test_and_set_bit,nr,p) |
262 | #define test_and_clear_bit(nr,p) ATOMIC_BITOP_LE(test_and_clear_bit,nr,p) | 204 | #define test_and_clear_bit(nr,p) ATOMIC_BITOP_LE(test_and_clear_bit,nr,p) |
263 | #define test_and_change_bit(nr,p) ATOMIC_BITOP_LE(test_and_change_bit,nr,p) | 205 | #define test_and_change_bit(nr,p) ATOMIC_BITOP_LE(test_and_change_bit,nr,p) |
264 | #define test_bit(nr,p) __test_bit(nr,p) | ||
265 | #define find_first_zero_bit(p,sz) _find_first_zero_bit_le(p,sz) | 206 | #define find_first_zero_bit(p,sz) _find_first_zero_bit_le(p,sz) |
266 | #define find_next_zero_bit(p,sz,off) _find_next_zero_bit_le(p,sz,off) | 207 | #define find_next_zero_bit(p,sz,off) _find_next_zero_bit_le(p,sz,off) |
267 | #define find_first_bit(p,sz) _find_first_bit_le(p,sz) | 208 | #define find_first_bit(p,sz) _find_first_bit_le(p,sz) |
@@ -280,7 +221,6 @@ extern int _find_next_bit_be(const unsigned long *p, int size, int offset); | |||
280 | #define test_and_set_bit(nr,p) ATOMIC_BITOP_BE(test_and_set_bit,nr,p) | 221 | #define test_and_set_bit(nr,p) ATOMIC_BITOP_BE(test_and_set_bit,nr,p) |
281 | #define test_and_clear_bit(nr,p) ATOMIC_BITOP_BE(test_and_clear_bit,nr,p) | 222 | #define test_and_clear_bit(nr,p) ATOMIC_BITOP_BE(test_and_clear_bit,nr,p) |
282 | #define test_and_change_bit(nr,p) ATOMIC_BITOP_BE(test_and_change_bit,nr,p) | 223 | #define test_and_change_bit(nr,p) ATOMIC_BITOP_BE(test_and_change_bit,nr,p) |
283 | #define test_bit(nr,p) __test_bit(nr,p) | ||
284 | #define find_first_zero_bit(p,sz) _find_first_zero_bit_be(p,sz) | 224 | #define find_first_zero_bit(p,sz) _find_first_zero_bit_be(p,sz) |
285 | #define find_next_zero_bit(p,sz,off) _find_next_zero_bit_be(p,sz,off) | 225 | #define find_next_zero_bit(p,sz,off) _find_next_zero_bit_be(p,sz,off) |
286 | #define find_first_bit(p,sz) _find_first_bit_be(p,sz) | 226 | #define find_first_bit(p,sz) _find_first_bit_be(p,sz) |
@@ -292,57 +232,41 @@ extern int _find_next_bit_be(const unsigned long *p, int size, int offset); | |||
292 | 232 | ||
293 | #if __LINUX_ARM_ARCH__ < 5 | 233 | #if __LINUX_ARM_ARCH__ < 5 |
294 | 234 | ||
295 | /* | 235 | #include <asm-generic/bitops/ffz.h> |
296 | * ffz = Find First Zero in word. Undefined if no zero exists, | 236 | #include <asm-generic/bitops/__ffs.h> |
297 | * so code should check against ~0UL first.. | 237 | #include <asm-generic/bitops/fls.h> |
298 | */ | 238 | #include <asm-generic/bitops/ffs.h> |
299 | static inline unsigned long ffz(unsigned long word) | ||
300 | { | ||
301 | int k; | ||
302 | |||
303 | word = ~word; | ||
304 | k = 31; | ||
305 | if (word & 0x0000ffff) { k -= 16; word <<= 16; } | ||
306 | if (word & 0x00ff0000) { k -= 8; word <<= 8; } | ||
307 | if (word & 0x0f000000) { k -= 4; word <<= 4; } | ||
308 | if (word & 0x30000000) { k -= 2; word <<= 2; } | ||
309 | if (word & 0x40000000) { k -= 1; } | ||
310 | return k; | ||
311 | } | ||
312 | |||
313 | /* | ||
314 | * ffz = Find First Zero in word. Undefined if no zero exists, | ||
315 | * so code should check against ~0UL first.. | ||
316 | */ | ||
317 | static inline unsigned long __ffs(unsigned long word) | ||
318 | { | ||
319 | int k; | ||
320 | |||
321 | k = 31; | ||
322 | if (word & 0x0000ffff) { k -= 16; word <<= 16; } | ||
323 | if (word & 0x00ff0000) { k -= 8; word <<= 8; } | ||
324 | if (word & 0x0f000000) { k -= 4; word <<= 4; } | ||
325 | if (word & 0x30000000) { k -= 2; word <<= 2; } | ||
326 | if (word & 0x40000000) { k -= 1; } | ||
327 | return k; | ||
328 | } | ||
329 | |||
330 | /* | ||
331 | * fls: find last bit set. | ||
332 | */ | ||
333 | 239 | ||
334 | #define fls(x) generic_fls(x) | 240 | #else |
335 | #define fls64(x) generic_fls64(x) | ||
336 | |||
337 | /* | ||
338 | * ffs: find first bit set. This is defined the same way as | ||
339 | * the libc and compiler builtin ffs routines, therefore | ||
340 | * differs in spirit from the above ffz (man ffs). | ||
341 | */ | ||
342 | 241 | ||
343 | #define ffs(x) generic_ffs(x) | 242 | static inline int constant_fls(int x) |
243 | { | ||
244 | int r = 32; | ||
344 | 245 | ||
345 | #else | 246 | if (!x) |
247 | return 0; | ||
248 | if (!(x & 0xffff0000u)) { | ||
249 | x <<= 16; | ||
250 | r -= 16; | ||
251 | } | ||
252 | if (!(x & 0xff000000u)) { | ||
253 | x <<= 8; | ||
254 | r -= 8; | ||
255 | } | ||
256 | if (!(x & 0xf0000000u)) { | ||
257 | x <<= 4; | ||
258 | r -= 4; | ||
259 | } | ||
260 | if (!(x & 0xc0000000u)) { | ||
261 | x <<= 2; | ||
262 | r -= 2; | ||
263 | } | ||
264 | if (!(x & 0x80000000u)) { | ||
265 | x <<= 1; | ||
266 | r -= 1; | ||
267 | } | ||
268 | return r; | ||
269 | } | ||
346 | 270 | ||
347 | /* | 271 | /* |
348 | * On ARMv5 and above those functions can be implemented around | 272 | * On ARMv5 and above those functions can be implemented around |
@@ -350,39 +274,18 @@ static inline unsigned long __ffs(unsigned long word) | |||
350 | */ | 274 | */ |
351 | 275 | ||
352 | #define fls(x) \ | 276 | #define fls(x) \ |
353 | ( __builtin_constant_p(x) ? generic_fls(x) : \ | 277 | ( __builtin_constant_p(x) ? constant_fls(x) : \ |
354 | ({ int __r; asm("clz\t%0, %1" : "=r"(__r) : "r"(x) : "cc"); 32-__r; }) ) | 278 | ({ int __r; asm("clz\t%0, %1" : "=r"(__r) : "r"(x) : "cc"); 32-__r; }) ) |
355 | #define fls64(x) generic_fls64(x) | ||
356 | #define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); }) | 279 | #define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); }) |
357 | #define __ffs(x) (ffs(x) - 1) | 280 | #define __ffs(x) (ffs(x) - 1) |
358 | #define ffz(x) __ffs( ~(x) ) | 281 | #define ffz(x) __ffs( ~(x) ) |
359 | 282 | ||
360 | #endif | 283 | #endif |
361 | 284 | ||
362 | /* | 285 | #include <asm-generic/bitops/fls64.h> |
363 | * Find first bit set in a 168-bit bitmap, where the first | ||
364 | * 128 bits are unlikely to be set. | ||
365 | */ | ||
366 | static inline int sched_find_first_bit(const unsigned long *b) | ||
367 | { | ||
368 | unsigned long v; | ||
369 | unsigned int off; | ||
370 | |||
371 | for (off = 0; v = b[off], off < 4; off++) { | ||
372 | if (unlikely(v)) | ||
373 | break; | ||
374 | } | ||
375 | return __ffs(v) + off * 32; | ||
376 | } | ||
377 | |||
378 | /* | ||
379 | * hweightN: returns the hamming weight (i.e. the number | ||
380 | * of bits set) of a N-bit word | ||
381 | */ | ||
382 | 286 | ||
383 | #define hweight32(x) generic_hweight32(x) | 287 | #include <asm-generic/bitops/sched.h> |
384 | #define hweight16(x) generic_hweight16(x) | 288 | #include <asm-generic/bitops/hweight.h> |
385 | #define hweight8(x) generic_hweight8(x) | ||
386 | 289 | ||
387 | /* | 290 | /* |
388 | * Ext2 is defined to use little-endian byte ordering. | 291 | * Ext2 is defined to use little-endian byte ordering. |
@@ -397,7 +300,7 @@ static inline int sched_find_first_bit(const unsigned long *b) | |||
397 | #define ext2_clear_bit_atomic(lock,nr,p) \ | 300 | #define ext2_clear_bit_atomic(lock,nr,p) \ |
398 | test_and_clear_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) | 301 | test_and_clear_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) |
399 | #define ext2_test_bit(nr,p) \ | 302 | #define ext2_test_bit(nr,p) \ |
400 | __test_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) | 303 | test_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) |
401 | #define ext2_find_first_zero_bit(p,sz) \ | 304 | #define ext2_find_first_zero_bit(p,sz) \ |
402 | _find_first_zero_bit_le(p,sz) | 305 | _find_first_zero_bit_le(p,sz) |
403 | #define ext2_find_next_zero_bit(p,sz,off) \ | 306 | #define ext2_find_next_zero_bit(p,sz,off) \ |
@@ -410,7 +313,7 @@ static inline int sched_find_first_bit(const unsigned long *b) | |||
410 | #define minix_set_bit(nr,p) \ | 313 | #define minix_set_bit(nr,p) \ |
411 | __set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) | 314 | __set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) |
412 | #define minix_test_bit(nr,p) \ | 315 | #define minix_test_bit(nr,p) \ |
413 | __test_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) | 316 | test_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) |
414 | #define minix_test_and_set_bit(nr,p) \ | 317 | #define minix_test_and_set_bit(nr,p) \ |
415 | __test_and_set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) | 318 | __test_and_set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) |
416 | #define minix_test_and_clear_bit(nr,p) \ | 319 | #define minix_test_and_clear_bit(nr,p) \ |
diff --git a/include/asm-arm/cacheflush.h b/include/asm-arm/cacheflush.h index 09e19a783a51..746be56b1b70 100644 --- a/include/asm-arm/cacheflush.h +++ b/include/asm-arm/cacheflush.h | |||
@@ -71,6 +71,14 @@ | |||
71 | # endif | 71 | # endif |
72 | #endif | 72 | #endif |
73 | 73 | ||
74 | #if defined(CONFIG_CPU_XSC3) | ||
75 | # ifdef _CACHE | ||
76 | # define MULTI_CACHE 1 | ||
77 | # else | ||
78 | # define _CACHE xsc3 | ||
79 | # endif | ||
80 | #endif | ||
81 | |||
74 | #if defined(CONFIG_CPU_V6) | 82 | #if defined(CONFIG_CPU_V6) |
75 | //# ifdef _CACHE | 83 | //# ifdef _CACHE |
76 | # define MULTI_CACHE 1 | 84 | # define MULTI_CACHE 1 |
diff --git a/include/asm-arm/domain.h b/include/asm-arm/domain.h index da1d960387d9..f8ea2de4848e 100644 --- a/include/asm-arm/domain.h +++ b/include/asm-arm/domain.h | |||
@@ -16,11 +16,29 @@ | |||
16 | * DOMAIN_IO - domain 2 includes all IO only | 16 | * DOMAIN_IO - domain 2 includes all IO only |
17 | * DOMAIN_USER - domain 1 includes all user memory only | 17 | * DOMAIN_USER - domain 1 includes all user memory only |
18 | * DOMAIN_KERNEL - domain 0 includes all kernel memory only | 18 | * DOMAIN_KERNEL - domain 0 includes all kernel memory only |
19 | * | ||
20 | * The domain numbering depends on whether we support 36 physical | ||
21 | * address for I/O or not. Addresses above the 32 bit boundary can | ||
22 | * only be mapped using supersections and supersections can only | ||
23 | * be set for domain 0. We could just default to DOMAIN_IO as zero, | ||
24 | * but there may be systems with supersection support and no 36-bit | ||
25 | * addressing. In such cases, we want to map system memory with | ||
26 | * supersections to reduce TLB misses and footprint. | ||
27 | * | ||
28 | * 36-bit addressing and supersections are only available on | ||
29 | * CPUs based on ARMv6+ or the Intel XSC3 core. | ||
19 | */ | 30 | */ |
31 | #ifndef CONFIG_IO_36 | ||
20 | #define DOMAIN_KERNEL 0 | 32 | #define DOMAIN_KERNEL 0 |
21 | #define DOMAIN_TABLE 0 | 33 | #define DOMAIN_TABLE 0 |
22 | #define DOMAIN_USER 1 | 34 | #define DOMAIN_USER 1 |
23 | #define DOMAIN_IO 2 | 35 | #define DOMAIN_IO 2 |
36 | #else | ||
37 | #define DOMAIN_KERNEL 2 | ||
38 | #define DOMAIN_TABLE 2 | ||
39 | #define DOMAIN_USER 1 | ||
40 | #define DOMAIN_IO 0 | ||
41 | #endif | ||
24 | 42 | ||
25 | /* | 43 | /* |
26 | * Domain types | 44 | * Domain types |
diff --git a/include/asm-arm/memory.h b/include/asm-arm/memory.h index b4e1146ab682..afa5c3ea077c 100644 --- a/include/asm-arm/memory.h +++ b/include/asm-arm/memory.h | |||
@@ -172,9 +172,7 @@ static inline __deprecated void *bus_to_virt(unsigned long x) | |||
172 | * virt_addr_valid(k) indicates whether a virtual address is valid | 172 | * virt_addr_valid(k) indicates whether a virtual address is valid |
173 | */ | 173 | */ |
174 | #ifndef CONFIG_DISCONTIGMEM | 174 | #ifndef CONFIG_DISCONTIGMEM |
175 | 175 | #define ARCH_PFN_OFFSET (PHYS_PFN_OFFSET) | |
176 | #define page_to_pfn(page) (((page) - mem_map) + PHYS_PFN_OFFSET) | ||
177 | #define pfn_to_page(pfn) ((mem_map + (pfn)) - PHYS_PFN_OFFSET) | ||
178 | #define pfn_valid(pfn) ((pfn) >= PHYS_PFN_OFFSET && (pfn) < (PHYS_PFN_OFFSET + max_mapnr)) | 176 | #define pfn_valid(pfn) ((pfn) >= PHYS_PFN_OFFSET && (pfn) < (PHYS_PFN_OFFSET + max_mapnr)) |
179 | 177 | ||
180 | #define virt_to_page(kaddr) (pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)) | 178 | #define virt_to_page(kaddr) (pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)) |
@@ -189,13 +187,8 @@ static inline __deprecated void *bus_to_virt(unsigned long x) | |||
189 | * around in memory. | 187 | * around in memory. |
190 | */ | 188 | */ |
191 | #include <linux/numa.h> | 189 | #include <linux/numa.h> |
192 | 190 | #define arch_pfn_to_nid(pfn) (PFN_TO_NID(pfn)) | |
193 | #define page_to_pfn(page) \ | 191 | #define arch_local_page_offset(pfn, nid) (LOCAL_MAP_NR((pfn) << PAGE_OFFSET)) |
194 | (( (page) - page_zone(page)->zone_mem_map) \ | ||
195 | + page_zone(page)->zone_start_pfn) | ||
196 | |||
197 | #define pfn_to_page(pfn) \ | ||
198 | (PFN_TO_MAPBASE(pfn) + LOCAL_MAP_NR((pfn) << PAGE_SHIFT)) | ||
199 | 192 | ||
200 | #define pfn_valid(pfn) \ | 193 | #define pfn_valid(pfn) \ |
201 | ({ \ | 194 | ({ \ |
@@ -243,4 +236,6 @@ static inline __deprecated void *bus_to_virt(unsigned long x) | |||
243 | 236 | ||
244 | #endif | 237 | #endif |
245 | 238 | ||
239 | #include <asm-generic/memory_model.h> | ||
240 | |||
246 | #endif | 241 | #endif |
diff --git a/include/asm-arm/page.h b/include/asm-arm/page.h index 416320d95419..a404d2bf0c68 100644 --- a/include/asm-arm/page.h +++ b/include/asm-arm/page.h | |||
@@ -40,6 +40,7 @@ | |||
40 | * v4wb - ARMv4 with writeback cache, without minicache | 40 | * v4wb - ARMv4 with writeback cache, without minicache |
41 | * v4_mc - ARMv4 with minicache | 41 | * v4_mc - ARMv4 with minicache |
42 | * xscale - Xscale | 42 | * xscale - Xscale |
43 | * xsc3 - XScalev3 | ||
43 | */ | 44 | */ |
44 | #undef _USER | 45 | #undef _USER |
45 | #undef MULTI_USER | 46 | #undef MULTI_USER |
@@ -84,6 +85,14 @@ | |||
84 | # endif | 85 | # endif |
85 | #endif | 86 | #endif |
86 | 87 | ||
88 | #ifdef CONFIG_CPU_XSC3 | ||
89 | # ifdef _USER | ||
90 | # define MULTI_USER 1 | ||
91 | # else | ||
92 | # define _USER xsc3_mc | ||
93 | # endif | ||
94 | #endif | ||
95 | |||
87 | #ifdef CONFIG_CPU_COPY_V6 | 96 | #ifdef CONFIG_CPU_COPY_V6 |
88 | # define MULTI_USER 1 | 97 | # define MULTI_USER 1 |
89 | #endif | 98 | #endif |
diff --git a/include/asm-arm/pgalloc.h b/include/asm-arm/pgalloc.h index bc18ff405181..c4ac2e67768d 100644 --- a/include/asm-arm/pgalloc.h +++ b/include/asm-arm/pgalloc.h | |||
@@ -10,10 +10,15 @@ | |||
10 | #ifndef _ASMARM_PGALLOC_H | 10 | #ifndef _ASMARM_PGALLOC_H |
11 | #define _ASMARM_PGALLOC_H | 11 | #define _ASMARM_PGALLOC_H |
12 | 12 | ||
13 | #include <asm/domain.h> | ||
14 | #include <asm/pgtable-hwdef.h> | ||
13 | #include <asm/processor.h> | 15 | #include <asm/processor.h> |
14 | #include <asm/cacheflush.h> | 16 | #include <asm/cacheflush.h> |
15 | #include <asm/tlbflush.h> | 17 | #include <asm/tlbflush.h> |
16 | 18 | ||
19 | #define _PAGE_USER_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_USER)) | ||
20 | #define _PAGE_KERNEL_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_KERNEL)) | ||
21 | |||
17 | /* | 22 | /* |
18 | * Since we have only two-level page tables, these are trivial | 23 | * Since we have only two-level page tables, these are trivial |
19 | */ | 24 | */ |
diff --git a/include/asm-arm/pgtable-hwdef.h b/include/asm-arm/pgtable-hwdef.h new file mode 100644 index 000000000000..1d033495cc75 --- /dev/null +++ b/include/asm-arm/pgtable-hwdef.h | |||
@@ -0,0 +1,88 @@ | |||
1 | /* | ||
2 | * linux/include/asm-arm/pgtable-hwdef.h | ||
3 | * | ||
4 | * Copyright (C) 1995-2002 Russell King | ||
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 _ASMARM_PGTABLE_HWDEF_H | ||
11 | #define _ASMARM_PGTABLE_HWDEF_H | ||
12 | |||
13 | /* | ||
14 | * Hardware page table definitions. | ||
15 | * | ||
16 | * + Level 1 descriptor (PMD) | ||
17 | * - common | ||
18 | */ | ||
19 | #define PMD_TYPE_MASK (3 << 0) | ||
20 | #define PMD_TYPE_FAULT (0 << 0) | ||
21 | #define PMD_TYPE_TABLE (1 << 0) | ||
22 | #define PMD_TYPE_SECT (2 << 0) | ||
23 | #define PMD_BIT4 (1 << 4) | ||
24 | #define PMD_DOMAIN(x) ((x) << 5) | ||
25 | #define PMD_PROTECTION (1 << 9) /* v5 */ | ||
26 | /* | ||
27 | * - section | ||
28 | */ | ||
29 | #define PMD_SECT_BUFFERABLE (1 << 2) | ||
30 | #define PMD_SECT_CACHEABLE (1 << 3) | ||
31 | #define PMD_SECT_AP_WRITE (1 << 10) | ||
32 | #define PMD_SECT_AP_READ (1 << 11) | ||
33 | #define PMD_SECT_TEX(x) ((x) << 12) /* v5 */ | ||
34 | #define PMD_SECT_APX (1 << 15) /* v6 */ | ||
35 | #define PMD_SECT_S (1 << 16) /* v6 */ | ||
36 | #define PMD_SECT_nG (1 << 17) /* v6 */ | ||
37 | #define PMD_SECT_SUPER (1 << 18) /* v6 */ | ||
38 | |||
39 | #define PMD_SECT_UNCACHED (0) | ||
40 | #define PMD_SECT_BUFFERED (PMD_SECT_BUFFERABLE) | ||
41 | #define PMD_SECT_WT (PMD_SECT_CACHEABLE) | ||
42 | #define PMD_SECT_WB (PMD_SECT_CACHEABLE | PMD_SECT_BUFFERABLE) | ||
43 | #define PMD_SECT_MINICACHE (PMD_SECT_TEX(1) | PMD_SECT_CACHEABLE) | ||
44 | #define PMD_SECT_WBWA (PMD_SECT_TEX(1) | PMD_SECT_CACHEABLE | PMD_SECT_BUFFERABLE) | ||
45 | #define PMD_SECT_NONSHARED_DEV (PMD_SECT_TEX(2)) | ||
46 | |||
47 | /* | ||
48 | * - coarse table (not used) | ||
49 | */ | ||
50 | |||
51 | /* | ||
52 | * + Level 2 descriptor (PTE) | ||
53 | * - common | ||
54 | */ | ||
55 | #define PTE_TYPE_MASK (3 << 0) | ||
56 | #define PTE_TYPE_FAULT (0 << 0) | ||
57 | #define PTE_TYPE_LARGE (1 << 0) | ||
58 | #define PTE_TYPE_SMALL (2 << 0) | ||
59 | #define PTE_TYPE_EXT (3 << 0) /* v5 */ | ||
60 | #define PTE_BUFFERABLE (1 << 2) | ||
61 | #define PTE_CACHEABLE (1 << 3) | ||
62 | |||
63 | /* | ||
64 | * - extended small page/tiny page | ||
65 | */ | ||
66 | #define PTE_EXT_XN (1 << 0) /* v6 */ | ||
67 | #define PTE_EXT_AP_MASK (3 << 4) | ||
68 | #define PTE_EXT_AP0 (1 << 4) | ||
69 | #define PTE_EXT_AP1 (2 << 4) | ||
70 | #define PTE_EXT_AP_UNO_SRO (0 << 4) | ||
71 | #define PTE_EXT_AP_UNO_SRW (PTE_EXT_AP0) | ||
72 | #define PTE_EXT_AP_URO_SRW (PTE_EXT_AP1) | ||
73 | #define PTE_EXT_AP_URW_SRW (PTE_EXT_AP1|PTE_EXT_AP0) | ||
74 | #define PTE_EXT_TEX(x) ((x) << 6) /* v5 */ | ||
75 | #define PTE_EXT_APX (1 << 9) /* v6 */ | ||
76 | #define PTE_EXT_SHARED (1 << 10) /* v6 */ | ||
77 | #define PTE_EXT_NG (1 << 11) /* v6 */ | ||
78 | |||
79 | /* | ||
80 | * - small page | ||
81 | */ | ||
82 | #define PTE_SMALL_AP_MASK (0xff << 4) | ||
83 | #define PTE_SMALL_AP_UNO_SRO (0x00 << 4) | ||
84 | #define PTE_SMALL_AP_UNO_SRW (0x55 << 4) | ||
85 | #define PTE_SMALL_AP_URO_SRW (0xaa << 4) | ||
86 | #define PTE_SMALL_AP_URW_SRW (0xff << 4) | ||
87 | |||
88 | #endif | ||
diff --git a/include/asm-arm/pgtable.h b/include/asm-arm/pgtable.h index 70e00d08345e..e595ae24efe2 100644 --- a/include/asm-arm/pgtable.h +++ b/include/asm-arm/pgtable.h | |||
@@ -137,81 +137,6 @@ extern void __pgd_error(const char *file, int line, unsigned long val); | |||
137 | #define SUPERSECTION_MASK (~(SUPERSECTION_SIZE-1)) | 137 | #define SUPERSECTION_MASK (~(SUPERSECTION_SIZE-1)) |
138 | 138 | ||
139 | /* | 139 | /* |
140 | * Hardware page table definitions. | ||
141 | * | ||
142 | * + Level 1 descriptor (PMD) | ||
143 | * - common | ||
144 | */ | ||
145 | #define PMD_TYPE_MASK (3 << 0) | ||
146 | #define PMD_TYPE_FAULT (0 << 0) | ||
147 | #define PMD_TYPE_TABLE (1 << 0) | ||
148 | #define PMD_TYPE_SECT (2 << 0) | ||
149 | #define PMD_BIT4 (1 << 4) | ||
150 | #define PMD_DOMAIN(x) ((x) << 5) | ||
151 | #define PMD_PROTECTION (1 << 9) /* v5 */ | ||
152 | /* | ||
153 | * - section | ||
154 | */ | ||
155 | #define PMD_SECT_BUFFERABLE (1 << 2) | ||
156 | #define PMD_SECT_CACHEABLE (1 << 3) | ||
157 | #define PMD_SECT_AP_WRITE (1 << 10) | ||
158 | #define PMD_SECT_AP_READ (1 << 11) | ||
159 | #define PMD_SECT_TEX(x) ((x) << 12) /* v5 */ | ||
160 | #define PMD_SECT_APX (1 << 15) /* v6 */ | ||
161 | #define PMD_SECT_S (1 << 16) /* v6 */ | ||
162 | #define PMD_SECT_nG (1 << 17) /* v6 */ | ||
163 | #define PMD_SECT_SUPER (1 << 18) /* v6 */ | ||
164 | |||
165 | #define PMD_SECT_UNCACHED (0) | ||
166 | #define PMD_SECT_BUFFERED (PMD_SECT_BUFFERABLE) | ||
167 | #define PMD_SECT_WT (PMD_SECT_CACHEABLE) | ||
168 | #define PMD_SECT_WB (PMD_SECT_CACHEABLE | PMD_SECT_BUFFERABLE) | ||
169 | #define PMD_SECT_MINICACHE (PMD_SECT_TEX(1) | PMD_SECT_CACHEABLE) | ||
170 | #define PMD_SECT_WBWA (PMD_SECT_TEX(1) | PMD_SECT_CACHEABLE | PMD_SECT_BUFFERABLE) | ||
171 | #define PMD_SECT_NONSHARED_DEV (PMD_SECT_TEX(2)) | ||
172 | |||
173 | /* | ||
174 | * - coarse table (not used) | ||
175 | */ | ||
176 | |||
177 | /* | ||
178 | * + Level 2 descriptor (PTE) | ||
179 | * - common | ||
180 | */ | ||
181 | #define PTE_TYPE_MASK (3 << 0) | ||
182 | #define PTE_TYPE_FAULT (0 << 0) | ||
183 | #define PTE_TYPE_LARGE (1 << 0) | ||
184 | #define PTE_TYPE_SMALL (2 << 0) | ||
185 | #define PTE_TYPE_EXT (3 << 0) /* v5 */ | ||
186 | #define PTE_BUFFERABLE (1 << 2) | ||
187 | #define PTE_CACHEABLE (1 << 3) | ||
188 | |||
189 | /* | ||
190 | * - extended small page/tiny page | ||
191 | */ | ||
192 | #define PTE_EXT_XN (1 << 0) /* v6 */ | ||
193 | #define PTE_EXT_AP_MASK (3 << 4) | ||
194 | #define PTE_EXT_AP0 (1 << 4) | ||
195 | #define PTE_EXT_AP1 (2 << 4) | ||
196 | #define PTE_EXT_AP_UNO_SRO (0 << 4) | ||
197 | #define PTE_EXT_AP_UNO_SRW (PTE_EXT_AP0) | ||
198 | #define PTE_EXT_AP_URO_SRW (PTE_EXT_AP1) | ||
199 | #define PTE_EXT_AP_URW_SRW (PTE_EXT_AP1|PTE_EXT_AP0) | ||
200 | #define PTE_EXT_TEX(x) ((x) << 6) /* v5 */ | ||
201 | #define PTE_EXT_APX (1 << 9) /* v6 */ | ||
202 | #define PTE_EXT_SHARED (1 << 10) /* v6 */ | ||
203 | #define PTE_EXT_NG (1 << 11) /* v6 */ | ||
204 | |||
205 | /* | ||
206 | * - small page | ||
207 | */ | ||
208 | #define PTE_SMALL_AP_MASK (0xff << 4) | ||
209 | #define PTE_SMALL_AP_UNO_SRO (0x00 << 4) | ||
210 | #define PTE_SMALL_AP_UNO_SRW (0x55 << 4) | ||
211 | #define PTE_SMALL_AP_URO_SRW (0xaa << 4) | ||
212 | #define PTE_SMALL_AP_URW_SRW (0xff << 4) | ||
213 | |||
214 | /* | ||
215 | * "Linux" PTE definitions. | 140 | * "Linux" PTE definitions. |
216 | * | 141 | * |
217 | * We keep two sets of PTEs - the hardware and the linux version. | 142 | * We keep two sets of PTEs - the hardware and the linux version. |
@@ -236,11 +161,6 @@ extern void __pgd_error(const char *file, int line, unsigned long val); | |||
236 | 161 | ||
237 | #ifndef __ASSEMBLY__ | 162 | #ifndef __ASSEMBLY__ |
238 | 163 | ||
239 | #include <asm/domain.h> | ||
240 | |||
241 | #define _PAGE_USER_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_USER)) | ||
242 | #define _PAGE_KERNEL_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_KERNEL)) | ||
243 | |||
244 | /* | 164 | /* |
245 | * The following macros handle the cache and bufferable bits... | 165 | * The following macros handle the cache and bufferable bits... |
246 | */ | 166 | */ |
diff --git a/include/asm-arm/poll.h b/include/asm-arm/poll.h index 2744ca831f5d..5030b2b232a3 100644 --- a/include/asm-arm/poll.h +++ b/include/asm-arm/poll.h | |||
@@ -16,6 +16,7 @@ | |||
16 | #define POLLWRBAND 0x0200 | 16 | #define POLLWRBAND 0x0200 |
17 | #define POLLMSG 0x0400 | 17 | #define POLLMSG 0x0400 |
18 | #define POLLREMOVE 0x1000 | 18 | #define POLLREMOVE 0x1000 |
19 | #define POLLRDHUP 0x2000 | ||
19 | 20 | ||
20 | struct pollfd { | 21 | struct pollfd { |
21 | int fd; | 22 | int fd; |
diff --git a/include/asm-arm/proc-fns.h b/include/asm-arm/proc-fns.h index 7bef2bf6be51..106045edb862 100644 --- a/include/asm-arm/proc-fns.h +++ b/include/asm-arm/proc-fns.h | |||
@@ -138,6 +138,14 @@ | |||
138 | # define CPU_NAME cpu_xscale | 138 | # define CPU_NAME cpu_xscale |
139 | # endif | 139 | # endif |
140 | # endif | 140 | # endif |
141 | # ifdef CONFIG_CPU_XSC3 | ||
142 | # ifdef CPU_NAME | ||
143 | # undef MULTI_CPU | ||
144 | # define MULTI_CPU | ||
145 | # else | ||
146 | # define CPU_NAME cpu_xsc3 | ||
147 | # endif | ||
148 | # endif | ||
141 | # ifdef CONFIG_CPU_V6 | 149 | # ifdef CONFIG_CPU_V6 |
142 | # ifdef CPU_NAME | 150 | # ifdef CPU_NAME |
143 | # undef MULTI_CPU | 151 | # undef MULTI_CPU |
diff --git a/include/asm-arm/rtc.h b/include/asm-arm/rtc.h index 370dfe77589d..1a5c9232a91e 100644 --- a/include/asm-arm/rtc.h +++ b/include/asm-arm/rtc.h | |||
@@ -25,9 +25,6 @@ struct rtc_ops { | |||
25 | int (*proc)(char *buf); | 25 | int (*proc)(char *buf); |
26 | }; | 26 | }; |
27 | 27 | ||
28 | void rtc_time_to_tm(unsigned long, struct rtc_time *); | ||
29 | int rtc_tm_to_time(struct rtc_time *, unsigned long *); | ||
30 | int rtc_valid_tm(struct rtc_time *); | ||
31 | void rtc_next_alarm_time(struct rtc_time *, struct rtc_time *, struct rtc_time *); | 28 | void rtc_next_alarm_time(struct rtc_time *, struct rtc_time *, struct rtc_time *); |
32 | void rtc_update(unsigned long, unsigned long); | 29 | void rtc_update(unsigned long, unsigned long); |
33 | int register_rtc(struct rtc_ops *); | 30 | int register_rtc(struct rtc_ops *); |
diff --git a/include/asm-arm/system.h b/include/asm-arm/system.h index ec91d1ff032a..95b3abf4851b 100644 --- a/include/asm-arm/system.h +++ b/include/asm-arm/system.h | |||
@@ -108,6 +108,25 @@ extern void __show_regs(struct pt_regs *); | |||
108 | extern int cpu_architecture(void); | 108 | extern int cpu_architecture(void); |
109 | extern void cpu_init(void); | 109 | extern void cpu_init(void); |
110 | 110 | ||
111 | /* | ||
112 | * Intel's XScale3 core supports some v6 features (supersections, L2) | ||
113 | * but advertises itself as v5 as it does not support the v6 ISA. For | ||
114 | * this reason, we need a way to explicitly test for this type of CPU. | ||
115 | */ | ||
116 | #ifndef CONFIG_CPU_XSC3 | ||
117 | #define cpu_is_xsc3() 0 | ||
118 | #else | ||
119 | static inline int cpu_is_xsc3(void) | ||
120 | { | ||
121 | extern unsigned int processor_id; | ||
122 | |||
123 | if ((processor_id & 0xffffe000) == 0x69056000) | ||
124 | return 1; | ||
125 | |||
126 | return 0; | ||
127 | } | ||
128 | #endif | ||
129 | |||
111 | #define set_cr(x) \ | 130 | #define set_cr(x) \ |
112 | __asm__ __volatile__( \ | 131 | __asm__ __volatile__( \ |
113 | "mcr p15, 0, %0, c1, c0, 0 @ set CR" \ | 132 | "mcr p15, 0, %0, c1, c0, 0 @ set CR" \ |
diff --git a/include/asm-arm/tlb.h b/include/asm-arm/tlb.h index f49bfb78c221..cb740025d413 100644 --- a/include/asm-arm/tlb.h +++ b/include/asm-arm/tlb.h | |||
@@ -19,6 +19,14 @@ | |||
19 | 19 | ||
20 | #include <asm/cacheflush.h> | 20 | #include <asm/cacheflush.h> |
21 | #include <asm/tlbflush.h> | 21 | #include <asm/tlbflush.h> |
22 | |||
23 | #ifndef CONFIG_MMU | ||
24 | |||
25 | #include <linux/pagemap.h> | ||
26 | #include <asm-generic/tlb.h> | ||
27 | |||
28 | #else /* !CONFIG_MMU */ | ||
29 | |||
22 | #include <asm/pgalloc.h> | 30 | #include <asm/pgalloc.h> |
23 | 31 | ||
24 | /* | 32 | /* |
@@ -82,4 +90,5 @@ tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma) | |||
82 | 90 | ||
83 | #define tlb_migrate_finish(mm) do { } while (0) | 91 | #define tlb_migrate_finish(mm) do { } while (0) |
84 | 92 | ||
93 | #endif /* CONFIG_MMU */ | ||
85 | #endif | 94 | #endif |
diff --git a/include/asm-arm/tlbflush.h b/include/asm-arm/tlbflush.h index 0c2acc944a0a..728992451dd1 100644 --- a/include/asm-arm/tlbflush.h +++ b/include/asm-arm/tlbflush.h | |||
@@ -11,6 +11,13 @@ | |||
11 | #define _ASMARM_TLBFLUSH_H | 11 | #define _ASMARM_TLBFLUSH_H |
12 | 12 | ||
13 | #include <linux/config.h> | 13 | #include <linux/config.h> |
14 | |||
15 | #ifndef CONFIG_MMU | ||
16 | |||
17 | #define tlb_flush(tlb) ((void) tlb) | ||
18 | |||
19 | #else /* CONFIG_MMU */ | ||
20 | |||
14 | #include <asm/glue.h> | 21 | #include <asm/glue.h> |
15 | 22 | ||
16 | #define TLB_V3_PAGE (1 << 0) | 23 | #define TLB_V3_PAGE (1 << 0) |
@@ -423,4 +430,6 @@ extern void update_mmu_cache(struct vm_area_struct *vma, unsigned long addr, pte | |||
423 | 430 | ||
424 | #endif | 431 | #endif |
425 | 432 | ||
433 | #endif /* CONFIG_MMU */ | ||
434 | |||
426 | #endif | 435 | #endif |
diff --git a/include/asm-arm26/bitops.h b/include/asm-arm26/bitops.h index d87f8634e625..19a69573a654 100644 --- a/include/asm-arm26/bitops.h +++ b/include/asm-arm26/bitops.h | |||
@@ -117,65 +117,7 @@ ____atomic_test_and_change_bit(unsigned int bit, volatile unsigned long *p) | |||
117 | return res & mask; | 117 | return res & mask; |
118 | } | 118 | } |
119 | 119 | ||
120 | /* | 120 | #include <asm-generic/bitops/non-atomic.h> |
121 | * Now the non-atomic variants. We let the compiler handle all | ||
122 | * optimisations for these. These are all _native_ endian. | ||
123 | */ | ||
124 | static inline void __set_bit(int nr, volatile unsigned long *p) | ||
125 | { | ||
126 | p[nr >> 5] |= (1UL << (nr & 31)); | ||
127 | } | ||
128 | |||
129 | static inline void __clear_bit(int nr, volatile unsigned long *p) | ||
130 | { | ||
131 | p[nr >> 5] &= ~(1UL << (nr & 31)); | ||
132 | } | ||
133 | |||
134 | static inline void __change_bit(int nr, volatile unsigned long *p) | ||
135 | { | ||
136 | p[nr >> 5] ^= (1UL << (nr & 31)); | ||
137 | } | ||
138 | |||
139 | static inline int __test_and_set_bit(int nr, volatile unsigned long *p) | ||
140 | { | ||
141 | unsigned long oldval, mask = 1UL << (nr & 31); | ||
142 | |||
143 | p += nr >> 5; | ||
144 | |||
145 | oldval = *p; | ||
146 | *p = oldval | mask; | ||
147 | return oldval & mask; | ||
148 | } | ||
149 | |||
150 | static inline int __test_and_clear_bit(int nr, volatile unsigned long *p) | ||
151 | { | ||
152 | unsigned long oldval, mask = 1UL << (nr & 31); | ||
153 | |||
154 | p += nr >> 5; | ||
155 | |||
156 | oldval = *p; | ||
157 | *p = oldval & ~mask; | ||
158 | return oldval & mask; | ||
159 | } | ||
160 | |||
161 | static inline int __test_and_change_bit(int nr, volatile unsigned long *p) | ||
162 | { | ||
163 | unsigned long oldval, mask = 1UL << (nr & 31); | ||
164 | |||
165 | p += nr >> 5; | ||
166 | |||
167 | oldval = *p; | ||
168 | *p = oldval ^ mask; | ||
169 | return oldval & mask; | ||
170 | } | ||
171 | |||
172 | /* | ||
173 | * This routine doesn't need to be atomic. | ||
174 | */ | ||
175 | static inline int __test_bit(int nr, const volatile unsigned long * p) | ||
176 | { | ||
177 | return (p[nr >> 5] >> (nr & 31)) & 1UL; | ||
178 | } | ||
179 | 121 | ||
180 | /* | 122 | /* |
181 | * Little endian assembly bitops. nr = 0 -> byte 0 bit 0. | 123 | * Little endian assembly bitops. nr = 0 -> byte 0 bit 0. |
@@ -211,7 +153,6 @@ extern int _find_next_bit_le(const unsigned long *p, int size, int offset); | |||
211 | #define test_and_set_bit(nr,p) ATOMIC_BITOP_LE(test_and_set_bit,nr,p) | 153 | #define test_and_set_bit(nr,p) ATOMIC_BITOP_LE(test_and_set_bit,nr,p) |
212 | #define test_and_clear_bit(nr,p) ATOMIC_BITOP_LE(test_and_clear_bit,nr,p) | 154 | #define test_and_clear_bit(nr,p) ATOMIC_BITOP_LE(test_and_clear_bit,nr,p) |
213 | #define test_and_change_bit(nr,p) ATOMIC_BITOP_LE(test_and_change_bit,nr,p) | 155 | #define test_and_change_bit(nr,p) ATOMIC_BITOP_LE(test_and_change_bit,nr,p) |
214 | #define test_bit(nr,p) __test_bit(nr,p) | ||
215 | #define find_first_zero_bit(p,sz) _find_first_zero_bit_le(p,sz) | 156 | #define find_first_zero_bit(p,sz) _find_first_zero_bit_le(p,sz) |
216 | #define find_next_zero_bit(p,sz,off) _find_next_zero_bit_le(p,sz,off) | 157 | #define find_next_zero_bit(p,sz,off) _find_next_zero_bit_le(p,sz,off) |
217 | #define find_first_bit(p,sz) _find_first_bit_le(p,sz) | 158 | #define find_first_bit(p,sz) _find_first_bit_le(p,sz) |
@@ -219,80 +160,13 @@ extern int _find_next_bit_le(const unsigned long *p, int size, int offset); | |||
219 | 160 | ||
220 | #define WORD_BITOFF_TO_LE(x) ((x)) | 161 | #define WORD_BITOFF_TO_LE(x) ((x)) |
221 | 162 | ||
222 | /* | 163 | #include <asm-generic/bitops/ffz.h> |
223 | * ffz = Find First Zero in word. Undefined if no zero exists, | 164 | #include <asm-generic/bitops/__ffs.h> |
224 | * so code should check against ~0UL first.. | 165 | #include <asm-generic/bitops/fls.h> |
225 | */ | 166 | #include <asm-generic/bitops/fls64.h> |
226 | static inline unsigned long ffz(unsigned long word) | 167 | #include <asm-generic/bitops/ffs.h> |
227 | { | 168 | #include <asm-generic/bitops/sched.h> |
228 | int k; | 169 | #include <asm-generic/bitops/hweight.h> |
229 | |||
230 | word = ~word; | ||
231 | k = 31; | ||
232 | if (word & 0x0000ffff) { k -= 16; word <<= 16; } | ||
233 | if (word & 0x00ff0000) { k -= 8; word <<= 8; } | ||
234 | if (word & 0x0f000000) { k -= 4; word <<= 4; } | ||
235 | if (word & 0x30000000) { k -= 2; word <<= 2; } | ||
236 | if (word & 0x40000000) { k -= 1; } | ||
237 | return k; | ||
238 | } | ||
239 | |||
240 | /* | ||
241 | * ffz = Find First Zero in word. Undefined if no zero exists, | ||
242 | * so code should check against ~0UL first.. | ||
243 | */ | ||
244 | static inline unsigned long __ffs(unsigned long word) | ||
245 | { | ||
246 | int k; | ||
247 | |||
248 | k = 31; | ||
249 | if (word & 0x0000ffff) { k -= 16; word <<= 16; } | ||
250 | if (word & 0x00ff0000) { k -= 8; word <<= 8; } | ||
251 | if (word & 0x0f000000) { k -= 4; word <<= 4; } | ||
252 | if (word & 0x30000000) { k -= 2; word <<= 2; } | ||
253 | if (word & 0x40000000) { k -= 1; } | ||
254 | return k; | ||
255 | } | ||
256 | |||
257 | /* | ||
258 | * fls: find last bit set. | ||
259 | */ | ||
260 | |||
261 | #define fls(x) generic_fls(x) | ||
262 | #define fls64(x) generic_fls64(x) | ||
263 | |||
264 | /* | ||
265 | * ffs: find first bit set. This is defined the same way as | ||
266 | * the libc and compiler builtin ffs routines, therefore | ||
267 | * differs in spirit from the above ffz (man ffs). | ||
268 | */ | ||
269 | |||
270 | #define ffs(x) generic_ffs(x) | ||
271 | |||
272 | /* | ||
273 | * Find first bit set in a 168-bit bitmap, where the first | ||
274 | * 128 bits are unlikely to be set. | ||
275 | */ | ||
276 | static inline int sched_find_first_bit(unsigned long *b) | ||
277 | { | ||
278 | unsigned long v; | ||
279 | unsigned int off; | ||
280 | |||
281 | for (off = 0; v = b[off], off < 4; off++) { | ||
282 | if (unlikely(v)) | ||
283 | break; | ||
284 | } | ||
285 | return __ffs(v) + off * 32; | ||
286 | } | ||
287 | |||
288 | /* | ||
289 | * hweightN: returns the hamming weight (i.e. the number | ||
290 | * of bits set) of a N-bit word | ||
291 | */ | ||
292 | |||
293 | #define hweight32(x) generic_hweight32(x) | ||
294 | #define hweight16(x) generic_hweight16(x) | ||
295 | #define hweight8(x) generic_hweight8(x) | ||
296 | 170 | ||
297 | /* | 171 | /* |
298 | * Ext2 is defined to use little-endian byte ordering. | 172 | * Ext2 is defined to use little-endian byte ordering. |
@@ -307,7 +181,7 @@ static inline int sched_find_first_bit(unsigned long *b) | |||
307 | #define ext2_clear_bit_atomic(lock,nr,p) \ | 181 | #define ext2_clear_bit_atomic(lock,nr,p) \ |
308 | test_and_clear_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) | 182 | test_and_clear_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) |
309 | #define ext2_test_bit(nr,p) \ | 183 | #define ext2_test_bit(nr,p) \ |
310 | __test_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) | 184 | test_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) |
311 | #define ext2_find_first_zero_bit(p,sz) \ | 185 | #define ext2_find_first_zero_bit(p,sz) \ |
312 | _find_first_zero_bit_le(p,sz) | 186 | _find_first_zero_bit_le(p,sz) |
313 | #define ext2_find_next_zero_bit(p,sz,off) \ | 187 | #define ext2_find_next_zero_bit(p,sz,off) \ |
@@ -320,7 +194,7 @@ static inline int sched_find_first_bit(unsigned long *b) | |||
320 | #define minix_set_bit(nr,p) \ | 194 | #define minix_set_bit(nr,p) \ |
321 | __set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) | 195 | __set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) |
322 | #define minix_test_bit(nr,p) \ | 196 | #define minix_test_bit(nr,p) \ |
323 | __test_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) | 197 | test_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) |
324 | #define minix_test_and_set_bit(nr,p) \ | 198 | #define minix_test_and_set_bit(nr,p) \ |
325 | __test_and_set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) | 199 | __test_and_set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p)) |
326 | #define minix_test_and_clear_bit(nr,p) \ | 200 | #define minix_test_and_clear_bit(nr,p) \ |
diff --git a/include/asm-arm26/memory.h b/include/asm-arm26/memory.h index 20d78616f650..a65f10b80dfb 100644 --- a/include/asm-arm26/memory.h +++ b/include/asm-arm26/memory.h | |||
@@ -81,8 +81,7 @@ static inline void *phys_to_virt(unsigned long x) | |||
81 | * virt_to_page(k) convert a _valid_ virtual address to struct page * | 81 | * virt_to_page(k) convert a _valid_ virtual address to struct page * |
82 | * virt_addr_valid(k) indicates whether a virtual address is valid | 82 | * virt_addr_valid(k) indicates whether a virtual address is valid |
83 | */ | 83 | */ |
84 | #define page_to_pfn(page) (((page) - mem_map) + PHYS_PFN_OFFSET) | 84 | #define ARCH_PFN_OFFSET (PHYS_PFN_OFFSET) |
85 | #define pfn_to_page(pfn) ((mem_map + (pfn)) - PHYS_PFN_OFFSET) | ||
86 | #define pfn_valid(pfn) ((pfn) >= PHYS_PFN_OFFSET && (pfn) < (PHYS_PFN_OFFSET + max_mapnr)) | 85 | #define pfn_valid(pfn) ((pfn) >= PHYS_PFN_OFFSET && (pfn) < (PHYS_PFN_OFFSET + max_mapnr)) |
87 | 86 | ||
88 | #define virt_to_page(kaddr) (pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)) | 87 | #define virt_to_page(kaddr) (pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)) |
@@ -98,4 +97,5 @@ static inline void *phys_to_virt(unsigned long x) | |||
98 | */ | 97 | */ |
99 | #define page_to_bus(page) (page_address(page)) | 98 | #define page_to_bus(page) (page_address(page)) |
100 | 99 | ||
100 | #include <asm-generic/memory_model.h> | ||
101 | #endif | 101 | #endif |
diff --git a/include/asm-arm26/poll.h b/include/asm-arm26/poll.h index fdfdab064a65..9ccb7f4190ca 100644 --- a/include/asm-arm26/poll.h +++ b/include/asm-arm26/poll.h | |||
@@ -15,6 +15,7 @@ | |||
15 | #define POLLWRNORM 0x0100 | 15 | #define POLLWRNORM 0x0100 |
16 | #define POLLWRBAND 0x0200 | 16 | #define POLLWRBAND 0x0200 |
17 | #define POLLMSG 0x0400 | 17 | #define POLLMSG 0x0400 |
18 | #define POLLRDHUP 0x2000 | ||
18 | 19 | ||
19 | struct pollfd { | 20 | struct pollfd { |
20 | int fd; | 21 | int fd; |
diff --git a/include/asm-cris/bitops.h b/include/asm-cris/bitops.h index b7fef1572dc0..a569065113d9 100644 --- a/include/asm-cris/bitops.h +++ b/include/asm-cris/bitops.h | |||
@@ -39,8 +39,6 @@ struct __dummy { unsigned long a[100]; }; | |||
39 | 39 | ||
40 | #define set_bit(nr, addr) (void)test_and_set_bit(nr, addr) | 40 | #define set_bit(nr, addr) (void)test_and_set_bit(nr, addr) |
41 | 41 | ||
42 | #define __set_bit(nr, addr) (void)__test_and_set_bit(nr, addr) | ||
43 | |||
44 | /* | 42 | /* |
45 | * clear_bit - Clears a bit in memory | 43 | * clear_bit - Clears a bit in memory |
46 | * @nr: Bit to clear | 44 | * @nr: Bit to clear |
@@ -54,8 +52,6 @@ struct __dummy { unsigned long a[100]; }; | |||
54 | 52 | ||
55 | #define clear_bit(nr, addr) (void)test_and_clear_bit(nr, addr) | 53 | #define clear_bit(nr, addr) (void)test_and_clear_bit(nr, addr) |
56 | 54 | ||
57 | #define __clear_bit(nr, addr) (void)__test_and_clear_bit(nr, addr) | ||
58 | |||
59 | /* | 55 | /* |
60 | * change_bit - Toggle a bit in memory | 56 | * change_bit - Toggle a bit in memory |
61 | * @nr: Bit to change | 57 | * @nr: Bit to change |
@@ -68,18 +64,6 @@ struct __dummy { unsigned long a[100]; }; | |||
68 | 64 | ||
69 | #define change_bit(nr, addr) (void)test_and_change_bit(nr, addr) | 65 | #define change_bit(nr, addr) (void)test_and_change_bit(nr, addr) |
70 | 66 | ||
71 | /* | ||
72 | * __change_bit - Toggle a bit in memory | ||
73 | * @nr: the bit to change | ||
74 | * @addr: the address to start counting from | ||
75 | * | ||
76 | * Unlike change_bit(), this function is non-atomic and may be reordered. | ||
77 | * If it's called on the same region of memory simultaneously, the effect | ||
78 | * may be that only one operation succeeds. | ||
79 | */ | ||
80 | |||
81 | #define __change_bit(nr, addr) (void)__test_and_change_bit(nr, addr) | ||
82 | |||
83 | /** | 67 | /** |
84 | * test_and_set_bit - Set a bit and return its old value | 68 | * test_and_set_bit - Set a bit and return its old value |
85 | * @nr: Bit to set | 69 | * @nr: Bit to set |
@@ -101,19 +85,6 @@ static inline int test_and_set_bit(int nr, volatile unsigned long *addr) | |||
101 | retval = (mask & *adr) != 0; | 85 | retval = (mask & *adr) != 0; |
102 | *adr |= mask; | 86 | *adr |= mask; |
103 | cris_atomic_restore(addr, flags); | 87 | cris_atomic_restore(addr, flags); |
104 | local_irq_restore(flags); | ||
105 | return retval; | ||
106 | } | ||
107 | |||
108 | static inline int __test_and_set_bit(int nr, volatile unsigned long *addr) | ||
109 | { | ||
110 | unsigned int mask, retval; | ||
111 | unsigned int *adr = (unsigned int *)addr; | ||
112 | |||
113 | adr += nr >> 5; | ||
114 | mask = 1 << (nr & 0x1f); | ||
115 | retval = (mask & *adr) != 0; | ||
116 | *adr |= mask; | ||
117 | return retval; | 88 | return retval; |
118 | } | 89 | } |
119 | 90 | ||
@@ -148,27 +119,6 @@ static inline int test_and_clear_bit(int nr, volatile unsigned long *addr) | |||
148 | } | 119 | } |
149 | 120 | ||
150 | /** | 121 | /** |
151 | * __test_and_clear_bit - Clear a bit and return its old value | ||
152 | * @nr: Bit to clear | ||
153 | * @addr: Address to count from | ||
154 | * | ||
155 | * This operation is non-atomic and can be reordered. | ||
156 | * If two examples of this operation race, one can appear to succeed | ||
157 | * but actually fail. You must protect multiple accesses with a lock. | ||
158 | */ | ||
159 | |||
160 | static inline int __test_and_clear_bit(int nr, volatile unsigned long *addr) | ||
161 | { | ||
162 | unsigned int mask, retval; | ||
163 | unsigned int *adr = (unsigned int *)addr; | ||
164 | |||
165 | adr += nr >> 5; | ||
166 | mask = 1 << (nr & 0x1f); | ||
167 | retval = (mask & *adr) != 0; | ||
168 | *adr &= ~mask; | ||
169 | return retval; | ||
170 | } | ||
171 | /** | ||
172 | * test_and_change_bit - Change a bit and return its old value | 122 | * test_and_change_bit - Change a bit and return its old value |
173 | * @nr: Bit to change | 123 | * @nr: Bit to change |
174 | * @addr: Address to count from | 124 | * @addr: Address to count from |
@@ -191,42 +141,7 @@ static inline int test_and_change_bit(int nr, volatile unsigned long *addr) | |||
191 | return retval; | 141 | return retval; |
192 | } | 142 | } |
193 | 143 | ||
194 | /* WARNING: non atomic and it can be reordered! */ | 144 | #include <asm-generic/bitops/non-atomic.h> |
195 | |||
196 | static inline int __test_and_change_bit(int nr, volatile unsigned long *addr) | ||
197 | { | ||
198 | unsigned int mask, retval; | ||
199 | unsigned int *adr = (unsigned int *)addr; | ||
200 | |||
201 | adr += nr >> 5; | ||
202 | mask = 1 << (nr & 0x1f); | ||
203 | retval = (mask & *adr) != 0; | ||
204 | *adr ^= mask; | ||
205 | |||
206 | return retval; | ||
207 | } | ||
208 | |||
209 | /** | ||
210 | * test_bit - Determine whether a bit is set | ||
211 | * @nr: bit number to test | ||
212 | * @addr: Address to start counting from | ||
213 | * | ||
214 | * This routine doesn't need to be atomic. | ||
215 | */ | ||
216 | |||
217 | static inline int test_bit(int nr, const volatile unsigned long *addr) | ||
218 | { | ||
219 | unsigned int mask; | ||
220 | unsigned int *adr = (unsigned int *)addr; | ||
221 | |||
222 | adr += nr >> 5; | ||
223 | mask = 1 << (nr & 0x1f); | ||
224 | return ((mask & *adr) != 0); | ||
225 | } | ||
226 | |||
227 | /* | ||
228 | * Find-bit routines.. | ||
229 | */ | ||
230 | 145 | ||
231 | /* | 146 | /* |
232 | * Since we define it "external", it collides with the built-in | 147 | * Since we define it "external", it collides with the built-in |
@@ -235,152 +150,18 @@ static inline int test_bit(int nr, const volatile unsigned long *addr) | |||
235 | */ | 150 | */ |
236 | #define ffs kernel_ffs | 151 | #define ffs kernel_ffs |
237 | 152 | ||
238 | /* | 153 | #include <asm-generic/bitops/fls.h> |
239 | * fls: find last bit set. | 154 | #include <asm-generic/bitops/fls64.h> |
240 | */ | 155 | #include <asm-generic/bitops/hweight.h> |
241 | 156 | #include <asm-generic/bitops/find.h> | |
242 | #define fls(x) generic_fls(x) | ||
243 | #define fls64(x) generic_fls64(x) | ||
244 | |||
245 | /* | ||
246 | * hweightN - returns the hamming weight of a N-bit word | ||
247 | * @x: the word to weigh | ||
248 | * | ||
249 | * The Hamming Weight of a number is the total number of bits set in it. | ||
250 | */ | ||
251 | 157 | ||
252 | #define hweight32(x) generic_hweight32(x) | 158 | #include <asm-generic/bitops/ext2-non-atomic.h> |
253 | #define hweight16(x) generic_hweight16(x) | ||
254 | #define hweight8(x) generic_hweight8(x) | ||
255 | 159 | ||
256 | /** | ||
257 | * find_next_zero_bit - find the first zero bit in a memory region | ||
258 | * @addr: The address to base the search on | ||
259 | * @offset: The bitnumber to start searching at | ||
260 | * @size: The maximum size to search | ||
261 | */ | ||
262 | static inline int find_next_zero_bit (const unsigned long * addr, int size, int offset) | ||
263 | { | ||
264 | unsigned long *p = ((unsigned long *) addr) + (offset >> 5); | ||
265 | unsigned long result = offset & ~31UL; | ||
266 | unsigned long tmp; | ||
267 | |||
268 | if (offset >= size) | ||
269 | return size; | ||
270 | size -= result; | ||
271 | offset &= 31UL; | ||
272 | if (offset) { | ||
273 | tmp = *(p++); | ||
274 | tmp |= ~0UL >> (32-offset); | ||
275 | if (size < 32) | ||
276 | goto found_first; | ||
277 | if (~tmp) | ||
278 | goto found_middle; | ||
279 | size -= 32; | ||
280 | result += 32; | ||
281 | } | ||
282 | while (size & ~31UL) { | ||
283 | if (~(tmp = *(p++))) | ||
284 | goto found_middle; | ||
285 | result += 32; | ||
286 | size -= 32; | ||
287 | } | ||
288 | if (!size) | ||
289 | return result; | ||
290 | tmp = *p; | ||
291 | |||
292 | found_first: | ||
293 | tmp |= ~0UL << size; | ||
294 | found_middle: | ||
295 | return result + ffz(tmp); | ||
296 | } | ||
297 | |||
298 | /** | ||
299 | * find_next_bit - find the first set bit in a memory region | ||
300 | * @addr: The address to base the search on | ||
301 | * @offset: The bitnumber to start searching at | ||
302 | * @size: The maximum size to search | ||
303 | */ | ||
304 | static __inline__ int find_next_bit(const unsigned long *addr, int size, int offset) | ||
305 | { | ||
306 | unsigned long *p = ((unsigned long *) addr) + (offset >> 5); | ||
307 | unsigned long result = offset & ~31UL; | ||
308 | unsigned long tmp; | ||
309 | |||
310 | if (offset >= size) | ||
311 | return size; | ||
312 | size -= result; | ||
313 | offset &= 31UL; | ||
314 | if (offset) { | ||
315 | tmp = *(p++); | ||
316 | tmp &= (~0UL << offset); | ||
317 | if (size < 32) | ||
318 | goto found_first; | ||
319 | if (tmp) | ||
320 | goto found_middle; | ||
321 | size -= 32; | ||
322 | result += 32; | ||
323 | } | ||
324 | while (size & ~31UL) { | ||
325 | if ((tmp = *(p++))) | ||
326 | goto found_middle; | ||
327 | result += 32; | ||
328 | size -= 32; | ||
329 | } | ||
330 | if (!size) | ||
331 | return result; | ||
332 | tmp = *p; | ||
333 | |||
334 | found_first: | ||
335 | tmp &= (~0UL >> (32 - size)); | ||
336 | if (tmp == 0UL) /* Are any bits set? */ | ||
337 | return result + size; /* Nope. */ | ||
338 | found_middle: | ||
339 | return result + __ffs(tmp); | ||
340 | } | ||
341 | |||
342 | /** | ||
343 | * find_first_zero_bit - find the first zero bit in a memory region | ||
344 | * @addr: The address to start the search at | ||
345 | * @size: The maximum size to search | ||
346 | * | ||
347 | * Returns the bit-number of the first zero bit, not the number of the byte | ||
348 | * containing a bit. | ||
349 | */ | ||
350 | |||
351 | #define find_first_zero_bit(addr, size) \ | ||
352 | find_next_zero_bit((addr), (size), 0) | ||
353 | #define find_first_bit(addr, size) \ | ||
354 | find_next_bit((addr), (size), 0) | ||
355 | |||
356 | #define ext2_set_bit test_and_set_bit | ||
357 | #define ext2_set_bit_atomic(l,n,a) test_and_set_bit(n,a) | 160 | #define ext2_set_bit_atomic(l,n,a) test_and_set_bit(n,a) |
358 | #define ext2_clear_bit test_and_clear_bit | ||
359 | #define ext2_clear_bit_atomic(l,n,a) test_and_clear_bit(n,a) | 161 | #define ext2_clear_bit_atomic(l,n,a) test_and_clear_bit(n,a) |
360 | #define ext2_test_bit test_bit | ||
361 | #define ext2_find_first_zero_bit find_first_zero_bit | ||
362 | #define ext2_find_next_zero_bit find_next_zero_bit | ||
363 | |||
364 | /* Bitmap functions for the minix filesystem. */ | ||
365 | #define minix_set_bit(nr,addr) test_and_set_bit(nr,addr) | ||
366 | #define minix_clear_bit(nr,addr) test_and_clear_bit(nr,addr) | ||
367 | #define minix_test_bit(nr,addr) test_bit(nr,addr) | ||
368 | #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) | ||
369 | 162 | ||
370 | static inline int sched_find_first_bit(const unsigned long *b) | 163 | #include <asm-generic/bitops/minix.h> |
371 | { | 164 | #include <asm-generic/bitops/sched.h> |
372 | if (unlikely(b[0])) | ||
373 | return __ffs(b[0]); | ||
374 | if (unlikely(b[1])) | ||
375 | return __ffs(b[1]) + 32; | ||
376 | if (unlikely(b[2])) | ||
377 | return __ffs(b[2]) + 64; | ||
378 | if (unlikely(b[3])) | ||
379 | return __ffs(b[3]) + 96; | ||
380 | if (b[4]) | ||
381 | return __ffs(b[4]) + 128; | ||
382 | return __ffs(b[5]) + 32 + 128; | ||
383 | } | ||
384 | 165 | ||
385 | #endif /* __KERNEL__ */ | 166 | #endif /* __KERNEL__ */ |
386 | 167 | ||
diff --git a/include/asm-cris/page.h b/include/asm-cris/page.h index c99c478c482f..3787633e6209 100644 --- a/include/asm-cris/page.h +++ b/include/asm-cris/page.h | |||
@@ -43,8 +43,7 @@ typedef struct { unsigned long pgprot; } pgprot_t; | |||
43 | 43 | ||
44 | /* On CRIS the PFN numbers doesn't start at 0 so we have to compensate */ | 44 | /* On CRIS the PFN numbers doesn't start at 0 so we have to compensate */ |
45 | /* for that before indexing into the page table starting at mem_map */ | 45 | /* for that before indexing into the page table starting at mem_map */ |
46 | #define pfn_to_page(pfn) (mem_map + ((pfn) - (PAGE_OFFSET >> PAGE_SHIFT))) | 46 | #define ARCH_PFN_OFFSET (PAGE_OFFSET >> PAGE_SHIFT) |
47 | #define page_to_pfn(page) ((unsigned long)((page) - mem_map) + (PAGE_OFFSET >> PAGE_SHIFT)) | ||
48 | #define pfn_valid(pfn) (((pfn) - (PAGE_OFFSET >> PAGE_SHIFT)) < max_mapnr) | 47 | #define pfn_valid(pfn) (((pfn) - (PAGE_OFFSET >> PAGE_SHIFT)) < max_mapnr) |
49 | 48 | ||
50 | /* to index into the page map. our pages all start at physical addr PAGE_OFFSET so | 49 | /* to index into the page map. our pages all start at physical addr PAGE_OFFSET so |
@@ -77,6 +76,7 @@ typedef struct { unsigned long pgprot; } pgprot_t; | |||
77 | 76 | ||
78 | #endif /* __KERNEL__ */ | 77 | #endif /* __KERNEL__ */ |
79 | 78 | ||
79 | #include <asm-generic/memory_model.h> | ||
80 | #include <asm-generic/page.h> | 80 | #include <asm-generic/page.h> |
81 | 81 | ||
82 | #endif /* _CRIS_PAGE_H */ | 82 | #endif /* _CRIS_PAGE_H */ |
diff --git a/include/asm-cris/poll.h b/include/asm-cris/poll.h index 1c0efc3e4be7..1b25d4cf498c 100644 --- a/include/asm-cris/poll.h +++ b/include/asm-cris/poll.h | |||
@@ -15,6 +15,7 @@ | |||
15 | #define POLLWRBAND 512 | 15 | #define POLLWRBAND 512 |
16 | #define POLLMSG 1024 | 16 | #define POLLMSG 1024 |
17 | #define POLLREMOVE 4096 | 17 | #define POLLREMOVE 4096 |
18 | #define POLLRDHUP 8192 | ||
18 | 19 | ||
19 | struct pollfd { | 20 | struct pollfd { |
20 | int fd; | 21 | int fd; |
diff --git a/include/asm-frv/bitops.h b/include/asm-frv/bitops.h index f686b519878e..6344d06390b9 100644 --- a/include/asm-frv/bitops.h +++ b/include/asm-frv/bitops.h | |||
@@ -22,20 +22,7 @@ | |||
22 | 22 | ||
23 | #ifdef __KERNEL__ | 23 | #ifdef __KERNEL__ |
24 | 24 | ||
25 | /* | 25 | #include <asm-generic/bitops/ffz.h> |
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 | 26 | ||
40 | /* | 27 | /* |
41 | * clear_bit() doesn't provide any barrier for the compiler. | 28 | * clear_bit() doesn't provide any barrier for the compiler. |
@@ -171,51 +158,9 @@ static inline int __test_bit(int nr, const volatile void * addr) | |||
171 | __constant_test_bit((nr),(addr)) : \ | 158 | __constant_test_bit((nr),(addr)) : \ |
172 | __test_bit((nr),(addr))) | 159 | __test_bit((nr),(addr))) |
173 | 160 | ||
174 | extern int find_next_bit(const unsigned long *addr, int size, int offset); | 161 | #include <asm-generic/bitops/ffs.h> |
175 | 162 | #include <asm-generic/bitops/__ffs.h> | |
176 | #define find_first_bit(addr, size) find_next_bit(addr, size, 0) | 163 | #include <asm-generic/bitops/find.h> |
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 | 164 | ||
220 | /* | 165 | /* |
221 | * fls: find last bit set. | 166 | * fls: find last bit set. |
@@ -228,114 +173,17 @@ found_middle: | |||
228 | \ | 173 | \ |
229 | bit ? 33 - bit : bit; \ | 174 | bit ? 33 - bit : bit; \ |
230 | }) | 175 | }) |
231 | #define fls64(x) generic_fls64(x) | ||
232 | 176 | ||
233 | /* | 177 | #include <asm-generic/bitops/fls64.h> |
234 | * Every architecture must define this function. It's the fastest | 178 | #include <asm-generic/bitops/sched.h> |
235 | * way of searching a 140-bit bitmap where the first 100 bits are | 179 | #include <asm-generic/bitops/hweight.h> |
236 | * unlikely to be set. It's guaranteed that at least one of the 140 | ||
237 | * bits is cleared. | ||
238 | */ | ||
239 | static inline int sched_find_first_bit(const unsigned long *b) | ||
240 | { | ||
241 | if (unlikely(b[0])) | ||
242 | return __ffs(b[0]); | ||
243 | if (unlikely(b[1])) | ||
244 | return __ffs(b[1]) + 32; | ||
245 | if (unlikely(b[2])) | ||
246 | return __ffs(b[2]) + 64; | ||
247 | if (b[3]) | ||
248 | return __ffs(b[3]) + 96; | ||
249 | return __ffs(b[4]) + 128; | ||
250 | } | ||
251 | 180 | ||
181 | #include <asm-generic/bitops/ext2-non-atomic.h> | ||
252 | 182 | ||
253 | /* | 183 | #define ext2_set_bit_atomic(lock,nr,addr) test_and_set_bit ((nr) ^ 0x18, (addr)) |
254 | * hweightN: returns the hamming weight (i.e. the number | 184 | #define ext2_clear_bit_atomic(lock,nr,addr) test_and_clear_bit((nr) ^ 0x18, (addr)) |
255 | * of bits set) of a N-bit word | ||
256 | */ | ||
257 | |||
258 | #define hweight32(x) generic_hweight32(x) | ||
259 | #define hweight16(x) generic_hweight16(x) | ||
260 | #define hweight8(x) generic_hweight8(x) | ||
261 | |||
262 | #define ext2_set_bit(nr, addr) test_and_set_bit ((nr) ^ 0x18, (addr)) | ||
263 | #define ext2_clear_bit(nr, addr) test_and_clear_bit((nr) ^ 0x18, (addr)) | ||
264 | |||
265 | #define ext2_set_bit_atomic(lock,nr,addr) ext2_set_bit((nr), addr) | ||
266 | #define ext2_clear_bit_atomic(lock,nr,addr) ext2_clear_bit((nr), addr) | ||
267 | |||
268 | static inline int ext2_test_bit(int nr, const volatile void * addr) | ||
269 | { | ||
270 | const volatile unsigned char *ADDR = (const unsigned char *) addr; | ||
271 | int mask; | ||
272 | |||
273 | ADDR += nr >> 3; | ||
274 | mask = 1 << (nr & 0x07); | ||
275 | return ((mask & *ADDR) != 0); | ||
276 | } | ||
277 | |||
278 | #define ext2_find_first_zero_bit(addr, size) \ | ||
279 | ext2_find_next_zero_bit((addr), (size), 0) | ||
280 | |||
281 | static inline unsigned long ext2_find_next_zero_bit(const void *addr, | ||
282 | unsigned long size, | ||
283 | unsigned long offset) | ||
284 | { | ||
285 | const unsigned long *p = ((const unsigned long *) addr) + (offset >> 5); | ||
286 | unsigned long result = offset & ~31UL; | ||
287 | unsigned long tmp; | ||
288 | |||
289 | if (offset >= size) | ||
290 | return size; | ||
291 | size -= result; | ||
292 | offset &= 31UL; | ||
293 | if(offset) { | ||
294 | /* We hold the little endian value in tmp, but then the | ||
295 | * shift is illegal. So we could keep a big endian value | ||
296 | * in tmp, like this: | ||
297 | * | ||
298 | * tmp = __swab32(*(p++)); | ||
299 | * tmp |= ~0UL >> (32-offset); | ||
300 | * | ||
301 | * but this would decrease preformance, so we change the | ||
302 | * shift: | ||
303 | */ | ||
304 | tmp = *(p++); | ||
305 | tmp |= __swab32(~0UL >> (32-offset)); | ||
306 | if(size < 32) | ||
307 | goto found_first; | ||
308 | if(~tmp) | ||
309 | goto found_middle; | ||
310 | size -= 32; | ||
311 | result += 32; | ||
312 | } | ||
313 | while(size & ~31UL) { | ||
314 | if(~(tmp = *(p++))) | ||
315 | goto found_middle; | ||
316 | result += 32; | ||
317 | size -= 32; | ||
318 | } | ||
319 | if(!size) | ||
320 | return result; | ||
321 | tmp = *p; | ||
322 | |||
323 | found_first: | ||
324 | /* tmp is little endian, so we would have to swab the shift, | ||
325 | * see above. But then we have to swab tmp below for ffz, so | ||
326 | * we might as well do this here. | ||
327 | */ | ||
328 | return result + ffz(__swab32(tmp) | (~0UL << size)); | ||
329 | found_middle: | ||
330 | return result + ffz(__swab32(tmp)); | ||
331 | } | ||
332 | 185 | ||
333 | /* Bitmap functions for the minix filesystem. */ | 186 | #include <asm-generic/bitops/minix-le.h> |
334 | #define minix_test_and_set_bit(nr,addr) ext2_set_bit(nr,addr) | ||
335 | #define minix_set_bit(nr,addr) ext2_set_bit(nr,addr) | ||
336 | #define minix_test_and_clear_bit(nr,addr) ext2_clear_bit(nr,addr) | ||
337 | #define minix_test_bit(nr,addr) ext2_test_bit(nr,addr) | ||
338 | #define minix_find_first_zero_bit(addr,size) ext2_find_first_zero_bit(addr,size) | ||
339 | 187 | ||
340 | #endif /* __KERNEL__ */ | 188 | #endif /* __KERNEL__ */ |
341 | 189 | ||
diff --git a/include/asm-frv/futex.h b/include/asm-frv/futex.h index fca9d90e32c9..08b3d1da3583 100644 --- a/include/asm-frv/futex.h +++ b/include/asm-frv/futex.h | |||
@@ -9,5 +9,11 @@ | |||
9 | 9 | ||
10 | extern int futex_atomic_op_inuser(int encoded_op, int __user *uaddr); | 10 | extern int futex_atomic_op_inuser(int encoded_op, int __user *uaddr); |
11 | 11 | ||
12 | static inline int | ||
13 | futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) | ||
14 | { | ||
15 | return -ENOSYS; | ||
16 | } | ||
17 | |||
12 | #endif | 18 | #endif |
13 | #endif | 19 | #endif |
diff --git a/include/asm-frv/page.h b/include/asm-frv/page.h index b8221b611b5c..dc0f7e08a4c2 100644 --- a/include/asm-frv/page.h +++ b/include/asm-frv/page.h | |||
@@ -57,13 +57,9 @@ extern unsigned long min_low_pfn; | |||
57 | extern unsigned long max_pfn; | 57 | extern unsigned long max_pfn; |
58 | 58 | ||
59 | #ifdef CONFIG_MMU | 59 | #ifdef CONFIG_MMU |
60 | #define pfn_to_page(pfn) (mem_map + (pfn)) | ||
61 | #define page_to_pfn(page) ((unsigned long) ((page) - mem_map)) | ||
62 | #define pfn_valid(pfn) ((pfn) < max_mapnr) | 60 | #define pfn_valid(pfn) ((pfn) < max_mapnr) |
63 | |||
64 | #else | 61 | #else |
65 | #define pfn_to_page(pfn) (&mem_map[(pfn) - (PAGE_OFFSET >> PAGE_SHIFT)]) | 62 | #define ARCH_PFN_OFFSET (PAGE_OFFSET >> PAGE_SHIFT) |
66 | #define page_to_pfn(page) ((PAGE_OFFSET >> PAGE_SHIFT) + (unsigned long) ((page) - mem_map)) | ||
67 | #define pfn_valid(pfn) ((pfn) >= min_low_pfn && (pfn) < max_low_pfn) | 63 | #define pfn_valid(pfn) ((pfn) >= min_low_pfn && (pfn) < max_low_pfn) |
68 | 64 | ||
69 | #endif | 65 | #endif |
@@ -87,6 +83,7 @@ extern unsigned long max_pfn; | |||
87 | #define WANT_PAGE_VIRTUAL 1 | 83 | #define WANT_PAGE_VIRTUAL 1 |
88 | #endif | 84 | #endif |
89 | 85 | ||
86 | #include <asm-generic/memory_model.h> | ||
90 | #include <asm-generic/page.h> | 87 | #include <asm-generic/page.h> |
91 | 88 | ||
92 | #endif /* _ASM_PAGE_H */ | 89 | #endif /* _ASM_PAGE_H */ |
diff --git a/include/asm-frv/poll.h b/include/asm-frv/poll.h index 8cbcd60e334f..c8fe8801d075 100644 --- a/include/asm-frv/poll.h +++ b/include/asm-frv/poll.h | |||
@@ -12,6 +12,7 @@ | |||
12 | #define POLLRDBAND 128 | 12 | #define POLLRDBAND 128 |
13 | #define POLLWRBAND 256 | 13 | #define POLLWRBAND 256 |
14 | #define POLLMSG 0x0400 | 14 | #define POLLMSG 0x0400 |
15 | #define POLLRDHUP 0x2000 | ||
15 | 16 | ||
16 | struct pollfd { | 17 | struct pollfd { |
17 | int fd; | 18 | int fd; |
diff --git a/include/asm-generic/bitops.h b/include/asm-generic/bitops.h index 0e6d9852008c..1f9d99193df8 100644 --- a/include/asm-generic/bitops.h +++ b/include/asm-generic/bitops.h | |||
@@ -5,77 +5,27 @@ | |||
5 | * For the benefit of those who are trying to port Linux to another | 5 | * For the benefit of those who are trying to port Linux to another |
6 | * architecture, here are some C-language equivalents. You should | 6 | * architecture, here are some C-language equivalents. You should |
7 | * recode these in the native assembly language, if at all possible. | 7 | * recode these in the native assembly language, if at all possible. |
8 | * To guarantee atomicity, these routines call cli() and sti() to | ||
9 | * disable interrupts while they operate. (You have to provide inline | ||
10 | * routines to cli() and sti().) | ||
11 | * | ||
12 | * Also note, these routines assume that you have 32 bit longs. | ||
13 | * You will have to change this if you are trying to port Linux to the | ||
14 | * Alpha architecture or to a Cray. :-) | ||
15 | * | 8 | * |
16 | * C language equivalents written by Theodore Ts'o, 9/26/92 | 9 | * C language equivalents written by Theodore Ts'o, 9/26/92 |
17 | */ | 10 | */ |
18 | 11 | ||
19 | extern __inline__ int set_bit(int nr,long * addr) | 12 | #include <asm-generic/bitops/atomic.h> |
20 | { | 13 | #include <asm-generic/bitops/non-atomic.h> |
21 | int mask, retval; | 14 | #include <asm-generic/bitops/__ffs.h> |
22 | 15 | #include <asm-generic/bitops/ffz.h> | |
23 | addr += nr >> 5; | 16 | #include <asm-generic/bitops/fls.h> |
24 | mask = 1 << (nr & 0x1f); | 17 | #include <asm-generic/bitops/fls64.h> |
25 | cli(); | 18 | #include <asm-generic/bitops/find.h> |
26 | retval = (mask & *addr) != 0; | ||
27 | *addr |= mask; | ||
28 | sti(); | ||
29 | return retval; | ||
30 | } | ||
31 | |||
32 | extern __inline__ int clear_bit(int nr, long * addr) | ||
33 | { | ||
34 | int mask, retval; | ||
35 | |||
36 | addr += nr >> 5; | ||
37 | mask = 1 << (nr & 0x1f); | ||
38 | cli(); | ||
39 | retval = (mask & *addr) != 0; | ||
40 | *addr &= ~mask; | ||
41 | sti(); | ||
42 | return retval; | ||
43 | } | ||
44 | |||
45 | extern __inline__ int test_bit(int nr, const unsigned long * addr) | ||
46 | { | ||
47 | int mask; | ||
48 | |||
49 | addr += nr >> 5; | ||
50 | mask = 1 << (nr & 0x1f); | ||
51 | return ((mask & *addr) != 0); | ||
52 | } | ||
53 | |||
54 | /* | ||
55 | * fls: find last bit set. | ||
56 | */ | ||
57 | |||
58 | #define fls(x) generic_fls(x) | ||
59 | #define fls64(x) generic_fls64(x) | ||
60 | 19 | ||
61 | #ifdef __KERNEL__ | 20 | #ifdef __KERNEL__ |
62 | 21 | ||
63 | /* | 22 | #include <asm-generic/bitops/sched.h> |
64 | * ffs: find first bit set. This is defined the same way as | 23 | #include <asm-generic/bitops/ffs.h> |
65 | * the libc and compiler builtin ffs routines, therefore | 24 | #include <asm-generic/bitops/hweight.h> |
66 | * differs in spirit from the above ffz (man ffs). | ||
67 | */ | ||
68 | |||
69 | #define ffs(x) generic_ffs(x) | ||
70 | |||
71 | /* | ||
72 | * hweightN: returns the hamming weight (i.e. the number | ||
73 | * of bits set) of a N-bit word | ||
74 | */ | ||
75 | 25 | ||
76 | #define hweight32(x) generic_hweight32(x) | 26 | #include <asm-generic/bitops/ext2-non-atomic.h> |
77 | #define hweight16(x) generic_hweight16(x) | 27 | #include <asm-generic/bitops/ext2-atomic.h> |
78 | #define hweight8(x) generic_hweight8(x) | 28 | #include <asm-generic/bitops/minix.h> |
79 | 29 | ||
80 | #endif /* __KERNEL__ */ | 30 | #endif /* __KERNEL__ */ |
81 | 31 | ||
diff --git a/include/asm-generic/bitops/__ffs.h b/include/asm-generic/bitops/__ffs.h new file mode 100644 index 000000000000..9a3274aecf83 --- /dev/null +++ b/include/asm-generic/bitops/__ffs.h | |||
@@ -0,0 +1,43 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS___FFS_H_ | ||
2 | #define _ASM_GENERIC_BITOPS___FFS_H_ | ||
3 | |||
4 | #include <asm/types.h> | ||
5 | |||
6 | /** | ||
7 | * __ffs - find first bit in word. | ||
8 | * @word: The word to search | ||
9 | * | ||
10 | * Undefined if no bit exists, so code should check against 0 first. | ||
11 | */ | ||
12 | static inline unsigned long __ffs(unsigned long word) | ||
13 | { | ||
14 | int num = 0; | ||
15 | |||
16 | #if BITS_PER_LONG == 64 | ||
17 | if ((word & 0xffffffff) == 0) { | ||
18 | num += 32; | ||
19 | word >>= 32; | ||
20 | } | ||
21 | #endif | ||
22 | if ((word & 0xffff) == 0) { | ||
23 | num += 16; | ||
24 | word >>= 16; | ||
25 | } | ||
26 | if ((word & 0xff) == 0) { | ||
27 | num += 8; | ||
28 | word >>= 8; | ||
29 | } | ||
30 | if ((word & 0xf) == 0) { | ||
31 | num += 4; | ||
32 | word >>= 4; | ||
33 | } | ||
34 | if ((word & 0x3) == 0) { | ||
35 | num += 2; | ||
36 | word >>= 2; | ||
37 | } | ||
38 | if ((word & 0x1) == 0) | ||
39 | num += 1; | ||
40 | return num; | ||
41 | } | ||
42 | |||
43 | #endif /* _ASM_GENERIC_BITOPS___FFS_H_ */ | ||
diff --git a/include/asm-generic/bitops/atomic.h b/include/asm-generic/bitops/atomic.h new file mode 100644 index 000000000000..78339319ba02 --- /dev/null +++ b/include/asm-generic/bitops/atomic.h | |||
@@ -0,0 +1,191 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS_ATOMIC_H_ | ||
2 | #define _ASM_GENERIC_BITOPS_ATOMIC_H_ | ||
3 | |||
4 | #include <asm/types.h> | ||
5 | |||
6 | #define BITOP_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) | ||
7 | #define BITOP_WORD(nr) ((nr) / BITS_PER_LONG) | ||
8 | |||
9 | #ifdef CONFIG_SMP | ||
10 | #include <asm/spinlock.h> | ||
11 | #include <asm/cache.h> /* we use L1_CACHE_BYTES */ | ||
12 | |||
13 | /* Use an array of spinlocks for our atomic_ts. | ||
14 | * Hash function to index into a different SPINLOCK. | ||
15 | * Since "a" is usually an address, use one spinlock per cacheline. | ||
16 | */ | ||
17 | # define ATOMIC_HASH_SIZE 4 | ||
18 | # define ATOMIC_HASH(a) (&(__atomic_hash[ (((unsigned long) a)/L1_CACHE_BYTES) & (ATOMIC_HASH_SIZE-1) ])) | ||
19 | |||
20 | extern raw_spinlock_t __atomic_hash[ATOMIC_HASH_SIZE] __lock_aligned; | ||
21 | |||
22 | /* Can't use raw_spin_lock_irq because of #include problems, so | ||
23 | * this is the substitute */ | ||
24 | #define _atomic_spin_lock_irqsave(l,f) do { \ | ||
25 | raw_spinlock_t *s = ATOMIC_HASH(l); \ | ||
26 | local_irq_save(f); \ | ||
27 | __raw_spin_lock(s); \ | ||
28 | } while(0) | ||
29 | |||
30 | #define _atomic_spin_unlock_irqrestore(l,f) do { \ | ||
31 | raw_spinlock_t *s = ATOMIC_HASH(l); \ | ||
32 | __raw_spin_unlock(s); \ | ||
33 | local_irq_restore(f); \ | ||
34 | } while(0) | ||
35 | |||
36 | |||
37 | #else | ||
38 | # define _atomic_spin_lock_irqsave(l,f) do { local_irq_save(f); } while (0) | ||
39 | # define _atomic_spin_unlock_irqrestore(l,f) do { local_irq_restore(f); } while (0) | ||
40 | #endif | ||
41 | |||
42 | /* | ||
43 | * NMI events can occur at any time, including when interrupts have been | ||
44 | * disabled by *_irqsave(). So you can get NMI events occurring while a | ||
45 | * *_bit function is holding a spin lock. If the NMI handler also wants | ||
46 | * to do bit manipulation (and they do) then you can get a deadlock | ||
47 | * between the original caller of *_bit() and the NMI handler. | ||
48 | * | ||
49 | * by Keith Owens | ||
50 | */ | ||
51 | |||
52 | /** | ||
53 | * set_bit - Atomically set a bit in memory | ||
54 | * @nr: the bit to set | ||
55 | * @addr: the address to start counting from | ||
56 | * | ||
57 | * This function is atomic and may not be reordered. See __set_bit() | ||
58 | * if you do not require the atomic guarantees. | ||
59 | * | ||
60 | * Note: there are no guarantees that this function will not be reordered | ||
61 | * on non x86 architectures, so if you are writting portable code, | ||
62 | * make sure not to rely on its reordering guarantees. | ||
63 | * | ||
64 | * Note that @nr may be almost arbitrarily large; this function is not | ||
65 | * restricted to acting on a single-word quantity. | ||
66 | */ | ||
67 | static inline void set_bit(int nr, volatile unsigned long *addr) | ||
68 | { | ||
69 | unsigned long mask = BITOP_MASK(nr); | ||
70 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
71 | unsigned long flags; | ||
72 | |||
73 | _atomic_spin_lock_irqsave(p, flags); | ||
74 | *p |= mask; | ||
75 | _atomic_spin_unlock_irqrestore(p, flags); | ||
76 | } | ||
77 | |||
78 | /** | ||
79 | * clear_bit - Clears a bit in memory | ||
80 | * @nr: Bit to clear | ||
81 | * @addr: Address to start counting from | ||
82 | * | ||
83 | * clear_bit() is atomic and may not be reordered. However, it does | ||
84 | * not contain a memory barrier, so if it is used for locking purposes, | ||
85 | * you should call smp_mb__before_clear_bit() and/or smp_mb__after_clear_bit() | ||
86 | * in order to ensure changes are visible on other processors. | ||
87 | */ | ||
88 | static inline void clear_bit(int nr, volatile unsigned long *addr) | ||
89 | { | ||
90 | unsigned long mask = BITOP_MASK(nr); | ||
91 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
92 | unsigned long flags; | ||
93 | |||
94 | _atomic_spin_lock_irqsave(p, flags); | ||
95 | *p &= ~mask; | ||
96 | _atomic_spin_unlock_irqrestore(p, flags); | ||
97 | } | ||
98 | |||
99 | /** | ||
100 | * change_bit - Toggle a bit in memory | ||
101 | * @nr: Bit to change | ||
102 | * @addr: Address to start counting from | ||
103 | * | ||
104 | * change_bit() is atomic and may not be reordered. It may be | ||
105 | * reordered on other architectures than x86. | ||
106 | * Note that @nr may be almost arbitrarily large; this function is not | ||
107 | * restricted to acting on a single-word quantity. | ||
108 | */ | ||
109 | static inline void change_bit(int nr, volatile unsigned long *addr) | ||
110 | { | ||
111 | unsigned long mask = BITOP_MASK(nr); | ||
112 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
113 | unsigned long flags; | ||
114 | |||
115 | _atomic_spin_lock_irqsave(p, flags); | ||
116 | *p ^= mask; | ||
117 | _atomic_spin_unlock_irqrestore(p, flags); | ||
118 | } | ||
119 | |||
120 | /** | ||
121 | * test_and_set_bit - Set a bit and return its old value | ||
122 | * @nr: Bit to set | ||
123 | * @addr: Address to count from | ||
124 | * | ||
125 | * This operation is atomic and cannot be reordered. | ||
126 | * It may be reordered on other architectures than x86. | ||
127 | * It also implies a memory barrier. | ||
128 | */ | ||
129 | static inline int test_and_set_bit(int nr, volatile unsigned long *addr) | ||
130 | { | ||
131 | unsigned long mask = BITOP_MASK(nr); | ||
132 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
133 | unsigned long old; | ||
134 | unsigned long flags; | ||
135 | |||
136 | _atomic_spin_lock_irqsave(p, flags); | ||
137 | old = *p; | ||
138 | *p = old | mask; | ||
139 | _atomic_spin_unlock_irqrestore(p, flags); | ||
140 | |||
141 | return (old & mask) != 0; | ||
142 | } | ||
143 | |||
144 | /** | ||
145 | * test_and_clear_bit - Clear a bit and return its old value | ||
146 | * @nr: Bit to clear | ||
147 | * @addr: Address to count from | ||
148 | * | ||
149 | * This operation is atomic and cannot be reordered. | ||
150 | * It can be reorderdered on other architectures other than x86. | ||
151 | * It also implies a memory barrier. | ||
152 | */ | ||
153 | static inline int test_and_clear_bit(int nr, volatile unsigned long *addr) | ||
154 | { | ||
155 | unsigned long mask = BITOP_MASK(nr); | ||
156 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
157 | unsigned long old; | ||
158 | unsigned long flags; | ||
159 | |||
160 | _atomic_spin_lock_irqsave(p, flags); | ||
161 | old = *p; | ||
162 | *p = old & ~mask; | ||
163 | _atomic_spin_unlock_irqrestore(p, flags); | ||
164 | |||
165 | return (old & mask) != 0; | ||
166 | } | ||
167 | |||
168 | /** | ||
169 | * test_and_change_bit - Change a bit and return its old value | ||
170 | * @nr: Bit to change | ||
171 | * @addr: Address to count from | ||
172 | * | ||
173 | * This operation is atomic and cannot be reordered. | ||
174 | * It also implies a memory barrier. | ||
175 | */ | ||
176 | static inline int test_and_change_bit(int nr, volatile unsigned long *addr) | ||
177 | { | ||
178 | unsigned long mask = BITOP_MASK(nr); | ||
179 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
180 | unsigned long old; | ||
181 | unsigned long flags; | ||
182 | |||
183 | _atomic_spin_lock_irqsave(p, flags); | ||
184 | old = *p; | ||
185 | *p = old ^ mask; | ||
186 | _atomic_spin_unlock_irqrestore(p, flags); | ||
187 | |||
188 | return (old & mask) != 0; | ||
189 | } | ||
190 | |||
191 | #endif /* _ASM_GENERIC_BITOPS_ATOMIC_H */ | ||
diff --git a/include/asm-generic/bitops/ext2-atomic.h b/include/asm-generic/bitops/ext2-atomic.h new file mode 100644 index 000000000000..ab1c875efb74 --- /dev/null +++ b/include/asm-generic/bitops/ext2-atomic.h | |||
@@ -0,0 +1,22 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS_EXT2_ATOMIC_H_ | ||
2 | #define _ASM_GENERIC_BITOPS_EXT2_ATOMIC_H_ | ||
3 | |||
4 | #define ext2_set_bit_atomic(lock, nr, addr) \ | ||
5 | ({ \ | ||
6 | int ret; \ | ||
7 | spin_lock(lock); \ | ||
8 | ret = ext2_set_bit((nr), (unsigned long *)(addr)); \ | ||
9 | spin_unlock(lock); \ | ||
10 | ret; \ | ||
11 | }) | ||
12 | |||
13 | #define ext2_clear_bit_atomic(lock, nr, addr) \ | ||
14 | ({ \ | ||
15 | int ret; \ | ||
16 | spin_lock(lock); \ | ||
17 | ret = ext2_clear_bit((nr), (unsigned long *)(addr)); \ | ||
18 | spin_unlock(lock); \ | ||
19 | ret; \ | ||
20 | }) | ||
21 | |||
22 | #endif /* _ASM_GENERIC_BITOPS_EXT2_ATOMIC_H_ */ | ||
diff --git a/include/asm-generic/bitops/ext2-non-atomic.h b/include/asm-generic/bitops/ext2-non-atomic.h new file mode 100644 index 000000000000..1697404afa05 --- /dev/null +++ b/include/asm-generic/bitops/ext2-non-atomic.h | |||
@@ -0,0 +1,18 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS_EXT2_NON_ATOMIC_H_ | ||
2 | #define _ASM_GENERIC_BITOPS_EXT2_NON_ATOMIC_H_ | ||
3 | |||
4 | #include <asm-generic/bitops/le.h> | ||
5 | |||
6 | #define ext2_set_bit(nr,addr) \ | ||
7 | generic___test_and_set_le_bit((nr),(unsigned long *)(addr)) | ||
8 | #define ext2_clear_bit(nr,addr) \ | ||
9 | generic___test_and_clear_le_bit((nr),(unsigned long *)(addr)) | ||
10 | |||
11 | #define ext2_test_bit(nr,addr) \ | ||
12 | generic_test_le_bit((nr),(unsigned long *)(addr)) | ||
13 | #define ext2_find_first_zero_bit(addr, size) \ | ||
14 | generic_find_first_zero_le_bit((unsigned long *)(addr), (size)) | ||
15 | #define ext2_find_next_zero_bit(addr, size, off) \ | ||
16 | generic_find_next_zero_le_bit((unsigned long *)(addr), (size), (off)) | ||
17 | |||
18 | #endif /* _ASM_GENERIC_BITOPS_EXT2_NON_ATOMIC_H_ */ | ||
diff --git a/include/asm-generic/bitops/ffs.h b/include/asm-generic/bitops/ffs.h new file mode 100644 index 000000000000..fbbb43af7dc0 --- /dev/null +++ b/include/asm-generic/bitops/ffs.h | |||
@@ -0,0 +1,41 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS_FFS_H_ | ||
2 | #define _ASM_GENERIC_BITOPS_FFS_H_ | ||
3 | |||
4 | /** | ||
5 | * ffs - find first bit set | ||
6 | * @x: the word to search | ||
7 | * | ||
8 | * This is defined the same way as | ||
9 | * the libc and compiler builtin ffs routines, therefore | ||
10 | * differs in spirit from the above ffz (man ffs). | ||
11 | */ | ||
12 | static inline int ffs(int x) | ||
13 | { | ||
14 | int r = 1; | ||
15 | |||
16 | if (!x) | ||
17 | return 0; | ||
18 | if (!(x & 0xffff)) { | ||
19 | x >>= 16; | ||
20 | r += 16; | ||
21 | } | ||
22 | if (!(x & 0xff)) { | ||
23 | x >>= 8; | ||
24 | r += 8; | ||
25 | } | ||
26 | if (!(x & 0xf)) { | ||
27 | x >>= 4; | ||
28 | r += 4; | ||
29 | } | ||
30 | if (!(x & 3)) { | ||
31 | x >>= 2; | ||
32 | r += 2; | ||
33 | } | ||
34 | if (!(x & 1)) { | ||
35 | x >>= 1; | ||
36 | r += 1; | ||
37 | } | ||
38 | return r; | ||
39 | } | ||
40 | |||
41 | #endif /* _ASM_GENERIC_BITOPS_FFS_H_ */ | ||
diff --git a/include/asm-generic/bitops/ffz.h b/include/asm-generic/bitops/ffz.h new file mode 100644 index 000000000000..6744bd4cdf46 --- /dev/null +++ b/include/asm-generic/bitops/ffz.h | |||
@@ -0,0 +1,12 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS_FFZ_H_ | ||
2 | #define _ASM_GENERIC_BITOPS_FFZ_H_ | ||
3 | |||
4 | /* | ||
5 | * ffz - find first zero in word. | ||
6 | * @word: The word to search | ||
7 | * | ||
8 | * Undefined if no zero exists, so code should check against ~0UL first. | ||
9 | */ | ||
10 | #define ffz(x) __ffs(~(x)) | ||
11 | |||
12 | #endif /* _ASM_GENERIC_BITOPS_FFZ_H_ */ | ||
diff --git a/include/asm-generic/bitops/find.h b/include/asm-generic/bitops/find.h new file mode 100644 index 000000000000..72a51e5a12ef --- /dev/null +++ b/include/asm-generic/bitops/find.h | |||
@@ -0,0 +1,13 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS_FIND_H_ | ||
2 | #define _ASM_GENERIC_BITOPS_FIND_H_ | ||
3 | |||
4 | extern unsigned long find_next_bit(const unsigned long *addr, unsigned long | ||
5 | size, unsigned long offset); | ||
6 | |||
7 | extern unsigned long find_next_zero_bit(const unsigned long *addr, unsigned | ||
8 | long size, unsigned long offset); | ||
9 | |||
10 | #define find_first_bit(addr, size) find_next_bit((addr), (size), 0) | ||
11 | #define find_first_zero_bit(addr, size) find_next_zero_bit((addr), (size), 0) | ||
12 | |||
13 | #endif /*_ASM_GENERIC_BITOPS_FIND_H_ */ | ||
diff --git a/include/asm-generic/bitops/fls.h b/include/asm-generic/bitops/fls.h new file mode 100644 index 000000000000..850859bc5069 --- /dev/null +++ b/include/asm-generic/bitops/fls.h | |||
@@ -0,0 +1,41 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS_FLS_H_ | ||
2 | #define _ASM_GENERIC_BITOPS_FLS_H_ | ||
3 | |||
4 | /** | ||
5 | * fls - find last (most-significant) bit set | ||
6 | * @x: the word to search | ||
7 | * | ||
8 | * This is defined the same way as ffs. | ||
9 | * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. | ||
10 | */ | ||
11 | |||
12 | static inline int fls(int x) | ||
13 | { | ||
14 | int r = 32; | ||
15 | |||
16 | if (!x) | ||
17 | return 0; | ||
18 | if (!(x & 0xffff0000u)) { | ||
19 | x <<= 16; | ||
20 | r -= 16; | ||
21 | } | ||
22 | if (!(x & 0xff000000u)) { | ||
23 | x <<= 8; | ||
24 | r -= 8; | ||
25 | } | ||
26 | if (!(x & 0xf0000000u)) { | ||
27 | x <<= 4; | ||
28 | r -= 4; | ||
29 | } | ||
30 | if (!(x & 0xc0000000u)) { | ||
31 | x <<= 2; | ||
32 | r -= 2; | ||
33 | } | ||
34 | if (!(x & 0x80000000u)) { | ||
35 | x <<= 1; | ||
36 | r -= 1; | ||
37 | } | ||
38 | return r; | ||
39 | } | ||
40 | |||
41 | #endif /* _ASM_GENERIC_BITOPS_FLS_H_ */ | ||
diff --git a/include/asm-generic/bitops/fls64.h b/include/asm-generic/bitops/fls64.h new file mode 100644 index 000000000000..1b6b17ce2428 --- /dev/null +++ b/include/asm-generic/bitops/fls64.h | |||
@@ -0,0 +1,14 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS_FLS64_H_ | ||
2 | #define _ASM_GENERIC_BITOPS_FLS64_H_ | ||
3 | |||
4 | #include <asm/types.h> | ||
5 | |||
6 | static inline int fls64(__u64 x) | ||
7 | { | ||
8 | __u32 h = x >> 32; | ||
9 | if (h) | ||
10 | return fls(h) + 32; | ||
11 | return fls(x); | ||
12 | } | ||
13 | |||
14 | #endif /* _ASM_GENERIC_BITOPS_FLS64_H_ */ | ||
diff --git a/include/asm-generic/bitops/hweight.h b/include/asm-generic/bitops/hweight.h new file mode 100644 index 000000000000..fbbc383771da --- /dev/null +++ b/include/asm-generic/bitops/hweight.h | |||
@@ -0,0 +1,11 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS_HWEIGHT_H_ | ||
2 | #define _ASM_GENERIC_BITOPS_HWEIGHT_H_ | ||
3 | |||
4 | #include <asm/types.h> | ||
5 | |||
6 | extern unsigned int hweight32(unsigned int w); | ||
7 | extern unsigned int hweight16(unsigned int w); | ||
8 | extern unsigned int hweight8(unsigned int w); | ||
9 | extern unsigned long hweight64(__u64 w); | ||
10 | |||
11 | #endif /* _ASM_GENERIC_BITOPS_HWEIGHT_H_ */ | ||
diff --git a/include/asm-generic/bitops/le.h b/include/asm-generic/bitops/le.h new file mode 100644 index 000000000000..b9c7e5d2d2ad --- /dev/null +++ b/include/asm-generic/bitops/le.h | |||
@@ -0,0 +1,53 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS_LE_H_ | ||
2 | #define _ASM_GENERIC_BITOPS_LE_H_ | ||
3 | |||
4 | #include <asm/types.h> | ||
5 | #include <asm/byteorder.h> | ||
6 | |||
7 | #define BITOP_WORD(nr) ((nr) / BITS_PER_LONG) | ||
8 | #define BITOP_LE_SWIZZLE ((BITS_PER_LONG-1) & ~0x7) | ||
9 | |||
10 | #if defined(__LITTLE_ENDIAN) | ||
11 | |||
12 | #define generic_test_le_bit(nr, addr) test_bit(nr, addr) | ||
13 | #define generic___set_le_bit(nr, addr) __set_bit(nr, addr) | ||
14 | #define generic___clear_le_bit(nr, addr) __clear_bit(nr, addr) | ||
15 | |||
16 | #define generic_test_and_set_le_bit(nr, addr) test_and_set_bit(nr, addr) | ||
17 | #define generic_test_and_clear_le_bit(nr, addr) test_and_clear_bit(nr, addr) | ||
18 | |||
19 | #define generic___test_and_set_le_bit(nr, addr) __test_and_set_bit(nr, addr) | ||
20 | #define generic___test_and_clear_le_bit(nr, addr) __test_and_clear_bit(nr, addr) | ||
21 | |||
22 | #define generic_find_next_zero_le_bit(addr, size, offset) find_next_zero_bit(addr, size, offset) | ||
23 | |||
24 | #elif defined(__BIG_ENDIAN) | ||
25 | |||
26 | #define generic_test_le_bit(nr, addr) \ | ||
27 | test_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) | ||
28 | #define generic___set_le_bit(nr, addr) \ | ||
29 | __set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) | ||
30 | #define generic___clear_le_bit(nr, addr) \ | ||
31 | __clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) | ||
32 | |||
33 | #define generic_test_and_set_le_bit(nr, addr) \ | ||
34 | test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) | ||
35 | #define generic_test_and_clear_le_bit(nr, addr) \ | ||
36 | test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) | ||
37 | |||
38 | #define generic___test_and_set_le_bit(nr, addr) \ | ||
39 | __test_and_set_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) | ||
40 | #define generic___test_and_clear_le_bit(nr, addr) \ | ||
41 | __test_and_clear_bit((nr) ^ BITOP_LE_SWIZZLE, (addr)) | ||
42 | |||
43 | extern unsigned long generic_find_next_zero_le_bit(const unsigned long *addr, | ||
44 | unsigned long size, unsigned long offset); | ||
45 | |||
46 | #else | ||
47 | #error "Please fix <asm/byteorder.h>" | ||
48 | #endif | ||
49 | |||
50 | #define generic_find_first_zero_le_bit(addr, size) \ | ||
51 | generic_find_next_zero_le_bit((addr), (size), 0) | ||
52 | |||
53 | #endif /* _ASM_GENERIC_BITOPS_LE_H_ */ | ||
diff --git a/include/asm-generic/bitops/minix-le.h b/include/asm-generic/bitops/minix-le.h new file mode 100644 index 000000000000..4a981c1bb1ae --- /dev/null +++ b/include/asm-generic/bitops/minix-le.h | |||
@@ -0,0 +1,17 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS_MINIX_LE_H_ | ||
2 | #define _ASM_GENERIC_BITOPS_MINIX_LE_H_ | ||
3 | |||
4 | #include <asm-generic/bitops/le.h> | ||
5 | |||
6 | #define minix_test_and_set_bit(nr,addr) \ | ||
7 | generic___test_and_set_le_bit((nr),(unsigned long *)(addr)) | ||
8 | #define minix_set_bit(nr,addr) \ | ||
9 | generic___set_le_bit((nr),(unsigned long *)(addr)) | ||
10 | #define minix_test_and_clear_bit(nr,addr) \ | ||
11 | generic___test_and_clear_le_bit((nr),(unsigned long *)(addr)) | ||
12 | #define minix_test_bit(nr,addr) \ | ||
13 | generic_test_le_bit((nr),(unsigned long *)(addr)) | ||
14 | #define minix_find_first_zero_bit(addr,size) \ | ||
15 | generic_find_first_zero_le_bit((unsigned long *)(addr),(size)) | ||
16 | |||
17 | #endif /* _ASM_GENERIC_BITOPS_MINIX_LE_H_ */ | ||
diff --git a/include/asm-generic/bitops/minix.h b/include/asm-generic/bitops/minix.h new file mode 100644 index 000000000000..91f42e87aa51 --- /dev/null +++ b/include/asm-generic/bitops/minix.h | |||
@@ -0,0 +1,15 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS_MINIX_H_ | ||
2 | #define _ASM_GENERIC_BITOPS_MINIX_H_ | ||
3 | |||
4 | #define minix_test_and_set_bit(nr,addr) \ | ||
5 | __test_and_set_bit((nr),(unsigned long *)(addr)) | ||
6 | #define minix_set_bit(nr,addr) \ | ||
7 | __set_bit((nr),(unsigned long *)(addr)) | ||
8 | #define minix_test_and_clear_bit(nr,addr) \ | ||
9 | __test_and_clear_bit((nr),(unsigned long *)(addr)) | ||
10 | #define minix_test_bit(nr,addr) \ | ||
11 | test_bit((nr),(unsigned long *)(addr)) | ||
12 | #define minix_find_first_zero_bit(addr,size) \ | ||
13 | find_first_zero_bit((unsigned long *)(addr),(size)) | ||
14 | |||
15 | #endif /* _ASM_GENERIC_BITOPS_MINIX_H_ */ | ||
diff --git a/include/asm-generic/bitops/non-atomic.h b/include/asm-generic/bitops/non-atomic.h new file mode 100644 index 000000000000..46a825cf2ae1 --- /dev/null +++ b/include/asm-generic/bitops/non-atomic.h | |||
@@ -0,0 +1,111 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS_NON_ATOMIC_H_ | ||
2 | #define _ASM_GENERIC_BITOPS_NON_ATOMIC_H_ | ||
3 | |||
4 | #include <asm/types.h> | ||
5 | |||
6 | #define BITOP_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) | ||
7 | #define BITOP_WORD(nr) ((nr) / BITS_PER_LONG) | ||
8 | |||
9 | /** | ||
10 | * __set_bit - Set a bit in memory | ||
11 | * @nr: the bit to set | ||
12 | * @addr: the address to start counting from | ||
13 | * | ||
14 | * Unlike set_bit(), this function is non-atomic and may be reordered. | ||
15 | * If it's called on the same region of memory simultaneously, the effect | ||
16 | * may be that only one operation succeeds. | ||
17 | */ | ||
18 | static inline void __set_bit(int nr, volatile unsigned long *addr) | ||
19 | { | ||
20 | unsigned long mask = BITOP_MASK(nr); | ||
21 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
22 | |||
23 | *p |= mask; | ||
24 | } | ||
25 | |||
26 | static inline void __clear_bit(int nr, volatile unsigned long *addr) | ||
27 | { | ||
28 | unsigned long mask = BITOP_MASK(nr); | ||
29 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
30 | |||
31 | *p &= ~mask; | ||
32 | } | ||
33 | |||
34 | /** | ||
35 | * __change_bit - Toggle a bit in memory | ||
36 | * @nr: the bit to change | ||
37 | * @addr: the address to start counting from | ||
38 | * | ||
39 | * Unlike change_bit(), this function is non-atomic and may be reordered. | ||
40 | * If it's called on the same region of memory simultaneously, the effect | ||
41 | * may be that only one operation succeeds. | ||
42 | */ | ||
43 | static inline void __change_bit(int nr, volatile unsigned long *addr) | ||
44 | { | ||
45 | unsigned long mask = BITOP_MASK(nr); | ||
46 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
47 | |||
48 | *p ^= mask; | ||
49 | } | ||
50 | |||
51 | /** | ||
52 | * __test_and_set_bit - Set a bit and return its old value | ||
53 | * @nr: Bit to set | ||
54 | * @addr: Address to count from | ||
55 | * | ||
56 | * This operation is non-atomic and can be reordered. | ||
57 | * If two examples of this operation race, one can appear to succeed | ||
58 | * but actually fail. You must protect multiple accesses with a lock. | ||
59 | */ | ||
60 | static inline int __test_and_set_bit(int nr, volatile unsigned long *addr) | ||
61 | { | ||
62 | unsigned long mask = BITOP_MASK(nr); | ||
63 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
64 | unsigned long old = *p; | ||
65 | |||
66 | *p = old | mask; | ||
67 | return (old & mask) != 0; | ||
68 | } | ||
69 | |||
70 | /** | ||
71 | * __test_and_clear_bit - Clear a bit and return its old value | ||
72 | * @nr: Bit to clear | ||
73 | * @addr: Address to count from | ||
74 | * | ||
75 | * This operation is non-atomic and can be reordered. | ||
76 | * If two examples of this operation race, one can appear to succeed | ||
77 | * but actually fail. You must protect multiple accesses with a lock. | ||
78 | */ | ||
79 | static inline int __test_and_clear_bit(int nr, volatile unsigned long *addr) | ||
80 | { | ||
81 | unsigned long mask = BITOP_MASK(nr); | ||
82 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
83 | unsigned long old = *p; | ||
84 | |||
85 | *p = old & ~mask; | ||
86 | return (old & mask) != 0; | ||
87 | } | ||
88 | |||
89 | /* WARNING: non atomic and it can be reordered! */ | ||
90 | static inline int __test_and_change_bit(int nr, | ||
91 | volatile unsigned long *addr) | ||
92 | { | ||
93 | unsigned long mask = BITOP_MASK(nr); | ||
94 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
95 | unsigned long old = *p; | ||
96 | |||
97 | *p = old ^ mask; | ||
98 | return (old & mask) != 0; | ||
99 | } | ||
100 | |||
101 | /** | ||
102 | * test_bit - Determine whether a bit is set | ||
103 | * @nr: bit number to test | ||
104 | * @addr: Address to start counting from | ||
105 | */ | ||
106 | static inline int test_bit(int nr, const volatile unsigned long *addr) | ||
107 | { | ||
108 | return 1UL & (addr[BITOP_WORD(nr)] >> (nr & (BITS_PER_LONG-1))); | ||
109 | } | ||
110 | |||
111 | #endif /* _ASM_GENERIC_BITOPS_NON_ATOMIC_H_ */ | ||
diff --git a/include/asm-generic/bitops/sched.h b/include/asm-generic/bitops/sched.h new file mode 100644 index 000000000000..5ef93a4d009f --- /dev/null +++ b/include/asm-generic/bitops/sched.h | |||
@@ -0,0 +1,36 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS_SCHED_H_ | ||
2 | #define _ASM_GENERIC_BITOPS_SCHED_H_ | ||
3 | |||
4 | #include <linux/compiler.h> /* unlikely() */ | ||
5 | #include <asm/types.h> | ||
6 | |||
7 | /* | ||
8 | * Every architecture must define this function. It's the fastest | ||
9 | * way of searching a 140-bit bitmap where the first 100 bits are | ||
10 | * unlikely to be set. It's guaranteed that at least one of the 140 | ||
11 | * bits is cleared. | ||
12 | */ | ||
13 | static inline int sched_find_first_bit(const unsigned long *b) | ||
14 | { | ||
15 | #if BITS_PER_LONG == 64 | ||
16 | if (unlikely(b[0])) | ||
17 | return __ffs(b[0]); | ||
18 | if (unlikely(b[1])) | ||
19 | return __ffs(b[1]) + 64; | ||
20 | return __ffs(b[2]) + 128; | ||
21 | #elif BITS_PER_LONG == 32 | ||
22 | if (unlikely(b[0])) | ||
23 | return __ffs(b[0]); | ||
24 | if (unlikely(b[1])) | ||
25 | return __ffs(b[1]) + 32; | ||
26 | if (unlikely(b[2])) | ||
27 | return __ffs(b[2]) + 64; | ||
28 | if (b[3]) | ||
29 | return __ffs(b[3]) + 96; | ||
30 | return __ffs(b[4]) + 128; | ||
31 | #else | ||
32 | #error BITS_PER_LONG not defined | ||
33 | #endif | ||
34 | } | ||
35 | |||
36 | #endif /* _ASM_GENERIC_BITOPS_SCHED_H_ */ | ||
diff --git a/include/asm-generic/futex.h b/include/asm-generic/futex.h index 3ae2c7347549..df893c160318 100644 --- a/include/asm-generic/futex.h +++ b/include/asm-generic/futex.h | |||
@@ -49,5 +49,11 @@ futex_atomic_op_inuser (int encoded_op, int __user *uaddr) | |||
49 | return ret; | 49 | return ret; |
50 | } | 50 | } |
51 | 51 | ||
52 | static inline int | ||
53 | futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) | ||
54 | { | ||
55 | return -ENOSYS; | ||
56 | } | ||
57 | |||
52 | #endif | 58 | #endif |
53 | #endif | 59 | #endif |
diff --git a/include/asm-generic/local.h b/include/asm-generic/local.h index 16fc00360f75..de4614840c2c 100644 --- a/include/asm-generic/local.h +++ b/include/asm-generic/local.h | |||
@@ -4,28 +4,28 @@ | |||
4 | #include <linux/config.h> | 4 | #include <linux/config.h> |
5 | #include <linux/percpu.h> | 5 | #include <linux/percpu.h> |
6 | #include <linux/hardirq.h> | 6 | #include <linux/hardirq.h> |
7 | #include <asm/atomic.h> | ||
7 | #include <asm/types.h> | 8 | #include <asm/types.h> |
8 | 9 | ||
9 | /* An unsigned long type for operations which are atomic for a single | 10 | /* An unsigned long type for operations which are atomic for a single |
10 | * CPU. Usually used in combination with per-cpu variables. */ | 11 | * CPU. Usually used in combination with per-cpu variables. */ |
11 | 12 | ||
12 | #if BITS_PER_LONG == 32 | ||
13 | /* Implement in terms of atomics. */ | 13 | /* Implement in terms of atomics. */ |
14 | 14 | ||
15 | /* Don't use typedef: don't want them to be mixed with atomic_t's. */ | 15 | /* Don't use typedef: don't want them to be mixed with atomic_t's. */ |
16 | typedef struct | 16 | typedef struct |
17 | { | 17 | { |
18 | atomic_t a; | 18 | atomic_long_t a; |
19 | } local_t; | 19 | } local_t; |
20 | 20 | ||
21 | #define LOCAL_INIT(i) { ATOMIC_INIT(i) } | 21 | #define LOCAL_INIT(i) { ATOMIC_LONG_INIT(i) } |
22 | 22 | ||
23 | #define local_read(l) ((unsigned long)atomic_read(&(l)->a)) | 23 | #define local_read(l) ((unsigned long)atomic_long_read(&(l)->a)) |
24 | #define local_set(l,i) atomic_set((&(l)->a),(i)) | 24 | #define local_set(l,i) atomic_long_set((&(l)->a),(i)) |
25 | #define local_inc(l) atomic_inc(&(l)->a) | 25 | #define local_inc(l) atomic_long_inc(&(l)->a) |
26 | #define local_dec(l) atomic_dec(&(l)->a) | 26 | #define local_dec(l) atomic_long_dec(&(l)->a) |
27 | #define local_add(i,l) atomic_add((i),(&(l)->a)) | 27 | #define local_add(i,l) atomic_long_add((i),(&(l)->a)) |
28 | #define local_sub(i,l) atomic_sub((i),(&(l)->a)) | 28 | #define local_sub(i,l) atomic_long_sub((i),(&(l)->a)) |
29 | 29 | ||
30 | /* Non-atomic variants, ie. preemption disabled and won't be touched | 30 | /* Non-atomic variants, ie. preemption disabled and won't be touched |
31 | * in interrupt, etc. Some archs can optimize this case well. */ | 31 | * in interrupt, etc. Some archs can optimize this case well. */ |
@@ -34,68 +34,6 @@ typedef struct | |||
34 | #define __local_add(i,l) local_set((l), local_read(l) + (i)) | 34 | #define __local_add(i,l) local_set((l), local_read(l) + (i)) |
35 | #define __local_sub(i,l) local_set((l), local_read(l) - (i)) | 35 | #define __local_sub(i,l) local_set((l), local_read(l) - (i)) |
36 | 36 | ||
37 | #else /* ... can't use atomics. */ | ||
38 | /* Implement in terms of three variables. | ||
39 | Another option would be to use local_irq_save/restore. */ | ||
40 | |||
41 | typedef struct | ||
42 | { | ||
43 | /* 0 = in hardirq, 1 = in softirq, 2 = usermode. */ | ||
44 | unsigned long v[3]; | ||
45 | } local_t; | ||
46 | |||
47 | #define _LOCAL_VAR(l) ((l)->v[!in_interrupt() + !in_irq()]) | ||
48 | |||
49 | #define LOCAL_INIT(i) { { (i), 0, 0 } } | ||
50 | |||
51 | static inline unsigned long local_read(local_t *l) | ||
52 | { | ||
53 | return l->v[0] + l->v[1] + l->v[2]; | ||
54 | } | ||
55 | |||
56 | static inline void local_set(local_t *l, unsigned long v) | ||
57 | { | ||
58 | l->v[0] = v; | ||
59 | l->v[1] = l->v[2] = 0; | ||
60 | } | ||
61 | |||
62 | static inline void local_inc(local_t *l) | ||
63 | { | ||
64 | preempt_disable(); | ||
65 | _LOCAL_VAR(l)++; | ||
66 | preempt_enable(); | ||
67 | } | ||
68 | |||
69 | static inline void local_dec(local_t *l) | ||
70 | { | ||
71 | preempt_disable(); | ||
72 | _LOCAL_VAR(l)--; | ||
73 | preempt_enable(); | ||
74 | } | ||
75 | |||
76 | static inline void local_add(unsigned long v, local_t *l) | ||
77 | { | ||
78 | preempt_disable(); | ||
79 | _LOCAL_VAR(l) += v; | ||
80 | preempt_enable(); | ||
81 | } | ||
82 | |||
83 | static inline void local_sub(unsigned long v, local_t *l) | ||
84 | { | ||
85 | preempt_disable(); | ||
86 | _LOCAL_VAR(l) -= v; | ||
87 | preempt_enable(); | ||
88 | } | ||
89 | |||
90 | /* Non-atomic variants, ie. preemption disabled and won't be touched | ||
91 | * in interrupt, etc. Some archs can optimize this case well. */ | ||
92 | #define __local_inc(l) ((l)->v[0]++) | ||
93 | #define __local_dec(l) ((l)->v[0]--) | ||
94 | #define __local_add(i,l) ((l)->v[0] += (i)) | ||
95 | #define __local_sub(i,l) ((l)->v[0] -= (i)) | ||
96 | |||
97 | #endif /* Non-atomic implementation */ | ||
98 | |||
99 | /* Use these for per-cpu local_t variables: on some archs they are | 37 | /* Use these for per-cpu local_t variables: on some archs they are |
100 | * much more efficient than these naive implementations. Note they take | 38 | * much more efficient than these naive implementations. Note they take |
101 | * a variable (eg. mystruct.foo), not an address. | 39 | * a variable (eg. mystruct.foo), not an address. |
diff --git a/include/asm-generic/memory_model.h b/include/asm-generic/memory_model.h new file mode 100644 index 000000000000..0cfb086dd373 --- /dev/null +++ b/include/asm-generic/memory_model.h | |||
@@ -0,0 +1,77 @@ | |||
1 | #ifndef __ASM_MEMORY_MODEL_H | ||
2 | #define __ASM_MEMORY_MODEL_H | ||
3 | |||
4 | #ifdef __KERNEL__ | ||
5 | #ifndef __ASSEMBLY__ | ||
6 | |||
7 | #if defined(CONFIG_FLATMEM) | ||
8 | |||
9 | #ifndef ARCH_PFN_OFFSET | ||
10 | #define ARCH_PFN_OFFSET (0UL) | ||
11 | #endif | ||
12 | |||
13 | #elif defined(CONFIG_DISCONTIGMEM) | ||
14 | |||
15 | #ifndef arch_pfn_to_nid | ||
16 | #define arch_pfn_to_nid(pfn) pfn_to_nid(pfn) | ||
17 | #endif | ||
18 | |||
19 | #ifndef arch_local_page_offset | ||
20 | #define arch_local_page_offset(pfn, nid) \ | ||
21 | ((pfn) - NODE_DATA(nid)->node_start_pfn) | ||
22 | #endif | ||
23 | |||
24 | #endif /* CONFIG_DISCONTIGMEM */ | ||
25 | |||
26 | #ifdef CONFIG_OUT_OF_LINE_PFN_TO_PAGE | ||
27 | struct page; | ||
28 | /* this is useful when inlined pfn_to_page is too big */ | ||
29 | extern struct page *pfn_to_page(unsigned long pfn); | ||
30 | extern unsigned long page_to_pfn(struct page *page); | ||
31 | #else | ||
32 | /* | ||
33 | * supports 3 memory models. | ||
34 | */ | ||
35 | #if defined(CONFIG_FLATMEM) | ||
36 | |||
37 | #define pfn_to_page(pfn) (mem_map + ((pfn) - ARCH_PFN_OFFSET)) | ||
38 | #define page_to_pfn(page) ((unsigned long)((page) - mem_map) + \ | ||
39 | ARCH_PFN_OFFSET) | ||
40 | #elif defined(CONFIG_DISCONTIGMEM) | ||
41 | |||
42 | #define pfn_to_page(pfn) \ | ||
43 | ({ unsigned long __pfn = (pfn); \ | ||
44 | unsigned long __nid = arch_pfn_to_nid(pfn); \ | ||
45 | NODE_DATA(__nid)->node_mem_map + arch_local_page_offset(__pfn, __nid);\ | ||
46 | }) | ||
47 | |||
48 | #define page_to_pfn(pg) \ | ||
49 | ({ struct page *__pg = (pg); \ | ||
50 | struct pglist_data *__pgdat = NODE_DATA(page_to_nid(__pg)); \ | ||
51 | (unsigned long)(__pg - __pgdat->node_mem_map) + \ | ||
52 | __pgdat->node_start_pfn; \ | ||
53 | }) | ||
54 | |||
55 | #elif defined(CONFIG_SPARSEMEM) | ||
56 | /* | ||
57 | * Note: section's mem_map is encorded to reflect its start_pfn. | ||
58 | * section[i].section_mem_map == mem_map's address - start_pfn; | ||
59 | */ | ||
60 | #define page_to_pfn(pg) \ | ||
61 | ({ struct page *__pg = (pg); \ | ||
62 | int __sec = page_to_section(__pg); \ | ||
63 | __pg - __section_mem_map_addr(__nr_to_section(__sec)); \ | ||
64 | }) | ||
65 | |||
66 | #define pfn_to_page(pfn) \ | ||
67 | ({ unsigned long __pfn = (pfn); \ | ||
68 | struct mem_section *__sec = __pfn_to_section(__pfn); \ | ||
69 | __section_mem_map_addr(__sec) + __pfn; \ | ||
70 | }) | ||
71 | #endif /* CONFIG_FLATMEM/DISCONTIGMEM/SPARSEMEM */ | ||
72 | #endif /* CONFIG_OUT_OF_LINE_PFN_TO_PAGE */ | ||
73 | |||
74 | #endif /* __ASSEMBLY__ */ | ||
75 | #endif /* __KERNEL__ */ | ||
76 | |||
77 | #endif | ||
diff --git a/include/asm-generic/percpu.h b/include/asm-generic/percpu.h index 78cf45547e31..c0caf433a7d7 100644 --- a/include/asm-generic/percpu.h +++ b/include/asm-generic/percpu.h | |||
@@ -19,7 +19,7 @@ extern unsigned long __per_cpu_offset[NR_CPUS]; | |||
19 | #define percpu_modcopy(pcpudst, src, size) \ | 19 | #define percpu_modcopy(pcpudst, src, size) \ |
20 | do { \ | 20 | do { \ |
21 | unsigned int __i; \ | 21 | unsigned int __i; \ |
22 | for_each_cpu(__i) \ | 22 | for_each_possible_cpu(__i) \ |
23 | memcpy((pcpudst)+__per_cpu_offset[__i], \ | 23 | memcpy((pcpudst)+__per_cpu_offset[__i], \ |
24 | (src), (size)); \ | 24 | (src), (size)); \ |
25 | } while (0) | 25 | } while (0) |
diff --git a/include/asm-h8300/bitops.h b/include/asm-h8300/bitops.h index ff7c2b721594..574f57b6c4d1 100644 --- a/include/asm-h8300/bitops.h +++ b/include/asm-h8300/bitops.h | |||
@@ -8,7 +8,6 @@ | |||
8 | 8 | ||
9 | #include <linux/config.h> | 9 | #include <linux/config.h> |
10 | #include <linux/compiler.h> | 10 | #include <linux/compiler.h> |
11 | #include <asm/byteorder.h> /* swab32 */ | ||
12 | #include <asm/system.h> | 11 | #include <asm/system.h> |
13 | 12 | ||
14 | #ifdef __KERNEL__ | 13 | #ifdef __KERNEL__ |
@@ -177,10 +176,7 @@ H8300_GEN_TEST_BITOP(test_and_change_bit,"bnot") | |||
177 | #undef H8300_GEN_TEST_BITOP_CONST_INT | 176 | #undef H8300_GEN_TEST_BITOP_CONST_INT |
178 | #undef H8300_GEN_TEST_BITOP | 177 | #undef H8300_GEN_TEST_BITOP |
179 | 178 | ||
180 | #define find_first_zero_bit(addr, size) \ | 179 | #include <asm-generic/bitops/ffs.h> |
181 | find_next_zero_bit((addr), (size), 0) | ||
182 | |||
183 | #define ffs(x) generic_ffs(x) | ||
184 | 180 | ||
185 | static __inline__ unsigned long __ffs(unsigned long word) | 181 | static __inline__ unsigned long __ffs(unsigned long word) |
186 | { | 182 | { |
@@ -196,216 +192,16 @@ static __inline__ unsigned long __ffs(unsigned long word) | |||
196 | return result; | 192 | return result; |
197 | } | 193 | } |
198 | 194 | ||
199 | static __inline__ int find_next_zero_bit (const unsigned long * addr, int size, int offset) | 195 | #include <asm-generic/bitops/find.h> |
200 | { | 196 | #include <asm-generic/bitops/sched.h> |
201 | unsigned long *p = (unsigned long *)(((unsigned long)addr + (offset >> 3)) & ~3); | 197 | #include <asm-generic/bitops/hweight.h> |
202 | unsigned long result = offset & ~31UL; | 198 | #include <asm-generic/bitops/ext2-non-atomic.h> |
203 | unsigned long tmp; | 199 | #include <asm-generic/bitops/ext2-atomic.h> |
204 | 200 | #include <asm-generic/bitops/minix.h> | |
205 | if (offset >= size) | ||
206 | return size; | ||
207 | size -= result; | ||
208 | offset &= 31UL; | ||
209 | if (offset) { | ||
210 | tmp = *(p++); | ||
211 | tmp |= ~0UL >> (32-offset); | ||
212 | if (size < 32) | ||
213 | goto found_first; | ||
214 | if (~tmp) | ||
215 | goto found_middle; | ||
216 | size -= 32; | ||
217 | result += 32; | ||
218 | } | ||
219 | while (size & ~31UL) { | ||
220 | if (~(tmp = *(p++))) | ||
221 | goto found_middle; | ||
222 | result += 32; | ||
223 | size -= 32; | ||
224 | } | ||
225 | if (!size) | ||
226 | return result; | ||
227 | tmp = *p; | ||
228 | |||
229 | found_first: | ||
230 | tmp |= ~0UL << size; | ||
231 | found_middle: | ||
232 | return result + ffz(tmp); | ||
233 | } | ||
234 | |||
235 | static __inline__ unsigned long find_next_bit(const unsigned long *addr, | ||
236 | unsigned long size, unsigned long offset) | ||
237 | { | ||
238 | unsigned long *p = (unsigned long *)(((unsigned long)addr + (offset >> 3)) & ~3); | ||
239 | unsigned int result = offset & ~31UL; | ||
240 | unsigned int tmp; | ||
241 | |||
242 | if (offset >= size) | ||
243 | return size; | ||
244 | size -= result; | ||
245 | offset &= 31UL; | ||
246 | if (offset) { | ||
247 | tmp = *(p++); | ||
248 | tmp &= ~0UL << offset; | ||
249 | if (size < 32) | ||
250 | goto found_first; | ||
251 | if (tmp) | ||
252 | goto found_middle; | ||
253 | size -= 32; | ||
254 | result += 32; | ||
255 | } | ||
256 | while (size >= 32) { | ||
257 | if ((tmp = *p++) != 0) | ||
258 | goto found_middle; | ||
259 | result += 32; | ||
260 | size -= 32; | ||
261 | } | ||
262 | if (!size) | ||
263 | return result; | ||
264 | tmp = *p; | ||
265 | |||
266 | found_first: | ||
267 | tmp &= ~0UL >> (32 - size); | ||
268 | if (tmp == 0UL) | ||
269 | return result + size; | ||
270 | found_middle: | ||
271 | return result + __ffs(tmp); | ||
272 | } | ||
273 | |||
274 | #define find_first_bit(addr, size) find_next_bit(addr, size, 0) | ||
275 | |||
276 | /* | ||
277 | * Every architecture must define this function. It's the fastest | ||
278 | * way of searching a 140-bit bitmap where the first 100 bits are | ||
279 | * unlikely to be set. It's guaranteed that at least one of the 140 | ||
280 | * bits is cleared. | ||
281 | */ | ||
282 | static inline int sched_find_first_bit(unsigned long *b) | ||
283 | { | ||
284 | if (unlikely(b[0])) | ||
285 | return __ffs(b[0]); | ||
286 | if (unlikely(b[1])) | ||
287 | return __ffs(b[1]) + 32; | ||
288 | if (unlikely(b[2])) | ||
289 | return __ffs(b[2]) + 64; | ||
290 | if (b[3]) | ||
291 | return __ffs(b[3]) + 96; | ||
292 | return __ffs(b[4]) + 128; | ||
293 | } | ||
294 | |||
295 | /* | ||
296 | * hweightN: returns the hamming weight (i.e. the number | ||
297 | * of bits set) of a N-bit word | ||
298 | */ | ||
299 | |||
300 | #define hweight32(x) generic_hweight32(x) | ||
301 | #define hweight16(x) generic_hweight16(x) | ||
302 | #define hweight8(x) generic_hweight8(x) | ||
303 | |||
304 | static __inline__ int ext2_set_bit(int nr, volatile void * addr) | ||
305 | { | ||
306 | int mask, retval; | ||
307 | unsigned long flags; | ||
308 | volatile unsigned char *ADDR = (unsigned char *) addr; | ||
309 | |||
310 | ADDR += nr >> 3; | ||
311 | mask = 1 << (nr & 0x07); | ||
312 | local_irq_save(flags); | ||
313 | retval = (mask & *ADDR) != 0; | ||
314 | *ADDR |= mask; | ||
315 | local_irq_restore(flags); | ||
316 | return retval; | ||
317 | } | ||
318 | #define ext2_set_bit_atomic(lock, nr, addr) ext2_set_bit(nr, addr) | ||
319 | |||
320 | static __inline__ int ext2_clear_bit(int nr, volatile void * addr) | ||
321 | { | ||
322 | int mask, retval; | ||
323 | unsigned long flags; | ||
324 | volatile unsigned char *ADDR = (unsigned char *) addr; | ||
325 | |||
326 | ADDR += nr >> 3; | ||
327 | mask = 1 << (nr & 0x07); | ||
328 | local_irq_save(flags); | ||
329 | retval = (mask & *ADDR) != 0; | ||
330 | *ADDR &= ~mask; | ||
331 | local_irq_restore(flags); | ||
332 | return retval; | ||
333 | } | ||
334 | #define ext2_clear_bit_atomic(lock, nr, addr) ext2_set_bit(nr, addr) | ||
335 | |||
336 | static __inline__ int ext2_test_bit(int nr, const volatile void * addr) | ||
337 | { | ||
338 | int mask; | ||
339 | const volatile unsigned char *ADDR = (const unsigned char *) addr; | ||
340 | |||
341 | ADDR += nr >> 3; | ||
342 | mask = 1 << (nr & 0x07); | ||
343 | return ((mask & *ADDR) != 0); | ||
344 | } | ||
345 | |||
346 | #define ext2_find_first_zero_bit(addr, size) \ | ||
347 | ext2_find_next_zero_bit((addr), (size), 0) | ||
348 | |||
349 | static __inline__ unsigned long ext2_find_next_zero_bit(void *addr, unsigned long size, unsigned long offset) | ||
350 | { | ||
351 | unsigned long *p = ((unsigned long *) addr) + (offset >> 5); | ||
352 | unsigned long result = offset & ~31UL; | ||
353 | unsigned long tmp; | ||
354 | |||
355 | if (offset >= size) | ||
356 | return size; | ||
357 | size -= result; | ||
358 | offset &= 31UL; | ||
359 | if(offset) { | ||
360 | /* We hold the little endian value in tmp, but then the | ||
361 | * shift is illegal. So we could keep a big endian value | ||
362 | * in tmp, like this: | ||
363 | * | ||
364 | * tmp = __swab32(*(p++)); | ||
365 | * tmp |= ~0UL >> (32-offset); | ||
366 | * | ||
367 | * but this would decrease performance, so we change the | ||
368 | * shift: | ||
369 | */ | ||
370 | tmp = *(p++); | ||
371 | tmp |= __swab32(~0UL >> (32-offset)); | ||
372 | if(size < 32) | ||
373 | goto found_first; | ||
374 | if(~tmp) | ||
375 | goto found_middle; | ||
376 | size -= 32; | ||
377 | result += 32; | ||
378 | } | ||
379 | while(size & ~31UL) { | ||
380 | if(~(tmp = *(p++))) | ||
381 | goto found_middle; | ||
382 | result += 32; | ||
383 | size -= 32; | ||
384 | } | ||
385 | if(!size) | ||
386 | return result; | ||
387 | tmp = *p; | ||
388 | |||
389 | found_first: | ||
390 | /* tmp is little endian, so we would have to swab the shift, | ||
391 | * see above. But then we have to swab tmp below for ffz, so | ||
392 | * we might as well do this here. | ||
393 | */ | ||
394 | return result + ffz(__swab32(tmp) | (~0UL << size)); | ||
395 | found_middle: | ||
396 | return result + ffz(__swab32(tmp)); | ||
397 | } | ||
398 | |||
399 | /* Bitmap functions for the minix filesystem. */ | ||
400 | #define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr) | ||
401 | #define minix_set_bit(nr,addr) set_bit(nr,addr) | ||
402 | #define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr) | ||
403 | #define minix_test_bit(nr,addr) test_bit(nr,addr) | ||
404 | #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) | ||
405 | 201 | ||
406 | #endif /* __KERNEL__ */ | 202 | #endif /* __KERNEL__ */ |
407 | 203 | ||
408 | #define fls(x) generic_fls(x) | 204 | #include <asm-generic/bitops/fls.h> |
409 | #define fls64(x) generic_fls64(x) | 205 | #include <asm-generic/bitops/fls64.h> |
410 | 206 | ||
411 | #endif /* _H8300_BITOPS_H */ | 207 | #endif /* _H8300_BITOPS_H */ |
diff --git a/include/asm-h8300/page.h b/include/asm-h8300/page.h index cd35b1cc6cde..6472c9f88227 100644 --- a/include/asm-h8300/page.h +++ b/include/asm-h8300/page.h | |||
@@ -71,8 +71,7 @@ extern unsigned long memory_end; | |||
71 | #define page_to_virt(page) ((((page) - mem_map) << PAGE_SHIFT) + PAGE_OFFSET) | 71 | #define page_to_virt(page) ((((page) - mem_map) << PAGE_SHIFT) + PAGE_OFFSET) |
72 | #define pfn_valid(page) (page < max_mapnr) | 72 | #define pfn_valid(page) (page < max_mapnr) |
73 | 73 | ||
74 | #define pfn_to_page(pfn) virt_to_page(pfn_to_virt(pfn)) | 74 | #define ARCH_PFN_OFFSET (PAGE_OFFSET >> PAGE_SHIFT) |
75 | #define page_to_pfn(page) virt_to_pfn(page_to_virt(page)) | ||
76 | 75 | ||
77 | #define virt_addr_valid(kaddr) (((void *)(kaddr) >= (void *)PAGE_OFFSET) && \ | 76 | #define virt_addr_valid(kaddr) (((void *)(kaddr) >= (void *)PAGE_OFFSET) && \ |
78 | ((void *)(kaddr) < (void *)memory_end)) | 77 | ((void *)(kaddr) < (void *)memory_end)) |
@@ -81,6 +80,7 @@ extern unsigned long memory_end; | |||
81 | 80 | ||
82 | #endif /* __KERNEL__ */ | 81 | #endif /* __KERNEL__ */ |
83 | 82 | ||
83 | #include <asm-generic/memory_model.h> | ||
84 | #include <asm-generic/page.h> | 84 | #include <asm-generic/page.h> |
85 | 85 | ||
86 | #endif /* _H8300_PAGE_H */ | 86 | #endif /* _H8300_PAGE_H */ |
diff --git a/include/asm-h8300/poll.h b/include/asm-h8300/poll.h index bf49ab8ad6da..fc52103b276a 100644 --- a/include/asm-h8300/poll.h +++ b/include/asm-h8300/poll.h | |||
@@ -12,6 +12,7 @@ | |||
12 | #define POLLRDBAND 128 | 12 | #define POLLRDBAND 128 |
13 | #define POLLWRBAND 256 | 13 | #define POLLWRBAND 256 |
14 | #define POLLMSG 0x0400 | 14 | #define POLLMSG 0x0400 |
15 | #define POLLRDHUP 0x2000 | ||
15 | 16 | ||
16 | struct pollfd { | 17 | struct pollfd { |
17 | int fd; | 18 | int fd; |
diff --git a/include/asm-h8300/types.h b/include/asm-h8300/types.h index bf91e0d4dde7..da2402b86540 100644 --- a/include/asm-h8300/types.h +++ b/include/asm-h8300/types.h | |||
@@ -58,6 +58,9 @@ typedef u32 dma_addr_t; | |||
58 | #define HAVE_SECTOR_T | 58 | #define HAVE_SECTOR_T |
59 | typedef u64 sector_t; | 59 | typedef u64 sector_t; |
60 | 60 | ||
61 | #define HAVE_BLKCNT_T | ||
62 | typedef u64 blkcnt_t; | ||
63 | |||
61 | #endif /* __KERNEL__ */ | 64 | #endif /* __KERNEL__ */ |
62 | 65 | ||
63 | #endif /* __ASSEMBLY__ */ | 66 | #endif /* __ASSEMBLY__ */ |
diff --git a/include/asm-i386/bitops.h b/include/asm-i386/bitops.h index 7d20b95edb3b..08deaeee6be9 100644 --- a/include/asm-i386/bitops.h +++ b/include/asm-i386/bitops.h | |||
@@ -362,28 +362,9 @@ static inline unsigned long ffz(unsigned long word) | |||
362 | return word; | 362 | return word; |
363 | } | 363 | } |
364 | 364 | ||
365 | #define fls64(x) generic_fls64(x) | ||
366 | |||
367 | #ifdef __KERNEL__ | 365 | #ifdef __KERNEL__ |
368 | 366 | ||
369 | /* | 367 | #include <asm-generic/bitops/sched.h> |
370 | * Every architecture must define this function. It's the fastest | ||
371 | * way of searching a 140-bit bitmap where the first 100 bits are | ||
372 | * unlikely to be set. It's guaranteed that at least one of the 140 | ||
373 | * bits is cleared. | ||
374 | */ | ||
375 | static inline int sched_find_first_bit(const unsigned long *b) | ||
376 | { | ||
377 | if (unlikely(b[0])) | ||
378 | return __ffs(b[0]); | ||
379 | if (unlikely(b[1])) | ||
380 | return __ffs(b[1]) + 32; | ||
381 | if (unlikely(b[2])) | ||
382 | return __ffs(b[2]) + 64; | ||
383 | if (b[3]) | ||
384 | return __ffs(b[3]) + 96; | ||
385 | return __ffs(b[4]) + 128; | ||
386 | } | ||
387 | 368 | ||
388 | /** | 369 | /** |
389 | * ffs - find first bit set | 370 | * ffs - find first bit set |
@@ -421,42 +402,22 @@ static inline int fls(int x) | |||
421 | return r+1; | 402 | return r+1; |
422 | } | 403 | } |
423 | 404 | ||
424 | /** | 405 | #include <asm-generic/bitops/hweight.h> |
425 | * hweightN - returns the hamming weight of a N-bit word | ||
426 | * @x: the word to weigh | ||
427 | * | ||
428 | * The Hamming Weight of a number is the total number of bits set in it. | ||
429 | */ | ||
430 | |||
431 | #define hweight32(x) generic_hweight32(x) | ||
432 | #define hweight16(x) generic_hweight16(x) | ||
433 | #define hweight8(x) generic_hweight8(x) | ||
434 | 406 | ||
435 | #endif /* __KERNEL__ */ | 407 | #endif /* __KERNEL__ */ |
436 | 408 | ||
409 | #include <asm-generic/bitops/fls64.h> | ||
410 | |||
437 | #ifdef __KERNEL__ | 411 | #ifdef __KERNEL__ |
438 | 412 | ||
439 | #define ext2_set_bit(nr,addr) \ | 413 | #include <asm-generic/bitops/ext2-non-atomic.h> |
440 | __test_and_set_bit((nr),(unsigned long*)addr) | 414 | |
441 | #define ext2_set_bit_atomic(lock,nr,addr) \ | 415 | #define ext2_set_bit_atomic(lock,nr,addr) \ |
442 | test_and_set_bit((nr),(unsigned long*)addr) | 416 | test_and_set_bit((nr),(unsigned long*)addr) |
443 | #define ext2_clear_bit(nr, addr) \ | ||
444 | __test_and_clear_bit((nr),(unsigned long*)addr) | ||
445 | #define ext2_clear_bit_atomic(lock,nr, addr) \ | 417 | #define ext2_clear_bit_atomic(lock,nr, addr) \ |
446 | test_and_clear_bit((nr),(unsigned long*)addr) | 418 | test_and_clear_bit((nr),(unsigned long*)addr) |
447 | #define ext2_test_bit(nr, addr) test_bit((nr),(unsigned long*)addr) | 419 | |
448 | #define ext2_find_first_zero_bit(addr, size) \ | 420 | #include <asm-generic/bitops/minix.h> |
449 | find_first_zero_bit((unsigned long*)addr, size) | ||
450 | #define ext2_find_next_zero_bit(addr, size, off) \ | ||
451 | find_next_zero_bit((unsigned long*)addr, size, off) | ||
452 | |||
453 | /* Bitmap functions for the minix filesystem. */ | ||
454 | #define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,(void*)addr) | ||
455 | #define minix_set_bit(nr,addr) __set_bit(nr,(void*)addr) | ||
456 | #define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit(nr,(void*)addr) | ||
457 | #define minix_test_bit(nr,addr) test_bit(nr,(void*)addr) | ||
458 | #define minix_find_first_zero_bit(addr,size) \ | ||
459 | find_first_zero_bit((void*)addr,size) | ||
460 | 421 | ||
461 | #endif /* __KERNEL__ */ | 422 | #endif /* __KERNEL__ */ |
462 | 423 | ||
diff --git a/include/asm-i386/dmi.h b/include/asm-i386/dmi.h new file mode 100644 index 000000000000..38d4eeb7fc7e --- /dev/null +++ b/include/asm-i386/dmi.h | |||
@@ -0,0 +1,11 @@ | |||
1 | #ifndef _ASM_DMI_H | ||
2 | #define _ASM_DMI_H 1 | ||
3 | |||
4 | #include <asm/io.h> | ||
5 | |||
6 | /* Use early IO mappings for DMI because it's initialized early */ | ||
7 | #define dmi_ioremap bt_ioremap | ||
8 | #define dmi_iounmap bt_iounmap | ||
9 | #define dmi_alloc alloc_bootmem | ||
10 | |||
11 | #endif | ||
diff --git a/include/asm-i386/futex.h b/include/asm-i386/futex.h index 44b9db806474..7b8ceefd010f 100644 --- a/include/asm-i386/futex.h +++ b/include/asm-i386/futex.h | |||
@@ -104,5 +104,32 @@ futex_atomic_op_inuser (int encoded_op, int __user *uaddr) | |||
104 | return ret; | 104 | return ret; |
105 | } | 105 | } |
106 | 106 | ||
107 | static inline int | ||
108 | futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) | ||
109 | { | ||
110 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) | ||
111 | return -EFAULT; | ||
112 | |||
113 | __asm__ __volatile__( | ||
114 | "1: " LOCK_PREFIX "cmpxchgl %3, %1 \n" | ||
115 | |||
116 | "2: .section .fixup, \"ax\" \n" | ||
117 | "3: mov %2, %0 \n" | ||
118 | " jmp 2b \n" | ||
119 | " .previous \n" | ||
120 | |||
121 | " .section __ex_table, \"a\" \n" | ||
122 | " .align 8 \n" | ||
123 | " .long 1b,3b \n" | ||
124 | " .previous \n" | ||
125 | |||
126 | : "=a" (oldval), "=m" (*uaddr) | ||
127 | : "i" (-EFAULT), "r" (newval), "0" (oldval) | ||
128 | : "memory" | ||
129 | ); | ||
130 | |||
131 | return oldval; | ||
132 | } | ||
133 | |||
107 | #endif | 134 | #endif |
108 | #endif | 135 | #endif |
diff --git a/include/asm-i386/kdebug.h b/include/asm-i386/kdebug.h index 316138e89910..96d0828ce096 100644 --- a/include/asm-i386/kdebug.h +++ b/include/asm-i386/kdebug.h | |||
@@ -17,11 +17,9 @@ struct die_args { | |||
17 | int signr; | 17 | int signr; |
18 | }; | 18 | }; |
19 | 19 | ||
20 | /* Note - you should never unregister because that can race with NMIs. | 20 | extern int register_die_notifier(struct notifier_block *); |
21 | If you really want to do it first unregister - then synchronize_sched - then free. | 21 | extern int unregister_die_notifier(struct notifier_block *); |
22 | */ | 22 | extern struct atomic_notifier_head i386die_chain; |
23 | int register_die_notifier(struct notifier_block *nb); | ||
24 | extern struct notifier_block *i386die_chain; | ||
25 | 23 | ||
26 | 24 | ||
27 | /* Grossly misnamed. */ | 25 | /* Grossly misnamed. */ |
@@ -51,7 +49,7 @@ static inline int notify_die(enum die_val val, const char *str, | |||
51 | .trapnr = trap, | 49 | .trapnr = trap, |
52 | .signr = sig | 50 | .signr = sig |
53 | }; | 51 | }; |
54 | return notifier_call_chain(&i386die_chain, val, &args); | 52 | return atomic_notifier_call_chain(&i386die_chain, val, &args); |
55 | } | 53 | } |
56 | 54 | ||
57 | #endif | 55 | #endif |
diff --git a/include/asm-i386/kprobes.h b/include/asm-i386/kprobes.h index a0d2d74a7dda..57d157c5cf89 100644 --- a/include/asm-i386/kprobes.h +++ b/include/asm-i386/kprobes.h | |||
@@ -34,6 +34,7 @@ struct pt_regs; | |||
34 | 34 | ||
35 | typedef u8 kprobe_opcode_t; | 35 | typedef u8 kprobe_opcode_t; |
36 | #define BREAKPOINT_INSTRUCTION 0xcc | 36 | #define BREAKPOINT_INSTRUCTION 0xcc |
37 | #define RELATIVEJUMP_INSTRUCTION 0xe9 | ||
37 | #define MAX_INSN_SIZE 16 | 38 | #define MAX_INSN_SIZE 16 |
38 | #define MAX_STACK_SIZE 64 | 39 | #define MAX_STACK_SIZE 64 |
39 | #define MIN_STACK_SIZE(ADDR) (((MAX_STACK_SIZE) < \ | 40 | #define MIN_STACK_SIZE(ADDR) (((MAX_STACK_SIZE) < \ |
@@ -51,6 +52,11 @@ void kretprobe_trampoline(void); | |||
51 | struct arch_specific_insn { | 52 | struct arch_specific_insn { |
52 | /* copy of the original instruction */ | 53 | /* copy of the original instruction */ |
53 | kprobe_opcode_t *insn; | 54 | kprobe_opcode_t *insn; |
55 | /* | ||
56 | * If this flag is not 0, this kprobe can be boost when its | ||
57 | * post_handler and break_handler is not set. | ||
58 | */ | ||
59 | int boostable; | ||
54 | }; | 60 | }; |
55 | 61 | ||
56 | struct prev_kprobe { | 62 | struct prev_kprobe { |
diff --git a/include/asm-i386/mach-default/mach_time.h b/include/asm-i386/mach-default/mach_time.h index b749aa44a86f..31eb5de6f3dc 100644 --- a/include/asm-i386/mach-default/mach_time.h +++ b/include/asm-i386/mach-default/mach_time.h | |||
@@ -82,21 +82,8 @@ static inline int mach_set_rtc_mmss(unsigned long nowtime) | |||
82 | static inline unsigned long mach_get_cmos_time(void) | 82 | static inline unsigned long mach_get_cmos_time(void) |
83 | { | 83 | { |
84 | unsigned int year, mon, day, hour, min, sec; | 84 | unsigned int year, mon, day, hour, min, sec; |
85 | int i; | ||
86 | 85 | ||
87 | /* The Linux interpretation of the CMOS clock register contents: | 86 | do { |
88 | * When the Update-In-Progress (UIP) flag goes from 1 to 0, the | ||
89 | * RTC registers show the second which has precisely just started. | ||
90 | * Let's hope other operating systems interpret the RTC the same way. | ||
91 | */ | ||
92 | /* read RTC exactly on falling edge of update flag */ | ||
93 | for (i = 0 ; i < 1000000 ; i++) /* may take up to 1 second... */ | ||
94 | if (CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP) | ||
95 | break; | ||
96 | for (i = 0 ; i < 1000000 ; i++) /* must try at least 2.228 ms */ | ||
97 | if (!(CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP)) | ||
98 | break; | ||
99 | do { /* Isn't this overkill ? UIP above should guarantee consistency */ | ||
100 | sec = CMOS_READ(RTC_SECONDS); | 87 | sec = CMOS_READ(RTC_SECONDS); |
101 | min = CMOS_READ(RTC_MINUTES); | 88 | min = CMOS_READ(RTC_MINUTES); |
102 | hour = CMOS_READ(RTC_HOURS); | 89 | hour = CMOS_READ(RTC_HOURS); |
@@ -104,16 +91,18 @@ static inline unsigned long mach_get_cmos_time(void) | |||
104 | mon = CMOS_READ(RTC_MONTH); | 91 | mon = CMOS_READ(RTC_MONTH); |
105 | year = CMOS_READ(RTC_YEAR); | 92 | year = CMOS_READ(RTC_YEAR); |
106 | } while (sec != CMOS_READ(RTC_SECONDS)); | 93 | } while (sec != CMOS_READ(RTC_SECONDS)); |
107 | if (!(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY) || RTC_ALWAYS_BCD) | 94 | |
108 | { | 95 | if (!(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY) || RTC_ALWAYS_BCD) { |
109 | BCD_TO_BIN(sec); | 96 | BCD_TO_BIN(sec); |
110 | BCD_TO_BIN(min); | 97 | BCD_TO_BIN(min); |
111 | BCD_TO_BIN(hour); | 98 | BCD_TO_BIN(hour); |
112 | BCD_TO_BIN(day); | 99 | BCD_TO_BIN(day); |
113 | BCD_TO_BIN(mon); | 100 | BCD_TO_BIN(mon); |
114 | BCD_TO_BIN(year); | 101 | BCD_TO_BIN(year); |
115 | } | 102 | } |
116 | if ((year += 1900) < 1970) | 103 | |
104 | year += 1900; | ||
105 | if (year < 1970) | ||
117 | year += 100; | 106 | year += 100; |
118 | 107 | ||
119 | return mktime(year, mon, day, hour, min, sec); | 108 | return mktime(year, mon, day, hour, min, sec); |
diff --git a/include/asm-i386/mmzone.h b/include/asm-i386/mmzone.h index 74f595d80579..e33e9f9e4c66 100644 --- a/include/asm-i386/mmzone.h +++ b/include/asm-i386/mmzone.h | |||
@@ -70,8 +70,6 @@ static inline int pfn_to_nid(unsigned long pfn) | |||
70 | #endif | 70 | #endif |
71 | } | 71 | } |
72 | 72 | ||
73 | #define node_localnr(pfn, nid) ((pfn) - node_data[nid]->node_start_pfn) | ||
74 | |||
75 | /* | 73 | /* |
76 | * Following are macros that each numa implmentation must define. | 74 | * Following are macros that each numa implmentation must define. |
77 | */ | 75 | */ |
@@ -86,21 +84,6 @@ static inline int pfn_to_nid(unsigned long pfn) | |||
86 | /* XXX: FIXME -- wli */ | 84 | /* XXX: FIXME -- wli */ |
87 | #define kern_addr_valid(kaddr) (0) | 85 | #define kern_addr_valid(kaddr) (0) |
88 | 86 | ||
89 | #define pfn_to_page(pfn) \ | ||
90 | ({ \ | ||
91 | unsigned long __pfn = pfn; \ | ||
92 | int __node = pfn_to_nid(__pfn); \ | ||
93 | &NODE_DATA(__node)->node_mem_map[node_localnr(__pfn,__node)]; \ | ||
94 | }) | ||
95 | |||
96 | #define page_to_pfn(pg) \ | ||
97 | ({ \ | ||
98 | struct page *__page = pg; \ | ||
99 | struct zone *__zone = page_zone(__page); \ | ||
100 | (unsigned long)(__page - __zone->zone_mem_map) \ | ||
101 | + __zone->zone_start_pfn; \ | ||
102 | }) | ||
103 | |||
104 | #ifdef CONFIG_X86_NUMAQ /* we have contiguous memory on NUMA-Q */ | 87 | #ifdef CONFIG_X86_NUMAQ /* we have contiguous memory on NUMA-Q */ |
105 | #define pfn_valid(pfn) ((pfn) < num_physpages) | 88 | #define pfn_valid(pfn) ((pfn) < num_physpages) |
106 | #else | 89 | #else |
diff --git a/include/asm-i386/page.h b/include/asm-i386/page.h index 997ca5d17876..30f52a2263ba 100644 --- a/include/asm-i386/page.h +++ b/include/asm-i386/page.h | |||
@@ -126,8 +126,6 @@ extern int page_is_ram(unsigned long pagenr); | |||
126 | #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) | 126 | #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) |
127 | #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) | 127 | #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) |
128 | #ifdef CONFIG_FLATMEM | 128 | #ifdef CONFIG_FLATMEM |
129 | #define pfn_to_page(pfn) (mem_map + (pfn)) | ||
130 | #define page_to_pfn(page) ((unsigned long)((page) - mem_map)) | ||
131 | #define pfn_valid(pfn) ((pfn) < max_mapnr) | 129 | #define pfn_valid(pfn) ((pfn) < max_mapnr) |
132 | #endif /* CONFIG_FLATMEM */ | 130 | #endif /* CONFIG_FLATMEM */ |
133 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) | 131 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) |
@@ -141,6 +139,7 @@ extern int page_is_ram(unsigned long pagenr); | |||
141 | 139 | ||
142 | #endif /* __KERNEL__ */ | 140 | #endif /* __KERNEL__ */ |
143 | 141 | ||
142 | #include <asm-generic/memory_model.h> | ||
144 | #include <asm-generic/page.h> | 143 | #include <asm-generic/page.h> |
145 | 144 | ||
146 | #endif /* _I386_PAGE_H */ | 145 | #endif /* _I386_PAGE_H */ |
diff --git a/include/asm-i386/poll.h b/include/asm-i386/poll.h index aecc80a15d36..2cd4929abd40 100644 --- a/include/asm-i386/poll.h +++ b/include/asm-i386/poll.h | |||
@@ -16,6 +16,7 @@ | |||
16 | #define POLLWRBAND 0x0200 | 16 | #define POLLWRBAND 0x0200 |
17 | #define POLLMSG 0x0400 | 17 | #define POLLMSG 0x0400 |
18 | #define POLLREMOVE 0x1000 | 18 | #define POLLREMOVE 0x1000 |
19 | #define POLLRDHUP 0x2000 | ||
19 | 20 | ||
20 | struct pollfd { | 21 | struct pollfd { |
21 | int fd; | 22 | int fd; |
diff --git a/include/asm-i386/processor.h b/include/asm-i386/processor.h index feca5d961e2b..805f0dcda468 100644 --- a/include/asm-i386/processor.h +++ b/include/asm-i386/processor.h | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/config.h> | 20 | #include <linux/config.h> |
21 | #include <linux/threads.h> | 21 | #include <linux/threads.h> |
22 | #include <asm/percpu.h> | 22 | #include <asm/percpu.h> |
23 | #include <linux/cpumask.h> | ||
23 | 24 | ||
24 | /* flag for disabling the tsc */ | 25 | /* flag for disabling the tsc */ |
25 | extern int tsc_disable; | 26 | extern int tsc_disable; |
@@ -67,6 +68,9 @@ struct cpuinfo_x86 { | |||
67 | char pad0; | 68 | char pad0; |
68 | int x86_power; | 69 | int x86_power; |
69 | unsigned long loops_per_jiffy; | 70 | unsigned long loops_per_jiffy; |
71 | #ifdef CONFIG_SMP | ||
72 | cpumask_t llc_shared_map; /* cpus sharing the last level cache */ | ||
73 | #endif | ||
70 | unsigned char x86_max_cores; /* cpuid returned max cores value */ | 74 | unsigned char x86_max_cores; /* cpuid returned max cores value */ |
71 | unsigned char booted_cores; /* number of cores as seen by OS */ | 75 | unsigned char booted_cores; /* number of cores as seen by OS */ |
72 | unsigned char apicid; | 76 | unsigned char apicid; |
@@ -103,6 +107,7 @@ extern struct cpuinfo_x86 cpu_data[]; | |||
103 | 107 | ||
104 | extern int phys_proc_id[NR_CPUS]; | 108 | extern int phys_proc_id[NR_CPUS]; |
105 | extern int cpu_core_id[NR_CPUS]; | 109 | extern int cpu_core_id[NR_CPUS]; |
110 | extern int cpu_llc_id[NR_CPUS]; | ||
106 | extern char ignore_fpu_irq; | 111 | extern char ignore_fpu_irq; |
107 | 112 | ||
108 | extern void identify_cpu(struct cpuinfo_x86 *); | 113 | extern void identify_cpu(struct cpuinfo_x86 *); |
@@ -616,8 +621,6 @@ struct extended_sigtable { | |||
616 | unsigned int reserved[3]; | 621 | unsigned int reserved[3]; |
617 | struct extended_signature sigs[0]; | 622 | struct extended_signature sigs[0]; |
618 | }; | 623 | }; |
619 | /* '6' because it used to be for P6 only (but now covers Pentium 4 as well) */ | ||
620 | #define MICROCODE_IOCFREE _IO('6',0) | ||
621 | 624 | ||
622 | /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ | 625 | /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ |
623 | static inline void rep_nop(void) | 626 | static inline void rep_nop(void) |
diff --git a/include/asm-i386/setup.h b/include/asm-i386/setup.h index 826a8ca50ac8..ee941457b55d 100644 --- a/include/asm-i386/setup.h +++ b/include/asm-i386/setup.h | |||
@@ -6,9 +6,7 @@ | |||
6 | #ifndef _i386_SETUP_H | 6 | #ifndef _i386_SETUP_H |
7 | #define _i386_SETUP_H | 7 | #define _i386_SETUP_H |
8 | 8 | ||
9 | #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) | 9 | #include <linux/pfn.h> |
10 | #define PFN_DOWN(x) ((x) >> PAGE_SHIFT) | ||
11 | #define PFN_PHYS(x) ((x) << PAGE_SHIFT) | ||
12 | 10 | ||
13 | /* | 11 | /* |
14 | * Reserved space for vmalloc and iomap - defined in asm/page.h | 12 | * Reserved space for vmalloc and iomap - defined in asm/page.h |
diff --git a/include/asm-i386/stat.h b/include/asm-i386/stat.h index b464f8020ec4..67eae78323ba 100644 --- a/include/asm-i386/stat.h +++ b/include/asm-i386/stat.h | |||
@@ -58,8 +58,7 @@ struct stat64 { | |||
58 | long long st_size; | 58 | long long st_size; |
59 | unsigned long st_blksize; | 59 | unsigned long st_blksize; |
60 | 60 | ||
61 | unsigned long st_blocks; /* Number 512-byte blocks allocated. */ | 61 | unsigned long long st_blocks; /* Number 512-byte blocks allocated. */ |
62 | unsigned long __pad4; /* future possible st_blocks high bits */ | ||
63 | 62 | ||
64 | unsigned long st_atime; | 63 | unsigned long st_atime; |
65 | unsigned long st_atime_nsec; | 64 | unsigned long st_atime_nsec; |
diff --git a/include/asm-i386/topology.h b/include/asm-i386/topology.h index aa958c6ee83e..b94e5eeef917 100644 --- a/include/asm-i386/topology.h +++ b/include/asm-i386/topology.h | |||
@@ -112,4 +112,6 @@ extern unsigned long node_remap_size[]; | |||
112 | 112 | ||
113 | #endif /* CONFIG_NUMA */ | 113 | #endif /* CONFIG_NUMA */ |
114 | 114 | ||
115 | extern cpumask_t cpu_coregroup_map(int cpu); | ||
116 | |||
115 | #endif /* _ASM_I386_TOPOLOGY_H */ | 117 | #endif /* _ASM_I386_TOPOLOGY_H */ |
diff --git a/include/asm-i386/types.h b/include/asm-i386/types.h index ced00fe8fe61..e50a08bd7ced 100644 --- a/include/asm-i386/types.h +++ b/include/asm-i386/types.h | |||
@@ -63,6 +63,11 @@ typedef u64 sector_t; | |||
63 | #define HAVE_SECTOR_T | 63 | #define HAVE_SECTOR_T |
64 | #endif | 64 | #endif |
65 | 65 | ||
66 | #ifdef CONFIG_LSF | ||
67 | typedef u64 blkcnt_t; | ||
68 | #define HAVE_BLKCNT_T | ||
69 | #endif | ||
70 | |||
66 | #endif /* __ASSEMBLY__ */ | 71 | #endif /* __ASSEMBLY__ */ |
67 | 72 | ||
68 | #endif /* __KERNEL__ */ | 73 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-i386/unistd.h b/include/asm-i386/unistd.h index d8afd0e3b81a..014e3562895b 100644 --- a/include/asm-i386/unistd.h +++ b/include/asm-i386/unistd.h | |||
@@ -316,8 +316,10 @@ | |||
316 | #define __NR_pselect6 308 | 316 | #define __NR_pselect6 308 |
317 | #define __NR_ppoll 309 | 317 | #define __NR_ppoll 309 |
318 | #define __NR_unshare 310 | 318 | #define __NR_unshare 310 |
319 | #define __NR_set_robust_list 311 | ||
320 | #define __NR_get_robust_list 312 | ||
319 | 321 | ||
320 | #define NR_syscalls 311 | 322 | #define NR_syscalls 313 |
321 | 323 | ||
322 | /* | 324 | /* |
323 | * user-visible error numbers are in the range -1 - -128: see | 325 | * user-visible error numbers are in the range -1 - -128: see |
diff --git a/include/asm-ia64/acpi.h b/include/asm-ia64/acpi.h index f7a517654308..d734585a23cf 100644 --- a/include/asm-ia64/acpi.h +++ b/include/asm-ia64/acpi.h | |||
@@ -111,7 +111,11 @@ extern int additional_cpus; | |||
111 | 111 | ||
112 | #ifdef CONFIG_ACPI_NUMA | 112 | #ifdef CONFIG_ACPI_NUMA |
113 | /* Proximity bitmap length; _PXM is at most 255 (8 bit)*/ | 113 | /* Proximity bitmap length; _PXM is at most 255 (8 bit)*/ |
114 | #ifdef CONFIG_IA64_NR_NODES | ||
115 | #define MAX_PXM_DOMAINS CONFIG_IA64_NR_NODES | ||
116 | #else | ||
114 | #define MAX_PXM_DOMAINS (256) | 117 | #define MAX_PXM_DOMAINS (256) |
118 | #endif | ||
115 | extern int __devinitdata pxm_to_nid_map[MAX_PXM_DOMAINS]; | 119 | extern int __devinitdata pxm_to_nid_map[MAX_PXM_DOMAINS]; |
116 | extern int __initdata nid_to_pxm_map[MAX_NUMNODES]; | 120 | extern int __initdata nid_to_pxm_map[MAX_NUMNODES]; |
117 | #endif | 121 | #endif |
diff --git a/include/asm-ia64/asmmacro.h b/include/asm-ia64/asmmacro.h index 77af457f4ad7..d4cec32083d8 100644 --- a/include/asm-ia64/asmmacro.h +++ b/include/asm-ia64/asmmacro.h | |||
@@ -51,6 +51,17 @@ name: | |||
51 | [99:] x | 51 | [99:] x |
52 | 52 | ||
53 | /* | 53 | /* |
54 | * Tag MCA recoverable instruction ranges. | ||
55 | */ | ||
56 | |||
57 | .section "__mca_table", "a" // declare section & section attributes | ||
58 | .previous | ||
59 | |||
60 | # define MCA_RECOVER_RANGE(y) \ | ||
61 | .xdata4 "__mca_table", y-., 99f-.; \ | ||
62 | [99:] | ||
63 | |||
64 | /* | ||
54 | * Mark instructions that need a load of a virtual address patched to be | 65 | * Mark instructions that need a load of a virtual address patched to be |
55 | * a load of a physical address. We use this either in critical performance | 66 | * a load of a physical address. We use this either in critical performance |
56 | * path (ivt.S - TLB miss processing) or in places where it might not be | 67 | * path (ivt.S - TLB miss processing) or in places where it might not be |
diff --git a/include/asm-ia64/bitops.h b/include/asm-ia64/bitops.h index 36d0fb95ea89..90921e162793 100644 --- a/include/asm-ia64/bitops.h +++ b/include/asm-ia64/bitops.h | |||
@@ -5,8 +5,8 @@ | |||
5 | * Copyright (C) 1998-2003 Hewlett-Packard Co | 5 | * Copyright (C) 1998-2003 Hewlett-Packard Co |
6 | * David Mosberger-Tang <davidm@hpl.hp.com> | 6 | * David Mosberger-Tang <davidm@hpl.hp.com> |
7 | * | 7 | * |
8 | * 02/06/02 find_next_bit() and find_first_bit() added from Erich Focht's ia64 O(1) | 8 | * 02/06/02 find_next_bit() and find_first_bit() added from Erich Focht's ia64 |
9 | * scheduler patch | 9 | * O(1) scheduler patch |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/compiler.h> | 12 | #include <linux/compiler.h> |
@@ -25,9 +25,9 @@ | |||
25 | * restricted to acting on a single-word quantity. | 25 | * restricted to acting on a single-word quantity. |
26 | * | 26 | * |
27 | * The address must be (at least) "long" aligned. | 27 | * The address must be (at least) "long" aligned. |
28 | * Note that there are driver (e.g., eepro100) which use these operations to operate on | 28 | * Note that there are driver (e.g., eepro100) which use these operations to |
29 | * hw-defined data-structures, so we can't easily change these operations to force a | 29 | * operate on hw-defined data-structures, so we can't easily change these |
30 | * bigger alignment. | 30 | * operations to force a bigger alignment. |
31 | * | 31 | * |
32 | * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1). | 32 | * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1). |
33 | */ | 33 | */ |
@@ -284,8 +284,8 @@ test_bit (int nr, const volatile void *addr) | |||
284 | * ffz - find the first zero bit in a long word | 284 | * ffz - find the first zero bit in a long word |
285 | * @x: The long word to find the bit in | 285 | * @x: The long word to find the bit in |
286 | * | 286 | * |
287 | * Returns the bit-number (0..63) of the first (least significant) zero bit. Undefined if | 287 | * Returns the bit-number (0..63) of the first (least significant) zero bit. |
288 | * no zero exists, so code should check against ~0UL first... | 288 | * Undefined if no zero exists, so code should check against ~0UL first... |
289 | */ | 289 | */ |
290 | static inline unsigned long | 290 | static inline unsigned long |
291 | ffz (unsigned long x) | 291 | ffz (unsigned long x) |
@@ -345,13 +345,14 @@ fls (int t) | |||
345 | x |= x >> 16; | 345 | x |= x >> 16; |
346 | return ia64_popcnt(x); | 346 | return ia64_popcnt(x); |
347 | } | 347 | } |
348 | #define fls64(x) generic_fls64(x) | 348 | |
349 | #include <asm-generic/bitops/fls64.h> | ||
349 | 350 | ||
350 | /* | 351 | /* |
351 | * ffs: find first bit set. This is defined the same way as the libc and compiler builtin | 352 | * ffs: find first bit set. This is defined the same way as the libc and |
352 | * ffs routines, therefore differs in spirit from the above ffz (man ffs): it operates on | 353 | * compiler builtin ffs routines, therefore differs in spirit from the above |
353 | * "int" values only and the result value is the bit number + 1. ffs(0) is defined to | 354 | * ffz (man ffs): it operates on "int" values only and the result value is the |
354 | * return zero. | 355 | * bit number + 1. ffs(0) is defined to return zero. |
355 | */ | 356 | */ |
356 | #define ffs(x) __builtin_ffs(x) | 357 | #define ffs(x) __builtin_ffs(x) |
357 | 358 | ||
@@ -373,51 +374,17 @@ hweight64 (unsigned long x) | |||
373 | 374 | ||
374 | #endif /* __KERNEL__ */ | 375 | #endif /* __KERNEL__ */ |
375 | 376 | ||
376 | extern int __find_next_zero_bit (const void *addr, unsigned long size, | 377 | #include <asm-generic/bitops/find.h> |
377 | unsigned long offset); | ||
378 | extern int __find_next_bit(const void *addr, unsigned long size, | ||
379 | unsigned long offset); | ||
380 | |||
381 | #define find_next_zero_bit(addr, size, offset) \ | ||
382 | __find_next_zero_bit((addr), (size), (offset)) | ||
383 | #define find_next_bit(addr, size, offset) \ | ||
384 | __find_next_bit((addr), (size), (offset)) | ||
385 | |||
386 | /* | ||
387 | * The optimizer actually does good code for this case.. | ||
388 | */ | ||
389 | #define find_first_zero_bit(addr, size) find_next_zero_bit((addr), (size), 0) | ||
390 | |||
391 | #define find_first_bit(addr, size) find_next_bit((addr), (size), 0) | ||
392 | 378 | ||
393 | #ifdef __KERNEL__ | 379 | #ifdef __KERNEL__ |
394 | 380 | ||
395 | #define __clear_bit(nr, addr) clear_bit(nr, addr) | 381 | #include <asm-generic/bitops/ext2-non-atomic.h> |
396 | 382 | ||
397 | #define ext2_set_bit test_and_set_bit | ||
398 | #define ext2_set_bit_atomic(l,n,a) test_and_set_bit(n,a) | 383 | #define ext2_set_bit_atomic(l,n,a) test_and_set_bit(n,a) |
399 | #define ext2_clear_bit test_and_clear_bit | ||
400 | #define ext2_clear_bit_atomic(l,n,a) test_and_clear_bit(n,a) | 384 | #define ext2_clear_bit_atomic(l,n,a) test_and_clear_bit(n,a) |
401 | #define ext2_test_bit test_bit | ||
402 | #define ext2_find_first_zero_bit find_first_zero_bit | ||
403 | #define ext2_find_next_zero_bit find_next_zero_bit | ||
404 | |||
405 | /* Bitmap functions for the minix filesystem. */ | ||
406 | #define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr) | ||
407 | #define minix_set_bit(nr,addr) set_bit(nr,addr) | ||
408 | #define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr) | ||
409 | #define minix_test_bit(nr,addr) test_bit(nr,addr) | ||
410 | #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) | ||
411 | 385 | ||
412 | static inline int | 386 | #include <asm-generic/bitops/minix.h> |
413 | sched_find_first_bit (unsigned long *b) | 387 | #include <asm-generic/bitops/sched.h> |
414 | { | ||
415 | if (unlikely(b[0])) | ||
416 | return __ffs(b[0]); | ||
417 | if (unlikely(b[1])) | ||
418 | return 64 + __ffs(b[1]); | ||
419 | return __ffs(b[2]) + 128; | ||
420 | } | ||
421 | 388 | ||
422 | #endif /* __KERNEL__ */ | 389 | #endif /* __KERNEL__ */ |
423 | 390 | ||
diff --git a/include/asm-ia64/compat.h b/include/asm-ia64/compat.h index c0b19106665c..40d01d80610d 100644 --- a/include/asm-ia64/compat.h +++ b/include/asm-ia64/compat.h | |||
@@ -189,6 +189,12 @@ compat_ptr (compat_uptr_t uptr) | |||
189 | return (void __user *) (unsigned long) uptr; | 189 | return (void __user *) (unsigned long) uptr; |
190 | } | 190 | } |
191 | 191 | ||
192 | static inline compat_uptr_t | ||
193 | ptr_to_compat(void __user *uptr) | ||
194 | { | ||
195 | return (u32)(unsigned long)uptr; | ||
196 | } | ||
197 | |||
192 | static __inline__ void __user * | 198 | static __inline__ void __user * |
193 | compat_alloc_user_space (long len) | 199 | compat_alloc_user_space (long len) |
194 | { | 200 | { |
diff --git a/include/asm-ia64/dmi.h b/include/asm-ia64/dmi.h new file mode 100644 index 000000000000..f3efaa229525 --- /dev/null +++ b/include/asm-ia64/dmi.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef _ASM_DMI_H | ||
2 | #define _ASM_DMI_H 1 | ||
3 | |||
4 | #include <asm/io.h> | ||
5 | |||
6 | #endif | ||
diff --git a/include/asm-ia64/io.h b/include/asm-ia64/io.h index b64fdb985494..c2e3742108bb 100644 --- a/include/asm-ia64/io.h +++ b/include/asm-ia64/io.h | |||
@@ -88,8 +88,8 @@ phys_to_virt (unsigned long address) | |||
88 | } | 88 | } |
89 | 89 | ||
90 | #define ARCH_HAS_VALID_PHYS_ADDR_RANGE | 90 | #define ARCH_HAS_VALID_PHYS_ADDR_RANGE |
91 | extern int valid_phys_addr_range (unsigned long addr, size_t *count); /* efi.c */ | 91 | extern int valid_phys_addr_range (unsigned long addr, size_t count); /* efi.c */ |
92 | extern int valid_mmap_phys_addr_range (unsigned long addr, size_t *count); | 92 | extern int valid_mmap_phys_addr_range (unsigned long addr, size_t count); |
93 | 93 | ||
94 | /* | 94 | /* |
95 | * The following two macros are deprecated and scheduled for removal. | 95 | * The following two macros are deprecated and scheduled for removal. |
@@ -416,24 +416,18 @@ __writeq (unsigned long val, volatile void __iomem *addr) | |||
416 | # define outl_p outl | 416 | # define outl_p outl |
417 | #endif | 417 | #endif |
418 | 418 | ||
419 | /* | 419 | extern void __iomem * ioremap(unsigned long offset, unsigned long size); |
420 | * An "address" in IO memory space is not clearly either an integer or a pointer. We will | 420 | extern void __iomem * ioremap_nocache (unsigned long offset, unsigned long size); |
421 | * accept both, thus the casts. | ||
422 | * | ||
423 | * On ia-64, we access the physical I/O memory space through the uncached kernel region. | ||
424 | */ | ||
425 | static inline void __iomem * | ||
426 | ioremap (unsigned long offset, unsigned long size) | ||
427 | { | ||
428 | return (void __iomem *) (__IA64_UNCACHED_OFFSET | (offset)); | ||
429 | } | ||
430 | 421 | ||
431 | static inline void | 422 | static inline void |
432 | iounmap (volatile void __iomem *addr) | 423 | iounmap (volatile void __iomem *addr) |
433 | { | 424 | { |
434 | } | 425 | } |
435 | 426 | ||
436 | #define ioremap_nocache(o,s) ioremap(o,s) | 427 | /* Use normal IO mappings for DMI */ |
428 | #define dmi_ioremap ioremap | ||
429 | #define dmi_iounmap(x,l) iounmap(x) | ||
430 | #define dmi_alloc(l) kmalloc(l, GFP_ATOMIC) | ||
437 | 431 | ||
438 | # ifdef __KERNEL__ | 432 | # ifdef __KERNEL__ |
439 | 433 | ||
diff --git a/include/asm-ia64/kdebug.h b/include/asm-ia64/kdebug.h index 8b01a083dde6..218c458ab60c 100644 --- a/include/asm-ia64/kdebug.h +++ b/include/asm-ia64/kdebug.h | |||
@@ -40,7 +40,7 @@ struct die_args { | |||
40 | 40 | ||
41 | extern int register_die_notifier(struct notifier_block *); | 41 | extern int register_die_notifier(struct notifier_block *); |
42 | extern int unregister_die_notifier(struct notifier_block *); | 42 | extern int unregister_die_notifier(struct notifier_block *); |
43 | extern struct notifier_block *ia64die_chain; | 43 | extern struct atomic_notifier_head ia64die_chain; |
44 | 44 | ||
45 | enum die_val { | 45 | enum die_val { |
46 | DIE_BREAK = 1, | 46 | DIE_BREAK = 1, |
@@ -81,7 +81,7 @@ static inline int notify_die(enum die_val val, char *str, struct pt_regs *regs, | |||
81 | .signr = sig | 81 | .signr = sig |
82 | }; | 82 | }; |
83 | 83 | ||
84 | return notifier_call_chain(&ia64die_chain, val, &args); | 84 | return atomic_notifier_call_chain(&ia64die_chain, val, &args); |
85 | } | 85 | } |
86 | 86 | ||
87 | #endif | 87 | #endif |
diff --git a/include/asm-ia64/machvec_dig.h b/include/asm-ia64/machvec_dig.h index 4dc8522c974f..8a0752f40987 100644 --- a/include/asm-ia64/machvec_dig.h +++ b/include/asm-ia64/machvec_dig.h | |||
@@ -2,7 +2,6 @@ | |||
2 | #define _ASM_IA64_MACHVEC_DIG_h | 2 | #define _ASM_IA64_MACHVEC_DIG_h |
3 | 3 | ||
4 | extern ia64_mv_setup_t dig_setup; | 4 | extern ia64_mv_setup_t dig_setup; |
5 | extern ia64_mv_irq_init_t dig_irq_init; | ||
6 | 5 | ||
7 | /* | 6 | /* |
8 | * This stuff has dual use! | 7 | * This stuff has dual use! |
@@ -13,6 +12,5 @@ extern ia64_mv_irq_init_t dig_irq_init; | |||
13 | */ | 12 | */ |
14 | #define platform_name "dig" | 13 | #define platform_name "dig" |
15 | #define platform_setup dig_setup | 14 | #define platform_setup dig_setup |
16 | #define platform_irq_init dig_irq_init | ||
17 | 15 | ||
18 | #endif /* _ASM_IA64_MACHVEC_DIG_h */ | 16 | #endif /* _ASM_IA64_MACHVEC_DIG_h */ |
diff --git a/include/asm-ia64/numa.h b/include/asm-ia64/numa.h index 3ae128fe0823..dae6aeb7b119 100644 --- a/include/asm-ia64/numa.h +++ b/include/asm-ia64/numa.h | |||
@@ -23,7 +23,7 @@ | |||
23 | 23 | ||
24 | #include <asm/mmzone.h> | 24 | #include <asm/mmzone.h> |
25 | 25 | ||
26 | extern u8 cpu_to_node_map[NR_CPUS] __cacheline_aligned; | 26 | extern u16 cpu_to_node_map[NR_CPUS] __cacheline_aligned; |
27 | extern cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned; | 27 | extern cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned; |
28 | 28 | ||
29 | /* Stuff below this line could be architecture independent */ | 29 | /* Stuff below this line could be architecture independent */ |
diff --git a/include/asm-ia64/numnodes.h b/include/asm-ia64/numnodes.h index 21cff4da5485..e9d356f549d9 100644 --- a/include/asm-ia64/numnodes.h +++ b/include/asm-ia64/numnodes.h | |||
@@ -3,13 +3,18 @@ | |||
3 | 3 | ||
4 | #ifdef CONFIG_IA64_DIG | 4 | #ifdef CONFIG_IA64_DIG |
5 | /* Max 8 Nodes */ | 5 | /* Max 8 Nodes */ |
6 | #define NODES_SHIFT 3 | 6 | # define NODES_SHIFT 3 |
7 | #elif defined(CONFIG_IA64_HP_ZX1) || defined(CONFIG_IA64_HP_ZX1_SWIOTLB) | 7 | #elif defined(CONFIG_IA64_HP_ZX1) || defined(CONFIG_IA64_HP_ZX1_SWIOTLB) |
8 | /* Max 32 Nodes */ | 8 | /* Max 32 Nodes */ |
9 | #define NODES_SHIFT 5 | 9 | # define NODES_SHIFT 5 |
10 | #elif defined(CONFIG_IA64_SGI_SN2) || defined(CONFIG_IA64_GENERIC) | 10 | #elif defined(CONFIG_IA64_SGI_SN2) || defined(CONFIG_IA64_GENERIC) |
11 | /* Max 256 Nodes */ | 11 | # if CONFIG_IA64_NR_NODES == 256 |
12 | #define NODES_SHIFT 8 | 12 | # define NODES_SHIFT 8 |
13 | # elif CONFIG_IA64_NR_NODES <= 512 | ||
14 | # define NODES_SHIFT 9 | ||
15 | # elif CONFIG_IA64_NR_NODES <= 1024 | ||
16 | # define NODES_SHIFT 10 | ||
17 | # endif | ||
13 | #endif | 18 | #endif |
14 | 19 | ||
15 | #endif /* _ASM_MAX_NUMNODES_H */ | 20 | #endif /* _ASM_MAX_NUMNODES_H */ |
diff --git a/include/asm-ia64/page.h b/include/asm-ia64/page.h index 3ab27333dae4..2087825eefa4 100644 --- a/include/asm-ia64/page.h +++ b/include/asm-ia64/page.h | |||
@@ -106,17 +106,25 @@ extern int ia64_pfn_valid (unsigned long pfn); | |||
106 | # define ia64_pfn_valid(pfn) 1 | 106 | # define ia64_pfn_valid(pfn) 1 |
107 | #endif | 107 | #endif |
108 | 108 | ||
109 | #ifdef CONFIG_VIRTUAL_MEM_MAP | ||
110 | extern struct page *vmem_map; | ||
111 | #ifdef CONFIG_DISCONTIGMEM | ||
112 | # define page_to_pfn(page) ((unsigned long) (page - vmem_map)) | ||
113 | # define pfn_to_page(pfn) (vmem_map + (pfn)) | ||
114 | #endif | ||
115 | #endif | ||
116 | |||
117 | #if defined(CONFIG_FLATMEM) || defined(CONFIG_SPARSEMEM) | ||
118 | /* FLATMEM always configures mem_map (mem_map = vmem_map if necessary) */ | ||
119 | #include <asm-generic/memory_model.h> | ||
120 | #endif | ||
121 | |||
109 | #ifdef CONFIG_FLATMEM | 122 | #ifdef CONFIG_FLATMEM |
110 | # define pfn_valid(pfn) (((pfn) < max_mapnr) && ia64_pfn_valid(pfn)) | 123 | # define pfn_valid(pfn) (((pfn) < max_mapnr) && ia64_pfn_valid(pfn)) |
111 | # define page_to_pfn(page) ((unsigned long) (page - mem_map)) | ||
112 | # define pfn_to_page(pfn) (mem_map + (pfn)) | ||
113 | #elif defined(CONFIG_DISCONTIGMEM) | 124 | #elif defined(CONFIG_DISCONTIGMEM) |
114 | extern struct page *vmem_map; | ||
115 | extern unsigned long min_low_pfn; | 125 | extern unsigned long min_low_pfn; |
116 | extern unsigned long max_low_pfn; | 126 | extern unsigned long max_low_pfn; |
117 | # define pfn_valid(pfn) (((pfn) >= min_low_pfn) && ((pfn) < max_low_pfn) && ia64_pfn_valid(pfn)) | 127 | # define pfn_valid(pfn) (((pfn) >= min_low_pfn) && ((pfn) < max_low_pfn) && ia64_pfn_valid(pfn)) |
118 | # define page_to_pfn(page) ((unsigned long) (page - vmem_map)) | ||
119 | # define pfn_to_page(pfn) (vmem_map + (pfn)) | ||
120 | #endif | 128 | #endif |
121 | 129 | ||
122 | #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) | 130 | #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) |
@@ -149,7 +157,7 @@ typedef union ia64_va { | |||
149 | | (REGION_OFFSET(x) >> (HPAGE_SHIFT-PAGE_SHIFT))) | 157 | | (REGION_OFFSET(x) >> (HPAGE_SHIFT-PAGE_SHIFT))) |
150 | # define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) | 158 | # define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) |
151 | # define is_hugepage_only_range(mm, addr, len) \ | 159 | # define is_hugepage_only_range(mm, addr, len) \ |
152 | (REGION_NUMBER(addr) == RGN_HPAGE && \ | 160 | (REGION_NUMBER(addr) == RGN_HPAGE || \ |
153 | REGION_NUMBER((addr)+(len)-1) == RGN_HPAGE) | 161 | REGION_NUMBER((addr)+(len)-1) == RGN_HPAGE) |
154 | extern unsigned int hpage_shift; | 162 | extern unsigned int hpage_shift; |
155 | #endif | 163 | #endif |
diff --git a/include/asm-ia64/pal.h b/include/asm-ia64/pal.h index 7708ec669a33..4e7e6f23b08c 100644 --- a/include/asm-ia64/pal.h +++ b/include/asm-ia64/pal.h | |||
@@ -1640,8 +1640,7 @@ ia64_pal_logical_to_phys(u64 proc_number, pal_logical_to_physical_t *mapping) | |||
1640 | 1640 | ||
1641 | if (iprv.status == PAL_STATUS_SUCCESS) | 1641 | if (iprv.status == PAL_STATUS_SUCCESS) |
1642 | { | 1642 | { |
1643 | if (proc_number == 0) | 1643 | mapping->overview.overview_data = iprv.v0; |
1644 | mapping->overview.overview_data = iprv.v0; | ||
1645 | mapping->ppli1.ppli1_data = iprv.v1; | 1644 | mapping->ppli1.ppli1_data = iprv.v1; |
1646 | mapping->ppli2.ppli2_data = iprv.v2; | 1645 | mapping->ppli2.ppli2_data = iprv.v2; |
1647 | } | 1646 | } |
diff --git a/include/asm-ia64/poll.h b/include/asm-ia64/poll.h index 160258a0528d..bcaf9f140242 100644 --- a/include/asm-ia64/poll.h +++ b/include/asm-ia64/poll.h | |||
@@ -21,6 +21,7 @@ | |||
21 | #define POLLWRBAND 0x0200 | 21 | #define POLLWRBAND 0x0200 |
22 | #define POLLMSG 0x0400 | 22 | #define POLLMSG 0x0400 |
23 | #define POLLREMOVE 0x1000 | 23 | #define POLLREMOVE 0x1000 |
24 | #define POLLRDHUP 0x2000 | ||
24 | 25 | ||
25 | struct pollfd { | 26 | struct pollfd { |
26 | int fd; | 27 | int fd; |
diff --git a/include/asm-ia64/processor.h b/include/asm-ia64/processor.h index 128fefd8056f..b3bd58e80690 100644 --- a/include/asm-ia64/processor.h +++ b/include/asm-ia64/processor.h | |||
@@ -181,7 +181,6 @@ DECLARE_PER_CPU(struct cpuinfo_ia64, cpu_info); | |||
181 | #define local_cpu_data (&__ia64_per_cpu_var(cpu_info)) | 181 | #define local_cpu_data (&__ia64_per_cpu_var(cpu_info)) |
182 | #define cpu_data(cpu) (&per_cpu(cpu_info, cpu)) | 182 | #define cpu_data(cpu) (&per_cpu(cpu_info, cpu)) |
183 | 183 | ||
184 | extern void identify_cpu (struct cpuinfo_ia64 *); | ||
185 | extern void print_cpu_info (struct cpuinfo_ia64 *); | 184 | extern void print_cpu_info (struct cpuinfo_ia64 *); |
186 | 185 | ||
187 | typedef struct { | 186 | typedef struct { |
diff --git a/include/asm-ia64/sn/l1.h b/include/asm-ia64/sn/l1.h index e3b819110d47..344bf44bb356 100644 --- a/include/asm-ia64/sn/l1.h +++ b/include/asm-ia64/sn/l1.h | |||
@@ -34,6 +34,8 @@ | |||
34 | #define L1_BRICKTYPE_IA 0x6b /* k */ | 34 | #define L1_BRICKTYPE_IA 0x6b /* k */ |
35 | #define L1_BRICKTYPE_ATHENA 0x2b /* + */ | 35 | #define L1_BRICKTYPE_ATHENA 0x2b /* + */ |
36 | #define L1_BRICKTYPE_DAYTONA 0x7a /* z */ | 36 | #define L1_BRICKTYPE_DAYTONA 0x7a /* z */ |
37 | #define L1_BRICKTYPE_1932 0x2c /* . */ | ||
38 | #define L1_BRICKTYPE_191010 0x2e /* , */ | ||
37 | 39 | ||
38 | /* board type response codes */ | 40 | /* board type response codes */ |
39 | #define L1_BOARDTYPE_IP69 0x0100 /* CA */ | 41 | #define L1_BOARDTYPE_IP69 0x0100 /* CA */ |
@@ -46,5 +48,4 @@ | |||
46 | #define L1_BOARDTYPE_DAYTONA 0x0800 /* AD */ | 48 | #define L1_BOARDTYPE_DAYTONA 0x0800 /* AD */ |
47 | #define L1_BOARDTYPE_INVAL (-1) /* invalid brick type */ | 49 | #define L1_BOARDTYPE_INVAL (-1) /* invalid brick type */ |
48 | 50 | ||
49 | |||
50 | #endif /* _ASM_IA64_SN_L1_H */ | 51 | #endif /* _ASM_IA64_SN_L1_H */ |
diff --git a/include/asm-ia64/sn/pcibr_provider.h b/include/asm-ia64/sn/pcibr_provider.h index a601d3af39b6..51260ab70d91 100644 --- a/include/asm-ia64/sn/pcibr_provider.h +++ b/include/asm-ia64/sn/pcibr_provider.h | |||
@@ -144,4 +144,5 @@ extern int sal_pcibr_slot_enable(struct pcibus_info *soft, int device, | |||
144 | void *resp); | 144 | void *resp); |
145 | extern int sal_pcibr_slot_disable(struct pcibus_info *soft, int device, | 145 | extern int sal_pcibr_slot_disable(struct pcibus_info *soft, int device, |
146 | int action, void *resp); | 146 | int action, void *resp); |
147 | extern u16 sn_ioboard_to_pci_bus(struct pci_bus *pci_bus); | ||
147 | #endif | 148 | #endif |
diff --git a/include/asm-ia64/sn/pcidev.h b/include/asm-ia64/sn/pcidev.h index 38cdffbc4c7b..eac3561574be 100644 --- a/include/asm-ia64/sn/pcidev.h +++ b/include/asm-ia64/sn/pcidev.h | |||
@@ -76,6 +76,7 @@ extern void sn_pci_controller_fixup(int segment, int busnum, | |||
76 | struct pci_bus *bus); | 76 | struct pci_bus *bus); |
77 | extern void sn_bus_store_sysdata(struct pci_dev *dev); | 77 | extern void sn_bus_store_sysdata(struct pci_dev *dev); |
78 | extern void sn_bus_free_sysdata(void); | 78 | extern void sn_bus_free_sysdata(void); |
79 | extern void sn_generate_path(struct pci_bus *pci_bus, char *address); | ||
79 | extern void sn_pci_fixup_slot(struct pci_dev *dev); | 80 | extern void sn_pci_fixup_slot(struct pci_dev *dev); |
80 | extern void sn_pci_unfixup_slot(struct pci_dev *dev); | 81 | extern void sn_pci_unfixup_slot(struct pci_dev *dev); |
81 | extern void sn_irq_lh_init(void); | 82 | extern void sn_irq_lh_init(void); |
diff --git a/include/asm-ia64/sn/sn_feature_sets.h b/include/asm-ia64/sn/sn_feature_sets.h index ff33e3bd3f8e..30dcfa442e53 100644 --- a/include/asm-ia64/sn/sn_feature_sets.h +++ b/include/asm-ia64/sn/sn_feature_sets.h | |||
@@ -30,8 +30,7 @@ extern int sn_prom_feature_available(int id); | |||
30 | 30 | ||
31 | #define PRF_PAL_CACHE_FLUSH_SAFE 0 | 31 | #define PRF_PAL_CACHE_FLUSH_SAFE 0 |
32 | #define PRF_DEVICE_FLUSH_LIST 1 | 32 | #define PRF_DEVICE_FLUSH_LIST 1 |
33 | 33 | #define PRF_HOTPLUG_SUPPORT 2 | |
34 | |||
35 | 34 | ||
36 | /* --------------------- OS Features -------------------------------*/ | 35 | /* --------------------- OS Features -------------------------------*/ |
37 | 36 | ||
diff --git a/include/asm-ia64/sn/sn_sal.h b/include/asm-ia64/sn/sn_sal.h index b546de2fdce5..bf4cc867a698 100644 --- a/include/asm-ia64/sn/sn_sal.h +++ b/include/asm-ia64/sn/sn_sal.h | |||
@@ -159,7 +159,7 @@ | |||
159 | static inline u32 | 159 | static inline u32 |
160 | sn_sal_rev(void) | 160 | sn_sal_rev(void) |
161 | { | 161 | { |
162 | struct ia64_sal_systab *systab = efi.sal_systab; | 162 | struct ia64_sal_systab *systab = __va(efi.sal_systab); |
163 | 163 | ||
164 | return (u32)(systab->sal_b_rev_major << 8 | systab->sal_b_rev_minor); | 164 | return (u32)(systab->sal_b_rev_major << 8 | systab->sal_b_rev_minor); |
165 | } | 165 | } |
@@ -907,18 +907,22 @@ ia64_sn_sysctl_tio_clock_reset(nasid_t nasid) | |||
907 | /* | 907 | /* |
908 | * Get the associated ioboard type for a given nasid. | 908 | * Get the associated ioboard type for a given nasid. |
909 | */ | 909 | */ |
910 | static inline int | 910 | static inline s64 |
911 | ia64_sn_sysctl_ioboard_get(nasid_t nasid) | 911 | ia64_sn_sysctl_ioboard_get(nasid_t nasid, u16 *ioboard) |
912 | { | 912 | { |
913 | struct ia64_sal_retval rv; | 913 | struct ia64_sal_retval isrv; |
914 | SAL_CALL_REENTRANT(rv, SN_SAL_SYSCTL_OP, SAL_SYSCTL_OP_IOBOARD, | 914 | SAL_CALL_REENTRANT(isrv, SN_SAL_SYSCTL_OP, SAL_SYSCTL_OP_IOBOARD, |
915 | nasid, 0, 0, 0, 0, 0); | 915 | nasid, 0, 0, 0, 0, 0); |
916 | if (rv.v0 != 0) | 916 | if (isrv.v0 != 0) { |
917 | return (int)rv.v0; | 917 | *ioboard = isrv.v0; |
918 | if (rv.v1 != 0) | 918 | return isrv.status; |
919 | return (int)rv.v1; | 919 | } |
920 | 920 | if (isrv.v1 != 0) { | |
921 | return 0; | 921 | *ioboard = isrv.v1; |
922 | return isrv.status; | ||
923 | } | ||
924 | |||
925 | return isrv.status; | ||
922 | } | 926 | } |
923 | 927 | ||
924 | /** | 928 | /** |
diff --git a/include/asm-m32r/bitops.h b/include/asm-m32r/bitops.h index abea2fdd8689..902a366101a5 100644 --- a/include/asm-m32r/bitops.h +++ b/include/asm-m32r/bitops.h | |||
@@ -63,25 +63,6 @@ static __inline__ void set_bit(int nr, volatile void * addr) | |||
63 | } | 63 | } |
64 | 64 | ||
65 | /** | 65 | /** |
66 | * __set_bit - Set a bit in memory | ||
67 | * @nr: the bit to set | ||
68 | * @addr: the address to start counting from | ||
69 | * | ||
70 | * Unlike set_bit(), this function is non-atomic and may be reordered. | ||
71 | * If it's called on the same region of memory simultaneously, the effect | ||
72 | * may be that only one operation succeeds. | ||
73 | */ | ||
74 | static __inline__ void __set_bit(int nr, volatile void * addr) | ||
75 | { | ||
76 | __u32 mask; | ||
77 | volatile __u32 *a = addr; | ||
78 | |||
79 | a += (nr >> 5); | ||
80 | mask = (1 << (nr & 0x1F)); | ||
81 | *a |= mask; | ||
82 | } | ||
83 | |||
84 | /** | ||
85 | * clear_bit - Clears a bit in memory | 66 | * clear_bit - Clears a bit in memory |
86 | * @nr: Bit to clear | 67 | * @nr: Bit to clear |
87 | * @addr: Address to start counting from | 68 | * @addr: Address to start counting from |
@@ -118,39 +99,10 @@ static __inline__ void clear_bit(int nr, volatile void * addr) | |||
118 | local_irq_restore(flags); | 99 | local_irq_restore(flags); |
119 | } | 100 | } |
120 | 101 | ||
121 | static __inline__ void __clear_bit(int nr, volatile unsigned long * addr) | ||
122 | { | ||
123 | unsigned long mask; | ||
124 | volatile unsigned long *a = addr; | ||
125 | |||
126 | a += (nr >> 5); | ||
127 | mask = (1 << (nr & 0x1F)); | ||
128 | *a &= ~mask; | ||
129 | } | ||
130 | |||
131 | #define smp_mb__before_clear_bit() barrier() | 102 | #define smp_mb__before_clear_bit() barrier() |
132 | #define smp_mb__after_clear_bit() barrier() | 103 | #define smp_mb__after_clear_bit() barrier() |
133 | 104 | ||
134 | /** | 105 | /** |
135 | * __change_bit - Toggle a bit in memory | ||
136 | * @nr: the bit to set | ||
137 | * @addr: the address to start counting from | ||
138 | * | ||
139 | * Unlike change_bit(), this function is non-atomic and may be reordered. | ||
140 | * If it's called on the same region of memory simultaneously, the effect | ||
141 | * may be that only one operation succeeds. | ||
142 | */ | ||
143 | static __inline__ void __change_bit(int nr, volatile void * addr) | ||
144 | { | ||
145 | __u32 mask; | ||
146 | volatile __u32 *a = addr; | ||
147 | |||
148 | a += (nr >> 5); | ||
149 | mask = (1 << (nr & 0x1F)); | ||
150 | *a ^= mask; | ||
151 | } | ||
152 | |||
153 | /** | ||
154 | * change_bit - Toggle a bit in memory | 106 | * change_bit - Toggle a bit in memory |
155 | * @nr: Bit to clear | 107 | * @nr: Bit to clear |
156 | * @addr: Address to start counting from | 108 | * @addr: Address to start counting from |
@@ -221,28 +173,6 @@ static __inline__ int test_and_set_bit(int nr, volatile void * addr) | |||
221 | } | 173 | } |
222 | 174 | ||
223 | /** | 175 | /** |
224 | * __test_and_set_bit - Set a bit and return its old value | ||
225 | * @nr: Bit to set | ||
226 | * @addr: Address to count from | ||
227 | * | ||
228 | * This operation is non-atomic and can be reordered. | ||
229 | * If two examples of this operation race, one can appear to succeed | ||
230 | * but actually fail. You must protect multiple accesses with a lock. | ||
231 | */ | ||
232 | static __inline__ int __test_and_set_bit(int nr, volatile void * addr) | ||
233 | { | ||
234 | __u32 mask, oldbit; | ||
235 | volatile __u32 *a = addr; | ||
236 | |||
237 | a += (nr >> 5); | ||
238 | mask = (1 << (nr & 0x1F)); | ||
239 | oldbit = (*a & mask); | ||
240 | *a |= mask; | ||
241 | |||
242 | return (oldbit != 0); | ||
243 | } | ||
244 | |||
245 | /** | ||
246 | * test_and_clear_bit - Clear a bit and return its old value | 176 | * test_and_clear_bit - Clear a bit and return its old value |
247 | * @nr: Bit to set | 177 | * @nr: Bit to set |
248 | * @addr: Address to count from | 178 | * @addr: Address to count from |
@@ -280,42 +210,6 @@ static __inline__ int test_and_clear_bit(int nr, volatile void * addr) | |||
280 | } | 210 | } |
281 | 211 | ||
282 | /** | 212 | /** |
283 | * __test_and_clear_bit - Clear a bit and return its old value | ||
284 | * @nr: Bit to set | ||
285 | * @addr: Address to count from | ||
286 | * | ||
287 | * This operation is non-atomic and can be reordered. | ||
288 | * If two examples of this operation race, one can appear to succeed | ||
289 | * but actually fail. You must protect multiple accesses with a lock. | ||
290 | */ | ||
291 | static __inline__ int __test_and_clear_bit(int nr, volatile void * addr) | ||
292 | { | ||
293 | __u32 mask, oldbit; | ||
294 | volatile __u32 *a = addr; | ||
295 | |||
296 | a += (nr >> 5); | ||
297 | mask = (1 << (nr & 0x1F)); | ||
298 | oldbit = (*a & mask); | ||
299 | *a &= ~mask; | ||
300 | |||
301 | return (oldbit != 0); | ||
302 | } | ||
303 | |||
304 | /* WARNING: non atomic and it can be reordered! */ | ||
305 | static __inline__ int __test_and_change_bit(int nr, volatile void * addr) | ||
306 | { | ||
307 | __u32 mask, oldbit; | ||
308 | volatile __u32 *a = addr; | ||
309 | |||
310 | a += (nr >> 5); | ||
311 | mask = (1 << (nr & 0x1F)); | ||
312 | oldbit = (*a & mask); | ||
313 | *a ^= mask; | ||
314 | |||
315 | return (oldbit != 0); | ||
316 | } | ||
317 | |||
318 | /** | ||
319 | * test_and_change_bit - Change a bit and return its old value | 213 | * test_and_change_bit - Change a bit and return its old value |
320 | * @nr: Bit to set | 214 | * @nr: Bit to set |
321 | * @addr: Address to count from | 215 | * @addr: Address to count from |
@@ -350,353 +244,26 @@ static __inline__ int test_and_change_bit(int nr, volatile void * addr) | |||
350 | return (oldbit != 0); | 244 | return (oldbit != 0); |
351 | } | 245 | } |
352 | 246 | ||
353 | /** | 247 | #include <asm-generic/bitops/non-atomic.h> |
354 | * test_bit - Determine whether a bit is set | 248 | #include <asm-generic/bitops/ffz.h> |
355 | * @nr: bit number to test | 249 | #include <asm-generic/bitops/__ffs.h> |
356 | * @addr: Address to start counting from | 250 | #include <asm-generic/bitops/fls.h> |
357 | */ | 251 | #include <asm-generic/bitops/fls64.h> |
358 | static __inline__ int test_bit(int nr, const volatile void * addr) | ||
359 | { | ||
360 | __u32 mask; | ||
361 | const volatile __u32 *a = addr; | ||
362 | |||
363 | a += (nr >> 5); | ||
364 | mask = (1 << (nr & 0x1F)); | ||
365 | |||
366 | return ((*a & mask) != 0); | ||
367 | } | ||
368 | |||
369 | /** | ||
370 | * ffz - find first zero in word. | ||
371 | * @word: The word to search | ||
372 | * | ||
373 | * Undefined if no zero exists, so code should check against ~0UL first. | ||
374 | */ | ||
375 | static __inline__ unsigned long ffz(unsigned long word) | ||
376 | { | ||
377 | int k; | ||
378 | |||
379 | word = ~word; | ||
380 | k = 0; | ||
381 | if (!(word & 0x0000ffff)) { k += 16; word >>= 16; } | ||
382 | if (!(word & 0x000000ff)) { k += 8; word >>= 8; } | ||
383 | if (!(word & 0x0000000f)) { k += 4; word >>= 4; } | ||
384 | if (!(word & 0x00000003)) { k += 2; word >>= 2; } | ||
385 | if (!(word & 0x00000001)) { k += 1; } | ||
386 | |||
387 | return k; | ||
388 | } | ||
389 | |||
390 | /** | ||
391 | * find_first_zero_bit - find the first zero bit in a memory region | ||
392 | * @addr: The address to start the search at | ||
393 | * @size: The maximum size to search | ||
394 | * | ||
395 | * Returns the bit-number of the first zero bit, not the number of the byte | ||
396 | * containing a bit. | ||
397 | */ | ||
398 | |||
399 | #define find_first_zero_bit(addr, size) \ | ||
400 | find_next_zero_bit((addr), (size), 0) | ||
401 | |||
402 | /** | ||
403 | * find_next_zero_bit - find the first zero bit in a memory region | ||
404 | * @addr: The address to base the search on | ||
405 | * @offset: The bitnumber to start searching at | ||
406 | * @size: The maximum size to search | ||
407 | */ | ||
408 | static __inline__ int find_next_zero_bit(const unsigned long *addr, | ||
409 | int size, int offset) | ||
410 | { | ||
411 | const unsigned long *p = addr + (offset >> 5); | ||
412 | unsigned long result = offset & ~31UL; | ||
413 | unsigned long tmp; | ||
414 | |||
415 | if (offset >= size) | ||
416 | return size; | ||
417 | size -= result; | ||
418 | offset &= 31UL; | ||
419 | if (offset) { | ||
420 | tmp = *(p++); | ||
421 | tmp |= ~0UL >> (32-offset); | ||
422 | if (size < 32) | ||
423 | goto found_first; | ||
424 | if (~tmp) | ||
425 | goto found_middle; | ||
426 | size -= 32; | ||
427 | result += 32; | ||
428 | } | ||
429 | while (size & ~31UL) { | ||
430 | if (~(tmp = *(p++))) | ||
431 | goto found_middle; | ||
432 | result += 32; | ||
433 | size -= 32; | ||
434 | } | ||
435 | if (!size) | ||
436 | return result; | ||
437 | tmp = *p; | ||
438 | |||
439 | found_first: | ||
440 | tmp |= ~0UL << size; | ||
441 | found_middle: | ||
442 | return result + ffz(tmp); | ||
443 | } | ||
444 | |||
445 | /** | ||
446 | * __ffs - find first bit in word. | ||
447 | * @word: The word to search | ||
448 | * | ||
449 | * Undefined if no bit exists, so code should check against 0 first. | ||
450 | */ | ||
451 | static __inline__ unsigned long __ffs(unsigned long word) | ||
452 | { | ||
453 | int k = 0; | ||
454 | |||
455 | if (!(word & 0x0000ffff)) { k += 16; word >>= 16; } | ||
456 | if (!(word & 0x000000ff)) { k += 8; word >>= 8; } | ||
457 | if (!(word & 0x0000000f)) { k += 4; word >>= 4; } | ||
458 | if (!(word & 0x00000003)) { k += 2; word >>= 2; } | ||
459 | if (!(word & 0x00000001)) { k += 1;} | ||
460 | |||
461 | return k; | ||
462 | } | ||
463 | |||
464 | /* | ||
465 | * fls: find last bit set. | ||
466 | */ | ||
467 | #define fls(x) generic_fls(x) | ||
468 | #define fls64(x) generic_fls64(x) | ||
469 | 252 | ||
470 | #ifdef __KERNEL__ | 253 | #ifdef __KERNEL__ |
471 | 254 | ||
472 | /* | 255 | #include <asm-generic/bitops/sched.h> |
473 | * Every architecture must define this function. It's the fastest | 256 | #include <asm-generic/bitops/find.h> |
474 | * way of searching a 140-bit bitmap where the first 100 bits are | 257 | #include <asm-generic/bitops/ffs.h> |
475 | * unlikely to be set. It's guaranteed that at least one of the 140 | 258 | #include <asm-generic/bitops/hweight.h> |
476 | * bits is cleared. | ||
477 | */ | ||
478 | static inline int sched_find_first_bit(unsigned long *b) | ||
479 | { | ||
480 | if (unlikely(b[0])) | ||
481 | return __ffs(b[0]); | ||
482 | if (unlikely(b[1])) | ||
483 | return __ffs(b[1]) + 32; | ||
484 | if (unlikely(b[2])) | ||
485 | return __ffs(b[2]) + 64; | ||
486 | if (b[3]) | ||
487 | return __ffs(b[3]) + 96; | ||
488 | return __ffs(b[4]) + 128; | ||
489 | } | ||
490 | |||
491 | /** | ||
492 | * find_next_bit - find the first set bit in a memory region | ||
493 | * @addr: The address to base the search on | ||
494 | * @offset: The bitnumber to start searching at | ||
495 | * @size: The maximum size to search | ||
496 | */ | ||
497 | static inline unsigned long find_next_bit(const unsigned long *addr, | ||
498 | unsigned long size, unsigned long offset) | ||
499 | { | ||
500 | unsigned int *p = ((unsigned int *) addr) + (offset >> 5); | ||
501 | unsigned int result = offset & ~31UL; | ||
502 | unsigned int tmp; | ||
503 | |||
504 | if (offset >= size) | ||
505 | return size; | ||
506 | size -= result; | ||
507 | offset &= 31UL; | ||
508 | if (offset) { | ||
509 | tmp = *p++; | ||
510 | tmp &= ~0UL << offset; | ||
511 | if (size < 32) | ||
512 | goto found_first; | ||
513 | if (tmp) | ||
514 | goto found_middle; | ||
515 | size -= 32; | ||
516 | result += 32; | ||
517 | } | ||
518 | while (size >= 32) { | ||
519 | if ((tmp = *p++) != 0) | ||
520 | goto found_middle; | ||
521 | result += 32; | ||
522 | size -= 32; | ||
523 | } | ||
524 | if (!size) | ||
525 | return result; | ||
526 | tmp = *p; | ||
527 | |||
528 | found_first: | ||
529 | tmp &= ~0UL >> (32 - size); | ||
530 | if (tmp == 0UL) /* Are any bits set? */ | ||
531 | return result + size; /* Nope. */ | ||
532 | found_middle: | ||
533 | return result + __ffs(tmp); | ||
534 | } | ||
535 | |||
536 | /** | ||
537 | * find_first_bit - find the first set bit in a memory region | ||
538 | * @addr: The address to start the search at | ||
539 | * @size: The maximum size to search | ||
540 | * | ||
541 | * Returns the bit-number of the first set bit, not the number of the byte | ||
542 | * containing a bit. | ||
543 | */ | ||
544 | #define find_first_bit(addr, size) \ | ||
545 | find_next_bit((addr), (size), 0) | ||
546 | |||
547 | /** | ||
548 | * ffs - find first bit set | ||
549 | * @x: the word to search | ||
550 | * | ||
551 | * This is defined the same way as | ||
552 | * the libc and compiler builtin ffs routines, therefore | ||
553 | * differs in spirit from the above ffz (man ffs). | ||
554 | */ | ||
555 | #define ffs(x) generic_ffs(x) | ||
556 | |||
557 | /** | ||
558 | * hweightN - returns the hamming weight of a N-bit word | ||
559 | * @x: the word to weigh | ||
560 | * | ||
561 | * The Hamming Weight of a number is the total number of bits set in it. | ||
562 | */ | ||
563 | |||
564 | #define hweight32(x) generic_hweight32(x) | ||
565 | #define hweight16(x) generic_hweight16(x) | ||
566 | #define hweight8(x) generic_hweight8(x) | ||
567 | 259 | ||
568 | #endif /* __KERNEL__ */ | 260 | #endif /* __KERNEL__ */ |
569 | 261 | ||
570 | #ifdef __KERNEL__ | 262 | #ifdef __KERNEL__ |
571 | 263 | ||
572 | /* | 264 | #include <asm-generic/bitops/ext2-non-atomic.h> |
573 | * ext2_XXXX function | 265 | #include <asm-generic/bitops/ext2-atomic.h> |
574 | * orig: include/asm-sh/bitops.h | 266 | #include <asm-generic/bitops/minix.h> |
575 | */ | ||
576 | |||
577 | #ifdef __LITTLE_ENDIAN__ | ||
578 | #define ext2_set_bit test_and_set_bit | ||
579 | #define ext2_clear_bit __test_and_clear_bit | ||
580 | #define ext2_test_bit test_bit | ||
581 | #define ext2_find_first_zero_bit find_first_zero_bit | ||
582 | #define ext2_find_next_zero_bit find_next_zero_bit | ||
583 | #else | ||
584 | static inline int ext2_set_bit(int nr, volatile void * addr) | ||
585 | { | ||
586 | __u8 mask, oldbit; | ||
587 | volatile __u8 *a = addr; | ||
588 | |||
589 | a += (nr >> 3); | ||
590 | mask = (1 << (nr & 0x07)); | ||
591 | oldbit = (*a & mask); | ||
592 | *a |= mask; | ||
593 | |||
594 | return (oldbit != 0); | ||
595 | } | ||
596 | |||
597 | static inline int ext2_clear_bit(int nr, volatile void * addr) | ||
598 | { | ||
599 | __u8 mask, oldbit; | ||
600 | volatile __u8 *a = addr; | ||
601 | |||
602 | a += (nr >> 3); | ||
603 | mask = (1 << (nr & 0x07)); | ||
604 | oldbit = (*a & mask); | ||
605 | *a &= ~mask; | ||
606 | |||
607 | return (oldbit != 0); | ||
608 | } | ||
609 | |||
610 | static inline int ext2_test_bit(int nr, const volatile void * addr) | ||
611 | { | ||
612 | __u32 mask; | ||
613 | const volatile __u8 *a = addr; | ||
614 | |||
615 | a += (nr >> 3); | ||
616 | mask = (1 << (nr & 0x07)); | ||
617 | |||
618 | return ((mask & *a) != 0); | ||
619 | } | ||
620 | |||
621 | #define ext2_find_first_zero_bit(addr, size) \ | ||
622 | ext2_find_next_zero_bit((addr), (size), 0) | ||
623 | |||
624 | static inline unsigned long ext2_find_next_zero_bit(void *addr, | ||
625 | unsigned long size, unsigned long offset) | ||
626 | { | ||
627 | unsigned long *p = ((unsigned long *) addr) + (offset >> 5); | ||
628 | unsigned long result = offset & ~31UL; | ||
629 | unsigned long tmp; | ||
630 | |||
631 | if (offset >= size) | ||
632 | return size; | ||
633 | size -= result; | ||
634 | offset &= 31UL; | ||
635 | if(offset) { | ||
636 | /* We hold the little endian value in tmp, but then the | ||
637 | * shift is illegal. So we could keep a big endian value | ||
638 | * in tmp, like this: | ||
639 | * | ||
640 | * tmp = __swab32(*(p++)); | ||
641 | * tmp |= ~0UL >> (32-offset); | ||
642 | * | ||
643 | * but this would decrease preformance, so we change the | ||
644 | * shift: | ||
645 | */ | ||
646 | tmp = *(p++); | ||
647 | tmp |= __swab32(~0UL >> (32-offset)); | ||
648 | if(size < 32) | ||
649 | goto found_first; | ||
650 | if(~tmp) | ||
651 | goto found_middle; | ||
652 | size -= 32; | ||
653 | result += 32; | ||
654 | } | ||
655 | while(size & ~31UL) { | ||
656 | if(~(tmp = *(p++))) | ||
657 | goto found_middle; | ||
658 | result += 32; | ||
659 | size -= 32; | ||
660 | } | ||
661 | if(!size) | ||
662 | return result; | ||
663 | tmp = *p; | ||
664 | |||
665 | found_first: | ||
666 | /* tmp is little endian, so we would have to swab the shift, | ||
667 | * see above. But then we have to swab tmp below for ffz, so | ||
668 | * we might as well do this here. | ||
669 | */ | ||
670 | return result + ffz(__swab32(tmp) | (~0UL << size)); | ||
671 | found_middle: | ||
672 | return result + ffz(__swab32(tmp)); | ||
673 | } | ||
674 | #endif | ||
675 | |||
676 | #define ext2_set_bit_atomic(lock, nr, addr) \ | ||
677 | ({ \ | ||
678 | int ret; \ | ||
679 | spin_lock(lock); \ | ||
680 | ret = ext2_set_bit((nr), (addr)); \ | ||
681 | spin_unlock(lock); \ | ||
682 | ret; \ | ||
683 | }) | ||
684 | |||
685 | #define ext2_clear_bit_atomic(lock, nr, addr) \ | ||
686 | ({ \ | ||
687 | int ret; \ | ||
688 | spin_lock(lock); \ | ||
689 | ret = ext2_clear_bit((nr), (addr)); \ | ||
690 | spin_unlock(lock); \ | ||
691 | ret; \ | ||
692 | }) | ||
693 | |||
694 | /* Bitmap functions for the minix filesystem. */ | ||
695 | #define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,addr) | ||
696 | #define minix_set_bit(nr,addr) __set_bit(nr,addr) | ||
697 | #define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit(nr,addr) | ||
698 | #define minix_test_bit(nr,addr) test_bit(nr,addr) | ||
699 | #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) | ||
700 | 267 | ||
701 | #endif /* __KERNEL__ */ | 268 | #endif /* __KERNEL__ */ |
702 | 269 | ||
diff --git a/include/asm-m32r/mmzone.h b/include/asm-m32r/mmzone.h index adc7970a77ec..9f3b5accda88 100644 --- a/include/asm-m32r/mmzone.h +++ b/include/asm-m32r/mmzone.h | |||
@@ -21,20 +21,6 @@ extern struct pglist_data *node_data[]; | |||
21 | __pgdat->node_start_pfn + __pgdat->node_spanned_pages - 1; \ | 21 | __pgdat->node_start_pfn + __pgdat->node_spanned_pages - 1; \ |
22 | }) | 22 | }) |
23 | 23 | ||
24 | #define pfn_to_page(pfn) \ | ||
25 | ({ \ | ||
26 | unsigned long __pfn = pfn; \ | ||
27 | int __node = pfn_to_nid(__pfn); \ | ||
28 | &NODE_DATA(__node)->node_mem_map[node_localnr(__pfn,__node)]; \ | ||
29 | }) | ||
30 | |||
31 | #define page_to_pfn(pg) \ | ||
32 | ({ \ | ||
33 | struct page *__page = pg; \ | ||
34 | struct zone *__zone = page_zone(__page); \ | ||
35 | (unsigned long)(__page - __zone->zone_mem_map) \ | ||
36 | + __zone->zone_start_pfn; \ | ||
37 | }) | ||
38 | #define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT)) | 24 | #define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT)) |
39 | /* | 25 | /* |
40 | * pfn_valid should be made as fast as possible, and the current definition | 26 | * pfn_valid should be made as fast as possible, and the current definition |
diff --git a/include/asm-m32r/page.h b/include/asm-m32r/page.h index 4ab578876361..9ddbc087dbc5 100644 --- a/include/asm-m32r/page.h +++ b/include/asm-m32r/page.h | |||
@@ -76,9 +76,7 @@ typedef struct { unsigned long pgprot; } pgprot_t; | |||
76 | 76 | ||
77 | #ifndef CONFIG_DISCONTIGMEM | 77 | #ifndef CONFIG_DISCONTIGMEM |
78 | #define PFN_BASE (CONFIG_MEMORY_START >> PAGE_SHIFT) | 78 | #define PFN_BASE (CONFIG_MEMORY_START >> PAGE_SHIFT) |
79 | #define pfn_to_page(pfn) (mem_map + ((pfn) - PFN_BASE)) | 79 | #define ARCH_PFN_OFFSET PFN_BASE |
80 | #define page_to_pfn(page) \ | ||
81 | ((unsigned long)((page) - mem_map) + PFN_BASE) | ||
82 | #define pfn_valid(pfn) (((pfn) - PFN_BASE) < max_mapnr) | 80 | #define pfn_valid(pfn) (((pfn) - PFN_BASE) < max_mapnr) |
83 | #endif /* !CONFIG_DISCONTIGMEM */ | 81 | #endif /* !CONFIG_DISCONTIGMEM */ |
84 | 82 | ||
@@ -92,6 +90,7 @@ typedef struct { unsigned long pgprot; } pgprot_t; | |||
92 | 90 | ||
93 | #endif /* __KERNEL__ */ | 91 | #endif /* __KERNEL__ */ |
94 | 92 | ||
93 | #include <asm-generic/memory_model.h> | ||
95 | #include <asm-generic/page.h> | 94 | #include <asm-generic/page.h> |
96 | 95 | ||
97 | #endif /* _ASM_M32R_PAGE_H */ | 96 | #endif /* _ASM_M32R_PAGE_H */ |
diff --git a/include/asm-m32r/poll.h b/include/asm-m32r/poll.h index 43b7acf732d5..9e0e700e727c 100644 --- a/include/asm-m32r/poll.h +++ b/include/asm-m32r/poll.h | |||
@@ -21,6 +21,7 @@ | |||
21 | #define POLLWRBAND 0x0200 | 21 | #define POLLWRBAND 0x0200 |
22 | #define POLLMSG 0x0400 | 22 | #define POLLMSG 0x0400 |
23 | #define POLLREMOVE 0x1000 | 23 | #define POLLREMOVE 0x1000 |
24 | #define POLLRDHUP 0x2000 | ||
24 | 25 | ||
25 | struct pollfd { | 26 | struct pollfd { |
26 | int fd; | 27 | int fd; |
diff --git a/include/asm-m32r/setup.h b/include/asm-m32r/setup.h index 5f028dc26a9b..52f4fa29abfc 100644 --- a/include/asm-m32r/setup.h +++ b/include/asm-m32r/setup.h | |||
@@ -24,10 +24,6 @@ | |||
24 | #define RAMDISK_PROMPT_FLAG (0x8000) | 24 | #define RAMDISK_PROMPT_FLAG (0x8000) |
25 | #define RAMDISK_LOAD_FLAG (0x4000) | 25 | #define RAMDISK_LOAD_FLAG (0x4000) |
26 | 26 | ||
27 | #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) | ||
28 | #define PFN_DOWN(x) ((x) >> PAGE_SHIFT) | ||
29 | #define PFN_PHYS(x) ((x) << PAGE_SHIFT) | ||
30 | |||
31 | extern unsigned long memory_start; | 27 | extern unsigned long memory_start; |
32 | extern unsigned long memory_end; | 28 | extern unsigned long memory_end; |
33 | 29 | ||
diff --git a/include/asm-m68k/bitops.h b/include/asm-m68k/bitops.h index 13f4c0048463..1a61fdb56aaf 100644 --- a/include/asm-m68k/bitops.h +++ b/include/asm-m68k/bitops.h | |||
@@ -310,36 +310,10 @@ static inline int fls(int x) | |||
310 | 310 | ||
311 | return 32 - cnt; | 311 | return 32 - cnt; |
312 | } | 312 | } |
313 | #define fls64(x) generic_fls64(x) | ||
314 | 313 | ||
315 | /* | 314 | #include <asm-generic/bitops/fls64.h> |
316 | * Every architecture must define this function. It's the fastest | 315 | #include <asm-generic/bitops/sched.h> |
317 | * way of searching a 140-bit bitmap where the first 100 bits are | 316 | #include <asm-generic/bitops/hweight.h> |
318 | * unlikely to be set. It's guaranteed that at least one of the 140 | ||
319 | * bits is cleared. | ||
320 | */ | ||
321 | static inline int sched_find_first_bit(const unsigned long *b) | ||
322 | { | ||
323 | if (unlikely(b[0])) | ||
324 | return __ffs(b[0]); | ||
325 | if (unlikely(b[1])) | ||
326 | return __ffs(b[1]) + 32; | ||
327 | if (unlikely(b[2])) | ||
328 | return __ffs(b[2]) + 64; | ||
329 | if (b[3]) | ||
330 | return __ffs(b[3]) + 96; | ||
331 | return __ffs(b[4]) + 128; | ||
332 | } | ||
333 | |||
334 | |||
335 | /* | ||
336 | * hweightN: returns the hamming weight (i.e. the number | ||
337 | * of bits set) of a N-bit word | ||
338 | */ | ||
339 | |||
340 | #define hweight32(x) generic_hweight32(x) | ||
341 | #define hweight16(x) generic_hweight16(x) | ||
342 | #define hweight8(x) generic_hweight8(x) | ||
343 | 317 | ||
344 | /* Bitmap functions for the minix filesystem */ | 318 | /* Bitmap functions for the minix filesystem */ |
345 | 319 | ||
@@ -365,9 +339,9 @@ static inline int minix_find_first_zero_bit(const void *vaddr, unsigned size) | |||
365 | return ((p - addr) << 4) + (res ^ 31); | 339 | return ((p - addr) << 4) + (res ^ 31); |
366 | } | 340 | } |
367 | 341 | ||
368 | #define minix_test_and_set_bit(nr, addr) test_and_set_bit((nr) ^ 16, (unsigned long *)(addr)) | 342 | #define minix_test_and_set_bit(nr, addr) __test_and_set_bit((nr) ^ 16, (unsigned long *)(addr)) |
369 | #define minix_set_bit(nr,addr) set_bit((nr) ^ 16, (unsigned long *)(addr)) | 343 | #define minix_set_bit(nr,addr) __set_bit((nr) ^ 16, (unsigned long *)(addr)) |
370 | #define minix_test_and_clear_bit(nr, addr) test_and_clear_bit((nr) ^ 16, (unsigned long *)(addr)) | 344 | #define minix_test_and_clear_bit(nr, addr) __test_and_clear_bit((nr) ^ 16, (unsigned long *)(addr)) |
371 | 345 | ||
372 | static inline int minix_test_bit(int nr, const void *vaddr) | 346 | static inline int minix_test_bit(int nr, const void *vaddr) |
373 | { | 347 | { |
@@ -377,9 +351,9 @@ static inline int minix_test_bit(int nr, const void *vaddr) | |||
377 | 351 | ||
378 | /* Bitmap functions for the ext2 filesystem. */ | 352 | /* Bitmap functions for the ext2 filesystem. */ |
379 | 353 | ||
380 | #define ext2_set_bit(nr, addr) test_and_set_bit((nr) ^ 24, (unsigned long *)(addr)) | 354 | #define ext2_set_bit(nr, addr) __test_and_set_bit((nr) ^ 24, (unsigned long *)(addr)) |
381 | #define ext2_set_bit_atomic(lock, nr, addr) test_and_set_bit((nr) ^ 24, (unsigned long *)(addr)) | 355 | #define ext2_set_bit_atomic(lock, nr, addr) test_and_set_bit((nr) ^ 24, (unsigned long *)(addr)) |
382 | #define ext2_clear_bit(nr, addr) test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr)) | 356 | #define ext2_clear_bit(nr, addr) __test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr)) |
383 | #define ext2_clear_bit_atomic(lock, nr, addr) test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr)) | 357 | #define ext2_clear_bit_atomic(lock, nr, addr) test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr)) |
384 | 358 | ||
385 | static inline int ext2_test_bit(int nr, const void *vaddr) | 359 | static inline int ext2_test_bit(int nr, const void *vaddr) |
diff --git a/include/asm-m68k/poll.h b/include/asm-m68k/poll.h index c4b69c4a87e1..0fb8843647f8 100644 --- a/include/asm-m68k/poll.h +++ b/include/asm-m68k/poll.h | |||
@@ -13,6 +13,7 @@ | |||
13 | #define POLLWRBAND 256 | 13 | #define POLLWRBAND 256 |
14 | #define POLLMSG 0x0400 | 14 | #define POLLMSG 0x0400 |
15 | #define POLLREMOVE 0x1000 | 15 | #define POLLREMOVE 0x1000 |
16 | #define POLLRDHUP 0x2000 | ||
16 | 17 | ||
17 | struct pollfd { | 18 | struct pollfd { |
18 | int fd; | 19 | int fd; |
diff --git a/include/asm-m68k/stat.h b/include/asm-m68k/stat.h index c4c402a45e21..dd38bc2e9f98 100644 --- a/include/asm-m68k/stat.h +++ b/include/asm-m68k/stat.h | |||
@@ -60,8 +60,7 @@ struct stat64 { | |||
60 | long long st_size; | 60 | long long st_size; |
61 | unsigned long st_blksize; | 61 | unsigned long st_blksize; |
62 | 62 | ||
63 | unsigned long __pad4; /* future possible st_blocks high bits */ | 63 | unsigned long long st_blocks; /* Number 512-byte blocks allocated. */ |
64 | unsigned long st_blocks; /* Number 512-byte blocks allocated. */ | ||
65 | 64 | ||
66 | unsigned long st_atime; | 65 | unsigned long st_atime; |
67 | unsigned long st_atime_nsec; | 66 | unsigned long st_atime_nsec; |
diff --git a/include/asm-m68knommu/bitops.h b/include/asm-m68knommu/bitops.h index 25d8a3cfef90..0b68ccd327f7 100644 --- a/include/asm-m68knommu/bitops.h +++ b/include/asm-m68knommu/bitops.h | |||
@@ -12,104 +12,10 @@ | |||
12 | 12 | ||
13 | #ifdef __KERNEL__ | 13 | #ifdef __KERNEL__ |
14 | 14 | ||
15 | /* | 15 | #include <asm-generic/bitops/ffs.h> |
16 | * Generic ffs(). | 16 | #include <asm-generic/bitops/__ffs.h> |
17 | */ | 17 | #include <asm-generic/bitops/sched.h> |
18 | static inline int ffs(int x) | 18 | #include <asm-generic/bitops/ffz.h> |
19 | { | ||
20 | int r = 1; | ||
21 | |||
22 | if (!x) | ||
23 | return 0; | ||
24 | if (!(x & 0xffff)) { | ||
25 | x >>= 16; | ||
26 | r += 16; | ||
27 | } | ||
28 | if (!(x & 0xff)) { | ||
29 | x >>= 8; | ||
30 | r += 8; | ||
31 | } | ||
32 | if (!(x & 0xf)) { | ||
33 | x >>= 4; | ||
34 | r += 4; | ||
35 | } | ||
36 | if (!(x & 3)) { | ||
37 | x >>= 2; | ||
38 | r += 2; | ||
39 | } | ||
40 | if (!(x & 1)) { | ||
41 | x >>= 1; | ||
42 | r += 1; | ||
43 | } | ||
44 | return r; | ||
45 | } | ||
46 | |||
47 | /* | ||
48 | * Generic __ffs(). | ||
49 | */ | ||
50 | static inline int __ffs(int x) | ||
51 | { | ||
52 | int r = 0; | ||
53 | |||
54 | if (!x) | ||
55 | return 0; | ||
56 | if (!(x & 0xffff)) { | ||
57 | x >>= 16; | ||
58 | r += 16; | ||
59 | } | ||
60 | if (!(x & 0xff)) { | ||
61 | x >>= 8; | ||
62 | r += 8; | ||
63 | } | ||
64 | if (!(x & 0xf)) { | ||
65 | x >>= 4; | ||
66 | r += 4; | ||
67 | } | ||
68 | if (!(x & 3)) { | ||
69 | x >>= 2; | ||
70 | r += 2; | ||
71 | } | ||
72 | if (!(x & 1)) { | ||
73 | x >>= 1; | ||
74 | r += 1; | ||
75 | } | ||
76 | return r; | ||
77 | } | ||
78 | |||
79 | /* | ||
80 | * Every architecture must define this function. It's the fastest | ||
81 | * way of searching a 140-bit bitmap where the first 100 bits are | ||
82 | * unlikely to be set. It's guaranteed that at least one of the 140 | ||
83 | * bits is cleared. | ||
84 | */ | ||
85 | static inline int sched_find_first_bit(unsigned long *b) | ||
86 | { | ||
87 | if (unlikely(b[0])) | ||
88 | return __ffs(b[0]); | ||
89 | if (unlikely(b[1])) | ||
90 | return __ffs(b[1]) + 32; | ||
91 | if (unlikely(b[2])) | ||
92 | return __ffs(b[2]) + 64; | ||
93 | if (b[3]) | ||
94 | return __ffs(b[3]) + 96; | ||
95 | return __ffs(b[4]) + 128; | ||
96 | } | ||
97 | |||
98 | /* | ||
99 | * ffz = Find First Zero in word. Undefined if no zero exists, | ||
100 | * so code should check against ~0UL first.. | ||
101 | */ | ||
102 | static __inline__ unsigned long ffz(unsigned long word) | ||
103 | { | ||
104 | unsigned long result = 0; | ||
105 | |||
106 | while(word & 1) { | ||
107 | result++; | ||
108 | word >>= 1; | ||
109 | } | ||
110 | return result; | ||
111 | } | ||
112 | |||
113 | 19 | ||
114 | static __inline__ void set_bit(int nr, volatile unsigned long * addr) | 20 | static __inline__ void set_bit(int nr, volatile unsigned long * addr) |
115 | { | 21 | { |
@@ -254,98 +160,8 @@ static __inline__ int __test_bit(int nr, const volatile unsigned long * addr) | |||
254 | __constant_test_bit((nr),(addr)) : \ | 160 | __constant_test_bit((nr),(addr)) : \ |
255 | __test_bit((nr),(addr))) | 161 | __test_bit((nr),(addr))) |
256 | 162 | ||
257 | #define find_first_zero_bit(addr, size) \ | 163 | #include <asm-generic/bitops/find.h> |
258 | find_next_zero_bit((addr), (size), 0) | 164 | #include <asm-generic/bitops/hweight.h> |
259 | #define find_first_bit(addr, size) \ | ||
260 | find_next_bit((addr), (size), 0) | ||
261 | |||
262 | static __inline__ int find_next_zero_bit (const void * addr, int size, int offset) | ||
263 | { | ||
264 | unsigned long *p = ((unsigned long *) addr) + (offset >> 5); | ||
265 | unsigned long result = offset & ~31UL; | ||
266 | unsigned long tmp; | ||
267 | |||
268 | if (offset >= size) | ||
269 | return size; | ||
270 | size -= result; | ||
271 | offset &= 31UL; | ||
272 | if (offset) { | ||
273 | tmp = *(p++); | ||
274 | tmp |= ~0UL >> (32-offset); | ||
275 | if (size < 32) | ||
276 | goto found_first; | ||
277 | if (~tmp) | ||
278 | goto found_middle; | ||
279 | size -= 32; | ||
280 | result += 32; | ||
281 | } | ||
282 | while (size & ~31UL) { | ||
283 | if (~(tmp = *(p++))) | ||
284 | goto found_middle; | ||
285 | result += 32; | ||
286 | size -= 32; | ||
287 | } | ||
288 | if (!size) | ||
289 | return result; | ||
290 | tmp = *p; | ||
291 | |||
292 | found_first: | ||
293 | tmp |= ~0UL << size; | ||
294 | found_middle: | ||
295 | return result + ffz(tmp); | ||
296 | } | ||
297 | |||
298 | /* | ||
299 | * Find next one bit in a bitmap reasonably efficiently. | ||
300 | */ | ||
301 | static __inline__ unsigned long find_next_bit(const unsigned long *addr, | ||
302 | unsigned long size, unsigned long offset) | ||
303 | { | ||
304 | unsigned int *p = ((unsigned int *) addr) + (offset >> 5); | ||
305 | unsigned int result = offset & ~31UL; | ||
306 | unsigned int tmp; | ||
307 | |||
308 | if (offset >= size) | ||
309 | return size; | ||
310 | size -= result; | ||
311 | offset &= 31UL; | ||
312 | if (offset) { | ||
313 | tmp = *p++; | ||
314 | tmp &= ~0UL << offset; | ||
315 | if (size < 32) | ||
316 | goto found_first; | ||
317 | if (tmp) | ||
318 | goto found_middle; | ||
319 | size -= 32; | ||
320 | result += 32; | ||
321 | } | ||
322 | while (size >= 32) { | ||
323 | if ((tmp = *p++) != 0) | ||
324 | goto found_middle; | ||
325 | result += 32; | ||
326 | size -= 32; | ||
327 | } | ||
328 | if (!size) | ||
329 | return result; | ||
330 | tmp = *p; | ||
331 | |||
332 | found_first: | ||
333 | tmp &= ~0UL >> (32 - size); | ||
334 | if (tmp == 0UL) /* Are any bits set? */ | ||
335 | return result + size; /* Nope. */ | ||
336 | found_middle: | ||
337 | return result + __ffs(tmp); | ||
338 | } | ||
339 | |||
340 | /* | ||
341 | * hweightN: returns the hamming weight (i.e. the number | ||
342 | * of bits set) of a N-bit word | ||
343 | */ | ||
344 | |||
345 | #define hweight32(x) generic_hweight32(x) | ||
346 | #define hweight16(x) generic_hweight16(x) | ||
347 | #define hweight8(x) generic_hweight8(x) | ||
348 | |||
349 | 165 | ||
350 | static __inline__ int ext2_set_bit(int nr, volatile void * addr) | 166 | static __inline__ int ext2_set_bit(int nr, volatile void * addr) |
351 | { | 167 | { |
@@ -475,30 +291,11 @@ found_middle: | |||
475 | return result + ffz(__swab32(tmp)); | 291 | return result + ffz(__swab32(tmp)); |
476 | } | 292 | } |
477 | 293 | ||
478 | /* Bitmap functions for the minix filesystem. */ | 294 | #include <asm-generic/bitops/minix.h> |
479 | #define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr) | ||
480 | #define minix_set_bit(nr,addr) set_bit(nr,addr) | ||
481 | #define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr) | ||
482 | #define minix_test_bit(nr,addr) test_bit(nr,addr) | ||
483 | #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) | ||
484 | |||
485 | /** | ||
486 | * hweightN - returns the hamming weight of a N-bit word | ||
487 | * @x: the word to weigh | ||
488 | * | ||
489 | * The Hamming Weight of a number is the total number of bits set in it. | ||
490 | */ | ||
491 | |||
492 | #define hweight32(x) generic_hweight32(x) | ||
493 | #define hweight16(x) generic_hweight16(x) | ||
494 | #define hweight8(x) generic_hweight8(x) | ||
495 | 295 | ||
496 | #endif /* __KERNEL__ */ | 296 | #endif /* __KERNEL__ */ |
497 | 297 | ||
498 | /* | 298 | #include <asm-generic/bitops/fls.h> |
499 | * fls: find last bit set. | 299 | #include <asm-generic/bitops/fls64.h> |
500 | */ | ||
501 | #define fls(x) generic_fls(x) | ||
502 | #define fls64(x) generic_fls64(x) | ||
503 | 300 | ||
504 | #endif /* _M68KNOMMU_BITOPS_H */ | 301 | #endif /* _M68KNOMMU_BITOPS_H */ |
diff --git a/include/asm-mips/bitops.h b/include/asm-mips/bitops.h index 8e802059fe67..a1728f8c0705 100644 --- a/include/asm-mips/bitops.h +++ b/include/asm-mips/bitops.h | |||
@@ -105,22 +105,6 @@ static inline void set_bit(unsigned long nr, volatile unsigned long *addr) | |||
105 | } | 105 | } |
106 | 106 | ||
107 | /* | 107 | /* |
108 | * __set_bit - Set a bit in memory | ||
109 | * @nr: the bit to set | ||
110 | * @addr: the address to start counting from | ||
111 | * | ||
112 | * Unlike set_bit(), this function is non-atomic and may be reordered. | ||
113 | * If it's called on the same region of memory simultaneously, the effect | ||
114 | * may be that only one operation succeeds. | ||
115 | */ | ||
116 | static inline void __set_bit(unsigned long nr, volatile unsigned long * addr) | ||
117 | { | ||
118 | unsigned long * m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); | ||
119 | |||
120 | *m |= 1UL << (nr & SZLONG_MASK); | ||
121 | } | ||
122 | |||
123 | /* | ||
124 | * clear_bit - Clears a bit in memory | 108 | * clear_bit - Clears a bit in memory |
125 | * @nr: Bit to clear | 109 | * @nr: Bit to clear |
126 | * @addr: Address to start counting from | 110 | * @addr: Address to start counting from |
@@ -169,22 +153,6 @@ static inline void clear_bit(unsigned long nr, volatile unsigned long *addr) | |||
169 | } | 153 | } |
170 | 154 | ||
171 | /* | 155 | /* |
172 | * __clear_bit - Clears a bit in memory | ||
173 | * @nr: Bit to clear | ||
174 | * @addr: Address to start counting from | ||
175 | * | ||
176 | * Unlike clear_bit(), this function is non-atomic and may be reordered. | ||
177 | * If it's called on the same region of memory simultaneously, the effect | ||
178 | * may be that only one operation succeeds. | ||
179 | */ | ||
180 | static inline void __clear_bit(unsigned long nr, volatile unsigned long * addr) | ||
181 | { | ||
182 | unsigned long * m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); | ||
183 | |||
184 | *m &= ~(1UL << (nr & SZLONG_MASK)); | ||
185 | } | ||
186 | |||
187 | /* | ||
188 | * change_bit - Toggle a bit in memory | 156 | * change_bit - Toggle a bit in memory |
189 | * @nr: Bit to change | 157 | * @nr: Bit to change |
190 | * @addr: Address to start counting from | 158 | * @addr: Address to start counting from |
@@ -235,22 +203,6 @@ static inline void change_bit(unsigned long nr, volatile unsigned long *addr) | |||
235 | } | 203 | } |
236 | 204 | ||
237 | /* | 205 | /* |
238 | * __change_bit - Toggle a bit in memory | ||
239 | * @nr: the bit to change | ||
240 | * @addr: the address to start counting from | ||
241 | * | ||
242 | * Unlike change_bit(), this function is non-atomic and may be reordered. | ||
243 | * If it's called on the same region of memory simultaneously, the effect | ||
244 | * may be that only one operation succeeds. | ||
245 | */ | ||
246 | static inline void __change_bit(unsigned long nr, volatile unsigned long * addr) | ||
247 | { | ||
248 | unsigned long * m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); | ||
249 | |||
250 | *m ^= 1UL << (nr & SZLONG_MASK); | ||
251 | } | ||
252 | |||
253 | /* | ||
254 | * test_and_set_bit - Set a bit and return its old value | 206 | * test_and_set_bit - Set a bit and return its old value |
255 | * @nr: Bit to set | 207 | * @nr: Bit to set |
256 | * @addr: Address to count from | 208 | * @addr: Address to count from |
@@ -321,30 +273,6 @@ static inline int test_and_set_bit(unsigned long nr, | |||
321 | } | 273 | } |
322 | 274 | ||
323 | /* | 275 | /* |
324 | * __test_and_set_bit - Set a bit and return its old value | ||
325 | * @nr: Bit to set | ||
326 | * @addr: Address to count from | ||
327 | * | ||
328 | * This operation is non-atomic and can be reordered. | ||
329 | * If two examples of this operation race, one can appear to succeed | ||
330 | * but actually fail. You must protect multiple accesses with a lock. | ||
331 | */ | ||
332 | static inline int __test_and_set_bit(unsigned long nr, | ||
333 | volatile unsigned long *addr) | ||
334 | { | ||
335 | volatile unsigned long *a = addr; | ||
336 | unsigned long mask; | ||
337 | int retval; | ||
338 | |||
339 | a += nr >> SZLONG_LOG; | ||
340 | mask = 1UL << (nr & SZLONG_MASK); | ||
341 | retval = (mask & *a) != 0; | ||
342 | *a |= mask; | ||
343 | |||
344 | return retval; | ||
345 | } | ||
346 | |||
347 | /* | ||
348 | * test_and_clear_bit - Clear a bit and return its old value | 276 | * test_and_clear_bit - Clear a bit and return its old value |
349 | * @nr: Bit to clear | 277 | * @nr: Bit to clear |
350 | * @addr: Address to count from | 278 | * @addr: Address to count from |
@@ -417,30 +345,6 @@ static inline int test_and_clear_bit(unsigned long nr, | |||
417 | } | 345 | } |
418 | 346 | ||
419 | /* | 347 | /* |
420 | * __test_and_clear_bit - Clear a bit and return its old value | ||
421 | * @nr: Bit to clear | ||
422 | * @addr: Address to count from | ||
423 | * | ||
424 | * This operation is non-atomic and can be reordered. | ||
425 | * If two examples of this operation race, one can appear to succeed | ||
426 | * but actually fail. You must protect multiple accesses with a lock. | ||
427 | */ | ||
428 | static inline int __test_and_clear_bit(unsigned long nr, | ||
429 | volatile unsigned long * addr) | ||
430 | { | ||
431 | volatile unsigned long *a = addr; | ||
432 | unsigned long mask; | ||
433 | int retval; | ||
434 | |||
435 | a += (nr >> SZLONG_LOG); | ||
436 | mask = 1UL << (nr & SZLONG_MASK); | ||
437 | retval = ((mask & *a) != 0); | ||
438 | *a &= ~mask; | ||
439 | |||
440 | return retval; | ||
441 | } | ||
442 | |||
443 | /* | ||
444 | * test_and_change_bit - Change a bit and return its old value | 348 | * test_and_change_bit - Change a bit and return its old value |
445 | * @nr: Bit to change | 349 | * @nr: Bit to change |
446 | * @addr: Address to count from | 350 | * @addr: Address to count from |
@@ -509,43 +413,11 @@ static inline int test_and_change_bit(unsigned long nr, | |||
509 | } | 413 | } |
510 | } | 414 | } |
511 | 415 | ||
512 | /* | ||
513 | * __test_and_change_bit - Change a bit and return its old value | ||
514 | * @nr: Bit to change | ||
515 | * @addr: Address to count from | ||
516 | * | ||
517 | * This operation is non-atomic and can be reordered. | ||
518 | * If two examples of this operation race, one can appear to succeed | ||
519 | * but actually fail. You must protect multiple accesses with a lock. | ||
520 | */ | ||
521 | static inline int __test_and_change_bit(unsigned long nr, | ||
522 | volatile unsigned long *addr) | ||
523 | { | ||
524 | volatile unsigned long *a = addr; | ||
525 | unsigned long mask; | ||
526 | int retval; | ||
527 | |||
528 | a += (nr >> SZLONG_LOG); | ||
529 | mask = 1UL << (nr & SZLONG_MASK); | ||
530 | retval = ((mask & *a) != 0); | ||
531 | *a ^= mask; | ||
532 | |||
533 | return retval; | ||
534 | } | ||
535 | |||
536 | #undef __bi_flags | 416 | #undef __bi_flags |
537 | #undef __bi_local_irq_save | 417 | #undef __bi_local_irq_save |
538 | #undef __bi_local_irq_restore | 418 | #undef __bi_local_irq_restore |
539 | 419 | ||
540 | /* | 420 | #include <asm-generic/bitops/non-atomic.h> |
541 | * test_bit - Determine whether a bit is set | ||
542 | * @nr: bit number to test | ||
543 | * @addr: Address to start counting from | ||
544 | */ | ||
545 | static inline int test_bit(unsigned long nr, const volatile unsigned long *addr) | ||
546 | { | ||
547 | return 1UL & (addr[nr >> SZLONG_LOG] >> (nr & SZLONG_MASK)); | ||
548 | } | ||
549 | 421 | ||
550 | /* | 422 | /* |
551 | * Return the bit position (0..63) of the most significant 1 bit in a word | 423 | * Return the bit position (0..63) of the most significant 1 bit in a word |
@@ -580,6 +452,8 @@ static inline int __ilog2(unsigned long x) | |||
580 | return 63 - lz; | 452 | return 63 - lz; |
581 | } | 453 | } |
582 | 454 | ||
455 | #if defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64) | ||
456 | |||
583 | /* | 457 | /* |
584 | * __ffs - find first bit in word. | 458 | * __ffs - find first bit in word. |
585 | * @word: The word to search | 459 | * @word: The word to search |
@@ -589,31 +463,7 @@ static inline int __ilog2(unsigned long x) | |||
589 | */ | 463 | */ |
590 | static inline unsigned long __ffs(unsigned long word) | 464 | static inline unsigned long __ffs(unsigned long word) |
591 | { | 465 | { |
592 | #if defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64) | ||
593 | return __ilog2(word & -word); | 466 | return __ilog2(word & -word); |
594 | #else | ||
595 | int b = 0, s; | ||
596 | |||
597 | #ifdef CONFIG_32BIT | ||
598 | s = 16; if (word << 16 != 0) s = 0; b += s; word >>= s; | ||
599 | s = 8; if (word << 24 != 0) s = 0; b += s; word >>= s; | ||
600 | s = 4; if (word << 28 != 0) s = 0; b += s; word >>= s; | ||
601 | s = 2; if (word << 30 != 0) s = 0; b += s; word >>= s; | ||
602 | s = 1; if (word << 31 != 0) s = 0; b += s; | ||
603 | |||
604 | return b; | ||
605 | #endif | ||
606 | #ifdef CONFIG_64BIT | ||
607 | s = 32; if (word << 32 != 0) s = 0; b += s; word >>= s; | ||
608 | s = 16; if (word << 48 != 0) s = 0; b += s; word >>= s; | ||
609 | s = 8; if (word << 56 != 0) s = 0; b += s; word >>= s; | ||
610 | s = 4; if (word << 60 != 0) s = 0; b += s; word >>= s; | ||
611 | s = 2; if (word << 62 != 0) s = 0; b += s; word >>= s; | ||
612 | s = 1; if (word << 63 != 0) s = 0; b += s; | ||
613 | |||
614 | return b; | ||
615 | #endif | ||
616 | #endif | ||
617 | } | 467 | } |
618 | 468 | ||
619 | /* | 469 | /* |
@@ -652,321 +502,38 @@ static inline unsigned long ffz(unsigned long word) | |||
652 | */ | 502 | */ |
653 | static inline unsigned long fls(unsigned long word) | 503 | static inline unsigned long fls(unsigned long word) |
654 | { | 504 | { |
655 | #ifdef CONFIG_32BIT | ||
656 | #ifdef CONFIG_CPU_MIPS32 | 505 | #ifdef CONFIG_CPU_MIPS32 |
657 | __asm__ ("clz %0, %1" : "=r" (word) : "r" (word)); | 506 | __asm__ ("clz %0, %1" : "=r" (word) : "r" (word)); |
658 | 507 | ||
659 | return 32 - word; | 508 | return 32 - word; |
660 | #else | ||
661 | { | ||
662 | int r = 32, s; | ||
663 | |||
664 | if (word == 0) | ||
665 | return 0; | ||
666 | |||
667 | s = 16; if ((word & 0xffff0000)) s = 0; r -= s; word <<= s; | ||
668 | s = 8; if ((word & 0xff000000)) s = 0; r -= s; word <<= s; | ||
669 | s = 4; if ((word & 0xf0000000)) s = 0; r -= s; word <<= s; | ||
670 | s = 2; if ((word & 0xc0000000)) s = 0; r -= s; word <<= s; | ||
671 | s = 1; if ((word & 0x80000000)) s = 0; r -= s; | ||
672 | |||
673 | return r; | ||
674 | } | ||
675 | #endif | 509 | #endif |
676 | #endif /* CONFIG_32BIT */ | ||
677 | 510 | ||
678 | #ifdef CONFIG_64BIT | ||
679 | #ifdef CONFIG_CPU_MIPS64 | 511 | #ifdef CONFIG_CPU_MIPS64 |
680 | |||
681 | __asm__ ("dclz %0, %1" : "=r" (word) : "r" (word)); | 512 | __asm__ ("dclz %0, %1" : "=r" (word) : "r" (word)); |
682 | 513 | ||
683 | return 64 - word; | 514 | return 64 - word; |
684 | #else | ||
685 | { | ||
686 | int r = 64, s; | ||
687 | |||
688 | if (word == 0) | ||
689 | return 0; | ||
690 | |||
691 | s = 32; if ((word & 0xffffffff00000000UL)) s = 0; r -= s; word <<= s; | ||
692 | s = 16; if ((word & 0xffff000000000000UL)) s = 0; r -= s; word <<= s; | ||
693 | s = 8; if ((word & 0xff00000000000000UL)) s = 0; r -= s; word <<= s; | ||
694 | s = 4; if ((word & 0xf000000000000000UL)) s = 0; r -= s; word <<= s; | ||
695 | s = 2; if ((word & 0xc000000000000000UL)) s = 0; r -= s; word <<= s; | ||
696 | s = 1; if ((word & 0x8000000000000000UL)) s = 0; r -= s; | ||
697 | |||
698 | return r; | ||
699 | } | ||
700 | #endif | 515 | #endif |
701 | #endif /* CONFIG_64BIT */ | ||
702 | } | 516 | } |
703 | 517 | ||
704 | #define fls64(x) generic_fls64(x) | 518 | #else |
705 | |||
706 | /* | ||
707 | * find_next_zero_bit - find the first zero bit in a memory region | ||
708 | * @addr: The address to base the search on | ||
709 | * @offset: The bitnumber to start searching at | ||
710 | * @size: The maximum size to search | ||
711 | */ | ||
712 | static inline unsigned long find_next_zero_bit(const unsigned long *addr, | ||
713 | unsigned long size, unsigned long offset) | ||
714 | { | ||
715 | const unsigned long *p = addr + (offset >> SZLONG_LOG); | ||
716 | unsigned long result = offset & ~SZLONG_MASK; | ||
717 | unsigned long tmp; | ||
718 | |||
719 | if (offset >= size) | ||
720 | return size; | ||
721 | size -= result; | ||
722 | offset &= SZLONG_MASK; | ||
723 | if (offset) { | ||
724 | tmp = *(p++); | ||
725 | tmp |= ~0UL >> (_MIPS_SZLONG-offset); | ||
726 | if (size < _MIPS_SZLONG) | ||
727 | goto found_first; | ||
728 | if (~tmp) | ||
729 | goto found_middle; | ||
730 | size -= _MIPS_SZLONG; | ||
731 | result += _MIPS_SZLONG; | ||
732 | } | ||
733 | while (size & ~SZLONG_MASK) { | ||
734 | if (~(tmp = *(p++))) | ||
735 | goto found_middle; | ||
736 | result += _MIPS_SZLONG; | ||
737 | size -= _MIPS_SZLONG; | ||
738 | } | ||
739 | if (!size) | ||
740 | return result; | ||
741 | tmp = *p; | ||
742 | |||
743 | found_first: | ||
744 | tmp |= ~0UL << size; | ||
745 | if (tmp == ~0UL) /* Are any bits zero? */ | ||
746 | return result + size; /* Nope. */ | ||
747 | found_middle: | ||
748 | return result + ffz(tmp); | ||
749 | } | ||
750 | 519 | ||
751 | #define find_first_zero_bit(addr, size) \ | 520 | #include <asm-generic/bitops/__ffs.h> |
752 | find_next_zero_bit((addr), (size), 0) | 521 | #include <asm-generic/bitops/ffs.h> |
522 | #include <asm-generic/bitops/ffz.h> | ||
523 | #include <asm-generic/bitops/fls.h> | ||
753 | 524 | ||
754 | /* | 525 | #endif /*defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64) */ |
755 | * find_next_bit - find the next set bit in a memory region | ||
756 | * @addr: The address to base the search on | ||
757 | * @offset: The bitnumber to start searching at | ||
758 | * @size: The maximum size to search | ||
759 | */ | ||
760 | static inline unsigned long find_next_bit(const unsigned long *addr, | ||
761 | unsigned long size, unsigned long offset) | ||
762 | { | ||
763 | const unsigned long *p = addr + (offset >> SZLONG_LOG); | ||
764 | unsigned long result = offset & ~SZLONG_MASK; | ||
765 | unsigned long tmp; | ||
766 | |||
767 | if (offset >= size) | ||
768 | return size; | ||
769 | size -= result; | ||
770 | offset &= SZLONG_MASK; | ||
771 | if (offset) { | ||
772 | tmp = *(p++); | ||
773 | tmp &= ~0UL << offset; | ||
774 | if (size < _MIPS_SZLONG) | ||
775 | goto found_first; | ||
776 | if (tmp) | ||
777 | goto found_middle; | ||
778 | size -= _MIPS_SZLONG; | ||
779 | result += _MIPS_SZLONG; | ||
780 | } | ||
781 | while (size & ~SZLONG_MASK) { | ||
782 | if ((tmp = *(p++))) | ||
783 | goto found_middle; | ||
784 | result += _MIPS_SZLONG; | ||
785 | size -= _MIPS_SZLONG; | ||
786 | } | ||
787 | if (!size) | ||
788 | return result; | ||
789 | tmp = *p; | ||
790 | |||
791 | found_first: | ||
792 | tmp &= ~0UL >> (_MIPS_SZLONG - size); | ||
793 | if (tmp == 0UL) /* Are any bits set? */ | ||
794 | return result + size; /* Nope. */ | ||
795 | found_middle: | ||
796 | return result + __ffs(tmp); | ||
797 | } | ||
798 | 526 | ||
799 | /* | 527 | #include <asm-generic/bitops/fls64.h> |
800 | * find_first_bit - find the first set bit in a memory region | 528 | #include <asm-generic/bitops/find.h> |
801 | * @addr: The address to start the search at | ||
802 | * @size: The maximum size to search | ||
803 | * | ||
804 | * Returns the bit-number of the first set bit, not the number of the byte | ||
805 | * containing a bit. | ||
806 | */ | ||
807 | #define find_first_bit(addr, size) \ | ||
808 | find_next_bit((addr), (size), 0) | ||
809 | 529 | ||
810 | #ifdef __KERNEL__ | 530 | #ifdef __KERNEL__ |
811 | 531 | ||
812 | /* | 532 | #include <asm-generic/bitops/sched.h> |
813 | * Every architecture must define this function. It's the fastest | 533 | #include <asm-generic/bitops/hweight.h> |
814 | * way of searching a 140-bit bitmap where the first 100 bits are | 534 | #include <asm-generic/bitops/ext2-non-atomic.h> |
815 | * unlikely to be set. It's guaranteed that at least one of the 140 | 535 | #include <asm-generic/bitops/ext2-atomic.h> |
816 | * bits is cleared. | 536 | #include <asm-generic/bitops/minix.h> |
817 | */ | ||
818 | static inline int sched_find_first_bit(const unsigned long *b) | ||
819 | { | ||
820 | #ifdef CONFIG_32BIT | ||
821 | if (unlikely(b[0])) | ||
822 | return __ffs(b[0]); | ||
823 | if (unlikely(b[1])) | ||
824 | return __ffs(b[1]) + 32; | ||
825 | if (unlikely(b[2])) | ||
826 | return __ffs(b[2]) + 64; | ||
827 | if (b[3]) | ||
828 | return __ffs(b[3]) + 96; | ||
829 | return __ffs(b[4]) + 128; | ||
830 | #endif | ||
831 | #ifdef CONFIG_64BIT | ||
832 | if (unlikely(b[0])) | ||
833 | return __ffs(b[0]); | ||
834 | if (unlikely(b[1])) | ||
835 | return __ffs(b[1]) + 64; | ||
836 | return __ffs(b[2]) + 128; | ||
837 | #endif | ||
838 | } | ||
839 | |||
840 | /* | ||
841 | * hweightN - returns the hamming weight of a N-bit word | ||
842 | * @x: the word to weigh | ||
843 | * | ||
844 | * The Hamming Weight of a number is the total number of bits set in it. | ||
845 | */ | ||
846 | |||
847 | #define hweight64(x) generic_hweight64(x) | ||
848 | #define hweight32(x) generic_hweight32(x) | ||
849 | #define hweight16(x) generic_hweight16(x) | ||
850 | #define hweight8(x) generic_hweight8(x) | ||
851 | |||
852 | static inline int __test_and_set_le_bit(unsigned long nr, unsigned long *addr) | ||
853 | { | ||
854 | unsigned char *ADDR = (unsigned char *) addr; | ||
855 | int mask, retval; | ||
856 | |||
857 | ADDR += nr >> 3; | ||
858 | mask = 1 << (nr & 0x07); | ||
859 | retval = (mask & *ADDR) != 0; | ||
860 | *ADDR |= mask; | ||
861 | |||
862 | return retval; | ||
863 | } | ||
864 | |||
865 | static inline int __test_and_clear_le_bit(unsigned long nr, unsigned long *addr) | ||
866 | { | ||
867 | unsigned char *ADDR = (unsigned char *) addr; | ||
868 | int mask, retval; | ||
869 | |||
870 | ADDR += nr >> 3; | ||
871 | mask = 1 << (nr & 0x07); | ||
872 | retval = (mask & *ADDR) != 0; | ||
873 | *ADDR &= ~mask; | ||
874 | |||
875 | return retval; | ||
876 | } | ||
877 | |||
878 | static inline int test_le_bit(unsigned long nr, const unsigned long * addr) | ||
879 | { | ||
880 | const unsigned char *ADDR = (const unsigned char *) addr; | ||
881 | int mask; | ||
882 | |||
883 | ADDR += nr >> 3; | ||
884 | mask = 1 << (nr & 0x07); | ||
885 | |||
886 | return ((mask & *ADDR) != 0); | ||
887 | } | ||
888 | |||
889 | static inline unsigned long find_next_zero_le_bit(unsigned long *addr, | ||
890 | unsigned long size, unsigned long offset) | ||
891 | { | ||
892 | unsigned long *p = ((unsigned long *) addr) + (offset >> SZLONG_LOG); | ||
893 | unsigned long result = offset & ~SZLONG_MASK; | ||
894 | unsigned long tmp; | ||
895 | |||
896 | if (offset >= size) | ||
897 | return size; | ||
898 | size -= result; | ||
899 | offset &= SZLONG_MASK; | ||
900 | if (offset) { | ||
901 | tmp = cpu_to_lelongp(p++); | ||
902 | tmp |= ~0UL >> (_MIPS_SZLONG-offset); /* bug or feature ? */ | ||
903 | if (size < _MIPS_SZLONG) | ||
904 | goto found_first; | ||
905 | if (~tmp) | ||
906 | goto found_middle; | ||
907 | size -= _MIPS_SZLONG; | ||
908 | result += _MIPS_SZLONG; | ||
909 | } | ||
910 | while (size & ~SZLONG_MASK) { | ||
911 | if (~(tmp = cpu_to_lelongp(p++))) | ||
912 | goto found_middle; | ||
913 | result += _MIPS_SZLONG; | ||
914 | size -= _MIPS_SZLONG; | ||
915 | } | ||
916 | if (!size) | ||
917 | return result; | ||
918 | tmp = cpu_to_lelongp(p); | ||
919 | |||
920 | found_first: | ||
921 | tmp |= ~0UL << size; | ||
922 | if (tmp == ~0UL) /* Are any bits zero? */ | ||
923 | return result + size; /* Nope. */ | ||
924 | |||
925 | found_middle: | ||
926 | return result + ffz(tmp); | ||
927 | } | ||
928 | |||
929 | #define find_first_zero_le_bit(addr, size) \ | ||
930 | find_next_zero_le_bit((addr), (size), 0) | ||
931 | |||
932 | #define ext2_set_bit(nr,addr) \ | ||
933 | __test_and_set_le_bit((nr),(unsigned long*)addr) | ||
934 | #define ext2_clear_bit(nr, addr) \ | ||
935 | __test_and_clear_le_bit((nr),(unsigned long*)addr) | ||
936 | #define ext2_set_bit_atomic(lock, nr, addr) \ | ||
937 | ({ \ | ||
938 | int ret; \ | ||
939 | spin_lock(lock); \ | ||
940 | ret = ext2_set_bit((nr), (addr)); \ | ||
941 | spin_unlock(lock); \ | ||
942 | ret; \ | ||
943 | }) | ||
944 | |||
945 | #define ext2_clear_bit_atomic(lock, nr, addr) \ | ||
946 | ({ \ | ||
947 | int ret; \ | ||
948 | spin_lock(lock); \ | ||
949 | ret = ext2_clear_bit((nr), (addr)); \ | ||
950 | spin_unlock(lock); \ | ||
951 | ret; \ | ||
952 | }) | ||
953 | #define ext2_test_bit(nr, addr) test_le_bit((nr),(unsigned long*)addr) | ||
954 | #define ext2_find_first_zero_bit(addr, size) \ | ||
955 | find_first_zero_le_bit((unsigned long*)addr, size) | ||
956 | #define ext2_find_next_zero_bit(addr, size, off) \ | ||
957 | find_next_zero_le_bit((unsigned long*)addr, size, off) | ||
958 | |||
959 | /* | ||
960 | * Bitmap functions for the minix filesystem. | ||
961 | * | ||
962 | * FIXME: These assume that Minix uses the native byte/bitorder. | ||
963 | * This limits the Minix filesystem's value for data exchange very much. | ||
964 | */ | ||
965 | #define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr) | ||
966 | #define minix_set_bit(nr,addr) set_bit(nr,addr) | ||
967 | #define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr) | ||
968 | #define minix_test_bit(nr,addr) test_bit(nr,addr) | ||
969 | #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) | ||
970 | 537 | ||
971 | #endif /* __KERNEL__ */ | 538 | #endif /* __KERNEL__ */ |
972 | 539 | ||
diff --git a/include/asm-mips/compat.h b/include/asm-mips/compat.h index 0012bd804d2d..986511db54a6 100644 --- a/include/asm-mips/compat.h +++ b/include/asm-mips/compat.h | |||
@@ -133,6 +133,11 @@ static inline void __user *compat_ptr(compat_uptr_t uptr) | |||
133 | return (void __user *)(long)uptr; | 133 | return (void __user *)(long)uptr; |
134 | } | 134 | } |
135 | 135 | ||
136 | static inline compat_uptr_t ptr_to_compat(void __user *uptr) | ||
137 | { | ||
138 | return (u32)(unsigned long)uptr; | ||
139 | } | ||
140 | |||
136 | static inline void __user *compat_alloc_user_space(long len) | 141 | static inline void __user *compat_alloc_user_space(long len) |
137 | { | 142 | { |
138 | struct pt_regs *regs = (struct pt_regs *) | 143 | struct pt_regs *regs = (struct pt_regs *) |
diff --git a/include/asm-mips/futex.h b/include/asm-mips/futex.h index 2454c44a8f54..a554089991f2 100644 --- a/include/asm-mips/futex.h +++ b/include/asm-mips/futex.h | |||
@@ -99,5 +99,11 @@ futex_atomic_op_inuser (int encoded_op, int __user *uaddr) | |||
99 | return ret; | 99 | return ret; |
100 | } | 100 | } |
101 | 101 | ||
102 | static inline int | ||
103 | futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) | ||
104 | { | ||
105 | return -ENOSYS; | ||
106 | } | ||
107 | |||
102 | #endif | 108 | #endif |
103 | #endif | 109 | #endif |
diff --git a/include/asm-mips/mc146818-time.h b/include/asm-mips/mc146818-time.h index 47214861093b..41ac8d363c67 100644 --- a/include/asm-mips/mc146818-time.h +++ b/include/asm-mips/mc146818-time.h | |||
@@ -86,43 +86,14 @@ static inline int mc146818_set_rtc_mmss(unsigned long nowtime) | |||
86 | return retval; | 86 | return retval; |
87 | } | 87 | } |
88 | 88 | ||
89 | /* | ||
90 | * Returns true if a clock update is in progress | ||
91 | */ | ||
92 | static inline unsigned char rtc_is_updating(void) | ||
93 | { | ||
94 | unsigned char uip; | ||
95 | unsigned long flags; | ||
96 | |||
97 | spin_lock_irqsave(&rtc_lock, flags); | ||
98 | uip = (CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP); | ||
99 | spin_unlock_irqrestore(&rtc_lock, flags); | ||
100 | return uip; | ||
101 | } | ||
102 | |||
103 | static inline unsigned long mc146818_get_cmos_time(void) | 89 | static inline unsigned long mc146818_get_cmos_time(void) |
104 | { | 90 | { |
105 | unsigned int year, mon, day, hour, min, sec; | 91 | unsigned int year, mon, day, hour, min, sec; |
106 | int i; | ||
107 | unsigned long flags; | 92 | unsigned long flags; |
108 | 93 | ||
109 | /* | ||
110 | * The Linux interpretation of the CMOS clock register contents: | ||
111 | * When the Update-In-Progress (UIP) flag goes from 1 to 0, the | ||
112 | * RTC registers show the second which has precisely just started. | ||
113 | * Let's hope other operating systems interpret the RTC the same way. | ||
114 | */ | ||
115 | |||
116 | /* read RTC exactly on falling edge of update flag */ | ||
117 | for (i = 0 ; i < 1000000 ; i++) /* may take up to 1 second... */ | ||
118 | if (rtc_is_updating()) | ||
119 | break; | ||
120 | for (i = 0 ; i < 1000000 ; i++) /* must try at least 2.228 ms */ | ||
121 | if (!rtc_is_updating()) | ||
122 | break; | ||
123 | |||
124 | spin_lock_irqsave(&rtc_lock, flags); | 94 | spin_lock_irqsave(&rtc_lock, flags); |
125 | do { /* Isn't this overkill ? UIP above should guarantee consistency */ | 95 | |
96 | do { | ||
126 | sec = CMOS_READ(RTC_SECONDS); | 97 | sec = CMOS_READ(RTC_SECONDS); |
127 | min = CMOS_READ(RTC_MINUTES); | 98 | min = CMOS_READ(RTC_MINUTES); |
128 | hour = CMOS_READ(RTC_HOURS); | 99 | hour = CMOS_READ(RTC_HOURS); |
diff --git a/include/asm-mips/mmzone.h b/include/asm-mips/mmzone.h index 011caebac369..7bde4432092b 100644 --- a/include/asm-mips/mmzone.h +++ b/include/asm-mips/mmzone.h | |||
@@ -22,20 +22,6 @@ | |||
22 | NODE_DATA(__n)->node_spanned_pages) : 0);\ | 22 | NODE_DATA(__n)->node_spanned_pages) : 0);\ |
23 | }) | 23 | }) |
24 | 24 | ||
25 | #define pfn_to_page(pfn) \ | ||
26 | ({ \ | ||
27 | unsigned long __pfn = (pfn); \ | ||
28 | pg_data_t *__pg = NODE_DATA(pfn_to_nid(__pfn)); \ | ||
29 | __pg->node_mem_map + (__pfn - __pg->node_start_pfn); \ | ||
30 | }) | ||
31 | |||
32 | #define page_to_pfn(p) \ | ||
33 | ({ \ | ||
34 | struct page *__p = (p); \ | ||
35 | struct zone *__z = page_zone(__p); \ | ||
36 | ((__p - __z->zone_mem_map) + __z->zone_start_pfn); \ | ||
37 | }) | ||
38 | |||
39 | /* XXX: FIXME -- wli */ | 25 | /* XXX: FIXME -- wli */ |
40 | #define kern_addr_valid(addr) (0) | 26 | #define kern_addr_valid(addr) (0) |
41 | 27 | ||
diff --git a/include/asm-mips/page.h b/include/asm-mips/page.h index ee25a779bf49..a1eab136ff6c 100644 --- a/include/asm-mips/page.h +++ b/include/asm-mips/page.h | |||
@@ -140,8 +140,6 @@ typedef struct { unsigned long pgprot; } pgprot_t; | |||
140 | #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) | 140 | #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) |
141 | 141 | ||
142 | #ifndef CONFIG_NEED_MULTIPLE_NODES | 142 | #ifndef CONFIG_NEED_MULTIPLE_NODES |
143 | #define pfn_to_page(pfn) (mem_map + (pfn)) | ||
144 | #define page_to_pfn(page) ((unsigned long)((page) - mem_map)) | ||
145 | #define pfn_valid(pfn) ((pfn) < max_mapnr) | 143 | #define pfn_valid(pfn) ((pfn) < max_mapnr) |
146 | #endif | 144 | #endif |
147 | 145 | ||
@@ -160,6 +158,7 @@ typedef struct { unsigned long pgprot; } pgprot_t; | |||
160 | #define WANT_PAGE_VIRTUAL | 158 | #define WANT_PAGE_VIRTUAL |
161 | #endif | 159 | #endif |
162 | 160 | ||
161 | #include <asm-generic/memory_model.h> | ||
163 | #include <asm-generic/page.h> | 162 | #include <asm-generic/page.h> |
164 | 163 | ||
165 | #endif /* _ASM_PAGE_H */ | 164 | #endif /* _ASM_PAGE_H */ |
diff --git a/include/asm-mips/poll.h b/include/asm-mips/poll.h index a000f1f789e3..70881f8c5c50 100644 --- a/include/asm-mips/poll.h +++ b/include/asm-mips/poll.h | |||
@@ -17,6 +17,7 @@ | |||
17 | /* These seem to be more or less nonstandard ... */ | 17 | /* These seem to be more or less nonstandard ... */ |
18 | #define POLLMSG 0x0400 | 18 | #define POLLMSG 0x0400 |
19 | #define POLLREMOVE 0x1000 | 19 | #define POLLREMOVE 0x1000 |
20 | #define POLLRDHUP 0x2000 | ||
20 | 21 | ||
21 | struct pollfd { | 22 | struct pollfd { |
22 | int fd; | 23 | int fd; |
diff --git a/include/asm-mips/serial.h b/include/asm-mips/serial.h index e796d75f027e..7b2366412203 100644 --- a/include/asm-mips/serial.h +++ b/include/asm-mips/serial.h | |||
@@ -103,88 +103,6 @@ | |||
103 | #define IVR_SERIAL_PORT_DEFNS | 103 | #define IVR_SERIAL_PORT_DEFNS |
104 | #endif | 104 | #endif |
105 | 105 | ||
106 | #ifdef CONFIG_SERIAL_AU1X00 | ||
107 | #include <asm/mach-au1x00/au1000.h> | ||
108 | #ifdef CONFIG_SOC_AU1000 | ||
109 | #define AU1000_SERIAL_PORT_DEFNS \ | ||
110 | { .baud_base = 0, .port = UART0_ADDR, \ | ||
111 | .iomem_base = (unsigned char *)UART0_ADDR, \ | ||
112 | .irq = AU1000_UART0_INT, .flags = STD_COM_FLAGS, \ | ||
113 | .iomem_reg_shift = 2 }, \ | ||
114 | { .baud_base = 0, .port = UART1_ADDR, \ | ||
115 | .iomem_base = (unsigned char *)UART1_ADDR, \ | ||
116 | .irq = AU1000_UART1_INT, .flags = STD_COM_FLAGS, \ | ||
117 | .iomem_reg_shift = 2 }, \ | ||
118 | { .baud_base = 0, .port = UART2_ADDR, \ | ||
119 | .iomem_base = (unsigned char *)UART2_ADDR, \ | ||
120 | .irq = AU1000_UART2_INT, .flags = STD_COM_FLAGS, \ | ||
121 | .iomem_reg_shift = 2 }, \ | ||
122 | { .baud_base = 0, .port = UART3_ADDR, \ | ||
123 | .iomem_base = (unsigned char *)UART3_ADDR, \ | ||
124 | .irq = AU1000_UART3_INT, .flags = STD_COM_FLAGS, \ | ||
125 | .iomem_reg_shift = 2 }, | ||
126 | #endif | ||
127 | |||
128 | #ifdef CONFIG_SOC_AU1500 | ||
129 | #define AU1000_SERIAL_PORT_DEFNS \ | ||
130 | { .baud_base = 0, .port = UART0_ADDR, \ | ||
131 | .iomem_base = (unsigned char *)UART0_ADDR, \ | ||
132 | .irq = AU1500_UART0_INT, .flags = STD_COM_FLAGS, \ | ||
133 | .iomem_reg_shift = 2 }, \ | ||
134 | { .baud_base = 0, .port = UART3_ADDR, \ | ||
135 | .iomem_base = (unsigned char *)UART3_ADDR, \ | ||
136 | .irq = AU1500_UART3_INT, .flags = STD_COM_FLAGS, \ | ||
137 | .iomem_reg_shift = 2 }, | ||
138 | #endif | ||
139 | |||
140 | #ifdef CONFIG_SOC_AU1100 | ||
141 | #define AU1000_SERIAL_PORT_DEFNS \ | ||
142 | { .baud_base = 0, .port = UART0_ADDR, \ | ||
143 | .iomem_base = (unsigned char *)UART0_ADDR, \ | ||
144 | .irq = AU1100_UART0_INT, .flags = STD_COM_FLAGS, \ | ||
145 | .iomem_reg_shift = 2 }, \ | ||
146 | { .baud_base = 0, .port = UART1_ADDR, \ | ||
147 | .iomem_base = (unsigned char *)UART1_ADDR, \ | ||
148 | .irq = AU1100_UART1_INT, .flags = STD_COM_FLAGS, \ | ||
149 | .iomem_reg_shift = 2 }, \ | ||
150 | { .baud_base = 0, .port = UART3_ADDR, \ | ||
151 | .iomem_base = (unsigned char *)UART3_ADDR, \ | ||
152 | .irq = AU1100_UART3_INT, .flags = STD_COM_FLAGS, \ | ||
153 | .iomem_reg_shift = 2 }, | ||
154 | #endif | ||
155 | |||
156 | #ifdef CONFIG_SOC_AU1550 | ||
157 | #define AU1000_SERIAL_PORT_DEFNS \ | ||
158 | { .baud_base = 0, .port = UART0_ADDR, \ | ||
159 | .iomem_base = (unsigned char *)UART0_ADDR, \ | ||
160 | .irq = AU1550_UART0_INT, .flags = STD_COM_FLAGS, \ | ||
161 | .iomem_reg_shift = 2 }, \ | ||
162 | { .baud_base = 0, .port = UART1_ADDR, \ | ||
163 | .iomem_base = (unsigned char *)UART1_ADDR, \ | ||
164 | .irq = AU1550_UART1_INT, .flags = STD_COM_FLAGS, \ | ||
165 | .iomem_reg_shift = 2 }, \ | ||
166 | { .baud_base = 0, .port = UART3_ADDR, \ | ||
167 | .iomem_base = (unsigned char *)UART3_ADDR, \ | ||
168 | .irq = AU1550_UART3_INT, .flags = STD_COM_FLAGS,\ | ||
169 | .iomem_reg_shift = 2 }, | ||
170 | #endif | ||
171 | |||
172 | #ifdef CONFIG_SOC_AU1200 | ||
173 | #define AU1000_SERIAL_PORT_DEFNS \ | ||
174 | { .baud_base = 0, .port = UART0_ADDR, \ | ||
175 | .iomem_base = (unsigned char *)UART0_ADDR, \ | ||
176 | .irq = AU1200_UART0_INT, .flags = STD_COM_FLAGS, \ | ||
177 | .iomem_reg_shift = 2 }, \ | ||
178 | { .baud_base = 0, .port = UART1_ADDR, \ | ||
179 | .iomem_base = (unsigned char *)UART1_ADDR, \ | ||
180 | .irq = AU1200_UART1_INT, .flags = STD_COM_FLAGS, \ | ||
181 | .iomem_reg_shift = 2 }, | ||
182 | #endif | ||
183 | |||
184 | #else | ||
185 | #define AU1000_SERIAL_PORT_DEFNS | ||
186 | #endif | ||
187 | |||
188 | #ifdef CONFIG_HAVE_STD_PC_SERIAL_PORT | 106 | #ifdef CONFIG_HAVE_STD_PC_SERIAL_PORT |
189 | #define STD_SERIAL_PORT_DEFNS \ | 107 | #define STD_SERIAL_PORT_DEFNS \ |
190 | /* UART CLK PORT IRQ FLAGS */ \ | 108 | /* UART CLK PORT IRQ FLAGS */ \ |
@@ -331,7 +249,6 @@ | |||
331 | MOMENCO_OCELOT_G_SERIAL_PORT_DEFNS \ | 249 | MOMENCO_OCELOT_G_SERIAL_PORT_DEFNS \ |
332 | MOMENCO_OCELOT_C_SERIAL_PORT_DEFNS \ | 250 | MOMENCO_OCELOT_C_SERIAL_PORT_DEFNS \ |
333 | MOMENCO_OCELOT_SERIAL_PORT_DEFNS \ | 251 | MOMENCO_OCELOT_SERIAL_PORT_DEFNS \ |
334 | MOMENCO_OCELOT_3_SERIAL_PORT_DEFNS \ | 252 | MOMENCO_OCELOT_3_SERIAL_PORT_DEFNS |
335 | AU1000_SERIAL_PORT_DEFNS | ||
336 | 253 | ||
337 | #endif /* _ASM_SERIAL_H */ | 254 | #endif /* _ASM_SERIAL_H */ |
diff --git a/include/asm-mips/time.h b/include/asm-mips/time.h index 9cc3564cc2c9..d897c8bb554d 100644 --- a/include/asm-mips/time.h +++ b/include/asm-mips/time.h | |||
@@ -26,14 +26,14 @@ extern spinlock_t rtc_lock; | |||
26 | 26 | ||
27 | /* | 27 | /* |
28 | * RTC ops. By default, they point to no-RTC functions. | 28 | * RTC ops. By default, they point to no-RTC functions. |
29 | * rtc_get_time - mktime(year, mon, day, hour, min, sec) in seconds. | 29 | * rtc_mips_get_time - mktime(year, mon, day, hour, min, sec) in seconds. |
30 | * rtc_set_time - reverse the above translation and set time to RTC. | 30 | * rtc_mips_set_time - reverse the above translation and set time to RTC. |
31 | * rtc_set_mmss - similar to rtc_set_time, but only min and sec need | 31 | * rtc_mips_set_mmss - similar to rtc_set_time, but only min and sec need |
32 | * to be set. Used by RTC sync-up. | 32 | * to be set. Used by RTC sync-up. |
33 | */ | 33 | */ |
34 | extern unsigned long (*rtc_get_time)(void); | 34 | extern unsigned long (*rtc_mips_get_time)(void); |
35 | extern int (*rtc_set_time)(unsigned long); | 35 | extern int (*rtc_mips_set_time)(unsigned long); |
36 | extern int (*rtc_set_mmss)(unsigned long); | 36 | extern int (*rtc_mips_set_mmss)(unsigned long); |
37 | 37 | ||
38 | /* | 38 | /* |
39 | * Timer interrupt functions. | 39 | * Timer interrupt functions. |
diff --git a/include/asm-mips/types.h b/include/asm-mips/types.h index 421b3aea14cc..cd2813d8e136 100644 --- a/include/asm-mips/types.h +++ b/include/asm-mips/types.h | |||
@@ -99,6 +99,11 @@ typedef u64 sector_t; | |||
99 | #define HAVE_SECTOR_T | 99 | #define HAVE_SECTOR_T |
100 | #endif | 100 | #endif |
101 | 101 | ||
102 | #ifdef CONFIG_LSF | ||
103 | typedef u64 blkcnt_t; | ||
104 | #define HAVE_BLKCNT_T | ||
105 | #endif | ||
106 | |||
102 | #endif /* __ASSEMBLY__ */ | 107 | #endif /* __ASSEMBLY__ */ |
103 | 108 | ||
104 | #endif /* __KERNEL__ */ | 109 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-parisc/bitops.h b/include/asm-parisc/bitops.h index 15d8c2b51584..900561922c4c 100644 --- a/include/asm-parisc/bitops.h +++ b/include/asm-parisc/bitops.h | |||
@@ -35,13 +35,6 @@ static __inline__ void set_bit(int nr, volatile unsigned long * addr) | |||
35 | _atomic_spin_unlock_irqrestore(addr, flags); | 35 | _atomic_spin_unlock_irqrestore(addr, flags); |
36 | } | 36 | } |
37 | 37 | ||
38 | static __inline__ void __set_bit(unsigned long nr, volatile unsigned long * addr) | ||
39 | { | ||
40 | unsigned long *m = (unsigned long *) addr + (nr >> SHIFT_PER_LONG); | ||
41 | |||
42 | *m |= 1UL << CHOP_SHIFTCOUNT(nr); | ||
43 | } | ||
44 | |||
45 | static __inline__ void clear_bit(int nr, volatile unsigned long * addr) | 38 | static __inline__ void clear_bit(int nr, volatile unsigned long * addr) |
46 | { | 39 | { |
47 | unsigned long mask = ~(1UL << CHOP_SHIFTCOUNT(nr)); | 40 | unsigned long mask = ~(1UL << CHOP_SHIFTCOUNT(nr)); |
@@ -53,13 +46,6 @@ static __inline__ void clear_bit(int nr, volatile unsigned long * addr) | |||
53 | _atomic_spin_unlock_irqrestore(addr, flags); | 46 | _atomic_spin_unlock_irqrestore(addr, flags); |
54 | } | 47 | } |
55 | 48 | ||
56 | static __inline__ void __clear_bit(unsigned long nr, volatile unsigned long * addr) | ||
57 | { | ||
58 | unsigned long *m = (unsigned long *) addr + (nr >> SHIFT_PER_LONG); | ||
59 | |||
60 | *m &= ~(1UL << CHOP_SHIFTCOUNT(nr)); | ||
61 | } | ||
62 | |||
63 | static __inline__ void change_bit(int nr, volatile unsigned long * addr) | 49 | static __inline__ void change_bit(int nr, volatile unsigned long * addr) |
64 | { | 50 | { |
65 | unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr); | 51 | unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr); |
@@ -71,13 +57,6 @@ static __inline__ void change_bit(int nr, volatile unsigned long * addr) | |||
71 | _atomic_spin_unlock_irqrestore(addr, flags); | 57 | _atomic_spin_unlock_irqrestore(addr, flags); |
72 | } | 58 | } |
73 | 59 | ||
74 | static __inline__ void __change_bit(unsigned long nr, volatile unsigned long * addr) | ||
75 | { | ||
76 | unsigned long *m = (unsigned long *) addr + (nr >> SHIFT_PER_LONG); | ||
77 | |||
78 | *m ^= 1UL << CHOP_SHIFTCOUNT(nr); | ||
79 | } | ||
80 | |||
81 | static __inline__ int test_and_set_bit(int nr, volatile unsigned long * addr) | 60 | static __inline__ int test_and_set_bit(int nr, volatile unsigned long * addr) |
82 | { | 61 | { |
83 | unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr); | 62 | unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr); |
@@ -93,18 +72,6 @@ static __inline__ int test_and_set_bit(int nr, volatile unsigned long * addr) | |||
93 | return (oldbit & mask) ? 1 : 0; | 72 | return (oldbit & mask) ? 1 : 0; |
94 | } | 73 | } |
95 | 74 | ||
96 | static __inline__ int __test_and_set_bit(int nr, volatile unsigned long * address) | ||
97 | { | ||
98 | unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr); | ||
99 | unsigned long oldbit; | ||
100 | unsigned long *addr = (unsigned long *)address + (nr >> SHIFT_PER_LONG); | ||
101 | |||
102 | oldbit = *addr; | ||
103 | *addr = oldbit | mask; | ||
104 | |||
105 | return (oldbit & mask) ? 1 : 0; | ||
106 | } | ||
107 | |||
108 | static __inline__ int test_and_clear_bit(int nr, volatile unsigned long * addr) | 75 | static __inline__ int test_and_clear_bit(int nr, volatile unsigned long * addr) |
109 | { | 76 | { |
110 | unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr); | 77 | unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr); |
@@ -120,18 +87,6 @@ static __inline__ int test_and_clear_bit(int nr, volatile unsigned long * addr) | |||
120 | return (oldbit & mask) ? 1 : 0; | 87 | return (oldbit & mask) ? 1 : 0; |
121 | } | 88 | } |
122 | 89 | ||
123 | static __inline__ int __test_and_clear_bit(int nr, volatile unsigned long * address) | ||
124 | { | ||
125 | unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr); | ||
126 | unsigned long *addr = (unsigned long *)address + (nr >> SHIFT_PER_LONG); | ||
127 | unsigned long oldbit; | ||
128 | |||
129 | oldbit = *addr; | ||
130 | *addr = oldbit & ~mask; | ||
131 | |||
132 | return (oldbit & mask) ? 1 : 0; | ||
133 | } | ||
134 | |||
135 | static __inline__ int test_and_change_bit(int nr, volatile unsigned long * addr) | 90 | static __inline__ int test_and_change_bit(int nr, volatile unsigned long * addr) |
136 | { | 91 | { |
137 | unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr); | 92 | unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr); |
@@ -147,25 +102,7 @@ static __inline__ int test_and_change_bit(int nr, volatile unsigned long * addr) | |||
147 | return (oldbit & mask) ? 1 : 0; | 102 | return (oldbit & mask) ? 1 : 0; |
148 | } | 103 | } |
149 | 104 | ||
150 | static __inline__ int __test_and_change_bit(int nr, volatile unsigned long * address) | 105 | #include <asm-generic/bitops/non-atomic.h> |
151 | { | ||
152 | unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr); | ||
153 | unsigned long *addr = (unsigned long *)address + (nr >> SHIFT_PER_LONG); | ||
154 | unsigned long oldbit; | ||
155 | |||
156 | oldbit = *addr; | ||
157 | *addr = oldbit ^ mask; | ||
158 | |||
159 | return (oldbit & mask) ? 1 : 0; | ||
160 | } | ||
161 | |||
162 | static __inline__ int test_bit(int nr, const volatile unsigned long *address) | ||
163 | { | ||
164 | unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr); | ||
165 | const unsigned long *addr = (const unsigned long *)address + (nr >> SHIFT_PER_LONG); | ||
166 | |||
167 | return !!(*addr & mask); | ||
168 | } | ||
169 | 106 | ||
170 | #ifdef __KERNEL__ | 107 | #ifdef __KERNEL__ |
171 | 108 | ||
@@ -219,8 +156,7 @@ static __inline__ unsigned long __ffs(unsigned long x) | |||
219 | return ret; | 156 | return ret; |
220 | } | 157 | } |
221 | 158 | ||
222 | /* Undefined if no bit is zero. */ | 159 | #include <asm-generic/bitops/ffz.h> |
223 | #define ffz(x) __ffs(~x) | ||
224 | 160 | ||
225 | /* | 161 | /* |
226 | * ffs: find first bit set. returns 1 to BITS_PER_LONG or 0 (if none set) | 162 | * ffs: find first bit set. returns 1 to BITS_PER_LONG or 0 (if none set) |
@@ -263,155 +199,22 @@ static __inline__ int fls(int x) | |||
263 | 199 | ||
264 | return ret; | 200 | return ret; |
265 | } | 201 | } |
266 | #define fls64(x) generic_fls64(x) | ||
267 | 202 | ||
268 | /* | 203 | #include <asm-generic/bitops/fls64.h> |
269 | * hweightN: returns the hamming weight (i.e. the number | 204 | #include <asm-generic/bitops/hweight.h> |
270 | * of bits set) of a N-bit word | 205 | #include <asm-generic/bitops/sched.h> |
271 | */ | ||
272 | #define hweight64(x) generic_hweight64(x) | ||
273 | #define hweight32(x) generic_hweight32(x) | ||
274 | #define hweight16(x) generic_hweight16(x) | ||
275 | #define hweight8(x) generic_hweight8(x) | ||
276 | |||
277 | /* | ||
278 | * Every architecture must define this function. It's the fastest | ||
279 | * way of searching a 140-bit bitmap where the first 100 bits are | ||
280 | * unlikely to be set. It's guaranteed that at least one of the 140 | ||
281 | * bits is cleared. | ||
282 | */ | ||
283 | static inline int sched_find_first_bit(const unsigned long *b) | ||
284 | { | ||
285 | #ifdef __LP64__ | ||
286 | if (unlikely(b[0])) | ||
287 | return __ffs(b[0]); | ||
288 | if (unlikely(b[1])) | ||
289 | return __ffs(b[1]) + 64; | ||
290 | return __ffs(b[2]) + 128; | ||
291 | #else | ||
292 | if (unlikely(b[0])) | ||
293 | return __ffs(b[0]); | ||
294 | if (unlikely(b[1])) | ||
295 | return __ffs(b[1]) + 32; | ||
296 | if (unlikely(b[2])) | ||
297 | return __ffs(b[2]) + 64; | ||
298 | if (b[3]) | ||
299 | return __ffs(b[3]) + 96; | ||
300 | return __ffs(b[4]) + 128; | ||
301 | #endif | ||
302 | } | ||
303 | 206 | ||
304 | #endif /* __KERNEL__ */ | 207 | #endif /* __KERNEL__ */ |
305 | 208 | ||
306 | /* | 209 | #include <asm-generic/bitops/find.h> |
307 | * This implementation of find_{first,next}_zero_bit was stolen from | ||
308 | * Linus' asm-alpha/bitops.h. | ||
309 | */ | ||
310 | #define find_first_zero_bit(addr, size) \ | ||
311 | find_next_zero_bit((addr), (size), 0) | ||
312 | |||
313 | static __inline__ unsigned long find_next_zero_bit(const void * addr, unsigned long size, unsigned long offset) | ||
314 | { | ||
315 | const unsigned long * p = ((unsigned long *) addr) + (offset >> SHIFT_PER_LONG); | ||
316 | unsigned long result = offset & ~(BITS_PER_LONG-1); | ||
317 | unsigned long tmp; | ||
318 | |||
319 | if (offset >= size) | ||
320 | return size; | ||
321 | size -= result; | ||
322 | offset &= (BITS_PER_LONG-1); | ||
323 | if (offset) { | ||
324 | tmp = *(p++); | ||
325 | tmp |= ~0UL >> (BITS_PER_LONG-offset); | ||
326 | if (size < BITS_PER_LONG) | ||
327 | goto found_first; | ||
328 | if (~tmp) | ||
329 | goto found_middle; | ||
330 | size -= BITS_PER_LONG; | ||
331 | result += BITS_PER_LONG; | ||
332 | } | ||
333 | while (size & ~(BITS_PER_LONG -1)) { | ||
334 | if (~(tmp = *(p++))) | ||
335 | goto found_middle; | ||
336 | result += BITS_PER_LONG; | ||
337 | size -= BITS_PER_LONG; | ||
338 | } | ||
339 | if (!size) | ||
340 | return result; | ||
341 | tmp = *p; | ||
342 | found_first: | ||
343 | tmp |= ~0UL << size; | ||
344 | found_middle: | ||
345 | return result + ffz(tmp); | ||
346 | } | ||
347 | |||
348 | static __inline__ unsigned long find_next_bit(const unsigned long *addr, unsigned long size, unsigned long offset) | ||
349 | { | ||
350 | const unsigned long *p = addr + (offset >> SHIFT_PER_LONG); | ||
351 | unsigned long result = offset & ~(BITS_PER_LONG-1); | ||
352 | unsigned long tmp; | ||
353 | |||
354 | if (offset >= size) | ||
355 | return size; | ||
356 | size -= result; | ||
357 | offset &= (BITS_PER_LONG-1); | ||
358 | if (offset) { | ||
359 | tmp = *(p++); | ||
360 | tmp &= (~0UL << offset); | ||
361 | if (size < BITS_PER_LONG) | ||
362 | goto found_first; | ||
363 | if (tmp) | ||
364 | goto found_middle; | ||
365 | size -= BITS_PER_LONG; | ||
366 | result += BITS_PER_LONG; | ||
367 | } | ||
368 | while (size & ~(BITS_PER_LONG-1)) { | ||
369 | if ((tmp = *(p++))) | ||
370 | goto found_middle; | ||
371 | result += BITS_PER_LONG; | ||
372 | size -= BITS_PER_LONG; | ||
373 | } | ||
374 | if (!size) | ||
375 | return result; | ||
376 | tmp = *p; | ||
377 | |||
378 | found_first: | ||
379 | tmp &= (~0UL >> (BITS_PER_LONG - size)); | ||
380 | if (tmp == 0UL) /* Are any bits set? */ | ||
381 | return result + size; /* Nope. */ | ||
382 | found_middle: | ||
383 | return result + __ffs(tmp); | ||
384 | } | ||
385 | |||
386 | /** | ||
387 | * find_first_bit - find the first set bit in a memory region | ||
388 | * @addr: The address to start the search at | ||
389 | * @size: The maximum size to search | ||
390 | * | ||
391 | * Returns the bit-number of the first set bit, not the number of the byte | ||
392 | * containing a bit. | ||
393 | */ | ||
394 | #define find_first_bit(addr, size) \ | ||
395 | find_next_bit((addr), (size), 0) | ||
396 | |||
397 | #define _EXT2_HAVE_ASM_BITOPS_ | ||
398 | 210 | ||
399 | #ifdef __KERNEL__ | 211 | #ifdef __KERNEL__ |
400 | /* | 212 | |
401 | * test_and_{set,clear}_bit guarantee atomicity without | 213 | #include <asm-generic/bitops/ext2-non-atomic.h> |
402 | * disabling interrupts. | ||
403 | */ | ||
404 | 214 | ||
405 | /* '3' is bits per byte */ | 215 | /* '3' is bits per byte */ |
406 | #define LE_BYTE_ADDR ((sizeof(unsigned long) - 1) << 3) | 216 | #define LE_BYTE_ADDR ((sizeof(unsigned long) - 1) << 3) |
407 | 217 | ||
408 | #define ext2_test_bit(nr, addr) \ | ||
409 | test_bit((nr) ^ LE_BYTE_ADDR, (unsigned long *)addr) | ||
410 | #define ext2_set_bit(nr, addr) \ | ||
411 | __test_and_set_bit((nr) ^ LE_BYTE_ADDR, (unsigned long *)addr) | ||
412 | #define ext2_clear_bit(nr, addr) \ | ||
413 | __test_and_clear_bit((nr) ^ LE_BYTE_ADDR, (unsigned long *)addr) | ||
414 | |||
415 | #define ext2_set_bit_atomic(l,nr,addr) \ | 218 | #define ext2_set_bit_atomic(l,nr,addr) \ |
416 | test_and_set_bit((nr) ^ LE_BYTE_ADDR, (unsigned long *)addr) | 219 | test_and_set_bit((nr) ^ LE_BYTE_ADDR, (unsigned long *)addr) |
417 | #define ext2_clear_bit_atomic(l,nr,addr) \ | 220 | #define ext2_clear_bit_atomic(l,nr,addr) \ |
@@ -419,77 +222,6 @@ found_middle: | |||
419 | 222 | ||
420 | #endif /* __KERNEL__ */ | 223 | #endif /* __KERNEL__ */ |
421 | 224 | ||
422 | 225 | #include <asm-generic/bitops/minix-le.h> | |
423 | #define ext2_find_first_zero_bit(addr, size) \ | ||
424 | ext2_find_next_zero_bit((addr), (size), 0) | ||
425 | |||
426 | /* include/linux/byteorder does not support "unsigned long" type */ | ||
427 | static inline unsigned long ext2_swabp(unsigned long * x) | ||
428 | { | ||
429 | #ifdef __LP64__ | ||
430 | return (unsigned long) __swab64p((u64 *) x); | ||
431 | #else | ||
432 | return (unsigned long) __swab32p((u32 *) x); | ||
433 | #endif | ||
434 | } | ||
435 | |||
436 | /* include/linux/byteorder doesn't support "unsigned long" type */ | ||
437 | static inline unsigned long ext2_swab(unsigned long y) | ||
438 | { | ||
439 | #ifdef __LP64__ | ||
440 | return (unsigned long) __swab64((u64) y); | ||
441 | #else | ||
442 | return (unsigned long) __swab32((u32) y); | ||
443 | #endif | ||
444 | } | ||
445 | |||
446 | static __inline__ unsigned long ext2_find_next_zero_bit(void *addr, unsigned long size, unsigned long offset) | ||
447 | { | ||
448 | unsigned long *p = (unsigned long *) addr + (offset >> SHIFT_PER_LONG); | ||
449 | unsigned long result = offset & ~(BITS_PER_LONG - 1); | ||
450 | unsigned long tmp; | ||
451 | |||
452 | if (offset >= size) | ||
453 | return size; | ||
454 | size -= result; | ||
455 | offset &= (BITS_PER_LONG - 1UL); | ||
456 | if (offset) { | ||
457 | tmp = ext2_swabp(p++); | ||
458 | tmp |= (~0UL >> (BITS_PER_LONG - offset)); | ||
459 | if (size < BITS_PER_LONG) | ||
460 | goto found_first; | ||
461 | if (~tmp) | ||
462 | goto found_middle; | ||
463 | size -= BITS_PER_LONG; | ||
464 | result += BITS_PER_LONG; | ||
465 | } | ||
466 | |||
467 | while (size & ~(BITS_PER_LONG - 1)) { | ||
468 | if (~(tmp = *(p++))) | ||
469 | goto found_middle_swap; | ||
470 | result += BITS_PER_LONG; | ||
471 | size -= BITS_PER_LONG; | ||
472 | } | ||
473 | if (!size) | ||
474 | return result; | ||
475 | tmp = ext2_swabp(p); | ||
476 | found_first: | ||
477 | tmp |= ~0UL << size; | ||
478 | if (tmp == ~0UL) /* Are any bits zero? */ | ||
479 | return result + size; /* Nope. Skip ffz */ | ||
480 | found_middle: | ||
481 | return result + ffz(tmp); | ||
482 | |||
483 | found_middle_swap: | ||
484 | return result + ffz(ext2_swab(tmp)); | ||
485 | } | ||
486 | |||
487 | |||
488 | /* Bitmap functions for the minix filesystem. */ | ||
489 | #define minix_test_and_set_bit(nr,addr) ext2_set_bit(nr,addr) | ||
490 | #define minix_set_bit(nr,addr) ((void)ext2_set_bit(nr,addr)) | ||
491 | #define minix_test_and_clear_bit(nr,addr) ext2_clear_bit(nr,addr) | ||
492 | #define minix_test_bit(nr,addr) ext2_test_bit(nr,addr) | ||
493 | #define minix_find_first_zero_bit(addr,size) ext2_find_first_zero_bit(addr,size) | ||
494 | 226 | ||
495 | #endif /* _PARISC_BITOPS_H */ | 227 | #endif /* _PARISC_BITOPS_H */ |
diff --git a/include/asm-parisc/compat.h b/include/asm-parisc/compat.h index 38b918feead9..289624d8b2d4 100644 --- a/include/asm-parisc/compat.h +++ b/include/asm-parisc/compat.h | |||
@@ -138,6 +138,11 @@ static inline void __user *compat_ptr(compat_uptr_t uptr) | |||
138 | return (void __user *)(unsigned long)uptr; | 138 | return (void __user *)(unsigned long)uptr; |
139 | } | 139 | } |
140 | 140 | ||
141 | static inline compat_uptr_t ptr_to_compat(void __user *uptr) | ||
142 | { | ||
143 | return (u32)(unsigned long)uptr; | ||
144 | } | ||
145 | |||
141 | static __inline__ void __user *compat_alloc_user_space(long len) | 146 | static __inline__ void __user *compat_alloc_user_space(long len) |
142 | { | 147 | { |
143 | struct pt_regs *regs = ¤t->thread.regs; | 148 | struct pt_regs *regs = ¤t->thread.regs; |
diff --git a/include/asm-parisc/mmzone.h b/include/asm-parisc/mmzone.h index ae039f4fd711..ceb9b73199d1 100644 --- a/include/asm-parisc/mmzone.h +++ b/include/asm-parisc/mmzone.h | |||
@@ -25,23 +25,6 @@ extern struct node_map_data node_data[]; | |||
25 | pg_data_t *__pgdat = NODE_DATA(nid); \ | 25 | pg_data_t *__pgdat = NODE_DATA(nid); \ |
26 | __pgdat->node_start_pfn + __pgdat->node_spanned_pages; \ | 26 | __pgdat->node_start_pfn + __pgdat->node_spanned_pages; \ |
27 | }) | 27 | }) |
28 | #define node_localnr(pfn, nid) ((pfn) - node_start_pfn(nid)) | ||
29 | |||
30 | #define pfn_to_page(pfn) \ | ||
31 | ({ \ | ||
32 | unsigned long __pfn = (pfn); \ | ||
33 | int __node = pfn_to_nid(__pfn); \ | ||
34 | &NODE_DATA(__node)->node_mem_map[node_localnr(__pfn,__node)]; \ | ||
35 | }) | ||
36 | |||
37 | #define page_to_pfn(pg) \ | ||
38 | ({ \ | ||
39 | struct page *__page = pg; \ | ||
40 | struct zone *__zone = page_zone(__page); \ | ||
41 | BUG_ON(__zone == NULL); \ | ||
42 | (unsigned long)(__page - __zone->zone_mem_map) \ | ||
43 | + __zone->zone_start_pfn; \ | ||
44 | }) | ||
45 | 28 | ||
46 | /* We have these possible memory map layouts: | 29 | /* We have these possible memory map layouts: |
47 | * Astro: 0-3.75, 67.75-68, 4-64 | 30 | * Astro: 0-3.75, 67.75-68, 4-64 |
diff --git a/include/asm-parisc/page.h b/include/asm-parisc/page.h index 4a6752b0afed..9f303c0c3cd7 100644 --- a/include/asm-parisc/page.h +++ b/include/asm-parisc/page.h | |||
@@ -130,8 +130,6 @@ extern int npmem_ranges; | |||
130 | #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) | 130 | #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) |
131 | 131 | ||
132 | #ifndef CONFIG_DISCONTIGMEM | 132 | #ifndef CONFIG_DISCONTIGMEM |
133 | #define pfn_to_page(pfn) (mem_map + (pfn)) | ||
134 | #define page_to_pfn(page) ((unsigned long)((page) - mem_map)) | ||
135 | #define pfn_valid(pfn) ((pfn) < max_mapnr) | 133 | #define pfn_valid(pfn) ((pfn) < max_mapnr) |
136 | #endif /* CONFIG_DISCONTIGMEM */ | 134 | #endif /* CONFIG_DISCONTIGMEM */ |
137 | 135 | ||
@@ -152,6 +150,7 @@ extern int npmem_ranges; | |||
152 | 150 | ||
153 | #endif /* __KERNEL__ */ | 151 | #endif /* __KERNEL__ */ |
154 | 152 | ||
153 | #include <asm-generic/memory_model.h> | ||
155 | #include <asm-generic/page.h> | 154 | #include <asm-generic/page.h> |
156 | 155 | ||
157 | #endif /* _PARISC_PAGE_H */ | 156 | #endif /* _PARISC_PAGE_H */ |
diff --git a/include/asm-parisc/pdc.h b/include/asm-parisc/pdc.h index 8e23e4c674f6..0a3face6c480 100644 --- a/include/asm-parisc/pdc.h +++ b/include/asm-parisc/pdc.h | |||
@@ -333,7 +333,7 @@ struct pdc_model { /* for PDC_MODEL */ | |||
333 | unsigned long curr_key; | 333 | unsigned long curr_key; |
334 | }; | 334 | }; |
335 | 335 | ||
336 | /* Values for PDC_MODEL_CAPABILITES non-equivalent virtual aliasing support */ | 336 | /* Values for PDC_MODEL_CAPABILITIES non-equivalent virtual aliasing support */ |
337 | 337 | ||
338 | #define PDC_MODEL_IOPDIR_FDC (1 << 2) /* see sba_iommu.c */ | 338 | #define PDC_MODEL_IOPDIR_FDC (1 << 2) /* see sba_iommu.c */ |
339 | #define PDC_MODEL_NVA_MASK (3 << 4) | 339 | #define PDC_MODEL_NVA_MASK (3 << 4) |
diff --git a/include/asm-parisc/poll.h b/include/asm-parisc/poll.h index 1c1da86934cf..20e4d03c74cb 100644 --- a/include/asm-parisc/poll.h +++ b/include/asm-parisc/poll.h | |||
@@ -16,6 +16,7 @@ | |||
16 | #define POLLWRBAND 0x0200 | 16 | #define POLLWRBAND 0x0200 |
17 | #define POLLMSG 0x0400 | 17 | #define POLLMSG 0x0400 |
18 | #define POLLREMOVE 0x1000 | 18 | #define POLLREMOVE 0x1000 |
19 | #define POLLRDHUP 0x2000 | ||
19 | 20 | ||
20 | struct pollfd { | 21 | struct pollfd { |
21 | int fd; | 22 | int fd; |
diff --git a/include/asm-powerpc/bitops.h b/include/asm-powerpc/bitops.h index bf6941a810b8..d1c2a4405660 100644 --- a/include/asm-powerpc/bitops.h +++ b/include/asm-powerpc/bitops.h | |||
@@ -184,72 +184,7 @@ static __inline__ void set_bits(unsigned long mask, unsigned long *addr) | |||
184 | : "cc"); | 184 | : "cc"); |
185 | } | 185 | } |
186 | 186 | ||
187 | /* Non-atomic versions */ | 187 | #include <asm-generic/bitops/non-atomic.h> |
188 | static __inline__ int test_bit(unsigned long nr, | ||
189 | __const__ volatile unsigned long *addr) | ||
190 | { | ||
191 | return 1UL & (addr[BITOP_WORD(nr)] >> (nr & (BITS_PER_LONG-1))); | ||
192 | } | ||
193 | |||
194 | static __inline__ void __set_bit(unsigned long nr, | ||
195 | volatile unsigned long *addr) | ||
196 | { | ||
197 | unsigned long mask = BITOP_MASK(nr); | ||
198 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
199 | |||
200 | *p |= mask; | ||
201 | } | ||
202 | |||
203 | static __inline__ void __clear_bit(unsigned long nr, | ||
204 | volatile unsigned long *addr) | ||
205 | { | ||
206 | unsigned long mask = BITOP_MASK(nr); | ||
207 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
208 | |||
209 | *p &= ~mask; | ||
210 | } | ||
211 | |||
212 | static __inline__ void __change_bit(unsigned long nr, | ||
213 | volatile unsigned long *addr) | ||
214 | { | ||
215 | unsigned long mask = BITOP_MASK(nr); | ||
216 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
217 | |||
218 | *p ^= mask; | ||
219 | } | ||
220 | |||
221 | static __inline__ int __test_and_set_bit(unsigned long nr, | ||
222 | volatile unsigned long *addr) | ||
223 | { | ||
224 | unsigned long mask = BITOP_MASK(nr); | ||
225 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
226 | unsigned long old = *p; | ||
227 | |||
228 | *p = old | mask; | ||
229 | return (old & mask) != 0; | ||
230 | } | ||
231 | |||
232 | static __inline__ int __test_and_clear_bit(unsigned long nr, | ||
233 | volatile unsigned long *addr) | ||
234 | { | ||
235 | unsigned long mask = BITOP_MASK(nr); | ||
236 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
237 | unsigned long old = *p; | ||
238 | |||
239 | *p = old & ~mask; | ||
240 | return (old & mask) != 0; | ||
241 | } | ||
242 | |||
243 | static __inline__ int __test_and_change_bit(unsigned long nr, | ||
244 | volatile unsigned long *addr) | ||
245 | { | ||
246 | unsigned long mask = BITOP_MASK(nr); | ||
247 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
248 | unsigned long old = *p; | ||
249 | |||
250 | *p = old ^ mask; | ||
251 | return (old & mask) != 0; | ||
252 | } | ||
253 | 188 | ||
254 | /* | 189 | /* |
255 | * Return the zero-based bit position (LE, not IBM bit numbering) of | 190 | * Return the zero-based bit position (LE, not IBM bit numbering) of |
@@ -310,16 +245,9 @@ static __inline__ int fls(unsigned int x) | |||
310 | asm ("cntlzw %0,%1" : "=r" (lz) : "r" (x)); | 245 | asm ("cntlzw %0,%1" : "=r" (lz) : "r" (x)); |
311 | return 32 - lz; | 246 | return 32 - lz; |
312 | } | 247 | } |
313 | #define fls64(x) generic_fls64(x) | 248 | #include <asm-generic/bitops/fls64.h> |
314 | 249 | ||
315 | /* | 250 | #include <asm-generic/bitops/hweight.h> |
316 | * hweightN: returns the hamming weight (i.e. the number | ||
317 | * of bits set) of a N-bit word | ||
318 | */ | ||
319 | #define hweight64(x) generic_hweight64(x) | ||
320 | #define hweight32(x) generic_hweight32(x) | ||
321 | #define hweight16(x) generic_hweight16(x) | ||
322 | #define hweight8(x) generic_hweight8(x) | ||
323 | 251 | ||
324 | #define find_first_zero_bit(addr, size) find_next_zero_bit((addr), (size), 0) | 252 | #define find_first_zero_bit(addr, size) find_next_zero_bit((addr), (size), 0) |
325 | unsigned long find_next_zero_bit(const unsigned long *addr, | 253 | unsigned long find_next_zero_bit(const unsigned long *addr, |
@@ -397,32 +325,7 @@ unsigned long find_next_zero_le_bit(const unsigned long *addr, | |||
397 | #define minix_find_first_zero_bit(addr,size) \ | 325 | #define minix_find_first_zero_bit(addr,size) \ |
398 | find_first_zero_le_bit((unsigned long *)addr, size) | 326 | find_first_zero_le_bit((unsigned long *)addr, size) |
399 | 327 | ||
400 | /* | 328 | #include <asm-generic/bitops/sched.h> |
401 | * Every architecture must define this function. It's the fastest | ||
402 | * way of searching a 140-bit bitmap where the first 100 bits are | ||
403 | * unlikely to be set. It's guaranteed that at least one of the 140 | ||
404 | * bits is cleared. | ||
405 | */ | ||
406 | static inline int sched_find_first_bit(const unsigned long *b) | ||
407 | { | ||
408 | #ifdef CONFIG_PPC64 | ||
409 | if (unlikely(b[0])) | ||
410 | return __ffs(b[0]); | ||
411 | if (unlikely(b[1])) | ||
412 | return __ffs(b[1]) + 64; | ||
413 | return __ffs(b[2]) + 128; | ||
414 | #else | ||
415 | if (unlikely(b[0])) | ||
416 | return __ffs(b[0]); | ||
417 | if (unlikely(b[1])) | ||
418 | return __ffs(b[1]) + 32; | ||
419 | if (unlikely(b[2])) | ||
420 | return __ffs(b[2]) + 64; | ||
421 | if (b[3]) | ||
422 | return __ffs(b[3]) + 96; | ||
423 | return __ffs(b[4]) + 128; | ||
424 | #endif | ||
425 | } | ||
426 | 329 | ||
427 | #endif /* __KERNEL__ */ | 330 | #endif /* __KERNEL__ */ |
428 | 331 | ||
diff --git a/include/asm-powerpc/bug.h b/include/asm-powerpc/bug.h index 99817a802ca4..f44b529e3298 100644 --- a/include/asm-powerpc/bug.h +++ b/include/asm-powerpc/bug.h | |||
@@ -30,34 +30,60 @@ struct bug_entry *find_bug(unsigned long bugaddr); | |||
30 | 30 | ||
31 | #ifdef CONFIG_BUG | 31 | #ifdef CONFIG_BUG |
32 | 32 | ||
33 | /* | ||
34 | * BUG_ON() and WARN_ON() do their best to cooperate with compile-time | ||
35 | * optimisations. However depending on the complexity of the condition | ||
36 | * some compiler versions may not produce optimal results. | ||
37 | */ | ||
38 | |||
33 | #define BUG() do { \ | 39 | #define BUG() do { \ |
34 | __asm__ __volatile__( \ | 40 | __asm__ __volatile__( \ |
35 | "1: twi 31,0,0\n" \ | 41 | "1: twi 31,0,0\n" \ |
36 | ".section __bug_table,\"a\"\n" \ | 42 | ".section __bug_table,\"a\"\n" \ |
37 | "\t"PPC_LONG" 1b,%0,%1,%2\n" \ | 43 | "\t"PPC_LONG" 1b,%0,%1,%2\n" \ |
38 | ".previous" \ | 44 | ".previous" \ |
39 | : : "i" (__LINE__), "i" (__FILE__), "i" (__FUNCTION__)); \ | 45 | : : "i" (__LINE__), "i" (__FILE__), "i" (__FUNCTION__)); \ |
40 | } while (0) | 46 | } while (0) |
41 | 47 | ||
42 | #define BUG_ON(x) do { \ | 48 | #define BUG_ON(x) do { \ |
43 | __asm__ __volatile__( \ | 49 | if (__builtin_constant_p(x)) { \ |
50 | if (x) \ | ||
51 | BUG(); \ | ||
52 | } else { \ | ||
53 | __asm__ __volatile__( \ | ||
44 | "1: "PPC_TLNEI" %0,0\n" \ | 54 | "1: "PPC_TLNEI" %0,0\n" \ |
45 | ".section __bug_table,\"a\"\n" \ | 55 | ".section __bug_table,\"a\"\n" \ |
46 | "\t"PPC_LONG" 1b,%1,%2,%3\n" \ | 56 | "\t"PPC_LONG" 1b,%1,%2,%3\n" \ |
47 | ".previous" \ | 57 | ".previous" \ |
48 | : : "r" ((long)(x)), "i" (__LINE__), \ | 58 | : : "r" ((long)(x)), "i" (__LINE__), \ |
49 | "i" (__FILE__), "i" (__FUNCTION__)); \ | 59 | "i" (__FILE__), "i" (__FUNCTION__)); \ |
60 | } \ | ||
50 | } while (0) | 61 | } while (0) |
51 | 62 | ||
52 | #define WARN_ON(x) do { \ | 63 | #define __WARN() do { \ |
53 | __asm__ __volatile__( \ | 64 | __asm__ __volatile__( \ |
65 | "1: twi 31,0,0\n" \ | ||
66 | ".section __bug_table,\"a\"\n" \ | ||
67 | "\t"PPC_LONG" 1b,%0,%1,%2\n" \ | ||
68 | ".previous" \ | ||
69 | : : "i" (__LINE__ + BUG_WARNING_TRAP), \ | ||
70 | "i" (__FILE__), "i" (__FUNCTION__)); \ | ||
71 | } while (0) | ||
72 | |||
73 | #define WARN_ON(x) do { \ | ||
74 | if (__builtin_constant_p(x)) { \ | ||
75 | if (x) \ | ||
76 | __WARN(); \ | ||
77 | } else { \ | ||
78 | __asm__ __volatile__( \ | ||
54 | "1: "PPC_TLNEI" %0,0\n" \ | 79 | "1: "PPC_TLNEI" %0,0\n" \ |
55 | ".section __bug_table,\"a\"\n" \ | 80 | ".section __bug_table,\"a\"\n" \ |
56 | "\t"PPC_LONG" 1b,%1,%2,%3\n" \ | 81 | "\t"PPC_LONG" 1b,%1,%2,%3\n" \ |
57 | ".previous" \ | 82 | ".previous" \ |
58 | : : "r" ((long)(x)), \ | 83 | : : "r" ((long)(x)), \ |
59 | "i" (__LINE__ + BUG_WARNING_TRAP), \ | 84 | "i" (__LINE__ + BUG_WARNING_TRAP), \ |
60 | "i" (__FILE__), "i" (__FUNCTION__)); \ | 85 | "i" (__FILE__), "i" (__FUNCTION__)); \ |
86 | } \ | ||
61 | } while (0) | 87 | } while (0) |
62 | 88 | ||
63 | #define HAVE_ARCH_BUG | 89 | #define HAVE_ARCH_BUG |
diff --git a/include/asm-powerpc/cputable.h b/include/asm-powerpc/cputable.h index fe45f6f3a4be..4321483cce51 100644 --- a/include/asm-powerpc/cputable.h +++ b/include/asm-powerpc/cputable.h | |||
@@ -188,153 +188,154 @@ extern void do_cpu_ftr_fixups(unsigned long offset); | |||
188 | !defined(CONFIG_POWER3) && !defined(CONFIG_POWER4) && \ | 188 | !defined(CONFIG_POWER3) && !defined(CONFIG_POWER4) && \ |
189 | !defined(CONFIG_BOOKE)) | 189 | !defined(CONFIG_BOOKE)) |
190 | 190 | ||
191 | enum { | 191 | #define CPU_FTRS_PPC601 (CPU_FTR_COMMON | CPU_FTR_601 | CPU_FTR_HPTE_TABLE) |
192 | CPU_FTRS_PPC601 = CPU_FTR_COMMON | CPU_FTR_601 | CPU_FTR_HPTE_TABLE, | 192 | #define CPU_FTRS_603 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
193 | CPU_FTRS_603 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 193 | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | \ |
194 | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | | 194 | CPU_FTR_MAYBE_CAN_NAP) |
195 | CPU_FTR_MAYBE_CAN_NAP, | 195 | #define CPU_FTRS_604 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
196 | CPU_FTRS_604 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 196 | CPU_FTR_USE_TB | CPU_FTR_604_PERF_MON | CPU_FTR_HPTE_TABLE) |
197 | CPU_FTR_USE_TB | CPU_FTR_604_PERF_MON | CPU_FTR_HPTE_TABLE, | 197 | #define CPU_FTRS_740_NOTAU (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
198 | CPU_FTRS_740_NOTAU = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 198 | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \ |
199 | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | | 199 | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP) |
200 | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP, | 200 | #define CPU_FTRS_740 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
201 | CPU_FTRS_740 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 201 | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \ |
202 | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | | 202 | CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP) |
203 | CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP, | 203 | #define CPU_FTRS_750 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
204 | CPU_FTRS_750 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 204 | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \ |
205 | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | | 205 | CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP) |
206 | CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP, | 206 | #define CPU_FTRS_750FX1 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
207 | CPU_FTRS_750FX1 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 207 | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \ |
208 | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | | 208 | CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | \ |
209 | CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | | 209 | CPU_FTR_DUAL_PLL_750FX | CPU_FTR_NO_DPM) |
210 | CPU_FTR_DUAL_PLL_750FX | CPU_FTR_NO_DPM, | 210 | #define CPU_FTRS_750FX2 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
211 | CPU_FTRS_750FX2 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 211 | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \ |
212 | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | | 212 | CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | \ |
213 | CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | | 213 | CPU_FTR_NO_DPM) |
214 | CPU_FTR_NO_DPM, | 214 | #define CPU_FTRS_750FX (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
215 | CPU_FTRS_750FX = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 215 | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \ |
216 | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | | 216 | CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | \ |
217 | CPU_FTR_TAU | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | | 217 | CPU_FTR_DUAL_PLL_750FX | CPU_FTR_HAS_HIGH_BATS) |
218 | CPU_FTR_DUAL_PLL_750FX | CPU_FTR_HAS_HIGH_BATS, | 218 | #define CPU_FTRS_750GX (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE | \ |
219 | CPU_FTRS_750GX = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE | | 219 | CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU | \ |
220 | CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_TAU | | 220 | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | \ |
221 | CPU_FTR_HPTE_TABLE | CPU_FTR_MAYBE_CAN_NAP | | 221 | CPU_FTR_DUAL_PLL_750FX | CPU_FTR_HAS_HIGH_BATS) |
222 | CPU_FTR_DUAL_PLL_750FX | CPU_FTR_HAS_HIGH_BATS, | 222 | #define CPU_FTRS_7400_NOTAU (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
223 | CPU_FTRS_7400_NOTAU = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 223 | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \ |
224 | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | | 224 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE | \ |
225 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE | | 225 | CPU_FTR_MAYBE_CAN_NAP) |
226 | CPU_FTR_MAYBE_CAN_NAP, | 226 | #define CPU_FTRS_7400 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
227 | CPU_FTRS_7400 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 227 | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \ |
228 | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | | 228 | CPU_FTR_TAU | CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE | \ |
229 | CPU_FTR_TAU | CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE | | 229 | CPU_FTR_MAYBE_CAN_NAP) |
230 | CPU_FTR_MAYBE_CAN_NAP, | 230 | #define CPU_FTRS_7450_20 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
231 | CPU_FTRS_7450_20 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 231 | CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \ |
232 | CPU_FTR_USE_TB | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | | 232 | CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \ |
233 | CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | | 233 | CPU_FTR_NEED_COHERENT) |
234 | CPU_FTR_NEED_COHERENT, | 234 | #define CPU_FTRS_7450_21 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
235 | CPU_FTRS_7450_21 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 235 | CPU_FTR_USE_TB | \ |
236 | CPU_FTR_USE_TB | | 236 | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \ |
237 | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | | 237 | CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \ |
238 | CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | | 238 | CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_L3_DISABLE_NAP | \ |
239 | CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_L3_DISABLE_NAP | | 239 | CPU_FTR_NEED_COHERENT) |
240 | CPU_FTR_NEED_COHERENT, | 240 | #define CPU_FTRS_7450_23 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
241 | CPU_FTRS_7450_23 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 241 | CPU_FTR_USE_TB | \ |
242 | CPU_FTR_USE_TB | | 242 | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \ |
243 | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | | 243 | CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \ |
244 | CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | | 244 | CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_NEED_COHERENT) |
245 | CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_NEED_COHERENT, | 245 | #define CPU_FTRS_7455_1 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
246 | CPU_FTRS_7455_1 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 246 | CPU_FTR_USE_TB | \ |
247 | CPU_FTR_USE_TB | | 247 | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR | \ |
248 | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | CPU_FTR_L3CR | | 248 | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | CPU_FTR_HAS_HIGH_BATS | \ |
249 | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | CPU_FTR_HAS_HIGH_BATS | | 249 | CPU_FTR_NEED_COHERENT) |
250 | CPU_FTR_NEED_COHERENT, | 250 | #define CPU_FTRS_7455_20 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
251 | CPU_FTRS_7455_20 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 251 | CPU_FTR_USE_TB | \ |
252 | CPU_FTR_USE_TB | | 252 | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \ |
253 | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | | 253 | CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \ |
254 | CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | | 254 | CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_L3_DISABLE_NAP | \ |
255 | CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_L3_DISABLE_NAP | | 255 | CPU_FTR_NEED_COHERENT | CPU_FTR_HAS_HIGH_BATS) |
256 | CPU_FTR_NEED_COHERENT | CPU_FTR_HAS_HIGH_BATS, | 256 | #define CPU_FTRS_7455 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
257 | CPU_FTRS_7455 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 257 | CPU_FTR_USE_TB | \ |
258 | CPU_FTR_USE_TB | | 258 | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \ |
259 | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | | 259 | CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \ |
260 | CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | | 260 | CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS | \ |
261 | CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS | | 261 | CPU_FTR_NEED_COHERENT) |
262 | CPU_FTR_NEED_COHERENT, | 262 | #define CPU_FTRS_7447_10 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
263 | CPU_FTRS_7447_10 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 263 | CPU_FTR_USE_TB | \ |
264 | CPU_FTR_USE_TB | | 264 | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \ |
265 | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | | 265 | CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \ |
266 | CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | | 266 | CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS | \ |
267 | CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS | | 267 | CPU_FTR_NEED_COHERENT | CPU_FTR_NO_BTIC) |
268 | CPU_FTR_NEED_COHERENT | CPU_FTR_NO_BTIC, | 268 | #define CPU_FTRS_7447 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
269 | CPU_FTRS_7447 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 269 | CPU_FTR_USE_TB | \ |
270 | CPU_FTR_USE_TB | | 270 | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \ |
271 | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | | 271 | CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \ |
272 | CPU_FTR_L3CR | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | | 272 | CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS | \ |
273 | CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS | | 273 | CPU_FTR_NEED_COHERENT) |
274 | CPU_FTR_NEED_COHERENT, | 274 | #define CPU_FTRS_7447A (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
275 | CPU_FTRS_7447A = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 275 | CPU_FTR_USE_TB | \ |
276 | CPU_FTR_USE_TB | | 276 | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | \ |
277 | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_L2CR | CPU_FTR_ALTIVEC_COMP | | 277 | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | \ |
278 | CPU_FTR_HPTE_TABLE | CPU_FTR_SPEC7450 | | 278 | CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS | \ |
279 | CPU_FTR_NAP_DISABLE_L2_PR | CPU_FTR_HAS_HIGH_BATS | | 279 | CPU_FTR_NEED_COHERENT) |
280 | CPU_FTR_NEED_COHERENT, | 280 | #define CPU_FTRS_82XX (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
281 | CPU_FTRS_82XX = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 281 | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB) |
282 | CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB, | 282 | #define CPU_FTRS_G2_LE (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE | \ |
283 | CPU_FTRS_G2_LE = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE | | 283 | CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS) |
284 | CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS, | 284 | #define CPU_FTRS_E300 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE | \ |
285 | CPU_FTRS_E300 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_MAYBE_CAN_DOZE | | 285 | CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS | \ |
286 | CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS | | 286 | CPU_FTR_COMMON) |
287 | CPU_FTR_COMMON, | 287 | #define CPU_FTRS_CLASSIC32 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
288 | CPU_FTRS_CLASSIC32 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 288 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE) |
289 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE, | 289 | #define CPU_FTRS_POWER3_32 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
290 | CPU_FTRS_POWER3_32 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 290 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE) |
291 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE, | 291 | #define CPU_FTRS_POWER4_32 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
292 | CPU_FTRS_POWER4_32 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 292 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_NODSISRALIGN) |
293 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_NODSISRALIGN, | 293 | #define CPU_FTRS_970_32 (CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | \ |
294 | CPU_FTRS_970_32 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE | | 294 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_ALTIVEC_COMP | \ |
295 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_ALTIVEC_COMP | | 295 | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_NODSISRALIGN) |
296 | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_NODSISRALIGN, | 296 | #define CPU_FTRS_8XX (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB) |
297 | CPU_FTRS_8XX = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB, | 297 | #define CPU_FTRS_40X (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ |
298 | CPU_FTRS_40X = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | | 298 | CPU_FTR_NODSISRALIGN) |
299 | CPU_FTR_NODSISRALIGN, | 299 | #define CPU_FTRS_44X (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ |
300 | CPU_FTRS_44X = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | | 300 | CPU_FTR_NODSISRALIGN) |
301 | CPU_FTR_NODSISRALIGN, | 301 | #define CPU_FTRS_E200 (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN) |
302 | CPU_FTRS_E200 = CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN, | 302 | #define CPU_FTRS_E500 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ |
303 | CPU_FTRS_E500 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | | 303 | CPU_FTR_NODSISRALIGN) |
304 | CPU_FTR_NODSISRALIGN, | 304 | #define CPU_FTRS_E500_2 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ |
305 | CPU_FTRS_E500_2 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | | 305 | CPU_FTR_BIG_PHYS | CPU_FTR_NODSISRALIGN) |
306 | CPU_FTR_BIG_PHYS | CPU_FTR_NODSISRALIGN, | 306 | #define CPU_FTRS_GENERIC_32 (CPU_FTR_COMMON | CPU_FTR_NODSISRALIGN) |
307 | CPU_FTRS_GENERIC_32 = CPU_FTR_COMMON | CPU_FTR_NODSISRALIGN, | ||
308 | #ifdef __powerpc64__ | 307 | #ifdef __powerpc64__ |
309 | CPU_FTRS_POWER3 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | | 308 | #define CPU_FTRS_POWER3 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ |
310 | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR, | 309 | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR) |
311 | CPU_FTRS_RS64 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | | 310 | #define CPU_FTRS_RS64 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ |
312 | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR | | 311 | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR | \ |
313 | CPU_FTR_MMCRA | CPU_FTR_CTRL, | 312 | CPU_FTR_MMCRA | CPU_FTR_CTRL) |
314 | CPU_FTRS_POWER4 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | | 313 | #define CPU_FTRS_POWER4 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ |
315 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA, | 314 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA) |
316 | CPU_FTRS_PPC970 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | | 315 | #define CPU_FTRS_PPC970 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ |
317 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | | 316 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | \ |
318 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_CAN_NAP | CPU_FTR_MMCRA, | 317 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_CAN_NAP | CPU_FTR_MMCRA) |
319 | CPU_FTRS_POWER5 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | | 318 | #define CPU_FTRS_POWER5 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ |
320 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | | 319 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | \ |
321 | CPU_FTR_MMCRA | CPU_FTR_SMT | | 320 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ |
322 | CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | | 321 | CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \ |
323 | CPU_FTR_MMCRA_SIHV | CPU_FTR_PURR, | 322 | CPU_FTR_MMCRA_SIHV | CPU_FTR_PURR) |
324 | CPU_FTRS_CELL = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | | 323 | #define CPU_FTRS_CELL (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ |
325 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | | 324 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | \ |
326 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | | 325 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ |
327 | CPU_FTR_CTRL | CPU_FTR_PAUSE_ZERO, | 326 | CPU_FTR_CTRL | CPU_FTR_PAUSE_ZERO) |
328 | CPU_FTRS_COMPATIBLE = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | | 327 | #define CPU_FTRS_COMPATIBLE (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ |
329 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2, | 328 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2) |
330 | #endif | 329 | #endif |
331 | 330 | ||
332 | CPU_FTRS_POSSIBLE = | ||
333 | #ifdef __powerpc64__ | 331 | #ifdef __powerpc64__ |
334 | CPU_FTRS_POWER3 | CPU_FTRS_RS64 | CPU_FTRS_POWER4 | | 332 | #define CPU_FTRS_POSSIBLE \ |
335 | CPU_FTRS_PPC970 | CPU_FTRS_POWER5 | CPU_FTRS_CELL | | 333 | (CPU_FTRS_POWER3 | CPU_FTRS_RS64 | CPU_FTRS_POWER4 | \ |
336 | CPU_FTR_CI_LARGE_PAGE | | 334 | CPU_FTRS_PPC970 | CPU_FTRS_POWER5 | CPU_FTRS_CELL | \ |
335 | CPU_FTR_CI_LARGE_PAGE) | ||
337 | #else | 336 | #else |
337 | enum { | ||
338 | CPU_FTRS_POSSIBLE = | ||
338 | #if CLASSIC_PPC | 339 | #if CLASSIC_PPC |
339 | CPU_FTRS_PPC601 | CPU_FTRS_603 | CPU_FTRS_604 | CPU_FTRS_740_NOTAU | | 340 | CPU_FTRS_PPC601 | CPU_FTRS_603 | CPU_FTRS_604 | CPU_FTRS_740_NOTAU | |
340 | CPU_FTRS_740 | CPU_FTRS_750 | CPU_FTRS_750FX1 | | 341 | CPU_FTRS_740 | CPU_FTRS_750 | CPU_FTRS_750FX1 | |
@@ -368,14 +369,18 @@ enum { | |||
368 | #ifdef CONFIG_E500 | 369 | #ifdef CONFIG_E500 |
369 | CPU_FTRS_E500 | CPU_FTRS_E500_2 | | 370 | CPU_FTRS_E500 | CPU_FTRS_E500_2 | |
370 | #endif | 371 | #endif |
371 | #endif /* __powerpc64__ */ | ||
372 | 0, | 372 | 0, |
373 | }; | ||
374 | #endif /* __powerpc64__ */ | ||
373 | 375 | ||
374 | CPU_FTRS_ALWAYS = | ||
375 | #ifdef __powerpc64__ | 376 | #ifdef __powerpc64__ |
376 | CPU_FTRS_POWER3 & CPU_FTRS_RS64 & CPU_FTRS_POWER4 & | 377 | #define CPU_FTRS_ALWAYS \ |
377 | CPU_FTRS_PPC970 & CPU_FTRS_POWER5 & CPU_FTRS_CELL & | 378 | (CPU_FTRS_POWER3 & CPU_FTRS_RS64 & CPU_FTRS_POWER4 & \ |
379 | CPU_FTRS_PPC970 & CPU_FTRS_POWER5 & CPU_FTRS_CELL & \ | ||
380 | CPU_FTRS_POSSIBLE) | ||
378 | #else | 381 | #else |
382 | enum { | ||
383 | CPU_FTRS_ALWAYS = | ||
379 | #if CLASSIC_PPC | 384 | #if CLASSIC_PPC |
380 | CPU_FTRS_PPC601 & CPU_FTRS_603 & CPU_FTRS_604 & CPU_FTRS_740_NOTAU & | 385 | CPU_FTRS_PPC601 & CPU_FTRS_603 & CPU_FTRS_604 & CPU_FTRS_740_NOTAU & |
381 | CPU_FTRS_740 & CPU_FTRS_750 & CPU_FTRS_750FX1 & | 386 | CPU_FTRS_740 & CPU_FTRS_750 & CPU_FTRS_750FX1 & |
@@ -409,9 +414,9 @@ enum { | |||
409 | #ifdef CONFIG_E500 | 414 | #ifdef CONFIG_E500 |
410 | CPU_FTRS_E500 & CPU_FTRS_E500_2 & | 415 | CPU_FTRS_E500 & CPU_FTRS_E500_2 & |
411 | #endif | 416 | #endif |
412 | #endif /* __powerpc64__ */ | ||
413 | CPU_FTRS_POSSIBLE, | 417 | CPU_FTRS_POSSIBLE, |
414 | }; | 418 | }; |
419 | #endif /* __powerpc64__ */ | ||
415 | 420 | ||
416 | static inline int cpu_has_feature(unsigned long feature) | 421 | static inline int cpu_has_feature(unsigned long feature) |
417 | { | 422 | { |
diff --git a/include/asm-powerpc/firmware.h b/include/asm-powerpc/firmware.h index ce3788224ed0..77069df92bf8 100644 --- a/include/asm-powerpc/firmware.h +++ b/include/asm-powerpc/firmware.h | |||
@@ -82,13 +82,11 @@ enum { | |||
82 | /* This is used to identify firmware features which are available | 82 | /* This is used to identify firmware features which are available |
83 | * to the kernel. | 83 | * to the kernel. |
84 | */ | 84 | */ |
85 | extern unsigned long ppc64_firmware_features; | 85 | extern unsigned long powerpc_firmware_features; |
86 | 86 | ||
87 | static inline unsigned long firmware_has_feature(unsigned long feature) | 87 | #define firmware_has_feature(feature) \ |
88 | { | 88 | ((FW_FEATURE_ALWAYS & (feature)) || \ |
89 | return (FW_FEATURE_ALWAYS & feature) || | 89 | (FW_FEATURE_POSSIBLE & powerpc_firmware_features & (feature))) |
90 | (FW_FEATURE_POSSIBLE & ppc64_firmware_features & feature); | ||
91 | } | ||
92 | 90 | ||
93 | extern void system_reset_fwnmi(void); | 91 | extern void system_reset_fwnmi(void); |
94 | extern void machine_check_fwnmi(void); | 92 | extern void machine_check_fwnmi(void); |
diff --git a/include/asm-powerpc/floppy.h b/include/asm-powerpc/floppy.h index e258778ca429..608164c39efb 100644 --- a/include/asm-powerpc/floppy.h +++ b/include/asm-powerpc/floppy.h | |||
@@ -35,6 +35,7 @@ | |||
35 | #ifdef CONFIG_PCI | 35 | #ifdef CONFIG_PCI |
36 | 36 | ||
37 | #include <linux/pci.h> | 37 | #include <linux/pci.h> |
38 | #include <asm/ppc-pci.h> /* for ppc64_isabridge_dev */ | ||
38 | 39 | ||
39 | #define fd_dma_setup(addr,size,mode,io) powerpc_fd_dma_setup(addr,size,mode,io) | 40 | #define fd_dma_setup(addr,size,mode,io) powerpc_fd_dma_setup(addr,size,mode,io) |
40 | 41 | ||
@@ -52,12 +53,12 @@ static __inline__ int powerpc_fd_dma_setup(char *addr, unsigned long size, | |||
52 | if (bus_addr | 53 | if (bus_addr |
53 | && (addr != prev_addr || size != prev_size || dir != prev_dir)) { | 54 | && (addr != prev_addr || size != prev_size || dir != prev_dir)) { |
54 | /* different from last time -- unmap prev */ | 55 | /* different from last time -- unmap prev */ |
55 | pci_unmap_single(NULL, bus_addr, prev_size, prev_dir); | 56 | pci_unmap_single(ppc64_isabridge_dev, bus_addr, prev_size, prev_dir); |
56 | bus_addr = 0; | 57 | bus_addr = 0; |
57 | } | 58 | } |
58 | 59 | ||
59 | if (!bus_addr) /* need to map it */ | 60 | if (!bus_addr) /* need to map it */ |
60 | bus_addr = pci_map_single(NULL, addr, size, dir); | 61 | bus_addr = pci_map_single(ppc64_isabridge_dev, addr, size, dir); |
61 | 62 | ||
62 | /* remember this one as prev */ | 63 | /* remember this one as prev */ |
63 | prev_addr = addr; | 64 | prev_addr = addr; |
diff --git a/include/asm-powerpc/futex.h b/include/asm-powerpc/futex.h index 39e85f320a76..f1b3c00bc1ce 100644 --- a/include/asm-powerpc/futex.h +++ b/include/asm-powerpc/futex.h | |||
@@ -81,5 +81,11 @@ static inline int futex_atomic_op_inuser (int encoded_op, int __user *uaddr) | |||
81 | return ret; | 81 | return ret; |
82 | } | 82 | } |
83 | 83 | ||
84 | static inline int | ||
85 | futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) | ||
86 | { | ||
87 | return -ENOSYS; | ||
88 | } | ||
89 | |||
84 | #endif /* __KERNEL__ */ | 90 | #endif /* __KERNEL__ */ |
85 | #endif /* _ASM_POWERPC_FUTEX_H */ | 91 | #endif /* _ASM_POWERPC_FUTEX_H */ |
diff --git a/include/asm-powerpc/hvcall.h b/include/asm-powerpc/hvcall.h index 38ca9ad6110d..b72c04f3f551 100644 --- a/include/asm-powerpc/hvcall.h +++ b/include/asm-powerpc/hvcall.h | |||
@@ -9,6 +9,7 @@ | |||
9 | #define H_Closed 2 /* Resource closed */ | 9 | #define H_Closed 2 /* Resource closed */ |
10 | #define H_Constrained 4 /* Resource request constrained to max allowed */ | 10 | #define H_Constrained 4 /* Resource request constrained to max allowed */ |
11 | #define H_InProgress 14 /* Kind of like busy */ | 11 | #define H_InProgress 14 /* Kind of like busy */ |
12 | #define H_Pending 17 /* returned from H_POLL_PENDING */ | ||
12 | #define H_Continue 18 /* Returned from H_Join on success */ | 13 | #define H_Continue 18 /* Returned from H_Join on success */ |
13 | #define H_LongBusyStartRange 9900 /* Start of long busy range */ | 14 | #define H_LongBusyStartRange 9900 /* Start of long busy range */ |
14 | #define H_LongBusyOrder1msec 9900 /* Long busy, hint that 1msec is a good time to retry */ | 15 | #define H_LongBusyOrder1msec 9900 /* Long busy, hint that 1msec is a good time to retry */ |
diff --git a/include/asm-powerpc/hvconsole.h b/include/asm-powerpc/hvconsole.h index 34daf7b9b62f..35ea69e8121f 100644 --- a/include/asm-powerpc/hvconsole.h +++ b/include/asm-powerpc/hvconsole.h | |||
@@ -24,28 +24,18 @@ | |||
24 | #ifdef __KERNEL__ | 24 | #ifdef __KERNEL__ |
25 | 25 | ||
26 | /* | 26 | /* |
27 | * This is the max number of console adapters that can/will be found as | 27 | * PSeries firmware will only send/recv up to 16 bytes of character data per |
28 | * console devices on first stage console init. Any number beyond this range | 28 | * hcall. |
29 | * can't be used as a console device but is still a valid tty device. | ||
30 | */ | 29 | */ |
31 | #define MAX_NR_HVC_CONSOLES 16 | 30 | #define MAX_VIO_PUT_CHARS 16 |
31 | #define SIZE_VIO_GET_CHARS 16 | ||
32 | 32 | ||
33 | /* implemented by a low level driver */ | 33 | /* |
34 | struct hv_ops { | 34 | * Vio firmware always attempts to fetch MAX_VIO_GET_CHARS chars. The 'count' |
35 | int (*get_chars)(uint32_t vtermno, char *buf, int count); | 35 | * parm is included to conform to put_chars() function pointer template |
36 | int (*put_chars)(uint32_t vtermno, const char *buf, int count); | 36 | */ |
37 | }; | ||
38 | extern int hvc_get_chars(uint32_t vtermno, char *buf, int count); | 37 | extern int hvc_get_chars(uint32_t vtermno, char *buf, int count); |
39 | extern int hvc_put_chars(uint32_t vtermno, const char *buf, int count); | 38 | extern int hvc_put_chars(uint32_t vtermno, const char *buf, int count); |
40 | 39 | ||
41 | struct hvc_struct; | ||
42 | |||
43 | /* Register a vterm and a slot index for use as a console (console_init) */ | ||
44 | extern int hvc_instantiate(uint32_t vtermno, int index, struct hv_ops *ops); | ||
45 | /* register a vterm for hvc tty operation (module_init or hotplug add) */ | ||
46 | extern struct hvc_struct * __devinit hvc_alloc(uint32_t vtermno, int irq, | ||
47 | struct hv_ops *ops); | ||
48 | /* remove a vterm from hvc tty operation (modele_exit or hotplug remove) */ | ||
49 | extern int __devexit hvc_remove(struct hvc_struct *hp); | ||
50 | #endif /* __KERNEL__ */ | 40 | #endif /* __KERNEL__ */ |
51 | #endif /* _PPC64_HVCONSOLE_H */ | 41 | #endif /* _PPC64_HVCONSOLE_H */ |
diff --git a/include/asm-powerpc/kdebug.h b/include/asm-powerpc/kdebug.h index 7c16265568e0..c01786ab5fa6 100644 --- a/include/asm-powerpc/kdebug.h +++ b/include/asm-powerpc/kdebug.h | |||
@@ -16,13 +16,9 @@ struct die_args { | |||
16 | int signr; | 16 | int signr; |
17 | }; | 17 | }; |
18 | 18 | ||
19 | /* | 19 | extern int register_die_notifier(struct notifier_block *); |
20 | Note - you should never unregister because that can race with NMIs. | 20 | extern int unregister_die_notifier(struct notifier_block *); |
21 | If you really want to do it first unregister - then synchronize_sched - | 21 | extern struct atomic_notifier_head powerpc_die_chain; |
22 | then free. | ||
23 | */ | ||
24 | int register_die_notifier(struct notifier_block *nb); | ||
25 | extern struct notifier_block *powerpc_die_chain; | ||
26 | 22 | ||
27 | /* Grossly misnamed. */ | 23 | /* Grossly misnamed. */ |
28 | enum die_val { | 24 | enum die_val { |
@@ -37,7 +33,7 @@ enum die_val { | |||
37 | static inline int notify_die(enum die_val val,char *str,struct pt_regs *regs,long err,int trap, int sig) | 33 | static inline int notify_die(enum die_val val,char *str,struct pt_regs *regs,long err,int trap, int sig) |
38 | { | 34 | { |
39 | struct die_args args = { .regs=regs, .str=str, .err=err, .trapnr=trap,.signr=sig }; | 35 | struct die_args args = { .regs=regs, .str=str, .err=err, .trapnr=trap,.signr=sig }; |
40 | return notifier_call_chain(&powerpc_die_chain, val, &args); | 36 | return atomic_notifier_call_chain(&powerpc_die_chain, val, &args); |
41 | } | 37 | } |
42 | 38 | ||
43 | #endif /* __KERNEL__ */ | 39 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-powerpc/machdep.h b/include/asm-powerpc/machdep.h index 5348b820788c..5ed847680754 100644 --- a/include/asm-powerpc/machdep.h +++ b/include/asm-powerpc/machdep.h | |||
@@ -47,6 +47,7 @@ struct smp_ops_t { | |||
47 | #endif | 47 | #endif |
48 | 48 | ||
49 | struct machdep_calls { | 49 | struct machdep_calls { |
50 | char *name; | ||
50 | #ifdef CONFIG_PPC64 | 51 | #ifdef CONFIG_PPC64 |
51 | void (*hpte_invalidate)(unsigned long slot, | 52 | void (*hpte_invalidate)(unsigned long slot, |
52 | unsigned long va, | 53 | unsigned long va, |
@@ -85,9 +86,9 @@ struct machdep_calls { | |||
85 | void (*iommu_dev_setup)(struct pci_dev *dev); | 86 | void (*iommu_dev_setup)(struct pci_dev *dev); |
86 | void (*iommu_bus_setup)(struct pci_bus *bus); | 87 | void (*iommu_bus_setup)(struct pci_bus *bus); |
87 | void (*irq_bus_setup)(struct pci_bus *bus); | 88 | void (*irq_bus_setup)(struct pci_bus *bus); |
88 | #endif | 89 | #endif /* CONFIG_PPC64 */ |
89 | 90 | ||
90 | int (*probe)(int platform); | 91 | int (*probe)(void); |
91 | void (*setup_arch)(void); | 92 | void (*setup_arch)(void); |
92 | void (*init_early)(void); | 93 | void (*init_early)(void); |
93 | /* Optional, may be NULL. */ | 94 | /* Optional, may be NULL. */ |
@@ -158,6 +159,12 @@ struct machdep_calls { | |||
158 | /* Idle loop for this platform, leave empty for default idle loop */ | 159 | /* Idle loop for this platform, leave empty for default idle loop */ |
159 | void (*idle_loop)(void); | 160 | void (*idle_loop)(void); |
160 | 161 | ||
162 | /* | ||
163 | * Function for waiting for work with reduced power in idle loop; | ||
164 | * called with interrupts disabled. | ||
165 | */ | ||
166 | void (*power_save)(void); | ||
167 | |||
161 | /* Function to enable performance monitor counters for this | 168 | /* Function to enable performance monitor counters for this |
162 | platform, called once per cpu. */ | 169 | platform, called once per cpu. */ |
163 | void (*enable_pmcs)(void); | 170 | void (*enable_pmcs)(void); |
@@ -170,13 +177,6 @@ struct machdep_calls { | |||
170 | May be NULL. */ | 177 | May be NULL. */ |
171 | void (*init)(void); | 178 | void (*init)(void); |
172 | 179 | ||
173 | void (*idle)(void); | ||
174 | void (*power_save)(void); | ||
175 | |||
176 | void (*heartbeat)(void); | ||
177 | unsigned long heartbeat_reset; | ||
178 | unsigned long heartbeat_count; | ||
179 | |||
180 | void (*setup_io_mappings)(void); | 180 | void (*setup_io_mappings)(void); |
181 | 181 | ||
182 | void (*early_serial_map)(void); | 182 | void (*early_serial_map)(void); |
@@ -208,8 +208,6 @@ struct machdep_calls { | |||
208 | /* Called at then very end of pcibios_init() */ | 208 | /* Called at then very end of pcibios_init() */ |
209 | void (*pcibios_after_init)(void); | 209 | void (*pcibios_after_init)(void); |
210 | 210 | ||
211 | /* this is for modules, since _machine can be a define -- Cort */ | ||
212 | int ppc_machine; | ||
213 | #endif /* CONFIG_PPC32 */ | 211 | #endif /* CONFIG_PPC32 */ |
214 | 212 | ||
215 | /* Called to shutdown machine specific hardware not already controlled | 213 | /* Called to shutdown machine specific hardware not already controlled |
@@ -242,10 +240,29 @@ struct machdep_calls { | |||
242 | #endif /* CONFIG_KEXEC */ | 240 | #endif /* CONFIG_KEXEC */ |
243 | }; | 241 | }; |
244 | 242 | ||
245 | extern void default_idle(void); | 243 | extern void power4_idle(void); |
246 | extern void native_idle(void); | 244 | extern void ppc6xx_idle(void); |
247 | 245 | ||
246 | /* | ||
247 | * ppc_md contains a copy of the machine description structure for the | ||
248 | * current platform. machine_id contains the initial address where the | ||
249 | * description was found during boot. | ||
250 | */ | ||
248 | extern struct machdep_calls ppc_md; | 251 | extern struct machdep_calls ppc_md; |
252 | extern struct machdep_calls *machine_id; | ||
253 | |||
254 | #define __machine_desc __attribute__ ((__section__ (".machine.desc"))) | ||
255 | |||
256 | #define define_machine(name) struct machdep_calls mach_##name __machine_desc = | ||
257 | #define machine_is(name) \ | ||
258 | ({ \ | ||
259 | extern struct machdep_calls mach_##name \ | ||
260 | __attribute__((weak)); \ | ||
261 | machine_id == &mach_##name; \ | ||
262 | }) | ||
263 | |||
264 | extern void probe_machine(void); | ||
265 | |||
249 | extern char cmd_line[COMMAND_LINE_SIZE]; | 266 | extern char cmd_line[COMMAND_LINE_SIZE]; |
250 | 267 | ||
251 | #ifdef CONFIG_PPC_PMAC | 268 | #ifdef CONFIG_PPC_PMAC |
diff --git a/include/asm-powerpc/oprofile_impl.h b/include/asm-powerpc/oprofile_impl.h index 338e6a7cff4a..5b33994cd488 100644 --- a/include/asm-powerpc/oprofile_impl.h +++ b/include/asm-powerpc/oprofile_impl.h | |||
@@ -17,9 +17,6 @@ | |||
17 | 17 | ||
18 | /* Per-counter configuration as set via oprofilefs. */ | 18 | /* Per-counter configuration as set via oprofilefs. */ |
19 | struct op_counter_config { | 19 | struct op_counter_config { |
20 | #ifdef __powerpc64__ | ||
21 | unsigned long valid; | ||
22 | #endif | ||
23 | unsigned long enabled; | 20 | unsigned long enabled; |
24 | unsigned long event; | 21 | unsigned long event; |
25 | unsigned long count; | 22 | unsigned long count; |
@@ -38,9 +35,6 @@ struct op_system_config { | |||
38 | #endif | 35 | #endif |
39 | unsigned long enable_kernel; | 36 | unsigned long enable_kernel; |
40 | unsigned long enable_user; | 37 | unsigned long enable_user; |
41 | #ifdef CONFIG_PPC64 | ||
42 | unsigned long backtrace_spinlocks; | ||
43 | #endif | ||
44 | }; | 38 | }; |
45 | 39 | ||
46 | /* Per-arch configuration */ | 40 | /* Per-arch configuration */ |
@@ -56,17 +50,12 @@ struct op_powerpc_model { | |||
56 | int num_counters; | 50 | int num_counters; |
57 | }; | 51 | }; |
58 | 52 | ||
59 | #ifdef CONFIG_FSL_BOOKE | ||
60 | extern struct op_powerpc_model op_model_fsl_booke; | 53 | extern struct op_powerpc_model op_model_fsl_booke; |
61 | #else /* Otherwise, it's classic */ | ||
62 | |||
63 | #ifdef CONFIG_PPC64 | ||
64 | extern struct op_powerpc_model op_model_rs64; | 54 | extern struct op_powerpc_model op_model_rs64; |
65 | extern struct op_powerpc_model op_model_power4; | 55 | extern struct op_powerpc_model op_model_power4; |
66 | |||
67 | #else /* Otherwise, CONFIG_PPC32 */ | ||
68 | extern struct op_powerpc_model op_model_7450; | 56 | extern struct op_powerpc_model op_model_7450; |
69 | #endif | 57 | |
58 | #ifndef CONFIG_FSL_BOOKE | ||
70 | 59 | ||
71 | /* All the classic PPC parts use these */ | 60 | /* All the classic PPC parts use these */ |
72 | static inline unsigned int ctr_read(unsigned int i) | 61 | static inline unsigned int ctr_read(unsigned int i) |
@@ -134,5 +123,7 @@ static inline void ctr_write(unsigned int i, unsigned int val) | |||
134 | } | 123 | } |
135 | #endif /* !CONFIG_FSL_BOOKE */ | 124 | #endif /* !CONFIG_FSL_BOOKE */ |
136 | 125 | ||
126 | extern void op_powerpc_backtrace(struct pt_regs * const regs, unsigned int depth); | ||
127 | |||
137 | #endif /* __KERNEL__ */ | 128 | #endif /* __KERNEL__ */ |
138 | #endif /* _ASM_POWERPC_OPROFILE_IMPL_H */ | 129 | #endif /* _ASM_POWERPC_OPROFILE_IMPL_H */ |
diff --git a/include/asm-powerpc/paca.h b/include/asm-powerpc/paca.h index 4465b95ebef0..706325f99a84 100644 --- a/include/asm-powerpc/paca.h +++ b/include/asm-powerpc/paca.h | |||
@@ -105,5 +105,7 @@ struct paca_struct { | |||
105 | 105 | ||
106 | extern struct paca_struct paca[]; | 106 | extern struct paca_struct paca[]; |
107 | 107 | ||
108 | void setup_boot_paca(void); | ||
109 | |||
108 | #endif /* __KERNEL__ */ | 110 | #endif /* __KERNEL__ */ |
109 | #endif /* _ASM_POWERPC_PACA_H */ | 111 | #endif /* _ASM_POWERPC_PACA_H */ |
diff --git a/include/asm-powerpc/page.h b/include/asm-powerpc/page.h index 0b82df483f7f..2fbecebe1c92 100644 --- a/include/asm-powerpc/page.h +++ b/include/asm-powerpc/page.h | |||
@@ -69,8 +69,6 @@ | |||
69 | #endif | 69 | #endif |
70 | 70 | ||
71 | #ifdef CONFIG_FLATMEM | 71 | #ifdef CONFIG_FLATMEM |
72 | #define pfn_to_page(pfn) (mem_map + (pfn)) | ||
73 | #define page_to_pfn(page) ((unsigned long)((page) - mem_map)) | ||
74 | #define pfn_valid(pfn) ((pfn) < max_mapnr) | 72 | #define pfn_valid(pfn) ((pfn) < max_mapnr) |
75 | #endif | 73 | #endif |
76 | 74 | ||
@@ -200,6 +198,7 @@ extern void copy_user_page(void *to, void *from, unsigned long vaddr, | |||
200 | struct page *p); | 198 | struct page *p); |
201 | extern int page_is_ram(unsigned long pfn); | 199 | extern int page_is_ram(unsigned long pfn); |
202 | 200 | ||
201 | #include <asm-generic/memory_model.h> | ||
203 | #endif /* __ASSEMBLY__ */ | 202 | #endif /* __ASSEMBLY__ */ |
204 | 203 | ||
205 | #endif /* __KERNEL__ */ | 204 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-powerpc/percpu.h b/include/asm-powerpc/percpu.h index 464301cd0d03..184a7a4d2fdf 100644 --- a/include/asm-powerpc/percpu.h +++ b/include/asm-powerpc/percpu.h | |||
@@ -27,7 +27,7 @@ | |||
27 | #define percpu_modcopy(pcpudst, src, size) \ | 27 | #define percpu_modcopy(pcpudst, src, size) \ |
28 | do { \ | 28 | do { \ |
29 | unsigned int __i; \ | 29 | unsigned int __i; \ |
30 | for_each_cpu(__i) \ | 30 | for_each_possible_cpu(__i) \ |
31 | memcpy((pcpudst)+__per_cpu_offset(__i), \ | 31 | memcpy((pcpudst)+__per_cpu_offset(__i), \ |
32 | (src), (size)); \ | 32 | (src), (size)); \ |
33 | } while (0) | 33 | } while (0) |
diff --git a/include/asm-powerpc/pmac_feature.h b/include/asm-powerpc/pmac_feature.h index 3221628130c4..d3599cc9aa74 100644 --- a/include/asm-powerpc/pmac_feature.h +++ b/include/asm-powerpc/pmac_feature.h | |||
@@ -305,7 +305,7 @@ extern void pmac_feature_init(void); | |||
305 | extern void pmac_set_early_video_resume(void (*proc)(void *data), void *data); | 305 | extern void pmac_set_early_video_resume(void (*proc)(void *data), void *data); |
306 | extern void pmac_call_early_video_resume(void); | 306 | extern void pmac_call_early_video_resume(void); |
307 | 307 | ||
308 | #define PMAC_FTR_DEF(x) ((_MACH_Pmac << 16) | (x)) | 308 | #define PMAC_FTR_DEF(x) ((0x6660000) | (x)) |
309 | 309 | ||
310 | /* The AGP driver registers itself here */ | 310 | /* The AGP driver registers itself here */ |
311 | extern void pmac_register_agp_pm(struct pci_dev *bridge, | 311 | extern void pmac_register_agp_pm(struct pci_dev *bridge, |
diff --git a/include/asm-powerpc/poll.h b/include/asm-powerpc/poll.h index edd2054da86b..9c7d12631033 100644 --- a/include/asm-powerpc/poll.h +++ b/include/asm-powerpc/poll.h | |||
@@ -13,6 +13,7 @@ | |||
13 | #define POLLWRBAND 0x0200 | 13 | #define POLLWRBAND 0x0200 |
14 | #define POLLMSG 0x0400 | 14 | #define POLLMSG 0x0400 |
15 | #define POLLREMOVE 0x1000 | 15 | #define POLLREMOVE 0x1000 |
16 | #define POLLRDHUP 0x2000 | ||
16 | 17 | ||
17 | struct pollfd { | 18 | struct pollfd { |
18 | int fd; | 19 | int fd; |
diff --git a/include/asm-powerpc/processor.h b/include/asm-powerpc/processor.h index 1c64a211cf19..93f83efeb310 100644 --- a/include/asm-powerpc/processor.h +++ b/include/asm-powerpc/processor.h | |||
@@ -22,22 +22,6 @@ | |||
22 | * -- BenH. | 22 | * -- BenH. |
23 | */ | 23 | */ |
24 | 24 | ||
25 | /* Platforms codes (to be obsoleted) */ | ||
26 | #define PLATFORM_PSERIES 0x0100 | ||
27 | #define PLATFORM_PSERIES_LPAR 0x0101 | ||
28 | #define PLATFORM_ISERIES_LPAR 0x0201 | ||
29 | #define PLATFORM_LPAR 0x0001 | ||
30 | #define PLATFORM_POWERMAC 0x0400 | ||
31 | #define PLATFORM_MAPLE 0x0500 | ||
32 | #define PLATFORM_PREP 0x0600 | ||
33 | #define PLATFORM_CHRP 0x0700 | ||
34 | #define PLATFORM_CELL 0x1000 | ||
35 | |||
36 | /* Compat platform codes for 32 bits */ | ||
37 | #define _MACH_prep PLATFORM_PREP | ||
38 | #define _MACH_Pmac PLATFORM_POWERMAC | ||
39 | #define _MACH_chrp PLATFORM_CHRP | ||
40 | |||
41 | /* PREP sub-platform types see residual.h for these */ | 25 | /* PREP sub-platform types see residual.h for these */ |
42 | #define _PREP_Motorola 0x01 /* motorola prep */ | 26 | #define _PREP_Motorola 0x01 /* motorola prep */ |
43 | #define _PREP_Firm 0x02 /* firmworks prep */ | 27 | #define _PREP_Firm 0x02 /* firmworks prep */ |
@@ -49,18 +33,14 @@ | |||
49 | #define _CHRP_IBM 0x05 /* IBM chrp, the longtrail and longtrail 2 */ | 33 | #define _CHRP_IBM 0x05 /* IBM chrp, the longtrail and longtrail 2 */ |
50 | #define _CHRP_Pegasos 0x06 /* Genesi/bplan's Pegasos and Pegasos2 */ | 34 | #define _CHRP_Pegasos 0x06 /* Genesi/bplan's Pegasos and Pegasos2 */ |
51 | 35 | ||
52 | #ifdef __KERNEL__ | 36 | #if defined(__KERNEL__) && defined(CONFIG_PPC32) |
53 | #define platform_is_pseries() (_machine == PLATFORM_PSERIES || \ | ||
54 | _machine == PLATFORM_PSERIES_LPAR) | ||
55 | 37 | ||
56 | #if defined(CONFIG_PPC_MULTIPLATFORM) | 38 | extern int _chrp_type; |
57 | extern int _machine; | ||
58 | 39 | ||
59 | #ifdef CONFIG_PPC32 | 40 | #ifdef CONFIG_PPC_PREP |
60 | 41 | ||
61 | /* what kind of prep workstation we are */ | 42 | /* what kind of prep workstation we are */ |
62 | extern int _prep_type; | 43 | extern int _prep_type; |
63 | extern int _chrp_type; | ||
64 | 44 | ||
65 | /* | 45 | /* |
66 | * This is used to identify the board type from a given PReP board | 46 | * This is used to identify the board type from a given PReP board |
@@ -70,17 +50,14 @@ extern int _chrp_type; | |||
70 | extern unsigned char ucBoardRev; | 50 | extern unsigned char ucBoardRev; |
71 | extern unsigned char ucBoardRevMaj, ucBoardRevMin; | 51 | extern unsigned char ucBoardRevMaj, ucBoardRevMin; |
72 | 52 | ||
73 | #endif /* CONFIG_PPC32 */ | 53 | #endif /* CONFIG_PPC_PREP */ |
74 | 54 | ||
75 | #elif defined(CONFIG_PPC_ISERIES) | 55 | #ifndef CONFIG_PPC_MULTIPLATFORM |
76 | /* | ||
77 | * iSeries is soon to become MULTIPLATFORM hopefully ... | ||
78 | */ | ||
79 | #define _machine PLATFORM_ISERIES_LPAR | ||
80 | #else | ||
81 | #define _machine 0 | 56 | #define _machine 0 |
82 | #endif /* CONFIG_PPC_MULTIPLATFORM */ | 57 | #endif /* CONFIG_PPC_MULTIPLATFORM */ |
83 | #endif /* __KERNEL__ */ | 58 | |
59 | #endif /* defined(__KERNEL__) && defined(CONFIG_PPC32) */ | ||
60 | |||
84 | /* | 61 | /* |
85 | * Default implementation of macro that returns current | 62 | * Default implementation of macro that returns current |
86 | * instruction pointer ("program counter"). | 63 | * instruction pointer ("program counter"). |
@@ -251,6 +228,10 @@ static inline unsigned long __pack_fe01(unsigned int fpmode) | |||
251 | #define cpu_relax() barrier() | 228 | #define cpu_relax() barrier() |
252 | #endif | 229 | #endif |
253 | 230 | ||
231 | /* Check that a certain kernel stack pointer is valid in task_struct p */ | ||
232 | int validate_sp(unsigned long sp, struct task_struct *p, | ||
233 | unsigned long nbytes); | ||
234 | |||
254 | /* | 235 | /* |
255 | * Prefetch macros. | 236 | * Prefetch macros. |
256 | */ | 237 | */ |
diff --git a/include/asm-powerpc/prom.h b/include/asm-powerpc/prom.h index 782e13a070a1..97ef1cd71a4d 100644 --- a/include/asm-powerpc/prom.h +++ b/include/asm-powerpc/prom.h | |||
@@ -149,12 +149,14 @@ extern struct device_node *of_node_get(struct device_node *node); | |||
149 | extern void of_node_put(struct device_node *node); | 149 | extern void of_node_put(struct device_node *node); |
150 | 150 | ||
151 | /* For scanning the flat device-tree at boot time */ | 151 | /* For scanning the flat device-tree at boot time */ |
152 | int __init of_scan_flat_dt(int (*it)(unsigned long node, | 152 | extern int __init of_scan_flat_dt(int (*it)(unsigned long node, |
153 | const char *uname, int depth, | 153 | const char *uname, int depth, |
154 | void *data), | 154 | void *data), |
155 | void *data); | 155 | void *data); |
156 | void* __init of_get_flat_dt_prop(unsigned long node, const char *name, | 156 | extern void* __init of_get_flat_dt_prop(unsigned long node, const char *name, |
157 | unsigned long *size); | 157 | unsigned long *size); |
158 | extern int __init of_flat_dt_is_compatible(unsigned long node, const char *name); | ||
159 | extern unsigned long __init of_get_flat_dt_root(void); | ||
158 | 160 | ||
159 | /* For updating the device tree at runtime */ | 161 | /* For updating the device tree at runtime */ |
160 | extern void of_attach_node(struct device_node *); | 162 | extern void of_attach_node(struct device_node *); |
diff --git a/include/asm-powerpc/reg.h b/include/asm-powerpc/reg.h index 72bfe3af0460..bd467bf5cf5a 100644 --- a/include/asm-powerpc/reg.h +++ b/include/asm-powerpc/reg.h | |||
@@ -622,6 +622,10 @@ extern void ppc64_runlatch_off(void); | |||
622 | extern unsigned long scom970_read(unsigned int address); | 622 | extern unsigned long scom970_read(unsigned int address); |
623 | extern void scom970_write(unsigned int address, unsigned long value); | 623 | extern void scom970_write(unsigned int address, unsigned long value); |
624 | 624 | ||
625 | #else | ||
626 | #define ppc64_runlatch_on() | ||
627 | #define ppc64_runlatch_off() | ||
628 | |||
625 | #endif /* CONFIG_PPC64 */ | 629 | #endif /* CONFIG_PPC64 */ |
626 | 630 | ||
627 | #define __get_SP() ({unsigned long sp; \ | 631 | #define __get_SP() ({unsigned long sp; \ |
diff --git a/include/asm-powerpc/smp.h b/include/asm-powerpc/smp.h index 98581e5a8279..4a716f707cf6 100644 --- a/include/asm-powerpc/smp.h +++ b/include/asm-powerpc/smp.h | |||
@@ -29,7 +29,6 @@ | |||
29 | #endif | 29 | #endif |
30 | 30 | ||
31 | extern int boot_cpuid; | 31 | extern int boot_cpuid; |
32 | extern int boot_cpuid_phys; | ||
33 | 32 | ||
34 | extern void cpu_die(void); | 33 | extern void cpu_die(void); |
35 | 34 | ||
@@ -99,6 +98,7 @@ extern void smp_release_cpus(void); | |||
99 | #else | 98 | #else |
100 | /* 32-bit */ | 99 | /* 32-bit */ |
101 | #ifndef CONFIG_SMP | 100 | #ifndef CONFIG_SMP |
101 | extern int boot_cpuid_phys; | ||
102 | #define get_hard_smp_processor_id(cpu) boot_cpuid_phys | 102 | #define get_hard_smp_processor_id(cpu) boot_cpuid_phys |
103 | #define set_hard_smp_processor_id(cpu, phys) | 103 | #define set_hard_smp_processor_id(cpu, phys) |
104 | #endif | 104 | #endif |
diff --git a/include/asm-powerpc/spu.h b/include/asm-powerpc/spu.h index 38bacf2f6e0c..f431d8b0b651 100644 --- a/include/asm-powerpc/spu.h +++ b/include/asm-powerpc/spu.h | |||
@@ -110,6 +110,7 @@ struct spu { | |||
110 | char *name; | 110 | char *name; |
111 | unsigned long local_store_phys; | 111 | unsigned long local_store_phys; |
112 | u8 *local_store; | 112 | u8 *local_store; |
113 | unsigned long problem_phys; | ||
113 | struct spu_problem __iomem *problem; | 114 | struct spu_problem __iomem *problem; |
114 | struct spu_priv1 __iomem *priv1; | 115 | struct spu_priv1 __iomem *priv1; |
115 | struct spu_priv2 __iomem *priv2; | 116 | struct spu_priv2 __iomem *priv2; |
@@ -137,6 +138,7 @@ struct spu { | |||
137 | void (* wbox_callback)(struct spu *spu); | 138 | void (* wbox_callback)(struct spu *spu); |
138 | void (* ibox_callback)(struct spu *spu); | 139 | void (* ibox_callback)(struct spu *spu); |
139 | void (* stop_callback)(struct spu *spu); | 140 | void (* stop_callback)(struct spu *spu); |
141 | void (* mfc_callback)(struct spu *spu); | ||
140 | 142 | ||
141 | char irq_c0[8]; | 143 | char irq_c0[8]; |
142 | char irq_c1[8]; | 144 | char irq_c1[8]; |
@@ -149,6 +151,14 @@ int spu_irq_class_0_bottom(struct spu *spu); | |||
149 | int spu_irq_class_1_bottom(struct spu *spu); | 151 | int spu_irq_class_1_bottom(struct spu *spu); |
150 | void spu_irq_setaffinity(struct spu *spu, int cpu); | 152 | void spu_irq_setaffinity(struct spu *spu, int cpu); |
151 | 153 | ||
154 | /* system callbacks from the SPU */ | ||
155 | struct spu_syscall_block { | ||
156 | u64 nr_ret; | ||
157 | u64 parm[6]; | ||
158 | }; | ||
159 | extern long spu_sys_callback(struct spu_syscall_block *s); | ||
160 | |||
161 | /* syscalls implemented in spufs */ | ||
152 | extern struct spufs_calls { | 162 | extern struct spufs_calls { |
153 | asmlinkage long (*create_thread)(const char __user *name, | 163 | asmlinkage long (*create_thread)(const char __user *name, |
154 | unsigned int flags, mode_t mode); | 164 | unsigned int flags, mode_t mode); |
@@ -399,7 +409,6 @@ struct spu_priv1 { | |||
399 | #define SPU_GET_REVISION_BITS(vr) (vr & SPU_REVISION_BITS) | 409 | #define SPU_GET_REVISION_BITS(vr) (vr & SPU_REVISION_BITS) |
400 | u8 pad_0x28_0x100[0x100 - 0x28]; /* 0x28 */ | 410 | u8 pad_0x28_0x100[0x100 - 0x28]; /* 0x28 */ |
401 | 411 | ||
402 | |||
403 | /* Interrupt Area */ | 412 | /* Interrupt Area */ |
404 | u64 int_mask_RW[3]; /* 0x100 */ | 413 | u64 int_mask_RW[3]; /* 0x100 */ |
405 | #define CLASS0_ENABLE_DMA_ALIGNMENT_INTR 0x1L | 414 | #define CLASS0_ENABLE_DMA_ALIGNMENT_INTR 0x1L |
diff --git a/include/asm-powerpc/string.h b/include/asm-powerpc/string.h index 8606a696c088..faa407f33c6b 100644 --- a/include/asm-powerpc/string.h +++ b/include/asm-powerpc/string.h | |||
@@ -15,7 +15,7 @@ | |||
15 | #define __HAVE_ARCH_MEMCHR | 15 | #define __HAVE_ARCH_MEMCHR |
16 | 16 | ||
17 | extern int strcasecmp(const char *, const char *); | 17 | extern int strcasecmp(const char *, const char *); |
18 | extern int strncasecmp(const char *, const char *, int); | 18 | extern int strncasecmp(const char *, const char *, __kernel_size_t); |
19 | extern char * strcpy(char *,const char *); | 19 | extern char * strcpy(char *,const char *); |
20 | extern char * strncpy(char *,const char *, __kernel_size_t); | 20 | extern char * strncpy(char *,const char *, __kernel_size_t); |
21 | extern __kernel_size_t strlen(const char *); | 21 | extern __kernel_size_t strlen(const char *); |
diff --git a/include/asm-powerpc/syscalls.h b/include/asm-powerpc/syscalls.h new file mode 100644 index 000000000000..c2fe79d4f90f --- /dev/null +++ b/include/asm-powerpc/syscalls.h | |||
@@ -0,0 +1,58 @@ | |||
1 | #ifndef __ASM_POWERPC_SYSCALLS_H | ||
2 | #define __ASM_POWERPC_SYSCALLS_H | ||
3 | #ifdef __KERNEL__ | ||
4 | |||
5 | #include <linux/compiler.h> | ||
6 | #include <linux/linkage.h> | ||
7 | #include <linux/types.h> | ||
8 | #include <asm/signal.h> | ||
9 | |||
10 | struct new_utsname; | ||
11 | struct pt_regs; | ||
12 | struct rtas_args; | ||
13 | struct sigaction; | ||
14 | |||
15 | asmlinkage unsigned long sys_mmap(unsigned long addr, size_t len, | ||
16 | unsigned long prot, unsigned long flags, | ||
17 | unsigned long fd, off_t offset); | ||
18 | asmlinkage unsigned long sys_mmap2(unsigned long addr, size_t len, | ||
19 | unsigned long prot, unsigned long flags, | ||
20 | unsigned long fd, unsigned long pgoff); | ||
21 | asmlinkage int sys_execve(unsigned long a0, unsigned long a1, | ||
22 | unsigned long a2, unsigned long a3, unsigned long a4, | ||
23 | unsigned long a5, struct pt_regs *regs); | ||
24 | asmlinkage int sys_clone(unsigned long clone_flags, unsigned long usp, | ||
25 | int __user *parent_tidp, void __user *child_threadptr, | ||
26 | int __user *child_tidp, int p6, struct pt_regs *regs); | ||
27 | asmlinkage int sys_fork(unsigned long p1, unsigned long p2, | ||
28 | unsigned long p3, unsigned long p4, unsigned long p5, | ||
29 | unsigned long p6, struct pt_regs *regs); | ||
30 | asmlinkage int sys_vfork(unsigned long p1, unsigned long p2, | ||
31 | unsigned long p3, unsigned long p4, unsigned long p5, | ||
32 | unsigned long p6, struct pt_regs *regs); | ||
33 | asmlinkage int sys_pipe(int __user *fildes); | ||
34 | asmlinkage long sys_rt_sigaction(int sig, | ||
35 | const struct sigaction __user *act, | ||
36 | struct sigaction __user *oact, size_t sigsetsize); | ||
37 | asmlinkage int sys_ipc(uint call, int first, unsigned long second, | ||
38 | long third, void __user *ptr, long fifth); | ||
39 | asmlinkage long ppc64_personality(unsigned long personality); | ||
40 | asmlinkage int ppc_rtas(struct rtas_args __user *uargs); | ||
41 | asmlinkage time_t sys64_time(time_t __user * tloc); | ||
42 | asmlinkage long ppc_newuname(struct new_utsname __user * name); | ||
43 | |||
44 | asmlinkage long sys_rt_sigsuspend(sigset_t __user *unewset, | ||
45 | size_t sigsetsize); | ||
46 | |||
47 | #ifndef __powerpc64__ | ||
48 | asmlinkage long sys_sigaltstack(const stack_t __user *uss, | ||
49 | stack_t __user *uoss, int r5, int r6, int r7, int r8, | ||
50 | struct pt_regs *regs); | ||
51 | #else /* __powerpc64__ */ | ||
52 | asmlinkage long sys_sigaltstack(const stack_t __user *uss, | ||
53 | stack_t __user *uoss, unsigned long r5, unsigned long r6, | ||
54 | unsigned long r7, unsigned long r8, struct pt_regs *regs); | ||
55 | #endif /* __powerpc64__ */ | ||
56 | |||
57 | #endif /* __KERNEL__ */ | ||
58 | #endif /* __ASM_POWERPC_SYSCALLS_H */ | ||
diff --git a/include/asm-powerpc/types.h b/include/asm-powerpc/types.h index ec3c2ee8bf86..baabba96e313 100644 --- a/include/asm-powerpc/types.h +++ b/include/asm-powerpc/types.h | |||
@@ -103,6 +103,11 @@ typedef u64 sector_t; | |||
103 | #define HAVE_SECTOR_T | 103 | #define HAVE_SECTOR_T |
104 | #endif | 104 | #endif |
105 | 105 | ||
106 | #ifdef CONFIG_LSF | ||
107 | typedef u64 blkcnt_t; | ||
108 | #define HAVE_BLKCNT_T | ||
109 | #endif | ||
110 | |||
106 | #endif /* __ASSEMBLY__ */ | 111 | #endif /* __ASSEMBLY__ */ |
107 | 112 | ||
108 | #endif /* __KERNEL__ */ | 113 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-powerpc/unistd.h b/include/asm-powerpc/unistd.h index 35556993f066..1e990747dce7 100644 --- a/include/asm-powerpc/unistd.h +++ b/include/asm-powerpc/unistd.h | |||
@@ -425,6 +425,7 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6 | |||
425 | #include <linux/types.h> | 425 | #include <linux/types.h> |
426 | #include <linux/compiler.h> | 426 | #include <linux/compiler.h> |
427 | #include <linux/linkage.h> | 427 | #include <linux/linkage.h> |
428 | #include <asm/syscalls.h> | ||
428 | 429 | ||
429 | #define __ARCH_WANT_IPC_PARSE_VERSION | 430 | #define __ARCH_WANT_IPC_PARSE_VERSION |
430 | #define __ARCH_WANT_OLD_READDIR | 431 | #define __ARCH_WANT_OLD_READDIR |
@@ -460,44 +461,10 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6 | |||
460 | * System call prototypes. | 461 | * System call prototypes. |
461 | */ | 462 | */ |
462 | #ifdef __KERNEL_SYSCALLS__ | 463 | #ifdef __KERNEL_SYSCALLS__ |
463 | extern pid_t setsid(void); | ||
464 | extern int write(int fd, const char *buf, off_t count); | ||
465 | extern int read(int fd, char *buf, off_t count); | ||
466 | extern off_t lseek(int fd, off_t offset, int count); | ||
467 | extern int dup(int fd); | ||
468 | extern int execve(const char *file, char **argv, char **envp); | 464 | extern int execve(const char *file, char **argv, char **envp); |
469 | extern int open(const char *file, int flag, int mode); | ||
470 | extern int close(int fd); | ||
471 | extern pid_t waitpid(pid_t pid, int *wait_stat, int options); | ||
472 | #endif /* __KERNEL_SYSCALLS__ */ | 465 | #endif /* __KERNEL_SYSCALLS__ */ |
473 | 466 | ||
474 | /* | 467 | /* |
475 | * Functions that implement syscalls. | ||
476 | */ | ||
477 | unsigned long sys_mmap(unsigned long addr, size_t len, unsigned long prot, | ||
478 | unsigned long flags, unsigned long fd, off_t offset); | ||
479 | unsigned long sys_mmap2(unsigned long addr, size_t len, | ||
480 | unsigned long prot, unsigned long flags, | ||
481 | unsigned long fd, unsigned long pgoff); | ||
482 | struct pt_regs; | ||
483 | int sys_execve(unsigned long a0, unsigned long a1, unsigned long a2, | ||
484 | unsigned long a3, unsigned long a4, unsigned long a5, | ||
485 | struct pt_regs *regs); | ||
486 | int sys_clone(unsigned long clone_flags, unsigned long usp, | ||
487 | int __user *parent_tidp, void __user *child_threadptr, | ||
488 | int __user *child_tidp, int p6, struct pt_regs *regs); | ||
489 | int sys_fork(unsigned long p1, unsigned long p2, unsigned long p3, | ||
490 | unsigned long p4, unsigned long p5, unsigned long p6, | ||
491 | struct pt_regs *regs); | ||
492 | int sys_vfork(unsigned long p1, unsigned long p2, unsigned long p3, | ||
493 | unsigned long p4, unsigned long p5, unsigned long p6, | ||
494 | struct pt_regs *regs); | ||
495 | int sys_pipe(int __user *fildes); | ||
496 | struct sigaction; | ||
497 | long sys_rt_sigaction(int sig, const struct sigaction __user *act, | ||
498 | struct sigaction __user *oact, size_t sigsetsize); | ||
499 | |||
500 | /* | ||
501 | * "Conditional" syscalls | 468 | * "Conditional" syscalls |
502 | * | 469 | * |
503 | * What we want is __attribute__((weak,alias("sys_ni_syscall"))), | 470 | * What we want is __attribute__((weak,alias("sys_ni_syscall"))), |
diff --git a/include/asm-powerpc/vdso_datapage.h b/include/asm-powerpc/vdso_datapage.h index 7aa92086c3fb..8a94f0eba5e9 100644 --- a/include/asm-powerpc/vdso_datapage.h +++ b/include/asm-powerpc/vdso_datapage.h | |||
@@ -55,6 +55,9 @@ struct vdso_data { | |||
55 | __u32 minor; /* Minor number 0x14 */ | 55 | __u32 minor; /* Minor number 0x14 */ |
56 | } version; | 56 | } version; |
57 | 57 | ||
58 | /* Note about the platform flags: it now only contains the lpar | ||
59 | * bit. The actual platform number is dead and burried | ||
60 | */ | ||
58 | __u32 platform; /* Platform flags 0x18 */ | 61 | __u32 platform; /* Platform flags 0x18 */ |
59 | __u32 processor; /* Processor type 0x1C */ | 62 | __u32 processor; /* Processor type 0x1C */ |
60 | __u64 processorCount; /* # of physical processors 0x20 */ | 63 | __u64 processorCount; /* # of physical processors 0x20 */ |
diff --git a/include/asm-ppc/machdep.h b/include/asm-ppc/machdep.h index a3e8a45e45a9..e1a0a7b213d7 100644 --- a/include/asm-ppc/machdep.h +++ b/include/asm-ppc/machdep.h | |||
@@ -19,6 +19,18 @@ struct pci_dev; | |||
19 | struct seq_file; | 19 | struct seq_file; |
20 | struct file; | 20 | struct file; |
21 | 21 | ||
22 | /* | ||
23 | * This is for compatibility with ARCH=powerpc. | ||
24 | */ | ||
25 | #define machine_is(x) __MACHINE_IS_##x | ||
26 | #define __MACHINE_IS_powermac 0 | ||
27 | #define __MACHINE_IS_chrp 0 | ||
28 | #ifdef CONFIG_PPC_PREP | ||
29 | #define __MACHINE_IS_prep 1 | ||
30 | #else | ||
31 | #define __MACHINE_IS_prep 0 | ||
32 | #endif | ||
33 | |||
22 | /* We export this macro for external modules like Alsa to know if | 34 | /* We export this macro for external modules like Alsa to know if |
23 | * ppc_md.feature_call is implemented or not | 35 | * ppc_md.feature_call is implemented or not |
24 | */ | 36 | */ |
@@ -44,7 +56,7 @@ struct machdep_calls { | |||
44 | void (*power_off)(void); | 56 | void (*power_off)(void); |
45 | void (*halt)(void); | 57 | void (*halt)(void); |
46 | 58 | ||
47 | void (*idle)(void); | 59 | void (*idle_loop)(void); |
48 | void (*power_save)(void); | 60 | void (*power_save)(void); |
49 | 61 | ||
50 | long (*time_init)(void); /* Optional, may be NULL */ | 62 | long (*time_init)(void); /* Optional, may be NULL */ |
@@ -104,9 +116,6 @@ struct machdep_calls { | |||
104 | unsigned long size, | 116 | unsigned long size, |
105 | pgprot_t vma_prot); | 117 | pgprot_t vma_prot); |
106 | 118 | ||
107 | /* this is for modules, since _machine can be a define -- Cort */ | ||
108 | int ppc_machine; | ||
109 | |||
110 | /* Motherboard/chipset features. This is a kind of general purpose | 119 | /* Motherboard/chipset features. This is a kind of general purpose |
111 | * hook used to control some machine specific features (like reset | 120 | * hook used to control some machine specific features (like reset |
112 | * lines, chip power control, etc...). | 121 | * lines, chip power control, etc...). |
diff --git a/include/asm-ppc/mpc52xx.h b/include/asm-ppc/mpc52xx.h index 6167f74635f7..7e9842805a28 100644 --- a/include/asm-ppc/mpc52xx.h +++ b/include/asm-ppc/mpc52xx.h | |||
@@ -355,6 +355,7 @@ struct mpc52xx_xlb { | |||
355 | u32 snoop_window; /* XLB + 0x70 */ | 355 | u32 snoop_window; /* XLB + 0x70 */ |
356 | }; | 356 | }; |
357 | 357 | ||
358 | #define MPC52xx_XLB_CFG_PLDIS (1 << 31) | ||
358 | #define MPC52xx_XLB_CFG_SNOOP (1 << 15) | 359 | #define MPC52xx_XLB_CFG_SNOOP (1 << 15) |
359 | 360 | ||
360 | /* Clock Distribution control */ | 361 | /* Clock Distribution control */ |
@@ -427,6 +428,9 @@ extern void mpc52xx_calibrate_decr(void); | |||
427 | 428 | ||
428 | extern void mpc52xx_find_bridges(void); | 429 | extern void mpc52xx_find_bridges(void); |
429 | 430 | ||
431 | extern void mpc52xx_setup_cpu(void); | ||
432 | |||
433 | |||
430 | 434 | ||
431 | /* Matching of PSC function */ | 435 | /* Matching of PSC function */ |
432 | struct mpc52xx_psc_func { | 436 | struct mpc52xx_psc_func { |
diff --git a/include/asm-ppc/page.h b/include/asm-ppc/page.h index 538e0c8ab243..a70ba2ee552d 100644 --- a/include/asm-ppc/page.h +++ b/include/asm-ppc/page.h | |||
@@ -149,8 +149,7 @@ extern int page_is_ram(unsigned long pfn); | |||
149 | #define __pa(x) ___pa((unsigned long)(x)) | 149 | #define __pa(x) ___pa((unsigned long)(x)) |
150 | #define __va(x) ((void *)(___va((unsigned long)(x)))) | 150 | #define __va(x) ((void *)(___va((unsigned long)(x)))) |
151 | 151 | ||
152 | #define pfn_to_page(pfn) (mem_map + ((pfn) - PPC_PGSTART)) | 152 | #define ARCH_PFN_OFFSET (PPC_PGSTART) |
153 | #define page_to_pfn(page) ((unsigned long)((page) - mem_map) + PPC_PGSTART) | ||
154 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) | 153 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) |
155 | #define page_to_virt(page) __va(page_to_pfn(page) << PAGE_SHIFT) | 154 | #define page_to_virt(page) __va(page_to_pfn(page) << PAGE_SHIFT) |
156 | 155 | ||
@@ -175,5 +174,6 @@ extern __inline__ int get_order(unsigned long size) | |||
175 | /* We do define AT_SYSINFO_EHDR but don't use the gate mecanism */ | 174 | /* We do define AT_SYSINFO_EHDR but don't use the gate mecanism */ |
176 | #define __HAVE_ARCH_GATE_AREA 1 | 175 | #define __HAVE_ARCH_GATE_AREA 1 |
177 | 176 | ||
177 | #include <asm-generic/memory_model.h> | ||
178 | #endif /* __KERNEL__ */ | 178 | #endif /* __KERNEL__ */ |
179 | #endif /* _PPC_PAGE_H */ | 179 | #endif /* _PPC_PAGE_H */ |
diff --git a/include/asm-ppc/pgtable.h b/include/asm-ppc/pgtable.h index e1c62da12e74..570b355162fa 100644 --- a/include/asm-ppc/pgtable.h +++ b/include/asm-ppc/pgtable.h | |||
@@ -837,7 +837,8 @@ static inline int io_remap_pfn_range(struct vm_area_struct *vma, | |||
837 | */ | 837 | */ |
838 | #define pgtable_cache_init() do { } while (0) | 838 | #define pgtable_cache_init() do { } while (0) |
839 | 839 | ||
840 | extern int get_pteptr(struct mm_struct *mm, unsigned long addr, pte_t **ptep); | 840 | extern int get_pteptr(struct mm_struct *mm, unsigned long addr, pte_t **ptep, |
841 | pmd_t **pmdp); | ||
841 | 842 | ||
842 | #include <asm-generic/pgtable.h> | 843 | #include <asm-generic/pgtable.h> |
843 | 844 | ||
diff --git a/include/asm-ppc/prom.h b/include/asm-ppc/prom.h index 6d431d6fb022..adc5ae784924 100644 --- a/include/asm-ppc/prom.h +++ b/include/asm-ppc/prom.h | |||
@@ -8,126 +8,19 @@ | |||
8 | #ifndef _PPC_PROM_H | 8 | #ifndef _PPC_PROM_H |
9 | #define _PPC_PROM_H | 9 | #define _PPC_PROM_H |
10 | 10 | ||
11 | #include <linux/config.h> | 11 | /* This is used in arch/ppc/mm/mem_pieces.h */ |
12 | #include <linux/types.h> | ||
13 | |||
14 | typedef u32 phandle; | ||
15 | typedef u32 ihandle; | ||
16 | |||
17 | struct address_range { | ||
18 | unsigned int space; | ||
19 | unsigned int address; | ||
20 | unsigned int size; | ||
21 | }; | ||
22 | |||
23 | struct interrupt_info { | ||
24 | int line; | ||
25 | int sense; /* +ve/-ve logic, edge or level, etc. */ | ||
26 | }; | ||
27 | |||
28 | struct reg_property { | 12 | struct reg_property { |
29 | unsigned int address; | 13 | unsigned int address; |
30 | unsigned int size; | 14 | unsigned int size; |
31 | }; | 15 | }; |
32 | 16 | ||
33 | struct property { | ||
34 | char *name; | ||
35 | int length; | ||
36 | unsigned char *value; | ||
37 | struct property *next; | ||
38 | }; | ||
39 | |||
40 | /* | ||
41 | * Note: don't change this structure for now or you'll break BootX ! | ||
42 | */ | ||
43 | struct device_node { | ||
44 | char *name; | ||
45 | char *type; | ||
46 | phandle node; | ||
47 | int n_addrs; | ||
48 | struct address_range *addrs; | ||
49 | int n_intrs; | ||
50 | struct interrupt_info *intrs; | ||
51 | char *full_name; | ||
52 | struct property *properties; | ||
53 | struct device_node *parent; | ||
54 | struct device_node *child; | ||
55 | struct device_node *sibling; | ||
56 | struct device_node *next; /* next device of same type */ | ||
57 | struct device_node *allnext; /* next in list of all nodes */ | ||
58 | }; | ||
59 | |||
60 | struct prom_args; | ||
61 | typedef void (*prom_entry)(struct prom_args *); | ||
62 | |||
63 | /* OBSOLETE: Old style node lookup */ | ||
64 | extern struct device_node *find_devices(const char *name); | ||
65 | extern struct device_node *find_type_devices(const char *type); | ||
66 | extern struct device_node *find_path_device(const char *path); | ||
67 | extern struct device_node *find_compatible_devices(const char *type, | ||
68 | const char *compat); | ||
69 | extern struct device_node *find_all_nodes(void); | ||
70 | |||
71 | /* New style node lookup */ | ||
72 | extern struct device_node *of_find_node_by_name(struct device_node *from, | ||
73 | const char *name); | ||
74 | extern struct device_node *of_find_node_by_type(struct device_node *from, | ||
75 | const char *type); | ||
76 | extern struct device_node *of_find_compatible_node(struct device_node *from, | ||
77 | const char *type, const char *compat); | ||
78 | extern struct device_node *of_find_node_by_path(const char *path); | ||
79 | extern struct device_node *of_find_all_nodes(struct device_node *prev); | ||
80 | extern struct device_node *of_get_parent(const struct device_node *node); | ||
81 | extern struct device_node *of_get_next_child(const struct device_node *node, | ||
82 | struct device_node *prev); | ||
83 | extern struct device_node *of_node_get(struct device_node *node); | ||
84 | extern void of_node_put(struct device_node *node); | ||
85 | |||
86 | /* Other Prototypes */ | ||
87 | extern void abort(void); | ||
88 | extern unsigned long prom_init(int, int, prom_entry); | ||
89 | extern void prom_print(const char *msg); | ||
90 | extern void relocate_nodes(void); | ||
91 | extern void finish_device_tree(void); | ||
92 | extern int device_is_compatible(struct device_node *device, const char *); | ||
93 | extern int machine_is_compatible(const char *compat); | ||
94 | extern unsigned char *get_property(struct device_node *node, const char *name, | ||
95 | int *lenp); | ||
96 | extern int prom_add_property(struct device_node* np, struct property* prop); | ||
97 | extern void prom_get_irq_senses(unsigned char *, int, int); | ||
98 | extern int prom_n_addr_cells(struct device_node* np); | ||
99 | extern int prom_n_size_cells(struct device_node* np); | ||
100 | |||
101 | extern struct resource* | ||
102 | request_OF_resource(struct device_node* node, int index, const char* name_postfix); | ||
103 | extern int release_OF_resource(struct device_node* node, int index); | ||
104 | |||
105 | extern void print_properties(struct device_node *node); | ||
106 | extern int call_rtas(const char *service, int nargs, int nret, | ||
107 | unsigned long *outputs, ...); | ||
108 | |||
109 | /* | 17 | /* |
110 | * PCI <-> OF matching functions | 18 | * These macros assist in performing the address calculations that we |
111 | */ | 19 | * need to do to access data when the kernel is running at an address |
112 | struct pci_bus; | 20 | * that is different from the address that the kernel is linked at. |
113 | struct pci_dev; | 21 | * The reloc_offset() function returns the difference between these |
114 | extern int pci_device_from_OF_node(struct device_node *node, | 22 | * two addresses and the macros simplify the process of adding or |
115 | u8* bus, u8* devfn); | 23 | * subtracting this offset to/from pointer values. |
116 | extern struct device_node* pci_busdev_to_OF_node(struct pci_bus *, int); | ||
117 | extern struct device_node* pci_device_to_OF_node(struct pci_dev *); | ||
118 | extern void pci_create_OF_bus_map(void); | ||
119 | |||
120 | /* | ||
121 | * When we call back to the Open Firmware client interface, we usually | ||
122 | * have to do that before the kernel is relocated to its final location | ||
123 | * (this is because we can't use OF after we have overwritten the | ||
124 | * exception vectors with our exception handlers). These macros assist | ||
125 | * in performing the address calculations that we need to do to access | ||
126 | * data when the kernel is running at an address that is different from | ||
127 | * the address that the kernel is linked at. The reloc_offset() function | ||
128 | * returns the difference between these two addresses and the macros | ||
129 | * simplify the process of adding or subtracting this offset to/from | ||
130 | * pointer values. See arch/ppc/kernel/prom.c for how these are used. | ||
131 | */ | 24 | */ |
132 | extern unsigned long reloc_offset(void); | 25 | extern unsigned long reloc_offset(void); |
133 | extern unsigned long add_reloc_offset(unsigned long); | 26 | extern unsigned long add_reloc_offset(unsigned long); |
@@ -136,45 +29,12 @@ extern unsigned long sub_reloc_offset(unsigned long); | |||
136 | #define PTRRELOC(x) ((typeof(x))add_reloc_offset((unsigned long)(x))) | 29 | #define PTRRELOC(x) ((typeof(x))add_reloc_offset((unsigned long)(x))) |
137 | #define PTRUNRELOC(x) ((typeof(x))sub_reloc_offset((unsigned long)(x))) | 30 | #define PTRUNRELOC(x) ((typeof(x))sub_reloc_offset((unsigned long)(x))) |
138 | 31 | ||
139 | |||
140 | /* | ||
141 | * OF address retreival & translation | ||
142 | */ | ||
143 | |||
144 | |||
145 | /* Translate an OF address block into a CPU physical address | ||
146 | */ | ||
147 | #define OF_BAD_ADDR ((u64)-1) | ||
148 | extern u64 of_translate_address(struct device_node *np, u32 *addr); | ||
149 | |||
150 | /* Extract an address from a device, returns the region size and | ||
151 | * the address space flags too. The PCI version uses a BAR number | ||
152 | * instead of an absolute index | ||
153 | */ | ||
154 | extern u32 *of_get_address(struct device_node *dev, int index, | ||
155 | u64 *size, unsigned int *flags); | ||
156 | extern u32 *of_get_pci_address(struct device_node *dev, int bar_no, | ||
157 | u64 *size, unsigned int *flags); | ||
158 | |||
159 | /* Get an address as a resource. Note that if your address is | ||
160 | * a PIO address, the conversion will fail if the physical address | ||
161 | * can't be internally converted to an IO token with | ||
162 | * pci_address_to_pio(), that is because it's either called to early | ||
163 | * or it can't be matched to any host bridge IO space | ||
164 | */ | ||
165 | extern int of_address_to_resource(struct device_node *dev, int index, | ||
166 | struct resource *r); | ||
167 | extern int of_pci_address_to_resource(struct device_node *dev, int bar, | ||
168 | struct resource *r); | ||
169 | |||
170 | #ifndef CONFIG_PPC_OF | ||
171 | /* | 32 | /* |
172 | * Fallback definitions for builds where we don't have prom.c included. | 33 | * Fallback definitions since we don't support OF in arch/ppc any more. |
173 | */ | 34 | */ |
174 | #define machine_is_compatible(x) 0 | 35 | #define machine_is_compatible(x) 0 |
175 | #define of_find_compatible_node(f, t, c) NULL | 36 | #define of_find_compatible_node(f, t, c) NULL |
176 | #define get_property(p, n, l) NULL | 37 | #define get_property(p, n, l) NULL |
177 | #endif | ||
178 | 38 | ||
179 | #endif /* _PPC_PROM_H */ | 39 | #endif /* _PPC_PROM_H */ |
180 | #endif /* __KERNEL__ */ | 40 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-ppc/serial.h b/include/asm-ppc/serial.h index 485a924e4d06..b74af5461564 100644 --- a/include/asm-ppc/serial.h +++ b/include/asm-ppc/serial.h | |||
@@ -41,15 +41,10 @@ | |||
41 | #else | 41 | #else |
42 | 42 | ||
43 | /* | 43 | /* |
44 | * XXX Assume for now it has PC-style ISA serial ports. | 44 | * XXX Assume it has PC-style ISA serial ports - true for PReP at least. |
45 | * This is true for PReP and CHRP at least. | ||
46 | */ | 45 | */ |
47 | #include <asm/pc_serial.h> | 46 | #include <asm/pc_serial.h> |
48 | 47 | ||
49 | #if defined(CONFIG_MAC_SERIAL) | ||
50 | #define SERIAL_DEV_OFFSET ((_machine == _MACH_prep || _machine == _MACH_chrp) ? 0 : 2) | ||
51 | #endif | ||
52 | |||
53 | #endif /* !CONFIG_GEMINI and others */ | 48 | #endif /* !CONFIG_GEMINI and others */ |
54 | #endif /* __ASM_SERIAL_H__ */ | 49 | #endif /* __ASM_SERIAL_H__ */ |
55 | #endif /* __KERNEL__ */ | 50 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-s390/bitops.h b/include/asm-s390/bitops.h index 3628899f48bb..ca092ffb7a95 100644 --- a/include/asm-s390/bitops.h +++ b/include/asm-s390/bitops.h | |||
@@ -828,35 +828,12 @@ static inline int sched_find_first_bit(unsigned long *b) | |||
828 | return find_first_bit(b, 140); | 828 | return find_first_bit(b, 140); |
829 | } | 829 | } |
830 | 830 | ||
831 | /* | 831 | #include <asm-generic/bitops/ffs.h> |
832 | * ffs: find first bit set. This is defined the same way as | ||
833 | * the libc and compiler builtin ffs routines, therefore | ||
834 | * differs in spirit from the above ffz (man ffs). | ||
835 | */ | ||
836 | #define ffs(x) generic_ffs(x) | ||
837 | 832 | ||
838 | /* | 833 | #include <asm-generic/bitops/fls.h> |
839 | * fls: find last bit set. | 834 | #include <asm-generic/bitops/fls64.h> |
840 | */ | ||
841 | #define fls(x) generic_fls(x) | ||
842 | #define fls64(x) generic_fls64(x) | ||
843 | |||
844 | /* | ||
845 | * hweightN: returns the hamming weight (i.e. the number | ||
846 | * of bits set) of a N-bit word | ||
847 | */ | ||
848 | #define hweight64(x) \ | ||
849 | ({ \ | ||
850 | unsigned long __x = (x); \ | ||
851 | unsigned int __w; \ | ||
852 | __w = generic_hweight32((unsigned int) __x); \ | ||
853 | __w += generic_hweight32((unsigned int) (__x>>32)); \ | ||
854 | __w; \ | ||
855 | }) | ||
856 | #define hweight32(x) generic_hweight32(x) | ||
857 | #define hweight16(x) generic_hweight16(x) | ||
858 | #define hweight8(x) generic_hweight8(x) | ||
859 | 835 | ||
836 | #include <asm-generic/bitops/hweight.h> | ||
860 | 837 | ||
861 | #ifdef __KERNEL__ | 838 | #ifdef __KERNEL__ |
862 | 839 | ||
@@ -871,11 +848,11 @@ static inline int sched_find_first_bit(unsigned long *b) | |||
871 | */ | 848 | */ |
872 | 849 | ||
873 | #define ext2_set_bit(nr, addr) \ | 850 | #define ext2_set_bit(nr, addr) \ |
874 | test_and_set_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr) | 851 | __test_and_set_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr) |
875 | #define ext2_set_bit_atomic(lock, nr, addr) \ | 852 | #define ext2_set_bit_atomic(lock, nr, addr) \ |
876 | test_and_set_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr) | 853 | test_and_set_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr) |
877 | #define ext2_clear_bit(nr, addr) \ | 854 | #define ext2_clear_bit(nr, addr) \ |
878 | test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr) | 855 | __test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr) |
879 | #define ext2_clear_bit_atomic(lock, nr, addr) \ | 856 | #define ext2_clear_bit_atomic(lock, nr, addr) \ |
880 | test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr) | 857 | test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr) |
881 | #define ext2_test_bit(nr, addr) \ | 858 | #define ext2_test_bit(nr, addr) \ |
@@ -1011,18 +988,7 @@ ext2_find_next_zero_bit(void *vaddr, unsigned long size, unsigned long offset) | |||
1011 | return offset + ext2_find_first_zero_bit(p, size); | 988 | return offset + ext2_find_first_zero_bit(p, size); |
1012 | } | 989 | } |
1013 | 990 | ||
1014 | /* Bitmap functions for the minix filesystem. */ | 991 | #include <asm-generic/bitops/minix.h> |
1015 | /* FIXME !!! */ | ||
1016 | #define minix_test_and_set_bit(nr,addr) \ | ||
1017 | test_and_set_bit(nr,(unsigned long *)addr) | ||
1018 | #define minix_set_bit(nr,addr) \ | ||
1019 | set_bit(nr,(unsigned long *)addr) | ||
1020 | #define minix_test_and_clear_bit(nr,addr) \ | ||
1021 | test_and_clear_bit(nr,(unsigned long *)addr) | ||
1022 | #define minix_test_bit(nr,addr) \ | ||
1023 | test_bit(nr,(unsigned long *)addr) | ||
1024 | #define minix_find_first_zero_bit(addr,size) \ | ||
1025 | find_first_zero_bit(addr,size) | ||
1026 | 992 | ||
1027 | #endif /* __KERNEL__ */ | 993 | #endif /* __KERNEL__ */ |
1028 | 994 | ||
diff --git a/include/asm-s390/compat.h b/include/asm-s390/compat.h index a007715f4aea..356a0b183539 100644 --- a/include/asm-s390/compat.h +++ b/include/asm-s390/compat.h | |||
@@ -128,6 +128,11 @@ static inline void __user *compat_ptr(compat_uptr_t uptr) | |||
128 | return (void __user *)(unsigned long)(uptr & 0x7fffffffUL); | 128 | return (void __user *)(unsigned long)(uptr & 0x7fffffffUL); |
129 | } | 129 | } |
130 | 130 | ||
131 | static inline compat_uptr_t ptr_to_compat(void __user *uptr) | ||
132 | { | ||
133 | return (u32)(unsigned long)uptr; | ||
134 | } | ||
135 | |||
131 | static inline void __user *compat_alloc_user_space(long len) | 136 | static inline void __user *compat_alloc_user_space(long len) |
132 | { | 137 | { |
133 | unsigned long stack; | 138 | unsigned long stack; |
diff --git a/include/asm-s390/page.h b/include/asm-s390/page.h index 2430c561e021..3b1138ac7e79 100644 --- a/include/asm-s390/page.h +++ b/include/asm-s390/page.h | |||
@@ -181,8 +181,6 @@ page_get_storage_key(unsigned long addr) | |||
181 | #define PAGE_OFFSET 0x0UL | 181 | #define PAGE_OFFSET 0x0UL |
182 | #define __pa(x) (unsigned long)(x) | 182 | #define __pa(x) (unsigned long)(x) |
183 | #define __va(x) (void *)(unsigned long)(x) | 183 | #define __va(x) (void *)(unsigned long)(x) |
184 | #define pfn_to_page(pfn) (mem_map + (pfn)) | ||
185 | #define page_to_pfn(page) ((unsigned long)((page) - mem_map)) | ||
186 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) | 184 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) |
187 | 185 | ||
188 | #define pfn_valid(pfn) ((pfn) < max_mapnr) | 186 | #define pfn_valid(pfn) ((pfn) < max_mapnr) |
@@ -193,6 +191,7 @@ page_get_storage_key(unsigned long addr) | |||
193 | 191 | ||
194 | #endif /* __KERNEL__ */ | 192 | #endif /* __KERNEL__ */ |
195 | 193 | ||
194 | #include <asm-generic/memory_model.h> | ||
196 | #include <asm-generic/page.h> | 195 | #include <asm-generic/page.h> |
197 | 196 | ||
198 | #endif /* _S390_PAGE_H */ | 197 | #endif /* _S390_PAGE_H */ |
diff --git a/include/asm-s390/poll.h b/include/asm-s390/poll.h index e90a5ca42061..6f7f65ac7d27 100644 --- a/include/asm-s390/poll.h +++ b/include/asm-s390/poll.h | |||
@@ -24,6 +24,7 @@ | |||
24 | #define POLLWRBAND 0x0200 | 24 | #define POLLWRBAND 0x0200 |
25 | #define POLLMSG 0x0400 | 25 | #define POLLMSG 0x0400 |
26 | #define POLLREMOVE 0x1000 | 26 | #define POLLREMOVE 0x1000 |
27 | #define POLLRDHUP 0x2000 | ||
27 | 28 | ||
28 | struct pollfd { | 29 | struct pollfd { |
29 | int fd; | 30 | int fd; |
diff --git a/include/asm-s390/types.h b/include/asm-s390/types.h index d0be3e477013..5738ad63537c 100644 --- a/include/asm-s390/types.h +++ b/include/asm-s390/types.h | |||
@@ -93,6 +93,11 @@ typedef u64 sector_t; | |||
93 | #define HAVE_SECTOR_T | 93 | #define HAVE_SECTOR_T |
94 | #endif | 94 | #endif |
95 | 95 | ||
96 | #ifdef CONFIG_LSF | ||
97 | typedef u64 blkcnt_t; | ||
98 | #define HAVE_BLKCNT_T | ||
99 | #endif | ||
100 | |||
96 | #endif /* ! __s390x__ */ | 101 | #endif /* ! __s390x__ */ |
97 | #endif /* __ASSEMBLY__ */ | 102 | #endif /* __ASSEMBLY__ */ |
98 | #endif /* __KERNEL__ */ | 103 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-sh/addrspace.h b/include/asm-sh/addrspace.h index dbb05d1a26d1..720afc11c2ca 100644 --- a/include/asm-sh/addrspace.h +++ b/include/asm-sh/addrspace.h | |||
@@ -13,7 +13,7 @@ | |||
13 | 13 | ||
14 | #include <asm/cpu/addrspace.h> | 14 | #include <asm/cpu/addrspace.h> |
15 | 15 | ||
16 | /* Memory segments (32bit Priviledged mode addresses) */ | 16 | /* Memory segments (32bit Privileged mode addresses) */ |
17 | #define P0SEG 0x00000000 | 17 | #define P0SEG 0x00000000 |
18 | #define P1SEG 0x80000000 | 18 | #define P1SEG 0x80000000 |
19 | #define P2SEG 0xa0000000 | 19 | #define P2SEG 0xa0000000 |
diff --git a/include/asm-sh/bitops.h b/include/asm-sh/bitops.h index 1c5260860045..e34f82508568 100644 --- a/include/asm-sh/bitops.h +++ b/include/asm-sh/bitops.h | |||
@@ -19,16 +19,6 @@ static __inline__ void set_bit(int nr, volatile void * addr) | |||
19 | local_irq_restore(flags); | 19 | local_irq_restore(flags); |
20 | } | 20 | } |
21 | 21 | ||
22 | static __inline__ void __set_bit(int nr, volatile void * addr) | ||
23 | { | ||
24 | int mask; | ||
25 | volatile unsigned int *a = addr; | ||
26 | |||
27 | a += nr >> 5; | ||
28 | mask = 1 << (nr & 0x1f); | ||
29 | *a |= mask; | ||
30 | } | ||
31 | |||
32 | /* | 22 | /* |
33 | * clear_bit() doesn't provide any barrier for the compiler. | 23 | * clear_bit() doesn't provide any barrier for the compiler. |
34 | */ | 24 | */ |
@@ -47,16 +37,6 @@ static __inline__ void clear_bit(int nr, volatile void * addr) | |||
47 | local_irq_restore(flags); | 37 | local_irq_restore(flags); |
48 | } | 38 | } |
49 | 39 | ||
50 | static __inline__ void __clear_bit(int nr, volatile void * addr) | ||
51 | { | ||
52 | int mask; | ||
53 | volatile unsigned int *a = addr; | ||
54 | |||
55 | a += nr >> 5; | ||
56 | mask = 1 << (nr & 0x1f); | ||
57 | *a &= ~mask; | ||
58 | } | ||
59 | |||
60 | static __inline__ void change_bit(int nr, volatile void * addr) | 40 | static __inline__ void change_bit(int nr, volatile void * addr) |
61 | { | 41 | { |
62 | int mask; | 42 | int mask; |
@@ -70,16 +50,6 @@ static __inline__ void change_bit(int nr, volatile void * addr) | |||
70 | local_irq_restore(flags); | 50 | local_irq_restore(flags); |
71 | } | 51 | } |
72 | 52 | ||
73 | static __inline__ void __change_bit(int nr, volatile void * addr) | ||
74 | { | ||
75 | int mask; | ||
76 | volatile unsigned int *a = addr; | ||
77 | |||
78 | a += nr >> 5; | ||
79 | mask = 1 << (nr & 0x1f); | ||
80 | *a ^= mask; | ||
81 | } | ||
82 | |||
83 | static __inline__ int test_and_set_bit(int nr, volatile void * addr) | 53 | static __inline__ int test_and_set_bit(int nr, volatile void * addr) |
84 | { | 54 | { |
85 | int mask, retval; | 55 | int mask, retval; |
@@ -96,19 +66,6 @@ static __inline__ int test_and_set_bit(int nr, volatile void * addr) | |||
96 | return retval; | 66 | return retval; |
97 | } | 67 | } |
98 | 68 | ||
99 | static __inline__ int __test_and_set_bit(int nr, volatile void * addr) | ||
100 | { | ||
101 | int mask, retval; | ||
102 | volatile unsigned int *a = addr; | ||
103 | |||
104 | a += nr >> 5; | ||
105 | mask = 1 << (nr & 0x1f); | ||
106 | retval = (mask & *a) != 0; | ||
107 | *a |= mask; | ||
108 | |||
109 | return retval; | ||
110 | } | ||
111 | |||
112 | static __inline__ int test_and_clear_bit(int nr, volatile void * addr) | 69 | static __inline__ int test_and_clear_bit(int nr, volatile void * addr) |
113 | { | 70 | { |
114 | int mask, retval; | 71 | int mask, retval; |
@@ -125,19 +82,6 @@ static __inline__ int test_and_clear_bit(int nr, volatile void * addr) | |||
125 | return retval; | 82 | return retval; |
126 | } | 83 | } |
127 | 84 | ||
128 | static __inline__ int __test_and_clear_bit(int nr, volatile void * addr) | ||
129 | { | ||
130 | int mask, retval; | ||
131 | volatile unsigned int *a = addr; | ||
132 | |||
133 | a += nr >> 5; | ||
134 | mask = 1 << (nr & 0x1f); | ||
135 | retval = (mask & *a) != 0; | ||
136 | *a &= ~mask; | ||
137 | |||
138 | return retval; | ||
139 | } | ||
140 | |||
141 | static __inline__ int test_and_change_bit(int nr, volatile void * addr) | 85 | static __inline__ int test_and_change_bit(int nr, volatile void * addr) |
142 | { | 86 | { |
143 | int mask, retval; | 87 | int mask, retval; |
@@ -154,23 +98,7 @@ static __inline__ int test_and_change_bit(int nr, volatile void * addr) | |||
154 | return retval; | 98 | return retval; |
155 | } | 99 | } |
156 | 100 | ||
157 | static __inline__ int __test_and_change_bit(int nr, volatile void * addr) | 101 | #include <asm-generic/bitops/non-atomic.h> |
158 | { | ||
159 | int mask, retval; | ||
160 | volatile unsigned int *a = addr; | ||
161 | |||
162 | a += nr >> 5; | ||
163 | mask = 1 << (nr & 0x1f); | ||
164 | retval = (mask & *a) != 0; | ||
165 | *a ^= mask; | ||
166 | |||
167 | return retval; | ||
168 | } | ||
169 | |||
170 | static __inline__ int test_bit(int nr, const volatile void *addr) | ||
171 | { | ||
172 | return 1UL & (((const volatile unsigned int *) addr)[nr >> 5] >> (nr & 31)); | ||
173 | } | ||
174 | 102 | ||
175 | static __inline__ unsigned long ffz(unsigned long word) | 103 | static __inline__ unsigned long ffz(unsigned long word) |
176 | { | 104 | { |
@@ -206,271 +134,15 @@ static __inline__ unsigned long __ffs(unsigned long word) | |||
206 | return result; | 134 | return result; |
207 | } | 135 | } |
208 | 136 | ||
209 | /** | 137 | #include <asm-generic/bitops/find.h> |
210 | * find_next_bit - find the next set bit in a memory region | 138 | #include <asm-generic/bitops/ffs.h> |
211 | * @addr: The address to base the search on | 139 | #include <asm-generic/bitops/hweight.h> |
212 | * @offset: The bitnumber to start searching at | 140 | #include <asm-generic/bitops/sched.h> |
213 | * @size: The maximum size to search | 141 | #include <asm-generic/bitops/ext2-non-atomic.h> |
214 | */ | 142 | #include <asm-generic/bitops/ext2-atomic.h> |
215 | static __inline__ unsigned long find_next_bit(const unsigned long *addr, | 143 | #include <asm-generic/bitops/minix.h> |
216 | unsigned long size, unsigned long offset) | 144 | #include <asm-generic/bitops/fls.h> |
217 | { | 145 | #include <asm-generic/bitops/fls64.h> |
218 | unsigned int *p = ((unsigned int *) addr) + (offset >> 5); | ||
219 | unsigned int result = offset & ~31UL; | ||
220 | unsigned int tmp; | ||
221 | |||
222 | if (offset >= size) | ||
223 | return size; | ||
224 | size -= result; | ||
225 | offset &= 31UL; | ||
226 | if (offset) { | ||
227 | tmp = *p++; | ||
228 | tmp &= ~0UL << offset; | ||
229 | if (size < 32) | ||
230 | goto found_first; | ||
231 | if (tmp) | ||
232 | goto found_middle; | ||
233 | size -= 32; | ||
234 | result += 32; | ||
235 | } | ||
236 | while (size >= 32) { | ||
237 | if ((tmp = *p++) != 0) | ||
238 | goto found_middle; | ||
239 | result += 32; | ||
240 | size -= 32; | ||
241 | } | ||
242 | if (!size) | ||
243 | return result; | ||
244 | tmp = *p; | ||
245 | |||
246 | found_first: | ||
247 | tmp &= ~0UL >> (32 - size); | ||
248 | if (tmp == 0UL) /* Are any bits set? */ | ||
249 | return result + size; /* Nope. */ | ||
250 | found_middle: | ||
251 | return result + __ffs(tmp); | ||
252 | } | ||
253 | |||
254 | /** | ||
255 | * find_first_bit - find the first set bit in a memory region | ||
256 | * @addr: The address to start the search at | ||
257 | * @size: The maximum size to search | ||
258 | * | ||
259 | * Returns the bit-number of the first set bit, not the number of the byte | ||
260 | * containing a bit. | ||
261 | */ | ||
262 | #define find_first_bit(addr, size) \ | ||
263 | find_next_bit((addr), (size), 0) | ||
264 | |||
265 | static __inline__ int find_next_zero_bit(const unsigned long *addr, int size, int offset) | ||
266 | { | ||
267 | const unsigned long *p = ((unsigned long *) addr) + (offset >> 5); | ||
268 | unsigned long result = offset & ~31UL; | ||
269 | unsigned long tmp; | ||
270 | |||
271 | if (offset >= size) | ||
272 | return size; | ||
273 | size -= result; | ||
274 | offset &= 31UL; | ||
275 | if (offset) { | ||
276 | tmp = *(p++); | ||
277 | tmp |= ~0UL >> (32-offset); | ||
278 | if (size < 32) | ||
279 | goto found_first; | ||
280 | if (~tmp) | ||
281 | goto found_middle; | ||
282 | size -= 32; | ||
283 | result += 32; | ||
284 | } | ||
285 | while (size & ~31UL) { | ||
286 | if (~(tmp = *(p++))) | ||
287 | goto found_middle; | ||
288 | result += 32; | ||
289 | size -= 32; | ||
290 | } | ||
291 | if (!size) | ||
292 | return result; | ||
293 | tmp = *p; | ||
294 | |||
295 | found_first: | ||
296 | tmp |= ~0UL << size; | ||
297 | found_middle: | ||
298 | return result + ffz(tmp); | ||
299 | } | ||
300 | |||
301 | #define find_first_zero_bit(addr, size) \ | ||
302 | find_next_zero_bit((addr), (size), 0) | ||
303 | |||
304 | /* | ||
305 | * ffs: find first bit set. This is defined the same way as | ||
306 | * the libc and compiler builtin ffs routines, therefore | ||
307 | * differs in spirit from the above ffz (man ffs). | ||
308 | */ | ||
309 | |||
310 | #define ffs(x) generic_ffs(x) | ||
311 | |||
312 | /* | ||
313 | * hweightN: returns the hamming weight (i.e. the number | ||
314 | * of bits set) of a N-bit word | ||
315 | */ | ||
316 | |||
317 | #define hweight32(x) generic_hweight32(x) | ||
318 | #define hweight16(x) generic_hweight16(x) | ||
319 | #define hweight8(x) generic_hweight8(x) | ||
320 | |||
321 | /* | ||
322 | * Every architecture must define this function. It's the fastest | ||
323 | * way of searching a 140-bit bitmap where the first 100 bits are | ||
324 | * unlikely to be set. It's guaranteed that at least one of the 140 | ||
325 | * bits is cleared. | ||
326 | */ | ||
327 | |||
328 | static inline int sched_find_first_bit(const unsigned long *b) | ||
329 | { | ||
330 | if (unlikely(b[0])) | ||
331 | return __ffs(b[0]); | ||
332 | if (unlikely(b[1])) | ||
333 | return __ffs(b[1]) + 32; | ||
334 | if (unlikely(b[2])) | ||
335 | return __ffs(b[2]) + 64; | ||
336 | if (b[3]) | ||
337 | return __ffs(b[3]) + 96; | ||
338 | return __ffs(b[4]) + 128; | ||
339 | } | ||
340 | |||
341 | #ifdef __LITTLE_ENDIAN__ | ||
342 | #define ext2_set_bit(nr, addr) test_and_set_bit((nr), (addr)) | ||
343 | #define ext2_clear_bit(nr, addr) test_and_clear_bit((nr), (addr)) | ||
344 | #define ext2_test_bit(nr, addr) test_bit((nr), (addr)) | ||
345 | #define ext2_find_first_zero_bit(addr, size) find_first_zero_bit((addr), (size)) | ||
346 | #define ext2_find_next_zero_bit(addr, size, offset) \ | ||
347 | find_next_zero_bit((unsigned long *)(addr), (size), (offset)) | ||
348 | #else | ||
349 | static __inline__ int ext2_set_bit(int nr, volatile void * addr) | ||
350 | { | ||
351 | int mask, retval; | ||
352 | unsigned long flags; | ||
353 | volatile unsigned char *ADDR = (unsigned char *) addr; | ||
354 | |||
355 | ADDR += nr >> 3; | ||
356 | mask = 1 << (nr & 0x07); | ||
357 | local_irq_save(flags); | ||
358 | retval = (mask & *ADDR) != 0; | ||
359 | *ADDR |= mask; | ||
360 | local_irq_restore(flags); | ||
361 | return retval; | ||
362 | } | ||
363 | |||
364 | static __inline__ int ext2_clear_bit(int nr, volatile void * addr) | ||
365 | { | ||
366 | int mask, retval; | ||
367 | unsigned long flags; | ||
368 | volatile unsigned char *ADDR = (unsigned char *) addr; | ||
369 | |||
370 | ADDR += nr >> 3; | ||
371 | mask = 1 << (nr & 0x07); | ||
372 | local_irq_save(flags); | ||
373 | retval = (mask & *ADDR) != 0; | ||
374 | *ADDR &= ~mask; | ||
375 | local_irq_restore(flags); | ||
376 | return retval; | ||
377 | } | ||
378 | |||
379 | static __inline__ int ext2_test_bit(int nr, const volatile void * addr) | ||
380 | { | ||
381 | int mask; | ||
382 | const volatile unsigned char *ADDR = (const unsigned char *) addr; | ||
383 | |||
384 | ADDR += nr >> 3; | ||
385 | mask = 1 << (nr & 0x07); | ||
386 | return ((mask & *ADDR) != 0); | ||
387 | } | ||
388 | |||
389 | #define ext2_find_first_zero_bit(addr, size) \ | ||
390 | ext2_find_next_zero_bit((addr), (size), 0) | ||
391 | |||
392 | static __inline__ unsigned long ext2_find_next_zero_bit(void *addr, unsigned long size, unsigned long offset) | ||
393 | { | ||
394 | unsigned long *p = ((unsigned long *) addr) + (offset >> 5); | ||
395 | unsigned long result = offset & ~31UL; | ||
396 | unsigned long tmp; | ||
397 | |||
398 | if (offset >= size) | ||
399 | return size; | ||
400 | size -= result; | ||
401 | offset &= 31UL; | ||
402 | if(offset) { | ||
403 | /* We hold the little endian value in tmp, but then the | ||
404 | * shift is illegal. So we could keep a big endian value | ||
405 | * in tmp, like this: | ||
406 | * | ||
407 | * tmp = __swab32(*(p++)); | ||
408 | * tmp |= ~0UL >> (32-offset); | ||
409 | * | ||
410 | * but this would decrease preformance, so we change the | ||
411 | * shift: | ||
412 | */ | ||
413 | tmp = *(p++); | ||
414 | tmp |= __swab32(~0UL >> (32-offset)); | ||
415 | if(size < 32) | ||
416 | goto found_first; | ||
417 | if(~tmp) | ||
418 | goto found_middle; | ||
419 | size -= 32; | ||
420 | result += 32; | ||
421 | } | ||
422 | while(size & ~31UL) { | ||
423 | if(~(tmp = *(p++))) | ||
424 | goto found_middle; | ||
425 | result += 32; | ||
426 | size -= 32; | ||
427 | } | ||
428 | if(!size) | ||
429 | return result; | ||
430 | tmp = *p; | ||
431 | |||
432 | found_first: | ||
433 | /* tmp is little endian, so we would have to swab the shift, | ||
434 | * see above. But then we have to swab tmp below for ffz, so | ||
435 | * we might as well do this here. | ||
436 | */ | ||
437 | return result + ffz(__swab32(tmp) | (~0UL << size)); | ||
438 | found_middle: | ||
439 | return result + ffz(__swab32(tmp)); | ||
440 | } | ||
441 | #endif | ||
442 | |||
443 | #define ext2_set_bit_atomic(lock, nr, addr) \ | ||
444 | ({ \ | ||
445 | int ret; \ | ||
446 | spin_lock(lock); \ | ||
447 | ret = ext2_set_bit((nr), (addr)); \ | ||
448 | spin_unlock(lock); \ | ||
449 | ret; \ | ||
450 | }) | ||
451 | |||
452 | #define ext2_clear_bit_atomic(lock, nr, addr) \ | ||
453 | ({ \ | ||
454 | int ret; \ | ||
455 | spin_lock(lock); \ | ||
456 | ret = ext2_clear_bit((nr), (addr)); \ | ||
457 | spin_unlock(lock); \ | ||
458 | ret; \ | ||
459 | }) | ||
460 | |||
461 | /* Bitmap functions for the minix filesystem. */ | ||
462 | #define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr) | ||
463 | #define minix_set_bit(nr,addr) set_bit(nr,addr) | ||
464 | #define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr) | ||
465 | #define minix_test_bit(nr,addr) test_bit(nr,addr) | ||
466 | #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) | ||
467 | |||
468 | /* | ||
469 | * fls: find last bit set. | ||
470 | */ | ||
471 | |||
472 | #define fls(x) generic_fls(x) | ||
473 | #define fls64(x) generic_fls64(x) | ||
474 | 146 | ||
475 | #endif /* __KERNEL__ */ | 147 | #endif /* __KERNEL__ */ |
476 | 148 | ||
diff --git a/include/asm-sh/page.h b/include/asm-sh/page.h index 972c3f655b2a..9c89287c3e56 100644 --- a/include/asm-sh/page.h +++ b/include/asm-sh/page.h | |||
@@ -105,9 +105,7 @@ typedef struct { unsigned long pgprot; } pgprot_t; | |||
105 | 105 | ||
106 | /* PFN start number, because of __MEMORY_START */ | 106 | /* PFN start number, because of __MEMORY_START */ |
107 | #define PFN_START (__MEMORY_START >> PAGE_SHIFT) | 107 | #define PFN_START (__MEMORY_START >> PAGE_SHIFT) |
108 | 108 | #define ARCH_PFN_OFFSET (FPN_START) | |
109 | #define pfn_to_page(pfn) (mem_map + (pfn) - PFN_START) | ||
110 | #define page_to_pfn(page) ((unsigned long)((page) - mem_map) + PFN_START) | ||
111 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) | 109 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) |
112 | #define pfn_valid(pfn) (((pfn) - PFN_START) < max_mapnr) | 110 | #define pfn_valid(pfn) (((pfn) - PFN_START) < max_mapnr) |
113 | #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) | 111 | #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) |
@@ -117,6 +115,7 @@ typedef struct { unsigned long pgprot; } pgprot_t; | |||
117 | 115 | ||
118 | #endif /* __KERNEL__ */ | 116 | #endif /* __KERNEL__ */ |
119 | 117 | ||
118 | #include <asm-generic/memory_model.h> | ||
120 | #include <asm-generic/page.h> | 119 | #include <asm-generic/page.h> |
121 | 120 | ||
122 | #endif /* __ASM_SH_PAGE_H */ | 121 | #endif /* __ASM_SH_PAGE_H */ |
diff --git a/include/asm-sh/poll.h b/include/asm-sh/poll.h index 52f95b9188dc..dbca9b32f4a6 100644 --- a/include/asm-sh/poll.h +++ b/include/asm-sh/poll.h | |||
@@ -16,6 +16,7 @@ | |||
16 | #define POLLWRBAND 0x0200 | 16 | #define POLLWRBAND 0x0200 |
17 | #define POLLMSG 0x0400 | 17 | #define POLLMSG 0x0400 |
18 | #define POLLREMOVE 0x1000 | 18 | #define POLLREMOVE 0x1000 |
19 | #define POLLRDHUP 0x2000 | ||
19 | 20 | ||
20 | struct pollfd { | 21 | struct pollfd { |
21 | int fd; | 22 | int fd; |
diff --git a/include/asm-sh/stat.h b/include/asm-sh/stat.h index 914e3fcbbd37..6c41a60657f1 100644 --- a/include/asm-sh/stat.h +++ b/include/asm-sh/stat.h | |||
@@ -60,13 +60,7 @@ struct stat64 { | |||
60 | long long st_size; | 60 | long long st_size; |
61 | unsigned long st_blksize; | 61 | unsigned long st_blksize; |
62 | 62 | ||
63 | #if defined(__BIG_ENDIAN__) | 63 | unsigned long long st_blocks; /* Number 512-byte blocks allocated. */ |
64 | unsigned long __pad4; /* Future possible st_blocks hi bits */ | ||
65 | unsigned long st_blocks; /* Number 512-byte blocks allocated. */ | ||
66 | #else /* Must be little */ | ||
67 | unsigned long st_blocks; /* Number 512-byte blocks allocated. */ | ||
68 | unsigned long __pad4; /* Future possible st_blocks hi bits */ | ||
69 | #endif | ||
70 | 64 | ||
71 | unsigned long st_atime; | 65 | unsigned long st_atime; |
72 | unsigned long st_atime_nsec; | 66 | unsigned long st_atime_nsec; |
diff --git a/include/asm-sh/thread_info.h b/include/asm-sh/thread_info.h index 85f0c11b4319..7345350d98c0 100644 --- a/include/asm-sh/thread_info.h +++ b/include/asm-sh/thread_info.h | |||
@@ -18,7 +18,7 @@ | |||
18 | struct thread_info { | 18 | struct thread_info { |
19 | struct task_struct *task; /* main task structure */ | 19 | struct task_struct *task; /* main task structure */ |
20 | struct exec_domain *exec_domain; /* execution domain */ | 20 | struct exec_domain *exec_domain; /* execution domain */ |
21 | __u32 flags; /* low level flags */ | 21 | unsigned long flags; /* low level flags */ |
22 | __u32 cpu; | 22 | __u32 cpu; |
23 | int preempt_count; /* 0 => preemptable, <0 => BUG */ | 23 | int preempt_count; /* 0 => preemptable, <0 => BUG */ |
24 | struct restart_block restart_block; | 24 | struct restart_block restart_block; |
diff --git a/include/asm-sh/types.h b/include/asm-sh/types.h index cb7e183a0a6b..488552f43b2a 100644 --- a/include/asm-sh/types.h +++ b/include/asm-sh/types.h | |||
@@ -58,6 +58,11 @@ typedef u64 sector_t; | |||
58 | #define HAVE_SECTOR_T | 58 | #define HAVE_SECTOR_T |
59 | #endif | 59 | #endif |
60 | 60 | ||
61 | #ifdef CONFIG_LSF | ||
62 | typedef u64 blkcnt_t; | ||
63 | #define HAVE_BLKCNT_T | ||
64 | #endif | ||
65 | |||
61 | #endif /* __ASSEMBLY__ */ | 66 | #endif /* __ASSEMBLY__ */ |
62 | 67 | ||
63 | #endif /* __KERNEL__ */ | 68 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-sh64/bitops.h b/include/asm-sh64/bitops.h index ce9c3ad45fe0..f3bdcdb5d046 100644 --- a/include/asm-sh64/bitops.h +++ b/include/asm-sh64/bitops.h | |||
@@ -31,16 +31,6 @@ static __inline__ void set_bit(int nr, volatile void * addr) | |||
31 | local_irq_restore(flags); | 31 | local_irq_restore(flags); |
32 | } | 32 | } |
33 | 33 | ||
34 | static inline void __set_bit(int nr, void *addr) | ||
35 | { | ||
36 | int mask; | ||
37 | unsigned int *a = addr; | ||
38 | |||
39 | a += nr >> 5; | ||
40 | mask = 1 << (nr & 0x1f); | ||
41 | *a |= mask; | ||
42 | } | ||
43 | |||
44 | /* | 34 | /* |
45 | * clear_bit() doesn't provide any barrier for the compiler. | 35 | * clear_bit() doesn't provide any barrier for the compiler. |
46 | */ | 36 | */ |
@@ -58,15 +48,6 @@ static inline void clear_bit(int nr, volatile unsigned long *a) | |||
58 | local_irq_restore(flags); | 48 | local_irq_restore(flags); |
59 | } | 49 | } |
60 | 50 | ||
61 | static inline void __clear_bit(int nr, volatile unsigned long *a) | ||
62 | { | ||
63 | int mask; | ||
64 | |||
65 | a += nr >> 5; | ||
66 | mask = 1 << (nr & 0x1f); | ||
67 | *a &= ~mask; | ||
68 | } | ||
69 | |||
70 | static __inline__ void change_bit(int nr, volatile void * addr) | 51 | static __inline__ void change_bit(int nr, volatile void * addr) |
71 | { | 52 | { |
72 | int mask; | 53 | int mask; |
@@ -80,16 +61,6 @@ static __inline__ void change_bit(int nr, volatile void * addr) | |||
80 | local_irq_restore(flags); | 61 | local_irq_restore(flags); |
81 | } | 62 | } |
82 | 63 | ||
83 | static __inline__ void __change_bit(int nr, volatile void * addr) | ||
84 | { | ||
85 | int mask; | ||
86 | volatile unsigned int *a = addr; | ||
87 | |||
88 | a += nr >> 5; | ||
89 | mask = 1 << (nr & 0x1f); | ||
90 | *a ^= mask; | ||
91 | } | ||
92 | |||
93 | static __inline__ int test_and_set_bit(int nr, volatile void * addr) | 64 | static __inline__ int test_and_set_bit(int nr, volatile void * addr) |
94 | { | 65 | { |
95 | int mask, retval; | 66 | int mask, retval; |
@@ -106,19 +77,6 @@ static __inline__ int test_and_set_bit(int nr, volatile void * addr) | |||
106 | return retval; | 77 | return retval; |
107 | } | 78 | } |
108 | 79 | ||
109 | static __inline__ int __test_and_set_bit(int nr, volatile void * addr) | ||
110 | { | ||
111 | int mask, retval; | ||
112 | volatile unsigned int *a = addr; | ||
113 | |||
114 | a += nr >> 5; | ||
115 | mask = 1 << (nr & 0x1f); | ||
116 | retval = (mask & *a) != 0; | ||
117 | *a |= mask; | ||
118 | |||
119 | return retval; | ||
120 | } | ||
121 | |||
122 | static __inline__ int test_and_clear_bit(int nr, volatile void * addr) | 80 | static __inline__ int test_and_clear_bit(int nr, volatile void * addr) |
123 | { | 81 | { |
124 | int mask, retval; | 82 | int mask, retval; |
@@ -135,19 +93,6 @@ static __inline__ int test_and_clear_bit(int nr, volatile void * addr) | |||
135 | return retval; | 93 | return retval; |
136 | } | 94 | } |
137 | 95 | ||
138 | static __inline__ int __test_and_clear_bit(int nr, volatile void * addr) | ||
139 | { | ||
140 | int mask, retval; | ||
141 | volatile unsigned int *a = addr; | ||
142 | |||
143 | a += nr >> 5; | ||
144 | mask = 1 << (nr & 0x1f); | ||
145 | retval = (mask & *a) != 0; | ||
146 | *a &= ~mask; | ||
147 | |||
148 | return retval; | ||
149 | } | ||
150 | |||
151 | static __inline__ int test_and_change_bit(int nr, volatile void * addr) | 96 | static __inline__ int test_and_change_bit(int nr, volatile void * addr) |
152 | { | 97 | { |
153 | int mask, retval; | 98 | int mask, retval; |
@@ -164,23 +109,7 @@ static __inline__ int test_and_change_bit(int nr, volatile void * addr) | |||
164 | return retval; | 109 | return retval; |
165 | } | 110 | } |
166 | 111 | ||
167 | static __inline__ int __test_and_change_bit(int nr, volatile void * addr) | 112 | #include <asm-generic/bitops/non-atomic.h> |
168 | { | ||
169 | int mask, retval; | ||
170 | volatile unsigned int *a = addr; | ||
171 | |||
172 | a += nr >> 5; | ||
173 | mask = 1 << (nr & 0x1f); | ||
174 | retval = (mask & *a) != 0; | ||
175 | *a ^= mask; | ||
176 | |||
177 | return retval; | ||
178 | } | ||
179 | |||
180 | static __inline__ int test_bit(int nr, const volatile void *addr) | ||
181 | { | ||
182 | return 1UL & (((const volatile unsigned int *) addr)[nr >> 5] >> (nr & 31)); | ||
183 | } | ||
184 | 113 | ||
185 | static __inline__ unsigned long ffz(unsigned long word) | 114 | static __inline__ unsigned long ffz(unsigned long word) |
186 | { | 115 | { |
@@ -204,313 +133,16 @@ static __inline__ unsigned long ffz(unsigned long word) | |||
204 | return result; | 133 | return result; |
205 | } | 134 | } |
206 | 135 | ||
207 | /** | 136 | #include <asm-generic/bitops/__ffs.h> |
208 | * __ffs - find first bit in word | 137 | #include <asm-generic/bitops/find.h> |
209 | * @word: The word to search | 138 | #include <asm-generic/bitops/hweight.h> |
210 | * | 139 | #include <asm-generic/bitops/sched.h> |
211 | * Undefined if no bit exists, so code should check against 0 first. | 140 | #include <asm-generic/bitops/ffs.h> |
212 | */ | 141 | #include <asm-generic/bitops/ext2-non-atomic.h> |
213 | static inline unsigned long __ffs(unsigned long word) | 142 | #include <asm-generic/bitops/ext2-atomic.h> |
214 | { | 143 | #include <asm-generic/bitops/minix.h> |
215 | int r = 0; | 144 | #include <asm-generic/bitops/fls.h> |
216 | 145 | #include <asm-generic/bitops/fls64.h> | |
217 | if (!word) | ||
218 | return 0; | ||
219 | if (!(word & 0xffff)) { | ||
220 | word >>= 16; | ||
221 | r += 16; | ||
222 | } | ||
223 | if (!(word & 0xff)) { | ||
224 | word >>= 8; | ||
225 | r += 8; | ||
226 | } | ||
227 | if (!(word & 0xf)) { | ||
228 | word >>= 4; | ||
229 | r += 4; | ||
230 | } | ||
231 | if (!(word & 3)) { | ||
232 | word >>= 2; | ||
233 | r += 2; | ||
234 | } | ||
235 | if (!(word & 1)) { | ||
236 | word >>= 1; | ||
237 | r += 1; | ||
238 | } | ||
239 | return r; | ||
240 | } | ||
241 | |||
242 | /** | ||
243 | * find_next_bit - find the next set bit in a memory region | ||
244 | * @addr: The address to base the search on | ||
245 | * @offset: The bitnumber to start searching at | ||
246 | * @size: The maximum size to search | ||
247 | */ | ||
248 | static inline unsigned long find_next_bit(const unsigned long *addr, | ||
249 | unsigned long size, unsigned long offset) | ||
250 | { | ||
251 | unsigned int *p = ((unsigned int *) addr) + (offset >> 5); | ||
252 | unsigned int result = offset & ~31UL; | ||
253 | unsigned int tmp; | ||
254 | |||
255 | if (offset >= size) | ||
256 | return size; | ||
257 | size -= result; | ||
258 | offset &= 31UL; | ||
259 | if (offset) { | ||
260 | tmp = *p++; | ||
261 | tmp &= ~0UL << offset; | ||
262 | if (size < 32) | ||
263 | goto found_first; | ||
264 | if (tmp) | ||
265 | goto found_middle; | ||
266 | size -= 32; | ||
267 | result += 32; | ||
268 | } | ||
269 | while (size >= 32) { | ||
270 | if ((tmp = *p++) != 0) | ||
271 | goto found_middle; | ||
272 | result += 32; | ||
273 | size -= 32; | ||
274 | } | ||
275 | if (!size) | ||
276 | return result; | ||
277 | tmp = *p; | ||
278 | |||
279 | found_first: | ||
280 | tmp &= ~0UL >> (32 - size); | ||
281 | if (tmp == 0UL) /* Are any bits set? */ | ||
282 | return result + size; /* Nope. */ | ||
283 | found_middle: | ||
284 | return result + __ffs(tmp); | ||
285 | } | ||
286 | |||
287 | /** | ||
288 | * find_first_bit - find the first set bit in a memory region | ||
289 | * @addr: The address to start the search at | ||
290 | * @size: The maximum size to search | ||
291 | * | ||
292 | * Returns the bit-number of the first set bit, not the number of the byte | ||
293 | * containing a bit. | ||
294 | */ | ||
295 | #define find_first_bit(addr, size) \ | ||
296 | find_next_bit((addr), (size), 0) | ||
297 | |||
298 | |||
299 | static inline int find_next_zero_bit(void *addr, int size, int offset) | ||
300 | { | ||
301 | unsigned long *p = ((unsigned long *) addr) + (offset >> 5); | ||
302 | unsigned long result = offset & ~31UL; | ||
303 | unsigned long tmp; | ||
304 | |||
305 | if (offset >= size) | ||
306 | return size; | ||
307 | size -= result; | ||
308 | offset &= 31UL; | ||
309 | if (offset) { | ||
310 | tmp = *(p++); | ||
311 | tmp |= ~0UL >> (32-offset); | ||
312 | if (size < 32) | ||
313 | goto found_first; | ||
314 | if (~tmp) | ||
315 | goto found_middle; | ||
316 | size -= 32; | ||
317 | result += 32; | ||
318 | } | ||
319 | while (size & ~31UL) { | ||
320 | if (~(tmp = *(p++))) | ||
321 | goto found_middle; | ||
322 | result += 32; | ||
323 | size -= 32; | ||
324 | } | ||
325 | if (!size) | ||
326 | return result; | ||
327 | tmp = *p; | ||
328 | |||
329 | found_first: | ||
330 | tmp |= ~0UL << size; | ||
331 | found_middle: | ||
332 | return result + ffz(tmp); | ||
333 | } | ||
334 | |||
335 | #define find_first_zero_bit(addr, size) \ | ||
336 | find_next_zero_bit((addr), (size), 0) | ||
337 | |||
338 | /* | ||
339 | * hweightN: returns the hamming weight (i.e. the number | ||
340 | * of bits set) of a N-bit word | ||
341 | */ | ||
342 | |||
343 | #define hweight32(x) generic_hweight32(x) | ||
344 | #define hweight16(x) generic_hweight16(x) | ||
345 | #define hweight8(x) generic_hweight8(x) | ||
346 | |||
347 | /* | ||
348 | * Every architecture must define this function. It's the fastest | ||
349 | * way of searching a 140-bit bitmap where the first 100 bits are | ||
350 | * unlikely to be set. It's guaranteed that at least one of the 140 | ||
351 | * bits is cleared. | ||
352 | */ | ||
353 | |||
354 | static inline int sched_find_first_bit(unsigned long *b) | ||
355 | { | ||
356 | if (unlikely(b[0])) | ||
357 | return __ffs(b[0]); | ||
358 | if (unlikely(b[1])) | ||
359 | return __ffs(b[1]) + 32; | ||
360 | if (unlikely(b[2])) | ||
361 | return __ffs(b[2]) + 64; | ||
362 | if (b[3]) | ||
363 | return __ffs(b[3]) + 96; | ||
364 | return __ffs(b[4]) + 128; | ||
365 | } | ||
366 | |||
367 | /* | ||
368 | * ffs: find first bit set. This is defined the same way as | ||
369 | * the libc and compiler builtin ffs routines, therefore | ||
370 | * differs in spirit from the above ffz (man ffs). | ||
371 | */ | ||
372 | |||
373 | #define ffs(x) generic_ffs(x) | ||
374 | |||
375 | /* | ||
376 | * hweightN: returns the hamming weight (i.e. the number | ||
377 | * of bits set) of a N-bit word | ||
378 | */ | ||
379 | |||
380 | #define hweight32(x) generic_hweight32(x) | ||
381 | #define hweight16(x) generic_hweight16(x) | ||
382 | #define hweight8(x) generic_hweight8(x) | ||
383 | |||
384 | #ifdef __LITTLE_ENDIAN__ | ||
385 | #define ext2_set_bit(nr, addr) test_and_set_bit((nr), (addr)) | ||
386 | #define ext2_clear_bit(nr, addr) test_and_clear_bit((nr), (addr)) | ||
387 | #define ext2_test_bit(nr, addr) test_bit((nr), (addr)) | ||
388 | #define ext2_find_first_zero_bit(addr, size) find_first_zero_bit((addr), (size)) | ||
389 | #define ext2_find_next_zero_bit(addr, size, offset) \ | ||
390 | find_next_zero_bit((addr), (size), (offset)) | ||
391 | #else | ||
392 | static __inline__ int ext2_set_bit(int nr, volatile void * addr) | ||
393 | { | ||
394 | int mask, retval; | ||
395 | unsigned long flags; | ||
396 | volatile unsigned char *ADDR = (unsigned char *) addr; | ||
397 | |||
398 | ADDR += nr >> 3; | ||
399 | mask = 1 << (nr & 0x07); | ||
400 | local_irq_save(flags); | ||
401 | retval = (mask & *ADDR) != 0; | ||
402 | *ADDR |= mask; | ||
403 | local_irq_restore(flags); | ||
404 | return retval; | ||
405 | } | ||
406 | |||
407 | static __inline__ int ext2_clear_bit(int nr, volatile void * addr) | ||
408 | { | ||
409 | int mask, retval; | ||
410 | unsigned long flags; | ||
411 | volatile unsigned char *ADDR = (unsigned char *) addr; | ||
412 | |||
413 | ADDR += nr >> 3; | ||
414 | mask = 1 << (nr & 0x07); | ||
415 | local_irq_save(flags); | ||
416 | retval = (mask & *ADDR) != 0; | ||
417 | *ADDR &= ~mask; | ||
418 | local_irq_restore(flags); | ||
419 | return retval; | ||
420 | } | ||
421 | |||
422 | static __inline__ int ext2_test_bit(int nr, const volatile void * addr) | ||
423 | { | ||
424 | int mask; | ||
425 | const volatile unsigned char *ADDR = (const unsigned char *) addr; | ||
426 | |||
427 | ADDR += nr >> 3; | ||
428 | mask = 1 << (nr & 0x07); | ||
429 | return ((mask & *ADDR) != 0); | ||
430 | } | ||
431 | |||
432 | #define ext2_find_first_zero_bit(addr, size) \ | ||
433 | ext2_find_next_zero_bit((addr), (size), 0) | ||
434 | |||
435 | static __inline__ unsigned long ext2_find_next_zero_bit(void *addr, unsigned long size, unsigned long offset) | ||
436 | { | ||
437 | unsigned long *p = ((unsigned long *) addr) + (offset >> 5); | ||
438 | unsigned long result = offset & ~31UL; | ||
439 | unsigned long tmp; | ||
440 | |||
441 | if (offset >= size) | ||
442 | return size; | ||
443 | size -= result; | ||
444 | offset &= 31UL; | ||
445 | if(offset) { | ||
446 | /* We hold the little endian value in tmp, but then the | ||
447 | * shift is illegal. So we could keep a big endian value | ||
448 | * in tmp, like this: | ||
449 | * | ||
450 | * tmp = __swab32(*(p++)); | ||
451 | * tmp |= ~0UL >> (32-offset); | ||
452 | * | ||
453 | * but this would decrease preformance, so we change the | ||
454 | * shift: | ||
455 | */ | ||
456 | tmp = *(p++); | ||
457 | tmp |= __swab32(~0UL >> (32-offset)); | ||
458 | if(size < 32) | ||
459 | goto found_first; | ||
460 | if(~tmp) | ||
461 | goto found_middle; | ||
462 | size -= 32; | ||
463 | result += 32; | ||
464 | } | ||
465 | while(size & ~31UL) { | ||
466 | if(~(tmp = *(p++))) | ||
467 | goto found_middle; | ||
468 | result += 32; | ||
469 | size -= 32; | ||
470 | } | ||
471 | if(!size) | ||
472 | return result; | ||
473 | tmp = *p; | ||
474 | |||
475 | found_first: | ||
476 | /* tmp is little endian, so we would have to swab the shift, | ||
477 | * see above. But then we have to swab tmp below for ffz, so | ||
478 | * we might as well do this here. | ||
479 | */ | ||
480 | return result + ffz(__swab32(tmp) | (~0UL << size)); | ||
481 | found_middle: | ||
482 | return result + ffz(__swab32(tmp)); | ||
483 | } | ||
484 | #endif | ||
485 | |||
486 | #define ext2_set_bit_atomic(lock, nr, addr) \ | ||
487 | ({ \ | ||
488 | int ret; \ | ||
489 | spin_lock(lock); \ | ||
490 | ret = ext2_set_bit((nr), (addr)); \ | ||
491 | spin_unlock(lock); \ | ||
492 | ret; \ | ||
493 | }) | ||
494 | |||
495 | #define ext2_clear_bit_atomic(lock, nr, addr) \ | ||
496 | ({ \ | ||
497 | int ret; \ | ||
498 | spin_lock(lock); \ | ||
499 | ret = ext2_clear_bit((nr), (addr)); \ | ||
500 | spin_unlock(lock); \ | ||
501 | ret; \ | ||
502 | }) | ||
503 | |||
504 | /* Bitmap functions for the minix filesystem. */ | ||
505 | #define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr) | ||
506 | #define minix_set_bit(nr,addr) set_bit(nr,addr) | ||
507 | #define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr) | ||
508 | #define minix_test_bit(nr,addr) test_bit(nr,addr) | ||
509 | #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) | ||
510 | |||
511 | #define ffs(x) generic_ffs(x) | ||
512 | #define fls(x) generic_fls(x) | ||
513 | #define fls64(x) generic_fls64(x) | ||
514 | 146 | ||
515 | #endif /* __KERNEL__ */ | 147 | #endif /* __KERNEL__ */ |
516 | 148 | ||
diff --git a/include/asm-sh64/page.h b/include/asm-sh64/page.h index c86df90f7cbd..e4937cdabebd 100644 --- a/include/asm-sh64/page.h +++ b/include/asm-sh64/page.h | |||
@@ -105,9 +105,7 @@ typedef struct { unsigned long pgprot; } pgprot_t; | |||
105 | 105 | ||
106 | /* PFN start number, because of __MEMORY_START */ | 106 | /* PFN start number, because of __MEMORY_START */ |
107 | #define PFN_START (__MEMORY_START >> PAGE_SHIFT) | 107 | #define PFN_START (__MEMORY_START >> PAGE_SHIFT) |
108 | 108 | #define ARCH_PFN_OFFSET (PFN_START) | |
109 | #define pfn_to_page(pfn) (mem_map + (pfn) - PFN_START) | ||
110 | #define page_to_pfn(page) ((unsigned long)((page) - mem_map) + PFN_START) | ||
111 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) | 109 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) |
112 | #define pfn_valid(pfn) (((pfn) - PFN_START) < max_mapnr) | 110 | #define pfn_valid(pfn) (((pfn) - PFN_START) < max_mapnr) |
113 | #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) | 111 | #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) |
@@ -117,6 +115,7 @@ typedef struct { unsigned long pgprot; } pgprot_t; | |||
117 | 115 | ||
118 | #endif /* __KERNEL__ */ | 116 | #endif /* __KERNEL__ */ |
119 | 117 | ||
118 | #include <asm-generic/memory_model.h> | ||
120 | #include <asm-generic/page.h> | 119 | #include <asm-generic/page.h> |
121 | 120 | ||
122 | #endif /* __ASM_SH64_PAGE_H */ | 121 | #endif /* __ASM_SH64_PAGE_H */ |
diff --git a/include/asm-sh64/platform.h b/include/asm-sh64/platform.h index 7046a9014027..bd0d9c405a80 100644 --- a/include/asm-sh64/platform.h +++ b/include/asm-sh64/platform.h | |||
@@ -61,9 +61,4 @@ extern int platform_int_priority[NR_INTC_IRQS]; | |||
61 | #define code_resource (platform_parms.kram_res_p[STANDARD_KRAM_RESOURCES - 2]) | 61 | #define code_resource (platform_parms.kram_res_p[STANDARD_KRAM_RESOURCES - 2]) |
62 | #define data_resource (platform_parms.kram_res_p[STANDARD_KRAM_RESOURCES - 1]) | 62 | #define data_resource (platform_parms.kram_res_p[STANDARD_KRAM_RESOURCES - 1]) |
63 | 63 | ||
64 | /* Be prepared to 64-bit sign extensions */ | ||
65 | #define PFN_UP(x) ((((x) + PAGE_SIZE-1) >> PAGE_SHIFT) & 0x000fffff) | ||
66 | #define PFN_DOWN(x) (((x) >> PAGE_SHIFT) & 0x000fffff) | ||
67 | #define PFN_PHYS(x) ((x) << PAGE_SHIFT) | ||
68 | |||
69 | #endif /* __ASM_SH64_PLATFORM_H */ | 64 | #endif /* __ASM_SH64_PLATFORM_H */ |
diff --git a/include/asm-sh64/poll.h b/include/asm-sh64/poll.h index a420d14eb704..3a6cbad08d28 100644 --- a/include/asm-sh64/poll.h +++ b/include/asm-sh64/poll.h | |||
@@ -26,6 +26,7 @@ | |||
26 | #define POLLWRNORM 0x0100 | 26 | #define POLLWRNORM 0x0100 |
27 | #define POLLWRBAND 0x0200 | 27 | #define POLLWRBAND 0x0200 |
28 | #define POLLMSG 0x0400 | 28 | #define POLLMSG 0x0400 |
29 | #define POLLRDHUP 0x2000 | ||
29 | 30 | ||
30 | struct pollfd { | 31 | struct pollfd { |
31 | int fd; | 32 | int fd; |
diff --git a/include/asm-sparc/bitops.h b/include/asm-sparc/bitops.h index 41722b5e45ef..04aa3318f76a 100644 --- a/include/asm-sparc/bitops.h +++ b/include/asm-sparc/bitops.h | |||
@@ -152,386 +152,22 @@ static inline void change_bit(unsigned long nr, volatile unsigned long *addr) | |||
152 | : "memory", "cc"); | 152 | : "memory", "cc"); |
153 | } | 153 | } |
154 | 154 | ||
155 | /* | 155 | #include <asm-generic/bitops/non-atomic.h> |
156 | * non-atomic versions | ||
157 | */ | ||
158 | static inline void __set_bit(int nr, volatile unsigned long *addr) | ||
159 | { | ||
160 | unsigned long mask = 1UL << (nr & 0x1f); | ||
161 | unsigned long *p = ((unsigned long *)addr) + (nr >> 5); | ||
162 | |||
163 | *p |= mask; | ||
164 | } | ||
165 | |||
166 | static inline void __clear_bit(int nr, volatile unsigned long *addr) | ||
167 | { | ||
168 | unsigned long mask = 1UL << (nr & 0x1f); | ||
169 | unsigned long *p = ((unsigned long *)addr) + (nr >> 5); | ||
170 | |||
171 | *p &= ~mask; | ||
172 | } | ||
173 | |||
174 | static inline void __change_bit(int nr, volatile unsigned long *addr) | ||
175 | { | ||
176 | unsigned long mask = 1UL << (nr & 0x1f); | ||
177 | unsigned long *p = ((unsigned long *)addr) + (nr >> 5); | ||
178 | |||
179 | *p ^= mask; | ||
180 | } | ||
181 | |||
182 | static inline int __test_and_set_bit(int nr, volatile unsigned long *addr) | ||
183 | { | ||
184 | unsigned long mask = 1UL << (nr & 0x1f); | ||
185 | unsigned long *p = ((unsigned long *)addr) + (nr >> 5); | ||
186 | unsigned long old = *p; | ||
187 | |||
188 | *p = old | mask; | ||
189 | return (old & mask) != 0; | ||
190 | } | ||
191 | |||
192 | static inline int __test_and_clear_bit(int nr, volatile unsigned long *addr) | ||
193 | { | ||
194 | unsigned long mask = 1UL << (nr & 0x1f); | ||
195 | unsigned long *p = ((unsigned long *)addr) + (nr >> 5); | ||
196 | unsigned long old = *p; | ||
197 | |||
198 | *p = old & ~mask; | ||
199 | return (old & mask) != 0; | ||
200 | } | ||
201 | |||
202 | static inline int __test_and_change_bit(int nr, volatile unsigned long *addr) | ||
203 | { | ||
204 | unsigned long mask = 1UL << (nr & 0x1f); | ||
205 | unsigned long *p = ((unsigned long *)addr) + (nr >> 5); | ||
206 | unsigned long old = *p; | ||
207 | |||
208 | *p = old ^ mask; | ||
209 | return (old & mask) != 0; | ||
210 | } | ||
211 | 156 | ||
212 | #define smp_mb__before_clear_bit() do { } while(0) | 157 | #define smp_mb__before_clear_bit() do { } while(0) |
213 | #define smp_mb__after_clear_bit() do { } while(0) | 158 | #define smp_mb__after_clear_bit() do { } while(0) |
214 | 159 | ||
215 | /* The following routine need not be atomic. */ | 160 | #include <asm-generic/bitops/ffz.h> |
216 | static inline int test_bit(int nr, __const__ volatile unsigned long *addr) | 161 | #include <asm-generic/bitops/__ffs.h> |
217 | { | 162 | #include <asm-generic/bitops/sched.h> |
218 | return (1UL & (((unsigned long *)addr)[nr >> 5] >> (nr & 31))) != 0UL; | 163 | #include <asm-generic/bitops/ffs.h> |
219 | } | 164 | #include <asm-generic/bitops/fls.h> |
220 | 165 | #include <asm-generic/bitops/fls64.h> | |
221 | /* The easy/cheese version for now. */ | 166 | #include <asm-generic/bitops/hweight.h> |
222 | static inline unsigned long ffz(unsigned long word) | 167 | #include <asm-generic/bitops/find.h> |
223 | { | 168 | #include <asm-generic/bitops/ext2-non-atomic.h> |
224 | unsigned long result = 0; | 169 | #include <asm-generic/bitops/ext2-atomic.h> |
225 | 170 | #include <asm-generic/bitops/minix.h> | |
226 | while(word & 1) { | ||
227 | result++; | ||
228 | word >>= 1; | ||
229 | } | ||
230 | return result; | ||
231 | } | ||
232 | |||
233 | /** | ||
234 | * __ffs - find first bit in word. | ||
235 | * @word: The word to search | ||
236 | * | ||
237 | * Undefined if no bit exists, so code should check against 0 first. | ||
238 | */ | ||
239 | static inline int __ffs(unsigned long word) | ||
240 | { | ||
241 | int num = 0; | ||
242 | |||
243 | if ((word & 0xffff) == 0) { | ||
244 | num += 16; | ||
245 | word >>= 16; | ||
246 | } | ||
247 | if ((word & 0xff) == 0) { | ||
248 | num += 8; | ||
249 | word >>= 8; | ||
250 | } | ||
251 | if ((word & 0xf) == 0) { | ||
252 | num += 4; | ||
253 | word >>= 4; | ||
254 | } | ||
255 | if ((word & 0x3) == 0) { | ||
256 | num += 2; | ||
257 | word >>= 2; | ||
258 | } | ||
259 | if ((word & 0x1) == 0) | ||
260 | num += 1; | ||
261 | return num; | ||
262 | } | ||
263 | |||
264 | /* | ||
265 | * Every architecture must define this function. It's the fastest | ||
266 | * way of searching a 140-bit bitmap where the first 100 bits are | ||
267 | * unlikely to be set. It's guaranteed that at least one of the 140 | ||
268 | * bits is cleared. | ||
269 | */ | ||
270 | static inline int sched_find_first_bit(unsigned long *b) | ||
271 | { | ||
272 | |||
273 | if (unlikely(b[0])) | ||
274 | return __ffs(b[0]); | ||
275 | if (unlikely(b[1])) | ||
276 | return __ffs(b[1]) + 32; | ||
277 | if (unlikely(b[2])) | ||
278 | return __ffs(b[2]) + 64; | ||
279 | if (b[3]) | ||
280 | return __ffs(b[3]) + 96; | ||
281 | return __ffs(b[4]) + 128; | ||
282 | } | ||
283 | |||
284 | /* | ||
285 | * ffs: find first bit set. This is defined the same way as | ||
286 | * the libc and compiler builtin ffs routines, therefore | ||
287 | * differs in spirit from the above ffz (man ffs). | ||
288 | */ | ||
289 | static inline int ffs(int x) | ||
290 | { | ||
291 | if (!x) | ||
292 | return 0; | ||
293 | return __ffs((unsigned long)x) + 1; | ||
294 | } | ||
295 | |||
296 | /* | ||
297 | * fls: find last (most-significant) bit set. | ||
298 | * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. | ||
299 | */ | ||
300 | #define fls(x) generic_fls(x) | ||
301 | #define fls64(x) generic_fls64(x) | ||
302 | |||
303 | /* | ||
304 | * hweightN: returns the hamming weight (i.e. the number | ||
305 | * of bits set) of a N-bit word | ||
306 | */ | ||
307 | #define hweight32(x) generic_hweight32(x) | ||
308 | #define hweight16(x) generic_hweight16(x) | ||
309 | #define hweight8(x) generic_hweight8(x) | ||
310 | |||
311 | /* | ||
312 | * find_next_zero_bit() finds the first zero bit in a bit string of length | ||
313 | * 'size' bits, starting the search at bit 'offset'. This is largely based | ||
314 | * on Linus's ALPHA routines, which are pretty portable BTW. | ||
315 | */ | ||
316 | static inline unsigned long find_next_zero_bit(const unsigned long *addr, | ||
317 | unsigned long size, unsigned long offset) | ||
318 | { | ||
319 | const unsigned long *p = addr + (offset >> 5); | ||
320 | unsigned long result = offset & ~31UL; | ||
321 | unsigned long tmp; | ||
322 | |||
323 | if (offset >= size) | ||
324 | return size; | ||
325 | size -= result; | ||
326 | offset &= 31UL; | ||
327 | if (offset) { | ||
328 | tmp = *(p++); | ||
329 | tmp |= ~0UL >> (32-offset); | ||
330 | if (size < 32) | ||
331 | goto found_first; | ||
332 | if (~tmp) | ||
333 | goto found_middle; | ||
334 | size -= 32; | ||
335 | result += 32; | ||
336 | } | ||
337 | while (size & ~31UL) { | ||
338 | if (~(tmp = *(p++))) | ||
339 | goto found_middle; | ||
340 | result += 32; | ||
341 | size -= 32; | ||
342 | } | ||
343 | if (!size) | ||
344 | return result; | ||
345 | tmp = *p; | ||
346 | |||
347 | found_first: | ||
348 | tmp |= ~0UL << size; | ||
349 | if (tmp == ~0UL) /* Are any bits zero? */ | ||
350 | return result + size; /* Nope. */ | ||
351 | found_middle: | ||
352 | return result + ffz(tmp); | ||
353 | } | ||
354 | |||
355 | /* | ||
356 | * Linus sez that gcc can optimize the following correctly, we'll see if this | ||
357 | * holds on the Sparc as it does for the ALPHA. | ||
358 | */ | ||
359 | #define find_first_zero_bit(addr, size) \ | ||
360 | find_next_zero_bit((addr), (size), 0) | ||
361 | |||
362 | /** | ||
363 | * find_next_bit - find the first set bit in a memory region | ||
364 | * @addr: The address to base the search on | ||
365 | * @offset: The bitnumber to start searching at | ||
366 | * @size: The maximum size to search | ||
367 | * | ||
368 | * Scheduler induced bitop, do not use. | ||
369 | */ | ||
370 | static inline int find_next_bit(const unsigned long *addr, int size, int offset) | ||
371 | { | ||
372 | const unsigned long *p = addr + (offset >> 5); | ||
373 | int num = offset & ~0x1f; | ||
374 | unsigned long word; | ||
375 | |||
376 | word = *p++; | ||
377 | word &= ~((1 << (offset & 0x1f)) - 1); | ||
378 | while (num < size) { | ||
379 | if (word != 0) { | ||
380 | return __ffs(word) + num; | ||
381 | } | ||
382 | word = *p++; | ||
383 | num += 0x20; | ||
384 | } | ||
385 | return num; | ||
386 | } | ||
387 | |||
388 | /** | ||
389 | * find_first_bit - find the first set bit in a memory region | ||
390 | * @addr: The address to start the search at | ||
391 | * @size: The maximum size to search | ||
392 | * | ||
393 | * Returns the bit-number of the first set bit, not the number of the byte | ||
394 | * containing a bit. | ||
395 | */ | ||
396 | #define find_first_bit(addr, size) \ | ||
397 | find_next_bit((addr), (size), 0) | ||
398 | |||
399 | /* | ||
400 | */ | ||
401 | static inline int test_le_bit(int nr, __const__ unsigned long * addr) | ||
402 | { | ||
403 | __const__ unsigned char *ADDR = (__const__ unsigned char *) addr; | ||
404 | return (ADDR[nr >> 3] >> (nr & 7)) & 1; | ||
405 | } | ||
406 | |||
407 | /* | ||
408 | * non-atomic versions | ||
409 | */ | ||
410 | static inline void __set_le_bit(int nr, unsigned long *addr) | ||
411 | { | ||
412 | unsigned char *ADDR = (unsigned char *)addr; | ||
413 | |||
414 | ADDR += nr >> 3; | ||
415 | *ADDR |= 1 << (nr & 0x07); | ||
416 | } | ||
417 | |||
418 | static inline void __clear_le_bit(int nr, unsigned long *addr) | ||
419 | { | ||
420 | unsigned char *ADDR = (unsigned char *)addr; | ||
421 | |||
422 | ADDR += nr >> 3; | ||
423 | *ADDR &= ~(1 << (nr & 0x07)); | ||
424 | } | ||
425 | |||
426 | static inline int __test_and_set_le_bit(int nr, unsigned long *addr) | ||
427 | { | ||
428 | int mask, retval; | ||
429 | unsigned char *ADDR = (unsigned char *)addr; | ||
430 | |||
431 | ADDR += nr >> 3; | ||
432 | mask = 1 << (nr & 0x07); | ||
433 | retval = (mask & *ADDR) != 0; | ||
434 | *ADDR |= mask; | ||
435 | return retval; | ||
436 | } | ||
437 | |||
438 | static inline int __test_and_clear_le_bit(int nr, unsigned long *addr) | ||
439 | { | ||
440 | int mask, retval; | ||
441 | unsigned char *ADDR = (unsigned char *)addr; | ||
442 | |||
443 | ADDR += nr >> 3; | ||
444 | mask = 1 << (nr & 0x07); | ||
445 | retval = (mask & *ADDR) != 0; | ||
446 | *ADDR &= ~mask; | ||
447 | return retval; | ||
448 | } | ||
449 | |||
450 | static inline unsigned long find_next_zero_le_bit(const unsigned long *addr, | ||
451 | unsigned long size, unsigned long offset) | ||
452 | { | ||
453 | const unsigned long *p = addr + (offset >> 5); | ||
454 | unsigned long result = offset & ~31UL; | ||
455 | unsigned long tmp; | ||
456 | |||
457 | if (offset >= size) | ||
458 | return size; | ||
459 | size -= result; | ||
460 | offset &= 31UL; | ||
461 | if(offset) { | ||
462 | tmp = *(p++); | ||
463 | tmp |= __swab32(~0UL >> (32-offset)); | ||
464 | if(size < 32) | ||
465 | goto found_first; | ||
466 | if(~tmp) | ||
467 | goto found_middle; | ||
468 | size -= 32; | ||
469 | result += 32; | ||
470 | } | ||
471 | while(size & ~31UL) { | ||
472 | if(~(tmp = *(p++))) | ||
473 | goto found_middle; | ||
474 | result += 32; | ||
475 | size -= 32; | ||
476 | } | ||
477 | if(!size) | ||
478 | return result; | ||
479 | tmp = *p; | ||
480 | |||
481 | found_first: | ||
482 | tmp = __swab32(tmp) | (~0UL << size); | ||
483 | if (tmp == ~0UL) /* Are any bits zero? */ | ||
484 | return result + size; /* Nope. */ | ||
485 | return result + ffz(tmp); | ||
486 | |||
487 | found_middle: | ||
488 | return result + ffz(__swab32(tmp)); | ||
489 | } | ||
490 | |||
491 | #define find_first_zero_le_bit(addr, size) \ | ||
492 | find_next_zero_le_bit((addr), (size), 0) | ||
493 | |||
494 | #define ext2_set_bit(nr,addr) \ | ||
495 | __test_and_set_le_bit((nr),(unsigned long *)(addr)) | ||
496 | #define ext2_clear_bit(nr,addr) \ | ||
497 | __test_and_clear_le_bit((nr),(unsigned long *)(addr)) | ||
498 | |||
499 | #define ext2_set_bit_atomic(lock, nr, addr) \ | ||
500 | ({ \ | ||
501 | int ret; \ | ||
502 | spin_lock(lock); \ | ||
503 | ret = ext2_set_bit((nr), (unsigned long *)(addr)); \ | ||
504 | spin_unlock(lock); \ | ||
505 | ret; \ | ||
506 | }) | ||
507 | |||
508 | #define ext2_clear_bit_atomic(lock, nr, addr) \ | ||
509 | ({ \ | ||
510 | int ret; \ | ||
511 | spin_lock(lock); \ | ||
512 | ret = ext2_clear_bit((nr), (unsigned long *)(addr)); \ | ||
513 | spin_unlock(lock); \ | ||
514 | ret; \ | ||
515 | }) | ||
516 | |||
517 | #define ext2_test_bit(nr,addr) \ | ||
518 | test_le_bit((nr),(unsigned long *)(addr)) | ||
519 | #define ext2_find_first_zero_bit(addr, size) \ | ||
520 | find_first_zero_le_bit((unsigned long *)(addr), (size)) | ||
521 | #define ext2_find_next_zero_bit(addr, size, off) \ | ||
522 | find_next_zero_le_bit((unsigned long *)(addr), (size), (off)) | ||
523 | |||
524 | /* Bitmap functions for the minix filesystem. */ | ||
525 | #define minix_test_and_set_bit(nr,addr) \ | ||
526 | test_and_set_bit((nr),(unsigned long *)(addr)) | ||
527 | #define minix_set_bit(nr,addr) \ | ||
528 | set_bit((nr),(unsigned long *)(addr)) | ||
529 | #define minix_test_and_clear_bit(nr,addr) \ | ||
530 | test_and_clear_bit((nr),(unsigned long *)(addr)) | ||
531 | #define minix_test_bit(nr,addr) \ | ||
532 | test_bit((nr),(unsigned long *)(addr)) | ||
533 | #define minix_find_first_zero_bit(addr,size) \ | ||
534 | find_first_zero_bit((unsigned long *)(addr),(size)) | ||
535 | 171 | ||
536 | #endif /* __KERNEL__ */ | 172 | #endif /* __KERNEL__ */ |
537 | 173 | ||
diff --git a/include/asm-sparc/cpudata.h b/include/asm-sparc/cpudata.h index ec0d9ef90a3b..a2c4d51d36c4 100644 --- a/include/asm-sparc/cpudata.h +++ b/include/asm-sparc/cpudata.h | |||
@@ -18,6 +18,7 @@ typedef struct { | |||
18 | unsigned int counter; | 18 | unsigned int counter; |
19 | int prom_node; | 19 | int prom_node; |
20 | int mid; | 20 | int mid; |
21 | int next; | ||
21 | } cpuinfo_sparc; | 22 | } cpuinfo_sparc; |
22 | 23 | ||
23 | DECLARE_PER_CPU(cpuinfo_sparc, __cpu_data); | 24 | DECLARE_PER_CPU(cpuinfo_sparc, __cpu_data); |
diff --git a/include/asm-sparc/page.h b/include/asm-sparc/page.h index 9122684f6c1e..ec3274b7ddf4 100644 --- a/include/asm-sparc/page.h +++ b/include/asm-sparc/page.h | |||
@@ -152,8 +152,7 @@ extern unsigned long pfn_base; | |||
152 | #define virt_to_phys __pa | 152 | #define virt_to_phys __pa |
153 | #define phys_to_virt __va | 153 | #define phys_to_virt __va |
154 | 154 | ||
155 | #define pfn_to_page(pfn) (mem_map + ((pfn)-(pfn_base))) | 155 | #define ARCH_PFN_OFFSET (pfn_base) |
156 | #define page_to_pfn(page) ((unsigned long)(((page) - mem_map) + pfn_base)) | ||
157 | #define virt_to_page(kaddr) (mem_map + ((((unsigned long)(kaddr)-PAGE_OFFSET)>>PAGE_SHIFT))) | 156 | #define virt_to_page(kaddr) (mem_map + ((((unsigned long)(kaddr)-PAGE_OFFSET)>>PAGE_SHIFT))) |
158 | 157 | ||
159 | #define pfn_valid(pfn) (((pfn) >= (pfn_base)) && (((pfn)-(pfn_base)) < max_mapnr)) | 158 | #define pfn_valid(pfn) (((pfn) >= (pfn_base)) && (((pfn)-(pfn_base)) < max_mapnr)) |
@@ -164,6 +163,7 @@ extern unsigned long pfn_base; | |||
164 | 163 | ||
165 | #endif /* __KERNEL__ */ | 164 | #endif /* __KERNEL__ */ |
166 | 165 | ||
166 | #include <asm-generic/memory_model.h> | ||
167 | #include <asm-generic/page.h> | 167 | #include <asm-generic/page.h> |
168 | 168 | ||
169 | #endif /* _SPARC_PAGE_H */ | 169 | #endif /* _SPARC_PAGE_H */ |
diff --git a/include/asm-sparc/poll.h b/include/asm-sparc/poll.h index 3ddcc6481f09..26f13fb35497 100644 --- a/include/asm-sparc/poll.h +++ b/include/asm-sparc/poll.h | |||
@@ -13,6 +13,7 @@ | |||
13 | #define POLLWRBAND 256 | 13 | #define POLLWRBAND 256 |
14 | #define POLLMSG 512 | 14 | #define POLLMSG 512 |
15 | #define POLLREMOVE 1024 | 15 | #define POLLREMOVE 1024 |
16 | #define POLLRDHUP 2048 | ||
16 | 17 | ||
17 | struct pollfd { | 18 | struct pollfd { |
18 | int fd; | 19 | int fd; |
diff --git a/include/asm-sparc/smp.h b/include/asm-sparc/smp.h index 580c51d011df..98c46e3fbe8a 100644 --- a/include/asm-sparc/smp.h +++ b/include/asm-sparc/smp.h | |||
@@ -81,16 +81,9 @@ static inline int smp_call_function(void (*func)(void *info), void *info, int no | |||
81 | return 0; | 81 | return 0; |
82 | } | 82 | } |
83 | 83 | ||
84 | extern __volatile__ int __cpu_number_map[NR_CPUS]; | ||
85 | extern __volatile__ int __cpu_logical_map[NR_CPUS]; | ||
86 | |||
87 | static inline int cpu_logical_map(int cpu) | 84 | static inline int cpu_logical_map(int cpu) |
88 | { | 85 | { |
89 | return __cpu_logical_map[cpu]; | 86 | return cpu; |
90 | } | ||
91 | static inline int cpu_number_map(int cpu) | ||
92 | { | ||
93 | return __cpu_number_map[cpu]; | ||
94 | } | 87 | } |
95 | 88 | ||
96 | static inline int hard_smp4m_processor_id(void) | 89 | static inline int hard_smp4m_processor_id(void) |
diff --git a/include/asm-sparc/spinlock.h b/include/asm-sparc/spinlock.h index e344c98a6f5f..3350c90c7869 100644 --- a/include/asm-sparc/spinlock.h +++ b/include/asm-sparc/spinlock.h | |||
@@ -94,7 +94,7 @@ static inline void __read_lock(raw_rwlock_t *rw) | |||
94 | #define __raw_read_lock(lock) \ | 94 | #define __raw_read_lock(lock) \ |
95 | do { unsigned long flags; \ | 95 | do { unsigned long flags; \ |
96 | local_irq_save(flags); \ | 96 | local_irq_save(flags); \ |
97 | __raw_read_lock(lock); \ | 97 | __read_lock(lock); \ |
98 | local_irq_restore(flags); \ | 98 | local_irq_restore(flags); \ |
99 | } while(0) | 99 | } while(0) |
100 | 100 | ||
@@ -114,11 +114,11 @@ static inline void __read_unlock(raw_rwlock_t *rw) | |||
114 | #define __raw_read_unlock(lock) \ | 114 | #define __raw_read_unlock(lock) \ |
115 | do { unsigned long flags; \ | 115 | do { unsigned long flags; \ |
116 | local_irq_save(flags); \ | 116 | local_irq_save(flags); \ |
117 | __raw_read_unlock(lock); \ | 117 | __read_unlock(lock); \ |
118 | local_irq_restore(flags); \ | 118 | local_irq_restore(flags); \ |
119 | } while(0) | 119 | } while(0) |
120 | 120 | ||
121 | extern __inline__ void __raw_write_lock(raw_rwlock_t *rw) | 121 | static inline void __raw_write_lock(raw_rwlock_t *rw) |
122 | { | 122 | { |
123 | register raw_rwlock_t *lp asm("g1"); | 123 | register raw_rwlock_t *lp asm("g1"); |
124 | lp = rw; | 124 | lp = rw; |
@@ -131,9 +131,28 @@ extern __inline__ void __raw_write_lock(raw_rwlock_t *rw) | |||
131 | : "g2", "g4", "memory", "cc"); | 131 | : "g2", "g4", "memory", "cc"); |
132 | } | 132 | } |
133 | 133 | ||
134 | static inline int __raw_write_trylock(raw_rwlock_t *rw) | ||
135 | { | ||
136 | unsigned int val; | ||
137 | |||
138 | __asm__ __volatile__("ldstub [%1 + 3], %0" | ||
139 | : "=r" (val) | ||
140 | : "r" (&rw->lock) | ||
141 | : "memory"); | ||
142 | |||
143 | if (val == 0) { | ||
144 | val = rw->lock & ~0xff; | ||
145 | if (val) | ||
146 | ((volatile u8*)&rw->lock)[3] = 0; | ||
147 | } | ||
148 | |||
149 | return (val == 0); | ||
150 | } | ||
151 | |||
134 | #define __raw_write_unlock(rw) do { (rw)->lock = 0; } while(0) | 152 | #define __raw_write_unlock(rw) do { (rw)->lock = 0; } while(0) |
135 | 153 | ||
136 | #define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock) | 154 | #define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock) |
155 | #define __raw_read_trylock(lock) generic__raw_read_trylock(lock) | ||
137 | 156 | ||
138 | #endif /* !(__ASSEMBLY__) */ | 157 | #endif /* !(__ASSEMBLY__) */ |
139 | 158 | ||
diff --git a/include/asm-sparc64/bitops.h b/include/asm-sparc64/bitops.h index 6efc0162fb09..71944b0f09de 100644 --- a/include/asm-sparc64/bitops.h +++ b/include/asm-sparc64/bitops.h | |||
@@ -18,58 +18,7 @@ extern void set_bit(unsigned long nr, volatile unsigned long *addr); | |||
18 | extern void clear_bit(unsigned long nr, volatile unsigned long *addr); | 18 | extern void clear_bit(unsigned long nr, volatile unsigned long *addr); |
19 | extern void change_bit(unsigned long nr, volatile unsigned long *addr); | 19 | extern void change_bit(unsigned long nr, volatile unsigned long *addr); |
20 | 20 | ||
21 | /* "non-atomic" versions... */ | 21 | #include <asm-generic/bitops/non-atomic.h> |
22 | |||
23 | static inline void __set_bit(int nr, volatile unsigned long *addr) | ||
24 | { | ||
25 | unsigned long *m = ((unsigned long *)addr) + (nr >> 6); | ||
26 | |||
27 | *m |= (1UL << (nr & 63)); | ||
28 | } | ||
29 | |||
30 | static inline void __clear_bit(int nr, volatile unsigned long *addr) | ||
31 | { | ||
32 | unsigned long *m = ((unsigned long *)addr) + (nr >> 6); | ||
33 | |||
34 | *m &= ~(1UL << (nr & 63)); | ||
35 | } | ||
36 | |||
37 | static inline void __change_bit(int nr, volatile unsigned long *addr) | ||
38 | { | ||
39 | unsigned long *m = ((unsigned long *)addr) + (nr >> 6); | ||
40 | |||
41 | *m ^= (1UL << (nr & 63)); | ||
42 | } | ||
43 | |||
44 | static inline int __test_and_set_bit(int nr, volatile unsigned long *addr) | ||
45 | { | ||
46 | unsigned long *m = ((unsigned long *)addr) + (nr >> 6); | ||
47 | unsigned long old = *m; | ||
48 | unsigned long mask = (1UL << (nr & 63)); | ||
49 | |||
50 | *m = (old | mask); | ||
51 | return ((old & mask) != 0); | ||
52 | } | ||
53 | |||
54 | static inline int __test_and_clear_bit(int nr, volatile unsigned long *addr) | ||
55 | { | ||
56 | unsigned long *m = ((unsigned long *)addr) + (nr >> 6); | ||
57 | unsigned long old = *m; | ||
58 | unsigned long mask = (1UL << (nr & 63)); | ||
59 | |||
60 | *m = (old & ~mask); | ||
61 | return ((old & mask) != 0); | ||
62 | } | ||
63 | |||
64 | static inline int __test_and_change_bit(int nr, volatile unsigned long *addr) | ||
65 | { | ||
66 | unsigned long *m = ((unsigned long *)addr) + (nr >> 6); | ||
67 | unsigned long old = *m; | ||
68 | unsigned long mask = (1UL << (nr & 63)); | ||
69 | |||
70 | *m = (old ^ mask); | ||
71 | return ((old & mask) != 0); | ||
72 | } | ||
73 | 22 | ||
74 | #ifdef CONFIG_SMP | 23 | #ifdef CONFIG_SMP |
75 | #define smp_mb__before_clear_bit() membar_storeload_loadload() | 24 | #define smp_mb__before_clear_bit() membar_storeload_loadload() |
@@ -79,78 +28,15 @@ static inline int __test_and_change_bit(int nr, volatile unsigned long *addr) | |||
79 | #define smp_mb__after_clear_bit() barrier() | 28 | #define smp_mb__after_clear_bit() barrier() |
80 | #endif | 29 | #endif |
81 | 30 | ||
82 | static inline int test_bit(int nr, __const__ volatile unsigned long *addr) | 31 | #include <asm-generic/bitops/ffz.h> |
83 | { | 32 | #include <asm-generic/bitops/__ffs.h> |
84 | return (1UL & (addr[nr >> 6] >> (nr & 63))) != 0UL; | 33 | #include <asm-generic/bitops/fls.h> |
85 | } | 34 | #include <asm-generic/bitops/fls64.h> |
86 | |||
87 | /* The easy/cheese version for now. */ | ||
88 | static inline unsigned long ffz(unsigned long word) | ||
89 | { | ||
90 | unsigned long result; | ||
91 | |||
92 | result = 0; | ||
93 | while(word & 1) { | ||
94 | result++; | ||
95 | word >>= 1; | ||
96 | } | ||
97 | return result; | ||
98 | } | ||
99 | |||
100 | /** | ||
101 | * __ffs - find first bit in word. | ||
102 | * @word: The word to search | ||
103 | * | ||
104 | * Undefined if no bit exists, so code should check against 0 first. | ||
105 | */ | ||
106 | static inline unsigned long __ffs(unsigned long word) | ||
107 | { | ||
108 | unsigned long result = 0; | ||
109 | |||
110 | while (!(word & 1UL)) { | ||
111 | result++; | ||
112 | word >>= 1; | ||
113 | } | ||
114 | return result; | ||
115 | } | ||
116 | |||
117 | /* | ||
118 | * fls: find last bit set. | ||
119 | */ | ||
120 | |||
121 | #define fls(x) generic_fls(x) | ||
122 | #define fls64(x) generic_fls64(x) | ||
123 | 35 | ||
124 | #ifdef __KERNEL__ | 36 | #ifdef __KERNEL__ |
125 | 37 | ||
126 | /* | 38 | #include <asm-generic/bitops/sched.h> |
127 | * Every architecture must define this function. It's the fastest | 39 | #include <asm-generic/bitops/ffs.h> |
128 | * way of searching a 140-bit bitmap where the first 100 bits are | ||
129 | * unlikely to be set. It's guaranteed that at least one of the 140 | ||
130 | * bits is cleared. | ||
131 | */ | ||
132 | static inline int sched_find_first_bit(unsigned long *b) | ||
133 | { | ||
134 | if (unlikely(b[0])) | ||
135 | return __ffs(b[0]); | ||
136 | if (unlikely(((unsigned int)b[1]))) | ||
137 | return __ffs(b[1]) + 64; | ||
138 | if (b[1] >> 32) | ||
139 | return __ffs(b[1] >> 32) + 96; | ||
140 | return __ffs(b[2]) + 128; | ||
141 | } | ||
142 | |||
143 | /* | ||
144 | * ffs: find first bit set. This is defined the same way as | ||
145 | * the libc and compiler builtin ffs routines, therefore | ||
146 | * differs in spirit from the above ffz (man ffs). | ||
147 | */ | ||
148 | static inline int ffs(int x) | ||
149 | { | ||
150 | if (!x) | ||
151 | return 0; | ||
152 | return __ffs((unsigned long)x) + 1; | ||
153 | } | ||
154 | 40 | ||
155 | /* | 41 | /* |
156 | * hweightN: returns the hamming weight (i.e. the number | 42 | * hweightN: returns the hamming weight (i.e. the number |
@@ -193,102 +79,23 @@ static inline unsigned int hweight8(unsigned int w) | |||
193 | 79 | ||
194 | #else | 80 | #else |
195 | 81 | ||
196 | #define hweight64(x) generic_hweight64(x) | 82 | #include <asm-generic/bitops/hweight.h> |
197 | #define hweight32(x) generic_hweight32(x) | ||
198 | #define hweight16(x) generic_hweight16(x) | ||
199 | #define hweight8(x) generic_hweight8(x) | ||
200 | 83 | ||
201 | #endif | 84 | #endif |
202 | #endif /* __KERNEL__ */ | 85 | #endif /* __KERNEL__ */ |
203 | 86 | ||
204 | /** | 87 | #include <asm-generic/bitops/find.h> |
205 | * find_next_bit - find the next set bit in a memory region | ||
206 | * @addr: The address to base the search on | ||
207 | * @offset: The bitnumber to start searching at | ||
208 | * @size: The maximum size to search | ||
209 | */ | ||
210 | extern unsigned long find_next_bit(const unsigned long *, unsigned long, | ||
211 | unsigned long); | ||
212 | |||
213 | /** | ||
214 | * find_first_bit - find the first set bit in a memory region | ||
215 | * @addr: The address to start the search at | ||
216 | * @size: The maximum size to search | ||
217 | * | ||
218 | * Returns the bit-number of the first set bit, not the number of the byte | ||
219 | * containing a bit. | ||
220 | */ | ||
221 | #define find_first_bit(addr, size) \ | ||
222 | find_next_bit((addr), (size), 0) | ||
223 | |||
224 | /* find_next_zero_bit() finds the first zero bit in a bit string of length | ||
225 | * 'size' bits, starting the search at bit 'offset'. This is largely based | ||
226 | * on Linus's ALPHA routines, which are pretty portable BTW. | ||
227 | */ | ||
228 | |||
229 | extern unsigned long find_next_zero_bit(const unsigned long *, | ||
230 | unsigned long, unsigned long); | ||
231 | |||
232 | #define find_first_zero_bit(addr, size) \ | ||
233 | find_next_zero_bit((addr), (size), 0) | ||
234 | |||
235 | #define test_and_set_le_bit(nr,addr) \ | ||
236 | test_and_set_bit((nr) ^ 0x38, (addr)) | ||
237 | #define test_and_clear_le_bit(nr,addr) \ | ||
238 | test_and_clear_bit((nr) ^ 0x38, (addr)) | ||
239 | |||
240 | static inline int test_le_bit(int nr, __const__ unsigned long * addr) | ||
241 | { | ||
242 | int mask; | ||
243 | __const__ unsigned char *ADDR = (__const__ unsigned char *) addr; | ||
244 | |||
245 | ADDR += nr >> 3; | ||
246 | mask = 1 << (nr & 0x07); | ||
247 | return ((mask & *ADDR) != 0); | ||
248 | } | ||
249 | |||
250 | #define find_first_zero_le_bit(addr, size) \ | ||
251 | find_next_zero_le_bit((addr), (size), 0) | ||
252 | |||
253 | extern unsigned long find_next_zero_le_bit(unsigned long *, unsigned long, unsigned long); | ||
254 | 88 | ||
255 | #ifdef __KERNEL__ | 89 | #ifdef __KERNEL__ |
256 | 90 | ||
257 | #define __set_le_bit(nr, addr) \ | 91 | #include <asm-generic/bitops/ext2-non-atomic.h> |
258 | __set_bit((nr) ^ 0x38, (addr)) | ||
259 | #define __clear_le_bit(nr, addr) \ | ||
260 | __clear_bit((nr) ^ 0x38, (addr)) | ||
261 | #define __test_and_clear_le_bit(nr, addr) \ | ||
262 | __test_and_clear_bit((nr) ^ 0x38, (addr)) | ||
263 | #define __test_and_set_le_bit(nr, addr) \ | ||
264 | __test_and_set_bit((nr) ^ 0x38, (addr)) | ||
265 | 92 | ||
266 | #define ext2_set_bit(nr,addr) \ | ||
267 | __test_and_set_le_bit((nr),(unsigned long *)(addr)) | ||
268 | #define ext2_set_bit_atomic(lock,nr,addr) \ | 93 | #define ext2_set_bit_atomic(lock,nr,addr) \ |
269 | test_and_set_le_bit((nr),(unsigned long *)(addr)) | 94 | test_and_set_bit((nr) ^ 0x38,(unsigned long *)(addr)) |
270 | #define ext2_clear_bit(nr,addr) \ | ||
271 | __test_and_clear_le_bit((nr),(unsigned long *)(addr)) | ||
272 | #define ext2_clear_bit_atomic(lock,nr,addr) \ | 95 | #define ext2_clear_bit_atomic(lock,nr,addr) \ |
273 | test_and_clear_le_bit((nr),(unsigned long *)(addr)) | 96 | test_and_clear_bit((nr) ^ 0x38,(unsigned long *)(addr)) |
274 | #define ext2_test_bit(nr,addr) \ | ||
275 | test_le_bit((nr),(unsigned long *)(addr)) | ||
276 | #define ext2_find_first_zero_bit(addr, size) \ | ||
277 | find_first_zero_le_bit((unsigned long *)(addr), (size)) | ||
278 | #define ext2_find_next_zero_bit(addr, size, off) \ | ||
279 | find_next_zero_le_bit((unsigned long *)(addr), (size), (off)) | ||
280 | 97 | ||
281 | /* Bitmap functions for the minix filesystem. */ | 98 | #include <asm-generic/bitops/minix.h> |
282 | #define minix_test_and_set_bit(nr,addr) \ | ||
283 | test_and_set_bit((nr),(unsigned long *)(addr)) | ||
284 | #define minix_set_bit(nr,addr) \ | ||
285 | set_bit((nr),(unsigned long *)(addr)) | ||
286 | #define minix_test_and_clear_bit(nr,addr) \ | ||
287 | test_and_clear_bit((nr),(unsigned long *)(addr)) | ||
288 | #define minix_test_bit(nr,addr) \ | ||
289 | test_bit((nr),(unsigned long *)(addr)) | ||
290 | #define minix_find_first_zero_bit(addr,size) \ | ||
291 | find_first_zero_bit((unsigned long *)(addr),(size)) | ||
292 | 99 | ||
293 | #endif /* __KERNEL__ */ | 100 | #endif /* __KERNEL__ */ |
294 | 101 | ||
diff --git a/include/asm-sparc64/floppy.h b/include/asm-sparc64/floppy.h index 49d49a285943..6a95d5d0c576 100644 --- a/include/asm-sparc64/floppy.h +++ b/include/asm-sparc64/floppy.h | |||
@@ -738,7 +738,7 @@ static unsigned long __init sun_floppy_init(void) | |||
738 | if (!sun_floppy_types[0] && sun_floppy_types[1]) { | 738 | if (!sun_floppy_types[0] && sun_floppy_types[1]) { |
739 | /* | 739 | /* |
740 | * Set the drive exchange bit in FCR on NS87303, | 740 | * Set the drive exchange bit in FCR on NS87303, |
741 | * make shure other bits are sane before doing so. | 741 | * make sure other bits are sane before doing so. |
742 | */ | 742 | */ |
743 | ns87303_modify(config, FER, FER_EDM, 0); | 743 | ns87303_modify(config, FER, FER_EDM, 0); |
744 | ns87303_modify(config, ASC, ASC_DRV2_SEL, 0); | 744 | ns87303_modify(config, ASC, ASC_DRV2_SEL, 0); |
diff --git a/include/asm-sparc64/futex.h b/include/asm-sparc64/futex.h index 34c4b43d3f98..dee40206b221 100644 --- a/include/asm-sparc64/futex.h +++ b/include/asm-sparc64/futex.h | |||
@@ -83,4 +83,28 @@ static inline int futex_atomic_op_inuser(int encoded_op, int __user *uaddr) | |||
83 | return ret; | 83 | return ret; |
84 | } | 84 | } |
85 | 85 | ||
86 | static inline int | ||
87 | futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) | ||
88 | { | ||
89 | __asm__ __volatile__( | ||
90 | "\n1: lduwa [%2] %%asi, %0\n" | ||
91 | "2: casa [%2] %%asi, %0, %1\n" | ||
92 | "3:\n" | ||
93 | " .section .fixup,#alloc,#execinstr\n" | ||
94 | " .align 4\n" | ||
95 | "4: ba 3b\n" | ||
96 | " mov %3, %0\n" | ||
97 | " .previous\n" | ||
98 | " .section __ex_table,\"a\"\n" | ||
99 | " .align 4\n" | ||
100 | " .word 1b, 4b\n" | ||
101 | " .word 2b, 4b\n" | ||
102 | " .previous\n" | ||
103 | : "=&r" (oldval) | ||
104 | : "r" (newval), "r" (uaddr), "i" (-EFAULT) | ||
105 | : "memory"); | ||
106 | |||
107 | return oldval; | ||
108 | } | ||
109 | |||
86 | #endif /* !(_SPARC64_FUTEX_H) */ | 110 | #endif /* !(_SPARC64_FUTEX_H) */ |
diff --git a/include/asm-sparc64/kdebug.h b/include/asm-sparc64/kdebug.h index 6321f5a0198d..4040d127ac3e 100644 --- a/include/asm-sparc64/kdebug.h +++ b/include/asm-sparc64/kdebug.h | |||
@@ -15,12 +15,9 @@ struct die_args { | |||
15 | int signr; | 15 | int signr; |
16 | }; | 16 | }; |
17 | 17 | ||
18 | /* Note - you should never unregister because that can race with NMIs. | 18 | extern int register_die_notifier(struct notifier_block *); |
19 | * If you really want to do it first unregister - then synchronize_sched | 19 | extern int unregister_die_notifier(struct notifier_block *); |
20 | * - then free. | 20 | extern struct atomic_notifier_head sparc64die_chain; |
21 | */ | ||
22 | int register_die_notifier(struct notifier_block *nb); | ||
23 | extern struct notifier_block *sparc64die_chain; | ||
24 | 21 | ||
25 | extern void bad_trap(struct pt_regs *, long); | 22 | extern void bad_trap(struct pt_regs *, long); |
26 | 23 | ||
@@ -46,7 +43,7 @@ static inline int notify_die(enum die_val val,char *str, struct pt_regs *regs, | |||
46 | .trapnr = trap, | 43 | .trapnr = trap, |
47 | .signr = sig }; | 44 | .signr = sig }; |
48 | 45 | ||
49 | return notifier_call_chain(&sparc64die_chain, val, &args); | 46 | return atomic_notifier_call_chain(&sparc64die_chain, val, &args); |
50 | } | 47 | } |
51 | 48 | ||
52 | #endif | 49 | #endif |
diff --git a/include/asm-sparc64/page.h b/include/asm-sparc64/page.h index 66fe4ac59fd6..aabb21906724 100644 --- a/include/asm-sparc64/page.h +++ b/include/asm-sparc64/page.h | |||
@@ -111,6 +111,8 @@ typedef unsigned long pgprot_t; | |||
111 | (_AC(0x0000000070000000,UL)) : \ | 111 | (_AC(0x0000000070000000,UL)) : \ |
112 | (_AC(0xfffff80000000000,UL) + (1UL << 32UL))) | 112 | (_AC(0xfffff80000000000,UL) + (1UL << 32UL))) |
113 | 113 | ||
114 | #include <asm-generic/memory_model.h> | ||
115 | |||
114 | #endif /* !(__ASSEMBLY__) */ | 116 | #endif /* !(__ASSEMBLY__) */ |
115 | 117 | ||
116 | /* to align the pointer to the (next) page boundary */ | 118 | /* to align the pointer to the (next) page boundary */ |
diff --git a/include/asm-sparc64/poll.h b/include/asm-sparc64/poll.h index 31b611aa7468..ab6b0d1bb4ad 100644 --- a/include/asm-sparc64/poll.h +++ b/include/asm-sparc64/poll.h | |||
@@ -13,6 +13,7 @@ | |||
13 | #define POLLWRBAND 256 | 13 | #define POLLWRBAND 256 |
14 | #define POLLMSG 512 | 14 | #define POLLMSG 512 |
15 | #define POLLREMOVE 1024 | 15 | #define POLLREMOVE 1024 |
16 | #define POLLRDHUP 2048 | ||
16 | 17 | ||
17 | struct pollfd { | 18 | struct pollfd { |
18 | int fd; | 19 | int fd; |
diff --git a/include/asm-um/page.h b/include/asm-um/page.h index 0229814af31e..41364330aff1 100644 --- a/include/asm-um/page.h +++ b/include/asm-um/page.h | |||
@@ -106,9 +106,6 @@ extern unsigned long uml_physmem; | |||
106 | #define __pa(virt) to_phys((void *) (unsigned long) (virt)) | 106 | #define __pa(virt) to_phys((void *) (unsigned long) (virt)) |
107 | #define __va(phys) to_virt((unsigned long) (phys)) | 107 | #define __va(phys) to_virt((unsigned long) (phys)) |
108 | 108 | ||
109 | #define page_to_pfn(page) ((page) - mem_map) | ||
110 | #define pfn_to_page(pfn) (mem_map + (pfn)) | ||
111 | |||
112 | #define phys_to_pfn(p) ((p) >> PAGE_SHIFT) | 109 | #define phys_to_pfn(p) ((p) >> PAGE_SHIFT) |
113 | #define pfn_to_phys(pfn) ((pfn) << PAGE_SHIFT) | 110 | #define pfn_to_phys(pfn) ((pfn) << PAGE_SHIFT) |
114 | 111 | ||
@@ -121,6 +118,7 @@ extern struct page *arch_validate(struct page *page, gfp_t mask, int order); | |||
121 | extern void arch_free_page(struct page *page, int order); | 118 | extern void arch_free_page(struct page *page, int order); |
122 | #define HAVE_ARCH_FREE_PAGE | 119 | #define HAVE_ARCH_FREE_PAGE |
123 | 120 | ||
121 | #include <asm-generic/memory_model.h> | ||
124 | #include <asm-generic/page.h> | 122 | #include <asm-generic/page.h> |
125 | 123 | ||
126 | #endif | 124 | #endif |
diff --git a/include/asm-um/uaccess.h b/include/asm-um/uaccess.h index 2ee028b8de9d..4e460d6f5ac8 100644 --- a/include/asm-um/uaccess.h +++ b/include/asm-um/uaccess.h | |||
@@ -41,16 +41,16 @@ | |||
41 | 41 | ||
42 | #define __get_user(x, ptr) \ | 42 | #define __get_user(x, ptr) \ |
43 | ({ \ | 43 | ({ \ |
44 | const __typeof__(ptr) __private_ptr = ptr; \ | 44 | const __typeof__(ptr) __private_ptr = ptr; \ |
45 | __typeof__(*(__private_ptr)) __private_val; \ | 45 | __typeof__(x) __private_val; \ |
46 | int __private_ret = -EFAULT; \ | 46 | int __private_ret = -EFAULT; \ |
47 | (x) = (__typeof__(*(__private_ptr)))0; \ | 47 | (x) = (__typeof__(*(__private_ptr)))0; \ |
48 | if (__copy_from_user(&__private_val, (__private_ptr), \ | 48 | if (__copy_from_user((void *) &__private_val, (__private_ptr), \ |
49 | sizeof(*(__private_ptr))) == 0) {\ | 49 | sizeof(*(__private_ptr))) == 0) { \ |
50 | (x) = (__typeof__(*(__private_ptr))) __private_val; \ | 50 | (x) = (__typeof__(*(__private_ptr))) __private_val; \ |
51 | __private_ret = 0; \ | 51 | __private_ret = 0; \ |
52 | } \ | 52 | } \ |
53 | __private_ret; \ | 53 | __private_ret; \ |
54 | }) | 54 | }) |
55 | 55 | ||
56 | #define get_user(x, ptr) \ | 56 | #define get_user(x, ptr) \ |
@@ -89,14 +89,3 @@ struct exception_table_entry | |||
89 | }; | 89 | }; |
90 | 90 | ||
91 | #endif | 91 | #endif |
92 | |||
93 | /* | ||
94 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
95 | * Emacs will notice this stuff at the end of the file and automatically | ||
96 | * adjust the settings for this buffer only. This must remain at the end | ||
97 | * of the file. | ||
98 | * --------------------------------------------------------------------------- | ||
99 | * Local variables: | ||
100 | * c-file-style: "linux" | ||
101 | * End: | ||
102 | */ | ||
diff --git a/include/asm-v850/bitops.h b/include/asm-v850/bitops.h index 609b9e87222a..1f6fd5ab4177 100644 --- a/include/asm-v850/bitops.h +++ b/include/asm-v850/bitops.h | |||
@@ -22,25 +22,11 @@ | |||
22 | 22 | ||
23 | #ifdef __KERNEL__ | 23 | #ifdef __KERNEL__ |
24 | 24 | ||
25 | /* | 25 | #include <asm-generic/bitops/ffz.h> |
26 | * The __ functions are not atomic | ||
27 | */ | ||
28 | 26 | ||
29 | /* | 27 | /* |
30 | * ffz = Find First Zero in word. Undefined if no zero exists, | 28 | * The __ functions are not atomic |
31 | * so code should check against ~0UL first.. | ||
32 | */ | 29 | */ |
33 | static inline unsigned long ffz (unsigned long word) | ||
34 | { | ||
35 | unsigned long result = 0; | ||
36 | |||
37 | while (word & 1) { | ||
38 | result++; | ||
39 | word >>= 1; | ||
40 | } | ||
41 | return result; | ||
42 | } | ||
43 | |||
44 | 30 | ||
45 | /* In the following constant-bit-op macros, a "g" constraint is used when | 31 | /* In the following constant-bit-op macros, a "g" constraint is used when |
46 | we really need an integer ("i" constraint). This is to avoid | 32 | we really need an integer ("i" constraint). This is to avoid |
@@ -153,203 +139,19 @@ static inline int __test_bit (int nr, const void *addr) | |||
153 | #define smp_mb__before_clear_bit() barrier () | 139 | #define smp_mb__before_clear_bit() barrier () |
154 | #define smp_mb__after_clear_bit() barrier () | 140 | #define smp_mb__after_clear_bit() barrier () |
155 | 141 | ||
142 | #include <asm-generic/bitops/ffs.h> | ||
143 | #include <asm-generic/bitops/fls.h> | ||
144 | #include <asm-generic/bitops/fls64.h> | ||
145 | #include <asm-generic/bitops/__ffs.h> | ||
146 | #include <asm-generic/bitops/find.h> | ||
147 | #include <asm-generic/bitops/sched.h> | ||
148 | #include <asm-generic/bitops/hweight.h> | ||
156 | 149 | ||
157 | #define find_first_zero_bit(addr, size) \ | 150 | #include <asm-generic/bitops/ext2-non-atomic.h> |
158 | find_next_zero_bit ((addr), (size), 0) | ||
159 | |||
160 | static inline int find_next_zero_bit(const void *addr, int size, int offset) | ||
161 | { | ||
162 | unsigned long *p = ((unsigned long *) addr) + (offset >> 5); | ||
163 | unsigned long result = offset & ~31UL; | ||
164 | unsigned long tmp; | ||
165 | |||
166 | if (offset >= size) | ||
167 | return size; | ||
168 | size -= result; | ||
169 | offset &= 31UL; | ||
170 | if (offset) { | ||
171 | tmp = * (p++); | ||
172 | tmp |= ~0UL >> (32-offset); | ||
173 | if (size < 32) | ||
174 | goto found_first; | ||
175 | if (~tmp) | ||
176 | goto found_middle; | ||
177 | size -= 32; | ||
178 | result += 32; | ||
179 | } | ||
180 | while (size & ~31UL) { | ||
181 | if (~ (tmp = * (p++))) | ||
182 | goto found_middle; | ||
183 | result += 32; | ||
184 | size -= 32; | ||
185 | } | ||
186 | if (!size) | ||
187 | return result; | ||
188 | tmp = *p; | ||
189 | |||
190 | found_first: | ||
191 | tmp |= ~0UL << size; | ||
192 | found_middle: | ||
193 | return result + ffz (tmp); | ||
194 | } | ||
195 | |||
196 | |||
197 | /* This is the same as generic_ffs, but we can't use that because it's | ||
198 | inline and the #include order mucks things up. */ | ||
199 | static inline int generic_ffs_for_find_next_bit(int x) | ||
200 | { | ||
201 | int r = 1; | ||
202 | |||
203 | if (!x) | ||
204 | return 0; | ||
205 | if (!(x & 0xffff)) { | ||
206 | x >>= 16; | ||
207 | r += 16; | ||
208 | } | ||
209 | if (!(x & 0xff)) { | ||
210 | x >>= 8; | ||
211 | r += 8; | ||
212 | } | ||
213 | if (!(x & 0xf)) { | ||
214 | x >>= 4; | ||
215 | r += 4; | ||
216 | } | ||
217 | if (!(x & 3)) { | ||
218 | x >>= 2; | ||
219 | r += 2; | ||
220 | } | ||
221 | if (!(x & 1)) { | ||
222 | x >>= 1; | ||
223 | r += 1; | ||
224 | } | ||
225 | return r; | ||
226 | } | ||
227 | |||
228 | /* | ||
229 | * Find next one bit in a bitmap reasonably efficiently. | ||
230 | */ | ||
231 | static __inline__ unsigned long find_next_bit(const unsigned long *addr, | ||
232 | unsigned long size, unsigned long offset) | ||
233 | { | ||
234 | unsigned int *p = ((unsigned int *) addr) + (offset >> 5); | ||
235 | unsigned int result = offset & ~31UL; | ||
236 | unsigned int tmp; | ||
237 | |||
238 | if (offset >= size) | ||
239 | return size; | ||
240 | size -= result; | ||
241 | offset &= 31UL; | ||
242 | if (offset) { | ||
243 | tmp = *p++; | ||
244 | tmp &= ~0UL << offset; | ||
245 | if (size < 32) | ||
246 | goto found_first; | ||
247 | if (tmp) | ||
248 | goto found_middle; | ||
249 | size -= 32; | ||
250 | result += 32; | ||
251 | } | ||
252 | while (size >= 32) { | ||
253 | if ((tmp = *p++) != 0) | ||
254 | goto found_middle; | ||
255 | result += 32; | ||
256 | size -= 32; | ||
257 | } | ||
258 | if (!size) | ||
259 | return result; | ||
260 | tmp = *p; | ||
261 | |||
262 | found_first: | ||
263 | tmp &= ~0UL >> (32 - size); | ||
264 | if (tmp == 0UL) /* Are any bits set? */ | ||
265 | return result + size; /* Nope. */ | ||
266 | found_middle: | ||
267 | return result + generic_ffs_for_find_next_bit(tmp); | ||
268 | } | ||
269 | |||
270 | /* | ||
271 | * find_first_bit - find the first set bit in a memory region | ||
272 | */ | ||
273 | #define find_first_bit(addr, size) \ | ||
274 | find_next_bit((addr), (size), 0) | ||
275 | |||
276 | |||
277 | #define ffs(x) generic_ffs (x) | ||
278 | #define fls(x) generic_fls (x) | ||
279 | #define fls64(x) generic_fls64(x) | ||
280 | #define __ffs(x) ffs(x) | ||
281 | |||
282 | |||
283 | /* | ||
284 | * This is just `generic_ffs' from <linux/bitops.h>, except that it assumes | ||
285 | * that at least one bit is set, and returns the real index of the bit | ||
286 | * (rather than the bit index + 1, like ffs does). | ||
287 | */ | ||
288 | static inline int sched_ffs(int x) | ||
289 | { | ||
290 | int r = 0; | ||
291 | |||
292 | if (!(x & 0xffff)) { | ||
293 | x >>= 16; | ||
294 | r += 16; | ||
295 | } | ||
296 | if (!(x & 0xff)) { | ||
297 | x >>= 8; | ||
298 | r += 8; | ||
299 | } | ||
300 | if (!(x & 0xf)) { | ||
301 | x >>= 4; | ||
302 | r += 4; | ||
303 | } | ||
304 | if (!(x & 3)) { | ||
305 | x >>= 2; | ||
306 | r += 2; | ||
307 | } | ||
308 | if (!(x & 1)) { | ||
309 | x >>= 1; | ||
310 | r += 1; | ||
311 | } | ||
312 | return r; | ||
313 | } | ||
314 | |||
315 | /* | ||
316 | * Every architecture must define this function. It's the fastest | ||
317 | * way of searching a 140-bit bitmap where the first 100 bits are | ||
318 | * unlikely to be set. It's guaranteed that at least one of the 140 | ||
319 | * bits is set. | ||
320 | */ | ||
321 | static inline int sched_find_first_bit(unsigned long *b) | ||
322 | { | ||
323 | unsigned offs = 0; | ||
324 | while (! *b) { | ||
325 | b++; | ||
326 | offs += 32; | ||
327 | } | ||
328 | return sched_ffs (*b) + offs; | ||
329 | } | ||
330 | |||
331 | /* | ||
332 | * hweightN: returns the hamming weight (i.e. the number | ||
333 | * of bits set) of a N-bit word | ||
334 | */ | ||
335 | #define hweight32(x) generic_hweight32 (x) | ||
336 | #define hweight16(x) generic_hweight16 (x) | ||
337 | #define hweight8(x) generic_hweight8 (x) | ||
338 | |||
339 | #define ext2_set_bit test_and_set_bit | ||
340 | #define ext2_set_bit_atomic(l,n,a) test_and_set_bit(n,a) | 151 | #define ext2_set_bit_atomic(l,n,a) test_and_set_bit(n,a) |
341 | #define ext2_clear_bit test_and_clear_bit | ||
342 | #define ext2_clear_bit_atomic(l,n,a) test_and_clear_bit(n,a) | 152 | #define ext2_clear_bit_atomic(l,n,a) test_and_clear_bit(n,a) |
343 | #define ext2_test_bit test_bit | ||
344 | #define ext2_find_first_zero_bit find_first_zero_bit | ||
345 | #define ext2_find_next_zero_bit find_next_zero_bit | ||
346 | 153 | ||
347 | /* Bitmap functions for the minix filesystem. */ | 154 | #include <asm-generic/bitops/minix.h> |
348 | #define minix_test_and_set_bit test_and_set_bit | ||
349 | #define minix_set_bit set_bit | ||
350 | #define minix_test_and_clear_bit test_and_clear_bit | ||
351 | #define minix_test_bit test_bit | ||
352 | #define minix_find_first_zero_bit find_first_zero_bit | ||
353 | 155 | ||
354 | #endif /* __KERNEL__ */ | 156 | #endif /* __KERNEL__ */ |
355 | 157 | ||
diff --git a/include/asm-v850/page.h b/include/asm-v850/page.h index b4bc85e7b91a..ad03c46a1f92 100644 --- a/include/asm-v850/page.h +++ b/include/asm-v850/page.h | |||
@@ -111,8 +111,7 @@ typedef unsigned long pgprot_t; | |||
111 | #define page_to_virt(page) \ | 111 | #define page_to_virt(page) \ |
112 | ((((page) - mem_map) << PAGE_SHIFT) + PAGE_OFFSET) | 112 | ((((page) - mem_map) << PAGE_SHIFT) + PAGE_OFFSET) |
113 | 113 | ||
114 | #define pfn_to_page(pfn) virt_to_page (pfn_to_virt (pfn)) | 114 | #define ARCH_PFN_OFFSET (PAGE_OFFSET >> PAGE_SHIFT) |
115 | #define page_to_pfn(page) virt_to_pfn (page_to_virt (page)) | ||
116 | #define pfn_valid(pfn) ((pfn) < max_mapnr) | 115 | #define pfn_valid(pfn) ((pfn) < max_mapnr) |
117 | 116 | ||
118 | #define virt_addr_valid(kaddr) \ | 117 | #define virt_addr_valid(kaddr) \ |
@@ -125,6 +124,7 @@ typedef unsigned long pgprot_t; | |||
125 | 124 | ||
126 | #endif /* KERNEL */ | 125 | #endif /* KERNEL */ |
127 | 126 | ||
127 | #include <asm-generic/memory_model.h> | ||
128 | #include <asm-generic/page.h> | 128 | #include <asm-generic/page.h> |
129 | 129 | ||
130 | #endif /* __V850_PAGE_H__ */ | 130 | #endif /* __V850_PAGE_H__ */ |
diff --git a/include/asm-v850/poll.h b/include/asm-v850/poll.h index 0369562c7e15..c10176c2c28f 100644 --- a/include/asm-v850/poll.h +++ b/include/asm-v850/poll.h | |||
@@ -13,6 +13,7 @@ | |||
13 | #define POLLWRBAND 0x0100 | 13 | #define POLLWRBAND 0x0100 |
14 | #define POLLMSG 0x0400 | 14 | #define POLLMSG 0x0400 |
15 | #define POLLREMOVE 0x1000 | 15 | #define POLLREMOVE 0x1000 |
16 | #define POLLRDHUP 0x2000 | ||
16 | 17 | ||
17 | struct pollfd { | 18 | struct pollfd { |
18 | int fd; | 19 | int fd; |
diff --git a/include/asm-x86_64/apicdef.h b/include/asm-x86_64/apicdef.h index decaa2d540e8..5a48e9bcf218 100644 --- a/include/asm-x86_64/apicdef.h +++ b/include/asm-x86_64/apicdef.h | |||
@@ -39,6 +39,7 @@ | |||
39 | #define APIC_SPIV_FOCUS_DISABLED (1<<9) | 39 | #define APIC_SPIV_FOCUS_DISABLED (1<<9) |
40 | #define APIC_SPIV_APIC_ENABLED (1<<8) | 40 | #define APIC_SPIV_APIC_ENABLED (1<<8) |
41 | #define APIC_ISR 0x100 | 41 | #define APIC_ISR 0x100 |
42 | #define APIC_ISR_NR 0x8 /* Number of 32 bit ISR registers. */ | ||
42 | #define APIC_TMR 0x180 | 43 | #define APIC_TMR 0x180 |
43 | #define APIC_IRR 0x200 | 44 | #define APIC_IRR 0x200 |
44 | #define APIC_ESR 0x280 | 45 | #define APIC_ESR 0x280 |
diff --git a/include/asm-x86_64/bitops.h b/include/asm-x86_64/bitops.h index eb4df23e1e41..79212128d0f7 100644 --- a/include/asm-x86_64/bitops.h +++ b/include/asm-x86_64/bitops.h | |||
@@ -356,14 +356,7 @@ static __inline__ unsigned long __fls(unsigned long word) | |||
356 | 356 | ||
357 | #ifdef __KERNEL__ | 357 | #ifdef __KERNEL__ |
358 | 358 | ||
359 | static inline int sched_find_first_bit(const unsigned long *b) | 359 | #include <asm-generic/bitops/sched.h> |
360 | { | ||
361 | if (b[0]) | ||
362 | return __ffs(b[0]); | ||
363 | if (b[1]) | ||
364 | return __ffs(b[1]) + 64; | ||
365 | return __ffs(b[2]) + 128; | ||
366 | } | ||
367 | 360 | ||
368 | /** | 361 | /** |
369 | * ffs - find first bit set | 362 | * ffs - find first bit set |
@@ -412,43 +405,20 @@ static __inline__ int fls(int x) | |||
412 | return r+1; | 405 | return r+1; |
413 | } | 406 | } |
414 | 407 | ||
415 | /** | 408 | #include <asm-generic/bitops/hweight.h> |
416 | * hweightN - returns the hamming weight of a N-bit word | ||
417 | * @x: the word to weigh | ||
418 | * | ||
419 | * The Hamming Weight of a number is the total number of bits set in it. | ||
420 | */ | ||
421 | |||
422 | #define hweight64(x) generic_hweight64(x) | ||
423 | #define hweight32(x) generic_hweight32(x) | ||
424 | #define hweight16(x) generic_hweight16(x) | ||
425 | #define hweight8(x) generic_hweight8(x) | ||
426 | 409 | ||
427 | #endif /* __KERNEL__ */ | 410 | #endif /* __KERNEL__ */ |
428 | 411 | ||
429 | #ifdef __KERNEL__ | 412 | #ifdef __KERNEL__ |
430 | 413 | ||
431 | #define ext2_set_bit(nr,addr) \ | 414 | #include <asm-generic/bitops/ext2-non-atomic.h> |
432 | __test_and_set_bit((nr),(unsigned long*)addr) | 415 | |
433 | #define ext2_set_bit_atomic(lock,nr,addr) \ | 416 | #define ext2_set_bit_atomic(lock,nr,addr) \ |
434 | test_and_set_bit((nr),(unsigned long*)addr) | 417 | test_and_set_bit((nr),(unsigned long*)addr) |
435 | #define ext2_clear_bit(nr, addr) \ | ||
436 | __test_and_clear_bit((nr),(unsigned long*)addr) | ||
437 | #define ext2_clear_bit_atomic(lock,nr,addr) \ | 418 | #define ext2_clear_bit_atomic(lock,nr,addr) \ |
438 | test_and_clear_bit((nr),(unsigned long*)addr) | 419 | test_and_clear_bit((nr),(unsigned long*)addr) |
439 | #define ext2_test_bit(nr, addr) test_bit((nr),(unsigned long*)addr) | 420 | |
440 | #define ext2_find_first_zero_bit(addr, size) \ | 421 | #include <asm-generic/bitops/minix.h> |
441 | find_first_zero_bit((unsigned long*)addr, size) | ||
442 | #define ext2_find_next_zero_bit(addr, size, off) \ | ||
443 | find_next_zero_bit((unsigned long*)addr, size, off) | ||
444 | |||
445 | /* Bitmap functions for the minix filesystem. */ | ||
446 | #define minix_test_and_set_bit(nr,addr) __test_and_set_bit(nr,(void*)addr) | ||
447 | #define minix_set_bit(nr,addr) __set_bit(nr,(void*)addr) | ||
448 | #define minix_test_and_clear_bit(nr,addr) __test_and_clear_bit(nr,(void*)addr) | ||
449 | #define minix_test_bit(nr,addr) test_bit(nr,(void*)addr) | ||
450 | #define minix_find_first_zero_bit(addr,size) \ | ||
451 | find_first_zero_bit((void*)addr,size) | ||
452 | 422 | ||
453 | #endif /* __KERNEL__ */ | 423 | #endif /* __KERNEL__ */ |
454 | 424 | ||
diff --git a/include/asm-x86_64/dmi.h b/include/asm-x86_64/dmi.h new file mode 100644 index 000000000000..93b2b15d4325 --- /dev/null +++ b/include/asm-x86_64/dmi.h | |||
@@ -0,0 +1,27 @@ | |||
1 | #ifndef _ASM_DMI_H | ||
2 | #define _ASM_DMI_H 1 | ||
3 | |||
4 | #include <asm/io.h> | ||
5 | |||
6 | extern void *dmi_ioremap(unsigned long addr, unsigned long size); | ||
7 | extern void dmi_iounmap(void *addr, unsigned long size); | ||
8 | |||
9 | #define DMI_MAX_DATA 2048 | ||
10 | |||
11 | extern int dmi_alloc_index; | ||
12 | extern char dmi_alloc_data[DMI_MAX_DATA]; | ||
13 | |||
14 | /* This is so early that there is no good way to allocate dynamic memory. | ||
15 | Allocate data in an BSS array. */ | ||
16 | static inline void *dmi_alloc(unsigned len) | ||
17 | { | ||
18 | int idx = dmi_alloc_index; | ||
19 | if ((dmi_alloc_index += len) > DMI_MAX_DATA) | ||
20 | return NULL; | ||
21 | return dmi_alloc_data + idx; | ||
22 | } | ||
23 | |||
24 | #define dmi_ioremap early_ioremap | ||
25 | #define dmi_iounmap early_iounmap | ||
26 | |||
27 | #endif | ||
diff --git a/include/asm-x86_64/elf.h b/include/asm-x86_64/elf.h index 43862cd6a569..c98633af07d2 100644 --- a/include/asm-x86_64/elf.h +++ b/include/asm-x86_64/elf.h | |||
@@ -8,6 +8,7 @@ | |||
8 | #include <asm/ptrace.h> | 8 | #include <asm/ptrace.h> |
9 | #include <asm/user.h> | 9 | #include <asm/user.h> |
10 | #include <asm/processor.h> | 10 | #include <asm/processor.h> |
11 | #include <asm/compat.h> | ||
11 | 12 | ||
12 | /* x86-64 relocation types */ | 13 | /* x86-64 relocation types */ |
13 | #define R_X86_64_NONE 0 /* No reloc */ | 14 | #define R_X86_64_NONE 0 /* No reloc */ |
@@ -157,6 +158,9 @@ extern int dump_task_fpu (struct task_struct *, elf_fpregset_t *); | |||
157 | #define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs) | 158 | #define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs) |
158 | #define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs) | 159 | #define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs) |
159 | 160 | ||
161 | /* 1GB for 64bit, 8MB for 32bit */ | ||
162 | #define STACK_RND_MASK (is_compat_task() ? 0x7ff : 0x3fffff) | ||
163 | |||
160 | #endif | 164 | #endif |
161 | 165 | ||
162 | #endif | 166 | #endif |
diff --git a/include/asm-x86_64/floppy.h b/include/asm-x86_64/floppy.h index af7ded63b517..52825ce689f2 100644 --- a/include/asm-x86_64/floppy.h +++ b/include/asm-x86_64/floppy.h | |||
@@ -155,7 +155,7 @@ static int fd_request_irq(void) | |||
155 | 155 | ||
156 | static unsigned long dma_mem_alloc(unsigned long size) | 156 | static unsigned long dma_mem_alloc(unsigned long size) |
157 | { | 157 | { |
158 | return __get_dma_pages(GFP_KERNEL,get_order(size)); | 158 | return __get_dma_pages(GFP_KERNEL|__GFP_NORETRY,get_order(size)); |
159 | } | 159 | } |
160 | 160 | ||
161 | 161 | ||
diff --git a/include/asm-x86_64/futex.h b/include/asm-x86_64/futex.h index 8602c09bf89e..9804bf07b092 100644 --- a/include/asm-x86_64/futex.h +++ b/include/asm-x86_64/futex.h | |||
@@ -94,5 +94,32 @@ futex_atomic_op_inuser (int encoded_op, int __user *uaddr) | |||
94 | return ret; | 94 | return ret; |
95 | } | 95 | } |
96 | 96 | ||
97 | static inline int | ||
98 | futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) | ||
99 | { | ||
100 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) | ||
101 | return -EFAULT; | ||
102 | |||
103 | __asm__ __volatile__( | ||
104 | "1: " LOCK_PREFIX "cmpxchgl %3, %1 \n" | ||
105 | |||
106 | "2: .section .fixup, \"ax\" \n" | ||
107 | "3: mov %2, %0 \n" | ||
108 | " jmp 2b \n" | ||
109 | " .previous \n" | ||
110 | |||
111 | " .section __ex_table, \"a\" \n" | ||
112 | " .align 8 \n" | ||
113 | " .quad 1b,3b \n" | ||
114 | " .previous \n" | ||
115 | |||
116 | : "=a" (oldval), "=m" (*uaddr) | ||
117 | : "i" (-EFAULT), "r" (newval), "0" (oldval) | ||
118 | : "memory" | ||
119 | ); | ||
120 | |||
121 | return oldval; | ||
122 | } | ||
123 | |||
97 | #endif | 124 | #endif |
98 | #endif | 125 | #endif |
diff --git a/include/asm-x86_64/io.h b/include/asm-x86_64/io.h index a85fe8370820..cafdfb37f0d8 100644 --- a/include/asm-x86_64/io.h +++ b/include/asm-x86_64/io.h | |||
@@ -135,6 +135,9 @@ static inline void __iomem * ioremap (unsigned long offset, unsigned long size) | |||
135 | return __ioremap(offset, size, 0); | 135 | return __ioremap(offset, size, 0); |
136 | } | 136 | } |
137 | 137 | ||
138 | extern void *early_ioremap(unsigned long addr, unsigned long size); | ||
139 | extern void early_iounmap(void *addr, unsigned long size); | ||
140 | |||
138 | /* | 141 | /* |
139 | * This one maps high address device memory and turns off caching for that area. | 142 | * This one maps high address device memory and turns off caching for that area. |
140 | * it's useful if some control registers are in such an area and write combining | 143 | * it's useful if some control registers are in such an area and write combining |
@@ -143,11 +146,6 @@ static inline void __iomem * ioremap (unsigned long offset, unsigned long size) | |||
143 | extern void __iomem * ioremap_nocache (unsigned long offset, unsigned long size); | 146 | extern void __iomem * ioremap_nocache (unsigned long offset, unsigned long size); |
144 | extern void iounmap(volatile void __iomem *addr); | 147 | extern void iounmap(volatile void __iomem *addr); |
145 | 148 | ||
146 | /* Use normal IO mappings for DMI */ | ||
147 | #define dmi_ioremap ioremap | ||
148 | #define dmi_iounmap(x,l) iounmap(x) | ||
149 | #define dmi_alloc(l) kmalloc(l, GFP_ATOMIC) | ||
150 | |||
151 | /* | 149 | /* |
152 | * ISA I/O bus memory addresses are 1:1 with the physical address. | 150 | * ISA I/O bus memory addresses are 1:1 with the physical address. |
153 | */ | 151 | */ |
@@ -202,23 +200,6 @@ static inline __u64 __readq(const volatile void __iomem *addr) | |||
202 | 200 | ||
203 | #define mmiowb() | 201 | #define mmiowb() |
204 | 202 | ||
205 | #ifdef CONFIG_UNORDERED_IO | ||
206 | static inline void __writel(__u32 val, volatile void __iomem *addr) | ||
207 | { | ||
208 | volatile __u32 __iomem *target = addr; | ||
209 | asm volatile("movnti %1,%0" | ||
210 | : "=m" (*target) | ||
211 | : "r" (val) : "memory"); | ||
212 | } | ||
213 | |||
214 | static inline void __writeq(__u64 val, volatile void __iomem *addr) | ||
215 | { | ||
216 | volatile __u64 __iomem *target = addr; | ||
217 | asm volatile("movnti %1,%0" | ||
218 | : "=m" (*target) | ||
219 | : "r" (val) : "memory"); | ||
220 | } | ||
221 | #else | ||
222 | static inline void __writel(__u32 b, volatile void __iomem *addr) | 203 | static inline void __writel(__u32 b, volatile void __iomem *addr) |
223 | { | 204 | { |
224 | *(__force volatile __u32 *)addr = b; | 205 | *(__force volatile __u32 *)addr = b; |
@@ -227,7 +208,6 @@ static inline void __writeq(__u64 b, volatile void __iomem *addr) | |||
227 | { | 208 | { |
228 | *(__force volatile __u64 *)addr = b; | 209 | *(__force volatile __u64 *)addr = b; |
229 | } | 210 | } |
230 | #endif | ||
231 | static inline void __writeb(__u8 b, volatile void __iomem *addr) | 211 | static inline void __writeb(__u8 b, volatile void __iomem *addr) |
232 | { | 212 | { |
233 | *(__force volatile __u8 *)addr = b; | 213 | *(__force volatile __u8 *)addr = b; |
diff --git a/include/asm-x86_64/kdebug.h b/include/asm-x86_64/kdebug.h index b9ed4c0c8783..cf795631d9b4 100644 --- a/include/asm-x86_64/kdebug.h +++ b/include/asm-x86_64/kdebug.h | |||
@@ -5,21 +5,20 @@ | |||
5 | 5 | ||
6 | struct pt_regs; | 6 | struct pt_regs; |
7 | 7 | ||
8 | struct die_args { | 8 | struct die_args { |
9 | struct pt_regs *regs; | 9 | struct pt_regs *regs; |
10 | const char *str; | 10 | const char *str; |
11 | long err; | 11 | long err; |
12 | int trapnr; | 12 | int trapnr; |
13 | int signr; | 13 | int signr; |
14 | }; | 14 | }; |
15 | |||
16 | extern int register_die_notifier(struct notifier_block *); | ||
17 | extern int unregister_die_notifier(struct notifier_block *); | ||
18 | extern struct atomic_notifier_head die_chain; | ||
15 | 19 | ||
16 | /* Note - you should never unregister because that can race with NMIs. | ||
17 | If you really want to do it first unregister - then synchronize_sched - then free. | ||
18 | */ | ||
19 | int register_die_notifier(struct notifier_block *nb); | ||
20 | extern struct notifier_block *die_chain; | ||
21 | /* Grossly misnamed. */ | 20 | /* Grossly misnamed. */ |
22 | enum die_val { | 21 | enum die_val { |
23 | DIE_OOPS = 1, | 22 | DIE_OOPS = 1, |
24 | DIE_INT3, | 23 | DIE_INT3, |
25 | DIE_DEBUG, | 24 | DIE_DEBUG, |
@@ -33,8 +32,8 @@ enum die_val { | |||
33 | DIE_CALL, | 32 | DIE_CALL, |
34 | DIE_NMI_IPI, | 33 | DIE_NMI_IPI, |
35 | DIE_PAGE_FAULT, | 34 | DIE_PAGE_FAULT, |
36 | }; | 35 | }; |
37 | 36 | ||
38 | static inline int notify_die(enum die_val val, const char *str, | 37 | static inline int notify_die(enum die_val val, const char *str, |
39 | struct pt_regs *regs, long err, int trap, int sig) | 38 | struct pt_regs *regs, long err, int trap, int sig) |
40 | { | 39 | { |
@@ -45,7 +44,7 @@ static inline int notify_die(enum die_val val, const char *str, | |||
45 | .trapnr = trap, | 44 | .trapnr = trap, |
46 | .signr = sig | 45 | .signr = sig |
47 | }; | 46 | }; |
48 | return notifier_call_chain(&die_chain, val, &args); | 47 | return atomic_notifier_call_chain(&die_chain, val, &args); |
49 | } | 48 | } |
50 | 49 | ||
51 | extern int printk_address(unsigned long address); | 50 | extern int printk_address(unsigned long address); |
diff --git a/include/asm-x86_64/local.h b/include/asm-x86_64/local.h index 3e72c41727c5..bf148037d4e5 100644 --- a/include/asm-x86_64/local.h +++ b/include/asm-x86_64/local.h | |||
@@ -5,7 +5,7 @@ | |||
5 | 5 | ||
6 | typedef struct | 6 | typedef struct |
7 | { | 7 | { |
8 | volatile unsigned int counter; | 8 | volatile unsigned long counter; |
9 | } local_t; | 9 | } local_t; |
10 | 10 | ||
11 | #define LOCAL_INIT(i) { (i) } | 11 | #define LOCAL_INIT(i) { (i) } |
@@ -16,7 +16,7 @@ typedef struct | |||
16 | static __inline__ void local_inc(local_t *v) | 16 | static __inline__ void local_inc(local_t *v) |
17 | { | 17 | { |
18 | __asm__ __volatile__( | 18 | __asm__ __volatile__( |
19 | "incl %0" | 19 | "incq %0" |
20 | :"=m" (v->counter) | 20 | :"=m" (v->counter) |
21 | :"m" (v->counter)); | 21 | :"m" (v->counter)); |
22 | } | 22 | } |
@@ -24,7 +24,7 @@ static __inline__ void local_inc(local_t *v) | |||
24 | static __inline__ void local_dec(local_t *v) | 24 | static __inline__ void local_dec(local_t *v) |
25 | { | 25 | { |
26 | __asm__ __volatile__( | 26 | __asm__ __volatile__( |
27 | "decl %0" | 27 | "decq %0" |
28 | :"=m" (v->counter) | 28 | :"=m" (v->counter) |
29 | :"m" (v->counter)); | 29 | :"m" (v->counter)); |
30 | } | 30 | } |
@@ -32,7 +32,7 @@ static __inline__ void local_dec(local_t *v) | |||
32 | static __inline__ void local_add(unsigned int i, local_t *v) | 32 | static __inline__ void local_add(unsigned int i, local_t *v) |
33 | { | 33 | { |
34 | __asm__ __volatile__( | 34 | __asm__ __volatile__( |
35 | "addl %1,%0" | 35 | "addq %1,%0" |
36 | :"=m" (v->counter) | 36 | :"=m" (v->counter) |
37 | :"ir" (i), "m" (v->counter)); | 37 | :"ir" (i), "m" (v->counter)); |
38 | } | 38 | } |
@@ -40,7 +40,7 @@ static __inline__ void local_add(unsigned int i, local_t *v) | |||
40 | static __inline__ void local_sub(unsigned int i, local_t *v) | 40 | static __inline__ void local_sub(unsigned int i, local_t *v) |
41 | { | 41 | { |
42 | __asm__ __volatile__( | 42 | __asm__ __volatile__( |
43 | "subl %1,%0" | 43 | "subq %1,%0" |
44 | :"=m" (v->counter) | 44 | :"=m" (v->counter) |
45 | :"ir" (i), "m" (v->counter)); | 45 | :"ir" (i), "m" (v->counter)); |
46 | } | 46 | } |
diff --git a/include/asm-x86_64/mmzone.h b/include/asm-x86_64/mmzone.h index 972c9359f7d7..6b18cd8f293d 100644 --- a/include/asm-x86_64/mmzone.h +++ b/include/asm-x86_64/mmzone.h | |||
@@ -15,8 +15,13 @@ | |||
15 | #define NODEMAPSIZE 0xfff | 15 | #define NODEMAPSIZE 0xfff |
16 | 16 | ||
17 | /* Simple perfect hash to map physical addresses to node numbers */ | 17 | /* Simple perfect hash to map physical addresses to node numbers */ |
18 | extern int memnode_shift; | 18 | struct memnode { |
19 | extern u8 memnodemap[NODEMAPSIZE]; | 19 | int shift; |
20 | u8 map[NODEMAPSIZE]; | ||
21 | } ____cacheline_aligned; | ||
22 | extern struct memnode memnode; | ||
23 | #define memnode_shift memnode.shift | ||
24 | #define memnodemap memnode.map | ||
20 | 25 | ||
21 | extern struct pglist_data *node_data[]; | 26 | extern struct pglist_data *node_data[]; |
22 | 27 | ||
@@ -39,12 +44,8 @@ static inline __attribute__((pure)) int phys_to_nid(unsigned long addr) | |||
39 | #define pfn_to_nid(pfn) phys_to_nid((unsigned long)(pfn) << PAGE_SHIFT) | 44 | #define pfn_to_nid(pfn) phys_to_nid((unsigned long)(pfn) << PAGE_SHIFT) |
40 | #define kvaddr_to_nid(kaddr) phys_to_nid(__pa(kaddr)) | 45 | #define kvaddr_to_nid(kaddr) phys_to_nid(__pa(kaddr)) |
41 | 46 | ||
42 | extern struct page *pfn_to_page(unsigned long pfn); | ||
43 | extern unsigned long page_to_pfn(struct page *page); | ||
44 | extern int pfn_valid(unsigned long pfn); | 47 | extern int pfn_valid(unsigned long pfn); |
45 | #endif | 48 | #endif |
46 | 49 | ||
47 | #define local_mapnr(kvaddr) \ | ||
48 | ( (__pa(kvaddr) >> PAGE_SHIFT) - node_start_pfn(kvaddr_to_nid(kvaddr)) ) | ||
49 | #endif | 50 | #endif |
50 | #endif | 51 | #endif |
diff --git a/include/asm-x86_64/numa.h b/include/asm-x86_64/numa.h index dffe276ca2df..f6cbb4cbb5a3 100644 --- a/include/asm-x86_64/numa.h +++ b/include/asm-x86_64/numa.h | |||
@@ -4,11 +4,11 @@ | |||
4 | #include <linux/nodemask.h> | 4 | #include <linux/nodemask.h> |
5 | #include <asm/numnodes.h> | 5 | #include <asm/numnodes.h> |
6 | 6 | ||
7 | struct node { | 7 | struct bootnode { |
8 | u64 start,end; | 8 | u64 start,end; |
9 | }; | 9 | }; |
10 | 10 | ||
11 | extern int compute_hash_shift(struct node *nodes, int numnodes); | 11 | extern int compute_hash_shift(struct bootnode *nodes, int numnodes); |
12 | extern int pxm_to_node(int nid); | 12 | extern int pxm_to_node(int nid); |
13 | 13 | ||
14 | #define ZONE_ALIGN (1UL << (MAX_ORDER+PAGE_SHIFT)) | 14 | #define ZONE_ALIGN (1UL << (MAX_ORDER+PAGE_SHIFT)) |
diff --git a/include/asm-x86_64/page.h b/include/asm-x86_64/page.h index 615e3e494929..408185bac351 100644 --- a/include/asm-x86_64/page.h +++ b/include/asm-x86_64/page.h | |||
@@ -123,8 +123,6 @@ typedef struct { unsigned long pgprot; } pgprot_t; | |||
123 | #define __boot_va(x) __va(x) | 123 | #define __boot_va(x) __va(x) |
124 | #define __boot_pa(x) __pa(x) | 124 | #define __boot_pa(x) __pa(x) |
125 | #ifdef CONFIG_FLATMEM | 125 | #ifdef CONFIG_FLATMEM |
126 | #define pfn_to_page(pfn) (mem_map + (pfn)) | ||
127 | #define page_to_pfn(page) ((unsigned long)((page) - mem_map)) | ||
128 | #define pfn_valid(pfn) ((pfn) < end_pfn) | 126 | #define pfn_valid(pfn) ((pfn) < end_pfn) |
129 | #endif | 127 | #endif |
130 | 128 | ||
@@ -140,6 +138,7 @@ typedef struct { unsigned long pgprot; } pgprot_t; | |||
140 | 138 | ||
141 | #endif /* __KERNEL__ */ | 139 | #endif /* __KERNEL__ */ |
142 | 140 | ||
141 | #include <asm-generic/memory_model.h> | ||
143 | #include <asm-generic/page.h> | 142 | #include <asm-generic/page.h> |
144 | 143 | ||
145 | #endif /* _X86_64_PAGE_H */ | 144 | #endif /* _X86_64_PAGE_H */ |
diff --git a/include/asm-x86_64/pda.h b/include/asm-x86_64/pda.h index c7ab38a601af..b47c3df9ed1d 100644 --- a/include/asm-x86_64/pda.h +++ b/include/asm-x86_64/pda.h | |||
@@ -22,8 +22,8 @@ struct x8664_pda { | |||
22 | int nodenumber; /* number of current node */ | 22 | int nodenumber; /* number of current node */ |
23 | unsigned int __softirq_pending; | 23 | unsigned int __softirq_pending; |
24 | unsigned int __nmi_count; /* number of NMI on this CPUs */ | 24 | unsigned int __nmi_count; /* number of NMI on this CPUs */ |
25 | struct mm_struct *active_mm; | ||
26 | int mmu_state; | 25 | int mmu_state; |
26 | struct mm_struct *active_mm; | ||
27 | unsigned apic_timer_irqs; | 27 | unsigned apic_timer_irqs; |
28 | } ____cacheline_aligned_in_smp; | 28 | } ____cacheline_aligned_in_smp; |
29 | 29 | ||
diff --git a/include/asm-x86_64/pgalloc.h b/include/asm-x86_64/pgalloc.h index 08cad2482bcb..43d4c333a8b1 100644 --- a/include/asm-x86_64/pgalloc.h +++ b/include/asm-x86_64/pgalloc.h | |||
@@ -45,12 +45,39 @@ static inline void pud_free (pud_t *pud) | |||
45 | free_page((unsigned long)pud); | 45 | free_page((unsigned long)pud); |
46 | } | 46 | } |
47 | 47 | ||
48 | static inline void pgd_list_add(pgd_t *pgd) | ||
49 | { | ||
50 | struct page *page = virt_to_page(pgd); | ||
51 | |||
52 | spin_lock(&pgd_lock); | ||
53 | page->index = (pgoff_t)pgd_list; | ||
54 | if (pgd_list) | ||
55 | pgd_list->private = (unsigned long)&page->index; | ||
56 | pgd_list = page; | ||
57 | page->private = (unsigned long)&pgd_list; | ||
58 | spin_unlock(&pgd_lock); | ||
59 | } | ||
60 | |||
61 | static inline void pgd_list_del(pgd_t *pgd) | ||
62 | { | ||
63 | struct page *next, **pprev, *page = virt_to_page(pgd); | ||
64 | |||
65 | spin_lock(&pgd_lock); | ||
66 | next = (struct page *)page->index; | ||
67 | pprev = (struct page **)page->private; | ||
68 | *pprev = next; | ||
69 | if (next) | ||
70 | next->private = (unsigned long)pprev; | ||
71 | spin_unlock(&pgd_lock); | ||
72 | } | ||
73 | |||
48 | static inline pgd_t *pgd_alloc(struct mm_struct *mm) | 74 | static inline pgd_t *pgd_alloc(struct mm_struct *mm) |
49 | { | 75 | { |
50 | unsigned boundary; | 76 | unsigned boundary; |
51 | pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT); | 77 | pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT); |
52 | if (!pgd) | 78 | if (!pgd) |
53 | return NULL; | 79 | return NULL; |
80 | pgd_list_add(pgd); | ||
54 | /* | 81 | /* |
55 | * Copy kernel pointers in from init. | 82 | * Copy kernel pointers in from init. |
56 | * Could keep a freelist or slab cache of those because the kernel | 83 | * Could keep a freelist or slab cache of those because the kernel |
@@ -67,6 +94,7 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm) | |||
67 | static inline void pgd_free(pgd_t *pgd) | 94 | static inline void pgd_free(pgd_t *pgd) |
68 | { | 95 | { |
69 | BUG_ON((unsigned long)pgd & (PAGE_SIZE-1)); | 96 | BUG_ON((unsigned long)pgd & (PAGE_SIZE-1)); |
97 | pgd_list_del(pgd); | ||
70 | free_page((unsigned long)pgd); | 98 | free_page((unsigned long)pgd); |
71 | } | 99 | } |
72 | 100 | ||
diff --git a/include/asm-x86_64/pgtable.h b/include/asm-x86_64/pgtable.h index def903287193..31e83c3bd022 100644 --- a/include/asm-x86_64/pgtable.h +++ b/include/asm-x86_64/pgtable.h | |||
@@ -420,6 +420,10 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | |||
420 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) | 420 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) |
421 | #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) | 421 | #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) |
422 | 422 | ||
423 | extern spinlock_t pgd_lock; | ||
424 | extern struct page *pgd_list; | ||
425 | void vmalloc_sync_all(void); | ||
426 | |||
423 | #endif /* !__ASSEMBLY__ */ | 427 | #endif /* !__ASSEMBLY__ */ |
424 | 428 | ||
425 | extern int kern_addr_valid(unsigned long addr); | 429 | extern int kern_addr_valid(unsigned long addr); |
diff --git a/include/asm-x86_64/poll.h b/include/asm-x86_64/poll.h index c43cbba31913..c0475a9d8bb8 100644 --- a/include/asm-x86_64/poll.h +++ b/include/asm-x86_64/poll.h | |||
@@ -16,6 +16,7 @@ | |||
16 | #define POLLWRBAND 0x0200 | 16 | #define POLLWRBAND 0x0200 |
17 | #define POLLMSG 0x0400 | 17 | #define POLLMSG 0x0400 |
18 | #define POLLREMOVE 0x1000 | 18 | #define POLLREMOVE 0x1000 |
19 | #define POLLRDHUP 0x2000 | ||
19 | 20 | ||
20 | struct pollfd { | 21 | struct pollfd { |
21 | int fd; | 22 | int fd; |
diff --git a/include/asm-x86_64/processor.h b/include/asm-x86_64/processor.h index 8c8d88c036ed..37a3ec433ee5 100644 --- a/include/asm-x86_64/processor.h +++ b/include/asm-x86_64/processor.h | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <asm/mmsegment.h> | 20 | #include <asm/mmsegment.h> |
21 | #include <asm/percpu.h> | 21 | #include <asm/percpu.h> |
22 | #include <linux/personality.h> | 22 | #include <linux/personality.h> |
23 | #include <linux/cpumask.h> | ||
23 | 24 | ||
24 | #define TF_MASK 0x00000100 | 25 | #define TF_MASK 0x00000100 |
25 | #define IF_MASK 0x00000200 | 26 | #define IF_MASK 0x00000200 |
@@ -65,6 +66,9 @@ struct cpuinfo_x86 { | |||
65 | __u32 x86_power; | 66 | __u32 x86_power; |
66 | __u32 extended_cpuid_level; /* Max extended CPUID function supported */ | 67 | __u32 extended_cpuid_level; /* Max extended CPUID function supported */ |
67 | unsigned long loops_per_jiffy; | 68 | unsigned long loops_per_jiffy; |
69 | #ifdef CONFIG_SMP | ||
70 | cpumask_t llc_shared_map; /* cpus sharing the last level cache */ | ||
71 | #endif | ||
68 | __u8 apicid; | 72 | __u8 apicid; |
69 | __u8 booted_cores; /* number of cores as seen by OS */ | 73 | __u8 booted_cores; /* number of cores as seen by OS */ |
70 | } ____cacheline_aligned; | 74 | } ____cacheline_aligned; |
@@ -354,9 +358,6 @@ struct extended_sigtable { | |||
354 | struct extended_signature sigs[0]; | 358 | struct extended_signature sigs[0]; |
355 | }; | 359 | }; |
356 | 360 | ||
357 | /* '6' because it used to be for P6 only (but now covers Pentium 4 as well) */ | ||
358 | #define MICROCODE_IOCFREE _IO('6',0) | ||
359 | |||
360 | 361 | ||
361 | #define ASM_NOP1 K8_NOP1 | 362 | #define ASM_NOP1 K8_NOP1 |
362 | #define ASM_NOP2 K8_NOP2 | 363 | #define ASM_NOP2 K8_NOP2 |
diff --git a/include/asm-x86_64/proto.h b/include/asm-x86_64/proto.h index 3ba8fd45fcb3..8abf2a43c944 100644 --- a/include/asm-x86_64/proto.h +++ b/include/asm-x86_64/proto.h | |||
@@ -53,8 +53,6 @@ extern int sysctl_vsyscall; | |||
53 | extern int nohpet; | 53 | extern int nohpet; |
54 | extern unsigned long vxtime_hz; | 54 | extern unsigned long vxtime_hz; |
55 | 55 | ||
56 | extern void do_softirq_thunk(void); | ||
57 | |||
58 | extern int numa_setup(char *opt); | 56 | extern int numa_setup(char *opt); |
59 | 57 | ||
60 | extern int setup_early_printk(char *); | 58 | extern int setup_early_printk(char *); |
@@ -129,7 +127,6 @@ extern int fix_aperture; | |||
129 | #define iommu_aperture 0 | 127 | #define iommu_aperture 0 |
130 | #define iommu_aperture_allowed 0 | 128 | #define iommu_aperture_allowed 0 |
131 | #endif | 129 | #endif |
132 | extern int force_iommu; | ||
133 | 130 | ||
134 | extern int reboot_force; | 131 | extern int reboot_force; |
135 | extern int notsc_setup(char *); | 132 | extern int notsc_setup(char *); |
diff --git a/include/asm-x86_64/smp.h b/include/asm-x86_64/smp.h index 9ccbb2cfd5c0..a4fdaeb5c397 100644 --- a/include/asm-x86_64/smp.h +++ b/include/asm-x86_64/smp.h | |||
@@ -56,6 +56,7 @@ extern cpumask_t cpu_sibling_map[NR_CPUS]; | |||
56 | extern cpumask_t cpu_core_map[NR_CPUS]; | 56 | extern cpumask_t cpu_core_map[NR_CPUS]; |
57 | extern u8 phys_proc_id[NR_CPUS]; | 57 | extern u8 phys_proc_id[NR_CPUS]; |
58 | extern u8 cpu_core_id[NR_CPUS]; | 58 | extern u8 cpu_core_id[NR_CPUS]; |
59 | extern u8 cpu_llc_id[NR_CPUS]; | ||
59 | 60 | ||
60 | #define SMP_TRAMPOLINE_BASE 0x6000 | 61 | #define SMP_TRAMPOLINE_BASE 0x6000 |
61 | 62 | ||
diff --git a/include/asm-x86_64/string.h b/include/asm-x86_64/string.h index a3493ee282bb..ee6bf275349e 100644 --- a/include/asm-x86_64/string.h +++ b/include/asm-x86_64/string.h | |||
@@ -40,26 +40,15 @@ extern void *__memcpy(void *to, const void *from, size_t len); | |||
40 | 40 | ||
41 | 41 | ||
42 | #define __HAVE_ARCH_MEMSET | 42 | #define __HAVE_ARCH_MEMSET |
43 | #define memset __builtin_memset | 43 | void *memset(void *s, int c, size_t n); |
44 | 44 | ||
45 | #define __HAVE_ARCH_MEMMOVE | 45 | #define __HAVE_ARCH_MEMMOVE |
46 | void * memmove(void * dest,const void *src,size_t count); | 46 | void * memmove(void * dest,const void *src,size_t count); |
47 | 47 | ||
48 | /* Use C out of line version for memcmp */ | ||
49 | #define memcmp __builtin_memcmp | ||
50 | int memcmp(const void * cs,const void * ct,size_t count); | 48 | int memcmp(const void * cs,const void * ct,size_t count); |
51 | |||
52 | /* out of line string functions use always C versions */ | ||
53 | #define strlen __builtin_strlen | ||
54 | size_t strlen(const char * s); | 49 | size_t strlen(const char * s); |
55 | 50 | char *strcpy(char * dest,const char *src); | |
56 | #define strcpy __builtin_strcpy | 51 | char *strcat(char * dest, const char * src); |
57 | char * strcpy(char * dest,const char *src); | ||
58 | |||
59 | #define strcat __builtin_strcat | ||
60 | char * strcat(char * dest, const char * src); | ||
61 | |||
62 | #define strcmp __builtin_strcmp | ||
63 | int strcmp(const char * cs,const char * ct); | 52 | int strcmp(const char * cs,const char * ct); |
64 | 53 | ||
65 | #endif /* __KERNEL__ */ | 54 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-x86_64/suspend.h b/include/asm-x86_64/suspend.h index bb9f40597d09..bc7f81715e5e 100644 --- a/include/asm-x86_64/suspend.h +++ b/include/asm-x86_64/suspend.h | |||
@@ -39,9 +39,7 @@ extern unsigned long saved_context_r12, saved_context_r13, saved_context_r14, sa | |||
39 | extern unsigned long saved_context_eflags; | 39 | extern unsigned long saved_context_eflags; |
40 | 40 | ||
41 | #define loaddebug(thread,register) \ | 41 | #define loaddebug(thread,register) \ |
42 | __asm__("movq %0,%%db" #register \ | 42 | set_debugreg((thread)->debugreg##register, register) |
43 | : /* no output */ \ | ||
44 | :"r" ((thread)->debugreg##register)) | ||
45 | 43 | ||
46 | extern void fix_processor_context(void); | 44 | extern void fix_processor_context(void); |
47 | 45 | ||
diff --git a/include/asm-x86_64/system.h b/include/asm-x86_64/system.h index b7f66034ae7a..397598980228 100644 --- a/include/asm-x86_64/system.h +++ b/include/asm-x86_64/system.h | |||
@@ -70,12 +70,6 @@ extern void load_gs_index(unsigned); | |||
70 | ".previous" \ | 70 | ".previous" \ |
71 | : :"r" (value), "r" (0)) | 71 | : :"r" (value), "r" (0)) |
72 | 72 | ||
73 | #define set_debug(value,register) \ | ||
74 | __asm__("movq %0,%%db" #register \ | ||
75 | : /* no output */ \ | ||
76 | :"r" ((unsigned long) value)) | ||
77 | |||
78 | |||
79 | #ifdef __KERNEL__ | 73 | #ifdef __KERNEL__ |
80 | struct alt_instr { | 74 | struct alt_instr { |
81 | __u8 *instr; /* original instruction */ | 75 | __u8 *instr; /* original instruction */ |
diff --git a/include/asm-x86_64/topology.h b/include/asm-x86_64/topology.h index c642f5d9882d..9db54e9d17bb 100644 --- a/include/asm-x86_64/topology.h +++ b/include/asm-x86_64/topology.h | |||
@@ -68,4 +68,6 @@ extern int __node_distance(int, int); | |||
68 | 68 | ||
69 | #include <asm-generic/topology.h> | 69 | #include <asm-generic/topology.h> |
70 | 70 | ||
71 | extern cpumask_t cpu_coregroup_map(int cpu); | ||
72 | |||
71 | #endif | 73 | #endif |
diff --git a/include/asm-x86_64/unistd.h b/include/asm-x86_64/unistd.h index da0341c57949..fcc516353087 100644 --- a/include/asm-x86_64/unistd.h +++ b/include/asm-x86_64/unistd.h | |||
@@ -605,8 +605,12 @@ __SYSCALL(__NR_pselect6, sys_ni_syscall) /* for now */ | |||
605 | __SYSCALL(__NR_ppoll, sys_ni_syscall) /* for now */ | 605 | __SYSCALL(__NR_ppoll, sys_ni_syscall) /* for now */ |
606 | #define __NR_unshare 272 | 606 | #define __NR_unshare 272 |
607 | __SYSCALL(__NR_unshare, sys_unshare) | 607 | __SYSCALL(__NR_unshare, sys_unshare) |
608 | #define __NR_set_robust_list 273 | ||
609 | __SYSCALL(__NR_set_robust_list, sys_set_robust_list) | ||
610 | #define __NR_get_robust_list 274 | ||
611 | __SYSCALL(__NR_get_robust_list, sys_get_robust_list) | ||
608 | 612 | ||
609 | #define __NR_syscall_max __NR_unshare | 613 | #define __NR_syscall_max __NR_get_robust_list |
610 | 614 | ||
611 | #ifndef __NO_STUBS | 615 | #ifndef __NO_STUBS |
612 | 616 | ||
diff --git a/include/asm-xtensa/bitops.h b/include/asm-xtensa/bitops.h index 0a2065f1a372..d815649617aa 100644 --- a/include/asm-xtensa/bitops.h +++ b/include/asm-xtensa/bitops.h | |||
@@ -23,156 +23,11 @@ | |||
23 | # error SMP not supported on this architecture | 23 | # error SMP not supported on this architecture |
24 | #endif | 24 | #endif |
25 | 25 | ||
26 | static __inline__ void set_bit(int nr, volatile void * addr) | ||
27 | { | ||
28 | unsigned long mask = 1 << (nr & 0x1f); | ||
29 | unsigned long *a = ((unsigned long *)addr) + (nr >> 5); | ||
30 | unsigned long flags; | ||
31 | |||
32 | local_irq_save(flags); | ||
33 | *a |= mask; | ||
34 | local_irq_restore(flags); | ||
35 | } | ||
36 | |||
37 | static __inline__ void __set_bit(int nr, volatile unsigned long * addr) | ||
38 | { | ||
39 | unsigned long mask = 1 << (nr & 0x1f); | ||
40 | unsigned long *a = ((unsigned long *)addr) + (nr >> 5); | ||
41 | |||
42 | *a |= mask; | ||
43 | } | ||
44 | |||
45 | static __inline__ void clear_bit(int nr, volatile void * addr) | ||
46 | { | ||
47 | unsigned long mask = 1 << (nr & 0x1f); | ||
48 | unsigned long *a = ((unsigned long *)addr) + (nr >> 5); | ||
49 | unsigned long flags; | ||
50 | |||
51 | local_irq_save(flags); | ||
52 | *a &= ~mask; | ||
53 | local_irq_restore(flags); | ||
54 | } | ||
55 | |||
56 | static __inline__ void __clear_bit(int nr, volatile unsigned long *addr) | ||
57 | { | ||
58 | unsigned long mask = 1 << (nr & 0x1f); | ||
59 | unsigned long *a = ((unsigned long *)addr) + (nr >> 5); | ||
60 | |||
61 | *a &= ~mask; | ||
62 | } | ||
63 | |||
64 | /* | ||
65 | * clear_bit() doesn't provide any barrier for the compiler. | ||
66 | */ | ||
67 | |||
68 | #define smp_mb__before_clear_bit() barrier() | 26 | #define smp_mb__before_clear_bit() barrier() |
69 | #define smp_mb__after_clear_bit() barrier() | 27 | #define smp_mb__after_clear_bit() barrier() |
70 | 28 | ||
71 | static __inline__ void change_bit(int nr, volatile void * addr) | 29 | #include <asm-generic/bitops/atomic.h> |
72 | { | 30 | #include <asm-generic/bitops/non-atomic.h> |
73 | unsigned long mask = 1 << (nr & 0x1f); | ||
74 | unsigned long *a = ((unsigned long *)addr) + (nr >> 5); | ||
75 | unsigned long flags; | ||
76 | |||
77 | local_irq_save(flags); | ||
78 | *a ^= mask; | ||
79 | local_irq_restore(flags); | ||
80 | } | ||
81 | |||
82 | static __inline__ void __change_bit(int nr, volatile void * addr) | ||
83 | { | ||
84 | unsigned long mask = 1 << (nr & 0x1f); | ||
85 | unsigned long *a = ((unsigned long *)addr) + (nr >> 5); | ||
86 | |||
87 | *a ^= mask; | ||
88 | } | ||
89 | |||
90 | static __inline__ int test_and_set_bit(int nr, volatile void * addr) | ||
91 | { | ||
92 | unsigned long retval; | ||
93 | unsigned long mask = 1 << (nr & 0x1f); | ||
94 | unsigned long *a = ((unsigned long *)addr) + (nr >> 5); | ||
95 | unsigned long flags; | ||
96 | |||
97 | local_irq_save(flags); | ||
98 | retval = (mask & *a) != 0; | ||
99 | *a |= mask; | ||
100 | local_irq_restore(flags); | ||
101 | |||
102 | return retval; | ||
103 | } | ||
104 | |||
105 | static __inline__ int __test_and_set_bit(int nr, volatile void * addr) | ||
106 | { | ||
107 | unsigned long retval; | ||
108 | unsigned long mask = 1 << (nr & 0x1f); | ||
109 | unsigned long *a = ((unsigned long *)addr) + (nr >> 5); | ||
110 | |||
111 | retval = (mask & *a) != 0; | ||
112 | *a |= mask; | ||
113 | |||
114 | return retval; | ||
115 | } | ||
116 | |||
117 | static __inline__ int test_and_clear_bit(int nr, volatile void * addr) | ||
118 | { | ||
119 | unsigned long retval; | ||
120 | unsigned long mask = 1 << (nr & 0x1f); | ||
121 | unsigned long *a = ((unsigned long *)addr) + (nr >> 5); | ||
122 | unsigned long flags; | ||
123 | |||
124 | local_irq_save(flags); | ||
125 | retval = (mask & *a) != 0; | ||
126 | *a &= ~mask; | ||
127 | local_irq_restore(flags); | ||
128 | |||
129 | return retval; | ||
130 | } | ||
131 | |||
132 | static __inline__ int __test_and_clear_bit(int nr, volatile void * addr) | ||
133 | { | ||
134 | unsigned long mask = 1 << (nr & 0x1f); | ||
135 | unsigned long *a = ((unsigned long *)addr) + (nr >> 5); | ||
136 | unsigned long old = *a; | ||
137 | |||
138 | *a = old & ~mask; | ||
139 | return (old & mask) != 0; | ||
140 | } | ||
141 | |||
142 | static __inline__ int test_and_change_bit(int nr, volatile void * addr) | ||
143 | { | ||
144 | unsigned long retval; | ||
145 | unsigned long mask = 1 << (nr & 0x1f); | ||
146 | unsigned long *a = ((unsigned long *)addr) + (nr >> 5); | ||
147 | unsigned long flags; | ||
148 | |||
149 | local_irq_save(flags); | ||
150 | |||
151 | retval = (mask & *a) != 0; | ||
152 | *a ^= mask; | ||
153 | local_irq_restore(flags); | ||
154 | |||
155 | return retval; | ||
156 | } | ||
157 | |||
158 | /* | ||
159 | * non-atomic version; can be reordered | ||
160 | */ | ||
161 | |||
162 | static __inline__ int __test_and_change_bit(int nr, volatile void *addr) | ||
163 | { | ||
164 | unsigned long mask = 1 << (nr & 0x1f); | ||
165 | unsigned long *a = ((unsigned long *)addr) + (nr >> 5); | ||
166 | unsigned long old = *a; | ||
167 | |||
168 | *a = old ^ mask; | ||
169 | return (old & mask) != 0; | ||
170 | } | ||
171 | |||
172 | static __inline__ int test_bit(int nr, const volatile void *addr) | ||
173 | { | ||
174 | return 1UL & (((const volatile unsigned int *)addr)[nr>>5] >> (nr&31)); | ||
175 | } | ||
176 | 31 | ||
177 | #if XCHAL_HAVE_NSA | 32 | #if XCHAL_HAVE_NSA |
178 | 33 | ||
@@ -245,202 +100,23 @@ static __inline__ int fls (unsigned int x) | |||
245 | { | 100 | { |
246 | return __cntlz(x); | 101 | return __cntlz(x); |
247 | } | 102 | } |
248 | #define fls64(x) generic_fls64(x) | 103 | #include <asm-generic/bitops/fls64.h> |
249 | 104 | #include <asm-generic/bitops/find.h> | |
250 | static __inline__ int | 105 | #include <asm-generic/bitops/ext2-non-atomic.h> |
251 | find_next_bit(const unsigned long *addr, int size, int offset) | ||
252 | { | ||
253 | const unsigned long *p = addr + (offset >> 5); | ||
254 | unsigned long result = offset & ~31UL; | ||
255 | unsigned long tmp; | ||
256 | |||
257 | if (offset >= size) | ||
258 | return size; | ||
259 | size -= result; | ||
260 | offset &= 31UL; | ||
261 | if (offset) { | ||
262 | tmp = *p++; | ||
263 | tmp &= ~0UL << offset; | ||
264 | if (size < 32) | ||
265 | goto found_first; | ||
266 | if (tmp) | ||
267 | goto found_middle; | ||
268 | size -= 32; | ||
269 | result += 32; | ||
270 | } | ||
271 | while (size >= 32) { | ||
272 | if ((tmp = *p++) != 0) | ||
273 | goto found_middle; | ||
274 | result += 32; | ||
275 | size -= 32; | ||
276 | } | ||
277 | if (!size) | ||
278 | return result; | ||
279 | tmp = *p; | ||
280 | |||
281 | found_first: | ||
282 | tmp &= ~0UL >> (32 - size); | ||
283 | if (tmp == 0UL) /* Are any bits set? */ | ||
284 | return result + size; /* Nope. */ | ||
285 | found_middle: | ||
286 | return result + __ffs(tmp); | ||
287 | } | ||
288 | |||
289 | /** | ||
290 | * find_first_bit - find the first set bit in a memory region | ||
291 | * @addr: The address to start the search at | ||
292 | * @size: The maximum size to search | ||
293 | * | ||
294 | * Returns the bit-number of the first set bit, not the number of the byte | ||
295 | * containing a bit. | ||
296 | */ | ||
297 | |||
298 | #define find_first_bit(addr, size) \ | ||
299 | find_next_bit((addr), (size), 0) | ||
300 | |||
301 | static __inline__ int | ||
302 | find_next_zero_bit(const unsigned long *addr, int size, int offset) | ||
303 | { | ||
304 | const unsigned long *p = addr + (offset >> 5); | ||
305 | unsigned long result = offset & ~31UL; | ||
306 | unsigned long tmp; | ||
307 | |||
308 | if (offset >= size) | ||
309 | return size; | ||
310 | size -= result; | ||
311 | offset &= 31UL; | ||
312 | if (offset) { | ||
313 | tmp = *p++; | ||
314 | tmp |= ~0UL >> (32-offset); | ||
315 | if (size < 32) | ||
316 | goto found_first; | ||
317 | if (~tmp) | ||
318 | goto found_middle; | ||
319 | size -= 32; | ||
320 | result += 32; | ||
321 | } | ||
322 | while (size & ~31UL) { | ||
323 | if (~(tmp = *p++)) | ||
324 | goto found_middle; | ||
325 | result += 32; | ||
326 | size -= 32; | ||
327 | } | ||
328 | if (!size) | ||
329 | return result; | ||
330 | tmp = *p; | ||
331 | |||
332 | found_first: | ||
333 | tmp |= ~0UL << size; | ||
334 | found_middle: | ||
335 | return result + ffz(tmp); | ||
336 | } | ||
337 | |||
338 | #define find_first_zero_bit(addr, size) \ | ||
339 | find_next_zero_bit((addr), (size), 0) | ||
340 | 106 | ||
341 | #ifdef __XTENSA_EL__ | 107 | #ifdef __XTENSA_EL__ |
342 | # define ext2_set_bit(nr,addr) __test_and_set_bit((nr), (addr)) | ||
343 | # define ext2_set_bit_atomic(lock,nr,addr) test_and_set_bit((nr),(addr)) | 108 | # define ext2_set_bit_atomic(lock,nr,addr) test_and_set_bit((nr),(addr)) |
344 | # define ext2_clear_bit(nr,addr) __test_and_clear_bit((nr), (addr)) | ||
345 | # define ext2_clear_bit_atomic(lock,nr,addr) test_and_clear_bit((nr),(addr)) | 109 | # define ext2_clear_bit_atomic(lock,nr,addr) test_and_clear_bit((nr),(addr)) |
346 | # define ext2_test_bit(nr,addr) test_bit((nr), (addr)) | ||
347 | # define ext2_find_first_zero_bit(addr, size) find_first_zero_bit((addr),(size)) | ||
348 | # define ext2_find_next_zero_bit(addr, size, offset) \ | ||
349 | find_next_zero_bit((addr), (size), (offset)) | ||
350 | #elif defined(__XTENSA_EB__) | 110 | #elif defined(__XTENSA_EB__) |
351 | # define ext2_set_bit(nr,addr) __test_and_set_bit((nr) ^ 0x18, (addr)) | ||
352 | # define ext2_set_bit_atomic(lock,nr,addr) test_and_set_bit((nr) ^ 0x18, (addr)) | 111 | # define ext2_set_bit_atomic(lock,nr,addr) test_and_set_bit((nr) ^ 0x18, (addr)) |
353 | # define ext2_clear_bit(nr,addr) __test_and_clear_bit((nr) ^ 18, (addr)) | ||
354 | # define ext2_clear_bit_atomic(lock,nr,addr) test_and_clear_bit((nr)^0x18,(addr)) | 112 | # define ext2_clear_bit_atomic(lock,nr,addr) test_and_clear_bit((nr)^0x18,(addr)) |
355 | # define ext2_test_bit(nr,addr) test_bit((nr) ^ 0x18, (addr)) | ||
356 | # define ext2_find_first_zero_bit(addr, size) \ | ||
357 | ext2_find_next_zero_bit((addr), (size), 0) | ||
358 | |||
359 | static __inline__ unsigned long ext2_find_next_zero_bit(void *addr, unsigned long size, unsigned long offset) | ||
360 | { | ||
361 | unsigned long *p = ((unsigned long *) addr) + (offset >> 5); | ||
362 | unsigned long result = offset & ~31UL; | ||
363 | unsigned long tmp; | ||
364 | |||
365 | if (offset >= size) | ||
366 | return size; | ||
367 | size -= result; | ||
368 | offset &= 31UL; | ||
369 | if(offset) { | ||
370 | /* We hold the little endian value in tmp, but then the | ||
371 | * shift is illegal. So we could keep a big endian value | ||
372 | * in tmp, like this: | ||
373 | * | ||
374 | * tmp = __swab32(*(p++)); | ||
375 | * tmp |= ~0UL >> (32-offset); | ||
376 | * | ||
377 | * but this would decrease preformance, so we change the | ||
378 | * shift: | ||
379 | */ | ||
380 | tmp = *(p++); | ||
381 | tmp |= __swab32(~0UL >> (32-offset)); | ||
382 | if(size < 32) | ||
383 | goto found_first; | ||
384 | if(~tmp) | ||
385 | goto found_middle; | ||
386 | size -= 32; | ||
387 | result += 32; | ||
388 | } | ||
389 | while(size & ~31UL) { | ||
390 | if(~(tmp = *(p++))) | ||
391 | goto found_middle; | ||
392 | result += 32; | ||
393 | size -= 32; | ||
394 | } | ||
395 | if(!size) | ||
396 | return result; | ||
397 | tmp = *p; | ||
398 | |||
399 | found_first: | ||
400 | /* tmp is little endian, so we would have to swab the shift, | ||
401 | * see above. But then we have to swab tmp below for ffz, so | ||
402 | * we might as well do this here. | ||
403 | */ | ||
404 | return result + ffz(__swab32(tmp) | (~0UL << size)); | ||
405 | found_middle: | ||
406 | return result + ffz(__swab32(tmp)); | ||
407 | } | ||
408 | |||
409 | #else | 113 | #else |
410 | # error processor byte order undefined! | 114 | # error processor byte order undefined! |
411 | #endif | 115 | #endif |
412 | 116 | ||
413 | 117 | #include <asm-generic/bitops/hweight.h> | |
414 | #define hweight32(x) generic_hweight32(x) | 118 | #include <asm-generic/bitops/sched.h> |
415 | #define hweight16(x) generic_hweight16(x) | 119 | #include <asm-generic/bitops/minix.h> |
416 | #define hweight8(x) generic_hweight8(x) | ||
417 | |||
418 | /* | ||
419 | * Find the first bit set in a 140-bit bitmap. | ||
420 | * The first 100 bits are unlikely to be set. | ||
421 | */ | ||
422 | |||
423 | static inline int sched_find_first_bit(const unsigned long *b) | ||
424 | { | ||
425 | if (unlikely(b[0])) | ||
426 | return __ffs(b[0]); | ||
427 | if (unlikely(b[1])) | ||
428 | return __ffs(b[1]) + 32; | ||
429 | if (unlikely(b[2])) | ||
430 | return __ffs(b[2]) + 64; | ||
431 | if (b[3]) | ||
432 | return __ffs(b[3]) + 96; | ||
433 | return __ffs(b[4]) + 128; | ||
434 | } | ||
435 | |||
436 | |||
437 | /* Bitmap functions for the minix filesystem. */ | ||
438 | |||
439 | #define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr) | ||
440 | #define minix_set_bit(nr,addr) set_bit(nr,addr) | ||
441 | #define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr) | ||
442 | #define minix_test_bit(nr,addr) test_bit(nr,addr) | ||
443 | #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) | ||
444 | 120 | ||
445 | #endif /* __KERNEL__ */ | 121 | #endif /* __KERNEL__ */ |
446 | 122 | ||
diff --git a/include/asm-xtensa/page.h b/include/asm-xtensa/page.h index 8ded36f255a2..992bac5c1258 100644 --- a/include/asm-xtensa/page.h +++ b/include/asm-xtensa/page.h | |||
@@ -109,10 +109,7 @@ void copy_user_page(void *to,void* from,unsigned long vaddr,struct page* page); | |||
109 | #define __pa(x) ((unsigned long) (x) - PAGE_OFFSET) | 109 | #define __pa(x) ((unsigned long) (x) - PAGE_OFFSET) |
110 | #define __va(x) ((void *)((unsigned long) (x) + PAGE_OFFSET)) | 110 | #define __va(x) ((void *)((unsigned long) (x) + PAGE_OFFSET)) |
111 | #define pfn_valid(pfn) ((unsigned long)pfn < max_mapnr) | 111 | #define pfn_valid(pfn) ((unsigned long)pfn < max_mapnr) |
112 | #ifndef CONFIG_DISCONTIGMEM | 112 | #ifdef CONFIG_DISCONTIGMEM |
113 | # define pfn_to_page(pfn) (mem_map + (pfn)) | ||
114 | # define page_to_pfn(page) ((unsigned long)((page) - mem_map)) | ||
115 | #else | ||
116 | # error CONFIG_DISCONTIGMEM not supported | 113 | # error CONFIG_DISCONTIGMEM not supported |
117 | #endif | 114 | #endif |
118 | 115 | ||
@@ -130,4 +127,5 @@ void copy_user_page(void *to,void* from,unsigned long vaddr,struct page* page); | |||
130 | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) | 127 | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) |
131 | 128 | ||
132 | #endif /* __KERNEL__ */ | 129 | #endif /* __KERNEL__ */ |
130 | #include <asm-generic/memory_model.h> | ||
133 | #endif /* _XTENSA_PAGE_H */ | 131 | #endif /* _XTENSA_PAGE_H */ |
diff --git a/include/asm-xtensa/poll.h b/include/asm-xtensa/poll.h index dffe447534e0..6fd94773e866 100644 --- a/include/asm-xtensa/poll.h +++ b/include/asm-xtensa/poll.h | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | #define POLLMSG 0x0400 | 28 | #define POLLMSG 0x0400 |
29 | #define POLLREMOVE 0x0800 | 29 | #define POLLREMOVE 0x0800 |
30 | #define POLLRDHUP 0x2000 | ||
30 | 31 | ||
31 | struct pollfd { | 32 | struct pollfd { |
32 | int fd; | 33 | int fd; |
diff --git a/include/linux/adb.h b/include/linux/adb.h index e9fdc63483c7..b7305b178279 100644 --- a/include/linux/adb.h +++ b/include/linux/adb.h | |||
@@ -85,7 +85,7 @@ enum adb_message { | |||
85 | ADB_MSG_POST_RESET /* Called after resetting the bus (re-do init & register) */ | 85 | ADB_MSG_POST_RESET /* Called after resetting the bus (re-do init & register) */ |
86 | }; | 86 | }; |
87 | extern struct adb_driver *adb_controller; | 87 | extern struct adb_driver *adb_controller; |
88 | extern struct notifier_block *adb_client_list; | 88 | extern struct blocking_notifier_head adb_client_list; |
89 | 89 | ||
90 | int adb_request(struct adb_request *req, void (*done)(struct adb_request *), | 90 | int adb_request(struct adb_request *req, void (*done)(struct adb_request *), |
91 | int flags, int nbytes, ...); | 91 | int flags, int nbytes, ...); |
diff --git a/include/linux/amba/serial.h b/include/linux/amba/serial.h index dc726ffccebd..48ee32a18ac5 100644 --- a/include/linux/amba/serial.h +++ b/include/linux/amba/serial.h | |||
@@ -158,4 +158,10 @@ | |||
158 | #define UART01x_RSR_ANY (UART01x_RSR_OE|UART01x_RSR_BE|UART01x_RSR_PE|UART01x_RSR_FE) | 158 | #define UART01x_RSR_ANY (UART01x_RSR_OE|UART01x_RSR_BE|UART01x_RSR_PE|UART01x_RSR_FE) |
159 | #define UART01x_FR_MODEM_ANY (UART01x_FR_DCD|UART01x_FR_DSR|UART01x_FR_CTS) | 159 | #define UART01x_FR_MODEM_ANY (UART01x_FR_DCD|UART01x_FR_DSR|UART01x_FR_CTS) |
160 | 160 | ||
161 | #ifndef __ASSEMBLY__ | ||
162 | struct amba_pl010_data { | ||
163 | void (*set_mctrl)(struct amba_device *dev, void __iomem *base, unsigned int mctrl); | ||
164 | }; | ||
165 | #endif | ||
166 | |||
161 | #endif | 167 | #endif |
diff --git a/include/linux/audit.h b/include/linux/audit.h index da3c01955f3d..1c47c59058c1 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h | |||
@@ -33,27 +33,42 @@ | |||
33 | * 1200 - 1299 messages internal to the audit daemon | 33 | * 1200 - 1299 messages internal to the audit daemon |
34 | * 1300 - 1399 audit event messages | 34 | * 1300 - 1399 audit event messages |
35 | * 1400 - 1499 SE Linux use | 35 | * 1400 - 1499 SE Linux use |
36 | * 1500 - 1999 future use | 36 | * 1500 - 1599 kernel LSPP events |
37 | * 2000 is for otherwise unclassified kernel audit messages | 37 | * 1600 - 1699 kernel crypto events |
38 | * 1700 - 1799 kernel anomaly records | ||
39 | * 1800 - 1999 future kernel use (maybe integrity labels and related events) | ||
40 | * 2000 is for otherwise unclassified kernel audit messages (legacy) | ||
41 | * 2001 - 2099 unused (kernel) | ||
42 | * 2100 - 2199 user space anomaly records | ||
43 | * 2200 - 2299 user space actions taken in response to anomalies | ||
44 | * 2300 - 2399 user space generated LSPP events | ||
45 | * 2400 - 2499 user space crypto events | ||
46 | * 2500 - 2999 future user space (maybe integrity labels and related events) | ||
38 | * | 47 | * |
39 | * Messages from 1000-1199 are bi-directional. 1200-1299 are exclusively user | 48 | * Messages from 1000-1199 are bi-directional. 1200-1299 & 2100 - 2999 are |
40 | * space. Anything over that is kernel --> user space communication. | 49 | * exclusively user space. 1300-2099 is kernel --> user space |
50 | * communication. | ||
41 | */ | 51 | */ |
42 | #define AUDIT_GET 1000 /* Get status */ | 52 | #define AUDIT_GET 1000 /* Get status */ |
43 | #define AUDIT_SET 1001 /* Set status (enable/disable/auditd) */ | 53 | #define AUDIT_SET 1001 /* Set status (enable/disable/auditd) */ |
44 | #define AUDIT_LIST 1002 /* List syscall filtering rules */ | 54 | #define AUDIT_LIST 1002 /* List syscall rules -- deprecated */ |
45 | #define AUDIT_ADD 1003 /* Add syscall filtering rule */ | 55 | #define AUDIT_ADD 1003 /* Add syscall rule -- deprecated */ |
46 | #define AUDIT_DEL 1004 /* Delete syscall filtering rule */ | 56 | #define AUDIT_DEL 1004 /* Delete syscall rule -- deprecated */ |
47 | #define AUDIT_USER 1005 /* Message from userspace -- deprecated */ | 57 | #define AUDIT_USER 1005 /* Message from userspace -- deprecated */ |
48 | #define AUDIT_LOGIN 1006 /* Define the login id and information */ | 58 | #define AUDIT_LOGIN 1006 /* Define the login id and information */ |
49 | #define AUDIT_WATCH_INS 1007 /* Insert file/dir watch entry */ | 59 | #define AUDIT_WATCH_INS 1007 /* Insert file/dir watch entry */ |
50 | #define AUDIT_WATCH_REM 1008 /* Remove file/dir watch entry */ | 60 | #define AUDIT_WATCH_REM 1008 /* Remove file/dir watch entry */ |
51 | #define AUDIT_WATCH_LIST 1009 /* List all file/dir watches */ | 61 | #define AUDIT_WATCH_LIST 1009 /* List all file/dir watches */ |
52 | #define AUDIT_SIGNAL_INFO 1010 /* Get info about sender of signal to auditd */ | 62 | #define AUDIT_SIGNAL_INFO 1010 /* Get info about sender of signal to auditd */ |
63 | #define AUDIT_ADD_RULE 1011 /* Add syscall filtering rule */ | ||
64 | #define AUDIT_DEL_RULE 1012 /* Delete syscall filtering rule */ | ||
65 | #define AUDIT_LIST_RULES 1013 /* List syscall filtering rules */ | ||
53 | 66 | ||
54 | #define AUDIT_FIRST_USER_MSG 1100 /* Userspace messages mostly uninteresting to kernel */ | 67 | #define AUDIT_FIRST_USER_MSG 1100 /* Userspace messages mostly uninteresting to kernel */ |
55 | #define AUDIT_USER_AVC 1107 /* We filter this differently */ | 68 | #define AUDIT_USER_AVC 1107 /* We filter this differently */ |
56 | #define AUDIT_LAST_USER_MSG 1199 | 69 | #define AUDIT_LAST_USER_MSG 1199 |
70 | #define AUDIT_FIRST_USER_MSG2 2100 /* More user space messages */ | ||
71 | #define AUDIT_LAST_USER_MSG2 2999 | ||
57 | 72 | ||
58 | #define AUDIT_DAEMON_START 1200 /* Daemon startup record */ | 73 | #define AUDIT_DAEMON_START 1200 /* Daemon startup record */ |
59 | #define AUDIT_DAEMON_END 1201 /* Daemon normal stop record */ | 74 | #define AUDIT_DAEMON_END 1201 /* Daemon normal stop record */ |
@@ -72,6 +87,13 @@ | |||
72 | #define AUDIT_AVC 1400 /* SE Linux avc denial or grant */ | 87 | #define AUDIT_AVC 1400 /* SE Linux avc denial or grant */ |
73 | #define AUDIT_SELINUX_ERR 1401 /* Internal SE Linux Errors */ | 88 | #define AUDIT_SELINUX_ERR 1401 /* Internal SE Linux Errors */ |
74 | #define AUDIT_AVC_PATH 1402 /* dentry, vfsmount pair from avc */ | 89 | #define AUDIT_AVC_PATH 1402 /* dentry, vfsmount pair from avc */ |
90 | #define AUDIT_MAC_POLICY_LOAD 1403 /* Policy file load */ | ||
91 | #define AUDIT_MAC_STATUS 1404 /* Changed enforcing,permissive,off */ | ||
92 | #define AUDIT_MAC_CONFIG_CHANGE 1405 /* Changes to booleans */ | ||
93 | |||
94 | #define AUDIT_FIRST_KERN_ANOM_MSG 1700 | ||
95 | #define AUDIT_LAST_KERN_ANOM_MSG 1799 | ||
96 | #define AUDIT_ANOM_PROMISCUOUS 1700 /* Device changed promiscuous mode */ | ||
75 | 97 | ||
76 | #define AUDIT_KERNEL 2000 /* Asynchronous audit record. NOT A REQUEST. */ | 98 | #define AUDIT_KERNEL 2000 /* Asynchronous audit record. NOT A REQUEST. */ |
77 | 99 | ||
@@ -81,8 +103,9 @@ | |||
81 | #define AUDIT_FILTER_ENTRY 0x02 /* Apply rule at syscall entry */ | 103 | #define AUDIT_FILTER_ENTRY 0x02 /* Apply rule at syscall entry */ |
82 | #define AUDIT_FILTER_WATCH 0x03 /* Apply rule to file system watches */ | 104 | #define AUDIT_FILTER_WATCH 0x03 /* Apply rule to file system watches */ |
83 | #define AUDIT_FILTER_EXIT 0x04 /* Apply rule at syscall exit */ | 105 | #define AUDIT_FILTER_EXIT 0x04 /* Apply rule at syscall exit */ |
106 | #define AUDIT_FILTER_TYPE 0x05 /* Apply rule at audit_log_start */ | ||
84 | 107 | ||
85 | #define AUDIT_NR_FILTERS 5 | 108 | #define AUDIT_NR_FILTERS 6 |
86 | 109 | ||
87 | #define AUDIT_FILTER_PREPEND 0x10 /* Prepend to front of list */ | 110 | #define AUDIT_FILTER_PREPEND 0x10 /* Prepend to front of list */ |
88 | 111 | ||
@@ -98,6 +121,13 @@ | |||
98 | #define AUDIT_WORD(nr) ((__u32)((nr)/32)) | 121 | #define AUDIT_WORD(nr) ((__u32)((nr)/32)) |
99 | #define AUDIT_BIT(nr) (1 << ((nr) - AUDIT_WORD(nr)*32)) | 122 | #define AUDIT_BIT(nr) (1 << ((nr) - AUDIT_WORD(nr)*32)) |
100 | 123 | ||
124 | /* This bitmask is used to validate user input. It represents all bits that | ||
125 | * are currently used in an audit field constant understood by the kernel. | ||
126 | * If you are adding a new #define AUDIT_<whatever>, please ensure that | ||
127 | * AUDIT_UNUSED_BITS is updated if need be. */ | ||
128 | #define AUDIT_UNUSED_BITS 0x0FFFFC00 | ||
129 | |||
130 | |||
101 | /* Rule fields */ | 131 | /* Rule fields */ |
102 | /* These are useful when checking the | 132 | /* These are useful when checking the |
103 | * task structure at task creation time | 133 | * task structure at task creation time |
@@ -114,6 +144,7 @@ | |||
114 | #define AUDIT_LOGINUID 9 | 144 | #define AUDIT_LOGINUID 9 |
115 | #define AUDIT_PERS 10 | 145 | #define AUDIT_PERS 10 |
116 | #define AUDIT_ARCH 11 | 146 | #define AUDIT_ARCH 11 |
147 | #define AUDIT_MSGTYPE 12 | ||
117 | 148 | ||
118 | /* These are ONLY useful when checking | 149 | /* These are ONLY useful when checking |
119 | * at syscall exit time (AUDIT_AT_EXIT). */ | 150 | * at syscall exit time (AUDIT_AT_EXIT). */ |
@@ -128,8 +159,28 @@ | |||
128 | #define AUDIT_ARG2 (AUDIT_ARG0+2) | 159 | #define AUDIT_ARG2 (AUDIT_ARG0+2) |
129 | #define AUDIT_ARG3 (AUDIT_ARG0+3) | 160 | #define AUDIT_ARG3 (AUDIT_ARG0+3) |
130 | 161 | ||
131 | #define AUDIT_NEGATE 0x80000000 | 162 | #define AUDIT_NEGATE 0x80000000 |
132 | 163 | ||
164 | /* These are the supported operators. | ||
165 | * 4 2 1 | ||
166 | * = > < | ||
167 | * ------- | ||
168 | * 0 0 0 0 nonsense | ||
169 | * 0 0 1 1 < | ||
170 | * 0 1 0 2 > | ||
171 | * 0 1 1 3 != | ||
172 | * 1 0 0 4 = | ||
173 | * 1 0 1 5 <= | ||
174 | * 1 1 0 6 >= | ||
175 | * 1 1 1 7 all operators | ||
176 | */ | ||
177 | #define AUDIT_LESS_THAN 0x10000000 | ||
178 | #define AUDIT_GREATER_THAN 0x20000000 | ||
179 | #define AUDIT_NOT_EQUAL 0x30000000 | ||
180 | #define AUDIT_EQUAL 0x40000000 | ||
181 | #define AUDIT_LESS_THAN_OR_EQUAL (AUDIT_LESS_THAN|AUDIT_EQUAL) | ||
182 | #define AUDIT_GREATER_THAN_OR_EQUAL (AUDIT_GREATER_THAN|AUDIT_EQUAL) | ||
183 | #define AUDIT_OPERATORS (AUDIT_EQUAL|AUDIT_NOT_EQUAL) | ||
133 | 184 | ||
134 | /* Status symbols */ | 185 | /* Status symbols */ |
135 | /* Mask values */ | 186 | /* Mask values */ |
@@ -186,6 +237,26 @@ struct audit_status { | |||
186 | __u32 backlog; /* messages waiting in queue */ | 237 | __u32 backlog; /* messages waiting in queue */ |
187 | }; | 238 | }; |
188 | 239 | ||
240 | /* audit_rule_data supports filter rules with both integer and string | ||
241 | * fields. It corresponds with AUDIT_ADD_RULE, AUDIT_DEL_RULE and | ||
242 | * AUDIT_LIST_RULES requests. | ||
243 | */ | ||
244 | struct audit_rule_data { | ||
245 | __u32 flags; /* AUDIT_PER_{TASK,CALL}, AUDIT_PREPEND */ | ||
246 | __u32 action; /* AUDIT_NEVER, AUDIT_POSSIBLE, AUDIT_ALWAYS */ | ||
247 | __u32 field_count; | ||
248 | __u32 mask[AUDIT_BITMASK_SIZE]; /* syscall(s) affected */ | ||
249 | __u32 fields[AUDIT_MAX_FIELDS]; | ||
250 | __u32 values[AUDIT_MAX_FIELDS]; | ||
251 | __u32 fieldflags[AUDIT_MAX_FIELDS]; | ||
252 | __u32 buflen; /* total length of string fields */ | ||
253 | char buf[0]; /* string fields buffer */ | ||
254 | }; | ||
255 | |||
256 | /* audit_rule is supported to maintain backward compatibility with | ||
257 | * userspace. It supports integer fields only and corresponds to | ||
258 | * AUDIT_ADD, AUDIT_DEL and AUDIT_LIST requests. | ||
259 | */ | ||
189 | struct audit_rule { /* for AUDIT_LIST, AUDIT_ADD, and AUDIT_DEL */ | 260 | struct audit_rule { /* for AUDIT_LIST, AUDIT_ADD, and AUDIT_DEL */ |
190 | __u32 flags; /* AUDIT_PER_{TASK,CALL}, AUDIT_PREPEND */ | 261 | __u32 flags; /* AUDIT_PER_{TASK,CALL}, AUDIT_PREPEND */ |
191 | __u32 action; /* AUDIT_NEVER, AUDIT_POSSIBLE, AUDIT_ALWAYS */ | 262 | __u32 action; /* AUDIT_NEVER, AUDIT_POSSIBLE, AUDIT_ALWAYS */ |
@@ -222,22 +293,33 @@ extern void audit_syscall_entry(struct task_struct *task, int arch, | |||
222 | extern void audit_syscall_exit(struct task_struct *task, int failed, long return_code); | 293 | extern void audit_syscall_exit(struct task_struct *task, int failed, long return_code); |
223 | extern void audit_getname(const char *name); | 294 | extern void audit_getname(const char *name); |
224 | extern void audit_putname(const char *name); | 295 | extern void audit_putname(const char *name); |
225 | extern void audit_inode(const char *name, const struct inode *inode, unsigned flags); | 296 | extern void __audit_inode(const char *name, const struct inode *inode, unsigned flags); |
297 | extern void __audit_inode_child(const char *dname, const struct inode *inode, | ||
298 | unsigned long pino); | ||
299 | static inline void audit_inode(const char *name, const struct inode *inode, | ||
300 | unsigned flags) { | ||
301 | if (unlikely(current->audit_context)) | ||
302 | __audit_inode(name, inode, flags); | ||
303 | } | ||
304 | static inline void audit_inode_child(const char *dname, | ||
305 | const struct inode *inode, | ||
306 | unsigned long pino) { | ||
307 | if (unlikely(current->audit_context)) | ||
308 | __audit_inode_child(dname, inode, pino); | ||
309 | } | ||
226 | 310 | ||
227 | /* Private API (for audit.c only) */ | 311 | /* Private API (for audit.c only) */ |
228 | extern int audit_receive_filter(int type, int pid, int uid, int seq, | ||
229 | void *data, uid_t loginuid); | ||
230 | extern unsigned int audit_serial(void); | 312 | extern unsigned int audit_serial(void); |
231 | extern void auditsc_get_stamp(struct audit_context *ctx, | 313 | extern void auditsc_get_stamp(struct audit_context *ctx, |
232 | struct timespec *t, unsigned int *serial); | 314 | struct timespec *t, unsigned int *serial); |
233 | extern int audit_set_loginuid(struct task_struct *task, uid_t loginuid); | 315 | extern int audit_set_loginuid(struct task_struct *task, uid_t loginuid); |
234 | extern uid_t audit_get_loginuid(struct audit_context *ctx); | 316 | extern uid_t audit_get_loginuid(struct audit_context *ctx); |
235 | extern int audit_ipc_perms(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode); | 317 | extern int audit_ipc_perms(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode, struct kern_ipc_perm *ipcp); |
236 | extern int audit_socketcall(int nargs, unsigned long *args); | 318 | extern int audit_socketcall(int nargs, unsigned long *args); |
237 | extern int audit_sockaddr(int len, void *addr); | 319 | extern int audit_sockaddr(int len, void *addr); |
238 | extern int audit_avc_path(struct dentry *dentry, struct vfsmount *mnt); | 320 | extern int audit_avc_path(struct dentry *dentry, struct vfsmount *mnt); |
239 | extern void audit_signal_info(int sig, struct task_struct *t); | 321 | extern void audit_signal_info(int sig, struct task_struct *t); |
240 | extern int audit_filter_user(struct netlink_skb_parms *cb, int type); | 322 | extern int audit_set_macxattr(const char *name); |
241 | #else | 323 | #else |
242 | #define audit_alloc(t) ({ 0; }) | 324 | #define audit_alloc(t) ({ 0; }) |
243 | #define audit_free(t) do { ; } while (0) | 325 | #define audit_free(t) do { ; } while (0) |
@@ -245,16 +327,18 @@ extern int audit_filter_user(struct netlink_skb_parms *cb, int type); | |||
245 | #define audit_syscall_exit(t,f,r) do { ; } while (0) | 327 | #define audit_syscall_exit(t,f,r) do { ; } while (0) |
246 | #define audit_getname(n) do { ; } while (0) | 328 | #define audit_getname(n) do { ; } while (0) |
247 | #define audit_putname(n) do { ; } while (0) | 329 | #define audit_putname(n) do { ; } while (0) |
330 | #define __audit_inode(n,i,f) do { ; } while (0) | ||
331 | #define __audit_inode_child(d,i,p) do { ; } while (0) | ||
248 | #define audit_inode(n,i,f) do { ; } while (0) | 332 | #define audit_inode(n,i,f) do { ; } while (0) |
249 | #define audit_receive_filter(t,p,u,s,d,l) ({ -EOPNOTSUPP; }) | 333 | #define audit_inode_child(d,i,p) do { ; } while (0) |
250 | #define auditsc_get_stamp(c,t,s) do { BUG(); } while (0) | 334 | #define auditsc_get_stamp(c,t,s) do { BUG(); } while (0) |
251 | #define audit_get_loginuid(c) ({ -1; }) | 335 | #define audit_get_loginuid(c) ({ -1; }) |
252 | #define audit_ipc_perms(q,u,g,m) ({ 0; }) | 336 | #define audit_ipc_perms(q,u,g,m,i) ({ 0; }) |
253 | #define audit_socketcall(n,a) ({ 0; }) | 337 | #define audit_socketcall(n,a) ({ 0; }) |
254 | #define audit_sockaddr(len, addr) ({ 0; }) | 338 | #define audit_sockaddr(len, addr) ({ 0; }) |
255 | #define audit_avc_path(dentry, mnt) ({ 0; }) | 339 | #define audit_avc_path(dentry, mnt) ({ 0; }) |
256 | #define audit_signal_info(s,t) do { ; } while (0) | 340 | #define audit_signal_info(s,t) do { ; } while (0) |
257 | #define audit_filter_user(cb,t) ({ 1; }) | 341 | #define audit_set_macxattr(n) do { ; } while (0) |
258 | #endif | 342 | #endif |
259 | 343 | ||
260 | #ifdef CONFIG_AUDIT | 344 | #ifdef CONFIG_AUDIT |
@@ -278,12 +362,11 @@ extern void audit_log_d_path(struct audit_buffer *ab, | |||
278 | const char *prefix, | 362 | const char *prefix, |
279 | struct dentry *dentry, | 363 | struct dentry *dentry, |
280 | struct vfsmount *vfsmnt); | 364 | struct vfsmount *vfsmnt); |
281 | /* Private API (for auditsc.c only) */ | 365 | /* Private API (for audit.c only) */ |
282 | extern void audit_send_reply(int pid, int seq, int type, | 366 | extern int audit_filter_user(struct netlink_skb_parms *cb, int type); |
283 | int done, int multi, | 367 | extern int audit_filter_type(int type); |
284 | void *payload, int size); | 368 | extern int audit_receive_filter(int type, int pid, int uid, int seq, |
285 | extern void audit_log_lost(const char *message); | 369 | void *data, size_t datasz, uid_t loginuid); |
286 | extern struct semaphore audit_netlink_sem; | ||
287 | #else | 370 | #else |
288 | #define audit_log(c,g,t,f,...) do { ; } while (0) | 371 | #define audit_log(c,g,t,f,...) do { ; } while (0) |
289 | #define audit_log_start(c,g,t) ({ NULL; }) | 372 | #define audit_log_start(c,g,t) ({ NULL; }) |
@@ -293,6 +376,7 @@ extern struct semaphore audit_netlink_sem; | |||
293 | #define audit_log_hex(a,b,l) do { ; } while (0) | 376 | #define audit_log_hex(a,b,l) do { ; } while (0) |
294 | #define audit_log_untrustedstring(a,s) do { ; } while (0) | 377 | #define audit_log_untrustedstring(a,s) do { ; } while (0) |
295 | #define audit_log_d_path(b,p,d,v) do { ; } while (0) | 378 | #define audit_log_d_path(b,p,d,v) do { ; } while (0) |
379 | #define audit_panic(m) do { ; } while (0) | ||
296 | #endif | 380 | #endif |
297 | #endif | 381 | #endif |
298 | #endif | 382 | #endif |
diff --git a/include/linux/auto_fs4.h b/include/linux/auto_fs4.h index 9343c89d843c..0a6bc52ffe88 100644 --- a/include/linux/auto_fs4.h +++ b/include/linux/auto_fs4.h | |||
@@ -19,18 +19,37 @@ | |||
19 | #undef AUTOFS_MIN_PROTO_VERSION | 19 | #undef AUTOFS_MIN_PROTO_VERSION |
20 | #undef AUTOFS_MAX_PROTO_VERSION | 20 | #undef AUTOFS_MAX_PROTO_VERSION |
21 | 21 | ||
22 | #define AUTOFS_PROTO_VERSION 4 | 22 | #define AUTOFS_PROTO_VERSION 5 |
23 | #define AUTOFS_MIN_PROTO_VERSION 3 | 23 | #define AUTOFS_MIN_PROTO_VERSION 3 |
24 | #define AUTOFS_MAX_PROTO_VERSION 4 | 24 | #define AUTOFS_MAX_PROTO_VERSION 5 |
25 | 25 | ||
26 | #define AUTOFS_PROTO_SUBVERSION 7 | 26 | #define AUTOFS_PROTO_SUBVERSION 0 |
27 | 27 | ||
28 | /* Mask for expire behaviour */ | 28 | /* Mask for expire behaviour */ |
29 | #define AUTOFS_EXP_IMMEDIATE 1 | 29 | #define AUTOFS_EXP_IMMEDIATE 1 |
30 | #define AUTOFS_EXP_LEAVES 2 | 30 | #define AUTOFS_EXP_LEAVES 2 |
31 | 31 | ||
32 | /* New message type */ | 32 | /* Daemon notification packet types */ |
33 | #define autofs_ptype_expire_multi 2 /* Expire entry (umount request) */ | 33 | enum autofs_notify { |
34 | NFY_NONE, | ||
35 | NFY_MOUNT, | ||
36 | NFY_EXPIRE | ||
37 | }; | ||
38 | |||
39 | /* Kernel protocol version 4 packet types */ | ||
40 | |||
41 | /* Expire entry (umount request) */ | ||
42 | #define autofs_ptype_expire_multi 2 | ||
43 | |||
44 | /* Kernel protocol version 5 packet types */ | ||
45 | |||
46 | /* Indirect mount missing and expire requests. */ | ||
47 | #define autofs_ptype_missing_indirect 3 | ||
48 | #define autofs_ptype_expire_indirect 4 | ||
49 | |||
50 | /* Direct mount missing and expire requests */ | ||
51 | #define autofs_ptype_missing_direct 5 | ||
52 | #define autofs_ptype_expire_direct 6 | ||
34 | 53 | ||
35 | /* v4 multi expire (via pipe) */ | 54 | /* v4 multi expire (via pipe) */ |
36 | struct autofs_packet_expire_multi { | 55 | struct autofs_packet_expire_multi { |
@@ -40,14 +59,36 @@ struct autofs_packet_expire_multi { | |||
40 | char name[NAME_MAX+1]; | 59 | char name[NAME_MAX+1]; |
41 | }; | 60 | }; |
42 | 61 | ||
62 | /* autofs v5 common packet struct */ | ||
63 | struct autofs_v5_packet { | ||
64 | struct autofs_packet_hdr hdr; | ||
65 | autofs_wqt_t wait_queue_token; | ||
66 | __u32 dev; | ||
67 | __u64 ino; | ||
68 | __u32 uid; | ||
69 | __u32 gid; | ||
70 | __u32 pid; | ||
71 | __u32 tgid; | ||
72 | __u32 len; | ||
73 | char name[NAME_MAX+1]; | ||
74 | }; | ||
75 | |||
76 | typedef struct autofs_v5_packet autofs_packet_missing_indirect_t; | ||
77 | typedef struct autofs_v5_packet autofs_packet_expire_indirect_t; | ||
78 | typedef struct autofs_v5_packet autofs_packet_missing_direct_t; | ||
79 | typedef struct autofs_v5_packet autofs_packet_expire_direct_t; | ||
80 | |||
43 | union autofs_packet_union { | 81 | union autofs_packet_union { |
44 | struct autofs_packet_hdr hdr; | 82 | struct autofs_packet_hdr hdr; |
45 | struct autofs_packet_missing missing; | 83 | struct autofs_packet_missing missing; |
46 | struct autofs_packet_expire expire; | 84 | struct autofs_packet_expire expire; |
47 | struct autofs_packet_expire_multi expire_multi; | 85 | struct autofs_packet_expire_multi expire_multi; |
86 | struct autofs_v5_packet v5_packet; | ||
48 | }; | 87 | }; |
49 | 88 | ||
50 | #define AUTOFS_IOC_EXPIRE_MULTI _IOW(0x93,0x66,int) | 89 | #define AUTOFS_IOC_EXPIRE_MULTI _IOW(0x93,0x66,int) |
90 | #define AUTOFS_IOC_EXPIRE_INDIRECT AUTOFS_IOC_EXPIRE_MULTI | ||
91 | #define AUTOFS_IOC_EXPIRE_DIRECT AUTOFS_IOC_EXPIRE_MULTI | ||
51 | #define AUTOFS_IOC_PROTOSUBVER _IOR(0x93,0x67,int) | 92 | #define AUTOFS_IOC_PROTOSUBVER _IOR(0x93,0x67,int) |
52 | #define AUTOFS_IOC_ASKREGHOST _IOR(0x93,0x68,int) | 93 | #define AUTOFS_IOC_ASKREGHOST _IOR(0x93,0x68,int) |
53 | #define AUTOFS_IOC_TOGGLEREGHOST _IOR(0x93,0x69,int) | 94 | #define AUTOFS_IOC_TOGGLEREGHOST _IOR(0x93,0x69,int) |
diff --git a/include/linux/bitops.h b/include/linux/bitops.h index 208650b1ad3a..5d1eabcde5d5 100644 --- a/include/linux/bitops.h +++ b/include/linux/bitops.h | |||
@@ -3,88 +3,11 @@ | |||
3 | #include <asm/types.h> | 3 | #include <asm/types.h> |
4 | 4 | ||
5 | /* | 5 | /* |
6 | * ffs: find first bit set. This is defined the same way as | ||
7 | * the libc and compiler builtin ffs routines, therefore | ||
8 | * differs in spirit from the above ffz (man ffs). | ||
9 | */ | ||
10 | |||
11 | static inline int generic_ffs(int x) | ||
12 | { | ||
13 | int r = 1; | ||
14 | |||
15 | if (!x) | ||
16 | return 0; | ||
17 | if (!(x & 0xffff)) { | ||
18 | x >>= 16; | ||
19 | r += 16; | ||
20 | } | ||
21 | if (!(x & 0xff)) { | ||
22 | x >>= 8; | ||
23 | r += 8; | ||
24 | } | ||
25 | if (!(x & 0xf)) { | ||
26 | x >>= 4; | ||
27 | r += 4; | ||
28 | } | ||
29 | if (!(x & 3)) { | ||
30 | x >>= 2; | ||
31 | r += 2; | ||
32 | } | ||
33 | if (!(x & 1)) { | ||
34 | x >>= 1; | ||
35 | r += 1; | ||
36 | } | ||
37 | return r; | ||
38 | } | ||
39 | |||
40 | /* | ||
41 | * fls: find last bit set. | ||
42 | */ | ||
43 | |||
44 | static __inline__ int generic_fls(int x) | ||
45 | { | ||
46 | int r = 32; | ||
47 | |||
48 | if (!x) | ||
49 | return 0; | ||
50 | if (!(x & 0xffff0000u)) { | ||
51 | x <<= 16; | ||
52 | r -= 16; | ||
53 | } | ||
54 | if (!(x & 0xff000000u)) { | ||
55 | x <<= 8; | ||
56 | r -= 8; | ||
57 | } | ||
58 | if (!(x & 0xf0000000u)) { | ||
59 | x <<= 4; | ||
60 | r -= 4; | ||
61 | } | ||
62 | if (!(x & 0xc0000000u)) { | ||
63 | x <<= 2; | ||
64 | r -= 2; | ||
65 | } | ||
66 | if (!(x & 0x80000000u)) { | ||
67 | x <<= 1; | ||
68 | r -= 1; | ||
69 | } | ||
70 | return r; | ||
71 | } | ||
72 | |||
73 | /* | ||
74 | * Include this here because some architectures need generic_ffs/fls in | 6 | * Include this here because some architectures need generic_ffs/fls in |
75 | * scope | 7 | * scope |
76 | */ | 8 | */ |
77 | #include <asm/bitops.h> | 9 | #include <asm/bitops.h> |
78 | 10 | ||
79 | |||
80 | static inline int generic_fls64(__u64 x) | ||
81 | { | ||
82 | __u32 h = x >> 32; | ||
83 | if (h) | ||
84 | return fls(h) + 32; | ||
85 | return fls(x); | ||
86 | } | ||
87 | |||
88 | static __inline__ int get_bitmask_order(unsigned int count) | 11 | static __inline__ int get_bitmask_order(unsigned int count) |
89 | { | 12 | { |
90 | int order; | 13 | int order; |
@@ -103,54 +26,9 @@ static __inline__ int get_count_order(unsigned int count) | |||
103 | return order; | 26 | return order; |
104 | } | 27 | } |
105 | 28 | ||
106 | /* | ||
107 | * hweightN: returns the hamming weight (i.e. the number | ||
108 | * of bits set) of a N-bit word | ||
109 | */ | ||
110 | |||
111 | static inline unsigned int generic_hweight32(unsigned int w) | ||
112 | { | ||
113 | unsigned int res = (w & 0x55555555) + ((w >> 1) & 0x55555555); | ||
114 | res = (res & 0x33333333) + ((res >> 2) & 0x33333333); | ||
115 | res = (res & 0x0F0F0F0F) + ((res >> 4) & 0x0F0F0F0F); | ||
116 | res = (res & 0x00FF00FF) + ((res >> 8) & 0x00FF00FF); | ||
117 | return (res & 0x0000FFFF) + ((res >> 16) & 0x0000FFFF); | ||
118 | } | ||
119 | |||
120 | static inline unsigned int generic_hweight16(unsigned int w) | ||
121 | { | ||
122 | unsigned int res = (w & 0x5555) + ((w >> 1) & 0x5555); | ||
123 | res = (res & 0x3333) + ((res >> 2) & 0x3333); | ||
124 | res = (res & 0x0F0F) + ((res >> 4) & 0x0F0F); | ||
125 | return (res & 0x00FF) + ((res >> 8) & 0x00FF); | ||
126 | } | ||
127 | |||
128 | static inline unsigned int generic_hweight8(unsigned int w) | ||
129 | { | ||
130 | unsigned int res = (w & 0x55) + ((w >> 1) & 0x55); | ||
131 | res = (res & 0x33) + ((res >> 2) & 0x33); | ||
132 | return (res & 0x0F) + ((res >> 4) & 0x0F); | ||
133 | } | ||
134 | |||
135 | static inline unsigned long generic_hweight64(__u64 w) | ||
136 | { | ||
137 | #if BITS_PER_LONG < 64 | ||
138 | return generic_hweight32((unsigned int)(w >> 32)) + | ||
139 | generic_hweight32((unsigned int)w); | ||
140 | #else | ||
141 | u64 res; | ||
142 | res = (w & 0x5555555555555555ul) + ((w >> 1) & 0x5555555555555555ul); | ||
143 | res = (res & 0x3333333333333333ul) + ((res >> 2) & 0x3333333333333333ul); | ||
144 | res = (res & 0x0F0F0F0F0F0F0F0Ful) + ((res >> 4) & 0x0F0F0F0F0F0F0F0Ful); | ||
145 | res = (res & 0x00FF00FF00FF00FFul) + ((res >> 8) & 0x00FF00FF00FF00FFul); | ||
146 | res = (res & 0x0000FFFF0000FFFFul) + ((res >> 16) & 0x0000FFFF0000FFFFul); | ||
147 | return (res & 0x00000000FFFFFFFFul) + ((res >> 32) & 0x00000000FFFFFFFFul); | ||
148 | #endif | ||
149 | } | ||
150 | |||
151 | static inline unsigned long hweight_long(unsigned long w) | 29 | static inline unsigned long hweight_long(unsigned long w) |
152 | { | 30 | { |
153 | return sizeof(w) == 4 ? generic_hweight32(w) : generic_hweight64(w); | 31 | return sizeof(w) == 4 ? hweight32(w) : hweight64(w); |
154 | } | 32 | } |
155 | 33 | ||
156 | /* | 34 | /* |
@@ -175,4 +53,11 @@ static inline __u32 ror32(__u32 word, unsigned int shift) | |||
175 | return (word >> shift) | (word << (32 - shift)); | 53 | return (word >> shift) | (word << (32 - shift)); |
176 | } | 54 | } |
177 | 55 | ||
56 | static inline unsigned fls_long(unsigned long l) | ||
57 | { | ||
58 | if (sizeof(l) == 4) | ||
59 | return fls(l); | ||
60 | return fls64(l); | ||
61 | } | ||
62 | |||
178 | #endif | 63 | #endif |
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index c179966f1a2f..d0cac8b58de7 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
@@ -55,25 +55,29 @@ struct as_io_context { | |||
55 | 55 | ||
56 | struct cfq_queue; | 56 | struct cfq_queue; |
57 | struct cfq_io_context { | 57 | struct cfq_io_context { |
58 | /* | 58 | struct rb_node rb_node; |
59 | * circular list of cfq_io_contexts belonging to a process io context | ||
60 | */ | ||
61 | struct list_head list; | ||
62 | struct cfq_queue *cfqq[2]; | ||
63 | void *key; | 59 | void *key; |
64 | 60 | ||
61 | struct cfq_queue *cfqq[2]; | ||
62 | |||
65 | struct io_context *ioc; | 63 | struct io_context *ioc; |
66 | 64 | ||
67 | unsigned long last_end_request; | 65 | unsigned long last_end_request; |
68 | unsigned long last_queue; | 66 | sector_t last_request_pos; |
67 | unsigned long last_queue; | ||
68 | |||
69 | unsigned long ttime_total; | 69 | unsigned long ttime_total; |
70 | unsigned long ttime_samples; | 70 | unsigned long ttime_samples; |
71 | unsigned long ttime_mean; | 71 | unsigned long ttime_mean; |
72 | 72 | ||
73 | unsigned int seek_samples; | ||
74 | u64 seek_total; | ||
75 | sector_t seek_mean; | ||
76 | |||
73 | struct list_head queue_list; | 77 | struct list_head queue_list; |
74 | 78 | ||
75 | void (*dtor)(struct cfq_io_context *); | 79 | void (*dtor)(struct io_context *); /* destructor */ |
76 | void (*exit)(struct cfq_io_context *); | 80 | void (*exit)(struct io_context *); /* called on task exit */ |
77 | }; | 81 | }; |
78 | 82 | ||
79 | /* | 83 | /* |
@@ -94,7 +98,7 @@ struct io_context { | |||
94 | int nr_batch_requests; /* Number of requests left in the batch */ | 98 | int nr_batch_requests; /* Number of requests left in the batch */ |
95 | 99 | ||
96 | struct as_io_context *aic; | 100 | struct as_io_context *aic; |
97 | struct cfq_io_context *cic; | 101 | struct rb_root cic_root; |
98 | }; | 102 | }; |
99 | 103 | ||
100 | void put_io_context(struct io_context *ioc); | 104 | void put_io_context(struct io_context *ioc); |
diff --git a/include/linux/bootmem.h b/include/linux/bootmem.h index 993da8cc9706..de3eb8d8ae26 100644 --- a/include/linux/bootmem.h +++ b/include/linux/bootmem.h | |||
@@ -38,6 +38,7 @@ typedef struct bootmem_data { | |||
38 | unsigned long last_pos; | 38 | unsigned long last_pos; |
39 | unsigned long last_success; /* Previous allocation point. To speed | 39 | unsigned long last_success; /* Previous allocation point. To speed |
40 | * up searching */ | 40 | * up searching */ |
41 | struct list_head list; | ||
41 | } bootmem_data_t; | 42 | } bootmem_data_t; |
42 | 43 | ||
43 | extern unsigned long __init bootmem_bootmap_pages (unsigned long); | 44 | extern unsigned long __init bootmem_bootmap_pages (unsigned long); |
@@ -51,6 +52,9 @@ extern void * __init __alloc_bootmem_low_node(pg_data_t *pgdat, | |||
51 | unsigned long size, | 52 | unsigned long size, |
52 | unsigned long align, | 53 | unsigned long align, |
53 | unsigned long goal); | 54 | unsigned long goal); |
55 | extern void * __init __alloc_bootmem_core(struct bootmem_data *bdata, | ||
56 | unsigned long size, unsigned long align, unsigned long goal, | ||
57 | unsigned long limit); | ||
54 | #ifndef CONFIG_HAVE_ARCH_BOOTMEM_NODE | 58 | #ifndef CONFIG_HAVE_ARCH_BOOTMEM_NODE |
55 | extern void __init reserve_bootmem (unsigned long addr, unsigned long size); | 59 | extern void __init reserve_bootmem (unsigned long addr, unsigned long size); |
56 | #define alloc_bootmem(x) \ | 60 | #define alloc_bootmem(x) \ |
diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index 9f159baf153f..fb7e9b7ccbe3 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h | |||
@@ -46,25 +46,28 @@ struct address_space; | |||
46 | typedef void (bh_end_io_t)(struct buffer_head *bh, int uptodate); | 46 | typedef void (bh_end_io_t)(struct buffer_head *bh, int uptodate); |
47 | 47 | ||
48 | /* | 48 | /* |
49 | * Keep related fields in common cachelines. The most commonly accessed | 49 | * Historically, a buffer_head was used to map a single block |
50 | * field (b_state) goes at the start so the compiler does not generate | 50 | * within a page, and of course as the unit of I/O through the |
51 | * indexed addressing for it. | 51 | * filesystem and block layers. Nowadays the basic I/O unit |
52 | * is the bio, and buffer_heads are used for extracting block | ||
53 | * mappings (via a get_block_t call), for tracking state within | ||
54 | * a page (via a page_mapping) and for wrapping bio submission | ||
55 | * for backward compatibility reasons (e.g. submit_bh). | ||
52 | */ | 56 | */ |
53 | struct buffer_head { | 57 | struct buffer_head { |
54 | /* First cache line: */ | ||
55 | unsigned long b_state; /* buffer state bitmap (see above) */ | 58 | unsigned long b_state; /* buffer state bitmap (see above) */ |
56 | struct buffer_head *b_this_page;/* circular list of page's buffers */ | 59 | struct buffer_head *b_this_page;/* circular list of page's buffers */ |
57 | struct page *b_page; /* the page this bh is mapped to */ | 60 | struct page *b_page; /* the page this bh is mapped to */ |
58 | atomic_t b_count; /* users using this block */ | ||
59 | u32 b_size; /* block size */ | ||
60 | 61 | ||
61 | sector_t b_blocknr; /* block number */ | 62 | sector_t b_blocknr; /* start block number */ |
62 | char *b_data; /* pointer to data block */ | 63 | size_t b_size; /* size of mapping */ |
64 | char *b_data; /* pointer to data within the page */ | ||
63 | 65 | ||
64 | struct block_device *b_bdev; | 66 | struct block_device *b_bdev; |
65 | bh_end_io_t *b_end_io; /* I/O completion */ | 67 | bh_end_io_t *b_end_io; /* I/O completion */ |
66 | void *b_private; /* reserved for b_end_io */ | 68 | void *b_private; /* reserved for b_end_io */ |
67 | struct list_head b_assoc_buffers; /* associated with another mapping */ | 69 | struct list_head b_assoc_buffers; /* associated with another mapping */ |
70 | atomic_t b_count; /* users using this buffer_head */ | ||
68 | }; | 71 | }; |
69 | 72 | ||
70 | /* | 73 | /* |
@@ -189,8 +192,8 @@ extern int buffer_heads_over_limit; | |||
189 | * address_spaces. | 192 | * address_spaces. |
190 | */ | 193 | */ |
191 | int try_to_release_page(struct page * page, gfp_t gfp_mask); | 194 | int try_to_release_page(struct page * page, gfp_t gfp_mask); |
192 | int block_invalidatepage(struct page *page, unsigned long offset); | 195 | void block_invalidatepage(struct page *page, unsigned long offset); |
193 | int do_invalidatepage(struct page *page, unsigned long offset); | 196 | void do_invalidatepage(struct page *page, unsigned long offset); |
194 | int block_write_full_page(struct page *page, get_block_t *get_block, | 197 | int block_write_full_page(struct page *page, get_block_t *get_block, |
195 | struct writeback_control *wbc); | 198 | struct writeback_control *wbc); |
196 | int block_read_full_page(struct page*, get_block_t*); | 199 | int block_read_full_page(struct page*, get_block_t*); |
@@ -200,7 +203,7 @@ int cont_prepare_write(struct page*, unsigned, unsigned, get_block_t*, | |||
200 | int generic_cont_expand(struct inode *inode, loff_t size); | 203 | int generic_cont_expand(struct inode *inode, loff_t size); |
201 | int generic_cont_expand_simple(struct inode *inode, loff_t size); | 204 | int generic_cont_expand_simple(struct inode *inode, loff_t size); |
202 | int block_commit_write(struct page *page, unsigned from, unsigned to); | 205 | int block_commit_write(struct page *page, unsigned from, unsigned to); |
203 | int block_sync_page(struct page *); | 206 | void block_sync_page(struct page *); |
204 | sector_t generic_block_bmap(struct address_space *, sector_t, get_block_t *); | 207 | sector_t generic_block_bmap(struct address_space *, sector_t, get_block_t *); |
205 | int generic_commit_write(struct file *, struct page *, unsigned, unsigned); | 208 | int generic_commit_write(struct file *, struct page *, unsigned, unsigned); |
206 | int block_truncate_page(struct address_space *, loff_t, get_block_t *); | 209 | int block_truncate_page(struct address_space *, loff_t, get_block_t *); |
@@ -277,6 +280,7 @@ map_bh(struct buffer_head *bh, struct super_block *sb, sector_t block) | |||
277 | set_buffer_mapped(bh); | 280 | set_buffer_mapped(bh); |
278 | bh->b_bdev = sb->s_bdev; | 281 | bh->b_bdev = sb->s_bdev; |
279 | bh->b_blocknr = block; | 282 | bh->b_blocknr = block; |
283 | bh->b_size = sb->s_blocksize; | ||
280 | } | 284 | } |
281 | 285 | ||
282 | /* | 286 | /* |
diff --git a/include/linux/capability.h b/include/linux/capability.h index 5a23ce752629..6548b35ab9f6 100644 --- a/include/linux/capability.h +++ b/include/linux/capability.h | |||
@@ -357,7 +357,8 @@ static inline kernel_cap_t cap_invert(kernel_cap_t c) | |||
357 | 357 | ||
358 | #define cap_is_fs_cap(c) (CAP_TO_MASK(c) & CAP_FS_MASK) | 358 | #define cap_is_fs_cap(c) (CAP_TO_MASK(c) & CAP_FS_MASK) |
359 | 359 | ||
360 | extern int capable(int cap); | 360 | int capable(int cap); |
361 | int __capable(struct task_struct *t, int cap); | ||
361 | 362 | ||
362 | #endif /* __KERNEL__ */ | 363 | #endif /* __KERNEL__ */ |
363 | 364 | ||
diff --git a/include/linux/cdev.h b/include/linux/cdev.h index 8da37e29cb87..2216638962d2 100644 --- a/include/linux/cdev.h +++ b/include/linux/cdev.h | |||
@@ -5,13 +5,13 @@ | |||
5 | struct cdev { | 5 | struct cdev { |
6 | struct kobject kobj; | 6 | struct kobject kobj; |
7 | struct module *owner; | 7 | struct module *owner; |
8 | struct file_operations *ops; | 8 | const struct file_operations *ops; |
9 | struct list_head list; | 9 | struct list_head list; |
10 | dev_t dev; | 10 | dev_t dev; |
11 | unsigned int count; | 11 | unsigned int count; |
12 | }; | 12 | }; |
13 | 13 | ||
14 | void cdev_init(struct cdev *, struct file_operations *); | 14 | void cdev_init(struct cdev *, const struct file_operations *); |
15 | 15 | ||
16 | struct cdev *cdev_alloc(void); | 16 | struct cdev *cdev_alloc(void); |
17 | 17 | ||
diff --git a/include/linux/clk.h b/include/linux/clk.h index 12848f81bb37..5ca8c6fddb56 100644 --- a/include/linux/clk.h +++ b/include/linux/clk.h | |||
@@ -8,8 +8,8 @@ | |||
8 | * it under the terms of the GNU General Public License version 2 as | 8 | * it under the terms of the GNU General Public License version 2 as |
9 | * published by the Free Software Foundation. | 9 | * published by the Free Software Foundation. |
10 | */ | 10 | */ |
11 | #ifndef ASMARM_CLOCK_H | 11 | #ifndef __LINUX_CLK_H |
12 | #define ASMARM_CLOCK_H | 12 | #define __LINUX_CLK_H |
13 | 13 | ||
14 | struct device; | 14 | struct device; |
15 | 15 | ||
diff --git a/include/linux/coda_linux.h b/include/linux/coda_linux.h index cc621ec409d8..b3ecf8f71d97 100644 --- a/include/linux/coda_linux.h +++ b/include/linux/coda_linux.h | |||
@@ -30,9 +30,9 @@ extern struct inode_operations coda_ioctl_inode_operations; | |||
30 | extern struct address_space_operations coda_file_aops; | 30 | extern struct address_space_operations coda_file_aops; |
31 | extern struct address_space_operations coda_symlink_aops; | 31 | extern struct address_space_operations coda_symlink_aops; |
32 | 32 | ||
33 | extern struct file_operations coda_dir_operations; | 33 | extern const struct file_operations coda_dir_operations; |
34 | extern struct file_operations coda_file_operations; | 34 | extern const struct file_operations coda_file_operations; |
35 | extern struct file_operations coda_ioctl_operations; | 35 | extern const struct file_operations coda_ioctl_operations; |
36 | 36 | ||
37 | /* operations shared over more than one file */ | 37 | /* operations shared over more than one file */ |
38 | int coda_open(struct inode *i, struct file *f); | 38 | int coda_open(struct inode *i, struct file *f); |
diff --git a/include/linux/compat.h b/include/linux/compat.h index c9ab2a26348c..6d3a654be1ae 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h | |||
@@ -45,6 +45,32 @@ struct compat_tms { | |||
45 | compat_clock_t tms_cstime; | 45 | compat_clock_t tms_cstime; |
46 | }; | 46 | }; |
47 | 47 | ||
48 | struct compat_timex { | ||
49 | compat_uint_t modes; | ||
50 | compat_long_t offset; | ||
51 | compat_long_t freq; | ||
52 | compat_long_t maxerror; | ||
53 | compat_long_t esterror; | ||
54 | compat_int_t status; | ||
55 | compat_long_t constant; | ||
56 | compat_long_t precision; | ||
57 | compat_long_t tolerance; | ||
58 | struct compat_timeval time; | ||
59 | compat_long_t tick; | ||
60 | compat_long_t ppsfreq; | ||
61 | compat_long_t jitter; | ||
62 | compat_int_t shift; | ||
63 | compat_long_t stabil; | ||
64 | compat_long_t jitcnt; | ||
65 | compat_long_t calcnt; | ||
66 | compat_long_t errcnt; | ||
67 | compat_long_t stbcnt; | ||
68 | |||
69 | compat_int_t :32; compat_int_t :32; compat_int_t :32; compat_int_t :32; | ||
70 | compat_int_t :32; compat_int_t :32; compat_int_t :32; compat_int_t :32; | ||
71 | compat_int_t :32; compat_int_t :32; compat_int_t :32; compat_int_t :32; | ||
72 | }; | ||
73 | |||
48 | #define _COMPAT_NSIG_WORDS (_COMPAT_NSIG / _COMPAT_NSIG_BPW) | 74 | #define _COMPAT_NSIG_WORDS (_COMPAT_NSIG / _COMPAT_NSIG_BPW) |
49 | 75 | ||
50 | typedef struct { | 76 | typedef struct { |
@@ -121,6 +147,24 @@ typedef struct compat_sigevent { | |||
121 | } _sigev_un; | 147 | } _sigev_un; |
122 | } compat_sigevent_t; | 148 | } compat_sigevent_t; |
123 | 149 | ||
150 | struct compat_robust_list { | ||
151 | compat_uptr_t next; | ||
152 | }; | ||
153 | |||
154 | struct compat_robust_list_head { | ||
155 | struct compat_robust_list list; | ||
156 | compat_long_t futex_offset; | ||
157 | compat_uptr_t list_op_pending; | ||
158 | }; | ||
159 | |||
160 | extern void compat_exit_robust_list(struct task_struct *curr); | ||
161 | |||
162 | asmlinkage long | ||
163 | compat_sys_set_robust_list(struct compat_robust_list_head __user *head, | ||
164 | compat_size_t len); | ||
165 | asmlinkage long | ||
166 | compat_sys_get_robust_list(int pid, compat_uptr_t *head_ptr, | ||
167 | compat_size_t __user *len_ptr); | ||
124 | 168 | ||
125 | long compat_sys_semctl(int first, int second, int third, void __user *uptr); | 169 | long compat_sys_semctl(int first, int second, int third, void __user *uptr); |
126 | long compat_sys_msgsnd(int first, int second, int third, void __user *uptr); | 170 | long compat_sys_msgsnd(int first, int second, int third, void __user *uptr); |
@@ -181,5 +225,7 @@ static inline int compat_timespec_compare(struct compat_timespec *lhs, | |||
181 | return lhs->tv_nsec - rhs->tv_nsec; | 225 | return lhs->tv_nsec - rhs->tv_nsec; |
182 | } | 226 | } |
183 | 227 | ||
228 | asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp); | ||
229 | |||
184 | #endif /* CONFIG_COMPAT */ | 230 | #endif /* CONFIG_COMPAT */ |
185 | #endif /* _LINUX_COMPAT_H */ | 231 | #endif /* _LINUX_COMPAT_H */ |
diff --git a/include/linux/compat_ioctl.h b/include/linux/compat_ioctl.h index efb518f16bb3..89ab677cb993 100644 --- a/include/linux/compat_ioctl.h +++ b/include/linux/compat_ioctl.h | |||
@@ -140,6 +140,7 @@ COMPATIBLE_IOCTL(DM_TABLE_DEPS_32) | |||
140 | COMPATIBLE_IOCTL(DM_TABLE_STATUS_32) | 140 | COMPATIBLE_IOCTL(DM_TABLE_STATUS_32) |
141 | COMPATIBLE_IOCTL(DM_LIST_VERSIONS_32) | 141 | COMPATIBLE_IOCTL(DM_LIST_VERSIONS_32) |
142 | COMPATIBLE_IOCTL(DM_TARGET_MSG_32) | 142 | COMPATIBLE_IOCTL(DM_TARGET_MSG_32) |
143 | COMPATIBLE_IOCTL(DM_DEV_SET_GEOMETRY_32) | ||
143 | COMPATIBLE_IOCTL(DM_VERSION) | 144 | COMPATIBLE_IOCTL(DM_VERSION) |
144 | COMPATIBLE_IOCTL(DM_REMOVE_ALL) | 145 | COMPATIBLE_IOCTL(DM_REMOVE_ALL) |
145 | COMPATIBLE_IOCTL(DM_LIST_DEVICES) | 146 | COMPATIBLE_IOCTL(DM_LIST_DEVICES) |
@@ -155,6 +156,7 @@ COMPATIBLE_IOCTL(DM_TABLE_DEPS) | |||
155 | COMPATIBLE_IOCTL(DM_TABLE_STATUS) | 156 | COMPATIBLE_IOCTL(DM_TABLE_STATUS) |
156 | COMPATIBLE_IOCTL(DM_LIST_VERSIONS) | 157 | COMPATIBLE_IOCTL(DM_LIST_VERSIONS) |
157 | COMPATIBLE_IOCTL(DM_TARGET_MSG) | 158 | COMPATIBLE_IOCTL(DM_TARGET_MSG) |
159 | COMPATIBLE_IOCTL(DM_DEV_SET_GEOMETRY) | ||
158 | /* Big K */ | 160 | /* Big K */ |
159 | COMPATIBLE_IOCTL(PIO_FONT) | 161 | COMPATIBLE_IOCTL(PIO_FONT) |
160 | COMPATIBLE_IOCTL(GIO_FONT) | 162 | COMPATIBLE_IOCTL(GIO_FONT) |
diff --git a/include/linux/cpu.h b/include/linux/cpu.h index d612b89dce33..08d50c53aab4 100644 --- a/include/linux/cpu.h +++ b/include/linux/cpu.h | |||
@@ -74,7 +74,6 @@ extern int lock_cpu_hotplug_interruptible(void); | |||
74 | register_cpu_notifier(&fn##_nb); \ | 74 | register_cpu_notifier(&fn##_nb); \ |
75 | } | 75 | } |
76 | int cpu_down(unsigned int cpu); | 76 | int cpu_down(unsigned int cpu); |
77 | extern int __attribute__((weak)) smp_prepare_cpu(int cpu); | ||
78 | #define cpu_is_offline(cpu) unlikely(!cpu_online(cpu)) | 77 | #define cpu_is_offline(cpu) unlikely(!cpu_online(cpu)) |
79 | #else | 78 | #else |
80 | #define lock_cpu_hotplug() do { } while (0) | 79 | #define lock_cpu_hotplug() do { } while (0) |
diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h index 60e56c6e03dd..9cbb781d6f80 100644 --- a/include/linux/cpumask.h +++ b/include/linux/cpumask.h | |||
@@ -67,7 +67,7 @@ | |||
67 | * | 67 | * |
68 | * int any_online_cpu(mask) First online cpu in mask | 68 | * int any_online_cpu(mask) First online cpu in mask |
69 | * | 69 | * |
70 | * for_each_cpu(cpu) for-loop cpu over cpu_possible_map | 70 | * for_each_possible_cpu(cpu) for-loop cpu over cpu_possible_map |
71 | * for_each_online_cpu(cpu) for-loop cpu over cpu_online_map | 71 | * for_each_online_cpu(cpu) for-loop cpu over cpu_online_map |
72 | * for_each_present_cpu(cpu) for-loop cpu over cpu_present_map | 72 | * for_each_present_cpu(cpu) for-loop cpu over cpu_present_map |
73 | * | 73 | * |
@@ -212,17 +212,15 @@ static inline void __cpus_shift_left(cpumask_t *dstp, | |||
212 | bitmap_shift_left(dstp->bits, srcp->bits, n, nbits); | 212 | bitmap_shift_left(dstp->bits, srcp->bits, n, nbits); |
213 | } | 213 | } |
214 | 214 | ||
215 | #define first_cpu(src) __first_cpu(&(src), NR_CPUS) | 215 | #ifdef CONFIG_SMP |
216 | static inline int __first_cpu(const cpumask_t *srcp, int nbits) | 216 | int __first_cpu(const cpumask_t *srcp); |
217 | { | 217 | #define first_cpu(src) __first_cpu(&(src)) |
218 | return min_t(int, nbits, find_first_bit(srcp->bits, nbits)); | 218 | int __next_cpu(int n, const cpumask_t *srcp); |
219 | } | 219 | #define next_cpu(n, src) __next_cpu((n), &(src)) |
220 | 220 | #else | |
221 | #define next_cpu(n, src) __next_cpu((n), &(src), NR_CPUS) | 221 | #define first_cpu(src) 0 |
222 | static inline int __next_cpu(int n, const cpumask_t *srcp, int nbits) | 222 | #define next_cpu(n, src) 1 |
223 | { | 223 | #endif |
224 | return min_t(int, nbits, find_next_bit(srcp->bits, nbits, n+1)); | ||
225 | } | ||
226 | 224 | ||
227 | #define cpumask_of_cpu(cpu) \ | 225 | #define cpumask_of_cpu(cpu) \ |
228 | ({ \ | 226 | ({ \ |
@@ -398,27 +396,18 @@ extern cpumask_t cpu_present_map; | |||
398 | #define cpu_present(cpu) ((cpu) == 0) | 396 | #define cpu_present(cpu) ((cpu) == 0) |
399 | #endif | 397 | #endif |
400 | 398 | ||
401 | #define any_online_cpu(mask) \ | 399 | #ifdef CONFIG_SMP |
402 | ({ \ | 400 | int highest_possible_processor_id(void); |
403 | int cpu; \ | 401 | #define any_online_cpu(mask) __any_online_cpu(&(mask)) |
404 | for_each_cpu_mask(cpu, (mask)) \ | 402 | int __any_online_cpu(const cpumask_t *mask); |
405 | if (cpu_online(cpu)) \ | 403 | #else |
406 | break; \ | 404 | #define highest_possible_processor_id() 0 |
407 | cpu; \ | 405 | #define any_online_cpu(mask) 0 |
408 | }) | 406 | #endif |
409 | 407 | ||
410 | #define for_each_cpu(cpu) for_each_cpu_mask((cpu), cpu_possible_map) | 408 | #define for_each_cpu(cpu) for_each_cpu_mask((cpu), cpu_possible_map) |
409 | #define for_each_possible_cpu(cpu) for_each_cpu_mask((cpu), cpu_possible_map) | ||
411 | #define for_each_online_cpu(cpu) for_each_cpu_mask((cpu), cpu_online_map) | 410 | #define for_each_online_cpu(cpu) for_each_cpu_mask((cpu), cpu_online_map) |
412 | #define for_each_present_cpu(cpu) for_each_cpu_mask((cpu), cpu_present_map) | 411 | #define for_each_present_cpu(cpu) for_each_cpu_mask((cpu), cpu_present_map) |
413 | 412 | ||
414 | /* Find the highest possible smp_processor_id() */ | ||
415 | #define highest_possible_processor_id() \ | ||
416 | ({ \ | ||
417 | unsigned int cpu, highest = 0; \ | ||
418 | for_each_cpu_mask(cpu, cpu_possible_map) \ | ||
419 | highest = cpu; \ | ||
420 | highest; \ | ||
421 | }) | ||
422 | |||
423 | |||
424 | #endif /* __LINUX_CPUMASK_H */ | 413 | #endif /* __LINUX_CPUMASK_H */ |
diff --git a/include/linux/crash_dump.h b/include/linux/crash_dump.h index 534d750d922d..32503657f14f 100644 --- a/include/linux/crash_dump.h +++ b/include/linux/crash_dump.h | |||
@@ -11,7 +11,7 @@ | |||
11 | extern unsigned long long elfcorehdr_addr; | 11 | extern unsigned long long elfcorehdr_addr; |
12 | extern ssize_t copy_oldmem_page(unsigned long, char *, size_t, | 12 | extern ssize_t copy_oldmem_page(unsigned long, char *, size_t, |
13 | unsigned long, int); | 13 | unsigned long, int); |
14 | extern struct file_operations proc_vmcore_operations; | 14 | extern const struct file_operations proc_vmcore_operations; |
15 | extern struct proc_dir_entry *proc_vmcore; | 15 | extern struct proc_dir_entry *proc_vmcore; |
16 | 16 | ||
17 | #endif /* CONFIG_CRASH_DUMP */ | 17 | #endif /* CONFIG_CRASH_DUMP */ |
diff --git a/include/linux/dcache.h b/include/linux/dcache.h index 4361f3789975..d10bd30c337e 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h | |||
@@ -162,6 +162,8 @@ d_iput: no no no yes | |||
162 | #define DCACHE_REFERENCED 0x0008 /* Recently used, don't discard. */ | 162 | #define DCACHE_REFERENCED 0x0008 /* Recently used, don't discard. */ |
163 | #define DCACHE_UNHASHED 0x0010 | 163 | #define DCACHE_UNHASHED 0x0010 |
164 | 164 | ||
165 | #define DCACHE_INOTIFY_PARENT_WATCHED 0x0020 /* Parent inode is watched */ | ||
166 | |||
165 | extern spinlock_t dcache_lock; | 167 | extern spinlock_t dcache_lock; |
166 | 168 | ||
167 | /** | 169 | /** |
diff --git a/include/linux/debugfs.h b/include/linux/debugfs.h index 4b0428e335be..176e2d371577 100644 --- a/include/linux/debugfs.h +++ b/include/linux/debugfs.h | |||
@@ -29,7 +29,7 @@ struct debugfs_blob_wrapper { | |||
29 | #if defined(CONFIG_DEBUG_FS) | 29 | #if defined(CONFIG_DEBUG_FS) |
30 | struct dentry *debugfs_create_file(const char *name, mode_t mode, | 30 | struct dentry *debugfs_create_file(const char *name, mode_t mode, |
31 | struct dentry *parent, void *data, | 31 | struct dentry *parent, void *data, |
32 | struct file_operations *fops); | 32 | const struct file_operations *fops); |
33 | 33 | ||
34 | struct dentry *debugfs_create_dir(const char *name, struct dentry *parent); | 34 | struct dentry *debugfs_create_dir(const char *name, struct dentry *parent); |
35 | 35 | ||
diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h index 51e0e95a421a..aee10b2ea4c6 100644 --- a/include/linux/device-mapper.h +++ b/include/linux/device-mapper.h | |||
@@ -97,6 +97,7 @@ struct io_restrictions { | |||
97 | unsigned short hardsect_size; | 97 | unsigned short hardsect_size; |
98 | unsigned int max_segment_size; | 98 | unsigned int max_segment_size; |
99 | unsigned long seg_boundary_mask; | 99 | unsigned long seg_boundary_mask; |
100 | unsigned char no_cluster; /* inverted so that 0 is default */ | ||
100 | }; | 101 | }; |
101 | 102 | ||
102 | struct dm_target { | 103 | struct dm_target { |
diff --git a/include/linux/dio.h b/include/linux/dio.h index fae9395fcf4f..1e65ebc2a3db 100644 --- a/include/linux/dio.h +++ b/include/linux/dio.h | |||
@@ -276,37 +276,5 @@ static inline void dio_set_drvdata (struct dio_dev *d, void *data) | |||
276 | dev_set_drvdata(&d->dev, data); | 276 | dev_set_drvdata(&d->dev, data); |
277 | } | 277 | } |
278 | 278 | ||
279 | /* | ||
280 | * A helper function which helps ensure correct dio_driver | ||
281 | * setup and cleanup for commonly-encountered hotplug/modular cases | ||
282 | * | ||
283 | * This MUST stay in a header, as it checks for -DMODULE | ||
284 | */ | ||
285 | static inline int dio_module_init(struct dio_driver *drv) | ||
286 | { | ||
287 | int rc = dio_register_driver(drv); | ||
288 | |||
289 | if (rc > 0) | ||
290 | return 0; | ||
291 | |||
292 | /* iff CONFIG_HOTPLUG and built into kernel, we should | ||
293 | * leave the driver around for future hotplug events. | ||
294 | * For the module case, a hotplug daemon of some sort | ||
295 | * should load a module in response to an insert event. */ | ||
296 | #if defined(CONFIG_HOTPLUG) && !defined(MODULE) | ||
297 | if (rc == 0) | ||
298 | return 0; | ||
299 | #else | ||
300 | if (rc == 0) | ||
301 | rc = -ENODEV; | ||
302 | #endif | ||
303 | |||
304 | /* if we get here, we need to clean up DIO driver instance | ||
305 | * and return some sort of error */ | ||
306 | dio_unregister_driver(drv); | ||
307 | |||
308 | return rc; | ||
309 | } | ||
310 | |||
311 | #endif /* __KERNEL__ */ | 279 | #endif /* __KERNEL__ */ |
312 | #endif /* ndef _LINUX_DIO_H */ | 280 | #endif /* ndef _LINUX_DIO_H */ |
diff --git a/include/linux/dm-ioctl.h b/include/linux/dm-ioctl.h index fa75ba0d635e..c67c6786612a 100644 --- a/include/linux/dm-ioctl.h +++ b/include/linux/dm-ioctl.h | |||
@@ -80,6 +80,16 @@ | |||
80 | * | 80 | * |
81 | * DM_TARGET_MSG: | 81 | * DM_TARGET_MSG: |
82 | * Pass a message string to the target at a specific offset of a device. | 82 | * Pass a message string to the target at a specific offset of a device. |
83 | * | ||
84 | * DM_DEV_SET_GEOMETRY: | ||
85 | * Set the geometry of a device by passing in a string in this format: | ||
86 | * | ||
87 | * "cylinders heads sectors_per_track start_sector" | ||
88 | * | ||
89 | * Beware that CHS geometry is nearly obsolete and only provided | ||
90 | * for compatibility with dm devices that can be booted by a PC | ||
91 | * BIOS. See struct hd_geometry for range limits. Also note that | ||
92 | * the geometry is erased if the device size changes. | ||
83 | */ | 93 | */ |
84 | 94 | ||
85 | /* | 95 | /* |
@@ -218,6 +228,7 @@ enum { | |||
218 | /* Added later */ | 228 | /* Added later */ |
219 | DM_LIST_VERSIONS_CMD, | 229 | DM_LIST_VERSIONS_CMD, |
220 | DM_TARGET_MSG_CMD, | 230 | DM_TARGET_MSG_CMD, |
231 | DM_DEV_SET_GEOMETRY_CMD | ||
221 | }; | 232 | }; |
222 | 233 | ||
223 | /* | 234 | /* |
@@ -247,6 +258,7 @@ typedef char ioctl_struct[308]; | |||
247 | #define DM_TABLE_STATUS_32 _IOWR(DM_IOCTL, DM_TABLE_STATUS_CMD, ioctl_struct) | 258 | #define DM_TABLE_STATUS_32 _IOWR(DM_IOCTL, DM_TABLE_STATUS_CMD, ioctl_struct) |
248 | #define DM_LIST_VERSIONS_32 _IOWR(DM_IOCTL, DM_LIST_VERSIONS_CMD, ioctl_struct) | 259 | #define DM_LIST_VERSIONS_32 _IOWR(DM_IOCTL, DM_LIST_VERSIONS_CMD, ioctl_struct) |
249 | #define DM_TARGET_MSG_32 _IOWR(DM_IOCTL, DM_TARGET_MSG_CMD, ioctl_struct) | 260 | #define DM_TARGET_MSG_32 _IOWR(DM_IOCTL, DM_TARGET_MSG_CMD, ioctl_struct) |
261 | #define DM_DEV_SET_GEOMETRY_32 _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, ioctl_struct) | ||
250 | #endif | 262 | #endif |
251 | 263 | ||
252 | #define DM_IOCTL 0xfd | 264 | #define DM_IOCTL 0xfd |
@@ -270,11 +282,12 @@ typedef char ioctl_struct[308]; | |||
270 | #define DM_LIST_VERSIONS _IOWR(DM_IOCTL, DM_LIST_VERSIONS_CMD, struct dm_ioctl) | 282 | #define DM_LIST_VERSIONS _IOWR(DM_IOCTL, DM_LIST_VERSIONS_CMD, struct dm_ioctl) |
271 | 283 | ||
272 | #define DM_TARGET_MSG _IOWR(DM_IOCTL, DM_TARGET_MSG_CMD, struct dm_ioctl) | 284 | #define DM_TARGET_MSG _IOWR(DM_IOCTL, DM_TARGET_MSG_CMD, struct dm_ioctl) |
285 | #define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl) | ||
273 | 286 | ||
274 | #define DM_VERSION_MAJOR 4 | 287 | #define DM_VERSION_MAJOR 4 |
275 | #define DM_VERSION_MINOR 5 | 288 | #define DM_VERSION_MINOR 6 |
276 | #define DM_VERSION_PATCHLEVEL 0 | 289 | #define DM_VERSION_PATCHLEVEL 0 |
277 | #define DM_VERSION_EXTRA "-ioctl (2005-10-04)" | 290 | #define DM_VERSION_EXTRA "-ioctl (2006-02-17)" |
278 | 291 | ||
279 | /* Status bits */ | 292 | /* Status bits */ |
280 | #define DM_READONLY_FLAG (1 << 0) /* In/Out */ | 293 | #define DM_READONLY_FLAG (1 << 0) /* In/Out */ |
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index a8731062a74c..9b4751aecc23 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h | |||
@@ -21,6 +21,7 @@ enum dma_data_direction { | |||
21 | #define DMA_30BIT_MASK 0x000000003fffffffULL | 21 | #define DMA_30BIT_MASK 0x000000003fffffffULL |
22 | #define DMA_29BIT_MASK 0x000000001fffffffULL | 22 | #define DMA_29BIT_MASK 0x000000001fffffffULL |
23 | #define DMA_28BIT_MASK 0x000000000fffffffULL | 23 | #define DMA_28BIT_MASK 0x000000000fffffffULL |
24 | #define DMA_24BIT_MASK 0x0000000000ffffffULL | ||
24 | 25 | ||
25 | #include <asm/dma-mapping.h> | 26 | #include <asm/dma-mapping.h> |
26 | 27 | ||
diff --git a/include/linux/dmi.h b/include/linux/dmi.h index 2e6bbe014157..64fd6c366604 100644 --- a/include/linux/dmi.h +++ b/include/linux/dmi.h | |||
@@ -68,6 +68,7 @@ extern char * dmi_get_system_info(int field); | |||
68 | extern struct dmi_device * dmi_find_device(int type, const char *name, | 68 | extern struct dmi_device * dmi_find_device(int type, const char *name, |
69 | struct dmi_device *from); | 69 | struct dmi_device *from); |
70 | extern void dmi_scan_machine(void); | 70 | extern void dmi_scan_machine(void); |
71 | extern int dmi_get_year(int field); | ||
71 | 72 | ||
72 | #else | 73 | #else |
73 | 74 | ||
@@ -75,6 +76,7 @@ static inline int dmi_check_system(struct dmi_system_id *list) { return 0; } | |||
75 | static inline char * dmi_get_system_info(int field) { return NULL; } | 76 | static inline char * dmi_get_system_info(int field) { return NULL; } |
76 | static inline struct dmi_device * dmi_find_device(int type, const char *name, | 77 | static inline struct dmi_device * dmi_find_device(int type, const char *name, |
77 | struct dmi_device *from) { return NULL; } | 78 | struct dmi_device *from) { return NULL; } |
79 | static inline int dmi_get_year(int year) { return 0; } | ||
78 | 80 | ||
79 | #endif | 81 | #endif |
80 | 82 | ||
diff --git a/include/linux/efi.h b/include/linux/efi.h index c7c5dd316182..e203613d3aec 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h | |||
@@ -240,19 +240,21 @@ struct efi_memory_map { | |||
240 | unsigned long desc_size; | 240 | unsigned long desc_size; |
241 | }; | 241 | }; |
242 | 242 | ||
243 | #define EFI_INVALID_TABLE_ADDR (~0UL) | ||
244 | |||
243 | /* | 245 | /* |
244 | * All runtime access to EFI goes through this structure: | 246 | * All runtime access to EFI goes through this structure: |
245 | */ | 247 | */ |
246 | extern struct efi { | 248 | extern struct efi { |
247 | efi_system_table_t *systab; /* EFI system table */ | 249 | efi_system_table_t *systab; /* EFI system table */ |
248 | void *mps; /* MPS table */ | 250 | unsigned long mps; /* MPS table */ |
249 | void *acpi; /* ACPI table (IA64 ext 0.71) */ | 251 | unsigned long acpi; /* ACPI table (IA64 ext 0.71) */ |
250 | void *acpi20; /* ACPI table (ACPI 2.0) */ | 252 | unsigned long acpi20; /* ACPI table (ACPI 2.0) */ |
251 | void *smbios; /* SM BIOS table */ | 253 | unsigned long smbios; /* SM BIOS table */ |
252 | void *sal_systab; /* SAL system table */ | 254 | unsigned long sal_systab; /* SAL system table */ |
253 | void *boot_info; /* boot info table */ | 255 | unsigned long boot_info; /* boot info table */ |
254 | void *hcdp; /* HCDP table */ | 256 | unsigned long hcdp; /* HCDP table */ |
255 | void *uga; /* UGA table */ | 257 | unsigned long uga; /* UGA table */ |
256 | efi_get_time_t *get_time; | 258 | efi_get_time_t *get_time; |
257 | efi_set_time_t *set_time; | 259 | efi_set_time_t *set_time; |
258 | efi_get_wakeup_time_t *get_wakeup_time; | 260 | efi_get_wakeup_time_t *get_wakeup_time; |
@@ -292,6 +294,8 @@ extern void efi_enter_virtual_mode (void); /* switch EFI to virtual mode, if pos | |||
292 | extern u64 efi_get_iobase (void); | 294 | extern u64 efi_get_iobase (void); |
293 | extern u32 efi_mem_type (unsigned long phys_addr); | 295 | extern u32 efi_mem_type (unsigned long phys_addr); |
294 | extern u64 efi_mem_attributes (unsigned long phys_addr); | 296 | extern u64 efi_mem_attributes (unsigned long phys_addr); |
297 | extern int efi_mem_attribute_range (unsigned long phys_addr, unsigned long size, | ||
298 | u64 attr); | ||
295 | extern int __init efi_uart_console_only (void); | 299 | extern int __init efi_uart_console_only (void); |
296 | extern void efi_initialize_iomem_resources(struct resource *code_resource, | 300 | extern void efi_initialize_iomem_resources(struct resource *code_resource, |
297 | struct resource *data_resource); | 301 | struct resource *data_resource); |
diff --git a/include/linux/efs_fs.h b/include/linux/efs_fs.h index 28f368c526fb..fbfa6b52e2fb 100644 --- a/include/linux/efs_fs.h +++ b/include/linux/efs_fs.h | |||
@@ -37,7 +37,7 @@ static inline struct efs_sb_info *SUPER_INFO(struct super_block *sb) | |||
37 | struct statfs; | 37 | struct statfs; |
38 | 38 | ||
39 | extern struct inode_operations efs_dir_inode_operations; | 39 | extern struct inode_operations efs_dir_inode_operations; |
40 | extern struct file_operations efs_dir_operations; | 40 | extern const struct file_operations efs_dir_operations; |
41 | extern struct address_space_operations efs_symlink_aops; | 41 | extern struct address_space_operations efs_symlink_aops; |
42 | 42 | ||
43 | extern void efs_read_inode(struct inode *); | 43 | extern void efs_read_inode(struct inode *); |
diff --git a/include/linux/ext3_fs.h b/include/linux/ext3_fs.h index e7239f2f97a1..3ade6a4e3bdd 100644 --- a/include/linux/ext3_fs.h +++ b/include/linux/ext3_fs.h | |||
@@ -36,7 +36,8 @@ struct statfs; | |||
36 | * Define EXT3_RESERVATION to reserve data blocks for expanding files | 36 | * Define EXT3_RESERVATION to reserve data blocks for expanding files |
37 | */ | 37 | */ |
38 | #define EXT3_DEFAULT_RESERVE_BLOCKS 8 | 38 | #define EXT3_DEFAULT_RESERVE_BLOCKS 8 |
39 | #define EXT3_MAX_RESERVE_BLOCKS 1024 | 39 | /*max window size: 1024(direct blocks) + 3([t,d]indirect blocks) */ |
40 | #define EXT3_MAX_RESERVE_BLOCKS 1027 | ||
40 | #define EXT3_RESERVE_WINDOW_NOT_ALLOCATED 0 | 41 | #define EXT3_RESERVE_WINDOW_NOT_ALLOCATED 0 |
41 | /* | 42 | /* |
42 | * Always enable hashed directories | 43 | * Always enable hashed directories |
@@ -732,6 +733,8 @@ struct dir_private_info { | |||
732 | extern int ext3_bg_has_super(struct super_block *sb, int group); | 733 | extern int ext3_bg_has_super(struct super_block *sb, int group); |
733 | extern unsigned long ext3_bg_num_gdb(struct super_block *sb, int group); | 734 | extern unsigned long ext3_bg_num_gdb(struct super_block *sb, int group); |
734 | extern int ext3_new_block (handle_t *, struct inode *, unsigned long, int *); | 735 | extern int ext3_new_block (handle_t *, struct inode *, unsigned long, int *); |
736 | extern int ext3_new_blocks (handle_t *, struct inode *, unsigned long, | ||
737 | unsigned long *, int *); | ||
735 | extern void ext3_free_blocks (handle_t *, struct inode *, unsigned long, | 738 | extern void ext3_free_blocks (handle_t *, struct inode *, unsigned long, |
736 | unsigned long); | 739 | unsigned long); |
737 | extern void ext3_free_blocks_sb (handle_t *, struct super_block *, | 740 | extern void ext3_free_blocks_sb (handle_t *, struct super_block *, |
@@ -775,9 +778,9 @@ extern unsigned long ext3_count_free (struct buffer_head *, unsigned); | |||
775 | int ext3_forget(handle_t *, int, struct inode *, struct buffer_head *, int); | 778 | int ext3_forget(handle_t *, int, struct inode *, struct buffer_head *, int); |
776 | struct buffer_head * ext3_getblk (handle_t *, struct inode *, long, int, int *); | 779 | struct buffer_head * ext3_getblk (handle_t *, struct inode *, long, int, int *); |
777 | struct buffer_head * ext3_bread (handle_t *, struct inode *, int, int, int *); | 780 | struct buffer_head * ext3_bread (handle_t *, struct inode *, int, int, int *); |
778 | int ext3_get_block_handle(handle_t *handle, struct inode *inode, | 781 | int ext3_get_blocks_handle(handle_t *handle, struct inode *inode, |
779 | sector_t iblock, struct buffer_head *bh_result, int create, | 782 | sector_t iblock, unsigned long maxblocks, struct buffer_head *bh_result, |
780 | int extend_disksize); | 783 | int create, int extend_disksize); |
781 | 784 | ||
782 | extern void ext3_read_inode (struct inode *); | 785 | extern void ext3_read_inode (struct inode *); |
783 | extern int ext3_write_inode (struct inode *, int); | 786 | extern int ext3_write_inode (struct inode *, int); |
@@ -830,11 +833,11 @@ do { \ | |||
830 | */ | 833 | */ |
831 | 834 | ||
832 | /* dir.c */ | 835 | /* dir.c */ |
833 | extern struct file_operations ext3_dir_operations; | 836 | extern const struct file_operations ext3_dir_operations; |
834 | 837 | ||
835 | /* file.c */ | 838 | /* file.c */ |
836 | extern struct inode_operations ext3_file_inode_operations; | 839 | extern struct inode_operations ext3_file_inode_operations; |
837 | extern struct file_operations ext3_file_operations; | 840 | extern const struct file_operations ext3_file_operations; |
838 | 841 | ||
839 | /* namei.c */ | 842 | /* namei.c */ |
840 | extern struct inode_operations ext3_dir_inode_operations; | 843 | extern struct inode_operations ext3_dir_inode_operations; |
diff --git a/include/linux/fb.h b/include/linux/fb.h index 2cb19e6503aa..d03fadfcafe3 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h | |||
@@ -734,7 +734,7 @@ struct fb_tile_ops { | |||
734 | 734 | ||
735 | /* A driver may set this flag to indicate that it does want a set_par to be | 735 | /* A driver may set this flag to indicate that it does want a set_par to be |
736 | * called every time when fbcon_switch is executed. The advantage is that with | 736 | * called every time when fbcon_switch is executed. The advantage is that with |
737 | * this flag set you can really be shure that set_par is always called before | 737 | * this flag set you can really be sure that set_par is always called before |
738 | * any of the functions dependant on the correct hardware state or altering | 738 | * any of the functions dependant on the correct hardware state or altering |
739 | * that state, even if you are using some broken X releases. The disadvantage | 739 | * that state, even if you are using some broken X releases. The disadvantage |
740 | * is that it introduces unwanted delays to every console switch if set_par | 740 | * is that it introduces unwanted delays to every console switch if set_par |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 215696a0f16f..408fe89498f4 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -65,6 +65,11 @@ extern int dir_notify_enable; | |||
65 | #define FMODE_PREAD 8 | 65 | #define FMODE_PREAD 8 |
66 | #define FMODE_PWRITE FMODE_PREAD /* These go hand in hand */ | 66 | #define FMODE_PWRITE FMODE_PREAD /* These go hand in hand */ |
67 | 67 | ||
68 | /* File is being opened for execution. Primary users of this flag are | ||
69 | distributed filesystems that can use it to achieve correct ETXTBUSY | ||
70 | behavior for cross-node execution/opening_for_writing of files */ | ||
71 | #define FMODE_EXEC 16 | ||
72 | |||
68 | #define RW_MASK 1 | 73 | #define RW_MASK 1 |
69 | #define RWA_MASK 2 | 74 | #define RWA_MASK 2 |
70 | #define READ 0 | 75 | #define READ 0 |
@@ -247,9 +252,6 @@ extern void __init files_init(unsigned long); | |||
247 | struct buffer_head; | 252 | struct buffer_head; |
248 | typedef int (get_block_t)(struct inode *inode, sector_t iblock, | 253 | typedef int (get_block_t)(struct inode *inode, sector_t iblock, |
249 | struct buffer_head *bh_result, int create); | 254 | struct buffer_head *bh_result, int create); |
250 | typedef int (get_blocks_t)(struct inode *inode, sector_t iblock, | ||
251 | unsigned long max_blocks, | ||
252 | struct buffer_head *bh_result, int create); | ||
253 | typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset, | 255 | typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset, |
254 | ssize_t bytes, void *private); | 256 | ssize_t bytes, void *private); |
255 | 257 | ||
@@ -345,7 +347,7 @@ struct writeback_control; | |||
345 | struct address_space_operations { | 347 | struct address_space_operations { |
346 | int (*writepage)(struct page *page, struct writeback_control *wbc); | 348 | int (*writepage)(struct page *page, struct writeback_control *wbc); |
347 | int (*readpage)(struct file *, struct page *); | 349 | int (*readpage)(struct file *, struct page *); |
348 | int (*sync_page)(struct page *); | 350 | void (*sync_page)(struct page *); |
349 | 351 | ||
350 | /* Write back some dirty pages from this mapping. */ | 352 | /* Write back some dirty pages from this mapping. */ |
351 | int (*writepages)(struct address_space *, struct writeback_control *); | 353 | int (*writepages)(struct address_space *, struct writeback_control *); |
@@ -364,7 +366,7 @@ struct address_space_operations { | |||
364 | int (*commit_write)(struct file *, struct page *, unsigned, unsigned); | 366 | int (*commit_write)(struct file *, struct page *, unsigned, unsigned); |
365 | /* Unfortunately this kludge is needed for FIBMAP. Don't use it */ | 367 | /* Unfortunately this kludge is needed for FIBMAP. Don't use it */ |
366 | sector_t (*bmap)(struct address_space *, sector_t); | 368 | sector_t (*bmap)(struct address_space *, sector_t); |
367 | int (*invalidatepage) (struct page *, unsigned long); | 369 | void (*invalidatepage) (struct page *, unsigned long); |
368 | int (*releasepage) (struct page *, gfp_t); | 370 | int (*releasepage) (struct page *, gfp_t); |
369 | ssize_t (*direct_IO)(int, struct kiocb *, const struct iovec *iov, | 371 | ssize_t (*direct_IO)(int, struct kiocb *, const struct iovec *iov, |
370 | loff_t offset, unsigned long nr_segs); | 372 | loff_t offset, unsigned long nr_segs); |
@@ -408,6 +410,9 @@ struct block_device { | |||
408 | struct list_head bd_inodes; | 410 | struct list_head bd_inodes; |
409 | void * bd_holder; | 411 | void * bd_holder; |
410 | int bd_holders; | 412 | int bd_holders; |
413 | #ifdef CONFIG_SYSFS | ||
414 | struct list_head bd_holder_list; | ||
415 | #endif | ||
411 | struct block_device * bd_contains; | 416 | struct block_device * bd_contains; |
412 | unsigned bd_block_size; | 417 | unsigned bd_block_size; |
413 | struct hd_struct * bd_part; | 418 | struct hd_struct * bd_part; |
@@ -485,13 +490,13 @@ struct inode { | |||
485 | unsigned int i_blkbits; | 490 | unsigned int i_blkbits; |
486 | unsigned long i_blksize; | 491 | unsigned long i_blksize; |
487 | unsigned long i_version; | 492 | unsigned long i_version; |
488 | unsigned long i_blocks; | 493 | blkcnt_t i_blocks; |
489 | unsigned short i_bytes; | 494 | unsigned short i_bytes; |
490 | spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ | 495 | spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ |
491 | struct mutex i_mutex; | 496 | struct mutex i_mutex; |
492 | struct rw_semaphore i_alloc_sem; | 497 | struct rw_semaphore i_alloc_sem; |
493 | struct inode_operations *i_op; | 498 | struct inode_operations *i_op; |
494 | struct file_operations *i_fop; /* former ->i_op->default_file_ops */ | 499 | const struct file_operations *i_fop; /* former ->i_op->default_file_ops */ |
495 | struct super_block *i_sb; | 500 | struct super_block *i_sb; |
496 | struct file_lock *i_flock; | 501 | struct file_lock *i_flock; |
497 | struct address_space *i_mapping; | 502 | struct address_space *i_mapping; |
@@ -631,7 +636,7 @@ struct file { | |||
631 | } f_u; | 636 | } f_u; |
632 | struct dentry *f_dentry; | 637 | struct dentry *f_dentry; |
633 | struct vfsmount *f_vfsmnt; | 638 | struct vfsmount *f_vfsmnt; |
634 | struct file_operations *f_op; | 639 | const struct file_operations *f_op; |
635 | atomic_t f_count; | 640 | atomic_t f_count; |
636 | unsigned int f_flags; | 641 | unsigned int f_flags; |
637 | mode_t f_mode; | 642 | mode_t f_mode; |
@@ -673,7 +678,6 @@ extern spinlock_t files_lock; | |||
673 | #define FL_POSIX 1 | 678 | #define FL_POSIX 1 |
674 | #define FL_FLOCK 2 | 679 | #define FL_FLOCK 2 |
675 | #define FL_ACCESS 8 /* not trying to lock, just looking */ | 680 | #define FL_ACCESS 8 /* not trying to lock, just looking */ |
676 | #define FL_LOCKD 16 /* lock held by rpc.lockd */ | ||
677 | #define FL_LEASE 32 /* lease held on this file */ | 681 | #define FL_LEASE 32 /* lease held on this file */ |
678 | #define FL_SLEEP 128 /* A blocking lock */ | 682 | #define FL_SLEEP 128 /* A blocking lock */ |
679 | 683 | ||
@@ -737,8 +741,6 @@ struct file_lock { | |||
737 | #define OFFT_OFFSET_MAX INT_LIMIT(off_t) | 741 | #define OFFT_OFFSET_MAX INT_LIMIT(off_t) |
738 | #endif | 742 | #endif |
739 | 743 | ||
740 | extern struct list_head file_lock_list; | ||
741 | |||
742 | #include <linux/fcntl.h> | 744 | #include <linux/fcntl.h> |
743 | 745 | ||
744 | extern int fcntl_getlk(struct file *, struct flock __user *); | 746 | extern int fcntl_getlk(struct file *, struct flock __user *); |
@@ -760,10 +762,10 @@ extern void locks_init_lock(struct file_lock *); | |||
760 | extern void locks_copy_lock(struct file_lock *, struct file_lock *); | 762 | extern void locks_copy_lock(struct file_lock *, struct file_lock *); |
761 | extern void locks_remove_posix(struct file *, fl_owner_t); | 763 | extern void locks_remove_posix(struct file *, fl_owner_t); |
762 | extern void locks_remove_flock(struct file *); | 764 | extern void locks_remove_flock(struct file *); |
763 | extern struct file_lock *posix_test_lock(struct file *, struct file_lock *); | 765 | extern int posix_test_lock(struct file *, struct file_lock *, struct file_lock *); |
766 | extern int posix_lock_file_conf(struct file *, struct file_lock *, struct file_lock *); | ||
764 | extern int posix_lock_file(struct file *, struct file_lock *); | 767 | extern int posix_lock_file(struct file *, struct file_lock *); |
765 | extern int posix_lock_file_wait(struct file *, struct file_lock *); | 768 | extern int posix_lock_file_wait(struct file *, struct file_lock *); |
766 | extern void posix_block_lock(struct file_lock *, struct file_lock *); | ||
767 | extern int posix_unblock_lock(struct file *, struct file_lock *); | 769 | extern int posix_unblock_lock(struct file *, struct file_lock *); |
768 | extern int posix_locks_deadlock(struct file_lock *, struct file_lock *); | 770 | extern int posix_locks_deadlock(struct file_lock *, struct file_lock *); |
769 | extern int flock_lock_file_wait(struct file *filp, struct file_lock *fl); | 771 | extern int flock_lock_file_wait(struct file *filp, struct file_lock *fl); |
@@ -1092,6 +1094,7 @@ struct super_operations { | |||
1092 | void (*umount_begin) (struct super_block *); | 1094 | void (*umount_begin) (struct super_block *); |
1093 | 1095 | ||
1094 | int (*show_options)(struct seq_file *, struct vfsmount *); | 1096 | int (*show_options)(struct seq_file *, struct vfsmount *); |
1097 | int (*show_stats)(struct seq_file *, struct vfsmount *); | ||
1095 | 1098 | ||
1096 | ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t); | 1099 | ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t); |
1097 | ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); | 1100 | ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); |
@@ -1387,11 +1390,11 @@ extern void bd_set_size(struct block_device *, loff_t size); | |||
1387 | extern void bd_forget(struct inode *inode); | 1390 | extern void bd_forget(struct inode *inode); |
1388 | extern void bdput(struct block_device *); | 1391 | extern void bdput(struct block_device *); |
1389 | extern struct block_device *open_by_devnum(dev_t, unsigned); | 1392 | extern struct block_device *open_by_devnum(dev_t, unsigned); |
1390 | extern struct file_operations def_blk_fops; | 1393 | extern const struct file_operations def_blk_fops; |
1391 | extern struct address_space_operations def_blk_aops; | 1394 | extern struct address_space_operations def_blk_aops; |
1392 | extern struct file_operations def_chr_fops; | 1395 | extern const struct file_operations def_chr_fops; |
1393 | extern struct file_operations bad_sock_fops; | 1396 | extern const struct file_operations bad_sock_fops; |
1394 | extern struct file_operations def_fifo_fops; | 1397 | extern const struct file_operations def_fifo_fops; |
1395 | extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long); | 1398 | extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long); |
1396 | extern int blkdev_ioctl(struct inode *, struct file *, unsigned, unsigned long); | 1399 | extern int blkdev_ioctl(struct inode *, struct file *, unsigned, unsigned long); |
1397 | extern long compat_blkdev_ioctl(struct file *, unsigned, unsigned long); | 1400 | extern long compat_blkdev_ioctl(struct file *, unsigned, unsigned long); |
@@ -1399,12 +1402,19 @@ extern int blkdev_get(struct block_device *, mode_t, unsigned); | |||
1399 | extern int blkdev_put(struct block_device *); | 1402 | extern int blkdev_put(struct block_device *); |
1400 | extern int bd_claim(struct block_device *, void *); | 1403 | extern int bd_claim(struct block_device *, void *); |
1401 | extern void bd_release(struct block_device *); | 1404 | extern void bd_release(struct block_device *); |
1405 | #ifdef CONFIG_SYSFS | ||
1406 | extern int bd_claim_by_disk(struct block_device *, void *, struct gendisk *); | ||
1407 | extern void bd_release_from_disk(struct block_device *, struct gendisk *); | ||
1408 | #else | ||
1409 | #define bd_claim_by_disk(bdev, holder, disk) bd_claim(bdev, holder) | ||
1410 | #define bd_release_from_disk(bdev, disk) bd_release(bdev) | ||
1411 | #endif | ||
1402 | 1412 | ||
1403 | /* fs/char_dev.c */ | 1413 | /* fs/char_dev.c */ |
1404 | extern int alloc_chrdev_region(dev_t *, unsigned, unsigned, const char *); | 1414 | extern int alloc_chrdev_region(dev_t *, unsigned, unsigned, const char *); |
1405 | extern int register_chrdev_region(dev_t, unsigned, const char *); | 1415 | extern int register_chrdev_region(dev_t, unsigned, const char *); |
1406 | extern int register_chrdev(unsigned int, const char *, | 1416 | extern int register_chrdev(unsigned int, const char *, |
1407 | struct file_operations *); | 1417 | const struct file_operations *); |
1408 | extern int unregister_chrdev(unsigned int, const char *); | 1418 | extern int unregister_chrdev(unsigned int, const char *); |
1409 | extern void unregister_chrdev_region(dev_t, unsigned); | 1419 | extern void unregister_chrdev_region(dev_t, unsigned); |
1410 | extern int chrdev_open(struct inode *, struct file *); | 1420 | extern int chrdev_open(struct inode *, struct file *); |
@@ -1434,9 +1444,9 @@ extern void init_special_inode(struct inode *, umode_t, dev_t); | |||
1434 | extern void make_bad_inode(struct inode *); | 1444 | extern void make_bad_inode(struct inode *); |
1435 | extern int is_bad_inode(struct inode *); | 1445 | extern int is_bad_inode(struct inode *); |
1436 | 1446 | ||
1437 | extern struct file_operations read_fifo_fops; | 1447 | extern const struct file_operations read_fifo_fops; |
1438 | extern struct file_operations write_fifo_fops; | 1448 | extern const struct file_operations write_fifo_fops; |
1439 | extern struct file_operations rdwr_fifo_fops; | 1449 | extern const struct file_operations rdwr_fifo_fops; |
1440 | 1450 | ||
1441 | extern int fs_may_remount_ro(struct super_block *); | 1451 | extern int fs_may_remount_ro(struct super_block *); |
1442 | 1452 | ||
@@ -1558,7 +1568,6 @@ extern void destroy_inode(struct inode *); | |||
1558 | extern struct inode *new_inode(struct super_block *); | 1568 | extern struct inode *new_inode(struct super_block *); |
1559 | extern int remove_suid(struct dentry *); | 1569 | extern int remove_suid(struct dentry *); |
1560 | extern void remove_dquot_ref(struct super_block *, int, struct list_head *); | 1570 | extern void remove_dquot_ref(struct super_block *, int, struct list_head *); |
1561 | extern struct mutex iprune_mutex; | ||
1562 | 1571 | ||
1563 | extern void __insert_inode_hash(struct inode *, unsigned long hashval); | 1572 | extern void __insert_inode_hash(struct inode *, unsigned long hashval); |
1564 | extern void remove_inode_hash(struct inode *); | 1573 | extern void remove_inode_hash(struct inode *); |
@@ -1643,7 +1652,7 @@ static inline void do_generic_file_read(struct file * filp, loff_t *ppos, | |||
1643 | 1652 | ||
1644 | ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, | 1653 | ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, |
1645 | struct block_device *bdev, const struct iovec *iov, loff_t offset, | 1654 | struct block_device *bdev, const struct iovec *iov, loff_t offset, |
1646 | unsigned long nr_segs, get_blocks_t get_blocks, dio_iodone_t end_io, | 1655 | unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io, |
1647 | int lock_type); | 1656 | int lock_type); |
1648 | 1657 | ||
1649 | enum { | 1658 | enum { |
@@ -1654,32 +1663,32 @@ enum { | |||
1654 | 1663 | ||
1655 | static inline ssize_t blockdev_direct_IO(int rw, struct kiocb *iocb, | 1664 | static inline ssize_t blockdev_direct_IO(int rw, struct kiocb *iocb, |
1656 | struct inode *inode, struct block_device *bdev, const struct iovec *iov, | 1665 | struct inode *inode, struct block_device *bdev, const struct iovec *iov, |
1657 | loff_t offset, unsigned long nr_segs, get_blocks_t get_blocks, | 1666 | loff_t offset, unsigned long nr_segs, get_block_t get_block, |
1658 | dio_iodone_t end_io) | 1667 | dio_iodone_t end_io) |
1659 | { | 1668 | { |
1660 | return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset, | 1669 | return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset, |
1661 | nr_segs, get_blocks, end_io, DIO_LOCKING); | 1670 | nr_segs, get_block, end_io, DIO_LOCKING); |
1662 | } | 1671 | } |
1663 | 1672 | ||
1664 | static inline ssize_t blockdev_direct_IO_no_locking(int rw, struct kiocb *iocb, | 1673 | static inline ssize_t blockdev_direct_IO_no_locking(int rw, struct kiocb *iocb, |
1665 | struct inode *inode, struct block_device *bdev, const struct iovec *iov, | 1674 | struct inode *inode, struct block_device *bdev, const struct iovec *iov, |
1666 | loff_t offset, unsigned long nr_segs, get_blocks_t get_blocks, | 1675 | loff_t offset, unsigned long nr_segs, get_block_t get_block, |
1667 | dio_iodone_t end_io) | 1676 | dio_iodone_t end_io) |
1668 | { | 1677 | { |
1669 | return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset, | 1678 | return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset, |
1670 | nr_segs, get_blocks, end_io, DIO_NO_LOCKING); | 1679 | nr_segs, get_block, end_io, DIO_NO_LOCKING); |
1671 | } | 1680 | } |
1672 | 1681 | ||
1673 | static inline ssize_t blockdev_direct_IO_own_locking(int rw, struct kiocb *iocb, | 1682 | static inline ssize_t blockdev_direct_IO_own_locking(int rw, struct kiocb *iocb, |
1674 | struct inode *inode, struct block_device *bdev, const struct iovec *iov, | 1683 | struct inode *inode, struct block_device *bdev, const struct iovec *iov, |
1675 | loff_t offset, unsigned long nr_segs, get_blocks_t get_blocks, | 1684 | loff_t offset, unsigned long nr_segs, get_block_t get_block, |
1676 | dio_iodone_t end_io) | 1685 | dio_iodone_t end_io) |
1677 | { | 1686 | { |
1678 | return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset, | 1687 | return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset, |
1679 | nr_segs, get_blocks, end_io, DIO_OWN_LOCKING); | 1688 | nr_segs, get_block, end_io, DIO_OWN_LOCKING); |
1680 | } | 1689 | } |
1681 | 1690 | ||
1682 | extern struct file_operations generic_ro_fops; | 1691 | extern const struct file_operations generic_ro_fops; |
1683 | 1692 | ||
1684 | #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m)) | 1693 | #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m)) |
1685 | 1694 | ||
@@ -1735,9 +1744,9 @@ extern int simple_commit_write(struct file *file, struct page *page, | |||
1735 | 1744 | ||
1736 | extern struct dentry *simple_lookup(struct inode *, struct dentry *, struct nameidata *); | 1745 | extern struct dentry *simple_lookup(struct inode *, struct dentry *, struct nameidata *); |
1737 | extern ssize_t generic_read_dir(struct file *, char __user *, size_t, loff_t *); | 1746 | extern ssize_t generic_read_dir(struct file *, char __user *, size_t, loff_t *); |
1738 | extern struct file_operations simple_dir_operations; | 1747 | extern const struct file_operations simple_dir_operations; |
1739 | extern struct inode_operations simple_dir_inode_operations; | 1748 | extern struct inode_operations simple_dir_inode_operations; |
1740 | struct tree_descr { char *name; struct file_operations *ops; int mode; }; | 1749 | struct tree_descr { char *name; const struct file_operations *ops; int mode; }; |
1741 | struct dentry *d_alloc_name(struct dentry *, const char *); | 1750 | struct dentry *d_alloc_name(struct dentry *, const char *); |
1742 | extern int simple_fill_super(struct super_block *, int, struct tree_descr *); | 1751 | extern int simple_fill_super(struct super_block *, int, struct tree_descr *); |
1743 | extern int simple_pin_fs(char *name, struct vfsmount **mount, int *count); | 1752 | extern int simple_pin_fs(char *name, struct vfsmount **mount, int *count); |
diff --git a/include/linux/fsnotify.h b/include/linux/fsnotify.h index 03b8e7932b83..11438eff4d44 100644 --- a/include/linux/fsnotify.h +++ b/include/linux/fsnotify.h | |||
@@ -15,6 +15,26 @@ | |||
15 | 15 | ||
16 | #include <linux/dnotify.h> | 16 | #include <linux/dnotify.h> |
17 | #include <linux/inotify.h> | 17 | #include <linux/inotify.h> |
18 | #include <linux/audit.h> | ||
19 | |||
20 | /* | ||
21 | * fsnotify_d_instantiate - instantiate a dentry for inode | ||
22 | * Called with dcache_lock held. | ||
23 | */ | ||
24 | static inline void fsnotify_d_instantiate(struct dentry *entry, | ||
25 | struct inode *inode) | ||
26 | { | ||
27 | inotify_d_instantiate(entry, inode); | ||
28 | } | ||
29 | |||
30 | /* | ||
31 | * fsnotify_d_move - entry has been moved | ||
32 | * Called with dcache_lock and entry->d_lock held. | ||
33 | */ | ||
34 | static inline void fsnotify_d_move(struct dentry *entry) | ||
35 | { | ||
36 | inotify_d_move(entry); | ||
37 | } | ||
18 | 38 | ||
19 | /* | 39 | /* |
20 | * fsnotify_move - file old_name at old_dir was moved to new_name at new_dir | 40 | * fsnotify_move - file old_name at old_dir was moved to new_name at new_dir |
@@ -45,6 +65,8 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir, | |||
45 | if (source) { | 65 | if (source) { |
46 | inotify_inode_queue_event(source, IN_MOVE_SELF, 0, NULL); | 66 | inotify_inode_queue_event(source, IN_MOVE_SELF, 0, NULL); |
47 | } | 67 | } |
68 | audit_inode_child(old_name, source, old_dir->i_ino); | ||
69 | audit_inode_child(new_name, target, new_dir->i_ino); | ||
48 | } | 70 | } |
49 | 71 | ||
50 | /* | 72 | /* |
@@ -70,19 +92,22 @@ static inline void fsnotify_inoderemove(struct inode *inode) | |||
70 | /* | 92 | /* |
71 | * fsnotify_create - 'name' was linked in | 93 | * fsnotify_create - 'name' was linked in |
72 | */ | 94 | */ |
73 | static inline void fsnotify_create(struct inode *inode, const char *name) | 95 | static inline void fsnotify_create(struct inode *inode, struct dentry *dentry) |
74 | { | 96 | { |
75 | inode_dir_notify(inode, DN_CREATE); | 97 | inode_dir_notify(inode, DN_CREATE); |
76 | inotify_inode_queue_event(inode, IN_CREATE, 0, name); | 98 | inotify_inode_queue_event(inode, IN_CREATE, 0, dentry->d_name.name); |
99 | audit_inode_child(dentry->d_name.name, dentry->d_inode, inode->i_ino); | ||
77 | } | 100 | } |
78 | 101 | ||
79 | /* | 102 | /* |
80 | * fsnotify_mkdir - directory 'name' was created | 103 | * fsnotify_mkdir - directory 'name' was created |
81 | */ | 104 | */ |
82 | static inline void fsnotify_mkdir(struct inode *inode, const char *name) | 105 | static inline void fsnotify_mkdir(struct inode *inode, struct dentry *dentry) |
83 | { | 106 | { |
84 | inode_dir_notify(inode, DN_CREATE); | 107 | inode_dir_notify(inode, DN_CREATE); |
85 | inotify_inode_queue_event(inode, IN_CREATE | IN_ISDIR, 0, name); | 108 | inotify_inode_queue_event(inode, IN_CREATE | IN_ISDIR, 0, |
109 | dentry->d_name.name); | ||
110 | audit_inode_child(dentry->d_name.name, dentry->d_inode, inode->i_ino); | ||
86 | } | 111 | } |
87 | 112 | ||
88 | /* | 113 | /* |
diff --git a/include/linux/futex.h b/include/linux/futex.h index 10f96c31971e..966a5b3da439 100644 --- a/include/linux/futex.h +++ b/include/linux/futex.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef _LINUX_FUTEX_H | 1 | #ifndef _LINUX_FUTEX_H |
2 | #define _LINUX_FUTEX_H | 2 | #define _LINUX_FUTEX_H |
3 | 3 | ||
4 | #include <linux/sched.h> | ||
5 | |||
4 | /* Second argument to futex syscall */ | 6 | /* Second argument to futex syscall */ |
5 | 7 | ||
6 | 8 | ||
@@ -11,10 +13,97 @@ | |||
11 | #define FUTEX_CMP_REQUEUE 4 | 13 | #define FUTEX_CMP_REQUEUE 4 |
12 | #define FUTEX_WAKE_OP 5 | 14 | #define FUTEX_WAKE_OP 5 |
13 | 15 | ||
16 | /* | ||
17 | * Support for robust futexes: the kernel cleans up held futexes at | ||
18 | * thread exit time. | ||
19 | */ | ||
20 | |||
21 | /* | ||
22 | * Per-lock list entry - embedded in user-space locks, somewhere close | ||
23 | * to the futex field. (Note: user-space uses a double-linked list to | ||
24 | * achieve O(1) list add and remove, but the kernel only needs to know | ||
25 | * about the forward link) | ||
26 | * | ||
27 | * NOTE: this structure is part of the syscall ABI, and must not be | ||
28 | * changed. | ||
29 | */ | ||
30 | struct robust_list { | ||
31 | struct robust_list __user *next; | ||
32 | }; | ||
33 | |||
34 | /* | ||
35 | * Per-thread list head: | ||
36 | * | ||
37 | * NOTE: this structure is part of the syscall ABI, and must only be | ||
38 | * changed if the change is first communicated with the glibc folks. | ||
39 | * (When an incompatible change is done, we'll increase the structure | ||
40 | * size, which glibc will detect) | ||
41 | */ | ||
42 | struct robust_list_head { | ||
43 | /* | ||
44 | * The head of the list. Points back to itself if empty: | ||
45 | */ | ||
46 | struct robust_list list; | ||
47 | |||
48 | /* | ||
49 | * This relative offset is set by user-space, it gives the kernel | ||
50 | * the relative position of the futex field to examine. This way | ||
51 | * we keep userspace flexible, to freely shape its data-structure, | ||
52 | * without hardcoding any particular offset into the kernel: | ||
53 | */ | ||
54 | long futex_offset; | ||
55 | |||
56 | /* | ||
57 | * The death of the thread may race with userspace setting | ||
58 | * up a lock's links. So to handle this race, userspace first | ||
59 | * sets this field to the address of the to-be-taken lock, | ||
60 | * then does the lock acquire, and then adds itself to the | ||
61 | * list, and then clears this field. Hence the kernel will | ||
62 | * always have full knowledge of all locks that the thread | ||
63 | * _might_ have taken. We check the owner TID in any case, | ||
64 | * so only truly owned locks will be handled. | ||
65 | */ | ||
66 | struct robust_list __user *list_op_pending; | ||
67 | }; | ||
68 | |||
69 | /* | ||
70 | * Are there any waiters for this robust futex: | ||
71 | */ | ||
72 | #define FUTEX_WAITERS 0x80000000 | ||
73 | |||
74 | /* | ||
75 | * The kernel signals via this bit that a thread holding a futex | ||
76 | * has exited without unlocking the futex. The kernel also does | ||
77 | * a FUTEX_WAKE on such futexes, after setting the bit, to wake | ||
78 | * up any possible waiters: | ||
79 | */ | ||
80 | #define FUTEX_OWNER_DIED 0x40000000 | ||
81 | |||
82 | /* | ||
83 | * The rest of the robust-futex field is for the TID: | ||
84 | */ | ||
85 | #define FUTEX_TID_MASK 0x3fffffff | ||
86 | |||
87 | /* | ||
88 | * This limit protects against a deliberately circular list. | ||
89 | * (Not worth introducing an rlimit for it) | ||
90 | */ | ||
91 | #define ROBUST_LIST_LIMIT 2048 | ||
92 | |||
14 | long do_futex(unsigned long uaddr, int op, int val, | 93 | long do_futex(unsigned long uaddr, int op, int val, |
15 | unsigned long timeout, unsigned long uaddr2, int val2, | 94 | unsigned long timeout, unsigned long uaddr2, int val2, |
16 | int val3); | 95 | int val3); |
17 | 96 | ||
97 | extern int handle_futex_death(u32 __user *uaddr, struct task_struct *curr); | ||
98 | |||
99 | #ifdef CONFIG_FUTEX | ||
100 | extern void exit_robust_list(struct task_struct *curr); | ||
101 | #else | ||
102 | static inline void exit_robust_list(struct task_struct *curr) | ||
103 | { | ||
104 | } | ||
105 | #endif | ||
106 | |||
18 | #define FUTEX_OP_SET 0 /* *(int *)UADDR2 = OPARG; */ | 107 | #define FUTEX_OP_SET 0 /* *(int *)UADDR2 = OPARG; */ |
19 | #define FUTEX_OP_ADD 1 /* *(int *)UADDR2 += OPARG; */ | 108 | #define FUTEX_OP_ADD 1 /* *(int *)UADDR2 += OPARG; */ |
20 | #define FUTEX_OP_OR 2 /* *(int *)UADDR2 |= OPARG; */ | 109 | #define FUTEX_OP_OR 2 /* *(int *)UADDR2 |= OPARG; */ |
diff --git a/include/linux/gameport.h b/include/linux/gameport.h index 2401dea2b867..9c8e6da2393b 100644 --- a/include/linux/gameport.h +++ b/include/linux/gameport.h | |||
@@ -119,7 +119,7 @@ static inline void gameport_set_name(struct gameport *gameport, const char *name | |||
119 | } | 119 | } |
120 | 120 | ||
121 | /* | 121 | /* |
122 | * Use the following fucntions to manipulate gameport's per-port | 122 | * Use the following functions to manipulate gameport's per-port |
123 | * driver-specific data. | 123 | * driver-specific data. |
124 | */ | 124 | */ |
125 | static inline void *gameport_get_drvdata(struct gameport *gameport) | 125 | static inline void *gameport_get_drvdata(struct gameport *gameport) |
@@ -133,7 +133,7 @@ static inline void gameport_set_drvdata(struct gameport *gameport, void *data) | |||
133 | } | 133 | } |
134 | 134 | ||
135 | /* | 135 | /* |
136 | * Use the following fucntions to pin gameport's driver in process context | 136 | * Use the following functions to pin gameport's driver in process context |
137 | */ | 137 | */ |
138 | static inline int gameport_pin_driver(struct gameport *gameport) | 138 | static inline int gameport_pin_driver(struct gameport *gameport) |
139 | { | 139 | { |
diff --git a/include/linux/genhd.h b/include/linux/genhd.h index fd647fde5ec1..10a27f29d692 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h | |||
@@ -78,6 +78,7 @@ struct hd_struct { | |||
78 | sector_t start_sect; | 78 | sector_t start_sect; |
79 | sector_t nr_sects; | 79 | sector_t nr_sects; |
80 | struct kobject kobj; | 80 | struct kobject kobj; |
81 | struct kobject *holder_dir; | ||
81 | unsigned ios[2], sectors[2]; /* READs and WRITEs */ | 82 | unsigned ios[2], sectors[2]; /* READs and WRITEs */ |
82 | int policy, partno; | 83 | int policy, partno; |
83 | }; | 84 | }; |
@@ -89,12 +90,12 @@ struct hd_struct { | |||
89 | #define GENHD_FL_SUPPRESS_PARTITION_INFO 32 | 90 | #define GENHD_FL_SUPPRESS_PARTITION_INFO 32 |
90 | 91 | ||
91 | struct disk_stats { | 92 | struct disk_stats { |
92 | unsigned sectors[2]; /* READs and WRITEs */ | 93 | unsigned long sectors[2]; /* READs and WRITEs */ |
93 | unsigned ios[2]; | 94 | unsigned long ios[2]; |
94 | unsigned merges[2]; | 95 | unsigned long merges[2]; |
95 | unsigned ticks[2]; | 96 | unsigned long ticks[2]; |
96 | unsigned io_ticks; | 97 | unsigned long io_ticks; |
97 | unsigned time_in_queue; | 98 | unsigned long time_in_queue; |
98 | }; | 99 | }; |
99 | 100 | ||
100 | struct gendisk { | 101 | struct gendisk { |
@@ -114,6 +115,8 @@ struct gendisk { | |||
114 | int number; /* more of the same */ | 115 | int number; /* more of the same */ |
115 | struct device *driverfs_dev; | 116 | struct device *driverfs_dev; |
116 | struct kobject kobj; | 117 | struct kobject kobj; |
118 | struct kobject *holder_dir; | ||
119 | struct kobject *slave_dir; | ||
117 | 120 | ||
118 | struct timer_rand_state *random; | 121 | struct timer_rand_state *random; |
119 | int policy; | 122 | int policy; |
@@ -149,14 +152,14 @@ struct disk_attribute { | |||
149 | ({ \ | 152 | ({ \ |
150 | typeof(gendiskp->dkstats->field) res = 0; \ | 153 | typeof(gendiskp->dkstats->field) res = 0; \ |
151 | int i; \ | 154 | int i; \ |
152 | for_each_cpu(i) \ | 155 | for_each_possible_cpu(i) \ |
153 | res += per_cpu_ptr(gendiskp->dkstats, i)->field; \ | 156 | res += per_cpu_ptr(gendiskp->dkstats, i)->field; \ |
154 | res; \ | 157 | res; \ |
155 | }) | 158 | }) |
156 | 159 | ||
157 | static inline void disk_stat_set_all(struct gendisk *gendiskp, int value) { | 160 | static inline void disk_stat_set_all(struct gendisk *gendiskp, int value) { |
158 | int i; | 161 | int i; |
159 | for_each_cpu(i) | 162 | for_each_possible_cpu(i) |
160 | memset(per_cpu_ptr(gendiskp->dkstats, i), value, | 163 | memset(per_cpu_ptr(gendiskp->dkstats, i), value, |
161 | sizeof (struct disk_stats)); | 164 | sizeof (struct disk_stats)); |
162 | } | 165 | } |
diff --git a/include/linux/gigaset_dev.h b/include/linux/gigaset_dev.h new file mode 100644 index 000000000000..70ad09c8ad1e --- /dev/null +++ b/include/linux/gigaset_dev.h | |||
@@ -0,0 +1,32 @@ | |||
1 | /* | ||
2 | * interface to user space for the gigaset driver | ||
3 | * | ||
4 | * Copyright (c) 2004 by Hansjoerg Lipp <hjlipp@web.de> | ||
5 | * | ||
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 as | ||
9 | * published by the Free Software Foundation; either version 2 of | ||
10 | * the License, or (at your option) any later version. | ||
11 | * ===================================================================== | ||
12 | * Version: $Id: gigaset_dev.h,v 1.4.4.4 2005/11/21 22:28:09 hjlipp Exp $ | ||
13 | * ===================================================================== | ||
14 | */ | ||
15 | |||
16 | #ifndef GIGASET_INTERFACE_H | ||
17 | #define GIGASET_INTERFACE_H | ||
18 | |||
19 | #include <linux/ioctl.h> | ||
20 | |||
21 | #define GIGASET_IOCTL 0x47 | ||
22 | |||
23 | #define GIGVER_DRIVER 0 | ||
24 | #define GIGVER_COMPAT 1 | ||
25 | #define GIGVER_FWBASE 2 | ||
26 | |||
27 | #define GIGASET_REDIR _IOWR (GIGASET_IOCTL, 0, int) | ||
28 | #define GIGASET_CONFIG _IOWR (GIGASET_IOCTL, 1, int) | ||
29 | #define GIGASET_BRKCHARS _IOW (GIGASET_IOCTL, 2, unsigned char[6]) //FIXME [6] okay? | ||
30 | #define GIGASET_VERSION _IOWR (GIGASET_IOCTL, 3, unsigned[4]) | ||
31 | |||
32 | #endif | ||
diff --git a/include/linux/highmem.h b/include/linux/highmem.h index 6bece9280eb7..892c4ea1b425 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h | |||
@@ -7,6 +7,18 @@ | |||
7 | 7 | ||
8 | #include <asm/cacheflush.h> | 8 | #include <asm/cacheflush.h> |
9 | 9 | ||
10 | #ifndef ARCH_HAS_FLUSH_ANON_PAGE | ||
11 | static inline void flush_anon_page(struct page *page, unsigned long vmaddr) | ||
12 | { | ||
13 | } | ||
14 | #endif | ||
15 | |||
16 | #ifndef ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE | ||
17 | static inline void flush_kernel_dcache_page(struct page *page) | ||
18 | { | ||
19 | } | ||
20 | #endif | ||
21 | |||
10 | #ifdef CONFIG_HIGHMEM | 22 | #ifdef CONFIG_HIGHMEM |
11 | 23 | ||
12 | #include <asm/highmem.h> | 24 | #include <asm/highmem.h> |
diff --git a/include/linux/hpet.h b/include/linux/hpet.h index 27238194b212..707f7cb9e795 100644 --- a/include/linux/hpet.h +++ b/include/linux/hpet.h | |||
@@ -3,6 +3,8 @@ | |||
3 | 3 | ||
4 | #include <linux/compiler.h> | 4 | #include <linux/compiler.h> |
5 | 5 | ||
6 | #ifdef __KERNEL__ | ||
7 | |||
6 | /* | 8 | /* |
7 | * Offsets into HPET Registers | 9 | * Offsets into HPET Registers |
8 | */ | 10 | */ |
@@ -85,22 +87,6 @@ struct hpet { | |||
85 | #define Tn_FSB_INT_ADDR_SHIFT (32UL) | 87 | #define Tn_FSB_INT_ADDR_SHIFT (32UL) |
86 | #define Tn_FSB_INT_VAL_MASK (0x00000000ffffffffULL) | 88 | #define Tn_FSB_INT_VAL_MASK (0x00000000ffffffffULL) |
87 | 89 | ||
88 | struct hpet_info { | ||
89 | unsigned long hi_ireqfreq; /* Hz */ | ||
90 | unsigned long hi_flags; /* information */ | ||
91 | unsigned short hi_hpet; | ||
92 | unsigned short hi_timer; | ||
93 | }; | ||
94 | |||
95 | #define HPET_INFO_PERIODIC 0x0001 /* timer is periodic */ | ||
96 | |||
97 | #define HPET_IE_ON _IO('h', 0x01) /* interrupt on */ | ||
98 | #define HPET_IE_OFF _IO('h', 0x02) /* interrupt off */ | ||
99 | #define HPET_INFO _IOR('h', 0x03, struct hpet_info) | ||
100 | #define HPET_EPI _IO('h', 0x04) /* enable periodic */ | ||
101 | #define HPET_DPI _IO('h', 0x05) /* disable periodic */ | ||
102 | #define HPET_IRQFREQ _IOW('h', 0x6, unsigned long) /* IRQFREQ usec */ | ||
103 | |||
104 | /* | 90 | /* |
105 | * exported interfaces | 91 | * exported interfaces |
106 | */ | 92 | */ |
@@ -133,4 +119,22 @@ int hpet_register(struct hpet_task *, int); | |||
133 | int hpet_unregister(struct hpet_task *); | 119 | int hpet_unregister(struct hpet_task *); |
134 | int hpet_control(struct hpet_task *, unsigned int, unsigned long); | 120 | int hpet_control(struct hpet_task *, unsigned int, unsigned long); |
135 | 121 | ||
122 | #endif /* __KERNEL__ */ | ||
123 | |||
124 | struct hpet_info { | ||
125 | unsigned long hi_ireqfreq; /* Hz */ | ||
126 | unsigned long hi_flags; /* information */ | ||
127 | unsigned short hi_hpet; | ||
128 | unsigned short hi_timer; | ||
129 | }; | ||
130 | |||
131 | #define HPET_INFO_PERIODIC 0x0001 /* timer is periodic */ | ||
132 | |||
133 | #define HPET_IE_ON _IO('h', 0x01) /* interrupt on */ | ||
134 | #define HPET_IE_OFF _IO('h', 0x02) /* interrupt off */ | ||
135 | #define HPET_INFO _IOR('h', 0x03, struct hpet_info) | ||
136 | #define HPET_EPI _IO('h', 0x04) /* enable periodic */ | ||
137 | #define HPET_DPI _IO('h', 0x05) /* disable periodic */ | ||
138 | #define HPET_IRQFREQ _IOW('h', 0x6, unsigned long) /* IRQFREQ usec */ | ||
139 | |||
136 | #endif /* !__HPET__ */ | 140 | #endif /* !__HPET__ */ |
diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h index 6401c31d6add..93830158348e 100644 --- a/include/linux/hrtimer.h +++ b/include/linux/hrtimer.h | |||
@@ -34,15 +34,7 @@ enum hrtimer_restart { | |||
34 | HRTIMER_RESTART, | 34 | HRTIMER_RESTART, |
35 | }; | 35 | }; |
36 | 36 | ||
37 | /* | 37 | #define HRTIMER_INACTIVE ((void *)1UL) |
38 | * Timer states: | ||
39 | */ | ||
40 | enum hrtimer_state { | ||
41 | HRTIMER_INACTIVE, /* Timer is inactive */ | ||
42 | HRTIMER_EXPIRED, /* Timer is expired */ | ||
43 | HRTIMER_RUNNING, /* Timer is running the callback function */ | ||
44 | HRTIMER_PENDING, /* Timer is pending */ | ||
45 | }; | ||
46 | 38 | ||
47 | struct hrtimer_base; | 39 | struct hrtimer_base; |
48 | 40 | ||
@@ -53,9 +45,7 @@ struct hrtimer_base; | |||
53 | * @expires: the absolute expiry time in the hrtimers internal | 45 | * @expires: the absolute expiry time in the hrtimers internal |
54 | * representation. The time is related to the clock on | 46 | * representation. The time is related to the clock on |
55 | * which the timer is based. | 47 | * which the timer is based. |
56 | * @state: state of the timer | ||
57 | * @function: timer expiry callback function | 48 | * @function: timer expiry callback function |
58 | * @data: argument for the callback function | ||
59 | * @base: pointer to the timer base (per cpu and per clock) | 49 | * @base: pointer to the timer base (per cpu and per clock) |
60 | * | 50 | * |
61 | * The hrtimer structure must be initialized by init_hrtimer_#CLOCKTYPE() | 51 | * The hrtimer structure must be initialized by init_hrtimer_#CLOCKTYPE() |
@@ -63,23 +53,23 @@ struct hrtimer_base; | |||
63 | struct hrtimer { | 53 | struct hrtimer { |
64 | struct rb_node node; | 54 | struct rb_node node; |
65 | ktime_t expires; | 55 | ktime_t expires; |
66 | enum hrtimer_state state; | 56 | int (*function)(struct hrtimer *); |
67 | int (*function)(void *); | ||
68 | void *data; | ||
69 | struct hrtimer_base *base; | 57 | struct hrtimer_base *base; |
70 | }; | 58 | }; |
71 | 59 | ||
72 | /** | 60 | /** |
73 | * struct hrtimer_base - the timer base for a specific clock | 61 | * struct hrtimer_base - the timer base for a specific clock |
74 | * | 62 | * |
75 | * @index: clock type index for per_cpu support when moving a timer | 63 | * @index: clock type index for per_cpu support when moving a timer |
76 | * to a base on another cpu. | 64 | * to a base on another cpu. |
77 | * @lock: lock protecting the base and associated timers | 65 | * @lock: lock protecting the base and associated timers |
78 | * @active: red black tree root node for the active timers | 66 | * @active: red black tree root node for the active timers |
79 | * @first: pointer to the timer node which expires first | 67 | * @first: pointer to the timer node which expires first |
80 | * @resolution: the resolution of the clock, in nanoseconds | 68 | * @resolution: the resolution of the clock, in nanoseconds |
81 | * @get_time: function to retrieve the current time of the clock | 69 | * @get_time: function to retrieve the current time of the clock |
82 | * @curr_timer: the timer which is executing a callback right now | 70 | * @get_sofirq_time: function to retrieve the current time from the softirq |
71 | * @curr_timer: the timer which is executing a callback right now | ||
72 | * @softirq_time: the time when running the hrtimer queue in the softirq | ||
83 | */ | 73 | */ |
84 | struct hrtimer_base { | 74 | struct hrtimer_base { |
85 | clockid_t index; | 75 | clockid_t index; |
@@ -88,7 +78,9 @@ struct hrtimer_base { | |||
88 | struct rb_node *first; | 78 | struct rb_node *first; |
89 | ktime_t resolution; | 79 | ktime_t resolution; |
90 | ktime_t (*get_time)(void); | 80 | ktime_t (*get_time)(void); |
81 | ktime_t (*get_softirq_time)(void); | ||
91 | struct hrtimer *curr_timer; | 82 | struct hrtimer *curr_timer; |
83 | ktime_t softirq_time; | ||
92 | }; | 84 | }; |
93 | 85 | ||
94 | /* | 86 | /* |
@@ -122,11 +114,12 @@ extern ktime_t hrtimer_get_next_event(void); | |||
122 | 114 | ||
123 | static inline int hrtimer_active(const struct hrtimer *timer) | 115 | static inline int hrtimer_active(const struct hrtimer *timer) |
124 | { | 116 | { |
125 | return timer->state == HRTIMER_PENDING; | 117 | return timer->node.rb_parent != HRTIMER_INACTIVE; |
126 | } | 118 | } |
127 | 119 | ||
128 | /* Forward a hrtimer so it expires after now: */ | 120 | /* Forward a hrtimer so it expires after now: */ |
129 | extern unsigned long hrtimer_forward(struct hrtimer *timer, ktime_t interval); | 121 | extern unsigned long |
122 | hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval); | ||
130 | 123 | ||
131 | /* Precise sleep: */ | 124 | /* Precise sleep: */ |
132 | extern long hrtimer_nanosleep(struct timespec *rqtp, | 125 | extern long hrtimer_nanosleep(struct timespec *rqtp, |
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index d6f1019625af..4c5e610fe442 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h | |||
@@ -154,7 +154,7 @@ static inline struct hugetlbfs_sb_info *HUGETLBFS_SB(struct super_block *sb) | |||
154 | return sb->s_fs_info; | 154 | return sb->s_fs_info; |
155 | } | 155 | } |
156 | 156 | ||
157 | extern struct file_operations hugetlbfs_file_operations; | 157 | extern const struct file_operations hugetlbfs_file_operations; |
158 | extern struct vm_operations_struct hugetlb_vm_ops; | 158 | extern struct vm_operations_struct hugetlb_vm_ops; |
159 | struct file *hugetlb_zero_setup(size_t); | 159 | struct file *hugetlb_zero_setup(size_t); |
160 | int hugetlb_extend_reservation(struct hugetlbfs_inode_info *info, | 160 | int hugetlb_extend_reservation(struct hugetlbfs_inode_info *info, |
diff --git a/include/linux/i2c-id.h b/include/linux/i2c-id.h index ec311bc89439..c8b81f419fd8 100644 --- a/include/linux/i2c-id.h +++ b/include/linux/i2c-id.h | |||
@@ -108,6 +108,10 @@ | |||
108 | #define I2C_DRIVERID_UPD64083 78 /* upd64083 video processor */ | 108 | #define I2C_DRIVERID_UPD64083 78 /* upd64083 video processor */ |
109 | #define I2C_DRIVERID_UPD64031A 79 /* upd64031a video processor */ | 109 | #define I2C_DRIVERID_UPD64031A 79 /* upd64031a video processor */ |
110 | #define I2C_DRIVERID_SAA717X 80 /* saa717x video encoder */ | 110 | #define I2C_DRIVERID_SAA717X 80 /* saa717x video encoder */ |
111 | #define I2C_DRIVERID_DS1672 81 /* Dallas/Maxim DS1672 RTC */ | ||
112 | #define I2C_DRIVERID_X1205 82 /* Xicor/Intersil X1205 RTC */ | ||
113 | #define I2C_DRIVERID_PCF8563 83 /* Philips PCF8563 RTC */ | ||
114 | #define I2C_DRIVERID_RS5C372 84 /* Ricoh RS5C372 RTC */ | ||
111 | 115 | ||
112 | #define I2C_DRIVERID_I2CDEV 900 | 116 | #define I2C_DRIVERID_I2CDEV 900 |
113 | #define I2C_DRIVERID_ARP 902 /* SMBus ARP Client */ | 117 | #define I2C_DRIVERID_ARP 902 /* SMBus ARP Client */ |
@@ -184,6 +188,7 @@ | |||
184 | #define I2C_HW_B_SAVAGE 0x01001d /* savage framebuffer driver */ | 188 | #define I2C_HW_B_SAVAGE 0x01001d /* savage framebuffer driver */ |
185 | #define I2C_HW_B_RADEON 0x01001e /* radeon framebuffer driver */ | 189 | #define I2C_HW_B_RADEON 0x01001e /* radeon framebuffer driver */ |
186 | #define I2C_HW_B_EM28XX 0x01001f /* em28xx video capture cards */ | 190 | #define I2C_HW_B_EM28XX 0x01001f /* em28xx video capture cards */ |
191 | #define I2C_HW_B_CX2341X 0x010020 /* Conexant CX2341X MPEG encoder cards */ | ||
187 | 192 | ||
188 | /* --- PCF 8584 based algorithms */ | 193 | /* --- PCF 8584 based algorithms */ |
189 | #define I2C_HW_P_LP 0x020000 /* Parallel port interface */ | 194 | #define I2C_HW_P_LP 0x020000 /* Parallel port interface */ |
diff --git a/include/linux/i2o.h b/include/linux/i2o.h index 5a9d8c599171..dd7d627bf66f 100644 --- a/include/linux/i2o.h +++ b/include/linux/i2o.h | |||
@@ -950,9 +950,7 @@ static inline int i2o_pool_alloc(struct i2o_pool *pool, const char *name, | |||
950 | if (!pool->slab) | 950 | if (!pool->slab) |
951 | goto free_name; | 951 | goto free_name; |
952 | 952 | ||
953 | pool->mempool = | 953 | pool->mempool = mempool_create_slab_pool(min_nr, pool->slab); |
954 | mempool_create(min_nr, mempool_alloc_slab, mempool_free_slab, | ||
955 | pool->slab); | ||
956 | if (!pool->mempool) | 954 | if (!pool->mempool) |
957 | goto free_slab; | 955 | goto free_slab; |
958 | 956 | ||
diff --git a/include/linux/init.h b/include/linux/init.h index ff8d8b8632f4..ed0ac7c39fdc 100644 --- a/include/linux/init.h +++ b/include/linux/init.h | |||
@@ -69,6 +69,10 @@ extern initcall_t __security_initcall_start[], __security_initcall_end[]; | |||
69 | 69 | ||
70 | /* Defined in init/main.c */ | 70 | /* Defined in init/main.c */ |
71 | extern char saved_command_line[]; | 71 | extern char saved_command_line[]; |
72 | |||
73 | /* used by init/main.c */ | ||
74 | extern void setup_arch(char **); | ||
75 | |||
72 | #endif | 76 | #endif |
73 | 77 | ||
74 | #ifndef MODULE | 78 | #ifndef MODULE |
diff --git a/include/linux/init_task.h b/include/linux/init_task.h index 92146f3b7423..41ecbb847f32 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h | |||
@@ -62,6 +62,8 @@ | |||
62 | .posix_timers = LIST_HEAD_INIT(sig.posix_timers), \ | 62 | .posix_timers = LIST_HEAD_INIT(sig.posix_timers), \ |
63 | .cpu_timers = INIT_CPU_TIMERS(sig.cpu_timers), \ | 63 | .cpu_timers = INIT_CPU_TIMERS(sig.cpu_timers), \ |
64 | .rlim = INIT_RLIMITS, \ | 64 | .rlim = INIT_RLIMITS, \ |
65 | .pgrp = 1, \ | ||
66 | .session = 1, \ | ||
65 | } | 67 | } |
66 | 68 | ||
67 | #define INIT_SIGHAND(sighand) { \ | 69 | #define INIT_SIGHAND(sighand) { \ |
diff --git a/include/linux/inotify.h b/include/linux/inotify.h index 267c88b5f742..09e00433c78e 100644 --- a/include/linux/inotify.h +++ b/include/linux/inotify.h | |||
@@ -71,6 +71,8 @@ struct inotify_event { | |||
71 | 71 | ||
72 | #ifdef CONFIG_INOTIFY | 72 | #ifdef CONFIG_INOTIFY |
73 | 73 | ||
74 | extern void inotify_d_instantiate(struct dentry *, struct inode *); | ||
75 | extern void inotify_d_move(struct dentry *); | ||
74 | extern void inotify_inode_queue_event(struct inode *, __u32, __u32, | 76 | extern void inotify_inode_queue_event(struct inode *, __u32, __u32, |
75 | const char *); | 77 | const char *); |
76 | extern void inotify_dentry_parent_queue_event(struct dentry *, __u32, __u32, | 78 | extern void inotify_dentry_parent_queue_event(struct dentry *, __u32, __u32, |
@@ -81,6 +83,15 @@ extern u32 inotify_get_cookie(void); | |||
81 | 83 | ||
82 | #else | 84 | #else |
83 | 85 | ||
86 | static inline void inotify_d_instantiate(struct dentry *dentry, | ||
87 | struct inode *inode) | ||
88 | { | ||
89 | } | ||
90 | |||
91 | static inline void inotify_d_move(struct dentry *dentry) | ||
92 | { | ||
93 | } | ||
94 | |||
84 | static inline void inotify_inode_queue_event(struct inode *inode, | 95 | static inline void inotify_inode_queue_event(struct inode *inode, |
85 | __u32 mask, __u32 cookie, | 96 | __u32 mask, __u32 cookie, |
86 | const char *filename) | 97 | const char *filename) |
diff --git a/include/linux/input.h b/include/linux/input.h index 6d4cc3c110d6..1d4e341b72e6 100644 --- a/include/linux/input.h +++ b/include/linux/input.h | |||
@@ -957,7 +957,7 @@ struct input_handler { | |||
957 | struct input_handle* (*connect)(struct input_handler *handler, struct input_dev *dev, struct input_device_id *id); | 957 | struct input_handle* (*connect)(struct input_handler *handler, struct input_dev *dev, struct input_device_id *id); |
958 | void (*disconnect)(struct input_handle *handle); | 958 | void (*disconnect)(struct input_handle *handle); |
959 | 959 | ||
960 | struct file_operations *fops; | 960 | const struct file_operations *fops; |
961 | int minor; | 961 | int minor; |
962 | char *name; | 962 | char *name; |
963 | 963 | ||
diff --git a/include/linux/ipmi.h b/include/linux/ipmi.h index d6276e60b3bf..0a84b56935c2 100644 --- a/include/linux/ipmi.h +++ b/include/linux/ipmi.h | |||
@@ -36,6 +36,7 @@ | |||
36 | 36 | ||
37 | #include <linux/ipmi_msgdefs.h> | 37 | #include <linux/ipmi_msgdefs.h> |
38 | #include <linux/compiler.h> | 38 | #include <linux/compiler.h> |
39 | #include <linux/device.h> | ||
39 | 40 | ||
40 | /* | 41 | /* |
41 | * This file describes an interface to an IPMI driver. You have to | 42 | * This file describes an interface to an IPMI driver. You have to |
@@ -397,7 +398,7 @@ struct ipmi_smi_watcher | |||
397 | the watcher list. So you can add and remove users from the | 398 | the watcher list. So you can add and remove users from the |
398 | IPMI interface, send messages, etc., but you cannot add | 399 | IPMI interface, send messages, etc., but you cannot add |
399 | or remove SMI watchers or SMI interfaces. */ | 400 | or remove SMI watchers or SMI interfaces. */ |
400 | void (*new_smi)(int if_num); | 401 | void (*new_smi)(int if_num, struct device *dev); |
401 | void (*smi_gone)(int if_num); | 402 | void (*smi_gone)(int if_num); |
402 | }; | 403 | }; |
403 | 404 | ||
diff --git a/include/linux/ipmi_msgdefs.h b/include/linux/ipmi_msgdefs.h index 03bc64dc2ec1..22f5e2afda4f 100644 --- a/include/linux/ipmi_msgdefs.h +++ b/include/linux/ipmi_msgdefs.h | |||
@@ -47,6 +47,7 @@ | |||
47 | #define IPMI_NETFN_APP_RESPONSE 0x07 | 47 | #define IPMI_NETFN_APP_RESPONSE 0x07 |
48 | #define IPMI_GET_DEVICE_ID_CMD 0x01 | 48 | #define IPMI_GET_DEVICE_ID_CMD 0x01 |
49 | #define IPMI_CLEAR_MSG_FLAGS_CMD 0x30 | 49 | #define IPMI_CLEAR_MSG_FLAGS_CMD 0x30 |
50 | #define IPMI_GET_DEVICE_GUID_CMD 0x08 | ||
50 | #define IPMI_GET_MSG_FLAGS_CMD 0x31 | 51 | #define IPMI_GET_MSG_FLAGS_CMD 0x31 |
51 | #define IPMI_SEND_MSG_CMD 0x34 | 52 | #define IPMI_SEND_MSG_CMD 0x34 |
52 | #define IPMI_GET_MSG_CMD 0x33 | 53 | #define IPMI_GET_MSG_CMD 0x33 |
diff --git a/include/linux/ipmi_smi.h b/include/linux/ipmi_smi.h index e36ee157ad67..53571288a9fc 100644 --- a/include/linux/ipmi_smi.h +++ b/include/linux/ipmi_smi.h | |||
@@ -37,6 +37,9 @@ | |||
37 | #include <linux/ipmi_msgdefs.h> | 37 | #include <linux/ipmi_msgdefs.h> |
38 | #include <linux/proc_fs.h> | 38 | #include <linux/proc_fs.h> |
39 | #include <linux/module.h> | 39 | #include <linux/module.h> |
40 | #include <linux/device.h> | ||
41 | #include <linux/platform_device.h> | ||
42 | #include <linux/ipmi_smi.h> | ||
40 | 43 | ||
41 | /* This files describes the interface for IPMI system management interface | 44 | /* This files describes the interface for IPMI system management interface |
42 | drivers to bind into the IPMI message handler. */ | 45 | drivers to bind into the IPMI message handler. */ |
@@ -113,12 +116,52 @@ struct ipmi_smi_handlers | |||
113 | void (*dec_usecount)(void *send_info); | 116 | void (*dec_usecount)(void *send_info); |
114 | }; | 117 | }; |
115 | 118 | ||
119 | struct ipmi_device_id { | ||
120 | unsigned char device_id; | ||
121 | unsigned char device_revision; | ||
122 | unsigned char firmware_revision_1; | ||
123 | unsigned char firmware_revision_2; | ||
124 | unsigned char ipmi_version; | ||
125 | unsigned char additional_device_support; | ||
126 | unsigned int manufacturer_id; | ||
127 | unsigned int product_id; | ||
128 | unsigned char aux_firmware_revision[4]; | ||
129 | unsigned int aux_firmware_revision_set : 1; | ||
130 | }; | ||
131 | |||
132 | #define ipmi_version_major(v) ((v)->ipmi_version & 0xf) | ||
133 | #define ipmi_version_minor(v) ((v)->ipmi_version >> 4) | ||
134 | |||
135 | /* Take a pointer to a raw data buffer and a length and extract device | ||
136 | id information from it. The first byte of data must point to the | ||
137 | byte from the get device id response after the completion code. | ||
138 | The caller is responsible for making sure the length is at least | ||
139 | 11 and the command completed without error. */ | ||
140 | static inline void ipmi_demangle_device_id(unsigned char *data, | ||
141 | unsigned int data_len, | ||
142 | struct ipmi_device_id *id) | ||
143 | { | ||
144 | id->device_id = data[0]; | ||
145 | id->device_revision = data[1]; | ||
146 | id->firmware_revision_1 = data[2]; | ||
147 | id->firmware_revision_2 = data[3]; | ||
148 | id->ipmi_version = data[4]; | ||
149 | id->additional_device_support = data[5]; | ||
150 | id->manufacturer_id = data[6] | (data[7] << 8) | (data[8] << 16); | ||
151 | id->product_id = data[9] | (data[10] << 8); | ||
152 | if (data_len >= 15) { | ||
153 | memcpy(id->aux_firmware_revision, data+11, 4); | ||
154 | id->aux_firmware_revision_set = 1; | ||
155 | } else | ||
156 | id->aux_firmware_revision_set = 0; | ||
157 | } | ||
158 | |||
116 | /* Add a low-level interface to the IPMI driver. Note that if the | 159 | /* Add a low-level interface to the IPMI driver. Note that if the |
117 | interface doesn't know its slave address, it should pass in zero. */ | 160 | interface doesn't know its slave address, it should pass in zero. */ |
118 | int ipmi_register_smi(struct ipmi_smi_handlers *handlers, | 161 | int ipmi_register_smi(struct ipmi_smi_handlers *handlers, |
119 | void *send_info, | 162 | void *send_info, |
120 | unsigned char version_major, | 163 | struct ipmi_device_id *device_id, |
121 | unsigned char version_minor, | 164 | struct device *dev, |
122 | unsigned char slave_addr, | 165 | unsigned char slave_addr, |
123 | ipmi_smi_t *intf); | 166 | ipmi_smi_t *intf); |
124 | 167 | ||
diff --git a/include/linux/irq.h b/include/linux/irq.h index 6c5d4c898ccb..ee2a82a572f7 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -114,53 +114,8 @@ static inline void set_native_irq_info(int irq, cpumask_t mask) | |||
114 | #if defined (CONFIG_GENERIC_PENDING_IRQ) || defined (CONFIG_IRQBALANCE) | 114 | #if defined (CONFIG_GENERIC_PENDING_IRQ) || defined (CONFIG_IRQBALANCE) |
115 | extern cpumask_t pending_irq_cpumask[NR_IRQS]; | 115 | extern cpumask_t pending_irq_cpumask[NR_IRQS]; |
116 | 116 | ||
117 | static inline void set_pending_irq(unsigned int irq, cpumask_t mask) | 117 | void set_pending_irq(unsigned int irq, cpumask_t mask); |
118 | { | 118 | void move_native_irq(int irq); |
119 | irq_desc_t *desc = irq_desc + irq; | ||
120 | unsigned long flags; | ||
121 | |||
122 | spin_lock_irqsave(&desc->lock, flags); | ||
123 | desc->move_irq = 1; | ||
124 | pending_irq_cpumask[irq] = mask; | ||
125 | spin_unlock_irqrestore(&desc->lock, flags); | ||
126 | } | ||
127 | |||
128 | static inline void | ||
129 | move_native_irq(int irq) | ||
130 | { | ||
131 | cpumask_t tmp; | ||
132 | irq_desc_t *desc = irq_descp(irq); | ||
133 | |||
134 | if (likely (!desc->move_irq)) | ||
135 | return; | ||
136 | |||
137 | desc->move_irq = 0; | ||
138 | |||
139 | if (likely(cpus_empty(pending_irq_cpumask[irq]))) | ||
140 | return; | ||
141 | |||
142 | if (!desc->handler->set_affinity) | ||
143 | return; | ||
144 | |||
145 | /* note - we hold the desc->lock */ | ||
146 | cpus_and(tmp, pending_irq_cpumask[irq], cpu_online_map); | ||
147 | |||
148 | /* | ||
149 | * If there was a valid mask to work with, please | ||
150 | * do the disable, re-program, enable sequence. | ||
151 | * This is *not* particularly important for level triggered | ||
152 | * but in a edge trigger case, we might be setting rte | ||
153 | * when an active trigger is comming in. This could | ||
154 | * cause some ioapics to mal-function. | ||
155 | * Being paranoid i guess! | ||
156 | */ | ||
157 | if (unlikely(!cpus_empty(tmp))) { | ||
158 | desc->handler->disable(irq); | ||
159 | desc->handler->set_affinity(irq,tmp); | ||
160 | desc->handler->enable(irq); | ||
161 | } | ||
162 | cpus_clear(pending_irq_cpumask[irq]); | ||
163 | } | ||
164 | 119 | ||
165 | #ifdef CONFIG_PCI_MSI | 120 | #ifdef CONFIG_PCI_MSI |
166 | /* | 121 | /* |
diff --git a/include/linux/jbd.h b/include/linux/jbd.h index 2ccbfb6340ba..6a425e370cb3 100644 --- a/include/linux/jbd.h +++ b/include/linux/jbd.h | |||
@@ -29,6 +29,8 @@ | |||
29 | #include <linux/stddef.h> | 29 | #include <linux/stddef.h> |
30 | #include <linux/bit_spinlock.h> | 30 | #include <linux/bit_spinlock.h> |
31 | #include <linux/mutex.h> | 31 | #include <linux/mutex.h> |
32 | #include <linux/timer.h> | ||
33 | |||
32 | #include <asm/semaphore.h> | 34 | #include <asm/semaphore.h> |
33 | #endif | 35 | #endif |
34 | 36 | ||
@@ -787,7 +789,7 @@ struct journal_s | |||
787 | unsigned long j_commit_interval; | 789 | unsigned long j_commit_interval; |
788 | 790 | ||
789 | /* The timer used to wakeup the commit thread: */ | 791 | /* The timer used to wakeup the commit thread: */ |
790 | struct timer_list *j_commit_timer; | 792 | struct timer_list j_commit_timer; |
791 | 793 | ||
792 | /* | 794 | /* |
793 | * The revoke table: maintains the list of revoked blocks in the | 795 | * The revoke table: maintains the list of revoked blocks in the |
@@ -893,7 +895,7 @@ extern int journal_dirty_metadata (handle_t *, struct buffer_head *); | |||
893 | extern void journal_release_buffer (handle_t *, struct buffer_head *); | 895 | extern void journal_release_buffer (handle_t *, struct buffer_head *); |
894 | extern int journal_forget (handle_t *, struct buffer_head *); | 896 | extern int journal_forget (handle_t *, struct buffer_head *); |
895 | extern void journal_sync_buffer (struct buffer_head *); | 897 | extern void journal_sync_buffer (struct buffer_head *); |
896 | extern int journal_invalidatepage(journal_t *, | 898 | extern void journal_invalidatepage(journal_t *, |
897 | struct page *, unsigned long); | 899 | struct page *, unsigned long); |
898 | extern int journal_try_to_free_buffers(journal_t *, struct page *, gfp_t); | 900 | extern int journal_try_to_free_buffers(journal_t *, struct page *, gfp_t); |
899 | extern int journal_stop(handle_t *); | 901 | extern int journal_stop(handle_t *); |
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index bb6e7ddee2fd..a3720f973ea5 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
@@ -87,7 +87,7 @@ extern int cond_resched(void); | |||
87 | (__x < 0) ? -__x : __x; \ | 87 | (__x < 0) ? -__x : __x; \ |
88 | }) | 88 | }) |
89 | 89 | ||
90 | extern struct notifier_block *panic_notifier_list; | 90 | extern struct atomic_notifier_head panic_notifier_list; |
91 | extern long (*panic_blink)(long time); | 91 | extern long (*panic_blink)(long time); |
92 | NORET_TYPE void panic(const char * fmt, ...) | 92 | NORET_TYPE void panic(const char * fmt, ...) |
93 | __attribute__ ((NORET_AND format (printf, 1, 2))); | 93 | __attribute__ ((NORET_AND format (printf, 1, 2))); |
@@ -154,9 +154,10 @@ static inline int __attribute_pure__ long_log2(unsigned long x) | |||
154 | return r; | 154 | return r; |
155 | } | 155 | } |
156 | 156 | ||
157 | static inline unsigned long __attribute_const__ roundup_pow_of_two(unsigned long x) | 157 | static inline unsigned long |
158 | __attribute_const__ roundup_pow_of_two(unsigned long x) | ||
158 | { | 159 | { |
159 | return (1UL << fls(x - 1)); | 160 | return 1UL << fls_long(x - 1); |
160 | } | 161 | } |
161 | 162 | ||
162 | extern int printk_ratelimit(void); | 163 | extern int printk_ratelimit(void); |
diff --git a/include/linux/kernel_stat.h b/include/linux/kernel_stat.h index a484572c302e..b46249082cca 100644 --- a/include/linux/kernel_stat.h +++ b/include/linux/kernel_stat.h | |||
@@ -46,7 +46,7 @@ static inline int kstat_irqs(int irq) | |||
46 | { | 46 | { |
47 | int cpu, sum = 0; | 47 | int cpu, sum = 0; |
48 | 48 | ||
49 | for_each_cpu(cpu) | 49 | for_each_possible_cpu(cpu) |
50 | sum += kstat_cpu(cpu).irqs[irq]; | 50 | sum += kstat_cpu(cpu).irqs[irq]; |
51 | 51 | ||
52 | return sum; | 52 | return sum; |
diff --git a/include/linux/ktime.h b/include/linux/ktime.h index f3dec45ef874..62bc57580707 100644 --- a/include/linux/ktime.h +++ b/include/linux/ktime.h | |||
@@ -64,9 +64,6 @@ typedef union { | |||
64 | 64 | ||
65 | #if (BITS_PER_LONG == 64) || defined(CONFIG_KTIME_SCALAR) | 65 | #if (BITS_PER_LONG == 64) || defined(CONFIG_KTIME_SCALAR) |
66 | 66 | ||
67 | /* Define a ktime_t variable and initialize it to zero: */ | ||
68 | #define DEFINE_KTIME(kt) ktime_t kt = { .tv64 = 0 } | ||
69 | |||
70 | /** | 67 | /** |
71 | * ktime_set - Set a ktime_t variable from a seconds/nanoseconds value | 68 | * ktime_set - Set a ktime_t variable from a seconds/nanoseconds value |
72 | * | 69 | * |
@@ -113,9 +110,6 @@ static inline ktime_t timeval_to_ktime(struct timeval tv) | |||
113 | /* Map the ktime_t to timeval conversion to ns_to_timeval function */ | 110 | /* Map the ktime_t to timeval conversion to ns_to_timeval function */ |
114 | #define ktime_to_timeval(kt) ns_to_timeval((kt).tv64) | 111 | #define ktime_to_timeval(kt) ns_to_timeval((kt).tv64) |
115 | 112 | ||
116 | /* Map the ktime_t to clock_t conversion to the inline in jiffies.h: */ | ||
117 | #define ktime_to_clock_t(kt) nsec_to_clock_t((kt).tv64) | ||
118 | |||
119 | /* Convert ktime_t to nanoseconds - NOP in the scalar storage format: */ | 113 | /* Convert ktime_t to nanoseconds - NOP in the scalar storage format: */ |
120 | #define ktime_to_ns(kt) ((kt).tv64) | 114 | #define ktime_to_ns(kt) ((kt).tv64) |
121 | 115 | ||
@@ -136,9 +130,6 @@ static inline ktime_t timeval_to_ktime(struct timeval tv) | |||
136 | * tv.sec < 0 and 0 >= tv.nsec < NSEC_PER_SEC | 130 | * tv.sec < 0 and 0 >= tv.nsec < NSEC_PER_SEC |
137 | */ | 131 | */ |
138 | 132 | ||
139 | /* Define a ktime_t variable and initialize it to zero: */ | ||
140 | #define DEFINE_KTIME(kt) ktime_t kt = { .tv64 = 0 } | ||
141 | |||
142 | /* Set a ktime_t variable to a value in sec/nsec representation: */ | 133 | /* Set a ktime_t variable to a value in sec/nsec representation: */ |
143 | static inline ktime_t ktime_set(const long secs, const unsigned long nsecs) | 134 | static inline ktime_t ktime_set(const long secs, const unsigned long nsecs) |
144 | { | 135 | { |
@@ -255,17 +246,6 @@ static inline struct timeval ktime_to_timeval(const ktime_t kt) | |||
255 | } | 246 | } |
256 | 247 | ||
257 | /** | 248 | /** |
258 | * ktime_to_clock_t - convert a ktime_t variable to clock_t format | ||
259 | * @kt: the ktime_t variable to convert | ||
260 | * | ||
261 | * Returns a clock_t variable with the converted value | ||
262 | */ | ||
263 | static inline clock_t ktime_to_clock_t(const ktime_t kt) | ||
264 | { | ||
265 | return nsec_to_clock_t( (u64) kt.tv.sec * NSEC_PER_SEC + kt.tv.nsec); | ||
266 | } | ||
267 | |||
268 | /** | ||
269 | * ktime_to_ns - convert a ktime_t variable to scalar nanoseconds | 249 | * ktime_to_ns - convert a ktime_t variable to scalar nanoseconds |
270 | * @kt: the ktime_t variable to convert | 250 | * @kt: the ktime_t variable to convert |
271 | * | 251 | * |
diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h index ef21ed296039..995f89dc8c04 100644 --- a/include/linux/lockd/lockd.h +++ b/include/linux/lockd/lockd.h | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/config.h> | 14 | #include <linux/config.h> |
15 | #include <linux/in.h> | 15 | #include <linux/in.h> |
16 | #include <linux/fs.h> | 16 | #include <linux/fs.h> |
17 | #include <linux/kref.h> | ||
17 | #include <linux/utsname.h> | 18 | #include <linux/utsname.h> |
18 | #include <linux/nfsd/nfsfh.h> | 19 | #include <linux/nfsd/nfsfh.h> |
19 | #include <linux/lockd/bind.h> | 20 | #include <linux/lockd/bind.h> |
@@ -58,6 +59,8 @@ struct nlm_host { | |||
58 | unsigned long h_expires; /* eligible for GC */ | 59 | unsigned long h_expires; /* eligible for GC */ |
59 | struct list_head h_lockowners; /* Lockowners for the client */ | 60 | struct list_head h_lockowners; /* Lockowners for the client */ |
60 | spinlock_t h_lock; | 61 | spinlock_t h_lock; |
62 | struct list_head h_granted; /* Locks in GRANTED state */ | ||
63 | struct list_head h_reclaim; /* Locks in RECLAIM state */ | ||
61 | }; | 64 | }; |
62 | 65 | ||
63 | /* | 66 | /* |
@@ -83,9 +86,9 @@ struct nlm_rqst { | |||
83 | struct nlm_host * a_host; /* host handle */ | 86 | struct nlm_host * a_host; /* host handle */ |
84 | struct nlm_args a_args; /* arguments */ | 87 | struct nlm_args a_args; /* arguments */ |
85 | struct nlm_res a_res; /* result */ | 88 | struct nlm_res a_res; /* result */ |
86 | struct nlm_wait * a_block; | 89 | struct nlm_block * a_block; |
87 | unsigned int a_retries; /* Retry count */ | 90 | unsigned int a_retries; /* Retry count */ |
88 | char a_owner[NLMCLNT_OHSIZE]; | 91 | u8 a_owner[NLMCLNT_OHSIZE]; |
89 | }; | 92 | }; |
90 | 93 | ||
91 | /* | 94 | /* |
@@ -110,16 +113,16 @@ struct nlm_file { | |||
110 | */ | 113 | */ |
111 | #define NLM_NEVER (~(unsigned long) 0) | 114 | #define NLM_NEVER (~(unsigned long) 0) |
112 | struct nlm_block { | 115 | struct nlm_block { |
116 | struct kref b_count; /* Reference count */ | ||
113 | struct nlm_block * b_next; /* linked list (all blocks) */ | 117 | struct nlm_block * b_next; /* linked list (all blocks) */ |
114 | struct nlm_block * b_fnext; /* linked list (per file) */ | 118 | struct nlm_block * b_fnext; /* linked list (per file) */ |
115 | struct nlm_rqst b_call; /* RPC args & callback info */ | 119 | struct nlm_rqst * b_call; /* RPC args & callback info */ |
116 | struct svc_serv * b_daemon; /* NLM service */ | 120 | struct svc_serv * b_daemon; /* NLM service */ |
117 | struct nlm_host * b_host; /* host handle for RPC clnt */ | 121 | struct nlm_host * b_host; /* host handle for RPC clnt */ |
118 | unsigned long b_when; /* next re-xmit */ | 122 | unsigned long b_when; /* next re-xmit */ |
119 | unsigned int b_id; /* block id */ | 123 | unsigned int b_id; /* block id */ |
120 | unsigned char b_queued; /* re-queued */ | 124 | unsigned char b_queued; /* re-queued */ |
121 | unsigned char b_granted; /* VFS granted lock */ | 125 | unsigned char b_granted; /* VFS granted lock */ |
122 | unsigned char b_incall; /* doing callback */ | ||
123 | unsigned char b_done; /* callback complete */ | 126 | unsigned char b_done; /* callback complete */ |
124 | struct nlm_file * b_file; /* file in question */ | 127 | struct nlm_file * b_file; /* file in question */ |
125 | }; | 128 | }; |
@@ -145,15 +148,16 @@ extern unsigned long nlmsvc_timeout; | |||
145 | /* | 148 | /* |
146 | * Lockd client functions | 149 | * Lockd client functions |
147 | */ | 150 | */ |
148 | struct nlm_rqst * nlmclnt_alloc_call(void); | 151 | struct nlm_rqst * nlm_alloc_call(struct nlm_host *host); |
149 | int nlmclnt_prepare_block(struct nlm_rqst *req, struct nlm_host *host, struct file_lock *fl); | 152 | void nlm_release_call(struct nlm_rqst *); |
150 | void nlmclnt_finish_block(struct nlm_rqst *req); | 153 | int nlm_async_call(struct nlm_rqst *, u32, const struct rpc_call_ops *); |
151 | long nlmclnt_block(struct nlm_rqst *req, long timeout); | 154 | int nlm_async_reply(struct nlm_rqst *, u32, const struct rpc_call_ops *); |
155 | struct nlm_wait * nlmclnt_prepare_block(struct nlm_host *host, struct file_lock *fl); | ||
156 | void nlmclnt_finish_block(struct nlm_wait *block); | ||
157 | int nlmclnt_block(struct nlm_wait *block, struct nlm_rqst *req, long timeout); | ||
152 | u32 nlmclnt_grant(const struct sockaddr_in *addr, const struct nlm_lock *); | 158 | u32 nlmclnt_grant(const struct sockaddr_in *addr, const struct nlm_lock *); |
153 | void nlmclnt_recovery(struct nlm_host *, u32); | 159 | void nlmclnt_recovery(struct nlm_host *, u32); |
154 | int nlmclnt_reclaim(struct nlm_host *, struct file_lock *); | 160 | int nlmclnt_reclaim(struct nlm_host *, struct file_lock *); |
155 | int nlmclnt_setgrantargs(struct nlm_rqst *, struct nlm_lock *); | ||
156 | void nlmclnt_freegrantargs(struct nlm_rqst *); | ||
157 | 161 | ||
158 | /* | 162 | /* |
159 | * Host cache | 163 | * Host cache |
@@ -172,7 +176,6 @@ extern struct nlm_host *nlm_find_client(void); | |||
172 | /* | 176 | /* |
173 | * Server-side lock handling | 177 | * Server-side lock handling |
174 | */ | 178 | */ |
175 | int nlmsvc_async_call(struct nlm_rqst *, u32, const struct rpc_call_ops *); | ||
176 | u32 nlmsvc_lock(struct svc_rqst *, struct nlm_file *, | 179 | u32 nlmsvc_lock(struct svc_rqst *, struct nlm_file *, |
177 | struct nlm_lock *, int, struct nlm_cookie *); | 180 | struct nlm_lock *, int, struct nlm_cookie *); |
178 | u32 nlmsvc_unlock(struct nlm_file *, struct nlm_lock *); | 181 | u32 nlmsvc_unlock(struct nlm_file *, struct nlm_lock *); |
@@ -180,7 +183,7 @@ u32 nlmsvc_testlock(struct nlm_file *, struct nlm_lock *, | |||
180 | struct nlm_lock *); | 183 | struct nlm_lock *); |
181 | u32 nlmsvc_cancel_blocked(struct nlm_file *, struct nlm_lock *); | 184 | u32 nlmsvc_cancel_blocked(struct nlm_file *, struct nlm_lock *); |
182 | unsigned long nlmsvc_retry_blocked(void); | 185 | unsigned long nlmsvc_retry_blocked(void); |
183 | int nlmsvc_traverse_blocks(struct nlm_host *, struct nlm_file *, | 186 | void nlmsvc_traverse_blocks(struct nlm_host *, struct nlm_file *, |
184 | int action); | 187 | int action); |
185 | void nlmsvc_grant_reply(struct svc_rqst *, struct nlm_cookie *, u32); | 188 | void nlmsvc_grant_reply(struct svc_rqst *, struct nlm_cookie *, u32); |
186 | 189 | ||
diff --git a/include/linux/lockd/share.h b/include/linux/lockd/share.h index 5d8aa325f140..c75a424ebe4c 100644 --- a/include/linux/lockd/share.h +++ b/include/linux/lockd/share.h | |||
@@ -25,6 +25,6 @@ u32 nlmsvc_share_file(struct nlm_host *, struct nlm_file *, | |||
25 | struct nlm_args *); | 25 | struct nlm_args *); |
26 | u32 nlmsvc_unshare_file(struct nlm_host *, struct nlm_file *, | 26 | u32 nlmsvc_unshare_file(struct nlm_host *, struct nlm_file *, |
27 | struct nlm_args *); | 27 | struct nlm_args *); |
28 | int nlmsvc_traverse_shares(struct nlm_host *, struct nlm_file *, int); | 28 | void nlmsvc_traverse_shares(struct nlm_host *, struct nlm_file *, int); |
29 | 29 | ||
30 | #endif /* LINUX_LOCKD_SHARE_H */ | 30 | #endif /* LINUX_LOCKD_SHARE_H */ |
diff --git a/include/linux/lockd/xdr.h b/include/linux/lockd/xdr.h index d7a5cc4cfa97..bb0a0f1caa91 100644 --- a/include/linux/lockd/xdr.h +++ b/include/linux/lockd/xdr.h | |||
@@ -28,6 +28,7 @@ struct nlm_lock { | |||
28 | int len; /* length of "caller" */ | 28 | int len; /* length of "caller" */ |
29 | struct nfs_fh fh; | 29 | struct nfs_fh fh; |
30 | struct xdr_netobj oh; | 30 | struct xdr_netobj oh; |
31 | u32 svid; | ||
31 | struct file_lock fl; | 32 | struct file_lock fl; |
32 | }; | 33 | }; |
33 | 34 | ||
diff --git a/include/linux/m48t86.h b/include/linux/m48t86.h new file mode 100644 index 000000000000..9065199319d0 --- /dev/null +++ b/include/linux/m48t86.h | |||
@@ -0,0 +1,16 @@ | |||
1 | /* | ||
2 | * ST M48T86 / Dallas DS12887 RTC driver | ||
3 | * Copyright (c) 2006 Tower Technologies | ||
4 | * | ||
5 | * Author: Alessandro Zummo <a.zummo@towertech.it> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | struct m48t86_ops | ||
13 | { | ||
14 | void (*writeb)(unsigned char value, unsigned long addr); | ||
15 | unsigned char (*readb)(unsigned long addr); | ||
16 | }; | ||
diff --git a/include/linux/major.h b/include/linux/major.h index e36a46702d94..0a74c52924c9 100644 --- a/include/linux/major.h +++ b/include/linux/major.h | |||
@@ -113,6 +113,7 @@ | |||
113 | 113 | ||
114 | #define UBD_MAJOR 98 | 114 | #define UBD_MAJOR 98 |
115 | 115 | ||
116 | #define PP_MAJOR 99 | ||
116 | #define JSFD_MAJOR 99 | 117 | #define JSFD_MAJOR 99 |
117 | 118 | ||
118 | #define PHONE_MAJOR 100 | 119 | #define PHONE_MAJOR 100 |
diff --git a/include/linux/memory.h b/include/linux/memory.h index e251dc43d0f5..8f04143ca363 100644 --- a/include/linux/memory.h +++ b/include/linux/memory.h | |||
@@ -77,7 +77,6 @@ extern int remove_memory_block(unsigned long, struct mem_section *, int); | |||
77 | 77 | ||
78 | #define CONFIG_MEM_BLOCK_SIZE (PAGES_PER_SECTION<<PAGE_SHIFT) | 78 | #define CONFIG_MEM_BLOCK_SIZE (PAGES_PER_SECTION<<PAGE_SHIFT) |
79 | 79 | ||
80 | struct notifier_block; | ||
81 | 80 | ||
82 | #endif /* CONFIG_MEMORY_HOTPLUG */ | 81 | #endif /* CONFIG_MEMORY_HOTPLUG */ |
83 | 82 | ||
diff --git a/include/linux/mempool.h b/include/linux/mempool.h index f2427d7394b0..9be484d11283 100644 --- a/include/linux/mempool.h +++ b/include/linux/mempool.h | |||
@@ -6,6 +6,8 @@ | |||
6 | 6 | ||
7 | #include <linux/wait.h> | 7 | #include <linux/wait.h> |
8 | 8 | ||
9 | struct kmem_cache; | ||
10 | |||
9 | typedef void * (mempool_alloc_t)(gfp_t gfp_mask, void *pool_data); | 11 | typedef void * (mempool_alloc_t)(gfp_t gfp_mask, void *pool_data); |
10 | typedef void (mempool_free_t)(void *element, void *pool_data); | 12 | typedef void (mempool_free_t)(void *element, void *pool_data); |
11 | 13 | ||
@@ -37,5 +39,41 @@ extern void mempool_free(void *element, mempool_t *pool); | |||
37 | */ | 39 | */ |
38 | void *mempool_alloc_slab(gfp_t gfp_mask, void *pool_data); | 40 | void *mempool_alloc_slab(gfp_t gfp_mask, void *pool_data); |
39 | void mempool_free_slab(void *element, void *pool_data); | 41 | void mempool_free_slab(void *element, void *pool_data); |
42 | static inline mempool_t * | ||
43 | mempool_create_slab_pool(int min_nr, struct kmem_cache *kc) | ||
44 | { | ||
45 | return mempool_create(min_nr, mempool_alloc_slab, mempool_free_slab, | ||
46 | (void *) kc); | ||
47 | } | ||
48 | |||
49 | /* | ||
50 | * 2 mempool_alloc_t's and a mempool_free_t to kmalloc/kzalloc and kfree | ||
51 | * the amount of memory specified by pool_data | ||
52 | */ | ||
53 | void *mempool_kmalloc(gfp_t gfp_mask, void *pool_data); | ||
54 | void *mempool_kzalloc(gfp_t gfp_mask, void *pool_data); | ||
55 | void mempool_kfree(void *element, void *pool_data); | ||
56 | static inline mempool_t *mempool_create_kmalloc_pool(int min_nr, size_t size) | ||
57 | { | ||
58 | return mempool_create(min_nr, mempool_kmalloc, mempool_kfree, | ||
59 | (void *) size); | ||
60 | } | ||
61 | static inline mempool_t *mempool_create_kzalloc_pool(int min_nr, size_t size) | ||
62 | { | ||
63 | return mempool_create(min_nr, mempool_kzalloc, mempool_kfree, | ||
64 | (void *) size); | ||
65 | } | ||
66 | |||
67 | /* | ||
68 | * A mempool_alloc_t and mempool_free_t for a simple page allocator that | ||
69 | * allocates pages of the order specified by pool_data | ||
70 | */ | ||
71 | void *mempool_alloc_pages(gfp_t gfp_mask, void *pool_data); | ||
72 | void mempool_free_pages(void *element, void *pool_data); | ||
73 | static inline mempool_t *mempool_create_page_pool(int min_nr, int order) | ||
74 | { | ||
75 | return mempool_create(min_nr, mempool_alloc_pages, mempool_free_pages, | ||
76 | (void *)(long)order); | ||
77 | } | ||
40 | 78 | ||
41 | #endif /* _LINUX_MEMPOOL_H */ | 79 | #endif /* _LINUX_MEMPOOL_H */ |
diff --git a/include/linux/miscdevice.h b/include/linux/miscdevice.h index 14ceebfc1efa..5b584dafb5a6 100644 --- a/include/linux/miscdevice.h +++ b/include/linux/miscdevice.h | |||
@@ -36,7 +36,7 @@ struct class_device; | |||
36 | struct miscdevice { | 36 | struct miscdevice { |
37 | int minor; | 37 | int minor; |
38 | const char *name; | 38 | const char *name; |
39 | struct file_operations *fops; | 39 | const struct file_operations *fops; |
40 | struct list_head list; | 40 | struct list_head list; |
41 | struct device *dev; | 41 | struct device *dev; |
42 | struct class_device *class; | 42 | struct class_device *class; |
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index ebfc238cc243..b5c21122c299 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/numa.h> | 13 | #include <linux/numa.h> |
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/seqlock.h> | 15 | #include <linux/seqlock.h> |
16 | #include <linux/nodemask.h> | ||
16 | #include <asm/atomic.h> | 17 | #include <asm/atomic.h> |
17 | 18 | ||
18 | /* Free memory management - zoned buddy allocator. */ | 19 | /* Free memory management - zoned buddy allocator. */ |
@@ -225,7 +226,6 @@ struct zone { | |||
225 | * Discontig memory support fields. | 226 | * Discontig memory support fields. |
226 | */ | 227 | */ |
227 | struct pglist_data *zone_pgdat; | 228 | struct pglist_data *zone_pgdat; |
228 | struct page *zone_mem_map; | ||
229 | /* zone_start_pfn == zone_start_paddr >> PAGE_SHIFT */ | 229 | /* zone_start_pfn == zone_start_paddr >> PAGE_SHIFT */ |
230 | unsigned long zone_start_pfn; | 230 | unsigned long zone_start_pfn; |
231 | 231 | ||
@@ -307,7 +307,6 @@ typedef struct pglist_data { | |||
307 | unsigned long node_spanned_pages; /* total size of physical page | 307 | unsigned long node_spanned_pages; /* total size of physical page |
308 | range, including holes */ | 308 | range, including holes */ |
309 | int node_id; | 309 | int node_id; |
310 | struct pglist_data *pgdat_next; | ||
311 | wait_queue_head_t kswapd_wait; | 310 | wait_queue_head_t kswapd_wait; |
312 | struct task_struct *kswapd; | 311 | struct task_struct *kswapd; |
313 | int kswapd_max_order; | 312 | int kswapd_max_order; |
@@ -324,8 +323,6 @@ typedef struct pglist_data { | |||
324 | 323 | ||
325 | #include <linux/memory_hotplug.h> | 324 | #include <linux/memory_hotplug.h> |
326 | 325 | ||
327 | extern struct pglist_data *pgdat_list; | ||
328 | |||
329 | void __get_zone_counts(unsigned long *active, unsigned long *inactive, | 326 | void __get_zone_counts(unsigned long *active, unsigned long *inactive, |
330 | unsigned long *free, struct pglist_data *pgdat); | 327 | unsigned long *free, struct pglist_data *pgdat); |
331 | void get_zone_counts(unsigned long *active, unsigned long *inactive, | 328 | void get_zone_counts(unsigned long *active, unsigned long *inactive, |
@@ -350,57 +347,6 @@ unsigned long __init node_memmap_size_bytes(int, unsigned long, unsigned long); | |||
350 | */ | 347 | */ |
351 | #define zone_idx(zone) ((zone) - (zone)->zone_pgdat->node_zones) | 348 | #define zone_idx(zone) ((zone) - (zone)->zone_pgdat->node_zones) |
352 | 349 | ||
353 | /** | ||
354 | * for_each_pgdat - helper macro to iterate over all nodes | ||
355 | * @pgdat - pointer to a pg_data_t variable | ||
356 | * | ||
357 | * Meant to help with common loops of the form | ||
358 | * pgdat = pgdat_list; | ||
359 | * while(pgdat) { | ||
360 | * ... | ||
361 | * pgdat = pgdat->pgdat_next; | ||
362 | * } | ||
363 | */ | ||
364 | #define for_each_pgdat(pgdat) \ | ||
365 | for (pgdat = pgdat_list; pgdat; pgdat = pgdat->pgdat_next) | ||
366 | |||
367 | /* | ||
368 | * next_zone - helper magic for for_each_zone() | ||
369 | * Thanks to William Lee Irwin III for this piece of ingenuity. | ||
370 | */ | ||
371 | static inline struct zone *next_zone(struct zone *zone) | ||
372 | { | ||
373 | pg_data_t *pgdat = zone->zone_pgdat; | ||
374 | |||
375 | if (zone < pgdat->node_zones + MAX_NR_ZONES - 1) | ||
376 | zone++; | ||
377 | else if (pgdat->pgdat_next) { | ||
378 | pgdat = pgdat->pgdat_next; | ||
379 | zone = pgdat->node_zones; | ||
380 | } else | ||
381 | zone = NULL; | ||
382 | |||
383 | return zone; | ||
384 | } | ||
385 | |||
386 | /** | ||
387 | * for_each_zone - helper macro to iterate over all memory zones | ||
388 | * @zone - pointer to struct zone variable | ||
389 | * | ||
390 | * The user only needs to declare the zone variable, for_each_zone | ||
391 | * fills it in. This basically means for_each_zone() is an | ||
392 | * easier to read version of this piece of code: | ||
393 | * | ||
394 | * for (pgdat = pgdat_list; pgdat; pgdat = pgdat->node_next) | ||
395 | * for (i = 0; i < MAX_NR_ZONES; ++i) { | ||
396 | * struct zone * z = pgdat->node_zones + i; | ||
397 | * ... | ||
398 | * } | ||
399 | * } | ||
400 | */ | ||
401 | #define for_each_zone(zone) \ | ||
402 | for (zone = pgdat_list->node_zones; zone; zone = next_zone(zone)) | ||
403 | |||
404 | static inline int populated_zone(struct zone *zone) | 350 | static inline int populated_zone(struct zone *zone) |
405 | { | 351 | { |
406 | return (!!zone->present_pages); | 352 | return (!!zone->present_pages); |
@@ -472,6 +418,30 @@ extern struct pglist_data contig_page_data; | |||
472 | 418 | ||
473 | #endif /* !CONFIG_NEED_MULTIPLE_NODES */ | 419 | #endif /* !CONFIG_NEED_MULTIPLE_NODES */ |
474 | 420 | ||
421 | extern struct pglist_data *first_online_pgdat(void); | ||
422 | extern struct pglist_data *next_online_pgdat(struct pglist_data *pgdat); | ||
423 | extern struct zone *next_zone(struct zone *zone); | ||
424 | |||
425 | /** | ||
426 | * for_each_pgdat - helper macro to iterate over all nodes | ||
427 | * @pgdat - pointer to a pg_data_t variable | ||
428 | */ | ||
429 | #define for_each_online_pgdat(pgdat) \ | ||
430 | for (pgdat = first_online_pgdat(); \ | ||
431 | pgdat; \ | ||
432 | pgdat = next_online_pgdat(pgdat)) | ||
433 | /** | ||
434 | * for_each_zone - helper macro to iterate over all memory zones | ||
435 | * @zone - pointer to struct zone variable | ||
436 | * | ||
437 | * The user only needs to declare the zone variable, for_each_zone | ||
438 | * fills it in. | ||
439 | */ | ||
440 | #define for_each_zone(zone) \ | ||
441 | for (zone = (first_online_pgdat())->node_zones; \ | ||
442 | zone; \ | ||
443 | zone = next_zone(zone)) | ||
444 | |||
475 | #ifdef CONFIG_SPARSEMEM | 445 | #ifdef CONFIG_SPARSEMEM |
476 | #include <asm/sparsemem.h> | 446 | #include <asm/sparsemem.h> |
477 | #endif | 447 | #endif |
@@ -602,17 +572,6 @@ static inline struct mem_section *__pfn_to_section(unsigned long pfn) | |||
602 | return __nr_to_section(pfn_to_section_nr(pfn)); | 572 | return __nr_to_section(pfn_to_section_nr(pfn)); |
603 | } | 573 | } |
604 | 574 | ||
605 | #define pfn_to_page(pfn) \ | ||
606 | ({ \ | ||
607 | unsigned long __pfn = (pfn); \ | ||
608 | __section_mem_map_addr(__pfn_to_section(__pfn)) + __pfn; \ | ||
609 | }) | ||
610 | #define page_to_pfn(page) \ | ||
611 | ({ \ | ||
612 | page - __section_mem_map_addr(__nr_to_section( \ | ||
613 | page_to_section(page))); \ | ||
614 | }) | ||
615 | |||
616 | static inline int pfn_valid(unsigned long pfn) | 575 | static inline int pfn_valid(unsigned long pfn) |
617 | { | 576 | { |
618 | if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS) | 577 | if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS) |
diff --git a/include/linux/module.h b/include/linux/module.h index 70bd843c71cb..eaec13ddd667 100644 --- a/include/linux/module.h +++ b/include/linux/module.h | |||
@@ -183,6 +183,7 @@ void *__symbol_get_gpl(const char *symbol); | |||
183 | 183 | ||
184 | /* For every exported symbol, place a struct in the __ksymtab section */ | 184 | /* For every exported symbol, place a struct in the __ksymtab section */ |
185 | #define __EXPORT_SYMBOL(sym, sec) \ | 185 | #define __EXPORT_SYMBOL(sym, sec) \ |
186 | extern typeof(sym) sym; \ | ||
186 | __CRC_SYMBOL(sym, sec) \ | 187 | __CRC_SYMBOL(sym, sec) \ |
187 | static const char __kstrtab_##sym[] \ | 188 | static const char __kstrtab_##sym[] \ |
188 | __attribute__((section("__ksymtab_strings"))) \ | 189 | __attribute__((section("__ksymtab_strings"))) \ |
@@ -554,25 +555,6 @@ static inline void module_remove_driver(struct device_driver *driver) | |||
554 | 555 | ||
555 | /* BELOW HERE ALL THESE ARE OBSOLETE AND WILL VANISH */ | 556 | /* BELOW HERE ALL THESE ARE OBSOLETE AND WILL VANISH */ |
556 | 557 | ||
557 | struct obsolete_modparm { | ||
558 | char name[64]; | ||
559 | char type[64-sizeof(void *)]; | ||
560 | void *addr; | ||
561 | }; | ||
562 | |||
563 | static inline void MODULE_PARM_(void) { } | ||
564 | #ifdef MODULE | ||
565 | /* DEPRECATED: Do not use. */ | ||
566 | #define MODULE_PARM(var,type) \ | ||
567 | extern struct obsolete_modparm __parm_##var \ | ||
568 | __attribute__((section("__obsparm"))); \ | ||
569 | struct obsolete_modparm __parm_##var = \ | ||
570 | { __stringify(var), type, &MODULE_PARM_ }; \ | ||
571 | __MODULE_PARM_TYPE(var, type); | ||
572 | #else | ||
573 | #define MODULE_PARM(var,type) static void __attribute__((__unused__)) *__parm_##var = &MODULE_PARM_; | ||
574 | #endif | ||
575 | |||
576 | #define __MODULE_STRING(x) __stringify(x) | 558 | #define __MODULE_STRING(x) __stringify(x) |
577 | 559 | ||
578 | /* Use symbol_get and symbol_put instead. You'll thank me. */ | 560 | /* Use symbol_get and symbol_put instead. You'll thank me. */ |
diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h index b5c98c43779e..7c0c2c198f1f 100644 --- a/include/linux/moduleparam.h +++ b/include/linux/moduleparam.h | |||
@@ -162,13 +162,6 @@ extern int param_array_get(char *buffer, struct kernel_param *kp); | |||
162 | extern int param_set_copystring(const char *val, struct kernel_param *kp); | 162 | extern int param_set_copystring(const char *val, struct kernel_param *kp); |
163 | extern int param_get_string(char *buffer, struct kernel_param *kp); | 163 | extern int param_get_string(char *buffer, struct kernel_param *kp); |
164 | 164 | ||
165 | int param_array(const char *name, | ||
166 | const char *val, | ||
167 | unsigned int min, unsigned int max, | ||
168 | void *elem, int elemsize, | ||
169 | int (*set)(const char *, struct kernel_param *kp), | ||
170 | int *num); | ||
171 | |||
172 | /* for exporting parameters in /sys/parameters */ | 165 | /* for exporting parameters in /sys/parameters */ |
173 | 166 | ||
174 | struct module; | 167 | struct module; |
diff --git a/include/linux/msdos_fs.h b/include/linux/msdos_fs.h index 779e6a5744c7..d9035c73e5d1 100644 --- a/include/linux/msdos_fs.h +++ b/include/linux/msdos_fs.h | |||
@@ -334,7 +334,7 @@ extern int fat_bmap(struct inode *inode, sector_t sector, sector_t *phys, | |||
334 | unsigned long *mapped_blocks); | 334 | unsigned long *mapped_blocks); |
335 | 335 | ||
336 | /* fat/dir.c */ | 336 | /* fat/dir.c */ |
337 | extern struct file_operations fat_dir_operations; | 337 | extern const struct file_operations fat_dir_operations; |
338 | extern int fat_search_long(struct inode *inode, const unsigned char *name, | 338 | extern int fat_search_long(struct inode *inode, const unsigned char *name, |
339 | int name_len, struct fat_slot_info *sinfo); | 339 | int name_len, struct fat_slot_info *sinfo); |
340 | extern int fat_dir_empty(struct inode *dir); | 340 | extern int fat_dir_empty(struct inode *dir); |
@@ -397,7 +397,7 @@ extern int fat_count_free_clusters(struct super_block *sb); | |||
397 | /* fat/file.c */ | 397 | /* fat/file.c */ |
398 | extern int fat_generic_ioctl(struct inode *inode, struct file *filp, | 398 | extern int fat_generic_ioctl(struct inode *inode, struct file *filp, |
399 | unsigned int cmd, unsigned long arg); | 399 | unsigned int cmd, unsigned long arg); |
400 | extern struct file_operations fat_file_operations; | 400 | extern const struct file_operations fat_file_operations; |
401 | extern struct inode_operations fat_file_inode_operations; | 401 | extern struct inode_operations fat_file_inode_operations; |
402 | extern int fat_notify_change(struct dentry * dentry, struct iattr * attr); | 402 | extern int fat_notify_change(struct dentry * dentry, struct iattr * attr); |
403 | extern void fat_truncate(struct inode *inode); | 403 | extern void fat_truncate(struct inode *inode); |
@@ -420,6 +420,9 @@ extern int date_dos2unix(unsigned short time, unsigned short date); | |||
420 | extern void fat_date_unix2dos(int unix_date, __le16 *time, __le16 *date); | 420 | extern void fat_date_unix2dos(int unix_date, __le16 *time, __le16 *date); |
421 | extern int fat_sync_bhs(struct buffer_head **bhs, int nr_bhs); | 421 | extern int fat_sync_bhs(struct buffer_head **bhs, int nr_bhs); |
422 | 422 | ||
423 | int fat_cache_init(void); | ||
424 | void fat_cache_destroy(void); | ||
425 | |||
423 | #endif /* __KERNEL__ */ | 426 | #endif /* __KERNEL__ */ |
424 | 427 | ||
425 | #endif | 428 | #endif |
diff --git a/include/linux/ncp_fs.h b/include/linux/ncp_fs.h index e01342568530..96dc237b8f03 100644 --- a/include/linux/ncp_fs.h +++ b/include/linux/ncp_fs.h | |||
@@ -209,7 +209,7 @@ void ncp_update_inode2(struct inode *, struct ncp_entry_info *); | |||
209 | 209 | ||
210 | /* linux/fs/ncpfs/dir.c */ | 210 | /* linux/fs/ncpfs/dir.c */ |
211 | extern struct inode_operations ncp_dir_inode_operations; | 211 | extern struct inode_operations ncp_dir_inode_operations; |
212 | extern struct file_operations ncp_dir_operations; | 212 | extern const struct file_operations ncp_dir_operations; |
213 | int ncp_conn_logged_in(struct super_block *); | 213 | int ncp_conn_logged_in(struct super_block *); |
214 | int ncp_date_dos2unix(__le16 time, __le16 date); | 214 | int ncp_date_dos2unix(__le16 time, __le16 date); |
215 | void ncp_date_unix2dos(int unix_date, __le16 * time, __le16 * date); | 215 | void ncp_date_unix2dos(int unix_date, __le16 * time, __le16 * date); |
@@ -230,7 +230,7 @@ void ncp_unlock_server(struct ncp_server *server); | |||
230 | 230 | ||
231 | /* linux/fs/ncpfs/file.c */ | 231 | /* linux/fs/ncpfs/file.c */ |
232 | extern struct inode_operations ncp_file_inode_operations; | 232 | extern struct inode_operations ncp_file_inode_operations; |
233 | extern struct file_operations ncp_file_operations; | 233 | extern const struct file_operations ncp_file_operations; |
234 | int ncp_make_open(struct inode *, int); | 234 | int ncp_make_open(struct inode *, int); |
235 | 235 | ||
236 | /* linux/fs/ncpfs/mmap.c */ | 236 | /* linux/fs/ncpfs/mmap.c */ |
diff --git a/include/linux/netfilter_ipv4/ip_conntrack.h b/include/linux/netfilter_ipv4/ip_conntrack.h index f32d75c4f4cf..d54d7b278e96 100644 --- a/include/linux/netfilter_ipv4/ip_conntrack.h +++ b/include/linux/netfilter_ipv4/ip_conntrack.h | |||
@@ -308,29 +308,30 @@ DECLARE_PER_CPU(struct ip_conntrack_ecache, ip_conntrack_ecache); | |||
308 | 308 | ||
309 | #define CONNTRACK_ECACHE(x) (__get_cpu_var(ip_conntrack_ecache).x) | 309 | #define CONNTRACK_ECACHE(x) (__get_cpu_var(ip_conntrack_ecache).x) |
310 | 310 | ||
311 | extern struct notifier_block *ip_conntrack_chain; | 311 | extern struct atomic_notifier_head ip_conntrack_chain; |
312 | extern struct notifier_block *ip_conntrack_expect_chain; | 312 | extern struct atomic_notifier_head ip_conntrack_expect_chain; |
313 | 313 | ||
314 | static inline int ip_conntrack_register_notifier(struct notifier_block *nb) | 314 | static inline int ip_conntrack_register_notifier(struct notifier_block *nb) |
315 | { | 315 | { |
316 | return notifier_chain_register(&ip_conntrack_chain, nb); | 316 | return atomic_notifier_chain_register(&ip_conntrack_chain, nb); |
317 | } | 317 | } |
318 | 318 | ||
319 | static inline int ip_conntrack_unregister_notifier(struct notifier_block *nb) | 319 | static inline int ip_conntrack_unregister_notifier(struct notifier_block *nb) |
320 | { | 320 | { |
321 | return notifier_chain_unregister(&ip_conntrack_chain, nb); | 321 | return atomic_notifier_chain_unregister(&ip_conntrack_chain, nb); |
322 | } | 322 | } |
323 | 323 | ||
324 | static inline int | 324 | static inline int |
325 | ip_conntrack_expect_register_notifier(struct notifier_block *nb) | 325 | ip_conntrack_expect_register_notifier(struct notifier_block *nb) |
326 | { | 326 | { |
327 | return notifier_chain_register(&ip_conntrack_expect_chain, nb); | 327 | return atomic_notifier_chain_register(&ip_conntrack_expect_chain, nb); |
328 | } | 328 | } |
329 | 329 | ||
330 | static inline int | 330 | static inline int |
331 | ip_conntrack_expect_unregister_notifier(struct notifier_block *nb) | 331 | ip_conntrack_expect_unregister_notifier(struct notifier_block *nb) |
332 | { | 332 | { |
333 | return notifier_chain_unregister(&ip_conntrack_expect_chain, nb); | 333 | return atomic_notifier_chain_unregister(&ip_conntrack_expect_chain, |
334 | nb); | ||
334 | } | 335 | } |
335 | 336 | ||
336 | extern void ip_ct_deliver_cached_events(const struct ip_conntrack *ct); | 337 | extern void ip_ct_deliver_cached_events(const struct ip_conntrack *ct); |
@@ -355,14 +356,14 @@ static inline void ip_conntrack_event(enum ip_conntrack_events event, | |||
355 | struct ip_conntrack *ct) | 356 | struct ip_conntrack *ct) |
356 | { | 357 | { |
357 | if (is_confirmed(ct) && !is_dying(ct)) | 358 | if (is_confirmed(ct) && !is_dying(ct)) |
358 | notifier_call_chain(&ip_conntrack_chain, event, ct); | 359 | atomic_notifier_call_chain(&ip_conntrack_chain, event, ct); |
359 | } | 360 | } |
360 | 361 | ||
361 | static inline void | 362 | static inline void |
362 | ip_conntrack_expect_event(enum ip_conntrack_expect_events event, | 363 | ip_conntrack_expect_event(enum ip_conntrack_expect_events event, |
363 | struct ip_conntrack_expect *exp) | 364 | struct ip_conntrack_expect *exp) |
364 | { | 365 | { |
365 | notifier_call_chain(&ip_conntrack_expect_chain, event, exp); | 366 | atomic_notifier_call_chain(&ip_conntrack_expect_chain, event, exp); |
366 | } | 367 | } |
367 | #else /* CONFIG_IP_NF_CONNTRACK_EVENTS */ | 368 | #else /* CONFIG_IP_NF_CONNTRACK_EVENTS */ |
368 | static inline void ip_conntrack_event_cache(enum ip_conntrack_events event, | 369 | static inline void ip_conntrack_event_cache(enum ip_conntrack_events event, |
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index b4dc6e2e10c9..c71227dd4389 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h | |||
@@ -56,9 +56,7 @@ | |||
56 | * When flushing a cluster of dirty pages, there can be different | 56 | * When flushing a cluster of dirty pages, there can be different |
57 | * strategies: | 57 | * strategies: |
58 | */ | 58 | */ |
59 | #define FLUSH_AGING 0 /* only flush old buffers */ | ||
60 | #define FLUSH_SYNC 1 /* file being synced, or contention */ | 59 | #define FLUSH_SYNC 1 /* file being synced, or contention */ |
61 | #define FLUSH_WAIT 2 /* wait for completion */ | ||
62 | #define FLUSH_STABLE 4 /* commit to stable storage */ | 60 | #define FLUSH_STABLE 4 /* commit to stable storage */ |
63 | #define FLUSH_LOWPRI 8 /* low priority background flush */ | 61 | #define FLUSH_LOWPRI 8 /* low priority background flush */ |
64 | #define FLUSH_HIGHPRI 16 /* high priority memory reclaim flush */ | 62 | #define FLUSH_HIGHPRI 16 /* high priority memory reclaim flush */ |
@@ -78,6 +76,7 @@ struct nfs_access_entry { | |||
78 | struct nfs4_state; | 76 | struct nfs4_state; |
79 | struct nfs_open_context { | 77 | struct nfs_open_context { |
80 | atomic_t count; | 78 | atomic_t count; |
79 | struct vfsmount *vfsmnt; | ||
81 | struct dentry *dentry; | 80 | struct dentry *dentry; |
82 | struct rpc_cred *cred; | 81 | struct rpc_cred *cred; |
83 | struct nfs4_state *state; | 82 | struct nfs4_state *state; |
@@ -118,8 +117,7 @@ struct nfs_inode { | |||
118 | unsigned long cache_validity; /* bit mask */ | 117 | unsigned long cache_validity; /* bit mask */ |
119 | 118 | ||
120 | /* | 119 | /* |
121 | * read_cache_jiffies is when we started read-caching this inode, | 120 | * read_cache_jiffies is when we started read-caching this inode. |
122 | * and read_cache_mtime is the mtime of the inode at that time. | ||
123 | * attrtimeo is for how long the cached information is assumed | 121 | * attrtimeo is for how long the cached information is assumed |
124 | * to be valid. A successful attribute revalidation doubles | 122 | * to be valid. A successful attribute revalidation doubles |
125 | * attrtimeo (up to acregmax/acdirmax), a failure resets it to | 123 | * attrtimeo (up to acregmax/acdirmax), a failure resets it to |
@@ -128,11 +126,6 @@ struct nfs_inode { | |||
128 | * We need to revalidate the cached attrs for this inode if | 126 | * We need to revalidate the cached attrs for this inode if |
129 | * | 127 | * |
130 | * jiffies - read_cache_jiffies > attrtimeo | 128 | * jiffies - read_cache_jiffies > attrtimeo |
131 | * | ||
132 | * and invalidate any cached data/flush out any dirty pages if | ||
133 | * we find that | ||
134 | * | ||
135 | * mtime != read_cache_mtime | ||
136 | */ | 129 | */ |
137 | unsigned long read_cache_jiffies; | 130 | unsigned long read_cache_jiffies; |
138 | unsigned long attrtimeo; | 131 | unsigned long attrtimeo; |
@@ -311,12 +304,9 @@ extern void nfs_begin_attr_update(struct inode *); | |||
311 | extern void nfs_end_attr_update(struct inode *); | 304 | extern void nfs_end_attr_update(struct inode *); |
312 | extern void nfs_begin_data_update(struct inode *); | 305 | extern void nfs_begin_data_update(struct inode *); |
313 | extern void nfs_end_data_update(struct inode *); | 306 | extern void nfs_end_data_update(struct inode *); |
314 | extern struct nfs_open_context *alloc_nfs_open_context(struct dentry *dentry, struct rpc_cred *cred); | ||
315 | extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx); | 307 | extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx); |
316 | extern void put_nfs_open_context(struct nfs_open_context *ctx); | 308 | extern void put_nfs_open_context(struct nfs_open_context *ctx); |
317 | extern void nfs_file_set_open_context(struct file *filp, struct nfs_open_context *ctx); | ||
318 | extern struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_cred *cred, int mode); | 309 | extern struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_cred *cred, int mode); |
319 | extern void nfs_file_clear_open_context(struct file *filp); | ||
320 | 310 | ||
321 | /* linux/net/ipv4/ipconfig.c: trims ip addr off front of name, too. */ | 311 | /* linux/net/ipv4/ipconfig.c: trims ip addr off front of name, too. */ |
322 | extern u32 root_nfs_parse_addr(char *name); /*__init*/ | 312 | extern u32 root_nfs_parse_addr(char *name); /*__init*/ |
@@ -334,7 +324,7 @@ extern struct inode_operations nfs_file_inode_operations; | |||
334 | #ifdef CONFIG_NFS_V3 | 324 | #ifdef CONFIG_NFS_V3 |
335 | extern struct inode_operations nfs3_file_inode_operations; | 325 | extern struct inode_operations nfs3_file_inode_operations; |
336 | #endif /* CONFIG_NFS_V3 */ | 326 | #endif /* CONFIG_NFS_V3 */ |
337 | extern struct file_operations nfs_file_operations; | 327 | extern const struct file_operations nfs_file_operations; |
338 | extern struct address_space_operations nfs_file_aops; | 328 | extern struct address_space_operations nfs_file_aops; |
339 | 329 | ||
340 | static inline struct rpc_cred *nfs_file_cred(struct file *file) | 330 | static inline struct rpc_cred *nfs_file_cred(struct file *file) |
@@ -381,7 +371,7 @@ extern struct inode_operations nfs_dir_inode_operations; | |||
381 | #ifdef CONFIG_NFS_V3 | 371 | #ifdef CONFIG_NFS_V3 |
382 | extern struct inode_operations nfs3_dir_inode_operations; | 372 | extern struct inode_operations nfs3_dir_inode_operations; |
383 | #endif /* CONFIG_NFS_V3 */ | 373 | #endif /* CONFIG_NFS_V3 */ |
384 | extern struct file_operations nfs_dir_operations; | 374 | extern const struct file_operations nfs_dir_operations; |
385 | extern struct dentry_operations nfs_dentry_operations; | 375 | extern struct dentry_operations nfs_dentry_operations; |
386 | 376 | ||
387 | extern int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fh, struct nfs_fattr *fattr); | 377 | extern int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fh, struct nfs_fattr *fattr); |
@@ -415,21 +405,22 @@ extern int nfs_writepage(struct page *page, struct writeback_control *wbc); | |||
415 | extern int nfs_writepages(struct address_space *, struct writeback_control *); | 405 | extern int nfs_writepages(struct address_space *, struct writeback_control *); |
416 | extern int nfs_flush_incompatible(struct file *file, struct page *page); | 406 | extern int nfs_flush_incompatible(struct file *file, struct page *page); |
417 | extern int nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int); | 407 | extern int nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int); |
418 | extern void nfs_writeback_done(struct rpc_task *task, void *data); | 408 | extern int nfs_writeback_done(struct rpc_task *, struct nfs_write_data *); |
419 | extern void nfs_writedata_release(void *data); | 409 | extern void nfs_writedata_release(void *); |
420 | 410 | ||
421 | #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) | 411 | #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) |
422 | extern void nfs_commit_done(struct rpc_task *, void *data); | 412 | struct nfs_write_data *nfs_commit_alloc(unsigned int pagecount); |
423 | extern void nfs_commit_release(void *data); | 413 | void nfs_commit_free(struct nfs_write_data *p); |
424 | #endif | 414 | #endif |
425 | 415 | ||
426 | /* | 416 | /* |
427 | * Try to write back everything synchronously (but check the | 417 | * Try to write back everything synchronously (but check the |
428 | * return value!) | 418 | * return value!) |
429 | */ | 419 | */ |
430 | extern int nfs_sync_inode(struct inode *, unsigned long, unsigned int, int); | 420 | extern int nfs_sync_inode_wait(struct inode *, unsigned long, unsigned int, int); |
431 | #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) | 421 | #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) |
432 | extern int nfs_commit_inode(struct inode *, int); | 422 | extern int nfs_commit_inode(struct inode *, int); |
423 | extern void nfs_commit_release(void *wdata); | ||
433 | #else | 424 | #else |
434 | static inline int | 425 | static inline int |
435 | nfs_commit_inode(struct inode *inode, int how) | 426 | nfs_commit_inode(struct inode *inode, int how) |
@@ -447,7 +438,7 @@ nfs_have_writebacks(struct inode *inode) | |||
447 | static inline int | 438 | static inline int |
448 | nfs_wb_all(struct inode *inode) | 439 | nfs_wb_all(struct inode *inode) |
449 | { | 440 | { |
450 | int error = nfs_sync_inode(inode, 0, 0, FLUSH_WAIT); | 441 | int error = nfs_sync_inode_wait(inode, 0, 0, 0); |
451 | return (error < 0) ? error : 0; | 442 | return (error < 0) ? error : 0; |
452 | } | 443 | } |
453 | 444 | ||
@@ -456,8 +447,8 @@ nfs_wb_all(struct inode *inode) | |||
456 | */ | 447 | */ |
457 | static inline int nfs_wb_page_priority(struct inode *inode, struct page* page, int how) | 448 | static inline int nfs_wb_page_priority(struct inode *inode, struct page* page, int how) |
458 | { | 449 | { |
459 | int error = nfs_sync_inode(inode, page->index, 1, | 450 | int error = nfs_sync_inode_wait(inode, page->index, 1, |
460 | how | FLUSH_WAIT | FLUSH_STABLE); | 451 | how | FLUSH_STABLE); |
461 | return (error < 0) ? error : 0; | 452 | return (error < 0) ? error : 0; |
462 | } | 453 | } |
463 | 454 | ||
@@ -469,37 +460,8 @@ static inline int nfs_wb_page(struct inode *inode, struct page* page) | |||
469 | /* | 460 | /* |
470 | * Allocate and free nfs_write_data structures | 461 | * Allocate and free nfs_write_data structures |
471 | */ | 462 | */ |
472 | extern mempool_t *nfs_wdata_mempool; | 463 | extern struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount); |
473 | 464 | extern void nfs_writedata_free(struct nfs_write_data *p); | |
474 | static inline struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount) | ||
475 | { | ||
476 | struct nfs_write_data *p = mempool_alloc(nfs_wdata_mempool, SLAB_NOFS); | ||
477 | |||
478 | if (p) { | ||
479 | memset(p, 0, sizeof(*p)); | ||
480 | INIT_LIST_HEAD(&p->pages); | ||
481 | if (pagecount < NFS_PAGEVEC_SIZE) | ||
482 | p->pagevec = &p->page_array[0]; | ||
483 | else { | ||
484 | size_t size = ++pagecount * sizeof(struct page *); | ||
485 | p->pagevec = kmalloc(size, GFP_NOFS); | ||
486 | if (p->pagevec) { | ||
487 | memset(p->pagevec, 0, size); | ||
488 | } else { | ||
489 | mempool_free(p, nfs_wdata_mempool); | ||
490 | p = NULL; | ||
491 | } | ||
492 | } | ||
493 | } | ||
494 | return p; | ||
495 | } | ||
496 | |||
497 | static inline void nfs_writedata_free(struct nfs_write_data *p) | ||
498 | { | ||
499 | if (p && (p->pagevec != &p->page_array[0])) | ||
500 | kfree(p->pagevec); | ||
501 | mempool_free(p, nfs_wdata_mempool); | ||
502 | } | ||
503 | 465 | ||
504 | /* | 466 | /* |
505 | * linux/fs/nfs/read.c | 467 | * linux/fs/nfs/read.c |
@@ -507,44 +469,14 @@ static inline void nfs_writedata_free(struct nfs_write_data *p) | |||
507 | extern int nfs_readpage(struct file *, struct page *); | 469 | extern int nfs_readpage(struct file *, struct page *); |
508 | extern int nfs_readpages(struct file *, struct address_space *, | 470 | extern int nfs_readpages(struct file *, struct address_space *, |
509 | struct list_head *, unsigned); | 471 | struct list_head *, unsigned); |
510 | extern void nfs_readpage_result(struct rpc_task *, void *); | 472 | extern int nfs_readpage_result(struct rpc_task *, struct nfs_read_data *); |
511 | extern void nfs_readdata_release(void *data); | 473 | extern void nfs_readdata_release(void *data); |
512 | |||
513 | 474 | ||
514 | /* | 475 | /* |
515 | * Allocate and free nfs_read_data structures | 476 | * Allocate and free nfs_read_data structures |
516 | */ | 477 | */ |
517 | extern mempool_t *nfs_rdata_mempool; | 478 | extern struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount); |
518 | 479 | extern void nfs_readdata_free(struct nfs_read_data *p); | |
519 | static inline struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount) | ||
520 | { | ||
521 | struct nfs_read_data *p = mempool_alloc(nfs_rdata_mempool, SLAB_NOFS); | ||
522 | |||
523 | if (p) { | ||
524 | memset(p, 0, sizeof(*p)); | ||
525 | INIT_LIST_HEAD(&p->pages); | ||
526 | if (pagecount < NFS_PAGEVEC_SIZE) | ||
527 | p->pagevec = &p->page_array[0]; | ||
528 | else { | ||
529 | size_t size = ++pagecount * sizeof(struct page *); | ||
530 | p->pagevec = kmalloc(size, GFP_NOFS); | ||
531 | if (p->pagevec) { | ||
532 | memset(p->pagevec, 0, size); | ||
533 | } else { | ||
534 | mempool_free(p, nfs_rdata_mempool); | ||
535 | p = NULL; | ||
536 | } | ||
537 | } | ||
538 | } | ||
539 | return p; | ||
540 | } | ||
541 | |||
542 | static inline void nfs_readdata_free(struct nfs_read_data *p) | ||
543 | { | ||
544 | if (p && (p->pagevec != &p->page_array[0])) | ||
545 | kfree(p->pagevec); | ||
546 | mempool_free(p, nfs_rdata_mempool); | ||
547 | } | ||
548 | 480 | ||
549 | /* | 481 | /* |
550 | * linux/fs/nfs3proc.c | 482 | * linux/fs/nfs3proc.c |
diff --git a/include/linux/nfs_fs_i.h b/include/linux/nfs_fs_i.h index e2c18dabff86..861730275ba0 100644 --- a/include/linux/nfs_fs_i.h +++ b/include/linux/nfs_fs_i.h | |||
@@ -12,8 +12,8 @@ struct nlm_lockowner; | |||
12 | */ | 12 | */ |
13 | struct nfs_lock_info { | 13 | struct nfs_lock_info { |
14 | u32 state; | 14 | u32 state; |
15 | u32 flags; | ||
16 | struct nlm_lockowner *owner; | 15 | struct nlm_lockowner *owner; |
16 | struct list_head list; | ||
17 | }; | 17 | }; |
18 | 18 | ||
19 | struct nfs4_lock_state; | 19 | struct nfs4_lock_state; |
@@ -21,10 +21,4 @@ struct nfs4_lock_info { | |||
21 | struct nfs4_lock_state *owner; | 21 | struct nfs4_lock_state *owner; |
22 | }; | 22 | }; |
23 | 23 | ||
24 | /* | ||
25 | * Lock flag values | ||
26 | */ | ||
27 | #define NFS_LCK_GRANTED 0x0001 /* lock has been granted */ | ||
28 | #define NFS_LCK_RECLAIM 0x0002 /* lock marked for reclaiming */ | ||
29 | |||
30 | #endif | 24 | #endif |
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index 3d3a305488cf..65dec21af774 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h | |||
@@ -4,6 +4,8 @@ | |||
4 | #include <linux/list.h> | 4 | #include <linux/list.h> |
5 | #include <linux/backing-dev.h> | 5 | #include <linux/backing-dev.h> |
6 | 6 | ||
7 | struct nfs_iostats; | ||
8 | |||
7 | /* | 9 | /* |
8 | * NFS client parameters stored in the superblock. | 10 | * NFS client parameters stored in the superblock. |
9 | */ | 11 | */ |
@@ -12,6 +14,7 @@ struct nfs_server { | |||
12 | struct rpc_clnt * client_sys; /* 2nd handle for FSINFO */ | 14 | struct rpc_clnt * client_sys; /* 2nd handle for FSINFO */ |
13 | struct rpc_clnt * client_acl; /* ACL RPC client handle */ | 15 | struct rpc_clnt * client_acl; /* ACL RPC client handle */ |
14 | struct nfs_rpc_ops * rpc_ops; /* NFS protocol vector */ | 16 | struct nfs_rpc_ops * rpc_ops; /* NFS protocol vector */ |
17 | struct nfs_iostats * io_stats; /* I/O statistics */ | ||
15 | struct backing_dev_info backing_dev_info; | 18 | struct backing_dev_info backing_dev_info; |
16 | int flags; /* various flags */ | 19 | int flags; /* various flags */ |
17 | unsigned int caps; /* server capabilities */ | 20 | unsigned int caps; /* server capabilities */ |
@@ -26,10 +29,13 @@ struct nfs_server { | |||
26 | unsigned int acregmax; | 29 | unsigned int acregmax; |
27 | unsigned int acdirmin; | 30 | unsigned int acdirmin; |
28 | unsigned int acdirmax; | 31 | unsigned int acdirmax; |
32 | unsigned long retrans_timeo; /* retransmit timeout */ | ||
33 | unsigned int retrans_count; /* number of retransmit tries */ | ||
29 | unsigned int namelen; | 34 | unsigned int namelen; |
30 | char * hostname; /* remote hostname */ | 35 | char * hostname; /* remote hostname */ |
31 | struct nfs_fh fh; | 36 | struct nfs_fh fh; |
32 | struct sockaddr_in addr; | 37 | struct sockaddr_in addr; |
38 | unsigned long mount_time; /* when this fs was mounted */ | ||
33 | #ifdef CONFIG_NFS_V4 | 39 | #ifdef CONFIG_NFS_V4 |
34 | /* Our own IP address, as a null-terminated string. | 40 | /* Our own IP address, as a null-terminated string. |
35 | * This is used to generate the clientid, and the callback address. | 41 | * This is used to generate the clientid, and the callback address. |
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index 6d6f69ec5675..7fafc4c546b7 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h | |||
@@ -695,7 +695,6 @@ struct nfs_read_data { | |||
695 | #ifdef CONFIG_NFS_V4 | 695 | #ifdef CONFIG_NFS_V4 |
696 | unsigned long timestamp; /* For lease renewal */ | 696 | unsigned long timestamp; /* For lease renewal */ |
697 | #endif | 697 | #endif |
698 | void (*complete) (struct nfs_read_data *, int); | ||
699 | struct page *page_array[NFS_PAGEVEC_SIZE + 1]; | 698 | struct page *page_array[NFS_PAGEVEC_SIZE + 1]; |
700 | }; | 699 | }; |
701 | 700 | ||
@@ -714,7 +713,6 @@ struct nfs_write_data { | |||
714 | #ifdef CONFIG_NFS_V4 | 713 | #ifdef CONFIG_NFS_V4 |
715 | unsigned long timestamp; /* For lease renewal */ | 714 | unsigned long timestamp; /* For lease renewal */ |
716 | #endif | 715 | #endif |
717 | void (*complete) (struct nfs_write_data *, int); | ||
718 | struct page *page_array[NFS_PAGEVEC_SIZE + 1]; | 716 | struct page *page_array[NFS_PAGEVEC_SIZE + 1]; |
719 | }; | 717 | }; |
720 | 718 | ||
@@ -769,8 +767,11 @@ struct nfs_rpc_ops { | |||
769 | struct nfs_pathconf *); | 767 | struct nfs_pathconf *); |
770 | u32 * (*decode_dirent)(u32 *, struct nfs_entry *, int plus); | 768 | u32 * (*decode_dirent)(u32 *, struct nfs_entry *, int plus); |
771 | void (*read_setup) (struct nfs_read_data *); | 769 | void (*read_setup) (struct nfs_read_data *); |
770 | int (*read_done) (struct rpc_task *, struct nfs_read_data *); | ||
772 | void (*write_setup) (struct nfs_write_data *, int how); | 771 | void (*write_setup) (struct nfs_write_data *, int how); |
772 | int (*write_done) (struct rpc_task *, struct nfs_write_data *); | ||
773 | void (*commit_setup) (struct nfs_write_data *, int how); | 773 | void (*commit_setup) (struct nfs_write_data *, int how); |
774 | int (*commit_done) (struct rpc_task *, struct nfs_write_data *); | ||
774 | int (*file_open) (struct inode *, struct file *); | 775 | int (*file_open) (struct inode *, struct file *); |
775 | int (*file_release) (struct inode *, struct file *); | 776 | int (*file_release) (struct inode *, struct file *); |
776 | int (*lock)(struct file *, int, struct file_lock *); | 777 | int (*lock)(struct file *, int, struct file_lock *); |
diff --git a/include/linux/nfsd/export.h b/include/linux/nfsd/export.h index 6bad4766d3d9..d2a8abb5011a 100644 --- a/include/linux/nfsd/export.h +++ b/include/linux/nfsd/export.h | |||
@@ -67,7 +67,8 @@ struct svc_expkey { | |||
67 | int ek_fsidtype; | 67 | int ek_fsidtype; |
68 | u32 ek_fsid[3]; | 68 | u32 ek_fsid[3]; |
69 | 69 | ||
70 | struct svc_export * ek_export; | 70 | struct vfsmount * ek_mnt; |
71 | struct dentry * ek_dentry; | ||
71 | }; | 72 | }; |
72 | 73 | ||
73 | #define EX_SECURE(exp) (!((exp)->ex_flags & NFSEXP_INSECURE_PORT)) | 74 | #define EX_SECURE(exp) (!((exp)->ex_flags & NFSEXP_INSECURE_PORT)) |
@@ -85,9 +86,6 @@ void nfsd_export_shutdown(void); | |||
85 | void nfsd_export_flush(void); | 86 | void nfsd_export_flush(void); |
86 | void exp_readlock(void); | 87 | void exp_readlock(void); |
87 | void exp_readunlock(void); | 88 | void exp_readunlock(void); |
88 | struct svc_expkey * exp_find_key(struct auth_domain *clp, | ||
89 | int fsid_type, u32 *fsidv, | ||
90 | struct cache_req *reqp); | ||
91 | struct svc_export * exp_get_by_name(struct auth_domain *clp, | 89 | struct svc_export * exp_get_by_name(struct auth_domain *clp, |
92 | struct vfsmount *mnt, | 90 | struct vfsmount *mnt, |
93 | struct dentry *dentry, | 91 | struct dentry *dentry, |
@@ -101,35 +99,20 @@ int exp_rootfh(struct auth_domain *, | |||
101 | int exp_pseudoroot(struct auth_domain *, struct svc_fh *fhp, struct cache_req *creq); | 99 | int exp_pseudoroot(struct auth_domain *, struct svc_fh *fhp, struct cache_req *creq); |
102 | int nfserrno(int errno); | 100 | int nfserrno(int errno); |
103 | 101 | ||
104 | extern void expkey_put(struct cache_head *item, struct cache_detail *cd); | 102 | extern struct cache_detail svc_export_cache; |
105 | extern void svc_export_put(struct cache_head *item, struct cache_detail *cd); | ||
106 | extern struct cache_detail svc_export_cache, svc_expkey_cache; | ||
107 | 103 | ||
108 | static inline void exp_put(struct svc_export *exp) | 104 | static inline void exp_put(struct svc_export *exp) |
109 | { | 105 | { |
110 | svc_export_put(&exp->h, &svc_export_cache); | 106 | cache_put(&exp->h, &svc_export_cache); |
111 | } | 107 | } |
112 | 108 | ||
113 | static inline void exp_get(struct svc_export *exp) | 109 | static inline void exp_get(struct svc_export *exp) |
114 | { | 110 | { |
115 | cache_get(&exp->h); | 111 | cache_get(&exp->h); |
116 | } | 112 | } |
117 | static inline struct svc_export * | 113 | extern struct svc_export * |
118 | exp_find(struct auth_domain *clp, int fsid_type, u32 *fsidv, | 114 | exp_find(struct auth_domain *clp, int fsid_type, u32 *fsidv, |
119 | struct cache_req *reqp) | 115 | struct cache_req *reqp); |
120 | { | ||
121 | struct svc_expkey *ek = exp_find_key(clp, fsid_type, fsidv, reqp); | ||
122 | if (ek && !IS_ERR(ek)) { | ||
123 | struct svc_export *exp = ek->ek_export; | ||
124 | int err; | ||
125 | exp_get(exp); | ||
126 | expkey_put(&ek->h, &svc_expkey_cache); | ||
127 | if ((err = cache_check(&svc_export_cache, &exp->h, reqp))) | ||
128 | exp = ERR_PTR(err); | ||
129 | return exp; | ||
130 | } else | ||
131 | return ERR_PTR(PTR_ERR(ek)); | ||
132 | } | ||
133 | 116 | ||
134 | #endif /* __KERNEL__ */ | 117 | #endif /* __KERNEL__ */ |
135 | 118 | ||
diff --git a/include/linux/nodemask.h b/include/linux/nodemask.h index b959a4525cbd..1a9ef3e627d1 100644 --- a/include/linux/nodemask.h +++ b/include/linux/nodemask.h | |||
@@ -350,11 +350,15 @@ extern nodemask_t node_possible_map; | |||
350 | #define num_possible_nodes() nodes_weight(node_possible_map) | 350 | #define num_possible_nodes() nodes_weight(node_possible_map) |
351 | #define node_online(node) node_isset((node), node_online_map) | 351 | #define node_online(node) node_isset((node), node_online_map) |
352 | #define node_possible(node) node_isset((node), node_possible_map) | 352 | #define node_possible(node) node_isset((node), node_possible_map) |
353 | #define first_online_node first_node(node_online_map) | ||
354 | #define next_online_node(nid) next_node((nid), node_online_map) | ||
353 | #else | 355 | #else |
354 | #define num_online_nodes() 1 | 356 | #define num_online_nodes() 1 |
355 | #define num_possible_nodes() 1 | 357 | #define num_possible_nodes() 1 |
356 | #define node_online(node) ((node) == 0) | 358 | #define node_online(node) ((node) == 0) |
357 | #define node_possible(node) ((node) == 0) | 359 | #define node_possible(node) ((node) == 0) |
360 | #define first_online_node 0 | ||
361 | #define next_online_node(nid) (MAX_NUMNODES) | ||
358 | #endif | 362 | #endif |
359 | 363 | ||
360 | #define any_online_node(mask) \ | 364 | #define any_online_node(mask) \ |
diff --git a/include/linux/notifier.h b/include/linux/notifier.h index 5937dd6053c3..51dbab9710c7 100644 --- a/include/linux/notifier.h +++ b/include/linux/notifier.h | |||
@@ -10,25 +10,107 @@ | |||
10 | #ifndef _LINUX_NOTIFIER_H | 10 | #ifndef _LINUX_NOTIFIER_H |
11 | #define _LINUX_NOTIFIER_H | 11 | #define _LINUX_NOTIFIER_H |
12 | #include <linux/errno.h> | 12 | #include <linux/errno.h> |
13 | #include <linux/mutex.h> | ||
14 | #include <linux/rwsem.h> | ||
13 | 15 | ||
14 | struct notifier_block | 16 | /* |
15 | { | 17 | * Notifier chains are of three types: |
16 | int (*notifier_call)(struct notifier_block *self, unsigned long, void *); | 18 | * |
19 | * Atomic notifier chains: Chain callbacks run in interrupt/atomic | ||
20 | * context. Callouts are not allowed to block. | ||
21 | * Blocking notifier chains: Chain callbacks run in process context. | ||
22 | * Callouts are allowed to block. | ||
23 | * Raw notifier chains: There are no restrictions on callbacks, | ||
24 | * registration, or unregistration. All locking and protection | ||
25 | * must be provided by the caller. | ||
26 | * | ||
27 | * atomic_notifier_chain_register() may be called from an atomic context, | ||
28 | * but blocking_notifier_chain_register() must be called from a process | ||
29 | * context. Ditto for the corresponding _unregister() routines. | ||
30 | * | ||
31 | * atomic_notifier_chain_unregister() and blocking_notifier_chain_unregister() | ||
32 | * _must not_ be called from within the call chain. | ||
33 | */ | ||
34 | |||
35 | struct notifier_block { | ||
36 | int (*notifier_call)(struct notifier_block *, unsigned long, void *); | ||
17 | struct notifier_block *next; | 37 | struct notifier_block *next; |
18 | int priority; | 38 | int priority; |
19 | }; | 39 | }; |
20 | 40 | ||
41 | struct atomic_notifier_head { | ||
42 | spinlock_t lock; | ||
43 | struct notifier_block *head; | ||
44 | }; | ||
45 | |||
46 | struct blocking_notifier_head { | ||
47 | struct rw_semaphore rwsem; | ||
48 | struct notifier_block *head; | ||
49 | }; | ||
50 | |||
51 | struct raw_notifier_head { | ||
52 | struct notifier_block *head; | ||
53 | }; | ||
54 | |||
55 | #define ATOMIC_INIT_NOTIFIER_HEAD(name) do { \ | ||
56 | spin_lock_init(&(name)->lock); \ | ||
57 | (name)->head = NULL; \ | ||
58 | } while (0) | ||
59 | #define BLOCKING_INIT_NOTIFIER_HEAD(name) do { \ | ||
60 | init_rwsem(&(name)->rwsem); \ | ||
61 | (name)->head = NULL; \ | ||
62 | } while (0) | ||
63 | #define RAW_INIT_NOTIFIER_HEAD(name) do { \ | ||
64 | (name)->head = NULL; \ | ||
65 | } while (0) | ||
66 | |||
67 | #define ATOMIC_NOTIFIER_INIT(name) { \ | ||
68 | .lock = SPIN_LOCK_UNLOCKED, \ | ||
69 | .head = NULL } | ||
70 | #define BLOCKING_NOTIFIER_INIT(name) { \ | ||
71 | .rwsem = __RWSEM_INITIALIZER((name).rwsem), \ | ||
72 | .head = NULL } | ||
73 | #define RAW_NOTIFIER_INIT(name) { \ | ||
74 | .head = NULL } | ||
75 | |||
76 | #define ATOMIC_NOTIFIER_HEAD(name) \ | ||
77 | struct atomic_notifier_head name = \ | ||
78 | ATOMIC_NOTIFIER_INIT(name) | ||
79 | #define BLOCKING_NOTIFIER_HEAD(name) \ | ||
80 | struct blocking_notifier_head name = \ | ||
81 | BLOCKING_NOTIFIER_INIT(name) | ||
82 | #define RAW_NOTIFIER_HEAD(name) \ | ||
83 | struct raw_notifier_head name = \ | ||
84 | RAW_NOTIFIER_INIT(name) | ||
21 | 85 | ||
22 | #ifdef __KERNEL__ | 86 | #ifdef __KERNEL__ |
23 | 87 | ||
24 | extern int notifier_chain_register(struct notifier_block **list, struct notifier_block *n); | 88 | extern int atomic_notifier_chain_register(struct atomic_notifier_head *, |
25 | extern int notifier_chain_unregister(struct notifier_block **nl, struct notifier_block *n); | 89 | struct notifier_block *); |
26 | extern int notifier_call_chain(struct notifier_block **n, unsigned long val, void *v); | 90 | extern int blocking_notifier_chain_register(struct blocking_notifier_head *, |
91 | struct notifier_block *); | ||
92 | extern int raw_notifier_chain_register(struct raw_notifier_head *, | ||
93 | struct notifier_block *); | ||
94 | |||
95 | extern int atomic_notifier_chain_unregister(struct atomic_notifier_head *, | ||
96 | struct notifier_block *); | ||
97 | extern int blocking_notifier_chain_unregister(struct blocking_notifier_head *, | ||
98 | struct notifier_block *); | ||
99 | extern int raw_notifier_chain_unregister(struct raw_notifier_head *, | ||
100 | struct notifier_block *); | ||
101 | |||
102 | extern int atomic_notifier_call_chain(struct atomic_notifier_head *, | ||
103 | unsigned long val, void *v); | ||
104 | extern int blocking_notifier_call_chain(struct blocking_notifier_head *, | ||
105 | unsigned long val, void *v); | ||
106 | extern int raw_notifier_call_chain(struct raw_notifier_head *, | ||
107 | unsigned long val, void *v); | ||
27 | 108 | ||
28 | #define NOTIFY_DONE 0x0000 /* Don't care */ | 109 | #define NOTIFY_DONE 0x0000 /* Don't care */ |
29 | #define NOTIFY_OK 0x0001 /* Suits me */ | 110 | #define NOTIFY_OK 0x0001 /* Suits me */ |
30 | #define NOTIFY_STOP_MASK 0x8000 /* Don't call further */ | 111 | #define NOTIFY_STOP_MASK 0x8000 /* Don't call further */ |
31 | #define NOTIFY_BAD (NOTIFY_STOP_MASK|0x0002) /* Bad/Veto action */ | 112 | #define NOTIFY_BAD (NOTIFY_STOP_MASK|0x0002) |
113 | /* Bad/Veto action */ | ||
32 | /* | 114 | /* |
33 | * Clean way to return from the notifier and stop further calls. | 115 | * Clean way to return from the notifier and stop further calls. |
34 | */ | 116 | */ |
diff --git a/include/linux/oprofile.h b/include/linux/oprofile.h index 559c4c38a9c7..0d514b252454 100644 --- a/include/linux/oprofile.h +++ b/include/linux/oprofile.h | |||
@@ -61,6 +61,16 @@ void oprofile_arch_exit(void); | |||
61 | */ | 61 | */ |
62 | void oprofile_add_sample(struct pt_regs * const regs, unsigned long event); | 62 | void oprofile_add_sample(struct pt_regs * const regs, unsigned long event); |
63 | 63 | ||
64 | /** | ||
65 | * Add an extended sample. Use this when the PC is not from the regs, and | ||
66 | * we cannot determine if we're in kernel mode from the regs. | ||
67 | * | ||
68 | * This function does perform a backtrace. | ||
69 | * | ||
70 | */ | ||
71 | void oprofile_add_ext_sample(unsigned long pc, struct pt_regs * const regs, | ||
72 | unsigned long event, int is_kernel); | ||
73 | |||
64 | /* Use this instead when the PC value is not from the regs. Doesn't | 74 | /* Use this instead when the PC value is not from the regs. Doesn't |
65 | * backtrace. */ | 75 | * backtrace. */ |
66 | void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event); | 76 | void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event); |
@@ -74,10 +84,10 @@ void oprofile_add_trace(unsigned long eip); | |||
74 | * the specified file operations. | 84 | * the specified file operations. |
75 | */ | 85 | */ |
76 | int oprofilefs_create_file(struct super_block * sb, struct dentry * root, | 86 | int oprofilefs_create_file(struct super_block * sb, struct dentry * root, |
77 | char const * name, struct file_operations * fops); | 87 | char const * name, const struct file_operations * fops); |
78 | 88 | ||
79 | int oprofilefs_create_file_perm(struct super_block * sb, struct dentry * root, | 89 | int oprofilefs_create_file_perm(struct super_block * sb, struct dentry * root, |
80 | char const * name, struct file_operations * fops, int perm); | 90 | char const * name, const struct file_operations * fops, int perm); |
81 | 91 | ||
82 | /** Create a file for read/write access to an unsigned long. */ | 92 | /** Create a file for read/write access to an unsigned long. */ |
83 | int oprofilefs_create_ulong(struct super_block * sb, struct dentry * root, | 93 | int oprofilefs_create_ulong(struct super_block * sb, struct dentry * root, |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 6f080ae59286..870fe38378b1 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
@@ -642,6 +642,7 @@ | |||
642 | #define PCI_DEVICE_ID_SI_965 0x0965 | 642 | #define PCI_DEVICE_ID_SI_965 0x0965 |
643 | #define PCI_DEVICE_ID_SI_5511 0x5511 | 643 | #define PCI_DEVICE_ID_SI_5511 0x5511 |
644 | #define PCI_DEVICE_ID_SI_5513 0x5513 | 644 | #define PCI_DEVICE_ID_SI_5513 0x5513 |
645 | #define PCI_DEVICE_ID_SI_5517 0x5517 | ||
645 | #define PCI_DEVICE_ID_SI_5518 0x5518 | 646 | #define PCI_DEVICE_ID_SI_5518 0x5518 |
646 | #define PCI_DEVICE_ID_SI_5571 0x5571 | 647 | #define PCI_DEVICE_ID_SI_5571 0x5571 |
647 | #define PCI_DEVICE_ID_SI_5581 0x5581 | 648 | #define PCI_DEVICE_ID_SI_5581 0x5581 |
@@ -772,6 +773,7 @@ | |||
772 | #define PCI_DEVICE_ID_MOTOROLA_HAWK 0x4803 | 773 | #define PCI_DEVICE_ID_MOTOROLA_HAWK 0x4803 |
773 | #define PCI_DEVICE_ID_MOTOROLA_HARRIER 0x480b | 774 | #define PCI_DEVICE_ID_MOTOROLA_HARRIER 0x480b |
774 | #define PCI_DEVICE_ID_MOTOROLA_MPC5200 0x5803 | 775 | #define PCI_DEVICE_ID_MOTOROLA_MPC5200 0x5803 |
776 | #define PCI_DEVICE_ID_MOTOROLA_MPC5200B 0x5809 | ||
775 | 777 | ||
776 | #define PCI_VENDOR_ID_PROMISE 0x105a | 778 | #define PCI_VENDOR_ID_PROMISE 0x105a |
777 | #define PCI_DEVICE_ID_PROMISE_20265 0x0d30 | 779 | #define PCI_DEVICE_ID_PROMISE_20265 0x0d30 |
@@ -1052,6 +1054,7 @@ | |||
1052 | #define PCIE_DEVICE_ID_NVIDIA_GEFORCE_6600_ALT2 0x00f2 | 1054 | #define PCIE_DEVICE_ID_NVIDIA_GEFORCE_6600_ALT2 0x00f2 |
1053 | #define PCIE_DEVICE_ID_NVIDIA_GEFORCE_6200_ALT1 0x00f3 | 1055 | #define PCIE_DEVICE_ID_NVIDIA_GEFORCE_6200_ALT1 0x00f3 |
1054 | #define PCIE_DEVICE_ID_NVIDIA_GEFORCE_6800_GT 0x00f9 | 1056 | #define PCIE_DEVICE_ID_NVIDIA_GEFORCE_6800_GT 0x00f9 |
1057 | #define PCIE_DEVICE_ID_NVIDIA_QUADRO_NVS280 0x00fd | ||
1055 | #define PCI_DEVICE_ID_NVIDIA_GEFORCE_SDR 0x0100 | 1058 | #define PCI_DEVICE_ID_NVIDIA_GEFORCE_SDR 0x0100 |
1056 | #define PCI_DEVICE_ID_NVIDIA_GEFORCE_DDR 0x0101 | 1059 | #define PCI_DEVICE_ID_NVIDIA_GEFORCE_DDR 0x0101 |
1057 | #define PCI_DEVICE_ID_NVIDIA_QUADRO 0x0103 | 1060 | #define PCI_DEVICE_ID_NVIDIA_QUADRO 0x0103 |
diff --git a/include/linux/pfn.h b/include/linux/pfn.h new file mode 100644 index 000000000000..bb01f8b92b56 --- /dev/null +++ b/include/linux/pfn.h | |||
@@ -0,0 +1,9 @@ | |||
1 | #ifndef _LINUX_PFN_H_ | ||
2 | #define _LINUX_PFN_H_ | ||
3 | |||
4 | #define PFN_ALIGN(x) (((unsigned long)(x) + (PAGE_SIZE - 1)) & PAGE_MASK) | ||
5 | #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) | ||
6 | #define PFN_DOWN(x) ((x) >> PAGE_SHIFT) | ||
7 | #define PFN_PHYS(x) ((x) << PAGE_SHIFT) | ||
8 | |||
9 | #endif | ||
diff --git a/include/linux/pid.h b/include/linux/pid.h index 5b2fcb19d2da..5b9082cc600f 100644 --- a/include/linux/pid.h +++ b/include/linux/pid.h | |||
@@ -4,7 +4,6 @@ | |||
4 | enum pid_type | 4 | enum pid_type |
5 | { | 5 | { |
6 | PIDTYPE_PID, | 6 | PIDTYPE_PID, |
7 | PIDTYPE_TGID, | ||
8 | PIDTYPE_PGID, | 7 | PIDTYPE_PGID, |
9 | PIDTYPE_SID, | 8 | PIDTYPE_SID, |
10 | PIDTYPE_MAX | 9 | PIDTYPE_MAX |
@@ -38,7 +37,6 @@ extern struct pid *FASTCALL(find_pid(enum pid_type, int)); | |||
38 | 37 | ||
39 | extern int alloc_pidmap(void); | 38 | extern int alloc_pidmap(void); |
40 | extern void FASTCALL(free_pidmap(int)); | 39 | extern void FASTCALL(free_pidmap(int)); |
41 | extern void switch_exec_pids(struct task_struct *leader, struct task_struct *thread); | ||
42 | 40 | ||
43 | #define do_each_task_pid(who, type, task) \ | 41 | #define do_each_task_pid(who, type, task) \ |
44 | if ((task = find_task_by_pid_type(type, who))) { \ | 42 | if ((task = find_task_by_pid_type(type, who))) { \ |
diff --git a/include/linux/poll.h b/include/linux/poll.h index 8e8f6098508a..51e1b56741fb 100644 --- a/include/linux/poll.h +++ b/include/linux/poll.h | |||
@@ -11,6 +11,15 @@ | |||
11 | #include <linux/mm.h> | 11 | #include <linux/mm.h> |
12 | #include <asm/uaccess.h> | 12 | #include <asm/uaccess.h> |
13 | 13 | ||
14 | /* ~832 bytes of stack space used max in sys_select/sys_poll before allocating | ||
15 | additional memory. */ | ||
16 | #define MAX_STACK_ALLOC 832 | ||
17 | #define FRONTEND_STACK_ALLOC 256 | ||
18 | #define SELECT_STACK_ALLOC FRONTEND_STACK_ALLOC | ||
19 | #define POLL_STACK_ALLOC FRONTEND_STACK_ALLOC | ||
20 | #define WQUEUES_STACK_ALLOC (MAX_STACK_ALLOC - FRONTEND_STACK_ALLOC) | ||
21 | #define N_INLINE_POLL_ENTRIES (WQUEUES_STACK_ALLOC / sizeof(struct poll_table_entry)) | ||
22 | |||
14 | struct poll_table_struct; | 23 | struct poll_table_struct; |
15 | 24 | ||
16 | /* | 25 | /* |
@@ -33,6 +42,12 @@ static inline void init_poll_funcptr(poll_table *pt, poll_queue_proc qproc) | |||
33 | pt->qproc = qproc; | 42 | pt->qproc = qproc; |
34 | } | 43 | } |
35 | 44 | ||
45 | struct poll_table_entry { | ||
46 | struct file * filp; | ||
47 | wait_queue_t wait; | ||
48 | wait_queue_head_t * wait_address; | ||
49 | }; | ||
50 | |||
36 | /* | 51 | /* |
37 | * Structures and helpers for sys_poll/sys_poll | 52 | * Structures and helpers for sys_poll/sys_poll |
38 | */ | 53 | */ |
@@ -40,6 +55,8 @@ struct poll_wqueues { | |||
40 | poll_table pt; | 55 | poll_table pt; |
41 | struct poll_table_page * table; | 56 | struct poll_table_page * table; |
42 | int error; | 57 | int error; |
58 | int inline_index; | ||
59 | struct poll_table_entry inline_entries[N_INLINE_POLL_ENTRIES]; | ||
43 | }; | 60 | }; |
44 | 61 | ||
45 | extern void poll_initwait(struct poll_wqueues *pwq); | 62 | extern void poll_initwait(struct poll_wqueues *pwq); |
diff --git a/include/linux/ppdev.h b/include/linux/ppdev.h index 141c96586824..f376a7598a78 100644 --- a/include/linux/ppdev.h +++ b/include/linux/ppdev.h | |||
@@ -14,8 +14,6 @@ | |||
14 | * Added PPGETMODES/PPGETMODE/PPGETPHASE, Fred Barnes <frmb2@ukc.ac.uk>, 03/01/2001 | 14 | * Added PPGETMODES/PPGETMODE/PPGETPHASE, Fred Barnes <frmb2@ukc.ac.uk>, 03/01/2001 |
15 | */ | 15 | */ |
16 | 16 | ||
17 | #define PP_MAJOR 99 | ||
18 | |||
19 | #define PP_IOCTL 'p' | 17 | #define PP_IOCTL 'p' |
20 | 18 | ||
21 | /* Set mode for read/write (e.g. IEEE1284_MODE_EPP) */ | 19 | /* Set mode for read/write (e.g. IEEE1284_MODE_EPP) */ |
diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h index aa6322d45198..135871df9911 100644 --- a/include/linux/proc_fs.h +++ b/include/linux/proc_fs.h | |||
@@ -4,6 +4,7 @@ | |||
4 | #include <linux/config.h> | 4 | #include <linux/config.h> |
5 | #include <linux/slab.h> | 5 | #include <linux/slab.h> |
6 | #include <linux/fs.h> | 6 | #include <linux/fs.h> |
7 | #include <linux/spinlock.h> | ||
7 | #include <asm/atomic.h> | 8 | #include <asm/atomic.h> |
8 | 9 | ||
9 | /* | 10 | /* |
@@ -55,9 +56,9 @@ struct proc_dir_entry { | |||
55 | nlink_t nlink; | 56 | nlink_t nlink; |
56 | uid_t uid; | 57 | uid_t uid; |
57 | gid_t gid; | 58 | gid_t gid; |
58 | unsigned long size; | 59 | loff_t size; |
59 | struct inode_operations * proc_iops; | 60 | struct inode_operations * proc_iops; |
60 | struct file_operations * proc_fops; | 61 | const struct file_operations * proc_fops; |
61 | get_info_t *get_info; | 62 | get_info_t *get_info; |
62 | struct module *owner; | 63 | struct module *owner; |
63 | struct proc_dir_entry *next, *parent, *subdir; | 64 | struct proc_dir_entry *next, *parent, *subdir; |
@@ -92,6 +93,8 @@ extern struct proc_dir_entry *proc_bus; | |||
92 | extern struct proc_dir_entry *proc_root_driver; | 93 | extern struct proc_dir_entry *proc_root_driver; |
93 | extern struct proc_dir_entry *proc_root_kcore; | 94 | extern struct proc_dir_entry *proc_root_kcore; |
94 | 95 | ||
96 | extern spinlock_t proc_subdir_lock; | ||
97 | |||
95 | extern void proc_root_init(void); | 98 | extern void proc_root_init(void); |
96 | extern void proc_misc_init(void); | 99 | extern void proc_misc_init(void); |
97 | 100 | ||
@@ -125,9 +128,9 @@ extern int proc_match(int, const char *,struct proc_dir_entry *); | |||
125 | extern int proc_readdir(struct file *, void *, filldir_t); | 128 | extern int proc_readdir(struct file *, void *, filldir_t); |
126 | extern struct dentry *proc_lookup(struct inode *, struct dentry *, struct nameidata *); | 129 | extern struct dentry *proc_lookup(struct inode *, struct dentry *, struct nameidata *); |
127 | 130 | ||
128 | extern struct file_operations proc_kcore_operations; | 131 | extern const struct file_operations proc_kcore_operations; |
129 | extern struct file_operations proc_kmsg_operations; | 132 | extern const struct file_operations proc_kmsg_operations; |
130 | extern struct file_operations ppc_htab_operations; | 133 | extern const struct file_operations ppc_htab_operations; |
131 | 134 | ||
132 | /* | 135 | /* |
133 | * proc_tty.c | 136 | * proc_tty.c |
@@ -186,7 +189,7 @@ static inline struct proc_dir_entry *proc_net_create(const char *name, | |||
186 | } | 189 | } |
187 | 190 | ||
188 | static inline struct proc_dir_entry *proc_net_fops_create(const char *name, | 191 | static inline struct proc_dir_entry *proc_net_fops_create(const char *name, |
189 | mode_t mode, struct file_operations *fops) | 192 | mode_t mode, const struct file_operations *fops) |
190 | { | 193 | { |
191 | struct proc_dir_entry *res = create_proc_entry(name, mode, proc_net); | 194 | struct proc_dir_entry *res = create_proc_entry(name, mode, proc_net); |
192 | if (res) | 195 | if (res) |
diff --git a/include/linux/qnx4_fs.h b/include/linux/qnx4_fs.h index fc610bb0f733..27f49c85d5d6 100644 --- a/include/linux/qnx4_fs.h +++ b/include/linux/qnx4_fs.h | |||
@@ -118,8 +118,8 @@ extern struct buffer_head *qnx4_bread(struct inode *, int, int); | |||
118 | 118 | ||
119 | extern struct inode_operations qnx4_file_inode_operations; | 119 | extern struct inode_operations qnx4_file_inode_operations; |
120 | extern struct inode_operations qnx4_dir_inode_operations; | 120 | extern struct inode_operations qnx4_dir_inode_operations; |
121 | extern struct file_operations qnx4_file_operations; | 121 | extern const struct file_operations qnx4_file_operations; |
122 | extern struct file_operations qnx4_dir_operations; | 122 | extern const struct file_operations qnx4_dir_operations; |
123 | extern int qnx4_is_free(struct super_block *sb, long block); | 123 | extern int qnx4_is_free(struct super_block *sb, long block); |
124 | extern int qnx4_set_bitmap(struct super_block *sb, long block, int busy); | 124 | extern int qnx4_set_bitmap(struct super_block *sb, long block, int busy); |
125 | extern int qnx4_create(struct inode *inode, struct dentry *dentry, int mode, struct nameidata *nd); | 125 | extern int qnx4_create(struct inode *inode, struct dentry *dentry, int mode, struct nameidata *nd); |
diff --git a/include/linux/quota.h b/include/linux/quota.h index 8dc2d04a103f..2dab71e1c3d1 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h | |||
@@ -209,7 +209,6 @@ extern struct dqstats dqstats; | |||
209 | #define DQ_FAKE_B 3 /* no limits only usage */ | 209 | #define DQ_FAKE_B 3 /* no limits only usage */ |
210 | #define DQ_READ_B 4 /* dquot was read into memory */ | 210 | #define DQ_READ_B 4 /* dquot was read into memory */ |
211 | #define DQ_ACTIVE_B 5 /* dquot is active (dquot_release not called) */ | 211 | #define DQ_ACTIVE_B 5 /* dquot is active (dquot_release not called) */ |
212 | #define DQ_WAITFREE_B 6 /* dquot being waited (by invalidate_dquots) */ | ||
213 | 212 | ||
214 | struct dquot { | 213 | struct dquot { |
215 | struct hlist_node dq_hash; /* Hash list in memory */ | 214 | struct hlist_node dq_hash; /* Hash list in memory */ |
diff --git a/include/linux/radix-tree.h b/include/linux/radix-tree.h index c57ff2fcb30a..dd83cca28001 100644 --- a/include/linux/radix-tree.h +++ b/include/linux/radix-tree.h | |||
@@ -45,6 +45,8 @@ do { \ | |||
45 | (root)->rnode = NULL; \ | 45 | (root)->rnode = NULL; \ |
46 | } while (0) | 46 | } while (0) |
47 | 47 | ||
48 | #define RADIX_TREE_MAX_TAGS 2 | ||
49 | |||
48 | int radix_tree_insert(struct radix_tree_root *, unsigned long, void *); | 50 | int radix_tree_insert(struct radix_tree_root *, unsigned long, void *); |
49 | void *radix_tree_lookup(struct radix_tree_root *, unsigned long); | 51 | void *radix_tree_lookup(struct radix_tree_root *, unsigned long); |
50 | void **radix_tree_lookup_slot(struct radix_tree_root *, unsigned long); | 52 | void **radix_tree_lookup_slot(struct radix_tree_root *, unsigned long); |
@@ -55,15 +57,16 @@ radix_tree_gang_lookup(struct radix_tree_root *root, void **results, | |||
55 | int radix_tree_preload(gfp_t gfp_mask); | 57 | int radix_tree_preload(gfp_t gfp_mask); |
56 | void radix_tree_init(void); | 58 | void radix_tree_init(void); |
57 | void *radix_tree_tag_set(struct radix_tree_root *root, | 59 | void *radix_tree_tag_set(struct radix_tree_root *root, |
58 | unsigned long index, int tag); | 60 | unsigned long index, unsigned int tag); |
59 | void *radix_tree_tag_clear(struct radix_tree_root *root, | 61 | void *radix_tree_tag_clear(struct radix_tree_root *root, |
60 | unsigned long index, int tag); | 62 | unsigned long index, unsigned int tag); |
61 | int radix_tree_tag_get(struct radix_tree_root *root, | 63 | int radix_tree_tag_get(struct radix_tree_root *root, |
62 | unsigned long index, int tag); | 64 | unsigned long index, unsigned int tag); |
63 | unsigned int | 65 | unsigned int |
64 | radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results, | 66 | radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results, |
65 | unsigned long first_index, unsigned int max_items, int tag); | 67 | unsigned long first_index, unsigned int max_items, |
66 | int radix_tree_tagged(struct radix_tree_root *root, int tag); | 68 | unsigned int tag); |
69 | int radix_tree_tagged(struct radix_tree_root *root, unsigned int tag); | ||
67 | 70 | ||
68 | static inline void radix_tree_preload_end(void) | 71 | static inline void radix_tree_preload_end(void) |
69 | { | 72 | { |
diff --git a/include/linux/raid/md.h b/include/linux/raid/md.h index b6e0bcad84e1..66b44e5e0d6e 100644 --- a/include/linux/raid/md.h +++ b/include/linux/raid/md.h | |||
@@ -92,7 +92,10 @@ extern void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev, | |||
92 | extern void md_super_wait(mddev_t *mddev); | 92 | extern void md_super_wait(mddev_t *mddev); |
93 | extern int sync_page_io(struct block_device *bdev, sector_t sector, int size, | 93 | extern int sync_page_io(struct block_device *bdev, sector_t sector, int size, |
94 | struct page *page, int rw); | 94 | struct page *page, int rw); |
95 | extern void md_do_sync(mddev_t *mddev); | ||
96 | extern void md_new_event(mddev_t *mddev); | ||
95 | 97 | ||
98 | extern void md_update_sb(mddev_t * mddev); | ||
96 | 99 | ||
97 | #define MD_BUG(x...) { printk("md: bug in file %s, line %d\n", __FILE__, __LINE__); md_print_devices(); } | 100 | #define MD_BUG(x...) { printk("md: bug in file %s, line %d\n", __FILE__, __LINE__); md_print_devices(); } |
98 | 101 | ||
diff --git a/include/linux/raid/md_k.h b/include/linux/raid/md_k.h index 617b9506c760..e2df61f5b09a 100644 --- a/include/linux/raid/md_k.h +++ b/include/linux/raid/md_k.h | |||
@@ -132,6 +132,14 @@ struct mddev_s | |||
132 | 132 | ||
133 | char uuid[16]; | 133 | char uuid[16]; |
134 | 134 | ||
135 | /* If the array is being reshaped, we need to record the | ||
136 | * new shape and an indication of where we are up to. | ||
137 | * This is written to the superblock. | ||
138 | * If reshape_position is MaxSector, then no reshape is happening (yet). | ||
139 | */ | ||
140 | sector_t reshape_position; | ||
141 | int delta_disks, new_level, new_layout, new_chunk; | ||
142 | |||
135 | struct mdk_thread_s *thread; /* management thread */ | 143 | struct mdk_thread_s *thread; /* management thread */ |
136 | struct mdk_thread_s *sync_thread; /* doing resync or reconstruct */ | 144 | struct mdk_thread_s *sync_thread; /* doing resync or reconstruct */ |
137 | sector_t curr_resync; /* blocks scheduled */ | 145 | sector_t curr_resync; /* blocks scheduled */ |
@@ -143,6 +151,10 @@ struct mddev_s | |||
143 | sector_t resync_mismatches; /* count of sectors where | 151 | sector_t resync_mismatches; /* count of sectors where |
144 | * parity/replica mismatch found | 152 | * parity/replica mismatch found |
145 | */ | 153 | */ |
154 | |||
155 | /* allow user-space to request suspension of IO to regions of the array */ | ||
156 | sector_t suspend_lo; | ||
157 | sector_t suspend_hi; | ||
146 | /* if zero, use the system-wide default */ | 158 | /* if zero, use the system-wide default */ |
147 | int sync_speed_min; | 159 | int sync_speed_min; |
148 | int sync_speed_max; | 160 | int sync_speed_max; |
@@ -157,6 +169,9 @@ struct mddev_s | |||
157 | * DONE: thread is done and is waiting to be reaped | 169 | * DONE: thread is done and is waiting to be reaped |
158 | * REQUEST: user-space has requested a sync (used with SYNC) | 170 | * REQUEST: user-space has requested a sync (used with SYNC) |
159 | * CHECK: user-space request for for check-only, no repair | 171 | * CHECK: user-space request for for check-only, no repair |
172 | * RESHAPE: A reshape is happening | ||
173 | * | ||
174 | * If neither SYNC or RESHAPE are set, then it is a recovery. | ||
160 | */ | 175 | */ |
161 | #define MD_RECOVERY_RUNNING 0 | 176 | #define MD_RECOVERY_RUNNING 0 |
162 | #define MD_RECOVERY_SYNC 1 | 177 | #define MD_RECOVERY_SYNC 1 |
@@ -166,10 +181,11 @@ struct mddev_s | |||
166 | #define MD_RECOVERY_NEEDED 5 | 181 | #define MD_RECOVERY_NEEDED 5 |
167 | #define MD_RECOVERY_REQUESTED 6 | 182 | #define MD_RECOVERY_REQUESTED 6 |
168 | #define MD_RECOVERY_CHECK 7 | 183 | #define MD_RECOVERY_CHECK 7 |
184 | #define MD_RECOVERY_RESHAPE 8 | ||
169 | unsigned long recovery; | 185 | unsigned long recovery; |
170 | 186 | ||
171 | int in_sync; /* know to not need resync */ | 187 | int in_sync; /* know to not need resync */ |
172 | struct semaphore reconfig_sem; | 188 | struct mutex reconfig_mutex; |
173 | atomic_t active; | 189 | atomic_t active; |
174 | 190 | ||
175 | int changed; /* true if we might need to reread partition info */ | 191 | int changed; /* true if we might need to reread partition info */ |
@@ -249,7 +265,8 @@ struct mdk_personality | |||
249 | int (*spare_active) (mddev_t *mddev); | 265 | int (*spare_active) (mddev_t *mddev); |
250 | sector_t (*sync_request)(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster); | 266 | sector_t (*sync_request)(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster); |
251 | int (*resize) (mddev_t *mddev, sector_t sectors); | 267 | int (*resize) (mddev_t *mddev, sector_t sectors); |
252 | int (*reshape) (mddev_t *mddev, int raid_disks); | 268 | int (*check_reshape) (mddev_t *mddev); |
269 | int (*start_reshape) (mddev_t *mddev); | ||
253 | int (*reconfig) (mddev_t *mddev, int layout, int chunk_size); | 270 | int (*reconfig) (mddev_t *mddev, int layout, int chunk_size); |
254 | /* quiesce moves between quiescence states | 271 | /* quiesce moves between quiescence states |
255 | * 0 - fully active | 272 | * 0 - fully active |
diff --git a/include/linux/raid/md_p.h b/include/linux/raid/md_p.h index c100fa5d4bfa..774e1acfb8c4 100644 --- a/include/linux/raid/md_p.h +++ b/include/linux/raid/md_p.h | |||
@@ -102,6 +102,18 @@ typedef struct mdp_device_descriptor_s { | |||
102 | #define MD_SB_ERRORS 1 | 102 | #define MD_SB_ERRORS 1 |
103 | 103 | ||
104 | #define MD_SB_BITMAP_PRESENT 8 /* bitmap may be present nearby */ | 104 | #define MD_SB_BITMAP_PRESENT 8 /* bitmap may be present nearby */ |
105 | |||
106 | /* | ||
107 | * Notes: | ||
108 | * - if an array is being reshaped (restriped) in order to change the | ||
109 | * the number of active devices in the array, 'raid_disks' will be | ||
110 | * the larger of the old and new numbers. 'delta_disks' will | ||
111 | * be the "new - old". So if +ve, raid_disks is the new value, and | ||
112 | * "raid_disks-delta_disks" is the old. If -ve, raid_disks is the | ||
113 | * old value and "raid_disks+delta_disks" is the new (smaller) value. | ||
114 | */ | ||
115 | |||
116 | |||
105 | typedef struct mdp_superblock_s { | 117 | typedef struct mdp_superblock_s { |
106 | /* | 118 | /* |
107 | * Constant generic information | 119 | * Constant generic information |
@@ -146,7 +158,13 @@ typedef struct mdp_superblock_s { | |||
146 | __u32 cp_events_hi; /* 10 high-order of checkpoint update count */ | 158 | __u32 cp_events_hi; /* 10 high-order of checkpoint update count */ |
147 | #endif | 159 | #endif |
148 | __u32 recovery_cp; /* 11 recovery checkpoint sector count */ | 160 | __u32 recovery_cp; /* 11 recovery checkpoint sector count */ |
149 | __u32 gstate_sreserved[MD_SB_GENERIC_STATE_WORDS - 12]; | 161 | /* There are only valid for minor_version > 90 */ |
162 | __u64 reshape_position; /* 12,13 next address in array-space for reshape */ | ||
163 | __u32 new_level; /* 14 new level we are reshaping to */ | ||
164 | __u32 delta_disks; /* 15 change in number of raid_disks */ | ||
165 | __u32 new_layout; /* 16 new layout */ | ||
166 | __u32 new_chunk; /* 17 new chunk size (bytes) */ | ||
167 | __u32 gstate_sreserved[MD_SB_GENERIC_STATE_WORDS - 18]; | ||
150 | 168 | ||
151 | /* | 169 | /* |
152 | * Personality information | 170 | * Personality information |
@@ -207,7 +225,14 @@ struct mdp_superblock_1 { | |||
207 | * NOTE: signed, so bitmap can be before superblock | 225 | * NOTE: signed, so bitmap can be before superblock |
208 | * only meaningful of feature_map[0] is set. | 226 | * only meaningful of feature_map[0] is set. |
209 | */ | 227 | */ |
210 | __u8 pad1[128-100]; /* set to 0 when written */ | 228 | |
229 | /* These are only valid with feature bit '4' */ | ||
230 | __u64 reshape_position; /* next address in array-space for reshape */ | ||
231 | __u32 new_level; /* new level we are reshaping to */ | ||
232 | __u32 delta_disks; /* change in number of raid_disks */ | ||
233 | __u32 new_layout; /* new layout */ | ||
234 | __u32 new_chunk; /* new chunk size (bytes) */ | ||
235 | __u8 pad1[128-124]; /* set to 0 when written */ | ||
211 | 236 | ||
212 | /* constant this-device information - 64 bytes */ | 237 | /* constant this-device information - 64 bytes */ |
213 | __u64 data_offset; /* sector start of data, often 0 */ | 238 | __u64 data_offset; /* sector start of data, often 0 */ |
@@ -240,8 +265,9 @@ struct mdp_superblock_1 { | |||
240 | 265 | ||
241 | /* feature_map bits */ | 266 | /* feature_map bits */ |
242 | #define MD_FEATURE_BITMAP_OFFSET 1 | 267 | #define MD_FEATURE_BITMAP_OFFSET 1 |
268 | #define MD_FEATURE_RESHAPE_ACTIVE 4 | ||
243 | 269 | ||
244 | #define MD_FEATURE_ALL 1 | 270 | #define MD_FEATURE_ALL 5 |
245 | 271 | ||
246 | #endif | 272 | #endif |
247 | 273 | ||
diff --git a/include/linux/raid/raid5.h b/include/linux/raid/raid5.h index 394da8207b34..914af667044f 100644 --- a/include/linux/raid/raid5.h +++ b/include/linux/raid/raid5.h | |||
@@ -135,6 +135,7 @@ struct stripe_head { | |||
135 | atomic_t count; /* nr of active thread/requests */ | 135 | atomic_t count; /* nr of active thread/requests */ |
136 | spinlock_t lock; | 136 | spinlock_t lock; |
137 | int bm_seq; /* sequence number for bitmap flushes */ | 137 | int bm_seq; /* sequence number for bitmap flushes */ |
138 | int disks; /* disks in stripe */ | ||
138 | struct r5dev { | 139 | struct r5dev { |
139 | struct bio req; | 140 | struct bio req; |
140 | struct bio_vec vec; | 141 | struct bio_vec vec; |
@@ -156,6 +157,7 @@ struct stripe_head { | |||
156 | #define R5_ReadError 8 /* seen a read error here recently */ | 157 | #define R5_ReadError 8 /* seen a read error here recently */ |
157 | #define R5_ReWrite 9 /* have tried to over-write the readerror */ | 158 | #define R5_ReWrite 9 /* have tried to over-write the readerror */ |
158 | 159 | ||
160 | #define R5_Expanded 10 /* This block now has post-expand data */ | ||
159 | /* | 161 | /* |
160 | * Write method | 162 | * Write method |
161 | */ | 163 | */ |
@@ -174,7 +176,9 @@ struct stripe_head { | |||
174 | #define STRIPE_DELAYED 6 | 176 | #define STRIPE_DELAYED 6 |
175 | #define STRIPE_DEGRADED 7 | 177 | #define STRIPE_DEGRADED 7 |
176 | #define STRIPE_BIT_DELAY 8 | 178 | #define STRIPE_BIT_DELAY 8 |
177 | 179 | #define STRIPE_EXPANDING 9 | |
180 | #define STRIPE_EXPAND_SOURCE 10 | ||
181 | #define STRIPE_EXPAND_READY 11 | ||
178 | /* | 182 | /* |
179 | * Plugging: | 183 | * Plugging: |
180 | * | 184 | * |
@@ -211,12 +215,24 @@ struct raid5_private_data { | |||
211 | int raid_disks, working_disks, failed_disks; | 215 | int raid_disks, working_disks, failed_disks; |
212 | int max_nr_stripes; | 216 | int max_nr_stripes; |
213 | 217 | ||
218 | /* used during an expand */ | ||
219 | sector_t expand_progress; /* MaxSector when no expand happening */ | ||
220 | sector_t expand_lo; /* from here up to expand_progress it out-of-bounds | ||
221 | * as we haven't flushed the metadata yet | ||
222 | */ | ||
223 | int previous_raid_disks; | ||
224 | |||
214 | struct list_head handle_list; /* stripes needing handling */ | 225 | struct list_head handle_list; /* stripes needing handling */ |
215 | struct list_head delayed_list; /* stripes that have plugged requests */ | 226 | struct list_head delayed_list; /* stripes that have plugged requests */ |
216 | struct list_head bitmap_list; /* stripes delaying awaiting bitmap update */ | 227 | struct list_head bitmap_list; /* stripes delaying awaiting bitmap update */ |
217 | atomic_t preread_active_stripes; /* stripes with scheduled io */ | 228 | atomic_t preread_active_stripes; /* stripes with scheduled io */ |
218 | 229 | ||
219 | char cache_name[20]; | 230 | atomic_t reshape_stripes; /* stripes with pending writes for reshape */ |
231 | /* unfortunately we need two cache names as we temporarily have | ||
232 | * two caches. | ||
233 | */ | ||
234 | int active_name; | ||
235 | char cache_name[2][20]; | ||
220 | kmem_cache_t *slab_cache; /* for allocating stripes */ | 236 | kmem_cache_t *slab_cache; /* for allocating stripes */ |
221 | 237 | ||
222 | int seq_flush, seq_write; | 238 | int seq_flush, seq_write; |
@@ -238,9 +254,10 @@ struct raid5_private_data { | |||
238 | wait_queue_head_t wait_for_overlap; | 254 | wait_queue_head_t wait_for_overlap; |
239 | int inactive_blocked; /* release of inactive stripes blocked, | 255 | int inactive_blocked; /* release of inactive stripes blocked, |
240 | * waiting for 25% to be free | 256 | * waiting for 25% to be free |
241 | */ | 257 | */ |
258 | int pool_size; /* number of disks in stripeheads in pool */ | ||
242 | spinlock_t device_lock; | 259 | spinlock_t device_lock; |
243 | struct disk_info disks[0]; | 260 | struct disk_info *disks; |
244 | }; | 261 | }; |
245 | 262 | ||
246 | typedef struct raid5_private_data raid5_conf_t; | 263 | typedef struct raid5_private_data raid5_conf_t; |
diff --git a/include/linux/ramfs.h b/include/linux/ramfs.h index 953b6df5d037..78ecfa28b1c2 100644 --- a/include/linux/ramfs.h +++ b/include/linux/ramfs.h | |||
@@ -15,7 +15,7 @@ extern unsigned long ramfs_nommu_get_unmapped_area(struct file *file, | |||
15 | extern int ramfs_nommu_mmap(struct file *file, struct vm_area_struct *vma); | 15 | extern int ramfs_nommu_mmap(struct file *file, struct vm_area_struct *vma); |
16 | #endif | 16 | #endif |
17 | 17 | ||
18 | extern struct file_operations ramfs_file_operations; | 18 | extern const struct file_operations ramfs_file_operations; |
19 | extern struct vm_operations_struct generic_file_vm_ops; | 19 | extern struct vm_operations_struct generic_file_vm_ops; |
20 | 20 | ||
21 | #endif | 21 | #endif |
diff --git a/include/linux/reiserfs_fs.h b/include/linux/reiserfs_fs.h index dad78cecfd20..5676c4210e2c 100644 --- a/include/linux/reiserfs_fs.h +++ b/include/linux/reiserfs_fs.h | |||
@@ -1704,6 +1704,11 @@ static inline int reiserfs_transaction_running(struct super_block *s) | |||
1704 | return 0; | 1704 | return 0; |
1705 | } | 1705 | } |
1706 | 1706 | ||
1707 | static inline int reiserfs_transaction_free_space(struct reiserfs_transaction_handle *th) | ||
1708 | { | ||
1709 | return th->t_blocks_allocated - th->t_blocks_logged; | ||
1710 | } | ||
1711 | |||
1707 | int reiserfs_async_progress_wait(struct super_block *s); | 1712 | int reiserfs_async_progress_wait(struct super_block *s); |
1708 | 1713 | ||
1709 | struct reiserfs_transaction_handle *reiserfs_persistent_transaction(struct | 1714 | struct reiserfs_transaction_handle *reiserfs_persistent_transaction(struct |
@@ -1955,7 +1960,7 @@ int reiserfs_global_version_in_proc(char *buffer, char **start, off_t offset, | |||
1955 | extern struct inode_operations reiserfs_dir_inode_operations; | 1960 | extern struct inode_operations reiserfs_dir_inode_operations; |
1956 | extern struct inode_operations reiserfs_symlink_inode_operations; | 1961 | extern struct inode_operations reiserfs_symlink_inode_operations; |
1957 | extern struct inode_operations reiserfs_special_inode_operations; | 1962 | extern struct inode_operations reiserfs_special_inode_operations; |
1958 | extern struct file_operations reiserfs_dir_operations; | 1963 | extern const struct file_operations reiserfs_dir_operations; |
1959 | 1964 | ||
1960 | /* tail_conversion.c */ | 1965 | /* tail_conversion.c */ |
1961 | int direct2indirect(struct reiserfs_transaction_handle *, struct inode *, | 1966 | int direct2indirect(struct reiserfs_transaction_handle *, struct inode *, |
@@ -1967,7 +1972,7 @@ void reiserfs_unmap_buffer(struct buffer_head *); | |||
1967 | 1972 | ||
1968 | /* file.c */ | 1973 | /* file.c */ |
1969 | extern struct inode_operations reiserfs_file_inode_operations; | 1974 | extern struct inode_operations reiserfs_file_inode_operations; |
1970 | extern struct file_operations reiserfs_file_operations; | 1975 | extern const struct file_operations reiserfs_file_operations; |
1971 | extern struct address_space_operations reiserfs_address_space_operations; | 1976 | extern struct address_space_operations reiserfs_address_space_operations; |
1972 | 1977 | ||
1973 | /* fix_nodes.c */ | 1978 | /* fix_nodes.c */ |
diff --git a/include/linux/reiserfs_xattr.h b/include/linux/reiserfs_xattr.h index 87280eb6083d..5353afb11db3 100644 --- a/include/linux/reiserfs_xattr.h +++ b/include/linux/reiserfs_xattr.h | |||
@@ -101,13 +101,13 @@ static inline void reiserfs_mark_inode_private(struct inode *inode) | |||
101 | #else | 101 | #else |
102 | 102 | ||
103 | #define is_reiserfs_priv_object(inode) 0 | 103 | #define is_reiserfs_priv_object(inode) 0 |
104 | #define reiserfs_mark_inode_private(inode) | 104 | #define reiserfs_mark_inode_private(inode) do {;} while(0) |
105 | #define reiserfs_getxattr NULL | 105 | #define reiserfs_getxattr NULL |
106 | #define reiserfs_setxattr NULL | 106 | #define reiserfs_setxattr NULL |
107 | #define reiserfs_listxattr NULL | 107 | #define reiserfs_listxattr NULL |
108 | #define reiserfs_removexattr NULL | 108 | #define reiserfs_removexattr NULL |
109 | #define reiserfs_write_lock_xattrs(sb) | 109 | #define reiserfs_write_lock_xattrs(sb) do {;} while(0) |
110 | #define reiserfs_write_unlock_xattrs(sb) | 110 | #define reiserfs_write_unlock_xattrs(sb) do {;} while(0) |
111 | #define reiserfs_read_lock_xattrs(sb) | 111 | #define reiserfs_read_lock_xattrs(sb) |
112 | #define reiserfs_read_unlock_xattrs(sb) | 112 | #define reiserfs_read_unlock_xattrs(sb) |
113 | 113 | ||
diff --git a/include/linux/relayfs_fs.h b/include/linux/relayfs_fs.h deleted file mode 100644 index 7342e66247fb..000000000000 --- a/include/linux/relayfs_fs.h +++ /dev/null | |||
@@ -1,287 +0,0 @@ | |||
1 | /* | ||
2 | * linux/include/linux/relayfs_fs.h | ||
3 | * | ||
4 | * Copyright (C) 2002, 2003 - Tom Zanussi (zanussi@us.ibm.com), IBM Corp | ||
5 | * Copyright (C) 1999, 2000, 2001, 2002 - Karim Yaghmour (karim@opersys.com) | ||
6 | * | ||
7 | * RelayFS definitions and declarations | ||
8 | */ | ||
9 | |||
10 | #ifndef _LINUX_RELAYFS_FS_H | ||
11 | #define _LINUX_RELAYFS_FS_H | ||
12 | |||
13 | #include <linux/config.h> | ||
14 | #include <linux/types.h> | ||
15 | #include <linux/sched.h> | ||
16 | #include <linux/wait.h> | ||
17 | #include <linux/list.h> | ||
18 | #include <linux/fs.h> | ||
19 | #include <linux/poll.h> | ||
20 | #include <linux/kref.h> | ||
21 | |||
22 | /* | ||
23 | * Tracks changes to rchan/rchan_buf structs | ||
24 | */ | ||
25 | #define RELAYFS_CHANNEL_VERSION 6 | ||
26 | |||
27 | /* | ||
28 | * Per-cpu relay channel buffer | ||
29 | */ | ||
30 | struct rchan_buf | ||
31 | { | ||
32 | void *start; /* start of channel buffer */ | ||
33 | void *data; /* start of current sub-buffer */ | ||
34 | size_t offset; /* current offset into sub-buffer */ | ||
35 | size_t subbufs_produced; /* count of sub-buffers produced */ | ||
36 | size_t subbufs_consumed; /* count of sub-buffers consumed */ | ||
37 | struct rchan *chan; /* associated channel */ | ||
38 | wait_queue_head_t read_wait; /* reader wait queue */ | ||
39 | struct work_struct wake_readers; /* reader wake-up work struct */ | ||
40 | struct dentry *dentry; /* channel file dentry */ | ||
41 | struct kref kref; /* channel buffer refcount */ | ||
42 | struct page **page_array; /* array of current buffer pages */ | ||
43 | unsigned int page_count; /* number of current buffer pages */ | ||
44 | unsigned int finalized; /* buffer has been finalized */ | ||
45 | size_t *padding; /* padding counts per sub-buffer */ | ||
46 | size_t prev_padding; /* temporary variable */ | ||
47 | size_t bytes_consumed; /* bytes consumed in cur read subbuf */ | ||
48 | unsigned int cpu; /* this buf's cpu */ | ||
49 | } ____cacheline_aligned; | ||
50 | |||
51 | /* | ||
52 | * Relay channel data structure | ||
53 | */ | ||
54 | struct rchan | ||
55 | { | ||
56 | u32 version; /* the version of this struct */ | ||
57 | size_t subbuf_size; /* sub-buffer size */ | ||
58 | size_t n_subbufs; /* number of sub-buffers per buffer */ | ||
59 | size_t alloc_size; /* total buffer size allocated */ | ||
60 | struct rchan_callbacks *cb; /* client callbacks */ | ||
61 | struct kref kref; /* channel refcount */ | ||
62 | void *private_data; /* for user-defined data */ | ||
63 | size_t last_toobig; /* tried to log event > subbuf size */ | ||
64 | struct rchan_buf *buf[NR_CPUS]; /* per-cpu channel buffers */ | ||
65 | }; | ||
66 | |||
67 | /* | ||
68 | * Relay channel client callbacks | ||
69 | */ | ||
70 | struct rchan_callbacks | ||
71 | { | ||
72 | /* | ||
73 | * subbuf_start - called on buffer-switch to a new sub-buffer | ||
74 | * @buf: the channel buffer containing the new sub-buffer | ||
75 | * @subbuf: the start of the new sub-buffer | ||
76 | * @prev_subbuf: the start of the previous sub-buffer | ||
77 | * @prev_padding: unused space at the end of previous sub-buffer | ||
78 | * | ||
79 | * The client should return 1 to continue logging, 0 to stop | ||
80 | * logging. | ||
81 | * | ||
82 | * NOTE: subbuf_start will also be invoked when the buffer is | ||
83 | * created, so that the first sub-buffer can be initialized | ||
84 | * if necessary. In this case, prev_subbuf will be NULL. | ||
85 | * | ||
86 | * NOTE: the client can reserve bytes at the beginning of the new | ||
87 | * sub-buffer by calling subbuf_start_reserve() in this callback. | ||
88 | */ | ||
89 | int (*subbuf_start) (struct rchan_buf *buf, | ||
90 | void *subbuf, | ||
91 | void *prev_subbuf, | ||
92 | size_t prev_padding); | ||
93 | |||
94 | /* | ||
95 | * buf_mapped - relayfs buffer mmap notification | ||
96 | * @buf: the channel buffer | ||
97 | * @filp: relayfs file pointer | ||
98 | * | ||
99 | * Called when a relayfs file is successfully mmapped | ||
100 | */ | ||
101 | void (*buf_mapped)(struct rchan_buf *buf, | ||
102 | struct file *filp); | ||
103 | |||
104 | /* | ||
105 | * buf_unmapped - relayfs buffer unmap notification | ||
106 | * @buf: the channel buffer | ||
107 | * @filp: relayfs file pointer | ||
108 | * | ||
109 | * Called when a relayfs file is successfully unmapped | ||
110 | */ | ||
111 | void (*buf_unmapped)(struct rchan_buf *buf, | ||
112 | struct file *filp); | ||
113 | /* | ||
114 | * create_buf_file - create file to represent a relayfs channel buffer | ||
115 | * @filename: the name of the file to create | ||
116 | * @parent: the parent of the file to create | ||
117 | * @mode: the mode of the file to create | ||
118 | * @buf: the channel buffer | ||
119 | * @is_global: outparam - set non-zero if the buffer should be global | ||
120 | * | ||
121 | * Called during relay_open(), once for each per-cpu buffer, | ||
122 | * to allow the client to create a file to be used to | ||
123 | * represent the corresponding channel buffer. If the file is | ||
124 | * created outside of relayfs, the parent must also exist in | ||
125 | * that filesystem. | ||
126 | * | ||
127 | * The callback should return the dentry of the file created | ||
128 | * to represent the relay buffer. | ||
129 | * | ||
130 | * Setting the is_global outparam to a non-zero value will | ||
131 | * cause relay_open() to create a single global buffer rather | ||
132 | * than the default set of per-cpu buffers. | ||
133 | * | ||
134 | * See Documentation/filesystems/relayfs.txt for more info. | ||
135 | */ | ||
136 | struct dentry *(*create_buf_file)(const char *filename, | ||
137 | struct dentry *parent, | ||
138 | int mode, | ||
139 | struct rchan_buf *buf, | ||
140 | int *is_global); | ||
141 | |||
142 | /* | ||
143 | * remove_buf_file - remove file representing a relayfs channel buffer | ||
144 | * @dentry: the dentry of the file to remove | ||
145 | * | ||
146 | * Called during relay_close(), once for each per-cpu buffer, | ||
147 | * to allow the client to remove a file used to represent a | ||
148 | * channel buffer. | ||
149 | * | ||
150 | * The callback should return 0 if successful, negative if not. | ||
151 | */ | ||
152 | int (*remove_buf_file)(struct dentry *dentry); | ||
153 | }; | ||
154 | |||
155 | /* | ||
156 | * relayfs kernel API, fs/relayfs/relay.c | ||
157 | */ | ||
158 | |||
159 | struct rchan *relay_open(const char *base_filename, | ||
160 | struct dentry *parent, | ||
161 | size_t subbuf_size, | ||
162 | size_t n_subbufs, | ||
163 | struct rchan_callbacks *cb); | ||
164 | extern void relay_close(struct rchan *chan); | ||
165 | extern void relay_flush(struct rchan *chan); | ||
166 | extern void relay_subbufs_consumed(struct rchan *chan, | ||
167 | unsigned int cpu, | ||
168 | size_t consumed); | ||
169 | extern void relay_reset(struct rchan *chan); | ||
170 | extern int relay_buf_full(struct rchan_buf *buf); | ||
171 | |||
172 | extern size_t relay_switch_subbuf(struct rchan_buf *buf, | ||
173 | size_t length); | ||
174 | extern struct dentry *relayfs_create_dir(const char *name, | ||
175 | struct dentry *parent); | ||
176 | extern int relayfs_remove_dir(struct dentry *dentry); | ||
177 | extern struct dentry *relayfs_create_file(const char *name, | ||
178 | struct dentry *parent, | ||
179 | int mode, | ||
180 | struct file_operations *fops, | ||
181 | void *data); | ||
182 | extern int relayfs_remove_file(struct dentry *dentry); | ||
183 | |||
184 | /** | ||
185 | * relay_write - write data into the channel | ||
186 | * @chan: relay channel | ||
187 | * @data: data to be written | ||
188 | * @length: number of bytes to write | ||
189 | * | ||
190 | * Writes data into the current cpu's channel buffer. | ||
191 | * | ||
192 | * Protects the buffer by disabling interrupts. Use this | ||
193 | * if you might be logging from interrupt context. Try | ||
194 | * __relay_write() if you know you won't be logging from | ||
195 | * interrupt context. | ||
196 | */ | ||
197 | static inline void relay_write(struct rchan *chan, | ||
198 | const void *data, | ||
199 | size_t length) | ||
200 | { | ||
201 | unsigned long flags; | ||
202 | struct rchan_buf *buf; | ||
203 | |||
204 | local_irq_save(flags); | ||
205 | buf = chan->buf[smp_processor_id()]; | ||
206 | if (unlikely(buf->offset + length > chan->subbuf_size)) | ||
207 | length = relay_switch_subbuf(buf, length); | ||
208 | memcpy(buf->data + buf->offset, data, length); | ||
209 | buf->offset += length; | ||
210 | local_irq_restore(flags); | ||
211 | } | ||
212 | |||
213 | /** | ||
214 | * __relay_write - write data into the channel | ||
215 | * @chan: relay channel | ||
216 | * @data: data to be written | ||
217 | * @length: number of bytes to write | ||
218 | * | ||
219 | * Writes data into the current cpu's channel buffer. | ||
220 | * | ||
221 | * Protects the buffer by disabling preemption. Use | ||
222 | * relay_write() if you might be logging from interrupt | ||
223 | * context. | ||
224 | */ | ||
225 | static inline void __relay_write(struct rchan *chan, | ||
226 | const void *data, | ||
227 | size_t length) | ||
228 | { | ||
229 | struct rchan_buf *buf; | ||
230 | |||
231 | buf = chan->buf[get_cpu()]; | ||
232 | if (unlikely(buf->offset + length > buf->chan->subbuf_size)) | ||
233 | length = relay_switch_subbuf(buf, length); | ||
234 | memcpy(buf->data + buf->offset, data, length); | ||
235 | buf->offset += length; | ||
236 | put_cpu(); | ||
237 | } | ||
238 | |||
239 | /** | ||
240 | * relay_reserve - reserve slot in channel buffer | ||
241 | * @chan: relay channel | ||
242 | * @length: number of bytes to reserve | ||
243 | * | ||
244 | * Returns pointer to reserved slot, NULL if full. | ||
245 | * | ||
246 | * Reserves a slot in the current cpu's channel buffer. | ||
247 | * Does not protect the buffer at all - caller must provide | ||
248 | * appropriate synchronization. | ||
249 | */ | ||
250 | static inline void *relay_reserve(struct rchan *chan, size_t length) | ||
251 | { | ||
252 | void *reserved; | ||
253 | struct rchan_buf *buf = chan->buf[smp_processor_id()]; | ||
254 | |||
255 | if (unlikely(buf->offset + length > buf->chan->subbuf_size)) { | ||
256 | length = relay_switch_subbuf(buf, length); | ||
257 | if (!length) | ||
258 | return NULL; | ||
259 | } | ||
260 | reserved = buf->data + buf->offset; | ||
261 | buf->offset += length; | ||
262 | |||
263 | return reserved; | ||
264 | } | ||
265 | |||
266 | /** | ||
267 | * subbuf_start_reserve - reserve bytes at the start of a sub-buffer | ||
268 | * @buf: relay channel buffer | ||
269 | * @length: number of bytes to reserve | ||
270 | * | ||
271 | * Helper function used to reserve bytes at the beginning of | ||
272 | * a sub-buffer in the subbuf_start() callback. | ||
273 | */ | ||
274 | static inline void subbuf_start_reserve(struct rchan_buf *buf, | ||
275 | size_t length) | ||
276 | { | ||
277 | BUG_ON(length >= buf->chan->subbuf_size - 1); | ||
278 | buf->offset = length; | ||
279 | } | ||
280 | |||
281 | /* | ||
282 | * exported relay file operations, fs/relayfs/inode.c | ||
283 | */ | ||
284 | extern struct file_operations relay_file_operations; | ||
285 | |||
286 | #endif /* _LINUX_RELAYFS_FS_H */ | ||
287 | |||
diff --git a/include/linux/rtc.h b/include/linux/rtc.h index b739ac1f7ca0..ab61cd1199f2 100644 --- a/include/linux/rtc.h +++ b/include/linux/rtc.h | |||
@@ -91,10 +91,102 @@ struct rtc_pll_info { | |||
91 | #define RTC_PLL_GET _IOR('p', 0x11, struct rtc_pll_info) /* Get PLL correction */ | 91 | #define RTC_PLL_GET _IOR('p', 0x11, struct rtc_pll_info) /* Get PLL correction */ |
92 | #define RTC_PLL_SET _IOW('p', 0x12, struct rtc_pll_info) /* Set PLL correction */ | 92 | #define RTC_PLL_SET _IOW('p', 0x12, struct rtc_pll_info) /* Set PLL correction */ |
93 | 93 | ||
94 | /* interrupt flags */ | ||
95 | #define RTC_IRQF 0x80 /* any of the following is active */ | ||
96 | #define RTC_PF 0x40 | ||
97 | #define RTC_AF 0x20 | ||
98 | #define RTC_UF 0x10 | ||
99 | |||
94 | #ifdef __KERNEL__ | 100 | #ifdef __KERNEL__ |
95 | 101 | ||
96 | #include <linux/interrupt.h> | 102 | #include <linux/interrupt.h> |
97 | 103 | ||
104 | extern int rtc_month_days(unsigned int month, unsigned int year); | ||
105 | extern int rtc_valid_tm(struct rtc_time *tm); | ||
106 | extern int rtc_tm_to_time(struct rtc_time *tm, unsigned long *time); | ||
107 | extern void rtc_time_to_tm(unsigned long time, struct rtc_time *tm); | ||
108 | |||
109 | #include <linux/device.h> | ||
110 | #include <linux/seq_file.h> | ||
111 | #include <linux/cdev.h> | ||
112 | #include <linux/poll.h> | ||
113 | #include <linux/mutex.h> | ||
114 | |||
115 | extern struct class *rtc_class; | ||
116 | |||
117 | struct rtc_class_ops { | ||
118 | int (*open)(struct device *); | ||
119 | void (*release)(struct device *); | ||
120 | int (*ioctl)(struct device *, unsigned int, unsigned long); | ||
121 | int (*read_time)(struct device *, struct rtc_time *); | ||
122 | int (*set_time)(struct device *, struct rtc_time *); | ||
123 | int (*read_alarm)(struct device *, struct rtc_wkalrm *); | ||
124 | int (*set_alarm)(struct device *, struct rtc_wkalrm *); | ||
125 | int (*proc)(struct device *, struct seq_file *); | ||
126 | int (*set_mmss)(struct device *, unsigned long secs); | ||
127 | int (*irq_set_state)(struct device *, int enabled); | ||
128 | int (*irq_set_freq)(struct device *, int freq); | ||
129 | int (*read_callback)(struct device *, int data); | ||
130 | }; | ||
131 | |||
132 | #define RTC_DEVICE_NAME_SIZE 20 | ||
133 | struct rtc_task; | ||
134 | |||
135 | struct rtc_device | ||
136 | { | ||
137 | struct class_device class_dev; | ||
138 | struct module *owner; | ||
139 | |||
140 | int id; | ||
141 | char name[RTC_DEVICE_NAME_SIZE]; | ||
142 | |||
143 | struct rtc_class_ops *ops; | ||
144 | struct mutex ops_lock; | ||
145 | |||
146 | struct class_device *rtc_dev; | ||
147 | struct cdev char_dev; | ||
148 | struct mutex char_lock; | ||
149 | |||
150 | unsigned long irq_data; | ||
151 | spinlock_t irq_lock; | ||
152 | wait_queue_head_t irq_queue; | ||
153 | struct fasync_struct *async_queue; | ||
154 | |||
155 | struct rtc_task *irq_task; | ||
156 | spinlock_t irq_task_lock; | ||
157 | int irq_freq; | ||
158 | }; | ||
159 | #define to_rtc_device(d) container_of(d, struct rtc_device, class_dev) | ||
160 | |||
161 | extern struct rtc_device *rtc_device_register(const char *name, | ||
162 | struct device *dev, | ||
163 | struct rtc_class_ops *ops, | ||
164 | struct module *owner); | ||
165 | extern void rtc_device_unregister(struct rtc_device *rdev); | ||
166 | extern int rtc_interface_register(struct class_interface *intf); | ||
167 | |||
168 | extern int rtc_read_time(struct class_device *class_dev, struct rtc_time *tm); | ||
169 | extern int rtc_set_time(struct class_device *class_dev, struct rtc_time *tm); | ||
170 | extern int rtc_set_mmss(struct class_device *class_dev, unsigned long secs); | ||
171 | extern int rtc_read_alarm(struct class_device *class_dev, | ||
172 | struct rtc_wkalrm *alrm); | ||
173 | extern int rtc_set_alarm(struct class_device *class_dev, | ||
174 | struct rtc_wkalrm *alrm); | ||
175 | extern void rtc_update_irq(struct class_device *class_dev, | ||
176 | unsigned long num, unsigned long events); | ||
177 | |||
178 | extern struct class_device *rtc_class_open(char *name); | ||
179 | extern void rtc_class_close(struct class_device *class_dev); | ||
180 | |||
181 | extern int rtc_irq_register(struct class_device *class_dev, | ||
182 | struct rtc_task *task); | ||
183 | extern void rtc_irq_unregister(struct class_device *class_dev, | ||
184 | struct rtc_task *task); | ||
185 | extern int rtc_irq_set_state(struct class_device *class_dev, | ||
186 | struct rtc_task *task, int enabled); | ||
187 | extern int rtc_irq_set_freq(struct class_device *class_dev, | ||
188 | struct rtc_task *task, int freq); | ||
189 | |||
98 | typedef struct rtc_task { | 190 | typedef struct rtc_task { |
99 | void (*func)(void *private_data); | 191 | void (*func)(void *private_data); |
100 | void *private_data; | 192 | void *private_data; |
diff --git a/include/linux/sched.h b/include/linux/sched.h index e0054c1b9a09..d04186d8cc68 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <linux/topology.h> | 35 | #include <linux/topology.h> |
36 | #include <linux/seccomp.h> | 36 | #include <linux/seccomp.h> |
37 | #include <linux/rcupdate.h> | 37 | #include <linux/rcupdate.h> |
38 | #include <linux/futex.h> | ||
38 | 39 | ||
39 | #include <linux/auxvec.h> /* For AT_VECTOR_SIZE */ | 40 | #include <linux/auxvec.h> /* For AT_VECTOR_SIZE */ |
40 | 41 | ||
@@ -354,16 +355,8 @@ struct sighand_struct { | |||
354 | atomic_t count; | 355 | atomic_t count; |
355 | struct k_sigaction action[_NSIG]; | 356 | struct k_sigaction action[_NSIG]; |
356 | spinlock_t siglock; | 357 | spinlock_t siglock; |
357 | struct rcu_head rcu; | ||
358 | }; | 358 | }; |
359 | 359 | ||
360 | extern void sighand_free_cb(struct rcu_head *rhp); | ||
361 | |||
362 | static inline void sighand_free(struct sighand_struct *sp) | ||
363 | { | ||
364 | call_rcu(&sp->rcu, sighand_free_cb); | ||
365 | } | ||
366 | |||
367 | /* | 360 | /* |
368 | * NOTE! "signal_struct" does not have it's own | 361 | * NOTE! "signal_struct" does not have it's own |
369 | * locking, because a shared signal_struct always | 362 | * locking, because a shared signal_struct always |
@@ -402,6 +395,7 @@ struct signal_struct { | |||
402 | 395 | ||
403 | /* ITIMER_REAL timer for the process */ | 396 | /* ITIMER_REAL timer for the process */ |
404 | struct hrtimer real_timer; | 397 | struct hrtimer real_timer; |
398 | struct task_struct *tsk; | ||
405 | ktime_t it_real_incr; | 399 | ktime_t it_real_incr; |
406 | 400 | ||
407 | /* ITIMER_PROF and ITIMER_VIRTUAL timers for the process */ | 401 | /* ITIMER_PROF and ITIMER_VIRTUAL timers for the process */ |
@@ -758,6 +752,7 @@ struct task_struct { | |||
758 | 752 | ||
759 | /* PID/PID hash table linkage. */ | 753 | /* PID/PID hash table linkage. */ |
760 | struct pid pids[PIDTYPE_MAX]; | 754 | struct pid pids[PIDTYPE_MAX]; |
755 | struct list_head thread_group; | ||
761 | 756 | ||
762 | struct completion *vfork_done; /* for vfork() */ | 757 | struct completion *vfork_done; /* for vfork() */ |
763 | int __user *set_child_tid; /* CLONE_CHILD_SETTID */ | 758 | int __user *set_child_tid; /* CLONE_CHILD_SETTID */ |
@@ -871,6 +866,11 @@ struct task_struct { | |||
871 | int cpuset_mems_generation; | 866 | int cpuset_mems_generation; |
872 | int cpuset_mem_spread_rotor; | 867 | int cpuset_mem_spread_rotor; |
873 | #endif | 868 | #endif |
869 | struct robust_list_head __user *robust_list; | ||
870 | #ifdef CONFIG_COMPAT | ||
871 | struct compat_robust_list_head __user *compat_robust_list; | ||
872 | #endif | ||
873 | |||
874 | atomic_t fs_excl; /* holding fs exclusive resources */ | 874 | atomic_t fs_excl; /* holding fs exclusive resources */ |
875 | struct rcu_head rcu; | 875 | struct rcu_head rcu; |
876 | }; | 876 | }; |
@@ -1094,7 +1094,6 @@ extern void force_sig_specific(int, struct task_struct *); | |||
1094 | extern int send_sig(int, struct task_struct *, int); | 1094 | extern int send_sig(int, struct task_struct *, int); |
1095 | extern void zap_other_threads(struct task_struct *p); | 1095 | extern void zap_other_threads(struct task_struct *p); |
1096 | extern int kill_pg(pid_t, int, int); | 1096 | extern int kill_pg(pid_t, int, int); |
1097 | extern int kill_sl(pid_t, int, int); | ||
1098 | extern int kill_proc(pid_t, int, int); | 1097 | extern int kill_proc(pid_t, int, int); |
1099 | extern struct sigqueue *sigqueue_alloc(void); | 1098 | extern struct sigqueue *sigqueue_alloc(void); |
1100 | extern void sigqueue_free(struct sigqueue *); | 1099 | extern void sigqueue_free(struct sigqueue *); |
@@ -1151,10 +1150,8 @@ extern void flush_thread(void); | |||
1151 | extern void exit_thread(void); | 1150 | extern void exit_thread(void); |
1152 | 1151 | ||
1153 | extern void exit_files(struct task_struct *); | 1152 | extern void exit_files(struct task_struct *); |
1154 | extern void exit_signal(struct task_struct *); | 1153 | extern void __cleanup_signal(struct signal_struct *); |
1155 | extern void __exit_signal(struct task_struct *); | 1154 | extern void __cleanup_sighand(struct sighand_struct *); |
1156 | extern void exit_sighand(struct task_struct *); | ||
1157 | extern void __exit_sighand(struct task_struct *); | ||
1158 | extern void exit_itimers(struct signal_struct *); | 1155 | extern void exit_itimers(struct signal_struct *); |
1159 | 1156 | ||
1160 | extern NORET_TYPE void do_group_exit(int); | 1157 | extern NORET_TYPE void do_group_exit(int); |
@@ -1178,19 +1175,7 @@ extern void wait_task_inactive(task_t * p); | |||
1178 | #endif | 1175 | #endif |
1179 | 1176 | ||
1180 | #define remove_parent(p) list_del_init(&(p)->sibling) | 1177 | #define remove_parent(p) list_del_init(&(p)->sibling) |
1181 | #define add_parent(p, parent) list_add_tail(&(p)->sibling,&(parent)->children) | 1178 | #define add_parent(p) list_add_tail(&(p)->sibling,&(p)->parent->children) |
1182 | |||
1183 | #define REMOVE_LINKS(p) do { \ | ||
1184 | if (thread_group_leader(p)) \ | ||
1185 | list_del_init(&(p)->tasks); \ | ||
1186 | remove_parent(p); \ | ||
1187 | } while (0) | ||
1188 | |||
1189 | #define SET_LINKS(p) do { \ | ||
1190 | if (thread_group_leader(p)) \ | ||
1191 | list_add_tail(&(p)->tasks,&init_task.tasks); \ | ||
1192 | add_parent(p, (p)->parent); \ | ||
1193 | } while (0) | ||
1194 | 1179 | ||
1195 | #define next_task(p) list_entry((p)->tasks.next, struct task_struct, tasks) | 1180 | #define next_task(p) list_entry((p)->tasks.next, struct task_struct, tasks) |
1196 | #define prev_task(p) list_entry((p)->tasks.prev, struct task_struct, tasks) | 1181 | #define prev_task(p) list_entry((p)->tasks.prev, struct task_struct, tasks) |
@@ -1208,20 +1193,22 @@ extern void wait_task_inactive(task_t * p); | |||
1208 | #define while_each_thread(g, t) \ | 1193 | #define while_each_thread(g, t) \ |
1209 | while ((t = next_thread(t)) != g) | 1194 | while ((t = next_thread(t)) != g) |
1210 | 1195 | ||
1211 | extern task_t * FASTCALL(next_thread(const task_t *p)); | ||
1212 | |||
1213 | #define thread_group_leader(p) (p->pid == p->tgid) | 1196 | #define thread_group_leader(p) (p->pid == p->tgid) |
1214 | 1197 | ||
1198 | static inline task_t *next_thread(task_t *p) | ||
1199 | { | ||
1200 | return list_entry(rcu_dereference(p->thread_group.next), | ||
1201 | task_t, thread_group); | ||
1202 | } | ||
1203 | |||
1215 | static inline int thread_group_empty(task_t *p) | 1204 | static inline int thread_group_empty(task_t *p) |
1216 | { | 1205 | { |
1217 | return list_empty(&p->pids[PIDTYPE_TGID].pid_list); | 1206 | return list_empty(&p->thread_group); |
1218 | } | 1207 | } |
1219 | 1208 | ||
1220 | #define delay_group_leader(p) \ | 1209 | #define delay_group_leader(p) \ |
1221 | (thread_group_leader(p) && !thread_group_empty(p)) | 1210 | (thread_group_leader(p) && !thread_group_empty(p)) |
1222 | 1211 | ||
1223 | extern void unhash_process(struct task_struct *p); | ||
1224 | |||
1225 | /* | 1212 | /* |
1226 | * Protects ->fs, ->files, ->mm, ->ptrace, ->group_info, ->comm, keyring | 1213 | * Protects ->fs, ->files, ->mm, ->ptrace, ->group_info, ->comm, keyring |
1227 | * subscriptions and synchronises with wait4(). Also used in procfs. Also | 1214 | * subscriptions and synchronises with wait4(). Also used in procfs. Also |
@@ -1241,6 +1228,15 @@ static inline void task_unlock(struct task_struct *p) | |||
1241 | spin_unlock(&p->alloc_lock); | 1228 | spin_unlock(&p->alloc_lock); |
1242 | } | 1229 | } |
1243 | 1230 | ||
1231 | extern struct sighand_struct *lock_task_sighand(struct task_struct *tsk, | ||
1232 | unsigned long *flags); | ||
1233 | |||
1234 | static inline void unlock_task_sighand(struct task_struct *tsk, | ||
1235 | unsigned long *flags) | ||
1236 | { | ||
1237 | spin_unlock_irqrestore(&tsk->sighand->siglock, *flags); | ||
1238 | } | ||
1239 | |||
1244 | #ifndef __HAVE_THREAD_FUNCTIONS | 1240 | #ifndef __HAVE_THREAD_FUNCTIONS |
1245 | 1241 | ||
1246 | #define task_thread_info(task) (task)->thread_info | 1242 | #define task_thread_info(task) (task)->thread_info |
diff --git a/include/linux/security.h b/include/linux/security.h index b18eb8cfa639..aaa0a5cdbf75 100644 --- a/include/linux/security.h +++ b/include/linux/security.h | |||
@@ -869,6 +869,11 @@ struct swap_info_struct; | |||
869 | * @ipcp contains the kernel IPC permission structure | 869 | * @ipcp contains the kernel IPC permission structure |
870 | * @flag contains the desired (requested) permission set | 870 | * @flag contains the desired (requested) permission set |
871 | * Return 0 if permission is granted. | 871 | * Return 0 if permission is granted. |
872 | * @ipc_getsecurity: | ||
873 | * Copy the security label associated with the ipc object into | ||
874 | * @buffer. @buffer may be NULL to request the size of the buffer | ||
875 | * required. @size indicates the size of @buffer in bytes. Return | ||
876 | * number of bytes used/required on success. | ||
872 | * | 877 | * |
873 | * Security hooks for individual messages held in System V IPC message queues | 878 | * Security hooks for individual messages held in System V IPC message queues |
874 | * @msg_msg_alloc_security: | 879 | * @msg_msg_alloc_security: |
@@ -1040,6 +1045,11 @@ struct swap_info_struct; | |||
1040 | * @effective contains the effective capability set. | 1045 | * @effective contains the effective capability set. |
1041 | * @inheritable contains the inheritable capability set. | 1046 | * @inheritable contains the inheritable capability set. |
1042 | * @permitted contains the permitted capability set. | 1047 | * @permitted contains the permitted capability set. |
1048 | * @capable: | ||
1049 | * Check whether the @tsk process has the @cap capability. | ||
1050 | * @tsk contains the task_struct for the process. | ||
1051 | * @cap contains the capability <include/linux/capability.h>. | ||
1052 | * Return 0 if the capability is granted for @tsk. | ||
1043 | * @acct: | 1053 | * @acct: |
1044 | * Check permission before enabling or disabling process accounting. If | 1054 | * Check permission before enabling or disabling process accounting. If |
1045 | * accounting is being enabled, then @file refers to the open file used to | 1055 | * accounting is being enabled, then @file refers to the open file used to |
@@ -1053,11 +1063,6 @@ struct swap_info_struct; | |||
1053 | * @table contains the ctl_table structure for the sysctl variable. | 1063 | * @table contains the ctl_table structure for the sysctl variable. |
1054 | * @op contains the operation (001 = search, 002 = write, 004 = read). | 1064 | * @op contains the operation (001 = search, 002 = write, 004 = read). |
1055 | * Return 0 if permission is granted. | 1065 | * Return 0 if permission is granted. |
1056 | * @capable: | ||
1057 | * Check whether the @tsk process has the @cap capability. | ||
1058 | * @tsk contains the task_struct for the process. | ||
1059 | * @cap contains the capability <include/linux/capability.h>. | ||
1060 | * Return 0 if the capability is granted for @tsk. | ||
1061 | * @syslog: | 1066 | * @syslog: |
1062 | * Check permission before accessing the kernel message ring or changing | 1067 | * Check permission before accessing the kernel message ring or changing |
1063 | * logging to the console. | 1068 | * logging to the console. |
@@ -1099,9 +1104,9 @@ struct security_operations { | |||
1099 | kernel_cap_t * effective, | 1104 | kernel_cap_t * effective, |
1100 | kernel_cap_t * inheritable, | 1105 | kernel_cap_t * inheritable, |
1101 | kernel_cap_t * permitted); | 1106 | kernel_cap_t * permitted); |
1107 | int (*capable) (struct task_struct * tsk, int cap); | ||
1102 | int (*acct) (struct file * file); | 1108 | int (*acct) (struct file * file); |
1103 | int (*sysctl) (struct ctl_table * table, int op); | 1109 | int (*sysctl) (struct ctl_table * table, int op); |
1104 | int (*capable) (struct task_struct * tsk, int cap); | ||
1105 | int (*quotactl) (int cmds, int type, int id, struct super_block * sb); | 1110 | int (*quotactl) (int cmds, int type, int id, struct super_block * sb); |
1106 | int (*quota_on) (struct dentry * dentry); | 1111 | int (*quota_on) (struct dentry * dentry); |
1107 | int (*syslog) (int type); | 1112 | int (*syslog) (int type); |
@@ -1168,7 +1173,8 @@ struct security_operations { | |||
1168 | int (*inode_getxattr) (struct dentry *dentry, char *name); | 1173 | int (*inode_getxattr) (struct dentry *dentry, char *name); |
1169 | int (*inode_listxattr) (struct dentry *dentry); | 1174 | int (*inode_listxattr) (struct dentry *dentry); |
1170 | int (*inode_removexattr) (struct dentry *dentry, char *name); | 1175 | int (*inode_removexattr) (struct dentry *dentry, char *name); |
1171 | int (*inode_getsecurity)(struct inode *inode, const char *name, void *buffer, size_t size, int err); | 1176 | const char *(*inode_xattr_getsuffix) (void); |
1177 | int (*inode_getsecurity)(const struct inode *inode, const char *name, void *buffer, size_t size, int err); | ||
1172 | int (*inode_setsecurity)(struct inode *inode, const char *name, const void *value, size_t size, int flags); | 1178 | int (*inode_setsecurity)(struct inode *inode, const char *name, const void *value, size_t size, int flags); |
1173 | int (*inode_listsecurity)(struct inode *inode, char *buffer, size_t buffer_size); | 1179 | int (*inode_listsecurity)(struct inode *inode, char *buffer, size_t buffer_size); |
1174 | 1180 | ||
@@ -1217,6 +1223,7 @@ struct security_operations { | |||
1217 | void (*task_to_inode)(struct task_struct *p, struct inode *inode); | 1223 | void (*task_to_inode)(struct task_struct *p, struct inode *inode); |
1218 | 1224 | ||
1219 | int (*ipc_permission) (struct kern_ipc_perm * ipcp, short flag); | 1225 | int (*ipc_permission) (struct kern_ipc_perm * ipcp, short flag); |
1226 | int (*ipc_getsecurity)(struct kern_ipc_perm *ipcp, void *buffer, size_t size); | ||
1220 | 1227 | ||
1221 | int (*msg_msg_alloc_security) (struct msg_msg * msg); | 1228 | int (*msg_msg_alloc_security) (struct msg_msg * msg); |
1222 | void (*msg_msg_free_security) (struct msg_msg * msg); | 1229 | void (*msg_msg_free_security) (struct msg_msg * msg); |
@@ -1347,6 +1354,11 @@ static inline void security_capset_set (struct task_struct *target, | |||
1347 | security_ops->capset_set (target, effective, inheritable, permitted); | 1354 | security_ops->capset_set (target, effective, inheritable, permitted); |
1348 | } | 1355 | } |
1349 | 1356 | ||
1357 | static inline int security_capable(struct task_struct *tsk, int cap) | ||
1358 | { | ||
1359 | return security_ops->capable(tsk, cap); | ||
1360 | } | ||
1361 | |||
1350 | static inline int security_acct (struct file *file) | 1362 | static inline int security_acct (struct file *file) |
1351 | { | 1363 | { |
1352 | return security_ops->acct (file); | 1364 | return security_ops->acct (file); |
@@ -1675,7 +1687,12 @@ static inline int security_inode_removexattr (struct dentry *dentry, char *name) | |||
1675 | return security_ops->inode_removexattr (dentry, name); | 1687 | return security_ops->inode_removexattr (dentry, name); |
1676 | } | 1688 | } |
1677 | 1689 | ||
1678 | static inline int security_inode_getsecurity(struct inode *inode, const char *name, void *buffer, size_t size, int err) | 1690 | static inline const char *security_inode_xattr_getsuffix(void) |
1691 | { | ||
1692 | return security_ops->inode_xattr_getsuffix(); | ||
1693 | } | ||
1694 | |||
1695 | static inline int security_inode_getsecurity(const struct inode *inode, const char *name, void *buffer, size_t size, int err) | ||
1679 | { | 1696 | { |
1680 | if (unlikely (IS_PRIVATE (inode))) | 1697 | if (unlikely (IS_PRIVATE (inode))) |
1681 | return 0; | 1698 | return 0; |
@@ -1870,6 +1887,11 @@ static inline int security_ipc_permission (struct kern_ipc_perm *ipcp, | |||
1870 | return security_ops->ipc_permission (ipcp, flag); | 1887 | return security_ops->ipc_permission (ipcp, flag); |
1871 | } | 1888 | } |
1872 | 1889 | ||
1890 | static inline int security_ipc_getsecurity(struct kern_ipc_perm *ipcp, void *buffer, size_t size) | ||
1891 | { | ||
1892 | return security_ops->ipc_getsecurity(ipcp, buffer, size); | ||
1893 | } | ||
1894 | |||
1873 | static inline int security_msg_msg_alloc (struct msg_msg * msg) | 1895 | static inline int security_msg_msg_alloc (struct msg_msg * msg) |
1874 | { | 1896 | { |
1875 | return security_ops->msg_msg_alloc_security (msg); | 1897 | return security_ops->msg_msg_alloc_security (msg); |
@@ -2050,6 +2072,11 @@ static inline void security_capset_set (struct task_struct *target, | |||
2050 | cap_capset_set (target, effective, inheritable, permitted); | 2072 | cap_capset_set (target, effective, inheritable, permitted); |
2051 | } | 2073 | } |
2052 | 2074 | ||
2075 | static inline int security_capable(struct task_struct *tsk, int cap) | ||
2076 | { | ||
2077 | return cap_capable(tsk, cap); | ||
2078 | } | ||
2079 | |||
2053 | static inline int security_acct (struct file *file) | 2080 | static inline int security_acct (struct file *file) |
2054 | { | 2081 | { |
2055 | return 0; | 2082 | return 0; |
@@ -2317,7 +2344,12 @@ static inline int security_inode_removexattr (struct dentry *dentry, char *name) | |||
2317 | return cap_inode_removexattr(dentry, name); | 2344 | return cap_inode_removexattr(dentry, name); |
2318 | } | 2345 | } |
2319 | 2346 | ||
2320 | static inline int security_inode_getsecurity(struct inode *inode, const char *name, void *buffer, size_t size, int err) | 2347 | static inline const char *security_inode_xattr_getsuffix (void) |
2348 | { | ||
2349 | return NULL ; | ||
2350 | } | ||
2351 | |||
2352 | static inline int security_inode_getsecurity(const struct inode *inode, const char *name, void *buffer, size_t size, int err) | ||
2321 | { | 2353 | { |
2322 | return -EOPNOTSUPP; | 2354 | return -EOPNOTSUPP; |
2323 | } | 2355 | } |
@@ -2500,6 +2532,11 @@ static inline int security_ipc_permission (struct kern_ipc_perm *ipcp, | |||
2500 | return 0; | 2532 | return 0; |
2501 | } | 2533 | } |
2502 | 2534 | ||
2535 | static inline int security_ipc_getsecurity(struct kern_ipc_perm *ipcp, void *buffer, size_t size) | ||
2536 | { | ||
2537 | return -EOPNOTSUPP; | ||
2538 | } | ||
2539 | |||
2503 | static inline int security_msg_msg_alloc (struct msg_msg * msg) | 2540 | static inline int security_msg_msg_alloc (struct msg_msg * msg) |
2504 | { | 2541 | { |
2505 | return 0; | 2542 | return 0; |
diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h index 73b464f0926a..8e9681413726 100644 --- a/include/linux/serial_8250.h +++ b/include/linux/serial_8250.h | |||
@@ -37,6 +37,7 @@ enum { | |||
37 | PLAT8250_DEV_LEGACY = -1, | 37 | PLAT8250_DEV_LEGACY = -1, |
38 | PLAT8250_DEV_PLATFORM, | 38 | PLAT8250_DEV_PLATFORM, |
39 | PLAT8250_DEV_PLATFORM1, | 39 | PLAT8250_DEV_PLATFORM1, |
40 | PLAT8250_DEV_PLATFORM2, | ||
40 | PLAT8250_DEV_FOURPORT, | 41 | PLAT8250_DEV_FOURPORT, |
41 | PLAT8250_DEV_ACCENT, | 42 | PLAT8250_DEV_ACCENT, |
42 | PLAT8250_DEV_BOCA, | 43 | PLAT8250_DEV_BOCA, |
diff --git a/include/linux/serio.h b/include/linux/serio.h index aa4d6493a034..690aabca8ed0 100644 --- a/include/linux/serio.h +++ b/include/linux/serio.h | |||
@@ -119,7 +119,7 @@ static inline void serio_cleanup(struct serio *serio) | |||
119 | } | 119 | } |
120 | 120 | ||
121 | /* | 121 | /* |
122 | * Use the following fucntions to manipulate serio's per-port | 122 | * Use the following functions to manipulate serio's per-port |
123 | * driver-specific data. | 123 | * driver-specific data. |
124 | */ | 124 | */ |
125 | static inline void *serio_get_drvdata(struct serio *serio) | 125 | static inline void *serio_get_drvdata(struct serio *serio) |
@@ -133,7 +133,7 @@ static inline void serio_set_drvdata(struct serio *serio, void *data) | |||
133 | } | 133 | } |
134 | 134 | ||
135 | /* | 135 | /* |
136 | * Use the following fucntions to protect critical sections in | 136 | * Use the following functions to protect critical sections in |
137 | * driver code from port's interrupt handler | 137 | * driver code from port's interrupt handler |
138 | */ | 138 | */ |
139 | static inline void serio_pause_rx(struct serio *serio) | 139 | static inline void serio_pause_rx(struct serio *serio) |
@@ -147,7 +147,7 @@ static inline void serio_continue_rx(struct serio *serio) | |||
147 | } | 147 | } |
148 | 148 | ||
149 | /* | 149 | /* |
150 | * Use the following fucntions to pin serio's driver in process context | 150 | * Use the following functions to pin serio's driver in process context |
151 | */ | 151 | */ |
152 | static inline int serio_pin_driver(struct serio *serio) | 152 | static inline int serio_pin_driver(struct serio *serio) |
153 | { | 153 | { |
diff --git a/include/linux/signal.h b/include/linux/signal.h index b7d093520bb6..162a8fd10b29 100644 --- a/include/linux/signal.h +++ b/include/linux/signal.h | |||
@@ -249,6 +249,8 @@ static inline void init_sigpending(struct sigpending *sig) | |||
249 | INIT_LIST_HEAD(&sig->list); | 249 | INIT_LIST_HEAD(&sig->list); |
250 | } | 250 | } |
251 | 251 | ||
252 | extern void flush_sigqueue(struct sigpending *queue); | ||
253 | |||
252 | /* Test if 'sig' is valid signal. Use this instead of testing _NSIG directly */ | 254 | /* Test if 'sig' is valid signal. Use this instead of testing _NSIG directly */ |
253 | static inline int valid_signal(unsigned long sig) | 255 | static inline int valid_signal(unsigned long sig) |
254 | { | 256 | { |
diff --git a/include/linux/slab.h b/include/linux/slab.h index e2ee5b268797..3af03b19c983 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h | |||
@@ -64,6 +64,7 @@ extern kmem_cache_t *kmem_cache_create(const char *, size_t, size_t, unsigned lo | |||
64 | extern int kmem_cache_destroy(kmem_cache_t *); | 64 | extern int kmem_cache_destroy(kmem_cache_t *); |
65 | extern int kmem_cache_shrink(kmem_cache_t *); | 65 | extern int kmem_cache_shrink(kmem_cache_t *); |
66 | extern void *kmem_cache_alloc(kmem_cache_t *, gfp_t); | 66 | extern void *kmem_cache_alloc(kmem_cache_t *, gfp_t); |
67 | extern void *kmem_cache_zalloc(struct kmem_cache *, gfp_t); | ||
67 | extern void kmem_cache_free(kmem_cache_t *, void *); | 68 | extern void kmem_cache_free(kmem_cache_t *, void *); |
68 | extern unsigned int kmem_cache_size(kmem_cache_t *); | 69 | extern unsigned int kmem_cache_size(kmem_cache_t *); |
69 | extern const char *kmem_cache_name(kmem_cache_t *); | 70 | extern const char *kmem_cache_name(kmem_cache_t *); |
@@ -77,11 +78,12 @@ struct cache_sizes { | |||
77 | }; | 78 | }; |
78 | extern struct cache_sizes malloc_sizes[]; | 79 | extern struct cache_sizes malloc_sizes[]; |
79 | 80 | ||
80 | #ifndef CONFIG_DEBUG_SLAB | ||
81 | extern void *__kmalloc(size_t, gfp_t); | 81 | extern void *__kmalloc(size_t, gfp_t); |
82 | #ifndef CONFIG_DEBUG_SLAB | ||
83 | #define ____kmalloc(size, flags) __kmalloc(size, flags) | ||
82 | #else | 84 | #else |
83 | extern void *__kmalloc_track_caller(size_t, gfp_t, void*); | 85 | extern void *__kmalloc_track_caller(size_t, gfp_t, void*); |
84 | #define __kmalloc(size, flags) \ | 86 | #define ____kmalloc(size, flags) \ |
85 | __kmalloc_track_caller(size, flags, __builtin_return_address(0)) | 87 | __kmalloc_track_caller(size, flags, __builtin_return_address(0)) |
86 | #endif | 88 | #endif |
87 | 89 | ||
@@ -108,7 +110,30 @@ found: | |||
108 | return __kmalloc(size, flags); | 110 | return __kmalloc(size, flags); |
109 | } | 111 | } |
110 | 112 | ||
111 | extern void *kzalloc(size_t, gfp_t); | 113 | extern void *__kzalloc(size_t, gfp_t); |
114 | |||
115 | static inline void *kzalloc(size_t size, gfp_t flags) | ||
116 | { | ||
117 | if (__builtin_constant_p(size)) { | ||
118 | int i = 0; | ||
119 | #define CACHE(x) \ | ||
120 | if (size <= x) \ | ||
121 | goto found; \ | ||
122 | else \ | ||
123 | i++; | ||
124 | #include "kmalloc_sizes.h" | ||
125 | #undef CACHE | ||
126 | { | ||
127 | extern void __you_cannot_kzalloc_that_much(void); | ||
128 | __you_cannot_kzalloc_that_much(); | ||
129 | } | ||
130 | found: | ||
131 | return kmem_cache_zalloc((flags & GFP_DMA) ? | ||
132 | malloc_sizes[i].cs_dmacachep : | ||
133 | malloc_sizes[i].cs_cachep, flags); | ||
134 | } | ||
135 | return __kzalloc(size, flags); | ||
136 | } | ||
112 | 137 | ||
113 | /** | 138 | /** |
114 | * kcalloc - allocate memory for an array. The memory is set to zero. | 139 | * kcalloc - allocate memory for an array. The memory is set to zero. |
@@ -155,17 +180,18 @@ struct kmem_cache *kmem_cache_create(const char *c, size_t, size_t, | |||
155 | void (*)(void *, struct kmem_cache *, unsigned long)); | 180 | void (*)(void *, struct kmem_cache *, unsigned long)); |
156 | int kmem_cache_destroy(struct kmem_cache *c); | 181 | int kmem_cache_destroy(struct kmem_cache *c); |
157 | void *kmem_cache_alloc(struct kmem_cache *c, gfp_t flags); | 182 | void *kmem_cache_alloc(struct kmem_cache *c, gfp_t flags); |
183 | void *kmem_cache_zalloc(struct kmem_cache *, gfp_t); | ||
158 | void kmem_cache_free(struct kmem_cache *c, void *b); | 184 | void kmem_cache_free(struct kmem_cache *c, void *b); |
159 | const char *kmem_cache_name(struct kmem_cache *); | 185 | const char *kmem_cache_name(struct kmem_cache *); |
160 | void *kmalloc(size_t size, gfp_t flags); | 186 | void *kmalloc(size_t size, gfp_t flags); |
161 | void *kzalloc(size_t size, gfp_t flags); | 187 | void *__kzalloc(size_t size, gfp_t flags); |
162 | void kfree(const void *m); | 188 | void kfree(const void *m); |
163 | unsigned int ksize(const void *m); | 189 | unsigned int ksize(const void *m); |
164 | unsigned int kmem_cache_size(struct kmem_cache *c); | 190 | unsigned int kmem_cache_size(struct kmem_cache *c); |
165 | 191 | ||
166 | static inline void *kcalloc(size_t n, size_t size, gfp_t flags) | 192 | static inline void *kcalloc(size_t n, size_t size, gfp_t flags) |
167 | { | 193 | { |
168 | return kzalloc(n * size, flags); | 194 | return __kzalloc(n * size, flags); |
169 | } | 195 | } |
170 | 196 | ||
171 | #define kmem_cache_shrink(d) (0) | 197 | #define kmem_cache_shrink(d) (0) |
@@ -173,6 +199,8 @@ static inline void *kcalloc(size_t n, size_t size, gfp_t flags) | |||
173 | #define kmem_ptr_validate(a, b) (0) | 199 | #define kmem_ptr_validate(a, b) (0) |
174 | #define kmem_cache_alloc_node(c, f, n) kmem_cache_alloc(c, f) | 200 | #define kmem_cache_alloc_node(c, f, n) kmem_cache_alloc(c, f) |
175 | #define kmalloc_node(s, f, n) kmalloc(s, f) | 201 | #define kmalloc_node(s, f, n) kmalloc(s, f) |
202 | #define kzalloc(s, f) __kzalloc(s, f) | ||
203 | #define ____kmalloc kmalloc | ||
176 | 204 | ||
177 | #endif /* CONFIG_SLOB */ | 205 | #endif /* CONFIG_SLOB */ |
178 | 206 | ||
@@ -182,7 +210,6 @@ extern kmem_cache_t *names_cachep; | |||
182 | extern kmem_cache_t *files_cachep; | 210 | extern kmem_cache_t *files_cachep; |
183 | extern kmem_cache_t *filp_cachep; | 211 | extern kmem_cache_t *filp_cachep; |
184 | extern kmem_cache_t *fs_cachep; | 212 | extern kmem_cache_t *fs_cachep; |
185 | extern kmem_cache_t *signal_cachep; | ||
186 | extern kmem_cache_t *sighand_cachep; | 213 | extern kmem_cache_t *sighand_cachep; |
187 | extern kmem_cache_t *bio_cachep; | 214 | extern kmem_cache_t *bio_cachep; |
188 | 215 | ||
diff --git a/include/linux/smp.h b/include/linux/smp.h index d699a16b0cb2..e2fa3ab4afc5 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h | |||
@@ -82,7 +82,11 @@ void smp_prepare_boot_cpu(void); | |||
82 | */ | 82 | */ |
83 | #define raw_smp_processor_id() 0 | 83 | #define raw_smp_processor_id() 0 |
84 | #define hard_smp_processor_id() 0 | 84 | #define hard_smp_processor_id() 0 |
85 | #define smp_call_function(func,info,retry,wait) ({ 0; }) | 85 | static inline int up_smp_call_function(void) |
86 | { | ||
87 | return 0; | ||
88 | } | ||
89 | #define smp_call_function(func,info,retry,wait) (up_smp_call_function()) | ||
86 | #define on_each_cpu(func,info,retry,wait) \ | 90 | #define on_each_cpu(func,info,retry,wait) \ |
87 | ({ \ | 91 | ({ \ |
88 | local_irq_disable(); \ | 92 | local_irq_disable(); \ |
diff --git a/include/linux/sound.h b/include/linux/sound.h index 72b9af4c3fd4..f63d8342ffa3 100644 --- a/include/linux/sound.h +++ b/include/linux/sound.h | |||
@@ -30,12 +30,12 @@ | |||
30 | */ | 30 | */ |
31 | 31 | ||
32 | struct device; | 32 | struct device; |
33 | extern int register_sound_special(struct file_operations *fops, int unit); | 33 | extern int register_sound_special(const struct file_operations *fops, int unit); |
34 | extern int register_sound_special_device(struct file_operations *fops, int unit, struct device *dev); | 34 | extern int register_sound_special_device(const struct file_operations *fops, int unit, struct device *dev); |
35 | extern int register_sound_mixer(struct file_operations *fops, int dev); | 35 | extern int register_sound_mixer(const struct file_operations *fops, int dev); |
36 | extern int register_sound_midi(struct file_operations *fops, int dev); | 36 | extern int register_sound_midi(const struct file_operations *fops, int dev); |
37 | extern int register_sound_dsp(struct file_operations *fops, int dev); | 37 | extern int register_sound_dsp(const struct file_operations *fops, int dev); |
38 | extern int register_sound_synth(struct file_operations *fops, int dev); | 38 | extern int register_sound_synth(const struct file_operations *fops, int dev); |
39 | 39 | ||
40 | extern void unregister_sound_special(int unit); | 40 | extern void unregister_sound_special(int unit); |
41 | extern void unregister_sound_mixer(int unit); | 41 | extern void unregister_sound_mixer(int unit); |
diff --git a/include/linux/stat.h b/include/linux/stat.h index 8ff2a122dfef..8669291352db 100644 --- a/include/linux/stat.h +++ b/include/linux/stat.h | |||
@@ -69,7 +69,7 @@ struct kstat { | |||
69 | struct timespec mtime; | 69 | struct timespec mtime; |
70 | struct timespec ctime; | 70 | struct timespec ctime; |
71 | unsigned long blksize; | 71 | unsigned long blksize; |
72 | unsigned long blocks; | 72 | unsigned long long blocks; |
73 | }; | 73 | }; |
74 | 74 | ||
75 | #endif | 75 | #endif |
diff --git a/include/linux/statfs.h b/include/linux/statfs.h index ad83a2bdb821..b34cc829f98d 100644 --- a/include/linux/statfs.h +++ b/include/linux/statfs.h | |||
@@ -8,11 +8,11 @@ | |||
8 | struct kstatfs { | 8 | struct kstatfs { |
9 | long f_type; | 9 | long f_type; |
10 | long f_bsize; | 10 | long f_bsize; |
11 | sector_t f_blocks; | 11 | u64 f_blocks; |
12 | sector_t f_bfree; | 12 | u64 f_bfree; |
13 | sector_t f_bavail; | 13 | u64 f_bavail; |
14 | sector_t f_files; | 14 | u64 f_files; |
15 | sector_t f_ffree; | 15 | u64 f_ffree; |
16 | __kernel_fsid_t f_fsid; | 16 | __kernel_fsid_t f_fsid; |
17 | long f_namelen; | 17 | long f_namelen; |
18 | long f_frsize; | 18 | long f_frsize; |
diff --git a/include/linux/sunrpc/cache.h b/include/linux/sunrpc/cache.h index c4e3ea7cf154..b5612c958cce 100644 --- a/include/linux/sunrpc/cache.h +++ b/include/linux/sunrpc/cache.h | |||
@@ -50,7 +50,7 @@ struct cache_head { | |||
50 | time_t last_refresh; /* If CACHE_PENDING, this is when upcall | 50 | time_t last_refresh; /* If CACHE_PENDING, this is when upcall |
51 | * was sent, else this is when update was received | 51 | * was sent, else this is when update was received |
52 | */ | 52 | */ |
53 | atomic_t refcnt; | 53 | struct kref ref; |
54 | unsigned long flags; | 54 | unsigned long flags; |
55 | }; | 55 | }; |
56 | #define CACHE_VALID 0 /* Entry contains valid data */ | 56 | #define CACHE_VALID 0 /* Entry contains valid data */ |
@@ -68,8 +68,7 @@ struct cache_detail { | |||
68 | atomic_t inuse; /* active user-space update or lookup */ | 68 | atomic_t inuse; /* active user-space update or lookup */ |
69 | 69 | ||
70 | char *name; | 70 | char *name; |
71 | void (*cache_put)(struct cache_head *, | 71 | void (*cache_put)(struct kref *); |
72 | struct cache_detail*); | ||
73 | 72 | ||
74 | void (*cache_request)(struct cache_detail *cd, | 73 | void (*cache_request)(struct cache_detail *cd, |
75 | struct cache_head *h, | 74 | struct cache_head *h, |
@@ -81,6 +80,11 @@ struct cache_detail { | |||
81 | struct cache_detail *cd, | 80 | struct cache_detail *cd, |
82 | struct cache_head *h); | 81 | struct cache_head *h); |
83 | 82 | ||
83 | struct cache_head * (*alloc)(void); | ||
84 | int (*match)(struct cache_head *orig, struct cache_head *new); | ||
85 | void (*init)(struct cache_head *orig, struct cache_head *new); | ||
86 | void (*update)(struct cache_head *orig, struct cache_head *new); | ||
87 | |||
84 | /* fields below this comment are for internal use | 88 | /* fields below this comment are for internal use |
85 | * and should not be touched by cache owners | 89 | * and should not be touched by cache owners |
86 | */ | 90 | */ |
@@ -123,126 +127,14 @@ struct cache_deferred_req { | |||
123 | int too_many); | 127 | int too_many); |
124 | }; | 128 | }; |
125 | 129 | ||
126 | /* | ||
127 | * just like a template in C++, this macro does cache lookup | ||
128 | * for us. | ||
129 | * The function is passed some sort of HANDLE from which a cache_detail | ||
130 | * structure can be determined (via SETUP, DETAIL), a template | ||
131 | * cache entry (type RTN*), and a "set" flag. Using the HASHFN and the | ||
132 | * TEST, the function will try to find a matching cache entry in the cache. | ||
133 | * If "set" == 0 : | ||
134 | * If an entry is found, it is returned | ||
135 | * If no entry is found, a new non-VALID entry is created. | ||
136 | * If "set" == 1 and INPLACE == 0 : | ||
137 | * If no entry is found a new one is inserted with data from "template" | ||
138 | * If a non-CACHE_VALID entry is found, it is updated from template using UPDATE | ||
139 | * If a CACHE_VALID entry is found, a new entry is swapped in with data | ||
140 | * from "template" | ||
141 | * If set == 1, and INPLACE == 1 : | ||
142 | * As above, except that if a CACHE_VALID entry is found, we UPDATE in place | ||
143 | * instead of swapping in a new entry. | ||
144 | * | ||
145 | * If the passed handle has the CACHE_NEGATIVE flag set, then UPDATE is not | ||
146 | * run but insteead CACHE_NEGATIVE is set in any new item. | ||
147 | 130 | ||
148 | * In any case, the new entry is returned with a reference count. | 131 | extern struct cache_head * |
149 | * | 132 | sunrpc_cache_lookup(struct cache_detail *detail, |
150 | * | 133 | struct cache_head *key, int hash); |
151 | * RTN is a struct type for a cache entry | 134 | extern struct cache_head * |
152 | * MEMBER is the member of the cache which is cache_head, which must be first | 135 | sunrpc_cache_update(struct cache_detail *detail, |
153 | * FNAME is the name for the function | 136 | struct cache_head *new, struct cache_head *old, int hash); |
154 | * ARGS are arguments to function and must contain RTN *item, int set. May | ||
155 | * also contain something to be usedby SETUP or DETAIL to find cache_detail. | ||
156 | * SETUP locates the cache detail and makes it available as... | ||
157 | * DETAIL identifies the cache detail, possibly set up by SETUP | ||
158 | * HASHFN returns a hash value of the cache entry "item" | ||
159 | * TEST tests if "tmp" matches "item" | ||
160 | * INIT copies key information from "item" to "new" | ||
161 | * UPDATE copies content information from "item" to "tmp" | ||
162 | * INPLACE is true if updates can happen inplace rather than allocating a new structure | ||
163 | * | ||
164 | * WARNING: any substantial changes to this must be reflected in | ||
165 | * net/sunrpc/svcauth.c(auth_domain_lookup) | ||
166 | * which is a similar routine that is open-coded. | ||
167 | */ | ||
168 | #define DefineCacheLookup(RTN,MEMBER,FNAME,ARGS,SETUP,DETAIL,HASHFN,TEST,INIT,UPDATE,INPLACE) \ | ||
169 | RTN *FNAME ARGS \ | ||
170 | { \ | ||
171 | RTN *tmp, *new=NULL; \ | ||
172 | struct cache_head **hp, **head; \ | ||
173 | SETUP; \ | ||
174 | head = &(DETAIL)->hash_table[HASHFN]; \ | ||
175 | retry: \ | ||
176 | if (set||new) write_lock(&(DETAIL)->hash_lock); \ | ||
177 | else read_lock(&(DETAIL)->hash_lock); \ | ||
178 | for(hp=head; *hp != NULL; hp = &tmp->MEMBER.next) { \ | ||
179 | tmp = container_of(*hp, RTN, MEMBER); \ | ||
180 | if (TEST) { /* found a match */ \ | ||
181 | \ | ||
182 | if (set && !INPLACE && test_bit(CACHE_VALID, &tmp->MEMBER.flags) && !new) \ | ||
183 | break; \ | ||
184 | \ | ||
185 | if (new) \ | ||
186 | {INIT;} \ | ||
187 | if (set) { \ | ||
188 | if (!INPLACE && test_bit(CACHE_VALID, &tmp->MEMBER.flags))\ | ||
189 | { /* need to swap in new */ \ | ||
190 | RTN *t2; \ | ||
191 | \ | ||
192 | new->MEMBER.next = tmp->MEMBER.next; \ | ||
193 | *hp = &new->MEMBER; \ | ||
194 | tmp->MEMBER.next = NULL; \ | ||
195 | t2 = tmp; tmp = new; new = t2; \ | ||
196 | } \ | ||
197 | if (test_bit(CACHE_NEGATIVE, &item->MEMBER.flags)) \ | ||
198 | set_bit(CACHE_NEGATIVE, &tmp->MEMBER.flags); \ | ||
199 | else { \ | ||
200 | UPDATE; \ | ||
201 | clear_bit(CACHE_NEGATIVE, &tmp->MEMBER.flags); \ | ||
202 | } \ | ||
203 | } \ | ||
204 | cache_get(&tmp->MEMBER); \ | ||
205 | if (set||new) write_unlock(&(DETAIL)->hash_lock); \ | ||
206 | else read_unlock(&(DETAIL)->hash_lock); \ | ||
207 | if (set) \ | ||
208 | cache_fresh(DETAIL, &tmp->MEMBER, item->MEMBER.expiry_time); \ | ||
209 | if (set && !INPLACE && new) cache_fresh(DETAIL, &new->MEMBER, 0); \ | ||
210 | if (new) (DETAIL)->cache_put(&new->MEMBER, DETAIL); \ | ||
211 | return tmp; \ | ||
212 | } \ | ||
213 | } \ | ||
214 | /* Didn't find anything */ \ | ||
215 | if (new) { \ | ||
216 | INIT; \ | ||
217 | new->MEMBER.next = *head; \ | ||
218 | *head = &new->MEMBER; \ | ||
219 | (DETAIL)->entries ++; \ | ||
220 | cache_get(&new->MEMBER); \ | ||
221 | if (set) { \ | ||
222 | tmp = new; \ | ||
223 | if (test_bit(CACHE_NEGATIVE, &item->MEMBER.flags)) \ | ||
224 | set_bit(CACHE_NEGATIVE, &tmp->MEMBER.flags); \ | ||
225 | else {UPDATE;} \ | ||
226 | } \ | ||
227 | } \ | ||
228 | if (set||new) write_unlock(&(DETAIL)->hash_lock); \ | ||
229 | else read_unlock(&(DETAIL)->hash_lock); \ | ||
230 | if (new && set) \ | ||
231 | cache_fresh(DETAIL, &new->MEMBER, item->MEMBER.expiry_time); \ | ||
232 | if (new) \ | ||
233 | return new; \ | ||
234 | new = kmalloc(sizeof(*new), GFP_KERNEL); \ | ||
235 | if (new) { \ | ||
236 | cache_init(&new->MEMBER); \ | ||
237 | goto retry; \ | ||
238 | } \ | ||
239 | return NULL; \ | ||
240 | } | ||
241 | 137 | ||
242 | #define DefineSimpleCacheLookup(STRUCT,INPLACE) \ | ||
243 | DefineCacheLookup(struct STRUCT, h, STRUCT##_lookup, (struct STRUCT *item, int set), /*no setup */, \ | ||
244 | & STRUCT##_cache, STRUCT##_hash(item), STRUCT##_match(item, tmp),\ | ||
245 | STRUCT##_init(new, item), STRUCT##_update(tmp, item),INPLACE) | ||
246 | 138 | ||
247 | #define cache_for_each(pos, detail, index, member) \ | 139 | #define cache_for_each(pos, detail, index, member) \ |
248 | for (({read_lock(&(detail)->hash_lock); index = (detail)->hash_size;}) ; \ | 140 | for (({read_lock(&(detail)->hash_lock); index = (detail)->hash_size;}) ; \ |
@@ -258,22 +150,19 @@ extern void cache_clean_deferred(void *owner); | |||
258 | 150 | ||
259 | static inline struct cache_head *cache_get(struct cache_head *h) | 151 | static inline struct cache_head *cache_get(struct cache_head *h) |
260 | { | 152 | { |
261 | atomic_inc(&h->refcnt); | 153 | kref_get(&h->ref); |
262 | return h; | 154 | return h; |
263 | } | 155 | } |
264 | 156 | ||
265 | 157 | ||
266 | static inline int cache_put(struct cache_head *h, struct cache_detail *cd) | 158 | static inline void cache_put(struct cache_head *h, struct cache_detail *cd) |
267 | { | 159 | { |
268 | if (atomic_read(&h->refcnt) <= 2 && | 160 | if (atomic_read(&h->ref.refcount) <= 2 && |
269 | h->expiry_time < cd->nextcheck) | 161 | h->expiry_time < cd->nextcheck) |
270 | cd->nextcheck = h->expiry_time; | 162 | cd->nextcheck = h->expiry_time; |
271 | return atomic_dec_and_test(&h->refcnt); | 163 | kref_put(&h->ref, cd->cache_put); |
272 | } | 164 | } |
273 | 165 | ||
274 | extern void cache_init(struct cache_head *h); | ||
275 | extern void cache_fresh(struct cache_detail *detail, | ||
276 | struct cache_head *head, time_t expiry); | ||
277 | extern int cache_check(struct cache_detail *detail, | 166 | extern int cache_check(struct cache_detail *detail, |
278 | struct cache_head *h, struct cache_req *rqstp); | 167 | struct cache_head *h, struct cache_req *rqstp); |
279 | extern void cache_flush(void); | 168 | extern void cache_flush(void); |
diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h index f147e6b84332..8fe9f35eba31 100644 --- a/include/linux/sunrpc/clnt.h +++ b/include/linux/sunrpc/clnt.h | |||
@@ -45,7 +45,8 @@ struct rpc_clnt { | |||
45 | char * cl_server; /* server machine name */ | 45 | char * cl_server; /* server machine name */ |
46 | char * cl_protname; /* protocol name */ | 46 | char * cl_protname; /* protocol name */ |
47 | struct rpc_auth * cl_auth; /* authenticator */ | 47 | struct rpc_auth * cl_auth; /* authenticator */ |
48 | struct rpc_stat * cl_stats; /* statistics */ | 48 | struct rpc_stat * cl_stats; /* per-program statistics */ |
49 | struct rpc_iostats * cl_metrics; /* per-client statistics */ | ||
49 | 50 | ||
50 | unsigned int cl_softrtry : 1,/* soft timeouts */ | 51 | unsigned int cl_softrtry : 1,/* soft timeouts */ |
51 | cl_intr : 1,/* interruptible */ | 52 | cl_intr : 1,/* interruptible */ |
@@ -59,6 +60,7 @@ struct rpc_clnt { | |||
59 | int cl_nodelen; /* nodename length */ | 60 | int cl_nodelen; /* nodename length */ |
60 | char cl_nodename[UNX_MAXNODENAME]; | 61 | char cl_nodename[UNX_MAXNODENAME]; |
61 | char cl_pathname[30];/* Path in rpc_pipe_fs */ | 62 | char cl_pathname[30];/* Path in rpc_pipe_fs */ |
63 | struct vfsmount * cl_vfsmnt; | ||
62 | struct dentry * cl_dentry; /* inode */ | 64 | struct dentry * cl_dentry; /* inode */ |
63 | struct rpc_clnt * cl_parent; /* Points to parent of clones */ | 65 | struct rpc_clnt * cl_parent; /* Points to parent of clones */ |
64 | struct rpc_rtt cl_rtt_default; | 66 | struct rpc_rtt cl_rtt_default; |
@@ -100,6 +102,8 @@ struct rpc_procinfo { | |||
100 | unsigned int p_bufsiz; /* req. buffer size */ | 102 | unsigned int p_bufsiz; /* req. buffer size */ |
101 | unsigned int p_count; /* call count */ | 103 | unsigned int p_count; /* call count */ |
102 | unsigned int p_timer; /* Which RTT timer to use */ | 104 | unsigned int p_timer; /* Which RTT timer to use */ |
105 | u32 p_statidx; /* Which procedure to account */ | ||
106 | char * p_name; /* name of procedure */ | ||
103 | }; | 107 | }; |
104 | 108 | ||
105 | #define RPC_CONGESTED(clnt) (RPCXPRT_CONGESTED((clnt)->cl_xprt)) | 109 | #define RPC_CONGESTED(clnt) (RPCXPRT_CONGESTED((clnt)->cl_xprt)) |
@@ -137,20 +141,6 @@ size_t rpc_max_payload(struct rpc_clnt *); | |||
137 | void rpc_force_rebind(struct rpc_clnt *); | 141 | void rpc_force_rebind(struct rpc_clnt *); |
138 | int rpc_ping(struct rpc_clnt *clnt, int flags); | 142 | int rpc_ping(struct rpc_clnt *clnt, int flags); |
139 | 143 | ||
140 | static __inline__ | ||
141 | int rpc_call(struct rpc_clnt *clnt, u32 proc, void *argp, void *resp, int flags) | ||
142 | { | ||
143 | struct rpc_message msg = { | ||
144 | .rpc_proc = &clnt->cl_procinfo[proc], | ||
145 | .rpc_argp = argp, | ||
146 | .rpc_resp = resp, | ||
147 | .rpc_cred = NULL | ||
148 | }; | ||
149 | return rpc_call_sync(clnt, &msg, flags); | ||
150 | } | ||
151 | |||
152 | extern void rpciod_wake_up(void); | ||
153 | |||
154 | /* | 144 | /* |
155 | * Helper function for NFSroot support | 145 | * Helper function for NFSroot support |
156 | */ | 146 | */ |
diff --git a/include/linux/sunrpc/gss_krb5.h b/include/linux/sunrpc/gss_krb5.h index 2c3601d31045..1279280d7196 100644 --- a/include/linux/sunrpc/gss_krb5.h +++ b/include/linux/sunrpc/gss_krb5.h | |||
@@ -53,6 +53,8 @@ struct krb5_ctx { | |||
53 | struct xdr_netobj mech_used; | 53 | struct xdr_netobj mech_used; |
54 | }; | 54 | }; |
55 | 55 | ||
56 | extern spinlock_t krb5_seq_lock; | ||
57 | |||
56 | #define KG_TOK_MIC_MSG 0x0101 | 58 | #define KG_TOK_MIC_MSG 0x0101 |
57 | #define KG_TOK_WRAP_MSG 0x0201 | 59 | #define KG_TOK_WRAP_MSG 0x0201 |
58 | 60 | ||
diff --git a/include/linux/sunrpc/metrics.h b/include/linux/sunrpc/metrics.h new file mode 100644 index 000000000000..8f96e9dc369a --- /dev/null +++ b/include/linux/sunrpc/metrics.h | |||
@@ -0,0 +1,77 @@ | |||
1 | /* | ||
2 | * linux/include/linux/sunrpc/metrics.h | ||
3 | * | ||
4 | * Declarations for RPC client per-operation metrics | ||
5 | * | ||
6 | * Copyright (C) 2005 Chuck Lever <cel@netapp.com> | ||
7 | * | ||
8 | * RPC client per-operation statistics provide latency and retry | ||
9 | * information about each type of RPC procedure in a given RPC program. | ||
10 | * These statistics are not for detailed problem diagnosis, but simply | ||
11 | * to indicate whether the problem is local or remote. | ||
12 | * | ||
13 | * These counters are not meant to be human-readable, but are meant to be | ||
14 | * integrated into system monitoring tools such as "sar" and "iostat". As | ||
15 | * such, the counters are sampled by the tools over time, and are never | ||
16 | * zeroed after a file system is mounted. Moving averages can be computed | ||
17 | * by the tools by taking the difference between two instantaneous samples | ||
18 | * and dividing that by the time between the samples. | ||
19 | * | ||
20 | * The counters are maintained in a single array per RPC client, indexed | ||
21 | * by procedure number. There is no need to maintain separate counter | ||
22 | * arrays per-CPU because these counters are always modified behind locks. | ||
23 | */ | ||
24 | |||
25 | #ifndef _LINUX_SUNRPC_METRICS_H | ||
26 | #define _LINUX_SUNRPC_METRICS_H | ||
27 | |||
28 | #include <linux/seq_file.h> | ||
29 | |||
30 | #define RPC_IOSTATS_VERS "1.0" | ||
31 | |||
32 | struct rpc_iostats { | ||
33 | /* | ||
34 | * These counters give an idea about how many request | ||
35 | * transmissions are required, on average, to complete that | ||
36 | * particular procedure. Some procedures may require more | ||
37 | * than one transmission because the server is unresponsive, | ||
38 | * the client is retransmitting too aggressively, or the | ||
39 | * requests are large and the network is congested. | ||
40 | */ | ||
41 | unsigned long om_ops, /* count of operations */ | ||
42 | om_ntrans, /* count of RPC transmissions */ | ||
43 | om_timeouts; /* count of major timeouts */ | ||
44 | |||
45 | /* | ||
46 | * These count how many bytes are sent and received for a | ||
47 | * given RPC procedure type. This indicates how much load a | ||
48 | * particular procedure is putting on the network. These | ||
49 | * counts include the RPC and ULP headers, and the request | ||
50 | * payload. | ||
51 | */ | ||
52 | unsigned long long om_bytes_sent, /* count of bytes out */ | ||
53 | om_bytes_recv; /* count of bytes in */ | ||
54 | |||
55 | /* | ||
56 | * The length of time an RPC request waits in queue before | ||
57 | * transmission, the network + server latency of the request, | ||
58 | * and the total time the request spent from init to release | ||
59 | * are measured. | ||
60 | */ | ||
61 | unsigned long long om_queue, /* jiffies queued for xmit */ | ||
62 | om_rtt, /* jiffies for RPC RTT */ | ||
63 | om_execute; /* jiffies for RPC execution */ | ||
64 | } ____cacheline_aligned; | ||
65 | |||
66 | struct rpc_task; | ||
67 | struct rpc_clnt; | ||
68 | |||
69 | /* | ||
70 | * EXPORTed functions for managing rpc_iostats structures | ||
71 | */ | ||
72 | struct rpc_iostats * rpc_alloc_iostats(struct rpc_clnt *); | ||
73 | void rpc_count_iostats(struct rpc_task *); | ||
74 | void rpc_print_iostats(struct seq_file *, struct rpc_clnt *); | ||
75 | void rpc_free_iostats(struct rpc_iostats *); | ||
76 | |||
77 | #endif /* _LINUX_SUNRPC_METRICS_H */ | ||
diff --git a/include/linux/sunrpc/rpc_pipe_fs.h b/include/linux/sunrpc/rpc_pipe_fs.h index 63929349571f..2c2189cb30aa 100644 --- a/include/linux/sunrpc/rpc_pipe_fs.h +++ b/include/linux/sunrpc/rpc_pipe_fs.h | |||
@@ -45,6 +45,8 @@ extern struct dentry *rpc_mkdir(char *, struct rpc_clnt *); | |||
45 | extern int rpc_rmdir(char *); | 45 | extern int rpc_rmdir(char *); |
46 | extern struct dentry *rpc_mkpipe(char *, void *, struct rpc_pipe_ops *, int flags); | 46 | extern struct dentry *rpc_mkpipe(char *, void *, struct rpc_pipe_ops *, int flags); |
47 | extern int rpc_unlink(char *); | 47 | extern int rpc_unlink(char *); |
48 | extern struct vfsmount *rpc_get_mount(void); | ||
49 | extern void rpc_put_mount(void); | ||
48 | 50 | ||
49 | #endif | 51 | #endif |
50 | #endif | 52 | #endif |
diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h index 8b25629accd8..82a91bb22362 100644 --- a/include/linux/sunrpc/sched.h +++ b/include/linux/sunrpc/sched.h | |||
@@ -86,6 +86,12 @@ struct rpc_task { | |||
86 | struct work_struct tk_work; /* Async task work queue */ | 86 | struct work_struct tk_work; /* Async task work queue */ |
87 | struct rpc_wait tk_wait; /* RPC wait */ | 87 | struct rpc_wait tk_wait; /* RPC wait */ |
88 | } u; | 88 | } u; |
89 | |||
90 | unsigned short tk_timeouts; /* maj timeouts */ | ||
91 | size_t tk_bytes_sent; /* total bytes sent */ | ||
92 | unsigned long tk_start; /* RPC task init timestamp */ | ||
93 | long tk_rtt; /* round-trip time (jiffies) */ | ||
94 | |||
89 | #ifdef RPC_DEBUG | 95 | #ifdef RPC_DEBUG |
90 | unsigned short tk_pid; /* debugging aid */ | 96 | unsigned short tk_pid; /* debugging aid */ |
91 | #endif | 97 | #endif |
@@ -203,6 +209,7 @@ struct rpc_wait_queue { | |||
203 | unsigned char priority; /* current priority */ | 209 | unsigned char priority; /* current priority */ |
204 | unsigned char count; /* # task groups remaining serviced so far */ | 210 | unsigned char count; /* # task groups remaining serviced so far */ |
205 | unsigned char nr; /* # tasks remaining for cookie */ | 211 | unsigned char nr; /* # tasks remaining for cookie */ |
212 | unsigned short qlen; /* total # tasks waiting in queue */ | ||
206 | #ifdef RPC_DEBUG | 213 | #ifdef RPC_DEBUG |
207 | const char * name; | 214 | const char * name; |
208 | #endif | 215 | #endif |
@@ -269,13 +276,13 @@ void * rpc_malloc(struct rpc_task *, size_t); | |||
269 | void rpc_free(struct rpc_task *); | 276 | void rpc_free(struct rpc_task *); |
270 | int rpciod_up(void); | 277 | int rpciod_up(void); |
271 | void rpciod_down(void); | 278 | void rpciod_down(void); |
272 | void rpciod_wake_up(void); | ||
273 | int __rpc_wait_for_completion_task(struct rpc_task *task, int (*)(void *)); | 279 | int __rpc_wait_for_completion_task(struct rpc_task *task, int (*)(void *)); |
274 | #ifdef RPC_DEBUG | 280 | #ifdef RPC_DEBUG |
275 | void rpc_show_tasks(void); | 281 | void rpc_show_tasks(void); |
276 | #endif | 282 | #endif |
277 | int rpc_init_mempool(void); | 283 | int rpc_init_mempool(void); |
278 | void rpc_destroy_mempool(void); | 284 | void rpc_destroy_mempool(void); |
285 | extern struct workqueue_struct *rpciod_workqueue; | ||
279 | 286 | ||
280 | static inline void rpc_exit(struct rpc_task *task, int status) | 287 | static inline void rpc_exit(struct rpc_task *task, int status) |
281 | { | 288 | { |
diff --git a/include/linux/sunrpc/stats.h b/include/linux/sunrpc/stats.h index 0d6ed3c8bdc4..d93c24b47f3f 100644 --- a/include/linux/sunrpc/stats.h +++ b/include/linux/sunrpc/stats.h | |||
@@ -50,7 +50,7 @@ struct proc_dir_entry * rpc_proc_register(struct rpc_stat *); | |||
50 | void rpc_proc_unregister(const char *); | 50 | void rpc_proc_unregister(const char *); |
51 | void rpc_proc_zero(struct rpc_program *); | 51 | void rpc_proc_zero(struct rpc_program *); |
52 | struct proc_dir_entry * svc_proc_register(struct svc_stat *, | 52 | struct proc_dir_entry * svc_proc_register(struct svc_stat *, |
53 | struct file_operations *); | 53 | const struct file_operations *); |
54 | void svc_proc_unregister(const char *); | 54 | void svc_proc_unregister(const char *); |
55 | 55 | ||
56 | void svc_seq_show(struct seq_file *, | 56 | void svc_seq_show(struct seq_file *, |
@@ -65,7 +65,7 @@ static inline void rpc_proc_unregister(const char *p) {} | |||
65 | static inline void rpc_proc_zero(struct rpc_program *p) {} | 65 | static inline void rpc_proc_zero(struct rpc_program *p) {} |
66 | 66 | ||
67 | static inline struct proc_dir_entry *svc_proc_register(struct svc_stat *s, | 67 | static inline struct proc_dir_entry *svc_proc_register(struct svc_stat *s, |
68 | struct file_operations *f) { return NULL; } | 68 | const struct file_operations *f) { return NULL; } |
69 | static inline void svc_proc_unregister(const char *p) {} | 69 | static inline void svc_proc_unregister(const char *p) {} |
70 | 70 | ||
71 | static inline void svc_seq_show(struct seq_file *seq, | 71 | static inline void svc_seq_show(struct seq_file *seq, |
diff --git a/include/linux/sunrpc/svcauth.h b/include/linux/sunrpc/svcauth.h index c119ce7cbd22..2fe2087edd66 100644 --- a/include/linux/sunrpc/svcauth.h +++ b/include/linux/sunrpc/svcauth.h | |||
@@ -45,9 +45,10 @@ struct svc_rqst; /* forward decl */ | |||
45 | * of ip addresses to the given client. | 45 | * of ip addresses to the given client. |
46 | */ | 46 | */ |
47 | struct auth_domain { | 47 | struct auth_domain { |
48 | struct cache_head h; | 48 | struct kref ref; |
49 | struct hlist_node hash; | ||
49 | char *name; | 50 | char *name; |
50 | int flavour; | 51 | struct auth_ops *flavour; |
51 | }; | 52 | }; |
52 | 53 | ||
53 | /* | 54 | /* |
@@ -86,6 +87,9 @@ struct auth_domain { | |||
86 | * | 87 | * |
87 | * domain_release() | 88 | * domain_release() |
88 | * This call releases a domain. | 89 | * This call releases a domain. |
90 | * set_client() | ||
91 | * Givens a pending request (struct svc_rqst), finds and assigns | ||
92 | * an appropriate 'auth_domain' as the client. | ||
89 | */ | 93 | */ |
90 | struct auth_ops { | 94 | struct auth_ops { |
91 | char * name; | 95 | char * name; |
@@ -117,7 +121,7 @@ extern void svc_auth_unregister(rpc_authflavor_t flavor); | |||
117 | extern struct auth_domain *unix_domain_find(char *name); | 121 | extern struct auth_domain *unix_domain_find(char *name); |
118 | extern void auth_domain_put(struct auth_domain *item); | 122 | extern void auth_domain_put(struct auth_domain *item); |
119 | extern int auth_unix_add_addr(struct in_addr addr, struct auth_domain *dom); | 123 | extern int auth_unix_add_addr(struct in_addr addr, struct auth_domain *dom); |
120 | extern struct auth_domain *auth_domain_lookup(struct auth_domain *item, int set); | 124 | extern struct auth_domain *auth_domain_lookup(char *name, struct auth_domain *new); |
121 | extern struct auth_domain *auth_domain_find(char *name); | 125 | extern struct auth_domain *auth_domain_find(char *name); |
122 | extern struct auth_domain *auth_unix_lookup(struct in_addr addr); | 126 | extern struct auth_domain *auth_unix_lookup(struct in_addr addr); |
123 | extern int auth_unix_forget_old(struct auth_domain *dom); | 127 | extern int auth_unix_forget_old(struct auth_domain *dom); |
@@ -160,8 +164,6 @@ static inline unsigned long hash_mem(char *buf, int length, int bits) | |||
160 | return hash >> (BITS_PER_LONG - bits); | 164 | return hash >> (BITS_PER_LONG - bits); |
161 | } | 165 | } |
162 | 166 | ||
163 | extern struct cache_detail auth_domain_cache, ip_map_cache; | ||
164 | |||
165 | #endif /* __KERNEL__ */ | 167 | #endif /* __KERNEL__ */ |
166 | 168 | ||
167 | #endif /* _LINUX_SUNRPC_SVCAUTH_H_ */ | 169 | #endif /* _LINUX_SUNRPC_SVCAUTH_H_ */ |
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index 6ef99b14ff09..7eebbab7160b 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h | |||
@@ -114,6 +114,7 @@ struct rpc_xprt_ops { | |||
114 | void (*release_request)(struct rpc_task *task); | 114 | void (*release_request)(struct rpc_task *task); |
115 | void (*close)(struct rpc_xprt *xprt); | 115 | void (*close)(struct rpc_xprt *xprt); |
116 | void (*destroy)(struct rpc_xprt *xprt); | 116 | void (*destroy)(struct rpc_xprt *xprt); |
117 | void (*print_stats)(struct rpc_xprt *xprt, struct seq_file *seq); | ||
117 | }; | 118 | }; |
118 | 119 | ||
119 | struct rpc_xprt { | 120 | struct rpc_xprt { |
@@ -187,6 +188,18 @@ struct rpc_xprt { | |||
187 | 188 | ||
188 | struct list_head recv; | 189 | struct list_head recv; |
189 | 190 | ||
191 | struct { | ||
192 | unsigned long bind_count, /* total number of binds */ | ||
193 | connect_count, /* total number of connects */ | ||
194 | connect_start, /* connect start timestamp */ | ||
195 | connect_time, /* jiffies waiting for connect */ | ||
196 | sends, /* how many complete requests */ | ||
197 | recvs, /* how many complete requests */ | ||
198 | bad_xids; /* lookup_rqst didn't find XID */ | ||
199 | |||
200 | unsigned long long req_u, /* average requests on the wire */ | ||
201 | bklog_u; /* backlog queue utilization */ | ||
202 | } stat; | ||
190 | 203 | ||
191 | void (*old_data_ready)(struct sock *, int); | 204 | void (*old_data_ready)(struct sock *, int); |
192 | void (*old_state_change)(struct sock *); | 205 | void (*old_state_change)(struct sock *); |
diff --git a/include/linux/synclink.h b/include/linux/synclink.h index 1b7cd8d1a71b..2993302f7923 100644 --- a/include/linux/synclink.h +++ b/include/linux/synclink.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * SyncLink Multiprotocol Serial Adapter Driver | 2 | * SyncLink Multiprotocol Serial Adapter Driver |
3 | * | 3 | * |
4 | * $Id: synclink.h,v 3.10 2005/11/08 19:50:54 paulkf Exp $ | 4 | * $Id: synclink.h,v 3.11 2006/02/06 21:20:29 paulkf Exp $ |
5 | * | 5 | * |
6 | * Copyright (C) 1998-2000 by Microgate Corporation | 6 | * Copyright (C) 1998-2000 by Microgate Corporation |
7 | * | 7 | * |
@@ -221,6 +221,12 @@ struct mgsl_icount { | |||
221 | __u32 rxidle; | 221 | __u32 rxidle; |
222 | }; | 222 | }; |
223 | 223 | ||
224 | struct gpio_desc { | ||
225 | __u32 state; | ||
226 | __u32 smask; | ||
227 | __u32 dir; | ||
228 | __u32 dmask; | ||
229 | }; | ||
224 | 230 | ||
225 | #define DEBUG_LEVEL_DATA 1 | 231 | #define DEBUG_LEVEL_DATA 1 |
226 | #define DEBUG_LEVEL_ERROR 2 | 232 | #define DEBUG_LEVEL_ERROR 2 |
@@ -276,5 +282,8 @@ struct mgsl_icount { | |||
276 | #define MGSL_IOCLOOPTXDONE _IO(MGSL_MAGIC_IOC,9) | 282 | #define MGSL_IOCLOOPTXDONE _IO(MGSL_MAGIC_IOC,9) |
277 | #define MGSL_IOCSIF _IO(MGSL_MAGIC_IOC,10) | 283 | #define MGSL_IOCSIF _IO(MGSL_MAGIC_IOC,10) |
278 | #define MGSL_IOCGIF _IO(MGSL_MAGIC_IOC,11) | 284 | #define MGSL_IOCGIF _IO(MGSL_MAGIC_IOC,11) |
285 | #define MGSL_IOCSGPIO _IOW(MGSL_MAGIC_IOC,16,struct gpio_desc) | ||
286 | #define MGSL_IOCGGPIO _IOR(MGSL_MAGIC_IOC,17,struct gpio_desc) | ||
287 | #define MGSL_IOCWAITGPIO _IOWR(MGSL_MAGIC_IOC,18,struct gpio_desc) | ||
279 | 288 | ||
280 | #endif /* _SYNCLINK_H_ */ | 289 | #endif /* _SYNCLINK_H_ */ |
diff --git a/include/linux/threads.h b/include/linux/threads.h index b59738ac6197..e646bcdf2614 100644 --- a/include/linux/threads.h +++ b/include/linux/threads.h | |||
@@ -28,7 +28,8 @@ | |||
28 | #define PID_MAX_DEFAULT (CONFIG_BASE_SMALL ? 0x1000 : 0x8000) | 28 | #define PID_MAX_DEFAULT (CONFIG_BASE_SMALL ? 0x1000 : 0x8000) |
29 | 29 | ||
30 | /* | 30 | /* |
31 | * A maximum of 4 million PIDs should be enough for a while: | 31 | * A maximum of 4 million PIDs should be enough for a while. |
32 | * [NOTE: PID/TIDs are limited to 2^29 ~= 500+ million, see futex.h.] | ||
32 | */ | 33 | */ |
33 | #define PID_MAX_LIMIT (CONFIG_BASE_SMALL ? PAGE_SIZE * 8 : \ | 34 | #define PID_MAX_LIMIT (CONFIG_BASE_SMALL ? PAGE_SIZE * 8 : \ |
34 | (sizeof(long) > 4 ? 4 * 1024 * 1024 : PID_MAX_DEFAULT)) | 35 | (sizeof(long) > 4 ? 4 * 1024 * 1024 : PID_MAX_DEFAULT)) |
diff --git a/include/linux/time.h b/include/linux/time.h index d9cdba54b789..0cd696cee998 100644 --- a/include/linux/time.h +++ b/include/linux/time.h | |||
@@ -73,12 +73,6 @@ extern void set_normalized_timespec(struct timespec *ts, time_t sec, long nsec); | |||
73 | #define timespec_valid(ts) \ | 73 | #define timespec_valid(ts) \ |
74 | (((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC)) | 74 | (((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC)) |
75 | 75 | ||
76 | /* | ||
77 | * 64-bit nanosec type. Large enough to span 292+ years in nanosecond | ||
78 | * resolution. Ought to be enough for a while. | ||
79 | */ | ||
80 | typedef s64 nsec_t; | ||
81 | |||
82 | extern struct timespec xtime; | 76 | extern struct timespec xtime; |
83 | extern struct timespec wall_to_monotonic; | 77 | extern struct timespec wall_to_monotonic; |
84 | extern seqlock_t xtime_lock; | 78 | extern seqlock_t xtime_lock; |
@@ -101,6 +95,7 @@ extern long do_utimes(int dfd, char __user *filename, struct timeval *times); | |||
101 | struct itimerval; | 95 | struct itimerval; |
102 | extern int do_setitimer(int which, struct itimerval *value, | 96 | extern int do_setitimer(int which, struct itimerval *value, |
103 | struct itimerval *ovalue); | 97 | struct itimerval *ovalue); |
98 | extern unsigned int alarm_setitimer(unsigned int seconds); | ||
104 | extern int do_getitimer(int which, struct itimerval *value); | 99 | extern int do_getitimer(int which, struct itimerval *value); |
105 | extern void getnstimeofday(struct timespec *tv); | 100 | extern void getnstimeofday(struct timespec *tv); |
106 | 101 | ||
@@ -113,9 +108,9 @@ extern struct timespec timespec_trunc(struct timespec t, unsigned gran); | |||
113 | * Returns the scalar nanosecond representation of the timespec | 108 | * Returns the scalar nanosecond representation of the timespec |
114 | * parameter. | 109 | * parameter. |
115 | */ | 110 | */ |
116 | static inline nsec_t timespec_to_ns(const struct timespec *ts) | 111 | static inline s64 timespec_to_ns(const struct timespec *ts) |
117 | { | 112 | { |
118 | return ((nsec_t) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec; | 113 | return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec; |
119 | } | 114 | } |
120 | 115 | ||
121 | /** | 116 | /** |
@@ -125,9 +120,9 @@ static inline nsec_t timespec_to_ns(const struct timespec *ts) | |||
125 | * Returns the scalar nanosecond representation of the timeval | 120 | * Returns the scalar nanosecond representation of the timeval |
126 | * parameter. | 121 | * parameter. |
127 | */ | 122 | */ |
128 | static inline nsec_t timeval_to_ns(const struct timeval *tv) | 123 | static inline s64 timeval_to_ns(const struct timeval *tv) |
129 | { | 124 | { |
130 | return ((nsec_t) tv->tv_sec * NSEC_PER_SEC) + | 125 | return ((s64) tv->tv_sec * NSEC_PER_SEC) + |
131 | tv->tv_usec * NSEC_PER_USEC; | 126 | tv->tv_usec * NSEC_PER_USEC; |
132 | } | 127 | } |
133 | 128 | ||
@@ -137,7 +132,7 @@ static inline nsec_t timeval_to_ns(const struct timeval *tv) | |||
137 | * | 132 | * |
138 | * Returns the timespec representation of the nsec parameter. | 133 | * Returns the timespec representation of the nsec parameter. |
139 | */ | 134 | */ |
140 | extern struct timespec ns_to_timespec(const nsec_t nsec); | 135 | extern struct timespec ns_to_timespec(const s64 nsec); |
141 | 136 | ||
142 | /** | 137 | /** |
143 | * ns_to_timeval - Convert nanoseconds to timeval | 138 | * ns_to_timeval - Convert nanoseconds to timeval |
@@ -145,7 +140,7 @@ extern struct timespec ns_to_timespec(const nsec_t nsec); | |||
145 | * | 140 | * |
146 | * Returns the timeval representation of the nsec parameter. | 141 | * Returns the timeval representation of the nsec parameter. |
147 | */ | 142 | */ |
148 | extern struct timeval ns_to_timeval(const nsec_t nsec); | 143 | extern struct timeval ns_to_timeval(const s64 nsec); |
149 | 144 | ||
150 | #endif /* __KERNEL__ */ | 145 | #endif /* __KERNEL__ */ |
151 | 146 | ||
diff --git a/include/linux/timer.h b/include/linux/timer.h index 9b9877fd2505..b5caabca553c 100644 --- a/include/linux/timer.h +++ b/include/linux/timer.h | |||
@@ -69,13 +69,13 @@ extern unsigned long next_timer_interrupt(void); | |||
69 | * @timer: the timer to be added | 69 | * @timer: the timer to be added |
70 | * | 70 | * |
71 | * The kernel will do a ->function(->data) callback from the | 71 | * The kernel will do a ->function(->data) callback from the |
72 | * timer interrupt at the ->expired point in the future. The | 72 | * timer interrupt at the ->expires point in the future. The |
73 | * current time is 'jiffies'. | 73 | * current time is 'jiffies'. |
74 | * | 74 | * |
75 | * The timer's ->expired, ->function (and if the handler uses it, ->data) | 75 | * The timer's ->expires, ->function (and if the handler uses it, ->data) |
76 | * fields must be set prior calling this function. | 76 | * fields must be set prior calling this function. |
77 | * | 77 | * |
78 | * Timers with an ->expired field in the past will be executed in the next | 78 | * Timers with an ->expires field in the past will be executed in the next |
79 | * timer tick. | 79 | * timer tick. |
80 | */ | 80 | */ |
81 | static inline void add_timer(struct timer_list *timer) | 81 | static inline void add_timer(struct timer_list *timer) |
@@ -96,6 +96,7 @@ static inline void add_timer(struct timer_list *timer) | |||
96 | 96 | ||
97 | extern void init_timers(void); | 97 | extern void init_timers(void); |
98 | extern void run_local_timers(void); | 98 | extern void run_local_timers(void); |
99 | extern int it_real_fn(void *); | 99 | struct hrtimer; |
100 | extern int it_real_fn(struct hrtimer *); | ||
100 | 101 | ||
101 | #endif | 102 | #endif |
diff --git a/include/linux/timex.h b/include/linux/timex.h index b7ca1204e42a..03914b7e41b1 100644 --- a/include/linux/timex.h +++ b/include/linux/timex.h | |||
@@ -97,38 +97,11 @@ | |||
97 | 97 | ||
98 | #define MAXPHASE 512000L /* max phase error (us) */ | 98 | #define MAXPHASE 512000L /* max phase error (us) */ |
99 | #define MAXFREQ (512L << SHIFT_USEC) /* max frequency error (ppm) */ | 99 | #define MAXFREQ (512L << SHIFT_USEC) /* max frequency error (ppm) */ |
100 | #define MAXTIME (200L << PPS_AVG) /* max PPS error (jitter) (200 us) */ | ||
101 | #define MINSEC 16L /* min interval between updates (s) */ | 100 | #define MINSEC 16L /* min interval between updates (s) */ |
102 | #define MAXSEC 1200L /* max interval between updates (s) */ | 101 | #define MAXSEC 1200L /* max interval between updates (s) */ |
103 | #define NTP_PHASE_LIMIT (MAXPHASE << 5) /* beyond max. dispersion */ | 102 | #define NTP_PHASE_LIMIT (MAXPHASE << 5) /* beyond max. dispersion */ |
104 | 103 | ||
105 | /* | 104 | /* |
106 | * The following defines are used only if a pulse-per-second (PPS) | ||
107 | * signal is available and connected via a modem control lead, such as | ||
108 | * produced by the optional ppsclock feature incorporated in the Sun | ||
109 | * asynch driver. They establish the design parameters of the frequency- | ||
110 | * lock loop used to discipline the CPU clock oscillator to the PPS | ||
111 | * signal. | ||
112 | * | ||
113 | * PPS_AVG is the averaging factor for the frequency loop, as well as | ||
114 | * the time and frequency dispersion. | ||
115 | * | ||
116 | * PPS_SHIFT and PPS_SHIFTMAX specify the minimum and maximum | ||
117 | * calibration intervals, respectively, in seconds as a power of two. | ||
118 | * | ||
119 | * PPS_VALID is the maximum interval before the PPS signal is considered | ||
120 | * invalid and protocol updates used directly instead. | ||
121 | * | ||
122 | * MAXGLITCH is the maximum interval before a time offset of more than | ||
123 | * MAXTIME is believed. | ||
124 | */ | ||
125 | #define PPS_AVG 2 /* pps averaging constant (shift) */ | ||
126 | #define PPS_SHIFT 2 /* min interval duration (s) (shift) */ | ||
127 | #define PPS_SHIFTMAX 8 /* max interval duration (s) (shift) */ | ||
128 | #define PPS_VALID 120 /* pps signal watchdog max (s) */ | ||
129 | #define MAXGLITCH 30 /* pps signal glitch max (s) */ | ||
130 | |||
131 | /* | ||
132 | * syscall interface - used (mainly by NTP daemon) | 105 | * syscall interface - used (mainly by NTP daemon) |
133 | * to discipline kernel clock oscillator | 106 | * to discipline kernel clock oscillator |
134 | */ | 107 | */ |
@@ -246,20 +219,6 @@ extern long time_reftime; /* time at last adjustment (s) */ | |||
246 | extern long time_adjust; /* The amount of adjtime left */ | 219 | extern long time_adjust; /* The amount of adjtime left */ |
247 | extern long time_next_adjust; /* Value for time_adjust at next tick */ | 220 | extern long time_next_adjust; /* Value for time_adjust at next tick */ |
248 | 221 | ||
249 | /* interface variables pps->timer interrupt */ | ||
250 | extern long pps_offset; /* pps time offset (us) */ | ||
251 | extern long pps_jitter; /* time dispersion (jitter) (us) */ | ||
252 | extern long pps_freq; /* frequency offset (scaled ppm) */ | ||
253 | extern long pps_stabil; /* frequency dispersion (scaled ppm) */ | ||
254 | extern long pps_valid; /* pps signal watchdog counter */ | ||
255 | |||
256 | /* interface variables pps->adjtimex */ | ||
257 | extern int pps_shift; /* interval duration (s) (shift) */ | ||
258 | extern long pps_jitcnt; /* jitter limit exceeded */ | ||
259 | extern long pps_calcnt; /* calibration intervals */ | ||
260 | extern long pps_errcnt; /* calibration errors */ | ||
261 | extern long pps_stbcnt; /* stability limit exceeded */ | ||
262 | |||
263 | /** | 222 | /** |
264 | * ntp_clear - Clears the NTP state variables | 223 | * ntp_clear - Clears the NTP state variables |
265 | * | 224 | * |
@@ -348,6 +307,8 @@ time_interpolator_reset(void) | |||
348 | /* Returns how long ticks are at present, in ns / 2^(SHIFT_SCALE-10). */ | 307 | /* Returns how long ticks are at present, in ns / 2^(SHIFT_SCALE-10). */ |
349 | extern u64 current_tick_length(void); | 308 | extern u64 current_tick_length(void); |
350 | 309 | ||
310 | extern int do_adjtimex(struct timex *); | ||
311 | |||
351 | #endif /* KERNEL */ | 312 | #endif /* KERNEL */ |
352 | 313 | ||
353 | #endif /* LINUX_TIMEX_H */ | 314 | #endif /* LINUX_TIMEX_H */ |
diff --git a/include/linux/topology.h b/include/linux/topology.h index e8eb0040ce3a..a305ae2e44b6 100644 --- a/include/linux/topology.h +++ b/include/linux/topology.h | |||
@@ -164,6 +164,15 @@ | |||
164 | .nr_balance_failed = 0, \ | 164 | .nr_balance_failed = 0, \ |
165 | } | 165 | } |
166 | 166 | ||
167 | #ifdef CONFIG_SCHED_MC | ||
168 | #ifndef SD_MC_INIT | ||
169 | /* for now its same as SD_CPU_INIT. | ||
170 | * TBD: Tune Domain parameters! | ||
171 | */ | ||
172 | #define SD_MC_INIT SD_CPU_INIT | ||
173 | #endif | ||
174 | #endif | ||
175 | |||
167 | #ifdef CONFIG_NUMA | 176 | #ifdef CONFIG_NUMA |
168 | #ifndef SD_NODE_INIT | 177 | #ifndef SD_NODE_INIT |
169 | #error Please define an appropriate SD_NODE_INIT in include/asm/topology.h!!! | 178 | #error Please define an appropriate SD_NODE_INIT in include/asm/topology.h!!! |
diff --git a/include/linux/tty_flip.h b/include/linux/tty_flip.h index 0c6169fff366..0976a163b459 100644 --- a/include/linux/tty_flip.h +++ b/include/linux/tty_flip.h | |||
@@ -2,8 +2,8 @@ | |||
2 | #define _LINUX_TTY_FLIP_H | 2 | #define _LINUX_TTY_FLIP_H |
3 | 3 | ||
4 | extern int tty_buffer_request_room(struct tty_struct *tty, size_t size); | 4 | extern int tty_buffer_request_room(struct tty_struct *tty, size_t size); |
5 | extern int tty_insert_flip_string(struct tty_struct *tty, unsigned char *chars, size_t size); | 5 | extern int tty_insert_flip_string(struct tty_struct *tty, const unsigned char *chars, size_t size); |
6 | extern int tty_insert_flip_string_flags(struct tty_struct *tty, unsigned char *chars, char *flags, size_t size); | 6 | extern int tty_insert_flip_string_flags(struct tty_struct *tty, const unsigned char *chars, const char *flags, size_t size); |
7 | extern int tty_prepare_flip_string(struct tty_struct *tty, unsigned char **chars, size_t size); | 7 | extern int tty_prepare_flip_string(struct tty_struct *tty, unsigned char **chars, size_t size); |
8 | extern int tty_prepare_flip_string_flags(struct tty_struct *tty, unsigned char **chars, char **flags, size_t size); | 8 | extern int tty_prepare_flip_string_flags(struct tty_struct *tty, unsigned char **chars, char **flags, size_t size); |
9 | 9 | ||
diff --git a/include/linux/types.h b/include/linux/types.h index 54ae2d59e71b..1046c7ad86d9 100644 --- a/include/linux/types.h +++ b/include/linux/types.h | |||
@@ -137,6 +137,10 @@ typedef __s64 int64_t; | |||
137 | typedef unsigned long sector_t; | 137 | typedef unsigned long sector_t; |
138 | #endif | 138 | #endif |
139 | 139 | ||
140 | #ifndef HAVE_BLKCNT_T | ||
141 | typedef unsigned long blkcnt_t; | ||
142 | #endif | ||
143 | |||
140 | /* | 144 | /* |
141 | * The type of an index into the pagecache. Use a #define so asm/types.h | 145 | * The type of an index into the pagecache. Use a #define so asm/types.h |
142 | * can override it. | 146 | * can override it. |
diff --git a/include/linux/udf_fs_i.h b/include/linux/udf_fs_i.h index 1e7508420fcf..ffaf05679ffb 100644 --- a/include/linux/udf_fs_i.h +++ b/include/linux/udf_fs_i.h | |||
@@ -15,27 +15,6 @@ | |||
15 | 15 | ||
16 | #ifdef __KERNEL__ | 16 | #ifdef __KERNEL__ |
17 | 17 | ||
18 | #ifndef _ECMA_167_H | ||
19 | typedef struct | ||
20 | { | ||
21 | __u32 logicalBlockNum; | ||
22 | __u16 partitionReferenceNum; | ||
23 | } __attribute__ ((packed)) lb_addr; | ||
24 | |||
25 | typedef struct | ||
26 | { | ||
27 | __u32 extLength; | ||
28 | __u32 extPosition; | ||
29 | } __attribute__ ((packed)) short_ad; | ||
30 | |||
31 | typedef struct | ||
32 | { | ||
33 | __u32 extLength; | ||
34 | lb_addr extLocation; | ||
35 | __u8 impUse[6]; | ||
36 | } __attribute__ ((packed)) long_ad; | ||
37 | #endif | ||
38 | |||
39 | struct udf_inode_info | 18 | struct udf_inode_info |
40 | { | 19 | { |
41 | struct timespec i_crtime; | 20 | struct timespec i_crtime; |
diff --git a/include/linux/ufs_fs.h b/include/linux/ufs_fs.h index b0ffe4356e5a..843aeaaa79d4 100644 --- a/include/linux/ufs_fs.h +++ b/include/linux/ufs_fs.h | |||
@@ -895,7 +895,7 @@ extern void ufs_set_link(struct inode *, struct ufs_dir_entry *, struct buffer_h | |||
895 | 895 | ||
896 | /* file.c */ | 896 | /* file.c */ |
897 | extern struct inode_operations ufs_file_inode_operations; | 897 | extern struct inode_operations ufs_file_inode_operations; |
898 | extern struct file_operations ufs_file_operations; | 898 | extern const struct file_operations ufs_file_operations; |
899 | 899 | ||
900 | extern struct address_space_operations ufs_aops; | 900 | extern struct address_space_operations ufs_aops; |
901 | 901 | ||
@@ -915,7 +915,7 @@ extern struct buffer_head * ufs_bread (struct inode *, unsigned, int, int *); | |||
915 | extern int ufs_getfrag_block (struct inode *inode, sector_t fragment, struct buffer_head *bh_result, int create); | 915 | extern int ufs_getfrag_block (struct inode *inode, sector_t fragment, struct buffer_head *bh_result, int create); |
916 | 916 | ||
917 | /* namei.c */ | 917 | /* namei.c */ |
918 | extern struct file_operations ufs_dir_operations; | 918 | extern const struct file_operations ufs_dir_operations; |
919 | 919 | ||
920 | /* super.c */ | 920 | /* super.c */ |
921 | extern void ufs_warning (struct super_block *, const char *, const char *, ...) __attribute__ ((format (printf, 3, 4))); | 921 | extern void ufs_warning (struct super_block *, const char *, const char *, ...) __attribute__ ((format (printf, 3, 4))); |
diff --git a/include/linux/usb.h b/include/linux/usb.h index 130d125fda12..e34e5e3dce52 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
@@ -615,7 +615,7 @@ extern struct bus_type usb_bus_type; | |||
615 | */ | 615 | */ |
616 | struct usb_class_driver { | 616 | struct usb_class_driver { |
617 | char *name; | 617 | char *name; |
618 | struct file_operations *fops; | 618 | const struct file_operations *fops; |
619 | int minor_base; | 619 | int minor_base; |
620 | }; | 620 | }; |
621 | 621 | ||
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index 724cfbf54b8a..af2d6155d3fe 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h | |||
@@ -75,7 +75,7 @@ struct video_device | |||
75 | int minor; | 75 | int minor; |
76 | 76 | ||
77 | /* device ops + callbacks */ | 77 | /* device ops + callbacks */ |
78 | struct file_operations *fops; | 78 | const struct file_operations *fops; |
79 | void (*release)(struct video_device *vfd); | 79 | void (*release)(struct video_device *vfd); |
80 | 80 | ||
81 | 81 | ||
@@ -883,6 +883,7 @@ struct v4l2_modulator | |||
883 | #define V4L2_TUNER_MODE_LANG2 0x0002 | 883 | #define V4L2_TUNER_MODE_LANG2 0x0002 |
884 | #define V4L2_TUNER_MODE_SAP 0x0002 | 884 | #define V4L2_TUNER_MODE_SAP 0x0002 |
885 | #define V4L2_TUNER_MODE_LANG1 0x0003 | 885 | #define V4L2_TUNER_MODE_LANG1 0x0003 |
886 | #define V4L2_TUNER_MODE_LANG1_LANG2 0x0004 | ||
886 | 887 | ||
887 | struct v4l2_frequency | 888 | struct v4l2_frequency |
888 | { | 889 | { |
diff --git a/include/linux/x1205.h b/include/linux/x1205.h deleted file mode 100644 index 64fd3af894a5..000000000000 --- a/include/linux/x1205.h +++ /dev/null | |||
@@ -1,31 +0,0 @@ | |||
1 | /* | ||
2 | * x1205.h - defines for drivers/i2c/chips/x1205.c | ||
3 | * Copyright 2004 Karen Spearel | ||
4 | * Copyright 2005 Alessandro Zummo | ||
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 as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef __LINUX_X1205_H__ | ||
13 | #define __LINUX_X1205_H__ | ||
14 | |||
15 | /* commands */ | ||
16 | |||
17 | #define X1205_CMD_GETDATETIME 0 | ||
18 | #define X1205_CMD_SETTIME 1 | ||
19 | #define X1205_CMD_SETDATETIME 2 | ||
20 | #define X1205_CMD_GETALARM 3 | ||
21 | #define X1205_CMD_SETALARM 4 | ||
22 | #define X1205_CMD_GETDTRIM 5 | ||
23 | #define X1205_CMD_SETDTRIM 6 | ||
24 | #define X1205_CMD_GETATRIM 7 | ||
25 | #define X1205_CMD_SETATRIM 8 | ||
26 | |||
27 | extern int x1205_do_command(unsigned int cmd, void *arg); | ||
28 | extern int x1205_direct_attach(int adapter_id, | ||
29 | struct i2c_client_address_data *address_data); | ||
30 | |||
31 | #endif /* __LINUX_X1205_H__ */ | ||
diff --git a/include/linux/zorro.h b/include/linux/zorro.h index ba5b72768bbe..2f135cf6eef1 100644 --- a/include/linux/zorro.h +++ b/include/linux/zorro.h | |||
@@ -271,39 +271,6 @@ static inline void zorro_set_drvdata (struct zorro_dev *z, void *data) | |||
271 | } | 271 | } |
272 | 272 | ||
273 | 273 | ||
274 | /* | ||
275 | * A helper function which helps ensure correct zorro_driver | ||
276 | * setup and cleanup for commonly-encountered hotplug/modular cases | ||
277 | * | ||
278 | * This MUST stay in a header, as it checks for -DMODULE | ||
279 | */ | ||
280 | static inline int zorro_module_init(struct zorro_driver *drv) | ||
281 | { | ||
282 | int rc = zorro_register_driver(drv); | ||
283 | |||
284 | if (rc > 0) | ||
285 | return 0; | ||
286 | |||
287 | /* iff CONFIG_HOTPLUG and built into kernel, we should | ||
288 | * leave the driver around for future hotplug events. | ||
289 | * For the module case, a hotplug daemon of some sort | ||
290 | * should load a module in response to an insert event. */ | ||
291 | #if defined(CONFIG_HOTPLUG) && !defined(MODULE) | ||
292 | if (rc == 0) | ||
293 | return 0; | ||
294 | #else | ||
295 | if (rc == 0) | ||
296 | rc = -ENODEV; | ||
297 | #endif | ||
298 | |||
299 | /* if we get here, we need to clean up Zorro driver instance | ||
300 | * and return some sort of error */ | ||
301 | zorro_unregister_driver(drv); | ||
302 | |||
303 | return rc; | ||
304 | } | ||
305 | |||
306 | |||
307 | /* | 274 | /* |
308 | * Bitmask indicating portions of available Zorro II RAM that are unused | 275 | * Bitmask indicating portions of available Zorro II RAM that are unused |
309 | * by the system. Every bit represents a 64K chunk, for a maximum of 8MB | 276 | * by the system. Every bit represents a 64K chunk, for a maximum of 8MB |
diff --git a/include/media/audiochip.h b/include/media/audiochip.h index 295d256ee811..1fd4a2207574 100644 --- a/include/media/audiochip.h +++ b/include/media/audiochip.h | |||
@@ -21,18 +21,4 @@ enum audiochip { | |||
21 | AUDIO_CHIP_MSP34XX | 21 | AUDIO_CHIP_MSP34XX |
22 | }; | 22 | }; |
23 | 23 | ||
24 | /* ---------------------------------------------------------------------- */ | ||
25 | |||
26 | /* audio inputs */ | ||
27 | #define AUDIO_TUNER 0x00 | ||
28 | #define AUDIO_RADIO 0x01 | ||
29 | #define AUDIO_EXTERN 0x02 | ||
30 | #define AUDIO_INTERN 0x03 | ||
31 | #define AUDIO_OFF 0x04 | ||
32 | #define AUDIO_ON 0x05 | ||
33 | #define AUDIO_EXTERN_1 AUDIO_EXTERN | ||
34 | #define AUDIO_EXTERN_2 0x06 | ||
35 | #define AUDIO_MUTE 0x80 | ||
36 | #define AUDIO_UNMUTE 0x81 | ||
37 | |||
38 | #endif /* AUDIOCHIP_H */ | 24 | #endif /* AUDIOCHIP_H */ |
diff --git a/include/media/cs53l32a.h b/include/media/cs53l32a.h new file mode 100644 index 000000000000..bf76197d3790 --- /dev/null +++ b/include/media/cs53l32a.h | |||
@@ -0,0 +1,34 @@ | |||
1 | /* | ||
2 | cs53l32a.h - definition for cs53l32a inputs and outputs | ||
3 | |||
4 | Copyright (C) 2006 Hans Verkuil (hverkuil@xs4all.nl) | ||
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 as published by | ||
8 | the Free Software Foundation; either version 2 of the License, or | ||
9 | (at your option) any later version. | ||
10 | |||
11 | This program is distributed in the hope that it will be useful, | ||
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | GNU General Public License for more details. | ||
15 | |||
16 | You should have received a copy of the GNU General Public License | ||
17 | along with this program; if not, write to the Free Software | ||
18 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | */ | ||
20 | |||
21 | #ifndef _CS53L32A_H_ | ||
22 | #define _CS53L32A_H_ | ||
23 | |||
24 | /* There are 2 physical inputs, but the second input can be | ||
25 | placed in two modes, the first mode bypasses the PGA (gain), | ||
26 | the second goes through the PGA. Hence there are three | ||
27 | possible inputs to choose from. */ | ||
28 | |||
29 | /* CS53L32A HW inputs */ | ||
30 | #define CS53L32A_IN0 0 | ||
31 | #define CS53L32A_IN1 1 | ||
32 | #define CS53L32A_IN2 2 | ||
33 | |||
34 | #endif | ||
diff --git a/include/media/i2c-addr.h b/include/media/i2c-addr.h new file mode 100644 index 000000000000..e7ff44a35ca0 --- /dev/null +++ b/include/media/i2c-addr.h | |||
@@ -0,0 +1,44 @@ | |||
1 | /* | ||
2 | * V4L I2C address list | ||
3 | * | ||
4 | * | ||
5 | * Copyright (C) 2006 Mauro Carvalho Chehab <mchehab@infradead.org> | ||
6 | * Based on a previous mapping by | ||
7 | * Ralph Metzler (rjkm@thp.uni-koeln.de) | ||
8 | * Gerd Knorr <kraxel@goldbach.in-berlin.de> | ||
9 | * | ||
10 | */ | ||
11 | |||
12 | /* bttv address list */ | ||
13 | #define I2C_ADDR_TSA5522 0xc2 | ||
14 | #define I2C_ADDR_TDA7432 0x8a | ||
15 | #define I2C_ADDR_BT832_ALT1 0x88 | ||
16 | #define I2C_ADDR_BT832_ALT2 0x8a // alternate setting | ||
17 | #define I2C_ADDR_TDA8425 0x82 | ||
18 | #define I2C_ADDR_TDA9840 0x84 | ||
19 | #define I2C_ADDR_TDA9850 0xb6 /* also used by 9855,9873 */ | ||
20 | #define I2C_ADDR_TDA9874 0xb0 /* also used by 9875 */ | ||
21 | #define I2C_ADDR_TDA9875 0xb0 | ||
22 | #define I2C_ADDR_HAUPEE 0xa0 | ||
23 | #define I2C_ADDR_STBEE 0xae | ||
24 | #define I2C_ADDR_VHX 0xc0 | ||
25 | #define I2C_ADDR_MSP3400 0x80 | ||
26 | #define I2C_ADDR_MSP3400_ALT 0x88 | ||
27 | #define I2C_ADDR_TEA6300 0x80 /* also used by 6320 */ | ||
28 | #define I2C_ADDR_DPL3518 0x84 | ||
29 | #define I2C_ADDR_TDA9887 0x86 | ||
30 | |||
31 | /* | ||
32 | * i2c bus addresses for the chips supported by tvaudio.c | ||
33 | */ | ||
34 | |||
35 | #define I2C_ADDR_TDA8425 0x82 | ||
36 | #define I2C_ADDR_TDA9840 0x84 /* also used by TA8874Z */ | ||
37 | #define I2C_ADDR_TDA985x_L 0xb4 /* also used by 9873 */ | ||
38 | #define I2C_ADDR_TDA985x_H 0xb6 | ||
39 | #define I2C_ADDR_TDA9874 0xb0 /* also used by 9875 */ | ||
40 | |||
41 | #define I2C_ADDR_TEA6300 0x80 /* also used by 6320 */ | ||
42 | #define I2C_ADDR_TEA6420 0x98 | ||
43 | |||
44 | #define I2C_ADDR_PIC16C54 0x96 /* PV951 */ | ||
diff --git a/include/media/msp3400.h b/include/media/msp3400.h new file mode 100644 index 000000000000..0be61a021d45 --- /dev/null +++ b/include/media/msp3400.h | |||
@@ -0,0 +1,226 @@ | |||
1 | /* | ||
2 | msp3400.h - definition for msp3400 inputs and outputs | ||
3 | |||
4 | Copyright (C) 2006 Hans Verkuil (hverkuil@xs4all.nl) | ||
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 as published by | ||
8 | the Free Software Foundation; either version 2 of the License, or | ||
9 | (at your option) any later version. | ||
10 | |||
11 | This program is distributed in the hope that it will be useful, | ||
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | GNU General Public License for more details. | ||
15 | |||
16 | You should have received a copy of the GNU General Public License | ||
17 | along with this program; if not, write to the Free Software | ||
18 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | */ | ||
20 | |||
21 | #ifndef _MSP3400_H_ | ||
22 | #define _MSP3400_H_ | ||
23 | |||
24 | /* msp3400 routing | ||
25 | =============== | ||
26 | |||
27 | The msp3400 has a complicated routing scheme with many possible | ||
28 | combinations. The details are all in the datasheets but I will try | ||
29 | to give a short description here. | ||
30 | |||
31 | Inputs | ||
32 | ====== | ||
33 | |||
34 | There are 1) tuner inputs, 2) I2S inputs, 3) SCART inputs. You will have | ||
35 | to select which tuner input to use and which SCART input to use. The | ||
36 | selected tuner input, the selected SCART input and all I2S inputs go to | ||
37 | the DSP (the tuner input first goes through the demodulator). | ||
38 | |||
39 | The DSP handles things like volume, bass/treble, balance, and some chips | ||
40 | have support for surround sound. It has several outputs: MAIN, AUX, I2S | ||
41 | and SCART1/2. Each output can select which DSP input to use. So the MAIN | ||
42 | output can select the tuner input while at the same time the SCART1 output | ||
43 | uses the I2S input. | ||
44 | |||
45 | Outputs | ||
46 | ======= | ||
47 | |||
48 | Most DSP outputs are also the outputs of the msp3400. However, the SCART | ||
49 | outputs of the msp3400 can select which input to use: either the SCART1 or | ||
50 | SCART2 output from the DSP, or the msp3400 SCART inputs, thus completely | ||
51 | bypassing the DSP. | ||
52 | |||
53 | Summary | ||
54 | ======= | ||
55 | |||
56 | So to specify a complete routing scheme for the msp3400 you will have to | ||
57 | specify in the 'input' field of the v4l2_routing struct: | ||
58 | |||
59 | 1) which tuner input to use | ||
60 | 2) which SCART input to use | ||
61 | 3) which DSP input to use for each DSP output | ||
62 | |||
63 | And in the 'output' field of the v4l2_routing struct you specify: | ||
64 | |||
65 | 1) which SCART input to use for each SCART output | ||
66 | |||
67 | Depending on how the msp is wired to the other components you can | ||
68 | ignore or mute certain inputs or outputs. | ||
69 | |||
70 | Also, depending on the msp version only a subset of the inputs or | ||
71 | outputs may be present. At the end of this header some tables are | ||
72 | added containing a list of what is available for each msp version. | ||
73 | */ | ||
74 | |||
75 | /* Inputs to the DSP unit: two independent selections have to be made: | ||
76 | 1) the tuner (SIF) input | ||
77 | 2) the SCART input | ||
78 | Bits 0-2 are used for the SCART input select, bit 3 is used for the tuner | ||
79 | input, bits 4-7 are reserved. | ||
80 | */ | ||
81 | |||
82 | /* SCART input to DSP selection */ | ||
83 | #define MSP_IN_SCART_1 0 /* Pin SC1_IN */ | ||
84 | #define MSP_IN_SCART_2 1 /* Pin SC2_IN */ | ||
85 | #define MSP_IN_SCART_3 2 /* Pin SC3_IN */ | ||
86 | #define MSP_IN_SCART_4 3 /* Pin SC4_IN */ | ||
87 | #define MSP_IN_MONO 6 /* Pin MONO_IN */ | ||
88 | #define MSP_IN_MUTE 7 /* Mute DSP input */ | ||
89 | #define MSP_SCART_TO_DSP(in) (in) | ||
90 | /* Tuner input to demodulator and DSP selection */ | ||
91 | #define MSP_IN_TUNER_1 0 /* Analog Sound IF input pin ANA_IN1 */ | ||
92 | #define MSP_IN_TUNER_2 1 /* Analog Sound IF input pin ANA_IN2 */ | ||
93 | #define MSP_TUNER_TO_DSP(in) ((in) << 3) | ||
94 | |||
95 | /* The msp has up to 5 DSP outputs, each output can independently select | ||
96 | a DSP input. | ||
97 | |||
98 | The DSP outputs are: loudspeaker output (aka MAIN), headphones output | ||
99 | (aka AUX), SCART1 DA output, SCART2 DA output and an I2S output. | ||
100 | There also is a quasi-peak detector output, but that is not used by | ||
101 | this driver and is set to the same input as the loudspeaker output. | ||
102 | Not all outputs are supported by all msp models. Setting the input | ||
103 | of an unsupported output will be ignored by the driver. | ||
104 | |||
105 | There are up to 16 DSP inputs to choose from, so each output is | ||
106 | assigned 4 bits. | ||
107 | |||
108 | Note: the 44x8G can mix two inputs and feed the result back to the | ||
109 | DSP. This is currently not implemented. Also not implemented is the | ||
110 | multi-channel capable I2S3 input of the 44x0G. If someone can demonstrate | ||
111 | a need for one of those features then additional support can be added. */ | ||
112 | #define MSP_DSP_OUT_TUNER 0 /* Tuner output */ | ||
113 | #define MSP_DSP_OUT_SCART 2 /* SCART output */ | ||
114 | #define MSP_DSP_OUT_I2S1 5 /* I2S1 output */ | ||
115 | #define MSP_DSP_OUT_I2S2 6 /* I2S2 output */ | ||
116 | #define MSP_DSP_OUT_I2S3 7 /* I2S3 output */ | ||
117 | #define MSP_DSP_OUT_MAIN_AVC 11 /* MAIN AVC processed output */ | ||
118 | #define MSP_DSP_OUT_MAIN 12 /* MAIN output */ | ||
119 | #define MSP_DSP_OUT_AUX 13 /* AUX output */ | ||
120 | #define MSP_DSP_TO_MAIN(in) ((in) << 4) | ||
121 | #define MSP_DSP_TO_AUX(in) ((in) << 8) | ||
122 | #define MSP_DSP_TO_SCART1(in) ((in) << 12) | ||
123 | #define MSP_DSP_TO_SCART2(in) ((in) << 16) | ||
124 | #define MSP_DSP_TO_I2S(in) ((in) << 20) | ||
125 | |||
126 | /* Output SCART select: the SCART outputs can select which input | ||
127 | to use. */ | ||
128 | #define MSP_OUT_SCART1 0 /* SCART1 input, bypassing the DSP */ | ||
129 | #define MSP_OUT_SCART2 1 /* SCART2 input, bypassing the DSP */ | ||
130 | #define MSP_OUT_SCART3 2 /* SCART3 input, bypassing the DSP */ | ||
131 | #define MSP_OUT_SCART4 3 /* SCART4 input, bypassing the DSP */ | ||
132 | #define MSP_OUT_SCART1_DA 4 /* DSP SCART1 output */ | ||
133 | #define MSP_OUT_SCART2_DA 5 /* DSP SCART2 output */ | ||
134 | #define MSP_OUT_MONO 6 /* MONO input, bypassing the DSP */ | ||
135 | #define MSP_OUT_MUTE 7 /* MUTE output */ | ||
136 | #define MSP_OUT_TO_SCART1(in) (in) | ||
137 | #define MSP_OUT_TO_SCART2(in) ((in) << 4) | ||
138 | |||
139 | /* Shortcut macros */ | ||
140 | #define MSP_INPUT(sc, t, main_aux_src, sc_i2s_src) \ | ||
141 | (MSP_SCART_TO_DSP(sc) | \ | ||
142 | MSP_TUNER_TO_DSP(t) | \ | ||
143 | MSP_DSP_TO_MAIN(main_aux_src) | \ | ||
144 | MSP_DSP_TO_AUX(main_aux_src) | \ | ||
145 | MSP_DSP_TO_SCART1(sc_i2s_src) | \ | ||
146 | MSP_DSP_TO_SCART2(sc_i2s_src) | \ | ||
147 | MSP_DSP_TO_I2S(sc_i2s_src)) | ||
148 | #define MSP_INPUT_DEFAULT MSP_INPUT(MSP_IN_SCART_1, MSP_IN_TUNER_1, \ | ||
149 | MSP_DSP_OUT_TUNER, MSP_DSP_OUT_TUNER) | ||
150 | #define MSP_OUTPUT(sc) \ | ||
151 | (MSP_OUT_TO_SCART1(sc) | \ | ||
152 | MSP_OUT_TO_SCART2(sc)) | ||
153 | /* This equals the RESET position of the msp3400 ACB register */ | ||
154 | #define MSP_OUTPUT_DEFAULT (MSP_OUT_TO_SCART1(MSP_OUT_SCART3) | \ | ||
155 | MSP_OUT_TO_SCART2(MSP_OUT_SCART1_DA)) | ||
156 | |||
157 | /* Tuner inputs vs. msp version */ | ||
158 | /* Chip TUNER_1 TUNER_2 | ||
159 | ------------------------- | ||
160 | msp34x0b y y | ||
161 | msp34x0c y y | ||
162 | msp34x0d y y | ||
163 | msp34x5d y n | ||
164 | msp34x7d y n | ||
165 | msp34x0g y y | ||
166 | msp34x1g y y | ||
167 | msp34x2g y y | ||
168 | msp34x5g y n | ||
169 | msp34x7g y n | ||
170 | msp44x0g y y | ||
171 | msp44x8g y y | ||
172 | */ | ||
173 | |||
174 | /* SCART inputs vs. msp version */ | ||
175 | /* Chip SC1 SC2 SC3 SC4 | ||
176 | ------------------------- | ||
177 | msp34x0b y y y n | ||
178 | msp34x0c y y y n | ||
179 | msp34x0d y y y y | ||
180 | msp34x5d y y n n | ||
181 | msp34x7d y n n n | ||
182 | msp34x0g y y y y | ||
183 | msp34x1g y y y y | ||
184 | msp34x2g y y y y | ||
185 | msp34x5g y y n n | ||
186 | msp34x7g y n n n | ||
187 | msp44x0g y y y y | ||
188 | msp44x8g y y y y | ||
189 | */ | ||
190 | |||
191 | /* DSP inputs vs. msp version (tuner and SCART inputs are always available) */ | ||
192 | /* Chip I2S1 I2S2 I2S3 MAIN_AVC MAIN AUX | ||
193 | ------------------------------------------ | ||
194 | msp34x0b y n n n n n | ||
195 | msp34x0c y y n n n n | ||
196 | msp34x0d y y n n n n | ||
197 | msp34x5d y y n n n n | ||
198 | msp34x7d n n n n n n | ||
199 | msp34x0g y y n n n n | ||
200 | msp34x1g y y n n n n | ||
201 | msp34x2g y y n y y y | ||
202 | msp34x5g y y n n n n | ||
203 | msp34x7g n n n n n n | ||
204 | msp44x0g y y y y y y | ||
205 | msp44x8g y y y n n n | ||
206 | */ | ||
207 | |||
208 | /* DSP outputs vs. msp version */ | ||
209 | /* Chip MAIN AUX SCART1 SCART2 I2S | ||
210 | ------------------------------------ | ||
211 | msp34x0b y y y n y | ||
212 | msp34x0c y y y n y | ||
213 | msp34x0d y y y y y | ||
214 | msp34x5d y n y n y | ||
215 | msp34x7d y n y n n | ||
216 | msp34x0g y y y y y | ||
217 | msp34x1g y y y y y | ||
218 | msp34x2g y y y y y | ||
219 | msp34x5g y n y n y | ||
220 | msp34x7g y n y n n | ||
221 | msp44x0g y y y y y | ||
222 | msp44x8g y y y y y | ||
223 | */ | ||
224 | |||
225 | #endif /* MSP3400_H */ | ||
226 | |||
diff --git a/include/media/rds.h b/include/media/rds.h new file mode 100644 index 000000000000..951c1ae0be74 --- /dev/null +++ b/include/media/rds.h | |||
@@ -0,0 +1,44 @@ | |||
1 | /* | ||
2 | |||
3 | Types and defines needed for RDS. This is included by | ||
4 | saa6588.c and every driver (e.g. bttv-driver.c) that wants | ||
5 | to use the saa6588 module. | ||
6 | |||
7 | Instead of having a seperate rds.h, I'd prefer to include | ||
8 | this stuff in one of the already existing files like tuner.h | ||
9 | |||
10 | (c) 2005 by Hans J. Koch | ||
11 | |||
12 | This program is free software; you can redistribute it and/or modify | ||
13 | it under the terms of the GNU General Public License as published by | ||
14 | the Free Software Foundation; either version 2 of the License, or | ||
15 | (at your option) any later version. | ||
16 | |||
17 | This program is distributed in the hope that it will be useful, | ||
18 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
19 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
20 | GNU General Public License for more details. | ||
21 | |||
22 | You should have received a copy of the GNU General Public License | ||
23 | along with this program; if not, write to the Free Software | ||
24 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
25 | |||
26 | */ | ||
27 | |||
28 | #ifndef _RDS_H | ||
29 | #define _RDS_H | ||
30 | |||
31 | struct rds_command { | ||
32 | unsigned int block_count; | ||
33 | int result; | ||
34 | unsigned char __user *buffer; | ||
35 | struct file *instance; | ||
36 | poll_table *event_list; | ||
37 | }; | ||
38 | |||
39 | #define RDS_CMD_OPEN _IOW('R',1,int) | ||
40 | #define RDS_CMD_CLOSE _IOW('R',2,int) | ||
41 | #define RDS_CMD_READ _IOR('R',3,int) | ||
42 | #define RDS_CMD_POLL _IOR('R',4,int) | ||
43 | |||
44 | #endif | ||
diff --git a/include/media/saa7146_vv.h b/include/media/saa7146_vv.h index e5e749e984ee..4507cb61ae93 100644 --- a/include/media/saa7146_vv.h +++ b/include/media/saa7146_vv.h | |||
@@ -197,7 +197,8 @@ void saa7146_buffer_finish(struct saa7146_dev *dev, struct saa7146_dmaqueue *q, | |||
197 | void saa7146_buffer_next(struct saa7146_dev *dev, struct saa7146_dmaqueue *q,int vbi); | 197 | void saa7146_buffer_next(struct saa7146_dev *dev, struct saa7146_dmaqueue *q,int vbi); |
198 | int saa7146_buffer_queue(struct saa7146_dev *dev, struct saa7146_dmaqueue *q, struct saa7146_buf *buf); | 198 | int saa7146_buffer_queue(struct saa7146_dev *dev, struct saa7146_dmaqueue *q, struct saa7146_buf *buf); |
199 | void saa7146_buffer_timeout(unsigned long data); | 199 | void saa7146_buffer_timeout(unsigned long data); |
200 | void saa7146_dma_free(struct saa7146_dev *dev,struct saa7146_buf *buf); | 200 | void saa7146_dma_free(struct saa7146_dev* dev,struct videobuf_queue *q, |
201 | struct saa7146_buf *buf); | ||
201 | 202 | ||
202 | int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv); | 203 | int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv); |
203 | int saa7146_vv_release(struct saa7146_dev* dev); | 204 | int saa7146_vv_release(struct saa7146_dev* dev); |
diff --git a/include/media/tvaudio.h b/include/media/tvaudio.h new file mode 100644 index 000000000000..6915aafc875a --- /dev/null +++ b/include/media/tvaudio.h | |||
@@ -0,0 +1,30 @@ | |||
1 | /* | ||
2 | tvaudio.h - definition for tvaudio inputs | ||
3 | |||
4 | Copyright (C) 2006 Hans Verkuil (hverkuil@xs4all.nl) | ||
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 as published by | ||
8 | the Free Software Foundation; either version 2 of the License, or | ||
9 | (at your option) any later version. | ||
10 | |||
11 | This program is distributed in the hope that it will be useful, | ||
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | GNU General Public License for more details. | ||
15 | |||
16 | You should have received a copy of the GNU General Public License | ||
17 | along with this program; if not, write to the Free Software | ||
18 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | */ | ||
20 | |||
21 | #ifndef _TVAUDIO_H | ||
22 | #define _TVAUDIO_H | ||
23 | |||
24 | /* The tvaudio module accepts the following inputs: */ | ||
25 | #define TVAUDIO_INPUT_TUNER 0 | ||
26 | #define TVAUDIO_INPUT_RADIO 1 | ||
27 | #define TVAUDIO_INPUT_EXTERN 2 | ||
28 | #define TVAUDIO_INPUT_INTERN 3 | ||
29 | |||
30 | #endif | ||
diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h index 2360453e7496..642520acdfa7 100644 --- a/include/media/v4l2-common.h +++ b/include/media/v4l2-common.h | |||
@@ -123,17 +123,6 @@ enum v4l2_chip_ident { | |||
123 | /* v4l device was opened in Radio mode, to be replaced by VIDIOC_INT_S_TUNER_MODE */ | 123 | /* v4l device was opened in Radio mode, to be replaced by VIDIOC_INT_S_TUNER_MODE */ |
124 | #define AUDC_SET_RADIO _IO('d',88) | 124 | #define AUDC_SET_RADIO _IO('d',88) |
125 | 125 | ||
126 | /* select from TV,radio,extern,MUTE, to be replaced with VIDIOC_INT_S_AUDIO_ROUTING */ | ||
127 | #define AUDC_SET_INPUT _IOW('d',89,int) | ||
128 | |||
129 | /* msp3400 ioctl: will be removed in the near future, to be replaced by | ||
130 | VIDIOC_INT_S_AUDIO_ROUTING. */ | ||
131 | struct msp_matrix { | ||
132 | int input; | ||
133 | int output; | ||
134 | }; | ||
135 | #define MSP_SET_MATRIX _IOW('m',17,struct msp_matrix) | ||
136 | |||
137 | /* tuner ioctls */ | 126 | /* tuner ioctls */ |
138 | 127 | ||
139 | /* Sets tuner type and its I2C addr */ | 128 | /* Sets tuner type and its I2C addr */ |
@@ -209,10 +198,10 @@ struct v4l2_routing { | |||
209 | }; | 198 | }; |
210 | 199 | ||
211 | /* These internal commands should be used to define the inputs and outputs | 200 | /* These internal commands should be used to define the inputs and outputs |
212 | of an audio/video chip. They will replace AUDC_SET_INPUT. | 201 | of an audio/video chip. They will replace the v4l2 API commands |
213 | The v4l2 API commands VIDIOC_S/G_INPUT, VIDIOC_S/G_OUTPUT, | 202 | VIDIOC_S/G_INPUT, VIDIOC_S/G_OUTPUT, VIDIOC_S/G_AUDIO and VIDIOC_S/G_AUDOUT |
214 | VIDIOC_S/G_AUDIO and VIDIOC_S/G_AUDOUT are meant to be used by the | 203 | that are meant to be used by the user. |
215 | user. Internally these commands should be used to switch inputs/outputs | 204 | The internal commands should be used to switch inputs/outputs |
216 | because only the driver knows how to map a 'Television' input to the precise | 205 | because only the driver knows how to map a 'Television' input to the precise |
217 | input/output routing of an A/D converter, or a DSP, or a video digitizer. | 206 | input/output routing of an A/D converter, or a DSP, or a video digitizer. |
218 | These four commands should only be sent directly to an i2c device, they | 207 | These four commands should only be sent directly to an i2c device, they |
diff --git a/include/media/video-buf.h b/include/media/video-buf.h index d90dec5484ee..fff3fd0fbf94 100644 --- a/include/media/video-buf.h +++ b/include/media/video-buf.h | |||
@@ -1,15 +1,20 @@ | |||
1 | /* | 1 | /* |
2 | * | 2 | * |
3 | * generic helper functions for video4linux capture buffers, to handle | 3 | * generic helper functions for video4linux capture buffers, to handle |
4 | * memory management and PCI DMA. Right now bttv + saa7134 use it. | 4 | * memory management and PCI DMA. |
5 | * Right now, bttv, saa7134, saa7146 and cx88 use it. | ||
5 | * | 6 | * |
6 | * The functions expect the hardware being able to scatter gatter | 7 | * The functions expect the hardware being able to scatter gatter |
7 | * (i.e. the buffers are not linear in physical memory, but fragmented | 8 | * (i.e. the buffers are not linear in physical memory, but fragmented |
8 | * into PAGE_SIZE chunks). They also assume the driver does not need | 9 | * into PAGE_SIZE chunks). They also assume the driver does not need |
9 | * to touch the video data (thus it is probably not useful for USB as | 10 | * to touch the video data. |
10 | * data often must be uncompressed by the drivers). | 11 | * |
12 | * device specific map/unmap/sync stuff now are mapped as file operations | ||
13 | * to allow its usage by USB and virtual devices. | ||
11 | * | 14 | * |
12 | * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org> | 15 | * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org> |
16 | * (c) 2006 Mauro Carvalho Chehab, <mchehab@infradead.org> | ||
17 | * (c) 2006 Ted Walther and John Sokol | ||
13 | * | 18 | * |
14 | * This program is free software; you can redistribute it and/or modify | 19 | * This program is free software; you can redistribute it and/or modify |
15 | * it under the terms of the GNU General Public License as published by | 20 | * it under the terms of the GNU General Public License as published by |
@@ -38,6 +43,9 @@ struct scatterlist* videobuf_vmalloc_to_sg(unsigned char *virt, int nr_pages); | |||
38 | struct scatterlist* videobuf_pages_to_sg(struct page **pages, int nr_pages, | 43 | struct scatterlist* videobuf_pages_to_sg(struct page **pages, int nr_pages, |
39 | int offset); | 44 | int offset); |
40 | 45 | ||
46 | struct videobuf_buffer; | ||
47 | struct videobuf_queue; | ||
48 | |||
41 | /* --------------------------------------------------------------------- */ | 49 | /* --------------------------------------------------------------------- */ |
42 | 50 | ||
43 | /* | 51 | /* |
@@ -49,7 +57,7 @@ struct scatterlist* videobuf_pages_to_sg(struct page **pages, int nr_pages, | |||
49 | * pointer + length. The kernel version just wants the size and | 57 | * pointer + length. The kernel version just wants the size and |
50 | * does memory allocation too using vmalloc_32(). | 58 | * does memory allocation too using vmalloc_32(). |
51 | * | 59 | * |
52 | * videobuf_dma_pci_*() | 60 | * videobuf_dma_*() |
53 | * see Documentation/DMA-mapping.txt, these functions to | 61 | * see Documentation/DMA-mapping.txt, these functions to |
54 | * basically the same. The map function does also build a | 62 | * basically the same. The map function does also build a |
55 | * scatterlist for the buffer (and unmap frees it ...) | 63 | * scatterlist for the buffer (and unmap frees it ...) |
@@ -86,12 +94,18 @@ int videobuf_dma_init_kernel(struct videobuf_dmabuf *dma, int direction, | |||
86 | int nr_pages); | 94 | int nr_pages); |
87 | int videobuf_dma_init_overlay(struct videobuf_dmabuf *dma, int direction, | 95 | int videobuf_dma_init_overlay(struct videobuf_dmabuf *dma, int direction, |
88 | dma_addr_t addr, int nr_pages); | 96 | dma_addr_t addr, int nr_pages); |
89 | int videobuf_dma_pci_map(struct pci_dev *dev, struct videobuf_dmabuf *dma); | ||
90 | int videobuf_dma_pci_sync(struct pci_dev *dev, | ||
91 | struct videobuf_dmabuf *dma); | ||
92 | int videobuf_dma_pci_unmap(struct pci_dev *dev, struct videobuf_dmabuf *dma); | ||
93 | int videobuf_dma_free(struct videobuf_dmabuf *dma); | 97 | int videobuf_dma_free(struct videobuf_dmabuf *dma); |
94 | 98 | ||
99 | int videobuf_dma_map(struct videobuf_queue* q,struct videobuf_dmabuf *dma); | ||
100 | int videobuf_dma_sync(struct videobuf_queue* q,struct videobuf_dmabuf *dma); | ||
101 | int videobuf_dma_unmap(struct videobuf_queue* q,struct videobuf_dmabuf *dma); | ||
102 | |||
103 | /*FIXME: these variants are used only on *-alsa code, where videobuf is | ||
104 | * used without queue | ||
105 | */ | ||
106 | int videobuf_pci_dma_map(struct pci_dev *pci,struct videobuf_dmabuf *dma); | ||
107 | int videobuf_pci_dma_unmap(struct pci_dev *pci,struct videobuf_dmabuf *dma); | ||
108 | |||
95 | /* --------------------------------------------------------------------- */ | 109 | /* --------------------------------------------------------------------- */ |
96 | 110 | ||
97 | /* | 111 | /* |
@@ -115,9 +129,6 @@ int videobuf_dma_free(struct videobuf_dmabuf *dma); | |||
115 | * | 129 | * |
116 | */ | 130 | */ |
117 | 131 | ||
118 | struct videobuf_buffer; | ||
119 | struct videobuf_queue; | ||
120 | |||
121 | struct videobuf_mapping { | 132 | struct videobuf_mapping { |
122 | unsigned int count; | 133 | unsigned int count; |
123 | unsigned long start; | 134 | unsigned long start; |
@@ -164,6 +175,10 @@ struct videobuf_buffer { | |||
164 | struct timeval ts; | 175 | struct timeval ts; |
165 | }; | 176 | }; |
166 | 177 | ||
178 | typedef int (vb_map_sg_t)(void *dev,struct scatterlist *sglist,int nr_pages, | ||
179 | int direction); | ||
180 | |||
181 | |||
167 | struct videobuf_queue_ops { | 182 | struct videobuf_queue_ops { |
168 | int (*buf_setup)(struct videobuf_queue *q, | 183 | int (*buf_setup)(struct videobuf_queue *q, |
169 | unsigned int *count, unsigned int *size); | 184 | unsigned int *count, unsigned int *size); |
@@ -174,12 +189,20 @@ struct videobuf_queue_ops { | |||
174 | struct videobuf_buffer *vb); | 189 | struct videobuf_buffer *vb); |
175 | void (*buf_release)(struct videobuf_queue *q, | 190 | void (*buf_release)(struct videobuf_queue *q, |
176 | struct videobuf_buffer *vb); | 191 | struct videobuf_buffer *vb); |
192 | |||
193 | /* Helper operations - device dependent. | ||
194 | * If null, videobuf_init defaults all to PCI handling | ||
195 | */ | ||
196 | |||
197 | vb_map_sg_t *vb_map_sg; | ||
198 | vb_map_sg_t *vb_dma_sync_sg; | ||
199 | vb_map_sg_t *vb_unmap_sg; | ||
177 | }; | 200 | }; |
178 | 201 | ||
179 | struct videobuf_queue { | 202 | struct videobuf_queue { |
180 | struct mutex lock; | 203 | struct mutex lock; |
181 | spinlock_t *irqlock; | 204 | spinlock_t *irqlock; |
182 | struct pci_dev *pci; | 205 | void *dev; /* on pci, points to struct pci_dev */ |
183 | 206 | ||
184 | enum v4l2_buf_type type; | 207 | enum v4l2_buf_type type; |
185 | unsigned int inputs; /* for V4L2_BUF_FLAG_INPUT */ | 208 | unsigned int inputs; /* for V4L2_BUF_FLAG_INPUT */ |
@@ -204,12 +227,15 @@ struct videobuf_queue { | |||
204 | 227 | ||
205 | void* videobuf_alloc(unsigned int size); | 228 | void* videobuf_alloc(unsigned int size); |
206 | int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr); | 229 | int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr); |
207 | int videobuf_iolock(struct pci_dev *pci, struct videobuf_buffer *vb, | 230 | int videobuf_iolock(struct videobuf_queue* q, struct videobuf_buffer *vb, |
208 | struct v4l2_framebuffer *fbuf); | 231 | struct v4l2_framebuffer *fbuf); |
232 | |||
233 | /* Maps fops to PCI stuff */ | ||
234 | void videobuf_queue_pci(struct videobuf_queue* q); | ||
209 | 235 | ||
210 | void videobuf_queue_init(struct videobuf_queue *q, | 236 | void videobuf_queue_init(struct videobuf_queue *q, |
211 | struct videobuf_queue_ops *ops, | 237 | struct videobuf_queue_ops *ops, |
212 | struct pci_dev *pci, | 238 | void *dev, |
213 | spinlock_t *irqlock, | 239 | spinlock_t *irqlock, |
214 | enum v4l2_buf_type type, | 240 | enum v4l2_buf_type type, |
215 | enum v4l2_field field, | 241 | enum v4l2_field field, |
diff --git a/include/media/wm8775.h b/include/media/wm8775.h new file mode 100644 index 000000000000..60739c5a23ae --- /dev/null +++ b/include/media/wm8775.h | |||
@@ -0,0 +1,35 @@ | |||
1 | /* | ||
2 | wm8775.h - definition for wm8775 inputs and outputs | ||
3 | |||
4 | Copyright (C) 2006 Hans Verkuil (hverkuil@xs4all.nl) | ||
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 as published by | ||
8 | the Free Software Foundation; either version 2 of the License, or | ||
9 | (at your option) any later version. | ||
10 | |||
11 | This program is distributed in the hope that it will be useful, | ||
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | GNU General Public License for more details. | ||
15 | |||
16 | You should have received a copy of the GNU General Public License | ||
17 | along with this program; if not, write to the Free Software | ||
18 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | */ | ||
20 | |||
21 | #ifndef _WM8775_H_ | ||
22 | #define _WM8775_H_ | ||
23 | |||
24 | /* The WM8775 has 4 inputs and one output. Zero or more inputs | ||
25 | are multiplexed together to the output. Hence there are | ||
26 | 16 combinations. | ||
27 | If only one input is active (the normal case) then the | ||
28 | input values 1, 2, 4 or 8 should be used. */ | ||
29 | |||
30 | #define WM8775_AIN1 1 | ||
31 | #define WM8775_AIN2 2 | ||
32 | #define WM8775_AIN3 4 | ||
33 | #define WM8775_AIN4 8 | ||
34 | |||
35 | #endif | ||
diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h index b6f0905a4ee2..916013ca4a5c 100644 --- a/include/net/netfilter/nf_conntrack.h +++ b/include/net/netfilter/nf_conntrack.h | |||
@@ -300,29 +300,30 @@ DECLARE_PER_CPU(struct nf_conntrack_ecache, nf_conntrack_ecache); | |||
300 | 300 | ||
301 | #define CONNTRACK_ECACHE(x) (__get_cpu_var(nf_conntrack_ecache).x) | 301 | #define CONNTRACK_ECACHE(x) (__get_cpu_var(nf_conntrack_ecache).x) |
302 | 302 | ||
303 | extern struct notifier_block *nf_conntrack_chain; | 303 | extern struct atomic_notifier_head nf_conntrack_chain; |
304 | extern struct notifier_block *nf_conntrack_expect_chain; | 304 | extern struct atomic_notifier_head nf_conntrack_expect_chain; |
305 | 305 | ||
306 | static inline int nf_conntrack_register_notifier(struct notifier_block *nb) | 306 | static inline int nf_conntrack_register_notifier(struct notifier_block *nb) |
307 | { | 307 | { |
308 | return notifier_chain_register(&nf_conntrack_chain, nb); | 308 | return atomic_notifier_chain_register(&nf_conntrack_chain, nb); |
309 | } | 309 | } |
310 | 310 | ||
311 | static inline int nf_conntrack_unregister_notifier(struct notifier_block *nb) | 311 | static inline int nf_conntrack_unregister_notifier(struct notifier_block *nb) |
312 | { | 312 | { |
313 | return notifier_chain_unregister(&nf_conntrack_chain, nb); | 313 | return atomic_notifier_chain_unregister(&nf_conntrack_chain, nb); |
314 | } | 314 | } |
315 | 315 | ||
316 | static inline int | 316 | static inline int |
317 | nf_conntrack_expect_register_notifier(struct notifier_block *nb) | 317 | nf_conntrack_expect_register_notifier(struct notifier_block *nb) |
318 | { | 318 | { |
319 | return notifier_chain_register(&nf_conntrack_expect_chain, nb); | 319 | return atomic_notifier_chain_register(&nf_conntrack_expect_chain, nb); |
320 | } | 320 | } |
321 | 321 | ||
322 | static inline int | 322 | static inline int |
323 | nf_conntrack_expect_unregister_notifier(struct notifier_block *nb) | 323 | nf_conntrack_expect_unregister_notifier(struct notifier_block *nb) |
324 | { | 324 | { |
325 | return notifier_chain_unregister(&nf_conntrack_expect_chain, nb); | 325 | return atomic_notifier_chain_unregister(&nf_conntrack_expect_chain, |
326 | nb); | ||
326 | } | 327 | } |
327 | 328 | ||
328 | extern void nf_ct_deliver_cached_events(const struct nf_conn *ct); | 329 | extern void nf_ct_deliver_cached_events(const struct nf_conn *ct); |
@@ -347,14 +348,14 @@ static inline void nf_conntrack_event(enum ip_conntrack_events event, | |||
347 | struct nf_conn *ct) | 348 | struct nf_conn *ct) |
348 | { | 349 | { |
349 | if (nf_ct_is_confirmed(ct) && !nf_ct_is_dying(ct)) | 350 | if (nf_ct_is_confirmed(ct) && !nf_ct_is_dying(ct)) |
350 | notifier_call_chain(&nf_conntrack_chain, event, ct); | 351 | atomic_notifier_call_chain(&nf_conntrack_chain, event, ct); |
351 | } | 352 | } |
352 | 353 | ||
353 | static inline void | 354 | static inline void |
354 | nf_conntrack_expect_event(enum ip_conntrack_expect_events event, | 355 | nf_conntrack_expect_event(enum ip_conntrack_expect_events event, |
355 | struct nf_conntrack_expect *exp) | 356 | struct nf_conntrack_expect *exp) |
356 | { | 357 | { |
357 | notifier_call_chain(&nf_conntrack_expect_chain, event, exp); | 358 | atomic_notifier_call_chain(&nf_conntrack_expect_chain, event, exp); |
358 | } | 359 | } |
359 | #else /* CONFIG_NF_CONNTRACK_EVENTS */ | 360 | #else /* CONFIG_NF_CONNTRACK_EVENTS */ |
360 | static inline void nf_conntrack_event_cache(enum ip_conntrack_events event, | 361 | static inline void nf_conntrack_event_cache(enum ip_conntrack_events event, |
diff --git a/include/net/request_sock.h b/include/net/request_sock.h index 11641c9384f7..c5d7f920c352 100644 --- a/include/net/request_sock.h +++ b/include/net/request_sock.h | |||
@@ -145,7 +145,7 @@ static inline struct request_sock * | |||
145 | { | 145 | { |
146 | struct request_sock *req = queue->rskq_accept_head; | 146 | struct request_sock *req = queue->rskq_accept_head; |
147 | 147 | ||
148 | queue->rskq_accept_head = queue->rskq_accept_head = NULL; | 148 | queue->rskq_accept_head = NULL; |
149 | return req; | 149 | return req; |
150 | } | 150 | } |
151 | 151 | ||
diff --git a/include/net/route.h b/include/net/route.h index 9c04f15090d2..98c915abdec8 100644 --- a/include/net/route.h +++ b/include/net/route.h | |||
@@ -110,7 +110,7 @@ extern struct ip_rt_acct *ip_rt_acct; | |||
110 | struct in_device; | 110 | struct in_device; |
111 | extern int ip_rt_init(void); | 111 | extern int ip_rt_init(void); |
112 | extern void ip_rt_redirect(u32 old_gw, u32 dst, u32 new_gw, | 112 | extern void ip_rt_redirect(u32 old_gw, u32 dst, u32 new_gw, |
113 | u32 src, u8 tos, struct net_device *dev); | 113 | u32 src, struct net_device *dev); |
114 | extern void ip_rt_advice(struct rtable **rp, int advice); | 114 | extern void ip_rt_advice(struct rtable **rp, int advice); |
115 | extern void rt_cache_flush(int how); | 115 | extern void rt_cache_flush(int how); |
116 | extern int __ip_route_output_key(struct rtable **, const struct flowi *flp); | 116 | extern int __ip_route_output_key(struct rtable **, const struct flowi *flp); |
diff --git a/include/net/sock.h b/include/net/sock.h index ec226f31dc2a..af2b0544586e 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -210,6 +210,7 @@ struct sock { | |||
210 | gfp_t sk_allocation; | 210 | gfp_t sk_allocation; |
211 | int sk_sndbuf; | 211 | int sk_sndbuf; |
212 | int sk_route_caps; | 212 | int sk_route_caps; |
213 | int sk_rcvlowat; | ||
213 | unsigned long sk_flags; | 214 | unsigned long sk_flags; |
214 | unsigned long sk_lingertime; | 215 | unsigned long sk_lingertime; |
215 | /* | 216 | /* |
@@ -230,7 +231,6 @@ struct sock { | |||
230 | unsigned short sk_max_ack_backlog; | 231 | unsigned short sk_max_ack_backlog; |
231 | __u32 sk_priority; | 232 | __u32 sk_priority; |
232 | struct ucred sk_peercred; | 233 | struct ucred sk_peercred; |
233 | int sk_rcvlowat; | ||
234 | long sk_rcvtimeo; | 234 | long sk_rcvtimeo; |
235 | long sk_sndtimeo; | 235 | long sk_sndtimeo; |
236 | struct sk_filter *sk_filter; | 236 | struct sk_filter *sk_filter; |
@@ -938,28 +938,7 @@ static inline void sock_put(struct sock *sk) | |||
938 | sk_free(sk); | 938 | sk_free(sk); |
939 | } | 939 | } |
940 | 940 | ||
941 | static inline int sk_receive_skb(struct sock *sk, struct sk_buff *skb) | 941 | extern int sk_receive_skb(struct sock *sk, struct sk_buff *skb); |
942 | { | ||
943 | int rc = NET_RX_SUCCESS; | ||
944 | |||
945 | if (sk_filter(sk, skb, 0)) | ||
946 | goto discard_and_relse; | ||
947 | |||
948 | skb->dev = NULL; | ||
949 | |||
950 | bh_lock_sock(sk); | ||
951 | if (!sock_owned_by_user(sk)) | ||
952 | rc = sk->sk_backlog_rcv(sk, skb); | ||
953 | else | ||
954 | sk_add_backlog(sk, skb); | ||
955 | bh_unlock_sock(sk); | ||
956 | out: | ||
957 | sock_put(sk); | ||
958 | return rc; | ||
959 | discard_and_relse: | ||
960 | kfree_skb(skb); | ||
961 | goto out; | ||
962 | } | ||
963 | 942 | ||
964 | /* Detach socket from process context. | 943 | /* Detach socket from process context. |
965 | * Announce socket dead, detach it from wait queue and inode. | 944 | * Announce socket dead, detach it from wait queue and inode. |
@@ -1044,33 +1023,9 @@ sk_dst_reset(struct sock *sk) | |||
1044 | write_unlock(&sk->sk_dst_lock); | 1023 | write_unlock(&sk->sk_dst_lock); |
1045 | } | 1024 | } |
1046 | 1025 | ||
1047 | static inline struct dst_entry * | 1026 | extern struct dst_entry *__sk_dst_check(struct sock *sk, u32 cookie); |
1048 | __sk_dst_check(struct sock *sk, u32 cookie) | ||
1049 | { | ||
1050 | struct dst_entry *dst = sk->sk_dst_cache; | ||
1051 | 1027 | ||
1052 | if (dst && dst->obsolete && dst->ops->check(dst, cookie) == NULL) { | 1028 | extern struct dst_entry *sk_dst_check(struct sock *sk, u32 cookie); |
1053 | sk->sk_dst_cache = NULL; | ||
1054 | dst_release(dst); | ||
1055 | return NULL; | ||
1056 | } | ||
1057 | |||
1058 | return dst; | ||
1059 | } | ||
1060 | |||
1061 | static inline struct dst_entry * | ||
1062 | sk_dst_check(struct sock *sk, u32 cookie) | ||
1063 | { | ||
1064 | struct dst_entry *dst = sk_dst_get(sk); | ||
1065 | |||
1066 | if (dst && dst->obsolete && dst->ops->check(dst, cookie) == NULL) { | ||
1067 | sk_dst_reset(sk); | ||
1068 | dst_release(dst); | ||
1069 | return NULL; | ||
1070 | } | ||
1071 | |||
1072 | return dst; | ||
1073 | } | ||
1074 | 1029 | ||
1075 | static inline void sk_setup_caps(struct sock *sk, struct dst_entry *dst) | 1030 | static inline void sk_setup_caps(struct sock *sk, struct dst_entry *dst) |
1076 | { | 1031 | { |
@@ -1140,45 +1095,7 @@ extern void sk_reset_timer(struct sock *sk, struct timer_list* timer, | |||
1140 | 1095 | ||
1141 | extern void sk_stop_timer(struct sock *sk, struct timer_list* timer); | 1096 | extern void sk_stop_timer(struct sock *sk, struct timer_list* timer); |
1142 | 1097 | ||
1143 | static inline int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | 1098 | extern int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb); |
1144 | { | ||
1145 | int err = 0; | ||
1146 | int skb_len; | ||
1147 | |||
1148 | /* Cast skb->rcvbuf to unsigned... It's pointless, but reduces | ||
1149 | number of warnings when compiling with -W --ANK | ||
1150 | */ | ||
1151 | if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >= | ||
1152 | (unsigned)sk->sk_rcvbuf) { | ||
1153 | err = -ENOMEM; | ||
1154 | goto out; | ||
1155 | } | ||
1156 | |||
1157 | /* It would be deadlock, if sock_queue_rcv_skb is used | ||
1158 | with socket lock! We assume that users of this | ||
1159 | function are lock free. | ||
1160 | */ | ||
1161 | err = sk_filter(sk, skb, 1); | ||
1162 | if (err) | ||
1163 | goto out; | ||
1164 | |||
1165 | skb->dev = NULL; | ||
1166 | skb_set_owner_r(skb, sk); | ||
1167 | |||
1168 | /* Cache the SKB length before we tack it onto the receive | ||
1169 | * queue. Once it is added it no longer belongs to us and | ||
1170 | * may be freed by other threads of control pulling packets | ||
1171 | * from the queue. | ||
1172 | */ | ||
1173 | skb_len = skb->len; | ||
1174 | |||
1175 | skb_queue_tail(&sk->sk_receive_queue, skb); | ||
1176 | |||
1177 | if (!sock_flag(sk, SOCK_DEAD)) | ||
1178 | sk->sk_data_ready(sk, skb_len); | ||
1179 | out: | ||
1180 | return err; | ||
1181 | } | ||
1182 | 1099 | ||
1183 | static inline int sock_queue_err_skb(struct sock *sk, struct sk_buff *skb) | 1100 | static inline int sock_queue_err_skb(struct sock *sk, struct sk_buff *skb) |
1184 | { | 1101 | { |
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 61b7504fc2ba..e100291e43f4 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
@@ -864,13 +864,19 @@ struct xfrm_algo_desc { | |||
864 | /* XFRM tunnel handlers. */ | 864 | /* XFRM tunnel handlers. */ |
865 | struct xfrm_tunnel { | 865 | struct xfrm_tunnel { |
866 | int (*handler)(struct sk_buff *skb); | 866 | int (*handler)(struct sk_buff *skb); |
867 | void (*err_handler)(struct sk_buff *skb, __u32 info); | 867 | int (*err_handler)(struct sk_buff *skb, __u32 info); |
868 | |||
869 | struct xfrm_tunnel *next; | ||
870 | int priority; | ||
868 | }; | 871 | }; |
869 | 872 | ||
870 | struct xfrm6_tunnel { | 873 | struct xfrm6_tunnel { |
871 | int (*handler)(struct sk_buff **pskb); | 874 | int (*handler)(struct sk_buff *skb); |
872 | void (*err_handler)(struct sk_buff *skb, struct inet6_skb_parm *opt, | 875 | int (*err_handler)(struct sk_buff *skb, struct inet6_skb_parm *opt, |
873 | int type, int code, int offset, __u32 info); | 876 | int type, int code, int offset, __u32 info); |
877 | |||
878 | struct xfrm6_tunnel *next; | ||
879 | int priority; | ||
874 | }; | 880 | }; |
875 | 881 | ||
876 | extern void xfrm_init(void); | 882 | extern void xfrm_init(void); |
@@ -906,7 +912,7 @@ extern int xfrm4_rcv(struct sk_buff *skb); | |||
906 | extern int xfrm4_output(struct sk_buff *skb); | 912 | extern int xfrm4_output(struct sk_buff *skb); |
907 | extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler); | 913 | extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler); |
908 | extern int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler); | 914 | extern int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler); |
909 | extern int xfrm6_rcv_spi(struct sk_buff **pskb, u32 spi); | 915 | extern int xfrm6_rcv_spi(struct sk_buff *skb, u32 spi); |
910 | extern int xfrm6_rcv(struct sk_buff **pskb); | 916 | extern int xfrm6_rcv(struct sk_buff **pskb); |
911 | extern int xfrm6_tunnel_register(struct xfrm6_tunnel *handler); | 917 | extern int xfrm6_tunnel_register(struct xfrm6_tunnel *handler); |
912 | extern int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler); | 918 | extern int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler); |
diff --git a/include/sound/core.h b/include/sound/core.h index 144bdc2f217f..7f32c12b4a0a 100644 --- a/include/sound/core.h +++ b/include/sound/core.h | |||
@@ -186,7 +186,7 @@ struct snd_minor { | |||
186 | int type; /* SNDRV_DEVICE_TYPE_XXX */ | 186 | int type; /* SNDRV_DEVICE_TYPE_XXX */ |
187 | int card; /* card number */ | 187 | int card; /* card number */ |
188 | int device; /* device number */ | 188 | int device; /* device number */ |
189 | struct file_operations *f_ops; /* file operations */ | 189 | const struct file_operations *f_ops; /* file operations */ |
190 | void *private_data; /* private data for f_ops->open */ | 190 | void *private_data; /* private data for f_ops->open */ |
191 | char name[0]; /* device name (keep at the end of | 191 | char name[0]; /* device name (keep at the end of |
192 | structure) */ | 192 | structure) */ |
@@ -200,14 +200,14 @@ extern int snd_ecards_limit; | |||
200 | void snd_request_card(int card); | 200 | void snd_request_card(int card); |
201 | 201 | ||
202 | int snd_register_device(int type, struct snd_card *card, int dev, | 202 | int snd_register_device(int type, struct snd_card *card, int dev, |
203 | struct file_operations *f_ops, void *private_data, | 203 | const struct file_operations *f_ops, void *private_data, |
204 | const char *name); | 204 | const char *name); |
205 | int snd_unregister_device(int type, struct snd_card *card, int dev); | 205 | int snd_unregister_device(int type, struct snd_card *card, int dev); |
206 | void *snd_lookup_minor_data(unsigned int minor, int type); | 206 | void *snd_lookup_minor_data(unsigned int minor, int type); |
207 | 207 | ||
208 | #ifdef CONFIG_SND_OSSEMUL | 208 | #ifdef CONFIG_SND_OSSEMUL |
209 | int snd_register_oss_device(int type, struct snd_card *card, int dev, | 209 | int snd_register_oss_device(int type, struct snd_card *card, int dev, |
210 | struct file_operations *f_ops, void *private_data, | 210 | const struct file_operations *f_ops, void *private_data, |
211 | const char *name); | 211 | const char *name); |
212 | int snd_unregister_oss_device(int type, struct snd_card *card, int dev); | 212 | int snd_unregister_oss_device(int type, struct snd_card *card, int dev); |
213 | void *snd_lookup_oss_minor_data(unsigned int minor, int type); | 213 | void *snd_lookup_oss_minor_data(unsigned int minor, int type); |
diff --git a/include/video/pm3fb.h b/include/video/pm3fb.h index 6f4ea808cf74..ac021379ac40 100644 --- a/include/video/pm3fb.h +++ b/include/video/pm3fb.h | |||
@@ -1128,10 +1128,7 @@ | |||
1128 | #endif | 1128 | #endif |
1129 | 1129 | ||
1130 | /* max number of simultaneous board */ | 1130 | /* max number of simultaneous board */ |
1131 | /* warning : make sure module array def's are coherent with PM3_MAX_BOARD */ | ||
1132 | #define PM3_MAX_BOARD 4 | 1131 | #define PM3_MAX_BOARD 4 |
1133 | #define PM3_MAX_BOARD_MODULE_ARRAY_SHORT "1-4h" | ||
1134 | #define PM3_MAX_BOARD_MODULE_ARRAY_STRING "1-4s" | ||
1135 | 1132 | ||
1136 | /* max size of options */ | 1133 | /* max size of options */ |
1137 | #define PM3_OPTIONS_SIZE 256 | 1134 | #define PM3_OPTIONS_SIZE 256 |