diff --git a/sys/src/9/zynq/etherzynq.c b/sys/src/9/zynq/etherzynq.c index 775d219f4..c24ded981 100644 --- a/sys/src/9/zynq/etherzynq.c +++ b/sys/src/9/zynq/etherzynq.c @@ -295,7 +295,6 @@ ethinit(Ether *edev) { Ctlr *c; int i; - uintptr rxrpa, txrpa; c = edev->ctlr; c->r[NET_CTRL] = 0; @@ -306,9 +305,9 @@ ethinit(Ether *edev) c->r[SPEC_ADDR1_BOT] = edev->ea[0] | edev->ea[1] << 8 | edev->ea[2] << 16 | edev->ea[3] << 24; c->r[SPEC_ADDR1_TOP] = edev->ea[4] | edev->ea[5] << 8; c->r[DMA_CFG] = TXCHKSUMEN | (Rbsz/64) << 16 | 1 << 10 | 3 << 8 | 0x10; - - rxrpa = ualloc(8 * RXRING, &c->rxr); - txrpa = ualloc(8 * TXRING, &c->txr); + + c->rxr = ucalloc(8 * RXRING); + c->txr = ucalloc(8 * TXRING); c->rxs = xspanalloc(4 * RXRING, 4, 0); c->txs = xspanalloc(4 * TXRING, 4, 0); for(i = 0; i < 2 * RXRING; ){ @@ -324,8 +323,8 @@ ethinit(Ether *edev) c->txr[i++] = 1<<31; } c->txr[2 * (TXRING - 1)] |= 1<<30; - c->r[RX_QBAR] = rxrpa; - c->r[TX_QBAR] = txrpa; + c->r[RX_QBAR] = PADDR(c->rxr); + c->r[TX_QBAR] = PADDR(c->txr); c->r[NET_CTRL] = MDEN | TXEN | RXEN; c->r[INTR_EN] = MGMTDONE | TXUNDER | RXCOMPL | RXUSED | RXOVER; diff --git a/sys/src/9/zynq/fns.h b/sys/src/9/zynq/fns.h index 962100aef..ce27a1c04 100644 --- a/sys/src/9/zynq/fns.h +++ b/sys/src/9/zynq/fns.h @@ -66,13 +66,10 @@ void clinvdse(void *, void *); void invaldln(void *); void cleandln(void *); void clinvdln(void *); -uintptr ualloc(ulong, void **); +void* ucalloc(ulong); void clean2pa(uintptr, uintptr); void inval2pa(uintptr, uintptr); void archinit(void); uintptr palookur(void *); void screeninit(void); int isaconfig(char*, int, ISAConf*); -void *ucalloc(usize); -void *ucallocalign(usize, int, int); -void ucfree(void *); diff --git a/sys/src/9/zynq/main.c b/sys/src/9/zynq/main.c index f8a103b11..994628293 100644 --- a/sys/src/9/zynq/main.c +++ b/sys/src/9/zynq/main.c @@ -380,11 +380,10 @@ mpinit(void) coherence(); cleandse((uchar*)KZERO, (uchar*)0xFFFFFFFF); - v = tmpmap(0xFFFFF000); + v = KADDR(0xFFFFF000); v[0xFF0/4] = PADDR(mpbootstrap); coherence(); cleandse(v, (uchar*)v+BY2PG); - tmpunmap(v); sendevent(); synccycles(); diff --git a/sys/src/9/zynq/mmu.c b/sys/src/9/zynq/mmu.c index 66816225f..14f915759 100644 --- a/sys/src/9/zynq/mmu.c +++ b/sys/src/9/zynq/mmu.c @@ -6,6 +6,7 @@ #include "io.h" ulong *mpcore, *slcr; +uchar *ocm; void mmuinit(void) @@ -19,6 +20,7 @@ mmuinit(void) return; mpcore = vmap(MPCORE_BASE, 0x2000); slcr = vmap(SLCR_BASE, 0x1000); + ocm = vmap(OCM_BASE, -OCM_BASE); } void @@ -246,28 +248,36 @@ countpagerefs(ulong *, int) print("countpagerefs\n"); } -void * -kaddr(uintptr u) -{ - if(u >= (uintptr)-KZERO) - panic("kaddr: pa=%#.8lux", u); - return (void *)(u + KZERO); -} - uintptr paddr(void *v) { - if((uintptr)v < KZERO) - panic("paddr: va=%#.8lux", (uintptr) v); - return (uintptr)v - KZERO; + if((uintptr)v >= KZERO) + return (uintptr)v-KZERO; + if((uintptr)v >= VMAP) + return ((uintptr)v & (BY2PG-1)) | PPN(((ulong*)VMAPL2)[(uintptr)v-VMAP >> PGSHIFT]); + panic("paddr: va=%#p pc=%#p", v, getcallerpc(&v)); + return 0; +} + +void * +kaddr(uintptr u) +{ + if(u < (uintptr)-KZERO) + return (void *)(u + KZERO); + if(u >= OCM_BASE) + return (void *)(ocm + (u - OCM_BASE)); + panic("kaddr: pa=%#p pc=%#p", u, getcallerpc(&u)); + return nil; } uintptr cankaddr(uintptr u) { - if(u >= (uintptr)-KZERO) - return 0; - return -KZERO - u; + if(u < (uintptr)-KZERO) + return -KZERO - u; + if(u >= OCM_BASE) + return -u; + return 0; } KMap * @@ -401,22 +411,26 @@ vmap(uintptr pa, ulong sz) /* nasty things happen when there are cache entries for uncached memory so must make sure memory is not mapped ANYWHERE cached */ -uintptr -ualloc(ulong len, void **va) +void* +ucalloc(ulong len) { - static uintptr free = OCM_BASE; - uintptr pa; - + static uchar *free = nil; + static Lock l; + uchar *va; + if(len == 0) panic("ualloc: len == 0"); + + ilock(&l); + if(free == nil) + free = ocm + -OCM_BASE - BY2PG; /* last page is cpu1 bootstrap */ len = PGROUND(len); - if(free + len < OCM_BASE) + free -= len; + if(free < ocm) panic("ualloc: out of uncached memory"); - pa = free; - free += len; - if(va != nil){ - *va = vmap(pa, len); - invaldse(*va, (char *) *va + len); - } - return pa; + va = free; + iunlock(&l); + + invaldse(va, va + len); + return (void*)va; }