1 /* SPDX-License-Identifier: GPL-2.0-only */
3 * Copyright (c) 2021 Western Digital Corporation or its affiliates.
6 * Atish Patra <atish.patra@wdc.com>
9 #ifndef __RISCV_KVM_VCPU_SBI_H__
10 #define __RISCV_KVM_VCPU_SBI_H__
12 #define KVM_SBI_IMPID 3
14 #define KVM_SBI_VERSION_MAJOR 1
15 #define KVM_SBI_VERSION_MINOR 0
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
,
23 struct kvm_vcpu_sbi_context
{
25 enum kvm_riscv_sbi_ext_status ext_status
[KVM_RISCV_SBI_EXT_MAX
];
28 struct kvm_vcpu_sbi_return
{
29 unsigned long out_val
;
30 unsigned long err_val
;
31 struct kvm_cpu_trap
*utrap
;
35 struct kvm_vcpu_sbi_extension
{
36 unsigned long extid_start
;
37 unsigned long extid_end
;
39 * SBI extension handler. It can be defined for a given extension or group of
40 * extension. But it should always return linux error codes rather than SBI
41 * specific error codes.
43 int (*handler
)(struct kvm_vcpu
*vcpu
, struct kvm_run
*run
,
44 struct kvm_vcpu_sbi_return
*retdata
);
46 /* Extension specific probe function */
47 unsigned long (*probe
)(struct kvm_vcpu
*vcpu
);
50 void kvm_riscv_vcpu_sbi_forward(struct kvm_vcpu
*vcpu
, struct kvm_run
*run
);
51 void kvm_riscv_vcpu_sbi_system_reset(struct kvm_vcpu
*vcpu
,
54 int kvm_riscv_vcpu_sbi_return(struct kvm_vcpu
*vcpu
, struct kvm_run
*run
);
55 int kvm_riscv_vcpu_set_reg_sbi_ext(struct kvm_vcpu
*vcpu
,
56 const struct kvm_one_reg
*reg
);
57 int kvm_riscv_vcpu_get_reg_sbi_ext(struct kvm_vcpu
*vcpu
,
58 const struct kvm_one_reg
*reg
);
59 const struct kvm_vcpu_sbi_extension
*kvm_vcpu_sbi_find_ext(
60 struct kvm_vcpu
*vcpu
, unsigned long extid
);
61 int kvm_riscv_vcpu_sbi_ecall(struct kvm_vcpu
*vcpu
, struct kvm_run
*run
);
63 #ifdef CONFIG_RISCV_SBI_V01
64 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_v01
;
66 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_base
;
67 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_time
;
68 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_ipi
;
69 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_rfence
;
70 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_srst
;
71 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_hsm
;
72 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_experimental
;
73 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_vendor
;
75 #ifdef CONFIG_RISCV_PMU_SBI
76 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_pmu
;
78 #endif /* __RISCV_KVM_VCPU_SBI_H__ */