File Index
Files and directories
Sign in
FILE

kvm_vcpu_sbi.h

File preview with syntax highlighting.

linux-6.19.14/arch/riscv/include/asm/kvm_vcpu_sbi.h C
  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 3
 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	/*
 54	 * Init/deinit function called once during VCPU init/destroy. These
 55	 * might be use if the SBI extensions need to allocate or do specific
 56	 * init time only configuration.
 57	 */
 58	int (*init)(struct kvm_vcpu *vcpu);
 59	void (*deinit)(struct kvm_vcpu *vcpu);
 60
 61	void (*reset)(struct kvm_vcpu *vcpu);
 62
 63	unsigned long state_reg_subtype;
 64	unsigned long (*get_state_reg_count)(struct kvm_vcpu *vcpu);
 65	int (*get_state_reg_id)(struct kvm_vcpu *vcpu, int index, u64 *reg_id);
 66	int (*get_state_reg)(struct kvm_vcpu *vcpu, unsigned long reg_num,
 67			     unsigned long reg_size, void *reg_val);
 68	int (*set_state_reg)(struct kvm_vcpu *vcpu, unsigned long reg_num,
 69			     unsigned long reg_size, const void *reg_val);
 70};
 71
 72int kvm_riscv_vcpu_sbi_forward_handler(struct kvm_vcpu *vcpu,
 73				       struct kvm_run *run,
 74				       struct kvm_vcpu_sbi_return *retdata);
 75void kvm_riscv_vcpu_sbi_system_reset(struct kvm_vcpu *vcpu,
 76				     struct kvm_run *run,
 77				     u32 type, u64 flags);
 78void kvm_riscv_vcpu_sbi_request_reset(struct kvm_vcpu *vcpu,
 79				      unsigned long pc, unsigned long a1);
 80void kvm_riscv_vcpu_sbi_load_reset_state(struct kvm_vcpu *vcpu);
 81int kvm_riscv_vcpu_sbi_return(struct kvm_vcpu *vcpu, struct kvm_run *run);
 82int kvm_riscv_vcpu_reg_indices_sbi_ext(struct kvm_vcpu *vcpu, u64 __user *uindices);
 83int kvm_riscv_vcpu_set_reg_sbi_ext(struct kvm_vcpu *vcpu,
 84				   const struct kvm_one_reg *reg);
 85int kvm_riscv_vcpu_get_reg_sbi_ext(struct kvm_vcpu *vcpu,
 86				   const struct kvm_one_reg *reg);
 87int kvm_riscv_vcpu_reg_indices_sbi(struct kvm_vcpu *vcpu, u64 __user *uindices);
 88int kvm_riscv_vcpu_set_reg_sbi(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg);
 89int kvm_riscv_vcpu_get_reg_sbi(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg);
 90const struct kvm_vcpu_sbi_extension *kvm_vcpu_sbi_find_ext(
 91				struct kvm_vcpu *vcpu, unsigned long extid);
 92int kvm_riscv_vcpu_sbi_ecall(struct kvm_vcpu *vcpu, struct kvm_run *run);
 93void kvm_riscv_vcpu_sbi_init(struct kvm_vcpu *vcpu);
 94void kvm_riscv_vcpu_sbi_deinit(struct kvm_vcpu *vcpu);
 95void kvm_riscv_vcpu_sbi_reset(struct kvm_vcpu *vcpu);
 96
 97#ifdef CONFIG_RISCV_SBI_V01
 98extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_v01;
 99#endif
100extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_base;
101extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_time;
102extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_ipi;
103extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_rfence;
104extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_srst;
105extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_hsm;
106extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_dbcn;
107extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_susp;
108extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_sta;
109extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_fwft;
110extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_mpxy;
111extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_experimental;
112extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_vendor;
113
114#ifdef CONFIG_RISCV_PMU_SBI
115extern const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_pmu;
116#endif
117#endif /* __RISCV_KVM_VCPU_SBI_H__ */
~/ Read-only file preview.