From 03ab821f1a089cf669cbf9326e6eddcce893afc7 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Mon, 15 Oct 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-10-15 --- pc/devpccard.c | 1 + pc/devusb.c | 19 ++++++------------- pc/devvga.c | 29 +++++++++++++++++++++-------- pc/ether79c970.c | 3 +++ pc/etherwavelan.c | 38 ++++++++++++++++++++++++++------------ pc/screen.c | 13 +++++-------- pc/screen.h | 2 ++ pc/vgamach64xx.c | 3 ++- pc/vganvidia.c | 1 + pc/vgas3.c | 13 ++++++------- pc/vgasavage.c | 7 +++---- pc/vgat2r4.c | 1 + port/devdraw.c | 2 +- port/devmouse.c | 16 ++++++++-------- 14 files changed, 86 insertions(+), 62 deletions(-) diff --git a/pc/devpccard.c b/pc/devpccard.c index 67df8845c755f1c7b8b45735fac9191a9b0e00b3..78827aa899035ec5d9ed85cf5df99fc2127f129d 100644 --- a/pc/devpccard.c +++ b/pc/devpccard.c @@ -40,6 +40,7 @@ static variant_t variant[] = { { Ricoh_vid, Ricoh_478_did, "Ricoh 478 PCI/Cardbus bridge", }, { TI_vid, TI_1450_did, "TI PCI-1450 Cardbus Controller", }, { TI_vid, TI_1251A_did, "TI PCI-1251A Cardbus Controller", }, +{ TI_vid, 0xAC51, "TI 0xAC51 Cardbus Controller", }, }; /* Cardbus registers */ diff --git a/pc/devusb.c b/pc/devusb.c index 3e9a6f6853ac1dba56965eff369b2a39f47b9ffb..4522e21ab95f78031d4c7f78f1a27971eaca6ef4 100644 --- a/pc/devusb.c +++ b/pc/devusb.c @@ -1630,29 +1630,22 @@ usbclose(Chan *c) if(c->qid.type == QTDIR || c->qid.path < Q3rd) return; qlock(&usbstate); - if(waserror()){ - qunlock(&usbstate); - nexterror(); - } d = usbdevice(c); s = QID(c->qid) - Qep0; if(s >= 0 && s < nelem(d->ep)){ Endpt *e; - if((e = d->ep[s]) == nil) { - XPRINT("usbopen failed (endpoint)\n"); - error(Enodev); - } - e->isopen--; - if (e->isopen == 0){ - eptdeactivate(e); - unschedendpt(e); + if(e = d->ep[s]) { + if (e->isopen == 1){ + e->isopen = 0; + eptdeactivate(e); + unschedendpt(e); + } } } if(QID(c->qid) == Qctl) d->busy = 0; if(c->flag & COPEN) freedev(d); - poperror(); qunlock(&usbstate); } diff --git a/pc/devvga.c b/pc/devvga.c index e9ecc51564dfd5f4627d356840478435a664d849..5d8444e3e1792a61930bf613e03eff672a603ead 100644 --- a/pc/devvga.c +++ b/pc/devvga.c @@ -151,6 +151,7 @@ vgaread(Chan* c, void* a, long n, vlong off) len += snprint(p+len, READSTR-len, "blanktime %lud\n", blanktime); len += snprint(p+len, READSTR-len, "hwaccel %s\n", hwaccel ? "on" : "off"); len += snprint(p+len, READSTR-len, "hwblank %s\n", hwblank ? "on" : "off"); + len += snprint(p+len, READSTR-len, "panning %s\n", panning ? "on" : "off"); snprint(p+len, READSTR-len, "addr 0x%lux\n", scr->aperture); n = readstr(offset, a, n, p); poperror(); @@ -182,7 +183,6 @@ vgactl(char* a) VGAscr *scr; extern VGAdev *vgadev[]; extern VGAcur *vgacur[]; - Rectangle r; n = getfields(a, field, nelem(field), 1, " \t\n"); if(n < 1) @@ -286,13 +286,8 @@ vgactl(char* a) if(x > scr->gscreen->r.max.x || y > scr->gscreen->r.max.y) error("physical screen bigger than virtual"); - r = Rect(0,0,x,y); - if(!eqrect(r, scr->gscreen->r)){ - if(scr->cur == nil || scr->cur->doespanning == 0) - error("virtual screen not supported"); - } - - physgscreenr = r; + physgscreenr = Rect(0,0,x,y); + scr->gscreen->clipr = physgscreenr; return; } else if(strcmp(field[0], "palettedepth") == 0){ @@ -344,6 +339,24 @@ vgactl(char* a) blanktime = strtoul(field[1], 0, 0); return; } + else if(strcmp(field[0], "panning") == 0){ + if(n < 2) + error(Ebadarg); + if(strcmp(field[1], "on") == 0){ + if(scr == nil || scr->cur == nil) + error("set screen first"); + if(!scr->cur->doespanning) + error("panning not supported"); + scr->gscreen->clipr = scr->gscreen->r; + panning = 1; + } + else if(strcmp(field[1], "off") == 0){ + scr->gscreen->clipr = physgscreenr; + panning = 0; + }else + error(Ebadarg); + return; + } else if(strcmp(field[0], "hwaccel") == 0){ if(n < 2) error(Ebadarg); diff --git a/pc/ether79c970.c b/pc/ether79c970.c index a6724c3aced241480b6a2bf56a795220e9dad0bf..66447ba42939ece21f76f7871965b934e52e3978 100644 --- a/pc/ether79c970.c +++ b/pc/ether79c970.c @@ -501,6 +501,9 @@ reset(Ether* ether) /* * Allocate a controller structure and start to initialise it. */ + if(ioalloc(ctlr->port, 0x20, 0, "ether79c970") < 0) + return -1; + ether->ctlr = ctlr; ether->port = ctlr->port; ether->irq = ctlr->pcidev->intl; diff --git a/pc/etherwavelan.c b/pc/etherwavelan.c index 139b2e6be97d4f4a0c9281c497447be9ba274e28..6dda6d1ce4710cd93607ec4ce67e95a427749364 100644 --- a/pc/etherwavelan.c +++ b/pc/etherwavelan.c @@ -301,6 +301,8 @@ struct Ctlr Wltv keys; // default keys int xclear; // exclude clear packets off/on + int ctlrno; + Stats; WStats; }; @@ -326,22 +328,32 @@ w_cmd(Ctlr *ctlr, ushort cmd, ushort arg) { int i, rc; + for(i=0; ictlrno, cmd, csr_ins(ctlr, WR_Cmd)); + return -1; + } + csr_outs(ctlr, WR_Parm0, arg); csr_outs(ctlr, WR_Cmd, cmd); - for (i = 0; ictlrno, cmd, csr_ins(ctlr, WR_EvSts)); + return -1; } + rc = csr_ins(ctlr, WR_Sts); + csr_ack(ctlr, WCmdEv); - return -1; + if((rc&WCmdMsk) != (cmd&WCmdMsk) || (rc&WResSts)){ + print("#l%d: cmd %.4ux: status %.4ux\n", ctlr->ctlrno, cmd, rc); + return -1; + } + return 0; } static int @@ -1190,6 +1202,7 @@ interrupt(Ureg* ,void* arg) static char* wavenames[] = { "WaveLAN/IEEE", "TrueMobile 1150", + "Instant Wireless ; Network PC CARD", nil, }; @@ -1205,6 +1218,7 @@ reset(Ether* ether) return -1; ilock(&ctlr->Lock); + ctlr->ctlrno = ether->ctlrno; if (ether->port==0) ether->port=WDfltIOB; diff --git a/pc/screen.c b/pc/screen.c index e380fdcff668ed6ffd6049574b46b50626afa4df..3cdd0480878e6bdf2b75f9aa43887130c1704bdb 100644 --- a/pc/screen.c +++ b/pc/screen.c @@ -13,8 +13,6 @@ #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}; @@ -53,7 +51,7 @@ screensize(int x, int y, int z, ulong chan) * be given back if aperture is set. */ if(scr->aperture == 0){ - int width = (round16(x)*z)/BI2WD; + int width = (x*z)/BI2WD; gscreendata.bdata = xalloc(width*BY2WD*y); if(gscreendata.bdata == 0) @@ -69,13 +67,11 @@ screensize(int x, int y, int z, ulong chan) if(gscreen) freememimage(gscreen); - gscreen = allocmemimaged(Rect(0,0,round16(x),y), chan, &gscreendata); + gscreen = allocmemimaged(Rect(0,0,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(); @@ -131,7 +127,7 @@ attachscreen(Rectangle* r, ulong* chan, int* d, int* width, int *softscreen) if(scr->gscreen == nil || scr->gscreendata == nil) return nil; - *r = scr->gscreen->r; + *r = scr->gscreen->clipr; *chan = scr->gscreen->chan; *d = scr->gscreen->depth; *width = scr->gscreen->width; @@ -329,7 +325,8 @@ setcursor(Cursor* curs) } int hwaccel = 1; -int hwblank = 1; +int hwblank = 0; /* turned on by drivers that are known good */ +int panning = 0; int hwdraw(Memdrawparam *par) diff --git a/pc/screen.h b/pc/screen.h index 2f034d23b517ed2cfd72911e88c9a242cae8414b..ee759ca4a812e28fc014a2caefca73ba58c0ccef 100644 --- a/pc/screen.h +++ b/pc/screen.h @@ -127,6 +127,7 @@ extern void mousectl(char*[], int); /* screen.c */ extern int hwaccel; /* use hw acceleration; default on */ extern int hwblank; /* use hw blanking; default on */ +extern int panning; /* use virtual screen panning; default off */ extern void addvgaseg(char*, ulong, ulong); extern uchar* attachscreen(Rectangle*, ulong*, int*, int*, int*); extern void flushmemscreen(Rectangle); @@ -142,6 +143,7 @@ extern void blankscreen(int); extern void deletescreenimage(void); extern int drawhasclients(void); extern ulong blanktime; +extern void setscreenimageclipr(Rectangle); /* vga.c */ extern void vgascreenwin(VGAscr*); diff --git a/pc/vgamach64xx.c b/pc/vgamach64xx.c index ee6c1ff87878e080758be57d8da70a1745f73099..ed53fac1fdb32385477be92cac34d22856224dff 100644 --- a/pc/vgamach64xx.c +++ b/pc/vgamach64xx.c @@ -580,7 +580,7 @@ mach64xxcurmove(VGAscr* scr, Point p) else dx = 64 / scr->gscreen->depth; - if(screenpan(p, &physgscreenr, dx, 1)){ + if(panning && screenpan(p, &physgscreenr, dx, 1)){ off = (physgscreenr.min.y*Dx(scr->gscreen->r)+physgscreenr.min.x)/dx; pitch = Dx(scr->gscreen->r)/8; iow32(scr, CrtcOffPitch, (pitch<<22)|off); @@ -999,6 +999,7 @@ mach64xxdrawinit(VGAscr *scr) case ('L'<<8)|'M': /* 4C4D: Rage Mobility */ case ('L'<<8)|'P': /* 4C50: Rage 3D LTPro */ scr->blank = mach64lcdblank; + hwblank = 1; break; } } diff --git a/pc/vganvidia.c b/pc/vganvidia.c index 0cb06aaea066a5f6025c27399ae35b5808b8e4d0..95c567c57493d7c190afde381999f41cbf638c5c 100644 --- a/pc/vganvidia.c +++ b/pc/vganvidia.c @@ -362,6 +362,7 @@ nvidiadrawinit(VGAscr *scr) waitforidle(scr); scr->blank = nvidiablank; + hwblank = 1; scr->fill = nvidiahwfill; scr->scroll = nvidiahwscroll; } diff --git a/pc/vgas3.c b/pc/vgas3.c index e123bc5073106566a0d5cb65366a1bae722782db..6f178b721081e82c38b99d864c618428d9d42d0a 100644 --- a/pc/vgas3.c +++ b/pc/vgas3.c @@ -12,8 +12,6 @@ #include #include "screen.h" -#define round16(x) (((x)+15)&~15) - enum { PCIS3 = 0x5333, /* PCI VID */ @@ -463,7 +461,7 @@ hwscroll(VGAscr *scr, Rectangle r, Rectangle sr) d = scr->gscreen->depth; did = (d-8)/8; cmd = 0x00000020|(Bitbltop<<17)|(did<<2); - stride = round16(Dx(scr->gscreen->r))*d/8; + stride = Dx(scr->gscreen->r)*d/8; if(r.min.x <= sr.min.x){ cmd |= 1<<25; @@ -508,7 +506,7 @@ hwfill(VGAscr *scr, Rectangle r, ulong sval) d = scr->gscreen->depth; did = (d-8)/8; cmd = 0x16000120|(Bitbltop<<17)|(did<<2); - stride = round16(Dx(scr->gscreen->r))*d/8; + stride = Dx(scr->gscreen->r)*d/8; mmio = scr->mmio; waitforlinearfifo(scr); waitforfifo(scr, 8); @@ -533,7 +531,7 @@ enum { }; static void -s3blank(int blank) +s3blank(VGAscr*, int blank) { uchar x; @@ -544,7 +542,6 @@ s3blank(int blank) vgaxo(Seqx, CursorSyncCtl, x); } - static void s3drawinit(VGAscr *scr) { @@ -561,6 +558,9 @@ s3drawinit(VGAscr *scr) * know that size, I'm not turning them on. See waitforlinearfifo * above. */ + scr->blank = s3blank; + /* hwblank = 1; not known to work well */ + switch(id){ case VIRGE: case VIRGEVX: @@ -568,7 +568,6 @@ s3drawinit(VGAscr *scr) scr->mmio = (ulong*)(scr->aperture+0x1000000); scr->fill = hwfill; scr->scroll = hwscroll; - /* scr->blank = hwblank; */ break; case SAVAGEIXMV: scr->mmio = (ulong*)(scr->aperture+0x1000000); diff --git a/pc/vgasavage.c b/pc/vgasavage.c index 726dc827a1fadfbd78634cbe718ee74f1c89b8dd..3df4001af59f79c69d3c1e9cc320110d24aaafca 100644 --- a/pc/vgasavage.c +++ b/pc/vgasavage.c @@ -12,7 +12,6 @@ #include #include "screen.h" -#define round16(x) (((x)+15)&~15) enum { PCIS3 = 0x5333, /* PCI VID */ @@ -363,7 +362,6 @@ savagewaitidle(VGAscr *scr) switch(scr->id){ case SAVAGE4: - case SUPERSAVAGEIXC16: /* wait for engine idle and FIFO empty */ statw = (ulong*)((uchar*)scr->mmio+AltStatus0); mask = CBEMask | Ge2Idle; @@ -373,6 +371,7 @@ savagewaitidle(VGAscr *scr) /* case SAVAGEMX: ? */ /* case SAVAGEIXMV: ? */ /* case SAVAGEIX: ? */ + case SUPERSAVAGEIXC16: case SAVAGEIXMV: /* wait for engine idle and FIFO empty */ statw = (ulong*)((uchar*)scr->mmio+XStatus0); @@ -457,7 +456,6 @@ savagescroll(VGAscr *scr, Rectangle r, Rectangle sr) return 1; } - static void savageblank(VGAscr*, int blank) { @@ -521,7 +519,7 @@ savageinit(VGAscr *scr) /* set bitmap descriptors */ bd = (scr->gscreen->depth<gscreen->r))<gscreen->r)<fill = savagefill; scr->scroll = savagescroll; + scr->blank = savageblank; } diff --git a/pc/vgat2r4.c b/pc/vgat2r4.c index a7f430ed0355571dab5af14b6228cbecf4cc4137..b8003b87eb17e207a24a0f09fc8243688e3ff882 100644 --- a/pc/vgat2r4.c +++ b/pc/vgat2r4.c @@ -562,6 +562,7 @@ t2r4drawinit(VGAscr *scr) scr->fill = t2r4hwfill; scr->scroll = t2r4hwscroll; scr->blank = t2r4blank; + hwblank = 1; } VGAdev vgat2r4dev = { diff --git a/port/devdraw.c b/port/devdraw.c index 19aede8f70ead928cb27550347c0ceaffc2f4478..0a5dbf8ee64b5df0699dd4c25ce3826054881a89 100644 --- a/port/devdraw.c +++ b/port/devdraw.c @@ -860,7 +860,7 @@ initscreenimage(void) } screenimage->width = width; - screenimage->clipr = screenimage->r; + screenimage->clipr = r; return 1; } diff --git a/port/devmouse.c b/port/devmouse.c index 128cf5c1be3e79d1398893c4eab0373d62a67930..1f590c651d5d7294f423d887b8f2a5394431801c 100644 --- a/port/devmouse.c +++ b/port/devmouse.c @@ -501,15 +501,15 @@ mousetrack(int dx, int dy, int b, int msec) dy = scale(dy); } x = mouse.xy.x + dx; - if(x < gscreen->r.min.x) - x = gscreen->r.min.x; - if(x >= gscreen->r.max.x) - x = gscreen->r.max.x; + if(x < gscreen->clipr.min.x) + x = gscreen->clipr.min.x; + if(x >= gscreen->clipr.max.x) + x = gscreen->clipr.max.x; y = mouse.xy.y + dy; - if(y < gscreen->r.min.y) - y = gscreen->r.min.y; - if(y >= gscreen->r.max.y) - y = gscreen->r.max.y; + if(y < gscreen->clipr.min.y) + y = gscreen->clipr.min.y; + if(y >= gscreen->clipr.max.y) + y = gscreen->clipr.max.y; lastb = mouse.buttons; mouse.xy = Pt(x, y);