From 05b33812d620df5cc51b09ef06abd9bf7f95e808 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 9 Aug 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-08-09 --- alphapc/fns.h | 1 - bitsy/devsac.c | 4 +- bitsy/fns.h | 1 - bitsy/l.s | 16 ++++++ bitsy/power.c | 16 ++---- bitsy/screen.c | 12 +---- pc/devarch.c | 1 - pc/fns.h | 1 - port/devpnp.c | 131 +++++++++++++++++++++++++++---------------------- port/portfns.h | 3 ++ 10 files changed, 99 insertions(+), 87 deletions(-) diff --git a/alphapc/fns.h b/alphapc/fns.h index 4552b73ffdd129f2e3c5e72ec16a627a1637a3e1..33b0e18e75b2ae836c861db6fee32d13f32fc8b7 100644 --- a/alphapc/fns.h +++ b/alphapc/fns.h @@ -47,7 +47,6 @@ int ioalloc(int, int, int, char*); void iofree(int); void ioinit(void); int iounused(int, int); -int iprint(char*, ...); int irqallocread(char*, long, vlong); int isaconfig(char*, int, ISAConf*); void kbdinit(void); diff --git a/bitsy/devsac.c b/bitsy/devsac.c index e6bb8a9d05fe3835c2832d8317da98779445e0ea..4edd5d36701d51f558e772c6535d7d4daf398633 100644 --- a/bitsy/devsac.c +++ b/bitsy/devsac.c @@ -136,10 +136,10 @@ sacinit(void) uchar *p; int i; - p = (uchar*)Flash_tar+4; + p = (uchar*)Flash_tar; data = tarlookup(p, sacfs, &i); if(data == 0) { - p = (uchar*)Flash_tar; + p = (uchar*)Flash_tar+4; data = tarlookup(p, sacfs, &i); if(data == 0) { print("devsac: could not find file: %s\n", sacfs); diff --git a/bitsy/fns.h b/bitsy/fns.h index 1cd4405be8b3095290c7df9c2ceac3f40ac5debc..0497f3e37487ff0f89530ae2afc8c7453b6e5f6e 100644 --- a/bitsy/fns.h +++ b/bitsy/fns.h @@ -41,7 +41,6 @@ ushort ins(ulong); void inss(ulong, void*, int); ulong inl(ulong); void intrenable(int, int, void (*)(Ureg*, void*), void*, char*); -int iprint(char*, ...); void irpower(int); #define kmapinval() void lcdpower(int); diff --git a/bitsy/l.s b/bitsy/l.s index ac10173ac52cee5ec8ea325c52610eba07e766bb..16f7c0e6a2787962d7e709870b34bc1e8ecc295e 100644 --- a/bitsy/l.s +++ b/bitsy/l.s @@ -451,6 +451,16 @@ TEXT gotolabel(SB), $-4 MOVW $1, R0 RET +/* Debugging print routine */ +TEXT _PrChar(SB), $-4 + MOVW UART3REGS, R1 +prloop: + MOVW 0x20(R1), R2 + AND $0x4, R2 + BEQ prloop + MOVB R0,0x14(R1) + RET + /* save the state machine in power_resume[] for an upcoming suspend */ TEXT setpowerlabel(SB), $-4 @@ -552,9 +562,15 @@ TEXT sa1100_power_resume(SB), $-4 MCR CpMMU, 0, R0, C(CpCacheFlush), C(0xa), 4 /* gotopowerlabel() */ /* svc */ +/* Debug + MOVW $0x25, R0 + BL _PrChar(SB) + */ MOVW $power_resume+0(SB), R0 MOVW 56(R0), R1 /* R1: SPSR, R2: CPSR */ MOVW 60(R0), R2 + MOVW R1, SPSR + MOVW R2, CPSR /* copro */ MOVW 148(R0), R3 MCR CpMMU, 0, R3, C(CpTTB), C(0x0) diff --git a/bitsy/power.c b/bitsy/power.c index d0f74d84d7943c18a60ab541002fa5b6bb3507fa..295e96e9549c370c9f9ee135efd747347d84ff4a 100644 --- a/bitsy/power.c +++ b/bitsy/power.c @@ -94,6 +94,7 @@ sa1100_power_off(void) powerregs->pspr = 0; /* set lowest clock; delay to avoid resume hangs on fast sa1110 */ +sa1100_power_resume(); delay(90); powerregs->ppcr = 0; delay(90); @@ -130,10 +131,6 @@ deepsleep(void) { void *xsp, *xlink; power_pl = splhi(); -xsp = getsp(); -xlink = getlink(); -iprint("starting power down, sp = %lux, link = %lux\n", xsp, xlink); -delay(1000); cachewb(); delay(500); if (setpowerlabel()) { @@ -142,8 +139,9 @@ delay(1000); cacheflush(); trapresume(); rs232power(1); - irpower(1); - audiopower(1); + uartpower(1); +// irpower(1); +// audiopower(1); clockpower(1); gpclkregs->r0 = 1<<0; gpiocpy(gpioregs, &savedgpioregs); @@ -153,17 +151,11 @@ delay(1000); gpioregs->edgestatus = (1<icip = (1<lccr0 */ LEN = 0, /* 1 bit */ @@ -157,14 +155,6 @@ static void screenputc(char *buf); static void bitsyscreenputs(char *s, int n); static void scroll(void); -static void -lcdstop(void) { - lcd->lccr0 &= ~(0<lcsr & LDD) == 0) - delay(10); - lcdpower(0); -} - static void lcdinit(void) { @@ -315,6 +305,8 @@ void blankscreen(int blank) { if (blank) { + lcd->lccr0 &= ~(0<aux instead of performing lookup on each read/write + * + * I also need to write the user program that'll drive the PNP configuration... + */ #include "u.h" #include "../port/lib.h" #include "mem.h" @@ -11,7 +22,7 @@ typedef struct Card Card; struct Pnp { - Lock; + QLock; int rddata; int debug; Card *cards; @@ -167,26 +178,31 @@ serial(ulong id1, ulong id2) return buf; } -/* called with pnp locked */ static Card * -findcsn(int csn, int create) +findcsn(int csn, int create, int dolock) { Card *c, *nc, **l; + if(dolock) + qlock(&pnp); l = &pnp.cards; for(c = *l; c != nil; c = *l) { if(c->csn == csn) - return c; + goto done; if(c->csn > csn) break; l = &c->next; } - if(!create) - return nil; - *l = nc = malloc(sizeof(Card)); - nc->next = c; - nc->csn = csn; - return nc; + if(create) { + *l = nc = malloc(sizeof(Card)); + nc->next = c; + nc->csn = csn; + c = nc; + } +done: + if(dolock) + qunlock(&pnp); + return c; } static int @@ -236,11 +252,9 @@ static int pnpscan(int rddata, int dawn) { Card *c; - int csn, ok; + int csn; ulong id1, id2; - ilock(&pnp); - pnp.rddata = rddata; initiation(); /* upsilon sigma */ cmd(0x02, 0x04+0x01); /* reset CSN on all cards and reset logical devices */ delay(1); /* delay after resetting cards */ @@ -253,7 +267,7 @@ pnpscan(int rddata, int dawn) break; if(c == nil) { csn = newcsn(); - c = findcsn(csn, 1); + c = findcsn(csn, 1, 0); c->id1 = id1; c->id2 = id2; } @@ -269,9 +283,11 @@ pnpscan(int rddata, int dawn) cmd(0x03, 0); /* Wake all cards with a CSN of 0, putting this card to sleep */ } cmd(0x02, 0x02); /* return cards to Wait for Key state */ - ok = (pnp.cards != 0); - iunlock(&pnp); - return ok; + if(pnp.cards != 0) { + pnp.rddata = rddata; + return 1; + } + return 0; } static void @@ -311,7 +327,7 @@ bad: p = nil; else goto bad; - c = findcsn(csn, 1); + c = findcsn(csn, 1, 0); c->id1 = id1; c->id2 = id2; c->cfgstr = p; @@ -323,18 +339,17 @@ static int csngen(Chan *c, int t, int csn, Card *cp, Dir *dp) { Qid q; - static char buf[20]; switch(t) { case Qcsnctl: q = (Qid){QID(csn, Qcsnctl), 0, 0}; - sprint(buf, "csn%dctl", csn); - devdir(c, q, buf, 0, eve, 0664, dp); + sprint(up->genbuf, "csn%dctl", csn); + devdir(c, q, up->genbuf, 0, eve, 0664, dp); return 1; case Qcsnraw: q = (Qid){QID(csn, Qcsnraw), 0, 0}; - sprint(buf, "csn%draw", csn); - devdir(c, q, buf, cp->ncfg, eve, 0444, dp); + sprint(up->genbuf, "csn%draw", csn); + devdir(c, q, up->genbuf, cp->ncfg, eve, 0444, dp); return 1; } return -1; @@ -344,17 +359,16 @@ static int pcigen(Chan *c, int t, int tbdf, Dir *dp) { Qid q; - static char name[KNAMELEN]; q = (Qid){BUSBDF(tbdf)|t, 0, 0}; switch(t) { case Qpcictl: - snprint(name, KNAMELEN, "%d.%d.%dctl", BUSBNO(tbdf), BUSDNO(tbdf), BUSFNO(tbdf)); - devdir(c, q, name, 0, eve, 0444, dp); + sprint(up->genbuf, "%d.%d.%dctl", BUSBNO(tbdf), BUSDNO(tbdf), BUSFNO(tbdf)); + devdir(c, q, up->genbuf, 0, eve, 0444, dp); return 1; case Qpciraw: - snprint(name, KNAMELEN, "%d.%d.%draw", BUSBNO(tbdf), BUSDNO(tbdf), BUSFNO(tbdf)); - devdir(c, q, name, 128, eve, 0444, dp); + sprint(up->genbuf, "%d.%d.%draw", BUSBNO(tbdf), BUSDNO(tbdf), BUSFNO(tbdf)); + devdir(c, q, up->genbuf, 128, eve, 0444, dp); return 1; } return -1; @@ -367,34 +381,33 @@ pnpgen(Chan *c, char *, Dirtab*, int, int s, Dir *dp) Card *cp; Pcidev *p; int csn, tbdf; - static char name[KNAMELEN]; switch(TYPE(c->qid)){ case Qtopdir: if(s == DEVDOTDOT){ q = (Qid){QID(0, Qtopdir), 0, QTDIR}; - snprint(name, KNAMELEN, "#%C", pnpdevtab.dc); - devdir(c, q, name, 0, eve, 0555, dp); + sprint(up->genbuf, "#%C", pnpdevtab.dc); + devdir(c, q, up->genbuf, 0, eve, 0555, dp); return 1; } return devgen(c, nil, topdir, nelem(topdir), s, dp); case Qpnpdir: if(s == DEVDOTDOT){ q = (Qid){QID(0, Qtopdir), 0, QTDIR}; - snprint(name, KNAMELEN, "#%C", pnpdevtab.dc); - devdir(c, q, name, 0, eve, 0555, dp); + sprint(up->genbuf, "#%C", pnpdevtab.dc); + devdir(c, q, up->genbuf, 0, eve, 0555, dp); return 1; } if(s < nelem(pnpdir)-1) return devgen(c, nil, pnpdir, nelem(pnpdir), s, dp); s -= nelem(pnpdir)-1; - ilock(&pnp); + qlock(&pnp); cp = pnp.cards; while(s >= 2 && cp != nil) { s -= 2; cp = cp->next; } - iunlock(&pnp); + qunlock(&pnp); if(cp == nil) return -1; return csngen(c, s+Qcsnctl, cp->csn, cp, dp); @@ -403,17 +416,15 @@ pnpgen(Chan *c, char *, Dirtab*, int, int s, Dir *dp) case Qcsnctl: case Qcsnraw: csn = CSN(c->qid); - ilock(&pnp); - cp = findcsn(csn, 0); - iunlock(&pnp); + cp = findcsn(csn, 0, 1); if(cp == nil) return -1; return csngen(c, TYPE(c->qid), csn, cp, dp); case Qpcidir: if(s == DEVDOTDOT){ q = (Qid){QID(0, Qtopdir), 0, QTDIR}; - snprint(name, KNAMELEN, "#%C", pnpdevtab.dc); - devdir(c, q, name, 0, eve, 0555, dp); + sprint(up->genbuf, "#%C", pnpdevtab.dc); + devdir(c, q, up->genbuf, 0, eve, 0555, dp); return 1; } p = pcimatch(nil, 0, 0); @@ -477,7 +488,7 @@ pnpread(Chan *c, void *va, long n, vlong offset) Card *cp; Pcidev *p; int csn, i, tbdf; - char *a = va, buf[256]; + char *a = va; switch(TYPE(c->qid)){ case Qtopdir: @@ -486,20 +497,18 @@ pnpread(Chan *c, void *va, long n, vlong offset) return devdirread(c, a, n, (Dirtab *)0, 0L, pnpgen); case Qpnpctl: if(pnp.rddata > 0) - sprint(buf, "enabled 0x%x\n", pnp.rddata); + sprint(up->genbuf, "enabled 0x%x\n", pnp.rddata); else - sprint(buf, "disabled\n"); - return readstr(offset, a, n, buf); + sprint(up->genbuf, "disabled\n"); + return readstr(offset, a, n, up->genbuf); case Qcsnraw: csn = CSN(c->qid); - ilock(&pnp); - cp = findcsn(csn, 0); - iunlock(&pnp); + cp = findcsn(csn, 0, 1); if(cp == nil) error(Egreg); if(offset+n > cp->ncfg) n = cp->ncfg - offset; - ilock(&pnp); + qlock(&pnp); initiation(); cmd(0x03, csn); /* Wake up the card */ for (i = 0; i < offset+9; i++) /* 9 == skip serial + csum */ @@ -508,25 +517,23 @@ pnpread(Chan *c, void *va, long n, vlong offset) a[i] = getresbyte(pnp.rddata); cmd(0x03, 0); /* Wake all cards with a CSN of 0, putting this card to sleep */ cmd(0x02, 0x02); /* return cards to Wait for Key state */ - iunlock(&pnp); + qunlock(&pnp); break; case Qcsnctl: csn = CSN(c->qid); - ilock(&pnp); - cp = findcsn(csn, 0); - iunlock(&pnp); + cp = findcsn(csn, 0, 1); if(cp == nil) error(Egreg); - sprint(buf, "%s\n", serial(cp->id1, cp->id2)); - return readstr(offset, a, n, buf); + sprint(up->genbuf, "%s\n", serial(cp->id1, cp->id2)); + return readstr(offset, a, n, up->genbuf); case Qpcictl: tbdf = MKBUS(BusPCI, 0, 0, 0)|BUSBDF((ulong)c->qid.path); p = pcimatchtbdf(tbdf); if(p == nil) error(Egreg); - snprint(buf, sizeof(buf), "class %.2x subclass %.2x piclass %.2x vid %.4x did %.4x intl %d\n", + sprint(up->genbuf, "class %.2x subclass %.2x piclass %.2x vid %.4x did %.4x intl %d\n", p->ccrb, p->ccru, p->ccrp, p->vid, p->did, p->intl); - return readstr(offset, a, n, buf); + return readstr(offset, a, n, up->genbuf); case Qpciraw: tbdf = MKBUS(BusPCI, 0, 0, 0)|BUSBDF((ulong)c->qid.path); p = pcimatchtbdf(tbdf); @@ -558,8 +565,16 @@ pnpwrite(Chan *c, void *a, long n, vlong) port = strtoul(buf+5, 0, 0); if(port < 0x203 || port > 0x3ff) error("bad value for rddata port"); + qlock(&pnp); + if(waserror()) { + qunlock(&pnp); + nexterror(); + } + if(pnp.rddata > 0) + error("pnp port already set"); if(!pnpscan(port, 0)) error("no cards found"); + qunlock(&pnp); } else if(strncmp(buf, "debug ", 6) == 0) pnp.debug = strtoul(buf+6, 0, 0); @@ -568,9 +583,7 @@ pnpwrite(Chan *c, void *a, long n, vlong) break; case Qcsnctl: csn = CSN(c->qid); - ilock(&pnp); - cp = findcsn(csn, 0); - iunlock(&pnp); + cp = findcsn(csn, 0, 1); if(cp == nil) error(Egreg); if(!wrconfig(cp, buf)) diff --git a/port/portfns.h b/port/portfns.h index d4e2eed19132e59a92ff9a9822e740956d4b9af5..981c1d41c27a07cf934f37b0ce60b7d4f299674e 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -121,6 +121,7 @@ void ilock(Lock*); void iunlock(Lock*); int incref(Ref*); void initseg(void); +int iprint(char*, ...); void isdir(Chan*); int iseve(void); int islo(void); @@ -348,3 +349,5 @@ void hnputs(void*, ushort); vlong nhgetv(void*); ulong nhgetl(void*); ushort nhgets(void*); + +#pragma varargck argpos iprint 1