## diffname pc/vga3dfx.c 2000/0904 ## diff -e /dev/null /n/emeliedump/2000/0904/sys/src/9/pc/vga3dfx.c 0a #include "u.h" #include "../port/lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "io.h" #include "../port/error.h" #define Image IMAGE #include #include #include #include "screen.h" static ulong tdfxlinear(VGAscr* scr, int* size, int* align) { ulong aperture, oaperture; int oapsize, wasupamem; Pcidev *p; oaperture = scr->aperture; oapsize = scr->apsize; wasupamem = scr->isupamem; aperture = 0; if(p = pcimatch(nil, 0x121A, 0)){ switch(p->did){ case 0x0005: /* Voodoo 3 3000 */ aperture = p->mem[1].bar & ~0x0F; *size = p->mem[1].size; break; default: break; } } if(wasupamem){ if(oaperture == aperture) return oaperture; upafree(oaperture, oapsize); } scr->isupamem = 0; aperture = upamalloc(aperture, *size, *align); if(aperture == 0){ if(wasupamem && upamalloc(oaperture, oapsize, 0)){ aperture = oaperture; scr->isupamem = 1; } else scr->isupamem = 0; } else scr->isupamem = 1; return aperture; } VGAdev vga3dfxdev = { "3dfx", nil, /* enable */ nil, /* disable */ nil, /* page */ tdfxlinear, /* linear */ nil, /* drawinit */ nil, /* fill */ }; VGAcur vga3dfxcur = { "3dfxhwgc", nil, /* enable */ nil, /* disable */ nil, /* load */ nil, /* move */ }; . ## diffname pc/vga3dfx.c 2000/0905 ## diff -e /n/emeliedump/2000/0904/sys/src/9/pc/vga3dfx.c /n/emeliedump/2000/0905/sys/src/9/pc/vga3dfx.c 74,77c tdfxcurenable, tdfxcurdisable, tdfxcurload, tdfxcurmove, . 63,68c tdfxenable, nil, nil, tdfxlinear, . 59a static void tdfxenable(VGAscr* scr) { Pcidev *p; Physseg seg; ulong aperture; int align, i, *mmio, size; /* * Only once, can't be disabled for now. * scr->io holds the physical address of * the MMIO registers. */ if(scr->io) return; if(p = pcimatch(nil, 0x121A, 0)){ switch(p->did){ case 0x0005: /* Avenger (a.k.a. Voodoo3) */ break; default: return; } } else return; scr->io = upamalloc(p->mem[0].bar & ~0x0F, p->mem[0].size, 0); if(scr->io == 0) return; memset(&seg, 0, sizeof(seg)); seg.attr = SG_PHYSICAL; seg.name = smalloc(NAMELEN); snprint(seg.name, NAMELEN, "3dfxmmio"); seg.pa = scr->io; seg.size = p->mem[0].size; addphysseg(&seg); size = p->mem[1].size; align = 0; aperture = tdfxlinear(scr, &size, &align); if(aperture) { scr->aperture = aperture; scr->apsize = size; memset(&seg, 0, sizeof(seg)); seg.attr = SG_PHYSICAL; seg.name = smalloc(NAMELEN); snprint(seg.name, NAMELEN, "3dfxscreen"); seg.pa = aperture; seg.size = size; addphysseg(&seg); } /* * Find a place for the cursor data in display memory. * If SDRAM then there's 16MB memory else it's SGRAM * and can count it based on the power-on straps - * chip size can be 8Mb or 16Mb, and there can be 4 or * 8 of them. * Use the last 1KB of the framebuffer. */ mmio = KADDR(scr->io + dramInit0); if(*(mmio+1) & 0x40000000) i = 16*1024*1024; else{ if(*mmio & 0x08000000) i = 16*1024*1024/8; else i = 8*1024*1024/8; if(*mmio & 0x04000000) i *= 8; else i *= 4; } scr->storage = i - 1024; } static void tdfxcurdisable(VGAscr* scr) { Cursor3dfx *cursor3dfx; if(scr->io == 0) return; cursor3dfx = KADDR(scr->io+hwCur); cursor3dfx->vidProcCfg &= ~0x08000000; } static void tdfxcurload(VGAscr* scr, Cursor* curs) { int y; uchar *p; Cursor3dfx *cursor3dfx; if(scr->io == 0) return; cursor3dfx = KADDR(scr->io+hwCur); /* * Disable the cursor then load the new image in * the top-left of the 64x64 array. * The cursor data is stored in memory as 128-bit * words consisting of plane 0 in the least significant 64-bits * and plane 1 in the most significant. * The X11 cursor truth table is: * p0 p1 colour * 0 0 transparent * 0 1 transparent * 1 0 hwCurC0 * 1 1 hwCurC1 * Unused portions of the image have been initialised to be * transparent. */ cursor3dfx->vidProcCfg &= ~0x08000000; p = KADDR(scr->aperture + scr->storage); for(y = 0; y < 16; y++){ *p++ = curs->clr[2*y]|curs->set[2*y]; *p++ = curs->clr[2*y+1]|curs->set[2*y+1]; p += 6; *p++ = curs->set[2*y]; *p++ = curs->set[2*y+1]; p += 6; } /* * Save the cursor hotpoint and enable the cursor. * The 0,0 cursor point is bottom-right. */ scr->offset.x = 63+curs->offset.x; scr->offset.y = 63+curs->offset.y; cursor3dfx->vidProcCfg |= 0x08000000; } static int tdfxcurmove(VGAscr* scr, Point p) { Cursor3dfx *cursor3dfx; if(scr->io == 0) return 1; cursor3dfx = KADDR(scr->io+hwCur); cursor3dfx->hwCurLoc = ((p.y+scr->offset.y)<<16)|(p.x+scr->offset.x); return 0; } static void tdfxcurenable(VGAscr* scr) { Cursor3dfx *cursor3dfx; tdfxenable(scr); if(scr->io == 0) return; cursor3dfx = KADDR(scr->io+hwCur); /* * Cursor colours. */ cursor3dfx->hwCurC0 = 0xFFFFFFFF; cursor3dfx->hwCurC1 = 0x00000000; /* * Initialise the 64x64 cursor to be transparent (X11 mode). */ cursor3dfx->hwCurPatAddr = scr->storage; memset(KADDR(scr->aperture + scr->storage), 0, 64*16); /* * Load, locate and enable the 64x64 cursor in X11 mode. */ tdfxcurload(scr, &arrow); tdfxcurmove(scr, ZP); cursor3dfx->vidProcCfg |= 0x08000002; } . 29c case 0x0005: /* Avenger (a.k.a. Voodoo3) */ . 20a int oapsize, wasupamem; ulong aperture, oaperture; . 18,19d 14a typedef struct { int vidProcCfg; int hwCurPatAddr; int hwCurLoc; int hwCurC0; int hwCurC1; } Cursor3dfx; enum { dramInit0 = 0x18, dramInit1 = 0x1C, hwCur = 0x5C, }; . ## diffname pc/vga3dfx.c 2000/1222 ## diff -e /n/emeliedump/2000/0905/sys/src/9/pc/vga3dfx.c /n/emeliedump/2000/1222/sys/src/9/pc/vga3dfx.c 91a case 0x0003: /* Banshee */ . 43a case 0x0003: /* Banshee */ . ## diffname pc/vga3dfx.c 2001/0527 ## diff -e /n/emeliedump/2000/1222/sys/src/9/pc/vga3dfx.c /n/emeliedump/2001/0527/sys/src/9/pc/vga3dfx.c 122,123c kstrdup(&seg.name, "3dfxscreen"); . 108,109c kstrdup(&seg.name, "3dfxmmio"); . ## diffname pc/vga3dfx.c 2001/0908 ## diff -e /n/emeliedump/2001/0527/sys/src/9/pc/vga3dfx.c /n/emeliedump/2001/0908/sys/src/9/pc/vga3dfx.c 119,124c addvgaseg("3dfxscreen", aperture, size); . 116c if(aperture){ . 106,111c addvgaseg("3dfxmmio", (ulong)scr->io, p->mem[0].size); . 80d ## diffname pc/vga3dfx.c 2002/0711 ## diff -e /n/emeliedump/2001/0908/sys/src/9/pc/vga3dfx.c /n/emeliedump/2002/0711/sys/src/9/pc/vga3dfx.c 45a case 0x0009: /* Voodoo5 */ .