## diffname pc/vgavmware.c 2001/0822 ## diff -e /dev/null /n/emeliedump/2001/0822/sys/src/9/pc/vgavmware.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" enum { PCIVMWARE = 0x15AD, /* PCI VID */ VMWARE1 = 0x0710, /* PCI DID */ VMWARE2 = 0x0405, }; enum { Rid = 0, Renable, Rwidth, Rheight, Rmaxwidth, Rmaxheight, Rdepth, Rbpp, Rpseudocolor, Rrmask, Rgmask, Rbmask, Rbpl, Rfbstart, Rfboffset, Rfbmaxsize, Rfbsize, Rcap, Rmemstart, Rmemsize, Rconfigdone, Rsync, Rbusy, Rguestid, Rcursorid, Rcursorx, Rcursory, Rcursoron, Nreg, Rpalette = 1024, }; typedef struct Vmware Vmware; struct Vmware { ulong mmio; ulong fb; ulong ra; ulong rd; ulong r[Nreg]; char chan[32]; int depth; }; Vmware xvm; Vmware *vm=&xvm; static ulong vmrd(Vmware *vm, int i) { outl(vm->ra, i); return inl(vm->rd); } static void vmwr(Vmware *vm, int i, ulong v) { outl(vm->ra, i); outl(vm->rd, v); } static ulong vmwarelinear(VGAscr* scr, int* size, int* align) { char err[64]; ulong aperture, oaperture; int osize, oapsize, wasupamem; Pcidev *p; Physseg seg; osize = *size; oaperture = scr->aperture; oapsize = scr->apsize; wasupamem = scr->isupamem; p = pcimatch(nil, PCIVMWARE, 0); if(p == nil) error("no vmware card found"); switch(p->did){ default: snprint(err, sizeof err, "unknown vmware id %.4ux", p->did); error(err); case VMWARE1: vm->ra = 0x4560; vm->rd = 0x4560+4; break; case VMWARE2: vm->ra = p->mem[0].bar&~3; vm->rd = vm->ra + 1; } aperture = (ulong)(vmrd(vm, Rfbstart)); *size = vmrd(vm, Rfbsize); if(wasupamem) upafree(oaperture, oapsize); scr->isupamem = 0; aperture = upamalloc(aperture, *size, *align); if(aperture == 0){ if(wasupamem && upamalloc(oaperture, oapsize, 0)) scr->isupamem = 1; }else scr->isupamem = 1; if(oaperture) print("warning (BUG): redefinition of aperture does not change vmwarescreen segment\n"); memset(&seg, 0, sizeof(seg)); seg.attr = SG_PHYSICAL; seg.name = smalloc(32); snprint(seg.name, 32, "vmwarescreen"); seg.pa = aperture; seg.size = osize; addphysseg(&seg); return aperture; } static void vmwaredisable(VGAscr*) { } static void vmwareload(VGAscr*, Cursor*) { } static int vmwaremove(VGAscr*, Point) { return 0; } static void vmwareenable(VGAscr*) { } static void vmwareblank(int) { } static void vmwaredrawinit(VGAscr*) { } VGAdev vgavmwaredev = { "vmware", 0, 0, 0, vmwarelinear, vmwaredrawinit, }; VGAcur vgavmwarecur = { "vmwarehwgc", vmwareenable, vmwaredisable, vmwareload, vmwaremove, }; . ## diffname pc/vgavmware.c 2001/0908 ## diff -e /n/emeliedump/2001/0822/sys/src/9/pc/vgavmware.c /n/emeliedump/2001/0908/sys/src/9/pc/vgavmware.c 136,142c addvgaseg("vmwarescreen", aperture, osize); . 134c if(oaperture && aperture != oaperture) . 94d ## diffname pc/vgavmware.c 2002/0404 ## diff -e /n/emeliedump/2001/0908/sys/src/9/pc/vgavmware.c /n/emeliedump/2002/0404/sys/src/9/pc/vgavmware.c 177a 0, 0, 0, vmwareflush, . 167a ulong mmiobase, mmiosize; extern int iprintscreenputs; iprintscreenputs = 0; if(scr->mmio==nil){ mmiobase = vmrd(vm, Rmemstart); if(mmiobase == 0){ iprint("mmiobase 0\n"); return; } mmiosize = vmrd(vm, Rmemsize); scr->mmio = KADDR(upamalloc(mmiobase, mmiosize, 0)); iprint("mmio %p\n", scr->mmio); vm->mmio = scr->mmio; vm->mmiosize = mmiosize; if(scr->mmio == nil) return; addvgaseg("vmwaremmio", mmiobase, mmiosize); } scr->mmio[FifoMin] = 4*sizeof(ulong); scr->mmio[FifoMax] = vm->mmiosize; scr->mmio[FifoNextCmd] = 4*sizeof(ulong); scr->mmio[FifoStop] = 4*sizeof(ulong); vmwr(vm, Rconfigdone, 1); scr->scroll = vmwarescroll; scr->fill = vmwarefill; . 166c vmwaredrawinit(VGAscr *scr) . 164a static int vmwarescroll(VGAscr*, Rectangle r, Rectangle sr) { if(vm->mmio == nil) return 0; vmfifowr(vm, Xrectropcopy); vmfifowr(vm, r.max.x); vmfifowr(vm, r.max.y); vmfifowr(vm, r.min.x); vmfifowr(vm, r.min.y); vmfifowr(vm, sr.min.x - r.min.x); vmfifowr(vm, sr.min.y - r.min.y); vmfifowr(vm, 3); /* code for copy */ vmwait(vm); return 1; } static int vmwarefill(VGAscr*, Rectangle r, ulong sval) { if(vm->mmio == nil) return 0; vmfifowr(vm, Xrectfill); vmfifowr(vm, sval); vmfifowr(vm, r.min.x); vmfifowr(vm, r.min.y); vmfifowr(vm, r.max.x-r.min.x); vmfifowr(vm, r.max.y-r.min.y); vmwait(vm); return 1; } . 157a vmwr(vm, Rcursorid, 1); vmwr(vm, Rcursoron, CursorOnShow); . 155a vmwaredisable(VGAscr*) { vmwr(vm, Rcursorid, 1); vmwr(vm, Rcursoron, CursorOnHide); } static void . 151a vmwr(vm, Rcursorid, 1); vmwr(vm, Rcursorx, p.x); vmwr(vm, Rcursory, p.y); vmwr(vm, Rcursoron, CursorOnShow); . 150c vmwaremove(VGAscr*, Point p) . 148a static void vmwareload(VGAscr*, Cursor *c) { int i; ulong clr, set; ulong and[16]; ulong xor[16]; if(vm->mmio == nil) return; vmfifowr(vm, Xdefinecursor); vmfifowr(vm, 1); /* cursor id */ vmfifowr(vm, -c->offset.x); vmfifowr(vm, -c->offset.y); vmfifowr(vm, 16); /* width */ vmfifowr(vm, 16); /* height */ vmfifowr(vm, 1); /* depth for and mask */ vmfifowr(vm, 1); /* depth for xor mask */ for(i=0; i<16; i++){ clr = (c->clr[i*2+1]<<8) | c->clr[i*2]; set = (c->set[i*2+1]<<8) | c->set[i*2]; and[i] = ~(clr|set); /* clr and set pixels => black */ xor[i] = clr&~set; /* clr pixels => white */ } for(i=0; i<16; i++) vmfifowr(vm, and[i]); for(i=0; i<16; i++) vmfifowr(vm, xor[i]); vmwait(vm); } . 146a if(vm->mmio == nil) return; vmfifowr(vm, Xupdate); vmfifowr(vm, r.min.x); vmfifowr(vm, r.min.y); vmfifowr(vm, r.max.x-r.min.x); vmfifowr(vm, r.max.y-r.min.y); vmwait(vm); . 145c vmwareflush(VGAscr*, Rectangle r) . 141a ulong *mm; mm = vm->mmio; if(mm == nil){ iprint("!"); return; } if(mm[FifoNextCmd]+sizeof(ulong) == mm[FifoStop] || (mm[FifoNextCmd]+sizeof(ulong) == mm[FifoMax] && mm[FifoStop] == mm[FifoMin])) vmwait(vm); mm[mm[FifoNextCmd]/sizeof(ulong)] = v; mm[FifoNextCmd] += sizeof(ulong); if(mm[FifoNextCmd]==mm[FifoMax]) mm[FifoNextCmd] = mm[FifoMin]; . 140c vmfifowr(Vmware *vm, ulong v) . 135a . 132a iprint("aperture %lux size %lux\n", aperture, *size); . 131a } . 130a { memset((void*)KADDR(aperture), 0x7F, 1048576); . 99a iprint("osize %d oaperture %.8lux oapsize %d wasupamem %d\n", osize, oaperture, oapsize, wasupamem); . 86a static void vmwait(Vmware *vm) { vmwr(vm, Rsync, 1); while(vmrd(vm, Rbusy)) ; } . 64a ulong *mmio; ulong mmiosize; . 58d 52a Crectfill = 1<<0, Crectcopy = 1<<1, Crectpatfill = 1<<2, Coffscreen = 1<<3, Crasterop = 1<<4, Ccursor = 1<<5, Ccursorbypass = 1<<6, Ccursorbypass2 = 1<<7, C8bitemulation = 1<<8, Calphacursor = 1<<9, FifoMin = 0, FifoMax = 1, FifoNextCmd = 2, FifoStop = 3, FifoUser = 4, Xupdate = 1, Xrectfill = 2, Xrectcopy = 3, Xdefinebitmap = 4, Xdefinebitmapscanline = 5, Xdefinepixmap = 6, Xdefinepixmapscanline = 7, Xrectbitmapfill = 8, Xrectpixmapfill = 9, Xrectbitmapcopy = 10, Xrectpixmapcopy = 11, Xfreeobject = 12, Xrectropfill = 13, Xrectropcopy = 14, Xrectropbitmapfill = 15, Xrectroppixmapfill = 16, Xrectropbitmapcopy = 17, Xrectroppixmapcopy = 18, Xdefinecursor = 19, Xdisplaycursor = 20, Xmovecursor = 21, Xdefinealphacursor = 22, Xcmdmax = 23, CursorOnHide = 0, CursorOnShow = 1, CursorOnRemoveFromFb = 2, CursorOnRestoreToFb = 3, . 47a . 42a . 37a . 32a . 27a . ## diffname pc/vgavmware.c 2002/0405 ## diff -e /n/emeliedump/2002/0404/sys/src/9/pc/vgavmware.c /n/emeliedump/2002/0405/sys/src/9/pc/vgavmware.c 352d 349d 346,347c if(mmiobase == 0) . 341,343d 314,316c vmfifowr(vm, Dx(r)); vmfifowr(vm, Dy(r)); . 309,311c vmfifowr(vm, Xrectcopy); vmfifowr(vm, sr.min.x); vmfifowr(vm, sr.min.y); . 197d 195d 192,193d 160d ## diffname pc/vgavmware.c 2002/0501 ## diff -e /n/emeliedump/2002/0405/sys/src/9/pc/vgavmware.c /n/emeliedump/2002/0501/sys/src/9/pc/vgavmware.c 355a offset = vmrd(vm, Rfboffset); scr->gscreendata->bdata += offset; . 332a ulong offset; .