diff options
Diffstat (limited to 'include')
72 files changed, 1030 insertions, 907 deletions
diff --git a/include/asm-alpha/unistd.h b/include/asm-alpha/unistd.h index 84313d14e780..e58a427012dd 100644 --- a/include/asm-alpha/unistd.h +++ b/include/asm-alpha/unistd.h | |||
| @@ -342,9 +342,14 @@ | |||
| 342 | #define __NR_io_cancel 402 | 342 | #define __NR_io_cancel 402 |
| 343 | #define __NR_exit_group 405 | 343 | #define __NR_exit_group 405 |
| 344 | #define __NR_lookup_dcookie 406 | 344 | #define __NR_lookup_dcookie 406 |
| 345 | #define __NR_sys_epoll_create 407 | 345 | #define __NR_epoll_create 407 |
| 346 | #define __NR_sys_epoll_ctl 408 | 346 | #define __NR_epoll_ctl 408 |
| 347 | #define __NR_sys_epoll_wait 409 | 347 | #define __NR_epoll_wait 409 |
| 348 | /* Feb 2007: These three sys_epoll defines shouldn't be here but culling | ||
| 349 | * them would break userspace apps ... we'll kill them off in 2010 :) */ | ||
| 350 | #define __NR_sys_epoll_create __NR_epoll_create | ||
| 351 | #define __NR_sys_epoll_ctl __NR_epoll_ctl | ||
| 352 | #define __NR_sys_epoll_wait __NR_epoll_wait | ||
| 348 | #define __NR_remap_file_pages 410 | 353 | #define __NR_remap_file_pages 410 |
| 349 | #define __NR_set_tid_address 411 | 354 | #define __NR_set_tid_address 411 |
| 350 | #define __NR_restart_syscall 412 | 355 | #define __NR_restart_syscall 412 |
diff --git a/include/asm-frv/Kbuild b/include/asm-frv/Kbuild index c68e1680da01..966a9836d556 100644 --- a/include/asm-frv/Kbuild +++ b/include/asm-frv/Kbuild | |||
| @@ -1 +1,7 @@ | |||
| 1 | include include/asm-generic/Kbuild.asm | 1 | include include/asm-generic/Kbuild.asm |
| 2 | |||
| 3 | header-y += registers.h | ||
| 4 | |||
| 5 | unifdef-y += termios.h | ||
| 6 | unifdef-y += ptrace.h | ||
| 7 | unifdef-y += page.h | ||
diff --git a/include/asm-frv/page.h b/include/asm-frv/page.h index 134cc0cdf6c2..213d92fd652a 100644 --- a/include/asm-frv/page.h +++ b/include/asm-frv/page.h | |||
| @@ -76,8 +76,6 @@ extern unsigned long max_pfn; | |||
| 76 | 76 | ||
| 77 | #endif /* __ASSEMBLY__ */ | 77 | #endif /* __ASSEMBLY__ */ |
| 78 | 78 | ||
| 79 | #endif /* __KERNEL__ */ | ||
| 80 | |||
| 81 | #ifdef CONFIG_CONTIGUOUS_PAGE_ALLOC | 79 | #ifdef CONFIG_CONTIGUOUS_PAGE_ALLOC |
| 82 | #define WANT_PAGE_VIRTUAL 1 | 80 | #define WANT_PAGE_VIRTUAL 1 |
| 83 | #endif | 81 | #endif |
| @@ -85,4 +83,6 @@ extern unsigned long max_pfn; | |||
| 85 | #include <asm-generic/memory_model.h> | 83 | #include <asm-generic/memory_model.h> |
| 86 | #include <asm-generic/page.h> | 84 | #include <asm-generic/page.h> |
| 87 | 85 | ||
| 86 | #endif /* __KERNEL__ */ | ||
| 87 | |||
| 88 | #endif /* _ASM_PAGE_H */ | 88 | #endif /* _ASM_PAGE_H */ |
diff --git a/include/asm-frv/ptrace.h b/include/asm-frv/ptrace.h index 9a2241b8eb1e..cf6934012b64 100644 --- a/include/asm-frv/ptrace.h +++ b/include/asm-frv/ptrace.h | |||
| @@ -12,9 +12,11 @@ | |||
| 12 | #define _ASM_PTRACE_H | 12 | #define _ASM_PTRACE_H |
| 13 | 13 | ||
| 14 | #include <asm/registers.h> | 14 | #include <asm/registers.h> |
| 15 | #ifdef __KERNEL__ | ||
| 15 | #include <asm/irq_regs.h> | 16 | #include <asm/irq_regs.h> |
| 16 | 17 | ||
| 17 | #define in_syscall(regs) (((regs)->tbr & TBR_TT) == TBR_TT_TRAP0) | 18 | #define in_syscall(regs) (((regs)->tbr & TBR_TT) == TBR_TT_TRAP0) |
| 19 | #endif | ||
| 18 | 20 | ||
| 19 | 21 | ||
| 20 | #define PT_PSR 0 | 22 | #define PT_PSR 0 |
| @@ -60,6 +62,7 @@ | |||
| 60 | #define PTRACE_GETFDPIC_EXEC 0 /* [addr] request the executable loadmap */ | 62 | #define PTRACE_GETFDPIC_EXEC 0 /* [addr] request the executable loadmap */ |
| 61 | #define PTRACE_GETFDPIC_INTERP 1 /* [addr] request the interpreter loadmap */ | 63 | #define PTRACE_GETFDPIC_INTERP 1 /* [addr] request the interpreter loadmap */ |
| 62 | 64 | ||
| 65 | #ifdef __KERNEL__ | ||
| 63 | #ifndef __ASSEMBLY__ | 66 | #ifndef __ASSEMBLY__ |
| 64 | 67 | ||
| 65 | /* | 68 | /* |
| @@ -74,6 +77,7 @@ register struct pt_regs *__frame asm("gr28"); | |||
| 74 | extern unsigned long user_stack(const struct pt_regs *); | 77 | extern unsigned long user_stack(const struct pt_regs *); |
| 75 | extern void show_regs(struct pt_regs *); | 78 | extern void show_regs(struct pt_regs *); |
| 76 | #define profile_pc(regs) ((regs)->pc) | 79 | #define profile_pc(regs) ((regs)->pc) |
| 80 | #endif | ||
| 77 | 81 | ||
| 78 | #endif /* !__ASSEMBLY__ */ | 82 | #endif /* !__ASSEMBLY__ */ |
| 79 | #endif /* _ASM_PTRACE_H */ | 83 | #endif /* _ASM_PTRACE_H */ |
diff --git a/include/asm-frv/termios.h b/include/asm-frv/termios.h index b4a664e7f55c..8840cf95e8dd 100644 --- a/include/asm-frv/termios.h +++ b/include/asm-frv/termios.h | |||
| @@ -69,6 +69,8 @@ struct termio { | |||
| 69 | #define N_SYNC_PPP 14 | 69 | #define N_SYNC_PPP 14 |
| 70 | #define N_HCI 15 /* Bluetooth HCI UART */ | 70 | #define N_HCI 15 /* Bluetooth HCI UART */ |
| 71 | 71 | ||
| 72 | #ifdef __KERNEL__ | ||
| 72 | #include <asm-generic/termios.h> | 73 | #include <asm-generic/termios.h> |
| 74 | #endif | ||
| 73 | 75 | ||
| 74 | #endif /* _ASM_TERMIOS_H */ | 76 | #endif /* _ASM_TERMIOS_H */ |
diff --git a/include/asm-mips/bootinfo.h b/include/asm-mips/bootinfo.h index 8e321f53a382..c7c945baf1ee 100644 --- a/include/asm-mips/bootinfo.h +++ b/include/asm-mips/bootinfo.h | |||
| @@ -243,6 +243,10 @@ extern struct boot_mem_map boot_mem_map; | |||
| 243 | extern void add_memory_region(phys_t start, phys_t size, long type); | 243 | extern void add_memory_region(phys_t start, phys_t size, long type); |
| 244 | 244 | ||
| 245 | extern void prom_init(void); | 245 | extern void prom_init(void); |
| 246 | extern void prom_free_prom_memory(void); | ||
| 247 | |||
| 248 | extern void free_init_pages(const char *what, | ||
| 249 | unsigned long begin, unsigned long end); | ||
| 246 | 250 | ||
| 247 | /* | 251 | /* |
| 248 | * Initial kernel command line, usually setup by prom_init() | 252 | * Initial kernel command line, usually setup by prom_init() |
diff --git a/include/asm-mips/ddb5xxx/ddb5477.h b/include/asm-mips/ddb5xxx/ddb5477.h index c5af4b73fdd7..6cf177caf6d5 100644 --- a/include/asm-mips/ddb5xxx/ddb5477.h +++ b/include/asm-mips/ddb5xxx/ddb5477.h | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #ifndef __ASM_DDB5XXX_DDB5477_H | 17 | #ifndef __ASM_DDB5XXX_DDB5477_H |
| 18 | #define __ASM_DDB5XXX_DDB5477_H | 18 | #define __ASM_DDB5XXX_DDB5477_H |
| 19 | 19 | ||
| 20 | #include <irq.h> | ||
| 20 | 21 | ||
| 21 | /* | 22 | /* |
| 22 | * This contains macros that are specific to DDB5477 or renamed from | 23 | * This contains macros that are specific to DDB5477 or renamed from |
| @@ -251,14 +252,10 @@ extern void ll_vrc5477_irq_disable(int vrc5477_irq); | |||
| 251 | */ | 252 | */ |
| 252 | 253 | ||
| 253 | #define NUM_CPU_IRQ 8 | 254 | #define NUM_CPU_IRQ 8 |
| 254 | #define NUM_I8259_IRQ 16 | ||
| 255 | #define NUM_VRC5477_IRQ 32 | 255 | #define NUM_VRC5477_IRQ 32 |
| 256 | 256 | ||
| 257 | #define DDB_IRQ_BASE 0 | 257 | #define CPU_IRQ_BASE MIPS_CPU_IRQ_BASE |
| 258 | 258 | #define VRC5477_IRQ_BASE (CPU_IRQ_BASE + NUM_CPU_IRQ) | |
| 259 | #define I8259_IRQ_BASE DDB_IRQ_BASE | ||
| 260 | #define VRC5477_IRQ_BASE (I8259_IRQ_BASE + NUM_I8259_IRQ) | ||
| 261 | #define CPU_IRQ_BASE (VRC5477_IRQ_BASE + NUM_VRC5477_IRQ) | ||
| 262 | 259 | ||
| 263 | /* | 260 | /* |
| 264 | * vrc5477 irq defs | 261 | * vrc5477 irq defs |
| @@ -300,22 +297,22 @@ extern void ll_vrc5477_irq_disable(int vrc5477_irq); | |||
| 300 | /* | 297 | /* |
| 301 | * i2859 irq assignment | 298 | * i2859 irq assignment |
| 302 | */ | 299 | */ |
| 303 | #define I8259_IRQ_RESERVED_0 (0 + I8259_IRQ_BASE) | 300 | #define I8259_IRQ_RESERVED_0 (0 + I8259A_IRQ_BASE) |
| 304 | #define I8259_IRQ_KEYBOARD (1 + I8259_IRQ_BASE) /* M1543 default */ | 301 | #define I8259_IRQ_KEYBOARD (1 + I8259A_IRQ_BASE) /* M1543 default */ |
| 305 | #define I8259_IRQ_CASCADE (2 + I8259_IRQ_BASE) | 302 | #define I8259_IRQ_CASCADE (2 + I8259A_IRQ_BASE) |
| 306 | #define I8259_IRQ_UART_B (3 + I8259_IRQ_BASE) /* M1543 default, may conflict with RTC according to schematic diagram */ | 303 | #define I8259_IRQ_UART_B (3 + I8259A_IRQ_BASE) /* M1543 default, may conflict with RTC according to schematic diagram */ |
| 307 | #define I8259_IRQ_UART_A (4 + I8259_IRQ_BASE) /* M1543 default */ | 304 | #define I8259_IRQ_UART_A (4 + I8259A_IRQ_BASE) /* M1543 default */ |
| 308 | #define I8259_IRQ_PARALLEL (5 + I8259_IRQ_BASE) /* M1543 default */ | 305 | #define I8259_IRQ_PARALLEL (5 + I8259A_IRQ_BASE) /* M1543 default */ |
| 309 | #define I8259_IRQ_RESERVED_6 (6 + I8259_IRQ_BASE) | 306 | #define I8259_IRQ_RESERVED_6 (6 + I8259A_IRQ_BASE) |
| 310 | #define I8259_IRQ_RESERVED_7 (7 + I8259_IRQ_BASE) | 307 | #define I8259_IRQ_RESERVED_7 (7 + I8259A_IRQ_BASE) |
| 311 | #define I8259_IRQ_RTC (8 + I8259_IRQ_BASE) /* who set this? */ | 308 | #define I8259_IRQ_RTC (8 + I8259A_IRQ_BASE) /* who set this? */ |
| 312 | #define I8259_IRQ_USB (9 + I8259_IRQ_BASE) /* ddb_setup */ | 309 | #define I8259_IRQ_USB (9 + I8259A_IRQ_BASE) /* ddb_setup */ |
| 313 | #define I8259_IRQ_PMU (10 + I8259_IRQ_BASE) /* ddb_setup */ | 310 | #define I8259_IRQ_PMU (10 + I8259A_IRQ_BASE) /* ddb_setup */ |
| 314 | #define I8259_IRQ_RESERVED_11 (11 + I8259_IRQ_BASE) | 311 | #define I8259_IRQ_RESERVED_11 (11 + I8259A_IRQ_BASE) |
| 315 | #define I8259_IRQ_RESERVED_12 (12 + I8259_IRQ_BASE) /* m1543_irq_setup */ | 312 | #define I8259_IRQ_RESERVED_12 (12 + I8259A_IRQ_BASE) /* m1543_irq_setup */ |
| 316 | #define I8259_IRQ_RESERVED_13 (13 + I8259_IRQ_BASE) | 313 | #define I8259_IRQ_RESERVED_13 (13 + I8259A_IRQ_BASE) |
| 317 | #define I8259_IRQ_HDC1 (14 + I8259_IRQ_BASE) /* default and ddb_setup */ | 314 | #define I8259_IRQ_HDC1 (14 + I8259A_IRQ_BASE) /* default and ddb_setup */ |
| 318 | #define I8259_IRQ_HDC2 (15 + I8259_IRQ_BASE) /* default */ | 315 | #define I8259_IRQ_HDC2 (15 + I8259A_IRQ_BASE) /* default */ |
| 319 | 316 | ||
| 320 | 317 | ||
| 321 | /* | 318 | /* |
diff --git a/include/asm-mips/dec/interrupts.h b/include/asm-mips/dec/interrupts.h index 273e4d65bfe6..e10d341067c8 100644 --- a/include/asm-mips/dec/interrupts.h +++ b/include/asm-mips/dec/interrupts.h | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #ifndef __ASM_DEC_INTERRUPTS_H | 14 | #ifndef __ASM_DEC_INTERRUPTS_H |
| 15 | #define __ASM_DEC_INTERRUPTS_H | 15 | #define __ASM_DEC_INTERRUPTS_H |
| 16 | 16 | ||
| 17 | #include <irq.h> | ||
| 17 | #include <asm/mipsregs.h> | 18 | #include <asm/mipsregs.h> |
| 18 | 19 | ||
| 19 | 20 | ||
| @@ -87,7 +88,7 @@ | |||
| 87 | #define DEC_CPU_INR_SW1 1 /* software #1 */ | 88 | #define DEC_CPU_INR_SW1 1 /* software #1 */ |
| 88 | #define DEC_CPU_INR_SW0 0 /* software #0 */ | 89 | #define DEC_CPU_INR_SW0 0 /* software #0 */ |
| 89 | 90 | ||
| 90 | #define DEC_CPU_IRQ_BASE 0 /* first IRQ assigned to CPU */ | 91 | #define DEC_CPU_IRQ_BASE MIPS_CPU_IRQ_BASE /* first IRQ assigned to CPU */ |
| 91 | 92 | ||
| 92 | #define DEC_CPU_IRQ_NR(n) ((n) + DEC_CPU_IRQ_BASE) | 93 | #define DEC_CPU_IRQ_NR(n) ((n) + DEC_CPU_IRQ_BASE) |
| 93 | #define DEC_CPU_IRQ_MASK(n) (1 << ((n) + CAUSEB_IP)) | 94 | #define DEC_CPU_IRQ_MASK(n) (1 << ((n) + CAUSEB_IP)) |
diff --git a/include/asm-mips/dma.h b/include/asm-mips/dma.h index 23f789c80845..e06ef0776d48 100644 --- a/include/asm-mips/dma.h +++ b/include/asm-mips/dma.h | |||
| @@ -91,6 +91,7 @@ | |||
| 91 | #else | 91 | #else |
| 92 | #define MAX_DMA_ADDRESS (PAGE_OFFSET + 0x01000000) | 92 | #define MAX_DMA_ADDRESS (PAGE_OFFSET + 0x01000000) |
| 93 | #endif | 93 | #endif |
| 94 | #define MAX_DMA_PFN PFN_DOWN(virt_to_phys((void *)MAX_DMA_ADDRESS)) | ||
| 94 | 95 | ||
| 95 | /* 8237 DMA controllers */ | 96 | /* 8237 DMA controllers */ |
| 96 | #define IO_DMA1_BASE 0x00 /* 8 bit slave DMA, channels 0..3 */ | 97 | #define IO_DMA1_BASE 0x00 /* 8 bit slave DMA, channels 0..3 */ |
diff --git a/include/asm-mips/emma2rh/emma2rh.h b/include/asm-mips/emma2rh/emma2rh.h index 4fb8df71caa9..6a1af0af51e3 100644 --- a/include/asm-mips/emma2rh/emma2rh.h +++ b/include/asm-mips/emma2rh/emma2rh.h | |||
| @@ -24,6 +24,8 @@ | |||
| 24 | #ifndef __ASM_EMMA2RH_EMMA2RH_H | 24 | #ifndef __ASM_EMMA2RH_EMMA2RH_H |
| 25 | #define __ASM_EMMA2RH_EMMA2RH_H | 25 | #define __ASM_EMMA2RH_EMMA2RH_H |
| 26 | 26 | ||
| 27 | #include <irq.h> | ||
| 28 | |||
| 27 | /* | 29 | /* |
| 28 | * EMMA2RH registers | 30 | * EMMA2RH registers |
| 29 | */ | 31 | */ |
| @@ -104,7 +106,8 @@ | |||
| 104 | #define NUM_EMMA2RH_IRQ 96 | 106 | #define NUM_EMMA2RH_IRQ 96 |
| 105 | 107 | ||
| 106 | #define CPU_EMMA2RH_CASCADE 2 | 108 | #define CPU_EMMA2RH_CASCADE 2 |
| 107 | #define EMMA2RH_IRQ_BASE 0 | 109 | #define CPU_IRQ_BASE MIPS_CPU_IRQ_BASE |
| 110 | #define EMMA2RH_IRQ_BASE (CPU_IRQ_BASE + NUM_CPU_IRQ) | ||
| 108 | 111 | ||
| 109 | /* | 112 | /* |
| 110 | * emma2rh irq defs | 113 | * emma2rh irq defs |
diff --git a/include/asm-mips/emma2rh/markeins.h b/include/asm-mips/emma2rh/markeins.h index 8fa766795078..973b0628490d 100644 --- a/include/asm-mips/emma2rh/markeins.h +++ b/include/asm-mips/emma2rh/markeins.h | |||
| @@ -33,7 +33,6 @@ | |||
| 33 | 33 | ||
| 34 | #define EMMA2RH_SW_IRQ_BASE (EMMA2RH_IRQ_BASE + NUM_EMMA2RH_IRQ) | 34 | #define EMMA2RH_SW_IRQ_BASE (EMMA2RH_IRQ_BASE + NUM_EMMA2RH_IRQ) |
| 35 | #define EMMA2RH_GPIO_IRQ_BASE (EMMA2RH_SW_IRQ_BASE + NUM_EMMA2RH_IRQ_SW) | 35 | #define EMMA2RH_GPIO_IRQ_BASE (EMMA2RH_SW_IRQ_BASE + NUM_EMMA2RH_IRQ_SW) |
| 36 | #define CPU_IRQ_BASE (EMMA2RH_GPIO_IRQ_BASE + NUM_EMMA2RH_IRQ_GPIO) | ||
| 37 | 36 | ||
| 38 | #define EMMA2RH_SW_IRQ_INT0 (0+EMMA2RH_SW_IRQ_BASE) | 37 | #define EMMA2RH_SW_IRQ_INT0 (0+EMMA2RH_SW_IRQ_BASE) |
| 39 | #define EMMA2RH_SW_IRQ_INT1 (1+EMMA2RH_SW_IRQ_BASE) | 38 | #define EMMA2RH_SW_IRQ_INT1 (1+EMMA2RH_SW_IRQ_BASE) |
diff --git a/include/asm-mips/i8259.h b/include/asm-mips/i8259.h index 4df8d8b118c0..e88a01607fea 100644 --- a/include/asm-mips/i8259.h +++ b/include/asm-mips/i8259.h | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <linux/spinlock.h> | 18 | #include <linux/spinlock.h> |
| 19 | 19 | ||
| 20 | #include <asm/io.h> | 20 | #include <asm/io.h> |
| 21 | #include <irq.h> | ||
| 21 | 22 | ||
| 22 | /* i8259A PIC registers */ | 23 | /* i8259A PIC registers */ |
| 23 | #define PIC_MASTER_CMD 0x20 | 24 | #define PIC_MASTER_CMD 0x20 |
| @@ -42,8 +43,6 @@ extern void disable_8259A_irq(unsigned int irq); | |||
| 42 | 43 | ||
| 43 | extern void init_i8259_irqs(void); | 44 | extern void init_i8259_irqs(void); |
| 44 | 45 | ||
| 45 | #define I8259A_IRQ_BASE 0 | ||
| 46 | |||
| 47 | /* | 46 | /* |
| 48 | * Do the traditional i8259 interrupt polling thing. This is for the few | 47 | * Do the traditional i8259 interrupt polling thing. This is for the few |
| 49 | * cases where no better interrupt acknowledge method is available and we | 48 | * cases where no better interrupt acknowledge method is available and we |
diff --git a/include/asm-mips/io.h b/include/asm-mips/io.h index d77b657c09c7..67f081078904 100644 --- a/include/asm-mips/io.h +++ b/include/asm-mips/io.h | |||
| @@ -115,7 +115,7 @@ static inline void set_io_port_base(unsigned long base) | |||
| 115 | */ | 115 | */ |
| 116 | static inline unsigned long virt_to_phys(volatile const void *address) | 116 | static inline unsigned long virt_to_phys(volatile const void *address) |
| 117 | { | 117 | { |
| 118 | return (unsigned long)address - PAGE_OFFSET; | 118 | return (unsigned long)address - PAGE_OFFSET + PHYS_OFFSET; |
| 119 | } | 119 | } |
| 120 | 120 | ||
| 121 | /* | 121 | /* |
| @@ -132,7 +132,7 @@ static inline unsigned long virt_to_phys(volatile const void *address) | |||
| 132 | */ | 132 | */ |
| 133 | static inline void * phys_to_virt(unsigned long address) | 133 | static inline void * phys_to_virt(unsigned long address) |
| 134 | { | 134 | { |
| 135 | return (void *)(address + PAGE_OFFSET); | 135 | return (void *)(address + PAGE_OFFSET - PHYS_OFFSET); |
| 136 | } | 136 | } |
| 137 | 137 | ||
| 138 | /* | 138 | /* |
diff --git a/include/asm-mips/irq.h b/include/asm-mips/irq.h index 386da82e5774..91803ba30ff2 100644 --- a/include/asm-mips/irq.h +++ b/include/asm-mips/irq.h | |||
| @@ -18,7 +18,7 @@ | |||
| 18 | #ifdef CONFIG_I8259 | 18 | #ifdef CONFIG_I8259 |
| 19 | static inline int irq_canonicalize(int irq) | 19 | static inline int irq_canonicalize(int irq) |
| 20 | { | 20 | { |
| 21 | return ((irq == 2) ? 9 : irq); | 21 | return ((irq == I8259A_IRQ_BASE + 2) ? I8259A_IRQ_BASE + 9 : irq); |
| 22 | } | 22 | } |
| 23 | #else | 23 | #else |
| 24 | #define irq_canonicalize(irq) (irq) /* Sane hardware, sane code ... */ | 24 | #define irq_canonicalize(irq) (irq) /* Sane hardware, sane code ... */ |
diff --git a/include/asm-mips/irq_cpu.h b/include/asm-mips/irq_cpu.h index ed3d1e3d09ec..ef6a07cddb23 100644 --- a/include/asm-mips/irq_cpu.h +++ b/include/asm-mips/irq_cpu.h | |||
| @@ -13,8 +13,8 @@ | |||
| 13 | #ifndef _ASM_IRQ_CPU_H | 13 | #ifndef _ASM_IRQ_CPU_H |
| 14 | #define _ASM_IRQ_CPU_H | 14 | #define _ASM_IRQ_CPU_H |
| 15 | 15 | ||
| 16 | extern void mips_cpu_irq_init(int irq_base); | 16 | extern void mips_cpu_irq_init(void); |
| 17 | extern void rm7k_cpu_irq_init(int irq_base); | 17 | extern void rm7k_cpu_irq_init(void); |
| 18 | extern void rm9k_cpu_irq_init(int irq_base); | 18 | extern void rm9k_cpu_irq_init(void); |
| 19 | 19 | ||
| 20 | #endif /* _ASM_IRQ_CPU_H */ | 20 | #endif /* _ASM_IRQ_CPU_H */ |
diff --git a/include/asm-mips/mach-au1x00/au1000.h b/include/asm-mips/mach-au1x00/au1000.h index 582acd8adb81..58fca8a5a9a6 100644 --- a/include/asm-mips/mach-au1x00/au1000.h +++ b/include/asm-mips/mach-au1x00/au1000.h | |||
| @@ -39,6 +39,7 @@ | |||
| 39 | #ifndef _LANGUAGE_ASSEMBLY | 39 | #ifndef _LANGUAGE_ASSEMBLY |
| 40 | 40 | ||
| 41 | #include <linux/delay.h> | 41 | #include <linux/delay.h> |
| 42 | #include <linux/types.h> | ||
| 42 | #include <asm/io.h> | 43 | #include <asm/io.h> |
| 43 | 44 | ||
| 44 | /* cpu pipeline flush */ | 45 | /* cpu pipeline flush */ |
diff --git a/include/asm-mips/mach-cobalt/cobalt.h b/include/asm-mips/mach-cobalt/cobalt.h index 00b0fc68d5cb..24a8d51a55a3 100644 --- a/include/asm-mips/mach-cobalt/cobalt.h +++ b/include/asm-mips/mach-cobalt/cobalt.h | |||
| @@ -12,6 +12,8 @@ | |||
| 12 | #ifndef __ASM_COBALT_H | 12 | #ifndef __ASM_COBALT_H |
| 13 | #define __ASM_COBALT_H | 13 | #define __ASM_COBALT_H |
| 14 | 14 | ||
| 15 | #include <irq.h> | ||
| 16 | |||
| 15 | /* | 17 | /* |
| 16 | * i8259 legacy interrupts used on Cobalt: | 18 | * i8259 legacy interrupts used on Cobalt: |
| 17 | * | 19 | * |
| @@ -25,7 +27,7 @@ | |||
| 25 | /* | 27 | /* |
| 26 | * CPU IRQs are 16 ... 23 | 28 | * CPU IRQs are 16 ... 23 |
| 27 | */ | 29 | */ |
| 28 | #define COBALT_CPU_IRQ 16 | 30 | #define COBALT_CPU_IRQ MIPS_CPU_IRQ_BASE |
| 29 | 31 | ||
| 30 | #define COBALT_GALILEO_IRQ (COBALT_CPU_IRQ + 2) | 32 | #define COBALT_GALILEO_IRQ (COBALT_CPU_IRQ + 2) |
| 31 | #define COBALT_SCC_IRQ (COBALT_CPU_IRQ + 3) /* pre-production has 85C30 */ | 33 | #define COBALT_SCC_IRQ (COBALT_CPU_IRQ + 3) /* pre-production has 85C30 */ |
diff --git a/include/asm-mips/mach-emma2rh/irq.h b/include/asm-mips/mach-emma2rh/irq.h index bce64244b800..5439eb856461 100644 --- a/include/asm-mips/mach-emma2rh/irq.h +++ b/include/asm-mips/mach-emma2rh/irq.h | |||
| @@ -10,4 +10,6 @@ | |||
| 10 | 10 | ||
| 11 | #define NR_IRQS 256 | 11 | #define NR_IRQS 256 |
| 12 | 12 | ||
| 13 | #include_next <irq.h> | ||
| 14 | |||
| 13 | #endif /* __ASM_MACH_EMMA2RH_IRQ_H */ | 15 | #endif /* __ASM_MACH_EMMA2RH_IRQ_H */ |
diff --git a/include/asm-mips/mach-generic/irq.h b/include/asm-mips/mach-generic/irq.h index 500e10ff24de..70d9a25132c5 100644 --- a/include/asm-mips/mach-generic/irq.h +++ b/include/asm-mips/mach-generic/irq.h | |||
| @@ -8,6 +8,38 @@ | |||
| 8 | #ifndef __ASM_MACH_GENERIC_IRQ_H | 8 | #ifndef __ASM_MACH_GENERIC_IRQ_H |
| 9 | #define __ASM_MACH_GENERIC_IRQ_H | 9 | #define __ASM_MACH_GENERIC_IRQ_H |
| 10 | 10 | ||
| 11 | #ifndef NR_IRQS | ||
| 11 | #define NR_IRQS 128 | 12 | #define NR_IRQS 128 |
| 13 | #endif | ||
| 14 | |||
| 15 | #ifdef CONFIG_I8259 | ||
| 16 | #ifndef I8259A_IRQ_BASE | ||
| 17 | #define I8259A_IRQ_BASE 0 | ||
| 18 | #endif | ||
| 19 | #endif | ||
| 20 | |||
| 21 | #ifdef CONFIG_IRQ_CPU | ||
| 22 | |||
| 23 | #ifndef MIPS_CPU_IRQ_BASE | ||
| 24 | #ifdef CONFIG_I8259 | ||
| 25 | #define MIPS_CPU_IRQ_BASE 16 | ||
| 26 | #else | ||
| 27 | #define MIPS_CPU_IRQ_BASE 0 | ||
| 28 | #endif /* CONFIG_I8259 */ | ||
| 29 | #endif | ||
| 30 | |||
| 31 | #ifdef CONFIG_IRQ_CPU_RM7K | ||
| 32 | #ifndef RM7K_CPU_IRQ_BASE | ||
| 33 | #define RM7K_CPU_IRQ_BASE (MIPS_CPU_IRQ_BASE+8) | ||
| 34 | #endif | ||
| 35 | #endif | ||
| 36 | |||
| 37 | #ifdef CONFIG_IRQ_CPU_RM9K | ||
| 38 | #ifndef RM9K_CPU_IRQ_BASE | ||
| 39 | #define RM9K_CPU_IRQ_BASE (MIPS_CPU_IRQ_BASE+12) | ||
| 40 | #endif | ||
| 41 | #endif | ||
| 42 | |||
| 43 | #endif /* CONFIG_IRQ_CPU */ | ||
| 12 | 44 | ||
| 13 | #endif /* __ASM_MACH_GENERIC_IRQ_H */ | 45 | #endif /* __ASM_MACH_GENERIC_IRQ_H */ |
diff --git a/include/asm-mips/mach-mips/irq.h b/include/asm-mips/mach-mips/irq.h index e994b0c01227..9b9da26683c2 100644 --- a/include/asm-mips/mach-mips/irq.h +++ b/include/asm-mips/mach-mips/irq.h | |||
| @@ -4,4 +4,6 @@ | |||
| 4 | 4 | ||
| 5 | #define NR_IRQS 256 | 5 | #define NR_IRQS 256 |
| 6 | 6 | ||
| 7 | #include_next <irq.h> | ||
| 8 | |||
| 7 | #endif /* __ASM_MACH_MIPS_IRQ_H */ | 9 | #endif /* __ASM_MACH_MIPS_IRQ_H */ |
diff --git a/include/asm-mips/mach-vr41xx/irq.h b/include/asm-mips/mach-vr41xx/irq.h new file mode 100644 index 000000000000..848812296052 --- /dev/null +++ b/include/asm-mips/mach-vr41xx/irq.h | |||
| @@ -0,0 +1,11 @@ | |||
| 1 | #ifndef __ASM_MACH_VR41XX_IRQ_H | ||
| 2 | #define __ASM_MACH_VR41XX_IRQ_H | ||
| 3 | |||
| 4 | #include <asm/vr41xx/irq.h> /* for MIPS_CPU_IRQ_BASE */ | ||
| 5 | #ifdef CONFIG_NEC_CMBVR4133 | ||
| 6 | #include <asm/vr41xx/cmbvr4133.h> /* for I8259A_IRQ_BASE */ | ||
| 7 | #endif | ||
| 8 | |||
| 9 | #include_next <irq.h> | ||
| 10 | |||
| 11 | #endif /* __ASM_MACH_VR41XX_IRQ_H */ | ||
diff --git a/include/asm-mips/mips-boards/atlasint.h b/include/asm-mips/mips-boards/atlasint.h index b15e4ea0b091..76add42e486e 100644 --- a/include/asm-mips/mips-boards/atlasint.h +++ b/include/asm-mips/mips-boards/atlasint.h | |||
| @@ -26,10 +26,12 @@ | |||
| 26 | #ifndef _MIPS_ATLASINT_H | 26 | #ifndef _MIPS_ATLASINT_H |
| 27 | #define _MIPS_ATLASINT_H | 27 | #define _MIPS_ATLASINT_H |
| 28 | 28 | ||
| 29 | #include <irq.h> | ||
| 30 | |||
| 29 | /* | 31 | /* |
| 30 | * Interrupts 0..7 are used for Atlas CPU interrupts (nonEIC mode) | 32 | * Interrupts 0..7 are used for Atlas CPU interrupts (nonEIC mode) |
| 31 | */ | 33 | */ |
| 32 | #define MIPSCPU_INT_BASE 0 | 34 | #define MIPSCPU_INT_BASE MIPS_CPU_IRQ_BASE |
| 33 | 35 | ||
| 34 | /* CPU interrupt offsets */ | 36 | /* CPU interrupt offsets */ |
| 35 | #define MIPSCPU_INT_SW0 0 | 37 | #define MIPSCPU_INT_SW0 0 |
diff --git a/include/asm-mips/mips-boards/maltaint.h b/include/asm-mips/mips-boards/maltaint.h index da6cc2fbbc78..9180d6466113 100644 --- a/include/asm-mips/mips-boards/maltaint.h +++ b/include/asm-mips/mips-boards/maltaint.h | |||
| @@ -25,6 +25,8 @@ | |||
| 25 | #ifndef _MIPS_MALTAINT_H | 25 | #ifndef _MIPS_MALTAINT_H |
| 26 | #define _MIPS_MALTAINT_H | 26 | #define _MIPS_MALTAINT_H |
| 27 | 27 | ||
| 28 | #include <irq.h> | ||
| 29 | |||
| 28 | /* | 30 | /* |
| 29 | * Interrupts 0..15 are used for Malta ISA compatible interrupts | 31 | * Interrupts 0..15 are used for Malta ISA compatible interrupts |
| 30 | */ | 32 | */ |
| @@ -33,7 +35,7 @@ | |||
| 33 | /* | 35 | /* |
| 34 | * Interrupts 16..23 are used for Malta CPU interrupts (nonEIC mode) | 36 | * Interrupts 16..23 are used for Malta CPU interrupts (nonEIC mode) |
| 35 | */ | 37 | */ |
| 36 | #define MIPSCPU_INT_BASE 16 | 38 | #define MIPSCPU_INT_BASE MIPS_CPU_IRQ_BASE |
| 37 | 39 | ||
| 38 | /* CPU interrupt offsets */ | 40 | /* CPU interrupt offsets */ |
| 39 | #define MIPSCPU_INT_SW0 0 | 41 | #define MIPSCPU_INT_SW0 0 |
diff --git a/include/asm-mips/mips-boards/prom.h b/include/asm-mips/mips-boards/prom.h index 4168c7fcd43e..7bf6f5f6ab9c 100644 --- a/include/asm-mips/mips-boards/prom.h +++ b/include/asm-mips/mips-boards/prom.h | |||
| @@ -33,7 +33,6 @@ extern void prom_printf(char *fmt, ...); | |||
| 33 | extern void prom_init_cmdline(void); | 33 | extern void prom_init_cmdline(void); |
| 34 | extern void prom_meminit(void); | 34 | extern void prom_meminit(void); |
| 35 | extern void prom_fixup_mem_map(unsigned long start_mem, unsigned long end_mem); | 35 | extern void prom_fixup_mem_map(unsigned long start_mem, unsigned long end_mem); |
| 36 | extern unsigned long prom_free_prom_memory (void); | ||
| 37 | extern void mips_display_message(const char *str); | 36 | extern void mips_display_message(const char *str); |
| 38 | extern void mips_display_word(unsigned int num); | 37 | extern void mips_display_word(unsigned int num); |
| 39 | extern int get_ethernet_addr(char *ethernet_addr); | 38 | extern int get_ethernet_addr(char *ethernet_addr); |
diff --git a/include/asm-mips/mips-boards/seadint.h b/include/asm-mips/mips-boards/seadint.h index 365c2a3c64f5..4f6a3933699d 100644 --- a/include/asm-mips/mips-boards/seadint.h +++ b/include/asm-mips/mips-boards/seadint.h | |||
| @@ -20,10 +20,12 @@ | |||
| 20 | #ifndef _MIPS_SEADINT_H | 20 | #ifndef _MIPS_SEADINT_H |
| 21 | #define _MIPS_SEADINT_H | 21 | #define _MIPS_SEADINT_H |
| 22 | 22 | ||
| 23 | #include <irq.h> | ||
| 24 | |||
| 23 | /* | 25 | /* |
| 24 | * Interrupts 0..7 are used for SEAD CPU interrupts | 26 | * Interrupts 0..7 are used for SEAD CPU interrupts |
| 25 | */ | 27 | */ |
| 26 | #define MIPSCPU_INT_BASE 0 | 28 | #define MIPSCPU_INT_BASE MIPS_CPU_IRQ_BASE |
| 27 | 29 | ||
| 28 | #define MIPSCPU_INT_UART0 2 | 30 | #define MIPSCPU_INT_UART0 2 |
| 29 | #define MIPSCPU_INT_UART1 3 | 31 | #define MIPSCPU_INT_UART1 3 |
diff --git a/include/asm-mips/mips-boards/simint.h b/include/asm-mips/mips-boards/simint.h index 4952e0b3bf11..54f2fe621d69 100644 --- a/include/asm-mips/mips-boards/simint.h +++ b/include/asm-mips/mips-boards/simint.h | |||
| @@ -17,10 +17,11 @@ | |||
| 17 | #ifndef _MIPS_SIMINT_H | 17 | #ifndef _MIPS_SIMINT_H |
| 18 | #define _MIPS_SIMINT_H | 18 | #define _MIPS_SIMINT_H |
| 19 | 19 | ||
| 20 | #include <irq.h> | ||
| 20 | 21 | ||
| 21 | #define SIM_INT_BASE 0 | 22 | #define SIM_INT_BASE 0 |
| 22 | #define MIPSCPU_INT_MB0 2 | 23 | #define MIPSCPU_INT_MB0 2 |
| 23 | #define MIPSCPU_INT_BASE 16 | 24 | #define MIPSCPU_INT_BASE MIPS_CPU_IRQ_BASE |
| 24 | #define MIPS_CPU_TIMER_IRQ 7 | 25 | #define MIPS_CPU_TIMER_IRQ 7 |
| 25 | 26 | ||
| 26 | 27 | ||
diff --git a/include/asm-mips/mipsmtregs.h b/include/asm-mips/mipsmtregs.h index 3e9468f424f4..294bca12cd3f 100644 --- a/include/asm-mips/mipsmtregs.h +++ b/include/asm-mips/mipsmtregs.h | |||
| @@ -165,8 +165,6 @@ | |||
| 165 | 165 | ||
| 166 | #ifndef __ASSEMBLY__ | 166 | #ifndef __ASSEMBLY__ |
| 167 | 167 | ||
| 168 | extern void mips_mt_regdump(unsigned long previous_mvpcontrol_value); | ||
| 169 | |||
| 170 | static inline unsigned int dvpe(void) | 168 | static inline unsigned int dvpe(void) |
| 171 | { | 169 | { |
| 172 | int res = 0; | 170 | int res = 0; |
diff --git a/include/asm-mips/page.h b/include/asm-mips/page.h index 2f9e1a9ec51f..d3fbd83ff545 100644 --- a/include/asm-mips/page.h +++ b/include/asm-mips/page.h | |||
| @@ -34,6 +34,20 @@ | |||
| 34 | 34 | ||
| 35 | #ifndef __ASSEMBLY__ | 35 | #ifndef __ASSEMBLY__ |
| 36 | 36 | ||
| 37 | /* | ||
| 38 | * This gives the physical RAM offset. | ||
| 39 | */ | ||
| 40 | #ifndef PHYS_OFFSET | ||
| 41 | #define PHYS_OFFSET 0UL | ||
| 42 | #endif | ||
| 43 | |||
| 44 | /* | ||
| 45 | * It's normally defined only for FLATMEM config but it's | ||
| 46 | * used in our early mem init code for all memory models. | ||
| 47 | * So always define it. | ||
| 48 | */ | ||
| 49 | #define ARCH_PFN_OFFSET PFN_UP(PHYS_OFFSET) | ||
| 50 | |||
| 37 | #include <linux/pfn.h> | 51 | #include <linux/pfn.h> |
| 38 | #include <asm/io.h> | 52 | #include <asm/io.h> |
| 39 | 53 | ||
| @@ -132,20 +146,23 @@ typedef struct { unsigned long pgprot; } pgprot_t; | |||
| 132 | /* to align the pointer to the (next) page boundary */ | 146 | /* to align the pointer to the (next) page boundary */ |
| 133 | #define PAGE_ALIGN(addr) (((addr) + PAGE_SIZE - 1) & PAGE_MASK) | 147 | #define PAGE_ALIGN(addr) (((addr) + PAGE_SIZE - 1) & PAGE_MASK) |
| 134 | 148 | ||
| 149 | /* | ||
| 150 | * __pa()/__va() should be used only during mem init. | ||
| 151 | */ | ||
| 135 | #if defined(CONFIG_64BIT) && !defined(CONFIG_BUILD_ELF64) | 152 | #if defined(CONFIG_64BIT) && !defined(CONFIG_BUILD_ELF64) |
| 136 | #define __pa_page_offset(x) ((unsigned long)(x) < CKSEG0 ? PAGE_OFFSET : CKSEG0) | 153 | #define __pa_page_offset(x) ((unsigned long)(x) < CKSEG0 ? PAGE_OFFSET : CKSEG0) |
| 137 | #else | 154 | #else |
| 138 | #define __pa_page_offset(x) PAGE_OFFSET | 155 | #define __pa_page_offset(x) PAGE_OFFSET |
| 139 | #endif | 156 | #endif |
| 140 | #define __pa(x) ((unsigned long)(x) - __pa_page_offset(x)) | 157 | #define __pa(x) ((unsigned long)(x) - __pa_page_offset(x) + PHYS_OFFSET) |
| 141 | #define __pa_symbol(x) __pa(RELOC_HIDE((unsigned long)(x),0)) | 158 | #define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET - PHYS_OFFSET)) |
| 142 | #define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET)) | 159 | #define __pa_symbol(x) __pa(RELOC_HIDE((unsigned long)(x),0)) |
| 143 | 160 | ||
| 144 | #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) | 161 | #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) |
| 145 | 162 | ||
| 146 | #ifdef CONFIG_FLATMEM | 163 | #ifdef CONFIG_FLATMEM |
| 147 | 164 | ||
| 148 | #define pfn_valid(pfn) ((pfn) < max_mapnr) | 165 | #define pfn_valid(pfn) ((pfn) >= ARCH_PFN_OFFSET && (pfn) < max_mapnr) |
| 149 | 166 | ||
| 150 | #elif defined(CONFIG_SPARSEMEM) | 167 | #elif defined(CONFIG_SPARSEMEM) |
| 151 | 168 | ||
diff --git a/include/asm-mips/rtlx.h b/include/asm-mips/rtlx.h index 76cd51c6be39..59162f74a798 100644 --- a/include/asm-mips/rtlx.h +++ b/include/asm-mips/rtlx.h | |||
| @@ -6,9 +6,10 @@ | |||
| 6 | #ifndef __ASM_RTLX_H | 6 | #ifndef __ASM_RTLX_H |
| 7 | #define __ASM_RTLX_H_ | 7 | #define __ASM_RTLX_H_ |
| 8 | 8 | ||
| 9 | #include <irq.h> | ||
| 10 | |||
| 9 | #define LX_NODE_BASE 10 | 11 | #define LX_NODE_BASE 10 |
| 10 | 12 | ||
| 11 | #define MIPSCPU_INT_BASE 16 | ||
| 12 | #define MIPS_CPU_RTLX_IRQ 0 | 13 | #define MIPS_CPU_RTLX_IRQ 0 |
| 13 | 14 | ||
| 14 | #define RTLX_VERSION 2 | 15 | #define RTLX_VERSION 2 |
diff --git a/include/asm-mips/sections.h b/include/asm-mips/sections.h index f7016278b266..b7e37262c246 100644 --- a/include/asm-mips/sections.h +++ b/include/asm-mips/sections.h | |||
| @@ -3,6 +3,4 @@ | |||
| 3 | 3 | ||
| 4 | #include <asm-generic/sections.h> | 4 | #include <asm-generic/sections.h> |
| 5 | 5 | ||
| 6 | extern char _fdata; | ||
| 7 | |||
| 8 | #endif /* _ASM_SECTIONS_H */ | 6 | #endif /* _ASM_SECTIONS_H */ |
diff --git a/include/asm-mips/sgi/ip22.h b/include/asm-mips/sgi/ip22.h index bbfc05c3cab9..6592f3bd1999 100644 --- a/include/asm-mips/sgi/ip22.h +++ b/include/asm-mips/sgi/ip22.h | |||
| @@ -21,15 +21,16 @@ | |||
| 21 | * HAL2 driver). This will prevent many complications, trust me ;-) | 21 | * HAL2 driver). This will prevent many complications, trust me ;-) |
| 22 | */ | 22 | */ |
| 23 | 23 | ||
| 24 | #include <irq.h> | ||
| 24 | #include <asm/sgi/ioc.h> | 25 | #include <asm/sgi/ioc.h> |
| 25 | 26 | ||
| 26 | #define SGINT_EISA 0 /* 16 EISA irq levels (Indigo2) */ | 27 | #define SGINT_EISA 0 /* 16 EISA irq levels (Indigo2) */ |
| 27 | #define SGINT_CPU 16 /* MIPS CPU define 8 interrupt sources */ | 28 | #define SGINT_CPU MIPS_CPU_IRQ_BASE /* MIPS CPU define 8 interrupt sources */ |
| 28 | #define SGINT_LOCAL0 24 /* 8 local0 irq levels */ | 29 | #define SGINT_LOCAL0 (SGINT_CPU+8) /* 8 local0 irq levels */ |
| 29 | #define SGINT_LOCAL1 32 /* 8 local1 irq levels */ | 30 | #define SGINT_LOCAL1 (SGINT_CPU+16) /* 8 local1 irq levels */ |
| 30 | #define SGINT_LOCAL2 40 /* 8 local2 vectored irq levels */ | 31 | #define SGINT_LOCAL2 (SGINT_CPU+24) /* 8 local2 vectored irq levels */ |
| 31 | #define SGINT_LOCAL3 48 /* 8 local3 vectored irq levels */ | 32 | #define SGINT_LOCAL3 (SGINT_CPU+32) /* 8 local3 vectored irq levels */ |
| 32 | #define SGINT_END 56 /* End of 'spaces' */ | 33 | #define SGINT_END (SGINT_CPU+40) /* End of 'spaces' */ |
| 33 | 34 | ||
| 34 | /* | 35 | /* |
| 35 | * Individual interrupt definitions for the Indy and Indigo2 | 36 | * Individual interrupt definitions for the Indy and Indigo2 |
diff --git a/include/asm-mips/smtc_ipi.h b/include/asm-mips/smtc_ipi.h index f22c3e2f993a..55f3419f6546 100644 --- a/include/asm-mips/smtc_ipi.h +++ b/include/asm-mips/smtc_ipi.h | |||
| @@ -44,9 +44,6 @@ struct smtc_ipi_q { | |||
| 44 | int depth; | 44 | int depth; |
| 45 | }; | 45 | }; |
| 46 | 46 | ||
| 47 | extern struct smtc_ipi_q IPIQ[NR_CPUS]; | ||
| 48 | extern struct smtc_ipi_q freeIPIq; | ||
| 49 | |||
| 50 | static inline void smtc_ipi_nq(struct smtc_ipi_q *q, struct smtc_ipi *p) | 47 | static inline void smtc_ipi_nq(struct smtc_ipi_q *q, struct smtc_ipi *p) |
| 51 | { | 48 | { |
| 52 | long flags; | 49 | long flags; |
diff --git a/include/asm-mips/uaccess.h b/include/asm-mips/uaccess.h index 1cdd4eeb2f73..c12ebc53ef31 100644 --- a/include/asm-mips/uaccess.h +++ b/include/asm-mips/uaccess.h | |||
| @@ -488,7 +488,8 @@ extern size_t __copy_user(void *__to, const void *__from, size_t __n); | |||
| 488 | }) | 488 | }) |
| 489 | 489 | ||
| 490 | /* | 490 | /* |
| 491 | * __copy_from_user: - Copy a block of data from user space, with less checking. * @to: Destination address, in kernel space. | 491 | * __copy_from_user: - Copy a block of data from user space, with less checking. |
| 492 | * @to: Destination address, in kernel space. | ||
| 492 | * @from: Source address, in user space. | 493 | * @from: Source address, in user space. |
| 493 | * @n: Number of bytes to copy. | 494 | * @n: Number of bytes to copy. |
| 494 | * | 495 | * |
diff --git a/include/asm-mips/vr41xx/cmbvr4133.h b/include/asm-mips/vr41xx/cmbvr4133.h index 9490ade58b46..42300037d593 100644 --- a/include/asm-mips/vr41xx/cmbvr4133.h +++ b/include/asm-mips/vr41xx/cmbvr4133.h | |||
| @@ -35,8 +35,8 @@ | |||
| 35 | #define CMBVR41XX_INTD_IRQ GIU_IRQ(CMBVR41XX_INTD_PIN) | 35 | #define CMBVR41XX_INTD_IRQ GIU_IRQ(CMBVR41XX_INTD_PIN) |
| 36 | #define CMBVR41XX_INTE_IRQ GIU_IRQ(CMBVR41XX_INTE_PIN) | 36 | #define CMBVR41XX_INTE_IRQ GIU_IRQ(CMBVR41XX_INTE_PIN) |
| 37 | 37 | ||
| 38 | #define I8259_IRQ_BASE 72 | 38 | #define I8259A_IRQ_BASE 72 |
| 39 | #define I8259_IRQ(x) (I8259_IRQ_BASE + (x)) | 39 | #define I8259_IRQ(x) (I8259A_IRQ_BASE + (x)) |
| 40 | #define TIMER_IRQ I8259_IRQ(0) | 40 | #define TIMER_IRQ I8259_IRQ(0) |
| 41 | #define KEYBOARD_IRQ I8259_IRQ(1) | 41 | #define KEYBOARD_IRQ I8259_IRQ(1) |
| 42 | #define I8259_SLAVE_IRQ I8259_IRQ(2) | 42 | #define I8259_SLAVE_IRQ I8259_IRQ(2) |
| @@ -52,6 +52,5 @@ | |||
| 52 | #define AUX_IRQ I8259_IRQ(12) | 52 | #define AUX_IRQ I8259_IRQ(12) |
| 53 | #define IDE_PRIMARY_IRQ I8259_IRQ(14) | 53 | #define IDE_PRIMARY_IRQ I8259_IRQ(14) |
| 54 | #define IDE_SECONDARY_IRQ I8259_IRQ(15) | 54 | #define IDE_SECONDARY_IRQ I8259_IRQ(15) |
| 55 | #define I8259_IRQ_LAST IDE_SECONDARY_IRQ | ||
| 56 | 55 | ||
| 57 | #endif /* __NEC_CMBVR4133_H */ | 56 | #endif /* __NEC_CMBVR4133_H */ |
diff --git a/include/asm-s390/compat.h b/include/asm-s390/compat.h index 356a0b183539..296f4f1a20e1 100644 --- a/include/asm-s390/compat.h +++ b/include/asm-s390/compat.h | |||
| @@ -6,6 +6,34 @@ | |||
| 6 | #include <linux/types.h> | 6 | #include <linux/types.h> |
| 7 | #include <linux/sched.h> | 7 | #include <linux/sched.h> |
| 8 | 8 | ||
| 9 | #define PSW32_MASK_PER 0x40000000UL | ||
| 10 | #define PSW32_MASK_DAT 0x04000000UL | ||
| 11 | #define PSW32_MASK_IO 0x02000000UL | ||
| 12 | #define PSW32_MASK_EXT 0x01000000UL | ||
| 13 | #define PSW32_MASK_KEY 0x00F00000UL | ||
| 14 | #define PSW32_MASK_MCHECK 0x00040000UL | ||
| 15 | #define PSW32_MASK_WAIT 0x00020000UL | ||
| 16 | #define PSW32_MASK_PSTATE 0x00010000UL | ||
| 17 | #define PSW32_MASK_ASC 0x0000C000UL | ||
| 18 | #define PSW32_MASK_CC 0x00003000UL | ||
| 19 | #define PSW32_MASK_PM 0x00000f00UL | ||
| 20 | |||
| 21 | #define PSW32_ADDR_AMODE31 0x80000000UL | ||
| 22 | #define PSW32_ADDR_INSN 0x7FFFFFFFUL | ||
| 23 | |||
| 24 | #define PSW32_BASE_BITS 0x00080000UL | ||
| 25 | |||
| 26 | #define PSW32_ASC_PRIMARY 0x00000000UL | ||
| 27 | #define PSW32_ASC_ACCREG 0x00004000UL | ||
| 28 | #define PSW32_ASC_SECONDARY 0x00008000UL | ||
| 29 | #define PSW32_ASC_HOME 0x0000C000UL | ||
| 30 | |||
| 31 | #define PSW32_MASK_MERGE(CURRENT,NEW) \ | ||
| 32 | (((CURRENT) & ~(PSW32_MASK_CC|PSW32_MASK_PM)) | \ | ||
| 33 | ((NEW) & (PSW32_MASK_CC|PSW32_MASK_PM))) | ||
| 34 | |||
| 35 | extern long psw32_user_bits; | ||
| 36 | |||
| 9 | #define COMPAT_USER_HZ 100 | 37 | #define COMPAT_USER_HZ 100 |
| 10 | 38 | ||
| 11 | typedef u32 compat_size_t; | 39 | typedef u32 compat_size_t; |
diff --git a/include/asm-s390/etr.h b/include/asm-s390/etr.h new file mode 100644 index 000000000000..b498f19bb9a7 --- /dev/null +++ b/include/asm-s390/etr.h | |||
| @@ -0,0 +1,219 @@ | |||
| 1 | /* | ||
| 2 | * include/asm-s390/etr.h | ||
| 3 | * | ||
| 4 | * Copyright IBM Corp. 2006 | ||
| 5 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com) | ||
| 6 | */ | ||
| 7 | #ifndef __S390_ETR_H | ||
| 8 | #define __S390_ETR_H | ||
| 9 | |||
| 10 | /* ETR attachment control register */ | ||
| 11 | struct etr_eacr { | ||
| 12 | unsigned int e0 : 1; /* port 0 stepping control */ | ||
| 13 | unsigned int e1 : 1; /* port 1 stepping control */ | ||
| 14 | unsigned int _pad0 : 5; /* must be 00100 */ | ||
| 15 | unsigned int dp : 1; /* data port control */ | ||
| 16 | unsigned int p0 : 1; /* port 0 change recognition control */ | ||
| 17 | unsigned int p1 : 1; /* port 1 change recognition control */ | ||
| 18 | unsigned int _pad1 : 3; /* must be 000 */ | ||
| 19 | unsigned int ea : 1; /* ETR alert control */ | ||
| 20 | unsigned int es : 1; /* ETR sync check control */ | ||
| 21 | unsigned int sl : 1; /* switch to local control */ | ||
| 22 | } __attribute__ ((packed)); | ||
| 23 | |||
| 24 | /* Port state returned by steai */ | ||
| 25 | enum etr_psc { | ||
| 26 | etr_psc_operational = 0, | ||
| 27 | etr_psc_semi_operational = 1, | ||
| 28 | etr_psc_protocol_error = 4, | ||
| 29 | etr_psc_no_symbols = 8, | ||
| 30 | etr_psc_no_signal = 12, | ||
| 31 | etr_psc_pps_mode = 13 | ||
| 32 | }; | ||
| 33 | |||
| 34 | /* Logical port state returned by stetr */ | ||
| 35 | enum etr_lpsc { | ||
| 36 | etr_lpsc_operational_step = 0, | ||
| 37 | etr_lpsc_operational_alt = 1, | ||
| 38 | etr_lpsc_semi_operational = 2, | ||
| 39 | etr_lpsc_protocol_error = 4, | ||
| 40 | etr_lpsc_no_symbol_sync = 8, | ||
| 41 | etr_lpsc_no_signal = 12, | ||
| 42 | etr_lpsc_pps_mode = 13 | ||
| 43 | }; | ||
| 44 | |||
| 45 | /* ETR status words */ | ||
| 46 | struct etr_esw { | ||
| 47 | struct etr_eacr eacr; /* attachment control register */ | ||
| 48 | unsigned int y : 1; /* stepping mode */ | ||
| 49 | unsigned int _pad0 : 5; /* must be 00000 */ | ||
| 50 | unsigned int p : 1; /* stepping port number */ | ||
| 51 | unsigned int q : 1; /* data port number */ | ||
| 52 | unsigned int psc0 : 4; /* port 0 state code */ | ||
| 53 | unsigned int psc1 : 4; /* port 1 state code */ | ||
| 54 | } __attribute__ ((packed)); | ||
| 55 | |||
| 56 | /* Second level data register status word */ | ||
| 57 | struct etr_slsw { | ||
| 58 | unsigned int vv1 : 1; /* copy of validity bit data frame 1 */ | ||
| 59 | unsigned int vv2 : 1; /* copy of validity bit data frame 2 */ | ||
| 60 | unsigned int vv3 : 1; /* copy of validity bit data frame 3 */ | ||
| 61 | unsigned int vv4 : 1; /* copy of validity bit data frame 4 */ | ||
| 62 | unsigned int _pad0 : 19; /* must by all zeroes */ | ||
| 63 | unsigned int n : 1; /* EAF port number */ | ||
| 64 | unsigned int v1 : 1; /* validity bit ETR data frame 1 */ | ||
| 65 | unsigned int v2 : 1; /* validity bit ETR data frame 2 */ | ||
| 66 | unsigned int v3 : 1; /* validity bit ETR data frame 3 */ | ||
| 67 | unsigned int v4 : 1; /* validity bit ETR data frame 4 */ | ||
| 68 | unsigned int _pad1 : 4; /* must be 0000 */ | ||
| 69 | } __attribute__ ((packed)); | ||
| 70 | |||
| 71 | /* ETR data frames */ | ||
| 72 | struct etr_edf1 { | ||
| 73 | unsigned int u : 1; /* untuned bit */ | ||
| 74 | unsigned int _pad0 : 1; /* must be 0 */ | ||
| 75 | unsigned int r : 1; /* service request bit */ | ||
| 76 | unsigned int _pad1 : 4; /* must be 0000 */ | ||
| 77 | unsigned int a : 1; /* time adjustment bit */ | ||
| 78 | unsigned int net_id : 8; /* ETR network id */ | ||
| 79 | unsigned int etr_id : 8; /* id of ETR which sends data frames */ | ||
| 80 | unsigned int etr_pn : 8; /* port number of ETR output port */ | ||
| 81 | } __attribute__ ((packed)); | ||
| 82 | |||
| 83 | struct etr_edf2 { | ||
| 84 | unsigned int etv : 32; /* Upper 32 bits of TOD. */ | ||
| 85 | } __attribute__ ((packed)); | ||
| 86 | |||
| 87 | struct etr_edf3 { | ||
| 88 | unsigned int rc : 8; /* failure reason code */ | ||
| 89 | unsigned int _pad0 : 3; /* must be 000 */ | ||
| 90 | unsigned int c : 1; /* ETR coupled bit */ | ||
| 91 | unsigned int tc : 4; /* ETR type code */ | ||
| 92 | unsigned int blto : 8; /* biased local time offset */ | ||
| 93 | /* (blto - 128) * 15 = minutes */ | ||
| 94 | unsigned int buo : 8; /* biased utc offset */ | ||
| 95 | /* (buo - 128) = leap seconds */ | ||
| 96 | } __attribute__ ((packed)); | ||
| 97 | |||
| 98 | struct etr_edf4 { | ||
| 99 | unsigned int ed : 8; /* ETS device dependent data */ | ||
| 100 | unsigned int _pad0 : 1; /* must be 0 */ | ||
| 101 | unsigned int buc : 5; /* biased ut1 correction */ | ||
| 102 | /* (buc - 16) * 0.1 seconds */ | ||
| 103 | unsigned int em : 6; /* ETS error magnitude */ | ||
| 104 | unsigned int dc : 6; /* ETS drift code */ | ||
| 105 | unsigned int sc : 6; /* ETS steering code */ | ||
| 106 | } __attribute__ ((packed)); | ||
| 107 | |||
| 108 | /* | ||
| 109 | * ETR attachment information block, two formats | ||
| 110 | * format 1 has 4 reserved words with a size of 64 bytes | ||
| 111 | * format 2 has 16 reserved words with a size of 96 bytes | ||
| 112 | */ | ||
| 113 | struct etr_aib { | ||
| 114 | struct etr_esw esw; | ||
| 115 | struct etr_slsw slsw; | ||
| 116 | unsigned long long tsp; | ||
| 117 | struct etr_edf1 edf1; | ||
| 118 | struct etr_edf2 edf2; | ||
| 119 | struct etr_edf3 edf3; | ||
| 120 | struct etr_edf4 edf4; | ||
| 121 | unsigned int reserved[16]; | ||
| 122 | } __attribute__ ((packed,aligned(8))); | ||
| 123 | |||
| 124 | /* ETR interruption parameter */ | ||
| 125 | struct etr_interruption_parameter { | ||
| 126 | unsigned int _pad0 : 8; | ||
| 127 | unsigned int pc0 : 1; /* port 0 state change */ | ||
| 128 | unsigned int pc1 : 1; /* port 1 state change */ | ||
| 129 | unsigned int _pad1 : 3; | ||
| 130 | unsigned int eai : 1; /* ETR alert indication */ | ||
| 131 | unsigned int _pad2 : 18; | ||
| 132 | } __attribute__ ((packed)); | ||
| 133 | |||
| 134 | /* Query TOD offset result */ | ||
| 135 | struct etr_ptff_qto { | ||
| 136 | unsigned long long physical_clock; | ||
| 137 | unsigned long long tod_offset; | ||
| 138 | unsigned long long logical_tod_offset; | ||
| 139 | unsigned long long tod_epoch_difference; | ||
| 140 | } __attribute__ ((packed)); | ||
| 141 | |||
| 142 | /* Inline assembly helper functions */ | ||
| 143 | static inline int etr_setr(struct etr_eacr *ctrl) | ||
| 144 | { | ||
| 145 | int rc = -ENOSYS; | ||
| 146 | |||
| 147 | asm volatile( | ||
| 148 | " .insn s,0xb2160000,0(%2)\n" | ||
| 149 | "0: la %0,0\n" | ||
| 150 | "1:\n" | ||
| 151 | EX_TABLE(0b,1b) | ||
| 152 | : "+d" (rc) : "m" (*ctrl), "a" (ctrl)); | ||
| 153 | return rc; | ||
| 154 | } | ||
| 155 | |||
| 156 | /* Stores a format 1 aib with 64 bytes */ | ||
| 157 | static inline int etr_stetr(struct etr_aib *aib) | ||
| 158 | { | ||
| 159 | int rc = -ENOSYS; | ||
| 160 | |||
| 161 | asm volatile( | ||
| 162 | " .insn s,0xb2170000,0(%2)\n" | ||
| 163 | "0: la %0,0\n" | ||
| 164 | "1:\n" | ||
| 165 | EX_TABLE(0b,1b) | ||
| 166 | : "+d" (rc) : "m" (*aib), "a" (aib)); | ||
| 167 | return rc; | ||
| 168 | } | ||
| 169 | |||
| 170 | /* Stores a format 2 aib with 96 bytes for specified port */ | ||
| 171 | static inline int etr_steai(struct etr_aib *aib, unsigned int func) | ||
| 172 | { | ||
| 173 | register unsigned int reg0 asm("0") = func; | ||
| 174 | int rc = -ENOSYS; | ||
| 175 | |||
| 176 | asm volatile( | ||
| 177 | " .insn s,0xb2b30000,0(%2)\n" | ||
| 178 | "0: la %0,0\n" | ||
| 179 | "1:\n" | ||
| 180 | EX_TABLE(0b,1b) | ||
| 181 | : "+d" (rc) : "m" (*aib), "a" (aib), "d" (reg0)); | ||
| 182 | return rc; | ||
| 183 | } | ||
| 184 | |||
| 185 | /* Function codes for the steai instruction. */ | ||
| 186 | #define ETR_STEAI_STEPPING_PORT 0x10 | ||
| 187 | #define ETR_STEAI_ALTERNATE_PORT 0x11 | ||
| 188 | #define ETR_STEAI_PORT_0 0x12 | ||
| 189 | #define ETR_STEAI_PORT_1 0x13 | ||
| 190 | |||
| 191 | static inline int etr_ptff(void *ptff_block, unsigned int func) | ||
| 192 | { | ||
| 193 | register unsigned int reg0 asm("0") = func; | ||
| 194 | register unsigned long reg1 asm("1") = (unsigned long) ptff_block; | ||
| 195 | int rc = -ENOSYS; | ||
| 196 | |||
| 197 | asm volatile( | ||
| 198 | " .word 0x0104\n" | ||
| 199 | " ipm %0\n" | ||
| 200 | " srl %0,28\n" | ||
| 201 | : "=d" (rc), "=m" (ptff_block) | ||
| 202 | : "d" (reg0), "d" (reg1), "m" (ptff_block) : "cc"); | ||
| 203 | return rc; | ||
| 204 | } | ||
| 205 | |||
| 206 | /* Function codes for the ptff instruction. */ | ||
| 207 | #define ETR_PTFF_QAF 0x00 /* query available functions */ | ||
| 208 | #define ETR_PTFF_QTO 0x01 /* query tod offset */ | ||
| 209 | #define ETR_PTFF_QSI 0x02 /* query steering information */ | ||
| 210 | #define ETR_PTFF_ATO 0x40 /* adjust tod offset */ | ||
| 211 | #define ETR_PTFF_STO 0x41 /* set tod offset */ | ||
| 212 | #define ETR_PTFF_SFS 0x42 /* set fine steering rate */ | ||
| 213 | #define ETR_PTFF_SGS 0x43 /* set gross steering rate */ | ||
| 214 | |||
| 215 | /* Functions needed by the machine check handler */ | ||
| 216 | extern void etr_switch_to_local(void); | ||
| 217 | extern void etr_sync_check(void); | ||
| 218 | |||
| 219 | #endif /* __S390_ETR_H */ | ||
diff --git a/include/asm-s390/hardirq.h b/include/asm-s390/hardirq.h index c2f6a8782d31..31beb18cb3d1 100644 --- a/include/asm-s390/hardirq.h +++ b/include/asm-s390/hardirq.h | |||
| @@ -32,6 +32,6 @@ typedef struct { | |||
| 32 | 32 | ||
| 33 | #define HARDIRQ_BITS 8 | 33 | #define HARDIRQ_BITS 8 |
| 34 | 34 | ||
| 35 | extern void account_ticks(void); | 35 | extern void account_ticks(u64 time); |
| 36 | 36 | ||
| 37 | #endif /* __ASM_HARDIRQ_H */ | 37 | #endif /* __ASM_HARDIRQ_H */ |
diff --git a/include/asm-s390/io.h b/include/asm-s390/io.h index efb7de9c1c6b..a4c2d550dad4 100644 --- a/include/asm-s390/io.h +++ b/include/asm-s390/io.h | |||
| @@ -28,11 +28,7 @@ static inline unsigned long virt_to_phys(volatile void * address) | |||
| 28 | { | 28 | { |
| 29 | unsigned long real_address; | 29 | unsigned long real_address; |
| 30 | asm volatile( | 30 | asm volatile( |
| 31 | #ifndef __s390x__ | ||
| 32 | " lra %0,0(%1)\n" | 31 | " lra %0,0(%1)\n" |
| 33 | #else /* __s390x__ */ | ||
| 34 | " lrag %0,0(%1)\n" | ||
| 35 | #endif /* __s390x__ */ | ||
| 36 | " jz 0f\n" | 32 | " jz 0f\n" |
| 37 | " la %0,0\n" | 33 | " la %0,0\n" |
| 38 | "0:" | 34 | "0:" |
diff --git a/include/asm-s390/kdebug.h b/include/asm-s390/kdebug.h index 40cc68025e01..1b50f89819a4 100644 --- a/include/asm-s390/kdebug.h +++ b/include/asm-s390/kdebug.h | |||
| @@ -26,7 +26,6 @@ extern int register_page_fault_notifier(struct notifier_block *); | |||
| 26 | extern int unregister_page_fault_notifier(struct notifier_block *); | 26 | extern int unregister_page_fault_notifier(struct notifier_block *); |
| 27 | extern struct atomic_notifier_head s390die_chain; | 27 | extern struct atomic_notifier_head s390die_chain; |
| 28 | 28 | ||
| 29 | |||
| 30 | enum die_val { | 29 | enum die_val { |
| 31 | DIE_OOPS = 1, | 30 | DIE_OOPS = 1, |
| 32 | DIE_BPT, | 31 | DIE_BPT, |
| @@ -56,4 +55,6 @@ static inline int notify_die(enum die_val val, const char *str, | |||
| 56 | return atomic_notifier_call_chain(&s390die_chain, val, &args); | 55 | return atomic_notifier_call_chain(&s390die_chain, val, &args); |
| 57 | } | 56 | } |
| 58 | 57 | ||
| 58 | extern void die(const char *, struct pt_regs *, long); | ||
| 59 | |||
| 59 | #endif | 60 | #endif |
diff --git a/include/asm-s390/lowcore.h b/include/asm-s390/lowcore.h index 74f7389bd3ee..4a31d0a7ee83 100644 --- a/include/asm-s390/lowcore.h +++ b/include/asm-s390/lowcore.h | |||
| @@ -220,7 +220,8 @@ struct _lowcore | |||
| 220 | __u32 kernel_asce; /* 0xc4c */ | 220 | __u32 kernel_asce; /* 0xc4c */ |
| 221 | __u32 user_asce; /* 0xc50 */ | 221 | __u32 user_asce; /* 0xc50 */ |
| 222 | __u32 panic_stack; /* 0xc54 */ | 222 | __u32 panic_stack; /* 0xc54 */ |
| 223 | __u8 pad10[0xc60-0xc58]; /* 0xc58 */ | 223 | __u32 user_exec_asce; /* 0xc58 */ |
| 224 | __u8 pad10[0xc60-0xc5c]; /* 0xc5c */ | ||
| 224 | /* entry.S sensitive area start */ | 225 | /* entry.S sensitive area start */ |
| 225 | struct cpuinfo_S390 cpu_data; /* 0xc60 */ | 226 | struct cpuinfo_S390 cpu_data; /* 0xc60 */ |
| 226 | __u32 ipl_device; /* 0xc7c */ | 227 | __u32 ipl_device; /* 0xc7c */ |
| @@ -310,7 +311,8 @@ struct _lowcore | |||
| 310 | __u64 kernel_asce; /* 0xd58 */ | 311 | __u64 kernel_asce; /* 0xd58 */ |
| 311 | __u64 user_asce; /* 0xd60 */ | 312 | __u64 user_asce; /* 0xd60 */ |
| 312 | __u64 panic_stack; /* 0xd68 */ | 313 | __u64 panic_stack; /* 0xd68 */ |
| 313 | __u8 pad10[0xd80-0xd70]; /* 0xd70 */ | 314 | __u64 user_exec_asce; /* 0xd70 */ |
| 315 | __u8 pad10[0xd80-0xd78]; /* 0xd78 */ | ||
| 314 | /* entry.S sensitive area start */ | 316 | /* entry.S sensitive area start */ |
| 315 | struct cpuinfo_S390 cpu_data; /* 0xd80 */ | 317 | struct cpuinfo_S390 cpu_data; /* 0xd80 */ |
| 316 | __u32 ipl_device; /* 0xdb8 */ | 318 | __u32 ipl_device; /* 0xdb8 */ |
diff --git a/include/asm-s390/mmu_context.h b/include/asm-s390/mmu_context.h index bcf24a873874..1d21da220d49 100644 --- a/include/asm-s390/mmu_context.h +++ b/include/asm-s390/mmu_context.h | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #ifndef __S390_MMU_CONTEXT_H | 9 | #ifndef __S390_MMU_CONTEXT_H |
| 10 | #define __S390_MMU_CONTEXT_H | 10 | #define __S390_MMU_CONTEXT_H |
| 11 | 11 | ||
| 12 | #include <asm/pgalloc.h> | ||
| 12 | /* | 13 | /* |
| 13 | * get a new mmu context.. S390 don't know about contexts. | 14 | * get a new mmu context.. S390 don't know about contexts. |
| 14 | */ | 15 | */ |
| @@ -16,29 +17,44 @@ | |||
| 16 | 17 | ||
| 17 | #define destroy_context(mm) do { } while (0) | 18 | #define destroy_context(mm) do { } while (0) |
| 18 | 19 | ||
| 20 | #ifndef __s390x__ | ||
| 21 | #define LCTL_OPCODE "lctl" | ||
| 22 | #define PGTABLE_BITS (_SEGMENT_TABLE|USER_STD_MASK) | ||
| 23 | #else | ||
| 24 | #define LCTL_OPCODE "lctlg" | ||
| 25 | #define PGTABLE_BITS (_REGION_TABLE|USER_STD_MASK) | ||
| 26 | #endif | ||
| 27 | |||
| 19 | static inline void enter_lazy_tlb(struct mm_struct *mm, | 28 | static inline void enter_lazy_tlb(struct mm_struct *mm, |
| 20 | struct task_struct *tsk) | 29 | struct task_struct *tsk) |
| 21 | { | 30 | { |
| 22 | } | 31 | } |
| 23 | 32 | ||
| 24 | static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, | 33 | static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, |
| 25 | struct task_struct *tsk) | 34 | struct task_struct *tsk) |
| 26 | { | 35 | { |
| 27 | if (prev != next) { | 36 | pgd_t *shadow_pgd = get_shadow_pgd(next->pgd); |
| 28 | #ifndef __s390x__ | 37 | |
| 29 | S390_lowcore.user_asce = (__pa(next->pgd)&PAGE_MASK) | | 38 | if (prev != next) { |
| 30 | (_SEGMENT_TABLE|USER_STD_MASK); | 39 | S390_lowcore.user_asce = (__pa(next->pgd) & PAGE_MASK) | |
| 31 | /* Load home space page table origin. */ | 40 | PGTABLE_BITS; |
| 32 | asm volatile("lctl 13,13,%0" | 41 | if (shadow_pgd) { |
| 33 | : : "m" (S390_lowcore.user_asce) ); | 42 | /* Load primary/secondary space page table origin. */ |
| 34 | #else /* __s390x__ */ | 43 | S390_lowcore.user_exec_asce = |
| 35 | S390_lowcore.user_asce = (__pa(next->pgd) & PAGE_MASK) | | 44 | (__pa(shadow_pgd) & PAGE_MASK) | PGTABLE_BITS; |
| 36 | (_REGION_TABLE|USER_STD_MASK); | 45 | asm volatile(LCTL_OPCODE" 1,1,%0\n" |
| 37 | /* Load home space page table origin. */ | 46 | LCTL_OPCODE" 7,7,%1" |
| 38 | asm volatile("lctlg 13,13,%0" | 47 | : : "m" (S390_lowcore.user_exec_asce), |
| 39 | : : "m" (S390_lowcore.user_asce) ); | 48 | "m" (S390_lowcore.user_asce) ); |
| 40 | #endif /* __s390x__ */ | 49 | } else if (switch_amode) { |
| 41 | } | 50 | /* Load primary space page table origin. */ |
| 51 | asm volatile(LCTL_OPCODE" 1,1,%0" | ||
| 52 | : : "m" (S390_lowcore.user_asce) ); | ||
| 53 | } else | ||
| 54 | /* Load home space page table origin. */ | ||
| 55 | asm volatile(LCTL_OPCODE" 13,13,%0" | ||
| 56 | : : "m" (S390_lowcore.user_asce) ); | ||
| 57 | } | ||
| 42 | cpu_set(smp_processor_id(), next->cpu_vm_mask); | 58 | cpu_set(smp_processor_id(), next->cpu_vm_mask); |
| 43 | } | 59 | } |
| 44 | 60 | ||
| @@ -51,4 +67,4 @@ static inline void activate_mm(struct mm_struct *prev, | |||
| 51 | set_fs(current->thread.mm_segment); | 67 | set_fs(current->thread.mm_segment); |
| 52 | } | 68 | } |
| 53 | 69 | ||
| 54 | #endif | 70 | #endif /* __S390_MMU_CONTEXT_H */ |
diff --git a/include/asm-s390/pgalloc.h b/include/asm-s390/pgalloc.h index 0707a7e2fc16..56c8a6c80e2e 100644 --- a/include/asm-s390/pgalloc.h +++ b/include/asm-s390/pgalloc.h | |||
| @@ -47,6 +47,17 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm) | |||
| 47 | 47 | ||
| 48 | if (!pgd) | 48 | if (!pgd) |
| 49 | return NULL; | 49 | return NULL; |
| 50 | if (s390_noexec) { | ||
| 51 | pgd_t *shadow_pgd = (pgd_t *) | ||
| 52 | __get_free_pages(GFP_KERNEL, PGD_ALLOC_ORDER); | ||
| 53 | struct page *page = virt_to_page(pgd); | ||
| 54 | |||
| 55 | if (!shadow_pgd) { | ||
| 56 | free_pages((unsigned long) pgd, PGD_ALLOC_ORDER); | ||
| 57 | return NULL; | ||
| 58 | } | ||
| 59 | page->lru.next = (void *) shadow_pgd; | ||
| 60 | } | ||
| 50 | for (i = 0; i < PTRS_PER_PGD; i++) | 61 | for (i = 0; i < PTRS_PER_PGD; i++) |
| 51 | #ifndef __s390x__ | 62 | #ifndef __s390x__ |
| 52 | pmd_clear(pmd_offset(pgd + i, i*PGDIR_SIZE)); | 63 | pmd_clear(pmd_offset(pgd + i, i*PGDIR_SIZE)); |
| @@ -58,6 +69,10 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm) | |||
| 58 | 69 | ||
| 59 | static inline void pgd_free(pgd_t *pgd) | 70 | static inline void pgd_free(pgd_t *pgd) |
| 60 | { | 71 | { |
| 72 | pgd_t *shadow_pgd = get_shadow_pgd(pgd); | ||
| 73 | |||
| 74 | if (shadow_pgd) | ||
| 75 | free_pages((unsigned long) shadow_pgd, PGD_ALLOC_ORDER); | ||
| 61 | free_pages((unsigned long) pgd, PGD_ALLOC_ORDER); | 76 | free_pages((unsigned long) pgd, PGD_ALLOC_ORDER); |
| 62 | } | 77 | } |
| 63 | 78 | ||
| @@ -71,6 +86,7 @@ static inline void pgd_free(pgd_t *pgd) | |||
| 71 | #define pmd_free(x) do { } while (0) | 86 | #define pmd_free(x) do { } while (0) |
| 72 | #define __pmd_free_tlb(tlb,x) do { } while (0) | 87 | #define __pmd_free_tlb(tlb,x) do { } while (0) |
| 73 | #define pgd_populate(mm, pmd, pte) BUG() | 88 | #define pgd_populate(mm, pmd, pte) BUG() |
| 89 | #define pgd_populate_kernel(mm, pmd, pte) BUG() | ||
| 74 | #else /* __s390x__ */ | 90 | #else /* __s390x__ */ |
| 75 | static inline pmd_t * pmd_alloc_one(struct mm_struct *mm, unsigned long vmaddr) | 91 | static inline pmd_t * pmd_alloc_one(struct mm_struct *mm, unsigned long vmaddr) |
| 76 | { | 92 | { |
| @@ -79,6 +95,17 @@ static inline pmd_t * pmd_alloc_one(struct mm_struct *mm, unsigned long vmaddr) | |||
| 79 | 95 | ||
| 80 | if (!pmd) | 96 | if (!pmd) |
| 81 | return NULL; | 97 | return NULL; |
| 98 | if (s390_noexec) { | ||
| 99 | pmd_t *shadow_pmd = (pmd_t *) | ||
| 100 | __get_free_pages(GFP_KERNEL, PMD_ALLOC_ORDER); | ||
| 101 | struct page *page = virt_to_page(pmd); | ||
| 102 | |||
| 103 | if (!shadow_pmd) { | ||
| 104 | free_pages((unsigned long) pmd, PMD_ALLOC_ORDER); | ||
| 105 | return NULL; | ||
| 106 | } | ||
| 107 | page->lru.next = (void *) shadow_pmd; | ||
| 108 | } | ||
| 82 | for (i=0; i < PTRS_PER_PMD; i++) | 109 | for (i=0; i < PTRS_PER_PMD; i++) |
| 83 | pmd_clear(pmd + i); | 110 | pmd_clear(pmd + i); |
| 84 | return pmd; | 111 | return pmd; |
| @@ -86,6 +113,10 @@ static inline pmd_t * pmd_alloc_one(struct mm_struct *mm, unsigned long vmaddr) | |||
| 86 | 113 | ||
| 87 | static inline void pmd_free (pmd_t *pmd) | 114 | static inline void pmd_free (pmd_t *pmd) |
| 88 | { | 115 | { |
| 116 | pmd_t *shadow_pmd = get_shadow_pmd(pmd); | ||
| 117 | |||
| 118 | if (shadow_pmd) | ||
| 119 | free_pages((unsigned long) shadow_pmd, PMD_ALLOC_ORDER); | ||
| 89 | free_pages((unsigned long) pmd, PMD_ALLOC_ORDER); | 120 | free_pages((unsigned long) pmd, PMD_ALLOC_ORDER); |
| 90 | } | 121 | } |
| 91 | 122 | ||
| @@ -95,11 +126,22 @@ static inline void pmd_free (pmd_t *pmd) | |||
| 95 | pmd_free(pmd); \ | 126 | pmd_free(pmd); \ |
| 96 | } while (0) | 127 | } while (0) |
| 97 | 128 | ||
| 98 | static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd) | 129 | static inline void |
| 130 | pgd_populate_kernel(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd) | ||
| 99 | { | 131 | { |
| 100 | pgd_val(*pgd) = _PGD_ENTRY | __pa(pmd); | 132 | pgd_val(*pgd) = _PGD_ENTRY | __pa(pmd); |
| 101 | } | 133 | } |
| 102 | 134 | ||
| 135 | static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd) | ||
| 136 | { | ||
| 137 | pgd_t *shadow_pgd = get_shadow_pgd(pgd); | ||
| 138 | pmd_t *shadow_pmd = get_shadow_pmd(pmd); | ||
| 139 | |||
| 140 | if (shadow_pgd && shadow_pmd) | ||
| 141 | pgd_populate_kernel(mm, shadow_pgd, shadow_pmd); | ||
| 142 | pgd_populate_kernel(mm, pgd, pmd); | ||
| 143 | } | ||
| 144 | |||
| 103 | #endif /* __s390x__ */ | 145 | #endif /* __s390x__ */ |
| 104 | 146 | ||
| 105 | static inline void | 147 | static inline void |
| @@ -119,7 +161,13 @@ pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, pte_t *pte) | |||
| 119 | static inline void | 161 | static inline void |
| 120 | pmd_populate(struct mm_struct *mm, pmd_t *pmd, struct page *page) | 162 | pmd_populate(struct mm_struct *mm, pmd_t *pmd, struct page *page) |
| 121 | { | 163 | { |
| 122 | pmd_populate_kernel(mm, pmd, (pte_t *)page_to_phys(page)); | 164 | pte_t *pte = (pte_t *)page_to_phys(page); |
| 165 | pmd_t *shadow_pmd = get_shadow_pmd(pmd); | ||
| 166 | pte_t *shadow_pte = get_shadow_pte(pte); | ||
| 167 | |||
| 168 | pmd_populate_kernel(mm, pmd, pte); | ||
| 169 | if (shadow_pmd && shadow_pte) | ||
| 170 | pmd_populate_kernel(mm, shadow_pmd, shadow_pte); | ||
| 123 | } | 171 | } |
| 124 | 172 | ||
| 125 | /* | 173 | /* |
| @@ -133,6 +181,17 @@ pte_alloc_one_kernel(struct mm_struct *mm, unsigned long vmaddr) | |||
| 133 | 181 | ||
| 134 | if (!pte) | 182 | if (!pte) |
| 135 | return NULL; | 183 | return NULL; |
| 184 | if (s390_noexec) { | ||
| 185 | pte_t *shadow_pte = (pte_t *) | ||
| 186 | __get_free_page(GFP_KERNEL|__GFP_REPEAT); | ||
| 187 | struct page *page = virt_to_page(pte); | ||
| 188 | |||
| 189 | if (!shadow_pte) { | ||
| 190 | free_page((unsigned long) pte); | ||
| 191 | return NULL; | ||
| 192 | } | ||
| 193 | page->lru.next = (void *) shadow_pte; | ||
| 194 | } | ||
| 136 | for (i=0; i < PTRS_PER_PTE; i++) { | 195 | for (i=0; i < PTRS_PER_PTE; i++) { |
| 137 | pte_clear(mm, vmaddr, pte + i); | 196 | pte_clear(mm, vmaddr, pte + i); |
| 138 | vmaddr += PAGE_SIZE; | 197 | vmaddr += PAGE_SIZE; |
| @@ -151,14 +210,30 @@ pte_alloc_one(struct mm_struct *mm, unsigned long vmaddr) | |||
| 151 | 210 | ||
| 152 | static inline void pte_free_kernel(pte_t *pte) | 211 | static inline void pte_free_kernel(pte_t *pte) |
| 153 | { | 212 | { |
| 154 | free_page((unsigned long) pte); | 213 | pte_t *shadow_pte = get_shadow_pte(pte); |
| 214 | |||
| 215 | if (shadow_pte) | ||
| 216 | free_page((unsigned long) shadow_pte); | ||
| 217 | free_page((unsigned long) pte); | ||
| 155 | } | 218 | } |
| 156 | 219 | ||
| 157 | static inline void pte_free(struct page *pte) | 220 | static inline void pte_free(struct page *pte) |
| 158 | { | 221 | { |
| 159 | __free_page(pte); | 222 | struct page *shadow_page = get_shadow_page(pte); |
| 223 | |||
| 224 | if (shadow_page) | ||
| 225 | __free_page(shadow_page); | ||
| 226 | __free_page(pte); | ||
| 160 | } | 227 | } |
| 161 | 228 | ||
| 162 | #define __pte_free_tlb(tlb,pte) tlb_remove_page(tlb,pte) | 229 | #define __pte_free_tlb(tlb, pte) \ |
| 230 | ({ \ | ||
| 231 | struct mmu_gather *__tlb = (tlb); \ | ||
| 232 | struct page *__pte = (pte); \ | ||
| 233 | struct page *shadow_page = get_shadow_page(__pte); \ | ||
| 234 | if (shadow_page) \ | ||
| 235 | tlb_remove_page(__tlb, shadow_page); \ | ||
| 236 | tlb_remove_page(__tlb, __pte); \ | ||
| 237 | }) | ||
| 163 | 238 | ||
| 164 | #endif /* _S390_PGALLOC_H */ | 239 | #endif /* _S390_PGALLOC_H */ |
diff --git a/include/asm-s390/pgtable.h b/include/asm-s390/pgtable.h index ae61aca5d483..13c16546eff5 100644 --- a/include/asm-s390/pgtable.h +++ b/include/asm-s390/pgtable.h | |||
| @@ -40,6 +40,7 @@ struct mm_struct; | |||
| 40 | 40 | ||
| 41 | extern pgd_t swapper_pg_dir[] __attribute__ ((aligned (4096))); | 41 | extern pgd_t swapper_pg_dir[] __attribute__ ((aligned (4096))); |
| 42 | extern void paging_init(void); | 42 | extern void paging_init(void); |
| 43 | extern void vmem_map_init(void); | ||
| 43 | 44 | ||
| 44 | /* | 45 | /* |
| 45 | * The S390 doesn't have any external MMU info: the kernel page | 46 | * The S390 doesn't have any external MMU info: the kernel page |
| @@ -223,6 +224,8 @@ extern unsigned long vmalloc_end; | |||
| 223 | #define _PAGE_TYPE_FILE 0x601 /* bit 0x002 is used for offset !! */ | 224 | #define _PAGE_TYPE_FILE 0x601 /* bit 0x002 is used for offset !! */ |
| 224 | #define _PAGE_TYPE_RO 0x200 | 225 | #define _PAGE_TYPE_RO 0x200 |
| 225 | #define _PAGE_TYPE_RW 0x000 | 226 | #define _PAGE_TYPE_RW 0x000 |
| 227 | #define _PAGE_TYPE_EX_RO 0x202 | ||
| 228 | #define _PAGE_TYPE_EX_RW 0x002 | ||
| 226 | 229 | ||
| 227 | /* | 230 | /* |
| 228 | * PTE type bits are rather complicated. handle_pte_fault uses pte_present, | 231 | * PTE type bits are rather complicated. handle_pte_fault uses pte_present, |
| @@ -243,11 +246,13 @@ extern unsigned long vmalloc_end; | |||
| 243 | * _PAGE_TYPE_FILE 11?1 -> 11?1 | 246 | * _PAGE_TYPE_FILE 11?1 -> 11?1 |
| 244 | * _PAGE_TYPE_RO 0100 -> 1100 | 247 | * _PAGE_TYPE_RO 0100 -> 1100 |
| 245 | * _PAGE_TYPE_RW 0000 -> 1000 | 248 | * _PAGE_TYPE_RW 0000 -> 1000 |
| 249 | * _PAGE_TYPE_EX_RO 0110 -> 1110 | ||
| 250 | * _PAGE_TYPE_EX_RW 0010 -> 1010 | ||
| 246 | * | 251 | * |
| 247 | * pte_none is true for bits combinations 1000, 1100 | 252 | * pte_none is true for bits combinations 1000, 1010, 1100, 1110 |
| 248 | * pte_present is true for bits combinations 0000, 0010, 0100, 0110, 1001 | 253 | * pte_present is true for bits combinations 0000, 0010, 0100, 0110, 1001 |
| 249 | * pte_file is true for bits combinations 1101, 1111 | 254 | * pte_file is true for bits combinations 1101, 1111 |
| 250 | * swap pte is 1011 and 0001, 0011, 0101, 0111, 1010 and 1110 are invalid. | 255 | * swap pte is 1011 and 0001, 0011, 0101, 0111 are invalid. |
| 251 | */ | 256 | */ |
| 252 | 257 | ||
| 253 | #ifndef __s390x__ | 258 | #ifndef __s390x__ |
| @@ -312,33 +317,100 @@ extern unsigned long vmalloc_end; | |||
| 312 | #define PAGE_NONE __pgprot(_PAGE_TYPE_NONE) | 317 | #define PAGE_NONE __pgprot(_PAGE_TYPE_NONE) |
| 313 | #define PAGE_RO __pgprot(_PAGE_TYPE_RO) | 318 | #define PAGE_RO __pgprot(_PAGE_TYPE_RO) |
| 314 | #define PAGE_RW __pgprot(_PAGE_TYPE_RW) | 319 | #define PAGE_RW __pgprot(_PAGE_TYPE_RW) |
| 320 | #define PAGE_EX_RO __pgprot(_PAGE_TYPE_EX_RO) | ||
| 321 | #define PAGE_EX_RW __pgprot(_PAGE_TYPE_EX_RW) | ||
| 315 | 322 | ||
| 316 | #define PAGE_KERNEL PAGE_RW | 323 | #define PAGE_KERNEL PAGE_RW |
| 317 | #define PAGE_COPY PAGE_RO | 324 | #define PAGE_COPY PAGE_RO |
| 318 | 325 | ||
| 319 | /* | 326 | /* |
| 320 | * The S390 can't do page protection for execute, and considers that the | 327 | * Dependent on the EXEC_PROTECT option s390 can do execute protection. |
| 321 | * same are read. Also, write permissions imply read permissions. This is | 328 | * Write permission always implies read permission. In theory with a |
| 322 | * the closest we can get.. | 329 | * primary/secondary page table execute only can be implemented but |
| 330 | * it would cost an additional bit in the pte to distinguish all the | ||
| 331 | * different pte types. To avoid that execute permission currently | ||
| 332 | * implies read permission as well. | ||
| 323 | */ | 333 | */ |
| 324 | /*xwr*/ | 334 | /*xwr*/ |
| 325 | #define __P000 PAGE_NONE | 335 | #define __P000 PAGE_NONE |
| 326 | #define __P001 PAGE_RO | 336 | #define __P001 PAGE_RO |
| 327 | #define __P010 PAGE_RO | 337 | #define __P010 PAGE_RO |
| 328 | #define __P011 PAGE_RO | 338 | #define __P011 PAGE_RO |
| 329 | #define __P100 PAGE_RO | 339 | #define __P100 PAGE_EX_RO |
| 330 | #define __P101 PAGE_RO | 340 | #define __P101 PAGE_EX_RO |
| 331 | #define __P110 PAGE_RO | 341 | #define __P110 PAGE_EX_RO |
| 332 | #define __P111 PAGE_RO | 342 | #define __P111 PAGE_EX_RO |
| 333 | 343 | ||
| 334 | #define __S000 PAGE_NONE | 344 | #define __S000 PAGE_NONE |
| 335 | #define __S001 PAGE_RO | 345 | #define __S001 PAGE_RO |
| 336 | #define __S010 PAGE_RW | 346 | #define __S010 PAGE_RW |
| 337 | #define __S011 PAGE_RW | 347 | #define __S011 PAGE_RW |
| 338 | #define __S100 PAGE_RO | 348 | #define __S100 PAGE_EX_RO |
| 339 | #define __S101 PAGE_RO | 349 | #define __S101 PAGE_EX_RO |
| 340 | #define __S110 PAGE_RW | 350 | #define __S110 PAGE_EX_RW |
| 341 | #define __S111 PAGE_RW | 351 | #define __S111 PAGE_EX_RW |
| 352 | |||
| 353 | #ifndef __s390x__ | ||
| 354 | # define PMD_SHADOW_SHIFT 1 | ||
| 355 | # define PGD_SHADOW_SHIFT 1 | ||
| 356 | #else /* __s390x__ */ | ||
| 357 | # define PMD_SHADOW_SHIFT 2 | ||
| 358 | # define PGD_SHADOW_SHIFT 2 | ||
| 359 | #endif /* __s390x__ */ | ||
| 360 | |||
| 361 | static inline struct page *get_shadow_page(struct page *page) | ||
| 362 | { | ||
| 363 | if (s390_noexec && !list_empty(&page->lru)) | ||
| 364 | return virt_to_page(page->lru.next); | ||
| 365 | return NULL; | ||
| 366 | } | ||
| 367 | |||
| 368 | static inline pte_t *get_shadow_pte(pte_t *ptep) | ||
| 369 | { | ||
| 370 | unsigned long pteptr = (unsigned long) (ptep); | ||
| 371 | |||
| 372 | if (s390_noexec) { | ||
| 373 | unsigned long offset = pteptr & (PAGE_SIZE - 1); | ||
| 374 | void *addr = (void *) (pteptr ^ offset); | ||
| 375 | struct page *page = virt_to_page(addr); | ||
| 376 | if (!list_empty(&page->lru)) | ||
| 377 | return (pte_t *) ((unsigned long) page->lru.next | | ||
| 378 | offset); | ||
| 379 | } | ||
| 380 | return NULL; | ||
| 381 | } | ||
| 382 | |||
| 383 | static inline pmd_t *get_shadow_pmd(pmd_t *pmdp) | ||
| 384 | { | ||
| 385 | unsigned long pmdptr = (unsigned long) (pmdp); | ||
| 386 | |||
| 387 | if (s390_noexec) { | ||
| 388 | unsigned long offset = pmdptr & | ||
| 389 | ((PAGE_SIZE << PMD_SHADOW_SHIFT) - 1); | ||
| 390 | void *addr = (void *) (pmdptr ^ offset); | ||
| 391 | struct page *page = virt_to_page(addr); | ||
| 392 | if (!list_empty(&page->lru)) | ||
| 393 | return (pmd_t *) ((unsigned long) page->lru.next | | ||
| 394 | offset); | ||
| 395 | } | ||
| 396 | return NULL; | ||
| 397 | } | ||
| 398 | |||
| 399 | static inline pgd_t *get_shadow_pgd(pgd_t *pgdp) | ||
| 400 | { | ||
| 401 | unsigned long pgdptr = (unsigned long) (pgdp); | ||
| 402 | |||
| 403 | if (s390_noexec) { | ||
| 404 | unsigned long offset = pgdptr & | ||
| 405 | ((PAGE_SIZE << PGD_SHADOW_SHIFT) - 1); | ||
| 406 | void *addr = (void *) (pgdptr ^ offset); | ||
| 407 | struct page *page = virt_to_page(addr); | ||
| 408 | if (!list_empty(&page->lru)) | ||
| 409 | return (pgd_t *) ((unsigned long) page->lru.next | | ||
| 410 | offset); | ||
| 411 | } | ||
| 412 | return NULL; | ||
| 413 | } | ||
| 342 | 414 | ||
| 343 | /* | 415 | /* |
| 344 | * Certain architectures need to do special things when PTEs | 416 | * Certain architectures need to do special things when PTEs |
| @@ -347,7 +419,16 @@ extern unsigned long vmalloc_end; | |||
| 347 | */ | 419 | */ |
| 348 | static inline void set_pte(pte_t *pteptr, pte_t pteval) | 420 | static inline void set_pte(pte_t *pteptr, pte_t pteval) |
| 349 | { | 421 | { |
| 422 | pte_t *shadow_pte = get_shadow_pte(pteptr); | ||
| 423 | |||
| 350 | *pteptr = pteval; | 424 | *pteptr = pteval; |
| 425 | if (shadow_pte) { | ||
| 426 | if (!(pte_val(pteval) & _PAGE_INVALID) && | ||
| 427 | (pte_val(pteval) & _PAGE_SWX)) | ||
| 428 | pte_val(*shadow_pte) = pte_val(pteval) | _PAGE_RO; | ||
| 429 | else | ||
| 430 | pte_val(*shadow_pte) = _PAGE_TYPE_EMPTY; | ||
| 431 | } | ||
| 351 | } | 432 | } |
| 352 | #define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) | 433 | #define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) |
| 353 | 434 | ||
| @@ -465,7 +546,7 @@ static inline int pte_read(pte_t pte) | |||
| 465 | 546 | ||
| 466 | static inline void pgd_clear(pgd_t * pgdp) { } | 547 | static inline void pgd_clear(pgd_t * pgdp) { } |
| 467 | 548 | ||
| 468 | static inline void pmd_clear(pmd_t * pmdp) | 549 | static inline void pmd_clear_kernel(pmd_t * pmdp) |
| 469 | { | 550 | { |
| 470 | pmd_val(pmdp[0]) = _PAGE_TABLE_INV; | 551 | pmd_val(pmdp[0]) = _PAGE_TABLE_INV; |
| 471 | pmd_val(pmdp[1]) = _PAGE_TABLE_INV; | 552 | pmd_val(pmdp[1]) = _PAGE_TABLE_INV; |
| @@ -473,24 +554,55 @@ static inline void pmd_clear(pmd_t * pmdp) | |||
| 473 | pmd_val(pmdp[3]) = _PAGE_TABLE_INV; | 554 | pmd_val(pmdp[3]) = _PAGE_TABLE_INV; |
| 474 | } | 555 | } |
| 475 | 556 | ||
| 557 | static inline void pmd_clear(pmd_t * pmdp) | ||
| 558 | { | ||
| 559 | pmd_t *shadow_pmd = get_shadow_pmd(pmdp); | ||
| 560 | |||
| 561 | pmd_clear_kernel(pmdp); | ||
| 562 | if (shadow_pmd) | ||
| 563 | pmd_clear_kernel(shadow_pmd); | ||
| 564 | } | ||
| 565 | |||
| 476 | #else /* __s390x__ */ | 566 | #else /* __s390x__ */ |
| 477 | 567 | ||
| 478 | static inline void pgd_clear(pgd_t * pgdp) | 568 | static inline void pgd_clear_kernel(pgd_t * pgdp) |
| 479 | { | 569 | { |
| 480 | pgd_val(*pgdp) = _PGD_ENTRY_INV | _PGD_ENTRY; | 570 | pgd_val(*pgdp) = _PGD_ENTRY_INV | _PGD_ENTRY; |
| 481 | } | 571 | } |
| 482 | 572 | ||
| 483 | static inline void pmd_clear(pmd_t * pmdp) | 573 | static inline void pgd_clear(pgd_t * pgdp) |
| 574 | { | ||
| 575 | pgd_t *shadow_pgd = get_shadow_pgd(pgdp); | ||
| 576 | |||
| 577 | pgd_clear_kernel(pgdp); | ||
| 578 | if (shadow_pgd) | ||
| 579 | pgd_clear_kernel(shadow_pgd); | ||
| 580 | } | ||
| 581 | |||
| 582 | static inline void pmd_clear_kernel(pmd_t * pmdp) | ||
| 484 | { | 583 | { |
| 485 | pmd_val(*pmdp) = _PMD_ENTRY_INV | _PMD_ENTRY; | 584 | pmd_val(*pmdp) = _PMD_ENTRY_INV | _PMD_ENTRY; |
| 486 | pmd_val1(*pmdp) = _PMD_ENTRY_INV | _PMD_ENTRY; | 585 | pmd_val1(*pmdp) = _PMD_ENTRY_INV | _PMD_ENTRY; |
| 487 | } | 586 | } |
| 488 | 587 | ||
| 588 | static inline void pmd_clear(pmd_t * pmdp) | ||
| 589 | { | ||
| 590 | pmd_t *shadow_pmd = get_shadow_pmd(pmdp); | ||
| 591 | |||
| 592 | pmd_clear_kernel(pmdp); | ||
| 593 | if (shadow_pmd) | ||
| 594 | pmd_clear_kernel(shadow_pmd); | ||
| 595 | } | ||
| 596 | |||
| 489 | #endif /* __s390x__ */ | 597 | #endif /* __s390x__ */ |
| 490 | 598 | ||
| 491 | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) | 599 | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) |
| 492 | { | 600 | { |
| 601 | pte_t *shadow_pte = get_shadow_pte(ptep); | ||
| 602 | |||
| 493 | pte_val(*ptep) = _PAGE_TYPE_EMPTY; | 603 | pte_val(*ptep) = _PAGE_TYPE_EMPTY; |
| 604 | if (shadow_pte) | ||
| 605 | pte_val(*shadow_pte) = _PAGE_TYPE_EMPTY; | ||
| 494 | } | 606 | } |
| 495 | 607 | ||
| 496 | /* | 608 | /* |
| @@ -608,8 +720,11 @@ ptep_clear_flush(struct vm_area_struct *vma, | |||
| 608 | unsigned long address, pte_t *ptep) | 720 | unsigned long address, pte_t *ptep) |
| 609 | { | 721 | { |
| 610 | pte_t pte = *ptep; | 722 | pte_t pte = *ptep; |
| 723 | pte_t *shadow_pte = get_shadow_pte(ptep); | ||
| 611 | 724 | ||
| 612 | __ptep_ipte(address, ptep); | 725 | __ptep_ipte(address, ptep); |
| 726 | if (shadow_pte) | ||
| 727 | __ptep_ipte(address, shadow_pte); | ||
| 613 | return pte; | 728 | return pte; |
| 614 | } | 729 | } |
| 615 | 730 | ||
diff --git a/include/asm-s390/processor.h b/include/asm-s390/processor.h index cbbedc63ba25..4c1b73940351 100644 --- a/include/asm-s390/processor.h +++ b/include/asm-s390/processor.h | |||
| @@ -50,6 +50,7 @@ struct cpuinfo_S390 | |||
| 50 | unsigned long pgtable_cache_sz; | 50 | unsigned long pgtable_cache_sz; |
| 51 | }; | 51 | }; |
| 52 | 52 | ||
| 53 | extern void s390_adjust_jiffies(void); | ||
| 53 | extern void print_cpu_info(struct cpuinfo_S390 *); | 54 | extern void print_cpu_info(struct cpuinfo_S390 *); |
| 54 | 55 | ||
| 55 | /* Lazy FPU handling on uni-processor */ | 56 | /* Lazy FPU handling on uni-processor */ |
| @@ -144,7 +145,8 @@ struct stack_frame { | |||
| 144 | #ifndef __s390x__ | 145 | #ifndef __s390x__ |
| 145 | 146 | ||
| 146 | #define start_thread(regs, new_psw, new_stackp) do { \ | 147 | #define start_thread(regs, new_psw, new_stackp) do { \ |
| 147 | regs->psw.mask = PSW_USER_BITS; \ | 148 | set_fs(USER_DS); \ |
| 149 | regs->psw.mask = psw_user_bits; \ | ||
| 148 | regs->psw.addr = new_psw | PSW_ADDR_AMODE; \ | 150 | regs->psw.addr = new_psw | PSW_ADDR_AMODE; \ |
| 149 | regs->gprs[15] = new_stackp ; \ | 151 | regs->gprs[15] = new_stackp ; \ |
| 150 | } while (0) | 152 | } while (0) |
| @@ -152,13 +154,15 @@ struct stack_frame { | |||
| 152 | #else /* __s390x__ */ | 154 | #else /* __s390x__ */ |
| 153 | 155 | ||
| 154 | #define start_thread(regs, new_psw, new_stackp) do { \ | 156 | #define start_thread(regs, new_psw, new_stackp) do { \ |
| 155 | regs->psw.mask = PSW_USER_BITS; \ | 157 | set_fs(USER_DS); \ |
| 158 | regs->psw.mask = psw_user_bits; \ | ||
| 156 | regs->psw.addr = new_psw; \ | 159 | regs->psw.addr = new_psw; \ |
| 157 | regs->gprs[15] = new_stackp; \ | 160 | regs->gprs[15] = new_stackp; \ |
| 158 | } while (0) | 161 | } while (0) |
| 159 | 162 | ||
| 160 | #define start_thread31(regs, new_psw, new_stackp) do { \ | 163 | #define start_thread31(regs, new_psw, new_stackp) do { \ |
| 161 | regs->psw.mask = PSW_USER32_BITS; \ | 164 | set_fs(USER_DS); \ |
| 165 | regs->psw.mask = psw_user32_bits; \ | ||
| 162 | regs->psw.addr = new_psw; \ | 166 | regs->psw.addr = new_psw; \ |
| 163 | regs->gprs[15] = new_stackp; \ | 167 | regs->gprs[15] = new_stackp; \ |
| 164 | } while (0) | 168 | } while (0) |
| @@ -201,9 +205,8 @@ unsigned long get_wchan(struct task_struct *p); | |||
| 201 | static inline void cpu_relax(void) | 205 | static inline void cpu_relax(void) |
| 202 | { | 206 | { |
| 203 | if (MACHINE_HAS_DIAG44) | 207 | if (MACHINE_HAS_DIAG44) |
| 204 | asm volatile("diag 0,0,68" : : : "memory"); | 208 | asm volatile("diag 0,0,68"); |
| 205 | else | 209 | barrier(); |
| 206 | barrier(); | ||
| 207 | } | 210 | } |
| 208 | 211 | ||
| 209 | /* | 212 | /* |
| @@ -328,6 +331,18 @@ static inline void disabled_wait(unsigned long code) | |||
| 328 | } | 331 | } |
| 329 | 332 | ||
| 330 | /* | 333 | /* |
| 334 | * Basic Machine Check/Program Check Handler. | ||
| 335 | */ | ||
| 336 | |||
| 337 | extern void s390_base_mcck_handler(void); | ||
| 338 | extern void s390_base_pgm_handler(void); | ||
| 339 | extern void s390_base_ext_handler(void); | ||
| 340 | |||
| 341 | extern void (*s390_base_mcck_handler_fn)(void); | ||
| 342 | extern void (*s390_base_pgm_handler_fn)(void); | ||
| 343 | extern void (*s390_base_ext_handler_fn)(void); | ||
| 344 | |||
| 345 | /* | ||
| 331 | * CPU idle notifier chain. | 346 | * CPU idle notifier chain. |
| 332 | */ | 347 | */ |
| 333 | #define CPU_IDLE 0 | 348 | #define CPU_IDLE 0 |
diff --git a/include/asm-s390/ptrace.h b/include/asm-s390/ptrace.h index 7b768c5c68a8..fa6ca87080e8 100644 --- a/include/asm-s390/ptrace.h +++ b/include/asm-s390/ptrace.h | |||
| @@ -266,17 +266,12 @@ typedef struct | |||
| 266 | #define PSW_ASC_SECONDARY 0x0000800000000000UL | 266 | #define PSW_ASC_SECONDARY 0x0000800000000000UL |
| 267 | #define PSW_ASC_HOME 0x0000C00000000000UL | 267 | #define PSW_ASC_HOME 0x0000C00000000000UL |
| 268 | 268 | ||
| 269 | #define PSW_USER32_BITS (PSW_BASE32_BITS | PSW_MASK_DAT | PSW_ASC_HOME | \ | 269 | extern long psw_user32_bits; |
| 270 | PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK | \ | ||
| 271 | PSW_MASK_PSTATE | PSW_DEFAULT_KEY) | ||
| 272 | 270 | ||
| 273 | #endif /* __s390x__ */ | 271 | #endif /* __s390x__ */ |
| 274 | 272 | ||
| 275 | #define PSW_KERNEL_BITS (PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_PRIMARY | \ | 273 | extern long psw_kernel_bits; |
| 276 | PSW_MASK_MCHECK | PSW_DEFAULT_KEY) | 274 | extern long psw_user_bits; |
| 277 | #define PSW_USER_BITS (PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_HOME | \ | ||
| 278 | PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK | \ | ||
| 279 | PSW_MASK_PSTATE | PSW_DEFAULT_KEY) | ||
| 280 | 275 | ||
| 281 | /* This macro merges a NEW PSW mask specified by the user into | 276 | /* This macro merges a NEW PSW mask specified by the user into |
| 282 | the currently active PSW mask CURRENT, modifying only those | 277 | the currently active PSW mask CURRENT, modifying only those |
diff --git a/include/asm-s390/reset.h b/include/asm-s390/reset.h index 532e65a2aafc..f584f4a52581 100644 --- a/include/asm-s390/reset.h +++ b/include/asm-s390/reset.h | |||
| @@ -18,7 +18,4 @@ struct reset_call { | |||
| 18 | extern void register_reset_call(struct reset_call *reset); | 18 | extern void register_reset_call(struct reset_call *reset); |
| 19 | extern void unregister_reset_call(struct reset_call *reset); | 19 | extern void unregister_reset_call(struct reset_call *reset); |
| 20 | extern void s390_reset_system(void); | 20 | extern void s390_reset_system(void); |
| 21 | extern void (*s390_reset_mcck_handler)(void); | ||
| 22 | extern void (*s390_reset_pgm_handler)(void); | ||
| 23 | |||
| 24 | #endif /* _ASM_S390_RESET_H */ | 21 | #endif /* _ASM_S390_RESET_H */ |
diff --git a/include/asm-s390/sclp.h b/include/asm-s390/sclp.h new file mode 100644 index 000000000000..468b97018405 --- /dev/null +++ b/include/asm-s390/sclp.h | |||
| @@ -0,0 +1,39 @@ | |||
| 1 | /* | ||
| 2 | * include/asm-s390/sclp.h | ||
| 3 | * | ||
| 4 | * Copyright IBM Corp. 2007 | ||
| 5 | * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com> | ||
| 6 | */ | ||
| 7 | |||
| 8 | #ifndef _ASM_S390_SCLP_H | ||
| 9 | #define _ASM_S390_SCLP_H | ||
| 10 | |||
| 11 | #include <linux/types.h> | ||
| 12 | |||
| 13 | struct sccb_header { | ||
| 14 | u16 length; | ||
| 15 | u8 function_code; | ||
| 16 | u8 control_mask[3]; | ||
| 17 | u16 response_code; | ||
| 18 | } __attribute__((packed)); | ||
| 19 | |||
| 20 | #define LOADPARM_LEN 8 | ||
| 21 | |||
| 22 | struct sclp_readinfo_sccb { | ||
| 23 | struct sccb_header header; /* 0-7 */ | ||
| 24 | u16 rnmax; /* 8-9 */ | ||
| 25 | u8 rnsize; /* 10 */ | ||
| 26 | u8 _reserved0[24 - 11]; /* 11-23 */ | ||
| 27 | u8 loadparm[LOADPARM_LEN]; /* 24-31 */ | ||
| 28 | u8 _reserved1[91 - 32]; /* 32-90 */ | ||
| 29 | u8 flags; /* 91 */ | ||
| 30 | u8 _reserved2[100 - 92]; /* 92-99 */ | ||
| 31 | u32 rnsize2; /* 100-103 */ | ||
| 32 | u64 rnmax2; /* 104-111 */ | ||
| 33 | u8 _reserved3[4096 - 112]; /* 112-4095 */ | ||
| 34 | } __attribute__((packed, aligned(4096))); | ||
| 35 | |||
| 36 | extern struct sclp_readinfo_sccb s390_readinfo_sccb; | ||
| 37 | extern void sclp_readinfo_early(void); | ||
| 38 | |||
| 39 | #endif /* _ASM_S390_SCLP_H */ | ||
diff --git a/include/asm-s390/sections.h b/include/asm-s390/sections.h index 3a0b8ffeab7a..1c5a2c4ccdad 100644 --- a/include/asm-s390/sections.h +++ b/include/asm-s390/sections.h | |||
| @@ -3,4 +3,6 @@ | |||
| 3 | 3 | ||
| 4 | #include <asm-generic/sections.h> | 4 | #include <asm-generic/sections.h> |
| 5 | 5 | ||
| 6 | extern char _eshared[]; | ||
| 7 | |||
| 6 | #endif | 8 | #endif |
diff --git a/include/asm-s390/setup.h b/include/asm-s390/setup.h index 9574fe80a046..3388bb52597c 100644 --- a/include/asm-s390/setup.h +++ b/include/asm-s390/setup.h | |||
| @@ -42,6 +42,18 @@ struct mem_chunk { | |||
| 42 | 42 | ||
| 43 | extern struct mem_chunk memory_chunk[]; | 43 | extern struct mem_chunk memory_chunk[]; |
| 44 | 44 | ||
| 45 | #ifdef CONFIG_S390_SWITCH_AMODE | ||
| 46 | extern unsigned int switch_amode; | ||
| 47 | #else | ||
| 48 | #define switch_amode (0) | ||
| 49 | #endif | ||
| 50 | |||
| 51 | #ifdef CONFIG_S390_EXEC_PROTECT | ||
| 52 | extern unsigned int s390_noexec; | ||
| 53 | #else | ||
| 54 | #define s390_noexec (0) | ||
| 55 | #endif | ||
| 56 | |||
| 45 | /* | 57 | /* |
| 46 | * Machine features detected in head.S | 58 | * Machine features detected in head.S |
| 47 | */ | 59 | */ |
| @@ -74,6 +86,9 @@ extern unsigned int console_mode; | |||
| 74 | extern unsigned int console_devno; | 86 | extern unsigned int console_devno; |
| 75 | extern unsigned int console_irq; | 87 | extern unsigned int console_irq; |
| 76 | 88 | ||
| 89 | extern char vmhalt_cmd[]; | ||
| 90 | extern char vmpoff_cmd[]; | ||
| 91 | |||
| 77 | #define CONSOLE_IS_UNDEFINED (console_mode == 0) | 92 | #define CONSOLE_IS_UNDEFINED (console_mode == 0) |
| 78 | #define CONSOLE_IS_SCLP (console_mode == 1) | 93 | #define CONSOLE_IS_SCLP (console_mode == 1) |
| 79 | #define CONSOLE_IS_3215 (console_mode == 2) | 94 | #define CONSOLE_IS_3215 (console_mode == 2) |
| @@ -141,13 +156,19 @@ struct ipl_parameter_block { | |||
| 141 | extern u32 ipl_flags; | 156 | extern u32 ipl_flags; |
| 142 | extern u16 ipl_devno; | 157 | extern u16 ipl_devno; |
| 143 | 158 | ||
| 144 | void do_reipl(void); | 159 | extern void do_reipl(void); |
| 160 | extern void ipl_save_parameters(void); | ||
| 145 | 161 | ||
| 146 | enum { | 162 | enum { |
| 147 | IPL_DEVNO_VALID = 1, | 163 | IPL_DEVNO_VALID = 1, |
| 148 | IPL_PARMBLOCK_VALID = 2, | 164 | IPL_PARMBLOCK_VALID = 2, |
| 165 | IPL_NSS_VALID = 4, | ||
| 149 | }; | 166 | }; |
| 150 | 167 | ||
| 168 | #define NSS_NAME_SIZE 8 | ||
| 169 | |||
| 170 | extern char kernel_nss_name[]; | ||
| 171 | |||
| 151 | #define IPL_PARMBLOCK_START ((struct ipl_parameter_block *) \ | 172 | #define IPL_PARMBLOCK_START ((struct ipl_parameter_block *) \ |
| 152 | IPL_PARMBLOCK_ORIGIN) | 173 | IPL_PARMBLOCK_ORIGIN) |
| 153 | #define IPL_PARMBLOCK_SIZE (IPL_PARMBLOCK_START->hdr.len) | 174 | #define IPL_PARMBLOCK_SIZE (IPL_PARMBLOCK_START->hdr.len) |
diff --git a/include/asm-s390/sfp-util.h b/include/asm-s390/sfp-util.h new file mode 100644 index 000000000000..8cabcd23d976 --- /dev/null +++ b/include/asm-s390/sfp-util.h | |||
| @@ -0,0 +1,66 @@ | |||
| 1 | #include <linux/kernel.h> | ||
| 2 | #include <linux/sched.h> | ||
| 3 | #include <linux/types.h> | ||
| 4 | #include <asm/byteorder.h> | ||
| 5 | |||
| 6 | #define add_ssaaaa(sh, sl, ah, al, bh, bl) ({ \ | ||
| 7 | unsigned int __sh = (ah); \ | ||
| 8 | unsigned int __sl = (al); \ | ||
| 9 | asm volatile( \ | ||
| 10 | " alr %1,%3\n" \ | ||
| 11 | " brc 12,0f\n" \ | ||
| 12 | " ahi %0,1\n" \ | ||
| 13 | "0: alr %0,%2" \ | ||
| 14 | : "+&d" (__sh), "+d" (__sl) \ | ||
| 15 | : "d" (bh), "d" (bl) : "cc"); \ | ||
| 16 | (sh) = __sh; \ | ||
| 17 | (sl) = __sl; \ | ||
| 18 | }) | ||
| 19 | |||
| 20 | #define sub_ddmmss(sh, sl, ah, al, bh, bl) ({ \ | ||
| 21 | unsigned int __sh = (ah); \ | ||
| 22 | unsigned int __sl = (al); \ | ||
| 23 | asm volatile( \ | ||
| 24 | " slr %1,%3\n" \ | ||
| 25 | " brc 3,0f\n" \ | ||
| 26 | " ahi %0,-1\n" \ | ||
| 27 | "0: slr %0,%2" \ | ||
| 28 | : "+&d" (__sh), "+d" (__sl) \ | ||
| 29 | : "d" (bh), "d" (bl) : "cc"); \ | ||
| 30 | (sh) = __sh; \ | ||
| 31 | (sl) = __sl; \ | ||
| 32 | }) | ||
| 33 | |||
| 34 | /* a umul b = a mul b + (a>=2<<31) ? b<<32:0 + (b>=2<<31) ? a<<32:0 */ | ||
| 35 | #define umul_ppmm(wh, wl, u, v) ({ \ | ||
| 36 | unsigned int __wh = u; \ | ||
| 37 | unsigned int __wl = v; \ | ||
| 38 | asm volatile( \ | ||
| 39 | " ltr 1,%0\n" \ | ||
| 40 | " mr 0,%1\n" \ | ||
| 41 | " jnm 0f\n" \ | ||
| 42 | " alr 0,%1\n" \ | ||
| 43 | "0: ltr %1,%1\n" \ | ||
| 44 | " jnm 1f\n" \ | ||
| 45 | " alr 0,%0\n" \ | ||
| 46 | "1: lr %0,0\n" \ | ||
| 47 | " lr %1,1\n" \ | ||
| 48 | : "+d" (__wh), "+d" (__wl) \ | ||
| 49 | : : "0", "1", "cc"); \ | ||
| 50 | wh = __wh; \ | ||
| 51 | wl = __wl; \ | ||
| 52 | }) | ||
| 53 | |||
| 54 | #define udiv_qrnnd(q, r, n1, n0, d) \ | ||
| 55 | do { unsigned int __r; \ | ||
| 56 | (q) = __udiv_qrnnd (&__r, (n1), (n0), (d)); \ | ||
| 57 | (r) = __r; \ | ||
| 58 | } while (0) | ||
| 59 | extern unsigned long __udiv_qrnnd (unsigned int *, unsigned int, | ||
| 60 | unsigned int , unsigned int); | ||
| 61 | |||
| 62 | #define UDIV_NEEDS_NORMALIZATION 0 | ||
| 63 | |||
| 64 | #define abort() return 0 | ||
| 65 | |||
| 66 | #define __BYTE_ORDER __BIG_ENDIAN | ||
diff --git a/include/asm-s390/smp.h b/include/asm-s390/smp.h index 7097c96ed026..b957e4cda464 100644 --- a/include/asm-s390/smp.h +++ b/include/asm-s390/smp.h | |||
| @@ -31,6 +31,10 @@ typedef struct | |||
| 31 | __u16 cpu; | 31 | __u16 cpu; |
| 32 | } sigp_info; | 32 | } sigp_info; |
| 33 | 33 | ||
| 34 | extern void machine_restart_smp(char *); | ||
| 35 | extern void machine_halt_smp(void); | ||
| 36 | extern void machine_power_off_smp(void); | ||
| 37 | |||
| 34 | extern void smp_setup_cpu_possible_map(void); | 38 | extern void smp_setup_cpu_possible_map(void); |
| 35 | extern int smp_call_function_on(void (*func) (void *info), void *info, | 39 | extern int smp_call_function_on(void (*func) (void *info), void *info, |
| 36 | int nonatomic, int wait, int cpu); | 40 | int nonatomic, int wait, int cpu); |
| @@ -106,7 +110,7 @@ smp_call_function_on(void (*func) (void *info), void *info, | |||
| 106 | static inline void smp_send_stop(void) | 110 | static inline void smp_send_stop(void) |
| 107 | { | 111 | { |
| 108 | /* Disable all interrupts/machine checks */ | 112 | /* Disable all interrupts/machine checks */ |
| 109 | __load_psw_mask(PSW_KERNEL_BITS & ~PSW_MASK_MCHECK); | 113 | __load_psw_mask(psw_kernel_bits & ~PSW_MASK_MCHECK); |
| 110 | } | 114 | } |
| 111 | 115 | ||
| 112 | #define smp_cpu_not_running(cpu) 1 | 116 | #define smp_cpu_not_running(cpu) 1 |
diff --git a/include/asm-s390/system.h b/include/asm-s390/system.h index bd0b05ae87d2..bbe137c3ed69 100644 --- a/include/asm-s390/system.h +++ b/include/asm-s390/system.h | |||
| @@ -373,8 +373,8 @@ __set_psw_mask(unsigned long mask) | |||
| 373 | __load_psw_mask(mask | (__raw_local_irq_stosm(0x00) & ~(-1UL >> 8))); | 373 | __load_psw_mask(mask | (__raw_local_irq_stosm(0x00) & ~(-1UL >> 8))); |
| 374 | } | 374 | } |
| 375 | 375 | ||
| 376 | #define local_mcck_enable() __set_psw_mask(PSW_KERNEL_BITS) | 376 | #define local_mcck_enable() __set_psw_mask(psw_kernel_bits) |
| 377 | #define local_mcck_disable() __set_psw_mask(PSW_KERNEL_BITS & ~PSW_MASK_MCHECK) | 377 | #define local_mcck_disable() __set_psw_mask(psw_kernel_bits & ~PSW_MASK_MCHECK) |
| 378 | 378 | ||
| 379 | #ifdef CONFIG_SMP | 379 | #ifdef CONFIG_SMP |
| 380 | 380 | ||
diff --git a/include/asm-s390/tape390.h b/include/asm-s390/tape390.h index f1d66ba0deef..884fba48f1ff 100644 --- a/include/asm-s390/tape390.h +++ b/include/asm-s390/tape390.h | |||
| @@ -1,11 +1,11 @@ | |||
| 1 | /************************************************************************* | 1 | /************************************************************************* |
| 2 | * | 2 | * |
| 3 | * tape390.h | 3 | * tape390.h |
| 4 | * enables user programs to display messages on the tape device | 4 | * enables user programs to display messages and control encryption |
| 5 | * on s390 tape devices | ||
| 5 | * | 6 | * |
| 6 | * S390 and zSeries version | 7 | * Copyright IBM Corp. 2001,2006 |
| 7 | * Copyright (C) 2001 IBM Corporation | 8 | * Author(s): Michael Holzheu <holzheu@de.ibm.com> |
| 8 | * Author(s): Despina Papadopoulou <despina_p@de.ibm.com> | ||
| 9 | * | 9 | * |
| 10 | *************************************************************************/ | 10 | *************************************************************************/ |
| 11 | 11 | ||
| @@ -36,4 +36,68 @@ typedef struct display_struct { | |||
| 36 | char message2[8]; | 36 | char message2[8]; |
| 37 | } display_struct; | 37 | } display_struct; |
| 38 | 38 | ||
| 39 | /* | ||
| 40 | * Tape encryption support | ||
| 41 | */ | ||
| 42 | |||
| 43 | struct tape390_crypt_info { | ||
| 44 | char capability; | ||
| 45 | char status; | ||
| 46 | char medium_status; | ||
| 47 | } __attribute__ ((packed)); | ||
| 48 | |||
| 49 | |||
| 50 | /* Macros for "capable" field */ | ||
| 51 | #define TAPE390_CRYPT_SUPPORTED_MASK 0x01 | ||
| 52 | #define TAPE390_CRYPT_SUPPORTED(x) \ | ||
| 53 | ((x.capability & TAPE390_CRYPT_SUPPORTED_MASK)) | ||
| 54 | |||
| 55 | /* Macros for "status" field */ | ||
| 56 | #define TAPE390_CRYPT_ON_MASK 0x01 | ||
| 57 | #define TAPE390_CRYPT_ON(x) (((x.status) & TAPE390_CRYPT_ON_MASK)) | ||
| 58 | |||
| 59 | /* Macros for "medium status" field */ | ||
| 60 | #define TAPE390_MEDIUM_LOADED_MASK 0x01 | ||
| 61 | #define TAPE390_MEDIUM_ENCRYPTED_MASK 0x02 | ||
| 62 | #define TAPE390_MEDIUM_ENCRYPTED(x) \ | ||
| 63 | (((x.medium_status) & TAPE390_MEDIUM_ENCRYPTED_MASK)) | ||
| 64 | #define TAPE390_MEDIUM_LOADED(x) \ | ||
| 65 | (((x.medium_status) & TAPE390_MEDIUM_LOADED_MASK)) | ||
| 66 | |||
| 67 | /* | ||
| 68 | * The TAPE390_CRYPT_SET ioctl is used to switch on/off encryption. | ||
| 69 | * The "encryption_capable" and "tape_status" fields are ignored for this ioctl! | ||
| 70 | */ | ||
| 71 | #define TAPE390_CRYPT_SET _IOW('d', 2, struct tape390_crypt_info) | ||
| 72 | |||
| 73 | /* | ||
| 74 | * The TAPE390_CRYPT_QUERY ioctl is used to query the encryption state. | ||
| 75 | */ | ||
| 76 | #define TAPE390_CRYPT_QUERY _IOR('d', 3, struct tape390_crypt_info) | ||
| 77 | |||
| 78 | /* Values for "kekl1/2_type" and "kekl1/2_type_on_tape" fields */ | ||
| 79 | #define TAPE390_KEKL_TYPE_NONE 0 | ||
| 80 | #define TAPE390_KEKL_TYPE_LABEL 1 | ||
| 81 | #define TAPE390_KEKL_TYPE_HASH 2 | ||
| 82 | |||
| 83 | struct tape390_kekl { | ||
| 84 | unsigned char type; | ||
| 85 | unsigned char type_on_tape; | ||
| 86 | char label[65]; | ||
| 87 | } __attribute__ ((packed)); | ||
| 88 | |||
| 89 | struct tape390_kekl_pair { | ||
| 90 | struct tape390_kekl kekl[2]; | ||
| 91 | } __attribute__ ((packed)); | ||
| 92 | |||
| 93 | /* | ||
| 94 | * The TAPE390_KEKL_SET ioctl is used to set Key Encrypting Key labels. | ||
| 95 | */ | ||
| 96 | #define TAPE390_KEKL_SET _IOW('d', 4, struct tape390_kekl_pair) | ||
| 97 | |||
| 98 | /* | ||
| 99 | * The TAPE390_KEKL_QUERY ioctl is used to query Key Encrypting Key labels. | ||
| 100 | */ | ||
| 101 | #define TAPE390_KEKL_QUERY _IOR('d', 5, struct tape390_kekl_pair) | ||
| 102 | |||
| 39 | #endif | 103 | #endif |
diff --git a/include/asm-s390/timer.h b/include/asm-s390/timer.h index 30e5cbe570f2..adb34860a543 100644 --- a/include/asm-s390/timer.h +++ b/include/asm-s390/timer.h | |||
| @@ -45,6 +45,9 @@ extern void add_virt_timer_periodic(void *new); | |||
| 45 | extern int mod_virt_timer(struct vtimer_list *timer, __u64 expires); | 45 | extern int mod_virt_timer(struct vtimer_list *timer, __u64 expires); |
| 46 | extern int del_virt_timer(struct vtimer_list *timer); | 46 | extern int del_virt_timer(struct vtimer_list *timer); |
| 47 | 47 | ||
| 48 | extern void init_cpu_vtimer(void); | ||
| 49 | extern void vtime_init(void); | ||
| 50 | |||
| 48 | #endif /* __KERNEL__ */ | 51 | #endif /* __KERNEL__ */ |
| 49 | 52 | ||
| 50 | #endif /* _ASM_S390_TIMER_H */ | 53 | #endif /* _ASM_S390_TIMER_H */ |
diff --git a/include/asm-s390/timex.h b/include/asm-s390/timex.h index 4df4a41029a3..98229db24314 100644 --- a/include/asm-s390/timex.h +++ b/include/asm-s390/timex.h | |||
| @@ -11,6 +11,41 @@ | |||
| 11 | #ifndef _ASM_S390_TIMEX_H | 11 | #ifndef _ASM_S390_TIMEX_H |
| 12 | #define _ASM_S390_TIMEX_H | 12 | #define _ASM_S390_TIMEX_H |
| 13 | 13 | ||
| 14 | /* Inline functions for clock register access. */ | ||
| 15 | static inline int set_clock(__u64 time) | ||
| 16 | { | ||
| 17 | int cc; | ||
| 18 | |||
| 19 | asm volatile( | ||
| 20 | " sck 0(%2)\n" | ||
| 21 | " ipm %0\n" | ||
| 22 | " srl %0,28\n" | ||
| 23 | : "=d" (cc) : "m" (time), "a" (&time) : "cc"); | ||
| 24 | return cc; | ||
| 25 | } | ||
| 26 | |||
| 27 | static inline int store_clock(__u64 *time) | ||
| 28 | { | ||
| 29 | int cc; | ||
| 30 | |||
| 31 | asm volatile( | ||
| 32 | " stck 0(%2)\n" | ||
| 33 | " ipm %0\n" | ||
| 34 | " srl %0,28\n" | ||
| 35 | : "=d" (cc), "=m" (*time) : "a" (time) : "cc"); | ||
| 36 | return cc; | ||
| 37 | } | ||
| 38 | |||
| 39 | static inline void set_clock_comparator(__u64 time) | ||
| 40 | { | ||
| 41 | asm volatile("sckc 0(%1)" : : "m" (time), "a" (&time)); | ||
| 42 | } | ||
| 43 | |||
| 44 | static inline void store_clock_comparator(__u64 *time) | ||
| 45 | { | ||
| 46 | asm volatile("stckc 0(%1)" : "=m" (*time) : "a" (time)); | ||
| 47 | } | ||
| 48 | |||
| 14 | #define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ | 49 | #define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ |
| 15 | 50 | ||
| 16 | typedef unsigned long long cycles_t; | 51 | typedef unsigned long long cycles_t; |
| @@ -27,9 +62,24 @@ static inline unsigned long long get_clock (void) | |||
| 27 | return clk; | 62 | return clk; |
| 28 | } | 63 | } |
| 29 | 64 | ||
| 65 | static inline void get_clock_extended(void *dest) | ||
| 66 | { | ||
| 67 | typedef struct { unsigned long long clk[2]; } __clock_t; | ||
| 68 | |||
| 69 | #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2) | ||
| 70 | asm volatile("stcke %0" : "=Q" (*((__clock_t *)dest)) : : "cc"); | ||
| 71 | #else /* __GNUC__ */ | ||
| 72 | asm volatile("stcke 0(%1)" : "=m" (*((__clock_t *)dest)) | ||
| 73 | : "a" ((__clock_t *)dest) : "cc"); | ||
| 74 | #endif /* __GNUC__ */ | ||
| 75 | } | ||
| 76 | |||
| 30 | static inline cycles_t get_cycles(void) | 77 | static inline cycles_t get_cycles(void) |
| 31 | { | 78 | { |
| 32 | return (cycles_t) get_clock() >> 2; | 79 | return (cycles_t) get_clock() >> 2; |
| 33 | } | 80 | } |
| 34 | 81 | ||
| 82 | int get_sync_clock(unsigned long long *clock); | ||
| 83 | void init_cpu_timer(void); | ||
| 84 | |||
| 35 | #endif | 85 | #endif |
diff --git a/include/asm-s390/tlbflush.h b/include/asm-s390/tlbflush.h index fa4dc916a9bf..66793f55c8b2 100644 --- a/include/asm-s390/tlbflush.h +++ b/include/asm-s390/tlbflush.h | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | #include <linux/mm.h> | 4 | #include <linux/mm.h> |
| 5 | #include <asm/processor.h> | 5 | #include <asm/processor.h> |
| 6 | #include <asm/pgalloc.h> | ||
| 6 | 7 | ||
| 7 | /* | 8 | /* |
| 8 | * TLB flushing: | 9 | * TLB flushing: |
| @@ -102,6 +103,14 @@ static inline void __flush_tlb_mm(struct mm_struct * mm) | |||
| 102 | if (unlikely(cpus_empty(mm->cpu_vm_mask))) | 103 | if (unlikely(cpus_empty(mm->cpu_vm_mask))) |
| 103 | return; | 104 | return; |
| 104 | if (MACHINE_HAS_IDTE) { | 105 | if (MACHINE_HAS_IDTE) { |
| 106 | pgd_t *shadow_pgd = get_shadow_pgd(mm->pgd); | ||
| 107 | |||
| 108 | if (shadow_pgd) { | ||
| 109 | asm volatile( | ||
| 110 | " .insn rrf,0xb98e0000,0,%0,%1,0" | ||
| 111 | : : "a" (2048), | ||
| 112 | "a" (__pa(shadow_pgd) & PAGE_MASK) : "cc" ); | ||
| 113 | } | ||
| 105 | asm volatile( | 114 | asm volatile( |
| 106 | " .insn rrf,0xb98e0000,0,%0,%1,0" | 115 | " .insn rrf,0xb98e0000,0,%0,%1,0" |
| 107 | : : "a" (2048), "a" (__pa(mm->pgd)&PAGE_MASK) : "cc"); | 116 | : : "a" (2048), "a" (__pa(mm->pgd)&PAGE_MASK) : "cc"); |
diff --git a/include/asm-s390/uaccess.h b/include/asm-s390/uaccess.h index 73ac4e82217b..0235970278f0 100644 --- a/include/asm-s390/uaccess.h +++ b/include/asm-s390/uaccess.h | |||
| @@ -90,6 +90,8 @@ struct uaccess_ops { | |||
| 90 | extern struct uaccess_ops uaccess; | 90 | extern struct uaccess_ops uaccess; |
| 91 | extern struct uaccess_ops uaccess_std; | 91 | extern struct uaccess_ops uaccess_std; |
| 92 | extern struct uaccess_ops uaccess_mvcos; | 92 | extern struct uaccess_ops uaccess_mvcos; |
| 93 | extern struct uaccess_ops uaccess_mvcos_switch; | ||
| 94 | extern struct uaccess_ops uaccess_pt; | ||
| 93 | 95 | ||
| 94 | static inline int __put_user_fn(size_t size, void __user *ptr, void *x) | 96 | static inline int __put_user_fn(size_t size, void __user *ptr, void *x) |
| 95 | { | 97 | { |
diff --git a/include/asm-sparc/checksum.h b/include/asm-sparc/checksum.h index 267e631e9bbc..34518ea7bf1b 100644 --- a/include/asm-sparc/checksum.h +++ b/include/asm-sparc/checksum.h | |||
| @@ -151,7 +151,7 @@ static inline __sum16 ip_fast_csum(const void *iph, unsigned int ihl) | |||
| 151 | "xnor\t%%g0, %0, %0" | 151 | "xnor\t%%g0, %0, %0" |
| 152 | : "=r" (sum), "=&r" (iph) | 152 | : "=r" (sum), "=&r" (iph) |
| 153 | : "r" (ihl), "1" (iph) | 153 | : "r" (ihl), "1" (iph) |
| 154 | : "g2", "g3", "g4", "cc"); | 154 | : "g2", "g3", "g4", "cc", "memory"); |
| 155 | return sum; | 155 | return sum; |
| 156 | } | 156 | } |
| 157 | 157 | ||
diff --git a/include/asm-um/pgtable.h b/include/asm-um/pgtable.h index 188f72621776..e57ff136ee51 100644 --- a/include/asm-um/pgtable.h +++ b/include/asm-um/pgtable.h | |||
| @@ -408,6 +408,15 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | |||
| 408 | 408 | ||
| 409 | #include <asm-generic/pgtable-nopud.h> | 409 | #include <asm-generic/pgtable-nopud.h> |
| 410 | 410 | ||
| 411 | #ifdef CONFIG_HIGHMEM | ||
| 412 | /* Clear a kernel PTE and flush it from the TLB */ | ||
| 413 | #define kpte_clear_flush(ptep, vaddr) \ | ||
| 414 | do { \ | ||
| 415 | pte_clear(&init_mm, vaddr, ptep); \ | ||
| 416 | __flush_tlb_one(vaddr); \ | ||
| 417 | } while (0) | ||
| 418 | #endif | ||
| 419 | |||
| 411 | #endif | 420 | #endif |
| 412 | #endif | 421 | #endif |
| 413 | 422 | ||
diff --git a/include/asm-x86_64/dma-mapping.h b/include/asm-x86_64/dma-mapping.h index be9ec6890723..49dbab09ef2b 100644 --- a/include/asm-x86_64/dma-mapping.h +++ b/include/asm-x86_64/dma-mapping.h | |||
| @@ -63,6 +63,9 @@ static inline int dma_mapping_error(dma_addr_t dma_addr) | |||
| 63 | return (dma_addr == bad_dma_address); | 63 | return (dma_addr == bad_dma_address); |
| 64 | } | 64 | } |
| 65 | 65 | ||
| 66 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) | ||
| 67 | #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) | ||
| 68 | |||
| 66 | extern void *dma_alloc_coherent(struct device *dev, size_t size, | 69 | extern void *dma_alloc_coherent(struct device *dev, size_t size, |
| 67 | dma_addr_t *dma_handle, gfp_t gfp); | 70 | dma_addr_t *dma_handle, gfp_t gfp); |
| 68 | extern void dma_free_coherent(struct device *dev, size_t size, void *vaddr, | 71 | extern void dma_free_coherent(struct device *dev, size_t size, void *vaddr, |
diff --git a/include/linux/efi.h b/include/linux/efi.h index df1c91855f0e..f8ebd7c1ddb3 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h | |||
| @@ -301,7 +301,7 @@ extern int __init efi_uart_console_only (void); | |||
| 301 | extern void efi_initialize_iomem_resources(struct resource *code_resource, | 301 | extern void efi_initialize_iomem_resources(struct resource *code_resource, |
| 302 | struct resource *data_resource); | 302 | struct resource *data_resource); |
| 303 | extern unsigned long efi_get_time(void); | 303 | extern unsigned long efi_get_time(void); |
| 304 | extern int __init efi_set_rtc_mmss(unsigned long nowtime); | 304 | extern int efi_set_rtc_mmss(unsigned long nowtime); |
| 305 | extern int is_available_memory(efi_memory_desc_t * md); | 305 | extern int is_available_memory(efi_memory_desc_t * md); |
| 306 | extern struct efi_memory_map memmap; | 306 | extern struct efi_memory_map memmap; |
| 307 | 307 | ||
diff --git a/include/linux/hid-debug.h b/include/linux/hid-debug.h index 8e4dbb51fc70..50d568ec178a 100644 --- a/include/linux/hid-debug.h +++ b/include/linux/hid-debug.h | |||
| @@ -1,10 +1,8 @@ | |||
| 1 | #ifndef __HID_DEBUG_H | ||
| 2 | #define __HID_DEBUG_H | ||
| 3 | |||
| 1 | /* | 4 | /* |
| 2 | * $Id: hid-debug.h,v 1.8 2001/09/25 09:37:57 vojtech Exp $ | 5 | * Copyright (c) 2007 Jiri Kosina |
| 3 | * | ||
| 4 | * (c) 1999 Andreas Gal <gal@cs.uni-magdeburg.de> | ||
| 5 | * (c) 2000-2001 Vojtech Pavlik <vojtech@ucw.cz> | ||
| 6 | * | ||
| 7 | * Some debug stuff for the HID parser. | ||
| 8 | */ | 6 | */ |
| 9 | 7 | ||
| 10 | /* | 8 | /* |
| @@ -22,737 +20,26 @@ | |||
| 22 | * along with this program; if not, write to the Free Software | 20 | * along with this program; if not, write to the Free Software |
| 23 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 24 | * | 22 | * |
| 25 | * Should you need to contact me, the author, you can do so either by | ||
| 26 | * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail: | ||
| 27 | * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic | ||
| 28 | */ | 23 | */ |
| 29 | 24 | ||
| 30 | #include <linux/input.h> | 25 | #ifdef CONFIG_HID_DEBUG |
| 31 | |||
| 32 | struct hid_usage_entry { | ||
| 33 | unsigned page; | ||
| 34 | unsigned usage; | ||
| 35 | char *description; | ||
| 36 | }; | ||
| 37 | |||
| 38 | static const struct hid_usage_entry hid_usage_table[] = { | ||
| 39 | { 0, 0, "Undefined" }, | ||
| 40 | { 1, 0, "GenericDesktop" }, | ||
| 41 | {0, 0x01, "Pointer"}, | ||
| 42 | {0, 0x02, "Mouse"}, | ||
| 43 | {0, 0x04, "Joystick"}, | ||
| 44 | {0, 0x05, "GamePad"}, | ||
| 45 | {0, 0x06, "Keyboard"}, | ||
| 46 | {0, 0x07, "Keypad"}, | ||
| 47 | {0, 0x08, "MultiAxis"}, | ||
| 48 | {0, 0x30, "X"}, | ||
| 49 | {0, 0x31, "Y"}, | ||
| 50 | {0, 0x32, "Z"}, | ||
| 51 | {0, 0x33, "Rx"}, | ||
| 52 | {0, 0x34, "Ry"}, | ||
| 53 | {0, 0x35, "Rz"}, | ||
| 54 | {0, 0x36, "Slider"}, | ||
| 55 | {0, 0x37, "Dial"}, | ||
| 56 | {0, 0x38, "Wheel"}, | ||
| 57 | {0, 0x39, "HatSwitch"}, | ||
| 58 | {0, 0x3a, "CountedBuffer"}, | ||
| 59 | {0, 0x3b, "ByteCount"}, | ||
| 60 | {0, 0x3c, "MotionWakeup"}, | ||
| 61 | {0, 0x3d, "Start"}, | ||
| 62 | {0, 0x3e, "Select"}, | ||
| 63 | {0, 0x40, "Vx"}, | ||
| 64 | {0, 0x41, "Vy"}, | ||
| 65 | {0, 0x42, "Vz"}, | ||
| 66 | {0, 0x43, "Vbrx"}, | ||
| 67 | {0, 0x44, "Vbry"}, | ||
| 68 | {0, 0x45, "Vbrz"}, | ||
| 69 | {0, 0x46, "Vno"}, | ||
| 70 | {0, 0x80, "SystemControl"}, | ||
| 71 | {0, 0x81, "SystemPowerDown"}, | ||
| 72 | {0, 0x82, "SystemSleep"}, | ||
| 73 | {0, 0x83, "SystemWakeUp"}, | ||
| 74 | {0, 0x84, "SystemContextMenu"}, | ||
| 75 | {0, 0x85, "SystemMainMenu"}, | ||
| 76 | {0, 0x86, "SystemAppMenu"}, | ||
| 77 | {0, 0x87, "SystemMenuHelp"}, | ||
| 78 | {0, 0x88, "SystemMenuExit"}, | ||
| 79 | {0, 0x89, "SystemMenuSelect"}, | ||
| 80 | {0, 0x8a, "SystemMenuRight"}, | ||
| 81 | {0, 0x8b, "SystemMenuLeft"}, | ||
| 82 | {0, 0x8c, "SystemMenuUp"}, | ||
| 83 | {0, 0x8d, "SystemMenuDown"}, | ||
| 84 | {0, 0x90, "D-PadUp"}, | ||
| 85 | {0, 0x91, "D-PadDown"}, | ||
| 86 | {0, 0x92, "D-PadRight"}, | ||
| 87 | {0, 0x93, "D-PadLeft"}, | ||
| 88 | { 2, 0, "Simulation" }, | ||
| 89 | {0, 0xb0, "Aileron"}, | ||
| 90 | {0, 0xb1, "AileronTrim"}, | ||
| 91 | {0, 0xb2, "Anti-Torque"}, | ||
| 92 | {0, 0xb3, "Autopilot"}, | ||
| 93 | {0, 0xb4, "Chaff"}, | ||
| 94 | {0, 0xb5, "Collective"}, | ||
| 95 | {0, 0xb6, "DiveBrake"}, | ||
| 96 | {0, 0xb7, "ElectronicCountermeasures"}, | ||
| 97 | {0, 0xb8, "Elevator"}, | ||
| 98 | {0, 0xb9, "ElevatorTrim"}, | ||
| 99 | {0, 0xba, "Rudder"}, | ||
| 100 | {0, 0xbb, "Throttle"}, | ||
| 101 | {0, 0xbc, "FlightCommunications"}, | ||
| 102 | {0, 0xbd, "FlareRelease"}, | ||
| 103 | {0, 0xbe, "LandingGear"}, | ||
| 104 | {0, 0xbf, "ToeBrake"}, | ||
| 105 | { 7, 0, "Keyboard" }, | ||
| 106 | { 8, 0, "LED" }, | ||
| 107 | {0, 0x01, "NumLock"}, | ||
| 108 | {0, 0x02, "CapsLock"}, | ||
| 109 | {0, 0x03, "ScrollLock"}, | ||
| 110 | {0, 0x04, "Compose"}, | ||
| 111 | {0, 0x05, "Kana"}, | ||
| 112 | {0, 0x4b, "GenericIndicator"}, | ||
| 113 | { 9, 0, "Button" }, | ||
| 114 | { 10, 0, "Ordinal" }, | ||
| 115 | { 12, 0, "Consumer" }, | ||
| 116 | {0, 0x238, "HorizontalWheel"}, | ||
| 117 | { 13, 0, "Digitizers" }, | ||
| 118 | {0, 0x01, "Digitizer"}, | ||
| 119 | {0, 0x02, "Pen"}, | ||
| 120 | {0, 0x03, "LightPen"}, | ||
| 121 | {0, 0x04, "TouchScreen"}, | ||
| 122 | {0, 0x05, "TouchPad"}, | ||
| 123 | {0, 0x20, "Stylus"}, | ||
| 124 | {0, 0x21, "Puck"}, | ||
| 125 | {0, 0x22, "Finger"}, | ||
| 126 | {0, 0x30, "TipPressure"}, | ||
| 127 | {0, 0x31, "BarrelPressure"}, | ||
| 128 | {0, 0x32, "InRange"}, | ||
| 129 | {0, 0x33, "Touch"}, | ||
| 130 | {0, 0x34, "UnTouch"}, | ||
| 131 | {0, 0x35, "Tap"}, | ||
| 132 | {0, 0x39, "TabletFunctionKey"}, | ||
| 133 | {0, 0x3a, "ProgramChangeKey"}, | ||
| 134 | {0, 0x3c, "Invert"}, | ||
| 135 | {0, 0x42, "TipSwitch"}, | ||
| 136 | {0, 0x43, "SecondaryTipSwitch"}, | ||
| 137 | {0, 0x44, "BarrelSwitch"}, | ||
| 138 | {0, 0x45, "Eraser"}, | ||
| 139 | {0, 0x46, "TabletPick"}, | ||
| 140 | { 15, 0, "PhysicalInterfaceDevice" }, | ||
| 141 | {0, 0x00, "Undefined"}, | ||
| 142 | {0, 0x01, "Physical_Interface_Device"}, | ||
| 143 | {0, 0x20, "Normal"}, | ||
| 144 | {0, 0x21, "Set_Effect_Report"}, | ||
| 145 | {0, 0x22, "Effect_Block_Index"}, | ||
| 146 | {0, 0x23, "Parameter_Block_Offset"}, | ||
| 147 | {0, 0x24, "ROM_Flag"}, | ||
| 148 | {0, 0x25, "Effect_Type"}, | ||
| 149 | {0, 0x26, "ET_Constant_Force"}, | ||
| 150 | {0, 0x27, "ET_Ramp"}, | ||
| 151 | {0, 0x28, "ET_Custom_Force_Data"}, | ||
| 152 | {0, 0x30, "ET_Square"}, | ||
| 153 | {0, 0x31, "ET_Sine"}, | ||
| 154 | {0, 0x32, "ET_Triangle"}, | ||
| 155 | {0, 0x33, "ET_Sawtooth_Up"}, | ||
| 156 | {0, 0x34, "ET_Sawtooth_Down"}, | ||
| 157 | {0, 0x40, "ET_Spring"}, | ||
| 158 | {0, 0x41, "ET_Damper"}, | ||
| 159 | {0, 0x42, "ET_Inertia"}, | ||
| 160 | {0, 0x43, "ET_Friction"}, | ||
| 161 | {0, 0x50, "Duration"}, | ||
| 162 | {0, 0x51, "Sample_Period"}, | ||
| 163 | {0, 0x52, "Gain"}, | ||
| 164 | {0, 0x53, "Trigger_Button"}, | ||
| 165 | {0, 0x54, "Trigger_Repeat_Interval"}, | ||
| 166 | {0, 0x55, "Axes_Enable"}, | ||
| 167 | {0, 0x56, "Direction_Enable"}, | ||
| 168 | {0, 0x57, "Direction"}, | ||
| 169 | {0, 0x58, "Type_Specific_Block_Offset"}, | ||
| 170 | {0, 0x59, "Block_Type"}, | ||
| 171 | {0, 0x5A, "Set_Envelope_Report"}, | ||
| 172 | {0, 0x5B, "Attack_Level"}, | ||
| 173 | {0, 0x5C, "Attack_Time"}, | ||
| 174 | {0, 0x5D, "Fade_Level"}, | ||
| 175 | {0, 0x5E, "Fade_Time"}, | ||
| 176 | {0, 0x5F, "Set_Condition_Report"}, | ||
| 177 | {0, 0x60, "CP_Offset"}, | ||
| 178 | {0, 0x61, "Positive_Coefficient"}, | ||
| 179 | {0, 0x62, "Negative_Coefficient"}, | ||
| 180 | {0, 0x63, "Positive_Saturation"}, | ||
| 181 | {0, 0x64, "Negative_Saturation"}, | ||
| 182 | {0, 0x65, "Dead_Band"}, | ||
| 183 | {0, 0x66, "Download_Force_Sample"}, | ||
| 184 | {0, 0x67, "Isoch_Custom_Force_Enable"}, | ||
| 185 | {0, 0x68, "Custom_Force_Data_Report"}, | ||
| 186 | {0, 0x69, "Custom_Force_Data"}, | ||
| 187 | {0, 0x6A, "Custom_Force_Vendor_Defined_Data"}, | ||
| 188 | {0, 0x6B, "Set_Custom_Force_Report"}, | ||
| 189 | {0, 0x6C, "Custom_Force_Data_Offset"}, | ||
| 190 | {0, 0x6D, "Sample_Count"}, | ||
| 191 | {0, 0x6E, "Set_Periodic_Report"}, | ||
| 192 | {0, 0x6F, "Offset"}, | ||
| 193 | {0, 0x70, "Magnitude"}, | ||
| 194 | {0, 0x71, "Phase"}, | ||
| 195 | {0, 0x72, "Period"}, | ||
| 196 | {0, 0x73, "Set_Constant_Force_Report"}, | ||
| 197 | {0, 0x74, "Set_Ramp_Force_Report"}, | ||
| 198 | {0, 0x75, "Ramp_Start"}, | ||
| 199 | {0, 0x76, "Ramp_End"}, | ||
| 200 | {0, 0x77, "Effect_Operation_Report"}, | ||
| 201 | {0, 0x78, "Effect_Operation"}, | ||
| 202 | {0, 0x79, "Op_Effect_Start"}, | ||
| 203 | {0, 0x7A, "Op_Effect_Start_Solo"}, | ||
| 204 | {0, 0x7B, "Op_Effect_Stop"}, | ||
| 205 | {0, 0x7C, "Loop_Count"}, | ||
| 206 | {0, 0x7D, "Device_Gain_Report"}, | ||
| 207 | {0, 0x7E, "Device_Gain"}, | ||
| 208 | {0, 0x7F, "PID_Pool_Report"}, | ||
| 209 | {0, 0x80, "RAM_Pool_Size"}, | ||
| 210 | {0, 0x81, "ROM_Pool_Size"}, | ||
| 211 | {0, 0x82, "ROM_Effect_Block_Count"}, | ||
| 212 | {0, 0x83, "Simultaneous_Effects_Max"}, | ||
| 213 | {0, 0x84, "Pool_Alignment"}, | ||
| 214 | {0, 0x85, "PID_Pool_Move_Report"}, | ||
| 215 | {0, 0x86, "Move_Source"}, | ||
| 216 | {0, 0x87, "Move_Destination"}, | ||
| 217 | {0, 0x88, "Move_Length"}, | ||
| 218 | {0, 0x89, "PID_Block_Load_Report"}, | ||
| 219 | {0, 0x8B, "Block_Load_Status"}, | ||
| 220 | {0, 0x8C, "Block_Load_Success"}, | ||
| 221 | {0, 0x8D, "Block_Load_Full"}, | ||
| 222 | {0, 0x8E, "Block_Load_Error"}, | ||
| 223 | {0, 0x8F, "Block_Handle"}, | ||
| 224 | {0, 0x90, "PID_Block_Free_Report"}, | ||
| 225 | {0, 0x91, "Type_Specific_Block_Handle"}, | ||
| 226 | {0, 0x92, "PID_State_Report"}, | ||
| 227 | {0, 0x94, "Effect_Playing"}, | ||
| 228 | {0, 0x95, "PID_Device_Control_Report"}, | ||
| 229 | {0, 0x96, "PID_Device_Control"}, | ||
| 230 | {0, 0x97, "DC_Enable_Actuators"}, | ||
| 231 | {0, 0x98, "DC_Disable_Actuators"}, | ||
| 232 | {0, 0x99, "DC_Stop_All_Effects"}, | ||
| 233 | {0, 0x9A, "DC_Device_Reset"}, | ||
| 234 | {0, 0x9B, "DC_Device_Pause"}, | ||
| 235 | {0, 0x9C, "DC_Device_Continue"}, | ||
| 236 | {0, 0x9F, "Device_Paused"}, | ||
| 237 | {0, 0xA0, "Actuators_Enabled"}, | ||
| 238 | {0, 0xA4, "Safety_Switch"}, | ||
| 239 | {0, 0xA5, "Actuator_Override_Switch"}, | ||
| 240 | {0, 0xA6, "Actuator_Power"}, | ||
| 241 | {0, 0xA7, "Start_Delay"}, | ||
| 242 | {0, 0xA8, "Parameter_Block_Size"}, | ||
| 243 | {0, 0xA9, "Device_Managed_Pool"}, | ||
| 244 | {0, 0xAA, "Shared_Parameter_Blocks"}, | ||
| 245 | {0, 0xAB, "Create_New_Effect_Report"}, | ||
| 246 | {0, 0xAC, "RAM_Pool_Available"}, | ||
| 247 | { 0x84, 0, "Power Device" }, | ||
| 248 | { 0x84, 0x02, "PresentStatus" }, | ||
| 249 | { 0x84, 0x03, "ChangeStatus" }, | ||
| 250 | { 0x84, 0x04, "UPS" }, | ||
| 251 | { 0x84, 0x05, "PowerSupply" }, | ||
| 252 | { 0x84, 0x10, "BatterySystem" }, | ||
| 253 | { 0x84, 0x11, "BatterySystemID" }, | ||
| 254 | { 0x84, 0x12, "Battery" }, | ||
| 255 | { 0x84, 0x13, "BatteryID" }, | ||
| 256 | { 0x84, 0x14, "Charger" }, | ||
| 257 | { 0x84, 0x15, "ChargerID" }, | ||
| 258 | { 0x84, 0x16, "PowerConverter" }, | ||
| 259 | { 0x84, 0x17, "PowerConverterID" }, | ||
| 260 | { 0x84, 0x18, "OutletSystem" }, | ||
| 261 | { 0x84, 0x19, "OutletSystemID" }, | ||
| 262 | { 0x84, 0x1a, "Input" }, | ||
| 263 | { 0x84, 0x1b, "InputID" }, | ||
| 264 | { 0x84, 0x1c, "Output" }, | ||
| 265 | { 0x84, 0x1d, "OutputID" }, | ||
| 266 | { 0x84, 0x1e, "Flow" }, | ||
| 267 | { 0x84, 0x1f, "FlowID" }, | ||
| 268 | { 0x84, 0x20, "Outlet" }, | ||
| 269 | { 0x84, 0x21, "OutletID" }, | ||
| 270 | { 0x84, 0x22, "Gang" }, | ||
| 271 | { 0x84, 0x24, "PowerSummary" }, | ||
| 272 | { 0x84, 0x25, "PowerSummaryID" }, | ||
| 273 | { 0x84, 0x30, "Voltage" }, | ||
| 274 | { 0x84, 0x31, "Current" }, | ||
| 275 | { 0x84, 0x32, "Frequency" }, | ||
| 276 | { 0x84, 0x33, "ApparentPower" }, | ||
| 277 | { 0x84, 0x35, "PercentLoad" }, | ||
| 278 | { 0x84, 0x40, "ConfigVoltage" }, | ||
| 279 | { 0x84, 0x41, "ConfigCurrent" }, | ||
| 280 | { 0x84, 0x43, "ConfigApparentPower" }, | ||
| 281 | { 0x84, 0x53, "LowVoltageTransfer" }, | ||
| 282 | { 0x84, 0x54, "HighVoltageTransfer" }, | ||
| 283 | { 0x84, 0x56, "DelayBeforeStartup" }, | ||
| 284 | { 0x84, 0x57, "DelayBeforeShutdown" }, | ||
| 285 | { 0x84, 0x58, "Test" }, | ||
| 286 | { 0x84, 0x5a, "AudibleAlarmControl" }, | ||
| 287 | { 0x84, 0x60, "Present" }, | ||
| 288 | { 0x84, 0x61, "Good" }, | ||
| 289 | { 0x84, 0x62, "InternalFailure" }, | ||
| 290 | { 0x84, 0x65, "Overload" }, | ||
| 291 | { 0x84, 0x66, "OverCharged" }, | ||
| 292 | { 0x84, 0x67, "OverTemperature" }, | ||
| 293 | { 0x84, 0x68, "ShutdownRequested" }, | ||
| 294 | { 0x84, 0x69, "ShutdownImminent" }, | ||
| 295 | { 0x84, 0x6b, "SwitchOn/Off" }, | ||
| 296 | { 0x84, 0x6c, "Switchable" }, | ||
| 297 | { 0x84, 0x6d, "Used" }, | ||
| 298 | { 0x84, 0x6e, "Boost" }, | ||
| 299 | { 0x84, 0x73, "CommunicationLost" }, | ||
| 300 | { 0x84, 0xfd, "iManufacturer" }, | ||
| 301 | { 0x84, 0xfe, "iProduct" }, | ||
| 302 | { 0x84, 0xff, "iSerialNumber" }, | ||
| 303 | { 0x85, 0, "Battery System" }, | ||
| 304 | { 0x85, 0x01, "SMBBatteryMode" }, | ||
| 305 | { 0x85, 0x02, "SMBBatteryStatus" }, | ||
| 306 | { 0x85, 0x03, "SMBAlarmWarning" }, | ||
| 307 | { 0x85, 0x04, "SMBChargerMode" }, | ||
| 308 | { 0x85, 0x05, "SMBChargerStatus" }, | ||
| 309 | { 0x85, 0x06, "SMBChargerSpecInfo" }, | ||
| 310 | { 0x85, 0x07, "SMBSelectorState" }, | ||
| 311 | { 0x85, 0x08, "SMBSelectorPresets" }, | ||
| 312 | { 0x85, 0x09, "SMBSelectorInfo" }, | ||
| 313 | { 0x85, 0x29, "RemainingCapacityLimit" }, | ||
| 314 | { 0x85, 0x2c, "CapacityMode" }, | ||
| 315 | { 0x85, 0x42, "BelowRemainingCapacityLimit" }, | ||
| 316 | { 0x85, 0x44, "Charging" }, | ||
| 317 | { 0x85, 0x45, "Discharging" }, | ||
| 318 | { 0x85, 0x4b, "NeedReplacement" }, | ||
| 319 | { 0x85, 0x66, "RemainingCapacity" }, | ||
| 320 | { 0x85, 0x68, "RunTimeToEmpty" }, | ||
| 321 | { 0x85, 0x6a, "AverageTimeToFull" }, | ||
| 322 | { 0x85, 0x83, "DesignCapacity" }, | ||
| 323 | { 0x85, 0x85, "ManufacturerDate" }, | ||
| 324 | { 0x85, 0x89, "iDeviceChemistry" }, | ||
| 325 | { 0x85, 0x8b, "Rechargable" }, | ||
| 326 | { 0x85, 0x8f, "iOEMInformation" }, | ||
| 327 | { 0x85, 0x8d, "CapacityGranularity1" }, | ||
| 328 | { 0x85, 0xd0, "ACPresent" }, | ||
| 329 | /* pages 0xff00 to 0xffff are vendor-specific */ | ||
| 330 | { 0xffff, 0, "Vendor-specific-FF" }, | ||
| 331 | { 0, 0, NULL } | ||
| 332 | }; | ||
| 333 | |||
| 334 | static void resolv_usage_page(unsigned page) { | ||
| 335 | const struct hid_usage_entry *p; | ||
| 336 | |||
| 337 | for (p = hid_usage_table; p->description; p++) | ||
| 338 | if (p->page == page) { | ||
| 339 | printk("%s", p->description); | ||
| 340 | return; | ||
| 341 | } | ||
| 342 | printk("%04x", page); | ||
| 343 | } | ||
| 344 | |||
| 345 | static void resolv_usage(unsigned usage) { | ||
| 346 | const struct hid_usage_entry *p; | ||
| 347 | |||
| 348 | resolv_usage_page(usage >> 16); | ||
| 349 | printk("."); | ||
| 350 | for (p = hid_usage_table; p->description; p++) | ||
| 351 | if (p->page == (usage >> 16)) { | ||
| 352 | for(++p; p->description && p->usage != 0; p++) | ||
| 353 | if (p->usage == (usage & 0xffff)) { | ||
| 354 | printk("%s", p->description); | ||
| 355 | return; | ||
| 356 | } | ||
| 357 | break; | ||
| 358 | } | ||
| 359 | printk("%04x", usage & 0xffff); | ||
| 360 | } | ||
| 361 | |||
| 362 | __inline__ static void tab(int n) { | ||
| 363 | while (n--) printk(" "); | ||
| 364 | } | ||
| 365 | |||
| 366 | static void hid_dump_field(struct hid_field *field, int n) { | ||
| 367 | int j; | ||
| 368 | |||
| 369 | if (field->physical) { | ||
| 370 | tab(n); | ||
| 371 | printk("Physical("); | ||
| 372 | resolv_usage(field->physical); printk(")\n"); | ||
| 373 | } | ||
| 374 | if (field->logical) { | ||
| 375 | tab(n); | ||
| 376 | printk("Logical("); | ||
| 377 | resolv_usage(field->logical); printk(")\n"); | ||
| 378 | } | ||
| 379 | tab(n); printk("Usage(%d)\n", field->maxusage); | ||
| 380 | for (j = 0; j < field->maxusage; j++) { | ||
| 381 | tab(n+2);resolv_usage(field->usage[j].hid); printk("\n"); | ||
| 382 | } | ||
| 383 | if (field->logical_minimum != field->logical_maximum) { | ||
| 384 | tab(n); printk("Logical Minimum(%d)\n", field->logical_minimum); | ||
| 385 | tab(n); printk("Logical Maximum(%d)\n", field->logical_maximum); | ||
| 386 | } | ||
| 387 | if (field->physical_minimum != field->physical_maximum) { | ||
| 388 | tab(n); printk("Physical Minimum(%d)\n", field->physical_minimum); | ||
| 389 | tab(n); printk("Physical Maximum(%d)\n", field->physical_maximum); | ||
| 390 | } | ||
| 391 | if (field->unit_exponent) { | ||
| 392 | tab(n); printk("Unit Exponent(%d)\n", field->unit_exponent); | ||
| 393 | } | ||
| 394 | if (field->unit) { | ||
| 395 | char *systems[5] = { "None", "SI Linear", "SI Rotation", "English Linear", "English Rotation" }; | ||
| 396 | char *units[5][8] = { | ||
| 397 | { "None", "None", "None", "None", "None", "None", "None", "None" }, | ||
| 398 | { "None", "Centimeter", "Gram", "Seconds", "Kelvin", "Ampere", "Candela", "None" }, | ||
| 399 | { "None", "Radians", "Gram", "Seconds", "Kelvin", "Ampere", "Candela", "None" }, | ||
| 400 | { "None", "Inch", "Slug", "Seconds", "Fahrenheit", "Ampere", "Candela", "None" }, | ||
| 401 | { "None", "Degrees", "Slug", "Seconds", "Fahrenheit", "Ampere", "Candela", "None" } | ||
| 402 | }; | ||
| 403 | |||
| 404 | int i; | ||
| 405 | int sys; | ||
| 406 | __u32 data = field->unit; | ||
| 407 | |||
| 408 | /* First nibble tells us which system we're in. */ | ||
| 409 | sys = data & 0xf; | ||
| 410 | data >>= 4; | ||
| 411 | |||
| 412 | if(sys > 4) { | ||
| 413 | tab(n); printk("Unit(Invalid)\n"); | ||
| 414 | } | ||
| 415 | else { | ||
| 416 | int earlier_unit = 0; | ||
| 417 | |||
| 418 | tab(n); printk("Unit(%s : ", systems[sys]); | ||
| 419 | |||
| 420 | for (i=1 ; i<sizeof(__u32)*2 ; i++) { | ||
| 421 | char nibble = data & 0xf; | ||
| 422 | data >>= 4; | ||
| 423 | if (nibble != 0) { | ||
| 424 | if(earlier_unit++ > 0) | ||
| 425 | printk("*"); | ||
| 426 | printk("%s", units[sys][i]); | ||
| 427 | if(nibble != 1) { | ||
| 428 | /* This is a _signed_ nibble(!) */ | ||
| 429 | |||
| 430 | int val = nibble & 0x7; | ||
| 431 | if(nibble & 0x08) | ||
| 432 | val = -((0x7 & ~val) +1); | ||
| 433 | printk("^%d", val); | ||
| 434 | } | ||
| 435 | } | ||
| 436 | } | ||
| 437 | printk(")\n"); | ||
| 438 | } | ||
| 439 | } | ||
| 440 | tab(n); printk("Report Size(%u)\n", field->report_size); | ||
| 441 | tab(n); printk("Report Count(%u)\n", field->report_count); | ||
| 442 | tab(n); printk("Report Offset(%u)\n", field->report_offset); | ||
| 443 | |||
| 444 | tab(n); printk("Flags( "); | ||
| 445 | j = field->flags; | ||
| 446 | printk("%s", HID_MAIN_ITEM_CONSTANT & j ? "Constant " : ""); | ||
| 447 | printk("%s", HID_MAIN_ITEM_VARIABLE & j ? "Variable " : "Array "); | ||
| 448 | printk("%s", HID_MAIN_ITEM_RELATIVE & j ? "Relative " : "Absolute "); | ||
| 449 | printk("%s", HID_MAIN_ITEM_WRAP & j ? "Wrap " : ""); | ||
| 450 | printk("%s", HID_MAIN_ITEM_NONLINEAR & j ? "NonLinear " : ""); | ||
| 451 | printk("%s", HID_MAIN_ITEM_NO_PREFERRED & j ? "NoPrefferedState " : ""); | ||
| 452 | printk("%s", HID_MAIN_ITEM_NULL_STATE & j ? "NullState " : ""); | ||
| 453 | printk("%s", HID_MAIN_ITEM_VOLATILE & j ? "Volatile " : ""); | ||
| 454 | printk("%s", HID_MAIN_ITEM_BUFFERED_BYTE & j ? "BufferedByte " : ""); | ||
| 455 | printk(")\n"); | ||
| 456 | } | ||
| 457 | |||
| 458 | static void __attribute__((unused)) hid_dump_device(struct hid_device *device) { | ||
| 459 | struct hid_report_enum *report_enum; | ||
| 460 | struct hid_report *report; | ||
| 461 | struct list_head *list; | ||
| 462 | unsigned i,k; | ||
| 463 | static char *table[] = {"INPUT", "OUTPUT", "FEATURE"}; | ||
| 464 | |||
| 465 | for (i = 0; i < HID_REPORT_TYPES; i++) { | ||
| 466 | report_enum = device->report_enum + i; | ||
| 467 | list = report_enum->report_list.next; | ||
| 468 | while (list != &report_enum->report_list) { | ||
| 469 | report = (struct hid_report *) list; | ||
| 470 | tab(2); | ||
| 471 | printk("%s", table[i]); | ||
| 472 | if (report->id) | ||
| 473 | printk("(%d)", report->id); | ||
| 474 | printk("[%s]", table[report->type]); | ||
| 475 | printk("\n"); | ||
| 476 | for (k = 0; k < report->maxfield; k++) { | ||
| 477 | tab(4); | ||
| 478 | printk("Field(%d)\n", k); | ||
| 479 | hid_dump_field(report->field[k], 6); | ||
| 480 | } | ||
| 481 | list = list->next; | ||
| 482 | } | ||
| 483 | } | ||
| 484 | } | ||
| 485 | |||
| 486 | static void __attribute__((unused)) hid_dump_input(struct hid_usage *usage, __s32 value) { | ||
| 487 | printk("hid-debug: input "); | ||
| 488 | resolv_usage(usage->hid); | ||
| 489 | printk(" = %d\n", value); | ||
| 490 | } | ||
| 491 | |||
| 492 | |||
| 493 | static char *events[EV_MAX + 1] = { | ||
| 494 | [EV_SYN] = "Sync", [EV_KEY] = "Key", | ||
| 495 | [EV_REL] = "Relative", [EV_ABS] = "Absolute", | ||
| 496 | [EV_MSC] = "Misc", [EV_LED] = "LED", | ||
| 497 | [EV_SND] = "Sound", [EV_REP] = "Repeat", | ||
| 498 | [EV_FF] = "ForceFeedback", [EV_PWR] = "Power", | ||
| 499 | [EV_FF_STATUS] = "ForceFeedbackStatus", | ||
| 500 | }; | ||
| 501 | |||
| 502 | static char *syncs[2] = { | ||
| 503 | [SYN_REPORT] = "Report", [SYN_CONFIG] = "Config", | ||
| 504 | }; | ||
| 505 | static char *keys[KEY_MAX + 1] = { | ||
| 506 | [KEY_RESERVED] = "Reserved", [KEY_ESC] = "Esc", | ||
| 507 | [KEY_1] = "1", [KEY_2] = "2", | ||
| 508 | [KEY_3] = "3", [KEY_4] = "4", | ||
| 509 | [KEY_5] = "5", [KEY_6] = "6", | ||
| 510 | [KEY_7] = "7", [KEY_8] = "8", | ||
| 511 | [KEY_9] = "9", [KEY_0] = "0", | ||
| 512 | [KEY_MINUS] = "Minus", [KEY_EQUAL] = "Equal", | ||
| 513 | [KEY_BACKSPACE] = "Backspace", [KEY_TAB] = "Tab", | ||
| 514 | [KEY_Q] = "Q", [KEY_W] = "W", | ||
| 515 | [KEY_E] = "E", [KEY_R] = "R", | ||
| 516 | [KEY_T] = "T", [KEY_Y] = "Y", | ||
| 517 | [KEY_U] = "U", [KEY_I] = "I", | ||
| 518 | [KEY_O] = "O", [KEY_P] = "P", | ||
| 519 | [KEY_LEFTBRACE] = "LeftBrace", [KEY_RIGHTBRACE] = "RightBrace", | ||
| 520 | [KEY_ENTER] = "Enter", [KEY_LEFTCTRL] = "LeftControl", | ||
| 521 | [KEY_A] = "A", [KEY_S] = "S", | ||
| 522 | [KEY_D] = "D", [KEY_F] = "F", | ||
| 523 | [KEY_G] = "G", [KEY_H] = "H", | ||
| 524 | [KEY_J] = "J", [KEY_K] = "K", | ||
| 525 | [KEY_L] = "L", [KEY_SEMICOLON] = "Semicolon", | ||
| 526 | [KEY_APOSTROPHE] = "Apostrophe", [KEY_GRAVE] = "Grave", | ||
| 527 | [KEY_LEFTSHIFT] = "LeftShift", [KEY_BACKSLASH] = "BackSlash", | ||
| 528 | [KEY_Z] = "Z", [KEY_X] = "X", | ||
| 529 | [KEY_C] = "C", [KEY_V] = "V", | ||
| 530 | [KEY_B] = "B", [KEY_N] = "N", | ||
| 531 | [KEY_M] = "M", [KEY_COMMA] = "Comma", | ||
| 532 | [KEY_DOT] = "Dot", [KEY_SLASH] = "Slash", | ||
| 533 | [KEY_RIGHTSHIFT] = "RightShift", [KEY_KPASTERISK] = "KPAsterisk", | ||
| 534 | [KEY_LEFTALT] = "LeftAlt", [KEY_SPACE] = "Space", | ||
| 535 | [KEY_CAPSLOCK] = "CapsLock", [KEY_F1] = "F1", | ||
| 536 | [KEY_F2] = "F2", [KEY_F3] = "F3", | ||
| 537 | [KEY_F4] = "F4", [KEY_F5] = "F5", | ||
| 538 | [KEY_F6] = "F6", [KEY_F7] = "F7", | ||
| 539 | [KEY_F8] = "F8", [KEY_F9] = "F9", | ||
| 540 | [KEY_F10] = "F10", [KEY_NUMLOCK] = "NumLock", | ||
| 541 | [KEY_SCROLLLOCK] = "ScrollLock", [KEY_KP7] = "KP7", | ||
| 542 | [KEY_KP8] = "KP8", [KEY_KP9] = "KP9", | ||
| 543 | [KEY_KPMINUS] = "KPMinus", [KEY_KP4] = "KP4", | ||
| 544 | [KEY_KP5] = "KP5", [KEY_KP6] = "KP6", | ||
| 545 | [KEY_KPPLUS] = "KPPlus", [KEY_KP1] = "KP1", | ||
| 546 | [KEY_KP2] = "KP2", [KEY_KP3] = "KP3", | ||
| 547 | [KEY_KP0] = "KP0", [KEY_KPDOT] = "KPDot", | ||
| 548 | [KEY_ZENKAKUHANKAKU] = "Zenkaku/Hankaku", [KEY_102ND] = "102nd", | ||
| 549 | [KEY_F11] = "F11", [KEY_F12] = "F12", | ||
| 550 | [KEY_RO] = "RO", [KEY_KATAKANA] = "Katakana", | ||
| 551 | [KEY_HIRAGANA] = "HIRAGANA", [KEY_HENKAN] = "Henkan", | ||
| 552 | [KEY_KATAKANAHIRAGANA] = "Katakana/Hiragana", [KEY_MUHENKAN] = "Muhenkan", | ||
| 553 | [KEY_KPJPCOMMA] = "KPJpComma", [KEY_KPENTER] = "KPEnter", | ||
| 554 | [KEY_RIGHTCTRL] = "RightCtrl", [KEY_KPSLASH] = "KPSlash", | ||
| 555 | [KEY_SYSRQ] = "SysRq", [KEY_RIGHTALT] = "RightAlt", | ||
| 556 | [KEY_LINEFEED] = "LineFeed", [KEY_HOME] = "Home", | ||
| 557 | [KEY_UP] = "Up", [KEY_PAGEUP] = "PageUp", | ||
| 558 | [KEY_LEFT] = "Left", [KEY_RIGHT] = "Right", | ||
| 559 | [KEY_END] = "End", [KEY_DOWN] = "Down", | ||
| 560 | [KEY_PAGEDOWN] = "PageDown", [KEY_INSERT] = "Insert", | ||
| 561 | [KEY_DELETE] = "Delete", [KEY_MACRO] = "Macro", | ||
| 562 | [KEY_MUTE] = "Mute", [KEY_VOLUMEDOWN] = "VolumeDown", | ||
| 563 | [KEY_VOLUMEUP] = "VolumeUp", [KEY_POWER] = "Power", | ||
| 564 | [KEY_KPEQUAL] = "KPEqual", [KEY_KPPLUSMINUS] = "KPPlusMinus", | ||
| 565 | [KEY_PAUSE] = "Pause", [KEY_KPCOMMA] = "KPComma", | ||
| 566 | [KEY_HANGUEL] = "Hangeul", [KEY_HANJA] = "Hanja", | ||
| 567 | [KEY_YEN] = "Yen", [KEY_LEFTMETA] = "LeftMeta", | ||
| 568 | [KEY_RIGHTMETA] = "RightMeta", [KEY_COMPOSE] = "Compose", | ||
| 569 | [KEY_STOP] = "Stop", [KEY_AGAIN] = "Again", | ||
| 570 | [KEY_PROPS] = "Props", [KEY_UNDO] = "Undo", | ||
| 571 | [KEY_FRONT] = "Front", [KEY_COPY] = "Copy", | ||
| 572 | [KEY_OPEN] = "Open", [KEY_PASTE] = "Paste", | ||
| 573 | [KEY_FIND] = "Find", [KEY_CUT] = "Cut", | ||
| 574 | [KEY_HELP] = "Help", [KEY_MENU] = "Menu", | ||
| 575 | [KEY_CALC] = "Calc", [KEY_SETUP] = "Setup", | ||
| 576 | [KEY_SLEEP] = "Sleep", [KEY_WAKEUP] = "WakeUp", | ||
| 577 | [KEY_FILE] = "File", [KEY_SENDFILE] = "SendFile", | ||
| 578 | [KEY_DELETEFILE] = "DeleteFile", [KEY_XFER] = "X-fer", | ||
| 579 | [KEY_PROG1] = "Prog1", [KEY_PROG2] = "Prog2", | ||
| 580 | [KEY_WWW] = "WWW", [KEY_MSDOS] = "MSDOS", | ||
| 581 | [KEY_COFFEE] = "Coffee", [KEY_DIRECTION] = "Direction", | ||
| 582 | [KEY_CYCLEWINDOWS] = "CycleWindows", [KEY_MAIL] = "Mail", | ||
| 583 | [KEY_BOOKMARKS] = "Bookmarks", [KEY_COMPUTER] = "Computer", | ||
| 584 | [KEY_BACK] = "Back", [KEY_FORWARD] = "Forward", | ||
| 585 | [KEY_CLOSECD] = "CloseCD", [KEY_EJECTCD] = "EjectCD", | ||
| 586 | [KEY_EJECTCLOSECD] = "EjectCloseCD", [KEY_NEXTSONG] = "NextSong", | ||
| 587 | [KEY_PLAYPAUSE] = "PlayPause", [KEY_PREVIOUSSONG] = "PreviousSong", | ||
| 588 | [KEY_STOPCD] = "StopCD", [KEY_RECORD] = "Record", | ||
| 589 | [KEY_REWIND] = "Rewind", [KEY_PHONE] = "Phone", | ||
| 590 | [KEY_ISO] = "ISOKey", [KEY_CONFIG] = "Config", | ||
| 591 | [KEY_HOMEPAGE] = "HomePage", [KEY_REFRESH] = "Refresh", | ||
| 592 | [KEY_EXIT] = "Exit", [KEY_MOVE] = "Move", | ||
| 593 | [KEY_EDIT] = "Edit", [KEY_SCROLLUP] = "ScrollUp", | ||
| 594 | [KEY_SCROLLDOWN] = "ScrollDown", [KEY_KPLEFTPAREN] = "KPLeftParenthesis", | ||
| 595 | [KEY_KPRIGHTPAREN] = "KPRightParenthesis", [KEY_NEW] = "New", | ||
| 596 | [KEY_REDO] = "Redo", [KEY_F13] = "F13", | ||
| 597 | [KEY_F14] = "F14", [KEY_F15] = "F15", | ||
| 598 | [KEY_F16] = "F16", [KEY_F17] = "F17", | ||
| 599 | [KEY_F18] = "F18", [KEY_F19] = "F19", | ||
| 600 | [KEY_F20] = "F20", [KEY_F21] = "F21", | ||
| 601 | [KEY_F22] = "F22", [KEY_F23] = "F23", | ||
| 602 | [KEY_F24] = "F24", [KEY_PLAYCD] = "PlayCD", | ||
| 603 | [KEY_PAUSECD] = "PauseCD", [KEY_PROG3] = "Prog3", | ||
| 604 | [KEY_PROG4] = "Prog4", [KEY_SUSPEND] = "Suspend", | ||
| 605 | [KEY_CLOSE] = "Close", [KEY_PLAY] = "Play", | ||
| 606 | [KEY_FASTFORWARD] = "FastForward", [KEY_BASSBOOST] = "BassBoost", | ||
| 607 | [KEY_PRINT] = "Print", [KEY_HP] = "HP", | ||
| 608 | [KEY_CAMERA] = "Camera", [KEY_SOUND] = "Sound", | ||
| 609 | [KEY_QUESTION] = "Question", [KEY_EMAIL] = "Email", | ||
| 610 | [KEY_CHAT] = "Chat", [KEY_SEARCH] = "Search", | ||
| 611 | [KEY_CONNECT] = "Connect", [KEY_FINANCE] = "Finance", | ||
| 612 | [KEY_SPORT] = "Sport", [KEY_SHOP] = "Shop", | ||
| 613 | [KEY_ALTERASE] = "AlternateErase", [KEY_CANCEL] = "Cancel", | ||
| 614 | [KEY_BRIGHTNESSDOWN] = "BrightnessDown", [KEY_BRIGHTNESSUP] = "BrightnessUp", | ||
| 615 | [KEY_MEDIA] = "Media", [KEY_UNKNOWN] = "Unknown", | ||
| 616 | [BTN_0] = "Btn0", [BTN_1] = "Btn1", | ||
| 617 | [BTN_2] = "Btn2", [BTN_3] = "Btn3", | ||
| 618 | [BTN_4] = "Btn4", [BTN_5] = "Btn5", | ||
| 619 | [BTN_6] = "Btn6", [BTN_7] = "Btn7", | ||
| 620 | [BTN_8] = "Btn8", [BTN_9] = "Btn9", | ||
| 621 | [BTN_LEFT] = "LeftBtn", [BTN_RIGHT] = "RightBtn", | ||
| 622 | [BTN_MIDDLE] = "MiddleBtn", [BTN_SIDE] = "SideBtn", | ||
| 623 | [BTN_EXTRA] = "ExtraBtn", [BTN_FORWARD] = "ForwardBtn", | ||
| 624 | [BTN_BACK] = "BackBtn", [BTN_TASK] = "TaskBtn", | ||
| 625 | [BTN_TRIGGER] = "Trigger", [BTN_THUMB] = "ThumbBtn", | ||
| 626 | [BTN_THUMB2] = "ThumbBtn2", [BTN_TOP] = "TopBtn", | ||
| 627 | [BTN_TOP2] = "TopBtn2", [BTN_PINKIE] = "PinkieBtn", | ||
| 628 | [BTN_BASE] = "BaseBtn", [BTN_BASE2] = "BaseBtn2", | ||
| 629 | [BTN_BASE3] = "BaseBtn3", [BTN_BASE4] = "BaseBtn4", | ||
| 630 | [BTN_BASE5] = "BaseBtn5", [BTN_BASE6] = "BaseBtn6", | ||
| 631 | [BTN_DEAD] = "BtnDead", [BTN_A] = "BtnA", | ||
| 632 | [BTN_B] = "BtnB", [BTN_C] = "BtnC", | ||
| 633 | [BTN_X] = "BtnX", [BTN_Y] = "BtnY", | ||
| 634 | [BTN_Z] = "BtnZ", [BTN_TL] = "BtnTL", | ||
| 635 | [BTN_TR] = "BtnTR", [BTN_TL2] = "BtnTL2", | ||
| 636 | [BTN_TR2] = "BtnTR2", [BTN_SELECT] = "BtnSelect", | ||
| 637 | [BTN_START] = "BtnStart", [BTN_MODE] = "BtnMode", | ||
| 638 | [BTN_THUMBL] = "BtnThumbL", [BTN_THUMBR] = "BtnThumbR", | ||
| 639 | [BTN_TOOL_PEN] = "ToolPen", [BTN_TOOL_RUBBER] = "ToolRubber", | ||
| 640 | [BTN_TOOL_BRUSH] = "ToolBrush", [BTN_TOOL_PENCIL] = "ToolPencil", | ||
| 641 | [BTN_TOOL_AIRBRUSH] = "ToolAirbrush", [BTN_TOOL_FINGER] = "ToolFinger", | ||
| 642 | [BTN_TOOL_MOUSE] = "ToolMouse", [BTN_TOOL_LENS] = "ToolLens", | ||
| 643 | [BTN_TOUCH] = "Touch", [BTN_STYLUS] = "Stylus", | ||
| 644 | [BTN_STYLUS2] = "Stylus2", [BTN_TOOL_DOUBLETAP] = "ToolDoubleTap", | ||
| 645 | [BTN_TOOL_TRIPLETAP] = "ToolTripleTap", [BTN_GEAR_DOWN] = "WheelBtn", | ||
| 646 | [BTN_GEAR_UP] = "Gear up", [KEY_OK] = "Ok", | ||
| 647 | [KEY_SELECT] = "Select", [KEY_GOTO] = "Goto", | ||
| 648 | [KEY_CLEAR] = "Clear", [KEY_POWER2] = "Power2", | ||
| 649 | [KEY_OPTION] = "Option", [KEY_INFO] = "Info", | ||
| 650 | [KEY_TIME] = "Time", [KEY_VENDOR] = "Vendor", | ||
| 651 | [KEY_ARCHIVE] = "Archive", [KEY_PROGRAM] = "Program", | ||
| 652 | [KEY_CHANNEL] = "Channel", [KEY_FAVORITES] = "Favorites", | ||
| 653 | [KEY_EPG] = "EPG", [KEY_PVR] = "PVR", | ||
| 654 | [KEY_MHP] = "MHP", [KEY_LANGUAGE] = "Language", | ||
| 655 | [KEY_TITLE] = "Title", [KEY_SUBTITLE] = "Subtitle", | ||
| 656 | [KEY_ANGLE] = "Angle", [KEY_ZOOM] = "Zoom", | ||
| 657 | [KEY_MODE] = "Mode", [KEY_KEYBOARD] = "Keyboard", | ||
| 658 | [KEY_SCREEN] = "Screen", [KEY_PC] = "PC", | ||
| 659 | [KEY_TV] = "TV", [KEY_TV2] = "TV2", | ||
| 660 | [KEY_VCR] = "VCR", [KEY_VCR2] = "VCR2", | ||
| 661 | [KEY_SAT] = "Sat", [KEY_SAT2] = "Sat2", | ||
| 662 | [KEY_CD] = "CD", [KEY_TAPE] = "Tape", | ||
| 663 | [KEY_RADIO] = "Radio", [KEY_TUNER] = "Tuner", | ||
| 664 | [KEY_PLAYER] = "Player", [KEY_TEXT] = "Text", | ||
| 665 | [KEY_DVD] = "DVD", [KEY_AUX] = "Aux", | ||
| 666 | [KEY_MP3] = "MP3", [KEY_AUDIO] = "Audio", | ||
| 667 | [KEY_VIDEO] = "Video", [KEY_DIRECTORY] = "Directory", | ||
| 668 | [KEY_LIST] = "List", [KEY_MEMO] = "Memo", | ||
| 669 | [KEY_CALENDAR] = "Calendar", [KEY_RED] = "Red", | ||
| 670 | [KEY_GREEN] = "Green", [KEY_YELLOW] = "Yellow", | ||
| 671 | [KEY_BLUE] = "Blue", [KEY_CHANNELUP] = "ChannelUp", | ||
| 672 | [KEY_CHANNELDOWN] = "ChannelDown", [KEY_FIRST] = "First", | ||
| 673 | [KEY_LAST] = "Last", [KEY_AB] = "AB", | ||
| 674 | [KEY_NEXT] = "Next", [KEY_RESTART] = "Restart", | ||
| 675 | [KEY_SLOW] = "Slow", [KEY_SHUFFLE] = "Shuffle", | ||
| 676 | [KEY_BREAK] = "Break", [KEY_PREVIOUS] = "Previous", | ||
| 677 | [KEY_DIGITS] = "Digits", [KEY_TEEN] = "TEEN", | ||
| 678 | [KEY_TWEN] = "TWEN", [KEY_DEL_EOL] = "DeleteEOL", | ||
| 679 | [KEY_DEL_EOS] = "DeleteEOS", [KEY_INS_LINE] = "InsertLine", | ||
| 680 | [KEY_DEL_LINE] = "DeleteLine", | ||
| 681 | [KEY_SEND] = "Send", [KEY_REPLY] = "Reply", | ||
| 682 | [KEY_FORWARDMAIL] = "ForwardMail", [KEY_SAVE] = "Save", | ||
| 683 | [KEY_DOCUMENTS] = "Documents", | ||
| 684 | [KEY_FN] = "Fn", [KEY_FN_ESC] = "Fn+ESC", | ||
| 685 | [KEY_FN_1] = "Fn+1", [KEY_FN_2] = "Fn+2", | ||
| 686 | [KEY_FN_B] = "Fn+B", [KEY_FN_D] = "Fn+D", | ||
| 687 | [KEY_FN_E] = "Fn+E", [KEY_FN_F] = "Fn+F", | ||
| 688 | [KEY_FN_S] = "Fn+S", | ||
| 689 | [KEY_FN_F1] = "Fn+F1", [KEY_FN_F2] = "Fn+F2", | ||
| 690 | [KEY_FN_F3] = "Fn+F3", [KEY_FN_F4] = "Fn+F4", | ||
| 691 | [KEY_FN_F5] = "Fn+F5", [KEY_FN_F6] = "Fn+F6", | ||
| 692 | [KEY_FN_F7] = "Fn+F7", [KEY_FN_F8] = "Fn+F8", | ||
| 693 | [KEY_FN_F9] = "Fn+F9", [KEY_FN_F10] = "Fn+F10", | ||
| 694 | [KEY_FN_F11] = "Fn+F11", [KEY_FN_F12] = "Fn+F12", | ||
| 695 | [KEY_KBDILLUMTOGGLE] = "KbdIlluminationToggle", | ||
| 696 | [KEY_KBDILLUMDOWN] = "KbdIlluminationDown", | ||
| 697 | [KEY_KBDILLUMUP] = "KbdIlluminationUp", | ||
| 698 | [KEY_SWITCHVIDEOMODE] = "SwitchVideoMode", | ||
| 699 | }; | ||
| 700 | |||
| 701 | static char *relatives[REL_MAX + 1] = { | ||
| 702 | [REL_X] = "X", [REL_Y] = "Y", | ||
| 703 | [REL_Z] = "Z", [REL_RX] = "Rx", | ||
| 704 | [REL_RY] = "Ry", [REL_RZ] = "Rz", | ||
| 705 | [REL_HWHEEL] = "HWheel", [REL_DIAL] = "Dial", | ||
| 706 | [REL_WHEEL] = "Wheel", [REL_MISC] = "Misc", | ||
| 707 | }; | ||
| 708 | |||
| 709 | static char *absolutes[ABS_MAX + 1] = { | ||
| 710 | [ABS_X] = "X", [ABS_Y] = "Y", | ||
| 711 | [ABS_Z] = "Z", [ABS_RX] = "Rx", | ||
| 712 | [ABS_RY] = "Ry", [ABS_RZ] = "Rz", | ||
| 713 | [ABS_THROTTLE] = "Throttle", [ABS_RUDDER] = "Rudder", | ||
| 714 | [ABS_WHEEL] = "Wheel", [ABS_GAS] = "Gas", | ||
| 715 | [ABS_BRAKE] = "Brake", [ABS_HAT0X] = "Hat0X", | ||
| 716 | [ABS_HAT0Y] = "Hat0Y", [ABS_HAT1X] = "Hat1X", | ||
| 717 | [ABS_HAT1Y] = "Hat1Y", [ABS_HAT2X] = "Hat2X", | ||
| 718 | [ABS_HAT2Y] = "Hat2Y", [ABS_HAT3X] = "Hat3X", | ||
| 719 | [ABS_HAT3Y] = "Hat 3Y", [ABS_PRESSURE] = "Pressure", | ||
| 720 | [ABS_DISTANCE] = "Distance", [ABS_TILT_X] = "XTilt", | ||
| 721 | [ABS_TILT_Y] = "YTilt", [ABS_TOOL_WIDTH] = "Tool Width", | ||
| 722 | [ABS_VOLUME] = "Volume", [ABS_MISC] = "Misc", | ||
| 723 | }; | ||
| 724 | 26 | ||
| 725 | static char *misc[MSC_MAX + 1] = { | 27 | void hid_dump_input(struct hid_usage *, __s32); |
| 726 | [MSC_SERIAL] = "Serial", [MSC_PULSELED] = "Pulseled", | 28 | void hid_dump_device(struct hid_device *); |
| 727 | [MSC_GESTURE] = "Gesture", [MSC_RAW] = "RawData" | 29 | void hid_dump_field(struct hid_field *, int); |
| 728 | }; | 30 | void hid_resolv_usage(unsigned); |
| 31 | void hid_resolv_event(__u8, __u16); | ||
| 729 | 32 | ||
| 730 | static char *leds[LED_MAX + 1] = { | 33 | #else |
| 731 | [LED_NUML] = "NumLock", [LED_CAPSL] = "CapsLock", | ||
| 732 | [LED_SCROLLL] = "ScrollLock", [LED_COMPOSE] = "Compose", | ||
| 733 | [LED_KANA] = "Kana", [LED_SLEEP] = "Sleep", | ||
| 734 | [LED_SUSPEND] = "Suspend", [LED_MUTE] = "Mute", | ||
| 735 | [LED_MISC] = "Misc", | ||
| 736 | }; | ||
| 737 | 34 | ||
| 738 | static char *repeats[REP_MAX + 1] = { | 35 | #define hid_dump_input(a,b) do { } while (0) |
| 739 | [REP_DELAY] = "Delay", [REP_PERIOD] = "Period" | 36 | #define hid_dump_device(c) do { } while (0) |
| 740 | }; | 37 | #define hid_dump_field(a,b) do { } while (0) |
| 38 | #define hid_resolv_usage(a) do { } while (0) | ||
| 39 | #define hid_resolv_event(a,b) do { } while (0) | ||
| 741 | 40 | ||
| 742 | static char *sounds[SND_MAX + 1] = { | 41 | #endif /* CONFIG_HID_DEBUG */ |
| 743 | [SND_CLICK] = "Click", [SND_BELL] = "Bell", | ||
| 744 | [SND_TONE] = "Tone" | ||
| 745 | }; | ||
| 746 | 42 | ||
| 747 | static char **names[EV_MAX + 1] = { | ||
| 748 | [EV_SYN] = syncs, [EV_KEY] = keys, | ||
| 749 | [EV_REL] = relatives, [EV_ABS] = absolutes, | ||
| 750 | [EV_MSC] = misc, [EV_LED] = leds, | ||
| 751 | [EV_SND] = sounds, [EV_REP] = repeats, | ||
| 752 | }; | ||
| 753 | 43 | ||
| 754 | static void __attribute__((unused)) resolv_event(__u8 type, __u16 code) { | 44 | #endif |
| 755 | 45 | ||
| 756 | printk("%s.%s", events[type] ? events[type] : "?", | ||
| 757 | names[type] ? (names[type][code] ? names[type][code] : "?") : "?"); | ||
| 758 | } | ||
diff --git a/include/linux/hid.h b/include/linux/hid.h index 342b4e639acb..93173fe45634 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h | |||
| @@ -264,6 +264,8 @@ struct hid_item { | |||
| 264 | #define HID_QUIRK_INVERT_HWHEEL 0x00004000 | 264 | #define HID_QUIRK_INVERT_HWHEEL 0x00004000 |
| 265 | #define HID_QUIRK_POWERBOOK_ISO_KEYBOARD 0x00008000 | 265 | #define HID_QUIRK_POWERBOOK_ISO_KEYBOARD 0x00008000 |
| 266 | #define HID_QUIRK_BAD_RELATIVE_KEYS 0x00010000 | 266 | #define HID_QUIRK_BAD_RELATIVE_KEYS 0x00010000 |
| 267 | #define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00020000 | ||
| 268 | #define HID_QUIRK_IGNORE_MOUSE 0x00040000 | ||
| 267 | 269 | ||
| 268 | /* | 270 | /* |
| 269 | * This is the global environment of the parser. This information is | 271 | * This is the global environment of the parser. This information is |
| @@ -430,8 +432,8 @@ struct hid_device { /* device report descriptor */ | |||
| 430 | 432 | ||
| 431 | /* device-specific function pointers */ | 433 | /* device-specific function pointers */ |
| 432 | int (*hidinput_input_event) (struct input_dev *, unsigned int, unsigned int, int); | 434 | int (*hidinput_input_event) (struct input_dev *, unsigned int, unsigned int, int); |
| 433 | int (*hidinput_open) (struct input_dev *); | 435 | int (*hid_open) (struct hid_device *); |
| 434 | void (*hidinput_close) (struct input_dev *); | 436 | void (*hid_close) (struct hid_device *); |
| 435 | 437 | ||
| 436 | /* hiddev event handler */ | 438 | /* hiddev event handler */ |
| 437 | void (*hiddev_hid_event) (struct hid_device *, struct hid_field *field, | 439 | void (*hiddev_hid_event) (struct hid_device *, struct hid_field *field, |
| @@ -471,16 +473,6 @@ struct hid_descriptor { | |||
| 471 | struct hid_class_descriptor desc[1]; | 473 | struct hid_class_descriptor desc[1]; |
| 472 | } __attribute__ ((packed)); | 474 | } __attribute__ ((packed)); |
| 473 | 475 | ||
| 474 | #ifdef DEBUG | ||
| 475 | #include "hid-debug.h" | ||
| 476 | #else | ||
| 477 | #define hid_dump_input(a,b) do { } while (0) | ||
| 478 | #define hid_dump_device(c) do { } while (0) | ||
| 479 | #define hid_dump_field(a,b) do { } while (0) | ||
| 480 | #define resolv_usage(a) do { } while (0) | ||
| 481 | #define resolv_event(a,b) do { } while (0) | ||
| 482 | #endif | ||
| 483 | |||
| 484 | /* Applications from HID Usage Tables 4/8/99 Version 1.1 */ | 476 | /* Applications from HID Usage Tables 4/8/99 Version 1.1 */ |
| 485 | /* We ignore a few input applications that are not widely used */ | 477 | /* We ignore a few input applications that are not widely used */ |
| 486 | #define IS_INPUT_APPLICATION(a) (((a >= 0x00010000) && (a <= 0x00010008)) || (a == 0x00010080) || (a == 0x000c0001)) | 478 | #define IS_INPUT_APPLICATION(a) (((a >= 0x00010000) && (a <= 0x00010008)) || (a == 0x00010080) || (a == 0x000c0001)) |
| @@ -503,6 +495,7 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size); | |||
| 503 | int hid_ff_init(struct hid_device *hid); | 495 | int hid_ff_init(struct hid_device *hid); |
| 504 | 496 | ||
| 505 | int hid_lgff_init(struct hid_device *hid); | 497 | int hid_lgff_init(struct hid_device *hid); |
| 498 | int hid_plff_init(struct hid_device *hid); | ||
| 506 | int hid_tmff_init(struct hid_device *hid); | 499 | int hid_tmff_init(struct hid_device *hid); |
| 507 | int hid_zpff_init(struct hid_device *hid); | 500 | int hid_zpff_init(struct hid_device *hid); |
| 508 | #ifdef CONFIG_HID_PID | 501 | #ifdef CONFIG_HID_PID |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 22aa69e20905..91bb8ceef0b5 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
| @@ -1054,6 +1054,8 @@ static inline void ata_pause(struct ata_port *ap) | |||
| 1054 | /** | 1054 | /** |
| 1055 | * ata_busy_wait - Wait for a port status register | 1055 | * ata_busy_wait - Wait for a port status register |
| 1056 | * @ap: Port to wait for. | 1056 | * @ap: Port to wait for. |
| 1057 | * @bits: bits that must be clear | ||
| 1058 | * @max: number of 10uS waits to perform | ||
| 1057 | * | 1059 | * |
| 1058 | * Waits up to max*10 microseconds for the selected bits in the port's | 1060 | * Waits up to max*10 microseconds for the selected bits in the port's |
| 1059 | * status register to be cleared. | 1061 | * status register to be cleared. |
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index d0e6a5497614..e45712acfac5 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h | |||
| @@ -71,6 +71,7 @@ struct mmc_card { | |||
| 71 | #define MMC_STATE_SDCARD (1<<3) /* is an SD card */ | 71 | #define MMC_STATE_SDCARD (1<<3) /* is an SD card */ |
| 72 | #define MMC_STATE_READONLY (1<<4) /* card is read-only */ | 72 | #define MMC_STATE_READONLY (1<<4) /* card is read-only */ |
| 73 | #define MMC_STATE_HIGHSPEED (1<<5) /* card is in high speed mode */ | 73 | #define MMC_STATE_HIGHSPEED (1<<5) /* card is in high speed mode */ |
| 74 | #define MMC_STATE_BLOCKADDR (1<<6) /* card uses block-addressing */ | ||
| 74 | u32 raw_cid[4]; /* raw card CID */ | 75 | u32 raw_cid[4]; /* raw card CID */ |
| 75 | u32 raw_csd[4]; /* raw card CSD */ | 76 | u32 raw_csd[4]; /* raw card CSD */ |
| 76 | u32 raw_scr[2]; /* raw card SCR */ | 77 | u32 raw_scr[2]; /* raw card SCR */ |
| @@ -87,6 +88,7 @@ struct mmc_card { | |||
| 87 | #define mmc_card_sd(c) ((c)->state & MMC_STATE_SDCARD) | 88 | #define mmc_card_sd(c) ((c)->state & MMC_STATE_SDCARD) |
| 88 | #define mmc_card_readonly(c) ((c)->state & MMC_STATE_READONLY) | 89 | #define mmc_card_readonly(c) ((c)->state & MMC_STATE_READONLY) |
| 89 | #define mmc_card_highspeed(c) ((c)->state & MMC_STATE_HIGHSPEED) | 90 | #define mmc_card_highspeed(c) ((c)->state & MMC_STATE_HIGHSPEED) |
| 91 | #define mmc_card_blockaddr(c) ((c)->state & MMC_STATE_BLOCKADDR) | ||
| 90 | 92 | ||
| 91 | #define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT) | 93 | #define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT) |
| 92 | #define mmc_card_set_dead(c) ((c)->state |= MMC_STATE_DEAD) | 94 | #define mmc_card_set_dead(c) ((c)->state |= MMC_STATE_DEAD) |
| @@ -94,6 +96,7 @@ struct mmc_card { | |||
| 94 | #define mmc_card_set_sd(c) ((c)->state |= MMC_STATE_SDCARD) | 96 | #define mmc_card_set_sd(c) ((c)->state |= MMC_STATE_SDCARD) |
| 95 | #define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY) | 97 | #define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY) |
| 96 | #define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED) | 98 | #define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED) |
| 99 | #define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR) | ||
| 97 | 100 | ||
| 98 | #define mmc_card_name(c) ((c)->cid.prod_name) | 101 | #define mmc_card_name(c) ((c)->cid.prod_name) |
| 99 | #define mmc_card_id(c) ((c)->dev.bus_id) | 102 | #define mmc_card_id(c) ((c)->dev.bus_id) |
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index c15ae1986b98..913e5752569f 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h | |||
| @@ -92,8 +92,10 @@ struct mmc_host { | |||
| 92 | unsigned int max_seg_size; /* see blk_queue_max_segment_size */ | 92 | unsigned int max_seg_size; /* see blk_queue_max_segment_size */ |
| 93 | unsigned short max_hw_segs; /* see blk_queue_max_hw_segments */ | 93 | unsigned short max_hw_segs; /* see blk_queue_max_hw_segments */ |
| 94 | unsigned short max_phys_segs; /* see blk_queue_max_phys_segments */ | 94 | unsigned short max_phys_segs; /* see blk_queue_max_phys_segments */ |
| 95 | unsigned short max_sectors; /* see blk_queue_max_sectors */ | ||
| 96 | unsigned short unused; | 95 | unsigned short unused; |
| 96 | unsigned int max_req_size; /* maximum number of bytes in one req */ | ||
| 97 | unsigned int max_blk_size; /* maximum size of one mmc block */ | ||
| 98 | unsigned int max_blk_count; /* maximum number of blocks in one req */ | ||
| 97 | 99 | ||
| 98 | /* private data */ | 100 | /* private data */ |
| 99 | struct mmc_ios ios; /* current io bus settings */ | 101 | struct mmc_ios ios; /* current io bus settings */ |
| @@ -106,8 +108,9 @@ struct mmc_host { | |||
| 106 | struct list_head cards; /* devices attached to this host */ | 108 | struct list_head cards; /* devices attached to this host */ |
| 107 | 109 | ||
| 108 | wait_queue_head_t wq; | 110 | wait_queue_head_t wq; |
| 109 | spinlock_t lock; /* card_busy lock */ | 111 | spinlock_t lock; /* claimed lock */ |
| 110 | struct mmc_card *card_busy; /* the MMC card claiming host */ | 112 | unsigned int claimed:1; /* host exclusively claimed */ |
| 113 | |||
| 111 | struct mmc_card *card_selected; /* the selected MMC card */ | 114 | struct mmc_card *card_selected; /* the selected MMC card */ |
| 112 | 115 | ||
| 113 | struct delayed_work detect; | 116 | struct delayed_work detect; |
| @@ -126,6 +129,7 @@ static inline void *mmc_priv(struct mmc_host *host) | |||
| 126 | } | 129 | } |
| 127 | 130 | ||
| 128 | #define mmc_dev(x) ((x)->parent) | 131 | #define mmc_dev(x) ((x)->parent) |
| 132 | #define mmc_classdev(x) (&(x)->class_dev) | ||
| 129 | #define mmc_hostname(x) ((x)->class_dev.bus_id) | 133 | #define mmc_hostname(x) ((x)->class_dev.bus_id) |
| 130 | 134 | ||
| 131 | extern int mmc_suspend_host(struct mmc_host *, pm_message_t); | 135 | extern int mmc_suspend_host(struct mmc_host *, pm_message_t); |
diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index bcf24909d677..cdc54be804f1 100644 --- a/include/linux/mmc/mmc.h +++ b/include/linux/mmc/mmc.h | |||
| @@ -43,6 +43,7 @@ struct mmc_command { | |||
| 43 | #define MMC_RSP_R2 (MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC) | 43 | #define MMC_RSP_R2 (MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC) |
| 44 | #define MMC_RSP_R3 (MMC_RSP_PRESENT) | 44 | #define MMC_RSP_R3 (MMC_RSP_PRESENT) |
| 45 | #define MMC_RSP_R6 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE) | 45 | #define MMC_RSP_R6 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE) |
| 46 | #define MMC_RSP_R7 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE) | ||
| 46 | 47 | ||
| 47 | #define mmc_resp_type(cmd) ((cmd)->flags & (MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC|MMC_RSP_BUSY|MMC_RSP_OPCODE)) | 48 | #define mmc_resp_type(cmd) ((cmd)->flags & (MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC|MMC_RSP_BUSY|MMC_RSP_OPCODE)) |
| 48 | 49 | ||
diff --git a/include/linux/mmc/protocol.h b/include/linux/mmc/protocol.h index 2dce60c43f4b..c90b6768329d 100644 --- a/include/linux/mmc/protocol.h +++ b/include/linux/mmc/protocol.h | |||
| @@ -79,9 +79,12 @@ | |||
| 79 | #define MMC_GEN_CMD 56 /* adtc [0] RD/WR R1 */ | 79 | #define MMC_GEN_CMD 56 /* adtc [0] RD/WR R1 */ |
| 80 | 80 | ||
| 81 | /* SD commands type argument response */ | 81 | /* SD commands type argument response */ |
| 82 | /* class 8 */ | 82 | /* class 0 */ |
| 83 | /* This is basically the same command as for MMC with some quirks. */ | 83 | /* This is basically the same command as for MMC with some quirks. */ |
| 84 | #define SD_SEND_RELATIVE_ADDR 3 /* bcr R6 */ | 84 | #define SD_SEND_RELATIVE_ADDR 3 /* bcr R6 */ |
| 85 | #define SD_SEND_IF_COND 8 /* bcr [11:0] See below R7 */ | ||
| 86 | |||
| 87 | /* class 10 */ | ||
| 85 | #define SD_SWITCH 6 /* adtc [31:0] See below R1 */ | 88 | #define SD_SWITCH 6 /* adtc [31:0] See below R1 */ |
| 86 | 89 | ||
| 87 | /* Application commands */ | 90 | /* Application commands */ |
| @@ -115,6 +118,14 @@ | |||
| 115 | */ | 118 | */ |
| 116 | 119 | ||
| 117 | /* | 120 | /* |
| 121 | * SD_SEND_IF_COND argument format: | ||
| 122 | * | ||
| 123 | * [31:12] Reserved (0) | ||
| 124 | * [11:8] Host Voltage Supply Flags | ||
| 125 | * [7:0] Check Pattern (0xAA) | ||
| 126 | */ | ||
| 127 | |||
| 128 | /* | ||
| 118 | MMC status in R1 | 129 | MMC status in R1 |
| 119 | Type | 130 | Type |
| 120 | e : error bit | 131 | e : error bit |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 3d1d21035dec..ccd706f876ec 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
| @@ -735,9 +735,11 @@ | |||
| 735 | #define PCI_DEVICE_ID_TI_TVP4020 0x3d07 | 735 | #define PCI_DEVICE_ID_TI_TVP4020 0x3d07 |
| 736 | #define PCI_DEVICE_ID_TI_4450 0x8011 | 736 | #define PCI_DEVICE_ID_TI_4450 0x8011 |
| 737 | #define PCI_DEVICE_ID_TI_XX21_XX11 0x8031 | 737 | #define PCI_DEVICE_ID_TI_XX21_XX11 0x8031 |
| 738 | #define PCI_DEVICE_ID_TI_XX21_XX11_FM 0x8033 | ||
| 738 | #define PCI_DEVICE_ID_TI_XX21_XX11_SD 0x8034 | 739 | #define PCI_DEVICE_ID_TI_XX21_XX11_SD 0x8034 |
| 739 | #define PCI_DEVICE_ID_TI_X515 0x8036 | 740 | #define PCI_DEVICE_ID_TI_X515 0x8036 |
| 740 | #define PCI_DEVICE_ID_TI_XX12 0x8039 | 741 | #define PCI_DEVICE_ID_TI_XX12 0x8039 |
| 742 | #define PCI_DEVICE_ID_TI_XX12_FM 0x803b | ||
| 741 | #define PCI_DEVICE_ID_TI_1130 0xac12 | 743 | #define PCI_DEVICE_ID_TI_1130 0xac12 |
| 742 | #define PCI_DEVICE_ID_TI_1031 0xac13 | 744 | #define PCI_DEVICE_ID_TI_1031 0xac13 |
| 743 | #define PCI_DEVICE_ID_TI_1131 0xac15 | 745 | #define PCI_DEVICE_ID_TI_1131 0xac15 |
| @@ -765,6 +767,7 @@ | |||
| 765 | #define PCI_DEVICE_ID_TI_1510 0xac56 | 767 | #define PCI_DEVICE_ID_TI_1510 0xac56 |
| 766 | #define PCI_DEVICE_ID_TI_X620 0xac8d | 768 | #define PCI_DEVICE_ID_TI_X620 0xac8d |
| 767 | #define PCI_DEVICE_ID_TI_X420 0xac8e | 769 | #define PCI_DEVICE_ID_TI_X420 0xac8e |
| 770 | #define PCI_DEVICE_ID_TI_XX20_FM 0xac8f | ||
| 768 | 771 | ||
| 769 | #define PCI_VENDOR_ID_SONY 0x104d | 772 | #define PCI_VENDOR_ID_SONY 0x104d |
| 770 | 773 | ||
| @@ -1971,6 +1974,7 @@ | |||
| 1971 | #define PCI_DEVICE_ID_TOPIC_TP560 0x0000 | 1974 | #define PCI_DEVICE_ID_TOPIC_TP560 0x0000 |
| 1972 | 1975 | ||
| 1973 | #define PCI_VENDOR_ID_ENE 0x1524 | 1976 | #define PCI_VENDOR_ID_ENE 0x1524 |
| 1977 | #define PCI_DEVICE_ID_ENE_CB712_SD 0x0550 | ||
| 1974 | #define PCI_DEVICE_ID_ENE_1211 0x1211 | 1978 | #define PCI_DEVICE_ID_ENE_1211 0x1211 |
| 1975 | #define PCI_DEVICE_ID_ENE_1225 0x1225 | 1979 | #define PCI_DEVICE_ID_ENE_1225 0x1225 |
| 1976 | #define PCI_DEVICE_ID_ENE_1410 0x1410 | 1980 | #define PCI_DEVICE_ID_ENE_1410 0x1410 |
diff --git a/include/linux/tifm.h b/include/linux/tifm.h index dfb8052eee5e..3deb0a6c1370 100644 --- a/include/linux/tifm.h +++ b/include/linux/tifm.h | |||
| @@ -17,7 +17,7 @@ | |||
| 17 | #include <linux/wait.h> | 17 | #include <linux/wait.h> |
| 18 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
| 19 | #include <linux/pci.h> | 19 | #include <linux/pci.h> |
| 20 | #include <linux/scatterlist.h> | 20 | #include <linux/kthread.h> |
| 21 | 21 | ||
| 22 | /* Host registers (relative to pci base address): */ | 22 | /* Host registers (relative to pci base address): */ |
| 23 | enum { | 23 | enum { |
| @@ -62,11 +62,10 @@ enum { | |||
| 62 | 62 | ||
| 63 | 63 | ||
| 64 | #define TIFM_IRQ_ENABLE 0x80000000 | 64 | #define TIFM_IRQ_ENABLE 0x80000000 |
| 65 | #define TIFM_IRQ_SOCKMASK 0x00000001 | 65 | #define TIFM_IRQ_SOCKMASK(x) (x) |
| 66 | #define TIFM_IRQ_CARDMASK 0x00000100 | 66 | #define TIFM_IRQ_CARDMASK(x) ((x) << 8) |
| 67 | #define TIFM_IRQ_FIFOMASK 0x00010000 | 67 | #define TIFM_IRQ_FIFOMASK(x) ((x) << 16) |
| 68 | #define TIFM_IRQ_SETALL 0xffffffff | 68 | #define TIFM_IRQ_SETALL 0xffffffff |
| 69 | #define TIFM_IRQ_SETALLSOCK 0x0000000f | ||
| 70 | 69 | ||
| 71 | #define TIFM_CTRL_LED 0x00000040 | 70 | #define TIFM_CTRL_LED 0x00000040 |
| 72 | #define TIFM_CTRL_FAST_CLK 0x00000100 | 71 | #define TIFM_CTRL_FAST_CLK 0x00000100 |
| @@ -89,10 +88,9 @@ struct tifm_dev { | |||
| 89 | char __iomem *addr; | 88 | char __iomem *addr; |
| 90 | spinlock_t lock; | 89 | spinlock_t lock; |
| 91 | tifm_media_id media_id; | 90 | tifm_media_id media_id; |
| 92 | char wq_name[KOBJ_NAME_LEN]; | 91 | unsigned int socket_id; |
| 93 | struct workqueue_struct *wq; | ||
| 94 | 92 | ||
| 95 | unsigned int (*signal_irq)(struct tifm_dev *sock, | 93 | void (*signal_irq)(struct tifm_dev *sock, |
| 96 | unsigned int sock_irq_status); | 94 | unsigned int sock_irq_status); |
| 97 | 95 | ||
| 98 | struct tifm_driver *drv; | 96 | struct tifm_driver *drv; |
| @@ -103,24 +101,23 @@ struct tifm_driver { | |||
| 103 | tifm_media_id *id_table; | 101 | tifm_media_id *id_table; |
| 104 | int (*probe)(struct tifm_dev *dev); | 102 | int (*probe)(struct tifm_dev *dev); |
| 105 | void (*remove)(struct tifm_dev *dev); | 103 | void (*remove)(struct tifm_dev *dev); |
| 104 | int (*suspend)(struct tifm_dev *dev, | ||
| 105 | pm_message_t state); | ||
| 106 | int (*resume)(struct tifm_dev *dev); | ||
| 106 | 107 | ||
| 107 | struct device_driver driver; | 108 | struct device_driver driver; |
| 108 | }; | 109 | }; |
| 109 | 110 | ||
| 110 | struct tifm_adapter { | 111 | struct tifm_adapter { |
| 111 | char __iomem *addr; | 112 | char __iomem *addr; |
| 112 | unsigned int irq_status; | ||
| 113 | unsigned int insert_mask; | ||
| 114 | unsigned int remove_mask; | ||
| 115 | spinlock_t lock; | 113 | spinlock_t lock; |
| 114 | unsigned int irq_status; | ||
| 115 | unsigned int socket_change_set; | ||
| 116 | wait_queue_head_t change_set_notify; | ||
| 116 | unsigned int id; | 117 | unsigned int id; |
| 117 | unsigned int max_sockets; | 118 | unsigned int num_sockets; |
| 118 | char wq_name[KOBJ_NAME_LEN]; | ||
| 119 | unsigned int inhibit_new_cards; | ||
| 120 | struct workqueue_struct *wq; | ||
| 121 | struct work_struct media_inserter; | ||
| 122 | struct work_struct media_remover; | ||
| 123 | struct tifm_dev **sockets; | 119 | struct tifm_dev **sockets; |
| 120 | struct task_struct *media_switcher; | ||
| 124 | struct class_device cdev; | 121 | struct class_device cdev; |
| 125 | struct device *dev; | 122 | struct device *dev; |
| 126 | 123 | ||
| @@ -130,9 +127,9 @@ struct tifm_adapter { | |||
| 130 | struct tifm_adapter *tifm_alloc_adapter(void); | 127 | struct tifm_adapter *tifm_alloc_adapter(void); |
| 131 | void tifm_free_device(struct device *dev); | 128 | void tifm_free_device(struct device *dev); |
| 132 | void tifm_free_adapter(struct tifm_adapter *fm); | 129 | void tifm_free_adapter(struct tifm_adapter *fm); |
| 133 | int tifm_add_adapter(struct tifm_adapter *fm); | 130 | int tifm_add_adapter(struct tifm_adapter *fm, int (*mediathreadfn)(void *data)); |
| 134 | void tifm_remove_adapter(struct tifm_adapter *fm); | 131 | void tifm_remove_adapter(struct tifm_adapter *fm); |
| 135 | struct tifm_dev *tifm_alloc_device(struct tifm_adapter *fm, unsigned int id); | 132 | struct tifm_dev *tifm_alloc_device(struct tifm_adapter *fm); |
| 136 | int tifm_register_driver(struct tifm_driver *drv); | 133 | int tifm_register_driver(struct tifm_driver *drv); |
| 137 | void tifm_unregister_driver(struct tifm_driver *drv); | 134 | void tifm_unregister_driver(struct tifm_driver *drv); |
| 138 | void tifm_eject(struct tifm_dev *sock); | 135 | void tifm_eject(struct tifm_dev *sock); |
diff --git a/include/rdma/ib_user_mad.h b/include/rdma/ib_user_mad.h index 44537aa32e62..d66b15ea82c4 100644 --- a/include/rdma/ib_user_mad.h +++ b/include/rdma/ib_user_mad.h | |||
| @@ -98,7 +98,7 @@ struct ib_user_mad_hdr { | |||
| 98 | */ | 98 | */ |
| 99 | struct ib_user_mad { | 99 | struct ib_user_mad { |
| 100 | struct ib_user_mad_hdr hdr; | 100 | struct ib_user_mad_hdr hdr; |
| 101 | __u8 data[0]; | 101 | __u64 data[0]; |
| 102 | }; | 102 | }; |
| 103 | 103 | ||
| 104 | /** | 104 | /** |
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 0bfa3328d686..765589f4d166 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h | |||
| @@ -45,6 +45,7 @@ | |||
| 45 | #include <linux/device.h> | 45 | #include <linux/device.h> |
| 46 | #include <linux/mm.h> | 46 | #include <linux/mm.h> |
| 47 | #include <linux/dma-mapping.h> | 47 | #include <linux/dma-mapping.h> |
| 48 | #include <linux/kref.h> | ||
| 48 | 49 | ||
| 49 | #include <asm/atomic.h> | 50 | #include <asm/atomic.h> |
| 50 | #include <asm/scatterlist.h> | 51 | #include <asm/scatterlist.h> |
| @@ -419,8 +420,8 @@ struct ib_wc { | |||
| 419 | enum ib_wc_opcode opcode; | 420 | enum ib_wc_opcode opcode; |
| 420 | u32 vendor_err; | 421 | u32 vendor_err; |
| 421 | u32 byte_len; | 422 | u32 byte_len; |
| 423 | struct ib_qp *qp; | ||
| 422 | __be32 imm_data; | 424 | __be32 imm_data; |
| 423 | u32 qp_num; | ||
| 424 | u32 src_qp; | 425 | u32 src_qp; |
| 425 | int wc_flags; | 426 | int wc_flags; |
| 426 | u16 pkey_index; | 427 | u16 pkey_index; |
