Index: sys/x86/iommu/intel_drv.c =================================================================== --- sys/x86/iommu/intel_drv.c +++ sys/x86/iommu/intel_drv.c @@ -405,6 +405,7 @@ struct dmar_unit *unit; ACPI_DMAR_HARDWARE_UNIT *dmaru; uint64_t timeout; + int disable_pmr; int i, error; unit = device_get_softc(dev); @@ -528,6 +529,14 @@ dmar_release_resources(dev, unit); return (error); } + disable_pmr = 0; + TUNABLE_INT_FETCH("hw.dmar.pmr.disable", &disable_pmr); + if (disable_pmr) { + error = dmar_disable_protected_regions(unit); + if (error != 0) + device_printf(dev, + "Failed to disable protected regions\n"); + } error = iommu_init_busdma(&unit->iommu); if (error != 0) { dmar_release_resources(dev, unit); Index: sys/x86/iommu/intel_utils.c =================================================================== --- sys/x86/iommu/intel_utils.c +++ sys/x86/iommu/intel_utils.c @@ -508,6 +508,9 @@ return (0); reg = dmar_read4(unit, DMAR_PMEN_REG); + if ((reg & DMAR_PMEN_EPM) == 0) + return (0); + reg &= ~DMAR_PMEN_EPM; dmar_write4(unit, DMAR_PMEN_REG, reg); DMAR_WAIT_UNTIL(((dmar_read4(unit, DMAR_PMEN_REG) & DMAR_PMEN_PRS)