xref: /linux/arch/riscv/include/asm/kvm_tlb.h (revision 63eb28bb1402891b1ad2be02a530f29a9dd7f1cd)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (c) 2025 Ventana Micro Systems Inc.
4  */
5 
6 #ifndef __RISCV_KVM_TLB_H_
7 #define __RISCV_KVM_TLB_H_
8 
9 #include <linux/kvm_types.h>
10 
11 enum kvm_riscv_hfence_type {
12 	KVM_RISCV_HFENCE_UNKNOWN = 0,
13 	KVM_RISCV_HFENCE_GVMA_VMID_GPA,
14 	KVM_RISCV_HFENCE_GVMA_VMID_ALL,
15 	KVM_RISCV_HFENCE_VVMA_ASID_GVA,
16 	KVM_RISCV_HFENCE_VVMA_ASID_ALL,
17 	KVM_RISCV_HFENCE_VVMA_GVA,
18 	KVM_RISCV_HFENCE_VVMA_ALL
19 };
20 
21 struct kvm_riscv_hfence {
22 	enum kvm_riscv_hfence_type type;
23 	unsigned long asid;
24 	unsigned long vmid;
25 	unsigned long order;
26 	gpa_t addr;
27 	gpa_t size;
28 };
29 
30 #define KVM_RISCV_VCPU_MAX_HFENCE	64
31 
32 #define KVM_RISCV_GSTAGE_TLB_MIN_ORDER		12
33 
34 void kvm_riscv_local_hfence_gvma_vmid_gpa(unsigned long vmid,
35 					  gpa_t gpa, gpa_t gpsz,
36 					  unsigned long order);
37 void kvm_riscv_local_hfence_gvma_vmid_all(unsigned long vmid);
38 void kvm_riscv_local_hfence_gvma_gpa(gpa_t gpa, gpa_t gpsz,
39 				     unsigned long order);
40 void kvm_riscv_local_hfence_gvma_all(void);
41 void kvm_riscv_local_hfence_vvma_asid_gva(unsigned long vmid,
42 					  unsigned long asid,
43 					  unsigned long gva,
44 					  unsigned long gvsz,
45 					  unsigned long order);
46 void kvm_riscv_local_hfence_vvma_asid_all(unsigned long vmid,
47 					  unsigned long asid);
48 void kvm_riscv_local_hfence_vvma_gva(unsigned long vmid,
49 				     unsigned long gva, unsigned long gvsz,
50 				     unsigned long order);
51 void kvm_riscv_local_hfence_vvma_all(unsigned long vmid);
52 
53 void kvm_riscv_tlb_flush_process(struct kvm_vcpu *vcpu);
54 
55 void kvm_riscv_fence_i_process(struct kvm_vcpu *vcpu);
56 void kvm_riscv_hfence_vvma_all_process(struct kvm_vcpu *vcpu);
57 void kvm_riscv_hfence_process(struct kvm_vcpu *vcpu);
58 
59 void kvm_riscv_fence_i(struct kvm *kvm,
60 		       unsigned long hbase, unsigned long hmask);
61 void kvm_riscv_hfence_gvma_vmid_gpa(struct kvm *kvm,
62 				    unsigned long hbase, unsigned long hmask,
63 				    gpa_t gpa, gpa_t gpsz,
64 				    unsigned long order, unsigned long vmid);
65 void kvm_riscv_hfence_gvma_vmid_all(struct kvm *kvm,
66 				    unsigned long hbase, unsigned long hmask,
67 				    unsigned long vmid);
68 void kvm_riscv_hfence_vvma_asid_gva(struct kvm *kvm,
69 				    unsigned long hbase, unsigned long hmask,
70 				    unsigned long gva, unsigned long gvsz,
71 				    unsigned long order, unsigned long asid,
72 				    unsigned long vmid);
73 void kvm_riscv_hfence_vvma_asid_all(struct kvm *kvm,
74 				    unsigned long hbase, unsigned long hmask,
75 				    unsigned long asid, unsigned long vmid);
76 void kvm_riscv_hfence_vvma_gva(struct kvm *kvm,
77 			       unsigned long hbase, unsigned long hmask,
78 			       unsigned long gva, unsigned long gvsz,
79 			       unsigned long order, unsigned long vmid);
80 void kvm_riscv_hfence_vvma_all(struct kvm *kvm,
81 			       unsigned long hbase, unsigned long hmask,
82 			       unsigned long vmid);
83 
84 #endif
85