]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/zynq/timer.c
kernel: reduce Page structure size by changing Page.cachectl[]
[plan9front.git] / sys / src / 9 / zynq / timer.c
1 #include "u.h"
2 #include "../port/lib.h"
3 #include "mem.h"
4 #include "dat.h"
5 #include "fns.h"
6 #include "io.h"
7
8 enum {
9         TIMERDIV = 1,
10         LTIMERDIV = 1,
11         
12         ARM_PLL_CTRL = 0x100/4,
13         ARM_CLK_CTRL = 0x120/4,
14
15         GTIMERVALL = 0x200/4,
16         GTIMERVALH,
17         GTIMERCTL,
18         LTIMERVAL = 0x604/4,
19         LTIMERCTL,
20         LTIMERISR,
21 };
22
23 uvlong timerhz;
24
25 void
26 delay(int)
27 {
28 }
29
30 void
31 microdelay(int)
32 {
33 }
34
35 uvlong
36 fastticks(uvlong *hz)
37 {
38         ulong lo, hi;
39
40         if(hz != nil)
41                 *hz = timerhz;
42         do{
43                 hi = mpcore[GTIMERVALH];
44                 lo = mpcore[GTIMERVALL];
45         }while(hi != mpcore[GTIMERVALH]);
46         return lo | (uvlong)hi << 32;
47 }
48
49 ulong
50 µs(void)
51 {
52         return fastticks2us(fastticks(nil));
53 }
54
55 void
56 timerset(Tval v)
57 {
58         vlong w;
59
60         w = v - fastticks(nil);
61         if(w < 1)
62                 w = 1;
63         if(w > 0xffffffffLL)
64                 w = 0xffffffff;
65         mpcore[LTIMERCTL] &= ~1;
66         mpcore[LTIMERVAL] = w;
67         mpcore[LTIMERCTL] |= 1;
68 }
69
70 void
71 timerirq(Ureg *u, void *)
72 {
73         if((mpcore[LTIMERISR] & 1) != 0){
74                 mpcore[LTIMERISR] |= 1;
75                 timerintr(u, 0);
76         }
77 }
78
79 void
80 timerinit(void)
81 {
82         m->cpumhz = PS_CLK * (slcr[ARM_PLL_CTRL] >> 12 & 0x7f) / (slcr[ARM_CLK_CTRL] >> 8 & 0x3f);
83         m->cpuhz = m->cpumhz * 1000000;
84         timerhz = m->cpuhz / 2;
85         mpcore[GTIMERCTL] = TIMERDIV - 1 << 8 | 3;
86         mpcore[LTIMERCTL] = LTIMERDIV - 1 << 8 | 4;
87         intrenable(TIMERIRQ, timerirq, nil, EDGE, "clock");
88
89         /* enable and reset cycle counter register */
90         m->cyclefreq = m->cpuhz;
91         setpmcnten((1<<31));
92         coherence();
93         setpmcr(7);
94 }
95
96 /*
97  * synchronize all cpu's cycle counter registers
98  */
99 void
100 synccycles(void)
101 {
102         static Ref r1, r2;
103         int s;
104
105         s = splhi();
106         r2.ref = 0;
107         incref(&r1);
108         while(r1.ref != conf.nmach)
109                 ;
110         setpmcr(7);
111         m->cycleshi = MACHP(0)->cycleshi;
112         incref(&r2);
113         while(r2.ref != conf.nmach)
114                 ;
115         r1.ref = 0;
116         splx(s);
117 }