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 Torvaldsstatic 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