diff options
author | David Gwynne <dlg@cvs.openbsd.org> | 2008-02-11 03:52:51 +0000 |
---|---|---|
committer | David Gwynne <dlg@cvs.openbsd.org> | 2008-02-11 03:52:51 +0000 |
commit | 530e8dc10a2546847b009263576d71577470a3fe (patch) | |
tree | 5aa211296c705be07aac24ed5b4da005f8e937d0 /sys/dev/pci/mfi_pci.c | |
parent | f8582e34cc54670f4253c51444c979cdf2d3e539 (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.c | 73 |
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)); |