vgavmware: fix hardware acceleration (fill is not available with SVGA2)
This commit is contained in:
parent
dbc4833d10
commit
d1f1be9c57
2 changed files with 52 additions and 72 deletions
|
@ -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;
|
||||||
|
if(vm->ver == 1)
|
||||||
scr->fill = vmwarefill;
|
scr->fill = vmwarefill;
|
||||||
|
|
||||||
offset = vmrd(vm, Rfboffset);
|
|
||||||
scr->gscreendata->bdata += offset;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VGAdev vgavmwaredev = {
|
VGAdev vgavmwaredev = {
|
||||||
"vmware",
|
"vmware",
|
||||||
|
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue