diff options
161 files changed, 1500 insertions, 489 deletions
diff --git a/Documentation/arm/Samsung-S3C24XX/GPIO.txt b/Documentation/arm/Samsung-S3C24XX/GPIO.txt index b5d20c0b2ab4..ea7ccfc4b274 100644 --- a/Documentation/arm/Samsung-S3C24XX/GPIO.txt +++ b/Documentation/arm/Samsung-S3C24XX/GPIO.txt | |||
| @@ -13,6 +13,21 @@ Introduction | |||
| 13 | data-sheet/users manual to find out the complete list. | 13 | data-sheet/users manual to find out the complete list. |
| 14 | 14 | ||
| 15 | 15 | ||
| 16 | GPIOLIB | ||
| 17 | ------- | ||
| 18 | |||
| 19 | With the event of the GPIOLIB in drivers/gpio, support for some | ||
| 20 | of the GPIO functions such as reading and writing a pin will | ||
| 21 | be removed in favour of this common access method. | ||
| 22 | |||
| 23 | Once all the extant drivers have been converted, the functions | ||
| 24 | listed below will be removed (they may be marked as __deprecated | ||
| 25 | in the near future). | ||
| 26 | |||
| 27 | - s3c2410_gpio_getpin | ||
| 28 | - s3c2410_gpio_setpin | ||
| 29 | |||
| 30 | |||
| 16 | Headers | 31 | Headers |
| 17 | ------- | 32 | ------- |
| 18 | 33 | ||
diff --git a/Documentation/arm/Samsung-S3C24XX/Overview.txt b/Documentation/arm/Samsung-S3C24XX/Overview.txt index 014a8ec4877d..cff6227b4484 100644 --- a/Documentation/arm/Samsung-S3C24XX/Overview.txt +++ b/Documentation/arm/Samsung-S3C24XX/Overview.txt | |||
| @@ -8,9 +8,10 @@ Introduction | |||
| 8 | 8 | ||
| 9 | The Samsung S3C24XX range of ARM9 System-on-Chip CPUs are supported | 9 | The Samsung S3C24XX range of ARM9 System-on-Chip CPUs are supported |
| 10 | by the 's3c2410' architecture of ARM Linux. Currently the S3C2410, | 10 | by the 's3c2410' architecture of ARM Linux. Currently the S3C2410, |
| 11 | S3C2412, S3C2413, S3C2440 and S3C2442 devices are supported. | 11 | S3C2412, S3C2413, S3C2440, S3C2442 and S3C2443 devices are supported. |
| 12 | |||
| 13 | Support for the S3C2400 and S3C24A0 series are in progress. | ||
| 12 | 14 | ||
| 13 | Support for the S3C2400 series is in progress. | ||
| 14 | 15 | ||
| 15 | Configuration | 16 | Configuration |
| 16 | ------------- | 17 | ------------- |
| @@ -38,6 +39,22 @@ Layout | |||
| 38 | Register, kernel and platform data definitions are held in the | 39 | Register, kernel and platform data definitions are held in the |
| 39 | arch/arm/mach-s3c2410 directory./include/mach | 40 | arch/arm/mach-s3c2410 directory./include/mach |
| 40 | 41 | ||
| 42 | arch/arm/plat-s3c24xx: | ||
| 43 | |||
| 44 | Files in here are either common to all the s3c24xx family, | ||
| 45 | or are common to only some of them with names to indicate this | ||
| 46 | status. The files that are not common to all are generally named | ||
| 47 | with the initial cpu they support in the series to ensure a short | ||
| 48 | name without any possibility of confusion with newer devices. | ||
| 49 | |||
| 50 | As an example, initially s3c244x would cover s3c2440 and s3c2442, but | ||
| 51 | with the s3c2443 which does not share many of the same drivers in | ||
| 52 | this directory, the name becomes invalid. We stick to s3c2440-<x> | ||
| 53 | to indicate a driver that is s3c2440 and s3c2442 compatible. | ||
| 54 | |||
| 55 | This does mean that to find the status of any given SoC, a number | ||
| 56 | of directories may need to be searched. | ||
| 57 | |||
| 41 | 58 | ||
| 42 | Machines | 59 | Machines |
| 43 | -------- | 60 | -------- |
| @@ -159,6 +176,17 @@ NAND | |||
| 159 | For more information see Documentation/arm/Samsung-S3C24XX/NAND.txt | 176 | For more information see Documentation/arm/Samsung-S3C24XX/NAND.txt |
| 160 | 177 | ||
| 161 | 178 | ||
| 179 | SD/MMC | ||
| 180 | ------ | ||
| 181 | |||
| 182 | The SD/MMC hardware pre S3C2443 is supported in the current | ||
| 183 | kernel, the driver is drivers/mmc/host/s3cmci.c and supports | ||
| 184 | 1 and 4 bit SD or MMC cards. | ||
| 185 | |||
| 186 | The SDIO behaviour of this driver has not been fully tested. There is no | ||
| 187 | current support for hardware SDIO interrupts. | ||
| 188 | |||
| 189 | |||
| 162 | Serial | 190 | Serial |
| 163 | ------ | 191 | ------ |
| 164 | 192 | ||
| @@ -178,6 +206,9 @@ GPIO | |||
| 178 | The core contains support for manipulating the GPIO, see the | 206 | The core contains support for manipulating the GPIO, see the |
| 179 | documentation in GPIO.txt in the same directory as this file. | 207 | documentation in GPIO.txt in the same directory as this file. |
| 180 | 208 | ||
| 209 | Newer kernels carry GPIOLIB, and support is being moved towards | ||
| 210 | this with some of the older support in line to be removed. | ||
| 211 | |||
| 181 | 212 | ||
| 182 | Clock Management | 213 | Clock Management |
| 183 | ---------------- | 214 | ---------------- |
diff --git a/arch/arm/boot/compressed/.gitignore b/arch/arm/boot/compressed/.gitignore index b15f927a5926..ab204db594d3 100644 --- a/arch/arm/boot/compressed/.gitignore +++ b/arch/arm/boot/compressed/.gitignore | |||
| @@ -1,2 +1,3 @@ | |||
| 1 | piggy.gz | ||
| 2 | font.c | 1 | font.c |
| 2 | piggy.gz | ||
| 3 | vmlinux.lds | ||
diff --git a/arch/arm/common/dmabounce.c b/arch/arm/common/dmabounce.c index 69130f365904..aecc6c3f908f 100644 --- a/arch/arm/common/dmabounce.c +++ b/arch/arm/common/dmabounce.c | |||
| @@ -246,9 +246,9 @@ map_single(struct device *dev, void *ptr, size_t size, | |||
| 246 | } | 246 | } |
| 247 | 247 | ||
| 248 | dev_dbg(dev, | 248 | dev_dbg(dev, |
| 249 | "%s: unsafe buffer %p (phy=%p) mapped to %p (phy=%p)\n", | 249 | "%s: unsafe buffer %p (dma=%#x) mapped to %p (dma=%#x)\n", |
| 250 | __func__, buf->ptr, (void *) virt_to_dma(dev, buf->ptr), | 250 | __func__, buf->ptr, virt_to_dma(dev, buf->ptr), |
| 251 | buf->safe, (void *) buf->safe_dma_addr); | 251 | buf->safe, buf->safe_dma_addr); |
| 252 | 252 | ||
| 253 | if ((dir == DMA_TO_DEVICE) || | 253 | if ((dir == DMA_TO_DEVICE) || |
| 254 | (dir == DMA_BIDIRECTIONAL)) { | 254 | (dir == DMA_BIDIRECTIONAL)) { |
| @@ -292,9 +292,9 @@ unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, | |||
| 292 | BUG_ON(buf->size != size); | 292 | BUG_ON(buf->size != size); |
| 293 | 293 | ||
| 294 | dev_dbg(dev, | 294 | dev_dbg(dev, |
| 295 | "%s: unsafe buffer %p (phy=%p) mapped to %p (phy=%p)\n", | 295 | "%s: unsafe buffer %p (dma=%#x) mapped to %p (dma=%#x)\n", |
| 296 | __func__, buf->ptr, (void *) virt_to_dma(dev, buf->ptr), | 296 | __func__, buf->ptr, virt_to_dma(dev, buf->ptr), |
| 297 | buf->safe, (void *) buf->safe_dma_addr); | 297 | buf->safe, buf->safe_dma_addr); |
| 298 | 298 | ||
| 299 | DO_STATS ( device_info->bounce_count++ ); | 299 | DO_STATS ( device_info->bounce_count++ ); |
| 300 | 300 | ||
| @@ -321,9 +321,8 @@ unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, | |||
| 321 | } | 321 | } |
| 322 | } | 322 | } |
| 323 | 323 | ||
| 324 | static inline void | 324 | static int sync_single(struct device *dev, dma_addr_t dma_addr, size_t size, |
| 325 | sync_single(struct device *dev, dma_addr_t dma_addr, size_t size, | 325 | enum dma_data_direction dir) |
| 326 | enum dma_data_direction dir) | ||
| 327 | { | 326 | { |
| 328 | struct dmabounce_device_info *device_info = dev->archdata.dmabounce; | 327 | struct dmabounce_device_info *device_info = dev->archdata.dmabounce; |
| 329 | struct safe_buffer *buf = NULL; | 328 | struct safe_buffer *buf = NULL; |
| @@ -355,9 +354,9 @@ sync_single(struct device *dev, dma_addr_t dma_addr, size_t size, | |||
| 355 | */ | 354 | */ |
| 356 | 355 | ||
| 357 | dev_dbg(dev, | 356 | dev_dbg(dev, |
| 358 | "%s: unsafe buffer %p (phy=%p) mapped to %p (phy=%p)\n", | 357 | "%s: unsafe buffer %p (dma=%#x) mapped to %p (dma=%#x)\n", |
| 359 | __func__, buf->ptr, (void *) virt_to_dma(dev, buf->ptr), | 358 | __func__, buf->ptr, virt_to_dma(dev, buf->ptr), |
| 360 | buf->safe, (void *) buf->safe_dma_addr); | 359 | buf->safe, buf->safe_dma_addr); |
| 361 | 360 | ||
| 362 | DO_STATS ( device_info->bounce_count++ ); | 361 | DO_STATS ( device_info->bounce_count++ ); |
| 363 | 362 | ||
| @@ -383,8 +382,9 @@ sync_single(struct device *dev, dma_addr_t dma_addr, size_t size, | |||
| 383 | * No need to sync the safe buffer - it was allocated | 382 | * No need to sync the safe buffer - it was allocated |
| 384 | * via the coherent allocators. | 383 | * via the coherent allocators. |
| 385 | */ | 384 | */ |
| 385 | return 0; | ||
| 386 | } else { | 386 | } else { |
| 387 | dma_cache_maint(dma_to_virt(dev, dma_addr), size, dir); | 387 | return 1; |
| 388 | } | 388 | } |
| 389 | } | 389 | } |
| 390 | 390 | ||
| @@ -474,25 +474,29 @@ dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nents, | |||
| 474 | } | 474 | } |
| 475 | } | 475 | } |
| 476 | 476 | ||
| 477 | void | 477 | void dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_addr, |
| 478 | dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_addr, size_t size, | 478 | unsigned long offset, size_t size, |
| 479 | enum dma_data_direction dir) | 479 | enum dma_data_direction dir) |
| 480 | { | 480 | { |
| 481 | dev_dbg(dev, "%s(ptr=%p,size=%d,dir=%x)\n", | 481 | dev_dbg(dev, "%s(dma=%#x,off=%#lx,size=%zx,dir=%x)\n", |
| 482 | __func__, (void *) dma_addr, size, dir); | 482 | __func__, dma_addr, offset, size, dir); |
| 483 | 483 | ||
| 484 | sync_single(dev, dma_addr, size, dir); | 484 | if (sync_single(dev, dma_addr, offset + size, dir)) |
| 485 | dma_cache_maint(dma_to_virt(dev, dma_addr) + offset, size, dir); | ||
| 485 | } | 486 | } |
| 487 | EXPORT_SYMBOL(dma_sync_single_range_for_cpu); | ||
| 486 | 488 | ||
| 487 | void | 489 | void dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_addr, |
| 488 | dma_sync_single_for_device(struct device *dev, dma_addr_t dma_addr, size_t size, | 490 | unsigned long offset, size_t size, |
| 489 | enum dma_data_direction dir) | 491 | enum dma_data_direction dir) |
| 490 | { | 492 | { |
| 491 | dev_dbg(dev, "%s(ptr=%p,size=%d,dir=%x)\n", | 493 | dev_dbg(dev, "%s(dma=%#x,off=%#lx,size=%zx,dir=%x)\n", |
| 492 | __func__, (void *) dma_addr, size, dir); | 494 | __func__, dma_addr, offset, size, dir); |
| 493 | 495 | ||
| 494 | sync_single(dev, dma_addr, size, dir); | 496 | if (sync_single(dev, dma_addr, offset + size, dir)) |
| 497 | dma_cache_maint(dma_to_virt(dev, dma_addr) + offset, size, dir); | ||
| 495 | } | 498 | } |
| 499 | EXPORT_SYMBOL(dma_sync_single_range_for_device); | ||
| 496 | 500 | ||
| 497 | void | 501 | void |
| 498 | dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nents, | 502 | dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nents, |
| @@ -644,8 +648,6 @@ EXPORT_SYMBOL(dma_map_single); | |||
| 644 | EXPORT_SYMBOL(dma_unmap_single); | 648 | EXPORT_SYMBOL(dma_unmap_single); |
| 645 | EXPORT_SYMBOL(dma_map_sg); | 649 | EXPORT_SYMBOL(dma_map_sg); |
| 646 | EXPORT_SYMBOL(dma_unmap_sg); | 650 | EXPORT_SYMBOL(dma_unmap_sg); |
| 647 | EXPORT_SYMBOL(dma_sync_single_for_cpu); | ||
| 648 | EXPORT_SYMBOL(dma_sync_single_for_device); | ||
| 649 | EXPORT_SYMBOL(dma_sync_sg_for_cpu); | 651 | EXPORT_SYMBOL(dma_sync_sg_for_cpu); |
| 650 | EXPORT_SYMBOL(dma_sync_sg_for_device); | 652 | EXPORT_SYMBOL(dma_sync_sg_for_device); |
| 651 | EXPORT_SYMBOL(dmabounce_register_dev); | 653 | EXPORT_SYMBOL(dmabounce_register_dev); |
diff --git a/arch/arm/configs/orion5x_defconfig b/arch/arm/configs/orion5x_defconfig index 9578b5d9f9c7..1464ffe71717 100644 --- a/arch/arm/configs/orion5x_defconfig +++ b/arch/arm/configs/orion5x_defconfig | |||
| @@ -757,7 +757,14 @@ CONFIG_INPUT_EVDEV=y | |||
| 757 | # | 757 | # |
| 758 | # Input Device Drivers | 758 | # Input Device Drivers |
| 759 | # | 759 | # |
| 760 | # CONFIG_INPUT_KEYBOARD is not set | 760 | CONFIG_INPUT_KEYBOARD=y |
| 761 | # CONFIG_KEYBOARD_ATKBD is not set | ||
| 762 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
| 763 | # CONFIG_KEYBOARD_LKKBD is not set | ||
| 764 | # CONFIG_KEYBOARD_XTKBD is not set | ||
| 765 | # CONFIG_KEYBOARD_NEWTON is not set | ||
| 766 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
| 767 | CONFIG_KEYBOARD_GPIO=y | ||
| 761 | # CONFIG_INPUT_MOUSE is not set | 768 | # CONFIG_INPUT_MOUSE is not set |
| 762 | # CONFIG_INPUT_JOYSTICK is not set | 769 | # CONFIG_INPUT_JOYSTICK is not set |
| 763 | # CONFIG_INPUT_TABLET is not set | 770 | # CONFIG_INPUT_TABLET is not set |
| @@ -1111,11 +1118,11 @@ CONFIG_RTC_DRV_DS1307=y | |||
| 1111 | CONFIG_RTC_DRV_RS5C372=y | 1118 | CONFIG_RTC_DRV_RS5C372=y |
| 1112 | # CONFIG_RTC_DRV_ISL1208 is not set | 1119 | # CONFIG_RTC_DRV_ISL1208 is not set |
| 1113 | # CONFIG_RTC_DRV_X1205 is not set | 1120 | # CONFIG_RTC_DRV_X1205 is not set |
| 1114 | # CONFIG_RTC_DRV_PCF8563 is not set | 1121 | CONFIG_RTC_DRV_PCF8563=y |
| 1115 | # CONFIG_RTC_DRV_PCF8583 is not set | 1122 | # CONFIG_RTC_DRV_PCF8583 is not set |
| 1116 | CONFIG_RTC_DRV_M41T80=y | 1123 | CONFIG_RTC_DRV_M41T80=y |
| 1117 | # CONFIG_RTC_DRV_M41T80_WDT is not set | 1124 | # CONFIG_RTC_DRV_M41T80_WDT is not set |
| 1118 | # CONFIG_RTC_DRV_S35390A is not set | 1125 | CONFIG_RTC_DRV_S35390A=y |
| 1119 | 1126 | ||
| 1120 | # | 1127 | # |
| 1121 | # SPI RTC drivers | 1128 | # SPI RTC drivers |
diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h index 45329fca1b64..7b95d2058395 100644 --- a/arch/arm/include/asm/dma-mapping.h +++ b/arch/arm/include/asm/dma-mapping.h | |||
| @@ -3,11 +3,48 @@ | |||
| 3 | 3 | ||
| 4 | #ifdef __KERNEL__ | 4 | #ifdef __KERNEL__ |
| 5 | 5 | ||
| 6 | #include <linux/mm.h> /* need struct page */ | 6 | #include <linux/mm_types.h> |
| 7 | |||
| 8 | #include <linux/scatterlist.h> | 7 | #include <linux/scatterlist.h> |
| 9 | 8 | ||
| 10 | #include <asm-generic/dma-coherent.h> | 9 | #include <asm-generic/dma-coherent.h> |
| 10 | #include <asm/memory.h> | ||
| 11 | |||
| 12 | /* | ||
| 13 | * page_to_dma/dma_to_virt/virt_to_dma are architecture private functions | ||
| 14 | * used internally by the DMA-mapping API to provide DMA addresses. They | ||
| 15 | * must not be used by drivers. | ||
| 16 | */ | ||
| 17 | #ifndef __arch_page_to_dma | ||
| 18 | static inline dma_addr_t page_to_dma(struct device *dev, struct page *page) | ||
| 19 | { | ||
| 20 | return (dma_addr_t)__virt_to_bus((unsigned long)page_address(page)); | ||
| 21 | } | ||
| 22 | |||
| 23 | static inline void *dma_to_virt(struct device *dev, dma_addr_t addr) | ||
| 24 | { | ||
| 25 | return (void *)__bus_to_virt(addr); | ||
| 26 | } | ||
| 27 | |||
| 28 | static inline dma_addr_t virt_to_dma(struct device *dev, void *addr) | ||
| 29 | { | ||
| 30 | return (dma_addr_t)__virt_to_bus((unsigned long)(addr)); | ||
| 31 | } | ||
| 32 | #else | ||
| 33 | static inline dma_addr_t page_to_dma(struct device *dev, struct page *page) | ||
| 34 | { | ||
| 35 | return __arch_page_to_dma(dev, page); | ||
| 36 | } | ||
| 37 | |||
| 38 | static inline void *dma_to_virt(struct device *dev, dma_addr_t addr) | ||
| 39 | { | ||
| 40 | return __arch_dma_to_virt(dev, addr); | ||
| 41 | } | ||
| 42 | |||
| 43 | static inline dma_addr_t virt_to_dma(struct device *dev, void *addr) | ||
| 44 | { | ||
| 45 | return __arch_virt_to_dma(dev, addr); | ||
| 46 | } | ||
| 47 | #endif | ||
| 11 | 48 | ||
| 12 | /* | 49 | /* |
| 13 | * DMA-consistent mapping functions. These allocate/free a region of | 50 | * DMA-consistent mapping functions. These allocate/free a region of |
| @@ -169,7 +206,7 @@ dma_map_single(struct device *dev, void *cpu_addr, size_t size, | |||
| 169 | if (!arch_is_coherent()) | 206 | if (!arch_is_coherent()) |
| 170 | dma_cache_maint(cpu_addr, size, dir); | 207 | dma_cache_maint(cpu_addr, size, dir); |
| 171 | 208 | ||
| 172 | return virt_to_dma(dev, (unsigned long)cpu_addr); | 209 | return virt_to_dma(dev, cpu_addr); |
| 173 | } | 210 | } |
| 174 | #else | 211 | #else |
| 175 | extern dma_addr_t dma_map_single(struct device *,void *, size_t, enum dma_data_direction); | 212 | extern dma_addr_t dma_map_single(struct device *,void *, size_t, enum dma_data_direction); |
| @@ -195,7 +232,7 @@ dma_map_page(struct device *dev, struct page *page, | |||
| 195 | unsigned long offset, size_t size, | 232 | unsigned long offset, size_t size, |
| 196 | enum dma_data_direction dir) | 233 | enum dma_data_direction dir) |
| 197 | { | 234 | { |
| 198 | return dma_map_single(dev, page_address(page) + offset, size, (int)dir); | 235 | return dma_map_single(dev, page_address(page) + offset, size, dir); |
| 199 | } | 236 | } |
| 200 | 237 | ||
| 201 | /** | 238 | /** |
| @@ -241,7 +278,7 @@ static inline void | |||
| 241 | dma_unmap_page(struct device *dev, dma_addr_t handle, size_t size, | 278 | dma_unmap_page(struct device *dev, dma_addr_t handle, size_t size, |
| 242 | enum dma_data_direction dir) | 279 | enum dma_data_direction dir) |
| 243 | { | 280 | { |
| 244 | dma_unmap_single(dev, handle, size, (int)dir); | 281 | dma_unmap_single(dev, handle, size, dir); |
| 245 | } | 282 | } |
| 246 | 283 | ||
| 247 | /** | 284 | /** |
| @@ -314,11 +351,12 @@ extern void dma_unmap_sg(struct device *, struct scatterlist *, int, enum dma_da | |||
| 314 | 351 | ||
| 315 | 352 | ||
| 316 | /** | 353 | /** |
| 317 | * dma_sync_single_for_cpu | 354 | * dma_sync_single_range_for_cpu |
| 318 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices | 355 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices |
| 319 | * @handle: DMA address of buffer | 356 | * @handle: DMA address of buffer |
| 320 | * @size: size of buffer to map | 357 | * @offset: offset of region to start sync |
| 321 | * @dir: DMA transfer direction | 358 | * @size: size of region to sync |
| 359 | * @dir: DMA transfer direction (same as passed to dma_map_single) | ||
| 322 | * | 360 | * |
| 323 | * Make physical memory consistent for a single streaming mode DMA | 361 | * Make physical memory consistent for a single streaming mode DMA |
| 324 | * translation after a transfer. | 362 | * translation after a transfer. |
| @@ -332,25 +370,41 @@ extern void dma_unmap_sg(struct device *, struct scatterlist *, int, enum dma_da | |||
| 332 | */ | 370 | */ |
| 333 | #ifndef CONFIG_DMABOUNCE | 371 | #ifndef CONFIG_DMABOUNCE |
| 334 | static inline void | 372 | static inline void |
| 335 | dma_sync_single_for_cpu(struct device *dev, dma_addr_t handle, size_t size, | 373 | dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t handle, |
| 336 | enum dma_data_direction dir) | 374 | unsigned long offset, size_t size, |
| 375 | enum dma_data_direction dir) | ||
| 337 | { | 376 | { |
| 338 | if (!arch_is_coherent()) | 377 | if (!arch_is_coherent()) |
| 339 | dma_cache_maint((void *)dma_to_virt(dev, handle), size, dir); | 378 | dma_cache_maint(dma_to_virt(dev, handle) + offset, size, dir); |
| 340 | } | 379 | } |
| 341 | 380 | ||
| 342 | static inline void | 381 | static inline void |
| 343 | dma_sync_single_for_device(struct device *dev, dma_addr_t handle, size_t size, | 382 | dma_sync_single_range_for_device(struct device *dev, dma_addr_t handle, |
| 344 | enum dma_data_direction dir) | 383 | unsigned long offset, size_t size, |
| 384 | enum dma_data_direction dir) | ||
| 345 | { | 385 | { |
| 346 | if (!arch_is_coherent()) | 386 | if (!arch_is_coherent()) |
| 347 | dma_cache_maint((void *)dma_to_virt(dev, handle), size, dir); | 387 | dma_cache_maint(dma_to_virt(dev, handle) + offset, size, dir); |
| 348 | } | 388 | } |
| 349 | #else | 389 | #else |
| 350 | extern void dma_sync_single_for_cpu(struct device*, dma_addr_t, size_t, enum dma_data_direction); | 390 | extern void dma_sync_single_range_for_cpu(struct device *, dma_addr_t, unsigned long, size_t, enum dma_data_direction); |
| 351 | extern void dma_sync_single_for_device(struct device*, dma_addr_t, size_t, enum dma_data_direction); | 391 | extern void dma_sync_single_range_for_device(struct device *, dma_addr_t, unsigned long, size_t, enum dma_data_direction); |
| 352 | #endif | 392 | #endif |
| 353 | 393 | ||
| 394 | static inline void | ||
| 395 | dma_sync_single_for_cpu(struct device *dev, dma_addr_t handle, size_t size, | ||
| 396 | enum dma_data_direction dir) | ||
| 397 | { | ||
| 398 | dma_sync_single_range_for_cpu(dev, handle, 0, size, dir); | ||
| 399 | } | ||
| 400 | |||
| 401 | static inline void | ||
| 402 | dma_sync_single_for_device(struct device *dev, dma_addr_t handle, size_t size, | ||
| 403 | enum dma_data_direction dir) | ||
| 404 | { | ||
| 405 | dma_sync_single_range_for_device(dev, handle, 0, size, dir); | ||
| 406 | } | ||
| 407 | |||
| 354 | 408 | ||
| 355 | /** | 409 | /** |
| 356 | * dma_sync_sg_for_cpu | 410 | * dma_sync_sg_for_cpu |
diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h index 1e070a2b561a..bf7c737c9226 100644 --- a/arch/arm/include/asm/memory.h +++ b/arch/arm/include/asm/memory.h | |||
| @@ -150,6 +150,14 @@ | |||
| 150 | #endif | 150 | #endif |
| 151 | 151 | ||
| 152 | /* | 152 | /* |
| 153 | * Amount of memory reserved for the vmalloc() area, and minimum | ||
| 154 | * address for vmalloc mappings. | ||
| 155 | */ | ||
| 156 | extern unsigned long vmalloc_reserve; | ||
| 157 | |||
| 158 | #define VMALLOC_MIN (void *)(VMALLOC_END - vmalloc_reserve) | ||
| 159 | |||
| 160 | /* | ||
| 153 | * PFNs are used to describe any physical page; this means | 161 | * PFNs are used to describe any physical page; this means |
| 154 | * PFN 0 == physical address 0. | 162 | * PFN 0 == physical address 0. |
| 155 | * | 163 | * |
| @@ -306,20 +314,6 @@ static inline __deprecated void *bus_to_virt(unsigned long x) | |||
| 306 | #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) | 314 | #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) |
| 307 | 315 | ||
| 308 | /* | 316 | /* |
| 309 | * Optional device DMA address remapping. Do _not_ use directly! | ||
| 310 | * We should really eliminate virt_to_bus() here - it's deprecated. | ||
| 311 | */ | ||
| 312 | #ifndef __arch_page_to_dma | ||
| 313 | #define page_to_dma(dev, page) ((dma_addr_t)__virt_to_bus((unsigned long)page_address(page))) | ||
| 314 | #define dma_to_virt(dev, addr) ((void *)__bus_to_virt(addr)) | ||
| 315 | #define virt_to_dma(dev, addr) ((dma_addr_t)__virt_to_bus((unsigned long)(addr))) | ||
| 316 | #else | ||
| 317 | #define page_to_dma(dev, page) (__arch_page_to_dma(dev, page)) | ||
| 318 | #define dma_to_virt(dev, addr) (__arch_dma_to_virt(dev, addr)) | ||
| 319 | #define virt_to_dma(dev, addr) (__arch_virt_to_dma(dev, addr)) | ||
| 320 | #endif | ||
| 321 | |||
| 322 | /* | ||
| 323 | * Optional coherency support. Currently used only by selected | 317 | * Optional coherency support. Currently used only by selected |
| 324 | * Intel XSC3-based systems. | 318 | * Intel XSC3-based systems. |
| 325 | */ | 319 | */ |
diff --git a/arch/arm/include/asm/mtd-xip.h b/arch/arm/include/asm/mtd-xip.h index 4225372a26f3..d8fbe2d9b8b9 100644 --- a/arch/arm/include/asm/mtd-xip.h +++ b/arch/arm/include/asm/mtd-xip.h | |||
| @@ -10,8 +10,6 @@ | |||
| 10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
| 11 | * it under the terms of the GNU General Public License version 2 as | 11 | * it under the terms of the GNU General Public License version 2 as |
| 12 | * published by the Free Software Foundation. | 12 | * published by the Free Software Foundation. |
| 13 | * | ||
| 14 | * $Id: xip.h,v 1.2 2004/12/01 15:49:10 nico Exp $ | ||
| 15 | */ | 13 | */ |
| 16 | 14 | ||
| 17 | #ifndef __ARM_MTD_XIP_H__ | 15 | #ifndef __ARM_MTD_XIP_H__ |
diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h index b01d5e7e3d5a..517a4d6ffc74 100644 --- a/arch/arm/include/asm/processor.h +++ b/arch/arm/include/asm/processor.h | |||
| @@ -112,9 +112,9 @@ extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); | |||
| 112 | static inline void prefetch(const void *ptr) | 112 | static inline void prefetch(const void *ptr) |
| 113 | { | 113 | { |
| 114 | __asm__ __volatile__( | 114 | __asm__ __volatile__( |
| 115 | "pld\t%0" | 115 | "pld\t%a0" |
| 116 | : | 116 | : |
| 117 | : "o" (*(char *)ptr) | 117 | : "p" (ptr) |
| 118 | : "cc"); | 118 | : "cc"); |
| 119 | } | 119 | } |
| 120 | 120 | ||
diff --git a/arch/arm/include/asm/tlbflush.h b/arch/arm/include/asm/tlbflush.h index 0d0d40f1b599..b543a054a17e 100644 --- a/arch/arm/include/asm/tlbflush.h +++ b/arch/arm/include/asm/tlbflush.h | |||
| @@ -54,6 +54,7 @@ | |||
| 54 | * v4wbi - ARMv4 with write buffer with I TLB flush entry instruction | 54 | * v4wbi - ARMv4 with write buffer with I TLB flush entry instruction |
| 55 | * fr - Feroceon (v4wbi with non-outer-cacheable page table walks) | 55 | * fr - Feroceon (v4wbi with non-outer-cacheable page table walks) |
| 56 | * v6wbi - ARMv6 with write buffer with I TLB flush entry instruction | 56 | * v6wbi - ARMv6 with write buffer with I TLB flush entry instruction |
| 57 | * v7wbi - identical to v6wbi | ||
| 57 | */ | 58 | */ |
| 58 | #undef _TLB | 59 | #undef _TLB |
| 59 | #undef MULTI_TLB | 60 | #undef MULTI_TLB |
| @@ -266,14 +267,16 @@ extern struct cpu_tlb_fns cpu_tlb; | |||
| 266 | v4wbi_possible_flags | \ | 267 | v4wbi_possible_flags | \ |
| 267 | fr_possible_flags | \ | 268 | fr_possible_flags | \ |
| 268 | v4wb_possible_flags | \ | 269 | v4wb_possible_flags | \ |
| 269 | v6wbi_possible_flags) | 270 | v6wbi_possible_flags | \ |
| 271 | v7wbi_possible_flags) | ||
| 270 | 272 | ||
| 271 | #define always_tlb_flags (v3_always_flags & \ | 273 | #define always_tlb_flags (v3_always_flags & \ |
| 272 | v4_always_flags & \ | 274 | v4_always_flags & \ |
| 273 | v4wbi_always_flags & \ | 275 | v4wbi_always_flags & \ |
| 274 | fr_always_flags & \ | 276 | fr_always_flags & \ |
| 275 | v4wb_always_flags & \ | 277 | v4wb_always_flags & \ |
| 276 | v6wbi_always_flags) | 278 | v6wbi_always_flags & \ |
| 279 | v7wbi_always_flags) | ||
| 277 | 280 | ||
| 278 | #define tlb_flag(f) ((always_tlb_flags & (f)) || (__tlb_flag & possible_tlb_flags & (f))) | 281 | #define tlb_flag(f) ((always_tlb_flags & (f)) || (__tlb_flag & possible_tlb_flags & (f))) |
| 279 | 282 | ||
diff --git a/arch/arm/include/asm/unistd.h b/arch/arm/include/asm/unistd.h index f95fbb2fcb5f..010618487cf1 100644 --- a/arch/arm/include/asm/unistd.h +++ b/arch/arm/include/asm/unistd.h | |||
| @@ -381,6 +381,12 @@ | |||
| 381 | #define __NR_fallocate (__NR_SYSCALL_BASE+352) | 381 | #define __NR_fallocate (__NR_SYSCALL_BASE+352) |
| 382 | #define __NR_timerfd_settime (__NR_SYSCALL_BASE+353) | 382 | #define __NR_timerfd_settime (__NR_SYSCALL_BASE+353) |
| 383 | #define __NR_timerfd_gettime (__NR_SYSCALL_BASE+354) | 383 | #define __NR_timerfd_gettime (__NR_SYSCALL_BASE+354) |
| 384 | #define __NR_signalfd4 (__NR_SYSCALL_BASE+355) | ||
| 385 | #define __NR_eventfd2 (__NR_SYSCALL_BASE+356) | ||
| 386 | #define __NR_epoll_create1 (__NR_SYSCALL_BASE+357) | ||
| 387 | #define __NR_dup3 (__NR_SYSCALL_BASE+358) | ||
| 388 | #define __NR_pipe2 (__NR_SYSCALL_BASE+359) | ||
| 389 | #define __NR_inotify_init1 (__NR_SYSCALL_BASE+360) | ||
| 384 | 390 | ||
| 385 | /* | 391 | /* |
| 386 | * The following SWIs are ARM private. | 392 | * The following SWIs are ARM private. |
diff --git a/arch/arm/kernel/.gitignore b/arch/arm/kernel/.gitignore new file mode 100644 index 000000000000..c5f676c3c224 --- /dev/null +++ b/arch/arm/kernel/.gitignore | |||
| @@ -0,0 +1 @@ | |||
| vmlinux.lds | |||
diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S index 30a67a5a40a8..09a061cb7838 100644 --- a/arch/arm/kernel/calls.S +++ b/arch/arm/kernel/calls.S | |||
| @@ -262,10 +262,10 @@ | |||
| 262 | /* 250 */ CALL(sys_epoll_create) | 262 | /* 250 */ CALL(sys_epoll_create) |
| 263 | CALL(ABI(sys_epoll_ctl, sys_oabi_epoll_ctl)) | 263 | CALL(ABI(sys_epoll_ctl, sys_oabi_epoll_ctl)) |
| 264 | CALL(ABI(sys_epoll_wait, sys_oabi_epoll_wait)) | 264 | CALL(ABI(sys_epoll_wait, sys_oabi_epoll_wait)) |
| 265 | CALL(sys_remap_file_pages) | 265 | CALL(sys_remap_file_pages) |
| 266 | CALL(sys_ni_syscall) /* sys_set_thread_area */ | 266 | CALL(sys_ni_syscall) /* sys_set_thread_area */ |
| 267 | /* 255 */ CALL(sys_ni_syscall) /* sys_get_thread_area */ | 267 | /* 255 */ CALL(sys_ni_syscall) /* sys_get_thread_area */ |
| 268 | CALL(sys_set_tid_address) | 268 | CALL(sys_set_tid_address) |
| 269 | CALL(sys_timer_create) | 269 | CALL(sys_timer_create) |
| 270 | CALL(sys_timer_settime) | 270 | CALL(sys_timer_settime) |
| 271 | CALL(sys_timer_gettime) | 271 | CALL(sys_timer_gettime) |
| @@ -364,6 +364,12 @@ | |||
| 364 | CALL(sys_fallocate) | 364 | CALL(sys_fallocate) |
| 365 | CALL(sys_timerfd_settime) | 365 | CALL(sys_timerfd_settime) |
| 366 | CALL(sys_timerfd_gettime) | 366 | CALL(sys_timerfd_gettime) |
| 367 | /* 355 */ CALL(sys_signalfd4) | ||
| 368 | CALL(sys_eventfd2) | ||
| 369 | CALL(sys_epoll_create1) | ||
| 370 | CALL(sys_dup3) | ||
| 371 | CALL(sys_pipe2) | ||
| 372 | /* 360 */ CALL(sys_inotify_init1) | ||
| 367 | #ifndef syscalls_counted | 373 | #ifndef syscalls_counted |
| 368 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls | 374 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls |
| 369 | #define syscalls_counted | 375 | #define syscalls_counted |
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 38f0e7940a13..2ca7038b67a7 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
| @@ -81,6 +81,8 @@ EXPORT_SYMBOL(system_serial_high); | |||
| 81 | unsigned int elf_hwcap; | 81 | unsigned int elf_hwcap; |
| 82 | EXPORT_SYMBOL(elf_hwcap); | 82 | EXPORT_SYMBOL(elf_hwcap); |
| 83 | 83 | ||
| 84 | unsigned long __initdata vmalloc_reserve = 128 << 20; | ||
| 85 | |||
| 84 | 86 | ||
| 85 | #ifdef MULTI_CPU | 87 | #ifdef MULTI_CPU |
| 86 | struct processor processor; | 88 | struct processor processor; |
| @@ -501,6 +503,17 @@ static void __init early_mem(char **p) | |||
| 501 | __early_param("mem=", early_mem); | 503 | __early_param("mem=", early_mem); |
| 502 | 504 | ||
| 503 | /* | 505 | /* |
| 506 | * vmalloc=size forces the vmalloc area to be exactly 'size' | ||
| 507 | * bytes. This can be used to increase (or decrease) the vmalloc | ||
| 508 | * area - the default is 128m. | ||
| 509 | */ | ||
| 510 | static void __init early_vmalloc(char **arg) | ||
| 511 | { | ||
| 512 | vmalloc_reserve = memparse(*arg, arg); | ||
| 513 | } | ||
| 514 | __early_param("vmalloc=", early_vmalloc); | ||
| 515 | |||
| 516 | /* | ||
| 504 | * Initial parsing of the command line. | 517 | * Initial parsing of the command line. |
| 505 | */ | 518 | */ |
| 506 | static void __init parse_cmdline(char **cmdline_p, char *from) | 519 | static void __init parse_cmdline(char **cmdline_p, char *from) |
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 7277aef83098..872f1f8fbb57 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
| @@ -288,14 +288,28 @@ void unregister_undef_hook(struct undef_hook *hook) | |||
| 288 | spin_unlock_irqrestore(&undef_lock, flags); | 288 | spin_unlock_irqrestore(&undef_lock, flags); |
| 289 | } | 289 | } |
| 290 | 290 | ||
| 291 | static int call_undef_hook(struct pt_regs *regs, unsigned int instr) | ||
| 292 | { | ||
| 293 | struct undef_hook *hook; | ||
| 294 | unsigned long flags; | ||
| 295 | int (*fn)(struct pt_regs *regs, unsigned int instr) = NULL; | ||
| 296 | |||
| 297 | spin_lock_irqsave(&undef_lock, flags); | ||
| 298 | list_for_each_entry(hook, &undef_hook, node) | ||
| 299 | if ((instr & hook->instr_mask) == hook->instr_val && | ||
| 300 | (regs->ARM_cpsr & hook->cpsr_mask) == hook->cpsr_val) | ||
| 301 | fn = hook->fn; | ||
| 302 | spin_unlock_irqrestore(&undef_lock, flags); | ||
| 303 | |||
| 304 | return fn ? fn(regs, instr) : 1; | ||
| 305 | } | ||
| 306 | |||
| 291 | asmlinkage void __exception do_undefinstr(struct pt_regs *regs) | 307 | asmlinkage void __exception do_undefinstr(struct pt_regs *regs) |
| 292 | { | 308 | { |
| 293 | unsigned int correction = thumb_mode(regs) ? 2 : 4; | 309 | unsigned int correction = thumb_mode(regs) ? 2 : 4; |
| 294 | unsigned int instr; | 310 | unsigned int instr; |
| 295 | struct undef_hook *hook; | ||
| 296 | siginfo_t info; | 311 | siginfo_t info; |
| 297 | void __user *pc; | 312 | void __user *pc; |
| 298 | unsigned long flags; | ||
| 299 | 313 | ||
| 300 | /* | 314 | /* |
| 301 | * According to the ARM ARM, PC is 2 or 4 bytes ahead, | 315 | * According to the ARM ARM, PC is 2 or 4 bytes ahead, |
| @@ -325,17 +339,8 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs) | |||
| 325 | } | 339 | } |
| 326 | #endif | 340 | #endif |
| 327 | 341 | ||
| 328 | spin_lock_irqsave(&undef_lock, flags); | 342 | if (call_undef_hook(regs, instr) == 0) |
| 329 | list_for_each_entry(hook, &undef_hook, node) { | 343 | return; |
| 330 | if ((instr & hook->instr_mask) == hook->instr_val && | ||
| 331 | (regs->ARM_cpsr & hook->cpsr_mask) == hook->cpsr_val) { | ||
| 332 | if (hook->fn(regs, instr) == 0) { | ||
| 333 | spin_unlock_irqrestore(&undef_lock, flags); | ||
| 334 | return; | ||
| 335 | } | ||
| 336 | } | ||
| 337 | } | ||
| 338 | spin_unlock_irqrestore(&undef_lock, flags); | ||
| 339 | 344 | ||
| 340 | #ifdef CONFIG_DEBUG_USER | 345 | #ifdef CONFIG_DEBUG_USER |
| 341 | if (user_debug & UDBG_UNDEFINED) { | 346 | if (user_debug & UDBG_UNDEFINED) { |
diff --git a/arch/arm/mach-footbridge/cats-pci.c b/arch/arm/mach-footbridge/cats-pci.c index 35eb232a649a..ae3e1c8c7583 100644 --- a/arch/arm/mach-footbridge/cats-pci.c +++ b/arch/arm/mach-footbridge/cats-pci.c | |||
| @@ -18,6 +18,9 @@ static int irqmap_cats[] __initdata = { IRQ_PCI, IRQ_IN0, IRQ_IN1, IRQ_IN3 }; | |||
| 18 | 18 | ||
| 19 | static int __init cats_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | 19 | static int __init cats_map_irq(struct pci_dev *dev, u8 slot, u8 pin) |
| 20 | { | 20 | { |
| 21 | if (dev->irq >= 255) | ||
| 22 | return -1; /* not a valid interrupt. */ | ||
| 23 | |||
| 21 | if (dev->irq >= 128) | 24 | if (dev->irq >= 128) |
| 22 | return dev->irq & 0x1f; | 25 | return dev->irq & 0x1f; |
| 23 | 26 | ||
diff --git a/arch/arm/mach-integrator/cpu.c b/arch/arm/mach-integrator/cpu.c index ce5ea7c26675..7c49d55e6b27 100644 --- a/arch/arm/mach-integrator/cpu.c +++ b/arch/arm/mach-integrator/cpu.c | |||
| @@ -3,8 +3,6 @@ | |||
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2001-2002 Deep Blue Solutions Ltd. | 4 | * Copyright (C) 2001-2002 Deep Blue Solutions Ltd. |
| 5 | * | 5 | * |
| 6 | * $Id: cpu.c,v 1.6 2002/07/18 13:58:51 rmk Exp $ | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | 6 | * 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 | 7 | * it under the terms of the GNU General Public License version 2 as |
| 10 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
diff --git a/arch/arm/mach-integrator/include/mach/platform.h b/arch/arm/mach-integrator/include/mach/platform.h index 83c4c1ceb411..028b87839c0f 100644 --- a/arch/arm/mach-integrator/include/mach/platform.h +++ b/arch/arm/mach-integrator/include/mach/platform.h | |||
| @@ -26,8 +26,6 @@ | |||
| 26 | * NOTE: This is a multi-hosted header file for use with uHAL and | 26 | * NOTE: This is a multi-hosted header file for use with uHAL and |
| 27 | * supported debuggers. | 27 | * supported debuggers. |
| 28 | * | 28 | * |
| 29 | * $Id: platform.s,v 1.32 2000/02/18 10:51:39 asims Exp $ | ||
| 30 | * | ||
| 31 | * ***********************************************************************/ | 29 | * ***********************************************************************/ |
| 32 | 30 | ||
| 33 | #ifndef __address_h | 31 | #ifndef __address_h |
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index 0e509b8ad56e..189f16f3619d 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c | |||
| @@ -15,15 +15,17 @@ | |||
| 15 | #include <linux/mbus.h> | 15 | #include <linux/mbus.h> |
| 16 | #include <linux/mv643xx_eth.h> | 16 | #include <linux/mv643xx_eth.h> |
| 17 | #include <linux/ata_platform.h> | 17 | #include <linux/ata_platform.h> |
| 18 | #include <linux/spi/orion_spi.h> | ||
| 18 | #include <asm/page.h> | 19 | #include <asm/page.h> |
| 19 | #include <asm/timex.h> | 20 | #include <asm/timex.h> |
| 20 | #include <asm/mach/map.h> | 21 | #include <asm/mach/map.h> |
| 21 | #include <asm/mach/time.h> | 22 | #include <asm/mach/time.h> |
| 22 | #include <mach/kirkwood.h> | 23 | #include <mach/kirkwood.h> |
| 23 | #include <asm/plat-orion/cache-feroceon-l2.h> | 24 | #include <plat/cache-feroceon-l2.h> |
| 24 | #include <asm/plat-orion/ehci-orion.h> | 25 | #include <plat/ehci-orion.h> |
| 25 | #include <asm/plat-orion/orion_nand.h> | 26 | #include <plat/mv_xor.h> |
| 26 | #include <asm/plat-orion/time.h> | 27 | #include <plat/orion_nand.h> |
| 28 | #include <plat/time.h> | ||
| 27 | #include "common.h" | 29 | #include "common.h" |
| 28 | 30 | ||
| 29 | /***************************************************************************** | 31 | /***************************************************************************** |
| @@ -196,6 +198,37 @@ void __init kirkwood_sata_init(struct mv_sata_platform_data *sata_data) | |||
| 196 | 198 | ||
| 197 | 199 | ||
| 198 | /***************************************************************************** | 200 | /***************************************************************************** |
| 201 | * SPI | ||
| 202 | ****************************************************************************/ | ||
| 203 | static struct orion_spi_info kirkwood_spi_plat_data = { | ||
| 204 | .tclk = KIRKWOOD_TCLK, | ||
| 205 | }; | ||
| 206 | |||
| 207 | static struct resource kirkwood_spi_resources[] = { | ||
| 208 | { | ||
| 209 | .start = SPI_PHYS_BASE, | ||
| 210 | .end = SPI_PHYS_BASE + SZ_512 - 1, | ||
| 211 | .flags = IORESOURCE_MEM, | ||
| 212 | }, | ||
| 213 | }; | ||
| 214 | |||
| 215 | static struct platform_device kirkwood_spi = { | ||
| 216 | .name = "orion_spi", | ||
| 217 | .id = 0, | ||
| 218 | .resource = kirkwood_spi_resources, | ||
| 219 | .dev = { | ||
| 220 | .platform_data = &kirkwood_spi_plat_data, | ||
| 221 | }, | ||
| 222 | .num_resources = ARRAY_SIZE(kirkwood_spi_resources), | ||
| 223 | }; | ||
| 224 | |||
| 225 | void __init kirkwood_spi_init() | ||
| 226 | { | ||
| 227 | platform_device_register(&kirkwood_spi); | ||
| 228 | } | ||
| 229 | |||
| 230 | |||
| 231 | /***************************************************************************** | ||
| 199 | * UART0 | 232 | * UART0 |
| 200 | ****************************************************************************/ | 233 | ****************************************************************************/ |
| 201 | static struct plat_serial8250_port kirkwood_uart0_data[] = { | 234 | static struct plat_serial8250_port kirkwood_uart0_data[] = { |
| @@ -284,6 +317,212 @@ void __init kirkwood_uart1_init(void) | |||
| 284 | 317 | ||
| 285 | 318 | ||
| 286 | /***************************************************************************** | 319 | /***************************************************************************** |
| 320 | * XOR | ||
| 321 | ****************************************************************************/ | ||
| 322 | static struct mv_xor_platform_shared_data kirkwood_xor_shared_data = { | ||
| 323 | .dram = &kirkwood_mbus_dram_info, | ||
| 324 | }; | ||
| 325 | |||
| 326 | static u64 kirkwood_xor_dmamask = DMA_32BIT_MASK; | ||
| 327 | |||
| 328 | |||
| 329 | /***************************************************************************** | ||
| 330 | * XOR0 | ||
| 331 | ****************************************************************************/ | ||
| 332 | static struct resource kirkwood_xor0_shared_resources[] = { | ||
| 333 | { | ||
| 334 | .name = "xor 0 low", | ||
| 335 | .start = XOR0_PHYS_BASE, | ||
| 336 | .end = XOR0_PHYS_BASE + 0xff, | ||
| 337 | .flags = IORESOURCE_MEM, | ||
| 338 | }, { | ||
| 339 | .name = "xor 0 high", | ||
| 340 | .start = XOR0_HIGH_PHYS_BASE, | ||
| 341 | .end = XOR0_HIGH_PHYS_BASE + 0xff, | ||
| 342 | .flags = IORESOURCE_MEM, | ||
| 343 | }, | ||
| 344 | }; | ||
| 345 | |||
| 346 | static struct platform_device kirkwood_xor0_shared = { | ||
| 347 | .name = MV_XOR_SHARED_NAME, | ||
| 348 | .id = 0, | ||
| 349 | .dev = { | ||
| 350 | .platform_data = &kirkwood_xor_shared_data, | ||
| 351 | }, | ||
| 352 | .num_resources = ARRAY_SIZE(kirkwood_xor0_shared_resources), | ||
| 353 | .resource = kirkwood_xor0_shared_resources, | ||
| 354 | }; | ||
| 355 | |||
| 356 | static struct resource kirkwood_xor00_resources[] = { | ||
| 357 | [0] = { | ||
| 358 | .start = IRQ_KIRKWOOD_XOR_00, | ||
| 359 | .end = IRQ_KIRKWOOD_XOR_00, | ||
| 360 | .flags = IORESOURCE_IRQ, | ||
| 361 | }, | ||
| 362 | }; | ||
| 363 | |||
| 364 | static struct mv_xor_platform_data kirkwood_xor00_data = { | ||
| 365 | .shared = &kirkwood_xor0_shared, | ||
| 366 | .hw_id = 0, | ||
| 367 | .pool_size = PAGE_SIZE, | ||
| 368 | }; | ||
| 369 | |||
| 370 | static struct platform_device kirkwood_xor00_channel = { | ||
| 371 | .name = MV_XOR_NAME, | ||
| 372 | .id = 0, | ||
| 373 | .num_resources = ARRAY_SIZE(kirkwood_xor00_resources), | ||
| 374 | .resource = kirkwood_xor00_resources, | ||
| 375 | .dev = { | ||
| 376 | .dma_mask = &kirkwood_xor_dmamask, | ||
| 377 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
| 378 | .platform_data = (void *)&kirkwood_xor00_data, | ||
| 379 | }, | ||
| 380 | }; | ||
| 381 | |||
| 382 | static struct resource kirkwood_xor01_resources[] = { | ||
| 383 | [0] = { | ||
| 384 | .start = IRQ_KIRKWOOD_XOR_01, | ||
| 385 | .end = IRQ_KIRKWOOD_XOR_01, | ||
| 386 | .flags = IORESOURCE_IRQ, | ||
| 387 | }, | ||
| 388 | }; | ||
| 389 | |||
| 390 | static struct mv_xor_platform_data kirkwood_xor01_data = { | ||
| 391 | .shared = &kirkwood_xor0_shared, | ||
| 392 | .hw_id = 1, | ||
| 393 | .pool_size = PAGE_SIZE, | ||
| 394 | }; | ||
| 395 | |||
| 396 | static struct platform_device kirkwood_xor01_channel = { | ||
| 397 | .name = MV_XOR_NAME, | ||
| 398 | .id = 1, | ||
| 399 | .num_resources = ARRAY_SIZE(kirkwood_xor01_resources), | ||
| 400 | .resource = kirkwood_xor01_resources, | ||
| 401 | .dev = { | ||
| 402 | .dma_mask = &kirkwood_xor_dmamask, | ||
| 403 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
| 404 | .platform_data = (void *)&kirkwood_xor01_data, | ||
| 405 | }, | ||
| 406 | }; | ||
| 407 | |||
| 408 | void __init kirkwood_xor0_init(void) | ||
| 409 | { | ||
| 410 | platform_device_register(&kirkwood_xor0_shared); | ||
| 411 | |||
| 412 | /* | ||
| 413 | * two engines can't do memset simultaneously, this limitation | ||
| 414 | * satisfied by removing memset support from one of the engines. | ||
| 415 | */ | ||
| 416 | dma_cap_set(DMA_MEMCPY, kirkwood_xor00_data.cap_mask); | ||
| 417 | dma_cap_set(DMA_XOR, kirkwood_xor00_data.cap_mask); | ||
| 418 | platform_device_register(&kirkwood_xor00_channel); | ||
| 419 | |||
| 420 | dma_cap_set(DMA_MEMCPY, kirkwood_xor01_data.cap_mask); | ||
| 421 | dma_cap_set(DMA_MEMSET, kirkwood_xor01_data.cap_mask); | ||
| 422 | dma_cap_set(DMA_XOR, kirkwood_xor01_data.cap_mask); | ||
| 423 | platform_device_register(&kirkwood_xor01_channel); | ||
| 424 | } | ||
| 425 | |||
| 426 | |||
| 427 | /***************************************************************************** | ||
| 428 | * XOR1 | ||
| 429 | ****************************************************************************/ | ||
| 430 | static struct resource kirkwood_xor1_shared_resources[] = { | ||
| 431 | { | ||
| 432 | .name = "xor 1 low", | ||
| 433 | .start = XOR1_PHYS_BASE, | ||
| 434 | .end = XOR1_PHYS_BASE + 0xff, | ||
| 435 | .flags = IORESOURCE_MEM, | ||
| 436 | }, { | ||
| 437 | .name = "xor 1 high", | ||
| 438 | .start = XOR1_HIGH_PHYS_BASE, | ||
| 439 | .end = XOR1_HIGH_PHYS_BASE + 0xff, | ||
| 440 | .flags = IORESOURCE_MEM, | ||
| 441 | }, | ||
| 442 | }; | ||
| 443 | |||
| 444 | static struct platform_device kirkwood_xor1_shared = { | ||
| 445 | .name = MV_XOR_SHARED_NAME, | ||
| 446 | .id = 1, | ||
| 447 | .dev = { | ||
| 448 | .platform_data = &kirkwood_xor_shared_data, | ||
| 449 | }, | ||
| 450 | .num_resources = ARRAY_SIZE(kirkwood_xor1_shared_resources), | ||
| 451 | .resource = kirkwood_xor1_shared_resources, | ||
| 452 | }; | ||
| 453 | |||
| 454 | static struct resource kirkwood_xor10_resources[] = { | ||
| 455 | [0] = { | ||
| 456 | .start = IRQ_KIRKWOOD_XOR_10, | ||
| 457 | .end = IRQ_KIRKWOOD_XOR_10, | ||
| 458 | .flags = IORESOURCE_IRQ, | ||
| 459 | }, | ||
| 460 | }; | ||
| 461 | |||
| 462 | static struct mv_xor_platform_data kirkwood_xor10_data = { | ||
| 463 | .shared = &kirkwood_xor1_shared, | ||
| 464 | .hw_id = 0, | ||
| 465 | .pool_size = PAGE_SIZE, | ||
| 466 | }; | ||
| 467 | |||
| 468 | static struct platform_device kirkwood_xor10_channel = { | ||
| 469 | .name = MV_XOR_NAME, | ||
| 470 | .id = 2, | ||
| 471 | .num_resources = ARRAY_SIZE(kirkwood_xor10_resources), | ||
| 472 | .resource = kirkwood_xor10_resources, | ||
| 473 | .dev = { | ||
| 474 | .dma_mask = &kirkwood_xor_dmamask, | ||
| 475 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
| 476 | .platform_data = (void *)&kirkwood_xor10_data, | ||
| 477 | }, | ||
| 478 | }; | ||
| 479 | |||
| 480 | static struct resource kirkwood_xor11_resources[] = { | ||
| 481 | [0] = { | ||
| 482 | .start = IRQ_KIRKWOOD_XOR_11, | ||
| 483 | .end = IRQ_KIRKWOOD_XOR_11, | ||
| 484 | .flags = IORESOURCE_IRQ, | ||
| 485 | }, | ||
| 486 | }; | ||
| 487 | |||
| 488 | static struct mv_xor_platform_data kirkwood_xor11_data = { | ||
| 489 | .shared = &kirkwood_xor1_shared, | ||
| 490 | .hw_id = 1, | ||
| 491 | .pool_size = PAGE_SIZE, | ||
| 492 | }; | ||
| 493 | |||
| 494 | static struct platform_device kirkwood_xor11_channel = { | ||
| 495 | .name = MV_XOR_NAME, | ||
| 496 | .id = 3, | ||
| 497 | .num_resources = ARRAY_SIZE(kirkwood_xor11_resources), | ||
| 498 | .resource = kirkwood_xor11_resources, | ||
| 499 | .dev = { | ||
| 500 | .dma_mask = &kirkwood_xor_dmamask, | ||
| 501 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
| 502 | .platform_data = (void *)&kirkwood_xor11_data, | ||
| 503 | }, | ||
| 504 | }; | ||
| 505 | |||
| 506 | void __init kirkwood_xor1_init(void) | ||
| 507 | { | ||
| 508 | platform_device_register(&kirkwood_xor1_shared); | ||
| 509 | |||
| 510 | /* | ||
| 511 | * two engines can't do memset simultaneously, this limitation | ||
| 512 | * satisfied by removing memset support from one of the engines. | ||
| 513 | */ | ||
| 514 | dma_cap_set(DMA_MEMCPY, kirkwood_xor10_data.cap_mask); | ||
| 515 | dma_cap_set(DMA_XOR, kirkwood_xor10_data.cap_mask); | ||
| 516 | platform_device_register(&kirkwood_xor10_channel); | ||
| 517 | |||
| 518 | dma_cap_set(DMA_MEMCPY, kirkwood_xor11_data.cap_mask); | ||
| 519 | dma_cap_set(DMA_MEMSET, kirkwood_xor11_data.cap_mask); | ||
| 520 | dma_cap_set(DMA_XOR, kirkwood_xor11_data.cap_mask); | ||
| 521 | platform_device_register(&kirkwood_xor11_channel); | ||
| 522 | } | ||
| 523 | |||
| 524 | |||
| 525 | /***************************************************************************** | ||
| 287 | * Time handling | 526 | * Time handling |
| 288 | ****************************************************************************/ | 527 | ****************************************************************************/ |
| 289 | static void kirkwood_timer_init(void) | 528 | static void kirkwood_timer_init(void) |
diff --git a/arch/arm/mach-kirkwood/common.h b/arch/arm/mach-kirkwood/common.h index 5dee2f6b40a5..69cd113af03a 100644 --- a/arch/arm/mach-kirkwood/common.h +++ b/arch/arm/mach-kirkwood/common.h | |||
| @@ -33,8 +33,11 @@ void kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data); | |||
| 33 | void kirkwood_pcie_init(void); | 33 | void kirkwood_pcie_init(void); |
| 34 | void kirkwood_rtc_init(void); | 34 | void kirkwood_rtc_init(void); |
| 35 | void kirkwood_sata_init(struct mv_sata_platform_data *sata_data); | 35 | void kirkwood_sata_init(struct mv_sata_platform_data *sata_data); |
| 36 | void kirkwood_spi_init(void); | ||
| 36 | void kirkwood_uart0_init(void); | 37 | void kirkwood_uart0_init(void); |
| 37 | void kirkwood_uart1_init(void); | 38 | void kirkwood_uart1_init(void); |
| 39 | void kirkwood_xor0_init(void); | ||
| 40 | void kirkwood_xor1_init(void); | ||
| 38 | 41 | ||
| 39 | extern struct sys_timer kirkwood_timer; | 42 | extern struct sys_timer kirkwood_timer; |
| 40 | 43 | ||
diff --git a/arch/arm/mach-kirkwood/include/mach/kirkwood.h b/arch/arm/mach-kirkwood/include/mach/kirkwood.h index d1336b41f0fb..5c69992295e8 100644 --- a/arch/arm/mach-kirkwood/include/mach/kirkwood.h +++ b/arch/arm/mach-kirkwood/include/mach/kirkwood.h | |||
| @@ -88,6 +88,15 @@ | |||
| 88 | 88 | ||
| 89 | #define USB_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x50000) | 89 | #define USB_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x50000) |
| 90 | 90 | ||
| 91 | #define XOR0_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x60800) | ||
| 92 | #define XOR0_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE | 0x60800) | ||
| 93 | #define XOR1_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x60900) | ||
| 94 | #define XOR1_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE | 0x60900) | ||
| 95 | #define XOR0_HIGH_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x60A00) | ||
| 96 | #define XOR0_HIGH_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE | 0x60A00) | ||
| 97 | #define XOR1_HIGH_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x60B00) | ||
| 98 | #define XOR1_HIGH_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE | 0x60B00) | ||
| 99 | |||
| 91 | #define GE00_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x70000) | 100 | #define GE00_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x70000) |
| 92 | #define GE01_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x74000) | 101 | #define GE01_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x74000) |
| 93 | 102 | ||
diff --git a/arch/arm/mach-kirkwood/irq.c b/arch/arm/mach-kirkwood/irq.c index 302bb2cf6669..5790643ffe07 100644 --- a/arch/arm/mach-kirkwood/irq.c +++ b/arch/arm/mach-kirkwood/irq.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
| 13 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
| 14 | #include <linux/io.h> | 14 | #include <linux/io.h> |
| 15 | #include <asm/plat-orion/irq.h> | 15 | #include <plat/irq.h> |
| 16 | #include "common.h" | 16 | #include "common.h" |
| 17 | 17 | ||
| 18 | void __init kirkwood_init_irq(void) | 18 | void __init kirkwood_init_irq(void) |
diff --git a/arch/arm/mach-kirkwood/pcie.c b/arch/arm/mach-kirkwood/pcie.c index 8282d0ff84bf..2195fa31f6b7 100644 --- a/arch/arm/mach-kirkwood/pcie.c +++ b/arch/arm/mach-kirkwood/pcie.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <linux/pci.h> | 12 | #include <linux/pci.h> |
| 13 | #include <linux/mbus.h> | 13 | #include <linux/mbus.h> |
| 14 | #include <asm/mach/pci.h> | 14 | #include <asm/mach/pci.h> |
| 15 | #include <asm/plat-orion/pcie.h> | 15 | #include <plat/pcie.h> |
| 16 | #include "common.h" | 16 | #include "common.h" |
| 17 | 17 | ||
| 18 | 18 | ||
diff --git a/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c b/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c index 182230a5d198..a3012d445971 100644 --- a/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c +++ b/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c | |||
| @@ -18,6 +18,9 @@ | |||
| 18 | #include <linux/timer.h> | 18 | #include <linux/timer.h> |
| 19 | #include <linux/ata_platform.h> | 19 | #include <linux/ata_platform.h> |
| 20 | #include <linux/mv643xx_eth.h> | 20 | #include <linux/mv643xx_eth.h> |
| 21 | #include <linux/spi/flash.h> | ||
| 22 | #include <linux/spi/spi.h> | ||
| 23 | #include <linux/spi/orion_spi.h> | ||
| 21 | #include <asm/mach-types.h> | 24 | #include <asm/mach-types.h> |
| 22 | #include <asm/mach/arch.h> | 25 | #include <asm/mach/arch.h> |
| 23 | #include <asm/mach/pci.h> | 26 | #include <asm/mach/pci.h> |
| @@ -34,6 +37,21 @@ static struct mv_sata_platform_data rd88f6192_sata_data = { | |||
| 34 | .n_ports = 2, | 37 | .n_ports = 2, |
| 35 | }; | 38 | }; |
| 36 | 39 | ||
| 40 | static const struct flash_platform_data rd88F6192_spi_slave_data = { | ||
| 41 | .type = "m25p128", | ||
| 42 | }; | ||
| 43 | |||
| 44 | static struct spi_board_info __initdata rd88F6192_spi_slave_info[] = { | ||
| 45 | { | ||
| 46 | .modalias = "m25p80", | ||
| 47 | .platform_data = &rd88F6192_spi_slave_data, | ||
| 48 | .irq = -1, | ||
| 49 | .max_speed_hz = 20000000, | ||
| 50 | .bus_num = 0, | ||
| 51 | .chip_select = 0, | ||
| 52 | }, | ||
| 53 | }; | ||
| 54 | |||
| 37 | static void __init rd88f6192_init(void) | 55 | static void __init rd88f6192_init(void) |
| 38 | { | 56 | { |
| 39 | /* | 57 | /* |
| @@ -45,7 +63,12 @@ static void __init rd88f6192_init(void) | |||
| 45 | kirkwood_ge00_init(&rd88f6192_ge00_data); | 63 | kirkwood_ge00_init(&rd88f6192_ge00_data); |
| 46 | kirkwood_rtc_init(); | 64 | kirkwood_rtc_init(); |
| 47 | kirkwood_sata_init(&rd88f6192_sata_data); | 65 | kirkwood_sata_init(&rd88f6192_sata_data); |
| 66 | spi_register_board_info(rd88F6192_spi_slave_info, | ||
| 67 | ARRAY_SIZE(rd88F6192_spi_slave_info)); | ||
| 68 | kirkwood_spi_init(); | ||
| 48 | kirkwood_uart0_init(); | 69 | kirkwood_uart0_init(); |
| 70 | kirkwood_xor0_init(); | ||
| 71 | kirkwood_xor1_init(); | ||
| 49 | } | 72 | } |
| 50 | 73 | ||
| 51 | static int __init rd88f6192_pci_init(void) | 74 | static int __init rd88f6192_pci_init(void) |
diff --git a/arch/arm/mach-kirkwood/rd88f6281-setup.c b/arch/arm/mach-kirkwood/rd88f6281-setup.c index d8a43018c7d3..d96487a0f18b 100644 --- a/arch/arm/mach-kirkwood/rd88f6281-setup.c +++ b/arch/arm/mach-kirkwood/rd88f6281-setup.c | |||
| @@ -23,7 +23,7 @@ | |||
| 23 | #include <asm/mach/arch.h> | 23 | #include <asm/mach/arch.h> |
| 24 | #include <asm/mach/pci.h> | 24 | #include <asm/mach/pci.h> |
| 25 | #include <mach/kirkwood.h> | 25 | #include <mach/kirkwood.h> |
| 26 | #include <asm/plat-orion/orion_nand.h> | 26 | #include <plat/orion_nand.h> |
| 27 | #include "common.h" | 27 | #include "common.h" |
| 28 | 28 | ||
| 29 | static struct mtd_partition rd88f6281_nand_parts[] = { | 29 | static struct mtd_partition rd88f6281_nand_parts[] = { |
diff --git a/arch/arm/mach-lh7a40x/include/mach/ssp.h b/arch/arm/mach-lh7a40x/include/mach/ssp.h index 132b1c4d5ce6..509916182e34 100644 --- a/arch/arm/mach-lh7a40x/include/mach/ssp.h +++ b/arch/arm/mach-lh7a40x/include/mach/ssp.h | |||
| @@ -1,5 +1,4 @@ | |||
| 1 | /* ssp.h | 1 | /* ssp.h |
| 2 | $Id$ | ||
| 3 | 2 | ||
| 4 | written by Marc Singer | 3 | written by Marc Singer |
| 5 | 6 Dec 2004 | 4 | 6 Dec 2004 |
diff --git a/arch/arm/mach-lh7a40x/lcd-panel.h b/arch/arm/mach-lh7a40x/lcd-panel.h index df6e38ed425b..a7f5027b2f78 100644 --- a/arch/arm/mach-lh7a40x/lcd-panel.h +++ b/arch/arm/mach-lh7a40x/lcd-panel.h | |||
| @@ -1,5 +1,4 @@ | |||
| 1 | /* lcd-panel.h | 1 | /* lcd-panel.h |
| 2 | $Id$ | ||
| 3 | 2 | ||
| 4 | written by Marc Singer | 3 | written by Marc Singer |
| 5 | 18 Jul 2005 | 4 | 18 Jul 2005 |
diff --git a/arch/arm/mach-loki/common.c b/arch/arm/mach-loki/common.c index e20cdbca1ebe..c0d2d9d12e74 100644 --- a/arch/arm/mach-loki/common.c +++ b/arch/arm/mach-loki/common.c | |||
| @@ -19,8 +19,8 @@ | |||
| 19 | #include <asm/mach/map.h> | 19 | #include <asm/mach/map.h> |
| 20 | #include <asm/mach/time.h> | 20 | #include <asm/mach/time.h> |
| 21 | #include <mach/loki.h> | 21 | #include <mach/loki.h> |
| 22 | #include <asm/plat-orion/orion_nand.h> | 22 | #include <plat/orion_nand.h> |
| 23 | #include <asm/plat-orion/time.h> | 23 | #include <plat/time.h> |
| 24 | #include "common.h" | 24 | #include "common.h" |
| 25 | 25 | ||
| 26 | /***************************************************************************** | 26 | /***************************************************************************** |
diff --git a/arch/arm/mach-loki/irq.c b/arch/arm/mach-loki/irq.c index d839af91fe03..5a487930cb2f 100644 --- a/arch/arm/mach-loki/irq.c +++ b/arch/arm/mach-loki/irq.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
| 13 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
| 14 | #include <asm/io.h> | 14 | #include <asm/io.h> |
| 15 | #include <asm/plat-orion/irq.h> | 15 | #include <plat/irq.h> |
| 16 | #include "common.h" | 16 | #include "common.h" |
| 17 | 17 | ||
| 18 | void __init loki_init_irq(void) | 18 | void __init loki_init_irq(void) |
diff --git a/arch/arm/mach-mv78xx0/common.c b/arch/arm/mach-mv78xx0/common.c index e633f9cb239f..953a26c469cb 100644 --- a/arch/arm/mach-mv78xx0/common.c +++ b/arch/arm/mach-mv78xx0/common.c | |||
| @@ -18,10 +18,10 @@ | |||
| 18 | #include <asm/mach/map.h> | 18 | #include <asm/mach/map.h> |
| 19 | #include <asm/mach/time.h> | 19 | #include <asm/mach/time.h> |
| 20 | #include <mach/mv78xx0.h> | 20 | #include <mach/mv78xx0.h> |
| 21 | #include <asm/plat-orion/cache-feroceon-l2.h> | 21 | #include <plat/cache-feroceon-l2.h> |
| 22 | #include <asm/plat-orion/ehci-orion.h> | 22 | #include <plat/ehci-orion.h> |
| 23 | #include <asm/plat-orion/orion_nand.h> | 23 | #include <plat/orion_nand.h> |
| 24 | #include <asm/plat-orion/time.h> | 24 | #include <plat/time.h> |
| 25 | #include "common.h" | 25 | #include "common.h" |
| 26 | 26 | ||
| 27 | 27 | ||
diff --git a/arch/arm/mach-mv78xx0/irq.c b/arch/arm/mach-mv78xx0/irq.c index 3198abf54c90..28248d37b999 100644 --- a/arch/arm/mach-mv78xx0/irq.c +++ b/arch/arm/mach-mv78xx0/irq.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
| 13 | #include <linux/pci.h> | 13 | #include <linux/pci.h> |
| 14 | #include <mach/mv78xx0.h> | 14 | #include <mach/mv78xx0.h> |
| 15 | #include <asm/plat-orion/irq.h> | 15 | #include <plat/irq.h> |
| 16 | #include "common.h" | 16 | #include "common.h" |
| 17 | 17 | ||
| 18 | void __init mv78xx0_init_irq(void) | 18 | void __init mv78xx0_init_irq(void) |
diff --git a/arch/arm/mach-mv78xx0/pcie.c b/arch/arm/mach-mv78xx0/pcie.c index b78e1443159f..430ea84d587d 100644 --- a/arch/arm/mach-mv78xx0/pcie.c +++ b/arch/arm/mach-mv78xx0/pcie.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <linux/pci.h> | 12 | #include <linux/pci.h> |
| 13 | #include <linux/mbus.h> | 13 | #include <linux/mbus.h> |
| 14 | #include <asm/mach/pci.h> | 14 | #include <asm/mach/pci.h> |
| 15 | #include <asm/plat-orion/pcie.h> | 15 | #include <plat/pcie.h> |
| 16 | #include "common.h" | 16 | #include "common.h" |
| 17 | 17 | ||
| 18 | struct pcie_port { | 18 | struct pcie_port { |
diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c index 168eeacaa4c0..7b11e552bc5a 100644 --- a/arch/arm/mach-orion5x/common.c +++ b/arch/arm/mach-orion5x/common.c | |||
| @@ -26,9 +26,10 @@ | |||
| 26 | #include <asm/mach/time.h> | 26 | #include <asm/mach/time.h> |
| 27 | #include <mach/hardware.h> | 27 | #include <mach/hardware.h> |
| 28 | #include <mach/orion5x.h> | 28 | #include <mach/orion5x.h> |
| 29 | #include <asm/plat-orion/ehci-orion.h> | 29 | #include <plat/ehci-orion.h> |
| 30 | #include <asm/plat-orion/orion_nand.h> | 30 | #include <plat/mv_xor.h> |
| 31 | #include <asm/plat-orion/time.h> | 31 | #include <plat/orion_nand.h> |
| 32 | #include <plat/time.h> | ||
| 32 | #include "common.h" | 33 | #include "common.h" |
| 33 | 34 | ||
| 34 | /***************************************************************************** | 35 | /***************************************************************************** |
| @@ -355,6 +356,103 @@ void __init orion5x_uart1_init(void) | |||
| 355 | 356 | ||
| 356 | 357 | ||
| 357 | /***************************************************************************** | 358 | /***************************************************************************** |
| 359 | * XOR engine | ||
| 360 | ****************************************************************************/ | ||
| 361 | static struct resource orion5x_xor_shared_resources[] = { | ||
| 362 | { | ||
| 363 | .name = "xor low", | ||
| 364 | .start = ORION5X_XOR_PHYS_BASE, | ||
| 365 | .end = ORION5X_XOR_PHYS_BASE + 0xff, | ||
| 366 | .flags = IORESOURCE_MEM, | ||
| 367 | }, { | ||
| 368 | .name = "xor high", | ||
| 369 | .start = ORION5X_XOR_PHYS_BASE + 0x200, | ||
| 370 | .end = ORION5X_XOR_PHYS_BASE + 0x2ff, | ||
| 371 | .flags = IORESOURCE_MEM, | ||
| 372 | }, | ||
| 373 | }; | ||
| 374 | |||
| 375 | static struct platform_device orion5x_xor_shared = { | ||
| 376 | .name = MV_XOR_SHARED_NAME, | ||
| 377 | .id = 0, | ||
| 378 | .num_resources = ARRAY_SIZE(orion5x_xor_shared_resources), | ||
| 379 | .resource = orion5x_xor_shared_resources, | ||
| 380 | }; | ||
| 381 | |||
| 382 | static u64 orion5x_xor_dmamask = DMA_32BIT_MASK; | ||
| 383 | |||
| 384 | static struct resource orion5x_xor0_resources[] = { | ||
| 385 | [0] = { | ||
| 386 | .start = IRQ_ORION5X_XOR0, | ||
| 387 | .end = IRQ_ORION5X_XOR0, | ||
| 388 | .flags = IORESOURCE_IRQ, | ||
| 389 | }, | ||
| 390 | }; | ||
| 391 | |||
| 392 | static struct mv_xor_platform_data orion5x_xor0_data = { | ||
| 393 | .shared = &orion5x_xor_shared, | ||
| 394 | .hw_id = 0, | ||
| 395 | .pool_size = PAGE_SIZE, | ||
| 396 | }; | ||
| 397 | |||
| 398 | static struct platform_device orion5x_xor0_channel = { | ||
| 399 | .name = MV_XOR_NAME, | ||
| 400 | .id = 0, | ||
| 401 | .num_resources = ARRAY_SIZE(orion5x_xor0_resources), | ||
| 402 | .resource = orion5x_xor0_resources, | ||
| 403 | .dev = { | ||
| 404 | .dma_mask = &orion5x_xor_dmamask, | ||
| 405 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
| 406 | .platform_data = (void *)&orion5x_xor0_data, | ||
| 407 | }, | ||
| 408 | }; | ||
| 409 | |||
| 410 | static struct resource orion5x_xor1_resources[] = { | ||
| 411 | [0] = { | ||
| 412 | .start = IRQ_ORION5X_XOR1, | ||
| 413 | .end = IRQ_ORION5X_XOR1, | ||
| 414 | .flags = IORESOURCE_IRQ, | ||
| 415 | }, | ||
| 416 | }; | ||
| 417 | |||
| 418 | static struct mv_xor_platform_data orion5x_xor1_data = { | ||
| 419 | .shared = &orion5x_xor_shared, | ||
| 420 | .hw_id = 1, | ||
| 421 | .pool_size = PAGE_SIZE, | ||
| 422 | }; | ||
| 423 | |||
| 424 | static struct platform_device orion5x_xor1_channel = { | ||
| 425 | .name = MV_XOR_NAME, | ||
| 426 | .id = 1, | ||
| 427 | .num_resources = ARRAY_SIZE(orion5x_xor1_resources), | ||
| 428 | .resource = orion5x_xor1_resources, | ||
| 429 | .dev = { | ||
| 430 | .dma_mask = &orion5x_xor_dmamask, | ||
| 431 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
| 432 | .platform_data = (void *)&orion5x_xor1_data, | ||
| 433 | }, | ||
| 434 | }; | ||
| 435 | |||
| 436 | void __init orion5x_xor_init(void) | ||
| 437 | { | ||
| 438 | platform_device_register(&orion5x_xor_shared); | ||
| 439 | |||
| 440 | /* | ||
| 441 | * two engines can't do memset simultaneously, this limitation | ||
| 442 | * satisfied by removing memset support from one of the engines. | ||
| 443 | */ | ||
| 444 | dma_cap_set(DMA_MEMCPY, orion5x_xor0_data.cap_mask); | ||
| 445 | dma_cap_set(DMA_XOR, orion5x_xor0_data.cap_mask); | ||
| 446 | platform_device_register(&orion5x_xor0_channel); | ||
| 447 | |||
| 448 | dma_cap_set(DMA_MEMCPY, orion5x_xor1_data.cap_mask); | ||
| 449 | dma_cap_set(DMA_MEMSET, orion5x_xor1_data.cap_mask); | ||
| 450 | dma_cap_set(DMA_XOR, orion5x_xor1_data.cap_mask); | ||
| 451 | platform_device_register(&orion5x_xor1_channel); | ||
| 452 | } | ||
| 453 | |||
| 454 | |||
| 455 | /***************************************************************************** | ||
| 358 | * Time handling | 456 | * Time handling |
| 359 | ****************************************************************************/ | 457 | ****************************************************************************/ |
| 360 | static void orion5x_timer_init(void) | 458 | static void orion5x_timer_init(void) |
| @@ -382,6 +480,8 @@ static void __init orion5x_id(u32 *dev, u32 *rev, char **dev_name) | |||
| 382 | *dev_name = "MV88F5281-D2"; | 480 | *dev_name = "MV88F5281-D2"; |
| 383 | } else if (*rev == MV88F5281_REV_D1) { | 481 | } else if (*rev == MV88F5281_REV_D1) { |
| 384 | *dev_name = "MV88F5281-D1"; | 482 | *dev_name = "MV88F5281-D1"; |
| 483 | } else if (*rev == MV88F5281_REV_D0) { | ||
| 484 | *dev_name = "MV88F5281-D0"; | ||
| 385 | } else { | 485 | } else { |
| 386 | *dev_name = "MV88F5281-Rev-Unsupported"; | 486 | *dev_name = "MV88F5281-Rev-Unsupported"; |
| 387 | } | 487 | } |
| @@ -416,6 +516,15 @@ void __init orion5x_init(void) | |||
| 416 | * Setup Orion address map | 516 | * Setup Orion address map |
| 417 | */ | 517 | */ |
| 418 | orion5x_setup_cpu_mbus_bridge(); | 518 | orion5x_setup_cpu_mbus_bridge(); |
| 519 | |||
| 520 | /* | ||
| 521 | * Don't issue "Wait for Interrupt" instruction if we are | ||
| 522 | * running on D0 5281 silicon. | ||
| 523 | */ | ||
| 524 | if (dev == MV88F5281_DEV_ID && rev == MV88F5281_REV_D0) { | ||
| 525 | printk(KERN_INFO "Orion: Applying 5281 D0 WFI workaround.\n"); | ||
| 526 | disable_hlt(); | ||
| 527 | } | ||
| 419 | } | 528 | } |
| 420 | 529 | ||
| 421 | /* | 530 | /* |
diff --git a/arch/arm/mach-orion5x/common.h b/arch/arm/mach-orion5x/common.h index f72cf0e77544..e75bd7004b94 100644 --- a/arch/arm/mach-orion5x/common.h +++ b/arch/arm/mach-orion5x/common.h | |||
| @@ -32,6 +32,7 @@ void orion5x_i2c_init(void); | |||
| 32 | void orion5x_sata_init(struct mv_sata_platform_data *sata_data); | 32 | void orion5x_sata_init(struct mv_sata_platform_data *sata_data); |
| 33 | void orion5x_uart0_init(void); | 33 | void orion5x_uart0_init(void); |
| 34 | void orion5x_uart1_init(void); | 34 | void orion5x_uart1_init(void); |
| 35 | void orion5x_xor_init(void); | ||
| 35 | 36 | ||
| 36 | /* | 37 | /* |
| 37 | * PCIe/PCI functions. | 38 | * PCIe/PCI functions. |
diff --git a/arch/arm/mach-orion5x/db88f5281-setup.c b/arch/arm/mach-orion5x/db88f5281-setup.c index 48ce6d0e0020..ff13e9060b18 100644 --- a/arch/arm/mach-orion5x/db88f5281-setup.c +++ b/arch/arm/mach-orion5x/db88f5281-setup.c | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | #include <asm/mach/arch.h> | 25 | #include <asm/mach/arch.h> |
| 26 | #include <asm/mach/pci.h> | 26 | #include <asm/mach/pci.h> |
| 27 | #include <mach/orion5x.h> | 27 | #include <mach/orion5x.h> |
| 28 | #include <asm/plat-orion/orion_nand.h> | 28 | #include <plat/orion_nand.h> |
| 29 | #include "common.h" | 29 | #include "common.h" |
| 30 | #include "mpp.h" | 30 | #include "mpp.h" |
| 31 | 31 | ||
diff --git a/arch/arm/mach-orion5x/include/mach/orion5x.h b/arch/arm/mach-orion5x/include/mach/orion5x.h index f52a7d65bec2..61eb74a88862 100644 --- a/arch/arm/mach-orion5x/include/mach/orion5x.h +++ b/arch/arm/mach-orion5x/include/mach/orion5x.h | |||
| @@ -73,6 +73,7 @@ | |||
| 73 | #define MV88F5182_REV_A2 2 | 73 | #define MV88F5182_REV_A2 2 |
| 74 | /* Orion-2 (88F5281) */ | 74 | /* Orion-2 (88F5281) */ |
| 75 | #define MV88F5281_DEV_ID 0x5281 | 75 | #define MV88F5281_DEV_ID 0x5281 |
| 76 | #define MV88F5281_REV_D0 4 | ||
| 76 | #define MV88F5281_REV_D1 5 | 77 | #define MV88F5281_REV_D1 5 |
| 77 | #define MV88F5281_REV_D2 6 | 78 | #define MV88F5281_REV_D2 6 |
| 78 | 79 | ||
| @@ -105,6 +106,10 @@ | |||
| 105 | #define ORION5X_USB0_VIRT_BASE (ORION5X_REGS_VIRT_BASE | 0x50000) | 106 | #define ORION5X_USB0_VIRT_BASE (ORION5X_REGS_VIRT_BASE | 0x50000) |
| 106 | #define ORION5X_USB0_REG(x) (ORION5X_USB0_VIRT_BASE | (x)) | 107 | #define ORION5X_USB0_REG(x) (ORION5X_USB0_VIRT_BASE | (x)) |
| 107 | 108 | ||
| 109 | #define ORION5X_XOR_PHYS_BASE (ORION5X_REGS_PHYS_BASE | 0x60900) | ||
| 110 | #define ORION5X_XOR_VIRT_BASE (ORION5X_REGS_VIRT_BASE | 0x60900) | ||
| 111 | #define ORION5X_XOR_REG(x) (ORION5X_XOR_VIRT_BASE | (x)) | ||
| 112 | |||
| 108 | #define ORION5X_ETH_PHYS_BASE (ORION5X_REGS_PHYS_BASE | 0x70000) | 113 | #define ORION5X_ETH_PHYS_BASE (ORION5X_REGS_PHYS_BASE | 0x70000) |
| 109 | #define ORION5X_ETH_VIRT_BASE (ORION5X_REGS_VIRT_BASE | 0x70000) | 114 | #define ORION5X_ETH_VIRT_BASE (ORION5X_REGS_VIRT_BASE | 0x70000) |
| 110 | #define ORION5X_ETH_REG(x) (ORION5X_ETH_VIRT_BASE | (x)) | 115 | #define ORION5X_ETH_REG(x) (ORION5X_ETH_VIRT_BASE | (x)) |
diff --git a/arch/arm/mach-orion5x/irq.c b/arch/arm/mach-orion5x/irq.c index cc2a017fd2a9..2545ff9e5830 100644 --- a/arch/arm/mach-orion5x/irq.c +++ b/arch/arm/mach-orion5x/irq.c | |||
| @@ -16,7 +16,7 @@ | |||
| 16 | #include <asm/gpio.h> | 16 | #include <asm/gpio.h> |
| 17 | #include <asm/io.h> | 17 | #include <asm/io.h> |
| 18 | #include <mach/orion5x.h> | 18 | #include <mach/orion5x.h> |
| 19 | #include <asm/plat-orion/irq.h> | 19 | #include <plat/irq.h> |
| 20 | #include "common.h" | 20 | #include "common.h" |
| 21 | 21 | ||
| 22 | /***************************************************************************** | 22 | /***************************************************************************** |
diff --git a/arch/arm/mach-orion5x/kurobox_pro-setup.c b/arch/arm/mach-orion5x/kurobox_pro-setup.c index 0caaaac74bc1..cb72f1bb9cb7 100644 --- a/arch/arm/mach-orion5x/kurobox_pro-setup.c +++ b/arch/arm/mach-orion5x/kurobox_pro-setup.c | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | #include <asm/mach/arch.h> | 25 | #include <asm/mach/arch.h> |
| 26 | #include <asm/mach/pci.h> | 26 | #include <asm/mach/pci.h> |
| 27 | #include <mach/orion5x.h> | 27 | #include <mach/orion5x.h> |
| 28 | #include <asm/plat-orion/orion_nand.h> | 28 | #include <plat/orion_nand.h> |
| 29 | #include "common.h" | 29 | #include "common.h" |
| 30 | #include "mpp.h" | 30 | #include "mpp.h" |
| 31 | 31 | ||
| @@ -356,6 +356,7 @@ static void __init kurobox_pro_init(void) | |||
| 356 | orion5x_sata_init(&kurobox_pro_sata_data); | 356 | orion5x_sata_init(&kurobox_pro_sata_data); |
| 357 | orion5x_uart0_init(); | 357 | orion5x_uart0_init(); |
| 358 | orion5x_uart1_init(); | 358 | orion5x_uart1_init(); |
| 359 | orion5x_xor_init(); | ||
| 359 | 360 | ||
| 360 | orion5x_setup_dev_boot_win(KUROBOX_PRO_NOR_BOOT_BASE, | 361 | orion5x_setup_dev_boot_win(KUROBOX_PRO_NOR_BOOT_BASE, |
| 361 | KUROBOX_PRO_NOR_BOOT_SIZE); | 362 | KUROBOX_PRO_NOR_BOOT_SIZE); |
diff --git a/arch/arm/mach-orion5x/mss2-setup.c b/arch/arm/mach-orion5x/mss2-setup.c index 4403cc963d66..53ff1893b883 100644 --- a/arch/arm/mach-orion5x/mss2-setup.c +++ b/arch/arm/mach-orion5x/mss2-setup.c | |||
| @@ -239,6 +239,7 @@ static void __init mss2_init(void) | |||
| 239 | orion5x_i2c_init(); | 239 | orion5x_i2c_init(); |
| 240 | orion5x_sata_init(&mss2_sata_data); | 240 | orion5x_sata_init(&mss2_sata_data); |
| 241 | orion5x_uart0_init(); | 241 | orion5x_uart0_init(); |
| 242 | orion5x_xor_init(); | ||
| 242 | 243 | ||
| 243 | orion5x_setup_dev_boot_win(MSS2_NOR_BOOT_BASE, MSS2_NOR_BOOT_SIZE); | 244 | orion5x_setup_dev_boot_win(MSS2_NOR_BOOT_BASE, MSS2_NOR_BOOT_SIZE); |
| 244 | platform_device_register(&mss2_nor_flash); | 245 | platform_device_register(&mss2_nor_flash); |
diff --git a/arch/arm/mach-orion5x/mv2120-setup.c b/arch/arm/mach-orion5x/mv2120-setup.c index 67b2c0df615f..978d4d599396 100644 --- a/arch/arm/mach-orion5x/mv2120-setup.c +++ b/arch/arm/mach-orion5x/mv2120-setup.c | |||
| @@ -203,6 +203,7 @@ static void __init mv2120_init(void) | |||
| 203 | orion5x_i2c_init(); | 203 | orion5x_i2c_init(); |
| 204 | orion5x_sata_init(&mv2120_sata_data); | 204 | orion5x_sata_init(&mv2120_sata_data); |
| 205 | orion5x_uart0_init(); | 205 | orion5x_uart0_init(); |
| 206 | orion5x_xor_init(); | ||
| 206 | 207 | ||
| 207 | orion5x_setup_dev_boot_win(MV2120_NOR_BOOT_BASE, MV2120_NOR_BOOT_SIZE); | 208 | orion5x_setup_dev_boot_win(MV2120_NOR_BOOT_BASE, MV2120_NOR_BOOT_SIZE); |
| 208 | platform_device_register(&mv2120_nor_flash); | 209 | platform_device_register(&mv2120_nor_flash); |
diff --git a/arch/arm/mach-orion5x/pci.c b/arch/arm/mach-orion5x/pci.c index 256a4f680935..fbceecc4b7ec 100644 --- a/arch/arm/mach-orion5x/pci.c +++ b/arch/arm/mach-orion5x/pci.c | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | #include <linux/pci.h> | 14 | #include <linux/pci.h> |
| 15 | #include <linux/mbus.h> | 15 | #include <linux/mbus.h> |
| 16 | #include <asm/mach/pci.h> | 16 | #include <asm/mach/pci.h> |
| 17 | #include <asm/plat-orion/pcie.h> | 17 | #include <plat/pcie.h> |
| 18 | #include "common.h" | 18 | #include "common.h" |
| 19 | 19 | ||
| 20 | /***************************************************************************** | 20 | /***************************************************************************** |
diff --git a/arch/arm/mach-orion5x/rd88f5182-setup.c b/arch/arm/mach-orion5x/rd88f5182-setup.c index 8771cb76f0dc..4c3bcd76ac85 100644 --- a/arch/arm/mach-orion5x/rd88f5182-setup.c +++ b/arch/arm/mach-orion5x/rd88f5182-setup.c | |||
| @@ -292,6 +292,7 @@ static void __init rd88f5182_init(void) | |||
| 292 | orion5x_i2c_init(); | 292 | orion5x_i2c_init(); |
| 293 | orion5x_sata_init(&rd88f5182_sata_data); | 293 | orion5x_sata_init(&rd88f5182_sata_data); |
| 294 | orion5x_uart0_init(); | 294 | orion5x_uart0_init(); |
| 295 | orion5x_xor_init(); | ||
| 295 | 296 | ||
| 296 | orion5x_setup_dev_boot_win(RD88F5182_NOR_BOOT_BASE, | 297 | orion5x_setup_dev_boot_win(RD88F5182_NOR_BOOT_BASE, |
| 297 | RD88F5182_NOR_BOOT_SIZE); | 298 | RD88F5182_NOR_BOOT_SIZE); |
diff --git a/arch/arm/mach-orion5x/ts209-setup.c b/arch/arm/mach-orion5x/ts209-setup.c index 809132de31d2..dd657163cd8d 100644 --- a/arch/arm/mach-orion5x/ts209-setup.c +++ b/arch/arm/mach-orion5x/ts209-setup.c | |||
| @@ -207,12 +207,12 @@ static struct i2c_board_info __initdata qnap_ts209_i2c_rtc = { | |||
| 207 | 207 | ||
| 208 | static struct gpio_keys_button qnap_ts209_buttons[] = { | 208 | static struct gpio_keys_button qnap_ts209_buttons[] = { |
| 209 | { | 209 | { |
| 210 | .code = KEY_RESTART, | 210 | .code = KEY_COPY, |
| 211 | .gpio = QNAP_TS209_GPIO_KEY_MEDIA, | 211 | .gpio = QNAP_TS209_GPIO_KEY_MEDIA, |
| 212 | .desc = "USB Copy Button", | 212 | .desc = "USB Copy Button", |
| 213 | .active_low = 1, | 213 | .active_low = 1, |
| 214 | }, { | 214 | }, { |
| 215 | .code = KEY_POWER, | 215 | .code = KEY_RESTART, |
| 216 | .gpio = QNAP_TS209_GPIO_KEY_RESET, | 216 | .gpio = QNAP_TS209_GPIO_KEY_RESET, |
| 217 | .desc = "Reset Button", | 217 | .desc = "Reset Button", |
| 218 | .active_low = 1, | 218 | .active_low = 1, |
| @@ -296,6 +296,7 @@ static void __init qnap_ts209_init(void) | |||
| 296 | orion5x_i2c_init(); | 296 | orion5x_i2c_init(); |
| 297 | orion5x_sata_init(&qnap_ts209_sata_data); | 297 | orion5x_sata_init(&qnap_ts209_sata_data); |
| 298 | orion5x_uart0_init(); | 298 | orion5x_uart0_init(); |
| 299 | orion5x_xor_init(); | ||
| 299 | 300 | ||
| 300 | orion5x_setup_dev_boot_win(QNAP_TS209_NOR_BOOT_BASE, | 301 | orion5x_setup_dev_boot_win(QNAP_TS209_NOR_BOOT_BASE, |
| 301 | QNAP_TS209_NOR_BOOT_SIZE); | 302 | QNAP_TS209_NOR_BOOT_SIZE); |
diff --git a/arch/arm/mach-orion5x/ts409-setup.c b/arch/arm/mach-orion5x/ts409-setup.c index 6053e76ac967..b27d2b762081 100644 --- a/arch/arm/mach-orion5x/ts409-setup.c +++ b/arch/arm/mach-orion5x/ts409-setup.c | |||
| @@ -3,6 +3,9 @@ | |||
| 3 | * | 3 | * |
| 4 | * Maintainer: Sylver Bruneau <sylver.bruneau@gmail.com> | 4 | * Maintainer: Sylver Bruneau <sylver.bruneau@gmail.com> |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2008 Sylver Bruneau <sylver.bruneau@gmail.com> | ||
| 7 | * Copyright (C) 2008 Martin Michlmayr <tbm@cyrius.com> | ||
| 8 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | 9 | * This program is free software; you can redistribute it and/or |
| 7 | * modify it under the terms of the GNU General Public License | 10 | * modify it under the terms of the GNU General Public License |
| 8 | * as published by the Free Software Foundation; either version | 11 | * as published by the Free Software Foundation; either version |
| @@ -16,6 +19,7 @@ | |||
| 16 | #include <linux/irq.h> | 19 | #include <linux/irq.h> |
| 17 | #include <linux/mtd/physmap.h> | 20 | #include <linux/mtd/physmap.h> |
| 18 | #include <linux/mv643xx_eth.h> | 21 | #include <linux/mv643xx_eth.h> |
| 22 | #include <linux/leds.h> | ||
| 19 | #include <linux/gpio_keys.h> | 23 | #include <linux/gpio_keys.h> |
| 20 | #include <linux/input.h> | 24 | #include <linux/input.h> |
| 21 | #include <linux/i2c.h> | 25 | #include <linux/i2c.h> |
| @@ -162,16 +166,59 @@ static struct i2c_board_info __initdata qnap_ts409_i2c_rtc = { | |||
| 162 | I2C_BOARD_INFO("s35390a", 0x30), | 166 | I2C_BOARD_INFO("s35390a", 0x30), |
| 163 | }; | 167 | }; |
| 164 | 168 | ||
| 169 | /***************************************************************************** | ||
| 170 | * LEDs attached to GPIO | ||
| 171 | ****************************************************************************/ | ||
| 172 | |||
| 173 | static struct gpio_led ts409_led_pins[] = { | ||
| 174 | { | ||
| 175 | .name = "ts409:red:sata1", | ||
| 176 | .gpio = 4, | ||
| 177 | .active_low = 1, | ||
| 178 | }, { | ||
| 179 | .name = "ts409:red:sata2", | ||
| 180 | .gpio = 5, | ||
| 181 | .active_low = 1, | ||
| 182 | }, { | ||
| 183 | .name = "ts409:red:sata3", | ||
| 184 | .gpio = 6, | ||
| 185 | .active_low = 1, | ||
| 186 | }, { | ||
| 187 | .name = "ts409:red:sata4", | ||
| 188 | .gpio = 7, | ||
| 189 | .active_low = 1, | ||
| 190 | }, | ||
| 191 | }; | ||
| 192 | |||
| 193 | static struct gpio_led_platform_data ts409_led_data = { | ||
| 194 | .leds = ts409_led_pins, | ||
| 195 | .num_leds = ARRAY_SIZE(ts409_led_pins), | ||
| 196 | }; | ||
| 197 | |||
| 198 | static struct platform_device ts409_leds = { | ||
| 199 | .name = "leds-gpio", | ||
| 200 | .id = -1, | ||
| 201 | .dev = { | ||
| 202 | .platform_data = &ts409_led_data, | ||
| 203 | }, | ||
| 204 | }; | ||
| 205 | |||
| 165 | /**************************************************************************** | 206 | /**************************************************************************** |
| 166 | * GPIO Attached Keys | 207 | * GPIO Attached Keys |
| 167 | * Power button is attached to the PIC microcontroller | 208 | * Power button is attached to the PIC microcontroller |
| 168 | ****************************************************************************/ | 209 | ****************************************************************************/ |
| 169 | 210 | ||
| 211 | #define QNAP_TS409_GPIO_KEY_RESET 14 | ||
| 170 | #define QNAP_TS409_GPIO_KEY_MEDIA 15 | 212 | #define QNAP_TS409_GPIO_KEY_MEDIA 15 |
| 171 | 213 | ||
| 172 | static struct gpio_keys_button qnap_ts409_buttons[] = { | 214 | static struct gpio_keys_button qnap_ts409_buttons[] = { |
| 173 | { | 215 | { |
| 174 | .code = KEY_RESTART, | 216 | .code = KEY_RESTART, |
| 217 | .gpio = QNAP_TS409_GPIO_KEY_RESET, | ||
| 218 | .desc = "Reset Button", | ||
| 219 | .active_low = 1, | ||
| 220 | }, { | ||
| 221 | .code = KEY_COPY, | ||
| 175 | .gpio = QNAP_TS409_GPIO_KEY_MEDIA, | 222 | .gpio = QNAP_TS409_GPIO_KEY_MEDIA, |
| 176 | .desc = "USB Copy Button", | 223 | .desc = "USB Copy Button", |
| 177 | .active_low = 1, | 224 | .active_low = 1, |
| @@ -255,6 +302,7 @@ static void __init qnap_ts409_init(void) | |||
| 255 | if (qnap_ts409_i2c_rtc.irq == 0) | 302 | if (qnap_ts409_i2c_rtc.irq == 0) |
| 256 | pr_warning("qnap_ts409_init: failed to get RTC IRQ\n"); | 303 | pr_warning("qnap_ts409_init: failed to get RTC IRQ\n"); |
| 257 | i2c_register_board_info(0, &qnap_ts409_i2c_rtc, 1); | 304 | i2c_register_board_info(0, &qnap_ts409_i2c_rtc, 1); |
| 305 | platform_device_register(&ts409_leds); | ||
| 258 | 306 | ||
| 259 | /* register tsx09 specific power-off method */ | 307 | /* register tsx09 specific power-off method */ |
| 260 | pm_power_off = qnap_tsx09_power_off; | 308 | pm_power_off = qnap_tsx09_power_off; |
diff --git a/arch/arm/mach-orion5x/ts78xx-setup.c b/arch/arm/mach-orion5x/ts78xx-setup.c index 014916a28fdc..ae0a5dccd2a1 100644 --- a/arch/arm/mach-orion5x/ts78xx-setup.c +++ b/arch/arm/mach-orion5x/ts78xx-setup.c | |||
| @@ -256,6 +256,7 @@ static void __init ts78xx_init(void) | |||
| 256 | orion5x_sata_init(&ts78xx_sata_data); | 256 | orion5x_sata_init(&ts78xx_sata_data); |
| 257 | orion5x_uart0_init(); | 257 | orion5x_uart0_init(); |
| 258 | orion5x_uart1_init(); | 258 | orion5x_uart1_init(); |
| 259 | orion5x_xor_init(); | ||
| 259 | 260 | ||
| 260 | orion5x_setup_dev_boot_win(TS78XX_NOR_BOOT_BASE, | 261 | orion5x_setup_dev_boot_win(TS78XX_NOR_BOOT_BASE, |
| 261 | TS78XX_NOR_BOOT_SIZE); | 262 | TS78XX_NOR_BOOT_SIZE); |
diff --git a/arch/arm/mach-pxa/include/mach/mtd-xip.h b/arch/arm/mach-pxa/include/mach/mtd-xip.h index 351f32f13ce4..4d452fcb1508 100644 --- a/arch/arm/mach-pxa/include/mach/mtd-xip.h +++ b/arch/arm/mach-pxa/include/mach/mtd-xip.h | |||
| @@ -10,8 +10,6 @@ | |||
| 10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
| 11 | * it under the terms of the GNU General Public License version 2 as | 11 | * it under the terms of the GNU General Public License version 2 as |
| 12 | * published by the Free Software Foundation. | 12 | * published by the Free Software Foundation. |
| 13 | * | ||
| 14 | * $Id: xip.h,v 1.2 2004/12/01 15:49:10 nico Exp $ | ||
| 15 | */ | 13 | */ |
| 16 | 14 | ||
| 17 | #ifndef __ARCH_PXA_MTD_XIP_H__ | 15 | #ifndef __ARCH_PXA_MTD_XIP_H__ |
diff --git a/arch/arm/mach-pxa/include/mach/poodle.h b/arch/arm/mach-pxa/include/mach/poodle.h index 8956afe8195e..67debc47e8c6 100644 --- a/arch/arm/mach-pxa/include/mach/poodle.h +++ b/arch/arm/mach-pxa/include/mach/poodle.h | |||
| @@ -70,6 +70,12 @@ | |||
| 70 | #define POODLE_SCOOP_IO_DIR ( POODLE_SCOOP_VPEN | POODLE_SCOOP_HS_OUT ) | 70 | #define POODLE_SCOOP_IO_DIR ( POODLE_SCOOP_VPEN | POODLE_SCOOP_HS_OUT ) |
| 71 | #define POODLE_SCOOP_IO_OUT ( 0 ) | 71 | #define POODLE_SCOOP_IO_OUT ( 0 ) |
| 72 | 72 | ||
| 73 | #define POODLE_LOCOMO_GPIO_AMP_ON LOCOMO_GPIO(8) | ||
| 74 | #define POODLE_LOCOMO_GPIO_MUTE_L LOCOMO_GPIO(10) | ||
| 75 | #define POODLE_LOCOMO_GPIO_MUTE_R LOCOMO_GPIO(11) | ||
| 76 | #define POODLE_LOCOMO_GPIO_232VCC_ON LOCOMO_GPIO(12) | ||
| 77 | #define POODLE_LOCOMO_GPIO_JK_B LOCOMO_GPIO(13) | ||
| 78 | |||
| 73 | extern struct platform_device poodle_locomo_device; | 79 | extern struct platform_device poodle_locomo_device; |
| 74 | 80 | ||
| 75 | #endif /* __ASM_ARCH_POODLE_H */ | 81 | #endif /* __ASM_ARCH_POODLE_H */ |
diff --git a/arch/arm/mach-pxa/include/mach/pxafb.h b/arch/arm/mach-pxa/include/mach/pxafb.h index 65447549616f..8e591118371e 100644 --- a/arch/arm/mach-pxa/include/mach/pxafb.h +++ b/arch/arm/mach-pxa/include/mach/pxafb.h | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | * bits 10-17 : for AC Bias Pin Frequency | 28 | * bits 10-17 : for AC Bias Pin Frequency |
| 29 | * bit 18 : for output enable polarity | 29 | * bit 18 : for output enable polarity |
| 30 | * bit 19 : for pixel clock edge | 30 | * bit 19 : for pixel clock edge |
| 31 | * bit 20 : for output pixel format when base is RGBT16 | ||
| 31 | */ | 32 | */ |
| 32 | #define LCD_CONN_TYPE(_x) ((_x) & 0x0f) | 33 | #define LCD_CONN_TYPE(_x) ((_x) & 0x0f) |
| 33 | #define LCD_CONN_WIDTH(_x) (((_x) >> 4) & 0x1f) | 34 | #define LCD_CONN_WIDTH(_x) (((_x) >> 4) & 0x1f) |
| @@ -53,10 +54,11 @@ | |||
| 53 | #define LCD_SMART_PANEL_18BPP ((18 << 4) | LCD_TYPE_SMART_PANEL) | 54 | #define LCD_SMART_PANEL_18BPP ((18 << 4) | LCD_TYPE_SMART_PANEL) |
| 54 | 55 | ||
| 55 | #define LCD_AC_BIAS_FREQ(x) (((x) & 0xff) << 10) | 56 | #define LCD_AC_BIAS_FREQ(x) (((x) & 0xff) << 10) |
| 56 | #define LCD_BIAS_ACTIVE_HIGH (0 << 17) | 57 | #define LCD_BIAS_ACTIVE_HIGH (0 << 18) |
| 57 | #define LCD_BIAS_ACTIVE_LOW (1 << 17) | 58 | #define LCD_BIAS_ACTIVE_LOW (1 << 18) |
| 58 | #define LCD_PCLK_EDGE_RISE (0 << 18) | 59 | #define LCD_PCLK_EDGE_RISE (0 << 19) |
| 59 | #define LCD_PCLK_EDGE_FALL (1 << 18) | 60 | #define LCD_PCLK_EDGE_FALL (1 << 19) |
| 61 | #define LCD_ALTERNATE_MAPPING (1 << 20) | ||
| 60 | 62 | ||
| 61 | /* | 63 | /* |
| 62 | * This structure describes the machine which we are running on. | 64 | * This structure describes the machine which we are running on. |
diff --git a/arch/arm/mach-s3c2410/include/mach/regs-clock.h b/arch/arm/mach-s3c2410/include/mach/regs-clock.h index d583688458a4..b3f90aa78076 100644 --- a/arch/arm/mach-s3c2410/include/mach/regs-clock.h +++ b/arch/arm/mach-s3c2410/include/mach/regs-clock.h | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| 13 | #ifndef __ASM_ARM_REGS_CLOCK | 13 | #ifndef __ASM_ARM_REGS_CLOCK |
| 14 | #define __ASM_ARM_REGS_CLOCK "$Id: clock.h,v 1.4 2003/04/30 14:50:51 ben Exp $" | 14 | #define __ASM_ARM_REGS_CLOCK |
| 15 | 15 | ||
| 16 | #define S3C2410_CLKREG(x) ((x) + S3C24XX_VA_CLKPWR) | 16 | #define S3C2410_CLKREG(x) ((x) + S3C24XX_VA_CLKPWR) |
| 17 | 17 | ||
diff --git a/arch/arm/mach-s3c2410/include/mach/regs-gpio.h b/arch/arm/mach-s3c2410/include/mach/regs-gpio.h index 30bec027f5fa..528080ceac44 100644 --- a/arch/arm/mach-s3c2410/include/mach/regs-gpio.h +++ b/arch/arm/mach-s3c2410/include/mach/regs-gpio.h | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | 13 | ||
| 14 | #ifndef __ASM_ARCH_REGS_GPIO_H | 14 | #ifndef __ASM_ARCH_REGS_GPIO_H |
| 15 | #define __ASM_ARCH_REGS_GPIO_H "$Id: gpio.h,v 1.5 2003/05/19 12:51:08 ben Exp $" | 15 | #define __ASM_ARCH_REGS_GPIO_H |
| 16 | 16 | ||
| 17 | #define S3C2410_GPIONO(bank,offset) ((bank) + (offset)) | 17 | #define S3C2410_GPIONO(bank,offset) ((bank) + (offset)) |
| 18 | 18 | ||
diff --git a/arch/arm/mach-s3c2410/include/mach/regs-irq.h b/arch/arm/mach-s3c2410/include/mach/regs-irq.h index b057c06d167a..de86ee8812bd 100644 --- a/arch/arm/mach-s3c2410/include/mach/regs-irq.h +++ b/arch/arm/mach-s3c2410/include/mach/regs-irq.h | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | 10 | ||
| 11 | 11 | ||
| 12 | #ifndef ___ASM_ARCH_REGS_IRQ_H | 12 | #ifndef ___ASM_ARCH_REGS_IRQ_H |
| 13 | #define ___ASM_ARCH_REGS_IRQ_H "$Id: irq.h,v 1.3 2003/03/25 21:29:06 ben Exp $" | 13 | #define ___ASM_ARCH_REGS_IRQ_H |
| 14 | 14 | ||
| 15 | /* interrupt controller */ | 15 | /* interrupt controller */ |
| 16 | 16 | ||
diff --git a/arch/arm/mach-s3c2410/include/mach/regs-lcd.h b/arch/arm/mach-s3c2410/include/mach/regs-lcd.h index 893b8742f954..ee8f040aff5f 100644 --- a/arch/arm/mach-s3c2410/include/mach/regs-lcd.h +++ b/arch/arm/mach-s3c2410/include/mach/regs-lcd.h | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | 10 | ||
| 11 | 11 | ||
| 12 | #ifndef ___ASM_ARCH_REGS_LCD_H | 12 | #ifndef ___ASM_ARCH_REGS_LCD_H |
| 13 | #define ___ASM_ARCH_REGS_LCD_H "$Id: lcd.h,v 1.3 2003/06/26 13:25:06 ben Exp $" | 13 | #define ___ASM_ARCH_REGS_LCD_H |
| 14 | 14 | ||
| 15 | #define S3C2410_LCDREG(x) (x) | 15 | #define S3C2410_LCDREG(x) (x) |
| 16 | 16 | ||
diff --git a/arch/arm/mach-s3c2410/include/mach/regs-mem.h b/arch/arm/mach-s3c2410/include/mach/regs-mem.h index f9926abd5cde..57759804e2fa 100644 --- a/arch/arm/mach-s3c2410/include/mach/regs-mem.h +++ b/arch/arm/mach-s3c2410/include/mach/regs-mem.h | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| 13 | #ifndef __ASM_ARM_MEMREGS_H | 13 | #ifndef __ASM_ARM_MEMREGS_H |
| 14 | #define __ASM_ARM_MEMREGS_H "$Id: regs.h,v 1.8 2003/05/01 15:55:41 ben Exp $" | 14 | #define __ASM_ARM_MEMREGS_H |
| 15 | 15 | ||
| 16 | #ifndef S3C2410_MEMREG | 16 | #ifndef S3C2410_MEMREG |
| 17 | #define S3C2410_MEMREG(x) (S3C24XX_VA_MEMCTRL + (x)) | 17 | #define S3C2410_MEMREG(x) (S3C24XX_VA_MEMCTRL + (x)) |
diff --git a/arch/arm/mach-s3c2410/mach-bast.c b/arch/arm/mach-s3c2410/mach-bast.c index fb1e78e28e50..24c6334fac89 100644 --- a/arch/arm/mach-s3c2410/mach-bast.c +++ b/arch/arm/mach-s3c2410/mach-bast.c | |||
| @@ -562,7 +562,7 @@ static struct platform_device *bast_devices[] __initdata = { | |||
| 562 | &bast_sio, | 562 | &bast_sio, |
| 563 | }; | 563 | }; |
| 564 | 564 | ||
| 565 | static struct clk *bast_clocks[] = { | 565 | static struct clk *bast_clocks[] __initdata = { |
| 566 | &s3c24xx_dclk0, | 566 | &s3c24xx_dclk0, |
| 567 | &s3c24xx_dclk1, | 567 | &s3c24xx_dclk1, |
| 568 | &s3c24xx_clkout0, | 568 | &s3c24xx_clkout0, |
diff --git a/arch/arm/mach-s3c2410/mach-smdk2410.c b/arch/arm/mach-s3c2410/mach-smdk2410.c index c9040080727e..b88939d72282 100644 --- a/arch/arm/mach-s3c2410/mach-smdk2410.c +++ b/arch/arm/mach-s3c2410/mach-smdk2410.c | |||
| @@ -5,7 +5,6 @@ | |||
| 5 | * Copyright (C) 2004 by FS Forth-Systeme GmbH | 5 | * Copyright (C) 2004 by FS Forth-Systeme GmbH |
| 6 | * All rights reserved. | 6 | * All rights reserved. |
| 7 | * | 7 | * |
| 8 | * $Id: mach-smdk2410.c,v 1.1 2004/05/11 14:15:38 mpietrek Exp $ | ||
| 9 | * @Author: Jonas Dietsche | 8 | * @Author: Jonas Dietsche |
| 10 | * | 9 | * |
| 11 | * This program is free software; you can redistribute it and/or | 10 | * This program is free software; you can redistribute it and/or |
diff --git a/arch/arm/mach-s3c2410/mach-vr1000.c b/arch/arm/mach-s3c2410/mach-vr1000.c index 12cbca68f57d..fbc0213d5485 100644 --- a/arch/arm/mach-s3c2410/mach-vr1000.c +++ b/arch/arm/mach-s3c2410/mach-vr1000.c | |||
| @@ -344,7 +344,7 @@ static struct platform_device *vr1000_devices[] __initdata = { | |||
| 344 | &vr1000_led3, | 344 | &vr1000_led3, |
| 345 | }; | 345 | }; |
| 346 | 346 | ||
| 347 | static struct clk *vr1000_clocks[] = { | 347 | static struct clk *vr1000_clocks[] __initdata = { |
| 348 | &s3c24xx_dclk0, | 348 | &s3c24xx_dclk0, |
| 349 | &s3c24xx_dclk1, | 349 | &s3c24xx_dclk1, |
| 350 | &s3c24xx_clkout0, | 350 | &s3c24xx_clkout0, |
diff --git a/arch/arm/mach-s3c2412/mach-jive.c b/arch/arm/mach-s3c2412/mach-jive.c index 30f613a79bfe..4c061d29463c 100644 --- a/arch/arm/mach-s3c2412/mach-jive.c +++ b/arch/arm/mach-s3c2412/mach-jive.c | |||
| @@ -26,9 +26,6 @@ | |||
| 26 | 26 | ||
| 27 | #include <linux/spi/spi.h> | 27 | #include <linux/spi/spi.h> |
| 28 | 28 | ||
| 29 | #include <linux/mtd/mtd.h> | ||
| 30 | #include <linux/mtd/partitions.h> | ||
| 31 | |||
| 32 | #include <asm/mach/arch.h> | 29 | #include <asm/mach/arch.h> |
| 33 | #include <asm/mach/map.h> | 30 | #include <asm/mach/map.h> |
| 34 | #include <asm/mach/irq.h> | 31 | #include <asm/mach/irq.h> |
diff --git a/arch/arm/mach-s3c2440/mach-anubis.c b/arch/arm/mach-s3c2440/mach-anubis.c index 265c77dec9d7..441f4bc09472 100644 --- a/arch/arm/mach-s3c2440/mach-anubis.c +++ b/arch/arm/mach-s3c2440/mach-anubis.c | |||
| @@ -414,7 +414,7 @@ static struct platform_device *anubis_devices[] __initdata = { | |||
| 414 | &anubis_device_sm501, | 414 | &anubis_device_sm501, |
| 415 | }; | 415 | }; |
| 416 | 416 | ||
| 417 | static struct clk *anubis_clocks[] = { | 417 | static struct clk *anubis_clocks[] __initdata = { |
| 418 | &s3c24xx_dclk0, | 418 | &s3c24xx_dclk0, |
| 419 | &s3c24xx_dclk1, | 419 | &s3c24xx_dclk1, |
| 420 | &s3c24xx_clkout0, | 420 | &s3c24xx_clkout0, |
diff --git a/arch/arm/mach-s3c2440/mach-osiris.c b/arch/arm/mach-s3c2440/mach-osiris.c index d2ee0cd148c6..8b83f93b6102 100644 --- a/arch/arm/mach-s3c2440/mach-osiris.c +++ b/arch/arm/mach-s3c2440/mach-osiris.c | |||
| @@ -341,7 +341,7 @@ static struct platform_device *osiris_devices[] __initdata = { | |||
| 341 | &osiris_pcmcia, | 341 | &osiris_pcmcia, |
| 342 | }; | 342 | }; |
| 343 | 343 | ||
| 344 | static struct clk *osiris_clocks[] = { | 344 | static struct clk *osiris_clocks[] __initdata = { |
| 345 | &s3c24xx_dclk0, | 345 | &s3c24xx_dclk0, |
| 346 | &s3c24xx_dclk1, | 346 | &s3c24xx_dclk1, |
| 347 | &s3c24xx_clkout0, | 347 | &s3c24xx_clkout0, |
diff --git a/arch/arm/mach-sa1100/cpu-sa1110.c b/arch/arm/mach-sa1100/cpu-sa1110.c index 39d38c801736..029dbfbbafcf 100644 --- a/arch/arm/mach-sa1100/cpu-sa1110.c +++ b/arch/arm/mach-sa1100/cpu-sa1110.c | |||
| @@ -3,8 +3,6 @@ | |||
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2001 Russell King | 4 | * Copyright (C) 2001 Russell King |
| 5 | * | 5 | * |
| 6 | * $Id: cpu-sa1110.c,v 1.9 2002/07/06 16:53:18 rmk Exp $ | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | 6 | * 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 | 7 | * it under the terms of the GNU General Public License version 2 as |
| 10 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
diff --git a/arch/arm/mach-sa1100/include/mach/mtd-xip.h b/arch/arm/mach-sa1100/include/mach/mtd-xip.h index 80cfdac2b944..eaa09e86ad16 100644 --- a/arch/arm/mach-sa1100/include/mach/mtd-xip.h +++ b/arch/arm/mach-sa1100/include/mach/mtd-xip.h | |||
| @@ -10,8 +10,6 @@ | |||
| 10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
| 11 | * it under the terms of the GNU General Public License version 2 as | 11 | * it under the terms of the GNU General Public License version 2 as |
| 12 | * published by the Free Software Foundation. | 12 | * published by the Free Software Foundation. |
| 13 | * | ||
| 14 | * $Id: xip.h,v 1.2 2004/12/01 15:49:10 nico Exp $ | ||
| 15 | */ | 13 | */ |
| 16 | 14 | ||
| 17 | #ifndef __ARCH_SA1100_MTD_XIP_H__ | 15 | #ifndef __ARCH_SA1100_MTD_XIP_H__ |
diff --git a/arch/arm/mm/cache-feroceon-l2.c b/arch/arm/mm/cache-feroceon-l2.c index 20eec4ba173f..7b5a25d81576 100644 --- a/arch/arm/mm/cache-feroceon-l2.c +++ b/arch/arm/mm/cache-feroceon-l2.c | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | 14 | ||
| 15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
| 16 | #include <asm/cacheflush.h> | 16 | #include <asm/cacheflush.h> |
| 17 | #include <asm/plat-orion/cache-feroceon-l2.h> | 17 | #include <plat/cache-feroceon-l2.h> |
| 18 | 18 | ||
| 19 | 19 | ||
| 20 | /* | 20 | /* |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 2d6d682c206a..25d9a11eb617 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
| @@ -568,6 +568,55 @@ void __init iotable_init(struct map_desc *io_desc, int nr) | |||
| 568 | create_mapping(io_desc + i); | 568 | create_mapping(io_desc + i); |
| 569 | } | 569 | } |
| 570 | 570 | ||
| 571 | static int __init check_membank_valid(struct membank *mb) | ||
| 572 | { | ||
| 573 | /* | ||
| 574 | * Check whether this memory region has non-zero size. | ||
| 575 | */ | ||
| 576 | if (mb->size == 0) | ||
| 577 | return 0; | ||
| 578 | |||
| 579 | /* | ||
| 580 | * Check whether this memory region would entirely overlap | ||
| 581 | * the vmalloc area. | ||
| 582 | */ | ||
| 583 | if (phys_to_virt(mb->start) >= VMALLOC_MIN) { | ||
| 584 | printk(KERN_NOTICE "Ignoring RAM at %.8lx-%.8lx " | ||
| 585 | "(vmalloc region overlap).\n", | ||
| 586 | mb->start, mb->start + mb->size - 1); | ||
| 587 | return 0; | ||
| 588 | } | ||
| 589 | |||
| 590 | /* | ||
| 591 | * Check whether this memory region would partially overlap | ||
| 592 | * the vmalloc area. | ||
| 593 | */ | ||
| 594 | if (phys_to_virt(mb->start + mb->size) < phys_to_virt(mb->start) || | ||
| 595 | phys_to_virt(mb->start + mb->size) > VMALLOC_MIN) { | ||
| 596 | unsigned long newsize = VMALLOC_MIN - phys_to_virt(mb->start); | ||
| 597 | |||
| 598 | printk(KERN_NOTICE "Truncating RAM at %.8lx-%.8lx " | ||
| 599 | "to -%.8lx (vmalloc region overlap).\n", | ||
| 600 | mb->start, mb->start + mb->size - 1, | ||
| 601 | mb->start + newsize - 1); | ||
| 602 | mb->size = newsize; | ||
| 603 | } | ||
| 604 | |||
| 605 | return 1; | ||
| 606 | } | ||
| 607 | |||
| 608 | static void __init sanity_check_meminfo(struct meminfo *mi) | ||
| 609 | { | ||
| 610 | int i; | ||
| 611 | int j; | ||
| 612 | |||
| 613 | for (i = 0, j = 0; i < mi->nr_banks; i++) { | ||
| 614 | if (check_membank_valid(&mi->bank[i])) | ||
| 615 | mi->bank[j++] = mi->bank[i]; | ||
| 616 | } | ||
| 617 | mi->nr_banks = j; | ||
| 618 | } | ||
| 619 | |||
| 571 | static inline void prepare_page_table(struct meminfo *mi) | 620 | static inline void prepare_page_table(struct meminfo *mi) |
| 572 | { | 621 | { |
| 573 | unsigned long addr; | 622 | unsigned long addr; |
| @@ -753,6 +802,7 @@ void __init paging_init(struct meminfo *mi, struct machine_desc *mdesc) | |||
| 753 | void *zero_page; | 802 | void *zero_page; |
| 754 | 803 | ||
| 755 | build_mem_type_table(); | 804 | build_mem_type_table(); |
| 805 | sanity_check_meminfo(mi); | ||
| 756 | prepare_page_table(mi); | 806 | prepare_page_table(mi); |
| 757 | bootmem_init(mi); | 807 | bootmem_init(mi); |
| 758 | devicemaps_init(mdesc); | 808 | devicemaps_init(mdesc); |
diff --git a/arch/arm/mm/proc-arm940.S b/arch/arm/mm/proc-arm940.S index 1a3d63df8e90..551244d5ca19 100644 --- a/arch/arm/mm/proc-arm940.S +++ b/arch/arm/mm/proc-arm940.S | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <asm/pgtable-hwdef.h> | 15 | #include <asm/pgtable-hwdef.h> |
| 16 | #include <asm/pgtable.h> | 16 | #include <asm/pgtable.h> |
| 17 | #include <asm/ptrace.h> | 17 | #include <asm/ptrace.h> |
| 18 | #include "proc-macros.S" | ||
| 18 | 19 | ||
| 19 | /* ARM940T has a 4KB DCache comprising 256 lines of 4 words */ | 20 | /* ARM940T has a 4KB DCache comprising 256 lines of 4 words */ |
| 20 | #define CACHE_DLINESIZE 16 | 21 | #define CACHE_DLINESIZE 16 |
diff --git a/arch/arm/mm/proc-arm946.S b/arch/arm/mm/proc-arm946.S index 82d579ac9b98..6168c6160dee 100644 --- a/arch/arm/mm/proc-arm946.S +++ b/arch/arm/mm/proc-arm946.S | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <asm/pgtable-hwdef.h> | 17 | #include <asm/pgtable-hwdef.h> |
| 18 | #include <asm/pgtable.h> | 18 | #include <asm/pgtable.h> |
| 19 | #include <asm/ptrace.h> | 19 | #include <asm/ptrace.h> |
| 20 | #include "proc-macros.S" | ||
| 20 | 21 | ||
| 21 | /* | 22 | /* |
| 22 | * ARM946E-S is synthesizable to have 0KB to 1MB sized D-Cache, | 23 | * ARM946E-S is synthesizable to have 0KB to 1MB sized D-Cache, |
diff --git a/arch/arm/plat-omap/include/mach/memory.h b/arch/arm/plat-omap/include/mach/memory.h index 037486c5f4a4..a325caf80d04 100644 --- a/arch/arm/plat-omap/include/mach/memory.h +++ b/arch/arm/plat-omap/include/mach/memory.h | |||
| @@ -76,13 +76,14 @@ | |||
| 76 | (dma_addr_t)virt_to_lbus(page_address(page)) : \ | 76 | (dma_addr_t)virt_to_lbus(page_address(page)) : \ |
| 77 | (dma_addr_t)__virt_to_bus(page_address(page));}) | 77 | (dma_addr_t)__virt_to_bus(page_address(page));}) |
| 78 | 78 | ||
| 79 | #define __arch_dma_to_virt(dev, addr) ({is_lbus_device(dev) ? \ | 79 | #define __arch_dma_to_virt(dev, addr) ({ (void *) (is_lbus_device(dev) ? \ |
| 80 | lbus_to_virt(addr) : \ | 80 | lbus_to_virt(addr) : \ |
| 81 | __bus_to_virt(addr);}) | 81 | __bus_to_virt(addr)); }) |
| 82 | 82 | ||
| 83 | #define __arch_virt_to_dma(dev, addr) ({is_lbus_device(dev) ? \ | 83 | #define __arch_virt_to_dma(dev, addr) ({ unsigned long __addr = (unsigned long)(addr); \ |
| 84 | virt_to_lbus(addr) : \ | 84 | (dma_addr_t) (is_lbus_device(dev) ? \ |
| 85 | __virt_to_bus(addr);}) | 85 | virt_to_lbus(__addr) : \ |
| 86 | __virt_to_bus(__addr)); }) | ||
| 86 | 87 | ||
| 87 | #endif /* CONFIG_ARCH_OMAP15XX */ | 88 | #endif /* CONFIG_ARCH_OMAP15XX */ |
| 88 | 89 | ||
diff --git a/include/asm-arm/plat-orion/cache-feroceon-l2.h b/arch/arm/plat-orion/include/plat/cache-feroceon-l2.h index ba4e016d3ec0..06f982d55697 100644 --- a/include/asm-arm/plat-orion/cache-feroceon-l2.h +++ b/arch/arm/plat-orion/include/plat/cache-feroceon-l2.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * include/asm-arm/plat-orion/cache-feroceon-l2.h | 2 | * arch/arm/plat-orion/include/plat/cache-feroceon-l2.h |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2008 Marvell Semiconductor | 4 | * Copyright (C) 2008 Marvell Semiconductor |
| 5 | * | 5 | * |
diff --git a/include/asm-arm/plat-orion/ehci-orion.h b/arch/arm/plat-orion/include/plat/ehci-orion.h index 785705651e24..64343051095a 100644 --- a/include/asm-arm/plat-orion/ehci-orion.h +++ b/arch/arm/plat-orion/include/plat/ehci-orion.h | |||
| @@ -1,13 +1,13 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * include/asm-arm/plat-orion/ehci-orion.h | 2 | * arch/arm/plat-orion/include/plat/ehci-orion.h |
| 3 | * | 3 | * |
| 4 | * This file is licensed under the terms of the GNU General Public | 4 | * This file is licensed under the terms of the GNU General Public |
| 5 | * License version 2. This program is licensed "as is" without any | 5 | * License version 2. This program is licensed "as is" without any |
| 6 | * warranty of any kind, whether express or implied. | 6 | * warranty of any kind, whether express or implied. |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | #ifndef __ASM_PLAT_ORION_EHCI_ORION_H | 9 | #ifndef __PLAT_EHCI_ORION_H |
| 10 | #define __ASM_PLAT_ORION_EHCI_ORION_H | 10 | #define __PLAT_EHCI_ORION_H |
| 11 | 11 | ||
| 12 | #include <linux/mbus.h> | 12 | #include <linux/mbus.h> |
| 13 | 13 | ||
diff --git a/include/asm-arm/plat-orion/irq.h b/arch/arm/plat-orion/include/plat/irq.h index 94aeed919d5b..f05eeab94968 100644 --- a/include/asm-arm/plat-orion/irq.h +++ b/arch/arm/plat-orion/include/plat/irq.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * include/asm-arm/plat-orion/irq.h | 2 | * arch/arm/plat-orion/include/plat/irq.h |
| 3 | * | 3 | * |
| 4 | * Marvell Orion SoC IRQ handling. | 4 | * Marvell Orion SoC IRQ handling. |
| 5 | * | 5 | * |
| @@ -8,8 +8,8 @@ | |||
| 8 | * warranty of any kind, whether express or implied. | 8 | * warranty of any kind, whether express or implied. |
| 9 | */ | 9 | */ |
| 10 | 10 | ||
| 11 | #ifndef __ASM_PLAT_ORION_IRQ_H | 11 | #ifndef __PLAT_IRQ_H |
| 12 | #define __ASM_PLAT_ORION_IRQ_H | 12 | #define __PLAT_IRQ_H |
| 13 | 13 | ||
| 14 | void orion_irq_init(unsigned int irq_start, void __iomem *maskaddr); | 14 | void orion_irq_init(unsigned int irq_start, void __iomem *maskaddr); |
| 15 | 15 | ||
diff --git a/include/asm-arm/plat-orion/mv_xor.h b/arch/arm/plat-orion/include/plat/mv_xor.h index c349e8ff5cc0..bd5f3bdb4ae3 100644 --- a/include/asm-arm/plat-orion/mv_xor.h +++ b/arch/arm/plat-orion/include/plat/mv_xor.h | |||
| @@ -1,9 +1,11 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * arch/arm/plat-orion/include/plat/mv_xor.h | ||
| 3 | * | ||
| 2 | * Marvell XOR platform device data definition file. | 4 | * Marvell XOR platform device data definition file. |
| 3 | */ | 5 | */ |
| 4 | 6 | ||
| 5 | #ifndef __ASM_PLAT_ORION_MV_XOR_H | 7 | #ifndef __PLAT_MV_XOR_H |
| 6 | #define __ASM_PLAT_ORION_MV_XOR_H | 8 | #define __PLAT_MV_XOR_H |
| 7 | 9 | ||
| 8 | #include <linux/dmaengine.h> | 10 | #include <linux/dmaengine.h> |
| 9 | #include <linux/mbus.h> | 11 | #include <linux/mbus.h> |
diff --git a/include/asm-arm/plat-orion/orion_nand.h b/arch/arm/plat-orion/include/plat/orion_nand.h index ad4ce94c1998..d6a4cfa37785 100644 --- a/include/asm-arm/plat-orion/orion_nand.h +++ b/arch/arm/plat-orion/include/plat/orion_nand.h | |||
| @@ -1,13 +1,13 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * include/asm-arm/plat-orion/orion_nand.h | 2 | * arch/arm/plat-orion/include/plat/orion_nand.h |
| 3 | * | 3 | * |
| 4 | * This file is licensed under the terms of the GNU General Public | 4 | * This file is licensed under the terms of the GNU General Public |
| 5 | * License version 2. This program is licensed "as is" without any | 5 | * License version 2. This program is licensed "as is" without any |
| 6 | * warranty of any kind, whether express or implied. | 6 | * warranty of any kind, whether express or implied. |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | #ifndef __ASM_PLAT_ORION_ORION_NAND_H | 9 | #ifndef __PLAT_ORION_NAND_H |
| 10 | #define __ASM_PLAT_ORION_ORION_NAND_H | 10 | #define __PLAT_ORION_NAND_H |
| 11 | 11 | ||
| 12 | /* | 12 | /* |
| 13 | * Device bus NAND private data | 13 | * Device bus NAND private data |
diff --git a/include/asm-arm/plat-orion/pcie.h b/arch/arm/plat-orion/include/plat/pcie.h index e61b7bd97af5..3ebfef72b4e7 100644 --- a/include/asm-arm/plat-orion/pcie.h +++ b/arch/arm/plat-orion/include/plat/pcie.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * include/asm-arm/plat-orion/pcie.h | 2 | * arch/arm/plat-orion/include/plat/pcie.h |
| 3 | * | 3 | * |
| 4 | * Marvell Orion SoC PCIe handling. | 4 | * Marvell Orion SoC PCIe handling. |
| 5 | * | 5 | * |
| @@ -8,8 +8,8 @@ | |||
| 8 | * warranty of any kind, whether express or implied. | 8 | * warranty of any kind, whether express or implied. |
| 9 | */ | 9 | */ |
| 10 | 10 | ||
| 11 | #ifndef __ASM_PLAT_ORION_PCIE_H | 11 | #ifndef __PLAT_PCIE_H |
| 12 | #define __ASM_PLAT_ORION_PCIE_H | 12 | #define __PLAT_PCIE_H |
| 13 | 13 | ||
| 14 | u32 orion_pcie_dev_id(void __iomem *base); | 14 | u32 orion_pcie_dev_id(void __iomem *base); |
| 15 | u32 orion_pcie_rev(void __iomem *base); | 15 | u32 orion_pcie_rev(void __iomem *base); |
diff --git a/include/asm-arm/plat-orion/time.h b/arch/arm/plat-orion/include/plat/time.h index 0e85cc8f44d9..c06ca35f3613 100644 --- a/include/asm-arm/plat-orion/time.h +++ b/arch/arm/plat-orion/include/plat/time.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * include/asm-arm/plat-orion/time.h | 2 | * arch/arm/plat-orion/include/plat/time.h |
| 3 | * | 3 | * |
| 4 | * Marvell Orion SoC time handling. | 4 | * Marvell Orion SoC time handling. |
| 5 | * | 5 | * |
| @@ -8,8 +8,8 @@ | |||
| 8 | * warranty of any kind, whether express or implied. | 8 | * warranty of any kind, whether express or implied. |
| 9 | */ | 9 | */ |
| 10 | 10 | ||
| 11 | #ifndef __ASM_PLAT_ORION_TIME_H | 11 | #ifndef __PLAT_TIME_H |
| 12 | #define __ASM_PLAT_ORION_TIME_H | 12 | #define __PLAT_TIME_H |
| 13 | 13 | ||
| 14 | void orion_time_init(unsigned int irq, unsigned int tclk); | 14 | void orion_time_init(unsigned int irq, unsigned int tclk); |
| 15 | 15 | ||
diff --git a/arch/arm/plat-orion/irq.c b/arch/arm/plat-orion/irq.c index fe66a1835169..3f9d34fc738c 100644 --- a/arch/arm/plat-orion/irq.c +++ b/arch/arm/plat-orion/irq.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
| 13 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
| 14 | #include <linux/io.h> | 14 | #include <linux/io.h> |
| 15 | #include <asm/plat-orion/irq.h> | 15 | #include <plat/irq.h> |
| 16 | 16 | ||
| 17 | static void orion_irq_mask(u32 irq) | 17 | static void orion_irq_mask(u32 irq) |
| 18 | { | 18 | { |
diff --git a/arch/arm/plat-orion/pcie.c b/arch/arm/plat-orion/pcie.c index ca32c60e14d7..883902fead89 100644 --- a/arch/arm/plat-orion/pcie.c +++ b/arch/arm/plat-orion/pcie.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <linux/pci.h> | 12 | #include <linux/pci.h> |
| 13 | #include <linux/mbus.h> | 13 | #include <linux/mbus.h> |
| 14 | #include <asm/mach/pci.h> | 14 | #include <asm/mach/pci.h> |
| 15 | #include <asm/plat-orion/pcie.h> | 15 | #include <plat/pcie.h> |
| 16 | 16 | ||
| 17 | /* | 17 | /* |
| 18 | * PCIe unit register offsets. | 18 | * PCIe unit register offsets. |
diff --git a/arch/arm/plat-s3c24xx/cpu.c b/arch/arm/plat-s3c24xx/cpu.c index 6d60f0476bb8..89ce60eabd5b 100644 --- a/arch/arm/plat-s3c24xx/cpu.c +++ b/arch/arm/plat-s3c24xx/cpu.c | |||
| @@ -169,9 +169,7 @@ static struct map_desc s3c_iodesc[] __initdata = { | |||
| 169 | IODESC_ENT(UART) | 169 | IODESC_ENT(UART) |
| 170 | }; | 170 | }; |
| 171 | 171 | ||
| 172 | 172 | static struct cpu_table * __init s3c_lookup_cpu(unsigned long idcode) | |
| 173 | static struct cpu_table * | ||
| 174 | s3c_lookup_cpu(unsigned long idcode) | ||
| 175 | { | 173 | { |
| 176 | struct cpu_table *tab; | 174 | struct cpu_table *tab; |
| 177 | int count; | 175 | int count; |
diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types index 8b8f564c3aa2..56281c030a7b 100644 --- a/arch/arm/tools/mach-types +++ b/arch/arm/tools/mach-types | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | # | 12 | # |
| 13 | # http://www.arm.linux.org.uk/developer/machines/?action=new | 13 | # http://www.arm.linux.org.uk/developer/machines/?action=new |
| 14 | # | 14 | # |
| 15 | # Last update: Sun Jul 13 12:04:05 2008 | 15 | # Last update: Wed Aug 13 21:56:02 2008 |
| 16 | # | 16 | # |
| 17 | # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number | 17 | # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number |
| 18 | # | 18 | # |
| @@ -843,7 +843,7 @@ borzoi MACH_BORZOI BORZOI 831 | |||
| 843 | gecko MACH_GECKO GECKO 832 | 843 | gecko MACH_GECKO GECKO 832 |
| 844 | ds101 MACH_DS101 DS101 833 | 844 | ds101 MACH_DS101 DS101 833 |
| 845 | omap_palmtt2 MACH_OMAP_PALMTT2 OMAP_PALMTT2 834 | 845 | omap_palmtt2 MACH_OMAP_PALMTT2 OMAP_PALMTT2 834 |
| 846 | xscale_palmld MACH_XSCALE_PALMLD XSCALE_PALMLD 835 | 846 | palmld MACH_PALMLD PALMLD 835 |
| 847 | cc9c MACH_CC9C CC9C 836 | 847 | cc9c MACH_CC9C CC9C 836 |
| 848 | sbc1670 MACH_SBC1670 SBC1670 837 | 848 | sbc1670 MACH_SBC1670 SBC1670 837 |
| 849 | ixdp28x5 MACH_IXDP28X5 IXDP28X5 838 | 849 | ixdp28x5 MACH_IXDP28X5 IXDP28X5 838 |
| @@ -852,7 +852,7 @@ ml696k MACH_ML696K ML696K 840 | |||
| 852 | arcom_zeus MACH_ARCOM_ZEUS ARCOM_ZEUS 841 | 852 | arcom_zeus MACH_ARCOM_ZEUS ARCOM_ZEUS 841 |
| 853 | osiris MACH_OSIRIS OSIRIS 842 | 853 | osiris MACH_OSIRIS OSIRIS 842 |
| 854 | maestro MACH_MAESTRO MAESTRO 843 | 854 | maestro MACH_MAESTRO MAESTRO 843 |
| 855 | tunge2 MACH_TUNGE2 TUNGE2 844 | 855 | palmte2 MACH_PALMTE2 PALMTE2 844 |
| 856 | ixbbm MACH_IXBBM IXBBM 845 | 856 | ixbbm MACH_IXBBM IXBBM 845 |
| 857 | mx27ads MACH_MX27ADS MX27ADS 846 | 857 | mx27ads MACH_MX27ADS MX27ADS 846 |
| 858 | ax8004 MACH_AX8004 AX8004 847 | 858 | ax8004 MACH_AX8004 AX8004 847 |
| @@ -916,7 +916,7 @@ nxdb500 MACH_NXDB500 NXDB500 905 | |||
| 916 | apf9328 MACH_APF9328 APF9328 906 | 916 | apf9328 MACH_APF9328 APF9328 906 |
| 917 | omap_wipoq MACH_OMAP_WIPOQ OMAP_WIPOQ 907 | 917 | omap_wipoq MACH_OMAP_WIPOQ OMAP_WIPOQ 907 |
| 918 | omap_twip MACH_OMAP_TWIP OMAP_TWIP 908 | 918 | omap_twip MACH_OMAP_TWIP OMAP_TWIP 908 |
| 919 | palmtreo650 MACH_PALMTREO650 PALMTREO650 909 | 919 | palmt650 MACH_PALMT650 PALMT650 909 |
| 920 | acumen MACH_ACUMEN ACUMEN 910 | 920 | acumen MACH_ACUMEN ACUMEN 910 |
| 921 | xp100 MACH_XP100 XP100 911 | 921 | xp100 MACH_XP100 XP100 911 |
| 922 | fs2410 MACH_FS2410 FS2410 912 | 922 | fs2410 MACH_FS2410 FS2410 912 |
| @@ -1096,7 +1096,7 @@ atc6 MACH_ATC6 ATC6 1086 | |||
| 1096 | multmdw MACH_MULTMDW MULTMDW 1087 | 1096 | multmdw MACH_MULTMDW MULTMDW 1087 |
| 1097 | mba2440 MACH_MBA2440 MBA2440 1088 | 1097 | mba2440 MACH_MBA2440 MBA2440 1088 |
| 1098 | ecsd MACH_ECSD ECSD 1089 | 1098 | ecsd MACH_ECSD ECSD 1089 |
| 1099 | zire31 MACH_ZIRE31 ZIRE31 1090 | 1099 | palmz31 MACH_PALMZ31 PALMZ31 1090 |
| 1100 | fsg MACH_FSG FSG 1091 | 1100 | fsg MACH_FSG FSG 1091 |
| 1101 | razor101 MACH_RAZOR101 RAZOR101 1092 | 1101 | razor101 MACH_RAZOR101 RAZOR101 1092 |
| 1102 | opera_tdm MACH_OPERA_TDM OPERA_TDM 1093 | 1102 | opera_tdm MACH_OPERA_TDM OPERA_TDM 1093 |
| @@ -1810,7 +1810,7 @@ kriss_sensor MACH_KRISS_SENSOR KRISS_SENSOR 1819 | |||
| 1810 | pilz_pmi5 MACH_PILZ_PMI5 PILZ_PMI5 1820 | 1810 | pilz_pmi5 MACH_PILZ_PMI5 PILZ_PMI5 1820 |
| 1811 | jade MACH_JADE JADE 1821 | 1811 | jade MACH_JADE JADE 1821 |
| 1812 | ks8695_softplc MACH_KS8695_SOFTPLC KS8695_SOFTPLC 1822 | 1812 | ks8695_softplc MACH_KS8695_SOFTPLC KS8695_SOFTPLC 1822 |
| 1813 | gprisc4 MACH_GPRISC4 GPRISC4 1823 | 1813 | gprisc3 MACH_GPRISC4 GPRISC4 1823 |
| 1814 | stamp9260 MACH_STAMP9260 STAMP9260 1824 | 1814 | stamp9260 MACH_STAMP9260 STAMP9260 1824 |
| 1815 | smdk6430 MACH_SMDK6430 SMDK6430 1825 | 1815 | smdk6430 MACH_SMDK6430 SMDK6430 1825 |
| 1816 | smdkc100 MACH_SMDKC100 SMDKC100 1826 | 1816 | smdkc100 MACH_SMDKC100 SMDKC100 1826 |
| @@ -1820,3 +1820,44 @@ deister_eyecam MACH_DEISTER_EYECAM DEISTER_EYECAM 1829 | |||
| 1820 | at91sam9m10ek MACH_AT91SAM9M10EK AT91SAM9M10EK 1830 | 1820 | at91sam9m10ek MACH_AT91SAM9M10EK AT91SAM9M10EK 1830 |
| 1821 | linkstation_produo MACH_LINKSTATION_PRODUO LINKSTATION_PRODUO 1831 | 1821 | linkstation_produo MACH_LINKSTATION_PRODUO LINKSTATION_PRODUO 1831 |
| 1822 | hit_b0 MACH_HIT_B0 HIT_B0 1832 | 1822 | hit_b0 MACH_HIT_B0 HIT_B0 1832 |
| 1823 | adx_rmu MACH_ADX_RMU ADX_RMU 1833 | ||
| 1824 | xg_cpe_main MACH_XG_CPE_MAIN XG_CPE_MAIN 1834 | ||
| 1825 | edb9407a MACH_EDB9407A EDB9407A 1835 | ||
| 1826 | dtb9608 MACH_DTB9608 DTB9608 1836 | ||
| 1827 | em104v1 MACH_EM104V1 EM104V1 1837 | ||
| 1828 | demo MACH_DEMO DEMO 1838 | ||
| 1829 | logi9260 MACH_LOGI9260 LOGI9260 1839 | ||
| 1830 | mx31_exm32 MACH_MX31_EXM32 MX31_EXM32 1840 | ||
| 1831 | usb_a9g20 MACH_USB_A9G20 USB_A9G20 1841 | ||
| 1832 | picproje2008 MACH_PICPROJE2008 PICPROJE2008 1842 | ||
| 1833 | cs_e9315 MACH_CS_E9315 CS_E9315 1843 | ||
| 1834 | qil_a9g20 MACH_QIL_A9G20 QIL_A9G20 1844 | ||
| 1835 | sha_pon020 MACH_SHA_PON020 SHA_PON020 1845 | ||
| 1836 | nad MACH_NAD NAD 1846 | ||
| 1837 | sbc35_a9260 MACH_SBC35_A9260 SBC35_A9260 1847 | ||
| 1838 | sbc35_a9g20 MACH_SBC35_A9G20 SBC35_A9G20 1848 | ||
| 1839 | davinci_beginning MACH_DAVINCI_BEGINNING DAVINCI_BEGINNING 1849 | ||
| 1840 | uwc MACH_UWC UWC 1850 | ||
| 1841 | mxlads MACH_MXLADS MXLADS 1851 | ||
| 1842 | htcnike MACH_HTCNIKE HTCNIKE 1852 | ||
| 1843 | deister_pxa270 MACH_DEISTER_PXA270 DEISTER_PXA270 1853 | ||
| 1844 | cme9210js MACH_CME9210JS CME9210JS 1854 | ||
| 1845 | cc9p9360 MACH_CC9P9360 CC9P9360 1855 | ||
| 1846 | mocha MACH_MOCHA MOCHA 1856 | ||
| 1847 | wapd170ag MACH_WAPD170AG WAPD170AG 1857 | ||
| 1848 | linkstation_mini MACH_LINKSTATION_MINI LINKSTATION_MINI 1858 | ||
| 1849 | afeb9260 MACH_AFEB9260 AFEB9260 1859 | ||
| 1850 | w90x900 MACH_W90X900 W90X900 1860 | ||
| 1851 | w90x700 MACH_W90X700 W90X700 1861 | ||
| 1852 | kt300ip MACH_KT300IP KT300IP 1862 | ||
| 1853 | kt300ip_g20 MACH_KT300IP_G20 KT300IP_G20 1863 | ||
| 1854 | srcm MACH_SRCM SRCM 1864 | ||
| 1855 | wlnx_9260 MACH_WLNX_9260 WLNX_9260 1865 | ||
| 1856 | openmoko_gta03 MACH_OPENMOKO_GTA03 OPENMOKO_GTA03 1866 | ||
| 1857 | osprey2 MACH_OSPREY2 OSPREY2 1867 | ||
| 1858 | kbio9260 MACH_KBIO9260 KBIO9260 1868 | ||
| 1859 | ginza MACH_GINZA GINZA 1869 | ||
| 1860 | a636n MACH_A636N A636N 1870 | ||
| 1861 | imx27ipcam MACH_IMX27IPCAM IMX27IPCAM 1871 | ||
| 1862 | nenoc MACH_NEMOC NEMOC 1872 | ||
| 1863 | geneva MACH_GENEVA GENEVA 1873 | ||
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c index 217de3ea29e8..b4aeb0f696dc 100644 --- a/arch/sparc64/mm/init.c +++ b/arch/sparc64/mm/init.c | |||
| @@ -796,6 +796,9 @@ static unsigned long nid_range(unsigned long start, unsigned long end, | |||
| 796 | start += PAGE_SIZE; | 796 | start += PAGE_SIZE; |
| 797 | } | 797 | } |
| 798 | 798 | ||
| 799 | if (start > end) | ||
| 800 | start = end; | ||
| 801 | |||
| 799 | return start; | 802 | return start; |
| 800 | } | 803 | } |
| 801 | #else | 804 | #else |
| @@ -1723,8 +1726,7 @@ void __init paging_init(void) | |||
| 1723 | 1726 | ||
| 1724 | find_ramdisk(phys_base); | 1727 | find_ramdisk(phys_base); |
| 1725 | 1728 | ||
| 1726 | if (cmdline_memory_size) | 1729 | lmb_enforce_memory_limit(cmdline_memory_size); |
| 1727 | lmb_enforce_memory_limit(phys_base + cmdline_memory_size); | ||
| 1728 | 1730 | ||
| 1729 | lmb_analyze(); | 1731 | lmb_analyze(); |
| 1730 | lmb_dump_all(); | 1732 | lmb_dump_all(); |
| @@ -1961,6 +1963,15 @@ void __init mem_init(void) | |||
| 1961 | void free_initmem(void) | 1963 | void free_initmem(void) |
| 1962 | { | 1964 | { |
| 1963 | unsigned long addr, initend; | 1965 | unsigned long addr, initend; |
| 1966 | int do_free = 1; | ||
| 1967 | |||
| 1968 | /* If the physical memory maps were trimmed by kernel command | ||
| 1969 | * line options, don't even try freeing this initmem stuff up. | ||
| 1970 | * The kernel image could have been in the trimmed out region | ||
| 1971 | * and if so the freeing below will free invalid page structs. | ||
| 1972 | */ | ||
| 1973 | if (cmdline_memory_size) | ||
| 1974 | do_free = 0; | ||
| 1964 | 1975 | ||
| 1965 | /* | 1976 | /* |
| 1966 | * The init section is aligned to 8k in vmlinux.lds. Page align for >8k pagesizes. | 1977 | * The init section is aligned to 8k in vmlinux.lds. Page align for >8k pagesizes. |
| @@ -1975,13 +1986,16 @@ void free_initmem(void) | |||
| 1975 | ((unsigned long) __va(kern_base)) - | 1986 | ((unsigned long) __va(kern_base)) - |
| 1976 | ((unsigned long) KERNBASE)); | 1987 | ((unsigned long) KERNBASE)); |
| 1977 | memset((void *)addr, POISON_FREE_INITMEM, PAGE_SIZE); | 1988 | memset((void *)addr, POISON_FREE_INITMEM, PAGE_SIZE); |
| 1978 | p = virt_to_page(page); | ||
| 1979 | 1989 | ||
| 1980 | ClearPageReserved(p); | 1990 | if (do_free) { |
| 1981 | init_page_count(p); | 1991 | p = virt_to_page(page); |
| 1982 | __free_page(p); | 1992 | |
| 1983 | num_physpages++; | 1993 | ClearPageReserved(p); |
| 1984 | totalram_pages++; | 1994 | init_page_count(p); |
| 1995 | __free_page(p); | ||
| 1996 | num_physpages++; | ||
| 1997 | totalram_pages++; | ||
| 1998 | } | ||
| 1985 | } | 1999 | } |
| 1986 | } | 2000 | } |
| 1987 | 2001 | ||
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index ac2fb0641a04..68d91c8233f4 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -951,9 +951,9 @@ config NUMA | |||
| 951 | local memory controller of the CPU and add some more | 951 | local memory controller of the CPU and add some more |
| 952 | NUMA awareness to the kernel. | 952 | NUMA awareness to the kernel. |
| 953 | 953 | ||
| 954 | For i386 this is currently highly experimental and should be only | 954 | For 32-bit this is currently highly experimental and should be only |
| 955 | used for kernel development. It might also cause boot failures. | 955 | used for kernel development. It might also cause boot failures. |
| 956 | For x86_64 this is recommended on all multiprocessor Opteron systems. | 956 | For 64-bit this is recommended on all multiprocessor Opteron systems. |
| 957 | If the system is EM64T, you should say N unless your system is | 957 | If the system is EM64T, you should say N unless your system is |
| 958 | EM64T NUMA. | 958 | EM64T NUMA. |
| 959 | 959 | ||
| @@ -1263,7 +1263,7 @@ config KEXEC | |||
| 1263 | strongly in flux, so no good recommendation can be made. | 1263 | strongly in flux, so no good recommendation can be made. |
| 1264 | 1264 | ||
| 1265 | config CRASH_DUMP | 1265 | config CRASH_DUMP |
| 1266 | bool "kernel crash dumps (EXPERIMENTAL)" | 1266 | bool "kernel crash dumps" |
| 1267 | depends on X86_64 || (X86_32 && HIGHMEM) | 1267 | depends on X86_64 || (X86_32 && HIGHMEM) |
| 1268 | help | 1268 | help |
| 1269 | Generate crash dump after being started by kexec. | 1269 | Generate crash dump after being started by kexec. |
diff --git a/arch/x86/boot/boot.h b/arch/x86/boot/boot.h index a34b9982c7cb..616b804a2295 100644 --- a/arch/x86/boot/boot.h +++ b/arch/x86/boot/boot.h | |||
| @@ -24,6 +24,8 @@ | |||
| 24 | #include <linux/edd.h> | 24 | #include <linux/edd.h> |
| 25 | #include <asm/boot.h> | 25 | #include <asm/boot.h> |
| 26 | #include <asm/setup.h> | 26 | #include <asm/setup.h> |
| 27 | #include "bitops.h" | ||
| 28 | #include <asm/cpufeature.h> | ||
| 27 | 29 | ||
| 28 | /* Useful macros */ | 30 | /* Useful macros */ |
| 29 | #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) | 31 | #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) |
| @@ -242,6 +244,12 @@ int cmdline_find_option(const char *option, char *buffer, int bufsize); | |||
| 242 | int cmdline_find_option_bool(const char *option); | 244 | int cmdline_find_option_bool(const char *option); |
| 243 | 245 | ||
| 244 | /* cpu.c, cpucheck.c */ | 246 | /* cpu.c, cpucheck.c */ |
| 247 | struct cpu_features { | ||
| 248 | int level; /* Family, or 64 for x86-64 */ | ||
| 249 | int model; | ||
| 250 | u32 flags[NCAPINTS]; | ||
| 251 | }; | ||
| 252 | extern struct cpu_features cpu; | ||
| 245 | int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr); | 253 | int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr); |
| 246 | int validate_cpu(void); | 254 | int validate_cpu(void); |
| 247 | 255 | ||
diff --git a/arch/x86/boot/cpu.c b/arch/x86/boot/cpu.c index 92d6fd73dc7d..75298fe2edca 100644 --- a/arch/x86/boot/cpu.c +++ b/arch/x86/boot/cpu.c | |||
| @@ -16,9 +16,6 @@ | |||
| 16 | */ | 16 | */ |
| 17 | 17 | ||
| 18 | #include "boot.h" | 18 | #include "boot.h" |
| 19 | #include "bitops.h" | ||
| 20 | #include <asm/cpufeature.h> | ||
| 21 | |||
| 22 | #include "cpustr.h" | 19 | #include "cpustr.h" |
| 23 | 20 | ||
| 24 | static char *cpu_name(int level) | 21 | static char *cpu_name(int level) |
diff --git a/arch/x86/boot/cpucheck.c b/arch/x86/boot/cpucheck.c index 7804389ee005..4b9ae7c56748 100644 --- a/arch/x86/boot/cpucheck.c +++ b/arch/x86/boot/cpucheck.c | |||
| @@ -22,21 +22,13 @@ | |||
| 22 | 22 | ||
| 23 | #ifdef _SETUP | 23 | #ifdef _SETUP |
| 24 | # include "boot.h" | 24 | # include "boot.h" |
| 25 | # include "bitops.h" | ||
| 26 | #endif | 25 | #endif |
| 27 | #include <linux/types.h> | 26 | #include <linux/types.h> |
| 28 | #include <asm/cpufeature.h> | ||
| 29 | #include <asm/processor-flags.h> | 27 | #include <asm/processor-flags.h> |
| 30 | #include <asm/required-features.h> | 28 | #include <asm/required-features.h> |
| 31 | #include <asm/msr-index.h> | 29 | #include <asm/msr-index.h> |
| 32 | 30 | ||
| 33 | struct cpu_features { | 31 | struct cpu_features cpu; |
| 34 | int level; /* Family, or 64 for x86-64 */ | ||
| 35 | int model; | ||
| 36 | u32 flags[NCAPINTS]; | ||
| 37 | }; | ||
| 38 | |||
| 39 | static struct cpu_features cpu; | ||
| 40 | static u32 cpu_vendor[3]; | 32 | static u32 cpu_vendor[3]; |
| 41 | static u32 err_flags[NCAPINTS]; | 33 | static u32 err_flags[NCAPINTS]; |
| 42 | 34 | ||
diff --git a/arch/x86/boot/main.c b/arch/x86/boot/main.c index 2296164b54d2..197421db1af1 100644 --- a/arch/x86/boot/main.c +++ b/arch/x86/boot/main.c | |||
| @@ -73,6 +73,11 @@ static void keyboard_set_repeat(void) | |||
| 73 | */ | 73 | */ |
| 74 | static void query_ist(void) | 74 | static void query_ist(void) |
| 75 | { | 75 | { |
| 76 | /* Some older BIOSes apparently crash on this call, so filter | ||
| 77 | it from machines too old to have SpeedStep at all. */ | ||
| 78 | if (cpu.level < 6) | ||
| 79 | return; | ||
| 80 | |||
| 76 | asm("int $0x15" | 81 | asm("int $0x15" |
| 77 | : "=a" (boot_params.ist_info.signature), | 82 | : "=a" (boot_params.ist_info.signature), |
| 78 | "=b" (boot_params.ist_info.command), | 83 | "=b" (boot_params.ist_info.command), |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index fa88a1d71290..bfd10fd211cd 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
| @@ -97,6 +97,8 @@ static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; | |||
| 97 | #warning ACPI uses CMPXCHG, i486 and later hardware | 97 | #warning ACPI uses CMPXCHG, i486 and later hardware |
| 98 | #endif | 98 | #endif |
| 99 | 99 | ||
| 100 | static int acpi_mcfg_64bit_base_addr __initdata = FALSE; | ||
| 101 | |||
| 100 | /* -------------------------------------------------------------------------- | 102 | /* -------------------------------------------------------------------------- |
| 101 | Boot-time Configuration | 103 | Boot-time Configuration |
| 102 | -------------------------------------------------------------------------- */ | 104 | -------------------------------------------------------------------------- */ |
| @@ -158,6 +160,14 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size) | |||
| 158 | struct acpi_mcfg_allocation *pci_mmcfg_config; | 160 | struct acpi_mcfg_allocation *pci_mmcfg_config; |
| 159 | int pci_mmcfg_config_num; | 161 | int pci_mmcfg_config_num; |
| 160 | 162 | ||
| 163 | static int __init acpi_mcfg_oem_check(struct acpi_table_mcfg *mcfg) | ||
| 164 | { | ||
| 165 | if (!strcmp(mcfg->header.oem_id, "SGI")) | ||
| 166 | acpi_mcfg_64bit_base_addr = TRUE; | ||
| 167 | |||
| 168 | return 0; | ||
| 169 | } | ||
| 170 | |||
| 161 | int __init acpi_parse_mcfg(struct acpi_table_header *header) | 171 | int __init acpi_parse_mcfg(struct acpi_table_header *header) |
| 162 | { | 172 | { |
| 163 | struct acpi_table_mcfg *mcfg; | 173 | struct acpi_table_mcfg *mcfg; |
| @@ -190,8 +200,12 @@ int __init acpi_parse_mcfg(struct acpi_table_header *header) | |||
| 190 | } | 200 | } |
| 191 | 201 | ||
| 192 | memcpy(pci_mmcfg_config, &mcfg[1], config_size); | 202 | memcpy(pci_mmcfg_config, &mcfg[1], config_size); |
| 203 | |||
| 204 | acpi_mcfg_oem_check(mcfg); | ||
| 205 | |||
| 193 | for (i = 0; i < pci_mmcfg_config_num; ++i) { | 206 | for (i = 0; i < pci_mmcfg_config_num; ++i) { |
| 194 | if (pci_mmcfg_config[i].address > 0xFFFFFFFF) { | 207 | if ((pci_mmcfg_config[i].address > 0xFFFFFFFF) && |
| 208 | !acpi_mcfg_64bit_base_addr) { | ||
| 195 | printk(KERN_ERR PREFIX | 209 | printk(KERN_ERR PREFIX |
| 196 | "MMCONFIG not in low 4GB of memory\n"); | 210 | "MMCONFIG not in low 4GB of memory\n"); |
| 197 | kfree(pci_mmcfg_config); | 211 | kfree(pci_mmcfg_config); |
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c index fa2161d5003b..81e5ab6542d8 100644 --- a/arch/x86/kernel/acpi/sleep.c +++ b/arch/x86/kernel/acpi/sleep.c | |||
| @@ -20,7 +20,7 @@ unsigned long acpi_realmode_flags; | |||
| 20 | /* address in low memory of the wakeup routine. */ | 20 | /* address in low memory of the wakeup routine. */ |
| 21 | static unsigned long acpi_realmode; | 21 | static unsigned long acpi_realmode; |
| 22 | 22 | ||
| 23 | #ifdef CONFIG_64BIT | 23 | #if defined(CONFIG_SMP) && defined(CONFIG_64BIT) |
| 24 | static char temp_stack[10240]; | 24 | static char temp_stack[10240]; |
| 25 | #endif | 25 | #endif |
| 26 | 26 | ||
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index 22d7d050905d..de39e1f2ede5 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
| @@ -101,16 +101,13 @@ static int iommu_queue_command(struct amd_iommu *iommu, struct iommu_cmd *cmd) | |||
| 101 | */ | 101 | */ |
| 102 | static int iommu_completion_wait(struct amd_iommu *iommu) | 102 | static int iommu_completion_wait(struct amd_iommu *iommu) |
| 103 | { | 103 | { |
| 104 | int ret; | 104 | int ret, ready = 0; |
| 105 | unsigned status = 0; | ||
| 105 | struct iommu_cmd cmd; | 106 | struct iommu_cmd cmd; |
| 106 | volatile u64 ready = 0; | ||
| 107 | unsigned long ready_phys = virt_to_phys(&ready); | ||
| 108 | unsigned long i = 0; | 107 | unsigned long i = 0; |
| 109 | 108 | ||
| 110 | memset(&cmd, 0, sizeof(cmd)); | 109 | memset(&cmd, 0, sizeof(cmd)); |
| 111 | cmd.data[0] = LOW_U32(ready_phys) | CMD_COMPL_WAIT_STORE_MASK; | 110 | cmd.data[0] = CMD_COMPL_WAIT_INT_MASK; |
| 112 | cmd.data[1] = upper_32_bits(ready_phys); | ||
| 113 | cmd.data[2] = 1; /* value written to 'ready' */ | ||
| 114 | CMD_SET_TYPE(&cmd, CMD_COMPL_WAIT); | 111 | CMD_SET_TYPE(&cmd, CMD_COMPL_WAIT); |
| 115 | 112 | ||
| 116 | iommu->need_sync = 0; | 113 | iommu->need_sync = 0; |
| @@ -122,9 +119,15 @@ static int iommu_completion_wait(struct amd_iommu *iommu) | |||
| 122 | 119 | ||
| 123 | while (!ready && (i < EXIT_LOOP_COUNT)) { | 120 | while (!ready && (i < EXIT_LOOP_COUNT)) { |
| 124 | ++i; | 121 | ++i; |
| 125 | cpu_relax(); | 122 | /* wait for the bit to become one */ |
| 123 | status = readl(iommu->mmio_base + MMIO_STATUS_OFFSET); | ||
| 124 | ready = status & MMIO_STATUS_COM_WAIT_INT_MASK; | ||
| 126 | } | 125 | } |
| 127 | 126 | ||
| 127 | /* set bit back to zero */ | ||
| 128 | status &= ~MMIO_STATUS_COM_WAIT_INT_MASK; | ||
| 129 | writel(status, iommu->mmio_base + MMIO_STATUS_OFFSET); | ||
| 130 | |||
| 128 | if (unlikely((i == EXIT_LOOP_COUNT) && printk_ratelimit())) | 131 | if (unlikely((i == EXIT_LOOP_COUNT) && printk_ratelimit())) |
| 129 | printk(KERN_WARNING "AMD IOMMU: Completion wait loop failed\n"); | 132 | printk(KERN_WARNING "AMD IOMMU: Completion wait loop failed\n"); |
| 130 | 133 | ||
| @@ -161,7 +164,7 @@ static int iommu_queue_inv_iommu_pages(struct amd_iommu *iommu, | |||
| 161 | address &= PAGE_MASK; | 164 | address &= PAGE_MASK; |
| 162 | CMD_SET_TYPE(&cmd, CMD_INV_IOMMU_PAGES); | 165 | CMD_SET_TYPE(&cmd, CMD_INV_IOMMU_PAGES); |
| 163 | cmd.data[1] |= domid; | 166 | cmd.data[1] |= domid; |
| 164 | cmd.data[2] = LOW_U32(address); | 167 | cmd.data[2] = lower_32_bits(address); |
| 165 | cmd.data[3] = upper_32_bits(address); | 168 | cmd.data[3] = upper_32_bits(address); |
| 166 | if (s) /* size bit - we flush more than one 4kb page */ | 169 | if (s) /* size bit - we flush more than one 4kb page */ |
| 167 | cmd.data[2] |= CMD_INV_IOMMU_PAGES_SIZE_MASK; | 170 | cmd.data[2] |= CMD_INV_IOMMU_PAGES_SIZE_MASK; |
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index d9a9da597e79..a69cc0f52042 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c | |||
| @@ -801,6 +801,21 @@ static int __init init_memory_definitions(struct acpi_table_header *table) | |||
| 801 | } | 801 | } |
| 802 | 802 | ||
| 803 | /* | 803 | /* |
| 804 | * Init the device table to not allow DMA access for devices and | ||
| 805 | * suppress all page faults | ||
| 806 | */ | ||
| 807 | static void init_device_table(void) | ||
| 808 | { | ||
| 809 | u16 devid; | ||
| 810 | |||
| 811 | for (devid = 0; devid <= amd_iommu_last_bdf; ++devid) { | ||
| 812 | set_dev_entry_bit(devid, DEV_ENTRY_VALID); | ||
| 813 | set_dev_entry_bit(devid, DEV_ENTRY_TRANSLATION); | ||
| 814 | set_dev_entry_bit(devid, DEV_ENTRY_NO_PAGE_FAULT); | ||
| 815 | } | ||
| 816 | } | ||
| 817 | |||
| 818 | /* | ||
| 804 | * This function finally enables all IOMMUs found in the system after | 819 | * This function finally enables all IOMMUs found in the system after |
| 805 | * they have been initialized | 820 | * they have been initialized |
| 806 | */ | 821 | */ |
| @@ -931,6 +946,9 @@ int __init amd_iommu_init(void) | |||
| 931 | if (amd_iommu_pd_alloc_bitmap == NULL) | 946 | if (amd_iommu_pd_alloc_bitmap == NULL) |
| 932 | goto free; | 947 | goto free; |
| 933 | 948 | ||
| 949 | /* init the device table */ | ||
| 950 | init_device_table(); | ||
| 951 | |||
| 934 | /* | 952 | /* |
| 935 | * let all alias entries point to itself | 953 | * let all alias entries point to itself |
| 936 | */ | 954 | */ |
| @@ -954,15 +972,15 @@ int __init amd_iommu_init(void) | |||
| 954 | if (acpi_table_parse("IVRS", init_memory_definitions) != 0) | 972 | if (acpi_table_parse("IVRS", init_memory_definitions) != 0) |
| 955 | goto free; | 973 | goto free; |
| 956 | 974 | ||
| 957 | ret = amd_iommu_init_dma_ops(); | 975 | ret = sysdev_class_register(&amd_iommu_sysdev_class); |
| 958 | if (ret) | 976 | if (ret) |
| 959 | goto free; | 977 | goto free; |
| 960 | 978 | ||
| 961 | ret = sysdev_class_register(&amd_iommu_sysdev_class); | 979 | ret = sysdev_register(&device_amd_iommu); |
| 962 | if (ret) | 980 | if (ret) |
| 963 | goto free; | 981 | goto free; |
| 964 | 982 | ||
| 965 | ret = sysdev_register(&device_amd_iommu); | 983 | ret = amd_iommu_init_dma_ops(); |
| 966 | if (ret) | 984 | if (ret) |
| 967 | goto free; | 985 | goto free; |
| 968 | 986 | ||
diff --git a/arch/x86/kernel/apic_32.c b/arch/x86/kernel/apic_32.c index 039a8d4aaf62..f88bd0d982b0 100644 --- a/arch/x86/kernel/apic_32.c +++ b/arch/x86/kernel/apic_32.c | |||
| @@ -1454,8 +1454,6 @@ void disconnect_bsp_APIC(int virt_wire_setup) | |||
| 1454 | } | 1454 | } |
| 1455 | } | 1455 | } |
| 1456 | 1456 | ||
| 1457 | unsigned int __cpuinitdata maxcpus = NR_CPUS; | ||
| 1458 | |||
| 1459 | void __cpuinit generic_processor_info(int apicid, int version) | 1457 | void __cpuinit generic_processor_info(int apicid, int version) |
| 1460 | { | 1458 | { |
| 1461 | int cpu; | 1459 | int cpu; |
| @@ -1482,12 +1480,6 @@ void __cpuinit generic_processor_info(int apicid, int version) | |||
| 1482 | return; | 1480 | return; |
| 1483 | } | 1481 | } |
| 1484 | 1482 | ||
| 1485 | if (num_processors >= maxcpus) { | ||
| 1486 | printk(KERN_WARNING "WARNING: maxcpus limit of %i reached." | ||
| 1487 | " Processor ignored.\n", maxcpus); | ||
| 1488 | return; | ||
| 1489 | } | ||
| 1490 | |||
| 1491 | num_processors++; | 1483 | num_processors++; |
| 1492 | cpus_complement(tmp_map, cpu_present_map); | 1484 | cpus_complement(tmp_map, cpu_present_map); |
| 1493 | cpu = first_cpu(tmp_map); | 1485 | cpu = first_cpu(tmp_map); |
diff --git a/arch/x86/kernel/apic_64.c b/arch/x86/kernel/apic_64.c index 7f1f030da7ee..446c062e831c 100644 --- a/arch/x86/kernel/apic_64.c +++ b/arch/x86/kernel/apic_64.c | |||
| @@ -90,7 +90,6 @@ static unsigned long apic_phys; | |||
| 90 | 90 | ||
| 91 | unsigned long mp_lapic_addr; | 91 | unsigned long mp_lapic_addr; |
| 92 | 92 | ||
| 93 | unsigned int __cpuinitdata maxcpus = NR_CPUS; | ||
| 94 | /* | 93 | /* |
| 95 | * Get the LAPIC version | 94 | * Get the LAPIC version |
| 96 | */ | 95 | */ |
| @@ -1062,12 +1061,6 @@ void __cpuinit generic_processor_info(int apicid, int version) | |||
| 1062 | return; | 1061 | return; |
| 1063 | } | 1062 | } |
| 1064 | 1063 | ||
| 1065 | if (num_processors >= maxcpus) { | ||
| 1066 | printk(KERN_WARNING "WARNING: maxcpus limit of %i reached." | ||
| 1067 | " Processor ignored.\n", maxcpus); | ||
| 1068 | return; | ||
| 1069 | } | ||
| 1070 | |||
| 1071 | num_processors++; | 1064 | num_processors++; |
| 1072 | cpus_complement(tmp_map, cpu_present_map); | 1065 | cpus_complement(tmp_map, cpu_present_map); |
| 1073 | cpu = first_cpu(tmp_map); | 1066 | cpu = first_cpu(tmp_map); |
diff --git a/arch/x86/kernel/cpu/perfctr-watchdog.c b/arch/x86/kernel/cpu/perfctr-watchdog.c index de7439f82b92..05cc22dbd4ff 100644 --- a/arch/x86/kernel/cpu/perfctr-watchdog.c +++ b/arch/x86/kernel/cpu/perfctr-watchdog.c | |||
| @@ -478,7 +478,13 @@ static int setup_p4_watchdog(unsigned nmi_hz) | |||
| 478 | perfctr_msr = MSR_P4_IQ_PERFCTR1; | 478 | perfctr_msr = MSR_P4_IQ_PERFCTR1; |
| 479 | evntsel_msr = MSR_P4_CRU_ESCR0; | 479 | evntsel_msr = MSR_P4_CRU_ESCR0; |
| 480 | cccr_msr = MSR_P4_IQ_CCCR1; | 480 | cccr_msr = MSR_P4_IQ_CCCR1; |
| 481 | cccr_val = P4_CCCR_OVF_PMI1 | P4_CCCR_ESCR_SELECT(4); | 481 | |
| 482 | /* Pentium 4 D processors don't support P4_CCCR_OVF_PMI1 */ | ||
| 483 | if (boot_cpu_data.x86_model == 4 && boot_cpu_data.x86_mask == 4) | ||
| 484 | cccr_val = P4_CCCR_OVF_PMI0; | ||
| 485 | else | ||
| 486 | cccr_val = P4_CCCR_OVF_PMI1; | ||
| 487 | cccr_val |= P4_CCCR_ESCR_SELECT(4); | ||
| 482 | } | 488 | } |
| 483 | 489 | ||
| 484 | evntsel = P4_ESCR_EVENT_SELECT(0x3F) | 490 | evntsel = P4_ESCR_EVENT_SELECT(0x3F) |
diff --git a/arch/x86/kernel/genx2apic_uv_x.c b/arch/x86/kernel/genx2apic_uv_x.c index 2cfcbded888a..2d7e307c7779 100644 --- a/arch/x86/kernel/genx2apic_uv_x.c +++ b/arch/x86/kernel/genx2apic_uv_x.c | |||
| @@ -222,7 +222,7 @@ static __init void map_low_mmrs(void) | |||
| 222 | 222 | ||
| 223 | enum map_type {map_wb, map_uc}; | 223 | enum map_type {map_wb, map_uc}; |
| 224 | 224 | ||
| 225 | static void map_high(char *id, unsigned long base, int shift, enum map_type map_type) | 225 | static __init void map_high(char *id, unsigned long base, int shift, enum map_type map_type) |
| 226 | { | 226 | { |
| 227 | unsigned long bytes, paddr; | 227 | unsigned long bytes, paddr; |
| 228 | 228 | ||
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c index 1b318e903bf6..9bfc4d72fb2e 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c | |||
| @@ -88,6 +88,7 @@ void __init x86_64_start_kernel(char * real_mode_data) | |||
| 88 | BUILD_BUG_ON(!(MODULES_VADDR > __START_KERNEL)); | 88 | BUILD_BUG_ON(!(MODULES_VADDR > __START_KERNEL)); |
| 89 | BUILD_BUG_ON(!(((MODULES_END - 1) & PGDIR_MASK) == | 89 | BUILD_BUG_ON(!(((MODULES_END - 1) & PGDIR_MASK) == |
| 90 | (__START_KERNEL & PGDIR_MASK))); | 90 | (__START_KERNEL & PGDIR_MASK))); |
| 91 | BUILD_BUG_ON(__fix_to_virt(__end_of_fixed_addresses) <= MODULES_END); | ||
| 91 | 92 | ||
| 92 | /* clear bss before set_intr_gate with early_idt_handler */ | 93 | /* clear bss before set_intr_gate with early_idt_handler */ |
| 93 | clear_bss(); | 94 | clear_bss(); |
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index ad2b15a1334d..59fd3b6b1303 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c | |||
| @@ -359,6 +359,7 @@ static int hpet_clocksource_register(void) | |||
| 359 | int __init hpet_enable(void) | 359 | int __init hpet_enable(void) |
| 360 | { | 360 | { |
| 361 | unsigned long id; | 361 | unsigned long id; |
| 362 | int i; | ||
| 362 | 363 | ||
| 363 | if (!is_hpet_capable()) | 364 | if (!is_hpet_capable()) |
| 364 | return 0; | 365 | return 0; |
| @@ -369,6 +370,29 @@ int __init hpet_enable(void) | |||
| 369 | * Read the period and check for a sane value: | 370 | * Read the period and check for a sane value: |
| 370 | */ | 371 | */ |
| 371 | hpet_period = hpet_readl(HPET_PERIOD); | 372 | hpet_period = hpet_readl(HPET_PERIOD); |
| 373 | |||
| 374 | /* | ||
| 375 | * AMD SB700 based systems with spread spectrum enabled use a | ||
| 376 | * SMM based HPET emulation to provide proper frequency | ||
| 377 | * setting. The SMM code is initialized with the first HPET | ||
| 378 | * register access and takes some time to complete. During | ||
| 379 | * this time the config register reads 0xffffffff. We check | ||
| 380 | * for max. 1000 loops whether the config register reads a non | ||
| 381 | * 0xffffffff value to make sure that HPET is up and running | ||
| 382 | * before we go further. A counting loop is safe, as the HPET | ||
| 383 | * access takes thousands of CPU cycles. On non SB700 based | ||
| 384 | * machines this check is only done once and has no side | ||
| 385 | * effects. | ||
| 386 | */ | ||
| 387 | for (i = 0; hpet_readl(HPET_CFG) == 0xFFFFFFFF; i++) { | ||
| 388 | if (i == 1000) { | ||
| 389 | printk(KERN_WARNING | ||
| 390 | "HPET config register value = 0xFFFFFFFF. " | ||
| 391 | "Disabling HPET\n"); | ||
| 392 | goto out_nohpet; | ||
| 393 | } | ||
| 394 | } | ||
| 395 | |||
| 372 | if (hpet_period < HPET_MIN_PERIOD || hpet_period > HPET_MAX_PERIOD) | 396 | if (hpet_period < HPET_MIN_PERIOD || hpet_period > HPET_MAX_PERIOD) |
| 373 | goto out_nohpet; | 397 | goto out_nohpet; |
| 374 | 398 | ||
diff --git a/arch/x86/kernel/mfgpt_32.c b/arch/x86/kernel/mfgpt_32.c index 07c0f828f488..3b599518c322 100644 --- a/arch/x86/kernel/mfgpt_32.c +++ b/arch/x86/kernel/mfgpt_32.c | |||
| @@ -33,6 +33,8 @@ | |||
| 33 | #include <linux/module.h> | 33 | #include <linux/module.h> |
| 34 | #include <asm/geode.h> | 34 | #include <asm/geode.h> |
| 35 | 35 | ||
| 36 | #define MFGPT_DEFAULT_IRQ 7 | ||
| 37 | |||
| 36 | static struct mfgpt_timer_t { | 38 | static struct mfgpt_timer_t { |
| 37 | unsigned int avail:1; | 39 | unsigned int avail:1; |
| 38 | } mfgpt_timers[MFGPT_MAX_TIMERS]; | 40 | } mfgpt_timers[MFGPT_MAX_TIMERS]; |
| @@ -157,29 +159,48 @@ int geode_mfgpt_toggle_event(int timer, int cmp, int event, int enable) | |||
| 157 | } | 159 | } |
| 158 | EXPORT_SYMBOL_GPL(geode_mfgpt_toggle_event); | 160 | EXPORT_SYMBOL_GPL(geode_mfgpt_toggle_event); |
| 159 | 161 | ||
| 160 | int geode_mfgpt_set_irq(int timer, int cmp, int irq, int enable) | 162 | int geode_mfgpt_set_irq(int timer, int cmp, int *irq, int enable) |
| 161 | { | 163 | { |
| 162 | u32 val, dummy; | 164 | u32 zsel, lpc, dummy; |
| 163 | int offset; | 165 | int shift; |
| 164 | 166 | ||
| 165 | if (timer < 0 || timer >= MFGPT_MAX_TIMERS) | 167 | if (timer < 0 || timer >= MFGPT_MAX_TIMERS) |
| 166 | return -EIO; | 168 | return -EIO; |
| 167 | 169 | ||
| 168 | if (geode_mfgpt_toggle_event(timer, cmp, MFGPT_EVENT_IRQ, enable)) | 170 | /* |
| 171 | * Unfortunately, MFGPTs come in pairs sharing their IRQ lines. If VSA | ||
| 172 | * is using the same CMP of the timer's Siamese twin, the IRQ is set to | ||
| 173 | * 2, and we mustn't use nor change it. | ||
| 174 | * XXX: Likewise, 2 Linux drivers might clash if the 2nd overwrites the | ||
| 175 | * IRQ of the 1st. This can only happen if forcing an IRQ, calling this | ||
| 176 | * with *irq==0 is safe. Currently there _are_ no 2 drivers. | ||
| 177 | */ | ||
| 178 | rdmsr(MSR_PIC_ZSEL_LOW, zsel, dummy); | ||
| 179 | shift = ((cmp == MFGPT_CMP1 ? 0 : 4) + timer % 4) * 4; | ||
| 180 | if (((zsel >> shift) & 0xF) == 2) | ||
| 169 | return -EIO; | 181 | return -EIO; |
| 170 | 182 | ||
| 171 | rdmsr(MSR_PIC_ZSEL_LOW, val, dummy); | 183 | /* Choose IRQ: if none supplied, keep IRQ already set or use default */ |
| 184 | if (!*irq) | ||
| 185 | *irq = (zsel >> shift) & 0xF; | ||
| 186 | if (!*irq) | ||
| 187 | *irq = MFGPT_DEFAULT_IRQ; | ||
| 172 | 188 | ||
| 173 | offset = (timer % 4) * 4; | 189 | /* Can't use IRQ if it's 0 (=disabled), 2, or routed to LPC */ |
| 174 | 190 | if (*irq < 1 || *irq == 2 || *irq > 15) | |
| 175 | val &= ~((0xF << offset) | (0xF << (offset + 16))); | 191 | return -EIO; |
| 192 | rdmsr(MSR_PIC_IRQM_LPC, lpc, dummy); | ||
| 193 | if (lpc & (1 << *irq)) | ||
| 194 | return -EIO; | ||
| 176 | 195 | ||
| 196 | /* All chosen and checked - go for it */ | ||
| 197 | if (geode_mfgpt_toggle_event(timer, cmp, MFGPT_EVENT_IRQ, enable)) | ||
| 198 | return -EIO; | ||
| 177 | if (enable) { | 199 | if (enable) { |
| 178 | val |= (irq & 0x0F) << (offset); | 200 | zsel = (zsel & ~(0xF << shift)) | (*irq << shift); |
| 179 | val |= (irq & 0x0F) << (offset + 16); | 201 | wrmsr(MSR_PIC_ZSEL_LOW, zsel, dummy); |
| 180 | } | 202 | } |
| 181 | 203 | ||
| 182 | wrmsr(MSR_PIC_ZSEL_LOW, val, dummy); | ||
| 183 | return 0; | 204 | return 0; |
| 184 | } | 205 | } |
| 185 | 206 | ||
| @@ -242,7 +263,7 @@ EXPORT_SYMBOL_GPL(geode_mfgpt_alloc_timer); | |||
| 242 | static unsigned int mfgpt_tick_mode = CLOCK_EVT_MODE_SHUTDOWN; | 263 | static unsigned int mfgpt_tick_mode = CLOCK_EVT_MODE_SHUTDOWN; |
| 243 | static u16 mfgpt_event_clock; | 264 | static u16 mfgpt_event_clock; |
| 244 | 265 | ||
| 245 | static int irq = 7; | 266 | static int irq; |
| 246 | static int __init mfgpt_setup(char *str) | 267 | static int __init mfgpt_setup(char *str) |
| 247 | { | 268 | { |
| 248 | get_option(&str, &irq); | 269 | get_option(&str, &irq); |
| @@ -346,7 +367,7 @@ int __init mfgpt_timer_setup(void) | |||
| 346 | mfgpt_event_clock = timer; | 367 | mfgpt_event_clock = timer; |
| 347 | 368 | ||
| 348 | /* Set up the IRQ on the MFGPT side */ | 369 | /* Set up the IRQ on the MFGPT side */ |
| 349 | if (geode_mfgpt_setup_irq(mfgpt_event_clock, MFGPT_CMP2, irq)) { | 370 | if (geode_mfgpt_setup_irq(mfgpt_event_clock, MFGPT_CMP2, &irq)) { |
| 350 | printk(KERN_ERR "mfgpt-timer: Could not set up IRQ %d\n", irq); | 371 | printk(KERN_ERR "mfgpt-timer: Could not set up IRQ %d\n", irq); |
| 351 | return -EIO; | 372 | return -EIO; |
| 352 | } | 373 | } |
| @@ -374,13 +395,14 @@ int __init mfgpt_timer_setup(void) | |||
| 374 | &mfgpt_clockevent); | 395 | &mfgpt_clockevent); |
| 375 | 396 | ||
| 376 | printk(KERN_INFO | 397 | printk(KERN_INFO |
| 377 | "mfgpt-timer: registering the MFGPT timer as a clock event.\n"); | 398 | "mfgpt-timer: Registering MFGPT timer %d as a clock event, using IRQ %d\n", |
| 399 | timer, irq); | ||
| 378 | clockevents_register_device(&mfgpt_clockevent); | 400 | clockevents_register_device(&mfgpt_clockevent); |
| 379 | 401 | ||
| 380 | return 0; | 402 | return 0; |
| 381 | 403 | ||
| 382 | err: | 404 | err: |
| 383 | geode_mfgpt_release_irq(mfgpt_event_clock, MFGPT_CMP2, irq); | 405 | geode_mfgpt_release_irq(mfgpt_event_clock, MFGPT_CMP2, &irq); |
| 384 | printk(KERN_ERR | 406 | printk(KERN_ERR |
| 385 | "mfgpt-timer: Unable to set up the MFGPT clock source\n"); | 407 | "mfgpt-timer: Unable to set up the MFGPT clock source\n"); |
| 386 | return -EIO; | 408 | return -EIO; |
diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c index 9fd809552447..e43938086885 100644 --- a/arch/x86/kernel/msr.c +++ b/arch/x86/kernel/msr.c | |||
| @@ -131,7 +131,7 @@ static int msr_open(struct inode *inode, struct file *file) | |||
| 131 | ret = -EIO; /* MSR not supported */ | 131 | ret = -EIO; /* MSR not supported */ |
| 132 | out: | 132 | out: |
| 133 | unlock_kernel(); | 133 | unlock_kernel(); |
| 134 | return 0; | 134 | return ret; |
| 135 | } | 135 | } |
| 136 | 136 | ||
| 137 | /* | 137 | /* |
diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c index ac6d51222e7d..abb78a2cc4ad 100644 --- a/arch/x86/kernel/nmi.c +++ b/arch/x86/kernel/nmi.c | |||
| @@ -114,6 +114,23 @@ static __init void nmi_cpu_busy(void *data) | |||
| 114 | } | 114 | } |
| 115 | #endif | 115 | #endif |
| 116 | 116 | ||
| 117 | static void report_broken_nmi(int cpu, int *prev_nmi_count) | ||
| 118 | { | ||
| 119 | printk(KERN_CONT "\n"); | ||
| 120 | |||
| 121 | printk(KERN_WARNING | ||
| 122 | "WARNING: CPU#%d: NMI appears to be stuck (%d->%d)!\n", | ||
| 123 | cpu, prev_nmi_count[cpu], get_nmi_count(cpu)); | ||
| 124 | |||
| 125 | printk(KERN_WARNING | ||
| 126 | "Please report this to bugzilla.kernel.org,\n"); | ||
| 127 | printk(KERN_WARNING | ||
| 128 | "and attach the output of the 'dmesg' command.\n"); | ||
| 129 | |||
| 130 | per_cpu(wd_enabled, cpu) = 0; | ||
| 131 | atomic_dec(&nmi_active); | ||
| 132 | } | ||
| 133 | |||
| 117 | int __init check_nmi_watchdog(void) | 134 | int __init check_nmi_watchdog(void) |
| 118 | { | 135 | { |
| 119 | unsigned int *prev_nmi_count; | 136 | unsigned int *prev_nmi_count; |
| @@ -141,15 +158,8 @@ int __init check_nmi_watchdog(void) | |||
| 141 | for_each_online_cpu(cpu) { | 158 | for_each_online_cpu(cpu) { |
| 142 | if (!per_cpu(wd_enabled, cpu)) | 159 | if (!per_cpu(wd_enabled, cpu)) |
| 143 | continue; | 160 | continue; |
| 144 | if (get_nmi_count(cpu) - prev_nmi_count[cpu] <= 5) { | 161 | if (get_nmi_count(cpu) - prev_nmi_count[cpu] <= 5) |
| 145 | printk(KERN_WARNING "WARNING: CPU#%d: NMI " | 162 | report_broken_nmi(cpu, prev_nmi_count); |
| 146 | "appears to be stuck (%d->%d)!\n", | ||
| 147 | cpu, | ||
| 148 | prev_nmi_count[cpu], | ||
| 149 | get_nmi_count(cpu)); | ||
| 150 | per_cpu(wd_enabled, cpu) = 0; | ||
| 151 | atomic_dec(&nmi_active); | ||
| 152 | } | ||
| 153 | } | 163 | } |
| 154 | endflag = 1; | 164 | endflag = 1; |
| 155 | if (!atomic_read(&nmi_active)) { | 165 | if (!atomic_read(&nmi_active)) { |
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index 53bc653ed5ca..3b7a1ddcc0bc 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
| @@ -95,7 +95,6 @@ static inline void play_dead(void) | |||
| 95 | { | 95 | { |
| 96 | /* This must be done before dead CPU ack */ | 96 | /* This must be done before dead CPU ack */ |
| 97 | cpu_exit_clear(); | 97 | cpu_exit_clear(); |
| 98 | wbinvd(); | ||
| 99 | mb(); | 98 | mb(); |
| 100 | /* Ack it */ | 99 | /* Ack it */ |
| 101 | __get_cpu_var(cpu_state) = CPU_DEAD; | 100 | __get_cpu_var(cpu_state) = CPU_DEAD; |
| @@ -104,8 +103,8 @@ static inline void play_dead(void) | |||
| 104 | * With physical CPU hotplug, we should halt the cpu | 103 | * With physical CPU hotplug, we should halt the cpu |
| 105 | */ | 104 | */ |
| 106 | local_irq_disable(); | 105 | local_irq_disable(); |
| 107 | while (1) | 106 | /* mask all interrupts, flush any and all caches, and halt */ |
| 108 | halt(); | 107 | wbinvd_halt(); |
| 109 | } | 108 | } |
| 110 | #else | 109 | #else |
| 111 | static inline void play_dead(void) | 110 | static inline void play_dead(void) |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 3fb62a7d9a16..71553b664e2a 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
| @@ -93,14 +93,13 @@ DECLARE_PER_CPU(int, cpu_state); | |||
| 93 | static inline void play_dead(void) | 93 | static inline void play_dead(void) |
| 94 | { | 94 | { |
| 95 | idle_task_exit(); | 95 | idle_task_exit(); |
| 96 | wbinvd(); | ||
| 97 | mb(); | 96 | mb(); |
| 98 | /* Ack it */ | 97 | /* Ack it */ |
| 99 | __get_cpu_var(cpu_state) = CPU_DEAD; | 98 | __get_cpu_var(cpu_state) = CPU_DEAD; |
| 100 | 99 | ||
| 101 | local_irq_disable(); | 100 | local_irq_disable(); |
| 102 | while (1) | 101 | /* mask all interrupts, flush any and all caches, and halt */ |
| 103 | halt(); | 102 | wbinvd_halt(); |
| 104 | } | 103 | } |
| 105 | #else | 104 | #else |
| 106 | static inline void play_dead(void) | 105 | static inline void play_dead(void) |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 68b48e3fbcbd..a4656adab53b 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
| @@ -445,7 +445,7 @@ static void __init reserve_early_setup_data(void) | |||
| 445 | * @size: Size of the crashkernel memory to reserve. | 445 | * @size: Size of the crashkernel memory to reserve. |
| 446 | * Returns the base address on success, and -1ULL on failure. | 446 | * Returns the base address on success, and -1ULL on failure. |
| 447 | */ | 447 | */ |
| 448 | unsigned long long find_and_reserve_crashkernel(unsigned long long size) | 448 | unsigned long long __init find_and_reserve_crashkernel(unsigned long long size) |
| 449 | { | 449 | { |
| 450 | const unsigned long long alignment = 16<<20; /* 16M */ | 450 | const unsigned long long alignment = 16<<20; /* 16M */ |
| 451 | unsigned long long start = 0LL; | 451 | unsigned long long start = 0LL; |
diff --git a/arch/x86/kernel/signal_64.c b/arch/x86/kernel/signal_64.c index b45ef8ddd651..ca316b5b742c 100644 --- a/arch/x86/kernel/signal_64.c +++ b/arch/x86/kernel/signal_64.c | |||
| @@ -104,7 +104,16 @@ static inline int restore_i387(struct _fpstate __user *buf) | |||
| 104 | clts(); | 104 | clts(); |
| 105 | task_thread_info(current)->status |= TS_USEDFPU; | 105 | task_thread_info(current)->status |= TS_USEDFPU; |
| 106 | } | 106 | } |
| 107 | return restore_fpu_checking((__force struct i387_fxsave_struct *)buf); | 107 | err = restore_fpu_checking((__force struct i387_fxsave_struct *)buf); |
| 108 | if (unlikely(err)) { | ||
| 109 | /* | ||
| 110 | * Encountered an error while doing the restore from the | ||
| 111 | * user buffer, clear the fpu state. | ||
| 112 | */ | ||
| 113 | clear_fpu(tsk); | ||
| 114 | clear_used_math(); | ||
| 115 | } | ||
| 116 | return err; | ||
| 108 | } | 117 | } |
| 109 | 118 | ||
| 110 | /* | 119 | /* |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 91055d7fc1b0..a8fb8a980fae 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
| @@ -994,17 +994,7 @@ int __cpuinit native_cpu_up(unsigned int cpu) | |||
| 994 | flush_tlb_all(); | 994 | flush_tlb_all(); |
| 995 | low_mappings = 1; | 995 | low_mappings = 1; |
| 996 | 996 | ||
| 997 | #ifdef CONFIG_X86_PC | ||
| 998 | if (def_to_bigsmp && apicid > 8) { | ||
| 999 | printk(KERN_WARNING | ||
| 1000 | "More than 8 CPUs detected - skipping them.\n" | ||
| 1001 | "Use CONFIG_X86_GENERICARCH and CONFIG_X86_BIGSMP.\n"); | ||
| 1002 | err = -1; | ||
| 1003 | } else | ||
| 1004 | err = do_boot_cpu(apicid, cpu); | ||
| 1005 | #else | ||
| 1006 | err = do_boot_cpu(apicid, cpu); | 997 | err = do_boot_cpu(apicid, cpu); |
| 1007 | #endif | ||
| 1008 | 998 | ||
| 1009 | zap_low_mappings(); | 999 | zap_low_mappings(); |
| 1010 | low_mappings = 0; | 1000 | low_mappings = 0; |
| @@ -1058,6 +1048,34 @@ static __init void disable_smp(void) | |||
| 1058 | static int __init smp_sanity_check(unsigned max_cpus) | 1048 | static int __init smp_sanity_check(unsigned max_cpus) |
| 1059 | { | 1049 | { |
| 1060 | preempt_disable(); | 1050 | preempt_disable(); |
| 1051 | |||
| 1052 | #if defined(CONFIG_X86_PC) && defined(CONFIG_X86_32) | ||
| 1053 | if (def_to_bigsmp && nr_cpu_ids > 8) { | ||
| 1054 | unsigned int cpu; | ||
| 1055 | unsigned nr; | ||
| 1056 | |||
| 1057 | printk(KERN_WARNING | ||
| 1058 | "More than 8 CPUs detected - skipping them.\n" | ||
| 1059 | "Use CONFIG_X86_GENERICARCH and CONFIG_X86_BIGSMP.\n"); | ||
| 1060 | |||
| 1061 | nr = 0; | ||
| 1062 | for_each_present_cpu(cpu) { | ||
| 1063 | if (nr >= 8) | ||
| 1064 | cpu_clear(cpu, cpu_present_map); | ||
| 1065 | nr++; | ||
| 1066 | } | ||
| 1067 | |||
| 1068 | nr = 0; | ||
| 1069 | for_each_possible_cpu(cpu) { | ||
| 1070 | if (nr >= 8) | ||
| 1071 | cpu_clear(cpu, cpu_possible_map); | ||
| 1072 | nr++; | ||
| 1073 | } | ||
| 1074 | |||
| 1075 | nr_cpu_ids = 8; | ||
| 1076 | } | ||
| 1077 | #endif | ||
| 1078 | |||
| 1061 | if (!physid_isset(hard_smp_processor_id(), phys_cpu_present_map)) { | 1079 | if (!physid_isset(hard_smp_processor_id(), phys_cpu_present_map)) { |
| 1062 | printk(KERN_WARNING "weird, boot CPU (#%d) not listed" | 1080 | printk(KERN_WARNING "weird, boot CPU (#%d) not listed" |
| 1063 | "by the BIOS.\n", hard_smp_processor_id()); | 1081 | "by the BIOS.\n", hard_smp_processor_id()); |
| @@ -1386,17 +1404,3 @@ void __cpu_die(unsigned int cpu) | |||
| 1386 | BUG(); | 1404 | BUG(); |
| 1387 | } | 1405 | } |
| 1388 | #endif | 1406 | #endif |
| 1389 | |||
| 1390 | /* | ||
| 1391 | * If the BIOS enumerates physical processors before logical, | ||
| 1392 | * maxcpus=N at enumeration-time can be used to disable HT. | ||
| 1393 | */ | ||
| 1394 | static int __init parse_maxcpus(char *arg) | ||
| 1395 | { | ||
| 1396 | extern unsigned int maxcpus; | ||
| 1397 | |||
| 1398 | if (arg) | ||
| 1399 | maxcpus = simple_strtoul(arg, NULL, 0); | ||
| 1400 | return 0; | ||
| 1401 | } | ||
| 1402 | early_param("maxcpus", parse_maxcpus); | ||
diff --git a/arch/x86/kernel/smpcommon.c b/arch/x86/kernel/smpcommon.c index 99941b37eca0..397e309839dd 100644 --- a/arch/x86/kernel/smpcommon.c +++ b/arch/x86/kernel/smpcommon.c | |||
| @@ -8,18 +8,21 @@ | |||
| 8 | DEFINE_PER_CPU(unsigned long, this_cpu_off); | 8 | DEFINE_PER_CPU(unsigned long, this_cpu_off); |
| 9 | EXPORT_PER_CPU_SYMBOL(this_cpu_off); | 9 | EXPORT_PER_CPU_SYMBOL(this_cpu_off); |
| 10 | 10 | ||
| 11 | /* Initialize the CPU's GDT. This is either the boot CPU doing itself | 11 | /* |
| 12 | (still using the master per-cpu area), or a CPU doing it for a | 12 | * Initialize the CPU's GDT. This is either the boot CPU doing itself |
| 13 | secondary which will soon come up. */ | 13 | * (still using the master per-cpu area), or a CPU doing it for a |
| 14 | * secondary which will soon come up. | ||
| 15 | */ | ||
| 14 | __cpuinit void init_gdt(int cpu) | 16 | __cpuinit void init_gdt(int cpu) |
| 15 | { | 17 | { |
| 16 | struct desc_struct *gdt = get_cpu_gdt_table(cpu); | 18 | struct desc_struct gdt; |
| 17 | 19 | ||
| 18 | pack_descriptor(&gdt[GDT_ENTRY_PERCPU], | 20 | pack_descriptor(&gdt, __per_cpu_offset[cpu], 0xFFFFF, |
| 19 | __per_cpu_offset[cpu], 0xFFFFF, | ||
| 20 | 0x2 | DESCTYPE_S, 0x8); | 21 | 0x2 | DESCTYPE_S, 0x8); |
| 22 | gdt.s = 1; | ||
| 21 | 23 | ||
| 22 | gdt[GDT_ENTRY_PERCPU].s = 1; | 24 | write_gdt_entry(get_cpu_gdt_table(cpu), |
| 25 | GDT_ENTRY_PERCPU, &gdt, DESCTYPE_S); | ||
| 23 | 26 | ||
| 24 | per_cpu(this_cpu_off, cpu) = __per_cpu_offset[cpu]; | 27 | per_cpu(this_cpu_off, cpu) = __per_cpu_offset[cpu]; |
| 25 | per_cpu(cpu_number, cpu) = cpu; | 28 | per_cpu(cpu_number, cpu) = cpu; |
diff --git a/arch/x86/kernel/traps_64.c b/arch/x86/kernel/traps_64.c index 3f18d73f420c..513caaca7115 100644 --- a/arch/x86/kernel/traps_64.c +++ b/arch/x86/kernel/traps_64.c | |||
| @@ -1131,7 +1131,14 @@ asmlinkage void math_state_restore(void) | |||
| 1131 | } | 1131 | } |
| 1132 | 1132 | ||
| 1133 | clts(); /* Allow maths ops (or we recurse) */ | 1133 | clts(); /* Allow maths ops (or we recurse) */ |
| 1134 | restore_fpu_checking(&me->thread.xstate->fxsave); | 1134 | /* |
| 1135 | * Paranoid restore. send a SIGSEGV if we fail to restore the state. | ||
| 1136 | */ | ||
| 1137 | if (unlikely(restore_fpu_checking(&me->thread.xstate->fxsave))) { | ||
| 1138 | stts(); | ||
| 1139 | force_sig(SIGSEGV, me); | ||
| 1140 | return; | ||
| 1141 | } | ||
| 1135 | task_thread_info(me)->status |= TS_USEDFPU; | 1142 | task_thread_info(me)->status |= TS_USEDFPU; |
| 1136 | me->fpu_counter++; | 1143 | me->fpu_counter++; |
| 1137 | } | 1144 | } |
diff --git a/arch/x86/kernel/visws_quirks.c b/arch/x86/kernel/visws_quirks.c index 41e01b145c48..594ef47f0a63 100644 --- a/arch/x86/kernel/visws_quirks.c +++ b/arch/x86/kernel/visws_quirks.c | |||
| @@ -184,8 +184,6 @@ static int __init visws_get_smp_config(unsigned int early) | |||
| 184 | return 1; | 184 | return 1; |
| 185 | } | 185 | } |
| 186 | 186 | ||
| 187 | extern unsigned int __cpuinitdata maxcpus; | ||
| 188 | |||
| 189 | /* | 187 | /* |
| 190 | * The Visual Workstation is Intel MP compliant in the hardware | 188 | * The Visual Workstation is Intel MP compliant in the hardware |
| 191 | * sense, but it doesn't have a BIOS(-configuration table). | 189 | * sense, but it doesn't have a BIOS(-configuration table). |
| @@ -244,8 +242,8 @@ static int __init visws_find_smp_config(unsigned int reserve) | |||
| 244 | ncpus = CO_CPU_MAX; | 242 | ncpus = CO_CPU_MAX; |
| 245 | } | 243 | } |
| 246 | 244 | ||
| 247 | if (ncpus > maxcpus) | 245 | if (ncpus > setup_max_cpus) |
| 248 | ncpus = maxcpus; | 246 | ncpus = setup_max_cpus; |
| 249 | 247 | ||
| 250 | #ifdef CONFIG_X86_LOCAL_APIC | 248 | #ifdef CONFIG_X86_LOCAL_APIC |
| 251 | smp_found_config = 1; | 249 | smp_found_config = 1; |
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 129618ca0ea2..a87ea0e4b3dc 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
| @@ -60,7 +60,7 @@ static unsigned long dma_reserve __initdata; | |||
| 60 | 60 | ||
| 61 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | 61 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); |
| 62 | 62 | ||
| 63 | int direct_gbpages __meminitdata | 63 | int direct_gbpages |
| 64 | #ifdef CONFIG_DIRECT_GBPAGES | 64 | #ifdef CONFIG_DIRECT_GBPAGES |
| 65 | = 1 | 65 | = 1 |
| 66 | #endif | 66 | #endif |
| @@ -88,7 +88,11 @@ early_param("gbpages", parse_direct_gbpages_on); | |||
| 88 | 88 | ||
| 89 | int after_bootmem; | 89 | int after_bootmem; |
| 90 | 90 | ||
| 91 | static __init void *spp_getpage(void) | 91 | /* |
| 92 | * NOTE: This function is marked __ref because it calls __init function | ||
| 93 | * (alloc_bootmem_pages). It's safe to do it ONLY when after_bootmem == 0. | ||
| 94 | */ | ||
| 95 | static __ref void *spp_getpage(void) | ||
| 92 | { | 96 | { |
| 93 | void *ptr; | 97 | void *ptr; |
| 94 | 98 | ||
| @@ -314,6 +318,7 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end, | |||
| 314 | { | 318 | { |
| 315 | unsigned long pages = 0; | 319 | unsigned long pages = 0; |
| 316 | unsigned long last_map_addr = end; | 320 | unsigned long last_map_addr = end; |
| 321 | unsigned long start = address; | ||
| 317 | 322 | ||
| 318 | int i = pmd_index(address); | 323 | int i = pmd_index(address); |
| 319 | 324 | ||
| @@ -334,6 +339,9 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end, | |||
| 334 | if (!pmd_large(*pmd)) | 339 | if (!pmd_large(*pmd)) |
| 335 | last_map_addr = phys_pte_update(pmd, address, | 340 | last_map_addr = phys_pte_update(pmd, address, |
| 336 | end); | 341 | end); |
| 342 | /* Count entries we're using from level2_ident_pgt */ | ||
| 343 | if (start == 0) | ||
| 344 | pages++; | ||
| 337 | continue; | 345 | continue; |
| 338 | } | 346 | } |
| 339 | 347 | ||
diff --git a/arch/x86/mm/pageattr-test.c b/arch/x86/mm/pageattr-test.c index 0dcd42eb94e6..d4aa503caaa2 100644 --- a/arch/x86/mm/pageattr-test.c +++ b/arch/x86/mm/pageattr-test.c | |||
| @@ -221,8 +221,7 @@ static int pageattr_test(void) | |||
| 221 | failed += print_split(&sc); | 221 | failed += print_split(&sc); |
| 222 | 222 | ||
| 223 | if (failed) { | 223 | if (failed) { |
| 224 | printk(KERN_ERR "NOT PASSED. Please report.\n"); | 224 | WARN(1, KERN_ERR "NOT PASSED. Please report.\n"); |
| 225 | WARN_ON(1); | ||
| 226 | return -EINVAL; | 225 | return -EINVAL; |
| 227 | } else { | 226 | } else { |
| 228 | if (print) | 227 | if (print) |
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 65c6e46bf059..f5f5154ea11e 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c | |||
| @@ -55,13 +55,19 @@ static void split_page_count(int level) | |||
| 55 | 55 | ||
| 56 | int arch_report_meminfo(char *page) | 56 | int arch_report_meminfo(char *page) |
| 57 | { | 57 | { |
| 58 | int n = sprintf(page, "DirectMap4k: %8lu\n" | 58 | int n = sprintf(page, "DirectMap4k: %8lu kB\n", |
| 59 | "DirectMap2M: %8lu\n", | 59 | direct_pages_count[PG_LEVEL_4K] << 2); |
| 60 | direct_pages_count[PG_LEVEL_4K], | 60 | #if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) |
| 61 | direct_pages_count[PG_LEVEL_2M]); | 61 | n += sprintf(page + n, "DirectMap2M: %8lu kB\n", |
| 62 | direct_pages_count[PG_LEVEL_2M] << 11); | ||
| 63 | #else | ||
| 64 | n += sprintf(page + n, "DirectMap4M: %8lu kB\n", | ||
| 65 | direct_pages_count[PG_LEVEL_2M] << 12); | ||
| 66 | #endif | ||
| 62 | #ifdef CONFIG_X86_64 | 67 | #ifdef CONFIG_X86_64 |
| 63 | n += sprintf(page + n, "DirectMap1G: %8lu\n", | 68 | if (direct_gbpages) |
| 64 | direct_pages_count[PG_LEVEL_1G]); | 69 | n += sprintf(page + n, "DirectMap1G: %8lu kB\n", |
| 70 | direct_pages_count[PG_LEVEL_1G] << 20); | ||
| 65 | #endif | 71 | #endif |
| 66 | return n; | 72 | return n; |
| 67 | } | 73 | } |
| @@ -592,10 +598,9 @@ repeat: | |||
| 592 | if (!pte_val(old_pte)) { | 598 | if (!pte_val(old_pte)) { |
| 593 | if (!primary) | 599 | if (!primary) |
| 594 | return 0; | 600 | return 0; |
| 595 | printk(KERN_WARNING "CPA: called for zero pte. " | 601 | WARN(1, KERN_WARNING "CPA: called for zero pte. " |
| 596 | "vaddr = %lx cpa->vaddr = %lx\n", address, | 602 | "vaddr = %lx cpa->vaddr = %lx\n", address, |
| 597 | cpa->vaddr); | 603 | cpa->vaddr); |
| 598 | WARN_ON(1); | ||
| 599 | return -EINVAL; | 604 | return -EINVAL; |
| 600 | } | 605 | } |
| 601 | 606 | ||
diff --git a/arch/x86/mm/srat_32.c b/arch/x86/mm/srat_32.c index 1eb2973a301c..16ae70fc57e7 100644 --- a/arch/x86/mm/srat_32.c +++ b/arch/x86/mm/srat_32.c | |||
| @@ -178,7 +178,7 @@ void acpi_numa_arch_fixup(void) | |||
| 178 | * start of the node, and that the current "end" address is after | 178 | * start of the node, and that the current "end" address is after |
| 179 | * the previous one. | 179 | * the previous one. |
| 180 | */ | 180 | */ |
| 181 | static __init void node_read_chunk(int nid, struct node_memory_chunk_s *memory_chunk) | 181 | static __init int node_read_chunk(int nid, struct node_memory_chunk_s *memory_chunk) |
| 182 | { | 182 | { |
| 183 | /* | 183 | /* |
| 184 | * Only add present memory as told by the e820. | 184 | * Only add present memory as told by the e820. |
| @@ -189,10 +189,10 @@ static __init void node_read_chunk(int nid, struct node_memory_chunk_s *memory_c | |||
| 189 | if (memory_chunk->start_pfn >= max_pfn) { | 189 | if (memory_chunk->start_pfn >= max_pfn) { |
| 190 | printk(KERN_INFO "Ignoring SRAT pfns: %08lx - %08lx\n", | 190 | printk(KERN_INFO "Ignoring SRAT pfns: %08lx - %08lx\n", |
| 191 | memory_chunk->start_pfn, memory_chunk->end_pfn); | 191 | memory_chunk->start_pfn, memory_chunk->end_pfn); |
| 192 | return; | 192 | return -1; |
| 193 | } | 193 | } |
| 194 | if (memory_chunk->nid != nid) | 194 | if (memory_chunk->nid != nid) |
| 195 | return; | 195 | return -1; |
| 196 | 196 | ||
| 197 | if (!node_has_online_mem(nid)) | 197 | if (!node_has_online_mem(nid)) |
| 198 | node_start_pfn[nid] = memory_chunk->start_pfn; | 198 | node_start_pfn[nid] = memory_chunk->start_pfn; |
| @@ -202,6 +202,8 @@ static __init void node_read_chunk(int nid, struct node_memory_chunk_s *memory_c | |||
| 202 | 202 | ||
| 203 | if (node_end_pfn[nid] < memory_chunk->end_pfn) | 203 | if (node_end_pfn[nid] < memory_chunk->end_pfn) |
| 204 | node_end_pfn[nid] = memory_chunk->end_pfn; | 204 | node_end_pfn[nid] = memory_chunk->end_pfn; |
| 205 | |||
| 206 | return 0; | ||
| 205 | } | 207 | } |
| 206 | 208 | ||
| 207 | int __init get_memcfg_from_srat(void) | 209 | int __init get_memcfg_from_srat(void) |
| @@ -259,7 +261,9 @@ int __init get_memcfg_from_srat(void) | |||
| 259 | printk(KERN_DEBUG | 261 | printk(KERN_DEBUG |
| 260 | "chunk %d nid %d start_pfn %08lx end_pfn %08lx\n", | 262 | "chunk %d nid %d start_pfn %08lx end_pfn %08lx\n", |
| 261 | j, chunk->nid, chunk->start_pfn, chunk->end_pfn); | 263 | j, chunk->nid, chunk->start_pfn, chunk->end_pfn); |
| 262 | node_read_chunk(chunk->nid, chunk); | 264 | if (node_read_chunk(chunk->nid, chunk)) |
| 265 | continue; | ||
| 266 | |||
| 263 | e820_register_active_regions(chunk->nid, chunk->start_pfn, | 267 | e820_register_active_regions(chunk->nid, chunk->start_pfn, |
| 264 | min(chunk->end_pfn, max_pfn)); | 268 | min(chunk->end_pfn, max_pfn)); |
| 265 | } | 269 | } |
diff --git a/arch/x86/pci/mmconfig-shared.c b/arch/x86/pci/mmconfig-shared.c index 23faaa890ffc..2bd5c53f6386 100644 --- a/arch/x86/pci/mmconfig-shared.c +++ b/arch/x86/pci/mmconfig-shared.c | |||
| @@ -365,7 +365,7 @@ static void __init pci_mmcfg_reject_broken(int early) | |||
| 365 | return; | 365 | return; |
| 366 | 366 | ||
| 367 | reject: | 367 | reject: |
| 368 | printk(KERN_ERR "PCI: Not using MMCONFIG.\n"); | 368 | printk(KERN_INFO "PCI: Not using MMCONFIG.\n"); |
| 369 | pci_mmcfg_arch_free(); | 369 | pci_mmcfg_arch_free(); |
| 370 | kfree(pci_mmcfg_config); | 370 | kfree(pci_mmcfg_config); |
| 371 | pci_mmcfg_config = NULL; | 371 | pci_mmcfg_config = NULL; |
diff --git a/drivers/char/pcmcia/ipwireless/tty.c b/drivers/char/pcmcia/ipwireless/tty.c index b1414507997c..3a23e7694d55 100644 --- a/drivers/char/pcmcia/ipwireless/tty.c +++ b/drivers/char/pcmcia/ipwireless/tty.c | |||
| @@ -29,7 +29,6 @@ | |||
| 29 | #include <linux/tty_driver.h> | 29 | #include <linux/tty_driver.h> |
| 30 | #include <linux/tty_flip.h> | 30 | #include <linux/tty_flip.h> |
| 31 | #include <linux/uaccess.h> | 31 | #include <linux/uaccess.h> |
| 32 | #include <linux/version.h> | ||
| 33 | 32 | ||
| 34 | #include "tty.h" | 33 | #include "tty.h" |
| 35 | #include "network.h" | 34 | #include "network.h" |
diff --git a/drivers/char/synclink_gt.c b/drivers/char/synclink_gt.c index 509c89ac5bd3..08911ed66494 100644 --- a/drivers/char/synclink_gt.c +++ b/drivers/char/synclink_gt.c | |||
| @@ -47,7 +47,6 @@ | |||
| 47 | 47 | ||
| 48 | 48 | ||
| 49 | #include <linux/module.h> | 49 | #include <linux/module.h> |
| 50 | #include <linux/version.h> | ||
| 51 | #include <linux/errno.h> | 50 | #include <linux/errno.h> |
| 52 | #include <linux/signal.h> | 51 | #include <linux/signal.h> |
| 53 | #include <linux/sched.h> | 52 | #include <linux/sched.h> |
diff --git a/drivers/char/xilinx_hwicap/xilinx_hwicap.c b/drivers/char/xilinx_hwicap/xilinx_hwicap.c index 8bfee5fb7223..278c9857bcf5 100644 --- a/drivers/char/xilinx_hwicap/xilinx_hwicap.c +++ b/drivers/char/xilinx_hwicap/xilinx_hwicap.c | |||
| @@ -74,7 +74,6 @@ | |||
| 74 | * currently programmed in the FPGA. | 74 | * currently programmed in the FPGA. |
| 75 | */ | 75 | */ |
| 76 | 76 | ||
| 77 | #include <linux/version.h> | ||
| 78 | #include <linux/module.h> | 77 | #include <linux/module.h> |
| 79 | #include <linux/kernel.h> | 78 | #include <linux/kernel.h> |
| 80 | #include <linux/types.h> | 79 | #include <linux/types.h> |
diff --git a/drivers/dma/mv_xor.c b/drivers/dma/mv_xor.c index a4e4494663bf..0328da020a10 100644 --- a/drivers/dma/mv_xor.c +++ b/drivers/dma/mv_xor.c | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
| 26 | #include <linux/platform_device.h> | 26 | #include <linux/platform_device.h> |
| 27 | #include <linux/memory.h> | 27 | #include <linux/memory.h> |
| 28 | #include <asm/plat-orion/mv_xor.h> | 28 | #include <plat/mv_xor.h> |
| 29 | #include "mv_xor.h" | 29 | #include "mv_xor.h" |
| 30 | 30 | ||
| 31 | static void mv_xor_issue_pending(struct dma_chan *chan); | 31 | static void mv_xor_issue_pending(struct dma_chan *chan); |
diff --git a/drivers/mmc/host/s3cmci.c b/drivers/mmc/host/s3cmci.c index 7c994e1ae276..ae16d845d746 100644 --- a/drivers/mmc/host/s3cmci.c +++ b/drivers/mmc/host/s3cmci.c | |||
| @@ -595,8 +595,9 @@ static irqreturn_t s3cmci_irq_cd(int irq, void *dev_id) | |||
| 595 | return IRQ_HANDLED; | 595 | return IRQ_HANDLED; |
| 596 | } | 596 | } |
| 597 | 597 | ||
| 598 | void s3cmci_dma_done_callback(struct s3c2410_dma_chan *dma_ch, void *buf_id, | 598 | static void s3cmci_dma_done_callback(struct s3c2410_dma_chan *dma_ch, |
| 599 | int size, enum s3c2410_dma_buffresult result) | 599 | void *buf_id, int size, |
| 600 | enum s3c2410_dma_buffresult result) | ||
| 600 | { | 601 | { |
| 601 | struct s3cmci_host *host = buf_id; | 602 | struct s3cmci_host *host = buf_id; |
| 602 | unsigned long iflags; | 603 | unsigned long iflags; |
| @@ -740,8 +741,8 @@ request_done: | |||
| 740 | mmc_request_done(host->mmc, mrq); | 741 | mmc_request_done(host->mmc, mrq); |
| 741 | } | 742 | } |
| 742 | 743 | ||
| 743 | 744 | static void s3cmci_dma_setup(struct s3cmci_host *host, | |
| 744 | void s3cmci_dma_setup(struct s3cmci_host *host, enum s3c2410_dmasrc source) | 745 | enum s3c2410_dmasrc source) |
| 745 | { | 746 | { |
| 746 | static enum s3c2410_dmasrc last_source = -1; | 747 | static enum s3c2410_dmasrc last_source = -1; |
| 747 | static int setup_ok; | 748 | static int setup_ok; |
| @@ -1003,8 +1004,9 @@ static void s3cmci_send_request(struct mmc_host *mmc) | |||
| 1003 | enable_irq(host->irq); | 1004 | enable_irq(host->irq); |
| 1004 | } | 1005 | } |
| 1005 | 1006 | ||
| 1006 | static int s3cmci_card_present(struct s3cmci_host *host) | 1007 | static int s3cmci_card_present(struct mmc_host *mmc) |
| 1007 | { | 1008 | { |
| 1009 | struct s3cmci_host *host = mmc_priv(mmc); | ||
| 1008 | struct s3c24xx_mci_pdata *pdata = host->pdata; | 1010 | struct s3c24xx_mci_pdata *pdata = host->pdata; |
| 1009 | int ret; | 1011 | int ret; |
| 1010 | 1012 | ||
| @@ -1023,7 +1025,7 @@ static void s3cmci_request(struct mmc_host *mmc, struct mmc_request *mrq) | |||
| 1023 | host->cmd_is_stop = 0; | 1025 | host->cmd_is_stop = 0; |
| 1024 | host->mrq = mrq; | 1026 | host->mrq = mrq; |
| 1025 | 1027 | ||
| 1026 | if (s3cmci_card_present(host) == 0) { | 1028 | if (s3cmci_card_present(mmc) == 0) { |
| 1027 | dbg(host, dbg_err, "%s: no medium present\n", __func__); | 1029 | dbg(host, dbg_err, "%s: no medium present\n", __func__); |
| 1028 | host->mrq->cmd->error = -ENOMEDIUM; | 1030 | host->mrq->cmd->error = -ENOMEDIUM; |
| 1029 | mmc_request_done(mmc, mrq); | 1031 | mmc_request_done(mmc, mrq); |
| @@ -1138,6 +1140,7 @@ static struct mmc_host_ops s3cmci_ops = { | |||
| 1138 | .request = s3cmci_request, | 1140 | .request = s3cmci_request, |
| 1139 | .set_ios = s3cmci_set_ios, | 1141 | .set_ios = s3cmci_set_ios, |
| 1140 | .get_ro = s3cmci_get_ro, | 1142 | .get_ro = s3cmci_get_ro, |
| 1143 | .get_cd = s3cmci_card_present, | ||
| 1141 | }; | 1144 | }; |
| 1142 | 1145 | ||
| 1143 | static struct s3c24xx_mci_pdata s3cmci_def_pdata = { | 1146 | static struct s3c24xx_mci_pdata s3cmci_def_pdata = { |
| @@ -1206,7 +1209,7 @@ static int __devinit s3cmci_probe(struct platform_device *pdev, int is2440) | |||
| 1206 | } | 1209 | } |
| 1207 | 1210 | ||
| 1208 | host->base = ioremap(host->mem->start, RESSIZE(host->mem)); | 1211 | host->base = ioremap(host->mem->start, RESSIZE(host->mem)); |
| 1209 | if (host->base == 0) { | 1212 | if (!host->base) { |
| 1210 | dev_err(&pdev->dev, "failed to ioremap() io memory region.\n"); | 1213 | dev_err(&pdev->dev, "failed to ioremap() io memory region.\n"); |
| 1211 | ret = -EINVAL; | 1214 | ret = -EINVAL; |
| 1212 | goto probe_free_mem_region; | 1215 | goto probe_free_mem_region; |
diff --git a/drivers/mmc/host/sdricoh_cs.c b/drivers/mmc/host/sdricoh_cs.c index f99e9f721629..1df44d966bdb 100644 --- a/drivers/mmc/host/sdricoh_cs.c +++ b/drivers/mmc/host/sdricoh_cs.c | |||
| @@ -29,7 +29,6 @@ | |||
| 29 | #include <linux/pci.h> | 29 | #include <linux/pci.h> |
| 30 | #include <linux/ioport.h> | 30 | #include <linux/ioport.h> |
| 31 | #include <linux/scatterlist.h> | 31 | #include <linux/scatterlist.h> |
| 32 | #include <linux/version.h> | ||
| 33 | 32 | ||
| 34 | #include <pcmcia/cs_types.h> | 33 | #include <pcmcia/cs_types.h> |
| 35 | #include <pcmcia/cs.h> | 34 | #include <pcmcia/cs.h> |
diff --git a/drivers/mtd/nand/orion_nand.c b/drivers/mtd/nand/orion_nand.c index 64002488c6ee..917cf8d3ae95 100644 --- a/drivers/mtd/nand/orion_nand.c +++ b/drivers/mtd/nand/orion_nand.c | |||
| @@ -19,7 +19,7 @@ | |||
| 19 | #include <asm/io.h> | 19 | #include <asm/io.h> |
| 20 | #include <asm/sizes.h> | 20 | #include <asm/sizes.h> |
| 21 | #include <mach/hardware.h> | 21 | #include <mach/hardware.h> |
| 22 | #include <asm/plat-orion/orion_nand.h> | 22 | #include <plat/orion_nand.h> |
| 23 | 23 | ||
| 24 | #ifdef CONFIG_MTD_CMDLINE_PARTS | 24 | #ifdef CONFIG_MTD_CMDLINE_PARTS |
| 25 | static const char *part_probes[] = { "cmdlinepart", NULL }; | 25 | static const char *part_probes[] = { "cmdlinepart", NULL }; |
diff --git a/drivers/pcmcia/pxa2xx_palmtx.c b/drivers/pcmcia/pxa2xx_palmtx.c index a8771ffc61e8..e07b5c51ec5b 100644 --- a/drivers/pcmcia/pxa2xx_palmtx.c +++ b/drivers/pcmcia/pxa2xx_palmtx.c | |||
| @@ -23,12 +23,57 @@ | |||
| 23 | 23 | ||
| 24 | static int palmtx_pcmcia_hw_init(struct soc_pcmcia_socket *skt) | 24 | static int palmtx_pcmcia_hw_init(struct soc_pcmcia_socket *skt) |
| 25 | { | 25 | { |
| 26 | skt->irq = IRQ_GPIO(GPIO_NR_PALMTX_PCMCIA_READY); | 26 | int ret; |
| 27 | |||
| 28 | ret = gpio_request(GPIO_NR_PALMTX_PCMCIA_POWER1, "PCMCIA PWR1"); | ||
| 29 | if (ret) | ||
| 30 | goto err1; | ||
| 31 | ret = gpio_direction_output(GPIO_NR_PALMTX_PCMCIA_POWER1, 0); | ||
| 32 | if (ret) | ||
| 33 | goto err2; | ||
| 34 | |||
| 35 | ret = gpio_request(GPIO_NR_PALMTX_PCMCIA_POWER2, "PCMCIA PWR2"); | ||
| 36 | if (ret) | ||
| 37 | goto err2; | ||
| 38 | ret = gpio_direction_output(GPIO_NR_PALMTX_PCMCIA_POWER2, 0); | ||
| 39 | if (ret) | ||
| 40 | goto err3; | ||
| 41 | |||
| 42 | ret = gpio_request(GPIO_NR_PALMTX_PCMCIA_RESET, "PCMCIA RST"); | ||
| 43 | if (ret) | ||
| 44 | goto err3; | ||
| 45 | ret = gpio_direction_output(GPIO_NR_PALMTX_PCMCIA_RESET, 1); | ||
| 46 | if (ret) | ||
| 47 | goto err4; | ||
| 48 | |||
| 49 | ret = gpio_request(GPIO_NR_PALMTX_PCMCIA_READY, "PCMCIA RDY"); | ||
| 50 | if (ret) | ||
| 51 | goto err4; | ||
| 52 | ret = gpio_direction_input(GPIO_NR_PALMTX_PCMCIA_READY); | ||
| 53 | if (ret) | ||
| 54 | goto err5; | ||
| 55 | |||
| 56 | skt->irq = gpio_to_irq(GPIO_NR_PALMTX_PCMCIA_READY); | ||
| 27 | return 0; | 57 | return 0; |
| 58 | |||
| 59 | err5: | ||
| 60 | gpio_free(GPIO_NR_PALMTX_PCMCIA_READY); | ||
| 61 | err4: | ||
| 62 | gpio_free(GPIO_NR_PALMTX_PCMCIA_RESET); | ||
| 63 | err3: | ||
| 64 | gpio_free(GPIO_NR_PALMTX_PCMCIA_POWER2); | ||
| 65 | err2: | ||
| 66 | gpio_free(GPIO_NR_PALMTX_PCMCIA_POWER1); | ||
| 67 | err1: | ||
| 68 | return ret; | ||
| 28 | } | 69 | } |
| 29 | 70 | ||
| 30 | static void palmtx_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) | 71 | static void palmtx_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) |
| 31 | { | 72 | { |
| 73 | gpio_free(GPIO_NR_PALMTX_PCMCIA_READY); | ||
| 74 | gpio_free(GPIO_NR_PALMTX_PCMCIA_RESET); | ||
| 75 | gpio_free(GPIO_NR_PALMTX_PCMCIA_POWER2); | ||
| 76 | gpio_free(GPIO_NR_PALMTX_PCMCIA_POWER1); | ||
| 32 | } | 77 | } |
| 33 | 78 | ||
| 34 | static void palmtx_pcmcia_socket_state(struct soc_pcmcia_socket *skt, | 79 | static void palmtx_pcmcia_socket_state(struct soc_pcmcia_socket *skt, |
| @@ -109,7 +154,7 @@ static void __exit palmtx_pcmcia_exit(void) | |||
| 109 | platform_device_unregister(palmtx_pcmcia_device); | 154 | platform_device_unregister(palmtx_pcmcia_device); |
| 110 | } | 155 | } |
| 111 | 156 | ||
| 112 | fs_initcall(palmtx_pcmcia_init); | 157 | module_init(palmtx_pcmcia_init); |
| 113 | module_exit(palmtx_pcmcia_exit); | 158 | module_exit(palmtx_pcmcia_exit); |
| 114 | 159 | ||
| 115 | MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>"); | 160 | MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>"); |
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index 3b4a14e355c1..77cb34270fc1 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig | |||
| @@ -449,6 +449,7 @@ config SERIAL_CLPS711X_CONSOLE | |||
| 449 | config SERIAL_SAMSUNG | 449 | config SERIAL_SAMSUNG |
| 450 | tristate "Samsung SoC serial support" | 450 | tristate "Samsung SoC serial support" |
| 451 | depends on ARM && PLAT_S3C24XX | 451 | depends on ARM && PLAT_S3C24XX |
| 452 | select SERIAL_CORE | ||
| 452 | help | 453 | help |
| 453 | Support for the on-chip UARTs on the Samsung S3C24XX series CPUs, | 454 | Support for the on-chip UARTs on the Samsung S3C24XX series CPUs, |
| 454 | providing /dev/ttySAC0, 1 and 2 (note, some machines may not | 455 | providing /dev/ttySAC0, 1 and 2 (note, some machines may not |
diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c index 5fbdc14e63b3..5416cf969005 100644 --- a/drivers/usb/host/ehci-orion.c +++ b/drivers/usb/host/ehci-orion.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
| 13 | #include <linux/platform_device.h> | 13 | #include <linux/platform_device.h> |
| 14 | #include <linux/mbus.h> | 14 | #include <linux/mbus.h> |
| 15 | #include <asm/plat-orion/ehci-orion.h> | 15 | #include <plat/ehci-orion.h> |
| 16 | 16 | ||
| 17 | #define rdl(off) __raw_readl(hcd->regs + (off)) | 17 | #define rdl(off) __raw_readl(hcd->regs + (off)) |
| 18 | #define wrl(off, val) __raw_writel((val), hcd->regs + (off)) | 18 | #define wrl(off, val) __raw_writel((val), hcd->regs + (off)) |
diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c index e7aa7ae8fca8..97204497d9f7 100644 --- a/drivers/video/pxafb.c +++ b/drivers/video/pxafb.c | |||
| @@ -1031,7 +1031,9 @@ static void pxafb_setup_gpio(struct pxafb_info *fbi) | |||
| 1031 | pxa_gpio_mode(GPIO74_LCD_FCLK_MD); | 1031 | pxa_gpio_mode(GPIO74_LCD_FCLK_MD); |
| 1032 | pxa_gpio_mode(GPIO75_LCD_LCLK_MD); | 1032 | pxa_gpio_mode(GPIO75_LCD_LCLK_MD); |
| 1033 | pxa_gpio_mode(GPIO76_LCD_PCLK_MD); | 1033 | pxa_gpio_mode(GPIO76_LCD_PCLK_MD); |
| 1034 | pxa_gpio_mode(GPIO77_LCD_ACBIAS_MD); | 1034 | |
| 1035 | if ((lccr0 & LCCR0_PAS) == 0) | ||
| 1036 | pxa_gpio_mode(GPIO77_LCD_ACBIAS_MD); | ||
| 1035 | } | 1037 | } |
| 1036 | 1038 | ||
| 1037 | static void pxafb_enable_controller(struct pxafb_info *fbi) | 1039 | static void pxafb_enable_controller(struct pxafb_info *fbi) |
| @@ -1400,6 +1402,8 @@ static void pxafb_decode_mach_info(struct pxafb_info *fbi, | |||
| 1400 | if (lcd_conn == LCD_MONO_STN_8BPP) | 1402 | if (lcd_conn == LCD_MONO_STN_8BPP) |
| 1401 | fbi->lccr0 |= LCCR0_DPD; | 1403 | fbi->lccr0 |= LCCR0_DPD; |
| 1402 | 1404 | ||
| 1405 | fbi->lccr0 |= (lcd_conn & LCD_ALTERNATE_MAPPING) ? LCCR0_LDDALT : 0; | ||
| 1406 | |||
| 1403 | fbi->lccr3 = LCCR3_Acb((inf->lcd_conn >> 10) & 0xff); | 1407 | fbi->lccr3 = LCCR3_Acb((inf->lcd_conn >> 10) & 0xff); |
| 1404 | fbi->lccr3 |= (lcd_conn & LCD_BIAS_ACTIVE_LOW) ? LCCR3_OEP : 0; | 1408 | fbi->lccr3 |= (lcd_conn & LCD_BIAS_ACTIVE_LOW) ? LCCR3_OEP : 0; |
| 1405 | fbi->lccr3 |= (lcd_conn & LCD_PCLK_EDGE_FALL) ? LCCR3_PCP : 0; | 1409 | fbi->lccr3 |= (lcd_conn & LCD_PCLK_EDGE_FALL) ? LCCR3_PCP : 0; |
| @@ -1673,53 +1677,63 @@ MODULE_PARM_DESC(options, "LCD parameters (see Documentation/fb/pxafb.txt)"); | |||
| 1673 | #define pxafb_setup_options() (0) | 1677 | #define pxafb_setup_options() (0) |
| 1674 | #endif | 1678 | #endif |
| 1675 | 1679 | ||
| 1676 | static int __devinit pxafb_probe(struct platform_device *dev) | ||
| 1677 | { | ||
| 1678 | struct pxafb_info *fbi; | ||
| 1679 | struct pxafb_mach_info *inf; | ||
| 1680 | struct resource *r; | ||
| 1681 | int irq, ret; | ||
| 1682 | |||
| 1683 | dev_dbg(&dev->dev, "pxafb_probe\n"); | ||
| 1684 | |||
| 1685 | inf = dev->dev.platform_data; | ||
| 1686 | ret = -ENOMEM; | ||
| 1687 | fbi = NULL; | ||
| 1688 | if (!inf) | ||
| 1689 | goto failed; | ||
| 1690 | |||
| 1691 | ret = pxafb_parse_options(&dev->dev, g_options); | ||
| 1692 | if (ret < 0) | ||
| 1693 | goto failed; | ||
| 1694 | |||
| 1695 | #ifdef DEBUG_VAR | 1680 | #ifdef DEBUG_VAR |
| 1696 | /* Check for various illegal bit-combinations. Currently only | 1681 | /* Check for various illegal bit-combinations. Currently only |
| 1697 | * a warning is given. */ | 1682 | * a warning is given. */ |
| 1683 | static void __devinit pxafb_check_options(struct device *dev, | ||
| 1684 | struct pxafb_mach_info *inf) | ||
| 1685 | { | ||
| 1686 | if (inf->lcd_conn) | ||
| 1687 | return; | ||
| 1698 | 1688 | ||
| 1699 | if (inf->lccr0 & LCCR0_INVALID_CONFIG_MASK) | 1689 | if (inf->lccr0 & LCCR0_INVALID_CONFIG_MASK) |
| 1700 | dev_warn(&dev->dev, "machine LCCR0 setting contains " | 1690 | dev_warn(dev, "machine LCCR0 setting contains " |
| 1701 | "illegal bits: %08x\n", | 1691 | "illegal bits: %08x\n", |
| 1702 | inf->lccr0 & LCCR0_INVALID_CONFIG_MASK); | 1692 | inf->lccr0 & LCCR0_INVALID_CONFIG_MASK); |
| 1703 | if (inf->lccr3 & LCCR3_INVALID_CONFIG_MASK) | 1693 | if (inf->lccr3 & LCCR3_INVALID_CONFIG_MASK) |
| 1704 | dev_warn(&dev->dev, "machine LCCR3 setting contains " | 1694 | dev_warn(dev, "machine LCCR3 setting contains " |
| 1705 | "illegal bits: %08x\n", | 1695 | "illegal bits: %08x\n", |
| 1706 | inf->lccr3 & LCCR3_INVALID_CONFIG_MASK); | 1696 | inf->lccr3 & LCCR3_INVALID_CONFIG_MASK); |
| 1707 | if (inf->lccr0 & LCCR0_DPD && | 1697 | if (inf->lccr0 & LCCR0_DPD && |
| 1708 | ((inf->lccr0 & LCCR0_PAS) != LCCR0_Pas || | 1698 | ((inf->lccr0 & LCCR0_PAS) != LCCR0_Pas || |
| 1709 | (inf->lccr0 & LCCR0_SDS) != LCCR0_Sngl || | 1699 | (inf->lccr0 & LCCR0_SDS) != LCCR0_Sngl || |
| 1710 | (inf->lccr0 & LCCR0_CMS) != LCCR0_Mono)) | 1700 | (inf->lccr0 & LCCR0_CMS) != LCCR0_Mono)) |
| 1711 | dev_warn(&dev->dev, "Double Pixel Data (DPD) mode is " | 1701 | dev_warn(dev, "Double Pixel Data (DPD) mode is " |
| 1712 | "only valid in passive mono" | 1702 | "only valid in passive mono" |
| 1713 | " single panel mode\n"); | 1703 | " single panel mode\n"); |
| 1714 | if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Act && | 1704 | if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Act && |
| 1715 | (inf->lccr0 & LCCR0_SDS) == LCCR0_Dual) | 1705 | (inf->lccr0 & LCCR0_SDS) == LCCR0_Dual) |
| 1716 | dev_warn(&dev->dev, "Dual panel only valid in passive mode\n"); | 1706 | dev_warn(dev, "Dual panel only valid in passive mode\n"); |
| 1717 | if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Pas && | 1707 | if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Pas && |
| 1718 | (inf->modes->upper_margin || inf->modes->lower_margin)) | 1708 | (inf->modes->upper_margin || inf->modes->lower_margin)) |
| 1719 | dev_warn(&dev->dev, "Upper and lower margins must be 0 in " | 1709 | dev_warn(dev, "Upper and lower margins must be 0 in " |
| 1720 | "passive mode\n"); | 1710 | "passive mode\n"); |
| 1711 | } | ||
| 1712 | #else | ||
| 1713 | #define pxafb_check_options(...) do {} while (0) | ||
| 1721 | #endif | 1714 | #endif |
| 1722 | 1715 | ||
| 1716 | static int __devinit pxafb_probe(struct platform_device *dev) | ||
| 1717 | { | ||
| 1718 | struct pxafb_info *fbi; | ||
| 1719 | struct pxafb_mach_info *inf; | ||
| 1720 | struct resource *r; | ||
| 1721 | int irq, ret; | ||
| 1722 | |||
| 1723 | dev_dbg(&dev->dev, "pxafb_probe\n"); | ||
| 1724 | |||
| 1725 | inf = dev->dev.platform_data; | ||
| 1726 | ret = -ENOMEM; | ||
| 1727 | fbi = NULL; | ||
| 1728 | if (!inf) | ||
| 1729 | goto failed; | ||
| 1730 | |||
| 1731 | ret = pxafb_parse_options(&dev->dev, g_options); | ||
| 1732 | if (ret < 0) | ||
| 1733 | goto failed; | ||
| 1734 | |||
| 1735 | pxafb_check_options(&dev->dev, inf); | ||
| 1736 | |||
| 1723 | dev_dbg(&dev->dev, "got a %dx%dx%d LCD\n", | 1737 | dev_dbg(&dev->dev, "got a %dx%dx%d LCD\n", |
| 1724 | inf->modes->xres, | 1738 | inf->modes->xres, |
| 1725 | inf->modes->yres, | 1739 | inf->modes->yres, |
diff --git a/drivers/watchdog/s3c2410_wdt.c b/drivers/watchdog/s3c2410_wdt.c index 3da2b90d2fe6..22715e3be5e7 100644 --- a/drivers/watchdog/s3c2410_wdt.c +++ b/drivers/watchdog/s3c2410_wdt.c | |||
| @@ -157,8 +157,6 @@ static void s3c2410wdt_start(void) | |||
| 157 | writel(wdt_count, wdt_base + S3C2410_WTCNT); | 157 | writel(wdt_count, wdt_base + S3C2410_WTCNT); |
| 158 | writel(wtcon, wdt_base + S3C2410_WTCON); | 158 | writel(wtcon, wdt_base + S3C2410_WTCON); |
| 159 | spin_unlock(&wdt_lock); | 159 | spin_unlock(&wdt_lock); |
| 160 | |||
| 161 | return 0; | ||
| 162 | } | 160 | } |
| 163 | 161 | ||
| 164 | static int s3c2410wdt_set_heartbeat(int timeout) | 162 | static int s3c2410wdt_set_heartbeat(int timeout) |
diff --git a/include/asm-arm/plat-s3c/regs-nand.h b/include/asm-arm/plat-s3c/regs-nand.h index 09f0b5503f5b..b2caa4bca270 100644 --- a/include/asm-arm/plat-s3c/regs-nand.h +++ b/include/asm-arm/plat-s3c/regs-nand.h | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| 13 | #ifndef __ASM_ARM_REGS_NAND | 13 | #ifndef __ASM_ARM_REGS_NAND |
| 14 | #define __ASM_ARM_REGS_NAND "$Id: nand.h,v 1.3 2003/12/09 11:36:29 ben Exp $" | 14 | #define __ASM_ARM_REGS_NAND |
| 15 | 15 | ||
| 16 | 16 | ||
| 17 | #define S3C2410_NFREG(x) (x) | 17 | #define S3C2410_NFREG(x) (x) |
diff --git a/include/asm-arm/plat-s3c/regs-timer.h b/include/asm-arm/plat-s3c/regs-timer.h index b4366ea39677..cc0eedd53e38 100644 --- a/include/asm-arm/plat-s3c/regs-timer.h +++ b/include/asm-arm/plat-s3c/regs-timer.h | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | 13 | ||
| 14 | #ifndef __ASM_ARCH_REGS_TIMER_H | 14 | #ifndef __ASM_ARCH_REGS_TIMER_H |
| 15 | #define __ASM_ARCH_REGS_TIMER_H "$Id: timer.h,v 1.4 2003/05/06 19:30:50 ben Exp $" | 15 | #define __ASM_ARCH_REGS_TIMER_H |
| 16 | 16 | ||
| 17 | #define S3C_TIMERREG(x) (S3C_VA_TIMER + (x)) | 17 | #define S3C_TIMERREG(x) (S3C_VA_TIMER + (x)) |
| 18 | #define S3C_TIMERREG2(tmr,reg) S3C_TIMERREG((reg)+0x0c+((tmr)*0x0c)) | 18 | #define S3C_TIMERREG2(tmr,reg) S3C_TIMERREG((reg)+0x0c+((tmr)*0x0c)) |
diff --git a/include/asm-arm/plat-s3c/regs-watchdog.h b/include/asm-arm/plat-s3c/regs-watchdog.h index 1229f076c0a0..4938492470f7 100644 --- a/include/asm-arm/plat-s3c/regs-watchdog.h +++ b/include/asm-arm/plat-s3c/regs-watchdog.h | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | 13 | ||
| 14 | #ifndef __ASM_ARCH_REGS_WATCHDOG_H | 14 | #ifndef __ASM_ARCH_REGS_WATCHDOG_H |
| 15 | #define __ASM_ARCH_REGS_WATCHDOG_H "$Id: watchdog.h,v 1.2 2003/04/29 13:31:09 ben Exp $" | 15 | #define __ASM_ARCH_REGS_WATCHDOG_H |
| 16 | 16 | ||
| 17 | #define S3C_WDOGREG(x) ((x) + S3C_VA_WATCHDOG) | 17 | #define S3C_WDOGREG(x) ((x) + S3C_VA_WATCHDOG) |
| 18 | 18 | ||
diff --git a/include/asm-arm/plat-s3c24xx/s3c2410.h b/include/asm-arm/plat-s3c24xx/s3c2410.h index 36de0b835873..3cd1ec677b3f 100644 --- a/include/asm-arm/plat-s3c24xx/s3c2410.h +++ b/include/asm-arm/plat-s3c24xx/s3c2410.h | |||
| @@ -21,11 +21,11 @@ extern void s3c2410_init_uarts(struct s3c2410_uartcfg *cfg, int no); | |||
| 21 | 21 | ||
| 22 | extern void s3c2410_init_clocks(int xtal); | 22 | extern void s3c2410_init_clocks(int xtal); |
| 23 | 23 | ||
| 24 | extern int s3c2410_baseclk_add(void); | ||
| 25 | |||
| 26 | #else | 24 | #else |
| 27 | #define s3c2410_init_clocks NULL | 25 | #define s3c2410_init_clocks NULL |
| 28 | #define s3c2410_init_uarts NULL | 26 | #define s3c2410_init_uarts NULL |
| 29 | #define s3c2410_map_io NULL | 27 | #define s3c2410_map_io NULL |
| 30 | #define s3c2410_init NULL | 28 | #define s3c2410_init NULL |
| 31 | #endif | 29 | #endif |
| 30 | |||
| 31 | extern int s3c2410_baseclk_add(void); | ||
diff --git a/include/asm-x86/amd_iommu_types.h b/include/asm-x86/amd_iommu_types.h index 22aa58ca1991..dcc812067394 100644 --- a/include/asm-x86/amd_iommu_types.h +++ b/include/asm-x86/amd_iommu_types.h | |||
| @@ -31,9 +31,6 @@ | |||
| 31 | #define ALIAS_TABLE_ENTRY_SIZE 2 | 31 | #define ALIAS_TABLE_ENTRY_SIZE 2 |
| 32 | #define RLOOKUP_TABLE_ENTRY_SIZE (sizeof(void *)) | 32 | #define RLOOKUP_TABLE_ENTRY_SIZE (sizeof(void *)) |
| 33 | 33 | ||
| 34 | /* helper macros */ | ||
| 35 | #define LOW_U32(x) ((x) & ((1ULL << 32)-1)) | ||
| 36 | |||
| 37 | /* Length of the MMIO region for the AMD IOMMU */ | 34 | /* Length of the MMIO region for the AMD IOMMU */ |
| 38 | #define MMIO_REGION_LENGTH 0x4000 | 35 | #define MMIO_REGION_LENGTH 0x4000 |
| 39 | 36 | ||
| @@ -69,6 +66,9 @@ | |||
| 69 | #define MMIO_EVT_TAIL_OFFSET 0x2018 | 66 | #define MMIO_EVT_TAIL_OFFSET 0x2018 |
| 70 | #define MMIO_STATUS_OFFSET 0x2020 | 67 | #define MMIO_STATUS_OFFSET 0x2020 |
| 71 | 68 | ||
| 69 | /* MMIO status bits */ | ||
| 70 | #define MMIO_STATUS_COM_WAIT_INT_MASK 0x04 | ||
| 71 | |||
| 72 | /* feature control bits */ | 72 | /* feature control bits */ |
| 73 | #define CONTROL_IOMMU_EN 0x00ULL | 73 | #define CONTROL_IOMMU_EN 0x00ULL |
| 74 | #define CONTROL_HT_TUN_EN 0x01ULL | 74 | #define CONTROL_HT_TUN_EN 0x01ULL |
| @@ -89,6 +89,7 @@ | |||
| 89 | #define CMD_INV_IOMMU_PAGES 0x03 | 89 | #define CMD_INV_IOMMU_PAGES 0x03 |
| 90 | 90 | ||
| 91 | #define CMD_COMPL_WAIT_STORE_MASK 0x01 | 91 | #define CMD_COMPL_WAIT_STORE_MASK 0x01 |
| 92 | #define CMD_COMPL_WAIT_INT_MASK 0x02 | ||
| 92 | #define CMD_INV_IOMMU_PAGES_SIZE_MASK 0x01 | 93 | #define CMD_INV_IOMMU_PAGES_SIZE_MASK 0x01 |
| 93 | #define CMD_INV_IOMMU_PAGES_PDE_MASK 0x02 | 94 | #define CMD_INV_IOMMU_PAGES_PDE_MASK 0x02 |
| 94 | 95 | ||
| @@ -99,6 +100,7 @@ | |||
| 99 | #define DEV_ENTRY_TRANSLATION 0x01 | 100 | #define DEV_ENTRY_TRANSLATION 0x01 |
| 100 | #define DEV_ENTRY_IR 0x3d | 101 | #define DEV_ENTRY_IR 0x3d |
| 101 | #define DEV_ENTRY_IW 0x3e | 102 | #define DEV_ENTRY_IW 0x3e |
| 103 | #define DEV_ENTRY_NO_PAGE_FAULT 0x62 | ||
| 102 | #define DEV_ENTRY_EX 0x67 | 104 | #define DEV_ENTRY_EX 0x67 |
| 103 | #define DEV_ENTRY_SYSMGT1 0x68 | 105 | #define DEV_ENTRY_SYSMGT1 0x68 |
| 104 | #define DEV_ENTRY_SYSMGT2 0x69 | 106 | #define DEV_ENTRY_SYSMGT2 0x69 |
diff --git a/include/asm-x86/geode.h b/include/asm-x86/geode.h index bb06027fc83e..2c1cda0b8a86 100644 --- a/include/asm-x86/geode.h +++ b/include/asm-x86/geode.h | |||
| @@ -50,6 +50,7 @@ extern int geode_get_dev_base(unsigned int dev); | |||
| 50 | #define MSR_PIC_YSEL_HIGH 0x51400021 | 50 | #define MSR_PIC_YSEL_HIGH 0x51400021 |
| 51 | #define MSR_PIC_ZSEL_LOW 0x51400022 | 51 | #define MSR_PIC_ZSEL_LOW 0x51400022 |
| 52 | #define MSR_PIC_ZSEL_HIGH 0x51400023 | 52 | #define MSR_PIC_ZSEL_HIGH 0x51400023 |
| 53 | #define MSR_PIC_IRQM_LPC 0x51400025 | ||
| 53 | 54 | ||
| 54 | #define MSR_MFGPT_IRQ 0x51400028 | 55 | #define MSR_MFGPT_IRQ 0x51400028 |
| 55 | #define MSR_MFGPT_NR 0x51400029 | 56 | #define MSR_MFGPT_NR 0x51400029 |
| @@ -237,7 +238,7 @@ static inline u16 geode_mfgpt_read(int timer, u16 reg) | |||
| 237 | } | 238 | } |
| 238 | 239 | ||
| 239 | extern int geode_mfgpt_toggle_event(int timer, int cmp, int event, int enable); | 240 | extern int geode_mfgpt_toggle_event(int timer, int cmp, int event, int enable); |
| 240 | extern int geode_mfgpt_set_irq(int timer, int cmp, int irq, int enable); | 241 | extern int geode_mfgpt_set_irq(int timer, int cmp, int *irq, int enable); |
| 241 | extern int geode_mfgpt_alloc_timer(int timer, int domain); | 242 | extern int geode_mfgpt_alloc_timer(int timer, int domain); |
| 242 | 243 | ||
| 243 | #define geode_mfgpt_setup_irq(t, c, i) geode_mfgpt_set_irq((t), (c), (i), 1) | 244 | #define geode_mfgpt_setup_irq(t, c, i) geode_mfgpt_set_irq((t), (c), (i), 1) |
diff --git a/include/asm-x86/i387.h b/include/asm-x86/i387.h index 6d3b21063419..56d00e31aec0 100644 --- a/include/asm-x86/i387.h +++ b/include/asm-x86/i387.h | |||
| @@ -63,8 +63,6 @@ static inline int restore_fpu_checking(struct i387_fxsave_struct *fx) | |||
| 63 | #else | 63 | #else |
| 64 | : [fx] "cdaSDb" (fx), "m" (*fx), "0" (0)); | 64 | : [fx] "cdaSDb" (fx), "m" (*fx), "0" (0)); |
| 65 | #endif | 65 | #endif |
| 66 | if (unlikely(err)) | ||
| 67 | init_fpu(current); | ||
| 68 | return err; | 66 | return err; |
| 69 | } | 67 | } |
| 70 | 68 | ||
diff --git a/include/asm-x86/io.h b/include/asm-x86/io.h index bf5d629b3a39..0f954dc89cb3 100644 --- a/include/asm-x86/io.h +++ b/include/asm-x86/io.h | |||
| @@ -21,7 +21,7 @@ extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys); | |||
| 21 | 21 | ||
| 22 | #define build_mmio_read(name, size, type, reg, barrier) \ | 22 | #define build_mmio_read(name, size, type, reg, barrier) \ |
| 23 | static inline type name(const volatile void __iomem *addr) \ | 23 | static inline type name(const volatile void __iomem *addr) \ |
| 24 | { type ret; asm volatile("mov" size " %1,%0":"=" reg (ret) \ | 24 | { type ret; asm volatile("mov" size " %1,%0":reg (ret) \ |
| 25 | :"m" (*(volatile type __force *)addr) barrier); return ret; } | 25 | :"m" (*(volatile type __force *)addr) barrier); return ret; } |
| 26 | 26 | ||
| 27 | #define build_mmio_write(name, size, type, reg, barrier) \ | 27 | #define build_mmio_write(name, size, type, reg, barrier) \ |
| @@ -29,13 +29,13 @@ static inline void name(type val, volatile void __iomem *addr) \ | |||
| 29 | { asm volatile("mov" size " %0,%1": :reg (val), \ | 29 | { asm volatile("mov" size " %0,%1": :reg (val), \ |
| 30 | "m" (*(volatile type __force *)addr) barrier); } | 30 | "m" (*(volatile type __force *)addr) barrier); } |
| 31 | 31 | ||
| 32 | build_mmio_read(readb, "b", unsigned char, "q", :"memory") | 32 | build_mmio_read(readb, "b", unsigned char, "=q", :"memory") |
| 33 | build_mmio_read(readw, "w", unsigned short, "r", :"memory") | 33 | build_mmio_read(readw, "w", unsigned short, "=r", :"memory") |
| 34 | build_mmio_read(readl, "l", unsigned int, "r", :"memory") | 34 | build_mmio_read(readl, "l", unsigned int, "=r", :"memory") |
| 35 | 35 | ||
| 36 | build_mmio_read(__readb, "b", unsigned char, "q", ) | 36 | build_mmio_read(__readb, "b", unsigned char, "=q", ) |
| 37 | build_mmio_read(__readw, "w", unsigned short, "r", ) | 37 | build_mmio_read(__readw, "w", unsigned short, "=r", ) |
| 38 | build_mmio_read(__readl, "l", unsigned int, "r", ) | 38 | build_mmio_read(__readl, "l", unsigned int, "=r", ) |
| 39 | 39 | ||
| 40 | build_mmio_write(writeb, "b", unsigned char, "q", :"memory") | 40 | build_mmio_write(writeb, "b", unsigned char, "q", :"memory") |
| 41 | build_mmio_write(writew, "w", unsigned short, "r", :"memory") | 41 | build_mmio_write(writew, "w", unsigned short, "r", :"memory") |
| @@ -59,8 +59,8 @@ build_mmio_write(__writel, "l", unsigned int, "r", ) | |||
| 59 | #define mmiowb() barrier() | 59 | #define mmiowb() barrier() |
| 60 | 60 | ||
| 61 | #ifdef CONFIG_X86_64 | 61 | #ifdef CONFIG_X86_64 |
| 62 | build_mmio_read(readq, "q", unsigned long, "r", :"memory") | 62 | build_mmio_read(readq, "q", unsigned long, "=r", :"memory") |
| 63 | build_mmio_read(__readq, "q", unsigned long, "r", ) | 63 | build_mmio_read(__readq, "q", unsigned long, "=r", ) |
| 64 | build_mmio_write(writeq, "q", unsigned long, "r", :"memory") | 64 | build_mmio_write(writeq, "q", unsigned long, "r", :"memory") |
| 65 | build_mmio_write(__writeq, "q", unsigned long, "r", ) | 65 | build_mmio_write(__writeq, "q", unsigned long, "r", ) |
| 66 | 66 | ||
diff --git a/include/asm-x86/mmzone_32.h b/include/asm-x86/mmzone_32.h index b2298a227567..5862e6460658 100644 --- a/include/asm-x86/mmzone_32.h +++ b/include/asm-x86/mmzone_32.h | |||
| @@ -97,10 +97,16 @@ static inline int pfn_valid(int pfn) | |||
| 97 | reserve_bootmem_node(NODE_DATA(0), (addr), (size), (flags)) | 97 | reserve_bootmem_node(NODE_DATA(0), (addr), (size), (flags)) |
| 98 | #define alloc_bootmem(x) \ | 98 | #define alloc_bootmem(x) \ |
| 99 | __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS)) | 99 | __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS)) |
| 100 | #define alloc_bootmem_nopanic(x) \ | ||
| 101 | __alloc_bootmem_node_nopanic(NODE_DATA(0), (x), SMP_CACHE_BYTES, \ | ||
| 102 | __pa(MAX_DMA_ADDRESS)) | ||
| 100 | #define alloc_bootmem_low(x) \ | 103 | #define alloc_bootmem_low(x) \ |
| 101 | __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, 0) | 104 | __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, 0) |
| 102 | #define alloc_bootmem_pages(x) \ | 105 | #define alloc_bootmem_pages(x) \ |
| 103 | __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, __pa(MAX_DMA_ADDRESS)) | 106 | __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, __pa(MAX_DMA_ADDRESS)) |
| 107 | #define alloc_bootmem_pages_nopanic(x) \ | ||
| 108 | __alloc_bootmem_node_nopanic(NODE_DATA(0), (x), PAGE_SIZE, \ | ||
| 109 | __pa(MAX_DMA_ADDRESS)) | ||
| 104 | #define alloc_bootmem_low_pages(x) \ | 110 | #define alloc_bootmem_low_pages(x) \ |
| 105 | __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, 0) | 111 | __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, 0) |
| 106 | #define alloc_bootmem_node(pgdat, x) \ | 112 | #define alloc_bootmem_node(pgdat, x) \ |
diff --git a/include/asm-x86/pgtable_64.h b/include/asm-x86/pgtable_64.h index ac5fff4cc58a..549144d03d99 100644 --- a/include/asm-x86/pgtable_64.h +++ b/include/asm-x86/pgtable_64.h | |||
| @@ -151,7 +151,7 @@ static inline void native_pgd_clear(pgd_t *pgd) | |||
| 151 | #define VMALLOC_END _AC(0xffffe1ffffffffff, UL) | 151 | #define VMALLOC_END _AC(0xffffe1ffffffffff, UL) |
| 152 | #define VMEMMAP_START _AC(0xffffe20000000000, UL) | 152 | #define VMEMMAP_START _AC(0xffffe20000000000, UL) |
| 153 | #define MODULES_VADDR _AC(0xffffffffa0000000, UL) | 153 | #define MODULES_VADDR _AC(0xffffffffa0000000, UL) |
| 154 | #define MODULES_END _AC(0xfffffffffff00000, UL) | 154 | #define MODULES_END _AC(0xffffffffff000000, UL) |
| 155 | #define MODULES_LEN (MODULES_END - MODULES_VADDR) | 155 | #define MODULES_LEN (MODULES_END - MODULES_VADDR) |
| 156 | 156 | ||
| 157 | #ifndef __ASSEMBLY__ | 157 | #ifndef __ASSEMBLY__ |
diff --git a/include/asm-x86/processor.h b/include/asm-x86/processor.h index 5f58da401b43..4df3e2f6fb56 100644 --- a/include/asm-x86/processor.h +++ b/include/asm-x86/processor.h | |||
| @@ -728,6 +728,29 @@ extern unsigned long boot_option_idle_override; | |||
| 728 | extern unsigned long idle_halt; | 728 | extern unsigned long idle_halt; |
| 729 | extern unsigned long idle_nomwait; | 729 | extern unsigned long idle_nomwait; |
| 730 | 730 | ||
| 731 | /* | ||
| 732 | * on systems with caches, caches must be flashed as the absolute | ||
| 733 | * last instruction before going into a suspended halt. Otherwise, | ||
| 734 | * dirty data can linger in the cache and become stale on resume, | ||
| 735 | * leading to strange errors. | ||
| 736 | * | ||
| 737 | * perform a variety of operations to guarantee that the compiler | ||
| 738 | * will not reorder instructions. wbinvd itself is serializing | ||
| 739 | * so the processor will not reorder. | ||
| 740 | * | ||
| 741 | * Systems without cache can just go into halt. | ||
| 742 | */ | ||
| 743 | static inline void wbinvd_halt(void) | ||
| 744 | { | ||
| 745 | mb(); | ||
| 746 | /* check for clflush to determine if wbinvd is legal */ | ||
| 747 | if (cpu_has_clflush) | ||
| 748 | asm volatile("cli; wbinvd; 1: hlt; jmp 1b" : : : "memory"); | ||
| 749 | else | ||
| 750 | while (1) | ||
| 751 | halt(); | ||
| 752 | } | ||
| 753 | |||
| 731 | extern void enable_sep_cpu(void); | 754 | extern void enable_sep_cpu(void); |
| 732 | extern int sysenter_setup(void); | 755 | extern int sysenter_setup(void); |
| 733 | 756 | ||
diff --git a/include/asm-x86/spinlock.h b/include/asm-x86/spinlock.h index 4f9a9861799a..e39c790dbfd2 100644 --- a/include/asm-x86/spinlock.h +++ b/include/asm-x86/spinlock.h | |||
| @@ -65,7 +65,7 @@ static inline int __ticket_spin_is_contended(raw_spinlock_t *lock) | |||
| 65 | { | 65 | { |
| 66 | int tmp = ACCESS_ONCE(lock->slock); | 66 | int tmp = ACCESS_ONCE(lock->slock); |
| 67 | 67 | ||
| 68 | return (((tmp >> 8) & 0xff) - (tmp & 0xff)) > 1; | 68 | return (((tmp >> 8) - tmp) & 0xff) > 1; |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock) | 71 | static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock) |
| @@ -127,7 +127,7 @@ static inline int __ticket_spin_is_contended(raw_spinlock_t *lock) | |||
| 127 | { | 127 | { |
| 128 | int tmp = ACCESS_ONCE(lock->slock); | 128 | int tmp = ACCESS_ONCE(lock->slock); |
| 129 | 129 | ||
| 130 | return (((tmp >> 16) & 0xffff) - (tmp & 0xffff)) > 1; | 130 | return (((tmp >> 16) - tmp) & 0xffff) > 1; |
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock) | 133 | static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock) |
diff --git a/include/linux/Kbuild b/include/linux/Kbuild index 327f60658d94..7d970678f940 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild | |||
| @@ -250,6 +250,8 @@ unifdef-y += isdn.h | |||
| 250 | unifdef-y += isdnif.h | 250 | unifdef-y += isdnif.h |
| 251 | unifdef-y += isdn_divertif.h | 251 | unifdef-y += isdn_divertif.h |
| 252 | unifdef-y += isdn_ppp.h | 252 | unifdef-y += isdn_ppp.h |
| 253 | unifdef-y += ivtv.h | ||
| 254 | unifdef-y += ivtvfb.h | ||
| 253 | unifdef-y += joystick.h | 255 | unifdef-y += joystick.h |
| 254 | unifdef-y += kdev_t.h | 256 | unifdef-y += kdev_t.h |
| 255 | unifdef-y += kd.h | 257 | unifdef-y += kd.h |
diff --git a/include/linux/capability.h b/include/linux/capability.h index 02673846d205..9d1fe30b6f6c 100644 --- a/include/linux/capability.h +++ b/include/linux/capability.h | |||
| @@ -503,8 +503,19 @@ extern const kernel_cap_t __cap_init_eff_set; | |||
| 503 | 503 | ||
| 504 | kernel_cap_t cap_set_effective(const kernel_cap_t pE_new); | 504 | kernel_cap_t cap_set_effective(const kernel_cap_t pE_new); |
| 505 | 505 | ||
| 506 | int capable(int cap); | 506 | /** |
| 507 | int __capable(struct task_struct *t, int cap); | 507 | * has_capability - Determine if a task has a superior capability available |
| 508 | * @t: The task in question | ||
| 509 | * @cap: The capability to be tested for | ||
| 510 | * | ||
| 511 | * Return true if the specified task has the given superior capability | ||
| 512 | * currently in effect, false if not. | ||
| 513 | * | ||
| 514 | * Note that this does not set PF_SUPERPRIV on the task. | ||
| 515 | */ | ||
| 516 | #define has_capability(t, cap) (security_capable((t), (cap)) == 0) | ||
| 517 | |||
| 518 | extern int capable(int cap); | ||
| 508 | 519 | ||
| 509 | #endif /* __KERNEL__ */ | 520 | #endif /* __KERNEL__ */ |
| 510 | 521 | ||
diff --git a/include/linux/ivtv.h b/include/linux/ivtv.h index 794b8daa9378..17ca64b5a66c 100644 --- a/include/linux/ivtv.h +++ b/include/linux/ivtv.h | |||
| @@ -21,11 +21,7 @@ | |||
| 21 | #ifndef __LINUX_IVTV_H__ | 21 | #ifndef __LINUX_IVTV_H__ |
| 22 | #define __LINUX_IVTV_H__ | 22 | #define __LINUX_IVTV_H__ |
| 23 | 23 | ||
| 24 | #ifdef __KERNEL__ | 24 | #include <linux/compiler.h> |
| 25 | #include <linux/compiler.h> /* need __user */ | ||
| 26 | #else | ||
| 27 | #define __user | ||
| 28 | #endif | ||
| 29 | #include <linux/types.h> | 25 | #include <linux/types.h> |
| 30 | 26 | ||
| 31 | /* ivtv knows several distinct output modes: MPEG streaming, | 27 | /* ivtv knows several distinct output modes: MPEG streaming, |
diff --git a/include/linux/ivtvfb.h b/include/linux/ivtvfb.h index e980ba62ddcc..e20af47b59ad 100644 --- a/include/linux/ivtvfb.h +++ b/include/linux/ivtvfb.h | |||
| @@ -21,11 +21,7 @@ | |||
| 21 | #ifndef __LINUX_IVTVFB_H__ | 21 | #ifndef __LINUX_IVTVFB_H__ |
| 22 | #define __LINUX_IVTVFB_H__ | 22 | #define __LINUX_IVTVFB_H__ |
| 23 | 23 | ||
| 24 | #ifdef __KERNEL__ | 24 | #include <linux/compiler.h> |
| 25 | #include <linux/compiler.h> /* need __user */ | ||
| 26 | #else | ||
| 27 | #define __user | ||
| 28 | #endif | ||
| 29 | #include <linux/types.h> | 25 | #include <linux/types.h> |
| 30 | 26 | ||
| 31 | /* Framebuffer external API */ | 27 | /* Framebuffer external API */ |
diff --git a/include/linux/mm.h b/include/linux/mm.h index fa651609b65d..72a15dc26bbf 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
| @@ -73,7 +73,7 @@ extern unsigned int kobjsize(const void *objp); | |||
| 73 | #endif | 73 | #endif |
| 74 | 74 | ||
| 75 | /* | 75 | /* |
| 76 | * vm_flags.. | 76 | * vm_flags in vm_area_struct, see mm_types.h. |
| 77 | */ | 77 | */ |
| 78 | #define VM_READ 0x00000001 /* currently active flags */ | 78 | #define VM_READ 0x00000001 /* currently active flags */ |
| 79 | #define VM_WRITE 0x00000002 | 79 | #define VM_WRITE 0x00000002 |
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 386edbe2cb4e..bf334138c7c1 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h | |||
| @@ -113,7 +113,7 @@ struct vm_area_struct { | |||
| 113 | struct vm_area_struct *vm_next; | 113 | struct vm_area_struct *vm_next; |
| 114 | 114 | ||
| 115 | pgprot_t vm_page_prot; /* Access permissions of this VMA. */ | 115 | pgprot_t vm_page_prot; /* Access permissions of this VMA. */ |
| 116 | unsigned long vm_flags; /* Flags, listed below. */ | 116 | unsigned long vm_flags; /* Flags, see mm.h. */ |
| 117 | 117 | ||
| 118 | struct rb_node vm_rb; | 118 | struct rb_node vm_rb; |
| 119 | 119 | ||
diff --git a/include/linux/security.h b/include/linux/security.h index fd96e7f8a6f9..80c4d002864c 100644 --- a/include/linux/security.h +++ b/include/linux/security.h | |||
| @@ -46,8 +46,8 @@ struct audit_krule; | |||
| 46 | */ | 46 | */ |
| 47 | extern int cap_capable(struct task_struct *tsk, int cap); | 47 | extern int cap_capable(struct task_struct *tsk, int cap); |
| 48 | extern int cap_settime(struct timespec *ts, struct timezone *tz); | 48 | extern int cap_settime(struct timespec *ts, struct timezone *tz); |
| 49 | extern int cap_ptrace(struct task_struct *parent, struct task_struct *child, | 49 | extern int cap_ptrace_may_access(struct task_struct *child, unsigned int mode); |
| 50 | unsigned int mode); | 50 | extern int cap_ptrace_traceme(struct task_struct *parent); |
| 51 | extern int cap_capget(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); | 51 | extern int cap_capget(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); |
| 52 | extern int cap_capset_check(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); | 52 | extern int cap_capset_check(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); |
| 53 | extern void cap_capset_set(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); | 53 | extern void cap_capset_set(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); |
| @@ -1157,17 +1157,24 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
| 1157 | * @alter contains the flag indicating whether changes are to be made. | 1157 | * @alter contains the flag indicating whether changes are to be made. |
| 1158 | * Return 0 if permission is granted. | 1158 | * Return 0 if permission is granted. |
| 1159 | * | 1159 | * |
| 1160 | * @ptrace: | 1160 | * @ptrace_may_access: |
| 1161 | * Check permission before allowing the @parent process to trace the | 1161 | * Check permission before allowing the current process to trace the |
| 1162 | * @child process. | 1162 | * @child process. |
| 1163 | * Security modules may also want to perform a process tracing check | 1163 | * Security modules may also want to perform a process tracing check |
| 1164 | * during an execve in the set_security or apply_creds hooks of | 1164 | * during an execve in the set_security or apply_creds hooks of |
| 1165 | * binprm_security_ops if the process is being traced and its security | 1165 | * binprm_security_ops if the process is being traced and its security |
| 1166 | * attributes would be changed by the execve. | 1166 | * attributes would be changed by the execve. |
| 1167 | * @parent contains the task_struct structure for parent process. | 1167 | * @child contains the task_struct structure for the target process. |
| 1168 | * @child contains the task_struct structure for child process. | ||
| 1169 | * @mode contains the PTRACE_MODE flags indicating the form of access. | 1168 | * @mode contains the PTRACE_MODE flags indicating the form of access. |
| 1170 | * Return 0 if permission is granted. | 1169 | * Return 0 if permission is granted. |
| 1170 | * @ptrace_traceme: | ||
| 1171 | * Check that the @parent process has sufficient permission to trace the | ||
| 1172 | * current process before allowing the current process to present itself | ||
| 1173 | * to the @parent process for tracing. | ||
| 1174 | * The parent process will still have to undergo the ptrace_may_access | ||
| 1175 | * checks before it is allowed to trace this one. | ||
| 1176 | * @parent contains the task_struct structure for debugger process. | ||
| 1177 | * Return 0 if permission is granted. | ||
| 1171 | * @capget: | 1178 | * @capget: |
| 1172 | * Get the @effective, @inheritable, and @permitted capability sets for | 1179 | * Get the @effective, @inheritable, and @permitted capability sets for |
| 1173 | * the @target process. The hook may also perform permission checking to | 1180 | * the @target process. The hook may also perform permission checking to |
| @@ -1287,8 +1294,8 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
| 1287 | struct security_operations { | 1294 | struct security_operations { |
| 1288 | char name[SECURITY_NAME_MAX + 1]; | 1295 | char name[SECURITY_NAME_MAX + 1]; |
| 1289 | 1296 | ||
| 1290 | int (*ptrace) (struct task_struct *parent, struct task_struct *child, | 1297 | int (*ptrace_may_access) (struct task_struct *child, unsigned int mode); |
| 1291 | unsigned int mode); | 1298 | int (*ptrace_traceme) (struct task_struct *parent); |
| 1292 | int (*capget) (struct task_struct *target, | 1299 | int (*capget) (struct task_struct *target, |
| 1293 | kernel_cap_t *effective, | 1300 | kernel_cap_t *effective, |
| 1294 | kernel_cap_t *inheritable, kernel_cap_t *permitted); | 1301 | kernel_cap_t *inheritable, kernel_cap_t *permitted); |
| @@ -1560,8 +1567,8 @@ extern struct dentry *securityfs_create_dir(const char *name, struct dentry *par | |||
| 1560 | extern void securityfs_remove(struct dentry *dentry); | 1567 | extern void securityfs_remove(struct dentry *dentry); |
| 1561 | 1568 | ||
| 1562 | /* Security operations */ | 1569 | /* Security operations */ |
| 1563 | int security_ptrace(struct task_struct *parent, struct task_struct *child, | 1570 | int security_ptrace_may_access(struct task_struct *child, unsigned int mode); |
| 1564 | unsigned int mode); | 1571 | int security_ptrace_traceme(struct task_struct *parent); |
| 1565 | int security_capget(struct task_struct *target, | 1572 | int security_capget(struct task_struct *target, |
| 1566 | kernel_cap_t *effective, | 1573 | kernel_cap_t *effective, |
| 1567 | kernel_cap_t *inheritable, | 1574 | kernel_cap_t *inheritable, |
| @@ -1742,11 +1749,15 @@ static inline int security_init(void) | |||
| 1742 | return 0; | 1749 | return 0; |
| 1743 | } | 1750 | } |
| 1744 | 1751 | ||
| 1745 | static inline int security_ptrace(struct task_struct *parent, | 1752 | static inline int security_ptrace_may_access(struct task_struct *child, |
| 1746 | struct task_struct *child, | 1753 | unsigned int mode) |
| 1747 | unsigned int mode) | 1754 | { |
| 1755 | return cap_ptrace_may_access(child, mode); | ||
| 1756 | } | ||
| 1757 | |||
| 1758 | static inline int security_ptrace_traceme(struct task_struct *parent) | ||
| 1748 | { | 1759 | { |
| 1749 | return cap_ptrace(parent, child, mode); | 1760 | return cap_ptrace_traceme(parent); |
| 1750 | } | 1761 | } |
| 1751 | 1762 | ||
| 1752 | static inline int security_capget(struct task_struct *target, | 1763 | static inline int security_capget(struct task_struct *target, |
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index e466bd54a50e..e65a6bed4e3e 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h | |||
| @@ -55,13 +55,13 @@ | |||
| 55 | */ | 55 | */ |
| 56 | #ifndef __LINUX_VIDEODEV2_H | 56 | #ifndef __LINUX_VIDEODEV2_H |
| 57 | #define __LINUX_VIDEODEV2_H | 57 | #define __LINUX_VIDEODEV2_H |
| 58 | |||
| 58 | #ifdef __KERNEL__ | 59 | #ifdef __KERNEL__ |
| 59 | #include <linux/time.h> /* need struct timeval */ | 60 | #include <linux/time.h> /* need struct timeval */ |
| 60 | #include <linux/compiler.h> /* need __user */ | ||
| 61 | #else | 61 | #else |
| 62 | #define __user | ||
| 63 | #include <sys/time.h> | 62 | #include <sys/time.h> |
| 64 | #endif | 63 | #endif |
| 64 | #include <linux/compiler.h> | ||
| 65 | #include <linux/ioctl.h> | 65 | #include <linux/ioctl.h> |
| 66 | #include <linux/types.h> | 66 | #include <linux/types.h> |
| 67 | 67 | ||
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 364789aae9f3..328eb4022727 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h | |||
| @@ -4,9 +4,9 @@ | |||
| 4 | #include <linux/spinlock.h> | 4 | #include <linux/spinlock.h> |
| 5 | #include <asm/page.h> /* pgprot_t */ | 5 | #include <asm/page.h> /* pgprot_t */ |
| 6 | 6 | ||
| 7 | struct vm_area_struct; | 7 | struct vm_area_struct; /* vma defining user mapping in mm_types.h */ |
| 8 | 8 | ||
| 9 | /* bits in vm_struct->flags */ | 9 | /* bits in flags of vmalloc's vm_struct below */ |
| 10 | #define VM_IOREMAP 0x00000001 /* ioremap() and friends */ | 10 | #define VM_IOREMAP 0x00000001 /* ioremap() and friends */ |
| 11 | #define VM_ALLOC 0x00000002 /* vmalloc() */ | 11 | #define VM_ALLOC 0x00000002 /* vmalloc() */ |
| 12 | #define VM_MAP 0x00000004 /* vmap()ed pages */ | 12 | #define VM_MAP 0x00000004 /* vmap()ed pages */ |
diff --git a/init/Kconfig b/init/Kconfig index b678803deccf..c11da38837e5 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
| @@ -558,17 +558,6 @@ config SYSCTL_SYSCALL | |||
| 558 | 558 | ||
| 559 | If unsure say Y here. | 559 | If unsure say Y here. |
| 560 | 560 | ||
| 561 | config SYSCTL_SYSCALL_CHECK | ||
| 562 | bool "Sysctl checks" if EMBEDDED | ||
| 563 | depends on SYSCTL_SYSCALL | ||
| 564 | default y | ||
| 565 | ---help--- | ||
| 566 | sys_sysctl uses binary paths that have been found challenging | ||
| 567 | to properly maintain and use. This enables checks that help | ||
| 568 | you to keep things correct. | ||
| 569 | |||
| 570 | If unsure say Y here. | ||
| 571 | |||
| 572 | config KALLSYMS | 561 | config KALLSYMS |
| 573 | bool "Load all symbols for debugging/ksymoops" if EMBEDDED | 562 | bool "Load all symbols for debugging/ksymoops" if EMBEDDED |
| 574 | default y | 563 | default y |
diff --git a/kernel/capability.c b/kernel/capability.c index 0101e847603e..33e51e78c2d8 100644 --- a/kernel/capability.c +++ b/kernel/capability.c | |||
| @@ -486,17 +486,22 @@ asmlinkage long sys_capset(cap_user_header_t header, const cap_user_data_t data) | |||
| 486 | return ret; | 486 | return ret; |
| 487 | } | 487 | } |
| 488 | 488 | ||
| 489 | int __capable(struct task_struct *t, int cap) | 489 | /** |
| 490 | * capable - Determine if the current task has a superior capability in effect | ||
| 491 | * @cap: The capability to be tested for | ||
| 492 | * | ||
| 493 | * Return true if the current task has the given superior capability currently | ||
| 494 | * available for use, false if not. | ||
| 495 | * | ||
| 496 | * This sets PF_SUPERPRIV on the task if the capability is available on the | ||
| 497 | * assumption that it's about to be used. | ||
| 498 | */ | ||
| 499 | int capable(int cap) | ||
| 490 | { | 500 | { |
| 491 | if (security_capable(t, cap) == 0) { | 501 | if (has_capability(current, cap)) { |
| 492 | t->flags |= PF_SUPERPRIV; | 502 | current->flags |= PF_SUPERPRIV; |
| 493 | return 1; | 503 | return 1; |
| 494 | } | 504 | } |
| 495 | return 0; | 505 | return 0; |
| 496 | } | 506 | } |
| 497 | |||
| 498 | int capable(int cap) | ||
| 499 | { | ||
| 500 | return __capable(current, cap); | ||
| 501 | } | ||
| 502 | EXPORT_SYMBOL(capable); | 507 | EXPORT_SYMBOL(capable); |
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index 1aa91fd6b06e..77fa776a2da8 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
| @@ -1759,11 +1759,10 @@ static void check_chain_key(struct task_struct *curr) | |||
| 1759 | hlock = curr->held_locks + i; | 1759 | hlock = curr->held_locks + i; |
| 1760 | if (chain_key != hlock->prev_chain_key) { | 1760 | if (chain_key != hlock->prev_chain_key) { |
| 1761 | debug_locks_off(); | 1761 | debug_locks_off(); |
| 1762 | printk("hm#1, depth: %u [%u], %016Lx != %016Lx\n", | 1762 | WARN(1, "hm#1, depth: %u [%u], %016Lx != %016Lx\n", |
| 1763 | curr->lockdep_depth, i, | 1763 | curr->lockdep_depth, i, |
| 1764 | (unsigned long long)chain_key, | 1764 | (unsigned long long)chain_key, |
| 1765 | (unsigned long long)hlock->prev_chain_key); | 1765 | (unsigned long long)hlock->prev_chain_key); |
| 1766 | WARN_ON(1); | ||
| 1767 | return; | 1766 | return; |
| 1768 | } | 1767 | } |
| 1769 | id = hlock->class_idx - 1; | 1768 | id = hlock->class_idx - 1; |
| @@ -1778,11 +1777,10 @@ static void check_chain_key(struct task_struct *curr) | |||
| 1778 | } | 1777 | } |
| 1779 | if (chain_key != curr->curr_chain_key) { | 1778 | if (chain_key != curr->curr_chain_key) { |
| 1780 | debug_locks_off(); | 1779 | debug_locks_off(); |
| 1781 | printk("hm#2, depth: %u [%u], %016Lx != %016Lx\n", | 1780 | WARN(1, "hm#2, depth: %u [%u], %016Lx != %016Lx\n", |
| 1782 | curr->lockdep_depth, i, | 1781 | curr->lockdep_depth, i, |
| 1783 | (unsigned long long)chain_key, | 1782 | (unsigned long long)chain_key, |
| 1784 | (unsigned long long)curr->curr_chain_key); | 1783 | (unsigned long long)curr->curr_chain_key); |
| 1785 | WARN_ON(1); | ||
| 1786 | } | 1784 | } |
| 1787 | #endif | 1785 | #endif |
| 1788 | } | 1786 | } |
diff --git a/kernel/lockdep_internals.h b/kernel/lockdep_internals.h index 55db193d366d..56b196932c08 100644 --- a/kernel/lockdep_internals.h +++ b/kernel/lockdep_internals.h | |||
| @@ -50,8 +50,21 @@ extern unsigned int nr_process_chains; | |||
| 50 | extern unsigned int max_lockdep_depth; | 50 | extern unsigned int max_lockdep_depth; |
| 51 | extern unsigned int max_recursion_depth; | 51 | extern unsigned int max_recursion_depth; |
| 52 | 52 | ||
| 53 | #ifdef CONFIG_PROVE_LOCKING | ||
| 53 | extern unsigned long lockdep_count_forward_deps(struct lock_class *); | 54 | extern unsigned long lockdep_count_forward_deps(struct lock_class *); |
| 54 | extern unsigned long lockdep_count_backward_deps(struct lock_class *); | 55 | extern unsigned long lockdep_count_backward_deps(struct lock_class *); |
| 56 | #else | ||
| 57 | static inline unsigned long | ||
| 58 | lockdep_count_forward_deps(struct lock_class *class) | ||
| 59 | { | ||
| 60 | return 0; | ||
| 61 | } | ||
| 62 | static inline unsigned long | ||
| 63 | lockdep_count_backward_deps(struct lock_class *class) | ||
| 64 | { | ||
| 65 | return 0; | ||
| 66 | } | ||
| 67 | #endif | ||
| 55 | 68 | ||
| 56 | #ifdef CONFIG_DEBUG_LOCKDEP | 69 | #ifdef CONFIG_DEBUG_LOCKDEP |
| 57 | /* | 70 | /* |
diff --git a/kernel/lockdep_proc.c b/kernel/lockdep_proc.c index fa19aee604c2..4b194d34d77f 100644 --- a/kernel/lockdep_proc.c +++ b/kernel/lockdep_proc.c | |||
| @@ -82,7 +82,6 @@ static void print_name(struct seq_file *m, struct lock_class *class) | |||
| 82 | 82 | ||
| 83 | static int l_show(struct seq_file *m, void *v) | 83 | static int l_show(struct seq_file *m, void *v) |
| 84 | { | 84 | { |
| 85 | unsigned long nr_forward_deps, nr_backward_deps; | ||
| 86 | struct lock_class *class = v; | 85 | struct lock_class *class = v; |
| 87 | struct lock_list *entry; | 86 | struct lock_list *entry; |
| 88 | char c1, c2, c3, c4; | 87 | char c1, c2, c3, c4; |
| @@ -96,11 +95,10 @@ static int l_show(struct seq_file *m, void *v) | |||
| 96 | #ifdef CONFIG_DEBUG_LOCKDEP | 95 | #ifdef CONFIG_DEBUG_LOCKDEP |
| 97 | seq_printf(m, " OPS:%8ld", class->ops); | 96 | seq_printf(m, " OPS:%8ld", class->ops); |
| 98 | #endif | 97 | #endif |
| 99 | nr_forward_deps = lockdep_count_forward_deps(class); | 98 | #ifdef CONFIG_PROVE_LOCKING |
| 100 | seq_printf(m, " FD:%5ld", nr_forward_deps); | 99 | seq_printf(m, " FD:%5ld", lockdep_count_forward_deps(class)); |
| 101 | 100 | seq_printf(m, " BD:%5ld", lockdep_count_backward_deps(class)); | |
| 102 | nr_backward_deps = lockdep_count_backward_deps(class); | 101 | #endif |
| 103 | seq_printf(m, " BD:%5ld", nr_backward_deps); | ||
| 104 | 102 | ||
| 105 | get_usage_chars(class, &c1, &c2, &c3, &c4); | 103 | get_usage_chars(class, &c1, &c2, &c3, &c4); |
| 106 | seq_printf(m, " %c%c%c%c", c1, c2, c3, c4); | 104 | seq_printf(m, " %c%c%c%c", c1, c2, c3, c4); |
| @@ -325,7 +323,9 @@ static int lockdep_stats_show(struct seq_file *m, void *v) | |||
| 325 | if (class->usage_mask & LOCKF_ENABLED_HARDIRQS_READ) | 323 | if (class->usage_mask & LOCKF_ENABLED_HARDIRQS_READ) |
| 326 | nr_hardirq_read_unsafe++; | 324 | nr_hardirq_read_unsafe++; |
| 327 | 325 | ||
| 326 | #ifdef CONFIG_PROVE_LOCKING | ||
| 328 | sum_forward_deps += lockdep_count_forward_deps(class); | 327 | sum_forward_deps += lockdep_count_forward_deps(class); |
| 328 | #endif | ||
| 329 | } | 329 | } |
| 330 | #ifdef CONFIG_DEBUG_LOCKDEP | 330 | #ifdef CONFIG_DEBUG_LOCKDEP |
| 331 | DEBUG_LOCKS_WARN_ON(debug_atomic_read(&nr_unused_locks) != nr_unused); | 331 | DEBUG_LOCKS_WARN_ON(debug_atomic_read(&nr_unused_locks) != nr_unused); |
diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 082b3fcb32a0..356699a96d56 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c | |||
| @@ -140,7 +140,7 @@ int __ptrace_may_access(struct task_struct *task, unsigned int mode) | |||
| 140 | if (!dumpable && !capable(CAP_SYS_PTRACE)) | 140 | if (!dumpable && !capable(CAP_SYS_PTRACE)) |
| 141 | return -EPERM; | 141 | return -EPERM; |
| 142 | 142 | ||
| 143 | return security_ptrace(current, task, mode); | 143 | return security_ptrace_may_access(task, mode); |
| 144 | } | 144 | } |
| 145 | 145 | ||
| 146 | bool ptrace_may_access(struct task_struct *task, unsigned int mode) | 146 | bool ptrace_may_access(struct task_struct *task, unsigned int mode) |
| @@ -499,8 +499,7 @@ repeat: | |||
| 499 | goto repeat; | 499 | goto repeat; |
| 500 | } | 500 | } |
| 501 | 501 | ||
| 502 | ret = security_ptrace(current->parent, current, | 502 | ret = security_ptrace_traceme(current->parent); |
| 503 | PTRACE_MODE_ATTACH); | ||
| 504 | 503 | ||
| 505 | /* | 504 | /* |
| 506 | * Set the ptrace bit in the process ptrace flags. | 505 | * Set the ptrace bit in the process ptrace flags. |
diff --git a/kernel/sched.c b/kernel/sched.c index 95e6ad3c231d..9a1ddb84e26d 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -808,9 +808,9 @@ const_debug unsigned int sysctl_sched_nr_migrate = 32; | |||
| 808 | 808 | ||
| 809 | /* | 809 | /* |
| 810 | * ratelimit for updating the group shares. | 810 | * ratelimit for updating the group shares. |
| 811 | * default: 0.5ms | 811 | * default: 0.25ms |
| 812 | */ | 812 | */ |
| 813 | const_debug unsigned int sysctl_sched_shares_ratelimit = 500000; | 813 | unsigned int sysctl_sched_shares_ratelimit = 250000; |
| 814 | 814 | ||
| 815 | /* | 815 | /* |
| 816 | * period over which we measure -rt task cpu usage in us. | 816 | * period over which we measure -rt task cpu usage in us. |
| @@ -5786,6 +5786,8 @@ static inline void sched_init_granularity(void) | |||
| 5786 | sysctl_sched_latency = limit; | 5786 | sysctl_sched_latency = limit; |
| 5787 | 5787 | ||
| 5788 | sysctl_sched_wakeup_granularity *= factor; | 5788 | sysctl_sched_wakeup_granularity *= factor; |
| 5789 | |||
| 5790 | sysctl_sched_shares_ratelimit *= factor; | ||
| 5789 | } | 5791 | } |
| 5790 | 5792 | ||
| 5791 | #ifdef CONFIG_SMP | 5793 | #ifdef CONFIG_SMP |
| @@ -8508,8 +8510,8 @@ struct task_group *sched_create_group(struct task_group *parent) | |||
| 8508 | WARN_ON(!parent); /* root should already exist */ | 8510 | WARN_ON(!parent); /* root should already exist */ |
| 8509 | 8511 | ||
| 8510 | tg->parent = parent; | 8512 | tg->parent = parent; |
| 8511 | list_add_rcu(&tg->siblings, &parent->children); | ||
| 8512 | INIT_LIST_HEAD(&tg->children); | 8513 | INIT_LIST_HEAD(&tg->children); |
| 8514 | list_add_rcu(&tg->siblings, &parent->children); | ||
| 8513 | spin_unlock_irqrestore(&task_group_lock, flags); | 8515 | spin_unlock_irqrestore(&task_group_lock, flags); |
| 8514 | 8516 | ||
| 8515 | return tg; | 8517 | return tg; |
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c index 6163e4cf885b..998ba54b4543 100644 --- a/kernel/sched_rt.c +++ b/kernel/sched_rt.c | |||
| @@ -298,7 +298,7 @@ static void __disable_runtime(struct rq *rq) | |||
| 298 | struct rt_rq *iter = sched_rt_period_rt_rq(rt_b, i); | 298 | struct rt_rq *iter = sched_rt_period_rt_rq(rt_b, i); |
| 299 | s64 diff; | 299 | s64 diff; |
| 300 | 300 | ||
| 301 | if (iter == rt_rq) | 301 | if (iter == rt_rq || iter->rt_runtime == RUNTIME_INF) |
| 302 | continue; | 302 | continue; |
| 303 | 303 | ||
| 304 | spin_lock(&iter->rt_runtime_lock); | 304 | spin_lock(&iter->rt_runtime_lock); |
diff --git a/kernel/spinlock.c b/kernel/spinlock.c index 44baeea94ab9..29ab20749dd3 100644 --- a/kernel/spinlock.c +++ b/kernel/spinlock.c | |||
| @@ -290,7 +290,6 @@ void __lockfunc _spin_lock_nested(spinlock_t *lock, int subclass) | |||
| 290 | spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); | 290 | spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); |
| 291 | LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock); | 291 | LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock); |
| 292 | } | 292 | } |
| 293 | |||
| 294 | EXPORT_SYMBOL(_spin_lock_nested); | 293 | EXPORT_SYMBOL(_spin_lock_nested); |
| 295 | 294 | ||
| 296 | unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclass) | 295 | unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclass) |
| @@ -312,7 +311,6 @@ unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclas | |||
| 312 | #endif | 311 | #endif |
| 313 | return flags; | 312 | return flags; |
| 314 | } | 313 | } |
| 315 | |||
| 316 | EXPORT_SYMBOL(_spin_lock_irqsave_nested); | 314 | EXPORT_SYMBOL(_spin_lock_irqsave_nested); |
| 317 | 315 | ||
| 318 | void __lockfunc _spin_lock_nest_lock(spinlock_t *lock, | 316 | void __lockfunc _spin_lock_nest_lock(spinlock_t *lock, |
| @@ -322,7 +320,6 @@ void __lockfunc _spin_lock_nest_lock(spinlock_t *lock, | |||
| 322 | spin_acquire_nest(&lock->dep_map, 0, 0, nest_lock, _RET_IP_); | 320 | spin_acquire_nest(&lock->dep_map, 0, 0, nest_lock, _RET_IP_); |
| 323 | LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock); | 321 | LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock); |
| 324 | } | 322 | } |
| 325 | |||
| 326 | EXPORT_SYMBOL(_spin_lock_nest_lock); | 323 | EXPORT_SYMBOL(_spin_lock_nest_lock); |
| 327 | 324 | ||
| 328 | #endif | 325 | #endif |
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 800ac8485544..8b5a7d304a5f 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
| @@ -693,6 +693,14 @@ config LATENCYTOP | |||
| 693 | Enable this option if you want to use the LatencyTOP tool | 693 | Enable this option if you want to use the LatencyTOP tool |
| 694 | to find out which userspace is blocking on what kernel operations. | 694 | to find out which userspace is blocking on what kernel operations. |
| 695 | 695 | ||
| 696 | config SYSCTL_SYSCALL_CHECK | ||
| 697 | bool "Sysctl checks" | ||
| 698 | depends on SYSCTL_SYSCALL | ||
| 699 | ---help--- | ||
| 700 | sys_sysctl uses binary paths that have been found challenging | ||
| 701 | to properly maintain and use. This enables checks that help | ||
| 702 | you to keep things correct. | ||
| 703 | |||
| 696 | source kernel/trace/Kconfig | 704 | source kernel/trace/Kconfig |
| 697 | 705 | ||
| 698 | config PROVIDE_OHCI1394_DMA_INIT | 706 | config PROVIDE_OHCI1394_DMA_INIT |
| @@ -462,6 +462,8 @@ void __init lmb_enforce_memory_limit(u64 memory_limit) | |||
| 462 | if (lmb.memory.region[0].size < lmb.rmo_size) | 462 | if (lmb.memory.region[0].size < lmb.rmo_size) |
| 463 | lmb.rmo_size = lmb.memory.region[0].size; | 463 | lmb.rmo_size = lmb.memory.region[0].size; |
| 464 | 464 | ||
| 465 | memory_limit = lmb_end_of_DRAM(); | ||
| 466 | |||
| 465 | /* And truncate any reserves above the limit also. */ | 467 | /* And truncate any reserves above the limit also. */ |
| 466 | for (i = 0; i < lmb.reserved.cnt; i++) { | 468 | for (i = 0; i < lmb.reserved.cnt; i++) { |
| 467 | p = &lmb.reserved.region[i]; | 469 | p = &lmb.reserved.region[i]; |
diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 8a5467ee6265..64e5b4bcd964 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/module.h> | 26 | #include <linux/module.h> |
| 27 | #include <linux/notifier.h> | 27 | #include <linux/notifier.h> |
| 28 | #include <linux/memcontrol.h> | 28 | #include <linux/memcontrol.h> |
| 29 | #include <linux/security.h> | ||
| 29 | 30 | ||
| 30 | int sysctl_panic_on_oom; | 31 | int sysctl_panic_on_oom; |
| 31 | int sysctl_oom_kill_allocating_task; | 32 | int sysctl_oom_kill_allocating_task; |
| @@ -128,7 +129,8 @@ unsigned long badness(struct task_struct *p, unsigned long uptime) | |||
| 128 | * Superuser processes are usually more important, so we make it | 129 | * Superuser processes are usually more important, so we make it |
| 129 | * less likely that we kill those. | 130 | * less likely that we kill those. |
| 130 | */ | 131 | */ |
| 131 | if (__capable(p, CAP_SYS_ADMIN) || __capable(p, CAP_SYS_RESOURCE)) | 132 | if (has_capability(p, CAP_SYS_ADMIN) || |
| 133 | has_capability(p, CAP_SYS_RESOURCE)) | ||
| 132 | points /= 4; | 134 | points /= 4; |
| 133 | 135 | ||
| 134 | /* | 136 | /* |
| @@ -137,7 +139,7 @@ unsigned long badness(struct task_struct *p, unsigned long uptime) | |||
| 137 | * tend to only have this flag set on applications they think | 139 | * tend to only have this flag set on applications they think |
| 138 | * of as important. | 140 | * of as important. |
| 139 | */ | 141 | */ |
| 140 | if (__capable(p, CAP_SYS_RAWIO)) | 142 | if (has_capability(p, CAP_SYS_RAWIO)) |
| 141 | points /= 4; | 143 | points /= 4; |
| 142 | 144 | ||
| 143 | /* | 145 | /* |
diff --git a/security/capability.c b/security/capability.c index 63d10da515a5..245874819036 100644 --- a/security/capability.c +++ b/security/capability.c | |||
| @@ -811,7 +811,8 @@ struct security_operations default_security_ops = { | |||
| 811 | 811 | ||
| 812 | void security_fixup_ops(struct security_operations *ops) | 812 | void security_fixup_ops(struct security_operations *ops) |
| 813 | { | 813 | { |
| 814 | set_to_cap_if_null(ops, ptrace); | 814 | set_to_cap_if_null(ops, ptrace_may_access); |
| 815 | set_to_cap_if_null(ops, ptrace_traceme); | ||
| 815 | set_to_cap_if_null(ops, capget); | 816 | set_to_cap_if_null(ops, capget); |
| 816 | set_to_cap_if_null(ops, capset_check); | 817 | set_to_cap_if_null(ops, capset_check); |
| 817 | set_to_cap_if_null(ops, capset_set); | 818 | set_to_cap_if_null(ops, capset_set); |
diff --git a/security/commoncap.c b/security/commoncap.c index 4afbece37a08..e4c4b3fc0c04 100644 --- a/security/commoncap.c +++ b/security/commoncap.c | |||
| @@ -63,14 +63,24 @@ int cap_settime(struct timespec *ts, struct timezone *tz) | |||
| 63 | return 0; | 63 | return 0; |
| 64 | } | 64 | } |
| 65 | 65 | ||
| 66 | int cap_ptrace (struct task_struct *parent, struct task_struct *child, | 66 | int cap_ptrace_may_access(struct task_struct *child, unsigned int mode) |
| 67 | unsigned int mode) | ||
| 68 | { | 67 | { |
| 69 | /* Derived from arch/i386/kernel/ptrace.c:sys_ptrace. */ | 68 | /* Derived from arch/i386/kernel/ptrace.c:sys_ptrace. */ |
| 70 | if (!cap_issubset(child->cap_permitted, parent->cap_permitted) && | 69 | if (cap_issubset(child->cap_permitted, current->cap_permitted)) |
| 71 | !__capable(parent, CAP_SYS_PTRACE)) | 70 | return 0; |
| 72 | return -EPERM; | 71 | if (capable(CAP_SYS_PTRACE)) |
| 73 | return 0; | 72 | return 0; |
| 73 | return -EPERM; | ||
| 74 | } | ||
| 75 | |||
| 76 | int cap_ptrace_traceme(struct task_struct *parent) | ||
| 77 | { | ||
| 78 | /* Derived from arch/i386/kernel/ptrace.c:sys_ptrace. */ | ||
| 79 | if (cap_issubset(current->cap_permitted, parent->cap_permitted)) | ||
| 80 | return 0; | ||
| 81 | if (has_capability(parent, CAP_SYS_PTRACE)) | ||
| 82 | return 0; | ||
| 83 | return -EPERM; | ||
| 74 | } | 84 | } |
| 75 | 85 | ||
| 76 | int cap_capget (struct task_struct *target, kernel_cap_t *effective, | 86 | int cap_capget (struct task_struct *target, kernel_cap_t *effective, |
| @@ -534,7 +544,7 @@ int cap_task_post_setuid (uid_t old_ruid, uid_t old_euid, uid_t old_suid, | |||
| 534 | static inline int cap_safe_nice(struct task_struct *p) | 544 | static inline int cap_safe_nice(struct task_struct *p) |
| 535 | { | 545 | { |
| 536 | if (!cap_issubset(p->cap_permitted, current->cap_permitted) && | 546 | if (!cap_issubset(p->cap_permitted, current->cap_permitted) && |
| 537 | !__capable(current, CAP_SYS_NICE)) | 547 | !capable(CAP_SYS_NICE)) |
| 538 | return -EPERM; | 548 | return -EPERM; |
| 539 | return 0; | 549 | return 0; |
| 540 | } | 550 | } |
diff --git a/security/root_plug.c b/security/root_plug.c index be0ebec2580b..c3f68b5b372d 100644 --- a/security/root_plug.c +++ b/security/root_plug.c | |||
| @@ -72,7 +72,8 @@ static int rootplug_bprm_check_security (struct linux_binprm *bprm) | |||
| 72 | 72 | ||
| 73 | static struct security_operations rootplug_security_ops = { | 73 | static struct security_operations rootplug_security_ops = { |
| 74 | /* Use the capability functions for some of the hooks */ | 74 | /* Use the capability functions for some of the hooks */ |
| 75 | .ptrace = cap_ptrace, | 75 | .ptrace_may_access = cap_ptrace_may_access, |
| 76 | .ptrace_traceme = cap_ptrace_traceme, | ||
| 76 | .capget = cap_capget, | 77 | .capget = cap_capget, |
| 77 | .capset_check = cap_capset_check, | 78 | .capset_check = cap_capset_check, |
| 78 | .capset_set = cap_capset_set, | 79 | .capset_set = cap_capset_set, |
diff --git a/security/security.c b/security/security.c index ff7068727757..3a4b4f55b33f 100644 --- a/security/security.c +++ b/security/security.c | |||
| @@ -127,10 +127,14 @@ int register_security(struct security_operations *ops) | |||
| 127 | 127 | ||
| 128 | /* Security operations */ | 128 | /* Security operations */ |
| 129 | 129 | ||
| 130 | int security_ptrace(struct task_struct *parent, struct task_struct *child, | 130 | int security_ptrace_may_access(struct task_struct *child, unsigned int mode) |
| 131 | unsigned int mode) | ||
| 132 | { | 131 | { |
| 133 | return security_ops->ptrace(parent, child, mode); | 132 | return security_ops->ptrace_may_access(child, mode); |
| 133 | } | ||
| 134 | |||
| 135 | int security_ptrace_traceme(struct task_struct *parent) | ||
| 136 | { | ||
| 137 | return security_ops->ptrace_traceme(parent); | ||
| 134 | } | 138 | } |
| 135 | 139 | ||
| 136 | int security_capget(struct task_struct *target, | 140 | int security_capget(struct task_struct *target, |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 3ae9bec5a508..03fc6a81ae32 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
| @@ -1738,24 +1738,34 @@ static inline u32 file_to_av(struct file *file) | |||
| 1738 | 1738 | ||
| 1739 | /* Hook functions begin here. */ | 1739 | /* Hook functions begin here. */ |
| 1740 | 1740 | ||
| 1741 | static int selinux_ptrace(struct task_struct *parent, | 1741 | static int selinux_ptrace_may_access(struct task_struct *child, |
| 1742 | struct task_struct *child, | 1742 | unsigned int mode) |
| 1743 | unsigned int mode) | ||
| 1744 | { | 1743 | { |
| 1745 | int rc; | 1744 | int rc; |
| 1746 | 1745 | ||
| 1747 | rc = secondary_ops->ptrace(parent, child, mode); | 1746 | rc = secondary_ops->ptrace_may_access(child, mode); |
| 1748 | if (rc) | 1747 | if (rc) |
| 1749 | return rc; | 1748 | return rc; |
| 1750 | 1749 | ||
| 1751 | if (mode == PTRACE_MODE_READ) { | 1750 | if (mode == PTRACE_MODE_READ) { |
| 1752 | struct task_security_struct *tsec = parent->security; | 1751 | struct task_security_struct *tsec = current->security; |
| 1753 | struct task_security_struct *csec = child->security; | 1752 | struct task_security_struct *csec = child->security; |
| 1754 | return avc_has_perm(tsec->sid, csec->sid, | 1753 | return avc_has_perm(tsec->sid, csec->sid, |
| 1755 | SECCLASS_FILE, FILE__READ, NULL); | 1754 | SECCLASS_FILE, FILE__READ, NULL); |
| 1756 | } | 1755 | } |
| 1757 | 1756 | ||
| 1758 | return task_has_perm(parent, child, PROCESS__PTRACE); | 1757 | return task_has_perm(current, child, PROCESS__PTRACE); |
| 1758 | } | ||
| 1759 | |||
| 1760 | static int selinux_ptrace_traceme(struct task_struct *parent) | ||
| 1761 | { | ||
| 1762 | int rc; | ||
| 1763 | |||
| 1764 | rc = secondary_ops->ptrace_traceme(parent); | ||
| 1765 | if (rc) | ||
| 1766 | return rc; | ||
| 1767 | |||
| 1768 | return task_has_perm(parent, current, PROCESS__PTRACE); | ||
| 1759 | } | 1769 | } |
| 1760 | 1770 | ||
| 1761 | static int selinux_capget(struct task_struct *target, kernel_cap_t *effective, | 1771 | static int selinux_capget(struct task_struct *target, kernel_cap_t *effective, |
| @@ -5346,7 +5356,8 @@ static int selinux_key_getsecurity(struct key *key, char **_buffer) | |||
| 5346 | static struct security_operations selinux_ops = { | 5356 | static struct security_operations selinux_ops = { |
| 5347 | .name = "selinux", | 5357 | .name = "selinux", |
| 5348 | 5358 | ||
| 5349 | .ptrace = selinux_ptrace, | 5359 | .ptrace_may_access = selinux_ptrace_may_access, |
| 5360 | .ptrace_traceme = selinux_ptrace_traceme, | ||
| 5350 | .capget = selinux_capget, | 5361 | .capget = selinux_capget, |
| 5351 | .capset_check = selinux_capset_check, | 5362 | .capset_check = selinux_capset_check, |
| 5352 | .capset_set = selinux_capset_set, | 5363 | .capset_set = selinux_capset_set, |
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 1b40e558f983..87d75417ea93 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c | |||
| @@ -87,27 +87,46 @@ struct inode_smack *new_inode_smack(char *smack) | |||
| 87 | */ | 87 | */ |
| 88 | 88 | ||
| 89 | /** | 89 | /** |
| 90 | * smack_ptrace - Smack approval on ptrace | 90 | * smack_ptrace_may_access - Smack approval on PTRACE_ATTACH |
| 91 | * @ptp: parent task pointer | ||
| 92 | * @ctp: child task pointer | 91 | * @ctp: child task pointer |
| 93 | * | 92 | * |
| 94 | * Returns 0 if access is OK, an error code otherwise | 93 | * Returns 0 if access is OK, an error code otherwise |
| 95 | * | 94 | * |
| 96 | * Do the capability checks, and require read and write. | 95 | * Do the capability checks, and require read and write. |
| 97 | */ | 96 | */ |
| 98 | static int smack_ptrace(struct task_struct *ptp, struct task_struct *ctp, | 97 | static int smack_ptrace_may_access(struct task_struct *ctp, unsigned int mode) |
| 99 | unsigned int mode) | ||
| 100 | { | 98 | { |
| 101 | int rc; | 99 | int rc; |
| 102 | 100 | ||
| 103 | rc = cap_ptrace(ptp, ctp, mode); | 101 | rc = cap_ptrace_may_access(ctp, mode); |
| 104 | if (rc != 0) | 102 | if (rc != 0) |
| 105 | return rc; | 103 | return rc; |
| 106 | 104 | ||
| 107 | rc = smk_access(ptp->security, ctp->security, MAY_READWRITE); | 105 | rc = smk_access(current->security, ctp->security, MAY_READWRITE); |
| 108 | if (rc != 0 && __capable(ptp, CAP_MAC_OVERRIDE)) | 106 | if (rc != 0 && capable(CAP_MAC_OVERRIDE)) |
| 109 | return 0; | 107 | return 0; |
| 108 | return rc; | ||
| 109 | } | ||
| 110 | |||
| 111 | /** | ||
| 112 | * smack_ptrace_traceme - Smack approval on PTRACE_TRACEME | ||
| 113 | * @ptp: parent task pointer | ||
| 114 | * | ||
| 115 | * Returns 0 if access is OK, an error code otherwise | ||
| 116 | * | ||
| 117 | * Do the capability checks, and require read and write. | ||
| 118 | */ | ||
| 119 | static int smack_ptrace_traceme(struct task_struct *ptp) | ||
| 120 | { | ||
| 121 | int rc; | ||
| 122 | |||
| 123 | rc = cap_ptrace_traceme(ptp); | ||
| 124 | if (rc != 0) | ||
| 125 | return rc; | ||
| 110 | 126 | ||
| 127 | rc = smk_access(ptp->security, current->security, MAY_READWRITE); | ||
| 128 | if (rc != 0 && has_capability(ptp, CAP_MAC_OVERRIDE)) | ||
| 129 | return 0; | ||
| 111 | return rc; | 130 | return rc; |
| 112 | } | 131 | } |
| 113 | 132 | ||
| @@ -923,7 +942,7 @@ static int smack_file_send_sigiotask(struct task_struct *tsk, | |||
| 923 | */ | 942 | */ |
| 924 | file = container_of(fown, struct file, f_owner); | 943 | file = container_of(fown, struct file, f_owner); |
| 925 | rc = smk_access(file->f_security, tsk->security, MAY_WRITE); | 944 | rc = smk_access(file->f_security, tsk->security, MAY_WRITE); |
| 926 | if (rc != 0 && __capable(tsk, CAP_MAC_OVERRIDE)) | 945 | if (rc != 0 && has_capability(tsk, CAP_MAC_OVERRIDE)) |
| 927 | return 0; | 946 | return 0; |
| 928 | return rc; | 947 | return rc; |
| 929 | } | 948 | } |
| @@ -1164,12 +1183,12 @@ static int smack_task_wait(struct task_struct *p) | |||
| 1164 | * account for the smack labels having gotten to | 1183 | * account for the smack labels having gotten to |
| 1165 | * be different in the first place. | 1184 | * be different in the first place. |
| 1166 | * | 1185 | * |
| 1167 | * This breaks the strict subjet/object access | 1186 | * This breaks the strict subject/object access |
| 1168 | * control ideal, taking the object's privilege | 1187 | * control ideal, taking the object's privilege |
| 1169 | * state into account in the decision as well as | 1188 | * state into account in the decision as well as |
| 1170 | * the smack value. | 1189 | * the smack value. |
| 1171 | */ | 1190 | */ |
| 1172 | if (capable(CAP_MAC_OVERRIDE) || __capable(p, CAP_MAC_OVERRIDE)) | 1191 | if (capable(CAP_MAC_OVERRIDE) || has_capability(p, CAP_MAC_OVERRIDE)) |
| 1173 | return 0; | 1192 | return 0; |
| 1174 | 1193 | ||
| 1175 | return rc; | 1194 | return rc; |
| @@ -2016,9 +2035,6 @@ static int smack_setprocattr(struct task_struct *p, char *name, | |||
| 2016 | { | 2035 | { |
| 2017 | char *newsmack; | 2036 | char *newsmack; |
| 2018 | 2037 | ||
| 2019 | if (!__capable(p, CAP_MAC_ADMIN)) | ||
| 2020 | return -EPERM; | ||
| 2021 | |||
| 2022 | /* | 2038 | /* |
| 2023 | * Changing another process' Smack value is too dangerous | 2039 | * Changing another process' Smack value is too dangerous |
| 2024 | * and supports no sane use case. | 2040 | * and supports no sane use case. |
| @@ -2026,6 +2042,9 @@ static int smack_setprocattr(struct task_struct *p, char *name, | |||
| 2026 | if (p != current) | 2042 | if (p != current) |
| 2027 | return -EPERM; | 2043 | return -EPERM; |
| 2028 | 2044 | ||
| 2045 | if (!capable(CAP_MAC_ADMIN)) | ||
| 2046 | return -EPERM; | ||
| 2047 | |||
| 2029 | if (value == NULL || size == 0 || size >= SMK_LABELLEN) | 2048 | if (value == NULL || size == 0 || size >= SMK_LABELLEN) |
| 2030 | return -EINVAL; | 2049 | return -EINVAL; |
| 2031 | 2050 | ||
| @@ -2552,7 +2571,8 @@ static void smack_release_secctx(char *secdata, u32 seclen) | |||
| 2552 | struct security_operations smack_ops = { | 2571 | struct security_operations smack_ops = { |
| 2553 | .name = "smack", | 2572 | .name = "smack", |
| 2554 | 2573 | ||
| 2555 | .ptrace = smack_ptrace, | 2574 | .ptrace_may_access = smack_ptrace_may_access, |
| 2575 | .ptrace_traceme = smack_ptrace_traceme, | ||
| 2556 | .capget = cap_capget, | 2576 | .capget = cap_capget, |
| 2557 | .capset_check = cap_capset_check, | 2577 | .capset_check = cap_capset_check, |
| 2558 | .capset_set = cap_capset_set, | 2578 | .capset_set = cap_capset_set, |
| @@ -2729,4 +2749,3 @@ static __init int smack_init(void) | |||
| 2729 | * all processes and objects when they are created. | 2749 | * all processes and objects when they are created. |
| 2730 | */ | 2750 | */ |
| 2731 | security_initcall(smack_init); | 2751 | security_initcall(smack_init); |
| 2732 | |||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index add4e87e0b20..b80e725432f0 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -6437,6 +6437,39 @@ static void alc882_auto_init_analog_input(struct hda_codec *codec) | |||
| 6437 | } | 6437 | } |
| 6438 | } | 6438 | } |
| 6439 | 6439 | ||
| 6440 | static void alc882_auto_init_input_src(struct hda_codec *codec) | ||
| 6441 | { | ||
| 6442 | struct alc_spec *spec = codec->spec; | ||
| 6443 | const struct hda_input_mux *imux = spec->input_mux; | ||
| 6444 | int c; | ||
| 6445 | |||
| 6446 | for (c = 0; c < spec->num_adc_nids; c++) { | ||
| 6447 | hda_nid_t conn_list[HDA_MAX_NUM_INPUTS]; | ||
| 6448 | hda_nid_t nid = spec->capsrc_nids[c]; | ||
| 6449 | int conns, mute, idx, item; | ||
| 6450 | |||
| 6451 | conns = snd_hda_get_connections(codec, nid, conn_list, | ||
| 6452 | ARRAY_SIZE(conn_list)); | ||
| 6453 | if (conns < 0) | ||
| 6454 | continue; | ||
| 6455 | for (idx = 0; idx < conns; idx++) { | ||
| 6456 | /* if the current connection is the selected one, | ||
| 6457 | * unmute it as default - otherwise mute it | ||
| 6458 | */ | ||
| 6459 | mute = AMP_IN_MUTE(idx); | ||
| 6460 | for (item = 0; item < imux->num_items; item++) { | ||
| 6461 | if (imux->items[item].index == idx) { | ||
| 6462 | if (spec->cur_mux[c] == item) | ||
| 6463 | mute = AMP_IN_UNMUTE(idx); | ||
| 6464 | break; | ||
| 6465 | } | ||
| 6466 | } | ||
| 6467 | snd_hda_codec_write(codec, nid, 0, | ||
| 6468 | AC_VERB_SET_AMP_GAIN_MUTE, mute); | ||
| 6469 | } | ||
| 6470 | } | ||
| 6471 | } | ||
| 6472 | |||
| 6440 | /* add mic boosts if needed */ | 6473 | /* add mic boosts if needed */ |
| 6441 | static int alc_auto_add_mic_boost(struct hda_codec *codec) | 6474 | static int alc_auto_add_mic_boost(struct hda_codec *codec) |
| 6442 | { | 6475 | { |
| @@ -6491,6 +6524,7 @@ static void alc882_auto_init(struct hda_codec *codec) | |||
| 6491 | alc882_auto_init_multi_out(codec); | 6524 | alc882_auto_init_multi_out(codec); |
| 6492 | alc882_auto_init_hp_out(codec); | 6525 | alc882_auto_init_hp_out(codec); |
| 6493 | alc882_auto_init_analog_input(codec); | 6526 | alc882_auto_init_analog_input(codec); |
| 6527 | alc882_auto_init_input_src(codec); | ||
| 6494 | if (spec->unsol_event) | 6528 | if (spec->unsol_event) |
| 6495 | alc_sku_automute(codec); | 6529 | alc_sku_automute(codec); |
| 6496 | } | 6530 | } |
| @@ -8285,6 +8319,8 @@ static void alc883_auto_init_analog_input(struct hda_codec *codec) | |||
| 8285 | } | 8319 | } |
| 8286 | } | 8320 | } |
| 8287 | 8321 | ||
| 8322 | #define alc883_auto_init_input_src alc882_auto_init_input_src | ||
| 8323 | |||
| 8288 | /* almost identical with ALC880 parser... */ | 8324 | /* almost identical with ALC880 parser... */ |
| 8289 | static int alc883_parse_auto_config(struct hda_codec *codec) | 8325 | static int alc883_parse_auto_config(struct hda_codec *codec) |
| 8290 | { | 8326 | { |
| @@ -8315,6 +8351,7 @@ static void alc883_auto_init(struct hda_codec *codec) | |||
| 8315 | alc883_auto_init_multi_out(codec); | 8351 | alc883_auto_init_multi_out(codec); |
| 8316 | alc883_auto_init_hp_out(codec); | 8352 | alc883_auto_init_hp_out(codec); |
| 8317 | alc883_auto_init_analog_input(codec); | 8353 | alc883_auto_init_analog_input(codec); |
| 8354 | alc883_auto_init_input_src(codec); | ||
| 8318 | if (spec->unsol_event) | 8355 | if (spec->unsol_event) |
| 8319 | alc_sku_automute(codec); | 8356 | alc_sku_automute(codec); |
| 8320 | } | 8357 | } |
| @@ -9663,6 +9700,7 @@ static int alc262_parse_auto_config(struct hda_codec *codec) | |||
| 9663 | #define alc262_auto_init_multi_out alc882_auto_init_multi_out | 9700 | #define alc262_auto_init_multi_out alc882_auto_init_multi_out |
| 9664 | #define alc262_auto_init_hp_out alc882_auto_init_hp_out | 9701 | #define alc262_auto_init_hp_out alc882_auto_init_hp_out |
| 9665 | #define alc262_auto_init_analog_input alc882_auto_init_analog_input | 9702 | #define alc262_auto_init_analog_input alc882_auto_init_analog_input |
| 9703 | #define alc262_auto_init_input_src alc882_auto_init_input_src | ||
| 9666 | 9704 | ||
| 9667 | 9705 | ||
| 9668 | /* init callback for auto-configuration model -- overriding the default init */ | 9706 | /* init callback for auto-configuration model -- overriding the default init */ |
| @@ -9672,6 +9710,7 @@ static void alc262_auto_init(struct hda_codec *codec) | |||
| 9672 | alc262_auto_init_multi_out(codec); | 9710 | alc262_auto_init_multi_out(codec); |
| 9673 | alc262_auto_init_hp_out(codec); | 9711 | alc262_auto_init_hp_out(codec); |
| 9674 | alc262_auto_init_analog_input(codec); | 9712 | alc262_auto_init_analog_input(codec); |
| 9713 | alc262_auto_init_input_src(codec); | ||
| 9675 | if (spec->unsol_event) | 9714 | if (spec->unsol_event) |
| 9676 | alc_sku_automute(codec); | 9715 | alc_sku_automute(codec); |
| 9677 | } | 9716 | } |
| @@ -13330,6 +13369,8 @@ static void alc861vd_auto_init_analog_input(struct hda_codec *codec) | |||
| 13330 | } | 13369 | } |
| 13331 | } | 13370 | } |
| 13332 | 13371 | ||
| 13372 | #define alc861vd_auto_init_input_src alc882_auto_init_input_src | ||
| 13373 | |||
| 13333 | #define alc861vd_idx_to_mixer_vol(nid) ((nid) + 0x02) | 13374 | #define alc861vd_idx_to_mixer_vol(nid) ((nid) + 0x02) |
| 13334 | #define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c) | 13375 | #define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c) |
| 13335 | 13376 | ||
| @@ -13512,6 +13553,7 @@ static void alc861vd_auto_init(struct hda_codec *codec) | |||
| 13512 | alc861vd_auto_init_multi_out(codec); | 13553 | alc861vd_auto_init_multi_out(codec); |
| 13513 | alc861vd_auto_init_hp_out(codec); | 13554 | alc861vd_auto_init_hp_out(codec); |
| 13514 | alc861vd_auto_init_analog_input(codec); | 13555 | alc861vd_auto_init_analog_input(codec); |
| 13556 | alc861vd_auto_init_input_src(codec); | ||
| 13515 | if (spec->unsol_event) | 13557 | if (spec->unsol_event) |
| 13516 | alc_sku_automute(codec); | 13558 | alc_sku_automute(codec); |
| 13517 | } | 13559 | } |
| @@ -14677,6 +14719,8 @@ static void alc662_auto_init_analog_input(struct hda_codec *codec) | |||
| 14677 | } | 14719 | } |
| 14678 | } | 14720 | } |
| 14679 | 14721 | ||
| 14722 | #define alc662_auto_init_input_src alc882_auto_init_input_src | ||
| 14723 | |||
| 14680 | static int alc662_parse_auto_config(struct hda_codec *codec) | 14724 | static int alc662_parse_auto_config(struct hda_codec *codec) |
| 14681 | { | 14725 | { |
| 14682 | struct alc_spec *spec = codec->spec; | 14726 | struct alc_spec *spec = codec->spec; |
| @@ -14733,6 +14777,7 @@ static void alc662_auto_init(struct hda_codec *codec) | |||
| 14733 | alc662_auto_init_multi_out(codec); | 14777 | alc662_auto_init_multi_out(codec); |
| 14734 | alc662_auto_init_hp_out(codec); | 14778 | alc662_auto_init_hp_out(codec); |
| 14735 | alc662_auto_init_analog_input(codec); | 14779 | alc662_auto_init_analog_input(codec); |
| 14780 | alc662_auto_init_input_src(codec); | ||
| 14736 | if (spec->unsol_event) | 14781 | if (spec->unsol_event) |
| 14737 | alc_sku_automute(codec); | 14782 | alc_sku_automute(codec); |
| 14738 | } | 14783 | } |
