Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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