summaryrefslogtreecommitdiff
path: root/sys/dev/pci/mfi_pci.c
diff options
context:
space:
mode:
authorDavid Gwynne <dlg@cvs.openbsd.org>2008-02-11 03:52:51 +0000
committerDavid Gwynne <dlg@cvs.openbsd.org>2008-02-11 03:52:51 +0000
commit530e8dc10a2546847b009263576d71577470a3fe (patch)
tree5aa211296c705be07aac24ed5b4da005f8e937d0 /sys/dev/pci/mfi_pci.c
parentf8582e34cc54670f4253c51444c979cdf2d3e539 (diff)
reinstate pci subvendor/subdevice detection so we can figure out which
variant of the board we're attached to. for marco@
Diffstat (limited to 'sys/dev/pci/mfi_pci.c')
-rw-r--r--sys/dev/pci/mfi_pci.c73
1 files changed, 60 insertions, 13 deletions
diff --git a/sys/dev/pci/mfi_pci.c b/sys/dev/pci/mfi_pci.c
index cc5125efb6a..b187b3cdec6 100644
--- a/sys/dev/pci/mfi_pci.c
+++ b/sys/dev/pci/mfi_pci.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mfi_pci.c,v 1.15 2008/02/11 01:07:02 dlg Exp $ */
+/* $OpenBSD: mfi_pci.c,v 1.16 2008/02/11 03:52:50 dlg Exp $ */
/*
* Copyright (c) 2006 Marco Peereboom <marco@peereboom.us>
*
@@ -44,22 +44,49 @@ struct cfattach mfi_pci_ca = {
sizeof(struct mfi_softc), mfi_pci_match, mfi_pci_attach
};
+struct mfi_pci_subtype {
+ pcireg_t st_id;
+ const char *st_string;
+};
+
+static const struct mfi_pci_subtype mfi_1078_subtypes[] = {
+ { 0x10061000, "SAS 8888ELP" },
+ { 0x100a1000, "SAS 8708ELP" },
+ { 0x100f1000, "SAS 8708E" },
+ { 0x10121000, "SAS 8704ELP" },
+ { 0x10131000, "SAS 8708EM2" },
+ { 0x10161000, "SAS 8880EM2" },
+ { 0x1f0a1028, "Dell PERC 6/e" },
+ { 0x1f0b1028, "Dell PERC 6/i" },
+ { 0x1f0d1028, "Dell CERC 6/i" },
+ { 0x1f0c1028, "Dell PERC 6/i integrated" },
+ { 0x1f111028, "Dell CERC 6/i integrated" },
+ { 0x0, "" }
+};
+
+static const struct mfi_pci_subtype mfi_perc5_subtypes[] = {
+ { 0x1f011028, "Dell PERC 5/e" },
+ { 0x1f021028, "Dell PERC 5/i" },
+ { 0x0, "" }
+};
+
static const
struct mfi_pci_device {
- pcireg_t mpd_vendor;
- pcireg_t mpd_product;
- enum mfi_iop mpd_iop;
+ pcireg_t mpd_vendor;
+ pcireg_t mpd_product;
+ enum mfi_iop mpd_iop;
+ const struct mfi_pci_subtype *mpd_subtype;
} mfi_pci_devices[] = {
{ PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_MEGARAID_SAS,
- MFI_IOP_XSCALE },
+ MFI_IOP_XSCALE, NULL },
{ PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_MEGARAID_VERDE_ZCR,
- MFI_IOP_XSCALE },
+ MFI_IOP_XSCALE, NULL },
{ PCI_VENDOR_SYMBIOS, PCI_PRODUCT_SYMBIOS_SAS1078,
- MFI_IOP_PPC },
+ MFI_IOP_PPC, mfi_1078_subtypes },
{ PCI_VENDOR_DELL, PCI_PRODUCT_DELL_PERC5,
- MFI_IOP_XSCALE },
+ MFI_IOP_XSCALE, mfi_perc5_subtypes },
{ PCI_VENDOR_SYMBIOS, PCI_PRODUCT_DELL_PERC6,
- MFI_IOP_PPC }
+ MFI_IOP_PPC, mfi_1078_subtypes }
};
#define sizeofa(_a) (sizeof(_a) / sizeof((_a)[0]))
@@ -94,15 +121,18 @@ mfi_pci_attach(struct device *parent, struct device *self, void *aux)
struct mfi_softc *sc = (struct mfi_softc *)self;
struct pci_attach_args *pa = aux;
const struct mfi_pci_device *mpd;
+ const struct mfi_pci_subtype *st;
const char *intrstr;
pci_intr_handle_t ih;
bus_size_t size;
- pcireg_t csr;
+ pcireg_t reg;
+ const char *subtype = NULL;
+ char subid[32];
mpd = mfi_pci_find_device(pa);
- csr = pci_mapreg_type(pa->pa_pc, pa->pa_tag, MFI_BAR);
- if (pci_mapreg_map(pa, MFI_BAR, csr, 0,
+ reg = pci_mapreg_type(pa->pa_pc, pa->pa_tag, MFI_BAR);
+ if (pci_mapreg_map(pa, MFI_BAR, reg, 0,
&sc->sc_iot, &sc->sc_ioh, NULL, &size, MFI_PCI_MEMSIZE)) {
printf(": can't map controller pci space\n");
return;
@@ -127,7 +157,24 @@ mfi_pci_attach(struct device *parent, struct device *self, void *aux)
return;
}
- printf(": %s\n", intrstr);
+ reg = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
+
+ if (mpd->mpd_subtype != NULL) {
+ st = mpd->mpd_subtype;
+ while (st->st_id != 0x0) {
+ if (st->st_id == reg) {
+ subtype = st->st_string;
+ break;
+ }
+ st++;
+ }
+ }
+ if (subtype == NULL) {
+ snprintf(subid, sizeof(subid), "0x%08x", reg);
+ subtype = subid;
+ }
+
+ printf(": %s, %s\n", intrstr, subtype);
if (mfi_attach(sc, mpd->mpd_iop)) {
printf("%s: can't attach\n", DEVNAME(sc));