diff options
Diffstat (limited to 'arch')
30 files changed, 431 insertions, 157 deletions
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index c45a155a73dc..9e70f2053f9a 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c | |||
| @@ -966,7 +966,7 @@ armv6pmu_handle_irq(int irq_num, | |||
| 966 | */ | 966 | */ |
| 967 | armv6_pmcr_write(pmcr); | 967 | armv6_pmcr_write(pmcr); |
| 968 | 968 | ||
| 969 | data.addr = 0; | 969 | perf_sample_data_init(&data, 0); |
| 970 | 970 | ||
| 971 | cpuc = &__get_cpu_var(cpu_hw_events); | 971 | cpuc = &__get_cpu_var(cpu_hw_events); |
| 972 | for (idx = 0; idx <= armpmu->num_events; ++idx) { | 972 | for (idx = 0; idx <= armpmu->num_events; ++idx) { |
| @@ -1946,7 +1946,7 @@ static irqreturn_t armv7pmu_handle_irq(int irq_num, void *dev) | |||
| 1946 | */ | 1946 | */ |
| 1947 | regs = get_irq_regs(); | 1947 | regs = get_irq_regs(); |
| 1948 | 1948 | ||
| 1949 | data.addr = 0; | 1949 | perf_sample_data_init(&data, 0); |
| 1950 | 1950 | ||
| 1951 | cpuc = &__get_cpu_var(cpu_hw_events); | 1951 | cpuc = &__get_cpu_var(cpu_hw_events); |
| 1952 | for (idx = 0; idx <= armpmu->num_events; ++idx) { | 1952 | for (idx = 0; idx <= armpmu->num_events; ++idx) { |
diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index a0463d926447..1c2ec96ce261 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c | |||
| @@ -206,10 +206,32 @@ static struct platform_device keysc_device = { | |||
| 206 | }, | 206 | }, |
| 207 | }; | 207 | }; |
| 208 | 208 | ||
| 209 | /* SDHI0 */ | ||
| 210 | static struct resource sdhi0_resources[] = { | ||
| 211 | [0] = { | ||
| 212 | .name = "SDHI0", | ||
| 213 | .start = 0xe6850000, | ||
| 214 | .end = 0xe68501ff, | ||
| 215 | .flags = IORESOURCE_MEM, | ||
| 216 | }, | ||
| 217 | [1] = { | ||
| 218 | .start = 96, | ||
| 219 | .flags = IORESOURCE_IRQ, | ||
| 220 | }, | ||
| 221 | }; | ||
| 222 | |||
| 223 | static struct platform_device sdhi0_device = { | ||
| 224 | .name = "sh_mobile_sdhi", | ||
| 225 | .num_resources = ARRAY_SIZE(sdhi0_resources), | ||
| 226 | .resource = sdhi0_resources, | ||
| 227 | .id = 0, | ||
| 228 | }; | ||
| 229 | |||
| 209 | static struct platform_device *ap4evb_devices[] __initdata = { | 230 | static struct platform_device *ap4evb_devices[] __initdata = { |
| 210 | &nor_flash_device, | 231 | &nor_flash_device, |
| 211 | &smc911x_device, | 232 | &smc911x_device, |
| 212 | &keysc_device, | 233 | &keysc_device, |
| 234 | &sdhi0_device, | ||
| 213 | }; | 235 | }; |
| 214 | 236 | ||
| 215 | static struct map_desc ap4evb_io_desc[] __initdata = { | 237 | static struct map_desc ap4evb_io_desc[] __initdata = { |
| @@ -286,6 +308,16 @@ static void __init ap4evb_init(void) | |||
| 286 | gpio_request(GPIO_FN_KEYIN3_133, NULL); | 308 | gpio_request(GPIO_FN_KEYIN3_133, NULL); |
| 287 | gpio_request(GPIO_FN_KEYIN4, NULL); | 309 | gpio_request(GPIO_FN_KEYIN4, NULL); |
| 288 | 310 | ||
| 311 | /* SDHI0 */ | ||
| 312 | gpio_request(GPIO_FN_SDHICD0, NULL); | ||
| 313 | gpio_request(GPIO_FN_SDHIWP0, NULL); | ||
| 314 | gpio_request(GPIO_FN_SDHICMD0, NULL); | ||
| 315 | gpio_request(GPIO_FN_SDHICLK0, NULL); | ||
| 316 | gpio_request(GPIO_FN_SDHID0_3, NULL); | ||
| 317 | gpio_request(GPIO_FN_SDHID0_2, NULL); | ||
| 318 | gpio_request(GPIO_FN_SDHID0_1, NULL); | ||
| 319 | gpio_request(GPIO_FN_SDHID0_0, NULL); | ||
| 320 | |||
| 289 | sh7372_add_standard_devices(); | 321 | sh7372_add_standard_devices(); |
| 290 | 322 | ||
| 291 | platform_add_devices(ap4evb_devices, ARRAY_SIZE(ap4evb_devices)); | 323 | platform_add_devices(ap4evb_devices, ARRAY_SIZE(ap4evb_devices)); |
diff --git a/arch/arm/mach-shmobile/board-g3evm.c b/arch/arm/mach-shmobile/board-g3evm.c index f36c9a94d326..9247503296c4 100644 --- a/arch/arm/mach-shmobile/board-g3evm.c +++ b/arch/arm/mach-shmobile/board-g3evm.c | |||
| @@ -26,9 +26,12 @@ | |||
| 26 | #include <linux/mtd/mtd.h> | 26 | #include <linux/mtd/mtd.h> |
| 27 | #include <linux/mtd/partitions.h> | 27 | #include <linux/mtd/partitions.h> |
| 28 | #include <linux/mtd/physmap.h> | 28 | #include <linux/mtd/physmap.h> |
| 29 | #include <linux/mtd/sh_flctl.h> | ||
| 29 | #include <linux/usb/r8a66597.h> | 30 | #include <linux/usb/r8a66597.h> |
| 30 | #include <linux/io.h> | 31 | #include <linux/io.h> |
| 31 | #include <linux/gpio.h> | 32 | #include <linux/gpio.h> |
| 33 | #include <linux/input.h> | ||
| 34 | #include <linux/input/sh_keysc.h> | ||
| 32 | #include <mach/sh7367.h> | 35 | #include <mach/sh7367.h> |
| 33 | #include <mach/common.h> | 36 | #include <mach/common.h> |
| 34 | #include <asm/mach-types.h> | 37 | #include <asm/mach-types.h> |
| @@ -127,9 +130,90 @@ static struct platform_device usb_host_device = { | |||
| 127 | .resource = usb_host_resources, | 130 | .resource = usb_host_resources, |
| 128 | }; | 131 | }; |
| 129 | 132 | ||
| 133 | /* KEYSC */ | ||
| 134 | static struct sh_keysc_info keysc_info = { | ||
| 135 | .mode = SH_KEYSC_MODE_5, | ||
| 136 | .scan_timing = 3, | ||
| 137 | .delay = 100, | ||
| 138 | .keycodes = { | ||
| 139 | KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, | ||
| 140 | KEY_H, KEY_I, KEY_J, KEY_K, KEY_L, KEY_M, KEY_N, | ||
| 141 | KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U, | ||
| 142 | KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z, KEY_HOME, KEY_SLEEP, | ||
| 143 | KEY_WAKEUP, KEY_COFFEE, KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, | ||
| 144 | KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_STOP, KEY_COMPUTER, | ||
| 145 | }, | ||
| 146 | }; | ||
| 147 | |||
| 148 | static struct resource keysc_resources[] = { | ||
| 149 | [0] = { | ||
| 150 | .name = "KEYSC", | ||
| 151 | .start = 0xe61b0000, | ||
| 152 | .end = 0xe61b000f, | ||
| 153 | .flags = IORESOURCE_MEM, | ||
| 154 | }, | ||
| 155 | [1] = { | ||
| 156 | .start = 79, | ||
| 157 | .flags = IORESOURCE_IRQ, | ||
| 158 | }, | ||
| 159 | }; | ||
| 160 | |||
| 161 | static struct platform_device keysc_device = { | ||
| 162 | .name = "sh_keysc", | ||
| 163 | .num_resources = ARRAY_SIZE(keysc_resources), | ||
| 164 | .resource = keysc_resources, | ||
| 165 | .dev = { | ||
| 166 | .platform_data = &keysc_info, | ||
| 167 | }, | ||
| 168 | }; | ||
| 169 | |||
| 170 | static struct mtd_partition nand_partition_info[] = { | ||
| 171 | { | ||
| 172 | .name = "system", | ||
| 173 | .offset = 0, | ||
| 174 | .size = 64 * 1024 * 1024, | ||
| 175 | }, | ||
| 176 | { | ||
| 177 | .name = "userdata", | ||
| 178 | .offset = MTDPART_OFS_APPEND, | ||
| 179 | .size = 128 * 1024 * 1024, | ||
| 180 | }, | ||
| 181 | { | ||
| 182 | .name = "cache", | ||
| 183 | .offset = MTDPART_OFS_APPEND, | ||
| 184 | .size = 64 * 1024 * 1024, | ||
| 185 | }, | ||
| 186 | }; | ||
| 187 | |||
| 188 | static struct resource nand_flash_resources[] = { | ||
| 189 | [0] = { | ||
| 190 | .start = 0xe6a30000, | ||
| 191 | .end = 0xe6a3009b, | ||
| 192 | .flags = IORESOURCE_MEM, | ||
| 193 | } | ||
| 194 | }; | ||
| 195 | |||
| 196 | static struct sh_flctl_platform_data nand_flash_data = { | ||
| 197 | .parts = nand_partition_info, | ||
| 198 | .nr_parts = ARRAY_SIZE(nand_partition_info), | ||
| 199 | .flcmncr_val = QTSEL_E | FCKSEL_E | TYPESEL_SET | NANWF_E | ||
| 200 | | SHBUSSEL | SEL_16BIT, | ||
| 201 | }; | ||
| 202 | |||
| 203 | static struct platform_device nand_flash_device = { | ||
| 204 | .name = "sh_flctl", | ||
| 205 | .resource = nand_flash_resources, | ||
| 206 | .num_resources = ARRAY_SIZE(nand_flash_resources), | ||
| 207 | .dev = { | ||
| 208 | .platform_data = &nand_flash_data, | ||
| 209 | }, | ||
| 210 | }; | ||
| 211 | |||
| 130 | static struct platform_device *g3evm_devices[] __initdata = { | 212 | static struct platform_device *g3evm_devices[] __initdata = { |
| 131 | &nor_flash_device, | 213 | &nor_flash_device, |
| 132 | &usb_host_device, | 214 | &usb_host_device, |
| 215 | &keysc_device, | ||
| 216 | &nand_flash_device, | ||
| 133 | }; | 217 | }; |
| 134 | 218 | ||
| 135 | static struct map_desc g3evm_io_desc[] __initdata = { | 219 | static struct map_desc g3evm_io_desc[] __initdata = { |
| @@ -196,6 +280,44 @@ static void __init g3evm_init(void) | |||
| 196 | __raw_writew(0x6010, 0xe60581c6); /* CGPOSR */ | 280 | __raw_writew(0x6010, 0xe60581c6); /* CGPOSR */ |
| 197 | __raw_writew(0x8a0a, 0xe605810c); /* USBCR2 */ | 281 | __raw_writew(0x8a0a, 0xe605810c); /* USBCR2 */ |
| 198 | 282 | ||
| 283 | /* KEYSC @ CN7 */ | ||
| 284 | gpio_request(GPIO_FN_PORT42_KEYOUT0, NULL); | ||
| 285 | gpio_request(GPIO_FN_PORT43_KEYOUT1, NULL); | ||
| 286 | gpio_request(GPIO_FN_PORT44_KEYOUT2, NULL); | ||
| 287 | gpio_request(GPIO_FN_PORT45_KEYOUT3, NULL); | ||
| 288 | gpio_request(GPIO_FN_PORT46_KEYOUT4, NULL); | ||
| 289 | gpio_request(GPIO_FN_PORT47_KEYOUT5, NULL); | ||
| 290 | gpio_request(GPIO_FN_PORT48_KEYIN0_PU, NULL); | ||
| 291 | gpio_request(GPIO_FN_PORT49_KEYIN1_PU, NULL); | ||
| 292 | gpio_request(GPIO_FN_PORT50_KEYIN2_PU, NULL); | ||
| 293 | gpio_request(GPIO_FN_PORT55_KEYIN3_PU, NULL); | ||
| 294 | gpio_request(GPIO_FN_PORT56_KEYIN4_PU, NULL); | ||
| 295 | gpio_request(GPIO_FN_PORT57_KEYIN5_PU, NULL); | ||
| 296 | gpio_request(GPIO_FN_PORT58_KEYIN6_PU, NULL); | ||
| 297 | |||
| 298 | /* FLCTL */ | ||
| 299 | gpio_request(GPIO_FN_FCE0, NULL); | ||
| 300 | gpio_request(GPIO_FN_D0_ED0_NAF0, NULL); | ||
| 301 | gpio_request(GPIO_FN_D1_ED1_NAF1, NULL); | ||
| 302 | gpio_request(GPIO_FN_D2_ED2_NAF2, NULL); | ||
| 303 | gpio_request(GPIO_FN_D3_ED3_NAF3, NULL); | ||
| 304 | gpio_request(GPIO_FN_D4_ED4_NAF4, NULL); | ||
| 305 | gpio_request(GPIO_FN_D5_ED5_NAF5, NULL); | ||
| 306 | gpio_request(GPIO_FN_D6_ED6_NAF6, NULL); | ||
| 307 | gpio_request(GPIO_FN_D7_ED7_NAF7, NULL); | ||
| 308 | gpio_request(GPIO_FN_D8_ED8_NAF8, NULL); | ||
| 309 | gpio_request(GPIO_FN_D9_ED9_NAF9, NULL); | ||
| 310 | gpio_request(GPIO_FN_D10_ED10_NAF10, NULL); | ||
| 311 | gpio_request(GPIO_FN_D11_ED11_NAF11, NULL); | ||
| 312 | gpio_request(GPIO_FN_D12_ED12_NAF12, NULL); | ||
| 313 | gpio_request(GPIO_FN_D13_ED13_NAF13, NULL); | ||
| 314 | gpio_request(GPIO_FN_D14_ED14_NAF14, NULL); | ||
| 315 | gpio_request(GPIO_FN_D15_ED15_NAF15, NULL); | ||
| 316 | gpio_request(GPIO_FN_WE0_XWR0_FWE, NULL); | ||
| 317 | gpio_request(GPIO_FN_FRB, NULL); | ||
| 318 | /* FOE, FCDE, FSC on dedicated pins */ | ||
| 319 | __raw_writel(__raw_readl(0xe6158048) & ~(1 << 15), 0xe6158048); | ||
| 320 | |||
| 199 | sh7367_add_standard_devices(); | 321 | sh7367_add_standard_devices(); |
| 200 | 322 | ||
| 201 | platform_add_devices(g3evm_devices, ARRAY_SIZE(g3evm_devices)); | 323 | platform_add_devices(g3evm_devices, ARRAY_SIZE(g3evm_devices)); |
diff --git a/arch/arm/mach-shmobile/board-g4evm.c b/arch/arm/mach-shmobile/board-g4evm.c index 5acd623f93e7..10673a90be52 100644 --- a/arch/arm/mach-shmobile/board-g4evm.c +++ b/arch/arm/mach-shmobile/board-g4evm.c | |||
| @@ -28,6 +28,8 @@ | |||
| 28 | #include <linux/mtd/physmap.h> | 28 | #include <linux/mtd/physmap.h> |
| 29 | #include <linux/usb/r8a66597.h> | 29 | #include <linux/usb/r8a66597.h> |
| 30 | #include <linux/io.h> | 30 | #include <linux/io.h> |
| 31 | #include <linux/input.h> | ||
| 32 | #include <linux/input/sh_keysc.h> | ||
| 31 | #include <linux/gpio.h> | 33 | #include <linux/gpio.h> |
| 32 | #include <mach/sh7377.h> | 34 | #include <mach/sh7377.h> |
| 33 | #include <mach/common.h> | 35 | #include <mach/common.h> |
| @@ -128,9 +130,49 @@ static struct platform_device usb_host_device = { | |||
| 128 | .resource = usb_host_resources, | 130 | .resource = usb_host_resources, |
| 129 | }; | 131 | }; |
| 130 | 132 | ||
| 133 | /* KEYSC */ | ||
| 134 | static struct sh_keysc_info keysc_info = { | ||
| 135 | .mode = SH_KEYSC_MODE_5, | ||
| 136 | .scan_timing = 3, | ||
| 137 | .delay = 100, | ||
| 138 | .keycodes = { | ||
| 139 | KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, | ||
| 140 | KEY_G, KEY_H, KEY_I, KEY_J, KEY_K, KEY_L, | ||
| 141 | KEY_M, KEY_N, KEY_U, KEY_P, KEY_Q, KEY_R, | ||
| 142 | KEY_S, KEY_T, KEY_U, KEY_V, KEY_W, KEY_X, | ||
| 143 | KEY_Y, KEY_Z, KEY_HOME, KEY_SLEEP, KEY_WAKEUP, KEY_COFFEE, | ||
| 144 | KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, | ||
| 145 | KEY_6, KEY_7, KEY_8, KEY_9, KEY_STOP, KEY_COMPUTER, | ||
| 146 | }, | ||
| 147 | }; | ||
| 148 | |||
| 149 | static struct resource keysc_resources[] = { | ||
| 150 | [0] = { | ||
| 151 | .name = "KEYSC", | ||
| 152 | .start = 0xe61b0000, | ||
| 153 | .end = 0xe61b000f, | ||
| 154 | .flags = IORESOURCE_MEM, | ||
| 155 | }, | ||
| 156 | [1] = { | ||
| 157 | .start = 79, | ||
| 158 | .flags = IORESOURCE_IRQ, | ||
| 159 | }, | ||
| 160 | }; | ||
| 161 | |||
| 162 | static struct platform_device keysc_device = { | ||
| 163 | .name = "sh_keysc", | ||
| 164 | .id = 0, /* keysc0 clock */ | ||
| 165 | .num_resources = ARRAY_SIZE(keysc_resources), | ||
| 166 | .resource = keysc_resources, | ||
| 167 | .dev = { | ||
| 168 | .platform_data = &keysc_info, | ||
| 169 | }, | ||
| 170 | }; | ||
| 171 | |||
| 131 | static struct platform_device *g4evm_devices[] __initdata = { | 172 | static struct platform_device *g4evm_devices[] __initdata = { |
| 132 | &nor_flash_device, | 173 | &nor_flash_device, |
| 133 | &usb_host_device, | 174 | &usb_host_device, |
| 175 | &keysc_device, | ||
| 134 | }; | 176 | }; |
| 135 | 177 | ||
| 136 | static struct map_desc g4evm_io_desc[] __initdata = { | 178 | static struct map_desc g4evm_io_desc[] __initdata = { |
| @@ -196,6 +238,21 @@ static void __init g4evm_init(void) | |||
| 196 | __raw_writew(0x6010, 0xe60581c6); /* CGPOSR */ | 238 | __raw_writew(0x6010, 0xe60581c6); /* CGPOSR */ |
| 197 | __raw_writew(0x8a0a, 0xe605810c); /* USBCR2 */ | 239 | __raw_writew(0x8a0a, 0xe605810c); /* USBCR2 */ |
| 198 | 240 | ||
| 241 | /* KEYSC @ CN31 */ | ||
| 242 | gpio_request(GPIO_FN_PORT60_KEYOUT5, NULL); | ||
| 243 | gpio_request(GPIO_FN_PORT61_KEYOUT4, NULL); | ||
| 244 | gpio_request(GPIO_FN_PORT62_KEYOUT3, NULL); | ||
| 245 | gpio_request(GPIO_FN_PORT63_KEYOUT2, NULL); | ||
| 246 | gpio_request(GPIO_FN_PORT64_KEYOUT1, NULL); | ||
| 247 | gpio_request(GPIO_FN_PORT65_KEYOUT0, NULL); | ||
| 248 | gpio_request(GPIO_FN_PORT66_KEYIN0_PU, NULL); | ||
| 249 | gpio_request(GPIO_FN_PORT67_KEYIN1_PU, NULL); | ||
| 250 | gpio_request(GPIO_FN_PORT68_KEYIN2_PU, NULL); | ||
| 251 | gpio_request(GPIO_FN_PORT69_KEYIN3_PU, NULL); | ||
| 252 | gpio_request(GPIO_FN_PORT70_KEYIN4_PU, NULL); | ||
| 253 | gpio_request(GPIO_FN_PORT71_KEYIN5_PU, NULL); | ||
| 254 | gpio_request(GPIO_FN_PORT72_KEYIN6_PU, NULL); | ||
| 255 | |||
| 199 | sh7377_add_standard_devices(); | 256 | sh7377_add_standard_devices(); |
| 200 | 257 | ||
| 201 | platform_add_devices(g4evm_devices, ARRAY_SIZE(g4evm_devices)); | 258 | platform_add_devices(g4evm_devices, ARRAY_SIZE(g4evm_devices)); |
diff --git a/arch/arm/mach-shmobile/clock-sh7367.c b/arch/arm/mach-shmobile/clock-sh7367.c index 58bd54e1113a..bb940c6e4e6c 100644 --- a/arch/arm/mach-shmobile/clock-sh7367.c +++ b/arch/arm/mach-shmobile/clock-sh7367.c | |||
| @@ -75,6 +75,11 @@ static struct clk usb0_clk = { | |||
| 75 | .name = "usb0", | 75 | .name = "usb0", |
| 76 | }; | 76 | }; |
| 77 | 77 | ||
| 78 | /* a static keysc0 clk for now - enough to get sh_keysc working */ | ||
| 79 | static struct clk keysc0_clk = { | ||
| 80 | .name = "keysc0", | ||
| 81 | }; | ||
| 82 | |||
| 78 | static struct clk_lookup lookups[] = { | 83 | static struct clk_lookup lookups[] = { |
| 79 | { | 84 | { |
| 80 | .clk = &peripheral_clk, | 85 | .clk = &peripheral_clk, |
| @@ -82,6 +87,8 @@ static struct clk_lookup lookups[] = { | |||
| 82 | .clk = &r_clk, | 87 | .clk = &r_clk, |
| 83 | }, { | 88 | }, { |
| 84 | .clk = &usb0_clk, | 89 | .clk = &usb0_clk, |
| 90 | }, { | ||
| 91 | .clk = &keysc0_clk, | ||
| 85 | } | 92 | } |
| 86 | }; | 93 | }; |
| 87 | 94 | ||
diff --git a/arch/arm/mach-shmobile/intc-sh7367.c b/arch/arm/mach-shmobile/intc-sh7367.c index 6a547b47aabb..5ff70cadfc32 100644 --- a/arch/arm/mach-shmobile/intc-sh7367.c +++ b/arch/arm/mach-shmobile/intc-sh7367.c | |||
| @@ -27,6 +27,8 @@ | |||
| 27 | 27 | ||
| 28 | enum { | 28 | enum { |
| 29 | UNUSED_INTCA = 0, | 29 | UNUSED_INTCA = 0, |
| 30 | ENABLED, | ||
| 31 | DISABLED, | ||
| 30 | 32 | ||
| 31 | /* interrupt sources INTCA */ | 33 | /* interrupt sources INTCA */ |
| 32 | IRQ0A, IRQ1A, IRQ2A, IRQ3A, IRQ4A, IRQ5A, IRQ6A, IRQ7A, | 34 | IRQ0A, IRQ1A, IRQ2A, IRQ3A, IRQ4A, IRQ5A, IRQ6A, IRQ7A, |
| @@ -46,8 +48,8 @@ enum { | |||
| 46 | MSIOF2, MSIOF1, | 48 | MSIOF2, MSIOF1, |
| 47 | SCIFA4, SCIFA5, SCIFB, | 49 | SCIFA4, SCIFA5, SCIFB, |
| 48 | FLCTL_FLSTEI, FLCTL_FLTENDI, FLCTL_FLTREQ0I, FLCTL_FLTREQ1I, | 50 | FLCTL_FLSTEI, FLCTL_FLTENDI, FLCTL_FLTREQ0I, FLCTL_FLTREQ1I, |
| 49 | SDHI0_SDHI0I0, SDHI0_SDHI0I1, SDHI0_SDHI0I2, SDHI0_SDHI0I3, | 51 | SDHI0, |
| 50 | SDHI1_SDHI1I0, SDHI1_SDHI1I1, SDHI1_SDHI1I2, SDHI1_SDHI1I3, | 52 | SDHI1, |
| 51 | MSU_MSU, MSU_MSU2, | 53 | MSU_MSU, MSU_MSU2, |
| 52 | IREM, | 54 | IREM, |
| 53 | SIU, | 55 | SIU, |
| @@ -59,7 +61,7 @@ enum { | |||
| 59 | TTI20, | 61 | TTI20, |
| 60 | MISTY, | 62 | MISTY, |
| 61 | DDM, | 63 | DDM, |
| 62 | SDHI2_SDHI2I0, SDHI2_SDHI2I1, SDHI2_SDHI2I2, SDHI2_SDHI2I3, | 64 | SDHI2, |
| 63 | RWDT0, RWDT1, | 65 | RWDT0, RWDT1, |
| 64 | DMAC_1_DEI0, DMAC_1_DEI1, DMAC_1_DEI2, DMAC_1_DEI3, | 66 | DMAC_1_DEI0, DMAC_1_DEI1, DMAC_1_DEI2, DMAC_1_DEI3, |
| 65 | DMAC_2_DEI4, DMAC_2_DEI5, DMAC_2_DADERR, | 67 | DMAC_2_DEI4, DMAC_2_DEI5, DMAC_2_DADERR, |
| @@ -70,7 +72,7 @@ enum { | |||
| 70 | 72 | ||
| 71 | /* interrupt groups INTCA */ | 73 | /* interrupt groups INTCA */ |
| 72 | DMAC_1, DMAC_2, DMAC2_1, DMAC2_2, DMAC3_1, DMAC3_2, | 74 | DMAC_1, DMAC_2, DMAC2_1, DMAC2_2, DMAC3_1, DMAC3_2, |
| 73 | ETM11, ARM11, USBHS, FLCTL, IIC1, SDHI0, SDHI1, SDHI2, | 75 | ETM11, ARM11, USBHS, FLCTL, IIC1 |
| 74 | }; | 76 | }; |
| 75 | 77 | ||
| 76 | static struct intc_vect intca_vectors[] = { | 78 | static struct intc_vect intca_vectors[] = { |
| @@ -105,10 +107,10 @@ static struct intc_vect intca_vectors[] = { | |||
| 105 | INTC_VECT(SCIFB, 0x0d60), | 107 | INTC_VECT(SCIFB, 0x0d60), |
| 106 | INTC_VECT(FLCTL_FLSTEI, 0x0d80), INTC_VECT(FLCTL_FLTENDI, 0x0da0), | 108 | INTC_VECT(FLCTL_FLSTEI, 0x0d80), INTC_VECT(FLCTL_FLTENDI, 0x0da0), |
| 107 | INTC_VECT(FLCTL_FLTREQ0I, 0x0dc0), INTC_VECT(FLCTL_FLTREQ1I, 0x0de0), | 109 | INTC_VECT(FLCTL_FLTREQ0I, 0x0dc0), INTC_VECT(FLCTL_FLTREQ1I, 0x0de0), |
| 108 | INTC_VECT(SDHI0_SDHI0I0, 0x0e00), INTC_VECT(SDHI0_SDHI0I1, 0x0e20), | 110 | INTC_VECT(SDHI0, 0x0e00), INTC_VECT(SDHI0, 0x0e20), |
| 109 | INTC_VECT(SDHI0_SDHI0I2, 0x0e40), INTC_VECT(SDHI0_SDHI0I3, 0x0e60), | 111 | INTC_VECT(SDHI0, 0x0e40), INTC_VECT(SDHI0, 0x0e60), |
| 110 | INTC_VECT(SDHI1_SDHI1I0, 0x0e80), INTC_VECT(SDHI1_SDHI1I1, 0x0ea0), | 112 | INTC_VECT(SDHI1, 0x0e80), INTC_VECT(SDHI1, 0x0ea0), |
| 111 | INTC_VECT(SDHI1_SDHI1I2, 0x0ec0), INTC_VECT(SDHI1_SDHI1I3, 0x0ee0), | 113 | INTC_VECT(SDHI1, 0x0ec0), INTC_VECT(SDHI1, 0x0ee0), |
| 112 | INTC_VECT(MSU_MSU, 0x0f20), INTC_VECT(MSU_MSU2, 0x0f40), | 114 | INTC_VECT(MSU_MSU, 0x0f20), INTC_VECT(MSU_MSU2, 0x0f40), |
| 113 | INTC_VECT(IREM, 0x0f60), | 115 | INTC_VECT(IREM, 0x0f60), |
| 114 | INTC_VECT(SIU, 0x0fa0), | 116 | INTC_VECT(SIU, 0x0fa0), |
| @@ -122,8 +124,8 @@ static struct intc_vect intca_vectors[] = { | |||
| 122 | INTC_VECT(TTI20, 0x1100), | 124 | INTC_VECT(TTI20, 0x1100), |
| 123 | INTC_VECT(MISTY, 0x1120), | 125 | INTC_VECT(MISTY, 0x1120), |
| 124 | INTC_VECT(DDM, 0x1140), | 126 | INTC_VECT(DDM, 0x1140), |
| 125 | INTC_VECT(SDHI2_SDHI2I0, 0x1200), INTC_VECT(SDHI2_SDHI2I1, 0x1220), | 127 | INTC_VECT(SDHI2, 0x1200), INTC_VECT(SDHI2, 0x1220), |
| 126 | INTC_VECT(SDHI2_SDHI2I2, 0x1240), INTC_VECT(SDHI2_SDHI2I3, 0x1260), | 128 | INTC_VECT(SDHI2, 0x1240), INTC_VECT(SDHI2, 0x1260), |
| 127 | INTC_VECT(RWDT0, 0x1280), INTC_VECT(RWDT1, 0x12a0), | 129 | INTC_VECT(RWDT0, 0x1280), INTC_VECT(RWDT1, 0x12a0), |
| 128 | INTC_VECT(DMAC_1_DEI0, 0x2000), INTC_VECT(DMAC_1_DEI1, 0x2020), | 130 | INTC_VECT(DMAC_1_DEI0, 0x2000), INTC_VECT(DMAC_1_DEI1, 0x2020), |
| 129 | INTC_VECT(DMAC_1_DEI2, 0x2040), INTC_VECT(DMAC_1_DEI3, 0x2060), | 131 | INTC_VECT(DMAC_1_DEI2, 0x2040), INTC_VECT(DMAC_1_DEI3, 0x2060), |
| @@ -158,12 +160,6 @@ static struct intc_group intca_groups[] __initdata = { | |||
| 158 | INTC_GROUP(FLCTL, FLCTL_FLSTEI, FLCTL_FLTENDI, | 160 | INTC_GROUP(FLCTL, FLCTL_FLSTEI, FLCTL_FLTENDI, |
| 159 | FLCTL_FLTREQ0I, FLCTL_FLTREQ1I), | 161 | FLCTL_FLTREQ0I, FLCTL_FLTREQ1I), |
| 160 | INTC_GROUP(IIC1, IIC1_ALI1, IIC1_TACKI1, IIC1_WAITI1, IIC1_DTEI1), | 162 | INTC_GROUP(IIC1, IIC1_ALI1, IIC1_TACKI1, IIC1_WAITI1, IIC1_DTEI1), |
| 161 | INTC_GROUP(SDHI0, SDHI0_SDHI0I0, SDHI0_SDHI0I1, | ||
| 162 | SDHI0_SDHI0I2, SDHI0_SDHI0I3), | ||
| 163 | INTC_GROUP(SDHI1, SDHI1_SDHI1I0, SDHI1_SDHI1I1, | ||
| 164 | SDHI1_SDHI1I2, SDHI1_SDHI1I3), | ||
| 165 | INTC_GROUP(SDHI2, SDHI2_SDHI2I0, SDHI2_SDHI2I1, | ||
| 166 | SDHI2_SDHI2I2, SDHI2_SDHI2I3), | ||
| 167 | }; | 163 | }; |
| 168 | 164 | ||
| 169 | static struct intc_mask_reg intca_mask_registers[] = { | 165 | static struct intc_mask_reg intca_mask_registers[] = { |
| @@ -193,10 +189,10 @@ static struct intc_mask_reg intca_mask_registers[] = { | |||
| 193 | { SCIFB, SCIFA5, SCIFA4, MSIOF1, | 189 | { SCIFB, SCIFA5, SCIFA4, MSIOF1, |
| 194 | 0, 0, MSIOF2, 0 } }, | 190 | 0, 0, MSIOF2, 0 } }, |
| 195 | { 0xe694009c, 0xe69400dc, 8, /* IMR7A / IMCR7A */ | 191 | { 0xe694009c, 0xe69400dc, 8, /* IMR7A / IMCR7A */ |
| 196 | { SDHI0_SDHI0I3, SDHI0_SDHI0I2, SDHI0_SDHI0I1, SDHI0_SDHI0I0, | 192 | { DISABLED, DISABLED, ENABLED, ENABLED, |
| 197 | FLCTL_FLTREQ1I, FLCTL_FLTREQ0I, FLCTL_FLTENDI, FLCTL_FLSTEI } }, | 193 | FLCTL_FLTREQ1I, FLCTL_FLTREQ0I, FLCTL_FLTENDI, FLCTL_FLSTEI } }, |
| 198 | { 0xe69400a0, 0xe69400e0, 8, /* IMR8A / IMCR8A */ | 194 | { 0xe69400a0, 0xe69400e0, 8, /* IMR8A / IMCR8A */ |
| 199 | { SDHI1_SDHI1I3, SDHI1_SDHI1I2, SDHI1_SDHI1I1, SDHI1_SDHI1I0, | 195 | { DISABLED, DISABLED, ENABLED, ENABLED, |
| 200 | TTI20, USBDMAC_USHDMI, SPU, SIU } }, | 196 | TTI20, USBDMAC_USHDMI, SPU, SIU } }, |
| 201 | { 0xe69400a4, 0xe69400e4, 8, /* IMR9A / IMCR9A */ | 197 | { 0xe69400a4, 0xe69400e4, 8, /* IMR9A / IMCR9A */ |
| 202 | { CMT1_CMT13, CMT1_CMT12, CMT1_CMT11, CMT1_CMT10, | 198 | { CMT1_CMT13, CMT1_CMT12, CMT1_CMT11, CMT1_CMT10, |
| @@ -211,7 +207,7 @@ static struct intc_mask_reg intca_mask_registers[] = { | |||
| 211 | { 0, 0, TPU0, TPU1, | 207 | { 0, 0, TPU0, TPU1, |
| 212 | TPU2, TPU3, TPU4, 0 } }, | 208 | TPU2, TPU3, TPU4, 0 } }, |
| 213 | { 0xe69400b4, 0xe69400f4, 8, /* IMR13A / IMCR13A */ | 209 | { 0xe69400b4, 0xe69400f4, 8, /* IMR13A / IMCR13A */ |
| 214 | { SDHI2_SDHI2I3, SDHI2_SDHI2I2, SDHI2_SDHI2I1, SDHI2_SDHI2I0, | 210 | { DISABLED, DISABLED, ENABLED, ENABLED, |
| 215 | MISTY, CMT3, RWDT1, RWDT0 } }, | 211 | MISTY, CMT3, RWDT1, RWDT0 } }, |
| 216 | }; | 212 | }; |
| 217 | 213 | ||
| @@ -258,10 +254,14 @@ static struct intc_mask_reg intca_ack_registers[] __initdata = { | |||
| 258 | { IRQ8A, IRQ9A, IRQ10A, IRQ11A, IRQ12A, IRQ13A, IRQ14A, IRQ15A } }, | 254 | { IRQ8A, IRQ9A, IRQ10A, IRQ11A, IRQ12A, IRQ13A, IRQ14A, IRQ15A } }, |
| 259 | }; | 255 | }; |
| 260 | 256 | ||
| 261 | static DECLARE_INTC_DESC_ACK(intca_desc, "sh7367-intca", | 257 | static struct intc_desc intca_desc __initdata = { |
| 262 | intca_vectors, intca_groups, | 258 | .name = "sh7367-intca", |
| 263 | intca_mask_registers, intca_prio_registers, | 259 | .force_enable = ENABLED, |
| 264 | intca_sense_registers, intca_ack_registers); | 260 | .force_disable = DISABLED, |
| 261 | .hw = INTC_HW_DESC(intca_vectors, intca_groups, | ||
| 262 | intca_mask_registers, intca_prio_registers, | ||
| 263 | intca_sense_registers, intca_ack_registers), | ||
| 264 | }; | ||
| 265 | 265 | ||
| 266 | void __init sh7367_init_irq(void) | 266 | void __init sh7367_init_irq(void) |
| 267 | { | 267 | { |
diff --git a/arch/arm/mach-shmobile/intc-sh7372.c b/arch/arm/mach-shmobile/intc-sh7372.c index c57a923f97a6..3ce9d9bd5899 100644 --- a/arch/arm/mach-shmobile/intc-sh7372.c +++ b/arch/arm/mach-shmobile/intc-sh7372.c | |||
| @@ -27,6 +27,8 @@ | |||
| 27 | 27 | ||
| 28 | enum { | 28 | enum { |
| 29 | UNUSED_INTCA = 0, | 29 | UNUSED_INTCA = 0, |
| 30 | ENABLED, | ||
| 31 | DISABLED, | ||
| 30 | 32 | ||
| 31 | /* interrupt sources INTCA */ | 33 | /* interrupt sources INTCA */ |
| 32 | IRQ0A, IRQ1A, IRQ2A, IRQ3A, IRQ4A, IRQ5A, IRQ6A, IRQ7A, | 34 | IRQ0A, IRQ1A, IRQ2A, IRQ3A, IRQ4A, IRQ5A, IRQ6A, IRQ7A, |
| @@ -47,14 +49,14 @@ enum { | |||
| 47 | MSIOF2, MSIOF1, | 49 | MSIOF2, MSIOF1, |
| 48 | SCIFA4, SCIFA5, SCIFB, | 50 | SCIFA4, SCIFA5, SCIFB, |
| 49 | FLCTL_FLSTEI, FLCTL_FLTENDI, FLCTL_FLTREQ0I, FLCTL_FLTREQ1I, | 51 | FLCTL_FLSTEI, FLCTL_FLTENDI, FLCTL_FLTREQ0I, FLCTL_FLTREQ1I, |
| 50 | SDHI0_SDHI0I0, SDHI0_SDHI0I1, SDHI0_SDHI0I2, SDHI0_SDHI0I3, | 52 | SDHI0, |
| 51 | SDHI1_SDHI1I0, SDHI1_SDHI1I1, SDHI1_SDHI1I2, | 53 | SDHI1, |
| 52 | IRREM, | 54 | IRREM, |
| 53 | IRDA, | 55 | IRDA, |
| 54 | TPU0, | 56 | TPU0, |
| 55 | TTI20, | 57 | TTI20, |
| 56 | DDM, | 58 | DDM, |
| 57 | SDHI2_SDHI2I0, SDHI2_SDHI2I1, SDHI2_SDHI2I2, SDHI2_SDHI2I3, | 59 | SDHI2, |
| 58 | RWDT0, | 60 | RWDT0, |
| 59 | DMAC1_1_DEI0, DMAC1_1_DEI1, DMAC1_1_DEI2, DMAC1_1_DEI3, | 61 | DMAC1_1_DEI0, DMAC1_1_DEI1, DMAC1_1_DEI2, DMAC1_1_DEI3, |
| 60 | DMAC1_2_DEI4, DMAC1_2_DEI5, DMAC1_2_DADERR, | 62 | DMAC1_2_DEI4, DMAC1_2_DEI5, DMAC1_2_DADERR, |
| @@ -82,7 +84,7 @@ enum { | |||
| 82 | 84 | ||
| 83 | /* interrupt groups INTCA */ | 85 | /* interrupt groups INTCA */ |
| 84 | DMAC1_1, DMAC1_2, DMAC2_1, DMAC2_2, DMAC3_1, DMAC3_2, SHWYSTAT, | 86 | DMAC1_1, DMAC1_2, DMAC2_1, DMAC2_2, DMAC3_1, DMAC3_2, SHWYSTAT, |
| 85 | AP_ARM1, AP_ARM2, SPU2, FLCTL, IIC1, SDHI0, SDHI1, SDHI2 | 87 | AP_ARM1, AP_ARM2, SPU2, FLCTL, IIC1 |
| 86 | }; | 88 | }; |
| 87 | 89 | ||
| 88 | static struct intc_vect intca_vectors[] __initdata = { | 90 | static struct intc_vect intca_vectors[] __initdata = { |
| @@ -123,17 +125,17 @@ static struct intc_vect intca_vectors[] __initdata = { | |||
| 123 | INTC_VECT(SCIFB, 0x0d60), | 125 | INTC_VECT(SCIFB, 0x0d60), |
| 124 | INTC_VECT(FLCTL_FLSTEI, 0x0d80), INTC_VECT(FLCTL_FLTENDI, 0x0da0), | 126 | INTC_VECT(FLCTL_FLSTEI, 0x0d80), INTC_VECT(FLCTL_FLTENDI, 0x0da0), |
| 125 | INTC_VECT(FLCTL_FLTREQ0I, 0x0dc0), INTC_VECT(FLCTL_FLTREQ1I, 0x0de0), | 127 | INTC_VECT(FLCTL_FLTREQ0I, 0x0dc0), INTC_VECT(FLCTL_FLTREQ1I, 0x0de0), |
| 126 | INTC_VECT(SDHI0_SDHI0I0, 0x0e00), INTC_VECT(SDHI0_SDHI0I1, 0x0e20), | 128 | INTC_VECT(SDHI0, 0x0e00), INTC_VECT(SDHI0, 0x0e20), |
| 127 | INTC_VECT(SDHI0_SDHI0I2, 0x0e40), INTC_VECT(SDHI0_SDHI0I3, 0x0e60), | 129 | INTC_VECT(SDHI0, 0x0e40), INTC_VECT(SDHI0, 0x0e60), |
| 128 | INTC_VECT(SDHI1_SDHI1I0, 0x0e80), INTC_VECT(SDHI1_SDHI1I1, 0x0ea0), | 130 | INTC_VECT(SDHI1, 0x0e80), INTC_VECT(SDHI1, 0x0ea0), |
| 129 | INTC_VECT(SDHI1_SDHI1I2, 0x0ec0), | 131 | INTC_VECT(SDHI1, 0x0ec0), |
| 130 | INTC_VECT(IRREM, 0x0f60), | 132 | INTC_VECT(IRREM, 0x0f60), |
| 131 | INTC_VECT(IRDA, 0x0480), | 133 | INTC_VECT(IRDA, 0x0480), |
| 132 | INTC_VECT(TPU0, 0x04a0), | 134 | INTC_VECT(TPU0, 0x04a0), |
| 133 | INTC_VECT(TTI20, 0x1100), | 135 | INTC_VECT(TTI20, 0x1100), |
| 134 | INTC_VECT(DDM, 0x1140), | 136 | INTC_VECT(DDM, 0x1140), |
| 135 | INTC_VECT(SDHI2_SDHI2I0, 0x1200), INTC_VECT(SDHI2_SDHI2I1, 0x1220), | 137 | INTC_VECT(SDHI2, 0x1200), INTC_VECT(SDHI2, 0x1220), |
| 136 | INTC_VECT(SDHI2_SDHI2I2, 0x1240), INTC_VECT(SDHI2_SDHI2I3, 0x1260), | 138 | INTC_VECT(SDHI2, 0x1240), INTC_VECT(SDHI2, 0x1260), |
| 137 | INTC_VECT(RWDT0, 0x1280), | 139 | INTC_VECT(RWDT0, 0x1280), |
| 138 | INTC_VECT(DMAC1_1_DEI0, 0x2000), INTC_VECT(DMAC1_1_DEI1, 0x2020), | 140 | INTC_VECT(DMAC1_1_DEI0, 0x2000), INTC_VECT(DMAC1_1_DEI1, 0x2020), |
| 139 | INTC_VECT(DMAC1_1_DEI2, 0x2040), INTC_VECT(DMAC1_1_DEI3, 0x2060), | 141 | INTC_VECT(DMAC1_1_DEI2, 0x2040), INTC_VECT(DMAC1_1_DEI3, 0x2060), |
| @@ -193,12 +195,6 @@ static struct intc_group intca_groups[] __initdata = { | |||
| 193 | INTC_GROUP(FLCTL, FLCTL_FLSTEI, FLCTL_FLTENDI, | 195 | INTC_GROUP(FLCTL, FLCTL_FLSTEI, FLCTL_FLTENDI, |
| 194 | FLCTL_FLTREQ0I, FLCTL_FLTREQ1I), | 196 | FLCTL_FLTREQ0I, FLCTL_FLTREQ1I), |
| 195 | INTC_GROUP(IIC1, IIC1_ALI1, IIC1_TACKI1, IIC1_WAITI1, IIC1_DTEI1), | 197 | INTC_GROUP(IIC1, IIC1_ALI1, IIC1_TACKI1, IIC1_WAITI1, IIC1_DTEI1), |
| 196 | INTC_GROUP(SDHI0, SDHI0_SDHI0I0, SDHI0_SDHI0I1, | ||
| 197 | SDHI0_SDHI0I2, SDHI0_SDHI0I3), | ||
| 198 | INTC_GROUP(SDHI1, SDHI1_SDHI1I0, SDHI1_SDHI1I1, | ||
| 199 | SDHI1_SDHI1I2), | ||
| 200 | INTC_GROUP(SDHI2, SDHI2_SDHI2I0, SDHI2_SDHI2I1, | ||
| 201 | SDHI2_SDHI2I2, SDHI2_SDHI2I3), | ||
| 202 | INTC_GROUP(SHWYSTAT, SHWYSTAT_RT, SHWYSTAT_HS, SHWYSTAT_COM), | 198 | INTC_GROUP(SHWYSTAT, SHWYSTAT_RT, SHWYSTAT_HS, SHWYSTAT_COM), |
| 203 | }; | 199 | }; |
| 204 | 200 | ||
| @@ -234,10 +230,10 @@ static struct intc_mask_reg intca_mask_registers[] __initdata = { | |||
| 234 | { SCIFB, SCIFA5, SCIFA4, MSIOF1, | 230 | { SCIFB, SCIFA5, SCIFA4, MSIOF1, |
| 235 | 0, 0, MSIOF2, 0 } }, | 231 | 0, 0, MSIOF2, 0 } }, |
| 236 | { 0xe694009c, 0xe69400dc, 8, /* IMR7A / IMCR7A */ | 232 | { 0xe694009c, 0xe69400dc, 8, /* IMR7A / IMCR7A */ |
| 237 | { SDHI0_SDHI0I3, SDHI0_SDHI0I2, SDHI0_SDHI0I1, SDHI0_SDHI0I0, | 233 | { DISABLED, DISABLED, ENABLED, ENABLED, |
| 238 | FLCTL_FLTREQ1I, FLCTL_FLTREQ0I, FLCTL_FLTENDI, FLCTL_FLSTEI } }, | 234 | FLCTL_FLTREQ1I, FLCTL_FLTREQ0I, FLCTL_FLTENDI, FLCTL_FLSTEI } }, |
| 239 | { 0xe69400a0, 0xe69400e0, 8, /* IMR8A / IMCR8A */ | 235 | { 0xe69400a0, 0xe69400e0, 8, /* IMR8A / IMCR8A */ |
| 240 | { 0, SDHI1_SDHI1I2, SDHI1_SDHI1I1, SDHI1_SDHI1I0, | 236 | { 0, DISABLED, ENABLED, ENABLED, |
| 241 | TTI20, USBHSDMAC0_USHDMI, 0, 0 } }, | 237 | TTI20, USBHSDMAC0_USHDMI, 0, 0 } }, |
| 242 | { 0xe69400a4, 0xe69400e4, 8, /* IMR9A / IMCR9A */ | 238 | { 0xe69400a4, 0xe69400e4, 8, /* IMR9A / IMCR9A */ |
| 243 | { CMT1_CMT13, CMT1_CMT12, CMT1_CMT11, CMT1_CMT10, | 239 | { CMT1_CMT13, CMT1_CMT12, CMT1_CMT11, CMT1_CMT10, |
| @@ -252,7 +248,7 @@ static struct intc_mask_reg intca_mask_registers[] __initdata = { | |||
| 252 | { 0, 0, TPU0, 0, | 248 | { 0, 0, TPU0, 0, |
| 253 | 0, 0, 0, 0 } }, | 249 | 0, 0, 0, 0 } }, |
| 254 | { 0xe69400b4, 0xe69400f4, 8, /* IMR13A / IMCR13A */ | 250 | { 0xe69400b4, 0xe69400f4, 8, /* IMR13A / IMCR13A */ |
| 255 | { SDHI2_SDHI2I3, SDHI2_SDHI2I2, SDHI2_SDHI2I1, SDHI2_SDHI2I0, | 251 | { DISABLED, DISABLED, ENABLED, ENABLED, |
| 256 | 0, CMT3, 0, RWDT0 } }, | 252 | 0, CMT3, 0, RWDT0 } }, |
| 257 | { 0xe6950080, 0xe69500c0, 8, /* IMR0A3 / IMCR0A3 */ | 253 | { 0xe6950080, 0xe69500c0, 8, /* IMR0A3 / IMCR0A3 */ |
| 258 | { SHWYSTAT_RT, SHWYSTAT_HS, SHWYSTAT_COM, 0, | 254 | { SHWYSTAT_RT, SHWYSTAT_HS, SHWYSTAT_COM, 0, |
| @@ -358,10 +354,14 @@ static struct intc_mask_reg intca_ack_registers[] __initdata = { | |||
| 358 | { IRQ24A, IRQ25A, IRQ26A, IRQ27A, IRQ28A, IRQ29A, IRQ30A, IRQ31A } }, | 354 | { IRQ24A, IRQ25A, IRQ26A, IRQ27A, IRQ28A, IRQ29A, IRQ30A, IRQ31A } }, |
| 359 | }; | 355 | }; |
| 360 | 356 | ||
| 361 | static DECLARE_INTC_DESC_ACK(intca_desc, "sh7372-intca", | 357 | static struct intc_desc intca_desc __initdata = { |
| 362 | intca_vectors, intca_groups, | 358 | .name = "sh7372-intca", |
| 363 | intca_mask_registers, intca_prio_registers, | 359 | .force_enable = ENABLED, |
| 364 | intca_sense_registers, intca_ack_registers); | 360 | .force_disable = DISABLED, |
| 361 | .hw = INTC_HW_DESC(intca_vectors, intca_groups, | ||
| 362 | intca_mask_registers, intca_prio_registers, | ||
| 363 | intca_sense_registers, intca_ack_registers), | ||
| 364 | }; | ||
| 365 | 365 | ||
| 366 | void __init sh7372_init_irq(void) | 366 | void __init sh7372_init_irq(void) |
| 367 | { | 367 | { |
diff --git a/arch/arm/mach-shmobile/intc-sh7377.c b/arch/arm/mach-shmobile/intc-sh7377.c index 125021cfba5c..5c781e2d1897 100644 --- a/arch/arm/mach-shmobile/intc-sh7377.c +++ b/arch/arm/mach-shmobile/intc-sh7377.c | |||
| @@ -27,6 +27,8 @@ | |||
| 27 | 27 | ||
| 28 | enum { | 28 | enum { |
| 29 | UNUSED_INTCA = 0, | 29 | UNUSED_INTCA = 0, |
| 30 | ENABLED, | ||
| 31 | DISABLED, | ||
| 30 | 32 | ||
| 31 | /* interrupt sources INTCA */ | 33 | /* interrupt sources INTCA */ |
| 32 | IRQ0A, IRQ1A, IRQ2A, IRQ3A, IRQ4A, IRQ5A, IRQ6A, IRQ7A, | 34 | IRQ0A, IRQ1A, IRQ2A, IRQ3A, IRQ4A, IRQ5A, IRQ6A, IRQ7A, |
| @@ -49,8 +51,8 @@ enum { | |||
| 49 | MSIOF2, MSIOF1, | 51 | MSIOF2, MSIOF1, |
| 50 | SCIFA4, SCIFA5, SCIFB, | 52 | SCIFA4, SCIFA5, SCIFB, |
| 51 | FLCTL_FLSTEI, FLCTL_FLTENDI, FLCTL_FLTREQ0I, FLCTL_FLTREQ1I, | 53 | FLCTL_FLSTEI, FLCTL_FLTENDI, FLCTL_FLTREQ0I, FLCTL_FLTREQ1I, |
| 52 | SDHI0_SDHI0I0, SDHI0_SDHI0I1, SDHI0_SDHI0I2, SDHI0_SDHI0I3, | 54 | SDHI0, |
| 53 | SDHI1_SDHI1I0, SDHI1_SDHI1I1, SDHI1_SDHI1I2, SDHI1_SDHI1I3, | 55 | SDHI1, |
| 54 | MSU_MSU, MSU_MSU2, | 56 | MSU_MSU, MSU_MSU2, |
| 55 | IRREM, | 57 | IRREM, |
| 56 | MSUG, | 58 | MSUG, |
| @@ -84,7 +86,7 @@ enum { | |||
| 84 | 86 | ||
| 85 | /* interrupt groups INTCA */ | 87 | /* interrupt groups INTCA */ |
| 86 | DMAC_1, DMAC_2, DMAC2_1, DMAC2_2, DMAC3_1, DMAC3_2, SHWYSTAT, | 88 | DMAC_1, DMAC_2, DMAC2_1, DMAC2_2, DMAC3_1, DMAC3_2, SHWYSTAT, |
| 87 | AP_ARM1, AP_ARM2, USBHS, SPU2, FLCTL, IIC1, SDHI0, SDHI1, | 89 | AP_ARM1, AP_ARM2, USBHS, SPU2, FLCTL, IIC1, |
| 88 | ICUSB, ICUDMC | 90 | ICUSB, ICUDMC |
| 89 | }; | 91 | }; |
| 90 | 92 | ||
| @@ -128,10 +130,10 @@ static struct intc_vect intca_vectors[] = { | |||
| 128 | INTC_VECT(SCIFB, 0x0d60), | 130 | INTC_VECT(SCIFB, 0x0d60), |
| 129 | INTC_VECT(FLCTL_FLSTEI, 0x0d80), INTC_VECT(FLCTL_FLTENDI, 0x0da0), | 131 | INTC_VECT(FLCTL_FLSTEI, 0x0d80), INTC_VECT(FLCTL_FLTENDI, 0x0da0), |
| 130 | INTC_VECT(FLCTL_FLTREQ0I, 0x0dc0), INTC_VECT(FLCTL_FLTREQ1I, 0x0de0), | 132 | INTC_VECT(FLCTL_FLTREQ0I, 0x0dc0), INTC_VECT(FLCTL_FLTREQ1I, 0x0de0), |
| 131 | INTC_VECT(SDHI0_SDHI0I0, 0x0e00), INTC_VECT(SDHI0_SDHI0I1, 0x0e20), | 133 | INTC_VECT(SDHI0, 0x0e00), INTC_VECT(SDHI0, 0x0e20), |
| 132 | INTC_VECT(SDHI0_SDHI0I2, 0x0e40), INTC_VECT(SDHI0_SDHI0I3, 0x0e60), | 134 | INTC_VECT(SDHI0, 0x0e40), INTC_VECT(SDHI0, 0x0e60), |
| 133 | INTC_VECT(SDHI1_SDHI1I0, 0x0e80), INTC_VECT(SDHI1_SDHI1I1, 0x0ea0), | 135 | INTC_VECT(SDHI1, 0x0e80), INTC_VECT(SDHI1, 0x0ea0), |
| 134 | INTC_VECT(SDHI1_SDHI1I2, 0x0ec0), INTC_VECT(SDHI1_SDHI1I3, 0x0ee0), | 136 | INTC_VECT(SDHI1, 0x0ec0), INTC_VECT(SDHI1, 0x0ee0), |
| 135 | INTC_VECT(MSU_MSU, 0x0f20), INTC_VECT(MSU_MSU2, 0x0f40), | 137 | INTC_VECT(MSU_MSU, 0x0f20), INTC_VECT(MSU_MSU2, 0x0f40), |
| 136 | INTC_VECT(IRREM, 0x0f60), | 138 | INTC_VECT(IRREM, 0x0f60), |
| 137 | INTC_VECT(MSUG, 0x0fa0), | 139 | INTC_VECT(MSUG, 0x0fa0), |
| @@ -195,10 +197,6 @@ static struct intc_group intca_groups[] __initdata = { | |||
| 195 | INTC_GROUP(FLCTL, FLCTL_FLSTEI, FLCTL_FLTENDI, | 197 | INTC_GROUP(FLCTL, FLCTL_FLSTEI, FLCTL_FLTENDI, |
| 196 | FLCTL_FLTREQ0I, FLCTL_FLTREQ1I), | 198 | FLCTL_FLTREQ0I, FLCTL_FLTREQ1I), |
| 197 | INTC_GROUP(IIC1, IIC1_ALI1, IIC1_TACKI1, IIC1_WAITI1, IIC1_DTEI1), | 199 | INTC_GROUP(IIC1, IIC1_ALI1, IIC1_TACKI1, IIC1_WAITI1, IIC1_DTEI1), |
| 198 | INTC_GROUP(SDHI0, SDHI0_SDHI0I0, SDHI0_SDHI0I1, | ||
| 199 | SDHI0_SDHI0I2, SDHI0_SDHI0I3), | ||
| 200 | INTC_GROUP(SDHI1, SDHI1_SDHI1I0, SDHI1_SDHI1I1, | ||
| 201 | SDHI1_SDHI1I2, SDHI1_SDHI1I3), | ||
| 202 | INTC_GROUP(SHWYSTAT, SHWYSTAT_RT, SHWYSTAT_HS, SHWYSTAT_COM), | 200 | INTC_GROUP(SHWYSTAT, SHWYSTAT_RT, SHWYSTAT_HS, SHWYSTAT_COM), |
| 203 | INTC_GROUP(ICUSB, ICUSB_ICUSB0, ICUSB_ICUSB1), | 201 | INTC_GROUP(ICUSB, ICUSB_ICUSB0, ICUSB_ICUSB1), |
| 204 | INTC_GROUP(ICUDMC, ICUDMC_ICUDMC1, ICUDMC_ICUDMC2), | 202 | INTC_GROUP(ICUDMC, ICUDMC_ICUDMC1, ICUDMC_ICUDMC2), |
| @@ -236,10 +234,10 @@ static struct intc_mask_reg intca_mask_registers[] = { | |||
| 236 | { SCIFB, SCIFA5, SCIFA4, MSIOF1, | 234 | { SCIFB, SCIFA5, SCIFA4, MSIOF1, |
| 237 | 0, 0, MSIOF2, 0 } }, | 235 | 0, 0, MSIOF2, 0 } }, |
| 238 | { 0xe694009c, 0xe69400dc, 8, /* IMR7A / IMCR7A */ | 236 | { 0xe694009c, 0xe69400dc, 8, /* IMR7A / IMCR7A */ |
| 239 | { SDHI0_SDHI0I3, SDHI0_SDHI0I2, SDHI0_SDHI0I1, SDHI0_SDHI0I0, | 237 | { DISABLED, DISABLED, ENABLED, ENABLED, |
| 240 | FLCTL_FLTREQ1I, FLCTL_FLTREQ0I, FLCTL_FLTENDI, FLCTL_FLSTEI } }, | 238 | FLCTL_FLTREQ1I, FLCTL_FLTREQ0I, FLCTL_FLTENDI, FLCTL_FLSTEI } }, |
| 241 | { 0xe69400a0, 0xe69400e0, 8, /* IMR8A / IMCR8A */ | 239 | { 0xe69400a0, 0xe69400e0, 8, /* IMR8A / IMCR8A */ |
| 242 | { SDHI1_SDHI1I3, SDHI1_SDHI1I2, SDHI1_SDHI1I1, SDHI1_SDHI1I0, | 240 | { DISABLED, DISABLED, ENABLED, ENABLED, |
| 243 | TTI20, USBDMAC_USHDMI, 0, MSUG } }, | 241 | TTI20, USBDMAC_USHDMI, 0, MSUG } }, |
| 244 | { 0xe69400a4, 0xe69400e4, 8, /* IMR9A / IMCR9A */ | 242 | { 0xe69400a4, 0xe69400e4, 8, /* IMR9A / IMCR9A */ |
| 245 | { CMT1_CMT13, CMT1_CMT12, CMT1_CMT11, CMT1_CMT10, | 243 | { CMT1_CMT13, CMT1_CMT12, CMT1_CMT11, CMT1_CMT10, |
| @@ -339,10 +337,14 @@ static struct intc_mask_reg intca_ack_registers[] __initdata = { | |||
| 339 | { IRQ24A, IRQ25A, IRQ26A, IRQ27A, IRQ28A, IRQ29A, IRQ30A, IRQ31A } }, | 337 | { IRQ24A, IRQ25A, IRQ26A, IRQ27A, IRQ28A, IRQ29A, IRQ30A, IRQ31A } }, |
| 340 | }; | 338 | }; |
| 341 | 339 | ||
| 342 | static DECLARE_INTC_DESC_ACK(intca_desc, "sh7377-intca", | 340 | static struct intc_desc intca_desc __initdata = { |
| 343 | intca_vectors, intca_groups, | 341 | .name = "sh7377-intca", |
| 344 | intca_mask_registers, intca_prio_registers, | 342 | .force_enable = ENABLED, |
| 345 | intca_sense_registers, intca_ack_registers); | 343 | .force_disable = DISABLED, |
| 344 | .hw = INTC_HW_DESC(intca_vectors, intca_groups, | ||
| 345 | intca_mask_registers, intca_prio_registers, | ||
| 346 | intca_sense_registers, intca_ack_registers), | ||
| 347 | }; | ||
| 346 | 348 | ||
| 347 | void __init sh7377_init_irq(void) | 349 | void __init sh7377_init_irq(void) |
| 348 | { | 350 | { |
diff --git a/arch/powerpc/kernel/perf_event.c b/arch/powerpc/kernel/perf_event.c index b6cf8f1f4d35..5120bd44f69a 100644 --- a/arch/powerpc/kernel/perf_event.c +++ b/arch/powerpc/kernel/perf_event.c | |||
| @@ -1164,10 +1164,10 @@ static void record_and_restart(struct perf_event *event, unsigned long val, | |||
| 1164 | * Finally record data if requested. | 1164 | * Finally record data if requested. |
| 1165 | */ | 1165 | */ |
| 1166 | if (record) { | 1166 | if (record) { |
| 1167 | struct perf_sample_data data = { | 1167 | struct perf_sample_data data; |
| 1168 | .addr = ~0ULL, | 1168 | |
| 1169 | .period = event->hw.last_period, | 1169 | perf_sample_data_init(&data, ~0ULL); |
| 1170 | }; | 1170 | data.period = event->hw.last_period; |
| 1171 | 1171 | ||
| 1172 | if (event->attr.sample_type & PERF_SAMPLE_ADDR) | 1172 | if (event->attr.sample_type & PERF_SAMPLE_ADDR) |
| 1173 | perf_get_data_addr(regs, &data.addr); | 1173 | perf_get_data_addr(regs, &data.addr); |
diff --git a/arch/sparc/kernel/perf_event.c b/arch/sparc/kernel/perf_event.c index b867ab3353b4..68cb9b42088f 100644 --- a/arch/sparc/kernel/perf_event.c +++ b/arch/sparc/kernel/perf_event.c | |||
| @@ -1189,7 +1189,7 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self, | |||
| 1189 | 1189 | ||
| 1190 | regs = args->regs; | 1190 | regs = args->regs; |
| 1191 | 1191 | ||
| 1192 | data.addr = 0; | 1192 | perf_sample_data_init(&data, 0); |
| 1193 | 1193 | ||
| 1194 | cpuc = &__get_cpu_var(cpu_hw_events); | 1194 | cpuc = &__get_cpu_var(cpu_hw_events); |
| 1195 | 1195 | ||
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 93936de67796..0eacb1ffb421 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -662,7 +662,7 @@ config GART_IOMMU | |||
| 662 | bool "GART IOMMU support" if EMBEDDED | 662 | bool "GART IOMMU support" if EMBEDDED |
| 663 | default y | 663 | default y |
| 664 | select SWIOTLB | 664 | select SWIOTLB |
| 665 | depends on X86_64 && PCI | 665 | depends on X86_64 && PCI && K8_NB |
| 666 | ---help--- | 666 | ---help--- |
| 667 | Support for full DMA access of devices with 32bit memory access only | 667 | Support for full DMA access of devices with 32bit memory access only |
| 668 | on systems with more than 3GB. This is usually needed for USB, | 668 | on systems with more than 3GB. This is usually needed for USB, |
| @@ -2061,7 +2061,7 @@ endif # X86_32 | |||
| 2061 | 2061 | ||
| 2062 | config K8_NB | 2062 | config K8_NB |
| 2063 | def_bool y | 2063 | def_bool y |
| 2064 | depends on AGP_AMD64 || (X86_64 && (GART_IOMMU || (PCI && NUMA))) | 2064 | depends on CPU_SUP_AMD && PCI |
| 2065 | 2065 | ||
| 2066 | source "drivers/pcmcia/Kconfig" | 2066 | source "drivers/pcmcia/Kconfig" |
| 2067 | 2067 | ||
diff --git a/arch/x86/include/asm/hw_breakpoint.h b/arch/x86/include/asm/hw_breakpoint.h index 0675a7c4c20e..2a1bd8f4f23a 100644 --- a/arch/x86/include/asm/hw_breakpoint.h +++ b/arch/x86/include/asm/hw_breakpoint.h | |||
| @@ -10,7 +10,6 @@ | |||
| 10 | * (display/resolving) | 10 | * (display/resolving) |
| 11 | */ | 11 | */ |
| 12 | struct arch_hw_breakpoint { | 12 | struct arch_hw_breakpoint { |
| 13 | char *name; /* Contains name of the symbol to set bkpt */ | ||
| 14 | unsigned long address; | 13 | unsigned long address; |
| 15 | u8 len; | 14 | u8 len; |
| 16 | u8 type; | 15 | u8 type; |
diff --git a/arch/x86/include/asm/perf_event.h b/arch/x86/include/asm/perf_event.h index befd172c82ad..db6109a885a7 100644 --- a/arch/x86/include/asm/perf_event.h +++ b/arch/x86/include/asm/perf_event.h | |||
| @@ -18,7 +18,7 @@ | |||
| 18 | #define MSR_ARCH_PERFMON_EVENTSEL0 0x186 | 18 | #define MSR_ARCH_PERFMON_EVENTSEL0 0x186 |
| 19 | #define MSR_ARCH_PERFMON_EVENTSEL1 0x187 | 19 | #define MSR_ARCH_PERFMON_EVENTSEL1 0x187 |
| 20 | 20 | ||
| 21 | #define ARCH_PERFMON_EVENTSEL0_ENABLE (1 << 22) | 21 | #define ARCH_PERFMON_EVENTSEL_ENABLE (1 << 22) |
| 22 | #define ARCH_PERFMON_EVENTSEL_ANY (1 << 21) | 22 | #define ARCH_PERFMON_EVENTSEL_ANY (1 << 21) |
| 23 | #define ARCH_PERFMON_EVENTSEL_INT (1 << 20) | 23 | #define ARCH_PERFMON_EVENTSEL_INT (1 << 20) |
| 24 | #define ARCH_PERFMON_EVENTSEL_OS (1 << 17) | 24 | #define ARCH_PERFMON_EVENTSEL_OS (1 << 17) |
| @@ -50,7 +50,7 @@ | |||
| 50 | INTEL_ARCH_INV_MASK| \ | 50 | INTEL_ARCH_INV_MASK| \ |
| 51 | INTEL_ARCH_EDGE_MASK|\ | 51 | INTEL_ARCH_EDGE_MASK|\ |
| 52 | INTEL_ARCH_UNIT_MASK|\ | 52 | INTEL_ARCH_UNIT_MASK|\ |
| 53 | INTEL_ARCH_EVTSEL_MASK) | 53 | INTEL_ARCH_EVENT_MASK) |
| 54 | 54 | ||
| 55 | #define ARCH_PERFMON_UNHALTED_CORE_CYCLES_SEL 0x3c | 55 | #define ARCH_PERFMON_UNHALTED_CORE_CYCLES_SEL 0x3c |
| 56 | #define ARCH_PERFMON_UNHALTED_CORE_CYCLES_UMASK (0x00 << 8) | 56 | #define ARCH_PERFMON_UNHALTED_CORE_CYCLES_UMASK (0x00 << 8) |
| @@ -117,6 +117,18 @@ union cpuid10_edx { | |||
| 117 | */ | 117 | */ |
| 118 | #define X86_PMC_IDX_FIXED_BTS (X86_PMC_IDX_FIXED + 16) | 118 | #define X86_PMC_IDX_FIXED_BTS (X86_PMC_IDX_FIXED + 16) |
| 119 | 119 | ||
| 120 | /* IbsFetchCtl bits/masks */ | ||
| 121 | #define IBS_FETCH_RAND_EN (1ULL<<57) | ||
| 122 | #define IBS_FETCH_VAL (1ULL<<49) | ||
| 123 | #define IBS_FETCH_ENABLE (1ULL<<48) | ||
| 124 | #define IBS_FETCH_CNT 0xFFFF0000ULL | ||
| 125 | #define IBS_FETCH_MAX_CNT 0x0000FFFFULL | ||
| 126 | |||
| 127 | /* IbsOpCtl bits */ | ||
| 128 | #define IBS_OP_CNT_CTL (1ULL<<19) | ||
| 129 | #define IBS_OP_VAL (1ULL<<18) | ||
| 130 | #define IBS_OP_ENABLE (1ULL<<17) | ||
| 131 | #define IBS_OP_MAX_CNT 0x0000FFFFULL | ||
| 120 | 132 | ||
| 121 | #ifdef CONFIG_PERF_EVENTS | 133 | #ifdef CONFIG_PERF_EVENTS |
| 122 | extern void init_hw_perf_events(void); | 134 | extern void init_hw_perf_events(void); |
diff --git a/arch/x86/kernel/aperture_64.c b/arch/x86/kernel/aperture_64.c index f147a95fd84a..3704997e8b25 100644 --- a/arch/x86/kernel/aperture_64.c +++ b/arch/x86/kernel/aperture_64.c | |||
| @@ -31,7 +31,6 @@ | |||
| 31 | #include <asm/x86_init.h> | 31 | #include <asm/x86_init.h> |
| 32 | 32 | ||
| 33 | int gart_iommu_aperture; | 33 | int gart_iommu_aperture; |
| 34 | EXPORT_SYMBOL_GPL(gart_iommu_aperture); | ||
| 35 | int gart_iommu_aperture_disabled __initdata; | 34 | int gart_iommu_aperture_disabled __initdata; |
| 36 | int gart_iommu_aperture_allowed __initdata; | 35 | int gart_iommu_aperture_allowed __initdata; |
| 37 | 36 | ||
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index 3740c8a4eae7..49dbeaef2a27 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | |||
| @@ -120,11 +120,9 @@ EXPORT_SYMBOL_GPL(uv_possible_blades); | |||
| 120 | unsigned long sn_rtc_cycles_per_second; | 120 | unsigned long sn_rtc_cycles_per_second; |
| 121 | EXPORT_SYMBOL(sn_rtc_cycles_per_second); | 121 | EXPORT_SYMBOL(sn_rtc_cycles_per_second); |
| 122 | 122 | ||
| 123 | /* Start with all IRQs pointing to boot CPU. IRQ balancing will shift them. */ | ||
| 124 | |||
| 125 | static const struct cpumask *uv_target_cpus(void) | 123 | static const struct cpumask *uv_target_cpus(void) |
| 126 | { | 124 | { |
| 127 | return cpumask_of(0); | 125 | return cpu_online_mask; |
| 128 | } | 126 | } |
| 129 | 127 | ||
| 130 | static void uv_vector_allocation_domain(int cpu, struct cpumask *retmask) | 128 | static void uv_vector_allocation_domain(int cpu, struct cpumask *retmask) |
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index 879666f4d871..7e1cca13af35 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c | |||
| @@ -70,7 +70,8 @@ static void __cpuinit early_init_intel(struct cpuinfo_x86 *c) | |||
| 70 | if (c->x86_power & (1 << 8)) { | 70 | if (c->x86_power & (1 << 8)) { |
| 71 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); | 71 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); |
| 72 | set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC); | 72 | set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC); |
| 73 | sched_clock_stable = 1; | 73 | if (!check_tsc_unstable()) |
| 74 | sched_clock_stable = 1; | ||
| 74 | } | 75 | } |
| 75 | 76 | ||
| 76 | /* | 77 | /* |
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index 28cba46bf32c..3ab9c886b613 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
| @@ -46,6 +46,13 @@ | |||
| 46 | 46 | ||
| 47 | #include "mce-internal.h" | 47 | #include "mce-internal.h" |
| 48 | 48 | ||
| 49 | static DEFINE_MUTEX(mce_read_mutex); | ||
| 50 | |||
| 51 | #define rcu_dereference_check_mce(p) \ | ||
| 52 | rcu_dereference_check((p), \ | ||
| 53 | rcu_read_lock_sched_held() || \ | ||
| 54 | lockdep_is_held(&mce_read_mutex)) | ||
| 55 | |||
| 49 | #define CREATE_TRACE_POINTS | 56 | #define CREATE_TRACE_POINTS |
| 50 | #include <trace/events/mce.h> | 57 | #include <trace/events/mce.h> |
| 51 | 58 | ||
| @@ -158,7 +165,7 @@ void mce_log(struct mce *mce) | |||
| 158 | mce->finished = 0; | 165 | mce->finished = 0; |
| 159 | wmb(); | 166 | wmb(); |
| 160 | for (;;) { | 167 | for (;;) { |
| 161 | entry = rcu_dereference(mcelog.next); | 168 | entry = rcu_dereference_check_mce(mcelog.next); |
| 162 | for (;;) { | 169 | for (;;) { |
| 163 | /* | 170 | /* |
| 164 | * When the buffer fills up discard new entries. | 171 | * When the buffer fills up discard new entries. |
| @@ -1485,8 +1492,6 @@ static void collect_tscs(void *data) | |||
| 1485 | rdtscll(cpu_tsc[smp_processor_id()]); | 1492 | rdtscll(cpu_tsc[smp_processor_id()]); |
| 1486 | } | 1493 | } |
| 1487 | 1494 | ||
| 1488 | static DEFINE_MUTEX(mce_read_mutex); | ||
| 1489 | |||
| 1490 | static ssize_t mce_read(struct file *filp, char __user *ubuf, size_t usize, | 1495 | static ssize_t mce_read(struct file *filp, char __user *ubuf, size_t usize, |
| 1491 | loff_t *off) | 1496 | loff_t *off) |
| 1492 | { | 1497 | { |
| @@ -1500,7 +1505,7 @@ static ssize_t mce_read(struct file *filp, char __user *ubuf, size_t usize, | |||
| 1500 | return -ENOMEM; | 1505 | return -ENOMEM; |
| 1501 | 1506 | ||
| 1502 | mutex_lock(&mce_read_mutex); | 1507 | mutex_lock(&mce_read_mutex); |
| 1503 | next = rcu_dereference(mcelog.next); | 1508 | next = rcu_dereference_check_mce(mcelog.next); |
| 1504 | 1509 | ||
| 1505 | /* Only supports full reads right now */ | 1510 | /* Only supports full reads right now */ |
| 1506 | if (*off != 0 || usize < MCE_LOG_LEN*sizeof(struct mce)) { | 1511 | if (*off != 0 || usize < MCE_LOG_LEN*sizeof(struct mce)) { |
| @@ -1565,7 +1570,7 @@ timeout: | |||
| 1565 | static unsigned int mce_poll(struct file *file, poll_table *wait) | 1570 | static unsigned int mce_poll(struct file *file, poll_table *wait) |
| 1566 | { | 1571 | { |
| 1567 | poll_wait(file, &mce_wait, wait); | 1572 | poll_wait(file, &mce_wait, wait); |
| 1568 | if (rcu_dereference(mcelog.next)) | 1573 | if (rcu_dereference_check_mce(mcelog.next)) |
| 1569 | return POLLIN | POLLRDNORM; | 1574 | return POLLIN | POLLRDNORM; |
| 1570 | return 0; | 1575 | return 0; |
| 1571 | } | 1576 | } |
diff --git a/arch/x86/kernel/cpu/mcheck/mce_intel.c b/arch/x86/kernel/cpu/mcheck/mce_intel.c index 7c785634af2b..d15df6e49bf0 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_intel.c +++ b/arch/x86/kernel/cpu/mcheck/mce_intel.c | |||
| @@ -95,7 +95,7 @@ static void cmci_discover(int banks, int boot) | |||
| 95 | 95 | ||
| 96 | /* Already owned by someone else? */ | 96 | /* Already owned by someone else? */ |
| 97 | if (val & CMCI_EN) { | 97 | if (val & CMCI_EN) { |
| 98 | if (test_and_clear_bit(i, owned) || boot) | 98 | if (test_and_clear_bit(i, owned) && !boot) |
| 99 | print_update("SHD", &hdr, i); | 99 | print_update("SHD", &hdr, i); |
| 100 | __clear_bit(i, __get_cpu_var(mce_poll_banks)); | 100 | __clear_bit(i, __get_cpu_var(mce_poll_banks)); |
| 101 | continue; | 101 | continue; |
| @@ -107,7 +107,7 @@ static void cmci_discover(int banks, int boot) | |||
| 107 | 107 | ||
| 108 | /* Did the enable bit stick? -- the bank supports CMCI */ | 108 | /* Did the enable bit stick? -- the bank supports CMCI */ |
| 109 | if (val & CMCI_EN) { | 109 | if (val & CMCI_EN) { |
| 110 | if (!test_and_set_bit(i, owned) || boot) | 110 | if (!test_and_set_bit(i, owned) && !boot) |
| 111 | print_update("CMCI", &hdr, i); | 111 | print_update("CMCI", &hdr, i); |
| 112 | __clear_bit(i, __get_cpu_var(mce_poll_banks)); | 112 | __clear_bit(i, __get_cpu_var(mce_poll_banks)); |
| 113 | } else { | 113 | } else { |
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index b1fbdeecf6c9..42aafd11e170 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
| @@ -73,10 +73,10 @@ struct debug_store { | |||
| 73 | struct event_constraint { | 73 | struct event_constraint { |
| 74 | union { | 74 | union { |
| 75 | unsigned long idxmsk[BITS_TO_LONGS(X86_PMC_IDX_MAX)]; | 75 | unsigned long idxmsk[BITS_TO_LONGS(X86_PMC_IDX_MAX)]; |
| 76 | u64 idxmsk64[1]; | 76 | u64 idxmsk64; |
| 77 | }; | 77 | }; |
| 78 | int code; | 78 | u64 code; |
| 79 | int cmask; | 79 | u64 cmask; |
| 80 | int weight; | 80 | int weight; |
| 81 | }; | 81 | }; |
| 82 | 82 | ||
| @@ -103,7 +103,7 @@ struct cpu_hw_events { | |||
| 103 | }; | 103 | }; |
| 104 | 104 | ||
| 105 | #define __EVENT_CONSTRAINT(c, n, m, w) {\ | 105 | #define __EVENT_CONSTRAINT(c, n, m, w) {\ |
| 106 | { .idxmsk64[0] = (n) }, \ | 106 | { .idxmsk64 = (n) }, \ |
| 107 | .code = (c), \ | 107 | .code = (c), \ |
| 108 | .cmask = (m), \ | 108 | .cmask = (m), \ |
| 109 | .weight = (w), \ | 109 | .weight = (w), \ |
| @@ -116,7 +116,7 @@ struct cpu_hw_events { | |||
| 116 | EVENT_CONSTRAINT(c, n, INTEL_ARCH_EVTSEL_MASK) | 116 | EVENT_CONSTRAINT(c, n, INTEL_ARCH_EVTSEL_MASK) |
| 117 | 117 | ||
| 118 | #define FIXED_EVENT_CONSTRAINT(c, n) \ | 118 | #define FIXED_EVENT_CONSTRAINT(c, n) \ |
| 119 | EVENT_CONSTRAINT(c, n, INTEL_ARCH_FIXED_MASK) | 119 | EVENT_CONSTRAINT(c, (1ULL << (32+n)), INTEL_ARCH_FIXED_MASK) |
| 120 | 120 | ||
| 121 | #define EVENT_CONSTRAINT_END \ | 121 | #define EVENT_CONSTRAINT_END \ |
| 122 | EVENT_CONSTRAINT(0, 0, 0) | 122 | EVENT_CONSTRAINT(0, 0, 0) |
| @@ -503,6 +503,9 @@ static int __hw_perf_event_init(struct perf_event *event) | |||
| 503 | */ | 503 | */ |
| 504 | if (attr->type == PERF_TYPE_RAW) { | 504 | if (attr->type == PERF_TYPE_RAW) { |
| 505 | hwc->config |= x86_pmu.raw_event(attr->config); | 505 | hwc->config |= x86_pmu.raw_event(attr->config); |
| 506 | if ((hwc->config & ARCH_PERFMON_EVENTSEL_ANY) && | ||
| 507 | perf_paranoid_cpu() && !capable(CAP_SYS_ADMIN)) | ||
| 508 | return -EACCES; | ||
| 506 | return 0; | 509 | return 0; |
| 507 | } | 510 | } |
| 508 | 511 | ||
| @@ -553,9 +556,9 @@ static void x86_pmu_disable_all(void) | |||
| 553 | if (!test_bit(idx, cpuc->active_mask)) | 556 | if (!test_bit(idx, cpuc->active_mask)) |
| 554 | continue; | 557 | continue; |
| 555 | rdmsrl(x86_pmu.eventsel + idx, val); | 558 | rdmsrl(x86_pmu.eventsel + idx, val); |
| 556 | if (!(val & ARCH_PERFMON_EVENTSEL0_ENABLE)) | 559 | if (!(val & ARCH_PERFMON_EVENTSEL_ENABLE)) |
| 557 | continue; | 560 | continue; |
| 558 | val &= ~ARCH_PERFMON_EVENTSEL0_ENABLE; | 561 | val &= ~ARCH_PERFMON_EVENTSEL_ENABLE; |
| 559 | wrmsrl(x86_pmu.eventsel + idx, val); | 562 | wrmsrl(x86_pmu.eventsel + idx, val); |
| 560 | } | 563 | } |
| 561 | } | 564 | } |
| @@ -590,7 +593,7 @@ static void x86_pmu_enable_all(void) | |||
| 590 | continue; | 593 | continue; |
| 591 | 594 | ||
| 592 | val = event->hw.config; | 595 | val = event->hw.config; |
| 593 | val |= ARCH_PERFMON_EVENTSEL0_ENABLE; | 596 | val |= ARCH_PERFMON_EVENTSEL_ENABLE; |
| 594 | wrmsrl(x86_pmu.eventsel + idx, val); | 597 | wrmsrl(x86_pmu.eventsel + idx, val); |
| 595 | } | 598 | } |
| 596 | } | 599 | } |
| @@ -612,8 +615,8 @@ static int x86_schedule_events(struct cpu_hw_events *cpuc, int n, int *assign) | |||
| 612 | bitmap_zero(used_mask, X86_PMC_IDX_MAX); | 615 | bitmap_zero(used_mask, X86_PMC_IDX_MAX); |
| 613 | 616 | ||
| 614 | for (i = 0; i < n; i++) { | 617 | for (i = 0; i < n; i++) { |
| 615 | constraints[i] = | 618 | c = x86_pmu.get_event_constraints(cpuc, cpuc->event_list[i]); |
| 616 | x86_pmu.get_event_constraints(cpuc, cpuc->event_list[i]); | 619 | constraints[i] = c; |
| 617 | } | 620 | } |
| 618 | 621 | ||
| 619 | /* | 622 | /* |
| @@ -853,7 +856,7 @@ void hw_perf_enable(void) | |||
| 853 | static inline void __x86_pmu_enable_event(struct hw_perf_event *hwc, int idx) | 856 | static inline void __x86_pmu_enable_event(struct hw_perf_event *hwc, int idx) |
| 854 | { | 857 | { |
| 855 | (void)checking_wrmsrl(hwc->config_base + idx, | 858 | (void)checking_wrmsrl(hwc->config_base + idx, |
| 856 | hwc->config | ARCH_PERFMON_EVENTSEL0_ENABLE); | 859 | hwc->config | ARCH_PERFMON_EVENTSEL_ENABLE); |
| 857 | } | 860 | } |
| 858 | 861 | ||
| 859 | static inline void x86_pmu_disable_event(struct hw_perf_event *hwc, int idx) | 862 | static inline void x86_pmu_disable_event(struct hw_perf_event *hwc, int idx) |
| @@ -1094,8 +1097,7 @@ static int x86_pmu_handle_irq(struct pt_regs *regs) | |||
| 1094 | int idx, handled = 0; | 1097 | int idx, handled = 0; |
| 1095 | u64 val; | 1098 | u64 val; |
| 1096 | 1099 | ||
| 1097 | data.addr = 0; | 1100 | perf_sample_data_init(&data, 0); |
| 1098 | data.raw = NULL; | ||
| 1099 | 1101 | ||
| 1100 | cpuc = &__get_cpu_var(cpu_hw_events); | 1102 | cpuc = &__get_cpu_var(cpu_hw_events); |
| 1101 | 1103 | ||
| @@ -1347,6 +1349,7 @@ static void __init pmu_check_apic(void) | |||
| 1347 | 1349 | ||
| 1348 | void __init init_hw_perf_events(void) | 1350 | void __init init_hw_perf_events(void) |
| 1349 | { | 1351 | { |
| 1352 | struct event_constraint *c; | ||
| 1350 | int err; | 1353 | int err; |
| 1351 | 1354 | ||
| 1352 | pr_info("Performance Events: "); | 1355 | pr_info("Performance Events: "); |
| @@ -1395,6 +1398,16 @@ void __init init_hw_perf_events(void) | |||
| 1395 | __EVENT_CONSTRAINT(0, (1ULL << x86_pmu.num_events) - 1, | 1398 | __EVENT_CONSTRAINT(0, (1ULL << x86_pmu.num_events) - 1, |
| 1396 | 0, x86_pmu.num_events); | 1399 | 0, x86_pmu.num_events); |
| 1397 | 1400 | ||
| 1401 | if (x86_pmu.event_constraints) { | ||
| 1402 | for_each_event_constraint(c, x86_pmu.event_constraints) { | ||
| 1403 | if (c->cmask != INTEL_ARCH_FIXED_MASK) | ||
| 1404 | continue; | ||
| 1405 | |||
| 1406 | c->idxmsk64 |= (1ULL << x86_pmu.num_events) - 1; | ||
| 1407 | c->weight += x86_pmu.num_events; | ||
| 1408 | } | ||
| 1409 | } | ||
| 1410 | |||
| 1398 | pr_info("... version: %d\n", x86_pmu.version); | 1411 | pr_info("... version: %d\n", x86_pmu.version); |
| 1399 | pr_info("... bit width: %d\n", x86_pmu.event_bits); | 1412 | pr_info("... bit width: %d\n", x86_pmu.event_bits); |
| 1400 | pr_info("... generic registers: %d\n", x86_pmu.num_events); | 1413 | pr_info("... generic registers: %d\n", x86_pmu.num_events); |
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c index 977e7544738c..44b60c852107 100644 --- a/arch/x86/kernel/cpu/perf_event_intel.c +++ b/arch/x86/kernel/cpu/perf_event_intel.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | #ifdef CONFIG_CPU_SUP_INTEL | 1 | #ifdef CONFIG_CPU_SUP_INTEL |
| 2 | 2 | ||
| 3 | /* | 3 | /* |
| 4 | * Intel PerfMon v3. Used on Core2 and later. | 4 | * Intel PerfMon, used on Core and later. |
| 5 | */ | 5 | */ |
| 6 | static const u64 intel_perfmon_event_map[] = | 6 | static const u64 intel_perfmon_event_map[] = |
| 7 | { | 7 | { |
| @@ -27,8 +27,14 @@ static struct event_constraint intel_core_event_constraints[] = | |||
| 27 | 27 | ||
| 28 | static struct event_constraint intel_core2_event_constraints[] = | 28 | static struct event_constraint intel_core2_event_constraints[] = |
| 29 | { | 29 | { |
| 30 | FIXED_EVENT_CONSTRAINT(0xc0, (0x3|(1ULL<<32))), /* INSTRUCTIONS_RETIRED */ | 30 | FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */ |
| 31 | FIXED_EVENT_CONSTRAINT(0x3c, (0x3|(1ULL<<33))), /* UNHALTED_CORE_CYCLES */ | 31 | FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */ |
| 32 | /* | ||
| 33 | * Core2 has Fixed Counter 2 listed as CPU_CLK_UNHALTED.REF and event | ||
| 34 | * 0x013c as CPU_CLK_UNHALTED.BUS and specifies there is a fixed | ||
| 35 | * ratio between these counters. | ||
| 36 | */ | ||
| 37 | /* FIXED_EVENT_CONSTRAINT(0x013c, 2), CPU_CLK_UNHALTED.REF */ | ||
| 32 | INTEL_EVENT_CONSTRAINT(0x10, 0x1), /* FP_COMP_OPS_EXE */ | 38 | INTEL_EVENT_CONSTRAINT(0x10, 0x1), /* FP_COMP_OPS_EXE */ |
| 33 | INTEL_EVENT_CONSTRAINT(0x11, 0x2), /* FP_ASSIST */ | 39 | INTEL_EVENT_CONSTRAINT(0x11, 0x2), /* FP_ASSIST */ |
| 34 | INTEL_EVENT_CONSTRAINT(0x12, 0x2), /* MUL */ | 40 | INTEL_EVENT_CONSTRAINT(0x12, 0x2), /* MUL */ |
| @@ -37,14 +43,16 @@ static struct event_constraint intel_core2_event_constraints[] = | |||
| 37 | INTEL_EVENT_CONSTRAINT(0x18, 0x1), /* IDLE_DURING_DIV */ | 43 | INTEL_EVENT_CONSTRAINT(0x18, 0x1), /* IDLE_DURING_DIV */ |
| 38 | INTEL_EVENT_CONSTRAINT(0x19, 0x2), /* DELAYED_BYPASS */ | 44 | INTEL_EVENT_CONSTRAINT(0x19, 0x2), /* DELAYED_BYPASS */ |
| 39 | INTEL_EVENT_CONSTRAINT(0xa1, 0x1), /* RS_UOPS_DISPATCH_CYCLES */ | 45 | INTEL_EVENT_CONSTRAINT(0xa1, 0x1), /* RS_UOPS_DISPATCH_CYCLES */ |
| 46 | INTEL_EVENT_CONSTRAINT(0xc9, 0x1), /* ITLB_MISS_RETIRED (T30-9) */ | ||
| 40 | INTEL_EVENT_CONSTRAINT(0xcb, 0x1), /* MEM_LOAD_RETIRED */ | 47 | INTEL_EVENT_CONSTRAINT(0xcb, 0x1), /* MEM_LOAD_RETIRED */ |
| 41 | EVENT_CONSTRAINT_END | 48 | EVENT_CONSTRAINT_END |
| 42 | }; | 49 | }; |
| 43 | 50 | ||
| 44 | static struct event_constraint intel_nehalem_event_constraints[] = | 51 | static struct event_constraint intel_nehalem_event_constraints[] = |
| 45 | { | 52 | { |
| 46 | FIXED_EVENT_CONSTRAINT(0xc0, (0xf|(1ULL<<32))), /* INSTRUCTIONS_RETIRED */ | 53 | FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */ |
| 47 | FIXED_EVENT_CONSTRAINT(0x3c, (0xf|(1ULL<<33))), /* UNHALTED_CORE_CYCLES */ | 54 | FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */ |
| 55 | /* FIXED_EVENT_CONSTRAINT(0x013c, 2), CPU_CLK_UNHALTED.REF */ | ||
| 48 | INTEL_EVENT_CONSTRAINT(0x40, 0x3), /* L1D_CACHE_LD */ | 56 | INTEL_EVENT_CONSTRAINT(0x40, 0x3), /* L1D_CACHE_LD */ |
| 49 | INTEL_EVENT_CONSTRAINT(0x41, 0x3), /* L1D_CACHE_ST */ | 57 | INTEL_EVENT_CONSTRAINT(0x41, 0x3), /* L1D_CACHE_ST */ |
| 50 | INTEL_EVENT_CONSTRAINT(0x42, 0x3), /* L1D_CACHE_LOCK */ | 58 | INTEL_EVENT_CONSTRAINT(0x42, 0x3), /* L1D_CACHE_LOCK */ |
| @@ -58,8 +66,9 @@ static struct event_constraint intel_nehalem_event_constraints[] = | |||
| 58 | 66 | ||
| 59 | static struct event_constraint intel_westmere_event_constraints[] = | 67 | static struct event_constraint intel_westmere_event_constraints[] = |
| 60 | { | 68 | { |
| 61 | FIXED_EVENT_CONSTRAINT(0xc0, (0xf|(1ULL<<32))), /* INSTRUCTIONS_RETIRED */ | 69 | FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */ |
| 62 | FIXED_EVENT_CONSTRAINT(0x3c, (0xf|(1ULL<<33))), /* UNHALTED_CORE_CYCLES */ | 70 | FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */ |
| 71 | /* FIXED_EVENT_CONSTRAINT(0x013c, 2), CPU_CLK_UNHALTED.REF */ | ||
| 63 | INTEL_EVENT_CONSTRAINT(0x51, 0x3), /* L1D */ | 72 | INTEL_EVENT_CONSTRAINT(0x51, 0x3), /* L1D */ |
| 64 | INTEL_EVENT_CONSTRAINT(0x60, 0x1), /* OFFCORE_REQUESTS_OUTSTANDING */ | 73 | INTEL_EVENT_CONSTRAINT(0x60, 0x1), /* OFFCORE_REQUESTS_OUTSTANDING */ |
| 65 | INTEL_EVENT_CONSTRAINT(0x63, 0x3), /* CACHE_LOCK_CYCLES */ | 74 | INTEL_EVENT_CONSTRAINT(0x63, 0x3), /* CACHE_LOCK_CYCLES */ |
| @@ -68,8 +77,9 @@ static struct event_constraint intel_westmere_event_constraints[] = | |||
| 68 | 77 | ||
| 69 | static struct event_constraint intel_gen_event_constraints[] = | 78 | static struct event_constraint intel_gen_event_constraints[] = |
| 70 | { | 79 | { |
| 71 | FIXED_EVENT_CONSTRAINT(0xc0, (0x3|(1ULL<<32))), /* INSTRUCTIONS_RETIRED */ | 80 | FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */ |
| 72 | FIXED_EVENT_CONSTRAINT(0x3c, (0x3|(1ULL<<33))), /* UNHALTED_CORE_CYCLES */ | 81 | FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */ |
| 82 | /* FIXED_EVENT_CONSTRAINT(0x013c, 2), CPU_CLK_UNHALTED.REF */ | ||
| 73 | EVENT_CONSTRAINT_END | 83 | EVENT_CONSTRAINT_END |
| 74 | }; | 84 | }; |
| 75 | 85 | ||
| @@ -580,10 +590,9 @@ static void intel_pmu_drain_bts_buffer(void) | |||
| 580 | 590 | ||
| 581 | ds->bts_index = ds->bts_buffer_base; | 591 | ds->bts_index = ds->bts_buffer_base; |
| 582 | 592 | ||
| 593 | perf_sample_data_init(&data, 0); | ||
| 583 | 594 | ||
| 584 | data.period = event->hw.last_period; | 595 | data.period = event->hw.last_period; |
| 585 | data.addr = 0; | ||
| 586 | data.raw = NULL; | ||
| 587 | regs.ip = 0; | 596 | regs.ip = 0; |
| 588 | 597 | ||
| 589 | /* | 598 | /* |
| @@ -732,8 +741,7 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) | |||
| 732 | int bit, loops; | 741 | int bit, loops; |
| 733 | u64 ack, status; | 742 | u64 ack, status; |
| 734 | 743 | ||
| 735 | data.addr = 0; | 744 | perf_sample_data_init(&data, 0); |
| 736 | data.raw = NULL; | ||
| 737 | 745 | ||
| 738 | cpuc = &__get_cpu_var(cpu_hw_events); | 746 | cpuc = &__get_cpu_var(cpu_hw_events); |
| 739 | 747 | ||
| @@ -935,7 +943,7 @@ static __init int intel_pmu_init(void) | |||
| 935 | x86_pmu.event_constraints = intel_nehalem_event_constraints; | 943 | x86_pmu.event_constraints = intel_nehalem_event_constraints; |
| 936 | pr_cont("Nehalem/Corei7 events, "); | 944 | pr_cont("Nehalem/Corei7 events, "); |
| 937 | break; | 945 | break; |
| 938 | case 28: | 946 | case 28: /* Atom */ |
| 939 | memcpy(hw_cache_event_ids, atom_hw_cache_event_ids, | 947 | memcpy(hw_cache_event_ids, atom_hw_cache_event_ids, |
| 940 | sizeof(hw_cache_event_ids)); | 948 | sizeof(hw_cache_event_ids)); |
| 941 | 949 | ||
| @@ -951,6 +959,7 @@ static __init int intel_pmu_init(void) | |||
| 951 | x86_pmu.event_constraints = intel_westmere_event_constraints; | 959 | x86_pmu.event_constraints = intel_westmere_event_constraints; |
| 952 | pr_cont("Westmere events, "); | 960 | pr_cont("Westmere events, "); |
| 953 | break; | 961 | break; |
| 962 | |||
| 954 | default: | 963 | default: |
| 955 | /* | 964 | /* |
| 956 | * default constraints for v2 and up | 965 | * default constraints for v2 and up |
diff --git a/arch/x86/kernel/cpu/perf_event_p6.c b/arch/x86/kernel/cpu/perf_event_p6.c index 1ca5ba078afd..a4e67b99d91c 100644 --- a/arch/x86/kernel/cpu/perf_event_p6.c +++ b/arch/x86/kernel/cpu/perf_event_p6.c | |||
| @@ -62,7 +62,7 @@ static void p6_pmu_disable_all(void) | |||
| 62 | 62 | ||
| 63 | /* p6 only has one enable register */ | 63 | /* p6 only has one enable register */ |
| 64 | rdmsrl(MSR_P6_EVNTSEL0, val); | 64 | rdmsrl(MSR_P6_EVNTSEL0, val); |
| 65 | val &= ~ARCH_PERFMON_EVENTSEL0_ENABLE; | 65 | val &= ~ARCH_PERFMON_EVENTSEL_ENABLE; |
| 66 | wrmsrl(MSR_P6_EVNTSEL0, val); | 66 | wrmsrl(MSR_P6_EVNTSEL0, val); |
| 67 | } | 67 | } |
| 68 | 68 | ||
| @@ -72,7 +72,7 @@ static void p6_pmu_enable_all(void) | |||
| 72 | 72 | ||
| 73 | /* p6 only has one enable register */ | 73 | /* p6 only has one enable register */ |
| 74 | rdmsrl(MSR_P6_EVNTSEL0, val); | 74 | rdmsrl(MSR_P6_EVNTSEL0, val); |
| 75 | val |= ARCH_PERFMON_EVENTSEL0_ENABLE; | 75 | val |= ARCH_PERFMON_EVENTSEL_ENABLE; |
| 76 | wrmsrl(MSR_P6_EVNTSEL0, val); | 76 | wrmsrl(MSR_P6_EVNTSEL0, val); |
| 77 | } | 77 | } |
| 78 | 78 | ||
| @@ -83,7 +83,7 @@ p6_pmu_disable_event(struct hw_perf_event *hwc, int idx) | |||
| 83 | u64 val = P6_NOP_EVENT; | 83 | u64 val = P6_NOP_EVENT; |
| 84 | 84 | ||
| 85 | if (cpuc->enabled) | 85 | if (cpuc->enabled) |
| 86 | val |= ARCH_PERFMON_EVENTSEL0_ENABLE; | 86 | val |= ARCH_PERFMON_EVENTSEL_ENABLE; |
| 87 | 87 | ||
| 88 | (void)checking_wrmsrl(hwc->config_base + idx, val); | 88 | (void)checking_wrmsrl(hwc->config_base + idx, val); |
| 89 | } | 89 | } |
| @@ -95,7 +95,7 @@ static void p6_pmu_enable_event(struct hw_perf_event *hwc, int idx) | |||
| 95 | 95 | ||
| 96 | val = hwc->config; | 96 | val = hwc->config; |
| 97 | if (cpuc->enabled) | 97 | if (cpuc->enabled) |
| 98 | val |= ARCH_PERFMON_EVENTSEL0_ENABLE; | 98 | val |= ARCH_PERFMON_EVENTSEL_ENABLE; |
| 99 | 99 | ||
| 100 | (void)checking_wrmsrl(hwc->config_base + idx, val); | 100 | (void)checking_wrmsrl(hwc->config_base + idx, val); |
| 101 | } | 101 | } |
diff --git a/arch/x86/kernel/cpu/perfctr-watchdog.c b/arch/x86/kernel/cpu/perfctr-watchdog.c index 74f4e85a5727..fb329e9f8494 100644 --- a/arch/x86/kernel/cpu/perfctr-watchdog.c +++ b/arch/x86/kernel/cpu/perfctr-watchdog.c | |||
| @@ -680,7 +680,7 @@ static int setup_intel_arch_watchdog(unsigned nmi_hz) | |||
| 680 | cpu_nmi_set_wd_enabled(); | 680 | cpu_nmi_set_wd_enabled(); |
| 681 | 681 | ||
| 682 | apic_write(APIC_LVTPC, APIC_DM_NMI); | 682 | apic_write(APIC_LVTPC, APIC_DM_NMI); |
| 683 | evntsel |= ARCH_PERFMON_EVENTSEL0_ENABLE; | 683 | evntsel |= ARCH_PERFMON_EVENTSEL_ENABLE; |
| 684 | wrmsr(evntsel_msr, evntsel, 0); | 684 | wrmsr(evntsel_msr, evntsel, 0); |
| 685 | intel_arch_wd_ops.checkbit = 1ULL << (eax.split.bit_width - 1); | 685 | intel_arch_wd_ops.checkbit = 1ULL << (eax.split.bit_width - 1); |
| 686 | return 1; | 686 | return 1; |
diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c index dce99abb4496..d5e2a2ebb627 100644 --- a/arch/x86/kernel/dumpstack_64.c +++ b/arch/x86/kernel/dumpstack_64.c | |||
| @@ -120,9 +120,15 @@ fixup_bp_irq_link(unsigned long bp, unsigned long *stack, | |||
| 120 | { | 120 | { |
| 121 | #ifdef CONFIG_FRAME_POINTER | 121 | #ifdef CONFIG_FRAME_POINTER |
| 122 | struct stack_frame *frame = (struct stack_frame *)bp; | 122 | struct stack_frame *frame = (struct stack_frame *)bp; |
| 123 | unsigned long next; | ||
| 123 | 124 | ||
| 124 | if (!in_irq_stack(stack, irq_stack, irq_stack_end)) | 125 | if (!in_irq_stack(stack, irq_stack, irq_stack_end)) { |
| 125 | return (unsigned long)frame->next_frame; | 126 | if (!probe_kernel_address(&frame->next_frame, next)) |
| 127 | return next; | ||
| 128 | else | ||
| 129 | WARN_ONCE(1, "Perf: bad frame pointer = %p in " | ||
| 130 | "callchain\n", &frame->next_frame); | ||
| 131 | } | ||
| 126 | #endif | 132 | #endif |
| 127 | return bp; | 133 | return bp; |
| 128 | } | 134 | } |
diff --git a/arch/x86/kernel/hw_breakpoint.c b/arch/x86/kernel/hw_breakpoint.c index dca2802c666f..d6cc065f519f 100644 --- a/arch/x86/kernel/hw_breakpoint.c +++ b/arch/x86/kernel/hw_breakpoint.c | |||
| @@ -344,13 +344,6 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp, | |||
| 344 | } | 344 | } |
| 345 | 345 | ||
| 346 | /* | 346 | /* |
| 347 | * For kernel-addresses, either the address or symbol name can be | ||
| 348 | * specified. | ||
| 349 | */ | ||
| 350 | if (info->name) | ||
| 351 | info->address = (unsigned long) | ||
| 352 | kallsyms_lookup_name(info->name); | ||
| 353 | /* | ||
| 354 | * Check that the low-order bits of the address are appropriate | 347 | * Check that the low-order bits of the address are appropriate |
| 355 | * for the alignment implied by len. | 348 | * for the alignment implied by len. |
| 356 | */ | 349 | */ |
| @@ -535,8 +528,3 @@ void hw_breakpoint_pmu_read(struct perf_event *bp) | |||
| 535 | { | 528 | { |
| 536 | /* TODO */ | 529 | /* TODO */ |
| 537 | } | 530 | } |
| 538 | |||
| 539 | void hw_breakpoint_pmu_unthrottle(struct perf_event *bp) | ||
| 540 | { | ||
| 541 | /* TODO */ | ||
| 542 | } | ||
diff --git a/arch/x86/kernel/k8.c b/arch/x86/kernel/k8.c index cbc4332a77b2..9b895464dd03 100644 --- a/arch/x86/kernel/k8.c +++ b/arch/x86/kernel/k8.c | |||
| @@ -121,3 +121,17 @@ void k8_flush_garts(void) | |||
| 121 | } | 121 | } |
| 122 | EXPORT_SYMBOL_GPL(k8_flush_garts); | 122 | EXPORT_SYMBOL_GPL(k8_flush_garts); |
| 123 | 123 | ||
| 124 | static __init int init_k8_nbs(void) | ||
| 125 | { | ||
| 126 | int err = 0; | ||
| 127 | |||
| 128 | err = cache_k8_northbridges(); | ||
| 129 | |||
| 130 | if (err < 0) | ||
| 131 | printk(KERN_NOTICE "K8 NB: Cannot enumerate AMD northbridges.\n"); | ||
| 132 | |||
| 133 | return err; | ||
| 134 | } | ||
| 135 | |||
| 136 | /* This has to go after the PCI subsystem */ | ||
| 137 | fs_initcall(init_k8_nbs); | ||
diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c index 34de53b46f87..f3af115a573a 100644 --- a/arch/x86/kernel/pci-gart_64.c +++ b/arch/x86/kernel/pci-gart_64.c | |||
| @@ -735,7 +735,7 @@ int __init gart_iommu_init(void) | |||
| 735 | unsigned long scratch; | 735 | unsigned long scratch; |
| 736 | long i; | 736 | long i; |
| 737 | 737 | ||
| 738 | if (cache_k8_northbridges() < 0 || num_k8_northbridges == 0) | 738 | if (num_k8_northbridges == 0) |
| 739 | return 0; | 739 | return 0; |
| 740 | 740 | ||
| 741 | #ifndef CONFIG_AGP_AMD64 | 741 | #ifndef CONFIG_AGP_AMD64 |
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 02d678065d7d..ad9540676fcc 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
| @@ -607,7 +607,7 @@ void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c) | |||
| 607 | { | 607 | { |
| 608 | #ifdef CONFIG_SMP | 608 | #ifdef CONFIG_SMP |
| 609 | if (pm_idle == poll_idle && smp_num_siblings > 1) { | 609 | if (pm_idle == poll_idle && smp_num_siblings > 1) { |
| 610 | printk(KERN_WARNING "WARNING: polling idle and HT enabled," | 610 | printk_once(KERN_WARNING "WARNING: polling idle and HT enabled," |
| 611 | " performance may degrade.\n"); | 611 | " performance may degrade.\n"); |
| 612 | } | 612 | } |
| 613 | #endif | 613 | #endif |
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 1d4eb93d333c..cf07c26d9a4a 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c | |||
| @@ -291,8 +291,29 @@ static inline pgprot_t static_protections(pgprot_t prot, unsigned long address, | |||
| 291 | */ | 291 | */ |
| 292 | if (kernel_set_to_readonly && | 292 | if (kernel_set_to_readonly && |
| 293 | within(address, (unsigned long)_text, | 293 | within(address, (unsigned long)_text, |
| 294 | (unsigned long)__end_rodata_hpage_align)) | 294 | (unsigned long)__end_rodata_hpage_align)) { |
| 295 | pgprot_val(forbidden) |= _PAGE_RW; | 295 | unsigned int level; |
| 296 | |||
| 297 | /* | ||
| 298 | * Don't enforce the !RW mapping for the kernel text mapping, | ||
| 299 | * if the current mapping is already using small page mapping. | ||
| 300 | * No need to work hard to preserve large page mappings in this | ||
| 301 | * case. | ||
| 302 | * | ||
| 303 | * This also fixes the Linux Xen paravirt guest boot failure | ||
| 304 | * (because of unexpected read-only mappings for kernel identity | ||
| 305 | * mappings). In this paravirt guest case, the kernel text | ||
| 306 | * mapping and the kernel identity mapping share the same | ||
| 307 | * page-table pages. Thus we can't really use different | ||
| 308 | * protections for the kernel text and identity mappings. Also, | ||
| 309 | * these shared mappings are made of small page mappings. | ||
| 310 | * Thus this don't enforce !RW mapping for small page kernel | ||
| 311 | * text mapping logic will help Linux Xen parvirt guest boot | ||
| 312 | * aswell. | ||
| 313 | */ | ||
| 314 | if (lookup_address(address, &level) && (level != PG_LEVEL_4K)) | ||
| 315 | pgprot_val(forbidden) |= _PAGE_RW; | ||
| 316 | } | ||
| 296 | #endif | 317 | #endif |
| 297 | 318 | ||
| 298 | prot = __pgprot(pgprot_val(prot) & ~pgprot_val(forbidden)); | 319 | prot = __pgprot(pgprot_val(prot) & ~pgprot_val(forbidden)); |
diff --git a/arch/x86/oprofile/op_model_amd.c b/arch/x86/oprofile/op_model_amd.c index 6a58256dce9f..090cbbec7dbd 100644 --- a/arch/x86/oprofile/op_model_amd.c +++ b/arch/x86/oprofile/op_model_amd.c | |||
| @@ -46,17 +46,6 @@ | |||
| 46 | 46 | ||
| 47 | static unsigned long reset_value[NUM_VIRT_COUNTERS]; | 47 | static unsigned long reset_value[NUM_VIRT_COUNTERS]; |
| 48 | 48 | ||
| 49 | /* IbsFetchCtl bits/masks */ | ||
| 50 | #define IBS_FETCH_RAND_EN (1ULL<<57) | ||
| 51 | #define IBS_FETCH_VAL (1ULL<<49) | ||
| 52 | #define IBS_FETCH_ENABLE (1ULL<<48) | ||
| 53 | #define IBS_FETCH_CNT_MASK 0xFFFF0000ULL | ||
| 54 | |||
| 55 | /* IbsOpCtl bits */ | ||
| 56 | #define IBS_OP_CNT_CTL (1ULL<<19) | ||
| 57 | #define IBS_OP_VAL (1ULL<<18) | ||
| 58 | #define IBS_OP_ENABLE (1ULL<<17) | ||
| 59 | |||
| 60 | #define IBS_FETCH_SIZE 6 | 49 | #define IBS_FETCH_SIZE 6 |
| 61 | #define IBS_OP_SIZE 12 | 50 | #define IBS_OP_SIZE 12 |
| 62 | 51 | ||
| @@ -182,7 +171,7 @@ static void op_amd_setup_ctrs(struct op_x86_model_spec const *model, | |||
| 182 | continue; | 171 | continue; |
| 183 | } | 172 | } |
| 184 | rdmsrl(msrs->controls[i].addr, val); | 173 | rdmsrl(msrs->controls[i].addr, val); |
| 185 | if (val & ARCH_PERFMON_EVENTSEL0_ENABLE) | 174 | if (val & ARCH_PERFMON_EVENTSEL_ENABLE) |
| 186 | op_x86_warn_in_use(i); | 175 | op_x86_warn_in_use(i); |
| 187 | val &= model->reserved; | 176 | val &= model->reserved; |
| 188 | wrmsrl(msrs->controls[i].addr, val); | 177 | wrmsrl(msrs->controls[i].addr, val); |
| @@ -290,7 +279,7 @@ op_amd_handle_ibs(struct pt_regs * const regs, | |||
| 290 | oprofile_write_commit(&entry); | 279 | oprofile_write_commit(&entry); |
| 291 | 280 | ||
| 292 | /* reenable the IRQ */ | 281 | /* reenable the IRQ */ |
| 293 | ctl &= ~(IBS_FETCH_VAL | IBS_FETCH_CNT_MASK); | 282 | ctl &= ~(IBS_FETCH_VAL | IBS_FETCH_CNT); |
| 294 | ctl |= IBS_FETCH_ENABLE; | 283 | ctl |= IBS_FETCH_ENABLE; |
| 295 | wrmsrl(MSR_AMD64_IBSFETCHCTL, ctl); | 284 | wrmsrl(MSR_AMD64_IBSFETCHCTL, ctl); |
| 296 | } | 285 | } |
| @@ -330,7 +319,7 @@ static inline void op_amd_start_ibs(void) | |||
| 330 | return; | 319 | return; |
| 331 | 320 | ||
| 332 | if (ibs_config.fetch_enabled) { | 321 | if (ibs_config.fetch_enabled) { |
| 333 | val = (ibs_config.max_cnt_fetch >> 4) & 0xFFFF; | 322 | val = (ibs_config.max_cnt_fetch >> 4) & IBS_FETCH_MAX_CNT; |
| 334 | val |= ibs_config.rand_en ? IBS_FETCH_RAND_EN : 0; | 323 | val |= ibs_config.rand_en ? IBS_FETCH_RAND_EN : 0; |
| 335 | val |= IBS_FETCH_ENABLE; | 324 | val |= IBS_FETCH_ENABLE; |
| 336 | wrmsrl(MSR_AMD64_IBSFETCHCTL, val); | 325 | wrmsrl(MSR_AMD64_IBSFETCHCTL, val); |
| @@ -352,7 +341,7 @@ static inline void op_amd_start_ibs(void) | |||
| 352 | * avoid underflows. | 341 | * avoid underflows. |
| 353 | */ | 342 | */ |
| 354 | ibs_op_ctl = min(ibs_op_ctl + IBS_RANDOM_MAXCNT_OFFSET, | 343 | ibs_op_ctl = min(ibs_op_ctl + IBS_RANDOM_MAXCNT_OFFSET, |
| 355 | 0xFFFFULL); | 344 | IBS_OP_MAX_CNT); |
| 356 | } | 345 | } |
| 357 | if (ibs_caps & IBS_CAPS_OPCNT && ibs_config.dispatched_ops) | 346 | if (ibs_caps & IBS_CAPS_OPCNT && ibs_config.dispatched_ops) |
| 358 | ibs_op_ctl |= IBS_OP_CNT_CTL; | 347 | ibs_op_ctl |= IBS_OP_CNT_CTL; |
| @@ -409,7 +398,7 @@ static void op_amd_start(struct op_msrs const * const msrs) | |||
| 409 | if (!reset_value[op_x86_phys_to_virt(i)]) | 398 | if (!reset_value[op_x86_phys_to_virt(i)]) |
| 410 | continue; | 399 | continue; |
| 411 | rdmsrl(msrs->controls[i].addr, val); | 400 | rdmsrl(msrs->controls[i].addr, val); |
| 412 | val |= ARCH_PERFMON_EVENTSEL0_ENABLE; | 401 | val |= ARCH_PERFMON_EVENTSEL_ENABLE; |
| 413 | wrmsrl(msrs->controls[i].addr, val); | 402 | wrmsrl(msrs->controls[i].addr, val); |
| 414 | } | 403 | } |
| 415 | 404 | ||
| @@ -429,7 +418,7 @@ static void op_amd_stop(struct op_msrs const * const msrs) | |||
| 429 | if (!reset_value[op_x86_phys_to_virt(i)]) | 418 | if (!reset_value[op_x86_phys_to_virt(i)]) |
| 430 | continue; | 419 | continue; |
| 431 | rdmsrl(msrs->controls[i].addr, val); | 420 | rdmsrl(msrs->controls[i].addr, val); |
| 432 | val &= ~ARCH_PERFMON_EVENTSEL0_ENABLE; | 421 | val &= ~ARCH_PERFMON_EVENTSEL_ENABLE; |
| 433 | wrmsrl(msrs->controls[i].addr, val); | 422 | wrmsrl(msrs->controls[i].addr, val); |
| 434 | } | 423 | } |
| 435 | 424 | ||
diff --git a/arch/x86/oprofile/op_model_ppro.c b/arch/x86/oprofile/op_model_ppro.c index 5d1727ba409e..2bf90fafa7b5 100644 --- a/arch/x86/oprofile/op_model_ppro.c +++ b/arch/x86/oprofile/op_model_ppro.c | |||
| @@ -88,7 +88,7 @@ static void ppro_setup_ctrs(struct op_x86_model_spec const *model, | |||
| 88 | continue; | 88 | continue; |
| 89 | } | 89 | } |
| 90 | rdmsrl(msrs->controls[i].addr, val); | 90 | rdmsrl(msrs->controls[i].addr, val); |
| 91 | if (val & ARCH_PERFMON_EVENTSEL0_ENABLE) | 91 | if (val & ARCH_PERFMON_EVENTSEL_ENABLE) |
| 92 | op_x86_warn_in_use(i); | 92 | op_x86_warn_in_use(i); |
| 93 | val &= model->reserved; | 93 | val &= model->reserved; |
| 94 | wrmsrl(msrs->controls[i].addr, val); | 94 | wrmsrl(msrs->controls[i].addr, val); |
| @@ -166,7 +166,7 @@ static void ppro_start(struct op_msrs const * const msrs) | |||
| 166 | for (i = 0; i < num_counters; ++i) { | 166 | for (i = 0; i < num_counters; ++i) { |
| 167 | if (reset_value[i]) { | 167 | if (reset_value[i]) { |
| 168 | rdmsrl(msrs->controls[i].addr, val); | 168 | rdmsrl(msrs->controls[i].addr, val); |
| 169 | val |= ARCH_PERFMON_EVENTSEL0_ENABLE; | 169 | val |= ARCH_PERFMON_EVENTSEL_ENABLE; |
| 170 | wrmsrl(msrs->controls[i].addr, val); | 170 | wrmsrl(msrs->controls[i].addr, val); |
| 171 | } | 171 | } |
| 172 | } | 172 | } |
| @@ -184,7 +184,7 @@ static void ppro_stop(struct op_msrs const * const msrs) | |||
| 184 | if (!reset_value[i]) | 184 | if (!reset_value[i]) |
| 185 | continue; | 185 | continue; |
| 186 | rdmsrl(msrs->controls[i].addr, val); | 186 | rdmsrl(msrs->controls[i].addr, val); |
| 187 | val &= ~ARCH_PERFMON_EVENTSEL0_ENABLE; | 187 | val &= ~ARCH_PERFMON_EVENTSEL_ENABLE; |
| 188 | wrmsrl(msrs->controls[i].addr, val); | 188 | wrmsrl(msrs->controls[i].addr, val); |
| 189 | } | 189 | } |
| 190 | } | 190 | } |
