plan 9 kernel history: overview | file list | diff list

1999/0403/pc/dma.c (diff list | history)

1998/1125/sys/src/9/pc/dma.c:32,371999/0403/sys/src/9/pc/dma.c:32,38 (short | long | prev | next)
1991/0803    
{ 
1996/0607    
	ulong	bpa;		/* bounce buffer physical address */ 
	void*	bva;		/* bounce buffer virtual address */ 
1999/0403    
	int	blen;		/* bounce buffer length */ 
1996/0607    
	void*	va;		/* virtual address destination/src */ 
1991/0803    
	long	len;		/* bytes to be transferred */ 
	int	isread; 
1998/1125/sys/src/9/pc/dma.c:83,1111999/0403/sys/src/9/pc/dma.c:84,121
1997/0404    
 *  initialisation routines of any devices which require DMA to ensure 
 *  the allocated bounce buffers are below the 16MB limit. 
1993/0915    
 */ 
void 
1997/0404    
dmainit(int chan) 
1999/0403    
int 
dmainit(int chan, int maxtransfer) 
1993/0915    
{ 
	DMA *dp; 
	DMAxfer *xp; 
1997/0404    
	ulong v; 
1993/0915    
 
1999/0403    
	if(maxtransfer > 64*1024) 
		maxtransfer = 64*1024; 
 
1997/0404    
	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; 
1999/0403    
	if(xp->bva != nil){ 
		if(xp->blen < maxtransfer) 
			return 1; 
		return 0; 
1993/0915    
	} 
1997/0404    
	xp->bva = (void*)ROUND(v, BY2PG); 
1999/0403    
 
	xp->bva = xspanalloc(maxtransfer, BY2PG, 64*1024); 
	if(xp->bva == nil) 
		return 1; 
1997/0404    
	xp->bpa = PADDR(xp->bva); 
1999/0403    
	if(xp->bpa >= 16*MB){ 
		xfree(xp->bva);		/* doesn't work... */ 
		xp->bva = nil; 
		return 1; 
	} 
	xp->blen = maxtransfer; 
1997/0404    
	xp->len = 0; 
	xp->isread = 0; 
1999/0403    
 
	return 0; 
1993/0915    
} 
 
/* 
1998/1125/sys/src/9/pc/dma.c:132,1381999/0403/sys/src/9/pc/dma.c:142,148
1991/0803    
 
	/* 
1993/0915    
	 *  if this isn't kernel memory or crossing 64k boundary or above 16 meg 
	 *  use the allocated low memory page. 
1999/0403    
	 *  use the bounce buffer. 
1991/0803    
	 */ 
1993/0915    
	pa = PADDR(va); 
1992/1013    
	if((((ulong)va)&0xF0000000) != KZERO 
1998/1125/sys/src/9/pc/dma.c:140,1471999/0403/sys/src/9/pc/dma.c:150,157
1998/1125    
	|| pa >= 16*MB) { 
1997/0404    
		if(xp->bva == nil) 
			return -1; 
1991/0803    
		if(len > BY2PG) 
			len = BY2PG; 
1999/0403    
		if(len > xp->blen) 
			len = xp->blen; 
1991/0803    
		if(!isread) 
1996/0607    
			memmove(xp->bva, va, len); 
1991/0803    
		xp->va = va; 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)