Here several things need be done: 1) Initialize amd_iommu_dev_table because it was set several times since kdump kernel reboot. We don't need the set because we will copy the content from old kernel. 2) Re-enable event/cmd buffer 3) Install the DTE table to reg 4) Flush all caches
Signed-off-by: Baoquan He <[email protected]> --- drivers/iommu/amd_iommu_init.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c index e5d28ec..26ba00e 100644 --- a/drivers/iommu/amd_iommu_init.c +++ b/drivers/iommu/amd_iommu_init.c @@ -1731,16 +1731,30 @@ static void iommu_apply_resume_quirks(struct amd_iommu *iommu) static void early_enable_iommus(void) { struct amd_iommu *iommu; - - for_each_iommu(iommu) { - iommu_disable(iommu); - iommu_init_flags(iommu); - iommu_set_device_table(iommu); - iommu_enable_command_buffer(iommu); - iommu_enable_event_buffer(iommu); - iommu_set_exclusion_range(iommu); - iommu_enable(iommu); - iommu_flush_all_caches(iommu); + if ( !translation_pre_enabled() ) { + for_each_iommu(iommu) { + iommu_disable(iommu); + iommu_init_flags(iommu); + iommu_set_device_table(iommu); + iommu_enable_command_buffer(iommu); + iommu_enable_event_buffer(iommu); + iommu_set_exclusion_range(iommu); + iommu_enable(iommu); + iommu_flush_all_caches(iommu); + } + } else { + memset(amd_iommu_dev_table, 0, dev_table_size); + + for_each_iommu(iommu) { + if (copy_dev_tables(iommu)) + break; + iommu_feature_disable(iommu, CONTROL_CMDBUF_EN); + iommu_feature_disable(iommu, CONTROL_EVT_LOG_EN); + iommu_enable_command_buffer(iommu); + iommu_enable_event_buffer(iommu); + iommu_set_device_table(iommu); + iommu_flush_all_caches(iommu); + } } } -- 2.1.0 _______________________________________________ iommu mailing list [email protected] https://lists.linuxfoundation.org/mailman/listinfo/iommu
