summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-08-10 15:17:27 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2012-08-10 15:17:27 +0200
commitd1f1be9c57b6c7d9e5d826d82b08428590126e15 (patch)
tree72b9db89c2cb86f0d27d6d6f2b3a8c014729eecb
parentdbc4833d1011dcd65091159c21738258b4329590 (diff)
downloadplan9front-d1f1be9c57b6c7d9e5d826d82b08428590126e15.tar.xz
vgavmware: fix hardware acceleration (fill is not available with SVGA2)
-rw-r--r--sys/src/9/pc/vgavmware.c93
-rw-r--r--sys/src/cmd/aux/vga/vmware.c31
2 files changed, 52 insertions, 72 deletions
diff --git a/sys/src/9/pc/vgavmware.c b/sys/src/9/pc/vgavmware.c
index 60c8cfa73..ddb7e523e 100644
--- a/sys/src/9/pc/vgavmware.c
+++ b/sys/src/9/pc/vgavmware.c
@@ -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;
@@ -160,13 +150,13 @@ vmwarelinear(VGAscr* scr, int, int)
snprint(err, sizeof err, "unknown vmware pci did %.4ux",
p->did);
continue;
-
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;
@@ -175,10 +165,33 @@ vmwarelinear(VGAscr* scr, int, int)
}
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 +200,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 +238,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 +266,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 +278,8 @@ vmwaremove(VGAscr*, Point p)
static void
vmwaredisable(VGAscr*)
{
+ if(vm->mmio == nil)
+ return;
vmwr(vm, Rcursorid, 1);
vmwr(vm, Rcursoron, CursorOnHide);
}
@@ -274,15 +287,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 +327,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,
diff --git a/sys/src/cmd/aux/vga/vmware.c b/sys/src/cmd/aux/vga/vmware.c
index 15e0589fb..71b35313b 100644
--- a/sys/src/cmd/aux/vga/vmware.c
+++ b/sys/src/cmd/aux/vga/vmware.c
@@ -6,6 +6,11 @@
#include "vga.h"
enum {
+ VMWARE1 = 0x0710, /* PCI DID */
+ VMWARE2 = 0x0405,
+};
+
+enum {
Rid = 0,
Renable,
Rwidth,
@@ -37,25 +42,11 @@ enum {
Rhostbpp,
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,
};
typedef struct Vmware Vmware;
struct Vmware {
- ulong mmio;
- ulong fb;
-
ulong ra;
ulong rd;
@@ -63,6 +54,7 @@ struct Vmware {
char chan[32];
int depth;
+ int ver;
};
static char*
@@ -135,14 +127,15 @@ snarf(Vga* vga, Ctlr* ctlr)
error("%s: vga->pci not set\n", ctlr->name);
vm = alloc(sizeof(Vmware));
-
switch(p->did){
- case 0x710: /* VMware video chipset #1 */
+ case VMWARE1: /* VMware video chipset #1 */
+ vm->ver = 1;
vm->ra = 0x4560;
vm->rd = 0x4560+4;
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->rd = vm->ra+1;
break;
@@ -177,7 +170,9 @@ snarf(Vga* vga, Ctlr* ctlr)
sprint(vm->chan, "unknown");
/* 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->private = vm;