summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata/chipsets
diff options
context:
space:
mode:
authorsbruno <sbruno@FreeBSD.org>2012-01-04 02:01:27 +0000
committersbruno <sbruno@FreeBSD.org>2012-01-04 02:01:27 +0000
commit39d07b056ff7ed4a2cd65691be23d3c93398b881 (patch)
tree5207a81db7d21800f965bb648d0ff2001f7331ca /sys/dev/ata/chipsets
parentd08191b4175ebda3e5ac2fabbe62e2bdf139a201 (diff)
parentcaa4548474a54b104b7a14a1625ef6c39b848dd3 (diff)
downloadFreeBSD-src-39d07b056ff7ed4a2cd65691be23d3c93398b881.zip
FreeBSD-src-39d07b056ff7ed4a2cd65691be23d3c93398b881.tar.gz
IFC to head to catch up the bhyve branch
Approved by: grehan@
Diffstat (limited to 'sys/dev/ata/chipsets')
-rw-r--r--sys/dev/ata/chipsets/ata-ati.c24
-rw-r--r--sys/dev/ata/chipsets/ata-intel.c4
-rw-r--r--sys/dev/ata/chipsets/ata-nvidia.c4
3 files changed, 30 insertions, 2 deletions
diff --git a/sys/dev/ata/chipsets/ata-ati.c b/sys/dev/ata/chipsets/ata-ati.c
index 1dfd84b..ada70d7 100644
--- a/sys/dev/ata/chipsets/ata-ati.c
+++ b/sys/dev/ata/chipsets/ata-ati.c
@@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$");
/* local prototypes */
static int ata_ati_chipinit(device_t dev);
+static int ata_ati_dumb_ch_attach(device_t dev);
static int ata_ati_ixp700_ch_attach(device_t dev);
static int ata_ati_setmode(device_t dev, int target, int mode);
@@ -63,6 +64,8 @@ static int ata_ati_setmode(device_t dev, int target, int mode);
#define SII_MEMIO 1
#define SII_BUG 0x04
+static int force_ahci = 1;
+TUNABLE_INT("hw.ahci.force", &force_ahci);
/*
* ATI chipset support functions
@@ -111,7 +114,10 @@ ata_ati_probe(device_t dev)
ctlr->chipinit = ata_sii_chipinit;
break;
case ATI_AHCI:
- ctlr->chipinit = ata_ahci_chipinit;
+ if (force_ahci == 1 || pci_get_subclass(dev) != PCIS_STORAGE_IDE)
+ ctlr->chipinit = ata_ahci_chipinit;
+ else
+ ctlr->chipinit = ata_ati_chipinit;
break;
}
return (BUS_PROBE_DEFAULT);
@@ -127,6 +133,11 @@ ata_ati_chipinit(device_t dev)
if (ata_setup_interrupt(dev, ata_generic_intr))
return ENXIO;
+ if (ctlr->chip->cfg1 == ATI_AHCI) {
+ ctlr->ch_attach = ata_ati_dumb_ch_attach;
+ ctlr->setmode = ata_sata_setmode;
+ return (0);
+ }
switch (ctlr->chip->chipid) {
case ATA_ATI_IXP600:
/* IXP600 only has 1 PATA channel */
@@ -165,6 +176,17 @@ ata_ati_chipinit(device_t dev)
}
static int
+ata_ati_dumb_ch_attach(device_t dev)
+{
+ struct ata_channel *ch = device_get_softc(dev);
+
+ if (ata_pci_ch_attach(dev))
+ return ENXIO;
+ ch->flags |= ATA_SATA;
+ return (0);
+}
+
+static int
ata_ati_ixp700_ch_attach(device_t dev)
{
struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev));
diff --git a/sys/dev/ata/chipsets/ata-intel.c b/sys/dev/ata/chipsets/ata-intel.c
index c5c22cb..ebcfd79 100644
--- a/sys/dev/ata/chipsets/ata-intel.c
+++ b/sys/dev/ata/chipsets/ata-intel.c
@@ -157,6 +157,10 @@ ata_intel_probe(device_t dev)
{ ATA_I82801IB_AH4, 0, INTEL_AHCI, 0, ATA_SA300, "ICH9" },
{ ATA_I82801IB_AH6, 0, INTEL_AHCI, 0, ATA_SA300, "ICH9" },
{ ATA_I82801IB_R1, 0, INTEL_AHCI, 0, ATA_SA300, "ICH9" },
+ { ATA_I82801IBM_S1, 0, INTEL_6CH2, 0, ATA_SA300, "ICH9M" },
+ { ATA_I82801IBM_AH, 0, INTEL_AHCI, 0, ATA_SA300, "ICH9M" },
+ { ATA_I82801IBM_R1, 0, INTEL_AHCI, 0, ATA_SA300, "ICH9M" },
+ { ATA_I82801IBM_S2, 0, INTEL_6CH2, 0, ATA_SA300, "ICH9M" },
{ ATA_I82801JIB_S1, 0, INTEL_6CH, 0, ATA_SA300, "ICH10" },
{ ATA_I82801JIB_AH, 0, INTEL_AHCI, 0, ATA_SA300, "ICH10" },
{ ATA_I82801JIB_R1, 0, INTEL_AHCI, 0, ATA_SA300, "ICH10" },
diff --git a/sys/dev/ata/chipsets/ata-nvidia.c b/sys/dev/ata/chipsets/ata-nvidia.c
index 2edc0f1..580dfca 100644
--- a/sys/dev/ata/chipsets/ata-nvidia.c
+++ b/sys/dev/ata/chipsets/ata-nvidia.c
@@ -65,6 +65,8 @@ static int ata_nvidia_setmode(device_t dev, int target, int mode);
#define NVAHCI 0x04
#define NVNOFORCE 0x08
+static int force_ahci = 1;
+TUNABLE_INT("hw.ahci.force", &force_ahci);
/*
* nVidia chipset support functions
@@ -181,7 +183,7 @@ ata_nvidia_probe(device_t dev)
ata_set_desc(dev);
if ((ctlr->chip->cfg1 & NVAHCI) &&
- ((ctlr->chip->cfg1 & NVNOFORCE) == 0 ||
+ ((force_ahci == 1 && (ctlr->chip->cfg1 & NVNOFORCE) == 0) ||
pci_get_subclass(dev) != PCIS_STORAGE_IDE))
ctlr->chipinit = ata_ahci_chipinit;
else
OpenPOWER on IntegriCloud