| plan 9 kernel history: overview | file list | diff list |
1999/0522/pc/devlml.c (diff list | history)
| 1999/0522/sys/src/9/pc/devlml.c:23,36 – 1999/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,42 – 1999/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,48 – 1999/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,54 – 1999/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,80 – 1999/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,88 – 1999/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,115 – 1999/0525/sys/src/9/pc/devlml.c:120,125 | ||
| 1999/0515 | return *(uchar *)a = v; } | |
| 1999/0517 |
| |
| 1999/0515 |
| |
| 1999/0522/sys/src/9/pc/devlml.c:432,437 – 1999/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,657 – 1999/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,674 – 1999/0525/sys/src/9/pc/devlml.c:670,688 | ||
| 1999/0423 | if (pcidev == nil) { return; } | |
| 1999/0422 |
| |
| 1999/0525 | cdsize = (sizeof(CodeData) + BY2PG - 1) & ~(BY2PG - 1); codeData = (CodeData*)xspanalloc(cdsize, BY2PG, 0); | |
| 1999/0422 | if (codeData == nil) { | |
| 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 |
| |
| 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,708 – 1999/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,717 – 1999/0525/sys/src/9/pc/devlml.c:726,736 | ||
| 1999/0522 | segbuf.name = smalloc(NAMELEN); snprint(segbuf.name, NAMELEN, "lmlmjpg"); segbuf.pa = PADDR(codeData); | |
| 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,725 – 1999/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; | |
| 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,754 – 1999/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,761 – 1999/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,781 – 1999/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,789 – 1999/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,799 – 1999/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,807 – 1999/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,892 – 1999/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,901 – 1999/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,909 – 1999/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,982 – 1999/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); | |