]> git.lizzy.rs Git - plan9front.git/commitdiff
igfx: determine amount of preallocated stolen graphics memory for hw cursor
authorcinap_lenrek <cinap_lenrek@felloff.net>
Fri, 16 Jan 2015 12:38:52 +0000 (13:38 +0100)
committercinap_lenrek <cinap_lenrek@felloff.net>
Fri, 16 Jan 2015 12:38:52 +0000 (13:38 +0100)
allocate the hardware cursor plane at the end of
preallocated stolen graphics memory.

sys/src/9/pc/vgaigfx.c
sys/src/cmd/aux/vga/igfx.c

index f95bc3a014755954736104b73a16daa6a9556ea3..41ea91966f7f02619bcc46683348f644f04e24b6 100644 (file)
 #include <cursor.h>
 #include "screen.h"
 
+#define MB     0x100000
+
+static ulong
+preallocsize(Pcidev *p)
+{
+       switch(p->did){
+       case 0x0166:    /* Ivy Bridge */
+               switch((pcicfgr16(p, 0x50) >> 3) & 0x1f){
+               case 0x01:      return 32*MB    - 2*MB;
+               case 0x02:      return 64*MB    - 2*MB;
+               case 0x03:      return 96*MB    - 2*MB;
+               case 0x04:      return 128*MB   - 2*MB;
+               case 0x05:      return 32*MB    - 2*MB;
+               case 0x06:      return 48*MB    - 2*MB;
+               case 0x07:      return 64*MB    - 2*MB;
+               case 0x08:      return 128*MB   - 2*MB;
+               case 0x09:      return 256*MB   - 2*MB;
+               case 0x0A:      return 96*MB    - 2*MB;
+               case 0x0B:      return 160*MB   - 2*MB;
+               case 0x0C:      return 224*MB   - 2*MB;
+               case 0x0D:      return 352*MB   - 2*MB;
+               case 0x0E:      return 448*MB   - 2*MB;
+               case 0x0F:      return 480*MB   - 2*MB;
+               case 0x10:      return 512*MB   - 2*MB;
+               }
+               break;
+       case 0x27a2:    /* X60t */
+       case 0x2a42:    /* X200 */
+               switch((pcicfgr16(p, 0x52) >> 4) & 7){
+               case 0x01:      return 1*MB;
+               case 0x02:      return 4*MB;
+               case 0x03:      return 8*MB;
+               case 0x04:      return 16*MB;
+               case 0x05:      return 32*MB;
+               case 0x06:      return 48*MB;
+               case 0x07:      return 64*MB;
+               }
+               break;
+       }
+       return 0;
+}
+
 static void
 igfxenable(VGAscr* scr)
 {
@@ -30,9 +72,11 @@ igfxenable(VGAscr* scr)
                vgalinearpci(scr);
        if(scr->apsize){
                addvgaseg("igfxscreen", scr->paddr, scr->apsize);
-               scr->storage = (scr->apsize - 64*64*4) & ~(BY2PG-1);
-               if(scr->storage > 0x1000000)
-                       scr->storage = 0x1000000;
+               scr->storage = preallocsize(p);
+               if(scr->storage > scr->apsize)
+                       scr->storage = scr->apsize;
+               if(scr->storage != 0)
+                       scr->storage -= PGROUND(64*64*4);
        }
 }
 
@@ -48,6 +92,8 @@ igfxcurload(VGAscr* scr, Cursor* curs)
        u32int *p;
        int i, j;
 
+       if(scr->storage == 0)
+               return;
        p = (u32int*)((uchar*)scr->vaddr + scr->storage);
        memset(p, 0, 64*64*4);
        for(i=0;i<32;i++) {
@@ -84,10 +130,20 @@ igfxcurregs(VGAscr* scr, int pipe)
        /* check PIPExCONF if enabled */
        if((scr->mmio[(0x70008 | o)/4] & (1<<31)) == 0)
                return nil;
-       if(scr->pci->did == 0x2a42){    /* G45 */
+       switch(scr->pci->did){
+       case 0x0116:    /* Ivy Bridge */
+               if(pipe > 2)
+                       return nil;
+               break;
+       case 0x27a2:    /* X60t */
+       case 0x2a42:    /* X200 */
                if(pipe > 1)
                        return nil;
                o = pipe*0x40;
+               break;
+       default:
+               if(pipe > 0)
+                       return nil;
        }
        return (u32int*)((uchar*)scr->mmio + (0x70080 + o));
 }
index dd6f9aa8cbaeb6f79771dbb496440b3ddec76ac2..d1e5b15ef0fa0a9942c970418679c7257c90c6bb 100644 (file)
@@ -251,7 +251,7 @@ snarfpipe(Igfx *igfx, int x)
 
        p = &igfx->pipe[x];
 
-       o = 0x60000 | x*0x1000;
+       o = 0x60000 + x*0x1000;
        snarftrans(igfx, p, o);
 
        p->src = snarfreg(igfx, o + 0x0001C);
@@ -278,26 +278,26 @@ snarfpipe(Igfx *igfx, int x)
        }
 
        /* display plane */
-       p->dsp->cntr            = snarfreg(igfx, 0x70180 | x*0x1000);
-       p->dsp->linoff          = snarfreg(igfx, 0x70184 | x*0x1000);
-       p->dsp->stride          = snarfreg(igfx, 0x70188 | x*0x1000);
-       p->dsp->tileoff         = snarfreg(igfx, 0x701A4 | x*0x1000);
-       p->dsp->surf            = snarfreg(igfx, 0x7019C | x*0x1000);
+       p->dsp->cntr            = snarfreg(igfx, 0x70180 + x*0x1000);
+       p->dsp->linoff          = snarfreg(igfx, 0x70184 + x*0x1000);
+       p->dsp->stride          = snarfreg(igfx, 0x70188 + x*0x1000);
+       p->dsp->tileoff         = snarfreg(igfx, 0x701A4 + x*0x1000);
+       p->dsp->surf            = snarfreg(igfx, 0x7019C + x*0x1000);
 
        /* cursor plane */
        switch(igfx->type){
        case TypeIVB:
-               p->cur->cntr    = snarfreg(igfx, 0x70080 | x*0x1000);
-               p->cur->base    = snarfreg(igfx, 0x70084 | x*0x1000);
-               p->cur->pos     = snarfreg(igfx, 0x70088 | x*0x1000);
+               p->cur->cntr    = snarfreg(igfx, 0x70080 + x*0x1000);
+               p->cur->base    = snarfreg(igfx, 0x70084 + x*0x1000);
+               p->cur->pos     = snarfreg(igfx, 0x70088 + x*0x1000);
                break;
        case TypeG45:
-               p->dsp->pos     = snarfreg(igfx, 0x7018C | x*0x1000);
-               p->dsp->size    = snarfreg(igfx, 0x70190 | x*0x1000);
+               p->dsp->pos     = snarfreg(igfx, 0x7018C + x*0x1000);
+               p->dsp->size    = snarfreg(igfx, 0x70190 + x*0x1000);
 
-               p->cur->cntr    = snarfreg(igfx, 0x70080 | x*0x40);
-               p->cur->base    = snarfreg(igfx, 0x70084 | x*0x40);
-               p->cur->pos     = snarfreg(igfx, 0x7008C | x*0x40);
+               p->cur->cntr    = snarfreg(igfx, 0x70080 + x*0x40);
+               p->cur->base    = snarfreg(igfx, 0x70084 + x*0x40);
+               p->cur->pos     = snarfreg(igfx, 0x7008C + x*0x40);
                break;
        }
 }