2 #include "../port/lib.h"
7 #include "../port/error.h"
16 PCIVMWARE = 0x15AD, /* PCI VID */
18 VMWARE1 = 0x0710, /* PCI DID */
65 Ccursorbypass2 = 1<<7,
66 C8bitemulation = 1<<8,
79 Xdefinebitmapscanline = 5,
81 Xdefinepixmapscanline = 7,
89 Xrectropbitmapfill = 15,
90 Xrectroppixmapfill = 16,
91 Xrectropbitmapcopy = 17,
92 Xrectroppixmapcopy = 18,
96 Xdefinealphacursor = 22,
101 CursorOnRemoveFromFb = 2,
102 CursorOnRestoreToFb = 3,
107 typedef struct Vmware Vmware;
126 vmrd(Vmware *vm, int i)
133 vmwr(Vmware *vm, int i, ulong v)
143 while(vmrd(vm, Rbusy))
148 vmwarelinear(VGAscr* scr, int, int)
155 while((p = pcimatch(p, PCIVMWARE, 0)) != nil){
156 if(p->ccrb != Pcibcdisp)
160 snprint(err, sizeof err, "unknown vmware pci did %.4ux",
170 vm->ra = p->mem[0].bar & ~3;
174 break; /* found a card, p is set */
177 error(err[0]? err: "no vmware vga card found");
179 vgalinearaddr(scr, vmrd(vm, Rfbstart), vmrd(vm, Rfbsize));
181 addvgaseg("vmwarescreen", scr->paddr, scr->apsize);
185 vmfifowr(Vmware *vm, ulong v)
195 if(mm[FifoNextCmd]+sizeof(ulong) == mm[FifoStop]
196 || (mm[FifoNextCmd]+sizeof(ulong) == mm[FifoMax]
197 && mm[FifoStop] == mm[FifoMin]))
200 mm[mm[FifoNextCmd]/sizeof(ulong)] = v;
202 /* must do this way so mm[FifoNextCmd] is never mm[FifoMax] */
203 v = mm[FifoNextCmd] + sizeof(ulong);
210 vmwareflush(VGAscr*, Rectangle r)
215 vmfifowr(vm, Xupdate);
216 vmfifowr(vm, r.min.x);
217 vmfifowr(vm, r.min.y);
218 vmfifowr(vm, r.max.x-r.min.x);
219 vmfifowr(vm, r.max.y-r.min.y);
224 vmwareload(VGAscr*, Cursor *c)
233 vmfifowr(vm, Xdefinecursor);
234 vmfifowr(vm, 1); /* cursor id */
235 vmfifowr(vm, -c->offset.x);
236 vmfifowr(vm, -c->offset.y);
238 vmfifowr(vm, 16); /* width */
239 vmfifowr(vm, 16); /* height */
240 vmfifowr(vm, 1); /* depth for and mask */
241 vmfifowr(vm, 1); /* depth for xor mask */
244 clr = (c->clr[i*2+1]<<8) | c->clr[i*2];
245 set = (c->set[i*2+1]<<8) | c->set[i*2];
246 and[i] = ~(clr|set); /* clr and set pixels => black */
247 xor[i] = clr&~set; /* clr pixels => white */
250 vmfifowr(vm, and[i]);
252 vmfifowr(vm, xor[i]);
258 vmwaremove(VGAscr*, Point p)
260 vmwr(vm, Rcursorid, 1);
261 vmwr(vm, Rcursorx, p.x);
262 vmwr(vm, Rcursory, p.y);
263 vmwr(vm, Rcursoron, CursorOnShow);
268 vmwaredisable(VGAscr*)
270 vmwr(vm, Rcursorid, 1);
271 vmwr(vm, Rcursoron, CursorOnHide);
275 vmwareenable(VGAscr*)
277 vmwr(vm, Rcursorid, 1);
278 vmwr(vm, Rcursoron, CursorOnShow);
287 vmwarescroll(VGAscr*, Rectangle r, Rectangle sr)
291 vmfifowr(vm, Xrectcopy);
292 vmfifowr(vm, sr.min.x);
293 vmfifowr(vm, sr.min.y);
294 vmfifowr(vm, r.min.x);
295 vmfifowr(vm, r.min.y);
303 vmwarefill(VGAscr*, Rectangle r, ulong sval)
307 vmfifowr(vm, Xrectfill);
309 vmfifowr(vm, r.min.x);
310 vmfifowr(vm, r.min.y);
311 vmfifowr(vm, r.max.x-r.min.x);
312 vmfifowr(vm, r.max.y-r.min.y);
318 vmwaredrawinit(VGAscr *scr)
321 ulong mmiobase, mmiosize;
324 mmiobase = vmrd(vm, Rmemstart);
327 mmiosize = vmrd(vm, Rmemsize);
328 scr->mmio = vmap(mmiobase, mmiosize);
331 vm->mmio = scr->mmio;
332 vm->mmiosize = mmiosize;
333 addvgaseg("vmwaremmio", mmiobase, mmiosize);
336 scr->mmio[FifoMin] = 4*sizeof(ulong);
337 scr->mmio[FifoMax] = vm->mmiosize;
338 scr->mmio[FifoNextCmd] = 4*sizeof(ulong);
339 scr->mmio[FifoStop] = 4*sizeof(ulong);
340 vmwr(vm, Rconfigdone, 1);
342 scr->scroll = vmwarescroll;
343 scr->fill = vmwarefill;
345 offset = vmrd(vm, Rfboffset);
346 scr->gscreendata->bdata += offset;
349 VGAdev vgavmwaredev = {
363 VGAcur vgavmwarecur = {