Linux Audio

Check our new training course

Loading...
 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
17enum 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
24struct kvm_vcpu_sbi_context {
25	int return_handled;
26	enum kvm_riscv_sbi_ext_status ext_status[KVM_RISCV_SBI_EXT_MAX];
27};
28
29struct 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
36struct 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
54void kvm_riscv_vcpu_sbi_forward(struct kvm_vcpu *vcpu, struct kvm_run *run);
55void kvm_riscv_vcpu_sbi_system_reset(struct kvm_vcpu *vcpu,
56				     struct kvm_run *run,
57				     u32 type, u64 flags);
58int kvm_riscv_vcpu_sbi_return(struct kvm_vcpu *vcpu, struct kvm_run *run);
59int kvm_riscv_vcpu_set_reg_sbi_ext(struct kvm_vcpu *vcpu,
60				   const struct kvm_one_reg *reg);
61int kvm_riscv_vcpu_get_reg_sbi_ext(struct kvm_vcpu *vcpu,
62				   const struct kvm_one_reg *reg);
63int kvm_riscv_vcpu_set_reg_sbi(struct kvm_vcpu *vcpu,
64			       const struct kvm_one_reg *reg);
65int kvm_riscv_vcpu_get_reg_sbi(struct kvm_vcpu *vcpu,
66			       const struct kvm_one_reg *reg);
67const struct kvm_vcpu_sbi_extension *kvm_vcpu_sbi_find_ext(
68				struct kvm_vcpu *vcpu, unsigned long extid);
69bool riscv_vcpu_supports_sbi_ext(struct kvm_vcpu *vcpu, int idx);
70int kvm_riscv_vcpu_sbi_ecall(struct kvm_vcpu *vcpu, struct kvm_run *run);
71void kvm_riscv_vcpu_sbi_init(struct kvm_vcpu *vcpu);
72
73int kvm_riscv_vcpu_get_reg_sbi_sta(struct kvm_vcpu *vcpu, unsigned long reg_num,
74				   unsigned long *reg_val);
75int kvm_riscv_vcpu_set_reg_sbi_sta(struct kvm_vcpu *vcpu, unsigned long reg_num,
76				   unsigned long reg_val);
77
78#ifdef CONFIG_RISCV_SBI_V01
79extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_v01;
80#endif
81extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_base;
82extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_time;
83extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_ipi;
84extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_rfence;
85extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_srst;
86extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_hsm;
87extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_dbcn;
88extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_sta;
89extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_experimental;
90extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_vendor;
91
92#ifdef CONFIG_RISCV_PMU_SBI
93extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_pmu;
94#endif
95#endif /* __RISCV_KVM_VCPU_SBI_H__ */