~kris/9p

9hist

72e8acdc72fbffcf1358ee72b281848476858e9c — David du Colombier 25 years ago 5d6b84f
Plan 9 from Bell Labs 2001-07-31
9 files changed, 96 insertions(+), 59 deletions(-)

M alphapc/dat.h
M alphapc/main.c
M bitsy/dat.h
M bitsy/power.c
M pc/dat.h
M pc/devi82365.c
M port/devpnp.c
M port/portdat.h
M port/sysfile.c
M alphapc/dat.h => alphapc/dat.h +2 -0
@@ 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
 */

M alphapc/main.c => alphapc/main.c +1 -1
@@ 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
	 */

M bitsy/dat.h => bitsy/dat.h +2 -0
@@ 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
 */

M bitsy/power.c => bitsy/power.c +13 -17
@@ 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

M pc/dat.h => pc/dat.h +2 -0
@@ 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
 */

M pc/devi82365.c => pc/devi82365.c +4 -12
@@ 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];

M port/devpnp.c => port/devpnp.c +64 -20
@@ 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",

M port/portdat.h => port/portdat.h +0 -1
@@ 92,7 92,6 @@ struct Alarms
	Proc	*head;
};

#define MAXSYSARG	5	/* for mount(fd, mpt, flag, arg, srv) */
struct Sargs
{
	ulong	args[MAXSYSARG];

M port/sysfile.c => port/sysfile.c +8 -8
@@ 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);