M alphapc/devvga.c => alphapc/devvga.c +5 -5
@@ 93,21 93,21 @@ vgaread(Chan* c, void* a, long n, vlong off)
s = scr->dev->name;
else
s = "cga";
- len = snprint(p, READSTR, "type: %s\n", s);
+ len = snprint(p, READSTR, "type %s\n", s);
if(scr->gscreen)
- len += snprint(p+len, READSTR-len, "size: %dx%dx%d\n",
+ len += snprint(p+len, READSTR-len, "size %dx%dx%d\n",
scr->gscreen->r.max.x, scr->gscreen->r.max.y,
1<<scr->gscreen->ldepth);
if(scr->cur)
s = scr->cur->name;
else
s = "off";
- len += snprint(p+len, READSTR-len, "hwgc: %s\n", s);
+ len += snprint(p+len, READSTR-len, "hwgc %s\n", s);
if(scr->pciaddr)
- snprint(p+len, READSTR-len, "addr: 0x%lux\n",
+ snprint(p+len, READSTR-len, "addr 0x%lux\n",
scr->pciaddr);
else
- snprint(p+len, READSTR-len, "addr: 0x%lux\n",
+ snprint(p+len, READSTR-len, "addr 0x%lux\n",
scr->aperture);
n = readstr(offset, a, n, p);
M pc/devvga.c => pc/devvga.c +20 -12
@@ 86,6 86,7 @@ vgaread(Chan* c, void* a, long n, vlong off)
char *p, *s;
VGAscr *scr;
ulong offset = off;
+ char chbuf[30];
switch(c->qid.path & ~CHDIR){
@@ 100,22 101,29 @@ vgaread(Chan* c, void* a, long n, vlong off)
free(p);
nexterror();
}
+
+ len = 0;
+
if(scr->dev)
s = scr->dev->name;
else
s = "cga";
- len = snprint(p, READSTR, "type: %s\n", s);
- if(scr->gscreen)
- len += snprint(p+len, READSTR-len, "size: %dx%dx%d\n",
+ len += snprint(p+len, READSTR-len, "type %s\n", s);
+
+ if(scr->gscreen) {
+ len += snprint(p+len, READSTR-len, "size %dx%dx%d %s\n",
scr->gscreen->r.max.x, scr->gscreen->r.max.y,
- scr->gscreen->depth);
- if(scr->cur)
- s = scr->cur->name;
- else
- s = "off";
- len += snprint(p+len, READSTR-len, "hwgc: %s\n", s);
- snprint(p+len, READSTR-len, "addr: 0x%lux\n", scr->aperture);
+ scr->gscreen->depth, chantostr(chbuf, scr->gscreen->chan));
+ if(Dx(scr->gscreen->r) != Dx(physgscreenr)
+ || Dy(scr->gscreen->r) != Dy(physgscreenr))
+ len += snprint(p+len, READSTR-len, "actualsize %dx%d\n",
+ physgscreenr.max.x, physgscreenr.max.y);
+ }
+
+ len += snprint(p+len, READSTR-len, "hwaccel %s\n", hwaccel ? "on" : "off");
+ len += snprint(p+len, READSTR-len, "hwblank %s\n", hwblank ? "on" : "off");
+ snprint(p+len, READSTR-len, "addr 0x%lux\n", scr->aperture);
n = readstr(offset, a, n, p);
poperror();
free(p);
@@ 291,9 299,9 @@ vgactl(char* a)
}
*/
else if(strcmp(field[0], "blank") == 0){
- if(n < 2)
+ if(n < 1)
error(Ebadarg);
- drawblankscreen(atoi(field[1]));
+ drawblankscreen(1);
return;
}
else if(strcmp(field[0], "hwaccel") == 0){
M pc/screen.h => pc/screen.h +1 -0
@@ 145,3 145,4 @@ extern void vgaimageinit(ulong);
extern ulong vgapcilinear(VGAscr*, int*, int*, int, int);
extern void drawblankscreen(int);
+extern void vgablank(VGAscr*, int);
M pc/vga.c => pc/vga.c +27 -0
@@ 190,3 190,30 @@ vgascreenwin(VGAscr* scr)
screenputs = vgascreenputs;
}
+/*
+ * Supposedly this is the way to turn DPMS
+ * monitors off using just the VGA registers.
+ * Unfortunately, it seems to mess up the video mode
+ * on the cards I've tried.
+ */
+void
+vgablank(VGAscr*, int blank)
+{
+ uchar seq1, crtc17;
+
+ if(blank) {
+ seq1 = 0x00;
+ crtc17 = 0x80;
+ } else {
+ seq1 = 0x20;
+ crtc17 = 0x00;
+ }
+
+ outs(Seqx, 0x0100); /* synchronous reset */
+ seq1 |= vgaxi(Seqx, 1) & ~0x20;
+ vgaxo(Seqx, 1, seq1);
+ crtc17 |= vgaxi(Crtx, 0x17) & ~0x80;
+ delay(10);
+ vgaxo(Crtx, 0x17, crtc17);
+ outs(Crtx, 0x0300); /* end synchronous reset */
+}
M pc/vgamach64xx.c => pc/vgamach64xx.c +18 -0
@@ 138,6 138,9 @@ enum {
BusCntl = 0x13,
GenTestCntl = 0x19,
+ CrtcHsyncDis = 0x04,
+ CrtcVsyncDis = 0x08,
+
ContextMask = 0x100, /* not accessible via I/O */
FifoStat,
GuiStat,
@@ 654,6 657,20 @@ mach64hwscroll(VGAscr *scr, Rectangle r, Rectangle sr)
return 1;
}
+/*
+ * This should work, but doesn't.
+ */
+static void
+mach64blank(VGAscr *scr, int blank)
+{
+ ulong ctl;
+
+ ctl = ior32(scr, CrtcGenCtl) & ~(CrtcHsyncDis|CrtcVsyncDis);
+ if(blank)
+ ctl |= CrtcHsyncDis|CrtcVsyncDis;
+ iow32(scr, CrtcGenCtl, ctl);
+}
+
static void
mach64xxdrawinit(VGAscr *scr)
{
@@ 662,6 679,7 @@ mach64xxdrawinit(VGAscr *scr)
scr->fill = mach64hwfill;
scr->scroll = mach64hwscroll;
}
+/* scr->blank = mach64blank; */
}
M port/chan.c => port/chan.c +15 -73
@@ 592,49 592,6 @@ createdir(Chan *c)
return 0;
}
-Chan*
-mchan(char *id, int walkname)
-{
- Chan *c;
- Pgrp *pg;
- Mount *t;
- int mdev;
- ulong mountid;
- Mhead **h, **he, *f;
-
- mountid = strtoul(id, 0, 0);
- mdev = devno('M', 0);
-
- pg = up->pgrp;
- rlock(&pg->ns);
- if(waserror()) {
- runlock(&pg->ns);
- nexterror();
- }
-
- he = &pg->mnthash[MNTHASH];
- for(h = pg->mnthash; h < he; h++) {
- for(f = *h; f; f = f->hash) {
- for(t = f->mount; t; t = t->next) {
- c = t->to;
- if(c->type == mdev && c->mntptr->id == mountid) {
- if(walkname == 0) {
- c = c->mntptr->c;
- incref(c);
- }
- else
- c = cclone(c, 0);
- runlock(&pg->ns);
- poperror();
- return c;
- }
- }
- }
- }
- error(Enonexist);
- return 0;
-}
-
void
saveregisters(void)
{
@@ 710,6 667,16 @@ namec(char *name, int amode, int omode, ulong perm)
c = cclone(up->slash, 0);
break;
case '#':
+ cname = newcname(name); /* save this before advancing */
+ mntok = 0;
+ elem[0] = 0;
+ n = 0;
+ while(*name && (*name != '/' || n < 2)){
+ if(n >= NAMELEN-1)
+ error(Efilename);
+ elem[n++] = *name++;
+ }
+ elem[n] = '\0';
/*
* noattach is sandboxing.
*
@@ 721,38 688,13 @@ namec(char *name, int amode, int omode, ulong perm)
* c time and pid, but also cons and consctl
* p control of your own processes (and unfortunately
* any others left unprotected)
- * all are ASCII, so it's safe to use strchr to check.
*/
- if(up->pgrp->noattach)
- if(strchr("|decp", name[1]) == 0)
- error(Enoattach);
- cname = newcname(name); /* save this before advancing */
- mntok = 0;
- elem[0] = 0;
- n = 0;
- while(*name && (*name != '/' || n < 2)){
- if(n >= NAMELEN-1)
- error(Efilename);
- elem[n++] = *name++;
- }
- elem[n] = '\0';
n = chartorune(&r, elem+1)+1;
- if(r == 'M') {
- if(elem[n] == 'c') {
- c = mchan(elem+n+1, 0);
- name = skipslash(name);
- if(*name)
- error(Efilename);
- poperror();
- cnameclose(cname);
- return c;
- }
- else {
- c = mchan(elem+n, 1);
- name = skipslash(name);
- }
- break;
- }
+ /* actually / is caught by parsing earlier */
+ if(utfrune("M", r))
+ error(Enoattach);
+ if(up->pgrp->noattach && utfrune("|decp", r))
+ error(Enoattach);
t = devno(r, 1);
if(t == -1)
error(Ebadsharp);