]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/9/pc/vgavmware.c
kernel: cleanup the software mouse cursor mess
[plan9front.git] / sys / src / 9 / pc / vgavmware.c
old mode 100755 (executable)
new mode 100644 (file)
index 60c8cfa..710da15
@@ -35,13 +35,13 @@ enum {
        Rgmask,
        Rbmask,
        Rbpl,
-       Rfbstart,
+       Rfbstart,       /* deprecated */
        Rfboffset,
 
        Rfbmaxsize,
        Rfbsize,
        Rcap,
-       Rmemstart,
+       Rmemstart,      /* deprecated */
        Rmemsize,
 
        Rconfigdone,
@@ -55,17 +55,6 @@ enum {
        Rcursoron,
        Nreg,
 
-       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,
@@ -117,6 +106,7 @@ struct Vmware {
 
        char    chan[32];
        int     depth;
+       int     ver;
 };
 
 Vmware xvm;
@@ -147,38 +137,52 @@ vmwait(Vmware *vm)
 static void
 vmwarelinear(VGAscr* scr, int, int)
 {
-       char err[64];
        Pcidev *p;
 
-       err[0] = 0;
-       p = nil;
-       while((p = pcimatch(p, PCIVMWARE, 0)) != nil){
-               if(p->ccrb != Pcibcdisp)
-                       continue;
-               switch(p->did){
-               default:
-                       snprint(err, sizeof err, "unknown vmware pci did %.4ux",
-                               p->did);
-                       continue;
-                       
-               case VMWARE1:
-                       vm->ra = 0x4560;
-                       vm->rd = 0x4560 + 4;
-                       break;
-       
-               case VMWARE2:
-                       vm->ra = p->mem[0].bar & ~3;
-                       vm->rd = vm->ra + 1;
-                       break;
-               }
-               break;                  /* found a card, p is set */
+       p = scr->pci;
+       if(p == nil || p->vid != PCIVMWARE)
+               return;
+       switch(p->did){
+       default:
+               return;
+       case VMWARE1:
+               vm->ver = 1;
+               vm->ra = 0x4560;
+               vm->rd = 0x4560 + 4;
+               break;
+       case VMWARE2:
+               vm->ver = 2;
+               vm->ra = p->mem[0].bar & ~3;
+               vm->rd = vm->ra + 1;
+               break;
        }
-       if(p == nil)
-               error(err[0]? err: "no vmware vga card found");
-
-       vgalinearaddr(scr, vmrd(vm, Rfbstart), vmrd(vm, Rfbsize));
+       // vm->fb = vmrd(vm, Rfbstart);
+       vm->fb = p->mem[1].bar & ~0xF;
+       vm->fb += vmrd(vm, Rfboffset);
+       vgalinearaddr(scr, vm->fb, vmrd(vm, Rfbmaxsize));
        if(scr->apsize)
                addvgaseg("vmwarescreen", scr->paddr, scr->apsize);
+
+       if(scr->mmio==nil){
+               ulong mmiobase, mmiosize;
+
+               // mmiobase = vmrd(vm, Rmemstart);
+               mmiobase = p->mem[2].bar & ~0xF;
+               if(mmiobase == 0)
+                       return;
+               mmiosize = vmrd(vm, Rmemsize);
+               scr->mmio = vmap(mmiobase, mmiosize);
+               if(scr->mmio == nil)
+                       return;
+               vm->mmio = scr->mmio;
+               vm->mmiosize = mmiosize;
+               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);
 }
 
 static void
@@ -187,11 +191,6 @@ vmfifowr(Vmware *vm, ulong v)
        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]))
@@ -230,6 +229,7 @@ vmwareload(VGAscr*, Cursor *c)
 
        if(vm->mmio == nil)
                return;
+
        vmfifowr(vm, Xdefinecursor);
        vmfifowr(vm, 1);        /* cursor id */
        vmfifowr(vm, -c->offset.x);
@@ -257,6 +257,8 @@ vmwareload(VGAscr*, Cursor *c)
 static int
 vmwaremove(VGAscr*, Point p)
 {
+       if(vm->mmio == nil)
+               return 1;
        vmwr(vm, Rcursorid, 1);
        vmwr(vm, Rcursorx, p.x);
        vmwr(vm, Rcursory, p.y);
@@ -267,6 +269,8 @@ vmwaremove(VGAscr*, Point p)
 static void
 vmwaredisable(VGAscr*)
 {
+       if(vm->mmio == nil)
+               return;
        vmwr(vm, Rcursorid, 1);
        vmwr(vm, Rcursoron, CursorOnHide);
 }
@@ -274,15 +278,12 @@ vmwaredisable(VGAscr*)
 static void
 vmwareenable(VGAscr*)
 {
+       if(vm->mmio == nil)
+               return;
        vmwr(vm, Rcursorid, 1);
        vmwr(vm, Rcursoron, CursorOnShow);
 }
 
-static void
-vmwareblank(int)
-{
-}
-
 static int
 vmwarescroll(VGAscr*, Rectangle r, Rectangle sr)
 {
@@ -317,38 +318,13 @@ vmwarefill(VGAscr*, Rectangle r, ulong sval)
 static void
 vmwaredrawinit(VGAscr *scr)
 {
-       ulong offset;
-       ulong mmiobase, mmiosize;
-
-       if(scr->mmio==nil){
-               mmiobase = vmrd(vm, Rmemstart);
-               if(mmiobase == 0)
-                       return;
-               mmiosize = vmrd(vm, Rmemsize);
-               scr->mmio = vmap(mmiobase, mmiosize);
-               if(scr->mmio == nil)
-                       return;
-               vm->mmio = scr->mmio;
-               vm->mmiosize = mmiosize;
-               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;
-
-       offset = vmrd(vm, Rfboffset);
-       scr->gscreendata->bdata += offset;
+       if(vm->ver == 1)
+               scr->fill = vmwarefill;
 }
 
 VGAdev vgavmwaredev = {
        "vmware",
-
        0,
        0,
        0,