diff options
-rw-r--r-- | sys/conf/files | 6 | ||||
-rw-r--r-- | sys/dev/ic/sili.c | 61 | ||||
-rw-r--r-- | sys/dev/ic/silireg.h | 18 | ||||
-rw-r--r-- | sys/dev/ic/silivar.h | 32 | ||||
-rw-r--r-- | sys/dev/pci/files.pci | 6 | ||||
-rw-r--r-- | sys/dev/pci/sili_pci.c | 150 |
6 files changed, 271 insertions, 2 deletions
diff --git a/sys/conf/files b/sys/conf/files index 9921a3a89d8..6728cf9c7d4 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -1,4 +1,4 @@ -# $OpenBSD: files,v 1.395 2007/03/19 14:33:28 dlg Exp $ +# $OpenBSD: files,v 1.396 2007/03/22 02:48:42 dlg Exp $ # $NetBSD: files,v 1.87 1996/05/19 17:17:50 jonathan Exp $ # @(#)files.newconf 7.5 (Berkeley) 5/10/93 @@ -185,6 +185,10 @@ file dev/ic/isp_openbsd.c isp device mpi: scsi file dev/ic/mpi.c mpi +# Silicon Image 3124/3132/3531 SATALink +device sili: scsi, atascsi +file dev/ic/sili.c sili + # UltraStor SCSI controllers device uha: scsi file dev/ic/uha.c uha diff --git a/sys/dev/ic/sili.c b/sys/dev/ic/sili.c new file mode 100644 index 00000000000..966dbbcbcac --- /dev/null +++ b/sys/dev/ic/sili.c @@ -0,0 +1,61 @@ +/* $OpenBSD: sili.c,v 1.1 2007/03/22 02:48:42 dlg Exp $ */ + +/* + * Copyright (c) 2007 David Gwynne <dlg@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/buf.h> +#include <sys/device.h> +#include <sys/proc.h> +#include <sys/malloc.h> +#include <sys/kernel.h> + +#include <machine/bus.h> + +#include <dev/ata/atascsi.h> + +#include <dev/ic/silireg.h> +#include <dev/ic/silivar.h> + +struct cfdriver sili_cd = { + NULL, "sili", DV_DULL +}; + +int +sili_attach(struct sili_softc *sc) +{ + printf("\n"); + + return (0); +} + +int +sili_detach(struct sili_softc *sc, int flags) +{ + return (0); +} + +int +sili_intr(void *arg) +{ +#if 0 + struct sili_softc *sc = arg; +#endif + + return (0); +} + diff --git a/sys/dev/ic/silireg.h b/sys/dev/ic/silireg.h new file mode 100644 index 00000000000..63eebe0583a --- /dev/null +++ b/sys/dev/ic/silireg.h @@ -0,0 +1,18 @@ +/* $OpenBSD: silireg.h,v 1.1 2007/03/22 02:48:42 dlg Exp $ */ + +/* + * Copyright (c) 2007 David Gwynne <dlg@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + diff --git a/sys/dev/ic/silivar.h b/sys/dev/ic/silivar.h new file mode 100644 index 00000000000..71cff28c105 --- /dev/null +++ b/sys/dev/ic/silivar.h @@ -0,0 +1,32 @@ +/* $OpenBSD: silivar.h,v 1.1 2007/03/22 02:48:42 dlg Exp $ */ + +/* + * Copyright (c) 2007 David Gwynne <dlg@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +struct sili_softc { + struct device sc_dev; + + bus_space_tag_t sc_iot; + bus_space_handle_t sc_ioh; + bus_size_t sc_ios; + bus_dma_tag_t sc_dmat; +}; +#define DEVNAME(_sc) ((_sc)->sc_dev.dv_xname) + +int sili_attach(struct sili_softc *); +int sili_detach(struct sili_softc *, int); + +int sili_intr(void *); diff --git a/sys/dev/pci/files.pci b/sys/dev/pci/files.pci index 72a9c82f751..976bd921253 100644 --- a/sys/dev/pci/files.pci +++ b/sys/dev/pci/files.pci @@ -1,4 +1,4 @@ -# $OpenBSD: files.pci,v 1.226 2007/02/24 20:18:08 kettenis Exp $ +# $OpenBSD: files.pci,v 1.227 2007/03/22 02:48:42 dlg Exp $ # $NetBSD: files.pci,v 1.20 1996/09/24 17:47:15 christos Exp $ # # Config file and device description for machine-independent PCI code. @@ -207,6 +207,10 @@ file dev/pci/isp_pci.c isp_pci attach mpi at pci with mpi_pci file dev/pci/mpi_pci.c mpi_pci +# Silicon Image 3124/3132/3531 SATALink +attach sili at pci with sili_pci +file dev/pci/sili_pci.c sili_pci + # Ethernet driver for DC21040-based boards device de: ether, ifnet, ifmedia attach de at pci diff --git a/sys/dev/pci/sili_pci.c b/sys/dev/pci/sili_pci.c new file mode 100644 index 00000000000..e973a05bc88 --- /dev/null +++ b/sys/dev/pci/sili_pci.c @@ -0,0 +1,150 @@ +/* $OpenBSD: sili_pci.c,v 1.1 2007/03/22 02:48:42 dlg Exp $ */ + +/* + * Copyright (c) 2007 David Gwynne <dlg@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/malloc.h> +#include <sys/device.h> + +#include <machine/bus.h> + +#include <dev/pci/pcireg.h> +#include <dev/pci/pcivar.h> +#include <dev/pci/pcidevs.h> + +#include <dev/ic/silireg.h> +#include <dev/ic/silivar.h> + +int sili_pci_match(struct device *, void *, void *); +void sili_pci_attach(struct device *, struct device *, void *); +int sili_pci_detach(struct device *, int); + +struct sili_pci_softc { + struct sili_softc psc_sili; + + pci_chipset_tag_t psc_pc; + pcitag_t psc_tag; + + void *psc_ih; +}; + +struct cfattach sili_pci_ca = { + sizeof(struct sili_pci_softc), sili_pci_match, sili_pci_attach, + sili_pci_detach +}; + +static const struct pci_matchid sili_devices[] = { + { PCI_VENDOR_CMDTECH, PCI_PRODUCT_CMDTECH_3124 } +}; + +int +sili_pci_match(struct device *parent, void *match, void *aux) +{ + return (pci_matchbyid((struct pci_attach_args *)aux, sili_devices, + sizeof(sili_devices) / sizeof(sili_devices[0]))); +} + +void +sili_pci_attach(struct device *parent, struct device *self, void *aux) +{ + struct sili_pci_softc *psc = (void *)self; + struct sili_softc *sc = &psc->psc_sili; + struct pci_attach_args *pa = aux; +// pcireg_t memtype; + pci_intr_handle_t ih; + const char *intrstr; + + psc->psc_pc = pa->pa_pc; + psc->psc_tag = pa->pa_tag; + psc->psc_ih = NULL; + sc->sc_dmat = pa->pa_dmat; + sc->sc_ios = 0; + +#if 0 + /* find the appropriate memory base */ + for (r = PCI_MAPREG_START; r < PCI_MAPREG_END; r += sizeof(memtype)) { + memtype = pci_mapreg_type(psc->psc_pc, psc->psc_tag, r); + if ((memtype & PCI_MAPREG_TYPE_MASK) == PCI_MAPREG_TYPE_MEM) + break; + } + if (r >= PCI_MAPREG_END) { + printf(": unable to locate system interface registers\n"); + return; + } + + if (pci_mapreg_map(pa, r, memtype, 0, &sc->sc_iot, &sc->sc_ioh, + NULL, &sc->sc_ios, 0) != 0) { + printf(": unable to map system interface registers\n"); + return; + } +#endif + + /* hook up the interrupt */ + if (pci_intr_map(pa, &ih)) { + printf(": unable to map interrupt\n"); + goto unmap; + } + intrstr = pci_intr_string(psc->psc_pc, ih); + psc->psc_ih = pci_intr_establish(psc->psc_pc, ih, IPL_BIO, + sili_intr, sc, sc->sc_dev.dv_xname); + if (psc->psc_ih == NULL) { + printf(": unable to map interrupt%s%s\n", + intrstr == NULL ? "" : " at ", + intrstr == NULL ? "" : intrstr); + goto unmap; + } + printf(": %s", intrstr); + + if (sili_attach(sc) != 0) { + /* error printed by sili_attach */ + goto deintr; + } + + return; + +deintr: + pci_intr_disestablish(psc->psc_pc, psc->psc_ih); + psc->psc_ih = NULL; +unmap: +// bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios); + sc->sc_ios = 0; +} + +int +sili_pci_detach(struct device *self, int flags) +{ + struct sili_pci_softc *psc = (struct sili_pci_softc *)self; + struct sili_softc *sc = &psc->psc_sili; + int rv; + + rv = sili_detach(sc, flags); + if (rv != 0) + return (rv); + + if (psc->psc_ih != NULL) { + pci_intr_disestablish(psc->psc_pc, psc->psc_ih); + psc->psc_ih = NULL; + } + if (sc->sc_ios != 0) { + bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios); + sc->sc_ios = 0; + } + + return (0); +} |