From 1bb26ca6e29f05b6595261676ce94a094ea13cca Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Tue, 11 Sep 2012 14:00:04 +0200 Subject: [PATCH] amd iommu: add 2 helper functions: iommu_is_pte_present and iommu_next_level Signed-off-by: Wei Wang Committed-by: Jan Beulich --- xen/drivers/passthrough/amd/iommu_map.c | 18 ++---------------- xen/drivers/passthrough/amd/pci_amd_iommu.c | 14 +++----------- xen/include/asm-x86/hvm/svm/amd-iommu-proto.h | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 27 deletions(-) diff --git a/xen/drivers/passthrough/amd/iommu_map.c b/xen/drivers/passthrough/amd/iommu_map.c index 43bf5e53a2..542f88bc5b 100644 --- a/xen/drivers/passthrough/amd/iommu_map.c +++ b/xen/drivers/passthrough/amd/iommu_map.c @@ -306,20 +306,6 @@ u64 amd_iommu_get_next_table_from_pte(u32 *entry) return ptr; } -static unsigned int iommu_next_level(u32 *entry) -{ - return get_field_from_reg_u32(entry[0], - IOMMU_PDE_NEXT_LEVEL_MASK, - IOMMU_PDE_NEXT_LEVEL_SHIFT); -} - -static int amd_iommu_is_pte_present(u32 *entry) -{ - return get_field_from_reg_u32(entry[0], - IOMMU_PDE_PRESENT_MASK, - IOMMU_PDE_PRESENT_SHIFT); -} - /* For each pde, We use ignored bits (bit 1 - bit 8 and bit 63) * to save pde count, pde count = 511 is a candidate of page coalescing. */ @@ -489,7 +475,7 @@ static int iommu_pde_from_gfn(struct domain *d, unsigned long pfn, >> PAGE_SHIFT; /* Split super page frame into smaller pieces.*/ - if ( amd_iommu_is_pte_present((u32*)pde) && + if ( iommu_is_pte_present((u32*)pde) && (iommu_next_level((u32*)pde) == 0) && next_table_mfn != 0 ) { @@ -526,7 +512,7 @@ static int iommu_pde_from_gfn(struct domain *d, unsigned long pfn, } /* Install lower level page table for non-present entries */ - else if ( !amd_iommu_is_pte_present((u32*)pde) ) + else if ( !iommu_is_pte_present((u32*)pde) ) { if ( next_table_mfn == 0 ) { diff --git a/xen/drivers/passthrough/amd/pci_amd_iommu.c b/xen/drivers/passthrough/amd/pci_amd_iommu.c index f2db0d64ef..ad24018033 100644 --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c @@ -393,8 +393,7 @@ static void deallocate_next_page_table(struct page_info* pg, int level) { void *table_vaddr, *pde; u64 next_table_maddr; - int index, next_level, present; - u32 *entry; + int index, next_level; table_vaddr = __map_domain_page(pg); @@ -404,18 +403,11 @@ static void deallocate_next_page_table(struct page_info* pg, int level) { pde = table_vaddr + (index * IOMMU_PAGE_TABLE_ENTRY_SIZE); next_table_maddr = amd_iommu_get_next_table_from_pte(pde); - entry = (u32*)pde; - - next_level = get_field_from_reg_u32(entry[0], - IOMMU_PDE_NEXT_LEVEL_MASK, - IOMMU_PDE_NEXT_LEVEL_SHIFT); - present = get_field_from_reg_u32(entry[0], - IOMMU_PDE_PRESENT_MASK, - IOMMU_PDE_PRESENT_SHIFT); + next_level = iommu_next_level((u32*)pde); if ( (next_table_maddr != 0) && (next_level != 0) - && present ) + && iommu_is_pte_present((u32*)pde) ) { deallocate_next_page_table( maddr_to_page(next_table_maddr), level - 1); diff --git a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h index a41acde327..8c425a3d1b 100644 --- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h @@ -257,4 +257,18 @@ static inline void iommu_set_addr_hi_to_reg(uint32_t *reg, uint32_t addr) IOMMU_REG_BASE_ADDR_HIGH_SHIFT, reg); } +static inline int iommu_is_pte_present(const u32 *entry) +{ + return get_field_from_reg_u32(entry[0], + IOMMU_PDE_PRESENT_MASK, + IOMMU_PDE_PRESENT_SHIFT); +} + +static inline unsigned int iommu_next_level(const u32 *entry) +{ + return get_field_from_reg_u32(entry[0], + IOMMU_PDE_NEXT_LEVEL_MASK, + IOMMU_PDE_NEXT_LEVEL_SHIFT); +} + #endif /* _ASM_X86_64_AMD_IOMMU_PROTO_H */ -- 2.30.2