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