diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/avr32/boards/atngw100/setup.c | 7 | ||||
-rw-r--r-- | arch/avr32/boards/atstk1000/atstk1002.c | 3 | ||||
-rw-r--r-- | arch/avr32/mach-at32ap/at32ap700x.c | 30 | ||||
-rw-r--r-- | arch/frv/mb93090-mb00/pci-frv.c | 30 | ||||
-rw-r--r-- | arch/ia64/kernel/process.c | 4 | ||||
-rw-r--r-- | arch/ia64/kvm/kvm-ia64.c | 4 | ||||
-rw-r--r-- | arch/ia64/kvm/kvm_fw.c | 2 | ||||
-rw-r--r-- | arch/m68knommu/kernel/comempci.c | 9 | ||||
-rw-r--r-- | arch/mips/pmc-sierra/yosemite/ht.c | 36 | ||||
-rw-r--r-- | arch/s390/Kconfig | 2 | ||||
-rw-r--r-- | arch/s390/kernel/stacktrace.c | 1 | ||||
-rw-r--r-- | arch/sh/drivers/pci/pci.c | 32 | ||||
-rw-r--r-- | arch/sparc64/kernel/pci.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/acpi/processor.c | 6 | ||||
-rw-r--r-- | arch/x86/kernel/acpi/sleep.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/apm_32.c | 8 | ||||
-rw-r--r-- | arch/x86/kernel/early-quirks.c | 26 | ||||
-rw-r--r-- | arch/x86/kernel/process.c | 28 | ||||
-rw-r--r-- | arch/x86/kernel/setup.c | 5 | ||||
-rw-r--r-- | arch/x86/mm/srat_32.c | 3 | ||||
-rw-r--r-- | arch/x86/pci/common.c | 30 | ||||
-rw-r--r-- | arch/x86/pci/early.c | 60 | ||||
-rw-r--r-- | arch/x86/pci/irq.c | 120 | ||||
-rw-r--r-- | arch/x86/pci/pci.h | 1 |
24 files changed, 281 insertions, 170 deletions
diff --git a/arch/avr32/boards/atngw100/setup.c b/arch/avr32/boards/atngw100/setup.c index a51bb9fb3c89..c7fe94d03a1e 100644 --- a/arch/avr32/boards/atngw100/setup.c +++ b/arch/avr32/boards/atngw100/setup.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/leds.h> | 19 | #include <linux/leds.h> |
20 | #include <linux/spi/spi.h> | 20 | #include <linux/spi/spi.h> |
21 | 21 | ||
22 | #include <asm/atmel-mci.h> | ||
22 | #include <asm/io.h> | 23 | #include <asm/io.h> |
23 | #include <asm/setup.h> | 24 | #include <asm/setup.h> |
24 | 25 | ||
@@ -51,6 +52,11 @@ static struct spi_board_info spi0_board_info[] __initdata = { | |||
51 | }, | 52 | }, |
52 | }; | 53 | }; |
53 | 54 | ||
55 | static struct mci_platform_data __initdata mci0_data = { | ||
56 | .detect_pin = GPIO_PIN_PC(25), | ||
57 | .wp_pin = GPIO_PIN_PE(0), | ||
58 | }; | ||
59 | |||
54 | /* | 60 | /* |
55 | * The next two functions should go away as the boot loader is | 61 | * The next two functions should go away as the boot loader is |
56 | * supposed to initialize the macb address registers with a valid | 62 | * supposed to initialize the macb address registers with a valid |
@@ -170,6 +176,7 @@ static int __init atngw100_init(void) | |||
170 | set_hw_addr(at32_add_device_eth(1, ð_data[1])); | 176 | set_hw_addr(at32_add_device_eth(1, ð_data[1])); |
171 | 177 | ||
172 | at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info)); | 178 | at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info)); |
179 | at32_add_device_mci(0, &mci0_data); | ||
173 | at32_add_device_usba(0, NULL); | 180 | at32_add_device_usba(0, NULL); |
174 | 181 | ||
175 | for (i = 0; i < ARRAY_SIZE(ngw_leds); i++) { | 182 | for (i = 0; i < ARRAY_SIZE(ngw_leds); i++) { |
diff --git a/arch/avr32/boards/atstk1000/atstk1002.c b/arch/avr32/boards/atstk1000/atstk1002.c index 86b363c1c25b..e11659b732fa 100644 --- a/arch/avr32/boards/atstk1000/atstk1002.c +++ b/arch/avr32/boards/atstk1000/atstk1002.c | |||
@@ -234,6 +234,9 @@ static int __init atstk1002_init(void) | |||
234 | #ifdef CONFIG_BOARD_ATSTK100X_SPI1 | 234 | #ifdef CONFIG_BOARD_ATSTK100X_SPI1 |
235 | at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info)); | 235 | at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info)); |
236 | #endif | 236 | #endif |
237 | #ifndef CONFIG_BOARD_ATSTK1002_SW2_CUSTOM | ||
238 | at32_add_device_mci(0, NULL); | ||
239 | #endif | ||
237 | #ifdef CONFIG_BOARD_ATSTK1002_SW5_CUSTOM | 240 | #ifdef CONFIG_BOARD_ATSTK1002_SW5_CUSTOM |
238 | set_hw_addr(at32_add_device_eth(1, ð_data[1])); | 241 | set_hw_addr(at32_add_device_eth(1, ð_data[1])); |
239 | #else | 242 | #else |
diff --git a/arch/avr32/mach-at32ap/at32ap700x.c b/arch/avr32/mach-at32ap/at32ap700x.c index 07b21b121eef..021d51217184 100644 --- a/arch/avr32/mach-at32ap/at32ap700x.c +++ b/arch/avr32/mach-at32ap/at32ap700x.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/spi/spi.h> | 14 | #include <linux/spi/spi.h> |
15 | #include <linux/usb/atmel_usba_udc.h> | 15 | #include <linux/usb/atmel_usba_udc.h> |
16 | 16 | ||
17 | #include <asm/atmel-mci.h> | ||
17 | #include <asm/io.h> | 18 | #include <asm/io.h> |
18 | #include <asm/irq.h> | 19 | #include <asm/irq.h> |
19 | 20 | ||
@@ -1278,20 +1279,32 @@ static struct clk atmel_mci0_pclk = { | |||
1278 | .index = 9, | 1279 | .index = 9, |
1279 | }; | 1280 | }; |
1280 | 1281 | ||
1281 | struct platform_device *__init at32_add_device_mci(unsigned int id) | 1282 | struct platform_device *__init |
1283 | at32_add_device_mci(unsigned int id, struct mci_platform_data *data) | ||
1282 | { | 1284 | { |
1283 | struct platform_device *pdev; | 1285 | struct mci_platform_data _data; |
1286 | struct platform_device *pdev; | ||
1287 | struct dw_dma_slave *dws; | ||
1284 | 1288 | ||
1285 | if (id != 0) | 1289 | if (id != 0) |
1286 | return NULL; | 1290 | return NULL; |
1287 | 1291 | ||
1288 | pdev = platform_device_alloc("atmel_mci", id); | 1292 | pdev = platform_device_alloc("atmel_mci", id); |
1289 | if (!pdev) | 1293 | if (!pdev) |
1290 | return NULL; | 1294 | goto fail; |
1291 | 1295 | ||
1292 | if (platform_device_add_resources(pdev, atmel_mci0_resource, | 1296 | if (platform_device_add_resources(pdev, atmel_mci0_resource, |
1293 | ARRAY_SIZE(atmel_mci0_resource))) | 1297 | ARRAY_SIZE(atmel_mci0_resource))) |
1294 | goto err_add_resources; | 1298 | goto fail; |
1299 | |||
1300 | if (!data) { | ||
1301 | data = &_data; | ||
1302 | memset(data, 0, sizeof(struct mci_platform_data)); | ||
1303 | } | ||
1304 | |||
1305 | if (platform_device_add_data(pdev, data, | ||
1306 | sizeof(struct mci_platform_data))) | ||
1307 | goto fail; | ||
1295 | 1308 | ||
1296 | select_peripheral(PA(10), PERIPH_A, 0); /* CLK */ | 1309 | select_peripheral(PA(10), PERIPH_A, 0); /* CLK */ |
1297 | select_peripheral(PA(11), PERIPH_A, 0); /* CMD */ | 1310 | select_peripheral(PA(11), PERIPH_A, 0); /* CMD */ |
@@ -1300,12 +1313,19 @@ struct platform_device *__init at32_add_device_mci(unsigned int id) | |||
1300 | select_peripheral(PA(14), PERIPH_A, 0); /* DATA2 */ | 1313 | select_peripheral(PA(14), PERIPH_A, 0); /* DATA2 */ |
1301 | select_peripheral(PA(15), PERIPH_A, 0); /* DATA3 */ | 1314 | select_peripheral(PA(15), PERIPH_A, 0); /* DATA3 */ |
1302 | 1315 | ||
1316 | if (data) { | ||
1317 | if (data->detect_pin != GPIO_PIN_NONE) | ||
1318 | at32_select_gpio(data->detect_pin, 0); | ||
1319 | if (data->wp_pin != GPIO_PIN_NONE) | ||
1320 | at32_select_gpio(data->wp_pin, 0); | ||
1321 | } | ||
1322 | |||
1303 | atmel_mci0_pclk.dev = &pdev->dev; | 1323 | atmel_mci0_pclk.dev = &pdev->dev; |
1304 | 1324 | ||
1305 | platform_device_add(pdev); | 1325 | platform_device_add(pdev); |
1306 | return pdev; | 1326 | return pdev; |
1307 | 1327 | ||
1308 | err_add_resources: | 1328 | fail: |
1309 | platform_device_put(pdev); | 1329 | platform_device_put(pdev); |
1310 | return NULL; | 1330 | return NULL; |
1311 | } | 1331 | } |
diff --git a/arch/frv/mb93090-mb00/pci-frv.c b/arch/frv/mb93090-mb00/pci-frv.c index 4f165c93be42..edae117fcc2b 100644 --- a/arch/frv/mb93090-mb00/pci-frv.c +++ b/arch/frv/mb93090-mb00/pci-frv.c | |||
@@ -19,36 +19,6 @@ | |||
19 | 19 | ||
20 | #include "pci-frv.h" | 20 | #include "pci-frv.h" |
21 | 21 | ||
22 | #if 0 | ||
23 | void | ||
24 | pcibios_update_resource(struct pci_dev *dev, struct resource *root, | ||
25 | struct resource *res, int resource) | ||
26 | { | ||
27 | u32 new, check; | ||
28 | int reg; | ||
29 | |||
30 | new = res->start | (res->flags & PCI_REGION_FLAG_MASK); | ||
31 | if (resource < 6) { | ||
32 | reg = PCI_BASE_ADDRESS_0 + 4*resource; | ||
33 | } else if (resource == PCI_ROM_RESOURCE) { | ||
34 | res->flags |= IORESOURCE_ROM_ENABLE; | ||
35 | new |= PCI_ROM_ADDRESS_ENABLE; | ||
36 | reg = dev->rom_base_reg; | ||
37 | } else { | ||
38 | /* Somebody might have asked allocation of a non-standard resource */ | ||
39 | return; | ||
40 | } | ||
41 | |||
42 | pci_write_config_dword(dev, reg, new); | ||
43 | pci_read_config_dword(dev, reg, &check); | ||
44 | if ((new ^ check) & ((new & PCI_BASE_ADDRESS_SPACE_IO) ? PCI_BASE_ADDRESS_IO_MASK : PCI_BASE_ADDRESS_MEM_MASK)) { | ||
45 | printk(KERN_ERR "PCI: Error while updating region " | ||
46 | "%s/%d (%08x != %08x)\n", pci_name(dev), resource, | ||
47 | new, check); | ||
48 | } | ||
49 | } | ||
50 | #endif | ||
51 | |||
52 | /* | 22 | /* |
53 | * We need to avoid collisions with `mirrored' VGA ports | 23 | * We need to avoid collisions with `mirrored' VGA ports |
54 | * and other strange ISA hardware, so we always want the | 24 | * and other strange ISA hardware, so we always want the |
diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c index fabaf08d9a69..3ab8373103ec 100644 --- a/arch/ia64/kernel/process.c +++ b/arch/ia64/kernel/process.c | |||
@@ -55,6 +55,10 @@ void (*ia64_mark_idle)(int); | |||
55 | 55 | ||
56 | unsigned long boot_option_idle_override = 0; | 56 | unsigned long boot_option_idle_override = 0; |
57 | EXPORT_SYMBOL(boot_option_idle_override); | 57 | EXPORT_SYMBOL(boot_option_idle_override); |
58 | unsigned long idle_halt; | ||
59 | EXPORT_SYMBOL(idle_halt); | ||
60 | unsigned long idle_nomwait; | ||
61 | EXPORT_SYMBOL(idle_nomwait); | ||
58 | 62 | ||
59 | void | 63 | void |
60 | ia64_do_show_stack (struct unw_frame_info *info, void *arg) | 64 | ia64_do_show_stack (struct unw_frame_info *info, void *arg) |
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c index 318b81100623..68c978be9a51 100644 --- a/arch/ia64/kvm/kvm-ia64.c +++ b/arch/ia64/kvm/kvm-ia64.c | |||
@@ -395,7 +395,7 @@ static int handle_global_purge(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
395 | if (kvm->vcpus[i]->cpu != -1) { | 395 | if (kvm->vcpus[i]->cpu != -1) { |
396 | call_data.vcpu = kvm->vcpus[i]; | 396 | call_data.vcpu = kvm->vcpus[i]; |
397 | smp_call_function_single(kvm->vcpus[i]->cpu, | 397 | smp_call_function_single(kvm->vcpus[i]->cpu, |
398 | vcpu_global_purge, &call_data, 0, 1); | 398 | vcpu_global_purge, &call_data, 1); |
399 | } else | 399 | } else |
400 | printk(KERN_WARNING"kvm: Uninit vcpu received ipi!\n"); | 400 | printk(KERN_WARNING"kvm: Uninit vcpu received ipi!\n"); |
401 | 401 | ||
@@ -1693,7 +1693,7 @@ void kvm_vcpu_kick(struct kvm_vcpu *vcpu) | |||
1693 | wake_up_interruptible(&vcpu->wq); | 1693 | wake_up_interruptible(&vcpu->wq); |
1694 | 1694 | ||
1695 | if (vcpu->guest_mode) | 1695 | if (vcpu->guest_mode) |
1696 | smp_call_function_single(ipi_pcpu, vcpu_kick_intr, vcpu, 0, 0); | 1696 | smp_call_function_single(ipi_pcpu, vcpu_kick_intr, vcpu, 0); |
1697 | } | 1697 | } |
1698 | 1698 | ||
1699 | int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 trig) | 1699 | int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 trig) |
diff --git a/arch/ia64/kvm/kvm_fw.c b/arch/ia64/kvm/kvm_fw.c index 091f936c4485..0c69d9ec92d4 100644 --- a/arch/ia64/kvm/kvm_fw.c +++ b/arch/ia64/kvm/kvm_fw.c | |||
@@ -130,7 +130,7 @@ static struct ia64_pal_retval pal_cache_flush(struct kvm_vcpu *vcpu) | |||
130 | args.cache_type = gr29; | 130 | args.cache_type = gr29; |
131 | args.operation = gr30; | 131 | args.operation = gr30; |
132 | smp_call_function(remote_pal_cache_flush, | 132 | smp_call_function(remote_pal_cache_flush, |
133 | (void *)&args, 1, 1); | 133 | (void *)&args, 1); |
134 | if (args.status != 0) | 134 | if (args.status != 0) |
135 | printk(KERN_ERR"pal_cache_flush error!," | 135 | printk(KERN_ERR"pal_cache_flush error!," |
136 | "status:0x%lx\n", args.status); | 136 | "status:0x%lx\n", args.status); |
diff --git a/arch/m68knommu/kernel/comempci.c b/arch/m68knommu/kernel/comempci.c index 6ee00effbad2..0a68b5a85f86 100644 --- a/arch/m68knommu/kernel/comempci.c +++ b/arch/m68knommu/kernel/comempci.c | |||
@@ -375,15 +375,6 @@ int pcibios_enable_device(struct pci_dev *dev, int mask) | |||
375 | 375 | ||
376 | /*****************************************************************************/ | 376 | /*****************************************************************************/ |
377 | 377 | ||
378 | void pcibios_update_resource(struct pci_dev *dev, struct resource *root, struct resource *r, int resource) | ||
379 | { | ||
380 | printk(KERN_WARNING "%s(%d): no support for changing PCI resources...\n", | ||
381 | __FILE__, __LINE__); | ||
382 | } | ||
383 | |||
384 | |||
385 | /*****************************************************************************/ | ||
386 | |||
387 | /* | 378 | /* |
388 | * Local routines to interrcept the standard I/O and vector handling | 379 | * Local routines to interrcept the standard I/O and vector handling |
389 | * code. Don't include this 'till now - initialization code above needs | 380 | * code. Don't include this 'till now - initialization code above needs |
diff --git a/arch/mips/pmc-sierra/yosemite/ht.c b/arch/mips/pmc-sierra/yosemite/ht.c index 6380662bbf3c..678388fd34b1 100644 --- a/arch/mips/pmc-sierra/yosemite/ht.c +++ b/arch/mips/pmc-sierra/yosemite/ht.c | |||
@@ -345,42 +345,6 @@ int pcibios_enable_device(struct pci_dev *dev, int mask) | |||
345 | return pcibios_enable_resources(dev); | 345 | return pcibios_enable_resources(dev); |
346 | } | 346 | } |
347 | 347 | ||
348 | |||
349 | |||
350 | void pcibios_update_resource(struct pci_dev *dev, struct resource *root, | ||
351 | struct resource *res, int resource) | ||
352 | { | ||
353 | u32 new, check; | ||
354 | int reg; | ||
355 | |||
356 | return; | ||
357 | |||
358 | new = res->start | (res->flags & PCI_REGION_FLAG_MASK); | ||
359 | if (resource < 6) { | ||
360 | reg = PCI_BASE_ADDRESS_0 + 4 * resource; | ||
361 | } else if (resource == PCI_ROM_RESOURCE) { | ||
362 | res->flags |= IORESOURCE_ROM_ENABLE; | ||
363 | reg = dev->rom_base_reg; | ||
364 | } else { | ||
365 | /* | ||
366 | * Somebody might have asked allocation of a non-standard | ||
367 | * resource | ||
368 | */ | ||
369 | return; | ||
370 | } | ||
371 | |||
372 | pci_write_config_dword(dev, reg, new); | ||
373 | pci_read_config_dword(dev, reg, &check); | ||
374 | if ((new ^ check) & | ||
375 | ((new & PCI_BASE_ADDRESS_SPACE_IO) ? PCI_BASE_ADDRESS_IO_MASK : | ||
376 | PCI_BASE_ADDRESS_MEM_MASK)) { | ||
377 | printk(KERN_ERR "PCI: Error while updating region " | ||
378 | "%s/%d (%08x != %08x)\n", pci_name(dev), resource, | ||
379 | new, check); | ||
380 | } | ||
381 | } | ||
382 | |||
383 | |||
384 | void pcibios_align_resource(void *data, struct resource *res, | 348 | void pcibios_align_resource(void *data, struct resource *res, |
385 | resource_size_t size, resource_size_t align) | 349 | resource_size_t size, resource_size_t align) |
386 | { | 350 | { |
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 5dc8f8028d52..eb530b4128ba 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -289,7 +289,7 @@ config WARN_STACK_SIZE | |||
289 | int "Maximum frame size considered safe (128-2048)" | 289 | int "Maximum frame size considered safe (128-2048)" |
290 | range 128 2048 | 290 | range 128 2048 |
291 | depends on WARN_STACK | 291 | depends on WARN_STACK |
292 | default "256" | 292 | default "2048" |
293 | help | 293 | help |
294 | This allows you to specify the maximum frame size a function may | 294 | This allows you to specify the maximum frame size a function may |
295 | have without the compiler complaining about it. | 295 | have without the compiler complaining about it. |
diff --git a/arch/s390/kernel/stacktrace.c b/arch/s390/kernel/stacktrace.c index 57571f10270c..8841919ef7e6 100644 --- a/arch/s390/kernel/stacktrace.c +++ b/arch/s390/kernel/stacktrace.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/sched.h> | 10 | #include <linux/sched.h> |
11 | #include <linux/stacktrace.h> | 11 | #include <linux/stacktrace.h> |
12 | #include <linux/kallsyms.h> | 12 | #include <linux/kallsyms.h> |
13 | #include <linux/module.h> | ||
13 | 14 | ||
14 | static unsigned long save_context_stack(struct stack_trace *trace, | 15 | static unsigned long save_context_stack(struct stack_trace *trace, |
15 | unsigned long sp, | 16 | unsigned long sp, |
diff --git a/arch/sh/drivers/pci/pci.c b/arch/sh/drivers/pci/pci.c index 08d2e7325252..f57095a2617c 100644 --- a/arch/sh/drivers/pci/pci.c +++ b/arch/sh/drivers/pci/pci.c | |||
@@ -76,38 +76,6 @@ void __devinit __weak pcibios_fixup_bus(struct pci_bus *bus) | |||
76 | pci_read_bridge_bases(bus); | 76 | pci_read_bridge_bases(bus); |
77 | } | 77 | } |
78 | 78 | ||
79 | void | ||
80 | pcibios_update_resource(struct pci_dev *dev, struct resource *root, | ||
81 | struct resource *res, int resource) | ||
82 | { | ||
83 | u32 new, check; | ||
84 | int reg; | ||
85 | |||
86 | new = res->start | (res->flags & PCI_REGION_FLAG_MASK); | ||
87 | if (resource < 6) { | ||
88 | reg = PCI_BASE_ADDRESS_0 + 4*resource; | ||
89 | } else if (resource == PCI_ROM_RESOURCE) { | ||
90 | res->flags |= IORESOURCE_ROM_ENABLE; | ||
91 | new |= PCI_ROM_ADDRESS_ENABLE; | ||
92 | reg = dev->rom_base_reg; | ||
93 | } else { | ||
94 | /* | ||
95 | * Somebody might have asked allocation of a non-standard | ||
96 | * resource | ||
97 | */ | ||
98 | return; | ||
99 | } | ||
100 | |||
101 | pci_write_config_dword(dev, reg, new); | ||
102 | pci_read_config_dword(dev, reg, &check); | ||
103 | if ((new ^ check) & ((new & PCI_BASE_ADDRESS_SPACE_IO) ? | ||
104 | PCI_BASE_ADDRESS_IO_MASK : PCI_BASE_ADDRESS_MEM_MASK)) { | ||
105 | printk(KERN_ERR "PCI: Error while updating region " | ||
106 | "%s/%d (%08x != %08x)\n", pci_name(dev), resource, | ||
107 | new, check); | ||
108 | } | ||
109 | } | ||
110 | |||
111 | void pcibios_align_resource(void *data, struct resource *res, | 79 | void pcibios_align_resource(void *data, struct resource *res, |
112 | resource_size_t size, resource_size_t align) | 80 | resource_size_t size, resource_size_t align) |
113 | __attribute__ ((weak)); | 81 | __attribute__ ((weak)); |
diff --git a/arch/sparc64/kernel/pci.c b/arch/sparc64/kernel/pci.c index 112b09f16f36..d00a3656c287 100644 --- a/arch/sparc64/kernel/pci.c +++ b/arch/sparc64/kernel/pci.c | |||
@@ -408,7 +408,7 @@ struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm, | |||
408 | dev->class = class >> 8; | 408 | dev->class = class >> 8; |
409 | dev->revision = class & 0xff; | 409 | dev->revision = class & 0xff; |
410 | 410 | ||
411 | sprintf(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(bus), | 411 | sprintf(dev->dev.bus_id, "%04x:%02x:%02x.%d", pci_domain_nr(bus), |
412 | dev->bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn)); | 412 | dev->bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn)); |
413 | 413 | ||
414 | if (ofpci_verbose) | 414 | if (ofpci_verbose) |
diff --git a/arch/x86/kernel/acpi/processor.c b/arch/x86/kernel/acpi/processor.c index de2d2e4ebad9..7c074eec39fb 100644 --- a/arch/x86/kernel/acpi/processor.c +++ b/arch/x86/kernel/acpi/processor.c | |||
@@ -56,6 +56,12 @@ static void init_intel_pdc(struct acpi_processor *pr, struct cpuinfo_x86 *c) | |||
56 | if (cpu_has(c, X86_FEATURE_ACPI)) | 56 | if (cpu_has(c, X86_FEATURE_ACPI)) |
57 | buf[2] |= ACPI_PDC_T_FFH; | 57 | buf[2] |= ACPI_PDC_T_FFH; |
58 | 58 | ||
59 | /* | ||
60 | * If mwait/monitor is unsupported, C2/C3_FFH will be disabled | ||
61 | */ | ||
62 | if (!cpu_has(c, X86_FEATURE_MWAIT)) | ||
63 | buf[2] &= ~(ACPI_PDC_C_C2C3_FFH); | ||
64 | |||
59 | obj->type = ACPI_TYPE_BUFFER; | 65 | obj->type = ACPI_TYPE_BUFFER; |
60 | obj->buffer.length = 12; | 66 | obj->buffer.length = 12; |
61 | obj->buffer.pointer = (u8 *) buf; | 67 | obj->buffer.pointer = (u8 *) buf; |
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c index 793ad2045f58..868de3d5c39d 100644 --- a/arch/x86/kernel/acpi/sleep.c +++ b/arch/x86/kernel/acpi/sleep.c | |||
@@ -158,6 +158,8 @@ static int __init acpi_sleep_setup(char *str) | |||
158 | acpi_realmode_flags |= 2; | 158 | acpi_realmode_flags |= 2; |
159 | if (strncmp(str, "s3_beep", 7) == 0) | 159 | if (strncmp(str, "s3_beep", 7) == 0) |
160 | acpi_realmode_flags |= 4; | 160 | acpi_realmode_flags |= 4; |
161 | if (strncmp(str, "old_ordering", 12) == 0) | ||
162 | acpi_old_suspend_ordering(); | ||
161 | str = strchr(str, ','); | 163 | str = strchr(str, ','); |
162 | if (str != NULL) | 164 | if (str != NULL) |
163 | str += strspn(str, ", \t"); | 165 | str += strspn(str, ", \t"); |
diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c index 75cb5da4ea0a..bf9b441331e9 100644 --- a/arch/x86/kernel/apm_32.c +++ b/arch/x86/kernel/apm_32.c | |||
@@ -1213,9 +1213,9 @@ static int suspend(int vetoable) | |||
1213 | if (err != APM_SUCCESS) | 1213 | if (err != APM_SUCCESS) |
1214 | apm_error("suspend", err); | 1214 | apm_error("suspend", err); |
1215 | err = (err == APM_SUCCESS) ? 0 : -EIO; | 1215 | err = (err == APM_SUCCESS) ? 0 : -EIO; |
1216 | device_power_up(); | 1216 | device_power_up(PMSG_RESUME); |
1217 | local_irq_enable(); | 1217 | local_irq_enable(); |
1218 | device_resume(); | 1218 | device_resume(PMSG_RESUME); |
1219 | queue_event(APM_NORMAL_RESUME, NULL); | 1219 | queue_event(APM_NORMAL_RESUME, NULL); |
1220 | spin_lock(&user_list_lock); | 1220 | spin_lock(&user_list_lock); |
1221 | for (as = user_list; as != NULL; as = as->next) { | 1221 | for (as = user_list; as != NULL; as = as->next) { |
@@ -1240,7 +1240,7 @@ static void standby(void) | |||
1240 | apm_error("standby", err); | 1240 | apm_error("standby", err); |
1241 | 1241 | ||
1242 | local_irq_disable(); | 1242 | local_irq_disable(); |
1243 | device_power_up(); | 1243 | device_power_up(PMSG_RESUME); |
1244 | local_irq_enable(); | 1244 | local_irq_enable(); |
1245 | } | 1245 | } |
1246 | 1246 | ||
@@ -1326,7 +1326,7 @@ static void check_events(void) | |||
1326 | ignore_bounce = 1; | 1326 | ignore_bounce = 1; |
1327 | if ((event != APM_NORMAL_RESUME) | 1327 | if ((event != APM_NORMAL_RESUME) |
1328 | || (ignore_normal_resume == 0)) { | 1328 | || (ignore_normal_resume == 0)) { |
1329 | device_resume(); | 1329 | device_resume(PMSG_RESUME); |
1330 | queue_event(event, NULL); | 1330 | queue_event(event, NULL); |
1331 | } | 1331 | } |
1332 | ignore_normal_resume = 0; | 1332 | ignore_normal_resume = 0; |
diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c index a4665f37cfc5..a0e11c0cc872 100644 --- a/arch/x86/kernel/early-quirks.c +++ b/arch/x86/kernel/early-quirks.c | |||
@@ -120,7 +120,18 @@ static struct chipset early_qrk[] __initdata = { | |||
120 | {} | 120 | {} |
121 | }; | 121 | }; |
122 | 122 | ||
123 | static void __init check_dev_quirk(int num, int slot, int func) | 123 | /** |
124 | * check_dev_quirk - apply early quirks to a given PCI device | ||
125 | * @num: bus number | ||
126 | * @slot: slot number | ||
127 | * @func: PCI function | ||
128 | * | ||
129 | * Check the vendor & device ID against the early quirks table. | ||
130 | * | ||
131 | * If the device is single function, let early_quirks() know so we don't | ||
132 | * poke at this device again. | ||
133 | */ | ||
134 | static int __init check_dev_quirk(int num, int slot, int func) | ||
124 | { | 135 | { |
125 | u16 class; | 136 | u16 class; |
126 | u16 vendor; | 137 | u16 vendor; |
@@ -131,7 +142,7 @@ static void __init check_dev_quirk(int num, int slot, int func) | |||
131 | class = read_pci_config_16(num, slot, func, PCI_CLASS_DEVICE); | 142 | class = read_pci_config_16(num, slot, func, PCI_CLASS_DEVICE); |
132 | 143 | ||
133 | if (class == 0xffff) | 144 | if (class == 0xffff) |
134 | return; | 145 | return -1; /* no class, treat as single function */ |
135 | 146 | ||
136 | vendor = read_pci_config_16(num, slot, func, PCI_VENDOR_ID); | 147 | vendor = read_pci_config_16(num, slot, func, PCI_VENDOR_ID); |
137 | 148 | ||
@@ -154,7 +165,9 @@ static void __init check_dev_quirk(int num, int slot, int func) | |||
154 | type = read_pci_config_byte(num, slot, func, | 165 | type = read_pci_config_byte(num, slot, func, |
155 | PCI_HEADER_TYPE); | 166 | PCI_HEADER_TYPE); |
156 | if (!(type & 0x80)) | 167 | if (!(type & 0x80)) |
157 | return; | 168 | return -1; |
169 | |||
170 | return 0; | ||
158 | } | 171 | } |
159 | 172 | ||
160 | void __init early_quirks(void) | 173 | void __init early_quirks(void) |
@@ -167,6 +180,9 @@ void __init early_quirks(void) | |||
167 | /* Poor man's PCI discovery */ | 180 | /* Poor man's PCI discovery */ |
168 | for (num = 0; num < 32; num++) | 181 | for (num = 0; num < 32; num++) |
169 | for (slot = 0; slot < 32; slot++) | 182 | for (slot = 0; slot < 32; slot++) |
170 | for (func = 0; func < 8; func++) | 183 | for (func = 0; func < 8; func++) { |
171 | check_dev_quirk(num, slot, func); | 184 | /* Only probe function 0 on single fn devices */ |
185 | if (check_dev_quirk(num, slot, func)) | ||
186 | break; | ||
187 | } | ||
172 | } | 188 | } |
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 7dceea947232..4d629c62f4f8 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
@@ -7,6 +7,12 @@ | |||
7 | #include <linux/module.h> | 7 | #include <linux/module.h> |
8 | #include <linux/pm.h> | 8 | #include <linux/pm.h> |
9 | #include <linux/clockchips.h> | 9 | #include <linux/clockchips.h> |
10 | #include <asm/system.h> | ||
11 | |||
12 | unsigned long idle_halt; | ||
13 | EXPORT_SYMBOL(idle_halt); | ||
14 | unsigned long idle_nomwait; | ||
15 | EXPORT_SYMBOL(idle_nomwait); | ||
10 | 16 | ||
11 | struct kmem_cache *task_xstate_cachep; | 17 | struct kmem_cache *task_xstate_cachep; |
12 | 18 | ||
@@ -325,7 +331,27 @@ static int __init idle_setup(char *str) | |||
325 | pm_idle = poll_idle; | 331 | pm_idle = poll_idle; |
326 | } else if (!strcmp(str, "mwait")) | 332 | } else if (!strcmp(str, "mwait")) |
327 | force_mwait = 1; | 333 | force_mwait = 1; |
328 | else | 334 | else if (!strcmp(str, "halt")) { |
335 | /* | ||
336 | * When the boot option of idle=halt is added, halt is | ||
337 | * forced to be used for CPU idle. In such case CPU C2/C3 | ||
338 | * won't be used again. | ||
339 | * To continue to load the CPU idle driver, don't touch | ||
340 | * the boot_option_idle_override. | ||
341 | */ | ||
342 | pm_idle = default_idle; | ||
343 | idle_halt = 1; | ||
344 | return 0; | ||
345 | } else if (!strcmp(str, "nomwait")) { | ||
346 | /* | ||
347 | * If the boot option of "idle=nomwait" is added, | ||
348 | * it means that mwait will be disabled for CPU C2/C3 | ||
349 | * states. In such case it won't touch the variable | ||
350 | * of boot_option_idle_override. | ||
351 | */ | ||
352 | idle_nomwait = 1; | ||
353 | return 0; | ||
354 | } else | ||
329 | return -1; | 355 | return -1; |
330 | 356 | ||
331 | boot_option_idle_override = 1; | 357 | boot_option_idle_override = 1; |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 36c540d4ac4b..531b55b8e81a 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -684,6 +684,11 @@ void __init setup_arch(char **cmdline_p) | |||
684 | clear_cpu_cap(&boot_cpu_data, X86_FEATURE_APIC); | 684 | clear_cpu_cap(&boot_cpu_data, X86_FEATURE_APIC); |
685 | } | 685 | } |
686 | 686 | ||
687 | #ifdef CONFIG_PCI | ||
688 | if (pci_early_dump_regs) | ||
689 | early_dump_pci_devices(); | ||
690 | #endif | ||
691 | |||
687 | finish_e820_parsing(); | 692 | finish_e820_parsing(); |
688 | 693 | ||
689 | #ifdef CONFIG_X86_32 | 694 | #ifdef CONFIG_X86_32 |
diff --git a/arch/x86/mm/srat_32.c b/arch/x86/mm/srat_32.c index f41d67f8f831..1eb2973a301c 100644 --- a/arch/x86/mm/srat_32.c +++ b/arch/x86/mm/srat_32.c | |||
@@ -156,10 +156,9 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *memory_affinity) | |||
156 | 156 | ||
157 | num_memory_chunks++; | 157 | num_memory_chunks++; |
158 | 158 | ||
159 | printk(KERN_DEBUG "Memory range %08lx to %08lx (type %x)" | 159 | printk(KERN_DEBUG "Memory range %08lx to %08lx" |
160 | " in proximity domain %02x %s\n", | 160 | " in proximity domain %02x %s\n", |
161 | start_pfn, end_pfn, | 161 | start_pfn, end_pfn, |
162 | memory_affinity->memory_type, | ||
163 | pxm, | 162 | pxm, |
164 | ((memory_affinity->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE) ? | 163 | ((memory_affinity->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE) ? |
165 | "enabled and removable" : "enabled" ) ); | 164 | "enabled and removable" : "enabled" ) ); |
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index 20b9f59f95df..b67732bbb85a 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c | |||
@@ -20,6 +20,7 @@ | |||
20 | unsigned int pci_probe = PCI_PROBE_BIOS | PCI_PROBE_CONF1 | PCI_PROBE_CONF2 | | 20 | unsigned int pci_probe = PCI_PROBE_BIOS | PCI_PROBE_CONF1 | PCI_PROBE_CONF2 | |
21 | PCI_PROBE_MMCONF; | 21 | PCI_PROBE_MMCONF; |
22 | 22 | ||
23 | unsigned int pci_early_dump_regs; | ||
23 | static int pci_bf_sort; | 24 | static int pci_bf_sort; |
24 | int pci_routeirq; | 25 | int pci_routeirq; |
25 | int pcibios_last_bus = -1; | 26 | int pcibios_last_bus = -1; |
@@ -31,7 +32,7 @@ struct pci_raw_ops *raw_pci_ext_ops; | |||
31 | int raw_pci_read(unsigned int domain, unsigned int bus, unsigned int devfn, | 32 | int raw_pci_read(unsigned int domain, unsigned int bus, unsigned int devfn, |
32 | int reg, int len, u32 *val) | 33 | int reg, int len, u32 *val) |
33 | { | 34 | { |
34 | if (reg < 256 && raw_pci_ops) | 35 | if (domain == 0 && reg < 256 && raw_pci_ops) |
35 | return raw_pci_ops->read(domain, bus, devfn, reg, len, val); | 36 | return raw_pci_ops->read(domain, bus, devfn, reg, len, val); |
36 | if (raw_pci_ext_ops) | 37 | if (raw_pci_ext_ops) |
37 | return raw_pci_ext_ops->read(domain, bus, devfn, reg, len, val); | 38 | return raw_pci_ext_ops->read(domain, bus, devfn, reg, len, val); |
@@ -41,7 +42,7 @@ int raw_pci_read(unsigned int domain, unsigned int bus, unsigned int devfn, | |||
41 | int raw_pci_write(unsigned int domain, unsigned int bus, unsigned int devfn, | 42 | int raw_pci_write(unsigned int domain, unsigned int bus, unsigned int devfn, |
42 | int reg, int len, u32 val) | 43 | int reg, int len, u32 val) |
43 | { | 44 | { |
44 | if (reg < 256 && raw_pci_ops) | 45 | if (domain == 0 && reg < 256 && raw_pci_ops) |
45 | return raw_pci_ops->write(domain, bus, devfn, reg, len, val); | 46 | return raw_pci_ops->write(domain, bus, devfn, reg, len, val); |
46 | if (raw_pci_ext_ops) | 47 | if (raw_pci_ext_ops) |
47 | return raw_pci_ext_ops->write(domain, bus, devfn, reg, len, val); | 48 | return raw_pci_ext_ops->write(domain, bus, devfn, reg, len, val); |
@@ -121,6 +122,21 @@ void __init dmi_check_skip_isa_align(void) | |||
121 | dmi_check_system(can_skip_pciprobe_dmi_table); | 122 | dmi_check_system(can_skip_pciprobe_dmi_table); |
122 | } | 123 | } |
123 | 124 | ||
125 | static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev) | ||
126 | { | ||
127 | struct resource *rom_r = &dev->resource[PCI_ROM_RESOURCE]; | ||
128 | |||
129 | if (pci_probe & PCI_NOASSIGN_ROMS) { | ||
130 | if (rom_r->parent) | ||
131 | return; | ||
132 | if (rom_r->start) { | ||
133 | /* we deal with BIOS assigned ROM later */ | ||
134 | return; | ||
135 | } | ||
136 | rom_r->start = rom_r->end = rom_r->flags = 0; | ||
137 | } | ||
138 | } | ||
139 | |||
124 | /* | 140 | /* |
125 | * Called after each bus is probed, but before its children | 141 | * Called after each bus is probed, but before its children |
126 | * are examined. | 142 | * are examined. |
@@ -128,7 +144,11 @@ void __init dmi_check_skip_isa_align(void) | |||
128 | 144 | ||
129 | void __devinit pcibios_fixup_bus(struct pci_bus *b) | 145 | void __devinit pcibios_fixup_bus(struct pci_bus *b) |
130 | { | 146 | { |
147 | struct pci_dev *dev; | ||
148 | |||
131 | pci_read_bridge_bases(b); | 149 | pci_read_bridge_bases(b); |
150 | list_for_each_entry(dev, &b->devices, bus_list) | ||
151 | pcibios_fixup_device_resources(dev); | ||
132 | } | 152 | } |
133 | 153 | ||
134 | /* | 154 | /* |
@@ -481,12 +501,18 @@ char * __devinit pcibios_setup(char *str) | |||
481 | else if (!strcmp(str, "rom")) { | 501 | else if (!strcmp(str, "rom")) { |
482 | pci_probe |= PCI_ASSIGN_ROMS; | 502 | pci_probe |= PCI_ASSIGN_ROMS; |
483 | return NULL; | 503 | return NULL; |
504 | } else if (!strcmp(str, "norom")) { | ||
505 | pci_probe |= PCI_NOASSIGN_ROMS; | ||
506 | return NULL; | ||
484 | } else if (!strcmp(str, "assign-busses")) { | 507 | } else if (!strcmp(str, "assign-busses")) { |
485 | pci_probe |= PCI_ASSIGN_ALL_BUSSES; | 508 | pci_probe |= PCI_ASSIGN_ALL_BUSSES; |
486 | return NULL; | 509 | return NULL; |
487 | } else if (!strcmp(str, "use_crs")) { | 510 | } else if (!strcmp(str, "use_crs")) { |
488 | pci_probe |= PCI_USE__CRS; | 511 | pci_probe |= PCI_USE__CRS; |
489 | return NULL; | 512 | return NULL; |
513 | } else if (!strcmp(str, "earlydump")) { | ||
514 | pci_early_dump_regs = 1; | ||
515 | return NULL; | ||
490 | } else if (!strcmp(str, "routeirq")) { | 516 | } else if (!strcmp(str, "routeirq")) { |
491 | pci_routeirq = 1; | 517 | pci_routeirq = 1; |
492 | return NULL; | 518 | return NULL; |
diff --git a/arch/x86/pci/early.c b/arch/x86/pci/early.c index 42df4b6606df..858dbe3399f9 100644 --- a/arch/x86/pci/early.c +++ b/arch/x86/pci/early.c | |||
@@ -49,7 +49,14 @@ void write_pci_config_byte(u8 bus, u8 slot, u8 func, u8 offset, u8 val) | |||
49 | { | 49 | { |
50 | PDprintk("%x writing to %x: %x\n", slot, offset, val); | 50 | PDprintk("%x writing to %x: %x\n", slot, offset, val); |
51 | outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8); | 51 | outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8); |
52 | outb(val, 0xcfc); | 52 | outb(val, 0xcfc + (offset&3)); |
53 | } | ||
54 | |||
55 | void write_pci_config_16(u8 bus, u8 slot, u8 func, u8 offset, u16 val) | ||
56 | { | ||
57 | PDprintk("%x writing to %x: %x\n", slot, offset, val); | ||
58 | outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8); | ||
59 | outw(val, 0xcfc + (offset&2)); | ||
53 | } | 60 | } |
54 | 61 | ||
55 | int early_pci_allowed(void) | 62 | int early_pci_allowed(void) |
@@ -57,3 +64,54 @@ int early_pci_allowed(void) | |||
57 | return (pci_probe & (PCI_PROBE_CONF1|PCI_PROBE_NOEARLY)) == | 64 | return (pci_probe & (PCI_PROBE_CONF1|PCI_PROBE_NOEARLY)) == |
58 | PCI_PROBE_CONF1; | 65 | PCI_PROBE_CONF1; |
59 | } | 66 | } |
67 | |||
68 | void early_dump_pci_device(u8 bus, u8 slot, u8 func) | ||
69 | { | ||
70 | int i; | ||
71 | int j; | ||
72 | u32 val; | ||
73 | |||
74 | printk("PCI: %02x:%02x:%02x", bus, slot, func); | ||
75 | |||
76 | for (i = 0; i < 256; i += 4) { | ||
77 | if (!(i & 0x0f)) | ||
78 | printk("\n%04x:",i); | ||
79 | |||
80 | val = read_pci_config(bus, slot, func, i); | ||
81 | for (j = 0; j < 4; j++) { | ||
82 | printk(" %02x", val & 0xff); | ||
83 | val >>= 8; | ||
84 | } | ||
85 | } | ||
86 | printk("\n"); | ||
87 | } | ||
88 | |||
89 | void early_dump_pci_devices(void) | ||
90 | { | ||
91 | unsigned bus, slot, func; | ||
92 | |||
93 | if (!early_pci_allowed()) | ||
94 | return; | ||
95 | |||
96 | for (bus = 0; bus < 256; bus++) { | ||
97 | for (slot = 0; slot < 32; slot++) { | ||
98 | for (func = 0; func < 8; func++) { | ||
99 | u32 class; | ||
100 | u8 type; | ||
101 | class = read_pci_config(bus, slot, func, | ||
102 | PCI_CLASS_REVISION); | ||
103 | if (class == 0xffffffff) | ||
104 | break; | ||
105 | |||
106 | early_dump_pci_device(bus, slot, func); | ||
107 | |||
108 | /* No multi-function device? */ | ||
109 | type = read_pci_config_byte(bus, slot, func, | ||
110 | PCI_HEADER_TYPE); | ||
111 | if (!(type & 0x80)) | ||
112 | break; | ||
113 | } | ||
114 | } | ||
115 | } | ||
116 | } | ||
117 | |||
diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c index dc568c6b83f8..6a06a2eb0597 100644 --- a/arch/x86/pci/irq.c +++ b/arch/x86/pci/irq.c | |||
@@ -45,7 +45,8 @@ struct irq_router { | |||
45 | char *name; | 45 | char *name; |
46 | u16 vendor, device; | 46 | u16 vendor, device; |
47 | int (*get)(struct pci_dev *router, struct pci_dev *dev, int pirq); | 47 | int (*get)(struct pci_dev *router, struct pci_dev *dev, int pirq); |
48 | int (*set)(struct pci_dev *router, struct pci_dev *dev, int pirq, int new); | 48 | int (*set)(struct pci_dev *router, struct pci_dev *dev, int pirq, |
49 | int new); | ||
49 | }; | 50 | }; |
50 | 51 | ||
51 | struct irq_router_handler { | 52 | struct irq_router_handler { |
@@ -77,7 +78,8 @@ static inline struct irq_routing_table *pirq_check_routing_table(u8 *addr) | |||
77 | for (i = 0; i < rt->size; i++) | 78 | for (i = 0; i < rt->size; i++) |
78 | sum += addr[i]; | 79 | sum += addr[i]; |
79 | if (!sum) { | 80 | if (!sum) { |
80 | DBG(KERN_DEBUG "PCI: Interrupt Routing Table found at 0x%p\n", rt); | 81 | DBG(KERN_DEBUG "PCI: Interrupt Routing Table found at 0x%p\n", |
82 | rt); | ||
81 | return rt; | 83 | return rt; |
82 | } | 84 | } |
83 | return NULL; | 85 | return NULL; |
@@ -183,7 +185,8 @@ static unsigned int read_config_nybble(struct pci_dev *router, unsigned offset, | |||
183 | return (nr & 1) ? (x >> 4) : (x & 0xf); | 185 | return (nr & 1) ? (x >> 4) : (x & 0xf); |
184 | } | 186 | } |
185 | 187 | ||
186 | static void write_config_nybble(struct pci_dev *router, unsigned offset, unsigned nr, unsigned int val) | 188 | static void write_config_nybble(struct pci_dev *router, unsigned offset, |
189 | unsigned nr, unsigned int val) | ||
187 | { | 190 | { |
188 | u8 x; | 191 | u8 x; |
189 | unsigned reg = offset + (nr >> 1); | 192 | unsigned reg = offset + (nr >> 1); |
@@ -467,7 +470,8 @@ static int pirq_serverworks_get(struct pci_dev *router, struct pci_dev *dev, int | |||
467 | return inb(0xc01) & 0xf; | 470 | return inb(0xc01) & 0xf; |
468 | } | 471 | } |
469 | 472 | ||
470 | static int pirq_serverworks_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) | 473 | static int pirq_serverworks_set(struct pci_dev *router, struct pci_dev *dev, |
474 | int pirq, int irq) | ||
471 | { | 475 | { |
472 | outb(pirq, 0xc00); | 476 | outb(pirq, 0xc00); |
473 | outb(irq, 0xc01); | 477 | outb(irq, 0xc01); |
@@ -660,7 +664,8 @@ static __init int vlsi_router_probe(struct irq_router *r, struct pci_dev *router | |||
660 | } | 664 | } |
661 | 665 | ||
662 | 666 | ||
663 | static __init int serverworks_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) | 667 | static __init int serverworks_router_probe(struct irq_router *r, |
668 | struct pci_dev *router, u16 device) | ||
664 | { | 669 | { |
665 | switch (device) { | 670 | switch (device) { |
666 | case PCI_DEVICE_ID_SERVERWORKS_OSB4: | 671 | case PCI_DEVICE_ID_SERVERWORKS_OSB4: |
@@ -827,10 +832,12 @@ static void __init pirq_find_router(struct irq_router *r) | |||
827 | 832 | ||
828 | for (h = pirq_routers; h->vendor; h++) { | 833 | for (h = pirq_routers; h->vendor; h++) { |
829 | /* First look for a router match */ | 834 | /* First look for a router match */ |
830 | if (rt->rtr_vendor == h->vendor && h->probe(r, pirq_router_dev, rt->rtr_device)) | 835 | if (rt->rtr_vendor == h->vendor && |
836 | h->probe(r, pirq_router_dev, rt->rtr_device)) | ||
831 | break; | 837 | break; |
832 | /* Fall back to a device match */ | 838 | /* Fall back to a device match */ |
833 | if (pirq_router_dev->vendor == h->vendor && h->probe(r, pirq_router_dev, pirq_router_dev->device)) | 839 | if (pirq_router_dev->vendor == h->vendor && |
840 | h->probe(r, pirq_router_dev, pirq_router_dev->device)) | ||
834 | break; | 841 | break; |
835 | } | 842 | } |
836 | printk(KERN_INFO "PCI: Using IRQ router %s [%04x/%04x] at %s\n", | 843 | printk(KERN_INFO "PCI: Using IRQ router %s [%04x/%04x] at %s\n", |
@@ -845,11 +852,13 @@ static void __init pirq_find_router(struct irq_router *r) | |||
845 | static struct irq_info *pirq_get_info(struct pci_dev *dev) | 852 | static struct irq_info *pirq_get_info(struct pci_dev *dev) |
846 | { | 853 | { |
847 | struct irq_routing_table *rt = pirq_table; | 854 | struct irq_routing_table *rt = pirq_table; |
848 | int entries = (rt->size - sizeof(struct irq_routing_table)) / sizeof(struct irq_info); | 855 | int entries = (rt->size - sizeof(struct irq_routing_table)) / |
856 | sizeof(struct irq_info); | ||
849 | struct irq_info *info; | 857 | struct irq_info *info; |
850 | 858 | ||
851 | for (info = rt->slots; entries--; info++) | 859 | for (info = rt->slots; entries--; info++) |
852 | if (info->bus == dev->bus->number && PCI_SLOT(info->devfn) == PCI_SLOT(dev->devfn)) | 860 | if (info->bus == dev->bus->number && |
861 | PCI_SLOT(info->devfn) == PCI_SLOT(dev->devfn)) | ||
853 | return info; | 862 | return info; |
854 | return NULL; | 863 | return NULL; |
855 | } | 864 | } |
@@ -890,7 +899,8 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) | |||
890 | DBG(" -> not routed\n" KERN_DEBUG); | 899 | DBG(" -> not routed\n" KERN_DEBUG); |
891 | return 0; | 900 | return 0; |
892 | } | 901 | } |
893 | DBG(" -> PIRQ %02x, mask %04x, excl %04x", pirq, mask, pirq_table->exclusive_irqs); | 902 | DBG(" -> PIRQ %02x, mask %04x, excl %04x", pirq, mask, |
903 | pirq_table->exclusive_irqs); | ||
894 | mask &= pcibios_irq_mask; | 904 | mask &= pcibios_irq_mask; |
895 | 905 | ||
896 | /* Work around broken HP Pavilion Notebooks which assign USB to | 906 | /* Work around broken HP Pavilion Notebooks which assign USB to |
@@ -903,7 +913,8 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) | |||
903 | } | 913 | } |
904 | 914 | ||
905 | /* same for Acer Travelmate 360, but with CB and irq 11 -> 10 */ | 915 | /* same for Acer Travelmate 360, but with CB and irq 11 -> 10 */ |
906 | if (acer_tm360_irqrouting && dev->irq == 11 && dev->vendor == PCI_VENDOR_ID_O2) { | 916 | if (acer_tm360_irqrouting && dev->irq == 11 && |
917 | dev->vendor == PCI_VENDOR_ID_O2) { | ||
907 | pirq = 0x68; | 918 | pirq = 0x68; |
908 | mask = 0x400; | 919 | mask = 0x400; |
909 | dev->irq = r->get(pirq_router_dev, dev, pirq); | 920 | dev->irq = r->get(pirq_router_dev, dev, pirq); |
@@ -920,15 +931,16 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) | |||
920 | newirq = 0; | 931 | newirq = 0; |
921 | else | 932 | else |
922 | printk("\n" KERN_WARNING | 933 | printk("\n" KERN_WARNING |
923 | "PCI: IRQ %i for device %s doesn't match PIRQ mask " | 934 | "PCI: IRQ %i for device %s doesn't match PIRQ mask - try pci=usepirqmask\n" |
924 | "- try pci=usepirqmask\n" KERN_DEBUG, newirq, | 935 | KERN_DEBUG, newirq, |
925 | pci_name(dev)); | 936 | pci_name(dev)); |
926 | } | 937 | } |
927 | if (!newirq && assign) { | 938 | if (!newirq && assign) { |
928 | for (i = 0; i < 16; i++) { | 939 | for (i = 0; i < 16; i++) { |
929 | if (!(mask & (1 << i))) | 940 | if (!(mask & (1 << i))) |
930 | continue; | 941 | continue; |
931 | if (pirq_penalty[i] < pirq_penalty[newirq] && can_request_irq(i, IRQF_SHARED)) | 942 | if (pirq_penalty[i] < pirq_penalty[newirq] && |
943 | can_request_irq(i, IRQF_SHARED)) | ||
932 | newirq = i; | 944 | newirq = i; |
933 | } | 945 | } |
934 | } | 946 | } |
@@ -944,7 +956,8 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) | |||
944 | DBG(" -> got IRQ %d\n", irq); | 956 | DBG(" -> got IRQ %d\n", irq); |
945 | msg = "Found"; | 957 | msg = "Found"; |
946 | eisa_set_level_irq(irq); | 958 | eisa_set_level_irq(irq); |
947 | } else if (newirq && r->set && (dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) { | 959 | } else if (newirq && r->set && |
960 | (dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) { | ||
948 | DBG(" -> assigning IRQ %d", newirq); | 961 | DBG(" -> assigning IRQ %d", newirq); |
949 | if (r->set(pirq_router_dev, dev, pirq, newirq)) { | 962 | if (r->set(pirq_router_dev, dev, pirq, newirq)) { |
950 | eisa_set_level_irq(newirq); | 963 | eisa_set_level_irq(newirq); |
@@ -962,7 +975,8 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) | |||
962 | } else | 975 | } else |
963 | return 0; | 976 | return 0; |
964 | } | 977 | } |
965 | printk(KERN_INFO "PCI: %s IRQ %d for device %s\n", msg, irq, pci_name(dev)); | 978 | printk(KERN_INFO "PCI: %s IRQ %d for device %s\n", msg, irq, |
979 | pci_name(dev)); | ||
966 | 980 | ||
967 | /* Update IRQ for all devices with the same pirq value */ | 981 | /* Update IRQ for all devices with the same pirq value */ |
968 | while ((dev2 = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev2)) != NULL) { | 982 | while ((dev2 = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev2)) != NULL) { |
@@ -974,7 +988,10 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) | |||
974 | if (!info) | 988 | if (!info) |
975 | continue; | 989 | continue; |
976 | if (info->irq[pin].link == pirq) { | 990 | if (info->irq[pin].link == pirq) { |
977 | /* We refuse to override the dev->irq information. Give a warning! */ | 991 | /* |
992 | * We refuse to override the dev->irq | ||
993 | * information. Give a warning! | ||
994 | */ | ||
978 | if (dev2->irq && dev2->irq != irq && \ | 995 | if (dev2->irq && dev2->irq != irq && \ |
979 | (!(pci_probe & PCI_USE_PIRQ_MASK) || \ | 996 | (!(pci_probe & PCI_USE_PIRQ_MASK) || \ |
980 | ((1 << dev2->irq) & mask))) { | 997 | ((1 << dev2->irq) & mask))) { |
@@ -987,7 +1004,9 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign) | |||
987 | dev2->irq = irq; | 1004 | dev2->irq = irq; |
988 | pirq_penalty[irq]++; | 1005 | pirq_penalty[irq]++; |
989 | if (dev != dev2) | 1006 | if (dev != dev2) |
990 | printk(KERN_INFO "PCI: Sharing IRQ %d with %s\n", irq, pci_name(dev2)); | 1007 | printk(KERN_INFO |
1008 | "PCI: Sharing IRQ %d with %s\n", | ||
1009 | irq, pci_name(dev2)); | ||
991 | } | 1010 | } |
992 | } | 1011 | } |
993 | return 1; | 1012 | return 1; |
@@ -1001,15 +1020,21 @@ static void __init pcibios_fixup_irqs(void) | |||
1001 | DBG(KERN_DEBUG "PCI: IRQ fixup\n"); | 1020 | DBG(KERN_DEBUG "PCI: IRQ fixup\n"); |
1002 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { | 1021 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { |
1003 | /* | 1022 | /* |
1004 | * If the BIOS has set an out of range IRQ number, just ignore it. | 1023 | * If the BIOS has set an out of range IRQ number, just |
1005 | * Also keep track of which IRQ's are already in use. | 1024 | * ignore it. Also keep track of which IRQ's are |
1025 | * already in use. | ||
1006 | */ | 1026 | */ |
1007 | if (dev->irq >= 16) { | 1027 | if (dev->irq >= 16) { |
1008 | DBG(KERN_DEBUG "%s: ignoring bogus IRQ %d\n", pci_name(dev), dev->irq); | 1028 | DBG(KERN_DEBUG "%s: ignoring bogus IRQ %d\n", |
1029 | pci_name(dev), dev->irq); | ||
1009 | dev->irq = 0; | 1030 | dev->irq = 0; |
1010 | } | 1031 | } |
1011 | /* If the IRQ is already assigned to a PCI device, ignore its ISA use penalty */ | 1032 | /* |
1012 | if (pirq_penalty[dev->irq] >= 100 && pirq_penalty[dev->irq] < 100000) | 1033 | * If the IRQ is already assigned to a PCI device, |
1034 | * ignore its ISA use penalty | ||
1035 | */ | ||
1036 | if (pirq_penalty[dev->irq] >= 100 && | ||
1037 | pirq_penalty[dev->irq] < 100000) | ||
1013 | pirq_penalty[dev->irq] = 0; | 1038 | pirq_penalty[dev->irq] = 0; |
1014 | pirq_penalty[dev->irq]++; | 1039 | pirq_penalty[dev->irq]++; |
1015 | } | 1040 | } |
@@ -1025,8 +1050,13 @@ static void __init pcibios_fixup_irqs(void) | |||
1025 | int irq; | 1050 | int irq; |
1026 | 1051 | ||
1027 | if (pin) { | 1052 | if (pin) { |
1028 | pin--; /* interrupt pins are numbered starting from 1 */ | 1053 | /* |
1029 | irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin); | 1054 | * interrupt pins are numbered starting |
1055 | * from 1 | ||
1056 | */ | ||
1057 | pin--; | ||
1058 | irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, | ||
1059 | PCI_SLOT(dev->devfn), pin); | ||
1030 | /* | 1060 | /* |
1031 | * Busses behind bridges are typically not listed in the MP-table. | 1061 | * Busses behind bridges are typically not listed in the MP-table. |
1032 | * In this case we have to look up the IRQ based on the parent bus, | 1062 | * In this case we have to look up the IRQ based on the parent bus, |
@@ -1067,7 +1097,8 @@ static int __init fix_broken_hp_bios_irq9(const struct dmi_system_id *d) | |||
1067 | { | 1097 | { |
1068 | if (!broken_hp_bios_irq9) { | 1098 | if (!broken_hp_bios_irq9) { |
1069 | broken_hp_bios_irq9 = 1; | 1099 | broken_hp_bios_irq9 = 1; |
1070 | printk(KERN_INFO "%s detected - fixing broken IRQ routing\n", d->ident); | 1100 | printk(KERN_INFO "%s detected - fixing broken IRQ routing\n", |
1101 | d->ident); | ||
1071 | } | 1102 | } |
1072 | return 0; | 1103 | return 0; |
1073 | } | 1104 | } |
@@ -1080,7 +1111,8 @@ static int __init fix_acer_tm360_irqrouting(const struct dmi_system_id *d) | |||
1080 | { | 1111 | { |
1081 | if (!acer_tm360_irqrouting) { | 1112 | if (!acer_tm360_irqrouting) { |
1082 | acer_tm360_irqrouting = 1; | 1113 | acer_tm360_irqrouting = 1; |
1083 | printk(KERN_INFO "%s detected - fixing broken IRQ routing\n", d->ident); | 1114 | printk(KERN_INFO "%s detected - fixing broken IRQ routing\n", |
1115 | d->ident); | ||
1084 | } | 1116 | } |
1085 | return 0; | 1117 | return 0; |
1086 | } | 1118 | } |
@@ -1092,7 +1124,8 @@ static struct dmi_system_id __initdata pciirq_dmi_table[] = { | |||
1092 | .matches = { | 1124 | .matches = { |
1093 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | 1125 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), |
1094 | DMI_MATCH(DMI_BIOS_VERSION, "GE.M1.03"), | 1126 | DMI_MATCH(DMI_BIOS_VERSION, "GE.M1.03"), |
1095 | DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook Model GE"), | 1127 | DMI_MATCH(DMI_PRODUCT_VERSION, |
1128 | "HP Pavilion Notebook Model GE"), | ||
1096 | DMI_MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736"), | 1129 | DMI_MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736"), |
1097 | }, | 1130 | }, |
1098 | }, | 1131 | }, |
@@ -1131,7 +1164,10 @@ int __init pcibios_irq_init(void) | |||
1131 | if (!(pirq_table->exclusive_irqs & (1 << i))) | 1164 | if (!(pirq_table->exclusive_irqs & (1 << i))) |
1132 | pirq_penalty[i] += 100; | 1165 | pirq_penalty[i] += 100; |
1133 | } | 1166 | } |
1134 | /* If we're using the I/O APIC, avoid using the PCI IRQ routing table */ | 1167 | /* |
1168 | * If we're using the I/O APIC, avoid using the PCI IRQ | ||
1169 | * routing table | ||
1170 | */ | ||
1135 | if (io_apic_assign_pci_irqs) | 1171 | if (io_apic_assign_pci_irqs) |
1136 | pirq_table = NULL; | 1172 | pirq_table = NULL; |
1137 | } | 1173 | } |
@@ -1175,7 +1211,7 @@ static int pirq_enable_irq(struct pci_dev *dev) | |||
1175 | if (pin && !pcibios_lookup_irq(dev, 1) && !dev->irq) { | 1211 | if (pin && !pcibios_lookup_irq(dev, 1) && !dev->irq) { |
1176 | char *msg = ""; | 1212 | char *msg = ""; |
1177 | 1213 | ||
1178 | pin--; /* interrupt pins are numbered starting from 1 */ | 1214 | pin--; /* interrupt pins are numbered starting from 1 */ |
1179 | 1215 | ||
1180 | if (io_apic_assign_pci_irqs) { | 1216 | if (io_apic_assign_pci_irqs) { |
1181 | int irq; | 1217 | int irq; |
@@ -1195,13 +1231,16 @@ static int pirq_enable_irq(struct pci_dev *dev) | |||
1195 | irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, | 1231 | irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, |
1196 | PCI_SLOT(bridge->devfn), pin); | 1232 | PCI_SLOT(bridge->devfn), pin); |
1197 | if (irq >= 0) | 1233 | if (irq >= 0) |
1198 | printk(KERN_WARNING "PCI: using PPB %s[%c] to get irq %d\n", | 1234 | printk(KERN_WARNING |
1199 | pci_name(bridge), 'A' + pin, irq); | 1235 | "PCI: using PPB %s[%c] to get irq %d\n", |
1236 | pci_name(bridge), | ||
1237 | 'A' + pin, irq); | ||
1200 | dev = bridge; | 1238 | dev = bridge; |
1201 | } | 1239 | } |
1202 | dev = temp_dev; | 1240 | dev = temp_dev; |
1203 | if (irq >= 0) { | 1241 | if (irq >= 0) { |
1204 | printk(KERN_INFO "PCI->APIC IRQ transform: %s[%c] -> IRQ %d\n", | 1242 | printk(KERN_INFO |
1243 | "PCI->APIC IRQ transform: %s[%c] -> IRQ %d\n", | ||
1205 | pci_name(dev), 'A' + pin, irq); | 1244 | pci_name(dev), 'A' + pin, irq); |
1206 | dev->irq = irq; | 1245 | dev->irq = irq; |
1207 | return 0; | 1246 | return 0; |
@@ -1212,12 +1251,17 @@ static int pirq_enable_irq(struct pci_dev *dev) | |||
1212 | else | 1251 | else |
1213 | msg = " Please try using pci=biosirq."; | 1252 | msg = " Please try using pci=biosirq."; |
1214 | 1253 | ||
1215 | /* With IDE legacy devices the IRQ lookup failure is not a problem.. */ | 1254 | /* |
1216 | if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE && !(dev->class & 0x5)) | 1255 | * With IDE legacy devices the IRQ lookup failure is not |
1256 | * a problem.. | ||
1257 | */ | ||
1258 | if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE && | ||
1259 | !(dev->class & 0x5)) | ||
1217 | return 0; | 1260 | return 0; |
1218 | 1261 | ||
1219 | printk(KERN_WARNING "PCI: No IRQ known for interrupt pin %c of device %s.%s\n", | 1262 | printk(KERN_WARNING |
1220 | 'A' + pin, pci_name(dev), msg); | 1263 | "PCI: No IRQ known for interrupt pin %c of device %s.%s\n", |
1264 | 'A' + pin, pci_name(dev), msg); | ||
1221 | } | 1265 | } |
1222 | return 0; | 1266 | return 0; |
1223 | } | 1267 | } |
diff --git a/arch/x86/pci/pci.h b/arch/x86/pci/pci.h index b2270a55b0cf..3e25deb821ac 100644 --- a/arch/x86/pci/pci.h +++ b/arch/x86/pci/pci.h | |||
@@ -28,6 +28,7 @@ | |||
28 | #define PCI_USE__CRS 0x10000 | 28 | #define PCI_USE__CRS 0x10000 |
29 | #define PCI_CHECK_ENABLE_AMD_MMCONF 0x20000 | 29 | #define PCI_CHECK_ENABLE_AMD_MMCONF 0x20000 |
30 | #define PCI_HAS_IO_ECS 0x40000 | 30 | #define PCI_HAS_IO_ECS 0x40000 |
31 | #define PCI_NOASSIGN_ROMS 0x80000 | ||
31 | 32 | ||
32 | extern unsigned int pci_probe; | 33 | extern unsigned int pci_probe; |
33 | extern unsigned long pirq_table_addr; | 34 | extern unsigned long pirq_table_addr; |