^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2012 ARM Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Author: Marc Zyngier <marc.zyngier@arm.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #ifndef __ASM_ARM_KVM_ARCH_TIMER_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #define __ASM_ARM_KVM_ARCH_TIMER_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/clocksource.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/hrtimer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) enum kvm_arch_timers {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) TIMER_PTIMER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) TIMER_VTIMER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) NR_KVM_TIMERS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) enum kvm_arch_timer_regs {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) TIMER_REG_CNT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) TIMER_REG_CVAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) TIMER_REG_TVAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) TIMER_REG_CTL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) struct arch_timer_context {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) struct kvm_vcpu *vcpu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) /* Timer IRQ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) struct kvm_irq_level irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) /* Emulated Timer (may be unused) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) struct hrtimer hrtimer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * We have multiple paths which can save/restore the timer state onto
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * the hardware, so we need some way of keeping track of where the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * latest state is.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) bool loaded;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) /* Duplicated state from arch_timer.c for convenience */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) u32 host_timer_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) u32 host_timer_irq_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) struct timer_map {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) struct arch_timer_context *direct_vtimer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) struct arch_timer_context *direct_ptimer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) struct arch_timer_context *emul_ptimer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) struct arch_timer_cpu {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) struct arch_timer_context timers[NR_KVM_TIMERS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) /* Background timer used when the guest is not running */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) struct hrtimer bg_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) /* Is the timer enabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) bool enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) int kvm_timer_hyp_init(bool);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) int kvm_timer_enable(struct kvm_vcpu *vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) int kvm_timer_vcpu_reset(struct kvm_vcpu *vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) void kvm_timer_vcpu_init(struct kvm_vcpu *vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) void kvm_timer_sync_user(struct kvm_vcpu *vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) bool kvm_timer_should_notify_user(struct kvm_vcpu *vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) void kvm_timer_update_run(struct kvm_vcpu *vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) void kvm_timer_vcpu_terminate(struct kvm_vcpu *vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) u64 kvm_arm_timer_get_reg(struct kvm_vcpu *, u64 regid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) int kvm_arm_timer_set_reg(struct kvm_vcpu *, u64 regid, u64 value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) int kvm_arm_timer_set_attr(struct kvm_vcpu *vcpu, struct kvm_device_attr *attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) int kvm_arm_timer_get_attr(struct kvm_vcpu *vcpu, struct kvm_device_attr *attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) int kvm_arm_timer_has_attr(struct kvm_vcpu *vcpu, struct kvm_device_attr *attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) bool kvm_timer_is_pending(struct kvm_vcpu *vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) u64 kvm_phys_timer_read(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) void kvm_timer_vcpu_load(struct kvm_vcpu *vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) void kvm_timer_vcpu_put(struct kvm_vcpu *vcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) void kvm_timer_init_vhe(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) bool kvm_arch_timer_get_input_level(int vintid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define vcpu_timer(v) (&(v)->arch.timer_cpu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #define vcpu_get_timer(v,t) (&vcpu_timer(v)->timers[(t)])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define vcpu_vtimer(v) (&(v)->arch.timer_cpu.timers[TIMER_VTIMER])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define vcpu_ptimer(v) (&(v)->arch.timer_cpu.timers[TIMER_PTIMER])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #define arch_timer_ctx_index(ctx) ((ctx) - vcpu_timer((ctx)->vcpu)->timers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) u64 kvm_arm_timer_read_sysreg(struct kvm_vcpu *vcpu,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) enum kvm_arch_timers tmr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) enum kvm_arch_timer_regs treg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) void kvm_arm_timer_write_sysreg(struct kvm_vcpu *vcpu,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) enum kvm_arch_timers tmr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) enum kvm_arch_timer_regs treg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) u64 val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) /* Needed for tracing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) u32 timer_get_ctl(struct arch_timer_context *ctxt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) u64 timer_get_cval(struct arch_timer_context *ctxt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #endif