xref: /linux-6.15/include/linux/hpet.h (revision d662198e)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds #ifndef	__HPET__
31da177e4SLinus Torvalds #define	__HPET__ 1
41da177e4SLinus Torvalds 
5607ca46eSDavid Howells #include <uapi/linux/hpet.h>
61da177e4SLinus Torvalds 
7878a9f30SRandy Dunlap 
81da177e4SLinus Torvalds /*
91da177e4SLinus Torvalds  * Offsets into HPET Registers
101da177e4SLinus Torvalds  */
111da177e4SLinus Torvalds 
121da177e4SLinus Torvalds struct hpet {
131da177e4SLinus Torvalds 	u64 hpet_cap;		/* capabilities */
141da177e4SLinus Torvalds 	u64 res0;		/* reserved */
151da177e4SLinus Torvalds 	u64 hpet_config;	/* configuration */
161da177e4SLinus Torvalds 	u64 res1;		/* reserved */
171da177e4SLinus Torvalds 	u64 hpet_isr;		/* interrupt status reg */
181da177e4SLinus Torvalds 	u64 res2[25];		/* reserved */
191da177e4SLinus Torvalds 	union {			/* main counter */
201da177e4SLinus Torvalds 		u64 _hpet_mc64;
211da177e4SLinus Torvalds 		u32 _hpet_mc32;
221da177e4SLinus Torvalds 		unsigned long _hpet_mc;
231da177e4SLinus Torvalds 	} _u0;
241da177e4SLinus Torvalds 	u64 res3;		/* reserved */
251da177e4SLinus Torvalds 	struct hpet_timer {
261da177e4SLinus Torvalds 		u64 hpet_config;	/* configuration/cap */
271da177e4SLinus Torvalds 		union {		/* timer compare register */
281da177e4SLinus Torvalds 			u64 _hpet_hc64;
291da177e4SLinus Torvalds 			u32 _hpet_hc32;
301da177e4SLinus Torvalds 			unsigned long _hpet_compare;
311da177e4SLinus Torvalds 		} _u1;
321da177e4SLinus Torvalds 		u64 hpet_fsb[2];	/* FSB route */
33*d662198eSKees Cook 	} hpet_timers[];
341da177e4SLinus Torvalds };
351da177e4SLinus Torvalds 
361da177e4SLinus Torvalds #define	hpet_mc		_u0._hpet_mc
371da177e4SLinus Torvalds #define	hpet_compare	_u1._hpet_compare
381da177e4SLinus Torvalds 
391da177e4SLinus Torvalds #define	HPET_MAX_TIMERS	(32)
4070ef6d59SKevin Hao #define	HPET_MAX_IRQ	(32)
411da177e4SLinus Torvalds 
421da177e4SLinus Torvalds /*
431da177e4SLinus Torvalds  * HPET general capabilities register
441da177e4SLinus Torvalds  */
451da177e4SLinus Torvalds 
461da177e4SLinus Torvalds #define	HPET_COUNTER_CLK_PERIOD_MASK	(0xffffffff00000000ULL)
471da177e4SLinus Torvalds #define	HPET_COUNTER_CLK_PERIOD_SHIFT	(32UL)
481da177e4SLinus Torvalds #define	HPET_VENDOR_ID_MASK		(0x00000000ffff0000ULL)
491da177e4SLinus Torvalds #define	HPET_VENDOR_ID_SHIFT		(16ULL)
501da177e4SLinus Torvalds #define	HPET_LEG_RT_CAP_MASK		(0x8000)
511da177e4SLinus Torvalds #define	HPET_COUNTER_SIZE_MASK		(0x2000)
521da177e4SLinus Torvalds #define	HPET_NUM_TIM_CAP_MASK		(0x1f00)
531da177e4SLinus Torvalds #define	HPET_NUM_TIM_CAP_SHIFT		(8ULL)
541da177e4SLinus Torvalds 
551da177e4SLinus Torvalds /*
561da177e4SLinus Torvalds  * HPET general configuration register
571da177e4SLinus Torvalds  */
581da177e4SLinus Torvalds 
591da177e4SLinus Torvalds #define	HPET_LEG_RT_CNF_MASK		(2UL)
601da177e4SLinus Torvalds #define	HPET_ENABLE_CNF_MASK		(1UL)
611da177e4SLinus Torvalds 
621da177e4SLinus Torvalds 
631da177e4SLinus Torvalds /*
641da177e4SLinus Torvalds  * Timer configuration register
651da177e4SLinus Torvalds  */
661da177e4SLinus Torvalds 
671da177e4SLinus Torvalds #define	Tn_INT_ROUTE_CAP_MASK		(0xffffffff00000000ULL)
6870ef6d59SKevin Hao #define	Tn_INT_ROUTE_CAP_SHIFT		(32UL)
691da177e4SLinus Torvalds #define	Tn_FSB_INT_DELCAP_MASK		(0x8000UL)
701da177e4SLinus Torvalds #define	Tn_FSB_INT_DELCAP_SHIFT		(15)
711da177e4SLinus Torvalds #define	Tn_FSB_EN_CNF_MASK		(0x4000UL)
721da177e4SLinus Torvalds #define	Tn_FSB_EN_CNF_SHIFT		(14)
731da177e4SLinus Torvalds #define	Tn_INT_ROUTE_CNF_MASK		(0x3e00UL)
741da177e4SLinus Torvalds #define	Tn_INT_ROUTE_CNF_SHIFT		(9)
751da177e4SLinus Torvalds #define	Tn_32MODE_CNF_MASK		(0x0100UL)
761da177e4SLinus Torvalds #define	Tn_VAL_SET_CNF_MASK		(0x0040UL)
771da177e4SLinus Torvalds #define	Tn_SIZE_CAP_MASK		(0x0020UL)
781da177e4SLinus Torvalds #define	Tn_PER_INT_CAP_MASK		(0x0010UL)
791da177e4SLinus Torvalds #define	Tn_TYPE_CNF_MASK		(0x0008UL)
801da177e4SLinus Torvalds #define	Tn_INT_ENB_CNF_MASK		(0x0004UL)
811da177e4SLinus Torvalds #define	Tn_INT_TYPE_CNF_MASK		(0x0002UL)
821da177e4SLinus Torvalds 
831da177e4SLinus Torvalds /*
841da177e4SLinus Torvalds  * Timer FSB Interrupt Route Register
851da177e4SLinus Torvalds  */
861da177e4SLinus Torvalds 
871da177e4SLinus Torvalds #define	Tn_FSB_INT_ADDR_MASK		(0xffffffff00000000ULL)
881da177e4SLinus Torvalds #define	Tn_FSB_INT_ADDR_SHIFT		(32UL)
891da177e4SLinus Torvalds #define	Tn_FSB_INT_VAL_MASK		(0x00000000ffffffffULL)
901da177e4SLinus Torvalds 
911da177e4SLinus Torvalds /*
921da177e4SLinus Torvalds  * exported interfaces
931da177e4SLinus Torvalds  */
941da177e4SLinus Torvalds 
951da177e4SLinus Torvalds struct hpet_data {
961da177e4SLinus Torvalds 	unsigned long hd_phys_address;
971da177e4SLinus Torvalds 	void __iomem *hd_address;
981da177e4SLinus Torvalds 	unsigned short hd_nirqs;
991da177e4SLinus Torvalds 	unsigned int hd_state;	/* timer allocated */
1001da177e4SLinus Torvalds 	unsigned int hd_irq[HPET_MAX_TIMERS];
1011da177e4SLinus Torvalds };
1021da177e4SLinus Torvalds 
hpet_reserve_timer(struct hpet_data * hd,int timer)1031da177e4SLinus Torvalds static inline void hpet_reserve_timer(struct hpet_data *hd, int timer)
1041da177e4SLinus Torvalds {
1051da177e4SLinus Torvalds 	hd->hd_state |= (1 << timer);
1061da177e4SLinus Torvalds 	return;
1071da177e4SLinus Torvalds }
1081da177e4SLinus Torvalds 
1091da177e4SLinus Torvalds int hpet_alloc(struct hpet_data *);
1101da177e4SLinus Torvalds 
1111da177e4SLinus Torvalds #endif				/* !__HPET__ */
112