]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/9/pc/vganeomagic.c
[9front] [PATCH] audiohda: add PCI ID for Intel C610/X99
[plan9front.git] / sys / src / 9 / pc / vganeomagic.c
old mode 100755 (executable)
new mode 100644 (file)
index ad9c4a2..ad7208f
@@ -4,6 +4,7 @@
 #include "dat.h"
 #include "fns.h"
 #include "io.h"
+#include "../port/pci.h"
 #include "../port/error.h"
 
 #define        Image   IMAGE
@@ -26,8 +27,8 @@ static void
 neomagicenable(VGAscr* scr)
 {
        Pcidev *p;
-       int curoff, vmsize;
-       ulong ioaddr;
+       int bar, curoff, vmsize;
+       uvlong ioaddr;
        ulong iosize;
 
        /*
@@ -39,53 +40,49 @@ neomagicenable(VGAscr* scr)
         */
        if(scr->mmio)
                return;
-       if(p = pcimatch(nil, 0x10C8, 0)){
-               switch(p->did){
-               case 0x0003:            /* MagicGraph 128ZV */
-                       curoff = 0x100;
-                       vmsize = 1152*1024;
-                       ioaddr = (p->mem[0].bar & ~0x0F) + 0x200000;
-                       iosize = 0x200000;
-                       break;
-               case 0x0083:            /* MagicGraph 128ZV+ */
-                       curoff = 0x100;
-                       vmsize = 1152*1024;
-                       ioaddr = p->mem[1].bar & ~0x0F;
-                       iosize = p->mem[1].size;
-                       break;
-               case 0x0004:            /* MagicGraph 128XD */
-                       curoff = 0x100;
-                       vmsize = 2048*1024;
-                       ioaddr = p->mem[1].bar & ~0x0F;
-                       iosize = p->mem[1].size;
-                       break;
-               case 0x0005:            /* MagicMedia 256AV */
-                       curoff = 0x1000;
-                       vmsize = 2560*1024;
-                       ioaddr = p->mem[1].bar & ~0x0F;
-                       iosize = p->mem[1].size;
-                       break;
-               case 0x0006:            /* MagicMedia 256ZX */
-                       curoff = 0x1000;
-                       vmsize = 4096*1024;
-                       ioaddr = p->mem[1].bar & ~0x0F;
-                       iosize = p->mem[1].size;
-                       break;
-               case 0x0016:            /* MagicMedia 256XL+ */
-                       curoff = 0x1000;
-                       /* Vaio VESA BIOS says 6080, but then hwgc doesn't work */
-                       vmsize = 4096*1024;
-                       ioaddr = p->mem[1].bar & ~0x0F;
-                       iosize = p->mem[1].size;
-                       break;
-               default:
+       p = scr->pci;
+       if(p == nil || p->vid != 0x10C8)
+               return;
+       bar = 1;
+       switch(p->did){
+       case 0x0003:            /* MagicGraph 128ZV */
+               bar = 0;
+               if(p->mem[bar].bar & 1)
                        return;
-               }
+               ioaddr = (p->mem[bar].bar & ~0x0F) + 0x200000;
+               iosize = 0x200000;
+               curoff = 0x100;
+               vmsize = 1152*1024;
+               goto Map;
+       case 0x0083:            /* MagicGraph 128ZV+ */
+               curoff = 0x100;
+               vmsize = 1152*1024;
+               break;
+       case 0x0004:            /* MagicGraph 128XD */
+               curoff = 0x100;
+               vmsize = 2048*1024;
+               break;
+       case 0x0005:            /* MagicMedia 256AV */
+               curoff = 0x1000;
+               vmsize = 2560*1024;
+               break;
+       case 0x0006:            /* MagicMedia 256ZX */
+               curoff = 0x1000;
+               vmsize = 4096*1024;
+               break;
+       case 0x0016:            /* MagicMedia 256XL+ */
+               curoff = 0x1000;
+               /* Vaio VESA BIOS says 6080, but then hwgc doesn't work */
+               vmsize = 4096*1024;
+               break;
+       default:
+               return;
        }
-       else
+       if(p->mem[bar].bar & 1)
                return;
-       scr->pci = p;
-
+       ioaddr = p->mem[bar].bar & ~0x0F;
+       iosize = p->mem[bar].size;
+Map:
        scr->mmio = vmap(ioaddr, iosize);
        if(scr->mmio == nil)
                return;
@@ -232,7 +229,7 @@ neomagiccurenable(VGAscr* scr)
        /*
         * Load, locate and enable the 64x64 cursor.
         */
-       neomagiccurload(scr, &arrow);
+       neomagiccurload(scr, &cursor);
        neomagiccurmove(scr, ZP);
        cursornm->enable = 1;
 }
@@ -379,8 +376,8 @@ neomagichwfill(VGAscr *scr, Rectangle r, ulong sval)
                | NEO_BC3_SKIP_MAPPING
                | GXcopy;
        mmio[DstStartOff] = scr->paddr
-               + r.min.y*scr->gscreen->width*BY2WD
-               + r.min.x*scr->gscreen->depth/BI2BY;
+               + r.min.y*scr->pitch
+               + r.min.x*scr->bpp;
        mmio[XYExt] = (Dy(r) << 16) | (Dx(r) & 0xffff);
        waitforidle(scr);
        return 1;
@@ -390,13 +387,9 @@ static int
 neomagichwscroll(VGAscr *scr, Rectangle r, Rectangle sr)
 {
        ulong *mmio;
-       int pitch, pixel;
 
        mmio = scr->mmio;
 
-       pitch = scr->gscreen->width*BY2WD;
-       pixel = scr->gscreen->depth/BI2BY;
-
        waitforfifo(scr, 4);
        if (r.min.y < sr.min.y || (r.min.y == sr.min.y && r.min.x < sr.min.x)) {
                /* start from upper-left */
@@ -405,9 +398,9 @@ neomagichwscroll(VGAscr *scr, Rectangle r, Rectangle sr)
                        | NEO_BC3_SKIP_MAPPING
                        | GXcopy;
                mmio[SrcStartOff] = scr->paddr
-                       + sr.min.y*pitch + sr.min.x*pixel;
+                       + sr.min.y*scr->pitch + sr.min.x*scr->bpp;
                mmio[DstStartOff] = scr->paddr
-                       + r.min.y*pitch + r.min.x*pixel;
+                       + r.min.y*scr->pitch + r.min.x*scr->bpp;
        } else {
                /* start from lower-right */
                mmio[BltCntl] = neomagicbltflags
@@ -418,9 +411,9 @@ neomagichwscroll(VGAscr *scr, Rectangle r, Rectangle sr)
                        | NEO_BC3_SKIP_MAPPING
                        | GXcopy;
                mmio[SrcStartOff] = scr->paddr
-                       + (sr.max.y-1)*pitch + (sr.max.x-1)*pixel;
+                       + (sr.max.y-1)*scr->pitch + (sr.max.x-1)*scr->bpp;
                mmio[DstStartOff] = scr->paddr
-                       + (r.max.y-1)*pitch + (r.max.x-1)*pixel;
+                       + (r.max.y-1)*scr->pitch + (r.max.x-1)*scr->bpp;
        }
        mmio[XYExt] = (Dy(r) << 16) | (Dx(r) & 0xffff);
        waitforidle(scr);
@@ -431,12 +424,10 @@ static void
 neomagicdrawinit(VGAscr *scr)
 {
        ulong *mmio;
-       uint bltmode, pitch;
+       uint bltmode;
 
        mmio = scr->mmio;
 
-       pitch = scr->gscreen->width*BY2WD;
-
        neomagicbltflags = bltmode = 0;
 
        switch(scr->gscreen->depth) {
@@ -453,7 +444,7 @@ neomagicdrawinit(VGAscr *scr)
                return;
        }
 
-       switch(Dx(scr->gscreen->r)) {
+       switch(scr->width) {
        case 320:
                bltmode |= NEO_MODE1_X_320;
                neomagicbltflags |= NEO_BC1_X_320;
@@ -489,7 +480,7 @@ neomagicdrawinit(VGAscr *scr)
 
        waitforidle(scr);
        mmio[BltStat] = bltmode << 16;
-       mmio[Pitch] = (pitch << 16) | (pitch & 0xffff);
+       mmio[Pitch] = (scr->pitch << 16) | (scr->pitch & 0xffff);
 
        scr->fill = neomagichwfill;
        scr->scroll = neomagichwscroll;