--- /sys/src/9k/386/ether8139.c +++ /sys/src/9k/386/ether8139.c @@ -431,7 +431,7 @@ rtl8139init(Ether* edev) ctlr->rbstart = alloc; alloc += ctlr->rblen+16; memset(ctlr->rbstart, 0, ctlr->rblen+16); - csr32w(ctlr, Rbstart, PCIWADDR(ctlr->rbstart)); + csr32w(ctlr, Rbstart, PCIWADDR32(ctlr->rbstart)); ctlr->rcr = Rxfth256|Rblen|Mrxdmaunlimited|Ab|Am|Apm; /* @@ -514,12 +514,12 @@ rtl8139txstart(Ether* edev) if(!ALIGNED(bp->rp, 4)){ memmove(td->data, bp->rp, size); freeb(bp); - csr32w(ctlr, td->tsad, PCIWADDR(td->data)); + csr32w(ctlr, td->tsad, PCIWADDR32(td->data)); ctlr->tunaligned++; } else{ td->bp = bp; - csr32w(ctlr, td->tsad, PCIWADDR(bp->rp)); + csr32w(ctlr, td->tsad, PCIWADDR32(bp->rp)); ctlr->taligned++; } csr32w(ctlr, td->tsd, (ctlr->etxth<rbstart)); + csr32w(ctlr, Rbstart, PCIWADDR32(ctlr->rbstart)); csr8w(ctlr, Cr, cr); csr32w(ctlr, Rcr, ctlr->rcr); --- /sys/src/9k/386/ether8169.c +++ /sys/src/9k/386/ether8169.c @@ -514,8 +514,8 @@ rtl8169ifstat(Ether* edev, void* a, long n, ulong offset) dtcc = ctlr->dtcc; assert(dtcc); - csr32w(ctlr, Dtccr+4, 0); - csr32w(ctlr, Dtccr, PCIWADDR(dtcc)|Cmd); + csr32w(ctlr, Dtccr+4, PCIWADDRH(ctlr->dtcc)); + csr32w(ctlr, Dtccr, PCIWADDRL(ctlr->dtcc)|Cmd); for(timeo = 0; timeo < 1000; timeo++){ if(!(csr32r(ctlr, Dtccr) & Cmd)) break; @@ -645,8 +645,8 @@ rtl8169replenish(Ctlr* ctlr) break; } ctlr->rb[rdt] = bp; - d->addrlo = PCIWADDR(bp->rp); - d->addrhi = 0; + d->addrlo = PCIWADDRL(bp->rp); + d->addrhi = PCIWADDRH(bp->rp); coherence(); } else @@ -792,10 +792,10 @@ rtl8169init(Ether* edev) */ csr32w(ctlr, Mpc, 0); csr8w(ctlr, Etx, 0x3f); /* magic */ - csr32w(ctlr, Tnpds+4, 0); - csr32w(ctlr, Tnpds, PCIWADDR(ctlr->td)); - csr32w(ctlr, Rdsar+4, 0); - csr32w(ctlr, Rdsar, PCIWADDR(ctlr->rd)); + csr32w(ctlr, Tnpds+4, PCIWADDRH(ctlr->td)); + csr32w(ctlr, Tnpds, PCIWADDRL(ctlr->td)); + csr32w(ctlr, Rdsar+4, PCIWADDRH(ctlr->rd)); + csr32w(ctlr, Rdsar, PCIWADDRL(ctlr->rd)); csr16w(ctlr, Rms, 16383); /* was Mps; see above comment */ r = csr16r(ctlr, Mulint) & 0xF000; /* no early rx interrupts */ csr16w(ctlr, Mulint, r); @@ -959,8 +959,8 @@ rtl8169transmit(Ether* edev) break; d = &ctlr->td[x]; - d->addrlo = PCIWADDR(bp->rp); - d->addrhi = 0; + d->addrlo = PCIWADDRL(bp->rp); + d->addrhi = PCIWADDRH(bp->rp); ctlr->tb[x] = bp; coherence(); d->control |= Own|Fs|Ls|((BLEN(bp)<tdba)); - csr32w(ctlr, Tdbah, 0); + csr32w(ctlr, Tdbal, PCIWADDRL(ctlr->tdba)); + csr32w(ctlr, Tdbah, PCIWADDRH(ctlr->tdba)); csr32w(ctlr, Tdlen, ctlr->ntd * sizeof(Td)); ctlr->tdh = PREV(0, ctlr->ntd); csr32w(ctlr, Tdh, 0); @@ -930,7 +930,8 @@ i82563transmit(Ether* edev) if((bp = qget(edev->oq)) == nil) break; td = &ctlr->tdba[tdt]; - td->addr[0] = PCIWADDR(bp->rp); + td->addr[0] = PCIWADDRL(bp->rp); + td->addr[1] = PCIWADDRH(bp->rp); td->control = Ide|Rs|Ifcs|Teop|BLEN(bp); ctlr->tb[tdt] = bp; /* note size of queue of tds awaiting transmission */ @@ -969,8 +970,8 @@ i82563replenish(Ctlr* ctlr) panic("#l%d: 82563: all %d rx buffers in use, nrbfull %d", ctlr->edev->ctlrno, ctlr->nrb, nrbfull); ctlr->rb[rdt] = bp; - rd->addr[0] = PCIWADDR(bp->rp); -// rd->addr[1] = 0; + rd->addr[0] = PCIWADDRL(bp->rp); + rd->addr[1] = PCIWADDRH(bp->rp); rd->status = 0; ctlr->rdfree++; rdt = Next(rdt, m); @@ -1016,8 +1017,8 @@ i82563rxinit(Ctlr* ctlr) if(ctlr->type == i82566 || ctlr->type == i82567) csr32w(ctlr, Pbs, 16); - csr32w(ctlr, Rdbal, PCIWADDR(ctlr->rdba)); - csr32w(ctlr, Rdbah, 0); + csr32w(ctlr, Rdbal, PCIWADDRL(ctlr->rdba)); + csr32w(ctlr, Rdbah, PCIWADDRH(ctlr->rdba)); csr32w(ctlr, Rdlen, ctlr->nrd * sizeof(Rd)); ctlr->rdh = 0; csr32w(ctlr, Rdh, 0); --- /sys/src/9k/386/ether82598.c +++ /sys/src/9k/386/ether82598.c @@ -591,7 +591,8 @@ transmit(Ether *e) break; assert(ctlr->tdba != nil); t = ctlr->tdba + tdt; - t->addr[0] = PCIWADDR(b->rp); + t->addr[0] = PCIWADDRL(b->rp); + t->addr[1] = PCIWADDRH(b->rp); t->length = BLEN(b); t->cmd = Ifcs | Teop; if (!Goslow) @@ -659,8 +660,8 @@ rxinit(Ctlr *ctlr) ctlr->reg[Srrctl] = (ctlr->rbsz + 1024 - 1) / 1024; ctlr->reg[Mhadd] = ctlr->rbsz << 16; - ctlr->reg[Rbal] = PCIWADDR(ctlr->rdba); - ctlr->reg[Rbah] = 0; + ctlr->reg[Rbal] = PCIWADDRL(ctlr->rdba); + ctlr->reg[Rbah] = PCIWADDRH(ctlr->rdba); ctlr->reg[Rdlen] = ctlr->nrd*sizeof(Rd); /* must be multiple of 128 */ ctlr->reg[Rdh] = 0; ctlr->reg[Rdt] = ctlr->rdt = 0; @@ -719,8 +720,8 @@ replenish(Ctlr *ctlr, uint rdh) break; } ctlr->rb[rdt] = b; - r->addr[0] = PCIWADDR(b->rp); - r->addr[1] = 0; + r->addr[0] = PCIWADDRL(b->rp); + r->addr[1] = PCIWADDRH(b->rp); r->status = 0; ctlr->rdfree++; i++; @@ -1003,8 +1004,8 @@ txinit(Ctlr *ctlr) assert(ctlr->tdba != nil); memset(ctlr->tdba, 0, ctlr->ntd * sizeof(Td)); - ctlr->reg[Tdbal] = PCIWADDR(ctlr->tdba); - ctlr->reg[Tdbah] = 0; + ctlr->reg[Tdbal] = PCIWADDRL(ctlr->tdba); + ctlr->reg[Tdbah] = PCIWADDRH(ctlr->tdba); ctlr->reg[Tdlen] = ctlr->ntd*sizeof(Td); /* must be multiple of 128 */ ctlr->reg[Tdh] = 0; ctlr->tdh = ctlr->ntd - 1; --- /sys/src/9k/386/etherigbe.c +++ /sys/src/9k/386/etherigbe.c @@ -919,8 +919,8 @@ igbetxinit(Ctlr* ctlr) csr32w(ctlr, Ait, 0); csr32w(ctlr, Txdmac, 0); - csr32w(ctlr, Tdbal, PCIWADDR(ctlr->tdba)); - csr32w(ctlr, Tdbah, 0); + csr32w(ctlr, Tdbal, PCIWADDRL(ctlr->tdba)); + csr32w(ctlr, Tdbah, PCIWADDRH(ctlr->tdba)); csr32w(ctlr, Tdlen, ctlr->ntd*sizeof(Td)); ctlr->tdh = PREV(0, ctlr->ntd); csr32w(ctlr, Tdh, 0); @@ -1001,7 +1001,8 @@ igbetransmit(Ether* edev) if((bp = qget(edev->oq)) == nil) break; td = &ctlr->tdba[tdt]; - td->addr[0] = PCIWADDR(bp->rp); + td->addr[0] = PCIWADDRL(bp->rp); + td->addr[1] = PCIWADDRH(bp->rp); td->control = ((BLEN(bp) & LenMASK)<control |= Dext|Ifcs|Teop|DtypeDD; ctlr->tb[tdt] = bp; @@ -1039,8 +1040,8 @@ igbereplenish(Ctlr* ctlr) break; } ctlr->rb[rdt] = bp; - rd->addr[0] = PCIWADDR(bp->rp); - rd->addr[1] = 0; + rd->addr[0] = PCIWADDRL(bp->rp); + rd->addr[1] = PCIWADDRH(bp->rp); } coherence(); rd->status = 0; @@ -1060,8 +1061,8 @@ igberxinit(Ctlr* ctlr) /* temporarily keep Mpe on */ csr32w(ctlr, Rctl, Dpf|Bsize2048|Bam|RdtmsHALF|Mpe); - csr32w(ctlr, Rdbal, PCIWADDR(ctlr->rdba)); - csr32w(ctlr, Rdbah, 0); + csr32w(ctlr, Rdbal, PCIWADDRL(ctlr->rdba)); + csr32w(ctlr, Rdbah, PCIWADDRH(ctlr->rdba)); csr32w(ctlr, Rdlen, ctlr->nrd*sizeof(Rd)); ctlr->rdh = 0; csr32w(ctlr, Rdh, 0); --- /sys/src/9k/386/etherm10g.c +++ /sys/src/9k/386/etherm10g.c @@ -828,7 +828,7 @@ setmem(Pcidev *p, Ctlr *c) c->port = raddr; c->ram = mem; c->cmd = malign(sizeof *c->cmd); - c->cprt = PCIWADDR(c->cmd); + c->cprt = PCIWADDR64(c->cmd); d = &c->done; d->n = Maxslots; @@ -836,11 +836,11 @@ setmem(Pcidev *p, Ctlr *c) i = d->n * sizeof *d->entry; d->entry = malign(i); memset(d->entry, 0, i); - d->busaddr = PCIWADDR(d->entry); + d->busaddr = PCIWADDR64(d->entry); c->stats = malign(sizeof *c->stats); memset(c->stats, 0, sizeof *c->stats); - c->statsprt = PCIWADDR(c->stats); + c->statsprt = PCIWADDR64(c->stats); memmove(c->eprom, c->ram + c->ramsz - Epromsz, Epromsz-2); return setpcie(p) || parseeprom(c); @@ -913,8 +913,8 @@ replenish(Rx *rx) idx = rx->cnt & rx->m; for(i = 0; i < 8; i++){ b = balloc(rx); - buf[i*2] = pbit32((u64int)PCIWADDR(b->wp) >> 32); - buf[i*2+1] = pbit32(PCIWADDR(b->wp)); + buf[i*2] = pbit32(PCIWADDRH(b->wp)); + buf[i*2+1] = pbit32(PCIWADDRL(b->wp)); rx->host[idx+i] = b; assert(b); } @@ -1171,7 +1171,7 @@ nsegments(Block *b, int segsz) uintptr bus, end, slen, len; int i; - bus = PCIWADDR(b->rp); + bus = PCIWADDR64(b->rp); i = 0; for(len = BLEN(b); len; len -= slen){ end = bus + segsz & ~(segsz-1); @@ -1213,7 +1213,7 @@ m10gtransmit(Ether *e) if((len = BLEN(b)) < 1520) flags |= SFsmall; rdma = nseg = nsegments(b, segsz); - bus = PCIWADDR(b->rp); + bus = PCIWADDR64(b->rp); for(; len; len -= slen){ end = (bus + segsz) & ~(segsz-1); slen = end - bus; --- /sys/src/9k/386/sdata.c +++ /sys/src/9k/386/sdata.c @@ -1093,7 +1093,7 @@ atadmasetup(Drive* drive, int len) int bmiba, bmisx, count, i, span; ctlr = drive->ctlr; - pa = PCIWADDR(drive->data); + pa = PCIWADDR32(drive->data); if(pa & 0x03) return -1; @@ -1127,7 +1127,7 @@ atadmasetup(Drive* drive, int len) (prd-1)->count |= PrdEOT; bmiba = ctlr->bmiba; - outl(bmiba+Bmidtpx, PCIWADDR(ctlr->prdt)); + outl(bmiba+Bmidtpx, PCIWADDR32(ctlr->prdt)); if(drive->write) outb(ctlr->bmiba+Bmicx, 0); else --- /sys/src/9k/386/sdiahci.c +++ /sys/src/9k/386/sdiahci.c @@ -316,8 +316,8 @@ listsetup(Aportc *pc, int flags) list = pc->pm->list; list->flags = flags | 5; list->len = 0; - list->ctab = PCIWADDR(pc->pm->ctab); - list->ctabhi = 0; + list->ctab = PCIWADDRL(pc->pm->ctab); + list->ctabhi = PCIWADDRH(pc->pm->ctab); } static int @@ -497,8 +497,8 @@ ahciidentify0(Aportc *pc, void *id, int atapi) memset(id, 0, 0x100); /* magic */ p = &pc->pm->ctab->prdt; - p->dba = PCIWADDR(id); - p->dbahi = 0; + p->dba = PCIWADDRL(id); + p->dbahi = PCIWADDRH(id); p->count = 1<<31 | (0x200-2) | 1; return ahciwait(pc, 3*1000); } @@ -741,10 +741,10 @@ ahciconfigdrive(Drive *d) p->serror = SerrAll; - p->list = PCIWADDR(pm->list); - p->listhi = 0; - p->fis = PCIWADDR(pm->fis.base); - p->fishi = 0; + p->list = PCIWADDRL(pm->list); + p->listhi = PCIWADDRH(pm->list); + p->fis = PCIWADDRL(pm->fis.base); + p->fishi = PCIWADDRH(pm->fis.base); p->cmd |= Afre|Ast; /* drive coming up in slumbering? */ @@ -1559,12 +1559,12 @@ ahcibuild(Drive *d, uchar *cmd, void *data, int n, vlong lba) if(dir == Write) l->flags |= Lwrite; l->len = 0; - l->ctab = PCIWADDR(t); - l->ctabhi = 0; + l->ctab = PCIWADDRL(t); + l->ctabhi = PCIWADDRH(t); p = &t->prdt; - p->dba = PCIWADDR(data); - p->dbahi = 0; + p->dba = PCIWADDRL(data); + p->dbahi = PCIWADDRH(data); if(d->unit == nil) panic("ahcibuild: nil d->unit"); p->count = 1<<31 | (d->unit->secsize*n - 2) | 1; @@ -1613,15 +1613,15 @@ ahcibuildpkt(Aportm *pm, SDreq *r, void *data, int n) if(r->write != 0 && data) l->flags |= Lwrite; l->len = 0; - l->ctab = PCIWADDR(t); - l->ctabhi = 0; + l->ctab = PCIWADDRL(t); + l->ctabhi = PCIWADDRH(t); if(data == 0) return l; p = &t->prdt; - p->dba = PCIWADDR(data); - p->dbahi = 0; + p->dba = PCIWADDRL(data); + p->dbahi = PCIWADDRH(data); p->count = 1<<31 | (n - 2) | 1; return l; --- /sys/src/9k/k10/io.h +++ /sys/src/9k/k10/io.h @@ -253,6 +253,9 @@ struct Pcidev }; #define PCIWINDOW 0 -#define PCIWADDR(va) (PADDR(va)+PCIWINDOW) +#define PCIWADDR64(va) (PADDR(va)+PCIWINDOW) +#define PCIWADDR32(va) ((ulong)PCIWADDR64(va)) #define ISAWINDOW 0 #define ISAWADDR(va) (PADDR(va)+ISAWINDOW) +#define PCIWADDRL(va) ((ulong)PCIWADDR64(va)) +#define PCIWADDRH(va) ((ulong)(PCIWADDR64(va)>>32))