|
21 | 21 | #include <linux/interrupt.h> |
22 | 22 | #include <linux/irq.h> |
23 | 23 | #include <linux/acpi.h> |
| 24 | +#include <linux/hyperv.h> |
24 | 25 | #include <clocksource/hyperv_timer.h> |
25 | 26 | #include <asm/hyperv-tlfs.h> |
26 | 27 | #include <asm/mshyperv.h> |
@@ -395,25 +396,25 @@ static u64 notrace read_hv_sched_clock_tsc(void) |
395 | 396 |
|
396 | 397 | static void suspend_hv_clock_tsc(struct clocksource *arg) |
397 | 398 | { |
398 | | - u64 tsc_msr; |
| 399 | + union hv_reference_tsc_msr tsc_msr; |
399 | 400 |
|
400 | 401 | /* Disable the TSC page */ |
401 | | - tsc_msr = hv_get_register(HV_REGISTER_REFERENCE_TSC); |
402 | | - tsc_msr &= ~BIT_ULL(0); |
403 | | - hv_set_register(HV_REGISTER_REFERENCE_TSC, tsc_msr); |
| 402 | + tsc_msr.as_uint64 = hv_get_register(HV_REGISTER_REFERENCE_TSC); |
| 403 | + tsc_msr.enable = 0; |
| 404 | + hv_set_register(HV_REGISTER_REFERENCE_TSC, tsc_msr.as_uint64); |
404 | 405 | } |
405 | 406 |
|
406 | 407 |
|
407 | 408 | static void resume_hv_clock_tsc(struct clocksource *arg) |
408 | 409 | { |
409 | 410 | phys_addr_t phys_addr = virt_to_phys(&tsc_pg); |
410 | | - u64 tsc_msr; |
| 411 | + union hv_reference_tsc_msr tsc_msr; |
411 | 412 |
|
412 | 413 | /* Re-enable the TSC page */ |
413 | | - tsc_msr = hv_get_register(HV_REGISTER_REFERENCE_TSC); |
414 | | - tsc_msr &= GENMASK_ULL(11, 0); |
415 | | - tsc_msr |= BIT_ULL(0) | (u64)phys_addr; |
416 | | - hv_set_register(HV_REGISTER_REFERENCE_TSC, tsc_msr); |
| 414 | + tsc_msr.as_uint64 = hv_get_register(HV_REGISTER_REFERENCE_TSC); |
| 415 | + tsc_msr.enable = 1; |
| 416 | + tsc_msr.pfn = HVPFN_DOWN(phys_addr); |
| 417 | + hv_set_register(HV_REGISTER_REFERENCE_TSC, tsc_msr.as_uint64); |
417 | 418 | } |
418 | 419 |
|
419 | 420 | #ifdef HAVE_VDSO_CLOCKMODE_HVCLOCK |
@@ -495,7 +496,7 @@ static __always_inline void hv_setup_sched_clock(void *sched_clock) {} |
495 | 496 |
|
496 | 497 | static bool __init hv_init_tsc_clocksource(void) |
497 | 498 | { |
498 | | - u64 tsc_msr; |
| 499 | + union hv_reference_tsc_msr tsc_msr; |
499 | 500 | phys_addr_t phys_addr; |
500 | 501 |
|
501 | 502 | if (!(ms_hyperv.features & HV_MSR_REFERENCE_TSC_AVAILABLE)) |
@@ -530,10 +531,10 @@ static bool __init hv_init_tsc_clocksource(void) |
530 | 531 | * (which already has at least the low 12 bits set to zero since |
531 | 532 | * it is page aligned). Also set the "enable" bit, which is bit 0. |
532 | 533 | */ |
533 | | - tsc_msr = hv_get_register(HV_REGISTER_REFERENCE_TSC); |
534 | | - tsc_msr &= GENMASK_ULL(11, 0); |
535 | | - tsc_msr = tsc_msr | 0x1 | (u64)phys_addr; |
536 | | - hv_set_register(HV_REGISTER_REFERENCE_TSC, tsc_msr); |
| 534 | + tsc_msr.as_uint64 = hv_get_register(HV_REGISTER_REFERENCE_TSC); |
| 535 | + tsc_msr.enable = 1; |
| 536 | + tsc_msr.pfn = HVPFN_DOWN(phys_addr); |
| 537 | + hv_set_register(HV_REGISTER_REFERENCE_TSC, tsc_msr.as_uint64); |
537 | 538 |
|
538 | 539 | clocksource_register_hz(&hyperv_cs_tsc, NSEC_PER_SEC/100); |
539 | 540 |
|
|
0 commit comments