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