x86/acrn: Set up timekeeping
authorFei Li <fei1.li@intel.com>
Thu, 4 Aug 2022 05:59:03 +0000 (13:59 +0800)
committerIngo Molnar <mingo@kernel.org>
Thu, 4 Aug 2022 09:11:59 +0000 (11:11 +0200)
ACRN Hypervisor reports timing information via CPUID leaf 0x40000010.
Get the TSC and CPU frequency via CPUID leaf 0x40000010 and set the
kernel values accordingly.

Signed-off-by: Fei Li <fei1.li@intel.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Reviewed-by: Conghui <conghui.chen@intel.com>
Link: https://lore.kernel.org/r/20220804055903.365211-1-fei1.li@intel.com
arch/x86/include/asm/acrn.h
arch/x86/kernel/cpu/acrn.c

index e003a01b7c6721f6dfcddd148e4be6847b3d67ce..1dd14381bcb6301115026799e2851ba287a16a46 100644 (file)
 /* Bit 0 indicates whether guest VM is privileged */
 #define        ACRN_FEATURE_PRIVILEGED_VM      BIT(0)
 
+/*
+ * Timing Information.
+ * This leaf returns the current TSC frequency in kHz.
+ *
+ * EAX: (Virtual) TSC frequency in kHz.
+ * EBX, ECX, EDX: RESERVED (reserved fields are set to zero).
+ */
+#define ACRN_CPUID_TIMING_INFO         0x40000010
+
 void acrn_setup_intr_handler(void (*handler)(void));
 void acrn_remove_intr_handler(void);
 
@@ -21,6 +30,11 @@ static inline u32 acrn_cpuid_base(void)
        return 0;
 }
 
+static inline unsigned long acrn_get_tsc_khz(void)
+{
+       return cpuid_eax(ACRN_CPUID_TIMING_INFO);
+}
+
 /*
  * Hypercalls for ACRN
  *
index 23f5f27b5a024865054b19b43c766c3f6afa8bfa..485441b7f03036fba446e0e0fba99f48d1addd2b 100644 (file)
@@ -28,6 +28,9 @@ static void __init acrn_init_platform(void)
 {
        /* Setup the IDT for ACRN hypervisor callback */
        alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, asm_sysvec_acrn_hv_callback);
+
+       x86_platform.calibrate_tsc = acrn_get_tsc_khz;
+       x86_platform.calibrate_cpu = acrn_get_tsc_khz;
 }
 
 static bool acrn_x2apic_available(void)