diff options
Diffstat (limited to 'arch/x86/pci/acpi.c')
-rw-r--r-- | arch/x86/pci/acpi.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index 192397c98606..49e5195223db 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c | |||
@@ -22,6 +22,7 @@ struct pci_root_info { | |||
22 | }; | 22 | }; |
23 | 23 | ||
24 | static bool pci_use_crs = true; | 24 | static bool pci_use_crs = true; |
25 | static bool pci_ignore_seg = false; | ||
25 | 26 | ||
26 | static int __init set_use_crs(const struct dmi_system_id *id) | 27 | static int __init set_use_crs(const struct dmi_system_id *id) |
27 | { | 28 | { |
@@ -35,7 +36,14 @@ static int __init set_nouse_crs(const struct dmi_system_id *id) | |||
35 | return 0; | 36 | return 0; |
36 | } | 37 | } |
37 | 38 | ||
38 | static const struct dmi_system_id pci_use_crs_table[] __initconst = { | 39 | static int __init set_ignore_seg(const struct dmi_system_id *id) |
40 | { | ||
41 | printk(KERN_INFO "PCI: %s detected: ignoring ACPI _SEG\n", id->ident); | ||
42 | pci_ignore_seg = true; | ||
43 | return 0; | ||
44 | } | ||
45 | |||
46 | static const struct dmi_system_id pci_crs_quirks[] __initconst = { | ||
39 | /* http://bugzilla.kernel.org/show_bug.cgi?id=14183 */ | 47 | /* http://bugzilla.kernel.org/show_bug.cgi?id=14183 */ |
40 | { | 48 | { |
41 | .callback = set_use_crs, | 49 | .callback = set_use_crs, |
@@ -98,6 +106,16 @@ static const struct dmi_system_id pci_use_crs_table[] __initconst = { | |||
98 | DMI_MATCH(DMI_BIOS_VERSION, "6JET85WW (1.43 )"), | 106 | DMI_MATCH(DMI_BIOS_VERSION, "6JET85WW (1.43 )"), |
99 | }, | 107 | }, |
100 | }, | 108 | }, |
109 | |||
110 | /* https://bugzilla.kernel.org/show_bug.cgi?id=15362 */ | ||
111 | { | ||
112 | .callback = set_ignore_seg, | ||
113 | .ident = "HP xw9300", | ||
114 | .matches = { | ||
115 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
116 | DMI_MATCH(DMI_PRODUCT_NAME, "HP xw9300 Workstation"), | ||
117 | }, | ||
118 | }, | ||
101 | {} | 119 | {} |
102 | }; | 120 | }; |
103 | 121 | ||
@@ -108,7 +126,7 @@ void __init pci_acpi_crs_quirks(void) | |||
108 | if (dmi_get_date(DMI_BIOS_DATE, &year, NULL, NULL) && year < 2008) | 126 | if (dmi_get_date(DMI_BIOS_DATE, &year, NULL, NULL) && year < 2008) |
109 | pci_use_crs = false; | 127 | pci_use_crs = false; |
110 | 128 | ||
111 | dmi_check_system(pci_use_crs_table); | 129 | dmi_check_system(pci_crs_quirks); |
112 | 130 | ||
113 | /* | 131 | /* |
114 | * If the user specifies "pci=use_crs" or "pci=nocrs" explicitly, that | 132 | * If the user specifies "pci=use_crs" or "pci=nocrs" explicitly, that |
@@ -455,6 +473,9 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_pci_root *root) | |||
455 | int pxm; | 473 | int pxm; |
456 | #endif | 474 | #endif |
457 | 475 | ||
476 | if (pci_ignore_seg) | ||
477 | domain = 0; | ||
478 | |||
458 | if (domain && !pci_domains_supported) { | 479 | if (domain && !pci_domains_supported) { |
459 | printk(KERN_WARNING "pci_bus %04x:%02x: " | 480 | printk(KERN_WARNING "pci_bus %04x:%02x: " |
460 | "ignored (multiple domains not supported)\n", | 481 | "ignored (multiple domains not supported)\n", |