xref: /linux/arch/riscv/include/asm/kvm_vcpu_sbi.h (revision d642ef71)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /**
3  * Copyright (c) 2021 Western Digital Corporation or its affiliates.
4  *
5  * Authors:
6  *     Atish Patra <atish.patra@wdc.com>
7  */
8 
9 #ifndef __RISCV_KVM_VCPU_SBI_H__
10 #define __RISCV_KVM_VCPU_SBI_H__
11 
12 #define KVM_SBI_IMPID 3
13 
14 #define KVM_SBI_VERSION_MAJOR 2
15 #define KVM_SBI_VERSION_MINOR 0
16 
17 enum kvm_riscv_sbi_ext_status {
18 	KVM_RISCV_SBI_EXT_UNINITIALIZED,
19 	KVM_RISCV_SBI_EXT_AVAILABLE,
20 	KVM_RISCV_SBI_EXT_UNAVAILABLE,
21 };
22 
23 struct kvm_vcpu_sbi_context {
24 	int return_handled;
25 	enum kvm_riscv_sbi_ext_status ext_status[KVM_RISCV_SBI_EXT_MAX];
26 };
27 
28 struct kvm_vcpu_sbi_return {
29 	unsigned long out_val;
30 	unsigned long err_val;
31 	struct kvm_cpu_trap *utrap;
32 	bool uexit;
33 };
34 
35 struct kvm_vcpu_sbi_extension {
36 	unsigned long extid_start;
37 	unsigned long extid_end;
38 
39 	bool default_unavail;
40 
41 	/**
42 	 * SBI extension handler. It can be defined for a given extension or group of
43 	 * extension. But it should always return linux error codes rather than SBI
44 	 * specific error codes.
45 	 */
46 	int (*handler)(struct kvm_vcpu *vcpu, struct kvm_run *run,
47 		       struct kvm_vcpu_sbi_return *retdata);
48 
49 	/* Extension specific probe function */
50 	unsigned long (*probe)(struct kvm_vcpu *vcpu);
51 };
52 
53 void kvm_riscv_vcpu_sbi_forward(struct kvm_vcpu *vcpu, struct kvm_run *run);
54 void kvm_riscv_vcpu_sbi_system_reset(struct kvm_vcpu *vcpu,
55 				     struct kvm_run *run,
56 				     u32 type, u64 flags);
57 int kvm_riscv_vcpu_sbi_return(struct kvm_vcpu *vcpu, struct kvm_run *run);
58 int kvm_riscv_vcpu_set_reg_sbi_ext(struct kvm_vcpu *vcpu,
59 				   const struct kvm_one_reg *reg);
60 int kvm_riscv_vcpu_get_reg_sbi_ext(struct kvm_vcpu *vcpu,
61 				   const struct kvm_one_reg *reg);
62 const struct kvm_vcpu_sbi_extension *kvm_vcpu_sbi_find_ext(
63 				struct kvm_vcpu *vcpu, unsigned long extid);
64 int kvm_riscv_vcpu_sbi_ecall(struct kvm_vcpu *vcpu, struct kvm_run *run);
65 void kvm_riscv_vcpu_sbi_init(struct kvm_vcpu *vcpu);
66 
67 #ifdef CONFIG_RISCV_SBI_V01
68 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_v01;
69 #endif
70 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_base;
71 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_time;
72 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_ipi;
73 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_rfence;
74 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_srst;
75 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_hsm;
76 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_dbcn;
77 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_experimental;
78 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_vendor;
79 
80 #ifdef CONFIG_RISCV_PMU_SBI
81 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_pmu;
82 #endif
83 #endif /* __RISCV_KVM_VCPU_SBI_H__ */
84