From ebc2f99c5de21cc3176f97a3a2f218a3eddcf0a5 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sun, 14 Oct 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-10-14 --- pc/devarch.c | 4 ++-- pc/ether82557.c | 10 +++++++++- pc/screen.c | 8 ++++++-- pc/vgas3.c | 34 ++++++++++++++++------------------ pc/vgasavage.c | 38 ++++++++++++++++++++++++++++++-------- 5 files changed, 63 insertions(+), 31 deletions(-) diff --git a/pc/devarch.c b/pc/devarch.c index 785983005e9ee663de979c99e12aa9b59994ff61..084826efd67dc2a8789d70a97d7d9a9339c6d22e 100644 --- a/pc/devarch.c +++ b/pc/devarch.c @@ -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; diff --git a/pc/ether82557.c b/pc/ether82557.c index 8b0fe44196d5fc5953a1bf7b96e4c4d4fefe0cf2..f5bba26dc5d8d8c190729e624900ddb0cc6775f0 100644 --- a/pc/ether82557.c +++ b/pc/ether82557.c @@ -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 diff --git a/pc/screen.c b/pc/screen.c index 023be595b29f3939cf76e0ada8e457712d848747..e380fdcff668ed6ffd6049574b46b50626afa4df 100644 --- a/pc/screen.c +++ b/pc/screen.c @@ -13,6 +13,8 @@ #include #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(); diff --git a/pc/vgas3.c b/pc/vgas3.c index b39da040576d8b8348356063d55b47b177cc5f83..e123bc5073106566a0d5cb65366a1bae722782db 100644 --- a/pc/vgas3.c +++ b/pc/vgas3.c @@ -12,6 +12,8 @@ #include #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); diff --git a/pc/vgasavage.c b/pc/vgasavage.c index 6c7a42482e5ab61e8bb40b43ed3c76f8c2110f18..726dc827a1fadfbd78634cbe718ee74f1c89b8dd 100644 --- a/pc/vgasavage.c +++ b/pc/vgasavage.c @@ -12,6 +12,7 @@ #include #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<gscreen->r)<gscreen->r))<