From owner-p4-projects@FreeBSD.ORG Fri Jul 27 07:56:01 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C0F7D16A419; Fri, 27 Jul 2007 07:56:00 +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 9420016A417 for ; Fri, 27 Jul 2007 07:56:00 +0000 (UTC) (envelope-from loafier@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 8639513C46A for ; Fri, 27 Jul 2007 07:56:00 +0000 (UTC) (envelope-from loafier@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l6R7u0RN043818 for ; Fri, 27 Jul 2007 07:56:00 GMT (envelope-from loafier@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l6R7u0SK043813 for perforce@freebsd.org; Fri, 27 Jul 2007 07:56:00 GMT (envelope-from loafier@FreeBSD.org) Date: Fri, 27 Jul 2007 07:56:00 GMT Message-Id: <200707270756.l6R7u0SK043813@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to loafier@FreeBSD.org using -f From: Christopher Davis To: Perforce Change Reviews Cc: Subject: PERFORCE change 124161 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 27 Jul 2007 07:56:01 -0000 http://perforce.freebsd.org/chv.cgi?CH=124161 Change 124161 by loafier@chrisdsoc on 2007/07/27 07:55:51 Use bus_alloc_resources, etc Affected files ... .. //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/ds1.c#2 edit Differences ... ==== //depot/projects/soc2007/loafier_busalloc/src/sys/dev/sound/pci/ds1.c#2 (text+ko) ==== @@ -102,19 +102,29 @@ struct sc_info *parent; }; + +enum { + RES_MEM, + RES_IRQ, + RES_SZ +}; + +static struct resource_spec ds_res_spec[] = { + {SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE}, + {SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE}, + {-1, 0, 0} +}; + /* device private data */ struct sc_info { device_t dev; u_int32_t type, rev; u_int32_t cd2id, ctrlbase; - bus_space_tag_t st; - bus_space_handle_t sh; bus_dma_tag_t buffer_dmat, control_dmat; bus_dmamap_t map; - struct resource *reg, *irq; - int regid, irqid; + struct resource *res[RES_SZ]; void *ih; struct mtx *lock; @@ -160,10 +170,6 @@ static int ds_init(struct sc_info *); static void ds_intr(void *); -/* talk to the card */ -static u_int32_t ds_rd(struct sc_info *, int, int); -static void ds_wr(struct sc_info *, int, u_int32_t, int); - /* -------------------------------------------------------------------- */ static u_int32_t ds_recfmt[] = { @@ -190,42 +196,22 @@ /* -------------------------------------------------------------------- */ /* Hardware */ -static u_int32_t -ds_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: - return 0xffffffff; - } -} +#define ds_rd1(_sc, _reg) bus_read_1((_sc)->res[RES_MEM], _reg) +#define ds_rd2(_sc, _reg) bus_read_2((_sc)->res[RES_MEM], _reg) +#define ds_rd4(_sc, _reg) bus_read_4((_sc)->res[RES_MEM], _reg) +#define ds_wr1(_sc, _reg, _val) bus_write_1((_sc)->res[RES_MEM], _reg, _val) +#define ds_wr2(_sc, _reg, _val) bus_write_2((_sc)->res[RES_MEM], _reg, _val) +#define ds_wr4(_sc, _reg, _val) bus_write_4((_sc)->res[RES_MEM], _reg, _val) static void -ds_wr(struct sc_info *sc, int regno, u_int32_t data, int size) +wrl(struct sc_info *sc, u_int32_t *ptr, u_int32_t val) { - 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; - } -} + struct resource *mem = sc->res[RES_MEM]; -static void -wrl(struct sc_info *sc, u_int32_t *ptr, u_int32_t val) -{ *(volatile u_int32_t *)ptr = val; - bus_space_barrier(sc->st, sc->sh, 0, 0, BUS_SPACE_BARRIER_WRITE); + bus_space_barrier(rman_get_bustag(mem), + rman_get_bushandle(mem), + 0, 0, BUS_SPACE_BARRIER_WRITE); } /* -------------------------------------------------------------------- */ @@ -238,7 +224,7 @@ reg = sec? YDSXGR_SECSTATUSADR : YDSXGR_PRISTATUSADR; i = YDSXG_AC97TIMEOUT; while (i > 0) { - if (!(ds_rd(sc, reg, 2) & 0x8000)) + if (!(ds_rd2(sc, reg) & 0x8000)) return 0; i--; } @@ -286,16 +272,16 @@ return 0xffffffff; cmd = YDSXG_AC97READCMD | cid | regno; - ds_wr(sc, YDSXGR_AC97CMDADR, cmd, 2); + ds_wr2(sc, YDSXGR_AC97CMDADR, cmd); if (ds_cdbusy(sc, sec)) return 0xffffffff; if (sc->type == 11 && sc->rev < 2) for (i = 0; i < 600; i++) - ds_rd(sc, reg, 2); + ds_rd2(sc, reg); - return ds_rd(sc, reg, 2); + return ds_rd2(sc, reg); } static int @@ -314,7 +300,7 @@ cmd = YDSXG_AC97WRITECMD | cid | regno; cmd <<= 16; cmd |= data; - ds_wr(sc, YDSXGR_AC97CMDDATA, cmd, 4); + ds_wr4(sc, YDSXGR_AC97CMDDATA, cmd); return ds_cdbusy(sc, sec); } @@ -336,13 +322,13 @@ v = on? 1 : 0; if (on) { - ds_wr(sc, YDSXGR_CONFIG, 0x00000001, 4); + ds_wr4(sc, YDSXGR_CONFIG, 0x00000001); } else { - if (ds_rd(sc, YDSXGR_CONFIG, 4)) - ds_wr(sc, YDSXGR_CONFIG, 0x00000000, 4); + if (ds_rd4(sc, YDSXGR_CONFIG)) + ds_wr4(sc, YDSXGR_CONFIG, 0x00000000); i = YDSXG_WORKBITTIMEOUT; while (i > 0) { - if (!(ds_rd(sc, YDSXGR_CONFIG, 4) & 0x00000002)) + if (!(ds_rd4(sc, YDSXGR_CONFIG) & 0x00000002)) break; i--; } @@ -468,8 +454,8 @@ y = (48000 * 4096) / ch->spd; y--; /* printf("pri = %d, x = %d, y = %d\n", pri, x, y); */ - ds_wr(sc, pri? YDSXGR_ADCFORMAT : YDSXGR_RECFORMAT, x, 4); - ds_wr(sc, pri? YDSXGR_ADCSLOTSR : YDSXGR_RECSLOTSR, y, 4); + ds_wr4(sc, pri? YDSXGR_ADCFORMAT : YDSXGR_RECFORMAT, x); + ds_wr4(sc, pri? YDSXGR_ADCSLOTSR : YDSXGR_RECSLOTSR, y); } /* -------------------------------------------------------------------- */ @@ -554,7 +540,7 @@ ds_enapslot(sc, ch->lsnum, 1); ds_enapslot(sc, ch->rsnum, stereo); snd_mtxlock(sc->lock); - ds_wr(sc, YDSXGR_MODE, 0x00000003, 4); + ds_wr4(sc, YDSXGR_MODE, 0x00000003); snd_mtxunlock(sc->lock); } else { ch->run = 0; @@ -679,17 +665,17 @@ ch->run = 1; ds_setuprch(ch); snd_mtxlock(sc->lock); - x = ds_rd(sc, YDSXGR_MAPOFREC, 4); + x = ds_rd4(sc, YDSXGR_MAPOFREC); x |= (ch->num == DS1_RECPRIMARY)? 0x02 : 0x01; - ds_wr(sc, YDSXGR_MAPOFREC, x, 4); - ds_wr(sc, YDSXGR_MODE, 0x00000003, 4); + ds_wr4(sc, YDSXGR_MAPOFREC, x); + ds_wr4(sc, YDSXGR_MODE, 0x00000003); snd_mtxunlock(sc->lock); } else { ch->run = 0; snd_mtxlock(sc->lock); - x = ds_rd(sc, YDSXGR_MAPOFREC, 4); + x = ds_rd4(sc, YDSXGR_MAPOFREC); x &= ~((ch->num == DS1_RECPRIMARY)? 0x02 : 0x01); - ds_wr(sc, YDSXGR_MAPOFREC, x, 4); + ds_wr4(sc, YDSXGR_MAPOFREC, x); snd_mtxunlock(sc->lock); } @@ -732,12 +718,12 @@ u_int32_t i, x; snd_mtxlock(sc->lock); - i = ds_rd(sc, YDSXGR_STATUS, 4); + i = ds_rd4(sc, YDSXGR_STATUS); if (i & 0x00008000) device_printf(sc->dev, "timeout irq\n"); if (i & 0x80008000) { - ds_wr(sc, YDSXGR_STATUS, i & 0x80008000, 4); - sc->currbank = ds_rd(sc, YDSXGR_CTRLSELECT, 4) & 0x00000001; + ds_wr4(sc, YDSXGR_STATUS, i & 0x80008000); + sc->currbank = ds_rd4(sc, YDSXGR_CTRLSELECT) & 0x00000001; x = 0; for (i = 0; i < DS1_CHANS; i++) { @@ -756,9 +742,9 @@ snd_mtxlock(sc->lock); } } - i = ds_rd(sc, YDSXGR_MODE, 4); + i = ds_rd4(sc, YDSXGR_MODE); if (x) - ds_wr(sc, YDSXGR_MODE, i | 0x00000002, 4); + ds_wr4(sc, YDSXGR_MODE, i | 0x00000002); } snd_mtxunlock(sc->lock); @@ -794,29 +780,29 @@ ci = ds_devs[sc->type].mcode; - ds_wr(sc, YDSXGR_NATIVEDACOUTVOL, 0x00000000, 4); + ds_wr4(sc, YDSXGR_NATIVEDACOUTVOL, 0x00000000); ds_enadsp(sc, 0); - ds_wr(sc, YDSXGR_MODE, 0x00010000, 4); - ds_wr(sc, YDSXGR_MODE, 0x00000000, 4); - ds_wr(sc, YDSXGR_MAPOFREC, 0x00000000, 4); - ds_wr(sc, YDSXGR_MAPOFEFFECT, 0x00000000, 4); - ds_wr(sc, YDSXGR_PLAYCTRLBASE, 0x00000000, 4); - ds_wr(sc, YDSXGR_RECCTRLBASE, 0x00000000, 4); - ds_wr(sc, YDSXGR_EFFCTRLBASE, 0x00000000, 4); - r = ds_rd(sc, YDSXGR_GLOBALCTRL, 2); - ds_wr(sc, YDSXGR_GLOBALCTRL, r & ~0x0007, 2); + ds_wr4(sc, YDSXGR_MODE, 0x00010000); + ds_wr4(sc, YDSXGR_MODE, 0x00000000); + ds_wr4(sc, YDSXGR_MAPOFREC, 0x00000000); + ds_wr4(sc, YDSXGR_MAPOFEFFECT, 0x00000000); + ds_wr4(sc, YDSXGR_PLAYCTRLBASE, 0x00000000); + ds_wr4(sc, YDSXGR_RECCTRLBASE, 0x00000000); + ds_wr4(sc, YDSXGR_EFFCTRLBASE, 0x00000000); + r = ds_rd2(sc, YDSXGR_GLOBALCTRL); + ds_wr2(sc, YDSXGR_GLOBALCTRL, r & ~0x0007); for (i = 0; i < YDSXG_DSPLENGTH; i += 4) - ds_wr(sc, YDSXGR_DSPINSTRAM + i, DspInst[i >> 2], 4); + ds_wr4(sc, YDSXGR_DSPINSTRAM + i, DspInst[i >> 2]); for (i = 0; i < YDSXG_CTRLLENGTH; i += 4) - ds_wr(sc, YDSXGR_CTRLINSTRAM + i, ci[i >> 2], 4); + ds_wr4(sc, YDSXGR_CTRLINSTRAM + i, ci[i >> 2]); ds_enadsp(sc, 1); pcs = 0; for (i = 100; i > 0; i--) { - pcs = ds_rd(sc, YDSXGR_PLAYCTRLSIZE, 4) << 2; + pcs = ds_rd4(sc, YDSXGR_PLAYCTRLSIZE) << 2; if (pcs == sizeof(struct pbank)) break; DELAY(1000); @@ -825,9 +811,9 @@ device_printf(sc->dev, "preposterous playctrlsize (%d)\n", pcs); return -1; } - rcs = ds_rd(sc, YDSXGR_RECCTRLSIZE, 4) << 2; - ecs = ds_rd(sc, YDSXGR_EFFCTRLSIZE, 4) << 2; - ws = ds_rd(sc, YDSXGR_WORKSIZE, 4) << 2; + rcs = ds_rd4(sc, YDSXGR_RECCTRLSIZE) << 2; + ecs = ds_rd4(sc, YDSXGR_EFFCTRLSIZE) << 2; + ws = ds_rd4(sc, YDSXGR_WORKSIZE) << 2; memsz = 64 * 2 * pcs + 2 * 2 * rcs + 5 * 2 * ecs + ws; memsz += (64 + 1) * 4; @@ -852,16 +838,16 @@ cb = 0; t = buf; - ds_wr(sc, YDSXGR_WORKBASE, sc->ctrlbase + cb, 4); + ds_wr4(sc, YDSXGR_WORKBASE, sc->ctrlbase + cb); cb += ws; sc->pbase = (u_int32_t *)(t + cb); /* printf("pbase = %p -> 0x%x\n", sc->pbase, sc->ctrlbase + cb); */ - ds_wr(sc, YDSXGR_PLAYCTRLBASE, sc->ctrlbase + cb, 4); + ds_wr4(sc, YDSXGR_PLAYCTRLBASE, sc->ctrlbase + cb); cb += (64 + 1) * 4; sc->rbank = (struct rbank *)(t + cb); - ds_wr(sc, YDSXGR_RECCTRLBASE, sc->ctrlbase + cb, 4); + ds_wr4(sc, YDSXGR_RECCTRLBASE, sc->ctrlbase + cb); cb += 2 * 2 * rcs; - ds_wr(sc, YDSXGR_EFFCTRLBASE, sc->ctrlbase + cb, 4); + ds_wr4(sc, YDSXGR_EFFCTRLBASE, sc->ctrlbase + cb); cb += 5 * 2 * ecs; sc->pbankbase = sc->ctrlbase + cb; @@ -878,9 +864,9 @@ wrl(sc, &sc->pbase[0], DS1_CHANS * 2); sc->pchn = sc->rchn = 0; - ds_wr(sc, YDSXGR_NATIVEDACOUTVOL, 0x3fff3fff, 4); - ds_wr(sc, YDSXGR_NATIVEADCINVOL, 0x3fff3fff, 4); - ds_wr(sc, YDSXGR_NATIVEDACINVOL, 0x3fff3fff, 4); + ds_wr4(sc, YDSXGR_NATIVEDACOUTVOL, 0x3fff3fff); + ds_wr4(sc, YDSXGR_NATIVEADCINVOL, 0x3fff3fff); + ds_wr4(sc, YDSXGR_NATIVEDACINVOL, 0x3fff3fff); return 0; } @@ -888,17 +874,17 @@ static int ds_uninit(struct sc_info *sc) { - ds_wr(sc, YDSXGR_NATIVEDACOUTVOL, 0x00000000, 4); - ds_wr(sc, YDSXGR_NATIVEADCINVOL, 0, 4); - ds_wr(sc, YDSXGR_NATIVEDACINVOL, 0, 4); + ds_wr4(sc, YDSXGR_NATIVEDACOUTVOL, 0x00000000); + ds_wr4(sc, YDSXGR_NATIVEADCINVOL, 0); + ds_wr4(sc, YDSXGR_NATIVEDACINVOL, 0); ds_enadsp(sc, 0); - ds_wr(sc, YDSXGR_MODE, 0x00010000, 4); - ds_wr(sc, YDSXGR_MAPOFREC, 0x00000000, 4); - ds_wr(sc, YDSXGR_MAPOFEFFECT, 0x00000000, 4); - ds_wr(sc, YDSXGR_PLAYCTRLBASE, 0x00000000, 4); - ds_wr(sc, YDSXGR_RECCTRLBASE, 0x00000000, 4); - ds_wr(sc, YDSXGR_EFFCTRLBASE, 0x00000000, 4); - ds_wr(sc, YDSXGR_GLOBALCTRL, 0, 2); + ds_wr4(sc, YDSXGR_MODE, 0x00010000); + ds_wr4(sc, YDSXGR_MAPOFREC, 0x00000000); + ds_wr4(sc, YDSXGR_MAPOFEFFECT, 0x00000000); + ds_wr4(sc, YDSXGR_PLAYCTRLBASE, 0x00000000); + ds_wr4(sc, YDSXGR_RECCTRLBASE, 0x00000000); + ds_wr4(sc, YDSXGR_EFFCTRLBASE, 0x00000000); + ds_wr2(sc, YDSXGR_GLOBALCTRL, 0); bus_dmamap_unload(sc->control_dmat, sc->map); bus_dmamem_free(sc->control_dmat, sc->regbase, sc->map); @@ -919,6 +905,24 @@ return -1; } +static void +ds_destroy(device_t dev, struct sc_info *sc) +{ + if (!sc) + return; + + if (sc->ih) + bus_teardown_intr(dev, sc->res[RES_IRQ], sc->ih); + bus_release_resources(dev, ds_res_spec, sc->res); + if (sc->buffer_dmat) + bus_dma_tag_destroy(sc->buffer_dmat); + if (sc->control_dmat) + bus_dma_tag_destroy(sc->control_dmat); + if (sc->lock) + snd_mtxfree(sc->lock); + free(sc, M_DEVBUF); +} + static int ds_pci_probe(device_t dev) { @@ -937,7 +941,6 @@ static int ds_pci_attach(device_t dev) { - u_int32_t data; u_int32_t subdev, i; struct sc_info *sc; struct ac97_info *codec = NULL; @@ -950,22 +953,14 @@ sc->type = ds_finddev(pci_get_devid(dev), subdev); sc->rev = pci_get_revid(dev); - data = pci_read_config(dev, PCIR_COMMAND, 2); - data |= (PCIM_CMD_PORTEN|PCIM_CMD_MEMEN|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_MEMORY); - sc->regid = PCIR_BAR(0); - sc->reg = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->regid, - RF_ACTIVE); - if (!sc->reg) { - device_printf(dev, "unable to map register space\n"); + if (bus_alloc_resources(dev, ds_res_spec, sc->res) != 0) { + device_printf(dev, "unable to allocate resources\n"); goto bad; - } + } - sc->st = rman_get_bustag(sc->reg); - sc->sh = rman_get_bushandle(sc->reg); - sc->bufsz = pcm_getbuffersize(dev, 4096, DS1_BUFFSIZE, 65536); if (bus_dma_tag_create(/*parent*/bus_get_dma_tag(dev), /*alignment*/2, @@ -1002,16 +997,16 @@ } mixer_init(dev, ac97_getmixerclass(), codec); - 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, ds_intr, sc, &sc->ih)) { + if (snd_setup_intr(dev, sc->res[RES_IRQ], INTR_MPSAFE, + ds_intr, sc, &sc->ih)) { device_printf(dev, "unable to map interrupt\n"); goto bad; } snprintf(status, SND_STATUSLEN, "at memory 0x%lx irq %ld %s", - rman_get_start(sc->reg), rman_get_start(sc->irq),PCM_KLDSTRING(snd_ds1)); + rman_get_start(sc->res[RES_MEM]), + rman_get_start(sc->res[RES_IRQ]), + PCM_KLDSTRING(snd_ds1)); if (pcm_register(dev, sc, DS1_CHANS, 2)) goto bad; @@ -1026,19 +1021,8 @@ bad: if (codec) ac97_destroy(codec); - if (sc->reg) - bus_release_resource(dev, SYS_RES_MEMORY, sc->regid, sc->reg); - 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->buffer_dmat) - bus_dma_tag_destroy(sc->buffer_dmat); - if (sc->control_dmat) - bus_dma_tag_destroy(sc->control_dmat); - if (sc->lock) - snd_mtxfree(sc->lock); - free(sc, M_DEVBUF); + ds_destroy(dev, sc); + return ENXIO; } @@ -1072,13 +1056,8 @@ sc = pcm_getdevinfo(dev); ds_uninit(sc); - bus_release_resource(dev, SYS_RES_MEMORY, sc->regid, sc->reg); - bus_teardown_intr(dev, sc->irq, sc->ih); - bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irq); - bus_dma_tag_destroy(sc->buffer_dmat); - bus_dma_tag_destroy(sc->control_dmat); - snd_mtxfree(sc->lock); - free(sc, M_DEVBUF); + ds_destroy(dev, sc); + return 0; }