aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pnp
diff options
context:
space:
mode:
authorBjorn Helgaas <bjorn.helgaas@hp.com>2008-02-06 04:40:08 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2008-02-06 13:41:20 -0500
commit445a1d3e24b806bff01e422f0ddadf68e0eb5d0f (patch)
tree38d3505ad614ea401bd5dde8eb04295e35970ce8 /drivers/pnp
parent5d38998ed15b31f524bde9a193d60150af30d916 (diff)
PNP: disable Supermicro H8DCE motherboard resources that overlap SATA BARs
Some Supermicro BIOSes describe a SATA PCI BAR as a motherboard resource. The PNP system driver claims motherboard resources, and this prevents the sata_nv driver from requesting it later. This patch disables the PNP0C01/PNP0C02 resources so they won't be claimed by the PNP system driver, so they'll available for sata_nv. This fixes the bugs below, where sata_nv detects only two out of four SATA drives. The signature includes dmesg lines similar to these: pnp: 00:09: iomem range 0xdfefc000-0xdfefcfff has been reserved pnp: 00:09: iomem range 0xdfefd000-0xdfefd3ff has been reserved pnp: 00:09: iomem range 0xdfefe000-0xdfefe3ff has been reserved PCI: Unable to reserve mem region #6:1000@dfefd000 for device 0000:80:07.0 sata_nv: probe of 0000:80:07.0 failed with error -16 PCI: Unable to reserve mem region #6:1000@dfefe000 for device 0000:80:08.0 sata_nv: probe of 0000:80:08.0 failed with error -16 References: https://bugzilla.redhat.com/show_bug.cgi?id=280641 https://bugzilla.redhat.com/show_bug.cgi?id=313491 http://lkml.org/lkml/2008/1/9/449 http://thread.gmane.org/gmane.linux.acpi.devel/27312 This is post-2.6.24 material. Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/pnp')
-rw-r--r--drivers/pnp/quirks.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c
index e903b8c2b1fa..4065139753b6 100644
--- a/drivers/pnp/quirks.c
+++ b/drivers/pnp/quirks.c
@@ -17,6 +17,7 @@
17#include <linux/slab.h> 17#include <linux/slab.h>
18#include <linux/pnp.h> 18#include <linux/pnp.h>
19#include <linux/io.h> 19#include <linux/io.h>
20#include <linux/dmi.h>
20#include <linux/kallsyms.h> 21#include <linux/kallsyms.h>
21#include "base.h" 22#include "base.h"
22 23
@@ -108,6 +109,46 @@ static void quirk_sb16audio_resources(struct pnp_dev *dev)
108 "pnp: SB audio device quirk - increasing port range\n"); 109 "pnp: SB audio device quirk - increasing port range\n");
109} 110}
110 111
112static void quirk_supermicro_h8dce_system(struct pnp_dev *dev)
113{
114 int i;
115 static struct dmi_system_id supermicro_h8dce[] = {
116 {
117 .ident = "Supermicro H8DCE",
118 .matches = {
119 DMI_MATCH(DMI_SYS_VENDOR, "Supermicro"),
120 DMI_MATCH(DMI_PRODUCT_NAME, "H8DCE"),
121 },
122 },
123 { }
124 };
125
126 if (!dmi_check_system(supermicro_h8dce))
127 return;
128
129 /*
130 * On the Supermicro H8DCE, there's a system device with resources
131 * that overlap BAR 6 of the built-in SATA PCI adapter. If the PNP
132 * system device claims them, the sata_nv driver won't be able to.
133 * More details at:
134 * https://bugzilla.redhat.com/show_bug.cgi?id=280641
135 * https://bugzilla.redhat.com/show_bug.cgi?id=313491
136 * http://lkml.org/lkml/2008/1/9/449
137 * http://thread.gmane.org/gmane.linux.acpi.devel/27312
138 */
139 for (i = 0; i < PNP_MAX_MEM; i++) {
140 if (pnp_mem_valid(dev, i) && pnp_mem_len(dev, i) &&
141 (pnp_mem_start(dev, i) & 0xdfef0000) == 0xdfef0000) {
142 dev_warn(&dev->dev, "disabling 0x%llx-0x%llx to prevent"
143 " conflict with sata_nv PCI device\n",
144 (unsigned long long) pnp_mem_start(dev, i),
145 (unsigned long long) (pnp_mem_start(dev, i) +
146 pnp_mem_len(dev, i) - 1));
147 pnp_mem_flags(dev, i) = 0;
148 }
149 }
150}
151
111/* 152/*
112 * PnP Quirks 153 * PnP Quirks
113 * Cards or devices that need some tweaking due to incomplete resource info 154 * Cards or devices that need some tweaking due to incomplete resource info
@@ -128,6 +169,8 @@ static struct pnp_fixup pnp_fixups[] = {
128 {"CTL0043", quirk_sb16audio_resources}, 169 {"CTL0043", quirk_sb16audio_resources},
129 {"CTL0044", quirk_sb16audio_resources}, 170 {"CTL0044", quirk_sb16audio_resources},
130 {"CTL0045", quirk_sb16audio_resources}, 171 {"CTL0045", quirk_sb16audio_resources},
172 {"PNP0c01", quirk_supermicro_h8dce_system},
173 {"PNP0c02", quirk_supermicro_h8dce_system},
131 {""} 174 {""}
132}; 175};
133 176