Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 Jul 2007 00:35:15 GMT
From:      Christopher Davis <loafier@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 123987 for review
Message-ID:  <200707240035.l6O0ZFb9039534@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=123987

Change 123987 by loafier@chrisdsoc on 2007/07/24 00:34:33

	Added sentinal to resource_spec arrays in aureal.c.
	Used bus_alloc_resources, etc in cmi.c.
	Haven't tried compiling either of these yet.

Affected files ...

.. //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/aureal.c#4 edit
.. //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/cmi.c#2 edit

Differences ...

==== //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/aureal.c#4 (text+ko) ====

@@ -76,12 +76,14 @@
 
 static struct resource_spec au_res_spec_mem[] = {
 	{SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE},
-	{SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHARABLE}
+	{SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHARABLE},
+	{-1, 0, 0}
 };
 
 static struct resource_spec au_res_spec_io[] = {
 	{SYS_RES_IOPORT, PCIR_BAR(0), RF_ACTIVE},
-	{SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHARABLE}
+	{SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHARABLE},
+	{-1, 0, 0}
 };
 
 struct au_info {

==== //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/cmi.c#2 (text+ko) ====

@@ -100,14 +100,23 @@
 	int			dir;
 };
 
+enum {
+	RES_MEM,
+	RES_IRQ,
+	RES_SZ
+};
+
+static struct resource_spec cmi_res_spec[] = {
+	{SYS_RES_IOPORT, PCIR_BAR(0), RF_ACTIVE},
+	{SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHARABLE},
+	{-1, 0, 0}
+};
+
 struct sc_info {
 	device_t		dev;
 
-	bus_space_tag_t		st;
-	bus_space_handle_t	sh;
 	bus_dma_tag_t		parent_dmat;
-	struct resource		*reg, *irq;
-	int			regid, irqid;
+	struct resource 	*res[RES_SZ];
 	void 			*ih;
 	struct mtx		*lock;
 
@@ -138,37 +147,13 @@
 /* ------------------------------------------------------------------------- */
 /* Register Utilities */
 
-static u_int32_t
-cmi_rd(struct sc_info *sc, int regno, int size)
-{
-	switch (size) {
-	case 1:
-		return bus_space_read_1(sc->st, sc->sh, regno);
-	case 2:
-		return bus_space_read_2(sc->st, sc->sh, regno);
-	case 4:
-		return bus_space_read_4(sc->st, sc->sh, regno);
-	default:
-		DEB(printf("cmi_rd: failed 0x%04x %d\n", regno, size));
-		return 0xFFFFFFFF;
-	}
-}
+#define cmi_rd1(_sc, _reg) bus_read_1((_sc)->res[RES_MEM], _reg)
+#define cmi_rd2(_sc, _reg) bus_read_2((_sc)->res[RES_MEM], _reg)
+#define cmi_rd4(_sc, _reg) bus_read_4((_sc)->res[RES_MEM], _reg)
 
-static void
-cmi_wr(struct sc_info *sc, int regno, u_int32_t data, int size)
-{
-	switch (size) {
-	case 1:
-		bus_space_write_1(sc->st, sc->sh, regno, data);
-		break;
-	case 2:
-		bus_space_write_2(sc->st, sc->sh, regno, data);
-		break;
-	case 4:
-		bus_space_write_4(sc->st, sc->sh, regno, data);
-		break;
-	}
-}
+#define cmi_wr1(_sc, _reg, _val) bus_write_1((_sc)->res[RES_MEM], _reg, _val)
+#define cmi_wr2(_sc, _reg, _val) bus_write_2((_sc)->res[RES_MEM], _reg, _val)
+#define cmi_wr4(_sc, _reg, _val) bus_write_4((_sc)->res[RES_MEM], _reg, _val)
 
 static void
 cmi_partial_wr4(struct sc_info *sc,
@@ -176,10 +161,10 @@
 {
 	u_int32_t r;
 
-	r = cmi_rd(sc, reg, 4);
+	r = cmi_rd4(sc, reg);
 	r &= ~(mask << shift);
 	r |= val << shift;
-	cmi_wr(sc, reg, r, 4);
+	cmi_wr4(sc, reg, r);
 }
 
 static void
@@ -187,9 +172,9 @@
 {
 	u_int32_t r;
 
-	r = cmi_rd(sc, reg, 4);
+	r = cmi_rd4(sc, reg);
 	r &= ~mask;
-	cmi_wr(sc, reg, r, 4);
+	cmi_wr4(sc, reg, r);
 }
 
 static void
@@ -197,9 +182,9 @@
 {
 	u_int32_t r;
 
-	r = cmi_rd(sc, reg, 4);
+	r = cmi_rd4(sc, reg);
 	r |= mask;
-	cmi_wr(sc, reg, r, 4);
+	cmi_wr4(sc, reg, r);
 }
 
 /* ------------------------------------------------------------------------- */
@@ -250,14 +235,14 @@
 
 	ch->phys_buf = sndbuf_getbufaddr(ch->buffer);
 
-	cmi_wr(sc, base, ch->phys_buf, 4);
+	cmi_wr4(sc, base, ch->phys_buf);
 	sz = (u_int32_t)sndbuf_getsize(ch->buffer);
 
 	s = sz / ch->bps - 1;
-	cmi_wr(sc, base + 4, s, 2);
+	cmi_wr2(sc, base + 4, s);
 
 	i = sz / (ch->bps * CMI_INTR_PER_BUFFER) - 1;
-	cmi_wr(sc, base + 6, i, 2);
+	cmi_wr2(sc, base + 6, i);
 }
 
 
@@ -431,7 +416,7 @@
 			/* enable if req after rate change */
 			cmi_spdif_speed(ch->parent, speed);
 		}
-		rsp = cmi_rd(ch->parent, CMPCI_REG_FUNC_1, 4);
+		rsp = cmi_rd4(ch->parent, CMPCI_REG_FUNC_1);
 		rsp >>= CMPCI_REG_DAC_FS_SHIFT;
 		rsp &= 	CMPCI_REG_DAC_FS_MASK;
 	} else {
@@ -440,7 +425,7 @@
 				CMPCI_REG_ADC_FS_SHIFT,
 				CMPCI_REG_ADC_FS_MASK,
 				r);
-		rsp = cmi_rd(ch->parent, CMPCI_REG_FUNC_1, 4);
+		rsp = cmi_rd4(ch->parent, CMPCI_REG_FUNC_1);
 		rsp >>= CMPCI_REG_ADC_FS_SHIFT;
 		rsp &= 	CMPCI_REG_ADC_FS_MASK;
 	}
@@ -513,9 +498,9 @@
 
 	snd_mtxlock(sc->lock);
 	if (ch->dir == PCMDIR_PLAY) {
-		physptr = cmi_rd(sc, CMPCI_REG_DMA0_BASE, 4);
+		physptr = cmi_rd4(sc, CMPCI_REG_DMA0_BASE);
 	} else {
-		physptr = cmi_rd(sc, CMPCI_REG_DMA1_BASE, 4);
+		physptr = cmi_rd4(sc, CMPCI_REG_DMA1_BASE);
 	}
 	snd_mtxunlock(sc->lock);
 
@@ -533,7 +518,7 @@
 	u_int32_t toclear;
 
 	snd_mtxlock(sc->lock);
-	intrstat = cmi_rd(sc, CMPCI_REG_INTR_STATUS, 4);
+	intrstat = cmi_rd4(sc, CMPCI_REG_INTR_STATUS);
 	if ((intrstat & CMPCI_REG_ANY_INTR) != 0) {
 
 		toclear = 0;
@@ -596,15 +581,15 @@
 static void
 cmimix_wr(struct sc_info *sc, u_int8_t port, u_int8_t val)
 {
-	cmi_wr(sc, CMPCI_REG_SBADDR, port, 1);
-	cmi_wr(sc, CMPCI_REG_SBDATA, val, 1);
+	cmi_wr1(sc, CMPCI_REG_SBADDR, port);
+	cmi_wr1(sc, CMPCI_REG_SBDATA, val);
 }
 
 static u_int8_t
 cmimix_rd(struct sc_info *sc, u_int8_t port)
 {
-	cmi_wr(sc, CMPCI_REG_SBADDR, port, 1);
-	return (u_int8_t)cmi_rd(sc, CMPCI_REG_SBDATA, 1);
+	cmi_wr1(sc, CMPCI_REG_SBADDR, port);
+	return (u_int8_t)cmi_rd1(sc, CMPCI_REG_SBDATA);
 }
 
 struct sb16props {
@@ -677,11 +662,11 @@
 	if (cmt[dev].rreg == CMPCI_NON_SB16_CONTROL) {
 		/* For time being this can only be one thing (mic in
 		 * mic/aux reg) */
-		v = cmi_rd(sc, CMPCI_REG_AUX_MIC, 1) & 0xf0;
+		v = cmi_rd1(sc, CMPCI_REG_AUX_MIC) & 0xf0;
 		l = left * max / 100;
 		/* 3 bit gain with LSB MICGAIN off(1),on(1) -> 4 bit value */
 		v |= ((l << 1) | (~l >> 3)) & 0x0f;
-		cmi_wr(sc, CMPCI_REG_AUX_MIC, v, 1);
+		cmi_wr1(sc, CMPCI_REG_AUX_MIC, v);
 		return 0;
 	}
 
@@ -898,6 +883,24 @@
 		sc->mpu_intr = 0;
 }
 
+static void
+cmi_destroy(device_t dev, sc_info *sc)
+{
+	if (!sc)
+		return;
+
+	if (sc->parent_dmat)
+		bus_dma_tag_destroy(sc->parent_dmat);
+	if (sc->ih)
+		bus_teardown_intr(dev, sc->res[RES_IRQ], sc->ih);
+	bus_release_resources(dev, sc->res, cmi_res_spec);
+	if (sc->lock)
+		snd_mtxfree(sc->lock);
+
+	free(sc, M_DEVBUF);
+}
+
+
 /* ------------------------------------------------------------------------- */
 /* Bus and device registration */
 static int
@@ -925,35 +928,28 @@
 cmi_attach(device_t dev)
 {
 	struct sc_info		*sc;
-	u_int32_t		data;
 	char			status[SND_STATUSLEN];
 
 	sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
+	if (!sc) {
+		device_printf(dev, "cannot allocate softc\n");
+		return ENXIO;
+	}
+
 	sc->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_cmi softc");
-	data = pci_read_config(dev, PCIR_COMMAND, 2);
-	data |= (PCIM_CMD_PORTEN|PCIM_CMD_BUSMASTEREN);
-	pci_write_config(dev, PCIR_COMMAND, data, 2);
-	data = pci_read_config(dev, PCIR_COMMAND, 2);
 
+	pci_enable_busmaster(dev);
+	pci_enable_io(dev, SYS_RES_IOPORT);
 	sc->dev = dev;
-	sc->regid = PCIR_BAR(0);
-	sc->reg = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &sc->regid,
-					 RF_ACTIVE);
-	if (!sc->reg) {
-		device_printf(dev, "cmi_attach: Cannot allocate bus resource\n");
+
+	if (bus_alloc_resources(dev, sc->res, cmi_res_spec) != 0)
 		goto bad;
-	}
-	sc->st = rman_get_bustag(sc->reg);
-	sc->sh = rman_get_bushandle(sc->reg);
 
 	if (0)
 		cmi_midiattach(sc);
 
-	sc->irqid = 0;
-	sc->irq   = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irqid,
-					   RF_ACTIVE | RF_SHAREABLE);
-	if (!sc->irq ||
-	    snd_setup_intr(dev, sc->irq, INTR_MPSAFE, cmi_intr, sc, &sc->ih)) {
+	if (snd_setup_intr(dev, sc->res[RES_IRQ], 
+	    INTR_MPSAFE, cmi_intr, sc, &sc->ih)) {
 		device_printf(dev, "cmi_attach: Unable to map interrupt\n");
 		goto bad;
 	}
@@ -990,25 +986,16 @@
 	pcm_addchan(dev, PCMDIR_REC, &cmichan_class, sc);
 
 	snprintf(status, SND_STATUSLEN, "at io 0x%lx irq %ld %s",
-		 rman_get_start(sc->reg), rman_get_start(sc->irq),PCM_KLDSTRING(snd_cmi));
+		 rman_get_start(sc->res[RES_MEM]), 
+		 rman_get_start(sc->res[RES_IRQ]),
+		 PCM_KLDSTRING(snd_cmi));
 	pcm_setstatus(dev, status);
 
 	DEB(printf("cmi_attach: succeeded\n"));
 	return 0;
 
  bad:
-	if (sc->parent_dmat)
-		bus_dma_tag_destroy(sc->parent_dmat);
-	if (sc->ih)
-		bus_teardown_intr(dev, sc->irq, sc->ih);
-	if (sc->irq)
-		bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq);
-	if (sc->reg)
-		bus_release_resource(dev, SYS_RES_IOPORT, sc->regid, sc->reg);
-	if (sc->lock)
-		snd_mtxfree(sc->lock);
-	if (sc)
-		free(sc, M_DEVBUF);
+	cmi_destroy(dev, sc);
 
 	return ENXIO;
 }
@@ -1026,17 +1013,12 @@
 	cmi_uninit(sc);
 	cmi_power(sc, 3);
 
-	bus_dma_tag_destroy(sc->parent_dmat);
-	bus_teardown_intr(dev, sc->irq, sc->ih);
-	bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq);
 	if(sc->mpu)
 		mpu401_uninit(sc->mpu);
-	bus_release_resource(dev, SYS_RES_IOPORT, sc->regid, sc->reg);
 	if (sc->mpu_reg)
 	    bus_release_resource(dev, SYS_RES_IOPORT, sc->mpu_regid, sc->mpu_reg);
 
-	snd_mtxfree(sc->lock);
-	free(sc, M_DEVBUF);
+	cmi_destroy(dev, sc);
 
 	return 0;
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707240035.l6O0ZFb9039534>