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

1999/0525/pc/devlml.c (diff list | history)

1999/0522/sys/src/9/pc/devlml.c:23,361999/0525/sys/src/9/pc/devlml.c:23,39 (short | long | prev | next)
1999/0520    
 
1999/0422    
// Lml 22 driver 
 
1999/0525    
#ifdef MEMMAP 
1999/0517    
struct { 
	ulong pci; 
1999/0518    
	ulong statcom; 
1999/0517    
	ulong codedata; 
} lmlmap; 
1999/0525    
#endif 
1999/0517    
 
1999/0422    
enum{ 
1999/0513    
	Qdir, 
1999/0525    
#ifdef MEMMAP 
1999/0520    
	Q060, 
1999/0422    
	Q819, 
	Q856, 
1999/0522/sys/src/9/pc/devlml.c:37,421999/0525/sys/src/9/pc/devlml.c:40,46
1999/0428    
	Qreg, 
1999/0515    
	Qmap, 
1999/0518    
	Qbuf, 
1999/0525    
#endif 
1999/0513    
	Qjvideo, 
1999/0422    
	Qjframe, 
}; 
1999/0522/sys/src/9/pc/devlml.c:43,481999/0525/sys/src/9/pc/devlml.c:47,53
1999/0422    
 
1999/0513    
static Dirtab lmldir[]={ 
//	 name,		 qid,		size,		mode 
1999/0525    
#ifdef MEMMAP 
1999/0520    
	"lml060",	{Q060},		0x400,		0644, 
1999/0513    
	"lml819",	{Q819},		0,		0644, 
	"lml856",	{Q856},		0,		0644, 
1999/0522/sys/src/9/pc/devlml.c:49,541999/0525/sys/src/9/pc/devlml.c:54,60
1999/0517    
	"lmlreg",	{Qreg},		0x400,		0644, 
	"lmlmap",	{Qmap},		sizeof lmlmap,	0444, 
1999/0518    
	"lmlbuf",	{Qbuf},		0,		0644, 
1999/0525    
#endif 
1999/0513    
	"jvideo",	{Qjvideo},	0,		0666, 
1999/0422    
	"jframe",	{Qjframe},	0,		0666, 
}; 
1999/0522/sys/src/9/pc/devlml.c:75,801999/0525/sys/src/9/pc/devlml.c:81,91
1999/0424    
	-1, 0, 0, 0, 0 
}; 
 
1999/0525    
 
#ifndef MEMMAP 
#define writel(v, a) *(ulong *)(a) = (v) 
#define readl(a) *(ulong*)(a) 
#else 
1999/0515    
ulong 
writel(ulong v, ulong a) { 
	if (debug&DBGREGS) 
1999/0522/sys/src/9/pc/devlml.c:83,881999/0525/sys/src/9/pc/devlml.c:94,109
1999/0515    
	return *(ulong *)a = v; 
} 
 
1999/0525    
ulong 
readl(ulong a) { 
	ulong v; 
 
	v = *(ulong*)a; 
	if (debug&DBGREGS) 
		pprint("%.8lux (%.8lux) --> %.8lux\n", 
			a, (ulong)a-pciBaseAddr, v); 
	return v; 
} 
1999/0515    
ushort 
writew(ushort v, ulong a) { 
	if (debug&DBGREGS) 
1999/0522/sys/src/9/pc/devlml.c:99,1151999/0525/sys/src/9/pc/devlml.c:120,125
1999/0515    
	return *(uchar *)a = v; 
} 
 
ulong 
readl(ulong a) { 
	ulong v; 
                 
	v = *(ulong*)a; 
	if (debug&DBGREGS) 
1999/0517    
		pprint("%.8lux (%.8lux) --> %.8lux\n", 
			a, (ulong)a-pciBaseAddr, v); 
1999/0515    
	return v; 
} 
                 
ushort 
readw(ulong a) { 
	ushort v; 
1999/0522/sys/src/9/pc/devlml.c:432,4371999/0525/sys/src/9/pc/devlml.c:442,448
1999/0520    
		return -1; 
	return post_read(GID060, 3); 
} 
1999/0525    
#endif 
1999/0520    
 
static int 
1999/0518    
prepareBuffer(int i) { 
1999/0522/sys/src/9/pc/devlml.c:652,6571999/0525/sys/src/9/pc/devlml.c:663,669
1999/0522    
	Physseg segreg; 
// 
1999/0422    
	ulong regpa; 
1999/0525    
	ulong cdsize; 
1999/0422    
	int i; 
 
1999/0423    
	pcidev = pcimatch(nil, PCI_VENDOR_ZORAN, PCI_DEVICE_ZORAN_36067); 
1999/0522/sys/src/9/pc/devlml.c:658,6741999/0525/sys/src/9/pc/devlml.c:670,688
1999/0423    
	if (pcidev == nil) { 
		return; 
	} 
1999/0422    
	codeData = (CodeData*)xspanalloc(sizeof(CodeData), BY2PG, 0); 
1999/0525    
	cdsize = (sizeof(CodeData) + BY2PG - 1) & ~(BY2PG - 1); 
	codeData = (CodeData*)xspanalloc(cdsize, BY2PG, 0); 
1999/0422    
	if (codeData == nil) { 
		print("devlml: xspanalloc(%ux, %ux, 0)\n", sizeof(CodeData), BY2PG); 
1999/0525    
		print("devlml: xspanalloc(%lux, %ux, 0)\n", cdsize, BY2PG); 
1999/0422    
		return; 
	} 
 
	print("Installing Motion JPEG driver %s\n", MJPG_VERSION);  
1999/0513    
	print("Buffer at 0x%.8lux, size 0x%.8ux\n", codeData, sizeof(CodeData));  
1999/0525    
	print("Buffer at 0x%.8lux, size 0x%.8lux\n", codeData, cdsize);  
1999/0422    
 
	// Get access to DMA memory buffer 
	memset(codeData, 0xAA, sizeof(CodeData)); 
1999/0525    
	codeData->physaddr = PADDR(&(codeData->statCom[0])); 
1999/0520    
	for (i = 0; i < NBUF; i++) { 
1999/0517    
		codeData->statCom[i] = PADDR(&(codeData->fragdesc[i])); 
		codeData->fragdesc[i].addr = PADDR(&(codeData->frag[i])); 
1999/0522/sys/src/9/pc/devlml.c:700,7081999/0525/sys/src/9/pc/devlml.c:714,724
1999/0422    
	// Interrupt handler 
1999/0423    
	intrenable(pcidev->intl, lmlintr, nil, pcidev->tbdf); 
1999/0422    
 
1999/0525    
#ifdef MEMMAP 
1999/0515    
	lmlmap.pci = pciBaseAddr; 
1999/0518    
	lmlmap.statcom = PADDR(codeData->statCom); 
1999/0515    
	lmlmap.codedata = (ulong)codeData; 
1999/0525    
#endif 
1999/0522    
 
// LMLSEG 
	memset(&segbuf, 0, sizeof(segbuf)); 
1999/0522/sys/src/9/pc/devlml.c:710,7171999/0525/sys/src/9/pc/devlml.c:726,736
1999/0522    
	segbuf.name = smalloc(NAMELEN); 
	snprint(segbuf.name, NAMELEN, "lmlmjpg"); 
	segbuf.pa = PADDR(codeData); 
	segbuf.size = sizeof(CodeData); 
	addphysseg(&segbuf); 
1999/0525    
	segbuf.size = cdsize; 
	if (addphysseg(&segbuf) == -1) { 
		print("lml: physsegment: lmlmjpg\n"); 
		return; 
	} 
1999/0522    
 
	memset(&segreg, 0, sizeof(segreg)); 
	segreg.attr = SG_PHYSICAL; 
1999/0522/sys/src/9/pc/devlml.c:719,7251999/0525/sys/src/9/pc/devlml.c:738,747
1999/0522    
	snprint(segreg.name, NAMELEN, "lmlregs"); 
	segreg.pa = (ulong)regpa; 
	segreg.size = pcidev->mem[0].size; 
	addphysseg(&segreg); 
1999/0525    
	if (addphysseg(&segreg) == -1) { 
		print("lml: physsegment: lmlmjpg\n"); 
		return; 
	} 
1999/0522    
// 
1999/0515    
 
1999/0422    
	return;  
1999/0522/sys/src/9/pc/devlml.c:749,7541999/0525/sys/src/9/pc/devlml.c:771,777
1999/0517    
 
1999/0422    
	c->aux = 0; 
	switch(c->qid.path){ 
1999/0525    
#ifdef MEMMAP 
1999/0520    
	case Q060: 
1999/0422    
	case Q819: 
	case Q856: 
1999/0522/sys/src/9/pc/devlml.c:756,7611999/0525/sys/src/9/pc/devlml.c:779,785
1999/0515    
	case Qmap: 
1999/0518    
	case Qbuf: 
1999/0422    
		break; 
1999/0525    
#endif 
1999/0422    
	case Qjframe: 
1999/0521    
	case Qjvideo: 
1999/0424    
		if (nopens) 
1999/0522/sys/src/9/pc/devlml.c:776,7811999/0525/sys/src/9/pc/devlml.c:800,806
1999/0518    
lmlclose(Chan *c) { 
 
1999/0422    
	switch(c->qid.path){ 
1999/0525    
#ifdef MEMMAP 
1999/0520    
	case Q060: 
1999/0422    
	case Q819: 
	case Q856: 
1999/0522/sys/src/9/pc/devlml.c:784,7891999/0525/sys/src/9/pc/devlml.c:809,815
1999/0518    
	case Qbuf: 
1999/0515    
		authclose(c); 
		break; 
1999/0525    
#endif 
1999/0513    
	case Qjvideo: 
1999/0422    
	case Qjframe: 
1999/0515    
		nopens = 0; 
1999/0522/sys/src/9/pc/devlml.c:793,7991999/0525/sys/src/9/pc/devlml.c:819,827
1999/0422    
 
static long 
1999/0513    
lmlread(Chan *c, void *va, long n, vlong voff) { 
1999/0525    
#ifdef MEMMAP 
1999/0424    
	int i, d; 
1999/0525    
#endif 
1999/0424    
	uchar *buf = va; 
1999/0513    
	long off = voff; 
1999/0423    
 
1999/0522/sys/src/9/pc/devlml.c:802,8071999/0525/sys/src/9/pc/devlml.c:830,836
1999/0513    
	case Qdir: 
		return devdirread(c, (char *)buf, n, lmldir, nelem(lmldir), devgen); 
 
1999/0525    
#ifdef MEMMAP 
1999/0520    
	case Q060: 
		if (off < 0 || off + n > 0x400) 
			return 0; 
1999/0522/sys/src/9/pc/devlml.c:887,8921999/0525/sys/src/9/pc/devlml.c:916,922
1999/0518    
			return 0; 
		} 
		return n; 
1999/0525    
#endif 
1999/0513    
	case Qjvideo: 
1999/0422    
	case Qjframe: 
1999/0424    
		return vread(c, buf, n, off); 
1999/0522/sys/src/9/pc/devlml.c:895,9011999/0525/sys/src/9/pc/devlml.c:925,933
1999/0422    
 
static long 
1999/0514    
lmlwrite(Chan *c, void *va, long n, vlong voff) { 
1999/0525    
#ifdef MEMMAP 
1999/0424    
	int i; 
1999/0525    
#endif 
1999/0424    
	uchar *buf = va; 
1999/0514    
	long off = voff; 
1999/0423    
 
1999/0522/sys/src/9/pc/devlml.c:904,9091999/0525/sys/src/9/pc/devlml.c:936,942
1999/0513    
	case Qdir: 
		error(Eperm); 
 
1999/0525    
#ifdef MEMMAP 
1999/0520    
	case Q060: 
		if (off < 0 || off + n > 0x400) 
			return 0; 
1999/0522/sys/src/9/pc/devlml.c:977,9821999/0525/sys/src/9/pc/devlml.c:1010,1016
1999/0428    
			return 0; 
1999/0424    
		} 
1999/0428    
		return n; 
1999/0525    
#endif 
1999/0513    
	case Qjvideo: 
1999/0423    
	case Qjframe: 
1999/0424    
		return vwrite(c, buf, n, off); 


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