162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#ifndef __KVM_X86_MMU_TDP_MMU_H
462306a36Sopenharmony_ci#define __KVM_X86_MMU_TDP_MMU_H
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/kvm_host.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include "spte.h"
962306a36Sopenharmony_ci
1062306a36Sopenharmony_civoid kvm_mmu_init_tdp_mmu(struct kvm *kvm);
1162306a36Sopenharmony_civoid kvm_mmu_uninit_tdp_mmu(struct kvm *kvm);
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cihpa_t kvm_tdp_mmu_get_vcpu_root_hpa(struct kvm_vcpu *vcpu);
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci__must_check static inline bool kvm_tdp_mmu_get_root(struct kvm_mmu_page *root)
1662306a36Sopenharmony_ci{
1762306a36Sopenharmony_ci	return refcount_inc_not_zero(&root->tdp_mmu_root_count);
1862306a36Sopenharmony_ci}
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_civoid kvm_tdp_mmu_put_root(struct kvm *kvm, struct kvm_mmu_page *root,
2162306a36Sopenharmony_ci			  bool shared);
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cibool kvm_tdp_mmu_zap_leafs(struct kvm *kvm, gfn_t start, gfn_t end, bool flush);
2462306a36Sopenharmony_cibool kvm_tdp_mmu_zap_sp(struct kvm *kvm, struct kvm_mmu_page *sp);
2562306a36Sopenharmony_civoid kvm_tdp_mmu_zap_all(struct kvm *kvm);
2662306a36Sopenharmony_civoid kvm_tdp_mmu_invalidate_all_roots(struct kvm *kvm);
2762306a36Sopenharmony_civoid kvm_tdp_mmu_zap_invalidated_roots(struct kvm *kvm);
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ciint kvm_tdp_mmu_map(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault);
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cibool kvm_tdp_mmu_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range,
3262306a36Sopenharmony_ci				 bool flush);
3362306a36Sopenharmony_cibool kvm_tdp_mmu_age_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range);
3462306a36Sopenharmony_cibool kvm_tdp_mmu_test_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range);
3562306a36Sopenharmony_cibool kvm_tdp_mmu_set_spte_gfn(struct kvm *kvm, struct kvm_gfn_range *range);
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cibool kvm_tdp_mmu_wrprot_slot(struct kvm *kvm,
3862306a36Sopenharmony_ci			     const struct kvm_memory_slot *slot, int min_level);
3962306a36Sopenharmony_cibool kvm_tdp_mmu_clear_dirty_slot(struct kvm *kvm,
4062306a36Sopenharmony_ci				  const struct kvm_memory_slot *slot);
4162306a36Sopenharmony_civoid kvm_tdp_mmu_clear_dirty_pt_masked(struct kvm *kvm,
4262306a36Sopenharmony_ci				       struct kvm_memory_slot *slot,
4362306a36Sopenharmony_ci				       gfn_t gfn, unsigned long mask,
4462306a36Sopenharmony_ci				       bool wrprot);
4562306a36Sopenharmony_civoid kvm_tdp_mmu_zap_collapsible_sptes(struct kvm *kvm,
4662306a36Sopenharmony_ci				       const struct kvm_memory_slot *slot);
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cibool kvm_tdp_mmu_write_protect_gfn(struct kvm *kvm,
4962306a36Sopenharmony_ci				   struct kvm_memory_slot *slot, gfn_t gfn,
5062306a36Sopenharmony_ci				   int min_level);
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_civoid kvm_tdp_mmu_try_split_huge_pages(struct kvm *kvm,
5362306a36Sopenharmony_ci				      const struct kvm_memory_slot *slot,
5462306a36Sopenharmony_ci				      gfn_t start, gfn_t end,
5562306a36Sopenharmony_ci				      int target_level, bool shared);
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistatic inline void kvm_tdp_mmu_walk_lockless_begin(void)
5862306a36Sopenharmony_ci{
5962306a36Sopenharmony_ci	rcu_read_lock();
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cistatic inline void kvm_tdp_mmu_walk_lockless_end(void)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	rcu_read_unlock();
6562306a36Sopenharmony_ci}
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ciint kvm_tdp_mmu_get_walk(struct kvm_vcpu *vcpu, u64 addr, u64 *sptes,
6862306a36Sopenharmony_ci			 int *root_level);
6962306a36Sopenharmony_ciu64 *kvm_tdp_mmu_fast_pf_get_last_sptep(struct kvm_vcpu *vcpu, u64 addr,
7062306a36Sopenharmony_ci					u64 *spte);
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci#ifdef CONFIG_X86_64
7362306a36Sopenharmony_cistatic inline bool is_tdp_mmu_page(struct kvm_mmu_page *sp) { return sp->tdp_mmu_page; }
7462306a36Sopenharmony_ci#else
7562306a36Sopenharmony_cistatic inline bool is_tdp_mmu_page(struct kvm_mmu_page *sp) { return false; }
7662306a36Sopenharmony_ci#endif
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci#endif /* __KVM_X86_MMU_TDP_MMU_H */
79