From owner-freebsd-multimedia@FreeBSD.ORG Mon Apr 22 18:40:01 2013 Return-Path: Delivered-To: freebsd-multimedia@smarthost.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 5E3ABAFE for ; Mon, 22 Apr 2013 18:40:01 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:1900:2254:206c::16:87]) by mx1.freebsd.org (Postfix) with ESMTP id 3FB171D36 for ; Mon, 22 Apr 2013 18:40:01 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.6/8.14.6) with ESMTP id r3MIe12a086605 for ; Mon, 22 Apr 2013 18:40:01 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.6/8.14.6/Submit) id r3MIe0tR086604; Mon, 22 Apr 2013 18:40:00 GMT (envelope-from gnats) Date: Mon, 22 Apr 2013 18:40:00 GMT Message-Id: <201304221840.r3MIe0tR086604@freefall.freebsd.org> To: freebsd-multimedia@FreeBSD.org Cc: From: Jason Subject: Re: kern/152378: [sound][patch] Update snd_envy24ht to be MPSAFE and use 32-bit DMA addresses X-BeenThere: freebsd-multimedia@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: Jason List-Id: Multimedia discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 22 Apr 2013 18:40:01 -0000 The following reply was made to PR kern/152378; it has been noted by GNATS. From: Jason To: bug-followup@FreeBSD.org, jason.harmening@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--