aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjorn Helgaas <bhelgaas@google.com>2012-10-29 19:26:54 -0400
committerBjorn Helgaas <bhelgaas@google.com>2012-11-07 17:24:18 -0500
commit1f09b09b4de0e120800e49d806d264e7446ed446 (patch)
tree2a43aa760bfdaac0f67768f28c660f1af82eaad0
parent42eca2302146fed51335b95128e949ee6f54478f (diff)
x86/PCI: Ignore _SEG on HP xw9300
The xw9300 BIOS supplies _SEG methods that are incorrect, which results in some LSI SCSI devices not being discovered. This adds a quirk to ignore _SEG on this machine and default to zero. The xw9300 has three host bridges: ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-3f]) ACPI: PCI Root Bridge [PCI1] (domain 0001 [bus 40-7f]) ACPI: PCI Root Bridge [PCI2] (domain 0002 [bus 80-ff]) When the BIOS "ACPI Bus Segmentation" option is enabled (as it is by default), the _SEG methods of the PCI1 and PCI2 bridges return 1 and 2, respectively. However, the BIOS implementation appears to be incomplete, and we can't enumerate devices in those domains. But if we assume PCI1 and PCI2 really lead to buses in domain 0, everything works fine. Windows XP and Vista also seem to ignore these _SEG methods. Reference: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=543308 Reference: https://bugzilla.kernel.org/show_bug.cgi?id=15362 Reported-and-Tested-by: Sean M. Pappalardo <pegasus@renegadetech.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
-rw-r--r--arch/x86/pci/acpi.c25
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
24static bool pci_use_crs = true; 24static bool pci_use_crs = true;
25static bool pci_ignore_seg = false;
25 26
26static int __init set_use_crs(const struct dmi_system_id *id) 27static 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
38static const struct dmi_system_id pci_use_crs_table[] __initconst = { 39static 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
46static 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",