acpi_timer.c revision 1.2.2.2 1 1.2.2.2 yamt /* $NetBSD: acpi_timer.c,v 1.2.2.2 2006/06/26 12:50:37 yamt Exp $ */
2 1.2.2.2 yamt
3 1.2.2.2 yamt #include <sys/types.h>
4 1.2.2.2 yamt
5 1.2.2.2 yamt #ifdef __HAVE_TIMECOUNTER
6 1.2.2.2 yamt
7 1.2.2.2 yamt #include <sys/systm.h>
8 1.2.2.2 yamt #include <sys/time.h>
9 1.2.2.2 yamt #include <sys/timetc.h>
10 1.2.2.2 yamt #include <dev/acpi/acpica.h>
11 1.2.2.2 yamt #include <dev/acpi/acpi_timer.h>
12 1.2.2.2 yamt
13 1.2.2.2 yamt static u_int acpitimer_read(struct timecounter *);
14 1.2.2.2 yamt
15 1.2.2.2 yamt static struct timecounter acpi_timecounter = {
16 1.2.2.2 yamt acpitimer_read,
17 1.2.2.2 yamt 0,
18 1.2.2.2 yamt 0x00ffffff,
19 1.2.2.2 yamt PM_TIMER_FREQUENCY,
20 1.2.2.2 yamt "ACPI_PM_TMR",
21 1.2.2.2 yamt 900
22 1.2.2.2 yamt };
23 1.2.2.2 yamt
24 1.2.2.2 yamt int
25 1.2.2.2 yamt acpitimer_init()
26 1.2.2.2 yamt {
27 1.2.2.2 yamt uint32_t bits;
28 1.2.2.2 yamt ACPI_STATUS res;
29 1.2.2.2 yamt
30 1.2.2.2 yamt res = AcpiGetTimerResolution(&bits);
31 1.2.2.2 yamt if (res != AE_OK)
32 1.2.2.2 yamt return (-1);
33 1.2.2.2 yamt
34 1.2.2.2 yamt if (bits == 32)
35 1.2.2.2 yamt acpi_timecounter.tc_counter_mask = 0xffffffff;
36 1.2.2.2 yamt tc_init(&acpi_timecounter);
37 1.2.2.2 yamt
38 1.2.2.2 yamt printf("acpitimer: %d bits\n", bits);
39 1.2.2.2 yamt
40 1.2.2.2 yamt return (0);
41 1.2.2.2 yamt }
42 1.2.2.2 yamt
43 1.2.2.2 yamt /*
44 1.2.2.2 yamt * Some chipsets (PIIX4 variants) do not latch correctly; there
45 1.2.2.2 yamt * is a chance that a transition is hit.
46 1.2.2.2 yamt * For now, just be conservative. We might detect the situation later
47 1.2.2.2 yamt * (by testing, or chipset quirks).
48 1.2.2.2 yamt */
49 1.2.2.2 yamt static u_int
50 1.2.2.2 yamt acpitimer_read(struct timecounter *tc)
51 1.2.2.2 yamt {
52 1.2.2.2 yamt uint32_t t1, t2, t3;
53 1.2.2.2 yamt
54 1.2.2.2 yamt AcpiGetTimer(&t2);
55 1.2.2.2 yamt AcpiGetTimer(&t3);
56 1.2.2.2 yamt do {
57 1.2.2.2 yamt t1 = t2;
58 1.2.2.2 yamt t2 = t3;
59 1.2.2.2 yamt AcpiGetTimer(&t3);
60 1.2.2.2 yamt } while ((t1 > t2) || (t2 > t3));
61 1.2.2.2 yamt return (t2);
62 1.2.2.2 yamt }
63 1.2.2.2 yamt
64 1.2.2.2 yamt #else
65 1.2.2.2 yamt
66 1.2.2.2 yamt int
67 1.2.2.2 yamt acpitimer_init()
68 1.2.2.2 yamt {
69 1.2.2.2 yamt
70 1.2.2.2 yamt return (0);
71 1.2.2.2 yamt }
72 1.2.2.2 yamt
73 1.2.2.2 yamt #endif
74