mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	drivers: hv: Decouple Hyper-V clock/timer code from VMbus drivers
Hyper-V clock/timer code in hyperv_timer.c is mostly independent from other VMbus drivers, but building for ARM64 without hyperv_timer.c shows some remaining entanglements. A default implementation of hv_read_reference_counter can just read a Hyper-V synthetic register and be independent of hyperv_timer.c, so move this code out and into hv_common.c. Then it can be used by the timesync driver even if hyperv_timer.c isn't built on a particular architecture. If hyperv_timer.c *is* built, it can override with a faster implementation. Also provide stubs for stimer functions called by the VMbus driver when hyperv_timer.c isn't built. No functional changes. Signed-off-by: Michael Kelley <mikelley@microsoft.com> Link: https://lore.kernel.org/r/1626220906-22629-1-git-send-email-mikelley@microsoft.com Signed-off-by: Wei Liu <wei.liu@kernel.org>
This commit is contained in:
		
							parent
							
								
									5f92b45c3b
								
							
						
					
					
						commit
						31e5e64694
					
				
					 5 changed files with 25 additions and 10 deletions
				
			
		| 
						 | 
				
			
			@ -361,9 +361,6 @@ EXPORT_SYMBOL_GPL(hv_stimer_global_cleanup);
 | 
			
		|||
 * Hyper-V and 32-bit x86.  The TSC reference page version is preferred.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
u64 (*hv_read_reference_counter)(void);
 | 
			
		||||
EXPORT_SYMBOL_GPL(hv_read_reference_counter);
 | 
			
		||||
 | 
			
		||||
static union {
 | 
			
		||||
	struct ms_hyperv_tsc_page page;
 | 
			
		||||
	u8 reserved[PAGE_SIZE];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -222,6 +222,20 @@ bool hv_is_hibernation_supported(void)
 | 
			
		|||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(hv_is_hibernation_supported);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Default function to read the Hyper-V reference counter, independent
 | 
			
		||||
 * of whether Hyper-V enlightened clocks/timers are being used. But on
 | 
			
		||||
 * architectures where it is used, Hyper-V enlightenment code in
 | 
			
		||||
 * hyperv_timer.c may override this function.
 | 
			
		||||
 */
 | 
			
		||||
static u64 __hv_read_ref_counter(void)
 | 
			
		||||
{
 | 
			
		||||
	return hv_get_register(HV_REGISTER_TIME_REF_COUNT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
u64 (*hv_read_reference_counter)(void) = __hv_read_ref_counter;
 | 
			
		||||
EXPORT_SYMBOL_GPL(hv_read_reference_counter);
 | 
			
		||||
 | 
			
		||||
/* These __weak functions provide default "no-op" behavior and
 | 
			
		||||
 * may be overridden by architecture specific versions. Architectures
 | 
			
		||||
 * for which the default "no-op" behavior is sufficient can leave
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,7 +17,6 @@
 | 
			
		|||
#include <linux/hyperv.h>
 | 
			
		||||
#include <linux/clockchips.h>
 | 
			
		||||
#include <linux/ptp_clock_kernel.h>
 | 
			
		||||
#include <clocksource/hyperv_timer.h>
 | 
			
		||||
#include <asm/mshyperv.h>
 | 
			
		||||
 | 
			
		||||
#include "hyperv_vmbus.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -735,10 +734,6 @@ static struct ptp_clock *hv_ptp_clock;
 | 
			
		|||
 | 
			
		||||
static int hv_timesync_init(struct hv_util_service *srv)
 | 
			
		||||
{
 | 
			
		||||
	/* TimeSync requires Hyper-V clocksource. */
 | 
			
		||||
	if (!hv_read_reference_counter)
 | 
			
		||||
		return -ENODEV;
 | 
			
		||||
 | 
			
		||||
	spin_lock_init(&host_ts.lock);
 | 
			
		||||
 | 
			
		||||
	INIT_WORK(&adj_time_work, hv_set_host_time);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -167,6 +167,8 @@ extern bool hv_root_partition;
 | 
			
		|||
extern u32 *hv_vp_index;
 | 
			
		||||
extern u32 hv_max_vp_index;
 | 
			
		||||
 | 
			
		||||
extern u64 (*hv_read_reference_counter)(void);
 | 
			
		||||
 | 
			
		||||
/* Sentinel value for an uninitialized entry in hv_vp_index array */
 | 
			
		||||
#define VP_INVAL	U32_MAX
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,8 @@
 | 
			
		|||
#define HV_MAX_MAX_DELTA_TICKS 0xffffffff
 | 
			
		||||
#define HV_MIN_DELTA_TICKS 1
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_HYPERV_TIMER
 | 
			
		||||
 | 
			
		||||
/* Routines called by the VMbus driver */
 | 
			
		||||
extern int hv_stimer_alloc(bool have_percpu_irqs);
 | 
			
		||||
extern int hv_stimer_cleanup(unsigned int cpu);
 | 
			
		||||
| 
						 | 
				
			
			@ -28,8 +30,6 @@ extern void hv_stimer_legacy_cleanup(unsigned int cpu);
 | 
			
		|||
extern void hv_stimer_global_cleanup(void);
 | 
			
		||||
extern void hv_stimer0_isr(void);
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_HYPERV_TIMER
 | 
			
		||||
extern u64 (*hv_read_reference_counter)(void);
 | 
			
		||||
extern void hv_init_clocksource(void);
 | 
			
		||||
 | 
			
		||||
extern struct ms_hyperv_tsc_page *hv_get_tsc_page(void);
 | 
			
		||||
| 
						 | 
				
			
			@ -100,6 +100,13 @@ static inline u64 hv_read_tsc_page_tsc(const struct ms_hyperv_tsc_page *tsc_pg,
 | 
			
		|||
{
 | 
			
		||||
	return U64_MAX;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int hv_stimer_cleanup(unsigned int cpu) { return 0; }
 | 
			
		||||
static inline void hv_stimer_legacy_init(unsigned int cpu, int sint) {}
 | 
			
		||||
static inline void hv_stimer_legacy_cleanup(unsigned int cpu) {}
 | 
			
		||||
static inline void hv_stimer_global_cleanup(void) {}
 | 
			
		||||
static inline void hv_stimer0_isr(void) {}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_HYPERV_TIMER */
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue