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