diff options
| author | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-06-10 14:47:26 -0400 |
|---|---|---|
| committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-06-10 14:47:26 -0400 |
| commit | f0cd91a68acdc9b49d7f6738b514a426da627649 (patch) | |
| tree | 8ad73564015794197583b094217ae0a71e71e753 /include | |
| parent | 60eef25701d25e99c991dd0f4a9f3832a0c3ad3e (diff) | |
| parent | 128e6ced247cda88f96fa9f2e4ba8b2c4a681560 (diff) | |
Merge ../linux-2.6
Diffstat (limited to 'include')
207 files changed, 3578 insertions, 691 deletions
diff --git a/include/asm-alpha/smp.h b/include/asm-alpha/smp.h index 9950706abd..e1432102be 100644 --- a/include/asm-alpha/smp.h +++ b/include/asm-alpha/smp.h | |||
| @@ -45,10 +45,8 @@ extern struct cpuinfo_alpha cpu_data[NR_CPUS]; | |||
| 45 | #define hard_smp_processor_id() __hard_smp_processor_id() | 45 | #define hard_smp_processor_id() __hard_smp_processor_id() |
| 46 | #define raw_smp_processor_id() (current_thread_info()->cpu) | 46 | #define raw_smp_processor_id() (current_thread_info()->cpu) |
| 47 | 47 | ||
| 48 | extern cpumask_t cpu_present_mask; | ||
| 49 | extern cpumask_t cpu_online_map; | ||
| 50 | extern int smp_num_cpus; | 48 | extern int smp_num_cpus; |
| 51 | #define cpu_possible_map cpu_present_mask | 49 | #define cpu_possible_map cpu_present_map |
| 52 | 50 | ||
| 53 | int smp_call_function_on_cpu(void (*func) (void *info), void *info,int retry, int wait, cpumask_t cpu); | 51 | int smp_call_function_on_cpu(void (*func) (void *info), void *info,int retry, int wait, cpumask_t cpu); |
| 54 | 52 | ||
diff --git a/include/asm-alpha/termbits.h b/include/asm-alpha/termbits.h index f4837fa294..5541101b58 100644 --- a/include/asm-alpha/termbits.h +++ b/include/asm-alpha/termbits.h | |||
| @@ -148,6 +148,7 @@ struct termios { | |||
| 148 | #define HUPCL 00040000 | 148 | #define HUPCL 00040000 |
| 149 | 149 | ||
| 150 | #define CLOCAL 00100000 | 150 | #define CLOCAL 00100000 |
| 151 | #define CMSPAR 010000000000 /* mark or space (stick) parity */ | ||
| 151 | #define CRTSCTS 020000000000 /* flow control */ | 152 | #define CRTSCTS 020000000000 /* flow control */ |
| 152 | 153 | ||
| 153 | /* c_lflag bits */ | 154 | /* c_lflag bits */ |
diff --git a/include/asm-arm/arch-aaec2000/debug-macro.S b/include/asm-arm/arch-aaec2000/debug-macro.S index e4f1fa539a..7b1fce021d 100644 --- a/include/asm-arm/arch-aaec2000/debug-macro.S +++ b/include/asm-arm/arch-aaec2000/debug-macro.S | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | * published by the Free Software Foundation. | 9 | * published by the Free Software Foundation. |
| 10 | */ | 10 | */ |
| 11 | 11 | ||
| 12 | #include "hardware.h" | ||
| 12 | .macro addruart,rx | 13 | .macro addruart,rx |
| 13 | mrc p15, 0, \rx, c1, c0 | 14 | mrc p15, 0, \rx, c1, c0 |
| 14 | tst \rx, #1 @ MMU enabled? | 15 | tst \rx, #1 @ MMU enabled? |
diff --git a/include/asm-arm/arch-aaec2000/entry-macro.S b/include/asm-arm/arch-aaec2000/entry-macro.S index df31313ab0..1eb3503bd1 100644 --- a/include/asm-arm/arch-aaec2000/entry-macro.S +++ b/include/asm-arm/arch-aaec2000/entry-macro.S | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
| 11 | * | 11 | * |
| 12 | */ | 12 | */ |
| 13 | #include <asm/arch/irqs.h> | ||
| 13 | 14 | ||
| 14 | .macro disable_fiq | 15 | .macro disable_fiq |
| 15 | .endm | 16 | .endm |
diff --git a/include/asm-arm/arch-imx/debug-macro.S b/include/asm-arm/arch-imx/debug-macro.S index 83f552f7bc..c611871643 100644 --- a/include/asm-arm/arch-imx/debug-macro.S +++ b/include/asm-arm/arch-imx/debug-macro.S | |||
| @@ -16,7 +16,7 @@ | |||
| 16 | tst \rx, #1 @ MMU enabled? | 16 | tst \rx, #1 @ MMU enabled? |
| 17 | moveq \rx, #0x00000000 @ physical | 17 | moveq \rx, #0x00000000 @ physical |
| 18 | movne \rx, #0xe0000000 @ virtual | 18 | movne \rx, #0xe0000000 @ virtual |
| 19 | orr \rx, \rx, #0x00200000 | 19 | orreq \rx, \rx, #0x00200000 @ physical |
| 20 | orr \rx, \rx, #0x00006000 @ UART1 offset | 20 | orr \rx, \rx, #0x00006000 @ UART1 offset |
| 21 | .endm | 21 | .endm |
| 22 | 22 | ||
diff --git a/include/asm-arm/arch-imx/imx-uart.h b/include/asm-arm/arch-imx/imx-uart.h new file mode 100644 index 0000000000..3a685e1780 --- /dev/null +++ b/include/asm-arm/arch-imx/imx-uart.h | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | #ifndef ASMARM_ARCH_UART_H | ||
| 2 | #define ASMARM_ARCH_UART_H | ||
| 3 | |||
| 4 | #define IMXUART_HAVE_RTSCTS (1<<0) | ||
| 5 | |||
| 6 | struct imxuart_platform_data { | ||
| 7 | unsigned int flags; | ||
| 8 | }; | ||
| 9 | |||
| 10 | #endif | ||
diff --git a/include/asm-arm/arch-ixp23xx/memory.h b/include/asm-arm/arch-ixp23xx/memory.h index 6e19f46d54..c85fc06a04 100644 --- a/include/asm-arm/arch-ixp23xx/memory.h +++ b/include/asm-arm/arch-ixp23xx/memory.h | |||
| @@ -49,7 +49,7 @@ static inline int __ixp23xx_arch_is_coherent(void) | |||
| 49 | { | 49 | { |
| 50 | extern unsigned int processor_id; | 50 | extern unsigned int processor_id; |
| 51 | 51 | ||
| 52 | if (((processor_id & 15) >= 2) || machine_is_roadrunner()) | 52 | if (((processor_id & 15) >= 4) || machine_is_roadrunner()) |
| 53 | return 1; | 53 | return 1; |
| 54 | 54 | ||
| 55 | return 0; | 55 | return 0; |
diff --git a/include/asm-arm/arch-ixp4xx/io.h b/include/asm-arm/arch-ixp4xx/io.h index 942b622455..b59520e56f 100644 --- a/include/asm-arm/arch-ixp4xx/io.h +++ b/include/asm-arm/arch-ixp4xx/io.h | |||
| @@ -260,6 +260,12 @@ out: | |||
| 260 | 260 | ||
| 261 | #endif | 261 | #endif |
| 262 | 262 | ||
| 263 | #ifndef CONFIG_PCI | ||
| 264 | |||
| 265 | #define __io(v) v | ||
| 266 | |||
| 267 | #else | ||
| 268 | |||
| 263 | /* | 269 | /* |
| 264 | * IXP4xx does not have a transparent cpu -> PCI I/O translation | 270 | * IXP4xx does not have a transparent cpu -> PCI I/O translation |
| 265 | * window. Instead, it has a set of registers that must be tweaked | 271 | * window. Instead, it has a set of registers that must be tweaked |
| @@ -578,6 +584,7 @@ __ixp4xx_iowrite32_rep(void __iomem *addr, const void *vaddr, u32 count) | |||
| 578 | 584 | ||
| 579 | #define ioport_map(port, nr) ((void __iomem*)(port + PIO_OFFSET)) | 585 | #define ioport_map(port, nr) ((void __iomem*)(port + PIO_OFFSET)) |
| 580 | #define ioport_unmap(addr) | 586 | #define ioport_unmap(addr) |
| 587 | #endif // !CONFIG_PCI | ||
| 581 | 588 | ||
| 582 | #endif // __ASM_ARM_ARCH_IO_H | 589 | #endif // __ASM_ARM_ARCH_IO_H |
| 583 | 590 | ||
diff --git a/include/asm-arm/arch-ixp4xx/memory.h b/include/asm-arm/arch-ixp4xx/memory.h index ee211d28a3..af9667b57a 100644 --- a/include/asm-arm/arch-ixp4xx/memory.h +++ b/include/asm-arm/arch-ixp4xx/memory.h | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | */ | 14 | */ |
| 15 | #define PHYS_OFFSET UL(0x00000000) | 15 | #define PHYS_OFFSET UL(0x00000000) |
| 16 | 16 | ||
| 17 | #ifndef __ASSEMBLY__ | 17 | #if !defined(__ASSEMBLY__) && defined(CONFIG_PCI) |
| 18 | 18 | ||
| 19 | void ixp4xx_adjust_zones(int node, unsigned long *size, unsigned long *holes); | 19 | void ixp4xx_adjust_zones(int node, unsigned long *size, unsigned long *holes); |
| 20 | 20 | ||
diff --git a/include/asm-arm/arch-l7200/serial_l7200.h b/include/asm-arm/arch-l7200/serial_l7200.h index 238c595d97..b1008a9d23 100644 --- a/include/asm-arm/arch-l7200/serial_l7200.h +++ b/include/asm-arm/arch-l7200/serial_l7200.h | |||
| @@ -28,7 +28,7 @@ | |||
| 28 | #define UARTDR 0x00 /* Tx/Rx data */ | 28 | #define UARTDR 0x00 /* Tx/Rx data */ |
| 29 | #define RXSTAT 0x04 /* Rx status */ | 29 | #define RXSTAT 0x04 /* Rx status */ |
| 30 | #define H_UBRLCR 0x08 /* mode register high */ | 30 | #define H_UBRLCR 0x08 /* mode register high */ |
| 31 | #define M_UBRLCR 0x0C /* mode reg mid (MSB of buad)*/ | 31 | #define M_UBRLCR 0x0C /* mode reg mid (MSB of baud)*/ |
| 32 | #define L_UBRLCR 0x10 /* mode reg low (LSB of baud)*/ | 32 | #define L_UBRLCR 0x10 /* mode reg low (LSB of baud)*/ |
| 33 | #define UARTCON 0x14 /* control register */ | 33 | #define UARTCON 0x14 /* control register */ |
| 34 | #define UARTFLG 0x18 /* flag register */ | 34 | #define UARTFLG 0x18 /* flag register */ |
diff --git a/include/asm-arm/arch-l7200/uncompress.h b/include/asm-arm/arch-l7200/uncompress.h index 9fcd40aee3..04be2a0886 100644 --- a/include/asm-arm/arch-l7200/uncompress.h +++ b/include/asm-arm/arch-l7200/uncompress.h | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | * Changelog: | 6 | * Changelog: |
| 7 | * 05-01-2000 SJH Created | 7 | * 05-01-2000 SJH Created |
| 8 | * 05-13-2000 SJH Filled in function bodies | 8 | * 05-13-2000 SJH Filled in function bodies |
| 9 | * 07-26-2000 SJH Removed hard coded buad rate | 9 | * 07-26-2000 SJH Removed hard coded baud rate |
| 10 | */ | 10 | */ |
| 11 | 11 | ||
| 12 | #include <asm/hardware.h> | 12 | #include <asm/hardware.h> |
diff --git a/include/asm-arm/arch-pxa/dma.h b/include/asm-arm/arch-pxa/dma.h index 3e88a2a02a..a008150abc 100644 --- a/include/asm-arm/arch-pxa/dma.h +++ b/include/asm-arm/arch-pxa/dma.h | |||
| @@ -24,27 +24,29 @@ typedef struct pxa_dma_desc { | |||
| 24 | volatile u32 dcmd; /* DCMD value for the current transfer */ | 24 | volatile u32 dcmd; /* DCMD value for the current transfer */ |
| 25 | } pxa_dma_desc; | 25 | } pxa_dma_desc; |
| 26 | 26 | ||
| 27 | typedef enum { | ||
| 28 | DMA_PRIO_HIGH = 0, | ||
| 29 | DMA_PRIO_MEDIUM = 1, | ||
| 30 | DMA_PRIO_LOW = 2 | ||
| 31 | } pxa_dma_prio; | ||
| 32 | |||
| 27 | #if defined(CONFIG_PXA27x) | 33 | #if defined(CONFIG_PXA27x) |
| 28 | 34 | ||
| 29 | #define PXA_DMA_CHANNELS 32 | 35 | #define PXA_DMA_CHANNELS 32 |
| 30 | #define PXA_DMA_NBCH(prio) ((prio == DMA_PRIO_LOW) ? 16 : 8) | ||
| 31 | 36 | ||
| 32 | typedef enum { | 37 | #define pxa_for_each_dma_prio(ch, prio) \ |
| 33 | DMA_PRIO_HIGH = 0, | 38 | for ( \ |
| 34 | DMA_PRIO_MEDIUM = 8, | 39 | ch = prio * 4; \ |
| 35 | DMA_PRIO_LOW = 16 | 40 | ch != (4 << prio) + 16; \ |
| 36 | } pxa_dma_prio; | 41 | ch = (ch + 1 == (4 << prio)) ? (prio * 4 + 16) : (ch + 1) \ |
| 42 | ) | ||
| 37 | 43 | ||
| 38 | #elif defined(CONFIG_PXA25x) | 44 | #elif defined(CONFIG_PXA25x) |
| 39 | 45 | ||
| 40 | #define PXA_DMA_CHANNELS 16 | 46 | #define PXA_DMA_CHANNELS 16 |
| 41 | #define PXA_DMA_NBCH(prio) ((prio == DMA_PRIO_LOW) ? 8 : 4) | ||
| 42 | 47 | ||
| 43 | typedef enum { | 48 | #define pxa_for_each_dma_prio(ch, prio) \ |
| 44 | DMA_PRIO_HIGH = 0, | 49 | for (ch = prio * 4; ch != (4 << prio); ch++) |
| 45 | DMA_PRIO_MEDIUM = 4, | ||
| 46 | DMA_PRIO_LOW = 8 | ||
| 47 | } pxa_dma_prio; | ||
| 48 | 50 | ||
| 49 | #endif | 51 | #endif |
| 50 | 52 | ||
diff --git a/include/asm-arm/arch-pxa/pxa2xx_spi.h b/include/asm-arm/arch-pxa/pxa2xx_spi.h new file mode 100644 index 0000000000..915590c391 --- /dev/null +++ b/include/asm-arm/arch-pxa/pxa2xx_spi.h | |||
| @@ -0,0 +1,71 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2005 Stephen Street / StreetFire Sound Labs | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write to the Free Software | ||
| 16 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 17 | */ | ||
| 18 | |||
| 19 | #ifndef PXA2XX_SPI_H_ | ||
| 20 | #define PXA2XX_SPI_H_ | ||
| 21 | |||
| 22 | #define PXA2XX_CS_ASSERT (0x01) | ||
| 23 | #define PXA2XX_CS_DEASSERT (0x02) | ||
| 24 | |||
| 25 | #if defined(CONFIG_PXA25x) | ||
| 26 | #define CLOCK_SPEED_HZ 3686400 | ||
| 27 | #define SSP1_SerClkDiv(x) (((CLOCK_SPEED_HZ/2/(x+1))<<8)&0x0000ff00) | ||
| 28 | #define SSP2_SerClkDiv(x) (((CLOCK_SPEED_HZ/(x+1))<<8)&0x000fff00) | ||
| 29 | #define SSP3_SerClkDiv(x) (((CLOCK_SPEED_HZ/(x+1))<<8)&0x000fff00) | ||
| 30 | #define SSP_TIMEOUT_SCALE (2712) | ||
| 31 | #elif defined(CONFIG_PXA27x) | ||
| 32 | #define CLOCK_SPEED_HZ 13000000 | ||
| 33 | #define SSP1_SerClkDiv(x) (((CLOCK_SPEED_HZ/(x+1))<<8)&0x000fff00) | ||
| 34 | #define SSP2_SerClkDiv(x) (((CLOCK_SPEED_HZ/(x+1))<<8)&0x000fff00) | ||
| 35 | #define SSP3_SerClkDiv(x) (((CLOCK_SPEED_HZ/(x+1))<<8)&0x000fff00) | ||
| 36 | #define SSP_TIMEOUT_SCALE (769) | ||
| 37 | #endif | ||
| 38 | |||
| 39 | #define SSP_TIMEOUT(x) ((x*10000)/SSP_TIMEOUT_SCALE) | ||
| 40 | #define SSP1_VIRT ((void *)(io_p2v(__PREG(SSCR0_P(1))))) | ||
| 41 | #define SSP2_VIRT ((void *)(io_p2v(__PREG(SSCR0_P(2))))) | ||
| 42 | #define SSP3_VIRT ((void *)(io_p2v(__PREG(SSCR0_P(3))))) | ||
| 43 | |||
| 44 | enum pxa_ssp_type { | ||
| 45 | SSP_UNDEFINED = 0, | ||
| 46 | PXA25x_SSP, /* pxa 210, 250, 255, 26x */ | ||
| 47 | PXA25x_NSSP, /* pxa 255, 26x (including ASSP) */ | ||
| 48 | PXA27x_SSP, | ||
| 49 | }; | ||
| 50 | |||
| 51 | /* device.platform_data for SSP controller devices */ | ||
| 52 | struct pxa2xx_spi_master { | ||
| 53 | enum pxa_ssp_type ssp_type; | ||
| 54 | u32 clock_enable; | ||
| 55 | u16 num_chipselect; | ||
| 56 | u8 enable_dma; | ||
| 57 | }; | ||
| 58 | |||
| 59 | /* spi_board_info.controller_data for SPI slave devices, | ||
| 60 | * copied to spi_device.platform_data ... mostly for dma tuning | ||
| 61 | */ | ||
| 62 | struct pxa2xx_spi_chip { | ||
| 63 | u8 tx_threshold; | ||
| 64 | u8 rx_threshold; | ||
| 65 | u8 dma_burst_size; | ||
| 66 | u32 timeout_microsecs; | ||
| 67 | u8 enable_loopback; | ||
| 68 | void (*cs_control)(u32 command); | ||
| 69 | }; | ||
| 70 | |||
| 71 | #endif /*PXA2XX_SPI_H_*/ | ||
diff --git a/include/asm-arm/arch-s3c2410/spi-gpio.h b/include/asm-arm/arch-s3c2410/spi-gpio.h new file mode 100644 index 0000000000..258c00bca2 --- /dev/null +++ b/include/asm-arm/arch-s3c2410/spi-gpio.h | |||
| @@ -0,0 +1,31 @@ | |||
| 1 | /* linux/include/asm-arm/arch-s3c2410/spi.h | ||
| 2 | * | ||
| 3 | * Copyright (c) 2006 Simtec Electronics | ||
| 4 | * Ben Dooks <ben@simtec.co.uk> | ||
| 5 | * | ||
| 6 | * S3C2410 - SPI Controller platfrom_device info | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License version 2 as | ||
| 10 | * published by the Free Software Foundation. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #ifndef __ASM_ARCH_SPIGPIO_H | ||
| 14 | #define __ASM_ARCH_SPIGPIO_H __FILE__ | ||
| 15 | |||
| 16 | struct s3c2410_spigpio_info; | ||
| 17 | struct spi_board_info; | ||
| 18 | |||
| 19 | struct s3c2410_spigpio_info { | ||
| 20 | unsigned long pin_clk; | ||
| 21 | unsigned long pin_mosi; | ||
| 22 | unsigned long pin_miso; | ||
| 23 | |||
| 24 | unsigned long board_size; | ||
| 25 | struct spi_board_info *board_info; | ||
| 26 | |||
| 27 | void (*chip_select)(struct s3c2410_spigpio_info *spi, int cs); | ||
| 28 | }; | ||
| 29 | |||
| 30 | |||
| 31 | #endif /* __ASM_ARCH_SPIGPIO_H */ | ||
diff --git a/include/asm-arm/arch-s3c2410/spi.h b/include/asm-arm/arch-s3c2410/spi.h new file mode 100644 index 0000000000..4029a1a1ab --- /dev/null +++ b/include/asm-arm/arch-s3c2410/spi.h | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | /* linux/include/asm-arm/arch-s3c2410/spi.h | ||
| 2 | * | ||
| 3 | * Copyright (c) 2006 Simtec Electronics | ||
| 4 | * Ben Dooks <ben@simtec.co.uk> | ||
| 5 | * | ||
| 6 | * S3C2410 - SPI Controller platform_device info | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License version 2 as | ||
| 10 | * published by the Free Software Foundation. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #ifndef __ASM_ARCH_SPI_H | ||
| 14 | #define __ASM_ARCH_SPI_H __FILE__ | ||
| 15 | |||
| 16 | struct s3c2410_spi_info; | ||
| 17 | struct spi_board_info; | ||
| 18 | |||
| 19 | struct s3c2410_spi_info { | ||
| 20 | unsigned long pin_cs; /* simple gpio cs */ | ||
| 21 | |||
| 22 | unsigned long board_size; | ||
| 23 | struct spi_board_info *board_info; | ||
| 24 | |||
| 25 | void (*set_cs)(struct s3c2410_spi_info *spi, int cs, int pol); | ||
| 26 | }; | ||
| 27 | |||
| 28 | |||
| 29 | #endif /* __ASM_ARCH_SPI_H */ | ||
diff --git a/include/asm-arm/bug.h b/include/asm-arm/bug.h index 7fb02138f5..5ab8216f52 100644 --- a/include/asm-arm/bug.h +++ b/include/asm-arm/bug.h | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #define _ASMARM_BUG_H | 2 | #define _ASMARM_BUG_H |
| 3 | 3 | ||
| 4 | #include <linux/config.h> | 4 | #include <linux/config.h> |
| 5 | #include <linux/stddef.h> | ||
| 5 | 6 | ||
| 6 | #ifdef CONFIG_BUG | 7 | #ifdef CONFIG_BUG |
| 7 | #ifdef CONFIG_DEBUG_BUGVERBOSE | 8 | #ifdef CONFIG_DEBUG_BUGVERBOSE |
diff --git a/include/asm-arm/procinfo.h b/include/asm-arm/procinfo.h index a9c75b2c31..8425260552 100644 --- a/include/asm-arm/procinfo.h +++ b/include/asm-arm/procinfo.h | |||
| @@ -45,8 +45,6 @@ extern unsigned int elf_hwcap; | |||
| 45 | 45 | ||
| 46 | #endif /* __ASSEMBLY__ */ | 46 | #endif /* __ASSEMBLY__ */ |
| 47 | 47 | ||
| 48 | #define PROC_INFO_SZ 48 | ||
| 49 | |||
| 50 | #define HWCAP_SWP 1 | 48 | #define HWCAP_SWP 1 |
| 51 | #define HWCAP_HALF 2 | 49 | #define HWCAP_HALF 2 |
| 52 | #define HWCAP_THUMB 4 | 50 | #define HWCAP_THUMB 4 |
diff --git a/include/asm-arm/spinlock.h b/include/asm-arm/spinlock.h index 43ad4e5587..406ca97a8a 100644 --- a/include/asm-arm/spinlock.h +++ b/include/asm-arm/spinlock.h | |||
| @@ -142,6 +142,9 @@ static inline void __raw_write_unlock(raw_rwlock_t *rw) | |||
| 142 | : "cc"); | 142 | : "cc"); |
| 143 | } | 143 | } |
| 144 | 144 | ||
| 145 | /* write_can_lock - would write_trylock() succeed? */ | ||
| 146 | #define __raw_write_can_lock(x) ((x)->lock == 0x80000000) | ||
| 147 | |||
| 145 | /* | 148 | /* |
| 146 | * Read locks are a bit more hairy: | 149 | * Read locks are a bit more hairy: |
| 147 | * - Exclusively load the lock value. | 150 | * - Exclusively load the lock value. |
| @@ -198,4 +201,7 @@ static inline void __raw_read_unlock(raw_rwlock_t *rw) | |||
| 198 | 201 | ||
| 199 | #define __raw_read_trylock(lock) generic__raw_read_trylock(lock) | 202 | #define __raw_read_trylock(lock) generic__raw_read_trylock(lock) |
| 200 | 203 | ||
| 204 | /* read_can_lock - would read_trylock() succeed? */ | ||
| 205 | #define __raw_read_can_lock(x) ((x)->lock < 0x80000000) | ||
| 206 | |||
| 201 | #endif /* __ASM_SPINLOCK_H */ | 207 | #endif /* __ASM_SPINLOCK_H */ |
diff --git a/include/asm-arm/system.h b/include/asm-arm/system.h index 95b3abf485..7c9568d303 100644 --- a/include/asm-arm/system.h +++ b/include/asm-arm/system.h | |||
| @@ -127,6 +127,12 @@ static inline int cpu_is_xsc3(void) | |||
| 127 | } | 127 | } |
| 128 | #endif | 128 | #endif |
| 129 | 129 | ||
| 130 | #if !defined(CONFIG_CPU_XSCALE) && !defined(CONFIG_CPU_XSC3) | ||
| 131 | #define cpu_is_xscale() 0 | ||
| 132 | #else | ||
| 133 | #define cpu_is_xscale() 1 | ||
| 134 | #endif | ||
| 135 | |||
| 130 | #define set_cr(x) \ | 136 | #define set_cr(x) \ |
| 131 | __asm__ __volatile__( \ | 137 | __asm__ __volatile__( \ |
| 132 | "mcr p15, 0, %0, c1, c0, 0 @ set CR" \ | 138 | "mcr p15, 0, %0, c1, c0, 0 @ set CR" \ |
diff --git a/include/asm-arm/unistd.h b/include/asm-arm/unistd.h index 65ac305c2d..cbf39a56db 100644 --- a/include/asm-arm/unistd.h +++ b/include/asm-arm/unistd.h | |||
| @@ -360,6 +360,24 @@ | |||
| 360 | #define __ARM_NR_usr32 (__ARM_NR_BASE+4) | 360 | #define __ARM_NR_usr32 (__ARM_NR_BASE+4) |
| 361 | #define __ARM_NR_set_tls (__ARM_NR_BASE+5) | 361 | #define __ARM_NR_set_tls (__ARM_NR_BASE+5) |
| 362 | 362 | ||
| 363 | /* | ||
| 364 | * The following syscalls are obsolete and no longer available for EABI. | ||
| 365 | */ | ||
| 366 | #if defined(__ARM_EABI__) && !defined(__KERNEL__) | ||
| 367 | #undef __NR_time | ||
| 368 | #undef __NR_umount | ||
| 369 | #undef __NR_stime | ||
| 370 | #undef __NR_alarm | ||
| 371 | #undef __NR_utime | ||
| 372 | #undef __NR_getrlimit | ||
| 373 | #undef __NR_select | ||
| 374 | #undef __NR_readdir | ||
| 375 | #undef __NR_mmap | ||
| 376 | #undef __NR_socketcall | ||
| 377 | #undef __NR_syscall | ||
| 378 | #undef __NR_ipc | ||
| 379 | #endif | ||
| 380 | |||
| 363 | #define __sys2(x) #x | 381 | #define __sys2(x) #x |
| 364 | #define __sys1(x) __sys2(x) | 382 | #define __sys1(x) __sys2(x) |
| 365 | 383 | ||
| @@ -392,7 +410,8 @@ type name(void) { \ | |||
| 392 | __asm__ __volatile__ ( \ | 410 | __asm__ __volatile__ ( \ |
| 393 | __syscall(name) \ | 411 | __syscall(name) \ |
| 394 | : "=r" (__res_r0) \ | 412 | : "=r" (__res_r0) \ |
| 395 | : __SYS_REG_LIST() ); \ | 413 | : __SYS_REG_LIST() \ |
| 414 | : "memory" ); \ | ||
| 396 | __res = __res_r0; \ | 415 | __res = __res_r0; \ |
| 397 | __syscall_return(type,__res); \ | 416 | __syscall_return(type,__res); \ |
| 398 | } | 417 | } |
| @@ -406,7 +425,8 @@ type name(type1 arg1) { \ | |||
| 406 | __asm__ __volatile__ ( \ | 425 | __asm__ __volatile__ ( \ |
| 407 | __syscall(name) \ | 426 | __syscall(name) \ |
| 408 | : "=r" (__res_r0) \ | 427 | : "=r" (__res_r0) \ |
| 409 | : __SYS_REG_LIST( "0" (__r0) ) ); \ | 428 | : __SYS_REG_LIST( "0" (__r0) ) \ |
| 429 | : "memory" ); \ | ||
| 410 | __res = __res_r0; \ | 430 | __res = __res_r0; \ |
| 411 | __syscall_return(type,__res); \ | 431 | __syscall_return(type,__res); \ |
| 412 | } | 432 | } |
| @@ -421,7 +441,8 @@ type name(type1 arg1,type2 arg2) { \ | |||
| 421 | __asm__ __volatile__ ( \ | 441 | __asm__ __volatile__ ( \ |
| 422 | __syscall(name) \ | 442 | __syscall(name) \ |
| 423 | : "=r" (__res_r0) \ | 443 | : "=r" (__res_r0) \ |
| 424 | : __SYS_REG_LIST( "0" (__r0), "r" (__r1) ) ); \ | 444 | : __SYS_REG_LIST( "0" (__r0), "r" (__r1) ) \ |
| 445 | : "memory" ); \ | ||
| 425 | __res = __res_r0; \ | 446 | __res = __res_r0; \ |
| 426 | __syscall_return(type,__res); \ | 447 | __syscall_return(type,__res); \ |
| 427 | } | 448 | } |
| @@ -438,7 +459,8 @@ type name(type1 arg1,type2 arg2,type3 arg3) { \ | |||
| 438 | __asm__ __volatile__ ( \ | 459 | __asm__ __volatile__ ( \ |
| 439 | __syscall(name) \ | 460 | __syscall(name) \ |
| 440 | : "=r" (__res_r0) \ | 461 | : "=r" (__res_r0) \ |
| 441 | : __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2) ) ); \ | 462 | : __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2) ) \ |
| 463 | : "memory" ); \ | ||
| 442 | __res = __res_r0; \ | 464 | __res = __res_r0; \ |
| 443 | __syscall_return(type,__res); \ | 465 | __syscall_return(type,__res); \ |
| 444 | } | 466 | } |
| @@ -456,7 +478,8 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ | |||
| 456 | __asm__ __volatile__ ( \ | 478 | __asm__ __volatile__ ( \ |
| 457 | __syscall(name) \ | 479 | __syscall(name) \ |
| 458 | : "=r" (__res_r0) \ | 480 | : "=r" (__res_r0) \ |
| 459 | : __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2), "r" (__r3) ) ); \ | 481 | : __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2), "r" (__r3) ) \ |
| 482 | : "memory" ); \ | ||
| 460 | __res = __res_r0; \ | 483 | __res = __res_r0; \ |
| 461 | __syscall_return(type,__res); \ | 484 | __syscall_return(type,__res); \ |
| 462 | } | 485 | } |
| @@ -476,7 +499,8 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) { \ | |||
| 476 | __syscall(name) \ | 499 | __syscall(name) \ |
| 477 | : "=r" (__res_r0) \ | 500 | : "=r" (__res_r0) \ |
| 478 | : __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2), \ | 501 | : __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2), \ |
| 479 | "r" (__r3), "r" (__r4) ) ); \ | 502 | "r" (__r3), "r" (__r4) ) \ |
| 503 | : "memory" ); \ | ||
| 480 | __res = __res_r0; \ | 504 | __res = __res_r0; \ |
| 481 | __syscall_return(type,__res); \ | 505 | __syscall_return(type,__res); \ |
| 482 | } | 506 | } |
| @@ -496,7 +520,8 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6 | |||
| 496 | __syscall(name) \ | 520 | __syscall(name) \ |
| 497 | : "=r" (__res_r0) \ | 521 | : "=r" (__res_r0) \ |
| 498 | : __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2), \ | 522 | : __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2), \ |
| 499 | "r" (__r3), "r" (__r4), "r" (__r5) ) ); \ | 523 | "r" (__r3), "r" (__r4), "r" (__r5) ) \ |
| 524 | : "memory" ); \ | ||
| 500 | __res = __res_r0; \ | 525 | __res = __res_r0; \ |
| 501 | __syscall_return(type,__res); \ | 526 | __syscall_return(type,__res); \ |
| 502 | } | 527 | } |
diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h index 358e4d309c..c2059a3a06 100644 --- a/include/asm-generic/pgtable.h +++ b/include/asm-generic/pgtable.h | |||
| @@ -159,17 +159,8 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addres | |||
| 159 | #define lazy_mmu_prot_update(pte) do { } while (0) | 159 | #define lazy_mmu_prot_update(pte) do { } while (0) |
| 160 | #endif | 160 | #endif |
| 161 | 161 | ||
| 162 | #ifndef __HAVE_ARCH_MULTIPLE_ZERO_PAGE | 162 | #ifndef __HAVE_ARCH_MOVE_PTE |
| 163 | #define move_pte(pte, prot, old_addr, new_addr) (pte) | 163 | #define move_pte(pte, prot, old_addr, new_addr) (pte) |
| 164 | #else | ||
| 165 | #define move_pte(pte, prot, old_addr, new_addr) \ | ||
| 166 | ({ \ | ||
| 167 | pte_t newpte = (pte); \ | ||
| 168 | if (pte_present(pte) && pfn_valid(pte_pfn(pte)) && \ | ||
| 169 | pte_page(pte) == ZERO_PAGE(old_addr)) \ | ||
| 170 | newpte = mk_pte(ZERO_PAGE(new_addr), (prot)); \ | ||
| 171 | newpte; \ | ||
| 172 | }) | ||
| 173 | #endif | 164 | #endif |
| 174 | 165 | ||
| 175 | /* | 166 | /* |
diff --git a/include/asm-i386/atomic.h b/include/asm-i386/atomic.h index 22d80ece95..4ddce5296a 100644 --- a/include/asm-i386/atomic.h +++ b/include/asm-i386/atomic.h | |||
| @@ -183,6 +183,7 @@ static __inline__ int atomic_add_return(int i, atomic_t *v) | |||
| 183 | { | 183 | { |
| 184 | int __i; | 184 | int __i; |
| 185 | #ifdef CONFIG_M386 | 185 | #ifdef CONFIG_M386 |
| 186 | unsigned long flags; | ||
| 186 | if(unlikely(boot_cpu_data.x86==3)) | 187 | if(unlikely(boot_cpu_data.x86==3)) |
| 187 | goto no_xadd; | 188 | goto no_xadd; |
| 188 | #endif | 189 | #endif |
| @@ -196,10 +197,10 @@ static __inline__ int atomic_add_return(int i, atomic_t *v) | |||
| 196 | 197 | ||
| 197 | #ifdef CONFIG_M386 | 198 | #ifdef CONFIG_M386 |
| 198 | no_xadd: /* Legacy 386 processor */ | 199 | no_xadd: /* Legacy 386 processor */ |
| 199 | local_irq_disable(); | 200 | local_irq_save(flags); |
| 200 | __i = atomic_read(v); | 201 | __i = atomic_read(v); |
| 201 | atomic_set(v, i + __i); | 202 | atomic_set(v, i + __i); |
| 202 | local_irq_enable(); | 203 | local_irq_restore(flags); |
| 203 | return i + __i; | 204 | return i + __i; |
| 204 | #endif | 205 | #endif |
| 205 | } | 206 | } |
diff --git a/include/asm-i386/cpufeature.h b/include/asm-i386/cpufeature.h index 5c0b5876b9..b44bfc6239 100644 --- a/include/asm-i386/cpufeature.h +++ b/include/asm-i386/cpufeature.h | |||
| @@ -71,6 +71,7 @@ | |||
| 71 | #define X86_FEATURE_P4 (3*32+ 7) /* P4 */ | 71 | #define X86_FEATURE_P4 (3*32+ 7) /* P4 */ |
| 72 | #define X86_FEATURE_CONSTANT_TSC (3*32+ 8) /* TSC ticks at a constant rate */ | 72 | #define X86_FEATURE_CONSTANT_TSC (3*32+ 8) /* TSC ticks at a constant rate */ |
| 73 | #define X86_FEATURE_UP (3*32+ 9) /* smp kernel running on up */ | 73 | #define X86_FEATURE_UP (3*32+ 9) /* smp kernel running on up */ |
| 74 | #define X86_FEATURE_FXSAVE_LEAK (3*32+10) /* FXSAVE leaks FOP/FIP/FOP */ | ||
| 74 | 75 | ||
| 75 | /* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */ | 76 | /* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */ |
| 76 | #define X86_FEATURE_XMM3 (4*32+ 0) /* Streaming SIMD Extensions-3 */ | 77 | #define X86_FEATURE_XMM3 (4*32+ 0) /* Streaming SIMD Extensions-3 */ |
diff --git a/include/asm-i386/i387.h b/include/asm-i386/i387.h index 152d0baa57..bc1d6edae1 100644 --- a/include/asm-i386/i387.h +++ b/include/asm-i386/i387.h | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | 13 | ||
| 14 | #include <linux/sched.h> | 14 | #include <linux/sched.h> |
| 15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
| 16 | #include <linux/kernel_stat.h> | ||
| 16 | #include <asm/processor.h> | 17 | #include <asm/processor.h> |
| 17 | #include <asm/sigcontext.h> | 18 | #include <asm/sigcontext.h> |
| 18 | #include <asm/user.h> | 19 | #include <asm/user.h> |
| @@ -38,17 +39,38 @@ extern void init_fpu(struct task_struct *); | |||
| 38 | extern void kernel_fpu_begin(void); | 39 | extern void kernel_fpu_begin(void); |
| 39 | #define kernel_fpu_end() do { stts(); preempt_enable(); } while(0) | 40 | #define kernel_fpu_end() do { stts(); preempt_enable(); } while(0) |
| 40 | 41 | ||
| 42 | /* We need a safe address that is cheap to find and that is already | ||
| 43 | in L1 during context switch. The best choices are unfortunately | ||
| 44 | different for UP and SMP */ | ||
| 45 | #ifdef CONFIG_SMP | ||
| 46 | #define safe_address (__per_cpu_offset[0]) | ||
| 47 | #else | ||
| 48 | #define safe_address (kstat_cpu(0).cpustat.user) | ||
| 49 | #endif | ||
| 50 | |||
| 41 | /* | 51 | /* |
| 42 | * These must be called with preempt disabled | 52 | * These must be called with preempt disabled |
| 43 | */ | 53 | */ |
| 44 | static inline void __save_init_fpu( struct task_struct *tsk ) | 54 | static inline void __save_init_fpu( struct task_struct *tsk ) |
| 45 | { | 55 | { |
| 56 | /* Use more nops than strictly needed in case the compiler | ||
| 57 | varies code */ | ||
| 46 | alternative_input( | 58 | alternative_input( |
| 47 | "fnsave %1 ; fwait ;" GENERIC_NOP2, | 59 | "fnsave %[fx] ;fwait;" GENERIC_NOP8 GENERIC_NOP4, |
| 48 | "fxsave %1 ; fnclex", | 60 | "fxsave %[fx]\n" |
| 61 | "bt $7,%[fsw] ; jnc 1f ; fnclex\n1:", | ||
| 49 | X86_FEATURE_FXSR, | 62 | X86_FEATURE_FXSR, |
| 50 | "m" (tsk->thread.i387.fxsave) | 63 | [fx] "m" (tsk->thread.i387.fxsave), |
| 51 | :"memory"); | 64 | [fsw] "m" (tsk->thread.i387.fxsave.swd) : "memory"); |
| 65 | /* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception | ||
| 66 | is pending. Clear the x87 state here by setting it to fixed | ||
| 67 | values. safe_address is a random variable that should be in L1 */ | ||
| 68 | alternative_input( | ||
| 69 | GENERIC_NOP8 GENERIC_NOP2, | ||
| 70 | "emms\n\t" /* clear stack tags */ | ||
| 71 | "fildl %[addr]", /* set F?P to defined value */ | ||
| 72 | X86_FEATURE_FXSAVE_LEAK, | ||
| 73 | [addr] "m" (safe_address)); | ||
| 52 | task_thread_info(tsk)->status &= ~TS_USEDFPU; | 74 | task_thread_info(tsk)->status &= ~TS_USEDFPU; |
| 53 | } | 75 | } |
| 54 | 76 | ||
diff --git a/include/asm-i386/io_apic.h b/include/asm-i386/io_apic.h index 51c4e5fe60..d92e253f7f 100644 --- a/include/asm-i386/io_apic.h +++ b/include/asm-i386/io_apic.h | |||
| @@ -200,6 +200,7 @@ extern int io_apic_get_unique_id (int ioapic, int apic_id); | |||
| 200 | extern int io_apic_get_version (int ioapic); | 200 | extern int io_apic_get_version (int ioapic); |
| 201 | extern int io_apic_get_redir_entries (int ioapic); | 201 | extern int io_apic_get_redir_entries (int ioapic); |
| 202 | extern int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int active_high_low); | 202 | extern int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int active_high_low); |
| 203 | extern int timer_uses_ioapic_pin_0; | ||
| 203 | #endif /* CONFIG_ACPI */ | 204 | #endif /* CONFIG_ACPI */ |
| 204 | 205 | ||
| 205 | extern int (*ioapic_renumber_irq)(int ioapic, int irq); | 206 | extern int (*ioapic_renumber_irq)(int ioapic, int irq); |
diff --git a/include/asm-i386/pgtable-2level.h b/include/asm-i386/pgtable-2level.h index 27bde973ab..2756d4b04c 100644 --- a/include/asm-i386/pgtable-2level.h +++ b/include/asm-i386/pgtable-2level.h | |||
| @@ -18,6 +18,9 @@ | |||
| 18 | #define set_pte_atomic(pteptr, pteval) set_pte(pteptr,pteval) | 18 | #define set_pte_atomic(pteptr, pteval) set_pte(pteptr,pteval) |
| 19 | #define set_pmd(pmdptr, pmdval) (*(pmdptr) = (pmdval)) | 19 | #define set_pmd(pmdptr, pmdval) (*(pmdptr) = (pmdval)) |
| 20 | 20 | ||
| 21 | #define pte_clear(mm,addr,xp) do { set_pte_at(mm, addr, xp, __pte(0)); } while (0) | ||
| 22 | #define pmd_clear(xp) do { set_pmd(xp, __pmd(0)); } while (0) | ||
| 23 | |||
| 21 | #define ptep_get_and_clear(mm,addr,xp) __pte(xchg(&(xp)->pte_low, 0)) | 24 | #define ptep_get_and_clear(mm,addr,xp) __pte(xchg(&(xp)->pte_low, 0)) |
| 22 | #define pte_same(a, b) ((a).pte_low == (b).pte_low) | 25 | #define pte_same(a, b) ((a).pte_low == (b).pte_low) |
| 23 | #define pte_page(x) pfn_to_page(pte_pfn(x)) | 26 | #define pte_page(x) pfn_to_page(pte_pfn(x)) |
diff --git a/include/asm-i386/pgtable-3level.h b/include/asm-i386/pgtable-3level.h index 36a5aa63cb..dccb1b3337 100644 --- a/include/asm-i386/pgtable-3level.h +++ b/include/asm-i386/pgtable-3level.h | |||
| @@ -85,6 +85,26 @@ static inline void pud_clear (pud_t * pud) { } | |||
| 85 | #define pmd_offset(pud, address) ((pmd_t *) pud_page(*(pud)) + \ | 85 | #define pmd_offset(pud, address) ((pmd_t *) pud_page(*(pud)) + \ |
| 86 | pmd_index(address)) | 86 | pmd_index(address)) |
| 87 | 87 | ||
| 88 | /* | ||
| 89 | * For PTEs and PDEs, we must clear the P-bit first when clearing a page table | ||
| 90 | * entry, so clear the bottom half first and enforce ordering with a compiler | ||
| 91 | * barrier. | ||
| 92 | */ | ||
| 93 | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) | ||
| 94 | { | ||
| 95 | ptep->pte_low = 0; | ||
| 96 | smp_wmb(); | ||
| 97 | ptep->pte_high = 0; | ||
| 98 | } | ||
| 99 | |||
| 100 | static inline void pmd_clear(pmd_t *pmd) | ||
| 101 | { | ||
| 102 | u32 *tmp = (u32 *)pmd; | ||
| 103 | *tmp = 0; | ||
| 104 | smp_wmb(); | ||
| 105 | *(tmp + 1) = 0; | ||
| 106 | } | ||
| 107 | |||
| 88 | static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) | 108 | static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) |
| 89 | { | 109 | { |
| 90 | pte_t res; | 110 | pte_t res; |
diff --git a/include/asm-i386/pgtable.h b/include/asm-i386/pgtable.h index ee056c41a9..672c3f76b9 100644 --- a/include/asm-i386/pgtable.h +++ b/include/asm-i386/pgtable.h | |||
| @@ -204,12 +204,10 @@ extern unsigned long long __PAGE_KERNEL, __PAGE_KERNEL_EXEC; | |||
| 204 | extern unsigned long pg0[]; | 204 | extern unsigned long pg0[]; |
| 205 | 205 | ||
| 206 | #define pte_present(x) ((x).pte_low & (_PAGE_PRESENT | _PAGE_PROTNONE)) | 206 | #define pte_present(x) ((x).pte_low & (_PAGE_PRESENT | _PAGE_PROTNONE)) |
| 207 | #define pte_clear(mm,addr,xp) do { set_pte_at(mm, addr, xp, __pte(0)); } while (0) | ||
| 208 | 207 | ||
| 209 | /* To avoid harmful races, pmd_none(x) should check only the lower when PAE */ | 208 | /* To avoid harmful races, pmd_none(x) should check only the lower when PAE */ |
| 210 | #define pmd_none(x) (!(unsigned long)pmd_val(x)) | 209 | #define pmd_none(x) (!(unsigned long)pmd_val(x)) |
| 211 | #define pmd_present(x) (pmd_val(x) & _PAGE_PRESENT) | 210 | #define pmd_present(x) (pmd_val(x) & _PAGE_PRESENT) |
| 212 | #define pmd_clear(xp) do { set_pmd(xp, __pmd(0)); } while (0) | ||
| 213 | #define pmd_bad(x) ((pmd_val(x) & (~PAGE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE) | 211 | #define pmd_bad(x) ((pmd_val(x) & (~PAGE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE) |
| 214 | 212 | ||
| 215 | 213 | ||
| @@ -268,7 +266,7 @@ static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, unsigned long | |||
| 268 | pte_t pte; | 266 | pte_t pte; |
| 269 | if (full) { | 267 | if (full) { |
| 270 | pte = *ptep; | 268 | pte = *ptep; |
| 271 | *ptep = __pte(0); | 269 | pte_clear(mm, addr, ptep); |
| 272 | } else { | 270 | } else { |
| 273 | pte = ptep_get_and_clear(mm, addr, ptep); | 271 | pte = ptep_get_and_clear(mm, addr, ptep); |
| 274 | } | 272 | } |
diff --git a/include/asm-i386/unistd.h b/include/asm-i386/unistd.h index 6a8dd83c35..eb4b152c82 100644 --- a/include/asm-i386/unistd.h +++ b/include/asm-i386/unistd.h | |||
| @@ -320,8 +320,10 @@ | |||
| 320 | #define __NR_get_robust_list 312 | 320 | #define __NR_get_robust_list 312 |
| 321 | #define __NR_splice 313 | 321 | #define __NR_splice 313 |
| 322 | #define __NR_sync_file_range 314 | 322 | #define __NR_sync_file_range 314 |
| 323 | #define __NR_tee 315 | ||
| 324 | #define __NR_vmsplice 316 | ||
| 323 | 325 | ||
| 324 | #define NR_syscalls 315 | 326 | #define NR_syscalls 317 |
| 325 | 327 | ||
| 326 | /* | 328 | /* |
| 327 | * user-visible error numbers are in the range -1 - -128: see | 329 | * user-visible error numbers are in the range -1 - -128: see |
diff --git a/include/asm-ia64/acpi.h b/include/asm-ia64/acpi.h index d734585a23..09a5dd0e44 100644 --- a/include/asm-ia64/acpi.h +++ b/include/asm-ia64/acpi.h | |||
| @@ -110,9 +110,8 @@ extern void prefill_possible_map(void); | |||
| 110 | extern int additional_cpus; | 110 | extern int additional_cpus; |
| 111 | 111 | ||
| 112 | #ifdef CONFIG_ACPI_NUMA | 112 | #ifdef CONFIG_ACPI_NUMA |
| 113 | /* Proximity bitmap length; _PXM is at most 255 (8 bit)*/ | 113 | #if MAX_NUMNODES > 256 |
| 114 | #ifdef CONFIG_IA64_NR_NODES | 114 | #define MAX_PXM_DOMAINS MAX_NUMNODES |
| 115 | #define MAX_PXM_DOMAINS CONFIG_IA64_NR_NODES | ||
| 116 | #else | 115 | #else |
| 117 | #define MAX_PXM_DOMAINS (256) | 116 | #define MAX_PXM_DOMAINS (256) |
| 118 | #endif | 117 | #endif |
diff --git a/include/asm-ia64/bitops.h b/include/asm-ia64/bitops.h index 90921e1627..6cc517e212 100644 --- a/include/asm-ia64/bitops.h +++ b/include/asm-ia64/bitops.h | |||
| @@ -11,7 +11,6 @@ | |||
| 11 | 11 | ||
| 12 | #include <linux/compiler.h> | 12 | #include <linux/compiler.h> |
| 13 | #include <linux/types.h> | 13 | #include <linux/types.h> |
| 14 | #include <asm/bitops.h> | ||
| 15 | #include <asm/intrinsics.h> | 14 | #include <asm/intrinsics.h> |
| 16 | 15 | ||
| 17 | /** | 16 | /** |
diff --git a/include/asm-ia64/machvec.h b/include/asm-ia64/machvec.h index c3e4ed8a3e..a9c995a86c 100644 --- a/include/asm-ia64/machvec.h +++ b/include/asm-ia64/machvec.h | |||
| @@ -347,9 +347,11 @@ extern ia64_mv_dma_supported swiotlb_dma_supported; | |||
| 347 | #endif | 347 | #endif |
| 348 | #ifndef platform_pci_legacy_read | 348 | #ifndef platform_pci_legacy_read |
| 349 | # define platform_pci_legacy_read ia64_pci_legacy_read | 349 | # define platform_pci_legacy_read ia64_pci_legacy_read |
| 350 | extern int ia64_pci_legacy_read(struct pci_bus *bus, u16 port, u32 *val, u8 size); | ||
| 350 | #endif | 351 | #endif |
| 351 | #ifndef platform_pci_legacy_write | 352 | #ifndef platform_pci_legacy_write |
| 352 | # define platform_pci_legacy_write ia64_pci_legacy_write | 353 | # define platform_pci_legacy_write ia64_pci_legacy_write |
| 354 | extern int ia64_pci_legacy_write(struct pci_bus *bus, u16 port, u32 val, u8 size); | ||
| 353 | #endif | 355 | #endif |
| 354 | #ifndef platform_inb | 356 | #ifndef platform_inb |
| 355 | # define platform_inb __ia64_inb | 357 | # define platform_inb __ia64_inb |
diff --git a/include/asm-ia64/sn/sn2/sn_hwperf.h b/include/asm-ia64/sn/sn2/sn_hwperf.h index 291ef3d69d..e61ebac38c 100644 --- a/include/asm-ia64/sn/sn2/sn_hwperf.h +++ b/include/asm-ia64/sn/sn2/sn_hwperf.h | |||
| @@ -45,8 +45,12 @@ struct sn_hwperf_object_info { | |||
| 45 | #define SN_HWPERF_IS_NODE(x) ((x) && strstr((x)->name, "SHub")) | 45 | #define SN_HWPERF_IS_NODE(x) ((x) && strstr((x)->name, "SHub")) |
| 46 | #define SN_HWPERF_IS_NODE_SHUB2(x) ((x) && strstr((x)->name, "SHub 2.")) | 46 | #define SN_HWPERF_IS_NODE_SHUB2(x) ((x) && strstr((x)->name, "SHub 2.")) |
| 47 | #define SN_HWPERF_IS_IONODE(x) ((x) && strstr((x)->name, "TIO")) | 47 | #define SN_HWPERF_IS_IONODE(x) ((x) && strstr((x)->name, "TIO")) |
| 48 | #define SN_HWPERF_IS_ROUTER(x) ((x) && strstr((x)->name, "Router")) | ||
| 49 | #define SN_HWPERF_IS_NL3ROUTER(x) ((x) && strstr((x)->name, "NL3Router")) | 48 | #define SN_HWPERF_IS_NL3ROUTER(x) ((x) && strstr((x)->name, "NL3Router")) |
| 49 | #define SN_HWPERF_IS_NL4ROUTER(x) ((x) && strstr((x)->name, "NL4Router")) | ||
| 50 | #define SN_HWPERF_IS_OLDROUTER(x) ((x) && strstr((x)->name, "Router")) | ||
| 51 | #define SN_HWPERF_IS_ROUTER(x) (SN_HWPERF_IS_NL3ROUTER(x) || \ | ||
| 52 | SN_HWPERF_IS_NL4ROUTER(x) || \ | ||
| 53 | SN_HWPERF_IS_OLDROUTER(x)) | ||
| 50 | #define SN_HWPERF_FOREIGN(x) ((x) && !(x)->sn_hwp_this_part && !(x)->sn_hwp_is_shared) | 54 | #define SN_HWPERF_FOREIGN(x) ((x) && !(x)->sn_hwp_this_part && !(x)->sn_hwp_is_shared) |
| 51 | #define SN_HWPERF_SAME_OBJTYPE(x,y) ((SN_HWPERF_IS_NODE(x) && SN_HWPERF_IS_NODE(y)) ||\ | 55 | #define SN_HWPERF_SAME_OBJTYPE(x,y) ((SN_HWPERF_IS_NODE(x) && SN_HWPERF_IS_NODE(y)) ||\ |
| 52 | (SN_HWPERF_IS_IONODE(x) && SN_HWPERF_IS_IONODE(y)) ||\ | 56 | (SN_HWPERF_IS_IONODE(x) && SN_HWPERF_IS_IONODE(y)) ||\ |
diff --git a/include/asm-ia64/sn/sn_sal.h b/include/asm-ia64/sn/sn_sal.h index bf4cc867a6..51aca022cf 100644 --- a/include/asm-ia64/sn/sn_sal.h +++ b/include/asm-ia64/sn/sn_sal.h | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | * License. See the file "COPYING" in the main directory of this archive | 8 | * License. See the file "COPYING" in the main directory of this archive |
| 9 | * for more details. | 9 | * for more details. |
| 10 | * | 10 | * |
| 11 | * Copyright (c) 2000-2005 Silicon Graphics, Inc. All rights reserved. | 11 | * Copyright (c) 2000-2006 Silicon Graphics, Inc. All rights reserved. |
| 12 | */ | 12 | */ |
| 13 | 13 | ||
| 14 | 14 | ||
| @@ -85,6 +85,7 @@ | |||
| 85 | 85 | ||
| 86 | #define SN_SAL_GET_PROM_FEATURE_SET 0x02000065 | 86 | #define SN_SAL_GET_PROM_FEATURE_SET 0x02000065 |
| 87 | #define SN_SAL_SET_OS_FEATURE_SET 0x02000066 | 87 | #define SN_SAL_SET_OS_FEATURE_SET 0x02000066 |
| 88 | #define SN_SAL_INJECT_ERROR 0x02000067 | ||
| 88 | 89 | ||
| 89 | /* | 90 | /* |
| 90 | * Service-specific constants | 91 | * Service-specific constants |
| @@ -705,10 +706,8 @@ static inline int | |||
| 705 | sn_change_memprotect(u64 paddr, u64 len, u64 perms, u64 *nasid_array) | 706 | sn_change_memprotect(u64 paddr, u64 len, u64 perms, u64 *nasid_array) |
| 706 | { | 707 | { |
| 707 | struct ia64_sal_retval ret_stuff; | 708 | struct ia64_sal_retval ret_stuff; |
| 708 | int cnodeid; | ||
| 709 | unsigned long irq_flags; | 709 | unsigned long irq_flags; |
| 710 | 710 | ||
| 711 | cnodeid = nasid_to_cnodeid(get_node_number(paddr)); | ||
| 712 | local_irq_save(irq_flags); | 711 | local_irq_save(irq_flags); |
| 713 | ia64_sal_oemcall_nolock(&ret_stuff, SN_SAL_MEMPROTECT, paddr, len, | 712 | ia64_sal_oemcall_nolock(&ret_stuff, SN_SAL_MEMPROTECT, paddr, len, |
| 714 | (u64)nasid_array, perms, 0, 0, 0); | 713 | (u64)nasid_array, perms, 0, 0, 0); |
| @@ -1140,4 +1139,16 @@ ia64_sn_set_os_feature(int feature) | |||
| 1140 | return rv.status; | 1139 | return rv.status; |
| 1141 | } | 1140 | } |
| 1142 | 1141 | ||
| 1142 | static inline int | ||
| 1143 | sn_inject_error(u64 paddr, u64 *data, u64 *ecc) | ||
| 1144 | { | ||
| 1145 | struct ia64_sal_retval ret_stuff; | ||
| 1146 | unsigned long irq_flags; | ||
| 1147 | |||
| 1148 | local_irq_save(irq_flags); | ||
| 1149 | ia64_sal_oemcall_nolock(&ret_stuff, SN_SAL_INJECT_ERROR, paddr, (u64)data, | ||
| 1150 | (u64)ecc, 0, 0, 0, 0); | ||
| 1151 | local_irq_restore(irq_flags); | ||
| 1152 | return ret_stuff.status; | ||
| 1153 | } | ||
| 1143 | #endif /* _ASM_IA64_SN_SN_SAL_H */ | 1154 | #endif /* _ASM_IA64_SN_SN_SAL_H */ |
diff --git a/include/asm-ia64/thread_info.h b/include/asm-ia64/thread_info.h index 56394a2c70..e5392c4d30 100644 --- a/include/asm-ia64/thread_info.h +++ b/include/asm-ia64/thread_info.h | |||
| @@ -67,7 +67,7 @@ struct thread_info { | |||
| 67 | #define end_of_stack(p) (unsigned long *)((void *)(p) + IA64_RBS_OFFSET) | 67 | #define end_of_stack(p) (unsigned long *)((void *)(p) + IA64_RBS_OFFSET) |
| 68 | 68 | ||
| 69 | #define __HAVE_ARCH_TASK_STRUCT_ALLOCATOR | 69 | #define __HAVE_ARCH_TASK_STRUCT_ALLOCATOR |
| 70 | #define alloc_task_struct() ((task_t *)__get_free_pages(GFP_KERNEL, KERNEL_STACK_SIZE_ORDER)) | 70 | #define alloc_task_struct() ((task_t *)__get_free_pages(GFP_KERNEL | __GFP_COMP, KERNEL_STACK_SIZE_ORDER)) |
| 71 | #define free_task_struct(tsk) free_pages((unsigned long) (tsk), KERNEL_STACK_SIZE_ORDER) | 71 | #define free_task_struct(tsk) free_pages((unsigned long) (tsk), KERNEL_STACK_SIZE_ORDER) |
| 72 | 72 | ||
| 73 | #endif /* !__ASSEMBLY */ | 73 | #endif /* !__ASSEMBLY */ |
diff --git a/include/asm-ia64/topology.h b/include/asm-ia64/topology.h index 3ee19dfa46..616b5ed2aa 100644 --- a/include/asm-ia64/topology.h +++ b/include/asm-ia64/topology.h | |||
| @@ -23,6 +23,11 @@ | |||
| 23 | #define PENALTY_FOR_NODE_WITH_CPUS 255 | 23 | #define PENALTY_FOR_NODE_WITH_CPUS 255 |
| 24 | 24 | ||
| 25 | /* | 25 | /* |
| 26 | * Distance above which we begin to use zone reclaim | ||
| 27 | */ | ||
| 28 | #define RECLAIM_DISTANCE 15 | ||
| 29 | |||
| 30 | /* | ||
| 26 | * Returns the number of the node containing CPU 'cpu' | 31 | * Returns the number of the node containing CPU 'cpu' |
| 27 | */ | 32 | */ |
| 28 | #define cpu_to_node(cpu) (int)(cpu_to_node_map[cpu]) | 33 | #define cpu_to_node(cpu) (int)(cpu_to_node_map[cpu]) |
diff --git a/include/asm-ia64/unistd.h b/include/asm-ia64/unistd.h index 1c749acca0..7107763168 100644 --- a/include/asm-ia64/unistd.h +++ b/include/asm-ia64/unistd.h | |||
| @@ -289,12 +289,14 @@ | |||
| 289 | #define __NR_set_robust_list 1298 | 289 | #define __NR_set_robust_list 1298 |
| 290 | #define __NR_get_robust_list 1299 | 290 | #define __NR_get_robust_list 1299 |
| 291 | #define __NR_sync_file_range 1300 | 291 | #define __NR_sync_file_range 1300 |
| 292 | #define __NR_tee 1301 | ||
| 293 | #define __NR_vmsplice 1302 | ||
| 292 | 294 | ||
| 293 | #ifdef __KERNEL__ | 295 | #ifdef __KERNEL__ |
| 294 | 296 | ||
| 295 | #include <linux/config.h> | 297 | #include <linux/config.h> |
| 296 | 298 | ||
| 297 | #define NR_syscalls 277 /* length of syscall table */ | 299 | #define NR_syscalls 279 /* length of syscall table */ |
| 298 | 300 | ||
| 299 | #define __ARCH_WANT_SYS_RT_SIGACTION | 301 | #define __ARCH_WANT_SYS_RT_SIGACTION |
| 300 | 302 | ||
diff --git a/include/asm-m32r/assembler.h b/include/asm-m32r/assembler.h index b7f4d8aaeb..1a1aa17edd 100644 --- a/include/asm-m32r/assembler.h +++ b/include/asm-m32r/assembler.h | |||
| @@ -109,6 +109,9 @@ | |||
| 109 | push r13 | 109 | push r13 |
| 110 | mvfachi r13 | 110 | mvfachi r13 |
| 111 | push r13 | 111 | push r13 |
| 112 | ldi r13, #0 | ||
| 113 | push r13 ; dummy push acc1h | ||
| 114 | push r13 ; dummy push acc1l | ||
| 112 | #else | 115 | #else |
| 113 | #error unknown isa configuration | 116 | #error unknown isa configuration |
| 114 | #endif | 117 | #endif |
| @@ -156,6 +159,8 @@ | |||
| 156 | pop r13 | 159 | pop r13 |
| 157 | mvtaclo r13, a1 | 160 | mvtaclo r13, a1 |
| 158 | #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) | 161 | #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) |
| 162 | pop r13 ; dummy pop acc1h | ||
| 163 | pop r13 ; dummy pop acc1l | ||
| 159 | pop r13 | 164 | pop r13 |
| 160 | mvtachi r13 | 165 | mvtachi r13 |
| 161 | pop r13 | 166 | pop r13 |
diff --git a/include/asm-m32r/mappi3/mappi3_pld.h b/include/asm-m32r/mappi3/mappi3_pld.h index 1d3c25d61b..031369a7af 100644 --- a/include/asm-m32r/mappi3/mappi3_pld.h +++ b/include/asm-m32r/mappi3/mappi3_pld.h | |||
| @@ -53,16 +53,14 @@ | |||
| 53 | /* Power Control of MMC and CF */ | 53 | /* Power Control of MMC and CF */ |
| 54 | #define PLD_CPCR __reg16(PLD_BASE + 0x14000) | 54 | #define PLD_CPCR __reg16(PLD_BASE + 0x14000) |
| 55 | 55 | ||
| 56 | 56 | /* ICU */ | |
| 57 | /*==== ICU ====*/ | 57 | #define M32R_IRQ_PC104 (5) /* INT4(PC/104) */ |
| 58 | #define M32R_IRQ_PC104 (5) /* INT4(PC/104) */ | 58 | #define M32R_IRQ_I2C (28) /* I2C-BUS */ |
| 59 | #define M32R_IRQ_I2C (28) /* I2C-BUS */ | 59 | #define PLD_IRQ_CFIREQ (6) /* INT5 CFC Card Interrupt */ |
| 60 | #define PLD_IRQ_CFIREQ (6) /* INT5 CFC Card Interrupt */ | 60 | #define PLD_IRQ_CFC_INSERT (7) /* INT6 CFC Card Insert & Eject */ |
| 61 | #define PLD_IRQ_CFC_INSERT (7) /* INT6 CFC Card Insert */ | 61 | #define PLD_IRQ_IDEIREQ (8) /* INT7 IDE Interrupt */ |
| 62 | #define PLD_IRQ_IDEIREQ (8) /* INT7 IDE Interrupt */ | 62 | #define PLD_IRQ_MMCCARD (43) /* MMC Card Insert */ |
| 63 | #define PLD_IRQ_MMCCARD (43) /* MMC Card Insert */ | 63 | #define PLD_IRQ_MMCIRQ (44) /* MMC Transfer Done */ |
| 64 | #define PLD_IRQ_MMCIRQ (44) /* MMC Transfer Done */ | ||
| 65 | |||
| 66 | 64 | ||
| 67 | #if 0 | 65 | #if 0 |
| 68 | /* LED Control | 66 | /* LED Control |
| @@ -97,7 +95,6 @@ | |||
| 97 | #define PLD_CRC16ADATA __reg16(PLD_BASE + 0x18008) | 95 | #define PLD_CRC16ADATA __reg16(PLD_BASE + 0x18008) |
| 98 | #define PLD_CRC16AINDATA __reg16(PLD_BASE + 0x1800a) | 96 | #define PLD_CRC16AINDATA __reg16(PLD_BASE + 0x1800a) |
| 99 | 97 | ||
| 100 | |||
| 101 | #if 0 | 98 | #if 0 |
| 102 | /* RTC */ | 99 | /* RTC */ |
| 103 | #define PLD_RTCCR __reg16(PLD_BASE + 0x1c000) | 100 | #define PLD_RTCCR __reg16(PLD_BASE + 0x1c000) |
| @@ -140,4 +137,7 @@ | |||
| 140 | 137 | ||
| 141 | #endif | 138 | #endif |
| 142 | 139 | ||
| 140 | /* Reset Control */ | ||
| 141 | #define PLD_REBOOT __reg16(PLD_BASE + 0x38000) | ||
| 142 | |||
| 143 | #endif /* _MAPPI3_PLD.H */ | 143 | #endif /* _MAPPI3_PLD.H */ |
diff --git a/include/asm-m32r/ptrace.h b/include/asm-m32r/ptrace.h index 0d058b2d84..53c792452d 100644 --- a/include/asm-m32r/ptrace.h +++ b/include/asm-m32r/ptrace.h | |||
| @@ -43,6 +43,14 @@ | |||
| 43 | #define PT_ACC1L 18 | 43 | #define PT_ACC1L 18 |
| 44 | #define PT_ACCH PT_ACC0H | 44 | #define PT_ACCH PT_ACC0H |
| 45 | #define PT_ACCL PT_ACC0L | 45 | #define PT_ACCL PT_ACC0L |
| 46 | #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) | ||
| 47 | #define PT_ACCH 15 | ||
| 48 | #define PT_ACCL 16 | ||
| 49 | #define PT_DUMMY_ACC1H 17 | ||
| 50 | #define PT_DUMMY_ACC1L 18 | ||
| 51 | #else | ||
| 52 | #error unknown isa conifiguration | ||
| 53 | #endif | ||
| 46 | #define PT_PSW 19 | 54 | #define PT_PSW 19 |
| 47 | #define PT_BPC 20 | 55 | #define PT_BPC 20 |
| 48 | #define PT_BBPSW 21 | 56 | #define PT_BBPSW 21 |
| @@ -52,21 +60,6 @@ | |||
| 52 | #define PT_LR 25 | 60 | #define PT_LR 25 |
| 53 | #define PT_SPI 26 | 61 | #define PT_SPI 26 |
| 54 | #define PT_ORIGR0 27 | 62 | #define PT_ORIGR0 27 |
| 55 | #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) | ||
| 56 | #define PT_ACCH 15 | ||
| 57 | #define PT_ACCL 16 | ||
| 58 | #define PT_PSW 17 | ||
| 59 | #define PT_BPC 18 | ||
| 60 | #define PT_BBPSW 19 | ||
| 61 | #define PT_BBPC 20 | ||
| 62 | #define PT_SPU 21 | ||
| 63 | #define PT_FP 22 | ||
| 64 | #define PT_LR 23 | ||
| 65 | #define PT_SPI 24 | ||
| 66 | #define PT_ORIGR0 25 | ||
| 67 | #else | ||
| 68 | #error unknown isa conifiguration | ||
| 69 | #endif | ||
| 70 | 63 | ||
| 71 | /* virtual pt_reg entry for gdb */ | 64 | /* virtual pt_reg entry for gdb */ |
| 72 | #define PT_PC 30 | 65 | #define PT_PC 30 |
| @@ -121,6 +114,8 @@ struct pt_regs { | |||
| 121 | #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) | 114 | #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) |
| 122 | unsigned long acch; | 115 | unsigned long acch; |
| 123 | unsigned long accl; | 116 | unsigned long accl; |
| 117 | unsigned long dummy_acc1h; | ||
| 118 | unsigned long dummy_acc1l; | ||
| 124 | #else | 119 | #else |
| 125 | #error unknown isa configuration | 120 | #error unknown isa configuration |
| 126 | #endif | 121 | #endif |
diff --git a/include/asm-m32r/semaphore.h b/include/asm-m32r/semaphore.h index bf447c52a0..81750edc89 100644 --- a/include/asm-m32r/semaphore.h +++ b/include/asm-m32r/semaphore.h | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | * SMP- and interrupt-safe semaphores.. | 9 | * SMP- and interrupt-safe semaphores.. |
| 10 | * | 10 | * |
| 11 | * Copyright (C) 1996 Linus Torvalds | 11 | * Copyright (C) 1996 Linus Torvalds |
| 12 | * Copyright (C) 2004 Hirokazu Takata <takata at linux-m32r.org> | 12 | * Copyright (C) 2004, 2006 Hirokazu Takata <takata at linux-m32r.org> |
| 13 | */ | 13 | */ |
| 14 | 14 | ||
| 15 | #include <linux/config.h> | 15 | #include <linux/config.h> |
| @@ -77,27 +77,8 @@ asmlinkage void __up(struct semaphore * sem); | |||
| 77 | */ | 77 | */ |
| 78 | static inline void down(struct semaphore * sem) | 78 | static inline void down(struct semaphore * sem) |
| 79 | { | 79 | { |
| 80 | unsigned long flags; | ||
| 81 | long count; | ||
| 82 | |||
| 83 | might_sleep(); | 80 | might_sleep(); |
| 84 | local_irq_save(flags); | 81 | if (unlikely(atomic_dec_return(&sem->count) < 0)) |
| 85 | __asm__ __volatile__ ( | ||
| 86 | "# down \n\t" | ||
| 87 | DCACHE_CLEAR("%0", "r4", "%1") | ||
| 88 | M32R_LOCK" %0, @%1; \n\t" | ||
| 89 | "addi %0, #-1; \n\t" | ||
| 90 | M32R_UNLOCK" %0, @%1; \n\t" | ||
| 91 | : "=&r" (count) | ||
| 92 | : "r" (&sem->count) | ||
| 93 | : "memory" | ||
| 94 | #ifdef CONFIG_CHIP_M32700_TS1 | ||
| 95 | , "r4" | ||
| 96 | #endif /* CONFIG_CHIP_M32700_TS1 */ | ||
| 97 | ); | ||
| 98 | local_irq_restore(flags); | ||
| 99 | |||
| 100 | if (unlikely(count < 0)) | ||
| 101 | __down(sem); | 82 | __down(sem); |
| 102 | } | 83 | } |
| 103 | 84 | ||
| @@ -107,28 +88,10 @@ static inline void down(struct semaphore * sem) | |||
| 107 | */ | 88 | */ |
| 108 | static inline int down_interruptible(struct semaphore * sem) | 89 | static inline int down_interruptible(struct semaphore * sem) |
| 109 | { | 90 | { |
| 110 | unsigned long flags; | ||
| 111 | long count; | ||
| 112 | int result = 0; | 91 | int result = 0; |
| 113 | 92 | ||
| 114 | might_sleep(); | 93 | might_sleep(); |
| 115 | local_irq_save(flags); | 94 | if (unlikely(atomic_dec_return(&sem->count) < 0)) |
| 116 | __asm__ __volatile__ ( | ||
| 117 | "# down_interruptible \n\t" | ||
| 118 | DCACHE_CLEAR("%0", "r4", "%1") | ||
| 119 | M32R_LOCK" %0, @%1; \n\t" | ||
| 120 | "addi %0, #-1; \n\t" | ||
| 121 | M32R_UNLOCK" %0, @%1; \n\t" | ||
| 122 | : "=&r" (count) | ||
| 123 | : "r" (&sem->count) | ||
| 124 | : "memory" | ||
| 125 | #ifdef CONFIG_CHIP_M32700_TS1 | ||
| 126 | , "r4" | ||
| 127 | #endif /* CONFIG_CHIP_M32700_TS1 */ | ||
| 128 | ); | ||
| 129 | local_irq_restore(flags); | ||
| 130 | |||
| 131 | if (unlikely(count < 0)) | ||
| 132 | result = __down_interruptible(sem); | 95 | result = __down_interruptible(sem); |
| 133 | 96 | ||
| 134 | return result; | 97 | return result; |
| @@ -174,26 +137,7 @@ static inline int down_trylock(struct semaphore * sem) | |||
| 174 | */ | 137 | */ |
| 175 | static inline void up(struct semaphore * sem) | 138 | static inline void up(struct semaphore * sem) |
| 176 | { | 139 | { |
| 177 | unsigned long flags; | 140 | if (unlikely(atomic_inc_return(&sem->count) <= 0)) |
| 178 | long count; | ||
| 179 | |||
| 180 | local_irq_save(flags); | ||
| 181 | __asm__ __volatile__ ( | ||
| 182 | "# up \n\t" | ||
| 183 | DCACHE_CLEAR("%0", "r4", "%1") | ||
| 184 | M32R_LOCK" %0, @%1; \n\t" | ||
| 185 | "addi %0, #1; \n\t" | ||
| 186 | M32R_UNLOCK" %0, @%1; \n\t" | ||
| 187 | : "=&r" (count) | ||
| 188 | : "r" (&sem->count) | ||
| 189 | : "memory" | ||
| 190 | #ifdef CONFIG_CHIP_M32700_TS1 | ||
| 191 | , "r4" | ||
| 192 | #endif /* CONFIG_CHIP_M32700_TS1 */ | ||
| 193 | ); | ||
| 194 | local_irq_restore(flags); | ||
| 195 | |||
| 196 | if (unlikely(count <= 0)) | ||
| 197 | __up(sem); | 141 | __up(sem); |
| 198 | } | 142 | } |
| 199 | 143 | ||
diff --git a/include/asm-m32r/sigcontext.h b/include/asm-m32r/sigcontext.h index c233e2def2..942b8a3093 100644 --- a/include/asm-m32r/sigcontext.h +++ b/include/asm-m32r/sigcontext.h | |||
| @@ -32,6 +32,8 @@ struct sigcontext { | |||
| 32 | #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) | 32 | #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) |
| 33 | unsigned long sc_acch; | 33 | unsigned long sc_acch; |
| 34 | unsigned long sc_accl; | 34 | unsigned long sc_accl; |
| 35 | unsigned long sc_dummy_acc1h; | ||
| 36 | unsigned long sc_dummy_acc1l; | ||
| 35 | #else | 37 | #else |
| 36 | #error unknown isa configuration | 38 | #error unknown isa configuration |
| 37 | #endif | 39 | #endif |
diff --git a/include/asm-m32r/system.h b/include/asm-m32r/system.h index c5ab5da56d..e55013f378 100644 --- a/include/asm-m32r/system.h +++ b/include/asm-m32r/system.h | |||
| @@ -6,8 +6,8 @@ | |||
| 6 | * License. See the file "COPYING" in the main directory of this archive | 6 | * License. See the file "COPYING" in the main directory of this archive |
| 7 | * for more details. | 7 | * for more details. |
| 8 | * | 8 | * |
| 9 | * Copyright (C) 2001 by Hiroyuki Kondo, Hirokazu Takata, and Hitoshi Yamamoto | 9 | * Copyright (C) 2001 Hiroyuki Kondo, Hirokazu Takata, and Hitoshi Yamamoto |
| 10 | * Copyright (C) 2004 Hirokazu Takata <takata at linux-m32r.org> | 10 | * Copyright (C) 2004, 2006 Hirokazu Takata <takata at linux-m32r.org> |
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| 13 | #include <linux/config.h> | 13 | #include <linux/config.h> |
| @@ -19,49 +19,28 @@ | |||
| 19 | * switch_to(prev, next) should switch from task `prev' to `next' | 19 | * switch_to(prev, next) should switch from task `prev' to `next' |
| 20 | * `prev' will never be the same as `next'. | 20 | * `prev' will never be the same as `next'. |
| 21 | * | 21 | * |
| 22 | * `next' and `prev' should be struct task_struct, but it isn't always defined | 22 | * `next' and `prev' should be task_t, but it isn't always defined |
| 23 | */ | 23 | */ |
| 24 | 24 | ||
| 25 | #define switch_to(prev, next, last) do { \ | 25 | #define switch_to(prev, next, last) do { \ |
| 26 | register unsigned long arg0 __asm__ ("r0") = (unsigned long)prev; \ | ||
| 27 | register unsigned long arg1 __asm__ ("r1") = (unsigned long)next; \ | ||
| 28 | register unsigned long *oldsp __asm__ ("r2") = &(prev->thread.sp); \ | ||
| 29 | register unsigned long *newsp __asm__ ("r3") = &(next->thread.sp); \ | ||
| 30 | register unsigned long *oldlr __asm__ ("r4") = &(prev->thread.lr); \ | ||
| 31 | register unsigned long *newlr __asm__ ("r5") = &(next->thread.lr); \ | ||
| 32 | register struct task_struct *__last __asm__ ("r6"); \ | ||
| 33 | __asm__ __volatile__ ( \ | 26 | __asm__ __volatile__ ( \ |
| 34 | "st r8, @-r15 \n\t" \ | 27 | " seth lr, #high(1f) \n" \ |
| 35 | "st r9, @-r15 \n\t" \ | 28 | " or3 lr, lr, #low(1f) \n" \ |
| 36 | "st r10, @-r15 \n\t" \ | 29 | " st lr, @%4 ; store old LR \n" \ |
| 37 | "st r11, @-r15 \n\t" \ | 30 | " ld lr, @%5 ; load new LR \n" \ |
| 38 | "st r12, @-r15 \n\t" \ | 31 | " st sp, @%2 ; store old SP \n" \ |
| 39 | "st r13, @-r15 \n\t" \ | 32 | " ld sp, @%3 ; load new SP \n" \ |
| 40 | "st r14, @-r15 \n\t" \ | 33 | " push %1 ; store `prev' on new stack \n" \ |
| 41 | "seth r14, #high(1f) \n\t" \ | 34 | " jmp lr \n" \ |
| 42 | "or3 r14, r14, #low(1f) \n\t" \ | 35 | " .fillinsn \n" \ |
| 43 | "st r14, @r4 ; store old LR \n\t" \ | 36 | "1: \n" \ |
| 44 | "st r15, @r2 ; store old SP \n\t" \ | 37 | " pop %0 ; restore `__last' from new stack \n" \ |
| 45 | "ld r15, @r3 ; load new SP \n\t" \ | 38 | : "=r" (last) \ |
| 46 | "st r0, @-r15 ; store 'prev' onto new stack \n\t" \ | 39 | : "0" (prev), \ |
| 47 | "ld r14, @r5 ; load new LR \n\t" \ | 40 | "r" (&(prev->thread.sp)), "r" (&(next->thread.sp)), \ |
| 48 | "jmp r14 \n\t" \ | 41 | "r" (&(prev->thread.lr)), "r" (&(next->thread.lr)) \ |
| 49 | ".fillinsn \n " \ | 42 | : "memory", "lr" \ |
| 50 | "1: \n\t" \ | ||
| 51 | "ld r6, @r15+ ; load 'prev' from new stack \n\t" \ | ||
| 52 | "ld r14, @r15+ \n\t" \ | ||
| 53 | "ld r13, @r15+ \n\t" \ | ||
| 54 | "ld r12, @r15+ \n\t" \ | ||
| 55 | "ld r11, @r15+ \n\t" \ | ||
| 56 | "ld r10, @r15+ \n\t" \ | ||
| 57 | "ld r9, @r15+ \n\t" \ | ||
| 58 | "ld r8, @r15+ \n\t" \ | ||
| 59 | : "=&r" (__last) \ | ||
| 60 | : "r" (arg0), "r" (arg1), "r" (oldsp), "r" (newsp), \ | ||
| 61 | "r" (oldlr), "r" (newlr) \ | ||
| 62 | : "memory" \ | ||
| 63 | ); \ | 43 | ); \ |
| 64 | last = __last; \ | ||
| 65 | } while(0) | 44 | } while(0) |
| 66 | 45 | ||
| 67 | /* | 46 | /* |
| @@ -167,8 +146,8 @@ extern void __xchg_called_with_bad_pointer(void); | |||
| 167 | #define DCACHE_CLEAR(reg0, reg1, addr) | 146 | #define DCACHE_CLEAR(reg0, reg1, addr) |
| 168 | #endif /* CONFIG_CHIP_M32700_TS1 */ | 147 | #endif /* CONFIG_CHIP_M32700_TS1 */ |
| 169 | 148 | ||
| 170 | static __inline__ unsigned long __xchg(unsigned long x, volatile void * ptr, | 149 | static inline unsigned long |
| 171 | int size) | 150 | __xchg(unsigned long x, volatile void * ptr, int size) |
| 172 | { | 151 | { |
| 173 | unsigned long flags; | 152 | unsigned long flags; |
| 174 | unsigned long tmp = 0; | 153 | unsigned long tmp = 0; |
| @@ -220,7 +199,7 @@ static __inline__ unsigned long __xchg(unsigned long x, volatile void * ptr, | |||
| 220 | 199 | ||
| 221 | #define __HAVE_ARCH_CMPXCHG 1 | 200 | #define __HAVE_ARCH_CMPXCHG 1 |
| 222 | 201 | ||
| 223 | static __inline__ unsigned long | 202 | static inline unsigned long |
| 224 | __cmpxchg_u32(volatile unsigned int *p, unsigned int old, unsigned int new) | 203 | __cmpxchg_u32(volatile unsigned int *p, unsigned int old, unsigned int new) |
| 225 | { | 204 | { |
| 226 | unsigned long flags; | 205 | unsigned long flags; |
| @@ -254,7 +233,7 @@ __cmpxchg_u32(volatile unsigned int *p, unsigned int old, unsigned int new) | |||
| 254 | if something tries to do an invalid cmpxchg(). */ | 233 | if something tries to do an invalid cmpxchg(). */ |
| 255 | extern void __cmpxchg_called_with_bad_pointer(void); | 234 | extern void __cmpxchg_called_with_bad_pointer(void); |
| 256 | 235 | ||
| 257 | static __inline__ unsigned long | 236 | static inline unsigned long |
| 258 | __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) | 237 | __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) |
| 259 | { | 238 | { |
| 260 | switch (size) { | 239 | switch (size) { |
diff --git a/include/asm-mips/addrspace.h b/include/asm-mips/addrspace.h index 42520cc84b..1386af1cb7 100644 --- a/include/asm-mips/addrspace.h +++ b/include/asm-mips/addrspace.h | |||
| @@ -129,6 +129,7 @@ | |||
| 129 | #if defined (CONFIG_CPU_R4300) \ | 129 | #if defined (CONFIG_CPU_R4300) \ |
| 130 | || defined (CONFIG_CPU_R4X00) \ | 130 | || defined (CONFIG_CPU_R4X00) \ |
| 131 | || defined (CONFIG_CPU_R5000) \ | 131 | || defined (CONFIG_CPU_R5000) \ |
| 132 | || defined (CONFIG_CPU_RM7000) \ | ||
| 132 | || defined (CONFIG_CPU_NEVADA) \ | 133 | || defined (CONFIG_CPU_NEVADA) \ |
| 133 | || defined (CONFIG_CPU_TX49XX) \ | 134 | || defined (CONFIG_CPU_TX49XX) \ |
| 134 | || defined (CONFIG_CPU_MIPS64) | 135 | || defined (CONFIG_CPU_MIPS64) |
diff --git a/include/asm-mips/asmmacro.h b/include/asm-mips/asmmacro.h index 30b18ea6cb..f54aa147ec 100644 --- a/include/asm-mips/asmmacro.h +++ b/include/asm-mips/asmmacro.h | |||
| @@ -17,7 +17,26 @@ | |||
| 17 | #ifdef CONFIG_64BIT | 17 | #ifdef CONFIG_64BIT |
| 18 | #include <asm/asmmacro-64.h> | 18 | #include <asm/asmmacro-64.h> |
| 19 | #endif | 19 | #endif |
| 20 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 21 | #include <asm/mipsmtregs.h> | ||
| 22 | #endif | ||
| 20 | 23 | ||
| 24 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 25 | .macro local_irq_enable reg=t0 | ||
| 26 | mfc0 \reg, CP0_TCSTATUS | ||
| 27 | ori \reg, \reg, TCSTATUS_IXMT | ||
| 28 | xori \reg, \reg, TCSTATUS_IXMT | ||
| 29 | mtc0 \reg, CP0_TCSTATUS | ||
| 30 | ehb | ||
| 31 | .endm | ||
| 32 | |||
| 33 | .macro local_irq_disable reg=t0 | ||
| 34 | mfc0 \reg, CP0_TCSTATUS | ||
| 35 | ori \reg, \reg, TCSTATUS_IXMT | ||
| 36 | mtc0 \reg, CP0_TCSTATUS | ||
| 37 | ehb | ||
| 38 | .endm | ||
| 39 | #else | ||
| 21 | .macro local_irq_enable reg=t0 | 40 | .macro local_irq_enable reg=t0 |
| 22 | mfc0 \reg, CP0_STATUS | 41 | mfc0 \reg, CP0_STATUS |
| 23 | ori \reg, \reg, 1 | 42 | ori \reg, \reg, 1 |
| @@ -32,6 +51,7 @@ | |||
| 32 | mtc0 \reg, CP0_STATUS | 51 | mtc0 \reg, CP0_STATUS |
| 33 | irq_disable_hazard | 52 | irq_disable_hazard |
| 34 | .endm | 53 | .endm |
| 54 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 35 | 55 | ||
| 36 | #ifdef CONFIG_CPU_SB1 | 56 | #ifdef CONFIG_CPU_SB1 |
| 37 | .macro fpu_enable_hazard | 57 | .macro fpu_enable_hazard |
| @@ -48,4 +68,31 @@ | |||
| 48 | .endm | 68 | .endm |
| 49 | #endif | 69 | #endif |
| 50 | 70 | ||
| 71 | /* | ||
| 72 | * Temporary until all gas have MT ASE support | ||
| 73 | */ | ||
| 74 | .macro DMT reg=0 | ||
| 75 | .word (0x41600bc1 | (\reg << 16)) | ||
| 76 | .endm | ||
| 77 | |||
| 78 | .macro EMT reg=0 | ||
| 79 | .word (0x41600be1 | (\reg << 16)) | ||
| 80 | .endm | ||
| 81 | |||
| 82 | .macro DVPE reg=0 | ||
| 83 | .word (0x41600001 | (\reg << 16)) | ||
| 84 | .endm | ||
| 85 | |||
| 86 | .macro EVPE reg=0 | ||
| 87 | .word (0x41600021 | (\reg << 16)) | ||
| 88 | .endm | ||
| 89 | |||
| 90 | .macro MFTR rt=0, rd=0, u=0, sel=0 | ||
| 91 | .word (0x41000000 | (\rt << 16) | (\rd << 11) | (\u << 5) | (\sel)) | ||
| 92 | .endm | ||
| 93 | |||
| 94 | .macro MTTR rt=0, rd=0, u=0, sel=0 | ||
| 95 | .word (0x41800000 | (\rt << 16) | (\rd << 11) | (\u << 5) | (\sel)) | ||
| 96 | .endm | ||
| 97 | |||
| 51 | #endif /* _ASM_ASMMACRO_H */ | 98 | #endif /* _ASM_ASMMACRO_H */ |
diff --git a/include/asm-mips/bitops.h b/include/asm-mips/bitops.h index a1728f8c07..d2f444537e 100644 --- a/include/asm-mips/bitops.h +++ b/include/asm-mips/bitops.h | |||
| @@ -467,64 +467,56 @@ static inline unsigned long __ffs(unsigned long word) | |||
| 467 | } | 467 | } |
| 468 | 468 | ||
| 469 | /* | 469 | /* |
| 470 | * ffs - find first bit set. | 470 | * fls - find last bit set. |
| 471 | * @word: The word to search | 471 | * @word: The word to search |
| 472 | * | 472 | * |
| 473 | * Returns 1..SZLONG | 473 | * This is defined the same way as ffs. |
| 474 | * Returns 0 if no bit exists | 474 | * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. |
| 475 | */ | 475 | */ |
| 476 | 476 | static inline int fls(int word) | |
| 477 | static inline unsigned long ffs(unsigned long word) | ||
| 478 | { | 477 | { |
| 479 | if (!word) | 478 | __asm__ ("clz %0, %1" : "=r" (word) : "r" (word)); |
| 480 | return 0; | ||
| 481 | 479 | ||
| 482 | return __ffs(word) + 1; | 480 | return 32 - word; |
| 483 | } | 481 | } |
| 484 | 482 | ||
| 485 | /* | 483 | #if defined(CONFIG_64BIT) && defined(CONFIG_CPU_MIPS64) |
| 486 | * ffz - find first zero in word. | 484 | static inline int fls64(__u64 word) |
| 487 | * @word: The word to search | ||
| 488 | * | ||
| 489 | * Undefined if no zero exists, so code should check against ~0UL first. | ||
| 490 | */ | ||
| 491 | static inline unsigned long ffz(unsigned long word) | ||
| 492 | { | 485 | { |
| 493 | return __ffs (~word); | 486 | __asm__ ("dclz %0, %1" : "=r" (word) : "r" (word)); |
| 487 | |||
| 488 | return 64 - word; | ||
| 494 | } | 489 | } |
| 490 | #else | ||
| 491 | #include <asm-generic/bitops/fls64.h> | ||
| 492 | #endif | ||
| 495 | 493 | ||
| 496 | /* | 494 | /* |
| 497 | * fls - find last bit set. | 495 | * ffs - find first bit set. |
| 498 | * @word: The word to search | 496 | * @word: The word to search |
| 499 | * | 497 | * |
| 500 | * Returns 1..SZLONG | 498 | * This is defined the same way as |
| 501 | * Returns 0 if no bit exists | 499 | * the libc and compiler builtin ffs routines, therefore |
| 500 | * differs in spirit from the above ffz (man ffs). | ||
| 502 | */ | 501 | */ |
| 503 | static inline unsigned long fls(unsigned long word) | 502 | static inline int ffs(int word) |
| 504 | { | 503 | { |
| 505 | #ifdef CONFIG_CPU_MIPS32 | 504 | if (!word) |
| 506 | __asm__ ("clz %0, %1" : "=r" (word) : "r" (word)); | 505 | return 0; |
| 507 | |||
| 508 | return 32 - word; | ||
| 509 | #endif | ||
| 510 | |||
| 511 | #ifdef CONFIG_CPU_MIPS64 | ||
| 512 | __asm__ ("dclz %0, %1" : "=r" (word) : "r" (word)); | ||
| 513 | 506 | ||
| 514 | return 64 - word; | 507 | return fls(word & -word); |
| 515 | #endif | ||
| 516 | } | 508 | } |
| 517 | 509 | ||
| 518 | #else | 510 | #else |
| 519 | 511 | ||
| 520 | #include <asm-generic/bitops/__ffs.h> | 512 | #include <asm-generic/bitops/__ffs.h> |
| 521 | #include <asm-generic/bitops/ffs.h> | 513 | #include <asm-generic/bitops/ffs.h> |
| 522 | #include <asm-generic/bitops/ffz.h> | ||
| 523 | #include <asm-generic/bitops/fls.h> | 514 | #include <asm-generic/bitops/fls.h> |
| 515 | #include <asm-generic/bitops/fls64.h> | ||
| 524 | 516 | ||
| 525 | #endif /*defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64) */ | 517 | #endif /*defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64) */ |
| 526 | 518 | ||
| 527 | #include <asm-generic/bitops/fls64.h> | 519 | #include <asm-generic/bitops/ffz.h> |
| 528 | #include <asm-generic/bitops/find.h> | 520 | #include <asm-generic/bitops/find.h> |
| 529 | 521 | ||
| 530 | #ifdef __KERNEL__ | 522 | #ifdef __KERNEL__ |
diff --git a/include/asm-mips/cacheflush.h b/include/asm-mips/cacheflush.h index aeae9fabf4..47bc8f6c20 100644 --- a/include/asm-mips/cacheflush.h +++ b/include/asm-mips/cacheflush.h | |||
| @@ -74,6 +74,7 @@ static inline void copy_from_user_page(struct vm_area_struct *vma, | |||
| 74 | 74 | ||
| 75 | extern void (*flush_cache_sigtramp)(unsigned long addr); | 75 | extern void (*flush_cache_sigtramp)(unsigned long addr); |
| 76 | extern void (*flush_icache_all)(void); | 76 | extern void (*flush_icache_all)(void); |
| 77 | extern void (*local_flush_data_cache_page)(void * addr); | ||
| 77 | extern void (*flush_data_cache_page)(unsigned long addr); | 78 | extern void (*flush_data_cache_page)(unsigned long addr); |
| 78 | 79 | ||
| 79 | /* | 80 | /* |
diff --git a/include/asm-mips/cpu-features.h b/include/asm-mips/cpu-features.h index 3f2b6d9ac4..254e11ed24 100644 --- a/include/asm-mips/cpu-features.h +++ b/include/asm-mips/cpu-features.h | |||
| @@ -40,7 +40,7 @@ | |||
| 40 | #define cpu_has_sb1_cache (cpu_data[0].options & MIPS_CPU_SB1_CACHE) | 40 | #define cpu_has_sb1_cache (cpu_data[0].options & MIPS_CPU_SB1_CACHE) |
| 41 | #endif | 41 | #endif |
| 42 | #ifndef cpu_has_fpu | 42 | #ifndef cpu_has_fpu |
| 43 | #define cpu_has_fpu (cpu_data[0].options & MIPS_CPU_FPU) | 43 | #define cpu_has_fpu (current_cpu_data.options & MIPS_CPU_FPU) |
| 44 | #endif | 44 | #endif |
| 45 | #ifndef cpu_has_32fpr | 45 | #ifndef cpu_has_32fpr |
| 46 | #define cpu_has_32fpr (cpu_data[0].options & MIPS_CPU_32FPR) | 46 | #define cpu_has_32fpr (cpu_data[0].options & MIPS_CPU_32FPR) |
diff --git a/include/asm-mips/cpu-info.h b/include/asm-mips/cpu-info.h index 140be1c67d..6572ac7036 100644 --- a/include/asm-mips/cpu-info.h +++ b/include/asm-mips/cpu-info.h | |||
| @@ -73,6 +73,16 @@ struct cpuinfo_mips { | |||
| 73 | struct cache_desc dcache; /* Primary D or combined I/D cache */ | 73 | struct cache_desc dcache; /* Primary D or combined I/D cache */ |
| 74 | struct cache_desc scache; /* Secondary cache */ | 74 | struct cache_desc scache; /* Secondary cache */ |
| 75 | struct cache_desc tcache; /* Tertiary/split secondary cache */ | 75 | struct cache_desc tcache; /* Tertiary/split secondary cache */ |
| 76 | #if defined(CONFIG_MIPS_MT_SMTC) | ||
| 77 | /* | ||
| 78 | * In the MIPS MT "SMTC" model, each TC is considered | ||
| 79 | * to be a "CPU" for the purposes of scheduling, but | ||
| 80 | * exception resources, ASID spaces, etc, are common | ||
| 81 | * to all TCs within the same VPE. | ||
| 82 | */ | ||
| 83 | int vpe_id; /* Virtual Processor number */ | ||
| 84 | int tc_id; /* Thread Context number */ | ||
| 85 | #endif /* CONFIG_MIPS_MT */ | ||
| 76 | void *data; /* Additional data */ | 86 | void *data; /* Additional data */ |
| 77 | } __attribute__((aligned(SMP_CACHE_BYTES))); | 87 | } __attribute__((aligned(SMP_CACHE_BYTES))); |
| 78 | 88 | ||
diff --git a/include/asm-mips/cpu.h b/include/asm-mips/cpu.h index 818b9a97e2..dff2a0a52f 100644 --- a/include/asm-mips/cpu.h +++ b/include/asm-mips/cpu.h | |||
| @@ -51,6 +51,7 @@ | |||
| 51 | #define PRID_IMP_R4300 0x0b00 | 51 | #define PRID_IMP_R4300 0x0b00 |
| 52 | #define PRID_IMP_VR41XX 0x0c00 | 52 | #define PRID_IMP_VR41XX 0x0c00 |
| 53 | #define PRID_IMP_R12000 0x0e00 | 53 | #define PRID_IMP_R12000 0x0e00 |
| 54 | #define PRID_IMP_R14000 0x0f00 | ||
| 54 | #define PRID_IMP_R8000 0x1000 | 55 | #define PRID_IMP_R8000 0x1000 |
| 55 | #define PRID_IMP_PR4450 0x1200 | 56 | #define PRID_IMP_PR4450 0x1200 |
| 56 | #define PRID_IMP_R4600 0x2000 | 57 | #define PRID_IMP_R4600 0x2000 |
| @@ -87,6 +88,7 @@ | |||
| 87 | #define PRID_IMP_24K 0x9300 | 88 | #define PRID_IMP_24K 0x9300 |
| 88 | #define PRID_IMP_34K 0x9500 | 89 | #define PRID_IMP_34K 0x9500 |
| 89 | #define PRID_IMP_24KE 0x9600 | 90 | #define PRID_IMP_24KE 0x9600 |
| 91 | #define PRID_IMP_74K 0x9700 | ||
| 90 | 92 | ||
| 91 | /* | 93 | /* |
| 92 | * These are the PRID's for when 23:16 == PRID_COMP_SIBYTE | 94 | * These are the PRID's for when 23:16 == PRID_COMP_SIBYTE |
| @@ -196,7 +198,9 @@ | |||
| 196 | #define CPU_34K 60 | 198 | #define CPU_34K 60 |
| 197 | #define CPU_PR4450 61 | 199 | #define CPU_PR4450 61 |
| 198 | #define CPU_SB1A 62 | 200 | #define CPU_SB1A 62 |
| 199 | #define CPU_LAST 62 | 201 | #define CPU_74K 63 |
| 202 | #define CPU_R14000 64 | ||
| 203 | #define CPU_LAST 64 | ||
| 200 | 204 | ||
| 201 | /* | 205 | /* |
| 202 | * ISA Level encodings | 206 | * ISA Level encodings |
diff --git a/include/asm-mips/delay.h b/include/asm-mips/delay.h index 64dd45150f..928f30f8c4 100644 --- a/include/asm-mips/delay.h +++ b/include/asm-mips/delay.h | |||
| @@ -19,20 +19,22 @@ static inline void __delay(unsigned long loops) | |||
| 19 | { | 19 | { |
| 20 | if (sizeof(long) == 4) | 20 | if (sizeof(long) == 4) |
| 21 | __asm__ __volatile__ ( | 21 | __asm__ __volatile__ ( |
| 22 | ".set\tnoreorder\n" | 22 | " .set noreorder \n" |
| 23 | "1:\tbnez\t%0,1b\n\t" | 23 | " .align 3 \n" |
| 24 | "subu\t%0,1\n\t" | 24 | "1: bnez %0, 1b \n" |
| 25 | ".set\treorder" | 25 | " subu %0, 1 \n" |
| 26 | " .set reorder \n" | ||
| 26 | : "=r" (loops) | 27 | : "=r" (loops) |
| 27 | : "0" (loops)); | 28 | : "0" (loops)); |
| 28 | else if (sizeof(long) == 8) | 29 | else if (sizeof(long) == 8) |
| 29 | __asm__ __volatile__ ( | 30 | __asm__ __volatile__ ( |
| 30 | ".set\tnoreorder\n" | 31 | " .set noreorder \n" |
| 31 | "1:\tbnez\t%0,1b\n\t" | 32 | " .align 3 \n" |
| 32 | "dsubu\t%0,1\n\t" | 33 | "1: bnez %0, 1b \n" |
| 33 | ".set\treorder" | 34 | " dsubu %0, 1 \n" |
| 34 | :"=r" (loops) | 35 | " .set reorder \n" |
| 35 | :"0" (loops)); | 36 | : "=r" (loops) |
| 37 | : "0" (loops)); | ||
| 36 | } | 38 | } |
| 37 | 39 | ||
| 38 | 40 | ||
diff --git a/include/asm-mips/ds1742.h b/include/asm-mips/ds1742.h new file mode 100644 index 0000000000..c2f2c32da6 --- /dev/null +++ b/include/asm-mips/ds1742.h | |||
| @@ -0,0 +1,13 @@ | |||
| 1 | /* | ||
| 2 | * This file is subject to the terms and conditions of the GNU General Public | ||
| 3 | * License. See the file "COPYING" in the main directory of this archive | ||
| 4 | * for more details. | ||
| 5 | * | ||
| 6 | * Copyright (C) 2006 by Ralf Baechle (ralf@linux-mips.org) | ||
| 7 | */ | ||
| 8 | #ifndef _ASM_DS1742_H | ||
| 9 | #define _ASM_DS1742_H | ||
| 10 | |||
| 11 | #include <ds1742.h> | ||
| 12 | |||
| 13 | #endif /* _ASM_DS1742_H */ | ||
diff --git a/include/asm-mips/elf.h b/include/asm-mips/elf.h index 851f013ada..bdc9de2df1 100644 --- a/include/asm-mips/elf.h +++ b/include/asm-mips/elf.h | |||
| @@ -119,8 +119,49 @@ | |||
| 119 | #define SHT_MIPS_CONFLICT 0x70000002 | 119 | #define SHT_MIPS_CONFLICT 0x70000002 |
| 120 | #define SHT_MIPS_GPTAB 0x70000003 | 120 | #define SHT_MIPS_GPTAB 0x70000003 |
| 121 | #define SHT_MIPS_UCODE 0x70000004 | 121 | #define SHT_MIPS_UCODE 0x70000004 |
| 122 | 122 | #define SHT_MIPS_DEBUG 0x70000005 | |
| 123 | #define SHF_MIPS_GPREL 0x10000000 | 123 | #define SHT_MIPS_REGINFO 0x70000006 |
| 124 | #define SHT_MIPS_PACKAGE 0x70000007 | ||
| 125 | #define SHT_MIPS_PACKSYM 0x70000008 | ||
| 126 | #define SHT_MIPS_RELD 0x70000009 | ||
| 127 | #define SHT_MIPS_IFACE 0x7000000b | ||
| 128 | #define SHT_MIPS_CONTENT 0x7000000c | ||
| 129 | #define SHT_MIPS_OPTIONS 0x7000000d | ||
| 130 | #define SHT_MIPS_SHDR 0x70000010 | ||
| 131 | #define SHT_MIPS_FDESC 0x70000011 | ||
| 132 | #define SHT_MIPS_EXTSYM 0x70000012 | ||
| 133 | #define SHT_MIPS_DENSE 0x70000013 | ||
| 134 | #define SHT_MIPS_PDESC 0x70000014 | ||
| 135 | #define SHT_MIPS_LOCSYM 0x70000015 | ||
| 136 | #define SHT_MIPS_AUXSYM 0x70000016 | ||
| 137 | #define SHT_MIPS_OPTSYM 0x70000017 | ||
| 138 | #define SHT_MIPS_LOCSTR 0x70000018 | ||
| 139 | #define SHT_MIPS_LINE 0x70000019 | ||
| 140 | #define SHT_MIPS_RFDESC 0x7000001a | ||
| 141 | #define SHT_MIPS_DELTASYM 0x7000001b | ||
| 142 | #define SHT_MIPS_DELTAINST 0x7000001c | ||
| 143 | #define SHT_MIPS_DELTACLASS 0x7000001d | ||
| 144 | #define SHT_MIPS_DWARF 0x7000001e | ||
| 145 | #define SHT_MIPS_DELTADECL 0x7000001f | ||
| 146 | #define SHT_MIPS_SYMBOL_LIB 0x70000020 | ||
| 147 | #define SHT_MIPS_EVENTS 0x70000021 | ||
| 148 | #define SHT_MIPS_TRANSLATE 0x70000022 | ||
| 149 | #define SHT_MIPS_PIXIE 0x70000023 | ||
| 150 | #define SHT_MIPS_XLATE 0x70000024 | ||
| 151 | #define SHT_MIPS_XLATE_DEBUG 0x70000025 | ||
| 152 | #define SHT_MIPS_WHIRL 0x70000026 | ||
| 153 | #define SHT_MIPS_EH_REGION 0x70000027 | ||
| 154 | #define SHT_MIPS_XLATE_OLD 0x70000028 | ||
| 155 | #define SHT_MIPS_PDR_EXCEPTION 0x70000029 | ||
| 156 | |||
| 157 | #define SHF_MIPS_GPREL 0x10000000 | ||
| 158 | #define SHF_MIPS_MERGE 0x20000000 | ||
| 159 | #define SHF_MIPS_ADDR 0x40000000 | ||
| 160 | #define SHF_MIPS_STRING 0x80000000 | ||
| 161 | #define SHF_MIPS_NOSTRIP 0x08000000 | ||
| 162 | #define SHF_MIPS_LOCAL 0x04000000 | ||
| 163 | #define SHF_MIPS_NAMES 0x02000000 | ||
| 164 | #define SHF_MIPS_NODUPES 0x01000000 | ||
| 124 | 165 | ||
| 125 | #ifndef ELF_ARCH | 166 | #ifndef ELF_ARCH |
| 126 | /* ELF register definitions */ | 167 | /* ELF register definitions */ |
diff --git a/include/asm-mips/fpu.h b/include/asm-mips/fpu.h index 9c828b1f82..b0f50015e2 100644 --- a/include/asm-mips/fpu.h +++ b/include/asm-mips/fpu.h | |||
| @@ -21,6 +21,10 @@ | |||
| 21 | #include <asm/processor.h> | 21 | #include <asm/processor.h> |
| 22 | #include <asm/current.h> | 22 | #include <asm/current.h> |
| 23 | 23 | ||
| 24 | #ifdef CONFIG_MIPS_MT_FPAFF | ||
| 25 | #include <asm/mips_mt.h> | ||
| 26 | #endif | ||
| 27 | |||
| 24 | struct sigcontext; | 28 | struct sigcontext; |
| 25 | struct sigcontext32; | 29 | struct sigcontext32; |
| 26 | 30 | ||
diff --git a/include/asm-mips/futex.h b/include/asm-mips/futex.h index a554089991..12d118f1bc 100644 --- a/include/asm-mips/futex.h +++ b/include/asm-mips/futex.h | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include <linux/futex.h> | 7 | #include <linux/futex.h> |
| 8 | #include <asm/errno.h> | 8 | #include <asm/errno.h> |
| 9 | #include <asm/uaccess.h> | 9 | #include <asm/uaccess.h> |
| 10 | #include <asm/war.h> | ||
| 10 | 11 | ||
| 11 | #ifdef CONFIG_SMP | 12 | #ifdef CONFIG_SMP |
| 12 | #define __FUTEX_SMP_SYNC " sync \n" | 13 | #define __FUTEX_SMP_SYNC " sync \n" |
| @@ -16,30 +17,58 @@ | |||
| 16 | 17 | ||
| 17 | #define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \ | 18 | #define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \ |
| 18 | { \ | 19 | { \ |
| 19 | __asm__ __volatile__( \ | 20 | if (cpu_has_llsc && R10000_LLSC_WAR) { \ |
| 20 | " .set push \n" \ | 21 | __asm__ __volatile__( \ |
| 21 | " .set noat \n" \ | 22 | " .set push \n" \ |
| 22 | " .set mips3 \n" \ | 23 | " .set noat \n" \ |
| 23 | "1: ll %1, (%3) # __futex_atomic_op1 \n" \ | 24 | " .set mips3 \n" \ |
| 24 | " .set mips0 \n" \ | 25 | "1: ll %1, (%3) # __futex_atomic_op \n" \ |
| 25 | " " insn " \n" \ | 26 | " .set mips0 \n" \ |
| 26 | " .set mips3 \n" \ | 27 | " " insn " \n" \ |
| 27 | "2: sc $1, (%3) \n" \ | 28 | " .set mips3 \n" \ |
| 28 | " beqzl $1, 1b \n" \ | 29 | "2: sc $1, (%3) \n" \ |
| 29 | __FUTEX_SMP_SYNC \ | 30 | " beqzl $1, 1b \n" \ |
| 30 | "3: \n" \ | 31 | __FUTEX_SMP_SYNC \ |
| 31 | " .set pop \n" \ | 32 | "3: \n" \ |
| 32 | " .set mips0 \n" \ | 33 | " .set pop \n" \ |
| 33 | " .section .fixup,\"ax\" \n" \ | 34 | " .set mips0 \n" \ |
| 34 | "4: li %0, %5 \n" \ | 35 | " .section .fixup,\"ax\" \n" \ |
| 35 | " j 2b \n" \ | 36 | "4: li %0, %5 \n" \ |
| 36 | " .previous \n" \ | 37 | " j 2b \n" \ |
| 37 | " .section __ex_table,\"a\" \n" \ | 38 | " .previous \n" \ |
| 38 | " "__UA_ADDR "\t1b, 4b \n" \ | 39 | " .section __ex_table,\"a\" \n" \ |
| 39 | " "__UA_ADDR "\t2b, 4b \n" \ | 40 | " "__UA_ADDR "\t1b, 4b \n" \ |
| 40 | " .previous \n" \ | 41 | " "__UA_ADDR "\t2b, 4b \n" \ |
| 41 | : "=r" (ret), "=r" (oldval) \ | 42 | " .previous \n" \ |
| 42 | : "0" (0), "r" (uaddr), "Jr" (oparg), "i" (-EFAULT)); \ | 43 | : "=r" (ret), "=r" (oldval) \ |
| 44 | : "0" (0), "r" (uaddr), "Jr" (oparg), "i" (-EFAULT)); \ | ||
| 45 | } else if (cpu_has_llsc) { \ | ||
| 46 | __asm__ __volatile__( \ | ||
| 47 | " .set push \n" \ | ||
| 48 | " .set noat \n" \ | ||
| 49 | " .set mips3 \n" \ | ||
| 50 | "1: ll %1, (%3) # __futex_atomic_op \n" \ | ||
| 51 | " .set mips0 \n" \ | ||
| 52 | " " insn " \n" \ | ||
| 53 | " .set mips3 \n" \ | ||
| 54 | "2: sc $1, (%3) \n" \ | ||
| 55 | " beqz $1, 1b \n" \ | ||
| 56 | __FUTEX_SMP_SYNC \ | ||
| 57 | "3: \n" \ | ||
| 58 | " .set pop \n" \ | ||
| 59 | " .set mips0 \n" \ | ||
| 60 | " .section .fixup,\"ax\" \n" \ | ||
| 61 | "4: li %0, %5 \n" \ | ||
| 62 | " j 2b \n" \ | ||
| 63 | " .previous \n" \ | ||
| 64 | " .section __ex_table,\"a\" \n" \ | ||
| 65 | " "__UA_ADDR "\t1b, 4b \n" \ | ||
| 66 | " "__UA_ADDR "\t2b, 4b \n" \ | ||
| 67 | " .previous \n" \ | ||
| 68 | : "=r" (ret), "=r" (oldval) \ | ||
| 69 | : "0" (0), "r" (uaddr), "Jr" (oparg), "i" (-EFAULT)); \ | ||
| 70 | } else \ | ||
| 71 | ret = -ENOSYS; \ | ||
| 43 | } | 72 | } |
| 44 | 73 | ||
| 45 | static inline int | 74 | static inline int |
| @@ -102,7 +131,69 @@ futex_atomic_op_inuser (int encoded_op, int __user *uaddr) | |||
| 102 | static inline int | 131 | static inline int |
| 103 | futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) | 132 | futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) |
| 104 | { | 133 | { |
| 105 | return -ENOSYS; | 134 | int retval; |
| 135 | |||
| 136 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) | ||
| 137 | return -EFAULT; | ||
| 138 | |||
| 139 | if (cpu_has_llsc && R10000_LLSC_WAR) { | ||
| 140 | __asm__ __volatile__( | ||
| 141 | "# futex_atomic_cmpxchg_inatomic \n" | ||
| 142 | " .set push \n" | ||
| 143 | " .set noat \n" | ||
| 144 | " .set mips3 \n" | ||
| 145 | "1: ll %0, %2 \n" | ||
| 146 | " bne %0, %z3, 3f \n" | ||
| 147 | " .set mips0 \n" | ||
| 148 | " move $1, %z4 \n" | ||
| 149 | " .set mips3 \n" | ||
| 150 | "2: sc $1, %1 \n" | ||
| 151 | " beqzl $1, 1b \n" | ||
| 152 | __FUTEX_SMP_SYNC | ||
| 153 | "3: \n" | ||
| 154 | " .set pop \n" | ||
| 155 | " .section .fixup,\"ax\" \n" | ||
| 156 | "4: li %0, %5 \n" | ||
| 157 | " j 3b \n" | ||
| 158 | " .previous \n" | ||
| 159 | " .section __ex_table,\"a\" \n" | ||
| 160 | " "__UA_ADDR "\t1b, 4b \n" | ||
| 161 | " "__UA_ADDR "\t2b, 4b \n" | ||
| 162 | " .previous \n" | ||
| 163 | : "=&r" (retval), "=R" (*uaddr) | ||
| 164 | : "R" (*uaddr), "Jr" (oldval), "Jr" (newval), "i" (-EFAULT) | ||
| 165 | : "memory"); | ||
| 166 | } else if (cpu_has_llsc) { | ||
| 167 | __asm__ __volatile__( | ||
| 168 | "# futex_atomic_cmpxchg_inatomic \n" | ||
| 169 | " .set push \n" | ||
| 170 | " .set noat \n" | ||
| 171 | " .set mips3 \n" | ||
| 172 | "1: ll %0, %2 \n" | ||
| 173 | " bne %0, %z3, 3f \n" | ||
| 174 | " .set mips0 \n" | ||
| 175 | " move $1, %z4 \n" | ||
| 176 | " .set mips3 \n" | ||
| 177 | "2: sc $1, %1 \n" | ||
| 178 | " beqz $1, 1b \n" | ||
| 179 | __FUTEX_SMP_SYNC | ||
| 180 | "3: \n" | ||
| 181 | " .set pop \n" | ||
| 182 | " .section .fixup,\"ax\" \n" | ||
| 183 | "4: li %0, %5 \n" | ||
| 184 | " j 3b \n" | ||
| 185 | " .previous \n" | ||
| 186 | " .section __ex_table,\"a\" \n" | ||
| 187 | " "__UA_ADDR "\t1b, 4b \n" | ||
| 188 | " "__UA_ADDR "\t2b, 4b \n" | ||
| 189 | " .previous \n" | ||
| 190 | : "=&r" (retval), "=R" (*uaddr) | ||
| 191 | : "R" (*uaddr), "Jr" (oldval), "Jr" (newval), "i" (-EFAULT) | ||
| 192 | : "memory"); | ||
| 193 | } else | ||
| 194 | return -ENOSYS; | ||
| 195 | |||
| 196 | return retval; | ||
| 106 | } | 197 | } |
| 107 | 198 | ||
| 108 | #endif | 199 | #endif |
diff --git a/include/asm-mips/hazards.h b/include/asm-mips/hazards.h index feb29a7938..dadc05188d 100644 --- a/include/asm-mips/hazards.h +++ b/include/asm-mips/hazards.h | |||
| @@ -284,6 +284,8 @@ do { \ | |||
| 284 | #define instruction_hazard() do { } while (0) | 284 | #define instruction_hazard() do { } while (0) |
| 285 | #endif | 285 | #endif |
| 286 | 286 | ||
| 287 | extern void mips_ihb(void); | ||
| 288 | |||
| 287 | #endif /* __ASSEMBLY__ */ | 289 | #endif /* __ASSEMBLY__ */ |
| 288 | 290 | ||
| 289 | #endif /* _ASM_HAZARDS_H */ | 291 | #endif /* _ASM_HAZARDS_H */ |
diff --git a/include/asm-mips/inst.h b/include/asm-mips/inst.h index e0745f4ff6..1ed8d0f625 100644 --- a/include/asm-mips/inst.h +++ b/include/asm-mips/inst.h | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | * for more details. | 6 | * for more details. |
| 7 | * | 7 | * |
| 8 | * Copyright (C) 1996, 2000 by Ralf Baechle | 8 | * Copyright (C) 1996, 2000 by Ralf Baechle |
| 9 | * Copyright (C) 2006 by Thiemo Seufer | ||
| 9 | */ | 10 | */ |
| 10 | #ifndef _ASM_INST_H | 11 | #ifndef _ASM_INST_H |
| 11 | #define _ASM_INST_H | 12 | #define _ASM_INST_H |
| @@ -21,14 +22,14 @@ enum major_op { | |||
| 21 | cop0_op, cop1_op, cop2_op, cop1x_op, | 22 | cop0_op, cop1_op, cop2_op, cop1x_op, |
| 22 | beql_op, bnel_op, blezl_op, bgtzl_op, | 23 | beql_op, bnel_op, blezl_op, bgtzl_op, |
| 23 | daddi_op, daddiu_op, ldl_op, ldr_op, | 24 | daddi_op, daddiu_op, ldl_op, ldr_op, |
| 24 | major_1c_op, jalx_op, major_1e_op, major_1f_op, | 25 | spec2_op, jalx_op, mdmx_op, spec3_op, |
| 25 | lb_op, lh_op, lwl_op, lw_op, | 26 | lb_op, lh_op, lwl_op, lw_op, |
| 26 | lbu_op, lhu_op, lwr_op, lwu_op, | 27 | lbu_op, lhu_op, lwr_op, lwu_op, |
| 27 | sb_op, sh_op, swl_op, sw_op, | 28 | sb_op, sh_op, swl_op, sw_op, |
| 28 | sdl_op, sdr_op, swr_op, cache_op, | 29 | sdl_op, sdr_op, swr_op, cache_op, |
| 29 | ll_op, lwc1_op, lwc2_op, pref_op, | 30 | ll_op, lwc1_op, lwc2_op, pref_op, |
| 30 | lld_op, ldc1_op, ldc2_op, ld_op, | 31 | lld_op, ldc1_op, ldc2_op, ld_op, |
| 31 | sc_op, swc1_op, swc2_op, rdhwr_op, | 32 | sc_op, swc1_op, swc2_op, major_3b_op, |
| 32 | scd_op, sdc1_op, sdc2_op, sd_op | 33 | scd_op, sdc1_op, sdc2_op, sd_op |
| 33 | }; | 34 | }; |
| 34 | 35 | ||
| @@ -37,7 +38,7 @@ enum major_op { | |||
| 37 | */ | 38 | */ |
| 38 | enum spec_op { | 39 | enum spec_op { |
| 39 | sll_op, movc_op, srl_op, sra_op, | 40 | sll_op, movc_op, srl_op, sra_op, |
| 40 | sllv_op, srlv_op, srav_op, spec1_unused_op, /* Opcode 0x07 is unused */ | 41 | sllv_op, pmon_op, srlv_op, srav_op, |
| 41 | jr_op, jalr_op, movz_op, movn_op, | 42 | jr_op, jalr_op, movz_op, movn_op, |
| 42 | syscall_op, break_op, spim_op, sync_op, | 43 | syscall_op, break_op, spim_op, sync_op, |
| 43 | mfhi_op, mthi_op, mflo_op, mtlo_op, | 44 | mfhi_op, mthi_op, mflo_op, mtlo_op, |
| @@ -55,6 +56,28 @@ enum spec_op { | |||
| 55 | }; | 56 | }; |
| 56 | 57 | ||
| 57 | /* | 58 | /* |
| 59 | * func field of spec2 opcode. | ||
| 60 | */ | ||
| 61 | enum spec2_op { | ||
| 62 | madd_op, maddu_op, mul_op, spec2_3_unused_op, | ||
| 63 | msub_op, msubu_op, /* more unused ops */ | ||
| 64 | clz_op = 0x20, clo_op, | ||
| 65 | dclz_op = 0x24, dclo_op, | ||
| 66 | sdbpp_op = 0x3f | ||
| 67 | }; | ||
| 68 | |||
| 69 | /* | ||
| 70 | * func field of spec3 opcode. | ||
| 71 | */ | ||
| 72 | enum spec3_op { | ||
| 73 | ext_op, dextm_op, dextu_op, dext_op, | ||
| 74 | ins_op, dinsm_op, dinsu_op, dins_op, | ||
| 75 | bshfl_op = 0x20, | ||
| 76 | dbshfl_op = 0x24, | ||
| 77 | rdhwr_op = 0x3f | ||
| 78 | }; | ||
| 79 | |||
| 80 | /* | ||
| 58 | * rt field of bcond opcodes. | 81 | * rt field of bcond opcodes. |
| 59 | */ | 82 | */ |
| 60 | enum rt_op { | 83 | enum rt_op { |
| @@ -151,8 +174,8 @@ enum cop1x_func { | |||
| 151 | * func field for mad opcodes (MIPS IV). | 174 | * func field for mad opcodes (MIPS IV). |
| 152 | */ | 175 | */ |
| 153 | enum mad_func { | 176 | enum mad_func { |
| 154 | madd_op = 0x08, msub_op = 0x0a, | 177 | madd_fp_op = 0x08, msub_fp_op = 0x0a, |
| 155 | nmadd_op = 0x0c, nmsub_op = 0x0e | 178 | nmadd_fp_op = 0x0c, nmsub_fp_op = 0x0e |
| 156 | }; | 179 | }; |
| 157 | 180 | ||
| 158 | /* | 181 | /* |
diff --git a/include/asm-mips/interrupt.h b/include/asm-mips/interrupt.h index 774348734f..4bb9c06f44 100644 --- a/include/asm-mips/interrupt.h +++ b/include/asm-mips/interrupt.h | |||
| @@ -19,7 +19,12 @@ __asm__ ( | |||
| 19 | " .set push \n" | 19 | " .set push \n" |
| 20 | " .set reorder \n" | 20 | " .set reorder \n" |
| 21 | " .set noat \n" | 21 | " .set noat \n" |
| 22 | #ifdef CONFIG_CPU_MIPSR2 | 22 | #ifdef CONFIG_MIPS_MT_SMTC |
| 23 | " mfc0 $1, $2, 1 # SMTC - clear TCStatus.IXMT \n" | ||
| 24 | " ori $1, 0x400 \n" | ||
| 25 | " xori $1, 0x400 \n" | ||
| 26 | " mtc0 $1, $2, 1 \n" | ||
| 27 | #elif defined(CONFIG_CPU_MIPSR2) | ||
| 23 | " ei \n" | 28 | " ei \n" |
| 24 | #else | 29 | #else |
| 25 | " mfc0 $1,$12 \n" | 30 | " mfc0 $1,$12 \n" |
| @@ -62,7 +67,12 @@ __asm__ ( | |||
| 62 | " .macro local_irq_disable\n" | 67 | " .macro local_irq_disable\n" |
| 63 | " .set push \n" | 68 | " .set push \n" |
| 64 | " .set noat \n" | 69 | " .set noat \n" |
| 65 | #ifdef CONFIG_CPU_MIPSR2 | 70 | #ifdef CONFIG_MIPS_MT_SMTC |
| 71 | " mfc0 $1, $2, 1 \n" | ||
| 72 | " ori $1, 0x400 \n" | ||
| 73 | " .set noreorder \n" | ||
| 74 | " mtc0 $1, $2, 1 \n" | ||
| 75 | #elif defined(CONFIG_CPU_MIPSR2) | ||
| 66 | " di \n" | 76 | " di \n" |
| 67 | #else | 77 | #else |
| 68 | " mfc0 $1,$12 \n" | 78 | " mfc0 $1,$12 \n" |
| @@ -88,7 +98,11 @@ __asm__ ( | |||
| 88 | " .macro local_save_flags flags \n" | 98 | " .macro local_save_flags flags \n" |
| 89 | " .set push \n" | 99 | " .set push \n" |
| 90 | " .set reorder \n" | 100 | " .set reorder \n" |
| 101 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 102 | " mfc0 \\flags, $2, 1 \n" | ||
| 103 | #else | ||
| 91 | " mfc0 \\flags, $12 \n" | 104 | " mfc0 \\flags, $12 \n" |
| 105 | #endif | ||
| 92 | " .set pop \n" | 106 | " .set pop \n" |
| 93 | " .endm \n"); | 107 | " .endm \n"); |
| 94 | 108 | ||
| @@ -102,7 +116,13 @@ __asm__ ( | |||
| 102 | " .set push \n" | 116 | " .set push \n" |
| 103 | " .set reorder \n" | 117 | " .set reorder \n" |
| 104 | " .set noat \n" | 118 | " .set noat \n" |
| 105 | #ifdef CONFIG_CPU_MIPSR2 | 119 | #ifdef CONFIG_MIPS_MT_SMTC |
| 120 | " mfc0 \\result, $2, 1 \n" | ||
| 121 | " ori $1, \\result, 0x400 \n" | ||
| 122 | " .set noreorder \n" | ||
| 123 | " mtc0 $1, $2, 1 \n" | ||
| 124 | " andi \\result, \\result, 0x400 \n" | ||
| 125 | #elif defined(CONFIG_CPU_MIPSR2) | ||
| 106 | " di \\result \n" | 126 | " di \\result \n" |
| 107 | " andi \\result, 1 \n" | 127 | " andi \\result, 1 \n" |
| 108 | #else | 128 | #else |
| @@ -128,7 +148,14 @@ __asm__ ( | |||
| 128 | " .set push \n" | 148 | " .set push \n" |
| 129 | " .set noreorder \n" | 149 | " .set noreorder \n" |
| 130 | " .set noat \n" | 150 | " .set noat \n" |
| 131 | #if defined(CONFIG_CPU_MIPSR2) && defined(CONFIG_IRQ_CPU) | 151 | #ifdef CONFIG_MIPS_MT_SMTC |
| 152 | "mfc0 $1, $2, 1 \n" | ||
| 153 | "andi \\flags, 0x400 \n" | ||
| 154 | "ori $1, 0x400 \n" | ||
| 155 | "xori $1, 0x400 \n" | ||
| 156 | "or \\flags, $1 \n" | ||
| 157 | "mtc0 \\flags, $2, 1 \n" | ||
| 158 | #elif defined(CONFIG_CPU_MIPSR2) && defined(CONFIG_IRQ_CPU) | ||
| 132 | /* | 159 | /* |
| 133 | * Slow, but doesn't suffer from a relativly unlikely race | 160 | * Slow, but doesn't suffer from a relativly unlikely race |
| 134 | * condition we're having since days 1. | 161 | * condition we're having since days 1. |
| @@ -167,11 +194,29 @@ do { \ | |||
| 167 | : "memory"); \ | 194 | : "memory"); \ |
| 168 | } while(0) | 195 | } while(0) |
| 169 | 196 | ||
| 170 | #define irqs_disabled() \ | 197 | static inline int irqs_disabled(void) |
| 171 | ({ \ | 198 | { |
| 172 | unsigned long flags; \ | 199 | #ifdef CONFIG_MIPS_MT_SMTC |
| 173 | local_save_flags(flags); \ | 200 | /* |
| 174 | !(flags & 1); \ | 201 | * SMTC model uses TCStatus.IXMT to disable interrupts for a thread/CPU |
| 175 | }) | 202 | */ |
| 203 | unsigned long __result; | ||
| 204 | |||
| 205 | __asm__ __volatile__( | ||
| 206 | " .set noreorder \n" | ||
| 207 | " mfc0 %0, $2, 1 \n" | ||
| 208 | " andi %0, 0x400 \n" | ||
| 209 | " slt %0, $0, %0 \n" | ||
| 210 | " .set reorder \n" | ||
| 211 | : "=r" (__result)); | ||
| 212 | |||
| 213 | return __result; | ||
| 214 | #else | ||
| 215 | unsigned long flags; | ||
| 216 | local_save_flags(flags); | ||
| 217 | |||
| 218 | return !(flags & 1); | ||
| 219 | #endif | ||
| 220 | } | ||
| 176 | 221 | ||
| 177 | #endif /* _ASM_INTERRUPT_H */ | 222 | #endif /* _ASM_INTERRUPT_H */ |
diff --git a/include/asm-mips/irq.h b/include/asm-mips/irq.h index 8a342ccb34..dde677f02b 100644 --- a/include/asm-mips/irq.h +++ b/include/asm-mips/irq.h | |||
| @@ -11,6 +11,9 @@ | |||
| 11 | 11 | ||
| 12 | #include <linux/config.h> | 12 | #include <linux/config.h> |
| 13 | #include <linux/linkage.h> | 13 | #include <linux/linkage.h> |
| 14 | |||
| 15 | #include <asm/mipsmtregs.h> | ||
| 16 | |||
| 14 | #include <irq.h> | 17 | #include <irq.h> |
| 15 | 18 | ||
| 16 | #ifdef CONFIG_I8259 | 19 | #ifdef CONFIG_I8259 |
| @@ -26,6 +29,23 @@ struct pt_regs; | |||
| 26 | 29 | ||
| 27 | extern asmlinkage unsigned int do_IRQ(unsigned int irq, struct pt_regs *regs); | 30 | extern asmlinkage unsigned int do_IRQ(unsigned int irq, struct pt_regs *regs); |
| 28 | 31 | ||
| 32 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 33 | /* | ||
| 34 | * Clear interrupt mask handling "backstop" if irq_hwmask | ||
| 35 | * entry so indicates. This implies that the ack() or end() | ||
| 36 | * functions will take over re-enabling the low-level mask. | ||
| 37 | * Otherwise it will be done on return from exception. | ||
| 38 | */ | ||
| 39 | #define __DO_IRQ_SMTC_HOOK() \ | ||
| 40 | do { \ | ||
| 41 | if (irq_hwmask[irq] & 0x0000ff00) \ | ||
| 42 | write_c0_tccontext(read_c0_tccontext() & \ | ||
| 43 | ~(irq_hwmask[irq] & 0x0000ff00)); \ | ||
| 44 | } while (0) | ||
| 45 | #else | ||
| 46 | #define __DO_IRQ_SMTC_HOOK() do { } while (0) | ||
| 47 | #endif | ||
| 48 | |||
| 29 | #ifdef CONFIG_PREEMPT | 49 | #ifdef CONFIG_PREEMPT |
| 30 | 50 | ||
| 31 | /* | 51 | /* |
| @@ -39,6 +59,7 @@ extern asmlinkage unsigned int do_IRQ(unsigned int irq, struct pt_regs *regs); | |||
| 39 | #define do_IRQ(irq, regs) \ | 59 | #define do_IRQ(irq, regs) \ |
| 40 | do { \ | 60 | do { \ |
| 41 | irq_enter(); \ | 61 | irq_enter(); \ |
| 62 | __DO_IRQ_SMTC_HOOK(); \ | ||
| 42 | __do_IRQ((irq), (regs)); \ | 63 | __do_IRQ((irq), (regs)); \ |
| 43 | irq_exit(); \ | 64 | irq_exit(); \ |
| 44 | } while (0) | 65 | } while (0) |
| @@ -46,5 +67,14 @@ do { \ | |||
| 46 | #endif | 67 | #endif |
| 47 | 68 | ||
| 48 | extern void arch_init_irq(void); | 69 | extern void arch_init_irq(void); |
| 70 | extern void spurious_interrupt(struct pt_regs *regs); | ||
| 71 | |||
| 72 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 73 | struct irqaction; | ||
| 74 | |||
| 75 | extern unsigned long irq_hwmask[]; | ||
| 76 | extern int setup_irq_smtc(unsigned int irq, struct irqaction * new, | ||
| 77 | unsigned long hwmask); | ||
| 78 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 49 | 79 | ||
| 50 | #endif /* _ASM_IRQ_H */ | 80 | #endif /* _ASM_IRQ_H */ |
diff --git a/include/asm-mips/kspd.h b/include/asm-mips/kspd.h new file mode 100644 index 0000000000..4e9e724c89 --- /dev/null +++ b/include/asm-mips/kspd.h | |||
| @@ -0,0 +1,36 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2005 MIPS Technologies, Inc. All rights reserved. | ||
| 3 | * | ||
| 4 | * This program is free software; you can distribute it and/or modify it | ||
| 5 | * under the terms of the GNU General Public License (Version 2) as | ||
| 6 | * published by the Free Software Foundation. | ||
| 7 | * | ||
| 8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
| 9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
| 11 | * for more details. | ||
| 12 | * | ||
| 13 | * You should have received a copy of the GNU General Public License along | ||
| 14 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 15 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
| 16 | * | ||
| 17 | */ | ||
| 18 | |||
| 19 | #ifndef _ASM_KSPD_H | ||
| 20 | #define _ASM_KSPD_H | ||
| 21 | |||
| 22 | struct kspd_notifications { | ||
| 23 | void (*kspd_sp_exit)(int sp_id); | ||
| 24 | |||
| 25 | struct list_head list; | ||
| 26 | }; | ||
| 27 | |||
| 28 | #ifdef CONFIG_MIPS_APSP_KSPD | ||
| 29 | extern void kspd_notify(struct kspd_notifications *notify); | ||
| 30 | #else | ||
| 31 | static inline void kspd_notify(struct kspd_notifications *notify) | ||
| 32 | { | ||
| 33 | } | ||
| 34 | #endif | ||
| 35 | |||
| 36 | #endif | ||
diff --git a/include/asm-mips/mach-generic/ide.h b/include/asm-mips/mach-generic/ide.h index 550979a9ea..e331535950 100644 --- a/include/asm-mips/mach-generic/ide.h +++ b/include/asm-mips/mach-generic/ide.h | |||
| @@ -104,65 +104,107 @@ static __inline__ unsigned long ide_default_io_base(int index) | |||
| 104 | #endif | 104 | #endif |
| 105 | 105 | ||
| 106 | /* MIPS port and memory-mapped I/O string operations. */ | 106 | /* MIPS port and memory-mapped I/O string operations. */ |
| 107 | static inline void __ide_flush_prologue(void) | ||
| 108 | { | ||
| 109 | #ifdef CONFIG_SMP | ||
| 110 | if (cpu_has_dc_aliases) | ||
| 111 | preempt_disable(); | ||
| 112 | #endif | ||
| 113 | } | ||
| 114 | |||
| 115 | static inline void __ide_flush_epilogue(void) | ||
| 116 | { | ||
| 117 | #ifdef CONFIG_SMP | ||
| 118 | if (cpu_has_dc_aliases) | ||
| 119 | preempt_enable(); | ||
| 120 | #endif | ||
| 121 | } | ||
| 107 | 122 | ||
| 108 | static inline void __ide_flush_dcache_range(unsigned long addr, unsigned long size) | 123 | static inline void __ide_flush_dcache_range(unsigned long addr, unsigned long size) |
| 109 | { | 124 | { |
| 110 | if (cpu_has_dc_aliases) { | 125 | if (cpu_has_dc_aliases) { |
| 111 | unsigned long end = addr + size; | 126 | unsigned long end = addr + size; |
| 112 | for (; addr < end; addr += PAGE_SIZE) | 127 | |
| 113 | flush_dcache_page(virt_to_page(addr)); | 128 | while (addr < end) { |
| 129 | local_flush_data_cache_page((void *)addr); | ||
| 130 | addr += PAGE_SIZE; | ||
| 131 | } | ||
| 114 | } | 132 | } |
| 115 | } | 133 | } |
| 116 | 134 | ||
| 135 | /* | ||
| 136 | * insw() and gang might be called with interrupts disabled, so we can't | ||
| 137 | * send IPIs for flushing due to the potencial of deadlocks, see the comment | ||
| 138 | * above smp_call_function() in arch/mips/kernel/smp.c. We work around the | ||
| 139 | * problem by disabling preemption so we know we actually perform the flush | ||
| 140 | * on the processor that actually has the lines to be flushed which hopefully | ||
| 141 | * is even better for performance anyway. | ||
| 142 | */ | ||
| 117 | static inline void __ide_insw(unsigned long port, void *addr, | 143 | static inline void __ide_insw(unsigned long port, void *addr, |
| 118 | unsigned int count) | 144 | unsigned int count) |
| 119 | { | 145 | { |
| 146 | __ide_flush_prologue(); | ||
| 120 | insw(port, addr, count); | 147 | insw(port, addr, count); |
| 121 | __ide_flush_dcache_range((unsigned long)addr, count * 2); | 148 | __ide_flush_dcache_range((unsigned long)addr, count * 2); |
| 149 | __ide_flush_epilogue(); | ||
| 122 | } | 150 | } |
| 123 | 151 | ||
| 124 | static inline void __ide_insl(unsigned long port, void *addr, unsigned int count) | 152 | static inline void __ide_insl(unsigned long port, void *addr, unsigned int count) |
| 125 | { | 153 | { |
| 154 | __ide_flush_prologue(); | ||
| 126 | insl(port, addr, count); | 155 | insl(port, addr, count); |
| 127 | __ide_flush_dcache_range((unsigned long)addr, count * 4); | 156 | __ide_flush_dcache_range((unsigned long)addr, count * 4); |
| 157 | __ide_flush_epilogue(); | ||
| 128 | } | 158 | } |
| 129 | 159 | ||
| 130 | static inline void __ide_outsw(unsigned long port, const void *addr, | 160 | static inline void __ide_outsw(unsigned long port, const void *addr, |
| 131 | unsigned long count) | 161 | unsigned long count) |
| 132 | { | 162 | { |
| 163 | __ide_flush_prologue(); | ||
| 133 | outsw(port, addr, count); | 164 | outsw(port, addr, count); |
| 134 | __ide_flush_dcache_range((unsigned long)addr, count * 2); | 165 | __ide_flush_dcache_range((unsigned long)addr, count * 2); |
| 166 | __ide_flush_epilogue(); | ||
| 135 | } | 167 | } |
| 136 | 168 | ||
| 137 | static inline void __ide_outsl(unsigned long port, const void *addr, | 169 | static inline void __ide_outsl(unsigned long port, const void *addr, |
| 138 | unsigned long count) | 170 | unsigned long count) |
| 139 | { | 171 | { |
| 172 | __ide_flush_prologue(); | ||
| 140 | outsl(port, addr, count); | 173 | outsl(port, addr, count); |
| 141 | __ide_flush_dcache_range((unsigned long)addr, count * 4); | 174 | __ide_flush_dcache_range((unsigned long)addr, count * 4); |
| 175 | __ide_flush_epilogue(); | ||
| 142 | } | 176 | } |
| 143 | 177 | ||
| 144 | static inline void __ide_mm_insw(void __iomem *port, void *addr, u32 count) | 178 | static inline void __ide_mm_insw(void __iomem *port, void *addr, u32 count) |
| 145 | { | 179 | { |
| 180 | __ide_flush_prologue(); | ||
| 146 | readsw(port, addr, count); | 181 | readsw(port, addr, count); |
| 147 | __ide_flush_dcache_range((unsigned long)addr, count * 2); | 182 | __ide_flush_dcache_range((unsigned long)addr, count * 2); |
| 183 | __ide_flush_epilogue(); | ||
| 148 | } | 184 | } |
| 149 | 185 | ||
| 150 | static inline void __ide_mm_insl(void __iomem *port, void *addr, u32 count) | 186 | static inline void __ide_mm_insl(void __iomem *port, void *addr, u32 count) |
| 151 | { | 187 | { |
| 188 | __ide_flush_prologue(); | ||
| 152 | readsl(port, addr, count); | 189 | readsl(port, addr, count); |
| 153 | __ide_flush_dcache_range((unsigned long)addr, count * 4); | 190 | __ide_flush_dcache_range((unsigned long)addr, count * 4); |
| 191 | __ide_flush_epilogue(); | ||
| 154 | } | 192 | } |
| 155 | 193 | ||
| 156 | static inline void __ide_mm_outsw(void __iomem *port, void *addr, u32 count) | 194 | static inline void __ide_mm_outsw(void __iomem *port, void *addr, u32 count) |
| 157 | { | 195 | { |
| 196 | __ide_flush_prologue(); | ||
| 158 | writesw(port, addr, count); | 197 | writesw(port, addr, count); |
| 159 | __ide_flush_dcache_range((unsigned long)addr, count * 2); | 198 | __ide_flush_dcache_range((unsigned long)addr, count * 2); |
| 199 | __ide_flush_epilogue(); | ||
| 160 | } | 200 | } |
| 161 | 201 | ||
| 162 | static inline void __ide_mm_outsl(void __iomem * port, void *addr, u32 count) | 202 | static inline void __ide_mm_outsl(void __iomem * port, void *addr, u32 count) |
| 163 | { | 203 | { |
| 204 | __ide_flush_prologue(); | ||
| 164 | writesl(port, addr, count); | 205 | writesl(port, addr, count); |
| 165 | __ide_flush_dcache_range((unsigned long)addr, count * 4); | 206 | __ide_flush_dcache_range((unsigned long)addr, count * 4); |
| 207 | __ide_flush_epilogue(); | ||
| 166 | } | 208 | } |
| 167 | 209 | ||
| 168 | /* ide_insw calls insw, not __ide_insw. Why? */ | 210 | /* ide_insw calls insw, not __ide_insw. Why? */ |
diff --git a/include/asm-mips/mach-jmr3927/ds1742.h b/include/asm-mips/mach-jmr3927/ds1742.h index cff6192d4b..8a8fef6d07 100644 --- a/include/asm-mips/mach-jmr3927/ds1742.h +++ b/include/asm-mips/mach-jmr3927/ds1742.h | |||
| @@ -3,14 +3,14 @@ | |||
| 3 | * License. See the file "COPYING" in the main directory of this archive | 3 | * License. See the file "COPYING" in the main directory of this archive |
| 4 | * for more details. | 4 | * for more details. |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2003 by Ralf Baechle | 6 | * Copyright (C) 2003, 06 by Ralf Baechle |
| 7 | */ | 7 | */ |
| 8 | #ifndef __ASM_MACH_JMR3927_DS1742_H | 8 | #ifndef __ASM_MACH_JMR3927_DS1742_H |
| 9 | #define __ASM_MACH_JMR3927_DS1742_H | 9 | #define __ASM_MACH_JMR3927_DS1742_H |
| 10 | 10 | ||
| 11 | #include <asm/jmr3927/jmr3927.h> | 11 | #include <asm/jmr3927/jmr3927.h> |
| 12 | 12 | ||
| 13 | #define rtc_read(reg) (jmr3927_nvram_in(addr)) | 13 | #define rtc_read(reg) (jmr3927_nvram_in(reg)) |
| 14 | #define rtc_write(data, reg) (jmr3927_nvram_out((data),(reg))) | 14 | #define rtc_write(data, reg) (jmr3927_nvram_out((data),(reg))) |
| 15 | 15 | ||
| 16 | #endif /* __ASM_MACH_JMR3927_DS1742_H */ | 16 | #endif /* __ASM_MACH_JMR3927_DS1742_H */ |
diff --git a/include/asm-mips/mach-mips/param.h b/include/asm-mips/mach-mips/param.h new file mode 100644 index 0000000000..805ef6d27d --- /dev/null +++ b/include/asm-mips/mach-mips/param.h | |||
| @@ -0,0 +1,13 @@ | |||
| 1 | /* | ||
| 2 | * This file is subject to the terms and conditions of the GNU General Public | ||
| 3 | * License. See the file "COPYING" in the main directory of this archive | ||
| 4 | * for more details. | ||
| 5 | * | ||
| 6 | * Copyright (C) 2003 by Ralf Baechle | ||
| 7 | */ | ||
| 8 | #ifndef __ASM_MACH_MIPS_PARAM_H | ||
| 9 | #define __ASM_MACH_MIPS_PARAM_H | ||
| 10 | |||
| 11 | #define HZ 100 /* Internal kernel timer frequency */ | ||
| 12 | |||
| 13 | #endif /* __ASM_MACH_MIPS_PARAM_H */ | ||
diff --git a/include/asm-mips/marvell.h b/include/asm-mips/marvell.h index 9225b3397a..6bb2125bb0 100644 --- a/include/asm-mips/marvell.h +++ b/include/asm-mips/marvell.h | |||
| @@ -53,4 +53,6 @@ struct mv_pci_controller { | |||
| 53 | unsigned long config_vreg; | 53 | unsigned long config_vreg; |
| 54 | }; | 54 | }; |
| 55 | 55 | ||
| 56 | extern void ll_mv64340_irq(struct pt_regs *regs); | ||
| 57 | |||
| 56 | #endif /* __ASM_MIPS_MARVELL_H */ | 58 | #endif /* __ASM_MIPS_MARVELL_H */ |
diff --git a/include/asm-mips/mips-boards/atlas.h b/include/asm-mips/mips-boards/atlas.h index 0998151fb3..a8ae12d120 100644 --- a/include/asm-mips/mips-boards/atlas.h +++ b/include/asm-mips/mips-boards/atlas.h | |||
| @@ -33,13 +33,29 @@ | |||
| 33 | #define ATLAS_RTC_ADR_REG 0x1f000800 | 33 | #define ATLAS_RTC_ADR_REG 0x1f000800 |
| 34 | #define ATLAS_RTC_DAT_REG 0x1f000808 | 34 | #define ATLAS_RTC_DAT_REG 0x1f000808 |
| 35 | 35 | ||
| 36 | |||
| 37 | /* | 36 | /* |
| 38 | * Atlas interrupt controller register base. | 37 | * Atlas interrupt controller register base. |
| 39 | */ | 38 | */ |
| 40 | #define ATLAS_ICTRL_REGS_BASE 0x1f000000 | 39 | #define ATLAS_ICTRL_REGS_BASE 0x1f000000 |
| 41 | 40 | ||
| 42 | /* | 41 | /* |
| 42 | * Atlas registers are memory mapped on 64-bit aligned boundaries and | ||
| 43 | * only word access are allowed. | ||
| 44 | */ | ||
| 45 | struct atlas_ictrl_regs { | ||
| 46 | volatile unsigned int intraw; | ||
| 47 | int dummy1; | ||
| 48 | volatile unsigned int intseten; | ||
| 49 | int dummy2; | ||
| 50 | volatile unsigned int intrsten; | ||
| 51 | int dummy3; | ||
| 52 | volatile unsigned int intenable; | ||
| 53 | int dummy4; | ||
| 54 | volatile unsigned int intstatus; | ||
| 55 | int dummy5; | ||
| 56 | }; | ||
| 57 | |||
| 58 | /* | ||
| 43 | * Atlas UART register base. | 59 | * Atlas UART register base. |
| 44 | */ | 60 | */ |
| 45 | #define ATLAS_UART_REGS_BASE 0x1f000900 | 61 | #define ATLAS_UART_REGS_BASE 0x1f000900 |
diff --git a/include/asm-mips/mips-boards/atlasint.h b/include/asm-mips/mips-boards/atlasint.h index bba35c183d..fd7ebc54fa 100644 --- a/include/asm-mips/mips-boards/atlasint.h +++ b/include/asm-mips/mips-boards/atlasint.h | |||
| @@ -62,23 +62,4 @@ | |||
| 62 | #define ATLASINT_RES31 (ATLASINT_BASE+31) | 62 | #define ATLASINT_RES31 (ATLASINT_BASE+31) |
| 63 | #define ATLASINT_END (ATLASINT_BASE+31) | 63 | #define ATLASINT_END (ATLASINT_BASE+31) |
| 64 | 64 | ||
| 65 | /* | ||
| 66 | * Atlas registers are memory mapped on 64-bit aligned boundaries and | ||
| 67 | * only word access are allowed. | ||
| 68 | */ | ||
| 69 | struct atlas_ictrl_regs { | ||
| 70 | volatile unsigned int intraw; | ||
| 71 | int dummy1; | ||
| 72 | volatile unsigned int intseten; | ||
| 73 | int dummy2; | ||
| 74 | volatile unsigned int intrsten; | ||
| 75 | int dummy3; | ||
| 76 | volatile unsigned int intenable; | ||
| 77 | int dummy4; | ||
| 78 | volatile unsigned int intstatus; | ||
| 79 | int dummy5; | ||
| 80 | }; | ||
| 81 | |||
| 82 | extern void atlasint_init(void); | ||
| 83 | |||
| 84 | #endif /* !(_MIPS_ATLASINT_H) */ | 65 | #endif /* !(_MIPS_ATLASINT_H) */ |
diff --git a/include/asm-mips/mips-boards/generic.h b/include/asm-mips/mips-boards/generic.h index 25b6ffc266..fa8b913cc3 100644 --- a/include/asm-mips/mips-boards/generic.h +++ b/include/asm-mips/mips-boards/generic.h | |||
| @@ -67,6 +67,7 @@ | |||
| 67 | #define MIPS_REVISION_CORID_CORE_FPGA2 7 | 67 | #define MIPS_REVISION_CORID_CORE_FPGA2 7 |
| 68 | #define MIPS_REVISION_CORID_CORE_FPGAR2 8 | 68 | #define MIPS_REVISION_CORID_CORE_FPGAR2 8 |
| 69 | #define MIPS_REVISION_CORID_CORE_FPGA3 9 | 69 | #define MIPS_REVISION_CORID_CORE_FPGA3 9 |
| 70 | #define MIPS_REVISION_CORID_CORE_24K 10 | ||
| 70 | 71 | ||
| 71 | /**** Artificial corid defines ****/ | 72 | /**** Artificial corid defines ****/ |
| 72 | /* | 73 | /* |
diff --git a/include/asm-mips/mips_mt.h b/include/asm-mips/mips_mt.h new file mode 100644 index 0000000000..c31a312b97 --- /dev/null +++ b/include/asm-mips/mips_mt.h | |||
| @@ -0,0 +1,15 @@ | |||
| 1 | /* | ||
| 2 | * Definitions and decalrations for MIPS MT support | ||
| 3 | * that are common between SMTC, VSMP, and/or AP/SP | ||
| 4 | * kernel models. | ||
| 5 | */ | ||
| 6 | #ifndef __ASM_MIPS_MT_H | ||
| 7 | #define __ASM_MIPS_MT_H | ||
| 8 | |||
| 9 | extern cpumask_t mt_fpu_cpumask; | ||
| 10 | extern unsigned long mt_fpemul_threshold; | ||
| 11 | |||
| 12 | extern void mips_mt_regdump(unsigned long previous_mvpcontrol_value); | ||
| 13 | extern void mips_mt_set_cpuoptions(void); | ||
| 14 | |||
| 15 | #endif /* __ASM_MIPS_MT_H */ | ||
diff --git a/include/asm-mips/mipsmtregs.h b/include/asm-mips/mipsmtregs.h index a669c0702c..f637ce7075 100644 --- a/include/asm-mips/mipsmtregs.h +++ b/include/asm-mips/mipsmtregs.h | |||
| @@ -165,7 +165,7 @@ | |||
| 165 | 165 | ||
| 166 | #ifndef __ASSEMBLY__ | 166 | #ifndef __ASSEMBLY__ |
| 167 | 167 | ||
| 168 | extern void mips_mt_regdump(void); | 168 | extern void mips_mt_regdump(unsigned long previous_mvpcontrol_value); |
| 169 | 169 | ||
| 170 | static inline unsigned int dvpe(void) | 170 | static inline unsigned int dvpe(void) |
| 171 | { | 171 | { |
| @@ -234,7 +234,7 @@ static inline void __raw_emt(void) | |||
| 234 | __asm__ __volatile__( | 234 | __asm__ __volatile__( |
| 235 | " .set noreorder \n" | 235 | " .set noreorder \n" |
| 236 | " .set mips32r2 \n" | 236 | " .set mips32r2 \n" |
| 237 | " emt \n" | 237 | " .word 0x41600be1 # emt \n" |
| 238 | " ehb \n" | 238 | " ehb \n" |
| 239 | " .set mips0 \n" | 239 | " .set mips0 \n" |
| 240 | " .set reorder"); | 240 | " .set reorder"); |
| @@ -282,8 +282,11 @@ static inline void ehb(void) | |||
| 282 | \ | 282 | \ |
| 283 | __asm__ __volatile__( \ | 283 | __asm__ __volatile__( \ |
| 284 | " .set push \n" \ | 284 | " .set push \n" \ |
| 285 | " .set noat \n" \ | ||
| 285 | " .set mips32r2 \n" \ | 286 | " .set mips32r2 \n" \ |
| 286 | " mftgpr %0," #rt " \n" \ | 287 | " # mftgpr $1," #rt " \n" \ |
| 288 | " .word 0x41000820 | (" #rt " << 16) \n" \ | ||
| 289 | " move %0, $1 \n" \ | ||
| 287 | " .set pop \n" \ | 290 | " .set pop \n" \ |
| 288 | : "=r" (__res)); \ | 291 | : "=r" (__res)); \ |
| 289 | \ | 292 | \ |
| @@ -295,9 +298,7 @@ static inline void ehb(void) | |||
| 295 | unsigned long __res; \ | 298 | unsigned long __res; \ |
| 296 | \ | 299 | \ |
| 297 | __asm__ __volatile__( \ | 300 | __asm__ __volatile__( \ |
| 298 | ".set noat\n\t" \ | 301 | " mftr %0, " #rt ", " #u ", " #sel " \n" \ |
| 299 | "mftr\t%0, " #rt ", " #u ", " #sel "\n\t" \ | ||
| 300 | ".set at\n\t" \ | ||
| 301 | : "=r" (__res)); \ | 302 | : "=r" (__res)); \ |
| 302 | \ | 303 | \ |
| 303 | __res; \ | 304 | __res; \ |
| @@ -364,6 +365,9 @@ do { \ | |||
| 364 | #define read_vpe_c0_ebase() mftc0(15,1) | 365 | #define read_vpe_c0_ebase() mftc0(15,1) |
| 365 | #define write_vpe_c0_ebase(val) mttc0(15, 1, val) | 366 | #define write_vpe_c0_ebase(val) mttc0(15, 1, val) |
| 366 | #define write_vpe_c0_compare(val) mttc0(11, 0, val) | 367 | #define write_vpe_c0_compare(val) mttc0(11, 0, val) |
| 368 | #define read_vpe_c0_badvaddr() mftc0(8, 0) | ||
| 369 | #define read_vpe_c0_epc() mftc0(14, 0) | ||
| 370 | #define write_vpe_c0_epc(val) mttc0(14, 0, val) | ||
| 367 | 371 | ||
| 368 | 372 | ||
| 369 | /* TC */ | 373 | /* TC */ |
diff --git a/include/asm-mips/mipsregs.h b/include/asm-mips/mipsregs.h index 035ba0a9b0..5af7517fce 100644 --- a/include/asm-mips/mipsregs.h +++ b/include/asm-mips/mipsregs.h | |||
| @@ -291,7 +291,7 @@ | |||
| 291 | #define ST0_DL (_ULCAST_(1) << 24) | 291 | #define ST0_DL (_ULCAST_(1) << 24) |
| 292 | 292 | ||
| 293 | /* | 293 | /* |
| 294 | * Enable the MIPS DSP ASE | 294 | * Enable the MIPS MDMX and DSP ASEs |
| 295 | */ | 295 | */ |
| 296 | #define ST0_MX 0x01000000 | 296 | #define ST0_MX 0x01000000 |
| 297 | 297 | ||
| @@ -836,6 +836,9 @@ do { \ | |||
| 836 | #define read_c0_cache() __read_32bit_c0_register($7, 0) /* TX39xx */ | 836 | #define read_c0_cache() __read_32bit_c0_register($7, 0) /* TX39xx */ |
| 837 | #define write_c0_cache(val) __write_32bit_c0_register($7, 0, val) | 837 | #define write_c0_cache(val) __write_32bit_c0_register($7, 0, val) |
| 838 | 838 | ||
| 839 | #define read_c0_badvaddr() __read_ulong_c0_register($8, 0) | ||
| 840 | #define write_c0_badvaddr(val) __write_ulong_c0_register($8, 0, val) | ||
| 841 | |||
| 839 | #define read_c0_count() __read_32bit_c0_register($9, 0) | 842 | #define read_c0_count() __read_32bit_c0_register($9, 0) |
| 840 | #define write_c0_count(val) __write_32bit_c0_register($9, 0, val) | 843 | #define write_c0_count(val) __write_32bit_c0_register($9, 0, val) |
| 841 | 844 | ||
| @@ -858,7 +861,19 @@ do { \ | |||
| 858 | #define write_c0_compare3(val) __write_32bit_c0_register($11, 7, val) | 861 | #define write_c0_compare3(val) __write_32bit_c0_register($11, 7, val) |
| 859 | 862 | ||
| 860 | #define read_c0_status() __read_32bit_c0_register($12, 0) | 863 | #define read_c0_status() __read_32bit_c0_register($12, 0) |
| 864 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 865 | #define write_c0_status(val) \ | ||
| 866 | do { \ | ||
| 867 | __write_32bit_c0_register($12, 0, val); \ | ||
| 868 | __ehb(); \ | ||
| 869 | } while (0) | ||
| 870 | #else | ||
| 871 | /* | ||
| 872 | * Legacy non-SMTC code, which may be hazardous | ||
| 873 | * but which might not support EHB | ||
| 874 | */ | ||
| 861 | #define write_c0_status(val) __write_32bit_c0_register($12, 0, val) | 875 | #define write_c0_status(val) __write_32bit_c0_register($12, 0, val) |
| 876 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 862 | 877 | ||
| 863 | #define read_c0_cause() __read_32bit_c0_register($13, 0) | 878 | #define read_c0_cause() __read_32bit_c0_register($13, 0) |
| 864 | #define write_c0_cause(val) __write_32bit_c0_register($13, 0, val) | 879 | #define write_c0_cause(val) __write_32bit_c0_register($13, 0, val) |
| @@ -1001,6 +1016,9 @@ do { \ | |||
| 1001 | #define read_c0_taglo() __read_32bit_c0_register($28, 0) | 1016 | #define read_c0_taglo() __read_32bit_c0_register($28, 0) |
| 1002 | #define write_c0_taglo(val) __write_32bit_c0_register($28, 0, val) | 1017 | #define write_c0_taglo(val) __write_32bit_c0_register($28, 0, val) |
| 1003 | 1018 | ||
| 1019 | #define read_c0_dtaglo() __read_32bit_c0_register($28, 2) | ||
| 1020 | #define write_c0_dtaglo(val) __write_32bit_c0_register($28, 2, val) | ||
| 1021 | |||
| 1004 | #define read_c0_taghi() __read_32bit_c0_register($29, 0) | 1022 | #define read_c0_taghi() __read_32bit_c0_register($29, 0) |
| 1005 | #define write_c0_taghi(val) __write_32bit_c0_register($29, 0, val) | 1023 | #define write_c0_taghi(val) __write_32bit_c0_register($29, 0, val) |
| 1006 | 1024 | ||
| @@ -1354,15 +1372,119 @@ static inline void tlb_write_random(void) | |||
| 1354 | /* | 1372 | /* |
| 1355 | * Manipulate bits in a c0 register. | 1373 | * Manipulate bits in a c0 register. |
| 1356 | */ | 1374 | */ |
| 1375 | #ifndef CONFIG_MIPS_MT_SMTC | ||
| 1376 | /* | ||
| 1377 | * SMTC Linux requires shutting-down microthread scheduling | ||
| 1378 | * during CP0 register read-modify-write sequences. | ||
| 1379 | */ | ||
| 1380 | #define __BUILD_SET_C0(name) \ | ||
| 1381 | static inline unsigned int \ | ||
| 1382 | set_c0_##name(unsigned int set) \ | ||
| 1383 | { \ | ||
| 1384 | unsigned int res; \ | ||
| 1385 | \ | ||
| 1386 | res = read_c0_##name(); \ | ||
| 1387 | res |= set; \ | ||
| 1388 | write_c0_##name(res); \ | ||
| 1389 | \ | ||
| 1390 | return res; \ | ||
| 1391 | } \ | ||
| 1392 | \ | ||
| 1393 | static inline unsigned int \ | ||
| 1394 | clear_c0_##name(unsigned int clear) \ | ||
| 1395 | { \ | ||
| 1396 | unsigned int res; \ | ||
| 1397 | \ | ||
| 1398 | res = read_c0_##name(); \ | ||
| 1399 | res &= ~clear; \ | ||
| 1400 | write_c0_##name(res); \ | ||
| 1401 | \ | ||
| 1402 | return res; \ | ||
| 1403 | } \ | ||
| 1404 | \ | ||
| 1405 | static inline unsigned int \ | ||
| 1406 | change_c0_##name(unsigned int change, unsigned int new) \ | ||
| 1407 | { \ | ||
| 1408 | unsigned int res; \ | ||
| 1409 | \ | ||
| 1410 | res = read_c0_##name(); \ | ||
| 1411 | res &= ~change; \ | ||
| 1412 | res |= (new & change); \ | ||
| 1413 | write_c0_##name(res); \ | ||
| 1414 | \ | ||
| 1415 | return res; \ | ||
| 1416 | } | ||
| 1417 | |||
| 1418 | #else /* SMTC versions that manage MT scheduling */ | ||
| 1419 | |||
| 1420 | #include <asm/interrupt.h> | ||
| 1421 | |||
| 1422 | /* | ||
| 1423 | * This is a duplicate of dmt() in mipsmtregs.h to avoid problems with | ||
| 1424 | * header file recursion. | ||
| 1425 | */ | ||
| 1426 | static inline unsigned int __dmt(void) | ||
| 1427 | { | ||
| 1428 | int res; | ||
| 1429 | |||
| 1430 | __asm__ __volatile__( | ||
| 1431 | " .set push \n" | ||
| 1432 | " .set mips32r2 \n" | ||
| 1433 | " .set noat \n" | ||
| 1434 | " .word 0x41610BC1 # dmt $1 \n" | ||
| 1435 | " ehb \n" | ||
| 1436 | " move %0, $1 \n" | ||
| 1437 | " .set pop \n" | ||
| 1438 | : "=r" (res)); | ||
| 1439 | |||
| 1440 | instruction_hazard(); | ||
| 1441 | |||
| 1442 | return res; | ||
| 1443 | } | ||
| 1444 | |||
| 1445 | #define __VPECONTROL_TE_SHIFT 15 | ||
| 1446 | #define __VPECONTROL_TE (1UL << __VPECONTROL_TE_SHIFT) | ||
| 1447 | |||
| 1448 | #define __EMT_ENABLE __VPECONTROL_TE | ||
| 1449 | |||
| 1450 | static inline void __emt(unsigned int previous) | ||
| 1451 | { | ||
| 1452 | if ((previous & __EMT_ENABLE)) | ||
| 1453 | __asm__ __volatile__( | ||
| 1454 | " .set noreorder \n" | ||
| 1455 | " .set mips32r2 \n" | ||
| 1456 | " .word 0x41600be1 # emt \n" | ||
| 1457 | " ehb \n" | ||
| 1458 | " .set mips0 \n" | ||
| 1459 | " .set reorder \n"); | ||
| 1460 | } | ||
| 1461 | |||
| 1462 | static inline void __ehb(void) | ||
| 1463 | { | ||
| 1464 | __asm__ __volatile__( | ||
| 1465 | " ehb \n"); | ||
| 1466 | } | ||
| 1467 | |||
| 1468 | /* | ||
| 1469 | * Note that local_irq_save/restore affect TC-specific IXMT state, | ||
| 1470 | * not Status.IE as in non-SMTC kernel. | ||
| 1471 | */ | ||
| 1472 | |||
| 1357 | #define __BUILD_SET_C0(name) \ | 1473 | #define __BUILD_SET_C0(name) \ |
| 1358 | static inline unsigned int \ | 1474 | static inline unsigned int \ |
| 1359 | set_c0_##name(unsigned int set) \ | 1475 | set_c0_##name(unsigned int set) \ |
| 1360 | { \ | 1476 | { \ |
| 1361 | unsigned int res; \ | 1477 | unsigned int res; \ |
| 1478 | unsigned int omt; \ | ||
| 1479 | unsigned int flags; \ | ||
| 1362 | \ | 1480 | \ |
| 1481 | local_irq_save(flags); \ | ||
| 1482 | omt = __dmt(); \ | ||
| 1363 | res = read_c0_##name(); \ | 1483 | res = read_c0_##name(); \ |
| 1364 | res |= set; \ | 1484 | res |= set; \ |
| 1365 | write_c0_##name(res); \ | 1485 | write_c0_##name(res); \ |
| 1486 | __emt(omt); \ | ||
| 1487 | local_irq_restore(flags); \ | ||
| 1366 | \ | 1488 | \ |
| 1367 | return res; \ | 1489 | return res; \ |
| 1368 | } \ | 1490 | } \ |
| @@ -1371,10 +1493,16 @@ static inline unsigned int \ | |||
| 1371 | clear_c0_##name(unsigned int clear) \ | 1493 | clear_c0_##name(unsigned int clear) \ |
| 1372 | { \ | 1494 | { \ |
| 1373 | unsigned int res; \ | 1495 | unsigned int res; \ |
| 1496 | unsigned int omt; \ | ||
| 1497 | unsigned int flags; \ | ||
| 1374 | \ | 1498 | \ |
| 1499 | local_irq_save(flags); \ | ||
| 1500 | omt = __dmt(); \ | ||
| 1375 | res = read_c0_##name(); \ | 1501 | res = read_c0_##name(); \ |
| 1376 | res &= ~clear; \ | 1502 | res &= ~clear; \ |
| 1377 | write_c0_##name(res); \ | 1503 | write_c0_##name(res); \ |
| 1504 | __emt(omt); \ | ||
| 1505 | local_irq_restore(flags); \ | ||
| 1378 | \ | 1506 | \ |
| 1379 | return res; \ | 1507 | return res; \ |
| 1380 | } \ | 1508 | } \ |
| @@ -1383,14 +1511,22 @@ static inline unsigned int \ | |||
| 1383 | change_c0_##name(unsigned int change, unsigned int new) \ | 1511 | change_c0_##name(unsigned int change, unsigned int new) \ |
| 1384 | { \ | 1512 | { \ |
| 1385 | unsigned int res; \ | 1513 | unsigned int res; \ |
| 1514 | unsigned int omt; \ | ||
| 1515 | unsigned int flags; \ | ||
| 1386 | \ | 1516 | \ |
| 1517 | local_irq_save(flags); \ | ||
| 1518 | \ | ||
| 1519 | omt = __dmt(); \ | ||
| 1387 | res = read_c0_##name(); \ | 1520 | res = read_c0_##name(); \ |
| 1388 | res &= ~change; \ | 1521 | res &= ~change; \ |
| 1389 | res |= (new & change); \ | 1522 | res |= (new & change); \ |
| 1390 | write_c0_##name(res); \ | 1523 | write_c0_##name(res); \ |
| 1524 | __emt(omt); \ | ||
| 1525 | local_irq_restore(flags); \ | ||
| 1391 | \ | 1526 | \ |
| 1392 | return res; \ | 1527 | return res; \ |
| 1393 | } | 1528 | } |
| 1529 | #endif | ||
| 1394 | 1530 | ||
| 1395 | __BUILD_SET_C0(status) | 1531 | __BUILD_SET_C0(status) |
| 1396 | __BUILD_SET_C0(cause) | 1532 | __BUILD_SET_C0(cause) |
diff --git a/include/asm-mips/mmu_context.h b/include/asm-mips/mmu_context.h index 61cf225881..6e09f4c872 100644 --- a/include/asm-mips/mmu_context.h +++ b/include/asm-mips/mmu_context.h | |||
| @@ -17,6 +17,10 @@ | |||
| 17 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
| 18 | #include <asm/cacheflush.h> | 18 | #include <asm/cacheflush.h> |
| 19 | #include <asm/tlbflush.h> | 19 | #include <asm/tlbflush.h> |
| 20 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 21 | #include <asm/mipsmtregs.h> | ||
| 22 | #include <asm/smtc.h> | ||
| 23 | #endif /* SMTC */ | ||
| 20 | 24 | ||
| 21 | /* | 25 | /* |
| 22 | * For the fast tlb miss handlers, we keep a per cpu array of pointers | 26 | * For the fast tlb miss handlers, we keep a per cpu array of pointers |
| @@ -54,6 +58,14 @@ extern unsigned long pgd_current[]; | |||
| 54 | #define ASID_INC 0x1 | 58 | #define ASID_INC 0x1 |
| 55 | #define ASID_MASK 0xfff | 59 | #define ASID_MASK 0xfff |
| 56 | 60 | ||
| 61 | /* SMTC/34K debug hack - but maybe we'll keep it */ | ||
| 62 | #elif defined(CONFIG_MIPS_MT_SMTC) | ||
| 63 | |||
| 64 | #define ASID_INC 0x1 | ||
| 65 | extern unsigned long smtc_asid_mask; | ||
| 66 | #define ASID_MASK (smtc_asid_mask) | ||
| 67 | #define HW_ASID_MASK 0xff | ||
| 68 | /* End SMTC/34K debug hack */ | ||
| 57 | #else /* FIXME: not correct for R6000 */ | 69 | #else /* FIXME: not correct for R6000 */ |
| 58 | 70 | ||
| 59 | #define ASID_INC 0x1 | 71 | #define ASID_INC 0x1 |
| @@ -76,6 +88,8 @@ static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) | |||
| 76 | #define ASID_VERSION_MASK ((unsigned long)~(ASID_MASK|(ASID_MASK-1))) | 88 | #define ASID_VERSION_MASK ((unsigned long)~(ASID_MASK|(ASID_MASK-1))) |
| 77 | #define ASID_FIRST_VERSION ((unsigned long)(~ASID_VERSION_MASK) + 1) | 89 | #define ASID_FIRST_VERSION ((unsigned long)(~ASID_VERSION_MASK) + 1) |
| 78 | 90 | ||
| 91 | #ifndef CONFIG_MIPS_MT_SMTC | ||
| 92 | /* Normal, classic MIPS get_new_mmu_context */ | ||
| 79 | static inline void | 93 | static inline void |
| 80 | get_new_mmu_context(struct mm_struct *mm, unsigned long cpu) | 94 | get_new_mmu_context(struct mm_struct *mm, unsigned long cpu) |
| 81 | { | 95 | { |
| @@ -91,6 +105,12 @@ get_new_mmu_context(struct mm_struct *mm, unsigned long cpu) | |||
| 91 | cpu_context(cpu, mm) = asid_cache(cpu) = asid; | 105 | cpu_context(cpu, mm) = asid_cache(cpu) = asid; |
| 92 | } | 106 | } |
| 93 | 107 | ||
| 108 | #else /* CONFIG_MIPS_MT_SMTC */ | ||
| 109 | |||
| 110 | #define get_new_mmu_context(mm,cpu) smtc_get_new_mmu_context((mm),(cpu)) | ||
| 111 | |||
| 112 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 113 | |||
| 94 | /* | 114 | /* |
| 95 | * Initialize the context related info for a new mm_struct | 115 | * Initialize the context related info for a new mm_struct |
| 96 | * instance. | 116 | * instance. |
| @@ -111,14 +131,46 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, | |||
| 111 | { | 131 | { |
| 112 | unsigned int cpu = smp_processor_id(); | 132 | unsigned int cpu = smp_processor_id(); |
| 113 | unsigned long flags; | 133 | unsigned long flags; |
| 114 | 134 | #ifdef CONFIG_MIPS_MT_SMTC | |
| 135 | unsigned long oldasid; | ||
| 136 | unsigned long mtflags; | ||
| 137 | int mytlb = (smtc_status & SMTC_TLB_SHARED) ? 0 : cpu_data[cpu].vpe_id; | ||
| 115 | local_irq_save(flags); | 138 | local_irq_save(flags); |
| 139 | mtflags = dvpe(); | ||
| 140 | #else /* Not SMTC */ | ||
| 141 | local_irq_save(flags); | ||
| 142 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 116 | 143 | ||
| 117 | /* Check if our ASID is of an older version and thus invalid */ | 144 | /* Check if our ASID is of an older version and thus invalid */ |
| 118 | if ((cpu_context(cpu, next) ^ asid_cache(cpu)) & ASID_VERSION_MASK) | 145 | if ((cpu_context(cpu, next) ^ asid_cache(cpu)) & ASID_VERSION_MASK) |
| 119 | get_new_mmu_context(next, cpu); | 146 | get_new_mmu_context(next, cpu); |
| 120 | 147 | #ifdef CONFIG_MIPS_MT_SMTC | |
| 148 | /* | ||
| 149 | * If the EntryHi ASID being replaced happens to be | ||
| 150 | * the value flagged at ASID recycling time as having | ||
| 151 | * an extended life, clear the bit showing it being | ||
| 152 | * in use by this "CPU", and if that's the last bit, | ||
| 153 | * free up the ASID value for use and flush any old | ||
| 154 | * instances of it from the TLB. | ||
| 155 | */ | ||
| 156 | oldasid = (read_c0_entryhi() & ASID_MASK); | ||
| 157 | if(smtc_live_asid[mytlb][oldasid]) { | ||
| 158 | smtc_live_asid[mytlb][oldasid] &= ~(0x1 << cpu); | ||
| 159 | if(smtc_live_asid[mytlb][oldasid] == 0) | ||
| 160 | smtc_flush_tlb_asid(oldasid); | ||
| 161 | } | ||
| 162 | /* | ||
| 163 | * Tread softly on EntryHi, and so long as we support | ||
| 164 | * having ASID_MASK smaller than the hardware maximum, | ||
| 165 | * make sure no "soft" bits become "hard"... | ||
| 166 | */ | ||
| 167 | write_c0_entryhi((read_c0_entryhi() & ~HW_ASID_MASK) | ||
| 168 | | (cpu_context(cpu, next) & ASID_MASK)); | ||
| 169 | ehb(); /* Make sure it propagates to TCStatus */ | ||
| 170 | evpe(mtflags); | ||
| 171 | #else | ||
| 121 | write_c0_entryhi(cpu_context(cpu, next)); | 172 | write_c0_entryhi(cpu_context(cpu, next)); |
| 173 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 122 | TLBMISS_HANDLER_SETUP_PGD(next->pgd); | 174 | TLBMISS_HANDLER_SETUP_PGD(next->pgd); |
| 123 | 175 | ||
| 124 | /* | 176 | /* |
| @@ -151,12 +203,34 @@ activate_mm(struct mm_struct *prev, struct mm_struct *next) | |||
| 151 | unsigned long flags; | 203 | unsigned long flags; |
| 152 | unsigned int cpu = smp_processor_id(); | 204 | unsigned int cpu = smp_processor_id(); |
| 153 | 205 | ||
| 206 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 207 | unsigned long oldasid; | ||
| 208 | unsigned long mtflags; | ||
| 209 | int mytlb = (smtc_status & SMTC_TLB_SHARED) ? 0 : cpu_data[cpu].vpe_id; | ||
| 210 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 211 | |||
| 154 | local_irq_save(flags); | 212 | local_irq_save(flags); |
| 155 | 213 | ||
| 156 | /* Unconditionally get a new ASID. */ | 214 | /* Unconditionally get a new ASID. */ |
| 157 | get_new_mmu_context(next, cpu); | 215 | get_new_mmu_context(next, cpu); |
| 158 | 216 | ||
| 217 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 218 | /* See comments for similar code above */ | ||
| 219 | mtflags = dvpe(); | ||
| 220 | oldasid = read_c0_entryhi() & ASID_MASK; | ||
| 221 | if(smtc_live_asid[mytlb][oldasid]) { | ||
| 222 | smtc_live_asid[mytlb][oldasid] &= ~(0x1 << cpu); | ||
| 223 | if(smtc_live_asid[mytlb][oldasid] == 0) | ||
| 224 | smtc_flush_tlb_asid(oldasid); | ||
| 225 | } | ||
| 226 | /* See comments for similar code above */ | ||
| 227 | write_c0_entryhi((read_c0_entryhi() & ~HW_ASID_MASK) | | ||
| 228 | (cpu_context(cpu, next) & ASID_MASK)); | ||
| 229 | ehb(); /* Make sure it propagates to TCStatus */ | ||
| 230 | evpe(mtflags); | ||
| 231 | #else | ||
| 159 | write_c0_entryhi(cpu_context(cpu, next)); | 232 | write_c0_entryhi(cpu_context(cpu, next)); |
| 233 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 160 | TLBMISS_HANDLER_SETUP_PGD(next->pgd); | 234 | TLBMISS_HANDLER_SETUP_PGD(next->pgd); |
| 161 | 235 | ||
| 162 | /* mark mmu ownership change */ | 236 | /* mark mmu ownership change */ |
| @@ -174,17 +248,49 @@ static inline void | |||
| 174 | drop_mmu_context(struct mm_struct *mm, unsigned cpu) | 248 | drop_mmu_context(struct mm_struct *mm, unsigned cpu) |
| 175 | { | 249 | { |
| 176 | unsigned long flags; | 250 | unsigned long flags; |
| 251 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 252 | unsigned long oldasid; | ||
| 253 | /* Can't use spinlock because called from TLB flush within DVPE */ | ||
| 254 | unsigned int prevvpe; | ||
| 255 | int mytlb = (smtc_status & SMTC_TLB_SHARED) ? 0 : cpu_data[cpu].vpe_id; | ||
| 256 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 177 | 257 | ||
| 178 | local_irq_save(flags); | 258 | local_irq_save(flags); |
| 179 | 259 | ||
| 180 | if (cpu_isset(cpu, mm->cpu_vm_mask)) { | 260 | if (cpu_isset(cpu, mm->cpu_vm_mask)) { |
| 181 | get_new_mmu_context(mm, cpu); | 261 | get_new_mmu_context(mm, cpu); |
| 262 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 263 | /* See comments for similar code above */ | ||
| 264 | prevvpe = dvpe(); | ||
| 265 | oldasid = (read_c0_entryhi() & ASID_MASK); | ||
| 266 | if(smtc_live_asid[mytlb][oldasid]) { | ||
| 267 | smtc_live_asid[mytlb][oldasid] &= ~(0x1 << cpu); | ||
| 268 | if(smtc_live_asid[mytlb][oldasid] == 0) | ||
| 269 | smtc_flush_tlb_asid(oldasid); | ||
| 270 | } | ||
| 271 | /* See comments for similar code above */ | ||
| 272 | write_c0_entryhi((read_c0_entryhi() & ~HW_ASID_MASK) | ||
| 273 | | cpu_asid(cpu, mm)); | ||
| 274 | ehb(); /* Make sure it propagates to TCStatus */ | ||
| 275 | evpe(prevvpe); | ||
| 276 | #else /* not CONFIG_MIPS_MT_SMTC */ | ||
| 182 | write_c0_entryhi(cpu_asid(cpu, mm)); | 277 | write_c0_entryhi(cpu_asid(cpu, mm)); |
| 278 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 183 | } else { | 279 | } else { |
| 184 | /* will get a new context next time */ | 280 | /* will get a new context next time */ |
| 281 | #ifndef CONFIG_MIPS_MT_SMTC | ||
| 185 | cpu_context(cpu, mm) = 0; | 282 | cpu_context(cpu, mm) = 0; |
| 283 | #else /* SMTC */ | ||
| 284 | int i; | ||
| 285 | |||
| 286 | /* SMTC shares the TLB (and ASIDs) across VPEs */ | ||
| 287 | for (i = 0; i < num_online_cpus(); i++) { | ||
| 288 | if((smtc_status & SMTC_TLB_SHARED) | ||
| 289 | || (cpu_data[i].vpe_id == cpu_data[cpu].vpe_id)) | ||
| 290 | cpu_context(i, mm) = 0; | ||
| 291 | } | ||
| 292 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 186 | } | 293 | } |
| 187 | |||
| 188 | local_irq_restore(flags); | 294 | local_irq_restore(flags); |
| 189 | } | 295 | } |
| 190 | 296 | ||
diff --git a/include/asm-mips/page.h b/include/asm-mips/page.h index a1eab136ff..4035ec79ec 100644 --- a/include/asm-mips/page.h +++ b/include/asm-mips/page.h | |||
| @@ -139,9 +139,11 @@ typedef struct { unsigned long pgprot; } pgprot_t; | |||
| 139 | 139 | ||
| 140 | #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) | 140 | #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) |
| 141 | 141 | ||
| 142 | #ifndef CONFIG_SPARSEMEM | ||
| 142 | #ifndef CONFIG_NEED_MULTIPLE_NODES | 143 | #ifndef CONFIG_NEED_MULTIPLE_NODES |
| 143 | #define pfn_valid(pfn) ((pfn) < max_mapnr) | 144 | #define pfn_valid(pfn) ((pfn) < max_mapnr) |
| 144 | #endif | 145 | #endif |
| 146 | #endif | ||
| 145 | 147 | ||
| 146 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) | 148 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) |
| 147 | #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) | 149 | #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) |
diff --git a/include/asm-mips/pgtable-32.h b/include/asm-mips/pgtable-32.h index 4d6bc45df5..087c207692 100644 --- a/include/asm-mips/pgtable-32.h +++ b/include/asm-mips/pgtable-32.h | |||
| @@ -177,48 +177,67 @@ pfn_pte(unsigned long pfn, pgprot_t prot) | |||
| 177 | ((swp_entry_t) { ((type) << 10) | ((offset) << 15) }) | 177 | ((swp_entry_t) { ((type) << 10) | ((offset) << 15) }) |
| 178 | 178 | ||
| 179 | /* | 179 | /* |
| 180 | * Bits 0, 1, 2, 9 and 10 are taken, split up the 27 bits of offset | 180 | * Bits 0, 4, 8, and 9 are taken, split up 28 bits of offset into this range: |
| 181 | * into this range: | ||
| 182 | */ | 181 | */ |
| 183 | #define PTE_FILE_MAX_BITS 27 | 182 | #define PTE_FILE_MAX_BITS 28 |
| 184 | 183 | ||
| 185 | #define pte_to_pgoff(_pte) \ | 184 | #define pte_to_pgoff(_pte) ((((_pte).pte >> 1 ) & 0x07) | \ |
| 186 | ((((_pte).pte >> 3) & 0x3f ) + (((_pte).pte >> 11) << 8 )) | 185 | (((_pte).pte >> 2 ) & 0x38) | \ |
| 186 | (((_pte).pte >> 10) << 6 )) | ||
| 187 | 187 | ||
| 188 | #define pgoff_to_pte(off) \ | 188 | #define pgoff_to_pte(off) ((pte_t) { (((off) & 0x07) << 1 ) | \ |
| 189 | ((pte_t) { (((off) & 0x3f) << 3) + (((off) >> 8) << 11) + _PAGE_FILE }) | 189 | (((off) & 0x38) << 2 ) | \ |
| 190 | (((off) >> 6 ) << 10) | \ | ||
| 191 | _PAGE_FILE }) | ||
| 190 | 192 | ||
| 191 | #else | 193 | #else |
| 192 | 194 | ||
| 193 | /* Swap entries must have VALID and GLOBAL bits cleared. */ | 195 | /* Swap entries must have VALID and GLOBAL bits cleared. */ |
| 196 | #if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32) | ||
| 197 | #define __swp_type(x) (((x).val >> 2) & 0x1f) | ||
| 198 | #define __swp_offset(x) ((x).val >> 7) | ||
| 199 | #define __swp_entry(type,offset) \ | ||
| 200 | ((swp_entry_t) { ((type) << 2) | ((offset) << 7) }) | ||
| 201 | #else | ||
| 194 | #define __swp_type(x) (((x).val >> 8) & 0x1f) | 202 | #define __swp_type(x) (((x).val >> 8) & 0x1f) |
| 195 | #define __swp_offset(x) ((x).val >> 13) | 203 | #define __swp_offset(x) ((x).val >> 13) |
| 196 | #define __swp_entry(type,offset) \ | 204 | #define __swp_entry(type,offset) \ |
| 197 | ((swp_entry_t) { ((type) << 8) | ((offset) << 13) }) | 205 | ((swp_entry_t) { ((type) << 8) | ((offset) << 13) }) |
| 206 | #endif /* defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32) */ | ||
| 198 | 207 | ||
| 208 | #if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32) | ||
| 199 | /* | 209 | /* |
| 200 | * Bits 0, 1, 2, 7 and 8 are taken, split up the 27 bits of offset | 210 | * Bits 0 and 1 of pte_high are taken, use the rest for the page offset... |
| 201 | * into this range: | ||
| 202 | */ | 211 | */ |
| 203 | #define PTE_FILE_MAX_BITS 27 | 212 | #define PTE_FILE_MAX_BITS 30 |
| 204 | 213 | ||
| 205 | #if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32_R1) | 214 | #define pte_to_pgoff(_pte) ((_pte).pte_high >> 2) |
| 206 | /* fixme */ | 215 | #define pgoff_to_pte(off) ((pte_t) { _PAGE_FILE, (off) << 2 }) |
| 207 | #define pte_to_pgoff(_pte) (((_pte).pte_high >> 6) + ((_pte).pte_high & 0x3f)) | ||
| 208 | #define pgoff_to_pte(off) \ | ||
| 209 | ((pte_t){(((off) & 0x3f) + ((off) << 6) + _PAGE_FILE)}) | ||
| 210 | 216 | ||
| 211 | #else | 217 | #else |
| 212 | #define pte_to_pgoff(_pte) \ | 218 | /* |
| 213 | ((((_pte).pte >> 3) & 0x1f ) + (((_pte).pte >> 9) << 6 )) | 219 | * Bits 0, 4, 6, and 7 are taken, split up 28 bits of offset into this range: |
| 220 | */ | ||
| 221 | #define PTE_FILE_MAX_BITS 28 | ||
| 222 | |||
| 223 | #define pte_to_pgoff(_pte) ((((_pte).pte >> 1) & 0x7) | \ | ||
| 224 | (((_pte).pte >> 2) & 0x8) | \ | ||
| 225 | (((_pte).pte >> 8) << 4)) | ||
| 214 | 226 | ||
| 215 | #define pgoff_to_pte(off) \ | 227 | #define pgoff_to_pte(off) ((pte_t) { (((off) & 0x7) << 1) | \ |
| 216 | ((pte_t) { (((off) & 0x1f) << 3) + (((off) >> 6) << 9) + _PAGE_FILE }) | 228 | (((off) & 0x8) << 2) | \ |
| 229 | (((off) >> 4) << 8) | \ | ||
| 230 | _PAGE_FILE }) | ||
| 217 | #endif | 231 | #endif |
| 218 | 232 | ||
| 219 | #endif | 233 | #endif |
| 220 | 234 | ||
| 235 | #if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32) | ||
| 236 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { (pte).pte_high }) | ||
| 237 | #define __swp_entry_to_pte(x) ((pte_t) { 0, (x).val }) | ||
| 238 | #else | ||
| 221 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) | 239 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) |
| 222 | #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) | 240 | #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) |
| 241 | #endif | ||
| 223 | 242 | ||
| 224 | #endif /* _ASM_PGTABLE_32_H */ | 243 | #endif /* _ASM_PGTABLE_32_H */ |
diff --git a/include/asm-mips/pgtable-64.h b/include/asm-mips/pgtable-64.h index 82166b254b..2faf5c9ff1 100644 --- a/include/asm-mips/pgtable-64.h +++ b/include/asm-mips/pgtable-64.h | |||
| @@ -224,15 +224,12 @@ static inline pte_t mk_swap_pte(unsigned long type, unsigned long offset) | |||
| 224 | #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) | 224 | #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) |
| 225 | 225 | ||
| 226 | /* | 226 | /* |
| 227 | * Bits 0, 1, 2, 7 and 8 are taken, split up the 32 bits of offset | 227 | * Bits 0, 4, 6, and 7 are taken. Let's leave bits 1, 2, 3, and 5 alone to |
| 228 | * into this range: | 228 | * make things easier, and only use the upper 56 bits for the page offset... |
| 229 | */ | 229 | */ |
| 230 | #define PTE_FILE_MAX_BITS 32 | 230 | #define PTE_FILE_MAX_BITS 56 |
| 231 | 231 | ||
| 232 | #define pte_to_pgoff(_pte) \ | 232 | #define pte_to_pgoff(_pte) ((_pte).pte >> 8) |
| 233 | ((((_pte).pte >> 3) & 0x1f ) + (((_pte).pte >> 9) << 6 )) | 233 | #define pgoff_to_pte(off) ((pte_t) { ((off) << 8) | _PAGE_FILE }) |
| 234 | |||
| 235 | #define pgoff_to_pte(off) \ | ||
| 236 | ((pte_t) { (((off) & 0x1f) << 3) + (((off) >> 6) << 9) + _PAGE_FILE }) | ||
| 237 | 234 | ||
| 238 | #endif /* _ASM_PGTABLE_64_H */ | 235 | #endif /* _ASM_PGTABLE_64_H */ |
diff --git a/include/asm-mips/pgtable.h b/include/asm-mips/pgtable.h index 702a28fa7a..d0af2a3b01 100644 --- a/include/asm-mips/pgtable.h +++ b/include/asm-mips/pgtable.h | |||
| @@ -70,7 +70,15 @@ extern unsigned long zero_page_mask; | |||
| 70 | #define ZERO_PAGE(vaddr) \ | 70 | #define ZERO_PAGE(vaddr) \ |
| 71 | (virt_to_page(empty_zero_page + (((unsigned long)(vaddr)) & zero_page_mask))) | 71 | (virt_to_page(empty_zero_page + (((unsigned long)(vaddr)) & zero_page_mask))) |
| 72 | 72 | ||
| 73 | #define __HAVE_ARCH_MULTIPLE_ZERO_PAGE | 73 | #define __HAVE_ARCH_MOVE_PTE |
| 74 | #define move_pte(pte, prot, old_addr, new_addr) \ | ||
| 75 | ({ \ | ||
| 76 | pte_t newpte = (pte); \ | ||
| 77 | if (pte_present(pte) && pfn_valid(pte_pfn(pte)) && \ | ||
| 78 | pte_page(pte) == ZERO_PAGE(old_addr)) \ | ||
| 79 | newpte = mk_pte(ZERO_PAGE(new_addr), (prot)); \ | ||
| 80 | newpte; \ | ||
| 81 | }) | ||
| 74 | 82 | ||
| 75 | extern void paging_init(void); | 83 | extern void paging_init(void); |
| 76 | 84 | ||
| @@ -82,10 +90,11 @@ extern void paging_init(void); | |||
| 82 | #define pmd_page(pmd) (pfn_to_page(pmd_phys(pmd) >> PAGE_SHIFT)) | 90 | #define pmd_page(pmd) (pfn_to_page(pmd_phys(pmd) >> PAGE_SHIFT)) |
| 83 | #define pmd_page_kernel(pmd) pmd_val(pmd) | 91 | #define pmd_page_kernel(pmd) pmd_val(pmd) |
| 84 | 92 | ||
| 85 | #define pte_none(pte) (!(pte_val(pte) & ~_PAGE_GLOBAL)) | ||
| 86 | #define pte_present(pte) (pte_val(pte) & _PAGE_PRESENT) | ||
| 87 | |||
| 88 | #if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32_R1) | 93 | #if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32_R1) |
| 94 | |||
| 95 | #define pte_none(pte) (!(((pte).pte_low | (pte).pte_high) & ~_PAGE_GLOBAL)) | ||
| 96 | #define pte_present(pte) ((pte).pte_low & _PAGE_PRESENT) | ||
| 97 | |||
| 89 | static inline void set_pte(pte_t *ptep, pte_t pte) | 98 | static inline void set_pte(pte_t *ptep, pte_t pte) |
| 90 | { | 99 | { |
| 91 | ptep->pte_high = pte.pte_high; | 100 | ptep->pte_high = pte.pte_high; |
| @@ -93,27 +102,35 @@ static inline void set_pte(pte_t *ptep, pte_t pte) | |||
| 93 | ptep->pte_low = pte.pte_low; | 102 | ptep->pte_low = pte.pte_low; |
| 94 | //printk("pte_high %x pte_low %x\n", ptep->pte_high, ptep->pte_low); | 103 | //printk("pte_high %x pte_low %x\n", ptep->pte_high, ptep->pte_low); |
| 95 | 104 | ||
| 96 | if (pte_val(pte) & _PAGE_GLOBAL) { | 105 | if (pte.pte_low & _PAGE_GLOBAL) { |
| 97 | pte_t *buddy = ptep_buddy(ptep); | 106 | pte_t *buddy = ptep_buddy(ptep); |
| 98 | /* | 107 | /* |
| 99 | * Make sure the buddy is global too (if it's !none, | 108 | * Make sure the buddy is global too (if it's !none, |
| 100 | * it better already be global) | 109 | * it better already be global) |
| 101 | */ | 110 | */ |
| 102 | if (pte_none(*buddy)) | 111 | if (pte_none(*buddy)) { |
| 103 | buddy->pte_low |= _PAGE_GLOBAL; | 112 | buddy->pte_low |= _PAGE_GLOBAL; |
| 113 | buddy->pte_high |= _PAGE_GLOBAL; | ||
| 114 | } | ||
| 104 | } | 115 | } |
| 105 | } | 116 | } |
| 106 | #define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) | 117 | #define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) |
| 107 | 118 | ||
| 108 | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) | 119 | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) |
| 109 | { | 120 | { |
| 121 | pte_t null = __pte(0); | ||
| 122 | |||
| 110 | /* Preserve global status for the pair */ | 123 | /* Preserve global status for the pair */ |
| 111 | if (pte_val(*ptep_buddy(ptep)) & _PAGE_GLOBAL) | 124 | if (ptep_buddy(ptep)->pte_low & _PAGE_GLOBAL) |
| 112 | set_pte_at(mm, addr, ptep, __pte(_PAGE_GLOBAL)); | 125 | null.pte_low = null.pte_high = _PAGE_GLOBAL; |
| 113 | else | 126 | |
| 114 | set_pte_at(mm, addr, ptep, __pte(0)); | 127 | set_pte_at(mm, addr, ptep, null); |
| 115 | } | 128 | } |
| 116 | #else | 129 | #else |
| 130 | |||
| 131 | #define pte_none(pte) (!(pte_val(pte) & ~_PAGE_GLOBAL)) | ||
| 132 | #define pte_present(pte) (pte_val(pte) & _PAGE_PRESENT) | ||
| 133 | |||
| 117 | /* | 134 | /* |
| 118 | * Certain architectures need to do special things when pte's | 135 | * Certain architectures need to do special things when pte's |
| 119 | * within a page table are directly modified. Thus, the following | 136 | * within a page table are directly modified. Thus, the following |
| @@ -174,75 +191,76 @@ extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; | |||
| 174 | */ | 191 | */ |
| 175 | static inline int pte_user(pte_t pte) { BUG(); return 0; } | 192 | static inline int pte_user(pte_t pte) { BUG(); return 0; } |
| 176 | #if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32_R1) | 193 | #if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32_R1) |
| 177 | static inline int pte_read(pte_t pte) { return (pte).pte_low & _PAGE_READ; } | 194 | static inline int pte_read(pte_t pte) { return pte.pte_low & _PAGE_READ; } |
| 178 | static inline int pte_write(pte_t pte) { return (pte).pte_low & _PAGE_WRITE; } | 195 | static inline int pte_write(pte_t pte) { return pte.pte_low & _PAGE_WRITE; } |
| 179 | static inline int pte_dirty(pte_t pte) { return (pte).pte_low & _PAGE_MODIFIED; } | 196 | static inline int pte_dirty(pte_t pte) { return pte.pte_low & _PAGE_MODIFIED; } |
| 180 | static inline int pte_young(pte_t pte) { return (pte).pte_low & _PAGE_ACCESSED; } | 197 | static inline int pte_young(pte_t pte) { return pte.pte_low & _PAGE_ACCESSED; } |
| 181 | static inline int pte_file(pte_t pte) { return (pte).pte_low & _PAGE_FILE; } | 198 | static inline int pte_file(pte_t pte) { return pte.pte_low & _PAGE_FILE; } |
| 199 | |||
| 182 | static inline pte_t pte_wrprotect(pte_t pte) | 200 | static inline pte_t pte_wrprotect(pte_t pte) |
| 183 | { | 201 | { |
| 184 | (pte).pte_low &= ~(_PAGE_WRITE | _PAGE_SILENT_WRITE); | 202 | pte.pte_low &= ~(_PAGE_WRITE | _PAGE_SILENT_WRITE); |
| 185 | (pte).pte_high &= ~_PAGE_SILENT_WRITE; | 203 | pte.pte_high &= ~_PAGE_SILENT_WRITE; |
| 186 | return pte; | 204 | return pte; |
| 187 | } | 205 | } |
| 188 | 206 | ||
| 189 | static inline pte_t pte_rdprotect(pte_t pte) | 207 | static inline pte_t pte_rdprotect(pte_t pte) |
| 190 | { | 208 | { |
| 191 | (pte).pte_low &= ~(_PAGE_READ | _PAGE_SILENT_READ); | 209 | pte.pte_low &= ~(_PAGE_READ | _PAGE_SILENT_READ); |
| 192 | (pte).pte_high &= ~_PAGE_SILENT_READ; | 210 | pte.pte_high &= ~_PAGE_SILENT_READ; |
| 193 | return pte; | 211 | return pte; |
| 194 | } | 212 | } |
| 195 | 213 | ||
| 196 | static inline pte_t pte_mkclean(pte_t pte) | 214 | static inline pte_t pte_mkclean(pte_t pte) |
| 197 | { | 215 | { |
| 198 | (pte).pte_low &= ~(_PAGE_MODIFIED|_PAGE_SILENT_WRITE); | 216 | pte.pte_low &= ~(_PAGE_MODIFIED | _PAGE_SILENT_WRITE); |
| 199 | (pte).pte_high &= ~_PAGE_SILENT_WRITE; | 217 | pte.pte_high &= ~_PAGE_SILENT_WRITE; |
| 200 | return pte; | 218 | return pte; |
| 201 | } | 219 | } |
| 202 | 220 | ||
| 203 | static inline pte_t pte_mkold(pte_t pte) | 221 | static inline pte_t pte_mkold(pte_t pte) |
| 204 | { | 222 | { |
| 205 | (pte).pte_low &= ~(_PAGE_ACCESSED|_PAGE_SILENT_READ); | 223 | pte.pte_low &= ~(_PAGE_ACCESSED | _PAGE_SILENT_READ); |
| 206 | (pte).pte_high &= ~_PAGE_SILENT_READ; | 224 | pte.pte_high &= ~_PAGE_SILENT_READ; |
| 207 | return pte; | 225 | return pte; |
| 208 | } | 226 | } |
| 209 | 227 | ||
| 210 | static inline pte_t pte_mkwrite(pte_t pte) | 228 | static inline pte_t pte_mkwrite(pte_t pte) |
| 211 | { | 229 | { |
| 212 | (pte).pte_low |= _PAGE_WRITE; | 230 | pte.pte_low |= _PAGE_WRITE; |
| 213 | if ((pte).pte_low & _PAGE_MODIFIED) { | 231 | if (pte.pte_low & _PAGE_MODIFIED) { |
| 214 | (pte).pte_low |= _PAGE_SILENT_WRITE; | 232 | pte.pte_low |= _PAGE_SILENT_WRITE; |
| 215 | (pte).pte_high |= _PAGE_SILENT_WRITE; | 233 | pte.pte_high |= _PAGE_SILENT_WRITE; |
| 216 | } | 234 | } |
| 217 | return pte; | 235 | return pte; |
| 218 | } | 236 | } |
| 219 | 237 | ||
| 220 | static inline pte_t pte_mkread(pte_t pte) | 238 | static inline pte_t pte_mkread(pte_t pte) |
| 221 | { | 239 | { |
| 222 | (pte).pte_low |= _PAGE_READ; | 240 | pte.pte_low |= _PAGE_READ; |
| 223 | if ((pte).pte_low & _PAGE_ACCESSED) { | 241 | if (pte.pte_low & _PAGE_ACCESSED) { |
| 224 | (pte).pte_low |= _PAGE_SILENT_READ; | 242 | pte.pte_low |= _PAGE_SILENT_READ; |
| 225 | (pte).pte_high |= _PAGE_SILENT_READ; | 243 | pte.pte_high |= _PAGE_SILENT_READ; |
| 226 | } | 244 | } |
| 227 | return pte; | 245 | return pte; |
| 228 | } | 246 | } |
| 229 | 247 | ||
| 230 | static inline pte_t pte_mkdirty(pte_t pte) | 248 | static inline pte_t pte_mkdirty(pte_t pte) |
| 231 | { | 249 | { |
| 232 | (pte).pte_low |= _PAGE_MODIFIED; | 250 | pte.pte_low |= _PAGE_MODIFIED; |
| 233 | if ((pte).pte_low & _PAGE_WRITE) { | 251 | if (pte.pte_low & _PAGE_WRITE) { |
| 234 | (pte).pte_low |= _PAGE_SILENT_WRITE; | 252 | pte.pte_low |= _PAGE_SILENT_WRITE; |
| 235 | (pte).pte_high |= _PAGE_SILENT_WRITE; | 253 | pte.pte_high |= _PAGE_SILENT_WRITE; |
| 236 | } | 254 | } |
| 237 | return pte; | 255 | return pte; |
| 238 | } | 256 | } |
| 239 | 257 | ||
| 240 | static inline pte_t pte_mkyoung(pte_t pte) | 258 | static inline pte_t pte_mkyoung(pte_t pte) |
| 241 | { | 259 | { |
| 242 | (pte).pte_low |= _PAGE_ACCESSED; | 260 | pte.pte_low |= _PAGE_ACCESSED; |
| 243 | if ((pte).pte_low & _PAGE_READ) | 261 | if (pte.pte_low & _PAGE_READ) |
| 244 | (pte).pte_low |= _PAGE_SILENT_READ; | 262 | pte.pte_low |= _PAGE_SILENT_READ; |
| 245 | (pte).pte_high |= _PAGE_SILENT_READ; | 263 | pte.pte_high |= _PAGE_SILENT_READ; |
| 246 | return pte; | 264 | return pte; |
| 247 | } | 265 | } |
| 248 | #else | 266 | #else |
| @@ -335,8 +353,9 @@ static inline pgprot_t pgprot_noncached(pgprot_t _prot) | |||
| 335 | #if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32_R1) | 353 | #if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32_R1) |
| 336 | static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | 354 | static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) |
| 337 | { | 355 | { |
| 338 | pte.pte_low &= _PAGE_CHG_MASK; | 356 | pte.pte_low &= _PAGE_CHG_MASK; |
| 339 | pte.pte_low |= pgprot_val(newprot); | 357 | pte.pte_high &= ~0x3f; |
| 358 | pte.pte_low |= pgprot_val(newprot); | ||
| 340 | pte.pte_high |= pgprot_val(newprot) & 0x3f; | 359 | pte.pte_high |= pgprot_val(newprot) & 0x3f; |
| 341 | return pte; | 360 | return pte; |
| 342 | } | 361 | } |
diff --git a/include/asm-mips/processor.h b/include/asm-mips/processor.h index 39d2bd50fe..0fb75f0762 100644 --- a/include/asm-mips/processor.h +++ b/include/asm-mips/processor.h | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #define _ASM_PROCESSOR_H | 12 | #define _ASM_PROCESSOR_H |
| 13 | 13 | ||
| 14 | #include <linux/config.h> | 14 | #include <linux/config.h> |
| 15 | #include <linux/cpumask.h> | ||
| 15 | #include <linux/threads.h> | 16 | #include <linux/threads.h> |
| 16 | 17 | ||
| 17 | #include <asm/cachectl.h> | 18 | #include <asm/cachectl.h> |
| @@ -107,6 +108,10 @@ struct mips_dsp_state { | |||
| 107 | 108 | ||
| 108 | #define INIT_DSP {{0,},} | 109 | #define INIT_DSP {{0,},} |
| 109 | 110 | ||
| 111 | #define INIT_CPUMASK { \ | ||
| 112 | {0,} \ | ||
| 113 | } | ||
| 114 | |||
| 110 | typedef struct { | 115 | typedef struct { |
| 111 | unsigned long seg; | 116 | unsigned long seg; |
| 112 | } mm_segment_t; | 117 | } mm_segment_t; |
| @@ -129,6 +134,12 @@ struct thread_struct { | |||
| 129 | 134 | ||
| 130 | /* Saved fpu/fpu emulator stuff. */ | 135 | /* Saved fpu/fpu emulator stuff. */ |
| 131 | union mips_fpu_union fpu; | 136 | union mips_fpu_union fpu; |
| 137 | #ifdef CONFIG_MIPS_MT_FPAFF | ||
| 138 | /* Emulated instruction count */ | ||
| 139 | unsigned long emulated_fp; | ||
| 140 | /* Saved per-thread scheduler affinity mask */ | ||
| 141 | cpumask_t user_cpus_allowed; | ||
| 142 | #endif /* CONFIG_MIPS_MT_FPAFF */ | ||
| 132 | 143 | ||
| 133 | /* Saved state of the DSP ASE, if available. */ | 144 | /* Saved state of the DSP ASE, if available. */ |
| 134 | struct mips_dsp_state dsp; | 145 | struct mips_dsp_state dsp; |
| @@ -142,6 +153,7 @@ struct thread_struct { | |||
| 142 | #define MF_LOGADE 2 /* Log address errors to syslog */ | 153 | #define MF_LOGADE 2 /* Log address errors to syslog */ |
| 143 | #define MF_32BIT_REGS 4 /* also implies 16/32 fprs */ | 154 | #define MF_32BIT_REGS 4 /* also implies 16/32 fprs */ |
| 144 | #define MF_32BIT_ADDR 8 /* 32-bit address space (o32/n32) */ | 155 | #define MF_32BIT_ADDR 8 /* 32-bit address space (o32/n32) */ |
| 156 | #define MF_FPUBOUND 0x10 /* thread bound to FPU-full CPU set */ | ||
| 145 | unsigned long mflags; | 157 | unsigned long mflags; |
| 146 | unsigned long irix_trampoline; /* Wheee... */ | 158 | unsigned long irix_trampoline; /* Wheee... */ |
| 147 | unsigned long irix_oldctx; | 159 | unsigned long irix_oldctx; |
| @@ -153,6 +165,12 @@ struct thread_struct { | |||
| 153 | #define MF_N32 MF_32BIT_ADDR | 165 | #define MF_N32 MF_32BIT_ADDR |
| 154 | #define MF_N64 0 | 166 | #define MF_N64 0 |
| 155 | 167 | ||
| 168 | #ifdef CONFIG_MIPS_MT_FPAFF | ||
| 169 | #define FPAFF_INIT 0, INIT_CPUMASK, | ||
| 170 | #else | ||
| 171 | #define FPAFF_INIT | ||
| 172 | #endif /* CONFIG_MIPS_MT_FPAFF */ | ||
| 173 | |||
| 156 | #define INIT_THREAD { \ | 174 | #define INIT_THREAD { \ |
| 157 | /* \ | 175 | /* \ |
| 158 | * saved main processor registers \ | 176 | * saved main processor registers \ |
| @@ -168,6 +186,10 @@ struct thread_struct { | |||
| 168 | */ \ | 186 | */ \ |
| 169 | INIT_FPU, \ | 187 | INIT_FPU, \ |
| 170 | /* \ | 188 | /* \ |
| 189 | * fpu affinity state (null if not FPAFF) \ | ||
| 190 | */ \ | ||
| 191 | FPAFF_INIT \ | ||
| 192 | /* \ | ||
| 171 | * saved dsp/dsp emulator stuff \ | 193 | * saved dsp/dsp emulator stuff \ |
| 172 | */ \ | 194 | */ \ |
| 173 | INIT_DSP, \ | 195 | INIT_DSP, \ |
diff --git a/include/asm-mips/ptrace.h b/include/asm-mips/ptrace.h index 95c5839ac4..fa9d8713c1 100644 --- a/include/asm-mips/ptrace.h +++ b/include/asm-mips/ptrace.h | |||
| @@ -45,6 +45,10 @@ struct pt_regs { | |||
| 45 | unsigned long cp0_badvaddr; | 45 | unsigned long cp0_badvaddr; |
| 46 | unsigned long cp0_cause; | 46 | unsigned long cp0_cause; |
| 47 | unsigned long cp0_epc; | 47 | unsigned long cp0_epc; |
| 48 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 49 | unsigned long cp0_tcstatus; | ||
| 50 | unsigned long smtc_pad; | ||
| 51 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 48 | }; | 52 | }; |
| 49 | 53 | ||
| 50 | /* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */ | 54 | /* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */ |
diff --git a/include/asm-mips/r4kcache.h b/include/asm-mips/r4kcache.h index 90c3747009..3c8e3c8d1a 100644 --- a/include/asm-mips/r4kcache.h +++ b/include/asm-mips/r4kcache.h | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <asm/asm.h> | 15 | #include <asm/asm.h> |
| 16 | #include <asm/cacheops.h> | 16 | #include <asm/cacheops.h> |
| 17 | #include <asm/cpu-features.h> | 17 | #include <asm/cpu-features.h> |
| 18 | #include <asm/mipsmtregs.h> | ||
| 18 | 19 | ||
| 19 | /* | 20 | /* |
| 20 | * This macro return a properly sign-extended address suitable as base address | 21 | * This macro return a properly sign-extended address suitable as base address |
| @@ -37,16 +38,120 @@ | |||
| 37 | " cache %0, %1 \n" \ | 38 | " cache %0, %1 \n" \ |
| 38 | " .set pop \n" \ | 39 | " .set pop \n" \ |
| 39 | : \ | 40 | : \ |
| 40 | : "i" (op), "m" (*(unsigned char *)(addr))) | 41 | : "i" (op), "R" (*(unsigned char *)(addr))) |
| 42 | |||
| 43 | #ifdef CONFIG_MIPS_MT | ||
| 44 | /* | ||
| 45 | * Temporary hacks for SMTC debug. Optionally force single-threaded | ||
| 46 | * execution during I-cache flushes. | ||
| 47 | */ | ||
| 48 | |||
| 49 | #define PROTECT_CACHE_FLUSHES 1 | ||
| 50 | |||
| 51 | #ifdef PROTECT_CACHE_FLUSHES | ||
| 52 | |||
| 53 | extern int mt_protiflush; | ||
| 54 | extern int mt_protdflush; | ||
| 55 | extern void mt_cflush_lockdown(void); | ||
| 56 | extern void mt_cflush_release(void); | ||
| 57 | |||
| 58 | #define BEGIN_MT_IPROT \ | ||
| 59 | unsigned long flags = 0; \ | ||
| 60 | unsigned long mtflags = 0; \ | ||
| 61 | if(mt_protiflush) { \ | ||
| 62 | local_irq_save(flags); \ | ||
| 63 | ehb(); \ | ||
| 64 | mtflags = dvpe(); \ | ||
| 65 | mt_cflush_lockdown(); \ | ||
| 66 | } | ||
| 67 | |||
| 68 | #define END_MT_IPROT \ | ||
| 69 | if(mt_protiflush) { \ | ||
| 70 | mt_cflush_release(); \ | ||
| 71 | evpe(mtflags); \ | ||
| 72 | local_irq_restore(flags); \ | ||
| 73 | } | ||
| 74 | |||
| 75 | #define BEGIN_MT_DPROT \ | ||
| 76 | unsigned long flags = 0; \ | ||
| 77 | unsigned long mtflags = 0; \ | ||
| 78 | if(mt_protdflush) { \ | ||
| 79 | local_irq_save(flags); \ | ||
| 80 | ehb(); \ | ||
| 81 | mtflags = dvpe(); \ | ||
| 82 | mt_cflush_lockdown(); \ | ||
| 83 | } | ||
| 84 | |||
| 85 | #define END_MT_DPROT \ | ||
| 86 | if(mt_protdflush) { \ | ||
| 87 | mt_cflush_release(); \ | ||
| 88 | evpe(mtflags); \ | ||
| 89 | local_irq_restore(flags); \ | ||
| 90 | } | ||
| 91 | |||
| 92 | #else | ||
| 93 | |||
| 94 | #define BEGIN_MT_IPROT | ||
| 95 | #define BEGIN_MT_DPROT | ||
| 96 | #define END_MT_IPROT | ||
| 97 | #define END_MT_DPROT | ||
| 98 | |||
| 99 | #endif /* PROTECT_CACHE_FLUSHES */ | ||
| 100 | |||
| 101 | #define __iflush_prologue \ | ||
| 102 | unsigned long redundance; \ | ||
| 103 | extern int mt_n_iflushes; \ | ||
| 104 | BEGIN_MT_IPROT \ | ||
| 105 | for (redundance = 0; redundance < mt_n_iflushes; redundance++) { | ||
| 106 | |||
| 107 | #define __iflush_epilogue \ | ||
| 108 | END_MT_IPROT \ | ||
| 109 | } | ||
| 110 | |||
| 111 | #define __dflush_prologue \ | ||
| 112 | unsigned long redundance; \ | ||
| 113 | extern int mt_n_dflushes; \ | ||
| 114 | BEGIN_MT_DPROT \ | ||
| 115 | for (redundance = 0; redundance < mt_n_dflushes; redundance++) { | ||
| 116 | |||
| 117 | #define __dflush_epilogue \ | ||
| 118 | END_MT_DPROT \ | ||
| 119 | } | ||
| 120 | |||
| 121 | #define __inv_dflush_prologue __dflush_prologue | ||
| 122 | #define __inv_dflush_epilogue __dflush_epilogue | ||
| 123 | #define __sflush_prologue { | ||
| 124 | #define __sflush_epilogue } | ||
| 125 | #define __inv_sflush_prologue __sflush_prologue | ||
| 126 | #define __inv_sflush_epilogue __sflush_epilogue | ||
| 127 | |||
| 128 | #else /* CONFIG_MIPS_MT */ | ||
| 129 | |||
| 130 | #define __iflush_prologue { | ||
| 131 | #define __iflush_epilogue } | ||
| 132 | #define __dflush_prologue { | ||
| 133 | #define __dflush_epilogue } | ||
| 134 | #define __inv_dflush_prologue { | ||
| 135 | #define __inv_dflush_epilogue } | ||
| 136 | #define __sflush_prologue { | ||
| 137 | #define __sflush_epilogue } | ||
| 138 | #define __inv_sflush_prologue { | ||
| 139 | #define __inv_sflush_epilogue } | ||
| 140 | |||
| 141 | #endif /* CONFIG_MIPS_MT */ | ||
| 41 | 142 | ||
| 42 | static inline void flush_icache_line_indexed(unsigned long addr) | 143 | static inline void flush_icache_line_indexed(unsigned long addr) |
| 43 | { | 144 | { |
| 145 | __iflush_prologue | ||
| 44 | cache_op(Index_Invalidate_I, addr); | 146 | cache_op(Index_Invalidate_I, addr); |
| 147 | __iflush_epilogue | ||
| 45 | } | 148 | } |
| 46 | 149 | ||
| 47 | static inline void flush_dcache_line_indexed(unsigned long addr) | 150 | static inline void flush_dcache_line_indexed(unsigned long addr) |
| 48 | { | 151 | { |
| 152 | __dflush_prologue | ||
| 49 | cache_op(Index_Writeback_Inv_D, addr); | 153 | cache_op(Index_Writeback_Inv_D, addr); |
| 154 | __dflush_epilogue | ||
| 50 | } | 155 | } |
| 51 | 156 | ||
| 52 | static inline void flush_scache_line_indexed(unsigned long addr) | 157 | static inline void flush_scache_line_indexed(unsigned long addr) |
| @@ -56,17 +161,23 @@ static inline void flush_scache_line_indexed(unsigned long addr) | |||
| 56 | 161 | ||
| 57 | static inline void flush_icache_line(unsigned long addr) | 162 | static inline void flush_icache_line(unsigned long addr) |
| 58 | { | 163 | { |
| 164 | __iflush_prologue | ||
| 59 | cache_op(Hit_Invalidate_I, addr); | 165 | cache_op(Hit_Invalidate_I, addr); |
| 166 | __iflush_epilogue | ||
| 60 | } | 167 | } |
| 61 | 168 | ||
| 62 | static inline void flush_dcache_line(unsigned long addr) | 169 | static inline void flush_dcache_line(unsigned long addr) |
| 63 | { | 170 | { |
| 171 | __dflush_prologue | ||
| 64 | cache_op(Hit_Writeback_Inv_D, addr); | 172 | cache_op(Hit_Writeback_Inv_D, addr); |
| 173 | __dflush_epilogue | ||
| 65 | } | 174 | } |
| 66 | 175 | ||
| 67 | static inline void invalidate_dcache_line(unsigned long addr) | 176 | static inline void invalidate_dcache_line(unsigned long addr) |
| 68 | { | 177 | { |
| 178 | __dflush_prologue | ||
| 69 | cache_op(Hit_Invalidate_D, addr); | 179 | cache_op(Hit_Invalidate_D, addr); |
| 180 | __dflush_epilogue | ||
| 70 | } | 181 | } |
| 71 | 182 | ||
| 72 | static inline void invalidate_scache_line(unsigned long addr) | 183 | static inline void invalidate_scache_line(unsigned long addr) |
| @@ -239,9 +350,13 @@ static inline void blast_##pfx##cache##lsize(void) \ | |||
| 239 | current_cpu_data.desc.waybit; \ | 350 | current_cpu_data.desc.waybit; \ |
| 240 | unsigned long ws, addr; \ | 351 | unsigned long ws, addr; \ |
| 241 | \ | 352 | \ |
| 353 | __##pfx##flush_prologue \ | ||
| 354 | \ | ||
| 242 | for (ws = 0; ws < ws_end; ws += ws_inc) \ | 355 | for (ws = 0; ws < ws_end; ws += ws_inc) \ |
| 243 | for (addr = start; addr < end; addr += lsize * 32) \ | 356 | for (addr = start; addr < end; addr += lsize * 32) \ |
| 244 | cache##lsize##_unroll32(addr|ws,indexop); \ | 357 | cache##lsize##_unroll32(addr|ws,indexop); \ |
| 358 | \ | ||
| 359 | __##pfx##flush_epilogue \ | ||
| 245 | } \ | 360 | } \ |
| 246 | \ | 361 | \ |
| 247 | static inline void blast_##pfx##cache##lsize##_page(unsigned long page) \ | 362 | static inline void blast_##pfx##cache##lsize##_page(unsigned long page) \ |
| @@ -249,10 +364,14 @@ static inline void blast_##pfx##cache##lsize##_page(unsigned long page) \ | |||
| 249 | unsigned long start = page; \ | 364 | unsigned long start = page; \ |
| 250 | unsigned long end = page + PAGE_SIZE; \ | 365 | unsigned long end = page + PAGE_SIZE; \ |
| 251 | \ | 366 | \ |
| 367 | __##pfx##flush_prologue \ | ||
| 368 | \ | ||
| 252 | do { \ | 369 | do { \ |
| 253 | cache##lsize##_unroll32(start,hitop); \ | 370 | cache##lsize##_unroll32(start,hitop); \ |
| 254 | start += lsize * 32; \ | 371 | start += lsize * 32; \ |
| 255 | } while (start < end); \ | 372 | } while (start < end); \ |
| 373 | \ | ||
| 374 | __##pfx##flush_epilogue \ | ||
| 256 | } \ | 375 | } \ |
| 257 | \ | 376 | \ |
| 258 | static inline void blast_##pfx##cache##lsize##_page_indexed(unsigned long page) \ | 377 | static inline void blast_##pfx##cache##lsize##_page_indexed(unsigned long page) \ |
| @@ -265,9 +384,13 @@ static inline void blast_##pfx##cache##lsize##_page_indexed(unsigned long page) | |||
| 265 | current_cpu_data.desc.waybit; \ | 384 | current_cpu_data.desc.waybit; \ |
| 266 | unsigned long ws, addr; \ | 385 | unsigned long ws, addr; \ |
| 267 | \ | 386 | \ |
| 387 | __##pfx##flush_prologue \ | ||
| 388 | \ | ||
| 268 | for (ws = 0; ws < ws_end; ws += ws_inc) \ | 389 | for (ws = 0; ws < ws_end; ws += ws_inc) \ |
| 269 | for (addr = start; addr < end; addr += lsize * 32) \ | 390 | for (addr = start; addr < end; addr += lsize * 32) \ |
| 270 | cache##lsize##_unroll32(addr|ws,indexop); \ | 391 | cache##lsize##_unroll32(addr|ws,indexop); \ |
| 392 | \ | ||
| 393 | __##pfx##flush_epilogue \ | ||
| 271 | } | 394 | } |
| 272 | 395 | ||
| 273 | __BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 16) | 396 | __BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 16) |
| @@ -288,12 +411,17 @@ static inline void prot##blast_##pfx##cache##_range(unsigned long start, \ | |||
| 288 | unsigned long lsize = cpu_##desc##_line_size(); \ | 411 | unsigned long lsize = cpu_##desc##_line_size(); \ |
| 289 | unsigned long addr = start & ~(lsize - 1); \ | 412 | unsigned long addr = start & ~(lsize - 1); \ |
| 290 | unsigned long aend = (end - 1) & ~(lsize - 1); \ | 413 | unsigned long aend = (end - 1) & ~(lsize - 1); \ |
| 414 | \ | ||
| 415 | __##pfx##flush_prologue \ | ||
| 416 | \ | ||
| 291 | while (1) { \ | 417 | while (1) { \ |
| 292 | prot##cache_op(hitop, addr); \ | 418 | prot##cache_op(hitop, addr); \ |
| 293 | if (addr == aend) \ | 419 | if (addr == aend) \ |
| 294 | break; \ | 420 | break; \ |
| 295 | addr += lsize; \ | 421 | addr += lsize; \ |
| 296 | } \ | 422 | } \ |
| 423 | \ | ||
| 424 | __##pfx##flush_epilogue \ | ||
| 297 | } | 425 | } |
| 298 | 426 | ||
| 299 | __BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, protected_) | 427 | __BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, protected_) |
diff --git a/include/asm-mips/rtc.h b/include/asm-mips/rtc.h index a2abc4572b..82ad401c7d 100644 --- a/include/asm-mips/rtc.h +++ b/include/asm-mips/rtc.h | |||
| @@ -32,7 +32,7 @@ static inline unsigned int get_rtc_time(struct rtc_time *time) | |||
| 32 | { | 32 | { |
| 33 | unsigned long nowtime; | 33 | unsigned long nowtime; |
| 34 | 34 | ||
| 35 | nowtime = rtc_get_time(); | 35 | nowtime = rtc_mips_get_time(); |
| 36 | to_tm(nowtime, time); | 36 | to_tm(nowtime, time); |
| 37 | time->tm_year -= 1900; | 37 | time->tm_year -= 1900; |
| 38 | 38 | ||
| @@ -47,7 +47,7 @@ static inline int set_rtc_time(struct rtc_time *time) | |||
| 47 | nowtime = mktime(time->tm_year+1900, time->tm_mon+1, | 47 | nowtime = mktime(time->tm_year+1900, time->tm_mon+1, |
| 48 | time->tm_mday, time->tm_hour, time->tm_min, | 48 | time->tm_mday, time->tm_hour, time->tm_min, |
| 49 | time->tm_sec); | 49 | time->tm_sec); |
| 50 | ret = rtc_set_time(nowtime); | 50 | ret = rtc_mips_set_time(nowtime); |
| 51 | 51 | ||
| 52 | return ret; | 52 | return ret; |
| 53 | } | 53 | } |
diff --git a/include/asm-mips/rtlx.h b/include/asm-mips/rtlx.h index 1298c3fdf6..76cd51c6be 100644 --- a/include/asm-mips/rtlx.h +++ b/include/asm-mips/rtlx.h | |||
| @@ -3,32 +3,46 @@ | |||
| 3 | * | 3 | * |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | #ifndef _RTLX_H | 6 | #ifndef __ASM_RTLX_H |
| 7 | #define _RTLX_H_ | 7 | #define __ASM_RTLX_H_ |
| 8 | 8 | ||
| 9 | #define LX_NODE_BASE 10 | 9 | #define LX_NODE_BASE 10 |
| 10 | 10 | ||
| 11 | #define MIPSCPU_INT_BASE 16 | 11 | #define MIPSCPU_INT_BASE 16 |
| 12 | #define MIPS_CPU_RTLX_IRQ 0 | 12 | #define MIPS_CPU_RTLX_IRQ 0 |
| 13 | 13 | ||
| 14 | #define RTLX_VERSION 1 | 14 | #define RTLX_VERSION 2 |
| 15 | #define RTLX_xID 0x12345600 | 15 | #define RTLX_xID 0x12345600 |
| 16 | #define RTLX_ID (RTLX_xID | RTLX_VERSION) | 16 | #define RTLX_ID (RTLX_xID | RTLX_VERSION) |
| 17 | #define RTLX_CHANNELS 8 | 17 | #define RTLX_CHANNELS 8 |
| 18 | 18 | ||
| 19 | #define RTLX_BUFFER_SIZE 1024 | 19 | #define RTLX_CHANNEL_STDIO 0 |
| 20 | #define RTLX_CHANNEL_DBG 1 | ||
| 21 | #define RTLX_CHANNEL_SYSIO 2 | ||
| 20 | 22 | ||
| 21 | /* | 23 | extern int rtlx_open(int index, int can_sleep); |
| 22 | * lx_state bits | 24 | extern int rtlx_release(int index); |
| 23 | */ | 25 | extern ssize_t rtlx_read(int index, void *buff, size_t count, int user); |
| 24 | #define RTLX_STATE_OPENED 1UL | 26 | extern ssize_t rtlx_write(int index, void *buffer, size_t count, int user); |
| 27 | extern unsigned int rtlx_read_poll(int index, int can_sleep); | ||
| 28 | extern unsigned int rtlx_write_poll(int index); | ||
| 29 | |||
| 30 | enum rtlx_state { | ||
| 31 | RTLX_STATE_UNUSED, | ||
| 32 | RTLX_STATE_INITIALISED, | ||
| 33 | RTLX_STATE_REMOTE_READY, | ||
| 34 | RTLX_STATE_OPENED | ||
| 35 | }; | ||
| 36 | |||
| 37 | #define RTLX_BUFFER_SIZE 1024 | ||
| 25 | 38 | ||
| 26 | /* each channel supports read and write. | 39 | /* each channel supports read and write. |
| 27 | linux (vpe0) reads lx_buffer and writes rt_buffer | 40 | linux (vpe0) reads lx_buffer and writes rt_buffer |
| 28 | SP (vpe1) reads rt_buffer and writes lx_buffer | 41 | SP (vpe1) reads rt_buffer and writes lx_buffer |
| 29 | */ | 42 | */ |
| 30 | struct rtlx_channel { | 43 | struct rtlx_channel { |
| 31 | unsigned long lx_state; | 44 | enum rtlx_state rt_state; |
| 45 | enum rtlx_state lx_state; | ||
| 32 | 46 | ||
| 33 | int buffer_size; | 47 | int buffer_size; |
| 34 | 48 | ||
| @@ -38,15 +52,13 @@ struct rtlx_channel { | |||
| 38 | 52 | ||
| 39 | int lx_write, lx_read; | 53 | int lx_write, lx_read; |
| 40 | char *lx_buffer; | 54 | char *lx_buffer; |
| 41 | |||
| 42 | void *queues; | ||
| 43 | |||
| 44 | }; | 55 | }; |
| 45 | 56 | ||
| 46 | struct rtlx_info { | 57 | struct rtlx_info { |
| 47 | unsigned long id; | 58 | unsigned long id; |
| 59 | enum rtlx_state state; | ||
| 48 | 60 | ||
| 49 | struct rtlx_channel channel[RTLX_CHANNELS]; | 61 | struct rtlx_channel channel[RTLX_CHANNELS]; |
| 50 | }; | 62 | }; |
| 51 | 63 | ||
| 52 | #endif /* _RTLX_H_ */ | 64 | #endif /* __ASM_RTLX_H_ */ |
diff --git a/include/asm-mips/serial.h b/include/asm-mips/serial.h index 7b23664122..7196ceb0e9 100644 --- a/include/asm-mips/serial.h +++ b/include/asm-mips/serial.h | |||
| @@ -77,15 +77,15 @@ | |||
| 77 | #include <asm/it8712.h> | 77 | #include <asm/it8712.h> |
| 78 | #define ITE_SERIAL_PORT_DEFNS \ | 78 | #define ITE_SERIAL_PORT_DEFNS \ |
| 79 | { .baud_base = BASE_BAUD, .port = (IT8172_PCI_IO_BASE + IT_UART_BASE), \ | 79 | { .baud_base = BASE_BAUD, .port = (IT8172_PCI_IO_BASE + IT_UART_BASE), \ |
| 80 | .irq = IT8172_UART_IRQ, .flags = STD_COM_FLAGS, .type = 0x3 }, \ | 80 | .irq = IT8172_UART_IRQ, .flags = STD_COM_FLAGS, .port = PORT_16550 }, \ |
| 81 | { .baud_base = (24000000/(16*13)), .port = (IT8172_PCI_IO_BASE + IT8712_UART1_PORT), \ | 81 | { .baud_base = (24000000/(16*13)), .port = (IT8172_PCI_IO_BASE + IT8712_UART1_PORT), \ |
| 82 | .irq = IT8172_SERIRQ_4, .flags = STD_COM_FLAGS, .type = 0x3 }, \ | 82 | .irq = IT8172_SERIRQ_4, .flags = STD_COM_FLAGS, .port = PORT_16550 }, \ |
| 83 | /* Smart Card Reader 0 */ \ | 83 | /* Smart Card Reader 0 */ \ |
| 84 | { .baud_base = BASE_BAUD, .port = (IT8172_PCI_IO_BASE + IT_SCR0_BASE), \ | 84 | { .baud_base = BASE_BAUD, .port = (IT8172_PCI_IO_BASE + IT_SCR0_BASE), \ |
| 85 | .irq = IT8172_SCR0_IRQ, .flags = STD_COM_FLAGS, .type = 0x3 }, \ | 85 | .irq = IT8172_SCR0_IRQ, .flags = STD_COM_FLAGS, .port = PORT_16550 }, \ |
| 86 | /* Smart Card Reader 1 */ \ | 86 | /* Smart Card Reader 1 */ \ |
| 87 | { .baud_base = BASE_BAUD, .port = (IT8172_PCI_IO_BASE + IT_SCR1_BASE), \ | 87 | { .baud_base = BASE_BAUD, .port = (IT8172_PCI_IO_BASE + IT_SCR1_BASE), \ |
| 88 | .irq = IT8172_SCR1_IRQ, .flags = STD_COM_FLAGS, .type = 0x3 }, | 88 | .irq = IT8172_SCR1_IRQ, .flags = STD_COM_FLAGS, .port = PORT_16550 }, |
| 89 | #else | 89 | #else |
| 90 | #define ITE_SERIAL_PORT_DEFNS | 90 | #define ITE_SERIAL_PORT_DEFNS |
| 91 | #endif | 91 | #endif |
| @@ -95,10 +95,10 @@ | |||
| 95 | #include <asm/it8172/it8172_int.h> | 95 | #include <asm/it8172/it8172_int.h> |
| 96 | #define IVR_SERIAL_PORT_DEFNS \ | 96 | #define IVR_SERIAL_PORT_DEFNS \ |
| 97 | { .baud_base = BASE_BAUD, .port = (IT8172_PCI_IO_BASE + IT_UART_BASE), \ | 97 | { .baud_base = BASE_BAUD, .port = (IT8172_PCI_IO_BASE + IT_UART_BASE), \ |
| 98 | .irq = IT8172_UART_IRQ, .flags = STD_COM_FLAGS, .type = 0x3 }, \ | 98 | .irq = IT8172_UART_IRQ, .flags = STD_COM_FLAGS, .port = PORT_16550 }, \ |
| 99 | /* Smart Card Reader 1 */ \ | 99 | /* Smart Card Reader 1 */ \ |
| 100 | { .baud_base = BASE_BAUD, .port = (IT8172_PCI_IO_BASE + IT_SCR1_BASE), \ | 100 | { .baud_base = BASE_BAUD, .port = (IT8172_PCI_IO_BASE + IT_SCR1_BASE), \ |
| 101 | .irq = IT8172_SCR1_IRQ, .flags = STD_COM_FLAGS, .type = 0x3 }, | 101 | .irq = IT8172_SCR1_IRQ, .flags = STD_COM_FLAGS, .port = PORT_16550 }, |
| 102 | #else | 102 | #else |
| 103 | #define IVR_SERIAL_PORT_DEFNS | 103 | #define IVR_SERIAL_PORT_DEFNS |
| 104 | #endif | 104 | #endif |
diff --git a/include/asm-mips/sigcontext.h b/include/asm-mips/sigcontext.h index 8edabb0be2..cefa657dd0 100644 --- a/include/asm-mips/sigcontext.h +++ b/include/asm-mips/sigcontext.h | |||
| @@ -55,8 +55,14 @@ struct sigcontext { | |||
| 55 | struct sigcontext { | 55 | struct sigcontext { |
| 56 | unsigned long sc_regs[32]; | 56 | unsigned long sc_regs[32]; |
| 57 | unsigned long sc_fpregs[32]; | 57 | unsigned long sc_fpregs[32]; |
| 58 | unsigned long sc_hi[4]; | 58 | unsigned long sc_mdhi; |
| 59 | unsigned long sc_lo[4]; | 59 | unsigned long sc_hi1; |
| 60 | unsigned long sc_hi2; | ||
| 61 | unsigned long sc_hi3; | ||
| 62 | unsigned long sc_mdlo; | ||
| 63 | unsigned long sc_lo1; | ||
| 64 | unsigned long sc_lo2; | ||
| 65 | unsigned long sc_lo3; | ||
| 60 | unsigned long sc_pc; | 66 | unsigned long sc_pc; |
| 61 | unsigned int sc_fpc_csr; | 67 | unsigned int sc_fpc_csr; |
| 62 | unsigned int sc_used_math; | 68 | unsigned int sc_used_math; |
diff --git a/include/asm-mips/smp.h b/include/asm-mips/smp.h index 75c6fe7c21..e14e4b69de 100644 --- a/include/asm-mips/smp.h +++ b/include/asm-mips/smp.h | |||
| @@ -48,7 +48,6 @@ extern struct call_data_struct *call_data; | |||
| 48 | #define SMP_CALL_FUNCTION 0x2 | 48 | #define SMP_CALL_FUNCTION 0x2 |
| 49 | 49 | ||
| 50 | extern cpumask_t phys_cpu_present_map; | 50 | extern cpumask_t phys_cpu_present_map; |
| 51 | extern cpumask_t cpu_online_map; | ||
| 52 | #define cpu_possible_map phys_cpu_present_map | 51 | #define cpu_possible_map phys_cpu_present_map |
| 53 | 52 | ||
| 54 | extern cpumask_t cpu_callout_map; | 53 | extern cpumask_t cpu_callout_map; |
| @@ -86,9 +85,9 @@ extern void prom_init_secondary(void); | |||
| 86 | extern void plat_smp_setup(void); | 85 | extern void plat_smp_setup(void); |
| 87 | 86 | ||
| 88 | /* | 87 | /* |
| 89 | * Called after init_IRQ but before __cpu_up. | 88 | * Called in smp_prepare_cpus. |
| 90 | */ | 89 | */ |
| 91 | extern void prom_prepare_cpus(unsigned int max_cpus); | 90 | extern void plat_prepare_cpus(unsigned int max_cpus); |
| 92 | 91 | ||
| 93 | /* | 92 | /* |
| 94 | * Last chance for the board code to finish SMP initialization before | 93 | * Last chance for the board code to finish SMP initialization before |
diff --git a/include/asm-mips/smtc.h b/include/asm-mips/smtc.h new file mode 100644 index 0000000000..e1941d1b87 --- /dev/null +++ b/include/asm-mips/smtc.h | |||
| @@ -0,0 +1,55 @@ | |||
| 1 | #ifndef _ASM_SMTC_MT_H | ||
| 2 | #define _ASM_SMTC_MT_H | ||
| 3 | |||
| 4 | /* | ||
| 5 | * Definitions for SMTC multitasking on MIPS MT cores | ||
| 6 | */ | ||
| 7 | |||
| 8 | #include <asm/mips_mt.h> | ||
| 9 | |||
| 10 | /* | ||
| 11 | * System-wide SMTC status information | ||
| 12 | */ | ||
| 13 | |||
| 14 | extern unsigned int smtc_status; | ||
| 15 | |||
| 16 | #define SMTC_TLB_SHARED 0x00000001 | ||
| 17 | #define SMTC_MTC_ACTIVE 0x00000002 | ||
| 18 | |||
| 19 | /* | ||
| 20 | * TLB/ASID Management information | ||
| 21 | */ | ||
| 22 | |||
| 23 | #define MAX_SMTC_TLBS 2 | ||
| 24 | #define MAX_SMTC_ASIDS 256 | ||
| 25 | #if NR_CPUS <= 8 | ||
| 26 | typedef char asiduse; | ||
| 27 | #else | ||
| 28 | #if NR_CPUS <= 16 | ||
| 29 | typedef short asiduse; | ||
| 30 | #else | ||
| 31 | typedef long asiduse; | ||
| 32 | #endif | ||
| 33 | #endif | ||
| 34 | |||
| 35 | extern asiduse smtc_live_asid[MAX_SMTC_TLBS][MAX_SMTC_ASIDS]; | ||
| 36 | |||
| 37 | void smtc_get_new_mmu_context(struct mm_struct *mm, unsigned long cpu); | ||
| 38 | |||
| 39 | void smtc_flush_tlb_asid(unsigned long asid); | ||
| 40 | extern int mipsmt_build_cpu_map(int startslot); | ||
| 41 | extern void mipsmt_prepare_cpus(void); | ||
| 42 | extern void smtc_smp_finish(void); | ||
| 43 | extern void smtc_boot_secondary(int cpu, struct task_struct *t); | ||
| 44 | |||
| 45 | /* | ||
| 46 | * Sharing the TLB between multiple VPEs means that the | ||
| 47 | * "random" index selection function is not allowed to | ||
| 48 | * select the current value of the Index register. To | ||
| 49 | * avoid additional TLB pressure, the Index registers | ||
| 50 | * are "parked" with an non-Valid value. | ||
| 51 | */ | ||
| 52 | |||
| 53 | #define PARKED_INDEX ((unsigned int)0x80000000) | ||
| 54 | |||
| 55 | #endif /* _ASM_SMTC_MT_H */ | ||
diff --git a/include/asm-mips/smtc_ipi.h b/include/asm-mips/smtc_ipi.h new file mode 100644 index 0000000000..f22c3e2f99 --- /dev/null +++ b/include/asm-mips/smtc_ipi.h | |||
| @@ -0,0 +1,118 @@ | |||
| 1 | /* | ||
| 2 | * Definitions used in MIPS MT SMTC "Interprocessor Interrupt" code. | ||
| 3 | */ | ||
| 4 | #ifndef __ASM_SMTC_IPI_H | ||
| 5 | #define __ASM_SMTC_IPI_H | ||
| 6 | |||
| 7 | //#define SMTC_IPI_DEBUG | ||
| 8 | |||
| 9 | #ifdef SMTC_IPI_DEBUG | ||
| 10 | #include <asm/mipsregs.h> | ||
| 11 | #include <asm/mipsmtregs.h> | ||
| 12 | #endif /* SMTC_IPI_DEBUG */ | ||
| 13 | |||
| 14 | /* | ||
| 15 | * An IPI "message" | ||
| 16 | */ | ||
| 17 | |||
| 18 | struct smtc_ipi { | ||
| 19 | struct smtc_ipi *flink; | ||
| 20 | int type; | ||
| 21 | void *arg; | ||
| 22 | int dest; | ||
| 23 | #ifdef SMTC_IPI_DEBUG | ||
| 24 | int sender; | ||
| 25 | long stamp; | ||
| 26 | #endif /* SMTC_IPI_DEBUG */ | ||
| 27 | }; | ||
| 28 | |||
| 29 | /* | ||
| 30 | * Defined IPI Types | ||
| 31 | */ | ||
| 32 | |||
| 33 | #define LINUX_SMP_IPI 1 | ||
| 34 | #define SMTC_CLOCK_TICK 2 | ||
| 35 | |||
| 36 | /* | ||
| 37 | * A queue of IPI messages | ||
| 38 | */ | ||
| 39 | |||
| 40 | struct smtc_ipi_q { | ||
| 41 | struct smtc_ipi *head; | ||
| 42 | spinlock_t lock; | ||
| 43 | struct smtc_ipi *tail; | ||
| 44 | int depth; | ||
| 45 | }; | ||
| 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) | ||
| 51 | { | ||
| 52 | long flags; | ||
| 53 | |||
| 54 | spin_lock_irqsave(&q->lock, flags); | ||
| 55 | if (q->head == NULL) | ||
| 56 | q->head = q->tail = p; | ||
| 57 | else | ||
| 58 | q->tail->flink = p; | ||
| 59 | p->flink = NULL; | ||
| 60 | q->tail = p; | ||
| 61 | q->depth++; | ||
| 62 | #ifdef SMTC_IPI_DEBUG | ||
| 63 | p->sender = read_c0_tcbind(); | ||
| 64 | p->stamp = read_c0_count(); | ||
| 65 | #endif /* SMTC_IPI_DEBUG */ | ||
| 66 | spin_unlock_irqrestore(&q->lock, flags); | ||
| 67 | } | ||
| 68 | |||
| 69 | static inline struct smtc_ipi *smtc_ipi_dq(struct smtc_ipi_q *q) | ||
| 70 | { | ||
| 71 | struct smtc_ipi *p; | ||
| 72 | long flags; | ||
| 73 | |||
| 74 | spin_lock_irqsave(&q->lock, flags); | ||
| 75 | if (q->head == NULL) | ||
| 76 | p = NULL; | ||
| 77 | else { | ||
| 78 | p = q->head; | ||
| 79 | q->head = q->head->flink; | ||
| 80 | q->depth--; | ||
| 81 | /* Arguably unnecessary, but leaves queue cleaner */ | ||
| 82 | if (q->head == NULL) | ||
| 83 | q->tail = NULL; | ||
| 84 | } | ||
| 85 | spin_unlock_irqrestore(&q->lock, flags); | ||
| 86 | return p; | ||
| 87 | } | ||
| 88 | |||
| 89 | static inline void smtc_ipi_req(struct smtc_ipi_q *q, struct smtc_ipi *p) | ||
| 90 | { | ||
| 91 | long flags; | ||
| 92 | |||
| 93 | spin_lock_irqsave(&q->lock, flags); | ||
| 94 | if (q->head == NULL) { | ||
| 95 | q->head = q->tail = p; | ||
| 96 | p->flink = NULL; | ||
| 97 | } else { | ||
| 98 | p->flink = q->head; | ||
| 99 | q->head = p; | ||
| 100 | } | ||
| 101 | q->depth++; | ||
| 102 | spin_unlock_irqrestore(&q->lock, flags); | ||
| 103 | } | ||
| 104 | |||
| 105 | static inline int smtc_ipi_qdepth(struct smtc_ipi_q *q) | ||
| 106 | { | ||
| 107 | long flags; | ||
| 108 | int retval; | ||
| 109 | |||
| 110 | spin_lock_irqsave(&q->lock, flags); | ||
| 111 | retval = q->depth; | ||
| 112 | spin_unlock_irqrestore(&q->lock, flags); | ||
| 113 | return retval; | ||
| 114 | } | ||
| 115 | |||
| 116 | extern void smtc_send_ipi(int cpu, int type, unsigned int action); | ||
| 117 | |||
| 118 | #endif /* __ASM_SMTC_IPI_H */ | ||
diff --git a/include/asm-mips/smtc_proc.h b/include/asm-mips/smtc_proc.h new file mode 100644 index 0000000000..25da651f1f --- /dev/null +++ b/include/asm-mips/smtc_proc.h | |||
| @@ -0,0 +1,23 @@ | |||
| 1 | /* | ||
| 2 | * Definitions for SMTC /proc entries | ||
| 3 | * Copyright(C) 2005 MIPS Technologies Inc. | ||
| 4 | */ | ||
| 5 | #ifndef __ASM_SMTC_PROC_H | ||
| 6 | #define __ASM_SMTC_PROC_H | ||
| 7 | |||
| 8 | /* | ||
| 9 | * per-"CPU" statistics | ||
| 10 | */ | ||
| 11 | |||
| 12 | struct smtc_cpu_proc { | ||
| 13 | unsigned long timerints; | ||
| 14 | unsigned long selfipis; | ||
| 15 | }; | ||
| 16 | |||
| 17 | extern struct smtc_cpu_proc smtc_cpu_stats[NR_CPUS]; | ||
| 18 | |||
| 19 | /* Count of number of recoveries of "stolen" FPU access rights on 34K */ | ||
| 20 | |||
| 21 | extern atomic_t smtc_fpu_recoveries; | ||
| 22 | |||
| 23 | #endif /* __ASM_SMTC_PROC_H */ | ||
diff --git a/include/asm-mips/sparsemem.h b/include/asm-mips/sparsemem.h new file mode 100644 index 0000000000..795ac6c232 --- /dev/null +++ b/include/asm-mips/sparsemem.h | |||
| @@ -0,0 +1,14 @@ | |||
| 1 | #ifndef _MIPS_SPARSEMEM_H | ||
| 2 | #define _MIPS_SPARSEMEM_H | ||
| 3 | #ifdef CONFIG_SPARSEMEM | ||
| 4 | |||
| 5 | /* | ||
| 6 | * SECTION_SIZE_BITS 2^N: how big each section will be | ||
| 7 | * MAX_PHYSMEM_BITS 2^N: how much memory we can have in that space | ||
| 8 | */ | ||
| 9 | #define SECTION_SIZE_BITS 28 | ||
| 10 | #define MAX_PHYSMEM_BITS 35 | ||
| 11 | |||
| 12 | #endif /* CONFIG_SPARSEMEM */ | ||
| 13 | #endif /* _MIPS_SPARSEMEM_H */ | ||
| 14 | |||
diff --git a/include/asm-mips/stackframe.h b/include/asm-mips/stackframe.h index 2acf3e844f..c4856a8749 100644 --- a/include/asm-mips/stackframe.h +++ b/include/asm-mips/stackframe.h | |||
| @@ -14,9 +14,14 @@ | |||
| 14 | #include <linux/threads.h> | 14 | #include <linux/threads.h> |
| 15 | 15 | ||
| 16 | #include <asm/asm.h> | 16 | #include <asm/asm.h> |
| 17 | #include <asm/asmmacro.h> | ||
| 17 | #include <asm/mipsregs.h> | 18 | #include <asm/mipsregs.h> |
| 18 | #include <asm/asm-offsets.h> | 19 | #include <asm/asm-offsets.h> |
| 19 | 20 | ||
| 21 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 22 | #include <asm/mipsmtregs.h> | ||
| 23 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 24 | |||
| 20 | .macro SAVE_AT | 25 | .macro SAVE_AT |
| 21 | .set push | 26 | .set push |
| 22 | .set noat | 27 | .set noat |
| @@ -57,13 +62,30 @@ | |||
| 57 | #ifdef CONFIG_SMP | 62 | #ifdef CONFIG_SMP |
| 58 | .macro get_saved_sp /* SMP variation */ | 63 | .macro get_saved_sp /* SMP variation */ |
| 59 | #ifdef CONFIG_32BIT | 64 | #ifdef CONFIG_32BIT |
| 65 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 66 | .set mips32 | ||
| 67 | mfc0 k0, CP0_TCBIND; | ||
| 68 | .set mips0 | ||
| 69 | lui k1, %hi(kernelsp) | ||
| 70 | srl k0, k0, 19 | ||
| 71 | /* No need to shift down and up to clear bits 0-1 */ | ||
| 72 | #else | ||
| 60 | mfc0 k0, CP0_CONTEXT | 73 | mfc0 k0, CP0_CONTEXT |
| 61 | lui k1, %hi(kernelsp) | 74 | lui k1, %hi(kernelsp) |
| 62 | srl k0, k0, 23 | 75 | srl k0, k0, 23 |
| 76 | #endif | ||
| 63 | addu k1, k0 | 77 | addu k1, k0 |
| 64 | LONG_L k1, %lo(kernelsp)(k1) | 78 | LONG_L k1, %lo(kernelsp)(k1) |
| 65 | #endif | 79 | #endif |
| 66 | #ifdef CONFIG_64BIT | 80 | #ifdef CONFIG_64BIT |
| 81 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 82 | .set mips64 | ||
| 83 | mfc0 k0, CP0_TCBIND; | ||
| 84 | .set mips0 | ||
| 85 | lui k0, %highest(kernelsp) | ||
| 86 | dsrl k1, 19 | ||
| 87 | /* No need to shift down and up to clear bits 0-2 */ | ||
| 88 | #else | ||
| 67 | MFC0 k1, CP0_CONTEXT | 89 | MFC0 k1, CP0_CONTEXT |
| 68 | lui k0, %highest(kernelsp) | 90 | lui k0, %highest(kernelsp) |
| 69 | dsrl k1, 23 | 91 | dsrl k1, 23 |
| @@ -71,20 +93,31 @@ | |||
| 71 | dsll k0, k0, 16 | 93 | dsll k0, k0, 16 |
| 72 | daddiu k0, %hi(kernelsp) | 94 | daddiu k0, %hi(kernelsp) |
| 73 | dsll k0, k0, 16 | 95 | dsll k0, k0, 16 |
| 96 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 74 | daddu k1, k1, k0 | 97 | daddu k1, k1, k0 |
| 75 | LONG_L k1, %lo(kernelsp)(k1) | 98 | LONG_L k1, %lo(kernelsp)(k1) |
| 76 | #endif | 99 | #endif /* CONFIG_64BIT */ |
| 77 | .endm | 100 | .endm |
| 78 | 101 | ||
| 79 | .macro set_saved_sp stackp temp temp2 | 102 | .macro set_saved_sp stackp temp temp2 |
| 80 | #ifdef CONFIG_32BIT | 103 | #ifdef CONFIG_32BIT |
| 104 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 105 | mfc0 \temp, CP0_TCBIND | ||
| 106 | srl \temp, 19 | ||
| 107 | #else | ||
| 81 | mfc0 \temp, CP0_CONTEXT | 108 | mfc0 \temp, CP0_CONTEXT |
| 82 | srl \temp, 23 | 109 | srl \temp, 23 |
| 83 | #endif | 110 | #endif |
| 111 | #endif | ||
| 84 | #ifdef CONFIG_64BIT | 112 | #ifdef CONFIG_64BIT |
| 113 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 114 | mfc0 \temp, CP0_TCBIND | ||
| 115 | dsrl \temp, 19 | ||
| 116 | #else | ||
| 85 | MFC0 \temp, CP0_CONTEXT | 117 | MFC0 \temp, CP0_CONTEXT |
| 86 | dsrl \temp, 23 | 118 | dsrl \temp, 23 |
| 87 | #endif | 119 | #endif |
| 120 | #endif | ||
| 88 | LONG_S \stackp, kernelsp(\temp) | 121 | LONG_S \stackp, kernelsp(\temp) |
| 89 | .endm | 122 | .endm |
| 90 | #else | 123 | #else |
| @@ -122,10 +155,25 @@ | |||
| 122 | PTR_SUBU sp, k1, PT_SIZE | 155 | PTR_SUBU sp, k1, PT_SIZE |
| 123 | LONG_S k0, PT_R29(sp) | 156 | LONG_S k0, PT_R29(sp) |
| 124 | LONG_S $3, PT_R3(sp) | 157 | LONG_S $3, PT_R3(sp) |
| 158 | /* | ||
| 159 | * You might think that you don't need to save $0, | ||
| 160 | * but the FPU emulator and gdb remote debug stub | ||
| 161 | * need it to operate correctly | ||
| 162 | */ | ||
| 125 | LONG_S $0, PT_R0(sp) | 163 | LONG_S $0, PT_R0(sp) |
| 126 | mfc0 v1, CP0_STATUS | 164 | mfc0 v1, CP0_STATUS |
| 127 | LONG_S $2, PT_R2(sp) | 165 | LONG_S $2, PT_R2(sp) |
| 128 | LONG_S v1, PT_STATUS(sp) | 166 | LONG_S v1, PT_STATUS(sp) |
| 167 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 168 | /* | ||
| 169 | * Ideally, these instructions would be shuffled in | ||
| 170 | * to cover the pipeline delay. | ||
| 171 | */ | ||
| 172 | .set mips32 | ||
| 173 | mfc0 v1, CP0_TCSTATUS | ||
| 174 | .set mips0 | ||
| 175 | LONG_S v1, PT_TCSTATUS(sp) | ||
| 176 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 129 | LONG_S $4, PT_R4(sp) | 177 | LONG_S $4, PT_R4(sp) |
| 130 | mfc0 v1, CP0_CAUSE | 178 | mfc0 v1, CP0_CAUSE |
| 131 | LONG_S $5, PT_R5(sp) | 179 | LONG_S $5, PT_R5(sp) |
| @@ -234,14 +282,36 @@ | |||
| 234 | .endm | 282 | .endm |
| 235 | 283 | ||
| 236 | #else | 284 | #else |
| 285 | /* | ||
| 286 | * For SMTC kernel, global IE should be left set, and interrupts | ||
| 287 | * controlled exclusively via IXMT. | ||
| 288 | */ | ||
| 237 | 289 | ||
| 290 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 291 | #define STATMASK 0x1e | ||
| 292 | #else | ||
| 293 | #define STATMASK 0x1f | ||
| 294 | #endif | ||
| 238 | .macro RESTORE_SOME | 295 | .macro RESTORE_SOME |
| 239 | .set push | 296 | .set push |
| 240 | .set reorder | 297 | .set reorder |
| 241 | .set noat | 298 | .set noat |
| 299 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 300 | .set mips32r2 | ||
| 301 | /* | ||
| 302 | * This may not really be necessary if ints are already | ||
| 303 | * inhibited here. | ||
| 304 | */ | ||
| 305 | mfc0 v0, CP0_TCSTATUS | ||
| 306 | ori v0, TCSTATUS_IXMT | ||
| 307 | mtc0 v0, CP0_TCSTATUS | ||
| 308 | ehb | ||
| 309 | DMT 5 # dmt a1 | ||
| 310 | jal mips_ihb | ||
| 311 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 242 | mfc0 a0, CP0_STATUS | 312 | mfc0 a0, CP0_STATUS |
| 243 | ori a0, 0x1f | 313 | ori a0, STATMASK |
| 244 | xori a0, 0x1f | 314 | xori a0, STATMASK |
| 245 | mtc0 a0, CP0_STATUS | 315 | mtc0 a0, CP0_STATUS |
| 246 | li v1, 0xff00 | 316 | li v1, 0xff00 |
| 247 | and a0, v1 | 317 | and a0, v1 |
| @@ -250,6 +320,26 @@ | |||
| 250 | and v0, v1 | 320 | and v0, v1 |
| 251 | or v0, a0 | 321 | or v0, a0 |
| 252 | mtc0 v0, CP0_STATUS | 322 | mtc0 v0, CP0_STATUS |
| 323 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 324 | /* | ||
| 325 | * Only after EXL/ERL have been restored to status can we | ||
| 326 | * restore TCStatus.IXMT. | ||
| 327 | */ | ||
| 328 | LONG_L v1, PT_TCSTATUS(sp) | ||
| 329 | ehb | ||
| 330 | mfc0 v0, CP0_TCSTATUS | ||
| 331 | andi v1, TCSTATUS_IXMT | ||
| 332 | /* We know that TCStatua.IXMT should be set from above */ | ||
| 333 | xori v0, v0, TCSTATUS_IXMT | ||
| 334 | or v0, v0, v1 | ||
| 335 | mtc0 v0, CP0_TCSTATUS | ||
| 336 | ehb | ||
| 337 | andi a1, a1, VPECONTROL_TE | ||
| 338 | beqz a1, 1f | ||
| 339 | emt | ||
| 340 | 1: | ||
| 341 | .set mips0 | ||
| 342 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 253 | LONG_L v1, PT_EPC(sp) | 343 | LONG_L v1, PT_EPC(sp) |
| 254 | MTC0 v1, CP0_EPC | 344 | MTC0 v1, CP0_EPC |
| 255 | LONG_L $31, PT_R31(sp) | 345 | LONG_L $31, PT_R31(sp) |
| @@ -302,11 +392,33 @@ | |||
| 302 | * Set cp0 enable bit as sign that we're running on the kernel stack | 392 | * Set cp0 enable bit as sign that we're running on the kernel stack |
| 303 | */ | 393 | */ |
| 304 | .macro CLI | 394 | .macro CLI |
| 395 | #if !defined(CONFIG_MIPS_MT_SMTC) | ||
| 305 | mfc0 t0, CP0_STATUS | 396 | mfc0 t0, CP0_STATUS |
| 306 | li t1, ST0_CU0 | 0x1f | 397 | li t1, ST0_CU0 | 0x1f |
| 307 | or t0, t1 | 398 | or t0, t1 |
| 308 | xori t0, 0x1f | 399 | xori t0, 0x1f |
| 309 | mtc0 t0, CP0_STATUS | 400 | mtc0 t0, CP0_STATUS |
| 401 | #else /* CONFIG_MIPS_MT_SMTC */ | ||
| 402 | /* | ||
| 403 | * For SMTC, we need to set privilege | ||
| 404 | * and disable interrupts only for the | ||
| 405 | * current TC, using the TCStatus register. | ||
| 406 | */ | ||
| 407 | mfc0 t0,CP0_TCSTATUS | ||
| 408 | /* Fortunately CU 0 is in the same place in both registers */ | ||
| 409 | /* Set TCU0, TMX, TKSU (for later inversion) and IXMT */ | ||
| 410 | li t1, ST0_CU0 | 0x08001c00 | ||
| 411 | or t0,t1 | ||
| 412 | /* Clear TKSU, leave IXMT */ | ||
| 413 | xori t0, 0x00001800 | ||
| 414 | mtc0 t0, CP0_TCSTATUS | ||
| 415 | ehb | ||
| 416 | /* We need to leave the global IE bit set, but clear EXL...*/ | ||
| 417 | mfc0 t0, CP0_STATUS | ||
| 418 | ori t0, ST0_EXL | ST0_ERL | ||
| 419 | xori t0, ST0_EXL | ST0_ERL | ||
| 420 | mtc0 t0, CP0_STATUS | ||
| 421 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 310 | irq_disable_hazard | 422 | irq_disable_hazard |
| 311 | .endm | 423 | .endm |
| 312 | 424 | ||
| @@ -315,11 +427,35 @@ | |||
| 315 | * Set cp0 enable bit as sign that we're running on the kernel stack | 427 | * Set cp0 enable bit as sign that we're running on the kernel stack |
| 316 | */ | 428 | */ |
| 317 | .macro STI | 429 | .macro STI |
| 430 | #if !defined(CONFIG_MIPS_MT_SMTC) | ||
| 318 | mfc0 t0, CP0_STATUS | 431 | mfc0 t0, CP0_STATUS |
| 319 | li t1, ST0_CU0 | 0x1f | 432 | li t1, ST0_CU0 | 0x1f |
| 320 | or t0, t1 | 433 | or t0, t1 |
| 321 | xori t0, 0x1e | 434 | xori t0, 0x1e |
| 322 | mtc0 t0, CP0_STATUS | 435 | mtc0 t0, CP0_STATUS |
| 436 | #else /* CONFIG_MIPS_MT_SMTC */ | ||
| 437 | /* | ||
| 438 | * For SMTC, we need to set privilege | ||
| 439 | * and enable interrupts only for the | ||
| 440 | * current TC, using the TCStatus register. | ||
| 441 | */ | ||
| 442 | ehb | ||
| 443 | mfc0 t0,CP0_TCSTATUS | ||
| 444 | /* Fortunately CU 0 is in the same place in both registers */ | ||
| 445 | /* Set TCU0, TKSU (for later inversion) and IXMT */ | ||
| 446 | li t1, ST0_CU0 | 0x08001c00 | ||
| 447 | or t0,t1 | ||
| 448 | /* Clear TKSU *and* IXMT */ | ||
| 449 | xori t0, 0x00001c00 | ||
| 450 | mtc0 t0, CP0_TCSTATUS | ||
| 451 | ehb | ||
| 452 | /* We need to leave the global IE bit set, but clear EXL...*/ | ||
| 453 | mfc0 t0, CP0_STATUS | ||
| 454 | ori t0, ST0_EXL | ||
| 455 | xori t0, ST0_EXL | ||
| 456 | mtc0 t0, CP0_STATUS | ||
| 457 | /* irq_enable_hazard below should expand to EHB for 24K/34K cpus */ | ||
| 458 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 323 | irq_enable_hazard | 459 | irq_enable_hazard |
| 324 | .endm | 460 | .endm |
| 325 | 461 | ||
| @@ -328,11 +464,56 @@ | |||
| 328 | * Set cp0 enable bit as sign that we're running on the kernel stack | 464 | * Set cp0 enable bit as sign that we're running on the kernel stack |
| 329 | */ | 465 | */ |
| 330 | .macro KMODE | 466 | .macro KMODE |
| 467 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 468 | /* | ||
| 469 | * This gets baroque in SMTC. We want to | ||
| 470 | * protect the non-atomic clearing of EXL | ||
| 471 | * with DMT/EMT, but we don't want to take | ||
| 472 | * an interrupt while DMT is still in effect. | ||
| 473 | */ | ||
| 474 | |||
| 475 | /* KMODE gets invoked from both reorder and noreorder code */ | ||
| 476 | .set push | ||
| 477 | .set mips32r2 | ||
| 478 | .set noreorder | ||
| 479 | mfc0 v0, CP0_TCSTATUS | ||
| 480 | andi v1, v0, TCSTATUS_IXMT | ||
| 481 | ori v0, TCSTATUS_IXMT | ||
| 482 | mtc0 v0, CP0_TCSTATUS | ||
| 483 | ehb | ||
| 484 | DMT 2 # dmt v0 | ||
| 485 | /* | ||
| 486 | * We don't know a priori if ra is "live" | ||
| 487 | */ | ||
| 488 | move t0, ra | ||
| 489 | jal mips_ihb | ||
| 490 | nop /* delay slot */ | ||
| 491 | move ra, t0 | ||
| 492 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 331 | mfc0 t0, CP0_STATUS | 493 | mfc0 t0, CP0_STATUS |
| 332 | li t1, ST0_CU0 | 0x1e | 494 | li t1, ST0_CU0 | 0x1e |
| 333 | or t0, t1 | 495 | or t0, t1 |
| 334 | xori t0, 0x1e | 496 | xori t0, 0x1e |
| 335 | mtc0 t0, CP0_STATUS | 497 | mtc0 t0, CP0_STATUS |
| 498 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 499 | ehb | ||
| 500 | andi v0, v0, VPECONTROL_TE | ||
| 501 | beqz v0, 2f | ||
| 502 | nop /* delay slot */ | ||
| 503 | emt | ||
| 504 | 2: | ||
| 505 | mfc0 v0, CP0_TCSTATUS | ||
| 506 | /* Clear IXMT, then OR in previous value */ | ||
| 507 | ori v0, TCSTATUS_IXMT | ||
| 508 | xori v0, TCSTATUS_IXMT | ||
| 509 | or v0, v1, v0 | ||
| 510 | mtc0 v0, CP0_TCSTATUS | ||
| 511 | /* | ||
| 512 | * irq_disable_hazard below should expand to EHB | ||
| 513 | * on 24K/34K CPUS | ||
| 514 | */ | ||
| 515 | .set pop | ||
| 516 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 336 | irq_disable_hazard | 517 | irq_disable_hazard |
| 337 | .endm | 518 | .endm |
| 338 | 519 | ||
diff --git a/include/asm-mips/system.h b/include/asm-mips/system.h index 4097fac5ac..261f71d16a 100644 --- a/include/asm-mips/system.h +++ b/include/asm-mips/system.h | |||
| @@ -155,6 +155,37 @@ extern asmlinkage void *resume(void *last, void *next, void *next_ti); | |||
| 155 | 155 | ||
| 156 | struct task_struct; | 156 | struct task_struct; |
| 157 | 157 | ||
| 158 | #ifdef CONFIG_MIPS_MT_FPAFF | ||
| 159 | |||
| 160 | /* | ||
| 161 | * Handle the scheduler resume end of FPU affinity management. We do this | ||
| 162 | * inline to try to keep the overhead down. If we have been forced to run on | ||
| 163 | * a "CPU" with an FPU because of a previous high level of FP computation, | ||
| 164 | * but did not actually use the FPU during the most recent time-slice (CU1 | ||
| 165 | * isn't set), we undo the restriction on cpus_allowed. | ||
| 166 | * | ||
| 167 | * We're not calling set_cpus_allowed() here, because we have no need to | ||
| 168 | * force prompt migration - we're already switching the current CPU to a | ||
| 169 | * different thread. | ||
| 170 | */ | ||
| 171 | |||
| 172 | #define switch_to(prev,next,last) \ | ||
| 173 | do { \ | ||
| 174 | if (cpu_has_fpu && \ | ||
| 175 | (prev->thread.mflags & MF_FPUBOUND) && \ | ||
| 176 | (!(KSTK_STATUS(prev) & ST0_CU1))) { \ | ||
| 177 | prev->thread.mflags &= ~MF_FPUBOUND; \ | ||
| 178 | prev->cpus_allowed = prev->thread.user_cpus_allowed; \ | ||
| 179 | } \ | ||
| 180 | if (cpu_has_dsp) \ | ||
| 181 | __save_dsp(prev); \ | ||
| 182 | next->thread.emulated_fp = 0; \ | ||
| 183 | (last) = resume(prev, next, next->thread_info); \ | ||
| 184 | if (cpu_has_dsp) \ | ||
| 185 | __restore_dsp(current); \ | ||
| 186 | } while(0) | ||
| 187 | |||
| 188 | #else | ||
| 158 | #define switch_to(prev,next,last) \ | 189 | #define switch_to(prev,next,last) \ |
| 159 | do { \ | 190 | do { \ |
| 160 | if (cpu_has_dsp) \ | 191 | if (cpu_has_dsp) \ |
| @@ -163,6 +194,7 @@ do { \ | |||
| 163 | if (cpu_has_dsp) \ | 194 | if (cpu_has_dsp) \ |
| 164 | __restore_dsp(current); \ | 195 | __restore_dsp(current); \ |
| 165 | } while(0) | 196 | } while(0) |
| 197 | #endif | ||
| 166 | 198 | ||
| 167 | /* | 199 | /* |
| 168 | * On SMP systems, when the scheduler does migration-cost autodetection, | 200 | * On SMP systems, when the scheduler does migration-cost autodetection, |
| @@ -440,8 +472,8 @@ static inline unsigned long __cmpxchg(volatile void * ptr, unsigned long old, | |||
| 440 | extern void set_handler (unsigned long offset, void *addr, unsigned long len); | 472 | extern void set_handler (unsigned long offset, void *addr, unsigned long len); |
| 441 | extern void set_uncached_handler (unsigned long offset, void *addr, unsigned long len); | 473 | extern void set_uncached_handler (unsigned long offset, void *addr, unsigned long len); |
| 442 | extern void *set_vi_handler (int n, void *addr); | 474 | extern void *set_vi_handler (int n, void *addr); |
| 443 | extern void *set_vi_srs_handler (int n, void *addr, int regset); | ||
| 444 | extern void *set_except_vector(int n, void *addr); | 475 | extern void *set_except_vector(int n, void *addr); |
| 476 | extern unsigned long ebase; | ||
| 445 | extern void per_cpu_trap_init(void); | 477 | extern void per_cpu_trap_init(void); |
| 446 | 478 | ||
| 447 | extern NORET_TYPE void die(const char *, struct pt_regs *); | 479 | extern NORET_TYPE void die(const char *, struct pt_regs *); |
diff --git a/include/asm-mips/unistd.h b/include/asm-mips/unistd.h index b5c78a4a01..1068fe9a0a 100644 --- a/include/asm-mips/unistd.h +++ b/include/asm-mips/unistd.h | |||
| @@ -324,16 +324,18 @@ | |||
| 324 | #define __NR_pselect6 (__NR_Linux + 301) | 324 | #define __NR_pselect6 (__NR_Linux + 301) |
| 325 | #define __NR_ppoll (__NR_Linux + 302) | 325 | #define __NR_ppoll (__NR_Linux + 302) |
| 326 | #define __NR_unshare (__NR_Linux + 303) | 326 | #define __NR_unshare (__NR_Linux + 303) |
| 327 | #define __NR_splice (__NR_Linux + 304) | ||
| 328 | #define __NR_sync_file_range (__NR_Linux + 305) | ||
| 327 | 329 | ||
| 328 | /* | 330 | /* |
| 329 | * Offset of the last Linux o32 flavoured syscall | 331 | * Offset of the last Linux o32 flavoured syscall |
| 330 | */ | 332 | */ |
| 331 | #define __NR_Linux_syscalls 303 | 333 | #define __NR_Linux_syscalls 305 |
| 332 | 334 | ||
| 333 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */ | 335 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */ |
| 334 | 336 | ||
| 335 | #define __NR_O32_Linux 4000 | 337 | #define __NR_O32_Linux 4000 |
| 336 | #define __NR_O32_Linux_syscalls 303 | 338 | #define __NR_O32_Linux_syscalls 305 |
| 337 | 339 | ||
| 338 | #if _MIPS_SIM == _MIPS_SIM_ABI64 | 340 | #if _MIPS_SIM == _MIPS_SIM_ABI64 |
| 339 | 341 | ||
| @@ -604,16 +606,18 @@ | |||
| 604 | #define __NR_pselect6 (__NR_Linux + 260) | 606 | #define __NR_pselect6 (__NR_Linux + 260) |
| 605 | #define __NR_ppoll (__NR_Linux + 261) | 607 | #define __NR_ppoll (__NR_Linux + 261) |
| 606 | #define __NR_unshare (__NR_Linux + 262) | 608 | #define __NR_unshare (__NR_Linux + 262) |
| 609 | #define __NR_splice (__NR_Linux + 263) | ||
| 610 | #define __NR_sync_file_range (__NR_Linux + 264) | ||
| 607 | 611 | ||
| 608 | /* | 612 | /* |
| 609 | * Offset of the last Linux 64-bit flavoured syscall | 613 | * Offset of the last Linux 64-bit flavoured syscall |
| 610 | */ | 614 | */ |
| 611 | #define __NR_Linux_syscalls 262 | 615 | #define __NR_Linux_syscalls 264 |
| 612 | 616 | ||
| 613 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */ | 617 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */ |
| 614 | 618 | ||
| 615 | #define __NR_64_Linux 5000 | 619 | #define __NR_64_Linux 5000 |
| 616 | #define __NR_64_Linux_syscalls 262 | 620 | #define __NR_64_Linux_syscalls 264 |
| 617 | 621 | ||
| 618 | #if _MIPS_SIM == _MIPS_SIM_NABI32 | 622 | #if _MIPS_SIM == _MIPS_SIM_NABI32 |
| 619 | 623 | ||
| @@ -888,16 +892,18 @@ | |||
| 888 | #define __NR_pselect6 (__NR_Linux + 264) | 892 | #define __NR_pselect6 (__NR_Linux + 264) |
| 889 | #define __NR_ppoll (__NR_Linux + 265) | 893 | #define __NR_ppoll (__NR_Linux + 265) |
| 890 | #define __NR_unshare (__NR_Linux + 266) | 894 | #define __NR_unshare (__NR_Linux + 266) |
| 895 | #define __NR_splice (__NR_Linux + 267) | ||
| 896 | #define __NR_sync_file_range (__NR_Linux + 268) | ||
| 891 | 897 | ||
| 892 | /* | 898 | /* |
| 893 | * Offset of the last N32 flavoured syscall | 899 | * Offset of the last N32 flavoured syscall |
| 894 | */ | 900 | */ |
| 895 | #define __NR_Linux_syscalls 266 | 901 | #define __NR_Linux_syscalls 268 |
| 896 | 902 | ||
| 897 | #endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */ | 903 | #endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */ |
| 898 | 904 | ||
| 899 | #define __NR_N32_Linux 6000 | 905 | #define __NR_N32_Linux 6000 |
| 900 | #define __NR_N32_Linux_syscalls 266 | 906 | #define __NR_N32_Linux_syscalls 268 |
| 901 | 907 | ||
| 902 | #ifndef __ASSEMBLY__ | 908 | #ifndef __ASSEMBLY__ |
| 903 | 909 | ||
diff --git a/include/asm-mips/vpe.h b/include/asm-mips/vpe.h new file mode 100644 index 0000000000..c6e1b96153 --- /dev/null +++ b/include/asm-mips/vpe.h | |||
| @@ -0,0 +1,37 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2005 MIPS Technologies, Inc. All rights reserved. | ||
| 3 | * | ||
| 4 | * This program is free software; you can distribute it and/or modify it | ||
| 5 | * under the terms of the GNU General Public License (Version 2) as | ||
| 6 | * published by the Free Software Foundation. | ||
| 7 | * | ||
| 8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
| 9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
| 11 | * for more details. | ||
| 12 | * | ||
| 13 | * You should have received a copy of the GNU General Public License along | ||
| 14 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 15 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
| 16 | * | ||
| 17 | */ | ||
| 18 | |||
| 19 | #ifndef _ASM_VPE_H | ||
| 20 | #define _ASM_VPE_H | ||
| 21 | |||
| 22 | struct vpe_notifications { | ||
| 23 | void (*start)(int vpe); | ||
| 24 | void (*stop)(int vpe); | ||
| 25 | |||
| 26 | struct list_head list; | ||
| 27 | }; | ||
| 28 | |||
| 29 | |||
| 30 | extern int vpe_notify(int index, struct vpe_notifications *notify); | ||
| 31 | |||
| 32 | extern void *vpe_get_shared(int index); | ||
| 33 | extern int vpe_getuid(int index); | ||
| 34 | extern int vpe_getgid(int index); | ||
| 35 | extern char *vpe_getcwd(int index); | ||
| 36 | |||
| 37 | #endif /* _ASM_VPE_H */ | ||
diff --git a/include/asm-parisc/io.h b/include/asm-parisc/io.h index 29da31194b..244f6b8883 100644 --- a/include/asm-parisc/io.h +++ b/include/asm-parisc/io.h | |||
| @@ -126,24 +126,17 @@ static inline void gsc_writeq(unsigned long long val, unsigned long addr) | |||
| 126 | 126 | ||
| 127 | extern void __iomem * __ioremap(unsigned long offset, unsigned long size, unsigned long flags); | 127 | extern void __iomem * __ioremap(unsigned long offset, unsigned long size, unsigned long flags); |
| 128 | 128 | ||
| 129 | extern inline void __iomem * ioremap(unsigned long offset, unsigned long size) | 129 | /* Most machines react poorly to I/O-space being cacheable... Instead let's |
| 130 | { | 130 | * define ioremap() in terms of ioremap_nocache(). |
| 131 | return __ioremap(offset, size, 0); | ||
| 132 | } | ||
| 133 | |||
| 134 | /* | ||
| 135 | * This one maps high address device memory and turns off caching for that area. | ||
| 136 | * it's useful if some control registers are in such an area and write combining | ||
| 137 | * or read caching is not desirable: | ||
| 138 | */ | 131 | */ |
| 139 | extern inline void * ioremap_nocache(unsigned long offset, unsigned long size) | 132 | extern inline void __iomem * ioremap(unsigned long offset, unsigned long size) |
| 140 | { | 133 | { |
| 141 | return __ioremap(offset, size, _PAGE_NO_CACHE /* _PAGE_PCD */); | 134 | return __ioremap(offset, size, _PAGE_NO_CACHE); |
| 142 | } | 135 | } |
| 136 | #define ioremap_nocache(off, sz) ioremap((off), (sz)) | ||
| 143 | 137 | ||
| 144 | extern void iounmap(void __iomem *addr); | 138 | extern void iounmap(void __iomem *addr); |
| 145 | 139 | ||
| 146 | |||
| 147 | static inline unsigned char __raw_readb(const volatile void __iomem *addr) | 140 | static inline unsigned char __raw_readb(const volatile void __iomem *addr) |
| 148 | { | 141 | { |
| 149 | return (*(volatile unsigned char __force *) (addr)); | 142 | return (*(volatile unsigned char __force *) (addr)); |
diff --git a/include/asm-parisc/page.h b/include/asm-parisc/page.h index 45e02aa5bf..c0dd461fb8 100644 --- a/include/asm-parisc/page.h +++ b/include/asm-parisc/page.h | |||
| @@ -1,13 +1,30 @@ | |||
| 1 | #ifndef _PARISC_PAGE_H | 1 | #ifndef _PARISC_PAGE_H |
| 2 | #define _PARISC_PAGE_H | 2 | #define _PARISC_PAGE_H |
| 3 | 3 | ||
| 4 | /* PAGE_SHIFT determines the page size */ | 4 | #if !defined(__KERNEL__) |
| 5 | #define PAGE_SHIFT 12 | 5 | /* this is for userspace applications (4k page size) */ |
| 6 | #define PAGE_SIZE (1UL << PAGE_SHIFT) | 6 | # define PAGE_SHIFT 12 /* 4k */ |
| 7 | #define PAGE_MASK (~(PAGE_SIZE-1)) | 7 | # define PAGE_SIZE (1UL << PAGE_SHIFT) |
| 8 | # define PAGE_MASK (~(PAGE_SIZE-1)) | ||
| 9 | #endif | ||
| 10 | |||
| 8 | 11 | ||
| 9 | #ifdef __KERNEL__ | 12 | #ifdef __KERNEL__ |
| 10 | #include <linux/config.h> | 13 | #include <linux/config.h> |
| 14 | |||
| 15 | #if defined(CONFIG_PARISC_PAGE_SIZE_4KB) | ||
| 16 | # define PAGE_SHIFT 12 /* 4k */ | ||
| 17 | #elif defined(CONFIG_PARISC_PAGE_SIZE_16KB) | ||
| 18 | # define PAGE_SHIFT 14 /* 16k */ | ||
| 19 | #elif defined(CONFIG_PARISC_PAGE_SIZE_64KB) | ||
| 20 | # define PAGE_SHIFT 16 /* 64k */ | ||
| 21 | #else | ||
| 22 | # error "unknown default kernel page size" | ||
| 23 | #endif | ||
| 24 | #define PAGE_SIZE (1UL << PAGE_SHIFT) | ||
| 25 | #define PAGE_MASK (~(PAGE_SIZE-1)) | ||
| 26 | |||
| 27 | |||
| 11 | #ifndef __ASSEMBLY__ | 28 | #ifndef __ASSEMBLY__ |
| 12 | 29 | ||
| 13 | #include <asm/types.h> | 30 | #include <asm/types.h> |
diff --git a/include/asm-parisc/pgtable.h b/include/asm-parisc/pgtable.h index 4e34c6b440..aec089eb8b 100644 --- a/include/asm-parisc/pgtable.h +++ b/include/asm-parisc/pgtable.h | |||
| @@ -59,16 +59,15 @@ | |||
| 59 | #define ISTACK_SIZE 32768 /* Interrupt Stack Size */ | 59 | #define ISTACK_SIZE 32768 /* Interrupt Stack Size */ |
| 60 | #define ISTACK_ORDER 3 | 60 | #define ISTACK_ORDER 3 |
| 61 | 61 | ||
| 62 | /* This is the size of the initially mapped kernel memory (i.e. currently | 62 | /* This is the size of the initially mapped kernel memory */ |
| 63 | * 0 to 1<<23 == 8MB */ | ||
| 64 | #ifdef CONFIG_64BIT | 63 | #ifdef CONFIG_64BIT |
| 65 | #define KERNEL_INITIAL_ORDER 24 | 64 | #define KERNEL_INITIAL_ORDER 24 /* 0 to 1<<24 = 16MB */ |
| 66 | #else | 65 | #else |
| 67 | #define KERNEL_INITIAL_ORDER 23 | 66 | #define KERNEL_INITIAL_ORDER 23 /* 0 to 1<<23 = 8MB */ |
| 68 | #endif | 67 | #endif |
| 69 | #define KERNEL_INITIAL_SIZE (1 << KERNEL_INITIAL_ORDER) | 68 | #define KERNEL_INITIAL_SIZE (1 << KERNEL_INITIAL_ORDER) |
| 70 | 69 | ||
| 71 | #ifdef CONFIG_64BIT | 70 | #if defined(CONFIG_64BIT) && defined(CONFIG_PARISC_PAGE_SIZE_4KB) |
| 72 | #define PT_NLEVELS 3 | 71 | #define PT_NLEVELS 3 |
| 73 | #define PGD_ORDER 1 /* Number of pages per pgd */ | 72 | #define PGD_ORDER 1 /* Number of pages per pgd */ |
| 74 | #define PMD_ORDER 1 /* Number of pages per pmd */ | 73 | #define PMD_ORDER 1 /* Number of pages per pmd */ |
| @@ -111,11 +110,15 @@ | |||
| 111 | #define MAX_ADDRBITS (PGDIR_SHIFT + BITS_PER_PGD) | 110 | #define MAX_ADDRBITS (PGDIR_SHIFT + BITS_PER_PGD) |
| 112 | #define MAX_ADDRESS (1UL << MAX_ADDRBITS) | 111 | #define MAX_ADDRESS (1UL << MAX_ADDRBITS) |
| 113 | 112 | ||
| 114 | #define SPACEID_SHIFT (MAX_ADDRBITS - 32) | 113 | #define SPACEID_SHIFT (MAX_ADDRBITS - 32) |
| 115 | 114 | ||
| 116 | /* This calculates the number of initial pages we need for the initial | 115 | /* This calculates the number of initial pages we need for the initial |
| 117 | * page tables */ | 116 | * page tables */ |
| 118 | #define PT_INITIAL (1 << (KERNEL_INITIAL_ORDER - PMD_SHIFT)) | 117 | #if (KERNEL_INITIAL_ORDER) >= (PMD_SHIFT) |
| 118 | # define PT_INITIAL (1 << (KERNEL_INITIAL_ORDER - PMD_SHIFT)) | ||
| 119 | #else | ||
| 120 | # define PT_INITIAL (1) /* all initial PTEs fit into one page */ | ||
| 121 | #endif | ||
| 119 | 122 | ||
| 120 | /* | 123 | /* |
| 121 | * pgd entries used up by user/kernel: | 124 | * pgd entries used up by user/kernel: |
| @@ -160,6 +163,10 @@ extern void *vmalloc_start; | |||
| 160 | * to zero */ | 163 | * to zero */ |
| 161 | #define PTE_SHIFT xlate_pabit(_PAGE_USER_BIT) | 164 | #define PTE_SHIFT xlate_pabit(_PAGE_USER_BIT) |
| 162 | 165 | ||
| 166 | /* PFN_PTE_SHIFT defines the shift of a PTE value to access the PFN field */ | ||
| 167 | #define PFN_PTE_SHIFT 12 | ||
| 168 | |||
| 169 | |||
| 163 | /* this is how many bits may be used by the file functions */ | 170 | /* this is how many bits may be used by the file functions */ |
| 164 | #define PTE_FILE_MAX_BITS (BITS_PER_LONG - PTE_SHIFT) | 171 | #define PTE_FILE_MAX_BITS (BITS_PER_LONG - PTE_SHIFT) |
| 165 | 172 | ||
| @@ -188,7 +195,8 @@ extern void *vmalloc_start; | |||
| 188 | /* The pgd/pmd contains a ptr (in phys addr space); since all pgds/pmds | 195 | /* The pgd/pmd contains a ptr (in phys addr space); since all pgds/pmds |
| 189 | * are page-aligned, we don't care about the PAGE_OFFSET bits, except | 196 | * are page-aligned, we don't care about the PAGE_OFFSET bits, except |
| 190 | * for a few meta-information bits, so we shift the address to be | 197 | * for a few meta-information bits, so we shift the address to be |
| 191 | * able to effectively address 40-bits of physical address space. */ | 198 | * able to effectively address 40/42/44-bits of physical address space |
| 199 | * depending on 4k/16k/64k PAGE_SIZE */ | ||
| 192 | #define _PxD_PRESENT_BIT 31 | 200 | #define _PxD_PRESENT_BIT 31 |
| 193 | #define _PxD_ATTACHED_BIT 30 | 201 | #define _PxD_ATTACHED_BIT 30 |
| 194 | #define _PxD_VALID_BIT 29 | 202 | #define _PxD_VALID_BIT 29 |
| @@ -198,7 +206,7 @@ extern void *vmalloc_start; | |||
| 198 | #define PxD_FLAG_VALID (1 << xlate_pabit(_PxD_VALID_BIT)) | 206 | #define PxD_FLAG_VALID (1 << xlate_pabit(_PxD_VALID_BIT)) |
| 199 | #define PxD_FLAG_MASK (0xf) | 207 | #define PxD_FLAG_MASK (0xf) |
| 200 | #define PxD_FLAG_SHIFT (4) | 208 | #define PxD_FLAG_SHIFT (4) |
| 201 | #define PxD_VALUE_SHIFT (8) | 209 | #define PxD_VALUE_SHIFT (8) /* (PAGE_SHIFT-PxD_FLAG_SHIFT) */ |
| 202 | 210 | ||
| 203 | #ifndef __ASSEMBLY__ | 211 | #ifndef __ASSEMBLY__ |
| 204 | 212 | ||
| @@ -246,6 +254,7 @@ extern void *vmalloc_start; | |||
| 246 | #define __S110 PAGE_RWX | 254 | #define __S110 PAGE_RWX |
| 247 | #define __S111 PAGE_RWX | 255 | #define __S111 PAGE_RWX |
| 248 | 256 | ||
| 257 | |||
| 249 | extern pgd_t swapper_pg_dir[]; /* declared in init_task.c */ | 258 | extern pgd_t swapper_pg_dir[]; /* declared in init_task.c */ |
| 250 | 259 | ||
| 251 | /* initial page tables for 0-8MB for kernel */ | 260 | /* initial page tables for 0-8MB for kernel */ |
| @@ -272,7 +281,7 @@ extern unsigned long *empty_zero_page; | |||
| 272 | #define pgd_flag(x) (pgd_val(x) & PxD_FLAG_MASK) | 281 | #define pgd_flag(x) (pgd_val(x) & PxD_FLAG_MASK) |
| 273 | #define pgd_address(x) ((unsigned long)(pgd_val(x) &~ PxD_FLAG_MASK) << PxD_VALUE_SHIFT) | 282 | #define pgd_address(x) ((unsigned long)(pgd_val(x) &~ PxD_FLAG_MASK) << PxD_VALUE_SHIFT) |
| 274 | 283 | ||
| 275 | #ifdef CONFIG_64BIT | 284 | #if PT_NLEVELS == 3 |
| 276 | /* The first entry of the permanent pmd is not there if it contains | 285 | /* The first entry of the permanent pmd is not there if it contains |
| 277 | * the gateway marker */ | 286 | * the gateway marker */ |
| 278 | #define pmd_none(x) (!pmd_val(x) || pmd_flag(x) == PxD_FLAG_ATTACHED) | 287 | #define pmd_none(x) (!pmd_val(x) || pmd_flag(x) == PxD_FLAG_ATTACHED) |
| @@ -282,7 +291,7 @@ extern unsigned long *empty_zero_page; | |||
| 282 | #define pmd_bad(x) (!(pmd_flag(x) & PxD_FLAG_VALID)) | 291 | #define pmd_bad(x) (!(pmd_flag(x) & PxD_FLAG_VALID)) |
| 283 | #define pmd_present(x) (pmd_flag(x) & PxD_FLAG_PRESENT) | 292 | #define pmd_present(x) (pmd_flag(x) & PxD_FLAG_PRESENT) |
| 284 | static inline void pmd_clear(pmd_t *pmd) { | 293 | static inline void pmd_clear(pmd_t *pmd) { |
| 285 | #ifdef CONFIG_64BIT | 294 | #if PT_NLEVELS == 3 |
| 286 | if (pmd_flag(*pmd) & PxD_FLAG_ATTACHED) | 295 | if (pmd_flag(*pmd) & PxD_FLAG_ATTACHED) |
| 287 | /* This is the entry pointing to the permanent pmd | 296 | /* This is the entry pointing to the permanent pmd |
| 288 | * attached to the pgd; cannot clear it */ | 297 | * attached to the pgd; cannot clear it */ |
| @@ -303,7 +312,7 @@ static inline void pmd_clear(pmd_t *pmd) { | |||
| 303 | #define pgd_bad(x) (!(pgd_flag(x) & PxD_FLAG_VALID)) | 312 | #define pgd_bad(x) (!(pgd_flag(x) & PxD_FLAG_VALID)) |
| 304 | #define pgd_present(x) (pgd_flag(x) & PxD_FLAG_PRESENT) | 313 | #define pgd_present(x) (pgd_flag(x) & PxD_FLAG_PRESENT) |
| 305 | static inline void pgd_clear(pgd_t *pgd) { | 314 | static inline void pgd_clear(pgd_t *pgd) { |
| 306 | #ifdef CONFIG_64BIT | 315 | #if PT_NLEVELS == 3 |
| 307 | if(pgd_flag(*pgd) & PxD_FLAG_ATTACHED) | 316 | if(pgd_flag(*pgd) & PxD_FLAG_ATTACHED) |
| 308 | /* This is the permanent pmd attached to the pgd; cannot | 317 | /* This is the permanent pmd attached to the pgd; cannot |
| 309 | * free it */ | 318 | * free it */ |
| @@ -351,7 +360,7 @@ extern inline pte_t pte_mkwrite(pte_t pte) { pte_val(pte) |= _PAGE_WRITE; return | |||
| 351 | ({ \ | 360 | ({ \ |
| 352 | pte_t __pte; \ | 361 | pte_t __pte; \ |
| 353 | \ | 362 | \ |
| 354 | pte_val(__pte) = ((addr)+pgprot_val(pgprot)); \ | 363 | pte_val(__pte) = ((((addr)>>PAGE_SHIFT)<<PFN_PTE_SHIFT) + pgprot_val(pgprot)); \ |
| 355 | \ | 364 | \ |
| 356 | __pte; \ | 365 | __pte; \ |
| 357 | }) | 366 | }) |
| @@ -361,20 +370,16 @@ extern inline pte_t pte_mkwrite(pte_t pte) { pte_val(pte) |= _PAGE_WRITE; return | |||
| 361 | static inline pte_t pfn_pte(unsigned long pfn, pgprot_t pgprot) | 370 | static inline pte_t pfn_pte(unsigned long pfn, pgprot_t pgprot) |
| 362 | { | 371 | { |
| 363 | pte_t pte; | 372 | pte_t pte; |
| 364 | pte_val(pte) = (pfn << PAGE_SHIFT) | pgprot_val(pgprot); | 373 | pte_val(pte) = (pfn << PFN_PTE_SHIFT) | pgprot_val(pgprot); |
| 365 | return pte; | 374 | return pte; |
| 366 | } | 375 | } |
| 367 | 376 | ||
| 368 | /* This takes a physical page address that is used by the remapping functions */ | ||
| 369 | #define mk_pte_phys(physpage, pgprot) \ | ||
| 370 | ({ pte_t __pte; pte_val(__pte) = physpage + pgprot_val(pgprot); __pte; }) | ||
| 371 | |||
| 372 | extern inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | 377 | extern inline pte_t pte_modify(pte_t pte, pgprot_t newprot) |
| 373 | { pte_val(pte) = (pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot); return pte; } | 378 | { pte_val(pte) = (pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot); return pte; } |
| 374 | 379 | ||
| 375 | /* Permanent address of a page. On parisc we don't have highmem. */ | 380 | /* Permanent address of a page. On parisc we don't have highmem. */ |
| 376 | 381 | ||
| 377 | #define pte_pfn(x) (pte_val(x) >> PAGE_SHIFT) | 382 | #define pte_pfn(x) (pte_val(x) >> PFN_PTE_SHIFT) |
| 378 | 383 | ||
| 379 | #define pte_page(pte) (pfn_to_page(pte_pfn(pte))) | 384 | #define pte_page(pte) (pfn_to_page(pte_pfn(pte))) |
| 380 | 385 | ||
| @@ -499,6 +504,26 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, | |||
| 499 | 504 | ||
| 500 | #endif /* !__ASSEMBLY__ */ | 505 | #endif /* !__ASSEMBLY__ */ |
| 501 | 506 | ||
| 507 | |||
| 508 | /* TLB page size encoding - see table 3-1 in parisc20.pdf */ | ||
| 509 | #define _PAGE_SIZE_ENCODING_4K 0 | ||
| 510 | #define _PAGE_SIZE_ENCODING_16K 1 | ||
| 511 | #define _PAGE_SIZE_ENCODING_64K 2 | ||
| 512 | #define _PAGE_SIZE_ENCODING_256K 3 | ||
| 513 | #define _PAGE_SIZE_ENCODING_1M 4 | ||
| 514 | #define _PAGE_SIZE_ENCODING_4M 5 | ||
| 515 | #define _PAGE_SIZE_ENCODING_16M 6 | ||
| 516 | #define _PAGE_SIZE_ENCODING_64M 7 | ||
| 517 | |||
| 518 | #if defined(CONFIG_PARISC_PAGE_SIZE_4KB) | ||
| 519 | # define _PAGE_SIZE_ENCODING_DEFAULT _PAGE_SIZE_ENCODING_4K | ||
| 520 | #elif defined(CONFIG_PARISC_PAGE_SIZE_16KB) | ||
| 521 | # define _PAGE_SIZE_ENCODING_DEFAULT _PAGE_SIZE_ENCODING_16K | ||
| 522 | #elif defined(CONFIG_PARISC_PAGE_SIZE_64KB) | ||
| 523 | # define _PAGE_SIZE_ENCODING_DEFAULT _PAGE_SIZE_ENCODING_64K | ||
| 524 | #endif | ||
| 525 | |||
| 526 | |||
| 502 | #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ | 527 | #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ |
| 503 | remap_pfn_range(vma, vaddr, pfn, size, prot) | 528 | remap_pfn_range(vma, vaddr, pfn, size, prot) |
| 504 | 529 | ||
diff --git a/include/asm-parisc/unistd.h b/include/asm-parisc/unistd.h index c56fccbf34..0e1a30be2e 100644 --- a/include/asm-parisc/unistd.h +++ b/include/asm-parisc/unistd.h | |||
| @@ -780,8 +780,14 @@ | |||
| 780 | #define __NR_readlinkat (__NR_Linux + 285) | 780 | #define __NR_readlinkat (__NR_Linux + 285) |
| 781 | #define __NR_fchmodat (__NR_Linux + 286) | 781 | #define __NR_fchmodat (__NR_Linux + 286) |
| 782 | #define __NR_faccessat (__NR_Linux + 287) | 782 | #define __NR_faccessat (__NR_Linux + 287) |
| 783 | #define __NR_unshare (__NR_Linux + 288) | ||
| 784 | #define __NR_set_robust_list (__NR_Linux + 289) | ||
| 785 | #define __NR_get_robust_list (__NR_Linux + 290) | ||
| 786 | #define __NR_splice (__NR_Linux + 291) | ||
| 787 | #define __NR_sync_file_range (__NR_Linux + 292) | ||
| 788 | #define __NR_tee (__NR_Linux + 293) | ||
| 783 | 789 | ||
| 784 | #define __NR_Linux_syscalls 288 | 790 | #define __NR_Linux_syscalls 294 |
| 785 | 791 | ||
| 786 | #define HPUX_GATEWAY_ADDR 0xC0000004 | 792 | #define HPUX_GATEWAY_ADDR 0xC0000004 |
| 787 | #define LINUX_GATEWAY_ADDR 0x100 | 793 | #define LINUX_GATEWAY_ADDR 0x100 |
diff --git a/include/asm-powerpc/cputable.h b/include/asm-powerpc/cputable.h index 4321483cce..9fcf0162d8 100644 --- a/include/asm-powerpc/cputable.h +++ b/include/asm-powerpc/cputable.h | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #define PPC_FEATURE_BOOKE 0x00008000 | 22 | #define PPC_FEATURE_BOOKE 0x00008000 |
| 23 | #define PPC_FEATURE_SMT 0x00004000 | 23 | #define PPC_FEATURE_SMT 0x00004000 |
| 24 | #define PPC_FEATURE_ICACHE_SNOOP 0x00002000 | 24 | #define PPC_FEATURE_ICACHE_SNOOP 0x00002000 |
| 25 | #define PPC_FEATURE_ARCH_2_05 0x00001000 | ||
| 25 | 26 | ||
| 26 | #ifdef __KERNEL__ | 27 | #ifdef __KERNEL__ |
| 27 | #ifndef __ASSEMBLY__ | 28 | #ifndef __ASSEMBLY__ |
| @@ -320,6 +321,11 @@ extern void do_cpu_ftr_fixups(unsigned long offset); | |||
| 320 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | 321 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ |
| 321 | CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \ | 322 | CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \ |
| 322 | CPU_FTR_MMCRA_SIHV | CPU_FTR_PURR) | 323 | CPU_FTR_MMCRA_SIHV | CPU_FTR_PURR) |
| 324 | #define CPU_FTRS_POWER6 (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ | ||
| 325 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | \ | ||
| 326 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | ||
| 327 | CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \ | ||
| 328 | CPU_FTR_PURR | CPU_FTR_CI_LARGE_PAGE) | ||
| 323 | #define CPU_FTRS_CELL (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ | 329 | #define CPU_FTRS_CELL (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ |
| 324 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | \ | 330 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | \ |
| 325 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | 331 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ |
| @@ -331,8 +337,8 @@ extern void do_cpu_ftr_fixups(unsigned long offset); | |||
| 331 | #ifdef __powerpc64__ | 337 | #ifdef __powerpc64__ |
| 332 | #define CPU_FTRS_POSSIBLE \ | 338 | #define CPU_FTRS_POSSIBLE \ |
| 333 | (CPU_FTRS_POWER3 | CPU_FTRS_RS64 | CPU_FTRS_POWER4 | \ | 339 | (CPU_FTRS_POWER3 | CPU_FTRS_RS64 | CPU_FTRS_POWER4 | \ |
| 334 | CPU_FTRS_PPC970 | CPU_FTRS_POWER5 | CPU_FTRS_CELL | \ | 340 | CPU_FTRS_PPC970 | CPU_FTRS_POWER5 | CPU_FTRS_POWER6 | \ |
| 335 | CPU_FTR_CI_LARGE_PAGE) | 341 | CPU_FTRS_CELL | CPU_FTR_CI_LARGE_PAGE) |
| 336 | #else | 342 | #else |
| 337 | enum { | 343 | enum { |
| 338 | CPU_FTRS_POSSIBLE = | 344 | CPU_FTRS_POSSIBLE = |
| @@ -376,8 +382,8 @@ enum { | |||
| 376 | #ifdef __powerpc64__ | 382 | #ifdef __powerpc64__ |
| 377 | #define CPU_FTRS_ALWAYS \ | 383 | #define CPU_FTRS_ALWAYS \ |
| 378 | (CPU_FTRS_POWER3 & CPU_FTRS_RS64 & CPU_FTRS_POWER4 & \ | 384 | (CPU_FTRS_POWER3 & CPU_FTRS_RS64 & CPU_FTRS_POWER4 & \ |
| 379 | CPU_FTRS_PPC970 & CPU_FTRS_POWER5 & CPU_FTRS_CELL & \ | 385 | CPU_FTRS_PPC970 & CPU_FTRS_POWER5 & CPU_FTRS_POWER6 & \ |
| 380 | CPU_FTRS_POSSIBLE) | 386 | CPU_FTRS_CELL & CPU_FTRS_POSSIBLE) |
| 381 | #else | 387 | #else |
| 382 | enum { | 388 | enum { |
| 383 | CPU_FTRS_ALWAYS = | 389 | CPU_FTRS_ALWAYS = |
diff --git a/include/asm-powerpc/io.h b/include/asm-powerpc/io.h index 68efbea379..f1c2469b88 100644 --- a/include/asm-powerpc/io.h +++ b/include/asm-powerpc/io.h | |||
| @@ -9,6 +9,9 @@ | |||
| 9 | * 2 of the License, or (at your option) any later version. | 9 | * 2 of the License, or (at your option) any later version. |
| 10 | */ | 10 | */ |
| 11 | 11 | ||
| 12 | /* Check of existence of legacy devices */ | ||
| 13 | extern int check_legacy_ioport(unsigned long base_port); | ||
| 14 | |||
| 12 | #ifndef CONFIG_PPC64 | 15 | #ifndef CONFIG_PPC64 |
| 13 | #include <asm-ppc/io.h> | 16 | #include <asm-ppc/io.h> |
| 14 | #else | 17 | #else |
| @@ -437,9 +440,6 @@ out: | |||
| 437 | #define dma_cache_wback(_start,_size) do { } while (0) | 440 | #define dma_cache_wback(_start,_size) do { } while (0) |
| 438 | #define dma_cache_wback_inv(_start,_size) do { } while (0) | 441 | #define dma_cache_wback_inv(_start,_size) do { } while (0) |
| 439 | 442 | ||
| 440 | /* Check of existence of legacy devices */ | ||
| 441 | extern int check_legacy_ioport(unsigned long base_port); | ||
| 442 | |||
| 443 | 443 | ||
| 444 | /* | 444 | /* |
| 445 | * Convert a physical pointer to a virtual kernel pointer for /dev/mem | 445 | * Convert a physical pointer to a virtual kernel pointer for /dev/mem |
diff --git a/include/asm-powerpc/iommu.h b/include/asm-powerpc/iommu.h index d5677cbec2..18ca29e910 100644 --- a/include/asm-powerpc/iommu.h +++ b/include/asm-powerpc/iommu.h | |||
| @@ -70,17 +70,18 @@ extern void iommu_free_table(struct device_node *dn); | |||
| 70 | extern struct iommu_table *iommu_init_table(struct iommu_table * tbl); | 70 | extern struct iommu_table *iommu_init_table(struct iommu_table * tbl); |
| 71 | 71 | ||
| 72 | extern int iommu_map_sg(struct device *dev, struct iommu_table *tbl, | 72 | extern int iommu_map_sg(struct device *dev, struct iommu_table *tbl, |
| 73 | struct scatterlist *sglist, int nelems, | 73 | struct scatterlist *sglist, int nelems, unsigned long mask, |
| 74 | enum dma_data_direction direction); | 74 | enum dma_data_direction direction); |
| 75 | extern void iommu_unmap_sg(struct iommu_table *tbl, struct scatterlist *sglist, | 75 | extern void iommu_unmap_sg(struct iommu_table *tbl, struct scatterlist *sglist, |
| 76 | int nelems, enum dma_data_direction direction); | 76 | int nelems, enum dma_data_direction direction); |
| 77 | 77 | ||
| 78 | extern void *iommu_alloc_coherent(struct iommu_table *tbl, size_t size, | 78 | extern void *iommu_alloc_coherent(struct iommu_table *tbl, size_t size, |
| 79 | dma_addr_t *dma_handle, gfp_t flag); | 79 | dma_addr_t *dma_handle, unsigned long mask, gfp_t flag); |
| 80 | extern void iommu_free_coherent(struct iommu_table *tbl, size_t size, | 80 | extern void iommu_free_coherent(struct iommu_table *tbl, size_t size, |
| 81 | void *vaddr, dma_addr_t dma_handle); | 81 | void *vaddr, dma_addr_t dma_handle); |
| 82 | extern dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr, | 82 | extern dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr, |
| 83 | size_t size, enum dma_data_direction direction); | 83 | size_t size, unsigned long mask, |
| 84 | enum dma_data_direction direction); | ||
| 84 | extern void iommu_unmap_single(struct iommu_table *tbl, dma_addr_t dma_handle, | 85 | extern void iommu_unmap_single(struct iommu_table *tbl, dma_addr_t dma_handle, |
| 85 | size_t size, enum dma_data_direction direction); | 86 | size_t size, enum dma_data_direction direction); |
| 86 | 87 | ||
diff --git a/include/asm-powerpc/irq.h b/include/asm-powerpc/irq.h index 51f87d9993..7bc6d73b28 100644 --- a/include/asm-powerpc/irq.h +++ b/include/asm-powerpc/irq.h | |||
| @@ -54,6 +54,13 @@ | |||
| 54 | */ | 54 | */ |
| 55 | extern unsigned int virt_irq_to_real_map[NR_IRQS]; | 55 | extern unsigned int virt_irq_to_real_map[NR_IRQS]; |
| 56 | 56 | ||
| 57 | /* The maximum virtual IRQ number that we support. This | ||
| 58 | * can be set by the platform and will be reduced by the | ||
| 59 | * value of __irq_offset_value. It defaults to and is | ||
| 60 | * capped by (NR_IRQS - 1). | ||
| 61 | */ | ||
| 62 | extern unsigned int virt_irq_max; | ||
| 63 | |||
| 57 | /* Create a mapping for a real_irq if it doesn't already exist. | 64 | /* Create a mapping for a real_irq if it doesn't already exist. |
| 58 | * Return the virtual irq as a convenience. | 65 | * Return the virtual irq as a convenience. |
| 59 | */ | 66 | */ |
diff --git a/include/asm-powerpc/machdep.h b/include/asm-powerpc/machdep.h index 5ed8476807..0f9254c189 100644 --- a/include/asm-powerpc/machdep.h +++ b/include/asm-powerpc/machdep.h | |||
| @@ -253,7 +253,11 @@ extern struct machdep_calls *machine_id; | |||
| 253 | 253 | ||
| 254 | #define __machine_desc __attribute__ ((__section__ (".machine.desc"))) | 254 | #define __machine_desc __attribute__ ((__section__ (".machine.desc"))) |
| 255 | 255 | ||
| 256 | #define define_machine(name) struct machdep_calls mach_##name __machine_desc = | 256 | #define define_machine(name) \ |
| 257 | extern struct machdep_calls mach_##name; \ | ||
| 258 | EXPORT_SYMBOL(mach_##name); \ | ||
| 259 | struct machdep_calls mach_##name __machine_desc = | ||
| 260 | |||
| 257 | #define machine_is(name) \ | 261 | #define machine_is(name) \ |
| 258 | ({ \ | 262 | ({ \ |
| 259 | extern struct machdep_calls mach_##name \ | 263 | extern struct machdep_calls mach_##name \ |
diff --git a/include/asm-powerpc/page_64.h b/include/asm-powerpc/page_64.h index 3fb061bab9..eab779c219 100644 --- a/include/asm-powerpc/page_64.h +++ b/include/asm-powerpc/page_64.h | |||
| @@ -101,6 +101,7 @@ extern unsigned int HPAGE_SHIFT; | |||
| 101 | - (1U << GET_HTLB_AREA(addr))) & 0xffff) | 101 | - (1U << GET_HTLB_AREA(addr))) & 0xffff) |
| 102 | 102 | ||
| 103 | #define ARCH_HAS_HUGEPAGE_ONLY_RANGE | 103 | #define ARCH_HAS_HUGEPAGE_ONLY_RANGE |
| 104 | #define ARCH_HAS_HUGETLB_FREE_PGD_RANGE | ||
| 104 | #define ARCH_HAS_PREPARE_HUGEPAGE_RANGE | 105 | #define ARCH_HAS_PREPARE_HUGEPAGE_RANGE |
| 105 | #define ARCH_HAS_SETCLEAR_HUGE_PTE | 106 | #define ARCH_HAS_SETCLEAR_HUGE_PTE |
| 106 | 107 | ||
diff --git a/include/asm-powerpc/pgalloc.h b/include/asm-powerpc/pgalloc.h index a00ee002cd..9f0917c686 100644 --- a/include/asm-powerpc/pgalloc.h +++ b/include/asm-powerpc/pgalloc.h | |||
| @@ -17,11 +17,13 @@ extern kmem_cache_t *pgtable_cache[]; | |||
| 17 | #define PTE_CACHE_NUM 0 | 17 | #define PTE_CACHE_NUM 0 |
| 18 | #define PMD_CACHE_NUM 1 | 18 | #define PMD_CACHE_NUM 1 |
| 19 | #define PGD_CACHE_NUM 2 | 19 | #define PGD_CACHE_NUM 2 |
| 20 | #define HUGEPTE_CACHE_NUM 3 | ||
| 20 | #else | 21 | #else |
| 21 | #define PTE_CACHE_NUM 0 | 22 | #define PTE_CACHE_NUM 0 |
| 22 | #define PMD_CACHE_NUM 1 | 23 | #define PMD_CACHE_NUM 1 |
| 23 | #define PUD_CACHE_NUM 1 | 24 | #define PUD_CACHE_NUM 1 |
| 24 | #define PGD_CACHE_NUM 0 | 25 | #define PGD_CACHE_NUM 0 |
| 26 | #define HUGEPTE_CACHE_NUM 2 | ||
| 25 | #endif | 27 | #endif |
| 26 | 28 | ||
| 27 | /* | 29 | /* |
diff --git a/include/asm-powerpc/spu.h b/include/asm-powerpc/spu.h index f431d8b0b6..7cfcff3ef0 100644 --- a/include/asm-powerpc/spu.h +++ b/include/asm-powerpc/spu.h | |||
| @@ -117,6 +117,7 @@ struct spu { | |||
| 117 | struct list_head list; | 117 | struct list_head list; |
| 118 | struct list_head sched_list; | 118 | struct list_head sched_list; |
| 119 | int number; | 119 | int number; |
| 120 | int nid; | ||
| 120 | u32 isrc; | 121 | u32 isrc; |
| 121 | u32 node; | 122 | u32 node; |
| 122 | u64 flags; | 123 | u64 flags; |
diff --git a/include/asm-powerpc/termbits.h b/include/asm-powerpc/termbits.h index ebf6055481..6d533b07aa 100644 --- a/include/asm-powerpc/termbits.h +++ b/include/asm-powerpc/termbits.h | |||
| @@ -153,6 +153,7 @@ struct termios { | |||
| 153 | #define HUPCL 00040000 | 153 | #define HUPCL 00040000 |
| 154 | 154 | ||
| 155 | #define CLOCAL 00100000 | 155 | #define CLOCAL 00100000 |
| 156 | #define CMSPAR 010000000000 /* mark or space (stick) parity */ | ||
| 156 | #define CRTSCTS 020000000000 /* flow control */ | 157 | #define CRTSCTS 020000000000 /* flow control */ |
| 157 | 158 | ||
| 158 | /* c_lflag bits */ | 159 | /* c_lflag bits */ |
diff --git a/include/asm-powerpc/thread_info.h b/include/asm-powerpc/thread_info.h index ffc7462d77..88b553c6b2 100644 --- a/include/asm-powerpc/thread_info.h +++ b/include/asm-powerpc/thread_info.h | |||
| @@ -37,6 +37,8 @@ struct thread_info { | |||
| 37 | int preempt_count; /* 0 => preemptable, | 37 | int preempt_count; /* 0 => preemptable, |
| 38 | <0 => BUG */ | 38 | <0 => BUG */ |
| 39 | struct restart_block restart_block; | 39 | struct restart_block restart_block; |
| 40 | unsigned long local_flags; /* private flags for thread */ | ||
| 41 | |||
| 40 | /* low level flags - has atomic operations done on it */ | 42 | /* low level flags - has atomic operations done on it */ |
| 41 | unsigned long flags ____cacheline_aligned_in_smp; | 43 | unsigned long flags ____cacheline_aligned_in_smp; |
| 42 | }; | 44 | }; |
| @@ -143,6 +145,12 @@ static inline struct thread_info *current_thread_info(void) | |||
| 143 | _TIF_NEED_RESCHED | _TIF_RESTORE_SIGMASK) | 145 | _TIF_NEED_RESCHED | _TIF_RESTORE_SIGMASK) |
| 144 | #define _TIF_PERSYSCALL_MASK (_TIF_RESTOREALL|_TIF_NOERROR) | 146 | #define _TIF_PERSYSCALL_MASK (_TIF_RESTOREALL|_TIF_NOERROR) |
| 145 | 147 | ||
| 148 | /* Bits in local_flags */ | ||
| 149 | /* Don't move TLF_NAPPING without adjusting the code in entry_32.S */ | ||
| 150 | #define TLF_NAPPING 0 /* idle thread enabled NAP mode */ | ||
| 151 | |||
| 152 | #define _TLF_NAPPING (1 << TLF_NAPPING) | ||
| 153 | |||
| 146 | #endif /* __KERNEL__ */ | 154 | #endif /* __KERNEL__ */ |
| 147 | 155 | ||
| 148 | #endif /* _ASM_POWERPC_THREAD_INFO_H */ | 156 | #endif /* _ASM_POWERPC_THREAD_INFO_H */ |
diff --git a/include/asm-powerpc/topology.h b/include/asm-powerpc/topology.h index 1e19cd00af..87362a0554 100644 --- a/include/asm-powerpc/topology.h +++ b/include/asm-powerpc/topology.h | |||
| @@ -4,6 +4,9 @@ | |||
| 4 | 4 | ||
| 5 | #include <linux/config.h> | 5 | #include <linux/config.h> |
| 6 | 6 | ||
| 7 | struct sys_device; | ||
| 8 | struct device_node; | ||
| 9 | |||
| 7 | #ifdef CONFIG_NUMA | 10 | #ifdef CONFIG_NUMA |
| 8 | 11 | ||
| 9 | #include <asm/mmzone.h> | 12 | #include <asm/mmzone.h> |
| @@ -27,6 +30,8 @@ static inline int node_to_first_cpu(int node) | |||
| 27 | return first_cpu(tmp); | 30 | return first_cpu(tmp); |
| 28 | } | 31 | } |
| 29 | 32 | ||
| 33 | int of_node_to_nid(struct device_node *device); | ||
| 34 | |||
| 30 | #define pcibus_to_node(node) (-1) | 35 | #define pcibus_to_node(node) (-1) |
| 31 | #define pcibus_to_cpumask(bus) (cpu_online_map) | 36 | #define pcibus_to_cpumask(bus) (cpu_online_map) |
| 32 | 37 | ||
| @@ -57,10 +62,29 @@ static inline int node_to_first_cpu(int node) | |||
| 57 | 62 | ||
| 58 | extern void __init dump_numa_cpu_topology(void); | 63 | extern void __init dump_numa_cpu_topology(void); |
| 59 | 64 | ||
| 65 | extern int sysfs_add_device_to_node(struct sys_device *dev, int nid); | ||
| 66 | extern void sysfs_remove_device_from_node(struct sys_device *dev, int nid); | ||
| 67 | |||
| 60 | #else | 68 | #else |
| 61 | 69 | ||
| 70 | static inline int of_node_to_nid(struct device_node *device) | ||
| 71 | { | ||
| 72 | return 0; | ||
| 73 | } | ||
| 74 | |||
| 62 | static inline void dump_numa_cpu_topology(void) {} | 75 | static inline void dump_numa_cpu_topology(void) {} |
| 63 | 76 | ||
| 77 | static inline int sysfs_add_device_to_node(struct sys_device *dev, int nid) | ||
| 78 | { | ||
| 79 | return 0; | ||
| 80 | } | ||
| 81 | |||
| 82 | static inline void sysfs_remove_device_from_node(struct sys_device *dev, | ||
| 83 | int nid) | ||
| 84 | { | ||
| 85 | } | ||
| 86 | |||
| 87 | |||
| 64 | #include <asm-generic/topology.h> | 88 | #include <asm-generic/topology.h> |
| 65 | 89 | ||
| 66 | #endif /* CONFIG_NUMA */ | 90 | #endif /* CONFIG_NUMA */ |
diff --git a/include/asm-powerpc/uaccess.h b/include/asm-powerpc/uaccess.h index 3872e924cd..d83fc29c2b 100644 --- a/include/asm-powerpc/uaccess.h +++ b/include/asm-powerpc/uaccess.h | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include <linux/sched.h> | 7 | #include <linux/sched.h> |
| 8 | #include <linux/errno.h> | 8 | #include <linux/errno.h> |
| 9 | #include <asm/processor.h> | 9 | #include <asm/processor.h> |
| 10 | #include <asm/page.h> | ||
| 10 | 11 | ||
| 11 | #define VERIFY_READ 0 | 12 | #define VERIFY_READ 0 |
| 12 | #define VERIFY_WRITE 1 | 13 | #define VERIFY_WRITE 1 |
| @@ -179,9 +180,11 @@ do { \ | |||
| 179 | #define __put_user_nocheck(x, ptr, size) \ | 180 | #define __put_user_nocheck(x, ptr, size) \ |
| 180 | ({ \ | 181 | ({ \ |
| 181 | long __pu_err; \ | 182 | long __pu_err; \ |
| 182 | might_sleep(); \ | 183 | __typeof__(*(ptr)) __user *__pu_addr = (ptr); \ |
| 184 | if (!is_kernel_addr((unsigned long)__pu_addr)) \ | ||
| 185 | might_sleep(); \ | ||
| 183 | __chk_user_ptr(ptr); \ | 186 | __chk_user_ptr(ptr); \ |
| 184 | __put_user_size((x), (ptr), (size), __pu_err); \ | 187 | __put_user_size((x), __pu_addr, (size), __pu_err); \ |
| 185 | __pu_err; \ | 188 | __pu_err; \ |
| 186 | }) | 189 | }) |
| 187 | 190 | ||
| @@ -258,9 +261,11 @@ do { \ | |||
| 258 | ({ \ | 261 | ({ \ |
| 259 | long __gu_err; \ | 262 | long __gu_err; \ |
| 260 | unsigned long __gu_val; \ | 263 | unsigned long __gu_val; \ |
| 264 | const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ | ||
| 261 | __chk_user_ptr(ptr); \ | 265 | __chk_user_ptr(ptr); \ |
| 262 | might_sleep(); \ | 266 | if (!is_kernel_addr((unsigned long)__gu_addr)) \ |
| 263 | __get_user_size(__gu_val, (ptr), (size), __gu_err); \ | 267 | might_sleep(); \ |
| 268 | __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ | ||
| 264 | (x) = (__typeof__(*(ptr)))__gu_val; \ | 269 | (x) = (__typeof__(*(ptr)))__gu_val; \ |
| 265 | __gu_err; \ | 270 | __gu_err; \ |
| 266 | }) | 271 | }) |
| @@ -270,9 +275,11 @@ do { \ | |||
| 270 | ({ \ | 275 | ({ \ |
| 271 | long __gu_err; \ | 276 | long __gu_err; \ |
| 272 | long long __gu_val; \ | 277 | long long __gu_val; \ |
| 278 | const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ | ||
| 273 | __chk_user_ptr(ptr); \ | 279 | __chk_user_ptr(ptr); \ |
| 274 | might_sleep(); \ | 280 | if (!is_kernel_addr((unsigned long)__gu_addr)) \ |
| 275 | __get_user_size(__gu_val, (ptr), (size), __gu_err); \ | 281 | might_sleep(); \ |
| 282 | __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ | ||
| 276 | (x) = (__typeof__(*(ptr)))__gu_val; \ | 283 | (x) = (__typeof__(*(ptr)))__gu_val; \ |
| 277 | __gu_err; \ | 284 | __gu_err; \ |
| 278 | }) | 285 | }) |
diff --git a/include/asm-powerpc/unistd.h b/include/asm-powerpc/unistd.h index 536ba08730..edde2462bf 100644 --- a/include/asm-powerpc/unistd.h +++ b/include/asm-powerpc/unistd.h | |||
| @@ -302,8 +302,29 @@ | |||
| 302 | #define __NR_ppoll 281 | 302 | #define __NR_ppoll 281 |
| 303 | #define __NR_unshare 282 | 303 | #define __NR_unshare 282 |
| 304 | #define __NR_splice 283 | 304 | #define __NR_splice 283 |
| 305 | #define __NR_tee 284 | ||
| 306 | #define __NR_vmsplice 285 | ||
| 307 | #define __NR_openat 286 | ||
| 308 | #define __NR_mkdirat 287 | ||
| 309 | #define __NR_mknodat 288 | ||
| 310 | #define __NR_fchownat 289 | ||
| 311 | #define __NR_futimesat 290 | ||
| 312 | #ifdef __powerpc64__ | ||
| 313 | #define __NR_newfstatat 291 | ||
| 314 | #else | ||
| 315 | #define __NR_fstatat64 291 | ||
| 316 | #endif | ||
| 317 | #define __NR_unlinkat 292 | ||
| 318 | #define __NR_renameat 293 | ||
| 319 | #define __NR_linkat 294 | ||
| 320 | #define __NR_symlinkat 295 | ||
| 321 | #define __NR_readlinkat 296 | ||
| 322 | #define __NR_fchmodat 297 | ||
| 323 | #define __NR_faccessat 298 | ||
| 324 | #define __NR_get_robust_list 299 | ||
| 325 | #define __NR_set_robust_list 300 | ||
| 305 | 326 | ||
| 306 | #define __NR_syscalls 284 | 327 | #define __NR_syscalls 301 |
| 307 | 328 | ||
| 308 | #ifdef __KERNEL__ | 329 | #ifdef __KERNEL__ |
| 309 | #define __NR__exit __NR_exit | 330 | #define __NR__exit __NR_exit |
| @@ -456,6 +477,7 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6 | |||
| 456 | #ifdef CONFIG_PPC64 | 477 | #ifdef CONFIG_PPC64 |
| 457 | #define __ARCH_WANT_COMPAT_SYS_TIME | 478 | #define __ARCH_WANT_COMPAT_SYS_TIME |
| 458 | #define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND | 479 | #define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND |
| 480 | #define __ARCH_WANT_SYS_NEWFSTATAT | ||
| 459 | #endif | 481 | #endif |
| 460 | 482 | ||
| 461 | /* | 483 | /* |
diff --git a/include/asm-ppc/commproc.h b/include/asm-ppc/commproc.h index 973e609082..31f362966a 100644 --- a/include/asm-ppc/commproc.h +++ b/include/asm-ppc/commproc.h | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #define CPM_CR_INIT_TX ((ushort)0x0002) | 35 | #define CPM_CR_INIT_TX ((ushort)0x0002) |
| 36 | #define CPM_CR_HUNT_MODE ((ushort)0x0003) | 36 | #define CPM_CR_HUNT_MODE ((ushort)0x0003) |
| 37 | #define CPM_CR_STOP_TX ((ushort)0x0004) | 37 | #define CPM_CR_STOP_TX ((ushort)0x0004) |
| 38 | #define CPM_CR_GRA_STOP_TX ((ushort)0x0005) | ||
| 38 | #define CPM_CR_RESTART_TX ((ushort)0x0006) | 39 | #define CPM_CR_RESTART_TX ((ushort)0x0006) |
| 39 | #define CPM_CR_CLOSE_RX_BD ((ushort)0x0007) | 40 | #define CPM_CR_CLOSE_RX_BD ((ushort)0x0007) |
| 40 | #define CPM_CR_SET_GADDR ((ushort)0x0008) | 41 | #define CPM_CR_SET_GADDR ((ushort)0x0008) |
diff --git a/include/asm-ppc/cpm2.h b/include/asm-ppc/cpm2.h index b638b87ceb..c70344b910 100644 --- a/include/asm-ppc/cpm2.h +++ b/include/asm-ppc/cpm2.h | |||
| @@ -69,7 +69,7 @@ | |||
| 69 | #define CPM_CR_INIT_TX ((ushort)0x0002) | 69 | #define CPM_CR_INIT_TX ((ushort)0x0002) |
| 70 | #define CPM_CR_HUNT_MODE ((ushort)0x0003) | 70 | #define CPM_CR_HUNT_MODE ((ushort)0x0003) |
| 71 | #define CPM_CR_STOP_TX ((ushort)0x0004) | 71 | #define CPM_CR_STOP_TX ((ushort)0x0004) |
| 72 | #define CPM_CR_GRA_STOP_TX ((ushort)0x0005) | 72 | #define CPM_CR_GRA_STOP_TX ((ushort)0x0005) |
| 73 | #define CPM_CR_RESTART_TX ((ushort)0x0006) | 73 | #define CPM_CR_RESTART_TX ((ushort)0x0006) |
| 74 | #define CPM_CR_SET_GADDR ((ushort)0x0008) | 74 | #define CPM_CR_SET_GADDR ((ushort)0x0008) |
| 75 | #define CPM_CR_START_IDMA ((ushort)0x0009) | 75 | #define CPM_CR_START_IDMA ((ushort)0x0009) |
diff --git a/include/asm-ppc/page.h b/include/asm-ppc/page.h index a70ba2ee55..0fb68a0b01 100644 --- a/include/asm-ppc/page.h +++ b/include/asm-ppc/page.h | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | /* This must match what is in arch/ppc/Makefile */ | 20 | /* This must match what is in arch/ppc/Makefile */ |
| 21 | #define PAGE_OFFSET CONFIG_KERNEL_START | 21 | #define PAGE_OFFSET CONFIG_KERNEL_START |
| 22 | #define KERNELBASE PAGE_OFFSET | 22 | #define KERNELBASE PAGE_OFFSET |
| 23 | #define is_kernel_addr(x) ((x) >= PAGE_OFFSET) | ||
| 23 | 24 | ||
| 24 | #ifndef __ASSEMBLY__ | 25 | #ifndef __ASSEMBLY__ |
| 25 | 26 | ||
diff --git a/include/asm-ppc/ppc_sys.h b/include/asm-ppc/ppc_sys.h index 4b94f7059e..40f197af65 100644 --- a/include/asm-ppc/ppc_sys.h +++ b/include/asm-ppc/ppc_sys.h | |||
| @@ -39,6 +39,8 @@ | |||
| 39 | #error "need definition of ppc_sys_devices" | 39 | #error "need definition of ppc_sys_devices" |
| 40 | #endif | 40 | #endif |
| 41 | 41 | ||
| 42 | #define PPC_SYS_IORESOURCE_FIXUPPED 0x00000001 | ||
| 43 | |||
| 42 | struct ppc_sys_spec { | 44 | struct ppc_sys_spec { |
| 43 | /* PPC sys is matched via (ID & mask) == value, id could be | 45 | /* PPC sys is matched via (ID & mask) == value, id could be |
| 44 | * PVR, SVR, IMMR, * etc. */ | 46 | * PVR, SVR, IMMR, * etc. */ |
diff --git a/include/asm-ppc/reg_booke.h b/include/asm-ppc/reg_booke.h index 00ad9c754c..4944c0fb8b 100644 --- a/include/asm-ppc/reg_booke.h +++ b/include/asm-ppc/reg_booke.h | |||
| @@ -237,6 +237,7 @@ do { \ | |||
| 237 | #endif | 237 | #endif |
| 238 | 238 | ||
| 239 | /* Bit definitions for CCR1. */ | 239 | /* Bit definitions for CCR1. */ |
| 240 | #define CCR1_DPC 0x00000100 /* Disable L1 I-Cache/D-Cache parity checking */ | ||
| 240 | #define CCR1_TCS 0x00000080 /* Timer Clock Select */ | 241 | #define CCR1_TCS 0x00000080 /* Timer Clock Select */ |
| 241 | 242 | ||
| 242 | /* Bit definitions for the MCSR. */ | 243 | /* Bit definitions for the MCSR. */ |
diff --git a/include/asm-s390/cache.h b/include/asm-s390/cache.h index e20cdd9074..cdf431b061 100644 --- a/include/asm-s390/cache.h +++ b/include/asm-s390/cache.h | |||
| @@ -16,4 +16,6 @@ | |||
| 16 | 16 | ||
| 17 | #define ARCH_KMALLOC_MINALIGN 8 | 17 | #define ARCH_KMALLOC_MINALIGN 8 |
| 18 | 18 | ||
| 19 | #define __read_mostly __attribute__((__section__(".data.read_mostly"))) | ||
| 20 | |||
| 19 | #endif | 21 | #endif |
diff --git a/include/asm-s390/futex.h b/include/asm-s390/futex.h index 6a332a9f09..1802775568 100644 --- a/include/asm-s390/futex.h +++ b/include/asm-s390/futex.h | |||
| @@ -1,6 +1,122 @@ | |||
| 1 | #ifndef _ASM_FUTEX_H | 1 | #ifndef _ASM_S390_FUTEX_H |
| 2 | #define _ASM_FUTEX_H | 2 | #define _ASM_S390_FUTEX_H |
| 3 | 3 | ||
| 4 | #include <asm-generic/futex.h> | 4 | #ifdef __KERNEL__ |
| 5 | 5 | ||
| 6 | #endif | 6 | #include <linux/futex.h> |
| 7 | #include <asm/errno.h> | ||
| 8 | #include <asm/uaccess.h> | ||
| 9 | |||
| 10 | #ifndef __s390x__ | ||
| 11 | #define __futex_atomic_fixup \ | ||
| 12 | ".section __ex_table,\"a\"\n" \ | ||
| 13 | " .align 4\n" \ | ||
| 14 | " .long 0b,4b,2b,4b,3b,4b\n" \ | ||
| 15 | ".previous" | ||
| 16 | #else /* __s390x__ */ | ||
| 17 | #define __futex_atomic_fixup \ | ||
| 18 | ".section __ex_table,\"a\"\n" \ | ||
| 19 | " .align 8\n" \ | ||
| 20 | " .quad 0b,4b,2b,4b,3b,4b\n" \ | ||
| 21 | ".previous" | ||
| 22 | #endif /* __s390x__ */ | ||
| 23 | |||
| 24 | #define __futex_atomic_op(insn, ret, oldval, newval, uaddr, oparg) \ | ||
| 25 | asm volatile(" sacf 256\n" \ | ||
| 26 | "0: l %1,0(%6)\n" \ | ||
| 27 | "1: " insn \ | ||
| 28 | "2: cs %1,%2,0(%6)\n" \ | ||
| 29 | "3: jl 1b\n" \ | ||
| 30 | " lhi %0,0\n" \ | ||
| 31 | "4: sacf 0\n" \ | ||
| 32 | __futex_atomic_fixup \ | ||
| 33 | : "=d" (ret), "=&d" (oldval), "=&d" (newval), \ | ||
| 34 | "=m" (*uaddr) \ | ||
| 35 | : "0" (-EFAULT), "d" (oparg), "a" (uaddr), \ | ||
| 36 | "m" (*uaddr) : "cc" ); | ||
| 37 | |||
| 38 | static inline int futex_atomic_op_inuser (int encoded_op, int __user *uaddr) | ||
| 39 | { | ||
| 40 | int op = (encoded_op >> 28) & 7; | ||
| 41 | int cmp = (encoded_op >> 24) & 15; | ||
| 42 | int oparg = (encoded_op << 8) >> 20; | ||
| 43 | int cmparg = (encoded_op << 20) >> 20; | ||
| 44 | int oldval = 0, newval, ret; | ||
| 45 | if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) | ||
| 46 | oparg = 1 << oparg; | ||
| 47 | |||
| 48 | if (! access_ok (VERIFY_WRITE, uaddr, sizeof(int))) | ||
| 49 | return -EFAULT; | ||
| 50 | |||
| 51 | inc_preempt_count(); | ||
| 52 | |||
| 53 | switch (op) { | ||
| 54 | case FUTEX_OP_SET: | ||
| 55 | __futex_atomic_op("lr %2,%5\n", | ||
| 56 | ret, oldval, newval, uaddr, oparg); | ||
| 57 | break; | ||
| 58 | case FUTEX_OP_ADD: | ||
| 59 | __futex_atomic_op("lr %2,%1\nar %2,%5\n", | ||
| 60 | ret, oldval, newval, uaddr, oparg); | ||
| 61 | break; | ||
| 62 | case FUTEX_OP_OR: | ||
| 63 | __futex_atomic_op("lr %2,%1\nor %2,%5\n", | ||
| 64 | ret, oldval, newval, uaddr, oparg); | ||
| 65 | break; | ||
| 66 | case FUTEX_OP_ANDN: | ||
| 67 | __futex_atomic_op("lr %2,%1\nnr %2,%5\n", | ||
| 68 | ret, oldval, newval, uaddr, oparg); | ||
| 69 | break; | ||
| 70 | case FUTEX_OP_XOR: | ||
| 71 | __futex_atomic_op("lr %2,%1\nxr %2,%5\n", | ||
| 72 | ret, oldval, newval, uaddr, oparg); | ||
| 73 | break; | ||
| 74 | default: | ||
| 75 | ret = -ENOSYS; | ||
| 76 | } | ||
| 77 | |||
| 78 | dec_preempt_count(); | ||
| 79 | |||
| 80 | if (!ret) { | ||
| 81 | switch (cmp) { | ||
| 82 | case FUTEX_OP_CMP_EQ: ret = (oldval == cmparg); break; | ||
| 83 | case FUTEX_OP_CMP_NE: ret = (oldval != cmparg); break; | ||
| 84 | case FUTEX_OP_CMP_LT: ret = (oldval < cmparg); break; | ||
| 85 | case FUTEX_OP_CMP_GE: ret = (oldval >= cmparg); break; | ||
| 86 | case FUTEX_OP_CMP_LE: ret = (oldval <= cmparg); break; | ||
| 87 | case FUTEX_OP_CMP_GT: ret = (oldval > cmparg); break; | ||
| 88 | default: ret = -ENOSYS; | ||
| 89 | } | ||
| 90 | } | ||
| 91 | return ret; | ||
| 92 | } | ||
| 93 | |||
| 94 | static inline int | ||
| 95 | futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) | ||
| 96 | { | ||
| 97 | int ret; | ||
| 98 | |||
| 99 | if (! access_ok (VERIFY_WRITE, uaddr, sizeof(int))) | ||
| 100 | return -EFAULT; | ||
| 101 | asm volatile(" cs %1,%4,0(%5)\n" | ||
| 102 | "0: lr %0,%1\n" | ||
| 103 | "1:\n" | ||
| 104 | #ifndef __s390x__ | ||
| 105 | ".section __ex_table,\"a\"\n" | ||
| 106 | " .align 4\n" | ||
| 107 | " .long 0b,1b\n" | ||
| 108 | ".previous" | ||
| 109 | #else /* __s390x__ */ | ||
| 110 | ".section __ex_table,\"a\"\n" | ||
| 111 | " .align 8\n" | ||
| 112 | " .quad 0b,1b\n" | ||
| 113 | ".previous" | ||
| 114 | #endif /* __s390x__ */ | ||
| 115 | : "=d" (ret), "+d" (oldval), "=m" (*uaddr) | ||
| 116 | : "0" (-EFAULT), "d" (newval), "a" (uaddr), "m" (*uaddr) | ||
| 117 | : "cc", "memory" ); | ||
| 118 | return oldval; | ||
| 119 | } | ||
| 120 | |||
| 121 | #endif /* __KERNEL__ */ | ||
| 122 | #endif /* _ASM_S390_FUTEX_H */ | ||
diff --git a/include/asm-s390/lowcore.h b/include/asm-s390/lowcore.h index db0606c1ab..bea7279042 100644 --- a/include/asm-s390/lowcore.h +++ b/include/asm-s390/lowcore.h | |||
| @@ -98,8 +98,8 @@ | |||
| 98 | #define __LC_KERNEL_ASCE 0xD58 | 98 | #define __LC_KERNEL_ASCE 0xD58 |
| 99 | #define __LC_USER_ASCE 0xD60 | 99 | #define __LC_USER_ASCE 0xD60 |
| 100 | #define __LC_PANIC_STACK 0xD68 | 100 | #define __LC_PANIC_STACK 0xD68 |
| 101 | #define __LC_CPUID 0xD90 | 101 | #define __LC_CPUID 0xD80 |
| 102 | #define __LC_CPUADDR 0xD98 | 102 | #define __LC_CPUADDR 0xD88 |
| 103 | #define __LC_IPLDEV 0xDB8 | 103 | #define __LC_IPLDEV 0xDB8 |
| 104 | #define __LC_JIFFY_TIMER 0xDC0 | 104 | #define __LC_JIFFY_TIMER 0xDC0 |
| 105 | #define __LC_CURRENT 0xDD8 | 105 | #define __LC_CURRENT 0xDD8 |
diff --git a/include/asm-s390/unistd.h b/include/asm-s390/unistd.h index 657d582e81..41c2792ff6 100644 --- a/include/asm-s390/unistd.h +++ b/include/asm-s390/unistd.h | |||
| @@ -296,8 +296,14 @@ | |||
| 296 | #define __NR_pselect6 301 | 296 | #define __NR_pselect6 301 |
| 297 | #define __NR_ppoll 302 | 297 | #define __NR_ppoll 302 |
| 298 | #define __NR_unshare 303 | 298 | #define __NR_unshare 303 |
| 299 | #define __NR_set_robust_list 304 | ||
| 300 | #define __NR_get_robust_list 305 | ||
| 301 | #define __NR_splice 306 | ||
| 302 | #define __NR_sync_file_range 307 | ||
| 303 | #define __NR_tee 308 | ||
| 304 | #define __NR_vmsplice 309 | ||
| 299 | 305 | ||
| 300 | #define NR_syscalls 304 | 306 | #define NR_syscalls 310 |
| 301 | 307 | ||
| 302 | /* | 308 | /* |
| 303 | * There are some system calls that are not present on 64 bit, some | 309 | * There are some system calls that are not present on 64 bit, some |
diff --git a/include/asm-sparc/unistd.h b/include/asm-sparc/unistd.h index 264f0ebeae..45a5765077 100644 --- a/include/asm-sparc/unistd.h +++ b/include/asm-sparc/unistd.h | |||
| @@ -41,7 +41,7 @@ | |||
| 41 | #define __NR_capset 22 /* Linux Specific */ | 41 | #define __NR_capset 22 /* Linux Specific */ |
| 42 | #define __NR_setuid 23 /* Implemented via setreuid in SunOS */ | 42 | #define __NR_setuid 23 /* Implemented via setreuid in SunOS */ |
| 43 | #define __NR_getuid 24 /* Common */ | 43 | #define __NR_getuid 24 /* Common */ |
| 44 | /* #define __NR_time alias 25 ENOSYS under SunOS */ | 44 | #define __NR_vmsplice 25 /* ENOSYS under SunOS */ |
| 45 | #define __NR_ptrace 26 /* Common */ | 45 | #define __NR_ptrace 26 /* Common */ |
| 46 | #define __NR_alarm 27 /* Implemented via setitimer in SunOS */ | 46 | #define __NR_alarm 27 /* Implemented via setitimer in SunOS */ |
| 47 | #define __NR_sigaltstack 28 /* Common */ | 47 | #define __NR_sigaltstack 28 /* Common */ |
| @@ -248,7 +248,7 @@ | |||
| 248 | #define __NR_setfsgid 229 /* Linux Specific */ | 248 | #define __NR_setfsgid 229 /* Linux Specific */ |
| 249 | #define __NR__newselect 230 /* Linux Specific */ | 249 | #define __NR__newselect 230 /* Linux Specific */ |
| 250 | #define __NR_time 231 /* Linux Specific */ | 250 | #define __NR_time 231 /* Linux Specific */ |
| 251 | #define __NR_sys_splice 232 /* Linux Specific */ | 251 | #define __NR_splice 232 /* Linux Specific */ |
| 252 | #define __NR_stime 233 /* Linux Specific */ | 252 | #define __NR_stime 233 /* Linux Specific */ |
| 253 | #define __NR_statfs64 234 /* Linux Specific */ | 253 | #define __NR_statfs64 234 /* Linux Specific */ |
| 254 | #define __NR_fstatfs64 235 /* Linux Specific */ | 254 | #define __NR_fstatfs64 235 /* Linux Specific */ |
| @@ -271,7 +271,7 @@ | |||
| 271 | #define __NR_getsid 252 | 271 | #define __NR_getsid 252 |
| 272 | #define __NR_fdatasync 253 | 272 | #define __NR_fdatasync 253 |
| 273 | #define __NR_nfsservctl 254 | 273 | #define __NR_nfsservctl 254 |
| 274 | #define __NR_sys_sync_file_range 255 | 274 | #define __NR_sync_file_range 255 |
| 275 | #define __NR_clock_settime 256 | 275 | #define __NR_clock_settime 256 |
| 276 | #define __NR_clock_gettime 257 | 276 | #define __NR_clock_gettime 257 |
| 277 | #define __NR_clock_getres 258 | 277 | #define __NR_clock_getres 258 |
| @@ -296,7 +296,7 @@ | |||
| 296 | #define __NR_mq_notify 277 | 296 | #define __NR_mq_notify 277 |
| 297 | #define __NR_mq_getsetattr 278 | 297 | #define __NR_mq_getsetattr 278 |
| 298 | #define __NR_waitid 279 | 298 | #define __NR_waitid 279 |
| 299 | #define __NR_sys_setaltroot 280 | 299 | #define __NR_tee 280 |
| 300 | #define __NR_add_key 281 | 300 | #define __NR_add_key 281 |
| 301 | #define __NR_request_key 282 | 301 | #define __NR_request_key 282 |
| 302 | #define __NR_keyctl 283 | 302 | #define __NR_keyctl 283 |
| @@ -316,11 +316,13 @@ | |||
| 316 | #define __NR_pselect6 297 | 316 | #define __NR_pselect6 297 |
| 317 | #define __NR_ppoll 298 | 317 | #define __NR_ppoll 298 |
| 318 | #define __NR_unshare 299 | 318 | #define __NR_unshare 299 |
| 319 | #define __NR_set_robust_list 300 | ||
| 320 | #define __NR_get_robust_list 301 | ||
| 319 | 321 | ||
| 320 | /* WARNING: You MAY NOT add syscall numbers larger than 299, since | 322 | /* WARNING: You MAY NOT add syscall numbers larger than 301, since |
| 321 | * all of the syscall tables in the Sparc kernel are | 323 | * all of the syscall tables in the Sparc kernel are |
| 322 | * sized to have 299 entries (starting at zero). Therefore | 324 | * sized to have 301 entries (starting at zero). Therefore |
| 323 | * find a free slot in the 0-299 range. | 325 | * find a free slot in the 0-301 range. |
| 324 | */ | 326 | */ |
| 325 | 327 | ||
| 326 | #define _syscall0(type,name) \ | 328 | #define _syscall0(type,name) \ |
diff --git a/include/asm-sparc64/dma-mapping.h b/include/asm-sparc64/dma-mapping.h index c7d5804ba7..a8d39f23d4 100644 --- a/include/asm-sparc64/dma-mapping.h +++ b/include/asm-sparc64/dma-mapping.h | |||
| @@ -4,7 +4,146 @@ | |||
| 4 | #include <linux/config.h> | 4 | #include <linux/config.h> |
| 5 | 5 | ||
| 6 | #ifdef CONFIG_PCI | 6 | #ifdef CONFIG_PCI |
| 7 | #include <asm-generic/dma-mapping.h> | 7 | |
| 8 | /* we implement the API below in terms of the existing PCI one, | ||
| 9 | * so include it */ | ||
| 10 | #include <linux/pci.h> | ||
| 11 | /* need struct page definitions */ | ||
| 12 | #include <linux/mm.h> | ||
| 13 | |||
| 14 | static inline int | ||
| 15 | dma_supported(struct device *dev, u64 mask) | ||
| 16 | { | ||
| 17 | BUG_ON(dev->bus != &pci_bus_type); | ||
| 18 | |||
| 19 | return pci_dma_supported(to_pci_dev(dev), mask); | ||
| 20 | } | ||
| 21 | |||
| 22 | static inline int | ||
| 23 | dma_set_mask(struct device *dev, u64 dma_mask) | ||
| 24 | { | ||
| 25 | BUG_ON(dev->bus != &pci_bus_type); | ||
| 26 | |||
| 27 | return pci_set_dma_mask(to_pci_dev(dev), dma_mask); | ||
| 28 | } | ||
| 29 | |||
| 30 | static inline void * | ||
| 31 | dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, | ||
| 32 | gfp_t flag) | ||
| 33 | { | ||
| 34 | BUG_ON(dev->bus != &pci_bus_type); | ||
| 35 | |||
| 36 | return pci_iommu_ops->alloc_consistent(to_pci_dev(dev), size, dma_handle, flag); | ||
| 37 | } | ||
| 38 | |||
| 39 | static inline void | ||
| 40 | dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, | ||
| 41 | dma_addr_t dma_handle) | ||
| 42 | { | ||
| 43 | BUG_ON(dev->bus != &pci_bus_type); | ||
| 44 | |||
| 45 | pci_free_consistent(to_pci_dev(dev), size, cpu_addr, dma_handle); | ||
| 46 | } | ||
| 47 | |||
| 48 | static inline dma_addr_t | ||
| 49 | dma_map_single(struct device *dev, void *cpu_addr, size_t size, | ||
| 50 | enum dma_data_direction direction) | ||
| 51 | { | ||
| 52 | BUG_ON(dev->bus != &pci_bus_type); | ||
| 53 | |||
| 54 | return pci_map_single(to_pci_dev(dev), cpu_addr, size, (int)direction); | ||
| 55 | } | ||
| 56 | |||
| 57 | static inline void | ||
| 58 | dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, | ||
| 59 | enum dma_data_direction direction) | ||
| 60 | { | ||
| 61 | BUG_ON(dev->bus != &pci_bus_type); | ||
| 62 | |||
| 63 | pci_unmap_single(to_pci_dev(dev), dma_addr, size, (int)direction); | ||
| 64 | } | ||
| 65 | |||
| 66 | static inline dma_addr_t | ||
| 67 | dma_map_page(struct device *dev, struct page *page, | ||
| 68 | unsigned long offset, size_t size, | ||
| 69 | enum dma_data_direction direction) | ||
| 70 | { | ||
| 71 | BUG_ON(dev->bus != &pci_bus_type); | ||
| 72 | |||
| 73 | return pci_map_page(to_pci_dev(dev), page, offset, size, (int)direction); | ||
| 74 | } | ||
| 75 | |||
| 76 | static inline void | ||
| 77 | dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size, | ||
| 78 | enum dma_data_direction direction) | ||
| 79 | { | ||
| 80 | BUG_ON(dev->bus != &pci_bus_type); | ||
| 81 | |||
| 82 | pci_unmap_page(to_pci_dev(dev), dma_address, size, (int)direction); | ||
| 83 | } | ||
| 84 | |||
| 85 | static inline int | ||
| 86 | dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, | ||
| 87 | enum dma_data_direction direction) | ||
| 88 | { | ||
| 89 | BUG_ON(dev->bus != &pci_bus_type); | ||
| 90 | |||
| 91 | return pci_map_sg(to_pci_dev(dev), sg, nents, (int)direction); | ||
| 92 | } | ||
| 93 | |||
| 94 | static inline void | ||
| 95 | dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries, | ||
| 96 | enum dma_data_direction direction) | ||
| 97 | { | ||
| 98 | BUG_ON(dev->bus != &pci_bus_type); | ||
| 99 | |||
| 100 | pci_unmap_sg(to_pci_dev(dev), sg, nhwentries, (int)direction); | ||
| 101 | } | ||
| 102 | |||
| 103 | static inline void | ||
| 104 | dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, | ||
| 105 | enum dma_data_direction direction) | ||
| 106 | { | ||
| 107 | BUG_ON(dev->bus != &pci_bus_type); | ||
| 108 | |||
| 109 | pci_dma_sync_single_for_cpu(to_pci_dev(dev), dma_handle, | ||
| 110 | size, (int)direction); | ||
| 111 | } | ||
| 112 | |||
| 113 | static inline void | ||
| 114 | dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size, | ||
| 115 | enum dma_data_direction direction) | ||
| 116 | { | ||
| 117 | BUG_ON(dev->bus != &pci_bus_type); | ||
| 118 | |||
| 119 | pci_dma_sync_single_for_device(to_pci_dev(dev), dma_handle, | ||
| 120 | size, (int)direction); | ||
| 121 | } | ||
| 122 | |||
| 123 | static inline void | ||
| 124 | dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems, | ||
| 125 | enum dma_data_direction direction) | ||
| 126 | { | ||
| 127 | BUG_ON(dev->bus != &pci_bus_type); | ||
| 128 | |||
| 129 | pci_dma_sync_sg_for_cpu(to_pci_dev(dev), sg, nelems, (int)direction); | ||
| 130 | } | ||
| 131 | |||
| 132 | static inline void | ||
| 133 | dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems, | ||
| 134 | enum dma_data_direction direction) | ||
| 135 | { | ||
| 136 | BUG_ON(dev->bus != &pci_bus_type); | ||
| 137 | |||
| 138 | pci_dma_sync_sg_for_device(to_pci_dev(dev), sg, nelems, (int)direction); | ||
| 139 | } | ||
| 140 | |||
| 141 | static inline int | ||
| 142 | dma_mapping_error(dma_addr_t dma_addr) | ||
| 143 | { | ||
| 144 | return pci_dma_mapping_error(dma_addr); | ||
| 145 | } | ||
| 146 | |||
| 8 | #else | 147 | #else |
| 9 | 148 | ||
| 10 | struct device; | 149 | struct device; |
diff --git a/include/asm-sparc64/pci.h b/include/asm-sparc64/pci.h index 7c5a589ea4..e1ea67bc32 100644 --- a/include/asm-sparc64/pci.h +++ b/include/asm-sparc64/pci.h | |||
| @@ -42,7 +42,7 @@ static inline void pcibios_penalize_isa_irq(int irq, int active) | |||
| 42 | struct pci_dev; | 42 | struct pci_dev; |
| 43 | 43 | ||
| 44 | struct pci_iommu_ops { | 44 | struct pci_iommu_ops { |
| 45 | void *(*alloc_consistent)(struct pci_dev *, size_t, dma_addr_t *); | 45 | void *(*alloc_consistent)(struct pci_dev *, size_t, dma_addr_t *, gfp_t); |
| 46 | void (*free_consistent)(struct pci_dev *, size_t, void *, dma_addr_t); | 46 | void (*free_consistent)(struct pci_dev *, size_t, void *, dma_addr_t); |
| 47 | dma_addr_t (*map_single)(struct pci_dev *, void *, size_t, int); | 47 | dma_addr_t (*map_single)(struct pci_dev *, void *, size_t, int); |
| 48 | void (*unmap_single)(struct pci_dev *, dma_addr_t, size_t, int); | 48 | void (*unmap_single)(struct pci_dev *, dma_addr_t, size_t, int); |
| @@ -59,7 +59,7 @@ extern struct pci_iommu_ops *pci_iommu_ops; | |||
| 59 | */ | 59 | */ |
| 60 | static inline void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size, dma_addr_t *dma_handle) | 60 | static inline void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size, dma_addr_t *dma_handle) |
| 61 | { | 61 | { |
| 62 | return pci_iommu_ops->alloc_consistent(hwdev, size, dma_handle); | 62 | return pci_iommu_ops->alloc_consistent(hwdev, size, dma_handle, GFP_ATOMIC); |
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | /* Free and unmap a consistent DMA buffer. | 65 | /* Free and unmap a consistent DMA buffer. |
diff --git a/include/asm-sparc64/pgtable.h b/include/asm-sparc64/pgtable.h index c44e746653..cd464f469a 100644 --- a/include/asm-sparc64/pgtable.h +++ b/include/asm-sparc64/pgtable.h | |||
| @@ -689,6 +689,23 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *p | |||
| 689 | #define pte_clear(mm,addr,ptep) \ | 689 | #define pte_clear(mm,addr,ptep) \ |
| 690 | set_pte_at((mm), (addr), (ptep), __pte(0UL)) | 690 | set_pte_at((mm), (addr), (ptep), __pte(0UL)) |
| 691 | 691 | ||
| 692 | #ifdef DCACHE_ALIASING_POSSIBLE | ||
| 693 | #define __HAVE_ARCH_MOVE_PTE | ||
| 694 | #define move_pte(pte, prot, old_addr, new_addr) \ | ||
| 695 | ({ \ | ||
| 696 | pte_t newpte = (pte); \ | ||
| 697 | if (tlb_type != hypervisor && pte_present(pte)) { \ | ||
| 698 | unsigned long this_pfn = pte_pfn(pte); \ | ||
| 699 | \ | ||
| 700 | if (pfn_valid(this_pfn) && \ | ||
| 701 | (((old_addr) ^ (new_addr)) & (1 << 13))) \ | ||
| 702 | flush_dcache_page_all(current->mm, \ | ||
| 703 | pfn_to_page(this_pfn)); \ | ||
| 704 | } \ | ||
| 705 | newpte; \ | ||
| 706 | }) | ||
| 707 | #endif | ||
| 708 | |||
| 692 | extern pgd_t swapper_pg_dir[2048]; | 709 | extern pgd_t swapper_pg_dir[2048]; |
| 693 | extern pmd_t swapper_low_pmd_dir[2048]; | 710 | extern pmd_t swapper_low_pmd_dir[2048]; |
| 694 | 711 | ||
diff --git a/include/asm-sparc64/tlbflush.h b/include/asm-sparc64/tlbflush.h index 9ad5d9c51d..e3a7c453b5 100644 --- a/include/asm-sparc64/tlbflush.h +++ b/include/asm-sparc64/tlbflush.h | |||
| @@ -22,8 +22,6 @@ extern void flush_tlb_pending(void); | |||
| 22 | /* Local cpu only. */ | 22 | /* Local cpu only. */ |
| 23 | extern void __flush_tlb_all(void); | 23 | extern void __flush_tlb_all(void); |
| 24 | 24 | ||
| 25 | extern void __flush_tlb_page(unsigned long context, unsigned long page, unsigned long r); | ||
| 26 | |||
| 27 | extern void __flush_tlb_kernel_range(unsigned long start, unsigned long end); | 25 | extern void __flush_tlb_kernel_range(unsigned long start, unsigned long end); |
| 28 | 26 | ||
| 29 | #ifndef CONFIG_SMP | 27 | #ifndef CONFIG_SMP |
diff --git a/include/asm-sparc64/unistd.h b/include/asm-sparc64/unistd.h index d0544b4f47..998ef4ab0e 100644 --- a/include/asm-sparc64/unistd.h +++ b/include/asm-sparc64/unistd.h | |||
| @@ -41,7 +41,7 @@ | |||
| 41 | #define __NR_capset 22 /* Linux Specific */ | 41 | #define __NR_capset 22 /* Linux Specific */ |
| 42 | #define __NR_setuid 23 /* Implemented via setreuid in SunOS */ | 42 | #define __NR_setuid 23 /* Implemented via setreuid in SunOS */ |
| 43 | #define __NR_getuid 24 /* Common */ | 43 | #define __NR_getuid 24 /* Common */ |
| 44 | /* #define __NR_time alias 25 ENOSYS under SunOS */ | 44 | #define __NR_vmsplice 25 /* ENOSYS under SunOS */ |
| 45 | #define __NR_ptrace 26 /* Common */ | 45 | #define __NR_ptrace 26 /* Common */ |
| 46 | #define __NR_alarm 27 /* Implemented via setitimer in SunOS */ | 46 | #define __NR_alarm 27 /* Implemented via setitimer in SunOS */ |
| 47 | #define __NR_sigaltstack 28 /* Common */ | 47 | #define __NR_sigaltstack 28 /* Common */ |
| @@ -250,7 +250,7 @@ | |||
| 250 | #ifdef __KERNEL__ | 250 | #ifdef __KERNEL__ |
| 251 | #define __NR_time 231 /* Linux sparc32 */ | 251 | #define __NR_time 231 /* Linux sparc32 */ |
| 252 | #endif | 252 | #endif |
| 253 | #define __NR_sys_splice 232 /* Linux Specific */ | 253 | #define __NR_splice 232 /* Linux Specific */ |
| 254 | #define __NR_stime 233 /* Linux Specific */ | 254 | #define __NR_stime 233 /* Linux Specific */ |
| 255 | #define __NR_statfs64 234 /* Linux Specific */ | 255 | #define __NR_statfs64 234 /* Linux Specific */ |
| 256 | #define __NR_fstatfs64 235 /* Linux Specific */ | 256 | #define __NR_fstatfs64 235 /* Linux Specific */ |
| @@ -273,7 +273,7 @@ | |||
| 273 | #define __NR_getsid 252 | 273 | #define __NR_getsid 252 |
| 274 | #define __NR_fdatasync 253 | 274 | #define __NR_fdatasync 253 |
| 275 | #define __NR_nfsservctl 254 | 275 | #define __NR_nfsservctl 254 |
| 276 | #define __NR_sys_sync_file_range 255 | 276 | #define __NR_sync_file_range 255 |
| 277 | #define __NR_clock_settime 256 | 277 | #define __NR_clock_settime 256 |
| 278 | #define __NR_clock_gettime 257 | 278 | #define __NR_clock_gettime 257 |
| 279 | #define __NR_clock_getres 258 | 279 | #define __NR_clock_getres 258 |
| @@ -298,7 +298,7 @@ | |||
| 298 | #define __NR_mq_notify 277 | 298 | #define __NR_mq_notify 277 |
| 299 | #define __NR_mq_getsetattr 278 | 299 | #define __NR_mq_getsetattr 278 |
| 300 | #define __NR_waitid 279 | 300 | #define __NR_waitid 279 |
| 301 | /*#define __NR_sys_setaltroot 280 available (was setaltroot) */ | 301 | #define __NR_tee 280 |
| 302 | #define __NR_add_key 281 | 302 | #define __NR_add_key 281 |
| 303 | #define __NR_request_key 282 | 303 | #define __NR_request_key 282 |
| 304 | #define __NR_keyctl 283 | 304 | #define __NR_keyctl 283 |
| @@ -318,11 +318,13 @@ | |||
| 318 | #define __NR_pselect6 297 | 318 | #define __NR_pselect6 297 |
| 319 | #define __NR_ppoll 298 | 319 | #define __NR_ppoll 298 |
| 320 | #define __NR_unshare 299 | 320 | #define __NR_unshare 299 |
| 321 | #define __NR_set_robust_list 300 | ||
| 322 | #define __NR_get_robust_list 301 | ||
| 321 | 323 | ||
| 322 | /* WARNING: You MAY NOT add syscall numbers larger than 299, since | 324 | /* WARNING: You MAY NOT add syscall numbers larger than 301, since |
| 323 | * all of the syscall tables in the Sparc kernel are | 325 | * all of the syscall tables in the Sparc kernel are |
| 324 | * sized to have 299 entries (starting at zero). Therefore | 326 | * sized to have 301 entries (starting at zero). Therefore |
| 325 | * find a free slot in the 0-299 range. | 327 | * find a free slot in the 0-301 range. |
| 326 | */ | 328 | */ |
| 327 | 329 | ||
| 328 | #define _syscall0(type,name) \ | 330 | #define _syscall0(type,name) \ |
diff --git a/include/asm-um/irqflags.h b/include/asm-um/irqflags.h new file mode 100644 index 0000000000..659b9abdfd --- /dev/null +++ b/include/asm-um/irqflags.h | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | #ifndef __UM_IRQFLAGS_H | ||
| 2 | #define __UM_IRQFLAGS_H | ||
| 3 | |||
| 4 | /* Empty for now */ | ||
| 5 | |||
| 6 | #endif | ||
diff --git a/include/asm-um/uaccess.h b/include/asm-um/uaccess.h index bea5a015f6..16c734af91 100644 --- a/include/asm-um/uaccess.h +++ b/include/asm-um/uaccess.h | |||
| @@ -41,11 +41,11 @@ | |||
| 41 | 41 | ||
| 42 | #define __get_user(x, ptr) \ | 42 | #define __get_user(x, ptr) \ |
| 43 | ({ \ | 43 | ({ \ |
| 44 | const __typeof__(ptr) __private_ptr = ptr; \ | 44 | const __typeof__(*(ptr)) __user *__private_ptr = (ptr); \ |
| 45 | __typeof__(x) __private_val; \ | 45 | __typeof__(x) __private_val; \ |
| 46 | int __private_ret = -EFAULT; \ | 46 | int __private_ret = -EFAULT; \ |
| 47 | (x) = (__typeof__(*(__private_ptr)))0; \ | 47 | (x) = (__typeof__(*(__private_ptr)))0; \ |
| 48 | if (__copy_from_user((void *) &__private_val, (__private_ptr), \ | 48 | if (__copy_from_user((__force void *)&__private_val, (__private_ptr),\ |
| 49 | sizeof(*(__private_ptr))) == 0) { \ | 49 | sizeof(*(__private_ptr))) == 0) { \ |
| 50 | (x) = (__typeof__(*(__private_ptr))) __private_val; \ | 50 | (x) = (__typeof__(*(__private_ptr))) __private_val; \ |
| 51 | __private_ret = 0; \ | 51 | __private_ret = 0; \ |
| @@ -62,7 +62,7 @@ | |||
| 62 | 62 | ||
| 63 | #define __put_user(x, ptr) \ | 63 | #define __put_user(x, ptr) \ |
| 64 | ({ \ | 64 | ({ \ |
| 65 | __typeof__(ptr) __private_ptr = ptr; \ | 65 | __typeof__(*(ptr)) __user *__private_ptr = ptr; \ |
| 66 | __typeof__(*(__private_ptr)) __private_val; \ | 66 | __typeof__(*(__private_ptr)) __private_val; \ |
| 67 | int __private_ret = -EFAULT; \ | 67 | int __private_ret = -EFAULT; \ |
| 68 | __private_val = (__typeof__(*(__private_ptr))) (x); \ | 68 | __private_val = (__typeof__(*(__private_ptr))) (x); \ |
diff --git a/include/asm-x86_64/cache.h b/include/asm-x86_64/cache.h index c8043a1615..f8dff1c675 100644 --- a/include/asm-x86_64/cache.h +++ b/include/asm-x86_64/cache.h | |||
| @@ -20,8 +20,8 @@ | |||
| 20 | __attribute__((__section__(".data.page_aligned"))) | 20 | __attribute__((__section__(".data.page_aligned"))) |
| 21 | #endif | 21 | #endif |
| 22 | 22 | ||
| 23 | #define __read_mostly __attribute__((__section__(".data.read_mostly"))) | ||
| 24 | |||
| 25 | #endif | 23 | #endif |
| 26 | 24 | ||
| 25 | #define __read_mostly __attribute__((__section__(".data.read_mostly"))) | ||
| 26 | |||
| 27 | #endif | 27 | #endif |
diff --git a/include/asm-x86_64/cpufeature.h b/include/asm-x86_64/cpufeature.h index 76bb6193ae..662964b74e 100644 --- a/include/asm-x86_64/cpufeature.h +++ b/include/asm-x86_64/cpufeature.h | |||
| @@ -64,6 +64,7 @@ | |||
| 64 | #define X86_FEATURE_REP_GOOD (3*32+ 4) /* rep microcode works well on this CPU */ | 64 | #define X86_FEATURE_REP_GOOD (3*32+ 4) /* rep microcode works well on this CPU */ |
| 65 | #define X86_FEATURE_CONSTANT_TSC (3*32+5) /* TSC runs at constant rate */ | 65 | #define X86_FEATURE_CONSTANT_TSC (3*32+5) /* TSC runs at constant rate */ |
| 66 | #define X86_FEATURE_SYNC_RDTSC (3*32+6) /* RDTSC syncs CPU core */ | 66 | #define X86_FEATURE_SYNC_RDTSC (3*32+6) /* RDTSC syncs CPU core */ |
| 67 | #define X86_FEATURE_FXSAVE_LEAK (3*32+7) /* FIP/FOP/FDP leaks through FXSAVE */ | ||
| 67 | 68 | ||
| 68 | /* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */ | 69 | /* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */ |
| 69 | #define X86_FEATURE_XMM3 (4*32+ 0) /* Streaming SIMD Extensions-3 */ | 70 | #define X86_FEATURE_XMM3 (4*32+ 0) /* Streaming SIMD Extensions-3 */ |
diff --git a/include/asm-x86_64/e820.h b/include/asm-x86_64/e820.h index 93b51df516..670a3388e7 100644 --- a/include/asm-x86_64/e820.h +++ b/include/asm-x86_64/e820.h | |||
| @@ -59,6 +59,8 @@ extern void __init parse_memopt(char *p, char **end); | |||
| 59 | extern void __init parse_memmapopt(char *p, char **end); | 59 | extern void __init parse_memmapopt(char *p, char **end); |
| 60 | 60 | ||
| 61 | extern struct e820map e820; | 61 | extern struct e820map e820; |
| 62 | |||
| 63 | extern unsigned ebda_addr, ebda_size; | ||
| 62 | #endif/*!__ASSEMBLY__*/ | 64 | #endif/*!__ASSEMBLY__*/ |
| 63 | 65 | ||
| 64 | #endif/*__E820_HEADER*/ | 66 | #endif/*__E820_HEADER*/ |
diff --git a/include/asm-x86_64/elf.h b/include/asm-x86_64/elf.h index c98633af07..b4f8f4a41a 100644 --- a/include/asm-x86_64/elf.h +++ b/include/asm-x86_64/elf.h | |||
| @@ -159,7 +159,7 @@ extern int dump_task_fpu (struct task_struct *, elf_fpregset_t *); | |||
| 159 | #define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs) | 159 | #define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs) |
| 160 | 160 | ||
| 161 | /* 1GB for 64bit, 8MB for 32bit */ | 161 | /* 1GB for 64bit, 8MB for 32bit */ |
| 162 | #define STACK_RND_MASK (is_compat_task() ? 0x7ff : 0x3fffff) | 162 | #define STACK_RND_MASK (test_thread_flag(TIF_IA32) ? 0x7ff : 0x3fffff) |
| 163 | 163 | ||
| 164 | #endif | 164 | #endif |
| 165 | 165 | ||
diff --git a/include/asm-x86_64/i387.h b/include/asm-x86_64/i387.h index 876eb9a2fe..cba8a3b0cd 100644 --- a/include/asm-x86_64/i387.h +++ b/include/asm-x86_64/i387.h | |||
| @@ -72,6 +72,23 @@ extern int set_fpregs(struct task_struct *tsk, | |||
| 72 | #define set_fpu_swd(t,val) ((t)->thread.i387.fxsave.swd = (val)) | 72 | #define set_fpu_swd(t,val) ((t)->thread.i387.fxsave.swd = (val)) |
| 73 | #define set_fpu_fxsr_twd(t,val) ((t)->thread.i387.fxsave.twd = (val)) | 73 | #define set_fpu_fxsr_twd(t,val) ((t)->thread.i387.fxsave.twd = (val)) |
| 74 | 74 | ||
| 75 | #define X87_FSW_ES (1 << 7) /* Exception Summary */ | ||
| 76 | |||
| 77 | /* AMD CPUs don't save/restore FDP/FIP/FOP unless an exception | ||
| 78 | is pending. Clear the x87 state here by setting it to fixed | ||
| 79 | values. The kernel data segment can be sometimes 0 and sometimes | ||
| 80 | new user value. Both should be ok. | ||
| 81 | Use the PDA as safe address because it should be already in L1. */ | ||
| 82 | static inline void clear_fpu_state(struct i387_fxsave_struct *fx) | ||
| 83 | { | ||
| 84 | if (unlikely(fx->swd & X87_FSW_ES)) | ||
| 85 | asm volatile("fnclex"); | ||
| 86 | alternative_input(ASM_NOP8 ASM_NOP2, | ||
| 87 | " emms\n" /* clear stack tags */ | ||
| 88 | " fildl %%gs:0", /* load to clear state */ | ||
| 89 | X86_FEATURE_FXSAVE_LEAK); | ||
| 90 | } | ||
| 91 | |||
| 75 | static inline int restore_fpu_checking(struct i387_fxsave_struct *fx) | 92 | static inline int restore_fpu_checking(struct i387_fxsave_struct *fx) |
| 76 | { | 93 | { |
| 77 | int err; | 94 | int err; |
| @@ -119,6 +136,7 @@ static inline int save_i387_checking(struct i387_fxsave_struct __user *fx) | |||
| 119 | #endif | 136 | #endif |
| 120 | if (unlikely(err)) | 137 | if (unlikely(err)) |
| 121 | __clear_user(fx, sizeof(struct i387_fxsave_struct)); | 138 | __clear_user(fx, sizeof(struct i387_fxsave_struct)); |
| 139 | /* No need to clear here because the caller clears USED_MATH */ | ||
| 122 | return err; | 140 | return err; |
| 123 | } | 141 | } |
| 124 | 142 | ||
| @@ -149,7 +167,7 @@ static inline void __fxsave_clear(struct task_struct *tsk) | |||
| 149 | "i" (offsetof(__typeof__(*tsk), | 167 | "i" (offsetof(__typeof__(*tsk), |
| 150 | thread.i387.fxsave))); | 168 | thread.i387.fxsave))); |
| 151 | #endif | 169 | #endif |
| 152 | __asm__ __volatile__("fnclex"); | 170 | clear_fpu_state(&tsk->thread.i387.fxsave); |
| 153 | } | 171 | } |
| 154 | 172 | ||
| 155 | static inline void kernel_fpu_begin(void) | 173 | static inline void kernel_fpu_begin(void) |
diff --git a/include/asm-x86_64/io_apic.h b/include/asm-x86_64/io_apic.h index ee1bc69aec..52484e82c6 100644 --- a/include/asm-x86_64/io_apic.h +++ b/include/asm-x86_64/io_apic.h | |||
| @@ -205,6 +205,7 @@ extern int skip_ioapic_setup; | |||
| 205 | extern int io_apic_get_version (int ioapic); | 205 | extern int io_apic_get_version (int ioapic); |
| 206 | extern int io_apic_get_redir_entries (int ioapic); | 206 | extern int io_apic_get_redir_entries (int ioapic); |
| 207 | extern int io_apic_set_pci_routing (int ioapic, int pin, int irq, int, int); | 207 | extern int io_apic_set_pci_routing (int ioapic, int pin, int irq, int, int); |
| 208 | extern int timer_uses_ioapic_pin_0; | ||
| 208 | #endif | 209 | #endif |
| 209 | 210 | ||
| 210 | extern int sis_apic_bug; /* dummy */ | 211 | extern int sis_apic_bug; /* dummy */ |
diff --git a/include/asm-x86_64/mmzone.h b/include/asm-x86_64/mmzone.h index 6b18cd8f29..6944e7122d 100644 --- a/include/asm-x86_64/mmzone.h +++ b/include/asm-x86_64/mmzone.h | |||
| @@ -12,7 +12,8 @@ | |||
| 12 | 12 | ||
| 13 | #include <asm/smp.h> | 13 | #include <asm/smp.h> |
| 14 | 14 | ||
| 15 | #define NODEMAPSIZE 0xfff | 15 | /* Should really switch to dynamic allocation at some point */ |
| 16 | #define NODEMAPSIZE 0x4fff | ||
| 16 | 17 | ||
| 17 | /* Simple perfect hash to map physical addresses to node numbers */ | 18 | /* Simple perfect hash to map physical addresses to node numbers */ |
| 18 | struct memnode { | 19 | struct memnode { |
diff --git a/include/asm-x86_64/percpu.h b/include/asm-x86_64/percpu.h index 4405b4adea..7f33aaf9f7 100644 --- a/include/asm-x86_64/percpu.h +++ b/include/asm-x86_64/percpu.h | |||
| @@ -26,7 +26,7 @@ | |||
| 26 | #define percpu_modcopy(pcpudst, src, size) \ | 26 | #define percpu_modcopy(pcpudst, src, size) \ |
| 27 | do { \ | 27 | do { \ |
| 28 | unsigned int __i; \ | 28 | unsigned int __i; \ |
| 29 | for_each_cpu(__i) \ | 29 | for_each_possible_cpu(__i) \ |
| 30 | memcpy((pcpudst)+__per_cpu_offset(__i), \ | 30 | memcpy((pcpudst)+__per_cpu_offset(__i), \ |
| 31 | (src), (size)); \ | 31 | (src), (size)); \ |
| 32 | } while (0) | 32 | } while (0) |
diff --git a/include/asm-x86_64/unistd.h b/include/asm-x86_64/unistd.h index f21ff2c1e9..feb77cb8c0 100644 --- a/include/asm-x86_64/unistd.h +++ b/include/asm-x86_64/unistd.h | |||
| @@ -611,8 +611,14 @@ __SYSCALL(__NR_set_robust_list, sys_set_robust_list) | |||
| 611 | __SYSCALL(__NR_get_robust_list, sys_get_robust_list) | 611 | __SYSCALL(__NR_get_robust_list, sys_get_robust_list) |
| 612 | #define __NR_splice 275 | 612 | #define __NR_splice 275 |
| 613 | __SYSCALL(__NR_splice, sys_splice) | 613 | __SYSCALL(__NR_splice, sys_splice) |
| 614 | 614 | #define __NR_tee 276 | |
| 615 | #define __NR_syscall_max __NR_splice | 615 | __SYSCALL(__NR_tee, sys_tee) |
| 616 | #define __NR_sync_file_range 277 | ||
| 617 | __SYSCALL(__NR_sync_file_range, sys_sync_file_range) | ||
| 618 | #define __NR_vmsplice 278 | ||
| 619 | __SYSCALL(__NR_vmsplice, sys_vmsplice) | ||
| 620 | |||
| 621 | #define __NR_syscall_max __NR_vmsplice | ||
| 616 | 622 | ||
| 617 | #ifndef __NO_STUBS | 623 | #ifndef __NO_STUBS |
| 618 | 624 | ||
diff --git a/include/asm-xtensa/ioctls.h b/include/asm-xtensa/ioctls.h index 10c443435c..3b89a772d0 100644 --- a/include/asm-xtensa/ioctls.h +++ b/include/asm-xtensa/ioctls.h | |||
| @@ -107,6 +107,6 @@ | |||
| 107 | #define TIOCSERSETMULTI _IOW('T', 91, struct serial_multiport_struct) /* Set multiport config */ | 107 | #define TIOCSERSETMULTI _IOW('T', 91, struct serial_multiport_struct) /* Set multiport config */ |
| 108 | 108 | ||
| 109 | #define TIOCMIWAIT _IO('T', 92) /* wait for a change on serial input line(s) */ | 109 | #define TIOCMIWAIT _IO('T', 92) /* wait for a change on serial input line(s) */ |
| 110 | #define TIOCGICOUNT _IOR('T', 93, struct async_icount) /* read serial port inline interrupt counts */ | 110 | #define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ |
| 111 | 111 | ||
| 112 | #endif /* _XTENSA_IOCTLS_H */ | 112 | #endif /* _XTENSA_IOCTLS_H */ |
diff --git a/include/asm-xtensa/signal.h b/include/asm-xtensa/signal.h index 5d6fc9cdf5..a99c9aec64 100644 --- a/include/asm-xtensa/signal.h +++ b/include/asm-xtensa/signal.h | |||
| @@ -118,9 +118,9 @@ typedef struct { | |||
| 118 | * SA_INTERRUPT is also used by the irq handling routines. | 118 | * SA_INTERRUPT is also used by the irq handling routines. |
| 119 | * SA_SHIRQ is for shared interrupt support on PCI and EISA. | 119 | * SA_SHIRQ is for shared interrupt support on PCI and EISA. |
| 120 | */ | 120 | */ |
| 121 | #define SA_PROBE SA_ONESHOT | ||
| 122 | #define SA_SAMPLE_RANDOM SA_RESTART | 121 | #define SA_SAMPLE_RANDOM SA_RESTART |
| 123 | #define SA_SHIRQ 0x04000000 | 122 | #define SA_SHIRQ 0x04000000 |
| 123 | #define SA_PROBEIRQ 0x08000000 | ||
| 124 | #endif | 124 | #endif |
| 125 | 125 | ||
| 126 | #define SIG_BLOCK 0 /* for blocking signals */ | 126 | #define SIG_BLOCK 0 /* for blocking signals */ |
diff --git a/include/linux/audit.h b/include/linux/audit.h index 1c47c59058..b74c148f14 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h | |||
| @@ -83,6 +83,7 @@ | |||
| 83 | #define AUDIT_CONFIG_CHANGE 1305 /* Audit system configuration change */ | 83 | #define AUDIT_CONFIG_CHANGE 1305 /* Audit system configuration change */ |
| 84 | #define AUDIT_SOCKADDR 1306 /* sockaddr copied as syscall arg */ | 84 | #define AUDIT_SOCKADDR 1306 /* sockaddr copied as syscall arg */ |
| 85 | #define AUDIT_CWD 1307 /* Current working directory */ | 85 | #define AUDIT_CWD 1307 /* Current working directory */ |
| 86 | #define AUDIT_IPC_SET_PERM 1311 /* IPC new permissions record type */ | ||
| 86 | 87 | ||
| 87 | #define AUDIT_AVC 1400 /* SE Linux avc denial or grant */ | 88 | #define AUDIT_AVC 1400 /* SE Linux avc denial or grant */ |
| 88 | #define AUDIT_SELINUX_ERR 1401 /* Internal SE Linux Errors */ | 89 | #define AUDIT_SELINUX_ERR 1401 /* Internal SE Linux Errors */ |
| @@ -145,6 +146,11 @@ | |||
| 145 | #define AUDIT_PERS 10 | 146 | #define AUDIT_PERS 10 |
| 146 | #define AUDIT_ARCH 11 | 147 | #define AUDIT_ARCH 11 |
| 147 | #define AUDIT_MSGTYPE 12 | 148 | #define AUDIT_MSGTYPE 12 |
| 149 | #define AUDIT_SE_USER 13 /* security label user */ | ||
| 150 | #define AUDIT_SE_ROLE 14 /* security label role */ | ||
| 151 | #define AUDIT_SE_TYPE 15 /* security label type */ | ||
| 152 | #define AUDIT_SE_SEN 16 /* security label sensitivity label */ | ||
| 153 | #define AUDIT_SE_CLR 17 /* security label clearance label */ | ||
| 148 | 154 | ||
| 149 | /* These are ONLY useful when checking | 155 | /* These are ONLY useful when checking |
| 150 | * at syscall exit time (AUDIT_AT_EXIT). */ | 156 | * at syscall exit time (AUDIT_AT_EXIT). */ |
| @@ -287,10 +293,10 @@ struct netlink_skb_parms; | |||
| 287 | /* Public API */ | 293 | /* Public API */ |
| 288 | extern int audit_alloc(struct task_struct *task); | 294 | extern int audit_alloc(struct task_struct *task); |
| 289 | extern void audit_free(struct task_struct *task); | 295 | extern void audit_free(struct task_struct *task); |
| 290 | extern void audit_syscall_entry(struct task_struct *task, int arch, | 296 | extern void audit_syscall_entry(int arch, |
| 291 | int major, unsigned long a0, unsigned long a1, | 297 | int major, unsigned long a0, unsigned long a1, |
| 292 | unsigned long a2, unsigned long a3); | 298 | unsigned long a2, unsigned long a3); |
| 293 | extern void audit_syscall_exit(struct task_struct *task, int failed, long return_code); | 299 | extern void audit_syscall_exit(int failed, long return_code); |
| 294 | extern void audit_getname(const char *name); | 300 | extern void audit_getname(const char *name); |
| 295 | extern void audit_putname(const char *name); | 301 | extern void audit_putname(const char *name); |
| 296 | extern void __audit_inode(const char *name, const struct inode *inode, unsigned flags); | 302 | extern void __audit_inode(const char *name, const struct inode *inode, unsigned flags); |
| @@ -314,7 +320,8 @@ extern void auditsc_get_stamp(struct audit_context *ctx, | |||
| 314 | struct timespec *t, unsigned int *serial); | 320 | struct timespec *t, unsigned int *serial); |
| 315 | extern int audit_set_loginuid(struct task_struct *task, uid_t loginuid); | 321 | extern int audit_set_loginuid(struct task_struct *task, uid_t loginuid); |
| 316 | extern uid_t audit_get_loginuid(struct audit_context *ctx); | 322 | extern uid_t audit_get_loginuid(struct audit_context *ctx); |
| 317 | extern int audit_ipc_perms(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode, struct kern_ipc_perm *ipcp); | 323 | extern int audit_ipc_obj(struct kern_ipc_perm *ipcp); |
| 324 | extern int audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode, struct kern_ipc_perm *ipcp); | ||
| 318 | extern int audit_socketcall(int nargs, unsigned long *args); | 325 | extern int audit_socketcall(int nargs, unsigned long *args); |
| 319 | extern int audit_sockaddr(int len, void *addr); | 326 | extern int audit_sockaddr(int len, void *addr); |
| 320 | extern int audit_avc_path(struct dentry *dentry, struct vfsmount *mnt); | 327 | extern int audit_avc_path(struct dentry *dentry, struct vfsmount *mnt); |
| @@ -323,8 +330,8 @@ extern int audit_set_macxattr(const char *name); | |||
| 323 | #else | 330 | #else |
| 324 | #define audit_alloc(t) ({ 0; }) | 331 | #define audit_alloc(t) ({ 0; }) |
| 325 | #define audit_free(t) do { ; } while (0) | 332 | #define audit_free(t) do { ; } while (0) |
| 326 | #define audit_syscall_entry(t,ta,a,b,c,d,e) do { ; } while (0) | 333 | #define audit_syscall_entry(ta,a,b,c,d,e) do { ; } while (0) |
| 327 | #define audit_syscall_exit(t,f,r) do { ; } while (0) | 334 | #define audit_syscall_exit(f,r) do { ; } while (0) |
| 328 | #define audit_getname(n) do { ; } while (0) | 335 | #define audit_getname(n) do { ; } while (0) |
| 329 | #define audit_putname(n) do { ; } while (0) | 336 | #define audit_putname(n) do { ; } while (0) |
| 330 | #define __audit_inode(n,i,f) do { ; } while (0) | 337 | #define __audit_inode(n,i,f) do { ; } while (0) |
| @@ -333,7 +340,8 @@ extern int audit_set_macxattr(const char *name); | |||
| 333 | #define audit_inode_child(d,i,p) do { ; } while (0) | 340 | #define audit_inode_child(d,i,p) do { ; } while (0) |
| 334 | #define auditsc_get_stamp(c,t,s) do { BUG(); } while (0) | 341 | #define auditsc_get_stamp(c,t,s) do { BUG(); } while (0) |
| 335 | #define audit_get_loginuid(c) ({ -1; }) | 342 | #define audit_get_loginuid(c) ({ -1; }) |
| 336 | #define audit_ipc_perms(q,u,g,m,i) ({ 0; }) | 343 | #define audit_ipc_obj(i) ({ 0; }) |
| 344 | #define audit_ipc_set_perm(q,u,g,m,i) ({ 0; }) | ||
| 337 | #define audit_socketcall(n,a) ({ 0; }) | 345 | #define audit_socketcall(n,a) ({ 0; }) |
| 338 | #define audit_sockaddr(len, addr) ({ 0; }) | 346 | #define audit_sockaddr(len, addr) ({ 0; }) |
| 339 | #define audit_avc_path(dentry, mnt) ({ 0; }) | 347 | #define audit_avc_path(dentry, mnt) ({ 0; }) |
| @@ -366,7 +374,7 @@ extern void audit_log_d_path(struct audit_buffer *ab, | |||
| 366 | extern int audit_filter_user(struct netlink_skb_parms *cb, int type); | 374 | extern int audit_filter_user(struct netlink_skb_parms *cb, int type); |
| 367 | extern int audit_filter_type(int type); | 375 | extern int audit_filter_type(int type); |
| 368 | extern int audit_receive_filter(int type, int pid, int uid, int seq, | 376 | extern int audit_receive_filter(int type, int pid, int uid, int seq, |
| 369 | void *data, size_t datasz, uid_t loginuid); | 377 | void *data, size_t datasz, uid_t loginuid, u32 sid); |
| 370 | #else | 378 | #else |
| 371 | #define audit_log(c,g,t,f,...) do { ; } while (0) | 379 | #define audit_log(c,g,t,f,...) do { ; } while (0) |
| 372 | #define audit_log_start(c,g,t) ({ NULL; }) | 380 | #define audit_log_start(c,g,t) ({ NULL; }) |
diff --git a/include/linux/debugfs.h b/include/linux/debugfs.h index 176e2d3715..047567d34c 100644 --- a/include/linux/debugfs.h +++ b/include/linux/debugfs.h | |||
| @@ -58,9 +58,8 @@ struct dentry *debugfs_create_blob(const char *name, mode_t mode, | |||
| 58 | */ | 58 | */ |
| 59 | 59 | ||
| 60 | static inline struct dentry *debugfs_create_file(const char *name, mode_t mode, | 60 | static inline struct dentry *debugfs_create_file(const char *name, mode_t mode, |
| 61 | struct dentry *parent, | 61 | struct dentry *parent, void *data, |
| 62 | void *data, | 62 | const struct file_operations *fops) |
| 63 | struct file_operations *fops) | ||
| 64 | { | 63 | { |
| 65 | return ERR_PTR(-ENODEV); | 64 | return ERR_PTR(-ENODEV); |
| 66 | } | 65 | } |
diff --git a/include/linux/device.h b/include/linux/device.h index f6e72a65a3..e8e53b9acc 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
| @@ -200,6 +200,7 @@ extern int class_device_create_file(struct class_device *, | |||
| 200 | * @node: for internal use by the driver core only. | 200 | * @node: for internal use by the driver core only. |
| 201 | * @kobj: for internal use by the driver core only. | 201 | * @kobj: for internal use by the driver core only. |
| 202 | * @devt_attr: for internal use by the driver core only. | 202 | * @devt_attr: for internal use by the driver core only. |
| 203 | * @groups: optional additional groups to be created | ||
| 203 | * @dev: if set, a symlink to the struct device is created in the sysfs | 204 | * @dev: if set, a symlink to the struct device is created in the sysfs |
| 204 | * directory for this struct class device. | 205 | * directory for this struct class device. |
| 205 | * @class_data: pointer to whatever you want to store here for this struct | 206 | * @class_data: pointer to whatever you want to store here for this struct |
| @@ -228,6 +229,7 @@ struct class_device { | |||
| 228 | struct device * dev; /* not necessary, but nice to have */ | 229 | struct device * dev; /* not necessary, but nice to have */ |
| 229 | void * class_data; /* class-specific data */ | 230 | void * class_data; /* class-specific data */ |
| 230 | struct class_device *parent; /* parent of this child device, if there is one */ | 231 | struct class_device *parent; /* parent of this child device, if there is one */ |
| 232 | struct attribute_group ** groups; /* optional groups */ | ||
| 231 | 233 | ||
| 232 | void (*release)(struct class_device *dev); | 234 | void (*release)(struct class_device *dev); |
| 233 | int (*uevent)(struct class_device *dev, char **envp, | 235 | int (*uevent)(struct class_device *dev, char **envp, |
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index ff61817082..635690cf3e 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h | |||
| @@ -14,6 +14,7 @@ enum dma_data_direction { | |||
| 14 | }; | 14 | }; |
| 15 | 15 | ||
| 16 | #define DMA_64BIT_MASK 0xffffffffffffffffULL | 16 | #define DMA_64BIT_MASK 0xffffffffffffffffULL |
| 17 | #define DMA_48BIT_MASK 0x0000ffffffffffffULL | ||
| 17 | #define DMA_40BIT_MASK 0x000000ffffffffffULL | 18 | #define DMA_40BIT_MASK 0x000000ffffffffffULL |
| 18 | #define DMA_39BIT_MASK 0x0000007fffffffffULL | 19 | #define DMA_39BIT_MASK 0x0000007fffffffffULL |
| 19 | #define DMA_32BIT_MASK 0x00000000ffffffffULL | 20 | #define DMA_32BIT_MASK 0x00000000ffffffffULL |
diff --git a/include/linux/elevator.h b/include/linux/elevator.h index ad133fcfb2..1713ace808 100644 --- a/include/linux/elevator.h +++ b/include/linux/elevator.h | |||
| @@ -21,7 +21,7 @@ typedef void (elevator_put_req_fn) (request_queue_t *, struct request *); | |||
| 21 | typedef void (elevator_activate_req_fn) (request_queue_t *, struct request *); | 21 | typedef void (elevator_activate_req_fn) (request_queue_t *, struct request *); |
| 22 | typedef void (elevator_deactivate_req_fn) (request_queue_t *, struct request *); | 22 | typedef void (elevator_deactivate_req_fn) (request_queue_t *, struct request *); |
| 23 | 23 | ||
| 24 | typedef int (elevator_init_fn) (request_queue_t *, elevator_t *); | 24 | typedef void *(elevator_init_fn) (request_queue_t *, elevator_t *); |
| 25 | typedef void (elevator_exit_fn) (elevator_t *); | 25 | typedef void (elevator_exit_fn) (elevator_t *); |
| 26 | 26 | ||
| 27 | struct elevator_ops | 27 | struct elevator_ops |
diff --git a/include/linux/firmware.h b/include/linux/firmware.h index 2d716080be..33d8f2087b 100644 --- a/include/linux/firmware.h +++ b/include/linux/firmware.h | |||
| @@ -19,5 +19,4 @@ int request_firmware_nowait( | |||
| 19 | void (*cont)(const struct firmware *fw, void *context)); | 19 | void (*cont)(const struct firmware *fw, void *context)); |
| 20 | 20 | ||
| 21 | void release_firmware(const struct firmware *fw); | 21 | void release_firmware(const struct firmware *fw); |
| 22 | void register_firmware(const char *name, const u8 *data, size_t size); | ||
| 23 | #endif | 22 | #endif |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 162c6e5730..f813bc8266 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -213,6 +213,10 @@ extern int dir_notify_enable; | |||
| 213 | #define FIBMAP _IO(0x00,1) /* bmap access */ | 213 | #define FIBMAP _IO(0x00,1) /* bmap access */ |
| 214 | #define FIGETBSZ _IO(0x00,2) /* get the block size used for bmap */ | 214 | #define FIGETBSZ _IO(0x00,2) /* get the block size used for bmap */ |
| 215 | 215 | ||
| 216 | #define SYNC_FILE_RANGE_WAIT_BEFORE 1 | ||
| 217 | #define SYNC_FILE_RANGE_WRITE 2 | ||
| 218 | #define SYNC_FILE_RANGE_WAIT_AFTER 4 | ||
| 219 | |||
| 216 | #ifdef __KERNEL__ | 220 | #ifdef __KERNEL__ |
| 217 | 221 | ||
| 218 | #include <linux/linkage.h> | 222 | #include <linux/linkage.h> |
| @@ -758,9 +762,6 @@ extern int fcntl_setlease(unsigned int fd, struct file *filp, long arg); | |||
| 758 | extern int fcntl_getlease(struct file *filp); | 762 | extern int fcntl_getlease(struct file *filp); |
| 759 | 763 | ||
| 760 | /* fs/sync.c */ | 764 | /* fs/sync.c */ |
| 761 | #define SYNC_FILE_RANGE_WAIT_BEFORE 1 | ||
| 762 | #define SYNC_FILE_RANGE_WRITE 2 | ||
| 763 | #define SYNC_FILE_RANGE_WAIT_AFTER 4 | ||
| 764 | extern int do_sync_file_range(struct file *file, loff_t offset, loff_t endbyte, | 765 | extern int do_sync_file_range(struct file *file, loff_t offset, loff_t endbyte, |
| 765 | unsigned int flags); | 766 | unsigned int flags); |
| 766 | 767 | ||
| @@ -1039,8 +1040,8 @@ struct file_operations { | |||
| 1039 | int (*check_flags)(int); | 1040 | int (*check_flags)(int); |
| 1040 | int (*dir_notify)(struct file *filp, unsigned long arg); | 1041 | int (*dir_notify)(struct file *filp, unsigned long arg); |
| 1041 | int (*flock) (struct file *, int, struct file_lock *); | 1042 | int (*flock) (struct file *, int, struct file_lock *); |
| 1042 | ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, size_t, unsigned int); | 1043 | ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); |
| 1043 | ssize_t (*splice_read)(struct file *, struct pipe_inode_info *, size_t, unsigned int); | 1044 | ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); |
| 1044 | }; | 1045 | }; |
| 1045 | 1046 | ||
| 1046 | struct inode_operations { | 1047 | struct inode_operations { |
| @@ -1613,13 +1614,13 @@ extern void do_generic_mapping_read(struct address_space *mapping, | |||
| 1613 | loff_t *, read_descriptor_t *, read_actor_t); | 1614 | loff_t *, read_descriptor_t *, read_actor_t); |
| 1614 | 1615 | ||
| 1615 | /* fs/splice.c */ | 1616 | /* fs/splice.c */ |
| 1616 | extern ssize_t generic_file_splice_read(struct file *, | 1617 | extern ssize_t generic_file_splice_read(struct file *, loff_t *, |
| 1617 | struct pipe_inode_info *, size_t, unsigned int); | 1618 | struct pipe_inode_info *, size_t, unsigned int); |
| 1618 | extern ssize_t generic_file_splice_write(struct pipe_inode_info *, | 1619 | extern ssize_t generic_file_splice_write(struct pipe_inode_info *, |
| 1619 | struct file *, size_t, unsigned int); | 1620 | struct file *, loff_t *, size_t, unsigned int); |
| 1620 | extern ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, | 1621 | extern ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, |
| 1621 | struct file *out, size_t len, unsigned int flags); | 1622 | struct file *out, loff_t *, size_t len, unsigned int flags); |
| 1622 | extern long do_splice_direct(struct file *in, struct file *out, | 1623 | extern long do_splice_direct(struct file *in, loff_t *ppos, struct file *out, |
| 1623 | size_t len, unsigned int flags); | 1624 | size_t len, unsigned int flags); |
| 1624 | 1625 | ||
| 1625 | extern void | 1626 | extern void |
diff --git a/include/linux/fs_uart_pd.h b/include/linux/fs_uart_pd.h new file mode 100644 index 0000000000..f5975126b7 --- /dev/null +++ b/include/linux/fs_uart_pd.h | |||
| @@ -0,0 +1,60 @@ | |||
| 1 | /* | ||
| 2 | * Platform information definitions for the CPM Uart driver. | ||
| 3 | * | ||
| 4 | * 2006 (c) MontaVista Software, Inc. | ||
| 5 | * Vitaly Bordug <vbordug@ru.mvista.com> | ||
| 6 | * | ||
| 7 | * This file is licensed under the terms of the GNU General Public License | ||
| 8 | * version 2. This program is licensed "as is" without any warranty of any | ||
| 9 | * kind, whether express or implied. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef FS_UART_PD_H | ||
| 13 | #define FS_UART_PD_H | ||
| 14 | |||
| 15 | #include <linux/version.h> | ||
| 16 | #include <asm/types.h> | ||
| 17 | |||
| 18 | enum fs_uart_id { | ||
| 19 | fsid_smc1_uart, | ||
| 20 | fsid_smc2_uart, | ||
| 21 | fsid_scc1_uart, | ||
| 22 | fsid_scc2_uart, | ||
| 23 | fsid_scc3_uart, | ||
| 24 | fsid_scc4_uart, | ||
| 25 | fs_uart_nr, | ||
| 26 | }; | ||
| 27 | |||
| 28 | static inline int fs_uart_id_scc2fsid(int id) | ||
| 29 | { | ||
| 30 | return fsid_scc1_uart + id - 1; | ||
| 31 | } | ||
| 32 | |||
| 33 | static inline int fs_uart_id_fsid2scc(int id) | ||
| 34 | { | ||
| 35 | return id - fsid_scc1_uart + 1; | ||
| 36 | } | ||
| 37 | |||
| 38 | static inline int fs_uart_id_smc2fsid(int id) | ||
| 39 | { | ||
| 40 | return fsid_smc1_uart + id - 1; | ||
| 41 | } | ||
| 42 | |||
| 43 | static inline int fs_uart_id_fsid2smc(int id) | ||
| 44 | { | ||
| 45 | return id - fsid_smc1_uart + 1; | ||
| 46 | } | ||
| 47 | |||
| 48 | struct fs_uart_platform_info { | ||
| 49 | void(*init_ioports)(void); | ||
| 50 | /* device specific information */ | ||
| 51 | int fs_no; /* controller index */ | ||
| 52 | u32 uart_clk; | ||
| 53 | u8 tx_num_fifo; | ||
| 54 | u8 tx_buf_size; | ||
| 55 | u8 rx_num_fifo; | ||
| 56 | u8 rx_buf_size; | ||
| 57 | u8 brg; | ||
| 58 | }; | ||
| 59 | |||
| 60 | #endif | ||
diff --git a/include/linux/fsl_devices.h b/include/linux/fsl_devices.h index a3a0e078f7..16fbe59ede 100644 --- a/include/linux/fsl_devices.h +++ b/include/linux/fsl_devices.h | |||
| @@ -110,5 +110,16 @@ struct fsl_usb2_platform_data { | |||
| 110 | #define FSL_USB2_PORT0_ENABLED 0x00000001 | 110 | #define FSL_USB2_PORT0_ENABLED 0x00000001 |
| 111 | #define FSL_USB2_PORT1_ENABLED 0x00000002 | 111 | #define FSL_USB2_PORT1_ENABLED 0x00000002 |
| 112 | 112 | ||
| 113 | struct fsl_spi_platform_data { | ||
| 114 | u32 initial_spmode; /* initial SPMODE value */ | ||
| 115 | u16 bus_num; | ||
| 116 | |||
| 117 | /* board specific information */ | ||
| 118 | u16 max_chipselect; | ||
| 119 | void (*activate_cs)(u8 cs, u8 polarity); | ||
| 120 | void (*deactivate_cs)(u8 cs, u8 polarity); | ||
| 121 | u32 sysclk; | ||
| 122 | }; | ||
| 123 | |||
| 113 | #endif /* _FSL_DEVICE_H_ */ | 124 | #endif /* _FSL_DEVICE_H_ */ |
| 114 | #endif /* __KERNEL__ */ | 125 | #endif /* __KERNEL__ */ |
diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 10a27f29d6..2ef845b351 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h | |||
| @@ -105,6 +105,7 @@ struct gendisk { | |||
| 105 | * disks that can't be partitioned. */ | 105 | * disks that can't be partitioned. */ |
| 106 | char disk_name[32]; /* name of major driver */ | 106 | char disk_name[32]; /* name of major driver */ |
| 107 | struct hd_struct **part; /* [indexed by minor] */ | 107 | struct hd_struct **part; /* [indexed by minor] */ |
| 108 | int part_uevent_suppress; | ||
| 108 | struct block_device_operations *fops; | 109 | struct block_device_operations *fops; |
| 109 | struct request_queue *queue; | 110 | struct request_queue *queue; |
| 110 | void *private_data; | 111 | void *private_data; |
diff --git a/include/linux/ide.h b/include/linux/ide.h index 8d2db412ba..a8bef1d137 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
| @@ -1220,7 +1220,6 @@ typedef struct ide_pci_enablebit_s { | |||
| 1220 | enum { | 1220 | enum { |
| 1221 | /* Uses ISA control ports not PCI ones. */ | 1221 | /* Uses ISA control ports not PCI ones. */ |
| 1222 | IDEPCI_FLAG_ISA_PORTS = (1 << 0), | 1222 | IDEPCI_FLAG_ISA_PORTS = (1 << 0), |
| 1223 | IDEPCI_FLAG_FORCE_PDC = (1 << 1), | ||
| 1224 | }; | 1223 | }; |
| 1225 | 1224 | ||
| 1226 | typedef struct ide_pci_device_s { | 1225 | typedef struct ide_pci_device_s { |
diff --git a/include/linux/input.h b/include/linux/input.h index b0e612dda0..ce1a756c4c 100644 --- a/include/linux/input.h +++ b/include/linux/input.h | |||
| @@ -12,8 +12,6 @@ | |||
| 12 | #ifdef __KERNEL__ | 12 | #ifdef __KERNEL__ |
| 13 | #include <linux/time.h> | 13 | #include <linux/time.h> |
| 14 | #include <linux/list.h> | 14 | #include <linux/list.h> |
| 15 | #include <linux/device.h> | ||
| 16 | #include <linux/mod_devicetable.h> | ||
| 17 | #else | 15 | #else |
| 18 | #include <sys/time.h> | 16 | #include <sys/time.h> |
| 19 | #include <sys/ioctl.h> | 17 | #include <sys/ioctl.h> |
| @@ -58,6 +56,8 @@ struct input_absinfo { | |||
| 58 | 56 | ||
| 59 | #define EVIOCGVERSION _IOR('E', 0x01, int) /* get driver version */ | 57 | #define EVIOCGVERSION _IOR('E', 0x01, int) /* get driver version */ |
| 60 | #define EVIOCGID _IOR('E', 0x02, struct input_id) /* get device ID */ | 58 | #define EVIOCGID _IOR('E', 0x02, struct input_id) /* get device ID */ |
| 59 | #define EVIOCGREP _IOR('E', 0x03, int[2]) /* get repeat settings */ | ||
| 60 | #define EVIOCSREP _IOW('E', 0x03, int[2]) /* set repeat settings */ | ||
| 61 | #define EVIOCGKEYCODE _IOR('E', 0x04, int[2]) /* get keycode */ | 61 | #define EVIOCGKEYCODE _IOR('E', 0x04, int[2]) /* get keycode */ |
| 62 | #define EVIOCSKEYCODE _IOW('E', 0x04, int[2]) /* set keycode */ | 62 | #define EVIOCSKEYCODE _IOW('E', 0x04, int[2]) /* set keycode */ |
| 63 | 63 | ||
| @@ -345,6 +345,8 @@ struct input_absinfo { | |||
| 345 | #define KEY_SAVE 234 | 345 | #define KEY_SAVE 234 |
| 346 | #define KEY_DOCUMENTS 235 | 346 | #define KEY_DOCUMENTS 235 |
| 347 | 347 | ||
| 348 | #define KEY_BATTERY 236 | ||
| 349 | |||
| 348 | #define KEY_UNKNOWN 240 | 350 | #define KEY_UNKNOWN 240 |
| 349 | 351 | ||
| 350 | #define BTN_MISC 0x100 | 352 | #define BTN_MISC 0x100 |
| @@ -577,15 +579,10 @@ struct input_absinfo { | |||
| 577 | * Switch events | 579 | * Switch events |
| 578 | */ | 580 | */ |
| 579 | 581 | ||
| 580 | #define SW_0 0x00 | 582 | #define SW_LID 0x00 /* set = lid shut */ |
| 581 | #define SW_1 0x01 | 583 | #define SW_TABLET_MODE 0x01 /* set = tablet mode */ |
| 582 | #define SW_2 0x02 | 584 | #define SW_HEADPHONE_INSERT 0x02 /* set = inserted */ |
| 583 | #define SW_3 0x03 | 585 | #define SW_MAX 0x0f |
| 584 | #define SW_4 0x04 | ||
| 585 | #define SW_5 0x05 | ||
| 586 | #define SW_6 0x06 | ||
| 587 | #define SW_7 0x07 | ||
| 588 | #define SW_MAX 0x0f | ||
| 589 | 586 | ||
| 590 | /* | 587 | /* |
| 591 | * Misc events | 588 | * Misc events |
| @@ -805,52 +802,16 @@ struct ff_effect { | |||
| 805 | 802 | ||
| 806 | #define FF_MAX 0x7f | 803 | #define FF_MAX 0x7f |
| 807 | 804 | ||
| 808 | struct input_device_id { | ||
| 809 | |||
| 810 | kernel_ulong_t flags; | ||
| 811 | |||
| 812 | struct input_id id; | ||
| 813 | |||
| 814 | kernel_ulong_t evbit[EV_MAX/BITS_PER_LONG+1]; | ||
| 815 | kernel_ulong_t keybit[KEY_MAX/BITS_PER_LONG+1]; | ||
| 816 | kernel_ulong_t relbit[REL_MAX/BITS_PER_LONG+1]; | ||
| 817 | kernel_ulong_t absbit[ABS_MAX/BITS_PER_LONG+1]; | ||
| 818 | kernel_ulong_t mscbit[MSC_MAX/BITS_PER_LONG+1]; | ||
| 819 | kernel_ulong_t ledbit[LED_MAX/BITS_PER_LONG+1]; | ||
| 820 | kernel_ulong_t sndbit[SND_MAX/BITS_PER_LONG+1]; | ||
| 821 | kernel_ulong_t ffbit[FF_MAX/BITS_PER_LONG+1]; | ||
| 822 | kernel_ulong_t swbit[SW_MAX/BITS_PER_LONG+1]; | ||
| 823 | |||
| 824 | kernel_ulong_t driver_info; | ||
| 825 | }; | ||
| 826 | |||
| 827 | /* | ||
| 828 | * Structure for hotplug & device<->driver matching. | ||
| 829 | */ | ||
| 830 | |||
| 831 | #define INPUT_DEVICE_ID_MATCH_BUS 1 | ||
| 832 | #define INPUT_DEVICE_ID_MATCH_VENDOR 2 | ||
| 833 | #define INPUT_DEVICE_ID_MATCH_PRODUCT 4 | ||
| 834 | #define INPUT_DEVICE_ID_MATCH_VERSION 8 | ||
| 835 | |||
| 836 | #define INPUT_DEVICE_ID_MATCH_EVBIT 0x010 | ||
| 837 | #define INPUT_DEVICE_ID_MATCH_KEYBIT 0x020 | ||
| 838 | #define INPUT_DEVICE_ID_MATCH_RELBIT 0x040 | ||
| 839 | #define INPUT_DEVICE_ID_MATCH_ABSBIT 0x080 | ||
| 840 | #define INPUT_DEVICE_ID_MATCH_MSCIT 0x100 | ||
| 841 | #define INPUT_DEVICE_ID_MATCH_LEDBIT 0x200 | ||
| 842 | #define INPUT_DEVICE_ID_MATCH_SNDBIT 0x400 | ||
| 843 | #define INPUT_DEVICE_ID_MATCH_FFBIT 0x800 | ||
| 844 | #define INPUT_DEVICE_ID_MATCH_SWBIT 0x1000 | ||
| 845 | |||
| 846 | #ifdef __KERNEL__ | 805 | #ifdef __KERNEL__ |
| 847 | 806 | ||
| 848 | /* | 807 | /* |
| 849 | * In-kernel definitions. | 808 | * In-kernel definitions. |
| 850 | */ | 809 | */ |
| 851 | 810 | ||
| 811 | #include <linux/device.h> | ||
| 852 | #include <linux/fs.h> | 812 | #include <linux/fs.h> |
| 853 | #include <linux/timer.h> | 813 | #include <linux/timer.h> |
| 814 | #include <linux/mod_devicetable.h> | ||
| 854 | 815 | ||
| 855 | #define NBITS(x) (((x)/BITS_PER_LONG)+1) | 816 | #define NBITS(x) (((x)/BITS_PER_LONG)+1) |
| 856 | #define BIT(x) (1UL<<((x)%BITS_PER_LONG)) | 817 | #define BIT(x) (1UL<<((x)%BITS_PER_LONG)) |
| @@ -951,9 +912,49 @@ struct input_dev { | |||
| 951 | }; | 912 | }; |
| 952 | #define to_input_dev(d) container_of(d, struct input_dev, cdev) | 913 | #define to_input_dev(d) container_of(d, struct input_dev, cdev) |
| 953 | 914 | ||
| 954 | #define INPUT_DEVICE_ID_MATCH_DEVICE\ | 915 | /* |
| 916 | * Verify that we are in sync with input_device_id mod_devicetable.h #defines | ||
| 917 | */ | ||
| 918 | |||
| 919 | #if EV_MAX != INPUT_DEVICE_ID_EV_MAX | ||
| 920 | #error "EV_MAX and INPUT_DEVICE_ID_EV_MAX do not match" | ||
| 921 | #endif | ||
| 922 | |||
| 923 | #if KEY_MAX != INPUT_DEVICE_ID_KEY_MAX | ||
| 924 | #error "KEY_MAX and INPUT_DEVICE_ID_KEY_MAX do not match" | ||
| 925 | #endif | ||
| 926 | |||
| 927 | #if REL_MAX != INPUT_DEVICE_ID_REL_MAX | ||
| 928 | #error "REL_MAX and INPUT_DEVICE_ID_REL_MAX do not match" | ||
| 929 | #endif | ||
| 930 | |||
| 931 | #if ABS_MAX != INPUT_DEVICE_ID_ABS_MAX | ||
| 932 | #error "ABS_MAX and INPUT_DEVICE_ID_ABS_MAX do not match" | ||
| 933 | #endif | ||
| 934 | |||
| 935 | #if MSC_MAX != INPUT_DEVICE_ID_MSC_MAX | ||
| 936 | #error "MSC_MAX and INPUT_DEVICE_ID_MSC_MAX do not match" | ||
| 937 | #endif | ||
| 938 | |||
| 939 | #if LED_MAX != INPUT_DEVICE_ID_LED_MAX | ||
| 940 | #error "LED_MAX and INPUT_DEVICE_ID_LED_MAX do not match" | ||
| 941 | #endif | ||
| 942 | |||
| 943 | #if SND_MAX != INPUT_DEVICE_ID_SND_MAX | ||
| 944 | #error "SND_MAX and INPUT_DEVICE_ID_SND_MAX do not match" | ||
| 945 | #endif | ||
| 946 | |||
| 947 | #if FF_MAX != INPUT_DEVICE_ID_FF_MAX | ||
| 948 | #error "FF_MAX and INPUT_DEVICE_ID_FF_MAX do not match" | ||
| 949 | #endif | ||
| 950 | |||
| 951 | #if SW_MAX != INPUT_DEVICE_ID_SW_MAX | ||
| 952 | #error "SW_MAX and INPUT_DEVICE_ID_SW_MAX do not match" | ||
| 953 | #endif | ||
| 954 | |||
| 955 | #define INPUT_DEVICE_ID_MATCH_DEVICE \ | ||
| 955 | (INPUT_DEVICE_ID_MATCH_BUS | INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT) | 956 | (INPUT_DEVICE_ID_MATCH_BUS | INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT) |
| 956 | #define INPUT_DEVICE_ID_MATCH_DEVICE_AND_VERSION\ | 957 | #define INPUT_DEVICE_ID_MATCH_DEVICE_AND_VERSION \ |
| 957 | (INPUT_DEVICE_ID_MATCH_DEVICE | INPUT_DEVICE_ID_MATCH_VERSION) | 958 | (INPUT_DEVICE_ID_MATCH_DEVICE | INPUT_DEVICE_ID_MATCH_VERSION) |
| 958 | 959 | ||
| 959 | struct input_handle; | 960 | struct input_handle; |
| @@ -1016,7 +1017,8 @@ static inline void input_put_device(struct input_dev *dev) | |||
| 1016 | 1017 | ||
| 1017 | static inline void input_free_device(struct input_dev *dev) | 1018 | static inline void input_free_device(struct input_dev *dev) |
| 1018 | { | 1019 | { |
| 1019 | input_put_device(dev); | 1020 | if (dev) |
| 1021 | input_put_device(dev); | ||
| 1020 | } | 1022 | } |
| 1021 | 1023 | ||
| 1022 | int input_register_device(struct input_dev *); | 1024 | int input_register_device(struct input_dev *); |
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index e1bd0842f6..f4fc576ed4 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
| @@ -124,6 +124,7 @@ extern int get_option(char **str, int *pint); | |||
| 124 | extern char *get_options(const char *str, int nints, int *ints); | 124 | extern char *get_options(const char *str, int nints, int *ints); |
| 125 | extern unsigned long long memparse(char *ptr, char **retptr); | 125 | extern unsigned long long memparse(char *ptr, char **retptr); |
| 126 | 126 | ||
| 127 | extern int core_kernel_text(unsigned long addr); | ||
| 127 | extern int __kernel_text_address(unsigned long addr); | 128 | extern int __kernel_text_address(unsigned long addr); |
| 128 | extern int kernel_text_address(unsigned long addr); | 129 | extern int kernel_text_address(unsigned long addr); |
| 129 | extern int session_of_pgrp(int pgrp); | 130 | extern int session_of_pgrp(int pgrp); |
diff --git a/include/linux/kobject.h b/include/linux/kobject.h index 4cb1214ec2..c187c53cec 100644 --- a/include/linux/kobject.h +++ b/include/linux/kobject.h | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/rwsem.h> | 24 | #include <linux/rwsem.h> |
| 25 | #include <linux/kref.h> | 25 | #include <linux/kref.h> |
| 26 | #include <linux/kernel.h> | 26 | #include <linux/kernel.h> |
| 27 | #include <linux/wait.h> | ||
| 27 | #include <asm/atomic.h> | 28 | #include <asm/atomic.h> |
| 28 | 29 | ||
| 29 | #define KOBJ_NAME_LEN 20 | 30 | #define KOBJ_NAME_LEN 20 |
| @@ -56,6 +57,7 @@ struct kobject { | |||
| 56 | struct kset * kset; | 57 | struct kset * kset; |
| 57 | struct kobj_type * ktype; | 58 | struct kobj_type * ktype; |
| 58 | struct dentry * dentry; | 59 | struct dentry * dentry; |
| 60 | wait_queue_head_t poll; | ||
| 59 | }; | 61 | }; |
| 60 | 62 | ||
| 61 | extern int kobject_set_name(struct kobject *, const char *, ...) | 63 | extern int kobject_set_name(struct kobject *, const char *, ...) |
| @@ -255,9 +257,8 @@ struct subsys_attribute { | |||
| 255 | }; | 257 | }; |
| 256 | 258 | ||
| 257 | extern int subsys_create_file(struct subsystem * , struct subsys_attribute *); | 259 | extern int subsys_create_file(struct subsystem * , struct subsys_attribute *); |
| 258 | extern void subsys_remove_file(struct subsystem * , struct subsys_attribute *); | ||
| 259 | 260 | ||
| 260 | #if defined(CONFIG_HOTPLUG) && defined(CONFIG_NET) | 261 | #if defined(CONFIG_HOTPLUG) |
| 261 | void kobject_uevent(struct kobject *kobj, enum kobject_action action); | 262 | void kobject_uevent(struct kobject *kobj, enum kobject_action action); |
| 262 | 263 | ||
| 263 | int add_uevent_var(char **envp, int num_envp, int *cur_index, | 264 | int add_uevent_var(char **envp, int num_envp, int *cur_index, |
diff --git a/include/linux/list.h b/include/linux/list.h index 67258b47e9..76f0571834 100644 --- a/include/linux/list.h +++ b/include/linux/list.h | |||
| @@ -619,7 +619,7 @@ static inline void hlist_del_rcu(struct hlist_node *n) | |||
| 619 | 619 | ||
| 620 | static inline void hlist_del_init(struct hlist_node *n) | 620 | static inline void hlist_del_init(struct hlist_node *n) |
| 621 | { | 621 | { |
| 622 | if (n->pprev) { | 622 | if (!hlist_unhashed(n)) { |
| 623 | __hlist_del(n); | 623 | __hlist_del(n); |
| 624 | INIT_HLIST_NODE(n); | 624 | INIT_HLIST_NODE(n); |
| 625 | } | 625 | } |
diff --git a/include/linux/m48t86.h b/include/linux/m48t86.h index 9065199319..915d6b4f0f 100644 --- a/include/linux/m48t86.h +++ b/include/linux/m48t86.h | |||
| @@ -11,6 +11,6 @@ | |||
| 11 | 11 | ||
| 12 | struct m48t86_ops | 12 | struct m48t86_ops |
| 13 | { | 13 | { |
| 14 | void (*writeb)(unsigned char value, unsigned long addr); | 14 | void (*writebyte)(unsigned char value, unsigned long addr); |
| 15 | unsigned char (*readb)(unsigned long addr); | 15 | unsigned char (*readbyte)(unsigned long addr); |
| 16 | }; | 16 | }; |
diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index 4ca3e6ad03..9112063861 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h | |||
| @@ -99,10 +99,7 @@ static inline int __remove_pages(struct zone *zone, unsigned long start_pfn, | |||
| 99 | return -ENOSYS; | 99 | return -ENOSYS; |
| 100 | } | 100 | } |
| 101 | 101 | ||
| 102 | #if defined(CONFIG_MEMORY_HOTPLUG) || defined(CONFIG_ACPI_HOTPLUG_MEMORY) \ | ||
| 103 | || defined(CONFIG_ACPI_HOTPLUG_MEMORY_MODULE) | ||
| 104 | extern int add_memory(u64 start, u64 size); | 102 | extern int add_memory(u64 start, u64 size); |
| 105 | extern int remove_memory(u64 start, u64 size); | 103 | extern int remove_memory(u64 start, u64 size); |
| 106 | #endif | ||
| 107 | 104 | ||
| 108 | #endif /* __LINUX_MEMORY_HOTPLUG_H */ | 105 | #endif /* __LINUX_MEMORY_HOTPLUG_H */ |
diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h index 6a7621b2b1..f5fdca1d67 100644 --- a/include/linux/mempolicy.h +++ b/include/linux/mempolicy.h | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <linux/nodemask.h> | 36 | #include <linux/nodemask.h> |
| 37 | 37 | ||
| 38 | struct vm_area_struct; | 38 | struct vm_area_struct; |
| 39 | struct mm_struct; | ||
| 39 | 40 | ||
| 40 | #ifdef CONFIG_NUMA | 41 | #ifdef CONFIG_NUMA |
| 41 | 42 | ||
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 30dd978c1e..991a37382a 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h | |||
| @@ -28,6 +28,7 @@ struct mmc_csd { | |||
| 28 | unsigned short cmdclass; | 28 | unsigned short cmdclass; |
| 29 | unsigned short tacc_clks; | 29 | unsigned short tacc_clks; |
| 30 | unsigned int tacc_ns; | 30 | unsigned int tacc_ns; |
| 31 | unsigned int r2w_factor; | ||
| 31 | unsigned int max_dtr; | 32 | unsigned int max_dtr; |
| 32 | unsigned int read_blkbits; | 33 | unsigned int read_blkbits; |
| 33 | unsigned int write_blkbits; | 34 | unsigned int write_blkbits; |
diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index bdc556d884..03a14a30c4 100644 --- a/include/linux/mmc/mmc.h +++ b/include/linux/mmc/mmc.h | |||
| @@ -69,6 +69,7 @@ struct mmc_data { | |||
| 69 | unsigned int timeout_ns; /* data timeout (in ns, max 80ms) */ | 69 | unsigned int timeout_ns; /* data timeout (in ns, max 80ms) */ |
| 70 | unsigned int timeout_clks; /* data timeout (in clocks) */ | 70 | unsigned int timeout_clks; /* data timeout (in clocks) */ |
| 71 | unsigned int blksz_bits; /* data block size */ | 71 | unsigned int blksz_bits; /* data block size */ |
| 72 | unsigned int blksz; /* data block size */ | ||
| 72 | unsigned int blocks; /* number of blocks */ | 73 | unsigned int blocks; /* number of blocks */ |
| 73 | unsigned int error; /* data error */ | 74 | unsigned int error; /* data error */ |
| 74 | unsigned int flags; | 75 | unsigned int flags; |
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index b5c21122c2..2d83371504 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/seqlock.h> | 15 | #include <linux/seqlock.h> |
| 16 | #include <linux/nodemask.h> | 16 | #include <linux/nodemask.h> |
| 17 | #include <asm/atomic.h> | 17 | #include <asm/atomic.h> |
| 18 | #include <asm/page.h> | ||
| 18 | 19 | ||
| 19 | /* Free memory management - zoned buddy allocator. */ | 20 | /* Free memory management - zoned buddy allocator. */ |
| 20 | #ifndef CONFIG_FORCE_MAX_ZONEORDER | 21 | #ifndef CONFIG_FORCE_MAX_ZONEORDER |
| @@ -22,6 +23,7 @@ | |||
| 22 | #else | 23 | #else |
| 23 | #define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER | 24 | #define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER |
| 24 | #endif | 25 | #endif |
| 26 | #define MAX_ORDER_NR_PAGES (1 << (MAX_ORDER - 1)) | ||
| 25 | 27 | ||
| 26 | struct free_area { | 28 | struct free_area { |
| 27 | struct list_head free_list; | 29 | struct list_head free_list; |
diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h index 7b08c11ec4..f697770858 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h | |||
| @@ -249,4 +249,52 @@ struct i2c_device_id { | |||
| 249 | __u16 id; | 249 | __u16 id; |
| 250 | }; | 250 | }; |
| 251 | 251 | ||
| 252 | /* Input */ | ||
| 253 | #define INPUT_DEVICE_ID_EV_MAX 0x1f | ||
| 254 | #define INPUT_DEVICE_ID_KEY_MAX 0x1ff | ||
| 255 | #define INPUT_DEVICE_ID_REL_MAX 0x0f | ||
| 256 | #define INPUT_DEVICE_ID_ABS_MAX 0x3f | ||
| 257 | #define INPUT_DEVICE_ID_MSC_MAX 0x07 | ||
| 258 | #define INPUT_DEVICE_ID_LED_MAX 0x0f | ||
| 259 | #define INPUT_DEVICE_ID_SND_MAX 0x07 | ||
| 260 | #define INPUT_DEVICE_ID_FF_MAX 0x7f | ||
| 261 | #define INPUT_DEVICE_ID_SW_MAX 0x0f | ||
| 262 | |||
| 263 | #define INPUT_DEVICE_ID_MATCH_BUS 1 | ||
| 264 | #define INPUT_DEVICE_ID_MATCH_VENDOR 2 | ||
| 265 | #define INPUT_DEVICE_ID_MATCH_PRODUCT 4 | ||
| 266 | #define INPUT_DEVICE_ID_MATCH_VERSION 8 | ||
| 267 | |||
| 268 | #define INPUT_DEVICE_ID_MATCH_EVBIT 0x0010 | ||
| 269 | #define INPUT_DEVICE_ID_MATCH_KEYBIT 0x0020 | ||
| 270 | #define INPUT_DEVICE_ID_MATCH_RELBIT 0x0040 | ||
| 271 | #define INPUT_DEVICE_ID_MATCH_ABSBIT 0x0080 | ||
| 272 | #define INPUT_DEVICE_ID_MATCH_MSCIT 0x0100 | ||
| 273 | #define INPUT_DEVICE_ID_MATCH_LEDBIT 0x0200 | ||
| 274 | #define INPUT_DEVICE_ID_MATCH_SNDBIT 0x0400 | ||
| 275 | #define INPUT_DEVICE_ID_MATCH_FFBIT 0x0800 | ||
| 276 | #define INPUT_DEVICE_ID_MATCH_SWBIT 0x1000 | ||
| 277 | |||
| 278 | struct input_device_id { | ||
| 279 | |||
| 280 | kernel_ulong_t flags; | ||
| 281 | |||
| 282 | __u16 bustype; | ||
| 283 | __u16 vendor; | ||
| 284 | __u16 product; | ||
| 285 | __u16 version; | ||
| 286 | |||
| 287 | kernel_ulong_t evbit[INPUT_DEVICE_ID_EV_MAX / BITS_PER_LONG + 1]; | ||
| 288 | kernel_ulong_t keybit[INPUT_DEVICE_ID_KEY_MAX / BITS_PER_LONG + 1]; | ||
| 289 | kernel_ulong_t relbit[INPUT_DEVICE_ID_REL_MAX / BITS_PER_LONG + 1]; | ||
| 290 | kernel_ulong_t absbit[INPUT_DEVICE_ID_ABS_MAX / BITS_PER_LONG + 1]; | ||
| 291 | kernel_ulong_t mscbit[INPUT_DEVICE_ID_MSC_MAX / BITS_PER_LONG + 1]; | ||
| 292 | kernel_ulong_t ledbit[INPUT_DEVICE_ID_LED_MAX / BITS_PER_LONG + 1]; | ||
| 293 | kernel_ulong_t sndbit[INPUT_DEVICE_ID_SND_MAX / BITS_PER_LONG + 1]; | ||
| 294 | kernel_ulong_t ffbit[INPUT_DEVICE_ID_FF_MAX / BITS_PER_LONG + 1]; | ||
| 295 | kernel_ulong_t swbit[INPUT_DEVICE_ID_SW_MAX / BITS_PER_LONG + 1]; | ||
| 296 | |||
| 297 | kernel_ulong_t driver_info; | ||
| 298 | }; | ||
| 299 | |||
| 252 | #endif /* LINUX_MOD_DEVICETABLE_H */ | 300 | #endif /* LINUX_MOD_DEVICETABLE_H */ |
diff --git a/include/linux/mv643xx.h b/include/linux/mv643xx.h index 955d3069d7..edfa012fad 100644 --- a/include/linux/mv643xx.h +++ b/include/linux/mv643xx.h | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | #ifndef __ASM_MV643XX_H | 13 | #ifndef __ASM_MV643XX_H |
| 14 | #define __ASM_MV643XX_H | 14 | #define __ASM_MV643XX_H |
| 15 | 15 | ||
| 16 | #ifdef __MIPS__ | 16 | #ifdef __mips__ |
| 17 | #include <asm/addrspace.h> | 17 | #include <asm/addrspace.h> |
| 18 | #include <asm/marvell.h> | 18 | #include <asm/marvell.h> |
| 19 | #endif | 19 | #endif |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 40ccf8cc42..f4169bbb60 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -433,8 +433,7 @@ struct net_device | |||
| 433 | 433 | ||
| 434 | /* register/unregister state machine */ | 434 | /* register/unregister state machine */ |
| 435 | enum { NETREG_UNINITIALIZED=0, | 435 | enum { NETREG_UNINITIALIZED=0, |
| 436 | NETREG_REGISTERING, /* called register_netdevice */ | 436 | NETREG_REGISTERED, /* completed register_netdevice */ |
| 437 | NETREG_REGISTERED, /* completed register todo */ | ||
| 438 | NETREG_UNREGISTERING, /* called unregister_netdevice */ | 437 | NETREG_UNREGISTERING, /* called unregister_netdevice */ |
| 439 | NETREG_UNREGISTERED, /* completed unregister todo */ | 438 | NETREG_UNREGISTERED, /* completed unregister todo */ |
| 440 | NETREG_RELEASED, /* called free_netdev */ | 439 | NETREG_RELEASED, /* called free_netdev */ |
| @@ -506,6 +505,8 @@ struct net_device | |||
| 506 | 505 | ||
| 507 | /* class/net/name entry */ | 506 | /* class/net/name entry */ |
| 508 | struct class_device class_dev; | 507 | struct class_device class_dev; |
| 508 | /* space for optional statistics and wireless sysfs groups */ | ||
| 509 | struct attribute_group *sysfs_groups[3]; | ||
| 509 | }; | 510 | }; |
| 510 | 511 | ||
| 511 | #define NETDEV_ALIGN 32 | 512 | #define NETDEV_ALIGN 32 |
diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h index f6bdef82a3..48cc32d83f 100644 --- a/include/linux/netfilter/x_tables.h +++ b/include/linux/netfilter/x_tables.h | |||
| @@ -337,6 +337,10 @@ struct compat_xt_entry_match | |||
| 337 | char name[XT_FUNCTION_MAXNAMELEN - 1]; | 337 | char name[XT_FUNCTION_MAXNAMELEN - 1]; |
| 338 | u_int8_t revision; | 338 | u_int8_t revision; |
| 339 | } user; | 339 | } user; |
| 340 | struct { | ||
| 341 | u_int16_t match_size; | ||
| 342 | compat_uptr_t match; | ||
| 343 | } kernel; | ||
| 340 | u_int16_t match_size; | 344 | u_int16_t match_size; |
| 341 | } u; | 345 | } u; |
| 342 | unsigned char data[0]; | 346 | unsigned char data[0]; |
| @@ -350,6 +354,10 @@ struct compat_xt_entry_target | |||
| 350 | char name[XT_FUNCTION_MAXNAMELEN - 1]; | 354 | char name[XT_FUNCTION_MAXNAMELEN - 1]; |
| 351 | u_int8_t revision; | 355 | u_int8_t revision; |
| 352 | } user; | 356 | } user; |
| 357 | struct { | ||
| 358 | u_int16_t target_size; | ||
| 359 | compat_uptr_t target; | ||
| 360 | } kernel; | ||
| 353 | u_int16_t target_size; | 361 | u_int16_t target_size; |
| 354 | } u; | 362 | } u; |
| 355 | unsigned char data[0]; | 363 | unsigned char data[0]; |
| @@ -361,7 +369,11 @@ struct compat_xt_entry_target | |||
| 361 | 369 | ||
| 362 | struct compat_xt_counters | 370 | struct compat_xt_counters |
| 363 | { | 371 | { |
| 372 | #if defined(CONFIG_X86_64) || defined(CONFIG_IA64) | ||
| 364 | u_int32_t cnt[4]; | 373 | u_int32_t cnt[4]; |
| 374 | #else | ||
| 375 | u_int64_t cnt[2]; | ||
| 376 | #endif | ||
| 365 | }; | 377 | }; |
| 366 | 378 | ||
| 367 | struct compat_xt_counters_info | 379 | struct compat_xt_counters_info |
diff --git a/include/linux/netfilter_ipv4/ip_conntrack_helper_h323_asn1.h b/include/linux/netfilter_ipv4/ip_conntrack_helper_h323_asn1.h index 0bd828081c..c6e9a0b6d3 100644 --- a/include/linux/netfilter_ipv4/ip_conntrack_helper_h323_asn1.h +++ b/include/linux/netfilter_ipv4/ip_conntrack_helper_h323_asn1.h | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * ip_conntrack_helper_h323_asn1.h - BER and PER decoding library for H.323 | 2 | * ip_conntrack_helper_h323_asn1.h - BER and PER decoding library for H.323 |
| 3 | * conntrack/NAT module. | 3 | * conntrack/NAT module. |
| 4 | * | 4 | * |
| 5 | * Copyright (c) 2006 by Jing Min Zhao <zhaojingmin@hotmail.com> | 5 | * Copyright (c) 2006 by Jing Min Zhao <zhaojingmin@users.sourceforge.net> |
| 6 | * | 6 | * |
| 7 | * This source code is licensed under General Public License version 2. | 7 | * This source code is licensed under General Public License version 2. |
| 8 | * | 8 | * |
diff --git a/include/linux/netlink.h b/include/linux/netlink.h index f8f3d1c927..87b8a5703e 100644 --- a/include/linux/netlink.h +++ b/include/linux/netlink.h | |||
| @@ -143,6 +143,7 @@ struct netlink_skb_parms | |||
| 143 | __u32 dst_group; | 143 | __u32 dst_group; |
| 144 | kernel_cap_t eff_cap; | 144 | kernel_cap_t eff_cap; |
| 145 | __u32 loginuid; /* Login (audit) uid */ | 145 | __u32 loginuid; /* Login (audit) uid */ |
| 146 | __u32 sid; /* SELinux security id */ | ||
| 146 | }; | 147 | }; |
| 147 | 148 | ||
| 148 | #define NETLINK_CB(skb) (*(struct netlink_skb_parms*)&((skb)->cb)) | 149 | #define NETLINK_CB(skb) (*(struct netlink_skb_parms*)&((skb)->cb)) |
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 9539efd4f7..7a1af574de 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h | |||
| @@ -78,6 +78,8 @@ extern struct page * find_or_create_page(struct address_space *mapping, | |||
| 78 | unsigned long index, gfp_t gfp_mask); | 78 | unsigned long index, gfp_t gfp_mask); |
| 79 | unsigned find_get_pages(struct address_space *mapping, pgoff_t start, | 79 | unsigned find_get_pages(struct address_space *mapping, pgoff_t start, |
| 80 | unsigned int nr_pages, struct page **pages); | 80 | unsigned int nr_pages, struct page **pages); |
| 81 | unsigned find_get_pages_contig(struct address_space *mapping, pgoff_t start, | ||
| 82 | unsigned int nr_pages, struct page **pages); | ||
| 81 | unsigned find_get_pages_tag(struct address_space *mapping, pgoff_t *index, | 83 | unsigned find_get_pages_tag(struct address_space *mapping, pgoff_t *index, |
| 82 | int tag, unsigned int nr_pages, struct page **pages); | 84 | int tag, unsigned int nr_pages, struct page **pages); |
| 83 | 85 | ||
diff --git a/include/linux/pci.h b/include/linux/pci.h index 0aad5a378e..3a6a4e37a4 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
| @@ -97,7 +97,13 @@ enum pci_channel_state { | |||
| 97 | 97 | ||
| 98 | typedef unsigned short __bitwise pci_bus_flags_t; | 98 | typedef unsigned short __bitwise pci_bus_flags_t; |
| 99 | enum pci_bus_flags { | 99 | enum pci_bus_flags { |
| 100 | PCI_BUS_FLAGS_NO_MSI = (pci_bus_flags_t) 1, | 100 | PCI_BUS_FLAGS_NO_MSI = (__force pci_bus_flags_t) 1, |
| 101 | }; | ||
| 102 | |||
| 103 | struct pci_cap_saved_state { | ||
| 104 | struct hlist_node next; | ||
| 105 | char cap_nr; | ||
| 106 | u32 data[0]; | ||
| 101 | }; | 107 | }; |
| 102 | 108 | ||
| 103 | /* | 109 | /* |
| @@ -159,6 +165,7 @@ struct pci_dev { | |||
| 159 | unsigned int block_ucfg_access:1; /* userspace config space access is blocked */ | 165 | unsigned int block_ucfg_access:1; /* userspace config space access is blocked */ |
| 160 | 166 | ||
| 161 | u32 saved_config_space[16]; /* config space saved at suspend time */ | 167 | u32 saved_config_space[16]; /* config space saved at suspend time */ |
| 168 | struct hlist_head saved_cap_space; | ||
| 162 | struct bin_attribute *rom_attr; /* attribute descriptor for sysfs ROM entry */ | 169 | struct bin_attribute *rom_attr; /* attribute descriptor for sysfs ROM entry */ |
| 163 | int rom_attr_enabled; /* has display of the rom attribute been enabled? */ | 170 | int rom_attr_enabled; /* has display of the rom attribute been enabled? */ |
| 164 | struct bin_attribute *res_attr[DEVICE_COUNT_RESOURCE]; /* sysfs file for resources */ | 171 | struct bin_attribute *res_attr[DEVICE_COUNT_RESOURCE]; /* sysfs file for resources */ |
| @@ -169,6 +176,30 @@ struct pci_dev { | |||
| 169 | #define to_pci_dev(n) container_of(n, struct pci_dev, dev) | 176 | #define to_pci_dev(n) container_of(n, struct pci_dev, dev) |
| 170 | #define for_each_pci_dev(d) while ((d = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, d)) != NULL) | 177 | #define for_each_pci_dev(d) while ((d = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, d)) != NULL) |
| 171 | 178 | ||
| 179 | static inline struct pci_cap_saved_state *pci_find_saved_cap( | ||
| 180 | struct pci_dev *pci_dev,char cap) | ||
| 181 | { | ||
| 182 | struct pci_cap_saved_state *tmp; | ||
| 183 | struct hlist_node *pos; | ||
| 184 | |||
| 185 | hlist_for_each_entry(tmp, pos, &pci_dev->saved_cap_space, next) { | ||
| 186 | if (tmp->cap_nr == cap) | ||
| 187 | return tmp; | ||
| 188 | } | ||
| 189 | return NULL; | ||
| 190 | } | ||
| 191 | |||
| 192 | static inline void pci_add_saved_cap(struct pci_dev *pci_dev, | ||
| 193 | struct pci_cap_saved_state *new_cap) | ||
| 194 | { | ||
| 195 | hlist_add_head(&new_cap->next, &pci_dev->saved_cap_space); | ||
| 196 | } | ||
| 197 | |||
| 198 | static inline void pci_remove_saved_cap(struct pci_cap_saved_state *cap) | ||
| 199 | { | ||
| 200 | hlist_del(&cap->next); | ||
| 201 | } | ||
| 202 | |||
| 172 | /* | 203 | /* |
| 173 | * For PCI devices, the region numbers are assigned this way: | 204 | * For PCI devices, the region numbers are assigned this way: |
| 174 | * | 205 | * |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 870fe38378..590dc6dca3 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
| @@ -356,6 +356,10 @@ | |||
| 356 | #define PCI_DEVICE_ID_ATI_IXP300_SATA 0x436e | 356 | #define PCI_DEVICE_ID_ATI_IXP300_SATA 0x436e |
| 357 | #define PCI_DEVICE_ID_ATI_IXP400_IDE 0x4376 | 357 | #define PCI_DEVICE_ID_ATI_IXP400_IDE 0x4376 |
| 358 | #define PCI_DEVICE_ID_ATI_IXP400_SATA 0x4379 | 358 | #define PCI_DEVICE_ID_ATI_IXP400_SATA 0x4379 |
| 359 | #define PCI_DEVICE_ID_ATI_IXP400_SATA2 0x437a | ||
| 360 | #define PCI_DEVICE_ID_ATI_IXP600_SATA 0x4380 | ||
| 361 | #define PCI_DEVICE_ID_ATI_IXP600_SRAID 0x4381 | ||
| 362 | #define PCI_DEVICE_ID_ATI_IXP600_IDE 0x438c | ||
| 359 | 363 | ||
| 360 | #define PCI_VENDOR_ID_VLSI 0x1004 | 364 | #define PCI_VENDOR_ID_VLSI 0x1004 |
| 361 | #define PCI_DEVICE_ID_VLSI_82C592 0x0005 | 365 | #define PCI_DEVICE_ID_VLSI_82C592 0x0005 |
| @@ -497,7 +501,8 @@ | |||
| 497 | #define PCI_DEVICE_ID_AMD_8111_SMBUS 0x746b | 501 | #define PCI_DEVICE_ID_AMD_8111_SMBUS 0x746b |
| 498 | #define PCI_DEVICE_ID_AMD_8111_AUDIO 0x746d | 502 | #define PCI_DEVICE_ID_AMD_8111_AUDIO 0x746d |
| 499 | #define PCI_DEVICE_ID_AMD_8151_0 0x7454 | 503 | #define PCI_DEVICE_ID_AMD_8151_0 0x7454 |
| 500 | #define PCI_DEVICE_ID_AMD_8131_APIC 0x7450 | 504 | #define PCI_DEVICE_ID_AMD_8131_BRIDGE 0x7450 |
| 505 | #define PCI_DEVICE_ID_AMD_8131_APIC 0x7451 | ||
| 501 | #define PCI_DEVICE_ID_AMD_CS5536_ISA 0x2090 | 506 | #define PCI_DEVICE_ID_AMD_CS5536_ISA 0x2090 |
| 502 | #define PCI_DEVICE_ID_AMD_CS5536_FLASH 0x2091 | 507 | #define PCI_DEVICE_ID_AMD_CS5536_FLASH 0x2091 |
| 503 | #define PCI_DEVICE_ID_AMD_CS5536_AUDIO 0x2093 | 508 | #define PCI_DEVICE_ID_AMD_CS5536_AUDIO 0x2093 |
| @@ -1226,6 +1231,7 @@ | |||
| 1226 | #define PCI_DEVICE_ID_VIA_8380_0 0x0204 | 1231 | #define PCI_DEVICE_ID_VIA_8380_0 0x0204 |
| 1227 | #define PCI_DEVICE_ID_VIA_3238_0 0x0238 | 1232 | #define PCI_DEVICE_ID_VIA_3238_0 0x0238 |
| 1228 | #define PCI_DEVICE_ID_VIA_PT880 0x0258 | 1233 | #define PCI_DEVICE_ID_VIA_PT880 0x0258 |
| 1234 | #define PCI_DEVICE_ID_VIA_PT880ULTRA 0x0308 | ||
| 1229 | #define PCI_DEVICE_ID_VIA_PX8X0_0 0x0259 | 1235 | #define PCI_DEVICE_ID_VIA_PX8X0_0 0x0259 |
| 1230 | #define PCI_DEVICE_ID_VIA_3269_0 0x0269 | 1236 | #define PCI_DEVICE_ID_VIA_3269_0 0x0269 |
| 1231 | #define PCI_DEVICE_ID_VIA_K8T800PRO_0 0x0282 | 1237 | #define PCI_DEVICE_ID_VIA_K8T800PRO_0 0x0282 |
diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h index 123a7c24bc..ea4f7cd7bf 100644 --- a/include/linux/pipe_fs_i.h +++ b/include/linux/pipe_fs_i.h | |||
| @@ -5,8 +5,9 @@ | |||
| 5 | 5 | ||
| 6 | #define PIPE_BUFFERS (16) | 6 | #define PIPE_BUFFERS (16) |
| 7 | 7 | ||
| 8 | #define PIPE_BUF_FLAG_STOLEN 0x01 | 8 | #define PIPE_BUF_FLAG_LRU 0x01 /* page is on the LRU */ |
| 9 | #define PIPE_BUF_FLAG_LRU 0x02 | 9 | #define PIPE_BUF_FLAG_ATOMIC 0x02 /* was atomically mapped */ |
| 10 | #define PIPE_BUF_FLAG_GIFT 0x04 /* page is a gift */ | ||
| 10 | 11 | ||
| 11 | struct pipe_buffer { | 12 | struct pipe_buffer { |
| 12 | struct page *page; | 13 | struct page *page; |
| @@ -15,12 +16,26 @@ struct pipe_buffer { | |||
| 15 | unsigned int flags; | 16 | unsigned int flags; |
| 16 | }; | 17 | }; |
| 17 | 18 | ||
| 19 | /* | ||
| 20 | * Note on the nesting of these functions: | ||
| 21 | * | ||
| 22 | * ->pin() | ||
| 23 | * ->steal() | ||
| 24 | * ... | ||
| 25 | * ->map() | ||
| 26 | * ... | ||
| 27 | * ->unmap() | ||
| 28 | * | ||
| 29 | * That is, ->map() must be called on a pinned buffer, same goes for ->steal(). | ||
| 30 | */ | ||
| 18 | struct pipe_buf_operations { | 31 | struct pipe_buf_operations { |
| 19 | int can_merge; | 32 | int can_merge; |
| 20 | void * (*map)(struct file *, struct pipe_inode_info *, struct pipe_buffer *); | 33 | void * (*map)(struct pipe_inode_info *, struct pipe_buffer *, int); |
| 21 | void (*unmap)(struct pipe_inode_info *, struct pipe_buffer *); | 34 | void (*unmap)(struct pipe_inode_info *, struct pipe_buffer *, void *); |
| 35 | int (*pin)(struct pipe_inode_info *, struct pipe_buffer *); | ||
| 22 | void (*release)(struct pipe_inode_info *, struct pipe_buffer *); | 36 | void (*release)(struct pipe_inode_info *, struct pipe_buffer *); |
| 23 | int (*steal)(struct pipe_inode_info *, struct pipe_buffer *); | 37 | int (*steal)(struct pipe_inode_info *, struct pipe_buffer *); |
| 38 | void (*get)(struct pipe_inode_info *, struct pipe_buffer *); | ||
| 24 | }; | 39 | }; |
| 25 | 40 | ||
| 26 | struct pipe_inode_info { | 41 | struct pipe_inode_info { |
| @@ -50,6 +65,13 @@ struct pipe_inode_info * alloc_pipe_info(struct inode * inode); | |||
| 50 | void free_pipe_info(struct inode * inode); | 65 | void free_pipe_info(struct inode * inode); |
| 51 | void __free_pipe_info(struct pipe_inode_info *); | 66 | void __free_pipe_info(struct pipe_inode_info *); |
| 52 | 67 | ||
| 68 | /* Generic pipe buffer ops functions */ | ||
| 69 | void *generic_pipe_buf_map(struct pipe_inode_info *, struct pipe_buffer *, int); | ||
| 70 | void generic_pipe_buf_unmap(struct pipe_inode_info *, struct pipe_buffer *, void *); | ||
| 71 | void generic_pipe_buf_get(struct pipe_inode_info *, struct pipe_buffer *); | ||
| 72 | int generic_pipe_buf_pin(struct pipe_inode_info *, struct pipe_buffer *); | ||
| 73 | int generic_pipe_buf_steal(struct pipe_inode_info *, struct pipe_buffer *); | ||
| 74 | |||
| 53 | /* | 75 | /* |
| 54 | * splice is tied to pipes as a transport (at least for now), so we'll just | 76 | * splice is tied to pipes as a transport (at least for now), so we'll just |
| 55 | * add the splice flags here. | 77 | * add the splice flags here. |
| @@ -59,5 +81,23 @@ void __free_pipe_info(struct pipe_inode_info *); | |||
| 59 | /* we may still block on the fd we splice */ | 81 | /* we may still block on the fd we splice */ |
| 60 | /* from/to, of course */ | 82 | /* from/to, of course */ |
| 61 | #define SPLICE_F_MORE (0x04) /* expect more data */ | 83 | #define SPLICE_F_MORE (0x04) /* expect more data */ |
| 84 | #define SPLICE_F_GIFT (0x08) /* pages passed in are a gift */ | ||
| 85 | |||
| 86 | /* | ||
| 87 | * Passed to the actors | ||
| 88 | */ | ||
| 89 | struct splice_desc { | ||
| 90 | unsigned int len, total_len; /* current and remaining length */ | ||
| 91 | unsigned int flags; /* splice flags */ | ||
| 92 | struct file *file; /* file to read/write */ | ||
| 93 | loff_t pos; /* file position */ | ||
| 94 | }; | ||
| 95 | |||
| 96 | typedef int (splice_actor)(struct pipe_inode_info *, struct pipe_buffer *, | ||
| 97 | struct splice_desc *); | ||
| 98 | |||
| 99 | extern ssize_t splice_from_pipe(struct pipe_inode_info *, struct file *, | ||
| 100 | loff_t *, size_t, unsigned int, | ||
| 101 | splice_actor *); | ||
| 62 | 102 | ||
| 63 | #endif | 103 | #endif |
diff --git a/include/linux/pm.h b/include/linux/pm.h index 6df2585c01..66be58902b 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h | |||
| @@ -199,6 +199,12 @@ extern int device_suspend(pm_message_t state); | |||
| 199 | 199 | ||
| 200 | extern int dpm_runtime_suspend(struct device *, pm_message_t); | 200 | extern int dpm_runtime_suspend(struct device *, pm_message_t); |
| 201 | extern void dpm_runtime_resume(struct device *); | 201 | extern void dpm_runtime_resume(struct device *); |
| 202 | extern void __suspend_report_result(const char *function, void *fn, int ret); | ||
| 203 | |||
| 204 | #define suspend_report_result(fn, ret) \ | ||
| 205 | do { \ | ||
| 206 | __suspend_report_result(__FUNCTION__, fn, ret); \ | ||
| 207 | } while (0) | ||
| 202 | 208 | ||
| 203 | #else /* !CONFIG_PM */ | 209 | #else /* !CONFIG_PM */ |
| 204 | 210 | ||
| @@ -219,6 +225,8 @@ static inline void dpm_runtime_resume(struct device * dev) | |||
| 219 | { | 225 | { |
| 220 | } | 226 | } |
| 221 | 227 | ||
| 228 | #define suspend_report_result(fn, ret) do { } while (0) | ||
| 229 | |||
| 222 | #endif | 230 | #endif |
| 223 | 231 | ||
| 224 | /* changes to device_may_wakeup take effect on the next pm state change. | 232 | /* changes to device_may_wakeup take effect on the next pm state change. |
diff --git a/include/linux/pm_legacy.h b/include/linux/pm_legacy.h index 1252b45fac..008932d73c 100644 --- a/include/linux/pm_legacy.h +++ b/include/linux/pm_legacy.h | |||
| @@ -16,11 +16,6 @@ struct pm_dev __deprecated * | |||
| 16 | pm_register(pm_dev_t type, unsigned long id, pm_callback callback); | 16 | pm_register(pm_dev_t type, unsigned long id, pm_callback callback); |
| 17 | 17 | ||
| 18 | /* | 18 | /* |
| 19 | * Unregister a device with power management | ||
| 20 | */ | ||
| 21 | void __deprecated pm_unregister(struct pm_dev *dev); | ||
| 22 | |||
| 23 | /* | ||
| 24 | * Unregister all devices with matching callback | 19 | * Unregister all devices with matching callback |
| 25 | */ | 20 | */ |
| 26 | void __deprecated pm_unregister_all(pm_callback callback); | 21 | void __deprecated pm_unregister_all(pm_callback callback); |
| @@ -41,8 +36,6 @@ static inline struct pm_dev *pm_register(pm_dev_t type, | |||
| 41 | return NULL; | 36 | return NULL; |
| 42 | } | 37 | } |
| 43 | 38 | ||
| 44 | static inline void pm_unregister(struct pm_dev *dev) {} | ||
| 45 | |||
| 46 | static inline void pm_unregister_all(pm_callback callback) {} | 39 | static inline void pm_unregister_all(pm_callback callback) {} |
| 47 | 40 | ||
| 48 | static inline int pm_send_all(pm_request_t rqst, void *data) | 41 | static inline int pm_send_all(pm_request_t rqst, void *data) |
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 5673008b61..970284f571 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h | |||
| @@ -132,6 +132,7 @@ static inline void rcu_bh_qsctr_inc(int cpu) | |||
| 132 | } | 132 | } |
| 133 | 133 | ||
| 134 | extern int rcu_pending(int cpu); | 134 | extern int rcu_pending(int cpu); |
| 135 | extern int rcu_needs_cpu(int cpu); | ||
| 135 | 136 | ||
| 136 | /** | 137 | /** |
| 137 | * rcu_read_lock - mark the beginning of an RCU read-side critical section. | 138 | * rcu_read_lock - mark the beginning of an RCU read-side critical section. |
diff --git a/include/linux/sched.h b/include/linux/sched.h index e3539c14e4..29b7d4f87d 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -911,7 +911,6 @@ static inline int pid_alive(struct task_struct *p) | |||
| 911 | extern void free_task(struct task_struct *tsk); | 911 | extern void free_task(struct task_struct *tsk); |
| 912 | #define get_task_struct(tsk) do { atomic_inc(&(tsk)->usage); } while(0) | 912 | #define get_task_struct(tsk) do { atomic_inc(&(tsk)->usage); } while(0) |
| 913 | 913 | ||
| 914 | extern void __put_task_struct_cb(struct rcu_head *rhp); | ||
| 915 | extern void __put_task_struct(struct task_struct *t); | 914 | extern void __put_task_struct(struct task_struct *t); |
| 916 | 915 | ||
| 917 | static inline void put_task_struct(struct task_struct *t) | 916 | static inline void put_task_struct(struct task_struct *t) |
| @@ -1193,8 +1192,7 @@ extern void wait_task_inactive(task_t * p); | |||
| 1193 | #define remove_parent(p) list_del_init(&(p)->sibling) | 1192 | #define remove_parent(p) list_del_init(&(p)->sibling) |
| 1194 | #define add_parent(p) list_add_tail(&(p)->sibling,&(p)->parent->children) | 1193 | #define add_parent(p) list_add_tail(&(p)->sibling,&(p)->parent->children) |
| 1195 | 1194 | ||
| 1196 | #define next_task(p) list_entry((p)->tasks.next, struct task_struct, tasks) | 1195 | #define next_task(p) list_entry(rcu_dereference((p)->tasks.next), struct task_struct, tasks) |
| 1197 | #define prev_task(p) list_entry((p)->tasks.prev, struct task_struct, tasks) | ||
| 1198 | 1196 | ||
| 1199 | #define for_each_process(p) \ | 1197 | #define for_each_process(p) \ |
| 1200 | for (p = &init_task ; (p = next_task(p)) != &init_task ; ) | 1198 | for (p = &init_task ; (p = next_task(p)) != &init_task ; ) |
diff --git a/include/linux/security.h b/include/linux/security.h index aaa0a5cdbf..1bab48f6ae 100644 --- a/include/linux/security.h +++ b/include/linux/security.h | |||
| @@ -869,11 +869,6 @@ struct swap_info_struct; | |||
| 869 | * @ipcp contains the kernel IPC permission structure | 869 | * @ipcp contains the kernel IPC permission structure |
| 870 | * @flag contains the desired (requested) permission set | 870 | * @flag contains the desired (requested) permission set |
| 871 | * Return 0 if permission is granted. | 871 | * Return 0 if permission is granted. |
| 872 | * @ipc_getsecurity: | ||
| 873 | * Copy the security label associated with the ipc object into | ||
| 874 | * @buffer. @buffer may be NULL to request the size of the buffer | ||
| 875 | * required. @size indicates the size of @buffer in bytes. Return | ||
| 876 | * number of bytes used/required on success. | ||
| 877 | * | 872 | * |
| 878 | * Security hooks for individual messages held in System V IPC message queues | 873 | * Security hooks for individual messages held in System V IPC message queues |
| 879 | * @msg_msg_alloc_security: | 874 | * @msg_msg_alloc_security: |
| @@ -1223,7 +1218,6 @@ struct security_operations { | |||
| 1223 | void (*task_to_inode)(struct task_struct *p, struct inode *inode); | 1218 | void (*task_to_inode)(struct task_struct *p, struct inode *inode); |
| 1224 | 1219 | ||
| 1225 | int (*ipc_permission) (struct kern_ipc_perm * ipcp, short flag); | 1220 | int (*ipc_permission) (struct kern_ipc_perm * ipcp, short flag); |
| 1226 | int (*ipc_getsecurity)(struct kern_ipc_perm *ipcp, void *buffer, size_t size); | ||
| 1227 | 1221 | ||
| 1228 | int (*msg_msg_alloc_security) (struct msg_msg * msg); | 1222 | int (*msg_msg_alloc_security) (struct msg_msg * msg); |
| 1229 | void (*msg_msg_free_security) (struct msg_msg * msg); | 1223 | void (*msg_msg_free_security) (struct msg_msg * msg); |
| @@ -1887,11 +1881,6 @@ static inline int security_ipc_permission (struct kern_ipc_perm *ipcp, | |||
| 1887 | return security_ops->ipc_permission (ipcp, flag); | 1881 | return security_ops->ipc_permission (ipcp, flag); |
| 1888 | } | 1882 | } |
| 1889 | 1883 | ||
| 1890 | static inline int security_ipc_getsecurity(struct kern_ipc_perm *ipcp, void *buffer, size_t size) | ||
| 1891 | { | ||
| 1892 | return security_ops->ipc_getsecurity(ipcp, buffer, size); | ||
| 1893 | } | ||
| 1894 | |||
| 1895 | static inline int security_msg_msg_alloc (struct msg_msg * msg) | 1884 | static inline int security_msg_msg_alloc (struct msg_msg * msg) |
| 1896 | { | 1885 | { |
| 1897 | return security_ops->msg_msg_alloc_security (msg); | 1886 | return security_ops->msg_msg_alloc_security (msg); |
| @@ -2532,11 +2521,6 @@ static inline int security_ipc_permission (struct kern_ipc_perm *ipcp, | |||
| 2532 | return 0; | 2521 | return 0; |
| 2533 | } | 2522 | } |
| 2534 | 2523 | ||
| 2535 | static inline int security_ipc_getsecurity(struct kern_ipc_perm *ipcp, void *buffer, size_t size) | ||
| 2536 | { | ||
| 2537 | return -EOPNOTSUPP; | ||
| 2538 | } | ||
| 2539 | |||
| 2540 | static inline int security_msg_msg_alloc (struct msg_msg * msg) | 2524 | static inline int security_msg_msg_alloc (struct msg_msg * msg) |
| 2541 | { | 2525 | { |
| 2542 | return 0; | 2526 | return 0; |
diff --git a/include/linux/selinux.h b/include/linux/selinux.h new file mode 100644 index 0000000000..4047bcde44 --- /dev/null +++ b/include/linux/selinux.h | |||
| @@ -0,0 +1,177 @@ | |||
| 1 | /* | ||
| 2 | * SELinux services exported to the rest of the kernel. | ||
| 3 | * | ||
| 4 | * Author: James Morris <jmorris@redhat.com> | ||
| 5 | * | ||
| 6 | * Copyright (C) 2005 Red Hat, Inc., James Morris <jmorris@redhat.com> | ||
| 7 | * Copyright (C) 2006 Trusted Computer Solutions, Inc. <dgoeddel@trustedcs.com> | ||
| 8 | * Copyright (C) 2006 IBM Corporation, Timothy R. Chavez <tinytim@us.ibm.com> | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License version 2, | ||
| 12 | * as published by the Free Software Foundation. | ||
| 13 | */ | ||
| 14 | #ifndef _LINUX_SELINUX_H | ||
| 15 | #define _LINUX_SELINUX_H | ||
| 16 | |||
| 17 | struct selinux_audit_rule; | ||
| 18 | struct audit_context; | ||
| 19 | struct inode; | ||
| 20 | struct kern_ipc_perm; | ||
| 21 | |||
| 22 | #ifdef CONFIG_SECURITY_SELINUX | ||
| 23 | |||
| 24 | /** | ||
| 25 | * selinux_audit_rule_init - alloc/init an selinux audit rule structure. | ||
| 26 | * @field: the field this rule refers to | ||
| 27 | * @op: the operater the rule uses | ||
| 28 | * @rulestr: the text "target" of the rule | ||
| 29 | * @rule: pointer to the new rule structure returned via this | ||
| 30 | * | ||
| 31 | * Returns 0 if successful, -errno if not. On success, the rule structure | ||
| 32 | * will be allocated internally. The caller must free this structure with | ||
| 33 | * selinux_audit_rule_free() after use. | ||
| 34 | */ | ||
| 35 | int selinux_audit_rule_init(u32 field, u32 op, char *rulestr, | ||
| 36 | struct selinux_audit_rule **rule); | ||
| 37 | |||
| 38 | /** | ||
| 39 | * selinux_audit_rule_free - free an selinux audit rule structure. | ||
| 40 | * @rule: pointer to the audit rule to be freed | ||
| 41 | * | ||
| 42 | * This will free all memory associated with the given rule. | ||
| 43 | * If @rule is NULL, no operation is performed. | ||
| 44 | */ | ||
| 45 | void selinux_audit_rule_free(struct selinux_audit_rule *rule); | ||
| 46 | |||
| 47 | /** | ||
| 48 | * selinux_audit_rule_match - determine if a context ID matches a rule. | ||
| 49 | * @ctxid: the context ID to check | ||
| 50 | * @field: the field this rule refers to | ||
| 51 | * @op: the operater the rule uses | ||
| 52 | * @rule: pointer to the audit rule to check against | ||
| 53 | * @actx: the audit context (can be NULL) associated with the check | ||
| 54 | * | ||
| 55 | * Returns 1 if the context id matches the rule, 0 if it does not, and | ||
| 56 | * -errno on failure. | ||
| 57 | */ | ||
| 58 | int selinux_audit_rule_match(u32 ctxid, u32 field, u32 op, | ||
| 59 | struct selinux_audit_rule *rule, | ||
| 60 | struct audit_context *actx); | ||
| 61 | |||
| 62 | /** | ||
| 63 | * selinux_audit_set_callback - set the callback for policy reloads. | ||
| 64 | * @callback: the function to call when the policy is reloaded | ||
| 65 | * | ||
| 66 | * This sets the function callback function that will update the rules | ||
| 67 | * upon policy reloads. This callback should rebuild all existing rules | ||
| 68 | * using selinux_audit_rule_init(). | ||
| 69 | */ | ||
| 70 | void selinux_audit_set_callback(int (*callback)(void)); | ||
| 71 | |||
| 72 | /** | ||
| 73 | * selinux_task_ctxid - determine a context ID for a process. | ||
| 74 | * @tsk: the task object | ||
| 75 | * @ctxid: ID value returned via this | ||
| 76 | * | ||
| 77 | * On return, ctxid will contain an ID for the context. This value | ||
| 78 | * should only be used opaquely. | ||
| 79 | */ | ||
| 80 | void selinux_task_ctxid(struct task_struct *tsk, u32 *ctxid); | ||
| 81 | |||
| 82 | /** | ||
| 83 | * selinux_ctxid_to_string - map a security context ID to a string | ||
| 84 | * @ctxid: security context ID to be converted. | ||
| 85 | * @ctx: address of context string to be returned | ||
| 86 | * @ctxlen: length of returned context string. | ||
| 87 | * | ||
| 88 | * Returns 0 if successful, -errno if not. On success, the context | ||
| 89 | * string will be allocated internally, and the caller must call | ||
| 90 | * kfree() on it after use. | ||
| 91 | */ | ||
| 92 | int selinux_ctxid_to_string(u32 ctxid, char **ctx, u32 *ctxlen); | ||
| 93 | |||
| 94 | /** | ||
| 95 | * selinux_get_inode_sid - get the inode's security context ID | ||
| 96 | * @inode: inode structure to get the sid from. | ||
| 97 | * @sid: pointer to security context ID to be filled in. | ||
| 98 | * | ||
| 99 | * Returns nothing | ||
| 100 | */ | ||
| 101 | void selinux_get_inode_sid(const struct inode *inode, u32 *sid); | ||
| 102 | |||
| 103 | /** | ||
| 104 | * selinux_get_ipc_sid - get the ipc security context ID | ||
| 105 | * @ipcp: ipc structure to get the sid from. | ||
| 106 | * @sid: pointer to security context ID to be filled in. | ||
| 107 | * | ||
| 108 | * Returns nothing | ||
| 109 | */ | ||
| 110 | void selinux_get_ipc_sid(const struct kern_ipc_perm *ipcp, u32 *sid); | ||
| 111 | |||
| 112 | /** | ||
| 113 | * selinux_get_task_sid - return the SID of task | ||
| 114 | * @tsk: the task whose SID will be returned | ||
| 115 | * @sid: pointer to security context ID to be filled in. | ||
| 116 | * | ||
| 117 | * Returns nothing | ||
| 118 | */ | ||
| 119 | void selinux_get_task_sid(struct task_struct *tsk, u32 *sid); | ||
| 120 | |||
| 121 | |||
| 122 | #else | ||
| 123 | |||
| 124 | static inline int selinux_audit_rule_init(u32 field, u32 op, | ||
| 125 | char *rulestr, | ||
| 126 | struct selinux_audit_rule **rule) | ||
| 127 | { | ||
| 128 | return -ENOTSUPP; | ||
| 129 | } | ||
| 130 | |||
| 131 | static inline void selinux_audit_rule_free(struct selinux_audit_rule *rule) | ||
| 132 | { | ||
| 133 | return; | ||
| 134 | } | ||
| 135 | |||
| 136 | static inline int selinux_audit_rule_match(u32 ctxid, u32 field, u32 op, | ||
| 137 | struct selinux_audit_rule *rule, | ||
| 138 | struct audit_context *actx) | ||
| 139 | { | ||
| 140 | return 0; | ||
| 141 | } | ||
| 142 | |||
| 143 | static inline void selinux_audit_set_callback(int (*callback)(void)) | ||
| 144 | { | ||
| 145 | return; | ||
| 146 | } | ||
| 147 | |||
| 148 | static inline void selinux_task_ctxid(struct task_struct *tsk, u32 *ctxid) | ||
| 149 | { | ||
| 150 | *ctxid = 0; | ||
| 151 | } | ||
| 152 | |||
| 153 | static inline int selinux_ctxid_to_string(u32 ctxid, char **ctx, u32 *ctxlen) | ||
| 154 | { | ||
| 155 | *ctx = NULL; | ||
| 156 | *ctxlen = 0; | ||
| 157 | return 0; | ||
| 158 | } | ||
| 159 | |||
| 160 | static inline void selinux_get_inode_sid(const struct inode *inode, u32 *sid) | ||
| 161 | { | ||
| 162 | *sid = 0; | ||
| 163 | } | ||
| 164 | |||
| 165 | static inline void selinux_get_ipc_sid(const struct kern_ipc_perm *ipcp, u32 *sid) | ||
| 166 | { | ||
| 167 | *sid = 0; | ||
| 168 | } | ||
| 169 | |||
| 170 | static inline void selinux_get_task_sid(struct task_struct *tsk, u32 *sid) | ||
| 171 | { | ||
| 172 | *sid = 0; | ||
| 173 | } | ||
| 174 | |||
| 175 | #endif /* CONFIG_SECURITY_SELINUX */ | ||
| 176 | |||
| 177 | #endif /* _LINUX_SELINUX_H */ | ||
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index c32e60e79d..bd14858121 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h | |||
| @@ -254,6 +254,7 @@ struct uart_port { | |||
| 254 | #define UPF_CONS_FLOW ((__force upf_t) (1 << 23)) | 254 | #define UPF_CONS_FLOW ((__force upf_t) (1 << 23)) |
| 255 | #define UPF_SHARE_IRQ ((__force upf_t) (1 << 24)) | 255 | #define UPF_SHARE_IRQ ((__force upf_t) (1 << 24)) |
| 256 | #define UPF_BOOT_AUTOCONF ((__force upf_t) (1 << 28)) | 256 | #define UPF_BOOT_AUTOCONF ((__force upf_t) (1 << 28)) |
| 257 | #define UPF_DEAD ((__force upf_t) (1 << 30)) | ||
| 257 | #define UPF_IOREMAP ((__force upf_t) (1 << 31)) | 258 | #define UPF_IOREMAP ((__force upf_t) (1 << 31)) |
| 258 | 259 | ||
| 259 | #define UPF_CHANGE_MASK ((__force upf_t) (0x17fff)) | 260 | #define UPF_CHANGE_MASK ((__force upf_t) (0x17fff)) |
diff --git a/include/linux/signal.h b/include/linux/signal.h index 162a8fd10b..70739f51a0 100644 --- a/include/linux/signal.h +++ b/include/linux/signal.h | |||
| @@ -14,10 +14,12 @@ | |||
| 14 | * | 14 | * |
| 15 | * SA_INTERRUPT is also used by the irq handling routines. | 15 | * SA_INTERRUPT is also used by the irq handling routines. |
| 16 | * SA_SHIRQ is for shared interrupt support on PCI and EISA. | 16 | * SA_SHIRQ is for shared interrupt support on PCI and EISA. |
| 17 | * SA_PROBEIRQ is set by callers when they expect sharing mismatches to occur | ||
| 17 | */ | 18 | */ |
| 18 | #define SA_PROBE SA_ONESHOT | ||
| 19 | #define SA_SAMPLE_RANDOM SA_RESTART | 19 | #define SA_SAMPLE_RANDOM SA_RESTART |
| 20 | #define SA_SHIRQ 0x04000000 | 20 | #define SA_SHIRQ 0x04000000 |
| 21 | #define SA_PROBEIRQ 0x08000000 | ||
| 22 | |||
| 21 | /* | 23 | /* |
| 22 | * As above, these correspond to the IORESOURCE_IRQ_* defines in | 24 | * As above, these correspond to the IORESOURCE_IRQ_* defines in |
| 23 | * linux/ioport.h to select the interrupt line behaviour. When | 25 | * linux/ioport.h to select the interrupt line behaviour. When |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index c4619a428d..f8f234708b 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
| @@ -344,6 +344,13 @@ extern void skb_over_panic(struct sk_buff *skb, int len, | |||
| 344 | void *here); | 344 | void *here); |
| 345 | extern void skb_under_panic(struct sk_buff *skb, int len, | 345 | extern void skb_under_panic(struct sk_buff *skb, int len, |
| 346 | void *here); | 346 | void *here); |
| 347 | extern void skb_truesize_bug(struct sk_buff *skb); | ||
| 348 | |||
| 349 | static inline void skb_truesize_check(struct sk_buff *skb) | ||
| 350 | { | ||
| 351 | if (unlikely((int)skb->truesize < sizeof(struct sk_buff) + skb->len)) | ||
| 352 | skb_truesize_bug(skb); | ||
| 353 | } | ||
| 347 | 354 | ||
| 348 | extern int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb, | 355 | extern int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb, |
| 349 | int getfrag(void *from, char *to, int offset, | 356 | int getfrag(void *from, char *to, int offset, |
diff --git a/include/linux/slab.h b/include/linux/slab.h index 3af03b19c9..2d985d59c7 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h | |||
| @@ -150,6 +150,7 @@ static inline void *kcalloc(size_t n, size_t size, gfp_t flags) | |||
| 150 | 150 | ||
| 151 | extern void kfree(const void *); | 151 | extern void kfree(const void *); |
| 152 | extern unsigned int ksize(const void *); | 152 | extern unsigned int ksize(const void *); |
| 153 | extern int slab_is_available(void); | ||
| 153 | 154 | ||
| 154 | #ifdef CONFIG_NUMA | 155 | #ifdef CONFIG_NUMA |
| 155 | extern void *kmem_cache_alloc_node(kmem_cache_t *, gfp_t flags, int node); | 156 | extern void *kmem_cache_alloc_node(kmem_cache_t *, gfp_t flags, int node); |
diff --git a/include/linux/spi/ads7846.h b/include/linux/spi/ads7846.h index 72261e0f2a..adb3dafd33 100644 --- a/include/linux/spi/ads7846.h +++ b/include/linux/spi/ads7846.h | |||
| @@ -14,5 +14,12 @@ struct ads7846_platform_data { | |||
| 14 | u16 x_min, x_max; | 14 | u16 x_min, x_max; |
| 15 | u16 y_min, y_max; | 15 | u16 y_min, y_max; |
| 16 | u16 pressure_min, pressure_max; | 16 | u16 pressure_min, pressure_max; |
| 17 | |||
| 18 | u16 debounce_max; /* max number of additional readings | ||
| 19 | * per sample */ | ||
| 20 | u16 debounce_tol; /* tolerance used for filtering */ | ||
| 21 | u16 debounce_rep; /* additional consecutive good readings | ||
| 22 | * required after the first two */ | ||
| 23 | int (*get_pendown_state)(void); | ||
| 17 | }; | 24 | }; |
| 18 | 25 | ||
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index b05f1463a2..e928c0dcc2 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h | |||
| @@ -31,18 +31,23 @@ extern struct bus_type spi_bus_type; | |||
| 31 | * @master: SPI controller used with the device. | 31 | * @master: SPI controller used with the device. |
| 32 | * @max_speed_hz: Maximum clock rate to be used with this chip | 32 | * @max_speed_hz: Maximum clock rate to be used with this chip |
| 33 | * (on this board); may be changed by the device's driver. | 33 | * (on this board); may be changed by the device's driver. |
| 34 | * The spi_transfer.speed_hz can override this for each transfer. | ||
| 34 | * @chip-select: Chipselect, distinguishing chips handled by "master". | 35 | * @chip-select: Chipselect, distinguishing chips handled by "master". |
| 35 | * @mode: The spi mode defines how data is clocked out and in. | 36 | * @mode: The spi mode defines how data is clocked out and in. |
| 36 | * This may be changed by the device's driver. | 37 | * This may be changed by the device's driver. |
| 38 | * The "active low" default for chipselect mode can be overridden, | ||
| 39 | * as can the "MSB first" default for each word in a transfer. | ||
| 37 | * @bits_per_word: Data transfers involve one or more words; word sizes | 40 | * @bits_per_word: Data transfers involve one or more words; word sizes |
| 38 | * like eight or 12 bits are common. In-memory wordsizes are | 41 | * like eight or 12 bits are common. In-memory wordsizes are |
| 39 | * powers of two bytes (e.g. 20 bit samples use 32 bits). | 42 | * powers of two bytes (e.g. 20 bit samples use 32 bits). |
| 40 | * This may be changed by the device's driver. | 43 | * This may be changed by the device's driver, or left at the |
| 44 | * default (0) indicating protocol words are eight bit bytes. | ||
| 45 | * The spi_transfer.bits_per_word can override this for each transfer. | ||
| 41 | * @irq: Negative, or the number passed to request_irq() to receive | 46 | * @irq: Negative, or the number passed to request_irq() to receive |
| 42 | * interrupts from this device. | 47 | * interrupts from this device. |
| 43 | * @controller_state: Controller's runtime state | 48 | * @controller_state: Controller's runtime state |
| 44 | * @controller_data: Board-specific definitions for controller, such as | 49 | * @controller_data: Board-specific definitions for controller, such as |
| 45 | * FIFO initialization parameters; from board_info.controller_data | 50 | * FIFO initialization parameters; from board_info.controller_data |
| 46 | * | 51 | * |
| 47 | * An spi_device is used to interchange data between an SPI slave | 52 | * An spi_device is used to interchange data between an SPI slave |
| 48 | * (usually a discrete chip) and CPU memory. | 53 | * (usually a discrete chip) and CPU memory. |
| @@ -65,6 +70,7 @@ struct spi_device { | |||
| 65 | #define SPI_MODE_2 (SPI_CPOL|0) | 70 | #define SPI_MODE_2 (SPI_CPOL|0) |
| 66 | #define SPI_MODE_3 (SPI_CPOL|SPI_CPHA) | 71 | #define SPI_MODE_3 (SPI_CPOL|SPI_CPHA) |
| 67 | #define SPI_CS_HIGH 0x04 /* chipselect active high? */ | 72 | #define SPI_CS_HIGH 0x04 /* chipselect active high? */ |
| 73 | #define SPI_LSB_FIRST 0x08 /* per-word bits-on-wire */ | ||
| 68 | u8 bits_per_word; | 74 | u8 bits_per_word; |
| 69 | int irq; | 75 | int irq; |
| 70 | void *controller_state; | 76 | void *controller_state; |
| @@ -73,7 +79,6 @@ struct spi_device { | |||
| 73 | 79 | ||
| 74 | // likely need more hooks for more protocol options affecting how | 80 | // likely need more hooks for more protocol options affecting how |
| 75 | // the controller talks to each chip, like: | 81 | // the controller talks to each chip, like: |
| 76 | // - bit order (default is wordwise msb-first) | ||
| 77 | // - memory packing (12 bit samples into low bits, others zeroed) | 82 | // - memory packing (12 bit samples into low bits, others zeroed) |
| 78 | // - priority | 83 | // - priority |
| 79 | // - drop chipselect after each word | 84 | // - drop chipselect after each word |
| @@ -143,13 +148,13 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv) | |||
| 143 | * struct spi_master - interface to SPI master controller | 148 | * struct spi_master - interface to SPI master controller |
| 144 | * @cdev: class interface to this driver | 149 | * @cdev: class interface to this driver |
| 145 | * @bus_num: board-specific (and often SOC-specific) identifier for a | 150 | * @bus_num: board-specific (and often SOC-specific) identifier for a |
| 146 | * given SPI controller. | 151 | * given SPI controller. |
| 147 | * @num_chipselect: chipselects are used to distinguish individual | 152 | * @num_chipselect: chipselects are used to distinguish individual |
| 148 | * SPI slaves, and are numbered from zero to num_chipselects. | 153 | * SPI slaves, and are numbered from zero to num_chipselects. |
| 149 | * each slave has a chipselect signal, but it's common that not | 154 | * each slave has a chipselect signal, but it's common that not |
| 150 | * every chipselect is connected to a slave. | 155 | * every chipselect is connected to a slave. |
| 151 | * @setup: updates the device mode and clocking records used by a | 156 | * @setup: updates the device mode and clocking records used by a |
| 152 | * device's SPI controller; protocol code may call this. | 157 | * device's SPI controller; protocol code may call this. |
| 153 | * @transfer: adds a message to the controller's transfer queue. | 158 | * @transfer: adds a message to the controller's transfer queue. |
| 154 | * @cleanup: frees controller-specific state | 159 | * @cleanup: frees controller-specific state |
| 155 | * | 160 | * |
| @@ -167,13 +172,13 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv) | |||
| 167 | struct spi_master { | 172 | struct spi_master { |
| 168 | struct class_device cdev; | 173 | struct class_device cdev; |
| 169 | 174 | ||
| 170 | /* other than zero (== assign one dynamically), bus_num is fully | 175 | /* other than negative (== assign one dynamically), bus_num is fully |
| 171 | * board-specific. usually that simplifies to being SOC-specific. | 176 | * board-specific. usually that simplifies to being SOC-specific. |
| 172 | * example: one SOC has three SPI controllers, numbered 1..3, | 177 | * example: one SOC has three SPI controllers, numbered 0..2, |
| 173 | * and one board's schematics might show it using SPI-2. software | 178 | * and one board's schematics might show it using SPI-2. software |
| 174 | * would normally use bus_num=2 for that controller. | 179 | * would normally use bus_num=2 for that controller. |
| 175 | */ | 180 | */ |
| 176 | u16 bus_num; | 181 | s16 bus_num; |
| 177 | 182 | ||
| 178 | /* chipselects will be integral to many controllers; some others | 183 | /* chipselects will be integral to many controllers; some others |
| 179 | * might use board-specific GPIOs. | 184 | * might use board-specific GPIOs. |
| @@ -268,10 +273,14 @@ extern struct spi_master *spi_busnum_to_master(u16 busnum); | |||
| 268 | * @tx_dma: DMA address of tx_buf, if spi_message.is_dma_mapped | 273 | * @tx_dma: DMA address of tx_buf, if spi_message.is_dma_mapped |
| 269 | * @rx_dma: DMA address of rx_buf, if spi_message.is_dma_mapped | 274 | * @rx_dma: DMA address of rx_buf, if spi_message.is_dma_mapped |
| 270 | * @len: size of rx and tx buffers (in bytes) | 275 | * @len: size of rx and tx buffers (in bytes) |
| 276 | * @speed_hz: Select a speed other then the device default for this | ||
| 277 | * transfer. If 0 the default (from spi_device) is used. | ||
| 278 | * @bits_per_word: select a bits_per_word other then the device default | ||
| 279 | * for this transfer. If 0 the default (from spi_device) is used. | ||
| 271 | * @cs_change: affects chipselect after this transfer completes | 280 | * @cs_change: affects chipselect after this transfer completes |
| 272 | * @delay_usecs: microseconds to delay after this transfer before | 281 | * @delay_usecs: microseconds to delay after this transfer before |
| 273 | * (optionally) changing the chipselect status, then starting | 282 | * (optionally) changing the chipselect status, then starting |
| 274 | * the next transfer or completing this spi_message. | 283 | * the next transfer or completing this spi_message. |
| 275 | * @transfer_list: transfers are sequenced through spi_message.transfers | 284 | * @transfer_list: transfers are sequenced through spi_message.transfers |
| 276 | * | 285 | * |
| 277 | * SPI transfers always write the same number of bytes as they read. | 286 | * SPI transfers always write the same number of bytes as they read. |
| @@ -322,7 +331,9 @@ struct spi_transfer { | |||
| 322 | dma_addr_t rx_dma; | 331 | dma_addr_t rx_dma; |
| 323 | 332 | ||
| 324 | unsigned cs_change:1; | 333 | unsigned cs_change:1; |
| 334 | u8 bits_per_word; | ||
| 325 | u16 delay_usecs; | 335 | u16 delay_usecs; |
| 336 | u32 speed_hz; | ||
| 326 | 337 | ||
| 327 | struct list_head transfer_list; | 338 | struct list_head transfer_list; |
| 328 | }; | 339 | }; |
| @@ -356,7 +367,7 @@ struct spi_transfer { | |||
| 356 | * and its transfers, ignore them until its completion callback. | 367 | * and its transfers, ignore them until its completion callback. |
| 357 | */ | 368 | */ |
| 358 | struct spi_message { | 369 | struct spi_message { |
| 359 | struct list_head transfers; | 370 | struct list_head transfers; |
| 360 | 371 | ||
| 361 | struct spi_device *spi; | 372 | struct spi_device *spi; |
| 362 | 373 | ||
| @@ -374,7 +385,7 @@ struct spi_message { | |||
| 374 | */ | 385 | */ |
| 375 | 386 | ||
| 376 | /* completion is reported through a callback */ | 387 | /* completion is reported through a callback */ |
| 377 | void (*complete)(void *context); | 388 | void (*complete)(void *context); |
| 378 | void *context; | 389 | void *context; |
| 379 | unsigned actual_length; | 390 | unsigned actual_length; |
| 380 | int status; | 391 | int status; |
diff --git a/include/linux/spi/spi_bitbang.h b/include/linux/spi/spi_bitbang.h index c961fe9bf3..16ce178f54 100644 --- a/include/linux/spi/spi_bitbang.h +++ b/include/linux/spi/spi_bitbang.h | |||
| @@ -30,6 +30,12 @@ struct spi_bitbang { | |||
| 30 | 30 | ||
| 31 | struct spi_master *master; | 31 | struct spi_master *master; |
| 32 | 32 | ||
| 33 | /* setup_transfer() changes clock and/or wordsize to match settings | ||
| 34 | * for this transfer; zeroes restore defaults from spi_device. | ||
| 35 | */ | ||
| 36 | int (*setup_transfer)(struct spi_device *spi, | ||
| 37 | struct spi_transfer *t); | ||
| 38 | |||
| 33 | void (*chipselect)(struct spi_device *spi, int is_on); | 39 | void (*chipselect)(struct spi_device *spi, int is_on); |
| 34 | #define BITBANG_CS_ACTIVE 1 /* normally nCS, active low */ | 40 | #define BITBANG_CS_ACTIVE 1 /* normally nCS, active low */ |
| 35 | #define BITBANG_CS_INACTIVE 0 | 41 | #define BITBANG_CS_INACTIVE 0 |
| @@ -51,6 +57,8 @@ struct spi_bitbang { | |||
| 51 | extern int spi_bitbang_setup(struct spi_device *spi); | 57 | extern int spi_bitbang_setup(struct spi_device *spi); |
| 52 | extern void spi_bitbang_cleanup(const struct spi_device *spi); | 58 | extern void spi_bitbang_cleanup(const struct spi_device *spi); |
| 53 | extern int spi_bitbang_transfer(struct spi_device *spi, struct spi_message *m); | 59 | extern int spi_bitbang_transfer(struct spi_device *spi, struct spi_message *m); |
| 60 | extern int spi_bitbang_setup_transfer(struct spi_device *spi, | ||
| 61 | struct spi_transfer *t); | ||
| 54 | 62 | ||
| 55 | /* start or stop queue processing */ | 63 | /* start or stop queue processing */ |
| 56 | extern int spi_bitbang_start(struct spi_bitbang *spi); | 64 | extern int spi_bitbang_start(struct spi_bitbang *spi); |
diff --git a/include/linux/sunrpc/metrics.h b/include/linux/sunrpc/metrics.h index 8f96e9dc36..77f78e56c4 100644 --- a/include/linux/sunrpc/metrics.h +++ b/include/linux/sunrpc/metrics.h | |||
| @@ -69,9 +69,21 @@ struct rpc_clnt; | |||
| 69 | /* | 69 | /* |
| 70 | * EXPORTed functions for managing rpc_iostats structures | 70 | * EXPORTed functions for managing rpc_iostats structures |
| 71 | */ | 71 | */ |
| 72 | |||
| 73 | #ifdef CONFIG_PROC_FS | ||
| 74 | |||
| 72 | struct rpc_iostats * rpc_alloc_iostats(struct rpc_clnt *); | 75 | struct rpc_iostats * rpc_alloc_iostats(struct rpc_clnt *); |
| 73 | void rpc_count_iostats(struct rpc_task *); | 76 | void rpc_count_iostats(struct rpc_task *); |
| 74 | void rpc_print_iostats(struct seq_file *, struct rpc_clnt *); | 77 | void rpc_print_iostats(struct seq_file *, struct rpc_clnt *); |
| 75 | void rpc_free_iostats(struct rpc_iostats *); | 78 | void rpc_free_iostats(struct rpc_iostats *); |
| 76 | 79 | ||
| 80 | #else /* CONFIG_PROC_FS */ | ||
| 81 | |||
| 82 | static inline struct rpc_iostats *rpc_alloc_iostats(struct rpc_clnt *clnt) { return NULL; } | ||
| 83 | static inline void rpc_count_iostats(struct rpc_task *task) {} | ||
| 84 | static inline void rpc_print_iostats(struct seq_file *seq, struct rpc_clnt *clnt) {} | ||
| 85 | static inline void rpc_free_iostats(struct rpc_iostats *stats) {} | ||
| 86 | |||
| 87 | #endif /* CONFIG_PROC_FS */ | ||
| 88 | |||
| 77 | #endif /* _LINUX_SUNRPC_METRICS_H */ | 89 | #endif /* _LINUX_SUNRPC_METRICS_H */ |
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index 7eebbab716..e8bbe8118d 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h | |||
| @@ -53,6 +53,7 @@ struct rpc_timeout { | |||
| 53 | 53 | ||
| 54 | struct rpc_task; | 54 | struct rpc_task; |
| 55 | struct rpc_xprt; | 55 | struct rpc_xprt; |
| 56 | struct seq_file; | ||
| 56 | 57 | ||
| 57 | /* | 58 | /* |
| 58 | * This describes a complete RPC request | 59 | * This describes a complete RPC request |
diff --git a/include/linux/swap.h b/include/linux/swap.h index 5b1fdf1cff..f03c247193 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h | |||
| @@ -296,7 +296,7 @@ static inline void disable_swap_token(void) | |||
| 296 | #define read_swap_cache_async(swp,vma,addr) NULL | 296 | #define read_swap_cache_async(swp,vma,addr) NULL |
| 297 | #define lookup_swap_cache(swp) NULL | 297 | #define lookup_swap_cache(swp) NULL |
| 298 | #define valid_swaphandles(swp, off) 0 | 298 | #define valid_swaphandles(swp, off) 0 |
| 299 | #define can_share_swap_page(p) 0 | 299 | #define can_share_swap_page(p) (page_mapcount(p) == 1) |
| 300 | #define move_to_swap_cache(p, swp) 1 | 300 | #define move_to_swap_cache(p, swp) 1 |
| 301 | #define move_from_swap_cache(p, i, m) 1 | 301 | #define move_from_swap_cache(p, i, m) 1 |
| 302 | #define __delete_from_swap_cache(p) /*NOTHING*/ | 302 | #define __delete_from_swap_cache(p) /*NOTHING*/ |
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index f001bad28d..60d49e5456 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
| @@ -52,6 +52,7 @@ struct utimbuf; | |||
| 52 | struct mq_attr; | 52 | struct mq_attr; |
| 53 | struct compat_stat; | 53 | struct compat_stat; |
| 54 | struct compat_timeval; | 54 | struct compat_timeval; |
| 55 | struct robust_list_head; | ||
| 55 | 56 | ||
| 56 | #include <linux/config.h> | 57 | #include <linux/config.h> |
| 57 | #include <linux/types.h> | 58 | #include <linux/types.h> |
| @@ -574,7 +575,17 @@ asmlinkage long sys_splice(int fd_in, loff_t __user *off_in, | |||
| 574 | int fd_out, loff_t __user *off_out, | 575 | int fd_out, loff_t __user *off_out, |
| 575 | size_t len, unsigned int flags); | 576 | size_t len, unsigned int flags); |
| 576 | 577 | ||
| 578 | asmlinkage long sys_vmsplice(int fd, const struct iovec __user *iov, | ||
| 579 | unsigned long nr_segs, unsigned int flags); | ||
| 580 | |||
| 581 | asmlinkage long sys_tee(int fdin, int fdout, size_t len, unsigned int flags); | ||
| 582 | |||
| 577 | asmlinkage long sys_sync_file_range(int fd, loff_t offset, loff_t nbytes, | 583 | asmlinkage long sys_sync_file_range(int fd, loff_t offset, loff_t nbytes, |
| 578 | unsigned int flags); | 584 | unsigned int flags); |
| 585 | asmlinkage long sys_get_robust_list(int pid, | ||
| 586 | struct robust_list_head __user **head_ptr, | ||
| 587 | size_t __user *len_ptr); | ||
| 588 | asmlinkage long sys_set_robust_list(struct robust_list_head __user *head, | ||
| 589 | size_t len); | ||
| 579 | 590 | ||
| 580 | #endif | 591 | #endif |
diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h index 392da5a6da..1ea5d3cda6 100644 --- a/include/linux/sysfs.h +++ b/include/linux/sysfs.h | |||
| @@ -74,6 +74,7 @@ struct sysfs_dirent { | |||
| 74 | umode_t s_mode; | 74 | umode_t s_mode; |
| 75 | struct dentry * s_dentry; | 75 | struct dentry * s_dentry; |
| 76 | struct iattr * s_iattr; | 76 | struct iattr * s_iattr; |
| 77 | atomic_t s_event; | ||
| 77 | }; | 78 | }; |
| 78 | 79 | ||
| 79 | #define SYSFS_ROOT 0x0001 | 80 | #define SYSFS_ROOT 0x0001 |
| @@ -117,6 +118,7 @@ int sysfs_remove_bin_file(struct kobject * kobj, struct bin_attribute * attr); | |||
| 117 | 118 | ||
| 118 | int sysfs_create_group(struct kobject *, const struct attribute_group *); | 119 | int sysfs_create_group(struct kobject *, const struct attribute_group *); |
| 119 | void sysfs_remove_group(struct kobject *, const struct attribute_group *); | 120 | void sysfs_remove_group(struct kobject *, const struct attribute_group *); |
| 121 | void sysfs_notify(struct kobject * k, char *dir, char *attr); | ||
| 120 | 122 | ||
| 121 | #else /* CONFIG_SYSFS */ | 123 | #else /* CONFIG_SYSFS */ |
| 122 | 124 | ||
| @@ -185,6 +187,10 @@ static inline void sysfs_remove_group(struct kobject * k, const struct attribute | |||
| 185 | ; | 187 | ; |
| 186 | } | 188 | } |
| 187 | 189 | ||
| 190 | static inline void sysfs_notify(struct kobject * k, char *dir, char *attr) | ||
| 191 | { | ||
| 192 | } | ||
| 193 | |||
| 188 | #endif /* CONFIG_SYSFS */ | 194 | #endif /* CONFIG_SYSFS */ |
| 189 | 195 | ||
| 190 | #endif /* _SYSFS_H_ */ | 196 | #endif /* _SYSFS_H_ */ |
diff --git a/include/linux/usb/net2280.h b/include/linux/usb/net2280.h new file mode 100644 index 0000000000..c602f884f1 --- /dev/null +++ b/include/linux/usb/net2280.h | |||
| @@ -0,0 +1,444 @@ | |||
| 1 | /* | ||
| 2 | * NetChip 2280 high/full speed USB device controller. | ||
| 3 | * Unlike many such controllers, this one talks PCI. | ||
| 4 | */ | ||
| 5 | #ifndef __LINUX_USB_NET2280_H | ||
| 6 | #define __LINUX_USB_NET2280_H | ||
| 7 | |||
| 8 | /* | ||
| 9 | * Copyright (C) 2002 NetChip Technology, Inc. (http://www.netchip.com) | ||
| 10 | * Copyright (C) 2003 David Brownell | ||
| 11 | * | ||
| 12 | * This program is free software; you can redistribute it and/or modify | ||
| 13 | * it under the terms of the GNU General Public License as published by | ||
| 14 | * the Free Software Foundation; either version 2 of the License, or | ||
| 15 | * (at your option) any later version. | ||
| 16 | * | ||
| 17 | * This program is distributed in the hope that it will be useful, | ||
| 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 20 | * GNU General Public License for more details. | ||
| 21 | * | ||
| 22 | * You should have received a copy of the GNU General Public License | ||
| 23 | * along with this program; if not, write to the Free Software | ||
| 24 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 25 | */ | ||
| 26 | |||
| 27 | /*-------------------------------------------------------------------------*/ | ||
| 28 | |||
| 29 | /* NET2280 MEMORY MAPPED REGISTERS | ||
| 30 | * | ||
| 31 | * The register layout came from the chip documentation, and the bit | ||
| 32 | * number definitions were extracted from chip specification. | ||
| 33 | * | ||
| 34 | * Use the shift operator ('<<') to build bit masks, with readl/writel | ||
| 35 | * to access the registers through PCI. | ||
| 36 | */ | ||
| 37 | |||
| 38 | /* main registers, BAR0 + 0x0000 */ | ||
| 39 | struct net2280_regs { | ||
| 40 | // offset 0x0000 | ||
| 41 | u32 devinit; | ||
| 42 | #define LOCAL_CLOCK_FREQUENCY 8 | ||
| 43 | #define FORCE_PCI_RESET 7 | ||
| 44 | #define PCI_ID 6 | ||
| 45 | #define PCI_ENABLE 5 | ||
| 46 | #define FIFO_SOFT_RESET 4 | ||
| 47 | #define CFG_SOFT_RESET 3 | ||
| 48 | #define PCI_SOFT_RESET 2 | ||
| 49 | #define USB_SOFT_RESET 1 | ||
| 50 | #define M8051_RESET 0 | ||
| 51 | u32 eectl; | ||
| 52 | #define EEPROM_ADDRESS_WIDTH 23 | ||
| 53 | #define EEPROM_CHIP_SELECT_ACTIVE 22 | ||
| 54 | #define EEPROM_PRESENT 21 | ||
| 55 | #define EEPROM_VALID 20 | ||
| 56 | #define EEPROM_BUSY 19 | ||
| 57 | #define EEPROM_CHIP_SELECT_ENABLE 18 | ||
| 58 | #define EEPROM_BYTE_READ_START 17 | ||
| 59 | #define EEPROM_BYTE_WRITE_START 16 | ||
| 60 | #define EEPROM_READ_DATA 8 | ||
| 61 | #define EEPROM_WRITE_DATA 0 | ||
| 62 | u32 eeclkfreq; | ||
| 63 | u32 _unused0; | ||
| 64 | // offset 0x0010 | ||
| 65 | |||
| 66 | u32 pciirqenb0; /* interrupt PCI master ... */ | ||
| 67 | #define SETUP_PACKET_INTERRUPT_ENABLE 7 | ||
| 68 | #define ENDPOINT_F_INTERRUPT_ENABLE 6 | ||
| 69 | #define ENDPOINT_E_INTERRUPT_ENABLE 5 | ||
| 70 | #define ENDPOINT_D_INTERRUPT_ENABLE 4 | ||
| 71 | #define ENDPOINT_C_INTERRUPT_ENABLE 3 | ||
| 72 | #define ENDPOINT_B_INTERRUPT_ENABLE 2 | ||
| 73 | #define ENDPOINT_A_INTERRUPT_ENABLE 1 | ||
| 74 | #define ENDPOINT_0_INTERRUPT_ENABLE 0 | ||
| 75 | u32 pciirqenb1; | ||
| 76 | #define PCI_INTERRUPT_ENABLE 31 | ||
| 77 | #define POWER_STATE_CHANGE_INTERRUPT_ENABLE 27 | ||
| 78 | #define PCI_ARBITER_TIMEOUT_INTERRUPT_ENABLE 26 | ||
| 79 | #define PCI_PARITY_ERROR_INTERRUPT_ENABLE 25 | ||
| 80 | #define PCI_MASTER_ABORT_RECEIVED_INTERRUPT_ENABLE 20 | ||
| 81 | #define PCI_TARGET_ABORT_RECEIVED_INTERRUPT_ENABLE 19 | ||
| 82 | #define PCI_TARGET_ABORT_ASSERTED_INTERRUPT_ENABLE 18 | ||
| 83 | #define PCI_RETRY_ABORT_INTERRUPT_ENABLE 17 | ||
| 84 | #define PCI_MASTER_CYCLE_DONE_INTERRUPT_ENABLE 16 | ||
| 85 | #define GPIO_INTERRUPT_ENABLE 13 | ||
| 86 | #define DMA_D_INTERRUPT_ENABLE 12 | ||
| 87 | #define DMA_C_INTERRUPT_ENABLE 11 | ||
| 88 | #define DMA_B_INTERRUPT_ENABLE 10 | ||
| 89 | #define DMA_A_INTERRUPT_ENABLE 9 | ||
| 90 | #define EEPROM_DONE_INTERRUPT_ENABLE 8 | ||
| 91 | #define VBUS_INTERRUPT_ENABLE 7 | ||
| 92 | #define CONTROL_STATUS_INTERRUPT_ENABLE 6 | ||
| 93 | #define ROOT_PORT_RESET_INTERRUPT_ENABLE 4 | ||
| 94 | #define SUSPEND_REQUEST_INTERRUPT_ENABLE 3 | ||
| 95 | #define SUSPEND_REQUEST_CHANGE_INTERRUPT_ENABLE 2 | ||
| 96 | #define RESUME_INTERRUPT_ENABLE 1 | ||
| 97 | #define SOF_INTERRUPT_ENABLE 0 | ||
| 98 | u32 cpu_irqenb0; /* ... or onboard 8051 */ | ||
| 99 | #define SETUP_PACKET_INTERRUPT_ENABLE 7 | ||
| 100 | #define ENDPOINT_F_INTERRUPT_ENABLE 6 | ||
| 101 | #define ENDPOINT_E_INTERRUPT_ENABLE 5 | ||
| 102 | #define ENDPOINT_D_INTERRUPT_ENABLE 4 | ||
| 103 | #define ENDPOINT_C_INTERRUPT_ENABLE 3 | ||
| 104 | #define ENDPOINT_B_INTERRUPT_ENABLE 2 | ||
| 105 | #define ENDPOINT_A_INTERRUPT_ENABLE 1 | ||
| 106 | #define ENDPOINT_0_INTERRUPT_ENABLE 0 | ||
| 107 | u32 cpu_irqenb1; | ||
| 108 | #define CPU_INTERRUPT_ENABLE 31 | ||
| 109 | #define POWER_STATE_CHANGE_INTERRUPT_ENABLE 27 | ||
| 110 | #define PCI_ARBITER_TIMEOUT_INTERRUPT_ENABLE 26 | ||
| 111 | #define PCI_PARITY_ERROR_INTERRUPT_ENABLE 25 | ||
| 112 | #define PCI_INTA_INTERRUPT_ENABLE 24 | ||
| 113 | #define PCI_PME_INTERRUPT_ENABLE 23 | ||
| 114 | #define PCI_SERR_INTERRUPT_ENABLE 22 | ||
| 115 | #define PCI_PERR_INTERRUPT_ENABLE 21 | ||
| 116 | #define PCI_MASTER_ABORT_RECEIVED_INTERRUPT_ENABLE 20 | ||
| 117 | #define PCI_TARGET_ABORT_RECEIVED_INTERRUPT_ENABLE 19 | ||
| 118 | #define PCI_RETRY_ABORT_INTERRUPT_ENABLE 17 | ||
| 119 | #define PCI_MASTER_CYCLE_DONE_INTERRUPT_ENABLE 16 | ||
| 120 | #define GPIO_INTERRUPT_ENABLE 13 | ||
| 121 | #define DMA_D_INTERRUPT_ENABLE 12 | ||
| 122 | #define DMA_C_INTERRUPT_ENABLE 11 | ||
| 123 | #define DMA_B_INTERRUPT_ENABLE 10 | ||
| 124 | #define DMA_A_INTERRUPT_ENABLE 9 | ||
| 125 | #define EEPROM_DONE_INTERRUPT_ENABLE 8 | ||
| 126 | #define VBUS_INTERRUPT_ENABLE 7 | ||
| 127 | #define CONTROL_STATUS_INTERRUPT_ENABLE 6 | ||
| 128 | #define ROOT_PORT_RESET_INTERRUPT_ENABLE 4 | ||
| 129 | #define SUSPEND_REQUEST_INTERRUPT_ENABLE 3 | ||
| 130 | #define SUSPEND_REQUEST_CHANGE_INTERRUPT_ENABLE 2 | ||
| 131 | #define RESUME_INTERRUPT_ENABLE 1 | ||
| 132 | #define SOF_INTERRUPT_ENABLE 0 | ||
| 133 | |||
| 134 | // offset 0x0020 | ||
| 135 | u32 _unused1; | ||
| 136 | u32 usbirqenb1; | ||
| 137 | #define USB_INTERRUPT_ENABLE 31 | ||
| 138 | #define POWER_STATE_CHANGE_INTERRUPT_ENABLE 27 | ||
| 139 | #define PCI_ARBITER_TIMEOUT_INTERRUPT_ENABLE 26 | ||
| 140 | #define PCI_PARITY_ERROR_INTERRUPT_ENABLE 25 | ||
| 141 | #define PCI_INTA_INTERRUPT_ENABLE 24 | ||
| 142 | #define PCI_PME_INTERRUPT_ENABLE 23 | ||
| 143 | #define PCI_SERR_INTERRUPT_ENABLE 22 | ||
| 144 | #define PCI_PERR_INTERRUPT_ENABLE 21 | ||
| 145 | #define PCI_MASTER_ABORT_RECEIVED_INTERRUPT_ENABLE 20 | ||
| 146 | #define PCI_TARGET_ABORT_RECEIVED_INTERRUPT_ENABLE 19 | ||
| 147 | #define PCI_RETRY_ABORT_INTERRUPT_ENABLE 17 | ||
| 148 | #define PCI_MASTER_CYCLE_DONE_INTERRUPT_ENABLE 16 | ||
| 149 | #define GPIO_INTERRUPT_ENABLE 13 | ||
| 150 | #define DMA_D_INTERRUPT_ENABLE 12 | ||
| 151 | #define DMA_C_INTERRUPT_ENABLE 11 | ||
| 152 | #define DMA_B_INTERRUPT_ENABLE 10 | ||
| 153 | #define DMA_A_INTERRUPT_ENABLE 9 | ||
| 154 | #define EEPROM_DONE_INTERRUPT_ENABLE 8 | ||
| 155 | #define VBUS_INTERRUPT_ENABLE 7 | ||
| 156 | #define CONTROL_STATUS_INTERRUPT_ENABLE 6 | ||
| 157 | #define ROOT_PORT_RESET_INTERRUPT_ENABLE 4 | ||
| 158 | #define SUSPEND_REQUEST_INTERRUPT_ENABLE 3 | ||
| 159 | #define SUSPEND_REQUEST_CHANGE_INTERRUPT_ENABLE 2 | ||
| 160 | #define RESUME_INTERRUPT_ENABLE 1 | ||
| 161 | #define SOF_INTERRUPT_ENABLE 0 | ||
| 162 | u32 irqstat0; | ||
| 163 | #define INTA_ASSERTED 12 | ||
| 164 | #define SETUP_PACKET_INTERRUPT 7 | ||
| 165 | #define ENDPOINT_F_INTERRUPT 6 | ||
| 166 | #define ENDPOINT_E_INTERRUPT 5 | ||
| 167 | #define ENDPOINT_D_INTERRUPT 4 | ||
| 168 | #define ENDPOINT_C_INTERRUPT 3 | ||
| 169 | #define ENDPOINT_B_INTERRUPT 2 | ||
| 170 | #define ENDPOINT_A_INTERRUPT 1 | ||
| 171 | #define ENDPOINT_0_INTERRUPT 0 | ||
| 172 | u32 irqstat1; | ||
| 173 | #define POWER_STATE_CHANGE_INTERRUPT 27 | ||
| 174 | #define PCI_ARBITER_TIMEOUT_INTERRUPT 26 | ||
| 175 | #define PCI_PARITY_ERROR_INTERRUPT 25 | ||
| 176 | #define PCI_INTA_INTERRUPT 24 | ||
| 177 | #define PCI_PME_INTERRUPT 23 | ||
| 178 | #define PCI_SERR_INTERRUPT 22 | ||
| 179 | #define PCI_PERR_INTERRUPT 21 | ||
| 180 | #define PCI_MASTER_ABORT_RECEIVED_INTERRUPT 20 | ||
| 181 | #define PCI_TARGET_ABORT_RECEIVED_INTERRUPT 19 | ||
| 182 | #define PCI_RETRY_ABORT_INTERRUPT 17 | ||
| 183 | #define PCI_MASTER_CYCLE_DONE_INTERRUPT 16 | ||
| 184 | #define SOF_DOWN_INTERRUPT 14 | ||
| 185 | #define GPIO_INTERRUPT 13 | ||
| 186 | #define DMA_D_INTERRUPT 12 | ||
| 187 | #define DMA_C_INTERRUPT 11 | ||
| 188 | #define DMA_B_INTERRUPT 10 | ||
| 189 | #define DMA_A_INTERRUPT 9 | ||
| 190 | #define EEPROM_DONE_INTERRUPT 8 | ||
| 191 | #define VBUS_INTERRUPT 7 | ||
| 192 | #define CONTROL_STATUS_INTERRUPT 6 | ||
| 193 | #define ROOT_PORT_RESET_INTERRUPT 4 | ||
| 194 | #define SUSPEND_REQUEST_INTERRUPT 3 | ||
| 195 | #define SUSPEND_REQUEST_CHANGE_INTERRUPT 2 | ||
| 196 | #define RESUME_INTERRUPT 1 | ||
| 197 | #define SOF_INTERRUPT 0 | ||
| 198 | // offset 0x0030 | ||
| 199 | u32 idxaddr; | ||
| 200 | u32 idxdata; | ||
| 201 | u32 fifoctl; | ||
| 202 | #define PCI_BASE2_RANGE 16 | ||
| 203 | #define IGNORE_FIFO_AVAILABILITY 3 | ||
| 204 | #define PCI_BASE2_SELECT 2 | ||
| 205 | #define FIFO_CONFIGURATION_SELECT 0 | ||
| 206 | u32 _unused2; | ||
| 207 | // offset 0x0040 | ||
| 208 | u32 memaddr; | ||
| 209 | #define START 28 | ||
| 210 | #define DIRECTION 27 | ||
| 211 | #define FIFO_DIAGNOSTIC_SELECT 24 | ||
| 212 | #define MEMORY_ADDRESS 0 | ||
| 213 | u32 memdata0; | ||
| 214 | u32 memdata1; | ||
| 215 | u32 _unused3; | ||
| 216 | // offset 0x0050 | ||
| 217 | u32 gpioctl; | ||
| 218 | #define GPIO3_LED_SELECT 12 | ||
| 219 | #define GPIO3_INTERRUPT_ENABLE 11 | ||
| 220 | #define GPIO2_INTERRUPT_ENABLE 10 | ||
| 221 | #define GPIO1_INTERRUPT_ENABLE 9 | ||
| 222 | #define GPIO0_INTERRUPT_ENABLE 8 | ||
| 223 | #define GPIO3_OUTPUT_ENABLE 7 | ||
| 224 | #define GPIO2_OUTPUT_ENABLE 6 | ||
| 225 | #define GPIO1_OUTPUT_ENABLE 5 | ||
| 226 | #define GPIO0_OUTPUT_ENABLE 4 | ||
| 227 | #define GPIO3_DATA 3 | ||
| 228 | #define GPIO2_DATA 2 | ||
| 229 | #define GPIO1_DATA 1 | ||
| 230 | #define GPIO0_DATA 0 | ||
| 231 | u32 gpiostat; | ||
| 232 | #define GPIO3_INTERRUPT 3 | ||
| 233 | #define GPIO2_INTERRUPT 2 | ||
| 234 | #define GPIO1_INTERRUPT 1 | ||
| 235 | #define GPIO0_INTERRUPT 0 | ||
| 236 | } __attribute__ ((packed)); | ||
| 237 | |||
| 238 | /* usb control, BAR0 + 0x0080 */ | ||
| 239 | struct net2280_usb_regs { | ||
| 240 | // offset 0x0080 | ||
| 241 | u32 stdrsp; | ||
| 242 | #define STALL_UNSUPPORTED_REQUESTS 31 | ||
| 243 | #define SET_TEST_MODE 16 | ||
| 244 | #define GET_OTHER_SPEED_CONFIGURATION 15 | ||
| 245 | #define GET_DEVICE_QUALIFIER 14 | ||
| 246 | #define SET_ADDRESS 13 | ||
| 247 | #define ENDPOINT_SET_CLEAR_HALT 12 | ||
| 248 | #define DEVICE_SET_CLEAR_DEVICE_REMOTE_WAKEUP 11 | ||
| 249 | #define GET_STRING_DESCRIPTOR_2 10 | ||
| 250 | #define GET_STRING_DESCRIPTOR_1 9 | ||
| 251 | #define GET_STRING_DESCRIPTOR_0 8 | ||
| 252 | #define GET_SET_INTERFACE 6 | ||
| 253 | #define GET_SET_CONFIGURATION 5 | ||
| 254 | #define GET_CONFIGURATION_DESCRIPTOR 4 | ||
| 255 | #define GET_DEVICE_DESCRIPTOR 3 | ||
| 256 | #define GET_ENDPOINT_STATUS 2 | ||
| 257 | #define GET_INTERFACE_STATUS 1 | ||
| 258 | #define GET_DEVICE_STATUS 0 | ||
| 259 | u32 prodvendid; | ||
| 260 | #define PRODUCT_ID 16 | ||
| 261 | #define VENDOR_ID 0 | ||
| 262 | u32 relnum; | ||
| 263 | u32 usbctl; | ||
| 264 | #define SERIAL_NUMBER_INDEX 16 | ||
| 265 | #define PRODUCT_ID_STRING_ENABLE 13 | ||
| 266 | #define VENDOR_ID_STRING_ENABLE 12 | ||
| 267 | #define USB_ROOT_PORT_WAKEUP_ENABLE 11 | ||
| 268 | #define VBUS_PIN 10 | ||
| 269 | #define TIMED_DISCONNECT 9 | ||
| 270 | #define SUSPEND_IMMEDIATELY 7 | ||
| 271 | #define SELF_POWERED_USB_DEVICE 6 | ||
| 272 | #define REMOTE_WAKEUP_SUPPORT 5 | ||
| 273 | #define PME_POLARITY 4 | ||
| 274 | #define USB_DETECT_ENABLE 3 | ||
| 275 | #define PME_WAKEUP_ENABLE 2 | ||
| 276 | #define DEVICE_REMOTE_WAKEUP_ENABLE 1 | ||
| 277 | #define SELF_POWERED_STATUS 0 | ||
| 278 | // offset 0x0090 | ||
| 279 | u32 usbstat; | ||
| 280 | #define HIGH_SPEED 7 | ||
| 281 | #define FULL_SPEED 6 | ||
| 282 | #define GENERATE_RESUME 5 | ||
| 283 | #define GENERATE_DEVICE_REMOTE_WAKEUP 4 | ||
| 284 | u32 xcvrdiag; | ||
| 285 | #define FORCE_HIGH_SPEED_MODE 31 | ||
| 286 | #define FORCE_FULL_SPEED_MODE 30 | ||
| 287 | #define USB_TEST_MODE 24 | ||
| 288 | #define LINE_STATE 16 | ||
| 289 | #define TRANSCEIVER_OPERATION_MODE 2 | ||
| 290 | #define TRANSCEIVER_SELECT 1 | ||
| 291 | #define TERMINATION_SELECT 0 | ||
| 292 | u32 setup0123; | ||
| 293 | u32 setup4567; | ||
| 294 | // offset 0x0090 | ||
| 295 | u32 _unused0; | ||
| 296 | u32 ouraddr; | ||
| 297 | #define FORCE_IMMEDIATE 7 | ||
| 298 | #define OUR_USB_ADDRESS 0 | ||
| 299 | u32 ourconfig; | ||
| 300 | } __attribute__ ((packed)); | ||
| 301 | |||
| 302 | /* pci control, BAR0 + 0x0100 */ | ||
| 303 | struct net2280_pci_regs { | ||
| 304 | // offset 0x0100 | ||
| 305 | u32 pcimstctl; | ||
| 306 | #define PCI_ARBITER_PARK_SELECT 13 | ||
| 307 | #define PCI_MULTI LEVEL_ARBITER 12 | ||
| 308 | #define PCI_RETRY_ABORT_ENABLE 11 | ||
| 309 | #define DMA_MEMORY_WRITE_AND_INVALIDATE_ENABLE 10 | ||
| 310 | #define DMA_READ_MULTIPLE_ENABLE 9 | ||
| 311 | #define DMA_READ_LINE_ENABLE 8 | ||
| 312 | #define PCI_MASTER_COMMAND_SELECT 6 | ||
| 313 | #define MEM_READ_OR_WRITE 0 | ||
| 314 | #define IO_READ_OR_WRITE 1 | ||
| 315 | #define CFG_READ_OR_WRITE 2 | ||
| 316 | #define PCI_MASTER_START 5 | ||
| 317 | #define PCI_MASTER_READ_WRITE 4 | ||
| 318 | #define PCI_MASTER_WRITE 0 | ||
| 319 | #define PCI_MASTER_READ 1 | ||
| 320 | #define PCI_MASTER_BYTE_WRITE_ENABLES 0 | ||
| 321 | u32 pcimstaddr; | ||
| 322 | u32 pcimstdata; | ||
| 323 | u32 pcimststat; | ||
| 324 | #define PCI_ARBITER_CLEAR 2 | ||
| 325 | #define PCI_EXTERNAL_ARBITER 1 | ||
| 326 | #define PCI_HOST_MODE 0 | ||
| 327 | } __attribute__ ((packed)); | ||
| 328 | |||
| 329 | /* dma control, BAR0 + 0x0180 ... array of four structs like this, | ||
| 330 | * for channels 0..3. see also struct net2280_dma: descriptor | ||
| 331 | * that can be loaded into some of these registers. | ||
| 332 | */ | ||
| 333 | struct net2280_dma_regs { /* [11.7] */ | ||
| 334 | // offset 0x0180, 0x01a0, 0x01c0, 0x01e0, | ||
| 335 | u32 dmactl; | ||
| 336 | #define DMA_SCATTER_GATHER_DONE_INTERRUPT_ENABLE 25 | ||
| 337 | #define DMA_CLEAR_COUNT_ENABLE 21 | ||
| 338 | #define DESCRIPTOR_POLLING_RATE 19 | ||
| 339 | #define POLL_CONTINUOUS 0 | ||
| 340 | #define POLL_1_USEC 1 | ||
| 341 | #define POLL_100_USEC 2 | ||
| 342 | #define POLL_1_MSEC 3 | ||
| 343 | #define DMA_VALID_BIT_POLLING_ENABLE 18 | ||
| 344 | #define DMA_VALID_BIT_ENABLE 17 | ||
| 345 | #define DMA_SCATTER_GATHER_ENABLE 16 | ||
| 346 | #define DMA_OUT_AUTO_START_ENABLE 4 | ||
| 347 | #define DMA_PREEMPT_ENABLE 3 | ||
| 348 | #define DMA_FIFO_VALIDATE 2 | ||
| 349 | #define DMA_ENABLE 1 | ||
| 350 | #define DMA_ADDRESS_HOLD 0 | ||
| 351 | u32 dmastat; | ||
| 352 | #define DMA_ABORT_DONE_INTERRUPT 27 | ||
| 353 | #define DMA_SCATTER_GATHER_DONE_INTERRUPT 25 | ||
| 354 | #define DMA_TRANSACTION_DONE_INTERRUPT 24 | ||
| 355 | #define DMA_ABORT 1 | ||
| 356 | #define DMA_START 0 | ||
| 357 | u32 _unused0 [2]; | ||
| 358 | // offset 0x0190, 0x01b0, 0x01d0, 0x01f0, | ||
| 359 | u32 dmacount; | ||
| 360 | #define VALID_BIT 31 | ||
| 361 | #define DMA_DIRECTION 30 | ||
| 362 | #define DMA_DONE_INTERRUPT_ENABLE 29 | ||
| 363 | #define END_OF_CHAIN 28 | ||
| 364 | #define DMA_BYTE_COUNT_MASK ((1<<24)-1) | ||
| 365 | #define DMA_BYTE_COUNT 0 | ||
| 366 | u32 dmaaddr; | ||
| 367 | u32 dmadesc; | ||
| 368 | u32 _unused1; | ||
| 369 | } __attribute__ ((packed)); | ||
| 370 | |||
| 371 | /* dedicated endpoint registers, BAR0 + 0x0200 */ | ||
| 372 | |||
| 373 | struct net2280_dep_regs { /* [11.8] */ | ||
| 374 | // offset 0x0200, 0x0210, 0x220, 0x230, 0x240 | ||
| 375 | u32 dep_cfg; | ||
| 376 | // offset 0x0204, 0x0214, 0x224, 0x234, 0x244 | ||
| 377 | u32 dep_rsp; | ||
| 378 | u32 _unused [2]; | ||
| 379 | } __attribute__ ((packed)); | ||
| 380 | |||
| 381 | /* configurable endpoint registers, BAR0 + 0x0300 ... array of seven structs | ||
| 382 | * like this, for ep0 then the configurable endpoints A..F | ||
| 383 | * ep0 reserved for control; E and F have only 64 bytes of fifo | ||
| 384 | */ | ||
| 385 | struct net2280_ep_regs { /* [11.9] */ | ||
| 386 | // offset 0x0300, 0x0320, 0x0340, 0x0360, 0x0380, 0x03a0, 0x03c0 | ||
| 387 | u32 ep_cfg; | ||
| 388 | #define ENDPOINT_BYTE_COUNT 16 | ||
| 389 | #define ENDPOINT_ENABLE 10 | ||
| 390 | #define ENDPOINT_TYPE 8 | ||
| 391 | #define ENDPOINT_DIRECTION 7 | ||
| 392 | #define ENDPOINT_NUMBER 0 | ||
| 393 | u32 ep_rsp; | ||
| 394 | #define SET_NAK_OUT_PACKETS 15 | ||
| 395 | #define SET_EP_HIDE_STATUS_PHASE 14 | ||
| 396 | #define SET_EP_FORCE_CRC_ERROR 13 | ||
| 397 | #define SET_INTERRUPT_MODE 12 | ||
| 398 | #define SET_CONTROL_STATUS_PHASE_HANDSHAKE 11 | ||
| 399 | #define SET_NAK_OUT_PACKETS_MODE 10 | ||
| 400 | #define SET_ENDPOINT_TOGGLE 9 | ||
| 401 | #define SET_ENDPOINT_HALT 8 | ||
| 402 | #define CLEAR_NAK_OUT_PACKETS 7 | ||
| 403 | #define CLEAR_EP_HIDE_STATUS_PHASE 6 | ||
| 404 | #define CLEAR_EP_FORCE_CRC_ERROR 5 | ||
| 405 | #define CLEAR_INTERRUPT_MODE 4 | ||
| 406 | #define CLEAR_CONTROL_STATUS_PHASE_HANDSHAKE 3 | ||
| 407 | #define CLEAR_NAK_OUT_PACKETS_MODE 2 | ||
| 408 | #define CLEAR_ENDPOINT_TOGGLE 1 | ||
| 409 | #define CLEAR_ENDPOINT_HALT 0 | ||
| 410 | u32 ep_irqenb; | ||
| 411 | #define SHORT_PACKET_OUT_DONE_INTERRUPT_ENABLE 6 | ||
| 412 | #define SHORT_PACKET_TRANSFERRED_INTERRUPT_ENABLE 5 | ||
| 413 | #define DATA_PACKET_RECEIVED_INTERRUPT_ENABLE 3 | ||
| 414 | #define DATA_PACKET_TRANSMITTED_INTERRUPT_ENABLE 2 | ||
| 415 | #define DATA_OUT_PING_TOKEN_INTERRUPT_ENABLE 1 | ||
| 416 | #define DATA_IN_TOKEN_INTERRUPT_ENABLE 0 | ||
| 417 | u32 ep_stat; | ||
| 418 | #define FIFO_VALID_COUNT 24 | ||
| 419 | #define HIGH_BANDWIDTH_OUT_TRANSACTION_PID 22 | ||
| 420 | #define TIMEOUT 21 | ||
| 421 | #define USB_STALL_SENT 20 | ||
| 422 | #define USB_IN_NAK_SENT 19 | ||
| 423 | #define USB_IN_ACK_RCVD 18 | ||
| 424 | #define USB_OUT_PING_NAK_SENT 17 | ||
| 425 | #define USB_OUT_ACK_SENT 16 | ||
| 426 | #define FIFO_OVERFLOW 13 | ||
| 427 | #define FIFO_UNDERFLOW 12 | ||
| 428 | #define FIFO_FULL 11 | ||
| 429 | #define FIFO_EMPTY 10 | ||
| 430 | #define FIFO_FLUSH 9 | ||
| 431 | #define SHORT_PACKET_OUT_DONE_INTERRUPT 6 | ||
| 432 | #define SHORT_PACKET_TRANSFERRED_INTERRUPT 5 | ||
| 433 | #define NAK_OUT_PACKETS 4 | ||
| 434 | #define DATA_PACKET_RECEIVED_INTERRUPT 3 | ||
| 435 | #define DATA_PACKET_TRANSMITTED_INTERRUPT 2 | ||
| 436 | #define DATA_OUT_PING_TOKEN_INTERRUPT 1 | ||
| 437 | #define DATA_IN_TOKEN_INTERRUPT 0 | ||
| 438 | // offset 0x0310, 0x0330, 0x0350, 0x0370, 0x0390, 0x03b0, 0x03d0 | ||
| 439 | u32 ep_avail; | ||
| 440 | u32 ep_data; | ||
| 441 | u32 _unused0 [2]; | ||
| 442 | } __attribute__ ((packed)); | ||
| 443 | |||
| 444 | #endif /* __LINUX_USB_NET2280_H */ | ||
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index d7670ec1ec..ad7fa9c86c 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h | |||
| @@ -1141,8 +1141,13 @@ extern char *v4l2_type_names[]; | |||
| 1141 | /* Compatibility layer interface -- v4l1-compat module */ | 1141 | /* Compatibility layer interface -- v4l1-compat module */ |
| 1142 | typedef int (*v4l2_kioctl)(struct inode *inode, struct file *file, | 1142 | typedef int (*v4l2_kioctl)(struct inode *inode, struct file *file, |
| 1143 | unsigned int cmd, void *arg); | 1143 | unsigned int cmd, void *arg); |
| 1144 | |||
| 1145 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
| 1144 | int v4l_compat_translate_ioctl(struct inode *inode, struct file *file, | 1146 | int v4l_compat_translate_ioctl(struct inode *inode, struct file *file, |
| 1145 | int cmd, void *arg, v4l2_kioctl driver_ioctl); | 1147 | int cmd, void *arg, v4l2_kioctl driver_ioctl); |
| 1148 | #else | ||
| 1149 | #define v4l_compat_translate_ioctl(inode,file,cmd,arg,ioctl) -EINVAL | ||
| 1150 | #endif | ||
| 1146 | 1151 | ||
| 1147 | /* 32 Bits compatibility layer for 64 bits processors */ | 1152 | /* 32 Bits compatibility layer for 64 bits processors */ |
| 1148 | extern long v4l_compat_ioctl32(struct file *file, unsigned int cmd, | 1153 | extern long v4l_compat_ioctl32(struct file *file, unsigned int cmd, |
diff --git a/include/linux/vt_kern.h b/include/linux/vt_kern.h index 530ae3f424..fab5aed8ca 100644 --- a/include/linux/vt_kern.h +++ b/include/linux/vt_kern.h | |||
| @@ -73,11 +73,6 @@ int con_copy_unimap(struct vc_data *dst_vc, struct vc_data *src_vc); | |||
| 73 | int vt_waitactive(int vt); | 73 | int vt_waitactive(int vt); |
| 74 | void change_console(struct vc_data *new_vc); | 74 | void change_console(struct vc_data *new_vc); |
| 75 | void reset_vc(struct vc_data *vc); | 75 | void reset_vc(struct vc_data *vc); |
| 76 | #ifdef CONFIG_VT | ||
| 77 | int is_console_suspend_safe(void); | ||
| 78 | #else | ||
| 79 | static inline int is_console_suspend_safe(void) { return 1; } | ||
| 80 | #endif | ||
| 81 | 76 | ||
| 82 | /* | 77 | /* |
| 83 | * vc_screen.c shares this temporary buffer with the console write code so that | 78 | * vc_screen.c shares this temporary buffer with the console write code so that |
diff --git a/include/net/arp.h b/include/net/arp.h index a13e30c35f..643bded9f5 100644 --- a/include/net/arp.h +++ b/include/net/arp.h | |||
| @@ -10,8 +10,6 @@ | |||
| 10 | extern struct neigh_table arp_tbl; | 10 | extern struct neigh_table arp_tbl; |
| 11 | 11 | ||
| 12 | extern void arp_init(void); | 12 | extern void arp_init(void); |
| 13 | extern int arp_rcv(struct sk_buff *skb, struct net_device *dev, | ||
| 14 | struct packet_type *pt, struct net_device *orig_dev); | ||
| 15 | extern int arp_find(unsigned char *haddr, struct sk_buff *skb); | 13 | extern int arp_find(unsigned char *haddr, struct sk_buff *skb); |
| 16 | extern int arp_ioctl(unsigned int cmd, void __user *arg); | 14 | extern int arp_ioctl(unsigned int cmd, void __user *arg); |
| 17 | extern void arp_send(int type, int ptype, u32 dest_ip, | 15 | extern void arp_send(int type, int ptype, u32 dest_ip, |
diff --git a/include/net/ax25.h b/include/net/ax25.h index d052b221db..5bd9974870 100644 --- a/include/net/ax25.h +++ b/include/net/ax25.h | |||
| @@ -145,14 +145,14 @@ enum { | |||
| 145 | #define AX25_DEF_CONMODE 2 /* Connected mode allowed */ | 145 | #define AX25_DEF_CONMODE 2 /* Connected mode allowed */ |
| 146 | #define AX25_DEF_WINDOW 2 /* Window=2 */ | 146 | #define AX25_DEF_WINDOW 2 /* Window=2 */ |
| 147 | #define AX25_DEF_EWINDOW 32 /* Module-128 Window=32 */ | 147 | #define AX25_DEF_EWINDOW 32 /* Module-128 Window=32 */ |
| 148 | #define AX25_DEF_T1 (10 * HZ) /* T1=10s */ | 148 | #define AX25_DEF_T1 10000 /* T1=10s */ |
| 149 | #define AX25_DEF_T2 (3 * HZ) /* T2=3s */ | 149 | #define AX25_DEF_T2 3000 /* T2=3s */ |
| 150 | #define AX25_DEF_T3 (300 * HZ) /* T3=300s */ | 150 | #define AX25_DEF_T3 300000 /* T3=300s */ |
| 151 | #define AX25_DEF_N2 10 /* N2=10 */ | 151 | #define AX25_DEF_N2 10 /* N2=10 */ |
| 152 | #define AX25_DEF_IDLE (0 * 60 * HZ) /* Idle=None */ | 152 | #define AX25_DEF_IDLE 0 /* Idle=None */ |
| 153 | #define AX25_DEF_PACLEN 256 /* Paclen=256 */ | 153 | #define AX25_DEF_PACLEN 256 /* Paclen=256 */ |
| 154 | #define AX25_DEF_PROTOCOL AX25_PROTO_STD_SIMPLEX /* Standard AX.25 */ | 154 | #define AX25_DEF_PROTOCOL AX25_PROTO_STD_SIMPLEX /* Standard AX.25 */ |
| 155 | #define AX25_DEF_DS_TIMEOUT (3 * 60 * HZ) /* DAMA timeout 3 minutes */ | 155 | #define AX25_DEF_DS_TIMEOUT 180000 /* DAMA timeout 3 minutes */ |
| 156 | 156 | ||
| 157 | typedef struct ax25_uid_assoc { | 157 | typedef struct ax25_uid_assoc { |
| 158 | struct hlist_node uid_node; | 158 | struct hlist_node uid_node; |
diff --git a/include/net/compat.h b/include/net/compat.h index 8662b8f43d..e65cbedb6a 100644 --- a/include/net/compat.h +++ b/include/net/compat.h | |||
| @@ -3,6 +3,8 @@ | |||
| 3 | 3 | ||
| 4 | #include <linux/config.h> | 4 | #include <linux/config.h> |
| 5 | 5 | ||
| 6 | struct sock; | ||
| 7 | |||
| 6 | #if defined(CONFIG_COMPAT) | 8 | #if defined(CONFIG_COMPAT) |
| 7 | 9 | ||
| 8 | #include <linux/compat.h> | 10 | #include <linux/compat.h> |
| @@ -23,7 +25,6 @@ struct compat_cmsghdr { | |||
| 23 | compat_int_t cmsg_type; | 25 | compat_int_t cmsg_type; |
| 24 | }; | 26 | }; |
| 25 | 27 | ||
| 26 | struct sock; | ||
| 27 | extern int compat_sock_get_timestamp(struct sock *, struct timeval __user *); | 28 | extern int compat_sock_get_timestamp(struct sock *, struct timeval __user *); |
| 28 | 29 | ||
| 29 | #else /* defined(CONFIG_COMPAT) */ | 30 | #else /* defined(CONFIG_COMPAT) */ |
diff --git a/include/net/ieee80211.h b/include/net/ieee80211.h index 4725ff861c..d5926bfb1f 100644 --- a/include/net/ieee80211.h +++ b/include/net/ieee80211.h | |||
| @@ -955,11 +955,13 @@ enum ieee80211_state { | |||
| 955 | 955 | ||
| 956 | #define IEEE80211_24GHZ_MIN_CHANNEL 1 | 956 | #define IEEE80211_24GHZ_MIN_CHANNEL 1 |
| 957 | #define IEEE80211_24GHZ_MAX_CHANNEL 14 | 957 | #define IEEE80211_24GHZ_MAX_CHANNEL 14 |
| 958 | #define IEEE80211_24GHZ_CHANNELS 14 | 958 | #define IEEE80211_24GHZ_CHANNELS (IEEE80211_24GHZ_MAX_CHANNEL - \ |
| 959 | IEEE80211_24GHZ_MIN_CHANNEL + 1) | ||
| 959 | 960 | ||
| 960 | #define IEEE80211_52GHZ_MIN_CHANNEL 34 | 961 | #define IEEE80211_52GHZ_MIN_CHANNEL 34 |
| 961 | #define IEEE80211_52GHZ_MAX_CHANNEL 165 | 962 | #define IEEE80211_52GHZ_MAX_CHANNEL 165 |
| 962 | #define IEEE80211_52GHZ_CHANNELS 131 | 963 | #define IEEE80211_52GHZ_CHANNELS (IEEE80211_52GHZ_MAX_CHANNEL - \ |
| 964 | IEEE80211_52GHZ_MIN_CHANNEL + 1) | ||
| 963 | 965 | ||
| 964 | enum { | 966 | enum { |
| 965 | IEEE80211_CH_PASSIVE_ONLY = (1 << 0), | 967 | IEEE80211_CH_PASSIVE_ONLY = (1 << 0), |
diff --git a/include/net/ieee80211softmac.h b/include/net/ieee80211softmac.h index b971d8c82b..052ed596a4 100644 --- a/include/net/ieee80211softmac.h +++ b/include/net/ieee80211softmac.h | |||
| @@ -96,10 +96,13 @@ struct ieee80211softmac_assoc_info { | |||
| 96 | * | 96 | * |
| 97 | * bssvalid is true if we found a matching network | 97 | * bssvalid is true if we found a matching network |
| 98 | * and saved it's BSSID into the bssid above. | 98 | * and saved it's BSSID into the bssid above. |
| 99 | * | ||
| 100 | * bssfixed is used for SIOCSIWAP. | ||
| 99 | */ | 101 | */ |
| 100 | u8 static_essid:1, | 102 | u8 static_essid:1, |
| 101 | associating:1, | 103 | associating:1, |
| 102 | bssvalid:1; | 104 | bssvalid:1, |
| 105 | bssfixed:1; | ||
| 103 | 106 | ||
| 104 | /* Scan retries remaining */ | 107 | /* Scan retries remaining */ |
| 105 | int scan_retry; | 108 | int scan_retry; |
| @@ -201,7 +204,8 @@ struct ieee80211softmac_device { | |||
| 201 | 204 | ||
| 202 | /* couple of flags */ | 205 | /* couple of flags */ |
| 203 | u8 scanning:1, /* protects scanning from being done multiple times at once */ | 206 | u8 scanning:1, /* protects scanning from being done multiple times at once */ |
| 204 | associated:1; | 207 | associated:1, |
| 208 | running:1; | ||
| 205 | 209 | ||
| 206 | struct ieee80211softmac_scaninfo *scaninfo; | 210 | struct ieee80211softmac_scaninfo *scaninfo; |
| 207 | struct ieee80211softmac_assoc_info associnfo; | 211 | struct ieee80211softmac_assoc_info associnfo; |
| @@ -267,8 +271,9 @@ extern void ieee80211softmac_stop(struct net_device *dev); | |||
| 267 | #define IEEE80211SOFTMAC_EVENT_AUTH_FAILED 5 | 271 | #define IEEE80211SOFTMAC_EVENT_AUTH_FAILED 5 |
| 268 | #define IEEE80211SOFTMAC_EVENT_AUTH_TIMEOUT 6 | 272 | #define IEEE80211SOFTMAC_EVENT_AUTH_TIMEOUT 6 |
| 269 | #define IEEE80211SOFTMAC_EVENT_ASSOCIATE_NET_NOT_FOUND 7 | 273 | #define IEEE80211SOFTMAC_EVENT_ASSOCIATE_NET_NOT_FOUND 7 |
| 274 | #define IEEE80211SOFTMAC_EVENT_DISASSOCIATED 8 | ||
| 270 | /* keep this updated! */ | 275 | /* keep this updated! */ |
| 271 | #define IEEE80211SOFTMAC_EVENT_LAST 7 | 276 | #define IEEE80211SOFTMAC_EVENT_LAST 8 |
| 272 | /* | 277 | /* |
| 273 | * If you want to be notified of certain events, you can call | 278 | * If you want to be notified of certain events, you can call |
| 274 | * ieee80211softmac_notify[_atomic] with | 279 | * ieee80211softmac_notify[_atomic] with |
diff --git a/include/net/inet_timewait_sock.h b/include/net/inet_timewait_sock.h index 1da294c475..e837f98fdb 100644 --- a/include/net/inet_timewait_sock.h +++ b/include/net/inet_timewait_sock.h | |||
| @@ -150,7 +150,7 @@ static inline void inet_twsk_add_bind_node(struct inet_timewait_sock *tw, | |||
| 150 | 150 | ||
| 151 | static inline int inet_twsk_dead_hashed(const struct inet_timewait_sock *tw) | 151 | static inline int inet_twsk_dead_hashed(const struct inet_timewait_sock *tw) |
| 152 | { | 152 | { |
| 153 | return tw->tw_death_node.pprev != NULL; | 153 | return !hlist_unhashed(&tw->tw_death_node); |
| 154 | } | 154 | } |
| 155 | 155 | ||
| 156 | static inline void inet_twsk_dead_node_init(struct inet_timewait_sock *tw) | 156 | static inline void inet_twsk_dead_node_init(struct inet_timewait_sock *tw) |
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 6d6f0634ae..4abedb8eae 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h | |||
| @@ -230,7 +230,7 @@ extern int ip6_ra_control(struct sock *sk, int sel, | |||
| 230 | void (*destructor)(struct sock *)); | 230 | void (*destructor)(struct sock *)); |
| 231 | 231 | ||
| 232 | 232 | ||
| 233 | extern int ipv6_parse_hopopts(struct sk_buff *skb, int); | 233 | extern int ipv6_parse_hopopts(struct sk_buff *skb); |
| 234 | 234 | ||
| 235 | extern struct ipv6_txoptions * ipv6_dup_options(struct sock *sk, struct ipv6_txoptions *opt); | 235 | extern struct ipv6_txoptions * ipv6_dup_options(struct sock *sk, struct ipv6_txoptions *opt); |
| 236 | extern struct ipv6_txoptions * ipv6_renew_options(struct sock *sk, struct ipv6_txoptions *opt, | 236 | extern struct ipv6_txoptions * ipv6_renew_options(struct sock *sk, struct ipv6_txoptions *opt, |
diff --git a/include/net/irda/irlmp.h b/include/net/irda/irlmp.h index 86aefb1fda..c0c895d379 100644 --- a/include/net/irda/irlmp.h +++ b/include/net/irda/irlmp.h | |||
| @@ -112,7 +112,7 @@ struct lsap_cb { | |||
| 112 | 112 | ||
| 113 | struct timer_list watchdog_timer; | 113 | struct timer_list watchdog_timer; |
| 114 | 114 | ||
| 115 | IRLMP_STATE lsap_state; /* Connection state */ | 115 | LSAP_STATE lsap_state; /* Connection state */ |
| 116 | notify_t notify; /* Indication/Confirm entry points */ | 116 | notify_t notify; /* Indication/Confirm entry points */ |
| 117 | struct qos_info qos; /* QoS for this connection */ | 117 | struct qos_info qos; /* QoS for this connection */ |
| 118 | 118 | ||
diff --git a/include/net/neighbour.h b/include/net/neighbour.h index b0666d6629..4901ee4468 100644 --- a/include/net/neighbour.h +++ b/include/net/neighbour.h | |||
| @@ -211,6 +211,7 @@ struct neigh_table | |||
| 211 | #define NEIGH_UPDATE_F_ADMIN 0x80000000 | 211 | #define NEIGH_UPDATE_F_ADMIN 0x80000000 |
| 212 | 212 | ||
| 213 | extern void neigh_table_init(struct neigh_table *tbl); | 213 | extern void neigh_table_init(struct neigh_table *tbl); |
| 214 | extern void neigh_table_init_no_netlink(struct neigh_table *tbl); | ||
| 214 | extern int neigh_table_clear(struct neigh_table *tbl); | 215 | extern int neigh_table_clear(struct neigh_table *tbl); |
| 215 | extern struct neighbour * neigh_lookup(struct neigh_table *tbl, | 216 | extern struct neighbour * neigh_lookup(struct neigh_table *tbl, |
| 216 | const void *pkey, | 217 | const void *pkey, |
diff --git a/include/net/netrom.h b/include/net/netrom.h index a5ee53bce6..e0ca112024 100644 --- a/include/net/netrom.h +++ b/include/net/netrom.h | |||
| @@ -42,11 +42,11 @@ enum { | |||
| 42 | #define NR_COND_PEER_RX_BUSY 0x04 | 42 | #define NR_COND_PEER_RX_BUSY 0x04 |
| 43 | #define NR_COND_OWN_RX_BUSY 0x08 | 43 | #define NR_COND_OWN_RX_BUSY 0x08 |
| 44 | 44 | ||
| 45 | #define NR_DEFAULT_T1 (120 * HZ) /* Outstanding frames - 120 seconds */ | 45 | #define NR_DEFAULT_T1 120000 /* Outstanding frames - 120 seconds */ |
| 46 | #define NR_DEFAULT_T2 (5 * HZ) /* Response delay - 5 seconds */ | 46 | #define NR_DEFAULT_T2 5000 /* Response delay - 5 seconds */ |
| 47 | #define NR_DEFAULT_N2 3 /* Number of Retries - 3 */ | 47 | #define NR_DEFAULT_N2 3 /* Number of Retries - 3 */ |
| 48 | #define NR_DEFAULT_T4 (180 * HZ) /* Busy Delay - 180 seconds */ | 48 | #define NR_DEFAULT_T4 180000 /* Busy Delay - 180 seconds */ |
| 49 | #define NR_DEFAULT_IDLE (0 * 60 * HZ) /* No Activity Timeout - none */ | 49 | #define NR_DEFAULT_IDLE 0 /* No Activity Timeout - none */ |
| 50 | #define NR_DEFAULT_WINDOW 4 /* Default Window Size - 4 */ | 50 | #define NR_DEFAULT_WINDOW 4 /* Default Window Size - 4 */ |
| 51 | #define NR_DEFAULT_OBS 6 /* Default Obsolescence Count - 6 */ | 51 | #define NR_DEFAULT_OBS 6 /* Default Obsolescence Count - 6 */ |
| 52 | #define NR_DEFAULT_QUAL 10 /* Default Neighbour Quality - 10 */ | 52 | #define NR_DEFAULT_QUAL 10 /* Default Neighbour Quality - 10 */ |
diff --git a/include/net/rose.h b/include/net/rose.h index 3249b97960..012b09ed24 100644 --- a/include/net/rose.h +++ b/include/net/rose.h | |||
| @@ -49,14 +49,14 @@ enum { | |||
| 49 | ROSE_STATE_5 /* Deferred Call Acceptance */ | 49 | ROSE_STATE_5 /* Deferred Call Acceptance */ |
| 50 | }; | 50 | }; |
| 51 | 51 | ||
| 52 | #define ROSE_DEFAULT_T0 (180 * HZ) /* Default T10 T20 value */ | 52 | #define ROSE_DEFAULT_T0 180000 /* Default T10 T20 value */ |
| 53 | #define ROSE_DEFAULT_T1 (200 * HZ) /* Default T11 T21 value */ | 53 | #define ROSE_DEFAULT_T1 200000 /* Default T11 T21 value */ |
| 54 | #define ROSE_DEFAULT_T2 (180 * HZ) /* Default T12 T22 value */ | 54 | #define ROSE_DEFAULT_T2 180000 /* Default T12 T22 value */ |
| 55 | #define ROSE_DEFAULT_T3 (180 * HZ) /* Default T13 T23 value */ | 55 | #define ROSE_DEFAULT_T3 180000 /* Default T13 T23 value */ |
| 56 | #define ROSE_DEFAULT_HB (5 * HZ) /* Default Holdback value */ | 56 | #define ROSE_DEFAULT_HB 5000 /* Default Holdback value */ |
| 57 | #define ROSE_DEFAULT_IDLE (0 * 60 * HZ) /* No Activity Timeout - none */ | 57 | #define ROSE_DEFAULT_IDLE 0 /* No Activity Timeout - none */ |
| 58 | #define ROSE_DEFAULT_ROUTING 1 /* Default routing flag */ | 58 | #define ROSE_DEFAULT_ROUTING 1 /* Default routing flag */ |
| 59 | #define ROSE_DEFAULT_FAIL_TIMEOUT (120 * HZ) /* Time until link considered usable */ | 59 | #define ROSE_DEFAULT_FAIL_TIMEOUT 120000 /* Time until link considered usable */ |
| 60 | #define ROSE_DEFAULT_MAXVC 50 /* Maximum number of VCs per neighbour */ | 60 | #define ROSE_DEFAULT_MAXVC 50 /* Maximum number of VCs per neighbour */ |
| 61 | #define ROSE_DEFAULT_WINDOW_SIZE 7 /* Default window size */ | 61 | #define ROSE_DEFAULT_WINDOW_SIZE 7 /* Default window size */ |
| 62 | 62 | ||
diff --git a/include/net/sctp/command.h b/include/net/sctp/command.h index 34a1a09e5a..807d6f1ef4 100644 --- a/include/net/sctp/command.h +++ b/include/net/sctp/command.h | |||
| @@ -99,6 +99,7 @@ typedef enum { | |||
| 99 | SCTP_CMD_DEL_NON_PRIMARY, /* Removes non-primary peer transports. */ | 99 | SCTP_CMD_DEL_NON_PRIMARY, /* Removes non-primary peer transports. */ |
| 100 | SCTP_CMD_T3_RTX_TIMERS_STOP, /* Stops T3-rtx pending timers */ | 100 | SCTP_CMD_T3_RTX_TIMERS_STOP, /* Stops T3-rtx pending timers */ |
| 101 | SCTP_CMD_FORCE_PRIM_RETRAN, /* Forces retrans. over primary path. */ | 101 | SCTP_CMD_FORCE_PRIM_RETRAN, /* Forces retrans. over primary path. */ |
| 102 | SCTP_CMD_SET_SK_ERR, /* Set sk_err */ | ||
| 102 | SCTP_CMD_LAST | 103 | SCTP_CMD_LAST |
| 103 | } sctp_verb_t; | 104 | } sctp_verb_t; |
| 104 | 105 | ||
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h index e673b2c984..aa6033ca7c 100644 --- a/include/net/sctp/sctp.h +++ b/include/net/sctp/sctp.h | |||
| @@ -461,12 +461,12 @@ static inline int sctp_frag_point(const struct sctp_sock *sp, int pmtu) | |||
| 461 | * there is room for a param header too. | 461 | * there is room for a param header too. |
| 462 | */ | 462 | */ |
| 463 | #define sctp_walk_params(pos, chunk, member)\ | 463 | #define sctp_walk_params(pos, chunk, member)\ |
| 464 | _sctp_walk_params((pos), (chunk), WORD_ROUND(ntohs((chunk)->chunk_hdr.length)), member) | 464 | _sctp_walk_params((pos), (chunk), ntohs((chunk)->chunk_hdr.length), member) |
| 465 | 465 | ||
| 466 | #define _sctp_walk_params(pos, chunk, end, member)\ | 466 | #define _sctp_walk_params(pos, chunk, end, member)\ |
| 467 | for (pos.v = chunk->member;\ | 467 | for (pos.v = chunk->member;\ |
| 468 | pos.v <= (void *)chunk + end - sizeof(sctp_paramhdr_t) &&\ | 468 | pos.v <= (void *)chunk + end - sizeof(sctp_paramhdr_t) &&\ |
| 469 | pos.v <= (void *)chunk + end - WORD_ROUND(ntohs(pos.p->length)) &&\ | 469 | pos.v <= (void *)chunk + end - ntohs(pos.p->length) &&\ |
| 470 | ntohs(pos.p->length) >= sizeof(sctp_paramhdr_t);\ | 470 | ntohs(pos.p->length) >= sizeof(sctp_paramhdr_t);\ |
| 471 | pos.v += WORD_ROUND(ntohs(pos.p->length))) | 471 | pos.v += WORD_ROUND(ntohs(pos.p->length))) |
| 472 | 472 | ||
| @@ -477,7 +477,7 @@ _sctp_walk_errors((err), (chunk_hdr), ntohs((chunk_hdr)->length)) | |||
| 477 | for (err = (sctp_errhdr_t *)((void *)chunk_hdr + \ | 477 | for (err = (sctp_errhdr_t *)((void *)chunk_hdr + \ |
| 478 | sizeof(sctp_chunkhdr_t));\ | 478 | sizeof(sctp_chunkhdr_t));\ |
| 479 | (void *)err <= (void *)chunk_hdr + end - sizeof(sctp_errhdr_t) &&\ | 479 | (void *)err <= (void *)chunk_hdr + end - sizeof(sctp_errhdr_t) &&\ |
| 480 | (void *)err <= (void *)chunk_hdr + end - WORD_ROUND(ntohs(err->length)) &&\ | 480 | (void *)err <= (void *)chunk_hdr + end - ntohs(err->length) &&\ |
| 481 | ntohs(err->length) >= sizeof(sctp_errhdr_t); \ | 481 | ntohs(err->length) >= sizeof(sctp_errhdr_t); \ |
| 482 | err = (sctp_errhdr_t *)((void *)err + WORD_ROUND(ntohs(err->length)))) | 482 | err = (sctp_errhdr_t *)((void *)err + WORD_ROUND(ntohs(err->length)))) |
| 483 | 483 | ||
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index eba99f3755..7f4fea173f 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h | |||
| @@ -712,6 +712,7 @@ struct sctp_chunk { | |||
| 712 | __u8 tsn_gap_acked; /* Is this chunk acked by a GAP ACK? */ | 712 | __u8 tsn_gap_acked; /* Is this chunk acked by a GAP ACK? */ |
| 713 | __s8 fast_retransmit; /* Is this chunk fast retransmitted? */ | 713 | __s8 fast_retransmit; /* Is this chunk fast retransmitted? */ |
| 714 | __u8 tsn_missing_report; /* Data chunk missing counter. */ | 714 | __u8 tsn_missing_report; /* Data chunk missing counter. */ |
| 715 | __u8 data_accepted; /* At least 1 chunk in this packet accepted */ | ||
| 715 | }; | 716 | }; |
| 716 | 717 | ||
| 717 | void sctp_chunk_hold(struct sctp_chunk *); | 718 | void sctp_chunk_hold(struct sctp_chunk *); |
diff --git a/include/net/sock.h b/include/net/sock.h index af2b054458..c9fad6fb62 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
| @@ -279,7 +279,7 @@ static inline int sk_unhashed(const struct sock *sk) | |||
| 279 | 279 | ||
| 280 | static inline int sk_hashed(const struct sock *sk) | 280 | static inline int sk_hashed(const struct sock *sk) |
| 281 | { | 281 | { |
| 282 | return sk->sk_node.pprev != NULL; | 282 | return !sk_unhashed(sk); |
| 283 | } | 283 | } |
| 284 | 284 | ||
| 285 | static __inline__ void sk_node_init(struct hlist_node *node) | 285 | static __inline__ void sk_node_init(struct hlist_node *node) |
| @@ -454,6 +454,7 @@ static inline void sk_stream_set_owner_r(struct sk_buff *skb, struct sock *sk) | |||
| 454 | 454 | ||
| 455 | static inline void sk_stream_free_skb(struct sock *sk, struct sk_buff *skb) | 455 | static inline void sk_stream_free_skb(struct sock *sk, struct sk_buff *skb) |
| 456 | { | 456 | { |
| 457 | skb_truesize_check(skb); | ||
| 457 | sock_set_flag(sk, SOCK_QUEUE_SHRUNK); | 458 | sock_set_flag(sk, SOCK_QUEUE_SHRUNK); |
| 458 | sk->sk_wmem_queued -= skb->truesize; | 459 | sk->sk_wmem_queued -= skb->truesize; |
| 459 | sk->sk_forward_alloc += skb->truesize; | 460 | sk->sk_forward_alloc += skb->truesize; |
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 0d5529c382..afa508d92c 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
| @@ -143,6 +143,11 @@ struct xfrm_state | |||
| 143 | /* Replay detection state at the time we sent the last notification */ | 143 | /* Replay detection state at the time we sent the last notification */ |
| 144 | struct xfrm_replay_state preplay; | 144 | struct xfrm_replay_state preplay; |
| 145 | 145 | ||
| 146 | /* internal flag that only holds state for delayed aevent at the | ||
| 147 | * moment | ||
| 148 | */ | ||
| 149 | u32 xflags; | ||
| 150 | |||
| 146 | /* Replay detection notification settings */ | 151 | /* Replay detection notification settings */ |
| 147 | u32 replay_maxage; | 152 | u32 replay_maxage; |
| 148 | u32 replay_maxdiff; | 153 | u32 replay_maxdiff; |
| @@ -168,6 +173,9 @@ struct xfrm_state | |||
| 168 | void *data; | 173 | void *data; |
| 169 | }; | 174 | }; |
| 170 | 175 | ||
| 176 | /* xflags - make enum if more show up */ | ||
| 177 | #define XFRM_TIME_DEFER 1 | ||
| 178 | |||
| 171 | enum { | 179 | enum { |
| 172 | XFRM_STATE_VOID, | 180 | XFRM_STATE_VOID, |
| 173 | XFRM_STATE_ACQ, | 181 | XFRM_STATE_ACQ, |
diff --git a/include/scsi/srp.h b/include/scsi/srp.h index 6c2681dc5b..637f77eccf 100644 --- a/include/scsi/srp.h +++ b/include/scsi/srp.h | |||
| @@ -95,14 +95,15 @@ struct srp_direct_buf { | |||
| 95 | 95 | ||
| 96 | /* | 96 | /* |
| 97 | * We need the packed attribute because the SRP spec puts the list of | 97 | * We need the packed attribute because the SRP spec puts the list of |
| 98 | * descriptors at an offset of 20, which is not aligned to the size | 98 | * descriptors at an offset of 20, which is not aligned to the size of |
| 99 | * of struct srp_direct_buf. | 99 | * struct srp_direct_buf. The whole structure must be packed to avoid |
| 100 | * having the 20-byte structure padded to 24 bytes on 64-bit architectures. | ||
| 100 | */ | 101 | */ |
| 101 | struct srp_indirect_buf { | 102 | struct srp_indirect_buf { |
| 102 | struct srp_direct_buf table_desc; | 103 | struct srp_direct_buf table_desc; |
| 103 | __be32 len; | 104 | __be32 len; |
| 104 | struct srp_direct_buf desc_list[0] __attribute__((packed)); | 105 | struct srp_direct_buf desc_list[0]; |
| 105 | }; | 106 | } __attribute__((packed)); |
| 106 | 107 | ||
| 107 | enum { | 108 | enum { |
| 108 | SRP_MULTICHAN_SINGLE = 0, | 109 | SRP_MULTICHAN_SINGLE = 0, |
| @@ -122,6 +123,11 @@ struct srp_login_req { | |||
| 122 | u8 target_port_id[16]; | 123 | u8 target_port_id[16]; |
| 123 | }; | 124 | }; |
| 124 | 125 | ||
| 126 | /* | ||
| 127 | * The SRP spec defines the size of the LOGIN_RSP structure to be 52 | ||
| 128 | * bytes, so it needs to be packed to avoid having it padded to 56 | ||
| 129 | * bytes on 64-bit architectures. | ||
| 130 | */ | ||
| 125 | struct srp_login_rsp { | 131 | struct srp_login_rsp { |
| 126 | u8 opcode; | 132 | u8 opcode; |
| 127 | u8 reserved1[3]; | 133 | u8 reserved1[3]; |
| @@ -132,7 +138,7 @@ struct srp_login_rsp { | |||
| 132 | __be16 buf_fmt; | 138 | __be16 buf_fmt; |
| 133 | u8 rsp_flags; | 139 | u8 rsp_flags; |
| 134 | u8 reserved2[25]; | 140 | u8 reserved2[25]; |
| 135 | }; | 141 | } __attribute__((packed)); |
| 136 | 142 | ||
| 137 | struct srp_login_rej { | 143 | struct srp_login_rej { |
| 138 | u8 opcode; | 144 | u8 opcode; |
| @@ -207,6 +213,11 @@ enum { | |||
| 207 | SRP_RSP_FLAG_DIUNDER = 1 << 5 | 213 | SRP_RSP_FLAG_DIUNDER = 1 << 5 |
| 208 | }; | 214 | }; |
| 209 | 215 | ||
| 216 | /* | ||
| 217 | * The SRP spec defines the size of the RSP structure to be 36 bytes, | ||
| 218 | * so it needs to be packed to avoid having it padded to 40 bytes on | ||
| 219 | * 64-bit architectures. | ||
| 220 | */ | ||
| 210 | struct srp_rsp { | 221 | struct srp_rsp { |
| 211 | u8 opcode; | 222 | u8 opcode; |
| 212 | u8 sol_not; | 223 | u8 sol_not; |
| @@ -221,6 +232,6 @@ struct srp_rsp { | |||
| 221 | __be32 sense_data_len; | 232 | __be32 sense_data_len; |
| 222 | __be32 resp_data_len; | 233 | __be32 resp_data_len; |
| 223 | u8 data[0]; | 234 | u8 data[0]; |
| 224 | }; | 235 | } __attribute__((packed)); |
| 225 | 236 | ||
| 226 | #endif /* SCSI_SRP_H */ | 237 | #endif /* SCSI_SRP_H */ |
diff --git a/include/sound/pcm.h b/include/sound/pcm.h index df70e7592a..373425895f 100644 --- a/include/sound/pcm.h +++ b/include/sound/pcm.h | |||
| @@ -374,12 +374,14 @@ struct snd_pcm_substream { | |||
| 374 | /* -- OSS things -- */ | 374 | /* -- OSS things -- */ |
| 375 | struct snd_pcm_oss_substream oss; | 375 | struct snd_pcm_oss_substream oss; |
| 376 | #endif | 376 | #endif |
| 377 | #ifdef CONFIG_SND_VERBOSE_PROCFS | ||
| 377 | struct snd_info_entry *proc_root; | 378 | struct snd_info_entry *proc_root; |
| 378 | struct snd_info_entry *proc_info_entry; | 379 | struct snd_info_entry *proc_info_entry; |
| 379 | struct snd_info_entry *proc_hw_params_entry; | 380 | struct snd_info_entry *proc_hw_params_entry; |
| 380 | struct snd_info_entry *proc_sw_params_entry; | 381 | struct snd_info_entry *proc_sw_params_entry; |
| 381 | struct snd_info_entry *proc_status_entry; | 382 | struct snd_info_entry *proc_status_entry; |
| 382 | struct snd_info_entry *proc_prealloc_entry; | 383 | struct snd_info_entry *proc_prealloc_entry; |
| 384 | #endif | ||
| 383 | /* misc flags */ | 385 | /* misc flags */ |
| 384 | unsigned int no_mmap_ctrl: 1; | 386 | unsigned int no_mmap_ctrl: 1; |
| 385 | unsigned int hw_opened: 1; | 387 | unsigned int hw_opened: 1; |
| @@ -400,12 +402,14 @@ struct snd_pcm_str { | |||
| 400 | struct snd_pcm_oss_stream oss; | 402 | struct snd_pcm_oss_stream oss; |
| 401 | #endif | 403 | #endif |
| 402 | struct snd_pcm_file *files; | 404 | struct snd_pcm_file *files; |
| 405 | #ifdef CONFIG_SND_VERBOSE_PROCFS | ||
| 403 | struct snd_info_entry *proc_root; | 406 | struct snd_info_entry *proc_root; |
| 404 | struct snd_info_entry *proc_info_entry; | 407 | struct snd_info_entry *proc_info_entry; |
| 405 | #ifdef CONFIG_SND_DEBUG | 408 | #ifdef CONFIG_SND_PCM_XRUN_DEBUG |
| 406 | unsigned int xrun_debug; /* 0 = disabled, 1 = verbose, 2 = stacktrace */ | 409 | unsigned int xrun_debug; /* 0 = disabled, 1 = verbose, 2 = stacktrace */ |
| 407 | struct snd_info_entry *proc_xrun_debug_entry; | 410 | struct snd_info_entry *proc_xrun_debug_entry; |
| 408 | #endif | 411 | #endif |
| 412 | #endif | ||
| 409 | }; | 413 | }; |
| 410 | 414 | ||
| 411 | struct snd_pcm { | 415 | struct snd_pcm { |
diff --git a/include/sound/pcm_oss.h b/include/sound/pcm_oss.h index 39df2baca1..c854647b6f 100644 --- a/include/sound/pcm_oss.h +++ b/include/sound/pcm_oss.h | |||
| @@ -75,7 +75,9 @@ struct snd_pcm_oss_substream { | |||
| 75 | struct snd_pcm_oss_stream { | 75 | struct snd_pcm_oss_stream { |
| 76 | struct snd_pcm_oss_setup *setup_list; /* setup list */ | 76 | struct snd_pcm_oss_setup *setup_list; /* setup list */ |
| 77 | struct mutex setup_mutex; | 77 | struct mutex setup_mutex; |
| 78 | #ifdef CONFIG_SND_VERBOSE_PROCFS | ||
| 78 | struct snd_info_entry *proc_entry; | 79 | struct snd_info_entry *proc_entry; |
| 80 | #endif | ||
| 79 | }; | 81 | }; |
| 80 | 82 | ||
| 81 | struct snd_pcm_oss { | 83 | struct snd_pcm_oss { |
