2 #include "../port/lib.h"
7 #include "../port/error.h"
19 case 0x0412: /* Haswell HD Graphics 4600 */
20 case 0x0a16: /* Haswell HD Graphics 4400 */
21 case 0x0126: /* Sandy Bridge HD Graphics 3000 */
22 case 0x0166: /* Ivy Bridge */
23 case 0x0102: /* Core-5 Sandy Bridge */
24 case 0x0152: /* Core-i3 */
25 switch((pcicfgr16(p, 0x50) >> 3) & 0x1f){
26 case 0x01: return 32 - 2;
27 case 0x02: return 64 - 2; /* 0102 Dell machine here */
28 case 0x03: return 96 - 2;
29 case 0x04: return 128 - 2;
30 case 0x05: return 32 - 2;
31 case 0x06: return 48 - 2;
32 case 0x07: return 64 - 2;
33 case 0x08: return 128 - 2;
34 case 0x09: return 256 - 2;
35 case 0x0A: return 96 - 2;
36 case 0x0B: return 160 - 2;
37 case 0x0C: return 224 - 2;
38 case 0x0D: return 352 - 2;
39 case 0x0E: return 448 - 2;
40 case 0x0F: return 480 - 2;
41 case 0x10: return 512 - 2;
44 case 0x2a42: /* X200 */
45 case 0x29a2: /* 82P965/G965 HECI desktop */
46 case 0x2a02: /* CF-R7 */
47 switch((pcicfgr16(p, 0x52) >> 4) & 7){
62 gmsize(Pcidev *pci, void *mmio)
64 u32int x, i, npg, *gtt;
66 npg = stolenmb(pci)<<(20-12);
69 gtt = (u32int*)((uchar*)mmio + pci->mem[0].size/2);
74 if((gtt[i]&1) == 0 || (gtt[i]>>12) != x)
78 if(0) print("igfx: graphics memory at %p-%p (%ud MB)\n",
79 (uintptr)(x-i)<<12, (uintptr)x<<12, (i>>(20-12)));
80 return (uintptr)i<<12;
84 igfxenable(VGAscr* scr)
93 scr->mmio = vmap(p->mem[0].bar&~0x0F, p->mem[0].size);
96 addvgaseg("igfxmmio", p->mem[0].bar&~0x0F, p->mem[0].size);
100 addvgaseg("igfxscreen", scr->paddr, scr->apsize);
101 scr->storage = gmsize(p, scr->mmio);
102 if(scr->storage < MB)
104 else if(scr->storage > scr->apsize)
105 scr->storage = scr->apsize;
106 if(scr->storage != 0)
107 scr->storage -= PGROUND(64*64*4);
112 VGAdev vgaigfxdev = {
118 igfxcurload(VGAscr* scr, Cursor* curs)
124 if(scr->storage == 0)
126 p = (u32int*)((uchar*)scr->vaddr + scr->storage);
127 memset(p, 0, 64*64*4);
131 for(j=0x80; j; j>>=1){
133 *p++ = (0xFF<<24) | (set&j ? 0x000000 : 0xFFFFFF);
140 scr->offset = curs->offset;
152 igfxcurregs(VGAscr* scr, int pipe)
156 if(scr->mmio == nil || scr->storage == 0)
158 o = pipe == 3 ? 0xf000 : pipe*0x1000;
159 /* check PIPExCONF if enabled */
160 if((scr->mmio[(0x70008 | o)/4] & (1<<31)) == 0)
162 switch(scr->pci->did){
163 case 0x0412: /* Haswell HD Graphics 4600 */
164 case 0x0a16: /* Haswell HD Graphics 4400 */
170 case 0x0166: /* Ivy Bridge */
171 case 0x0152: /* Core-i3 */
172 case 0x0126: /* Sandy Bridge HD Graphics 3000 */
176 case 0x2a42: /* X200 */
177 case 0x29a2: /* 82P965/G965 HECI desktop */
178 case 0x2a02: /* CF-R7 */
179 case 0x0102: /* Sndy Bridge */
188 return (u32int*)((uchar*)scr->mmio + (0x70080 + o));
192 igfxcurmove(VGAscr* scr, Point p)
197 for(i=0; i<NPIPE; i++){
198 if((r = igfxcurregs(scr, i)) != nil){
199 x = p.x + scr->offset.x;
200 if(x < 0) x = -x | 0x8000;
201 y = p.y + scr->offset.y;
202 if(y < 0) y = -y | 0x8000;
203 r[CURPOS] = (y << 16) | x;
210 igfxcurenable(VGAscr* scr)
216 igfxcurload(scr, &arrow);
217 igfxcurmove(scr, ZP);
219 for(i=0; i<NPIPE; i++){
220 if((r = igfxcurregs(scr, i)) != nil){
221 r[CURCTL] = (r[CURCTL] & ~(3<<28 | 1<<5)) | (i<<28) | 7;
222 r[CURBASE] = scr->storage;
228 igfxcurdisable(VGAscr* scr)
233 for(i=0; i<NPIPE; i++){
234 if((r = igfxcurregs(scr, i)) != nil){
235 r[CURCTL] &= ~(1<<5 | 7);
241 VGAcur vgaigfxcur = {