hpet.h 3.2 KB
Newer Older
H
H. Peter Anvin 已提交
1 2
#ifndef _ASM_X86_HPET_H
#define _ASM_X86_HPET_H
T
Thomas Gleixner 已提交
3

4 5
#include <linux/msi.h>

T
Thomas Gleixner 已提交
6 7 8 9 10 11 12 13 14
#ifdef CONFIG_HPET_TIMER

#define HPET_MMAP_SIZE		1024

#define HPET_ID			0x000
#define HPET_PERIOD		0x004
#define HPET_CFG		0x010
#define HPET_STATUS		0x020
#define HPET_COUNTER		0x0f0
15 16 17 18 19

#define HPET_Tn_CFG(n)		(0x100 + 0x20 * n)
#define HPET_Tn_CMP(n)		(0x108 + 0x20 * n)
#define HPET_Tn_ROUTE(n)	(0x110 + 0x20 * n)

T
Thomas Gleixner 已提交
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
#define HPET_T0_CFG		0x100
#define HPET_T0_CMP		0x108
#define HPET_T0_ROUTE		0x110
#define HPET_T1_CFG		0x120
#define HPET_T1_CMP		0x128
#define HPET_T1_ROUTE		0x130
#define HPET_T2_CFG		0x140
#define HPET_T2_CMP		0x148
#define HPET_T2_ROUTE		0x150

#define HPET_ID_REV		0x000000ff
#define HPET_ID_NUMBER		0x00001f00
#define HPET_ID_64BIT		0x00002000
#define HPET_ID_LEGSUP		0x00008000
#define HPET_ID_VENDOR		0xffff0000
#define	HPET_ID_NUMBER_SHIFT	8
#define HPET_ID_VENDOR_SHIFT	16

#define HPET_ID_VENDOR_8086	0x8086

#define HPET_CFG_ENABLE		0x001
#define HPET_CFG_LEGACY		0x002
#define	HPET_LEGACY_8254	2
#define	HPET_LEGACY_RTC		8

#define HPET_TN_LEVEL		0x0002
#define HPET_TN_ENABLE		0x0004
#define HPET_TN_PERIODIC	0x0008
#define HPET_TN_PERIODIC_CAP	0x0010
#define HPET_TN_64BIT_CAP	0x0020
#define HPET_TN_SETVAL		0x0040
#define HPET_TN_32BIT		0x0100
#define HPET_TN_ROUTE		0x3e00
#define HPET_TN_FSB		0x4000
#define HPET_TN_FSB_CAP		0x8000
#define HPET_TN_ROUTE_SHIFT	9

/* Max HPET Period is 10^8 femto sec as in HPET spec */
#define HPET_MAX_PERIOD		100000000UL
/*
 * Min HPET period is 10^5 femto sec just for safety. If it is less than this,
 * then 32 bit HPET counter wrapsaround in less than 0.5 sec.
 */
#define HPET_MIN_PERIOD		100000UL

/* hpet memory map physical address */
extern unsigned long hpet_address;
67
extern unsigned long force_hpet_address;
T
Thomas Gleixner 已提交
68
extern int hpet_force_user;
T
Thomas Gleixner 已提交
69 70
extern int is_hpet_enabled(void);
extern int hpet_enable(void);
O
OGAWA Hirofumi 已提交
71
extern void hpet_disable(void);
72
extern unsigned long hpet_readl(unsigned long a);
V
Venki Pallipadi 已提交
73
extern void force_hpet_resume(void);
T
Thomas Gleixner 已提交
74

75 76 77 78 79 80 81 82 83 84 85 86 87 88
extern void hpet_msi_unmask(unsigned int irq);
extern void hpet_msi_mask(unsigned int irq);
extern void hpet_msi_write(unsigned int irq, struct msi_msg *msg);
extern void hpet_msi_read(unsigned int irq, struct msi_msg *msg);

#ifdef CONFIG_PCI_MSI
extern int arch_setup_hpet_msi(unsigned int irq);
#else
static inline int arch_setup_hpet_msi(unsigned int irq)
{
	return -EINVAL;
}
#endif

T
Thomas Gleixner 已提交
89 90 91 92
#ifdef CONFIG_HPET_EMULATE_RTC

#include <linux/interrupt.h>

93
typedef irqreturn_t (*rtc_irq_handler)(int interrupt, void *cookie);
T
Thomas Gleixner 已提交
94 95 96 97 98 99 100 101
extern int hpet_mask_rtc_irq_bit(unsigned long bit_mask);
extern int hpet_set_rtc_irq_bit(unsigned long bit_mask);
extern int hpet_set_alarm_time(unsigned char hrs, unsigned char min,
			       unsigned char sec);
extern int hpet_set_periodic_freq(unsigned long freq);
extern int hpet_rtc_dropped_irq(void);
extern int hpet_rtc_timer_init(void);
extern irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id);
102 103
extern int hpet_register_irq_handler(rtc_irq_handler handler);
extern void hpet_unregister_irq_handler(rtc_irq_handler handler);
T
Thomas Gleixner 已提交
104 105 106

#endif /* CONFIG_HPET_EMULATE_RTC */

107
#else /* CONFIG_HPET_TIMER */
T
Thomas Gleixner 已提交
108 109

static inline int hpet_enable(void) { return 0; }
110
static inline int is_hpet_enabled(void) { return 0; }
A
Alok Kataria 已提交
111
#define hpet_readl(a) 0
T
Thomas Gleixner 已提交
112

113
#endif
H
H. Peter Anvin 已提交
114
#endif /* _ASM_X86_HPET_H */