xref: /plan9/sys/src/9/ppc/clock.c (revision 4de34a7edde43207e841ec91ecd12e6cf5f5ebe7)
1 #include	"u.h"
2 #include	"../port/lib.h"
3 #include	"mem.h"
4 #include	"dat.h"
5 #include	"io.h"
6 #include	"fns.h"
7 #include	"ureg.h"
8 
9 static	ulong	clkreload;
10 
11 void
delayloopinit(void)12 delayloopinit(void)
13 {
14 	ulong v;
15 	uvlong x;
16 
17 	/* initial value for loopconst set in machinit */
18 	m->loopconst = 1000;
19 	v = getdec();
20 	delay(1000);
21 	v -= getdec();
22 
23 	x = m->loopconst;
24 	x *= m->dechz;
25 	x /= v;
26 	m->loopconst = x;
27 }
28 
29 void
clockinit(void)30 clockinit(void)
31 {
32 	m->dechz = m->bushz/4;	/* true for all 604e */
33 	m->tbhz = m->dechz;	/* conjecture; manual doesn't say */
34 
35 	delayloopinit();
36 
37 	clkreload = m->dechz/HZ-1;
38 	putdec(clkreload);
39 }
40 
41 void
clockintr(Ureg *)42 clockintr(Ureg *)
43 {
44 	long v;
45 
46 	v = -getdec();
47 	if(v > (clkreload >> 1)){
48 		if(v > clkreload)
49 			m->ticks += v/clkreload;
50 		v = 0;
51 	}
52 	putdec(clkreload-v);
53 }
54 
55 void
delay(int l)56 delay(int l)
57 {
58 	ulong i, j;
59 
60 	j = 0;
61 	if(m)
62 		j = m->loopconst;
63 	if(j == 0)
64 		j = 1096;
65 	while(l-- > 0)
66 		for(i=0; i < j; i++)
67 			;
68 }
69 
70 void
microdelay(int l)71 microdelay(int l)
72 {
73 	ulong i;
74 
75 	l *= m->loopconst;
76 	l += 500;
77 	l /= 1000;
78 	if(l <= 0)
79 		l = 1;
80 	for(i = 0; i < l; i++)
81 		;
82 }
83 
84 ulong
perfticks(void)85 perfticks(void)
86 {
87 	return (ulong)fastticks(nil);
88 }
89