2 #include "../port/lib.h"
7 #include "../port/error.h"
16 preallocsize(Pcidev *p)
19 case 0x0166: /* Ivy Bridge */
20 switch((pcicfgr16(p, 0x50) >> 3) & 0x1f){
21 case 0x01: return 32*MB - 2*MB;
22 case 0x02: return 64*MB - 2*MB;
23 case 0x03: return 96*MB - 2*MB;
24 case 0x04: return 128*MB - 2*MB;
25 case 0x05: return 32*MB - 2*MB;
26 case 0x06: return 48*MB - 2*MB;
27 case 0x07: return 64*MB - 2*MB;
28 case 0x08: return 128*MB - 2*MB;
29 case 0x09: return 256*MB - 2*MB;
30 case 0x0A: return 96*MB - 2*MB;
31 case 0x0B: return 160*MB - 2*MB;
32 case 0x0C: return 224*MB - 2*MB;
33 case 0x0D: return 352*MB - 2*MB;
34 case 0x0E: return 448*MB - 2*MB;
35 case 0x0F: return 480*MB - 2*MB;
36 case 0x10: return 512*MB - 2*MB;
39 case 0x2a42: /* X200 */
40 switch((pcicfgr16(p, 0x52) >> 4) & 7){
41 case 0x01: return 1*MB;
42 case 0x02: return 4*MB;
43 case 0x03: return 8*MB;
44 case 0x04: return 16*MB;
45 case 0x05: return 32*MB;
46 case 0x06: return 48*MB;
47 case 0x07: return 64*MB;
55 igfxenable(VGAscr* scr)
64 scr->mmio = vmap(p->mem[0].bar&~0x0F, p->mem[0].size);
67 addvgaseg("igfxmmio", p->mem[0].bar&~0x0F, p->mem[0].size);
71 addvgaseg("igfxscreen", scr->paddr, scr->apsize);
72 scr->storage = preallocsize(p);
73 if(scr->storage > scr->apsize)
74 scr->storage = scr->apsize;
76 scr->storage -= PGROUND(64*64*4);
86 igfxcurload(VGAscr* scr, Cursor* curs)
94 p = (u32int*)((uchar*)scr->vaddr + scr->storage);
95 memset(p, 0, 64*64*4);
99 for(j=0x80; j; j>>=1){
101 *p++ = (0xFF<<24) | (set&j ? 0x000000 : 0xFFFFFF);
108 scr->offset = curs->offset;
120 igfxcurregs(VGAscr* scr, int pipe)
124 if(scr->mmio == nil || scr->storage == 0)
127 /* check PIPExCONF if enabled */
128 if((scr->mmio[(0x70008 | o)/4] & (1<<31)) == 0)
130 switch(scr->pci->did){
131 case 0x0166: /* Ivy Bridge */
135 case 0x2a42: /* X200 */
144 return (u32int*)((uchar*)scr->mmio + (0x70080 + o));
148 igfxcurmove(VGAscr* scr, Point p)
153 for(i=0; i<NPIPE; i++){
154 if((r = igfxcurregs(scr, i)) != nil){
155 x = p.x + scr->offset.x;
156 if(x < 0) x = -x | 0x8000;
157 y = p.y + scr->offset.y;
158 if(y < 0) y = -y | 0x8000;
159 r[CURPOS] = (y << 16) | x;
166 igfxcurenable(VGAscr* scr)
172 igfxcurload(scr, &arrow);
173 igfxcurmove(scr, ZP);
175 for(i=0; i<NPIPE; i++){
176 if((r = igfxcurregs(scr, i)) != nil){
177 r[CURCTL] = (r[CURCTL] & ~(3<<28 | 1<<5)) | (i<<28) | 7;
178 r[CURBASE] = scr->storage;
184 igfxcurdisable(VGAscr* scr)
189 for(i=0; i<NPIPE; i++){
190 if((r = igfxcurregs(scr, i)) != nil){
191 r[CURCTL] &= ~(1<<5 | 7);
197 VGAcur vgaigfxcur = {