~kris/9p

9hist

05b33812d620df5cc51b09ef06abd9bf7f95e808 — David du Colombier 25 years ago e44792f
Plan 9 from Bell Labs 2001-08-09
10 files changed, 99 insertions(+), 87 deletions(-)

M alphapc/fns.h
M bitsy/devsac.c
M bitsy/fns.h
M bitsy/l.s
M bitsy/power.c
M bitsy/screen.c
M pc/devarch.c
M pc/fns.h
M port/devpnp.c
M port/portfns.h
M alphapc/fns.h => alphapc/fns.h +0 -1
@@ 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);

M bitsy/devsac.c => bitsy/devsac.c +2 -2
@@ 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);

M bitsy/fns.h => bitsy/fns.h +0 -1
@@ 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);

M bitsy/l.s => bitsy/l.s +16 -0
@@ 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)

M bitsy/power.c => bitsy/power.c +4 -12
@@ 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<<IRQgpio0);
			intrregs->icip = (1<<IRQgpio0);
		}
		uartpower(1);
		µcpower(1);
		screenpower(1);
		iprint("\nresuming execution\n");
//		dumpitall();
		delay(800);
xsp = getsp();
xlink = getlink();
iprint("power restored, sp = %lux, link = %lux\n", xsp, xlink);
delay(1000);

		splx(power_pl);
		return;
	}

M bitsy/screen.c => bitsy/screen.c +2 -10
@@ 40,8 40,6 @@ struct sa1110fb {
	ushort	pixel[Wid*Ht];		/* Pixel data */
} *framebuf;

short savedpalette[16];	/* saved during suspend mode */

enum {
/* LCD Control Register 0, lcd->lccr0 */
	LEN	=  0,	/*  1 bit */


@@ 158,14 156,6 @@ static	void	bitsyscreenputs(char *s, int n);
static	void	scroll(void);

static void
lcdstop(void) {
	lcd->lccr0 &= ~(0<<LEN);	/* disable the LCD */
	while((lcd->lcsr & LDD) == 0)
		delay(10);
	lcdpower(0);
}

static void
lcdinit(void)
{
	/* the following line works because main memory is direct mapped */


@@ 315,6 305,8 @@ void
blankscreen(int blank)
{
	if (blank) {
		lcd->lccr0 &= ~(0<<LEN);	/* disable the LCD */
		delay(100);
		lcdpower(0);
	} else {
		lcdpower(1);

M pc/devarch.c => pc/devarch.c +0 -1
@@ 104,7 104,6 @@ ioinit(void)

	// a dummy entry at 2^16
	ioalloc(0x10000, 1, 0, "dummy");
	ioalloc(0x1000, 1, 0, "dummy");
}

// Reserve a range to be ioalloced later.  This is in particular useful for exchangable cards, such

M pc/fns.h => pc/fns.h +0 -1
@@ 62,7 62,6 @@ void	ioinit(void);
int	iounused(int, int);
int	ioalloc(int, int, int, char*);
int	ioreserve(int, int, int, char*);
int	iprint(char*, ...);
int	isaconfig(char*, int, ISAConf*);
void	kbdinit(void);
#define	kmapinval()

M port/devpnp.c => port/devpnp.c +72 -59
@@ 1,3 1,14 @@
/*
 *	ISA PNP 1.0 support + access to PCI configuration space
 *
 *	TODO
 *		- implement PNP card configuration (setting io bases etc)
 *		- implement PCI raw access to configuration space
 *		- implement PCI access to memory/io space/BIOS ROM
 *		- use c->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))

M port/portfns.h => port/portfns.h +3 -0
@@ 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