if ( (rc = hd->platform_ops->assign_device(d, bus, devfn)) )
return rc;
- if ( has_iommu_pdevs(d) && !need_iommu(d) )
+ if ( has_iommu_pdevs(d) && !is_hvm_domain(d) && !need_iommu(d) )
{
d->need_iommu = 1;
return iommu_populate_page_table(d);
if ( !iommu_enabled || !hd->platform_ops )
return;
+ if ( !is_hvm_domain(d) && !need_iommu(d) )
+ return;
+
+ if ( need_iommu(d) )
+ {
+ d->need_iommu = 0;
+ hd->platform_ops->teardown(d);
+ return;
+ }
+
if ( hvm_irq_dpci != NULL )
{
for ( i = 0; i < NR_IRQS; i++ )
iommu_enabled = (rc == 0);
out:
- if ( !iommu_enabled || !vtd_enabled )
+ if ( !iommu_enabled )
iommu_pv_enabled = 0;
printk("I/O virtualisation %sabled\n", iommu_enabled ? "en" : "dis");
- if (iommu_enabled)
+ if ( iommu_enabled )
printk("I/O virtualisation for PV guests %sabled\n",
iommu_pv_enabled ? "en" : "dis");
return rc;