xref: /haiku/src/system/kernel/arch/ppc/arch_timer.cpp (revision 3e236885ab056dc560083af58eda44db975f7ba5)
1*3e236885SAxel Dörfler /*
2*3e236885SAxel Dörfler ** Copyright 2001, Travis Geiselbrecht. All rights reserved.
3*3e236885SAxel Dörfler ** Distributed under the terms of the NewOS License.
4*3e236885SAxel Dörfler */
5*3e236885SAxel Dörfler 
6*3e236885SAxel Dörfler 
7*3e236885SAxel Dörfler #include <boot/stage2.h>
8*3e236885SAxel Dörfler #include <kernel.h>
9*3e236885SAxel Dörfler #include <debug.h>
10*3e236885SAxel Dörfler 
11*3e236885SAxel Dörfler #include <timer.h>
12*3e236885SAxel Dörfler #include <arch/timer.h>
13*3e236885SAxel Dörfler 
14*3e236885SAxel Dörfler 
15*3e236885SAxel Dörfler static bigtime_t sTickRate;
16*3e236885SAxel Dörfler 
17*3e236885SAxel Dörfler 
18*3e236885SAxel Dörfler void
arch_timer_set_hardware_timer(bigtime_t timeout)19*3e236885SAxel Dörfler arch_timer_set_hardware_timer(bigtime_t timeout)
20*3e236885SAxel Dörfler {
21*3e236885SAxel Dörfler 	bigtime_t new_val_64;
22*3e236885SAxel Dörfler 
23*3e236885SAxel Dörfler 	if(timeout < 1000)
24*3e236885SAxel Dörfler 		timeout = 1000;
25*3e236885SAxel Dörfler 
26*3e236885SAxel Dörfler 	new_val_64 = (timeout * sTickRate) / 1000000;
27*3e236885SAxel Dörfler 
28*3e236885SAxel Dörfler 	asm("mtdec	%0" :: "r"((uint32)new_val_64));
29*3e236885SAxel Dörfler }
30*3e236885SAxel Dörfler 
31*3e236885SAxel Dörfler 
32*3e236885SAxel Dörfler void
arch_timer_clear_hardware_timer()33*3e236885SAxel Dörfler arch_timer_clear_hardware_timer()
34*3e236885SAxel Dörfler {
35*3e236885SAxel Dörfler 	asm("mtdec	%0" :: "r"(0x7fffffff));
36*3e236885SAxel Dörfler }
37*3e236885SAxel Dörfler 
38*3e236885SAxel Dörfler 
39*3e236885SAxel Dörfler int
arch_init_timer(kernel_args * ka)40*3e236885SAxel Dörfler arch_init_timer(kernel_args *ka)
41*3e236885SAxel Dörfler {
42*3e236885SAxel Dörfler 	sTickRate = ka->arch_args.time_base_frequency;
43*3e236885SAxel Dörfler 
44*3e236885SAxel Dörfler 	return 0;
45*3e236885SAxel Dörfler }
46*3e236885SAxel Dörfler 
47