From 72e8acdc72fbffcf1358ee72b281848476858e9c Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 31 Jul 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-07-31 --- alphapc/dat.h | 2 ++ alphapc/main.c | 2 +- bitsy/dat.h | 2 ++ bitsy/power.c | 30 ++++++++---------- pc/dat.h | 2 ++ pc/devi82365.c | 16 +++------- port/devpnp.c | 84 ++++++++++++++++++++++++++++++++++++++------------ port/portdat.h | 1 - port/sysfile.c | 16 +++++----- 9 files changed, 96 insertions(+), 59 deletions(-) diff --git a/alphapc/dat.h b/alphapc/dat.h index c9911707e770cbb86253fc580cabecbacde6eaf3..1bd82cf49af67847b605d29a710fda28bcd53c7a 100644 --- a/alphapc/dat.h +++ b/alphapc/dat.h @@ -15,6 +15,8 @@ typedef struct Sys Sys; typedef struct Ureg Ureg; typedef struct Vctl Vctl; +#define MAXSYSARG 6 /* for mount(fd, mpt, flag, arg, srv) */ + /* * parameters for sysproc.c */ diff --git a/alphapc/main.c b/alphapc/main.c index b1d4ffe9b1afc964e6fe88018c00f9bb3dc64f82..85d604d24bd1f48567d7a33199d87d9b859b9cfa 100644 --- a/alphapc/main.c +++ b/alphapc/main.c @@ -189,7 +189,7 @@ userinit(void) * Kernel Stack */ p->sched.pc = (ulong)init0; - p->sched.sp = (ulong)p->kstack+KSTACK-(1+MAXSYSARG)*BY2WD; + p->sched.sp = (ulong)p->kstack+KSTACK-MAXSYSARG*BY2WD; /* * User Stack, pass input arguments to boot process */ diff --git a/bitsy/dat.h b/bitsy/dat.h index f3071fb9783b73dbacdd0f3935899543cce29b72..0da0d1ca5d689988e42687f6435e87cd779f2d0c 100644 --- a/bitsy/dat.h +++ b/bitsy/dat.h @@ -24,6 +24,8 @@ typedef struct Uart Uart; typedef void IntrHandler(Ureg*, void*); +#define MAXSYSARG 5 /* for mount(fd, mpt, flag, arg, srv) */ + /* * parameters for sysproc.c */ diff --git a/bitsy/power.c b/bitsy/power.c index 95f5bae666e6de40837639b32a9fd4e377c75f4f..acc220f6bcc7b35526c78a7b6d507bff82bd7f90 100644 --- a/bitsy/power.c +++ b/bitsy/power.c @@ -88,8 +88,7 @@ sa1100_power_off(void) powerregs->pcfr = PCFR_opde | PCFR_fp | PCFR_fs; powerregs->pgsr = 0; /* set resume address. The loader jumps to it */ -// powerregs->pspr = (ulong)sa1100_power_resume; - powerregs->pspr = (ulong)_start; + powerregs->pspr = (ulong)sa1100_power_resume; /* set lowest clock; delay to avoid resume hangs on fast sa1110 */ delay(90); @@ -128,10 +127,10 @@ 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); +xsp = getsp(); +xlink = getlink(); +iprint("starting power down, sp = %lux, link = %lux\n", xsp, xlink); +delay(1000); cachewb(); delay(500); if (setpowerlabel()) { @@ -157,10 +156,10 @@ deepsleep(void) { iprint("\nresuming execution\n"); // dumpitall(); delay(800); - delay(1000); - xsp = getsp(); - xlink = getlink(); - iprint("power restored, sp = %lux, link = %lux\n", xsp, xlink); +xsp = getsp(); +xlink = getlink(); +iprint("power restored, sp = %lux, link = %lux\n", xsp, xlink); +delay(1000); splx(power_pl); return; @@ -174,9 +173,9 @@ deepsleep(void) { clockpower(0); irpower(0); audiopower(0); -// screenpower(0); + screenpower(0); µcpower(0); -// rs232power(0); + rs232power(0); sa1100_power_off(); /* no return */ } @@ -189,13 +188,11 @@ powerkproc(void*) while(powerflag == 0) sleep(&powerr, powerdown, 0); - deepsleep(); delay(2000); powerflag = 0; - } } @@ -217,9 +214,8 @@ onoffintr(Ureg* , void*) return; /* bounced */ } - deepsleep(); -// powerflag = 1; -// wakeup(&powerr); + powerflag = 1; + wakeup(&powerr); } void diff --git a/pc/dat.h b/pc/dat.h index e4aff19140870d065b93c49b8ea4924273edd062..2cdcabaf5fc7067ce37e20c13aa1e24c44e86d61 100644 --- a/pc/dat.h +++ b/pc/dat.h @@ -17,6 +17,8 @@ typedef struct Segdesc Segdesc; typedef struct Ureg Ureg; typedef struct Vctl Vctl; +#define MAXSYSARG 5 /* for mount(fd, mpt, flag, arg, srv) */ + /* * parameters for sysproc.c */ diff --git a/pc/devi82365.c b/pc/devi82365.c index 67ed0f94ee4ca2a00b8335fde34bbf091283a483..58e732ca937bd578941e342d7a2a2df6e4c9eca7 100644 --- a/pc/devi82365.c +++ b/pc/devi82365.c @@ -7,15 +7,7 @@ #include "io.h" /* - * Support for up to 4 PCMslot card slots. Generalizing above that is hard - * since addressing is not obvious. - presotto - * - * WARNING: This has never been tried with more than one card slot. - */ - -/* - * Intel 82365SL PCIC controller for the PCMCIA or - * Cirrus Logic PD6710/PD6720 which is mostly register compatible + * Intel 82365SL PCIC controller and compatibles. */ enum { @@ -159,6 +151,7 @@ slotinfo(PCMslot *pp) pp->wrprot = isr & (1<<4); pp->busy = isr & (1<<5); pp->msec = TK2MS(MACHP(0)->ticks); +print("isr %2.2uX misc1 %2.2uX\n", isr, rdreg(pp, Rmisc1)); } static int @@ -467,8 +460,8 @@ pcmgen(Chan *c, char*, Dirtab *, int , int i, Dir *dp) static char *chipname[] = { [Ti82365] "Intel 82365SL", -[Tpd6710] "Cirrus Logic PD6710", -[Tpd6720] "Cirrus Logic PD6720", +[Tpd6710] "Cirrus Logic CL-PD6710", +[Tpd6720] "Cirrus Logic CL-PD6720", [Tvg46x] "Vadem VG-46x", }; @@ -609,7 +602,6 @@ i82365reset(void) nslot += controller[i]->nslot; slot = xalloc(nslot * sizeof(PCMslot)); - /* if the card is there turn on 5V power to keep its battery alive */ lastslot = slot; for(i = 0; i < ncontroller; i++){ cp = controller[i]; diff --git a/port/devpnp.c b/port/devpnp.c index 743c020f66ad177ea49ede8734e12776e5b2581a..c51280fd23a4b8a8aae4c6fabec07c0d1fcf8e3c 100644 --- a/port/devpnp.c +++ b/port/devpnp.c @@ -21,6 +21,7 @@ struct Card int csn; ulong id1; ulong id2; + char *cfgstr; int ncfg; Card* next; }; @@ -62,6 +63,7 @@ static Dirtab pnpdir[] = { }; extern Dev pnpdevtab; +static int wrconfig(Card*, char*); static char key[32] = { @@ -230,7 +232,7 @@ pnpncfg(int rddata) /* look for cards, and assign them CSNs */ static int -pnpscan(int rddata) +pnpscan(int rddata, int dawn) { Card *c; int csn, ok; @@ -238,7 +240,7 @@ pnpscan(int rddata) ilock(&pnp); pnp.rddata = rddata; - initiation(); + initiation(); /* upsilon sigma */ cmd(0x02, 0x04+0x01); /* reset CSN on all cards and reset logical devices */ delay(1); /* delay after resetting cards */ @@ -254,8 +256,14 @@ pnpscan(int rddata) c->id1 = id1; c->id2 = id2; } + else if(c->cfgstr != nil) { + if(!wrconfig(c, c->cfgstr)) + print("pnp%d: bad cfg: %s\n", c->csn, c->cfgstr); + c->cfgstr = nil; + } cmd(0x06, c->csn); /* set the card's csn */ - print("pnp%d: %s\n", c->csn, serial(id1, id2)); + if(dawn) + print("pnp%d: %s\n", c->csn, serial(id1, id2)); c->ncfg = pnpncfg(rddata); cmd(0x03, 0); /* Wake all cards with a CSN of 0, putting this card to sleep */ } @@ -296,13 +304,18 @@ bad: x = strtoul(&s[3], 0, 16); id1 = (i1<<2)|((i2>>3)&3)|((i2&7)<<13)|(i3<<8)|((x&0xff)<<24)|((x&0xff00)<<8); id2 = strtoul(&s[8], &p, 16); - if(*p != ' ' && *p != '\0') + if(*p == ' ') + p++; + else if(*p == '\0') + p = nil; + else goto bad; c = findcsn(csn, 1); c->id1 = id1; c->id2 = id2; + c->cfgstr = p; } - pnpscan(isa.port); + pnpscan(isa.port, 1); } static int @@ -334,7 +347,6 @@ pnpgen(Chan *c, char *, Dirtab*, int, int s, Dir *dp) Card *cp; char name[KNAMELEN]; -DPRINT("pnpgen s %d offset %uld qid %lux\n", s, (ulong)c->offset, (ulong)c->qid.path); switch(TYPE(c->qid)){ case Qtopdir: if(s == DEVDOTDOT){ @@ -351,11 +363,9 @@ DPRINT("pnpgen s %d offset %uld qid %lux\n", s, (ulong)c->offset, (ulong)c->qid. devdir(c, q, name, 0, eve, 0555, dp); return 1; } -DPRINT("Qpnpdir s %d\n", s); - if(s < nelem(pnpdir)) + if(s < nelem(pnpdir)-1) return devgen(c, nil, pnpdir, nelem(pnpdir), s, dp); - s -= nelem(pnpdir); -DPRINT("Qpnpdir s now %d\n", s); + s -= nelem(pnpdir)-1; ilock(&pnp); cp = pnp.cards; while(s >= 2 && cp != nil) { @@ -363,7 +373,6 @@ DPRINT("Qpnpdir s now %d\n", s); cp = cp->next; } iunlock(&pnp); -DPRINT("Qpnpdir s now %d, cp %p\n", s, cp); if(cp == nil) return -1; return pnpgen1(c, s+Qcsnctl, cp->csn, cp, dp); @@ -472,22 +481,25 @@ pnpread(Chan *c, void *va, long n, vlong offset) } static long -pnpwrite(Chan *c, void *a, long n, vlong offset) +pnpwrite(Chan *c, void *a, long n, vlong) { + int csn; + Card *cp; ulong port; char buf[256]; + if(n >= sizeof(buf)) + n = sizeof(buf)-1; + strncpy(buf, a, n); + buf[n] = 0; + switch(TYPE(c->qid)){ case Qpnpctl: - if(n >= sizeof(buf)) - n = sizeof(buf)-1; - strncpy(buf, a, n); - buf[n] = 0; - if(strncmp(buf, "rddata ", 7) == 0) { - port = strtoul(buf+7, 0, 0); + if(strncmp(buf, "port ", 5) == 0) { + port = strtoul(buf+5, 0, 0); if(port < 0x203 || port > 0x3ff) error("bad value for rddata port"); - if(!pnpscan(port)) + if(!pnpscan(port, 0)) error("no cards found"); } else if(strncmp(buf, "debug ", 6) == 0) @@ -495,13 +507,45 @@ pnpwrite(Chan *c, void *a, long n, vlong offset) else error(Ebadctl); break; + case Qcsnctl: + csn = CSN(c->qid); + ilock(&pnp); + cp = findcsn(csn, 0); + iunlock(&pnp); + if(cp == nil) + error(Egreg); + if(!wrconfig(cp, buf)) + error(Ebadctl); + break; default: -USED(offset); error(Egreg); } return n; } +static int +wrconfig(Card *c, char *cmd) +{ + for(;;) { + while(*cmd == ' ' || *cmd == '\t' || *cmd == '\n') + cmd++; + if(*cmd == '\0') + break; + if(strncmp(cmd, "foo ", 4) == 0) { + print("pnp%d: got foo\n", c->csn); + cmd += 4; + } + else if(strncmp(cmd, "bar ", 4) == 0) { + print("pnp%d: got bar\n", c->csn); + cmd += 4; + } + else + return 0; + } + return 1; +} + + Dev pnpdevtab = { '$', "pnp", diff --git a/port/portdat.h b/port/portdat.h index 674de22840739201f587609c7e2fae72595c348b..e79838b13d81afa7fdf5bb7b577ad8d341f58013 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -92,7 +92,6 @@ struct Alarms Proc *head; }; -#define MAXSYSARG 5 /* for mount(fd, mpt, flag, arg, srv) */ struct Sargs { ulong args[MAXSYSARG]; diff --git a/port/sysfile.c b/port/sysfile.c index 847fbaf2764ae8fcc768e611d566d8a66de98c1a..9e6f03e914e2e1c2aea7a3c8ac09fd242ad5b0a1 100644 --- a/port/sysfile.c +++ b/port/sysfile.c @@ -358,7 +358,7 @@ unionread(Chan *c, void *va, long n) } static long -read(ulong *arg, uvlong *offp) +read(ulong *arg, vlong *offp) { int dir; long n; @@ -414,22 +414,22 @@ sys_read(ulong *arg) long syspread(ulong *arg) { - uvlong v; + vlong v; va_list list; /* use varargs to guarantee alignment of vlong */ va_start(list, arg[2]); - v = va_arg(list, uvlong); + v = va_arg(list, vlong); va_end(list); - if(v ==~0ULL) + if(v == ~0ULL) return read(arg, nil); return read(arg, &v); } static long -write(ulong *arg, uvlong *offp) +write(ulong *arg, vlong *offp) { Chan *c; long m, n; @@ -487,15 +487,15 @@ sys_write(ulong *arg) long syspwrite(ulong *arg) { - uvlong v; + vlong v; va_list list; /* use varargs to guarantee alignment of vlong */ va_start(list, arg[2]); - v = va_arg(list, uvlong); + v = va_arg(list, vlong); va_end(list); - if(v ==~0ULL) + if(v == ~0ULL) return write(arg, nil); return write(arg, &v);