diff options
author | David Gwynne <dlg@cvs.openbsd.org> | 2007-07-02 14:01:15 +0000 |
---|---|---|
committer | David Gwynne <dlg@cvs.openbsd.org> | 2007-07-02 14:01:15 +0000 |
commit | 63ed4de470c61a8b706398104d73eae11ed12624 (patch) | |
tree | 1648015e151371da0c9140e11555e440ae604488 | |
parent | b791c508bea0b43ae972e64ba85de4e7fb2a88c9 (diff) |
kettenis suggested that i can use pci_intr_map twice on the same device
safely, so i tried it and it worked great. i can reuse the pci_attach_args
to attach ahci and now pciide to jmb without really modifying either of
them. lots of code shrinks.
ok jsg@
-rw-r--r-- | sys/dev/pci/ahci.c | 6 | ||||
-rw-r--r-- | sys/dev/pci/files.pci | 20 | ||||
-rw-r--r-- | sys/dev/pci/jmb.c | 91 | ||||
-rw-r--r-- | sys/dev/pci/pciide.c | 24 |
4 files changed, 62 insertions, 79 deletions
diff --git a/sys/dev/pci/ahci.c b/sys/dev/pci/ahci.c index bfce1cb469b..390483770db 100644 --- a/sys/dev/pci/ahci.c +++ b/sys/dev/pci/ahci.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ahci.c,v 1.125 2007/07/02 01:29:54 dlg Exp $ */ +/* $OpenBSD: ahci.c,v 1.126 2007/07/02 14:01:13 dlg Exp $ */ /* * Copyright (c) 2006 David Gwynne <dlg@openbsd.org> @@ -402,6 +402,10 @@ struct cfattach ahci_pci_ca = { sizeof(struct ahci_softc), ahci_pci_match, ahci_pci_attach }; +struct cfattach ahci_jmb_ca = { + sizeof(struct ahci_softc), ahci_pci_match, ahci_pci_attach +}; + struct cfdriver ahci_cd = { NULL, "ahci", DV_DULL }; diff --git a/sys/dev/pci/files.pci b/sys/dev/pci/files.pci index ca4c67b7a04..21ccc611ddd 100644 --- a/sys/dev/pci/files.pci +++ b/sys/dev/pci/files.pci @@ -1,4 +1,4 @@ -# $OpenBSD: files.pci,v 1.238 2007/07/02 01:14:36 dlg Exp $ +# $OpenBSD: files.pci,v 1.239 2007/07/02 14:01:13 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. @@ -79,17 +79,16 @@ device arc: scsi attach arc at pci file dev/pci/arc.c arc -# Advanced Host Controller Interface for Serial ATA -device ahci: scsi, atascsi -attach ahci at pci with ahci_pci -file dev/pci/ahci.c ahci | ahci_pci - # JMicron JMB36x controllers device jmb {} attach jmb at pci -attach ahci at jmb with ahci_jmb -file dev/pci/jmb.c jmb | ahci_jmb +file dev/pci/jmb.c jmb +# Advanced Host Controller Interface for Serial ATA +device ahci: scsi, atascsi +attach ahci at pci with ahci_pci +attach ahci at jmb with ahci_jmb +file dev/pci/ahci.c ahci | ahci_pci | ahci_jmb # AMI MegaRAID Express x00/Elite 1500/Express 1x00 RAID Controllers attach ami at pci with ami_pci @@ -264,8 +263,9 @@ file dev/pci/neo.c neo # PCI IDE controllers device pciide {[channel = -1]}: cy82c693, wdc_base, ata, atapi -attach pciide at pci -file dev/pci/pciide.c pciide +attach pciide at pci with pciide_pci +attach pciide at jmb with pciide_jmb +file dev/pci/pciide.c pciide | pciide_pci | pciide_jmb # PCI-PCI bridge chips device ppb: pcibus diff --git a/sys/dev/pci/jmb.c b/sys/dev/pci/jmb.c index 12b78cc18b1..abad16379b7 100644 --- a/sys/dev/pci/jmb.c +++ b/sys/dev/pci/jmb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: jmb.c,v 1.2 2007/07/02 07:17:34 dlg Exp $ */ +/* $OpenBSD: jmb.c,v 1.3 2007/07/02 14:01:14 dlg Exp $ */ /* * Copyright (c) 2007 David Gwynne <dlg@openbsd.org> @@ -31,10 +31,6 @@ #include <dev/pci/pcivar.h> #include <dev/pci/pcidevs.h> -#include <dev/ata/atascsi.h> - -#include <dev/pci/ahcivar.h> - /* JMicron registers */ #define JM_PCI_CTL0 0x40 /* control register 0 */ #define JM_PCI_CTL0_ROM_EN (1<<31) /* External Option ROM */ @@ -85,22 +81,13 @@ struct cfdriver jmb_cd = { NULL, "jmb", DV_DULL }; - -struct jmb_attach_args { - enum { - JMB_DEV_AHCI, - JMB_DEV_IDE - } ja_dev; - struct pci_attach_args *ja_pa; - pci_intr_handle_t ja_ih; -}; - static const struct pci_matchid jmb_devices[] = { { PCI_VENDOR_JMICRON, PCI_PRODUCT_JMICRON_JMB360 }, { PCI_VENDOR_JMICRON, PCI_PRODUCT_JMICRON_JMB361 }, { PCI_VENDOR_JMICRON, PCI_PRODUCT_JMICRON_JMB363 }, { PCI_VENDOR_JMICRON, PCI_PRODUCT_JMICRON_JMB365 }, - { PCI_VENDOR_JMICRON, PCI_PRODUCT_JMICRON_JMB366 } + { PCI_VENDOR_JMICRON, PCI_PRODUCT_JMICRON_JMB366 }, + { PCI_VENDOR_JMICRON, PCI_PRODUCT_JMICRON_JMB368 } }; int @@ -109,14 +96,13 @@ jmb_match(struct device *parent, void *match, void *aux) struct pci_attach_args *pa = aux; return (pci_matchbyid(pa, jmb_devices, - sizeof(jmb_devices) / sizeof(jmb_devices[0]))); + sizeof(jmb_devices) / sizeof(jmb_devices[0])) * 3); } void jmb_attach(struct device *parent, struct device *self, void *aux) { - struct pci_attach_args *pa = aux; - struct jmb_attach_args ja; + struct pci_attach_args *pa = aux, jpa; u_int32_t ctl0, ctl5; ctl0 = pci_conf_read(pa->pa_pc, pa->pa_tag, JM_PCI_CTL0); @@ -135,7 +121,7 @@ jmb_attach(struct device *parent, struct device *self, void *aux) /* set to single function AHCI mode */ ctl0 |= JM_PCI_CTL0_AHCI_EN | JM_PCI_CTL0_SATA0_AHCI | JM_PCI_CTL0_SATA1_AHCI | - JM_PCI_CTL0_F0_SUBCLASS(JM_PCI_CTL0_SUBCLASS_AHCI); + JM_PCI_CTL0_F0_SUBCLASS(JM_PCI_CTL0_SUBCLASS_IDE); break; case PCI_PRODUCT_JMICRON_JMB366: @@ -148,69 +134,42 @@ jmb_attach(struct device *parent, struct device *self, void *aux) /* enable AHCI */ ctl0 |= JM_PCI_CTL0_AHCI_EN | JM_PCI_CTL0_SATA0_AHCI | JM_PCI_CTL0_SATA1_AHCI | - JM_PCI_CTL0_PCIIDE_CS | JM_PCI_CTL0_IDEDMA_CFG; + JM_PCI_CTL0_PCIIDE_CS | JM_PCI_CTL0_IDEDMA_CFG | + JM_PCI_CTL0_F0_SUBCLASS(JM_PCI_CTL0_SUBCLASS_AHCI); break; } pci_conf_write(pa->pa_pc, pa->pa_tag, JM_PCI_CTL0, ctl0); pci_conf_write(pa->pa_pc, pa->pa_tag, JM_PCI_CTL5, ctl5); - bzero(&ja, sizeof(ja)); - ja.ja_pa = pa; + printf("\n"); - if (pci_intr_map(pa, &ja.ja_ih) != 0) { - printf(": unable to map interrupt\n"); - return; - } - printf(": %s\n", pci_intr_string(pa->pa_pc, ja.ja_ih)); + jpa = *pa; - ja.ja_dev = JMB_DEV_AHCI; - config_found(self, &ja, jmb_print); + /* tweak the class to look like ahci, then try to attach it */ + jpa.pa_class = (PCI_CLASS_MASS_STORAGE << PCI_CLASS_SHIFT) | + (PCI_SUBCLASS_MASS_STORAGE_SATA << PCI_SUBCLASS_SHIFT) | + (0x01 << PCI_INTERFACE_SHIFT); /* AHCI_PCI_INTERFACE */ + config_found(self, &jpa, jmb_print); - ja.ja_dev = JMB_DEV_IDE; - config_found(self, &ja, jmb_print); + /* set things up for pciide */ + jpa.pa_class = (PCI_CLASS_MASS_STORAGE << PCI_CLASS_SHIFT) | + (PCI_SUBCLASS_MASS_STORAGE_IDE << PCI_SUBCLASS_SHIFT) | + (0x85 << PCI_INTERFACE_SHIFT); + config_found(self, &jpa, jmb_print); } int jmb_print(void *aux, const char *pnp) { - struct jmb_attach_args *ja = aux; + struct pci_attach_args *pa = aux; + char devinfo[256]; if (pnp != NULL) { - printf("\"%s\" at %s", - (ja->ja_dev == JMB_DEV_AHCI) ? "sata" : "pata", pnp); + pci_devinfo(pa->pa_id, pa->pa_class, 1, devinfo, + sizeof(devinfo)); + printf("%s at %s", devinfo, pnp); } return (UNCONF); } - - -int ahci_jmb_match(struct device *, void *, void *); -void ahci_jmb_attach(struct device *, struct device *, - void *); - -struct cfattach ahci_jmb_ca = { - sizeof(struct ahci_softc), ahci_jmb_match, ahci_jmb_attach -}; - -int -ahci_jmb_match(struct device *parent, void *match, void *aux) -{ - struct jmb_attach_args *ja = aux; - - if (ja->ja_dev == JMB_DEV_AHCI) - return (1); - - return (0); -} - -void -ahci_jmb_attach(struct device *parent, struct device *self, void *aux) -{ - struct ahci_softc *sc = (struct ahci_softc *)self; - struct jmb_attach_args *ja = aux; - - printf(":"); - - ahci_attach(sc, ja->ja_pa, ja->ja_ih); -} diff --git a/sys/dev/pci/pciide.c b/sys/dev/pci/pciide.c index 1461c9a57bb..37bf4ce7834 100644 --- a/sys/dev/pci/pciide.c +++ b/sys/dev/pci/pciide.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pciide.c,v 1.271 2007/06/26 17:48:18 kettenis Exp $ */ +/* $OpenBSD: pciide.c,v 1.272 2007/07/02 14:01:14 dlg Exp $ */ /* $NetBSD: pciide.c,v 1.127 2001/08/03 01:31:08 tsutsui Exp $ */ /* @@ -1062,6 +1062,22 @@ const struct pciide_product_desc pciide_ati_products[] = { }; const struct pciide_product_desc pciide_jmicron_products[] = { + { PCI_PRODUCT_JMICRON_JMB361, + 0, + jmicron_chip_map + }, + { PCI_PRODUCT_JMICRON_JMB363, + 0, + jmicron_chip_map + }, + { PCI_PRODUCT_JMICRON_JMB365, + 0, + jmicron_chip_map + }, + { PCI_PRODUCT_JMICRON_JMB366, + 0, + jmicron_chip_map + }, { PCI_PRODUCT_JMICRON_JMB368, 0, jmicron_chip_map @@ -1119,7 +1135,11 @@ const struct pciide_vendor_desc pciide_vendors[] = { int pciide_match(struct device *, void *, void *); void pciide_attach(struct device *, struct device *, void *); -struct cfattach pciide_ca = { +struct cfattach pciide_pci_ca = { + sizeof(struct pciide_softc), pciide_match, pciide_attach +}; + +struct cfattach pciide_jmb_ca = { sizeof(struct pciide_softc), pciide_match, pciide_attach }; |