summaryrefslogtreecommitdiff
path: root/sys/src/cmd/aux/vga
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2015-01-09 22:23:25 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2015-01-09 22:23:25 +0100
commit15590e39c6be92d8a9ecb2f00b015dbb9a3dc0b0 (patch)
tree1ecc8859409aae2446f7cb23ca8ad672878846a3 /sys/src/cmd/aux/vga
parentcf76346b37ddbd54b8d1fe5580ab813a8165392b (diff)
igfx: implement hardware cursor
this can even be used with the vesa driver, just enable the cursor after mode switch like: echo hwgc igfxhwgc >/dev/vgactl
Diffstat (limited to 'sys/src/cmd/aux/vga')
-rw-r--r--sys/src/cmd/aux/vga/data.c3
-rw-r--r--sys/src/cmd/aux/vga/igfx.c60
-rw-r--r--sys/src/cmd/aux/vga/vga.h1
3 files changed, 42 insertions, 22 deletions
diff --git a/sys/src/cmd/aux/vga/data.c b/sys/src/cmd/aux/vga/data.c
index 306a5c010..f55ac5efd 100644
--- a/sys/src/cmd/aux/vga/data.c
+++ b/sys/src/cmd/aux/vga/data.c
@@ -41,6 +41,8 @@ Ctlr* ctlrs[] = {
&ics2494, /* clock */
&ics2494a, /* clock */
&ics534x, /* gendac */
+ &igfx, /* ctlr */
+ &igfxhwgc, /* hwgc */
&mach32, /* ctlr */
&mach64, /* ctlr */
&mach64xx, /* ctlr */
@@ -87,7 +89,6 @@ Ctlr* ctlrs[] = {
&w30c516, /* ctlr */
&mga4xx,
&mga4xxhwgc,
- &igfx, /* ctlr */
0,
};
diff --git a/sys/src/cmd/aux/vga/igfx.c b/sys/src/cmd/aux/vga/igfx.c
index e650d385f..86a7bd25e 100644
--- a/sys/src/cmd/aux/vga/igfx.c
+++ b/sys/src/cmd/aux/vga/igfx.c
@@ -11,6 +11,7 @@ typedef struct Hdmi Hdmi;
typedef struct Dp Dp;
typedef struct Fdi Fdi;
typedef struct Pfit Pfit;
+typedef struct Curs Curs;
typedef struct Plane Plane;
typedef struct Trans Trans;
typedef struct Pipe Pipe;
@@ -93,6 +94,12 @@ struct Plane {
Reg tileoff; /* DSPxTILEOFF */
};
+struct Curs {
+ Reg cntr;
+ Reg base;
+ Reg pos;
+};
+
struct Pipe {
Trans;
@@ -101,7 +108,7 @@ struct Pipe {
Fdi fdi[1]; /* fdi/dp transcoder */
Plane dsp[1]; /* display plane */
- Plane cur[1]; /* cursor plane */
+ Curs cur[1]; /* hardware cursor */
Pfit *pfit; /* selected panel fitter */
};
@@ -266,11 +273,13 @@ snarfpipe(Igfx *igfx, int x)
switch(igfx->type){
case TypeIVB:
p->cur->cntr = snarfreg(igfx, 0x70080 | x*0x1000);
- p->cur->surf = snarfreg(igfx, 0x70084 | x*0x1000);
+ p->cur->base = snarfreg(igfx, 0x70084 | x*0x1000);
+ p->cur->pos = snarfreg(igfx, 0x70088 | x*0x1000);
break;
case TypeG45:
p->cur->cntr = snarfreg(igfx, 0x70080 | x*0x40);
- p->cur->surf = snarfreg(igfx, 0x70084 | x*0x40);
+ p->cur->base = snarfreg(igfx, 0x70084 | x*0x40);
+ p->cur->pos = snarfreg(igfx, 0x7008C | x*0x40);
break;
}
}
@@ -734,8 +743,9 @@ init(Vga* vga, Ctlr* ctlr)
p->dsp->tileoff.v = 0;
/* cursor plane off */
- p->cur->cntr.v = 0;
- p->cur->surf.v = 0;
+ p->cur->cntr.v = x<<28;
+ p->cur->pos.v = 0;
+ p->cur->base.v = 0;
if(initdpll(igfx, x, m->frequency, islvds, 0) < 0)
error("%s: frequency %d out of range\n", ctlr->name, m->frequency);
@@ -841,8 +851,10 @@ enablepipe(Igfx *igfx, int x)
loadreg(igfx, p->dsp->tileoff);
loadreg(igfx, p->dsp->surf); /* arm */
+ /* program cursor */
loadreg(igfx, p->cur->cntr);
- loadreg(igfx, p->cur->surf); /* arm */
+ loadreg(igfx, p->cur->pos);
+ loadreg(igfx, p->cur->base); /* arm */
if(0){
/* enable fdi */
@@ -897,8 +909,9 @@ disablepipe(Igfx *igfx, int x)
/* planes off */
csr(igfx, p->dsp->cntr.a, 1<<31, 0);
csr(igfx, p->dsp->surf.a, ~0, 0); /* arm */
- csr(igfx, p->cur->cntr.a, 1<<31, 0);
- csr(igfx, p->cur->surf.a, ~0, 0); /* arm */
+ /* cursor off */
+ csr(igfx, p->cur->cntr.a, 1<<5 | 7, 0);
+ csr(igfx, p->cur->base.a, ~0, 0); /* arm */
/* disable cpu pipe */
disabletrans(igfx, p);
@@ -1088,7 +1101,8 @@ dumppipe(Igfx *igfx, int x)
snprint(name, sizeof(name), "%s cur %c", igfx->ctlr->name, 'a'+x);
dumpreg(name, "cntr", p->cur->cntr);
- dumpreg(name, "surf", p->cur->surf);
+ dumpreg(name, "base", p->cur->base);
+ dumpreg(name, "pos", p->cur->pos);
}
static void
@@ -1118,25 +1132,25 @@ dump(Vga* vga, Ctlr* ctlr)
dumpreg(ctlr->name, "ssc4params", igfx->ssc4params);
for(x=0; x<nelem(igfx->dp); x++){
- snprint(name, sizeof(name), "dp %c ctl", 'a'+x);
- dumpreg(ctlr->name, name, igfx->dp[x].ctl);
+ snprint(name, sizeof(name), "%s dp %c", ctlr->name, 'a'+x);
+ dumpreg(name, "ctl", igfx->dp[x].ctl);
}
for(x=0; x<nelem(igfx->hdmi); x++){
- snprint(name, sizeof(name), "hdmi %c ctl ", 'a'+x);
- dumpreg(ctlr->name, name, igfx->hdmi[x].ctl);
+ snprint(name, sizeof(name), "%s hdmi %c", ctlr->name, 'a'+x);
+ dumpreg(name, "ctl", igfx->hdmi[x].ctl);
}
for(x=0; x<nelem(igfx->pfit); x++){
- snprint(name, sizeof(name), "pfit %c ctrl", 'a'+x);
- dumpreg(ctlr->name, name, igfx->pfit[x].ctrl);
- snprint(name, sizeof(name), "pfit %c winpos", 'a'+x);
- dumpreg(ctlr->name, name, igfx->pfit[x].winpos);
- snprint(name, sizeof(name), "pfit %c winsize", 'a'+x);
- dumpreg(ctlr->name, name, igfx->pfit[x].winsize);
- snprint(name, sizeof(name), "pfit %c pwrgate", 'a'+x);
- dumpreg(ctlr->name, name, igfx->pfit[x].pwrgate);
+ snprint(name, sizeof(name), "%s pfit %c", ctlr->name, 'a'+x);
+ dumpreg(name, "ctrl", igfx->pfit[x].ctrl);
+ dumpreg(name, "winpos", igfx->pfit[x].winpos);
+ dumpreg(name, "winsize", igfx->pfit[x].winsize);
+ dumpreg(name, "pwrgate", igfx->pfit[x].pwrgate);
}
+ dumpreg(ctlr->name, "ppcontrol", igfx->ppcontrol);
+ dumpreg(ctlr->name, "ppstatus", igfx->ppstatus);
+
dumpreg(ctlr->name, "adpa", igfx->adpa);
dumpreg(ctlr->name, "lvds", igfx->lvds);
dumpreg(ctlr->name, "sdvob", igfx->sdvob);
@@ -1153,3 +1167,7 @@ Ctlr igfx = {
load, /* load */
dump, /* dump */
};
+
+Ctlr igfxhwgc = {
+ "igfxhwgc",
+};
diff --git a/sys/src/cmd/aux/vga/vga.h b/sys/src/cmd/aux/vga/vga.h
index 51efa2438..f479edf30 100644
--- a/sys/src/cmd/aux/vga/vga.h
+++ b/sys/src/cmd/aux/vga/vga.h
@@ -311,6 +311,7 @@ extern Ctlr geodehwgc;
/* igfx.c */
extern Ctlr igfx;
+extern Ctlr igfxhwgc;
/* mach32.c */
extern Ctlr mach32;