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 2
15 #define KVM_SBI_VERSION_MINOR 0
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
,
24 struct kvm_vcpu_sbi_context
{
26 enum kvm_riscv_sbi_ext_status ext_status
[KVM_RISCV_SBI_EXT_MAX
];
29 struct kvm_vcpu_sbi_return
{
30 unsigned long out_val
;
31 unsigned long err_val
;
32 struct kvm_cpu_trap
*utrap
;
36 struct kvm_vcpu_sbi_extension
{
37 unsigned long extid_start
;
38 unsigned long extid_end
;
40 bool default_disabled
;
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.
47 int (*handler
)(struct kvm_vcpu
*vcpu
, struct kvm_run
*run
,
48 struct kvm_vcpu_sbi_return
*retdata
);
50 /* Extension specific probe function */
51 unsigned long (*probe
)(struct kvm_vcpu
*vcpu
);
54 void kvm_riscv_vcpu_sbi_forward(struct kvm_vcpu
*vcpu
, struct kvm_run
*run
);
55 void kvm_riscv_vcpu_sbi_system_reset(struct kvm_vcpu
*vcpu
,
58 int kvm_riscv_vcpu_sbi_return(struct kvm_vcpu
*vcpu
, struct kvm_run
*run
);
59 int kvm_riscv_vcpu_set_reg_sbi_ext(struct kvm_vcpu
*vcpu
,
60 const struct kvm_one_reg
*reg
);
61 int kvm_riscv_vcpu_get_reg_sbi_ext(struct kvm_vcpu
*vcpu
,
62 const struct kvm_one_reg
*reg
);
63 int kvm_riscv_vcpu_set_reg_sbi(struct kvm_vcpu
*vcpu
,
64 const struct kvm_one_reg
*reg
);
65 int kvm_riscv_vcpu_get_reg_sbi(struct kvm_vcpu
*vcpu
,
66 const struct kvm_one_reg
*reg
);
67 const struct kvm_vcpu_sbi_extension
*kvm_vcpu_sbi_find_ext(
68 struct kvm_vcpu
*vcpu
, unsigned long extid
);
69 bool riscv_vcpu_supports_sbi_ext(struct kvm_vcpu
*vcpu
, int idx
);
70 int kvm_riscv_vcpu_sbi_ecall(struct kvm_vcpu
*vcpu
, struct kvm_run
*run
);
71 void kvm_riscv_vcpu_sbi_init(struct kvm_vcpu
*vcpu
);
73 int kvm_riscv_vcpu_get_reg_sbi_sta(struct kvm_vcpu
*vcpu
, unsigned long reg_num
,
74 unsigned long *reg_val
);
75 int kvm_riscv_vcpu_set_reg_sbi_sta(struct kvm_vcpu
*vcpu
, unsigned long reg_num
,
76 unsigned long reg_val
);
78 #ifdef CONFIG_RISCV_SBI_V01
79 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_v01
;
81 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_base
;
82 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_time
;
83 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_ipi
;
84 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_rfence
;
85 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_srst
;
86 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_hsm
;
87 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_dbcn
;
88 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_sta
;
89 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_experimental
;
90 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_vendor
;
92 #ifdef CONFIG_RISCV_PMU_SBI
93 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_pmu
;
95 #endif /* __RISCV_KVM_VCPU_SBI_H__ */