|
@@ -965,12 +965,31 @@ static void disable_iommus(void)
|
|
|
|
|
|
static int amd_iommu_resume(struct sys_device *dev)
|
|
|
{
|
|
|
+ /*
|
|
|
+ * Disable IOMMUs before reprogramming the hardware registers.
|
|
|
+ * IOMMU is still enabled from the resume kernel.
|
|
|
+ */
|
|
|
+ disable_iommus();
|
|
|
+
|
|
|
+ /* re-load the hardware */
|
|
|
+ enable_iommus();
|
|
|
+
|
|
|
+ /*
|
|
|
+ * we have to flush after the IOMMUs are enabled because a
|
|
|
+ * disabled IOMMU will never execute the commands we send
|
|
|
+ */
|
|
|
+ amd_iommu_flush_all_domains();
|
|
|
+ amd_iommu_flush_all_devices();
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
static int amd_iommu_suspend(struct sys_device *dev, pm_message_t state)
|
|
|
{
|
|
|
- return -EINVAL;
|
|
|
+ /* disable IOMMUs to go out of the way for BIOS */
|
|
|
+ disable_iommus();
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static struct sysdev_class amd_iommu_sysdev_class = {
|