summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2020-10-18 17:00:04 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2020-10-18 17:00:04 +0200
commit30417c12fdedc608f75eeba0d18454d6d81833a3 (patch)
tree8625cf3f1ded6623d94efb27a0f305faa35e41c0
parent83efe2f157743feb3f5b6bbb1e34ee56ab3a6dad (diff)
downloadplan9front-30417c12fdedc608f75eeba0d18454d6d81833a3.tar.xz
audiohda: use PCIWADDR() instead of PADDR(), handle 64-bit dma addresses
-rw-r--r--sys/src/9/pc/audiohda.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/sys/src/9/pc/audiohda.c b/sys/src/9/pc/audiohda.c
index f04ad11ee..56bb06ec8 100644
--- a/sys/src/9/pc/audiohda.c
+++ b/sys/src/9/pc/audiohda.c
@@ -1164,6 +1164,7 @@ writering(Ring *r, uchar *p, long n)
static int
streamalloc(Ctlr *ctlr, Stream *s, int num)
{
+ u64int pa;
Ring *r;
int i;
@@ -1175,8 +1176,9 @@ streamalloc(Ctlr *ctlr, Stream *s, int num)
return -1;
}
for(i=0; i<Nblocks; i++){
- s->blds[i].addrlo = PADDR(r->buf) + i*Blocksize;
- s->blds[i].addrhi = 0;
+ pa = PCIWADDR(r->buf) + i*Blocksize;
+ s->blds[i].addrlo = pa;
+ s->blds[i].addrhi = pa >> 32;
s->blds[i].len = Blocksize;
s->blds[i].flags = 0x01; /* interrupt on completion */
}
@@ -1205,8 +1207,9 @@ streamalloc(Ctlr *ctlr, Stream *s, int num)
csr16(ctlr, Sdfmt+s->sdctl) = s->afmt;
/* program stream DMA & parms */
- csr32(ctlr, Sdbdplo+s->sdctl) = PADDR(s->blds);
- csr32(ctlr, Sdbdphi+s->sdctl) = 0;
+ pa = PCIWADDR(s->blds);
+ csr32(ctlr, Sdbdplo+s->sdctl) = pa;
+ csr32(ctlr, Sdbdphi+s->sdctl) = pa >> 32;
csr32(ctlr, Sdcbl+s->sdctl) = r->nbuf;
csr16(ctlr, Sdlvi+s->sdctl) = (Nblocks - 1) & 0xff;
@@ -1661,6 +1664,7 @@ hdastart(Ctlr *ctlr)
{
static int cmdbufsize[] = { 2, 16, 256, 2048 };
int n, size;
+ u64int pa;
uint cap;
/* reset controller */
@@ -1712,8 +1716,9 @@ hdastart(Ctlr *ctlr)
csr8(ctlr, Rirbsts) = csr8(ctlr, Rirbsts);
/* setup CORB */
- csr32(ctlr, Corblbase) = PADDR(ctlr->corb);
- csr32(ctlr, Corbubase) = 0;
+ pa = PCIWADDR(ctlr->corb);
+ csr32(ctlr, Corblbase) = pa;
+ csr32(ctlr, Corbubase) = pa >> 32;
csr16(ctlr, Corbwp) = 0;
csr16(ctlr, Corbrp) = Corbptrrst;
waitup16(ctlr, Corbrp, Corbptrrst, Corbptrrst);
@@ -1723,8 +1728,9 @@ hdastart(Ctlr *ctlr)
waitup8(ctlr, Corbctl, Corbdma, Corbdma);
/* setup RIRB */
- csr32(ctlr, Rirblbase) = PADDR(ctlr->rirb);
- csr32(ctlr, Rirbubase) = 0;
+ pa = PCIWADDR(ctlr->rirb);
+ csr32(ctlr, Rirblbase) = pa;
+ csr32(ctlr, Rirbubase) = pa >> 32;
csr16(ctlr, Rirbwp) = Rirbptrrst;
csr8(ctlr, Rirbctl) = Rirbdma;
waitup8(ctlr, Rirbctl, Rirbdma, Rirbdma);