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)
143 if(p == nil || p->vid != PCIVMWARE)
155 vm->ra = p->mem[0].bar & ~3;
159 // vm->fb = vmrd(vm, Rfbstart);
160 vm->fb = p->mem[1].bar & ~0xF;
161 vm->fb += vmrd(vm, Rfboffset);
162 vgalinearaddr(scr, vm->fb, vmrd(vm, Rfbmaxsize));
164 addvgaseg("vmwarescreen", scr->paddr, scr->apsize);
167 ulong mmiobase, mmiosize;
169 // mmiobase = vmrd(vm, Rmemstart);
170 mmiobase = p->mem[2].bar & ~0xF;
173 mmiosize = vmrd(vm, Rmemsize);
174 scr->mmio = vmap(mmiobase, mmiosize);
177 vm->mmio = scr->mmio;
178 vm->mmiosize = mmiosize;
179 addvgaseg("vmwaremmio", mmiobase, mmiosize);
181 scr->mmio[FifoMin] = 4*sizeof(ulong);
182 scr->mmio[FifoMax] = vm->mmiosize;
183 scr->mmio[FifoNextCmd] = 4*sizeof(ulong);
184 scr->mmio[FifoStop] = 4*sizeof(ulong);
185 vmwr(vm, Rconfigdone, 1);
189 vmfifowr(Vmware *vm, ulong v)
194 if(mm[FifoNextCmd]+sizeof(ulong) == mm[FifoStop]
195 || (mm[FifoNextCmd]+sizeof(ulong) == mm[FifoMax]
196 && mm[FifoStop] == mm[FifoMin]))
199 mm[mm[FifoNextCmd]/sizeof(ulong)] = v;
201 /* must do this way so mm[FifoNextCmd] is never mm[FifoMax] */
202 v = mm[FifoNextCmd] + sizeof(ulong);
209 vmwareflush(VGAscr*, Rectangle r)
214 vmfifowr(vm, Xupdate);
215 vmfifowr(vm, r.min.x);
216 vmfifowr(vm, r.min.y);
217 vmfifowr(vm, r.max.x-r.min.x);
218 vmfifowr(vm, r.max.y-r.min.y);
223 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)
262 vmwr(vm, Rcursorid, 1);
263 vmwr(vm, Rcursorx, p.x);
264 vmwr(vm, Rcursory, p.y);
265 vmwr(vm, Rcursoron, CursorOnShow);
270 vmwaredisable(VGAscr*)
274 vmwr(vm, Rcursorid, 1);
275 vmwr(vm, Rcursoron, CursorOnHide);
279 vmwareenable(VGAscr*)
283 vmwr(vm, Rcursorid, 1);
284 vmwr(vm, Rcursoron, CursorOnShow);
288 vmwarescroll(VGAscr*, Rectangle r, Rectangle sr)
292 vmfifowr(vm, Xrectcopy);
293 vmfifowr(vm, sr.min.x);
294 vmfifowr(vm, sr.min.y);
295 vmfifowr(vm, r.min.x);
296 vmfifowr(vm, r.min.y);
304 vmwarefill(VGAscr*, Rectangle r, ulong sval)
308 vmfifowr(vm, Xrectfill);
310 vmfifowr(vm, r.min.x);
311 vmfifowr(vm, r.min.y);
312 vmfifowr(vm, r.max.x-r.min.x);
313 vmfifowr(vm, r.max.y-r.min.y);
319 vmwaredrawinit(VGAscr *scr)
321 scr->scroll = vmwarescroll;
323 scr->fill = vmwarefill;
326 VGAdev vgavmwaredev = {
339 VGAcur vgavmwarecur = {