xref: /linux/arch/riscv/include/asm/kvm_tlb.h (revision 51d90a15fedf8366cb96ef68d0ea2d0bf15417d2)
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 void kvm_riscv_local_tlb_sanitize(struct kvm_vcpu *vcpu);
53 
54 void kvm_riscv_tlb_flush_process(struct kvm_vcpu *vcpu);
55 
56 void kvm_riscv_fence_i_process(struct kvm_vcpu *vcpu);
57 void kvm_riscv_hfence_vvma_all_process(struct kvm_vcpu *vcpu);
58 void kvm_riscv_hfence_process(struct kvm_vcpu *vcpu);
59 
60 void kvm_riscv_fence_i(struct kvm *kvm,
61 		       unsigned long hbase, unsigned long hmask);
62 void kvm_riscv_hfence_gvma_vmid_gpa(struct kvm *kvm,
63 				    unsigned long hbase, unsigned long hmask,
64 				    gpa_t gpa, gpa_t gpsz,
65 				    unsigned long order, unsigned long vmid);
66 void kvm_riscv_hfence_gvma_vmid_all(struct kvm *kvm,
67 				    unsigned long hbase, unsigned long hmask,
68 				    unsigned long vmid);
69 void kvm_riscv_hfence_vvma_asid_gva(struct kvm *kvm,
70 				    unsigned long hbase, unsigned long hmask,
71 				    unsigned long gva, unsigned long gvsz,
72 				    unsigned long order, unsigned long asid,
73 				    unsigned long vmid);
74 void kvm_riscv_hfence_vvma_asid_all(struct kvm *kvm,
75 				    unsigned long hbase, unsigned long hmask,
76 				    unsigned long asid, unsigned long vmid);
77 void kvm_riscv_hfence_vvma_gva(struct kvm *kvm,
78 			       unsigned long hbase, unsigned long hmask,
79 			       unsigned long gva, unsigned long gvsz,
80 			       unsigned long order, unsigned long vmid);
81 void kvm_riscv_hfence_vvma_all(struct kvm *kvm,
82 			       unsigned long hbase, unsigned long hmask,
83 			       unsigned long vmid);
84 
85 #endif
86