2 #include "../port/lib.h"
7 #include "../port/pci.h"
8 #include "../port/error.h"
17 igfxcuralloc(Pcidev *pci, void *mmio, int apsize)
20 u32int pa, *buf, *p, *e;
22 buf = mallocalign(64*64*4, BY2PG, 0, 0);
24 print("igfx: no memory for cursor image\n");
27 n = (apsize > 128*MB ? 128*1024 : apsize/1024) / 4 - 4;
28 p = (u32int*)((uchar*)mmio + pci->mem[0].size/2) + n;
29 *(u32int*)((uchar*)mmio + 0x2170) = 0; /* flush write buffers */
30 for(e=p+4, pa=PADDR(buf); p<e; p++, pa+=1<<12)
32 *(u32int*)((uchar*)mmio + 0x2170) = 0; /* flush write buffers */
33 return (uintptr)n << 12;
37 igfxenable(VGAscr* scr)
48 scr->mmio = vmap(p->mem[0].bar&~0x0F, p->mem[0].size);
51 addvgaseg("igfxmmio", p->mem[0].bar&~0x0F, p->mem[0].size);
55 addvgaseg("igfxscreen", scr->paddr, scr->apsize);
56 scr->storage = igfxcuralloc(p, scr->mmio, scr->apsize);
62 igfxblank(VGAscr *scr, int blank)
66 switch(scr->pci->did){
70 case 0x2a02: /* GM965 */
71 case 0x2a42: /* GM45 */
72 case 0x2592: /* GM915 */
76 case 0x0126: /* SNB */
77 case 0x0166: /* IVB */
82 /* toggle PP_CONTROL backlight & power state */
84 scr->mmio[off/4] &= ~0x5;
86 scr->mmio[off/4] |= 0x5;
90 igfxdrawinit(VGAscr *scr)
92 scr->blank = igfxblank;
105 igfxcurload(VGAscr* scr, Cursor* curs)
111 if(scr->storage == 0)
113 p = (u32int*)((uchar*)scr->vaddr + scr->storage);
114 memset(p, 0, 64*64*4);
118 for(j=0x80; j; j>>=1){
120 *p++ = (0xFF<<24) | (set&j ? 0x000000 : 0xFFFFFF);
127 scr->offset = curs->offset;
139 igfxcurregs(VGAscr* scr, int pipe)
143 if(scr->mmio == nil || scr->storage == 0)
145 o = pipe == 3 ? 0xf000 : pipe*0x1000;
146 /* check PIPExCONF if enabled */
147 if((scr->mmio[(0x70008 | o)/4] & (1<<31)) == 0)
149 switch(scr->pci->did){
150 case 0x0412: /* Haswell HD Graphics 4600 */
151 case 0x0a16: /* Haswell HD Graphics 4400 */
157 case 0x0166: /* Ivy Bridge */
158 case 0x0152: /* Core-i3 */
159 case 0x0126: /* Sandy Bridge HD Graphics 3000 */
163 case 0x2592: /* GM915 */
164 case 0x2a42: /* X200 */
165 case 0x29a2: /* 82P965/G965 HECI desktop */
166 case 0x2a02: /* CF-R7 */
167 case 0x0102: /* Sndy Bridge */
176 return (u32int*)((uchar*)scr->mmio + (0x70080 + o));
180 igfxcurmove(VGAscr* scr, Point p)
185 for(i=0; i<NPIPE; i++){
186 if((r = igfxcurregs(scr, i)) != nil){
187 x = p.x + scr->offset.x;
188 if(x < 0) x = -x | 0x8000;
189 y = p.y + scr->offset.y;
190 if(y < 0) y = -y | 0x8000;
191 r[CURPOS] = (y << 16) | x;
198 igfxcurenable(VGAscr* scr)
204 igfxcurload(scr, &cursor);
205 igfxcurmove(scr, ZP);
207 for(i=0; i<NPIPE; i++){
208 if((r = igfxcurregs(scr, i)) != nil){
209 r[CURCTL] = (r[CURCTL] & ~(3<<28 | 1<<5)) | (i<<28) | 7;
210 r[CURBASE] = scr->storage;
216 igfxcurdisable(VGAscr* scr)
221 for(i=0; i<NPIPE; i++){
222 if((r = igfxcurregs(scr, i)) != nil){
223 r[CURCTL] &= ~(1<<5 | 7);
229 VGAcur vgaigfxcur = {