| /* Copyright (c) 2020 Google Inc | 
 |  * Barret Rhoden <brho@cs.berkeley.edu> | 
 |  * See LICENSE for details. | 
 |  * | 
 |  * HPET nonsense */ | 
 |  | 
 | #pragma once | 
 |  | 
 | #include <acpi.h> | 
 | #include <atomic.h> | 
 |  | 
 | struct hpet_timer { | 
 | 	uintptr_t base; | 
 | 	uint64_t enable_cmd; | 
 | 	bool bit64; | 
 | 	bool fsb; | 
 | 	bool in_use; | 
 | 	struct hpet_block *hpb; | 
 | }; | 
 |  | 
 | struct hpet_block { | 
 | 	spinlock_t lock; | 
 | 	uintptr_t base; | 
 | 	uint64_t cap_id; | 
 | 	uint32_t period; | 
 | 	uint32_t nsec_per_tick; | 
 | 	uint32_t reach32; | 
 | 	unsigned int nr_timers; | 
 | 	struct hpet_timer timers[32]; | 
 | }; | 
 |  | 
 | struct hpet_timer *hpet_get_magic_timer(void); | 
 | void hpet_put_timer(struct hpet_timer *ht); | 
 |  | 
 | void hpet_timer_enable(struct hpet_timer *ht); | 
 | void hpet_timer_disable(struct hpet_timer *ht); | 
 | bool hpet_check_spurious_64(struct hpet_timer *ht); | 
 | void hpet_magic_timer_setup(struct hpet_timer *ht, uint8_t vno, uint8_t dmode); | 
 | void hpet_timer_increment_comparator(struct hpet_timer *ht, uint64_t nsec); | 
 |  | 
 | struct Atable *parsehpet(struct Atable *parent, | 
 |                          char *name, uint8_t *p, size_t rawsize); |