diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/9/ppc/clock.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/9/ppc/clock.c')
-rwxr-xr-x | sys/src/9/ppc/clock.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/sys/src/9/ppc/clock.c b/sys/src/9/ppc/clock.c new file mode 100755 index 000000000..30d350a2d --- /dev/null +++ b/sys/src/9/ppc/clock.c @@ -0,0 +1,88 @@ +#include "u.h" +#include "../port/lib.h" +#include "mem.h" +#include "dat.h" +#include "io.h" +#include "fns.h" +#include "ureg.h" + +static ulong clkreload; + +void +delayloopinit(void) +{ + ulong v; + uvlong x; + + /* initial value for loopconst set in machinit */ + m->loopconst = 1000; + v = getdec(); + delay(1000); + v -= getdec(); + + x = m->loopconst; + x *= m->dechz; + x /= v; + m->loopconst = x; +} + +void +clockinit(void) +{ + m->dechz = m->bushz/4; /* true for all 604e */ + m->tbhz = m->dechz; /* conjecture; manual doesn't say */ + + delayloopinit(); + + clkreload = m->dechz/HZ-1; + putdec(clkreload); +} + +void +clockintr(Ureg *) +{ + long v; + + v = -getdec(); + if(v > (clkreload >> 1)){ + if(v > clkreload) + m->ticks += v/clkreload; + v = 0; + } + putdec(clkreload-v); +} + +void +delay(int l) +{ + ulong i, j; + + j = 0; + if(m) + j = m->loopconst; + if(j == 0) + j = 1096; + while(l-- > 0) + for(i=0; i < j; i++) + ; +} + +void +microdelay(int l) +{ + ulong i; + + l *= m->loopconst; + l += 500; + l /= 1000; + if(l <= 0) + l = 1; + for(i = 0; i < l; i++) + ; +} + +ulong +perfticks(void) +{ + return (ulong)fastticks(nil); +} |