plan 9 kernel history: overview | file list | diff list

1999/0608/mpc/devrtc.c (diff list | history)

1999/0122/sys/src/9/mpc/devrtc.c:7,221999/0608/sys/src/9/mpc/devrtc.c:7,15 (short | long | prev | next)
1999/0121    
 
#include	"io.h" 
 
/* 
 * MPC8xx real time clock 
 * FADS board option switch 
 * interrupt statistics 
 */ 
                 
enum{ 
	Qrtc = 1, 
	Qswitch, 
	Qintstat, 
1999/0608    
	Qnvram, 
1999/0121    
 
	/* sccr */ 
	RTDIV=	1<<24, 
1999/0122/sys/src/9/mpc/devrtc.c:25,381999/0608/sys/src/9/mpc/devrtc.c:18,35
1999/0121    
	/* rtcsc */ 
	RTE=	1<<0, 
	R38K=	1<<4, 
1999/0608    
 
	Nvoff=		4*1024,	/* where usable nvram lives */ 
	Nvsize=		4*1024, 
1999/0121    
}; 
 
static	QLock	rtclock;		/* mutex on clock operations */ 
1999/0608    
static Lock nvrtlock; 
1999/0121    
 
1999/0608    
 
1999/0121    
static Dirtab rtcdir[]={ 
	"rtc",		{Qrtc, 0},	12,	0666, 
	"switch",	{Qswitch, 0}, 0, 0444, 
	"intstat",	{Qintstat, 0}, 0, 0444, 
1999/0608    
	"nvram",	{Qnvram, 0},	Nvsize,	0664, 
1999/0121    
}; 
#define	NRTC	(sizeof(rtcdir)/sizeof(rtcdir[0])) 
 
1999/0122/sys/src/9/mpc/devrtc.c:79,871999/0608/sys/src/9/mpc/devrtc.c:76,83
1999/0121    
		if(strcmp(up->user, eve)!=0 && omode!=OREAD) 
			error(Eperm); 
		break; 
	case Qswitch: 
	case Qintstat: 
		if(omode!=OREAD) 
1999/0608    
	case Qnvram: 
		if(strcmp(up->user, eve)!=0) 
1999/0121    
			error(Eperm); 
		break; 
	} 
1999/0122/sys/src/9/mpc/devrtc.c:97,1031999/0608/sys/src/9/mpc/devrtc.c:93,98
1999/0121    
rtcread(Chan *c, void *buf, long n, vlong offset) 
{ 
	ulong t; 
1999/0122    
//	char *b; 
1999/0121    
 
	if(c->qid.path & CHDIR) 
		return devdirread(c, buf, n, rtcdir, NRTC, devgen); 
1999/0122/sys/src/9/mpc/devrtc.c:107,1141999/0608/sys/src/9/mpc/devrtc.c:102,117
1999/0121    
		t = m->iomem->rtc; 
		n = readnum(offset, buf, n, t, 12); 
		return n; 
	case Qswitch: 
1999/0122    
		return readnum(offset, buf, n, 0xf/*(m->bcsr[2]>>19)&0xF*/, 12); 
1999/0608    
	case Qnvram: 
		if(offset >= Nvsize) 
			return 0; 
		t = offset; 
		if(t + n > Nvsize) 
			n = Nvsize - t; 
		ilock(&nvrtlock); 
		memmove(buf, (uchar*)(NVRAMMEM + Nvoff + t), n); 
		iunlock(&nvrtlock); 
		return n; 
1999/0121    
	} 
	error(Egreg); 
	return 0;		/* not reached */ 
1999/0122/sys/src/9/mpc/devrtc.c:120,1251999/0608/sys/src/9/mpc/devrtc.c:123,129
1999/0121    
	ulong secs; 
	char *cp, *ep; 
	IMM *io; 
1999/0608    
	ulong t; 
1999/0121    
 
	switch(c->qid.path){ 
	case Qrtc: 
1999/0122/sys/src/9/mpc/devrtc.c:145,1521999/0608/sys/src/9/mpc/devrtc.c:149,164
1999/0121    
		io->rtck = ~KEEP_ALIVE_KEY; 
		iopunlock(); 
		return n; 
	case Qswitch: 
		return 0; 
1999/0608    
	case Qnvram: 
		if(offset >= Nvsize) 
			return 0; 
		t = offset; 
		if(t + n > Nvsize) 
			n = Nvsize - t; 
		ilock(&nvrtlock); 
		memmove((uchar*)(NVRAMMEM + Nvoff + offset), buf, n); 
		iunlock(&nvrtlock); 
		return n; 
1999/0121    
	} 
	error(Egreg); 
	return 0;		/* not reached */ 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)