xref: /plan9/sys/src/9/mtx/clock.c (revision ea58ad6fbee60d5a3fca57ac646881779dd8f0ea)
19a747e4fSDavid du Colombier #include	"u.h"
29a747e4fSDavid du Colombier #include	"../port/lib.h"
39a747e4fSDavid du Colombier #include	"mem.h"
49a747e4fSDavid du Colombier #include	"dat.h"
59a747e4fSDavid du Colombier #include	"fns.h"
69a747e4fSDavid du Colombier #include	"io.h"
79a747e4fSDavid du Colombier #include	"ureg.h"
89a747e4fSDavid du Colombier 
99a747e4fSDavid du Colombier static	ulong	clkreload;
109a747e4fSDavid du Colombier 
119a747e4fSDavid du Colombier void
delayloopinit(void)129a747e4fSDavid du Colombier delayloopinit(void)
139a747e4fSDavid du Colombier {
149a747e4fSDavid du Colombier 	ulong v;
159a747e4fSDavid du Colombier 	uvlong x;
169a747e4fSDavid du Colombier 
179a747e4fSDavid du Colombier 	m->loopconst = 5000;
189a747e4fSDavid du Colombier 	v = getdec();
199a747e4fSDavid du Colombier 	delay(1000);
209a747e4fSDavid du Colombier 	v -= getdec();
219a747e4fSDavid du Colombier 
229a747e4fSDavid du Colombier 	x = m->loopconst;
239a747e4fSDavid du Colombier 	x *= m->dechz;
249a747e4fSDavid du Colombier 	x /= v;
259a747e4fSDavid du Colombier 	m->loopconst = x;
269a747e4fSDavid du Colombier }
279a747e4fSDavid du Colombier 
289a747e4fSDavid du Colombier void
clockinit(void)299a747e4fSDavid du Colombier clockinit(void)
309a747e4fSDavid du Colombier {
319a747e4fSDavid du Colombier 	/* XXX this should not be hard coded! */
329a747e4fSDavid du Colombier 	m->cpuhz = 300000000;
339a747e4fSDavid du Colombier 	m->bushz = 66666666;
349a747e4fSDavid du Colombier 
359a747e4fSDavid du Colombier 	m->dechz = m->bushz/4;			/* true for all 604e */
369a747e4fSDavid du Colombier 	m->tbhz = m->dechz;				/* conjecture; manual doesn't say */
379a747e4fSDavid du Colombier 
389a747e4fSDavid du Colombier 	delayloopinit();
399a747e4fSDavid du Colombier 
409a747e4fSDavid du Colombier 	clkreload = m->dechz/HZ-1;
419a747e4fSDavid du Colombier 	putdec(clkreload);
429a747e4fSDavid du Colombier }
439a747e4fSDavid du Colombier 
449a747e4fSDavid du Colombier void
clockintr(Ureg * ureg)459a747e4fSDavid du Colombier clockintr(Ureg *ureg)
469a747e4fSDavid du Colombier {
479a747e4fSDavid du Colombier 	long v;
489a747e4fSDavid du Colombier 
499a747e4fSDavid du Colombier 	v = -getdec();
509a747e4fSDavid du Colombier 	if(v > clkreload/2){
519a747e4fSDavid du Colombier 		if(v > clkreload)
529a747e4fSDavid du Colombier 			m->ticks += v/clkreload;
539a747e4fSDavid du Colombier 		v = 0;
549a747e4fSDavid du Colombier 	}
559a747e4fSDavid du Colombier 	putdec(clkreload-v);
569a747e4fSDavid du Colombier 
579a747e4fSDavid du Colombier 	timerintr(ureg, 0);
589a747e4fSDavid du Colombier }
599a747e4fSDavid du Colombier 
609a747e4fSDavid du Colombier void
timerset(Tval)61*ea58ad6fSDavid du Colombier timerset(Tval)
629a747e4fSDavid du Colombier {
639a747e4fSDavid du Colombier }
649a747e4fSDavid du Colombier 
659a747e4fSDavid du Colombier void
delay(int l)669a747e4fSDavid du Colombier delay(int l)
679a747e4fSDavid du Colombier {
689a747e4fSDavid du Colombier 	ulong i, j;
699a747e4fSDavid du Colombier 
709a747e4fSDavid du Colombier 	j = m->loopconst;
719a747e4fSDavid du Colombier 	while(l-- > 0)
729a747e4fSDavid du Colombier 		for(i=0; i < j; i++)
739a747e4fSDavid du Colombier 			;
749a747e4fSDavid du Colombier }
759a747e4fSDavid du Colombier 
769a747e4fSDavid du Colombier void
microdelay(int l)779a747e4fSDavid du Colombier microdelay(int l)
789a747e4fSDavid du Colombier {
799a747e4fSDavid du Colombier 	ulong i;
809a747e4fSDavid du Colombier 
819a747e4fSDavid du Colombier 	l *= m->loopconst;
829a747e4fSDavid du Colombier 	l += 500;
839a747e4fSDavid du Colombier 	l /= 1000;
849a747e4fSDavid du Colombier 	if(l <= 0)
859a747e4fSDavid du Colombier 		l = 1;
869a747e4fSDavid du Colombier 	for(i = 0; i < l; i++)
879a747e4fSDavid du Colombier 		;
889a747e4fSDavid du Colombier }
899a747e4fSDavid du Colombier 
909a747e4fSDavid du Colombier uvlong
fastticks(uvlong * hz)919a747e4fSDavid du Colombier fastticks(uvlong *hz)
929a747e4fSDavid du Colombier {
939a747e4fSDavid du Colombier 	if(hz)
949a747e4fSDavid du Colombier 		*hz = HZ;
959a747e4fSDavid du Colombier 	return m->ticks;
969a747e4fSDavid du Colombier }
973ff48bf5SDavid du Colombier 
98*ea58ad6fSDavid du Colombier ulong
s(void)99*ea58ad6fSDavid du Colombier µs(void)
100*ea58ad6fSDavid du Colombier {
101*ea58ad6fSDavid du Colombier 	return fastticks2us(m->ticks);
102*ea58ad6fSDavid du Colombier }
103*ea58ad6fSDavid du Colombier 
1043ff48bf5SDavid du Colombier /*
1053ff48bf5SDavid du Colombier  *  performance measurement ticks.  must be low overhead.
1063ff48bf5SDavid du Colombier  *  doesn't have to count over a second.
1073ff48bf5SDavid du Colombier  */
1083ff48bf5SDavid du Colombier ulong
perfticks(void)1093ff48bf5SDavid du Colombier perfticks(void)
1103ff48bf5SDavid du Colombier {
1113ff48bf5SDavid du Colombier 	return m->ticks;
1123ff48bf5SDavid du Colombier }
113