PERFORCE change 177202 for review

Alexander Motin mav at FreeBSD.org
Thu Apr 22 06:24:40 UTC 2010


http://p4web.freebsd.org/@@177202?ac=10

Change 177202 by mav at 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 <sys/malloc.h>
 #include <sys/lock.h>
 #include <sys/mutex.h>
-#include <sys/sema.h>
-#include <sys/taskqueue.h>
 #include <vm/uma.h>
 #include <machine/stdarg.h>
 #include <machine/resource.h>
 #include <machine/bus.h>
 #include <sys/rman.h>
-#include <dev/pci/pcivar.h>
-#include <dev/pci/pcireg.h>
 #include "mvs.h"
 
 #include <cam/cam.h>
@@ -55,12 +51,6 @@
 #include <cam/cam_debug.h>
 
 /* 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))


More information about the p4-projects mailing list