18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci
38c2ecf20Sopenharmony_ci#ifndef __KVM_X86_MMU_TDP_MMU_H
48c2ecf20Sopenharmony_ci#define __KVM_X86_MMU_TDP_MMU_H
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#include <linux/kvm_host.h>
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_civoid kvm_mmu_init_tdp_mmu(struct kvm *kvm);
98c2ecf20Sopenharmony_civoid kvm_mmu_uninit_tdp_mmu(struct kvm *kvm);
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_cibool is_tdp_mmu_root(struct kvm *kvm, hpa_t root);
128c2ecf20Sopenharmony_cihpa_t kvm_tdp_mmu_get_vcpu_root_hpa(struct kvm_vcpu *vcpu);
138c2ecf20Sopenharmony_civoid kvm_tdp_mmu_free_root(struct kvm *kvm, struct kvm_mmu_page *root);
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_cibool __kvm_tdp_mmu_zap_gfn_range(struct kvm *kvm, gfn_t start, gfn_t end,
168c2ecf20Sopenharmony_ci				 bool can_yield);
178c2ecf20Sopenharmony_cistatic inline bool kvm_tdp_mmu_zap_gfn_range(struct kvm *kvm, gfn_t start,
188c2ecf20Sopenharmony_ci					     gfn_t end)
198c2ecf20Sopenharmony_ci{
208c2ecf20Sopenharmony_ci	return __kvm_tdp_mmu_zap_gfn_range(kvm, start, end, true);
218c2ecf20Sopenharmony_ci}
228c2ecf20Sopenharmony_cistatic inline bool kvm_tdp_mmu_zap_sp(struct kvm *kvm, struct kvm_mmu_page *sp)
238c2ecf20Sopenharmony_ci{
248c2ecf20Sopenharmony_ci	gfn_t end = sp->gfn + KVM_PAGES_PER_HPAGE(sp->role.level);
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci	/*
278c2ecf20Sopenharmony_ci	 * Don't allow yielding, as the caller may have pending pages to zap
288c2ecf20Sopenharmony_ci	 * on the shadow MMU.
298c2ecf20Sopenharmony_ci	 */
308c2ecf20Sopenharmony_ci	return __kvm_tdp_mmu_zap_gfn_range(kvm, sp->gfn, end, false);
318c2ecf20Sopenharmony_ci}
328c2ecf20Sopenharmony_civoid kvm_tdp_mmu_zap_all(struct kvm *kvm);
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ciint kvm_tdp_mmu_map(struct kvm_vcpu *vcpu, gpa_t gpa, u32 error_code,
358c2ecf20Sopenharmony_ci		    int map_writable, int max_level, kvm_pfn_t pfn,
368c2ecf20Sopenharmony_ci		    bool prefault);
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ciint kvm_tdp_mmu_zap_hva_range(struct kvm *kvm, unsigned long start,
398c2ecf20Sopenharmony_ci			      unsigned long end);
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ciint kvm_tdp_mmu_age_hva_range(struct kvm *kvm, unsigned long start,
428c2ecf20Sopenharmony_ci			      unsigned long end);
438c2ecf20Sopenharmony_ciint kvm_tdp_mmu_test_age_hva(struct kvm *kvm, unsigned long hva);
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ciint kvm_tdp_mmu_set_spte_hva(struct kvm *kvm, unsigned long address,
468c2ecf20Sopenharmony_ci			     pte_t *host_ptep);
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_cibool kvm_tdp_mmu_wrprot_slot(struct kvm *kvm, struct kvm_memory_slot *slot,
498c2ecf20Sopenharmony_ci			     int min_level);
508c2ecf20Sopenharmony_cibool kvm_tdp_mmu_clear_dirty_slot(struct kvm *kvm,
518c2ecf20Sopenharmony_ci				  struct kvm_memory_slot *slot);
528c2ecf20Sopenharmony_civoid kvm_tdp_mmu_clear_dirty_pt_masked(struct kvm *kvm,
538c2ecf20Sopenharmony_ci				       struct kvm_memory_slot *slot,
548c2ecf20Sopenharmony_ci				       gfn_t gfn, unsigned long mask,
558c2ecf20Sopenharmony_ci				       bool wrprot);
568c2ecf20Sopenharmony_cibool kvm_tdp_mmu_slot_set_dirty(struct kvm *kvm, struct kvm_memory_slot *slot);
578c2ecf20Sopenharmony_civoid kvm_tdp_mmu_zap_collapsible_sptes(struct kvm *kvm,
588c2ecf20Sopenharmony_ci				       const struct kvm_memory_slot *slot);
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_cibool kvm_tdp_mmu_write_protect_gfn(struct kvm *kvm,
618c2ecf20Sopenharmony_ci				   struct kvm_memory_slot *slot, gfn_t gfn);
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ciint kvm_tdp_mmu_get_walk(struct kvm_vcpu *vcpu, u64 addr, u64 *sptes,
648c2ecf20Sopenharmony_ci			 int *root_level);
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci#endif /* __KVM_X86_MMU_TDP_MMU_H */
67