1 #ifndef __X86_HPET_H__
2 #define __X86_HPET_H__
3 
4 /*
5  * Documentation on HPET can be found at:
6  *      http://www.intel.com/content/dam/www/public/us/en/documents/
7  *      technical-specifications/software-developers-hpet-spec-1-0a.pdf
8  */
9 
10 #define HPET_MMAP_SIZE	1024
11 
12 #define HPET_ID		0x000
13 #define HPET_PERIOD	0x004
14 #define HPET_CFG	0x010
15 #define HPET_STATUS	0x020
16 #define HPET_COUNTER	0x0f0
17 #define HPET_Tn_CFG(n)          (0x100 + (n) * 0x20)
18 #define HPET_Tn_CMP(n)          (0x108 + (n) * 0x20)
19 #define HPET_Tn_ROUTE(n)        (0x110 + (n) * 0x20)
20 
21 #define HPET_ID_VENDOR	0xffff0000
22 #define HPET_ID_LEGSUP	0x00008000
23 #define HPET_ID_64BIT	0x00002000
24 #define HPET_ID_NUMBER	0x00001f00
25 #define HPET_ID_REV	0x000000ff
26 #define	HPET_ID_NUMBER_SHIFT	8
27 #define HPET_ID_VENDOR_SHIFT	16
28 
29 #define HPET_CFG_ENABLE	0x001
30 #define HPET_CFG_LEGACY	0x002
31 #define	HPET_LEGACY_8254	2
32 #define	HPET_LEGACY_RTC		8
33 
34 #define HPET_TN_LEVEL		0x002
35 #define HPET_TN_ENABLE		0x004
36 #define HPET_TN_PERIODIC	0x008
37 #define HPET_TN_PERIODIC_CAP	0x010
38 #define HPET_TN_64BIT_CAP	0x020
39 #define HPET_TN_SETVAL		0x040
40 #define HPET_TN_32BIT		0x100
41 #define HPET_TN_ROUTE		0x3e00
42 #define HPET_TN_FSB		0x4000
43 #define HPET_TN_FSB_CAP		0x8000
44 #define HPET_TN_RESERVED	0xffff0081
45 #define HPET_TN_ROUTE_SHIFT	9
46 
47 
48 #define hpet_read32(x)    \
49     (*(volatile u32 *)(fix_to_virt(FIX_HPET_BASE) + (x)))
50 #define hpet_write32(y,x) \
51     (*(volatile u32 *)(fix_to_virt(FIX_HPET_BASE) + (x)) = (y))
52 
53 extern unsigned long hpet_address;
54 extern u8 hpet_blockid;
55 extern u8 hpet_flags;
56 
57 /*
58  * Detect and initialise HPET hardware: return counter update frequency.
59  * Return value is zero if HPET is unavailable.
60  */
61 u64 hpet_setup(void);
62 void hpet_resume(u32 *);
63 
64 /*
65  * Disable HPET hardware: restore it to boot time state.
66  */
67 void hpet_disable(void);
68 
69 /*
70  * Callback from legacy timer (PIT channel 0) IRQ handler.
71  * Returns 1 if tick originated from HPET; else 0.
72  */
73 int hpet_legacy_irq_tick(void);
74 
75 /*
76  * Temporarily use an HPET event counter for timer interrupt handling,
77  * rather than using the LAPIC timer. Used for Cx state entry.
78  */
79 void hpet_broadcast_init(void);
80 void hpet_broadcast_resume(void);
81 void hpet_broadcast_enter(void);
82 void hpet_broadcast_exit(void);
83 int hpet_broadcast_is_available(void);
84 void hpet_disable_legacy_broadcast(void);
85 
86 extern void (*pv_rtc_handler)(uint8_t reg, uint8_t value);
87 
88 #endif /* __X86_HPET_H__ */
89