Wei Wang
2012-Jan-20 16:16 UTC
[PATCH 2 of 7 V4] amd iommu: Add a new flag to indication iommuv2 feature enabled or not
# HG changeset patch # User Wei Wang <wei.wang2@amd.com> # Date 1327066820 -3600 # Node ID ea3af8fa078c07d357de79931a102450b59156ea # Parent 978e61814be49ec544151803be3e3b2717551316 amd iommu: Add a new flag to indication iommuv2 feature enabled or not. Hypercalls should return early on non-iommuv2 systems. Signed-off-by: Wei Wang <wei.wang2@amd.com> diff -r 978e61814be4 -r ea3af8fa078c xen/drivers/passthrough/amd/iommu_guest.c --- a/xen/drivers/passthrough/amd/iommu_guest.c Fri Jan 20 14:40:11 2012 +0100 +++ b/xen/drivers/passthrough/amd/iommu_guest.c Fri Jan 20 14:40:20 2012 +0100 @@ -825,6 +825,9 @@ int guest_iommu_set_base(struct domain * if ( !iommu ) return -EACCES; + if ( !is_hvm_domain(d) || !iommuv2_enabled ) + return 1; + iommu->mmio_base = base; base >>= PAGE_SHIFT; @@ -884,7 +887,7 @@ int guest_iommu_init(struct domain* d) struct guest_iommu *iommu; struct hvm_iommu *hd = domain_hvm_iommu(d); - if ( !is_hvm_domain(d) ) + if ( !is_hvm_domain(d) || !iommuv2_enabled ) return 0; iommu = xzalloc(struct guest_iommu); @@ -916,6 +919,9 @@ void guest_iommu_destroy(struct domain * iommu = domain_iommu(d); if ( !iommu ) return; + + if ( !iommuv2_enabled ) + return; tasklet_kill(&iommu->cmd_buffer_tasklet); xfree(iommu); @@ -944,7 +950,7 @@ int iommu_bind_bdf(struct domain* d, uin struct pci_dev *pdev; int ret = -ENODEV; - if ( !iommu_found() ) + if ( !iommu_found() || !iommuv2_enabled ) return 0; spin_lock(&pcidevs_lock); @@ -970,7 +976,7 @@ void iommu_set_msi(struct domain* d, uin { struct guest_iommu *iommu = domain_iommu(d); - if ( !iommu_found() ) + if ( !iommu_found() || !iommuv2_enabled ) return; iommu->msi.vector = vector; diff -r 978e61814be4 -r ea3af8fa078c xen/drivers/passthrough/amd/iommu_init.c --- a/xen/drivers/passthrough/amd/iommu_init.c Fri Jan 20 14:40:11 2012 +0100 +++ b/xen/drivers/passthrough/amd/iommu_init.c Fri Jan 20 14:40:20 2012 +0100 @@ -38,6 +38,7 @@ unsigned short ivrs_bdf_entries; static struct radix_tree_root ivrs_maps; struct list_head amd_iommu_head; struct table_struct device_table; +bool_t iommuv2_enabled; static int iommu_has_ht_flag(struct amd_iommu *iommu, u8 mask) { @@ -799,6 +800,10 @@ static void enable_iommu(struct amd_iomm amd_iommu_flush_all_caches(iommu); iommu->enabled = 1; + + if ( iommu->features ) + iommuv2_enabled = 1; + spin_unlock_irqrestore(&iommu->lock, flags); } diff -r 978e61814be4 -r ea3af8fa078c xen/include/asm-x86/amd-iommu.h --- a/xen/include/asm-x86/amd-iommu.h Fri Jan 20 14:40:11 2012 +0100 +++ b/xen/include/asm-x86/amd-iommu.h Fri Jan 20 14:40:20 2012 +0100 @@ -182,4 +182,6 @@ struct guest_iommu { struct guest_iommu_msi msi; }; +extern bool_t iommuv2_enabled; + #endif /* _ASM_X86_64_AMD_IOMMU_H */ _______________________________________________ osrc-patches mailing list osrc-patches@elbe.amd.com https://elbe.amd.com/mailman/listinfo/osrc-patches