diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index 1840a05..954103d 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c @@ -3072,6 +3072,16 @@ static void __init init_no_remapping_devices(void) } #ifdef CONFIG_SUSPEND + +static void dump_iommu_data(struct intel_iommu *iommu) +{ + int i; + for (i=0; i < 0xc0; i++) + printk("%02x: %08x %08x %08x %08x\n", i, + readl(iommu->reg + i), readl(iommu->reg + i + 4), + readl(iommu->reg + i + 8), + readl(iommu->reg + i + 12)); +} static int init_iommu_hw(void) { struct dmar_drhd_unit *drhd; @@ -3082,16 +3092,27 @@ static int init_iommu_hw(void) dmar_reenable_qi(iommu); for_each_active_iommu(iommu, drhd) { + + printk("Resume IOMMU at %llx...\n",drhd->reg_base_addr); + dump_iommu_data(iommu); + + printk("Flush write buffer...\n"); iommu_flush_write_buffer(iommu); + printk("Set root entry...\n"); iommu_set_root_entry(iommu); + printk("Flush global context...\n"); iommu->flush.flush_context(iommu, 0, 0, 0, DMA_CCMD_GLOBAL_INVL); + printk("Flush global iotlb...\n"); iommu->flush.flush_iotlb(iommu, 0, 0, 0, DMA_TLB_GLOBAL_FLUSH); + printk("Enable translation...\n"); iommu_enable_translation(iommu); + printk("Disable PMRs...\n"); iommu_disable_protect_mem_regions(iommu); + printk("Done!\n"); } return 0; @@ -3126,7 +3147,9 @@ static int iommu_suspend(struct sys_device *dev, pm_message_t state) iommu_flush_all(); for_each_active_iommu(iommu, drhd) { + printk("Suspend IOMMU at %llx\n", drhd->reg_base_addr); iommu_disable_translation(iommu); + dump_iommu_data(iommu); spin_lock_irqsave(&iommu->register_lock, flag);