vgavmware: fix hardware acceleration (fill is not available with SVGA2)

This commit is contained in:
cinap_lenrek 2012-08-10 15:17:27 +02:00
parent dbc4833d10
commit d1f1be9c57
2 changed files with 52 additions and 72 deletions

View file

@ -35,13 +35,13 @@ enum {
Rgmask, Rgmask,
Rbmask, Rbmask,
Rbpl, Rbpl,
Rfbstart, Rfbstart, /* deprecated */
Rfboffset, Rfboffset,
Rfbmaxsize, Rfbmaxsize,
Rfbsize, Rfbsize,
Rcap, Rcap,
Rmemstart, Rmemstart, /* deprecated */
Rmemsize, Rmemsize,
Rconfigdone, Rconfigdone,
@ -55,17 +55,6 @@ enum {
Rcursoron, Rcursoron,
Nreg, 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, FifoMin = 0,
FifoMax = 1, FifoMax = 1,
FifoNextCmd = 2, FifoNextCmd = 2,
@ -117,6 +106,7 @@ struct Vmware {
char chan[32]; char chan[32];
int depth; int depth;
int ver;
}; };
Vmware xvm; Vmware xvm;
@ -160,13 +150,13 @@ vmwarelinear(VGAscr* scr, int, int)
snprint(err, sizeof err, "unknown vmware pci did %.4ux", snprint(err, sizeof err, "unknown vmware pci did %.4ux",
p->did); p->did);
continue; continue;
case VMWARE1: case VMWARE1:
vm->ver = 1;
vm->ra = 0x4560; vm->ra = 0x4560;
vm->rd = 0x4560 + 4; vm->rd = 0x4560 + 4;
break; break;
case VMWARE2: case VMWARE2:
vm->ver = 2;
vm->ra = p->mem[0].bar & ~3; vm->ra = p->mem[0].bar & ~3;
vm->rd = vm->ra + 1; vm->rd = vm->ra + 1;
break; break;
@ -175,10 +165,33 @@ vmwarelinear(VGAscr* scr, int, int)
} }
if(p == nil) if(p == nil)
error(err[0]? err: "no vmware vga card found"); error(err[0]? err: "no vmware vga card found");
// vm->fb = vmrd(vm, Rfbstart);
vgalinearaddr(scr, vmrd(vm, Rfbstart), vmrd(vm, Rfbsize)); vm->fb = p->mem[1].bar & ~0xF;
vm->fb += vmrd(vm, Rfboffset);
vgalinearaddr(scr, vm->fb, vmrd(vm, Rfbmaxsize));
if(scr->apsize) if(scr->apsize)
addvgaseg("vmwarescreen", scr->paddr, 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 static void
@ -187,11 +200,6 @@ vmfifowr(Vmware *vm, ulong v)
ulong *mm; ulong *mm;
mm = vm->mmio; mm = vm->mmio;
if(mm == nil){
iprint("!");
return;
}
if(mm[FifoNextCmd]+sizeof(ulong) == mm[FifoStop] if(mm[FifoNextCmd]+sizeof(ulong) == mm[FifoStop]
|| (mm[FifoNextCmd]+sizeof(ulong) == mm[FifoMax] || (mm[FifoNextCmd]+sizeof(ulong) == mm[FifoMax]
&& mm[FifoStop] == mm[FifoMin])) && mm[FifoStop] == mm[FifoMin]))
@ -230,6 +238,7 @@ vmwareload(VGAscr*, Cursor *c)
if(vm->mmio == nil) if(vm->mmio == nil)
return; return;
vmfifowr(vm, Xdefinecursor); vmfifowr(vm, Xdefinecursor);
vmfifowr(vm, 1); /* cursor id */ vmfifowr(vm, 1); /* cursor id */
vmfifowr(vm, -c->offset.x); vmfifowr(vm, -c->offset.x);
@ -257,6 +266,8 @@ vmwareload(VGAscr*, Cursor *c)
static int static int
vmwaremove(VGAscr*, Point p) vmwaremove(VGAscr*, Point p)
{ {
if(vm->mmio == nil)
return 1;
vmwr(vm, Rcursorid, 1); vmwr(vm, Rcursorid, 1);
vmwr(vm, Rcursorx, p.x); vmwr(vm, Rcursorx, p.x);
vmwr(vm, Rcursory, p.y); vmwr(vm, Rcursory, p.y);
@ -267,6 +278,8 @@ vmwaremove(VGAscr*, Point p)
static void static void
vmwaredisable(VGAscr*) vmwaredisable(VGAscr*)
{ {
if(vm->mmio == nil)
return;
vmwr(vm, Rcursorid, 1); vmwr(vm, Rcursorid, 1);
vmwr(vm, Rcursoron, CursorOnHide); vmwr(vm, Rcursoron, CursorOnHide);
} }
@ -274,15 +287,12 @@ vmwaredisable(VGAscr*)
static void static void
vmwareenable(VGAscr*) vmwareenable(VGAscr*)
{ {
if(vm->mmio == nil)
return;
vmwr(vm, Rcursorid, 1); vmwr(vm, Rcursorid, 1);
vmwr(vm, Rcursoron, CursorOnShow); vmwr(vm, Rcursoron, CursorOnShow);
} }
static void
vmwareblank(int)
{
}
static int static int
vmwarescroll(VGAscr*, Rectangle r, Rectangle sr) vmwarescroll(VGAscr*, Rectangle r, Rectangle sr)
{ {
@ -317,38 +327,13 @@ vmwarefill(VGAscr*, Rectangle r, ulong sval)
static void static void
vmwaredrawinit(VGAscr *scr) 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->scroll = vmwarescroll;
scr->fill = vmwarefill; if(vm->ver == 1)
scr->fill = vmwarefill;
offset = vmrd(vm, Rfboffset);
scr->gscreendata->bdata += offset;
} }
VGAdev vgavmwaredev = { VGAdev vgavmwaredev = {
"vmware", "vmware",
0, 0,
0, 0,
0, 0,

View file

@ -5,6 +5,11 @@
#include "pci.h" #include "pci.h"
#include "vga.h" #include "vga.h"
enum {
VMWARE1 = 0x0710, /* PCI DID */
VMWARE2 = 0x0405,
};
enum { enum {
Rid = 0, Rid = 0,
Renable, Renable,
@ -37,25 +42,11 @@ enum {
Rhostbpp, Rhostbpp,
Nreg, 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,
Rpalette = 1024, Rpalette = 1024,
}; };
typedef struct Vmware Vmware; typedef struct Vmware Vmware;
struct Vmware { struct Vmware {
ulong mmio;
ulong fb;
ulong ra; ulong ra;
ulong rd; ulong rd;
@ -63,6 +54,7 @@ struct Vmware {
char chan[32]; char chan[32];
int depth; int depth;
int ver;
}; };
static char* static char*
@ -135,14 +127,15 @@ snarf(Vga* vga, Ctlr* ctlr)
error("%s: vga->pci not set\n", ctlr->name); error("%s: vga->pci not set\n", ctlr->name);
vm = alloc(sizeof(Vmware)); vm = alloc(sizeof(Vmware));
switch(p->did){ switch(p->did){
case 0x710: /* VMware video chipset #1 */ case VMWARE1: /* VMware video chipset #1 */
vm->ver = 1;
vm->ra = 0x4560; vm->ra = 0x4560;
vm->rd = 0x4560+4; vm->rd = 0x4560+4;
break; break;
case 0x405: /* VMware video chipset #2, untested */ case VMWARE2: /* VMware video chipset #2 */
vm->ver = 2;
vm->ra = p->mem[0].bar&~3; vm->ra = p->mem[0].bar&~3;
vm->rd = vm->ra+1; vm->rd = vm->ra+1;
break; break;
@ -177,7 +170,9 @@ snarf(Vga* vga, Ctlr* ctlr)
sprint(vm->chan, "unknown"); sprint(vm->chan, "unknown");
/* Record the frame buffer start, size */ /* Record the frame buffer start, size */
vga->vmb = vm->r[Rfbstart]; // vga->vmb = vm->r[Rfstart];
vga->vmb = p->mem[1].bar & ~0xF;
vga->vmb += vm->r[Rfboffset];
vga->apz = vm->r[Rfbmaxsize]; vga->apz = vm->r[Rfbmaxsize];
vga->private = vm; vga->private = vm;