break;
cpu_relax();
}
+
+ /* Disable PMRs when VT-d engine takes effect per spec definition */
+ disable_pmr(iommu);
spin_unlock_irqrestore(&iommu->register_lock, flags);
return 0;
}
struct hvm_iommu *hd = domain_hvm_iommu(dom0);
struct acpi_drhd_unit *drhd;
struct iommu *iommu;
- unsigned long i, status;
+ unsigned long i;
if ( !vtd_enabled )
return 0;
if ( enable_vtd_translation() )
goto error;
- status = dmar_readl(iommu->reg, DMAR_PMEN_REG);
- if (status & DMA_PMEN_PRS)
- disable_pmr(iommu);
-
return 0;
error:
/* Disable vt-d protected memory registers. */
void disable_pmr(struct iommu *iommu)
{
- unsigned long start_time, status;
+ unsigned long start_time;
unsigned int val;
val = dmar_readl(iommu->reg, DMAR_PMEN_REG);
+ if ( !(val & DMA_PMEN_PRS) )
+ return;
+
dmar_writel(iommu->reg, DMAR_PMEN_REG, val & ~DMA_PMEN_EPM);
start_time = jiffies;
for ( ; ; )
{
- status = dmar_readl(iommu->reg, DMAR_PMEN_REG);
- if ( (status & DMA_PMEN_PRS) == 0 )
+ val = dmar_readl(iommu->reg, DMAR_PMEN_REG);
+ if ( (val & DMA_PMEN_PRS) == 0 )
break;
+
if ( time_after(jiffies, start_time + DMAR_OPERATION_TIMEOUT) )
- panic("Cannot set QIE field for queue invalidation\n");
+ panic("Disable PMRs timeout\n");
+
cpu_relax();
}
dprintk(XENLOG_INFO VTDPREFIX,
- "disabled protected memory registers\n");
+ "Disabled protected memory registers\n");
}
#if defined(__x86_64__)