summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authorcognet <cognet@FreeBSD.org>2003-02-20 17:31:12 +0000
committercognet <cognet@FreeBSD.org>2003-02-20 17:31:12 +0000
commit25a2aa22f19c732e8551e7ad32190bf14add4562 (patch)
tree754946b164b23a1f5dc38394662ee5a04598b6a7 /sys/dev
parent22cf3256d9e0c5f63427ab60eb09a6f768660c18 (diff)
downloadFreeBSD-src-25a2aa22f19c732e8551e7ad32190bf14add4562.zip
FreeBSD-src-25a2aa22f19c732e8551e7ad32190bf14add4562.tar.gz
Implement a "sndbuf_getbufaddr" function and use it instead of vtophys().
Reviewed by: orion
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/sound/pci/als4000.c4
-rw-r--r--sys/dev/sound/pci/aureal.c2
-rw-r--r--sys/dev/sound/pci/cmi.c2
-rw-r--r--sys/dev/sound/pci/cs4281.c2
-rw-r--r--sys/dev/sound/pci/csapcm.c8
-rw-r--r--sys/dev/sound/pci/ds1.c22
-rw-r--r--sys/dev/sound/pci/emu10k1.c42
-rw-r--r--sys/dev/sound/pci/es137x.c4
-rw-r--r--sys/dev/sound/pci/fm801.c2
-rw-r--r--sys/dev/sound/pci/ich.c15
-rw-r--r--sys/dev/sound/pci/maestro3.c8
-rw-r--r--sys/dev/sound/pci/solo.c2
-rw-r--r--sys/dev/sound/pci/t4dwave.c6
-rw-r--r--sys/dev/sound/pci/via8233.c13
-rw-r--r--sys/dev/sound/pci/via82c686.c18
-rw-r--r--sys/dev/sound/pci/vibes.c4
-rw-r--r--sys/dev/sound/pcm/buffer.c8
-rw-r--r--sys/dev/sound/pcm/buffer.h3
18 files changed, 100 insertions, 65 deletions
diff --git a/sys/dev/sound/pci/als4000.c b/sys/dev/sound/pci/als4000.c
index 517bf7e..3007736 100644
--- a/sys/dev/sound/pci/als4000.c
+++ b/sys/dev/sound/pci/als4000.c
@@ -334,7 +334,7 @@ als_playback_start(struct sc_chinfo *ch)
struct sc_info *sc = ch->parent;
u_int32_t buf, bufsz, count, dma_prog;
- buf = vtophys(sndbuf_getbuf(ch->buffer));
+ buf = sndbuf_getbufaddr(ch->buffer);
bufsz = sndbuf_getsize(ch->buffer);
count = bufsz / 2;
if (ch->format & AFMT_16BIT)
@@ -428,7 +428,7 @@ als_capture_start(struct sc_chinfo *ch)
struct sc_info *sc = ch->parent;
u_int32_t buf, bufsz, count, dma_prog;
- buf = vtophys(sndbuf_getbuf(ch->buffer));
+ buf = sndbuf_getbufaddr(ch->buffer);
bufsz = sndbuf_getsize(ch->buffer);
count = bufsz / 2;
if (ch->format & AFMT_16BIT)
diff --git a/sys/dev/sound/pci/aureal.c b/sys/dev/sound/pci/aureal.c
index 96c2c66..d301fd8 100644
--- a/sys/dev/sound/pci/aureal.c
+++ b/sys/dev/sound/pci/aureal.c
@@ -243,7 +243,7 @@ au_prepareoutput(struct au_chinfo *ch, u_int32_t format)
{
struct au_info *au = ch->parent;
int i, stereo = (format & AFMT_STEREO)? 1 : 0;
- u_int32_t baseaddr = vtophys(sndbuf_getbuf(ch->buffer));
+ u_int32_t baseaddr = sndbuf_getbufaddr(ch->buffer);
au_wr(au, 0, 0x1061c, 0, 4);
au_wr(au, 0, 0x10620, 0, 4);
diff --git a/sys/dev/sound/pci/cmi.c b/sys/dev/sound/pci/cmi.c
index 866d984..14c6c8e 100644
--- a/sys/dev/sound/pci/cmi.c
+++ b/sys/dev/sound/pci/cmi.c
@@ -239,7 +239,7 @@ cmi_dma_prog(struct sc_info *sc, struct sc_chinfo *ch, u_int32_t base)
{
u_int32_t s, i, sz;
- ch->phys_buf = vtophys(sndbuf_getbuf(ch->buffer));
+ ch->phys_buf = sndbuf_getbufaddr(ch->buffer);
cmi_wr(sc, base, ch->phys_buf, 4);
sz = (u_int32_t)sndbuf_getsize(ch->buffer);
diff --git a/sys/dev/sound/pci/cs4281.c b/sys/dev/sound/pci/cs4281.c
index 6018ec2..a700394 100644
--- a/sys/dev/sound/pci/cs4281.c
+++ b/sys/dev/sound/pci/cs4281.c
@@ -487,7 +487,7 @@ adcdac_prog(struct sc_chinfo *ch)
if (!ch->dma_setup) {
go = adcdac_go(ch, 0);
cs4281_wr(sc, CS4281PCI_DBA(ch->dma_chan),
- vtophys(sndbuf_getbuf(ch->buffer)));
+ sndbuf_getbufaddr(ch->buffer));
cs4281_wr(sc, CS4281PCI_DBC(ch->dma_chan),
sndbuf_getsize(ch->buffer) / ch->bps - 1);
ch->dma_setup = 1;
diff --git a/sys/dev/sound/pci/csapcm.c b/sys/dev/sound/pci/csapcm.c
index d0b30ce..b445e48 100644
--- a/sys/dev/sound/pci/csapcm.c
+++ b/sys/dev/sound/pci/csapcm.c
@@ -463,7 +463,7 @@ csa_setupchan(struct csa_chinfo *ch)
if (ch->dir == PCMDIR_PLAY) {
/* direction */
- csa_writemem(resp, BA1_PBA, vtophys(sndbuf_getbuf(ch->buffer)));
+ csa_writemem(resp, BA1_PBA, sndbuf_getbufaddr(ch->buffer));
/* format */
csa->pfie = csa_readmem(resp, BA1_PFIE) & ~0x0000f03f;
@@ -492,7 +492,7 @@ csa_setupchan(struct csa_chinfo *ch)
csa_setplaysamplerate(resp, ch->spd);
} else if (ch->dir == PCMDIR_REC) {
/* direction */
- csa_writemem(resp, BA1_CBA, vtophys(sndbuf_getbuf(ch->buffer)));
+ csa_writemem(resp, BA1_CBA, sndbuf_getbufaddr(ch->buffer));
/* format */
csa_writemem(resp, BA1_CIE, (csa_readmem(resp, BA1_CIE) & ~0x0000003f) | 0x00000001);
@@ -581,11 +581,11 @@ csachan_getptr(kobj_t obj, void *data)
resp = &csa->res;
if (ch->dir == PCMDIR_PLAY) {
- ptr = csa_readmem(resp, BA1_PBA) - vtophys(sndbuf_getbuf(ch->buffer));
+ ptr = csa_readmem(resp, BA1_PBA) - sndbuf_getbufaddr(ch->buffer);
if ((ch->fmt & AFMT_U8) != 0 || (ch->fmt & AFMT_S8) != 0)
ptr >>= 1;
} else {
- ptr = csa_readmem(resp, BA1_CBA) - vtophys(sndbuf_getbuf(ch->buffer));
+ ptr = csa_readmem(resp, BA1_CBA) - sndbuf_getbufaddr(ch->buffer);
if ((ch->fmt & AFMT_U8) != 0 || (ch->fmt & AFMT_S8) != 0)
ptr >>= 1;
}
diff --git a/sys/dev/sound/pci/ds1.c b/sys/dev/sound/pci/ds1.c
index 896a8af..0f3b3db 100644
--- a/sys/dev/sound/pci/ds1.c
+++ b/sys/dev/sound/pci/ds1.c
@@ -361,7 +361,7 @@ ds_allocpslot(struct sc_info *sc)
}
static int
-ds_initpbank(volatile struct pbank *pb, int ch, int b16, int stereo, u_int32_t rate, void *base, u_int32_t len)
+ds_initpbank(volatile struct pbank *pb, int ch, int b16, int stereo, u_int32_t rate, bus_addr_t base, u_int32_t len)
{
u_int32_t lv[] = {1, 1, 0, 0, 0};
u_int32_t rv[] = {1, 0, 1, 0, 0};
@@ -396,7 +396,7 @@ ds_initpbank(volatile struct pbank *pb, int ch, int b16, int stereo, u_int32_t r
pb->Format |= b16? 0 : 0x80000000;
pb->Format |= (stereo && (ch == 2 || ch == 4))? 0x00000001 : 0;
pb->LoopDefault = 0;
- pb->PgBase = base? vtophys(base) : 0;
+ pb->PgBase = base? base : 0;
pb->PgLoop = 0;
pb->PgLoopEnd = len >> ss;
pb->PgLoopFrac = 0;
@@ -430,18 +430,18 @@ static void
ds_setuppch(struct sc_pchinfo *ch)
{
int stereo, b16, c, sz;
- void *buf;
+ bus_addr_t addr;
stereo = (ch->fmt & AFMT_STEREO)? 1 : 0;
b16 = (ch->fmt & AFMT_16BIT)? 1 : 0;
c = stereo? 1 : 0;
- buf = sndbuf_getbuf(ch->buffer);
+ addr = sndbuf_getbufaddr(ch->buffer);
sz = sndbuf_getsize(ch->buffer);
- ds_initpbank(ch->lslot, c, stereo, b16, ch->spd, buf, sz);
- ds_initpbank(ch->lslot + 1, c, stereo, b16, ch->spd, buf, sz);
- ds_initpbank(ch->rslot, 2, stereo, b16, ch->spd, buf, sz);
- ds_initpbank(ch->rslot + 1, 2, stereo, b16, ch->spd, buf, sz);
+ ds_initpbank(ch->lslot, c, stereo, b16, ch->spd, addr, sz);
+ ds_initpbank(ch->lslot + 1, c, stereo, b16, ch->spd, addr, sz);
+ ds_initpbank(ch->rslot, 2, stereo, b16, ch->spd, addr, sz);
+ ds_initpbank(ch->rslot + 1, 2, stereo, b16, ch->spd, addr, sz);
}
static void
@@ -450,16 +450,16 @@ ds_setuprch(struct sc_rchinfo *ch)
struct sc_info *sc = ch->parent;
int stereo, b16, i, sz, pri;
u_int32_t x, y;
- void *buf;
+ bus_addr_t addr;
stereo = (ch->fmt & AFMT_STEREO)? 1 : 0;
b16 = (ch->fmt & AFMT_16BIT)? 1 : 0;
- buf = sndbuf_getbuf(ch->buffer);
+ addr = sndbuf_getbufaddr(ch->buffer);
sz = sndbuf_getsize(ch->buffer);
pri = (ch->num == DS1_RECPRIMARY)? 1 : 0;
for (i = 0; i < 2; i++) {
- ch->slot[i].PgBase = vtophys(buf);
+ ch->slot[i].PgBase = addr;
ch->slot[i].PgLoopEnd = sz;
ch->slot[i].PgStart = 0;
ch->slot[i].NumOfLoops = 0;
diff --git a/sys/dev/sound/pci/emu10k1.c b/sys/dev/sound/pci/emu10k1.c
index e9c99cb..edfdb1d 100644
--- a/sys/dev/sound/pci/emu10k1.c
+++ b/sys/dev/sound/pci/emu10k1.c
@@ -45,6 +45,7 @@ SND_DECLARE_FILE("$FreeBSD$");
struct emu_memblk {
SLIST_ENTRY(emu_memblk) link;
void *buf;
+ bus_addr_t buf_addr;
u_int32_t pte_start, pte_size;
};
@@ -52,6 +53,8 @@ struct emu_mem {
u_int8_t bmap[MAXPAGES / 8];
u_int32_t *ptb_pages;
void *silent_page;
+ bus_addr_t silent_page_addr;
+ bus_addr_t ptb_pages_addr;
SLIST_HEAD(, emu_memblk) blocks;
};
@@ -116,8 +119,8 @@ struct sc_info {
/* stuff */
static int emu_init(struct sc_info *);
static void emu_intr(void *);
-static void *emu_malloc(struct sc_info *sc, u_int32_t sz);
-static void *emu_memalloc(struct sc_info *sc, u_int32_t sz);
+static void *emu_malloc(struct sc_info *sc, u_int32_t sz, bus_addr_t *addr);
+static void *emu_memalloc(struct sc_info *sc, u_int32_t sz, bus_addr_t *addr);
static int emu_memfree(struct sc_info *sc, void *buf);
static int emu_memstart(struct sc_info *sc, void *buf);
#ifdef EMUDEBUG
@@ -426,8 +429,9 @@ emu_vinit(struct sc_info *sc, struct emu_voice *m, struct emu_voice *s,
u_int32_t sz, struct snd_dbuf *b)
{
void *buf;
+ bus_addr_t tmp_addr;
- buf = emu_memalloc(sc, sz);
+ buf = emu_memalloc(sc, sz, &tmp_addr);
if (buf == NULL)
return -1;
if (b != NULL)
@@ -441,7 +445,7 @@ emu_vinit(struct sc_info *sc, struct emu_voice *m, struct emu_voice *s,
m->running = 0;
m->ismaster = 1;
m->vol = 0xff;
- m->buf = vtophys(buf);
+ m->buf = tmp_addr;
m->slave = s;
if (s != NULL) {
s->start = m->start;
@@ -512,7 +516,7 @@ emu_vwrite(struct sc_info *sc, struct emu_voice *v)
emu_wrptr(sc, v->vnum, Z1, 0);
emu_wrptr(sc, v->vnum, Z2, 0);
- silent_page = ((u_int32_t)vtophys(sc->mem.silent_page) << 1) | MAP_PTI_MASK;
+ silent_page = ((u_int32_t)(sc->mem.silent_page_addr) << 1) | MAP_PTI_MASK;
emu_wrptr(sc, v->vnum, MAPA, silent_page);
emu_wrptr(sc, v->vnum, MAPB, silent_page);
@@ -799,7 +803,7 @@ emurchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel
return NULL;
else {
snd_mtxlock(sc->lock);
- emu_wrptr(sc, 0, ch->basereg, vtophys(sndbuf_getbuf(ch->buffer)));
+ emu_wrptr(sc, 0, ch->basereg, sndbuf_getbufaddr(ch->buffer));
emu_wrptr(sc, 0, ch->sizereg, 0); /* off */
snd_mtxunlock(sc->lock);
return ch;
@@ -1030,15 +1034,16 @@ emu_setmap(void *arg, bus_dma_segment_t *segs, int nseg, int error)
}
static void *
-emu_malloc(struct sc_info *sc, u_int32_t sz)
+emu_malloc(struct sc_info *sc, u_int32_t sz, bus_addr_t *addr)
{
- void *buf, *phys = 0;
+ void *buf;
bus_dmamap_t map;
+ *addr = 0;
if (bus_dmamem_alloc(sc->parent_dmat, &buf, BUS_DMA_NOWAIT, &map))
return NULL;
- if (bus_dmamap_load(sc->parent_dmat, map, buf, sz, emu_setmap, &phys, 0)
- || !phys)
+ if (bus_dmamap_load(sc->parent_dmat, map, buf, sz, emu_setmap, addr, 0)
+ || !addr)
return NULL;
return buf;
}
@@ -1050,7 +1055,7 @@ emu_free(struct sc_info *sc, void *buf)
}
static void *
-emu_memalloc(struct sc_info *sc, u_int32_t sz)
+emu_memalloc(struct sc_info *sc, u_int32_t sz, bus_addr_t *addr)
{
u_int32_t blksz, start, idx, ofs, tmp, found;
struct emu_mem *mem = &sc->mem;
@@ -1076,7 +1081,8 @@ emu_memalloc(struct sc_info *sc, u_int32_t sz)
blk = malloc(sizeof(*blk), M_DEVBUF, M_NOWAIT);
if (blk == NULL)
return NULL;
- buf = emu_malloc(sc, sz);
+ buf = emu_malloc(sc, sz, &blk->buf_addr);
+ *addr = blk->buf_addr;
if (buf == NULL) {
free(blk, M_DEVBUF);
return NULL;
@@ -1088,7 +1094,7 @@ emu_memalloc(struct sc_info *sc, u_int32_t sz)
ofs = 0;
for (idx = start; idx < start + blksz; idx++) {
mem->bmap[idx >> 3] |= 1 << (idx & 7);
- tmp = (u_int32_t)vtophys((u_int8_t *)buf + ofs);
+ tmp = (u_int32_t)((u_int8_t *)&blk->buf_addr + ofs);
/* printf("pte[%d] -> %x phys, %x virt\n", idx, tmp, ((u_int32_t)buf) + ofs); */
mem->ptb_pages[idx] = (tmp << 1) | idx;
ofs += EMUPAGESIZE;
@@ -1113,7 +1119,7 @@ emu_memfree(struct sc_info *sc, void *buf)
return EINVAL;
SLIST_REMOVE(&mem->blocks, blk, emu_memblk, link);
emu_free(sc, buf);
- tmp = (u_int32_t)vtophys(sc->mem.silent_page) << 1;
+ tmp = (u_int32_t)(sc->mem.silent_page_addr) << 1;
for (idx = blk->pte_start; idx < blk->pte_start + blk->pte_size; idx++) {
mem->bmap[idx >> 3] &= ~(1 << (idx & 7));
mem->ptb_pages[idx] = tmp | idx;
@@ -1326,22 +1332,22 @@ emu_init(struct sc_info *sc)
emu_initefx(sc);
SLIST_INIT(&sc->mem.blocks);
- sc->mem.ptb_pages = emu_malloc(sc, MAXPAGES * sizeof(u_int32_t));
+ sc->mem.ptb_pages = emu_malloc(sc, MAXPAGES * sizeof(u_int32_t), &sc->mem.ptb_pages_addr);
if (sc->mem.ptb_pages == NULL)
return -1;
- sc->mem.silent_page = emu_malloc(sc, EMUPAGESIZE);
+ sc->mem.silent_page = emu_malloc(sc, EMUPAGESIZE, &sc->mem.silent_page_addr);
if (sc->mem.silent_page == NULL) {
emu_free(sc, sc->mem.ptb_pages);
return -1;
}
/* Clear page with silence & setup all pointers to this page */
bzero(sc->mem.silent_page, EMUPAGESIZE);
- tmp = (u_int32_t)vtophys(sc->mem.silent_page) << 1;
+ tmp = (u_int32_t)(sc->mem.silent_page_addr) << 1;
for (i = 0; i < MAXPAGES; i++)
sc->mem.ptb_pages[i] = tmp | i;
- emu_wrptr(sc, 0, PTB, vtophys(sc->mem.ptb_pages));
+ emu_wrptr(sc, 0, PTB, (sc->mem.ptb_pages_addr));
emu_wrptr(sc, 0, TCB, 0); /* taken from original driver */
emu_wrptr(sc, 0, TCBS, 0); /* taken from original driver */
diff --git a/sys/dev/sound/pci/es137x.c b/sys/dev/sound/pci/es137x.c
index ff4cce2..f864b4a 100644
--- a/sys/dev/sound/pci/es137x.c
+++ b/sys/dev/sound/pci/es137x.c
@@ -283,11 +283,11 @@ eschan_setdir(kobj_t obj, void *data, int dir)
if (dir == PCMDIR_PLAY) {
bus_space_write_1(es->st, es->sh, ES1370_REG_MEMPAGE, ES1370_REG_DAC2_FRAMEADR >> 8);
- bus_space_write_4(es->st, es->sh, ES1370_REG_DAC2_FRAMEADR & 0xff, vtophys(sndbuf_getbuf(ch->buffer)));
+ bus_space_write_4(es->st, es->sh, ES1370_REG_DAC2_FRAMEADR & 0xff, sndbuf_getbufaddr(ch->buffer));
bus_space_write_4(es->st, es->sh, ES1370_REG_DAC2_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1);
} else {
bus_space_write_1(es->st, es->sh, ES1370_REG_MEMPAGE, ES1370_REG_ADC_FRAMEADR >> 8);
- bus_space_write_4(es->st, es->sh, ES1370_REG_ADC_FRAMEADR & 0xff, vtophys(sndbuf_getbuf(ch->buffer)));
+ bus_space_write_4(es->st, es->sh, ES1370_REG_ADC_FRAMEADR & 0xff, sndbuf_getbufaddr(ch->buffer));
bus_space_write_4(es->st, es->sh, ES1370_REG_ADC_FRAMECNT & 0xff, (ch->bufsz >> 2) - 1);
}
ch->dir = dir;
diff --git a/sys/dev/sound/pci/fm801.c b/sys/dev/sound/pci/fm801.c
index 0b07539..c42da08 100644
--- a/sys/dev/sound/pci/fm801.c
+++ b/sys/dev/sound/pci/fm801.c
@@ -436,7 +436,7 @@ fm801ch_trigger(kobj_t obj, void *data, int go)
{
struct fm801_chinfo *ch = data;
struct fm801_info *fm801 = ch->parent;
- u_int32_t baseaddr = vtophys(sndbuf_getbuf(ch->buffer));
+ u_int32_t baseaddr = sndbuf_getbufaddr(ch->buffer);
u_int32_t k1;
DPRINT("fm801ch_trigger go %d , ", go);
diff --git a/sys/dev/sound/pci/ich.c b/sys/dev/sound/pci/ich.c
index 6134c06..1adff85 100644
--- a/sys/dev/sound/pci/ich.c
+++ b/sys/dev/sound/pci/ich.c
@@ -65,6 +65,7 @@ struct sc_chinfo {
struct sc_info *parent;
struct ich_desc *dtbl;
+ bus_addr_t desc_addr;
};
/* device private data */
@@ -86,6 +87,7 @@ struct sc_info {
struct sc_chinfo ch[3];
int ac97rate;
struct ich_desc *dtbl;
+ bus_addr_t desc_addr;
struct intr_config_hook intrhook;
int use_intrhook;
};
@@ -188,7 +190,7 @@ ich_filldtbl(struct sc_chinfo *ch)
u_int32_t base;
int i;
- base = vtophys(sndbuf_getbuf(ch->buffer));
+ base = sndbuf_getbufaddr(ch->buffer);
ch->blkcnt = sndbuf_getsize(ch->buffer) / ch->blksz;
if (ch->blkcnt != 2 && ch->blkcnt != 4 && ch->blkcnt != 8 && ch->blkcnt != 16 && ch->blkcnt != 32) {
ch->blkcnt = 2;
@@ -247,6 +249,7 @@ ichchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *
ch->parent = sc;
ch->run = 0;
ch->dtbl = sc->dtbl + (ch->num * ICH_DTBL_LENGTH);
+ ch->desc_addr = sc->desc_addr + (ch->num * ICH_DTBL_LENGTH);
ch->blkcnt = 2;
ch->blksz = sc->bufsz / ch->blkcnt;
@@ -279,7 +282,7 @@ ichchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *
if (sndbuf_alloc(ch->buffer, sc->dmat, sc->bufsz))
return NULL;
- ich_wr(sc, ch->regbase + ICH_REG_X_BDBAR, (u_int32_t)vtophys(ch->dtbl), 4);
+ ich_wr(sc, ch->regbase + ICH_REG_X_BDBAR, (u_int32_t)(ch->desc_addr), 4);
return ch;
}
@@ -335,7 +338,7 @@ ichchan_trigger(kobj_t obj, void *data, int go)
switch (go) {
case PCMTRIG_START:
ch->run = 1;
- ich_wr(sc, ch->regbase + ICH_REG_X_BDBAR, (u_int32_t)vtophys(ch->dtbl), 4);
+ ich_wr(sc, ch->regbase + ICH_REG_X_BDBAR, (u_int32_t)(ch->desc_addr), 4);
ich_wr(sc, ch->regbase + ICH_REG_X_CR, ICH_X_CR_RPBM | ICH_X_CR_LVBIE | ICH_X_CR_IOCE, 1);
break;
@@ -499,7 +502,7 @@ void ich_calibrate(void *arg)
/* prepare */
ociv = ich_rd(sc, ch->regbase + ICH_REG_X_CIV, 1);
nciv = ociv;
- ich_wr(sc, ch->regbase + ICH_REG_X_BDBAR, (u_int32_t)vtophys(ch->dtbl), 4);
+ ich_wr(sc, ch->regbase + ICH_REG_X_BDBAR, (u_int32_t)(ch->desc_addr), 4);
/* start */
microtime(&t1);
@@ -553,6 +556,8 @@ void ich_calibrate(void *arg)
static void
ich_setmap(void *arg, bus_dma_segment_t *segs, int nseg, int error)
{
+ struct sc_info *sc = (struct sc_info *)arg;
+ sc->desc_addr = segs->ds_addr;
return;
}
@@ -584,7 +589,7 @@ ich_init(struct sc_info *sc)
return ENOSPC;
sz = sizeof(struct ich_desc) * ICH_DTBL_LENGTH * 3;
- if (bus_dmamap_load(sc->dmat, sc->dtmap, sc->dtbl, sz, ich_setmap, NULL, 0)) {
+ if (bus_dmamap_load(sc->dmat, sc->dtmap, sc->dtbl, sz, ich_setmap, sc, 0)) {
bus_dmamem_free(sc->dmat, (void **)&sc->dtbl, sc->dtmap);
return ENOSPC;
}
diff --git a/sys/dev/sound/pci/maestro3.c b/sys/dev/sound/pci/maestro3.c
index bee274a..ae679ca 100644
--- a/sys/dev/sound/pci/maestro3.c
+++ b/sys/dev/sound/pci/maestro3.c
@@ -390,7 +390,7 @@ m3_pchan_init(kobj_t kobj, void *devinfo, struct snd_dbuf *b, struct pcm_channel
ch->bufsize = sndbuf_getsize(ch->buffer);
/* host dma buffer pointers */
- bus_addr = vtophys(sndbuf_getbuf(ch->buffer));
+ bus_addr = sndbuf_getbufaddr(ch->buffer);
if (bus_addr & 3) {
device_printf(sc->dev, "m3_pchan_init unaligned bus_addr\n");
bus_addr = (bus_addr + 4) & ~3;
@@ -600,7 +600,7 @@ m3_pchan_getptr(kobj_t kobj, void *chdata)
struct sc_pchinfo *ch = chdata;
struct sc_info *sc = ch->parent;
u_int32_t hi, lo, bus_crnt;
- u_int32_t bus_base = vtophys(sndbuf_getbuf(ch->buffer));
+ u_int32_t bus_base = sndbuf_getbufaddr(ch->buffer);
hi = m3_rd_assp_data(sc, ch->dac_data + CDATA_HOST_SRC_CURRENTH);
lo = m3_rd_assp_data(sc, ch->dac_data + CDATA_HOST_SRC_CURRENTL);
@@ -670,7 +670,7 @@ m3_rchan_init(kobj_t kobj, void *devinfo, struct snd_dbuf *b, struct pcm_channel
ch->bufsize = sndbuf_getsize(ch->buffer);
/* host dma buffer pointers */
- bus_addr = vtophys(sndbuf_getbuf(ch->buffer));
+ bus_addr = sndbuf_getbufaddr(ch->buffer);
if (bus_addr & 3) {
device_printf(sc->dev, "m3_rchan_init unaligned bus_addr\n");
bus_addr = (bus_addr + 4) & ~3;
@@ -870,7 +870,7 @@ m3_rchan_getptr(kobj_t kobj, void *chdata)
struct sc_rchinfo *ch = chdata;
struct sc_info *sc = ch->parent;
u_int32_t hi, lo, bus_crnt;
- u_int32_t bus_base = vtophys(sndbuf_getbuf(ch->buffer));
+ u_int32_t bus_base = sndbuf_getbufaddr(ch->buffer);
hi = m3_rd_assp_data(sc, ch->adc_data + CDATA_HOST_SRC_CURRENTH);
lo = m3_rd_assp_data(sc, ch->adc_data + CDATA_HOST_SRC_CURRENTL);
diff --git a/sys/dev/sound/pci/solo.c b/sys/dev/sound/pci/solo.c
index 7c5e56e0..a077cca 100644
--- a/sys/dev/sound/pci/solo.c
+++ b/sys/dev/sound/pci/solo.c
@@ -572,7 +572,7 @@ esschan_trigger(kobj_t obj, void *data, int go)
switch (go) {
case PCMTRIG_START:
- ess_dmasetup(sc, ch->hwch, vtophys(sndbuf_getbuf(ch->buffer)), sndbuf_getsize(ch->buffer), ch->dir);
+ ess_dmasetup(sc, ch->hwch, sndbuf_getbufaddr(ch->buffer), sndbuf_getsize(ch->buffer), ch->dir);
ess_dmatrigger(sc, ch->hwch, 1);
ess_start(ch);
break;
diff --git a/sys/dev/sound/pci/t4dwave.c b/sys/dev/sound/pci/t4dwave.c
index 1e88667..cd7de77 100644
--- a/sys/dev/sound/pci/t4dwave.c
+++ b/sys/dev/sound/pci/t4dwave.c
@@ -531,7 +531,7 @@ trpchan_trigger(kobj_t obj, void *data, int go)
ch->fms = 0;
ch->ec = 0;
ch->alpha = 0;
- ch->lba = vtophys(sndbuf_getbuf(ch->buffer));
+ ch->lba = sndbuf_getbufaddr(ch->buffer);
ch->cso = 0;
ch->eso = (sndbuf_getsize(ch->buffer) / sndbuf_getbps(ch->buffer)) - 1;
ch->rvol = ch->cvol = 0x7f;
@@ -657,7 +657,7 @@ trrchan_trigger(kobj_t obj, void *data, int go)
i = tr_rd(tr, TR_REG_DMAR11, 1) & 0x03;
tr_wr(tr, TR_REG_DMAR11, i | 0x54, 1);
/* set up base address */
- tr_wr(tr, TR_REG_DMAR0, vtophys(sndbuf_getbuf(ch->buffer)), 4);
+ tr_wr(tr, TR_REG_DMAR0, sndbuf_getbufaddr(ch->buffer), 4);
/* set up buffer size */
i = tr_rd(tr, TR_REG_DMAR4, 4) & ~0x00ffffff;
tr_wr(tr, TR_REG_DMAR4, i | (sndbuf_runsz(ch->buffer) - 1), 4);
@@ -680,7 +680,7 @@ trrchan_getptr(kobj_t obj, void *data)
struct tr_info *tr = ch->parent;
/* return current byte offset of channel */
- return tr_rd(tr, TR_REG_DMAR0, 4) - vtophys(sndbuf_getbuf(ch->buffer));
+ return tr_rd(tr, TR_REG_DMAR0, 4) - sndbuf_getbufaddr(ch->buffer);
}
static struct pcmchan_caps *
diff --git a/sys/dev/sound/pci/via8233.c b/sys/dev/sound/pci/via8233.c
index 9f6dfc8..1af7caa 100644
--- a/sys/dev/sound/pci/via8233.c
+++ b/sys/dev/sound/pci/via8233.c
@@ -73,6 +73,7 @@ struct via_chinfo {
struct pcm_channel *channel;
struct snd_dbuf *buffer;
struct via_dma_op *sgd_table;
+ bus_addr_t sgd_addr;
int dir, blksz;
int rbase; /* base register for channel */
};
@@ -83,6 +84,7 @@ struct via_info {
bus_dma_tag_t parent_dmat;
bus_dma_tag_t sgd_dmat;
bus_dmamap_t sgd_dmamap;
+ bus_addr_t sgd_addr;
struct resource *reg, *irq;
int regid, irqid;
@@ -229,7 +231,7 @@ via_buildsgdt(struct via_chinfo *ch)
*/
seg_size = sndbuf_getsize(ch->buffer) / SEGS_PER_CHAN;
- phys_addr = vtophys(sndbuf_getbuf(ch->buffer));
+ phys_addr = sndbuf_getbufaddr(ch->buffer);
for (i = 0; i < SEGS_PER_CHAN; i++) {
flag = (i == SEGS_PER_CHAN - 1) ? VIA_DMAOP_EOL : VIA_DMAOP_FLAG;
@@ -360,6 +362,8 @@ via8233chan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
ch->buffer = b;
ch->dir = dir;
ch->sgd_table = &via->sgd_table[(dir == PCMDIR_PLAY)? 0 : SEGS_PER_CHAN];
+ ch->sgd_addr = dir == PCMDIR_PLAY ? via->sgd_addr :
+ via->sgd_addr * SEGS_PER_CHAN;
if (ch->dir == PCMDIR_PLAY) {
ch->rbase = VIA_MC_SGD_STATUS;
@@ -381,12 +385,11 @@ via8233chan_trigger(kobj_t obj, void* data, int go)
{
struct via_chinfo *ch = data;
struct via_info *via = ch->parent;
- struct via_dma_op *ado = ch->sgd_table;
switch(go) {
case PCMTRIG_START:
via_buildsgdt(ch);
- via_wr(via, ch->rbase + VIA_RP_TABLE_PTR, vtophys(ado), 4);
+ via_wr(via, ch->rbase + VIA_RP_TABLE_PTR, ch->sgd_addr, 4);
via_wr(via, ch->rbase + VIA_RP_CONTROL,
SGD_CONTROL_START | SGD_CONTROL_AUTOSTART |
SGD_CONTROL_I_EOL | SGD_CONTROL_I_FLAG, 1);
@@ -478,6 +481,8 @@ via_probe(device_t dev)
static void
dma_cb(void *p, bus_dma_segment_t *bds, int a, int b)
{
+ struct via_info *via = (struct via_info *)p;
+ via->sgd_addr = bds->ds_addr;
}
static int
@@ -580,7 +585,7 @@ via_attach(device_t dev)
BUS_DMA_NOWAIT, &via->sgd_dmamap) == -1)
goto bad;
if (bus_dmamap_load(via->sgd_dmat, via->sgd_dmamap, via->sgd_table,
- NSEGS * sizeof(struct via_dma_op), dma_cb, 0, 0))
+ NSEGS * sizeof(struct via_dma_op), dma_cb, via, 0))
goto bad;
if (via_chip_init(dev))
diff --git a/sys/dev/sound/pci/via82c686.c b/sys/dev/sound/pci/via82c686.c
index 5bd8c47..3638d39 100644
--- a/sys/dev/sound/pci/via82c686.c
+++ b/sys/dev/sound/pci/via82c686.c
@@ -63,6 +63,7 @@ struct via_chinfo {
struct pcm_channel *channel;
struct snd_dbuf *buffer;
struct via_dma_op *sgd_table;
+ bus_addr_t sgd_addr;
int dir, blksz;
int base, count, mode, ctrl;
};
@@ -73,6 +74,7 @@ struct via_info {
bus_dma_tag_t parent_dmat;
bus_dma_tag_t sgd_dmat;
bus_dmamap_t sgd_dmamap;
+ bus_addr_t sgd_addr;
struct resource *reg, *irq;
int regid, irqid;
@@ -224,7 +226,7 @@ via_buildsgdt(struct via_chinfo *ch)
*/
seg_size = ch->blksz;
segs = sndbuf_getsize(ch->buffer) / seg_size;
- phys_addr = vtophys(sndbuf_getbuf(ch->buffer));
+ phys_addr = sndbuf_getbufaddr(ch->buffer);
for (i = 0; i < segs; i++) {
flag = (i == segs - 1)? VIA_DMAOP_EOL : VIA_DMAOP_FLAG;
@@ -247,6 +249,8 @@ viachan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *
ch->buffer = b;
ch->dir = dir;
ch->sgd_table = &via->sgd_table[(dir == PCMDIR_PLAY)? 0 : SEGS_PER_CHAN];
+ ch->sgd_addr = dir == PCMDIR_PLAY ? via->sgd_addr : via->sgd_addr +
+ sizeof(struct via_dma_op) * SEGS_PER_CHAN;
if (ch->dir == PCMDIR_PLAY) {
ch->base = VIA_PLAY_DMAOPS_BASE;
ch->count = VIA_PLAY_DMAOPS_COUNT;
@@ -326,16 +330,17 @@ viachan_trigger(kobj_t obj, void *data, int go)
struct via_chinfo *ch = data;
struct via_info *via = ch->parent;
struct via_dma_op *ado;
+ bus_addr_t sgd_addr = ch->sgd_addr;
if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD)
return 0;
ado = ch->sgd_table;
- DEB(printf("ado located at va=%p pa=%x\n", ado, vtophys(ado)));
+ DEB(printf("ado located at va=%p pa=%x\n", ado, sgd_addr));
if (go == PCMTRIG_START) {
via_buildsgdt(ch);
- via_wr(via, ch->base, vtophys(ado), 4);
+ via_wr(via, ch->base, sgd_addr, 4);
via_wr(via, ch->ctrl, VIA_RPCTRL_START, 1);
} else
via_wr(via, ch->ctrl, VIA_RPCTRL_TERMINATE, 1);
@@ -350,6 +355,7 @@ viachan_getptr(kobj_t obj, void *data)
struct via_chinfo *ch = data;
struct via_info *via = ch->parent;
struct via_dma_op *ado;
+ bus_addr_t sgd_addr = ch->sgd_addr;
int ptr, base, base1, len, seg;
ado = ch->sgd_table;
@@ -364,7 +370,7 @@ viachan_getptr(kobj_t obj, void *data)
/* Base points to SGD segment to do, one past current */
/* Determine how many segments have been done */
- seg = (base - vtophys(ado)) / sizeof(struct via_dma_op);
+ seg = (base - sgd_addr) / sizeof(struct via_dma_op);
if (seg == 0)
seg = SEGS_PER_CHAN;
@@ -442,6 +448,8 @@ via_probe(device_t dev)
static void
dma_cb(void *p, bus_dma_segment_t *bds, int a, int b)
{
+ struct via_info *via = (struct via_info *)p;
+ via->sgd_addr = bds->ds_addr;
}
@@ -526,7 +534,7 @@ via_attach(device_t dev)
if (bus_dmamem_alloc(via->sgd_dmat, (void **)&via->sgd_table, BUS_DMA_NOWAIT, &via->sgd_dmamap) == -1)
goto bad;
- if (bus_dmamap_load(via->sgd_dmat, via->sgd_dmamap, via->sgd_table, NSEGS * sizeof(struct via_dma_op), dma_cb, 0, 0))
+ if (bus_dmamap_load(via->sgd_dmat, via->sgd_dmamap, via->sgd_table, NSEGS * sizeof(struct via_dma_op), dma_cb, via, 0))
goto bad;
snprintf(status, SND_STATUSLEN, "at io 0x%lx irq %ld", rman_get_start(via->reg), rman_get_start(via->irq));
diff --git a/sys/dev/sound/pci/vibes.c b/sys/dev/sound/pci/vibes.c
index e4232c0..7eb4955 100644
--- a/sys/dev/sound/pci/vibes.c
+++ b/sys/dev/sound/pci/vibes.c
@@ -324,7 +324,7 @@ svrchan_trigger(kobj_t obj, void *data, int go)
/* Program DMA */
count = sndbuf_getsize(ch->buffer) / 2; /* DMAC uses words */
sv_dma_set_config(sc->dmac_st, sc->dmac_sh,
- vtophys(sndbuf_getbuf(ch->buffer)),
+ sndbuf_getbufaddr(ch->buffer),
count - 1,
SV_DMA_MODE_AUTO | SV_DMA_MODE_RD);
count = count / SV_INTR_PER_BUFFER - 1;
@@ -399,7 +399,7 @@ svpchan_trigger(kobj_t obj, void *data, int go)
/* Program DMA */
count = sndbuf_getsize(ch->buffer);
sv_dma_set_config(sc->dmaa_st, sc->dmaa_sh,
- vtophys(sndbuf_getbuf(ch->buffer)),
+ sndbuf_getbufaddr(ch->buffer),
count - 1,
SV_DMA_MODE_AUTO | SV_DMA_MODE_WR);
count = count / SV_INTR_PER_BUFFER - 1;
diff --git a/sys/dev/sound/pcm/buffer.c b/sys/dev/sound/pcm/buffer.c
index a096b40..8ae35a3 100644
--- a/sys/dev/sound/pcm/buffer.c
+++ b/sys/dev/sound/pcm/buffer.c
@@ -48,6 +48,12 @@ sndbuf_destroy(struct snd_dbuf *b)
free(b, M_DEVBUF);
}
+bus_addr_t
+sndbuf_getbufaddr(struct snd_dbuf *buf)
+{
+ return (buf->buf_addr);
+}
+
static void
sndbuf_setmap(void *arg, bus_dma_segment_t *segs, int nseg, int error)
{
@@ -58,12 +64,14 @@ sndbuf_setmap(void *arg, bus_dma_segment_t *segs, int nseg, int error)
(unsigned long)segs->ds_len);
printf("%p -> %lx\n", b->buf, (unsigned long)vtophys(b->buf));
}
+ b->buf_addr = segs->ds_addr;
}
/*
* Allocate memory for DMA buffer. If the device does not use DMA transfers,
* the driver can call malloc(9) and sndbuf_setup() itself.
*/
+
int
sndbuf_alloc(struct snd_dbuf *b, bus_dma_tag_t dmatag, unsigned int size)
{
diff --git a/sys/dev/sound/pcm/buffer.h b/sys/dev/sound/pcm/buffer.h
index d25ceec..5a73898 100644
--- a/sys/dev/sound/pcm/buffer.h
+++ b/sys/dev/sound/pcm/buffer.h
@@ -51,6 +51,7 @@ struct snd_dbuf {
u_int32_t flags;
bus_dmamap_t dmamap;
bus_dma_tag_t dmatag;
+ u_int32_t buf_addr;
struct selinfo sel;
char name[SNDBUF_NAMELEN];
};
@@ -75,6 +76,8 @@ unsigned int sndbuf_getspd(struct snd_dbuf *b);
void sndbuf_setspd(struct snd_dbuf *b, unsigned int spd);
unsigned int sndbuf_getbps(struct snd_dbuf *b);
+bus_addr_t sndbuf_getbufaddr(struct snd_dbuf *buf);
+
void *sndbuf_getbuf(struct snd_dbuf *b);
void *sndbuf_getbufofs(struct snd_dbuf *b, unsigned int ofs);
unsigned int sndbuf_getsize(struct snd_dbuf *b);
OpenPOWER on IntegriCloud