M pc/devarch.c => pc/devarch.c +2 -2
@@ 360,7 360,7 @@ archread(Chan *c, void *a, long n, vlong offset)
return n;
case Qiow:
- if((n & 0x01) || (offset & 0x01))
+ if(n & 1)
error(Ebadarg);
checkport(offset, offset+n);
n /= 2;
@@ 370,7 370,7 @@ archread(Chan *c, void *a, long n, vlong offset)
return n*2;
case Qiol:
- if((n & 0x03) || (offset & 0x03))
+ if(n & 3)
error(Ebadarg);
checkport(offset, offset+n);
n /= 4;
M pc/ether82557.c => pc/ether82557.c +9 -1
@@ 898,7 898,15 @@ i82557pci(void)
Ctlr *ctlr;
p = nil;
- while(p = pcimatch(p, 0x8086, 0x1229)){
+ while(p = pcimatch(p, 0x8086, 0)){
+ switch(p->did){
+ default:
+ continue;
+ case 0x1229: /* Intel 8255[789] */
+ case 0x1031: /* Intel 82562EM */
+ break;
+ }
+
/*
* bar[0] is the memory-mapped register address (4KB),
* bar[1] is the I/O port register address (32 bytes) and
M pc/screen.c => pc/screen.c +6 -2
@@ 13,6 13,8 @@
#include <cursor.h>
#include "screen.h"
+#define round16(x) (((x)+15)&~15)
+
#define RGB2K(r,g,b) ((156763*(r)+307758*(g)+59769*(b))>>19)
Point ZP = {0, 0};
@@ 51,7 53,7 @@ screensize(int x, int y, int z, ulong chan)
* be given back if aperture is set.
*/
if(scr->aperture == 0){
- int width = (x*z)/BI2WD;
+ int width = (round16(x)*z)/BI2WD;
gscreendata.bdata = xalloc(width*BY2WD*y);
if(gscreendata.bdata == 0)
@@ 67,11 69,13 @@ screensize(int x, int y, int z, ulong chan)
if(gscreen)
freememimage(gscreen);
- gscreen = allocmemimaged(Rect(0,0,x,y), chan, &gscreendata);
+ gscreen = allocmemimaged(Rect(0,0,round16(x),y), chan, &gscreendata);
vgaimageinit(chan);
if(gscreen == nil)
return -1;
+ gscreen->r.max.x = x; /* we used round16(x) to allocate */
+
scr->palettedepth = 6; /* default */
scr->gscreendata = &gscreendata;
scr->memdefont = getmemdefont();
M pc/vgas3.c => pc/vgas3.c +16 -18
@@ 12,6 12,8 @@
#include <cursor.h>
#include "screen.h"
+#define round16(x) (((x)+15)&~15)
+
enum {
PCIS3 = 0x5333, /* PCI VID */
@@ 22,6 24,7 @@ enum {
SAVAGEMX = 0x8C11,
SAVAGEIXMV = 0x8C12,
SAVAGEIX = 0x8C13,
+ SUPERSAVAGEIXC16 = 0x8C2E,
SAVAGE2000 = 0x9102,
VIRGE = 0x5631,
@@ 124,7 127,9 @@ s3linear(VGAscr* scr, int* size, int* align)
*size = p->mem[i].size;
id = (vgaxi(Crtx, 0x2D)<<8)|vgaxi(Crtx, 0x2E);
- if(id == SAVAGE4){ /* find Savage4 mmio */
+ switch(id){ /* find mmio */
+ case SAVAGE4:
+ case SUPERSAVAGEIXC16:
/*
* We could assume that the MMIO registers
* will be in the screen segment and just use
@@ 140,8 145,8 @@ s3linear(VGAscr* scr, int* size, int* align)
if(p->mem[j].size==512*1024 || p->mem[j].size==16*1024*1024){
mmiobase = p->mem[j].bar & ~0x0F;
mmiosize = 512*1024;
- scr->mmio = (ulong*)upamalloc(mmiobase, mmiosize, 16*1024*1024);
- mmioname = "savage4mmio";
+ scr->mmio = (ulong*)upamalloc(mmiobase, mmiosize, 0);
+ mmioname = "savagemmio";
break;
}
}
@@ 204,7 209,7 @@ static void
s3load(VGAscr* scr, Cursor* curs)
{
uchar *p;
- int id, opage, x, y;
+ int id, dolock, opage, x, y;
/*
* Disable the cursor and
@@ 223,10 228,13 @@ s3load(VGAscr* scr, Cursor* curs)
case VIRGEVX:
case SAVAGEIXMV:
case SAVAGE4:
+ case SUPERSAVAGEIXC16:
+ dolock = 0;
p += scr->storage;
break;
default:
+ dolock = 1;
lock(&scr->devlock);
opage = s3pageset(scr, scr->storage>>16);
p += (scr->storage & 0xFFFF);
@@ 263,20 271,9 @@ s3load(VGAscr* scr, Cursor* curs)
}
}
- switch(id){
-
- case VIRGE:
- case VIRGEDXGX:
- case VIRGEGX2:
- case VIRGEVX:
- case SAVAGEIXMV:
- case SAVAGE4:
- break;
-
- default:
+ if(dolock){
s3pageset(scr, opage);
unlock(&scr->devlock);
- break;
}
/*
@@ 466,7 463,7 @@ hwscroll(VGAscr *scr, Rectangle r, Rectangle sr)
d = scr->gscreen->depth;
did = (d-8)/8;
cmd = 0x00000020|(Bitbltop<<17)|(did<<2);
- stride = Dx(scr->gscreen->r)*d/8;
+ stride = round16(Dx(scr->gscreen->r))*d/8;
if(r.min.x <= sr.min.x){
cmd |= 1<<25;
@@ 511,7 508,7 @@ hwfill(VGAscr *scr, Rectangle r, ulong sval)
d = scr->gscreen->depth;
did = (d-8)/8;
cmd = 0x16000120|(Bitbltop<<17)|(did<<2);
- stride = Dx(scr->gscreen->r)*d/8;
+ stride = round16(Dx(scr->gscreen->r))*d/8;
mmio = scr->mmio;
waitforlinearfifo(scr);
waitforfifo(scr, 8);
@@ 577,6 574,7 @@ s3drawinit(VGAscr *scr)
scr->mmio = (ulong*)(scr->aperture+0x1000000);
savageinit(scr);
break;
+ case SUPERSAVAGEIXC16:
case SAVAGE4:
/* scr->mmio is set by s3linear */
savageinit(scr);
M pc/vgasavage.c => pc/vgasavage.c +30 -8
@@ 12,6 12,7 @@
#include <cursor.h>
#include "screen.h"
+#define round16(x) (((x)+15)&~15)
enum {
PCIS3 = 0x5333, /* PCI VID */
@@ 22,6 23,7 @@ enum {
SAVAGEMX = 0x8C11,
SAVAGEIXMV = 0x8C12,
SAVAGEIX = 0x8C13,
+ SUPERSAVAGEIXC16 = 0x8C2E,
SAVAGE2000 = 0x9102,
VIRGE = 0x5631,
@@ 346,10 348,11 @@ enum {
struct {
ulong idletimeout;
+ ulong tostatw[16];
} savagestats;
enum {
- Maxloop = 1<<25
+ Maxloop = 1<<20
};
static void
@@ 360,10 363,11 @@ savagewaitidle(VGAscr *scr)
switch(scr->id){
case SAVAGE4:
+ case SUPERSAVAGEIXC16:
/* wait for engine idle and FIFO empty */
statw = (ulong*)((uchar*)scr->mmio+AltStatus0);
- mask = 0x0081FFFF;
- goal = 0x00800000;
+ mask = CBEMask | Ge2Idle;
+ goal = Ge2Idle;
break;
/* case SAVAGEMXMV: ? */
/* case SAVAGEMX: ? */
@@ 372,8 376,8 @@ savagewaitidle(VGAscr *scr)
case SAVAGEIXMV:
/* wait for engine idle and FIFO empty */
statw = (ulong*)((uchar*)scr->mmio+XStatus0);
- mask = 0x0008FFFF;
- goal = 0x00080000;
+ mask = CBEMaskA | Ge2IdleA;
+ goal = Ge2IdleA;
break;
default:
/*
@@ 387,7 391,8 @@ savagewaitidle(VGAscr *scr)
if((*statw & mask) == goal)
return;
- savagestats.idletimeout++;
+ savagestats.tostatw[savagestats.idletimeout++&15] = *statw;
+ savagestats.tostatw[savagestats.idletimeout++&15] = (ulong)statw;
}
static int
@@ 452,6 457,21 @@ savagescroll(VGAscr *scr, Rectangle r, Rectangle sr)
return 1;
}
+
+static void
+savageblank(VGAscr*, int blank)
+{
+ uchar seqD;
+
+ vgaxo(Seqx, 8, vgaxi(Seqx,8)|0x06);
+ seqD = vgaxi(Seqx, 0xD);
+ seqD &= 0x03;
+ if(blank)
+ seqD |= 0x50;
+ vgaxo(Seqx, 0xD, seqD);
+}
+
+
void
savageinit(VGAscr *scr)
{
@@ 462,6 482,7 @@ savageinit(VGAscr *scr)
switch(scr->id){
case SAVAGE4:
case SAVAGEIXMV:
+ case SUPERSAVAGEIXC16:
break;
default:
print("unknown savage %.4lux\n", scr->id);
@@ 500,10 521,11 @@ savageinit(VGAscr *scr)
/* set bitmap descriptors */
bd = (scr->gscreen->depth<<DepthShift) |
- (Dx(scr->gscreen->r)<<StrideShift) | BlockWriteDis;
+ (round16(Dx(scr->gscreen->r))<<StrideShift) | BlockWriteDis
+ | BDS64;
*(ulong*)(mmio+GBD1) = 0;
- *(ulong*)(mmio+GBD2) = bd | BDS64;
+ *(ulong*)(mmio+GBD2) = bd;
*(ulong*)(mmio+PBD1) = 0;
*(ulong*)(mmio+PBD2) = bd;