2 #include "../port/lib.h"
7 #include "../port/error.h"
16 PCIVMWARE = 0x15AD, /* PCI VID */
18 VMWARE1 = 0x0710, /* PCI DID */
38 Rfbstart, /* deprecated */
44 Rmemstart, /* deprecated */
68 Xdefinebitmapscanline = 5,
70 Xdefinepixmapscanline = 7,
78 Xrectropbitmapfill = 15,
79 Xrectroppixmapfill = 16,
80 Xrectropbitmapcopy = 17,
81 Xrectroppixmapcopy = 18,
85 Xdefinealphacursor = 22,
90 CursorOnRemoveFromFb = 2,
91 CursorOnRestoreToFb = 3,
96 typedef struct Vmware Vmware;
116 vmrd(Vmware *vm, int i)
123 vmwr(Vmware *vm, int i, ulong v)
133 while(vmrd(vm, Rbusy))
138 vmwarelinear(VGAscr* scr, int, int)
145 while((p = pcimatch(p, PCIVMWARE, 0)) != nil){
146 if(p->ccrb != Pcibcdisp)
150 snprint(err, sizeof err, "unknown vmware pci did %.4ux",
160 vm->ra = p->mem[0].bar & ~3;
164 break; /* found a card, p is set */
167 error(err[0]? err: "no vmware vga card found");
168 // vm->fb = vmrd(vm, Rfbstart);
169 vm->fb = p->mem[1].bar & ~0xF;
170 vm->fb += vmrd(vm, Rfboffset);
171 vgalinearaddr(scr, vm->fb, vmrd(vm, Rfbmaxsize));
173 addvgaseg("vmwarescreen", scr->paddr, scr->apsize);
176 ulong mmiobase, mmiosize;
178 // mmiobase = vmrd(vm, Rmemstart);
179 mmiobase = p->mem[2].bar & ~0xF;
182 mmiosize = vmrd(vm, Rmemsize);
183 scr->mmio = vmap(mmiobase, mmiosize);
186 vm->mmio = scr->mmio;
187 vm->mmiosize = mmiosize;
188 addvgaseg("vmwaremmio", mmiobase, mmiosize);
190 scr->mmio[FifoMin] = 4*sizeof(ulong);
191 scr->mmio[FifoMax] = vm->mmiosize;
192 scr->mmio[FifoNextCmd] = 4*sizeof(ulong);
193 scr->mmio[FifoStop] = 4*sizeof(ulong);
194 vmwr(vm, Rconfigdone, 1);
198 vmfifowr(Vmware *vm, ulong v)
203 if(mm[FifoNextCmd]+sizeof(ulong) == mm[FifoStop]
204 || (mm[FifoNextCmd]+sizeof(ulong) == mm[FifoMax]
205 && mm[FifoStop] == mm[FifoMin]))
208 mm[mm[FifoNextCmd]/sizeof(ulong)] = v;
210 /* must do this way so mm[FifoNextCmd] is never mm[FifoMax] */
211 v = mm[FifoNextCmd] + sizeof(ulong);
218 vmwareflush(VGAscr*, Rectangle r)
223 vmfifowr(vm, Xupdate);
224 vmfifowr(vm, r.min.x);
225 vmfifowr(vm, r.min.y);
226 vmfifowr(vm, r.max.x-r.min.x);
227 vmfifowr(vm, r.max.y-r.min.y);
232 vmwareload(VGAscr*, Cursor *c)
242 vmfifowr(vm, Xdefinecursor);
243 vmfifowr(vm, 1); /* cursor id */
244 vmfifowr(vm, -c->offset.x);
245 vmfifowr(vm, -c->offset.y);
247 vmfifowr(vm, 16); /* width */
248 vmfifowr(vm, 16); /* height */
249 vmfifowr(vm, 1); /* depth for and mask */
250 vmfifowr(vm, 1); /* depth for xor mask */
253 clr = (c->clr[i*2+1]<<8) | c->clr[i*2];
254 set = (c->set[i*2+1]<<8) | c->set[i*2];
255 and[i] = ~(clr|set); /* clr and set pixels => black */
256 xor[i] = clr&~set; /* clr pixels => white */
259 vmfifowr(vm, and[i]);
261 vmfifowr(vm, xor[i]);
267 vmwaremove(VGAscr*, Point p)
271 vmwr(vm, Rcursorid, 1);
272 vmwr(vm, Rcursorx, p.x);
273 vmwr(vm, Rcursory, p.y);
274 vmwr(vm, Rcursoron, CursorOnShow);
279 vmwaredisable(VGAscr*)
283 vmwr(vm, Rcursorid, 1);
284 vmwr(vm, Rcursoron, CursorOnHide);
288 vmwareenable(VGAscr*)
292 vmwr(vm, Rcursorid, 1);
293 vmwr(vm, Rcursoron, CursorOnShow);
297 vmwarescroll(VGAscr*, Rectangle r, Rectangle sr)
301 vmfifowr(vm, Xrectcopy);
302 vmfifowr(vm, sr.min.x);
303 vmfifowr(vm, sr.min.y);
304 vmfifowr(vm, r.min.x);
305 vmfifowr(vm, r.min.y);
313 vmwarefill(VGAscr*, Rectangle r, ulong sval)
317 vmfifowr(vm, Xrectfill);
319 vmfifowr(vm, r.min.x);
320 vmfifowr(vm, r.min.y);
321 vmfifowr(vm, r.max.x-r.min.x);
322 vmfifowr(vm, r.max.y-r.min.y);
328 vmwaredrawinit(VGAscr *scr)
330 scr->scroll = vmwarescroll;
332 scr->fill = vmwarefill;
335 VGAdev vgavmwaredev = {
348 VGAcur vgavmwarecur = {