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_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 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, 56 struct kvm_run *run, 57 u32 type, u64 flags); 58 void kvm_riscv_vcpu_sbi_request_reset(struct kvm_vcpu *vcpu, 59 unsigned long pc, unsigned long a1); 60 void kvm_riscv_vcpu_sbi_load_reset_state(struct kvm_vcpu *vcpu); 61 int kvm_riscv_vcpu_sbi_return(struct kvm_vcpu *vcpu, struct kvm_run *run); 62 int kvm_riscv_vcpu_set_reg_sbi_ext(struct kvm_vcpu *vcpu, 63 const struct kvm_one_reg *reg); 64 int kvm_riscv_vcpu_get_reg_sbi_ext(struct kvm_vcpu *vcpu, 65 const struct kvm_one_reg *reg); 66 int kvm_riscv_vcpu_set_reg_sbi(struct kvm_vcpu *vcpu, 67 const struct kvm_one_reg *reg); 68 int kvm_riscv_vcpu_get_reg_sbi(struct kvm_vcpu *vcpu, 69 const struct kvm_one_reg *reg); 70 const struct kvm_vcpu_sbi_extension *kvm_vcpu_sbi_find_ext( 71 struct kvm_vcpu *vcpu, unsigned long extid); 72 bool riscv_vcpu_supports_sbi_ext(struct kvm_vcpu *vcpu, int idx); 73 int kvm_riscv_vcpu_sbi_ecall(struct kvm_vcpu *vcpu, struct kvm_run *run); 74 void kvm_riscv_vcpu_sbi_init(struct kvm_vcpu *vcpu); 75 76 int kvm_riscv_vcpu_get_reg_sbi_sta(struct kvm_vcpu *vcpu, unsigned long reg_num, 77 unsigned long *reg_val); 78 int kvm_riscv_vcpu_set_reg_sbi_sta(struct kvm_vcpu *vcpu, unsigned long reg_num, 79 unsigned long reg_val); 80 81 #ifdef CONFIG_RISCV_SBI_V01 82 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_v01; 83 #endif 84 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_base; 85 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_time; 86 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_ipi; 87 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_rfence; 88 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_srst; 89 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_hsm; 90 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_dbcn; 91 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_susp; 92 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_sta; 93 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_experimental; 94 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_vendor; 95 96 #ifdef CONFIG_RISCV_PMU_SBI 97 extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_pmu; 98 #endif 99 #endif /* __RISCV_KVM_VCPU_SBI_H__ */ 100