ad1588d6064b41dfaa5634148755b526a99ba5d6
[linux-2.6-block.git] / arch / riscv / include / asm / kvm_vcpu_sbi.h
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 1
15 #define KVM_SBI_VERSION_MINOR 0
16
17 enum kvm_riscv_sbi_ext_status {
18         KVM_RISCV_SBI_EXT_AVAILABLE,
19         KVM_RISCV_SBI_EXT_UNAVAILABLE,
20 };
21
22 struct kvm_vcpu_sbi_context {
23         int return_handled;
24         enum kvm_riscv_sbi_ext_status ext_status[KVM_RISCV_SBI_EXT_MAX];
25 };
26
27 struct kvm_vcpu_sbi_return {
28         unsigned long out_val;
29         unsigned long err_val;
30         struct kvm_cpu_trap *utrap;
31         bool uexit;
32 };
33
34 struct kvm_vcpu_sbi_extension {
35         unsigned long extid_start;
36         unsigned long extid_end;
37         /**
38          * SBI extension handler. It can be defined for a given extension or group of
39          * extension. But it should always return linux error codes rather than SBI
40          * specific error codes.
41          */
42         int (*handler)(struct kvm_vcpu *vcpu, struct kvm_run *run,
43                        struct kvm_vcpu_sbi_return *retdata);
44
45         /* Extension specific probe function */
46         unsigned long (*probe)(struct kvm_vcpu *vcpu);
47 };
48
49 void kvm_riscv_vcpu_sbi_forward(struct kvm_vcpu *vcpu, struct kvm_run *run);
50 void kvm_riscv_vcpu_sbi_system_reset(struct kvm_vcpu *vcpu,
51                                      struct kvm_run *run,
52                                      u32 type, u64 flags);
53 int kvm_riscv_vcpu_sbi_return(struct kvm_vcpu *vcpu, struct kvm_run *run);
54 int kvm_riscv_vcpu_set_reg_sbi_ext(struct kvm_vcpu *vcpu,
55                                    const struct kvm_one_reg *reg);
56 int kvm_riscv_vcpu_get_reg_sbi_ext(struct kvm_vcpu *vcpu,
57                                    const struct kvm_one_reg *reg);
58 const struct kvm_vcpu_sbi_extension *kvm_vcpu_sbi_find_ext(
59                                 struct kvm_vcpu *vcpu, unsigned long extid);
60 int kvm_riscv_vcpu_sbi_ecall(struct kvm_vcpu *vcpu, struct kvm_run *run);
61
62 #ifdef CONFIG_RISCV_SBI_V01
63 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_v01;
64 #endif
65 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_base;
66 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_time;
67 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_ipi;
68 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_rfence;
69 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_srst;
70 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_hsm;
71 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_experimental;
72 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_vendor;
73
74 #endif /* __RISCV_KVM_VCPU_SBI_H__ */