diff options
Diffstat (limited to 'arch')
192 files changed, 6812 insertions, 1700 deletions
diff --git a/arch/arm/configs/rx51_defconfig b/arch/arm/configs/rx51_defconfig index eb2cb31825c0..f238df66efd4 100644 --- a/arch/arm/configs/rx51_defconfig +++ b/arch/arm/configs/rx51_defconfig | |||
@@ -282,7 +282,7 @@ CONFIG_ALIGNMENT_TRAP=y | |||
282 | # | 282 | # |
283 | CONFIG_ZBOOT_ROM_TEXT=0x0 | 283 | CONFIG_ZBOOT_ROM_TEXT=0x0 |
284 | CONFIG_ZBOOT_ROM_BSS=0x0 | 284 | CONFIG_ZBOOT_ROM_BSS=0x0 |
285 | CONFIG_CMDLINE="init=/sbin/preinit ubi.mtd=rootfs root=ubi0:rootfs rootfstype=ubifs rootflags=bulk_read,no_chk_data_crc rw console=ttyMTD,log console=tty0" | 285 | CONFIG_CMDLINE="init=/sbin/preinit ubi.mtd=rootfs root=ubi0:rootfs rootfstype=ubifs rootflags=bulk_read,no_chk_data_crc rw console=ttyMTD,log console=tty0 console=ttyS2,115200n8" |
286 | # CONFIG_XIP_KERNEL is not set | 286 | # CONFIG_XIP_KERNEL is not set |
287 | # CONFIG_KEXEC is not set | 287 | # CONFIG_KEXEC is not set |
288 | 288 | ||
@@ -1354,7 +1354,7 @@ CONFIG_USB_OTG_UTILS=y | |||
1354 | # CONFIG_USB_GPIO_VBUS is not set | 1354 | # CONFIG_USB_GPIO_VBUS is not set |
1355 | # CONFIG_ISP1301_OMAP is not set | 1355 | # CONFIG_ISP1301_OMAP is not set |
1356 | CONFIG_TWL4030_USB=y | 1356 | CONFIG_TWL4030_USB=y |
1357 | CONFIG_MMC=m | 1357 | CONFIG_MMC=y |
1358 | # CONFIG_MMC_DEBUG is not set | 1358 | # CONFIG_MMC_DEBUG is not set |
1359 | # CONFIG_MMC_UNSAFE_RESUME is not set | 1359 | # CONFIG_MMC_UNSAFE_RESUME is not set |
1360 | 1360 | ||
@@ -1449,7 +1449,8 @@ CONFIG_RTC_DRV_TWL4030=m | |||
1449 | # on-CPU RTC drivers | 1449 | # on-CPU RTC drivers |
1450 | # | 1450 | # |
1451 | # CONFIG_DMADEVICES is not set | 1451 | # CONFIG_DMADEVICES is not set |
1452 | # CONFIG_REGULATOR is not set | 1452 | CONFIG_REGULATOR=y |
1453 | CONFIG_REGULATOR_TWL4030=y | ||
1453 | # CONFIG_UIO is not set | 1454 | # CONFIG_UIO is not set |
1454 | # CONFIG_STAGING is not set | 1455 | # CONFIG_STAGING is not set |
1455 | 1456 | ||
diff --git a/arch/arm/include/asm/setup.h b/arch/arm/include/asm/setup.h index ee1304f22f94..5ccce0a9b03c 100644 --- a/arch/arm/include/asm/setup.h +++ b/arch/arm/include/asm/setup.h | |||
@@ -201,7 +201,8 @@ static struct tagtable __tagtable_##fn __tag = { tag, fn } | |||
201 | struct membank { | 201 | struct membank { |
202 | unsigned long start; | 202 | unsigned long start; |
203 | unsigned long size; | 203 | unsigned long size; |
204 | int node; | 204 | unsigned short node; |
205 | unsigned short highmem; | ||
205 | }; | 206 | }; |
206 | 207 | ||
207 | struct meminfo { | 208 | struct meminfo { |
diff --git a/arch/arm/mach-ixp4xx/include/mach/io.h b/arch/arm/mach-ixp4xx/include/mach/io.h index ce63048d45eb..8a947d42a6f1 100644 --- a/arch/arm/mach-ixp4xx/include/mach/io.h +++ b/arch/arm/mach-ixp4xx/include/mach/io.h | |||
@@ -17,7 +17,7 @@ | |||
17 | 17 | ||
18 | #include <mach/hardware.h> | 18 | #include <mach/hardware.h> |
19 | 19 | ||
20 | #define IO_SPACE_LIMIT 0xffff0000 | 20 | #define IO_SPACE_LIMIT 0x0000ffff |
21 | 21 | ||
22 | extern int (*ixp4xx_pci_read)(u32 addr, u32 cmd, u32* data); | 22 | extern int (*ixp4xx_pci_read)(u32 addr, u32 cmd, u32* data); |
23 | extern int ixp4xx_pci_write(u32 addr, u32 cmd, u32 data); | 23 | extern int ixp4xx_pci_write(u32 addr, u32 cmd, u32 data); |
diff --git a/arch/arm/mach-mx3/mx31moboard-devboard.c b/arch/arm/mach-mx3/mx31moboard-devboard.c index 4704405165a1..b48581e7dedd 100644 --- a/arch/arm/mach-mx3/mx31moboard-devboard.c +++ b/arch/arm/mach-mx3/mx31moboard-devboard.c | |||
@@ -63,7 +63,7 @@ static struct imxuart_platform_data uart_pdata = { | |||
63 | 63 | ||
64 | static int devboard_sdhc2_get_ro(struct device *dev) | 64 | static int devboard_sdhc2_get_ro(struct device *dev) |
65 | { | 65 | { |
66 | return gpio_get_value(SDHC2_WP); | 66 | return !gpio_get_value(SDHC2_WP); |
67 | } | 67 | } |
68 | 68 | ||
69 | static int devboard_sdhc2_init(struct device *dev, irq_handler_t detect_irq, | 69 | static int devboard_sdhc2_init(struct device *dev, irq_handler_t detect_irq, |
diff --git a/arch/arm/mach-mx3/mx31moboard-marxbot.c b/arch/arm/mach-mx3/mx31moboard-marxbot.c index 641c3d6153ae..901fb0166c0e 100644 --- a/arch/arm/mach-mx3/mx31moboard-marxbot.c +++ b/arch/arm/mach-mx3/mx31moboard-marxbot.c | |||
@@ -67,7 +67,7 @@ static unsigned int marxbot_pins[] = { | |||
67 | 67 | ||
68 | static int marxbot_sdhc2_get_ro(struct device *dev) | 68 | static int marxbot_sdhc2_get_ro(struct device *dev) |
69 | { | 69 | { |
70 | return gpio_get_value(SDHC2_WP); | 70 | return !gpio_get_value(SDHC2_WP); |
71 | } | 71 | } |
72 | 72 | ||
73 | static int marxbot_sdhc2_init(struct device *dev, irq_handler_t detect_irq, | 73 | static int marxbot_sdhc2_init(struct device *dev, irq_handler_t detect_irq, |
diff --git a/arch/arm/mach-mx3/mx31moboard.c b/arch/arm/mach-mx3/mx31moboard.c index a17f2e411609..2a2da4739ecf 100644 --- a/arch/arm/mach-mx3/mx31moboard.c +++ b/arch/arm/mach-mx3/mx31moboard.c | |||
@@ -94,7 +94,7 @@ static struct imxi2c_platform_data moboard_i2c1_pdata = { | |||
94 | 94 | ||
95 | static int moboard_sdhc1_get_ro(struct device *dev) | 95 | static int moboard_sdhc1_get_ro(struct device *dev) |
96 | { | 96 | { |
97 | return gpio_get_value(SDHC1_WP); | 97 | return !gpio_get_value(SDHC1_WP); |
98 | } | 98 | } |
99 | 99 | ||
100 | static int moboard_sdhc1_init(struct device *dev, irq_handler_t detect_irq, | 100 | static int moboard_sdhc1_init(struct device *dev, irq_handler_t detect_irq, |
diff --git a/arch/arm/mach-mx3/pcm037_eet.c b/arch/arm/mach-mx3/pcm037_eet.c index fe52fb1bb8b7..8d386000fc40 100644 --- a/arch/arm/mach-mx3/pcm037_eet.c +++ b/arch/arm/mach-mx3/pcm037_eet.c | |||
@@ -24,15 +24,6 @@ | |||
24 | #include "devices.h" | 24 | #include "devices.h" |
25 | 25 | ||
26 | static unsigned int pcm037_eet_pins[] = { | 26 | static unsigned int pcm037_eet_pins[] = { |
27 | /* SPI #1 */ | ||
28 | MX31_PIN_CSPI1_MISO__MISO, | ||
29 | MX31_PIN_CSPI1_MOSI__MOSI, | ||
30 | MX31_PIN_CSPI1_SCLK__SCLK, | ||
31 | MX31_PIN_CSPI1_SPI_RDY__SPI_RDY, | ||
32 | MX31_PIN_CSPI1_SS0__SS0, | ||
33 | MX31_PIN_CSPI1_SS1__SS1, | ||
34 | MX31_PIN_CSPI1_SS2__SS2, | ||
35 | |||
36 | /* Reserve and hardwire GPIO 57 high - S6E63D6 chipselect */ | 27 | /* Reserve and hardwire GPIO 57 high - S6E63D6 chipselect */ |
37 | IOMUX_MODE(MX31_PIN_KEY_COL7, IOMUX_CONFIG_GPIO), | 28 | IOMUX_MODE(MX31_PIN_KEY_COL7, IOMUX_CONFIG_GPIO), |
38 | /* GPIO keys */ | 29 | /* GPIO keys */ |
diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c index 9c3fdcdf76c3..8ec2a132904d 100644 --- a/arch/arm/mach-omap2/board-2430sdp.c +++ b/arch/arm/mach-omap2/board-2430sdp.c | |||
@@ -141,7 +141,7 @@ static inline void board_smc91x_init(void) | |||
141 | 141 | ||
142 | static void __init omap_2430sdp_init_irq(void) | 142 | static void __init omap_2430sdp_init_irq(void) |
143 | { | 143 | { |
144 | omap2_init_common_hw(NULL); | 144 | omap2_init_common_hw(NULL, NULL); |
145 | omap_init_irq(); | 145 | omap_init_irq(); |
146 | omap_gpio_init(); | 146 | omap_gpio_init(); |
147 | } | 147 | } |
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c index 496a90e4ea7a..ac262cd74503 100644 --- a/arch/arm/mach-omap2/board-3430sdp.c +++ b/arch/arm/mach-omap2/board-3430sdp.c | |||
@@ -169,7 +169,7 @@ static struct platform_device *sdp3430_devices[] __initdata = { | |||
169 | 169 | ||
170 | static void __init omap_3430sdp_init_irq(void) | 170 | static void __init omap_3430sdp_init_irq(void) |
171 | { | 171 | { |
172 | omap2_init_common_hw(hyb18m512160af6_sdrc_params); | 172 | omap2_init_common_hw(hyb18m512160af6_sdrc_params, NULL); |
173 | omap_init_irq(); | 173 | omap_init_irq(); |
174 | omap_gpio_init(); | 174 | omap_gpio_init(); |
175 | } | 175 | } |
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index 57e477bd89c6..b0c7402248f7 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c | |||
@@ -59,7 +59,7 @@ static void __init gic_init_irq(void) | |||
59 | 59 | ||
60 | static void __init omap_4430sdp_init_irq(void) | 60 | static void __init omap_4430sdp_init_irq(void) |
61 | { | 61 | { |
62 | omap2_init_common_hw(NULL); | 62 | omap2_init_common_hw(NULL, NULL); |
63 | #ifdef CONFIG_OMAP_32K_TIMER | 63 | #ifdef CONFIG_OMAP_32K_TIMER |
64 | omap2_gp_clockevent_set_gptimer(1); | 64 | omap2_gp_clockevent_set_gptimer(1); |
65 | #endif | 65 | #endif |
diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c index 06dfba888b0c..dcfc20d03894 100644 --- a/arch/arm/mach-omap2/board-apollon.c +++ b/arch/arm/mach-omap2/board-apollon.c | |||
@@ -250,7 +250,7 @@ out: | |||
250 | 250 | ||
251 | static void __init omap_apollon_init_irq(void) | 251 | static void __init omap_apollon_init_irq(void) |
252 | { | 252 | { |
253 | omap2_init_common_hw(NULL); | 253 | omap2_init_common_hw(NULL, NULL); |
254 | omap_init_irq(); | 254 | omap_init_irq(); |
255 | omap_gpio_init(); | 255 | omap_gpio_init(); |
256 | apollon_init_smc91x(); | 256 | apollon_init_smc91x(); |
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index 3492162a65c3..fd00aa03690c 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c | |||
@@ -33,7 +33,7 @@ | |||
33 | 33 | ||
34 | static void __init omap_generic_init_irq(void) | 34 | static void __init omap_generic_init_irq(void) |
35 | { | 35 | { |
36 | omap2_init_common_hw(NULL); | 36 | omap2_init_common_hw(NULL, NULL); |
37 | omap_init_irq(); | 37 | omap_init_irq(); |
38 | } | 38 | } |
39 | 39 | ||
diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c index e7d017cdc438..7b1d61d5bb2c 100644 --- a/arch/arm/mach-omap2/board-h4.c +++ b/arch/arm/mach-omap2/board-h4.c | |||
@@ -270,7 +270,7 @@ static void __init h4_init_flash(void) | |||
270 | 270 | ||
271 | static void __init omap_h4_init_irq(void) | 271 | static void __init omap_h4_init_irq(void) |
272 | { | 272 | { |
273 | omap2_init_common_hw(NULL); | 273 | omap2_init_common_hw(NULL, NULL); |
274 | omap_init_irq(); | 274 | omap_init_irq(); |
275 | omap_gpio_init(); | 275 | omap_gpio_init(); |
276 | h4_init_flash(); | 276 | h4_init_flash(); |
diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c index d8bc0a7dcb8d..ea383f88cb1b 100644 --- a/arch/arm/mach-omap2/board-ldp.c +++ b/arch/arm/mach-omap2/board-ldp.c | |||
@@ -270,7 +270,7 @@ static inline void __init ldp_init_smsc911x(void) | |||
270 | 270 | ||
271 | static void __init omap_ldp_init_irq(void) | 271 | static void __init omap_ldp_init_irq(void) |
272 | { | 272 | { |
273 | omap2_init_common_hw(NULL); | 273 | omap2_init_common_hw(NULL, NULL); |
274 | omap_init_irq(); | 274 | omap_init_irq(); |
275 | omap_gpio_init(); | 275 | omap_gpio_init(); |
276 | ldp_init_smsc911x(); | 276 | ldp_init_smsc911x(); |
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c index 991ac9c38032..e00ba128cece 100644 --- a/arch/arm/mach-omap2/board-omap3beagle.c +++ b/arch/arm/mach-omap2/board-omap3beagle.c | |||
@@ -282,7 +282,8 @@ static int __init omap3_beagle_i2c_init(void) | |||
282 | 282 | ||
283 | static void __init omap3_beagle_init_irq(void) | 283 | static void __init omap3_beagle_init_irq(void) |
284 | { | 284 | { |
285 | omap2_init_common_hw(mt46h32m32lf6_sdrc_params); | 285 | omap2_init_common_hw(mt46h32m32lf6_sdrc_params, |
286 | mt46h32m32lf6_sdrc_params); | ||
286 | omap_init_irq(); | 287 | omap_init_irq(); |
287 | #ifdef CONFIG_OMAP_32K_TIMER | 288 | #ifdef CONFIG_OMAP_32K_TIMER |
288 | omap2_gp_clockevent_set_gptimer(12); | 289 | omap2_gp_clockevent_set_gptimer(12); |
@@ -408,6 +409,10 @@ static void __init omap3_beagle_init(void) | |||
408 | 409 | ||
409 | usb_musb_init(); | 410 | usb_musb_init(); |
410 | omap3beagle_flash_init(); | 411 | omap3beagle_flash_init(); |
412 | |||
413 | /* Ensure SDRC pins are mux'd for self-refresh */ | ||
414 | omap_cfg_reg(H16_34XX_SDRC_CKE0); | ||
415 | omap_cfg_reg(H17_34XX_SDRC_CKE1); | ||
411 | } | 416 | } |
412 | 417 | ||
413 | static void __init omap3_beagle_map_io(void) | 418 | static void __init omap3_beagle_map_io(void) |
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index cf3dd771a678..c4b144647dc5 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c | |||
@@ -280,7 +280,7 @@ struct spi_board_info omap3evm_spi_board_info[] = { | |||
280 | 280 | ||
281 | static void __init omap3_evm_init_irq(void) | 281 | static void __init omap3_evm_init_irq(void) |
282 | { | 282 | { |
283 | omap2_init_common_hw(mt46h32m32lf6_sdrc_params); | 283 | omap2_init_common_hw(mt46h32m32lf6_sdrc_params, NULL); |
284 | omap_init_irq(); | 284 | omap_init_irq(); |
285 | omap_gpio_init(); | 285 | omap_gpio_init(); |
286 | omap3evm_init_smc911x(); | 286 | omap3evm_init_smc911x(); |
diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c index e32aa23ce962..864ee3d021f7 100644 --- a/arch/arm/mach-omap2/board-omap3pandora.c +++ b/arch/arm/mach-omap2/board-omap3pandora.c | |||
@@ -40,6 +40,7 @@ | |||
40 | #include <mach/mcspi.h> | 40 | #include <mach/mcspi.h> |
41 | #include <mach/usb.h> | 41 | #include <mach/usb.h> |
42 | #include <mach/keypad.h> | 42 | #include <mach/keypad.h> |
43 | #include <mach/mux.h> | ||
43 | 44 | ||
44 | #include "sdram-micron-mt46h32m32lf-6.h" | 45 | #include "sdram-micron-mt46h32m32lf-6.h" |
45 | #include "mmc-twl4030.h" | 46 | #include "mmc-twl4030.h" |
@@ -310,7 +311,8 @@ static int __init omap3pandora_i2c_init(void) | |||
310 | 311 | ||
311 | static void __init omap3pandora_init_irq(void) | 312 | static void __init omap3pandora_init_irq(void) |
312 | { | 313 | { |
313 | omap2_init_common_hw(mt46h32m32lf6_sdrc_params); | 314 | omap2_init_common_hw(mt46h32m32lf6_sdrc_params, |
315 | mt46h32m32lf6_sdrc_params); | ||
314 | omap_init_irq(); | 316 | omap_init_irq(); |
315 | omap_gpio_init(); | 317 | omap_gpio_init(); |
316 | } | 318 | } |
@@ -397,6 +399,10 @@ static void __init omap3pandora_init(void) | |||
397 | omap3pandora_ads7846_init(); | 399 | omap3pandora_ads7846_init(); |
398 | pandora_keys_gpio_init(); | 400 | pandora_keys_gpio_init(); |
399 | usb_musb_init(); | 401 | usb_musb_init(); |
402 | |||
403 | /* Ensure SDRC pins are mux'd for self-refresh */ | ||
404 | omap_cfg_reg(H16_34XX_SDRC_CKE0); | ||
405 | omap_cfg_reg(H17_34XX_SDRC_CKE1); | ||
400 | } | 406 | } |
401 | 407 | ||
402 | static void __init omap3pandora_map_io(void) | 408 | static void __init omap3pandora_map_io(void) |
diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c index dff5528fbfb5..6bce23004aa4 100644 --- a/arch/arm/mach-omap2/board-overo.c +++ b/arch/arm/mach-omap2/board-overo.c | |||
@@ -44,6 +44,7 @@ | |||
44 | #include <mach/gpmc.h> | 44 | #include <mach/gpmc.h> |
45 | #include <mach/hardware.h> | 45 | #include <mach/hardware.h> |
46 | #include <mach/nand.h> | 46 | #include <mach/nand.h> |
47 | #include <mach/mux.h> | ||
47 | #include <mach/usb.h> | 48 | #include <mach/usb.h> |
48 | 49 | ||
49 | #include "sdram-micron-mt46h32m32lf-6.h" | 50 | #include "sdram-micron-mt46h32m32lf-6.h" |
@@ -51,6 +52,7 @@ | |||
51 | 52 | ||
52 | #define OVERO_GPIO_BT_XGATE 15 | 53 | #define OVERO_GPIO_BT_XGATE 15 |
53 | #define OVERO_GPIO_W2W_NRESET 16 | 54 | #define OVERO_GPIO_W2W_NRESET 16 |
55 | #define OVERO_GPIO_PENDOWN 114 | ||
54 | #define OVERO_GPIO_BT_NRESET 164 | 56 | #define OVERO_GPIO_BT_NRESET 164 |
55 | #define OVERO_GPIO_USBH_CPEN 168 | 57 | #define OVERO_GPIO_USBH_CPEN 168 |
56 | #define OVERO_GPIO_USBH_NRESET 183 | 58 | #define OVERO_GPIO_USBH_NRESET 183 |
@@ -146,7 +148,7 @@ static struct platform_device overo_smsc911x_device = { | |||
146 | .name = "smsc911x", | 148 | .name = "smsc911x", |
147 | .id = -1, | 149 | .id = -1, |
148 | .num_resources = ARRAY_SIZE(overo_smsc911x_resources), | 150 | .num_resources = ARRAY_SIZE(overo_smsc911x_resources), |
149 | .resource = &overo_smsc911x_resources, | 151 | .resource = overo_smsc911x_resources, |
150 | .dev = { | 152 | .dev = { |
151 | .platform_data = &overo_smsc911x_config, | 153 | .platform_data = &overo_smsc911x_config, |
152 | }, | 154 | }, |
@@ -360,7 +362,8 @@ static int __init overo_i2c_init(void) | |||
360 | 362 | ||
361 | static void __init overo_init_irq(void) | 363 | static void __init overo_init_irq(void) |
362 | { | 364 | { |
363 | omap2_init_common_hw(mt46h32m32lf6_sdrc_params); | 365 | omap2_init_common_hw(mt46h32m32lf6_sdrc_params, |
366 | mt46h32m32lf6_sdrc_params); | ||
364 | omap_init_irq(); | 367 | omap_init_irq(); |
365 | omap_gpio_init(); | 368 | omap_gpio_init(); |
366 | } | 369 | } |
@@ -395,6 +398,10 @@ static void __init overo_init(void) | |||
395 | overo_ads7846_init(); | 398 | overo_ads7846_init(); |
396 | overo_init_smsc911x(); | 399 | overo_init_smsc911x(); |
397 | 400 | ||
401 | /* Ensure SDRC pins are mux'd for self-refresh */ | ||
402 | omap_cfg_reg(H16_34XX_SDRC_CKE0); | ||
403 | omap_cfg_reg(H17_34XX_SDRC_CKE1); | ||
404 | |||
398 | if ((gpio_request(OVERO_GPIO_W2W_NRESET, | 405 | if ((gpio_request(OVERO_GPIO_W2W_NRESET, |
399 | "OVERO_GPIO_W2W_NRESET") == 0) && | 406 | "OVERO_GPIO_W2W_NRESET") == 0) && |
400 | (gpio_direction_output(OVERO_GPIO_W2W_NRESET, 1) == 0)) { | 407 | (gpio_direction_output(OVERO_GPIO_W2W_NRESET, 1) == 0)) { |
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c index 9a0bf6744a05..56d931a425f7 100644 --- a/arch/arm/mach-omap2/board-rx51-peripherals.c +++ b/arch/arm/mach-omap2/board-rx51-peripherals.c | |||
@@ -278,6 +278,10 @@ static struct twl4030_gpio_platform_data rx51_gpio_data = { | |||
278 | .setup = rx51_twlgpio_setup, | 278 | .setup = rx51_twlgpio_setup, |
279 | }; | 279 | }; |
280 | 280 | ||
281 | static struct twl4030_usb_data rx51_usb_data = { | ||
282 | .usb_mode = T2_USB_MODE_ULPI, | ||
283 | }; | ||
284 | |||
281 | static struct twl4030_platform_data rx51_twldata = { | 285 | static struct twl4030_platform_data rx51_twldata = { |
282 | .irq_base = TWL4030_IRQ_BASE, | 286 | .irq_base = TWL4030_IRQ_BASE, |
283 | .irq_end = TWL4030_IRQ_END, | 287 | .irq_end = TWL4030_IRQ_END, |
@@ -286,6 +290,7 @@ static struct twl4030_platform_data rx51_twldata = { | |||
286 | .gpio = &rx51_gpio_data, | 290 | .gpio = &rx51_gpio_data, |
287 | .keypad = &rx51_kp_data, | 291 | .keypad = &rx51_kp_data, |
288 | .madc = &rx51_madc_data, | 292 | .madc = &rx51_madc_data, |
293 | .usb = &rx51_usb_data, | ||
289 | 294 | ||
290 | .vaux1 = &rx51_vaux1, | 295 | .vaux1 = &rx51_vaux1, |
291 | .vaux2 = &rx51_vaux2, | 296 | .vaux2 = &rx51_vaux2, |
diff --git a/arch/arm/mach-omap2/board-rx51.c b/arch/arm/mach-omap2/board-rx51.c index 374ff63c3eb2..1c9e07fe8266 100644 --- a/arch/arm/mach-omap2/board-rx51.c +++ b/arch/arm/mach-omap2/board-rx51.c | |||
@@ -61,7 +61,7 @@ static struct omap_board_config_kernel rx51_config[] = { | |||
61 | 61 | ||
62 | static void __init rx51_init_irq(void) | 62 | static void __init rx51_init_irq(void) |
63 | { | 63 | { |
64 | omap2_init_common_hw(NULL); | 64 | omap2_init_common_hw(NULL, NULL); |
65 | omap_init_irq(); | 65 | omap_init_irq(); |
66 | omap_gpio_init(); | 66 | omap_gpio_init(); |
67 | } | 67 | } |
@@ -75,6 +75,10 @@ static void __init rx51_init(void) | |||
75 | omap_serial_init(); | 75 | omap_serial_init(); |
76 | usb_musb_init(); | 76 | usb_musb_init(); |
77 | rx51_peripherals_init(); | 77 | rx51_peripherals_init(); |
78 | |||
79 | /* Ensure SDRC pins are mux'd for self-refresh */ | ||
80 | omap_cfg_reg(H16_34XX_SDRC_CKE0); | ||
81 | omap_cfg_reg(H17_34XX_SDRC_CKE1); | ||
78 | } | 82 | } |
79 | 83 | ||
80 | static void __init rx51_map_io(void) | 84 | static void __init rx51_map_io(void) |
diff --git a/arch/arm/mach-omap2/board-zoom2.c b/arch/arm/mach-omap2/board-zoom2.c index bcc0f7632dea..427b7b8b1237 100644 --- a/arch/arm/mach-omap2/board-zoom2.c +++ b/arch/arm/mach-omap2/board-zoom2.c | |||
@@ -25,7 +25,7 @@ | |||
25 | 25 | ||
26 | static void __init omap_zoom2_init_irq(void) | 26 | static void __init omap_zoom2_init_irq(void) |
27 | { | 27 | { |
28 | omap2_init_common_hw(NULL); | 28 | omap2_init_common_hw(NULL, NULL); |
29 | omap_init_irq(); | 29 | omap_init_irq(); |
30 | omap_gpio_init(); | 30 | omap_gpio_init(); |
31 | } | 31 | } |
diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c index b0665f161c03..456e2ad5f621 100644 --- a/arch/arm/mach-omap2/clock.c +++ b/arch/arm/mach-omap2/clock.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <mach/clock.h> | 27 | #include <mach/clock.h> |
28 | #include <mach/clockdomain.h> | 28 | #include <mach/clockdomain.h> |
29 | #include <mach/cpu.h> | 29 | #include <mach/cpu.h> |
30 | #include <mach/prcm.h> | ||
30 | #include <asm/div64.h> | 31 | #include <asm/div64.h> |
31 | 32 | ||
32 | #include <mach/sdrc.h> | 33 | #include <mach/sdrc.h> |
@@ -38,8 +39,6 @@ | |||
38 | #include "cm-regbits-24xx.h" | 39 | #include "cm-regbits-24xx.h" |
39 | #include "cm-regbits-34xx.h" | 40 | #include "cm-regbits-34xx.h" |
40 | 41 | ||
41 | #define MAX_CLOCK_ENABLE_WAIT 100000 | ||
42 | |||
43 | /* DPLL rate rounding: minimum DPLL multiplier, divider values */ | 42 | /* DPLL rate rounding: minimum DPLL multiplier, divider values */ |
44 | #define DPLL_MIN_MULTIPLIER 1 | 43 | #define DPLL_MIN_MULTIPLIER 1 |
45 | #define DPLL_MIN_DIVIDER 1 | 44 | #define DPLL_MIN_DIVIDER 1 |
@@ -274,83 +273,97 @@ unsigned long omap2_fixed_divisor_recalc(struct clk *clk) | |||
274 | } | 273 | } |
275 | 274 | ||
276 | /** | 275 | /** |
277 | * omap2_wait_clock_ready - wait for clock to enable | 276 | * omap2_clk_dflt_find_companion - find companion clock to @clk |
278 | * @reg: physical address of clock IDLEST register | 277 | * @clk: struct clk * to find the companion clock of |
279 | * @mask: value to mask against to determine if the clock is active | 278 | * @other_reg: void __iomem ** to return the companion clock CM_*CLKEN va in |
280 | * @name: name of the clock (for printk) | 279 | * @other_bit: u8 ** to return the companion clock bit shift in |
280 | * | ||
281 | * Note: We don't need special code here for INVERT_ENABLE for the | ||
282 | * time being since INVERT_ENABLE only applies to clocks enabled by | ||
283 | * CM_CLKEN_PLL | ||
281 | * | 284 | * |
282 | * Returns 1 if the clock enabled in time, or 0 if it failed to enable | 285 | * Convert CM_ICLKEN* <-> CM_FCLKEN*. This conversion assumes it's |
283 | * in roughly MAX_CLOCK_ENABLE_WAIT microseconds. | 286 | * just a matter of XORing the bits. |
287 | * | ||
288 | * Some clocks don't have companion clocks. For example, modules with | ||
289 | * only an interface clock (such as MAILBOXES) don't have a companion | ||
290 | * clock. Right now, this code relies on the hardware exporting a bit | ||
291 | * in the correct companion register that indicates that the | ||
292 | * nonexistent 'companion clock' is active. Future patches will | ||
293 | * associate this type of code with per-module data structures to | ||
294 | * avoid this issue, and remove the casts. No return value. | ||
284 | */ | 295 | */ |
285 | int omap2_wait_clock_ready(void __iomem *reg, u32 mask, const char *name) | 296 | void omap2_clk_dflt_find_companion(struct clk *clk, void __iomem **other_reg, |
297 | u8 *other_bit) | ||
286 | { | 298 | { |
287 | int i = 0; | 299 | u32 r; |
288 | int ena = 0; | ||
289 | 300 | ||
290 | /* | 301 | /* |
291 | * 24xx uses 0 to indicate not ready, and 1 to indicate ready. | 302 | * Convert CM_ICLKEN* <-> CM_FCLKEN*. This conversion assumes |
292 | * 34xx reverses this, just to keep us on our toes | 303 | * it's just a matter of XORing the bits. |
293 | */ | 304 | */ |
294 | if (cpu_mask & (RATE_IN_242X | RATE_IN_243X)) | 305 | r = ((__force u32)clk->enable_reg ^ (CM_FCLKEN ^ CM_ICLKEN)); |
295 | ena = mask; | ||
296 | else if (cpu_mask & RATE_IN_343X) | ||
297 | ena = 0; | ||
298 | |||
299 | /* Wait for lock */ | ||
300 | while (((__raw_readl(reg) & mask) != ena) && | ||
301 | (i++ < MAX_CLOCK_ENABLE_WAIT)) { | ||
302 | udelay(1); | ||
303 | } | ||
304 | |||
305 | if (i <= MAX_CLOCK_ENABLE_WAIT) | ||
306 | pr_debug("Clock %s stable after %d loops\n", name, i); | ||
307 | else | ||
308 | printk(KERN_ERR "Clock %s didn't enable in %d tries\n", | ||
309 | name, MAX_CLOCK_ENABLE_WAIT); | ||
310 | |||
311 | |||
312 | return (i < MAX_CLOCK_ENABLE_WAIT) ? 1 : 0; | ||
313 | }; | ||
314 | 306 | ||
307 | *other_reg = (__force void __iomem *)r; | ||
308 | *other_bit = clk->enable_bit; | ||
309 | } | ||
315 | 310 | ||
316 | /* | 311 | /** |
317 | * Note: We don't need special code here for INVERT_ENABLE | 312 | * omap2_clk_dflt_find_idlest - find CM_IDLEST reg va, bit shift for @clk |
318 | * for the time being since INVERT_ENABLE only applies to clocks enabled by | 313 | * @clk: struct clk * to find IDLEST info for |
319 | * CM_CLKEN_PLL | 314 | * @idlest_reg: void __iomem ** to return the CM_IDLEST va in |
315 | * @idlest_bit: u8 ** to return the CM_IDLEST bit shift in | ||
316 | * | ||
317 | * Return the CM_IDLEST register address and bit shift corresponding | ||
318 | * to the module that "owns" this clock. This default code assumes | ||
319 | * that the CM_IDLEST bit shift is the CM_*CLKEN bit shift, and that | ||
320 | * the IDLEST register address ID corresponds to the CM_*CLKEN | ||
321 | * register address ID (e.g., that CM_FCLKEN2 corresponds to | ||
322 | * CM_IDLEST2). This is not true for all modules. No return value. | ||
320 | */ | 323 | */ |
321 | static void omap2_clk_wait_ready(struct clk *clk) | 324 | void omap2_clk_dflt_find_idlest(struct clk *clk, void __iomem **idlest_reg, |
325 | u8 *idlest_bit) | ||
322 | { | 326 | { |
323 | void __iomem *reg, *other_reg, *st_reg; | 327 | u32 r; |
324 | u32 bit; | ||
325 | 328 | ||
326 | /* | 329 | r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); |
327 | * REVISIT: This code is pretty ugly. It would be nice to generalize | 330 | *idlest_reg = (__force void __iomem *)r; |
328 | * it and pull it into struct clk itself somehow. | 331 | *idlest_bit = clk->enable_bit; |
329 | */ | 332 | } |
330 | reg = clk->enable_reg; | ||
331 | 333 | ||
332 | /* | 334 | /** |
333 | * Convert CM_ICLKEN* <-> CM_FCLKEN*. This conversion assumes | 335 | * omap2_module_wait_ready - wait for an OMAP module to leave IDLE |
334 | * it's just a matter of XORing the bits. | 336 | * @clk: struct clk * belonging to the module |
335 | */ | 337 | * |
336 | other_reg = (void __iomem *)((u32)reg ^ (CM_FCLKEN ^ CM_ICLKEN)); | 338 | * If the necessary clocks for the OMAP hardware IP block that |
339 | * corresponds to clock @clk are enabled, then wait for the module to | ||
340 | * indicate readiness (i.e., to leave IDLE). This code does not | ||
341 | * belong in the clock code and will be moved in the medium term to | ||
342 | * module-dependent code. No return value. | ||
343 | */ | ||
344 | static void omap2_module_wait_ready(struct clk *clk) | ||
345 | { | ||
346 | void __iomem *companion_reg, *idlest_reg; | ||
347 | u8 other_bit, idlest_bit; | ||
348 | |||
349 | /* Not all modules have multiple clocks that their IDLEST depends on */ | ||
350 | if (clk->ops->find_companion) { | ||
351 | clk->ops->find_companion(clk, &companion_reg, &other_bit); | ||
352 | if (!(__raw_readl(companion_reg) & (1 << other_bit))) | ||
353 | return; | ||
354 | } | ||
337 | 355 | ||
338 | /* Check if both functional and interface clocks | 356 | clk->ops->find_idlest(clk, &idlest_reg, &idlest_bit); |
339 | * are running. */ | ||
340 | bit = 1 << clk->enable_bit; | ||
341 | if (!(__raw_readl(other_reg) & bit)) | ||
342 | return; | ||
343 | st_reg = (void __iomem *)(((u32)other_reg & ~0xf0) | 0x20); /* CM_IDLEST* */ | ||
344 | 357 | ||
345 | omap2_wait_clock_ready(st_reg, bit, clk->name); | 358 | omap2_cm_wait_idlest(idlest_reg, (1 << idlest_bit), clk->name); |
346 | } | 359 | } |
347 | 360 | ||
348 | static int omap2_dflt_clk_enable(struct clk *clk) | 361 | int omap2_dflt_clk_enable(struct clk *clk) |
349 | { | 362 | { |
350 | u32 v; | 363 | u32 v; |
351 | 364 | ||
352 | if (unlikely(clk->enable_reg == NULL)) { | 365 | if (unlikely(clk->enable_reg == NULL)) { |
353 | printk(KERN_ERR "clock.c: Enable for %s without enable code\n", | 366 | pr_err("clock.c: Enable for %s without enable code\n", |
354 | clk->name); | 367 | clk->name); |
355 | return 0; /* REVISIT: -EINVAL */ | 368 | return 0; /* REVISIT: -EINVAL */ |
356 | } | 369 | } |
@@ -363,26 +376,13 @@ static int omap2_dflt_clk_enable(struct clk *clk) | |||
363 | __raw_writel(v, clk->enable_reg); | 376 | __raw_writel(v, clk->enable_reg); |
364 | v = __raw_readl(clk->enable_reg); /* OCP barrier */ | 377 | v = __raw_readl(clk->enable_reg); /* OCP barrier */ |
365 | 378 | ||
366 | return 0; | 379 | if (clk->ops->find_idlest) |
367 | } | 380 | omap2_module_wait_ready(clk); |
368 | 381 | ||
369 | static int omap2_dflt_clk_enable_wait(struct clk *clk) | 382 | return 0; |
370 | { | ||
371 | int ret; | ||
372 | |||
373 | if (!clk->enable_reg) { | ||
374 | printk(KERN_ERR "clock.c: Enable for %s without enable code\n", | ||
375 | clk->name); | ||
376 | return 0; /* REVISIT: -EINVAL */ | ||
377 | } | ||
378 | |||
379 | ret = omap2_dflt_clk_enable(clk); | ||
380 | if (ret == 0) | ||
381 | omap2_clk_wait_ready(clk); | ||
382 | return ret; | ||
383 | } | 383 | } |
384 | 384 | ||
385 | static void omap2_dflt_clk_disable(struct clk *clk) | 385 | void omap2_dflt_clk_disable(struct clk *clk) |
386 | { | 386 | { |
387 | u32 v; | 387 | u32 v; |
388 | 388 | ||
@@ -406,8 +406,10 @@ static void omap2_dflt_clk_disable(struct clk *clk) | |||
406 | } | 406 | } |
407 | 407 | ||
408 | const struct clkops clkops_omap2_dflt_wait = { | 408 | const struct clkops clkops_omap2_dflt_wait = { |
409 | .enable = omap2_dflt_clk_enable_wait, | 409 | .enable = omap2_dflt_clk_enable, |
410 | .disable = omap2_dflt_clk_disable, | 410 | .disable = omap2_dflt_clk_disable, |
411 | .find_companion = omap2_clk_dflt_find_companion, | ||
412 | .find_idlest = omap2_clk_dflt_find_idlest, | ||
411 | }; | 413 | }; |
412 | 414 | ||
413 | const struct clkops clkops_omap2_dflt = { | 415 | const struct clkops clkops_omap2_dflt = { |
diff --git a/arch/arm/mach-omap2/clock.h b/arch/arm/mach-omap2/clock.h index 2679ddfa6424..9ae7540f8af2 100644 --- a/arch/arm/mach-omap2/clock.h +++ b/arch/arm/mach-omap2/clock.h | |||
@@ -65,6 +65,12 @@ int omap2_clksel_set_rate(struct clk *clk, unsigned long rate); | |||
65 | u32 omap2_get_dpll_rate(struct clk *clk); | 65 | u32 omap2_get_dpll_rate(struct clk *clk); |
66 | int omap2_wait_clock_ready(void __iomem *reg, u32 cval, const char *name); | 66 | int omap2_wait_clock_ready(void __iomem *reg, u32 cval, const char *name); |
67 | void omap2_clk_prepare_for_reboot(void); | 67 | void omap2_clk_prepare_for_reboot(void); |
68 | int omap2_dflt_clk_enable(struct clk *clk); | ||
69 | void omap2_dflt_clk_disable(struct clk *clk); | ||
70 | void omap2_clk_dflt_find_companion(struct clk *clk, void __iomem **other_reg, | ||
71 | u8 *other_bit); | ||
72 | void omap2_clk_dflt_find_idlest(struct clk *clk, void __iomem **idlest_reg, | ||
73 | u8 *idlest_bit); | ||
68 | 74 | ||
69 | extern const struct clkops clkops_omap2_dflt_wait; | 75 | extern const struct clkops clkops_omap2_dflt_wait; |
70 | extern const struct clkops clkops_omap2_dflt; | 76 | extern const struct clkops clkops_omap2_dflt; |
diff --git a/arch/arm/mach-omap2/clock24xx.c b/arch/arm/mach-omap2/clock24xx.c index 44de0271fc2f..bc5d3ac66611 100644 --- a/arch/arm/mach-omap2/clock24xx.c +++ b/arch/arm/mach-omap2/clock24xx.c | |||
@@ -30,6 +30,7 @@ | |||
30 | 30 | ||
31 | #include <mach/clock.h> | 31 | #include <mach/clock.h> |
32 | #include <mach/sram.h> | 32 | #include <mach/sram.h> |
33 | #include <mach/prcm.h> | ||
33 | #include <asm/div64.h> | 34 | #include <asm/div64.h> |
34 | #include <asm/clkdev.h> | 35 | #include <asm/clkdev.h> |
35 | 36 | ||
@@ -43,6 +44,18 @@ | |||
43 | static const struct clkops clkops_oscck; | 44 | static const struct clkops clkops_oscck; |
44 | static const struct clkops clkops_fixed; | 45 | static const struct clkops clkops_fixed; |
45 | 46 | ||
47 | static void omap2430_clk_i2chs_find_idlest(struct clk *clk, | ||
48 | void __iomem **idlest_reg, | ||
49 | u8 *idlest_bit); | ||
50 | |||
51 | /* 2430 I2CHS has non-standard IDLEST register */ | ||
52 | static const struct clkops clkops_omap2430_i2chs_wait = { | ||
53 | .enable = omap2_dflt_clk_enable, | ||
54 | .disable = omap2_dflt_clk_disable, | ||
55 | .find_idlest = omap2430_clk_i2chs_find_idlest, | ||
56 | .find_companion = omap2_clk_dflt_find_companion, | ||
57 | }; | ||
58 | |||
46 | #include "clock24xx.h" | 59 | #include "clock24xx.h" |
47 | 60 | ||
48 | struct omap_clk { | 61 | struct omap_clk { |
@@ -240,6 +253,26 @@ static void __iomem *prcm_clksrc_ctrl; | |||
240 | *-------------------------------------------------------------------------*/ | 253 | *-------------------------------------------------------------------------*/ |
241 | 254 | ||
242 | /** | 255 | /** |
256 | * omap2430_clk_i2chs_find_idlest - return CM_IDLEST info for 2430 I2CHS | ||
257 | * @clk: struct clk * being enabled | ||
258 | * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into | ||
259 | * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into | ||
260 | * | ||
261 | * OMAP2430 I2CHS CM_IDLEST bits are in CM_IDLEST1_CORE, but the | ||
262 | * CM_*CLKEN bits are in CM_{I,F}CLKEN2_CORE. This custom function | ||
263 | * passes back the correct CM_IDLEST register address for I2CHS | ||
264 | * modules. No return value. | ||
265 | */ | ||
266 | static void omap2430_clk_i2chs_find_idlest(struct clk *clk, | ||
267 | void __iomem **idlest_reg, | ||
268 | u8 *idlest_bit) | ||
269 | { | ||
270 | *idlest_reg = OMAP_CM_REGADDR(CORE_MOD, CM_IDLEST); | ||
271 | *idlest_bit = clk->enable_bit; | ||
272 | } | ||
273 | |||
274 | |||
275 | /** | ||
243 | * omap2xxx_clk_get_core_rate - return the CORE_CLK rate | 276 | * omap2xxx_clk_get_core_rate - return the CORE_CLK rate |
244 | * @clk: pointer to the combined dpll_ck + core_ck (currently "dpll_ck") | 277 | * @clk: pointer to the combined dpll_ck + core_ck (currently "dpll_ck") |
245 | * | 278 | * |
@@ -325,8 +358,8 @@ static int omap2_clk_fixed_enable(struct clk *clk) | |||
325 | else if (clk == &apll54_ck) | 358 | else if (clk == &apll54_ck) |
326 | cval = OMAP24XX_ST_54M_APLL; | 359 | cval = OMAP24XX_ST_54M_APLL; |
327 | 360 | ||
328 | omap2_wait_clock_ready(OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), cval, | 361 | omap2_cm_wait_idlest(OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), cval, |
329 | clk->name); | 362 | clk->name); |
330 | 363 | ||
331 | /* | 364 | /* |
332 | * REVISIT: Should we return an error code if omap2_wait_clock_ready() | 365 | * REVISIT: Should we return an error code if omap2_wait_clock_ready() |
diff --git a/arch/arm/mach-omap2/clock24xx.h b/arch/arm/mach-omap2/clock24xx.h index 458f00cdcbea..d19cf7a7d8db 100644 --- a/arch/arm/mach-omap2/clock24xx.h +++ b/arch/arm/mach-omap2/clock24xx.h | |||
@@ -2337,7 +2337,7 @@ static struct clk i2c2_fck = { | |||
2337 | 2337 | ||
2338 | static struct clk i2chs2_fck = { | 2338 | static struct clk i2chs2_fck = { |
2339 | .name = "i2c_fck", | 2339 | .name = "i2c_fck", |
2340 | .ops = &clkops_omap2_dflt_wait, | 2340 | .ops = &clkops_omap2430_i2chs_wait, |
2341 | .id = 2, | 2341 | .id = 2, |
2342 | .parent = &func_96m_ck, | 2342 | .parent = &func_96m_ck, |
2343 | .clkdm_name = "core_l4_clkdm", | 2343 | .clkdm_name = "core_l4_clkdm", |
@@ -2370,7 +2370,7 @@ static struct clk i2c1_fck = { | |||
2370 | 2370 | ||
2371 | static struct clk i2chs1_fck = { | 2371 | static struct clk i2chs1_fck = { |
2372 | .name = "i2c_fck", | 2372 | .name = "i2c_fck", |
2373 | .ops = &clkops_omap2_dflt_wait, | 2373 | .ops = &clkops_omap2430_i2chs_wait, |
2374 | .id = 1, | 2374 | .id = 1, |
2375 | .parent = &func_96m_ck, | 2375 | .parent = &func_96m_ck, |
2376 | .clkdm_name = "core_l4_clkdm", | 2376 | .clkdm_name = "core_l4_clkdm", |
diff --git a/arch/arm/mach-omap2/clock34xx.c b/arch/arm/mach-omap2/clock34xx.c index 045da923e75b..cd7819cc0c9e 100644 --- a/arch/arm/mach-omap2/clock34xx.c +++ b/arch/arm/mach-omap2/clock34xx.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * OMAP3-specific clock framework functions | 2 | * OMAP3-specific clock framework functions |
3 | * | 3 | * |
4 | * Copyright (C) 2007-2008 Texas Instruments, Inc. | 4 | * Copyright (C) 2007-2008 Texas Instruments, Inc. |
5 | * Copyright (C) 2007-2008 Nokia Corporation | 5 | * Copyright (C) 2007-2009 Nokia Corporation |
6 | * | 6 | * |
7 | * Written by Paul Walmsley | 7 | * Written by Paul Walmsley |
8 | * Testing and integration fixes by Jouni Högander | 8 | * Testing and integration fixes by Jouni Högander |
@@ -41,6 +41,37 @@ | |||
41 | 41 | ||
42 | static const struct clkops clkops_noncore_dpll_ops; | 42 | static const struct clkops clkops_noncore_dpll_ops; |
43 | 43 | ||
44 | static void omap3430es2_clk_ssi_find_idlest(struct clk *clk, | ||
45 | void __iomem **idlest_reg, | ||
46 | u8 *idlest_bit); | ||
47 | static void omap3430es2_clk_hsotgusb_find_idlest(struct clk *clk, | ||
48 | void __iomem **idlest_reg, | ||
49 | u8 *idlest_bit); | ||
50 | static void omap3430es2_clk_dss_usbhost_find_idlest(struct clk *clk, | ||
51 | void __iomem **idlest_reg, | ||
52 | u8 *idlest_bit); | ||
53 | |||
54 | static const struct clkops clkops_omap3430es2_ssi_wait = { | ||
55 | .enable = omap2_dflt_clk_enable, | ||
56 | .disable = omap2_dflt_clk_disable, | ||
57 | .find_idlest = omap3430es2_clk_ssi_find_idlest, | ||
58 | .find_companion = omap2_clk_dflt_find_companion, | ||
59 | }; | ||
60 | |||
61 | static const struct clkops clkops_omap3430es2_hsotgusb_wait = { | ||
62 | .enable = omap2_dflt_clk_enable, | ||
63 | .disable = omap2_dflt_clk_disable, | ||
64 | .find_idlest = omap3430es2_clk_hsotgusb_find_idlest, | ||
65 | .find_companion = omap2_clk_dflt_find_companion, | ||
66 | }; | ||
67 | |||
68 | static const struct clkops clkops_omap3430es2_dss_usbhost_wait = { | ||
69 | .enable = omap2_dflt_clk_enable, | ||
70 | .disable = omap2_dflt_clk_disable, | ||
71 | .find_idlest = omap3430es2_clk_dss_usbhost_find_idlest, | ||
72 | .find_companion = omap2_clk_dflt_find_companion, | ||
73 | }; | ||
74 | |||
44 | #include "clock34xx.h" | 75 | #include "clock34xx.h" |
45 | 76 | ||
46 | struct omap_clk { | 77 | struct omap_clk { |
@@ -157,10 +188,13 @@ static struct omap_clk omap34xx_clks[] = { | |||
157 | CLK(NULL, "fshostusb_fck", &fshostusb_fck, CK_3430ES1), | 188 | CLK(NULL, "fshostusb_fck", &fshostusb_fck, CK_3430ES1), |
158 | CLK(NULL, "core_12m_fck", &core_12m_fck, CK_343X), | 189 | CLK(NULL, "core_12m_fck", &core_12m_fck, CK_343X), |
159 | CLK("omap_hdq.0", "fck", &hdq_fck, CK_343X), | 190 | CLK("omap_hdq.0", "fck", &hdq_fck, CK_343X), |
160 | CLK(NULL, "ssi_ssr_fck", &ssi_ssr_fck, CK_343X), | 191 | CLK(NULL, "ssi_ssr_fck", &ssi_ssr_fck_3430es1, CK_3430ES1), |
161 | CLK(NULL, "ssi_sst_fck", &ssi_sst_fck, CK_343X), | 192 | CLK(NULL, "ssi_ssr_fck", &ssi_ssr_fck_3430es2, CK_3430ES2), |
193 | CLK(NULL, "ssi_sst_fck", &ssi_sst_fck_3430es1, CK_3430ES1), | ||
194 | CLK(NULL, "ssi_sst_fck", &ssi_sst_fck_3430es2, CK_3430ES2), | ||
162 | CLK(NULL, "core_l3_ick", &core_l3_ick, CK_343X), | 195 | CLK(NULL, "core_l3_ick", &core_l3_ick, CK_343X), |
163 | CLK("musb_hdrc", "ick", &hsotgusb_ick, CK_343X), | 196 | CLK("musb_hdrc", "ick", &hsotgusb_ick_3430es1, CK_3430ES1), |
197 | CLK("musb_hdrc", "ick", &hsotgusb_ick_3430es2, CK_3430ES2), | ||
164 | CLK(NULL, "sdrc_ick", &sdrc_ick, CK_343X), | 198 | CLK(NULL, "sdrc_ick", &sdrc_ick, CK_343X), |
165 | CLK(NULL, "gpmc_fck", &gpmc_fck, CK_343X), | 199 | CLK(NULL, "gpmc_fck", &gpmc_fck, CK_343X), |
166 | CLK(NULL, "security_l3_ick", &security_l3_ick, CK_343X), | 200 | CLK(NULL, "security_l3_ick", &security_l3_ick, CK_343X), |
@@ -193,18 +227,21 @@ static struct omap_clk omap34xx_clks[] = { | |||
193 | CLK(NULL, "mailboxes_ick", &mailboxes_ick, CK_343X), | 227 | CLK(NULL, "mailboxes_ick", &mailboxes_ick, CK_343X), |
194 | CLK(NULL, "omapctrl_ick", &omapctrl_ick, CK_343X), | 228 | CLK(NULL, "omapctrl_ick", &omapctrl_ick, CK_343X), |
195 | CLK(NULL, "ssi_l4_ick", &ssi_l4_ick, CK_343X), | 229 | CLK(NULL, "ssi_l4_ick", &ssi_l4_ick, CK_343X), |
196 | CLK(NULL, "ssi_ick", &ssi_ick, CK_343X), | 230 | CLK(NULL, "ssi_ick", &ssi_ick_3430es1, CK_3430ES1), |
231 | CLK(NULL, "ssi_ick", &ssi_ick_3430es2, CK_3430ES2), | ||
197 | CLK(NULL, "usb_l4_ick", &usb_l4_ick, CK_3430ES1), | 232 | CLK(NULL, "usb_l4_ick", &usb_l4_ick, CK_3430ES1), |
198 | CLK(NULL, "security_l4_ick2", &security_l4_ick2, CK_343X), | 233 | CLK(NULL, "security_l4_ick2", &security_l4_ick2, CK_343X), |
199 | CLK(NULL, "aes1_ick", &aes1_ick, CK_343X), | 234 | CLK(NULL, "aes1_ick", &aes1_ick, CK_343X), |
200 | CLK("omap_rng", "ick", &rng_ick, CK_343X), | 235 | CLK("omap_rng", "ick", &rng_ick, CK_343X), |
201 | CLK(NULL, "sha11_ick", &sha11_ick, CK_343X), | 236 | CLK(NULL, "sha11_ick", &sha11_ick, CK_343X), |
202 | CLK(NULL, "des1_ick", &des1_ick, CK_343X), | 237 | CLK(NULL, "des1_ick", &des1_ick, CK_343X), |
203 | CLK("omapfb", "dss1_fck", &dss1_alwon_fck, CK_343X), | 238 | CLK("omapfb", "dss1_fck", &dss1_alwon_fck_3430es1, CK_3430ES1), |
239 | CLK("omapfb", "dss1_fck", &dss1_alwon_fck_3430es2, CK_3430ES2), | ||
204 | CLK("omapfb", "tv_fck", &dss_tv_fck, CK_343X), | 240 | CLK("omapfb", "tv_fck", &dss_tv_fck, CK_343X), |
205 | CLK("omapfb", "video_fck", &dss_96m_fck, CK_343X), | 241 | CLK("omapfb", "video_fck", &dss_96m_fck, CK_343X), |
206 | CLK("omapfb", "dss2_fck", &dss2_alwon_fck, CK_343X), | 242 | CLK("omapfb", "dss2_fck", &dss2_alwon_fck, CK_343X), |
207 | CLK("omapfb", "ick", &dss_ick, CK_343X), | 243 | CLK("omapfb", "ick", &dss_ick_3430es1, CK_3430ES1), |
244 | CLK("omapfb", "ick", &dss_ick_3430es2, CK_3430ES2), | ||
208 | CLK(NULL, "cam_mclk", &cam_mclk, CK_343X), | 245 | CLK(NULL, "cam_mclk", &cam_mclk, CK_343X), |
209 | CLK(NULL, "cam_ick", &cam_ick, CK_343X), | 246 | CLK(NULL, "cam_ick", &cam_ick, CK_343X), |
210 | CLK(NULL, "csi2_96m_fck", &csi2_96m_fck, CK_343X), | 247 | CLK(NULL, "csi2_96m_fck", &csi2_96m_fck, CK_343X), |
@@ -301,6 +338,73 @@ static struct omap_clk omap34xx_clks[] = { | |||
301 | #define SDRC_MPURATE_LOOPS 96 | 338 | #define SDRC_MPURATE_LOOPS 96 |
302 | 339 | ||
303 | /** | 340 | /** |
341 | * omap3430es2_clk_ssi_find_idlest - return CM_IDLEST info for SSI | ||
342 | * @clk: struct clk * being enabled | ||
343 | * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into | ||
344 | * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into | ||
345 | * | ||
346 | * The OMAP3430ES2 SSI target CM_IDLEST bit is at a different shift | ||
347 | * from the CM_{I,F}CLKEN bit. Pass back the correct info via | ||
348 | * @idlest_reg and @idlest_bit. No return value. | ||
349 | */ | ||
350 | static void omap3430es2_clk_ssi_find_idlest(struct clk *clk, | ||
351 | void __iomem **idlest_reg, | ||
352 | u8 *idlest_bit) | ||
353 | { | ||
354 | u32 r; | ||
355 | |||
356 | r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); | ||
357 | *idlest_reg = (__force void __iomem *)r; | ||
358 | *idlest_bit = OMAP3430ES2_ST_SSI_IDLE_SHIFT; | ||
359 | } | ||
360 | |||
361 | /** | ||
362 | * omap3430es2_clk_dss_usbhost_find_idlest - CM_IDLEST info for DSS, USBHOST | ||
363 | * @clk: struct clk * being enabled | ||
364 | * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into | ||
365 | * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into | ||
366 | * | ||
367 | * Some OMAP modules on OMAP3 ES2+ chips have both initiator and | ||
368 | * target IDLEST bits. For our purposes, we are concerned with the | ||
369 | * target IDLEST bits, which exist at a different bit position than | ||
370 | * the *CLKEN bit position for these modules (DSS and USBHOST) (The | ||
371 | * default find_idlest code assumes that they are at the same | ||
372 | * position.) No return value. | ||
373 | */ | ||
374 | static void omap3430es2_clk_dss_usbhost_find_idlest(struct clk *clk, | ||
375 | void __iomem **idlest_reg, | ||
376 | u8 *idlest_bit) | ||
377 | { | ||
378 | u32 r; | ||
379 | |||
380 | r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); | ||
381 | *idlest_reg = (__force void __iomem *)r; | ||
382 | /* USBHOST_IDLE has same shift */ | ||
383 | *idlest_bit = OMAP3430ES2_ST_DSS_IDLE_SHIFT; | ||
384 | } | ||
385 | |||
386 | /** | ||
387 | * omap3430es2_clk_hsotgusb_find_idlest - return CM_IDLEST info for HSOTGUSB | ||
388 | * @clk: struct clk * being enabled | ||
389 | * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into | ||
390 | * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into | ||
391 | * | ||
392 | * The OMAP3430ES2 HSOTGUSB target CM_IDLEST bit is at a different | ||
393 | * shift from the CM_{I,F}CLKEN bit. Pass back the correct info via | ||
394 | * @idlest_reg and @idlest_bit. No return value. | ||
395 | */ | ||
396 | static void omap3430es2_clk_hsotgusb_find_idlest(struct clk *clk, | ||
397 | void __iomem **idlest_reg, | ||
398 | u8 *idlest_bit) | ||
399 | { | ||
400 | u32 r; | ||
401 | |||
402 | r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); | ||
403 | *idlest_reg = (__force void __iomem *)r; | ||
404 | *idlest_bit = OMAP3430ES2_ST_HSOTGUSB_IDLE_SHIFT; | ||
405 | } | ||
406 | |||
407 | /** | ||
304 | * omap3_dpll_recalc - recalculate DPLL rate | 408 | * omap3_dpll_recalc - recalculate DPLL rate |
305 | * @clk: DPLL struct clk | 409 | * @clk: DPLL struct clk |
306 | * | 410 | * |
@@ -725,7 +829,9 @@ static int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate) | |||
725 | u32 unlock_dll = 0; | 829 | u32 unlock_dll = 0; |
726 | u32 c; | 830 | u32 c; |
727 | unsigned long validrate, sdrcrate, mpurate; | 831 | unsigned long validrate, sdrcrate, mpurate; |
728 | struct omap_sdrc_params *sp; | 832 | struct omap_sdrc_params *sdrc_cs0; |
833 | struct omap_sdrc_params *sdrc_cs1; | ||
834 | int ret; | ||
729 | 835 | ||
730 | if (!clk || !rate) | 836 | if (!clk || !rate) |
731 | return -EINVAL; | 837 | return -EINVAL; |
@@ -743,8 +849,8 @@ static int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate) | |||
743 | else | 849 | else |
744 | sdrcrate >>= ((clk->rate / rate) >> 1); | 850 | sdrcrate >>= ((clk->rate / rate) >> 1); |
745 | 851 | ||
746 | sp = omap2_sdrc_get_params(sdrcrate); | 852 | ret = omap2_sdrc_get_params(sdrcrate, &sdrc_cs0, &sdrc_cs1); |
747 | if (!sp) | 853 | if (ret) |
748 | return -EINVAL; | 854 | return -EINVAL; |
749 | 855 | ||
750 | if (sdrcrate < MIN_SDRC_DLL_LOCK_FREQ) { | 856 | if (sdrcrate < MIN_SDRC_DLL_LOCK_FREQ) { |
@@ -765,12 +871,29 @@ static int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate) | |||
765 | 871 | ||
766 | pr_debug("clock: changing CORE DPLL rate from %lu to %lu\n", clk->rate, | 872 | pr_debug("clock: changing CORE DPLL rate from %lu to %lu\n", clk->rate, |
767 | validrate); | 873 | validrate); |
768 | pr_debug("clock: SDRC timing params used: %08x %08x %08x\n", | 874 | pr_debug("clock: SDRC CS0 timing params used:" |
769 | sp->rfr_ctrl, sp->actim_ctrla, sp->actim_ctrlb); | 875 | " RFR %08x CTRLA %08x CTRLB %08x MR %08x\n", |
770 | 876 | sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla, | |
771 | omap3_configure_core_dpll(sp->rfr_ctrl, sp->actim_ctrla, | 877 | sdrc_cs0->actim_ctrlb, sdrc_cs0->mr); |
772 | sp->actim_ctrlb, new_div, unlock_dll, c, | 878 | if (sdrc_cs1) |
773 | sp->mr, rate > clk->rate); | 879 | pr_debug("clock: SDRC CS1 timing params used: " |
880 | " RFR %08x CTRLA %08x CTRLB %08x MR %08x\n", | ||
881 | sdrc_cs1->rfr_ctrl, sdrc_cs1->actim_ctrla, | ||
882 | sdrc_cs1->actim_ctrlb, sdrc_cs1->mr); | ||
883 | |||
884 | if (sdrc_cs1) | ||
885 | omap3_configure_core_dpll( | ||
886 | new_div, unlock_dll, c, rate > clk->rate, | ||
887 | sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla, | ||
888 | sdrc_cs0->actim_ctrlb, sdrc_cs0->mr, | ||
889 | sdrc_cs1->rfr_ctrl, sdrc_cs1->actim_ctrla, | ||
890 | sdrc_cs1->actim_ctrlb, sdrc_cs1->mr); | ||
891 | else | ||
892 | omap3_configure_core_dpll( | ||
893 | new_div, unlock_dll, c, rate > clk->rate, | ||
894 | sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla, | ||
895 | sdrc_cs0->actim_ctrlb, sdrc_cs0->mr, | ||
896 | 0, 0, 0, 0); | ||
774 | 897 | ||
775 | return 0; | 898 | return 0; |
776 | } | 899 | } |
diff --git a/arch/arm/mach-omap2/clock34xx.h b/arch/arm/mach-omap2/clock34xx.h index e433aec4efdd..57cc2725b923 100644 --- a/arch/arm/mach-omap2/clock34xx.h +++ b/arch/arm/mach-omap2/clock34xx.h | |||
@@ -1568,7 +1568,7 @@ static const struct clksel ssi_ssr_clksel[] = { | |||
1568 | { .parent = NULL } | 1568 | { .parent = NULL } |
1569 | }; | 1569 | }; |
1570 | 1570 | ||
1571 | static struct clk ssi_ssr_fck = { | 1571 | static struct clk ssi_ssr_fck_3430es1 = { |
1572 | .name = "ssi_ssr_fck", | 1572 | .name = "ssi_ssr_fck", |
1573 | .ops = &clkops_omap2_dflt, | 1573 | .ops = &clkops_omap2_dflt, |
1574 | .init = &omap2_init_clksel_parent, | 1574 | .init = &omap2_init_clksel_parent, |
@@ -1581,10 +1581,31 @@ static struct clk ssi_ssr_fck = { | |||
1581 | .recalc = &omap2_clksel_recalc, | 1581 | .recalc = &omap2_clksel_recalc, |
1582 | }; | 1582 | }; |
1583 | 1583 | ||
1584 | static struct clk ssi_sst_fck = { | 1584 | static struct clk ssi_ssr_fck_3430es2 = { |
1585 | .name = "ssi_ssr_fck", | ||
1586 | .ops = &clkops_omap3430es2_ssi_wait, | ||
1587 | .init = &omap2_init_clksel_parent, | ||
1588 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | ||
1589 | .enable_bit = OMAP3430_EN_SSI_SHIFT, | ||
1590 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), | ||
1591 | .clksel_mask = OMAP3430_CLKSEL_SSI_MASK, | ||
1592 | .clksel = ssi_ssr_clksel, | ||
1593 | .clkdm_name = "core_l4_clkdm", | ||
1594 | .recalc = &omap2_clksel_recalc, | ||
1595 | }; | ||
1596 | |||
1597 | static struct clk ssi_sst_fck_3430es1 = { | ||
1585 | .name = "ssi_sst_fck", | 1598 | .name = "ssi_sst_fck", |
1586 | .ops = &clkops_null, | 1599 | .ops = &clkops_null, |
1587 | .parent = &ssi_ssr_fck, | 1600 | .parent = &ssi_ssr_fck_3430es1, |
1601 | .fixed_div = 2, | ||
1602 | .recalc = &omap2_fixed_divisor_recalc, | ||
1603 | }; | ||
1604 | |||
1605 | static struct clk ssi_sst_fck_3430es2 = { | ||
1606 | .name = "ssi_sst_fck", | ||
1607 | .ops = &clkops_null, | ||
1608 | .parent = &ssi_ssr_fck_3430es2, | ||
1588 | .fixed_div = 2, | 1609 | .fixed_div = 2, |
1589 | .recalc = &omap2_fixed_divisor_recalc, | 1610 | .recalc = &omap2_fixed_divisor_recalc, |
1590 | }; | 1611 | }; |
@@ -1606,9 +1627,19 @@ static struct clk core_l3_ick = { | |||
1606 | .recalc = &followparent_recalc, | 1627 | .recalc = &followparent_recalc, |
1607 | }; | 1628 | }; |
1608 | 1629 | ||
1609 | static struct clk hsotgusb_ick = { | 1630 | static struct clk hsotgusb_ick_3430es1 = { |
1610 | .name = "hsotgusb_ick", | 1631 | .name = "hsotgusb_ick", |
1611 | .ops = &clkops_omap2_dflt_wait, | 1632 | .ops = &clkops_omap2_dflt, |
1633 | .parent = &core_l3_ick, | ||
1634 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | ||
1635 | .enable_bit = OMAP3430_EN_HSOTGUSB_SHIFT, | ||
1636 | .clkdm_name = "core_l3_clkdm", | ||
1637 | .recalc = &followparent_recalc, | ||
1638 | }; | ||
1639 | |||
1640 | static struct clk hsotgusb_ick_3430es2 = { | ||
1641 | .name = "hsotgusb_ick", | ||
1642 | .ops = &clkops_omap3430es2_hsotgusb_wait, | ||
1612 | .parent = &core_l3_ick, | 1643 | .parent = &core_l3_ick, |
1613 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 1644 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
1614 | .enable_bit = OMAP3430_EN_HSOTGUSB_SHIFT, | 1645 | .enable_bit = OMAP3430_EN_HSOTGUSB_SHIFT, |
@@ -1947,7 +1978,7 @@ static struct clk ssi_l4_ick = { | |||
1947 | .recalc = &followparent_recalc, | 1978 | .recalc = &followparent_recalc, |
1948 | }; | 1979 | }; |
1949 | 1980 | ||
1950 | static struct clk ssi_ick = { | 1981 | static struct clk ssi_ick_3430es1 = { |
1951 | .name = "ssi_ick", | 1982 | .name = "ssi_ick", |
1952 | .ops = &clkops_omap2_dflt, | 1983 | .ops = &clkops_omap2_dflt, |
1953 | .parent = &ssi_l4_ick, | 1984 | .parent = &ssi_l4_ick, |
@@ -1957,6 +1988,16 @@ static struct clk ssi_ick = { | |||
1957 | .recalc = &followparent_recalc, | 1988 | .recalc = &followparent_recalc, |
1958 | }; | 1989 | }; |
1959 | 1990 | ||
1991 | static struct clk ssi_ick_3430es2 = { | ||
1992 | .name = "ssi_ick", | ||
1993 | .ops = &clkops_omap3430es2_ssi_wait, | ||
1994 | .parent = &ssi_l4_ick, | ||
1995 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | ||
1996 | .enable_bit = OMAP3430_EN_SSI_SHIFT, | ||
1997 | .clkdm_name = "core_l4_clkdm", | ||
1998 | .recalc = &followparent_recalc, | ||
1999 | }; | ||
2000 | |||
1960 | /* REVISIT: Technically the TRM claims that this is CORE_CLK based, | 2001 | /* REVISIT: Technically the TRM claims that this is CORE_CLK based, |
1961 | * but l4_ick makes more sense to me */ | 2002 | * but l4_ick makes more sense to me */ |
1962 | 2003 | ||
@@ -2024,7 +2065,7 @@ static struct clk des1_ick = { | |||
2024 | }; | 2065 | }; |
2025 | 2066 | ||
2026 | /* DSS */ | 2067 | /* DSS */ |
2027 | static struct clk dss1_alwon_fck = { | 2068 | static struct clk dss1_alwon_fck_3430es1 = { |
2028 | .name = "dss1_alwon_fck", | 2069 | .name = "dss1_alwon_fck", |
2029 | .ops = &clkops_omap2_dflt, | 2070 | .ops = &clkops_omap2_dflt, |
2030 | .parent = &dpll4_m4x2_ck, | 2071 | .parent = &dpll4_m4x2_ck, |
@@ -2034,6 +2075,16 @@ static struct clk dss1_alwon_fck = { | |||
2034 | .recalc = &followparent_recalc, | 2075 | .recalc = &followparent_recalc, |
2035 | }; | 2076 | }; |
2036 | 2077 | ||
2078 | static struct clk dss1_alwon_fck_3430es2 = { | ||
2079 | .name = "dss1_alwon_fck", | ||
2080 | .ops = &clkops_omap3430es2_dss_usbhost_wait, | ||
2081 | .parent = &dpll4_m4x2_ck, | ||
2082 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN), | ||
2083 | .enable_bit = OMAP3430_EN_DSS1_SHIFT, | ||
2084 | .clkdm_name = "dss_clkdm", | ||
2085 | .recalc = &followparent_recalc, | ||
2086 | }; | ||
2087 | |||
2037 | static struct clk dss_tv_fck = { | 2088 | static struct clk dss_tv_fck = { |
2038 | .name = "dss_tv_fck", | 2089 | .name = "dss_tv_fck", |
2039 | .ops = &clkops_omap2_dflt, | 2090 | .ops = &clkops_omap2_dflt, |
@@ -2067,7 +2118,7 @@ static struct clk dss2_alwon_fck = { | |||
2067 | .recalc = &followparent_recalc, | 2118 | .recalc = &followparent_recalc, |
2068 | }; | 2119 | }; |
2069 | 2120 | ||
2070 | static struct clk dss_ick = { | 2121 | static struct clk dss_ick_3430es1 = { |
2071 | /* Handles both L3 and L4 clocks */ | 2122 | /* Handles both L3 and L4 clocks */ |
2072 | .name = "dss_ick", | 2123 | .name = "dss_ick", |
2073 | .ops = &clkops_omap2_dflt, | 2124 | .ops = &clkops_omap2_dflt, |
@@ -2079,6 +2130,18 @@ static struct clk dss_ick = { | |||
2079 | .recalc = &followparent_recalc, | 2130 | .recalc = &followparent_recalc, |
2080 | }; | 2131 | }; |
2081 | 2132 | ||
2133 | static struct clk dss_ick_3430es2 = { | ||
2134 | /* Handles both L3 and L4 clocks */ | ||
2135 | .name = "dss_ick", | ||
2136 | .ops = &clkops_omap3430es2_dss_usbhost_wait, | ||
2137 | .parent = &l4_ick, | ||
2138 | .init = &omap2_init_clk_clkdm, | ||
2139 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_ICLKEN), | ||
2140 | .enable_bit = OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT, | ||
2141 | .clkdm_name = "dss_clkdm", | ||
2142 | .recalc = &followparent_recalc, | ||
2143 | }; | ||
2144 | |||
2082 | /* CAM */ | 2145 | /* CAM */ |
2083 | 2146 | ||
2084 | static struct clk cam_mclk = { | 2147 | static struct clk cam_mclk = { |
@@ -2118,7 +2181,7 @@ static struct clk csi2_96m_fck = { | |||
2118 | 2181 | ||
2119 | static struct clk usbhost_120m_fck = { | 2182 | static struct clk usbhost_120m_fck = { |
2120 | .name = "usbhost_120m_fck", | 2183 | .name = "usbhost_120m_fck", |
2121 | .ops = &clkops_omap2_dflt_wait, | 2184 | .ops = &clkops_omap2_dflt, |
2122 | .parent = &dpll5_m2_ck, | 2185 | .parent = &dpll5_m2_ck, |
2123 | .init = &omap2_init_clk_clkdm, | 2186 | .init = &omap2_init_clk_clkdm, |
2124 | .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_FCLKEN), | 2187 | .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_FCLKEN), |
@@ -2129,7 +2192,7 @@ static struct clk usbhost_120m_fck = { | |||
2129 | 2192 | ||
2130 | static struct clk usbhost_48m_fck = { | 2193 | static struct clk usbhost_48m_fck = { |
2131 | .name = "usbhost_48m_fck", | 2194 | .name = "usbhost_48m_fck", |
2132 | .ops = &clkops_omap2_dflt_wait, | 2195 | .ops = &clkops_omap3430es2_dss_usbhost_wait, |
2133 | .parent = &omap_48m_fck, | 2196 | .parent = &omap_48m_fck, |
2134 | .init = &omap2_init_clk_clkdm, | 2197 | .init = &omap2_init_clk_clkdm, |
2135 | .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_FCLKEN), | 2198 | .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_FCLKEN), |
@@ -2141,7 +2204,7 @@ static struct clk usbhost_48m_fck = { | |||
2141 | static struct clk usbhost_ick = { | 2204 | static struct clk usbhost_ick = { |
2142 | /* Handles both L3 and L4 clocks */ | 2205 | /* Handles both L3 and L4 clocks */ |
2143 | .name = "usbhost_ick", | 2206 | .name = "usbhost_ick", |
2144 | .ops = &clkops_omap2_dflt_wait, | 2207 | .ops = &clkops_omap3430es2_dss_usbhost_wait, |
2145 | .parent = &l4_ick, | 2208 | .parent = &l4_ick, |
2146 | .init = &omap2_init_clk_clkdm, | 2209 | .init = &omap2_init_clk_clkdm, |
2147 | .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_ICLKEN), | 2210 | .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_ICLKEN), |
diff --git a/arch/arm/mach-omap2/cm.h b/arch/arm/mach-omap2/cm.h index 1d3c93bf86d3..f3c91a1ca391 100644 --- a/arch/arm/mach-omap2/cm.h +++ b/arch/arm/mach-omap2/cm.h | |||
@@ -29,9 +29,9 @@ | |||
29 | * These registers appear once per CM module. | 29 | * These registers appear once per CM module. |
30 | */ | 30 | */ |
31 | 31 | ||
32 | #define OMAP3430_CM_REVISION OMAP_CM_REGADDR(OCP_MOD, 0x0000) | 32 | #define OMAP3430_CM_REVISION OMAP34XX_CM_REGADDR(OCP_MOD, 0x0000) |
33 | #define OMAP3430_CM_SYSCONFIG OMAP_CM_REGADDR(OCP_MOD, 0x0010) | 33 | #define OMAP3430_CM_SYSCONFIG OMAP34XX_CM_REGADDR(OCP_MOD, 0x0010) |
34 | #define OMAP3430_CM_POLCTRL OMAP_CM_REGADDR(OCP_MOD, 0x009c) | 34 | #define OMAP3430_CM_POLCTRL OMAP34XX_CM_REGADDR(OCP_MOD, 0x009c) |
35 | 35 | ||
36 | #define OMAP3_CM_CLKOUT_CTRL_OFFSET 0x0070 | 36 | #define OMAP3_CM_CLKOUT_CTRL_OFFSET 0x0070 |
37 | #define OMAP3430_CM_CLKOUT_CTRL OMAP_CM_REGADDR(OMAP3430_CCR_MOD, 0x0070) | 37 | #define OMAP3430_CM_CLKOUT_CTRL OMAP_CM_REGADDR(OMAP3430_CCR_MOD, 0x0070) |
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 3a86b0f66031..e9b9bcb19b4e 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
@@ -276,14 +276,15 @@ static int __init _omap2_init_reprogram_sdrc(void) | |||
276 | return v; | 276 | return v; |
277 | } | 277 | } |
278 | 278 | ||
279 | void __init omap2_init_common_hw(struct omap_sdrc_params *sp) | 279 | void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0, |
280 | struct omap_sdrc_params *sdrc_cs1) | ||
280 | { | 281 | { |
281 | omap2_mux_init(); | 282 | omap2_mux_init(); |
282 | #ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once the clkdev is ready */ | 283 | #ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once the clkdev is ready */ |
283 | pwrdm_init(powerdomains_omap); | 284 | pwrdm_init(powerdomains_omap); |
284 | clkdm_init(clockdomains_omap, clkdm_pwrdm_autodeps); | 285 | clkdm_init(clockdomains_omap, clkdm_pwrdm_autodeps); |
285 | omap2_clk_init(); | 286 | omap2_clk_init(); |
286 | omap2_sdrc_init(sp); | 287 | omap2_sdrc_init(sdrc_cs0, sdrc_cs1); |
287 | _omap2_init_reprogram_sdrc(); | 288 | _omap2_init_reprogram_sdrc(); |
288 | #endif | 289 | #endif |
289 | gpmc_init(); | 290 | gpmc_init(); |
diff --git a/arch/arm/mach-omap2/mmc-twl4030.c b/arch/arm/mach-omap2/mmc-twl4030.c index 1541fd4c8d0f..3c04c2f1b23f 100644 --- a/arch/arm/mach-omap2/mmc-twl4030.c +++ b/arch/arm/mach-omap2/mmc-twl4030.c | |||
@@ -119,6 +119,7 @@ static int twl_mmc_late_init(struct device *dev) | |||
119 | if (i != 0) | 119 | if (i != 0) |
120 | break; | 120 | break; |
121 | ret = PTR_ERR(reg); | 121 | ret = PTR_ERR(reg); |
122 | hsmmc[i].vcc = NULL; | ||
122 | goto err; | 123 | goto err; |
123 | } | 124 | } |
124 | hsmmc[i].vcc = reg; | 125 | hsmmc[i].vcc = reg; |
@@ -165,8 +166,13 @@ done: | |||
165 | static void twl_mmc_cleanup(struct device *dev) | 166 | static void twl_mmc_cleanup(struct device *dev) |
166 | { | 167 | { |
167 | struct omap_mmc_platform_data *mmc = dev->platform_data; | 168 | struct omap_mmc_platform_data *mmc = dev->platform_data; |
169 | int i; | ||
168 | 170 | ||
169 | gpio_free(mmc->slots[0].switch_pin); | 171 | gpio_free(mmc->slots[0].switch_pin); |
172 | for(i = 0; i < ARRAY_SIZE(hsmmc); i++) { | ||
173 | regulator_put(hsmmc[i].vcc); | ||
174 | regulator_put(hsmmc[i].vcc_aux); | ||
175 | } | ||
170 | } | 176 | } |
171 | 177 | ||
172 | #ifdef CONFIG_PM | 178 | #ifdef CONFIG_PM |
diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c index 026c4fc883a7..43d6b92b65f2 100644 --- a/arch/arm/mach-omap2/mux.c +++ b/arch/arm/mach-omap2/mux.c | |||
@@ -486,6 +486,12 @@ MUX_CFG_34XX("H19_34XX_GPIO164_OUT", 0x19c, | |||
486 | OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT) | 486 | OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT) |
487 | MUX_CFG_34XX("J25_34XX_GPIO170", 0x1c6, | 487 | MUX_CFG_34XX("J25_34XX_GPIO170", 0x1c6, |
488 | OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT) | 488 | OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT) |
489 | |||
490 | /* OMAP3 SDRC CKE signals to SDR/DDR ram chips */ | ||
491 | MUX_CFG_34XX("H16_34XX_SDRC_CKE0", 0x262, | ||
492 | OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_OUTPUT) | ||
493 | MUX_CFG_34XX("H17_34XX_SDRC_CKE1", 0x264, | ||
494 | OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_OUTPUT) | ||
489 | }; | 495 | }; |
490 | 496 | ||
491 | #define OMAP34XX_PINS_SZ ARRAY_SIZE(omap34xx_pins) | 497 | #define OMAP34XX_PINS_SZ ARRAY_SIZE(omap34xx_pins) |
diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h index f7b3baf76678..21201cd4117b 100644 --- a/arch/arm/mach-omap2/pm.h +++ b/arch/arm/mach-omap2/pm.h | |||
@@ -11,9 +11,6 @@ | |||
11 | #ifndef __ARCH_ARM_MACH_OMAP2_PM_H | 11 | #ifndef __ARCH_ARM_MACH_OMAP2_PM_H |
12 | #define __ARCH_ARM_MACH_OMAP2_PM_H | 12 | #define __ARCH_ARM_MACH_OMAP2_PM_H |
13 | 13 | ||
14 | extern int omap2_pm_init(void); | ||
15 | extern int omap3_pm_init(void); | ||
16 | |||
17 | #ifdef CONFIG_PM_DEBUG | 14 | #ifdef CONFIG_PM_DEBUG |
18 | extern void omap2_pm_dump(int mode, int resume, unsigned int us); | 15 | extern void omap2_pm_dump(int mode, int resume, unsigned int us); |
19 | extern int omap2_pm_debug; | 16 | extern int omap2_pm_debug; |
diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index db1025562fb0..528dbdc26e23 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c | |||
@@ -470,7 +470,7 @@ static void __init prcm_setup_regs(void) | |||
470 | WKUP_MOD, PM_WKEN); | 470 | WKUP_MOD, PM_WKEN); |
471 | } | 471 | } |
472 | 472 | ||
473 | int __init omap2_pm_init(void) | 473 | static int __init omap2_pm_init(void) |
474 | { | 474 | { |
475 | u32 l; | 475 | u32 l; |
476 | 476 | ||
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 841d4c5ed8be..488d595d8e4b 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -39,7 +39,9 @@ | |||
39 | struct power_state { | 39 | struct power_state { |
40 | struct powerdomain *pwrdm; | 40 | struct powerdomain *pwrdm; |
41 | u32 next_state; | 41 | u32 next_state; |
42 | #ifdef CONFIG_SUSPEND | ||
42 | u32 saved_state; | 43 | u32 saved_state; |
44 | #endif | ||
43 | struct list_head node; | 45 | struct list_head node; |
44 | }; | 46 | }; |
45 | 47 | ||
@@ -293,6 +295,9 @@ out: | |||
293 | local_irq_enable(); | 295 | local_irq_enable(); |
294 | } | 296 | } |
295 | 297 | ||
298 | #ifdef CONFIG_SUSPEND | ||
299 | static suspend_state_t suspend_state; | ||
300 | |||
296 | static int omap3_pm_prepare(void) | 301 | static int omap3_pm_prepare(void) |
297 | { | 302 | { |
298 | disable_hlt(); | 303 | disable_hlt(); |
@@ -321,7 +326,6 @@ static int omap3_pm_suspend(void) | |||
321 | restore: | 326 | restore: |
322 | /* Restore next_pwrsts */ | 327 | /* Restore next_pwrsts */ |
323 | list_for_each_entry(pwrst, &pwrst_list, node) { | 328 | list_for_each_entry(pwrst, &pwrst_list, node) { |
324 | set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state); | ||
325 | state = pwrdm_read_prev_pwrst(pwrst->pwrdm); | 329 | state = pwrdm_read_prev_pwrst(pwrst->pwrdm); |
326 | if (state > pwrst->next_state) { | 330 | if (state > pwrst->next_state) { |
327 | printk(KERN_INFO "Powerdomain (%s) didn't enter " | 331 | printk(KERN_INFO "Powerdomain (%s) didn't enter " |
@@ -329,6 +333,7 @@ restore: | |||
329 | pwrst->pwrdm->name, pwrst->next_state); | 333 | pwrst->pwrdm->name, pwrst->next_state); |
330 | ret = -1; | 334 | ret = -1; |
331 | } | 335 | } |
336 | set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state); | ||
332 | } | 337 | } |
333 | if (ret) | 338 | if (ret) |
334 | printk(KERN_ERR "Could not enter target state in pm_suspend\n"); | 339 | printk(KERN_ERR "Could not enter target state in pm_suspend\n"); |
@@ -339,11 +344,11 @@ restore: | |||
339 | return ret; | 344 | return ret; |
340 | } | 345 | } |
341 | 346 | ||
342 | static int omap3_pm_enter(suspend_state_t state) | 347 | static int omap3_pm_enter(suspend_state_t unused) |
343 | { | 348 | { |
344 | int ret = 0; | 349 | int ret = 0; |
345 | 350 | ||
346 | switch (state) { | 351 | switch (suspend_state) { |
347 | case PM_SUSPEND_STANDBY: | 352 | case PM_SUSPEND_STANDBY: |
348 | case PM_SUSPEND_MEM: | 353 | case PM_SUSPEND_MEM: |
349 | ret = omap3_pm_suspend(); | 354 | ret = omap3_pm_suspend(); |
@@ -360,12 +365,30 @@ static void omap3_pm_finish(void) | |||
360 | enable_hlt(); | 365 | enable_hlt(); |
361 | } | 366 | } |
362 | 367 | ||
368 | /* Hooks to enable / disable UART interrupts during suspend */ | ||
369 | static int omap3_pm_begin(suspend_state_t state) | ||
370 | { | ||
371 | suspend_state = state; | ||
372 | omap_uart_enable_irqs(0); | ||
373 | return 0; | ||
374 | } | ||
375 | |||
376 | static void omap3_pm_end(void) | ||
377 | { | ||
378 | suspend_state = PM_SUSPEND_ON; | ||
379 | omap_uart_enable_irqs(1); | ||
380 | return; | ||
381 | } | ||
382 | |||
363 | static struct platform_suspend_ops omap_pm_ops = { | 383 | static struct platform_suspend_ops omap_pm_ops = { |
384 | .begin = omap3_pm_begin, | ||
385 | .end = omap3_pm_end, | ||
364 | .prepare = omap3_pm_prepare, | 386 | .prepare = omap3_pm_prepare, |
365 | .enter = omap3_pm_enter, | 387 | .enter = omap3_pm_enter, |
366 | .finish = omap3_pm_finish, | 388 | .finish = omap3_pm_finish, |
367 | .valid = suspend_valid_only_mem, | 389 | .valid = suspend_valid_only_mem, |
368 | }; | 390 | }; |
391 | #endif /* CONFIG_SUSPEND */ | ||
369 | 392 | ||
370 | 393 | ||
371 | /** | 394 | /** |
@@ -613,6 +636,24 @@ static void __init prcm_setup_regs(void) | |||
613 | /* Clear any pending PRCM interrupts */ | 636 | /* Clear any pending PRCM interrupts */ |
614 | prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | 637 | prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); |
615 | 638 | ||
639 | /* Don't attach IVA interrupts */ | ||
640 | prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL); | ||
641 | prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1); | ||
642 | prm_write_mod_reg(0, CORE_MOD, OMAP3430ES2_PM_IVAGRPSEL3); | ||
643 | prm_write_mod_reg(0, OMAP3430_PER_MOD, OMAP3430_PM_IVAGRPSEL); | ||
644 | |||
645 | /* Clear any pending 'reset' flags */ | ||
646 | prm_write_mod_reg(0xffffffff, MPU_MOD, RM_RSTST); | ||
647 | prm_write_mod_reg(0xffffffff, CORE_MOD, RM_RSTST); | ||
648 | prm_write_mod_reg(0xffffffff, OMAP3430_PER_MOD, RM_RSTST); | ||
649 | prm_write_mod_reg(0xffffffff, OMAP3430_EMU_MOD, RM_RSTST); | ||
650 | prm_write_mod_reg(0xffffffff, OMAP3430_NEON_MOD, RM_RSTST); | ||
651 | prm_write_mod_reg(0xffffffff, OMAP3430_DSS_MOD, RM_RSTST); | ||
652 | prm_write_mod_reg(0xffffffff, OMAP3430ES2_USBHOST_MOD, RM_RSTST); | ||
653 | |||
654 | /* Clear any pending PRCM interrupts */ | ||
655 | prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | ||
656 | |||
616 | omap3_iva_idle(); | 657 | omap3_iva_idle(); |
617 | omap3_d2d_idle(); | 658 | omap3_d2d_idle(); |
618 | } | 659 | } |
@@ -652,7 +693,7 @@ static int __init clkdms_setup(struct clockdomain *clkdm) | |||
652 | return 0; | 693 | return 0; |
653 | } | 694 | } |
654 | 695 | ||
655 | int __init omap3_pm_init(void) | 696 | static int __init omap3_pm_init(void) |
656 | { | 697 | { |
657 | struct power_state *pwrst, *tmp; | 698 | struct power_state *pwrst, *tmp; |
658 | int ret; | 699 | int ret; |
@@ -692,7 +733,9 @@ int __init omap3_pm_init(void) | |||
692 | _omap_sram_idle = omap_sram_push(omap34xx_cpu_suspend, | 733 | _omap_sram_idle = omap_sram_push(omap34xx_cpu_suspend, |
693 | omap34xx_cpu_suspend_sz); | 734 | omap34xx_cpu_suspend_sz); |
694 | 735 | ||
736 | #ifdef CONFIG_SUSPEND | ||
695 | suspend_set_ops(&omap_pm_ops); | 737 | suspend_set_ops(&omap_pm_ops); |
738 | #endif /* CONFIG_SUSPEND */ | ||
696 | 739 | ||
697 | pm_idle = omap3_pm_idle; | 740 | pm_idle = omap3_pm_idle; |
698 | 741 | ||
diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c index f945156d5585..ced555a4cd1a 100644 --- a/arch/arm/mach-omap2/prcm.c +++ b/arch/arm/mach-omap2/prcm.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
18 | #include <linux/clk.h> | 18 | #include <linux/clk.h> |
19 | #include <linux/io.h> | 19 | #include <linux/io.h> |
20 | #include <linux/delay.h> | ||
20 | 21 | ||
21 | #include <mach/common.h> | 22 | #include <mach/common.h> |
22 | #include <mach/prcm.h> | 23 | #include <mach/prcm.h> |
@@ -28,6 +29,8 @@ | |||
28 | static void __iomem *prm_base; | 29 | static void __iomem *prm_base; |
29 | static void __iomem *cm_base; | 30 | static void __iomem *cm_base; |
30 | 31 | ||
32 | #define MAX_MODULE_ENABLE_WAIT 100000 | ||
33 | |||
31 | u32 omap_prcm_get_reset_sources(void) | 34 | u32 omap_prcm_get_reset_sources(void) |
32 | { | 35 | { |
33 | /* XXX This presumably needs modification for 34XX */ | 36 | /* XXX This presumably needs modification for 34XX */ |
@@ -120,6 +123,46 @@ u32 cm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module, s16 idx) | |||
120 | } | 123 | } |
121 | EXPORT_SYMBOL(cm_rmw_mod_reg_bits); | 124 | EXPORT_SYMBOL(cm_rmw_mod_reg_bits); |
122 | 125 | ||
126 | /** | ||
127 | * omap2_cm_wait_idlest - wait for IDLEST bit to indicate module readiness | ||
128 | * @reg: physical address of module IDLEST register | ||
129 | * @mask: value to mask against to determine if the module is active | ||
130 | * @name: name of the clock (for printk) | ||
131 | * | ||
132 | * Returns 1 if the module indicated readiness in time, or 0 if it | ||
133 | * failed to enable in roughly MAX_MODULE_ENABLE_WAIT microseconds. | ||
134 | */ | ||
135 | int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, const char *name) | ||
136 | { | ||
137 | int i = 0; | ||
138 | int ena = 0; | ||
139 | |||
140 | /* | ||
141 | * 24xx uses 0 to indicate not ready, and 1 to indicate ready. | ||
142 | * 34xx reverses this, just to keep us on our toes | ||
143 | */ | ||
144 | if (cpu_is_omap24xx()) | ||
145 | ena = mask; | ||
146 | else if (cpu_is_omap34xx()) | ||
147 | ena = 0; | ||
148 | else | ||
149 | BUG(); | ||
150 | |||
151 | /* Wait for lock */ | ||
152 | while (((__raw_readl(reg) & mask) != ena) && | ||
153 | (i++ < MAX_MODULE_ENABLE_WAIT)) | ||
154 | udelay(1); | ||
155 | |||
156 | if (i < MAX_MODULE_ENABLE_WAIT) | ||
157 | pr_debug("cm: Module associated with clock %s ready after %d " | ||
158 | "loops\n", name, i); | ||
159 | else | ||
160 | pr_err("cm: Module associated with clock %s didn't enable in " | ||
161 | "%d tries\n", name, MAX_MODULE_ENABLE_WAIT); | ||
162 | |||
163 | return (i < MAX_MODULE_ENABLE_WAIT) ? 1 : 0; | ||
164 | }; | ||
165 | |||
123 | void __init omap2_set_globals_prcm(struct omap_globals *omap2_globals) | 166 | void __init omap2_set_globals_prcm(struct omap_globals *omap2_globals) |
124 | { | 167 | { |
125 | prm_base = omap2_globals->prm; | 168 | prm_base = omap2_globals->prm; |
diff --git a/arch/arm/mach-omap2/sdrc.c b/arch/arm/mach-omap2/sdrc.c index 2045441e8385..9e3bd4fa7810 100644 --- a/arch/arm/mach-omap2/sdrc.c +++ b/arch/arm/mach-omap2/sdrc.c | |||
@@ -32,7 +32,7 @@ | |||
32 | #include <mach/sdrc.h> | 32 | #include <mach/sdrc.h> |
33 | #include "sdrc.h" | 33 | #include "sdrc.h" |
34 | 34 | ||
35 | static struct omap_sdrc_params *sdrc_init_params; | 35 | static struct omap_sdrc_params *sdrc_init_params_cs0, *sdrc_init_params_cs1; |
36 | 36 | ||
37 | void __iomem *omap2_sdrc_base; | 37 | void __iomem *omap2_sdrc_base; |
38 | void __iomem *omap2_sms_base; | 38 | void __iomem *omap2_sms_base; |
@@ -45,33 +45,49 @@ void __iomem *omap2_sms_base; | |||
45 | /** | 45 | /** |
46 | * omap2_sdrc_get_params - return SDRC register values for a given clock rate | 46 | * omap2_sdrc_get_params - return SDRC register values for a given clock rate |
47 | * @r: SDRC clock rate (in Hz) | 47 | * @r: SDRC clock rate (in Hz) |
48 | * @sdrc_cs0: chip select 0 ram timings ** | ||
49 | * @sdrc_cs1: chip select 1 ram timings ** | ||
48 | * | 50 | * |
49 | * Return pre-calculated values for the SDRC_ACTIM_CTRLA, | 51 | * Return pre-calculated values for the SDRC_ACTIM_CTRLA, |
50 | * SDRC_ACTIM_CTRLB, SDRC_RFR_CTRL, and SDRC_MR registers, for a given | 52 | * SDRC_ACTIM_CTRLB, SDRC_RFR_CTRL and SDRC_MR registers in sdrc_cs[01] |
51 | * SDRC clock rate 'r'. These parameters control various timing | 53 | * structs,for a given SDRC clock rate 'r'. |
52 | * delays in the SDRAM controller that are expressed in terms of the | 54 | * These parameters control various timing delays in the SDRAM controller |
53 | * number of SDRC clock cycles to wait; hence the clock rate | 55 | * that are expressed in terms of the number of SDRC clock cycles to |
54 | * dependency. Note that sdrc_init_params must be sorted rate | 56 | * wait; hence the clock rate dependency. |
55 | * descending. Also assumes that both chip-selects use the same | 57 | * |
56 | * timing parameters. Returns a struct omap_sdrc_params * upon | 58 | * Supports 2 different timing parameters for both chip selects. |
57 | * success, or NULL upon failure. | 59 | * |
60 | * Note 1: the sdrc_init_params_cs[01] must be sorted rate descending. | ||
61 | * Note 2: If sdrc_init_params_cs_1 is not NULL it must be of same size | ||
62 | * as sdrc_init_params_cs_0. | ||
63 | * | ||
64 | * Fills in the struct omap_sdrc_params * for each chip select. | ||
65 | * Returns 0 upon success or -1 upon failure. | ||
58 | */ | 66 | */ |
59 | struct omap_sdrc_params *omap2_sdrc_get_params(unsigned long r) | 67 | int omap2_sdrc_get_params(unsigned long r, |
68 | struct omap_sdrc_params **sdrc_cs0, | ||
69 | struct omap_sdrc_params **sdrc_cs1) | ||
60 | { | 70 | { |
61 | struct omap_sdrc_params *sp; | 71 | struct omap_sdrc_params *sp0, *sp1; |
62 | 72 | ||
63 | if (!sdrc_init_params) | 73 | if (!sdrc_init_params_cs0) |
64 | return NULL; | 74 | return -1; |
65 | 75 | ||
66 | sp = sdrc_init_params; | 76 | sp0 = sdrc_init_params_cs0; |
77 | sp1 = sdrc_init_params_cs1; | ||
67 | 78 | ||
68 | while (sp->rate && sp->rate != r) | 79 | while (sp0->rate && sp0->rate != r) { |
69 | sp++; | 80 | sp0++; |
81 | if (sdrc_init_params_cs1) | ||
82 | sp1++; | ||
83 | } | ||
70 | 84 | ||
71 | if (!sp->rate) | 85 | if (!sp0->rate) |
72 | return NULL; | 86 | return -1; |
73 | 87 | ||
74 | return sp; | 88 | *sdrc_cs0 = sp0; |
89 | *sdrc_cs1 = sp1; | ||
90 | return 0; | ||
75 | } | 91 | } |
76 | 92 | ||
77 | 93 | ||
@@ -83,13 +99,15 @@ void __init omap2_set_globals_sdrc(struct omap_globals *omap2_globals) | |||
83 | 99 | ||
84 | /** | 100 | /** |
85 | * omap2_sdrc_init - initialize SMS, SDRC devices on boot | 101 | * omap2_sdrc_init - initialize SMS, SDRC devices on boot |
86 | * @sp: pointer to a null-terminated list of struct omap_sdrc_params | 102 | * @sdrc_cs[01]: pointers to a null-terminated list of struct omap_sdrc_params |
103 | * Support for 2 chip selects timings | ||
87 | * | 104 | * |
88 | * Turn on smart idle modes for SDRAM scheduler and controller. | 105 | * Turn on smart idle modes for SDRAM scheduler and controller. |
89 | * Program a known-good configuration for the SDRC to deal with buggy | 106 | * Program a known-good configuration for the SDRC to deal with buggy |
90 | * bootloaders. | 107 | * bootloaders. |
91 | */ | 108 | */ |
92 | void __init omap2_sdrc_init(struct omap_sdrc_params *sp) | 109 | void __init omap2_sdrc_init(struct omap_sdrc_params *sdrc_cs0, |
110 | struct omap_sdrc_params *sdrc_cs1) | ||
93 | { | 111 | { |
94 | u32 l; | 112 | u32 l; |
95 | 113 | ||
@@ -103,11 +121,15 @@ void __init omap2_sdrc_init(struct omap_sdrc_params *sp) | |||
103 | l |= (0x2 << 3); | 121 | l |= (0x2 << 3); |
104 | sdrc_write_reg(l, SDRC_SYSCONFIG); | 122 | sdrc_write_reg(l, SDRC_SYSCONFIG); |
105 | 123 | ||
106 | sdrc_init_params = sp; | 124 | sdrc_init_params_cs0 = sdrc_cs0; |
125 | sdrc_init_params_cs1 = sdrc_cs1; | ||
107 | 126 | ||
108 | /* XXX Enable SRFRONIDLEREQ here also? */ | 127 | /* XXX Enable SRFRONIDLEREQ here also? */ |
128 | /* | ||
129 | * PWDENA should not be set due to 34xx erratum 1.150 - PWDENA | ||
130 | * can cause random memory corruption | ||
131 | */ | ||
109 | l = (1 << SDRC_POWER_EXTCLKDIS_SHIFT) | | 132 | l = (1 << SDRC_POWER_EXTCLKDIS_SHIFT) | |
110 | (1 << SDRC_POWER_PWDENA_SHIFT) | | ||
111 | (1 << SDRC_POWER_PAGEPOLICY_SHIFT); | 133 | (1 << SDRC_POWER_PAGEPOLICY_SHIFT); |
112 | sdrc_write_reg(l, SDRC_POWER); | 134 | sdrc_write_reg(l, SDRC_POWER); |
113 | } | 135 | } |
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index b094c15bfe47..a7421a50410b 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c | |||
@@ -54,6 +54,7 @@ struct omap_uart_state { | |||
54 | 54 | ||
55 | struct plat_serial8250_port *p; | 55 | struct plat_serial8250_port *p; |
56 | struct list_head node; | 56 | struct list_head node; |
57 | struct platform_device pdev; | ||
57 | 58 | ||
58 | #if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM) | 59 | #if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM) |
59 | int context_valid; | 60 | int context_valid; |
@@ -68,10 +69,9 @@ struct omap_uart_state { | |||
68 | #endif | 69 | #endif |
69 | }; | 70 | }; |
70 | 71 | ||
71 | static struct omap_uart_state omap_uart[OMAP_MAX_NR_PORTS]; | ||
72 | static LIST_HEAD(uart_list); | 72 | static LIST_HEAD(uart_list); |
73 | 73 | ||
74 | static struct plat_serial8250_port serial_platform_data[] = { | 74 | static struct plat_serial8250_port serial_platform_data0[] = { |
75 | { | 75 | { |
76 | .membase = IO_ADDRESS(OMAP_UART1_BASE), | 76 | .membase = IO_ADDRESS(OMAP_UART1_BASE), |
77 | .mapbase = OMAP_UART1_BASE, | 77 | .mapbase = OMAP_UART1_BASE, |
@@ -81,6 +81,12 @@ static struct plat_serial8250_port serial_platform_data[] = { | |||
81 | .regshift = 2, | 81 | .regshift = 2, |
82 | .uartclk = OMAP24XX_BASE_BAUD * 16, | 82 | .uartclk = OMAP24XX_BASE_BAUD * 16, |
83 | }, { | 83 | }, { |
84 | .flags = 0 | ||
85 | } | ||
86 | }; | ||
87 | |||
88 | static struct plat_serial8250_port serial_platform_data1[] = { | ||
89 | { | ||
84 | .membase = IO_ADDRESS(OMAP_UART2_BASE), | 90 | .membase = IO_ADDRESS(OMAP_UART2_BASE), |
85 | .mapbase = OMAP_UART2_BASE, | 91 | .mapbase = OMAP_UART2_BASE, |
86 | .irq = 73, | 92 | .irq = 73, |
@@ -89,6 +95,12 @@ static struct plat_serial8250_port serial_platform_data[] = { | |||
89 | .regshift = 2, | 95 | .regshift = 2, |
90 | .uartclk = OMAP24XX_BASE_BAUD * 16, | 96 | .uartclk = OMAP24XX_BASE_BAUD * 16, |
91 | }, { | 97 | }, { |
98 | .flags = 0 | ||
99 | } | ||
100 | }; | ||
101 | |||
102 | static struct plat_serial8250_port serial_platform_data2[] = { | ||
103 | { | ||
92 | .membase = IO_ADDRESS(OMAP_UART3_BASE), | 104 | .membase = IO_ADDRESS(OMAP_UART3_BASE), |
93 | .mapbase = OMAP_UART3_BASE, | 105 | .mapbase = OMAP_UART3_BASE, |
94 | .irq = 74, | 106 | .irq = 74, |
@@ -217,6 +229,40 @@ static inline void omap_uart_disable_clocks(struct omap_uart_state *uart) | |||
217 | clk_disable(uart->fck); | 229 | clk_disable(uart->fck); |
218 | } | 230 | } |
219 | 231 | ||
232 | static void omap_uart_enable_wakeup(struct omap_uart_state *uart) | ||
233 | { | ||
234 | /* Set wake-enable bit */ | ||
235 | if (uart->wk_en && uart->wk_mask) { | ||
236 | u32 v = __raw_readl(uart->wk_en); | ||
237 | v |= uart->wk_mask; | ||
238 | __raw_writel(v, uart->wk_en); | ||
239 | } | ||
240 | |||
241 | /* Ensure IOPAD wake-enables are set */ | ||
242 | if (cpu_is_omap34xx() && uart->padconf) { | ||
243 | u16 v = omap_ctrl_readw(uart->padconf); | ||
244 | v |= OMAP3_PADCONF_WAKEUPENABLE0; | ||
245 | omap_ctrl_writew(v, uart->padconf); | ||
246 | } | ||
247 | } | ||
248 | |||
249 | static void omap_uart_disable_wakeup(struct omap_uart_state *uart) | ||
250 | { | ||
251 | /* Clear wake-enable bit */ | ||
252 | if (uart->wk_en && uart->wk_mask) { | ||
253 | u32 v = __raw_readl(uart->wk_en); | ||
254 | v &= ~uart->wk_mask; | ||
255 | __raw_writel(v, uart->wk_en); | ||
256 | } | ||
257 | |||
258 | /* Ensure IOPAD wake-enables are cleared */ | ||
259 | if (cpu_is_omap34xx() && uart->padconf) { | ||
260 | u16 v = omap_ctrl_readw(uart->padconf); | ||
261 | v &= ~OMAP3_PADCONF_WAKEUPENABLE0; | ||
262 | omap_ctrl_writew(v, uart->padconf); | ||
263 | } | ||
264 | } | ||
265 | |||
220 | static void omap_uart_smart_idle_enable(struct omap_uart_state *uart, | 266 | static void omap_uart_smart_idle_enable(struct omap_uart_state *uart, |
221 | int enable) | 267 | int enable) |
222 | { | 268 | { |
@@ -246,6 +292,11 @@ static void omap_uart_block_sleep(struct omap_uart_state *uart) | |||
246 | 292 | ||
247 | static void omap_uart_allow_sleep(struct omap_uart_state *uart) | 293 | static void omap_uart_allow_sleep(struct omap_uart_state *uart) |
248 | { | 294 | { |
295 | if (device_may_wakeup(&uart->pdev.dev)) | ||
296 | omap_uart_enable_wakeup(uart); | ||
297 | else | ||
298 | omap_uart_disable_wakeup(uart); | ||
299 | |||
249 | if (!uart->clocked) | 300 | if (!uart->clocked) |
250 | return; | 301 | return; |
251 | 302 | ||
@@ -292,7 +343,6 @@ void omap_uart_resume_idle(int num) | |||
292 | /* Check for normal UART wakeup */ | 343 | /* Check for normal UART wakeup */ |
293 | if (__raw_readl(uart->wk_st) & uart->wk_mask) | 344 | if (__raw_readl(uart->wk_st) & uart->wk_mask) |
294 | omap_uart_block_sleep(uart); | 345 | omap_uart_block_sleep(uart); |
295 | |||
296 | return; | 346 | return; |
297 | } | 347 | } |
298 | } | 348 | } |
@@ -346,16 +396,13 @@ static irqreturn_t omap_uart_interrupt(int irq, void *dev_id) | |||
346 | return IRQ_NONE; | 396 | return IRQ_NONE; |
347 | } | 397 | } |
348 | 398 | ||
349 | static u32 sleep_timeout = DEFAULT_TIMEOUT; | ||
350 | |||
351 | static void omap_uart_idle_init(struct omap_uart_state *uart) | 399 | static void omap_uart_idle_init(struct omap_uart_state *uart) |
352 | { | 400 | { |
353 | u32 v; | ||
354 | struct plat_serial8250_port *p = uart->p; | 401 | struct plat_serial8250_port *p = uart->p; |
355 | int ret; | 402 | int ret; |
356 | 403 | ||
357 | uart->can_sleep = 0; | 404 | uart->can_sleep = 0; |
358 | uart->timeout = sleep_timeout; | 405 | uart->timeout = DEFAULT_TIMEOUT; |
359 | setup_timer(&uart->timer, omap_uart_idle_timer, | 406 | setup_timer(&uart->timer, omap_uart_idle_timer, |
360 | (unsigned long) uart); | 407 | (unsigned long) uart); |
361 | mod_timer(&uart->timer, jiffies + uart->timeout); | 408 | mod_timer(&uart->timer, jiffies + uart->timeout); |
@@ -413,76 +460,101 @@ static void omap_uart_idle_init(struct omap_uart_state *uart) | |||
413 | uart->padconf = 0; | 460 | uart->padconf = 0; |
414 | } | 461 | } |
415 | 462 | ||
416 | /* Set wake-enable bit */ | ||
417 | if (uart->wk_en && uart->wk_mask) { | ||
418 | v = __raw_readl(uart->wk_en); | ||
419 | v |= uart->wk_mask; | ||
420 | __raw_writel(v, uart->wk_en); | ||
421 | } | ||
422 | |||
423 | /* Ensure IOPAD wake-enables are set */ | ||
424 | if (cpu_is_omap34xx() && uart->padconf) { | ||
425 | u16 v; | ||
426 | |||
427 | v = omap_ctrl_readw(uart->padconf); | ||
428 | v |= OMAP3_PADCONF_WAKEUPENABLE0; | ||
429 | omap_ctrl_writew(v, uart->padconf); | ||
430 | } | ||
431 | |||
432 | p->flags |= UPF_SHARE_IRQ; | 463 | p->flags |= UPF_SHARE_IRQ; |
433 | ret = request_irq(p->irq, omap_uart_interrupt, IRQF_SHARED, | 464 | ret = request_irq(p->irq, omap_uart_interrupt, IRQF_SHARED, |
434 | "serial idle", (void *)uart); | 465 | "serial idle", (void *)uart); |
435 | WARN_ON(ret); | 466 | WARN_ON(ret); |
436 | } | 467 | } |
437 | 468 | ||
438 | static ssize_t sleep_timeout_show(struct kobject *kobj, | 469 | void omap_uart_enable_irqs(int enable) |
439 | struct kobj_attribute *attr, | 470 | { |
471 | int ret; | ||
472 | struct omap_uart_state *uart; | ||
473 | |||
474 | list_for_each_entry(uart, &uart_list, node) { | ||
475 | if (enable) | ||
476 | ret = request_irq(uart->p->irq, omap_uart_interrupt, | ||
477 | IRQF_SHARED, "serial idle", (void *)uart); | ||
478 | else | ||
479 | free_irq(uart->p->irq, (void *)uart); | ||
480 | } | ||
481 | } | ||
482 | |||
483 | static ssize_t sleep_timeout_show(struct device *dev, | ||
484 | struct device_attribute *attr, | ||
440 | char *buf) | 485 | char *buf) |
441 | { | 486 | { |
442 | return sprintf(buf, "%u\n", sleep_timeout / HZ); | 487 | struct platform_device *pdev = container_of(dev, |
488 | struct platform_device, dev); | ||
489 | struct omap_uart_state *uart = container_of(pdev, | ||
490 | struct omap_uart_state, pdev); | ||
491 | |||
492 | return sprintf(buf, "%u\n", uart->timeout / HZ); | ||
443 | } | 493 | } |
444 | 494 | ||
445 | static ssize_t sleep_timeout_store(struct kobject *kobj, | 495 | static ssize_t sleep_timeout_store(struct device *dev, |
446 | struct kobj_attribute *attr, | 496 | struct device_attribute *attr, |
447 | const char *buf, size_t n) | 497 | const char *buf, size_t n) |
448 | { | 498 | { |
449 | struct omap_uart_state *uart; | 499 | struct platform_device *pdev = container_of(dev, |
500 | struct platform_device, dev); | ||
501 | struct omap_uart_state *uart = container_of(pdev, | ||
502 | struct omap_uart_state, pdev); | ||
450 | unsigned int value; | 503 | unsigned int value; |
451 | 504 | ||
452 | if (sscanf(buf, "%u", &value) != 1) { | 505 | if (sscanf(buf, "%u", &value) != 1) { |
453 | printk(KERN_ERR "sleep_timeout_store: Invalid value\n"); | 506 | printk(KERN_ERR "sleep_timeout_store: Invalid value\n"); |
454 | return -EINVAL; | 507 | return -EINVAL; |
455 | } | 508 | } |
456 | sleep_timeout = value * HZ; | 509 | |
457 | list_for_each_entry(uart, &uart_list, node) { | 510 | uart->timeout = value * HZ; |
458 | uart->timeout = sleep_timeout; | 511 | if (uart->timeout) |
459 | if (uart->timeout) | 512 | mod_timer(&uart->timer, jiffies + uart->timeout); |
460 | mod_timer(&uart->timer, jiffies + uart->timeout); | 513 | else |
461 | else | 514 | /* A zero value means disable timeout feature */ |
462 | /* A zero value means disable timeout feature */ | 515 | omap_uart_block_sleep(uart); |
463 | omap_uart_block_sleep(uart); | 516 | |
464 | } | ||
465 | return n; | 517 | return n; |
466 | } | 518 | } |
467 | 519 | ||
468 | static struct kobj_attribute sleep_timeout_attr = | 520 | DEVICE_ATTR(sleep_timeout, 0644, sleep_timeout_show, sleep_timeout_store); |
469 | __ATTR(sleep_timeout, 0644, sleep_timeout_show, sleep_timeout_store); | 521 | #define DEV_CREATE_FILE(dev, attr) WARN_ON(device_create_file(dev, attr)) |
470 | |||
471 | #else | 522 | #else |
472 | static inline void omap_uart_idle_init(struct omap_uart_state *uart) {} | 523 | static inline void omap_uart_idle_init(struct omap_uart_state *uart) {} |
524 | #define DEV_CREATE_FILE(dev, attr) | ||
473 | #endif /* CONFIG_PM */ | 525 | #endif /* CONFIG_PM */ |
474 | 526 | ||
475 | static struct platform_device serial_device = { | 527 | static struct omap_uart_state omap_uart[OMAP_MAX_NR_PORTS] = { |
476 | .name = "serial8250", | 528 | { |
477 | .id = PLAT8250_DEV_PLATFORM, | 529 | .pdev = { |
478 | .dev = { | 530 | .name = "serial8250", |
479 | .platform_data = serial_platform_data, | 531 | .id = PLAT8250_DEV_PLATFORM, |
532 | .dev = { | ||
533 | .platform_data = serial_platform_data0, | ||
534 | }, | ||
535 | }, | ||
536 | }, { | ||
537 | .pdev = { | ||
538 | .name = "serial8250", | ||
539 | .id = PLAT8250_DEV_PLATFORM1, | ||
540 | .dev = { | ||
541 | .platform_data = serial_platform_data1, | ||
542 | }, | ||
543 | }, | ||
544 | }, { | ||
545 | .pdev = { | ||
546 | .name = "serial8250", | ||
547 | .id = PLAT8250_DEV_PLATFORM2, | ||
548 | .dev = { | ||
549 | .platform_data = serial_platform_data2, | ||
550 | }, | ||
551 | }, | ||
480 | }, | 552 | }, |
481 | }; | 553 | }; |
482 | 554 | ||
483 | void __init omap_serial_init(void) | 555 | void __init omap_serial_init(void) |
484 | { | 556 | { |
485 | int i, err; | 557 | int i; |
486 | const struct omap_uart_config *info; | 558 | const struct omap_uart_config *info; |
487 | char name[16]; | 559 | char name[16]; |
488 | 560 | ||
@@ -496,14 +568,12 @@ void __init omap_serial_init(void) | |||
496 | 568 | ||
497 | if (info == NULL) | 569 | if (info == NULL) |
498 | return; | 570 | return; |
499 | if (cpu_is_omap44xx()) { | ||
500 | for (i = 0; i < OMAP_MAX_NR_PORTS; i++) | ||
501 | serial_platform_data[i].irq += 32; | ||
502 | } | ||
503 | 571 | ||
504 | for (i = 0; i < OMAP_MAX_NR_PORTS; i++) { | 572 | for (i = 0; i < OMAP_MAX_NR_PORTS; i++) { |
505 | struct plat_serial8250_port *p = serial_platform_data + i; | ||
506 | struct omap_uart_state *uart = &omap_uart[i]; | 573 | struct omap_uart_state *uart = &omap_uart[i]; |
574 | struct platform_device *pdev = &uart->pdev; | ||
575 | struct device *dev = &pdev->dev; | ||
576 | struct plat_serial8250_port *p = dev->platform_data; | ||
507 | 577 | ||
508 | if (!(info->enabled_uarts & (1 << i))) { | 578 | if (!(info->enabled_uarts & (1 << i))) { |
509 | p->membase = NULL; | 579 | p->membase = NULL; |
@@ -531,20 +601,21 @@ void __init omap_serial_init(void) | |||
531 | uart->num = i; | 601 | uart->num = i; |
532 | p->private_data = uart; | 602 | p->private_data = uart; |
533 | uart->p = p; | 603 | uart->p = p; |
534 | list_add(&uart->node, &uart_list); | 604 | list_add_tail(&uart->node, &uart_list); |
605 | |||
606 | if (cpu_is_omap44xx()) | ||
607 | p->irq += 32; | ||
535 | 608 | ||
536 | omap_uart_enable_clocks(uart); | 609 | omap_uart_enable_clocks(uart); |
537 | omap_uart_reset(uart); | 610 | omap_uart_reset(uart); |
538 | omap_uart_idle_init(uart); | 611 | omap_uart_idle_init(uart); |
539 | } | ||
540 | |||
541 | err = platform_device_register(&serial_device); | ||
542 | |||
543 | #ifdef CONFIG_PM | ||
544 | if (!err) | ||
545 | err = sysfs_create_file(&serial_device.dev.kobj, | ||
546 | &sleep_timeout_attr.attr); | ||
547 | #endif | ||
548 | 612 | ||
613 | if (WARN_ON(platform_device_register(pdev))) | ||
614 | continue; | ||
615 | if ((cpu_is_omap34xx() && uart->padconf) || | ||
616 | (uart->wk_en && uart->wk_mask)) { | ||
617 | device_init_wakeup(dev, true); | ||
618 | DEV_CREATE_FILE(dev, &dev_attr_sleep_timeout); | ||
619 | } | ||
620 | } | ||
549 | } | 621 | } |
550 | |||
diff --git a/arch/arm/mach-omap2/sram34xx.S b/arch/arm/mach-omap2/sram34xx.S index f41f8d96ddba..82aa4a3d160c 100644 --- a/arch/arm/mach-omap2/sram34xx.S +++ b/arch/arm/mach-omap2/sram34xx.S | |||
@@ -36,7 +36,7 @@ | |||
36 | 36 | ||
37 | .text | 37 | .text |
38 | 38 | ||
39 | /* r4 parameters */ | 39 | /* r1 parameters */ |
40 | #define SDRC_NO_UNLOCK_DLL 0x0 | 40 | #define SDRC_NO_UNLOCK_DLL 0x0 |
41 | #define SDRC_UNLOCK_DLL 0x1 | 41 | #define SDRC_UNLOCK_DLL 0x1 |
42 | 42 | ||
@@ -58,7 +58,6 @@ | |||
58 | 58 | ||
59 | /* SDRC_POWER bit settings */ | 59 | /* SDRC_POWER bit settings */ |
60 | #define SRFRONIDLEREQ_MASK 0x40 | 60 | #define SRFRONIDLEREQ_MASK 0x40 |
61 | #define PWDENA_MASK 0x4 | ||
62 | 61 | ||
63 | /* CM_IDLEST1_CORE bit settings */ | 62 | /* CM_IDLEST1_CORE bit settings */ |
64 | #define ST_SDRC_MASK 0x2 | 63 | #define ST_SDRC_MASK 0x2 |
@@ -71,41 +70,72 @@ | |||
71 | 70 | ||
72 | /* | 71 | /* |
73 | * omap3_sram_configure_core_dpll - change DPLL3 M2 divider | 72 | * omap3_sram_configure_core_dpll - change DPLL3 M2 divider |
74 | * r0 = new SDRC_RFR_CTRL register contents | 73 | * |
75 | * r1 = new SDRC_ACTIM_CTRLA register contents | 74 | * Params passed in registers: |
76 | * r2 = new SDRC_ACTIM_CTRLB register contents | 75 | * r0 = new M2 divider setting (only 1 and 2 supported right now) |
77 | * r3 = new M2 divider setting (only 1 and 2 supported right now) | 76 | * r1 = unlock SDRC DLL? (1 = yes, 0 = no). Only unlock DLL for |
78 | * r4 = unlock SDRC DLL? (1 = yes, 0 = no). Only unlock DLL for | ||
79 | * SDRC rates < 83MHz | 77 | * SDRC rates < 83MHz |
80 | * r5 = number of MPU cycles to wait for SDRC to stabilize after | 78 | * r2 = number of MPU cycles to wait for SDRC to stabilize after |
81 | * reprogramming the SDRC when switching to a slower MPU speed | 79 | * reprogramming the SDRC when switching to a slower MPU speed |
82 | * r6 = new SDRC_MR_0 register value | 80 | * r3 = increasing SDRC rate? (1 = yes, 0 = no) |
83 | * r7 = increasing SDRC rate? (1 = yes, 0 = no) | 81 | * |
82 | * Params passed via the stack. The needed params will be copied in SRAM | ||
83 | * before use by the code in SRAM (SDRAM is not accessible during SDRC | ||
84 | * reconfiguration): | ||
85 | * new SDRC_RFR_CTRL_0 register contents | ||
86 | * new SDRC_ACTIM_CTRL_A_0 register contents | ||
87 | * new SDRC_ACTIM_CTRL_B_0 register contents | ||
88 | * new SDRC_MR_0 register value | ||
89 | * new SDRC_RFR_CTRL_1 register contents | ||
90 | * new SDRC_ACTIM_CTRL_A_1 register contents | ||
91 | * new SDRC_ACTIM_CTRL_B_1 register contents | ||
92 | * new SDRC_MR_1 register value | ||
84 | * | 93 | * |
94 | * If the param SDRC_RFR_CTRL_1 is 0, the parameters | ||
95 | * are not programmed into the SDRC CS1 registers | ||
85 | */ | 96 | */ |
86 | ENTRY(omap3_sram_configure_core_dpll) | 97 | ENTRY(omap3_sram_configure_core_dpll) |
87 | stmfd sp!, {r1-r12, lr} @ store regs to stack | 98 | stmfd sp!, {r1-r12, lr} @ store regs to stack |
88 | ldr r4, [sp, #52] @ pull extra args off the stack | 99 | |
89 | ldr r5, [sp, #56] @ load extra args from the stack | 100 | @ pull the extra args off the stack |
90 | ldr r6, [sp, #60] @ load extra args from the stack | 101 | @ and store them in SRAM |
91 | ldr r7, [sp, #64] @ load extra args from the stack | 102 | ldr r4, [sp, #52] |
103 | str r4, omap_sdrc_rfr_ctrl_0_val | ||
104 | ldr r4, [sp, #56] | ||
105 | str r4, omap_sdrc_actim_ctrl_a_0_val | ||
106 | ldr r4, [sp, #60] | ||
107 | str r4, omap_sdrc_actim_ctrl_b_0_val | ||
108 | ldr r4, [sp, #64] | ||
109 | str r4, omap_sdrc_mr_0_val | ||
110 | ldr r4, [sp, #68] | ||
111 | str r4, omap_sdrc_rfr_ctrl_1_val | ||
112 | cmp r4, #0 @ if SDRC_RFR_CTRL_1 is 0, | ||
113 | beq skip_cs1_params @ do not use cs1 params | ||
114 | ldr r4, [sp, #72] | ||
115 | str r4, omap_sdrc_actim_ctrl_a_1_val | ||
116 | ldr r4, [sp, #76] | ||
117 | str r4, omap_sdrc_actim_ctrl_b_1_val | ||
118 | ldr r4, [sp, #80] | ||
119 | str r4, omap_sdrc_mr_1_val | ||
120 | skip_cs1_params: | ||
92 | dsb @ flush buffered writes to interconnect | 121 | dsb @ flush buffered writes to interconnect |
93 | cmp r7, #1 @ if increasing SDRC clk rate, | 122 | |
123 | cmp r3, #1 @ if increasing SDRC clk rate, | ||
94 | bleq configure_sdrc @ program the SDRC regs early (for RFR) | 124 | bleq configure_sdrc @ program the SDRC regs early (for RFR) |
95 | cmp r4, #SDRC_UNLOCK_DLL @ set the intended DLL state | 125 | cmp r1, #SDRC_UNLOCK_DLL @ set the intended DLL state |
96 | bleq unlock_dll | 126 | bleq unlock_dll |
97 | blne lock_dll | 127 | blne lock_dll |
98 | bl sdram_in_selfrefresh @ put SDRAM in self refresh, idle SDRC | 128 | bl sdram_in_selfrefresh @ put SDRAM in self refresh, idle SDRC |
99 | bl configure_core_dpll @ change the DPLL3 M2 divider | 129 | bl configure_core_dpll @ change the DPLL3 M2 divider |
130 | mov r12, r2 | ||
131 | bl wait_clk_stable @ wait for SDRC to stabilize | ||
100 | bl enable_sdrc @ take SDRC out of idle | 132 | bl enable_sdrc @ take SDRC out of idle |
101 | cmp r4, #SDRC_UNLOCK_DLL @ wait for DLL status to change | 133 | cmp r1, #SDRC_UNLOCK_DLL @ wait for DLL status to change |
102 | bleq wait_dll_unlock | 134 | bleq wait_dll_unlock |
103 | blne wait_dll_lock | 135 | blne wait_dll_lock |
104 | cmp r7, #1 @ if increasing SDRC clk rate, | 136 | cmp r3, #1 @ if increasing SDRC clk rate, |
105 | beq return_to_sdram @ return to SDRAM code, otherwise, | 137 | beq return_to_sdram @ return to SDRAM code, otherwise, |
106 | bl configure_sdrc @ reprogram SDRC regs now | 138 | bl configure_sdrc @ reprogram SDRC regs now |
107 | mov r12, r5 | ||
108 | bl wait_clk_stable @ wait for SDRC to stabilize | ||
109 | return_to_sdram: | 139 | return_to_sdram: |
110 | isb @ prevent speculative exec past here | 140 | isb @ prevent speculative exec past here |
111 | mov r0, #0 @ return value | 141 | mov r0, #0 @ return value |
@@ -113,7 +143,7 @@ return_to_sdram: | |||
113 | unlock_dll: | 143 | unlock_dll: |
114 | ldr r11, omap3_sdrc_dlla_ctrl | 144 | ldr r11, omap3_sdrc_dlla_ctrl |
115 | ldr r12, [r11] | 145 | ldr r12, [r11] |
116 | and r12, r12, #FIXEDDELAY_MASK | 146 | bic r12, r12, #FIXEDDELAY_MASK |
117 | orr r12, r12, #FIXEDDELAY_DEFAULT | 147 | orr r12, r12, #FIXEDDELAY_DEFAULT |
118 | orr r12, r12, #DLLIDLE_MASK | 148 | orr r12, r12, #DLLIDLE_MASK |
119 | str r12, [r11] @ (no OCP barrier needed) | 149 | str r12, [r11] @ (no OCP barrier needed) |
@@ -129,7 +159,6 @@ sdram_in_selfrefresh: | |||
129 | ldr r12, [r11] @ read the contents of SDRC_POWER | 159 | ldr r12, [r11] @ read the contents of SDRC_POWER |
130 | mov r9, r12 @ keep a copy of SDRC_POWER bits | 160 | mov r9, r12 @ keep a copy of SDRC_POWER bits |
131 | orr r12, r12, #SRFRONIDLEREQ_MASK @ enable self refresh on idle | 161 | orr r12, r12, #SRFRONIDLEREQ_MASK @ enable self refresh on idle |
132 | bic r12, r12, #PWDENA_MASK @ clear PWDENA | ||
133 | str r12, [r11] @ write back to SDRC_POWER register | 162 | str r12, [r11] @ write back to SDRC_POWER register |
134 | ldr r12, [r11] @ posted-write barrier for SDRC | 163 | ldr r12, [r11] @ posted-write barrier for SDRC |
135 | idle_sdrc: | 164 | idle_sdrc: |
@@ -149,7 +178,7 @@ configure_core_dpll: | |||
149 | ldr r12, [r11] | 178 | ldr r12, [r11] |
150 | ldr r10, core_m2_mask_val @ modify m2 for core dpll | 179 | ldr r10, core_m2_mask_val @ modify m2 for core dpll |
151 | and r12, r12, r10 | 180 | and r12, r12, r10 |
152 | orr r12, r12, r3, lsl #CORE_DPLL_CLKOUT_DIV_SHIFT | 181 | orr r12, r12, r0, lsl #CORE_DPLL_CLKOUT_DIV_SHIFT |
153 | str r12, [r11] | 182 | str r12, [r11] |
154 | ldr r12, [r11] @ posted-write barrier for CM | 183 | ldr r12, [r11] @ posted-write barrier for CM |
155 | bx lr | 184 | bx lr |
@@ -187,15 +216,34 @@ wait_dll_unlock: | |||
187 | bne wait_dll_unlock | 216 | bne wait_dll_unlock |
188 | bx lr | 217 | bx lr |
189 | configure_sdrc: | 218 | configure_sdrc: |
190 | ldr r11, omap3_sdrc_rfr_ctrl | 219 | ldr r12, omap_sdrc_rfr_ctrl_0_val @ fetch value from SRAM |
191 | str r0, [r11] | 220 | ldr r11, omap3_sdrc_rfr_ctrl_0 @ fetch addr from SRAM |
192 | ldr r11, omap3_sdrc_actim_ctrla | 221 | str r12, [r11] @ store |
193 | str r1, [r11] | 222 | ldr r12, omap_sdrc_actim_ctrl_a_0_val |
194 | ldr r11, omap3_sdrc_actim_ctrlb | 223 | ldr r11, omap3_sdrc_actim_ctrl_a_0 |
195 | str r2, [r11] | 224 | str r12, [r11] |
225 | ldr r12, omap_sdrc_actim_ctrl_b_0_val | ||
226 | ldr r11, omap3_sdrc_actim_ctrl_b_0 | ||
227 | str r12, [r11] | ||
228 | ldr r12, omap_sdrc_mr_0_val | ||
196 | ldr r11, omap3_sdrc_mr_0 | 229 | ldr r11, omap3_sdrc_mr_0 |
197 | str r6, [r11] | 230 | str r12, [r11] |
198 | ldr r6, [r11] @ posted-write barrier for SDRC | 231 | ldr r12, omap_sdrc_rfr_ctrl_1_val |
232 | cmp r12, #0 @ if SDRC_RFR_CTRL_1 is 0, | ||
233 | beq skip_cs1_prog @ do not program cs1 params | ||
234 | ldr r11, omap3_sdrc_rfr_ctrl_1 | ||
235 | str r12, [r11] | ||
236 | ldr r12, omap_sdrc_actim_ctrl_a_1_val | ||
237 | ldr r11, omap3_sdrc_actim_ctrl_a_1 | ||
238 | str r12, [r11] | ||
239 | ldr r12, omap_sdrc_actim_ctrl_b_1_val | ||
240 | ldr r11, omap3_sdrc_actim_ctrl_b_1 | ||
241 | str r12, [r11] | ||
242 | ldr r12, omap_sdrc_mr_1_val | ||
243 | ldr r11, omap3_sdrc_mr_1 | ||
244 | str r12, [r11] | ||
245 | skip_cs1_prog: | ||
246 | ldr r12, [r11] @ posted-write barrier for SDRC | ||
199 | bx lr | 247 | bx lr |
200 | 248 | ||
201 | omap3_sdrc_power: | 249 | omap3_sdrc_power: |
@@ -206,14 +254,40 @@ omap3_cm_idlest1_core: | |||
206 | .word OMAP34XX_CM_REGADDR(CORE_MOD, CM_IDLEST) | 254 | .word OMAP34XX_CM_REGADDR(CORE_MOD, CM_IDLEST) |
207 | omap3_cm_iclken1_core: | 255 | omap3_cm_iclken1_core: |
208 | .word OMAP34XX_CM_REGADDR(CORE_MOD, CM_ICLKEN1) | 256 | .word OMAP34XX_CM_REGADDR(CORE_MOD, CM_ICLKEN1) |
209 | omap3_sdrc_rfr_ctrl: | 257 | |
258 | omap3_sdrc_rfr_ctrl_0: | ||
210 | .word OMAP34XX_SDRC_REGADDR(SDRC_RFR_CTRL_0) | 259 | .word OMAP34XX_SDRC_REGADDR(SDRC_RFR_CTRL_0) |
211 | omap3_sdrc_actim_ctrla: | 260 | omap3_sdrc_rfr_ctrl_1: |
261 | .word OMAP34XX_SDRC_REGADDR(SDRC_RFR_CTRL_1) | ||
262 | omap3_sdrc_actim_ctrl_a_0: | ||
212 | .word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_A_0) | 263 | .word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_A_0) |
213 | omap3_sdrc_actim_ctrlb: | 264 | omap3_sdrc_actim_ctrl_a_1: |
265 | .word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_A_1) | ||
266 | omap3_sdrc_actim_ctrl_b_0: | ||
214 | .word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_B_0) | 267 | .word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_B_0) |
268 | omap3_sdrc_actim_ctrl_b_1: | ||
269 | .word OMAP34XX_SDRC_REGADDR(SDRC_ACTIM_CTRL_B_1) | ||
215 | omap3_sdrc_mr_0: | 270 | omap3_sdrc_mr_0: |
216 | .word OMAP34XX_SDRC_REGADDR(SDRC_MR_0) | 271 | .word OMAP34XX_SDRC_REGADDR(SDRC_MR_0) |
272 | omap3_sdrc_mr_1: | ||
273 | .word OMAP34XX_SDRC_REGADDR(SDRC_MR_1) | ||
274 | omap_sdrc_rfr_ctrl_0_val: | ||
275 | .word 0xDEADBEEF | ||
276 | omap_sdrc_rfr_ctrl_1_val: | ||
277 | .word 0xDEADBEEF | ||
278 | omap_sdrc_actim_ctrl_a_0_val: | ||
279 | .word 0xDEADBEEF | ||
280 | omap_sdrc_actim_ctrl_a_1_val: | ||
281 | .word 0xDEADBEEF | ||
282 | omap_sdrc_actim_ctrl_b_0_val: | ||
283 | .word 0xDEADBEEF | ||
284 | omap_sdrc_actim_ctrl_b_1_val: | ||
285 | .word 0xDEADBEEF | ||
286 | omap_sdrc_mr_0_val: | ||
287 | .word 0xDEADBEEF | ||
288 | omap_sdrc_mr_1_val: | ||
289 | .word 0xDEADBEEF | ||
290 | |||
217 | omap3_sdrc_dlla_status: | 291 | omap3_sdrc_dlla_status: |
218 | .word OMAP34XX_SDRC_REGADDR(SDRC_DLLA_STATUS) | 292 | .word OMAP34XX_SDRC_REGADDR(SDRC_DLLA_STATUS) |
219 | omap3_sdrc_dlla_ctrl: | 293 | omap3_sdrc_dlla_ctrl: |
@@ -223,3 +297,4 @@ core_m2_mask_val: | |||
223 | 297 | ||
224 | ENTRY(omap3_sram_configure_core_dpll_sz) | 298 | ENTRY(omap3_sram_configure_core_dpll_sz) |
225 | .word . - omap3_sram_configure_core_dpll | 299 | .word . - omap3_sram_configure_core_dpll |
300 | |||
diff --git a/arch/arm/mach-u300/core.c b/arch/arm/mach-u300/core.c index 7936085dd758..2e9b8ccd8ec2 100644 --- a/arch/arm/mach-u300/core.c +++ b/arch/arm/mach-u300/core.c | |||
@@ -510,7 +510,7 @@ static struct db_chip db_chips[] __initdata = { | |||
510 | } | 510 | } |
511 | }; | 511 | }; |
512 | 512 | ||
513 | static void u300_init_check_chip(void) | 513 | static void __init u300_init_check_chip(void) |
514 | { | 514 | { |
515 | 515 | ||
516 | u16 val; | 516 | u16 val; |
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 8277802ec859..3a7279c1ce5e 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -120,6 +120,32 @@ void show_mem(void) | |||
120 | printk("%d pages swap cached\n", cached); | 120 | printk("%d pages swap cached\n", cached); |
121 | } | 121 | } |
122 | 122 | ||
123 | static void __init find_node_limits(int node, struct meminfo *mi, | ||
124 | unsigned long *min, unsigned long *max_low, unsigned long *max_high) | ||
125 | { | ||
126 | int i; | ||
127 | |||
128 | *min = -1UL; | ||
129 | *max_low = *max_high = 0; | ||
130 | |||
131 | for_each_nodebank(i, mi, node) { | ||
132 | struct membank *bank = &mi->bank[i]; | ||
133 | unsigned long start, end; | ||
134 | |||
135 | start = bank_pfn_start(bank); | ||
136 | end = bank_pfn_end(bank); | ||
137 | |||
138 | if (*min > start) | ||
139 | *min = start; | ||
140 | if (*max_high < end) | ||
141 | *max_high = end; | ||
142 | if (bank->highmem) | ||
143 | continue; | ||
144 | if (*max_low < end) | ||
145 | *max_low = end; | ||
146 | } | ||
147 | } | ||
148 | |||
123 | /* | 149 | /* |
124 | * FIXME: We really want to avoid allocating the bootmap bitmap | 150 | * FIXME: We really want to avoid allocating the bootmap bitmap |
125 | * over the top of the initrd. Hopefully, this is located towards | 151 | * over the top of the initrd. Hopefully, this is located towards |
@@ -210,41 +236,25 @@ static inline void map_memory_bank(struct membank *bank) | |||
210 | #endif | 236 | #endif |
211 | } | 237 | } |
212 | 238 | ||
213 | static unsigned long __init bootmem_init_node(int node, struct meminfo *mi) | 239 | static void __init bootmem_init_node(int node, struct meminfo *mi, |
240 | unsigned long start_pfn, unsigned long end_pfn) | ||
214 | { | 241 | { |
215 | unsigned long start_pfn, end_pfn, boot_pfn; | 242 | unsigned long boot_pfn; |
216 | unsigned int boot_pages; | 243 | unsigned int boot_pages; |
217 | pg_data_t *pgdat; | 244 | pg_data_t *pgdat; |
218 | int i; | 245 | int i; |
219 | 246 | ||
220 | start_pfn = -1UL; | ||
221 | end_pfn = 0; | ||
222 | |||
223 | /* | 247 | /* |
224 | * Calculate the pfn range, and map the memory banks for this node. | 248 | * Map the memory banks for this node. |
225 | */ | 249 | */ |
226 | for_each_nodebank(i, mi, node) { | 250 | for_each_nodebank(i, mi, node) { |
227 | struct membank *bank = &mi->bank[i]; | 251 | struct membank *bank = &mi->bank[i]; |
228 | unsigned long start, end; | ||
229 | 252 | ||
230 | start = bank_pfn_start(bank); | 253 | if (!bank->highmem) |
231 | end = bank_pfn_end(bank); | 254 | map_memory_bank(bank); |
232 | |||
233 | if (start_pfn > start) | ||
234 | start_pfn = start; | ||
235 | if (end_pfn < end) | ||
236 | end_pfn = end; | ||
237 | |||
238 | map_memory_bank(bank); | ||
239 | } | 255 | } |
240 | 256 | ||
241 | /* | 257 | /* |
242 | * If there is no memory in this node, ignore it. | ||
243 | */ | ||
244 | if (end_pfn == 0) | ||
245 | return end_pfn; | ||
246 | |||
247 | /* | ||
248 | * Allocate the bootmem bitmap page. | 258 | * Allocate the bootmem bitmap page. |
249 | */ | 259 | */ |
250 | boot_pages = bootmem_bootmap_pages(end_pfn - start_pfn); | 260 | boot_pages = bootmem_bootmap_pages(end_pfn - start_pfn); |
@@ -260,7 +270,8 @@ static unsigned long __init bootmem_init_node(int node, struct meminfo *mi) | |||
260 | 270 | ||
261 | for_each_nodebank(i, mi, node) { | 271 | for_each_nodebank(i, mi, node) { |
262 | struct membank *bank = &mi->bank[i]; | 272 | struct membank *bank = &mi->bank[i]; |
263 | free_bootmem_node(pgdat, bank_phys_start(bank), bank_phys_size(bank)); | 273 | if (!bank->highmem) |
274 | free_bootmem_node(pgdat, bank_phys_start(bank), bank_phys_size(bank)); | ||
264 | memory_present(node, bank_pfn_start(bank), bank_pfn_end(bank)); | 275 | memory_present(node, bank_pfn_start(bank), bank_pfn_end(bank)); |
265 | } | 276 | } |
266 | 277 | ||
@@ -269,8 +280,6 @@ static unsigned long __init bootmem_init_node(int node, struct meminfo *mi) | |||
269 | */ | 280 | */ |
270 | reserve_bootmem_node(pgdat, boot_pfn << PAGE_SHIFT, | 281 | reserve_bootmem_node(pgdat, boot_pfn << PAGE_SHIFT, |
271 | boot_pages << PAGE_SHIFT, BOOTMEM_DEFAULT); | 282 | boot_pages << PAGE_SHIFT, BOOTMEM_DEFAULT); |
272 | |||
273 | return end_pfn; | ||
274 | } | 283 | } |
275 | 284 | ||
276 | static void __init bootmem_reserve_initrd(int node) | 285 | static void __init bootmem_reserve_initrd(int node) |
@@ -297,33 +306,39 @@ static void __init bootmem_reserve_initrd(int node) | |||
297 | static void __init bootmem_free_node(int node, struct meminfo *mi) | 306 | static void __init bootmem_free_node(int node, struct meminfo *mi) |
298 | { | 307 | { |
299 | unsigned long zone_size[MAX_NR_ZONES], zhole_size[MAX_NR_ZONES]; | 308 | unsigned long zone_size[MAX_NR_ZONES], zhole_size[MAX_NR_ZONES]; |
300 | unsigned long start_pfn, end_pfn; | 309 | unsigned long min, max_low, max_high; |
301 | pg_data_t *pgdat = NODE_DATA(node); | ||
302 | int i; | 310 | int i; |
303 | 311 | ||
304 | start_pfn = pgdat->bdata->node_min_pfn; | 312 | find_node_limits(node, mi, &min, &max_low, &max_high); |
305 | end_pfn = pgdat->bdata->node_low_pfn; | ||
306 | 313 | ||
307 | /* | 314 | /* |
308 | * initialise the zones within this node. | 315 | * initialise the zones within this node. |
309 | */ | 316 | */ |
310 | memset(zone_size, 0, sizeof(zone_size)); | 317 | memset(zone_size, 0, sizeof(zone_size)); |
311 | memset(zhole_size, 0, sizeof(zhole_size)); | ||
312 | 318 | ||
313 | /* | 319 | /* |
314 | * The size of this node has already been determined. If we need | 320 | * The size of this node has already been determined. If we need |
315 | * to do anything fancy with the allocation of this memory to the | 321 | * to do anything fancy with the allocation of this memory to the |
316 | * zones, now is the time to do it. | 322 | * zones, now is the time to do it. |
317 | */ | 323 | */ |
318 | zone_size[0] = end_pfn - start_pfn; | 324 | zone_size[0] = max_low - min; |
325 | #ifdef CONFIG_HIGHMEM | ||
326 | zone_size[ZONE_HIGHMEM] = max_high - max_low; | ||
327 | #endif | ||
319 | 328 | ||
320 | /* | 329 | /* |
321 | * For each bank in this node, calculate the size of the holes. | 330 | * For each bank in this node, calculate the size of the holes. |
322 | * holes = node_size - sum(bank_sizes_in_node) | 331 | * holes = node_size - sum(bank_sizes_in_node) |
323 | */ | 332 | */ |
324 | zhole_size[0] = zone_size[0]; | 333 | memcpy(zhole_size, zone_size, sizeof(zhole_size)); |
325 | for_each_nodebank(i, mi, node) | 334 | for_each_nodebank(i, mi, node) { |
326 | zhole_size[0] -= bank_pfn_size(&mi->bank[i]); | 335 | int idx = 0; |
336 | #ifdef CONFIG_HIGHMEM | ||
337 | if (mi->bank[i].highmem) | ||
338 | idx = ZONE_HIGHMEM; | ||
339 | #endif | ||
340 | zhole_size[idx] -= bank_pfn_size(&mi->bank[i]); | ||
341 | } | ||
327 | 342 | ||
328 | /* | 343 | /* |
329 | * Adjust the sizes according to any special requirements for | 344 | * Adjust the sizes according to any special requirements for |
@@ -331,13 +346,13 @@ static void __init bootmem_free_node(int node, struct meminfo *mi) | |||
331 | */ | 346 | */ |
332 | arch_adjust_zones(node, zone_size, zhole_size); | 347 | arch_adjust_zones(node, zone_size, zhole_size); |
333 | 348 | ||
334 | free_area_init_node(node, zone_size, start_pfn, zhole_size); | 349 | free_area_init_node(node, zone_size, min, zhole_size); |
335 | } | 350 | } |
336 | 351 | ||
337 | void __init bootmem_init(void) | 352 | void __init bootmem_init(void) |
338 | { | 353 | { |
339 | struct meminfo *mi = &meminfo; | 354 | struct meminfo *mi = &meminfo; |
340 | unsigned long memend_pfn = 0; | 355 | unsigned long min, max_low, max_high; |
341 | int node, initrd_node; | 356 | int node, initrd_node; |
342 | 357 | ||
343 | /* | 358 | /* |
@@ -345,11 +360,29 @@ void __init bootmem_init(void) | |||
345 | */ | 360 | */ |
346 | initrd_node = check_initrd(mi); | 361 | initrd_node = check_initrd(mi); |
347 | 362 | ||
363 | max_low = max_high = 0; | ||
364 | |||
348 | /* | 365 | /* |
349 | * Run through each node initialising the bootmem allocator. | 366 | * Run through each node initialising the bootmem allocator. |
350 | */ | 367 | */ |
351 | for_each_node(node) { | 368 | for_each_node(node) { |
352 | unsigned long end_pfn = bootmem_init_node(node, mi); | 369 | unsigned long node_low, node_high; |
370 | |||
371 | find_node_limits(node, mi, &min, &node_low, &node_high); | ||
372 | |||
373 | if (node_low > max_low) | ||
374 | max_low = node_low; | ||
375 | if (node_high > max_high) | ||
376 | max_high = node_high; | ||
377 | |||
378 | /* | ||
379 | * If there is no memory in this node, ignore it. | ||
380 | * (We can't have nodes which have no lowmem) | ||
381 | */ | ||
382 | if (node_low == 0) | ||
383 | continue; | ||
384 | |||
385 | bootmem_init_node(node, mi, min, node_low); | ||
353 | 386 | ||
354 | /* | 387 | /* |
355 | * Reserve any special node zero regions. | 388 | * Reserve any special node zero regions. |
@@ -362,12 +395,6 @@ void __init bootmem_init(void) | |||
362 | */ | 395 | */ |
363 | if (node == initrd_node) | 396 | if (node == initrd_node) |
364 | bootmem_reserve_initrd(node); | 397 | bootmem_reserve_initrd(node); |
365 | |||
366 | /* | ||
367 | * Remember the highest memory PFN. | ||
368 | */ | ||
369 | if (end_pfn > memend_pfn) | ||
370 | memend_pfn = end_pfn; | ||
371 | } | 398 | } |
372 | 399 | ||
373 | /* | 400 | /* |
@@ -383,7 +410,7 @@ void __init bootmem_init(void) | |||
383 | for_each_node(node) | 410 | for_each_node(node) |
384 | bootmem_free_node(node, mi); | 411 | bootmem_free_node(node, mi); |
385 | 412 | ||
386 | high_memory = __va((memend_pfn << PAGE_SHIFT) - 1) + 1; | 413 | high_memory = __va((max_low << PAGE_SHIFT) - 1) + 1; |
387 | 414 | ||
388 | /* | 415 | /* |
389 | * This doesn't seem to be used by the Linux memory manager any | 416 | * This doesn't seem to be used by the Linux memory manager any |
@@ -393,7 +420,8 @@ void __init bootmem_init(void) | |||
393 | * Note: max_low_pfn and max_pfn reflect the number of _pages_ in | 420 | * Note: max_low_pfn and max_pfn reflect the number of _pages_ in |
394 | * the system, not the maximum PFN. | 421 | * the system, not the maximum PFN. |
395 | */ | 422 | */ |
396 | max_pfn = max_low_pfn = memend_pfn - PHYS_PFN_OFFSET; | 423 | max_low_pfn = max_low - PHYS_PFN_OFFSET; |
424 | max_pfn = max_high - PHYS_PFN_OFFSET; | ||
397 | } | 425 | } |
398 | 426 | ||
399 | static inline int free_area(unsigned long pfn, unsigned long end, char *s) | 427 | static inline int free_area(unsigned long pfn, unsigned long end, char *s) |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 4722582b17b8..4426ee67ceca 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
@@ -687,13 +687,19 @@ __early_param("vmalloc=", early_vmalloc); | |||
687 | 687 | ||
688 | static void __init sanity_check_meminfo(void) | 688 | static void __init sanity_check_meminfo(void) |
689 | { | 689 | { |
690 | int i, j; | 690 | int i, j, highmem = 0; |
691 | 691 | ||
692 | for (i = 0, j = 0; i < meminfo.nr_banks; i++) { | 692 | for (i = 0, j = 0; i < meminfo.nr_banks; i++) { |
693 | struct membank *bank = &meminfo.bank[j]; | 693 | struct membank *bank = &meminfo.bank[j]; |
694 | *bank = meminfo.bank[i]; | 694 | *bank = meminfo.bank[i]; |
695 | 695 | ||
696 | #ifdef CONFIG_HIGHMEM | 696 | #ifdef CONFIG_HIGHMEM |
697 | if (__va(bank->start) > VMALLOC_MIN || | ||
698 | __va(bank->start) < (void *)PAGE_OFFSET) | ||
699 | highmem = 1; | ||
700 | |||
701 | bank->highmem = highmem; | ||
702 | |||
697 | /* | 703 | /* |
698 | * Split those memory banks which are partially overlapping | 704 | * Split those memory banks which are partially overlapping |
699 | * the vmalloc area greatly simplifying things later. | 705 | * the vmalloc area greatly simplifying things later. |
@@ -714,6 +720,7 @@ static void __init sanity_check_meminfo(void) | |||
714 | i++; | 720 | i++; |
715 | bank[1].size -= VMALLOC_MIN - __va(bank->start); | 721 | bank[1].size -= VMALLOC_MIN - __va(bank->start); |
716 | bank[1].start = __pa(VMALLOC_MIN - 1) + 1; | 722 | bank[1].start = __pa(VMALLOC_MIN - 1) + 1; |
723 | bank[1].highmem = highmem = 1; | ||
717 | j++; | 724 | j++; |
718 | } | 725 | } |
719 | bank->size = VMALLOC_MIN - __va(bank->start); | 726 | bank->size = VMALLOC_MIN - __va(bank->start); |
diff --git a/arch/arm/plat-omap/cpu-omap.c b/arch/arm/plat-omap/cpu-omap.c index 843e8af64066..1868c0d8f9b5 100644 --- a/arch/arm/plat-omap/cpu-omap.c +++ b/arch/arm/plat-omap/cpu-omap.c | |||
@@ -78,10 +78,10 @@ static int omap_target(struct cpufreq_policy *policy, | |||
78 | 78 | ||
79 | /* Ensure desired rate is within allowed range. Some govenors | 79 | /* Ensure desired rate is within allowed range. Some govenors |
80 | * (ondemand) will just pass target_freq=0 to get the minimum. */ | 80 | * (ondemand) will just pass target_freq=0 to get the minimum. */ |
81 | if (target_freq < policy->cpuinfo.min_freq) | 81 | if (target_freq < policy->min) |
82 | target_freq = policy->cpuinfo.min_freq; | 82 | target_freq = policy->min; |
83 | if (target_freq > policy->cpuinfo.max_freq) | 83 | if (target_freq > policy->max) |
84 | target_freq = policy->cpuinfo.max_freq; | 84 | target_freq = policy->max; |
85 | 85 | ||
86 | freqs.old = omap_getspeed(0); | 86 | freqs.old = omap_getspeed(0); |
87 | freqs.new = clk_round_rate(mpu_clk, target_freq * 1000) / 1000; | 87 | freqs.new = clk_round_rate(mpu_clk, target_freq * 1000) / 1000; |
diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c index 7677a4a1cef2..e3ac94f09006 100644 --- a/arch/arm/plat-omap/dma.c +++ b/arch/arm/plat-omap/dma.c | |||
@@ -946,7 +946,9 @@ void omap_start_dma(int lch) | |||
946 | 946 | ||
947 | cur_lch = next_lch; | 947 | cur_lch = next_lch; |
948 | } while (next_lch != -1); | 948 | } while (next_lch != -1); |
949 | } else if (cpu_class_is_omap2()) { | 949 | } else if (cpu_is_omap242x() || |
950 | (cpu_is_omap243x() && omap_type() <= OMAP2430_REV_ES1_0)) { | ||
951 | |||
950 | /* Errata: Need to write lch even if not using chaining */ | 952 | /* Errata: Need to write lch even if not using chaining */ |
951 | dma_write(lch, CLNK_CTRL(lch)); | 953 | dma_write(lch, CLNK_CTRL(lch)); |
952 | } | 954 | } |
diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c index 26b387c12423..9298bc0ab171 100644 --- a/arch/arm/plat-omap/gpio.c +++ b/arch/arm/plat-omap/gpio.c | |||
@@ -476,14 +476,12 @@ static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable) | |||
476 | __raw_writel(l, reg); | 476 | __raw_writel(l, reg); |
477 | } | 477 | } |
478 | 478 | ||
479 | static int __omap_get_gpio_datain(int gpio) | 479 | static int _get_gpio_datain(struct gpio_bank *bank, int gpio) |
480 | { | 480 | { |
481 | struct gpio_bank *bank; | ||
482 | void __iomem *reg; | 481 | void __iomem *reg; |
483 | 482 | ||
484 | if (check_gpio(gpio) < 0) | 483 | if (check_gpio(gpio) < 0) |
485 | return -EINVAL; | 484 | return -EINVAL; |
486 | bank = get_gpio_bank(gpio); | ||
487 | reg = bank->base; | 485 | reg = bank->base; |
488 | switch (bank->method) { | 486 | switch (bank->method) { |
489 | #ifdef CONFIG_ARCH_OMAP1 | 487 | #ifdef CONFIG_ARCH_OMAP1 |
@@ -524,6 +522,53 @@ static int __omap_get_gpio_datain(int gpio) | |||
524 | & (1 << get_gpio_index(gpio))) != 0; | 522 | & (1 << get_gpio_index(gpio))) != 0; |
525 | } | 523 | } |
526 | 524 | ||
525 | static int _get_gpio_dataout(struct gpio_bank *bank, int gpio) | ||
526 | { | ||
527 | void __iomem *reg; | ||
528 | |||
529 | if (check_gpio(gpio) < 0) | ||
530 | return -EINVAL; | ||
531 | reg = bank->base; | ||
532 | |||
533 | switch (bank->method) { | ||
534 | #ifdef CONFIG_ARCH_OMAP1 | ||
535 | case METHOD_MPUIO: | ||
536 | reg += OMAP_MPUIO_OUTPUT; | ||
537 | break; | ||
538 | #endif | ||
539 | #ifdef CONFIG_ARCH_OMAP15XX | ||
540 | case METHOD_GPIO_1510: | ||
541 | reg += OMAP1510_GPIO_DATA_OUTPUT; | ||
542 | break; | ||
543 | #endif | ||
544 | #ifdef CONFIG_ARCH_OMAP16XX | ||
545 | case METHOD_GPIO_1610: | ||
546 | reg += OMAP1610_GPIO_DATAOUT; | ||
547 | break; | ||
548 | #endif | ||
549 | #ifdef CONFIG_ARCH_OMAP730 | ||
550 | case METHOD_GPIO_730: | ||
551 | reg += OMAP730_GPIO_DATA_OUTPUT; | ||
552 | break; | ||
553 | #endif | ||
554 | #ifdef CONFIG_ARCH_OMAP850 | ||
555 | case METHOD_GPIO_850: | ||
556 | reg += OMAP850_GPIO_DATA_OUTPUT; | ||
557 | break; | ||
558 | #endif | ||
559 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ | ||
560 | defined(CONFIG_ARCH_OMAP4) | ||
561 | case METHOD_GPIO_24XX: | ||
562 | reg += OMAP24XX_GPIO_DATAOUT; | ||
563 | break; | ||
564 | #endif | ||
565 | default: | ||
566 | return -EINVAL; | ||
567 | } | ||
568 | |||
569 | return (__raw_readl(reg) & (1 << get_gpio_index(gpio))) != 0; | ||
570 | } | ||
571 | |||
527 | #define MOD_REG_BIT(reg, bit_mask, set) \ | 572 | #define MOD_REG_BIT(reg, bit_mask, set) \ |
528 | do { \ | 573 | do { \ |
529 | int l = __raw_readl(base + reg); \ | 574 | int l = __raw_readl(base + reg); \ |
@@ -1189,6 +1234,7 @@ static void gpio_mask_irq(unsigned int irq) | |||
1189 | struct gpio_bank *bank = get_irq_chip_data(irq); | 1234 | struct gpio_bank *bank = get_irq_chip_data(irq); |
1190 | 1235 | ||
1191 | _set_gpio_irqenable(bank, gpio, 0); | 1236 | _set_gpio_irqenable(bank, gpio, 0); |
1237 | _set_gpio_triggering(bank, get_gpio_index(gpio), IRQ_TYPE_NONE); | ||
1192 | } | 1238 | } |
1193 | 1239 | ||
1194 | static void gpio_unmask_irq(unsigned int irq) | 1240 | static void gpio_unmask_irq(unsigned int irq) |
@@ -1196,6 +1242,11 @@ static void gpio_unmask_irq(unsigned int irq) | |||
1196 | unsigned int gpio = irq - IH_GPIO_BASE; | 1242 | unsigned int gpio = irq - IH_GPIO_BASE; |
1197 | struct gpio_bank *bank = get_irq_chip_data(irq); | 1243 | struct gpio_bank *bank = get_irq_chip_data(irq); |
1198 | unsigned int irq_mask = 1 << get_gpio_index(gpio); | 1244 | unsigned int irq_mask = 1 << get_gpio_index(gpio); |
1245 | struct irq_desc *desc = irq_to_desc(irq); | ||
1246 | u32 trigger = desc->status & IRQ_TYPE_SENSE_MASK; | ||
1247 | |||
1248 | if (trigger) | ||
1249 | _set_gpio_triggering(bank, get_gpio_index(gpio), trigger); | ||
1199 | 1250 | ||
1200 | /* For level-triggered GPIOs, the clearing must be done after | 1251 | /* For level-triggered GPIOs, the clearing must be done after |
1201 | * the HW source is cleared, thus after the handler has run */ | 1252 | * the HW source is cleared, thus after the handler has run */ |
@@ -1350,9 +1401,49 @@ static int gpio_input(struct gpio_chip *chip, unsigned offset) | |||
1350 | return 0; | 1401 | return 0; |
1351 | } | 1402 | } |
1352 | 1403 | ||
1404 | static int gpio_is_input(struct gpio_bank *bank, int mask) | ||
1405 | { | ||
1406 | void __iomem *reg = bank->base; | ||
1407 | |||
1408 | switch (bank->method) { | ||
1409 | case METHOD_MPUIO: | ||
1410 | reg += OMAP_MPUIO_IO_CNTL; | ||
1411 | break; | ||
1412 | case METHOD_GPIO_1510: | ||
1413 | reg += OMAP1510_GPIO_DIR_CONTROL; | ||
1414 | break; | ||
1415 | case METHOD_GPIO_1610: | ||
1416 | reg += OMAP1610_GPIO_DIRECTION; | ||
1417 | break; | ||
1418 | case METHOD_GPIO_730: | ||
1419 | reg += OMAP730_GPIO_DIR_CONTROL; | ||
1420 | break; | ||
1421 | case METHOD_GPIO_850: | ||
1422 | reg += OMAP850_GPIO_DIR_CONTROL; | ||
1423 | break; | ||
1424 | case METHOD_GPIO_24XX: | ||
1425 | reg += OMAP24XX_GPIO_OE; | ||
1426 | break; | ||
1427 | } | ||
1428 | return __raw_readl(reg) & mask; | ||
1429 | } | ||
1430 | |||
1353 | static int gpio_get(struct gpio_chip *chip, unsigned offset) | 1431 | static int gpio_get(struct gpio_chip *chip, unsigned offset) |
1354 | { | 1432 | { |
1355 | return __omap_get_gpio_datain(chip->base + offset); | 1433 | struct gpio_bank *bank; |
1434 | void __iomem *reg; | ||
1435 | int gpio; | ||
1436 | u32 mask; | ||
1437 | |||
1438 | gpio = chip->base + offset; | ||
1439 | bank = get_gpio_bank(gpio); | ||
1440 | reg = bank->base; | ||
1441 | mask = 1 << get_gpio_index(gpio); | ||
1442 | |||
1443 | if (gpio_is_input(bank, mask)) | ||
1444 | return _get_gpio_datain(bank, gpio); | ||
1445 | else | ||
1446 | return _get_gpio_dataout(bank, gpio); | ||
1356 | } | 1447 | } |
1357 | 1448 | ||
1358 | static int gpio_output(struct gpio_chip *chip, unsigned offset, int value) | 1449 | static int gpio_output(struct gpio_chip *chip, unsigned offset, int value) |
@@ -1886,34 +1977,6 @@ arch_initcall(omap_gpio_sysinit); | |||
1886 | #include <linux/debugfs.h> | 1977 | #include <linux/debugfs.h> |
1887 | #include <linux/seq_file.h> | 1978 | #include <linux/seq_file.h> |
1888 | 1979 | ||
1889 | static int gpio_is_input(struct gpio_bank *bank, int mask) | ||
1890 | { | ||
1891 | void __iomem *reg = bank->base; | ||
1892 | |||
1893 | switch (bank->method) { | ||
1894 | case METHOD_MPUIO: | ||
1895 | reg += OMAP_MPUIO_IO_CNTL; | ||
1896 | break; | ||
1897 | case METHOD_GPIO_1510: | ||
1898 | reg += OMAP1510_GPIO_DIR_CONTROL; | ||
1899 | break; | ||
1900 | case METHOD_GPIO_1610: | ||
1901 | reg += OMAP1610_GPIO_DIRECTION; | ||
1902 | break; | ||
1903 | case METHOD_GPIO_730: | ||
1904 | reg += OMAP730_GPIO_DIR_CONTROL; | ||
1905 | break; | ||
1906 | case METHOD_GPIO_850: | ||
1907 | reg += OMAP850_GPIO_DIR_CONTROL; | ||
1908 | break; | ||
1909 | case METHOD_GPIO_24XX: | ||
1910 | reg += OMAP24XX_GPIO_OE; | ||
1911 | break; | ||
1912 | } | ||
1913 | return __raw_readl(reg) & mask; | ||
1914 | } | ||
1915 | |||
1916 | |||
1917 | static int dbg_gpio_show(struct seq_file *s, void *unused) | 1980 | static int dbg_gpio_show(struct seq_file *s, void *unused) |
1918 | { | 1981 | { |
1919 | unsigned i, j, gpio; | 1982 | unsigned i, j, gpio; |
diff --git a/arch/arm/plat-omap/include/mach/clock.h b/arch/arm/plat-omap/include/mach/clock.h index f9f65e1ba3f1..4b8b0d65cbf2 100644 --- a/arch/arm/plat-omap/include/mach/clock.h +++ b/arch/arm/plat-omap/include/mach/clock.h | |||
@@ -20,6 +20,8 @@ struct clockdomain; | |||
20 | struct clkops { | 20 | struct clkops { |
21 | int (*enable)(struct clk *); | 21 | int (*enable)(struct clk *); |
22 | void (*disable)(struct clk *); | 22 | void (*disable)(struct clk *); |
23 | void (*find_idlest)(struct clk *, void __iomem **, u8 *); | ||
24 | void (*find_companion)(struct clk *, void __iomem **, u8 *); | ||
23 | }; | 25 | }; |
24 | 26 | ||
25 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) || \ | 27 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) || \ |
diff --git a/arch/arm/plat-omap/include/mach/cpu.h b/arch/arm/plat-omap/include/mach/cpu.h index 285eaa3a8275..11e73d9e8928 100644 --- a/arch/arm/plat-omap/include/mach/cpu.h +++ b/arch/arm/plat-omap/include/mach/cpu.h | |||
@@ -378,9 +378,6 @@ IS_OMAP_TYPE(3430, 0x3430) | |||
378 | #define cpu_class_is_omap2() (cpu_is_omap24xx() || cpu_is_omap34xx() || \ | 378 | #define cpu_class_is_omap2() (cpu_is_omap24xx() || cpu_is_omap34xx() || \ |
379 | cpu_is_omap44xx()) | 379 | cpu_is_omap44xx()) |
380 | 380 | ||
381 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) || \ | ||
382 | defined(CONFIG_ARCH_OMAP4) | ||
383 | |||
384 | /* Various silicon revisions for omap2 */ | 381 | /* Various silicon revisions for omap2 */ |
385 | #define OMAP242X_CLASS 0x24200024 | 382 | #define OMAP242X_CLASS 0x24200024 |
386 | #define OMAP2420_REV_ES1_0 0x24200024 | 383 | #define OMAP2420_REV_ES1_0 0x24200024 |
@@ -436,5 +433,3 @@ IS_OMAP_TYPE(3430, 0x3430) | |||
436 | 433 | ||
437 | int omap_chip_is(struct omap_chip_id oci); | 434 | int omap_chip_is(struct omap_chip_id oci); |
438 | void omap2_check_revision(void); | 435 | void omap2_check_revision(void); |
439 | |||
440 | #endif /* defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) */ | ||
diff --git a/arch/arm/plat-omap/include/mach/io.h b/arch/arm/plat-omap/include/mach/io.h index 73f483d56ca6..21fb0efdda86 100644 --- a/arch/arm/plat-omap/include/mach/io.h +++ b/arch/arm/plat-omap/include/mach/io.h | |||
@@ -228,7 +228,8 @@ extern void omap1_map_common_io(void); | |||
228 | extern void omap1_init_common_hw(void); | 228 | extern void omap1_init_common_hw(void); |
229 | 229 | ||
230 | extern void omap2_map_common_io(void); | 230 | extern void omap2_map_common_io(void); |
231 | extern void omap2_init_common_hw(struct omap_sdrc_params *sp); | 231 | extern void omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0, |
232 | struct omap_sdrc_params *sdrc_cs1); | ||
232 | 233 | ||
233 | #define __arch_ioremap(p,s,t) omap_ioremap(p,s,t) | 234 | #define __arch_ioremap(p,s,t) omap_ioremap(p,s,t) |
234 | #define __arch_iounmap(v) omap_iounmap(v) | 235 | #define __arch_iounmap(v) omap_iounmap(v) |
diff --git a/arch/arm/plat-omap/include/mach/mux.h b/arch/arm/plat-omap/include/mach/mux.h index 85a621705766..80281c458baf 100644 --- a/arch/arm/plat-omap/include/mach/mux.h +++ b/arch/arm/plat-omap/include/mach/mux.h | |||
@@ -853,6 +853,10 @@ enum omap34xx_index { | |||
853 | AE5_34XX_GPIO143, | 853 | AE5_34XX_GPIO143, |
854 | H19_34XX_GPIO164_OUT, | 854 | H19_34XX_GPIO164_OUT, |
855 | J25_34XX_GPIO170, | 855 | J25_34XX_GPIO170, |
856 | |||
857 | /* OMAP3 SDRC CKE signals to SDR/DDR ram chips */ | ||
858 | H16_34XX_SDRC_CKE0, | ||
859 | H17_34XX_SDRC_CKE1, | ||
856 | }; | 860 | }; |
857 | 861 | ||
858 | struct omap_mux_cfg { | 862 | struct omap_mux_cfg { |
diff --git a/arch/arm/plat-omap/include/mach/prcm.h b/arch/arm/plat-omap/include/mach/prcm.h index 24ac3c715912..cda2a70397b4 100644 --- a/arch/arm/plat-omap/include/mach/prcm.h +++ b/arch/arm/plat-omap/include/mach/prcm.h | |||
@@ -25,6 +25,7 @@ | |||
25 | 25 | ||
26 | u32 omap_prcm_get_reset_sources(void); | 26 | u32 omap_prcm_get_reset_sources(void); |
27 | void omap_prcm_arch_reset(char mode); | 27 | void omap_prcm_arch_reset(char mode); |
28 | int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, const char *name); | ||
28 | 29 | ||
29 | #endif | 30 | #endif |
30 | 31 | ||
diff --git a/arch/arm/plat-omap/include/mach/sdrc.h b/arch/arm/plat-omap/include/mach/sdrc.h index adc73522491f..0be18e4ff182 100644 --- a/arch/arm/plat-omap/include/mach/sdrc.h +++ b/arch/arm/plat-omap/include/mach/sdrc.h | |||
@@ -30,6 +30,10 @@ | |||
30 | #define SDRC_ACTIM_CTRL_A_0 0x09c | 30 | #define SDRC_ACTIM_CTRL_A_0 0x09c |
31 | #define SDRC_ACTIM_CTRL_B_0 0x0a0 | 31 | #define SDRC_ACTIM_CTRL_B_0 0x0a0 |
32 | #define SDRC_RFR_CTRL_0 0x0a4 | 32 | #define SDRC_RFR_CTRL_0 0x0a4 |
33 | #define SDRC_MR_1 0x0B4 | ||
34 | #define SDRC_ACTIM_CTRL_A_1 0x0C4 | ||
35 | #define SDRC_ACTIM_CTRL_B_1 0x0C8 | ||
36 | #define SDRC_RFR_CTRL_1 0x0D4 | ||
33 | 37 | ||
34 | /* | 38 | /* |
35 | * These values represent the number of memory clock cycles between | 39 | * These values represent the number of memory clock cycles between |
@@ -102,8 +106,11 @@ struct omap_sdrc_params { | |||
102 | u32 mr; | 106 | u32 mr; |
103 | }; | 107 | }; |
104 | 108 | ||
105 | void __init omap2_sdrc_init(struct omap_sdrc_params *sp); | 109 | void __init omap2_sdrc_init(struct omap_sdrc_params *sdrc_cs0, |
106 | struct omap_sdrc_params *omap2_sdrc_get_params(unsigned long r); | 110 | struct omap_sdrc_params *sdrc_cs1); |
111 | int omap2_sdrc_get_params(unsigned long r, | ||
112 | struct omap_sdrc_params **sdrc_cs0, | ||
113 | struct omap_sdrc_params **sdrc_cs1); | ||
107 | 114 | ||
108 | #ifdef CONFIG_ARCH_OMAP2 | 115 | #ifdef CONFIG_ARCH_OMAP2 |
109 | 116 | ||
diff --git a/arch/arm/plat-omap/include/mach/serial.h b/arch/arm/plat-omap/include/mach/serial.h index 13abd02d1527..def0529c75eb 100644 --- a/arch/arm/plat-omap/include/mach/serial.h +++ b/arch/arm/plat-omap/include/mach/serial.h | |||
@@ -59,6 +59,7 @@ extern void omap_uart_check_wakeup(void); | |||
59 | extern void omap_uart_prepare_suspend(void); | 59 | extern void omap_uart_prepare_suspend(void); |
60 | extern void omap_uart_prepare_idle(int num); | 60 | extern void omap_uart_prepare_idle(int num); |
61 | extern void omap_uart_resume_idle(int num); | 61 | extern void omap_uart_resume_idle(int num); |
62 | extern void omap_uart_enable_irqs(int enable); | ||
62 | #endif | 63 | #endif |
63 | 64 | ||
64 | #endif | 65 | #endif |
diff --git a/arch/arm/plat-omap/include/mach/sram.h b/arch/arm/plat-omap/include/mach/sram.h index 4d53cc59d7a3..8974e3fc2691 100644 --- a/arch/arm/plat-omap/include/mach/sram.h +++ b/arch/arm/plat-omap/include/mach/sram.h | |||
@@ -21,11 +21,12 @@ extern void omap2_sram_reprogram_sdrc(u32 perf_level, u32 dll_val, | |||
21 | u32 mem_type); | 21 | u32 mem_type); |
22 | extern u32 omap2_set_prcm(u32 dpll_ctrl_val, u32 sdrc_rfr_val, int bypass); | 22 | extern u32 omap2_set_prcm(u32 dpll_ctrl_val, u32 sdrc_rfr_val, int bypass); |
23 | 23 | ||
24 | extern u32 omap3_configure_core_dpll(u32 sdrc_rfr_ctrl, | 24 | extern u32 omap3_configure_core_dpll( |
25 | u32 sdrc_actim_ctrla, | 25 | u32 m2, u32 unlock_dll, u32 f, u32 inc, |
26 | u32 sdrc_actim_ctrlb, u32 m2, | 26 | u32 sdrc_rfr_ctrl_0, u32 sdrc_actim_ctrl_a_0, |
27 | u32 unlock_dll, u32 f, u32 sdrc_mr, | 27 | u32 sdrc_actim_ctrl_b_0, u32 sdrc_mr_0, |
28 | u32 inc); | 28 | u32 sdrc_rfr_ctrl_1, u32 sdrc_actim_ctrl_a_1, |
29 | u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1); | ||
29 | 30 | ||
30 | /* Do not use these */ | 31 | /* Do not use these */ |
31 | extern void omap1_sram_reprogram_clock(u32 ckctl, u32 dpllctl); | 32 | extern void omap1_sram_reprogram_clock(u32 ckctl, u32 dpllctl); |
@@ -59,12 +60,12 @@ extern void omap243x_sram_reprogram_sdrc(u32 perf_level, u32 dll_val, | |||
59 | u32 mem_type); | 60 | u32 mem_type); |
60 | extern unsigned long omap243x_sram_reprogram_sdrc_sz; | 61 | extern unsigned long omap243x_sram_reprogram_sdrc_sz; |
61 | 62 | ||
62 | 63 | extern u32 omap3_sram_configure_core_dpll( | |
63 | extern u32 omap3_sram_configure_core_dpll(u32 sdrc_rfr_ctrl, | 64 | u32 m2, u32 unlock_dll, u32 f, u32 inc, |
64 | u32 sdrc_actim_ctrla, | 65 | u32 sdrc_rfr_ctrl_0, u32 sdrc_actim_ctrl_a_0, |
65 | u32 sdrc_actim_ctrlb, u32 m2, | 66 | u32 sdrc_actim_ctrl_b_0, u32 sdrc_mr_0, |
66 | u32 unlock_dll, u32 f, u32 sdrc_mr, | 67 | u32 sdrc_rfr_ctrl_1, u32 sdrc_actim_ctrl_a_1, |
67 | u32 inc); | 68 | u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1); |
68 | extern unsigned long omap3_sram_configure_core_dpll_sz; | 69 | extern unsigned long omap3_sram_configure_core_dpll_sz; |
69 | 70 | ||
70 | #endif | 71 | #endif |
diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c index 4ea73804d21e..5eae7876979c 100644 --- a/arch/arm/plat-omap/sram.c +++ b/arch/arm/plat-omap/sram.c | |||
@@ -44,9 +44,9 @@ | |||
44 | #define OMAP2_SRAM_VA 0xe3000000 | 44 | #define OMAP2_SRAM_VA 0xe3000000 |
45 | #define OMAP2_SRAM_PUB_VA (OMAP2_SRAM_VA + 0x800) | 45 | #define OMAP2_SRAM_PUB_VA (OMAP2_SRAM_VA + 0x800) |
46 | #define OMAP3_SRAM_PA 0x40200000 | 46 | #define OMAP3_SRAM_PA 0x40200000 |
47 | #define OMAP3_SRAM_VA 0xd7000000 | 47 | #define OMAP3_SRAM_VA 0xe3000000 |
48 | #define OMAP3_SRAM_PUB_PA 0x40208000 | 48 | #define OMAP3_SRAM_PUB_PA 0x40208000 |
49 | #define OMAP3_SRAM_PUB_VA 0xd7008000 | 49 | #define OMAP3_SRAM_PUB_VA (OMAP3_SRAM_VA + 0x8000) |
50 | #define OMAP4_SRAM_PA 0x40200000 /*0x402f0000*/ | 50 | #define OMAP4_SRAM_PA 0x40200000 /*0x402f0000*/ |
51 | #define OMAP4_SRAM_VA 0xd7000000 /*0xd70f0000*/ | 51 | #define OMAP4_SRAM_VA 0xd7000000 /*0xd70f0000*/ |
52 | 52 | ||
@@ -373,20 +373,26 @@ static inline int omap243x_sram_init(void) | |||
373 | 373 | ||
374 | #ifdef CONFIG_ARCH_OMAP3 | 374 | #ifdef CONFIG_ARCH_OMAP3 |
375 | 375 | ||
376 | static u32 (*_omap3_sram_configure_core_dpll)(u32 sdrc_rfr_ctrl, | 376 | static u32 (*_omap3_sram_configure_core_dpll)( |
377 | u32 sdrc_actim_ctrla, | 377 | u32 m2, u32 unlock_dll, u32 f, u32 inc, |
378 | u32 sdrc_actim_ctrlb, | 378 | u32 sdrc_rfr_ctrl_0, u32 sdrc_actim_ctrl_a_0, |
379 | u32 m2, u32 unlock_dll, | 379 | u32 sdrc_actim_ctrl_b_0, u32 sdrc_mr_0, |
380 | u32 f, u32 sdrc_mr, u32 inc); | 380 | u32 sdrc_rfr_ctrl_1, u32 sdrc_actim_ctrl_a_1, |
381 | u32 omap3_configure_core_dpll(u32 sdrc_rfr_ctrl, u32 sdrc_actim_ctrla, | 381 | u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1); |
382 | u32 sdrc_actim_ctrlb, u32 m2, u32 unlock_dll, | 382 | |
383 | u32 f, u32 sdrc_mr, u32 inc) | 383 | u32 omap3_configure_core_dpll(u32 m2, u32 unlock_dll, u32 f, u32 inc, |
384 | u32 sdrc_rfr_ctrl_0, u32 sdrc_actim_ctrl_a_0, | ||
385 | u32 sdrc_actim_ctrl_b_0, u32 sdrc_mr_0, | ||
386 | u32 sdrc_rfr_ctrl_1, u32 sdrc_actim_ctrl_a_1, | ||
387 | u32 sdrc_actim_ctrl_b_1, u32 sdrc_mr_1) | ||
384 | { | 388 | { |
385 | BUG_ON(!_omap3_sram_configure_core_dpll); | 389 | BUG_ON(!_omap3_sram_configure_core_dpll); |
386 | return _omap3_sram_configure_core_dpll(sdrc_rfr_ctrl, | 390 | return _omap3_sram_configure_core_dpll( |
387 | sdrc_actim_ctrla, | 391 | m2, unlock_dll, f, inc, |
388 | sdrc_actim_ctrlb, m2, | 392 | sdrc_rfr_ctrl_0, sdrc_actim_ctrl_a_0, |
389 | unlock_dll, f, sdrc_mr, inc); | 393 | sdrc_actim_ctrl_b_0, sdrc_mr_0, |
394 | sdrc_rfr_ctrl_1, sdrc_actim_ctrl_a_1, | ||
395 | sdrc_actim_ctrl_b_1, sdrc_mr_1); | ||
390 | } | 396 | } |
391 | 397 | ||
392 | /* REVISIT: Should this be same as omap34xx_sram_init() after off-idle? */ | 398 | /* REVISIT: Should this be same as omap34xx_sram_init() after off-idle? */ |
diff --git a/arch/arm/plat-s3c24xx/clock-dclk.c b/arch/arm/plat-s3c24xx/clock-dclk.c index 5b75a797b5ab..0afb217a775e 100644 --- a/arch/arm/plat-s3c24xx/clock-dclk.c +++ b/arch/arm/plat-s3c24xx/clock-dclk.c | |||
@@ -129,7 +129,7 @@ static int s3c24xx_clkout_setparent(struct clk *clk, struct clk *parent) | |||
129 | 129 | ||
130 | /* calculate the MISCCR setting for the clock */ | 130 | /* calculate the MISCCR setting for the clock */ |
131 | 131 | ||
132 | if (parent == &clk_xtal) | 132 | if (parent == &clk_mpll) |
133 | source = S3C2410_MISCCR_CLK0_MPLL; | 133 | source = S3C2410_MISCCR_CLK0_MPLL; |
134 | else if (parent == &clk_upll) | 134 | else if (parent == &clk_upll) |
135 | source = S3C2410_MISCCR_CLK0_UPLL; | 135 | source = S3C2410_MISCCR_CLK0_UPLL; |
diff --git a/arch/mips/include/asm/page.h b/arch/mips/include/asm/page.h index 96a14a426a7c..4320239cf4ef 100644 --- a/arch/mips/include/asm/page.h +++ b/arch/mips/include/asm/page.h | |||
@@ -32,10 +32,12 @@ | |||
32 | #define PAGE_SIZE (1UL << PAGE_SHIFT) | 32 | #define PAGE_SIZE (1UL << PAGE_SHIFT) |
33 | #define PAGE_MASK (~((1 << PAGE_SHIFT) - 1)) | 33 | #define PAGE_MASK (~((1 << PAGE_SHIFT) - 1)) |
34 | 34 | ||
35 | #ifdef CONFIG_HUGETLB_PAGE | ||
35 | #define HPAGE_SHIFT (PAGE_SHIFT + PAGE_SHIFT - 3) | 36 | #define HPAGE_SHIFT (PAGE_SHIFT + PAGE_SHIFT - 3) |
36 | #define HPAGE_SIZE ((1UL) << HPAGE_SHIFT) | 37 | #define HPAGE_SIZE ((1UL) << HPAGE_SHIFT) |
37 | #define HPAGE_MASK (~(HPAGE_SIZE - 1)) | 38 | #define HPAGE_MASK (~(HPAGE_SIZE - 1)) |
38 | #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) | 39 | #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) |
40 | #endif /* CONFIG_HUGETLB_PAGE */ | ||
39 | 41 | ||
40 | #ifndef __ASSEMBLY__ | 42 | #ifndef __ASSEMBLY__ |
41 | 43 | ||
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index d00131ca0835..4c0747e8ed74 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -472,7 +472,7 @@ config PPC_16K_PAGES | |||
472 | bool "16k page size" if 44x | 472 | bool "16k page size" if 44x |
473 | 473 | ||
474 | config PPC_64K_PAGES | 474 | config PPC_64K_PAGES |
475 | bool "64k page size" if 44x || PPC_STD_MMU_64 | 475 | bool "64k page size" if 44x || PPC_STD_MMU_64 || PPC_BOOK3E_64 |
476 | select PPC_HAS_HASH_64K if PPC_STD_MMU_64 | 476 | select PPC_HAS_HASH_64K if PPC_STD_MMU_64 |
477 | 477 | ||
478 | config PPC_256K_PAGES | 478 | config PPC_256K_PAGES |
@@ -492,16 +492,16 @@ endchoice | |||
492 | 492 | ||
493 | config FORCE_MAX_ZONEORDER | 493 | config FORCE_MAX_ZONEORDER |
494 | int "Maximum zone order" | 494 | int "Maximum zone order" |
495 | range 9 64 if PPC_STD_MMU_64 && PPC_64K_PAGES | 495 | range 9 64 if PPC64 && PPC_64K_PAGES |
496 | default "9" if PPC_STD_MMU_64 && PPC_64K_PAGES | 496 | default "9" if PPC64 && PPC_64K_PAGES |
497 | range 13 64 if PPC_STD_MMU_64 && !PPC_64K_PAGES | 497 | range 13 64 if PPC64 && !PPC_64K_PAGES |
498 | default "13" if PPC_STD_MMU_64 && !PPC_64K_PAGES | 498 | default "13" if PPC64 && !PPC_64K_PAGES |
499 | range 9 64 if PPC_STD_MMU_32 && PPC_16K_PAGES | 499 | range 9 64 if PPC32 && PPC_16K_PAGES |
500 | default "9" if PPC_STD_MMU_32 && PPC_16K_PAGES | 500 | default "9" if PPC32 && PPC_16K_PAGES |
501 | range 7 64 if PPC_STD_MMU_32 && PPC_64K_PAGES | 501 | range 7 64 if PPC32 && PPC_64K_PAGES |
502 | default "7" if PPC_STD_MMU_32 && PPC_64K_PAGES | 502 | default "7" if PPC32 && PPC_64K_PAGES |
503 | range 5 64 if PPC_STD_MMU_32 && PPC_256K_PAGES | 503 | range 5 64 if PPC32 && PPC_256K_PAGES |
504 | default "5" if PPC_STD_MMU_32 && PPC_256K_PAGES | 504 | default "5" if PPC32 && PPC_256K_PAGES |
505 | range 11 64 | 505 | range 11 64 |
506 | default "11" | 506 | default "11" |
507 | help | 507 | help |
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index bc35f4e2b81c..952a3963e9e8 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile | |||
@@ -77,7 +77,7 @@ CPP = $(CC) -E $(KBUILD_CFLAGS) | |||
77 | CHECKFLAGS += -m$(CONFIG_WORD_SIZE) -D__powerpc__ -D__powerpc$(CONFIG_WORD_SIZE)__ | 77 | CHECKFLAGS += -m$(CONFIG_WORD_SIZE) -D__powerpc__ -D__powerpc$(CONFIG_WORD_SIZE)__ |
78 | 78 | ||
79 | ifeq ($(CONFIG_PPC64),y) | 79 | ifeq ($(CONFIG_PPC64),y) |
80 | GCC_BROKEN_VEC := $(shell if [ $(call cc-version) -lt 0400 ] ; then echo "y"; fi) | 80 | GCC_BROKEN_VEC := $(call cc-ifversion, -lt, 0400, y) |
81 | 81 | ||
82 | ifeq ($(CONFIG_POWER4_ONLY),y) | 82 | ifeq ($(CONFIG_POWER4_ONLY),y) |
83 | ifeq ($(CONFIG_ALTIVEC),y) | 83 | ifeq ($(CONFIG_ALTIVEC),y) |
diff --git a/arch/powerpc/boot/dts/canyonlands.dts b/arch/powerpc/boot/dts/canyonlands.dts index 5fd1ad09bdf2..c920170b7dfe 100644 --- a/arch/powerpc/boot/dts/canyonlands.dts +++ b/arch/powerpc/boot/dts/canyonlands.dts | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Device Tree Source for AMCC Canyonlands (460EX) | 2 | * Device Tree Source for AMCC Canyonlands (460EX) |
3 | * | 3 | * |
4 | * Copyright 2008 DENX Software Engineering, Stefan Roese <sr@denx.de> | 4 | * Copyright 2008-2009 DENX Software Engineering, Stefan Roese <sr@denx.de> |
5 | * | 5 | * |
6 | * This file is licensed under the terms of the GNU General Public | 6 | * This file is licensed under the terms of the GNU General Public |
7 | * License version 2. This program is licensed "as is" without | 7 | * License version 2. This program is licensed "as is" without |
@@ -149,19 +149,19 @@ | |||
149 | /*RXDE*/ 0x5 0x4>; | 149 | /*RXDE*/ 0x5 0x4>; |
150 | }; | 150 | }; |
151 | 151 | ||
152 | USB0: ehci@bffd0400 { | 152 | USB0: ehci@bffd0400 { |
153 | compatible = "ibm,usb-ehci-460ex", "usb-ehci"; | 153 | compatible = "ibm,usb-ehci-460ex", "usb-ehci"; |
154 | interrupt-parent = <&UIC2>; | 154 | interrupt-parent = <&UIC2>; |
155 | interrupts = <0x1d 4>; | 155 | interrupts = <0x1d 4>; |
156 | reg = <4 0xbffd0400 0x90 4 0xbffd0490 0x70>; | 156 | reg = <4 0xbffd0400 0x90 4 0xbffd0490 0x70>; |
157 | }; | 157 | }; |
158 | 158 | ||
159 | USB1: usb@bffd0000 { | 159 | USB1: usb@bffd0000 { |
160 | compatible = "ohci-le"; | 160 | compatible = "ohci-le"; |
161 | reg = <4 0xbffd0000 0x60>; | 161 | reg = <4 0xbffd0000 0x60>; |
162 | interrupt-parent = <&UIC2>; | 162 | interrupt-parent = <&UIC2>; |
163 | interrupts = <0x1e 4>; | 163 | interrupts = <0x1e 4>; |
164 | }; | 164 | }; |
165 | 165 | ||
166 | POB0: opb { | 166 | POB0: opb { |
167 | compatible = "ibm,opb-460ex", "ibm,opb"; | 167 | compatible = "ibm,opb-460ex", "ibm,opb"; |
@@ -215,6 +215,29 @@ | |||
215 | reg = <0x03fa0000 0x00060000>; | 215 | reg = <0x03fa0000 0x00060000>; |
216 | }; | 216 | }; |
217 | }; | 217 | }; |
218 | |||
219 | ndfc@3,0 { | ||
220 | compatible = "ibm,ndfc"; | ||
221 | reg = <0x00000003 0x00000000 0x00002000>; | ||
222 | ccr = <0x00001000>; | ||
223 | bank-settings = <0x80002222>; | ||
224 | #address-cells = <1>; | ||
225 | #size-cells = <1>; | ||
226 | |||
227 | nand { | ||
228 | #address-cells = <1>; | ||
229 | #size-cells = <1>; | ||
230 | |||
231 | partition@0 { | ||
232 | label = "u-boot"; | ||
233 | reg = <0x00000000 0x00100000>; | ||
234 | }; | ||
235 | partition@100000 { | ||
236 | label = "user"; | ||
237 | reg = <0x00000000 0x03f00000>; | ||
238 | }; | ||
239 | }; | ||
240 | }; | ||
218 | }; | 241 | }; |
219 | 242 | ||
220 | UART0: serial@ef600300 { | 243 | UART0: serial@ef600300 { |
diff --git a/arch/powerpc/boot/dts/gef_sbc310.dts b/arch/powerpc/boot/dts/gef_sbc310.dts index 0f4c9ec2c3a6..2107d3c7cfe1 100644 --- a/arch/powerpc/boot/dts/gef_sbc310.dts +++ b/arch/powerpc/boot/dts/gef_sbc310.dts | |||
@@ -83,34 +83,34 @@ | |||
83 | 83 | ||
84 | /* flash@0,0 is a mirror of part of the memory in flash@1,0 | 84 | /* flash@0,0 is a mirror of part of the memory in flash@1,0 |
85 | flash@0,0 { | 85 | flash@0,0 { |
86 | compatible = "cfi-flash"; | 86 | compatible = "gef,sbc310-firmware-mirror", "cfi-flash"; |
87 | reg = <0 0 0x01000000>; | 87 | reg = <0x0 0x0 0x01000000>; |
88 | bank-width = <2>; | 88 | bank-width = <2>; |
89 | device-width = <2>; | 89 | device-width = <2>; |
90 | #address-cells = <1>; | 90 | #address-cells = <1>; |
91 | #size-cells = <1>; | 91 | #size-cells = <1>; |
92 | partition@0 { | 92 | partition@0 { |
93 | label = "firmware"; | 93 | label = "firmware"; |
94 | reg = <0x00000000 0x01000000>; | 94 | reg = <0x0 0x01000000>; |
95 | read-only; | 95 | read-only; |
96 | }; | 96 | }; |
97 | }; | 97 | }; |
98 | */ | 98 | */ |
99 | 99 | ||
100 | flash@1,0 { | 100 | flash@1,0 { |
101 | compatible = "cfi-flash"; | 101 | compatible = "gef,sbc310-paged-flash", "cfi-flash"; |
102 | reg = <1 0 0x8000000>; | 102 | reg = <0x1 0x0 0x8000000>; |
103 | bank-width = <2>; | 103 | bank-width = <2>; |
104 | device-width = <2>; | 104 | device-width = <2>; |
105 | #address-cells = <1>; | 105 | #address-cells = <1>; |
106 | #size-cells = <1>; | 106 | #size-cells = <1>; |
107 | partition@0 { | 107 | partition@0 { |
108 | label = "user"; | 108 | label = "user"; |
109 | reg = <0x00000000 0x07800000>; | 109 | reg = <0x0 0x7800000>; |
110 | }; | 110 | }; |
111 | partition@7800000 { | 111 | partition@7800000 { |
112 | label = "firmware"; | 112 | label = "firmware"; |
113 | reg = <0x07800000 0x00800000>; | 113 | reg = <0x7800000 0x800000>; |
114 | read-only; | 114 | read-only; |
115 | }; | 115 | }; |
116 | }; | 116 | }; |
@@ -121,18 +121,16 @@ | |||
121 | }; | 121 | }; |
122 | 122 | ||
123 | wdt@4,2000 { | 123 | wdt@4,2000 { |
124 | #interrupt-cells = <2>; | 124 | compatible = "gef,sbc310-fpga-wdt", "gef,fpga-wdt-1.00", |
125 | device_type = "watchdog"; | 125 | "gef,fpga-wdt"; |
126 | compatible = "gef,fpga-wdt"; | ||
127 | reg = <0x4 0x2000 0x8>; | 126 | reg = <0x4 0x2000 0x8>; |
128 | interrupts = <0x1a 0x4>; | 127 | interrupts = <0x1a 0x4>; |
129 | interrupt-parent = <&gef_pic>; | 128 | interrupt-parent = <&gef_pic>; |
130 | }; | 129 | }; |
131 | /* | 130 | /* |
132 | wdt@4,2010 { | 131 | wdt@4,2010 { |
133 | #interrupt-cells = <2>; | 132 | compatible = "gef,sbc310-fpga-wdt", "gef,fpga-wdt-1.00", |
134 | device_type = "watchdog"; | 133 | "gef,fpga-wdt"; |
135 | compatible = "gef,fpga-wdt"; | ||
136 | reg = <0x4 0x2010 0x8>; | 134 | reg = <0x4 0x2010 0x8>; |
137 | interrupts = <0x1b 0x4>; | 135 | interrupts = <0x1b 0x4>; |
138 | interrupt-parent = <&gef_pic>; | 136 | interrupt-parent = <&gef_pic>; |
@@ -141,7 +139,7 @@ | |||
141 | gef_pic: pic@4,4000 { | 139 | gef_pic: pic@4,4000 { |
142 | #interrupt-cells = <1>; | 140 | #interrupt-cells = <1>; |
143 | interrupt-controller; | 141 | interrupt-controller; |
144 | compatible = "gef,fpga-pic"; | 142 | compatible = "gef,sbc310-fpga-pic", "gef,fpga-pic"; |
145 | reg = <0x4 0x4000 0x20>; | 143 | reg = <0x4 0x4000 0x20>; |
146 | interrupts = <0x8 | 144 | interrupts = <0x8 |
147 | 0x9>; | 145 | 0x9>; |
@@ -161,7 +159,7 @@ | |||
161 | #size-cells = <1>; | 159 | #size-cells = <1>; |
162 | #interrupt-cells = <2>; | 160 | #interrupt-cells = <2>; |
163 | device_type = "soc"; | 161 | device_type = "soc"; |
164 | compatible = "simple-bus"; | 162 | compatible = "fsl,mpc8641-soc", "simple-bus"; |
165 | ranges = <0x0 0xfef00000 0x00100000>; | 163 | ranges = <0x0 0xfef00000 0x00100000>; |
166 | bus-frequency = <33333333>; | 164 | bus-frequency = <33333333>; |
167 | 165 | ||
@@ -376,4 +374,40 @@ | |||
376 | 0x0 0x00400000>; | 374 | 0x0 0x00400000>; |
377 | }; | 375 | }; |
378 | }; | 376 | }; |
377 | |||
378 | pci1: pcie@fef09000 { | ||
379 | compatible = "fsl,mpc8641-pcie"; | ||
380 | device_type = "pci"; | ||
381 | #interrupt-cells = <1>; | ||
382 | #size-cells = <2>; | ||
383 | #address-cells = <3>; | ||
384 | reg = <0xfef09000 0x1000>; | ||
385 | bus-range = <0x0 0xff>; | ||
386 | ranges = <0x02000000 0x0 0xc0000000 0xc0000000 0x0 0x20000000 | ||
387 | 0x01000000 0x0 0x00000000 0xfe400000 0x0 0x00400000>; | ||
388 | clock-frequency = <33333333>; | ||
389 | interrupt-parent = <&mpic>; | ||
390 | interrupts = <0x19 0x2>; | ||
391 | interrupt-map-mask = <0xf800 0x0 0x0 0x7>; | ||
392 | interrupt-map = < | ||
393 | 0x0000 0x0 0x0 0x1 &mpic 0x4 0x2 | ||
394 | 0x0000 0x0 0x0 0x2 &mpic 0x5 0x2 | ||
395 | 0x0000 0x0 0x0 0x3 &mpic 0x6 0x2 | ||
396 | 0x0000 0x0 0x0 0x4 &mpic 0x7 0x2 | ||
397 | >; | ||
398 | |||
399 | pcie@0 { | ||
400 | reg = <0 0 0 0 0>; | ||
401 | #size-cells = <2>; | ||
402 | #address-cells = <3>; | ||
403 | device_type = "pci"; | ||
404 | ranges = <0x02000000 0x0 0xc0000000 | ||
405 | 0x02000000 0x0 0xc0000000 | ||
406 | 0x0 0x20000000 | ||
407 | |||
408 | 0x01000000 0x0 0x00000000 | ||
409 | 0x01000000 0x0 0x00000000 | ||
410 | 0x0 0x00400000>; | ||
411 | }; | ||
412 | }; | ||
379 | }; | 413 | }; |
diff --git a/arch/powerpc/boot/dts/kilauea.dts b/arch/powerpc/boot/dts/kilauea.dts index 5e6b08ff6f67..c46561456ede 100644 --- a/arch/powerpc/boot/dts/kilauea.dts +++ b/arch/powerpc/boot/dts/kilauea.dts | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Device Tree Source for AMCC Kilauea (405EX) | 2 | * Device Tree Source for AMCC Kilauea (405EX) |
3 | * | 3 | * |
4 | * Copyright 2007 DENX Software Engineering, Stefan Roese <sr@denx.de> | 4 | * Copyright 2007-2009 DENX Software Engineering, Stefan Roese <sr@denx.de> |
5 | * | 5 | * |
6 | * This file is licensed under the terms of the GNU General Public | 6 | * This file is licensed under the terms of the GNU General Public |
7 | * License version 2. This program is licensed "as is" without | 7 | * License version 2. This program is licensed "as is" without |
@@ -150,7 +150,11 @@ | |||
150 | #size-cells = <1>; | 150 | #size-cells = <1>; |
151 | partition@0 { | 151 | partition@0 { |
152 | label = "kernel"; | 152 | label = "kernel"; |
153 | reg = <0x00000000 0x00200000>; | 153 | reg = <0x00000000 0x001e0000>; |
154 | }; | ||
155 | partition@1e0000 { | ||
156 | label = "dtb"; | ||
157 | reg = <0x001e0000 0x00020000>; | ||
154 | }; | 158 | }; |
155 | partition@200000 { | 159 | partition@200000 { |
156 | label = "root"; | 160 | label = "root"; |
@@ -169,6 +173,29 @@ | |||
169 | reg = <0x03fa0000 0x00060000>; | 173 | reg = <0x03fa0000 0x00060000>; |
170 | }; | 174 | }; |
171 | }; | 175 | }; |
176 | |||
177 | ndfc@1,0 { | ||
178 | compatible = "ibm,ndfc"; | ||
179 | reg = <0x00000001 0x00000000 0x00002000>; | ||
180 | ccr = <0x00001000>; | ||
181 | bank-settings = <0x80002222>; | ||
182 | #address-cells = <1>; | ||
183 | #size-cells = <1>; | ||
184 | |||
185 | nand { | ||
186 | #address-cells = <1>; | ||
187 | #size-cells = <1>; | ||
188 | |||
189 | partition@0 { | ||
190 | label = "u-boot"; | ||
191 | reg = <0x00000000 0x00100000>; | ||
192 | }; | ||
193 | partition@100000 { | ||
194 | label = "user"; | ||
195 | reg = <0x00000000 0x03f00000>; | ||
196 | }; | ||
197 | }; | ||
198 | }; | ||
172 | }; | 199 | }; |
173 | 200 | ||
174 | UART0: serial@ef600200 { | 201 | UART0: serial@ef600200 { |
@@ -198,6 +225,18 @@ | |||
198 | reg = <0xef600400 0x00000014>; | 225 | reg = <0xef600400 0x00000014>; |
199 | interrupt-parent = <&UIC0>; | 226 | interrupt-parent = <&UIC0>; |
200 | interrupts = <0x2 0x4>; | 227 | interrupts = <0x2 0x4>; |
228 | #address-cells = <1>; | ||
229 | #size-cells = <0>; | ||
230 | |||
231 | rtc@68 { | ||
232 | compatible = "dallas,ds1338"; | ||
233 | reg = <0x68>; | ||
234 | }; | ||
235 | |||
236 | dtt@48 { | ||
237 | compatible = "dallas,ds1775"; | ||
238 | reg = <0x48>; | ||
239 | }; | ||
201 | }; | 240 | }; |
202 | 241 | ||
203 | IIC1: i2c@ef600500 { | 242 | IIC1: i2c@ef600500 { |
@@ -207,7 +246,6 @@ | |||
207 | interrupts = <0x7 0x4>; | 246 | interrupts = <0x7 0x4>; |
208 | }; | 247 | }; |
209 | 248 | ||
210 | |||
211 | RGMII0: emac-rgmii@ef600b00 { | 249 | RGMII0: emac-rgmii@ef600b00 { |
212 | compatible = "ibm,rgmii-405ex", "ibm,rgmii"; | 250 | compatible = "ibm,rgmii-405ex", "ibm,rgmii"; |
213 | reg = <0xef600b00 0x00000104>; | 251 | reg = <0xef600b00 0x00000104>; |
diff --git a/arch/powerpc/boot/dts/mgcoge.dts b/arch/powerpc/boot/dts/mgcoge.dts index 633255a97557..0ce96644176d 100644 --- a/arch/powerpc/boot/dts/mgcoge.dts +++ b/arch/powerpc/boot/dts/mgcoge.dts | |||
@@ -162,6 +162,59 @@ | |||
162 | fixed-link = <0 0 10 0 0>; | 162 | fixed-link = <0 0 10 0 0>; |
163 | }; | 163 | }; |
164 | 164 | ||
165 | i2c@11860 { | ||
166 | compatible = "fsl,mpc8272-i2c", | ||
167 | "fsl,cpm2-i2c"; | ||
168 | reg = <0x11860 0x20 0x8afc 0x2>; | ||
169 | interrupts = <1 8>; | ||
170 | interrupt-parent = <&PIC>; | ||
171 | fsl,cpm-command = <0x29600000>; | ||
172 | #address-cells = <1>; | ||
173 | #size-cells = <0>; | ||
174 | }; | ||
175 | |||
176 | mdio@10d40 { | ||
177 | compatible = "fsl,cpm2-mdio-bitbang"; | ||
178 | reg = <0x10d00 0x14>; | ||
179 | #address-cells = <1>; | ||
180 | #size-cells = <0>; | ||
181 | fsl,mdio-pin = <12>; | ||
182 | fsl,mdc-pin = <13>; | ||
183 | |||
184 | phy0: ethernet-phy@0 { | ||
185 | reg = <0x0>; | ||
186 | }; | ||
187 | |||
188 | phy1: ethernet-phy@1 { | ||
189 | reg = <0x1>; | ||
190 | }; | ||
191 | }; | ||
192 | |||
193 | /* FCC1 management to switch */ | ||
194 | ethernet@11300 { | ||
195 | device_type = "network"; | ||
196 | compatible = "fsl,cpm2-fcc-enet"; | ||
197 | reg = <0x11300 0x20 0x8400 0x100 0x11390 0x1>; | ||
198 | local-mac-address = [ 00 01 02 03 04 07 ]; | ||
199 | interrupts = <32 8>; | ||
200 | interrupt-parent = <&PIC>; | ||
201 | phy-handle = <&phy0>; | ||
202 | linux,network-index = <1>; | ||
203 | fsl,cpm-command = <0x12000300>; | ||
204 | }; | ||
205 | |||
206 | /* FCC2 to redundant core unit over backplane */ | ||
207 | ethernet@11320 { | ||
208 | device_type = "network"; | ||
209 | compatible = "fsl,cpm2-fcc-enet"; | ||
210 | reg = <0x11320 0x20 0x8500 0x100 0x113b0 0x1>; | ||
211 | local-mac-address = [ 00 01 02 03 04 08 ]; | ||
212 | interrupts = <33 8>; | ||
213 | interrupt-parent = <&PIC>; | ||
214 | phy-handle = <&phy1>; | ||
215 | linux,network-index = <2>; | ||
216 | fsl,cpm-command = <0x16200300>; | ||
217 | }; | ||
165 | }; | 218 | }; |
166 | 219 | ||
167 | PIC: interrupt-controller@10c00 { | 220 | PIC: interrupt-controller@10c00 { |
diff --git a/arch/powerpc/boot/dts/mpc8377_rdb.dts b/arch/powerpc/boot/dts/mpc8377_rdb.dts index 4f06dbc0d27e..28e022ac4179 100644 --- a/arch/powerpc/boot/dts/mpc8377_rdb.dts +++ b/arch/powerpc/boot/dts/mpc8377_rdb.dts | |||
@@ -174,7 +174,7 @@ | |||
174 | interrupts = <42 0x8>; | 174 | interrupts = <42 0x8>; |
175 | interrupt-parent = <&ipic>; | 175 | interrupt-parent = <&ipic>; |
176 | /* Filled in by U-Boot */ | 176 | /* Filled in by U-Boot */ |
177 | clock-frequency = <0>; | 177 | clock-frequency = <111111111>; |
178 | }; | 178 | }; |
179 | }; | 179 | }; |
180 | 180 | ||
diff --git a/arch/powerpc/boot/dts/mpc8377_wlan.dts b/arch/powerpc/boot/dts/mpc8377_wlan.dts new file mode 100644 index 000000000000..3febc4e91b10 --- /dev/null +++ b/arch/powerpc/boot/dts/mpc8377_wlan.dts | |||
@@ -0,0 +1,464 @@ | |||
1 | /* | ||
2 | * MPC8377E WLAN Device Tree Source | ||
3 | * | ||
4 | * Copyright 2007-2009 Freescale Semiconductor Inc. | ||
5 | * Copyright 2009 MontaVista Software, Inc. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License as published by the | ||
9 | * Free Software Foundation; either version 2 of the License, or (at your | ||
10 | * option) any later version. | ||
11 | */ | ||
12 | |||
13 | /dts-v1/; | ||
14 | |||
15 | / { | ||
16 | compatible = "fsl,mpc8377wlan"; | ||
17 | #address-cells = <1>; | ||
18 | #size-cells = <1>; | ||
19 | |||
20 | aliases { | ||
21 | ethernet0 = &enet0; | ||
22 | ethernet1 = &enet1; | ||
23 | serial0 = &serial0; | ||
24 | serial1 = &serial1; | ||
25 | pci0 = &pci0; | ||
26 | pci1 = &pci1; | ||
27 | pci2 = &pci2; | ||
28 | }; | ||
29 | |||
30 | cpus { | ||
31 | #address-cells = <1>; | ||
32 | #size-cells = <0>; | ||
33 | |||
34 | PowerPC,8377@0 { | ||
35 | device_type = "cpu"; | ||
36 | reg = <0x0>; | ||
37 | d-cache-line-size = <32>; | ||
38 | i-cache-line-size = <32>; | ||
39 | d-cache-size = <32768>; | ||
40 | i-cache-size = <32768>; | ||
41 | timebase-frequency = <0>; | ||
42 | bus-frequency = <0>; | ||
43 | clock-frequency = <0>; | ||
44 | }; | ||
45 | }; | ||
46 | |||
47 | memory { | ||
48 | device_type = "memory"; | ||
49 | reg = <0x00000000 0x20000000>; // 512MB at 0 | ||
50 | }; | ||
51 | |||
52 | localbus@e0005000 { | ||
53 | #address-cells = <2>; | ||
54 | #size-cells = <1>; | ||
55 | compatible = "fsl,mpc8377-elbc", "fsl,elbc", "simple-bus"; | ||
56 | reg = <0xe0005000 0x1000>; | ||
57 | interrupts = <77 0x8>; | ||
58 | interrupt-parent = <&ipic>; | ||
59 | ranges = <0x0 0x0 0xfc000000 0x04000000>; | ||
60 | |||
61 | flash@0,0 { | ||
62 | #address-cells = <1>; | ||
63 | #size-cells = <1>; | ||
64 | compatible = "cfi-flash"; | ||
65 | reg = <0x0 0x0 0x4000000>; | ||
66 | bank-width = <2>; | ||
67 | device-width = <1>; | ||
68 | |||
69 | partition@0 { | ||
70 | reg = <0 0x8000>; | ||
71 | label = "u-boot"; | ||
72 | read-only; | ||
73 | }; | ||
74 | |||
75 | partition@a0000 { | ||
76 | reg = <0xa0000 0x300000>; | ||
77 | label = "kernel"; | ||
78 | }; | ||
79 | |||
80 | partition@3a0000 { | ||
81 | reg = <0x3a0000 0x3c60000>; | ||
82 | label = "rootfs"; | ||
83 | }; | ||
84 | }; | ||
85 | }; | ||
86 | |||
87 | immr@e0000000 { | ||
88 | #address-cells = <1>; | ||
89 | #size-cells = <1>; | ||
90 | device_type = "soc"; | ||
91 | compatible = "simple-bus"; | ||
92 | ranges = <0x0 0xe0000000 0x00100000>; | ||
93 | reg = <0xe0000000 0x00000200>; | ||
94 | bus-frequency = <0>; | ||
95 | |||
96 | wdt@200 { | ||
97 | device_type = "watchdog"; | ||
98 | compatible = "mpc83xx_wdt"; | ||
99 | reg = <0x200 0x100>; | ||
100 | }; | ||
101 | |||
102 | gpio1: gpio-controller@c00 { | ||
103 | #gpio-cells = <2>; | ||
104 | compatible = "fsl,mpc8377-gpio", "fsl,mpc8349-gpio"; | ||
105 | reg = <0xc00 0x100>; | ||
106 | interrupts = <74 0x8>; | ||
107 | interrupt-parent = <&ipic>; | ||
108 | gpio-controller; | ||
109 | }; | ||
110 | |||
111 | gpio2: gpio-controller@d00 { | ||
112 | #gpio-cells = <2>; | ||
113 | compatible = "fsl,mpc8377-gpio", "fsl,mpc8349-gpio"; | ||
114 | reg = <0xd00 0x100>; | ||
115 | interrupts = <75 0x8>; | ||
116 | interrupt-parent = <&ipic>; | ||
117 | gpio-controller; | ||
118 | }; | ||
119 | |||
120 | sleep-nexus { | ||
121 | #address-cells = <1>; | ||
122 | #size-cells = <1>; | ||
123 | compatible = "simple-bus"; | ||
124 | sleep = <&pmc 0x0c000000>; | ||
125 | ranges; | ||
126 | |||
127 | i2c@3000 { | ||
128 | #address-cells = <1>; | ||
129 | #size-cells = <0>; | ||
130 | cell-index = <0>; | ||
131 | compatible = "fsl-i2c"; | ||
132 | reg = <0x3000 0x100>; | ||
133 | interrupts = <14 0x8>; | ||
134 | interrupt-parent = <&ipic>; | ||
135 | dfsrr; | ||
136 | |||
137 | at24@50 { | ||
138 | compatible = "at24,24c256"; | ||
139 | reg = <0x50>; | ||
140 | }; | ||
141 | |||
142 | rtc@68 { | ||
143 | compatible = "dallas,ds1339"; | ||
144 | reg = <0x68>; | ||
145 | }; | ||
146 | }; | ||
147 | |||
148 | sdhci@2e000 { | ||
149 | compatible = "fsl,mpc8377-esdhc", "fsl,esdhc"; | ||
150 | reg = <0x2e000 0x1000>; | ||
151 | interrupts = <42 0x8>; | ||
152 | interrupt-parent = <&ipic>; | ||
153 | clock-frequency = <133333333>; | ||
154 | }; | ||
155 | }; | ||
156 | |||
157 | i2c@3100 { | ||
158 | #address-cells = <1>; | ||
159 | #size-cells = <0>; | ||
160 | cell-index = <1>; | ||
161 | compatible = "fsl-i2c"; | ||
162 | reg = <0x3100 0x100>; | ||
163 | interrupts = <15 0x8>; | ||
164 | interrupt-parent = <&ipic>; | ||
165 | dfsrr; | ||
166 | }; | ||
167 | |||
168 | spi@7000 { | ||
169 | cell-index = <0>; | ||
170 | compatible = "fsl,spi"; | ||
171 | reg = <0x7000 0x1000>; | ||
172 | interrupts = <16 0x8>; | ||
173 | interrupt-parent = <&ipic>; | ||
174 | mode = "cpu"; | ||
175 | }; | ||
176 | |||
177 | dma@82a8 { | ||
178 | #address-cells = <1>; | ||
179 | #size-cells = <1>; | ||
180 | compatible = "fsl,mpc8377-dma", "fsl,elo-dma"; | ||
181 | reg = <0x82a8 4>; | ||
182 | ranges = <0 0x8100 0x1a8>; | ||
183 | interrupt-parent = <&ipic>; | ||
184 | interrupts = <71 8>; | ||
185 | cell-index = <0>; | ||
186 | dma-channel@0 { | ||
187 | compatible = "fsl,mpc8377-dma-channel", "fsl,elo-dma-channel"; | ||
188 | reg = <0 0x80>; | ||
189 | cell-index = <0>; | ||
190 | interrupt-parent = <&ipic>; | ||
191 | interrupts = <71 8>; | ||
192 | }; | ||
193 | dma-channel@80 { | ||
194 | compatible = "fsl,mpc8377-dma-channel", "fsl,elo-dma-channel"; | ||
195 | reg = <0x80 0x80>; | ||
196 | cell-index = <1>; | ||
197 | interrupt-parent = <&ipic>; | ||
198 | interrupts = <71 8>; | ||
199 | }; | ||
200 | dma-channel@100 { | ||
201 | compatible = "fsl,mpc8377-dma-channel", "fsl,elo-dma-channel"; | ||
202 | reg = <0x100 0x80>; | ||
203 | cell-index = <2>; | ||
204 | interrupt-parent = <&ipic>; | ||
205 | interrupts = <71 8>; | ||
206 | }; | ||
207 | dma-channel@180 { | ||
208 | compatible = "fsl,mpc8377-dma-channel", "fsl,elo-dma-channel"; | ||
209 | reg = <0x180 0x28>; | ||
210 | cell-index = <3>; | ||
211 | interrupt-parent = <&ipic>; | ||
212 | interrupts = <71 8>; | ||
213 | }; | ||
214 | }; | ||
215 | |||
216 | usb@23000 { | ||
217 | compatible = "fsl-usb2-dr"; | ||
218 | reg = <0x23000 0x1000>; | ||
219 | #address-cells = <1>; | ||
220 | #size-cells = <0>; | ||
221 | interrupt-parent = <&ipic>; | ||
222 | interrupts = <38 0x8>; | ||
223 | phy_type = "ulpi"; | ||
224 | sleep = <&pmc 0x00c00000>; | ||
225 | }; | ||
226 | |||
227 | enet0: ethernet@24000 { | ||
228 | #address-cells = <1>; | ||
229 | #size-cells = <1>; | ||
230 | cell-index = <0>; | ||
231 | device_type = "network"; | ||
232 | model = "eTSEC"; | ||
233 | compatible = "gianfar"; | ||
234 | reg = <0x24000 0x1000>; | ||
235 | ranges = <0x0 0x24000 0x1000>; | ||
236 | local-mac-address = [ 00 00 00 00 00 00 ]; | ||
237 | interrupts = <32 0x8 33 0x8 34 0x8>; | ||
238 | phy-connection-type = "mii"; | ||
239 | interrupt-parent = <&ipic>; | ||
240 | tbi-handle = <&tbi0>; | ||
241 | phy-handle = <&phy2>; | ||
242 | sleep = <&pmc 0xc0000000>; | ||
243 | fsl,magic-packet; | ||
244 | |||
245 | mdio@520 { | ||
246 | #address-cells = <1>; | ||
247 | #size-cells = <0>; | ||
248 | compatible = "fsl,gianfar-mdio"; | ||
249 | reg = <0x520 0x20>; | ||
250 | |||
251 | phy2: ethernet-phy@2 { | ||
252 | interrupt-parent = <&ipic>; | ||
253 | interrupts = <17 0x8>; | ||
254 | reg = <0x2>; | ||
255 | device_type = "ethernet-phy"; | ||
256 | }; | ||
257 | |||
258 | phy3: ethernet-phy@3 { | ||
259 | interrupt-parent = <&ipic>; | ||
260 | interrupts = <18 0x8>; | ||
261 | reg = <0x3>; | ||
262 | device_type = "ethernet-phy"; | ||
263 | }; | ||
264 | |||
265 | tbi0: tbi-phy@11 { | ||
266 | reg = <0x11>; | ||
267 | device_type = "tbi-phy"; | ||
268 | }; | ||
269 | }; | ||
270 | }; | ||
271 | |||
272 | enet1: ethernet@25000 { | ||
273 | #address-cells = <1>; | ||
274 | #size-cells = <1>; | ||
275 | cell-index = <1>; | ||
276 | device_type = "network"; | ||
277 | model = "eTSEC"; | ||
278 | compatible = "gianfar"; | ||
279 | reg = <0x25000 0x1000>; | ||
280 | ranges = <0x0 0x25000 0x1000>; | ||
281 | local-mac-address = [ 00 00 00 00 00 00 ]; | ||
282 | interrupts = <35 0x8 36 0x8 37 0x8>; | ||
283 | phy-connection-type = "mii"; | ||
284 | interrupt-parent = <&ipic>; | ||
285 | phy-handle = <&phy3>; | ||
286 | tbi-handle = <&tbi1>; | ||
287 | sleep = <&pmc 0x30000000>; | ||
288 | fsl,magic-packet; | ||
289 | |||
290 | mdio@520 { | ||
291 | #address-cells = <1>; | ||
292 | #size-cells = <0>; | ||
293 | compatible = "fsl,gianfar-tbi"; | ||
294 | reg = <0x520 0x20>; | ||
295 | |||
296 | tbi1: tbi-phy@11 { | ||
297 | reg = <0x11>; | ||
298 | device_type = "tbi-phy"; | ||
299 | }; | ||
300 | }; | ||
301 | }; | ||
302 | |||
303 | serial0: serial@4500 { | ||
304 | cell-index = <0>; | ||
305 | device_type = "serial"; | ||
306 | compatible = "ns16550"; | ||
307 | reg = <0x4500 0x100>; | ||
308 | clock-frequency = <0>; | ||
309 | interrupts = <9 0x8>; | ||
310 | interrupt-parent = <&ipic>; | ||
311 | }; | ||
312 | |||
313 | serial1: serial@4600 { | ||
314 | cell-index = <1>; | ||
315 | device_type = "serial"; | ||
316 | compatible = "ns16550"; | ||
317 | reg = <0x4600 0x100>; | ||
318 | clock-frequency = <0>; | ||
319 | interrupts = <10 0x8>; | ||
320 | interrupt-parent = <&ipic>; | ||
321 | }; | ||
322 | |||
323 | crypto@30000 { | ||
324 | compatible = "fsl,sec3.0", "fsl,sec2.4", "fsl,sec2.2", | ||
325 | "fsl,sec2.1", "fsl,sec2.0"; | ||
326 | reg = <0x30000 0x10000>; | ||
327 | interrupts = <11 0x8>; | ||
328 | interrupt-parent = <&ipic>; | ||
329 | fsl,num-channels = <4>; | ||
330 | fsl,channel-fifo-len = <24>; | ||
331 | fsl,exec-units-mask = <0x9fe>; | ||
332 | fsl,descriptor-types-mask = <0x3ab0ebf>; | ||
333 | sleep = <&pmc 0x03000000>; | ||
334 | }; | ||
335 | |||
336 | sata@18000 { | ||
337 | compatible = "fsl,mpc8377-sata", "fsl,pq-sata"; | ||
338 | reg = <0x18000 0x1000>; | ||
339 | interrupts = <44 0x8>; | ||
340 | interrupt-parent = <&ipic>; | ||
341 | sleep = <&pmc 0x000000c0>; | ||
342 | }; | ||
343 | |||
344 | sata@19000 { | ||
345 | compatible = "fsl,mpc8377-sata", "fsl,pq-sata"; | ||
346 | reg = <0x19000 0x1000>; | ||
347 | interrupts = <45 0x8>; | ||
348 | interrupt-parent = <&ipic>; | ||
349 | sleep = <&pmc 0x00000030>; | ||
350 | }; | ||
351 | |||
352 | /* IPIC | ||
353 | * interrupts cell = <intr #, sense> | ||
354 | * sense values match linux IORESOURCE_IRQ_* defines: | ||
355 | * sense == 8: Level, low assertion | ||
356 | * sense == 2: Edge, high-to-low change | ||
357 | */ | ||
358 | ipic: interrupt-controller@700 { | ||
359 | compatible = "fsl,ipic"; | ||
360 | interrupt-controller; | ||
361 | #address-cells = <0>; | ||
362 | #interrupt-cells = <2>; | ||
363 | reg = <0x700 0x100>; | ||
364 | }; | ||
365 | |||
366 | pmc: power@b00 { | ||
367 | compatible = "fsl,mpc8377-pmc", "fsl,mpc8349-pmc"; | ||
368 | reg = <0xb00 0x100 0xa00 0x100>; | ||
369 | interrupts = <80 0x8>; | ||
370 | interrupt-parent = <&ipic>; | ||
371 | }; | ||
372 | }; | ||
373 | |||
374 | pci0: pci@e0008500 { | ||
375 | interrupt-map-mask = <0xf800 0 0 7>; | ||
376 | interrupt-map = < | ||
377 | /* IRQ5 = 21 = 0x15, IRQ6 = 0x16, IRQ7 = 23 = 0x17 */ | ||
378 | |||
379 | /* IDSEL AD14 IRQ6 inta */ | ||
380 | 0x7000 0x0 0x0 0x1 &ipic 22 0x8 | ||
381 | |||
382 | /* IDSEL AD15 IRQ5 inta */ | ||
383 | 0x7800 0x0 0x0 0x1 &ipic 21 0x8>; | ||
384 | interrupt-parent = <&ipic>; | ||
385 | interrupts = <66 0x8>; | ||
386 | bus-range = <0 0>; | ||
387 | ranges = <0x02000000 0x0 0x90000000 0x90000000 0x0 0x10000000 | ||
388 | 0x42000000 0x0 0x80000000 0x80000000 0x0 0x10000000 | ||
389 | 0x01000000 0x0 0x00000000 0xe0300000 0x0 0x00100000>; | ||
390 | sleep = <&pmc 0x00010000>; | ||
391 | clock-frequency = <66666666>; | ||
392 | #interrupt-cells = <1>; | ||
393 | #size-cells = <2>; | ||
394 | #address-cells = <3>; | ||
395 | reg = <0xe0008500 0x100 /* internal registers */ | ||
396 | 0xe0008300 0x8>; /* config space access registers */ | ||
397 | compatible = "fsl,mpc8349-pci"; | ||
398 | device_type = "pci"; | ||
399 | }; | ||
400 | |||
401 | pci1: pcie@e0009000 { | ||
402 | #address-cells = <3>; | ||
403 | #size-cells = <2>; | ||
404 | #interrupt-cells = <1>; | ||
405 | device_type = "pci"; | ||
406 | compatible = "fsl,mpc8377-pcie", "fsl,mpc8314-pcie"; | ||
407 | reg = <0xe0009000 0x00001000>; | ||
408 | ranges = <0x02000000 0 0xa8000000 0xa8000000 0 0x10000000 | ||
409 | 0x01000000 0 0x00000000 0xb8000000 0 0x00800000>; | ||
410 | bus-range = <0 255>; | ||
411 | interrupt-map-mask = <0xf800 0 0 7>; | ||
412 | interrupt-map = <0 0 0 1 &ipic 1 8 | ||
413 | 0 0 0 2 &ipic 1 8 | ||
414 | 0 0 0 3 &ipic 1 8 | ||
415 | 0 0 0 4 &ipic 1 8>; | ||
416 | sleep = <&pmc 0x00300000>; | ||
417 | clock-frequency = <0>; | ||
418 | |||
419 | pcie@0 { | ||
420 | #address-cells = <3>; | ||
421 | #size-cells = <2>; | ||
422 | device_type = "pci"; | ||
423 | reg = <0 0 0 0 0>; | ||
424 | ranges = <0x02000000 0 0xa8000000 | ||
425 | 0x02000000 0 0xa8000000 | ||
426 | 0 0x10000000 | ||
427 | 0x01000000 0 0x00000000 | ||
428 | 0x01000000 0 0x00000000 | ||
429 | 0 0x00800000>; | ||
430 | }; | ||
431 | }; | ||
432 | |||
433 | pci2: pcie@e000a000 { | ||
434 | #address-cells = <3>; | ||
435 | #size-cells = <2>; | ||
436 | #interrupt-cells = <1>; | ||
437 | device_type = "pci"; | ||
438 | compatible = "fsl,mpc8377-pcie", "fsl,mpc8314-pcie"; | ||
439 | reg = <0xe000a000 0x00001000>; | ||
440 | ranges = <0x02000000 0 0xc8000000 0xc8000000 0 0x10000000 | ||
441 | 0x01000000 0 0x00000000 0xd8000000 0 0x00800000>; | ||
442 | bus-range = <0 255>; | ||
443 | interrupt-map-mask = <0xf800 0 0 7>; | ||
444 | interrupt-map = <0 0 0 1 &ipic 2 8 | ||
445 | 0 0 0 2 &ipic 2 8 | ||
446 | 0 0 0 3 &ipic 2 8 | ||
447 | 0 0 0 4 &ipic 2 8>; | ||
448 | sleep = <&pmc 0x000c0000>; | ||
449 | clock-frequency = <0>; | ||
450 | |||
451 | pcie@0 { | ||
452 | #address-cells = <3>; | ||
453 | #size-cells = <2>; | ||
454 | device_type = "pci"; | ||
455 | reg = <0 0 0 0 0>; | ||
456 | ranges = <0x02000000 0 0xc8000000 | ||
457 | 0x02000000 0 0xc8000000 | ||
458 | 0 0x10000000 | ||
459 | 0x01000000 0 0x00000000 | ||
460 | 0x01000000 0 0x00000000 | ||
461 | 0 0x00800000>; | ||
462 | }; | ||
463 | }; | ||
464 | }; | ||
diff --git a/arch/powerpc/boot/dts/mpc8378_rdb.dts b/arch/powerpc/boot/dts/mpc8378_rdb.dts index aabf3437cadf..a11ead8214b4 100644 --- a/arch/powerpc/boot/dts/mpc8378_rdb.dts +++ b/arch/powerpc/boot/dts/mpc8378_rdb.dts | |||
@@ -174,7 +174,7 @@ | |||
174 | interrupts = <42 0x8>; | 174 | interrupts = <42 0x8>; |
175 | interrupt-parent = <&ipic>; | 175 | interrupt-parent = <&ipic>; |
176 | /* Filled in by U-Boot */ | 176 | /* Filled in by U-Boot */ |
177 | clock-frequency = <0>; | 177 | clock-frequency = <111111111>; |
178 | }; | 178 | }; |
179 | }; | 179 | }; |
180 | 180 | ||
diff --git a/arch/powerpc/boot/dts/mpc8379_rdb.dts b/arch/powerpc/boot/dts/mpc8379_rdb.dts index 9b1da864d890..e35dfba587c8 100644 --- a/arch/powerpc/boot/dts/mpc8379_rdb.dts +++ b/arch/powerpc/boot/dts/mpc8379_rdb.dts | |||
@@ -172,7 +172,7 @@ | |||
172 | interrupts = <42 0x8>; | 172 | interrupts = <42 0x8>; |
173 | interrupt-parent = <&ipic>; | 173 | interrupt-parent = <&ipic>; |
174 | /* Filled in by U-Boot */ | 174 | /* Filled in by U-Boot */ |
175 | clock-frequency = <0>; | 175 | clock-frequency = <111111111>; |
176 | }; | 176 | }; |
177 | }; | 177 | }; |
178 | 178 | ||
diff --git a/arch/powerpc/boot/dts/mpc8536ds.dts b/arch/powerpc/boot/dts/mpc8536ds.dts index e781ad2f1f8a..22caf69e6efd 100644 --- a/arch/powerpc/boot/dts/mpc8536ds.dts +++ b/arch/powerpc/boot/dts/mpc8536ds.dts | |||
@@ -14,8 +14,8 @@ | |||
14 | / { | 14 | / { |
15 | model = "fsl,mpc8536ds"; | 15 | model = "fsl,mpc8536ds"; |
16 | compatible = "fsl,mpc8536ds"; | 16 | compatible = "fsl,mpc8536ds"; |
17 | #address-cells = <1>; | 17 | #address-cells = <2>; |
18 | #size-cells = <1>; | 18 | #size-cells = <2>; |
19 | 19 | ||
20 | aliases { | 20 | aliases { |
21 | ethernet0 = &enet0; | 21 | ethernet0 = &enet0; |
@@ -42,7 +42,7 @@ | |||
42 | 42 | ||
43 | memory { | 43 | memory { |
44 | device_type = "memory"; | 44 | device_type = "memory"; |
45 | reg = <00000000 00000000>; // Filled by U-Boot | 45 | reg = <0 0 0 0>; // Filled by U-Boot |
46 | }; | 46 | }; |
47 | 47 | ||
48 | soc@ffe00000 { | 48 | soc@ffe00000 { |
@@ -50,7 +50,7 @@ | |||
50 | #size-cells = <1>; | 50 | #size-cells = <1>; |
51 | device_type = "soc"; | 51 | device_type = "soc"; |
52 | compatible = "simple-bus"; | 52 | compatible = "simple-bus"; |
53 | ranges = <0x0 0xffe00000 0x100000>; | 53 | ranges = <0x0 0 0xffe00000 0x100000>; |
54 | bus-frequency = <0>; // Filled out by uboot. | 54 | bus-frequency = <0>; // Filled out by uboot. |
55 | 55 | ||
56 | ecm-law@0 { | 56 | ecm-law@0 { |
@@ -347,13 +347,13 @@ | |||
347 | interrupt-parent = <&mpic>; | 347 | interrupt-parent = <&mpic>; |
348 | interrupts = <24 0x2>; | 348 | interrupts = <24 0x2>; |
349 | bus-range = <0 0xff>; | 349 | bus-range = <0 0xff>; |
350 | ranges = <0x02000000 0 0x80000000 0x80000000 0 0x10000000 | 350 | ranges = <0x02000000 0 0x80000000 0 0x80000000 0 0x10000000 |
351 | 0x01000000 0 0x00000000 0xffc00000 0 0x00010000>; | 351 | 0x01000000 0 0x00000000 0 0xffc00000 0 0x00010000>; |
352 | clock-frequency = <66666666>; | 352 | clock-frequency = <66666666>; |
353 | #interrupt-cells = <1>; | 353 | #interrupt-cells = <1>; |
354 | #size-cells = <2>; | 354 | #size-cells = <2>; |
355 | #address-cells = <3>; | 355 | #address-cells = <3>; |
356 | reg = <0xffe08000 0x1000>; | 356 | reg = <0 0xffe08000 0 0x1000>; |
357 | }; | 357 | }; |
358 | 358 | ||
359 | pci1: pcie@ffe09000 { | 359 | pci1: pcie@ffe09000 { |
@@ -362,10 +362,10 @@ | |||
362 | #interrupt-cells = <1>; | 362 | #interrupt-cells = <1>; |
363 | #size-cells = <2>; | 363 | #size-cells = <2>; |
364 | #address-cells = <3>; | 364 | #address-cells = <3>; |
365 | reg = <0xffe09000 0x1000>; | 365 | reg = <0 0xffe09000 0 0x1000>; |
366 | bus-range = <0 0xff>; | 366 | bus-range = <0 0xff>; |
367 | ranges = <0x02000000 0 0x98000000 0x98000000 0 0x08000000 | 367 | ranges = <0x02000000 0 0x98000000 0 0x98000000 0 0x08000000 |
368 | 0x01000000 0 0x00000000 0xffc20000 0 0x00010000>; | 368 | 0x01000000 0 0x00000000 0 0xffc20000 0 0x00010000>; |
369 | clock-frequency = <33333333>; | 369 | clock-frequency = <33333333>; |
370 | interrupt-parent = <&mpic>; | 370 | interrupt-parent = <&mpic>; |
371 | interrupts = <25 0x2>; | 371 | interrupts = <25 0x2>; |
@@ -398,10 +398,10 @@ | |||
398 | #interrupt-cells = <1>; | 398 | #interrupt-cells = <1>; |
399 | #size-cells = <2>; | 399 | #size-cells = <2>; |
400 | #address-cells = <3>; | 400 | #address-cells = <3>; |
401 | reg = <0xffe0a000 0x1000>; | 401 | reg = <0 0xffe0a000 0 0x1000>; |
402 | bus-range = <0 0xff>; | 402 | bus-range = <0 0xff>; |
403 | ranges = <0x02000000 0 0x90000000 0x90000000 0 0x08000000 | 403 | ranges = <0x02000000 0 0x90000000 0 0x90000000 0 0x08000000 |
404 | 0x01000000 0 0x00000000 0xffc10000 0 0x00010000>; | 404 | 0x01000000 0 0x00000000 0 0xffc10000 0 0x00010000>; |
405 | clock-frequency = <33333333>; | 405 | clock-frequency = <33333333>; |
406 | interrupt-parent = <&mpic>; | 406 | interrupt-parent = <&mpic>; |
407 | interrupts = <26 0x2>; | 407 | interrupts = <26 0x2>; |
@@ -434,10 +434,10 @@ | |||
434 | #interrupt-cells = <1>; | 434 | #interrupt-cells = <1>; |
435 | #size-cells = <2>; | 435 | #size-cells = <2>; |
436 | #address-cells = <3>; | 436 | #address-cells = <3>; |
437 | reg = <0xffe0b000 0x1000>; | 437 | reg = <0 0xffe0b000 0 0x1000>; |
438 | bus-range = <0 0xff>; | 438 | bus-range = <0 0xff>; |
439 | ranges = <0x02000000 0 0xa0000000 0xa0000000 0 0x20000000 | 439 | ranges = <0x02000000 0 0xa0000000 0 0xa0000000 0 0x20000000 |
440 | 0x01000000 0 0x00000000 0xffc30000 0 0x00010000>; | 440 | 0x01000000 0 0x00000000 0 0xffc30000 0 0x00010000>; |
441 | clock-frequency = <33333333>; | 441 | clock-frequency = <33333333>; |
442 | interrupt-parent = <&mpic>; | 442 | interrupt-parent = <&mpic>; |
443 | interrupts = <27 0x2>; | 443 | interrupts = <27 0x2>; |
diff --git a/arch/powerpc/boot/dts/mpc8536ds_36b.dts b/arch/powerpc/boot/dts/mpc8536ds_36b.dts new file mode 100644 index 000000000000..113ed8b7c898 --- /dev/null +++ b/arch/powerpc/boot/dts/mpc8536ds_36b.dts | |||
@@ -0,0 +1,467 @@ | |||
1 | /* | ||
2 | * MPC8536 DS Device Tree Source | ||
3 | * | ||
4 | * Copyright 2008-2009 Freescale Semiconductor, Inc. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the | ||
8 | * Free Software Foundation; either version 2 of the License, or (at your | ||
9 | * option) any later version. | ||
10 | */ | ||
11 | |||
12 | /dts-v1/; | ||
13 | |||
14 | / { | ||
15 | model = "fsl,mpc8536ds"; | ||
16 | compatible = "fsl,mpc8536ds"; | ||
17 | #address-cells = <2>; | ||
18 | #size-cells = <2>; | ||
19 | |||
20 | aliases { | ||
21 | ethernet0 = &enet0; | ||
22 | ethernet1 = &enet1; | ||
23 | serial0 = &serial0; | ||
24 | serial1 = &serial1; | ||
25 | pci0 = &pci0; | ||
26 | pci1 = &pci1; | ||
27 | pci2 = &pci2; | ||
28 | pci3 = &pci3; | ||
29 | }; | ||
30 | |||
31 | cpus { | ||
32 | #cpus = <1>; | ||
33 | #address-cells = <1>; | ||
34 | #size-cells = <0>; | ||
35 | |||
36 | PowerPC,8536@0 { | ||
37 | device_type = "cpu"; | ||
38 | reg = <0>; | ||
39 | next-level-cache = <&L2>; | ||
40 | }; | ||
41 | }; | ||
42 | |||
43 | memory { | ||
44 | device_type = "memory"; | ||
45 | reg = <0 0 0 0>; // Filled by U-Boot | ||
46 | }; | ||
47 | |||
48 | soc@fffe00000 { | ||
49 | #address-cells = <1>; | ||
50 | #size-cells = <1>; | ||
51 | device_type = "soc"; | ||
52 | compatible = "simple-bus"; | ||
53 | ranges = <0x0 0xf 0xffe00000 0x100000>; | ||
54 | bus-frequency = <0>; // Filled out by uboot. | ||
55 | |||
56 | ecm-law@0 { | ||
57 | compatible = "fsl,ecm-law"; | ||
58 | reg = <0x0 0x1000>; | ||
59 | fsl,num-laws = <12>; | ||
60 | }; | ||
61 | |||
62 | ecm@1000 { | ||
63 | compatible = "fsl,mpc8536-ecm", "fsl,ecm"; | ||
64 | reg = <0x1000 0x1000>; | ||
65 | interrupts = <17 2>; | ||
66 | interrupt-parent = <&mpic>; | ||
67 | }; | ||
68 | |||
69 | memory-controller@2000 { | ||
70 | compatible = "fsl,mpc8536-memory-controller"; | ||
71 | reg = <0x2000 0x1000>; | ||
72 | interrupt-parent = <&mpic>; | ||
73 | interrupts = <18 0x2>; | ||
74 | }; | ||
75 | |||
76 | L2: l2-cache-controller@20000 { | ||
77 | compatible = "fsl,mpc8536-l2-cache-controller"; | ||
78 | reg = <0x20000 0x1000>; | ||
79 | interrupt-parent = <&mpic>; | ||
80 | interrupts = <16 0x2>; | ||
81 | }; | ||
82 | |||
83 | i2c@3000 { | ||
84 | #address-cells = <1>; | ||
85 | #size-cells = <0>; | ||
86 | cell-index = <0>; | ||
87 | compatible = "fsl-i2c"; | ||
88 | reg = <0x3000 0x100>; | ||
89 | interrupts = <43 0x2>; | ||
90 | interrupt-parent = <&mpic>; | ||
91 | dfsrr; | ||
92 | }; | ||
93 | |||
94 | i2c@3100 { | ||
95 | #address-cells = <1>; | ||
96 | #size-cells = <0>; | ||
97 | cell-index = <1>; | ||
98 | compatible = "fsl-i2c"; | ||
99 | reg = <0x3100 0x100>; | ||
100 | interrupts = <43 0x2>; | ||
101 | interrupt-parent = <&mpic>; | ||
102 | dfsrr; | ||
103 | rtc@68 { | ||
104 | compatible = "dallas,ds3232"; | ||
105 | reg = <0x68>; | ||
106 | interrupts = <0 0x1>; | ||
107 | interrupt-parent = <&mpic>; | ||
108 | }; | ||
109 | }; | ||
110 | |||
111 | dma@21300 { | ||
112 | #address-cells = <1>; | ||
113 | #size-cells = <1>; | ||
114 | compatible = "fsl,mpc8536-dma", "fsl,eloplus-dma"; | ||
115 | reg = <0x21300 4>; | ||
116 | ranges = <0 0x21100 0x200>; | ||
117 | cell-index = <0>; | ||
118 | dma-channel@0 { | ||
119 | compatible = "fsl,mpc8536-dma-channel", | ||
120 | "fsl,eloplus-dma-channel"; | ||
121 | reg = <0x0 0x80>; | ||
122 | cell-index = <0>; | ||
123 | interrupt-parent = <&mpic>; | ||
124 | interrupts = <20 2>; | ||
125 | }; | ||
126 | dma-channel@80 { | ||
127 | compatible = "fsl,mpc8536-dma-channel", | ||
128 | "fsl,eloplus-dma-channel"; | ||
129 | reg = <0x80 0x80>; | ||
130 | cell-index = <1>; | ||
131 | interrupt-parent = <&mpic>; | ||
132 | interrupts = <21 2>; | ||
133 | }; | ||
134 | dma-channel@100 { | ||
135 | compatible = "fsl,mpc8536-dma-channel", | ||
136 | "fsl,eloplus-dma-channel"; | ||
137 | reg = <0x100 0x80>; | ||
138 | cell-index = <2>; | ||
139 | interrupt-parent = <&mpic>; | ||
140 | interrupts = <22 2>; | ||
141 | }; | ||
142 | dma-channel@180 { | ||
143 | compatible = "fsl,mpc8536-dma-channel", | ||
144 | "fsl,eloplus-dma-channel"; | ||
145 | reg = <0x180 0x80>; | ||
146 | cell-index = <3>; | ||
147 | interrupt-parent = <&mpic>; | ||
148 | interrupts = <23 2>; | ||
149 | }; | ||
150 | }; | ||
151 | |||
152 | usb@22000 { | ||
153 | compatible = "fsl,mpc8536-usb2-mph", "fsl-usb2-mph"; | ||
154 | reg = <0x22000 0x1000>; | ||
155 | #address-cells = <1>; | ||
156 | #size-cells = <0>; | ||
157 | interrupt-parent = <&mpic>; | ||
158 | interrupts = <28 0x2>; | ||
159 | phy_type = "ulpi"; | ||
160 | }; | ||
161 | |||
162 | usb@23000 { | ||
163 | compatible = "fsl,mpc8536-usb2-mph", "fsl-usb2-mph"; | ||
164 | reg = <0x23000 0x1000>; | ||
165 | #address-cells = <1>; | ||
166 | #size-cells = <0>; | ||
167 | interrupt-parent = <&mpic>; | ||
168 | interrupts = <46 0x2>; | ||
169 | phy_type = "ulpi"; | ||
170 | }; | ||
171 | |||
172 | enet0: ethernet@24000 { | ||
173 | #address-cells = <1>; | ||
174 | #size-cells = <1>; | ||
175 | cell-index = <0>; | ||
176 | device_type = "network"; | ||
177 | model = "eTSEC"; | ||
178 | compatible = "gianfar"; | ||
179 | reg = <0x24000 0x1000>; | ||
180 | ranges = <0x0 0x24000 0x1000>; | ||
181 | local-mac-address = [ 00 00 00 00 00 00 ]; | ||
182 | interrupts = <29 2 30 2 34 2>; | ||
183 | interrupt-parent = <&mpic>; | ||
184 | tbi-handle = <&tbi0>; | ||
185 | phy-handle = <&phy1>; | ||
186 | phy-connection-type = "rgmii-id"; | ||
187 | |||
188 | mdio@520 { | ||
189 | #address-cells = <1>; | ||
190 | #size-cells = <0>; | ||
191 | compatible = "fsl,gianfar-mdio"; | ||
192 | reg = <0x520 0x20>; | ||
193 | |||
194 | phy0: ethernet-phy@0 { | ||
195 | interrupt-parent = <&mpic>; | ||
196 | interrupts = <10 0x1>; | ||
197 | reg = <0>; | ||
198 | device_type = "ethernet-phy"; | ||
199 | }; | ||
200 | phy1: ethernet-phy@1 { | ||
201 | interrupt-parent = <&mpic>; | ||
202 | interrupts = <10 0x1>; | ||
203 | reg = <1>; | ||
204 | device_type = "ethernet-phy"; | ||
205 | }; | ||
206 | tbi0: tbi-phy@11 { | ||
207 | reg = <0x11>; | ||
208 | device_type = "tbi-phy"; | ||
209 | }; | ||
210 | }; | ||
211 | }; | ||
212 | |||
213 | enet1: ethernet@26000 { | ||
214 | #address-cells = <1>; | ||
215 | #size-cells = <1>; | ||
216 | cell-index = <1>; | ||
217 | device_type = "network"; | ||
218 | model = "eTSEC"; | ||
219 | compatible = "gianfar"; | ||
220 | reg = <0x26000 0x1000>; | ||
221 | ranges = <0x0 0x26000 0x1000>; | ||
222 | local-mac-address = [ 00 00 00 00 00 00 ]; | ||
223 | interrupts = <31 2 32 2 33 2>; | ||
224 | interrupt-parent = <&mpic>; | ||
225 | tbi-handle = <&tbi1>; | ||
226 | phy-handle = <&phy0>; | ||
227 | phy-connection-type = "rgmii-id"; | ||
228 | |||
229 | mdio@520 { | ||
230 | #address-cells = <1>; | ||
231 | #size-cells = <0>; | ||
232 | compatible = "fsl,gianfar-tbi"; | ||
233 | reg = <0x520 0x20>; | ||
234 | |||
235 | tbi1: tbi-phy@11 { | ||
236 | reg = <0x11>; | ||
237 | device_type = "tbi-phy"; | ||
238 | }; | ||
239 | }; | ||
240 | }; | ||
241 | |||
242 | usb@2b000 { | ||
243 | compatible = "fsl,mpc8536-usb2-dr", "fsl-usb2-dr"; | ||
244 | reg = <0x2b000 0x1000>; | ||
245 | #address-cells = <1>; | ||
246 | #size-cells = <0>; | ||
247 | interrupt-parent = <&mpic>; | ||
248 | interrupts = <60 0x2>; | ||
249 | dr_mode = "peripheral"; | ||
250 | phy_type = "ulpi"; | ||
251 | }; | ||
252 | |||
253 | serial0: serial@4500 { | ||
254 | cell-index = <0>; | ||
255 | device_type = "serial"; | ||
256 | compatible = "ns16550"; | ||
257 | reg = <0x4500 0x100>; | ||
258 | clock-frequency = <0>; | ||
259 | interrupts = <42 0x2>; | ||
260 | interrupt-parent = <&mpic>; | ||
261 | }; | ||
262 | |||
263 | serial1: serial@4600 { | ||
264 | cell-index = <1>; | ||
265 | device_type = "serial"; | ||
266 | compatible = "ns16550"; | ||
267 | reg = <0x4600 0x100>; | ||
268 | clock-frequency = <0>; | ||
269 | interrupts = <42 0x2>; | ||
270 | interrupt-parent = <&mpic>; | ||
271 | }; | ||
272 | |||
273 | crypto@30000 { | ||
274 | compatible = "fsl,sec3.0", "fsl,sec2.4", "fsl,sec2.2", | ||
275 | "fsl,sec2.1", "fsl,sec2.0"; | ||
276 | reg = <0x30000 0x10000>; | ||
277 | interrupts = <45 2 58 2>; | ||
278 | interrupt-parent = <&mpic>; | ||
279 | fsl,num-channels = <4>; | ||
280 | fsl,channel-fifo-len = <24>; | ||
281 | fsl,exec-units-mask = <0x9fe>; | ||
282 | fsl,descriptor-types-mask = <0x3ab0ebf>; | ||
283 | }; | ||
284 | |||
285 | sata@18000 { | ||
286 | compatible = "fsl,mpc8536-sata", "fsl,pq-sata"; | ||
287 | reg = <0x18000 0x1000>; | ||
288 | cell-index = <1>; | ||
289 | interrupts = <74 0x2>; | ||
290 | interrupt-parent = <&mpic>; | ||
291 | }; | ||
292 | |||
293 | sata@19000 { | ||
294 | compatible = "fsl,mpc8536-sata", "fsl,pq-sata"; | ||
295 | reg = <0x19000 0x1000>; | ||
296 | cell-index = <2>; | ||
297 | interrupts = <41 0x2>; | ||
298 | interrupt-parent = <&mpic>; | ||
299 | }; | ||
300 | |||
301 | global-utilities@e0000 { //global utilities block | ||
302 | compatible = "fsl,mpc8548-guts"; | ||
303 | reg = <0xe0000 0x1000>; | ||
304 | fsl,has-rstcr; | ||
305 | }; | ||
306 | |||
307 | mpic: pic@40000 { | ||
308 | clock-frequency = <0>; | ||
309 | interrupt-controller; | ||
310 | #address-cells = <0>; | ||
311 | #interrupt-cells = <2>; | ||
312 | reg = <0x40000 0x40000>; | ||
313 | compatible = "chrp,open-pic"; | ||
314 | device_type = "open-pic"; | ||
315 | big-endian; | ||
316 | }; | ||
317 | |||
318 | msi@41600 { | ||
319 | compatible = "fsl,mpc8536-msi", "fsl,mpic-msi"; | ||
320 | reg = <0x41600 0x80>; | ||
321 | msi-available-ranges = <0 0x100>; | ||
322 | interrupts = < | ||
323 | 0xe0 0 | ||
324 | 0xe1 0 | ||
325 | 0xe2 0 | ||
326 | 0xe3 0 | ||
327 | 0xe4 0 | ||
328 | 0xe5 0 | ||
329 | 0xe6 0 | ||
330 | 0xe7 0>; | ||
331 | interrupt-parent = <&mpic>; | ||
332 | }; | ||
333 | }; | ||
334 | |||
335 | pci0: pci@fffe08000 { | ||
336 | compatible = "fsl,mpc8540-pci"; | ||
337 | device_type = "pci"; | ||
338 | interrupt-map-mask = <0xf800 0x0 0x0 0x7>; | ||
339 | interrupt-map = < | ||
340 | |||
341 | /* IDSEL 0x11 J17 Slot 1 */ | ||
342 | 0x8800 0 0 1 &mpic 1 1 | ||
343 | 0x8800 0 0 2 &mpic 2 1 | ||
344 | 0x8800 0 0 3 &mpic 3 1 | ||
345 | 0x8800 0 0 4 &mpic 4 1>; | ||
346 | |||
347 | interrupt-parent = <&mpic>; | ||
348 | interrupts = <24 0x2>; | ||
349 | bus-range = <0 0xff>; | ||
350 | ranges = <0x02000000 0 0xf0000000 0xc 0x00000000 0 0x10000000 | ||
351 | 0x01000000 0 0x00000000 0xf 0xffc00000 0 0x00010000>; | ||
352 | clock-frequency = <66666666>; | ||
353 | #interrupt-cells = <1>; | ||
354 | #size-cells = <2>; | ||
355 | #address-cells = <3>; | ||
356 | reg = <0xf 0xffe08000 0 0x1000>; | ||
357 | }; | ||
358 | |||
359 | pci1: pcie@fffe09000 { | ||
360 | compatible = "fsl,mpc8548-pcie"; | ||
361 | device_type = "pci"; | ||
362 | #interrupt-cells = <1>; | ||
363 | #size-cells = <2>; | ||
364 | #address-cells = <3>; | ||
365 | reg = <0xf 0xffe09000 0 0x1000>; | ||
366 | bus-range = <0 0xff>; | ||
367 | ranges = <0x02000000 0 0xf8000000 0xc 0x18000000 0 0x08000000 | ||
368 | 0x01000000 0 0x00000000 0xf 0xffc20000 0 0x00010000>; | ||
369 | clock-frequency = <33333333>; | ||
370 | interrupt-parent = <&mpic>; | ||
371 | interrupts = <25 0x2>; | ||
372 | interrupt-map-mask = <0xf800 0 0 7>; | ||
373 | interrupt-map = < | ||
374 | /* IDSEL 0x0 */ | ||
375 | 0000 0 0 1 &mpic 4 1 | ||
376 | 0000 0 0 2 &mpic 5 1 | ||
377 | 0000 0 0 3 &mpic 6 1 | ||
378 | 0000 0 0 4 &mpic 7 1 | ||
379 | >; | ||
380 | pcie@0 { | ||
381 | reg = <0 0 0 0 0>; | ||
382 | #size-cells = <2>; | ||
383 | #address-cells = <3>; | ||
384 | device_type = "pci"; | ||
385 | ranges = <0x02000000 0 0xf8000000 | ||
386 | 0x02000000 0 0xf8000000 | ||
387 | 0 0x08000000 | ||
388 | |||
389 | 0x01000000 0 0x00000000 | ||
390 | 0x01000000 0 0x00000000 | ||
391 | 0 0x00010000>; | ||
392 | }; | ||
393 | }; | ||
394 | |||
395 | pci2: pcie@fffe0a000 { | ||
396 | compatible = "fsl,mpc8548-pcie"; | ||
397 | device_type = "pci"; | ||
398 | #interrupt-cells = <1>; | ||
399 | #size-cells = <2>; | ||
400 | #address-cells = <3>; | ||
401 | reg = <0xf 0xffe0a000 0 0x1000>; | ||
402 | bus-range = <0 0xff>; | ||
403 | ranges = <0x02000000 0 0xf8000000 0xc 0x10000000 0 0x08000000 | ||
404 | 0x01000000 0 0x00000000 0xf 0xffc10000 0 0x00010000>; | ||
405 | clock-frequency = <33333333>; | ||
406 | interrupt-parent = <&mpic>; | ||
407 | interrupts = <26 0x2>; | ||
408 | interrupt-map-mask = <0xf800 0 0 7>; | ||
409 | interrupt-map = < | ||
410 | /* IDSEL 0x0 */ | ||
411 | 0000 0 0 1 &mpic 0 1 | ||
412 | 0000 0 0 2 &mpic 1 1 | ||
413 | 0000 0 0 3 &mpic 2 1 | ||
414 | 0000 0 0 4 &mpic 3 1 | ||
415 | >; | ||
416 | pcie@0 { | ||
417 | reg = <0 0 0 0 0>; | ||
418 | #size-cells = <2>; | ||
419 | #address-cells = <3>; | ||
420 | device_type = "pci"; | ||
421 | ranges = <0x02000000 0 0xf8000000 | ||
422 | 0x02000000 0 0xf8000000 | ||
423 | 0 0x08000000 | ||
424 | |||
425 | 0x01000000 0 0x00000000 | ||
426 | 0x01000000 0 0x00000000 | ||
427 | 0 0x00010000>; | ||
428 | }; | ||
429 | }; | ||
430 | |||
431 | pci3: pcie@fffe0b000 { | ||
432 | compatible = "fsl,mpc8548-pcie"; | ||
433 | device_type = "pci"; | ||
434 | #interrupt-cells = <1>; | ||
435 | #size-cells = <2>; | ||
436 | #address-cells = <3>; | ||
437 | reg = <0xf 0xffe0b000 0 0x1000>; | ||
438 | bus-range = <0 0xff>; | ||
439 | ranges = <0x02000000 0 0xe0000000 0xc 0x20000000 0 0x20000000 | ||
440 | 0x01000000 0 0x00000000 0xf 0xffc30000 0 0x00010000>; | ||
441 | clock-frequency = <33333333>; | ||
442 | interrupt-parent = <&mpic>; | ||
443 | interrupts = <27 0x2>; | ||
444 | interrupt-map-mask = <0xf800 0 0 7>; | ||
445 | interrupt-map = < | ||
446 | /* IDSEL 0x0 */ | ||
447 | 0000 0 0 1 &mpic 8 1 | ||
448 | 0000 0 0 2 &mpic 9 1 | ||
449 | 0000 0 0 3 &mpic 10 1 | ||
450 | 0000 0 0 4 &mpic 11 1 | ||
451 | >; | ||
452 | |||
453 | pcie@0 { | ||
454 | reg = <0 0 0 0 0>; | ||
455 | #size-cells = <2>; | ||
456 | #address-cells = <3>; | ||
457 | device_type = "pci"; | ||
458 | ranges = <0x02000000 0 0xe0000000 | ||
459 | 0x02000000 0 0xe0000000 | ||
460 | 0 0x20000000 | ||
461 | |||
462 | 0x01000000 0 0x00000000 | ||
463 | 0x01000000 0 0x00000000 | ||
464 | 0 0x00100000>; | ||
465 | }; | ||
466 | }; | ||
467 | }; | ||
diff --git a/arch/powerpc/boot/dts/mpc8548cds.dts b/arch/powerpc/boot/dts/mpc8548cds.dts index 475be1433fe1..4173af387c63 100644 --- a/arch/powerpc/boot/dts/mpc8548cds.dts +++ b/arch/powerpc/boot/dts/mpc8548cds.dts | |||
@@ -100,6 +100,21 @@ | |||
100 | interrupts = <43 2>; | 100 | interrupts = <43 2>; |
101 | interrupt-parent = <&mpic>; | 101 | interrupt-parent = <&mpic>; |
102 | dfsrr; | 102 | dfsrr; |
103 | |||
104 | eeprom@50 { | ||
105 | compatible = "atmel,24c64"; | ||
106 | reg = <0x50>; | ||
107 | }; | ||
108 | |||
109 | eeprom@56 { | ||
110 | compatible = "atmel,24c64"; | ||
111 | reg = <0x56>; | ||
112 | }; | ||
113 | |||
114 | eeprom@57 { | ||
115 | compatible = "atmel,24c64"; | ||
116 | reg = <0x57>; | ||
117 | }; | ||
103 | }; | 118 | }; |
104 | 119 | ||
105 | i2c@3100 { | 120 | i2c@3100 { |
@@ -111,6 +126,11 @@ | |||
111 | interrupts = <43 2>; | 126 | interrupts = <43 2>; |
112 | interrupt-parent = <&mpic>; | 127 | interrupt-parent = <&mpic>; |
113 | dfsrr; | 128 | dfsrr; |
129 | |||
130 | eeprom@50 { | ||
131 | compatible = "atmel,24c64"; | ||
132 | reg = <0x50>; | ||
133 | }; | ||
114 | }; | 134 | }; |
115 | 135 | ||
116 | dma@21300 { | 136 | dma@21300 { |
diff --git a/arch/powerpc/boot/mktree.c b/arch/powerpc/boot/mktree.c index c2baae0a3d89..e2ae24340fc8 100644 --- a/arch/powerpc/boot/mktree.c +++ b/arch/powerpc/boot/mktree.c | |||
@@ -36,7 +36,7 @@ typedef struct boot_block { | |||
36 | } boot_block_t; | 36 | } boot_block_t; |
37 | 37 | ||
38 | #define IMGBLK 512 | 38 | #define IMGBLK 512 |
39 | char tmpbuf[IMGBLK]; | 39 | unsigned int tmpbuf[IMGBLK / sizeof(unsigned int)]; |
40 | 40 | ||
41 | int main(int argc, char *argv[]) | 41 | int main(int argc, char *argv[]) |
42 | { | 42 | { |
@@ -95,13 +95,13 @@ int main(int argc, char *argv[]) | |||
95 | 95 | ||
96 | /* Assume zImage is an ELF file, and skip the 64K header. | 96 | /* Assume zImage is an ELF file, and skip the 64K header. |
97 | */ | 97 | */ |
98 | if (read(in_fd, tmpbuf, IMGBLK) != IMGBLK) { | 98 | if (read(in_fd, tmpbuf, sizeof(tmpbuf)) != sizeof(tmpbuf)) { |
99 | fprintf(stderr, "%s is too small to be an ELF image\n", | 99 | fprintf(stderr, "%s is too small to be an ELF image\n", |
100 | argv[1]); | 100 | argv[1]); |
101 | exit(4); | 101 | exit(4); |
102 | } | 102 | } |
103 | 103 | ||
104 | if ((*(unsigned int *)tmpbuf) != htonl(0x7f454c46)) { | 104 | if (tmpbuf[0] != htonl(0x7f454c46)) { |
105 | fprintf(stderr, "%s is not an ELF image\n", argv[1]); | 105 | fprintf(stderr, "%s is not an ELF image\n", argv[1]); |
106 | exit(4); | 106 | exit(4); |
107 | } | 107 | } |
@@ -121,11 +121,11 @@ int main(int argc, char *argv[]) | |||
121 | } | 121 | } |
122 | 122 | ||
123 | while (nblks-- > 0) { | 123 | while (nblks-- > 0) { |
124 | if (read(in_fd, tmpbuf, IMGBLK) < 0) { | 124 | if (read(in_fd, tmpbuf, sizeof(tmpbuf)) < 0) { |
125 | perror("zImage read"); | 125 | perror("zImage read"); |
126 | exit(5); | 126 | exit(5); |
127 | } | 127 | } |
128 | cp = (unsigned int *)tmpbuf; | 128 | cp = tmpbuf; |
129 | for (i = 0; i < sizeof(tmpbuf) / sizeof(unsigned int); i++) | 129 | for (i = 0; i < sizeof(tmpbuf) / sizeof(unsigned int); i++) |
130 | cksum += *cp++; | 130 | cksum += *cp++; |
131 | if (write(out_fd, tmpbuf, sizeof(tmpbuf)) != sizeof(tmpbuf)) { | 131 | if (write(out_fd, tmpbuf, sizeof(tmpbuf)) != sizeof(tmpbuf)) { |
diff --git a/arch/powerpc/boot/wrapper b/arch/powerpc/boot/wrapper index 4db487d1d2a8..ac9e9a58b2b0 100755 --- a/arch/powerpc/boot/wrapper +++ b/arch/powerpc/boot/wrapper | |||
@@ -46,6 +46,7 @@ CROSS= | |||
46 | # directory for object and other files used by this script | 46 | # directory for object and other files used by this script |
47 | object=arch/powerpc/boot | 47 | object=arch/powerpc/boot |
48 | objbin=$object | 48 | objbin=$object |
49 | dtc=scripts/dtc/dtc | ||
49 | 50 | ||
50 | # directory for working files | 51 | # directory for working files |
51 | tmpdir=. | 52 | tmpdir=. |
@@ -124,7 +125,7 @@ if [ -n "$dts" ]; then | |||
124 | if [ -z "$dtb" ]; then | 125 | if [ -z "$dtb" ]; then |
125 | dtb="$platform.dtb" | 126 | dtb="$platform.dtb" |
126 | fi | 127 | fi |
127 | $object/dtc -O dtb -o "$dtb" -b 0 "$dts" | 128 | $dtc -O dtb -o "$dtb" -b 0 "$dts" |
128 | fi | 129 | fi |
129 | 130 | ||
130 | if [ -z "$kernel" ]; then | 131 | if [ -z "$kernel" ]; then |
diff --git a/arch/powerpc/configs/40x/kilauea_defconfig b/arch/powerpc/configs/40x/kilauea_defconfig index 865725effe93..9a05ec0ec312 100644 --- a/arch/powerpc/configs/40x/kilauea_defconfig +++ b/arch/powerpc/configs/40x/kilauea_defconfig | |||
@@ -1,14 +1,14 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.30-rc7 | 3 | # Linux kernel version: 2.6.31-rc4 |
4 | # Wed Jun 3 10:18:16 2009 | 4 | # Wed Jul 29 13:28:37 2009 |
5 | # | 5 | # |
6 | # CONFIG_PPC64 is not set | 6 | # CONFIG_PPC64 is not set |
7 | 7 | ||
8 | # | 8 | # |
9 | # Processor support | 9 | # Processor support |
10 | # | 10 | # |
11 | # CONFIG_6xx is not set | 11 | # CONFIG_PPC_BOOK3S_32 is not set |
12 | # CONFIG_PPC_85xx is not set | 12 | # CONFIG_PPC_85xx is not set |
13 | # CONFIG_PPC_8xx is not set | 13 | # CONFIG_PPC_8xx is not set |
14 | CONFIG_40x=y | 14 | CONFIG_40x=y |
@@ -32,11 +32,11 @@ CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | |||
32 | CONFIG_IRQ_PER_CPU=y | 32 | CONFIG_IRQ_PER_CPU=y |
33 | CONFIG_STACKTRACE_SUPPORT=y | 33 | CONFIG_STACKTRACE_SUPPORT=y |
34 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | 34 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y |
35 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
35 | CONFIG_LOCKDEP_SUPPORT=y | 36 | CONFIG_LOCKDEP_SUPPORT=y |
36 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 37 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
37 | CONFIG_ARCH_HAS_ILOG2_U32=y | 38 | CONFIG_ARCH_HAS_ILOG2_U32=y |
38 | CONFIG_GENERIC_HWEIGHT=y | 39 | CONFIG_GENERIC_HWEIGHT=y |
39 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
40 | CONFIG_GENERIC_FIND_NEXT_BIT=y | 40 | CONFIG_GENERIC_FIND_NEXT_BIT=y |
41 | # CONFIG_ARCH_NO_VIRT_TO_BUS is not set | 41 | # CONFIG_ARCH_NO_VIRT_TO_BUS is not set |
42 | CONFIG_PPC=y | 42 | CONFIG_PPC=y |
@@ -57,6 +57,7 @@ CONFIG_PPC_DCR_NATIVE=y | |||
57 | CONFIG_PPC_DCR=y | 57 | CONFIG_PPC_DCR=y |
58 | CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y | 58 | CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y |
59 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 59 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
60 | CONFIG_CONSTRUCTORS=y | ||
60 | 61 | ||
61 | # | 62 | # |
62 | # General setup | 63 | # General setup |
@@ -108,7 +109,6 @@ CONFIG_SYSCTL_SYSCALL=y | |||
108 | CONFIG_KALLSYMS=y | 109 | CONFIG_KALLSYMS=y |
109 | CONFIG_KALLSYMS_ALL=y | 110 | CONFIG_KALLSYMS_ALL=y |
110 | CONFIG_KALLSYMS_EXTRA_PASS=y | 111 | CONFIG_KALLSYMS_EXTRA_PASS=y |
111 | # CONFIG_STRIP_ASM_SYMS is not set | ||
112 | CONFIG_HOTPLUG=y | 112 | CONFIG_HOTPLUG=y |
113 | CONFIG_PRINTK=y | 113 | CONFIG_PRINTK=y |
114 | CONFIG_BUG=y | 114 | CONFIG_BUG=y |
@@ -121,9 +121,16 @@ CONFIG_TIMERFD=y | |||
121 | CONFIG_EVENTFD=y | 121 | CONFIG_EVENTFD=y |
122 | CONFIG_SHMEM=y | 122 | CONFIG_SHMEM=y |
123 | CONFIG_AIO=y | 123 | CONFIG_AIO=y |
124 | CONFIG_HAVE_PERF_COUNTERS=y | ||
125 | |||
126 | # | ||
127 | # Performance Counters | ||
128 | # | ||
129 | # CONFIG_PERF_COUNTERS is not set | ||
124 | CONFIG_VM_EVENT_COUNTERS=y | 130 | CONFIG_VM_EVENT_COUNTERS=y |
125 | CONFIG_PCI_QUIRKS=y | 131 | CONFIG_PCI_QUIRKS=y |
126 | CONFIG_SLUB_DEBUG=y | 132 | CONFIG_SLUB_DEBUG=y |
133 | # CONFIG_STRIP_ASM_SYMS is not set | ||
127 | CONFIG_COMPAT_BRK=y | 134 | CONFIG_COMPAT_BRK=y |
128 | # CONFIG_SLAB is not set | 135 | # CONFIG_SLAB is not set |
129 | CONFIG_SLUB=y | 136 | CONFIG_SLUB=y |
@@ -137,6 +144,11 @@ CONFIG_HAVE_IOREMAP_PROT=y | |||
137 | CONFIG_HAVE_KPROBES=y | 144 | CONFIG_HAVE_KPROBES=y |
138 | CONFIG_HAVE_KRETPROBES=y | 145 | CONFIG_HAVE_KRETPROBES=y |
139 | CONFIG_HAVE_ARCH_TRACEHOOK=y | 146 | CONFIG_HAVE_ARCH_TRACEHOOK=y |
147 | |||
148 | # | ||
149 | # GCOV-based kernel profiling | ||
150 | # | ||
151 | # CONFIG_GCOV_KERNEL is not set | ||
140 | # CONFIG_SLOW_WORK is not set | 152 | # CONFIG_SLOW_WORK is not set |
141 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | 153 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set |
142 | CONFIG_SLABINFO=y | 154 | CONFIG_SLABINFO=y |
@@ -149,7 +161,7 @@ CONFIG_MODULE_UNLOAD=y | |||
149 | # CONFIG_MODVERSIONS is not set | 161 | # CONFIG_MODVERSIONS is not set |
150 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 162 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
151 | CONFIG_BLOCK=y | 163 | CONFIG_BLOCK=y |
152 | CONFIG_LBD=y | 164 | CONFIG_LBDAF=y |
153 | # CONFIG_BLK_DEV_BSG is not set | 165 | # CONFIG_BLK_DEV_BSG is not set |
154 | # CONFIG_BLK_DEV_INTEGRITY is not set | 166 | # CONFIG_BLK_DEV_INTEGRITY is not set |
155 | 167 | ||
@@ -220,6 +232,7 @@ CONFIG_BINFMT_ELF=y | |||
220 | # CONFIG_BINFMT_MISC is not set | 232 | # CONFIG_BINFMT_MISC is not set |
221 | # CONFIG_MATH_EMULATION is not set | 233 | # CONFIG_MATH_EMULATION is not set |
222 | # CONFIG_IOMMU_HELPER is not set | 234 | # CONFIG_IOMMU_HELPER is not set |
235 | # CONFIG_SWIOTLB is not set | ||
223 | CONFIG_PPC_NEED_DMA_SYNC_OPS=y | 236 | CONFIG_PPC_NEED_DMA_SYNC_OPS=y |
224 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | 237 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y |
225 | CONFIG_ARCH_HAS_WALK_MEMORY=y | 238 | CONFIG_ARCH_HAS_WALK_MEMORY=y |
@@ -239,9 +252,9 @@ CONFIG_MIGRATION=y | |||
239 | CONFIG_ZONE_DMA_FLAG=1 | 252 | CONFIG_ZONE_DMA_FLAG=1 |
240 | CONFIG_BOUNCE=y | 253 | CONFIG_BOUNCE=y |
241 | CONFIG_VIRT_TO_BUS=y | 254 | CONFIG_VIRT_TO_BUS=y |
242 | CONFIG_UNEVICTABLE_LRU=y | ||
243 | CONFIG_HAVE_MLOCK=y | 255 | CONFIG_HAVE_MLOCK=y |
244 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y | 256 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y |
257 | CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 | ||
245 | CONFIG_PPC_4K_PAGES=y | 258 | CONFIG_PPC_4K_PAGES=y |
246 | # CONFIG_PPC_16K_PAGES is not set | 259 | # CONFIG_PPC_16K_PAGES is not set |
247 | # CONFIG_PPC_64K_PAGES is not set | 260 | # CONFIG_PPC_64K_PAGES is not set |
@@ -344,6 +357,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
344 | # CONFIG_ECONET is not set | 357 | # CONFIG_ECONET is not set |
345 | # CONFIG_WAN_ROUTER is not set | 358 | # CONFIG_WAN_ROUTER is not set |
346 | # CONFIG_PHONET is not set | 359 | # CONFIG_PHONET is not set |
360 | # CONFIG_IEEE802154 is not set | ||
347 | # CONFIG_NET_SCHED is not set | 361 | # CONFIG_NET_SCHED is not set |
348 | # CONFIG_DCB is not set | 362 | # CONFIG_DCB is not set |
349 | 363 | ||
@@ -393,9 +407,8 @@ CONFIG_MTD_OF_PARTS=y | |||
393 | # User Modules And Translation Layers | 407 | # User Modules And Translation Layers |
394 | # | 408 | # |
395 | CONFIG_MTD_CHAR=y | 409 | CONFIG_MTD_CHAR=y |
396 | CONFIG_MTD_BLKDEVS=m | 410 | CONFIG_MTD_BLKDEVS=y |
397 | CONFIG_MTD_BLOCK=m | 411 | CONFIG_MTD_BLOCK=y |
398 | # CONFIG_MTD_BLOCK_RO is not set | ||
399 | # CONFIG_FTL is not set | 412 | # CONFIG_FTL is not set |
400 | # CONFIG_NFTL is not set | 413 | # CONFIG_NFTL is not set |
401 | # CONFIG_INFTL is not set | 414 | # CONFIG_INFTL is not set |
@@ -452,7 +465,17 @@ CONFIG_MTD_PHYSMAP_OF=y | |||
452 | # CONFIG_MTD_DOC2000 is not set | 465 | # CONFIG_MTD_DOC2000 is not set |
453 | # CONFIG_MTD_DOC2001 is not set | 466 | # CONFIG_MTD_DOC2001 is not set |
454 | # CONFIG_MTD_DOC2001PLUS is not set | 467 | # CONFIG_MTD_DOC2001PLUS is not set |
455 | # CONFIG_MTD_NAND is not set | 468 | CONFIG_MTD_NAND=y |
469 | # CONFIG_MTD_NAND_VERIFY_WRITE is not set | ||
470 | CONFIG_MTD_NAND_ECC_SMC=y | ||
471 | # CONFIG_MTD_NAND_MUSEUM_IDS is not set | ||
472 | CONFIG_MTD_NAND_IDS=y | ||
473 | CONFIG_MTD_NAND_NDFC=y | ||
474 | # CONFIG_MTD_NAND_DISKONCHIP is not set | ||
475 | # CONFIG_MTD_NAND_CAFE is not set | ||
476 | # CONFIG_MTD_NAND_NANDSIM is not set | ||
477 | # CONFIG_MTD_NAND_PLATFORM is not set | ||
478 | # CONFIG_MTD_NAND_FSL_ELBC is not set | ||
456 | # CONFIG_MTD_ONENAND is not set | 479 | # CONFIG_MTD_ONENAND is not set |
457 | 480 | ||
458 | # | 481 | # |
@@ -465,6 +488,7 @@ CONFIG_MTD_PHYSMAP_OF=y | |||
465 | # | 488 | # |
466 | # CONFIG_MTD_UBI is not set | 489 | # CONFIG_MTD_UBI is not set |
467 | CONFIG_OF_DEVICE=y | 490 | CONFIG_OF_DEVICE=y |
491 | CONFIG_OF_I2C=y | ||
468 | # CONFIG_PARPORT is not set | 492 | # CONFIG_PARPORT is not set |
469 | CONFIG_BLK_DEV=y | 493 | CONFIG_BLK_DEV=y |
470 | # CONFIG_BLK_DEV_FD is not set | 494 | # CONFIG_BLK_DEV_FD is not set |
@@ -504,14 +528,17 @@ CONFIG_HAVE_IDE=y | |||
504 | # | 528 | # |
505 | 529 | ||
506 | # | 530 | # |
507 | # Enable only one of the two stacks, unless you know what you are doing | 531 | # You can enable one or both FireWire driver stacks. |
532 | # | ||
533 | |||
534 | # | ||
535 | # See the help texts for more information. | ||
508 | # | 536 | # |
509 | # CONFIG_FIREWIRE is not set | 537 | # CONFIG_FIREWIRE is not set |
510 | # CONFIG_IEEE1394 is not set | 538 | # CONFIG_IEEE1394 is not set |
511 | # CONFIG_I2O is not set | 539 | # CONFIG_I2O is not set |
512 | # CONFIG_MACINTOSH_DRIVERS is not set | 540 | # CONFIG_MACINTOSH_DRIVERS is not set |
513 | CONFIG_NETDEVICES=y | 541 | CONFIG_NETDEVICES=y |
514 | CONFIG_COMPAT_NET_DEV_OPS=y | ||
515 | # CONFIG_DUMMY is not set | 542 | # CONFIG_DUMMY is not set |
516 | # CONFIG_BONDING is not set | 543 | # CONFIG_BONDING is not set |
517 | # CONFIG_MACVLAN is not set | 544 | # CONFIG_MACVLAN is not set |
@@ -546,6 +573,7 @@ CONFIG_IBM_NEW_EMAC_EMAC4=y | |||
546 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | 573 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set |
547 | # CONFIG_NET_PCI is not set | 574 | # CONFIG_NET_PCI is not set |
548 | # CONFIG_B44 is not set | 575 | # CONFIG_B44 is not set |
576 | # CONFIG_KS8842 is not set | ||
549 | # CONFIG_ATL2 is not set | 577 | # CONFIG_ATL2 is not set |
550 | # CONFIG_NETDEV_1000 is not set | 578 | # CONFIG_NETDEV_1000 is not set |
551 | # CONFIG_NETDEV_10000 is not set | 579 | # CONFIG_NETDEV_10000 is not set |
@@ -621,20 +649,150 @@ CONFIG_LEGACY_PTY_COUNT=256 | |||
621 | # CONFIG_IPMI_HANDLER is not set | 649 | # CONFIG_IPMI_HANDLER is not set |
622 | # CONFIG_HW_RANDOM is not set | 650 | # CONFIG_HW_RANDOM is not set |
623 | # CONFIG_NVRAM is not set | 651 | # CONFIG_NVRAM is not set |
624 | # CONFIG_GEN_RTC is not set | ||
625 | # CONFIG_R3964 is not set | 652 | # CONFIG_R3964 is not set |
626 | # CONFIG_APPLICOM is not set | 653 | # CONFIG_APPLICOM is not set |
627 | # CONFIG_RAW_DRIVER is not set | 654 | # CONFIG_RAW_DRIVER is not set |
628 | # CONFIG_TCG_TPM is not set | 655 | # CONFIG_TCG_TPM is not set |
629 | CONFIG_DEVPORT=y | 656 | CONFIG_DEVPORT=y |
630 | # CONFIG_I2C is not set | 657 | CONFIG_I2C=y |
658 | CONFIG_I2C_BOARDINFO=y | ||
659 | CONFIG_I2C_CHARDEV=y | ||
660 | CONFIG_I2C_HELPER_AUTO=y | ||
661 | |||
662 | # | ||
663 | # I2C Hardware Bus support | ||
664 | # | ||
665 | |||
666 | # | ||
667 | # PC SMBus host controller drivers | ||
668 | # | ||
669 | # CONFIG_I2C_ALI1535 is not set | ||
670 | # CONFIG_I2C_ALI1563 is not set | ||
671 | # CONFIG_I2C_ALI15X3 is not set | ||
672 | # CONFIG_I2C_AMD756 is not set | ||
673 | # CONFIG_I2C_AMD8111 is not set | ||
674 | # CONFIG_I2C_I801 is not set | ||
675 | # CONFIG_I2C_ISCH is not set | ||
676 | # CONFIG_I2C_PIIX4 is not set | ||
677 | # CONFIG_I2C_NFORCE2 is not set | ||
678 | # CONFIG_I2C_SIS5595 is not set | ||
679 | # CONFIG_I2C_SIS630 is not set | ||
680 | # CONFIG_I2C_SIS96X is not set | ||
681 | # CONFIG_I2C_VIA is not set | ||
682 | # CONFIG_I2C_VIAPRO is not set | ||
683 | |||
684 | # | ||
685 | # I2C system bus drivers (mostly embedded / system-on-chip) | ||
686 | # | ||
687 | CONFIG_I2C_IBM_IIC=y | ||
688 | # CONFIG_I2C_MPC is not set | ||
689 | # CONFIG_I2C_OCORES is not set | ||
690 | # CONFIG_I2C_SIMTEC is not set | ||
691 | |||
692 | # | ||
693 | # External I2C/SMBus adapter drivers | ||
694 | # | ||
695 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
696 | # CONFIG_I2C_TAOS_EVM is not set | ||
697 | |||
698 | # | ||
699 | # Graphics adapter I2C/DDC channel drivers | ||
700 | # | ||
701 | # CONFIG_I2C_VOODOO3 is not set | ||
702 | |||
703 | # | ||
704 | # Other I2C/SMBus bus drivers | ||
705 | # | ||
706 | # CONFIG_I2C_PCA_PLATFORM is not set | ||
707 | # CONFIG_I2C_STUB is not set | ||
708 | |||
709 | # | ||
710 | # Miscellaneous I2C Chip support | ||
711 | # | ||
712 | # CONFIG_DS1682 is not set | ||
713 | # CONFIG_SENSORS_PCF8574 is not set | ||
714 | # CONFIG_PCF8575 is not set | ||
715 | # CONFIG_SENSORS_PCA9539 is not set | ||
716 | # CONFIG_SENSORS_TSL2550 is not set | ||
717 | # CONFIG_I2C_DEBUG_CORE is not set | ||
718 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
719 | # CONFIG_I2C_DEBUG_BUS is not set | ||
720 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
631 | # CONFIG_SPI is not set | 721 | # CONFIG_SPI is not set |
722 | |||
723 | # | ||
724 | # PPS support | ||
725 | # | ||
726 | # CONFIG_PPS is not set | ||
632 | CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y | 727 | CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y |
633 | # CONFIG_GPIOLIB is not set | 728 | # CONFIG_GPIOLIB is not set |
634 | # CONFIG_W1 is not set | 729 | # CONFIG_W1 is not set |
635 | # CONFIG_POWER_SUPPLY is not set | 730 | # CONFIG_POWER_SUPPLY is not set |
636 | # CONFIG_HWMON is not set | 731 | CONFIG_HWMON=y |
732 | # CONFIG_HWMON_VID is not set | ||
733 | # CONFIG_SENSORS_AD7414 is not set | ||
734 | # CONFIG_SENSORS_AD7418 is not set | ||
735 | # CONFIG_SENSORS_ADM1021 is not set | ||
736 | # CONFIG_SENSORS_ADM1025 is not set | ||
737 | # CONFIG_SENSORS_ADM1026 is not set | ||
738 | # CONFIG_SENSORS_ADM1029 is not set | ||
739 | # CONFIG_SENSORS_ADM1031 is not set | ||
740 | # CONFIG_SENSORS_ADM9240 is not set | ||
741 | # CONFIG_SENSORS_ADT7462 is not set | ||
742 | # CONFIG_SENSORS_ADT7470 is not set | ||
743 | # CONFIG_SENSORS_ADT7473 is not set | ||
744 | # CONFIG_SENSORS_ADT7475 is not set | ||
745 | # CONFIG_SENSORS_ATXP1 is not set | ||
746 | # CONFIG_SENSORS_DS1621 is not set | ||
747 | # CONFIG_SENSORS_I5K_AMB is not set | ||
748 | # CONFIG_SENSORS_F71805F is not set | ||
749 | # CONFIG_SENSORS_F71882FG is not set | ||
750 | # CONFIG_SENSORS_F75375S is not set | ||
751 | # CONFIG_SENSORS_G760A is not set | ||
752 | # CONFIG_SENSORS_GL518SM is not set | ||
753 | # CONFIG_SENSORS_GL520SM is not set | ||
754 | # CONFIG_SENSORS_IT87 is not set | ||
755 | # CONFIG_SENSORS_LM63 is not set | ||
756 | CONFIG_SENSORS_LM75=y | ||
757 | # CONFIG_SENSORS_LM77 is not set | ||
758 | # CONFIG_SENSORS_LM78 is not set | ||
759 | # CONFIG_SENSORS_LM80 is not set | ||
760 | # CONFIG_SENSORS_LM83 is not set | ||
761 | # CONFIG_SENSORS_LM85 is not set | ||
762 | # CONFIG_SENSORS_LM87 is not set | ||
763 | # CONFIG_SENSORS_LM90 is not set | ||
764 | # CONFIG_SENSORS_LM92 is not set | ||
765 | # CONFIG_SENSORS_LM93 is not set | ||
766 | # CONFIG_SENSORS_LTC4215 is not set | ||
767 | # CONFIG_SENSORS_LTC4245 is not set | ||
768 | # CONFIG_SENSORS_LM95241 is not set | ||
769 | # CONFIG_SENSORS_MAX1619 is not set | ||
770 | # CONFIG_SENSORS_MAX6650 is not set | ||
771 | # CONFIG_SENSORS_PC87360 is not set | ||
772 | # CONFIG_SENSORS_PC87427 is not set | ||
773 | # CONFIG_SENSORS_PCF8591 is not set | ||
774 | # CONFIG_SENSORS_SIS5595 is not set | ||
775 | # CONFIG_SENSORS_DME1737 is not set | ||
776 | # CONFIG_SENSORS_SMSC47M1 is not set | ||
777 | # CONFIG_SENSORS_SMSC47M192 is not set | ||
778 | # CONFIG_SENSORS_SMSC47B397 is not set | ||
779 | # CONFIG_SENSORS_ADS7828 is not set | ||
780 | # CONFIG_SENSORS_THMC50 is not set | ||
781 | # CONFIG_SENSORS_TMP401 is not set | ||
782 | # CONFIG_SENSORS_VIA686A is not set | ||
783 | # CONFIG_SENSORS_VT1211 is not set | ||
784 | # CONFIG_SENSORS_VT8231 is not set | ||
785 | # CONFIG_SENSORS_W83781D is not set | ||
786 | # CONFIG_SENSORS_W83791D is not set | ||
787 | # CONFIG_SENSORS_W83792D is not set | ||
788 | # CONFIG_SENSORS_W83793 is not set | ||
789 | # CONFIG_SENSORS_W83L785TS is not set | ||
790 | # CONFIG_SENSORS_W83L786NG is not set | ||
791 | # CONFIG_SENSORS_W83627HF is not set | ||
792 | # CONFIG_SENSORS_W83627EHF is not set | ||
793 | # CONFIG_HWMON_DEBUG_CHIP is not set | ||
637 | CONFIG_THERMAL=y | 794 | CONFIG_THERMAL=y |
795 | # CONFIG_THERMAL_HWMON is not set | ||
638 | # CONFIG_WATCHDOG is not set | 796 | # CONFIG_WATCHDOG is not set |
639 | CONFIG_SSB_POSSIBLE=y | 797 | CONFIG_SSB_POSSIBLE=y |
640 | 798 | ||
@@ -649,24 +807,15 @@ CONFIG_SSB_POSSIBLE=y | |||
649 | # CONFIG_MFD_CORE is not set | 807 | # CONFIG_MFD_CORE is not set |
650 | # CONFIG_MFD_SM501 is not set | 808 | # CONFIG_MFD_SM501 is not set |
651 | # CONFIG_HTC_PASIC3 is not set | 809 | # CONFIG_HTC_PASIC3 is not set |
810 | # CONFIG_TWL4030_CORE is not set | ||
652 | # CONFIG_MFD_TMIO is not set | 811 | # CONFIG_MFD_TMIO is not set |
812 | # CONFIG_PMIC_DA903X is not set | ||
813 | # CONFIG_MFD_WM8400 is not set | ||
814 | # CONFIG_MFD_WM8350_I2C is not set | ||
815 | # CONFIG_MFD_PCF50633 is not set | ||
816 | # CONFIG_AB3100_CORE is not set | ||
653 | # CONFIG_REGULATOR is not set | 817 | # CONFIG_REGULATOR is not set |
654 | 818 | # CONFIG_MEDIA_SUPPORT is not set | |
655 | # | ||
656 | # Multimedia devices | ||
657 | # | ||
658 | |||
659 | # | ||
660 | # Multimedia core support | ||
661 | # | ||
662 | # CONFIG_VIDEO_DEV is not set | ||
663 | # CONFIG_DVB_CORE is not set | ||
664 | # CONFIG_VIDEO_MEDIA is not set | ||
665 | |||
666 | # | ||
667 | # Multimedia drivers | ||
668 | # | ||
669 | # CONFIG_DAB is not set | ||
670 | 819 | ||
671 | # | 820 | # |
672 | # Graphics support | 821 | # Graphics support |
@@ -691,10 +840,69 @@ CONFIG_SSB_POSSIBLE=y | |||
691 | # CONFIG_ACCESSIBILITY is not set | 840 | # CONFIG_ACCESSIBILITY is not set |
692 | # CONFIG_INFINIBAND is not set | 841 | # CONFIG_INFINIBAND is not set |
693 | # CONFIG_EDAC is not set | 842 | # CONFIG_EDAC is not set |
694 | # CONFIG_RTC_CLASS is not set | 843 | CONFIG_RTC_LIB=y |
844 | CONFIG_RTC_CLASS=y | ||
845 | CONFIG_RTC_HCTOSYS=y | ||
846 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
847 | # CONFIG_RTC_DEBUG is not set | ||
848 | |||
849 | # | ||
850 | # RTC interfaces | ||
851 | # | ||
852 | CONFIG_RTC_INTF_SYSFS=y | ||
853 | CONFIG_RTC_INTF_PROC=y | ||
854 | CONFIG_RTC_INTF_DEV=y | ||
855 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
856 | # CONFIG_RTC_DRV_TEST is not set | ||
857 | |||
858 | # | ||
859 | # I2C RTC drivers | ||
860 | # | ||
861 | CONFIG_RTC_DRV_DS1307=y | ||
862 | # CONFIG_RTC_DRV_DS1374 is not set | ||
863 | # CONFIG_RTC_DRV_DS1672 is not set | ||
864 | # CONFIG_RTC_DRV_MAX6900 is not set | ||
865 | # CONFIG_RTC_DRV_RS5C372 is not set | ||
866 | # CONFIG_RTC_DRV_ISL1208 is not set | ||
867 | # CONFIG_RTC_DRV_X1205 is not set | ||
868 | # CONFIG_RTC_DRV_PCF8563 is not set | ||
869 | # CONFIG_RTC_DRV_PCF8583 is not set | ||
870 | # CONFIG_RTC_DRV_M41T80 is not set | ||
871 | # CONFIG_RTC_DRV_S35390A is not set | ||
872 | # CONFIG_RTC_DRV_FM3130 is not set | ||
873 | # CONFIG_RTC_DRV_RX8581 is not set | ||
874 | # CONFIG_RTC_DRV_RX8025 is not set | ||
875 | |||
876 | # | ||
877 | # SPI RTC drivers | ||
878 | # | ||
879 | |||
880 | # | ||
881 | # Platform RTC drivers | ||
882 | # | ||
883 | # CONFIG_RTC_DRV_CMOS is not set | ||
884 | # CONFIG_RTC_DRV_DS1286 is not set | ||
885 | # CONFIG_RTC_DRV_DS1511 is not set | ||
886 | # CONFIG_RTC_DRV_DS1553 is not set | ||
887 | # CONFIG_RTC_DRV_DS1742 is not set | ||
888 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
889 | # CONFIG_RTC_DRV_M48T86 is not set | ||
890 | # CONFIG_RTC_DRV_M48T35 is not set | ||
891 | # CONFIG_RTC_DRV_M48T59 is not set | ||
892 | # CONFIG_RTC_DRV_BQ4802 is not set | ||
893 | # CONFIG_RTC_DRV_V3020 is not set | ||
894 | |||
895 | # | ||
896 | # on-CPU RTC drivers | ||
897 | # | ||
898 | # CONFIG_RTC_DRV_GENERIC is not set | ||
695 | # CONFIG_DMADEVICES is not set | 899 | # CONFIG_DMADEVICES is not set |
696 | # CONFIG_AUXDISPLAY is not set | 900 | # CONFIG_AUXDISPLAY is not set |
697 | # CONFIG_UIO is not set | 901 | # CONFIG_UIO is not set |
902 | |||
903 | # | ||
904 | # TI VLYNQ | ||
905 | # | ||
698 | # CONFIG_STAGING is not set | 906 | # CONFIG_STAGING is not set |
699 | 907 | ||
700 | # | 908 | # |
@@ -708,11 +916,12 @@ CONFIG_EXT2_FS=y | |||
708 | # CONFIG_REISERFS_FS is not set | 916 | # CONFIG_REISERFS_FS is not set |
709 | # CONFIG_JFS_FS is not set | 917 | # CONFIG_JFS_FS is not set |
710 | # CONFIG_FS_POSIX_ACL is not set | 918 | # CONFIG_FS_POSIX_ACL is not set |
711 | CONFIG_FILE_LOCKING=y | ||
712 | # CONFIG_XFS_FS is not set | 919 | # CONFIG_XFS_FS is not set |
713 | # CONFIG_GFS2_FS is not set | 920 | # CONFIG_GFS2_FS is not set |
714 | # CONFIG_OCFS2_FS is not set | 921 | # CONFIG_OCFS2_FS is not set |
715 | # CONFIG_BTRFS_FS is not set | 922 | # CONFIG_BTRFS_FS is not set |
923 | CONFIG_FILE_LOCKING=y | ||
924 | CONFIG_FSNOTIFY=y | ||
716 | CONFIG_DNOTIFY=y | 925 | CONFIG_DNOTIFY=y |
717 | CONFIG_INOTIFY=y | 926 | CONFIG_INOTIFY=y |
718 | CONFIG_INOTIFY_USER=y | 927 | CONFIG_INOTIFY_USER=y |
@@ -818,6 +1027,7 @@ CONFIG_HAS_IOPORT=y | |||
818 | CONFIG_HAS_DMA=y | 1027 | CONFIG_HAS_DMA=y |
819 | CONFIG_HAVE_LMB=y | 1028 | CONFIG_HAVE_LMB=y |
820 | CONFIG_NLATTR=y | 1029 | CONFIG_NLATTR=y |
1030 | CONFIG_GENERIC_ATOMIC64=y | ||
821 | 1031 | ||
822 | # | 1032 | # |
823 | # Kernel hacking | 1033 | # Kernel hacking |
@@ -848,6 +1058,9 @@ CONFIG_SCHED_DEBUG=y | |||
848 | # CONFIG_RT_MUTEX_TESTER is not set | 1058 | # CONFIG_RT_MUTEX_TESTER is not set |
849 | # CONFIG_DEBUG_SPINLOCK is not set | 1059 | # CONFIG_DEBUG_SPINLOCK is not set |
850 | # CONFIG_DEBUG_MUTEXES is not set | 1060 | # CONFIG_DEBUG_MUTEXES is not set |
1061 | # CONFIG_DEBUG_LOCK_ALLOC is not set | ||
1062 | # CONFIG_PROVE_LOCKING is not set | ||
1063 | # CONFIG_LOCK_STAT is not set | ||
851 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | 1064 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set |
852 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | 1065 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set |
853 | # CONFIG_DEBUG_KOBJECT is not set | 1066 | # CONFIG_DEBUG_KOBJECT is not set |
@@ -859,7 +1072,6 @@ CONFIG_DEBUG_BUGVERBOSE=y | |||
859 | # CONFIG_DEBUG_LIST is not set | 1072 | # CONFIG_DEBUG_LIST is not set |
860 | # CONFIG_DEBUG_SG is not set | 1073 | # CONFIG_DEBUG_SG is not set |
861 | # CONFIG_DEBUG_NOTIFIERS is not set | 1074 | # CONFIG_DEBUG_NOTIFIERS is not set |
862 | # CONFIG_BOOT_PRINTK_DELAY is not set | ||
863 | # CONFIG_RCU_TORTURE_TEST is not set | 1075 | # CONFIG_RCU_TORTURE_TEST is not set |
864 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | 1076 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set |
865 | # CONFIG_BACKTRACE_SELF_TEST is not set | 1077 | # CONFIG_BACKTRACE_SELF_TEST is not set |
@@ -873,16 +1085,15 @@ CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y | |||
873 | CONFIG_HAVE_DYNAMIC_FTRACE=y | 1085 | CONFIG_HAVE_DYNAMIC_FTRACE=y |
874 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y | 1086 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y |
875 | CONFIG_TRACING_SUPPORT=y | 1087 | CONFIG_TRACING_SUPPORT=y |
876 | 1088 | CONFIG_FTRACE=y | |
877 | # | ||
878 | # Tracers | ||
879 | # | ||
880 | # CONFIG_FUNCTION_TRACER is not set | 1089 | # CONFIG_FUNCTION_TRACER is not set |
1090 | # CONFIG_IRQSOFF_TRACER is not set | ||
881 | # CONFIG_SCHED_TRACER is not set | 1091 | # CONFIG_SCHED_TRACER is not set |
882 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | 1092 | # CONFIG_ENABLE_DEFAULT_TRACERS is not set |
883 | # CONFIG_EVENT_TRACER is not set | ||
884 | # CONFIG_BOOT_TRACER is not set | 1093 | # CONFIG_BOOT_TRACER is not set |
885 | # CONFIG_TRACE_BRANCH_PROFILING is not set | 1094 | CONFIG_BRANCH_PROFILE_NONE=y |
1095 | # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set | ||
1096 | # CONFIG_PROFILE_ALL_BRANCHES is not set | ||
886 | # CONFIG_STACK_TRACER is not set | 1097 | # CONFIG_STACK_TRACER is not set |
887 | # CONFIG_KMEMTRACE is not set | 1098 | # CONFIG_KMEMTRACE is not set |
888 | # CONFIG_WORKQUEUE_TRACER is not set | 1099 | # CONFIG_WORKQUEUE_TRACER is not set |
@@ -891,6 +1102,9 @@ CONFIG_TRACING_SUPPORT=y | |||
891 | # CONFIG_SAMPLES is not set | 1102 | # CONFIG_SAMPLES is not set |
892 | CONFIG_HAVE_ARCH_KGDB=y | 1103 | CONFIG_HAVE_ARCH_KGDB=y |
893 | # CONFIG_KGDB is not set | 1104 | # CONFIG_KGDB is not set |
1105 | # CONFIG_KMEMCHECK is not set | ||
1106 | # CONFIG_PPC_DISABLE_WERROR is not set | ||
1107 | CONFIG_PPC_WERROR=y | ||
894 | CONFIG_PRINT_STACK_DEPTH=64 | 1108 | CONFIG_PRINT_STACK_DEPTH=64 |
895 | # CONFIG_DEBUG_STACKOVERFLOW is not set | 1109 | # CONFIG_DEBUG_STACKOVERFLOW is not set |
896 | # CONFIG_DEBUG_STACK_USAGE is not set | 1110 | # CONFIG_DEBUG_STACK_USAGE is not set |
diff --git a/arch/powerpc/configs/44x/canyonlands_defconfig b/arch/powerpc/configs/44x/canyonlands_defconfig index 5e85412eb9fa..b312b166be66 100644 --- a/arch/powerpc/configs/44x/canyonlands_defconfig +++ b/arch/powerpc/configs/44x/canyonlands_defconfig | |||
@@ -1,14 +1,14 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.29-rc3 | 3 | # Linux kernel version: 2.6.31-rc4 |
4 | # Mon Feb 2 13:13:04 2009 | 4 | # Wed Jul 29 17:27:20 2009 |
5 | # | 5 | # |
6 | # CONFIG_PPC64 is not set | 6 | # CONFIG_PPC64 is not set |
7 | 7 | ||
8 | # | 8 | # |
9 | # Processor support | 9 | # Processor support |
10 | # | 10 | # |
11 | # CONFIG_6xx is not set | 11 | # CONFIG_PPC_BOOK3S_32 is not set |
12 | # CONFIG_PPC_85xx is not set | 12 | # CONFIG_PPC_85xx is not set |
13 | # CONFIG_PPC_8xx is not set | 13 | # CONFIG_PPC_8xx is not set |
14 | # CONFIG_40x is not set | 14 | # CONFIG_40x is not set |
@@ -31,15 +31,16 @@ CONFIG_GENERIC_TIME=y | |||
31 | CONFIG_GENERIC_TIME_VSYSCALL=y | 31 | CONFIG_GENERIC_TIME_VSYSCALL=y |
32 | CONFIG_GENERIC_CLOCKEVENTS=y | 32 | CONFIG_GENERIC_CLOCKEVENTS=y |
33 | CONFIG_GENERIC_HARDIRQS=y | 33 | CONFIG_GENERIC_HARDIRQS=y |
34 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | ||
34 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set | 35 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set |
35 | CONFIG_IRQ_PER_CPU=y | 36 | CONFIG_IRQ_PER_CPU=y |
36 | CONFIG_STACKTRACE_SUPPORT=y | 37 | CONFIG_STACKTRACE_SUPPORT=y |
37 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | 38 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y |
39 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
38 | CONFIG_LOCKDEP_SUPPORT=y | 40 | CONFIG_LOCKDEP_SUPPORT=y |
39 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 41 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
40 | CONFIG_ARCH_HAS_ILOG2_U32=y | 42 | CONFIG_ARCH_HAS_ILOG2_U32=y |
41 | CONFIG_GENERIC_HWEIGHT=y | 43 | CONFIG_GENERIC_HWEIGHT=y |
42 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
43 | CONFIG_GENERIC_FIND_NEXT_BIT=y | 44 | CONFIG_GENERIC_FIND_NEXT_BIT=y |
44 | # CONFIG_ARCH_NO_VIRT_TO_BUS is not set | 45 | # CONFIG_ARCH_NO_VIRT_TO_BUS is not set |
45 | CONFIG_PPC=y | 46 | CONFIG_PPC=y |
@@ -53,11 +54,14 @@ CONFIG_PPC_UDBG_16550=y | |||
53 | # CONFIG_GENERIC_TBSYNC is not set | 54 | # CONFIG_GENERIC_TBSYNC is not set |
54 | CONFIG_AUDIT_ARCH=y | 55 | CONFIG_AUDIT_ARCH=y |
55 | CONFIG_GENERIC_BUG=y | 56 | CONFIG_GENERIC_BUG=y |
57 | CONFIG_DTC=y | ||
56 | # CONFIG_DEFAULT_UIMAGE is not set | 58 | # CONFIG_DEFAULT_UIMAGE is not set |
57 | CONFIG_PPC_DCR_NATIVE=y | 59 | CONFIG_PPC_DCR_NATIVE=y |
58 | # CONFIG_PPC_DCR_MMIO is not set | 60 | # CONFIG_PPC_DCR_MMIO is not set |
59 | CONFIG_PPC_DCR=y | 61 | CONFIG_PPC_DCR=y |
62 | CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y | ||
60 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 63 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
64 | CONFIG_CONSTRUCTORS=y | ||
61 | 65 | ||
62 | # | 66 | # |
63 | # General setup | 67 | # General setup |
@@ -71,6 +75,7 @@ CONFIG_SWAP=y | |||
71 | CONFIG_SYSVIPC=y | 75 | CONFIG_SYSVIPC=y |
72 | CONFIG_SYSVIPC_SYSCTL=y | 76 | CONFIG_SYSVIPC_SYSCTL=y |
73 | CONFIG_POSIX_MQUEUE=y | 77 | CONFIG_POSIX_MQUEUE=y |
78 | CONFIG_POSIX_MQUEUE_SYSCTL=y | ||
74 | # CONFIG_BSD_PROCESS_ACCT is not set | 79 | # CONFIG_BSD_PROCESS_ACCT is not set |
75 | # CONFIG_TASKSTATS is not set | 80 | # CONFIG_TASKSTATS is not set |
76 | # CONFIG_AUDIT is not set | 81 | # CONFIG_AUDIT is not set |
@@ -93,8 +98,12 @@ CONFIG_SYSFS_DEPRECATED_V2=y | |||
93 | # CONFIG_NAMESPACES is not set | 98 | # CONFIG_NAMESPACES is not set |
94 | CONFIG_BLK_DEV_INITRD=y | 99 | CONFIG_BLK_DEV_INITRD=y |
95 | CONFIG_INITRAMFS_SOURCE="" | 100 | CONFIG_INITRAMFS_SOURCE="" |
101 | CONFIG_RD_GZIP=y | ||
102 | # CONFIG_RD_BZIP2 is not set | ||
103 | # CONFIG_RD_LZMA is not set | ||
96 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | 104 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set |
97 | CONFIG_SYSCTL=y | 105 | CONFIG_SYSCTL=y |
106 | CONFIG_ANON_INODES=y | ||
98 | CONFIG_EMBEDDED=y | 107 | CONFIG_EMBEDDED=y |
99 | CONFIG_SYSCTL_SYSCALL=y | 108 | CONFIG_SYSCTL_SYSCALL=y |
100 | CONFIG_KALLSYMS=y | 109 | CONFIG_KALLSYMS=y |
@@ -104,23 +113,30 @@ CONFIG_HOTPLUG=y | |||
104 | CONFIG_PRINTK=y | 113 | CONFIG_PRINTK=y |
105 | CONFIG_BUG=y | 114 | CONFIG_BUG=y |
106 | CONFIG_ELF_CORE=y | 115 | CONFIG_ELF_CORE=y |
107 | CONFIG_COMPAT_BRK=y | ||
108 | CONFIG_BASE_FULL=y | 116 | CONFIG_BASE_FULL=y |
109 | CONFIG_FUTEX=y | 117 | CONFIG_FUTEX=y |
110 | CONFIG_ANON_INODES=y | ||
111 | CONFIG_EPOLL=y | 118 | CONFIG_EPOLL=y |
112 | CONFIG_SIGNALFD=y | 119 | CONFIG_SIGNALFD=y |
113 | CONFIG_TIMERFD=y | 120 | CONFIG_TIMERFD=y |
114 | CONFIG_EVENTFD=y | 121 | CONFIG_EVENTFD=y |
115 | CONFIG_SHMEM=y | 122 | CONFIG_SHMEM=y |
116 | CONFIG_AIO=y | 123 | CONFIG_AIO=y |
124 | CONFIG_HAVE_PERF_COUNTERS=y | ||
125 | |||
126 | # | ||
127 | # Performance Counters | ||
128 | # | ||
129 | # CONFIG_PERF_COUNTERS is not set | ||
117 | CONFIG_VM_EVENT_COUNTERS=y | 130 | CONFIG_VM_EVENT_COUNTERS=y |
118 | CONFIG_PCI_QUIRKS=y | 131 | CONFIG_PCI_QUIRKS=y |
119 | CONFIG_SLUB_DEBUG=y | 132 | CONFIG_SLUB_DEBUG=y |
133 | # CONFIG_STRIP_ASM_SYMS is not set | ||
134 | CONFIG_COMPAT_BRK=y | ||
120 | # CONFIG_SLAB is not set | 135 | # CONFIG_SLAB is not set |
121 | CONFIG_SLUB=y | 136 | CONFIG_SLUB=y |
122 | # CONFIG_SLOB is not set | 137 | # CONFIG_SLOB is not set |
123 | # CONFIG_PROFILING is not set | 138 | # CONFIG_PROFILING is not set |
139 | # CONFIG_MARKERS is not set | ||
124 | CONFIG_HAVE_OPROFILE=y | 140 | CONFIG_HAVE_OPROFILE=y |
125 | # CONFIG_KPROBES is not set | 141 | # CONFIG_KPROBES is not set |
126 | CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y | 142 | CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y |
@@ -128,6 +144,12 @@ CONFIG_HAVE_IOREMAP_PROT=y | |||
128 | CONFIG_HAVE_KPROBES=y | 144 | CONFIG_HAVE_KPROBES=y |
129 | CONFIG_HAVE_KRETPROBES=y | 145 | CONFIG_HAVE_KRETPROBES=y |
130 | CONFIG_HAVE_ARCH_TRACEHOOK=y | 146 | CONFIG_HAVE_ARCH_TRACEHOOK=y |
147 | |||
148 | # | ||
149 | # GCOV-based kernel profiling | ||
150 | # | ||
151 | # CONFIG_GCOV_KERNEL is not set | ||
152 | # CONFIG_SLOW_WORK is not set | ||
131 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | 153 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set |
132 | CONFIG_SLABINFO=y | 154 | CONFIG_SLABINFO=y |
133 | CONFIG_RT_MUTEXES=y | 155 | CONFIG_RT_MUTEXES=y |
@@ -139,8 +161,7 @@ CONFIG_MODULE_UNLOAD=y | |||
139 | # CONFIG_MODVERSIONS is not set | 161 | # CONFIG_MODVERSIONS is not set |
140 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 162 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
141 | CONFIG_BLOCK=y | 163 | CONFIG_BLOCK=y |
142 | CONFIG_LBD=y | 164 | CONFIG_LBDAF=y |
143 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
144 | # CONFIG_BLK_DEV_BSG is not set | 165 | # CONFIG_BLK_DEV_BSG is not set |
145 | # CONFIG_BLK_DEV_INTEGRITY is not set | 166 | # CONFIG_BLK_DEV_INTEGRITY is not set |
146 | 167 | ||
@@ -176,6 +197,7 @@ CONFIG_PPC4xx_PCI_EXPRESS=y | |||
176 | # CONFIG_ARCHES is not set | 197 | # CONFIG_ARCHES is not set |
177 | CONFIG_CANYONLANDS=y | 198 | CONFIG_CANYONLANDS=y |
178 | # CONFIG_GLACIER is not set | 199 | # CONFIG_GLACIER is not set |
200 | # CONFIG_REDWOOD is not set | ||
179 | # CONFIG_YOSEMITE is not set | 201 | # CONFIG_YOSEMITE is not set |
180 | # CONFIG_XILINX_VIRTEX440_GENERIC_BOARD is not set | 202 | # CONFIG_XILINX_VIRTEX440_GENERIC_BOARD is not set |
181 | CONFIG_PPC44x_SIMPLE=y | 203 | CONFIG_PPC44x_SIMPLE=y |
@@ -218,6 +240,7 @@ CONFIG_BINFMT_ELF=y | |||
218 | # CONFIG_BINFMT_MISC is not set | 240 | # CONFIG_BINFMT_MISC is not set |
219 | # CONFIG_MATH_EMULATION is not set | 241 | # CONFIG_MATH_EMULATION is not set |
220 | # CONFIG_IOMMU_HELPER is not set | 242 | # CONFIG_IOMMU_HELPER is not set |
243 | # CONFIG_SWIOTLB is not set | ||
221 | CONFIG_PPC_NEED_DMA_SYNC_OPS=y | 244 | CONFIG_PPC_NEED_DMA_SYNC_OPS=y |
222 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | 245 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y |
223 | CONFIG_ARCH_HAS_WALK_MEMORY=y | 246 | CONFIG_ARCH_HAS_WALK_MEMORY=y |
@@ -237,10 +260,14 @@ CONFIG_PHYS_ADDR_T_64BIT=y | |||
237 | CONFIG_ZONE_DMA_FLAG=1 | 260 | CONFIG_ZONE_DMA_FLAG=1 |
238 | CONFIG_BOUNCE=y | 261 | CONFIG_BOUNCE=y |
239 | CONFIG_VIRT_TO_BUS=y | 262 | CONFIG_VIRT_TO_BUS=y |
240 | CONFIG_UNEVICTABLE_LRU=y | 263 | CONFIG_HAVE_MLOCK=y |
264 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y | ||
265 | CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 | ||
266 | CONFIG_STDBINUTILS=y | ||
241 | CONFIG_PPC_4K_PAGES=y | 267 | CONFIG_PPC_4K_PAGES=y |
242 | # CONFIG_PPC_16K_PAGES is not set | 268 | # CONFIG_PPC_16K_PAGES is not set |
243 | # CONFIG_PPC_64K_PAGES is not set | 269 | # CONFIG_PPC_64K_PAGES is not set |
270 | # CONFIG_PPC_256K_PAGES is not set | ||
244 | CONFIG_FORCE_MAX_ZONEORDER=11 | 271 | CONFIG_FORCE_MAX_ZONEORDER=11 |
245 | CONFIG_PROC_DEVICETREE=y | 272 | CONFIG_PROC_DEVICETREE=y |
246 | CONFIG_CMDLINE_BOOL=y | 273 | CONFIG_CMDLINE_BOOL=y |
@@ -265,6 +292,7 @@ CONFIG_ARCH_SUPPORTS_MSI=y | |||
265 | # CONFIG_PCI_LEGACY is not set | 292 | # CONFIG_PCI_LEGACY is not set |
266 | # CONFIG_PCI_DEBUG is not set | 293 | # CONFIG_PCI_DEBUG is not set |
267 | # CONFIG_PCI_STUB is not set | 294 | # CONFIG_PCI_STUB is not set |
295 | # CONFIG_PCI_IOV is not set | ||
268 | # CONFIG_PCCARD is not set | 296 | # CONFIG_PCCARD is not set |
269 | # CONFIG_HOTPLUG_PCI is not set | 297 | # CONFIG_HOTPLUG_PCI is not set |
270 | # CONFIG_HAS_RAPIDIO is not set | 298 | # CONFIG_HAS_RAPIDIO is not set |
@@ -282,14 +310,12 @@ CONFIG_PAGE_OFFSET=0xc0000000 | |||
282 | CONFIG_KERNEL_START=0xc0000000 | 310 | CONFIG_KERNEL_START=0xc0000000 |
283 | CONFIG_PHYSICAL_START=0x00000000 | 311 | CONFIG_PHYSICAL_START=0x00000000 |
284 | CONFIG_TASK_SIZE=0xc0000000 | 312 | CONFIG_TASK_SIZE=0xc0000000 |
285 | CONFIG_CONSISTENT_START=0xff100000 | ||
286 | CONFIG_CONSISTENT_SIZE=0x00200000 | 313 | CONFIG_CONSISTENT_SIZE=0x00200000 |
287 | CONFIG_NET=y | 314 | CONFIG_NET=y |
288 | 315 | ||
289 | # | 316 | # |
290 | # Networking options | 317 | # Networking options |
291 | # | 318 | # |
292 | CONFIG_COMPAT_NET_DEV_OPS=y | ||
293 | CONFIG_PACKET=y | 319 | CONFIG_PACKET=y |
294 | # CONFIG_PACKET_MMAP is not set | 320 | # CONFIG_PACKET_MMAP is not set |
295 | CONFIG_UNIX=y | 321 | CONFIG_UNIX=y |
@@ -339,6 +365,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
339 | # CONFIG_LAPB is not set | 365 | # CONFIG_LAPB is not set |
340 | # CONFIG_ECONET is not set | 366 | # CONFIG_ECONET is not set |
341 | # CONFIG_WAN_ROUTER is not set | 367 | # CONFIG_WAN_ROUTER is not set |
368 | # CONFIG_PHONET is not set | ||
369 | # CONFIG_IEEE802154 is not set | ||
342 | # CONFIG_NET_SCHED is not set | 370 | # CONFIG_NET_SCHED is not set |
343 | # CONFIG_DCB is not set | 371 | # CONFIG_DCB is not set |
344 | 372 | ||
@@ -351,7 +379,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
351 | # CONFIG_IRDA is not set | 379 | # CONFIG_IRDA is not set |
352 | # CONFIG_BT is not set | 380 | # CONFIG_BT is not set |
353 | # CONFIG_AF_RXRPC is not set | 381 | # CONFIG_AF_RXRPC is not set |
354 | # CONFIG_PHONET is not set | ||
355 | # CONFIG_WIRELESS is not set | 382 | # CONFIG_WIRELESS is not set |
356 | # CONFIG_WIMAX is not set | 383 | # CONFIG_WIMAX is not set |
357 | # CONFIG_RFKILL is not set | 384 | # CONFIG_RFKILL is not set |
@@ -375,7 +402,101 @@ CONFIG_EXTRA_FIRMWARE="" | |||
375 | # CONFIG_SYS_HYPERVISOR is not set | 402 | # CONFIG_SYS_HYPERVISOR is not set |
376 | CONFIG_CONNECTOR=y | 403 | CONFIG_CONNECTOR=y |
377 | CONFIG_PROC_EVENTS=y | 404 | CONFIG_PROC_EVENTS=y |
378 | # CONFIG_MTD is not set | 405 | CONFIG_MTD=y |
406 | # CONFIG_MTD_DEBUG is not set | ||
407 | # CONFIG_MTD_CONCAT is not set | ||
408 | CONFIG_MTD_PARTITIONS=y | ||
409 | # CONFIG_MTD_TESTS is not set | ||
410 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
411 | CONFIG_MTD_CMDLINE_PARTS=y | ||
412 | CONFIG_MTD_OF_PARTS=y | ||
413 | # CONFIG_MTD_AR7_PARTS is not set | ||
414 | |||
415 | # | ||
416 | # User Modules And Translation Layers | ||
417 | # | ||
418 | CONFIG_MTD_CHAR=y | ||
419 | CONFIG_MTD_BLKDEVS=y | ||
420 | CONFIG_MTD_BLOCK=y | ||
421 | # CONFIG_FTL is not set | ||
422 | # CONFIG_NFTL is not set | ||
423 | # CONFIG_INFTL is not set | ||
424 | # CONFIG_RFD_FTL is not set | ||
425 | # CONFIG_SSFDC is not set | ||
426 | # CONFIG_MTD_OOPS is not set | ||
427 | |||
428 | # | ||
429 | # RAM/ROM/Flash chip drivers | ||
430 | # | ||
431 | CONFIG_MTD_CFI=y | ||
432 | # CONFIG_MTD_JEDECPROBE is not set | ||
433 | CONFIG_MTD_GEN_PROBE=y | ||
434 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set | ||
435 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
436 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
437 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
438 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
439 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
440 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
441 | CONFIG_MTD_CFI_I1=y | ||
442 | CONFIG_MTD_CFI_I2=y | ||
443 | # CONFIG_MTD_CFI_I4 is not set | ||
444 | # CONFIG_MTD_CFI_I8 is not set | ||
445 | # CONFIG_MTD_CFI_INTELEXT is not set | ||
446 | CONFIG_MTD_CFI_AMDSTD=y | ||
447 | # CONFIG_MTD_CFI_STAA is not set | ||
448 | CONFIG_MTD_CFI_UTIL=y | ||
449 | # CONFIG_MTD_RAM is not set | ||
450 | # CONFIG_MTD_ROM is not set | ||
451 | # CONFIG_MTD_ABSENT is not set | ||
452 | |||
453 | # | ||
454 | # Mapping drivers for chip access | ||
455 | # | ||
456 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
457 | # CONFIG_MTD_PHYSMAP is not set | ||
458 | CONFIG_MTD_PHYSMAP_OF=y | ||
459 | # CONFIG_MTD_INTEL_VR_NOR is not set | ||
460 | # CONFIG_MTD_PLATRAM is not set | ||
461 | |||
462 | # | ||
463 | # Self-contained MTD device drivers | ||
464 | # | ||
465 | # CONFIG_MTD_PMC551 is not set | ||
466 | # CONFIG_MTD_SLRAM is not set | ||
467 | # CONFIG_MTD_PHRAM is not set | ||
468 | # CONFIG_MTD_MTDRAM is not set | ||
469 | # CONFIG_MTD_BLOCK2MTD is not set | ||
470 | |||
471 | # | ||
472 | # Disk-On-Chip Device Drivers | ||
473 | # | ||
474 | # CONFIG_MTD_DOC2000 is not set | ||
475 | # CONFIG_MTD_DOC2001 is not set | ||
476 | # CONFIG_MTD_DOC2001PLUS is not set | ||
477 | CONFIG_MTD_NAND=y | ||
478 | # CONFIG_MTD_NAND_VERIFY_WRITE is not set | ||
479 | CONFIG_MTD_NAND_ECC_SMC=y | ||
480 | # CONFIG_MTD_NAND_MUSEUM_IDS is not set | ||
481 | CONFIG_MTD_NAND_IDS=y | ||
482 | CONFIG_MTD_NAND_NDFC=y | ||
483 | # CONFIG_MTD_NAND_DISKONCHIP is not set | ||
484 | # CONFIG_MTD_NAND_CAFE is not set | ||
485 | # CONFIG_MTD_NAND_NANDSIM is not set | ||
486 | # CONFIG_MTD_NAND_PLATFORM is not set | ||
487 | # CONFIG_MTD_ALAUDA is not set | ||
488 | # CONFIG_MTD_NAND_FSL_ELBC is not set | ||
489 | # CONFIG_MTD_ONENAND is not set | ||
490 | |||
491 | # | ||
492 | # LPDDR flash memory drivers | ||
493 | # | ||
494 | # CONFIG_MTD_LPDDR is not set | ||
495 | |||
496 | # | ||
497 | # UBI - Unsorted block images | ||
498 | # | ||
499 | # CONFIG_MTD_UBI is not set | ||
379 | CONFIG_OF_DEVICE=y | 500 | CONFIG_OF_DEVICE=y |
380 | CONFIG_OF_I2C=y | 501 | CONFIG_OF_I2C=y |
381 | # CONFIG_PARPORT is not set | 502 | # CONFIG_PARPORT is not set |
@@ -418,7 +539,11 @@ CONFIG_HAVE_IDE=y | |||
418 | # | 539 | # |
419 | 540 | ||
420 | # | 541 | # |
421 | # Enable only one of the two stacks, unless you know what you are doing | 542 | # You can enable one or both FireWire driver stacks. |
543 | # | ||
544 | |||
545 | # | ||
546 | # See the help texts for more information. | ||
422 | # | 547 | # |
423 | # CONFIG_FIREWIRE is not set | 548 | # CONFIG_FIREWIRE is not set |
424 | # CONFIG_IEEE1394 is not set | 549 | # CONFIG_IEEE1394 is not set |
@@ -439,6 +564,8 @@ CONFIG_NET_ETHERNET=y | |||
439 | # CONFIG_SUNGEM is not set | 564 | # CONFIG_SUNGEM is not set |
440 | # CONFIG_CASSINI is not set | 565 | # CONFIG_CASSINI is not set |
441 | # CONFIG_NET_VENDOR_3COM is not set | 566 | # CONFIG_NET_VENDOR_3COM is not set |
567 | # CONFIG_ETHOC is not set | ||
568 | # CONFIG_DNET is not set | ||
442 | # CONFIG_NET_TULIP is not set | 569 | # CONFIG_NET_TULIP is not set |
443 | # CONFIG_HP100 is not set | 570 | # CONFIG_HP100 is not set |
444 | CONFIG_IBM_NEW_EMAC=y | 571 | CONFIG_IBM_NEW_EMAC=y |
@@ -457,6 +584,7 @@ CONFIG_IBM_NEW_EMAC_EMAC4=y | |||
457 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | 584 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set |
458 | # CONFIG_NET_PCI is not set | 585 | # CONFIG_NET_PCI is not set |
459 | # CONFIG_B44 is not set | 586 | # CONFIG_B44 is not set |
587 | # CONFIG_KS8842 is not set | ||
460 | # CONFIG_ATL2 is not set | 588 | # CONFIG_ATL2 is not set |
461 | # CONFIG_NETDEV_1000 is not set | 589 | # CONFIG_NETDEV_1000 is not set |
462 | # CONFIG_NETDEV_10000 is not set | 590 | # CONFIG_NETDEV_10000 is not set |
@@ -467,7 +595,6 @@ CONFIG_IBM_NEW_EMAC_EMAC4=y | |||
467 | # | 595 | # |
468 | # CONFIG_WLAN_PRE80211 is not set | 596 | # CONFIG_WLAN_PRE80211 is not set |
469 | # CONFIG_WLAN_80211 is not set | 597 | # CONFIG_WLAN_80211 is not set |
470 | # CONFIG_IWLWIFI_LEDS is not set | ||
471 | 598 | ||
472 | # | 599 | # |
473 | # Enable WiMAX (Networking options) to see the WiMAX drivers | 600 | # Enable WiMAX (Networking options) to see the WiMAX drivers |
@@ -542,7 +669,6 @@ CONFIG_LEGACY_PTY_COUNT=256 | |||
542 | # CONFIG_IPMI_HANDLER is not set | 669 | # CONFIG_IPMI_HANDLER is not set |
543 | # CONFIG_HW_RANDOM is not set | 670 | # CONFIG_HW_RANDOM is not set |
544 | # CONFIG_NVRAM is not set | 671 | # CONFIG_NVRAM is not set |
545 | # CONFIG_GEN_RTC is not set | ||
546 | # CONFIG_R3964 is not set | 672 | # CONFIG_R3964 is not set |
547 | # CONFIG_APPLICOM is not set | 673 | # CONFIG_APPLICOM is not set |
548 | # CONFIG_RAW_DRIVER is not set | 674 | # CONFIG_RAW_DRIVER is not set |
@@ -608,14 +734,17 @@ CONFIG_I2C_IBM_IIC=y | |||
608 | # CONFIG_SENSORS_PCF8574 is not set | 734 | # CONFIG_SENSORS_PCF8574 is not set |
609 | # CONFIG_PCF8575 is not set | 735 | # CONFIG_PCF8575 is not set |
610 | # CONFIG_SENSORS_PCA9539 is not set | 736 | # CONFIG_SENSORS_PCA9539 is not set |
611 | # CONFIG_SENSORS_PCF8591 is not set | ||
612 | # CONFIG_SENSORS_MAX6875 is not set | ||
613 | # CONFIG_SENSORS_TSL2550 is not set | 737 | # CONFIG_SENSORS_TSL2550 is not set |
614 | # CONFIG_I2C_DEBUG_CORE is not set | 738 | # CONFIG_I2C_DEBUG_CORE is not set |
615 | # CONFIG_I2C_DEBUG_ALGO is not set | 739 | # CONFIG_I2C_DEBUG_ALGO is not set |
616 | # CONFIG_I2C_DEBUG_BUS is not set | 740 | # CONFIG_I2C_DEBUG_BUS is not set |
617 | # CONFIG_I2C_DEBUG_CHIP is not set | 741 | # CONFIG_I2C_DEBUG_CHIP is not set |
618 | # CONFIG_SPI is not set | 742 | # CONFIG_SPI is not set |
743 | |||
744 | # | ||
745 | # PPS support | ||
746 | # | ||
747 | # CONFIG_PPS is not set | ||
619 | CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y | 748 | CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y |
620 | # CONFIG_GPIOLIB is not set | 749 | # CONFIG_GPIOLIB is not set |
621 | # CONFIG_W1 is not set | 750 | # CONFIG_W1 is not set |
@@ -640,6 +769,7 @@ CONFIG_SENSORS_AD7414=y | |||
640 | # CONFIG_SENSORS_F71805F is not set | 769 | # CONFIG_SENSORS_F71805F is not set |
641 | # CONFIG_SENSORS_F71882FG is not set | 770 | # CONFIG_SENSORS_F71882FG is not set |
642 | # CONFIG_SENSORS_F75375S is not set | 771 | # CONFIG_SENSORS_F75375S is not set |
772 | # CONFIG_SENSORS_G760A is not set | ||
643 | # CONFIG_SENSORS_GL518SM is not set | 773 | # CONFIG_SENSORS_GL518SM is not set |
644 | # CONFIG_SENSORS_GL520SM is not set | 774 | # CONFIG_SENSORS_GL520SM is not set |
645 | # CONFIG_SENSORS_IT87 is not set | 775 | # CONFIG_SENSORS_IT87 is not set |
@@ -654,11 +784,14 @@ CONFIG_SENSORS_AD7414=y | |||
654 | # CONFIG_SENSORS_LM90 is not set | 784 | # CONFIG_SENSORS_LM90 is not set |
655 | # CONFIG_SENSORS_LM92 is not set | 785 | # CONFIG_SENSORS_LM92 is not set |
656 | # CONFIG_SENSORS_LM93 is not set | 786 | # CONFIG_SENSORS_LM93 is not set |
787 | # CONFIG_SENSORS_LTC4215 is not set | ||
657 | # CONFIG_SENSORS_LTC4245 is not set | 788 | # CONFIG_SENSORS_LTC4245 is not set |
789 | # CONFIG_SENSORS_LM95241 is not set | ||
658 | # CONFIG_SENSORS_MAX1619 is not set | 790 | # CONFIG_SENSORS_MAX1619 is not set |
659 | # CONFIG_SENSORS_MAX6650 is not set | 791 | # CONFIG_SENSORS_MAX6650 is not set |
660 | # CONFIG_SENSORS_PC87360 is not set | 792 | # CONFIG_SENSORS_PC87360 is not set |
661 | # CONFIG_SENSORS_PC87427 is not set | 793 | # CONFIG_SENSORS_PC87427 is not set |
794 | # CONFIG_SENSORS_PCF8591 is not set | ||
662 | # CONFIG_SENSORS_SIS5595 is not set | 795 | # CONFIG_SENSORS_SIS5595 is not set |
663 | # CONFIG_SENSORS_DME1737 is not set | 796 | # CONFIG_SENSORS_DME1737 is not set |
664 | # CONFIG_SENSORS_SMSC47M1 is not set | 797 | # CONFIG_SENSORS_SMSC47M1 is not set |
@@ -666,6 +799,7 @@ CONFIG_SENSORS_AD7414=y | |||
666 | # CONFIG_SENSORS_SMSC47B397 is not set | 799 | # CONFIG_SENSORS_SMSC47B397 is not set |
667 | # CONFIG_SENSORS_ADS7828 is not set | 800 | # CONFIG_SENSORS_ADS7828 is not set |
668 | # CONFIG_SENSORS_THMC50 is not set | 801 | # CONFIG_SENSORS_THMC50 is not set |
802 | # CONFIG_SENSORS_TMP401 is not set | ||
669 | # CONFIG_SENSORS_VIA686A is not set | 803 | # CONFIG_SENSORS_VIA686A is not set |
670 | # CONFIG_SENSORS_VT1211 is not set | 804 | # CONFIG_SENSORS_VT1211 is not set |
671 | # CONFIG_SENSORS_VT8231 is not set | 805 | # CONFIG_SENSORS_VT8231 is not set |
@@ -700,24 +834,9 @@ CONFIG_SSB_POSSIBLE=y | |||
700 | # CONFIG_MFD_WM8400 is not set | 834 | # CONFIG_MFD_WM8400 is not set |
701 | # CONFIG_MFD_WM8350_I2C is not set | 835 | # CONFIG_MFD_WM8350_I2C is not set |
702 | # CONFIG_MFD_PCF50633 is not set | 836 | # CONFIG_MFD_PCF50633 is not set |
837 | # CONFIG_AB3100_CORE is not set | ||
703 | # CONFIG_REGULATOR is not set | 838 | # CONFIG_REGULATOR is not set |
704 | 839 | # CONFIG_MEDIA_SUPPORT is not set | |
705 | # | ||
706 | # Multimedia devices | ||
707 | # | ||
708 | |||
709 | # | ||
710 | # Multimedia core support | ||
711 | # | ||
712 | # CONFIG_VIDEO_DEV is not set | ||
713 | # CONFIG_DVB_CORE is not set | ||
714 | # CONFIG_VIDEO_MEDIA is not set | ||
715 | |||
716 | # | ||
717 | # Multimedia drivers | ||
718 | # | ||
719 | # CONFIG_DAB is not set | ||
720 | # CONFIG_USB_DABUSB is not set | ||
721 | 840 | ||
722 | # | 841 | # |
723 | # Graphics support | 842 | # Graphics support |
@@ -759,6 +878,7 @@ CONFIG_USB_MON=y | |||
759 | # USB Host Controller Drivers | 878 | # USB Host Controller Drivers |
760 | # | 879 | # |
761 | # CONFIG_USB_C67X00_HCD is not set | 880 | # CONFIG_USB_C67X00_HCD is not set |
881 | # CONFIG_USB_XHCI_HCD is not set | ||
762 | CONFIG_USB_EHCI_HCD=m | 882 | CONFIG_USB_EHCI_HCD=m |
763 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set | 883 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set |
764 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set | 884 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set |
@@ -767,9 +887,9 @@ CONFIG_USB_EHCI_HCD_PPC_OF=y | |||
767 | # CONFIG_USB_ISP116X_HCD is not set | 887 | # CONFIG_USB_ISP116X_HCD is not set |
768 | # CONFIG_USB_ISP1760_HCD is not set | 888 | # CONFIG_USB_ISP1760_HCD is not set |
769 | CONFIG_USB_OHCI_HCD=y | 889 | CONFIG_USB_OHCI_HCD=y |
770 | CONFIG_USB_OHCI_HCD_PPC_OF=y | ||
771 | CONFIG_USB_OHCI_HCD_PPC_OF_BE=y | 890 | CONFIG_USB_OHCI_HCD_PPC_OF_BE=y |
772 | CONFIG_USB_OHCI_HCD_PPC_OF_LE=y | 891 | CONFIG_USB_OHCI_HCD_PPC_OF_LE=y |
892 | CONFIG_USB_OHCI_HCD_PPC_OF=y | ||
773 | CONFIG_USB_OHCI_HCD_PCI=y | 893 | CONFIG_USB_OHCI_HCD_PCI=y |
774 | CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y | 894 | CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y |
775 | CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y | 895 | CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y |
@@ -789,11 +909,11 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y | |||
789 | # CONFIG_USB_TMC is not set | 909 | # CONFIG_USB_TMC is not set |
790 | 910 | ||
791 | # | 911 | # |
792 | # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; | 912 | # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may |
793 | # | 913 | # |
794 | 914 | ||
795 | # | 915 | # |
796 | # see USB_STORAGE Help for more information | 916 | # also be needed; see USB_STORAGE Help for more info |
797 | # | 917 | # |
798 | CONFIG_USB_LIBUSUAL=y | 918 | CONFIG_USB_LIBUSUAL=y |
799 | 919 | ||
@@ -821,7 +941,6 @@ CONFIG_USB_LIBUSUAL=y | |||
821 | # CONFIG_USB_LED is not set | 941 | # CONFIG_USB_LED is not set |
822 | # CONFIG_USB_CYPRESS_CY7C63 is not set | 942 | # CONFIG_USB_CYPRESS_CY7C63 is not set |
823 | # CONFIG_USB_CYTHERM is not set | 943 | # CONFIG_USB_CYTHERM is not set |
824 | # CONFIG_USB_PHIDGET is not set | ||
825 | # CONFIG_USB_IDMOUSE is not set | 944 | # CONFIG_USB_IDMOUSE is not set |
826 | # CONFIG_USB_FTDI_ELAN is not set | 945 | # CONFIG_USB_FTDI_ELAN is not set |
827 | # CONFIG_USB_APPLEDISPLAY is not set | 946 | # CONFIG_USB_APPLEDISPLAY is not set |
@@ -837,6 +956,7 @@ CONFIG_USB_LIBUSUAL=y | |||
837 | # | 956 | # |
838 | # OTG and related infrastructure | 957 | # OTG and related infrastructure |
839 | # | 958 | # |
959 | # CONFIG_NOP_USB_XCEIV is not set | ||
840 | # CONFIG_UWB is not set | 960 | # CONFIG_UWB is not set |
841 | # CONFIG_MMC is not set | 961 | # CONFIG_MMC is not set |
842 | # CONFIG_MEMSTICK is not set | 962 | # CONFIG_MEMSTICK is not set |
@@ -844,9 +964,70 @@ CONFIG_USB_LIBUSUAL=y | |||
844 | # CONFIG_ACCESSIBILITY is not set | 964 | # CONFIG_ACCESSIBILITY is not set |
845 | # CONFIG_INFINIBAND is not set | 965 | # CONFIG_INFINIBAND is not set |
846 | # CONFIG_EDAC is not set | 966 | # CONFIG_EDAC is not set |
847 | # CONFIG_RTC_CLASS is not set | 967 | CONFIG_RTC_LIB=y |
968 | CONFIG_RTC_CLASS=y | ||
969 | CONFIG_RTC_HCTOSYS=y | ||
970 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
971 | # CONFIG_RTC_DEBUG is not set | ||
972 | |||
973 | # | ||
974 | # RTC interfaces | ||
975 | # | ||
976 | CONFIG_RTC_INTF_SYSFS=y | ||
977 | CONFIG_RTC_INTF_PROC=y | ||
978 | CONFIG_RTC_INTF_DEV=y | ||
979 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
980 | # CONFIG_RTC_DRV_TEST is not set | ||
981 | |||
982 | # | ||
983 | # I2C RTC drivers | ||
984 | # | ||
985 | # CONFIG_RTC_DRV_DS1307 is not set | ||
986 | # CONFIG_RTC_DRV_DS1374 is not set | ||
987 | # CONFIG_RTC_DRV_DS1672 is not set | ||
988 | # CONFIG_RTC_DRV_MAX6900 is not set | ||
989 | # CONFIG_RTC_DRV_RS5C372 is not set | ||
990 | # CONFIG_RTC_DRV_ISL1208 is not set | ||
991 | # CONFIG_RTC_DRV_X1205 is not set | ||
992 | # CONFIG_RTC_DRV_PCF8563 is not set | ||
993 | # CONFIG_RTC_DRV_PCF8583 is not set | ||
994 | CONFIG_RTC_DRV_M41T80=y | ||
995 | # CONFIG_RTC_DRV_M41T80_WDT is not set | ||
996 | # CONFIG_RTC_DRV_S35390A is not set | ||
997 | # CONFIG_RTC_DRV_FM3130 is not set | ||
998 | # CONFIG_RTC_DRV_RX8581 is not set | ||
999 | # CONFIG_RTC_DRV_RX8025 is not set | ||
1000 | |||
1001 | # | ||
1002 | # SPI RTC drivers | ||
1003 | # | ||
1004 | |||
1005 | # | ||
1006 | # Platform RTC drivers | ||
1007 | # | ||
1008 | # CONFIG_RTC_DRV_CMOS is not set | ||
1009 | # CONFIG_RTC_DRV_DS1286 is not set | ||
1010 | # CONFIG_RTC_DRV_DS1511 is not set | ||
1011 | # CONFIG_RTC_DRV_DS1553 is not set | ||
1012 | # CONFIG_RTC_DRV_DS1742 is not set | ||
1013 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
1014 | # CONFIG_RTC_DRV_M48T86 is not set | ||
1015 | # CONFIG_RTC_DRV_M48T35 is not set | ||
1016 | # CONFIG_RTC_DRV_M48T59 is not set | ||
1017 | # CONFIG_RTC_DRV_BQ4802 is not set | ||
1018 | # CONFIG_RTC_DRV_V3020 is not set | ||
1019 | |||
1020 | # | ||
1021 | # on-CPU RTC drivers | ||
1022 | # | ||
1023 | # CONFIG_RTC_DRV_GENERIC is not set | ||
848 | # CONFIG_DMADEVICES is not set | 1024 | # CONFIG_DMADEVICES is not set |
1025 | # CONFIG_AUXDISPLAY is not set | ||
849 | # CONFIG_UIO is not set | 1026 | # CONFIG_UIO is not set |
1027 | |||
1028 | # | ||
1029 | # TI VLYNQ | ||
1030 | # | ||
850 | # CONFIG_STAGING is not set | 1031 | # CONFIG_STAGING is not set |
851 | 1032 | ||
852 | # | 1033 | # |
@@ -860,11 +1041,12 @@ CONFIG_EXT2_FS=y | |||
860 | # CONFIG_REISERFS_FS is not set | 1041 | # CONFIG_REISERFS_FS is not set |
861 | # CONFIG_JFS_FS is not set | 1042 | # CONFIG_JFS_FS is not set |
862 | # CONFIG_FS_POSIX_ACL is not set | 1043 | # CONFIG_FS_POSIX_ACL is not set |
863 | CONFIG_FILE_LOCKING=y | ||
864 | # CONFIG_XFS_FS is not set | 1044 | # CONFIG_XFS_FS is not set |
865 | # CONFIG_GFS2_FS is not set | 1045 | # CONFIG_GFS2_FS is not set |
866 | # CONFIG_OCFS2_FS is not set | 1046 | # CONFIG_OCFS2_FS is not set |
867 | # CONFIG_BTRFS_FS is not set | 1047 | # CONFIG_BTRFS_FS is not set |
1048 | CONFIG_FILE_LOCKING=y | ||
1049 | CONFIG_FSNOTIFY=y | ||
868 | CONFIG_DNOTIFY=y | 1050 | CONFIG_DNOTIFY=y |
869 | CONFIG_INOTIFY=y | 1051 | CONFIG_INOTIFY=y |
870 | CONFIG_INOTIFY_USER=y | 1052 | CONFIG_INOTIFY_USER=y |
@@ -874,6 +1056,11 @@ CONFIG_INOTIFY_USER=y | |||
874 | # CONFIG_FUSE_FS is not set | 1056 | # CONFIG_FUSE_FS is not set |
875 | 1057 | ||
876 | # | 1058 | # |
1059 | # Caches | ||
1060 | # | ||
1061 | # CONFIG_FSCACHE is not set | ||
1062 | |||
1063 | # | ||
877 | # CD-ROM/DVD Filesystems | 1064 | # CD-ROM/DVD Filesystems |
878 | # | 1065 | # |
879 | # CONFIG_ISO9660_FS is not set | 1066 | # CONFIG_ISO9660_FS is not set |
@@ -906,6 +1093,7 @@ CONFIG_MISC_FILESYSTEMS=y | |||
906 | # CONFIG_BEFS_FS is not set | 1093 | # CONFIG_BEFS_FS is not set |
907 | # CONFIG_BFS_FS is not set | 1094 | # CONFIG_BFS_FS is not set |
908 | # CONFIG_EFS_FS is not set | 1095 | # CONFIG_EFS_FS is not set |
1096 | # CONFIG_JFFS2_FS is not set | ||
909 | CONFIG_CRAMFS=y | 1097 | CONFIG_CRAMFS=y |
910 | # CONFIG_SQUASHFS is not set | 1098 | # CONFIG_SQUASHFS is not set |
911 | # CONFIG_VXFS_FS is not set | 1099 | # CONFIG_VXFS_FS is not set |
@@ -916,6 +1104,7 @@ CONFIG_CRAMFS=y | |||
916 | # CONFIG_ROMFS_FS is not set | 1104 | # CONFIG_ROMFS_FS is not set |
917 | # CONFIG_SYSV_FS is not set | 1105 | # CONFIG_SYSV_FS is not set |
918 | # CONFIG_UFS_FS is not set | 1106 | # CONFIG_UFS_FS is not set |
1107 | # CONFIG_NILFS2_FS is not set | ||
919 | CONFIG_NETWORK_FILESYSTEMS=y | 1108 | CONFIG_NETWORK_FILESYSTEMS=y |
920 | CONFIG_NFS_FS=y | 1109 | CONFIG_NFS_FS=y |
921 | CONFIG_NFS_V3=y | 1110 | CONFIG_NFS_V3=y |
@@ -927,7 +1116,6 @@ CONFIG_LOCKD=y | |||
927 | CONFIG_LOCKD_V4=y | 1116 | CONFIG_LOCKD_V4=y |
928 | CONFIG_NFS_COMMON=y | 1117 | CONFIG_NFS_COMMON=y |
929 | CONFIG_SUNRPC=y | 1118 | CONFIG_SUNRPC=y |
930 | # CONFIG_SUNRPC_REGISTER_V4 is not set | ||
931 | # CONFIG_RPCSEC_GSS_KRB5 is not set | 1119 | # CONFIG_RPCSEC_GSS_KRB5 is not set |
932 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 1120 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
933 | # CONFIG_SMB_FS is not set | 1121 | # CONFIG_SMB_FS is not set |
@@ -941,8 +1129,48 @@ CONFIG_SUNRPC=y | |||
941 | # | 1129 | # |
942 | # CONFIG_PARTITION_ADVANCED is not set | 1130 | # CONFIG_PARTITION_ADVANCED is not set |
943 | CONFIG_MSDOS_PARTITION=y | 1131 | CONFIG_MSDOS_PARTITION=y |
944 | # CONFIG_NLS is not set | 1132 | CONFIG_NLS=y |
1133 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
1134 | # CONFIG_NLS_CODEPAGE_437 is not set | ||
1135 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
1136 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
1137 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
1138 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
1139 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
1140 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
1141 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
1142 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
1143 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
1144 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
1145 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
1146 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
1147 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
1148 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
1149 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
1150 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
1151 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
1152 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
1153 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
1154 | # CONFIG_NLS_ISO8859_8 is not set | ||
1155 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
1156 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
1157 | # CONFIG_NLS_ASCII is not set | ||
1158 | # CONFIG_NLS_ISO8859_1 is not set | ||
1159 | # CONFIG_NLS_ISO8859_2 is not set | ||
1160 | # CONFIG_NLS_ISO8859_3 is not set | ||
1161 | # CONFIG_NLS_ISO8859_4 is not set | ||
1162 | # CONFIG_NLS_ISO8859_5 is not set | ||
1163 | # CONFIG_NLS_ISO8859_6 is not set | ||
1164 | # CONFIG_NLS_ISO8859_7 is not set | ||
1165 | # CONFIG_NLS_ISO8859_9 is not set | ||
1166 | # CONFIG_NLS_ISO8859_13 is not set | ||
1167 | # CONFIG_NLS_ISO8859_14 is not set | ||
1168 | # CONFIG_NLS_ISO8859_15 is not set | ||
1169 | # CONFIG_NLS_KOI8_R is not set | ||
1170 | # CONFIG_NLS_KOI8_U is not set | ||
1171 | # CONFIG_NLS_UTF8 is not set | ||
945 | # CONFIG_DLM is not set | 1172 | # CONFIG_DLM is not set |
1173 | # CONFIG_BINARY_PRINTF is not set | ||
946 | 1174 | ||
947 | # | 1175 | # |
948 | # Library routines | 1176 | # Library routines |
@@ -957,11 +1185,13 @@ CONFIG_CRC32=y | |||
957 | # CONFIG_CRC7 is not set | 1185 | # CONFIG_CRC7 is not set |
958 | # CONFIG_LIBCRC32C is not set | 1186 | # CONFIG_LIBCRC32C is not set |
959 | CONFIG_ZLIB_INFLATE=y | 1187 | CONFIG_ZLIB_INFLATE=y |
960 | CONFIG_PLIST=y | 1188 | CONFIG_DECOMPRESS_GZIP=y |
961 | CONFIG_HAS_IOMEM=y | 1189 | CONFIG_HAS_IOMEM=y |
962 | CONFIG_HAS_IOPORT=y | 1190 | CONFIG_HAS_IOPORT=y |
963 | CONFIG_HAS_DMA=y | 1191 | CONFIG_HAS_DMA=y |
964 | CONFIG_HAVE_LMB=y | 1192 | CONFIG_HAVE_LMB=y |
1193 | CONFIG_NLATTR=y | ||
1194 | CONFIG_GENERIC_ATOMIC64=y | ||
965 | 1195 | ||
966 | # | 1196 | # |
967 | # Kernel hacking | 1197 | # Kernel hacking |
@@ -979,6 +1209,9 @@ CONFIG_DEBUG_KERNEL=y | |||
979 | CONFIG_DETECT_SOFTLOCKUP=y | 1209 | CONFIG_DETECT_SOFTLOCKUP=y |
980 | # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set | 1210 | # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set |
981 | CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 | 1211 | CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 |
1212 | CONFIG_DETECT_HUNG_TASK=y | ||
1213 | # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set | ||
1214 | CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 | ||
982 | CONFIG_SCHED_DEBUG=y | 1215 | CONFIG_SCHED_DEBUG=y |
983 | # CONFIG_SCHEDSTATS is not set | 1216 | # CONFIG_SCHEDSTATS is not set |
984 | # CONFIG_TIMER_STATS is not set | 1217 | # CONFIG_TIMER_STATS is not set |
@@ -989,6 +1222,9 @@ CONFIG_SCHED_DEBUG=y | |||
989 | # CONFIG_RT_MUTEX_TESTER is not set | 1222 | # CONFIG_RT_MUTEX_TESTER is not set |
990 | # CONFIG_DEBUG_SPINLOCK is not set | 1223 | # CONFIG_DEBUG_SPINLOCK is not set |
991 | # CONFIG_DEBUG_MUTEXES is not set | 1224 | # CONFIG_DEBUG_MUTEXES is not set |
1225 | # CONFIG_DEBUG_LOCK_ALLOC is not set | ||
1226 | # CONFIG_PROVE_LOCKING is not set | ||
1227 | # CONFIG_LOCK_STAT is not set | ||
992 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | 1228 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set |
993 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | 1229 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set |
994 | # CONFIG_DEBUG_KOBJECT is not set | 1230 | # CONFIG_DEBUG_KOBJECT is not set |
@@ -1000,7 +1236,6 @@ CONFIG_SCHED_DEBUG=y | |||
1000 | # CONFIG_DEBUG_LIST is not set | 1236 | # CONFIG_DEBUG_LIST is not set |
1001 | # CONFIG_DEBUG_SG is not set | 1237 | # CONFIG_DEBUG_SG is not set |
1002 | # CONFIG_DEBUG_NOTIFIERS is not set | 1238 | # CONFIG_DEBUG_NOTIFIERS is not set |
1003 | # CONFIG_BOOT_PRINTK_DELAY is not set | ||
1004 | # CONFIG_RCU_TORTURE_TEST is not set | 1239 | # CONFIG_RCU_TORTURE_TEST is not set |
1005 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | 1240 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set |
1006 | # CONFIG_BACKTRACE_SELF_TEST is not set | 1241 | # CONFIG_BACKTRACE_SELF_TEST is not set |
@@ -1008,27 +1243,36 @@ CONFIG_SCHED_DEBUG=y | |||
1008 | # CONFIG_FAULT_INJECTION is not set | 1243 | # CONFIG_FAULT_INJECTION is not set |
1009 | # CONFIG_LATENCYTOP is not set | 1244 | # CONFIG_LATENCYTOP is not set |
1010 | CONFIG_SYSCTL_SYSCALL_CHECK=y | 1245 | CONFIG_SYSCTL_SYSCALL_CHECK=y |
1246 | # CONFIG_DEBUG_PAGEALLOC is not set | ||
1011 | CONFIG_HAVE_FUNCTION_TRACER=y | 1247 | CONFIG_HAVE_FUNCTION_TRACER=y |
1248 | CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y | ||
1012 | CONFIG_HAVE_DYNAMIC_FTRACE=y | 1249 | CONFIG_HAVE_DYNAMIC_FTRACE=y |
1013 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y | 1250 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y |
1014 | 1251 | CONFIG_TRACING_SUPPORT=y | |
1015 | # | 1252 | CONFIG_FTRACE=y |
1016 | # Tracers | ||
1017 | # | ||
1018 | # CONFIG_FUNCTION_TRACER is not set | 1253 | # CONFIG_FUNCTION_TRACER is not set |
1254 | # CONFIG_IRQSOFF_TRACER is not set | ||
1019 | # CONFIG_SCHED_TRACER is not set | 1255 | # CONFIG_SCHED_TRACER is not set |
1020 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | 1256 | # CONFIG_ENABLE_DEFAULT_TRACERS is not set |
1021 | # CONFIG_BOOT_TRACER is not set | 1257 | # CONFIG_BOOT_TRACER is not set |
1022 | # CONFIG_TRACE_BRANCH_PROFILING is not set | 1258 | CONFIG_BRANCH_PROFILE_NONE=y |
1259 | # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set | ||
1260 | # CONFIG_PROFILE_ALL_BRANCHES is not set | ||
1023 | # CONFIG_STACK_TRACER is not set | 1261 | # CONFIG_STACK_TRACER is not set |
1024 | # CONFIG_DYNAMIC_PRINTK_DEBUG is not set | 1262 | # CONFIG_KMEMTRACE is not set |
1263 | # CONFIG_WORKQUEUE_TRACER is not set | ||
1264 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
1265 | # CONFIG_DYNAMIC_DEBUG is not set | ||
1025 | # CONFIG_SAMPLES is not set | 1266 | # CONFIG_SAMPLES is not set |
1026 | CONFIG_HAVE_ARCH_KGDB=y | 1267 | CONFIG_HAVE_ARCH_KGDB=y |
1027 | # CONFIG_KGDB is not set | 1268 | # CONFIG_KGDB is not set |
1269 | # CONFIG_KMEMCHECK is not set | ||
1270 | # CONFIG_PPC_DISABLE_WERROR is not set | ||
1271 | CONFIG_PPC_WERROR=y | ||
1028 | CONFIG_PRINT_STACK_DEPTH=64 | 1272 | CONFIG_PRINT_STACK_DEPTH=64 |
1029 | # CONFIG_DEBUG_STACKOVERFLOW is not set | 1273 | # CONFIG_DEBUG_STACKOVERFLOW is not set |
1030 | # CONFIG_DEBUG_STACK_USAGE is not set | 1274 | # CONFIG_DEBUG_STACK_USAGE is not set |
1031 | # CONFIG_DEBUG_PAGEALLOC is not set | 1275 | # CONFIG_PPC_EMULATED_STATS is not set |
1032 | # CONFIG_CODE_PATCHING_SELFTEST is not set | 1276 | # CONFIG_CODE_PATCHING_SELFTEST is not set |
1033 | # CONFIG_FTR_FIXUP_SELFTEST is not set | 1277 | # CONFIG_FTR_FIXUP_SELFTEST is not set |
1034 | # CONFIG_MSI_BITMAP_SELFTEST is not set | 1278 | # CONFIG_MSI_BITMAP_SELFTEST is not set |
diff --git a/arch/powerpc/include/asm/bitops.h b/arch/powerpc/include/asm/bitops.h index 897eade3afbe..56f2f2ea5631 100644 --- a/arch/powerpc/include/asm/bitops.h +++ b/arch/powerpc/include/asm/bitops.h | |||
@@ -56,174 +56,102 @@ | |||
56 | #define BITOP_WORD(nr) ((nr) / BITS_PER_LONG) | 56 | #define BITOP_WORD(nr) ((nr) / BITS_PER_LONG) |
57 | #define BITOP_LE_SWIZZLE ((BITS_PER_LONG-1) & ~0x7) | 57 | #define BITOP_LE_SWIZZLE ((BITS_PER_LONG-1) & ~0x7) |
58 | 58 | ||
59 | /* Macro for generating the ***_bits() functions */ | ||
60 | #define DEFINE_BITOP(fn, op, prefix, postfix) \ | ||
61 | static __inline__ void fn(unsigned long mask, \ | ||
62 | volatile unsigned long *_p) \ | ||
63 | { \ | ||
64 | unsigned long old; \ | ||
65 | unsigned long *p = (unsigned long *)_p; \ | ||
66 | __asm__ __volatile__ ( \ | ||
67 | prefix \ | ||
68 | "1:" PPC_LLARX "%0,0,%3\n" \ | ||
69 | stringify_in_c(op) "%0,%0,%2\n" \ | ||
70 | PPC405_ERR77(0,%3) \ | ||
71 | PPC_STLCX "%0,0,%3\n" \ | ||
72 | "bne- 1b\n" \ | ||
73 | postfix \ | ||
74 | : "=&r" (old), "+m" (*p) \ | ||
75 | : "r" (mask), "r" (p) \ | ||
76 | : "cc", "memory"); \ | ||
77 | } | ||
78 | |||
79 | DEFINE_BITOP(set_bits, or, "", "") | ||
80 | DEFINE_BITOP(clear_bits, andc, "", "") | ||
81 | DEFINE_BITOP(clear_bits_unlock, andc, LWSYNC_ON_SMP, "") | ||
82 | DEFINE_BITOP(change_bits, xor, "", "") | ||
83 | |||
59 | static __inline__ void set_bit(int nr, volatile unsigned long *addr) | 84 | static __inline__ void set_bit(int nr, volatile unsigned long *addr) |
60 | { | 85 | { |
61 | unsigned long old; | 86 | set_bits(BITOP_MASK(nr), addr + BITOP_WORD(nr)); |
62 | unsigned long mask = BITOP_MASK(nr); | ||
63 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
64 | |||
65 | __asm__ __volatile__( | ||
66 | "1:" PPC_LLARX "%0,0,%3 # set_bit\n" | ||
67 | "or %0,%0,%2\n" | ||
68 | PPC405_ERR77(0,%3) | ||
69 | PPC_STLCX "%0,0,%3\n" | ||
70 | "bne- 1b" | ||
71 | : "=&r" (old), "+m" (*p) | ||
72 | : "r" (mask), "r" (p) | ||
73 | : "cc" ); | ||
74 | } | 87 | } |
75 | 88 | ||
76 | static __inline__ void clear_bit(int nr, volatile unsigned long *addr) | 89 | static __inline__ void clear_bit(int nr, volatile unsigned long *addr) |
77 | { | 90 | { |
78 | unsigned long old; | 91 | clear_bits(BITOP_MASK(nr), addr + BITOP_WORD(nr)); |
79 | unsigned long mask = BITOP_MASK(nr); | ||
80 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
81 | |||
82 | __asm__ __volatile__( | ||
83 | "1:" PPC_LLARX "%0,0,%3 # clear_bit\n" | ||
84 | "andc %0,%0,%2\n" | ||
85 | PPC405_ERR77(0,%3) | ||
86 | PPC_STLCX "%0,0,%3\n" | ||
87 | "bne- 1b" | ||
88 | : "=&r" (old), "+m" (*p) | ||
89 | : "r" (mask), "r" (p) | ||
90 | : "cc" ); | ||
91 | } | 92 | } |
92 | 93 | ||
93 | static __inline__ void clear_bit_unlock(int nr, volatile unsigned long *addr) | 94 | static __inline__ void clear_bit_unlock(int nr, volatile unsigned long *addr) |
94 | { | 95 | { |
95 | unsigned long old; | 96 | clear_bits_unlock(BITOP_MASK(nr), addr + BITOP_WORD(nr)); |
96 | unsigned long mask = BITOP_MASK(nr); | ||
97 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
98 | |||
99 | __asm__ __volatile__( | ||
100 | LWSYNC_ON_SMP | ||
101 | "1:" PPC_LLARX "%0,0,%3 # clear_bit_unlock\n" | ||
102 | "andc %0,%0,%2\n" | ||
103 | PPC405_ERR77(0,%3) | ||
104 | PPC_STLCX "%0,0,%3\n" | ||
105 | "bne- 1b" | ||
106 | : "=&r" (old), "+m" (*p) | ||
107 | : "r" (mask), "r" (p) | ||
108 | : "cc", "memory"); | ||
109 | } | 97 | } |
110 | 98 | ||
111 | static __inline__ void change_bit(int nr, volatile unsigned long *addr) | 99 | static __inline__ void change_bit(int nr, volatile unsigned long *addr) |
112 | { | 100 | { |
113 | unsigned long old; | 101 | change_bits(BITOP_MASK(nr), addr + BITOP_WORD(nr)); |
114 | unsigned long mask = BITOP_MASK(nr); | 102 | } |
115 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | 103 | |
116 | 104 | /* Like DEFINE_BITOP(), with changes to the arguments to 'op' and the output | |
117 | __asm__ __volatile__( | 105 | * operands. */ |
118 | "1:" PPC_LLARX "%0,0,%3 # change_bit\n" | 106 | #define DEFINE_TESTOP(fn, op, prefix, postfix) \ |
119 | "xor %0,%0,%2\n" | 107 | static __inline__ unsigned long fn( \ |
120 | PPC405_ERR77(0,%3) | 108 | unsigned long mask, \ |
121 | PPC_STLCX "%0,0,%3\n" | 109 | volatile unsigned long *_p) \ |
122 | "bne- 1b" | 110 | { \ |
123 | : "=&r" (old), "+m" (*p) | 111 | unsigned long old, t; \ |
124 | : "r" (mask), "r" (p) | 112 | unsigned long *p = (unsigned long *)_p; \ |
125 | : "cc" ); | 113 | __asm__ __volatile__ ( \ |
114 | prefix \ | ||
115 | "1:" PPC_LLARX "%0,0,%3\n" \ | ||
116 | stringify_in_c(op) "%1,%0,%2\n" \ | ||
117 | PPC405_ERR77(0,%3) \ | ||
118 | PPC_STLCX "%1,0,%3\n" \ | ||
119 | "bne- 1b\n" \ | ||
120 | postfix \ | ||
121 | : "=&r" (old), "=&r" (t) \ | ||
122 | : "r" (mask), "r" (p) \ | ||
123 | : "cc", "memory"); \ | ||
124 | return (old & mask); \ | ||
126 | } | 125 | } |
127 | 126 | ||
127 | DEFINE_TESTOP(test_and_set_bits, or, LWSYNC_ON_SMP, ISYNC_ON_SMP) | ||
128 | DEFINE_TESTOP(test_and_set_bits_lock, or, "", ISYNC_ON_SMP) | ||
129 | DEFINE_TESTOP(test_and_clear_bits, andc, LWSYNC_ON_SMP, ISYNC_ON_SMP) | ||
130 | DEFINE_TESTOP(test_and_change_bits, xor, LWSYNC_ON_SMP, ISYNC_ON_SMP) | ||
131 | |||
128 | static __inline__ int test_and_set_bit(unsigned long nr, | 132 | static __inline__ int test_and_set_bit(unsigned long nr, |
129 | volatile unsigned long *addr) | 133 | volatile unsigned long *addr) |
130 | { | 134 | { |
131 | unsigned long old, t; | 135 | return test_and_set_bits(BITOP_MASK(nr), addr + BITOP_WORD(nr)) != 0; |
132 | unsigned long mask = BITOP_MASK(nr); | ||
133 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
134 | |||
135 | __asm__ __volatile__( | ||
136 | LWSYNC_ON_SMP | ||
137 | "1:" PPC_LLARX "%0,0,%3 # test_and_set_bit\n" | ||
138 | "or %1,%0,%2 \n" | ||
139 | PPC405_ERR77(0,%3) | ||
140 | PPC_STLCX "%1,0,%3 \n" | ||
141 | "bne- 1b" | ||
142 | ISYNC_ON_SMP | ||
143 | : "=&r" (old), "=&r" (t) | ||
144 | : "r" (mask), "r" (p) | ||
145 | : "cc", "memory"); | ||
146 | |||
147 | return (old & mask) != 0; | ||
148 | } | 136 | } |
149 | 137 | ||
150 | static __inline__ int test_and_set_bit_lock(unsigned long nr, | 138 | static __inline__ int test_and_set_bit_lock(unsigned long nr, |
151 | volatile unsigned long *addr) | 139 | volatile unsigned long *addr) |
152 | { | 140 | { |
153 | unsigned long old, t; | 141 | return test_and_set_bits_lock(BITOP_MASK(nr), |
154 | unsigned long mask = BITOP_MASK(nr); | 142 | addr + BITOP_WORD(nr)) != 0; |
155 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
156 | |||
157 | __asm__ __volatile__( | ||
158 | "1:" PPC_LLARX "%0,0,%3 # test_and_set_bit_lock\n" | ||
159 | "or %1,%0,%2 \n" | ||
160 | PPC405_ERR77(0,%3) | ||
161 | PPC_STLCX "%1,0,%3 \n" | ||
162 | "bne- 1b" | ||
163 | ISYNC_ON_SMP | ||
164 | : "=&r" (old), "=&r" (t) | ||
165 | : "r" (mask), "r" (p) | ||
166 | : "cc", "memory"); | ||
167 | |||
168 | return (old & mask) != 0; | ||
169 | } | 143 | } |
170 | 144 | ||
171 | static __inline__ int test_and_clear_bit(unsigned long nr, | 145 | static __inline__ int test_and_clear_bit(unsigned long nr, |
172 | volatile unsigned long *addr) | 146 | volatile unsigned long *addr) |
173 | { | 147 | { |
174 | unsigned long old, t; | 148 | return test_and_clear_bits(BITOP_MASK(nr), addr + BITOP_WORD(nr)) != 0; |
175 | unsigned long mask = BITOP_MASK(nr); | ||
176 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
177 | |||
178 | __asm__ __volatile__( | ||
179 | LWSYNC_ON_SMP | ||
180 | "1:" PPC_LLARX "%0,0,%3 # test_and_clear_bit\n" | ||
181 | "andc %1,%0,%2 \n" | ||
182 | PPC405_ERR77(0,%3) | ||
183 | PPC_STLCX "%1,0,%3 \n" | ||
184 | "bne- 1b" | ||
185 | ISYNC_ON_SMP | ||
186 | : "=&r" (old), "=&r" (t) | ||
187 | : "r" (mask), "r" (p) | ||
188 | : "cc", "memory"); | ||
189 | |||
190 | return (old & mask) != 0; | ||
191 | } | 149 | } |
192 | 150 | ||
193 | static __inline__ int test_and_change_bit(unsigned long nr, | 151 | static __inline__ int test_and_change_bit(unsigned long nr, |
194 | volatile unsigned long *addr) | 152 | volatile unsigned long *addr) |
195 | { | 153 | { |
196 | unsigned long old, t; | 154 | return test_and_change_bits(BITOP_MASK(nr), addr + BITOP_WORD(nr)) != 0; |
197 | unsigned long mask = BITOP_MASK(nr); | ||
198 | unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); | ||
199 | |||
200 | __asm__ __volatile__( | ||
201 | LWSYNC_ON_SMP | ||
202 | "1:" PPC_LLARX "%0,0,%3 # test_and_change_bit\n" | ||
203 | "xor %1,%0,%2 \n" | ||
204 | PPC405_ERR77(0,%3) | ||
205 | PPC_STLCX "%1,0,%3 \n" | ||
206 | "bne- 1b" | ||
207 | ISYNC_ON_SMP | ||
208 | : "=&r" (old), "=&r" (t) | ||
209 | : "r" (mask), "r" (p) | ||
210 | : "cc", "memory"); | ||
211 | |||
212 | return (old & mask) != 0; | ||
213 | } | ||
214 | |||
215 | static __inline__ void set_bits(unsigned long mask, unsigned long *addr) | ||
216 | { | ||
217 | unsigned long old; | ||
218 | |||
219 | __asm__ __volatile__( | ||
220 | "1:" PPC_LLARX "%0,0,%3 # set_bits\n" | ||
221 | "or %0,%0,%2\n" | ||
222 | PPC_STLCX "%0,0,%3\n" | ||
223 | "bne- 1b" | ||
224 | : "=&r" (old), "+m" (*addr) | ||
225 | : "r" (mask), "r" (addr) | ||
226 | : "cc"); | ||
227 | } | 155 | } |
228 | 156 | ||
229 | #include <asm-generic/bitops/non-atomic.h> | 157 | #include <asm-generic/bitops/non-atomic.h> |
diff --git a/arch/powerpc/include/asm/cell-regs.h b/arch/powerpc/include/asm/cell-regs.h index fd6fd00434ef..fdf64fd25950 100644 --- a/arch/powerpc/include/asm/cell-regs.h +++ b/arch/powerpc/include/asm/cell-regs.h | |||
@@ -303,6 +303,17 @@ struct cbe_mic_tm_regs { | |||
303 | extern struct cbe_mic_tm_regs __iomem *cbe_get_mic_tm_regs(struct device_node *np); | 303 | extern struct cbe_mic_tm_regs __iomem *cbe_get_mic_tm_regs(struct device_node *np); |
304 | extern struct cbe_mic_tm_regs __iomem *cbe_get_cpu_mic_tm_regs(int cpu); | 304 | extern struct cbe_mic_tm_regs __iomem *cbe_get_cpu_mic_tm_regs(int cpu); |
305 | 305 | ||
306 | |||
307 | /* Cell page table entries */ | ||
308 | #define CBE_IOPTE_PP_W 0x8000000000000000ul /* protection: write */ | ||
309 | #define CBE_IOPTE_PP_R 0x4000000000000000ul /* protection: read */ | ||
310 | #define CBE_IOPTE_M 0x2000000000000000ul /* coherency required */ | ||
311 | #define CBE_IOPTE_SO_R 0x1000000000000000ul /* ordering: writes */ | ||
312 | #define CBE_IOPTE_SO_RW 0x1800000000000000ul /* ordering: r & w */ | ||
313 | #define CBE_IOPTE_RPN_Mask 0x07fffffffffff000ul /* RPN */ | ||
314 | #define CBE_IOPTE_H 0x0000000000000800ul /* cache hint */ | ||
315 | #define CBE_IOPTE_IOID_Mask 0x00000000000007fful /* ioid */ | ||
316 | |||
306 | /* some utility functions to deal with SMT */ | 317 | /* some utility functions to deal with SMT */ |
307 | extern u32 cbe_get_hw_thread_id(int cpu); | 318 | extern u32 cbe_get_hw_thread_id(int cpu); |
308 | extern u32 cbe_cpu_to_node(int cpu); | 319 | extern u32 cbe_cpu_to_node(int cpu); |
diff --git a/arch/powerpc/include/asm/cputhreads.h b/arch/powerpc/include/asm/cputhreads.h index fb11b0c459b8..a8e18447c62b 100644 --- a/arch/powerpc/include/asm/cputhreads.h +++ b/arch/powerpc/include/asm/cputhreads.h | |||
@@ -5,6 +5,15 @@ | |||
5 | 5 | ||
6 | /* | 6 | /* |
7 | * Mapping of threads to cores | 7 | * Mapping of threads to cores |
8 | * | ||
9 | * Note: This implementation is limited to a power of 2 number of | ||
10 | * threads per core and the same number for each core in the system | ||
11 | * (though it would work if some processors had less threads as long | ||
12 | * as the CPU numbers are still allocated, just not brought offline). | ||
13 | * | ||
14 | * However, the API allows for a different implementation in the future | ||
15 | * if needed, as long as you only use the functions and not the variables | ||
16 | * directly. | ||
8 | */ | 17 | */ |
9 | 18 | ||
10 | #ifdef CONFIG_SMP | 19 | #ifdef CONFIG_SMP |
@@ -67,5 +76,12 @@ static inline int cpu_first_thread_in_core(int cpu) | |||
67 | return cpu & ~(threads_per_core - 1); | 76 | return cpu & ~(threads_per_core - 1); |
68 | } | 77 | } |
69 | 78 | ||
79 | static inline int cpu_last_thread_in_core(int cpu) | ||
80 | { | ||
81 | return cpu | (threads_per_core - 1); | ||
82 | } | ||
83 | |||
84 | |||
85 | |||
70 | #endif /* _ASM_POWERPC_CPUTHREADS_H */ | 86 | #endif /* _ASM_POWERPC_CPUTHREADS_H */ |
71 | 87 | ||
diff --git a/arch/powerpc/include/asm/exception-64e.h b/arch/powerpc/include/asm/exception-64e.h new file mode 100644 index 000000000000..94cb3d79d125 --- /dev/null +++ b/arch/powerpc/include/asm/exception-64e.h | |||
@@ -0,0 +1,201 @@ | |||
1 | /* | ||
2 | * Definitions for use by exception code on Book3-E | ||
3 | * | ||
4 | * Copyright (C) 2008 Ben. Herrenschmidt (benh@kernel.crashing.org), IBM Corp. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | #ifndef _ASM_POWERPC_EXCEPTION_64E_H | ||
12 | #define _ASM_POWERPC_EXCEPTION_64E_H | ||
13 | |||
14 | /* | ||
15 | * SPRGs usage an other considerations... | ||
16 | * | ||
17 | * Since TLB miss and other standard exceptions can be interrupted by | ||
18 | * critical exceptions which can themselves be interrupted by machine | ||
19 | * checks, and since the two later can themselves cause a TLB miss when | ||
20 | * hitting the linear mapping for the kernel stacks, we need to be a bit | ||
21 | * creative on how we use SPRGs. | ||
22 | * | ||
23 | * The base idea is that we have one SRPG reserved for critical and one | ||
24 | * for machine check interrupts. Those are used to save a GPR that can | ||
25 | * then be used to get the PACA, and store as much context as we need | ||
26 | * to save in there. That includes saving the SPRGs used by the TLB miss | ||
27 | * handler for linear mapping misses and the associated SRR0/1 due to | ||
28 | * the above re-entrancy issue. | ||
29 | * | ||
30 | * So here's the current usage pattern. It's done regardless of which | ||
31 | * SPRGs are user-readable though, thus we might have to change some of | ||
32 | * this later. In order to do that more easily, we use special constants | ||
33 | * for naming them | ||
34 | * | ||
35 | * WARNING: Some of these SPRGs are user readable. We need to do something | ||
36 | * about it as some point by making sure they can't be used to leak kernel | ||
37 | * critical data | ||
38 | */ | ||
39 | |||
40 | |||
41 | /* We are out of SPRGs so we save some things in the PACA. The normal | ||
42 | * exception frame is smaller than the CRIT or MC one though | ||
43 | */ | ||
44 | #define EX_R1 (0 * 8) | ||
45 | #define EX_CR (1 * 8) | ||
46 | #define EX_R10 (2 * 8) | ||
47 | #define EX_R11 (3 * 8) | ||
48 | #define EX_R14 (4 * 8) | ||
49 | #define EX_R15 (5 * 8) | ||
50 | |||
51 | /* The TLB miss exception uses different slots */ | ||
52 | |||
53 | #define EX_TLB_R10 ( 0 * 8) | ||
54 | #define EX_TLB_R11 ( 1 * 8) | ||
55 | #define EX_TLB_R12 ( 2 * 8) | ||
56 | #define EX_TLB_R13 ( 3 * 8) | ||
57 | #define EX_TLB_R14 ( 4 * 8) | ||
58 | #define EX_TLB_R15 ( 5 * 8) | ||
59 | #define EX_TLB_R16 ( 6 * 8) | ||
60 | #define EX_TLB_CR ( 7 * 8) | ||
61 | #define EX_TLB_DEAR ( 8 * 8) /* Level 0 and 2 only */ | ||
62 | #define EX_TLB_ESR ( 9 * 8) /* Level 0 and 2 only */ | ||
63 | #define EX_TLB_SRR0 (10 * 8) | ||
64 | #define EX_TLB_SRR1 (11 * 8) | ||
65 | #define EX_TLB_MMUCR0 (12 * 8) /* Level 0 */ | ||
66 | #define EX_TLB_MAS1 (12 * 8) /* Level 0 */ | ||
67 | #define EX_TLB_MAS2 (13 * 8) /* Level 0 */ | ||
68 | #ifdef CONFIG_BOOK3E_MMU_TLB_STATS | ||
69 | #define EX_TLB_R8 (14 * 8) | ||
70 | #define EX_TLB_R9 (15 * 8) | ||
71 | #define EX_TLB_LR (16 * 8) | ||
72 | #define EX_TLB_SIZE (17 * 8) | ||
73 | #else | ||
74 | #define EX_TLB_SIZE (14 * 8) | ||
75 | #endif | ||
76 | |||
77 | #define START_EXCEPTION(label) \ | ||
78 | .globl exc_##label##_book3e; \ | ||
79 | exc_##label##_book3e: | ||
80 | |||
81 | /* TLB miss exception prolog | ||
82 | * | ||
83 | * This prolog handles re-entrancy (up to 3 levels supported in the PACA | ||
84 | * though we currently don't test for overflow). It provides you with a | ||
85 | * re-entrancy safe working space of r10...r16 and CR with r12 being used | ||
86 | * as the exception area pointer in the PACA for that level of re-entrancy | ||
87 | * and r13 containing the PACA pointer. | ||
88 | * | ||
89 | * SRR0 and SRR1 are saved, but DEAR and ESR are not, since they don't apply | ||
90 | * as-is for instruction exceptions. It's up to the actual exception code | ||
91 | * to save them as well if required. | ||
92 | */ | ||
93 | #define TLB_MISS_PROLOG \ | ||
94 | mtspr SPRN_SPRG_TLB_SCRATCH,r12; \ | ||
95 | mfspr r12,SPRN_SPRG_TLB_EXFRAME; \ | ||
96 | std r10,EX_TLB_R10(r12); \ | ||
97 | mfcr r10; \ | ||
98 | std r11,EX_TLB_R11(r12); \ | ||
99 | mfspr r11,SPRN_SPRG_TLB_SCRATCH; \ | ||
100 | std r13,EX_TLB_R13(r12); \ | ||
101 | mfspr r13,SPRN_SPRG_PACA; \ | ||
102 | std r14,EX_TLB_R14(r12); \ | ||
103 | addi r14,r12,EX_TLB_SIZE; \ | ||
104 | std r15,EX_TLB_R15(r12); \ | ||
105 | mfspr r15,SPRN_SRR1; \ | ||
106 | std r16,EX_TLB_R16(r12); \ | ||
107 | mfspr r16,SPRN_SRR0; \ | ||
108 | std r10,EX_TLB_CR(r12); \ | ||
109 | std r11,EX_TLB_R12(r12); \ | ||
110 | mtspr SPRN_SPRG_TLB_EXFRAME,r14; \ | ||
111 | std r15,EX_TLB_SRR1(r12); \ | ||
112 | std r16,EX_TLB_SRR0(r12); \ | ||
113 | TLB_MISS_PROLOG_STATS | ||
114 | |||
115 | /* And these are the matching epilogs that restores things | ||
116 | * | ||
117 | * There are 3 epilogs: | ||
118 | * | ||
119 | * - SUCCESS : Unwinds one level | ||
120 | * - ERROR : restore from level 0 and reset | ||
121 | * - ERROR_SPECIAL : restore from current level and reset | ||
122 | * | ||
123 | * Normal errors use ERROR, that is, they restore the initial fault context | ||
124 | * and trigger a fault. However, there is a special case for linear mapping | ||
125 | * errors. Those should basically never happen, but if they do happen, we | ||
126 | * want the error to point out the context that did that linear mapping | ||
127 | * fault, not the initial level 0 (basically, we got a bogus PGF or something | ||
128 | * like that). For userland errors on the linear mapping, there is no | ||
129 | * difference since those are always level 0 anyway | ||
130 | */ | ||
131 | |||
132 | #define TLB_MISS_RESTORE(freg) \ | ||
133 | ld r14,EX_TLB_CR(r12); \ | ||
134 | ld r10,EX_TLB_R10(r12); \ | ||
135 | ld r15,EX_TLB_SRR0(r12); \ | ||
136 | ld r16,EX_TLB_SRR1(r12); \ | ||
137 | mtspr SPRN_SPRG_TLB_EXFRAME,freg; \ | ||
138 | ld r11,EX_TLB_R11(r12); \ | ||
139 | mtcr r14; \ | ||
140 | ld r13,EX_TLB_R13(r12); \ | ||
141 | ld r14,EX_TLB_R14(r12); \ | ||
142 | mtspr SPRN_SRR0,r15; \ | ||
143 | ld r15,EX_TLB_R15(r12); \ | ||
144 | mtspr SPRN_SRR1,r16; \ | ||
145 | TLB_MISS_RESTORE_STATS \ | ||
146 | ld r16,EX_TLB_R16(r12); \ | ||
147 | ld r12,EX_TLB_R12(r12); \ | ||
148 | |||
149 | #define TLB_MISS_EPILOG_SUCCESS \ | ||
150 | TLB_MISS_RESTORE(r12) | ||
151 | |||
152 | #define TLB_MISS_EPILOG_ERROR \ | ||
153 | addi r12,r13,PACA_EXTLB; \ | ||
154 | TLB_MISS_RESTORE(r12) | ||
155 | |||
156 | #define TLB_MISS_EPILOG_ERROR_SPECIAL \ | ||
157 | addi r11,r13,PACA_EXTLB; \ | ||
158 | TLB_MISS_RESTORE(r11) | ||
159 | |||
160 | #ifdef CONFIG_BOOK3E_MMU_TLB_STATS | ||
161 | #define TLB_MISS_PROLOG_STATS \ | ||
162 | mflr r10; \ | ||
163 | std r8,EX_TLB_R8(r12); \ | ||
164 | std r9,EX_TLB_R9(r12); \ | ||
165 | std r10,EX_TLB_LR(r12); | ||
166 | #define TLB_MISS_RESTORE_STATS \ | ||
167 | ld r16,EX_TLB_LR(r12); \ | ||
168 | ld r9,EX_TLB_R9(r12); \ | ||
169 | ld r8,EX_TLB_R8(r12); \ | ||
170 | mtlr r16; | ||
171 | #define TLB_MISS_STATS_D(name) \ | ||
172 | addi r9,r13,MMSTAT_DSTATS+name; \ | ||
173 | bl .tlb_stat_inc; | ||
174 | #define TLB_MISS_STATS_I(name) \ | ||
175 | addi r9,r13,MMSTAT_ISTATS+name; \ | ||
176 | bl .tlb_stat_inc; | ||
177 | #define TLB_MISS_STATS_X(name) \ | ||
178 | ld r8,PACA_EXTLB+EX_TLB_ESR(r13); \ | ||
179 | cmpdi cr2,r8,-1; \ | ||
180 | beq cr2,61f; \ | ||
181 | addi r9,r13,MMSTAT_DSTATS+name; \ | ||
182 | b 62f; \ | ||
183 | 61: addi r9,r13,MMSTAT_ISTATS+name; \ | ||
184 | 62: bl .tlb_stat_inc; | ||
185 | #define TLB_MISS_STATS_SAVE_INFO \ | ||
186 | std r14,EX_TLB_ESR(r12); /* save ESR */ \ | ||
187 | |||
188 | |||
189 | #else | ||
190 | #define TLB_MISS_PROLOG_STATS | ||
191 | #define TLB_MISS_RESTORE_STATS | ||
192 | #define TLB_MISS_STATS_D(name) | ||
193 | #define TLB_MISS_STATS_I(name) | ||
194 | #define TLB_MISS_STATS_X(name) | ||
195 | #define TLB_MISS_STATS_Y(name) | ||
196 | #define TLB_MISS_STATS_SAVE_INFO | ||
197 | #endif | ||
198 | |||
199 | |||
200 | #endif /* _ASM_POWERPC_EXCEPTION_64E_H */ | ||
201 | |||
diff --git a/arch/powerpc/include/asm/exception.h b/arch/powerpc/include/asm/exception-64s.h index d3d4534e3c74..a98653b26231 100644 --- a/arch/powerpc/include/asm/exception.h +++ b/arch/powerpc/include/asm/exception-64s.h | |||
@@ -57,17 +57,16 @@ | |||
57 | addi reg,reg,(label)-_stext; /* virt addr of handler ... */ | 57 | addi reg,reg,(label)-_stext; /* virt addr of handler ... */ |
58 | 58 | ||
59 | #define EXCEPTION_PROLOG_1(area) \ | 59 | #define EXCEPTION_PROLOG_1(area) \ |
60 | mfspr r13,SPRN_SPRG3; /* get paca address into r13 */ \ | 60 | mfspr r13,SPRN_SPRG_PACA; /* get paca address into r13 */ \ |
61 | std r9,area+EX_R9(r13); /* save r9 - r12 */ \ | 61 | std r9,area+EX_R9(r13); /* save r9 - r12 */ \ |
62 | std r10,area+EX_R10(r13); \ | 62 | std r10,area+EX_R10(r13); \ |
63 | std r11,area+EX_R11(r13); \ | 63 | std r11,area+EX_R11(r13); \ |
64 | std r12,area+EX_R12(r13); \ | 64 | std r12,area+EX_R12(r13); \ |
65 | mfspr r9,SPRN_SPRG1; \ | 65 | mfspr r9,SPRN_SPRG_SCRATCH0; \ |
66 | std r9,area+EX_R13(r13); \ | 66 | std r9,area+EX_R13(r13); \ |
67 | mfcr r9 | 67 | mfcr r9 |
68 | 68 | ||
69 | #define EXCEPTION_PROLOG_PSERIES(area, label) \ | 69 | #define EXCEPTION_PROLOG_PSERIES_1(label) \ |
70 | EXCEPTION_PROLOG_1(area); \ | ||
71 | ld r12,PACAKBASE(r13); /* get high part of &label */ \ | 70 | ld r12,PACAKBASE(r13); /* get high part of &label */ \ |
72 | ld r10,PACAKMSR(r13); /* get MSR value for kernel */ \ | 71 | ld r10,PACAKMSR(r13); /* get MSR value for kernel */ \ |
73 | mfspr r11,SPRN_SRR0; /* save SRR0 */ \ | 72 | mfspr r11,SPRN_SRR0; /* save SRR0 */ \ |
@@ -78,6 +77,10 @@ | |||
78 | rfid; \ | 77 | rfid; \ |
79 | b . /* prevent speculative execution */ | 78 | b . /* prevent speculative execution */ |
80 | 79 | ||
80 | #define EXCEPTION_PROLOG_PSERIES(area, label) \ | ||
81 | EXCEPTION_PROLOG_1(area); \ | ||
82 | EXCEPTION_PROLOG_PSERIES_1(label); | ||
83 | |||
81 | /* | 84 | /* |
82 | * The common exception prolog is used for all except a few exceptions | 85 | * The common exception prolog is used for all except a few exceptions |
83 | * such as a segment miss on a kernel address. We have to be prepared | 86 | * such as a segment miss on a kernel address. We have to be prepared |
@@ -144,7 +147,7 @@ | |||
144 | .globl label##_pSeries; \ | 147 | .globl label##_pSeries; \ |
145 | label##_pSeries: \ | 148 | label##_pSeries: \ |
146 | HMT_MEDIUM; \ | 149 | HMT_MEDIUM; \ |
147 | mtspr SPRN_SPRG1,r13; /* save r13 */ \ | 150 | mtspr SPRN_SPRG_SCRATCH0,r13; /* save r13 */ \ |
148 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common) | 151 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common) |
149 | 152 | ||
150 | #define HSTD_EXCEPTION_PSERIES(n, label) \ | 153 | #define HSTD_EXCEPTION_PSERIES(n, label) \ |
@@ -152,13 +155,13 @@ label##_pSeries: \ | |||
152 | .globl label##_pSeries; \ | 155 | .globl label##_pSeries; \ |
153 | label##_pSeries: \ | 156 | label##_pSeries: \ |
154 | HMT_MEDIUM; \ | 157 | HMT_MEDIUM; \ |
155 | mtspr SPRN_SPRG1,r20; /* save r20 */ \ | 158 | mtspr SPRN_SPRG_SCRATCH0,r20; /* save r20 */ \ |
156 | mfspr r20,SPRN_HSRR0; /* copy HSRR0 to SRR0 */ \ | 159 | mfspr r20,SPRN_HSRR0; /* copy HSRR0 to SRR0 */ \ |
157 | mtspr SPRN_SRR0,r20; \ | 160 | mtspr SPRN_SRR0,r20; \ |
158 | mfspr r20,SPRN_HSRR1; /* copy HSRR0 to SRR0 */ \ | 161 | mfspr r20,SPRN_HSRR1; /* copy HSRR0 to SRR0 */ \ |
159 | mtspr SPRN_SRR1,r20; \ | 162 | mtspr SPRN_SRR1,r20; \ |
160 | mfspr r20,SPRN_SPRG1; /* restore r20 */ \ | 163 | mfspr r20,SPRN_SPRG_SCRATCH0; /* restore r20 */ \ |
161 | mtspr SPRN_SPRG1,r13; /* save r13 */ \ | 164 | mtspr SPRN_SPRG_SCRATCH0,r13; /* save r13 */ \ |
162 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common) | 165 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common) |
163 | 166 | ||
164 | 167 | ||
@@ -167,15 +170,15 @@ label##_pSeries: \ | |||
167 | .globl label##_pSeries; \ | 170 | .globl label##_pSeries; \ |
168 | label##_pSeries: \ | 171 | label##_pSeries: \ |
169 | HMT_MEDIUM; \ | 172 | HMT_MEDIUM; \ |
170 | mtspr SPRN_SPRG1,r13; /* save r13 */ \ | 173 | mtspr SPRN_SPRG_SCRATCH0,r13; /* save r13 */ \ |
171 | mfspr r13,SPRN_SPRG3; /* get paca address into r13 */ \ | 174 | mfspr r13,SPRN_SPRG_PACA; /* get paca address into r13 */ \ |
172 | std r9,PACA_EXGEN+EX_R9(r13); /* save r9, r10 */ \ | 175 | std r9,PACA_EXGEN+EX_R9(r13); /* save r9, r10 */ \ |
173 | std r10,PACA_EXGEN+EX_R10(r13); \ | 176 | std r10,PACA_EXGEN+EX_R10(r13); \ |
174 | lbz r10,PACASOFTIRQEN(r13); \ | 177 | lbz r10,PACASOFTIRQEN(r13); \ |
175 | mfcr r9; \ | 178 | mfcr r9; \ |
176 | cmpwi r10,0; \ | 179 | cmpwi r10,0; \ |
177 | beq masked_interrupt; \ | 180 | beq masked_interrupt; \ |
178 | mfspr r10,SPRN_SPRG1; \ | 181 | mfspr r10,SPRN_SPRG_SCRATCH0; \ |
179 | std r10,PACA_EXGEN+EX_R13(r13); \ | 182 | std r10,PACA_EXGEN+EX_R13(r13); \ |
180 | std r11,PACA_EXGEN+EX_R11(r13); \ | 183 | std r11,PACA_EXGEN+EX_R11(r13); \ |
181 | std r12,PACA_EXGEN+EX_R12(r13); \ | 184 | std r12,PACA_EXGEN+EX_R12(r13); \ |
diff --git a/arch/powerpc/include/asm/hardirq.h b/arch/powerpc/include/asm/hardirq.h index 288e14d53b7f..fb3c05a0cbbf 100644 --- a/arch/powerpc/include/asm/hardirq.h +++ b/arch/powerpc/include/asm/hardirq.h | |||
@@ -1,29 +1 @@ | |||
1 | #ifndef _ASM_POWERPC_HARDIRQ_H | #include <asm-generic/hardirq.h> | |
2 | #define _ASM_POWERPC_HARDIRQ_H | ||
3 | #ifdef __KERNEL__ | ||
4 | |||
5 | #include <asm/irq.h> | ||
6 | #include <asm/bug.h> | ||
7 | |||
8 | /* The __last_jiffy_stamp field is needed to ensure that no decrementer | ||
9 | * interrupt is lost on SMP machines. Since on most CPUs it is in the same | ||
10 | * cache line as local_irq_count, it is cheap to access and is also used on UP | ||
11 | * for uniformity. | ||
12 | */ | ||
13 | typedef struct { | ||
14 | unsigned int __softirq_pending; /* set_bit is used on this */ | ||
15 | unsigned int __last_jiffy_stamp; | ||
16 | } ____cacheline_aligned irq_cpustat_t; | ||
17 | |||
18 | #include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */ | ||
19 | |||
20 | #define last_jiffy_stamp(cpu) __IRQ_STAT((cpu), __last_jiffy_stamp) | ||
21 | |||
22 | static inline void ack_bad_irq(int irq) | ||
23 | { | ||
24 | printk(KERN_CRIT "illegal vector %d received!\n", irq); | ||
25 | BUG(); | ||
26 | } | ||
27 | |||
28 | #endif /* __KERNEL__ */ | ||
29 | #endif /* _ASM_POWERPC_HARDIRQ_H */ | ||
diff --git a/arch/powerpc/include/asm/hw_irq.h b/arch/powerpc/include/asm/hw_irq.h index 8b505eaaa38a..e73d554538dd 100644 --- a/arch/powerpc/include/asm/hw_irq.h +++ b/arch/powerpc/include/asm/hw_irq.h | |||
@@ -49,8 +49,13 @@ extern void iseries_handle_interrupts(void); | |||
49 | #define raw_irqs_disabled() (local_get_flags() == 0) | 49 | #define raw_irqs_disabled() (local_get_flags() == 0) |
50 | #define raw_irqs_disabled_flags(flags) ((flags) == 0) | 50 | #define raw_irqs_disabled_flags(flags) ((flags) == 0) |
51 | 51 | ||
52 | #ifdef CONFIG_PPC_BOOK3E | ||
53 | #define __hard_irq_enable() __asm__ __volatile__("wrteei 1": : :"memory"); | ||
54 | #define __hard_irq_disable() __asm__ __volatile__("wrteei 0": : :"memory"); | ||
55 | #else | ||
52 | #define __hard_irq_enable() __mtmsrd(mfmsr() | MSR_EE, 1) | 56 | #define __hard_irq_enable() __mtmsrd(mfmsr() | MSR_EE, 1) |
53 | #define __hard_irq_disable() __mtmsrd(mfmsr() & ~MSR_EE, 1) | 57 | #define __hard_irq_disable() __mtmsrd(mfmsr() & ~MSR_EE, 1) |
58 | #endif | ||
54 | 59 | ||
55 | #define hard_irq_disable() \ | 60 | #define hard_irq_disable() \ |
56 | do { \ | 61 | do { \ |
diff --git a/arch/powerpc/include/asm/iommu.h b/arch/powerpc/include/asm/iommu.h index 7ead7c16fb7c..7464c0daddd1 100644 --- a/arch/powerpc/include/asm/iommu.h +++ b/arch/powerpc/include/asm/iommu.h | |||
@@ -35,16 +35,6 @@ | |||
35 | #define IOMMU_PAGE_MASK (~((1 << IOMMU_PAGE_SHIFT) - 1)) | 35 | #define IOMMU_PAGE_MASK (~((1 << IOMMU_PAGE_SHIFT) - 1)) |
36 | #define IOMMU_PAGE_ALIGN(addr) _ALIGN_UP(addr, IOMMU_PAGE_SIZE) | 36 | #define IOMMU_PAGE_ALIGN(addr) _ALIGN_UP(addr, IOMMU_PAGE_SIZE) |
37 | 37 | ||
38 | /* Cell page table entries */ | ||
39 | #define CBE_IOPTE_PP_W 0x8000000000000000ul /* protection: write */ | ||
40 | #define CBE_IOPTE_PP_R 0x4000000000000000ul /* protection: read */ | ||
41 | #define CBE_IOPTE_M 0x2000000000000000ul /* coherency required */ | ||
42 | #define CBE_IOPTE_SO_R 0x1000000000000000ul /* ordering: writes */ | ||
43 | #define CBE_IOPTE_SO_RW 0x1800000000000000ul /* ordering: r & w */ | ||
44 | #define CBE_IOPTE_RPN_Mask 0x07fffffffffff000ul /* RPN */ | ||
45 | #define CBE_IOPTE_H 0x0000000000000800ul /* cache hint */ | ||
46 | #define CBE_IOPTE_IOID_Mask 0x00000000000007fful /* ioid */ | ||
47 | |||
48 | /* Boot time flags */ | 38 | /* Boot time flags */ |
49 | extern int iommu_is_off; | 39 | extern int iommu_is_off; |
50 | extern int iommu_force_on; | 40 | extern int iommu_force_on; |
diff --git a/arch/powerpc/include/asm/mmu-40x.h b/arch/powerpc/include/asm/mmu-40x.h index 776f415a36aa..34916865eaef 100644 --- a/arch/powerpc/include/asm/mmu-40x.h +++ b/arch/powerpc/include/asm/mmu-40x.h | |||
@@ -61,4 +61,7 @@ typedef struct { | |||
61 | 61 | ||
62 | #endif /* !__ASSEMBLY__ */ | 62 | #endif /* !__ASSEMBLY__ */ |
63 | 63 | ||
64 | #define mmu_virtual_psize MMU_PAGE_4K | ||
65 | #define mmu_linear_psize MMU_PAGE_256M | ||
66 | |||
64 | #endif /* _ASM_POWERPC_MMU_40X_H_ */ | 67 | #endif /* _ASM_POWERPC_MMU_40X_H_ */ |
diff --git a/arch/powerpc/include/asm/mmu-44x.h b/arch/powerpc/include/asm/mmu-44x.h index 3c86576bfefa..0372669383a8 100644 --- a/arch/powerpc/include/asm/mmu-44x.h +++ b/arch/powerpc/include/asm/mmu-44x.h | |||
@@ -79,16 +79,22 @@ typedef struct { | |||
79 | 79 | ||
80 | #if (PAGE_SHIFT == 12) | 80 | #if (PAGE_SHIFT == 12) |
81 | #define PPC44x_TLBE_SIZE PPC44x_TLB_4K | 81 | #define PPC44x_TLBE_SIZE PPC44x_TLB_4K |
82 | #define mmu_virtual_psize MMU_PAGE_4K | ||
82 | #elif (PAGE_SHIFT == 14) | 83 | #elif (PAGE_SHIFT == 14) |
83 | #define PPC44x_TLBE_SIZE PPC44x_TLB_16K | 84 | #define PPC44x_TLBE_SIZE PPC44x_TLB_16K |
85 | #define mmu_virtual_psize MMU_PAGE_16K | ||
84 | #elif (PAGE_SHIFT == 16) | 86 | #elif (PAGE_SHIFT == 16) |
85 | #define PPC44x_TLBE_SIZE PPC44x_TLB_64K | 87 | #define PPC44x_TLBE_SIZE PPC44x_TLB_64K |
88 | #define mmu_virtual_psize MMU_PAGE_64K | ||
86 | #elif (PAGE_SHIFT == 18) | 89 | #elif (PAGE_SHIFT == 18) |
87 | #define PPC44x_TLBE_SIZE PPC44x_TLB_256K | 90 | #define PPC44x_TLBE_SIZE PPC44x_TLB_256K |
91 | #define mmu_virtual_psize MMU_PAGE_256K | ||
88 | #else | 92 | #else |
89 | #error "Unsupported PAGE_SIZE" | 93 | #error "Unsupported PAGE_SIZE" |
90 | #endif | 94 | #endif |
91 | 95 | ||
96 | #define mmu_linear_psize MMU_PAGE_256M | ||
97 | |||
92 | #define PPC44x_PGD_OFF_SHIFT (32 - PGDIR_SHIFT + PGD_T_LOG2) | 98 | #define PPC44x_PGD_OFF_SHIFT (32 - PGDIR_SHIFT + PGD_T_LOG2) |
93 | #define PPC44x_PGD_OFF_MASK_BIT (PGDIR_SHIFT - PGD_T_LOG2) | 99 | #define PPC44x_PGD_OFF_MASK_BIT (PGDIR_SHIFT - PGD_T_LOG2) |
94 | #define PPC44x_PTE_ADD_SHIFT (32 - PGDIR_SHIFT + PTE_SHIFT + PTE_T_LOG2) | 100 | #define PPC44x_PTE_ADD_SHIFT (32 - PGDIR_SHIFT + PTE_SHIFT + PTE_T_LOG2) |
diff --git a/arch/powerpc/include/asm/mmu-8xx.h b/arch/powerpc/include/asm/mmu-8xx.h index 07865a357848..3d11d3ce79ec 100644 --- a/arch/powerpc/include/asm/mmu-8xx.h +++ b/arch/powerpc/include/asm/mmu-8xx.h | |||
@@ -143,4 +143,7 @@ typedef struct { | |||
143 | } mm_context_t; | 143 | } mm_context_t; |
144 | #endif /* !__ASSEMBLY__ */ | 144 | #endif /* !__ASSEMBLY__ */ |
145 | 145 | ||
146 | #define mmu_virtual_psize MMU_PAGE_4K | ||
147 | #define mmu_linear_psize MMU_PAGE_8M | ||
148 | |||
146 | #endif /* _ASM_POWERPC_MMU_8XX_H_ */ | 149 | #endif /* _ASM_POWERPC_MMU_8XX_H_ */ |
diff --git a/arch/powerpc/include/asm/mmu-book3e.h b/arch/powerpc/include/asm/mmu-book3e.h index 7e74cff81d86..d74580469361 100644 --- a/arch/powerpc/include/asm/mmu-book3e.h +++ b/arch/powerpc/include/asm/mmu-book3e.h | |||
@@ -38,58 +38,128 @@ | |||
38 | #define BOOK3E_PAGESZ_1TB 30 | 38 | #define BOOK3E_PAGESZ_1TB 30 |
39 | #define BOOK3E_PAGESZ_2TB 31 | 39 | #define BOOK3E_PAGESZ_2TB 31 |
40 | 40 | ||
41 | #define MAS0_TLBSEL(x) ((x << 28) & 0x30000000) | 41 | /* MAS registers bit definitions */ |
42 | #define MAS0_ESEL(x) ((x << 16) & 0x0FFF0000) | 42 | |
43 | #define MAS0_NV(x) ((x) & 0x00000FFF) | 43 | #define MAS0_TLBSEL(x) ((x << 28) & 0x30000000) |
44 | 44 | #define MAS0_ESEL(x) ((x << 16) & 0x0FFF0000) | |
45 | #define MAS1_VALID 0x80000000 | 45 | #define MAS0_NV(x) ((x) & 0x00000FFF) |
46 | #define MAS1_IPROT 0x40000000 | 46 | #define MAS0_HES 0x00004000 |
47 | #define MAS1_TID(x) ((x << 16) & 0x3FFF0000) | 47 | #define MAS0_WQ_ALLWAYS 0x00000000 |
48 | #define MAS1_IND 0x00002000 | 48 | #define MAS0_WQ_COND 0x00001000 |
49 | #define MAS1_TS 0x00001000 | 49 | #define MAS0_WQ_CLR_RSRV 0x00002000 |
50 | #define MAS1_TSIZE(x) ((x << 7) & 0x00000F80) | 50 | |
51 | 51 | #define MAS1_VALID 0x80000000 | |
52 | #define MAS2_EPN 0xFFFFF000 | 52 | #define MAS1_IPROT 0x40000000 |
53 | #define MAS2_X0 0x00000040 | 53 | #define MAS1_TID(x) ((x << 16) & 0x3FFF0000) |
54 | #define MAS2_X1 0x00000020 | 54 | #define MAS1_IND 0x00002000 |
55 | #define MAS2_W 0x00000010 | 55 | #define MAS1_TS 0x00001000 |
56 | #define MAS2_I 0x00000008 | 56 | #define MAS1_TSIZE_MASK 0x00000f80 |
57 | #define MAS2_M 0x00000004 | 57 | #define MAS1_TSIZE_SHIFT 7 |
58 | #define MAS2_G 0x00000002 | 58 | #define MAS1_TSIZE(x) ((x << MAS1_TSIZE_SHIFT) & MAS1_TSIZE_MASK) |
59 | #define MAS2_E 0x00000001 | 59 | |
60 | #define MAS2_EPN 0xFFFFF000 | ||
61 | #define MAS2_X0 0x00000040 | ||
62 | #define MAS2_X1 0x00000020 | ||
63 | #define MAS2_W 0x00000010 | ||
64 | #define MAS2_I 0x00000008 | ||
65 | #define MAS2_M 0x00000004 | ||
66 | #define MAS2_G 0x00000002 | ||
67 | #define MAS2_E 0x00000001 | ||
60 | #define MAS2_EPN_MASK(size) (~0 << (size + 10)) | 68 | #define MAS2_EPN_MASK(size) (~0 << (size + 10)) |
61 | #define MAS2_VAL(addr, size, flags) ((addr) & MAS2_EPN_MASK(size) | (flags)) | 69 | #define MAS2_VAL(addr, size, flags) ((addr) & MAS2_EPN_MASK(size) | (flags)) |
62 | 70 | ||
63 | #define MAS3_RPN 0xFFFFF000 | 71 | #define MAS3_RPN 0xFFFFF000 |
64 | #define MAS3_U0 0x00000200 | 72 | #define MAS3_U0 0x00000200 |
65 | #define MAS3_U1 0x00000100 | 73 | #define MAS3_U1 0x00000100 |
66 | #define MAS3_U2 0x00000080 | 74 | #define MAS3_U2 0x00000080 |
67 | #define MAS3_U3 0x00000040 | 75 | #define MAS3_U3 0x00000040 |
68 | #define MAS3_UX 0x00000020 | 76 | #define MAS3_UX 0x00000020 |
69 | #define MAS3_SX 0x00000010 | 77 | #define MAS3_SX 0x00000010 |
70 | #define MAS3_UW 0x00000008 | 78 | #define MAS3_UW 0x00000008 |
71 | #define MAS3_SW 0x00000004 | 79 | #define MAS3_SW 0x00000004 |
72 | #define MAS3_UR 0x00000002 | 80 | #define MAS3_UR 0x00000002 |
73 | #define MAS3_SR 0x00000001 | 81 | #define MAS3_SR 0x00000001 |
74 | 82 | #define MAS3_SPSIZE 0x0000003e | |
75 | #define MAS4_TLBSELD(x) MAS0_TLBSEL(x) | 83 | #define MAS3_SPSIZE_SHIFT 1 |
76 | #define MAS4_INDD 0x00008000 | 84 | |
77 | #define MAS4_TSIZED(x) MAS1_TSIZE(x) | 85 | #define MAS4_TLBSELD(x) MAS0_TLBSEL(x) |
78 | #define MAS4_X0D 0x00000040 | 86 | #define MAS4_INDD 0x00008000 /* Default IND */ |
79 | #define MAS4_X1D 0x00000020 | 87 | #define MAS4_TSIZED(x) MAS1_TSIZE(x) |
80 | #define MAS4_WD 0x00000010 | 88 | #define MAS4_X0D 0x00000040 |
81 | #define MAS4_ID 0x00000008 | 89 | #define MAS4_X1D 0x00000020 |
82 | #define MAS4_MD 0x00000004 | 90 | #define MAS4_WD 0x00000010 |
83 | #define MAS4_GD 0x00000002 | 91 | #define MAS4_ID 0x00000008 |
84 | #define MAS4_ED 0x00000001 | 92 | #define MAS4_MD 0x00000004 |
85 | 93 | #define MAS4_GD 0x00000002 | |
86 | #define MAS6_SPID0 0x3FFF0000 | 94 | #define MAS4_ED 0x00000001 |
87 | #define MAS6_SPID1 0x00007FFE | 95 | #define MAS4_WIMGED_MASK 0x0000001f /* Default WIMGE */ |
88 | #define MAS6_ISIZE(x) MAS1_TSIZE(x) | 96 | #define MAS4_WIMGED_SHIFT 0 |
89 | #define MAS6_SAS 0x00000001 | 97 | #define MAS4_VLED MAS4_X1D /* Default VLE */ |
90 | #define MAS6_SPID MAS6_SPID0 | 98 | #define MAS4_ACMD 0x000000c0 /* Default ACM */ |
91 | 99 | #define MAS4_ACMD_SHIFT 6 | |
92 | #define MAS7_RPN 0xFFFFFFFF | 100 | #define MAS4_TSIZED_MASK 0x00000f80 /* Default TSIZE */ |
101 | #define MAS4_TSIZED_SHIFT 7 | ||
102 | |||
103 | #define MAS6_SPID0 0x3FFF0000 | ||
104 | #define MAS6_SPID1 0x00007FFE | ||
105 | #define MAS6_ISIZE(x) MAS1_TSIZE(x) | ||
106 | #define MAS6_SAS 0x00000001 | ||
107 | #define MAS6_SPID MAS6_SPID0 | ||
108 | #define MAS6_SIND 0x00000002 /* Indirect page */ | ||
109 | #define MAS6_SIND_SHIFT 1 | ||
110 | #define MAS6_SPID_MASK 0x3fff0000 | ||
111 | #define MAS6_SPID_SHIFT 16 | ||
112 | #define MAS6_ISIZE_MASK 0x00000f80 | ||
113 | #define MAS6_ISIZE_SHIFT 7 | ||
114 | |||
115 | #define MAS7_RPN 0xFFFFFFFF | ||
116 | |||
117 | /* TLBnCFG encoding */ | ||
118 | #define TLBnCFG_N_ENTRY 0x00000fff /* number of entries */ | ||
119 | #define TLBnCFG_HES 0x00002000 /* HW select supported */ | ||
120 | #define TLBnCFG_IPROT 0x00008000 /* IPROT supported */ | ||
121 | #define TLBnCFG_GTWE 0x00010000 /* Guest can write */ | ||
122 | #define TLBnCFG_IND 0x00020000 /* IND entries supported */ | ||
123 | #define TLBnCFG_PT 0x00040000 /* Can load from page table */ | ||
124 | #define TLBnCFG_ASSOC 0xff000000 /* Associativity */ | ||
125 | |||
126 | /* TLBnPS encoding */ | ||
127 | #define TLBnPS_4K 0x00000004 | ||
128 | #define TLBnPS_8K 0x00000008 | ||
129 | #define TLBnPS_16K 0x00000010 | ||
130 | #define TLBnPS_32K 0x00000020 | ||
131 | #define TLBnPS_64K 0x00000040 | ||
132 | #define TLBnPS_128K 0x00000080 | ||
133 | #define TLBnPS_256K 0x00000100 | ||
134 | #define TLBnPS_512K 0x00000200 | ||
135 | #define TLBnPS_1M 0x00000400 | ||
136 | #define TLBnPS_2M 0x00000800 | ||
137 | #define TLBnPS_4M 0x00001000 | ||
138 | #define TLBnPS_8M 0x00002000 | ||
139 | #define TLBnPS_16M 0x00004000 | ||
140 | #define TLBnPS_32M 0x00008000 | ||
141 | #define TLBnPS_64M 0x00010000 | ||
142 | #define TLBnPS_128M 0x00020000 | ||
143 | #define TLBnPS_256M 0x00040000 | ||
144 | #define TLBnPS_512M 0x00080000 | ||
145 | #define TLBnPS_1G 0x00100000 | ||
146 | #define TLBnPS_2G 0x00200000 | ||
147 | #define TLBnPS_4G 0x00400000 | ||
148 | #define TLBnPS_8G 0x00800000 | ||
149 | #define TLBnPS_16G 0x01000000 | ||
150 | #define TLBnPS_32G 0x02000000 | ||
151 | #define TLBnPS_64G 0x04000000 | ||
152 | #define TLBnPS_128G 0x08000000 | ||
153 | #define TLBnPS_256G 0x10000000 | ||
154 | |||
155 | /* tlbilx action encoding */ | ||
156 | #define TLBILX_T_ALL 0 | ||
157 | #define TLBILX_T_TID 1 | ||
158 | #define TLBILX_T_FULLMATCH 3 | ||
159 | #define TLBILX_T_CLASS0 4 | ||
160 | #define TLBILX_T_CLASS1 5 | ||
161 | #define TLBILX_T_CLASS2 6 | ||
162 | #define TLBILX_T_CLASS3 7 | ||
93 | 163 | ||
94 | #ifndef __ASSEMBLY__ | 164 | #ifndef __ASSEMBLY__ |
95 | 165 | ||
@@ -100,6 +170,34 @@ typedef struct { | |||
100 | unsigned int active; | 170 | unsigned int active; |
101 | unsigned long vdso_base; | 171 | unsigned long vdso_base; |
102 | } mm_context_t; | 172 | } mm_context_t; |
173 | |||
174 | /* Page size definitions, common between 32 and 64-bit | ||
175 | * | ||
176 | * shift : is the "PAGE_SHIFT" value for that page size | ||
177 | * penc : is the pte encoding mask | ||
178 | * | ||
179 | */ | ||
180 | struct mmu_psize_def | ||
181 | { | ||
182 | unsigned int shift; /* number of bits */ | ||
183 | unsigned int enc; /* PTE encoding */ | ||
184 | }; | ||
185 | extern struct mmu_psize_def mmu_psize_defs[MMU_PAGE_COUNT]; | ||
186 | |||
187 | /* The page sizes use the same names as 64-bit hash but are | ||
188 | * constants | ||
189 | */ | ||
190 | #if defined(CONFIG_PPC_4K_PAGES) | ||
191 | #define mmu_virtual_psize MMU_PAGE_4K | ||
192 | #elif defined(CONFIG_PPC_64K_PAGES) | ||
193 | #define mmu_virtual_psize MMU_PAGE_64K | ||
194 | #else | ||
195 | #error Unsupported page size | ||
196 | #endif | ||
197 | |||
198 | extern int mmu_linear_psize; | ||
199 | extern int mmu_vmemmap_psize; | ||
200 | |||
103 | #endif /* !__ASSEMBLY__ */ | 201 | #endif /* !__ASSEMBLY__ */ |
104 | 202 | ||
105 | #endif /* _ASM_POWERPC_MMU_BOOK3E_H_ */ | 203 | #endif /* _ASM_POWERPC_MMU_BOOK3E_H_ */ |
diff --git a/arch/powerpc/include/asm/mmu-hash32.h b/arch/powerpc/include/asm/mmu-hash32.h index 16b1a1e77e64..382fc689f204 100644 --- a/arch/powerpc/include/asm/mmu-hash32.h +++ b/arch/powerpc/include/asm/mmu-hash32.h | |||
@@ -80,4 +80,10 @@ typedef struct { | |||
80 | 80 | ||
81 | #endif /* !__ASSEMBLY__ */ | 81 | #endif /* !__ASSEMBLY__ */ |
82 | 82 | ||
83 | /* We happily ignore the smaller BATs on 601, we don't actually use | ||
84 | * those definitions on hash32 at the moment anyway | ||
85 | */ | ||
86 | #define mmu_virtual_psize MMU_PAGE_4K | ||
87 | #define mmu_linear_psize MMU_PAGE_256M | ||
88 | |||
83 | #endif /* _ASM_POWERPC_MMU_HASH32_H_ */ | 89 | #endif /* _ASM_POWERPC_MMU_HASH32_H_ */ |
diff --git a/arch/powerpc/include/asm/mmu-hash64.h b/arch/powerpc/include/asm/mmu-hash64.h index 98c104a09961..b537903b9fca 100644 --- a/arch/powerpc/include/asm/mmu-hash64.h +++ b/arch/powerpc/include/asm/mmu-hash64.h | |||
@@ -139,26 +139,6 @@ struct mmu_psize_def | |||
139 | #endif /* __ASSEMBLY__ */ | 139 | #endif /* __ASSEMBLY__ */ |
140 | 140 | ||
141 | /* | 141 | /* |
142 | * The kernel use the constants below to index in the page sizes array. | ||
143 | * The use of fixed constants for this purpose is better for performances | ||
144 | * of the low level hash refill handlers. | ||
145 | * | ||
146 | * A non supported page size has a "shift" field set to 0 | ||
147 | * | ||
148 | * Any new page size being implemented can get a new entry in here. Whether | ||
149 | * the kernel will use it or not is a different matter though. The actual page | ||
150 | * size used by hugetlbfs is not defined here and may be made variable | ||
151 | */ | ||
152 | |||
153 | #define MMU_PAGE_4K 0 /* 4K */ | ||
154 | #define MMU_PAGE_64K 1 /* 64K */ | ||
155 | #define MMU_PAGE_64K_AP 2 /* 64K Admixed (in a 4K segment) */ | ||
156 | #define MMU_PAGE_1M 3 /* 1M */ | ||
157 | #define MMU_PAGE_16M 4 /* 16M */ | ||
158 | #define MMU_PAGE_16G 5 /* 16G */ | ||
159 | #define MMU_PAGE_COUNT 6 | ||
160 | |||
161 | /* | ||
162 | * Segment sizes. | 142 | * Segment sizes. |
163 | * These are the values used by hardware in the B field of | 143 | * These are the values used by hardware in the B field of |
164 | * SLB entries and the first dword of MMU hashtable entries. | 144 | * SLB entries and the first dword of MMU hashtable entries. |
diff --git a/arch/powerpc/include/asm/mmu.h b/arch/powerpc/include/asm/mmu.h index fb57ded592f9..2fcfefc60894 100644 --- a/arch/powerpc/include/asm/mmu.h +++ b/arch/powerpc/include/asm/mmu.h | |||
@@ -17,6 +17,7 @@ | |||
17 | #define MMU_FTR_TYPE_40x ASM_CONST(0x00000004) | 17 | #define MMU_FTR_TYPE_40x ASM_CONST(0x00000004) |
18 | #define MMU_FTR_TYPE_44x ASM_CONST(0x00000008) | 18 | #define MMU_FTR_TYPE_44x ASM_CONST(0x00000008) |
19 | #define MMU_FTR_TYPE_FSL_E ASM_CONST(0x00000010) | 19 | #define MMU_FTR_TYPE_FSL_E ASM_CONST(0x00000010) |
20 | #define MMU_FTR_TYPE_3E ASM_CONST(0x00000020) | ||
20 | 21 | ||
21 | /* | 22 | /* |
22 | * This is individual features | 23 | * This is individual features |
@@ -73,6 +74,41 @@ extern void early_init_mmu_secondary(void); | |||
73 | 74 | ||
74 | #endif /* !__ASSEMBLY__ */ | 75 | #endif /* !__ASSEMBLY__ */ |
75 | 76 | ||
77 | /* The kernel use the constants below to index in the page sizes array. | ||
78 | * The use of fixed constants for this purpose is better for performances | ||
79 | * of the low level hash refill handlers. | ||
80 | * | ||
81 | * A non supported page size has a "shift" field set to 0 | ||
82 | * | ||
83 | * Any new page size being implemented can get a new entry in here. Whether | ||
84 | * the kernel will use it or not is a different matter though. The actual page | ||
85 | * size used by hugetlbfs is not defined here and may be made variable | ||
86 | * | ||
87 | * Note: This array ended up being a false good idea as it's growing to the | ||
88 | * point where I wonder if we should replace it with something different, | ||
89 | * to think about, feedback welcome. --BenH. | ||
90 | */ | ||
91 | |||
92 | /* There are #define as they have to be used in assembly | ||
93 | * | ||
94 | * WARNING: If you change this list, make sure to update the array of | ||
95 | * names currently in arch/powerpc/mm/hugetlbpage.c or bad things will | ||
96 | * happen | ||
97 | */ | ||
98 | #define MMU_PAGE_4K 0 | ||
99 | #define MMU_PAGE_16K 1 | ||
100 | #define MMU_PAGE_64K 2 | ||
101 | #define MMU_PAGE_64K_AP 3 /* "Admixed pages" (hash64 only) */ | ||
102 | #define MMU_PAGE_256K 4 | ||
103 | #define MMU_PAGE_1M 5 | ||
104 | #define MMU_PAGE_8M 6 | ||
105 | #define MMU_PAGE_16M 7 | ||
106 | #define MMU_PAGE_256M 8 | ||
107 | #define MMU_PAGE_1G 9 | ||
108 | #define MMU_PAGE_16G 10 | ||
109 | #define MMU_PAGE_64G 11 | ||
110 | #define MMU_PAGE_COUNT 12 | ||
111 | |||
76 | 112 | ||
77 | #if defined(CONFIG_PPC_STD_MMU_64) | 113 | #if defined(CONFIG_PPC_STD_MMU_64) |
78 | /* 64-bit classic hash table MMU */ | 114 | /* 64-bit classic hash table MMU */ |
@@ -94,5 +130,6 @@ extern void early_init_mmu_secondary(void); | |||
94 | # include <asm/mmu-8xx.h> | 130 | # include <asm/mmu-8xx.h> |
95 | #endif | 131 | #endif |
96 | 132 | ||
133 | |||
97 | #endif /* __KERNEL__ */ | 134 | #endif /* __KERNEL__ */ |
98 | #endif /* _ASM_POWERPC_MMU_H_ */ | 135 | #endif /* _ASM_POWERPC_MMU_H_ */ |
diff --git a/arch/powerpc/include/asm/mmu_context.h b/arch/powerpc/include/asm/mmu_context.h index b7063669f972..b34e94d94435 100644 --- a/arch/powerpc/include/asm/mmu_context.h +++ b/arch/powerpc/include/asm/mmu_context.h | |||
@@ -14,7 +14,6 @@ | |||
14 | /* | 14 | /* |
15 | * Most if the context management is out of line | 15 | * Most if the context management is out of line |
16 | */ | 16 | */ |
17 | extern void mmu_context_init(void); | ||
18 | extern int init_new_context(struct task_struct *tsk, struct mm_struct *mm); | 17 | extern int init_new_context(struct task_struct *tsk, struct mm_struct *mm); |
19 | extern void destroy_context(struct mm_struct *mm); | 18 | extern void destroy_context(struct mm_struct *mm); |
20 | 19 | ||
@@ -23,6 +22,12 @@ extern void switch_stab(struct task_struct *tsk, struct mm_struct *mm); | |||
23 | extern void switch_slb(struct task_struct *tsk, struct mm_struct *mm); | 22 | extern void switch_slb(struct task_struct *tsk, struct mm_struct *mm); |
24 | extern void set_context(unsigned long id, pgd_t *pgd); | 23 | extern void set_context(unsigned long id, pgd_t *pgd); |
25 | 24 | ||
25 | #ifdef CONFIG_PPC_BOOK3S_64 | ||
26 | static inline void mmu_context_init(void) { } | ||
27 | #else | ||
28 | extern void mmu_context_init(void); | ||
29 | #endif | ||
30 | |||
26 | /* | 31 | /* |
27 | * switch_mm is the entry point called from the architecture independent | 32 | * switch_mm is the entry point called from the architecture independent |
28 | * code in kernel/sched.c | 33 | * code in kernel/sched.c |
@@ -38,6 +43,10 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, | |||
38 | tsk->thread.pgdir = next->pgd; | 43 | tsk->thread.pgdir = next->pgd; |
39 | #endif /* CONFIG_PPC32 */ | 44 | #endif /* CONFIG_PPC32 */ |
40 | 45 | ||
46 | /* 64-bit Book3E keeps track of current PGD in the PACA */ | ||
47 | #ifdef CONFIG_PPC_BOOK3E_64 | ||
48 | get_paca()->pgd = next->pgd; | ||
49 | #endif | ||
41 | /* Nothing else to do if we aren't actually switching */ | 50 | /* Nothing else to do if we aren't actually switching */ |
42 | if (prev == next) | 51 | if (prev == next) |
43 | return; | 52 | return; |
@@ -84,6 +93,10 @@ static inline void activate_mm(struct mm_struct *prev, struct mm_struct *next) | |||
84 | static inline void enter_lazy_tlb(struct mm_struct *mm, | 93 | static inline void enter_lazy_tlb(struct mm_struct *mm, |
85 | struct task_struct *tsk) | 94 | struct task_struct *tsk) |
86 | { | 95 | { |
96 | /* 64-bit Book3E keeps track of current PGD in the PACA */ | ||
97 | #ifdef CONFIG_PPC_BOOK3E_64 | ||
98 | get_paca()->pgd = NULL; | ||
99 | #endif | ||
87 | } | 100 | } |
88 | 101 | ||
89 | #endif /* __KERNEL__ */ | 102 | #endif /* __KERNEL__ */ |
diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h index c8a3cbfe02ff..b634456ea893 100644 --- a/arch/powerpc/include/asm/paca.h +++ b/arch/powerpc/include/asm/paca.h | |||
@@ -14,9 +14,11 @@ | |||
14 | #define _ASM_POWERPC_PACA_H | 14 | #define _ASM_POWERPC_PACA_H |
15 | #ifdef __KERNEL__ | 15 | #ifdef __KERNEL__ |
16 | 16 | ||
17 | #include <asm/types.h> | 17 | #include <asm/types.h> |
18 | #include <asm/lppaca.h> | 18 | #include <asm/lppaca.h> |
19 | #include <asm/mmu.h> | 19 | #include <asm/mmu.h> |
20 | #include <asm/page.h> | ||
21 | #include <asm/exception-64e.h> | ||
20 | 22 | ||
21 | register struct paca_struct *local_paca asm("r13"); | 23 | register struct paca_struct *local_paca asm("r13"); |
22 | 24 | ||
@@ -91,6 +93,21 @@ struct paca_struct { | |||
91 | u16 slb_cache[SLB_CACHE_ENTRIES]; | 93 | u16 slb_cache[SLB_CACHE_ENTRIES]; |
92 | #endif /* CONFIG_PPC_STD_MMU_64 */ | 94 | #endif /* CONFIG_PPC_STD_MMU_64 */ |
93 | 95 | ||
96 | #ifdef CONFIG_PPC_BOOK3E | ||
97 | pgd_t *pgd; /* Current PGD */ | ||
98 | pgd_t *kernel_pgd; /* Kernel PGD */ | ||
99 | u64 exgen[8] __attribute__((aligned(0x80))); | ||
100 | u64 extlb[EX_TLB_SIZE*3] __attribute__((aligned(0x80))); | ||
101 | u64 exmc[8]; /* used for machine checks */ | ||
102 | u64 excrit[8]; /* used for crit interrupts */ | ||
103 | u64 exdbg[8]; /* used for debug interrupts */ | ||
104 | |||
105 | /* Kernel stack pointers for use by special exceptions */ | ||
106 | void *mc_kstack; | ||
107 | void *crit_kstack; | ||
108 | void *dbg_kstack; | ||
109 | #endif /* CONFIG_PPC_BOOK3E */ | ||
110 | |||
94 | mm_context_t context; | 111 | mm_context_t context; |
95 | 112 | ||
96 | /* | 113 | /* |
diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h index 4940662ee87e..ff24254990e1 100644 --- a/arch/powerpc/include/asm/page.h +++ b/arch/powerpc/include/asm/page.h | |||
@@ -139,7 +139,11 @@ extern phys_addr_t kernstart_addr; | |||
139 | * Don't compare things with KERNELBASE or PAGE_OFFSET to test for | 139 | * Don't compare things with KERNELBASE or PAGE_OFFSET to test for |
140 | * "kernelness", use is_kernel_addr() - it should do what you want. | 140 | * "kernelness", use is_kernel_addr() - it should do what you want. |
141 | */ | 141 | */ |
142 | #ifdef CONFIG_PPC_BOOK3E_64 | ||
143 | #define is_kernel_addr(x) ((x) >= 0x8000000000000000ul) | ||
144 | #else | ||
142 | #define is_kernel_addr(x) ((x) >= PAGE_OFFSET) | 145 | #define is_kernel_addr(x) ((x) >= PAGE_OFFSET) |
146 | #endif | ||
143 | 147 | ||
144 | #ifndef __ASSEMBLY__ | 148 | #ifndef __ASSEMBLY__ |
145 | 149 | ||
diff --git a/arch/powerpc/include/asm/page_64.h b/arch/powerpc/include/asm/page_64.h index 5817a3b747e5..3f17b83f55a1 100644 --- a/arch/powerpc/include/asm/page_64.h +++ b/arch/powerpc/include/asm/page_64.h | |||
@@ -135,12 +135,22 @@ extern void slice_set_range_psize(struct mm_struct *mm, unsigned long start, | |||
135 | #endif /* __ASSEMBLY__ */ | 135 | #endif /* __ASSEMBLY__ */ |
136 | #else | 136 | #else |
137 | #define slice_init() | 137 | #define slice_init() |
138 | #ifdef CONFIG_PPC_STD_MMU_64 | ||
138 | #define get_slice_psize(mm, addr) ((mm)->context.user_psize) | 139 | #define get_slice_psize(mm, addr) ((mm)->context.user_psize) |
139 | #define slice_set_user_psize(mm, psize) \ | 140 | #define slice_set_user_psize(mm, psize) \ |
140 | do { \ | 141 | do { \ |
141 | (mm)->context.user_psize = (psize); \ | 142 | (mm)->context.user_psize = (psize); \ |
142 | (mm)->context.sllp = SLB_VSID_USER | mmu_psize_defs[(psize)].sllp; \ | 143 | (mm)->context.sllp = SLB_VSID_USER | mmu_psize_defs[(psize)].sllp; \ |
143 | } while (0) | 144 | } while (0) |
145 | #else /* CONFIG_PPC_STD_MMU_64 */ | ||
146 | #ifdef CONFIG_PPC_64K_PAGES | ||
147 | #define get_slice_psize(mm, addr) MMU_PAGE_64K | ||
148 | #else /* CONFIG_PPC_64K_PAGES */ | ||
149 | #define get_slice_psize(mm, addr) MMU_PAGE_4K | ||
150 | #endif /* !CONFIG_PPC_64K_PAGES */ | ||
151 | #define slice_set_user_psize(mm, psize) do { BUG(); } while(0) | ||
152 | #endif /* !CONFIG_PPC_STD_MMU_64 */ | ||
153 | |||
144 | #define slice_set_range_psize(mm, start, len, psize) \ | 154 | #define slice_set_range_psize(mm, start, len, psize) \ |
145 | slice_set_user_psize((mm), (psize)) | 155 | slice_set_user_psize((mm), (psize)) |
146 | #define slice_mm_new_context(mm) 1 | 156 | #define slice_mm_new_context(mm) 1 |
diff --git a/arch/powerpc/include/asm/pgalloc.h b/arch/powerpc/include/asm/pgalloc.h index 1730e5e298d6..f2e812de7c3c 100644 --- a/arch/powerpc/include/asm/pgalloc.h +++ b/arch/powerpc/include/asm/pgalloc.h | |||
@@ -4,6 +4,15 @@ | |||
4 | 4 | ||
5 | #include <linux/mm.h> | 5 | #include <linux/mm.h> |
6 | 6 | ||
7 | #ifdef CONFIG_PPC_BOOK3E | ||
8 | extern void tlb_flush_pgtable(struct mmu_gather *tlb, unsigned long address); | ||
9 | #else /* CONFIG_PPC_BOOK3E */ | ||
10 | static inline void tlb_flush_pgtable(struct mmu_gather *tlb, | ||
11 | unsigned long address) | ||
12 | { | ||
13 | } | ||
14 | #endif /* !CONFIG_PPC_BOOK3E */ | ||
15 | |||
7 | static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) | 16 | static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) |
8 | { | 17 | { |
9 | free_page((unsigned long)pte); | 18 | free_page((unsigned long)pte); |
@@ -19,7 +28,12 @@ typedef struct pgtable_free { | |||
19 | unsigned long val; | 28 | unsigned long val; |
20 | } pgtable_free_t; | 29 | } pgtable_free_t; |
21 | 30 | ||
22 | #define PGF_CACHENUM_MASK 0x7 | 31 | /* This needs to be big enough to allow for MMU_PAGE_COUNT + 2 to be stored |
32 | * and small enough to fit in the low bits of any naturally aligned page | ||
33 | * table cache entry. Arbitrarily set to 0x1f, that should give us some | ||
34 | * room to grow | ||
35 | */ | ||
36 | #define PGF_CACHENUM_MASK 0x1f | ||
23 | 37 | ||
24 | static inline pgtable_free_t pgtable_free_cache(void *p, int cachenum, | 38 | static inline pgtable_free_t pgtable_free_cache(void *p, int cachenum, |
25 | unsigned long mask) | 39 | unsigned long mask) |
@@ -35,19 +49,27 @@ static inline pgtable_free_t pgtable_free_cache(void *p, int cachenum, | |||
35 | #include <asm/pgalloc-32.h> | 49 | #include <asm/pgalloc-32.h> |
36 | #endif | 50 | #endif |
37 | 51 | ||
38 | extern void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf); | ||
39 | |||
40 | #ifdef CONFIG_SMP | 52 | #ifdef CONFIG_SMP |
41 | #define __pte_free_tlb(tlb,ptepage,address) \ | 53 | extern void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf); |
42 | do { \ | 54 | extern void pte_free_finish(void); |
43 | pgtable_page_dtor(ptepage); \ | 55 | #else /* CONFIG_SMP */ |
44 | pgtable_free_tlb(tlb, pgtable_free_cache(page_address(ptepage), \ | 56 | static inline void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf) |
45 | PTE_NONCACHE_NUM, PTE_TABLE_SIZE-1)); \ | 57 | { |
46 | } while (0) | 58 | pgtable_free(pgf); |
47 | #else | 59 | } |
48 | #define __pte_free_tlb(tlb, pte, address) pte_free((tlb)->mm, (pte)) | 60 | static inline void pte_free_finish(void) { } |
49 | #endif | 61 | #endif /* !CONFIG_SMP */ |
50 | 62 | ||
63 | static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *ptepage, | ||
64 | unsigned long address) | ||
65 | { | ||
66 | pgtable_free_t pgf = pgtable_free_cache(page_address(ptepage), | ||
67 | PTE_NONCACHE_NUM, | ||
68 | PTE_TABLE_SIZE-1); | ||
69 | tlb_flush_pgtable(tlb, address); | ||
70 | pgtable_page_dtor(ptepage); | ||
71 | pgtable_free_tlb(tlb, pgf); | ||
72 | } | ||
51 | 73 | ||
52 | #endif /* __KERNEL__ */ | 74 | #endif /* __KERNEL__ */ |
53 | #endif /* _ASM_POWERPC_PGALLOC_H */ | 75 | #endif /* _ASM_POWERPC_PGALLOC_H */ |
diff --git a/arch/powerpc/include/asm/pgtable-ppc64-64k.h b/arch/powerpc/include/asm/pgtable-ppc64-64k.h index 6cc085b945a5..90533ddcd703 100644 --- a/arch/powerpc/include/asm/pgtable-ppc64-64k.h +++ b/arch/powerpc/include/asm/pgtable-ppc64-64k.h | |||
@@ -10,10 +10,10 @@ | |||
10 | #define PGD_INDEX_SIZE 4 | 10 | #define PGD_INDEX_SIZE 4 |
11 | 11 | ||
12 | #ifndef __ASSEMBLY__ | 12 | #ifndef __ASSEMBLY__ |
13 | |||
14 | #define PTE_TABLE_SIZE (sizeof(real_pte_t) << PTE_INDEX_SIZE) | 13 | #define PTE_TABLE_SIZE (sizeof(real_pte_t) << PTE_INDEX_SIZE) |
15 | #define PMD_TABLE_SIZE (sizeof(pmd_t) << PMD_INDEX_SIZE) | 14 | #define PMD_TABLE_SIZE (sizeof(pmd_t) << PMD_INDEX_SIZE) |
16 | #define PGD_TABLE_SIZE (sizeof(pgd_t) << PGD_INDEX_SIZE) | 15 | #define PGD_TABLE_SIZE (sizeof(pgd_t) << PGD_INDEX_SIZE) |
16 | #endif /* __ASSEMBLY__ */ | ||
17 | 17 | ||
18 | #define PTRS_PER_PTE (1 << PTE_INDEX_SIZE) | 18 | #define PTRS_PER_PTE (1 << PTE_INDEX_SIZE) |
19 | #define PTRS_PER_PMD (1 << PMD_INDEX_SIZE) | 19 | #define PTRS_PER_PMD (1 << PMD_INDEX_SIZE) |
@@ -32,8 +32,6 @@ | |||
32 | #define PGDIR_SIZE (1UL << PGDIR_SHIFT) | 32 | #define PGDIR_SIZE (1UL << PGDIR_SHIFT) |
33 | #define PGDIR_MASK (~(PGDIR_SIZE-1)) | 33 | #define PGDIR_MASK (~(PGDIR_SIZE-1)) |
34 | 34 | ||
35 | #endif /* __ASSEMBLY__ */ | ||
36 | |||
37 | /* Bits to mask out from a PMD to get to the PTE page */ | 35 | /* Bits to mask out from a PMD to get to the PTE page */ |
38 | #define PMD_MASKED_BITS 0x1ff | 36 | #define PMD_MASKED_BITS 0x1ff |
39 | /* Bits to mask out from a PGD/PUD to get to the PMD page */ | 37 | /* Bits to mask out from a PGD/PUD to get to the PMD page */ |
diff --git a/arch/powerpc/include/asm/pgtable-ppc64.h b/arch/powerpc/include/asm/pgtable-ppc64.h index 8cd083c61503..200ec2dfa034 100644 --- a/arch/powerpc/include/asm/pgtable-ppc64.h +++ b/arch/powerpc/include/asm/pgtable-ppc64.h | |||
@@ -5,11 +5,6 @@ | |||
5 | * the ppc64 hashed page table. | 5 | * the ppc64 hashed page table. |
6 | */ | 6 | */ |
7 | 7 | ||
8 | #ifndef __ASSEMBLY__ | ||
9 | #include <linux/stddef.h> | ||
10 | #include <asm/tlbflush.h> | ||
11 | #endif /* __ASSEMBLY__ */ | ||
12 | |||
13 | #ifdef CONFIG_PPC_64K_PAGES | 8 | #ifdef CONFIG_PPC_64K_PAGES |
14 | #include <asm/pgtable-ppc64-64k.h> | 9 | #include <asm/pgtable-ppc64-64k.h> |
15 | #else | 10 | #else |
@@ -38,26 +33,47 @@ | |||
38 | #endif | 33 | #endif |
39 | 34 | ||
40 | /* | 35 | /* |
41 | * Define the address range of the vmalloc VM area. | 36 | * Define the address range of the kernel non-linear virtual area |
37 | */ | ||
38 | |||
39 | #ifdef CONFIG_PPC_BOOK3E | ||
40 | #define KERN_VIRT_START ASM_CONST(0x8000000000000000) | ||
41 | #else | ||
42 | #define KERN_VIRT_START ASM_CONST(0xD000000000000000) | ||
43 | #endif | ||
44 | #define KERN_VIRT_SIZE PGTABLE_RANGE | ||
45 | |||
46 | /* | ||
47 | * The vmalloc space starts at the beginning of that region, and | ||
48 | * occupies half of it on hash CPUs and a quarter of it on Book3E | ||
49 | * (we keep a quarter for the virtual memmap) | ||
42 | */ | 50 | */ |
43 | #define VMALLOC_START ASM_CONST(0xD000000000000000) | 51 | #define VMALLOC_START KERN_VIRT_START |
44 | #define VMALLOC_SIZE (PGTABLE_RANGE >> 1) | 52 | #ifdef CONFIG_PPC_BOOK3E |
45 | #define VMALLOC_END (VMALLOC_START + VMALLOC_SIZE) | 53 | #define VMALLOC_SIZE (KERN_VIRT_SIZE >> 2) |
54 | #else | ||
55 | #define VMALLOC_SIZE (KERN_VIRT_SIZE >> 1) | ||
56 | #endif | ||
57 | #define VMALLOC_END (VMALLOC_START + VMALLOC_SIZE) | ||
46 | 58 | ||
47 | /* | 59 | /* |
48 | * Define the address ranges for MMIO and IO space : | 60 | * The second half of the kernel virtual space is used for IO mappings, |
61 | * it's itself carved into the PIO region (ISA and PHB IO space) and | ||
62 | * the ioremap space | ||
49 | * | 63 | * |
50 | * ISA_IO_BASE = VMALLOC_END, 64K reserved area | 64 | * ISA_IO_BASE = KERN_IO_START, 64K reserved area |
51 | * PHB_IO_BASE = ISA_IO_BASE + 64K to ISA_IO_BASE + 2G, PHB IO spaces | 65 | * PHB_IO_BASE = ISA_IO_BASE + 64K to ISA_IO_BASE + 2G, PHB IO spaces |
52 | * IOREMAP_BASE = ISA_IO_BASE + 2G to VMALLOC_START + PGTABLE_RANGE | 66 | * IOREMAP_BASE = ISA_IO_BASE + 2G to VMALLOC_START + PGTABLE_RANGE |
53 | */ | 67 | */ |
68 | #define KERN_IO_START (KERN_VIRT_START + (KERN_VIRT_SIZE >> 1)) | ||
54 | #define FULL_IO_SIZE 0x80000000ul | 69 | #define FULL_IO_SIZE 0x80000000ul |
55 | #define ISA_IO_BASE (VMALLOC_END) | 70 | #define ISA_IO_BASE (KERN_IO_START) |
56 | #define ISA_IO_END (VMALLOC_END + 0x10000ul) | 71 | #define ISA_IO_END (KERN_IO_START + 0x10000ul) |
57 | #define PHB_IO_BASE (ISA_IO_END) | 72 | #define PHB_IO_BASE (ISA_IO_END) |
58 | #define PHB_IO_END (VMALLOC_END + FULL_IO_SIZE) | 73 | #define PHB_IO_END (KERN_IO_START + FULL_IO_SIZE) |
59 | #define IOREMAP_BASE (PHB_IO_END) | 74 | #define IOREMAP_BASE (PHB_IO_END) |
60 | #define IOREMAP_END (VMALLOC_START + PGTABLE_RANGE) | 75 | #define IOREMAP_END (KERN_VIRT_START + KERN_VIRT_SIZE) |
76 | |||
61 | 77 | ||
62 | /* | 78 | /* |
63 | * Region IDs | 79 | * Region IDs |
@@ -68,23 +84,32 @@ | |||
68 | 84 | ||
69 | #define VMALLOC_REGION_ID (REGION_ID(VMALLOC_START)) | 85 | #define VMALLOC_REGION_ID (REGION_ID(VMALLOC_START)) |
70 | #define KERNEL_REGION_ID (REGION_ID(PAGE_OFFSET)) | 86 | #define KERNEL_REGION_ID (REGION_ID(PAGE_OFFSET)) |
71 | #define VMEMMAP_REGION_ID (0xfUL) | 87 | #define VMEMMAP_REGION_ID (0xfUL) /* Server only */ |
72 | #define USER_REGION_ID (0UL) | 88 | #define USER_REGION_ID (0UL) |
73 | 89 | ||
74 | /* | 90 | /* |
75 | * Defines the address of the vmemap area, in its own region | 91 | * Defines the address of the vmemap area, in its own region on |
92 | * hash table CPUs and after the vmalloc space on Book3E | ||
76 | */ | 93 | */ |
94 | #ifdef CONFIG_PPC_BOOK3E | ||
95 | #define VMEMMAP_BASE VMALLOC_END | ||
96 | #define VMEMMAP_END KERN_IO_START | ||
97 | #else | ||
77 | #define VMEMMAP_BASE (VMEMMAP_REGION_ID << REGION_SHIFT) | 98 | #define VMEMMAP_BASE (VMEMMAP_REGION_ID << REGION_SHIFT) |
99 | #endif | ||
78 | #define vmemmap ((struct page *)VMEMMAP_BASE) | 100 | #define vmemmap ((struct page *)VMEMMAP_BASE) |
79 | 101 | ||
80 | 102 | ||
81 | /* | 103 | /* |
82 | * Include the PTE bits definitions | 104 | * Include the PTE bits definitions |
83 | */ | 105 | */ |
106 | #ifdef CONFIG_PPC_BOOK3S | ||
84 | #include <asm/pte-hash64.h> | 107 | #include <asm/pte-hash64.h> |
108 | #else | ||
109 | #include <asm/pte-book3e.h> | ||
110 | #endif | ||
85 | #include <asm/pte-common.h> | 111 | #include <asm/pte-common.h> |
86 | 112 | ||
87 | |||
88 | #ifdef CONFIG_PPC_MM_SLICES | 113 | #ifdef CONFIG_PPC_MM_SLICES |
89 | #define HAVE_ARCH_UNMAPPED_AREA | 114 | #define HAVE_ARCH_UNMAPPED_AREA |
90 | #define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN | 115 | #define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN |
@@ -92,6 +117,9 @@ | |||
92 | 117 | ||
93 | #ifndef __ASSEMBLY__ | 118 | #ifndef __ASSEMBLY__ |
94 | 119 | ||
120 | #include <linux/stddef.h> | ||
121 | #include <asm/tlbflush.h> | ||
122 | |||
95 | /* | 123 | /* |
96 | * This is the default implementation of various PTE accessors, it's | 124 | * This is the default implementation of various PTE accessors, it's |
97 | * used in all cases except Book3S with 64K pages where we have a | 125 | * used in all cases except Book3S with 64K pages where we have a |
diff --git a/arch/powerpc/include/asm/ppc-opcode.h b/arch/powerpc/include/asm/ppc-opcode.h index b74f16d45cb4..ef9aa84cac5a 100644 --- a/arch/powerpc/include/asm/ppc-opcode.h +++ b/arch/powerpc/include/asm/ppc-opcode.h | |||
@@ -48,6 +48,8 @@ | |||
48 | #define PPC_INST_TLBIE 0x7c000264 | 48 | #define PPC_INST_TLBIE 0x7c000264 |
49 | #define PPC_INST_TLBILX 0x7c000024 | 49 | #define PPC_INST_TLBILX 0x7c000024 |
50 | #define PPC_INST_WAIT 0x7c00007c | 50 | #define PPC_INST_WAIT 0x7c00007c |
51 | #define PPC_INST_TLBIVAX 0x7c000624 | ||
52 | #define PPC_INST_TLBSRX_DOT 0x7c0006a5 | ||
51 | 53 | ||
52 | /* macros to insert fields into opcodes */ | 54 | /* macros to insert fields into opcodes */ |
53 | #define __PPC_RA(a) (((a) & 0x1f) << 16) | 55 | #define __PPC_RA(a) (((a) & 0x1f) << 16) |
@@ -76,6 +78,10 @@ | |||
76 | __PPC_WC(w)) | 78 | __PPC_WC(w)) |
77 | #define PPC_TLBIE(lp,a) stringify_in_c(.long PPC_INST_TLBIE | \ | 79 | #define PPC_TLBIE(lp,a) stringify_in_c(.long PPC_INST_TLBIE | \ |
78 | __PPC_RB(a) | __PPC_RS(lp)) | 80 | __PPC_RB(a) | __PPC_RS(lp)) |
81 | #define PPC_TLBSRX_DOT(a,b) stringify_in_c(.long PPC_INST_TLBSRX_DOT | \ | ||
82 | __PPC_RA(a) | __PPC_RB(b)) | ||
83 | #define PPC_TLBIVAX(a,b) stringify_in_c(.long PPC_INST_TLBIVAX | \ | ||
84 | __PPC_RA(a) | __PPC_RB(b)) | ||
79 | 85 | ||
80 | /* | 86 | /* |
81 | * Define what the VSX XX1 form instructions will look like, then add | 87 | * Define what the VSX XX1 form instructions will look like, then add |
diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h index f9729529c20d..dfae6e916dfb 100644 --- a/arch/powerpc/include/asm/ppc_asm.h +++ b/arch/powerpc/include/asm/ppc_asm.h | |||
@@ -375,8 +375,15 @@ END_FTR_SECTION_IFCLR(CPU_FTR_601) | |||
375 | #define PPC440EP_ERR42 | 375 | #define PPC440EP_ERR42 |
376 | #endif | 376 | #endif |
377 | 377 | ||
378 | 378 | /* | |
379 | #if defined(CONFIG_BOOKE) | 379 | * toreal/fromreal/tophys/tovirt macros. 32-bit BookE makes them |
380 | * keep the address intact to be compatible with code shared with | ||
381 | * 32-bit classic. | ||
382 | * | ||
383 | * On the other hand, I find it useful to have them behave as expected | ||
384 | * by their name (ie always do the addition) on 64-bit BookE | ||
385 | */ | ||
386 | #if defined(CONFIG_BOOKE) && !defined(CONFIG_PPC64) | ||
380 | #define toreal(rd) | 387 | #define toreal(rd) |
381 | #define fromreal(rd) | 388 | #define fromreal(rd) |
382 | 389 | ||
@@ -426,10 +433,9 @@ END_FTR_SECTION_IFCLR(CPU_FTR_601) | |||
426 | .previous | 433 | .previous |
427 | #endif | 434 | #endif |
428 | 435 | ||
429 | #ifdef CONFIG_PPC64 | 436 | #ifdef CONFIG_PPC_BOOK3S_64 |
430 | #define RFI rfid | 437 | #define RFI rfid |
431 | #define MTMSRD(r) mtmsrd r | 438 | #define MTMSRD(r) mtmsrd r |
432 | |||
433 | #else | 439 | #else |
434 | #define FIX_SRR1(ra, rb) | 440 | #define FIX_SRR1(ra, rb) |
435 | #ifndef CONFIG_40x | 441 | #ifndef CONFIG_40x |
diff --git a/arch/powerpc/include/asm/pte-book3e.h b/arch/powerpc/include/asm/pte-book3e.h new file mode 100644 index 000000000000..1d27c77d7704 --- /dev/null +++ b/arch/powerpc/include/asm/pte-book3e.h | |||
@@ -0,0 +1,70 @@ | |||
1 | #ifndef _ASM_POWERPC_PTE_BOOK3E_H | ||
2 | #define _ASM_POWERPC_PTE_BOOK3E_H | ||
3 | #ifdef __KERNEL__ | ||
4 | |||
5 | /* PTE bit definitions for processors compliant to the Book3E | ||
6 | * architecture 2.06 or later. The position of the PTE bits | ||
7 | * matches the HW definition of the optional Embedded Page Table | ||
8 | * category. | ||
9 | */ | ||
10 | |||
11 | /* Architected bits */ | ||
12 | #define _PAGE_PRESENT 0x000001 /* software: pte contains a translation */ | ||
13 | #define _PAGE_FILE 0x000002 /* (!present only) software: pte holds file offset */ | ||
14 | #define _PAGE_SW1 0x000002 | ||
15 | #define _PAGE_BAP_SR 0x000004 | ||
16 | #define _PAGE_BAP_UR 0x000008 | ||
17 | #define _PAGE_BAP_SW 0x000010 | ||
18 | #define _PAGE_BAP_UW 0x000020 | ||
19 | #define _PAGE_BAP_SX 0x000040 | ||
20 | #define _PAGE_BAP_UX 0x000080 | ||
21 | #define _PAGE_PSIZE_MSK 0x000f00 | ||
22 | #define _PAGE_PSIZE_4K 0x000200 | ||
23 | #define _PAGE_PSIZE_64K 0x000600 | ||
24 | #define _PAGE_PSIZE_1M 0x000a00 | ||
25 | #define _PAGE_PSIZE_16M 0x000e00 | ||
26 | #define _PAGE_DIRTY 0x001000 /* C: page changed */ | ||
27 | #define _PAGE_SW0 0x002000 | ||
28 | #define _PAGE_U3 0x004000 | ||
29 | #define _PAGE_U2 0x008000 | ||
30 | #define _PAGE_U1 0x010000 | ||
31 | #define _PAGE_U0 0x020000 | ||
32 | #define _PAGE_ACCESSED 0x040000 | ||
33 | #define _PAGE_LENDIAN 0x080000 | ||
34 | #define _PAGE_GUARDED 0x100000 | ||
35 | #define _PAGE_COHERENT 0x200000 /* M: enforce memory coherence */ | ||
36 | #define _PAGE_NO_CACHE 0x400000 /* I: cache inhibit */ | ||
37 | #define _PAGE_WRITETHRU 0x800000 /* W: cache write-through */ | ||
38 | |||
39 | /* "Higher level" linux bit combinations */ | ||
40 | #define _PAGE_EXEC _PAGE_BAP_SX /* Can be executed from potentially */ | ||
41 | #define _PAGE_HWEXEC _PAGE_BAP_UX /* .. and was cache cleaned */ | ||
42 | #define _PAGE_RW (_PAGE_BAP_SW | _PAGE_BAP_UW) /* User write permission */ | ||
43 | #define _PAGE_KERNEL_RW (_PAGE_BAP_SW | _PAGE_BAP_SR | _PAGE_DIRTY) | ||
44 | #define _PAGE_KERNEL_RO (_PAGE_BAP_SR) | ||
45 | #define _PAGE_USER (_PAGE_BAP_UR | _PAGE_BAP_SR) /* Can be read */ | ||
46 | |||
47 | #define _PAGE_HASHPTE 0 | ||
48 | #define _PAGE_BUSY 0 | ||
49 | |||
50 | #define _PAGE_SPECIAL _PAGE_SW0 | ||
51 | |||
52 | /* Flags to be preserved on PTE modifications */ | ||
53 | #define _PAGE_HPTEFLAGS _PAGE_BUSY | ||
54 | |||
55 | /* Base page size */ | ||
56 | #ifdef CONFIG_PPC_64K_PAGES | ||
57 | #define _PAGE_PSIZE _PAGE_PSIZE_64K | ||
58 | #define PTE_RPN_SHIFT (28) | ||
59 | #else | ||
60 | #define _PAGE_PSIZE _PAGE_PSIZE_4K | ||
61 | #define PTE_RPN_SHIFT (24) | ||
62 | #endif | ||
63 | |||
64 | /* On 32-bit, we never clear the top part of the PTE */ | ||
65 | #ifdef CONFIG_PPC32 | ||
66 | #define _PTE_NONE_MASK 0xffffffff00000000ULL | ||
67 | #endif | ||
68 | |||
69 | #endif /* __KERNEL__ */ | ||
70 | #endif /* _ASM_POWERPC_PTE_FSL_BOOKE_H */ | ||
diff --git a/arch/powerpc/include/asm/pte-common.h b/arch/powerpc/include/asm/pte-common.h index a7e210b6b48c..8bb6464ba619 100644 --- a/arch/powerpc/include/asm/pte-common.h +++ b/arch/powerpc/include/asm/pte-common.h | |||
@@ -34,6 +34,9 @@ | |||
34 | #ifndef _PAGE_4K_PFN | 34 | #ifndef _PAGE_4K_PFN |
35 | #define _PAGE_4K_PFN 0 | 35 | #define _PAGE_4K_PFN 0 |
36 | #endif | 36 | #endif |
37 | #ifndef _PAGE_SAO | ||
38 | #define _PAGE_SAO 0 | ||
39 | #endif | ||
37 | #ifndef _PAGE_PSIZE | 40 | #ifndef _PAGE_PSIZE |
38 | #define _PAGE_PSIZE 0 | 41 | #define _PAGE_PSIZE 0 |
39 | #endif | 42 | #endif |
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h index 1170267736d3..6315edc205d8 100644 --- a/arch/powerpc/include/asm/reg.h +++ b/arch/powerpc/include/asm/reg.h | |||
@@ -98,19 +98,15 @@ | |||
98 | #define MSR_RI __MASK(MSR_RI_LG) /* Recoverable Exception */ | 98 | #define MSR_RI __MASK(MSR_RI_LG) /* Recoverable Exception */ |
99 | #define MSR_LE __MASK(MSR_LE_LG) /* Little Endian */ | 99 | #define MSR_LE __MASK(MSR_LE_LG) /* Little Endian */ |
100 | 100 | ||
101 | #ifdef CONFIG_PPC64 | 101 | #if defined(CONFIG_PPC_BOOK3S_64) |
102 | /* Server variant */ | ||
102 | #define MSR_ MSR_ME | MSR_RI | MSR_IR | MSR_DR | MSR_ISF |MSR_HV | 103 | #define MSR_ MSR_ME | MSR_RI | MSR_IR | MSR_DR | MSR_ISF |MSR_HV |
103 | #define MSR_KERNEL MSR_ | MSR_SF | 104 | #define MSR_KERNEL MSR_ | MSR_SF |
104 | |||
105 | #define MSR_USER32 MSR_ | MSR_PR | MSR_EE | 105 | #define MSR_USER32 MSR_ | MSR_PR | MSR_EE |
106 | #define MSR_USER64 MSR_USER32 | MSR_SF | 106 | #define MSR_USER64 MSR_USER32 | MSR_SF |
107 | 107 | #elif defined(CONFIG_PPC_BOOK3S_32) || defined(CONFIG_8xx) | |
108 | #else /* 32-bit */ | ||
109 | /* Default MSR for kernel mode. */ | 108 | /* Default MSR for kernel mode. */ |
110 | #ifndef MSR_KERNEL /* reg_booke.h also defines this */ | ||
111 | #define MSR_KERNEL (MSR_ME|MSR_RI|MSR_IR|MSR_DR) | 109 | #define MSR_KERNEL (MSR_ME|MSR_RI|MSR_IR|MSR_DR) |
112 | #endif | ||
113 | |||
114 | #define MSR_USER (MSR_KERNEL|MSR_PR|MSR_EE) | 110 | #define MSR_USER (MSR_KERNEL|MSR_PR|MSR_EE) |
115 | #endif | 111 | #endif |
116 | 112 | ||
@@ -646,6 +642,137 @@ | |||
646 | #endif | 642 | #endif |
647 | 643 | ||
648 | /* | 644 | /* |
645 | * SPRG usage: | ||
646 | * | ||
647 | * All 64-bit: | ||
648 | * - SPRG1 stores PACA pointer | ||
649 | * | ||
650 | * 64-bit server: | ||
651 | * - SPRG0 unused (reserved for HV on Power4) | ||
652 | * - SPRG2 scratch for exception vectors | ||
653 | * - SPRG3 unused (user visible) | ||
654 | * | ||
655 | * 64-bit embedded | ||
656 | * - SPRG0 generic exception scratch | ||
657 | * - SPRG2 TLB exception stack | ||
658 | * - SPRG3 unused (user visible) | ||
659 | * - SPRG4 unused (user visible) | ||
660 | * - SPRG6 TLB miss scratch (user visible, sorry !) | ||
661 | * - SPRG7 critical exception scratch | ||
662 | * - SPRG8 machine check exception scratch | ||
663 | * - SPRG9 debug exception scratch | ||
664 | * | ||
665 | * All 32-bit: | ||
666 | * - SPRG3 current thread_info pointer | ||
667 | * (virtual on BookE, physical on others) | ||
668 | * | ||
669 | * 32-bit classic: | ||
670 | * - SPRG0 scratch for exception vectors | ||
671 | * - SPRG1 scratch for exception vectors | ||
672 | * - SPRG2 indicator that we are in RTAS | ||
673 | * - SPRG4 (603 only) pseudo TLB LRU data | ||
674 | * | ||
675 | * 32-bit 40x: | ||
676 | * - SPRG0 scratch for exception vectors | ||
677 | * - SPRG1 scratch for exception vectors | ||
678 | * - SPRG2 scratch for exception vectors | ||
679 | * - SPRG4 scratch for exception vectors (not 403) | ||
680 | * - SPRG5 scratch for exception vectors (not 403) | ||
681 | * - SPRG6 scratch for exception vectors (not 403) | ||
682 | * - SPRG7 scratch for exception vectors (not 403) | ||
683 | * | ||
684 | * 32-bit 440 and FSL BookE: | ||
685 | * - SPRG0 scratch for exception vectors | ||
686 | * - SPRG1 scratch for exception vectors (*) | ||
687 | * - SPRG2 scratch for crit interrupts handler | ||
688 | * - SPRG4 scratch for exception vectors | ||
689 | * - SPRG5 scratch for exception vectors | ||
690 | * - SPRG6 scratch for machine check handler | ||
691 | * - SPRG7 scratch for exception vectors | ||
692 | * - SPRG9 scratch for debug vectors (e500 only) | ||
693 | * | ||
694 | * Additionally, BookE separates "read" and "write" | ||
695 | * of those registers. That allows to use the userspace | ||
696 | * readable variant for reads, which can avoid a fault | ||
697 | * with KVM type virtualization. | ||
698 | * | ||
699 | * (*) Under KVM, the host SPRG1 is used to point to | ||
700 | * the current VCPU data structure | ||
701 | * | ||
702 | * 32-bit 8xx: | ||
703 | * - SPRG0 scratch for exception vectors | ||
704 | * - SPRG1 scratch for exception vectors | ||
705 | * - SPRG2 apparently unused but initialized | ||
706 | * | ||
707 | */ | ||
708 | #ifdef CONFIG_PPC64 | ||
709 | #define SPRN_SPRG_PACA SPRN_SPRG1 | ||
710 | #else | ||
711 | #define SPRN_SPRG_THREAD SPRN_SPRG3 | ||
712 | #endif | ||
713 | |||
714 | #ifdef CONFIG_PPC_BOOK3S_64 | ||
715 | #define SPRN_SPRG_SCRATCH0 SPRN_SPRG2 | ||
716 | #endif | ||
717 | |||
718 | #ifdef CONFIG_PPC_BOOK3E_64 | ||
719 | #define SPRN_SPRG_MC_SCRATCH SPRN_SPRG8 | ||
720 | #define SPRN_SPRG_CRIT_SCRATCH SPRN_SPRG7 | ||
721 | #define SPRN_SPRG_DBG_SCRATCH SPRN_SPRG9 | ||
722 | #define SPRN_SPRG_TLB_EXFRAME SPRN_SPRG2 | ||
723 | #define SPRN_SPRG_TLB_SCRATCH SPRN_SPRG6 | ||
724 | #define SPRN_SPRG_GEN_SCRATCH SPRN_SPRG0 | ||
725 | #endif | ||
726 | |||
727 | #ifdef CONFIG_PPC_BOOK3S_32 | ||
728 | #define SPRN_SPRG_SCRATCH0 SPRN_SPRG0 | ||
729 | #define SPRN_SPRG_SCRATCH1 SPRN_SPRG1 | ||
730 | #define SPRN_SPRG_RTAS SPRN_SPRG2 | ||
731 | #define SPRN_SPRG_603_LRU SPRN_SPRG4 | ||
732 | #endif | ||
733 | |||
734 | #ifdef CONFIG_40x | ||
735 | #define SPRN_SPRG_SCRATCH0 SPRN_SPRG0 | ||
736 | #define SPRN_SPRG_SCRATCH1 SPRN_SPRG1 | ||
737 | #define SPRN_SPRG_SCRATCH2 SPRN_SPRG2 | ||
738 | #define SPRN_SPRG_SCRATCH3 SPRN_SPRG4 | ||
739 | #define SPRN_SPRG_SCRATCH4 SPRN_SPRG5 | ||
740 | #define SPRN_SPRG_SCRATCH5 SPRN_SPRG6 | ||
741 | #define SPRN_SPRG_SCRATCH6 SPRN_SPRG7 | ||
742 | #endif | ||
743 | |||
744 | #ifdef CONFIG_BOOKE | ||
745 | #define SPRN_SPRG_RSCRATCH0 SPRN_SPRG0 | ||
746 | #define SPRN_SPRG_WSCRATCH0 SPRN_SPRG0 | ||
747 | #define SPRN_SPRG_RSCRATCH1 SPRN_SPRG1 | ||
748 | #define SPRN_SPRG_WSCRATCH1 SPRN_SPRG1 | ||
749 | #define SPRN_SPRG_RSCRATCH_CRIT SPRN_SPRG2 | ||
750 | #define SPRN_SPRG_WSCRATCH_CRIT SPRN_SPRG2 | ||
751 | #define SPRN_SPRG_RSCRATCH2 SPRN_SPRG4R | ||
752 | #define SPRN_SPRG_WSCRATCH2 SPRN_SPRG4W | ||
753 | #define SPRN_SPRG_RSCRATCH3 SPRN_SPRG5R | ||
754 | #define SPRN_SPRG_WSCRATCH3 SPRN_SPRG5W | ||
755 | #define SPRN_SPRG_RSCRATCH_MC SPRN_SPRG6R | ||
756 | #define SPRN_SPRG_WSCRATCH_MC SPRN_SPRG6W | ||
757 | #define SPRN_SPRG_RSCRATCH4 SPRN_SPRG7R | ||
758 | #define SPRN_SPRG_WSCRATCH4 SPRN_SPRG7W | ||
759 | #ifdef CONFIG_E200 | ||
760 | #define SPRN_SPRG_RSCRATCH_DBG SPRN_SPRG6R | ||
761 | #define SPRN_SPRG_WSCRATCH_DBG SPRN_SPRG6W | ||
762 | #else | ||
763 | #define SPRN_SPRG_RSCRATCH_DBG SPRN_SPRG9 | ||
764 | #define SPRN_SPRG_WSCRATCH_DBG SPRN_SPRG9 | ||
765 | #endif | ||
766 | #define SPRN_SPRG_RVCPU SPRN_SPRG1 | ||
767 | #define SPRN_SPRG_WVCPU SPRN_SPRG1 | ||
768 | #endif | ||
769 | |||
770 | #ifdef CONFIG_8xx | ||
771 | #define SPRN_SPRG_SCRATCH0 SPRN_SPRG0 | ||
772 | #define SPRN_SPRG_SCRATCH1 SPRN_SPRG1 | ||
773 | #endif | ||
774 | |||
775 | /* | ||
649 | * An mtfsf instruction with the L bit set. On CPUs that support this a | 776 | * An mtfsf instruction with the L bit set. On CPUs that support this a |
650 | * full 64bits of FPSCR is restored and on other CPUs the L bit is ignored. | 777 | * full 64bits of FPSCR is restored and on other CPUs the L bit is ignored. |
651 | * | 778 | * |
diff --git a/arch/powerpc/include/asm/reg_booke.h b/arch/powerpc/include/asm/reg_booke.h index 6bcf364cbb2f..2c9c706e6448 100644 --- a/arch/powerpc/include/asm/reg_booke.h +++ b/arch/powerpc/include/asm/reg_booke.h | |||
@@ -18,18 +18,26 @@ | |||
18 | #define MSR_IS MSR_IR /* Instruction Space */ | 18 | #define MSR_IS MSR_IR /* Instruction Space */ |
19 | #define MSR_DS MSR_DR /* Data Space */ | 19 | #define MSR_DS MSR_DR /* Data Space */ |
20 | #define MSR_PMM (1<<2) /* Performance monitor mark bit */ | 20 | #define MSR_PMM (1<<2) /* Performance monitor mark bit */ |
21 | #define MSR_CM (1<<31) /* Computation Mode (0=32-bit, 1=64-bit) */ | ||
21 | 22 | ||
22 | /* Default MSR for kernel mode. */ | 23 | #if defined(CONFIG_PPC_BOOK3E_64) |
23 | #if defined (CONFIG_40x) | 24 | #define MSR_ MSR_ME | MSR_CE |
25 | #define MSR_KERNEL MSR_ | MSR_CM | ||
26 | #define MSR_USER32 MSR_ | MSR_PR | MSR_EE | ||
27 | #define MSR_USER64 MSR_USER32 | MSR_CM | ||
28 | #elif defined (CONFIG_40x) | ||
24 | #define MSR_KERNEL (MSR_ME|MSR_RI|MSR_IR|MSR_DR|MSR_CE) | 29 | #define MSR_KERNEL (MSR_ME|MSR_RI|MSR_IR|MSR_DR|MSR_CE) |
25 | #elif defined(CONFIG_BOOKE) | 30 | #define MSR_USER (MSR_KERNEL|MSR_PR|MSR_EE) |
31 | #else | ||
26 | #define MSR_KERNEL (MSR_ME|MSR_RI|MSR_CE) | 32 | #define MSR_KERNEL (MSR_ME|MSR_RI|MSR_CE) |
33 | #define MSR_USER (MSR_KERNEL|MSR_PR|MSR_EE) | ||
27 | #endif | 34 | #endif |
28 | 35 | ||
29 | /* Special Purpose Registers (SPRNs)*/ | 36 | /* Special Purpose Registers (SPRNs)*/ |
30 | #define SPRN_DECAR 0x036 /* Decrementer Auto Reload Register */ | 37 | #define SPRN_DECAR 0x036 /* Decrementer Auto Reload Register */ |
31 | #define SPRN_IVPR 0x03F /* Interrupt Vector Prefix Register */ | 38 | #define SPRN_IVPR 0x03F /* Interrupt Vector Prefix Register */ |
32 | #define SPRN_USPRG0 0x100 /* User Special Purpose Register General 0 */ | 39 | #define SPRN_USPRG0 0x100 /* User Special Purpose Register General 0 */ |
40 | #define SPRN_SPRG3R 0x103 /* Special Purpose Register General 3 Read */ | ||
33 | #define SPRN_SPRG4R 0x104 /* Special Purpose Register General 4 Read */ | 41 | #define SPRN_SPRG4R 0x104 /* Special Purpose Register General 4 Read */ |
34 | #define SPRN_SPRG5R 0x105 /* Special Purpose Register General 5 Read */ | 42 | #define SPRN_SPRG5R 0x105 /* Special Purpose Register General 5 Read */ |
35 | #define SPRN_SPRG6R 0x106 /* Special Purpose Register General 6 Read */ | 43 | #define SPRN_SPRG6R 0x106 /* Special Purpose Register General 6 Read */ |
@@ -38,11 +46,18 @@ | |||
38 | #define SPRN_SPRG5W 0x115 /* Special Purpose Register General 5 Write */ | 46 | #define SPRN_SPRG5W 0x115 /* Special Purpose Register General 5 Write */ |
39 | #define SPRN_SPRG6W 0x116 /* Special Purpose Register General 6 Write */ | 47 | #define SPRN_SPRG6W 0x116 /* Special Purpose Register General 6 Write */ |
40 | #define SPRN_SPRG7W 0x117 /* Special Purpose Register General 7 Write */ | 48 | #define SPRN_SPRG7W 0x117 /* Special Purpose Register General 7 Write */ |
49 | #define SPRN_EPCR 0x133 /* Embedded Processor Control Register */ | ||
41 | #define SPRN_DBCR2 0x136 /* Debug Control Register 2 */ | 50 | #define SPRN_DBCR2 0x136 /* Debug Control Register 2 */ |
42 | #define SPRN_IAC3 0x13A /* Instruction Address Compare 3 */ | 51 | #define SPRN_IAC3 0x13A /* Instruction Address Compare 3 */ |
43 | #define SPRN_IAC4 0x13B /* Instruction Address Compare 4 */ | 52 | #define SPRN_IAC4 0x13B /* Instruction Address Compare 4 */ |
44 | #define SPRN_DVC1 0x13E /* Data Value Compare Register 1 */ | 53 | #define SPRN_DVC1 0x13E /* Data Value Compare Register 1 */ |
45 | #define SPRN_DVC2 0x13F /* Data Value Compare Register 2 */ | 54 | #define SPRN_DVC2 0x13F /* Data Value Compare Register 2 */ |
55 | #define SPRN_MAS8 0x155 /* MMU Assist Register 8 */ | ||
56 | #define SPRN_TLB0PS 0x158 /* TLB 0 Page Size Register */ | ||
57 | #define SPRN_MAS5_MAS6 0x15c /* MMU Assist Register 5 || 6 */ | ||
58 | #define SPRN_MAS8_MAS1 0x15d /* MMU Assist Register 8 || 1 */ | ||
59 | #define SPRN_MAS7_MAS3 0x174 /* MMU Assist Register 7 || 3 */ | ||
60 | #define SPRN_MAS0_MAS1 0x175 /* MMU Assist Register 0 || 1 */ | ||
46 | #define SPRN_IVOR0 0x190 /* Interrupt Vector Offset Register 0 */ | 61 | #define SPRN_IVOR0 0x190 /* Interrupt Vector Offset Register 0 */ |
47 | #define SPRN_IVOR1 0x191 /* Interrupt Vector Offset Register 1 */ | 62 | #define SPRN_IVOR1 0x191 /* Interrupt Vector Offset Register 1 */ |
48 | #define SPRN_IVOR2 0x192 /* Interrupt Vector Offset Register 2 */ | 63 | #define SPRN_IVOR2 0x192 /* Interrupt Vector Offset Register 2 */ |
@@ -425,6 +440,27 @@ | |||
425 | #define SGR_NORMAL 0 /* Speculative fetching allowed. */ | 440 | #define SGR_NORMAL 0 /* Speculative fetching allowed. */ |
426 | #define SGR_GUARDED 1 /* Speculative fetching disallowed. */ | 441 | #define SGR_GUARDED 1 /* Speculative fetching disallowed. */ |
427 | 442 | ||
443 | /* Bit definitions for EPCR */ | ||
444 | #define SPRN_EPCR_EXTGS 0x80000000 /* External Input interrupt | ||
445 | * directed to Guest state */ | ||
446 | #define SPRN_EPCR_DTLBGS 0x40000000 /* Data TLB Error interrupt | ||
447 | * directed to guest state */ | ||
448 | #define SPRN_EPCR_ITLBGS 0x20000000 /* Instr. TLB error interrupt | ||
449 | * directed to guest state */ | ||
450 | #define SPRN_EPCR_DSIGS 0x10000000 /* Data Storage interrupt | ||
451 | * directed to guest state */ | ||
452 | #define SPRN_EPCR_ISIGS 0x08000000 /* Instr. Storage interrupt | ||
453 | * directed to guest state */ | ||
454 | #define SPRN_EPCR_DUVD 0x04000000 /* Disable Hypervisor Debug */ | ||
455 | #define SPRN_EPCR_ICM 0x02000000 /* Interrupt computation mode | ||
456 | * (copied to MSR:CM on intr) */ | ||
457 | #define SPRN_EPCR_GICM 0x01000000 /* Guest Interrupt Comp. mode */ | ||
458 | #define SPRN_EPCR_DGTMI 0x00800000 /* Disable TLB Guest Management | ||
459 | * instructions */ | ||
460 | #define SPRN_EPCR_DMIUH 0x00400000 /* Disable MAS Interrupt updates | ||
461 | * for hypervisor */ | ||
462 | |||
463 | |||
428 | /* | 464 | /* |
429 | * The IBM-403 is an even more odd special case, as it is much | 465 | * The IBM-403 is an even more odd special case, as it is much |
430 | * older than the IBM-405 series. We put these down here incase someone | 466 | * older than the IBM-405 series. We put these down here incase someone |
diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h index c25f73d1d842..c0d3b8af9319 100644 --- a/arch/powerpc/include/asm/smp.h +++ b/arch/powerpc/include/asm/smp.h | |||
@@ -148,6 +148,16 @@ extern struct smp_ops_t *smp_ops; | |||
148 | extern void arch_send_call_function_single_ipi(int cpu); | 148 | extern void arch_send_call_function_single_ipi(int cpu); |
149 | extern void arch_send_call_function_ipi(cpumask_t mask); | 149 | extern void arch_send_call_function_ipi(cpumask_t mask); |
150 | 150 | ||
151 | /* Definitions relative to the secondary CPU spin loop | ||
152 | * and entry point. Not all of them exist on both 32 and | ||
153 | * 64-bit but defining them all here doesn't harm | ||
154 | */ | ||
155 | extern void generic_secondary_smp_init(void); | ||
156 | extern void generic_secondary_thread_init(void); | ||
157 | extern unsigned long __secondary_hold_spinloop; | ||
158 | extern unsigned long __secondary_hold_acknowledge; | ||
159 | extern char __secondary_hold; | ||
160 | |||
151 | #endif /* __ASSEMBLY__ */ | 161 | #endif /* __ASSEMBLY__ */ |
152 | 162 | ||
153 | #endif /* __KERNEL__ */ | 163 | #endif /* __KERNEL__ */ |
diff --git a/arch/powerpc/include/asm/systbl.h b/arch/powerpc/include/asm/systbl.h index 370600ca2765..ed24bd92fe49 100644 --- a/arch/powerpc/include/asm/systbl.h +++ b/arch/powerpc/include/asm/systbl.h | |||
@@ -95,8 +95,8 @@ SYSCALL(reboot) | |||
95 | SYSX(sys_ni_syscall,compat_sys_old_readdir,sys_old_readdir) | 95 | SYSX(sys_ni_syscall,compat_sys_old_readdir,sys_old_readdir) |
96 | SYSCALL_SPU(mmap) | 96 | SYSCALL_SPU(mmap) |
97 | SYSCALL_SPU(munmap) | 97 | SYSCALL_SPU(munmap) |
98 | SYSCALL_SPU(truncate) | 98 | COMPAT_SYS_SPU(truncate) |
99 | SYSCALL_SPU(ftruncate) | 99 | COMPAT_SYS_SPU(ftruncate) |
100 | SYSCALL_SPU(fchmod) | 100 | SYSCALL_SPU(fchmod) |
101 | SYSCALL_SPU(fchown) | 101 | SYSCALL_SPU(fchown) |
102 | COMPAT_SYS_SPU(getpriority) | 102 | COMPAT_SYS_SPU(getpriority) |
diff --git a/arch/powerpc/include/asm/tlb.h b/arch/powerpc/include/asm/tlb.h index e20ff7541f36..e2b428b0f7ba 100644 --- a/arch/powerpc/include/asm/tlb.h +++ b/arch/powerpc/include/asm/tlb.h | |||
@@ -25,57 +25,25 @@ | |||
25 | 25 | ||
26 | #include <linux/pagemap.h> | 26 | #include <linux/pagemap.h> |
27 | 27 | ||
28 | struct mmu_gather; | ||
29 | |||
30 | #define tlb_start_vma(tlb, vma) do { } while (0) | 28 | #define tlb_start_vma(tlb, vma) do { } while (0) |
31 | #define tlb_end_vma(tlb, vma) do { } while (0) | 29 | #define tlb_end_vma(tlb, vma) do { } while (0) |
32 | 30 | ||
33 | #if !defined(CONFIG_PPC_STD_MMU) | ||
34 | |||
35 | #define tlb_flush(tlb) flush_tlb_mm((tlb)->mm) | ||
36 | |||
37 | #elif defined(__powerpc64__) | ||
38 | |||
39 | extern void pte_free_finish(void); | ||
40 | |||
41 | static inline void tlb_flush(struct mmu_gather *tlb) | ||
42 | { | ||
43 | struct ppc64_tlb_batch *tlbbatch = &__get_cpu_var(ppc64_tlb_batch); | ||
44 | |||
45 | /* If there's a TLB batch pending, then we must flush it because the | ||
46 | * pages are going to be freed and we really don't want to have a CPU | ||
47 | * access a freed page because it has a stale TLB | ||
48 | */ | ||
49 | if (tlbbatch->index) | ||
50 | __flush_tlb_pending(tlbbatch); | ||
51 | |||
52 | pte_free_finish(); | ||
53 | } | ||
54 | |||
55 | #else | ||
56 | |||
57 | extern void tlb_flush(struct mmu_gather *tlb); | 31 | extern void tlb_flush(struct mmu_gather *tlb); |
58 | 32 | ||
59 | #endif | ||
60 | |||
61 | /* Get the generic bits... */ | 33 | /* Get the generic bits... */ |
62 | #include <asm-generic/tlb.h> | 34 | #include <asm-generic/tlb.h> |
63 | 35 | ||
64 | #if !defined(CONFIG_PPC_STD_MMU) || defined(__powerpc64__) | ||
65 | |||
66 | #define __tlb_remove_tlb_entry(tlb, pte, address) do { } while (0) | ||
67 | |||
68 | #else | ||
69 | extern void flush_hash_entry(struct mm_struct *mm, pte_t *ptep, | 36 | extern void flush_hash_entry(struct mm_struct *mm, pte_t *ptep, |
70 | unsigned long address); | 37 | unsigned long address); |
71 | 38 | ||
72 | static inline void __tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep, | 39 | static inline void __tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep, |
73 | unsigned long address) | 40 | unsigned long address) |
74 | { | 41 | { |
42 | #ifdef CONFIG_PPC_STD_MMU_32 | ||
75 | if (pte_val(*ptep) & _PAGE_HASHPTE) | 43 | if (pte_val(*ptep) & _PAGE_HASHPTE) |
76 | flush_hash_entry(tlb->mm, ptep, address); | 44 | flush_hash_entry(tlb->mm, ptep, address); |
45 | #endif | ||
77 | } | 46 | } |
78 | 47 | ||
79 | #endif | ||
80 | #endif /* __KERNEL__ */ | 48 | #endif /* __KERNEL__ */ |
81 | #endif /* __ASM_POWERPC_TLB_H */ | 49 | #endif /* __ASM_POWERPC_TLB_H */ |
diff --git a/arch/powerpc/include/asm/tlbflush.h b/arch/powerpc/include/asm/tlbflush.h index abbe3419d1dd..d50a380b2b6f 100644 --- a/arch/powerpc/include/asm/tlbflush.h +++ b/arch/powerpc/include/asm/tlbflush.h | |||
@@ -6,7 +6,7 @@ | |||
6 | * | 6 | * |
7 | * - flush_tlb_mm(mm) flushes the specified mm context TLB's | 7 | * - flush_tlb_mm(mm) flushes the specified mm context TLB's |
8 | * - flush_tlb_page(vma, vmaddr) flushes one page | 8 | * - flush_tlb_page(vma, vmaddr) flushes one page |
9 | * - local_flush_tlb_mm(mm) flushes the specified mm context on | 9 | * - local_flush_tlb_mm(mm, full) flushes the specified mm context on |
10 | * the local processor | 10 | * the local processor |
11 | * - local_flush_tlb_page(vma, vmaddr) flushes one page on the local processor | 11 | * - local_flush_tlb_page(vma, vmaddr) flushes one page on the local processor |
12 | * - flush_tlb_page_nohash(vma, vmaddr) flushes one page if SW loaded TLB | 12 | * - flush_tlb_page_nohash(vma, vmaddr) flushes one page if SW loaded TLB |
@@ -29,7 +29,8 @@ | |||
29 | * specific tlbie's | 29 | * specific tlbie's |
30 | */ | 30 | */ |
31 | 31 | ||
32 | #include <linux/mm.h> | 32 | struct vm_area_struct; |
33 | struct mm_struct; | ||
33 | 34 | ||
34 | #define MMU_NO_CONTEXT ((unsigned int)-1) | 35 | #define MMU_NO_CONTEXT ((unsigned int)-1) |
35 | 36 | ||
@@ -40,12 +41,18 @@ extern void flush_tlb_kernel_range(unsigned long start, unsigned long end); | |||
40 | extern void local_flush_tlb_mm(struct mm_struct *mm); | 41 | extern void local_flush_tlb_mm(struct mm_struct *mm); |
41 | extern void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr); | 42 | extern void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr); |
42 | 43 | ||
44 | extern void __local_flush_tlb_page(struct mm_struct *mm, unsigned long vmaddr, | ||
45 | int tsize, int ind); | ||
46 | |||
43 | #ifdef CONFIG_SMP | 47 | #ifdef CONFIG_SMP |
44 | extern void flush_tlb_mm(struct mm_struct *mm); | 48 | extern void flush_tlb_mm(struct mm_struct *mm); |
45 | extern void flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr); | 49 | extern void flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr); |
50 | extern void __flush_tlb_page(struct mm_struct *mm, unsigned long vmaddr, | ||
51 | int tsize, int ind); | ||
46 | #else | 52 | #else |
47 | #define flush_tlb_mm(mm) local_flush_tlb_mm(mm) | 53 | #define flush_tlb_mm(mm) local_flush_tlb_mm(mm) |
48 | #define flush_tlb_page(vma,addr) local_flush_tlb_page(vma,addr) | 54 | #define flush_tlb_page(vma,addr) local_flush_tlb_page(vma,addr) |
55 | #define __flush_tlb_page(mm,addr,p,i) __local_flush_tlb_page(mm,addr,p,i) | ||
49 | #endif | 56 | #endif |
50 | #define flush_tlb_page_nohash(vma,addr) flush_tlb_page(vma,addr) | 57 | #define flush_tlb_page_nohash(vma,addr) flush_tlb_page(vma,addr) |
51 | 58 | ||
diff --git a/arch/powerpc/include/asm/vdso.h b/arch/powerpc/include/asm/vdso.h index 26fc449bd989..dc0419b66f17 100644 --- a/arch/powerpc/include/asm/vdso.h +++ b/arch/powerpc/include/asm/vdso.h | |||
@@ -7,9 +7,8 @@ | |||
7 | #define VDSO32_LBASE 0x100000 | 7 | #define VDSO32_LBASE 0x100000 |
8 | #define VDSO64_LBASE 0x100000 | 8 | #define VDSO64_LBASE 0x100000 |
9 | 9 | ||
10 | /* Default map addresses */ | 10 | /* Default map addresses for 32bit vDSO */ |
11 | #define VDSO32_MBASE VDSO32_LBASE | 11 | #define VDSO32_MBASE VDSO32_LBASE |
12 | #define VDSO64_MBASE VDSO64_LBASE | ||
13 | 12 | ||
14 | #define VDSO_VERSION_STRING LINUX_2.6.15 | 13 | #define VDSO_VERSION_STRING LINUX_2.6.15 |
15 | 14 | ||
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index 9619285f64e8..7c83edbc2155 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile | |||
@@ -33,10 +33,10 @@ obj-y := cputable.o ptrace.o syscalls.o \ | |||
33 | obj-y += vdso32/ | 33 | obj-y += vdso32/ |
34 | obj-$(CONFIG_PPC64) += setup_64.o sys_ppc32.o \ | 34 | obj-$(CONFIG_PPC64) += setup_64.o sys_ppc32.o \ |
35 | signal_64.o ptrace32.o \ | 35 | signal_64.o ptrace32.o \ |
36 | paca.o cpu_setup_ppc970.o \ | 36 | paca.o nvram_64.o firmware.o |
37 | cpu_setup_pa6t.o \ | 37 | obj-$(CONFIG_PPC_BOOK3S_64) += cpu_setup_ppc970.o cpu_setup_pa6t.o |
38 | firmware.o nvram_64.o | ||
39 | obj64-$(CONFIG_RELOCATABLE) += reloc_64.o | 38 | obj64-$(CONFIG_RELOCATABLE) += reloc_64.o |
39 | obj-$(CONFIG_PPC_BOOK3E_64) += exceptions-64e.o | ||
40 | obj-$(CONFIG_PPC64) += vdso64/ | 40 | obj-$(CONFIG_PPC64) += vdso64/ |
41 | obj-$(CONFIG_ALTIVEC) += vecemu.o | 41 | obj-$(CONFIG_ALTIVEC) += vecemu.o |
42 | obj-$(CONFIG_PPC_970_NAP) += idle_power4.o | 42 | obj-$(CONFIG_PPC_970_NAP) += idle_power4.o |
@@ -63,8 +63,8 @@ obj-$(CONFIG_MODULES) += module.o module_$(CONFIG_WORD_SIZE).o | |||
63 | obj-$(CONFIG_44x) += cpu_setup_44x.o | 63 | obj-$(CONFIG_44x) += cpu_setup_44x.o |
64 | obj-$(CONFIG_FSL_BOOKE) += cpu_setup_fsl_booke.o dbell.o | 64 | obj-$(CONFIG_FSL_BOOKE) += cpu_setup_fsl_booke.o dbell.o |
65 | 65 | ||
66 | extra-$(CONFIG_PPC_STD_MMU) := head_32.o | 66 | extra-y := head_$(CONFIG_WORD_SIZE).o |
67 | extra-$(CONFIG_PPC64) := head_64.o | 67 | extra-$(CONFIG_PPC_BOOK3E_32) := head_new_booke.o |
68 | extra-$(CONFIG_40x) := head_40x.o | 68 | extra-$(CONFIG_40x) := head_40x.o |
69 | extra-$(CONFIG_44x) := head_44x.o | 69 | extra-$(CONFIG_44x) := head_44x.o |
70 | extra-$(CONFIG_FSL_BOOKE) := head_fsl_booke.o | 70 | extra-$(CONFIG_FSL_BOOKE) := head_fsl_booke.o |
@@ -115,6 +115,13 @@ ifneq ($(CONFIG_XMON)$(CONFIG_KEXEC),) | |||
115 | obj-y += ppc_save_regs.o | 115 | obj-y += ppc_save_regs.o |
116 | endif | 116 | endif |
117 | 117 | ||
118 | # Disable GCOV in odd or sensitive code | ||
119 | GCOV_PROFILE_prom_init.o := n | ||
120 | GCOV_PROFILE_ftrace.o := n | ||
121 | GCOV_PROFILE_machine_kexec_64.o := n | ||
122 | GCOV_PROFILE_machine_kexec_32.o := n | ||
123 | GCOV_PROFILE_kprobes.o := n | ||
124 | |||
118 | extra-$(CONFIG_PPC_FPU) += fpu.o | 125 | extra-$(CONFIG_PPC_FPU) += fpu.o |
119 | extra-$(CONFIG_ALTIVEC) += vector.o | 126 | extra-$(CONFIG_ALTIVEC) += vector.o |
120 | extra-$(CONFIG_PPC64) += entry_64.o | 127 | extra-$(CONFIG_PPC64) += entry_64.o |
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c index 197b15646eeb..f0df285f0f87 100644 --- a/arch/powerpc/kernel/asm-offsets.c +++ b/arch/powerpc/kernel/asm-offsets.c | |||
@@ -52,9 +52,11 @@ | |||
52 | #include <linux/kvm_host.h> | 52 | #include <linux/kvm_host.h> |
53 | #endif | 53 | #endif |
54 | 54 | ||
55 | #ifdef CONFIG_PPC32 | ||
55 | #if defined(CONFIG_BOOKE) || defined(CONFIG_40x) | 56 | #if defined(CONFIG_BOOKE) || defined(CONFIG_40x) |
56 | #include "head_booke.h" | 57 | #include "head_booke.h" |
57 | #endif | 58 | #endif |
59 | #endif | ||
58 | 60 | ||
59 | #if defined(CONFIG_FSL_BOOKE) | 61 | #if defined(CONFIG_FSL_BOOKE) |
60 | #include "../mm/mmu_decl.h" | 62 | #include "../mm/mmu_decl.h" |
@@ -140,6 +142,20 @@ int main(void) | |||
140 | context.high_slices_psize)); | 142 | context.high_slices_psize)); |
141 | DEFINE(MMUPSIZEDEFSIZE, sizeof(struct mmu_psize_def)); | 143 | DEFINE(MMUPSIZEDEFSIZE, sizeof(struct mmu_psize_def)); |
142 | #endif /* CONFIG_PPC_MM_SLICES */ | 144 | #endif /* CONFIG_PPC_MM_SLICES */ |
145 | |||
146 | #ifdef CONFIG_PPC_BOOK3E | ||
147 | DEFINE(PACAPGD, offsetof(struct paca_struct, pgd)); | ||
148 | DEFINE(PACA_KERNELPGD, offsetof(struct paca_struct, kernel_pgd)); | ||
149 | DEFINE(PACA_EXGEN, offsetof(struct paca_struct, exgen)); | ||
150 | DEFINE(PACA_EXTLB, offsetof(struct paca_struct, extlb)); | ||
151 | DEFINE(PACA_EXMC, offsetof(struct paca_struct, exmc)); | ||
152 | DEFINE(PACA_EXCRIT, offsetof(struct paca_struct, excrit)); | ||
153 | DEFINE(PACA_EXDBG, offsetof(struct paca_struct, exdbg)); | ||
154 | DEFINE(PACA_MC_STACK, offsetof(struct paca_struct, mc_kstack)); | ||
155 | DEFINE(PACA_CRIT_STACK, offsetof(struct paca_struct, crit_kstack)); | ||
156 | DEFINE(PACA_DBG_STACK, offsetof(struct paca_struct, dbg_kstack)); | ||
157 | #endif /* CONFIG_PPC_BOOK3E */ | ||
158 | |||
143 | #ifdef CONFIG_PPC_STD_MMU_64 | 159 | #ifdef CONFIG_PPC_STD_MMU_64 |
144 | DEFINE(PACASTABREAL, offsetof(struct paca_struct, stab_real)); | 160 | DEFINE(PACASTABREAL, offsetof(struct paca_struct, stab_real)); |
145 | DEFINE(PACASTABVIRT, offsetof(struct paca_struct, stab_addr)); | 161 | DEFINE(PACASTABVIRT, offsetof(struct paca_struct, stab_addr)); |
@@ -262,6 +278,7 @@ int main(void) | |||
262 | DEFINE(_SRR1, STACK_FRAME_OVERHEAD+sizeof(struct pt_regs)+8); | 278 | DEFINE(_SRR1, STACK_FRAME_OVERHEAD+sizeof(struct pt_regs)+8); |
263 | #endif /* CONFIG_PPC64 */ | 279 | #endif /* CONFIG_PPC64 */ |
264 | 280 | ||
281 | #if defined(CONFIG_PPC32) | ||
265 | #if defined(CONFIG_BOOKE) || defined(CONFIG_40x) | 282 | #if defined(CONFIG_BOOKE) || defined(CONFIG_40x) |
266 | DEFINE(EXC_LVL_SIZE, STACK_EXC_LVL_FRAME_SIZE); | 283 | DEFINE(EXC_LVL_SIZE, STACK_EXC_LVL_FRAME_SIZE); |
267 | DEFINE(MAS0, STACK_INT_FRAME_SIZE+offsetof(struct exception_regs, mas0)); | 284 | DEFINE(MAS0, STACK_INT_FRAME_SIZE+offsetof(struct exception_regs, mas0)); |
@@ -280,7 +297,7 @@ int main(void) | |||
280 | DEFINE(_DSRR1, STACK_INT_FRAME_SIZE+offsetof(struct exception_regs, dsrr1)); | 297 | DEFINE(_DSRR1, STACK_INT_FRAME_SIZE+offsetof(struct exception_regs, dsrr1)); |
281 | DEFINE(SAVED_KSP_LIMIT, STACK_INT_FRAME_SIZE+offsetof(struct exception_regs, saved_ksp_limit)); | 298 | DEFINE(SAVED_KSP_LIMIT, STACK_INT_FRAME_SIZE+offsetof(struct exception_regs, saved_ksp_limit)); |
282 | #endif | 299 | #endif |
283 | 300 | #endif | |
284 | DEFINE(CLONE_VM, CLONE_VM); | 301 | DEFINE(CLONE_VM, CLONE_VM); |
285 | DEFINE(CLONE_UNTRACED, CLONE_UNTRACED); | 302 | DEFINE(CLONE_UNTRACED, CLONE_UNTRACED); |
286 | 303 | ||
diff --git a/arch/powerpc/kernel/cpu_setup_6xx.S b/arch/powerpc/kernel/cpu_setup_6xx.S index 1e9949e68856..55cba4a8a959 100644 --- a/arch/powerpc/kernel/cpu_setup_6xx.S +++ b/arch/powerpc/kernel/cpu_setup_6xx.S | |||
@@ -21,7 +21,7 @@ _GLOBAL(__setup_cpu_603) | |||
21 | mflr r4 | 21 | mflr r4 |
22 | BEGIN_MMU_FTR_SECTION | 22 | BEGIN_MMU_FTR_SECTION |
23 | li r10,0 | 23 | li r10,0 |
24 | mtspr SPRN_SPRG4,r10 /* init SW LRU tracking */ | 24 | mtspr SPRN_SPRG_603_LRU,r10 /* init SW LRU tracking */ |
25 | END_MMU_FTR_SECTION_IFSET(MMU_FTR_NEED_DTLB_SW_LRU) | 25 | END_MMU_FTR_SECTION_IFSET(MMU_FTR_NEED_DTLB_SW_LRU) |
26 | BEGIN_FTR_SECTION | 26 | BEGIN_FTR_SECTION |
27 | bl __init_fpu_registers | 27 | bl __init_fpu_registers |
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 4a24a2fc4574..9f38ecb17859 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
@@ -93,7 +93,7 @@ extern void __restore_cpu_power7(void); | |||
93 | PPC_FEATURE_BOOKE) | 93 | PPC_FEATURE_BOOKE) |
94 | 94 | ||
95 | static struct cpu_spec __initdata cpu_specs[] = { | 95 | static struct cpu_spec __initdata cpu_specs[] = { |
96 | #ifdef CONFIG_PPC64 | 96 | #ifdef CONFIG_PPC_BOOK3S_64 |
97 | { /* Power3 */ | 97 | { /* Power3 */ |
98 | .pvr_mask = 0xffff0000, | 98 | .pvr_mask = 0xffff0000, |
99 | .pvr_value = 0x00400000, | 99 | .pvr_value = 0x00400000, |
@@ -508,7 +508,30 @@ static struct cpu_spec __initdata cpu_specs[] = { | |||
508 | .machine_check = machine_check_generic, | 508 | .machine_check = machine_check_generic, |
509 | .platform = "power4", | 509 | .platform = "power4", |
510 | } | 510 | } |
511 | #endif /* CONFIG_PPC64 */ | 511 | #endif /* CONFIG_PPC_BOOK3S_64 */ |
512 | #ifdef CONFIG_PPC_BOOK3E_64 | ||
513 | { /* This is a default entry to get going, to be replaced by | ||
514 | * a real one at some stage | ||
515 | */ | ||
516 | #define CPU_FTRS_BASE_BOOK3E (CPU_FTR_USE_TB | \ | ||
517 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_SMT | \ | ||
518 | CPU_FTR_NODSISRALIGN | CPU_FTR_NOEXECUTE) | ||
519 | .pvr_mask = 0x00000000, | ||
520 | .pvr_value = 0x00000000, | ||
521 | .cpu_name = "Book3E", | ||
522 | .cpu_features = CPU_FTRS_BASE_BOOK3E, | ||
523 | .cpu_user_features = COMMON_USER_PPC64, | ||
524 | .mmu_features = MMU_FTR_TYPE_3E | MMU_FTR_USE_TLBILX | | ||
525 | MMU_FTR_USE_TLBIVAX_BCAST | | ||
526 | MMU_FTR_LOCK_BCAST_INVAL, | ||
527 | .icache_bsize = 64, | ||
528 | .dcache_bsize = 64, | ||
529 | .num_pmcs = 0, | ||
530 | .machine_check = machine_check_generic, | ||
531 | .platform = "power6", | ||
532 | }, | ||
533 | #endif | ||
534 | |||
512 | #ifdef CONFIG_PPC32 | 535 | #ifdef CONFIG_PPC32 |
513 | #if CLASSIC_PPC | 536 | #if CLASSIC_PPC |
514 | { /* 601 */ | 537 | { /* 601 */ |
@@ -1630,7 +1653,7 @@ static struct cpu_spec __initdata cpu_specs[] = { | |||
1630 | .platform = "ppc440", | 1653 | .platform = "ppc440", |
1631 | }, | 1654 | }, |
1632 | { /* 460EX */ | 1655 | { /* 460EX */ |
1633 | .pvr_mask = 0xffff0002, | 1656 | .pvr_mask = 0xffff0006, |
1634 | .pvr_value = 0x13020002, | 1657 | .pvr_value = 0x13020002, |
1635 | .cpu_name = "460EX", | 1658 | .cpu_name = "460EX", |
1636 | .cpu_features = CPU_FTRS_440x6, | 1659 | .cpu_features = CPU_FTRS_440x6, |
@@ -1642,8 +1665,21 @@ static struct cpu_spec __initdata cpu_specs[] = { | |||
1642 | .machine_check = machine_check_440A, | 1665 | .machine_check = machine_check_440A, |
1643 | .platform = "ppc440", | 1666 | .platform = "ppc440", |
1644 | }, | 1667 | }, |
1668 | { /* 460EX Rev B */ | ||
1669 | .pvr_mask = 0xffff0007, | ||
1670 | .pvr_value = 0x13020004, | ||
1671 | .cpu_name = "460EX Rev. B", | ||
1672 | .cpu_features = CPU_FTRS_440x6, | ||
1673 | .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU, | ||
1674 | .mmu_features = MMU_FTR_TYPE_44x, | ||
1675 | .icache_bsize = 32, | ||
1676 | .dcache_bsize = 32, | ||
1677 | .cpu_setup = __setup_cpu_460ex, | ||
1678 | .machine_check = machine_check_440A, | ||
1679 | .platform = "ppc440", | ||
1680 | }, | ||
1645 | { /* 460GT */ | 1681 | { /* 460GT */ |
1646 | .pvr_mask = 0xffff0002, | 1682 | .pvr_mask = 0xffff0006, |
1647 | .pvr_value = 0x13020000, | 1683 | .pvr_value = 0x13020000, |
1648 | .cpu_name = "460GT", | 1684 | .cpu_name = "460GT", |
1649 | .cpu_features = CPU_FTRS_440x6, | 1685 | .cpu_features = CPU_FTRS_440x6, |
@@ -1655,6 +1691,19 @@ static struct cpu_spec __initdata cpu_specs[] = { | |||
1655 | .machine_check = machine_check_440A, | 1691 | .machine_check = machine_check_440A, |
1656 | .platform = "ppc440", | 1692 | .platform = "ppc440", |
1657 | }, | 1693 | }, |
1694 | { /* 460GT Rev B */ | ||
1695 | .pvr_mask = 0xffff0007, | ||
1696 | .pvr_value = 0x13020005, | ||
1697 | .cpu_name = "460GT Rev. B", | ||
1698 | .cpu_features = CPU_FTRS_440x6, | ||
1699 | .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU, | ||
1700 | .mmu_features = MMU_FTR_TYPE_44x, | ||
1701 | .icache_bsize = 32, | ||
1702 | .dcache_bsize = 32, | ||
1703 | .cpu_setup = __setup_cpu_460gt, | ||
1704 | .machine_check = machine_check_440A, | ||
1705 | .platform = "ppc440", | ||
1706 | }, | ||
1658 | { /* 460SX */ | 1707 | { /* 460SX */ |
1659 | .pvr_mask = 0xffffff00, | 1708 | .pvr_mask = 0xffffff00, |
1660 | .pvr_value = 0x13541800, | 1709 | .pvr_value = 0x13541800, |
diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S index 3cadba60a4b6..1175a8539e6c 100644 --- a/arch/powerpc/kernel/entry_32.S +++ b/arch/powerpc/kernel/entry_32.S | |||
@@ -88,7 +88,7 @@ crit_transfer_to_handler: | |||
88 | mfspr r0,SPRN_SRR1 | 88 | mfspr r0,SPRN_SRR1 |
89 | stw r0,_SRR1(r11) | 89 | stw r0,_SRR1(r11) |
90 | 90 | ||
91 | mfspr r8,SPRN_SPRG3 | 91 | mfspr r8,SPRN_SPRG_THREAD |
92 | lwz r0,KSP_LIMIT(r8) | 92 | lwz r0,KSP_LIMIT(r8) |
93 | stw r0,SAVED_KSP_LIMIT(r11) | 93 | stw r0,SAVED_KSP_LIMIT(r11) |
94 | rlwimi r0,r1,0,0,(31-THREAD_SHIFT) | 94 | rlwimi r0,r1,0,0,(31-THREAD_SHIFT) |
@@ -108,7 +108,7 @@ crit_transfer_to_handler: | |||
108 | mfspr r0,SPRN_SRR1 | 108 | mfspr r0,SPRN_SRR1 |
109 | stw r0,crit_srr1@l(0) | 109 | stw r0,crit_srr1@l(0) |
110 | 110 | ||
111 | mfspr r8,SPRN_SPRG3 | 111 | mfspr r8,SPRN_SPRG_THREAD |
112 | lwz r0,KSP_LIMIT(r8) | 112 | lwz r0,KSP_LIMIT(r8) |
113 | stw r0,saved_ksp_limit@l(0) | 113 | stw r0,saved_ksp_limit@l(0) |
114 | rlwimi r0,r1,0,0,(31-THREAD_SHIFT) | 114 | rlwimi r0,r1,0,0,(31-THREAD_SHIFT) |
@@ -138,7 +138,7 @@ transfer_to_handler: | |||
138 | mfspr r2,SPRN_XER | 138 | mfspr r2,SPRN_XER |
139 | stw r12,_CTR(r11) | 139 | stw r12,_CTR(r11) |
140 | stw r2,_XER(r11) | 140 | stw r2,_XER(r11) |
141 | mfspr r12,SPRN_SPRG3 | 141 | mfspr r12,SPRN_SPRG_THREAD |
142 | addi r2,r12,-THREAD | 142 | addi r2,r12,-THREAD |
143 | tovirt(r2,r2) /* set r2 to current */ | 143 | tovirt(r2,r2) /* set r2 to current */ |
144 | beq 2f /* if from user, fix up THREAD.regs */ | 144 | beq 2f /* if from user, fix up THREAD.regs */ |
@@ -680,7 +680,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_SPE) | |||
680 | 680 | ||
681 | tophys(r0,r4) | 681 | tophys(r0,r4) |
682 | CLR_TOP32(r0) | 682 | CLR_TOP32(r0) |
683 | mtspr SPRN_SPRG3,r0 /* Update current THREAD phys addr */ | 683 | mtspr SPRN_SPRG_THREAD,r0 /* Update current THREAD phys addr */ |
684 | lwz r1,KSP(r4) /* Load new stack pointer */ | 684 | lwz r1,KSP(r4) /* Load new stack pointer */ |
685 | 685 | ||
686 | /* save the old current 'last' for return value */ | 686 | /* save the old current 'last' for return value */ |
@@ -1057,7 +1057,7 @@ exc_exit_restart_end: | |||
1057 | #ifdef CONFIG_40x | 1057 | #ifdef CONFIG_40x |
1058 | .globl ret_from_crit_exc | 1058 | .globl ret_from_crit_exc |
1059 | ret_from_crit_exc: | 1059 | ret_from_crit_exc: |
1060 | mfspr r9,SPRN_SPRG3 | 1060 | mfspr r9,SPRN_SPRG_THREAD |
1061 | lis r10,saved_ksp_limit@ha; | 1061 | lis r10,saved_ksp_limit@ha; |
1062 | lwz r10,saved_ksp_limit@l(r10); | 1062 | lwz r10,saved_ksp_limit@l(r10); |
1063 | tovirt(r9,r9); | 1063 | tovirt(r9,r9); |
@@ -1074,7 +1074,7 @@ ret_from_crit_exc: | |||
1074 | #ifdef CONFIG_BOOKE | 1074 | #ifdef CONFIG_BOOKE |
1075 | .globl ret_from_crit_exc | 1075 | .globl ret_from_crit_exc |
1076 | ret_from_crit_exc: | 1076 | ret_from_crit_exc: |
1077 | mfspr r9,SPRN_SPRG3 | 1077 | mfspr r9,SPRN_SPRG_THREAD |
1078 | lwz r10,SAVED_KSP_LIMIT(r1) | 1078 | lwz r10,SAVED_KSP_LIMIT(r1) |
1079 | stw r10,KSP_LIMIT(r9) | 1079 | stw r10,KSP_LIMIT(r9) |
1080 | RESTORE_xSRR(SRR0,SRR1); | 1080 | RESTORE_xSRR(SRR0,SRR1); |
@@ -1083,7 +1083,7 @@ ret_from_crit_exc: | |||
1083 | 1083 | ||
1084 | .globl ret_from_debug_exc | 1084 | .globl ret_from_debug_exc |
1085 | ret_from_debug_exc: | 1085 | ret_from_debug_exc: |
1086 | mfspr r9,SPRN_SPRG3 | 1086 | mfspr r9,SPRN_SPRG_THREAD |
1087 | lwz r10,SAVED_KSP_LIMIT(r1) | 1087 | lwz r10,SAVED_KSP_LIMIT(r1) |
1088 | stw r10,KSP_LIMIT(r9) | 1088 | stw r10,KSP_LIMIT(r9) |
1089 | lwz r9,THREAD_INFO-THREAD(r9) | 1089 | lwz r9,THREAD_INFO-THREAD(r9) |
@@ -1097,7 +1097,7 @@ ret_from_debug_exc: | |||
1097 | 1097 | ||
1098 | .globl ret_from_mcheck_exc | 1098 | .globl ret_from_mcheck_exc |
1099 | ret_from_mcheck_exc: | 1099 | ret_from_mcheck_exc: |
1100 | mfspr r9,SPRN_SPRG3 | 1100 | mfspr r9,SPRN_SPRG_THREAD |
1101 | lwz r10,SAVED_KSP_LIMIT(r1) | 1101 | lwz r10,SAVED_KSP_LIMIT(r1) |
1102 | stw r10,KSP_LIMIT(r9) | 1102 | stw r10,KSP_LIMIT(r9) |
1103 | RESTORE_xSRR(SRR0,SRR1); | 1103 | RESTORE_xSRR(SRR0,SRR1); |
@@ -1255,7 +1255,7 @@ _GLOBAL(enter_rtas) | |||
1255 | MTMSRD(r0) /* don't get trashed */ | 1255 | MTMSRD(r0) /* don't get trashed */ |
1256 | li r9,MSR_KERNEL & ~(MSR_IR|MSR_DR) | 1256 | li r9,MSR_KERNEL & ~(MSR_IR|MSR_DR) |
1257 | mtlr r6 | 1257 | mtlr r6 |
1258 | mtspr SPRN_SPRG2,r7 | 1258 | mtspr SPRN_SPRG_RTAS,r7 |
1259 | mtspr SPRN_SRR0,r8 | 1259 | mtspr SPRN_SRR0,r8 |
1260 | mtspr SPRN_SRR1,r9 | 1260 | mtspr SPRN_SRR1,r9 |
1261 | RFI | 1261 | RFI |
@@ -1265,7 +1265,7 @@ _GLOBAL(enter_rtas) | |||
1265 | FIX_SRR1(r9,r0) | 1265 | FIX_SRR1(r9,r0) |
1266 | addi r1,r1,INT_FRAME_SIZE | 1266 | addi r1,r1,INT_FRAME_SIZE |
1267 | li r0,0 | 1267 | li r0,0 |
1268 | mtspr SPRN_SPRG2,r0 | 1268 | mtspr SPRN_SPRG_RTAS,r0 |
1269 | mtspr SPRN_SRR0,r8 | 1269 | mtspr SPRN_SRR0,r8 |
1270 | mtspr SPRN_SRR1,r9 | 1270 | mtspr SPRN_SRR1,r9 |
1271 | RFI /* return to caller */ | 1271 | RFI /* return to caller */ |
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index 43e073477c34..66bcda34a6bb 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
@@ -120,9 +120,15 @@ BEGIN_FW_FTR_SECTION | |||
120 | 2: | 120 | 2: |
121 | END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES) | 121 | END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES) |
122 | #endif /* CONFIG_PPC_ISERIES */ | 122 | #endif /* CONFIG_PPC_ISERIES */ |
123 | |||
124 | /* Hard enable interrupts */ | ||
125 | #ifdef CONFIG_PPC_BOOK3E | ||
126 | wrteei 1 | ||
127 | #else | ||
123 | mfmsr r11 | 128 | mfmsr r11 |
124 | ori r11,r11,MSR_EE | 129 | ori r11,r11,MSR_EE |
125 | mtmsrd r11,1 | 130 | mtmsrd r11,1 |
131 | #endif /* CONFIG_PPC_BOOK3E */ | ||
126 | 132 | ||
127 | #ifdef SHOW_SYSCALLS | 133 | #ifdef SHOW_SYSCALLS |
128 | bl .do_show_syscall | 134 | bl .do_show_syscall |
@@ -168,15 +174,25 @@ syscall_exit: | |||
168 | #endif | 174 | #endif |
169 | clrrdi r12,r1,THREAD_SHIFT | 175 | clrrdi r12,r1,THREAD_SHIFT |
170 | 176 | ||
171 | /* disable interrupts so current_thread_info()->flags can't change, | ||
172 | and so that we don't get interrupted after loading SRR0/1. */ | ||
173 | ld r8,_MSR(r1) | 177 | ld r8,_MSR(r1) |
178 | #ifdef CONFIG_PPC_BOOK3S | ||
179 | /* No MSR:RI on BookE */ | ||
174 | andi. r10,r8,MSR_RI | 180 | andi. r10,r8,MSR_RI |
175 | beq- unrecov_restore | 181 | beq- unrecov_restore |
182 | #endif | ||
183 | |||
184 | /* Disable interrupts so current_thread_info()->flags can't change, | ||
185 | * and so that we don't get interrupted after loading SRR0/1. | ||
186 | */ | ||
187 | #ifdef CONFIG_PPC_BOOK3E | ||
188 | wrteei 0 | ||
189 | #else | ||
176 | mfmsr r10 | 190 | mfmsr r10 |
177 | rldicl r10,r10,48,1 | 191 | rldicl r10,r10,48,1 |
178 | rotldi r10,r10,16 | 192 | rotldi r10,r10,16 |
179 | mtmsrd r10,1 | 193 | mtmsrd r10,1 |
194 | #endif /* CONFIG_PPC_BOOK3E */ | ||
195 | |||
180 | ld r9,TI_FLAGS(r12) | 196 | ld r9,TI_FLAGS(r12) |
181 | li r11,-_LAST_ERRNO | 197 | li r11,-_LAST_ERRNO |
182 | andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK) | 198 | andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK) |
@@ -194,9 +210,13 @@ syscall_error_cont: | |||
194 | * userspace and we take an exception after restoring r13, | 210 | * userspace and we take an exception after restoring r13, |
195 | * we end up corrupting the userspace r13 value. | 211 | * we end up corrupting the userspace r13 value. |
196 | */ | 212 | */ |
213 | #ifdef CONFIG_PPC_BOOK3S | ||
214 | /* No MSR:RI on BookE */ | ||
197 | li r12,MSR_RI | 215 | li r12,MSR_RI |
198 | andc r11,r10,r12 | 216 | andc r11,r10,r12 |
199 | mtmsrd r11,1 /* clear MSR.RI */ | 217 | mtmsrd r11,1 /* clear MSR.RI */ |
218 | #endif /* CONFIG_PPC_BOOK3S */ | ||
219 | |||
200 | beq- 1f | 220 | beq- 1f |
201 | ACCOUNT_CPU_USER_EXIT(r11, r12) | 221 | ACCOUNT_CPU_USER_EXIT(r11, r12) |
202 | ld r13,GPR13(r1) /* only restore r13 if returning to usermode */ | 222 | ld r13,GPR13(r1) /* only restore r13 if returning to usermode */ |
@@ -206,7 +226,7 @@ syscall_error_cont: | |||
206 | mtcr r5 | 226 | mtcr r5 |
207 | mtspr SPRN_SRR0,r7 | 227 | mtspr SPRN_SRR0,r7 |
208 | mtspr SPRN_SRR1,r8 | 228 | mtspr SPRN_SRR1,r8 |
209 | rfid | 229 | RFI |
210 | b . /* prevent speculative execution */ | 230 | b . /* prevent speculative execution */ |
211 | 231 | ||
212 | syscall_error: | 232 | syscall_error: |
@@ -276,9 +296,13 @@ syscall_exit_work: | |||
276 | beq .ret_from_except_lite | 296 | beq .ret_from_except_lite |
277 | 297 | ||
278 | /* Re-enable interrupts */ | 298 | /* Re-enable interrupts */ |
299 | #ifdef CONFIG_PPC_BOOK3E | ||
300 | wrteei 1 | ||
301 | #else | ||
279 | mfmsr r10 | 302 | mfmsr r10 |
280 | ori r10,r10,MSR_EE | 303 | ori r10,r10,MSR_EE |
281 | mtmsrd r10,1 | 304 | mtmsrd r10,1 |
305 | #endif /* CONFIG_PPC_BOOK3E */ | ||
282 | 306 | ||
283 | bl .save_nvgprs | 307 | bl .save_nvgprs |
284 | addi r3,r1,STACK_FRAME_OVERHEAD | 308 | addi r3,r1,STACK_FRAME_OVERHEAD |
@@ -380,7 +404,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | |||
380 | and. r0,r0,r22 | 404 | and. r0,r0,r22 |
381 | beq+ 1f | 405 | beq+ 1f |
382 | andc r22,r22,r0 | 406 | andc r22,r22,r0 |
383 | mtmsrd r22 | 407 | MTMSRD(r22) |
384 | isync | 408 | isync |
385 | 1: std r20,_NIP(r1) | 409 | 1: std r20,_NIP(r1) |
386 | mfcr r23 | 410 | mfcr r23 |
@@ -399,6 +423,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | |||
399 | std r6,PACACURRENT(r13) /* Set new 'current' */ | 423 | std r6,PACACURRENT(r13) /* Set new 'current' */ |
400 | 424 | ||
401 | ld r8,KSP(r4) /* new stack pointer */ | 425 | ld r8,KSP(r4) /* new stack pointer */ |
426 | #ifdef CONFIG_PPC_BOOK3S | ||
402 | BEGIN_FTR_SECTION | 427 | BEGIN_FTR_SECTION |
403 | BEGIN_FTR_SECTION_NESTED(95) | 428 | BEGIN_FTR_SECTION_NESTED(95) |
404 | clrrdi r6,r8,28 /* get its ESID */ | 429 | clrrdi r6,r8,28 /* get its ESID */ |
@@ -445,8 +470,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_1T_SEGMENT) | |||
445 | slbie r6 /* Workaround POWER5 < DD2.1 issue */ | 470 | slbie r6 /* Workaround POWER5 < DD2.1 issue */ |
446 | slbmte r7,r0 | 471 | slbmte r7,r0 |
447 | isync | 472 | isync |
448 | |||
449 | 2: | 473 | 2: |
474 | #endif /* !CONFIG_PPC_BOOK3S */ | ||
475 | |||
450 | clrrdi r7,r8,THREAD_SHIFT /* base of new stack */ | 476 | clrrdi r7,r8,THREAD_SHIFT /* base of new stack */ |
451 | /* Note: this uses SWITCH_FRAME_SIZE rather than INT_FRAME_SIZE | 477 | /* Note: this uses SWITCH_FRAME_SIZE rather than INT_FRAME_SIZE |
452 | because we don't need to leave the 288-byte ABI gap at the | 478 | because we don't need to leave the 288-byte ABI gap at the |
@@ -490,10 +516,14 @@ _GLOBAL(ret_from_except_lite) | |||
490 | * can't change between when we test it and when we return | 516 | * can't change between when we test it and when we return |
491 | * from the interrupt. | 517 | * from the interrupt. |
492 | */ | 518 | */ |
519 | #ifdef CONFIG_PPC_BOOK3E | ||
520 | wrteei 0 | ||
521 | #else | ||
493 | mfmsr r10 /* Get current interrupt state */ | 522 | mfmsr r10 /* Get current interrupt state */ |
494 | rldicl r9,r10,48,1 /* clear MSR_EE */ | 523 | rldicl r9,r10,48,1 /* clear MSR_EE */ |
495 | rotldi r9,r9,16 | 524 | rotldi r9,r9,16 |
496 | mtmsrd r9,1 /* Update machine state */ | 525 | mtmsrd r9,1 /* Update machine state */ |
526 | #endif /* CONFIG_PPC_BOOK3E */ | ||
497 | 527 | ||
498 | #ifdef CONFIG_PREEMPT | 528 | #ifdef CONFIG_PREEMPT |
499 | clrrdi r9,r1,THREAD_SHIFT /* current_thread_info() */ | 529 | clrrdi r9,r1,THREAD_SHIFT /* current_thread_info() */ |
@@ -540,6 +570,9 @@ ALT_FW_FTR_SECTION_END_IFCLR(FW_FEATURE_ISERIES) | |||
540 | rldicl r4,r3,49,63 /* r0 = (r3 >> 15) & 1 */ | 570 | rldicl r4,r3,49,63 /* r0 = (r3 >> 15) & 1 */ |
541 | stb r4,PACAHARDIRQEN(r13) | 571 | stb r4,PACAHARDIRQEN(r13) |
542 | 572 | ||
573 | #ifdef CONFIG_PPC_BOOK3E | ||
574 | b .exception_return_book3e | ||
575 | #else | ||
543 | ld r4,_CTR(r1) | 576 | ld r4,_CTR(r1) |
544 | ld r0,_LINK(r1) | 577 | ld r0,_LINK(r1) |
545 | mtctr r4 | 578 | mtctr r4 |
@@ -588,6 +621,8 @@ ALT_FW_FTR_SECTION_END_IFCLR(FW_FEATURE_ISERIES) | |||
588 | rfid | 621 | rfid |
589 | b . /* prevent speculative execution */ | 622 | b . /* prevent speculative execution */ |
590 | 623 | ||
624 | #endif /* CONFIG_PPC_BOOK3E */ | ||
625 | |||
591 | iseries_check_pending_irqs: | 626 | iseries_check_pending_irqs: |
592 | #ifdef CONFIG_PPC_ISERIES | 627 | #ifdef CONFIG_PPC_ISERIES |
593 | ld r5,SOFTE(r1) | 628 | ld r5,SOFTE(r1) |
@@ -638,6 +673,11 @@ do_work: | |||
638 | li r0,1 | 673 | li r0,1 |
639 | stb r0,PACASOFTIRQEN(r13) | 674 | stb r0,PACASOFTIRQEN(r13) |
640 | stb r0,PACAHARDIRQEN(r13) | 675 | stb r0,PACAHARDIRQEN(r13) |
676 | #ifdef CONFIG_PPC_BOOK3E | ||
677 | wrteei 1 | ||
678 | bl .preempt_schedule | ||
679 | wrteei 0 | ||
680 | #else | ||
641 | ori r10,r10,MSR_EE | 681 | ori r10,r10,MSR_EE |
642 | mtmsrd r10,1 /* reenable interrupts */ | 682 | mtmsrd r10,1 /* reenable interrupts */ |
643 | bl .preempt_schedule | 683 | bl .preempt_schedule |
@@ -646,6 +686,7 @@ do_work: | |||
646 | rldicl r10,r10,48,1 /* disable interrupts again */ | 686 | rldicl r10,r10,48,1 /* disable interrupts again */ |
647 | rotldi r10,r10,16 | 687 | rotldi r10,r10,16 |
648 | mtmsrd r10,1 | 688 | mtmsrd r10,1 |
689 | #endif /* CONFIG_PPC_BOOK3E */ | ||
649 | ld r4,TI_FLAGS(r9) | 690 | ld r4,TI_FLAGS(r9) |
650 | andi. r0,r4,_TIF_NEED_RESCHED | 691 | andi. r0,r4,_TIF_NEED_RESCHED |
651 | bne 1b | 692 | bne 1b |
@@ -654,8 +695,12 @@ do_work: | |||
654 | user_work: | 695 | user_work: |
655 | #endif | 696 | #endif |
656 | /* Enable interrupts */ | 697 | /* Enable interrupts */ |
698 | #ifdef CONFIG_PPC_BOOK3E | ||
699 | wrteei 1 | ||
700 | #else | ||
657 | ori r10,r10,MSR_EE | 701 | ori r10,r10,MSR_EE |
658 | mtmsrd r10,1 | 702 | mtmsrd r10,1 |
703 | #endif /* CONFIG_PPC_BOOK3E */ | ||
659 | 704 | ||
660 | andi. r0,r4,_TIF_NEED_RESCHED | 705 | andi. r0,r4,_TIF_NEED_RESCHED |
661 | beq 1f | 706 | beq 1f |
@@ -762,7 +807,7 @@ _GLOBAL(enter_rtas) | |||
762 | 807 | ||
763 | _STATIC(rtas_return_loc) | 808 | _STATIC(rtas_return_loc) |
764 | /* relocation is off at this point */ | 809 | /* relocation is off at this point */ |
765 | mfspr r4,SPRN_SPRG3 /* Get PACA */ | 810 | mfspr r4,SPRN_SPRG_PACA /* Get PACA */ |
766 | clrldi r4,r4,2 /* convert to realmode address */ | 811 | clrldi r4,r4,2 /* convert to realmode address */ |
767 | 812 | ||
768 | bcl 20,31,$+4 | 813 | bcl 20,31,$+4 |
@@ -793,7 +838,7 @@ _STATIC(rtas_restore_regs) | |||
793 | REST_8GPRS(14, r1) /* Restore the non-volatiles */ | 838 | REST_8GPRS(14, r1) /* Restore the non-volatiles */ |
794 | REST_10GPRS(22, r1) /* ditto */ | 839 | REST_10GPRS(22, r1) /* ditto */ |
795 | 840 | ||
796 | mfspr r13,SPRN_SPRG3 | 841 | mfspr r13,SPRN_SPRG_PACA |
797 | 842 | ||
798 | ld r4,_CCR(r1) | 843 | ld r4,_CCR(r1) |
799 | mtcr r4 | 844 | mtcr r4 |
@@ -823,33 +868,24 @@ _GLOBAL(enter_prom) | |||
823 | * of all registers that it saves. We therefore save those registers | 868 | * of all registers that it saves. We therefore save those registers |
824 | * PROM might touch to the stack. (r0, r3-r13 are caller saved) | 869 | * PROM might touch to the stack. (r0, r3-r13 are caller saved) |
825 | */ | 870 | */ |
826 | SAVE_8GPRS(2, r1) | 871 | SAVE_GPR(2, r1) |
827 | SAVE_GPR(13, r1) | 872 | SAVE_GPR(13, r1) |
828 | SAVE_8GPRS(14, r1) | 873 | SAVE_8GPRS(14, r1) |
829 | SAVE_10GPRS(22, r1) | 874 | SAVE_10GPRS(22, r1) |
830 | mfcr r4 | 875 | mfcr r10 |
831 | std r4,_CCR(r1) | ||
832 | mfctr r5 | ||
833 | std r5,_CTR(r1) | ||
834 | mfspr r6,SPRN_XER | ||
835 | std r6,_XER(r1) | ||
836 | mfdar r7 | ||
837 | std r7,_DAR(r1) | ||
838 | mfdsisr r8 | ||
839 | std r8,_DSISR(r1) | ||
840 | mfsrr0 r9 | ||
841 | std r9,_SRR0(r1) | ||
842 | mfsrr1 r10 | ||
843 | std r10,_SRR1(r1) | ||
844 | mfmsr r11 | 876 | mfmsr r11 |
877 | std r10,_CCR(r1) | ||
845 | std r11,_MSR(r1) | 878 | std r11,_MSR(r1) |
846 | 879 | ||
847 | /* Get the PROM entrypoint */ | 880 | /* Get the PROM entrypoint */ |
848 | ld r0,GPR4(r1) | 881 | mtlr r4 |
849 | mtlr r0 | ||
850 | 882 | ||
851 | /* Switch MSR to 32 bits mode | 883 | /* Switch MSR to 32 bits mode |
852 | */ | 884 | */ |
885 | #ifdef CONFIG_PPC_BOOK3E | ||
886 | rlwinm r11,r11,0,1,31 | ||
887 | mtmsr r11 | ||
888 | #else /* CONFIG_PPC_BOOK3E */ | ||
853 | mfmsr r11 | 889 | mfmsr r11 |
854 | li r12,1 | 890 | li r12,1 |
855 | rldicr r12,r12,MSR_SF_LG,(63-MSR_SF_LG) | 891 | rldicr r12,r12,MSR_SF_LG,(63-MSR_SF_LG) |
@@ -858,10 +894,10 @@ _GLOBAL(enter_prom) | |||
858 | rldicr r12,r12,MSR_ISF_LG,(63-MSR_ISF_LG) | 894 | rldicr r12,r12,MSR_ISF_LG,(63-MSR_ISF_LG) |
859 | andc r11,r11,r12 | 895 | andc r11,r11,r12 |
860 | mtmsrd r11 | 896 | mtmsrd r11 |
897 | #endif /* CONFIG_PPC_BOOK3E */ | ||
861 | isync | 898 | isync |
862 | 899 | ||
863 | /* Restore arguments & enter PROM here... */ | 900 | /* Enter PROM here... */ |
864 | ld r3,GPR3(r1) | ||
865 | blrl | 901 | blrl |
866 | 902 | ||
867 | /* Just make sure that r1 top 32 bits didn't get | 903 | /* Just make sure that r1 top 32 bits didn't get |
@@ -871,7 +907,7 @@ _GLOBAL(enter_prom) | |||
871 | 907 | ||
872 | /* Restore the MSR (back to 64 bits) */ | 908 | /* Restore the MSR (back to 64 bits) */ |
873 | ld r0,_MSR(r1) | 909 | ld r0,_MSR(r1) |
874 | mtmsrd r0 | 910 | MTMSRD(r0) |
875 | isync | 911 | isync |
876 | 912 | ||
877 | /* Restore other registers */ | 913 | /* Restore other registers */ |
@@ -881,18 +917,6 @@ _GLOBAL(enter_prom) | |||
881 | REST_10GPRS(22, r1) | 917 | REST_10GPRS(22, r1) |
882 | ld r4,_CCR(r1) | 918 | ld r4,_CCR(r1) |
883 | mtcr r4 | 919 | mtcr r4 |
884 | ld r5,_CTR(r1) | ||
885 | mtctr r5 | ||
886 | ld r6,_XER(r1) | ||
887 | mtspr SPRN_XER,r6 | ||
888 | ld r7,_DAR(r1) | ||
889 | mtdar r7 | ||
890 | ld r8,_DSISR(r1) | ||
891 | mtdsisr r8 | ||
892 | ld r9,_SRR0(r1) | ||
893 | mtsrr0 r9 | ||
894 | ld r10,_SRR1(r1) | ||
895 | mtsrr1 r10 | ||
896 | 920 | ||
897 | addi r1,r1,PROM_FRAME_SIZE | 921 | addi r1,r1,PROM_FRAME_SIZE |
898 | ld r0,16(r1) | 922 | ld r0,16(r1) |
diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S new file mode 100644 index 000000000000..695d4847d228 --- /dev/null +++ b/arch/powerpc/kernel/exceptions-64e.S | |||
@@ -0,0 +1,784 @@ | |||
1 | /* | ||
2 | * Boot code and exception vectors for Book3E processors | ||
3 | * | ||
4 | * Copyright (C) 2007 Ben. Herrenschmidt (benh@kernel.crashing.org), IBM Corp. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #include <linux/threads.h> | ||
13 | #include <asm/reg.h> | ||
14 | #include <asm/page.h> | ||
15 | #include <asm/ppc_asm.h> | ||
16 | #include <asm/asm-offsets.h> | ||
17 | #include <asm/cputable.h> | ||
18 | #include <asm/setup.h> | ||
19 | #include <asm/thread_info.h> | ||
20 | #include <asm/reg.h> | ||
21 | #include <asm/exception-64e.h> | ||
22 | #include <asm/bug.h> | ||
23 | #include <asm/irqflags.h> | ||
24 | #include <asm/ptrace.h> | ||
25 | #include <asm/ppc-opcode.h> | ||
26 | #include <asm/mmu.h> | ||
27 | |||
28 | /* XXX This will ultimately add space for a special exception save | ||
29 | * structure used to save things like SRR0/SRR1, SPRGs, MAS, etc... | ||
30 | * when taking special interrupts. For now we don't support that, | ||
31 | * special interrupts from within a non-standard level will probably | ||
32 | * blow you up | ||
33 | */ | ||
34 | #define SPECIAL_EXC_FRAME_SIZE INT_FRAME_SIZE | ||
35 | |||
36 | /* Exception prolog code for all exceptions */ | ||
37 | #define EXCEPTION_PROLOG(n, type, addition) \ | ||
38 | mtspr SPRN_SPRG_##type##_SCRATCH,r13; /* get spare registers */ \ | ||
39 | mfspr r13,SPRN_SPRG_PACA; /* get PACA */ \ | ||
40 | std r10,PACA_EX##type+EX_R10(r13); \ | ||
41 | std r11,PACA_EX##type+EX_R11(r13); \ | ||
42 | mfcr r10; /* save CR */ \ | ||
43 | addition; /* additional code for that exc. */ \ | ||
44 | std r1,PACA_EX##type+EX_R1(r13); /* save old r1 in the PACA */ \ | ||
45 | stw r10,PACA_EX##type+EX_CR(r13); /* save old CR in the PACA */ \ | ||
46 | mfspr r11,SPRN_##type##_SRR1;/* what are we coming from */ \ | ||
47 | type##_SET_KSTACK; /* get special stack if necessary */\ | ||
48 | andi. r10,r11,MSR_PR; /* save stack pointer */ \ | ||
49 | beq 1f; /* branch around if supervisor */ \ | ||
50 | ld r1,PACAKSAVE(r13); /* get kernel stack coming from usr */\ | ||
51 | 1: cmpdi cr1,r1,0; /* check if SP makes sense */ \ | ||
52 | bge- cr1,exc_##n##_bad_stack;/* bad stack (TODO: out of line) */ \ | ||
53 | mfspr r10,SPRN_##type##_SRR0; /* read SRR0 before touching stack */ | ||
54 | |||
55 | /* Exception type-specific macros */ | ||
56 | #define GEN_SET_KSTACK \ | ||
57 | subi r1,r1,INT_FRAME_SIZE; /* alloc frame on kernel stack */ | ||
58 | #define SPRN_GEN_SRR0 SPRN_SRR0 | ||
59 | #define SPRN_GEN_SRR1 SPRN_SRR1 | ||
60 | |||
61 | #define CRIT_SET_KSTACK \ | ||
62 | ld r1,PACA_CRIT_STACK(r13); \ | ||
63 | subi r1,r1,SPECIAL_EXC_FRAME_SIZE; | ||
64 | #define SPRN_CRIT_SRR0 SPRN_CSRR0 | ||
65 | #define SPRN_CRIT_SRR1 SPRN_CSRR1 | ||
66 | |||
67 | #define DBG_SET_KSTACK \ | ||
68 | ld r1,PACA_DBG_STACK(r13); \ | ||
69 | subi r1,r1,SPECIAL_EXC_FRAME_SIZE; | ||
70 | #define SPRN_DBG_SRR0 SPRN_DSRR0 | ||
71 | #define SPRN_DBG_SRR1 SPRN_DSRR1 | ||
72 | |||
73 | #define MC_SET_KSTACK \ | ||
74 | ld r1,PACA_MC_STACK(r13); \ | ||
75 | subi r1,r1,SPECIAL_EXC_FRAME_SIZE; | ||
76 | #define SPRN_MC_SRR0 SPRN_MCSRR0 | ||
77 | #define SPRN_MC_SRR1 SPRN_MCSRR1 | ||
78 | |||
79 | #define NORMAL_EXCEPTION_PROLOG(n, addition) \ | ||
80 | EXCEPTION_PROLOG(n, GEN, addition##_GEN) | ||
81 | |||
82 | #define CRIT_EXCEPTION_PROLOG(n, addition) \ | ||
83 | EXCEPTION_PROLOG(n, CRIT, addition##_CRIT) | ||
84 | |||
85 | #define DBG_EXCEPTION_PROLOG(n, addition) \ | ||
86 | EXCEPTION_PROLOG(n, DBG, addition##_DBG) | ||
87 | |||
88 | #define MC_EXCEPTION_PROLOG(n, addition) \ | ||
89 | EXCEPTION_PROLOG(n, MC, addition##_MC) | ||
90 | |||
91 | |||
92 | /* Variants of the "addition" argument for the prolog | ||
93 | */ | ||
94 | #define PROLOG_ADDITION_NONE_GEN | ||
95 | #define PROLOG_ADDITION_NONE_CRIT | ||
96 | #define PROLOG_ADDITION_NONE_DBG | ||
97 | #define PROLOG_ADDITION_NONE_MC | ||
98 | |||
99 | #define PROLOG_ADDITION_MASKABLE_GEN \ | ||
100 | lbz r11,PACASOFTIRQEN(r13); /* are irqs soft-disabled ? */ \ | ||
101 | cmpwi cr0,r11,0; /* yes -> go out of line */ \ | ||
102 | beq masked_interrupt_book3e; | ||
103 | |||
104 | #define PROLOG_ADDITION_2REGS_GEN \ | ||
105 | std r14,PACA_EXGEN+EX_R14(r13); \ | ||
106 | std r15,PACA_EXGEN+EX_R15(r13) | ||
107 | |||
108 | #define PROLOG_ADDITION_1REG_GEN \ | ||
109 | std r14,PACA_EXGEN+EX_R14(r13); | ||
110 | |||
111 | #define PROLOG_ADDITION_2REGS_CRIT \ | ||
112 | std r14,PACA_EXCRIT+EX_R14(r13); \ | ||
113 | std r15,PACA_EXCRIT+EX_R15(r13) | ||
114 | |||
115 | #define PROLOG_ADDITION_2REGS_DBG \ | ||
116 | std r14,PACA_EXDBG+EX_R14(r13); \ | ||
117 | std r15,PACA_EXDBG+EX_R15(r13) | ||
118 | |||
119 | #define PROLOG_ADDITION_2REGS_MC \ | ||
120 | std r14,PACA_EXMC+EX_R14(r13); \ | ||
121 | std r15,PACA_EXMC+EX_R15(r13) | ||
122 | |||
123 | /* Core exception code for all exceptions except TLB misses. | ||
124 | * XXX: Needs to make SPRN_SPRG_GEN depend on exception type | ||
125 | */ | ||
126 | #define EXCEPTION_COMMON(n, excf, ints) \ | ||
127 | std r0,GPR0(r1); /* save r0 in stackframe */ \ | ||
128 | std r2,GPR2(r1); /* save r2 in stackframe */ \ | ||
129 | SAVE_4GPRS(3, r1); /* save r3 - r6 in stackframe */ \ | ||
130 | SAVE_2GPRS(7, r1); /* save r7, r8 in stackframe */ \ | ||
131 | std r9,GPR9(r1); /* save r9 in stackframe */ \ | ||
132 | std r10,_NIP(r1); /* save SRR0 to stackframe */ \ | ||
133 | std r11,_MSR(r1); /* save SRR1 to stackframe */ \ | ||
134 | ACCOUNT_CPU_USER_ENTRY(r10,r11);/* accounting (uses cr0+eq) */ \ | ||
135 | ld r3,excf+EX_R10(r13); /* get back r10 */ \ | ||
136 | ld r4,excf+EX_R11(r13); /* get back r11 */ \ | ||
137 | mfspr r5,SPRN_SPRG_GEN_SCRATCH;/* get back r13 */ \ | ||
138 | std r12,GPR12(r1); /* save r12 in stackframe */ \ | ||
139 | ld r2,PACATOC(r13); /* get kernel TOC into r2 */ \ | ||
140 | mflr r6; /* save LR in stackframe */ \ | ||
141 | mfctr r7; /* save CTR in stackframe */ \ | ||
142 | mfspr r8,SPRN_XER; /* save XER in stackframe */ \ | ||
143 | ld r9,excf+EX_R1(r13); /* load orig r1 back from PACA */ \ | ||
144 | lwz r10,excf+EX_CR(r13); /* load orig CR back from PACA */ \ | ||
145 | lbz r11,PACASOFTIRQEN(r13); /* get current IRQ softe */ \ | ||
146 | ld r12,exception_marker@toc(r2); \ | ||
147 | li r0,0; \ | ||
148 | std r3,GPR10(r1); /* save r10 to stackframe */ \ | ||
149 | std r4,GPR11(r1); /* save r11 to stackframe */ \ | ||
150 | std r5,GPR13(r1); /* save it to stackframe */ \ | ||
151 | std r6,_LINK(r1); \ | ||
152 | std r7,_CTR(r1); \ | ||
153 | std r8,_XER(r1); \ | ||
154 | li r3,(n)+1; /* indicate partial regs in trap */ \ | ||
155 | std r9,0(r1); /* store stack frame back link */ \ | ||
156 | std r10,_CCR(r1); /* store orig CR in stackframe */ \ | ||
157 | std r9,GPR1(r1); /* store stack frame back link */ \ | ||
158 | std r11,SOFTE(r1); /* and save it to stackframe */ \ | ||
159 | std r12,STACK_FRAME_OVERHEAD-16(r1); /* mark the frame */ \ | ||
160 | std r3,_TRAP(r1); /* set trap number */ \ | ||
161 | std r0,RESULT(r1); /* clear regs->result */ \ | ||
162 | ints; | ||
163 | |||
164 | /* Variants for the "ints" argument */ | ||
165 | #define INTS_KEEP | ||
166 | #define INTS_DISABLE_SOFT \ | ||
167 | stb r0,PACASOFTIRQEN(r13); /* mark interrupts soft-disabled */ \ | ||
168 | TRACE_DISABLE_INTS; | ||
169 | #define INTS_DISABLE_HARD \ | ||
170 | stb r0,PACAHARDIRQEN(r13); /* and hard disabled */ | ||
171 | #define INTS_DISABLE_ALL \ | ||
172 | INTS_DISABLE_SOFT \ | ||
173 | INTS_DISABLE_HARD | ||
174 | |||
175 | /* This is called by exceptions that used INTS_KEEP (that is did not clear | ||
176 | * neither soft nor hard IRQ indicators in the PACA. This will restore MSR:EE | ||
177 | * to it's previous value | ||
178 | * | ||
179 | * XXX In the long run, we may want to open-code it in order to separate the | ||
180 | * load from the wrtee, thus limiting the latency caused by the dependency | ||
181 | * but at this point, I'll favor code clarity until we have a near to final | ||
182 | * implementation | ||
183 | */ | ||
184 | #define INTS_RESTORE_HARD \ | ||
185 | ld r11,_MSR(r1); \ | ||
186 | wrtee r11; | ||
187 | |||
188 | /* XXX FIXME: Restore r14/r15 when necessary */ | ||
189 | #define BAD_STACK_TRAMPOLINE(n) \ | ||
190 | exc_##n##_bad_stack: \ | ||
191 | li r1,(n); /* get exception number */ \ | ||
192 | sth r1,PACA_TRAP_SAVE(r13); /* store trap */ \ | ||
193 | b bad_stack_book3e; /* bad stack error */ | ||
194 | |||
195 | #define EXCEPTION_STUB(loc, label) \ | ||
196 | . = interrupt_base_book3e + loc; \ | ||
197 | nop; /* To make debug interrupts happy */ \ | ||
198 | b exc_##label##_book3e; | ||
199 | |||
200 | #define ACK_NONE(r) | ||
201 | #define ACK_DEC(r) \ | ||
202 | lis r,TSR_DIS@h; \ | ||
203 | mtspr SPRN_TSR,r | ||
204 | #define ACK_FIT(r) \ | ||
205 | lis r,TSR_FIS@h; \ | ||
206 | mtspr SPRN_TSR,r | ||
207 | |||
208 | #define MASKABLE_EXCEPTION(trapnum, label, hdlr, ack) \ | ||
209 | START_EXCEPTION(label); \ | ||
210 | NORMAL_EXCEPTION_PROLOG(trapnum, PROLOG_ADDITION_MASKABLE) \ | ||
211 | EXCEPTION_COMMON(trapnum, PACA_EXGEN, INTS_DISABLE_ALL) \ | ||
212 | ack(r8); \ | ||
213 | addi r3,r1,STACK_FRAME_OVERHEAD; \ | ||
214 | bl hdlr; \ | ||
215 | b .ret_from_except_lite; | ||
216 | |||
217 | /* This value is used to mark exception frames on the stack. */ | ||
218 | .section ".toc","aw" | ||
219 | exception_marker: | ||
220 | .tc ID_EXC_MARKER[TC],STACK_FRAME_REGS_MARKER | ||
221 | |||
222 | |||
223 | /* | ||
224 | * And here we have the exception vectors ! | ||
225 | */ | ||
226 | |||
227 | .text | ||
228 | .balign 0x1000 | ||
229 | .globl interrupt_base_book3e | ||
230 | interrupt_base_book3e: /* fake trap */ | ||
231 | /* Note: If real debug exceptions are supported by the HW, the vector | ||
232 | * below will have to be patched up to point to an appropriate handler | ||
233 | */ | ||
234 | EXCEPTION_STUB(0x000, machine_check) /* 0x0200 */ | ||
235 | EXCEPTION_STUB(0x020, critical_input) /* 0x0580 */ | ||
236 | EXCEPTION_STUB(0x040, debug_crit) /* 0x0d00 */ | ||
237 | EXCEPTION_STUB(0x060, data_storage) /* 0x0300 */ | ||
238 | EXCEPTION_STUB(0x080, instruction_storage) /* 0x0400 */ | ||
239 | EXCEPTION_STUB(0x0a0, external_input) /* 0x0500 */ | ||
240 | EXCEPTION_STUB(0x0c0, alignment) /* 0x0600 */ | ||
241 | EXCEPTION_STUB(0x0e0, program) /* 0x0700 */ | ||
242 | EXCEPTION_STUB(0x100, fp_unavailable) /* 0x0800 */ | ||
243 | EXCEPTION_STUB(0x120, system_call) /* 0x0c00 */ | ||
244 | EXCEPTION_STUB(0x140, ap_unavailable) /* 0x0f20 */ | ||
245 | EXCEPTION_STUB(0x160, decrementer) /* 0x0900 */ | ||
246 | EXCEPTION_STUB(0x180, fixed_interval) /* 0x0980 */ | ||
247 | EXCEPTION_STUB(0x1a0, watchdog) /* 0x09f0 */ | ||
248 | EXCEPTION_STUB(0x1c0, data_tlb_miss) | ||
249 | EXCEPTION_STUB(0x1e0, instruction_tlb_miss) | ||
250 | |||
251 | #if 0 | ||
252 | EXCEPTION_STUB(0x280, processor_doorbell) | ||
253 | EXCEPTION_STUB(0x220, processor_doorbell_crit) | ||
254 | #endif | ||
255 | .globl interrupt_end_book3e | ||
256 | interrupt_end_book3e: | ||
257 | |||
258 | /* Critical Input Interrupt */ | ||
259 | START_EXCEPTION(critical_input); | ||
260 | CRIT_EXCEPTION_PROLOG(0x100, PROLOG_ADDITION_NONE) | ||
261 | // EXCEPTION_COMMON(0x100, PACA_EXCRIT, INTS_DISABLE_ALL) | ||
262 | // bl special_reg_save_crit | ||
263 | // addi r3,r1,STACK_FRAME_OVERHEAD | ||
264 | // bl .critical_exception | ||
265 | // b ret_from_crit_except | ||
266 | b . | ||
267 | |||
268 | /* Machine Check Interrupt */ | ||
269 | START_EXCEPTION(machine_check); | ||
270 | CRIT_EXCEPTION_PROLOG(0x200, PROLOG_ADDITION_NONE) | ||
271 | // EXCEPTION_COMMON(0x200, PACA_EXMC, INTS_DISABLE_ALL) | ||
272 | // bl special_reg_save_mc | ||
273 | // addi r3,r1,STACK_FRAME_OVERHEAD | ||
274 | // bl .machine_check_exception | ||
275 | // b ret_from_mc_except | ||
276 | b . | ||
277 | |||
278 | /* Data Storage Interrupt */ | ||
279 | START_EXCEPTION(data_storage) | ||
280 | NORMAL_EXCEPTION_PROLOG(0x300, PROLOG_ADDITION_2REGS) | ||
281 | mfspr r14,SPRN_DEAR | ||
282 | mfspr r15,SPRN_ESR | ||
283 | EXCEPTION_COMMON(0x300, PACA_EXGEN, INTS_KEEP) | ||
284 | b storage_fault_common | ||
285 | |||
286 | /* Instruction Storage Interrupt */ | ||
287 | START_EXCEPTION(instruction_storage); | ||
288 | NORMAL_EXCEPTION_PROLOG(0x400, PROLOG_ADDITION_2REGS) | ||
289 | li r15,0 | ||
290 | mr r14,r10 | ||
291 | EXCEPTION_COMMON(0x400, PACA_EXGEN, INTS_KEEP) | ||
292 | b storage_fault_common | ||
293 | |||
294 | /* External Input Interrupt */ | ||
295 | MASKABLE_EXCEPTION(0x500, external_input, .do_IRQ, ACK_NONE) | ||
296 | |||
297 | /* Alignment */ | ||
298 | START_EXCEPTION(alignment); | ||
299 | NORMAL_EXCEPTION_PROLOG(0x600, PROLOG_ADDITION_2REGS) | ||
300 | mfspr r14,SPRN_DEAR | ||
301 | mfspr r15,SPRN_ESR | ||
302 | EXCEPTION_COMMON(0x600, PACA_EXGEN, INTS_KEEP) | ||
303 | b alignment_more /* no room, go out of line */ | ||
304 | |||
305 | /* Program Interrupt */ | ||
306 | START_EXCEPTION(program); | ||
307 | NORMAL_EXCEPTION_PROLOG(0x700, PROLOG_ADDITION_1REG) | ||
308 | mfspr r14,SPRN_ESR | ||
309 | EXCEPTION_COMMON(0x700, PACA_EXGEN, INTS_DISABLE_SOFT) | ||
310 | std r14,_DSISR(r1) | ||
311 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
312 | ld r14,PACA_EXGEN+EX_R14(r13) | ||
313 | bl .save_nvgprs | ||
314 | INTS_RESTORE_HARD | ||
315 | bl .program_check_exception | ||
316 | b .ret_from_except | ||
317 | |||
318 | /* Floating Point Unavailable Interrupt */ | ||
319 | START_EXCEPTION(fp_unavailable); | ||
320 | NORMAL_EXCEPTION_PROLOG(0x800, PROLOG_ADDITION_NONE) | ||
321 | /* we can probably do a shorter exception entry for that one... */ | ||
322 | EXCEPTION_COMMON(0x800, PACA_EXGEN, INTS_KEEP) | ||
323 | bne 1f /* if from user, just load it up */ | ||
324 | bl .save_nvgprs | ||
325 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
326 | INTS_RESTORE_HARD | ||
327 | bl .kernel_fp_unavailable_exception | ||
328 | BUG_OPCODE | ||
329 | 1: ld r12,_MSR(r1) | ||
330 | bl .load_up_fpu | ||
331 | b fast_exception_return | ||
332 | |||
333 | /* Decrementer Interrupt */ | ||
334 | MASKABLE_EXCEPTION(0x900, decrementer, .timer_interrupt, ACK_DEC) | ||
335 | |||
336 | /* Fixed Interval Timer Interrupt */ | ||
337 | MASKABLE_EXCEPTION(0x980, fixed_interval, .unknown_exception, ACK_FIT) | ||
338 | |||
339 | /* Watchdog Timer Interrupt */ | ||
340 | START_EXCEPTION(watchdog); | ||
341 | CRIT_EXCEPTION_PROLOG(0x9f0, PROLOG_ADDITION_NONE) | ||
342 | // EXCEPTION_COMMON(0x9f0, PACA_EXCRIT, INTS_DISABLE_ALL) | ||
343 | // bl special_reg_save_crit | ||
344 | // addi r3,r1,STACK_FRAME_OVERHEAD | ||
345 | // bl .unknown_exception | ||
346 | // b ret_from_crit_except | ||
347 | b . | ||
348 | |||
349 | /* System Call Interrupt */ | ||
350 | START_EXCEPTION(system_call) | ||
351 | mr r9,r13 /* keep a copy of userland r13 */ | ||
352 | mfspr r11,SPRN_SRR0 /* get return address */ | ||
353 | mfspr r12,SPRN_SRR1 /* get previous MSR */ | ||
354 | mfspr r13,SPRN_SPRG_PACA /* get our PACA */ | ||
355 | b system_call_common | ||
356 | |||
357 | /* Auxillary Processor Unavailable Interrupt */ | ||
358 | START_EXCEPTION(ap_unavailable); | ||
359 | NORMAL_EXCEPTION_PROLOG(0xf20, PROLOG_ADDITION_NONE) | ||
360 | EXCEPTION_COMMON(0xf20, PACA_EXGEN, INTS_KEEP) | ||
361 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
362 | bl .save_nvgprs | ||
363 | INTS_RESTORE_HARD | ||
364 | bl .unknown_exception | ||
365 | b .ret_from_except | ||
366 | |||
367 | /* Debug exception as a critical interrupt*/ | ||
368 | START_EXCEPTION(debug_crit); | ||
369 | CRIT_EXCEPTION_PROLOG(0xd00, PROLOG_ADDITION_2REGS) | ||
370 | |||
371 | /* | ||
372 | * If there is a single step or branch-taken exception in an | ||
373 | * exception entry sequence, it was probably meant to apply to | ||
374 | * the code where the exception occurred (since exception entry | ||
375 | * doesn't turn off DE automatically). We simulate the effect | ||
376 | * of turning off DE on entry to an exception handler by turning | ||
377 | * off DE in the CSRR1 value and clearing the debug status. | ||
378 | */ | ||
379 | |||
380 | mfspr r14,SPRN_DBSR /* check single-step/branch taken */ | ||
381 | andis. r15,r14,DBSR_IC@h | ||
382 | beq+ 1f | ||
383 | |||
384 | LOAD_REG_IMMEDIATE(r14,interrupt_base_book3e) | ||
385 | LOAD_REG_IMMEDIATE(r15,interrupt_end_book3e) | ||
386 | cmpld cr0,r10,r14 | ||
387 | cmpld cr1,r10,r15 | ||
388 | blt+ cr0,1f | ||
389 | bge+ cr1,1f | ||
390 | |||
391 | /* here it looks like we got an inappropriate debug exception. */ | ||
392 | lis r14,DBSR_IC@h /* clear the IC event */ | ||
393 | rlwinm r11,r11,0,~MSR_DE /* clear DE in the CSRR1 value */ | ||
394 | mtspr SPRN_DBSR,r14 | ||
395 | mtspr SPRN_CSRR1,r11 | ||
396 | lwz r10,PACA_EXCRIT+EX_CR(r13) /* restore registers */ | ||
397 | ld r1,PACA_EXCRIT+EX_R1(r13) | ||
398 | ld r14,PACA_EXCRIT+EX_R14(r13) | ||
399 | ld r15,PACA_EXCRIT+EX_R15(r13) | ||
400 | mtcr r10 | ||
401 | ld r10,PACA_EXCRIT+EX_R10(r13) /* restore registers */ | ||
402 | ld r11,PACA_EXCRIT+EX_R11(r13) | ||
403 | mfspr r13,SPRN_SPRG_CRIT_SCRATCH | ||
404 | rfci | ||
405 | |||
406 | /* Normal debug exception */ | ||
407 | /* XXX We only handle coming from userspace for now since we can't | ||
408 | * quite save properly an interrupted kernel state yet | ||
409 | */ | ||
410 | 1: andi. r14,r11,MSR_PR; /* check for userspace again */ | ||
411 | beq kernel_dbg_exc; /* if from kernel mode */ | ||
412 | |||
413 | /* Now we mash up things to make it look like we are coming on a | ||
414 | * normal exception | ||
415 | */ | ||
416 | mfspr r15,SPRN_SPRG_CRIT_SCRATCH | ||
417 | mtspr SPRN_SPRG_GEN_SCRATCH,r15 | ||
418 | mfspr r14,SPRN_DBSR | ||
419 | EXCEPTION_COMMON(0xd00, PACA_EXCRIT, INTS_DISABLE_ALL) | ||
420 | std r14,_DSISR(r1) | ||
421 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
422 | mr r4,r14 | ||
423 | ld r14,PACA_EXCRIT+EX_R14(r13) | ||
424 | ld r15,PACA_EXCRIT+EX_R15(r13) | ||
425 | bl .save_nvgprs | ||
426 | bl .DebugException | ||
427 | b .ret_from_except | ||
428 | |||
429 | kernel_dbg_exc: | ||
430 | b . /* NYI */ | ||
431 | |||
432 | |||
433 | /* | ||
434 | * An interrupt came in while soft-disabled; clear EE in SRR1, | ||
435 | * clear paca->hard_enabled and return. | ||
436 | */ | ||
437 | masked_interrupt_book3e: | ||
438 | mtcr r10 | ||
439 | stb r11,PACAHARDIRQEN(r13) | ||
440 | mfspr r10,SPRN_SRR1 | ||
441 | rldicl r11,r10,48,1 /* clear MSR_EE */ | ||
442 | rotldi r10,r11,16 | ||
443 | mtspr SPRN_SRR1,r10 | ||
444 | ld r10,PACA_EXGEN+EX_R10(r13); /* restore registers */ | ||
445 | ld r11,PACA_EXGEN+EX_R11(r13); | ||
446 | mfspr r13,SPRN_SPRG_GEN_SCRATCH; | ||
447 | rfi | ||
448 | b . | ||
449 | |||
450 | /* | ||
451 | * This is called from 0x300 and 0x400 handlers after the prologs with | ||
452 | * r14 and r15 containing the fault address and error code, with the | ||
453 | * original values stashed away in the PACA | ||
454 | */ | ||
455 | storage_fault_common: | ||
456 | std r14,_DAR(r1) | ||
457 | std r15,_DSISR(r1) | ||
458 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
459 | mr r4,r14 | ||
460 | mr r5,r15 | ||
461 | ld r14,PACA_EXGEN+EX_R14(r13) | ||
462 | ld r15,PACA_EXGEN+EX_R15(r13) | ||
463 | INTS_RESTORE_HARD | ||
464 | bl .do_page_fault | ||
465 | cmpdi r3,0 | ||
466 | bne- 1f | ||
467 | b .ret_from_except_lite | ||
468 | 1: bl .save_nvgprs | ||
469 | mr r5,r3 | ||
470 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
471 | ld r4,_DAR(r1) | ||
472 | bl .bad_page_fault | ||
473 | b .ret_from_except | ||
474 | |||
475 | /* | ||
476 | * Alignment exception doesn't fit entirely in the 0x100 bytes so it | ||
477 | * continues here. | ||
478 | */ | ||
479 | alignment_more: | ||
480 | std r14,_DAR(r1) | ||
481 | std r15,_DSISR(r1) | ||
482 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
483 | ld r14,PACA_EXGEN+EX_R14(r13) | ||
484 | ld r15,PACA_EXGEN+EX_R15(r13) | ||
485 | bl .save_nvgprs | ||
486 | INTS_RESTORE_HARD | ||
487 | bl .alignment_exception | ||
488 | b .ret_from_except | ||
489 | |||
490 | /* | ||
491 | * We branch here from entry_64.S for the last stage of the exception | ||
492 | * return code path. MSR:EE is expected to be off at that point | ||
493 | */ | ||
494 | _GLOBAL(exception_return_book3e) | ||
495 | b 1f | ||
496 | |||
497 | /* This is the return from load_up_fpu fast path which could do with | ||
498 | * less GPR restores in fact, but for now we have a single return path | ||
499 | */ | ||
500 | .globl fast_exception_return | ||
501 | fast_exception_return: | ||
502 | wrteei 0 | ||
503 | 1: mr r0,r13 | ||
504 | ld r10,_MSR(r1) | ||
505 | REST_4GPRS(2, r1) | ||
506 | andi. r6,r10,MSR_PR | ||
507 | REST_2GPRS(6, r1) | ||
508 | beq 1f | ||
509 | ACCOUNT_CPU_USER_EXIT(r10, r11) | ||
510 | ld r0,GPR13(r1) | ||
511 | |||
512 | 1: stdcx. r0,0,r1 /* to clear the reservation */ | ||
513 | |||
514 | ld r8,_CCR(r1) | ||
515 | ld r9,_LINK(r1) | ||
516 | ld r10,_CTR(r1) | ||
517 | ld r11,_XER(r1) | ||
518 | mtcr r8 | ||
519 | mtlr r9 | ||
520 | mtctr r10 | ||
521 | mtxer r11 | ||
522 | REST_2GPRS(8, r1) | ||
523 | ld r10,GPR10(r1) | ||
524 | ld r11,GPR11(r1) | ||
525 | ld r12,GPR12(r1) | ||
526 | mtspr SPRN_SPRG_GEN_SCRATCH,r0 | ||
527 | |||
528 | std r10,PACA_EXGEN+EX_R10(r13); | ||
529 | std r11,PACA_EXGEN+EX_R11(r13); | ||
530 | ld r10,_NIP(r1) | ||
531 | ld r11,_MSR(r1) | ||
532 | ld r0,GPR0(r1) | ||
533 | ld r1,GPR1(r1) | ||
534 | mtspr SPRN_SRR0,r10 | ||
535 | mtspr SPRN_SRR1,r11 | ||
536 | ld r10,PACA_EXGEN+EX_R10(r13) | ||
537 | ld r11,PACA_EXGEN+EX_R11(r13) | ||
538 | mfspr r13,SPRN_SPRG_GEN_SCRATCH | ||
539 | rfi | ||
540 | |||
541 | /* | ||
542 | * Trampolines used when spotting a bad kernel stack pointer in | ||
543 | * the exception entry code. | ||
544 | * | ||
545 | * TODO: move some bits like SRR0 read to trampoline, pass PACA | ||
546 | * index around, etc... to handle crit & mcheck | ||
547 | */ | ||
548 | BAD_STACK_TRAMPOLINE(0x000) | ||
549 | BAD_STACK_TRAMPOLINE(0x100) | ||
550 | BAD_STACK_TRAMPOLINE(0x200) | ||
551 | BAD_STACK_TRAMPOLINE(0x300) | ||
552 | BAD_STACK_TRAMPOLINE(0x400) | ||
553 | BAD_STACK_TRAMPOLINE(0x500) | ||
554 | BAD_STACK_TRAMPOLINE(0x600) | ||
555 | BAD_STACK_TRAMPOLINE(0x700) | ||
556 | BAD_STACK_TRAMPOLINE(0x800) | ||
557 | BAD_STACK_TRAMPOLINE(0x900) | ||
558 | BAD_STACK_TRAMPOLINE(0x980) | ||
559 | BAD_STACK_TRAMPOLINE(0x9f0) | ||
560 | BAD_STACK_TRAMPOLINE(0xa00) | ||
561 | BAD_STACK_TRAMPOLINE(0xb00) | ||
562 | BAD_STACK_TRAMPOLINE(0xc00) | ||
563 | BAD_STACK_TRAMPOLINE(0xd00) | ||
564 | BAD_STACK_TRAMPOLINE(0xe00) | ||
565 | BAD_STACK_TRAMPOLINE(0xf00) | ||
566 | BAD_STACK_TRAMPOLINE(0xf20) | ||
567 | |||
568 | .globl bad_stack_book3e | ||
569 | bad_stack_book3e: | ||
570 | /* XXX: Needs to make SPRN_SPRG_GEN depend on exception type */ | ||
571 | mfspr r10,SPRN_SRR0; /* read SRR0 before touching stack */ | ||
572 | ld r1,PACAEMERGSP(r13) | ||
573 | subi r1,r1,64+INT_FRAME_SIZE | ||
574 | std r10,_NIP(r1) | ||
575 | std r11,_MSR(r1) | ||
576 | ld r10,PACA_EXGEN+EX_R1(r13) /* FIXME for crit & mcheck */ | ||
577 | lwz r11,PACA_EXGEN+EX_CR(r13) /* FIXME for crit & mcheck */ | ||
578 | std r10,GPR1(r1) | ||
579 | std r11,_CCR(r1) | ||
580 | mfspr r10,SPRN_DEAR | ||
581 | mfspr r11,SPRN_ESR | ||
582 | std r10,_DAR(r1) | ||
583 | std r11,_DSISR(r1) | ||
584 | std r0,GPR0(r1); /* save r0 in stackframe */ \ | ||
585 | std r2,GPR2(r1); /* save r2 in stackframe */ \ | ||
586 | SAVE_4GPRS(3, r1); /* save r3 - r6 in stackframe */ \ | ||
587 | SAVE_2GPRS(7, r1); /* save r7, r8 in stackframe */ \ | ||
588 | std r9,GPR9(r1); /* save r9 in stackframe */ \ | ||
589 | ld r3,PACA_EXGEN+EX_R10(r13);/* get back r10 */ \ | ||
590 | ld r4,PACA_EXGEN+EX_R11(r13);/* get back r11 */ \ | ||
591 | mfspr r5,SPRN_SPRG_GEN_SCRATCH;/* get back r13 XXX can be wrong */ \ | ||
592 | std r3,GPR10(r1); /* save r10 to stackframe */ \ | ||
593 | std r4,GPR11(r1); /* save r11 to stackframe */ \ | ||
594 | std r12,GPR12(r1); /* save r12 in stackframe */ \ | ||
595 | std r5,GPR13(r1); /* save it to stackframe */ \ | ||
596 | mflr r10 | ||
597 | mfctr r11 | ||
598 | mfxer r12 | ||
599 | std r10,_LINK(r1) | ||
600 | std r11,_CTR(r1) | ||
601 | std r12,_XER(r1) | ||
602 | SAVE_10GPRS(14,r1) | ||
603 | SAVE_8GPRS(24,r1) | ||
604 | lhz r12,PACA_TRAP_SAVE(r13) | ||
605 | std r12,_TRAP(r1) | ||
606 | addi r11,r1,INT_FRAME_SIZE | ||
607 | std r11,0(r1) | ||
608 | li r12,0 | ||
609 | std r12,0(r11) | ||
610 | ld r2,PACATOC(r13) | ||
611 | 1: addi r3,r1,STACK_FRAME_OVERHEAD | ||
612 | bl .kernel_bad_stack | ||
613 | b 1b | ||
614 | |||
615 | /* | ||
616 | * Setup the initial TLB for a core. This current implementation | ||
617 | * assume that whatever we are running off will not conflict with | ||
618 | * the new mapping at PAGE_OFFSET. | ||
619 | * We also make various assumptions about the processor we run on, | ||
620 | * this might have to be made more flexible based on the content | ||
621 | * of MMUCFG and friends. | ||
622 | */ | ||
623 | _GLOBAL(initial_tlb_book3e) | ||
624 | |||
625 | /* Setup MAS 0,1,2,3 and 7 for tlbwe of a 1G entry that maps the | ||
626 | * kernel linear mapping. We also set MAS8 once for all here though | ||
627 | * that will have to be made dependent on whether we are running under | ||
628 | * a hypervisor I suppose. | ||
629 | */ | ||
630 | li r3,MAS0_HES | MAS0_WQ_ALLWAYS | ||
631 | mtspr SPRN_MAS0,r3 | ||
632 | lis r3,(MAS1_VALID | MAS1_IPROT)@h | ||
633 | ori r3,r3,BOOK3E_PAGESZ_1GB << MAS1_TSIZE_SHIFT | ||
634 | mtspr SPRN_MAS1,r3 | ||
635 | LOAD_REG_IMMEDIATE(r3, PAGE_OFFSET | MAS2_M) | ||
636 | mtspr SPRN_MAS2,r3 | ||
637 | li r3,MAS3_SR | MAS3_SW | MAS3_SX | ||
638 | mtspr SPRN_MAS7_MAS3,r3 | ||
639 | li r3,0 | ||
640 | mtspr SPRN_MAS8,r3 | ||
641 | |||
642 | /* Write the TLB entry */ | ||
643 | tlbwe | ||
644 | |||
645 | /* Now we branch the new virtual address mapped by this entry */ | ||
646 | LOAD_REG_IMMEDIATE(r3,1f) | ||
647 | mtctr r3 | ||
648 | bctr | ||
649 | |||
650 | 1: /* We are now running at PAGE_OFFSET, clean the TLB of everything | ||
651 | * else (XXX we should scan for bolted crap from the firmware too) | ||
652 | */ | ||
653 | PPC_TLBILX(0,0,0) | ||
654 | sync | ||
655 | isync | ||
656 | |||
657 | /* We translate LR and return */ | ||
658 | mflr r3 | ||
659 | tovirt(r3,r3) | ||
660 | mtlr r3 | ||
661 | blr | ||
662 | |||
663 | /* | ||
664 | * Main entry (boot CPU, thread 0) | ||
665 | * | ||
666 | * We enter here from head_64.S, possibly after the prom_init trampoline | ||
667 | * with r3 and r4 already saved to r31 and 30 respectively and in 64 bits | ||
668 | * mode. Anything else is as it was left by the bootloader | ||
669 | * | ||
670 | * Initial requirements of this port: | ||
671 | * | ||
672 | * - Kernel loaded at 0 physical | ||
673 | * - A good lump of memory mapped 0:0 by UTLB entry 0 | ||
674 | * - MSR:IS & MSR:DS set to 0 | ||
675 | * | ||
676 | * Note that some of the above requirements will be relaxed in the future | ||
677 | * as the kernel becomes smarter at dealing with different initial conditions | ||
678 | * but for now you have to be careful | ||
679 | */ | ||
680 | _GLOBAL(start_initialization_book3e) | ||
681 | mflr r28 | ||
682 | |||
683 | /* First, we need to setup some initial TLBs to map the kernel | ||
684 | * text, data and bss at PAGE_OFFSET. We don't have a real mode | ||
685 | * and always use AS 0, so we just set it up to match our link | ||
686 | * address and never use 0 based addresses. | ||
687 | */ | ||
688 | bl .initial_tlb_book3e | ||
689 | |||
690 | /* Init global core bits */ | ||
691 | bl .init_core_book3e | ||
692 | |||
693 | /* Init per-thread bits */ | ||
694 | bl .init_thread_book3e | ||
695 | |||
696 | /* Return to common init code */ | ||
697 | tovirt(r28,r28) | ||
698 | mtlr r28 | ||
699 | blr | ||
700 | |||
701 | |||
702 | /* | ||
703 | * Secondary core/processor entry | ||
704 | * | ||
705 | * This is entered for thread 0 of a secondary core, all other threads | ||
706 | * are expected to be stopped. It's similar to start_initialization_book3e | ||
707 | * except that it's generally entered from the holding loop in head_64.S | ||
708 | * after CPUs have been gathered by Open Firmware. | ||
709 | * | ||
710 | * We assume we are in 32 bits mode running with whatever TLB entry was | ||
711 | * set for us by the firmware or POR engine. | ||
712 | */ | ||
713 | _GLOBAL(book3e_secondary_core_init_tlb_set) | ||
714 | li r4,1 | ||
715 | b .generic_secondary_smp_init | ||
716 | |||
717 | _GLOBAL(book3e_secondary_core_init) | ||
718 | mflr r28 | ||
719 | |||
720 | /* Do we need to setup initial TLB entry ? */ | ||
721 | cmplwi r4,0 | ||
722 | bne 2f | ||
723 | |||
724 | /* Setup TLB for this core */ | ||
725 | bl .initial_tlb_book3e | ||
726 | |||
727 | /* We can return from the above running at a different | ||
728 | * address, so recalculate r2 (TOC) | ||
729 | */ | ||
730 | bl .relative_toc | ||
731 | |||
732 | /* Init global core bits */ | ||
733 | 2: bl .init_core_book3e | ||
734 | |||
735 | /* Init per-thread bits */ | ||
736 | 3: bl .init_thread_book3e | ||
737 | |||
738 | /* Return to common init code at proper virtual address. | ||
739 | * | ||
740 | * Due to various previous assumptions, we know we entered this | ||
741 | * function at either the final PAGE_OFFSET mapping or using a | ||
742 | * 1:1 mapping at 0, so we don't bother doing a complicated check | ||
743 | * here, we just ensure the return address has the right top bits. | ||
744 | * | ||
745 | * Note that if we ever want to be smarter about where we can be | ||
746 | * started from, we have to be careful that by the time we reach | ||
747 | * the code below we may already be running at a different location | ||
748 | * than the one we were called from since initial_tlb_book3e can | ||
749 | * have moved us already. | ||
750 | */ | ||
751 | cmpdi cr0,r28,0 | ||
752 | blt 1f | ||
753 | lis r3,PAGE_OFFSET@highest | ||
754 | sldi r3,r3,32 | ||
755 | or r28,r28,r3 | ||
756 | 1: mtlr r28 | ||
757 | blr | ||
758 | |||
759 | _GLOBAL(book3e_secondary_thread_init) | ||
760 | mflr r28 | ||
761 | b 3b | ||
762 | |||
763 | _STATIC(init_core_book3e) | ||
764 | /* Establish the interrupt vector base */ | ||
765 | LOAD_REG_IMMEDIATE(r3, interrupt_base_book3e) | ||
766 | mtspr SPRN_IVPR,r3 | ||
767 | sync | ||
768 | blr | ||
769 | |||
770 | _STATIC(init_thread_book3e) | ||
771 | lis r3,(SPRN_EPCR_ICM | SPRN_EPCR_GICM)@h | ||
772 | mtspr SPRN_EPCR,r3 | ||
773 | |||
774 | /* Make sure interrupts are off */ | ||
775 | wrteei 0 | ||
776 | |||
777 | /* disable watchdog and FIT and enable DEC interrupts */ | ||
778 | lis r3,TCR_DIE@h | ||
779 | mtspr SPRN_TCR,r3 | ||
780 | |||
781 | blr | ||
782 | |||
783 | |||
784 | |||
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index 8ac85e08ffae..1808876edcc9 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
@@ -12,6 +12,8 @@ | |||
12 | * | 12 | * |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <asm/exception-64s.h> | ||
16 | |||
15 | /* | 17 | /* |
16 | * We layout physical memory as follows: | 18 | * We layout physical memory as follows: |
17 | * 0x0000 - 0x00ff : Secondary processor spin code | 19 | * 0x0000 - 0x00ff : Secondary processor spin code |
@@ -22,18 +24,6 @@ | |||
22 | * 0x8000 - : Early init and support code | 24 | * 0x8000 - : Early init and support code |
23 | */ | 25 | */ |
24 | 26 | ||
25 | |||
26 | /* | ||
27 | * SPRG Usage | ||
28 | * | ||
29 | * Register Definition | ||
30 | * | ||
31 | * SPRG0 reserved for hypervisor | ||
32 | * SPRG1 temp - used to save gpr | ||
33 | * SPRG2 temp - used to save gpr | ||
34 | * SPRG3 virt addr of paca | ||
35 | */ | ||
36 | |||
37 | /* | 27 | /* |
38 | * This is the start of the interrupt handlers for pSeries | 28 | * This is the start of the interrupt handlers for pSeries |
39 | * This code runs with relocation off. | 29 | * This code runs with relocation off. |
@@ -51,34 +41,44 @@ __start_interrupts: | |||
51 | . = 0x200 | 41 | . = 0x200 |
52 | _machine_check_pSeries: | 42 | _machine_check_pSeries: |
53 | HMT_MEDIUM | 43 | HMT_MEDIUM |
54 | mtspr SPRN_SPRG1,r13 /* save r13 */ | 44 | mtspr SPRN_SPRG_SCRATCH0,r13 /* save r13 */ |
55 | EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common) | 45 | EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common) |
56 | 46 | ||
57 | . = 0x300 | 47 | . = 0x300 |
58 | .globl data_access_pSeries | 48 | .globl data_access_pSeries |
59 | data_access_pSeries: | 49 | data_access_pSeries: |
60 | HMT_MEDIUM | 50 | HMT_MEDIUM |
61 | mtspr SPRN_SPRG1,r13 | 51 | mtspr SPRN_SPRG_SCRATCH0,r13 |
62 | BEGIN_FTR_SECTION | 52 | BEGIN_FTR_SECTION |
63 | mtspr SPRN_SPRG2,r12 | 53 | mfspr r13,SPRN_SPRG_PACA |
64 | mfspr r13,SPRN_DAR | 54 | std r9,PACA_EXSLB+EX_R9(r13) |
65 | mfspr r12,SPRN_DSISR | 55 | std r10,PACA_EXSLB+EX_R10(r13) |
66 | srdi r13,r13,60 | 56 | mfspr r10,SPRN_DAR |
67 | rlwimi r13,r12,16,0x20 | 57 | mfspr r9,SPRN_DSISR |
68 | mfcr r12 | 58 | srdi r10,r10,60 |
69 | cmpwi r13,0x2c | 59 | rlwimi r10,r9,16,0x20 |
60 | mfcr r9 | ||
61 | cmpwi r10,0x2c | ||
70 | beq do_stab_bolted_pSeries | 62 | beq do_stab_bolted_pSeries |
71 | mtcrf 0x80,r12 | 63 | ld r10,PACA_EXSLB+EX_R10(r13) |
72 | mfspr r12,SPRN_SPRG2 | 64 | std r11,PACA_EXGEN+EX_R11(r13) |
73 | END_FTR_SECTION_IFCLR(CPU_FTR_SLB) | 65 | ld r11,PACA_EXSLB+EX_R9(r13) |
66 | std r12,PACA_EXGEN+EX_R12(r13) | ||
67 | mfspr r12,SPRN_SPRG_SCRATCH0 | ||
68 | std r10,PACA_EXGEN+EX_R10(r13) | ||
69 | std r11,PACA_EXGEN+EX_R9(r13) | ||
70 | std r12,PACA_EXGEN+EX_R13(r13) | ||
71 | EXCEPTION_PROLOG_PSERIES_1(data_access_common) | ||
72 | FTR_SECTION_ELSE | ||
74 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, data_access_common) | 73 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, data_access_common) |
74 | ALT_FTR_SECTION_END_IFCLR(CPU_FTR_SLB) | ||
75 | 75 | ||
76 | . = 0x380 | 76 | . = 0x380 |
77 | .globl data_access_slb_pSeries | 77 | .globl data_access_slb_pSeries |
78 | data_access_slb_pSeries: | 78 | data_access_slb_pSeries: |
79 | HMT_MEDIUM | 79 | HMT_MEDIUM |
80 | mtspr SPRN_SPRG1,r13 | 80 | mtspr SPRN_SPRG_SCRATCH0,r13 |
81 | mfspr r13,SPRN_SPRG3 /* get paca address into r13 */ | 81 | mfspr r13,SPRN_SPRG_PACA /* get paca address into r13 */ |
82 | std r3,PACA_EXSLB+EX_R3(r13) | 82 | std r3,PACA_EXSLB+EX_R3(r13) |
83 | mfspr r3,SPRN_DAR | 83 | mfspr r3,SPRN_DAR |
84 | std r9,PACA_EXSLB+EX_R9(r13) /* save r9 - r12 */ | 84 | std r9,PACA_EXSLB+EX_R9(r13) /* save r9 - r12 */ |
@@ -91,7 +91,7 @@ data_access_slb_pSeries: | |||
91 | std r10,PACA_EXSLB+EX_R10(r13) | 91 | std r10,PACA_EXSLB+EX_R10(r13) |
92 | std r11,PACA_EXSLB+EX_R11(r13) | 92 | std r11,PACA_EXSLB+EX_R11(r13) |
93 | std r12,PACA_EXSLB+EX_R12(r13) | 93 | std r12,PACA_EXSLB+EX_R12(r13) |
94 | mfspr r10,SPRN_SPRG1 | 94 | mfspr r10,SPRN_SPRG_SCRATCH0 |
95 | std r10,PACA_EXSLB+EX_R13(r13) | 95 | std r10,PACA_EXSLB+EX_R13(r13) |
96 | mfspr r12,SPRN_SRR1 /* and SRR1 */ | 96 | mfspr r12,SPRN_SRR1 /* and SRR1 */ |
97 | #ifndef CONFIG_RELOCATABLE | 97 | #ifndef CONFIG_RELOCATABLE |
@@ -115,8 +115,8 @@ data_access_slb_pSeries: | |||
115 | .globl instruction_access_slb_pSeries | 115 | .globl instruction_access_slb_pSeries |
116 | instruction_access_slb_pSeries: | 116 | instruction_access_slb_pSeries: |
117 | HMT_MEDIUM | 117 | HMT_MEDIUM |
118 | mtspr SPRN_SPRG1,r13 | 118 | mtspr SPRN_SPRG_SCRATCH0,r13 |
119 | mfspr r13,SPRN_SPRG3 /* get paca address into r13 */ | 119 | mfspr r13,SPRN_SPRG_PACA /* get paca address into r13 */ |
120 | std r3,PACA_EXSLB+EX_R3(r13) | 120 | std r3,PACA_EXSLB+EX_R3(r13) |
121 | mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */ | 121 | mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */ |
122 | std r9,PACA_EXSLB+EX_R9(r13) /* save r9 - r12 */ | 122 | std r9,PACA_EXSLB+EX_R9(r13) /* save r9 - r12 */ |
@@ -129,7 +129,7 @@ instruction_access_slb_pSeries: | |||
129 | std r10,PACA_EXSLB+EX_R10(r13) | 129 | std r10,PACA_EXSLB+EX_R10(r13) |
130 | std r11,PACA_EXSLB+EX_R11(r13) | 130 | std r11,PACA_EXSLB+EX_R11(r13) |
131 | std r12,PACA_EXSLB+EX_R12(r13) | 131 | std r12,PACA_EXSLB+EX_R12(r13) |
132 | mfspr r10,SPRN_SPRG1 | 132 | mfspr r10,SPRN_SPRG_SCRATCH0 |
133 | std r10,PACA_EXSLB+EX_R13(r13) | 133 | std r10,PACA_EXSLB+EX_R13(r13) |
134 | mfspr r12,SPRN_SRR1 /* and SRR1 */ | 134 | mfspr r12,SPRN_SRR1 /* and SRR1 */ |
135 | #ifndef CONFIG_RELOCATABLE | 135 | #ifndef CONFIG_RELOCATABLE |
@@ -159,7 +159,7 @@ BEGIN_FTR_SECTION | |||
159 | beq- 1f | 159 | beq- 1f |
160 | END_FTR_SECTION_IFSET(CPU_FTR_REAL_LE) | 160 | END_FTR_SECTION_IFSET(CPU_FTR_REAL_LE) |
161 | mr r9,r13 | 161 | mr r9,r13 |
162 | mfspr r13,SPRN_SPRG3 | 162 | mfspr r13,SPRN_SPRG_PACA |
163 | mfspr r11,SPRN_SRR0 | 163 | mfspr r11,SPRN_SRR0 |
164 | ld r12,PACAKBASE(r13) | 164 | ld r12,PACAKBASE(r13) |
165 | ld r10,PACAKMSR(r13) | 165 | ld r10,PACAKMSR(r13) |
@@ -228,15 +228,17 @@ masked_interrupt: | |||
228 | rotldi r10,r10,16 | 228 | rotldi r10,r10,16 |
229 | mtspr SPRN_SRR1,r10 | 229 | mtspr SPRN_SRR1,r10 |
230 | ld r10,PACA_EXGEN+EX_R10(r13) | 230 | ld r10,PACA_EXGEN+EX_R10(r13) |
231 | mfspr r13,SPRN_SPRG1 | 231 | mfspr r13,SPRN_SPRG_SCRATCH0 |
232 | rfid | 232 | rfid |
233 | b . | 233 | b . |
234 | 234 | ||
235 | .align 7 | 235 | .align 7 |
236 | do_stab_bolted_pSeries: | 236 | do_stab_bolted_pSeries: |
237 | mtcrf 0x80,r12 | 237 | std r11,PACA_EXSLB+EX_R11(r13) |
238 | mfspr r12,SPRN_SPRG2 | 238 | std r12,PACA_EXSLB+EX_R12(r13) |
239 | EXCEPTION_PROLOG_PSERIES(PACA_EXSLB, .do_stab_bolted) | 239 | mfspr r10,SPRN_SPRG_SCRATCH0 |
240 | std r10,PACA_EXSLB+EX_R13(r13) | ||
241 | EXCEPTION_PROLOG_PSERIES_1(.do_stab_bolted) | ||
240 | 242 | ||
241 | #ifdef CONFIG_PPC_PSERIES | 243 | #ifdef CONFIG_PPC_PSERIES |
242 | /* | 244 | /* |
@@ -246,14 +248,14 @@ do_stab_bolted_pSeries: | |||
246 | .align 7 | 248 | .align 7 |
247 | system_reset_fwnmi: | 249 | system_reset_fwnmi: |
248 | HMT_MEDIUM | 250 | HMT_MEDIUM |
249 | mtspr SPRN_SPRG1,r13 /* save r13 */ | 251 | mtspr SPRN_SPRG_SCRATCH0,r13 /* save r13 */ |
250 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common) | 252 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common) |
251 | 253 | ||
252 | .globl machine_check_fwnmi | 254 | .globl machine_check_fwnmi |
253 | .align 7 | 255 | .align 7 |
254 | machine_check_fwnmi: | 256 | machine_check_fwnmi: |
255 | HMT_MEDIUM | 257 | HMT_MEDIUM |
256 | mtspr SPRN_SPRG1,r13 /* save r13 */ | 258 | mtspr SPRN_SPRG_SCRATCH0,r13 /* save r13 */ |
257 | EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common) | 259 | EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common) |
258 | 260 | ||
259 | #endif /* CONFIG_PPC_PSERIES */ | 261 | #endif /* CONFIG_PPC_PSERIES */ |
@@ -268,7 +270,7 @@ slb_miss_user_pseries: | |||
268 | std r10,PACA_EXGEN+EX_R10(r13) | 270 | std r10,PACA_EXGEN+EX_R10(r13) |
269 | std r11,PACA_EXGEN+EX_R11(r13) | 271 | std r11,PACA_EXGEN+EX_R11(r13) |
270 | std r12,PACA_EXGEN+EX_R12(r13) | 272 | std r12,PACA_EXGEN+EX_R12(r13) |
271 | mfspr r10,SPRG1 | 273 | mfspr r10,SPRG_SCRATCH0 |
272 | ld r11,PACA_EXSLB+EX_R9(r13) | 274 | ld r11,PACA_EXSLB+EX_R9(r13) |
273 | ld r12,PACA_EXSLB+EX_R3(r13) | 275 | ld r12,PACA_EXSLB+EX_R3(r13) |
274 | std r10,PACA_EXGEN+EX_R13(r13) | 276 | std r10,PACA_EXGEN+EX_R13(r13) |
diff --git a/arch/powerpc/kernel/fpu.S b/arch/powerpc/kernel/fpu.S index 2436df33c6f4..fc8f5b14019c 100644 --- a/arch/powerpc/kernel/fpu.S +++ b/arch/powerpc/kernel/fpu.S | |||
@@ -91,7 +91,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX) | |||
91 | #endif /* CONFIG_SMP */ | 91 | #endif /* CONFIG_SMP */ |
92 | /* enable use of FP after return */ | 92 | /* enable use of FP after return */ |
93 | #ifdef CONFIG_PPC32 | 93 | #ifdef CONFIG_PPC32 |
94 | mfspr r5,SPRN_SPRG3 /* current task's THREAD (phys) */ | 94 | mfspr r5,SPRN_SPRG_THREAD /* current task's THREAD (phys) */ |
95 | lwz r4,THREAD_FPEXC_MODE(r5) | 95 | lwz r4,THREAD_FPEXC_MODE(r5) |
96 | ori r9,r9,MSR_FP /* enable FP for current */ | 96 | ori r9,r9,MSR_FP /* enable FP for current */ |
97 | or r9,r9,r4 | 97 | or r9,r9,r4 |
diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S index fc2132942754..829c3fe7c5a2 100644 --- a/arch/powerpc/kernel/head_32.S +++ b/arch/powerpc/kernel/head_32.S | |||
@@ -244,8 +244,8 @@ __secondary_hold_acknowledge: | |||
244 | * task's thread_struct. | 244 | * task's thread_struct. |
245 | */ | 245 | */ |
246 | #define EXCEPTION_PROLOG \ | 246 | #define EXCEPTION_PROLOG \ |
247 | mtspr SPRN_SPRG0,r10; \ | 247 | mtspr SPRN_SPRG_SCRATCH0,r10; \ |
248 | mtspr SPRN_SPRG1,r11; \ | 248 | mtspr SPRN_SPRG_SCRATCH1,r11; \ |
249 | mfcr r10; \ | 249 | mfcr r10; \ |
250 | EXCEPTION_PROLOG_1; \ | 250 | EXCEPTION_PROLOG_1; \ |
251 | EXCEPTION_PROLOG_2 | 251 | EXCEPTION_PROLOG_2 |
@@ -255,7 +255,7 @@ __secondary_hold_acknowledge: | |||
255 | andi. r11,r11,MSR_PR; \ | 255 | andi. r11,r11,MSR_PR; \ |
256 | tophys(r11,r1); /* use tophys(r1) if kernel */ \ | 256 | tophys(r11,r1); /* use tophys(r1) if kernel */ \ |
257 | beq 1f; \ | 257 | beq 1f; \ |
258 | mfspr r11,SPRN_SPRG3; \ | 258 | mfspr r11,SPRN_SPRG_THREAD; \ |
259 | lwz r11,THREAD_INFO-THREAD(r11); \ | 259 | lwz r11,THREAD_INFO-THREAD(r11); \ |
260 | addi r11,r11,THREAD_SIZE; \ | 260 | addi r11,r11,THREAD_SIZE; \ |
261 | tophys(r11,r11); \ | 261 | tophys(r11,r11); \ |
@@ -267,9 +267,9 @@ __secondary_hold_acknowledge: | |||
267 | stw r10,_CCR(r11); /* save registers */ \ | 267 | stw r10,_CCR(r11); /* save registers */ \ |
268 | stw r12,GPR12(r11); \ | 268 | stw r12,GPR12(r11); \ |
269 | stw r9,GPR9(r11); \ | 269 | stw r9,GPR9(r11); \ |
270 | mfspr r10,SPRN_SPRG0; \ | 270 | mfspr r10,SPRN_SPRG_SCRATCH0; \ |
271 | stw r10,GPR10(r11); \ | 271 | stw r10,GPR10(r11); \ |
272 | mfspr r12,SPRN_SPRG1; \ | 272 | mfspr r12,SPRN_SPRG_SCRATCH1; \ |
273 | stw r12,GPR11(r11); \ | 273 | stw r12,GPR11(r11); \ |
274 | mflr r10; \ | 274 | mflr r10; \ |
275 | stw r10,_LINK(r11); \ | 275 | stw r10,_LINK(r11); \ |
@@ -355,11 +355,11 @@ i##n: \ | |||
355 | * -- paulus. | 355 | * -- paulus. |
356 | */ | 356 | */ |
357 | . = 0x200 | 357 | . = 0x200 |
358 | mtspr SPRN_SPRG0,r10 | 358 | mtspr SPRN_SPRG_SCRATCH0,r10 |
359 | mtspr SPRN_SPRG1,r11 | 359 | mtspr SPRN_SPRG_SCRATCH1,r11 |
360 | mfcr r10 | 360 | mfcr r10 |
361 | #ifdef CONFIG_PPC_CHRP | 361 | #ifdef CONFIG_PPC_CHRP |
362 | mfspr r11,SPRN_SPRG2 | 362 | mfspr r11,SPRN_SPRG_RTAS |
363 | cmpwi 0,r11,0 | 363 | cmpwi 0,r11,0 |
364 | bne 7f | 364 | bne 7f |
365 | #endif /* CONFIG_PPC_CHRP */ | 365 | #endif /* CONFIG_PPC_CHRP */ |
@@ -367,7 +367,7 @@ i##n: \ | |||
367 | 7: EXCEPTION_PROLOG_2 | 367 | 7: EXCEPTION_PROLOG_2 |
368 | addi r3,r1,STACK_FRAME_OVERHEAD | 368 | addi r3,r1,STACK_FRAME_OVERHEAD |
369 | #ifdef CONFIG_PPC_CHRP | 369 | #ifdef CONFIG_PPC_CHRP |
370 | mfspr r4,SPRN_SPRG2 | 370 | mfspr r4,SPRN_SPRG_RTAS |
371 | cmpwi cr1,r4,0 | 371 | cmpwi cr1,r4,0 |
372 | bne cr1,1f | 372 | bne cr1,1f |
373 | #endif | 373 | #endif |
@@ -485,7 +485,7 @@ InstructionTLBMiss: | |||
485 | mfspr r3,SPRN_IMISS | 485 | mfspr r3,SPRN_IMISS |
486 | lis r1,PAGE_OFFSET@h /* check if kernel address */ | 486 | lis r1,PAGE_OFFSET@h /* check if kernel address */ |
487 | cmplw 0,r1,r3 | 487 | cmplw 0,r1,r3 |
488 | mfspr r2,SPRN_SPRG3 | 488 | mfspr r2,SPRN_SPRG_THREAD |
489 | li r1,_PAGE_USER|_PAGE_PRESENT /* low addresses tested as user */ | 489 | li r1,_PAGE_USER|_PAGE_PRESENT /* low addresses tested as user */ |
490 | lwz r2,PGDIR(r2) | 490 | lwz r2,PGDIR(r2) |
491 | bge- 112f | 491 | bge- 112f |
@@ -559,7 +559,7 @@ DataLoadTLBMiss: | |||
559 | mfspr r3,SPRN_DMISS | 559 | mfspr r3,SPRN_DMISS |
560 | lis r1,PAGE_OFFSET@h /* check if kernel address */ | 560 | lis r1,PAGE_OFFSET@h /* check if kernel address */ |
561 | cmplw 0,r1,r3 | 561 | cmplw 0,r1,r3 |
562 | mfspr r2,SPRN_SPRG3 | 562 | mfspr r2,SPRN_SPRG_THREAD |
563 | li r1,_PAGE_USER|_PAGE_PRESENT /* low addresses tested as user */ | 563 | li r1,_PAGE_USER|_PAGE_PRESENT /* low addresses tested as user */ |
564 | lwz r2,PGDIR(r2) | 564 | lwz r2,PGDIR(r2) |
565 | bge- 112f | 565 | bge- 112f |
@@ -598,12 +598,12 @@ END_FTR_SECTION_IFCLR(CPU_FTR_NEED_COHERENT) | |||
598 | mtcrf 0x80,r2 | 598 | mtcrf 0x80,r2 |
599 | BEGIN_MMU_FTR_SECTION | 599 | BEGIN_MMU_FTR_SECTION |
600 | li r0,1 | 600 | li r0,1 |
601 | mfspr r1,SPRN_SPRG4 | 601 | mfspr r1,SPRN_SPRG_603_LRU |
602 | rlwinm r2,r3,20,27,31 /* Get Address bits 15:19 */ | 602 | rlwinm r2,r3,20,27,31 /* Get Address bits 15:19 */ |
603 | slw r0,r0,r2 | 603 | slw r0,r0,r2 |
604 | xor r1,r0,r1 | 604 | xor r1,r0,r1 |
605 | srw r0,r1,r2 | 605 | srw r0,r1,r2 |
606 | mtspr SPRN_SPRG4,r1 | 606 | mtspr SPRN_SPRG_603_LRU,r1 |
607 | mfspr r2,SPRN_SRR1 | 607 | mfspr r2,SPRN_SRR1 |
608 | rlwimi r2,r0,31-14,14,14 | 608 | rlwimi r2,r0,31-14,14,14 |
609 | mtspr SPRN_SRR1,r2 | 609 | mtspr SPRN_SRR1,r2 |
@@ -643,7 +643,7 @@ DataStoreTLBMiss: | |||
643 | mfspr r3,SPRN_DMISS | 643 | mfspr r3,SPRN_DMISS |
644 | lis r1,PAGE_OFFSET@h /* check if kernel address */ | 644 | lis r1,PAGE_OFFSET@h /* check if kernel address */ |
645 | cmplw 0,r1,r3 | 645 | cmplw 0,r1,r3 |
646 | mfspr r2,SPRN_SPRG3 | 646 | mfspr r2,SPRN_SPRG_THREAD |
647 | li r1,_PAGE_RW|_PAGE_USER|_PAGE_PRESENT /* access flags */ | 647 | li r1,_PAGE_RW|_PAGE_USER|_PAGE_PRESENT /* access flags */ |
648 | lwz r2,PGDIR(r2) | 648 | lwz r2,PGDIR(r2) |
649 | bge- 112f | 649 | bge- 112f |
@@ -678,12 +678,12 @@ END_FTR_SECTION_IFCLR(CPU_FTR_NEED_COHERENT) | |||
678 | mtcrf 0x80,r2 | 678 | mtcrf 0x80,r2 |
679 | BEGIN_MMU_FTR_SECTION | 679 | BEGIN_MMU_FTR_SECTION |
680 | li r0,1 | 680 | li r0,1 |
681 | mfspr r1,SPRN_SPRG4 | 681 | mfspr r1,SPRN_SPRG_603_LRU |
682 | rlwinm r2,r3,20,27,31 /* Get Address bits 15:19 */ | 682 | rlwinm r2,r3,20,27,31 /* Get Address bits 15:19 */ |
683 | slw r0,r0,r2 | 683 | slw r0,r0,r2 |
684 | xor r1,r0,r1 | 684 | xor r1,r0,r1 |
685 | srw r0,r1,r2 | 685 | srw r0,r1,r2 |
686 | mtspr SPRN_SPRG4,r1 | 686 | mtspr SPRN_SPRG_603_LRU,r1 |
687 | mfspr r2,SPRN_SRR1 | 687 | mfspr r2,SPRN_SRR1 |
688 | rlwimi r2,r0,31-14,14,14 | 688 | rlwimi r2,r0,31-14,14,14 |
689 | mtspr SPRN_SRR1,r2 | 689 | mtspr SPRN_SRR1,r2 |
@@ -864,9 +864,9 @@ __secondary_start: | |||
864 | tophys(r4,r2) | 864 | tophys(r4,r2) |
865 | addi r4,r4,THREAD /* phys address of our thread_struct */ | 865 | addi r4,r4,THREAD /* phys address of our thread_struct */ |
866 | CLR_TOP32(r4) | 866 | CLR_TOP32(r4) |
867 | mtspr SPRN_SPRG3,r4 | 867 | mtspr SPRN_SPRG_THREAD,r4 |
868 | li r3,0 | 868 | li r3,0 |
869 | mtspr SPRN_SPRG2,r3 /* 0 => not in RTAS */ | 869 | mtspr SPRN_SPRG_RTAS,r3 /* 0 => not in RTAS */ |
870 | 870 | ||
871 | /* enable MMU and jump to start_secondary */ | 871 | /* enable MMU and jump to start_secondary */ |
872 | li r4,MSR_KERNEL | 872 | li r4,MSR_KERNEL |
@@ -947,9 +947,9 @@ start_here: | |||
947 | tophys(r4,r2) | 947 | tophys(r4,r2) |
948 | addi r4,r4,THREAD /* init task's THREAD */ | 948 | addi r4,r4,THREAD /* init task's THREAD */ |
949 | CLR_TOP32(r4) | 949 | CLR_TOP32(r4) |
950 | mtspr SPRN_SPRG3,r4 | 950 | mtspr SPRN_SPRG_THREAD,r4 |
951 | li r3,0 | 951 | li r3,0 |
952 | mtspr SPRN_SPRG2,r3 /* 0 => not in RTAS */ | 952 | mtspr SPRN_SPRG_RTAS,r3 /* 0 => not in RTAS */ |
953 | 953 | ||
954 | /* stack */ | 954 | /* stack */ |
955 | lis r1,init_thread_union@ha | 955 | lis r1,init_thread_union@ha |
diff --git a/arch/powerpc/kernel/head_40x.S b/arch/powerpc/kernel/head_40x.S index 0c96911d4299..a90625f9b485 100644 --- a/arch/powerpc/kernel/head_40x.S +++ b/arch/powerpc/kernel/head_40x.S | |||
@@ -103,21 +103,21 @@ _ENTRY(saved_ksp_limit) | |||
103 | 103 | ||
104 | /* | 104 | /* |
105 | * Exception vector entry code. This code runs with address translation | 105 | * Exception vector entry code. This code runs with address translation |
106 | * turned off (i.e. using physical addresses). We assume SPRG3 has the | 106 | * turned off (i.e. using physical addresses). We assume SPRG_THREAD has |
107 | * physical address of the current task thread_struct. | 107 | * the physical address of the current task thread_struct. |
108 | * Note that we have to have decremented r1 before we write to any fields | 108 | * Note that we have to have decremented r1 before we write to any fields |
109 | * of the exception frame, since a critical interrupt could occur at any | 109 | * of the exception frame, since a critical interrupt could occur at any |
110 | * time, and it will write to the area immediately below the current r1. | 110 | * time, and it will write to the area immediately below the current r1. |
111 | */ | 111 | */ |
112 | #define NORMAL_EXCEPTION_PROLOG \ | 112 | #define NORMAL_EXCEPTION_PROLOG \ |
113 | mtspr SPRN_SPRG0,r10; /* save two registers to work with */\ | 113 | mtspr SPRN_SPRG_SCRATCH0,r10; /* save two registers to work with */\ |
114 | mtspr SPRN_SPRG1,r11; \ | 114 | mtspr SPRN_SPRG_SCRATCH1,r11; \ |
115 | mtspr SPRN_SPRG2,r1; \ | 115 | mtspr SPRN_SPRG_SCRATCH2,r1; \ |
116 | mfcr r10; /* save CR in r10 for now */\ | 116 | mfcr r10; /* save CR in r10 for now */\ |
117 | mfspr r11,SPRN_SRR1; /* check whether user or kernel */\ | 117 | mfspr r11,SPRN_SRR1; /* check whether user or kernel */\ |
118 | andi. r11,r11,MSR_PR; \ | 118 | andi. r11,r11,MSR_PR; \ |
119 | beq 1f; \ | 119 | beq 1f; \ |
120 | mfspr r1,SPRN_SPRG3; /* if from user, start at top of */\ | 120 | mfspr r1,SPRN_SPRG_THREAD; /* if from user, start at top of */\ |
121 | lwz r1,THREAD_INFO-THREAD(r1); /* this thread's kernel stack */\ | 121 | lwz r1,THREAD_INFO-THREAD(r1); /* this thread's kernel stack */\ |
122 | addi r1,r1,THREAD_SIZE; \ | 122 | addi r1,r1,THREAD_SIZE; \ |
123 | 1: subi r1,r1,INT_FRAME_SIZE; /* Allocate an exception frame */\ | 123 | 1: subi r1,r1,INT_FRAME_SIZE; /* Allocate an exception frame */\ |
@@ -125,13 +125,13 @@ _ENTRY(saved_ksp_limit) | |||
125 | stw r10,_CCR(r11); /* save various registers */\ | 125 | stw r10,_CCR(r11); /* save various registers */\ |
126 | stw r12,GPR12(r11); \ | 126 | stw r12,GPR12(r11); \ |
127 | stw r9,GPR9(r11); \ | 127 | stw r9,GPR9(r11); \ |
128 | mfspr r10,SPRN_SPRG0; \ | 128 | mfspr r10,SPRN_SPRG_SCRATCH0; \ |
129 | stw r10,GPR10(r11); \ | 129 | stw r10,GPR10(r11); \ |
130 | mfspr r12,SPRN_SPRG1; \ | 130 | mfspr r12,SPRN_SPRG_SCRATCH1; \ |
131 | stw r12,GPR11(r11); \ | 131 | stw r12,GPR11(r11); \ |
132 | mflr r10; \ | 132 | mflr r10; \ |
133 | stw r10,_LINK(r11); \ | 133 | stw r10,_LINK(r11); \ |
134 | mfspr r10,SPRN_SPRG2; \ | 134 | mfspr r10,SPRN_SPRG_SCRATCH2; \ |
135 | mfspr r12,SPRN_SRR0; \ | 135 | mfspr r12,SPRN_SRR0; \ |
136 | stw r10,GPR1(r11); \ | 136 | stw r10,GPR1(r11); \ |
137 | mfspr r9,SPRN_SRR1; \ | 137 | mfspr r9,SPRN_SRR1; \ |
@@ -160,7 +160,7 @@ _ENTRY(saved_ksp_limit) | |||
160 | lwz r11,critirq_ctx@l(r11); \ | 160 | lwz r11,critirq_ctx@l(r11); \ |
161 | beq 1f; \ | 161 | beq 1f; \ |
162 | /* COMING FROM USER MODE */ \ | 162 | /* COMING FROM USER MODE */ \ |
163 | mfspr r11,SPRN_SPRG3; /* if from user, start at top of */\ | 163 | mfspr r11,SPRN_SPRG_THREAD; /* if from user, start at top of */\ |
164 | lwz r11,THREAD_INFO-THREAD(r11); /* this thread's kernel stack */\ | 164 | lwz r11,THREAD_INFO-THREAD(r11); /* this thread's kernel stack */\ |
165 | 1: addi r11,r11,THREAD_SIZE-INT_FRAME_SIZE; /* Alloc an excpt frm */\ | 165 | 1: addi r11,r11,THREAD_SIZE-INT_FRAME_SIZE; /* Alloc an excpt frm */\ |
166 | tophys(r11,r11); \ | 166 | tophys(r11,r11); \ |
@@ -265,8 +265,8 @@ label: | |||
265 | * and exit. Otherwise, we call heavywight functions to do the work. | 265 | * and exit. Otherwise, we call heavywight functions to do the work. |
266 | */ | 266 | */ |
267 | START_EXCEPTION(0x0300, DataStorage) | 267 | START_EXCEPTION(0x0300, DataStorage) |
268 | mtspr SPRN_SPRG0, r10 /* Save some working registers */ | 268 | mtspr SPRN_SPRG_SCRATCH0, r10 /* Save some working registers */ |
269 | mtspr SPRN_SPRG1, r11 | 269 | mtspr SPRN_SPRG_SCRATCH1, r11 |
270 | #ifdef CONFIG_403GCX | 270 | #ifdef CONFIG_403GCX |
271 | stw r12, 0(r0) | 271 | stw r12, 0(r0) |
272 | stw r9, 4(r0) | 272 | stw r9, 4(r0) |
@@ -275,12 +275,12 @@ label: | |||
275 | stw r11, 8(r0) | 275 | stw r11, 8(r0) |
276 | stw r12, 12(r0) | 276 | stw r12, 12(r0) |
277 | #else | 277 | #else |
278 | mtspr SPRN_SPRG4, r12 | 278 | mtspr SPRN_SPRG_SCRATCH3, r12 |
279 | mtspr SPRN_SPRG5, r9 | 279 | mtspr SPRN_SPRG_SCRATCH4, r9 |
280 | mfcr r11 | 280 | mfcr r11 |
281 | mfspr r12, SPRN_PID | 281 | mfspr r12, SPRN_PID |
282 | mtspr SPRN_SPRG7, r11 | 282 | mtspr SPRN_SPRG_SCRATCH6, r11 |
283 | mtspr SPRN_SPRG6, r12 | 283 | mtspr SPRN_SPRG_SCRATCH5, r12 |
284 | #endif | 284 | #endif |
285 | 285 | ||
286 | /* First, check if it was a zone fault (which means a user | 286 | /* First, check if it was a zone fault (which means a user |
@@ -308,7 +308,7 @@ label: | |||
308 | /* Get the PGD for the current thread. | 308 | /* Get the PGD for the current thread. |
309 | */ | 309 | */ |
310 | 3: | 310 | 3: |
311 | mfspr r11,SPRN_SPRG3 | 311 | mfspr r11,SPRN_SPRG_THREAD |
312 | lwz r11,PGDIR(r11) | 312 | lwz r11,PGDIR(r11) |
313 | 4: | 313 | 4: |
314 | tophys(r11, r11) | 314 | tophys(r11, r11) |
@@ -355,15 +355,15 @@ label: | |||
355 | lwz r9, 4(r0) | 355 | lwz r9, 4(r0) |
356 | lwz r12, 0(r0) | 356 | lwz r12, 0(r0) |
357 | #else | 357 | #else |
358 | mfspr r12, SPRN_SPRG6 | 358 | mfspr r12, SPRN_SPRG_SCRATCH5 |
359 | mfspr r11, SPRN_SPRG7 | 359 | mfspr r11, SPRN_SPRG_SCRATCH6 |
360 | mtspr SPRN_PID, r12 | 360 | mtspr SPRN_PID, r12 |
361 | mtcr r11 | 361 | mtcr r11 |
362 | mfspr r9, SPRN_SPRG5 | 362 | mfspr r9, SPRN_SPRG_SCRATCH4 |
363 | mfspr r12, SPRN_SPRG4 | 363 | mfspr r12, SPRN_SPRG_SCRATCH3 |
364 | #endif | 364 | #endif |
365 | mfspr r11, SPRN_SPRG1 | 365 | mfspr r11, SPRN_SPRG_SCRATCH1 |
366 | mfspr r10, SPRN_SPRG0 | 366 | mfspr r10, SPRN_SPRG_SCRATCH0 |
367 | PPC405_ERR77_SYNC | 367 | PPC405_ERR77_SYNC |
368 | rfi /* Should sync shadow TLBs */ | 368 | rfi /* Should sync shadow TLBs */ |
369 | b . /* prevent prefetch past rfi */ | 369 | b . /* prevent prefetch past rfi */ |
@@ -380,15 +380,15 @@ label: | |||
380 | lwz r9, 4(r0) | 380 | lwz r9, 4(r0) |
381 | lwz r12, 0(r0) | 381 | lwz r12, 0(r0) |
382 | #else | 382 | #else |
383 | mfspr r12, SPRN_SPRG6 | 383 | mfspr r12, SPRN_SPRG_SCRATCH5 |
384 | mfspr r11, SPRN_SPRG7 | 384 | mfspr r11, SPRN_SPRG_SCRATCH6 |
385 | mtspr SPRN_PID, r12 | 385 | mtspr SPRN_PID, r12 |
386 | mtcr r11 | 386 | mtcr r11 |
387 | mfspr r9, SPRN_SPRG5 | 387 | mfspr r9, SPRN_SPRG_SCRATCH4 |
388 | mfspr r12, SPRN_SPRG4 | 388 | mfspr r12, SPRN_SPRG_SCRATCH3 |
389 | #endif | 389 | #endif |
390 | mfspr r11, SPRN_SPRG1 | 390 | mfspr r11, SPRN_SPRG_SCRATCH1 |
391 | mfspr r10, SPRN_SPRG0 | 391 | mfspr r10, SPRN_SPRG_SCRATCH0 |
392 | b DataAccess | 392 | b DataAccess |
393 | 393 | ||
394 | /* | 394 | /* |
@@ -466,8 +466,8 @@ label: | |||
466 | * load TLB entries from the page table if they exist. | 466 | * load TLB entries from the page table if they exist. |
467 | */ | 467 | */ |
468 | START_EXCEPTION(0x1100, DTLBMiss) | 468 | START_EXCEPTION(0x1100, DTLBMiss) |
469 | mtspr SPRN_SPRG0, r10 /* Save some working registers */ | 469 | mtspr SPRN_SPRG_SCRATCH0, r10 /* Save some working registers */ |
470 | mtspr SPRN_SPRG1, r11 | 470 | mtspr SPRN_SPRG_SCRATCH1, r11 |
471 | #ifdef CONFIG_403GCX | 471 | #ifdef CONFIG_403GCX |
472 | stw r12, 0(r0) | 472 | stw r12, 0(r0) |
473 | stw r9, 4(r0) | 473 | stw r9, 4(r0) |
@@ -476,12 +476,12 @@ label: | |||
476 | stw r11, 8(r0) | 476 | stw r11, 8(r0) |
477 | stw r12, 12(r0) | 477 | stw r12, 12(r0) |
478 | #else | 478 | #else |
479 | mtspr SPRN_SPRG4, r12 | 479 | mtspr SPRN_SPRG_SCRATCH3, r12 |
480 | mtspr SPRN_SPRG5, r9 | 480 | mtspr SPRN_SPRG_SCRATCH4, r9 |
481 | mfcr r11 | 481 | mfcr r11 |
482 | mfspr r12, SPRN_PID | 482 | mfspr r12, SPRN_PID |
483 | mtspr SPRN_SPRG7, r11 | 483 | mtspr SPRN_SPRG_SCRATCH6, r11 |
484 | mtspr SPRN_SPRG6, r12 | 484 | mtspr SPRN_SPRG_SCRATCH5, r12 |
485 | #endif | 485 | #endif |
486 | mfspr r10, SPRN_DEAR /* Get faulting address */ | 486 | mfspr r10, SPRN_DEAR /* Get faulting address */ |
487 | 487 | ||
@@ -500,7 +500,7 @@ label: | |||
500 | /* Get the PGD for the current thread. | 500 | /* Get the PGD for the current thread. |
501 | */ | 501 | */ |
502 | 3: | 502 | 3: |
503 | mfspr r11,SPRN_SPRG3 | 503 | mfspr r11,SPRN_SPRG_THREAD |
504 | lwz r11,PGDIR(r11) | 504 | lwz r11,PGDIR(r11) |
505 | 4: | 505 | 4: |
506 | tophys(r11, r11) | 506 | tophys(r11, r11) |
@@ -550,15 +550,15 @@ label: | |||
550 | lwz r9, 4(r0) | 550 | lwz r9, 4(r0) |
551 | lwz r12, 0(r0) | 551 | lwz r12, 0(r0) |
552 | #else | 552 | #else |
553 | mfspr r12, SPRN_SPRG6 | 553 | mfspr r12, SPRN_SPRG_SCRATCH5 |
554 | mfspr r11, SPRN_SPRG7 | 554 | mfspr r11, SPRN_SPRG_SCRATCH6 |
555 | mtspr SPRN_PID, r12 | 555 | mtspr SPRN_PID, r12 |
556 | mtcr r11 | 556 | mtcr r11 |
557 | mfspr r9, SPRN_SPRG5 | 557 | mfspr r9, SPRN_SPRG_SCRATCH4 |
558 | mfspr r12, SPRN_SPRG4 | 558 | mfspr r12, SPRN_SPRG_SCRATCH3 |
559 | #endif | 559 | #endif |
560 | mfspr r11, SPRN_SPRG1 | 560 | mfspr r11, SPRN_SPRG_SCRATCH1 |
561 | mfspr r10, SPRN_SPRG0 | 561 | mfspr r10, SPRN_SPRG_SCRATCH0 |
562 | b DataAccess | 562 | b DataAccess |
563 | 563 | ||
564 | /* 0x1200 - Instruction TLB Miss Exception | 564 | /* 0x1200 - Instruction TLB Miss Exception |
@@ -566,8 +566,8 @@ label: | |||
566 | * registers and bailout to a different point. | 566 | * registers and bailout to a different point. |
567 | */ | 567 | */ |
568 | START_EXCEPTION(0x1200, ITLBMiss) | 568 | START_EXCEPTION(0x1200, ITLBMiss) |
569 | mtspr SPRN_SPRG0, r10 /* Save some working registers */ | 569 | mtspr SPRN_SPRG_SCRATCH0, r10 /* Save some working registers */ |
570 | mtspr SPRN_SPRG1, r11 | 570 | mtspr SPRN_SPRG_SCRATCH1, r11 |
571 | #ifdef CONFIG_403GCX | 571 | #ifdef CONFIG_403GCX |
572 | stw r12, 0(r0) | 572 | stw r12, 0(r0) |
573 | stw r9, 4(r0) | 573 | stw r9, 4(r0) |
@@ -576,12 +576,12 @@ label: | |||
576 | stw r11, 8(r0) | 576 | stw r11, 8(r0) |
577 | stw r12, 12(r0) | 577 | stw r12, 12(r0) |
578 | #else | 578 | #else |
579 | mtspr SPRN_SPRG4, r12 | 579 | mtspr SPRN_SPRG_SCRATCH3, r12 |
580 | mtspr SPRN_SPRG5, r9 | 580 | mtspr SPRN_SPRG_SCRATCH4, r9 |
581 | mfcr r11 | 581 | mfcr r11 |
582 | mfspr r12, SPRN_PID | 582 | mfspr r12, SPRN_PID |
583 | mtspr SPRN_SPRG7, r11 | 583 | mtspr SPRN_SPRG_SCRATCH6, r11 |
584 | mtspr SPRN_SPRG6, r12 | 584 | mtspr SPRN_SPRG_SCRATCH5, r12 |
585 | #endif | 585 | #endif |
586 | mfspr r10, SPRN_SRR0 /* Get faulting address */ | 586 | mfspr r10, SPRN_SRR0 /* Get faulting address */ |
587 | 587 | ||
@@ -600,7 +600,7 @@ label: | |||
600 | /* Get the PGD for the current thread. | 600 | /* Get the PGD for the current thread. |
601 | */ | 601 | */ |
602 | 3: | 602 | 3: |
603 | mfspr r11,SPRN_SPRG3 | 603 | mfspr r11,SPRN_SPRG_THREAD |
604 | lwz r11,PGDIR(r11) | 604 | lwz r11,PGDIR(r11) |
605 | 4: | 605 | 4: |
606 | tophys(r11, r11) | 606 | tophys(r11, r11) |
@@ -650,15 +650,15 @@ label: | |||
650 | lwz r9, 4(r0) | 650 | lwz r9, 4(r0) |
651 | lwz r12, 0(r0) | 651 | lwz r12, 0(r0) |
652 | #else | 652 | #else |
653 | mfspr r12, SPRN_SPRG6 | 653 | mfspr r12, SPRN_SPRG_SCRATCH5 |
654 | mfspr r11, SPRN_SPRG7 | 654 | mfspr r11, SPRN_SPRG_SCRATCH6 |
655 | mtspr SPRN_PID, r12 | 655 | mtspr SPRN_PID, r12 |
656 | mtcr r11 | 656 | mtcr r11 |
657 | mfspr r9, SPRN_SPRG5 | 657 | mfspr r9, SPRN_SPRG_SCRATCH4 |
658 | mfspr r12, SPRN_SPRG4 | 658 | mfspr r12, SPRN_SPRG_SCRATCH3 |
659 | #endif | 659 | #endif |
660 | mfspr r11, SPRN_SPRG1 | 660 | mfspr r11, SPRN_SPRG_SCRATCH1 |
661 | mfspr r10, SPRN_SPRG0 | 661 | mfspr r10, SPRN_SPRG_SCRATCH0 |
662 | b InstructionAccess | 662 | b InstructionAccess |
663 | 663 | ||
664 | EXCEPTION(0x1300, Trap_13, unknown_exception, EXC_XFER_EE) | 664 | EXCEPTION(0x1300, Trap_13, unknown_exception, EXC_XFER_EE) |
@@ -803,15 +803,15 @@ finish_tlb_load: | |||
803 | lwz r9, 4(r0) | 803 | lwz r9, 4(r0) |
804 | lwz r12, 0(r0) | 804 | lwz r12, 0(r0) |
805 | #else | 805 | #else |
806 | mfspr r12, SPRN_SPRG6 | 806 | mfspr r12, SPRN_SPRG_SCRATCH5 |
807 | mfspr r11, SPRN_SPRG7 | 807 | mfspr r11, SPRN_SPRG_SCRATCH6 |
808 | mtspr SPRN_PID, r12 | 808 | mtspr SPRN_PID, r12 |
809 | mtcr r11 | 809 | mtcr r11 |
810 | mfspr r9, SPRN_SPRG5 | 810 | mfspr r9, SPRN_SPRG_SCRATCH4 |
811 | mfspr r12, SPRN_SPRG4 | 811 | mfspr r12, SPRN_SPRG_SCRATCH3 |
812 | #endif | 812 | #endif |
813 | mfspr r11, SPRN_SPRG1 | 813 | mfspr r11, SPRN_SPRG_SCRATCH1 |
814 | mfspr r10, SPRN_SPRG0 | 814 | mfspr r10, SPRN_SPRG_SCRATCH0 |
815 | PPC405_ERR77_SYNC | 815 | PPC405_ERR77_SYNC |
816 | rfi /* Should sync shadow TLBs */ | 816 | rfi /* Should sync shadow TLBs */ |
817 | b . /* prevent prefetch past rfi */ | 817 | b . /* prevent prefetch past rfi */ |
@@ -835,7 +835,7 @@ start_here: | |||
835 | /* ptr to phys current thread */ | 835 | /* ptr to phys current thread */ |
836 | tophys(r4,r2) | 836 | tophys(r4,r2) |
837 | addi r4,r4,THREAD /* init task's THREAD */ | 837 | addi r4,r4,THREAD /* init task's THREAD */ |
838 | mtspr SPRN_SPRG3,r4 | 838 | mtspr SPRN_SPRG_THREAD,r4 |
839 | 839 | ||
840 | /* stack */ | 840 | /* stack */ |
841 | lis r1,init_thread_union@ha | 841 | lis r1,init_thread_union@ha |
diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S index 18d8a1677c4d..656cfb2d6666 100644 --- a/arch/powerpc/kernel/head_44x.S +++ b/arch/powerpc/kernel/head_44x.S | |||
@@ -239,7 +239,7 @@ skpinv: addi r4,r4,1 /* Increment */ | |||
239 | 239 | ||
240 | /* ptr to current thread */ | 240 | /* ptr to current thread */ |
241 | addi r4,r2,THREAD /* init task's THREAD */ | 241 | addi r4,r2,THREAD /* init task's THREAD */ |
242 | mtspr SPRN_SPRG3,r4 | 242 | mtspr SPRN_SPRG_THREAD,r4 |
243 | 243 | ||
244 | /* stack */ | 244 | /* stack */ |
245 | lis r1,init_thread_union@h | 245 | lis r1,init_thread_union@h |
@@ -350,12 +350,12 @@ interrupt_base: | |||
350 | 350 | ||
351 | /* Data TLB Error Interrupt */ | 351 | /* Data TLB Error Interrupt */ |
352 | START_EXCEPTION(DataTLBError) | 352 | START_EXCEPTION(DataTLBError) |
353 | mtspr SPRN_SPRG0, r10 /* Save some working registers */ | 353 | mtspr SPRN_SPRG_WSCRATCH0, r10 /* Save some working registers */ |
354 | mtspr SPRN_SPRG1, r11 | 354 | mtspr SPRN_SPRG_WSCRATCH1, r11 |
355 | mtspr SPRN_SPRG4W, r12 | 355 | mtspr SPRN_SPRG_WSCRATCH2, r12 |
356 | mtspr SPRN_SPRG5W, r13 | 356 | mtspr SPRN_SPRG_WSCRATCH3, r13 |
357 | mfcr r11 | 357 | mfcr r11 |
358 | mtspr SPRN_SPRG7W, r11 | 358 | mtspr SPRN_SPRG_WSCRATCH4, r11 |
359 | mfspr r10, SPRN_DEAR /* Get faulting address */ | 359 | mfspr r10, SPRN_DEAR /* Get faulting address */ |
360 | 360 | ||
361 | /* If we are faulting a kernel address, we have to use the | 361 | /* If we are faulting a kernel address, we have to use the |
@@ -374,7 +374,7 @@ interrupt_base: | |||
374 | 374 | ||
375 | /* Get the PGD for the current thread */ | 375 | /* Get the PGD for the current thread */ |
376 | 3: | 376 | 3: |
377 | mfspr r11,SPRN_SPRG3 | 377 | mfspr r11,SPRN_SPRG_THREAD |
378 | lwz r11,PGDIR(r11) | 378 | lwz r11,PGDIR(r11) |
379 | 379 | ||
380 | /* Load PID into MMUCR TID */ | 380 | /* Load PID into MMUCR TID */ |
@@ -446,12 +446,12 @@ tlb_44x_patch_hwater_D: | |||
446 | /* The bailout. Restore registers to pre-exception conditions | 446 | /* The bailout. Restore registers to pre-exception conditions |
447 | * and call the heavyweights to help us out. | 447 | * and call the heavyweights to help us out. |
448 | */ | 448 | */ |
449 | mfspr r11, SPRN_SPRG7R | 449 | mfspr r11, SPRN_SPRG_RSCRATCH4 |
450 | mtcr r11 | 450 | mtcr r11 |
451 | mfspr r13, SPRN_SPRG5R | 451 | mfspr r13, SPRN_SPRG_RSCRATCH3 |
452 | mfspr r12, SPRN_SPRG4R | 452 | mfspr r12, SPRN_SPRG_RSCRATCH2 |
453 | mfspr r11, SPRN_SPRG1 | 453 | mfspr r11, SPRN_SPRG_RSCRATCH1 |
454 | mfspr r10, SPRN_SPRG0 | 454 | mfspr r10, SPRN_SPRG_RSCRATCH0 |
455 | b DataStorage | 455 | b DataStorage |
456 | 456 | ||
457 | /* Instruction TLB Error Interrupt */ | 457 | /* Instruction TLB Error Interrupt */ |
@@ -461,12 +461,12 @@ tlb_44x_patch_hwater_D: | |||
461 | * to a different point. | 461 | * to a different point. |
462 | */ | 462 | */ |
463 | START_EXCEPTION(InstructionTLBError) | 463 | START_EXCEPTION(InstructionTLBError) |
464 | mtspr SPRN_SPRG0, r10 /* Save some working registers */ | 464 | mtspr SPRN_SPRG_WSCRATCH0, r10 /* Save some working registers */ |
465 | mtspr SPRN_SPRG1, r11 | 465 | mtspr SPRN_SPRG_WSCRATCH1, r11 |
466 | mtspr SPRN_SPRG4W, r12 | 466 | mtspr SPRN_SPRG_WSCRATCH2, r12 |
467 | mtspr SPRN_SPRG5W, r13 | 467 | mtspr SPRN_SPRG_WSCRATCH3, r13 |
468 | mfcr r11 | 468 | mfcr r11 |
469 | mtspr SPRN_SPRG7W, r11 | 469 | mtspr SPRN_SPRG_WSCRATCH4, r11 |
470 | mfspr r10, SPRN_SRR0 /* Get faulting address */ | 470 | mfspr r10, SPRN_SRR0 /* Get faulting address */ |
471 | 471 | ||
472 | /* If we are faulting a kernel address, we have to use the | 472 | /* If we are faulting a kernel address, we have to use the |
@@ -485,7 +485,7 @@ tlb_44x_patch_hwater_D: | |||
485 | 485 | ||
486 | /* Get the PGD for the current thread */ | 486 | /* Get the PGD for the current thread */ |
487 | 3: | 487 | 3: |
488 | mfspr r11,SPRN_SPRG3 | 488 | mfspr r11,SPRN_SPRG_THREAD |
489 | lwz r11,PGDIR(r11) | 489 | lwz r11,PGDIR(r11) |
490 | 490 | ||
491 | /* Load PID into MMUCR TID */ | 491 | /* Load PID into MMUCR TID */ |
@@ -542,12 +542,12 @@ tlb_44x_patch_hwater_I: | |||
542 | /* The bailout. Restore registers to pre-exception conditions | 542 | /* The bailout. Restore registers to pre-exception conditions |
543 | * and call the heavyweights to help us out. | 543 | * and call the heavyweights to help us out. |
544 | */ | 544 | */ |
545 | mfspr r11, SPRN_SPRG7R | 545 | mfspr r11, SPRN_SPRG_RSCRATCH4 |
546 | mtcr r11 | 546 | mtcr r11 |
547 | mfspr r13, SPRN_SPRG5R | 547 | mfspr r13, SPRN_SPRG_RSCRATCH3 |
548 | mfspr r12, SPRN_SPRG4R | 548 | mfspr r12, SPRN_SPRG_RSCRATCH2 |
549 | mfspr r11, SPRN_SPRG1 | 549 | mfspr r11, SPRN_SPRG_RSCRATCH1 |
550 | mfspr r10, SPRN_SPRG0 | 550 | mfspr r10, SPRN_SPRG_RSCRATCH0 |
551 | b InstructionStorage | 551 | b InstructionStorage |
552 | 552 | ||
553 | /* Debug Interrupt */ | 553 | /* Debug Interrupt */ |
@@ -593,12 +593,12 @@ finish_tlb_load: | |||
593 | 593 | ||
594 | /* Done...restore registers and get out of here. | 594 | /* Done...restore registers and get out of here. |
595 | */ | 595 | */ |
596 | mfspr r11, SPRN_SPRG7R | 596 | mfspr r11, SPRN_SPRG_RSCRATCH4 |
597 | mtcr r11 | 597 | mtcr r11 |
598 | mfspr r13, SPRN_SPRG5R | 598 | mfspr r13, SPRN_SPRG_RSCRATCH3 |
599 | mfspr r12, SPRN_SPRG4R | 599 | mfspr r12, SPRN_SPRG_RSCRATCH2 |
600 | mfspr r11, SPRN_SPRG1 | 600 | mfspr r11, SPRN_SPRG_RSCRATCH1 |
601 | mfspr r10, SPRN_SPRG0 | 601 | mfspr r10, SPRN_SPRG_RSCRATCH0 |
602 | rfi /* Force context change */ | 602 | rfi /* Force context change */ |
603 | 603 | ||
604 | /* | 604 | /* |
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index 012505ebd9f9..c38afdb45d7b 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S | |||
@@ -36,7 +36,6 @@ | |||
36 | #include <asm/thread_info.h> | 36 | #include <asm/thread_info.h> |
37 | #include <asm/firmware.h> | 37 | #include <asm/firmware.h> |
38 | #include <asm/page_64.h> | 38 | #include <asm/page_64.h> |
39 | #include <asm/exception.h> | ||
40 | #include <asm/irqflags.h> | 39 | #include <asm/irqflags.h> |
41 | 40 | ||
42 | /* The physical memory is layed out such that the secondary processor | 41 | /* The physical memory is layed out such that the secondary processor |
@@ -122,10 +121,11 @@ __run_at_load: | |||
122 | */ | 121 | */ |
123 | .globl __secondary_hold | 122 | .globl __secondary_hold |
124 | __secondary_hold: | 123 | __secondary_hold: |
124 | #ifndef CONFIG_PPC_BOOK3E | ||
125 | mfmsr r24 | 125 | mfmsr r24 |
126 | ori r24,r24,MSR_RI | 126 | ori r24,r24,MSR_RI |
127 | mtmsrd r24 /* RI on */ | 127 | mtmsrd r24 /* RI on */ |
128 | 128 | #endif | |
129 | /* Grab our physical cpu number */ | 129 | /* Grab our physical cpu number */ |
130 | mr r24,r3 | 130 | mr r24,r3 |
131 | 131 | ||
@@ -144,6 +144,7 @@ __secondary_hold: | |||
144 | ld r4,0(r4) /* deref function descriptor */ | 144 | ld r4,0(r4) /* deref function descriptor */ |
145 | mtctr r4 | 145 | mtctr r4 |
146 | mr r3,r24 | 146 | mr r3,r24 |
147 | li r4,0 | ||
147 | bctr | 148 | bctr |
148 | #else | 149 | #else |
149 | BUG_OPCODE | 150 | BUG_OPCODE |
@@ -164,21 +165,49 @@ exception_marker: | |||
164 | #include "exceptions-64s.S" | 165 | #include "exceptions-64s.S" |
165 | #endif | 166 | #endif |
166 | 167 | ||
168 | _GLOBAL(generic_secondary_thread_init) | ||
169 | mr r24,r3 | ||
170 | |||
171 | /* turn on 64-bit mode */ | ||
172 | bl .enable_64b_mode | ||
173 | |||
174 | /* get a valid TOC pointer, wherever we're mapped at */ | ||
175 | bl .relative_toc | ||
176 | |||
177 | #ifdef CONFIG_PPC_BOOK3E | ||
178 | /* Book3E initialization */ | ||
179 | mr r3,r24 | ||
180 | bl .book3e_secondary_thread_init | ||
181 | #endif | ||
182 | b generic_secondary_common_init | ||
167 | 183 | ||
168 | /* | 184 | /* |
169 | * On pSeries and most other platforms, secondary processors spin | 185 | * On pSeries and most other platforms, secondary processors spin |
170 | * in the following code. | 186 | * in the following code. |
171 | * At entry, r3 = this processor's number (physical cpu id) | 187 | * At entry, r3 = this processor's number (physical cpu id) |
188 | * | ||
189 | * On Book3E, r4 = 1 to indicate that the initial TLB entry for | ||
190 | * this core already exists (setup via some other mechanism such | ||
191 | * as SCOM before entry). | ||
172 | */ | 192 | */ |
173 | _GLOBAL(generic_secondary_smp_init) | 193 | _GLOBAL(generic_secondary_smp_init) |
174 | mr r24,r3 | 194 | mr r24,r3 |
175 | 195 | mr r25,r4 | |
196 | |||
176 | /* turn on 64-bit mode */ | 197 | /* turn on 64-bit mode */ |
177 | bl .enable_64b_mode | 198 | bl .enable_64b_mode |
178 | 199 | ||
179 | /* get the TOC pointer (real address) */ | 200 | /* get a valid TOC pointer, wherever we're mapped at */ |
180 | bl .relative_toc | 201 | bl .relative_toc |
181 | 202 | ||
203 | #ifdef CONFIG_PPC_BOOK3E | ||
204 | /* Book3E initialization */ | ||
205 | mr r3,r24 | ||
206 | mr r4,r25 | ||
207 | bl .book3e_secondary_core_init | ||
208 | #endif | ||
209 | |||
210 | generic_secondary_common_init: | ||
182 | /* Set up a paca value for this processor. Since we have the | 211 | /* Set up a paca value for this processor. Since we have the |
183 | * physical cpu id in r24, we need to search the pacas to find | 212 | * physical cpu id in r24, we need to search the pacas to find |
184 | * which logical id maps to our physical one. | 213 | * which logical id maps to our physical one. |
@@ -196,7 +225,12 @@ _GLOBAL(generic_secondary_smp_init) | |||
196 | mr r3,r24 /* not found, copy phys to r3 */ | 225 | mr r3,r24 /* not found, copy phys to r3 */ |
197 | b .kexec_wait /* next kernel might do better */ | 226 | b .kexec_wait /* next kernel might do better */ |
198 | 227 | ||
199 | 2: mtspr SPRN_SPRG3,r13 /* Save vaddr of paca in SPRG3 */ | 228 | 2: mtspr SPRN_SPRG_PACA,r13 /* Save vaddr of paca in an SPRG */ |
229 | #ifdef CONFIG_PPC_BOOK3E | ||
230 | addi r12,r13,PACA_EXTLB /* and TLB exc frame in another */ | ||
231 | mtspr SPRN_SPRG_TLB_EXFRAME,r12 | ||
232 | #endif | ||
233 | |||
200 | /* From now on, r24 is expected to be logical cpuid */ | 234 | /* From now on, r24 is expected to be logical cpuid */ |
201 | mr r24,r5 | 235 | mr r24,r5 |
202 | 3: HMT_LOW | 236 | 3: HMT_LOW |
@@ -232,6 +266,7 @@ _GLOBAL(generic_secondary_smp_init) | |||
232 | * Turn the MMU off. | 266 | * Turn the MMU off. |
233 | * Assumes we're mapped EA == RA if the MMU is on. | 267 | * Assumes we're mapped EA == RA if the MMU is on. |
234 | */ | 268 | */ |
269 | #ifdef CONFIG_PPC_BOOK3S | ||
235 | _STATIC(__mmu_off) | 270 | _STATIC(__mmu_off) |
236 | mfmsr r3 | 271 | mfmsr r3 |
237 | andi. r0,r3,MSR_IR|MSR_DR | 272 | andi. r0,r3,MSR_IR|MSR_DR |
@@ -243,6 +278,7 @@ _STATIC(__mmu_off) | |||
243 | sync | 278 | sync |
244 | rfid | 279 | rfid |
245 | b . /* prevent speculative execution */ | 280 | b . /* prevent speculative execution */ |
281 | #endif | ||
246 | 282 | ||
247 | 283 | ||
248 | /* | 284 | /* |
@@ -280,6 +316,10 @@ _GLOBAL(__start_initialization_multiplatform) | |||
280 | mr r31,r3 | 316 | mr r31,r3 |
281 | mr r30,r4 | 317 | mr r30,r4 |
282 | 318 | ||
319 | #ifdef CONFIG_PPC_BOOK3E | ||
320 | bl .start_initialization_book3e | ||
321 | b .__after_prom_start | ||
322 | #else | ||
283 | /* Setup some critical 970 SPRs before switching MMU off */ | 323 | /* Setup some critical 970 SPRs before switching MMU off */ |
284 | mfspr r0,SPRN_PVR | 324 | mfspr r0,SPRN_PVR |
285 | srwi r0,r0,16 | 325 | srwi r0,r0,16 |
@@ -297,6 +337,7 @@ _GLOBAL(__start_initialization_multiplatform) | |||
297 | /* Switch off MMU if not already off */ | 337 | /* Switch off MMU if not already off */ |
298 | bl .__mmu_off | 338 | bl .__mmu_off |
299 | b .__after_prom_start | 339 | b .__after_prom_start |
340 | #endif /* CONFIG_PPC_BOOK3E */ | ||
300 | 341 | ||
301 | _INIT_STATIC(__boot_from_prom) | 342 | _INIT_STATIC(__boot_from_prom) |
302 | #ifdef CONFIG_PPC_OF_BOOT_TRAMPOLINE | 343 | #ifdef CONFIG_PPC_OF_BOOT_TRAMPOLINE |
@@ -359,10 +400,16 @@ _STATIC(__after_prom_start) | |||
359 | * Note: This process overwrites the OF exception vectors. | 400 | * Note: This process overwrites the OF exception vectors. |
360 | */ | 401 | */ |
361 | li r3,0 /* target addr */ | 402 | li r3,0 /* target addr */ |
403 | #ifdef CONFIG_PPC_BOOK3E | ||
404 | tovirt(r3,r3) /* on booke, we already run at PAGE_OFFSET */ | ||
405 | #endif | ||
362 | mr. r4,r26 /* In some cases the loader may */ | 406 | mr. r4,r26 /* In some cases the loader may */ |
363 | beq 9f /* have already put us at zero */ | 407 | beq 9f /* have already put us at zero */ |
364 | li r6,0x100 /* Start offset, the first 0x100 */ | 408 | li r6,0x100 /* Start offset, the first 0x100 */ |
365 | /* bytes were copied earlier. */ | 409 | /* bytes were copied earlier. */ |
410 | #ifdef CONFIG_PPC_BOOK3E | ||
411 | tovirt(r6,r6) /* on booke, we already run at PAGE_OFFSET */ | ||
412 | #endif | ||
366 | 413 | ||
367 | #ifdef CONFIG_CRASH_DUMP | 414 | #ifdef CONFIG_CRASH_DUMP |
368 | /* | 415 | /* |
@@ -485,7 +532,7 @@ _GLOBAL(pmac_secondary_start) | |||
485 | LOAD_REG_ADDR(r4,paca) /* Get base vaddr of paca array */ | 532 | LOAD_REG_ADDR(r4,paca) /* Get base vaddr of paca array */ |
486 | mulli r13,r24,PACA_SIZE /* Calculate vaddr of right paca */ | 533 | mulli r13,r24,PACA_SIZE /* Calculate vaddr of right paca */ |
487 | add r13,r13,r4 /* for this processor. */ | 534 | add r13,r13,r4 /* for this processor. */ |
488 | mtspr SPRN_SPRG3,r13 /* Save vaddr of paca in SPRG3 */ | 535 | mtspr SPRN_SPRG_PACA,r13 /* Save vaddr of paca in an SPRG*/ |
489 | 536 | ||
490 | /* Create a temp kernel stack for use before relocation is on. */ | 537 | /* Create a temp kernel stack for use before relocation is on. */ |
491 | ld r1,PACAEMERGSP(r13) | 538 | ld r1,PACAEMERGSP(r13) |
@@ -503,11 +550,14 @@ _GLOBAL(pmac_secondary_start) | |||
503 | * 1. Processor number | 550 | * 1. Processor number |
504 | * 2. Segment table pointer (virtual address) | 551 | * 2. Segment table pointer (virtual address) |
505 | * On entry the following are set: | 552 | * On entry the following are set: |
506 | * r1 = stack pointer. vaddr for iSeries, raddr (temp stack) for pSeries | 553 | * r1 = stack pointer. vaddr for iSeries, raddr (temp stack) for pSeries |
507 | * r24 = cpu# (in Linux terms) | 554 | * r24 = cpu# (in Linux terms) |
508 | * r13 = paca virtual address | 555 | * r13 = paca virtual address |
509 | * SPRG3 = paca virtual address | 556 | * SPRG_PACA = paca virtual address |
510 | */ | 557 | */ |
558 | .section ".text"; | ||
559 | .align 2 ; | ||
560 | |||
511 | .globl __secondary_start | 561 | .globl __secondary_start |
512 | __secondary_start: | 562 | __secondary_start: |
513 | /* Set thread priority to MEDIUM */ | 563 | /* Set thread priority to MEDIUM */ |
@@ -544,7 +594,7 @@ END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES) | |||
544 | 594 | ||
545 | mtspr SPRN_SRR0,r3 | 595 | mtspr SPRN_SRR0,r3 |
546 | mtspr SPRN_SRR1,r4 | 596 | mtspr SPRN_SRR1,r4 |
547 | rfid | 597 | RFI |
548 | b . /* prevent speculative execution */ | 598 | b . /* prevent speculative execution */ |
549 | 599 | ||
550 | /* | 600 | /* |
@@ -565,11 +615,16 @@ _GLOBAL(start_secondary_prolog) | |||
565 | */ | 615 | */ |
566 | _GLOBAL(enable_64b_mode) | 616 | _GLOBAL(enable_64b_mode) |
567 | mfmsr r11 /* grab the current MSR */ | 617 | mfmsr r11 /* grab the current MSR */ |
618 | #ifdef CONFIG_PPC_BOOK3E | ||
619 | oris r11,r11,0x8000 /* CM bit set, we'll set ICM later */ | ||
620 | mtmsr r11 | ||
621 | #else /* CONFIG_PPC_BOOK3E */ | ||
568 | li r12,(MSR_SF | MSR_ISF)@highest | 622 | li r12,(MSR_SF | MSR_ISF)@highest |
569 | sldi r12,r12,48 | 623 | sldi r12,r12,48 |
570 | or r11,r11,r12 | 624 | or r11,r11,r12 |
571 | mtmsrd r11 | 625 | mtmsrd r11 |
572 | isync | 626 | isync |
627 | #endif | ||
573 | blr | 628 | blr |
574 | 629 | ||
575 | /* | 630 | /* |
@@ -613,9 +668,11 @@ _INIT_STATIC(start_here_multiplatform) | |||
613 | bdnz 3b | 668 | bdnz 3b |
614 | 4: | 669 | 4: |
615 | 670 | ||
671 | #ifndef CONFIG_PPC_BOOK3E | ||
616 | mfmsr r6 | 672 | mfmsr r6 |
617 | ori r6,r6,MSR_RI | 673 | ori r6,r6,MSR_RI |
618 | mtmsrd r6 /* RI on */ | 674 | mtmsrd r6 /* RI on */ |
675 | #endif | ||
619 | 676 | ||
620 | #ifdef CONFIG_RELOCATABLE | 677 | #ifdef CONFIG_RELOCATABLE |
621 | /* Save the physical address we're running at in kernstart_addr */ | 678 | /* Save the physical address we're running at in kernstart_addr */ |
@@ -642,13 +699,13 @@ _INIT_STATIC(start_here_multiplatform) | |||
642 | 699 | ||
643 | /* Restore parameters passed from prom_init/kexec */ | 700 | /* Restore parameters passed from prom_init/kexec */ |
644 | mr r3,r31 | 701 | mr r3,r31 |
645 | bl .early_setup /* also sets r13 and SPRG3 */ | 702 | bl .early_setup /* also sets r13 and SPRG_PACA */ |
646 | 703 | ||
647 | LOAD_REG_ADDR(r3, .start_here_common) | 704 | LOAD_REG_ADDR(r3, .start_here_common) |
648 | ld r4,PACAKMSR(r13) | 705 | ld r4,PACAKMSR(r13) |
649 | mtspr SPRN_SRR0,r3 | 706 | mtspr SPRN_SRR0,r3 |
650 | mtspr SPRN_SRR1,r4 | 707 | mtspr SPRN_SRR1,r4 |
651 | rfid | 708 | RFI |
652 | b . /* prevent speculative execution */ | 709 | b . /* prevent speculative execution */ |
653 | 710 | ||
654 | /* This is where all platforms converge execution */ | 711 | /* This is where all platforms converge execution */ |
diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S index 52ff8c53b93c..6ded19d01891 100644 --- a/arch/powerpc/kernel/head_8xx.S +++ b/arch/powerpc/kernel/head_8xx.S | |||
@@ -110,8 +110,8 @@ turn_on_mmu: | |||
110 | * task's thread_struct. | 110 | * task's thread_struct. |
111 | */ | 111 | */ |
112 | #define EXCEPTION_PROLOG \ | 112 | #define EXCEPTION_PROLOG \ |
113 | mtspr SPRN_SPRG0,r10; \ | 113 | mtspr SPRN_SPRG_SCRATCH0,r10; \ |
114 | mtspr SPRN_SPRG1,r11; \ | 114 | mtspr SPRN_SPRG_SCRATCH1,r11; \ |
115 | mfcr r10; \ | 115 | mfcr r10; \ |
116 | EXCEPTION_PROLOG_1; \ | 116 | EXCEPTION_PROLOG_1; \ |
117 | EXCEPTION_PROLOG_2 | 117 | EXCEPTION_PROLOG_2 |
@@ -121,7 +121,7 @@ turn_on_mmu: | |||
121 | andi. r11,r11,MSR_PR; \ | 121 | andi. r11,r11,MSR_PR; \ |
122 | tophys(r11,r1); /* use tophys(r1) if kernel */ \ | 122 | tophys(r11,r1); /* use tophys(r1) if kernel */ \ |
123 | beq 1f; \ | 123 | beq 1f; \ |
124 | mfspr r11,SPRN_SPRG3; \ | 124 | mfspr r11,SPRN_SPRG_THREAD; \ |
125 | lwz r11,THREAD_INFO-THREAD(r11); \ | 125 | lwz r11,THREAD_INFO-THREAD(r11); \ |
126 | addi r11,r11,THREAD_SIZE; \ | 126 | addi r11,r11,THREAD_SIZE; \ |
127 | tophys(r11,r11); \ | 127 | tophys(r11,r11); \ |
@@ -133,9 +133,9 @@ turn_on_mmu: | |||
133 | stw r10,_CCR(r11); /* save registers */ \ | 133 | stw r10,_CCR(r11); /* save registers */ \ |
134 | stw r12,GPR12(r11); \ | 134 | stw r12,GPR12(r11); \ |
135 | stw r9,GPR9(r11); \ | 135 | stw r9,GPR9(r11); \ |
136 | mfspr r10,SPRN_SPRG0; \ | 136 | mfspr r10,SPRN_SPRG_SCRATCH0; \ |
137 | stw r10,GPR10(r11); \ | 137 | stw r10,GPR10(r11); \ |
138 | mfspr r12,SPRN_SPRG1; \ | 138 | mfspr r12,SPRN_SPRG_SCRATCH1; \ |
139 | stw r12,GPR11(r11); \ | 139 | stw r12,GPR11(r11); \ |
140 | mflr r10; \ | 140 | mflr r10; \ |
141 | stw r10,_LINK(r11); \ | 141 | stw r10,_LINK(r11); \ |
@@ -603,8 +603,9 @@ start_here: | |||
603 | /* ptr to phys current thread */ | 603 | /* ptr to phys current thread */ |
604 | tophys(r4,r2) | 604 | tophys(r4,r2) |
605 | addi r4,r4,THREAD /* init task's THREAD */ | 605 | addi r4,r4,THREAD /* init task's THREAD */ |
606 | mtspr SPRN_SPRG3,r4 | 606 | mtspr SPRN_SPRG_THREAD,r4 |
607 | li r3,0 | 607 | li r3,0 |
608 | /* XXX What is that for ? SPRG2 appears otherwise unused on 8xx */ | ||
608 | mtspr SPRN_SPRG2,r3 /* 0 => r1 has kernel sp */ | 609 | mtspr SPRN_SPRG2,r3 /* 0 => r1 has kernel sp */ |
609 | 610 | ||
610 | /* stack */ | 611 | /* stack */ |
diff --git a/arch/powerpc/kernel/head_booke.h b/arch/powerpc/kernel/head_booke.h index 5f9febc8d143..50504ae39cb7 100644 --- a/arch/powerpc/kernel/head_booke.h +++ b/arch/powerpc/kernel/head_booke.h | |||
@@ -20,14 +20,14 @@ | |||
20 | #endif | 20 | #endif |
21 | 21 | ||
22 | #define NORMAL_EXCEPTION_PROLOG \ | 22 | #define NORMAL_EXCEPTION_PROLOG \ |
23 | mtspr SPRN_SPRG0,r10; /* save two registers to work with */\ | 23 | mtspr SPRN_SPRG_WSCRATCH0,r10;/* save two registers to work with */\ |
24 | mtspr SPRN_SPRG1,r11; \ | 24 | mtspr SPRN_SPRG_WSCRATCH1,r11; \ |
25 | mtspr SPRN_SPRG4W,r1; \ | 25 | mtspr SPRN_SPRG_WSCRATCH2,r1; \ |
26 | mfcr r10; /* save CR in r10 for now */\ | 26 | mfcr r10; /* save CR in r10 for now */\ |
27 | mfspr r11,SPRN_SRR1; /* check whether user or kernel */\ | 27 | mfspr r11,SPRN_SRR1; /* check whether user or kernel */\ |
28 | andi. r11,r11,MSR_PR; \ | 28 | andi. r11,r11,MSR_PR; \ |
29 | beq 1f; \ | 29 | beq 1f; \ |
30 | mfspr r1,SPRN_SPRG3; /* if from user, start at top of */\ | 30 | mfspr r1,SPRN_SPRG_THREAD; /* if from user, start at top of */\ |
31 | lwz r1,THREAD_INFO-THREAD(r1); /* this thread's kernel stack */\ | 31 | lwz r1,THREAD_INFO-THREAD(r1); /* this thread's kernel stack */\ |
32 | ALLOC_STACK_FRAME(r1, THREAD_SIZE); \ | 32 | ALLOC_STACK_FRAME(r1, THREAD_SIZE); \ |
33 | 1: subi r1,r1,INT_FRAME_SIZE; /* Allocate an exception frame */\ | 33 | 1: subi r1,r1,INT_FRAME_SIZE; /* Allocate an exception frame */\ |
@@ -35,13 +35,13 @@ | |||
35 | stw r10,_CCR(r11); /* save various registers */\ | 35 | stw r10,_CCR(r11); /* save various registers */\ |
36 | stw r12,GPR12(r11); \ | 36 | stw r12,GPR12(r11); \ |
37 | stw r9,GPR9(r11); \ | 37 | stw r9,GPR9(r11); \ |
38 | mfspr r10,SPRN_SPRG0; \ | 38 | mfspr r10,SPRN_SPRG_RSCRATCH0; \ |
39 | stw r10,GPR10(r11); \ | 39 | stw r10,GPR10(r11); \ |
40 | mfspr r12,SPRN_SPRG1; \ | 40 | mfspr r12,SPRN_SPRG_RSCRATCH1; \ |
41 | stw r12,GPR11(r11); \ | 41 | stw r12,GPR11(r11); \ |
42 | mflr r10; \ | 42 | mflr r10; \ |
43 | stw r10,_LINK(r11); \ | 43 | stw r10,_LINK(r11); \ |
44 | mfspr r10,SPRN_SPRG4R; \ | 44 | mfspr r10,SPRN_SPRG_RSCRATCH2; \ |
45 | mfspr r12,SPRN_SRR0; \ | 45 | mfspr r12,SPRN_SRR0; \ |
46 | stw r10,GPR1(r11); \ | 46 | stw r10,GPR1(r11); \ |
47 | mfspr r9,SPRN_SRR1; \ | 47 | mfspr r9,SPRN_SRR1; \ |
@@ -69,21 +69,11 @@ | |||
69 | * providing configurations that micro-optimize space usage. | 69 | * providing configurations that micro-optimize space usage. |
70 | */ | 70 | */ |
71 | 71 | ||
72 | /* CRIT_SPRG only used in critical exception handling */ | 72 | #define MC_STACK_BASE mcheckirq_ctx |
73 | #define CRIT_SPRG SPRN_SPRG2 | ||
74 | /* MCHECK_SPRG only used in machine check exception handling */ | ||
75 | #define MCHECK_SPRG SPRN_SPRG6W | ||
76 | |||
77 | #define MCHECK_STACK_BASE mcheckirq_ctx | ||
78 | #define CRIT_STACK_BASE critirq_ctx | 73 | #define CRIT_STACK_BASE critirq_ctx |
79 | 74 | ||
80 | /* only on e500mc/e200 */ | 75 | /* only on e500mc/e200 */ |
81 | #define DEBUG_STACK_BASE dbgirq_ctx | 76 | #define DBG_STACK_BASE dbgirq_ctx |
82 | #ifdef CONFIG_E200 | ||
83 | #define DEBUG_SPRG SPRN_SPRG6W | ||
84 | #else | ||
85 | #define DEBUG_SPRG SPRN_SPRG9 | ||
86 | #endif | ||
87 | 77 | ||
88 | #define EXC_LVL_FRAME_OVERHEAD (THREAD_SIZE - INT_FRAME_SIZE - EXC_LVL_SIZE) | 78 | #define EXC_LVL_FRAME_OVERHEAD (THREAD_SIZE - INT_FRAME_SIZE - EXC_LVL_SIZE) |
89 | 79 | ||
@@ -110,7 +100,7 @@ | |||
110 | * critical/machine check exception stack at low physical addresses. | 100 | * critical/machine check exception stack at low physical addresses. |
111 | */ | 101 | */ |
112 | #define EXC_LEVEL_EXCEPTION_PROLOG(exc_level, exc_level_srr0, exc_level_srr1) \ | 102 | #define EXC_LEVEL_EXCEPTION_PROLOG(exc_level, exc_level_srr0, exc_level_srr1) \ |
113 | mtspr exc_level##_SPRG,r8; \ | 103 | mtspr SPRN_SPRG_WSCRATCH_##exc_level,r8; \ |
114 | BOOKE_LOAD_EXC_LEVEL_STACK(exc_level);/* r8 points to the exc_level stack*/ \ | 104 | BOOKE_LOAD_EXC_LEVEL_STACK(exc_level);/* r8 points to the exc_level stack*/ \ |
115 | stw r9,GPR9(r8); /* save various registers */\ | 105 | stw r9,GPR9(r8); /* save various registers */\ |
116 | mfcr r9; /* save CR in r9 for now */\ | 106 | mfcr r9; /* save CR in r9 for now */\ |
@@ -119,7 +109,7 @@ | |||
119 | stw r9,_CCR(r8); /* save CR on stack */\ | 109 | stw r9,_CCR(r8); /* save CR on stack */\ |
120 | mfspr r10,exc_level_srr1; /* check whether user or kernel */\ | 110 | mfspr r10,exc_level_srr1; /* check whether user or kernel */\ |
121 | andi. r10,r10,MSR_PR; \ | 111 | andi. r10,r10,MSR_PR; \ |
122 | mfspr r11,SPRN_SPRG3; /* if from user, start at top of */\ | 112 | mfspr r11,SPRN_SPRG_THREAD; /* if from user, start at top of */\ |
123 | lwz r11,THREAD_INFO-THREAD(r11); /* this thread's kernel stack */\ | 113 | lwz r11,THREAD_INFO-THREAD(r11); /* this thread's kernel stack */\ |
124 | addi r11,r11,EXC_LVL_FRAME_OVERHEAD; /* allocate stack frame */\ | 114 | addi r11,r11,EXC_LVL_FRAME_OVERHEAD; /* allocate stack frame */\ |
125 | beq 1f; \ | 115 | beq 1f; \ |
@@ -140,7 +130,7 @@ | |||
140 | lwz r9,TI_TASK-EXC_LVL_FRAME_OVERHEAD(r11); \ | 130 | lwz r9,TI_TASK-EXC_LVL_FRAME_OVERHEAD(r11); \ |
141 | stw r9,TI_TASK-EXC_LVL_FRAME_OVERHEAD(r8); \ | 131 | stw r9,TI_TASK-EXC_LVL_FRAME_OVERHEAD(r8); \ |
142 | mr r11,r8; \ | 132 | mr r11,r8; \ |
143 | 2: mfspr r8,exc_level##_SPRG; \ | 133 | 2: mfspr r8,SPRN_SPRG_RSCRATCH_##exc_level; \ |
144 | stw r12,GPR12(r11); /* save various registers */\ | 134 | stw r12,GPR12(r11); /* save various registers */\ |
145 | mflr r10; \ | 135 | mflr r10; \ |
146 | stw r10,_LINK(r11); \ | 136 | stw r10,_LINK(r11); \ |
@@ -161,9 +151,9 @@ | |||
161 | #define CRITICAL_EXCEPTION_PROLOG \ | 151 | #define CRITICAL_EXCEPTION_PROLOG \ |
162 | EXC_LEVEL_EXCEPTION_PROLOG(CRIT, SPRN_CSRR0, SPRN_CSRR1) | 152 | EXC_LEVEL_EXCEPTION_PROLOG(CRIT, SPRN_CSRR0, SPRN_CSRR1) |
163 | #define DEBUG_EXCEPTION_PROLOG \ | 153 | #define DEBUG_EXCEPTION_PROLOG \ |
164 | EXC_LEVEL_EXCEPTION_PROLOG(DEBUG, SPRN_DSRR0, SPRN_DSRR1) | 154 | EXC_LEVEL_EXCEPTION_PROLOG(DBG, SPRN_DSRR0, SPRN_DSRR1) |
165 | #define MCHECK_EXCEPTION_PROLOG \ | 155 | #define MCHECK_EXCEPTION_PROLOG \ |
166 | EXC_LEVEL_EXCEPTION_PROLOG(MCHECK, SPRN_MCSRR0, SPRN_MCSRR1) | 156 | EXC_LEVEL_EXCEPTION_PROLOG(MC, SPRN_MCSRR0, SPRN_MCSRR1) |
167 | 157 | ||
168 | /* | 158 | /* |
169 | * Exception vectors. | 159 | * Exception vectors. |
@@ -282,13 +272,13 @@ label: | |||
282 | mtspr SPRN_DSRR1,r9; \ | 272 | mtspr SPRN_DSRR1,r9; \ |
283 | lwz r9,GPR9(r11); \ | 273 | lwz r9,GPR9(r11); \ |
284 | lwz r12,GPR12(r11); \ | 274 | lwz r12,GPR12(r11); \ |
285 | mtspr DEBUG_SPRG,r8; \ | 275 | mtspr SPRN_SPRG_WSCRATCH_DBG,r8; \ |
286 | BOOKE_LOAD_EXC_LEVEL_STACK(DEBUG); /* r8 points to the debug stack */ \ | 276 | BOOKE_LOAD_EXC_LEVEL_STACK(DBG); /* r8 points to the debug stack */ \ |
287 | lwz r10,GPR10(r8); \ | 277 | lwz r10,GPR10(r8); \ |
288 | lwz r11,GPR11(r8); \ | 278 | lwz r11,GPR11(r8); \ |
289 | mfspr r8,DEBUG_SPRG; \ | 279 | mfspr r8,SPRN_SPRG_RSCRATCH_DBG; \ |
290 | \ | 280 | \ |
291 | PPC_RFDI; \ | 281 | PPC_RFDI; \ |
292 | b .; \ | 282 | b .; \ |
293 | \ | 283 | \ |
294 | /* continue normal handling for a debug exception... */ \ | 284 | /* continue normal handling for a debug exception... */ \ |
@@ -335,11 +325,11 @@ label: | |||
335 | mtspr SPRN_CSRR1,r9; \ | 325 | mtspr SPRN_CSRR1,r9; \ |
336 | lwz r9,GPR9(r11); \ | 326 | lwz r9,GPR9(r11); \ |
337 | lwz r12,GPR12(r11); \ | 327 | lwz r12,GPR12(r11); \ |
338 | mtspr CRIT_SPRG,r8; \ | 328 | mtspr SPRN_SPRG_WSCRATCH_CRIT,r8; \ |
339 | BOOKE_LOAD_EXC_LEVEL_STACK(CRIT); /* r8 points to the debug stack */ \ | 329 | BOOKE_LOAD_EXC_LEVEL_STACK(CRIT); /* r8 points to the debug stack */ \ |
340 | lwz r10,GPR10(r8); \ | 330 | lwz r10,GPR10(r8); \ |
341 | lwz r11,GPR11(r8); \ | 331 | lwz r11,GPR11(r8); \ |
342 | mfspr r8,CRIT_SPRG; \ | 332 | mfspr r8,SPRN_SPRG_RSCRATCH_CRIT; \ |
343 | \ | 333 | \ |
344 | rfci; \ | 334 | rfci; \ |
345 | b .; \ | 335 | b .; \ |
diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S index 5bdcc06d294c..eca80482ae72 100644 --- a/arch/powerpc/kernel/head_fsl_booke.S +++ b/arch/powerpc/kernel/head_fsl_booke.S | |||
@@ -361,7 +361,7 @@ skpinv: addi r6,r6,1 /* Increment */ | |||
361 | 361 | ||
362 | /* ptr to current thread */ | 362 | /* ptr to current thread */ |
363 | addi r4,r2,THREAD /* init task's THREAD */ | 363 | addi r4,r2,THREAD /* init task's THREAD */ |
364 | mtspr SPRN_SPRG3,r4 | 364 | mtspr SPRN_SPRG_THREAD,r4 |
365 | 365 | ||
366 | /* stack */ | 366 | /* stack */ |
367 | lis r1,init_thread_union@h | 367 | lis r1,init_thread_union@h |
@@ -532,12 +532,12 @@ interrupt_base: | |||
532 | 532 | ||
533 | /* Data TLB Error Interrupt */ | 533 | /* Data TLB Error Interrupt */ |
534 | START_EXCEPTION(DataTLBError) | 534 | START_EXCEPTION(DataTLBError) |
535 | mtspr SPRN_SPRG0, r10 /* Save some working registers */ | 535 | mtspr SPRN_SPRG_WSCRATCH0, r10 /* Save some working registers */ |
536 | mtspr SPRN_SPRG1, r11 | 536 | mtspr SPRN_SPRG_WSCRATCH1, r11 |
537 | mtspr SPRN_SPRG4W, r12 | 537 | mtspr SPRN_SPRG_WSCRATCH2, r12 |
538 | mtspr SPRN_SPRG5W, r13 | 538 | mtspr SPRN_SPRG_WSCRATCH3, r13 |
539 | mfcr r11 | 539 | mfcr r11 |
540 | mtspr SPRN_SPRG7W, r11 | 540 | mtspr SPRN_SPRG_WSCRATCH4, r11 |
541 | mfspr r10, SPRN_DEAR /* Get faulting address */ | 541 | mfspr r10, SPRN_DEAR /* Get faulting address */ |
542 | 542 | ||
543 | /* If we are faulting a kernel address, we have to use the | 543 | /* If we are faulting a kernel address, we have to use the |
@@ -557,7 +557,7 @@ interrupt_base: | |||
557 | 557 | ||
558 | /* Get the PGD for the current thread */ | 558 | /* Get the PGD for the current thread */ |
559 | 3: | 559 | 3: |
560 | mfspr r11,SPRN_SPRG3 | 560 | mfspr r11,SPRN_SPRG_THREAD |
561 | lwz r11,PGDIR(r11) | 561 | lwz r11,PGDIR(r11) |
562 | 562 | ||
563 | 4: | 563 | 4: |
@@ -598,12 +598,12 @@ interrupt_base: | |||
598 | /* The bailout. Restore registers to pre-exception conditions | 598 | /* The bailout. Restore registers to pre-exception conditions |
599 | * and call the heavyweights to help us out. | 599 | * and call the heavyweights to help us out. |
600 | */ | 600 | */ |
601 | mfspr r11, SPRN_SPRG7R | 601 | mfspr r11, SPRN_SPRG_RSCRATCH4 |
602 | mtcr r11 | 602 | mtcr r11 |
603 | mfspr r13, SPRN_SPRG5R | 603 | mfspr r13, SPRN_SPRG_RSCRATCH3 |
604 | mfspr r12, SPRN_SPRG4R | 604 | mfspr r12, SPRN_SPRG_RSCRATCH2 |
605 | mfspr r11, SPRN_SPRG1 | 605 | mfspr r11, SPRN_SPRG_RSCRATCH1 |
606 | mfspr r10, SPRN_SPRG0 | 606 | mfspr r10, SPRN_SPRG_RSCRATCH0 |
607 | b DataStorage | 607 | b DataStorage |
608 | 608 | ||
609 | /* Instruction TLB Error Interrupt */ | 609 | /* Instruction TLB Error Interrupt */ |
@@ -613,12 +613,12 @@ interrupt_base: | |||
613 | * to a different point. | 613 | * to a different point. |
614 | */ | 614 | */ |
615 | START_EXCEPTION(InstructionTLBError) | 615 | START_EXCEPTION(InstructionTLBError) |
616 | mtspr SPRN_SPRG0, r10 /* Save some working registers */ | 616 | mtspr SPRN_SPRG_WSCRATCH0, r10 /* Save some working registers */ |
617 | mtspr SPRN_SPRG1, r11 | 617 | mtspr SPRN_SPRG_WSCRATCH1, r11 |
618 | mtspr SPRN_SPRG4W, r12 | 618 | mtspr SPRN_SPRG_WSCRATCH2, r12 |
619 | mtspr SPRN_SPRG5W, r13 | 619 | mtspr SPRN_SPRG_WSCRATCH3, r13 |
620 | mfcr r11 | 620 | mfcr r11 |
621 | mtspr SPRN_SPRG7W, r11 | 621 | mtspr SPRN_SPRG_WSCRATCH4, r11 |
622 | mfspr r10, SPRN_SRR0 /* Get faulting address */ | 622 | mfspr r10, SPRN_SRR0 /* Get faulting address */ |
623 | 623 | ||
624 | /* If we are faulting a kernel address, we have to use the | 624 | /* If we are faulting a kernel address, we have to use the |
@@ -638,7 +638,7 @@ interrupt_base: | |||
638 | 638 | ||
639 | /* Get the PGD for the current thread */ | 639 | /* Get the PGD for the current thread */ |
640 | 3: | 640 | 3: |
641 | mfspr r11,SPRN_SPRG3 | 641 | mfspr r11,SPRN_SPRG_THREAD |
642 | lwz r11,PGDIR(r11) | 642 | lwz r11,PGDIR(r11) |
643 | 643 | ||
644 | 4: | 644 | 4: |
@@ -666,12 +666,12 @@ interrupt_base: | |||
666 | /* The bailout. Restore registers to pre-exception conditions | 666 | /* The bailout. Restore registers to pre-exception conditions |
667 | * and call the heavyweights to help us out. | 667 | * and call the heavyweights to help us out. |
668 | */ | 668 | */ |
669 | mfspr r11, SPRN_SPRG7R | 669 | mfspr r11, SPRN_SPRG_RSCRATCH4 |
670 | mtcr r11 | 670 | mtcr r11 |
671 | mfspr r13, SPRN_SPRG5R | 671 | mfspr r13, SPRN_SPRG_RSCRATCH3 |
672 | mfspr r12, SPRN_SPRG4R | 672 | mfspr r12, SPRN_SPRG_RSCRATCH2 |
673 | mfspr r11, SPRN_SPRG1 | 673 | mfspr r11, SPRN_SPRG_RSCRATCH1 |
674 | mfspr r10, SPRN_SPRG0 | 674 | mfspr r10, SPRN_SPRG_RSCRATCH0 |
675 | b InstructionStorage | 675 | b InstructionStorage |
676 | 676 | ||
677 | #ifdef CONFIG_SPE | 677 | #ifdef CONFIG_SPE |
@@ -790,12 +790,12 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_BIG_PHYS) | |||
790 | tlbwe | 790 | tlbwe |
791 | 791 | ||
792 | /* Done...restore registers and get out of here. */ | 792 | /* Done...restore registers and get out of here. */ |
793 | mfspr r11, SPRN_SPRG7R | 793 | mfspr r11, SPRN_SPRG_RSCRATCH4 |
794 | mtcr r11 | 794 | mtcr r11 |
795 | mfspr r13, SPRN_SPRG5R | 795 | mfspr r13, SPRN_SPRG_RSCRATCH3 |
796 | mfspr r12, SPRN_SPRG4R | 796 | mfspr r12, SPRN_SPRG_RSCRATCH2 |
797 | mfspr r11, SPRN_SPRG1 | 797 | mfspr r11, SPRN_SPRG_RSCRATCH1 |
798 | mfspr r10, SPRN_SPRG0 | 798 | mfspr r10, SPRN_SPRG_RSCRATCH0 |
799 | rfi /* Force context change */ | 799 | rfi /* Force context change */ |
800 | 800 | ||
801 | #ifdef CONFIG_SPE | 801 | #ifdef CONFIG_SPE |
@@ -839,7 +839,7 @@ load_up_spe: | |||
839 | #endif /* !CONFIG_SMP */ | 839 | #endif /* !CONFIG_SMP */ |
840 | /* enable use of SPE after return */ | 840 | /* enable use of SPE after return */ |
841 | oris r9,r9,MSR_SPE@h | 841 | oris r9,r9,MSR_SPE@h |
842 | mfspr r5,SPRN_SPRG3 /* current task's THREAD (phys) */ | 842 | mfspr r5,SPRN_SPRG_THREAD /* current task's THREAD (phys) */ |
843 | li r4,1 | 843 | li r4,1 |
844 | li r10,THREAD_ACC | 844 | li r10,THREAD_ACC |
845 | stw r4,THREAD_USED_SPE(r5) | 845 | stw r4,THREAD_USED_SPE(r5) |
@@ -1118,7 +1118,7 @@ __secondary_start: | |||
1118 | 1118 | ||
1119 | /* ptr to current thread */ | 1119 | /* ptr to current thread */ |
1120 | addi r4,r2,THREAD /* address of our thread_struct */ | 1120 | addi r4,r2,THREAD /* address of our thread_struct */ |
1121 | mtspr SPRN_SPRG3,r4 | 1121 | mtspr SPRN_SPRG_THREAD,r4 |
1122 | 1122 | ||
1123 | /* Setup the defaults for TLB entries */ | 1123 | /* Setup the defaults for TLB entries */ |
1124 | li r4,(MAS4_TSIZED(BOOK3E_PAGESZ_4K))@l | 1124 | li r4,(MAS4_TSIZED(BOOK3E_PAGESZ_4K))@l |
diff --git a/arch/powerpc/kernel/paca.c b/arch/powerpc/kernel/paca.c index e9962c7f8a09..d16b1ea55d44 100644 --- a/arch/powerpc/kernel/paca.c +++ b/arch/powerpc/kernel/paca.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <asm/lppaca.h> | 13 | #include <asm/lppaca.h> |
14 | #include <asm/paca.h> | 14 | #include <asm/paca.h> |
15 | #include <asm/sections.h> | 15 | #include <asm/sections.h> |
16 | #include <asm/pgtable.h> | ||
16 | 17 | ||
17 | /* This symbol is provided by the linker - let it fill in the paca | 18 | /* This symbol is provided by the linker - let it fill in the paca |
18 | * field correctly */ | 19 | * field correctly */ |
@@ -87,6 +88,8 @@ void __init initialise_pacas(void) | |||
87 | 88 | ||
88 | #ifdef CONFIG_PPC_BOOK3S | 89 | #ifdef CONFIG_PPC_BOOK3S |
89 | new_paca->lppaca_ptr = &lppaca[cpu]; | 90 | new_paca->lppaca_ptr = &lppaca[cpu]; |
91 | #else | ||
92 | new_paca->kernel_pgd = swapper_pg_dir; | ||
90 | #endif | 93 | #endif |
91 | new_paca->lock_token = 0x8000; | 94 | new_paca->lock_token = 0x8000; |
92 | new_paca->paca_index = cpu; | 95 | new_paca->paca_index = cpu; |
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 892a9f2e6d76..678ff132e8b0 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
@@ -664,6 +664,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, | |||
664 | sp_vsid |= SLB_VSID_KERNEL | llp; | 664 | sp_vsid |= SLB_VSID_KERNEL | llp; |
665 | p->thread.ksp_vsid = sp_vsid; | 665 | p->thread.ksp_vsid = sp_vsid; |
666 | } | 666 | } |
667 | #endif /* CONFIG_PPC_STD_MMU_64 */ | ||
667 | 668 | ||
668 | /* | 669 | /* |
669 | * The PPC64 ABI makes use of a TOC to contain function | 670 | * The PPC64 ABI makes use of a TOC to contain function |
@@ -671,6 +672,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, | |||
671 | * to the TOC entry. The first entry is a pointer to the actual | 672 | * to the TOC entry. The first entry is a pointer to the actual |
672 | * function. | 673 | * function. |
673 | */ | 674 | */ |
675 | #ifdef CONFIG_PPC64 | ||
674 | kregs->nip = *((unsigned long *)ret_from_fork); | 676 | kregs->nip = *((unsigned long *)ret_from_fork); |
675 | #else | 677 | #else |
676 | kregs->nip = (unsigned long)ret_from_fork; | 678 | kregs->nip = (unsigned long)ret_from_fork; |
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index a538824616fd..864334b337a3 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c | |||
@@ -190,6 +190,8 @@ static int __initdata of_platform; | |||
190 | 190 | ||
191 | static char __initdata prom_cmd_line[COMMAND_LINE_SIZE]; | 191 | static char __initdata prom_cmd_line[COMMAND_LINE_SIZE]; |
192 | 192 | ||
193 | static unsigned long __initdata prom_memory_limit; | ||
194 | |||
193 | static unsigned long __initdata alloc_top; | 195 | static unsigned long __initdata alloc_top; |
194 | static unsigned long __initdata alloc_top_high; | 196 | static unsigned long __initdata alloc_top_high; |
195 | static unsigned long __initdata alloc_bottom; | 197 | static unsigned long __initdata alloc_bottom; |
@@ -484,6 +486,67 @@ static int __init prom_setprop(phandle node, const char *nodename, | |||
484 | return call_prom("interpret", 1, 1, (u32)(unsigned long) cmd); | 486 | return call_prom("interpret", 1, 1, (u32)(unsigned long) cmd); |
485 | } | 487 | } |
486 | 488 | ||
489 | /* We can't use the standard versions because of RELOC headaches. */ | ||
490 | #define isxdigit(c) (('0' <= (c) && (c) <= '9') \ | ||
491 | || ('a' <= (c) && (c) <= 'f') \ | ||
492 | || ('A' <= (c) && (c) <= 'F')) | ||
493 | |||
494 | #define isdigit(c) ('0' <= (c) && (c) <= '9') | ||
495 | #define islower(c) ('a' <= (c) && (c) <= 'z') | ||
496 | #define toupper(c) (islower(c) ? ((c) - 'a' + 'A') : (c)) | ||
497 | |||
498 | unsigned long prom_strtoul(const char *cp, const char **endp) | ||
499 | { | ||
500 | unsigned long result = 0, base = 10, value; | ||
501 | |||
502 | if (*cp == '0') { | ||
503 | base = 8; | ||
504 | cp++; | ||
505 | if (toupper(*cp) == 'X') { | ||
506 | cp++; | ||
507 | base = 16; | ||
508 | } | ||
509 | } | ||
510 | |||
511 | while (isxdigit(*cp) && | ||
512 | (value = isdigit(*cp) ? *cp - '0' : toupper(*cp) - 'A' + 10) < base) { | ||
513 | result = result * base + value; | ||
514 | cp++; | ||
515 | } | ||
516 | |||
517 | if (endp) | ||
518 | *endp = cp; | ||
519 | |||
520 | return result; | ||
521 | } | ||
522 | |||
523 | unsigned long prom_memparse(const char *ptr, const char **retptr) | ||
524 | { | ||
525 | unsigned long ret = prom_strtoul(ptr, retptr); | ||
526 | int shift = 0; | ||
527 | |||
528 | /* | ||
529 | * We can't use a switch here because GCC *may* generate a | ||
530 | * jump table which won't work, because we're not running at | ||
531 | * the address we're linked at. | ||
532 | */ | ||
533 | if ('G' == **retptr || 'g' == **retptr) | ||
534 | shift = 30; | ||
535 | |||
536 | if ('M' == **retptr || 'm' == **retptr) | ||
537 | shift = 20; | ||
538 | |||
539 | if ('K' == **retptr || 'k' == **retptr) | ||
540 | shift = 10; | ||
541 | |||
542 | if (shift) { | ||
543 | ret <<= shift; | ||
544 | (*retptr)++; | ||
545 | } | ||
546 | |||
547 | return ret; | ||
548 | } | ||
549 | |||
487 | /* | 550 | /* |
488 | * Early parsing of the command line passed to the kernel, used for | 551 | * Early parsing of the command line passed to the kernel, used for |
489 | * "mem=x" and the options that affect the iommu | 552 | * "mem=x" and the options that affect the iommu |
@@ -491,9 +554,8 @@ static int __init prom_setprop(phandle node, const char *nodename, | |||
491 | static void __init early_cmdline_parse(void) | 554 | static void __init early_cmdline_parse(void) |
492 | { | 555 | { |
493 | struct prom_t *_prom = &RELOC(prom); | 556 | struct prom_t *_prom = &RELOC(prom); |
494 | #ifdef CONFIG_PPC64 | ||
495 | const char *opt; | 557 | const char *opt; |
496 | #endif | 558 | |
497 | char *p; | 559 | char *p; |
498 | int l = 0; | 560 | int l = 0; |
499 | 561 | ||
@@ -521,6 +583,15 @@ static void __init early_cmdline_parse(void) | |||
521 | RELOC(prom_iommu_force_on) = 1; | 583 | RELOC(prom_iommu_force_on) = 1; |
522 | } | 584 | } |
523 | #endif | 585 | #endif |
586 | opt = strstr(RELOC(prom_cmd_line), RELOC("mem=")); | ||
587 | if (opt) { | ||
588 | opt += 4; | ||
589 | RELOC(prom_memory_limit) = prom_memparse(opt, (const char **)&opt); | ||
590 | #ifdef CONFIG_PPC64 | ||
591 | /* Align to 16 MB == size of ppc64 large page */ | ||
592 | RELOC(prom_memory_limit) = ALIGN(RELOC(prom_memory_limit), 0x1000000); | ||
593 | #endif | ||
594 | } | ||
524 | } | 595 | } |
525 | 596 | ||
526 | #ifdef CONFIG_PPC_PSERIES | 597 | #ifdef CONFIG_PPC_PSERIES |
@@ -1027,6 +1098,29 @@ static void __init prom_init_mem(void) | |||
1027 | } | 1098 | } |
1028 | 1099 | ||
1029 | /* | 1100 | /* |
1101 | * If prom_memory_limit is set we reduce the upper limits *except* for | ||
1102 | * alloc_top_high. This must be the real top of RAM so we can put | ||
1103 | * TCE's up there. | ||
1104 | */ | ||
1105 | |||
1106 | RELOC(alloc_top_high) = RELOC(ram_top); | ||
1107 | |||
1108 | if (RELOC(prom_memory_limit)) { | ||
1109 | if (RELOC(prom_memory_limit) <= RELOC(alloc_bottom)) { | ||
1110 | prom_printf("Ignoring mem=%x <= alloc_bottom.\n", | ||
1111 | RELOC(prom_memory_limit)); | ||
1112 | RELOC(prom_memory_limit) = 0; | ||
1113 | } else if (RELOC(prom_memory_limit) >= RELOC(ram_top)) { | ||
1114 | prom_printf("Ignoring mem=%x >= ram_top.\n", | ||
1115 | RELOC(prom_memory_limit)); | ||
1116 | RELOC(prom_memory_limit) = 0; | ||
1117 | } else { | ||
1118 | RELOC(ram_top) = RELOC(prom_memory_limit); | ||
1119 | RELOC(rmo_top) = min(RELOC(rmo_top), RELOC(prom_memory_limit)); | ||
1120 | } | ||
1121 | } | ||
1122 | |||
1123 | /* | ||
1030 | * Setup our top alloc point, that is top of RMO or top of | 1124 | * Setup our top alloc point, that is top of RMO or top of |
1031 | * segment 0 when running non-LPAR. | 1125 | * segment 0 when running non-LPAR. |
1032 | * Some RS64 machines have buggy firmware where claims up at | 1126 | * Some RS64 machines have buggy firmware where claims up at |
@@ -1041,6 +1135,7 @@ static void __init prom_init_mem(void) | |||
1041 | RELOC(alloc_top_high) = RELOC(ram_top); | 1135 | RELOC(alloc_top_high) = RELOC(ram_top); |
1042 | 1136 | ||
1043 | prom_printf("memory layout at init:\n"); | 1137 | prom_printf("memory layout at init:\n"); |
1138 | prom_printf(" memory_limit : %x (16 MB aligned)\n", RELOC(prom_memory_limit)); | ||
1044 | prom_printf(" alloc_bottom : %x\n", RELOC(alloc_bottom)); | 1139 | prom_printf(" alloc_bottom : %x\n", RELOC(alloc_bottom)); |
1045 | prom_printf(" alloc_top : %x\n", RELOC(alloc_top)); | 1140 | prom_printf(" alloc_top : %x\n", RELOC(alloc_top)); |
1046 | prom_printf(" alloc_top_hi : %x\n", RELOC(alloc_top_high)); | 1141 | prom_printf(" alloc_top_hi : %x\n", RELOC(alloc_top_high)); |
@@ -1259,10 +1354,6 @@ static void __init prom_initialize_tce_table(void) | |||
1259 | * | 1354 | * |
1260 | * -- Cort | 1355 | * -- Cort |
1261 | */ | 1356 | */ |
1262 | extern char __secondary_hold; | ||
1263 | extern unsigned long __secondary_hold_spinloop; | ||
1264 | extern unsigned long __secondary_hold_acknowledge; | ||
1265 | |||
1266 | /* | 1357 | /* |
1267 | * We want to reference the copy of __secondary_hold_* in the | 1358 | * We want to reference the copy of __secondary_hold_* in the |
1268 | * 0 - 0x100 address range | 1359 | * 0 - 0x100 address range |
@@ -2399,6 +2490,10 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, | |||
2399 | /* | 2490 | /* |
2400 | * Fill in some infos for use by the kernel later on | 2491 | * Fill in some infos for use by the kernel later on |
2401 | */ | 2492 | */ |
2493 | if (RELOC(prom_memory_limit)) | ||
2494 | prom_setprop(_prom->chosen, "/chosen", "linux,memory-limit", | ||
2495 | &RELOC(prom_memory_limit), | ||
2496 | sizeof(prom_memory_limit)); | ||
2402 | #ifdef CONFIG_PPC64 | 2497 | #ifdef CONFIG_PPC64 |
2403 | if (RELOC(prom_iommu_off)) | 2498 | if (RELOC(prom_iommu_off)) |
2404 | prom_setprop(_prom->chosen, "/chosen", "linux,iommu-off", | 2499 | prom_setprop(_prom->chosen, "/chosen", "linux,iommu-off", |
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index 1f6816003ebe..87df51720641 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
@@ -62,6 +62,7 @@ | |||
62 | #include <asm/udbg.h> | 62 | #include <asm/udbg.h> |
63 | #include <asm/kexec.h> | 63 | #include <asm/kexec.h> |
64 | #include <asm/swiotlb.h> | 64 | #include <asm/swiotlb.h> |
65 | #include <asm/mmu_context.h> | ||
65 | 66 | ||
66 | #include "setup.h" | 67 | #include "setup.h" |
67 | 68 | ||
@@ -142,11 +143,14 @@ early_param("smt-enabled", early_smt_enabled); | |||
142 | #define check_smt_enabled() | 143 | #define check_smt_enabled() |
143 | #endif /* CONFIG_SMP */ | 144 | #endif /* CONFIG_SMP */ |
144 | 145 | ||
145 | /* Put the paca pointer into r13 and SPRG3 */ | 146 | /* Put the paca pointer into r13 and SPRG_PACA */ |
146 | void __init setup_paca(int cpu) | 147 | void __init setup_paca(int cpu) |
147 | { | 148 | { |
148 | local_paca = &paca[cpu]; | 149 | local_paca = &paca[cpu]; |
149 | mtspr(SPRN_SPRG3, local_paca); | 150 | mtspr(SPRN_SPRG_PACA, local_paca); |
151 | #ifdef CONFIG_PPC_BOOK3E | ||
152 | mtspr(SPRN_SPRG_TLB_EXFRAME, local_paca->extlb); | ||
153 | #endif | ||
150 | } | 154 | } |
151 | 155 | ||
152 | /* | 156 | /* |
@@ -230,9 +234,6 @@ void early_setup_secondary(void) | |||
230 | #endif /* CONFIG_SMP */ | 234 | #endif /* CONFIG_SMP */ |
231 | 235 | ||
232 | #if defined(CONFIG_SMP) || defined(CONFIG_KEXEC) | 236 | #if defined(CONFIG_SMP) || defined(CONFIG_KEXEC) |
233 | extern unsigned long __secondary_hold_spinloop; | ||
234 | extern void generic_secondary_smp_init(void); | ||
235 | |||
236 | void smp_release_cpus(void) | 237 | void smp_release_cpus(void) |
237 | { | 238 | { |
238 | unsigned long *ptr; | 239 | unsigned long *ptr; |
@@ -453,6 +454,24 @@ static void __init irqstack_early_init(void) | |||
453 | #define irqstack_early_init() | 454 | #define irqstack_early_init() |
454 | #endif | 455 | #endif |
455 | 456 | ||
457 | #ifdef CONFIG_PPC_BOOK3E | ||
458 | static void __init exc_lvl_early_init(void) | ||
459 | { | ||
460 | unsigned int i; | ||
461 | |||
462 | for_each_possible_cpu(i) { | ||
463 | critirq_ctx[i] = (struct thread_info *) | ||
464 | __va(lmb_alloc(THREAD_SIZE, THREAD_SIZE)); | ||
465 | dbgirq_ctx[i] = (struct thread_info *) | ||
466 | __va(lmb_alloc(THREAD_SIZE, THREAD_SIZE)); | ||
467 | mcheckirq_ctx[i] = (struct thread_info *) | ||
468 | __va(lmb_alloc(THREAD_SIZE, THREAD_SIZE)); | ||
469 | } | ||
470 | } | ||
471 | #else | ||
472 | #define exc_lvl_early_init() | ||
473 | #endif | ||
474 | |||
456 | /* | 475 | /* |
457 | * Stack space used when we detect a bad kernel stack pointer, and | 476 | * Stack space used when we detect a bad kernel stack pointer, and |
458 | * early in SMP boots before relocation is enabled. | 477 | * early in SMP boots before relocation is enabled. |
@@ -512,6 +531,7 @@ void __init setup_arch(char **cmdline_p) | |||
512 | init_mm.brk = klimit; | 531 | init_mm.brk = klimit; |
513 | 532 | ||
514 | irqstack_early_init(); | 533 | irqstack_early_init(); |
534 | exc_lvl_early_init(); | ||
515 | emergency_stack_init(); | 535 | emergency_stack_init(); |
516 | 536 | ||
517 | #ifdef CONFIG_PPC_STD_MMU_64 | 537 | #ifdef CONFIG_PPC_STD_MMU_64 |
@@ -534,6 +554,10 @@ void __init setup_arch(char **cmdline_p) | |||
534 | #endif | 554 | #endif |
535 | 555 | ||
536 | paging_init(); | 556 | paging_init(); |
557 | |||
558 | /* Initialize the MMU context management stuff */ | ||
559 | mmu_context_init(); | ||
560 | |||
537 | ppc64_boot_msg(0x15, "Setup Done"); | 561 | ppc64_boot_msg(0x15, "Setup Done"); |
538 | } | 562 | } |
539 | 563 | ||
diff --git a/arch/powerpc/kernel/sys_ppc32.c b/arch/powerpc/kernel/sys_ppc32.c index bb1cfcfdbbbb..1cc5e9e5da96 100644 --- a/arch/powerpc/kernel/sys_ppc32.c +++ b/arch/powerpc/kernel/sys_ppc32.c | |||
@@ -343,6 +343,18 @@ off_t ppc32_lseek(unsigned int fd, u32 offset, unsigned int origin) | |||
343 | return sys_lseek(fd, (int)offset, origin); | 343 | return sys_lseek(fd, (int)offset, origin); |
344 | } | 344 | } |
345 | 345 | ||
346 | long compat_sys_truncate(const char __user * path, u32 length) | ||
347 | { | ||
348 | /* sign extend length */ | ||
349 | return sys_truncate(path, (int)length); | ||
350 | } | ||
351 | |||
352 | long compat_sys_ftruncate(int fd, u32 length) | ||
353 | { | ||
354 | /* sign extend length */ | ||
355 | return sys_ftruncate(fd, (int)length); | ||
356 | } | ||
357 | |||
346 | /* Note: it is necessary to treat bufsiz as an unsigned int, | 358 | /* Note: it is necessary to treat bufsiz as an unsigned int, |
347 | * with the corresponding cast to a signed int to insure that the | 359 | * with the corresponding cast to a signed int to insure that the |
348 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | 360 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) |
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index eae4511ceeac..edb1edb36469 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
@@ -479,7 +479,8 @@ static int __init iSeries_tb_recal(void) | |||
479 | unsigned long tb_ticks = tb - iSeries_recal_tb; | 479 | unsigned long tb_ticks = tb - iSeries_recal_tb; |
480 | unsigned long titan_usec = (titan - iSeries_recal_titan) >> 12; | 480 | unsigned long titan_usec = (titan - iSeries_recal_titan) >> 12; |
481 | unsigned long new_tb_ticks_per_sec = (tb_ticks * USEC_PER_SEC)/titan_usec; | 481 | unsigned long new_tb_ticks_per_sec = (tb_ticks * USEC_PER_SEC)/titan_usec; |
482 | unsigned long new_tb_ticks_per_jiffy = (new_tb_ticks_per_sec+(HZ/2))/HZ; | 482 | unsigned long new_tb_ticks_per_jiffy = |
483 | DIV_ROUND_CLOSEST(new_tb_ticks_per_sec, HZ); | ||
483 | long tick_diff = new_tb_ticks_per_jiffy - tb_ticks_per_jiffy; | 484 | long tick_diff = new_tb_ticks_per_jiffy - tb_ticks_per_jiffy; |
484 | char sign = '+'; | 485 | char sign = '+'; |
485 | /* make sure tb_ticks_per_sec and tb_ticks_per_jiffy are consistent */ | 486 | /* make sure tb_ticks_per_sec and tb_ticks_per_jiffy are consistent */ |
diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c index ad06d5c75b15..a0abce251d0a 100644 --- a/arch/powerpc/kernel/vdso.c +++ b/arch/powerpc/kernel/vdso.c | |||
@@ -203,7 +203,12 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) | |||
203 | } else { | 203 | } else { |
204 | vdso_pagelist = vdso64_pagelist; | 204 | vdso_pagelist = vdso64_pagelist; |
205 | vdso_pages = vdso64_pages; | 205 | vdso_pages = vdso64_pages; |
206 | vdso_base = VDSO64_MBASE; | 206 | /* |
207 | * On 64bit we don't have a preferred map address. This | ||
208 | * allows get_unmapped_area to find an area near other mmaps | ||
209 | * and most likely share a SLB entry. | ||
210 | */ | ||
211 | vdso_base = 0; | ||
207 | } | 212 | } |
208 | #else | 213 | #else |
209 | vdso_pagelist = vdso32_pagelist; | 214 | vdso_pagelist = vdso32_pagelist; |
diff --git a/arch/powerpc/kernel/vdso32/Makefile b/arch/powerpc/kernel/vdso32/Makefile index c3d57bd01a88..b54b81688132 100644 --- a/arch/powerpc/kernel/vdso32/Makefile +++ b/arch/powerpc/kernel/vdso32/Makefile | |||
@@ -12,6 +12,7 @@ endif | |||
12 | targets := $(obj-vdso32) vdso32.so vdso32.so.dbg | 12 | targets := $(obj-vdso32) vdso32.so vdso32.so.dbg |
13 | obj-vdso32 := $(addprefix $(obj)/, $(obj-vdso32)) | 13 | obj-vdso32 := $(addprefix $(obj)/, $(obj-vdso32)) |
14 | 14 | ||
15 | GCOV_PROFILE := n | ||
15 | 16 | ||
16 | EXTRA_CFLAGS := -shared -fno-common -fno-builtin | 17 | EXTRA_CFLAGS := -shared -fno-common -fno-builtin |
17 | EXTRA_CFLAGS += -nostdlib -Wl,-soname=linux-vdso32.so.1 \ | 18 | EXTRA_CFLAGS += -nostdlib -Wl,-soname=linux-vdso32.so.1 \ |
diff --git a/arch/powerpc/kernel/vdso64/Makefile b/arch/powerpc/kernel/vdso64/Makefile index fa7f1b8f3e50..dd0c8e936775 100644 --- a/arch/powerpc/kernel/vdso64/Makefile +++ b/arch/powerpc/kernel/vdso64/Makefile | |||
@@ -7,6 +7,8 @@ obj-vdso64 = sigtramp.o gettimeofday.o datapage.o cacheflush.o note.o | |||
7 | targets := $(obj-vdso64) vdso64.so vdso64.so.dbg | 7 | targets := $(obj-vdso64) vdso64.so vdso64.so.dbg |
8 | obj-vdso64 := $(addprefix $(obj)/, $(obj-vdso64)) | 8 | obj-vdso64 := $(addprefix $(obj)/, $(obj-vdso64)) |
9 | 9 | ||
10 | GCOV_PROFILE := n | ||
11 | |||
10 | EXTRA_CFLAGS := -shared -fno-common -fno-builtin | 12 | EXTRA_CFLAGS := -shared -fno-common -fno-builtin |
11 | EXTRA_CFLAGS += -nostdlib -Wl,-soname=linux-vdso64.so.1 \ | 13 | EXTRA_CFLAGS += -nostdlib -Wl,-soname=linux-vdso64.so.1 \ |
12 | $(call ld-option, -Wl$(comma)--hash-style=sysv) | 14 | $(call ld-option, -Wl$(comma)--hash-style=sysv) |
diff --git a/arch/powerpc/kernel/vector.S b/arch/powerpc/kernel/vector.S index ea4d64644d02..67b6916f0e94 100644 --- a/arch/powerpc/kernel/vector.S +++ b/arch/powerpc/kernel/vector.S | |||
@@ -65,7 +65,7 @@ _GLOBAL(load_up_altivec) | |||
65 | 1: | 65 | 1: |
66 | /* enable use of VMX after return */ | 66 | /* enable use of VMX after return */ |
67 | #ifdef CONFIG_PPC32 | 67 | #ifdef CONFIG_PPC32 |
68 | mfspr r5,SPRN_SPRG3 /* current task's THREAD (phys) */ | 68 | mfspr r5,SPRN_SPRG_THREAD /* current task's THREAD (phys) */ |
69 | oris r9,r9,MSR_VEC@h | 69 | oris r9,r9,MSR_VEC@h |
70 | #else | 70 | #else |
71 | ld r4,PACACURRENT(r13) | 71 | ld r4,PACACURRENT(r13) |
diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S index 8ef8a14abc95..3bb09975e342 100644 --- a/arch/powerpc/kernel/vmlinux.lds.S +++ b/arch/powerpc/kernel/vmlinux.lds.S | |||
@@ -245,10 +245,6 @@ SECTIONS | |||
245 | } | 245 | } |
246 | #endif | 246 | #endif |
247 | 247 | ||
248 | . = ALIGN(PAGE_SIZE); | ||
249 | _edata = .; | ||
250 | PROVIDE32 (edata = .); | ||
251 | |||
252 | /* The initial task and kernel stack */ | 248 | /* The initial task and kernel stack */ |
253 | #ifdef CONFIG_PPC32 | 249 | #ifdef CONFIG_PPC32 |
254 | . = ALIGN(8192); | 250 | . = ALIGN(8192); |
@@ -282,6 +278,10 @@ SECTIONS | |||
282 | __nosave_end = .; | 278 | __nosave_end = .; |
283 | } | 279 | } |
284 | 280 | ||
281 | . = ALIGN(PAGE_SIZE); | ||
282 | _edata = .; | ||
283 | PROVIDE32 (edata = .); | ||
284 | |||
285 | /* | 285 | /* |
286 | * And finally the bss | 286 | * And finally the bss |
287 | */ | 287 | */ |
diff --git a/arch/powerpc/kvm/booke_interrupts.S b/arch/powerpc/kvm/booke_interrupts.S index d0c6f841bbd1..380a78cf484d 100644 --- a/arch/powerpc/kvm/booke_interrupts.S +++ b/arch/powerpc/kvm/booke_interrupts.S | |||
@@ -56,8 +56,8 @@ | |||
56 | .macro KVM_HANDLER ivor_nr | 56 | .macro KVM_HANDLER ivor_nr |
57 | _GLOBAL(kvmppc_handler_\ivor_nr) | 57 | _GLOBAL(kvmppc_handler_\ivor_nr) |
58 | /* Get pointer to vcpu and record exit number. */ | 58 | /* Get pointer to vcpu and record exit number. */ |
59 | mtspr SPRN_SPRG0, r4 | 59 | mtspr SPRN_SPRG_WSCRATCH0, r4 |
60 | mfspr r4, SPRN_SPRG1 | 60 | mfspr r4, SPRN_SPRG_RVCPU |
61 | stw r5, VCPU_GPR(r5)(r4) | 61 | stw r5, VCPU_GPR(r5)(r4) |
62 | stw r6, VCPU_GPR(r6)(r4) | 62 | stw r6, VCPU_GPR(r6)(r4) |
63 | mfctr r5 | 63 | mfctr r5 |
@@ -95,7 +95,7 @@ _GLOBAL(kvmppc_handler_len) | |||
95 | 95 | ||
96 | 96 | ||
97 | /* Registers: | 97 | /* Registers: |
98 | * SPRG0: guest r4 | 98 | * SPRG_SCRATCH0: guest r4 |
99 | * r4: vcpu pointer | 99 | * r4: vcpu pointer |
100 | * r5: KVM exit number | 100 | * r5: KVM exit number |
101 | */ | 101 | */ |
@@ -181,7 +181,7 @@ _GLOBAL(kvmppc_resume_host) | |||
181 | stw r3, VCPU_LR(r4) | 181 | stw r3, VCPU_LR(r4) |
182 | mfxer r3 | 182 | mfxer r3 |
183 | stw r3, VCPU_XER(r4) | 183 | stw r3, VCPU_XER(r4) |
184 | mfspr r3, SPRN_SPRG0 | 184 | mfspr r3, SPRN_SPRG_RSCRATCH0 |
185 | stw r3, VCPU_GPR(r4)(r4) | 185 | stw r3, VCPU_GPR(r4)(r4) |
186 | mfspr r3, SPRN_SRR0 | 186 | mfspr r3, SPRN_SRR0 |
187 | stw r3, VCPU_PC(r4) | 187 | stw r3, VCPU_PC(r4) |
@@ -374,7 +374,7 @@ lightweight_exit: | |||
374 | mtspr SPRN_IVPR, r8 | 374 | mtspr SPRN_IVPR, r8 |
375 | 375 | ||
376 | /* Save vcpu pointer for the exception handlers. */ | 376 | /* Save vcpu pointer for the exception handlers. */ |
377 | mtspr SPRN_SPRG1, r4 | 377 | mtspr SPRN_SPRG_WVCPU, r4 |
378 | 378 | ||
379 | /* Can't switch the stack pointer until after IVPR is switched, | 379 | /* Can't switch the stack pointer until after IVPR is switched, |
380 | * because host interrupt handlers would get confused. */ | 380 | * because host interrupt handlers would get confused. */ |
@@ -384,13 +384,13 @@ lightweight_exit: | |||
384 | /* Host interrupt handlers may have clobbered these guest-readable | 384 | /* Host interrupt handlers may have clobbered these guest-readable |
385 | * SPRGs, so we need to reload them here with the guest's values. */ | 385 | * SPRGs, so we need to reload them here with the guest's values. */ |
386 | lwz r3, VCPU_SPRG4(r4) | 386 | lwz r3, VCPU_SPRG4(r4) |
387 | mtspr SPRN_SPRG4, r3 | 387 | mtspr SPRN_SPRG4W, r3 |
388 | lwz r3, VCPU_SPRG5(r4) | 388 | lwz r3, VCPU_SPRG5(r4) |
389 | mtspr SPRN_SPRG5, r3 | 389 | mtspr SPRN_SPRG5W, r3 |
390 | lwz r3, VCPU_SPRG6(r4) | 390 | lwz r3, VCPU_SPRG6(r4) |
391 | mtspr SPRN_SPRG6, r3 | 391 | mtspr SPRN_SPRG6W, r3 |
392 | lwz r3, VCPU_SPRG7(r4) | 392 | lwz r3, VCPU_SPRG7(r4) |
393 | mtspr SPRN_SPRG7, r3 | 393 | mtspr SPRN_SPRG7W, r3 |
394 | 394 | ||
395 | #ifdef CONFIG_KVM_EXIT_TIMING | 395 | #ifdef CONFIG_KVM_EXIT_TIMING |
396 | /* save enter time */ | 396 | /* save enter time */ |
diff --git a/arch/powerpc/mm/Makefile b/arch/powerpc/mm/Makefile index 3e68363405b7..6fb8fc8d2fea 100644 --- a/arch/powerpc/mm/Makefile +++ b/arch/powerpc/mm/Makefile | |||
@@ -13,6 +13,7 @@ obj-y := fault.o mem.o pgtable.o gup.o \ | |||
13 | pgtable_$(CONFIG_WORD_SIZE).o | 13 | pgtable_$(CONFIG_WORD_SIZE).o |
14 | obj-$(CONFIG_PPC_MMU_NOHASH) += mmu_context_nohash.o tlb_nohash.o \ | 14 | obj-$(CONFIG_PPC_MMU_NOHASH) += mmu_context_nohash.o tlb_nohash.o \ |
15 | tlb_nohash_low.o | 15 | tlb_nohash_low.o |
16 | obj-$(CONFIG_PPC_BOOK3E) += tlb_low_$(CONFIG_WORD_SIZE)e.o | ||
16 | obj-$(CONFIG_PPC64) += mmap_64.o | 17 | obj-$(CONFIG_PPC64) += mmap_64.o |
17 | hash64-$(CONFIG_PPC_NATIVE) := hash_native_64.o | 18 | hash64-$(CONFIG_PPC_NATIVE) := hash_native_64.o |
18 | obj-$(CONFIG_PPC_STD_MMU_64) += hash_utils_64.o \ | 19 | obj-$(CONFIG_PPC_STD_MMU_64) += hash_utils_64.o \ |
diff --git a/arch/powerpc/mm/fsl_booke_mmu.c b/arch/powerpc/mm/fsl_booke_mmu.c index bb3d65998e6b..dc93e95b256e 100644 --- a/arch/powerpc/mm/fsl_booke_mmu.c +++ b/arch/powerpc/mm/fsl_booke_mmu.c | |||
@@ -161,7 +161,7 @@ unsigned long __init mmu_mapin_ram(void) | |||
161 | unsigned long virt = PAGE_OFFSET; | 161 | unsigned long virt = PAGE_OFFSET; |
162 | phys_addr_t phys = memstart_addr; | 162 | phys_addr_t phys = memstart_addr; |
163 | 163 | ||
164 | while (cam[tlbcam_index] && tlbcam_index < ARRAY_SIZE(cam)) { | 164 | while (tlbcam_index < ARRAY_SIZE(cam) && cam[tlbcam_index]) { |
165 | settlbcam(tlbcam_index, virt, phys, cam[tlbcam_index], PAGE_KERNEL_X, 0); | 165 | settlbcam(tlbcam_index, virt, phys, cam[tlbcam_index], PAGE_KERNEL_X, 0); |
166 | virt += cam[tlbcam_index]; | 166 | virt += cam[tlbcam_index]; |
167 | phys += cam[tlbcam_index]; | 167 | phys += cam[tlbcam_index]; |
diff --git a/arch/powerpc/mm/hash_low_32.S b/arch/powerpc/mm/hash_low_32.S index 14af8cedab70..b13d58932bf6 100644 --- a/arch/powerpc/mm/hash_low_32.S +++ b/arch/powerpc/mm/hash_low_32.S | |||
@@ -40,7 +40,7 @@ mmu_hash_lock: | |||
40 | * The address is in r4, and r3 contains an access flag: | 40 | * The address is in r4, and r3 contains an access flag: |
41 | * _PAGE_RW (0x400) if a write. | 41 | * _PAGE_RW (0x400) if a write. |
42 | * r9 contains the SRR1 value, from which we use the MSR_PR bit. | 42 | * r9 contains the SRR1 value, from which we use the MSR_PR bit. |
43 | * SPRG3 contains the physical address of the current task's thread. | 43 | * SPRG_THREAD contains the physical address of the current task's thread. |
44 | * | 44 | * |
45 | * Returns to the caller if the access is illegal or there is no | 45 | * Returns to the caller if the access is illegal or there is no |
46 | * mapping for the address. Otherwise it places an appropriate PTE | 46 | * mapping for the address. Otherwise it places an appropriate PTE |
@@ -68,7 +68,7 @@ _GLOBAL(hash_page) | |||
68 | /* Get PTE (linux-style) and check access */ | 68 | /* Get PTE (linux-style) and check access */ |
69 | lis r0,KERNELBASE@h /* check if kernel address */ | 69 | lis r0,KERNELBASE@h /* check if kernel address */ |
70 | cmplw 0,r4,r0 | 70 | cmplw 0,r4,r0 |
71 | mfspr r8,SPRN_SPRG3 /* current task's THREAD (phys) */ | 71 | mfspr r8,SPRN_SPRG_THREAD /* current task's THREAD (phys) */ |
72 | ori r3,r3,_PAGE_USER|_PAGE_PRESENT /* test low addresses as user */ | 72 | ori r3,r3,_PAGE_USER|_PAGE_PRESENT /* test low addresses as user */ |
73 | lwz r5,PGDIR(r8) /* virt page-table root */ | 73 | lwz r5,PGDIR(r8) /* virt page-table root */ |
74 | blt+ 112f /* assume user more likely */ | 74 | blt+ 112f /* assume user more likely */ |
diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c index c46ef2ffa3d9..90df6ffe3a43 100644 --- a/arch/powerpc/mm/hugetlbpage.c +++ b/arch/powerpc/mm/hugetlbpage.c | |||
@@ -57,8 +57,10 @@ unsigned int mmu_huge_psizes[MMU_PAGE_COUNT] = { }; /* initialize all to 0 */ | |||
57 | #define HUGEPTE_CACHE_NAME(psize) (huge_pgtable_cache_name[psize]) | 57 | #define HUGEPTE_CACHE_NAME(psize) (huge_pgtable_cache_name[psize]) |
58 | 58 | ||
59 | static const char *huge_pgtable_cache_name[MMU_PAGE_COUNT] = { | 59 | static const char *huge_pgtable_cache_name[MMU_PAGE_COUNT] = { |
60 | "unused_4K", "hugepte_cache_64K", "unused_64K_AP", | 60 | [MMU_PAGE_64K] = "hugepte_cache_64K", |
61 | "hugepte_cache_1M", "hugepte_cache_16M", "hugepte_cache_16G" | 61 | [MMU_PAGE_1M] = "hugepte_cache_1M", |
62 | [MMU_PAGE_16M] = "hugepte_cache_16M", | ||
63 | [MMU_PAGE_16G] = "hugepte_cache_16G", | ||
62 | }; | 64 | }; |
63 | 65 | ||
64 | /* Flag to mark huge PD pointers. This means pmd_bad() and pud_bad() | 66 | /* Flag to mark huge PD pointers. This means pmd_bad() and pud_bad() |
@@ -700,6 +702,8 @@ static void __init set_huge_psize(int psize) | |||
700 | if (mmu_huge_psizes[psize] || | 702 | if (mmu_huge_psizes[psize] || |
701 | mmu_psize_defs[psize].shift == PAGE_SHIFT) | 703 | mmu_psize_defs[psize].shift == PAGE_SHIFT) |
702 | return; | 704 | return; |
705 | if (WARN_ON(HUGEPTE_CACHE_NAME(psize) == NULL)) | ||
706 | return; | ||
703 | hugetlb_add_hstate(mmu_psize_defs[psize].shift - PAGE_SHIFT); | 707 | hugetlb_add_hstate(mmu_psize_defs[psize].shift - PAGE_SHIFT); |
704 | 708 | ||
705 | switch (mmu_psize_defs[psize].shift) { | 709 | switch (mmu_psize_defs[psize].shift) { |
diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c index 3de6a0d93824..3ef5084b90ca 100644 --- a/arch/powerpc/mm/init_32.c +++ b/arch/powerpc/mm/init_32.c | |||
@@ -54,8 +54,6 @@ | |||
54 | #endif | 54 | #endif |
55 | #define MAX_LOW_MEM CONFIG_LOWMEM_SIZE | 55 | #define MAX_LOW_MEM CONFIG_LOWMEM_SIZE |
56 | 56 | ||
57 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | ||
58 | |||
59 | phys_addr_t total_memory; | 57 | phys_addr_t total_memory; |
60 | phys_addr_t total_lowmem; | 58 | phys_addr_t total_lowmem; |
61 | 59 | ||
diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c index 68a821add28d..31582329cd67 100644 --- a/arch/powerpc/mm/init_64.c +++ b/arch/powerpc/mm/init_64.c | |||
@@ -205,6 +205,47 @@ static int __meminit vmemmap_populated(unsigned long start, int page_size) | |||
205 | return 0; | 205 | return 0; |
206 | } | 206 | } |
207 | 207 | ||
208 | /* On hash-based CPUs, the vmemmap is bolted in the hash table. | ||
209 | * | ||
210 | * On Book3E CPUs, the vmemmap is currently mapped in the top half of | ||
211 | * the vmalloc space using normal page tables, though the size of | ||
212 | * pages encoded in the PTEs can be different | ||
213 | */ | ||
214 | |||
215 | #ifdef CONFIG_PPC_BOOK3E | ||
216 | static void __meminit vmemmap_create_mapping(unsigned long start, | ||
217 | unsigned long page_size, | ||
218 | unsigned long phys) | ||
219 | { | ||
220 | /* Create a PTE encoding without page size */ | ||
221 | unsigned long i, flags = _PAGE_PRESENT | _PAGE_ACCESSED | | ||
222 | _PAGE_KERNEL_RW; | ||
223 | |||
224 | /* PTEs only contain page size encodings up to 32M */ | ||
225 | BUG_ON(mmu_psize_defs[mmu_vmemmap_psize].enc > 0xf); | ||
226 | |||
227 | /* Encode the size in the PTE */ | ||
228 | flags |= mmu_psize_defs[mmu_vmemmap_psize].enc << 8; | ||
229 | |||
230 | /* For each PTE for that area, map things. Note that we don't | ||
231 | * increment phys because all PTEs are of the large size and | ||
232 | * thus must have the low bits clear | ||
233 | */ | ||
234 | for (i = 0; i < page_size; i += PAGE_SIZE) | ||
235 | BUG_ON(map_kernel_page(start + i, phys, flags)); | ||
236 | } | ||
237 | #else /* CONFIG_PPC_BOOK3E */ | ||
238 | static void __meminit vmemmap_create_mapping(unsigned long start, | ||
239 | unsigned long page_size, | ||
240 | unsigned long phys) | ||
241 | { | ||
242 | int mapped = htab_bolt_mapping(start, start + page_size, phys, | ||
243 | PAGE_KERNEL, mmu_vmemmap_psize, | ||
244 | mmu_kernel_ssize); | ||
245 | BUG_ON(mapped < 0); | ||
246 | } | ||
247 | #endif /* CONFIG_PPC_BOOK3E */ | ||
248 | |||
208 | int __meminit vmemmap_populate(struct page *start_page, | 249 | int __meminit vmemmap_populate(struct page *start_page, |
209 | unsigned long nr_pages, int node) | 250 | unsigned long nr_pages, int node) |
210 | { | 251 | { |
@@ -215,8 +256,11 @@ int __meminit vmemmap_populate(struct page *start_page, | |||
215 | /* Align to the page size of the linear mapping. */ | 256 | /* Align to the page size of the linear mapping. */ |
216 | start = _ALIGN_DOWN(start, page_size); | 257 | start = _ALIGN_DOWN(start, page_size); |
217 | 258 | ||
259 | pr_debug("vmemmap_populate page %p, %ld pages, node %d\n", | ||
260 | start_page, nr_pages, node); | ||
261 | pr_debug(" -> map %lx..%lx\n", start, end); | ||
262 | |||
218 | for (; start < end; start += page_size) { | 263 | for (; start < end; start += page_size) { |
219 | int mapped; | ||
220 | void *p; | 264 | void *p; |
221 | 265 | ||
222 | if (vmemmap_populated(start, page_size)) | 266 | if (vmemmap_populated(start, page_size)) |
@@ -226,13 +270,10 @@ int __meminit vmemmap_populate(struct page *start_page, | |||
226 | if (!p) | 270 | if (!p) |
227 | return -ENOMEM; | 271 | return -ENOMEM; |
228 | 272 | ||
229 | pr_debug("vmemmap %08lx allocated at %p, physical %08lx.\n", | 273 | pr_debug(" * %016lx..%016lx allocated at %p\n", |
230 | start, p, __pa(p)); | 274 | start, start + page_size, p); |
231 | 275 | ||
232 | mapped = htab_bolt_mapping(start, start + page_size, __pa(p), | 276 | vmemmap_create_mapping(start, page_size, __pa(p)); |
233 | pgprot_val(PAGE_KERNEL), | ||
234 | mmu_vmemmap_psize, mmu_kernel_ssize); | ||
235 | BUG_ON(mapped < 0); | ||
236 | } | 277 | } |
237 | 278 | ||
238 | return 0; | 279 | return 0; |
diff --git a/arch/powerpc/mm/mmu_context_nohash.c b/arch/powerpc/mm/mmu_context_nohash.c index b1a727def15b..c2f93dc470e6 100644 --- a/arch/powerpc/mm/mmu_context_nohash.c +++ b/arch/powerpc/mm/mmu_context_nohash.c | |||
@@ -25,10 +25,20 @@ | |||
25 | * also clear mm->cpu_vm_mask bits when processes are migrated | 25 | * also clear mm->cpu_vm_mask bits when processes are migrated |
26 | */ | 26 | */ |
27 | 27 | ||
28 | #undef DEBUG | 28 | #define DEBUG_MAP_CONSISTENCY |
29 | #define DEBUG_STEAL_ONLY | 29 | #define DEBUG_CLAMP_LAST_CONTEXT 31 |
30 | #undef DEBUG_MAP_CONSISTENCY | 30 | //#define DEBUG_HARDER |
31 | /*#define DEBUG_CLAMP_LAST_CONTEXT 15 */ | 31 | |
32 | /* We don't use DEBUG because it tends to be compiled in always nowadays | ||
33 | * and this would generate way too much output | ||
34 | */ | ||
35 | #ifdef DEBUG_HARDER | ||
36 | #define pr_hard(args...) printk(KERN_DEBUG args) | ||
37 | #define pr_hardcont(args...) printk(KERN_CONT args) | ||
38 | #else | ||
39 | #define pr_hard(args...) do { } while(0) | ||
40 | #define pr_hardcont(args...) do { } while(0) | ||
41 | #endif | ||
32 | 42 | ||
33 | #include <linux/kernel.h> | 43 | #include <linux/kernel.h> |
34 | #include <linux/mm.h> | 44 | #include <linux/mm.h> |
@@ -71,7 +81,7 @@ static DEFINE_SPINLOCK(context_lock); | |||
71 | static unsigned int steal_context_smp(unsigned int id) | 81 | static unsigned int steal_context_smp(unsigned int id) |
72 | { | 82 | { |
73 | struct mm_struct *mm; | 83 | struct mm_struct *mm; |
74 | unsigned int cpu, max; | 84 | unsigned int cpu, max, i; |
75 | 85 | ||
76 | max = last_context - first_context; | 86 | max = last_context - first_context; |
77 | 87 | ||
@@ -89,15 +99,22 @@ static unsigned int steal_context_smp(unsigned int id) | |||
89 | id = first_context; | 99 | id = first_context; |
90 | continue; | 100 | continue; |
91 | } | 101 | } |
92 | pr_devel("[%d] steal context %d from mm @%p\n", | 102 | pr_hardcont(" | steal %d from 0x%p", id, mm); |
93 | smp_processor_id(), id, mm); | ||
94 | 103 | ||
95 | /* Mark this mm has having no context anymore */ | 104 | /* Mark this mm has having no context anymore */ |
96 | mm->context.id = MMU_NO_CONTEXT; | 105 | mm->context.id = MMU_NO_CONTEXT; |
97 | 106 | ||
98 | /* Mark it stale on all CPUs that used this mm */ | 107 | /* Mark it stale on all CPUs that used this mm. For threaded |
99 | for_each_cpu(cpu, mm_cpumask(mm)) | 108 | * implementations, we set it on all threads on each core |
100 | __set_bit(id, stale_map[cpu]); | 109 | * represented in the mask. A future implementation will use |
110 | * a core map instead but this will do for now. | ||
111 | */ | ||
112 | for_each_cpu(cpu, mm_cpumask(mm)) { | ||
113 | for (i = cpu_first_thread_in_core(cpu); | ||
114 | i <= cpu_last_thread_in_core(cpu); i++) | ||
115 | __set_bit(id, stale_map[i]); | ||
116 | cpu = i - 1; | ||
117 | } | ||
101 | return id; | 118 | return id; |
102 | } | 119 | } |
103 | 120 | ||
@@ -126,7 +143,7 @@ static unsigned int steal_context_up(unsigned int id) | |||
126 | /* Pick up the victim mm */ | 143 | /* Pick up the victim mm */ |
127 | mm = context_mm[id]; | 144 | mm = context_mm[id]; |
128 | 145 | ||
129 | pr_devel("[%d] steal context %d from mm @%p\n", cpu, id, mm); | 146 | pr_hardcont(" | steal %d from 0x%p", id, mm); |
130 | 147 | ||
131 | /* Flush the TLB for that context */ | 148 | /* Flush the TLB for that context */ |
132 | local_flush_tlb_mm(mm); | 149 | local_flush_tlb_mm(mm); |
@@ -173,25 +190,20 @@ static void context_check_map(void) { } | |||
173 | 190 | ||
174 | void switch_mmu_context(struct mm_struct *prev, struct mm_struct *next) | 191 | void switch_mmu_context(struct mm_struct *prev, struct mm_struct *next) |
175 | { | 192 | { |
176 | unsigned int id, cpu = smp_processor_id(); | 193 | unsigned int i, id, cpu = smp_processor_id(); |
177 | unsigned long *map; | 194 | unsigned long *map; |
178 | 195 | ||
179 | /* No lockless fast path .. yet */ | 196 | /* No lockless fast path .. yet */ |
180 | spin_lock(&context_lock); | 197 | spin_lock(&context_lock); |
181 | 198 | ||
182 | #ifndef DEBUG_STEAL_ONLY | 199 | pr_hard("[%d] activating context for mm @%p, active=%d, id=%d", |
183 | pr_devel("[%d] activating context for mm @%p, active=%d, id=%d\n", | 200 | cpu, next, next->context.active, next->context.id); |
184 | cpu, next, next->context.active, next->context.id); | ||
185 | #endif | ||
186 | 201 | ||
187 | #ifdef CONFIG_SMP | 202 | #ifdef CONFIG_SMP |
188 | /* Mark us active and the previous one not anymore */ | 203 | /* Mark us active and the previous one not anymore */ |
189 | next->context.active++; | 204 | next->context.active++; |
190 | if (prev) { | 205 | if (prev) { |
191 | #ifndef DEBUG_STEAL_ONLY | 206 | pr_hardcont(" (old=0x%p a=%d)", prev, prev->context.active); |
192 | pr_devel(" old context %p active was: %d\n", | ||
193 | prev, prev->context.active); | ||
194 | #endif | ||
195 | WARN_ON(prev->context.active < 1); | 207 | WARN_ON(prev->context.active < 1); |
196 | prev->context.active--; | 208 | prev->context.active--; |
197 | } | 209 | } |
@@ -201,8 +213,14 @@ void switch_mmu_context(struct mm_struct *prev, struct mm_struct *next) | |||
201 | 213 | ||
202 | /* If we already have a valid assigned context, skip all that */ | 214 | /* If we already have a valid assigned context, skip all that */ |
203 | id = next->context.id; | 215 | id = next->context.id; |
204 | if (likely(id != MMU_NO_CONTEXT)) | 216 | if (likely(id != MMU_NO_CONTEXT)) { |
217 | #ifdef DEBUG_MAP_CONSISTENCY | ||
218 | if (context_mm[id] != next) | ||
219 | pr_err("MMU: mm 0x%p has id %d but context_mm[%d] says 0x%p\n", | ||
220 | next, id, id, context_mm[id]); | ||
221 | #endif | ||
205 | goto ctxt_ok; | 222 | goto ctxt_ok; |
223 | } | ||
206 | 224 | ||
207 | /* We really don't have a context, let's try to acquire one */ | 225 | /* We really don't have a context, let's try to acquire one */ |
208 | id = next_context; | 226 | id = next_context; |
@@ -235,11 +253,7 @@ void switch_mmu_context(struct mm_struct *prev, struct mm_struct *next) | |||
235 | next_context = id + 1; | 253 | next_context = id + 1; |
236 | context_mm[id] = next; | 254 | context_mm[id] = next; |
237 | next->context.id = id; | 255 | next->context.id = id; |
238 | 256 | pr_hardcont(" | new id=%d,nrf=%d", id, nr_free_contexts); | |
239 | #ifndef DEBUG_STEAL_ONLY | ||
240 | pr_devel("[%d] picked up new id %d, nrf is now %d\n", | ||
241 | cpu, id, nr_free_contexts); | ||
242 | #endif | ||
243 | 257 | ||
244 | context_check_map(); | 258 | context_check_map(); |
245 | ctxt_ok: | 259 | ctxt_ok: |
@@ -248,15 +262,21 @@ void switch_mmu_context(struct mm_struct *prev, struct mm_struct *next) | |||
248 | * local TLB for it and unmark it before we use it | 262 | * local TLB for it and unmark it before we use it |
249 | */ | 263 | */ |
250 | if (test_bit(id, stale_map[cpu])) { | 264 | if (test_bit(id, stale_map[cpu])) { |
251 | pr_devel("[%d] flushing stale context %d for mm @%p !\n", | 265 | pr_hardcont(" | stale flush %d [%d..%d]", |
252 | cpu, id, next); | 266 | id, cpu_first_thread_in_core(cpu), |
267 | cpu_last_thread_in_core(cpu)); | ||
268 | |||
253 | local_flush_tlb_mm(next); | 269 | local_flush_tlb_mm(next); |
254 | 270 | ||
255 | /* XXX This clear should ultimately be part of local_flush_tlb_mm */ | 271 | /* XXX This clear should ultimately be part of local_flush_tlb_mm */ |
256 | __clear_bit(id, stale_map[cpu]); | 272 | for (i = cpu_first_thread_in_core(cpu); |
273 | i <= cpu_last_thread_in_core(cpu); i++) { | ||
274 | __clear_bit(id, stale_map[i]); | ||
275 | } | ||
257 | } | 276 | } |
258 | 277 | ||
259 | /* Flick the MMU and release lock */ | 278 | /* Flick the MMU and release lock */ |
279 | pr_hardcont(" -> %d\n", id); | ||
260 | set_context(id, next->pgd); | 280 | set_context(id, next->pgd); |
261 | spin_unlock(&context_lock); | 281 | spin_unlock(&context_lock); |
262 | } | 282 | } |
@@ -266,6 +286,8 @@ void switch_mmu_context(struct mm_struct *prev, struct mm_struct *next) | |||
266 | */ | 286 | */ |
267 | int init_new_context(struct task_struct *t, struct mm_struct *mm) | 287 | int init_new_context(struct task_struct *t, struct mm_struct *mm) |
268 | { | 288 | { |
289 | pr_hard("initing context for mm @%p\n", mm); | ||
290 | |||
269 | mm->context.id = MMU_NO_CONTEXT; | 291 | mm->context.id = MMU_NO_CONTEXT; |
270 | mm->context.active = 0; | 292 | mm->context.active = 0; |
271 | 293 | ||
@@ -305,7 +327,9 @@ static int __cpuinit mmu_context_cpu_notify(struct notifier_block *self, | |||
305 | unsigned long action, void *hcpu) | 327 | unsigned long action, void *hcpu) |
306 | { | 328 | { |
307 | unsigned int cpu = (unsigned int)(long)hcpu; | 329 | unsigned int cpu = (unsigned int)(long)hcpu; |
308 | 330 | #ifdef CONFIG_HOTPLUG_CPU | |
331 | struct task_struct *p; | ||
332 | #endif | ||
309 | /* We don't touch CPU 0 map, it's allocated at aboot and kept | 333 | /* We don't touch CPU 0 map, it's allocated at aboot and kept |
310 | * around forever | 334 | * around forever |
311 | */ | 335 | */ |
@@ -324,8 +348,16 @@ static int __cpuinit mmu_context_cpu_notify(struct notifier_block *self, | |||
324 | pr_devel("MMU: Freeing stale context map for CPU %d\n", cpu); | 348 | pr_devel("MMU: Freeing stale context map for CPU %d\n", cpu); |
325 | kfree(stale_map[cpu]); | 349 | kfree(stale_map[cpu]); |
326 | stale_map[cpu] = NULL; | 350 | stale_map[cpu] = NULL; |
327 | break; | 351 | |
328 | #endif | 352 | /* We also clear the cpu_vm_mask bits of CPUs going away */ |
353 | read_lock(&tasklist_lock); | ||
354 | for_each_process(p) { | ||
355 | if (p->mm) | ||
356 | cpu_mask_clear_cpu(cpu, mm_cpumask(p->mm)); | ||
357 | } | ||
358 | read_unlock(&tasklist_lock); | ||
359 | break; | ||
360 | #endif /* CONFIG_HOTPLUG_CPU */ | ||
329 | } | 361 | } |
330 | return NOTIFY_OK; | 362 | return NOTIFY_OK; |
331 | } | 363 | } |
diff --git a/arch/powerpc/mm/mmu_decl.h b/arch/powerpc/mm/mmu_decl.h index d1f9c62dc177..d2e5321d5ea6 100644 --- a/arch/powerpc/mm/mmu_decl.h +++ b/arch/powerpc/mm/mmu_decl.h | |||
@@ -36,21 +36,37 @@ static inline void _tlbil_pid(unsigned int pid) | |||
36 | { | 36 | { |
37 | asm volatile ("sync; tlbia; isync" : : : "memory"); | 37 | asm volatile ("sync; tlbia; isync" : : : "memory"); |
38 | } | 38 | } |
39 | #define _tlbil_pid_noind(pid) _tlbil_pid(pid) | ||
40 | |||
39 | #else /* CONFIG_40x || CONFIG_8xx */ | 41 | #else /* CONFIG_40x || CONFIG_8xx */ |
40 | extern void _tlbil_all(void); | 42 | extern void _tlbil_all(void); |
41 | extern void _tlbil_pid(unsigned int pid); | 43 | extern void _tlbil_pid(unsigned int pid); |
44 | #ifdef CONFIG_PPC_BOOK3E | ||
45 | extern void _tlbil_pid_noind(unsigned int pid); | ||
46 | #else | ||
47 | #define _tlbil_pid_noind(pid) _tlbil_pid(pid) | ||
48 | #endif | ||
42 | #endif /* !(CONFIG_40x || CONFIG_8xx) */ | 49 | #endif /* !(CONFIG_40x || CONFIG_8xx) */ |
43 | 50 | ||
44 | /* | 51 | /* |
45 | * On 8xx, we directly inline tlbie, on others, it's extern | 52 | * On 8xx, we directly inline tlbie, on others, it's extern |
46 | */ | 53 | */ |
47 | #ifdef CONFIG_8xx | 54 | #ifdef CONFIG_8xx |
48 | static inline void _tlbil_va(unsigned long address, unsigned int pid) | 55 | static inline void _tlbil_va(unsigned long address, unsigned int pid, |
56 | unsigned int tsize, unsigned int ind) | ||
49 | { | 57 | { |
50 | asm volatile ("tlbie %0; sync" : : "r" (address) : "memory"); | 58 | asm volatile ("tlbie %0; sync" : : "r" (address) : "memory"); |
51 | } | 59 | } |
52 | #else /* CONFIG_8xx */ | 60 | #elif defined(CONFIG_PPC_BOOK3E) |
53 | extern void _tlbil_va(unsigned long address, unsigned int pid); | 61 | extern void _tlbil_va(unsigned long address, unsigned int pid, |
62 | unsigned int tsize, unsigned int ind); | ||
63 | #else | ||
64 | extern void __tlbil_va(unsigned long address, unsigned int pid); | ||
65 | static inline void _tlbil_va(unsigned long address, unsigned int pid, | ||
66 | unsigned int tsize, unsigned int ind) | ||
67 | { | ||
68 | __tlbil_va(address, pid); | ||
69 | } | ||
54 | #endif /* CONIFG_8xx */ | 70 | #endif /* CONIFG_8xx */ |
55 | 71 | ||
56 | /* | 72 | /* |
@@ -58,10 +74,16 @@ extern void _tlbil_va(unsigned long address, unsigned int pid); | |||
58 | * implementation. When that becomes the case, this will be | 74 | * implementation. When that becomes the case, this will be |
59 | * an extern. | 75 | * an extern. |
60 | */ | 76 | */ |
61 | static inline void _tlbivax_bcast(unsigned long address, unsigned int pid) | 77 | #ifdef CONFIG_PPC_BOOK3E |
78 | extern void _tlbivax_bcast(unsigned long address, unsigned int pid, | ||
79 | unsigned int tsize, unsigned int ind); | ||
80 | #else | ||
81 | static inline void _tlbivax_bcast(unsigned long address, unsigned int pid, | ||
82 | unsigned int tsize, unsigned int ind) | ||
62 | { | 83 | { |
63 | BUG(); | 84 | BUG(); |
64 | } | 85 | } |
86 | #endif | ||
65 | 87 | ||
66 | #else /* CONFIG_PPC_MMU_NOHASH */ | 88 | #else /* CONFIG_PPC_MMU_NOHASH */ |
67 | 89 | ||
@@ -99,7 +121,12 @@ extern unsigned int rtas_data, rtas_size; | |||
99 | struct hash_pte; | 121 | struct hash_pte; |
100 | extern struct hash_pte *Hash, *Hash_end; | 122 | extern struct hash_pte *Hash, *Hash_end; |
101 | extern unsigned long Hash_size, Hash_mask; | 123 | extern unsigned long Hash_size, Hash_mask; |
102 | #endif | 124 | |
125 | #endif /* CONFIG_PPC32 */ | ||
126 | |||
127 | #ifdef CONFIG_PPC64 | ||
128 | extern int map_kernel_page(unsigned long ea, unsigned long pa, int flags); | ||
129 | #endif /* CONFIG_PPC64 */ | ||
103 | 130 | ||
104 | extern unsigned long ioremap_bot; | 131 | extern unsigned long ioremap_bot; |
105 | extern unsigned long __max_low_memory; | 132 | extern unsigned long __max_low_memory; |
diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c index 627767d6169b..b6b32487e740 100644 --- a/arch/powerpc/mm/pgtable.c +++ b/arch/powerpc/mm/pgtable.c | |||
@@ -30,6 +30,16 @@ | |||
30 | #include <asm/tlbflush.h> | 30 | #include <asm/tlbflush.h> |
31 | #include <asm/tlb.h> | 31 | #include <asm/tlb.h> |
32 | 32 | ||
33 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | ||
34 | |||
35 | #ifdef CONFIG_SMP | ||
36 | |||
37 | /* | ||
38 | * Handle batching of page table freeing on SMP. Page tables are | ||
39 | * queued up and send to be freed later by RCU in order to avoid | ||
40 | * freeing a page table page that is being walked without locks | ||
41 | */ | ||
42 | |||
33 | static DEFINE_PER_CPU(struct pte_freelist_batch *, pte_freelist_cur); | 43 | static DEFINE_PER_CPU(struct pte_freelist_batch *, pte_freelist_cur); |
34 | static unsigned long pte_freelist_forced_free; | 44 | static unsigned long pte_freelist_forced_free; |
35 | 45 | ||
@@ -116,6 +126,8 @@ void pte_free_finish(void) | |||
116 | *batchp = NULL; | 126 | *batchp = NULL; |
117 | } | 127 | } |
118 | 128 | ||
129 | #endif /* CONFIG_SMP */ | ||
130 | |||
119 | /* | 131 | /* |
120 | * Handle i/d cache flushing, called from set_pte_at() or ptep_set_access_flags() | 132 | * Handle i/d cache flushing, called from set_pte_at() or ptep_set_access_flags() |
121 | */ | 133 | */ |
@@ -242,7 +254,7 @@ void assert_pte_locked(struct mm_struct *mm, unsigned long addr) | |||
242 | BUG_ON(pud_none(*pud)); | 254 | BUG_ON(pud_none(*pud)); |
243 | pmd = pmd_offset(pud, addr); | 255 | pmd = pmd_offset(pud, addr); |
244 | BUG_ON(!pmd_present(*pmd)); | 256 | BUG_ON(!pmd_present(*pmd)); |
245 | BUG_ON(!spin_is_locked(pte_lockptr(mm, pmd))); | 257 | assert_spin_locked(pte_lockptr(mm, pmd)); |
246 | } | 258 | } |
247 | #endif /* CONFIG_DEBUG_VM */ | 259 | #endif /* CONFIG_DEBUG_VM */ |
248 | 260 | ||
diff --git a/arch/powerpc/mm/pgtable_64.c b/arch/powerpc/mm/pgtable_64.c index bfa7db6b2fd5..853d5565eed5 100644 --- a/arch/powerpc/mm/pgtable_64.c +++ b/arch/powerpc/mm/pgtable_64.c | |||
@@ -33,6 +33,8 @@ | |||
33 | #include <linux/stddef.h> | 33 | #include <linux/stddef.h> |
34 | #include <linux/vmalloc.h> | 34 | #include <linux/vmalloc.h> |
35 | #include <linux/init.h> | 35 | #include <linux/init.h> |
36 | #include <linux/bootmem.h> | ||
37 | #include <linux/lmb.h> | ||
36 | 38 | ||
37 | #include <asm/pgalloc.h> | 39 | #include <asm/pgalloc.h> |
38 | #include <asm/page.h> | 40 | #include <asm/page.h> |
@@ -55,19 +57,36 @@ | |||
55 | 57 | ||
56 | unsigned long ioremap_bot = IOREMAP_BASE; | 58 | unsigned long ioremap_bot = IOREMAP_BASE; |
57 | 59 | ||
60 | |||
61 | #ifdef CONFIG_PPC_MMU_NOHASH | ||
62 | static void *early_alloc_pgtable(unsigned long size) | ||
63 | { | ||
64 | void *pt; | ||
65 | |||
66 | if (init_bootmem_done) | ||
67 | pt = __alloc_bootmem(size, size, __pa(MAX_DMA_ADDRESS)); | ||
68 | else | ||
69 | pt = __va(lmb_alloc_base(size, size, | ||
70 | __pa(MAX_DMA_ADDRESS))); | ||
71 | memset(pt, 0, size); | ||
72 | |||
73 | return pt; | ||
74 | } | ||
75 | #endif /* CONFIG_PPC_MMU_NOHASH */ | ||
76 | |||
58 | /* | 77 | /* |
59 | * map_io_page currently only called by __ioremap | 78 | * map_kernel_page currently only called by __ioremap |
60 | * map_io_page adds an entry to the ioremap page table | 79 | * map_kernel_page adds an entry to the ioremap page table |
61 | * and adds an entry to the HPT, possibly bolting it | 80 | * and adds an entry to the HPT, possibly bolting it |
62 | */ | 81 | */ |
63 | static int map_io_page(unsigned long ea, unsigned long pa, int flags) | 82 | int map_kernel_page(unsigned long ea, unsigned long pa, int flags) |
64 | { | 83 | { |
65 | pgd_t *pgdp; | 84 | pgd_t *pgdp; |
66 | pud_t *pudp; | 85 | pud_t *pudp; |
67 | pmd_t *pmdp; | 86 | pmd_t *pmdp; |
68 | pte_t *ptep; | 87 | pte_t *ptep; |
69 | 88 | ||
70 | if (mem_init_done) { | 89 | if (slab_is_available()) { |
71 | pgdp = pgd_offset_k(ea); | 90 | pgdp = pgd_offset_k(ea); |
72 | pudp = pud_alloc(&init_mm, pgdp, ea); | 91 | pudp = pud_alloc(&init_mm, pgdp, ea); |
73 | if (!pudp) | 92 | if (!pudp) |
@@ -81,6 +100,35 @@ static int map_io_page(unsigned long ea, unsigned long pa, int flags) | |||
81 | set_pte_at(&init_mm, ea, ptep, pfn_pte(pa >> PAGE_SHIFT, | 100 | set_pte_at(&init_mm, ea, ptep, pfn_pte(pa >> PAGE_SHIFT, |
82 | __pgprot(flags))); | 101 | __pgprot(flags))); |
83 | } else { | 102 | } else { |
103 | #ifdef CONFIG_PPC_MMU_NOHASH | ||
104 | /* Warning ! This will blow up if bootmem is not initialized | ||
105 | * which our ppc64 code is keen to do that, we'll need to | ||
106 | * fix it and/or be more careful | ||
107 | */ | ||
108 | pgdp = pgd_offset_k(ea); | ||
109 | #ifdef PUD_TABLE_SIZE | ||
110 | if (pgd_none(*pgdp)) { | ||
111 | pudp = early_alloc_pgtable(PUD_TABLE_SIZE); | ||
112 | BUG_ON(pudp == NULL); | ||
113 | pgd_populate(&init_mm, pgdp, pudp); | ||
114 | } | ||
115 | #endif /* PUD_TABLE_SIZE */ | ||
116 | pudp = pud_offset(pgdp, ea); | ||
117 | if (pud_none(*pudp)) { | ||
118 | pmdp = early_alloc_pgtable(PMD_TABLE_SIZE); | ||
119 | BUG_ON(pmdp == NULL); | ||
120 | pud_populate(&init_mm, pudp, pmdp); | ||
121 | } | ||
122 | pmdp = pmd_offset(pudp, ea); | ||
123 | if (!pmd_present(*pmdp)) { | ||
124 | ptep = early_alloc_pgtable(PAGE_SIZE); | ||
125 | BUG_ON(ptep == NULL); | ||
126 | pmd_populate_kernel(&init_mm, pmdp, ptep); | ||
127 | } | ||
128 | ptep = pte_offset_kernel(pmdp, ea); | ||
129 | set_pte_at(&init_mm, ea, ptep, pfn_pte(pa >> PAGE_SHIFT, | ||
130 | __pgprot(flags))); | ||
131 | #else /* CONFIG_PPC_MMU_NOHASH */ | ||
84 | /* | 132 | /* |
85 | * If the mm subsystem is not fully up, we cannot create a | 133 | * If the mm subsystem is not fully up, we cannot create a |
86 | * linux page table entry for this mapping. Simply bolt an | 134 | * linux page table entry for this mapping. Simply bolt an |
@@ -93,6 +141,7 @@ static int map_io_page(unsigned long ea, unsigned long pa, int flags) | |||
93 | "memory at %016lx !\n", pa); | 141 | "memory at %016lx !\n", pa); |
94 | return -ENOMEM; | 142 | return -ENOMEM; |
95 | } | 143 | } |
144 | #endif /* !CONFIG_PPC_MMU_NOHASH */ | ||
96 | } | 145 | } |
97 | return 0; | 146 | return 0; |
98 | } | 147 | } |
@@ -124,7 +173,7 @@ void __iomem * __ioremap_at(phys_addr_t pa, void *ea, unsigned long size, | |||
124 | WARN_ON(size & ~PAGE_MASK); | 173 | WARN_ON(size & ~PAGE_MASK); |
125 | 174 | ||
126 | for (i = 0; i < size; i += PAGE_SIZE) | 175 | for (i = 0; i < size; i += PAGE_SIZE) |
127 | if (map_io_page((unsigned long)ea+i, pa+i, flags)) | 176 | if (map_kernel_page((unsigned long)ea+i, pa+i, flags)) |
128 | return NULL; | 177 | return NULL; |
129 | 178 | ||
130 | return (void __iomem *)ea; | 179 | return (void __iomem *)ea; |
diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c index a685652effeb..07961c5c169e 100644 --- a/arch/powerpc/mm/slb.c +++ b/arch/powerpc/mm/slb.c | |||
@@ -191,7 +191,7 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm) | |||
191 | unsigned long slbie_data = 0; | 191 | unsigned long slbie_data = 0; |
192 | unsigned long pc = KSTK_EIP(tsk); | 192 | unsigned long pc = KSTK_EIP(tsk); |
193 | unsigned long stack = KSTK_ESP(tsk); | 193 | unsigned long stack = KSTK_ESP(tsk); |
194 | unsigned long unmapped_base; | 194 | unsigned long exec_base; |
195 | 195 | ||
196 | /* | 196 | /* |
197 | * We need interrupts hard-disabled here, not just soft-disabled, | 197 | * We need interrupts hard-disabled here, not just soft-disabled, |
@@ -227,29 +227,23 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm) | |||
227 | 227 | ||
228 | /* | 228 | /* |
229 | * preload some userspace segments into the SLB. | 229 | * preload some userspace segments into the SLB. |
230 | * Almost all 32 and 64bit PowerPC executables are linked at | ||
231 | * 0x10000000 so it makes sense to preload this segment. | ||
230 | */ | 232 | */ |
231 | if (test_tsk_thread_flag(tsk, TIF_32BIT)) | 233 | exec_base = 0x10000000; |
232 | unmapped_base = TASK_UNMAPPED_BASE_USER32; | ||
233 | else | ||
234 | unmapped_base = TASK_UNMAPPED_BASE_USER64; | ||
235 | 234 | ||
236 | if (is_kernel_addr(pc)) | 235 | if (is_kernel_addr(pc) || is_kernel_addr(stack) || |
237 | return; | 236 | is_kernel_addr(exec_base)) |
238 | slb_allocate(pc); | ||
239 | |||
240 | if (esids_match(pc,stack)) | ||
241 | return; | 237 | return; |
242 | 238 | ||
243 | if (is_kernel_addr(stack)) | 239 | slb_allocate(pc); |
244 | return; | ||
245 | slb_allocate(stack); | ||
246 | 240 | ||
247 | if (esids_match(pc,unmapped_base) || esids_match(stack,unmapped_base)) | 241 | if (!esids_match(pc, stack)) |
248 | return; | 242 | slb_allocate(stack); |
249 | 243 | ||
250 | if (is_kernel_addr(unmapped_base)) | 244 | if (!esids_match(pc, exec_base) && |
251 | return; | 245 | !esids_match(stack, exec_base)) |
252 | slb_allocate(unmapped_base); | 246 | slb_allocate(exec_base); |
253 | } | 247 | } |
254 | 248 | ||
255 | static inline void patch_slb_encoding(unsigned int *insn_addr, | 249 | static inline void patch_slb_encoding(unsigned int *insn_addr, |
diff --git a/arch/powerpc/mm/tlb_hash32.c b/arch/powerpc/mm/tlb_hash32.c index 65190587a365..8aaa8b7eb324 100644 --- a/arch/powerpc/mm/tlb_hash32.c +++ b/arch/powerpc/mm/tlb_hash32.c | |||
@@ -71,6 +71,9 @@ void tlb_flush(struct mmu_gather *tlb) | |||
71 | */ | 71 | */ |
72 | _tlbia(); | 72 | _tlbia(); |
73 | } | 73 | } |
74 | |||
75 | /* Push out batch of freed page tables */ | ||
76 | pte_free_finish(); | ||
74 | } | 77 | } |
75 | 78 | ||
76 | /* | 79 | /* |
diff --git a/arch/powerpc/mm/tlb_hash64.c b/arch/powerpc/mm/tlb_hash64.c index 937eb90677d9..2b2f35f6985e 100644 --- a/arch/powerpc/mm/tlb_hash64.c +++ b/arch/powerpc/mm/tlb_hash64.c | |||
@@ -33,11 +33,6 @@ | |||
33 | 33 | ||
34 | DEFINE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch); | 34 | DEFINE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch); |
35 | 35 | ||
36 | /* This is declared as we are using the more or less generic | ||
37 | * arch/powerpc/include/asm/tlb.h file -- tgall | ||
38 | */ | ||
39 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | ||
40 | |||
41 | /* | 36 | /* |
42 | * A linux PTE was changed and the corresponding hash table entry | 37 | * A linux PTE was changed and the corresponding hash table entry |
43 | * neesd to be flushed. This function will either perform the flush | 38 | * neesd to be flushed. This function will either perform the flush |
@@ -154,6 +149,21 @@ void __flush_tlb_pending(struct ppc64_tlb_batch *batch) | |||
154 | batch->index = 0; | 149 | batch->index = 0; |
155 | } | 150 | } |
156 | 151 | ||
152 | void tlb_flush(struct mmu_gather *tlb) | ||
153 | { | ||
154 | struct ppc64_tlb_batch *tlbbatch = &__get_cpu_var(ppc64_tlb_batch); | ||
155 | |||
156 | /* If there's a TLB batch pending, then we must flush it because the | ||
157 | * pages are going to be freed and we really don't want to have a CPU | ||
158 | * access a freed page because it has a stale TLB | ||
159 | */ | ||
160 | if (tlbbatch->index) | ||
161 | __flush_tlb_pending(tlbbatch); | ||
162 | |||
163 | /* Push out batch of freed page tables */ | ||
164 | pte_free_finish(); | ||
165 | } | ||
166 | |||
157 | /** | 167 | /** |
158 | * __flush_hash_table_range - Flush all HPTEs for a given address range | 168 | * __flush_hash_table_range - Flush all HPTEs for a given address range |
159 | * from the hash table (and the TLB). But keeps | 169 | * from the hash table (and the TLB). But keeps |
diff --git a/arch/powerpc/mm/tlb_low_64e.S b/arch/powerpc/mm/tlb_low_64e.S new file mode 100644 index 000000000000..10d524ded7b2 --- /dev/null +++ b/arch/powerpc/mm/tlb_low_64e.S | |||
@@ -0,0 +1,734 @@ | |||
1 | /* | ||
2 | * Low leve TLB miss handlers for Book3E | ||
3 | * | ||
4 | * Copyright (C) 2008-2009 | ||
5 | * Ben. Herrenschmidt (benh@kernel.crashing.org), IBM Corp. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License | ||
9 | * as published by the Free Software Foundation; either version | ||
10 | * 2 of the License, or (at your option) any later version. | ||
11 | */ | ||
12 | |||
13 | #include <asm/processor.h> | ||
14 | #include <asm/reg.h> | ||
15 | #include <asm/page.h> | ||
16 | #include <asm/mmu.h> | ||
17 | #include <asm/ppc_asm.h> | ||
18 | #include <asm/asm-offsets.h> | ||
19 | #include <asm/cputable.h> | ||
20 | #include <asm/pgtable.h> | ||
21 | #include <asm/reg.h> | ||
22 | #include <asm/exception-64e.h> | ||
23 | #include <asm/ppc-opcode.h> | ||
24 | |||
25 | #ifdef CONFIG_PPC_64K_PAGES | ||
26 | #define VPTE_PMD_SHIFT (PTE_INDEX_SIZE+1) | ||
27 | #else | ||
28 | #define VPTE_PMD_SHIFT (PTE_INDEX_SIZE) | ||
29 | #endif | ||
30 | #define VPTE_PUD_SHIFT (VPTE_PMD_SHIFT + PMD_INDEX_SIZE) | ||
31 | #define VPTE_PGD_SHIFT (VPTE_PUD_SHIFT + PUD_INDEX_SIZE) | ||
32 | #define VPTE_INDEX_SIZE (VPTE_PGD_SHIFT + PGD_INDEX_SIZE) | ||
33 | |||
34 | |||
35 | /********************************************************************** | ||
36 | * * | ||
37 | * TLB miss handling for Book3E with TLB reservation and HES support * | ||
38 | * * | ||
39 | **********************************************************************/ | ||
40 | |||
41 | |||
42 | /* Data TLB miss */ | ||
43 | START_EXCEPTION(data_tlb_miss) | ||
44 | TLB_MISS_PROLOG | ||
45 | |||
46 | /* Now we handle the fault proper. We only save DEAR in normal | ||
47 | * fault case since that's the only interesting values here. | ||
48 | * We could probably also optimize by not saving SRR0/1 in the | ||
49 | * linear mapping case but I'll leave that for later | ||
50 | */ | ||
51 | mfspr r14,SPRN_ESR | ||
52 | mfspr r16,SPRN_DEAR /* get faulting address */ | ||
53 | srdi r15,r16,60 /* get region */ | ||
54 | cmpldi cr0,r15,0xc /* linear mapping ? */ | ||
55 | TLB_MISS_STATS_SAVE_INFO | ||
56 | beq tlb_load_linear /* yes -> go to linear map load */ | ||
57 | |||
58 | /* The page tables are mapped virtually linear. At this point, though, | ||
59 | * we don't know whether we are trying to fault in a first level | ||
60 | * virtual address or a virtual page table address. We can get that | ||
61 | * from bit 0x1 of the region ID which we have set for a page table | ||
62 | */ | ||
63 | andi. r10,r15,0x1 | ||
64 | bne- virt_page_table_tlb_miss | ||
65 | |||
66 | std r14,EX_TLB_ESR(r12); /* save ESR */ | ||
67 | std r16,EX_TLB_DEAR(r12); /* save DEAR */ | ||
68 | |||
69 | /* We need _PAGE_PRESENT and _PAGE_ACCESSED set */ | ||
70 | li r11,_PAGE_PRESENT | ||
71 | oris r11,r11,_PAGE_ACCESSED@h | ||
72 | |||
73 | /* We do the user/kernel test for the PID here along with the RW test | ||
74 | */ | ||
75 | cmpldi cr0,r15,0 /* Check for user region */ | ||
76 | |||
77 | /* We pre-test some combination of permissions to avoid double | ||
78 | * faults: | ||
79 | * | ||
80 | * We move the ESR:ST bit into the position of _PAGE_BAP_SW in the PTE | ||
81 | * ESR_ST is 0x00800000 | ||
82 | * _PAGE_BAP_SW is 0x00000010 | ||
83 | * So the shift is >> 19. This tests for supervisor writeability. | ||
84 | * If the page happens to be supervisor writeable and not user | ||
85 | * writeable, we will take a new fault later, but that should be | ||
86 | * a rare enough case. | ||
87 | * | ||
88 | * We also move ESR_ST in _PAGE_DIRTY position | ||
89 | * _PAGE_DIRTY is 0x00001000 so the shift is >> 11 | ||
90 | * | ||
91 | * MAS1 is preset for all we need except for TID that needs to | ||
92 | * be cleared for kernel translations | ||
93 | */ | ||
94 | rlwimi r11,r14,32-19,27,27 | ||
95 | rlwimi r11,r14,32-16,19,19 | ||
96 | beq normal_tlb_miss | ||
97 | /* XXX replace the RMW cycles with immediate loads + writes */ | ||
98 | 1: mfspr r10,SPRN_MAS1 | ||
99 | cmpldi cr0,r15,8 /* Check for vmalloc region */ | ||
100 | rlwinm r10,r10,0,16,1 /* Clear TID */ | ||
101 | mtspr SPRN_MAS1,r10 | ||
102 | beq+ normal_tlb_miss | ||
103 | |||
104 | /* We got a crappy address, just fault with whatever DEAR and ESR | ||
105 | * are here | ||
106 | */ | ||
107 | TLB_MISS_STATS_D(MMSTAT_TLB_MISS_NORM_FAULT) | ||
108 | TLB_MISS_EPILOG_ERROR | ||
109 | b exc_data_storage_book3e | ||
110 | |||
111 | /* Instruction TLB miss */ | ||
112 | START_EXCEPTION(instruction_tlb_miss) | ||
113 | TLB_MISS_PROLOG | ||
114 | |||
115 | /* If we take a recursive fault, the second level handler may need | ||
116 | * to know whether we are handling a data or instruction fault in | ||
117 | * order to get to the right store fault handler. We provide that | ||
118 | * info by writing a crazy value in ESR in our exception frame | ||
119 | */ | ||
120 | li r14,-1 /* store to exception frame is done later */ | ||
121 | |||
122 | /* Now we handle the fault proper. We only save DEAR in the non | ||
123 | * linear mapping case since we know the linear mapping case will | ||
124 | * not re-enter. We could indeed optimize and also not save SRR0/1 | ||
125 | * in the linear mapping case but I'll leave that for later | ||
126 | * | ||
127 | * Faulting address is SRR0 which is already in r16 | ||
128 | */ | ||
129 | srdi r15,r16,60 /* get region */ | ||
130 | cmpldi cr0,r15,0xc /* linear mapping ? */ | ||
131 | TLB_MISS_STATS_SAVE_INFO | ||
132 | beq tlb_load_linear /* yes -> go to linear map load */ | ||
133 | |||
134 | /* We do the user/kernel test for the PID here along with the RW test | ||
135 | */ | ||
136 | li r11,_PAGE_PRESENT|_PAGE_HWEXEC /* Base perm */ | ||
137 | oris r11,r11,_PAGE_ACCESSED@h | ||
138 | |||
139 | cmpldi cr0,r15,0 /* Check for user region */ | ||
140 | std r14,EX_TLB_ESR(r12) /* write crazy -1 to frame */ | ||
141 | beq normal_tlb_miss | ||
142 | /* XXX replace the RMW cycles with immediate loads + writes */ | ||
143 | 1: mfspr r10,SPRN_MAS1 | ||
144 | cmpldi cr0,r15,8 /* Check for vmalloc region */ | ||
145 | rlwinm r10,r10,0,16,1 /* Clear TID */ | ||
146 | mtspr SPRN_MAS1,r10 | ||
147 | beq+ normal_tlb_miss | ||
148 | |||
149 | /* We got a crappy address, just fault */ | ||
150 | TLB_MISS_STATS_I(MMSTAT_TLB_MISS_NORM_FAULT) | ||
151 | TLB_MISS_EPILOG_ERROR | ||
152 | b exc_instruction_storage_book3e | ||
153 | |||
154 | /* | ||
155 | * This is the guts of the first-level TLB miss handler for direct | ||
156 | * misses. We are entered with: | ||
157 | * | ||
158 | * r16 = faulting address | ||
159 | * r15 = region ID | ||
160 | * r14 = crap (free to use) | ||
161 | * r13 = PACA | ||
162 | * r12 = TLB exception frame in PACA | ||
163 | * r11 = PTE permission mask | ||
164 | * r10 = crap (free to use) | ||
165 | */ | ||
166 | normal_tlb_miss: | ||
167 | /* So we first construct the page table address. We do that by | ||
168 | * shifting the bottom of the address (not the region ID) by | ||
169 | * PAGE_SHIFT-3, clearing the bottom 3 bits (get a PTE ptr) and | ||
170 | * or'ing the fourth high bit. | ||
171 | * | ||
172 | * NOTE: For 64K pages, we do things slightly differently in | ||
173 | * order to handle the weird page table format used by linux | ||
174 | */ | ||
175 | ori r10,r15,0x1 | ||
176 | #ifdef CONFIG_PPC_64K_PAGES | ||
177 | /* For the top bits, 16 bytes per PTE */ | ||
178 | rldicl r14,r16,64-(PAGE_SHIFT-4),PAGE_SHIFT-4+4 | ||
179 | /* Now create the bottom bits as 0 in position 0x8000 and | ||
180 | * the rest calculated for 8 bytes per PTE | ||
181 | */ | ||
182 | rldicl r15,r16,64-(PAGE_SHIFT-3),64-15 | ||
183 | /* Insert the bottom bits in */ | ||
184 | rlwimi r14,r15,0,16,31 | ||
185 | #else | ||
186 | rldicl r14,r16,64-(PAGE_SHIFT-3),PAGE_SHIFT-3+4 | ||
187 | #endif | ||
188 | sldi r15,r10,60 | ||
189 | clrrdi r14,r14,3 | ||
190 | or r10,r15,r14 | ||
191 | |||
192 | /* Set the TLB reservation and seach for existing entry. Then load | ||
193 | * the entry. | ||
194 | */ | ||
195 | PPC_TLBSRX_DOT(0,r16) | ||
196 | ld r14,0(r10) | ||
197 | beq normal_tlb_miss_done | ||
198 | |||
199 | finish_normal_tlb_miss: | ||
200 | /* Check if required permissions are met */ | ||
201 | andc. r15,r11,r14 | ||
202 | bne- normal_tlb_miss_access_fault | ||
203 | |||
204 | /* Now we build the MAS: | ||
205 | * | ||
206 | * MAS 0 : Fully setup with defaults in MAS4 and TLBnCFG | ||
207 | * MAS 1 : Almost fully setup | ||
208 | * - PID already updated by caller if necessary | ||
209 | * - TSIZE need change if !base page size, not | ||
210 | * yet implemented for now | ||
211 | * MAS 2 : Defaults not useful, need to be redone | ||
212 | * MAS 3+7 : Needs to be done | ||
213 | * | ||
214 | * TODO: mix up code below for better scheduling | ||
215 | */ | ||
216 | clrrdi r11,r16,12 /* Clear low crap in EA */ | ||
217 | rlwimi r11,r14,32-19,27,31 /* Insert WIMGE */ | ||
218 | mtspr SPRN_MAS2,r11 | ||
219 | |||
220 | /* Check page size, if not standard, update MAS1 */ | ||
221 | rldicl r11,r14,64-8,64-8 | ||
222 | #ifdef CONFIG_PPC_64K_PAGES | ||
223 | cmpldi cr0,r11,BOOK3E_PAGESZ_64K | ||
224 | #else | ||
225 | cmpldi cr0,r11,BOOK3E_PAGESZ_4K | ||
226 | #endif | ||
227 | beq- 1f | ||
228 | mfspr r11,SPRN_MAS1 | ||
229 | rlwimi r11,r14,31,21,24 | ||
230 | rlwinm r11,r11,0,21,19 | ||
231 | mtspr SPRN_MAS1,r11 | ||
232 | 1: | ||
233 | /* Move RPN in position */ | ||
234 | rldicr r11,r14,64-(PTE_RPN_SHIFT-PAGE_SHIFT),63-PAGE_SHIFT | ||
235 | clrldi r15,r11,12 /* Clear crap at the top */ | ||
236 | rlwimi r15,r14,32-8,22,25 /* Move in U bits */ | ||
237 | rlwimi r15,r14,32-2,26,31 /* Move in BAP bits */ | ||
238 | |||
239 | /* Mask out SW and UW if !DIRTY (XXX optimize this !) */ | ||
240 | andi. r11,r14,_PAGE_DIRTY | ||
241 | bne 1f | ||
242 | li r11,MAS3_SW|MAS3_UW | ||
243 | andc r15,r15,r11 | ||
244 | 1: mtspr SPRN_MAS7_MAS3,r15 | ||
245 | |||
246 | tlbwe | ||
247 | |||
248 | normal_tlb_miss_done: | ||
249 | /* We don't bother with restoring DEAR or ESR since we know we are | ||
250 | * level 0 and just going back to userland. They are only needed | ||
251 | * if you are going to take an access fault | ||
252 | */ | ||
253 | TLB_MISS_STATS_X(MMSTAT_TLB_MISS_NORM_OK) | ||
254 | TLB_MISS_EPILOG_SUCCESS | ||
255 | rfi | ||
256 | |||
257 | normal_tlb_miss_access_fault: | ||
258 | /* We need to check if it was an instruction miss */ | ||
259 | andi. r10,r11,_PAGE_HWEXEC | ||
260 | bne 1f | ||
261 | ld r14,EX_TLB_DEAR(r12) | ||
262 | ld r15,EX_TLB_ESR(r12) | ||
263 | mtspr SPRN_DEAR,r14 | ||
264 | mtspr SPRN_ESR,r15 | ||
265 | TLB_MISS_STATS_D(MMSTAT_TLB_MISS_NORM_FAULT) | ||
266 | TLB_MISS_EPILOG_ERROR | ||
267 | b exc_data_storage_book3e | ||
268 | 1: TLB_MISS_STATS_I(MMSTAT_TLB_MISS_NORM_FAULT) | ||
269 | TLB_MISS_EPILOG_ERROR | ||
270 | b exc_instruction_storage_book3e | ||
271 | |||
272 | |||
273 | /* | ||
274 | * This is the guts of the second-level TLB miss handler for direct | ||
275 | * misses. We are entered with: | ||
276 | * | ||
277 | * r16 = virtual page table faulting address | ||
278 | * r15 = region (top 4 bits of address) | ||
279 | * r14 = crap (free to use) | ||
280 | * r13 = PACA | ||
281 | * r12 = TLB exception frame in PACA | ||
282 | * r11 = crap (free to use) | ||
283 | * r10 = crap (free to use) | ||
284 | * | ||
285 | * Note that this should only ever be called as a second level handler | ||
286 | * with the current scheme when using SW load. | ||
287 | * That means we can always get the original fault DEAR at | ||
288 | * EX_TLB_DEAR-EX_TLB_SIZE(r12) | ||
289 | * | ||
290 | * It can be re-entered by the linear mapping miss handler. However, to | ||
291 | * avoid too much complication, it will restart the whole fault at level | ||
292 | * 0 so we don't care too much about clobbers | ||
293 | * | ||
294 | * XXX That code was written back when we couldn't clobber r14. We can now, | ||
295 | * so we could probably optimize things a bit | ||
296 | */ | ||
297 | virt_page_table_tlb_miss: | ||
298 | /* Are we hitting a kernel page table ? */ | ||
299 | andi. r10,r15,0x8 | ||
300 | |||
301 | /* The cool thing now is that r10 contains 0 for user and 8 for kernel, | ||
302 | * and we happen to have the swapper_pg_dir at offset 8 from the user | ||
303 | * pgdir in the PACA :-). | ||
304 | */ | ||
305 | add r11,r10,r13 | ||
306 | |||
307 | /* If kernel, we need to clear MAS1 TID */ | ||
308 | beq 1f | ||
309 | /* XXX replace the RMW cycles with immediate loads + writes */ | ||
310 | mfspr r10,SPRN_MAS1 | ||
311 | rlwinm r10,r10,0,16,1 /* Clear TID */ | ||
312 | mtspr SPRN_MAS1,r10 | ||
313 | 1: | ||
314 | /* Search if we already have a TLB entry for that virtual address, and | ||
315 | * if we do, bail out. | ||
316 | */ | ||
317 | PPC_TLBSRX_DOT(0,r16) | ||
318 | beq virt_page_table_tlb_miss_done | ||
319 | |||
320 | /* Now, we need to walk the page tables. First check if we are in | ||
321 | * range. | ||
322 | */ | ||
323 | rldicl. r10,r16,64-(VPTE_INDEX_SIZE+3),VPTE_INDEX_SIZE+3+4 | ||
324 | bne- virt_page_table_tlb_miss_fault | ||
325 | |||
326 | /* Get the PGD pointer */ | ||
327 | ld r15,PACAPGD(r11) | ||
328 | cmpldi cr0,r15,0 | ||
329 | beq- virt_page_table_tlb_miss_fault | ||
330 | |||
331 | /* Get to PGD entry */ | ||
332 | rldicl r11,r16,64-VPTE_PGD_SHIFT,64-PGD_INDEX_SIZE-3 | ||
333 | clrrdi r10,r11,3 | ||
334 | ldx r15,r10,r15 | ||
335 | cmpldi cr0,r15,0 | ||
336 | beq virt_page_table_tlb_miss_fault | ||
337 | |||
338 | #ifndef CONFIG_PPC_64K_PAGES | ||
339 | /* Get to PUD entry */ | ||
340 | rldicl r11,r16,64-VPTE_PUD_SHIFT,64-PUD_INDEX_SIZE-3 | ||
341 | clrrdi r10,r11,3 | ||
342 | ldx r15,r10,r15 | ||
343 | cmpldi cr0,r15,0 | ||
344 | beq virt_page_table_tlb_miss_fault | ||
345 | #endif /* CONFIG_PPC_64K_PAGES */ | ||
346 | |||
347 | /* Get to PMD entry */ | ||
348 | rldicl r11,r16,64-VPTE_PMD_SHIFT,64-PMD_INDEX_SIZE-3 | ||
349 | clrrdi r10,r11,3 | ||
350 | ldx r15,r10,r15 | ||
351 | cmpldi cr0,r15,0 | ||
352 | beq virt_page_table_tlb_miss_fault | ||
353 | |||
354 | /* Ok, we're all right, we can now create a kernel translation for | ||
355 | * a 4K or 64K page from r16 -> r15. | ||
356 | */ | ||
357 | /* Now we build the MAS: | ||
358 | * | ||
359 | * MAS 0 : Fully setup with defaults in MAS4 and TLBnCFG | ||
360 | * MAS 1 : Almost fully setup | ||
361 | * - PID already updated by caller if necessary | ||
362 | * - TSIZE for now is base page size always | ||
363 | * MAS 2 : Use defaults | ||
364 | * MAS 3+7 : Needs to be done | ||
365 | * | ||
366 | * So we only do MAS 2 and 3 for now... | ||
367 | */ | ||
368 | clrldi r11,r15,4 /* remove region ID from RPN */ | ||
369 | ori r10,r11,1 /* Or-in SR */ | ||
370 | mtspr SPRN_MAS7_MAS3,r10 | ||
371 | |||
372 | tlbwe | ||
373 | |||
374 | virt_page_table_tlb_miss_done: | ||
375 | |||
376 | /* We have overriden MAS2:EPN but currently our primary TLB miss | ||
377 | * handler will always restore it so that should not be an issue, | ||
378 | * if we ever optimize the primary handler to not write MAS2 on | ||
379 | * some cases, we'll have to restore MAS2:EPN here based on the | ||
380 | * original fault's DEAR. If we do that we have to modify the | ||
381 | * ITLB miss handler to also store SRR0 in the exception frame | ||
382 | * as DEAR. | ||
383 | * | ||
384 | * However, one nasty thing we did is we cleared the reservation | ||
385 | * (well, potentially we did). We do a trick here thus if we | ||
386 | * are not a level 0 exception (we interrupted the TLB miss) we | ||
387 | * offset the return address by -4 in order to replay the tlbsrx | ||
388 | * instruction there | ||
389 | */ | ||
390 | subf r10,r13,r12 | ||
391 | cmpldi cr0,r10,PACA_EXTLB+EX_TLB_SIZE | ||
392 | bne- 1f | ||
393 | ld r11,PACA_EXTLB+EX_TLB_SIZE+EX_TLB_SRR0(r13) | ||
394 | addi r10,r11,-4 | ||
395 | std r10,PACA_EXTLB+EX_TLB_SIZE+EX_TLB_SRR0(r13) | ||
396 | 1: | ||
397 | /* Return to caller, normal case */ | ||
398 | TLB_MISS_STATS_X(MMSTAT_TLB_MISS_PT_OK); | ||
399 | TLB_MISS_EPILOG_SUCCESS | ||
400 | rfi | ||
401 | |||
402 | virt_page_table_tlb_miss_fault: | ||
403 | /* If we fault here, things are a little bit tricky. We need to call | ||
404 | * either data or instruction store fault, and we need to retreive | ||
405 | * the original fault address and ESR (for data). | ||
406 | * | ||
407 | * The thing is, we know that in normal circumstances, this is | ||
408 | * always called as a second level tlb miss for SW load or as a first | ||
409 | * level TLB miss for HW load, so we should be able to peek at the | ||
410 | * relevant informations in the first exception frame in the PACA. | ||
411 | * | ||
412 | * However, we do need to double check that, because we may just hit | ||
413 | * a stray kernel pointer or a userland attack trying to hit those | ||
414 | * areas. If that is the case, we do a data fault. (We can't get here | ||
415 | * from an instruction tlb miss anyway). | ||
416 | * | ||
417 | * Note also that when going to a fault, we must unwind the previous | ||
418 | * level as well. Since we are doing that, we don't need to clear or | ||
419 | * restore the TLB reservation neither. | ||
420 | */ | ||
421 | subf r10,r13,r12 | ||
422 | cmpldi cr0,r10,PACA_EXTLB+EX_TLB_SIZE | ||
423 | bne- virt_page_table_tlb_miss_whacko_fault | ||
424 | |||
425 | /* We dig the original DEAR and ESR from slot 0 */ | ||
426 | ld r15,EX_TLB_DEAR+PACA_EXTLB(r13) | ||
427 | ld r16,EX_TLB_ESR+PACA_EXTLB(r13) | ||
428 | |||
429 | /* We check for the "special" ESR value for instruction faults */ | ||
430 | cmpdi cr0,r16,-1 | ||
431 | beq 1f | ||
432 | mtspr SPRN_DEAR,r15 | ||
433 | mtspr SPRN_ESR,r16 | ||
434 | TLB_MISS_STATS_D(MMSTAT_TLB_MISS_PT_FAULT); | ||
435 | TLB_MISS_EPILOG_ERROR | ||
436 | b exc_data_storage_book3e | ||
437 | 1: TLB_MISS_STATS_I(MMSTAT_TLB_MISS_PT_FAULT); | ||
438 | TLB_MISS_EPILOG_ERROR | ||
439 | b exc_instruction_storage_book3e | ||
440 | |||
441 | virt_page_table_tlb_miss_whacko_fault: | ||
442 | /* The linear fault will restart everything so ESR and DEAR will | ||
443 | * not have been clobbered, let's just fault with what we have | ||
444 | */ | ||
445 | TLB_MISS_STATS_X(MMSTAT_TLB_MISS_PT_FAULT); | ||
446 | TLB_MISS_EPILOG_ERROR | ||
447 | b exc_data_storage_book3e | ||
448 | |||
449 | |||
450 | /************************************************************** | ||
451 | * * | ||
452 | * TLB miss handling for Book3E with hw page table support * | ||
453 | * * | ||
454 | **************************************************************/ | ||
455 | |||
456 | |||
457 | /* Data TLB miss */ | ||
458 | START_EXCEPTION(data_tlb_miss_htw) | ||
459 | TLB_MISS_PROLOG | ||
460 | |||
461 | /* Now we handle the fault proper. We only save DEAR in normal | ||
462 | * fault case since that's the only interesting values here. | ||
463 | * We could probably also optimize by not saving SRR0/1 in the | ||
464 | * linear mapping case but I'll leave that for later | ||
465 | */ | ||
466 | mfspr r14,SPRN_ESR | ||
467 | mfspr r16,SPRN_DEAR /* get faulting address */ | ||
468 | srdi r11,r16,60 /* get region */ | ||
469 | cmpldi cr0,r11,0xc /* linear mapping ? */ | ||
470 | TLB_MISS_STATS_SAVE_INFO | ||
471 | beq tlb_load_linear /* yes -> go to linear map load */ | ||
472 | |||
473 | /* We do the user/kernel test for the PID here along with the RW test | ||
474 | */ | ||
475 | cmpldi cr0,r11,0 /* Check for user region */ | ||
476 | ld r15,PACAPGD(r13) /* Load user pgdir */ | ||
477 | beq htw_tlb_miss | ||
478 | |||
479 | /* XXX replace the RMW cycles with immediate loads + writes */ | ||
480 | 1: mfspr r10,SPRN_MAS1 | ||
481 | cmpldi cr0,r11,8 /* Check for vmalloc region */ | ||
482 | rlwinm r10,r10,0,16,1 /* Clear TID */ | ||
483 | mtspr SPRN_MAS1,r10 | ||
484 | ld r15,PACA_KERNELPGD(r13) /* Load kernel pgdir */ | ||
485 | beq+ htw_tlb_miss | ||
486 | |||
487 | /* We got a crappy address, just fault with whatever DEAR and ESR | ||
488 | * are here | ||
489 | */ | ||
490 | TLB_MISS_STATS_D(MMSTAT_TLB_MISS_NORM_FAULT) | ||
491 | TLB_MISS_EPILOG_ERROR | ||
492 | b exc_data_storage_book3e | ||
493 | |||
494 | /* Instruction TLB miss */ | ||
495 | START_EXCEPTION(instruction_tlb_miss_htw) | ||
496 | TLB_MISS_PROLOG | ||
497 | |||
498 | /* If we take a recursive fault, the second level handler may need | ||
499 | * to know whether we are handling a data or instruction fault in | ||
500 | * order to get to the right store fault handler. We provide that | ||
501 | * info by keeping a crazy value for ESR in r14 | ||
502 | */ | ||
503 | li r14,-1 /* store to exception frame is done later */ | ||
504 | |||
505 | /* Now we handle the fault proper. We only save DEAR in the non | ||
506 | * linear mapping case since we know the linear mapping case will | ||
507 | * not re-enter. We could indeed optimize and also not save SRR0/1 | ||
508 | * in the linear mapping case but I'll leave that for later | ||
509 | * | ||
510 | * Faulting address is SRR0 which is already in r16 | ||
511 | */ | ||
512 | srdi r11,r16,60 /* get region */ | ||
513 | cmpldi cr0,r11,0xc /* linear mapping ? */ | ||
514 | TLB_MISS_STATS_SAVE_INFO | ||
515 | beq tlb_load_linear /* yes -> go to linear map load */ | ||
516 | |||
517 | /* We do the user/kernel test for the PID here along with the RW test | ||
518 | */ | ||
519 | cmpldi cr0,r11,0 /* Check for user region */ | ||
520 | ld r15,PACAPGD(r13) /* Load user pgdir */ | ||
521 | beq htw_tlb_miss | ||
522 | |||
523 | /* XXX replace the RMW cycles with immediate loads + writes */ | ||
524 | 1: mfspr r10,SPRN_MAS1 | ||
525 | cmpldi cr0,r11,8 /* Check for vmalloc region */ | ||
526 | rlwinm r10,r10,0,16,1 /* Clear TID */ | ||
527 | mtspr SPRN_MAS1,r10 | ||
528 | ld r15,PACA_KERNELPGD(r13) /* Load kernel pgdir */ | ||
529 | beq+ htw_tlb_miss | ||
530 | |||
531 | /* We got a crappy address, just fault */ | ||
532 | TLB_MISS_STATS_I(MMSTAT_TLB_MISS_NORM_FAULT) | ||
533 | TLB_MISS_EPILOG_ERROR | ||
534 | b exc_instruction_storage_book3e | ||
535 | |||
536 | |||
537 | /* | ||
538 | * This is the guts of the second-level TLB miss handler for direct | ||
539 | * misses. We are entered with: | ||
540 | * | ||
541 | * r16 = virtual page table faulting address | ||
542 | * r15 = PGD pointer | ||
543 | * r14 = ESR | ||
544 | * r13 = PACA | ||
545 | * r12 = TLB exception frame in PACA | ||
546 | * r11 = crap (free to use) | ||
547 | * r10 = crap (free to use) | ||
548 | * | ||
549 | * It can be re-entered by the linear mapping miss handler. However, to | ||
550 | * avoid too much complication, it will save/restore things for us | ||
551 | */ | ||
552 | htw_tlb_miss: | ||
553 | /* Search if we already have a TLB entry for that virtual address, and | ||
554 | * if we do, bail out. | ||
555 | * | ||
556 | * MAS1:IND should be already set based on MAS4 | ||
557 | */ | ||
558 | PPC_TLBSRX_DOT(0,r16) | ||
559 | beq htw_tlb_miss_done | ||
560 | |||
561 | /* Now, we need to walk the page tables. First check if we are in | ||
562 | * range. | ||
563 | */ | ||
564 | rldicl. r10,r16,64-PGTABLE_EADDR_SIZE,PGTABLE_EADDR_SIZE+4 | ||
565 | bne- htw_tlb_miss_fault | ||
566 | |||
567 | /* Get the PGD pointer */ | ||
568 | cmpldi cr0,r15,0 | ||
569 | beq- htw_tlb_miss_fault | ||
570 | |||
571 | /* Get to PGD entry */ | ||
572 | rldicl r11,r16,64-(PGDIR_SHIFT-3),64-PGD_INDEX_SIZE-3 | ||
573 | clrrdi r10,r11,3 | ||
574 | ldx r15,r10,r15 | ||
575 | cmpldi cr0,r15,0 | ||
576 | beq htw_tlb_miss_fault | ||
577 | |||
578 | #ifndef CONFIG_PPC_64K_PAGES | ||
579 | /* Get to PUD entry */ | ||
580 | rldicl r11,r16,64-(PUD_SHIFT-3),64-PUD_INDEX_SIZE-3 | ||
581 | clrrdi r10,r11,3 | ||
582 | ldx r15,r10,r15 | ||
583 | cmpldi cr0,r15,0 | ||
584 | beq htw_tlb_miss_fault | ||
585 | #endif /* CONFIG_PPC_64K_PAGES */ | ||
586 | |||
587 | /* Get to PMD entry */ | ||
588 | rldicl r11,r16,64-(PMD_SHIFT-3),64-PMD_INDEX_SIZE-3 | ||
589 | clrrdi r10,r11,3 | ||
590 | ldx r15,r10,r15 | ||
591 | cmpldi cr0,r15,0 | ||
592 | beq htw_tlb_miss_fault | ||
593 | |||
594 | /* Ok, we're all right, we can now create an indirect entry for | ||
595 | * a 1M or 256M page. | ||
596 | * | ||
597 | * The last trick is now that because we use "half" pages for | ||
598 | * the HTW (1M IND is 2K and 256M IND is 32K) we need to account | ||
599 | * for an added LSB bit to the RPN. For 64K pages, there is no | ||
600 | * problem as we already use 32K arrays (half PTE pages), but for | ||
601 | * 4K page we need to extract a bit from the virtual address and | ||
602 | * insert it into the "PA52" bit of the RPN. | ||
603 | */ | ||
604 | #ifndef CONFIG_PPC_64K_PAGES | ||
605 | rlwimi r15,r16,32-9,20,20 | ||
606 | #endif | ||
607 | /* Now we build the MAS: | ||
608 | * | ||
609 | * MAS 0 : Fully setup with defaults in MAS4 and TLBnCFG | ||
610 | * MAS 1 : Almost fully setup | ||
611 | * - PID already updated by caller if necessary | ||
612 | * - TSIZE for now is base ind page size always | ||
613 | * MAS 2 : Use defaults | ||
614 | * MAS 3+7 : Needs to be done | ||
615 | */ | ||
616 | #ifdef CONFIG_PPC_64K_PAGES | ||
617 | ori r10,r15,(BOOK3E_PAGESZ_64K << MAS3_SPSIZE_SHIFT) | ||
618 | #else | ||
619 | ori r10,r15,(BOOK3E_PAGESZ_4K << MAS3_SPSIZE_SHIFT) | ||
620 | #endif | ||
621 | mtspr SPRN_MAS7_MAS3,r10 | ||
622 | |||
623 | tlbwe | ||
624 | |||
625 | htw_tlb_miss_done: | ||
626 | /* We don't bother with restoring DEAR or ESR since we know we are | ||
627 | * level 0 and just going back to userland. They are only needed | ||
628 | * if you are going to take an access fault | ||
629 | */ | ||
630 | TLB_MISS_STATS_X(MMSTAT_TLB_MISS_PT_OK) | ||
631 | TLB_MISS_EPILOG_SUCCESS | ||
632 | rfi | ||
633 | |||
634 | htw_tlb_miss_fault: | ||
635 | /* We need to check if it was an instruction miss. We know this | ||
636 | * though because r14 would contain -1 | ||
637 | */ | ||
638 | cmpdi cr0,r14,-1 | ||
639 | beq 1f | ||
640 | mtspr SPRN_DEAR,r16 | ||
641 | mtspr SPRN_ESR,r14 | ||
642 | TLB_MISS_STATS_D(MMSTAT_TLB_MISS_PT_FAULT) | ||
643 | TLB_MISS_EPILOG_ERROR | ||
644 | b exc_data_storage_book3e | ||
645 | 1: TLB_MISS_STATS_I(MMSTAT_TLB_MISS_PT_FAULT) | ||
646 | TLB_MISS_EPILOG_ERROR | ||
647 | b exc_instruction_storage_book3e | ||
648 | |||
649 | /* | ||
650 | * This is the guts of "any" level TLB miss handler for kernel linear | ||
651 | * mapping misses. We are entered with: | ||
652 | * | ||
653 | * | ||
654 | * r16 = faulting address | ||
655 | * r15 = crap (free to use) | ||
656 | * r14 = ESR (data) or -1 (instruction) | ||
657 | * r13 = PACA | ||
658 | * r12 = TLB exception frame in PACA | ||
659 | * r11 = crap (free to use) | ||
660 | * r10 = crap (free to use) | ||
661 | * | ||
662 | * In addition we know that we will not re-enter, so in theory, we could | ||
663 | * use a simpler epilog not restoring SRR0/1 etc.. but we'll do that later. | ||
664 | * | ||
665 | * We also need to be careful about MAS registers here & TLB reservation, | ||
666 | * as we know we'll have clobbered them if we interrupt the main TLB miss | ||
667 | * handlers in which case we probably want to do a full restart at level | ||
668 | * 0 rather than saving / restoring the MAS. | ||
669 | * | ||
670 | * Note: If we care about performance of that core, we can easily shuffle | ||
671 | * a few things around | ||
672 | */ | ||
673 | tlb_load_linear: | ||
674 | /* For now, we assume the linear mapping is contiguous and stops at | ||
675 | * linear_map_top. We also assume the size is a multiple of 1G, thus | ||
676 | * we only use 1G pages for now. That might have to be changed in a | ||
677 | * final implementation, especially when dealing with hypervisors | ||
678 | */ | ||
679 | ld r11,PACATOC(r13) | ||
680 | ld r11,linear_map_top@got(r11) | ||
681 | ld r10,0(r11) | ||
682 | cmpld cr0,r10,r16 | ||
683 | bge tlb_load_linear_fault | ||
684 | |||
685 | /* MAS1 need whole new setup. */ | ||
686 | li r15,(BOOK3E_PAGESZ_1GB<<MAS1_TSIZE_SHIFT) | ||
687 | oris r15,r15,MAS1_VALID@h /* MAS1 needs V and TSIZE */ | ||
688 | mtspr SPRN_MAS1,r15 | ||
689 | |||
690 | /* Already somebody there ? */ | ||
691 | PPC_TLBSRX_DOT(0,r16) | ||
692 | beq tlb_load_linear_done | ||
693 | |||
694 | /* Now we build the remaining MAS. MAS0 and 2 should be fine | ||
695 | * with their defaults, which leaves us with MAS 3 and 7. The | ||
696 | * mapping is linear, so we just take the address, clear the | ||
697 | * region bits, and or in the permission bits which are currently | ||
698 | * hard wired | ||
699 | */ | ||
700 | clrrdi r10,r16,30 /* 1G page index */ | ||
701 | clrldi r10,r10,4 /* clear region bits */ | ||
702 | ori r10,r10,MAS3_SR|MAS3_SW|MAS3_SX | ||
703 | mtspr SPRN_MAS7_MAS3,r10 | ||
704 | |||
705 | tlbwe | ||
706 | |||
707 | tlb_load_linear_done: | ||
708 | /* We use the "error" epilog for success as we do want to | ||
709 | * restore to the initial faulting context, whatever it was. | ||
710 | * We do that because we can't resume a fault within a TLB | ||
711 | * miss handler, due to MAS and TLB reservation being clobbered. | ||
712 | */ | ||
713 | TLB_MISS_STATS_X(MMSTAT_TLB_MISS_LINEAR) | ||
714 | TLB_MISS_EPILOG_ERROR | ||
715 | rfi | ||
716 | |||
717 | tlb_load_linear_fault: | ||
718 | /* We keep the DEAR and ESR around, this shouldn't have happened */ | ||
719 | cmpdi cr0,r14,-1 | ||
720 | beq 1f | ||
721 | TLB_MISS_EPILOG_ERROR_SPECIAL | ||
722 | b exc_data_storage_book3e | ||
723 | 1: TLB_MISS_EPILOG_ERROR_SPECIAL | ||
724 | b exc_instruction_storage_book3e | ||
725 | |||
726 | |||
727 | #ifdef CONFIG_BOOK3E_MMU_TLB_STATS | ||
728 | .tlb_stat_inc: | ||
729 | 1: ldarx r8,0,r9 | ||
730 | addi r8,r8,1 | ||
731 | stdcx. r8,0,r9 | ||
732 | bne- 1b | ||
733 | blr | ||
734 | #endif | ||
diff --git a/arch/powerpc/mm/tlb_nohash.c b/arch/powerpc/mm/tlb_nohash.c index ad2eb4d34dd4..2fbc680c2c71 100644 --- a/arch/powerpc/mm/tlb_nohash.c +++ b/arch/powerpc/mm/tlb_nohash.c | |||
@@ -7,8 +7,8 @@ | |||
7 | * | 7 | * |
8 | * -- BenH | 8 | * -- BenH |
9 | * | 9 | * |
10 | * Copyright 2008 Ben Herrenschmidt <benh@kernel.crashing.org> | 10 | * Copyright 2008,2009 Ben Herrenschmidt <benh@kernel.crashing.org> |
11 | * IBM Corp. | 11 | * IBM Corp. |
12 | * | 12 | * |
13 | * Derived from arch/ppc/mm/init.c: | 13 | * Derived from arch/ppc/mm/init.c: |
14 | * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) | 14 | * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) |
@@ -34,12 +34,71 @@ | |||
34 | #include <linux/pagemap.h> | 34 | #include <linux/pagemap.h> |
35 | #include <linux/preempt.h> | 35 | #include <linux/preempt.h> |
36 | #include <linux/spinlock.h> | 36 | #include <linux/spinlock.h> |
37 | #include <linux/lmb.h> | ||
37 | 38 | ||
38 | #include <asm/tlbflush.h> | 39 | #include <asm/tlbflush.h> |
39 | #include <asm/tlb.h> | 40 | #include <asm/tlb.h> |
41 | #include <asm/code-patching.h> | ||
40 | 42 | ||
41 | #include "mmu_decl.h" | 43 | #include "mmu_decl.h" |
42 | 44 | ||
45 | #ifdef CONFIG_PPC_BOOK3E | ||
46 | struct mmu_psize_def mmu_psize_defs[MMU_PAGE_COUNT] = { | ||
47 | [MMU_PAGE_4K] = { | ||
48 | .shift = 12, | ||
49 | .enc = BOOK3E_PAGESZ_4K, | ||
50 | }, | ||
51 | [MMU_PAGE_16K] = { | ||
52 | .shift = 14, | ||
53 | .enc = BOOK3E_PAGESZ_16K, | ||
54 | }, | ||
55 | [MMU_PAGE_64K] = { | ||
56 | .shift = 16, | ||
57 | .enc = BOOK3E_PAGESZ_64K, | ||
58 | }, | ||
59 | [MMU_PAGE_1M] = { | ||
60 | .shift = 20, | ||
61 | .enc = BOOK3E_PAGESZ_1M, | ||
62 | }, | ||
63 | [MMU_PAGE_16M] = { | ||
64 | .shift = 24, | ||
65 | .enc = BOOK3E_PAGESZ_16M, | ||
66 | }, | ||
67 | [MMU_PAGE_256M] = { | ||
68 | .shift = 28, | ||
69 | .enc = BOOK3E_PAGESZ_256M, | ||
70 | }, | ||
71 | [MMU_PAGE_1G] = { | ||
72 | .shift = 30, | ||
73 | .enc = BOOK3E_PAGESZ_1GB, | ||
74 | }, | ||
75 | }; | ||
76 | static inline int mmu_get_tsize(int psize) | ||
77 | { | ||
78 | return mmu_psize_defs[psize].enc; | ||
79 | } | ||
80 | #else | ||
81 | static inline int mmu_get_tsize(int psize) | ||
82 | { | ||
83 | /* This isn't used on !Book3E for now */ | ||
84 | return 0; | ||
85 | } | ||
86 | #endif | ||
87 | |||
88 | /* The variables below are currently only used on 64-bit Book3E | ||
89 | * though this will probably be made common with other nohash | ||
90 | * implementations at some point | ||
91 | */ | ||
92 | #ifdef CONFIG_PPC64 | ||
93 | |||
94 | int mmu_linear_psize; /* Page size used for the linear mapping */ | ||
95 | int mmu_pte_psize; /* Page size used for PTE pages */ | ||
96 | int mmu_vmemmap_psize; /* Page size used for the virtual mem map */ | ||
97 | int book3e_htw_enabled; /* Is HW tablewalk enabled ? */ | ||
98 | unsigned long linear_map_top; /* Top of linear mapping */ | ||
99 | |||
100 | #endif /* CONFIG_PPC64 */ | ||
101 | |||
43 | /* | 102 | /* |
44 | * Base TLB flushing operations: | 103 | * Base TLB flushing operations: |
45 | * | 104 | * |
@@ -67,18 +126,24 @@ void local_flush_tlb_mm(struct mm_struct *mm) | |||
67 | } | 126 | } |
68 | EXPORT_SYMBOL(local_flush_tlb_mm); | 127 | EXPORT_SYMBOL(local_flush_tlb_mm); |
69 | 128 | ||
70 | void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr) | 129 | void __local_flush_tlb_page(struct mm_struct *mm, unsigned long vmaddr, |
130 | int tsize, int ind) | ||
71 | { | 131 | { |
72 | unsigned int pid; | 132 | unsigned int pid; |
73 | 133 | ||
74 | preempt_disable(); | 134 | preempt_disable(); |
75 | pid = vma ? vma->vm_mm->context.id : 0; | 135 | pid = mm ? mm->context.id : 0; |
76 | if (pid != MMU_NO_CONTEXT) | 136 | if (pid != MMU_NO_CONTEXT) |
77 | _tlbil_va(vmaddr, pid); | 137 | _tlbil_va(vmaddr, pid, tsize, ind); |
78 | preempt_enable(); | 138 | preempt_enable(); |
79 | } | 139 | } |
80 | EXPORT_SYMBOL(local_flush_tlb_page); | ||
81 | 140 | ||
141 | void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr) | ||
142 | { | ||
143 | __local_flush_tlb_page(vma ? vma->vm_mm : NULL, vmaddr, | ||
144 | mmu_get_tsize(mmu_virtual_psize), 0); | ||
145 | } | ||
146 | EXPORT_SYMBOL(local_flush_tlb_page); | ||
82 | 147 | ||
83 | /* | 148 | /* |
84 | * And here are the SMP non-local implementations | 149 | * And here are the SMP non-local implementations |
@@ -87,9 +152,17 @@ EXPORT_SYMBOL(local_flush_tlb_page); | |||
87 | 152 | ||
88 | static DEFINE_SPINLOCK(tlbivax_lock); | 153 | static DEFINE_SPINLOCK(tlbivax_lock); |
89 | 154 | ||
155 | static int mm_is_core_local(struct mm_struct *mm) | ||
156 | { | ||
157 | return cpumask_subset(mm_cpumask(mm), | ||
158 | topology_thread_cpumask(smp_processor_id())); | ||
159 | } | ||
160 | |||
90 | struct tlb_flush_param { | 161 | struct tlb_flush_param { |
91 | unsigned long addr; | 162 | unsigned long addr; |
92 | unsigned int pid; | 163 | unsigned int pid; |
164 | unsigned int tsize; | ||
165 | unsigned int ind; | ||
93 | }; | 166 | }; |
94 | 167 | ||
95 | static void do_flush_tlb_mm_ipi(void *param) | 168 | static void do_flush_tlb_mm_ipi(void *param) |
@@ -103,7 +176,7 @@ static void do_flush_tlb_page_ipi(void *param) | |||
103 | { | 176 | { |
104 | struct tlb_flush_param *p = param; | 177 | struct tlb_flush_param *p = param; |
105 | 178 | ||
106 | _tlbil_va(p->addr, p->pid); | 179 | _tlbil_va(p->addr, p->pid, p->tsize, p->ind); |
107 | } | 180 | } |
108 | 181 | ||
109 | 182 | ||
@@ -131,7 +204,7 @@ void flush_tlb_mm(struct mm_struct *mm) | |||
131 | pid = mm->context.id; | 204 | pid = mm->context.id; |
132 | if (unlikely(pid == MMU_NO_CONTEXT)) | 205 | if (unlikely(pid == MMU_NO_CONTEXT)) |
133 | goto no_context; | 206 | goto no_context; |
134 | if (!cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id()))) { | 207 | if (!mm_is_core_local(mm)) { |
135 | struct tlb_flush_param p = { .pid = pid }; | 208 | struct tlb_flush_param p = { .pid = pid }; |
136 | /* Ignores smp_processor_id() even if set. */ | 209 | /* Ignores smp_processor_id() even if set. */ |
137 | smp_call_function_many(mm_cpumask(mm), | 210 | smp_call_function_many(mm_cpumask(mm), |
@@ -143,37 +216,49 @@ void flush_tlb_mm(struct mm_struct *mm) | |||
143 | } | 216 | } |
144 | EXPORT_SYMBOL(flush_tlb_mm); | 217 | EXPORT_SYMBOL(flush_tlb_mm); |
145 | 218 | ||
146 | void flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr) | 219 | void __flush_tlb_page(struct mm_struct *mm, unsigned long vmaddr, |
220 | int tsize, int ind) | ||
147 | { | 221 | { |
148 | struct cpumask *cpu_mask; | 222 | struct cpumask *cpu_mask; |
149 | unsigned int pid; | 223 | unsigned int pid; |
150 | 224 | ||
151 | preempt_disable(); | 225 | preempt_disable(); |
152 | pid = vma ? vma->vm_mm->context.id : 0; | 226 | pid = mm ? mm->context.id : 0; |
153 | if (unlikely(pid == MMU_NO_CONTEXT)) | 227 | if (unlikely(pid == MMU_NO_CONTEXT)) |
154 | goto bail; | 228 | goto bail; |
155 | cpu_mask = mm_cpumask(vma->vm_mm); | 229 | cpu_mask = mm_cpumask(mm); |
156 | if (!cpumask_equal(cpu_mask, cpumask_of(smp_processor_id()))) { | 230 | if (!mm_is_core_local(mm)) { |
157 | /* If broadcast tlbivax is supported, use it */ | 231 | /* If broadcast tlbivax is supported, use it */ |
158 | if (mmu_has_feature(MMU_FTR_USE_TLBIVAX_BCAST)) { | 232 | if (mmu_has_feature(MMU_FTR_USE_TLBIVAX_BCAST)) { |
159 | int lock = mmu_has_feature(MMU_FTR_LOCK_BCAST_INVAL); | 233 | int lock = mmu_has_feature(MMU_FTR_LOCK_BCAST_INVAL); |
160 | if (lock) | 234 | if (lock) |
161 | spin_lock(&tlbivax_lock); | 235 | spin_lock(&tlbivax_lock); |
162 | _tlbivax_bcast(vmaddr, pid); | 236 | _tlbivax_bcast(vmaddr, pid, tsize, ind); |
163 | if (lock) | 237 | if (lock) |
164 | spin_unlock(&tlbivax_lock); | 238 | spin_unlock(&tlbivax_lock); |
165 | goto bail; | 239 | goto bail; |
166 | } else { | 240 | } else { |
167 | struct tlb_flush_param p = { .pid = pid, .addr = vmaddr }; | 241 | struct tlb_flush_param p = { |
242 | .pid = pid, | ||
243 | .addr = vmaddr, | ||
244 | .tsize = tsize, | ||
245 | .ind = ind, | ||
246 | }; | ||
168 | /* Ignores smp_processor_id() even if set in cpu_mask */ | 247 | /* Ignores smp_processor_id() even if set in cpu_mask */ |
169 | smp_call_function_many(cpu_mask, | 248 | smp_call_function_many(cpu_mask, |
170 | do_flush_tlb_page_ipi, &p, 1); | 249 | do_flush_tlb_page_ipi, &p, 1); |
171 | } | 250 | } |
172 | } | 251 | } |
173 | _tlbil_va(vmaddr, pid); | 252 | _tlbil_va(vmaddr, pid, tsize, ind); |
174 | bail: | 253 | bail: |
175 | preempt_enable(); | 254 | preempt_enable(); |
176 | } | 255 | } |
256 | |||
257 | void flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr) | ||
258 | { | ||
259 | __flush_tlb_page(vma ? vma->vm_mm : NULL, vmaddr, | ||
260 | mmu_get_tsize(mmu_virtual_psize), 0); | ||
261 | } | ||
177 | EXPORT_SYMBOL(flush_tlb_page); | 262 | EXPORT_SYMBOL(flush_tlb_page); |
178 | 263 | ||
179 | #endif /* CONFIG_SMP */ | 264 | #endif /* CONFIG_SMP */ |
@@ -207,3 +292,156 @@ void flush_tlb_range(struct vm_area_struct *vma, unsigned long start, | |||
207 | flush_tlb_mm(vma->vm_mm); | 292 | flush_tlb_mm(vma->vm_mm); |
208 | } | 293 | } |
209 | EXPORT_SYMBOL(flush_tlb_range); | 294 | EXPORT_SYMBOL(flush_tlb_range); |
295 | |||
296 | void tlb_flush(struct mmu_gather *tlb) | ||
297 | { | ||
298 | flush_tlb_mm(tlb->mm); | ||
299 | |||
300 | /* Push out batch of freed page tables */ | ||
301 | pte_free_finish(); | ||
302 | } | ||
303 | |||
304 | /* | ||
305 | * Below are functions specific to the 64-bit variant of Book3E though that | ||
306 | * may change in the future | ||
307 | */ | ||
308 | |||
309 | #ifdef CONFIG_PPC64 | ||
310 | |||
311 | /* | ||
312 | * Handling of virtual linear page tables or indirect TLB entries | ||
313 | * flushing when PTE pages are freed | ||
314 | */ | ||
315 | void tlb_flush_pgtable(struct mmu_gather *tlb, unsigned long address) | ||
316 | { | ||
317 | int tsize = mmu_psize_defs[mmu_pte_psize].enc; | ||
318 | |||
319 | if (book3e_htw_enabled) { | ||
320 | unsigned long start = address & PMD_MASK; | ||
321 | unsigned long end = address + PMD_SIZE; | ||
322 | unsigned long size = 1UL << mmu_psize_defs[mmu_pte_psize].shift; | ||
323 | |||
324 | /* This isn't the most optimal, ideally we would factor out the | ||
325 | * while preempt & CPU mask mucking around, or even the IPI but | ||
326 | * it will do for now | ||
327 | */ | ||
328 | while (start < end) { | ||
329 | __flush_tlb_page(tlb->mm, start, tsize, 1); | ||
330 | start += size; | ||
331 | } | ||
332 | } else { | ||
333 | unsigned long rmask = 0xf000000000000000ul; | ||
334 | unsigned long rid = (address & rmask) | 0x1000000000000000ul; | ||
335 | unsigned long vpte = address & ~rmask; | ||
336 | |||
337 | #ifdef CONFIG_PPC_64K_PAGES | ||
338 | vpte = (vpte >> (PAGE_SHIFT - 4)) & ~0xfffful; | ||
339 | #else | ||
340 | vpte = (vpte >> (PAGE_SHIFT - 3)) & ~0xffful; | ||
341 | #endif | ||
342 | vpte |= rid; | ||
343 | __flush_tlb_page(tlb->mm, vpte, tsize, 0); | ||
344 | } | ||
345 | } | ||
346 | |||
347 | /* | ||
348 | * Early initialization of the MMU TLB code | ||
349 | */ | ||
350 | static void __early_init_mmu(int boot_cpu) | ||
351 | { | ||
352 | extern unsigned int interrupt_base_book3e; | ||
353 | extern unsigned int exc_data_tlb_miss_htw_book3e; | ||
354 | extern unsigned int exc_instruction_tlb_miss_htw_book3e; | ||
355 | |||
356 | unsigned int *ibase = &interrupt_base_book3e; | ||
357 | unsigned int mas4; | ||
358 | |||
359 | /* XXX This will have to be decided at runtime, but right | ||
360 | * now our boot and TLB miss code hard wires it. Ideally | ||
361 | * we should find out a suitable page size and patch the | ||
362 | * TLB miss code (either that or use the PACA to store | ||
363 | * the value we want) | ||
364 | */ | ||
365 | mmu_linear_psize = MMU_PAGE_1G; | ||
366 | |||
367 | /* XXX This should be decided at runtime based on supported | ||
368 | * page sizes in the TLB, but for now let's assume 16M is | ||
369 | * always there and a good fit (which it probably is) | ||
370 | */ | ||
371 | mmu_vmemmap_psize = MMU_PAGE_16M; | ||
372 | |||
373 | /* Check if HW tablewalk is present, and if yes, enable it by: | ||
374 | * | ||
375 | * - patching the TLB miss handlers to branch to the | ||
376 | * one dedicates to it | ||
377 | * | ||
378 | * - setting the global book3e_htw_enabled | ||
379 | * | ||
380 | * - Set MAS4:INDD and default page size | ||
381 | */ | ||
382 | |||
383 | /* XXX This code only checks for TLB 0 capabilities and doesn't | ||
384 | * check what page size combos are supported by the HW. It | ||
385 | * also doesn't handle the case where a separate array holds | ||
386 | * the IND entries from the array loaded by the PT. | ||
387 | */ | ||
388 | if (boot_cpu) { | ||
389 | unsigned int tlb0cfg = mfspr(SPRN_TLB0CFG); | ||
390 | |||
391 | /* Check if HW loader is supported */ | ||
392 | if ((tlb0cfg & TLBnCFG_IND) && | ||
393 | (tlb0cfg & TLBnCFG_PT)) { | ||
394 | patch_branch(ibase + (0x1c0 / 4), | ||
395 | (unsigned long)&exc_data_tlb_miss_htw_book3e, 0); | ||
396 | patch_branch(ibase + (0x1e0 / 4), | ||
397 | (unsigned long)&exc_instruction_tlb_miss_htw_book3e, 0); | ||
398 | book3e_htw_enabled = 1; | ||
399 | } | ||
400 | pr_info("MMU: Book3E Page Tables %s\n", | ||
401 | book3e_htw_enabled ? "Enabled" : "Disabled"); | ||
402 | } | ||
403 | |||
404 | /* Set MAS4 based on page table setting */ | ||
405 | |||
406 | mas4 = 0x4 << MAS4_WIMGED_SHIFT; | ||
407 | if (book3e_htw_enabled) { | ||
408 | mas4 |= mas4 | MAS4_INDD; | ||
409 | #ifdef CONFIG_PPC_64K_PAGES | ||
410 | mas4 |= BOOK3E_PAGESZ_256M << MAS4_TSIZED_SHIFT; | ||
411 | mmu_pte_psize = MMU_PAGE_256M; | ||
412 | #else | ||
413 | mas4 |= BOOK3E_PAGESZ_1M << MAS4_TSIZED_SHIFT; | ||
414 | mmu_pte_psize = MMU_PAGE_1M; | ||
415 | #endif | ||
416 | } else { | ||
417 | #ifdef CONFIG_PPC_64K_PAGES | ||
418 | mas4 |= BOOK3E_PAGESZ_64K << MAS4_TSIZED_SHIFT; | ||
419 | #else | ||
420 | mas4 |= BOOK3E_PAGESZ_4K << MAS4_TSIZED_SHIFT; | ||
421 | #endif | ||
422 | mmu_pte_psize = mmu_virtual_psize; | ||
423 | } | ||
424 | mtspr(SPRN_MAS4, mas4); | ||
425 | |||
426 | /* Set the global containing the top of the linear mapping | ||
427 | * for use by the TLB miss code | ||
428 | */ | ||
429 | linear_map_top = lmb_end_of_DRAM(); | ||
430 | |||
431 | /* A sync won't hurt us after mucking around with | ||
432 | * the MMU configuration | ||
433 | */ | ||
434 | mb(); | ||
435 | } | ||
436 | |||
437 | void __init early_init_mmu(void) | ||
438 | { | ||
439 | __early_init_mmu(1); | ||
440 | } | ||
441 | |||
442 | void __cpuinit early_init_mmu_secondary(void) | ||
443 | { | ||
444 | __early_init_mmu(0); | ||
445 | } | ||
446 | |||
447 | #endif /* CONFIG_PPC64 */ | ||
diff --git a/arch/powerpc/mm/tlb_nohash_low.S b/arch/powerpc/mm/tlb_nohash_low.S index 3037911279b1..7bcd9fbf6cc6 100644 --- a/arch/powerpc/mm/tlb_nohash_low.S +++ b/arch/powerpc/mm/tlb_nohash_low.S | |||
@@ -39,7 +39,7 @@ | |||
39 | /* | 39 | /* |
40 | * 40x implementation needs only tlbil_va | 40 | * 40x implementation needs only tlbil_va |
41 | */ | 41 | */ |
42 | _GLOBAL(_tlbil_va) | 42 | _GLOBAL(__tlbil_va) |
43 | /* We run the search with interrupts disabled because we have to change | 43 | /* We run the search with interrupts disabled because we have to change |
44 | * the PID and I don't want to preempt when that happens. | 44 | * the PID and I don't want to preempt when that happens. |
45 | */ | 45 | */ |
@@ -71,7 +71,7 @@ _GLOBAL(_tlbil_va) | |||
71 | * 440 implementation uses tlbsx/we for tlbil_va and a full sweep | 71 | * 440 implementation uses tlbsx/we for tlbil_va and a full sweep |
72 | * of the TLB for everything else. | 72 | * of the TLB for everything else. |
73 | */ | 73 | */ |
74 | _GLOBAL(_tlbil_va) | 74 | _GLOBAL(__tlbil_va) |
75 | mfspr r5,SPRN_MMUCR | 75 | mfspr r5,SPRN_MMUCR |
76 | rlwimi r5,r4,0,24,31 /* Set TID */ | 76 | rlwimi r5,r4,0,24,31 /* Set TID */ |
77 | 77 | ||
@@ -170,7 +170,7 @@ ALT_MMU_FTR_SECTION_END_IFSET(MMU_FTR_USE_TLBILX) | |||
170 | * Flush MMU TLB for a particular address, but only on the local processor | 170 | * Flush MMU TLB for a particular address, but only on the local processor |
171 | * (no broadcast) | 171 | * (no broadcast) |
172 | */ | 172 | */ |
173 | _GLOBAL(_tlbil_va) | 173 | _GLOBAL(__tlbil_va) |
174 | mfmsr r10 | 174 | mfmsr r10 |
175 | wrteei 0 | 175 | wrteei 0 |
176 | slwi r4,r4,16 | 176 | slwi r4,r4,16 |
@@ -191,6 +191,85 @@ ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_USE_TLBILX) | |||
191 | isync | 191 | isync |
192 | 1: wrtee r10 | 192 | 1: wrtee r10 |
193 | blr | 193 | blr |
194 | #elif defined(CONFIG_PPC_BOOK3E) | ||
195 | /* | ||
196 | * New Book3E (>= 2.06) implementation | ||
197 | * | ||
198 | * Note: We may be able to get away without the interrupt masking stuff | ||
199 | * if we save/restore MAS6 on exceptions that might modify it | ||
200 | */ | ||
201 | _GLOBAL(_tlbil_pid) | ||
202 | slwi r4,r3,MAS6_SPID_SHIFT | ||
203 | mfmsr r10 | ||
204 | wrteei 0 | ||
205 | mtspr SPRN_MAS6,r4 | ||
206 | PPC_TLBILX_PID(0,0) | ||
207 | wrtee r10 | ||
208 | msync | ||
209 | isync | ||
210 | blr | ||
211 | |||
212 | _GLOBAL(_tlbil_pid_noind) | ||
213 | slwi r4,r3,MAS6_SPID_SHIFT | ||
214 | mfmsr r10 | ||
215 | ori r4,r4,MAS6_SIND | ||
216 | wrteei 0 | ||
217 | mtspr SPRN_MAS6,r4 | ||
218 | PPC_TLBILX_PID(0,0) | ||
219 | wrtee r10 | ||
220 | msync | ||
221 | isync | ||
222 | blr | ||
223 | |||
224 | _GLOBAL(_tlbil_all) | ||
225 | PPC_TLBILX_ALL(0,0) | ||
226 | msync | ||
227 | isync | ||
228 | blr | ||
229 | |||
230 | _GLOBAL(_tlbil_va) | ||
231 | mfmsr r10 | ||
232 | wrteei 0 | ||
233 | cmpwi cr0,r6,0 | ||
234 | slwi r4,r4,MAS6_SPID_SHIFT | ||
235 | rlwimi r4,r5,MAS6_ISIZE_SHIFT,MAS6_ISIZE_MASK | ||
236 | beq 1f | ||
237 | rlwimi r4,r6,MAS6_SIND_SHIFT,MAS6_SIND | ||
238 | 1: mtspr SPRN_MAS6,r4 /* assume AS=0 for now */ | ||
239 | PPC_TLBILX_VA(0,r3) | ||
240 | msync | ||
241 | isync | ||
242 | wrtee r10 | ||
243 | blr | ||
244 | |||
245 | _GLOBAL(_tlbivax_bcast) | ||
246 | mfmsr r10 | ||
247 | wrteei 0 | ||
248 | cmpwi cr0,r6,0 | ||
249 | slwi r4,r4,MAS6_SPID_SHIFT | ||
250 | rlwimi r4,r5,MAS6_ISIZE_SHIFT,MAS6_ISIZE_MASK | ||
251 | beq 1f | ||
252 | rlwimi r4,r6,MAS6_SIND_SHIFT,MAS6_SIND | ||
253 | 1: mtspr SPRN_MAS6,r4 /* assume AS=0 for now */ | ||
254 | PPC_TLBIVAX(0,r3) | ||
255 | eieio | ||
256 | tlbsync | ||
257 | sync | ||
258 | wrtee r10 | ||
259 | blr | ||
260 | |||
261 | _GLOBAL(set_context) | ||
262 | #ifdef CONFIG_BDI_SWITCH | ||
263 | /* Context switch the PTE pointer for the Abatron BDI2000. | ||
264 | * The PGDIR is the second parameter. | ||
265 | */ | ||
266 | lis r5, abatron_pteptrs@h | ||
267 | ori r5, r5, abatron_pteptrs@l | ||
268 | stw r4, 0x4(r5) | ||
269 | #endif | ||
270 | mtspr SPRN_PID,r3 | ||
271 | isync /* Force context change */ | ||
272 | blr | ||
194 | #else | 273 | #else |
195 | #error Unsupported processor type ! | 274 | #error Unsupported processor type ! |
196 | #endif | 275 | #endif |
diff --git a/arch/powerpc/platforms/82xx/mgcoge.c b/arch/powerpc/platforms/82xx/mgcoge.c index c2af169c1d1d..7a5de9eb3c73 100644 --- a/arch/powerpc/platforms/82xx/mgcoge.c +++ b/arch/powerpc/platforms/82xx/mgcoge.c | |||
@@ -50,16 +50,63 @@ struct cpm_pin { | |||
50 | static __initdata struct cpm_pin mgcoge_pins[] = { | 50 | static __initdata struct cpm_pin mgcoge_pins[] = { |
51 | 51 | ||
52 | /* SMC2 */ | 52 | /* SMC2 */ |
53 | {1, 8, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | 53 | {0, 8, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, |
54 | {1, 9, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY}, | 54 | {0, 9, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY}, |
55 | 55 | ||
56 | /* SCC4 */ | 56 | /* SCC4 */ |
57 | {3, 25, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | 57 | {2, 25, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, |
58 | {3, 24, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | 58 | {2, 24, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, |
59 | {3, 9, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | 59 | {2, 9, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, |
60 | {3, 8, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | 60 | {2, 8, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, |
61 | {4, 22, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | 61 | {3, 22, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, |
62 | {4, 21, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY}, | 62 | {3, 21, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY}, |
63 | |||
64 | /* FCC1 */ | ||
65 | {0, 14, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | ||
66 | {0, 15, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | ||
67 | {0, 16, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | ||
68 | {0, 17, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | ||
69 | {0, 18, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY}, | ||
70 | {0, 19, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY}, | ||
71 | {0, 20, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY}, | ||
72 | {0, 21, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY}, | ||
73 | {0, 26, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, | ||
74 | {0, 27, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, | ||
75 | {0, 28, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY}, | ||
76 | {0, 29, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY}, | ||
77 | {0, 30, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, | ||
78 | {0, 31, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, | ||
79 | |||
80 | {2, 22, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | ||
81 | {2, 23, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | ||
82 | |||
83 | /* FCC2 */ | ||
84 | {1, 18, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | ||
85 | {1, 19, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | ||
86 | {1, 20, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | ||
87 | {1, 21, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | ||
88 | {1, 22, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY}, | ||
89 | {1, 23, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY}, | ||
90 | {1, 24, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY}, | ||
91 | {1, 25, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY}, | ||
92 | {1, 26, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | ||
93 | {1, 27, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | ||
94 | {1, 28, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | ||
95 | {1, 29, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY}, | ||
96 | {1, 30, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | ||
97 | {1, 31, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY}, | ||
98 | |||
99 | {2, 18, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | ||
100 | {2, 19, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, | ||
101 | |||
102 | /* MDC */ | ||
103 | {0, 13, CPM_PIN_OUTPUT | CPM_PIN_GPIO}, | ||
104 | |||
105 | #if defined(CONFIG_I2C_CPM) | ||
106 | /* I2C */ | ||
107 | {3, 14, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_OPENDRAIN}, | ||
108 | {3, 15, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_OPENDRAIN}, | ||
109 | #endif | ||
63 | }; | 110 | }; |
64 | 111 | ||
65 | static void __init init_ioports(void) | 112 | static void __init init_ioports(void) |
@@ -68,12 +115,16 @@ static void __init init_ioports(void) | |||
68 | 115 | ||
69 | for (i = 0; i < ARRAY_SIZE(mgcoge_pins); i++) { | 116 | for (i = 0; i < ARRAY_SIZE(mgcoge_pins); i++) { |
70 | const struct cpm_pin *pin = &mgcoge_pins[i]; | 117 | const struct cpm_pin *pin = &mgcoge_pins[i]; |
71 | cpm2_set_pin(pin->port - 1, pin->pin, pin->flags); | 118 | cpm2_set_pin(pin->port, pin->pin, pin->flags); |
72 | } | 119 | } |
73 | 120 | ||
74 | cpm2_smc_clk_setup(CPM_CLK_SMC2, CPM_BRG8); | 121 | cpm2_smc_clk_setup(CPM_CLK_SMC2, CPM_BRG8); |
75 | cpm2_clk_setup(CPM_CLK_SCC4, CPM_CLK7, CPM_CLK_RX); | 122 | cpm2_clk_setup(CPM_CLK_SCC4, CPM_CLK7, CPM_CLK_RX); |
76 | cpm2_clk_setup(CPM_CLK_SCC4, CPM_CLK8, CPM_CLK_TX); | 123 | cpm2_clk_setup(CPM_CLK_SCC4, CPM_CLK8, CPM_CLK_TX); |
124 | cpm2_clk_setup(CPM_CLK_FCC1, CPM_CLK10, CPM_CLK_RX); | ||
125 | cpm2_clk_setup(CPM_CLK_FCC1, CPM_CLK9, CPM_CLK_TX); | ||
126 | cpm2_clk_setup(CPM_CLK_FCC2, CPM_CLK13, CPM_CLK_RX); | ||
127 | cpm2_clk_setup(CPM_CLK_FCC2, CPM_CLK14, CPM_CLK_TX); | ||
77 | } | 128 | } |
78 | 129 | ||
79 | static void __init mgcoge_setup_arch(void) | 130 | static void __init mgcoge_setup_arch(void) |
diff --git a/arch/powerpc/platforms/83xx/Kconfig b/arch/powerpc/platforms/83xx/Kconfig index 083ebee9a16d..f49a2548c5ff 100644 --- a/arch/powerpc/platforms/83xx/Kconfig +++ b/arch/powerpc/platforms/83xx/Kconfig | |||
@@ -75,11 +75,11 @@ config MPC837x_MDS | |||
75 | This option enables support for the MPC837x MDS Processor Board. | 75 | This option enables support for the MPC837x MDS Processor Board. |
76 | 76 | ||
77 | config MPC837x_RDB | 77 | config MPC837x_RDB |
78 | bool "Freescale MPC837x RDB" | 78 | bool "Freescale MPC837x RDB/WLAN" |
79 | select DEFAULT_UIMAGE | 79 | select DEFAULT_UIMAGE |
80 | select PPC_MPC837x | 80 | select PPC_MPC837x |
81 | help | 81 | help |
82 | This option enables support for the MPC837x RDB Board. | 82 | This option enables support for the MPC837x RDB and WLAN Boards. |
83 | 83 | ||
84 | config SBC834x | 84 | config SBC834x |
85 | bool "Wind River SBC834x" | 85 | bool "Wind River SBC834x" |
diff --git a/arch/powerpc/platforms/83xx/mpc837x_rdb.c b/arch/powerpc/platforms/83xx/mpc837x_rdb.c index 76f3b32a155e..a1908d261240 100644 --- a/arch/powerpc/platforms/83xx/mpc837x_rdb.c +++ b/arch/powerpc/platforms/83xx/mpc837x_rdb.c | |||
@@ -17,10 +17,32 @@ | |||
17 | #include <asm/time.h> | 17 | #include <asm/time.h> |
18 | #include <asm/ipic.h> | 18 | #include <asm/ipic.h> |
19 | #include <asm/udbg.h> | 19 | #include <asm/udbg.h> |
20 | #include <sysdev/fsl_soc.h> | ||
20 | #include <sysdev/fsl_pci.h> | 21 | #include <sysdev/fsl_pci.h> |
21 | 22 | ||
22 | #include "mpc83xx.h" | 23 | #include "mpc83xx.h" |
23 | 24 | ||
25 | static void mpc837x_rdb_sd_cfg(void) | ||
26 | { | ||
27 | void __iomem *im; | ||
28 | |||
29 | im = ioremap(get_immrbase(), 0x1000); | ||
30 | if (!im) { | ||
31 | WARN_ON(1); | ||
32 | return; | ||
33 | } | ||
34 | |||
35 | /* | ||
36 | * On RDB boards (in contrast to MDS) USBB pins are used for SD only, | ||
37 | * so we can safely mux them away from the USB block. | ||
38 | */ | ||
39 | clrsetbits_be32(im + MPC83XX_SICRL_OFFS, MPC837X_SICRL_USBB_MASK, | ||
40 | MPC837X_SICRL_SD); | ||
41 | clrsetbits_be32(im + MPC83XX_SICRH_OFFS, MPC837X_SICRH_SPI_MASK, | ||
42 | MPC837X_SICRH_SD); | ||
43 | iounmap(im); | ||
44 | } | ||
45 | |||
24 | /* ************************************************************************ | 46 | /* ************************************************************************ |
25 | * | 47 | * |
26 | * Setup the architecture | 48 | * Setup the architecture |
@@ -42,6 +64,7 @@ static void __init mpc837x_rdb_setup_arch(void) | |||
42 | mpc83xx_add_bridge(np); | 64 | mpc83xx_add_bridge(np); |
43 | #endif | 65 | #endif |
44 | mpc837x_usb_cfg(); | 66 | mpc837x_usb_cfg(); |
67 | mpc837x_rdb_sd_cfg(); | ||
45 | } | 68 | } |
46 | 69 | ||
47 | static struct of_device_id mpc837x_ids[] = { | 70 | static struct of_device_id mpc837x_ids[] = { |
@@ -86,11 +109,12 @@ static int __init mpc837x_rdb_probe(void) | |||
86 | 109 | ||
87 | return of_flat_dt_is_compatible(root, "fsl,mpc8377rdb") || | 110 | return of_flat_dt_is_compatible(root, "fsl,mpc8377rdb") || |
88 | of_flat_dt_is_compatible(root, "fsl,mpc8378rdb") || | 111 | of_flat_dt_is_compatible(root, "fsl,mpc8378rdb") || |
89 | of_flat_dt_is_compatible(root, "fsl,mpc8379rdb"); | 112 | of_flat_dt_is_compatible(root, "fsl,mpc8379rdb") || |
113 | of_flat_dt_is_compatible(root, "fsl,mpc8377wlan"); | ||
90 | } | 114 | } |
91 | 115 | ||
92 | define_machine(mpc837x_rdb) { | 116 | define_machine(mpc837x_rdb) { |
93 | .name = "MPC837x RDB", | 117 | .name = "MPC837x RDB/WLAN", |
94 | .probe = mpc837x_rdb_probe, | 118 | .probe = mpc837x_rdb_probe, |
95 | .setup_arch = mpc837x_rdb_setup_arch, | 119 | .setup_arch = mpc837x_rdb_setup_arch, |
96 | .init_IRQ = mpc837x_rdb_init_IRQ, | 120 | .init_IRQ = mpc837x_rdb_init_IRQ, |
diff --git a/arch/powerpc/platforms/83xx/mpc83xx.h b/arch/powerpc/platforms/83xx/mpc83xx.h index d1dc5b0b4fbf..0fea8811d45b 100644 --- a/arch/powerpc/platforms/83xx/mpc83xx.h +++ b/arch/powerpc/platforms/83xx/mpc83xx.h | |||
@@ -30,6 +30,8 @@ | |||
30 | #define MPC8315_SICRL_USB_ULPI 0x00000054 | 30 | #define MPC8315_SICRL_USB_ULPI 0x00000054 |
31 | #define MPC837X_SICRL_USB_MASK 0xf0000000 | 31 | #define MPC837X_SICRL_USB_MASK 0xf0000000 |
32 | #define MPC837X_SICRL_USB_ULPI 0x50000000 | 32 | #define MPC837X_SICRL_USB_ULPI 0x50000000 |
33 | #define MPC837X_SICRL_USBB_MASK 0x30000000 | ||
34 | #define MPC837X_SICRL_SD 0x20000000 | ||
33 | 35 | ||
34 | /* system i/o configuration register high */ | 36 | /* system i/o configuration register high */ |
35 | #define MPC83XX_SICRH_OFFS 0x118 | 37 | #define MPC83XX_SICRH_OFFS 0x118 |
@@ -38,6 +40,8 @@ | |||
38 | #define MPC831X_SICRH_USB_ULPI 0x000000a0 | 40 | #define MPC831X_SICRH_USB_ULPI 0x000000a0 |
39 | #define MPC8315_SICRH_USB_MASK 0x0000ff00 | 41 | #define MPC8315_SICRH_USB_MASK 0x0000ff00 |
40 | #define MPC8315_SICRH_USB_ULPI 0x00000000 | 42 | #define MPC8315_SICRH_USB_ULPI 0x00000000 |
43 | #define MPC837X_SICRH_SPI_MASK 0x00000003 | ||
44 | #define MPC837X_SICRH_SD 0x00000001 | ||
41 | 45 | ||
42 | /* USB Control Register */ | 46 | /* USB Control Register */ |
43 | #define FSL_USB2_CONTROL_OFFS 0x500 | 47 | #define FSL_USB2_CONTROL_OFFS 0x500 |
diff --git a/arch/powerpc/platforms/85xx/smp.c b/arch/powerpc/platforms/85xx/smp.c index 62c592ede641..9f526ba31c1e 100644 --- a/arch/powerpc/platforms/85xx/smp.c +++ b/arch/powerpc/platforms/85xx/smp.c | |||
@@ -25,7 +25,6 @@ | |||
25 | 25 | ||
26 | #include <sysdev/fsl_soc.h> | 26 | #include <sysdev/fsl_soc.h> |
27 | 27 | ||
28 | extern volatile unsigned long __secondary_hold_acknowledge; | ||
29 | extern void __early_start(void); | 28 | extern void __early_start(void); |
30 | 29 | ||
31 | #define BOOT_ENTRY_ADDR_UPPER 0 | 30 | #define BOOT_ENTRY_ADDR_UPPER 0 |
diff --git a/arch/powerpc/platforms/86xx/gef_ppc9a.c b/arch/powerpc/platforms/86xx/gef_ppc9a.c index 2efa052975e6..287f7bd17dd9 100644 --- a/arch/powerpc/platforms/86xx/gef_ppc9a.c +++ b/arch/powerpc/platforms/86xx/gef_ppc9a.c | |||
@@ -102,8 +102,8 @@ static unsigned int gef_ppc9a_get_pcb_rev(void) | |||
102 | { | 102 | { |
103 | unsigned int reg; | 103 | unsigned int reg; |
104 | 104 | ||
105 | reg = ioread32(ppc9a_regs); | 105 | reg = ioread32be(ppc9a_regs); |
106 | return (reg >> 8) & 0xff; | 106 | return (reg >> 16) & 0xff; |
107 | } | 107 | } |
108 | 108 | ||
109 | /* Return the board (software) revision */ | 109 | /* Return the board (software) revision */ |
@@ -111,8 +111,8 @@ static unsigned int gef_ppc9a_get_board_rev(void) | |||
111 | { | 111 | { |
112 | unsigned int reg; | 112 | unsigned int reg; |
113 | 113 | ||
114 | reg = ioread32(ppc9a_regs); | 114 | reg = ioread32be(ppc9a_regs); |
115 | return (reg >> 16) & 0xff; | 115 | return (reg >> 8) & 0xff; |
116 | } | 116 | } |
117 | 117 | ||
118 | /* Return the FPGA revision */ | 118 | /* Return the FPGA revision */ |
@@ -120,8 +120,26 @@ static unsigned int gef_ppc9a_get_fpga_rev(void) | |||
120 | { | 120 | { |
121 | unsigned int reg; | 121 | unsigned int reg; |
122 | 122 | ||
123 | reg = ioread32(ppc9a_regs); | 123 | reg = ioread32be(ppc9a_regs); |
124 | return (reg >> 24) & 0xf; | 124 | return reg & 0xf; |
125 | } | ||
126 | |||
127 | /* Return VME Geographical Address */ | ||
128 | static unsigned int gef_ppc9a_get_vme_geo_addr(void) | ||
129 | { | ||
130 | unsigned int reg; | ||
131 | |||
132 | reg = ioread32be(ppc9a_regs + 0x4); | ||
133 | return reg & 0x1f; | ||
134 | } | ||
135 | |||
136 | /* Return VME System Controller Status */ | ||
137 | static unsigned int gef_ppc9a_get_vme_is_syscon(void) | ||
138 | { | ||
139 | unsigned int reg; | ||
140 | |||
141 | reg = ioread32be(ppc9a_regs + 0x4); | ||
142 | return (reg >> 9) & 0x1; | ||
125 | } | 143 | } |
126 | 144 | ||
127 | static void gef_ppc9a_show_cpuinfo(struct seq_file *m) | 145 | static void gef_ppc9a_show_cpuinfo(struct seq_file *m) |
@@ -131,10 +149,15 @@ static void gef_ppc9a_show_cpuinfo(struct seq_file *m) | |||
131 | seq_printf(m, "Vendor\t\t: GE Fanuc Intelligent Platforms\n"); | 149 | seq_printf(m, "Vendor\t\t: GE Fanuc Intelligent Platforms\n"); |
132 | 150 | ||
133 | seq_printf(m, "Revision\t: %u%c\n", gef_ppc9a_get_pcb_rev(), | 151 | seq_printf(m, "Revision\t: %u%c\n", gef_ppc9a_get_pcb_rev(), |
134 | ('A' + gef_ppc9a_get_board_rev() - 1)); | 152 | ('A' + gef_ppc9a_get_board_rev())); |
135 | seq_printf(m, "FPGA Revision\t: %u\n", gef_ppc9a_get_fpga_rev()); | 153 | seq_printf(m, "FPGA Revision\t: %u\n", gef_ppc9a_get_fpga_rev()); |
136 | 154 | ||
137 | seq_printf(m, "SVR\t\t: 0x%x\n", svid); | 155 | seq_printf(m, "SVR\t\t: 0x%x\n", svid); |
156 | |||
157 | seq_printf(m, "VME geo. addr\t: %u\n", gef_ppc9a_get_vme_geo_addr()); | ||
158 | |||
159 | seq_printf(m, "VME syscon\t: %s\n", | ||
160 | gef_ppc9a_get_vme_is_syscon() ? "yes" : "no"); | ||
138 | } | 161 | } |
139 | 162 | ||
140 | static void __init gef_ppc9a_nec_fixup(struct pci_dev *pdev) | 163 | static void __init gef_ppc9a_nec_fixup(struct pci_dev *pdev) |
diff --git a/arch/powerpc/platforms/86xx/mpc86xx_smp.c b/arch/powerpc/platforms/86xx/mpc86xx_smp.c index d84bbb508ee7..eacea0e3fcc8 100644 --- a/arch/powerpc/platforms/86xx/mpc86xx_smp.c +++ b/arch/powerpc/platforms/86xx/mpc86xx_smp.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #include "mpc86xx.h" | 27 | #include "mpc86xx.h" |
28 | 28 | ||
29 | extern void __secondary_start_mpc86xx(void); | 29 | extern void __secondary_start_mpc86xx(void); |
30 | extern unsigned long __secondary_hold_acknowledge; | ||
31 | 30 | ||
32 | #define MCM_PORT_CONFIG_OFFSET 0x10 | 31 | #define MCM_PORT_CONFIG_OFFSET 0x10 |
33 | 32 | ||
diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index 61187bec7506..9efc8bda01b4 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype | |||
@@ -57,15 +57,35 @@ config E200 | |||
57 | 57 | ||
58 | endchoice | 58 | endchoice |
59 | 59 | ||
60 | config PPC_BOOK3S_64 | 60 | choice |
61 | def_bool y | 61 | prompt "Processor Type" |
62 | depends on PPC64 | 62 | depends on PPC64 |
63 | help | ||
64 | There are two families of 64 bit PowerPC chips supported. | ||
65 | The most common ones are the desktop and server CPUs | ||
66 | (POWER3, RS64, POWER4, POWER5, POWER5+, POWER6, ...) | ||
67 | |||
68 | The other are the "embedded" processors compliant with the | ||
69 | "Book 3E" variant of the architecture | ||
70 | |||
71 | config PPC_BOOK3S_64 | ||
72 | bool "Server processors" | ||
63 | select PPC_FPU | 73 | select PPC_FPU |
64 | 74 | ||
75 | config PPC_BOOK3E_64 | ||
76 | bool "Embedded processors" | ||
77 | select PPC_FPU # Make it a choice ? | ||
78 | |||
79 | endchoice | ||
80 | |||
65 | config PPC_BOOK3S | 81 | config PPC_BOOK3S |
66 | def_bool y | 82 | def_bool y |
67 | depends on PPC_BOOK3S_32 || PPC_BOOK3S_64 | 83 | depends on PPC_BOOK3S_32 || PPC_BOOK3S_64 |
68 | 84 | ||
85 | config PPC_BOOK3E | ||
86 | def_bool y | ||
87 | depends on PPC_BOOK3E_64 | ||
88 | |||
69 | config POWER4_ONLY | 89 | config POWER4_ONLY |
70 | bool "Optimize for POWER4" | 90 | bool "Optimize for POWER4" |
71 | depends on PPC64 && PPC_BOOK3S | 91 | depends on PPC64 && PPC_BOOK3S |
@@ -125,7 +145,7 @@ config 4xx | |||
125 | 145 | ||
126 | config BOOKE | 146 | config BOOKE |
127 | bool | 147 | bool |
128 | depends on E200 || E500 || 44x | 148 | depends on E200 || E500 || 44x || PPC_BOOK3E |
129 | default y | 149 | default y |
130 | 150 | ||
131 | config FSL_BOOKE | 151 | config FSL_BOOKE |
@@ -223,9 +243,17 @@ config PPC_MMU_NOHASH | |||
223 | def_bool y | 243 | def_bool y |
224 | depends on !PPC_STD_MMU | 244 | depends on !PPC_STD_MMU |
225 | 245 | ||
246 | config PPC_MMU_NOHASH_32 | ||
247 | def_bool y | ||
248 | depends on PPC_MMU_NOHASH && PPC32 | ||
249 | |||
250 | config PPC_MMU_NOHASH_64 | ||
251 | def_bool y | ||
252 | depends on PPC_MMU_NOHASH && PPC64 | ||
253 | |||
226 | config PPC_BOOK3E_MMU | 254 | config PPC_BOOK3E_MMU |
227 | def_bool y | 255 | def_bool y |
228 | depends on FSL_BOOKE | 256 | depends on FSL_BOOKE || PPC_BOOK3E |
229 | 257 | ||
230 | config PPC_MM_SLICES | 258 | config PPC_MM_SLICES |
231 | bool | 259 | bool |
@@ -257,7 +285,7 @@ config PPC_PERF_CTRS | |||
257 | This enables the powerpc-specific perf_counter back-end. | 285 | This enables the powerpc-specific perf_counter back-end. |
258 | 286 | ||
259 | config SMP | 287 | config SMP |
260 | depends on PPC_STD_MMU || FSL_BOOKE | 288 | depends on PPC_BOOK3S || PPC_BOOK3E || FSL_BOOKE |
261 | bool "Symmetric multi-processing support" | 289 | bool "Symmetric multi-processing support" |
262 | ---help--- | 290 | ---help--- |
263 | This enables support for systems with more than one CPU. If you have | 291 | This enables support for systems with more than one CPU. If you have |
diff --git a/arch/powerpc/platforms/amigaone/setup.c b/arch/powerpc/platforms/amigaone/setup.c index 443035366c12..9290a7a442d0 100644 --- a/arch/powerpc/platforms/amigaone/setup.c +++ b/arch/powerpc/platforms/amigaone/setup.c | |||
@@ -110,13 +110,16 @@ void __init amigaone_init_IRQ(void) | |||
110 | irq_set_default_host(i8259_get_host()); | 110 | irq_set_default_host(i8259_get_host()); |
111 | } | 111 | } |
112 | 112 | ||
113 | void __init amigaone_init(void) | 113 | static int __init request_isa_regions(void) |
114 | { | 114 | { |
115 | request_region(0x00, 0x20, "dma1"); | 115 | request_region(0x00, 0x20, "dma1"); |
116 | request_region(0x40, 0x20, "timer"); | 116 | request_region(0x40, 0x20, "timer"); |
117 | request_region(0x80, 0x10, "dma page reg"); | 117 | request_region(0x80, 0x10, "dma page reg"); |
118 | request_region(0xc0, 0x20, "dma2"); | 118 | request_region(0xc0, 0x20, "dma2"); |
119 | |||
120 | return 0; | ||
119 | } | 121 | } |
122 | machine_device_initcall(amigaone, request_isa_regions); | ||
120 | 123 | ||
121 | void amigaone_restart(char *cmd) | 124 | void amigaone_restart(char *cmd) |
122 | { | 125 | { |
@@ -161,7 +164,6 @@ define_machine(amigaone) { | |||
161 | .name = "AmigaOne", | 164 | .name = "AmigaOne", |
162 | .probe = amigaone_probe, | 165 | .probe = amigaone_probe, |
163 | .setup_arch = amigaone_setup_arch, | 166 | .setup_arch = amigaone_setup_arch, |
164 | .init = amigaone_init, | ||
165 | .show_cpuinfo = amigaone_show_cpuinfo, | 167 | .show_cpuinfo = amigaone_show_cpuinfo, |
166 | .init_IRQ = amigaone_init_IRQ, | 168 | .init_IRQ = amigaone_init_IRQ, |
167 | .restart = amigaone_restart, | 169 | .restart = amigaone_restart, |
diff --git a/arch/powerpc/platforms/cell/Kconfig b/arch/powerpc/platforms/cell/Kconfig index 50f17bdd3c16..48cd7d2e1b75 100644 --- a/arch/powerpc/platforms/cell/Kconfig +++ b/arch/powerpc/platforms/cell/Kconfig | |||
@@ -80,13 +80,6 @@ config SPU_FS_64K_LS | |||
80 | uses 4K pages. This can improve performances of applications | 80 | uses 4K pages. This can improve performances of applications |
81 | using multiple SPEs by lowering the TLB pressure on them. | 81 | using multiple SPEs by lowering the TLB pressure on them. |
82 | 82 | ||
83 | config SPU_TRACE | ||
84 | tristate "SPU event tracing support" | ||
85 | depends on SPU_FS && MARKERS | ||
86 | help | ||
87 | This option allows reading a trace of spu-related events through | ||
88 | the sputrace file in procfs. | ||
89 | |||
90 | config SPU_BASE | 83 | config SPU_BASE |
91 | bool | 84 | bool |
92 | default n | 85 | default n |
diff --git a/arch/powerpc/platforms/cell/celleb_setup.c b/arch/powerpc/platforms/cell/celleb_setup.c index 07c234f6b2b6..e53845579770 100644 --- a/arch/powerpc/platforms/cell/celleb_setup.c +++ b/arch/powerpc/platforms/cell/celleb_setup.c | |||
@@ -80,8 +80,7 @@ static void celleb_show_cpuinfo(struct seq_file *m) | |||
80 | 80 | ||
81 | static int __init celleb_machine_type_hack(char *ptr) | 81 | static int __init celleb_machine_type_hack(char *ptr) |
82 | { | 82 | { |
83 | strncpy(celleb_machine_type, ptr, sizeof(celleb_machine_type)); | 83 | strlcpy(celleb_machine_type, ptr, sizeof(celleb_machine_type)); |
84 | celleb_machine_type[sizeof(celleb_machine_type)-1] = 0; | ||
85 | return 0; | 84 | return 0; |
86 | } | 85 | } |
87 | 86 | ||
diff --git a/arch/powerpc/platforms/cell/smp.c b/arch/powerpc/platforms/cell/smp.c index bc97fada48c6..f774530075b7 100644 --- a/arch/powerpc/platforms/cell/smp.c +++ b/arch/powerpc/platforms/cell/smp.c | |||
@@ -58,8 +58,6 @@ | |||
58 | */ | 58 | */ |
59 | static cpumask_t of_spin_map; | 59 | static cpumask_t of_spin_map; |
60 | 60 | ||
61 | extern void generic_secondary_smp_init(unsigned long); | ||
62 | |||
63 | /** | 61 | /** |
64 | * smp_startup_cpu() - start the given cpu | 62 | * smp_startup_cpu() - start the given cpu |
65 | * | 63 | * |
diff --git a/arch/powerpc/platforms/cell/spufs/Makefile b/arch/powerpc/platforms/cell/spufs/Makefile index 99610a6361f2..b93f877ba504 100644 --- a/arch/powerpc/platforms/cell/spufs/Makefile +++ b/arch/powerpc/platforms/cell/spufs/Makefile | |||
@@ -4,7 +4,8 @@ spufs-y += inode.o file.o context.o syscalls.o coredump.o | |||
4 | spufs-y += sched.o backing_ops.o hw_ops.o run.o gang.o | 4 | spufs-y += sched.o backing_ops.o hw_ops.o run.o gang.o |
5 | spufs-y += switch.o fault.o lscsa_alloc.o | 5 | spufs-y += switch.o fault.o lscsa_alloc.o |
6 | 6 | ||
7 | obj-$(CONFIG_SPU_TRACE) += sputrace.o | 7 | # magic for the trace events |
8 | CFLAGS_sched.o := -I$(src) | ||
8 | 9 | ||
9 | # Rules to build switch.o with the help of SPU tool chain | 10 | # Rules to build switch.o with the help of SPU tool chain |
10 | SPU_CROSS := spu- | 11 | SPU_CROSS := spu- |
diff --git a/arch/powerpc/platforms/cell/spufs/context.c b/arch/powerpc/platforms/cell/spufs/context.c index db5398c0339f..0c87bcd2452a 100644 --- a/arch/powerpc/platforms/cell/spufs/context.c +++ b/arch/powerpc/platforms/cell/spufs/context.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <asm/spu.h> | 28 | #include <asm/spu.h> |
29 | #include <asm/spu_csa.h> | 29 | #include <asm/spu_csa.h> |
30 | #include "spufs.h" | 30 | #include "spufs.h" |
31 | #include "sputrace.h" | ||
31 | 32 | ||
32 | 33 | ||
33 | atomic_t nr_spu_contexts = ATOMIC_INIT(0); | 34 | atomic_t nr_spu_contexts = ATOMIC_INIT(0); |
diff --git a/arch/powerpc/platforms/cell/spufs/file.c b/arch/powerpc/platforms/cell/spufs/file.c index d6a519e6e1c1..ab8aef9bb8ea 100644 --- a/arch/powerpc/platforms/cell/spufs/file.c +++ b/arch/powerpc/platforms/cell/spufs/file.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <asm/uaccess.h> | 38 | #include <asm/uaccess.h> |
39 | 39 | ||
40 | #include "spufs.h" | 40 | #include "spufs.h" |
41 | #include "sputrace.h" | ||
41 | 42 | ||
42 | #define SPUFS_MMAP_4K (PAGE_SIZE == 0x1000) | 43 | #define SPUFS_MMAP_4K (PAGE_SIZE == 0x1000) |
43 | 44 | ||
diff --git a/arch/powerpc/platforms/cell/spufs/sched.c b/arch/powerpc/platforms/cell/spufs/sched.c index f085369301b1..bb5b77c66d05 100644 --- a/arch/powerpc/platforms/cell/spufs/sched.c +++ b/arch/powerpc/platforms/cell/spufs/sched.c | |||
@@ -47,6 +47,8 @@ | |||
47 | #include <asm/spu_csa.h> | 47 | #include <asm/spu_csa.h> |
48 | #include <asm/spu_priv1.h> | 48 | #include <asm/spu_priv1.h> |
49 | #include "spufs.h" | 49 | #include "spufs.h" |
50 | #define CREATE_TRACE_POINTS | ||
51 | #include "sputrace.h" | ||
50 | 52 | ||
51 | struct spu_prio_array { | 53 | struct spu_prio_array { |
52 | DECLARE_BITMAP(bitmap, MAX_PRIO); | 54 | DECLARE_BITMAP(bitmap, MAX_PRIO); |
diff --git a/arch/powerpc/platforms/cell/spufs/spufs.h b/arch/powerpc/platforms/cell/spufs/spufs.h index ae31573bea4a..c448bac65518 100644 --- a/arch/powerpc/platforms/cell/spufs/spufs.h +++ b/arch/powerpc/platforms/cell/spufs/spufs.h | |||
@@ -373,9 +373,4 @@ extern void spu_free_lscsa(struct spu_state *csa); | |||
373 | extern void spuctx_switch_state(struct spu_context *ctx, | 373 | extern void spuctx_switch_state(struct spu_context *ctx, |
374 | enum spu_utilization_state new_state); | 374 | enum spu_utilization_state new_state); |
375 | 375 | ||
376 | #define spu_context_trace(name, ctx, spu) \ | ||
377 | trace_mark(name, "ctx %p spu %p", ctx, spu); | ||
378 | #define spu_context_nospu_trace(name, ctx) \ | ||
379 | trace_mark(name, "ctx %p", ctx); | ||
380 | |||
381 | #endif | 376 | #endif |
diff --git a/arch/powerpc/platforms/cell/spufs/sputrace.c b/arch/powerpc/platforms/cell/spufs/sputrace.c deleted file mode 100644 index d0b1f3f4d9c8..000000000000 --- a/arch/powerpc/platforms/cell/spufs/sputrace.c +++ /dev/null | |||
@@ -1,272 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2007 IBM Deutschland Entwicklung GmbH | ||
3 | * Released under GPL v2. | ||
4 | * | ||
5 | * Partially based on net/ipv4/tcp_probe.c. | ||
6 | * | ||
7 | * Simple tracing facility for spu contexts. | ||
8 | */ | ||
9 | #include <linux/sched.h> | ||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/module.h> | ||
12 | #include <linux/marker.h> | ||
13 | #include <linux/proc_fs.h> | ||
14 | #include <linux/wait.h> | ||
15 | #include <asm/atomic.h> | ||
16 | #include <asm/uaccess.h> | ||
17 | #include "spufs.h" | ||
18 | |||
19 | struct spu_probe { | ||
20 | const char *name; | ||
21 | const char *format; | ||
22 | marker_probe_func *probe_func; | ||
23 | }; | ||
24 | |||
25 | struct sputrace { | ||
26 | ktime_t tstamp; | ||
27 | int owner_tid; /* owner */ | ||
28 | int curr_tid; | ||
29 | const char *name; | ||
30 | int number; | ||
31 | }; | ||
32 | |||
33 | static int bufsize __read_mostly = 16384; | ||
34 | MODULE_PARM_DESC(bufsize, "Log buffer size (number of records)"); | ||
35 | module_param(bufsize, int, 0); | ||
36 | |||
37 | |||
38 | static DEFINE_SPINLOCK(sputrace_lock); | ||
39 | static DECLARE_WAIT_QUEUE_HEAD(sputrace_wait); | ||
40 | static ktime_t sputrace_start; | ||
41 | static unsigned long sputrace_head, sputrace_tail; | ||
42 | static struct sputrace *sputrace_log; | ||
43 | static int sputrace_logging; | ||
44 | |||
45 | static int sputrace_used(void) | ||
46 | { | ||
47 | return (sputrace_head - sputrace_tail) % bufsize; | ||
48 | } | ||
49 | |||
50 | static inline int sputrace_avail(void) | ||
51 | { | ||
52 | return bufsize - sputrace_used(); | ||
53 | } | ||
54 | |||
55 | static int sputrace_sprint(char *tbuf, int n) | ||
56 | { | ||
57 | const struct sputrace *t = sputrace_log + sputrace_tail % bufsize; | ||
58 | struct timespec tv = | ||
59 | ktime_to_timespec(ktime_sub(t->tstamp, sputrace_start)); | ||
60 | |||
61 | return snprintf(tbuf, n, | ||
62 | "[%lu.%09lu] %d: %s (ctxthread = %d, spu = %d)\n", | ||
63 | (unsigned long) tv.tv_sec, | ||
64 | (unsigned long) tv.tv_nsec, | ||
65 | t->curr_tid, | ||
66 | t->name, | ||
67 | t->owner_tid, | ||
68 | t->number); | ||
69 | } | ||
70 | |||
71 | static ssize_t sputrace_read(struct file *file, char __user *buf, | ||
72 | size_t len, loff_t *ppos) | ||
73 | { | ||
74 | int error = 0, cnt = 0; | ||
75 | |||
76 | if (!buf || len < 0) | ||
77 | return -EINVAL; | ||
78 | |||
79 | while (cnt < len) { | ||
80 | char tbuf[128]; | ||
81 | int width; | ||
82 | |||
83 | /* If we have data ready to return, don't block waiting | ||
84 | * for more */ | ||
85 | if (cnt > 0 && sputrace_used() == 0) | ||
86 | break; | ||
87 | |||
88 | error = wait_event_interruptible(sputrace_wait, | ||
89 | sputrace_used() > 0); | ||
90 | if (error) | ||
91 | break; | ||
92 | |||
93 | spin_lock(&sputrace_lock); | ||
94 | if (sputrace_head == sputrace_tail) { | ||
95 | spin_unlock(&sputrace_lock); | ||
96 | continue; | ||
97 | } | ||
98 | |||
99 | width = sputrace_sprint(tbuf, sizeof(tbuf)); | ||
100 | if (width < len) | ||
101 | sputrace_tail = (sputrace_tail + 1) % bufsize; | ||
102 | spin_unlock(&sputrace_lock); | ||
103 | |||
104 | if (width >= len) | ||
105 | break; | ||
106 | |||
107 | error = copy_to_user(buf + cnt, tbuf, width); | ||
108 | if (error) | ||
109 | break; | ||
110 | cnt += width; | ||
111 | } | ||
112 | |||
113 | return cnt == 0 ? error : cnt; | ||
114 | } | ||
115 | |||
116 | static int sputrace_open(struct inode *inode, struct file *file) | ||
117 | { | ||
118 | int rc; | ||
119 | |||
120 | spin_lock(&sputrace_lock); | ||
121 | if (sputrace_logging) { | ||
122 | rc = -EBUSY; | ||
123 | goto out; | ||
124 | } | ||
125 | |||
126 | sputrace_logging = 1; | ||
127 | sputrace_head = sputrace_tail = 0; | ||
128 | sputrace_start = ktime_get(); | ||
129 | rc = 0; | ||
130 | |||
131 | out: | ||
132 | spin_unlock(&sputrace_lock); | ||
133 | return rc; | ||
134 | } | ||
135 | |||
136 | static int sputrace_release(struct inode *inode, struct file *file) | ||
137 | { | ||
138 | spin_lock(&sputrace_lock); | ||
139 | sputrace_logging = 0; | ||
140 | spin_unlock(&sputrace_lock); | ||
141 | return 0; | ||
142 | } | ||
143 | |||
144 | static const struct file_operations sputrace_fops = { | ||
145 | .owner = THIS_MODULE, | ||
146 | .open = sputrace_open, | ||
147 | .read = sputrace_read, | ||
148 | .release = sputrace_release, | ||
149 | }; | ||
150 | |||
151 | static void sputrace_log_item(const char *name, struct spu_context *ctx, | ||
152 | struct spu *spu) | ||
153 | { | ||
154 | spin_lock(&sputrace_lock); | ||
155 | |||
156 | if (!sputrace_logging) { | ||
157 | spin_unlock(&sputrace_lock); | ||
158 | return; | ||
159 | } | ||
160 | |||
161 | if (sputrace_avail() > 1) { | ||
162 | struct sputrace *t = sputrace_log + sputrace_head; | ||
163 | |||
164 | t->tstamp = ktime_get(); | ||
165 | t->owner_tid = ctx->tid; | ||
166 | t->name = name; | ||
167 | t->curr_tid = current->pid; | ||
168 | t->number = spu ? spu->number : -1; | ||
169 | |||
170 | sputrace_head = (sputrace_head + 1) % bufsize; | ||
171 | } else { | ||
172 | printk(KERN_WARNING | ||
173 | "sputrace: lost samples due to full buffer.\n"); | ||
174 | } | ||
175 | spin_unlock(&sputrace_lock); | ||
176 | |||
177 | wake_up(&sputrace_wait); | ||
178 | } | ||
179 | |||
180 | static void spu_context_event(void *probe_private, void *call_data, | ||
181 | const char *format, va_list *args) | ||
182 | { | ||
183 | struct spu_probe *p = probe_private; | ||
184 | struct spu_context *ctx; | ||
185 | struct spu *spu; | ||
186 | |||
187 | ctx = va_arg(*args, struct spu_context *); | ||
188 | spu = va_arg(*args, struct spu *); | ||
189 | |||
190 | sputrace_log_item(p->name, ctx, spu); | ||
191 | } | ||
192 | |||
193 | static void spu_context_nospu_event(void *probe_private, void *call_data, | ||
194 | const char *format, va_list *args) | ||
195 | { | ||
196 | struct spu_probe *p = probe_private; | ||
197 | struct spu_context *ctx; | ||
198 | |||
199 | ctx = va_arg(*args, struct spu_context *); | ||
200 | |||
201 | sputrace_log_item(p->name, ctx, NULL); | ||
202 | } | ||
203 | |||
204 | struct spu_probe spu_probes[] = { | ||
205 | { "spu_bind_context__enter", "ctx %p spu %p", spu_context_event }, | ||
206 | { "spu_unbind_context__enter", "ctx %p spu %p", spu_context_event }, | ||
207 | { "spu_get_idle__enter", "ctx %p", spu_context_nospu_event }, | ||
208 | { "spu_get_idle__found", "ctx %p spu %p", spu_context_event }, | ||
209 | { "spu_get_idle__not_found", "ctx %p", spu_context_nospu_event }, | ||
210 | { "spu_find_victim__enter", "ctx %p", spu_context_nospu_event }, | ||
211 | { "spusched_tick__preempt", "ctx %p spu %p", spu_context_event }, | ||
212 | { "spusched_tick__newslice", "ctx %p", spu_context_nospu_event }, | ||
213 | { "spu_yield__enter", "ctx %p", spu_context_nospu_event }, | ||
214 | { "spu_deactivate__enter", "ctx %p", spu_context_nospu_event }, | ||
215 | { "__spu_deactivate__unload", "ctx %p spu %p", spu_context_event }, | ||
216 | { "spufs_ps_fault__enter", "ctx %p", spu_context_nospu_event }, | ||
217 | { "spufs_ps_fault__sleep", "ctx %p", spu_context_nospu_event }, | ||
218 | { "spufs_ps_fault__wake", "ctx %p spu %p", spu_context_event }, | ||
219 | { "spufs_ps_fault__insert", "ctx %p spu %p", spu_context_event }, | ||
220 | { "spu_acquire_saved__enter", "ctx %p", spu_context_nospu_event }, | ||
221 | { "destroy_spu_context__enter", "ctx %p", spu_context_nospu_event }, | ||
222 | { "spufs_stop_callback__enter", "ctx %p spu %p", spu_context_event }, | ||
223 | }; | ||
224 | |||
225 | static int __init sputrace_init(void) | ||
226 | { | ||
227 | struct proc_dir_entry *entry; | ||
228 | int i, error = -ENOMEM; | ||
229 | |||
230 | sputrace_log = kcalloc(bufsize, sizeof(struct sputrace), GFP_KERNEL); | ||
231 | if (!sputrace_log) | ||
232 | goto out; | ||
233 | |||
234 | entry = proc_create("sputrace", S_IRUSR, NULL, &sputrace_fops); | ||
235 | if (!entry) | ||
236 | goto out_free_log; | ||
237 | |||
238 | for (i = 0; i < ARRAY_SIZE(spu_probes); i++) { | ||
239 | struct spu_probe *p = &spu_probes[i]; | ||
240 | |||
241 | error = marker_probe_register(p->name, p->format, | ||
242 | p->probe_func, p); | ||
243 | if (error) | ||
244 | printk(KERN_INFO "Unable to register probe %s\n", | ||
245 | p->name); | ||
246 | } | ||
247 | |||
248 | return 0; | ||
249 | |||
250 | out_free_log: | ||
251 | kfree(sputrace_log); | ||
252 | out: | ||
253 | return -ENOMEM; | ||
254 | } | ||
255 | |||
256 | static void __exit sputrace_exit(void) | ||
257 | { | ||
258 | int i; | ||
259 | |||
260 | for (i = 0; i < ARRAY_SIZE(spu_probes); i++) | ||
261 | marker_probe_unregister(spu_probes[i].name, | ||
262 | spu_probes[i].probe_func, &spu_probes[i]); | ||
263 | |||
264 | remove_proc_entry("sputrace", NULL); | ||
265 | kfree(sputrace_log); | ||
266 | marker_synchronize_unregister(); | ||
267 | } | ||
268 | |||
269 | module_init(sputrace_init); | ||
270 | module_exit(sputrace_exit); | ||
271 | |||
272 | MODULE_LICENSE("GPL"); | ||
diff --git a/arch/powerpc/platforms/cell/spufs/sputrace.h b/arch/powerpc/platforms/cell/spufs/sputrace.h new file mode 100644 index 000000000000..db2656aa4103 --- /dev/null +++ b/arch/powerpc/platforms/cell/spufs/sputrace.h | |||
@@ -0,0 +1,39 @@ | |||
1 | #if !defined(_TRACE_SPUFS_H) || defined(TRACE_HEADER_MULTI_READ) | ||
2 | #define _TRACE_SPUFS_H | ||
3 | |||
4 | #include <linux/tracepoint.h> | ||
5 | |||
6 | #undef TRACE_SYSTEM | ||
7 | #define TRACE_SYSTEM spufs | ||
8 | |||
9 | TRACE_EVENT(spufs_context, | ||
10 | TP_PROTO(struct spu_context *ctx, struct spu *spu, const char *name), | ||
11 | TP_ARGS(ctx, spu, name), | ||
12 | |||
13 | TP_STRUCT__entry( | ||
14 | __field(const char *, name) | ||
15 | __field(int, owner_tid) | ||
16 | __field(int, number) | ||
17 | ), | ||
18 | |||
19 | TP_fast_assign( | ||
20 | __entry->name = name; | ||
21 | __entry->owner_tid = ctx->tid; | ||
22 | __entry->number = spu ? spu->number : -1; | ||
23 | ), | ||
24 | |||
25 | TP_printk("%s (ctxthread = %d, spu = %d)", | ||
26 | __entry->name, __entry->owner_tid, __entry->number) | ||
27 | ); | ||
28 | |||
29 | #define spu_context_trace(name, ctx, spu) \ | ||
30 | trace_spufs_context(ctx, spu, __stringify(name)) | ||
31 | #define spu_context_nospu_trace(name, ctx) \ | ||
32 | trace_spufs_context(ctx, NULL, __stringify(name)) | ||
33 | |||
34 | #endif /* _TRACE_SPUFS_H */ | ||
35 | |||
36 | #undef TRACE_INCLUDE_PATH | ||
37 | #define TRACE_INCLUDE_PATH . | ||
38 | #define TRACE_INCLUDE_FILE sputrace | ||
39 | #include <trace/define_trace.h> | ||
diff --git a/arch/powerpc/platforms/iseries/exception.S b/arch/powerpc/platforms/iseries/exception.S index 2f581521eb9b..5369653dcf6a 100644 --- a/arch/powerpc/platforms/iseries/exception.S +++ b/arch/powerpc/platforms/iseries/exception.S | |||
@@ -47,7 +47,7 @@ system_reset_iSeries: | |||
47 | LOAD_REG_ADDR(r13, paca) | 47 | LOAD_REG_ADDR(r13, paca) |
48 | mulli r0,r23,PACA_SIZE | 48 | mulli r0,r23,PACA_SIZE |
49 | add r13,r13,r0 | 49 | add r13,r13,r0 |
50 | mtspr SPRN_SPRG3,r13 /* Save it away for the future */ | 50 | mtspr SPRN_SPRG_PACA,r13 /* Save it away for the future */ |
51 | mfmsr r24 | 51 | mfmsr r24 |
52 | ori r24,r24,MSR_RI | 52 | ori r24,r24,MSR_RI |
53 | mtmsrd r24 /* RI on */ | 53 | mtmsrd r24 /* RI on */ |
@@ -116,7 +116,7 @@ iSeries_secondary_smp_loop: | |||
116 | #endif /* CONFIG_SMP */ | 116 | #endif /* CONFIG_SMP */ |
117 | li r0,-1 /* r0=-1 indicates a Hypervisor call */ | 117 | li r0,-1 /* r0=-1 indicates a Hypervisor call */ |
118 | sc /* Invoke the hypervisor via a system call */ | 118 | sc /* Invoke the hypervisor via a system call */ |
119 | mfspr r13,SPRN_SPRG3 /* Put r13 back ???? */ | 119 | mfspr r13,SPRN_SPRG_PACA /* Put r13 back ???? */ |
120 | b 2b /* If SMP not configured, secondaries | 120 | b 2b /* If SMP not configured, secondaries |
121 | * loop forever */ | 121 | * loop forever */ |
122 | 122 | ||
@@ -126,34 +126,45 @@ iSeries_secondary_smp_loop: | |||
126 | 126 | ||
127 | .globl data_access_iSeries | 127 | .globl data_access_iSeries |
128 | data_access_iSeries: | 128 | data_access_iSeries: |
129 | mtspr SPRN_SPRG1,r13 | 129 | mtspr SPRN_SPRG_SCRATCH0,r13 |
130 | BEGIN_FTR_SECTION | 130 | BEGIN_FTR_SECTION |
131 | mtspr SPRN_SPRG2,r12 | 131 | mfspr r13,SPRN_SPRG_PACA |
132 | mfspr r13,SPRN_DAR | 132 | std r9,PACA_EXSLB+EX_R9(r13) |
133 | mfspr r12,SPRN_DSISR | 133 | std r10,PACA_EXSLB+EX_R10(r13) |
134 | srdi r13,r13,60 | 134 | mfspr r10,SPRN_DAR |
135 | rlwimi r13,r12,16,0x20 | 135 | mfspr r9,SPRN_DSISR |
136 | mfcr r12 | 136 | srdi r10,r10,60 |
137 | cmpwi r13,0x2c | 137 | rlwimi r10,r9,16,0x20 |
138 | mfcr r9 | ||
139 | cmpwi r10,0x2c | ||
138 | beq .do_stab_bolted_iSeries | 140 | beq .do_stab_bolted_iSeries |
139 | mtcrf 0x80,r12 | 141 | ld r10,PACA_EXSLB+EX_R10(r13) |
140 | mfspr r12,SPRN_SPRG2 | 142 | std r11,PACA_EXGEN+EX_R11(r13) |
141 | END_FTR_SECTION_IFCLR(CPU_FTR_SLB) | 143 | ld r11,PACA_EXSLB+EX_R9(r13) |
144 | std r12,PACA_EXGEN+EX_R12(r13) | ||
145 | mfspr r12,SPRN_SPRG_SCRATCH0 | ||
146 | std r10,PACA_EXGEN+EX_R10(r13) | ||
147 | std r11,PACA_EXGEN+EX_R9(r13) | ||
148 | std r12,PACA_EXGEN+EX_R13(r13) | ||
149 | EXCEPTION_PROLOG_ISERIES_1 | ||
150 | FTR_SECTION_ELSE | ||
142 | EXCEPTION_PROLOG_1(PACA_EXGEN) | 151 | EXCEPTION_PROLOG_1(PACA_EXGEN) |
143 | EXCEPTION_PROLOG_ISERIES_1 | 152 | EXCEPTION_PROLOG_ISERIES_1 |
153 | ALT_FTR_SECTION_END_IFCLR(CPU_FTR_SLB) | ||
144 | b data_access_common | 154 | b data_access_common |
145 | 155 | ||
146 | .do_stab_bolted_iSeries: | 156 | .do_stab_bolted_iSeries: |
147 | mtcrf 0x80,r12 | 157 | std r11,PACA_EXSLB+EX_R11(r13) |
148 | mfspr r12,SPRN_SPRG2 | 158 | std r12,PACA_EXSLB+EX_R12(r13) |
149 | EXCEPTION_PROLOG_1(PACA_EXSLB) | 159 | mfspr r10,SPRN_SPRG_SCRATCH0 |
160 | std r10,PACA_EXSLB+EX_R13(r13) | ||
150 | EXCEPTION_PROLOG_ISERIES_1 | 161 | EXCEPTION_PROLOG_ISERIES_1 |
151 | b .do_stab_bolted | 162 | b .do_stab_bolted |
152 | 163 | ||
153 | .globl data_access_slb_iSeries | 164 | .globl data_access_slb_iSeries |
154 | data_access_slb_iSeries: | 165 | data_access_slb_iSeries: |
155 | mtspr SPRN_SPRG1,r13 /* save r13 */ | 166 | mtspr SPRN_SPRG_SCRATCH0,r13 /* save r13 */ |
156 | mfspr r13,SPRN_SPRG3 /* get paca address into r13 */ | 167 | mfspr r13,SPRN_SPRG_PACA /* get paca address into r13 */ |
157 | std r3,PACA_EXSLB+EX_R3(r13) | 168 | std r3,PACA_EXSLB+EX_R3(r13) |
158 | mfspr r3,SPRN_DAR | 169 | mfspr r3,SPRN_DAR |
159 | std r9,PACA_EXSLB+EX_R9(r13) | 170 | std r9,PACA_EXSLB+EX_R9(r13) |
@@ -165,7 +176,7 @@ data_access_slb_iSeries: | |||
165 | std r10,PACA_EXSLB+EX_R10(r13) | 176 | std r10,PACA_EXSLB+EX_R10(r13) |
166 | std r11,PACA_EXSLB+EX_R11(r13) | 177 | std r11,PACA_EXSLB+EX_R11(r13) |
167 | std r12,PACA_EXSLB+EX_R12(r13) | 178 | std r12,PACA_EXSLB+EX_R12(r13) |
168 | mfspr r10,SPRN_SPRG1 | 179 | mfspr r10,SPRN_SPRG_SCRATCH0 |
169 | std r10,PACA_EXSLB+EX_R13(r13) | 180 | std r10,PACA_EXSLB+EX_R13(r13) |
170 | ld r12,PACALPPACAPTR(r13) | 181 | ld r12,PACALPPACAPTR(r13) |
171 | ld r12,LPPACASRR1(r12) | 182 | ld r12,LPPACASRR1(r12) |
@@ -175,8 +186,8 @@ data_access_slb_iSeries: | |||
175 | 186 | ||
176 | .globl instruction_access_slb_iSeries | 187 | .globl instruction_access_slb_iSeries |
177 | instruction_access_slb_iSeries: | 188 | instruction_access_slb_iSeries: |
178 | mtspr SPRN_SPRG1,r13 /* save r13 */ | 189 | mtspr SPRN_SPRG_SCRATCH0,r13 /* save r13 */ |
179 | mfspr r13,SPRN_SPRG3 /* get paca address into r13 */ | 190 | mfspr r13,SPRN_SPRG_PACA /* get paca address into r13 */ |
180 | std r3,PACA_EXSLB+EX_R3(r13) | 191 | std r3,PACA_EXSLB+EX_R3(r13) |
181 | ld r3,PACALPPACAPTR(r13) | 192 | ld r3,PACALPPACAPTR(r13) |
182 | ld r3,LPPACASRR0(r3) /* get SRR0 value */ | 193 | ld r3,LPPACASRR0(r3) /* get SRR0 value */ |
@@ -189,7 +200,7 @@ instruction_access_slb_iSeries: | |||
189 | std r10,PACA_EXSLB+EX_R10(r13) | 200 | std r10,PACA_EXSLB+EX_R10(r13) |
190 | std r11,PACA_EXSLB+EX_R11(r13) | 201 | std r11,PACA_EXSLB+EX_R11(r13) |
191 | std r12,PACA_EXSLB+EX_R12(r13) | 202 | std r12,PACA_EXSLB+EX_R12(r13) |
192 | mfspr r10,SPRN_SPRG1 | 203 | mfspr r10,SPRN_SPRG_SCRATCH0 |
193 | std r10,PACA_EXSLB+EX_R13(r13) | 204 | std r10,PACA_EXSLB+EX_R13(r13) |
194 | ld r12,PACALPPACAPTR(r13) | 205 | ld r12,PACALPPACAPTR(r13) |
195 | ld r12,LPPACASRR1(r12) | 206 | ld r12,LPPACASRR1(r12) |
@@ -200,7 +211,7 @@ slb_miss_user_iseries: | |||
200 | std r10,PACA_EXGEN+EX_R10(r13) | 211 | std r10,PACA_EXGEN+EX_R10(r13) |
201 | std r11,PACA_EXGEN+EX_R11(r13) | 212 | std r11,PACA_EXGEN+EX_R11(r13) |
202 | std r12,PACA_EXGEN+EX_R12(r13) | 213 | std r12,PACA_EXGEN+EX_R12(r13) |
203 | mfspr r10,SPRG1 | 214 | mfspr r10,SPRG_SCRATCH0 |
204 | ld r11,PACA_EXSLB+EX_R9(r13) | 215 | ld r11,PACA_EXSLB+EX_R9(r13) |
205 | ld r12,PACA_EXSLB+EX_R3(r13) | 216 | ld r12,PACA_EXSLB+EX_R3(r13) |
206 | std r10,PACA_EXGEN+EX_R13(r13) | 217 | std r10,PACA_EXGEN+EX_R13(r13) |
@@ -221,7 +232,7 @@ slb_miss_user_iseries: | |||
221 | .globl system_call_iSeries | 232 | .globl system_call_iSeries |
222 | system_call_iSeries: | 233 | system_call_iSeries: |
223 | mr r9,r13 | 234 | mr r9,r13 |
224 | mfspr r13,SPRN_SPRG3 | 235 | mfspr r13,SPRN_SPRG_PACA |
225 | EXCEPTION_PROLOG_ISERIES_1 | 236 | EXCEPTION_PROLOG_ISERIES_1 |
226 | b system_call_common | 237 | b system_call_common |
227 | 238 | ||
diff --git a/arch/powerpc/platforms/iseries/exception.h b/arch/powerpc/platforms/iseries/exception.h index ced45a8fa1aa..bae3fba5ad8e 100644 --- a/arch/powerpc/platforms/iseries/exception.h +++ b/arch/powerpc/platforms/iseries/exception.h | |||
@@ -24,7 +24,7 @@ | |||
24 | * as published by the Free Software Foundation; either version | 24 | * as published by the Free Software Foundation; either version |
25 | * 2 of the License, or (at your option) any later version. | 25 | * 2 of the License, or (at your option) any later version. |
26 | */ | 26 | */ |
27 | #include <asm/exception.h> | 27 | #include <asm/exception-64s.h> |
28 | 28 | ||
29 | #define EXCEPTION_PROLOG_ISERIES_1 \ | 29 | #define EXCEPTION_PROLOG_ISERIES_1 \ |
30 | mfmsr r10; \ | 30 | mfmsr r10; \ |
@@ -38,7 +38,7 @@ | |||
38 | .globl label##_iSeries; \ | 38 | .globl label##_iSeries; \ |
39 | label##_iSeries: \ | 39 | label##_iSeries: \ |
40 | HMT_MEDIUM; \ | 40 | HMT_MEDIUM; \ |
41 | mtspr SPRN_SPRG1,r13; /* save r13 */ \ | 41 | mtspr SPRN_SPRG_SCRATCH0,r13; /* save r13 */ \ |
42 | EXCEPTION_PROLOG_1(area); \ | 42 | EXCEPTION_PROLOG_1(area); \ |
43 | EXCEPTION_PROLOG_ISERIES_1; \ | 43 | EXCEPTION_PROLOG_ISERIES_1; \ |
44 | b label##_common | 44 | b label##_common |
@@ -47,7 +47,7 @@ label##_iSeries: \ | |||
47 | .globl label##_iSeries; \ | 47 | .globl label##_iSeries; \ |
48 | label##_iSeries: \ | 48 | label##_iSeries: \ |
49 | HMT_MEDIUM; \ | 49 | HMT_MEDIUM; \ |
50 | mtspr SPRN_SPRG1,r13; /* save r13 */ \ | 50 | mtspr SPRN_SPRG_SCRATCH0,r13; /* save r13 */ \ |
51 | EXCEPTION_PROLOG_1(PACA_EXGEN); \ | 51 | EXCEPTION_PROLOG_1(PACA_EXGEN); \ |
52 | lbz r10,PACASOFTIRQEN(r13); \ | 52 | lbz r10,PACASOFTIRQEN(r13); \ |
53 | cmpwi 0,r10,0; \ | 53 | cmpwi 0,r10,0; \ |
diff --git a/arch/powerpc/platforms/pasemi/idle.c b/arch/powerpc/platforms/pasemi/idle.c index 43911d8b0206..75b296bc51af 100644 --- a/arch/powerpc/platforms/pasemi/idle.c +++ b/arch/powerpc/platforms/pasemi/idle.c | |||
@@ -90,7 +90,7 @@ machine_late_initcall(pasemi, pasemi_idle_init); | |||
90 | static int __init idle_param(char *p) | 90 | static int __init idle_param(char *p) |
91 | { | 91 | { |
92 | int i; | 92 | int i; |
93 | for (i = 0; i < sizeof(modes)/sizeof(struct sleep_mode); i++) { | 93 | for (i = 0; i < ARRAY_SIZE(modes); i++) { |
94 | if (!strcmp(modes[i].name, p)) { | 94 | if (!strcmp(modes[i].name, p)) { |
95 | current_mode = i; | 95 | current_mode = i; |
96 | break; | 96 | break; |
diff --git a/arch/powerpc/platforms/powermac/feature.c b/arch/powerpc/platforms/powermac/feature.c index e6c0040ee797..fbc9bbd74dbd 100644 --- a/arch/powerpc/platforms/powermac/feature.c +++ b/arch/powerpc/platforms/powermac/feature.c | |||
@@ -2419,13 +2419,13 @@ static int __init probe_motherboard(void) | |||
2419 | dt = of_find_node_by_name(NULL, "device-tree"); | 2419 | dt = of_find_node_by_name(NULL, "device-tree"); |
2420 | if (dt != NULL) | 2420 | if (dt != NULL) |
2421 | model = of_get_property(dt, "model", NULL); | 2421 | model = of_get_property(dt, "model", NULL); |
2422 | for(i=0; model && i<(sizeof(pmac_mb_defs)/sizeof(struct pmac_mb_def)); i++) { | 2422 | for(i=0; model && i<ARRAY_SIZE(pmac_mb_defs); i++) { |
2423 | if (strcmp(model, pmac_mb_defs[i].model_string) == 0) { | 2423 | if (strcmp(model, pmac_mb_defs[i].model_string) == 0) { |
2424 | pmac_mb = pmac_mb_defs[i]; | 2424 | pmac_mb = pmac_mb_defs[i]; |
2425 | goto found; | 2425 | goto found; |
2426 | } | 2426 | } |
2427 | } | 2427 | } |
2428 | for(i=0; i<(sizeof(pmac_mb_defs)/sizeof(struct pmac_mb_def)); i++) { | 2428 | for(i=0; i<ARRAY_SIZE(pmac_mb_defs); i++) { |
2429 | if (machine_is_compatible(pmac_mb_defs[i].model_string)) { | 2429 | if (machine_is_compatible(pmac_mb_defs[i].model_string)) { |
2430 | pmac_mb = pmac_mb_defs[i]; | 2430 | pmac_mb = pmac_mb_defs[i]; |
2431 | goto found; | 2431 | goto found; |
@@ -2589,9 +2589,16 @@ static void __init probe_uninorth(void) | |||
2589 | if (address == 0) | 2589 | if (address == 0) |
2590 | return; | 2590 | return; |
2591 | uninorth_base = ioremap(address, 0x40000); | 2591 | uninorth_base = ioremap(address, 0x40000); |
2592 | if (uninorth_base == NULL) | ||
2593 | return; | ||
2592 | uninorth_rev = in_be32(UN_REG(UNI_N_VERSION)); | 2594 | uninorth_rev = in_be32(UN_REG(UNI_N_VERSION)); |
2593 | if (uninorth_maj == 3 || uninorth_maj == 4) | 2595 | if (uninorth_maj == 3 || uninorth_maj == 4) { |
2594 | u3_ht_base = ioremap(address + U3_HT_CONFIG_BASE, 0x1000); | 2596 | u3_ht_base = ioremap(address + U3_HT_CONFIG_BASE, 0x1000); |
2597 | if (u3_ht_base == NULL) { | ||
2598 | iounmap(uninorth_base); | ||
2599 | return; | ||
2600 | } | ||
2601 | } | ||
2595 | 2602 | ||
2596 | printk(KERN_INFO "Found %s memory controller & host bridge" | 2603 | printk(KERN_INFO "Found %s memory controller & host bridge" |
2597 | " @ 0x%08x revision: 0x%02x\n", uninorth_maj == 3 ? "U3" : | 2604 | " @ 0x%08x revision: 0x%02x\n", uninorth_maj == 3 ? "U3" : |
diff --git a/arch/powerpc/platforms/powermac/smp.c b/arch/powerpc/platforms/powermac/smp.c index 6d4da7b46b41..937a38e73178 100644 --- a/arch/powerpc/platforms/powermac/smp.c +++ b/arch/powerpc/platforms/powermac/smp.c | |||
@@ -408,7 +408,7 @@ static void __init smp_psurge_setup_cpu(int cpu_nr) | |||
408 | /* reset the entry point so if we get another intr we won't | 408 | /* reset the entry point so if we get another intr we won't |
409 | * try to startup again */ | 409 | * try to startup again */ |
410 | out_be32(psurge_start, 0x100); | 410 | out_be32(psurge_start, 0x100); |
411 | if (setup_irq(30, &psurge_irqaction)) | 411 | if (setup_irq(irq_create_mapping(NULL, 30), &psurge_irqaction)) |
412 | printk(KERN_ERR "Couldn't get primary IPI interrupt"); | 412 | printk(KERN_ERR "Couldn't get primary IPI interrupt"); |
413 | } | 413 | } |
414 | 414 | ||
diff --git a/arch/powerpc/platforms/ps3/mm.c b/arch/powerpc/platforms/ps3/mm.c index 846eb8b57fd1..189a25b80735 100644 --- a/arch/powerpc/platforms/ps3/mm.c +++ b/arch/powerpc/platforms/ps3/mm.c | |||
@@ -23,8 +23,8 @@ | |||
23 | #include <linux/memory_hotplug.h> | 23 | #include <linux/memory_hotplug.h> |
24 | #include <linux/lmb.h> | 24 | #include <linux/lmb.h> |
25 | 25 | ||
26 | #include <asm/cell-regs.h> | ||
26 | #include <asm/firmware.h> | 27 | #include <asm/firmware.h> |
27 | #include <asm/iommu.h> | ||
28 | #include <asm/prom.h> | 28 | #include <asm/prom.h> |
29 | #include <asm/udbg.h> | 29 | #include <asm/udbg.h> |
30 | #include <asm/lv1call.h> | 30 | #include <asm/lv1call.h> |
diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c index 3f763c5284ac..676f989ed4e4 100644 --- a/arch/powerpc/platforms/ps3/system-bus.c +++ b/arch/powerpc/platforms/ps3/system-bus.c | |||
@@ -27,7 +27,7 @@ | |||
27 | #include <asm/udbg.h> | 27 | #include <asm/udbg.h> |
28 | #include <asm/lv1call.h> | 28 | #include <asm/lv1call.h> |
29 | #include <asm/firmware.h> | 29 | #include <asm/firmware.h> |
30 | #include <asm/iommu.h> | 30 | #include <asm/cell-regs.h> |
31 | 31 | ||
32 | #include "platform.h" | 32 | #include "platform.h" |
33 | 33 | ||
diff --git a/arch/powerpc/platforms/pseries/smp.c b/arch/powerpc/platforms/pseries/smp.c index 1f8f6cfb94f7..440000cc7130 100644 --- a/arch/powerpc/platforms/pseries/smp.c +++ b/arch/powerpc/platforms/pseries/smp.c | |||
@@ -56,8 +56,6 @@ | |||
56 | */ | 56 | */ |
57 | static cpumask_t of_spin_map; | 57 | static cpumask_t of_spin_map; |
58 | 58 | ||
59 | extern void generic_secondary_smp_init(unsigned long); | ||
60 | |||
61 | /** | 59 | /** |
62 | * smp_startup_cpu() - start the given cpu | 60 | * smp_startup_cpu() - start the given cpu |
63 | * | 61 | * |
diff --git a/arch/powerpc/sysdev/fsl_rio.c b/arch/powerpc/sysdev/fsl_rio.c index cbb3bed75d3c..757a83fe5e59 100644 --- a/arch/powerpc/sysdev/fsl_rio.c +++ b/arch/powerpc/sysdev/fsl_rio.c | |||
@@ -1057,6 +1057,10 @@ int fsl_rio_setup(struct of_device *dev) | |||
1057 | law_start, law_size); | 1057 | law_start, law_size); |
1058 | 1058 | ||
1059 | ops = kmalloc(sizeof(struct rio_ops), GFP_KERNEL); | 1059 | ops = kmalloc(sizeof(struct rio_ops), GFP_KERNEL); |
1060 | if (!ops) { | ||
1061 | rc = -ENOMEM; | ||
1062 | goto err_ops; | ||
1063 | } | ||
1060 | ops->lcread = fsl_local_config_read; | 1064 | ops->lcread = fsl_local_config_read; |
1061 | ops->lcwrite = fsl_local_config_write; | 1065 | ops->lcwrite = fsl_local_config_write; |
1062 | ops->cread = fsl_rio_config_read; | 1066 | ops->cread = fsl_rio_config_read; |
@@ -1064,6 +1068,10 @@ int fsl_rio_setup(struct of_device *dev) | |||
1064 | ops->dsend = fsl_rio_doorbell_send; | 1068 | ops->dsend = fsl_rio_doorbell_send; |
1065 | 1069 | ||
1066 | port = kzalloc(sizeof(struct rio_mport), GFP_KERNEL); | 1070 | port = kzalloc(sizeof(struct rio_mport), GFP_KERNEL); |
1071 | if (!port) { | ||
1072 | rc = -ENOMEM; | ||
1073 | goto err_port; | ||
1074 | } | ||
1067 | port->id = 0; | 1075 | port->id = 0; |
1068 | port->index = 0; | 1076 | port->index = 0; |
1069 | 1077 | ||
@@ -1071,7 +1079,7 @@ int fsl_rio_setup(struct of_device *dev) | |||
1071 | if (!priv) { | 1079 | if (!priv) { |
1072 | printk(KERN_ERR "Can't alloc memory for 'priv'\n"); | 1080 | printk(KERN_ERR "Can't alloc memory for 'priv'\n"); |
1073 | rc = -ENOMEM; | 1081 | rc = -ENOMEM; |
1074 | goto err; | 1082 | goto err_priv; |
1075 | } | 1083 | } |
1076 | 1084 | ||
1077 | INIT_LIST_HEAD(&port->dbells); | 1085 | INIT_LIST_HEAD(&port->dbells); |
@@ -1169,11 +1177,13 @@ int fsl_rio_setup(struct of_device *dev) | |||
1169 | 1177 | ||
1170 | return 0; | 1178 | return 0; |
1171 | err: | 1179 | err: |
1172 | if (priv) | 1180 | iounmap(priv->regs_win); |
1173 | iounmap(priv->regs_win); | ||
1174 | kfree(ops); | ||
1175 | kfree(priv); | 1181 | kfree(priv); |
1182 | err_priv: | ||
1176 | kfree(port); | 1183 | kfree(port); |
1184 | err_port: | ||
1185 | kfree(ops); | ||
1186 | err_ops: | ||
1177 | return rc; | 1187 | return rc; |
1178 | } | 1188 | } |
1179 | 1189 | ||
diff --git a/arch/powerpc/sysdev/ipic.c b/arch/powerpc/sysdev/ipic.c index 69e2630c9062..cb7689c4bfbd 100644 --- a/arch/powerpc/sysdev/ipic.c +++ b/arch/powerpc/sysdev/ipic.c | |||
@@ -735,8 +735,10 @@ struct ipic * __init ipic_init(struct device_node *node, unsigned int flags) | |||
735 | ipic->irqhost = irq_alloc_host(node, IRQ_HOST_MAP_LINEAR, | 735 | ipic->irqhost = irq_alloc_host(node, IRQ_HOST_MAP_LINEAR, |
736 | NR_IPIC_INTS, | 736 | NR_IPIC_INTS, |
737 | &ipic_host_ops, 0); | 737 | &ipic_host_ops, 0); |
738 | if (ipic->irqhost == NULL) | 738 | if (ipic->irqhost == NULL) { |
739 | kfree(ipic); | ||
739 | return NULL; | 740 | return NULL; |
741 | } | ||
740 | 742 | ||
741 | ipic->regs = ioremap(res.start, res.end - res.start + 1); | 743 | ipic->regs = ioremap(res.start, res.end - res.start + 1); |
742 | 744 | ||
@@ -781,6 +783,9 @@ struct ipic * __init ipic_init(struct device_node *node, unsigned int flags) | |||
781 | primary_ipic = ipic; | 783 | primary_ipic = ipic; |
782 | irq_set_default_host(primary_ipic->irqhost); | 784 | irq_set_default_host(primary_ipic->irqhost); |
783 | 785 | ||
786 | ipic_write(ipic->regs, IPIC_SIMSR_H, 0); | ||
787 | ipic_write(ipic->regs, IPIC_SIMSR_L, 0); | ||
788 | |||
784 | printk ("IPIC (%d IRQ sources) at %p\n", NR_IPIC_INTS, | 789 | printk ("IPIC (%d IRQ sources) at %p\n", NR_IPIC_INTS, |
785 | primary_ipic->regs); | 790 | primary_ipic->regs); |
786 | 791 | ||
diff --git a/arch/powerpc/sysdev/mmio_nvram.c b/arch/powerpc/sysdev/mmio_nvram.c index 7b49633a4bd0..207324209065 100644 --- a/arch/powerpc/sysdev/mmio_nvram.c +++ b/arch/powerpc/sysdev/mmio_nvram.c | |||
@@ -53,6 +53,23 @@ static ssize_t mmio_nvram_read(char *buf, size_t count, loff_t *index) | |||
53 | return count; | 53 | return count; |
54 | } | 54 | } |
55 | 55 | ||
56 | static unsigned char mmio_nvram_read_val(int addr) | ||
57 | { | ||
58 | unsigned long flags; | ||
59 | unsigned char val; | ||
60 | |||
61 | if (addr >= mmio_nvram_len) | ||
62 | return 0xff; | ||
63 | |||
64 | spin_lock_irqsave(&mmio_nvram_lock, flags); | ||
65 | |||
66 | val = ioread8(mmio_nvram_start + addr); | ||
67 | |||
68 | spin_unlock_irqrestore(&mmio_nvram_lock, flags); | ||
69 | |||
70 | return val; | ||
71 | } | ||
72 | |||
56 | static ssize_t mmio_nvram_write(char *buf, size_t count, loff_t *index) | 73 | static ssize_t mmio_nvram_write(char *buf, size_t count, loff_t *index) |
57 | { | 74 | { |
58 | unsigned long flags; | 75 | unsigned long flags; |
@@ -72,6 +89,19 @@ static ssize_t mmio_nvram_write(char *buf, size_t count, loff_t *index) | |||
72 | return count; | 89 | return count; |
73 | } | 90 | } |
74 | 91 | ||
92 | void mmio_nvram_write_val(int addr, unsigned char val) | ||
93 | { | ||
94 | unsigned long flags; | ||
95 | |||
96 | if (addr < mmio_nvram_len) { | ||
97 | spin_lock_irqsave(&mmio_nvram_lock, flags); | ||
98 | |||
99 | iowrite8(val, mmio_nvram_start + addr); | ||
100 | |||
101 | spin_unlock_irqrestore(&mmio_nvram_lock, flags); | ||
102 | } | ||
103 | } | ||
104 | |||
75 | static ssize_t mmio_nvram_get_size(void) | 105 | static ssize_t mmio_nvram_get_size(void) |
76 | { | 106 | { |
77 | return mmio_nvram_len; | 107 | return mmio_nvram_len; |
@@ -114,6 +144,8 @@ int __init mmio_nvram_init(void) | |||
114 | printk(KERN_INFO "mmio NVRAM, %luk at 0x%lx mapped to %p\n", | 144 | printk(KERN_INFO "mmio NVRAM, %luk at 0x%lx mapped to %p\n", |
115 | mmio_nvram_len >> 10, nvram_addr, mmio_nvram_start); | 145 | mmio_nvram_len >> 10, nvram_addr, mmio_nvram_start); |
116 | 146 | ||
147 | ppc_md.nvram_read_val = mmio_nvram_read_val; | ||
148 | ppc_md.nvram_write_val = mmio_nvram_write_val; | ||
117 | ppc_md.nvram_read = mmio_nvram_read; | 149 | ppc_md.nvram_read = mmio_nvram_read; |
118 | ppc_md.nvram_write = mmio_nvram_write; | 150 | ppc_md.nvram_write = mmio_nvram_write; |
119 | ppc_md.nvram_size = mmio_nvram_get_size; | 151 | ppc_md.nvram_size = mmio_nvram_get_size; |
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c index 3981ae4cb58e..30c44e6b0413 100644 --- a/arch/powerpc/sysdev/mpic.c +++ b/arch/powerpc/sysdev/mpic.c | |||
@@ -230,14 +230,16 @@ static inline u32 _mpic_irq_read(struct mpic *mpic, unsigned int src_no, unsigne | |||
230 | { | 230 | { |
231 | unsigned int isu = src_no >> mpic->isu_shift; | 231 | unsigned int isu = src_no >> mpic->isu_shift; |
232 | unsigned int idx = src_no & mpic->isu_mask; | 232 | unsigned int idx = src_no & mpic->isu_mask; |
233 | unsigned int val; | ||
233 | 234 | ||
235 | val = _mpic_read(mpic->reg_type, &mpic->isus[isu], | ||
236 | reg + (idx * MPIC_INFO(IRQ_STRIDE))); | ||
234 | #ifdef CONFIG_MPIC_BROKEN_REGREAD | 237 | #ifdef CONFIG_MPIC_BROKEN_REGREAD |
235 | if (reg == 0) | 238 | if (reg == 0) |
236 | return mpic->isu_reg0_shadow[idx]; | 239 | val = (val & (MPIC_VECPRI_MASK | MPIC_VECPRI_ACTIVITY)) | |
237 | else | 240 | mpic->isu_reg0_shadow[src_no]; |
238 | #endif | 241 | #endif |
239 | return _mpic_read(mpic->reg_type, &mpic->isus[isu], | 242 | return val; |
240 | reg + (idx * MPIC_INFO(IRQ_STRIDE))); | ||
241 | } | 243 | } |
242 | 244 | ||
243 | static inline void _mpic_irq_write(struct mpic *mpic, unsigned int src_no, | 245 | static inline void _mpic_irq_write(struct mpic *mpic, unsigned int src_no, |
@@ -251,7 +253,8 @@ static inline void _mpic_irq_write(struct mpic *mpic, unsigned int src_no, | |||
251 | 253 | ||
252 | #ifdef CONFIG_MPIC_BROKEN_REGREAD | 254 | #ifdef CONFIG_MPIC_BROKEN_REGREAD |
253 | if (reg == 0) | 255 | if (reg == 0) |
254 | mpic->isu_reg0_shadow[idx] = value; | 256 | mpic->isu_reg0_shadow[src_no] = |
257 | value & ~(MPIC_VECPRI_MASK | MPIC_VECPRI_ACTIVITY); | ||
255 | #endif | 258 | #endif |
256 | } | 259 | } |
257 | 260 | ||
diff --git a/arch/powerpc/sysdev/qe_lib/qe_ic.c b/arch/powerpc/sysdev/qe_lib/qe_ic.c index 074905c3ee5a..3faa42e03a85 100644 --- a/arch/powerpc/sysdev/qe_lib/qe_ic.c +++ b/arch/powerpc/sysdev/qe_lib/qe_ic.c | |||
@@ -339,8 +339,10 @@ void __init qe_ic_init(struct device_node *node, unsigned int flags, | |||
339 | 339 | ||
340 | qe_ic->irqhost = irq_alloc_host(node, IRQ_HOST_MAP_LINEAR, | 340 | qe_ic->irqhost = irq_alloc_host(node, IRQ_HOST_MAP_LINEAR, |
341 | NR_QE_IC_INTS, &qe_ic_host_ops, 0); | 341 | NR_QE_IC_INTS, &qe_ic_host_ops, 0); |
342 | if (qe_ic->irqhost == NULL) | 342 | if (qe_ic->irqhost == NULL) { |
343 | kfree(qe_ic); | ||
343 | return; | 344 | return; |
345 | } | ||
344 | 346 | ||
345 | qe_ic->regs = ioremap(res.start, res.end - res.start + 1); | 347 | qe_ic->regs = ioremap(res.start, res.end - res.start + 1); |
346 | 348 | ||
@@ -352,6 +354,7 @@ void __init qe_ic_init(struct device_node *node, unsigned int flags, | |||
352 | 354 | ||
353 | if (qe_ic->virq_low == NO_IRQ) { | 355 | if (qe_ic->virq_low == NO_IRQ) { |
354 | printk(KERN_ERR "Failed to map QE_IC low IRQ\n"); | 356 | printk(KERN_ERR "Failed to map QE_IC low IRQ\n"); |
357 | kfree(qe_ic); | ||
355 | return; | 358 | return; |
356 | } | 359 | } |
357 | 360 | ||
diff --git a/arch/powerpc/xmon/Makefile b/arch/powerpc/xmon/Makefile index 85ab97ab840a..faa81b6a6612 100644 --- a/arch/powerpc/xmon/Makefile +++ b/arch/powerpc/xmon/Makefile | |||
@@ -2,6 +2,8 @@ | |||
2 | 2 | ||
3 | subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror | 3 | subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror |
4 | 4 | ||
5 | GCOV_PROFILE := n | ||
6 | |||
5 | ifdef CONFIG_PPC64 | 7 | ifdef CONFIG_PPC64 |
6 | EXTRA_CFLAGS += -mno-minimal-toc | 8 | EXTRA_CFLAGS += -mno-minimal-toc |
7 | endif | 9 | endif |
diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c index e1f33a81e5e1..0e09a45ac79a 100644 --- a/arch/powerpc/xmon/xmon.c +++ b/arch/powerpc/xmon/xmon.c | |||
@@ -2570,7 +2570,7 @@ static void xmon_print_symbol(unsigned long address, const char *mid, | |||
2570 | printf("%s", after); | 2570 | printf("%s", after); |
2571 | } | 2571 | } |
2572 | 2572 | ||
2573 | #ifdef CONFIG_PPC64 | 2573 | #ifdef CONFIG_PPC_BOOK3S_64 |
2574 | static void dump_slb(void) | 2574 | static void dump_slb(void) |
2575 | { | 2575 | { |
2576 | int i; | 2576 | int i; |
diff --git a/arch/sh/boards/mach-se/7724/setup.c b/arch/sh/boards/mach-se/7724/setup.c index 8fed45a2fb85..15456a0773bf 100644 --- a/arch/sh/boards/mach-se/7724/setup.c +++ b/arch/sh/boards/mach-se/7724/setup.c | |||
@@ -238,7 +238,7 @@ static struct platform_device ceu1_device = { | |||
238 | }, | 238 | }, |
239 | }; | 239 | }; |
240 | 240 | ||
241 | /* KEYSC */ | 241 | /* KEYSC in SoC (Needs SW33-2 set to ON) */ |
242 | static struct sh_keysc_info keysc_info = { | 242 | static struct sh_keysc_info keysc_info = { |
243 | .mode = SH_KEYSC_MODE_1, | 243 | .mode = SH_KEYSC_MODE_1, |
244 | .scan_timing = 10, | 244 | .scan_timing = 10, |
@@ -255,12 +255,13 @@ static struct sh_keysc_info keysc_info = { | |||
255 | 255 | ||
256 | static struct resource keysc_resources[] = { | 256 | static struct resource keysc_resources[] = { |
257 | [0] = { | 257 | [0] = { |
258 | .start = 0x1a204000, | 258 | .name = "KEYSC", |
259 | .end = 0x1a20400f, | 259 | .start = 0x044b0000, |
260 | .end = 0x044b000f, | ||
260 | .flags = IORESOURCE_MEM, | 261 | .flags = IORESOURCE_MEM, |
261 | }, | 262 | }, |
262 | [1] = { | 263 | [1] = { |
263 | .start = IRQ0_KEY, | 264 | .start = 79, |
264 | .flags = IORESOURCE_IRQ, | 265 | .flags = IORESOURCE_IRQ, |
265 | }, | 266 | }, |
266 | }; | 267 | }; |
diff --git a/arch/sh/kernel/cpu/shmobile/sleep.S b/arch/sh/kernel/cpu/shmobile/sleep.S index 5d888ef53d82..baf2d7d46b05 100644 --- a/arch/sh/kernel/cpu/shmobile/sleep.S +++ b/arch/sh/kernel/cpu/shmobile/sleep.S | |||
@@ -26,8 +26,30 @@ ENTRY(sh_mobile_standby) | |||
26 | 26 | ||
27 | tst #SUSP_SH_SF, r0 | 27 | tst #SUSP_SH_SF, r0 |
28 | bt skip_set_sf | 28 | bt skip_set_sf |
29 | #ifdef CONFIG_CPU_SUBTYPE_SH7724 | ||
30 | /* DBSC: put memory in self-refresh mode */ | ||
29 | 31 | ||
30 | /* SDRAM: disable power down and put in self-refresh mode */ | 32 | mov.l dben_reg, r4 |
33 | mov.l dben_data0, r1 | ||
34 | mov.l r1, @r4 | ||
35 | |||
36 | mov.l dbrfpdn0_reg, r4 | ||
37 | mov.l dbrfpdn0_data0, r1 | ||
38 | mov.l r1, @r4 | ||
39 | |||
40 | mov.l dbcmdcnt_reg, r4 | ||
41 | mov.l dbcmdcnt_data0, r1 | ||
42 | mov.l r1, @r4 | ||
43 | |||
44 | mov.l dbcmdcnt_reg, r4 | ||
45 | mov.l dbcmdcnt_data1, r1 | ||
46 | mov.l r1, @r4 | ||
47 | |||
48 | mov.l dbrfpdn0_reg, r4 | ||
49 | mov.l dbrfpdn0_data1, r1 | ||
50 | mov.l r1, @r4 | ||
51 | #else | ||
52 | /* SBSC: disable power down and put in self-refresh mode */ | ||
31 | mov.l 1f, r4 | 53 | mov.l 1f, r4 |
32 | mov.l 2f, r1 | 54 | mov.l 2f, r1 |
33 | mov.l @r4, r2 | 55 | mov.l @r4, r2 |
@@ -35,6 +57,7 @@ ENTRY(sh_mobile_standby) | |||
35 | mov.l 3f, r3 | 57 | mov.l 3f, r3 |
36 | and r3, r2 | 58 | and r3, r2 |
37 | mov.l r2, @r4 | 59 | mov.l r2, @r4 |
60 | #endif | ||
38 | 61 | ||
39 | skip_set_sf: | 62 | skip_set_sf: |
40 | tst #SUSP_SH_SLEEP, r0 | 63 | tst #SUSP_SH_SLEEP, r0 |
@@ -84,7 +107,36 @@ done_sleep: | |||
84 | tst #SUSP_SH_SF, r0 | 107 | tst #SUSP_SH_SF, r0 |
85 | bt skip_restore_sf | 108 | bt skip_restore_sf |
86 | 109 | ||
87 | /* SDRAM: set auto-refresh mode */ | 110 | #ifdef CONFIG_CPU_SUBTYPE_SH7724 |
111 | /* DBSC: put memory in auto-refresh mode */ | ||
112 | |||
113 | mov.l dbrfpdn0_reg, r4 | ||
114 | mov.l dbrfpdn0_data0, r1 | ||
115 | mov.l r1, @r4 | ||
116 | |||
117 | /* sleep 140 ns */ | ||
118 | nop | ||
119 | nop | ||
120 | nop | ||
121 | nop | ||
122 | |||
123 | mov.l dbcmdcnt_reg, r4 | ||
124 | mov.l dbcmdcnt_data0, r1 | ||
125 | mov.l r1, @r4 | ||
126 | |||
127 | mov.l dbcmdcnt_reg, r4 | ||
128 | mov.l dbcmdcnt_data1, r1 | ||
129 | mov.l r1, @r4 | ||
130 | |||
131 | mov.l dben_reg, r4 | ||
132 | mov.l dben_data1, r1 | ||
133 | mov.l r1, @r4 | ||
134 | |||
135 | mov.l dbrfpdn0_reg, r4 | ||
136 | mov.l dbrfpdn0_data2, r1 | ||
137 | mov.l r1, @r4 | ||
138 | #else | ||
139 | /* SBSC: set auto-refresh mode */ | ||
88 | mov.l 1f, r4 | 140 | mov.l 1f, r4 |
89 | mov.l @r4, r2 | 141 | mov.l @r4, r2 |
90 | mov.l 4f, r3 | 142 | mov.l 4f, r3 |
@@ -98,15 +150,29 @@ done_sleep: | |||
98 | add r4, r3 | 150 | add r4, r3 |
99 | or r2, r3 | 151 | or r2, r3 |
100 | mov.l r3, @r1 | 152 | mov.l r3, @r1 |
153 | #endif | ||
101 | skip_restore_sf: | 154 | skip_restore_sf: |
102 | rts | 155 | rts |
103 | nop | 156 | nop |
104 | 157 | ||
105 | .balign 4 | 158 | .balign 4 |
159 | #ifdef CONFIG_CPU_SUBTYPE_SH7724 | ||
160 | dben_reg: .long 0xfd000010 /* DBEN */ | ||
161 | dben_data0: .long 0 | ||
162 | dben_data1: .long 1 | ||
163 | dbrfpdn0_reg: .long 0xfd000040 /* DBRFPDN0 */ | ||
164 | dbrfpdn0_data0: .long 0 | ||
165 | dbrfpdn0_data1: .long 1 | ||
166 | dbrfpdn0_data2: .long 0x00010000 | ||
167 | dbcmdcnt_reg: .long 0xfd000014 /* DBCMDCNT */ | ||
168 | dbcmdcnt_data0: .long 2 | ||
169 | dbcmdcnt_data1: .long 4 | ||
170 | #else | ||
106 | 1: .long 0xfe400008 /* SDCR0 */ | 171 | 1: .long 0xfe400008 /* SDCR0 */ |
107 | 2: .long 0x00000400 | 172 | 2: .long 0x00000400 |
108 | 3: .long 0xffff7fff | 173 | 3: .long 0xffff7fff |
109 | 4: .long 0xfffffbff | 174 | 4: .long 0xfffffbff |
175 | #endif | ||
110 | 5: .long 0xa4150020 /* STBCR */ | 176 | 5: .long 0xa4150020 /* STBCR */ |
111 | 6: .long 0xfe40001c /* RTCOR */ | 177 | 6: .long 0xfe40001c /* RTCOR */ |
112 | 7: .long 0xfe400018 /* RTCNT */ | 178 | 7: .long 0xfe400018 /* RTCNT */ |
diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c index fa44eaf8d897..3691907a43b4 100644 --- a/arch/sparc/kernel/smp_64.c +++ b/arch/sparc/kernel/smp_64.c | |||
@@ -1499,7 +1499,7 @@ void __init setup_per_cpu_areas(void) | |||
1499 | dyn_size = pcpur_size - static_size - PERCPU_MODULE_RESERVE; | 1499 | dyn_size = pcpur_size - static_size - PERCPU_MODULE_RESERVE; |
1500 | 1500 | ||
1501 | 1501 | ||
1502 | ptrs_size = PFN_ALIGN(num_possible_cpus() * sizeof(pcpur_ptrs[0])); | 1502 | ptrs_size = PFN_ALIGN(nr_cpu_ids * sizeof(pcpur_ptrs[0])); |
1503 | pcpur_ptrs = alloc_bootmem(ptrs_size); | 1503 | pcpur_ptrs = alloc_bootmem(ptrs_size); |
1504 | 1504 | ||
1505 | for_each_possible_cpu(cpu) { | 1505 | for_each_possible_cpu(cpu) { |
@@ -1514,7 +1514,7 @@ void __init setup_per_cpu_areas(void) | |||
1514 | 1514 | ||
1515 | /* allocate address and map */ | 1515 | /* allocate address and map */ |
1516 | vm.flags = VM_ALLOC; | 1516 | vm.flags = VM_ALLOC; |
1517 | vm.size = num_possible_cpus() * PCPU_CHUNK_SIZE; | 1517 | vm.size = nr_cpu_ids * PCPU_CHUNK_SIZE; |
1518 | vm_area_register_early(&vm, PCPU_CHUNK_SIZE); | 1518 | vm_area_register_early(&vm, PCPU_CHUNK_SIZE); |
1519 | 1519 | ||
1520 | for_each_possible_cpu(cpu) { | 1520 | for_each_possible_cpu(cpu) { |
diff --git a/arch/x86/include/asm/uv/uv_bau.h b/arch/x86/include/asm/uv/uv_bau.h index bddd44f2f0ab..80e2984f521c 100644 --- a/arch/x86/include/asm/uv/uv_bau.h +++ b/arch/x86/include/asm/uv/uv_bau.h | |||
@@ -133,7 +133,7 @@ struct bau_msg_payload { | |||
133 | * see table 4.2.3.0.1 in broacast_assist spec. | 133 | * see table 4.2.3.0.1 in broacast_assist spec. |
134 | */ | 134 | */ |
135 | struct bau_msg_header { | 135 | struct bau_msg_header { |
136 | unsigned int dest_subnodeid:6; /* must be zero */ | 136 | unsigned int dest_subnodeid:6; /* must be 0x10, for the LB */ |
137 | /* bits 5:0 */ | 137 | /* bits 5:0 */ |
138 | unsigned int base_dest_nodeid:15; /* nasid>>1 (pnode) of */ | 138 | unsigned int base_dest_nodeid:15; /* nasid>>1 (pnode) of */ |
139 | /* bits 20:6 */ /* first bit in node_map */ | 139 | /* bits 20:6 */ /* first bit in node_map */ |
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index 832e908adcb5..601159374e87 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | |||
@@ -46,7 +46,7 @@ static int early_get_nodeid(void) | |||
46 | return node_id.s.node_id; | 46 | return node_id.s.node_id; |
47 | } | 47 | } |
48 | 48 | ||
49 | static int uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | 49 | static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id) |
50 | { | 50 | { |
51 | if (!strcmp(oem_id, "SGI")) { | 51 | if (!strcmp(oem_id, "SGI")) { |
52 | if (!strcmp(oem_table_id, "UVL")) | 52 | if (!strcmp(oem_table_id, "UVL")) |
@@ -253,7 +253,7 @@ static void uv_send_IPI_self(int vector) | |||
253 | apic_write(APIC_SELF_IPI, vector); | 253 | apic_write(APIC_SELF_IPI, vector); |
254 | } | 254 | } |
255 | 255 | ||
256 | struct apic apic_x2apic_uv_x = { | 256 | struct apic __refdata apic_x2apic_uv_x = { |
257 | 257 | ||
258 | .name = "UV large system", | 258 | .name = "UV large system", |
259 | .probe = NULL, | 259 | .probe = NULL, |
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index 1cfb623ce11c..01213048f62f 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
@@ -1226,8 +1226,13 @@ static void mce_init(void) | |||
1226 | } | 1226 | } |
1227 | 1227 | ||
1228 | /* Add per CPU specific workarounds here */ | 1228 | /* Add per CPU specific workarounds here */ |
1229 | static void mce_cpu_quirks(struct cpuinfo_x86 *c) | 1229 | static int mce_cpu_quirks(struct cpuinfo_x86 *c) |
1230 | { | 1230 | { |
1231 | if (c->x86_vendor == X86_VENDOR_UNKNOWN) { | ||
1232 | pr_info("MCE: unknown CPU type - not enabling MCE support.\n"); | ||
1233 | return -EOPNOTSUPP; | ||
1234 | } | ||
1235 | |||
1231 | /* This should be disabled by the BIOS, but isn't always */ | 1236 | /* This should be disabled by the BIOS, but isn't always */ |
1232 | if (c->x86_vendor == X86_VENDOR_AMD) { | 1237 | if (c->x86_vendor == X86_VENDOR_AMD) { |
1233 | if (c->x86 == 15 && banks > 4) { | 1238 | if (c->x86 == 15 && banks > 4) { |
@@ -1273,11 +1278,20 @@ static void mce_cpu_quirks(struct cpuinfo_x86 *c) | |||
1273 | if ((c->x86 > 6 || (c->x86 == 6 && c->x86_model >= 0xe)) && | 1278 | if ((c->x86 > 6 || (c->x86 == 6 && c->x86_model >= 0xe)) && |
1274 | monarch_timeout < 0) | 1279 | monarch_timeout < 0) |
1275 | monarch_timeout = USEC_PER_SEC; | 1280 | monarch_timeout = USEC_PER_SEC; |
1281 | |||
1282 | /* | ||
1283 | * There are also broken BIOSes on some Pentium M and | ||
1284 | * earlier systems: | ||
1285 | */ | ||
1286 | if (c->x86 == 6 && c->x86_model <= 13 && mce_bootlog < 0) | ||
1287 | mce_bootlog = 0; | ||
1276 | } | 1288 | } |
1277 | if (monarch_timeout < 0) | 1289 | if (monarch_timeout < 0) |
1278 | monarch_timeout = 0; | 1290 | monarch_timeout = 0; |
1279 | if (mce_bootlog != 0) | 1291 | if (mce_bootlog != 0) |
1280 | mce_panic_timeout = 30; | 1292 | mce_panic_timeout = 30; |
1293 | |||
1294 | return 0; | ||
1281 | } | 1295 | } |
1282 | 1296 | ||
1283 | static void __cpuinit mce_ancient_init(struct cpuinfo_x86 *c) | 1297 | static void __cpuinit mce_ancient_init(struct cpuinfo_x86 *c) |
@@ -1338,11 +1352,10 @@ void __cpuinit mcheck_init(struct cpuinfo_x86 *c) | |||
1338 | if (!mce_available(c)) | 1352 | if (!mce_available(c)) |
1339 | return; | 1353 | return; |
1340 | 1354 | ||
1341 | if (mce_cap_init() < 0) { | 1355 | if (mce_cap_init() < 0 || mce_cpu_quirks(c) < 0) { |
1342 | mce_disabled = 1; | 1356 | mce_disabled = 1; |
1343 | return; | 1357 | return; |
1344 | } | 1358 | } |
1345 | mce_cpu_quirks(c); | ||
1346 | 1359 | ||
1347 | machine_check_vector = do_machine_check; | 1360 | machine_check_vector = do_machine_check; |
1348 | 1361 | ||
diff --git a/arch/x86/kernel/cpu/mcheck/therm_throt.c b/arch/x86/kernel/cpu/mcheck/therm_throt.c index 8bc64cfbe936..5957a93e5173 100644 --- a/arch/x86/kernel/cpu/mcheck/therm_throt.c +++ b/arch/x86/kernel/cpu/mcheck/therm_throt.c | |||
@@ -116,11 +116,14 @@ static int therm_throt_process(int curr) | |||
116 | cpu, __get_cpu_var(thermal_throttle_count)); | 116 | cpu, __get_cpu_var(thermal_throttle_count)); |
117 | 117 | ||
118 | add_taint(TAINT_MACHINE_CHECK); | 118 | add_taint(TAINT_MACHINE_CHECK); |
119 | } else if (was_throttled) { | 119 | return 1; |
120 | } | ||
121 | if (was_throttled) { | ||
120 | printk(KERN_INFO "CPU%d: Temperature/speed normal\n", cpu); | 122 | printk(KERN_INFO "CPU%d: Temperature/speed normal\n", cpu); |
123 | return 1; | ||
121 | } | 124 | } |
122 | 125 | ||
123 | return 1; | 126 | return 0; |
124 | } | 127 | } |
125 | 128 | ||
126 | #ifdef CONFIG_SYSFS | 129 | #ifdef CONFIG_SYSFS |
diff --git a/arch/x86/kernel/setup_percpu.c b/arch/x86/kernel/setup_percpu.c index 29a3eef7cf4a..07d81916f212 100644 --- a/arch/x86/kernel/setup_percpu.c +++ b/arch/x86/kernel/setup_percpu.c | |||
@@ -165,7 +165,7 @@ static ssize_t __init setup_pcpu_lpage(size_t static_size, bool chosen) | |||
165 | 165 | ||
166 | if (!chosen) { | 166 | if (!chosen) { |
167 | size_t vm_size = VMALLOC_END - VMALLOC_START; | 167 | size_t vm_size = VMALLOC_END - VMALLOC_START; |
168 | size_t tot_size = num_possible_cpus() * PMD_SIZE; | 168 | size_t tot_size = nr_cpu_ids * PMD_SIZE; |
169 | 169 | ||
170 | /* on non-NUMA, embedding is better */ | 170 | /* on non-NUMA, embedding is better */ |
171 | if (!pcpu_need_numa()) | 171 | if (!pcpu_need_numa()) |
@@ -199,7 +199,7 @@ static ssize_t __init setup_pcpu_lpage(size_t static_size, bool chosen) | |||
199 | dyn_size = pcpul_size - static_size - PERCPU_FIRST_CHUNK_RESERVE; | 199 | dyn_size = pcpul_size - static_size - PERCPU_FIRST_CHUNK_RESERVE; |
200 | 200 | ||
201 | /* allocate pointer array and alloc large pages */ | 201 | /* allocate pointer array and alloc large pages */ |
202 | map_size = PFN_ALIGN(num_possible_cpus() * sizeof(pcpul_map[0])); | 202 | map_size = PFN_ALIGN(nr_cpu_ids * sizeof(pcpul_map[0])); |
203 | pcpul_map = alloc_bootmem(map_size); | 203 | pcpul_map = alloc_bootmem(map_size); |
204 | 204 | ||
205 | for_each_possible_cpu(cpu) { | 205 | for_each_possible_cpu(cpu) { |
@@ -228,7 +228,7 @@ static ssize_t __init setup_pcpu_lpage(size_t static_size, bool chosen) | |||
228 | 228 | ||
229 | /* allocate address and map */ | 229 | /* allocate address and map */ |
230 | pcpul_vm.flags = VM_ALLOC; | 230 | pcpul_vm.flags = VM_ALLOC; |
231 | pcpul_vm.size = num_possible_cpus() * PMD_SIZE; | 231 | pcpul_vm.size = nr_cpu_ids * PMD_SIZE; |
232 | vm_area_register_early(&pcpul_vm, PMD_SIZE); | 232 | vm_area_register_early(&pcpul_vm, PMD_SIZE); |
233 | 233 | ||
234 | for_each_possible_cpu(cpu) { | 234 | for_each_possible_cpu(cpu) { |
@@ -250,8 +250,8 @@ static ssize_t __init setup_pcpu_lpage(size_t static_size, bool chosen) | |||
250 | PMD_SIZE, pcpul_vm.addr, NULL); | 250 | PMD_SIZE, pcpul_vm.addr, NULL); |
251 | 251 | ||
252 | /* sort pcpul_map array for pcpu_lpage_remapped() */ | 252 | /* sort pcpul_map array for pcpu_lpage_remapped() */ |
253 | for (i = 0; i < num_possible_cpus() - 1; i++) | 253 | for (i = 0; i < nr_cpu_ids - 1; i++) |
254 | for (j = i + 1; j < num_possible_cpus(); j++) | 254 | for (j = i + 1; j < nr_cpu_ids; j++) |
255 | if (pcpul_map[i].ptr > pcpul_map[j].ptr) { | 255 | if (pcpul_map[i].ptr > pcpul_map[j].ptr) { |
256 | struct pcpul_ent tmp = pcpul_map[i]; | 256 | struct pcpul_ent tmp = pcpul_map[i]; |
257 | pcpul_map[i] = pcpul_map[j]; | 257 | pcpul_map[i] = pcpul_map[j]; |
@@ -288,7 +288,7 @@ void *pcpu_lpage_remapped(void *kaddr) | |||
288 | { | 288 | { |
289 | void *pmd_addr = (void *)((unsigned long)kaddr & PMD_MASK); | 289 | void *pmd_addr = (void *)((unsigned long)kaddr & PMD_MASK); |
290 | unsigned long offset = (unsigned long)kaddr & ~PMD_MASK; | 290 | unsigned long offset = (unsigned long)kaddr & ~PMD_MASK; |
291 | int left = 0, right = num_possible_cpus() - 1; | 291 | int left = 0, right = nr_cpu_ids - 1; |
292 | int pos; | 292 | int pos; |
293 | 293 | ||
294 | /* pcpul in use at all? */ | 294 | /* pcpul in use at all? */ |
@@ -377,7 +377,7 @@ static ssize_t __init setup_pcpu_4k(size_t static_size) | |||
377 | pcpu4k_nr_static_pages = PFN_UP(static_size); | 377 | pcpu4k_nr_static_pages = PFN_UP(static_size); |
378 | 378 | ||
379 | /* unaligned allocations can't be freed, round up to page size */ | 379 | /* unaligned allocations can't be freed, round up to page size */ |
380 | pages_size = PFN_ALIGN(pcpu4k_nr_static_pages * num_possible_cpus() | 380 | pages_size = PFN_ALIGN(pcpu4k_nr_static_pages * nr_cpu_ids |
381 | * sizeof(pcpu4k_pages[0])); | 381 | * sizeof(pcpu4k_pages[0])); |
382 | pcpu4k_pages = alloc_bootmem(pages_size); | 382 | pcpu4k_pages = alloc_bootmem(pages_size); |
383 | 383 | ||
diff --git a/arch/x86/kernel/tlb_uv.c b/arch/x86/kernel/tlb_uv.c index 8ccabb8a2f6a..77b9689f8edb 100644 --- a/arch/x86/kernel/tlb_uv.c +++ b/arch/x86/kernel/tlb_uv.c | |||
@@ -744,6 +744,7 @@ uv_activation_descriptor_init(int node, int pnode) | |||
744 | * note that base_dest_nodeid is actually a nasid. | 744 | * note that base_dest_nodeid is actually a nasid. |
745 | */ | 745 | */ |
746 | ad2->header.base_dest_nodeid = uv_partition_base_pnode << 1; | 746 | ad2->header.base_dest_nodeid = uv_partition_base_pnode << 1; |
747 | ad2->header.dest_subnodeid = 0x10; /* the LB */ | ||
747 | ad2->header.command = UV_NET_ENDPOINT_INTD; | 748 | ad2->header.command = UV_NET_ENDPOINT_INTD; |
748 | ad2->header.int_both = 1; | 749 | ad2->header.int_both = 1; |
749 | /* | 750 | /* |