2 #include "../port/lib.h"
7 #include "../port/pci.h"
8 #include "../port/error.h"
17 PCIVMWARE = 0x15AD, /* PCI VID */
19 VMWARE1 = 0x0710, /* PCI DID */
39 Rfbstart, /* deprecated */
45 Rmemstart, /* deprecated */
69 Xdefinebitmapscanline = 5,
71 Xdefinepixmapscanline = 7,
79 Xrectropbitmapfill = 15,
80 Xrectroppixmapfill = 16,
81 Xrectropbitmapcopy = 17,
82 Xrectroppixmapcopy = 18,
86 Xdefinealphacursor = 22,
91 CursorOnRemoveFromFb = 2,
92 CursorOnRestoreToFb = 3,
97 typedef struct Vmware Vmware;
117 vmrd(Vmware *vm, int i)
124 vmwr(Vmware *vm, int i, ulong v)
134 while(vmrd(vm, Rbusy))
139 vmwarelinear(VGAscr* scr, int, int)
144 if(p == nil || p->vid != PCIVMWARE)
146 if(p->mem[1].bar & 1)
157 if((p->mem[0].bar & 1) == 0)
160 vm->ra = p->mem[0].bar & ~3;
164 // vm->fb = vmrd(vm, Rfbstart);
165 vm->fb = p->mem[1].bar & ~0xF;
166 vm->fb += vmrd(vm, Rfboffset);
167 vgalinearaddr(scr, vm->fb, vmrd(vm, Rfbmaxsize));
169 addvgaseg("vmwarescreen", scr->paddr, scr->apsize);
175 if(p->mem[2].bar & 1)
177 // mmiobase = vmrd(vm, Rmemstart);
178 mmiobase = p->mem[2].bar & ~0xF;
181 mmiosize = vmrd(vm, Rmemsize);
182 scr->mmio = vmap(mmiobase, mmiosize);
185 vm->mmio = scr->mmio;
186 vm->mmiosize = mmiosize;
187 addvgaseg("vmwaremmio", mmiobase, mmiosize);
189 scr->mmio[FifoMin] = 4*sizeof(ulong);
190 scr->mmio[FifoMax] = vm->mmiosize;
191 scr->mmio[FifoNextCmd] = 4*sizeof(ulong);
192 scr->mmio[FifoStop] = 4*sizeof(ulong);
193 vmwr(vm, Rconfigdone, 1);
197 vmfifowr(Vmware *vm, ulong v)
202 if(mm[FifoNextCmd]+sizeof(ulong) == mm[FifoStop]
203 || (mm[FifoNextCmd]+sizeof(ulong) == mm[FifoMax]
204 && mm[FifoStop] == mm[FifoMin]))
207 mm[mm[FifoNextCmd]/sizeof(ulong)] = v;
209 /* must do this way so mm[FifoNextCmd] is never mm[FifoMax] */
210 v = mm[FifoNextCmd] + sizeof(ulong);
217 vmwareflush(VGAscr*, Rectangle r)
222 vmfifowr(vm, Xupdate);
223 vmfifowr(vm, r.min.x);
224 vmfifowr(vm, r.min.y);
225 vmfifowr(vm, r.max.x-r.min.x);
226 vmfifowr(vm, r.max.y-r.min.y);
231 vmwareload(VGAscr*, Cursor *c)
241 vmfifowr(vm, Xdefinecursor);
242 vmfifowr(vm, 1); /* cursor id */
243 vmfifowr(vm, -c->offset.x);
244 vmfifowr(vm, -c->offset.y);
246 vmfifowr(vm, 16); /* width */
247 vmfifowr(vm, 16); /* height */
248 vmfifowr(vm, 1); /* depth for and mask */
249 vmfifowr(vm, 1); /* depth for xor mask */
252 clr = (c->clr[i*2+1]<<8) | c->clr[i*2];
253 set = (c->set[i*2+1]<<8) | c->set[i*2];
254 and[i] = ~(clr|set); /* clr and set pixels => black */
255 xor[i] = clr&~set; /* clr pixels => white */
258 vmfifowr(vm, and[i]);
260 vmfifowr(vm, xor[i]);
266 vmwaremove(VGAscr*, Point p)
270 vmwr(vm, Rcursorid, 1);
271 vmwr(vm, Rcursorx, p.x);
272 vmwr(vm, Rcursory, p.y);
273 vmwr(vm, Rcursoron, CursorOnShow);
278 vmwaredisable(VGAscr*)
282 vmwr(vm, Rcursorid, 1);
283 vmwr(vm, Rcursoron, CursorOnHide);
287 vmwareenable(VGAscr*)
291 vmwr(vm, Rcursorid, 1);
292 vmwr(vm, Rcursoron, CursorOnShow);
296 vmwarescroll(VGAscr*, Rectangle r, Rectangle sr)
300 vmfifowr(vm, Xrectcopy);
301 vmfifowr(vm, sr.min.x);
302 vmfifowr(vm, sr.min.y);
303 vmfifowr(vm, r.min.x);
304 vmfifowr(vm, r.min.y);
312 vmwarefill(VGAscr*, Rectangle r, ulong sval)
316 vmfifowr(vm, Xrectfill);
318 vmfifowr(vm, r.min.x);
319 vmfifowr(vm, r.min.y);
320 vmfifowr(vm, r.max.x-r.min.x);
321 vmfifowr(vm, r.max.y-r.min.y);
327 vmwaredrawinit(VGAscr *scr)
329 scr->scroll = vmwarescroll;
331 scr->fill = vmwarefill;
334 VGAdev vgavmwaredev = {
347 VGAcur vgavmwarecur = {