From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752555AbcE1NZa (ORCPT ); Sat, 28 May 2016 09:25:30 -0400 Received: from mr213139.mail.yeah.net ([223.252.213.139]:61322 "EHLO mr213139.mail.yeah.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751378AbcE1NZ2 (ORCPT ); Sat, 28 May 2016 09:25:28 -0400 Subject: Re: [Patch v4 7/9] iommu/amd: copy old trans table from old kernel To: Baoquan He , joro@8bytes.org References: <1464157735-8865-1-git-send-email-bhe@redhat.com> <1464157735-8865-8-git-send-email-bhe@redhat.com> Cc: linux-kernel@vger.kernel.org, vincent.wan@amd.com, iommu@lists.linux-foundation.org, dyoung@redhat.com From: Wan Zongshun Message-ID: <23334ff3-1560-c8b4-2730-67253cb05730@iommu.org> Date: Sat, 28 May 2016 21:25:16 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.1.0 MIME-Version: 1.0 In-Reply-To: <1464157735-8865-8-git-send-email-bhe@redhat.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-HM-Spam-Status: e1koWUFPN1dZCBgUCR5ZQUpKVUNKTUJCQk9ITk9JT0NLTldZCQ4XHghZQV koKz0kNTQ1PiQyNSQzPjo*PilBS1VLQDYjJCI#KCQyNSQzPjo*PilBS1VLQCsvKSQiPigkMjUkMz 46Pz4pQUtVS0A4NC41LykiJDg1QUtVS0ApPjwyNDUkOigyOkFLVUtAKyk0LTI1OD4kKDM6NTwzOj JBS1VLQD8iNTo2MjgkMiskNTQkMjUkMz46Pz4pQUtVS0ApPjo3JDIrJDI1JCk5NyQyNSQzPjo*Pi lBSklVS0A2LjcvMiQpOCsvJD8yPT0#KT41LyQyNSQzPjo*PilBSVVLQDIrJEhLJDYyNS4vPiQ4NS 8kSyROS0FLVUtAMiskSiQ2MjUuLz4kODUvJEskSktBS1VLQDIrJC80PzoiJDg1LyRLJEpLS0FLVU tAMiskTiQ2MjUuLz4kODUvJEskSktBS1VLQDIrJEokMzQuKSQ4NS8kSyRKS0tBS1VLQCguOTE#OC 8kLzQ*OiIkODUvJEskSktLQUtVS0AoLjkxPjgvJE4kNjI1Li8#JDg1LyRLJEpLQUtVS0AoLjkxPj gvJEokMzQuKSQ4NS8kSyRKS0tBS1VLQCg5MSQ3PjUkT0skI0FLVUtLSktALz4jLyQ3PjUkSklDSy QjQUtVS0tKS0A4NS8kMy82NyQ3PjUkSjAkTjBBS1VLS0pLQCk#OD4yLT4pJDg1LyROJCNBS1VLS0 pLQCM2OjI3PikkNS43N0FLVUtLSktAPz43Mi0#KSQ3PjUkS0FLVUtLSktANzo1PCQ#NUFLVUtLSk tAPTUkNjoiJE9KQiQzNzEkSiRLQ0tIS09BS1VISEA9KyQpPiQ9LCQzNzEkS0NLSEtNQVZMVU5APT UkKC45JD41LDQpPygkMzcxJEpLS0lLSkFLVUlDQCguOSQ#QUpVTk5APTUkOTIvTCQzNzEkS0xKSU tJQUhVSk5APTUkNjoiJE9KQiQzNzEkSSRLQ0tIS09BS1VLWQY+ X-HM-Sender-Digest: e1kSHx4VD1lBWUc6NUk6Chw4Sjo4EUM1QwgqOCILT0kwFAFVSlVKT01P T09KQkpCSkpJVTMWGhIXVQ0MOxIUFhYOVRQJHEVZV1kMHhlZQR0aFwgeV1kIAVlBT0JMTDdXWRIL WUFZSUpDVUNJVUJOVUlPTVkG X-HM-Tid: 0a54f78a563a7d8bde46a1c1269 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org -------- Original Message -------- > From: Baoquan HE > > 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 > --- > drivers/iommu/amd_iommu_init.c | 47 +++++++++++++++++++++++++++++++++++++----- > 1 file changed, 42 insertions(+), 5 deletions(-) > > diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c > index 71c7ac9..66a1fa5 100644 > --- a/drivers/iommu/amd_iommu_init.c > +++ b/drivers/iommu/amd_iommu_init.c > @@ -35,7 +35,7 @@ > #include > #include > #include > - > +#include > #include "amd_iommu_proto.h" > #include "amd_iommu_types.h" > #include "irq_remapping.h" > @@ -675,7 +675,7 @@ static int copy_dev_tables(void) > static int copied; > > for_each_iommu(iommu) { > - if (!translation_pre_enabled()) { > + if (!translation_pre_enabled(iommu)) { > pr_err("IOMMU:%d is not pre-enabled!/n", iommu->index); > return -1; > } > @@ -1160,8 +1160,13 @@ static int __init init_iommu_one(struct amd_iommu *iommu, struct ivhd_header *h) > iommu->int_enabled = false; > > init_translation_status(iommu); > + if (translation_pre_enabled(iommu) && !is_kdump_kernel()) { > + clear_translation_pre_enabled(iommu); > + pr_warn("Translation was enabled for IOMMU:%d but we are not in kdump mode\n", > + iommu->index); > + } > > - if (translation_pre_enabled()) > + if (translation_pre_enabled(iommu)) > pr_warn("Translation is already enabled - trying to copy translation structures\n"); > > ret = init_iommu_from_acpi(iommu, h); > @@ -1730,9 +1735,41 @@ static void early_enable_iommu(struct amd_iommu *iommu) > static void early_enable_iommus(void) > { > struct amd_iommu *iommu; > + bool is_pre_enabled=false; > > - for_each_iommu(iommu) > - early_enable_iommu(iommu); > + for_each_iommu(iommu) { > + if ( translation_pre_enabled(iommu) ) { > + is_pre_enabled = true; > + break; > + } > + } I wonder if you consider multi-iommus condition for your those series patches? > + > + if ( !is_pre_enabled) { Why not use translation_pre_enabled(iommu) to judge pre-enable directly? > + for_each_iommu(iommu) > + early_enable_iommu(iommu); > + } else { > + if (copy_dev_tables()) { > + pr_err("Failed to copy translation tables from previous kernel.\n"); > + /* > + * If failed to copy dev tables from old kernel, continue to proceed > + * as it does in normal kernel. > + */ > + for_each_iommu(iommu) { > + clear_translation_pre_enabled(iommu); > + early_enable_iommu(iommu); > + } > + } else { > + pr_info("Copied translation tables from previous kernel.\n"); > + for_each_iommu(iommu) { > + 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); > + } > + } > + } > } > > static void enable_iommus_v2(void) >