xref: /plan9/sys/src/9/ppc/clock.c (revision 4de34a7edde43207e841ec91ecd12e6cf5f5ebe7)
1458db832SDavid du Colombier #include	"u.h"
2458db832SDavid du Colombier #include	"../port/lib.h"
3458db832SDavid du Colombier #include	"mem.h"
4458db832SDavid du Colombier #include	"dat.h"
5458db832SDavid du Colombier #include	"io.h"
6458db832SDavid du Colombier #include	"fns.h"
7458db832SDavid du Colombier #include	"ureg.h"
8458db832SDavid du Colombier 
9458db832SDavid du Colombier static	ulong	clkreload;
10458db832SDavid du Colombier 
11458db832SDavid du Colombier void
delayloopinit(void)12458db832SDavid du Colombier delayloopinit(void)
13458db832SDavid du Colombier {
14458db832SDavid du Colombier 	ulong v;
15458db832SDavid du Colombier 	uvlong x;
16458db832SDavid du Colombier 
17458db832SDavid du Colombier 	/* initial value for loopconst set in machinit */
1828495efeSDavid du Colombier 	m->loopconst = 1000;
19458db832SDavid du Colombier 	v = getdec();
20458db832SDavid du Colombier 	delay(1000);
21458db832SDavid du Colombier 	v -= getdec();
22458db832SDavid du Colombier 
23458db832SDavid du Colombier 	x = m->loopconst;
24458db832SDavid du Colombier 	x *= m->dechz;
25458db832SDavid du Colombier 	x /= v;
26458db832SDavid du Colombier 	m->loopconst = x;
27458db832SDavid du Colombier }
28458db832SDavid du Colombier 
29458db832SDavid du Colombier void
clockinit(void)30458db832SDavid du Colombier clockinit(void)
31458db832SDavid du Colombier {
32458db832SDavid du Colombier 	m->dechz = m->bushz/4;	/* true for all 604e */
33458db832SDavid du Colombier 	m->tbhz = m->dechz;	/* conjecture; manual doesn't say */
34458db832SDavid du Colombier 
35458db832SDavid du Colombier 	delayloopinit();
36458db832SDavid du Colombier 
37458db832SDavid du Colombier 	clkreload = m->dechz/HZ-1;
38458db832SDavid du Colombier 	putdec(clkreload);
39458db832SDavid du Colombier }
40458db832SDavid du Colombier 
41458db832SDavid du Colombier void
clockintr(Ureg *)42458db832SDavid du Colombier clockintr(Ureg *)
43458db832SDavid du Colombier {
44458db832SDavid du Colombier 	long v;
45458db832SDavid du Colombier 
46458db832SDavid du Colombier 	v = -getdec();
4706578a4fSDavid du Colombier 	if(v > (clkreload >> 1)){
48458db832SDavid du Colombier 		if(v > clkreload)
49458db832SDavid du Colombier 			m->ticks += v/clkreload;
50458db832SDavid du Colombier 		v = 0;
51458db832SDavid du Colombier 	}
52458db832SDavid du Colombier 	putdec(clkreload-v);
53458db832SDavid du Colombier }
54458db832SDavid du Colombier 
55458db832SDavid du Colombier void
delay(int l)56458db832SDavid du Colombier delay(int l)
57458db832SDavid du Colombier {
58458db832SDavid du Colombier 	ulong i, j;
59458db832SDavid du Colombier 
60*4de34a7eSDavid du Colombier 	j = 0;
61*4de34a7eSDavid du Colombier 	if(m)
62458db832SDavid du Colombier 		j = m->loopconst;
63*4de34a7eSDavid du Colombier 	if(j == 0)
64*4de34a7eSDavid du Colombier 		j = 1096;
65458db832SDavid du Colombier 	while(l-- > 0)
66458db832SDavid du Colombier 		for(i=0; i < j; i++)
67458db832SDavid du Colombier 			;
68458db832SDavid du Colombier }
69458db832SDavid du Colombier 
70458db832SDavid du Colombier void
microdelay(int l)71458db832SDavid du Colombier microdelay(int l)
72458db832SDavid du Colombier {
73458db832SDavid du Colombier 	ulong i;
74458db832SDavid du Colombier 
75458db832SDavid du Colombier 	l *= m->loopconst;
76458db832SDavid du Colombier 	l += 500;
77458db832SDavid du Colombier 	l /= 1000;
78458db832SDavid du Colombier 	if(l <= 0)
79458db832SDavid du Colombier 		l = 1;
80458db832SDavid du Colombier 	for(i = 0; i < l; i++)
81458db832SDavid du Colombier 		;
82458db832SDavid du Colombier }
83458db832SDavid du Colombier 
84458db832SDavid du Colombier ulong
perfticks(void)85458db832SDavid du Colombier perfticks(void)
86458db832SDavid du Colombier {
87458db832SDavid du Colombier 	return (ulong)fastticks(nil);
88458db832SDavid du Colombier }
89