kern/152378: [sound][patch] Update snd_envy24ht to be MPSAFE and use 32-bit DMA addresses
Jason
jason.harmening at gmail.com
Mon Apr 22 18:40:01 UTC 2013
The following reply was made to PR kern/152378; it has been noted by GNATS.
From: Jason <jason.harmening at gmail.com>
To: bug-followup at FreeBSD.org,
jason.harmening at gmail.com
Cc:
Subject: Re: kern/152378: [sound][patch] Update snd_envy24ht to be MPSAFE and use 32-bit DMA addresses
Date: Mon, 22 Apr 2013 13:32:29 -0500
--Apple-Mail=_F85251E0-9ABB-4CB6-84DB-D120516E777F
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
charset=us-ascii
Here's an update to the patch that gets rid of lockfunc[arg] for the DMA =
tag, and correctly uses the busdma load callbacks to program the device =
w/ the bus address.
--Apple-Mail=_F85251E0-9ABB-4CB6-84DB-D120516E777F
Content-Disposition: attachment;
filename=patch_envy24ht.txt
Content-Type: text/plain;
x-unix-mode=0644;
name="patch_envy24ht.txt"
Content-Transfer-Encoding: quoted-printable
--- envy24ht.h.orig 2011-10-01 12:23:36.000000000 -0500
+++ envy24ht.h 2011-10-01 12:24:46.000000000 -0500
@@ -176,8 +176,7 @@
#define ENVY24HT_VOL_MIN 96 /* -144db(negate) */
#define ENVY24HT_VOL_MUTE 127 /* mute */
=20
-#define BUS_SPACE_MAXADDR_ENVY24 0x0fffffff /* Address space beyond =
256MB is not
- supported */
+#define BUS_SPACE_MAXADDR_ENVY24 0xffffffff
#define BUS_SPACE_MAXSIZE_ENVY24 0x3fffc /* 64k x 4byte(1dword) */
=20
#define ENVY24HT_CCS_GPIO_HDATA 0x1E
--- envy24ht.c.orig 2011-10-01 12:23:36.000000000 -0500
+++ envy24ht.c 2013-03-21 07:29:25.000000000 -0500
@@ -2080,7 +2080,9 @@
static void
envy24ht_dmapsetmap(void *arg, bus_dma_segment_t *segs, int nseg, int =
error)
{
- /* struct sc_info *sc =3D (struct sc_info *)arg; */
+ struct sc_info *sc =3D arg;
+ envy24ht_wrmt(sc, ENVY24HT_MT_PADDR, (uint32_t)segs->ds_addr, =
4);
+ envy24ht_wrmt(sc, ENVY24HT_MT_PCNT, (uint32_t)(segs->ds_len / 4 =
- 1), 2);
=20
#if(0)
device_printf(sc->dev, "envy24ht_dmapsetmap()\n");
@@ -2088,7 +2090,6 @@
printf("envy24ht(play): setmap %lx, %lx; ",
(unsigned long)segs->ds_addr,
(unsigned long)segs->ds_len);
- printf("%p -> %lx\n", sc->pmap, (unsigned =
long)vtophys(sc->pmap));
}
#endif
}
@@ -2096,7 +2097,9 @@
static void
envy24ht_dmarsetmap(void *arg, bus_dma_segment_t *segs, int nseg, int =
error)
{
- /* struct sc_info *sc =3D (struct sc_info *)arg; */
+ struct sc_info *sc =3D arg;
+ envy24ht_wrmt(sc, ENVY24HT_MT_RADDR, (uint32_t)segs->ds_addr, =
4);
+ envy24ht_wrmt(sc, ENVY24HT_MT_RCNT, (uint32_t)(segs->ds_len / 4 =
- 1), 2);
=20
#if(0)
device_printf(sc->dev, "envy24ht_dmarsetmap()\n");
@@ -2104,7 +2107,6 @@
printf("envy24ht(record): setmap %lx, %lx; ",
(unsigned long)segs->ds_addr,
(unsigned long)segs->ds_len);
- printf("%p -> %lx\n", sc->rmap, (unsigned =
long)vtophys(sc->pmap));
}
#endif
}
@@ -2149,8 +2151,6 @@
static int
envy24ht_dmainit(struct sc_info *sc)
{
- u_int32_t addr;
-
#if(0)
device_printf(sc->dev, "envy24ht_dmainit()\n");
#endif
@@ -2176,34 +2176,16 @@
#if(0)
device_printf(sc->dev, "envy24ht_dmainit(): bus_dmamem_load(): =
sc->pmap\n");
#endif
- if (bus_dmamap_load(sc->dmat, sc->pmap, sc->pbuf, sc->psize, =
envy24ht_dmapsetmap, sc, 0))
+ if (bus_dmamap_load(sc->dmat, sc->pmap, sc->pbuf, sc->psize, =
envy24ht_dmapsetmap, sc, BUS_DMA_NOWAIT))
goto bad;
#if(0)
device_printf(sc->dev, "envy24ht_dmainit(): bus_dmamem_load(): =
sc->rmap\n");
#endif
- if (bus_dmamap_load(sc->dmat, sc->rmap, sc->rbuf, sc->rsize, =
envy24ht_dmarsetmap, sc, 0))
+ if (bus_dmamap_load(sc->dmat, sc->rmap, sc->rbuf, sc->rsize, =
envy24ht_dmarsetmap, sc, BUS_DMA_NOWAIT))
goto bad;
bzero(sc->pbuf, sc->psize);
bzero(sc->rbuf, sc->rsize);
=20
- /* set values to register */
- addr =3D vtophys(sc->pbuf);
-#if(0)
- device_printf(sc->dev, "pbuf(0x%08x)\n", addr);
-#endif
- envy24ht_wrmt(sc, ENVY24HT_MT_PADDR, addr, 4);
-#if(0)
- device_printf(sc->dev, "PADDR-->(0x%08x)\n", envy24ht_rdmt(sc, =
ENVY24HT_MT_PADDR, 4));
- device_printf(sc->dev, "psize(%ld)\n", sc->psize / 4 - 1);
-#endif
- envy24ht_wrmt(sc, ENVY24HT_MT_PCNT, sc->psize / 4 - 1, 2);
-#if(0)
- device_printf(sc->dev, "PCNT-->(%ld)\n", envy24ht_rdmt(sc, =
ENVY24HT_MT_PCNT, 2));
-#endif
- addr =3D vtophys(sc->rbuf);
- envy24ht_wrmt(sc, ENVY24HT_MT_RADDR, addr, 4);
- envy24ht_wrmt(sc, ENVY24HT_MT_RCNT, sc->rsize / 4 - 1, 2);
-
return 0;
bad:
envy24ht_dmafree(sc);
@@ -2441,7 +2423,7 @@
sc->irq =3D bus_alloc_resource(sc->dev, SYS_RES_IRQ, &sc->irqid,
0, ~0, 1, RF_ACTIVE | RF_SHAREABLE);
if (!sc->irq ||
- snd_setup_intr(sc->dev, sc->irq, 0, envy24ht_intr, sc, =
&sc->ih)) {
+ snd_setup_intr(sc->dev, sc->irq, INTR_MPSAFE, envy24ht_intr, =
sc, &sc->ih)) {
device_printf(sc->dev, "unable to map interrupt\n");
return ENXIO;
}
@@ -2451,12 +2433,12 @@
/*alignment*/4,
/*boundary*/0,
/*lowaddr*/BUS_SPACE_MAXADDR_ENVY24,
- /*highaddr*/BUS_SPACE_MAXADDR_ENVY24,
+ /*highaddr*/BUS_SPACE_MAXADDR,
/*filter*/NULL, /*filterarg*/NULL,
/*maxsize*/BUS_SPACE_MAXSIZE_ENVY24,
/*nsegments*/1, /*maxsegsz*/0x3ffff,
- /*flags*/0, /*lockfunc*/busdma_lock_mutex,
- /*lockarg*/&Giant, &sc->dmat) !=3D 0) {
+ /*flags*/0, /*lockfunc*/NULL,
+ /*lockarg*/NULL, &sc->dmat) !=3D 0) {
device_printf(sc->dev, "unable to create dma tag\n");
return ENXIO;
}
--Apple-Mail=_F85251E0-9ABB-4CB6-84DB-D120516E777F--
More information about the freebsd-multimedia
mailing list