From 9d59fb28cf117fbdec68420336fc712b7feb09dd Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Fri, 31 Jul 2015 23:03:45 +0200 Subject: 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. --- sys/src/cmd/aux/vga/igfx.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'sys/src/cmd/aux') 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; xnpipe; 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); -- cgit v1.2.3