diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-07-31 23:03:45 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-07-31 23:03:45 +0200 |
commit | 9d59fb28cf117fbdec68420336fc712b7feb09dd (patch) | |
tree | 99bc4ae8479e5ba7c8bee43bb3088124b052e49e /sys/src/cmd/aux/vga/igfx.c | |
parent | 34e2e047ccd8fc6d7f4bbe755fc2945ea89186e6 (diff) |
aux/vga: sandybridge support for igfx (unfinished)
as usual, the dude with the hardware vanished so i cannot
develop this further. setting mode worked the last time
but only when using vesa before, so some bits are still
missing. commiting this as it is so i dont have to start
from scratch once we have hardware again.
Diffstat (limited to 'sys/src/cmd/aux/vga/igfx.c')
-rw-r--r-- | sys/src/cmd/aux/vga/igfx.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/sys/src/cmd/aux/vga/igfx.c b/sys/src/cmd/aux/vga/igfx.c index cd452ab3e..27d19e71b 100644 --- a/sys/src/cmd/aux/vga/igfx.c +++ b/sys/src/cmd/aux/vga/igfx.c @@ -24,6 +24,7 @@ enum { enum { TypeG45, TypeIVB, /* Ivy Bridge */ + TypeSNB, /* Sandy Bridge (unfinished) */ }; enum { @@ -239,6 +240,7 @@ snarftrans(Igfx *igfx, Trans *t, u32int o) } break; case TypeIVB: + case TypeSNB: t->dm[0] = snarfreg(igfx, o + 0x30); t->dn[0] = snarfreg(igfx, o + 0x34); t->dm[1] = snarfreg(igfx, o + 0x38); @@ -264,7 +266,7 @@ snarfpipe(Igfx *igfx, int x) p->src = snarfreg(igfx, o + 0x0001C); - if(igfx->type == TypeIVB) { + if(igfx->type == TypeIVB || igfx->type == TypeSNB) { p->fdi->txctl = snarfreg(igfx, o + 0x100); o = 0xE0000 | x*0x1000; @@ -295,6 +297,7 @@ snarfpipe(Igfx *igfx, int x) /* cursor plane */ switch(igfx->type){ case TypeIVB: + case TypeSNB: p->cur->cntr = snarfreg(igfx, 0x70080 + x*0x1000); p->cur->base = snarfreg(igfx, 0x70084 + x*0x1000); p->cur->pos = snarfreg(igfx, 0x70088 + x*0x1000); @@ -318,6 +321,8 @@ devtype(Igfx *igfx) switch(igfx->pci->did){ case 0x0166: /* 3rd Gen Core - ThinkPad X230 */ return TypeIVB; + case 0x0126: /* Thinkpad X220 */ + return TypeSNB; case 0x27a2: /* GM945/82940GML - ThinkPad X60 Tablet */ case 0x2a02: /* GM965/GL960/X3100 - ThinkPad X61 Tablet */ case 0x2a42: /* 4 Series Mobile - ThinkPad X200 */ @@ -397,10 +402,16 @@ snarf(Vga* vga, Ctlr* ctlr) igfx->vgacntrl = snarfreg(igfx, 0x071400); break; + case TypeSNB: + igfx->npipe = 2; /* A,B */ + igfx->cdclk = 300; /* MHz */ + goto PCHcommon; + case TypeIVB: igfx->npipe = 3; /* A,B,C */ igfx->cdclk = 400; /* MHz */ + PCHcommon: igfx->dpll[0].ctrl = snarfreg(igfx, 0xC6014); igfx->dpll[0].fp0 = snarfreg(igfx, 0xC6040); igfx->dpll[0].fp1 = snarfreg(igfx, 0xC6044); @@ -434,7 +445,7 @@ snarf(Vga* vga, Ctlr* ctlr) igfx->dp[x].auxdat[4] = snarfreg(igfx, 0xE4024 + 0x100*x); } - for(x=0; x<3; x++){ + for(x=0; x<igfx->npipe; x++){ igfx->pfit[x].pwrgate = snarfreg(igfx, 0x68060 + 0x800*x); igfx->pfit[x].winpos = snarfreg(igfx, 0x68070 + 0x800*x); igfx->pfit[x].winsize = snarfreg(igfx, 0x68074 + 0x800*x); @@ -586,6 +597,7 @@ initdpll(Igfx *igfx, int x, int freq, int port) dpll->ctrl.v &= ~(3<<13); dpll->ctrl.v |= (port == PortLCD ? 3 : 0) << 13; break; + case TypeSNB: case TypeIVB: /* transcoder dpll enable */ igfx->dpllsel.v |= 8<<(x*4); |