|
|
|
1999/0424/sys/src/9/pc/devlml.c:13,20 –
1999/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,30 –
1999/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,343 –
1999/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,630 –
1999/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,657 –
1999/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,702 –
1999/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,744 –
1999/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);
|