From owner-p4-projects@FreeBSD.ORG Thu Apr 22 06:24:40 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 67948106567A; Thu, 22 Apr 2010 06:24:40 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1FA941065676 for ; Thu, 22 Apr 2010 06:24:40 +0000 (UTC) (envelope-from mav@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 0B0EE8FC2D for ; Thu, 22 Apr 2010 06:24:40 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id o3M6Oeow056091 for ; Thu, 22 Apr 2010 06:24:40 GMT (envelope-from mav@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id o3M6OeSD056089 for perforce@freebsd.org; Thu, 22 Apr 2010 06:24:40 GMT (envelope-from mav@freebsd.org) Date: Thu, 22 Apr 2010 06:24:40 GMT Message-Id: <201004220624.o3M6OeSD056089@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to mav@freebsd.org using -f From: Alexander Motin To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 177202 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 22 Apr 2010 06:24:40 -0000 http://p4web.freebsd.org/@@177202?ac=10 Change 177202 by mav@mav_mavtest on 2010/04/22 06:24:08 Split PCI part. Affected files ... .. //depot/projects/scottl-camlock/src/sys/dev/mvs/mvs.c#8 edit .. //depot/projects/scottl-camlock/src/sys/dev/mvs/mvs.h#6 edit .. //depot/projects/scottl-camlock/src/sys/dev/mvs/mvs_pci.c#1 add Differences ... ==== //depot/projects/scottl-camlock/src/sys/dev/mvs/mvs.c#8 (text+ko) ==== @@ -37,15 +37,11 @@ #include #include #include -#include -#include #include #include #include #include #include -#include -#include #include "mvs.h" #include @@ -55,12 +51,6 @@ #include /* local prototypes */ -static int mvs_setup_interrupt(device_t dev); -static void mvs_intr(void *data); -static int mvs_suspend(device_t dev); -static int mvs_resume(device_t dev); -static int mvs_ctlr_setup(device_t dev); - static int mvs_ch_suspend(device_t dev); static int mvs_ch_resume(device_t dev); static void mvs_dmainit(device_t dev); @@ -99,410 +89,7 @@ MALLOC_DEFINE(M_MVS, "MVS driver", "MVS driver data buffers"); -static struct { - uint32_t id; - uint8_t rev; - const char *name; - int ports; - int quirks; -#define MVS_Q_GENI 1 -#define MVS_Q_GENII 2 -#define MVS_Q_GENIIE 4 -} mvs_ids[] = { - {0x504011ab, 0x00, "Marvell 88SX5040", 4, MVS_Q_GENI}, - {0x504111ab, 0x00, "Marvell 88SX5041", 4, MVS_Q_GENI}, - {0x508011ab, 0x00, "Marvell 88SX5080", 8, MVS_Q_GENI}, - {0x508111ab, 0x00, "Marvell 88SX5081", 8, MVS_Q_GENI}, - {0x604011ab, 0x00, "Marvell 88SX6040", 4, MVS_Q_GENII}, - {0x604111ab, 0x00, "Marvell 88SX6041", 4, MVS_Q_GENII}, - {0x604211ab, 0x00, "Marvell 88SX6042", 4, MVS_Q_GENIIE}, - {0x608011ab, 0x00, "Marvell 88SX6080", 8, MVS_Q_GENII}, - {0x608111ab, 0x00, "Marvell 88SX6081", 8, MVS_Q_GENII}, - {0x704211ab, 0x00, "Marvell 88SX7042", 4, MVS_Q_GENIIE}, - {0x02419005, 0x00, "Adaptec 1420SA", 4, MVS_Q_GENII}, - {0x02439005, 0x00, "Adaptec 1430SA", 4, MVS_Q_GENIIE}, - {0x00000000, 0x00, NULL, 0, 0} -}; - -static int -mvs_probe(device_t dev) -{ - char buf[64]; - int i; - uint32_t devid = pci_get_devid(dev); - uint8_t revid = pci_get_revid(dev); - - for (i = 0; mvs_ids[i].id != 0; i++) { - if (mvs_ids[i].id == devid && - mvs_ids[i].rev <= revid) { - snprintf(buf, sizeof(buf), "%s SATA controller", - mvs_ids[i].name); - device_set_desc_copy(dev, buf); - return (BUS_PROBE_VENDOR); - } - } - return (ENXIO); -} - -static int -mvs_attach(device_t dev) -{ - struct mvs_controller *ctlr = device_get_softc(dev); - device_t child; - int error, unit, i; - uint32_t devid = pci_get_devid(dev); - uint8_t revid = pci_get_revid(dev); - - ctlr->dev = dev; - i = 0; - while (mvs_ids[i].id != 0 && - (mvs_ids[i].id != devid || - mvs_ids[i].rev > revid)) - i++; - ctlr->channels = mvs_ids[i].ports; - ctlr->quirks = mvs_ids[i].quirks; - resource_int_value(device_get_name(dev), - device_get_unit(dev), "ccc", &ctlr->ccc); - ctlr->cccc = 8; - resource_int_value(device_get_name(dev), - device_get_unit(dev), "cccc", &ctlr->cccc); - if (ctlr->ccc == 0 || ctlr->cccc == 0) { - ctlr->ccc = 0; - ctlr->cccc = 0; - } - if (ctlr->ccc > 100) - ctlr->ccc = 100; - /* We should have a memory BAR(0). */ - ctlr->r_rid = PCIR_BAR(0); - if (!(ctlr->r_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, - &ctlr->r_rid, RF_ACTIVE))) - return ENXIO; - /* Setup our own memory management for channels. */ - ctlr->sc_iomem.rm_type = RMAN_ARRAY; - ctlr->sc_iomem.rm_descr = "I/O memory addresses"; - if ((error = rman_init(&ctlr->sc_iomem)) != 0) { - bus_release_resource(dev, SYS_RES_MEMORY, ctlr->r_rid, ctlr->r_mem); - return (error); - } - if ((error = rman_manage_region(&ctlr->sc_iomem, - rman_get_start(ctlr->r_mem), rman_get_end(ctlr->r_mem))) != 0) { - bus_release_resource(dev, SYS_RES_MEMORY, ctlr->r_rid, ctlr->r_mem); - rman_fini(&ctlr->sc_iomem); - return (error); - } - mvs_ctlr_setup(dev); - /* Setup interrupts. */ - if (mvs_setup_interrupt(dev)) { - bus_release_resource(dev, SYS_RES_MEMORY, ctlr->r_rid, ctlr->r_mem); - rman_fini(&ctlr->sc_iomem); - return ENXIO; - } - device_printf(dev, - "Gen-%s, %d %sGbps ports, Port Multiplier %s%s\n", - ((ctlr->quirks & MVS_Q_GENI) ? "I" : - ((ctlr->quirks & MVS_Q_GENII) ? "II" : "IIe")), - ctlr->channels, - ((ctlr->quirks & MVS_Q_GENI) ? "1.5" : "3"), - ((ctlr->quirks & MVS_Q_GENI) ? - "not supported" : "supported"), - ((ctlr->quirks & MVS_Q_GENIIE) ? - " with FBS" : "")); - /* Attach all channels on this controller */ - for (unit = 0; unit < ctlr->channels; unit++) { - child = device_add_child(dev, "mvsch", -1); - if (child == NULL) - device_printf(dev, "failed to add channel device\n"); - else - device_set_ivars(child, (void *)(intptr_t)unit); - } - bus_generic_attach(dev); - return 0; -} - -static int -mvs_detach(device_t dev) -{ - struct mvs_controller *ctlr = device_get_softc(dev); - device_t *children; - int nchildren, i; - - /* Detach & delete all children */ - if (!device_get_children(dev, &children, &nchildren)) { - for (i = 0; i < nchildren; i++) - device_delete_child(dev, children[i]); - free(children, M_TEMP); - } - /* Free interrupt. */ - if (ctlr->irq.r_irq) { - bus_teardown_intr(dev, ctlr->irq.r_irq, - ctlr->irq.handle); - bus_release_resource(dev, SYS_RES_IRQ, - ctlr->irq.r_irq_rid, ctlr->irq.r_irq); - } - pci_release_msi(dev); - /* Free memory. */ - rman_fini(&ctlr->sc_iomem); - if (ctlr->r_mem) - bus_release_resource(dev, SYS_RES_MEMORY, ctlr->r_rid, ctlr->r_mem); - return (0); -} - -static int -mvs_ctlr_setup(device_t dev) -{ - struct mvs_controller *ctlr = device_get_softc(dev); - int i; - - /* Mask chip interrupts */ - ATA_OUTL(ctlr->r_mem, CHIP_MIM, 0x00000000); - /* Mask PCI interrupts */ - ATA_OUTL(ctlr->r_mem, CHIP_PCIIM, 0x00000000); - /* Clear PCI interrupts */ - ATA_OUTL(ctlr->r_mem, CHIP_PCIIC, 0x00000000); - /* Clear HC interrupts */ - for (i = 0; i < ctlr->channels / 4; i++) - ATA_OUTL(ctlr->r_mem, HC_BASE(i) + HC_IC, 0x00000000); - /* Configure CCC */ -#if 0 - if (ctlr->ccc) { - ATA_OUTL(ctlr->r_mem, HC_ICT, ctlr->cccc & HC_ICT_SAICOALT_MASK); - ATA_OUTL(ctlr->r_mem, HC_ITT, (ctlr->ccc * 150000) & HC_ITT_SAITMTH_MASK); - if (bootverbose) { - device_printf(dev, - "CCC with %dms/%dcmd enabled\n", - ctlr->ccc, ctlr->cccc); - } - } -#endif - /* Enable chip interrupts */ - ATA_OUTL(ctlr->r_mem, CHIP_MIM, IC_HC0 | IC_HC1 /*| IC_ALL_PORTS_COAL_DONE*/); - /* Enable PCI interrupts */ - ATA_OUTL(ctlr->r_mem, CHIP_PCIIM, 0x007fffff); - return (0); -} - -static int -mvs_suspend(device_t dev) -{ - struct mvs_controller *ctlr = device_get_softc(dev); - - bus_generic_suspend(dev); - /* Mask chip interrupts */ - ATA_OUTL(ctlr->r_mem, CHIP_MIM, 0x00000000); - /* Mask PCI interrupts */ - ATA_OUTL(ctlr->r_mem, CHIP_PCIIM, 0x00000000); - return 0; -} - -static int -mvs_resume(device_t dev) -{ - - mvs_ctlr_setup(dev); - return (bus_generic_resume(dev)); -} - -static int -mvs_setup_interrupt(device_t dev) -{ - struct mvs_controller *ctlr = device_get_softc(dev); - int msi = 0; - - /* Process hints. */ - resource_int_value(device_get_name(dev), - device_get_unit(dev), "msi", &msi); - if (msi < 0) - msi = 0; - else if (msi > 0) - msi = min(1, pci_msi_count(dev)); - /* Allocate MSI if needed/present. */ - if (msi && pci_alloc_msi(dev, &msi) != 0) - msi = 0; - /* Allocate all IRQs. */ - ctlr->irq.r_irq_rid = msi ? 1 : 0; - if (!(ctlr->irq.r_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, - &ctlr->irq.r_irq_rid, RF_SHAREABLE | RF_ACTIVE))) { - device_printf(dev, "unable to map interrupt\n"); - return ENXIO; - } - if ((bus_setup_intr(dev, ctlr->irq.r_irq, ATA_INTR_FLAGS, NULL, - mvs_intr, ctlr, &ctlr->irq.handle))) { - /* SOS XXX release r_irq */ - device_printf(dev, "unable to setup interrupt\n"); - return ENXIO; - } - return (0); -} - -/* - * Common case interrupt handler. - */ -struct intr_arg { - void *arg; - u_int cause; -}; - -static void -mvs_intr(void *data) -{ - struct mvs_controller *ctlr = data; - struct intr_arg arg; - void (*function)(void *); - int p; - u_int32_t ic, aic; - - ic = ATA_INL(ctlr->r_mem, CHIP_MIC); -//device_printf(ctlr->dev, "irq MIC:%08x\n", ic); - if (ic & IC_ALL_PORTS_COAL_DONE) - ATA_OUTL(ctlr->r_mem, CHIP_MIC, ~IC_ALL_PORTS_COAL_DONE); - for (p = 0; p < ctlr->channels; p++) { - if ((p & 3) == 0) { - if (p == 4) - ic >>= 1; - if ((ic & IC_HC0) == 0) { - p += 3; - ic >>= 8; - continue; - } - aic = 0; - if (ic & (IC_DONE_IRQ << 0)) - aic |= HC_IC_DONE(0) | HC_IC_DEV(0); - if (ic & (IC_DONE_IRQ << 2)) - aic |= HC_IC_DONE(1) | HC_IC_DEV(1); - if (ic & (IC_DONE_IRQ << 4)) - aic |= HC_IC_DONE(2) | HC_IC_DEV(2); - if (ic & (IC_DONE_IRQ << 6)) - aic |= HC_IC_DONE(3) | HC_IC_DEV(3); - if (ic & IC_HC0_COAL_DONE) - aic |= HC_IC_COAL; - ATA_OUTL(ctlr->r_mem, HC_BASE(p == 4) + HC_IC, ~aic); - } - arg.cause = ic & (IC_ERR_IRQ|IC_DONE_IRQ); - if ((arg.cause != 0) && - (function = ctlr->interrupt[p].function)) { - arg.arg = ctlr->interrupt[p].argument; - function(&arg); - } - ic >>= 2; - } -} - -static struct resource * -mvs_alloc_resource(device_t dev, device_t child, int type, int *rid, - u_long start, u_long end, u_long count, u_int flags) -{ - struct mvs_controller *ctlr = device_get_softc(dev); - int unit = ((struct mvs_channel *)device_get_softc(child))->unit; - struct resource *res = NULL; - int offset = HC_BASE(unit >> 2) + PORT_BASE(unit & 0x03); - long st; - - switch (type) { - case SYS_RES_MEMORY: - st = rman_get_start(ctlr->r_mem); - res = rman_reserve_resource(&ctlr->sc_iomem, st + offset, - st + offset + PORT_SIZE - 1, PORT_SIZE, RF_ACTIVE, child); - if (res) { - bus_space_handle_t bsh; - bus_space_tag_t bst; - bsh = rman_get_bushandle(ctlr->r_mem); - bst = rman_get_bustag(ctlr->r_mem); - bus_space_subregion(bst, bsh, offset, PORT_SIZE, &bsh); - rman_set_bushandle(res, bsh); - rman_set_bustag(res, bst); - } - break; - case SYS_RES_IRQ: - if (*rid == ATA_IRQ_RID) - res = ctlr->irq.r_irq; - break; - } - return (res); -} - static int -mvs_release_resource(device_t dev, device_t child, int type, int rid, - struct resource *r) -{ - - switch (type) { - case SYS_RES_MEMORY: - rman_release_resource(r); - return (0); - case SYS_RES_IRQ: - if (rid != ATA_IRQ_RID) - return ENOENT; - return (0); - } - return (EINVAL); -} - -static int -mvs_setup_intr(device_t dev, device_t child, struct resource *irq, - int flags, driver_filter_t *filter, driver_intr_t *function, - void *argument, void **cookiep) -{ - struct mvs_controller *ctlr = device_get_softc(dev); - int unit = (intptr_t)device_get_ivars(child); - - if (filter != NULL) { - printf("mvs.c: we cannot use a filter here\n"); - return (EINVAL); - } - ctlr->interrupt[unit].function = function; - ctlr->interrupt[unit].argument = argument; - return (0); -} - -static int -mvs_teardown_intr(device_t dev, device_t child, struct resource *irq, - void *cookie) -{ - struct mvs_controller *ctlr = device_get_softc(dev); - int unit = (intptr_t)device_get_ivars(child); - - ctlr->interrupt[unit].function = NULL; - ctlr->interrupt[unit].argument = NULL; - return (0); -} - -static int -mvs_print_child(device_t dev, device_t child) -{ - int retval; - - retval = bus_print_child_header(dev, child); - retval += printf(" at channel %d", - (int)(intptr_t)device_get_ivars(child)); - retval += bus_print_child_footer(dev, child); - - return (retval); -} - -devclass_t mvs_devclass; -static device_method_t mvs_methods[] = { - DEVMETHOD(device_probe, mvs_probe), - DEVMETHOD(device_attach, mvs_attach), - DEVMETHOD(device_detach, mvs_detach), - DEVMETHOD(device_suspend, mvs_suspend), - DEVMETHOD(device_resume, mvs_resume), - DEVMETHOD(bus_print_child, mvs_print_child), - DEVMETHOD(bus_alloc_resource, mvs_alloc_resource), - DEVMETHOD(bus_release_resource, mvs_release_resource), - DEVMETHOD(bus_setup_intr, mvs_setup_intr), - DEVMETHOD(bus_teardown_intr,mvs_teardown_intr), - { 0, 0 } -}; -static driver_t mvs_driver = { - "mvs", - mvs_methods, - sizeof(struct mvs_controller) -}; -DRIVER_MODULE(mvs, pci, mvs_driver, mvs_devclass, 0, 0); -MODULE_VERSION(mvs, 1); -MODULE_DEPEND(mvs, cam, 1, 1, 1); - -static int mvs_ch_probe(device_t dev) { @@ -914,6 +501,7 @@ sizeof(struct mvs_channel) }; DRIVER_MODULE(mvsch, mvs, mvsch_driver, mvsch_devclass, 0, 0); +DRIVER_MODULE(mvsch, sata, mvsch_driver, mvsch_devclass, 0, 0); static void mvs_phy_check_events(device_t dev, u_int32_t serr) @@ -968,7 +556,7 @@ static void mvs_ch_intr_locked(void *data) { - struct intr_arg *arg = (struct intr_arg *)data; + struct mvs_intr_arg *arg = (struct mvs_intr_arg *)data; device_t dev = (device_t)arg->arg; struct mvs_channel *ch = device_get_softc(dev); @@ -999,7 +587,7 @@ static void mvs_ch_intr(void *data) { - struct intr_arg *arg = (struct intr_arg *)data; + struct mvs_intr_arg *arg = (struct mvs_intr_arg *)data; device_t dev = (device_t)arg->arg; struct mvs_channel *ch = device_get_softc(dev); uint32_t iec, serr = 0, fisic = 0; @@ -2476,7 +2064,7 @@ mvspoll(struct cam_sim *sim) { struct mvs_channel *ch = (struct mvs_channel *)cam_sim_softc(sim); - struct intr_arg arg; + struct mvs_intr_arg arg; arg.arg = ch->dev; arg.cause = 2; /* XXX */ ==== //depot/projects/scottl-camlock/src/sys/dev/mvs/mvs.h#6 (text+ko) ==== @@ -508,6 +508,9 @@ struct cam_sim *sim; struct cam_path *path; int quirks; +#define MVS_Q_GENI 1 +#define MVS_Q_GENII 2 +#define MVS_Q_GENIIE 4 int pm_level; /* power management level */ struct mvs_slot slot[MVS_MAX_SLOTS]; @@ -579,6 +582,11 @@ * until READ LOG executed to reveal error. */ }; +struct mvs_intr_arg { + void *arg; + u_int cause; +}; + /* macros to hide busspace uglyness */ #define ATA_INB(res, offset) \ bus_read_1((res), (offset))