xref: /linux/arch/riscv/include/asm/kvm_vcpu_sbi.h (revision 3a2c4d55e32ad65efebdb6de44eef3bfa08bb49d)
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 3
15 #define KVM_SBI_VERSION_MINOR 0
16 
17 enum kvm_riscv_sbi_ext_status {
18 	KVM_RISCV_SBI_EXT_STATUS_UNINITIALIZED,
19 	KVM_RISCV_SBI_EXT_STATUS_UNAVAILABLE,
20 	KVM_RISCV_SBI_EXT_STATUS_ENABLED,
21 	KVM_RISCV_SBI_EXT_STATUS_DISABLED,
22 };
23 
24 struct kvm_vcpu_sbi_context {
25 	int return_handled;
26 	enum kvm_riscv_sbi_ext_status ext_status[KVM_RISCV_SBI_EXT_MAX];
27 };
28 
29 struct kvm_vcpu_sbi_return {
30 	unsigned long out_val;
31 	unsigned long err_val;
32 	struct kvm_cpu_trap *utrap;
33 	bool uexit;
34 };
35 
36 struct kvm_vcpu_sbi_extension {
37 	unsigned long extid_start;
38 	unsigned long extid_end;
39 
40 	bool default_disabled;
41 
42 	/**
43 	 * SBI extension handler. It can be defined for a given extension or group of
44 	 * extension. But it should always return linux error codes rather than SBI
45 	 * specific error codes.
46 	 */
47 	int (*handler)(struct kvm_vcpu *vcpu, struct kvm_run *run,
48 		       struct kvm_vcpu_sbi_return *retdata);
49 
50 	/* Extension specific probe function */
51 	unsigned long (*probe)(struct kvm_vcpu *vcpu);
52 
53 	/*
54 	 * Init/deinit function called once during VCPU init/destroy. These
55 	 * might be use if the SBI extensions need to allocate or do specific
56 	 * init time only configuration.
57 	 */
58 	int (*init)(struct kvm_vcpu *vcpu);
59 	void (*deinit)(struct kvm_vcpu *vcpu);
60 
61 	void (*reset)(struct kvm_vcpu *vcpu);
62 
63 	/* Allow the extension to correct its parameters before the first run */
64 	void (*validate)(struct kvm_vcpu *vcpu);
65 
66 	unsigned long state_reg_subtype;
67 	unsigned long (*get_state_reg_count)(struct kvm_vcpu *vcpu);
68 	int (*get_state_reg_id)(struct kvm_vcpu *vcpu, int index, u64 *reg_id);
69 	int (*get_state_reg)(struct kvm_vcpu *vcpu, unsigned long reg_num,
70 			     unsigned long reg_size, void *reg_val);
71 	int (*set_state_reg)(struct kvm_vcpu *vcpu, unsigned long reg_num,
72 			     unsigned long reg_size, const void *reg_val);
73 };
74 
75 int kvm_riscv_vcpu_sbi_forward_handler(struct kvm_vcpu *vcpu,
76 				       struct kvm_run *run,
77 				       struct kvm_vcpu_sbi_return *retdata);
78 void kvm_riscv_vcpu_sbi_system_reset(struct kvm_vcpu *vcpu,
79 				     struct kvm_run *run,
80 				     u32 type, u64 flags);
81 void kvm_riscv_vcpu_sbi_request_reset(struct kvm_vcpu *vcpu,
82 				      unsigned long pc, unsigned long a1);
83 void kvm_riscv_vcpu_sbi_load_reset_state(struct kvm_vcpu *vcpu);
84 int kvm_riscv_vcpu_sbi_return(struct kvm_vcpu *vcpu, struct kvm_run *run);
85 int kvm_riscv_vcpu_reg_indices_sbi_ext(struct kvm_vcpu *vcpu, u64 __user *uindices);
86 int kvm_riscv_vcpu_set_reg_sbi_ext(struct kvm_vcpu *vcpu,
87 				   const struct kvm_one_reg *reg);
88 int kvm_riscv_vcpu_get_reg_sbi_ext(struct kvm_vcpu *vcpu,
89 				   const struct kvm_one_reg *reg);
90 int kvm_riscv_vcpu_reg_indices_sbi(struct kvm_vcpu *vcpu, u64 __user *uindices);
91 int kvm_riscv_vcpu_set_reg_sbi(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg);
92 int kvm_riscv_vcpu_get_reg_sbi(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg);
93 const struct kvm_vcpu_sbi_extension *kvm_vcpu_sbi_find_ext(
94 				struct kvm_vcpu *vcpu, unsigned long extid);
95 int kvm_riscv_vcpu_sbi_ecall(struct kvm_vcpu *vcpu, struct kvm_run *run);
96 void kvm_riscv_vcpu_sbi_init(struct kvm_vcpu *vcpu);
97 void kvm_riscv_vcpu_sbi_deinit(struct kvm_vcpu *vcpu);
98 void kvm_riscv_vcpu_sbi_reset(struct kvm_vcpu *vcpu);
99 void kvm_riscv_vcpu_sbi_validate(struct kvm_vcpu *vcpu);
100 
101 #ifdef CONFIG_RISCV_SBI_V01
102 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_v01;
103 #endif
104 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_base;
105 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_time;
106 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_ipi;
107 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_rfence;
108 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_srst;
109 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_hsm;
110 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_dbcn;
111 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_susp;
112 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_sta;
113 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_fwft;
114 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_mpxy;
115 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_experimental;
116 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_vendor;
117 
118 #ifdef CONFIG_RISCV_PMU_SBI
119 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_pmu;
120 #endif
121 #endif /* __RISCV_KVM_VCPU_SBI_H__ */
122