#include "dat.h"
#include "fns.h"
#include "io.h"
+#include "../port/pci.h"
#include "../port/error.h"
#define Image IMAGE
neomagicenable(VGAscr* scr)
{
Pcidev *p;
- int curoff, vmsize;
- ulong ioaddr;
+ int bar, curoff, vmsize;
+ uvlong ioaddr;
ulong iosize;
/*
*/
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;
/*
* Load, locate and enable the 64x64 cursor.
*/
- neomagiccurload(scr, &arrow);
+ neomagiccurload(scr, &cursor);
neomagiccurmove(scr, ZP);
cursornm->enable = 1;
}
| 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;
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 */
| 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
| 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);
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) {
return;
}
- switch(Dx(scr->gscreen->r)) {
+ switch(scr->width) {
case 320:
bltmode |= NEO_MODE1_X_320;
neomagicbltflags |= NEO_BC1_X_320;
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;