From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752534AbcE1NIp (ORCPT ); Sat, 28 May 2016 09:08:45 -0400 Received: from mr213139.mail.yeah.net ([223.252.213.139]:57323 "EHLO mr213139.mail.yeah.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751106AbcE1NIn (ORCPT ); Sat, 28 May 2016 09:08:43 -0400 Subject: Re: [Patch v4 6/9] iommu/amd: Add function copy_dev_tables To: Baoquan He , joro@8bytes.org References: <1464157735-8865-1-git-send-email-bhe@redhat.com> <1464157735-8865-7-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: <80e8478c-3797-df49-3bf9-e3c5d6879c8b@iommu.org> Date: Sat, 28 May 2016 21:08:34 +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-7-git-send-email-bhe@redhat.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-HM-Spam-Status: e1koWUFPN1dZCBgUCR5ZQUpKVU5ITEtLS01OTUpJTEJIV1kJDhceCFlBWS grPSQ1NDU#JDI1JDM#Oj8#KUFLVUtANiMkIj4oJDI1JDM#Oj8#KUFLVUtAKy8pJCI#KCQyNSQzPj o*PilBS1VLQDg0LjUvKSIkODVBS1VLQCk#PDI0NSQ6KDI6QUtVS0ArKTQtMjU4PiQoMzo1PDM6Mk FLVUtAPyI1OjYyOCQyKyQ1NCQyNSQzPjo*PilBS1VLQCk#OjckMiskMjUkKTk3JDI1JDM#Oj8#KU FKSVVLQDYuNy8yJCk4Ky8kPzI9PT4pPjUvJDI1JDM#Oj8#KUFJVUtAMiskSEskNjI1Li8#JDg1Ly RLJE5LQUtVS0AyKyRKJDYyNS4vPiQ4NS8kSyRKS0FLVUtAMiskLzQ*OiIkODUvJEskSktLQUtVS0 AyKyROJDYyNS4vPiQ4NS8kSyRKS0FLVUtAMiskSiQzNC4pJDg1LyRLJEpLS0FLVUtAKC45MT44Ly QvND86IiQ4NS8kSyRKS0tBS1VLQCguOTE#OC8kTiQ2MjUuLz4kODUvJEskSktBS1VLQCguOTE#OC 8kSiQzNC4pJDg1LyRLJEpLS0FLVUtAKDkxJDc#NSRPSyQjQUtVS0tKS0AvPiMvJDc#NSRKSUNLJC NBS1VLS0pLQDg1LyQzLzY3JDc#NSRKMCROMEFLVUtLSktAKT44PjItPikkODUvJE4kI0FLVUtLSk tAIzY6Mjc#KSQ1Ljc3QUtVS0tKS0A*PjcyLT4pJDc#NSRLQUtVS0tKS0A3OjU8JD41QUtVS0tKS0 A9NSQ2OiIkT0pCJDM3MSRKJEtDS0hLT0FLVUhIQD0rJCk#JD0sJDM3MSRLQ0tIS01BVkxVTkAoLj kkPkFKVU5OQD01JDkyL0wkMzcxJEtMSklLSUFIVUpOQD01JDY6IiRPSkIkMzcxJEkkS0NLSEtPQU tVS1kG X-HM-Sender-Digest: e1kSHx4VD1lBWUc6ORQ6CTo5DTo1CUMtDgoYL04JSBMaFA1VSlVKT01P T09LQkpMSUxNVTMWGhIXVQ0MOxIUFhYOVRQJHEVZV1kMHhlZQR0aFwgeV1kIAVlBT0xLTDdXWRIL WUFZSUpDVUNJVUJOVUlPTVkG X-HM-Tid: 0a54f77b0c297d8bd83a01c1655 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org -------- Original Message -------- > Add function copy_dev_tables to copy old DTE of the 1st kernel to > the new DTE table. Since all iommu share the same DTE table the > copy only need be done once as long as the physical address of > old DTE table is retrieved from iommu reg. Besides the old domain > id occupied in 1st kernel need be reserved in order to avoid touch > the old translation tables. > > Signed-off-by: Baoquan He > --- > drivers/iommu/amd_iommu.c | 2 +- > drivers/iommu/amd_iommu_init.c | 38 ++++++++++++++++++++++++++++++++++++++ > drivers/iommu/amd_iommu_types.h | 1 + > 3 files changed, 40 insertions(+), 1 deletion(-) > > diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c > index 1c916cc..f3bd7fd 100644 > --- a/drivers/iommu/amd_iommu.c > +++ b/drivers/iommu/amd_iommu.c > @@ -2081,7 +2081,7 @@ static void set_dte_entry(u16 devid, struct protection_domain *domain, bool ats) > flags |= tmp; > } > > - flags &= ~(0xffffUL); > + flags &= ~DEV_DOMID_MASK; > flags |= domain->id; > > amd_iommu_dev_table[devid].data[1] = flags; > diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c > index 9c1aa54..71c7ac9 100644 > --- a/drivers/iommu/amd_iommu_init.c > +++ b/drivers/iommu/amd_iommu_init.c > @@ -664,6 +664,44 @@ static int get_dev_entry_bit(u16 devid, u8 bit) > } > > > +static int copy_dev_tables(void) > +{ > + u64 entry; > + u32 lo, hi, devid; > + phys_addr_t old_devtb_phys; > + struct dev_table_entry *old_devtb; > + u16 dom_id, dte_v; > + struct amd_iommu *iommu; > + static int copied; > + > + for_each_iommu(iommu) { > + if (!translation_pre_enabled()) { > + pr_err("IOMMU:%d is not pre-enabled!/n", iommu->index); > + return -1; > + } If one iommu is not pre-enabled, all iommus will be exit the copy. > + > + if (copied) > + continue; > + > + lo = readl(iommu->mmio_base + MMIO_DEV_TABLE_OFFSET); > + hi = readl(iommu->mmio_base + MMIO_DEV_TABLE_OFFSET + 4); > + entry = (((u64) hi) << 32) + lo; > + old_devtb_phys = entry & PAGE_MASK; > + old_devtb = memremap(old_devtb_phys, dev_table_size, MEMREMAP_WB); > + for (devid = 0; devid <= amd_iommu_last_bdf; ++devid) { > + amd_iommu_dev_table[devid] = old_devtb[devid]; > + dom_id = amd_iommu_dev_table[devid].data[1] & DEV_DOMID_MASK; > + dte_v = amd_iommu_dev_table[devid].data[0] & DTE_FLAG_V; > + if (!dte_v) > + continue; > + __set_bit(dom_id, amd_iommu_pd_alloc_bitmap); > + } > + memunmap(old_devtb); > + copied = 1; > + } > + return 0; > +} > + > void amd_iommu_apply_erratum_63(u16 devid) > { > int sysmgt; > diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h > index 7796edf..34acd73 100644 > --- a/drivers/iommu/amd_iommu_types.h > +++ b/drivers/iommu/amd_iommu_types.h > @@ -311,6 +311,7 @@ > #define DTE_FLAG_MASK (0x3ffULL << 32) > #define DTE_GLX_SHIFT (56) > #define DTE_GLX_MASK (3) > +#define DEV_DOMID_MASK 0xffffULL > > #define DTE_GCR3_VAL_A(x) (((x) >> 12) & 0x00007ULL) > #define DTE_GCR3_VAL_B(x) (((x) >> 15) & 0x0ffffULL) >