root/include/kvm/arm_arch_timer.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


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

/* [<][>][^][v][top][bottom][index][help] */