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

1996/0607/pc/dma.c (diff list | history)

1995/0701/sys/src/9/pc/dma.c:4,121996/0607/sys/src/9/pc/dma.c:4,9 (short | long | prev | next)
1991/0803    
#include	"dat.h" 
#include	"fns.h" 
 
/* 
 *  headland chip set for the safari. 
 */ 
typedef struct DMAport	DMAport; 
typedef struct DMA	DMA; 
typedef struct DMAxfer	DMAxfer; 
1995/0701/sys/src/9/pc/dma.c:33,401996/0607/sys/src/9/pc/dma.c:30,38
1991/0803    
 */ 
struct DMAxfer 
{ 
1993/0915    
	Page	pg;		/* page used by dma */ 
1991/0803    
	void	*va;		/* virtual address destination/src */ 
1996/0607    
	ulong	bpa;		/* bounce buffer physical address */ 
	void*	bva;		/* bounce buffer virtual address */ 
	void*	va;		/* virtual address destination/src */ 
1991/0803    
	long	len;		/* bytes to be transferred */ 
	int	isread; 
}; 
1995/0701/sys/src/9/pc/dma.c:95,1021996/0607/sys/src/9/pc/dma.c:93,100
1993/0915    
		dp = &dma[i]; 
		for(chan = 0; chan < 4; chan++){ 
			xp = &dp->x[chan]; 
			xp->pg.pa = (ulong)xspanalloc(BY2PG, BY2PG, 0); 
			xp->pg.va = KZERO|xp->pg.pa; 
1996/0607    
			xp->bva = xspanalloc(BY2PG, BY2PG, 0); 
			xp->bpa = PADDR(xp->bva); 
1995/0214    
			xp->len = 0; 
			xp->isread = 0; 
1993/0915    
		} 
1995/0701/sys/src/9/pc/dma.c:117,1251996/0607/sys/src/9/pc/dma.c:115,123
1991/0803    
dmasetup(int chan, void *va, long len, int isread) 
{ 
	DMA *dp; 
	DMAxfer *xp; 
	ulong pa; 
	uchar mode; 
1996/0607    
	DMAxfer *xp; 
1991/0803    
 
	dp = &dma[(chan>>2)&1]; 
	chan = chan & 3; 
1995/0701/sys/src/9/pc/dma.c:132,1471996/0607/sys/src/9/pc/dma.c:130,146
1993/0915    
	pa = PADDR(va); 
1992/1013    
	if((((ulong)va)&0xF0000000) != KZERO 
1993/0915    
	|| (pa&0xFFFF0000) != ((pa+len)&0xFFFF0000) 
	|| pa > 16*MB){ 
1996/0607    
	|| pa > 16*MB) { 
1991/0803    
		if(len > BY2PG) 
			len = BY2PG; 
		if(!isread) 
1993/0915    
			memmove((void*)(xp->pg.va), va, len); 
1996/0607    
			memmove(xp->bva, va, len); 
1991/0803    
		xp->va = va; 
		xp->len = len; 
		xp->isread = isread; 
1993/0915    
		pa = xp->pg.pa; 
1991/0925    
	} else 
1996/0607    
		pa = xp->bpa; 
	} 
	else 
1991/0925    
		xp->len = 0; 
1991/0803    
 
	/* 
1995/0701/sys/src/9/pc/dma.c:149,1551996/0607/sys/src/9/pc/dma.c:148,154
1991/0803    
	 */ 
1995/0214    
	ilock(dp); 
1991/0803    
	mode = (isread ? 0x44 : 0x48) | chan; 
	outb(dp->mode, mode);		/* single mode dma (give CPU a chance at mem) */ 
1996/0607    
	outb(dp->mode, mode);	/* single mode dma (give CPU a chance at mem) */ 
1991/0803    
	outb(dp->page[chan], pa>>16); 
1995/0214    
	outb(dp->cbp, 0);		/* set count & address to their first byte */ 
	outb(dp->addr[chan], pa>>dp->shift);		/* set address */ 
1995/0701/sys/src/9/pc/dma.c:203,2181996/0607/sys/src/9/pc/dma.c:202,207
1991/0803    
	/* 
	 *  copy out of temporary page 
	 */ 
1993/0915    
	memmove(xp->va, (void*)(xp->pg.va), xp->len); 
1996/0607    
	memmove(xp->va, xp->bva, xp->len); 
1991/0925    
	xp->len = 0; 
1991/0803    
} 
1995/0701    
                 
void 
dmaemode(int chan, int value) 
{ 
	if(chan < 4) 
		outb(0x40b, value|chan); 
	else 
		outb(0x4d6, value|chan); 
                 
} 


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