From ad5b1e72e123d39813818badb93a91cfb1b1d9f3 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 3 Apr 1999 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1999-04-03 --- pc/audio.h | 2 +- pc/devfloppy.c | 4 ++-- pc/dma.c | 40 +++++++++++++++++++++++++--------------- pc/fns.h | 2 +- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/pc/audio.h b/pc/audio.h index 9de05d0bb33dfcac83299b0baa612f5ae45dcb92..6bf521cc8f73b3a5f8a3f8ebe11848fd67b376a2 100644 --- a/pc/audio.h +++ b/pc/audio.h @@ -6,7 +6,7 @@ enum SBswab = 0, }; -#define seteisadma(a, b) dmainit(a); +#define seteisadma(a, b) dmainit(a, Bufsize); #define CACHELINESZ 8 #define UNCACHED(type, v) (type*)((ulong)(v)) diff --git a/pc/devfloppy.c b/pc/devfloppy.c index 404e4a5eceb53da4040f3a7f18d893d075c0f9c9..0fc8b78a22af0ee1112ef844ca2c09ff8236215c 100644 --- a/pc/devfloppy.c +++ b/pc/devfloppy.c @@ -144,8 +144,6 @@ floppyreset(void) FDrive *dp; FType *t; ulong maxtsize; - - dmainit(DMAchan); floppysetup0(&fl); @@ -161,6 +159,8 @@ floppyreset(void) maxtsize = t->tsize; } + dmainit(DMAchan, maxtsize); + /* * allocate the drive storage */ diff --git a/pc/dma.c b/pc/dma.c index e285ffb0ce7cc210c54837ed8533c8bdc1703891..42cda1db8a3699fcd868e2019c7735006d63583a 100644 --- a/pc/dma.c +++ b/pc/dma.c @@ -32,6 +32,7 @@ struct DMAxfer { ulong bpa; /* bounce buffer physical address */ void* bva; /* bounce buffer virtual address */ + int blen; /* bounce buffer length */ void* va; /* virtual address destination/src */ long len; /* bytes to be transferred */ int isread; @@ -83,29 +84,38 @@ DMA dma[2] = { * initialisation routines of any devices which require DMA to ensure * the allocated bounce buffers are below the 16MB limit. */ -void -dmainit(int chan) +int +dmainit(int chan, int maxtransfer) { DMA *dp; DMAxfer *xp; - ulong v; + + if(maxtransfer > 64*1024) + maxtransfer = 64*1024; dp = &dma[(chan>>2)&1]; chan = chan & 3; xp = &dp->x[chan]; - if(xp->bva != nil) - return; - - v = (ulong)xalloc(BY2PG+BY2PG); - if(v == 0 || PADDR(v) >= 16*MB){ - print("dmainit: chan %d: 0x%luX out of range\n", chan, v); - xfree((void*)v); - v = 0; + if(xp->bva != nil){ + if(xp->blen < maxtransfer) + return 1; + return 0; } - xp->bva = (void*)ROUND(v, BY2PG); + + xp->bva = xspanalloc(maxtransfer, BY2PG, 64*1024); + if(xp->bva == nil) + return 1; xp->bpa = PADDR(xp->bva); + if(xp->bpa >= 16*MB){ + xfree(xp->bva); /* doesn't work... */ + xp->bva = nil; + return 1; + } + xp->blen = maxtransfer; xp->len = 0; xp->isread = 0; + + return 0; } /* @@ -132,7 +142,7 @@ dmasetup(int chan, void *va, long len, int isread) /* * if this isn't kernel memory or crossing 64k boundary or above 16 meg - * use the allocated low memory page. + * use the bounce buffer. */ pa = PADDR(va); if((((ulong)va)&0xF0000000) != KZERO @@ -140,8 +150,8 @@ dmasetup(int chan, void *va, long len, int isread) || pa >= 16*MB) { if(xp->bva == nil) return -1; - if(len > BY2PG) - len = BY2PG; + if(len > xp->blen) + len = xp->blen; if(!isread) memmove(xp->bva, va, len); xp->va = va; diff --git a/pc/fns.h b/pc/fns.h index 6bc6b480c32aa1933bf04dd16167cf71b30c4163..65fa731fdfa57f2842d0add92f8a3ece59de0a09 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -17,7 +17,7 @@ void delay(int); int dmacount(int); int dmadone(int); void dmaend(int); -void dmainit(int); +int dmainit(int, int); long dmasetup(int, void*, long, int); #define evenaddr(x) /* x86 doesn't care */ void fpenv(FPsave*);