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

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

1999/0424/sys/src/9/pc/devlml.c:13,201999/0428/sys/src/9/pc/devlml.c:13,19 (short | long | prev | next)
1999/0422    
enum{ 
	Q819, 
	Q856, 
	Q060, 
	Q067, 
1999/0428    
	Qreg, 
1999/0422    
	Qvideo, 
	Qjframe, 
}; 
1999/0424/sys/src/9/pc/devlml.c:23,301999/0428/sys/src/9/pc/devlml.c:22,28
1999/0422    
//	 name,		 qid,	  size,		mode 
	"vid819",	{Q819},		0,		0644, 
	"vid856",	{Q856},		0,		0644, 
	"vid060",	{Q060},		0,		0644, 
	"vid067",	{Q067},		0,		0644, 
1999/0428    
	"vidreg",	{Qreg},		0,		0644, 
1999/0422    
	"video",	{Qvideo},	0,		0666, 
	"jframe",	{Qjframe},	0,		0666, 
}; 
1999/0424/sys/src/9/pc/devlml.c:238,3431999/0428/sys/src/9/pc/devlml.c:236,242
1999/0424    
	return 1; 
} 
 
1999/0423    
/* 
 * The following mapping applies for the guests in the LML33 
 * 
 * Guest        Device 
 *   0          zr36060 
 *              uses subaddress GADR[0..1] 
 *   1          zr36060 START# 
 *   2          - 
 *   3          zr36060 RESET# 
 *   4          - 
 *   5          - 
 *   6          - 
 *   7          - 
 */ 
                 
// lml33_post_idle waits for the guest bus to become free 
static int 
lml33_post_idle(void) { 
	ulong a; 
	int timeout; 
                 
	for(timeout = 0;;timeout += 1){ 
		a = readl(pciBaseAddr + ZR36057_POST_OFFICE); 
		if ((a & ZR36057_POST_PEND) == 0)  
			return a; 
		if (timeout == GUEST_TIMEOUT)  
			return -1; 
	} 
} 
                 
// lml33_post_write writes a byte to a guest using postoffice mechanism 
1999/0424    
static int 
1999/0423    
lml33_post_write(int guest, int reg, int v) { 
	int w; 
                 
	// wait for postoffice not busy 
	lml33_post_idle(); 
                 
	// Trim the values, just in case 
	guest &= 0x07; 
	reg   &= 0x07; 
	v     &= 0xFF; 
                 
	// write postoffice operation 
	w = ZR36057_POST_DIR + (guest<<20) + (reg<<16) + v; 
	writel(w, pciBaseAddr + ZR36057_POST_OFFICE); 
                 
	// wait for postoffice not busy 
1999/0424    
	return lml33_post_idle() == -1; 
1999/0423    
} 
                 
// lml33_post_read reads a byte from a guest using postoffice mechanism 
1999/0424    
static int 
1999/0423    
lml33_post_read(int guest, int reg) { 
	int w; 
                 
	// wait for postoffice not busy 
	lml33_post_idle(); 
                 
	// Trim the values, just in case 
	guest &= 0x07; 
	reg   &= 0x07; 
                 
	// write postoffice operation 
	w = (guest<<20) + (reg<<16); 
	writel(w, pciBaseAddr + ZR36057_POST_OFFICE); 
                 
	// wait for postoffice not busy, get result 
	w = lml33_post_idle(); 
                 
	// decide if read went ok 
1999/0424    
	if (w == -1) return -1; 
1999/0423    
                 
1999/0424    
	return w & 0xFF; 
1999/0423    
} 
                 
1999/0424    
static int 
1999/0423    
lml33_zr060_write(int reg, int v) { 
	int guest_id; 
                 
	guest_id = GID060; 
                 
	lml33_post_write(guest_id, 1, reg>>8 & 0x03); 
	lml33_post_write(guest_id, 2, reg    & 0xff); 
1999/0424    
	return lml33_post_write(guest_id, 3, v); 
1999/0423    
} 
                 
1999/0424    
static int 
1999/0423    
lml33_zr060_read(int reg) { 
	int guest_id; 
                 
	guest_id = GID060; 
                 
	lml33_post_write(guest_id, 1, reg>>8 & 0x03); 
	lml33_post_write(guest_id, 2, reg    & 0xff); 
                 
	return lml33_post_read(guest_id, 3); 
} 
                 
1999/0424    
static int 
prepareBuffer(CodeData * this, int bufferNo) { 
  if(bufferNo >= 0 && bufferNo < NBUF && (this->statCom[bufferNo] & STAT_BIT)) { 
    this->statCom[bufferNo] = this->statComInitial[bufferNo]; 
1999/0424/sys/src/9/pc/devlml.c:623,6301999/0428/sys/src/9/pc/devlml.c:522,528
1999/0422    
	switch(c->qid.path){ 
	case Q819: 
	case Q856: 
	case Q060: 
	case Q067: 
1999/0428    
	case Qreg: 
1999/0422    
		break; 
	case Qvideo: 
	case Qjframe: 
1999/0424/sys/src/9/pc/devlml.c:650,6571999/0428/sys/src/9/pc/devlml.c:548,554
1999/0422    
	switch(c->qid.path){ 
	case Q819: 
	case Q856: 
	case Q060: 
	case Q067: 
1999/0428    
	case Qreg: 
1999/0422    
	case Qvideo: 
	case Qjframe: 
		authclose(c); 
1999/0424/sys/src/9/pc/devlml.c:680,7021999/0428/sys/src/9/pc/devlml.c:577,599
1999/0424    
			*buf++ = d; 
		} 
		return n - i; 
1999/0422    
	case Q060: 
1999/0424    
		if (off < 0 || off + n > 0x60) 
			return 0; 
		for (i = 0; i < n; i++) { 
			if ((d = lml33_zr060_read(off++)) < 0) break; 
			*buf++ = d; 
		} 
		return n - i; 
1999/0422    
	case Q067: 
1999/0428    
	case Qreg: 
1999/0424    
		if (off < 0 || off + n > 0x200 || (off & 0x3)) 
			return 0; 
		for (i = n; i >= 4; i -= 4) { 
1999/0428    
		switch(n) { 
		case 1: 
			*buf = readb(pciBaseAddr + off); 
			break; 
		case 2: 
			*(short *)buf = readw(pciBaseAddr + off); 
			break; 
		case 4: 
1999/0424    
			*(long *)buf = readl(pciBaseAddr + off); 
			buf += 4; 
			off += 4; 
1999/0428    
			break; 
		default: 
			return 0; 
1999/0424    
		} 
		return n-i; 
1999/0428    
		return n; 
1999/0422    
	case Qvideo: 
	case Qjframe: 
1999/0424    
		return vread(c, buf, n, off); 
1999/0424/sys/src/9/pc/devlml.c:723,7441999/0428/sys/src/9/pc/devlml.c:620,642
1999/0424    
			if (lml33_i2c_wr8(BT856Addr, off++, *buf++) == 0) 
				break; 
		return n - i; 
1999/0423    
	case Q060: 
1999/0424    
		if (off < 0 || off + n > 0x60) 
			return 0; 
		for (i = 0; i < n; i++) 
			if (lml33_zr060_write(off++, *buf++) < 0) 
				break; 
		return n - i; 
1999/0423    
	case Q067: 
1999/0428    
	case Qreg: 
1999/0424    
		if (off < 0 || off + n > 0x200 || (off & 0x3)) 
			return 0; 
		for (i = n; i >= 4; i -= 4) { 
1999/0428    
		switch (n) { 
		case 1: 
			writeb(*buf, pciBaseAddr + off); 
			break; 
		case 2: 
			writew(*(short *)buf, pciBaseAddr + off); 
			break; 
		case 4: 
1999/0424    
			writel(*(long *)buf, pciBaseAddr + off); 
			buf += 4; 
			off += 4; 
1999/0428    
			break; 
		default: 
			return 0; 
1999/0424    
		} 
		return n-i; 
1999/0428    
		return n; 
1999/0423    
	case Qvideo: 
	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)