From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,UNWANTED_LANGUAGE_BODY, USER_AGENT_SANE_2 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7CC06C2D0DA for ; Wed, 25 Dec 2019 06:59:37 +0000 (UTC) Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 31D682072A for ; Wed, 25 Dec 2019 06:59:37 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="PsJeMTkX" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 31D682072A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=iommu-bounces@lists.linux-foundation.org Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id D34398457E; Wed, 25 Dec 2019 06:59:36 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id UpD4HS62Os6N; Wed, 25 Dec 2019 06:59:35 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by fraxinus.osuosl.org (Postfix) with ESMTP id 77D1480AE3; Wed, 25 Dec 2019 06:59:35 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 537FCC18DD; Wed, 25 Dec 2019 06:59:35 +0000 (UTC) Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) by lists.linuxfoundation.org (Postfix) with ESMTP id CB517C0881 for ; Wed, 25 Dec 2019 06:59:33 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id B9DE7844CD for ; Wed, 25 Dec 2019 06:59:33 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id sIshu6UYVDGr for ; Wed, 25 Dec 2019 06:59:32 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mailgw01.mediatek.com (unknown [210.61.82.183]) by whitealder.osuosl.org (Postfix) with ESMTP id A34C3810B2 for ; Wed, 25 Dec 2019 06:59:31 +0000 (UTC) X-UUID: 4a640fa9b08c4d2d91fbf6f0085d866f-20191225 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=Pg7AnzKAKzQJK/UPqk1ILEP4QA125SuECfkXqQGQ7mU=; b=PsJeMTkXvM2s2animk9dTA4gqWEbQZFIBkQKHx15xd2uOlO7X8TQqnFELShU487KoprmUW+r46bRbZjd1q9Locy6We+JuvtJxNHEtxh6jPWA70XK03VrIAaPc+lmLiE/I8E3V3n0B8yXTMxOYkc2J8vOTmDwtnQ2ofzWzag/ZaA=; X-UUID: 4a640fa9b08c4d2d91fbf6f0085d866f-20191225 Received: from mtkcas09.mediatek.inc [(172.21.101.178)] by mailgw01.mediatek.com (envelope-from ) (Cellopoint E-mail Firewall v4.1.10 Build 0809 with TLS) with ESMTP id 1338988706; Wed, 25 Dec 2019 14:59:26 +0800 Received: from mtkcas09.mediatek.inc (172.21.101.178) by mtkmbs07n1.mediatek.inc (172.21.101.16) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Wed, 25 Dec 2019 14:59:05 +0800 Received: from [10.15.20.246] (10.15.20.246) by mtkcas09.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Wed, 25 Dec 2019 14:59:38 +0800 Message-ID: <1577257111.1137.3.camel@mbjsdccf07> Subject: Re: [RESEND,PATCH 02/13] iommu/mediatek: Add mt6779 IOMMU basic support From: chao hao To: Yong Wu Date: Wed, 25 Dec 2019 14:58:31 +0800 In-Reply-To: <1576498063.28043.74.camel@mhfsdcap03> References: <20191104115238.2394-1-chao.hao@mediatek.com> <20191104115238.2394-3-chao.hao@mediatek.com> <1576498063.28043.74.camel@mhfsdcap03> X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-MTK: N Cc: Anan Sun , devicetree@vger.kernel.org, Cui Zhang , Jun Yan , wsd_upstream@mediatek.com, linux-kernel@vger.kernel.org, Chao Hao , iommu@lists.linux-foundation.org, Rob Herring , linux-mediatek@lists.infradead.org, Miles Chen , Matthias Brugger , linux-arm-kernel@lists.infradead.org, Guangming Cao X-BeenThere: iommu@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Development issues for Linux IOMMU support List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: iommu-bounces@lists.linux-foundation.org Sender: "iommu" On Mon, 2019-12-16 at 20:07 +0800, Yong Wu wrote: > On Mon, 2019-11-04 at 19:52 +0800, Chao Hao wrote: > > 1. Add mt6779 registers define for iommu. > > 2. Add mt6779_data define to support mt6779 iommu HW init. > > 3. There are two iommus, one is mm_iommu, the other is vpu_iommu. > > MM_IOMMU is connected smi_larb to support multimedia engine to > > access DRAM, and VPU_IOMMU is connected to APU_bus to support > > VPU,MDLA,EDMA to access DRAM. MM_IOMMU and VPU_IOMMU use the same > > page table to simplify design by "mtk_iommu_get_m4u_data". > > 4. For smi_larb6, it doesn't use mm_iommu, so we can distinguish > > vpu_iommu by it when excutes iommu_probe. > > 5. For mt6779 APU_IOMMU fault id is irregular, so it was treated > > specially. > > > > Signed-off-by: Chao Hao > > --- > > drivers/iommu/mtk_iommu.c | 91 +++++++++++++++++++++++++++++++++------ > > drivers/iommu/mtk_iommu.h | 10 ++++- > > 2 files changed, 87 insertions(+), 14 deletions(-) > > > > diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c > > index 8ca2e99964fe..f2847e661137 100644 > > --- a/drivers/iommu/mtk_iommu.c > > +++ b/drivers/iommu/mtk_iommu.c > > @@ -38,12 +38,24 @@ > > #define REG_MMU_INVLD_END_A 0x028 > > > > #define REG_MMU_INV_SEL 0x038 > > +#define REG_MMU_INV_SEL_MT6779 0x02c > > #define F_INVLD_EN0 BIT(0) > > #define F_INVLD_EN1 BIT(1) > > > > #define REG_MMU_STANDARD_AXI_MODE 0x048 > > + > > +#define REG_MMU_MISC_CRTL_MT6779 0x048 > > Defining two register in the same offset look strange. see below. > > > +#define REG_MMU_STANDARD_AXI_MODE_MT6779 (BIT(3) | BIT(19)) > > +#define REG_MMU_COHERENCE_EN (BIT(0) | BIT(16)) > > +#define REG_MMU_IN_ORDER_WR_EN (BIT(1) | BIT(17)) > > +#define F_MMU_HALF_ENTRY_MODE_L (BIT(5) | BIT(21)) > > +#define F_MMU_BLOCKING_MODE_L (BIT(4) | BIT(20)) > > The last four ones are not used. Please remove. > > > + > > #define REG_MMU_DCM_DIS 0x050 > > > > +#define REG_MMU_WR_LEN 0x054 > > +#define F_MMU_WR_THROT_DIS (BIT(5) | BIT(21)) > > + > > #define REG_MMU_CTRL_REG 0x110 > > #define F_MMU_TF_PROT_TO_PROGRAM_ADDR (2 << 4) > > #define F_MMU_PREFETCH_RT_REPLACE_MOD BIT(4) > > @@ -88,10 +100,14 @@ > > #define REG_MMU1_INVLD_PA 0x148 > > #define REG_MMU0_INT_ID 0x150 > > #define REG_MMU1_INT_ID 0x154 > > +#define F_MMU_INT_ID_COMM_ID(a) (((a) >> 9) & 0x7) > > +#define F_MMU_INT_ID_SUB_COMM_ID(a) (((a) >> 7) & 0x3) > > #define F_MMU_INT_ID_LARB_ID(a) (((a) >> 7) & 0x7) > > #define F_MMU_INT_ID_PORT_ID(a) (((a) >> 2) & 0x1f) > > +#define F_MMU_INT_ID_COMM_APU_ID(a) ((a) & 0x3) > > +#define F_MMU_INT_ID_SUB_APU_ID(a) (((a) >> 2) & 0x3) > > > > -#define MTK_PROTECT_PA_ALIGN 128 > > +#define MTK_PROTECT_PA_ALIGN 256 > > > > /* > > * Get the local arbiter ID and the portid within the larb arbiter > > @@ -165,7 +181,7 @@ static void mtk_iommu_tlb_flush_all(void *cookie) > > > > for_each_m4u(data) { > > writel_relaxed(F_INVLD_EN1 | F_INVLD_EN0, > > - data->base + REG_MMU_INV_SEL); > > + data->base + data->plat_data->inv_sel_reg); > > writel_relaxed(F_ALL_INVLD, data->base + REG_MMU_INVALIDATE); > > wmb(); /* Make sure the tlb flush all done */ > > } > > @@ -182,7 +198,7 @@ static void mtk_iommu_tlb_flush_range_sync(unsigned long iova, size_t size, > > for_each_m4u(data) { > > spin_lock_irqsave(&data->tlb_lock, flags); > > writel_relaxed(F_INVLD_EN1 | F_INVLD_EN0, > > - data->base + REG_MMU_INV_SEL); > > + data->base + data->plat_data->inv_sel_reg); > > > > writel_relaxed(iova, data->base + REG_MMU_INVLD_START_A); > > writel_relaxed(iova + size - 1, > > @@ -226,7 +242,7 @@ static irqreturn_t mtk_iommu_isr(int irq, void *dev_id) > > struct mtk_iommu_data *data = dev_id; > > struct mtk_iommu_domain *dom = data->m4u_dom; > > u32 int_state, regval, fault_iova, fault_pa; > > - unsigned int fault_larb, fault_port; > > + unsigned int fault_larb, fault_port, sub_comm = 0; > > bool layer, write; > > > > /* Read error info from registers */ > > @@ -242,17 +258,30 @@ static irqreturn_t mtk_iommu_isr(int irq, void *dev_id) > > } > > layer = fault_iova & F_MMU_FAULT_VA_LAYER_BIT; > > write = fault_iova & F_MMU_FAULT_VA_WRITE_BIT; > > - fault_larb = F_MMU_INT_ID_LARB_ID(regval); > > fault_port = F_MMU_INT_ID_PORT_ID(regval); > > + if (data->plat_data->has_sub_comm[data->m4u_id]) { > > + /* m4u1 is VPU in mt6779.*/ > > + if (data->m4u_id && data->plat_data->m4u_plat == M4U_MT6779) { > > + fault_larb = F_MMU_INT_ID_COMM_APU_ID(regval); > > + sub_comm = F_MMU_INT_ID_SUB_APU_ID(regval); > > + fault_port = 0; /* for mt6779 APU ID is irregular */ > > + } else { > > + fault_larb = F_MMU_INT_ID_COMM_ID(regval); > > + sub_comm = F_MMU_INT_ID_SUB_COMM_ID(regval); > > + } > > + } else { > > + fault_larb = F_MMU_INT_ID_LARB_ID(regval); > > + } > > > > - fault_larb = data->plat_data->larbid_remap[fault_larb]; > > + fault_larb = data->plat_data->larbid_remap[data->m4u_id][fault_larb]; > > > > if (report_iommu_fault(&dom->domain, data->dev, fault_iova, > > write ? IOMMU_FAULT_WRITE : IOMMU_FAULT_READ)) { > > dev_err_ratelimited( > > data->dev, > > - "fault type=0x%x iova=0x%x pa=0x%x larb=%d port=%d layer=%d %s\n", > > - int_state, fault_iova, fault_pa, fault_larb, fault_port, > > + "fault type=0x%x iova=0x%x pa=0x%x larb=%d sub_comm=%d port=%d regval=0x%x layer=%d %s\n", > > + int_state, fault_iova, fault_pa, fault_larb, > > + sub_comm, fault_port, regval, > > layer, write ? "write" : "read"); > > } > > > > @@ -545,11 +574,12 @@ static int mtk_iommu_hw_init(const struct mtk_iommu_data *data) > > return ret; > > } > > > > + regval = readl_relaxed(data->base + REG_MMU_CTRL_REG); > > if (data->plat_data->m4u_plat == M4U_MT8173) > > - regval = F_MMU_PREFETCH_RT_REPLACE_MOD | > > + regval |= F_MMU_PREFETCH_RT_REPLACE_MOD | > > F_MMU_TF_PROT_TO_PROGRAM_ADDR_MT8173; > > else > > - regval = F_MMU_TF_PROT_TO_PROGRAM_ADDR; > > + regval |= F_MMU_TF_PROT_TO_PROGRAM_ADDR; > > writel_relaxed(regval, data->base + REG_MMU_CTRL_REG); > > > > regval = F_L2_MULIT_HIT_EN | > > @@ -589,6 +619,20 @@ static int mtk_iommu_hw_init(const struct mtk_iommu_data *data) > > if (data->plat_data->reset_axi) > > writel_relaxed(0, data->base + REG_MMU_STANDARD_AXI_MODE); > > > > + if (data->plat_data->has_wr_len) { > > + /* write command throttling mode */ > > + regval = readl_relaxed(data->base + REG_MMU_WR_LEN); > > + regval &= ~F_MMU_WR_THROT_DIS; > > + writel_relaxed(regval, data->base + REG_MMU_WR_LEN); > > + } > > + /* special settings for mmu0 (multimedia iommu) */ > > + if (data->plat_data->has_misc_ctrl[data->m4u_id]) { > > + regval = readl_relaxed(data->base + REG_MMU_MISC_CRTL_MT6779); > > + /* non-standard AXI mode */ > > + regval &= ~REG_MMU_STANDARD_AXI_MODE_MT6779; > > + writel_relaxed(regval, data->base + REG_MMU_MISC_CRTL_MT6779); > > + } > > 0x48 are REG_MMU_STANDARD_AXI_MODE in both mt8173 and mt8183, while > it is REG_MMU_MISC_CRTL in mt2712, mt6779 and the latest soc, right? I > think we can use one defining, like this: > > #define REG_MMU_MISC_CTRL 0x48 > > if (!data->plat_data->has_misc_ctrl[data->m4u_id]) { > /* Disable standard axi mode while it is > REG_MMU_STANDARD_AXI_MODE */ > writel_relaxed(0, data->base + REG_MMU_MISC_CTRL); > } else if (data->m4u_id == 0) { > regval = readl_relaxed(data->base + REG_MMU_MISC_CTRL); > regval &= ~REG_MMU_STANDARD_AXI_MODE_MT6779; > writel_relaxed(regval, data->base + REG_MMU_MISC_CTRL); > } > > Meanwhile remove the setting for REG_MMU_STANDARD_AXI_MODE above. > > > + > > if (devm_request_irq(data->dev, data->irq, mtk_iommu_isr, 0, > > dev_name(data->dev), (void *)data)) { > > writel_relaxed(0, data->base + REG_MMU_PT_BASE_ADDR); > > @@ -678,6 +722,9 @@ static int mtk_iommu_probe(struct platform_device *pdev) > > } > > data->larb_imu[id].dev = &plarbdev->dev; > > > > + if (data->plat_data->m4u1_mask == (1 << id)) > > + data->m4u_id = 1; > > + > > component_match_add_release(dev, &match, release_of, > > compare_of, larbnode); > > } > > @@ -731,6 +778,7 @@ static int __maybe_unused mtk_iommu_suspend(struct device *dev) > > struct mtk_iommu_suspend_reg *reg = &data->reg; > > void __iomem *base = data->base; > > > > + reg->wr_len = readl_relaxed(base + REG_MMU_WR_LEN); > > reg->standard_axi_mode = readl_relaxed(base + > > REG_MMU_STANDARD_AXI_MODE); > > reg->dcm_dis = readl_relaxed(base + REG_MMU_DCM_DIS); > > @@ -756,6 +804,7 @@ static int __maybe_unused mtk_iommu_resume(struct device *dev) > > dev_err(data->dev, "Failed to enable clk(%d) in resume\n", ret); > > return ret; > > } > > + writel_relaxed(reg->wr_len, base + REG_MMU_WR_LEN); > > writel_relaxed(reg->standard_axi_mode, > > base + REG_MMU_STANDARD_AXI_MODE); > > writel_relaxed(reg->dcm_dis, base + REG_MMU_DCM_DIS); > > @@ -779,7 +828,20 @@ static const struct mtk_iommu_plat_data mt2712_data = { > > .has_4gb_mode = true, > > .has_bclk = true, > > .has_vld_pa_rng = true, > > - .larbid_remap = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, > > + .larbid_remap[0] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, > > + .inv_sel_reg = REG_MMU_INV_SEL, > > +}; > > + > > +static const struct mtk_iommu_plat_data mt6779_data = { > > + .m4u_plat = M4U_MT6779, > > + .larbid_remap[0] = {0, 1, 2, 3, 5, 7, 10, 9}, > > + /* vp6a, vp6b, mdla/core2, mdla/edmc*/ > > + .larbid_remap[1] = {2, 0, 3, 1}, > > + .has_sub_comm = {true, true}, > > + .has_wr_len = true, > > + .has_misc_ctrl = {true, false}, > > + .inv_sel_reg = REG_MMU_INV_SEL_MT6779, > > + .m4u1_mask = BIT(6), > > }; > > > > static const struct mtk_iommu_plat_data mt8173_data = { > > @@ -787,17 +849,20 @@ static const struct mtk_iommu_plat_data mt8173_data = { > > .has_4gb_mode = true, > > .has_bclk = true, > > .reset_axi = true, > > - .larbid_remap = {0, 1, 2, 3, 4, 5}, /* Linear mapping. */ > > + .larbid_remap[0] = {0, 1, 2, 3, 4, 5}, /* Linear mapping. */ > > + .inv_sel_reg = REG_MMU_INV_SEL, > > }; > > > > static const struct mtk_iommu_plat_data mt8183_data = { > > .m4u_plat = M4U_MT8183, > > .reset_axi = true, > > - .larbid_remap = {0, 4, 5, 6, 7, 2, 3, 1}, > > + .larbid_remap[0] = {0, 4, 5, 6, 7, 2, 3, 1}, > > + .inv_sel_reg = REG_MMU_INV_SEL, > > }; > > > > static const struct of_device_id mtk_iommu_of_ids[] = { > > { .compatible = "mediatek,mt2712-m4u", .data = &mt2712_data}, > > + { .compatible = "mediatek,mt6779-m4u", .data = &mt6779_data}, > > { .compatible = "mediatek,mt8173-m4u", .data = &mt8173_data}, > > { .compatible = "mediatek,mt8183-m4u", .data = &mt8183_data}, > > {} > > diff --git a/drivers/iommu/mtk_iommu.h b/drivers/iommu/mtk_iommu.h > > index ea949a324e33..132dc765a40b 100644 > > --- a/drivers/iommu/mtk_iommu.h > > +++ b/drivers/iommu/mtk_iommu.h > > @@ -25,11 +25,13 @@ struct mtk_iommu_suspend_reg { > > u32 int_main_control; > > u32 ivrp_paddr; > > u32 vld_pa_rng; > > + u32 wr_len; > > }; > > > > enum mtk_iommu_plat { > > M4U_MT2701, > > M4U_MT2712, > > + M4U_MT6779, > > M4U_MT8173, > > M4U_MT8183, > > }; > > @@ -42,7 +44,12 @@ struct mtk_iommu_plat_data { > > bool has_bclk; > > bool has_vld_pa_rng; > > bool reset_axi; > > - unsigned char larbid_remap[MTK_LARB_NR_MAX]; > > + bool has_sub_comm[2]; > > + bool has_wr_len; > > + bool has_misc_ctrl[2]; > > + u32 inv_sel_reg; > > + u32 m4u1_mask; > > alphabetically for the new ones. > > > + unsigned char larbid_remap[2][MTK_LARB_NR_MAX]; > > }; > > > > struct mtk_iommu_domain; > > @@ -59,6 +66,7 @@ struct mtk_iommu_data { > > bool enable_4GB; > > spinlock_t tlb_lock; /* lock for tlb range flush */ > > > > + u32 m4u_id; > > struct iommu_device iommu; > > const struct mtk_iommu_plat_data *plat_data; > > Basically this patch looks ok for me. But please split it to several > patches: > > 1) Extend larbid_remap to larbid_remap[2]. > Actually mt2712 also need this. this is the mt2712 definition. > larbid_remap[0] = {0, 1, 2, 3}, > larbid_remap[1] = {4, 5, 7, 8, 9}, > > 2) Regarding the 0x48(misc_ctrl register) > > 3) Add m4u1_mask to distinguish the m4u_id. > > 4) Add REG_MMU_WR_LEN if you need. > > 5) Put inv_sel_reg in the plat_data for preparing add 0x2c support in > mt6779. > > 6) Add new flow to get SUB_COMMON ID and VPU larbid in the translation > fault. > > 7) Add mt6779 support. > > > ok, I will modify them for your above comments in next version, thanks > > > _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.5 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,UNWANTED_LANGUAGE_BODY, USER_AGENT_SANE_2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8ECB7C2D0DA for ; Wed, 25 Dec 2019 07:00:12 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 5569C2071E for ; Wed, 25 Dec 2019 07:00:12 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="hlwyTzo7"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="PZGt0tp1" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5569C2071E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=4AIp9MrfG5TQs4Bjdm37vEu5FniAz0Q7EnLSE7Qauzc=; b=hlwyTzo7JDj4Dx Ow2+b9B1aDiHJ/qu2e3Wm8ODhi1H8C5kD00393Sm/8AFrUV18RvzyomKV6J1gwfxn/toZR94vTvEO YcjZu3JOLQTCinCiN9Gokqw2Rk+pHqWGeHHzuh8aMZqe7PK3ejg2/ewSY1QL7N3wrlOrj89XE1yUN zLMdqKA0nkUGpmf7xr4/EAK7VnLe2VsQhmnvtDtYOueCBjYLjYO8daEfUQN/t6cWadKT2z4zV+MkV Qzi9mkemNyUhNyMCvFayo1DJknCQWWi4n8vkCmFvi5UzPs+0cKPKGkfpVZQlKPwkRdpDYSjRFlm3q km8pHJWRt4IjT69qq9OA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1ik0eA-0004en-VS; Wed, 25 Dec 2019 06:59:54 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1ik0dx-0004Wj-Ez; Wed, 25 Dec 2019 06:59:45 +0000 X-UUID: a2b24dd88946420195cfdef5b115104d-20191224 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=Pg7AnzKAKzQJK/UPqk1ILEP4QA125SuECfkXqQGQ7mU=; b=PZGt0tp1/yfRTArez7fqOs5j9ALvgI6wszorxLX/A1xjK3Jprsjq+lvkSXH1hUunLM0QJqmZDFEkbVyb36DPN7fNqCi3bmypV6X250KP73dTb9e+sxh+iY5AhHlqwD+Rh8JkO4521HgKeiyfKh/9tzpviWnHowQHeyFnZdlj2ZI=; X-UUID: a2b24dd88946420195cfdef5b115104d-20191224 Received: from mtkcas67.mediatek.inc [(172.29.193.45)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 1502889578; Tue, 24 Dec 2019 22:59:28 -0800 Received: from mtkmbs07n1.mediatek.inc (172.21.101.16) by MTKMBS62DR.mediatek.inc (172.29.94.18) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Tue, 24 Dec 2019 22:59:50 -0800 Received: from mtkcas09.mediatek.inc (172.21.101.178) by mtkmbs07n1.mediatek.inc (172.21.101.16) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Wed, 25 Dec 2019 14:59:05 +0800 Received: from [10.15.20.246] (10.15.20.246) by mtkcas09.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Wed, 25 Dec 2019 14:59:38 +0800 Message-ID: <1577257111.1137.3.camel@mbjsdccf07> Subject: Re: [RESEND,PATCH 02/13] iommu/mediatek: Add mt6779 IOMMU basic support From: chao hao To: Yong Wu Date: Wed, 25 Dec 2019 14:58:31 +0800 In-Reply-To: <1576498063.28043.74.camel@mhfsdcap03> References: <20191104115238.2394-1-chao.hao@mediatek.com> <20191104115238.2394-3-chao.hao@mediatek.com> <1576498063.28043.74.camel@mhfsdcap03> X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20191224_225941_517142_30CE82AF X-CRM114-Status: GOOD ( 25.24 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Anan Sun , devicetree@vger.kernel.org, Cui Zhang , Jun Yan , wsd_upstream@mediatek.com, Joerg Roedel , linux-kernel@vger.kernel.org, Chao Hao , iommu@lists.linux-foundation.org, Rob Herring , linux-mediatek@lists.infradead.org, Miles Chen , Matthias Brugger , linux-arm-kernel@lists.infradead.org, Guangming Cao Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org On Mon, 2019-12-16 at 20:07 +0800, Yong Wu wrote: > On Mon, 2019-11-04 at 19:52 +0800, Chao Hao wrote: > > 1. Add mt6779 registers define for iommu. > > 2. Add mt6779_data define to support mt6779 iommu HW init. > > 3. There are two iommus, one is mm_iommu, the other is vpu_iommu. > > MM_IOMMU is connected smi_larb to support multimedia engine to > > access DRAM, and VPU_IOMMU is connected to APU_bus to support > > VPU,MDLA,EDMA to access DRAM. MM_IOMMU and VPU_IOMMU use the same > > page table to simplify design by "mtk_iommu_get_m4u_data". > > 4. For smi_larb6, it doesn't use mm_iommu, so we can distinguish > > vpu_iommu by it when excutes iommu_probe. > > 5. For mt6779 APU_IOMMU fault id is irregular, so it was treated > > specially. > > > > Signed-off-by: Chao Hao > > --- > > drivers/iommu/mtk_iommu.c | 91 +++++++++++++++++++++++++++++++++------ > > drivers/iommu/mtk_iommu.h | 10 ++++- > > 2 files changed, 87 insertions(+), 14 deletions(-) > > > > diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c > > index 8ca2e99964fe..f2847e661137 100644 > > --- a/drivers/iommu/mtk_iommu.c > > +++ b/drivers/iommu/mtk_iommu.c > > @@ -38,12 +38,24 @@ > > #define REG_MMU_INVLD_END_A 0x028 > > > > #define REG_MMU_INV_SEL 0x038 > > +#define REG_MMU_INV_SEL_MT6779 0x02c > > #define F_INVLD_EN0 BIT(0) > > #define F_INVLD_EN1 BIT(1) > > > > #define REG_MMU_STANDARD_AXI_MODE 0x048 > > + > > +#define REG_MMU_MISC_CRTL_MT6779 0x048 > > Defining two register in the same offset look strange. see below. > > > +#define REG_MMU_STANDARD_AXI_MODE_MT6779 (BIT(3) | BIT(19)) > > +#define REG_MMU_COHERENCE_EN (BIT(0) | BIT(16)) > > +#define REG_MMU_IN_ORDER_WR_EN (BIT(1) | BIT(17)) > > +#define F_MMU_HALF_ENTRY_MODE_L (BIT(5) | BIT(21)) > > +#define F_MMU_BLOCKING_MODE_L (BIT(4) | BIT(20)) > > The last four ones are not used. Please remove. > > > + > > #define REG_MMU_DCM_DIS 0x050 > > > > +#define REG_MMU_WR_LEN 0x054 > > +#define F_MMU_WR_THROT_DIS (BIT(5) | BIT(21)) > > + > > #define REG_MMU_CTRL_REG 0x110 > > #define F_MMU_TF_PROT_TO_PROGRAM_ADDR (2 << 4) > > #define F_MMU_PREFETCH_RT_REPLACE_MOD BIT(4) > > @@ -88,10 +100,14 @@ > > #define REG_MMU1_INVLD_PA 0x148 > > #define REG_MMU0_INT_ID 0x150 > > #define REG_MMU1_INT_ID 0x154 > > +#define F_MMU_INT_ID_COMM_ID(a) (((a) >> 9) & 0x7) > > +#define F_MMU_INT_ID_SUB_COMM_ID(a) (((a) >> 7) & 0x3) > > #define F_MMU_INT_ID_LARB_ID(a) (((a) >> 7) & 0x7) > > #define F_MMU_INT_ID_PORT_ID(a) (((a) >> 2) & 0x1f) > > +#define F_MMU_INT_ID_COMM_APU_ID(a) ((a) & 0x3) > > +#define F_MMU_INT_ID_SUB_APU_ID(a) (((a) >> 2) & 0x3) > > > > -#define MTK_PROTECT_PA_ALIGN 128 > > +#define MTK_PROTECT_PA_ALIGN 256 > > > > /* > > * Get the local arbiter ID and the portid within the larb arbiter > > @@ -165,7 +181,7 @@ static void mtk_iommu_tlb_flush_all(void *cookie) > > > > for_each_m4u(data) { > > writel_relaxed(F_INVLD_EN1 | F_INVLD_EN0, > > - data->base + REG_MMU_INV_SEL); > > + data->base + data->plat_data->inv_sel_reg); > > writel_relaxed(F_ALL_INVLD, data->base + REG_MMU_INVALIDATE); > > wmb(); /* Make sure the tlb flush all done */ > > } > > @@ -182,7 +198,7 @@ static void mtk_iommu_tlb_flush_range_sync(unsigned long iova, size_t size, > > for_each_m4u(data) { > > spin_lock_irqsave(&data->tlb_lock, flags); > > writel_relaxed(F_INVLD_EN1 | F_INVLD_EN0, > > - data->base + REG_MMU_INV_SEL); > > + data->base + data->plat_data->inv_sel_reg); > > > > writel_relaxed(iova, data->base + REG_MMU_INVLD_START_A); > > writel_relaxed(iova + size - 1, > > @@ -226,7 +242,7 @@ static irqreturn_t mtk_iommu_isr(int irq, void *dev_id) > > struct mtk_iommu_data *data = dev_id; > > struct mtk_iommu_domain *dom = data->m4u_dom; > > u32 int_state, regval, fault_iova, fault_pa; > > - unsigned int fault_larb, fault_port; > > + unsigned int fault_larb, fault_port, sub_comm = 0; > > bool layer, write; > > > > /* Read error info from registers */ > > @@ -242,17 +258,30 @@ static irqreturn_t mtk_iommu_isr(int irq, void *dev_id) > > } > > layer = fault_iova & F_MMU_FAULT_VA_LAYER_BIT; > > write = fault_iova & F_MMU_FAULT_VA_WRITE_BIT; > > - fault_larb = F_MMU_INT_ID_LARB_ID(regval); > > fault_port = F_MMU_INT_ID_PORT_ID(regval); > > + if (data->plat_data->has_sub_comm[data->m4u_id]) { > > + /* m4u1 is VPU in mt6779.*/ > > + if (data->m4u_id && data->plat_data->m4u_plat == M4U_MT6779) { > > + fault_larb = F_MMU_INT_ID_COMM_APU_ID(regval); > > + sub_comm = F_MMU_INT_ID_SUB_APU_ID(regval); > > + fault_port = 0; /* for mt6779 APU ID is irregular */ > > + } else { > > + fault_larb = F_MMU_INT_ID_COMM_ID(regval); > > + sub_comm = F_MMU_INT_ID_SUB_COMM_ID(regval); > > + } > > + } else { > > + fault_larb = F_MMU_INT_ID_LARB_ID(regval); > > + } > > > > - fault_larb = data->plat_data->larbid_remap[fault_larb]; > > + fault_larb = data->plat_data->larbid_remap[data->m4u_id][fault_larb]; > > > > if (report_iommu_fault(&dom->domain, data->dev, fault_iova, > > write ? IOMMU_FAULT_WRITE : IOMMU_FAULT_READ)) { > > dev_err_ratelimited( > > data->dev, > > - "fault type=0x%x iova=0x%x pa=0x%x larb=%d port=%d layer=%d %s\n", > > - int_state, fault_iova, fault_pa, fault_larb, fault_port, > > + "fault type=0x%x iova=0x%x pa=0x%x larb=%d sub_comm=%d port=%d regval=0x%x layer=%d %s\n", > > + int_state, fault_iova, fault_pa, fault_larb, > > + sub_comm, fault_port, regval, > > layer, write ? "write" : "read"); > > } > > > > @@ -545,11 +574,12 @@ static int mtk_iommu_hw_init(const struct mtk_iommu_data *data) > > return ret; > > } > > > > + regval = readl_relaxed(data->base + REG_MMU_CTRL_REG); > > if (data->plat_data->m4u_plat == M4U_MT8173) > > - regval = F_MMU_PREFETCH_RT_REPLACE_MOD | > > + regval |= F_MMU_PREFETCH_RT_REPLACE_MOD | > > F_MMU_TF_PROT_TO_PROGRAM_ADDR_MT8173; > > else > > - regval = F_MMU_TF_PROT_TO_PROGRAM_ADDR; > > + regval |= F_MMU_TF_PROT_TO_PROGRAM_ADDR; > > writel_relaxed(regval, data->base + REG_MMU_CTRL_REG); > > > > regval = F_L2_MULIT_HIT_EN | > > @@ -589,6 +619,20 @@ static int mtk_iommu_hw_init(const struct mtk_iommu_data *data) > > if (data->plat_data->reset_axi) > > writel_relaxed(0, data->base + REG_MMU_STANDARD_AXI_MODE); > > > > + if (data->plat_data->has_wr_len) { > > + /* write command throttling mode */ > > + regval = readl_relaxed(data->base + REG_MMU_WR_LEN); > > + regval &= ~F_MMU_WR_THROT_DIS; > > + writel_relaxed(regval, data->base + REG_MMU_WR_LEN); > > + } > > + /* special settings for mmu0 (multimedia iommu) */ > > + if (data->plat_data->has_misc_ctrl[data->m4u_id]) { > > + regval = readl_relaxed(data->base + REG_MMU_MISC_CRTL_MT6779); > > + /* non-standard AXI mode */ > > + regval &= ~REG_MMU_STANDARD_AXI_MODE_MT6779; > > + writel_relaxed(regval, data->base + REG_MMU_MISC_CRTL_MT6779); > > + } > > 0x48 are REG_MMU_STANDARD_AXI_MODE in both mt8173 and mt8183, while > it is REG_MMU_MISC_CRTL in mt2712, mt6779 and the latest soc, right? I > think we can use one defining, like this: > > #define REG_MMU_MISC_CTRL 0x48 > > if (!data->plat_data->has_misc_ctrl[data->m4u_id]) { > /* Disable standard axi mode while it is > REG_MMU_STANDARD_AXI_MODE */ > writel_relaxed(0, data->base + REG_MMU_MISC_CTRL); > } else if (data->m4u_id == 0) { > regval = readl_relaxed(data->base + REG_MMU_MISC_CTRL); > regval &= ~REG_MMU_STANDARD_AXI_MODE_MT6779; > writel_relaxed(regval, data->base + REG_MMU_MISC_CTRL); > } > > Meanwhile remove the setting for REG_MMU_STANDARD_AXI_MODE above. > > > + > > if (devm_request_irq(data->dev, data->irq, mtk_iommu_isr, 0, > > dev_name(data->dev), (void *)data)) { > > writel_relaxed(0, data->base + REG_MMU_PT_BASE_ADDR); > > @@ -678,6 +722,9 @@ static int mtk_iommu_probe(struct platform_device *pdev) > > } > > data->larb_imu[id].dev = &plarbdev->dev; > > > > + if (data->plat_data->m4u1_mask == (1 << id)) > > + data->m4u_id = 1; > > + > > component_match_add_release(dev, &match, release_of, > > compare_of, larbnode); > > } > > @@ -731,6 +778,7 @@ static int __maybe_unused mtk_iommu_suspend(struct device *dev) > > struct mtk_iommu_suspend_reg *reg = &data->reg; > > void __iomem *base = data->base; > > > > + reg->wr_len = readl_relaxed(base + REG_MMU_WR_LEN); > > reg->standard_axi_mode = readl_relaxed(base + > > REG_MMU_STANDARD_AXI_MODE); > > reg->dcm_dis = readl_relaxed(base + REG_MMU_DCM_DIS); > > @@ -756,6 +804,7 @@ static int __maybe_unused mtk_iommu_resume(struct device *dev) > > dev_err(data->dev, "Failed to enable clk(%d) in resume\n", ret); > > return ret; > > } > > + writel_relaxed(reg->wr_len, base + REG_MMU_WR_LEN); > > writel_relaxed(reg->standard_axi_mode, > > base + REG_MMU_STANDARD_AXI_MODE); > > writel_relaxed(reg->dcm_dis, base + REG_MMU_DCM_DIS); > > @@ -779,7 +828,20 @@ static const struct mtk_iommu_plat_data mt2712_data = { > > .has_4gb_mode = true, > > .has_bclk = true, > > .has_vld_pa_rng = true, > > - .larbid_remap = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, > > + .larbid_remap[0] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, > > + .inv_sel_reg = REG_MMU_INV_SEL, > > +}; > > + > > +static const struct mtk_iommu_plat_data mt6779_data = { > > + .m4u_plat = M4U_MT6779, > > + .larbid_remap[0] = {0, 1, 2, 3, 5, 7, 10, 9}, > > + /* vp6a, vp6b, mdla/core2, mdla/edmc*/ > > + .larbid_remap[1] = {2, 0, 3, 1}, > > + .has_sub_comm = {true, true}, > > + .has_wr_len = true, > > + .has_misc_ctrl = {true, false}, > > + .inv_sel_reg = REG_MMU_INV_SEL_MT6779, > > + .m4u1_mask = BIT(6), > > }; > > > > static const struct mtk_iommu_plat_data mt8173_data = { > > @@ -787,17 +849,20 @@ static const struct mtk_iommu_plat_data mt8173_data = { > > .has_4gb_mode = true, > > .has_bclk = true, > > .reset_axi = true, > > - .larbid_remap = {0, 1, 2, 3, 4, 5}, /* Linear mapping. */ > > + .larbid_remap[0] = {0, 1, 2, 3, 4, 5}, /* Linear mapping. */ > > + .inv_sel_reg = REG_MMU_INV_SEL, > > }; > > > > static const struct mtk_iommu_plat_data mt8183_data = { > > .m4u_plat = M4U_MT8183, > > .reset_axi = true, > > - .larbid_remap = {0, 4, 5, 6, 7, 2, 3, 1}, > > + .larbid_remap[0] = {0, 4, 5, 6, 7, 2, 3, 1}, > > + .inv_sel_reg = REG_MMU_INV_SEL, > > }; > > > > static const struct of_device_id mtk_iommu_of_ids[] = { > > { .compatible = "mediatek,mt2712-m4u", .data = &mt2712_data}, > > + { .compatible = "mediatek,mt6779-m4u", .data = &mt6779_data}, > > { .compatible = "mediatek,mt8173-m4u", .data = &mt8173_data}, > > { .compatible = "mediatek,mt8183-m4u", .data = &mt8183_data}, > > {} > > diff --git a/drivers/iommu/mtk_iommu.h b/drivers/iommu/mtk_iommu.h > > index ea949a324e33..132dc765a40b 100644 > > --- a/drivers/iommu/mtk_iommu.h > > +++ b/drivers/iommu/mtk_iommu.h > > @@ -25,11 +25,13 @@ struct mtk_iommu_suspend_reg { > > u32 int_main_control; > > u32 ivrp_paddr; > > u32 vld_pa_rng; > > + u32 wr_len; > > }; > > > > enum mtk_iommu_plat { > > M4U_MT2701, > > M4U_MT2712, > > + M4U_MT6779, > > M4U_MT8173, > > M4U_MT8183, > > }; > > @@ -42,7 +44,12 @@ struct mtk_iommu_plat_data { > > bool has_bclk; > > bool has_vld_pa_rng; > > bool reset_axi; > > - unsigned char larbid_remap[MTK_LARB_NR_MAX]; > > + bool has_sub_comm[2]; > > + bool has_wr_len; > > + bool has_misc_ctrl[2]; > > + u32 inv_sel_reg; > > + u32 m4u1_mask; > > alphabetically for the new ones. > > > + unsigned char larbid_remap[2][MTK_LARB_NR_MAX]; > > }; > > > > struct mtk_iommu_domain; > > @@ -59,6 +66,7 @@ struct mtk_iommu_data { > > bool enable_4GB; > > spinlock_t tlb_lock; /* lock for tlb range flush */ > > > > + u32 m4u_id; > > struct iommu_device iommu; > > const struct mtk_iommu_plat_data *plat_data; > > Basically this patch looks ok for me. But please split it to several > patches: > > 1) Extend larbid_remap to larbid_remap[2]. > Actually mt2712 also need this. this is the mt2712 definition. > larbid_remap[0] = {0, 1, 2, 3}, > larbid_remap[1] = {4, 5, 7, 8, 9}, > > 2) Regarding the 0x48(misc_ctrl register) > > 3) Add m4u1_mask to distinguish the m4u_id. > > 4) Add REG_MMU_WR_LEN if you need. > > 5) Put inv_sel_reg in the plat_data for preparing add 0x2c support in > mt6779. > > 6) Add new flow to get SUB_COMMON ID and VPU larbid in the translation > fault. > > 7) Add mt6779 support. > > > ok, I will modify them for your above comments in next version, thanks > > > _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.5 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,UNWANTED_LANGUAGE_BODY, USER_AGENT_SANE_2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BC81CC2D0DA for ; Wed, 25 Dec 2019 06:59:55 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 8D4C52071E for ; Wed, 25 Dec 2019 06:59:55 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="OgOktUBK"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="PZGt0tp1" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8D4C52071E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=nPJ72felXXyITv5rXJGVKjbk6jqGoB04qziSAHOl4HQ=; b=OgOktUBKqBmqd8 5YV8i9hyBYeuZ0PA5HLzdb3My+BKsMUPhPda+PokvPBEsi1aEwys6VNq6jGOb7hnIL98isSEaf35X WlVLLqADehyCnTLGDLdX6GCirh/dCYnPsNzN2ZCY4h2FyUqdhHI53gK7YKdMdDkphb8JdaDCeQO6O /x6RbmNxVvgW2k7I1DuXa02qKpZopQBRsKlDH0KNXje8IRQTZsye42I0i6h//W6QpAeEn2WpjVKuq K9RMpGpeqOEULou7/dAUNhONuQmFVkhJCE6Fwc6Rz+jMM7Pq5YLJMuOQZg3h/UL/7rgQVIQ0kMYvU PuEZACuML96Bt2ZxcSVg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1ik0e4-0004YN-4e; Wed, 25 Dec 2019 06:59:48 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1ik0dx-0004Wj-Ez; Wed, 25 Dec 2019 06:59:45 +0000 X-UUID: a2b24dd88946420195cfdef5b115104d-20191224 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=Pg7AnzKAKzQJK/UPqk1ILEP4QA125SuECfkXqQGQ7mU=; b=PZGt0tp1/yfRTArez7fqOs5j9ALvgI6wszorxLX/A1xjK3Jprsjq+lvkSXH1hUunLM0QJqmZDFEkbVyb36DPN7fNqCi3bmypV6X250KP73dTb9e+sxh+iY5AhHlqwD+Rh8JkO4521HgKeiyfKh/9tzpviWnHowQHeyFnZdlj2ZI=; X-UUID: a2b24dd88946420195cfdef5b115104d-20191224 Received: from mtkcas67.mediatek.inc [(172.29.193.45)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 1502889578; Tue, 24 Dec 2019 22:59:28 -0800 Received: from mtkmbs07n1.mediatek.inc (172.21.101.16) by MTKMBS62DR.mediatek.inc (172.29.94.18) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Tue, 24 Dec 2019 22:59:50 -0800 Received: from mtkcas09.mediatek.inc (172.21.101.178) by mtkmbs07n1.mediatek.inc (172.21.101.16) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Wed, 25 Dec 2019 14:59:05 +0800 Received: from [10.15.20.246] (10.15.20.246) by mtkcas09.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Wed, 25 Dec 2019 14:59:38 +0800 Message-ID: <1577257111.1137.3.camel@mbjsdccf07> Subject: Re: [RESEND,PATCH 02/13] iommu/mediatek: Add mt6779 IOMMU basic support From: chao hao To: Yong Wu Date: Wed, 25 Dec 2019 14:58:31 +0800 In-Reply-To: <1576498063.28043.74.camel@mhfsdcap03> References: <20191104115238.2394-1-chao.hao@mediatek.com> <20191104115238.2394-3-chao.hao@mediatek.com> <1576498063.28043.74.camel@mhfsdcap03> X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20191224_225941_517142_30CE82AF X-CRM114-Status: GOOD ( 25.24 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Anan Sun , devicetree@vger.kernel.org, Cui Zhang , Jun Yan , wsd_upstream@mediatek.com, Joerg Roedel , linux-kernel@vger.kernel.org, Chao Hao , iommu@lists.linux-foundation.org, Rob Herring , linux-mediatek@lists.infradead.org, Miles Chen , Matthias Brugger , linux-arm-kernel@lists.infradead.org, Guangming Cao Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Mon, 2019-12-16 at 20:07 +0800, Yong Wu wrote: > On Mon, 2019-11-04 at 19:52 +0800, Chao Hao wrote: > > 1. Add mt6779 registers define for iommu. > > 2. Add mt6779_data define to support mt6779 iommu HW init. > > 3. There are two iommus, one is mm_iommu, the other is vpu_iommu. > > MM_IOMMU is connected smi_larb to support multimedia engine to > > access DRAM, and VPU_IOMMU is connected to APU_bus to support > > VPU,MDLA,EDMA to access DRAM. MM_IOMMU and VPU_IOMMU use the same > > page table to simplify design by "mtk_iommu_get_m4u_data". > > 4. For smi_larb6, it doesn't use mm_iommu, so we can distinguish > > vpu_iommu by it when excutes iommu_probe. > > 5. For mt6779 APU_IOMMU fault id is irregular, so it was treated > > specially. > > > > Signed-off-by: Chao Hao > > --- > > drivers/iommu/mtk_iommu.c | 91 +++++++++++++++++++++++++++++++++------ > > drivers/iommu/mtk_iommu.h | 10 ++++- > > 2 files changed, 87 insertions(+), 14 deletions(-) > > > > diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c > > index 8ca2e99964fe..f2847e661137 100644 > > --- a/drivers/iommu/mtk_iommu.c > > +++ b/drivers/iommu/mtk_iommu.c > > @@ -38,12 +38,24 @@ > > #define REG_MMU_INVLD_END_A 0x028 > > > > #define REG_MMU_INV_SEL 0x038 > > +#define REG_MMU_INV_SEL_MT6779 0x02c > > #define F_INVLD_EN0 BIT(0) > > #define F_INVLD_EN1 BIT(1) > > > > #define REG_MMU_STANDARD_AXI_MODE 0x048 > > + > > +#define REG_MMU_MISC_CRTL_MT6779 0x048 > > Defining two register in the same offset look strange. see below. > > > +#define REG_MMU_STANDARD_AXI_MODE_MT6779 (BIT(3) | BIT(19)) > > +#define REG_MMU_COHERENCE_EN (BIT(0) | BIT(16)) > > +#define REG_MMU_IN_ORDER_WR_EN (BIT(1) | BIT(17)) > > +#define F_MMU_HALF_ENTRY_MODE_L (BIT(5) | BIT(21)) > > +#define F_MMU_BLOCKING_MODE_L (BIT(4) | BIT(20)) > > The last four ones are not used. Please remove. > > > + > > #define REG_MMU_DCM_DIS 0x050 > > > > +#define REG_MMU_WR_LEN 0x054 > > +#define F_MMU_WR_THROT_DIS (BIT(5) | BIT(21)) > > + > > #define REG_MMU_CTRL_REG 0x110 > > #define F_MMU_TF_PROT_TO_PROGRAM_ADDR (2 << 4) > > #define F_MMU_PREFETCH_RT_REPLACE_MOD BIT(4) > > @@ -88,10 +100,14 @@ > > #define REG_MMU1_INVLD_PA 0x148 > > #define REG_MMU0_INT_ID 0x150 > > #define REG_MMU1_INT_ID 0x154 > > +#define F_MMU_INT_ID_COMM_ID(a) (((a) >> 9) & 0x7) > > +#define F_MMU_INT_ID_SUB_COMM_ID(a) (((a) >> 7) & 0x3) > > #define F_MMU_INT_ID_LARB_ID(a) (((a) >> 7) & 0x7) > > #define F_MMU_INT_ID_PORT_ID(a) (((a) >> 2) & 0x1f) > > +#define F_MMU_INT_ID_COMM_APU_ID(a) ((a) & 0x3) > > +#define F_MMU_INT_ID_SUB_APU_ID(a) (((a) >> 2) & 0x3) > > > > -#define MTK_PROTECT_PA_ALIGN 128 > > +#define MTK_PROTECT_PA_ALIGN 256 > > > > /* > > * Get the local arbiter ID and the portid within the larb arbiter > > @@ -165,7 +181,7 @@ static void mtk_iommu_tlb_flush_all(void *cookie) > > > > for_each_m4u(data) { > > writel_relaxed(F_INVLD_EN1 | F_INVLD_EN0, > > - data->base + REG_MMU_INV_SEL); > > + data->base + data->plat_data->inv_sel_reg); > > writel_relaxed(F_ALL_INVLD, data->base + REG_MMU_INVALIDATE); > > wmb(); /* Make sure the tlb flush all done */ > > } > > @@ -182,7 +198,7 @@ static void mtk_iommu_tlb_flush_range_sync(unsigned long iova, size_t size, > > for_each_m4u(data) { > > spin_lock_irqsave(&data->tlb_lock, flags); > > writel_relaxed(F_INVLD_EN1 | F_INVLD_EN0, > > - data->base + REG_MMU_INV_SEL); > > + data->base + data->plat_data->inv_sel_reg); > > > > writel_relaxed(iova, data->base + REG_MMU_INVLD_START_A); > > writel_relaxed(iova + size - 1, > > @@ -226,7 +242,7 @@ static irqreturn_t mtk_iommu_isr(int irq, void *dev_id) > > struct mtk_iommu_data *data = dev_id; > > struct mtk_iommu_domain *dom = data->m4u_dom; > > u32 int_state, regval, fault_iova, fault_pa; > > - unsigned int fault_larb, fault_port; > > + unsigned int fault_larb, fault_port, sub_comm = 0; > > bool layer, write; > > > > /* Read error info from registers */ > > @@ -242,17 +258,30 @@ static irqreturn_t mtk_iommu_isr(int irq, void *dev_id) > > } > > layer = fault_iova & F_MMU_FAULT_VA_LAYER_BIT; > > write = fault_iova & F_MMU_FAULT_VA_WRITE_BIT; > > - fault_larb = F_MMU_INT_ID_LARB_ID(regval); > > fault_port = F_MMU_INT_ID_PORT_ID(regval); > > + if (data->plat_data->has_sub_comm[data->m4u_id]) { > > + /* m4u1 is VPU in mt6779.*/ > > + if (data->m4u_id && data->plat_data->m4u_plat == M4U_MT6779) { > > + fault_larb = F_MMU_INT_ID_COMM_APU_ID(regval); > > + sub_comm = F_MMU_INT_ID_SUB_APU_ID(regval); > > + fault_port = 0; /* for mt6779 APU ID is irregular */ > > + } else { > > + fault_larb = F_MMU_INT_ID_COMM_ID(regval); > > + sub_comm = F_MMU_INT_ID_SUB_COMM_ID(regval); > > + } > > + } else { > > + fault_larb = F_MMU_INT_ID_LARB_ID(regval); > > + } > > > > - fault_larb = data->plat_data->larbid_remap[fault_larb]; > > + fault_larb = data->plat_data->larbid_remap[data->m4u_id][fault_larb]; > > > > if (report_iommu_fault(&dom->domain, data->dev, fault_iova, > > write ? IOMMU_FAULT_WRITE : IOMMU_FAULT_READ)) { > > dev_err_ratelimited( > > data->dev, > > - "fault type=0x%x iova=0x%x pa=0x%x larb=%d port=%d layer=%d %s\n", > > - int_state, fault_iova, fault_pa, fault_larb, fault_port, > > + "fault type=0x%x iova=0x%x pa=0x%x larb=%d sub_comm=%d port=%d regval=0x%x layer=%d %s\n", > > + int_state, fault_iova, fault_pa, fault_larb, > > + sub_comm, fault_port, regval, > > layer, write ? "write" : "read"); > > } > > > > @@ -545,11 +574,12 @@ static int mtk_iommu_hw_init(const struct mtk_iommu_data *data) > > return ret; > > } > > > > + regval = readl_relaxed(data->base + REG_MMU_CTRL_REG); > > if (data->plat_data->m4u_plat == M4U_MT8173) > > - regval = F_MMU_PREFETCH_RT_REPLACE_MOD | > > + regval |= F_MMU_PREFETCH_RT_REPLACE_MOD | > > F_MMU_TF_PROT_TO_PROGRAM_ADDR_MT8173; > > else > > - regval = F_MMU_TF_PROT_TO_PROGRAM_ADDR; > > + regval |= F_MMU_TF_PROT_TO_PROGRAM_ADDR; > > writel_relaxed(regval, data->base + REG_MMU_CTRL_REG); > > > > regval = F_L2_MULIT_HIT_EN | > > @@ -589,6 +619,20 @@ static int mtk_iommu_hw_init(const struct mtk_iommu_data *data) > > if (data->plat_data->reset_axi) > > writel_relaxed(0, data->base + REG_MMU_STANDARD_AXI_MODE); > > > > + if (data->plat_data->has_wr_len) { > > + /* write command throttling mode */ > > + regval = readl_relaxed(data->base + REG_MMU_WR_LEN); > > + regval &= ~F_MMU_WR_THROT_DIS; > > + writel_relaxed(regval, data->base + REG_MMU_WR_LEN); > > + } > > + /* special settings for mmu0 (multimedia iommu) */ > > + if (data->plat_data->has_misc_ctrl[data->m4u_id]) { > > + regval = readl_relaxed(data->base + REG_MMU_MISC_CRTL_MT6779); > > + /* non-standard AXI mode */ > > + regval &= ~REG_MMU_STANDARD_AXI_MODE_MT6779; > > + writel_relaxed(regval, data->base + REG_MMU_MISC_CRTL_MT6779); > > + } > > 0x48 are REG_MMU_STANDARD_AXI_MODE in both mt8173 and mt8183, while > it is REG_MMU_MISC_CRTL in mt2712, mt6779 and the latest soc, right? I > think we can use one defining, like this: > > #define REG_MMU_MISC_CTRL 0x48 > > if (!data->plat_data->has_misc_ctrl[data->m4u_id]) { > /* Disable standard axi mode while it is > REG_MMU_STANDARD_AXI_MODE */ > writel_relaxed(0, data->base + REG_MMU_MISC_CTRL); > } else if (data->m4u_id == 0) { > regval = readl_relaxed(data->base + REG_MMU_MISC_CTRL); > regval &= ~REG_MMU_STANDARD_AXI_MODE_MT6779; > writel_relaxed(regval, data->base + REG_MMU_MISC_CTRL); > } > > Meanwhile remove the setting for REG_MMU_STANDARD_AXI_MODE above. > > > + > > if (devm_request_irq(data->dev, data->irq, mtk_iommu_isr, 0, > > dev_name(data->dev), (void *)data)) { > > writel_relaxed(0, data->base + REG_MMU_PT_BASE_ADDR); > > @@ -678,6 +722,9 @@ static int mtk_iommu_probe(struct platform_device *pdev) > > } > > data->larb_imu[id].dev = &plarbdev->dev; > > > > + if (data->plat_data->m4u1_mask == (1 << id)) > > + data->m4u_id = 1; > > + > > component_match_add_release(dev, &match, release_of, > > compare_of, larbnode); > > } > > @@ -731,6 +778,7 @@ static int __maybe_unused mtk_iommu_suspend(struct device *dev) > > struct mtk_iommu_suspend_reg *reg = &data->reg; > > void __iomem *base = data->base; > > > > + reg->wr_len = readl_relaxed(base + REG_MMU_WR_LEN); > > reg->standard_axi_mode = readl_relaxed(base + > > REG_MMU_STANDARD_AXI_MODE); > > reg->dcm_dis = readl_relaxed(base + REG_MMU_DCM_DIS); > > @@ -756,6 +804,7 @@ static int __maybe_unused mtk_iommu_resume(struct device *dev) > > dev_err(data->dev, "Failed to enable clk(%d) in resume\n", ret); > > return ret; > > } > > + writel_relaxed(reg->wr_len, base + REG_MMU_WR_LEN); > > writel_relaxed(reg->standard_axi_mode, > > base + REG_MMU_STANDARD_AXI_MODE); > > writel_relaxed(reg->dcm_dis, base + REG_MMU_DCM_DIS); > > @@ -779,7 +828,20 @@ static const struct mtk_iommu_plat_data mt2712_data = { > > .has_4gb_mode = true, > > .has_bclk = true, > > .has_vld_pa_rng = true, > > - .larbid_remap = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, > > + .larbid_remap[0] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, > > + .inv_sel_reg = REG_MMU_INV_SEL, > > +}; > > + > > +static const struct mtk_iommu_plat_data mt6779_data = { > > + .m4u_plat = M4U_MT6779, > > + .larbid_remap[0] = {0, 1, 2, 3, 5, 7, 10, 9}, > > + /* vp6a, vp6b, mdla/core2, mdla/edmc*/ > > + .larbid_remap[1] = {2, 0, 3, 1}, > > + .has_sub_comm = {true, true}, > > + .has_wr_len = true, > > + .has_misc_ctrl = {true, false}, > > + .inv_sel_reg = REG_MMU_INV_SEL_MT6779, > > + .m4u1_mask = BIT(6), > > }; > > > > static const struct mtk_iommu_plat_data mt8173_data = { > > @@ -787,17 +849,20 @@ static const struct mtk_iommu_plat_data mt8173_data = { > > .has_4gb_mode = true, > > .has_bclk = true, > > .reset_axi = true, > > - .larbid_remap = {0, 1, 2, 3, 4, 5}, /* Linear mapping. */ > > + .larbid_remap[0] = {0, 1, 2, 3, 4, 5}, /* Linear mapping. */ > > + .inv_sel_reg = REG_MMU_INV_SEL, > > }; > > > > static const struct mtk_iommu_plat_data mt8183_data = { > > .m4u_plat = M4U_MT8183, > > .reset_axi = true, > > - .larbid_remap = {0, 4, 5, 6, 7, 2, 3, 1}, > > + .larbid_remap[0] = {0, 4, 5, 6, 7, 2, 3, 1}, > > + .inv_sel_reg = REG_MMU_INV_SEL, > > }; > > > > static const struct of_device_id mtk_iommu_of_ids[] = { > > { .compatible = "mediatek,mt2712-m4u", .data = &mt2712_data}, > > + { .compatible = "mediatek,mt6779-m4u", .data = &mt6779_data}, > > { .compatible = "mediatek,mt8173-m4u", .data = &mt8173_data}, > > { .compatible = "mediatek,mt8183-m4u", .data = &mt8183_data}, > > {} > > diff --git a/drivers/iommu/mtk_iommu.h b/drivers/iommu/mtk_iommu.h > > index ea949a324e33..132dc765a40b 100644 > > --- a/drivers/iommu/mtk_iommu.h > > +++ b/drivers/iommu/mtk_iommu.h > > @@ -25,11 +25,13 @@ struct mtk_iommu_suspend_reg { > > u32 int_main_control; > > u32 ivrp_paddr; > > u32 vld_pa_rng; > > + u32 wr_len; > > }; > > > > enum mtk_iommu_plat { > > M4U_MT2701, > > M4U_MT2712, > > + M4U_MT6779, > > M4U_MT8173, > > M4U_MT8183, > > }; > > @@ -42,7 +44,12 @@ struct mtk_iommu_plat_data { > > bool has_bclk; > > bool has_vld_pa_rng; > > bool reset_axi; > > - unsigned char larbid_remap[MTK_LARB_NR_MAX]; > > + bool has_sub_comm[2]; > > + bool has_wr_len; > > + bool has_misc_ctrl[2]; > > + u32 inv_sel_reg; > > + u32 m4u1_mask; > > alphabetically for the new ones. > > > + unsigned char larbid_remap[2][MTK_LARB_NR_MAX]; > > }; > > > > struct mtk_iommu_domain; > > @@ -59,6 +66,7 @@ struct mtk_iommu_data { > > bool enable_4GB; > > spinlock_t tlb_lock; /* lock for tlb range flush */ > > > > + u32 m4u_id; > > struct iommu_device iommu; > > const struct mtk_iommu_plat_data *plat_data; > > Basically this patch looks ok for me. But please split it to several > patches: > > 1) Extend larbid_remap to larbid_remap[2]. > Actually mt2712 also need this. this is the mt2712 definition. > larbid_remap[0] = {0, 1, 2, 3}, > larbid_remap[1] = {4, 5, 7, 8, 9}, > > 2) Regarding the 0x48(misc_ctrl register) > > 3) Add m4u1_mask to distinguish the m4u_id. > > 4) Add REG_MMU_WR_LEN if you need. > > 5) Put inv_sel_reg in the plat_data for preparing add 0x2c support in > mt6779. > > 6) Add new flow to get SUB_COMMON ID and VPU larbid in the translation > fault. > > 7) Add mt6779 support. > > > ok, I will modify them for your above comments in next version, thanks > > > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.5 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,UNWANTED_LANGUAGE_BODY, USER_AGENT_SANE_2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4B8F8C2D0DA for ; Wed, 25 Dec 2019 06:59:43 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0BD592072A for ; Wed, 25 Dec 2019 06:59:42 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="PsJeMTkX" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726352AbfLYG7m (ORCPT ); Wed, 25 Dec 2019 01:59:42 -0500 Received: from mailgw01.mediatek.com ([210.61.82.183]:60614 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1725865AbfLYG7m (ORCPT ); Wed, 25 Dec 2019 01:59:42 -0500 X-UUID: 4a640fa9b08c4d2d91fbf6f0085d866f-20191225 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=Pg7AnzKAKzQJK/UPqk1ILEP4QA125SuECfkXqQGQ7mU=; b=PsJeMTkXvM2s2animk9dTA4gqWEbQZFIBkQKHx15xd2uOlO7X8TQqnFELShU487KoprmUW+r46bRbZjd1q9Locy6We+JuvtJxNHEtxh6jPWA70XK03VrIAaPc+lmLiE/I8E3V3n0B8yXTMxOYkc2J8vOTmDwtnQ2ofzWzag/ZaA=; X-UUID: 4a640fa9b08c4d2d91fbf6f0085d866f-20191225 Received: from mtkcas09.mediatek.inc [(172.21.101.178)] by mailgw01.mediatek.com (envelope-from ) (Cellopoint E-mail Firewall v4.1.10 Build 0809 with TLS) with ESMTP id 1338988706; Wed, 25 Dec 2019 14:59:26 +0800 Received: from mtkcas09.mediatek.inc (172.21.101.178) by mtkmbs07n1.mediatek.inc (172.21.101.16) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Wed, 25 Dec 2019 14:59:05 +0800 Received: from [10.15.20.246] (10.15.20.246) by mtkcas09.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Wed, 25 Dec 2019 14:59:38 +0800 Message-ID: <1577257111.1137.3.camel@mbjsdccf07> Subject: Re: [RESEND,PATCH 02/13] iommu/mediatek: Add mt6779 IOMMU basic support From: chao hao To: Yong Wu CC: Joerg Roedel , Rob Herring , Matthias Brugger , , , , , , , Jun Yan , Cui Zhang , Guangming Cao , Anan Sun , Miles Chen , Chao Hao Date: Wed, 25 Dec 2019 14:58:31 +0800 In-Reply-To: <1576498063.28043.74.camel@mhfsdcap03> References: <20191104115238.2394-1-chao.hao@mediatek.com> <20191104115238.2394-3-chao.hao@mediatek.com> <1576498063.28043.74.camel@mhfsdcap03> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-MTK: N Content-Transfer-Encoding: base64 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org T24gTW9uLCAyMDE5LTEyLTE2IGF0IDIwOjA3ICswODAwLCBZb25nIFd1IHdyb3RlOg0KPiBPbiBN b24sIDIwMTktMTEtMDQgYXQgMTk6NTIgKzA4MDAsIENoYW8gSGFvIHdyb3RlOg0KPiA+IDEuIEFk ZCBtdDY3NzkgcmVnaXN0ZXJzIGRlZmluZSBmb3IgaW9tbXUuDQo+ID4gMi4gQWRkIG10Njc3OV9k YXRhIGRlZmluZSB0byBzdXBwb3J0IG10Njc3OSBpb21tdSBIVyBpbml0Lg0KPiA+IDMuIFRoZXJl IGFyZSB0d28gaW9tbXVzLCBvbmUgaXMgbW1faW9tbXUsIHRoZSBvdGhlciBpcyB2cHVfaW9tbXUu DQo+ID4gTU1fSU9NTVUgaXMgY29ubmVjdGVkIHNtaV9sYXJiIHRvIHN1cHBvcnQgbXVsdGltZWRp YSBlbmdpbmUgdG8NCj4gPiBhY2Nlc3MgRFJBTSwgYW5kIFZQVV9JT01NVSBpcyBjb25uZWN0ZWQg dG8gQVBVX2J1cyB0byBzdXBwb3J0DQo+ID4gVlBVLE1ETEEsRURNQSB0byBhY2Nlc3MgRFJBTS4g TU1fSU9NTVUgYW5kIFZQVV9JT01NVSB1c2UgdGhlIHNhbWUNCj4gPiBwYWdlIHRhYmxlIHRvIHNp bXBsaWZ5IGRlc2lnbiBieSAibXRrX2lvbW11X2dldF9tNHVfZGF0YSIuDQo+ID4gNC4gRm9yIHNt aV9sYXJiNiwgaXQgZG9lc24ndCB1c2UgbW1faW9tbXUsIHNvIHdlIGNhbiBkaXN0aW5ndWlzaA0K PiA+IHZwdV9pb21tdSBieSBpdCB3aGVuIGV4Y3V0ZXMgaW9tbXVfcHJvYmUuDQo+ID4gNS4gRm9y IG10Njc3OSBBUFVfSU9NTVUgZmF1bHQgaWQgaXMgaXJyZWd1bGFyLCBzbyBpdCB3YXMgdHJlYXRl ZA0KPiA+IHNwZWNpYWxseS4NCj4gPiANCj4gPiBTaWduZWQtb2ZmLWJ5OiBDaGFvIEhhbyA8Y2hh by5oYW9AbWVkaWF0ZWsuY29tPg0KPiA+IC0tLQ0KPiA+ICBkcml2ZXJzL2lvbW11L210a19pb21t dS5jIHwgOTEgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tDQo+ID4gIGRy aXZlcnMvaW9tbXUvbXRrX2lvbW11LmggfCAxMCArKysrLQ0KPiA+ICAyIGZpbGVzIGNoYW5nZWQs IDg3IGluc2VydGlvbnMoKyksIDE0IGRlbGV0aW9ucygtKQ0KPiA+IA0KPiA+IGRpZmYgLS1naXQg YS9kcml2ZXJzL2lvbW11L210a19pb21tdS5jIGIvZHJpdmVycy9pb21tdS9tdGtfaW9tbXUuYw0K PiA+IGluZGV4IDhjYTJlOTk5NjRmZS4uZjI4NDdlNjYxMTM3IDEwMDY0NA0KPiA+IC0tLSBhL2Ry aXZlcnMvaW9tbXUvbXRrX2lvbW11LmMNCj4gPiArKysgYi9kcml2ZXJzL2lvbW11L210a19pb21t dS5jDQo+ID4gQEAgLTM4LDEyICszOCwyNCBAQA0KPiA+ICAjZGVmaW5lIFJFR19NTVVfSU5WTERf RU5EX0EJCQkweDAyOA0KPiA+ICANCj4gPiAgI2RlZmluZSBSRUdfTU1VX0lOVl9TRUwJCQkJMHgw MzgNCj4gPiArI2RlZmluZSBSRUdfTU1VX0lOVl9TRUxfTVQ2Nzc5CQkJMHgwMmMNCj4gPiAgI2Rl ZmluZSBGX0lOVkxEX0VOMAkJCQlCSVQoMCkNCj4gPiAgI2RlZmluZSBGX0lOVkxEX0VOMQkJCQlC SVQoMSkNCj4gPiAgDQo+ID4gICNkZWZpbmUgUkVHX01NVV9TVEFOREFSRF9BWElfTU9ERQkJMHgw NDgNCj4gPiArDQo+ID4gKyNkZWZpbmUgUkVHX01NVV9NSVNDX0NSVExfTVQ2Nzc5CQkweDA0OA0K PiANCj4gRGVmaW5pbmcgdHdvIHJlZ2lzdGVyIGluIHRoZSBzYW1lIG9mZnNldCBsb29rIHN0cmFu Z2UuIHNlZSBiZWxvdy4NCj4gDQo+ID4gKyNkZWZpbmUgUkVHX01NVV9TVEFOREFSRF9BWElfTU9E RV9NVDY3NzkJKEJJVCgzKSB8IEJJVCgxOSkpDQo+ID4gKyNkZWZpbmUgUkVHX01NVV9DT0hFUkVO Q0VfRU4JCQkoQklUKDApIHwgQklUKDE2KSkNCj4gPiArI2RlZmluZSBSRUdfTU1VX0lOX09SREVS X1dSX0VOCQkJKEJJVCgxKSB8IEJJVCgxNykpDQo+ID4gKyNkZWZpbmUgRl9NTVVfSEFMRl9FTlRS WV9NT0RFX0wJCQkoQklUKDUpIHwgQklUKDIxKSkNCj4gPiArI2RlZmluZSBGX01NVV9CTE9DS0lO R19NT0RFX0wJCQkoQklUKDQpIHwgQklUKDIwKSkNCj4gDQo+IFRoZSBsYXN0IGZvdXIgb25lcyBh cmUgbm90IHVzZWQuIFBsZWFzZSByZW1vdmUuDQo+IA0KPiA+ICsNCj4gPiAgI2RlZmluZSBSRUdf TU1VX0RDTV9ESVMJCQkJMHgwNTANCj4gPiAgDQo+ID4gKyNkZWZpbmUgUkVHX01NVV9XUl9MRU4J CQkJMHgwNTQNCj4gPiArI2RlZmluZSBGX01NVV9XUl9USFJPVF9ESVMJCQkoQklUKDUpIHwgIEJJ VCgyMSkpDQo+ID4gKw0KPiA+ICAjZGVmaW5lIFJFR19NTVVfQ1RSTF9SRUcJCQkweDExMA0KPiA+ ICAjZGVmaW5lIEZfTU1VX1RGX1BST1RfVE9fUFJPR1JBTV9BRERSCQkoMiA8PCA0KQ0KPiA+ICAj ZGVmaW5lIEZfTU1VX1BSRUZFVENIX1JUX1JFUExBQ0VfTU9ECQlCSVQoNCkNCj4gPiBAQCAtODgs MTAgKzEwMCwxNCBAQA0KPiA+ICAjZGVmaW5lIFJFR19NTVUxX0lOVkxEX1BBCQkJMHgxNDgNCj4g PiAgI2RlZmluZSBSRUdfTU1VMF9JTlRfSUQJCQkJMHgxNTANCj4gPiAgI2RlZmluZSBSRUdfTU1V MV9JTlRfSUQJCQkJMHgxNTQNCj4gPiArI2RlZmluZSBGX01NVV9JTlRfSURfQ09NTV9JRChhKQkJ CSgoKGEpID4+IDkpICYgMHg3KQ0KPiA+ICsjZGVmaW5lIEZfTU1VX0lOVF9JRF9TVUJfQ09NTV9J RChhKQkJKCgoYSkgPj4gNykgJiAweDMpDQo+ID4gICNkZWZpbmUgRl9NTVVfSU5UX0lEX0xBUkJf SUQoYSkJCQkoKChhKSA+PiA3KSAmIDB4NykNCj4gPiAgI2RlZmluZSBGX01NVV9JTlRfSURfUE9S VF9JRChhKQkJCSgoKGEpID4+IDIpICYgMHgxZikNCj4gPiArI2RlZmluZSBGX01NVV9JTlRfSURf Q09NTV9BUFVfSUQoYSkJCSgoYSkgJiAweDMpDQo+ID4gKyNkZWZpbmUgRl9NTVVfSU5UX0lEX1NV Ql9BUFVfSUQoYSkJCSgoKGEpID4+IDIpICYgMHgzKQ0KPiA+ICANCj4gPiAtI2RlZmluZSBNVEtf UFJPVEVDVF9QQV9BTElHTgkJCTEyOA0KPiA+ICsjZGVmaW5lIE1US19QUk9URUNUX1BBX0FMSUdO CQkJMjU2DQo+ID4gIA0KPiA+ICAvKg0KPiA+ICAgKiBHZXQgdGhlIGxvY2FsIGFyYml0ZXIgSUQg YW5kIHRoZSBwb3J0aWQgd2l0aGluIHRoZSBsYXJiIGFyYml0ZXINCj4gPiBAQCAtMTY1LDcgKzE4 MSw3IEBAIHN0YXRpYyB2b2lkIG10a19pb21tdV90bGJfZmx1c2hfYWxsKHZvaWQgKmNvb2tpZSkN Cj4gPiAgDQo+ID4gIAlmb3JfZWFjaF9tNHUoZGF0YSkgew0KPiA+ICAJCXdyaXRlbF9yZWxheGVk KEZfSU5WTERfRU4xIHwgRl9JTlZMRF9FTjAsDQo+ID4gLQkJCSAgICAgICBkYXRhLT5iYXNlICsg UkVHX01NVV9JTlZfU0VMKTsNCj4gPiArCQkJICAgICAgIGRhdGEtPmJhc2UgKyBkYXRhLT5wbGF0 X2RhdGEtPmludl9zZWxfcmVnKTsNCj4gPiAgCQl3cml0ZWxfcmVsYXhlZChGX0FMTF9JTlZMRCwg ZGF0YS0+YmFzZSArIFJFR19NTVVfSU5WQUxJREFURSk7DQo+ID4gIAkJd21iKCk7IC8qIE1ha2Ug c3VyZSB0aGUgdGxiIGZsdXNoIGFsbCBkb25lICovDQo+ID4gIAl9DQo+ID4gQEAgLTE4Miw3ICsx OTgsNyBAQCBzdGF0aWMgdm9pZCBtdGtfaW9tbXVfdGxiX2ZsdXNoX3JhbmdlX3N5bmModW5zaWdu ZWQgbG9uZyBpb3ZhLCBzaXplX3Qgc2l6ZSwNCj4gPiAgCWZvcl9lYWNoX200dShkYXRhKSB7DQo+ ID4gIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGEtPnRsYl9sb2NrLCBmbGFncyk7DQo+ID4gIAkJ d3JpdGVsX3JlbGF4ZWQoRl9JTlZMRF9FTjEgfCBGX0lOVkxEX0VOMCwNCj4gPiAtCQkJICAgICAg IGRhdGEtPmJhc2UgKyBSRUdfTU1VX0lOVl9TRUwpOw0KPiA+ICsJCQkgICAgICAgZGF0YS0+YmFz ZSArIGRhdGEtPnBsYXRfZGF0YS0+aW52X3NlbF9yZWcpOw0KPiA+ICANCj4gPiAgCQl3cml0ZWxf cmVsYXhlZChpb3ZhLCBkYXRhLT5iYXNlICsgUkVHX01NVV9JTlZMRF9TVEFSVF9BKTsNCj4gPiAg CQl3cml0ZWxfcmVsYXhlZChpb3ZhICsgc2l6ZSAtIDEsDQo+ID4gQEAgLTIyNiw3ICsyNDIsNyBA QCBzdGF0aWMgaXJxcmV0dXJuX3QgbXRrX2lvbW11X2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQp DQo+ID4gIAlzdHJ1Y3QgbXRrX2lvbW11X2RhdGEgKmRhdGEgPSBkZXZfaWQ7DQo+ID4gIAlzdHJ1 Y3QgbXRrX2lvbW11X2RvbWFpbiAqZG9tID0gZGF0YS0+bTR1X2RvbTsNCj4gPiAgCXUzMiBpbnRf c3RhdGUsIHJlZ3ZhbCwgZmF1bHRfaW92YSwgZmF1bHRfcGE7DQo+ID4gLQl1bnNpZ25lZCBpbnQg ZmF1bHRfbGFyYiwgZmF1bHRfcG9ydDsNCj4gPiArCXVuc2lnbmVkIGludCBmYXVsdF9sYXJiLCBm YXVsdF9wb3J0LCBzdWJfY29tbSA9IDA7DQo+ID4gIAlib29sIGxheWVyLCB3cml0ZTsNCj4gPiAg DQo+ID4gIAkvKiBSZWFkIGVycm9yIGluZm8gZnJvbSByZWdpc3RlcnMgKi8NCj4gPiBAQCAtMjQy LDE3ICsyNTgsMzAgQEAgc3RhdGljIGlycXJldHVybl90IG10a19pb21tdV9pc3IoaW50IGlycSwg dm9pZCAqZGV2X2lkKQ0KPiA+ICAJfQ0KPiA+ICAJbGF5ZXIgPSBmYXVsdF9pb3ZhICYgRl9NTVVf RkFVTFRfVkFfTEFZRVJfQklUOw0KPiA+ICAJd3JpdGUgPSBmYXVsdF9pb3ZhICYgRl9NTVVfRkFV TFRfVkFfV1JJVEVfQklUOw0KPiA+IC0JZmF1bHRfbGFyYiA9IEZfTU1VX0lOVF9JRF9MQVJCX0lE KHJlZ3ZhbCk7DQo+ID4gIAlmYXVsdF9wb3J0ID0gRl9NTVVfSU5UX0lEX1BPUlRfSUQocmVndmFs KTsNCj4gPiArCWlmIChkYXRhLT5wbGF0X2RhdGEtPmhhc19zdWJfY29tbVtkYXRhLT5tNHVfaWRd KSB7DQo+ID4gKwkJLyogbTR1MSBpcyBWUFUgaW4gbXQ2Nzc5LiovDQo+ID4gKwkJaWYgKGRhdGEt Pm00dV9pZCAmJiBkYXRhLT5wbGF0X2RhdGEtPm00dV9wbGF0ID09IE00VV9NVDY3NzkpIHsNCj4g PiArCQkJZmF1bHRfbGFyYiA9IEZfTU1VX0lOVF9JRF9DT01NX0FQVV9JRChyZWd2YWwpOw0KPiA+ ICsJCQlzdWJfY29tbSA9IEZfTU1VX0lOVF9JRF9TVUJfQVBVX0lEKHJlZ3ZhbCk7DQo+ID4gKwkJ CWZhdWx0X3BvcnQgPSAwOyAvKiBmb3IgbXQ2Nzc5IEFQVSBJRCBpcyBpcnJlZ3VsYXIgKi8NCj4g PiArCQl9IGVsc2Ugew0KPiA+ICsJCQlmYXVsdF9sYXJiID0gRl9NTVVfSU5UX0lEX0NPTU1fSUQo cmVndmFsKTsNCj4gPiArCQkJc3ViX2NvbW0gPSBGX01NVV9JTlRfSURfU1VCX0NPTU1fSUQocmVn dmFsKTsNCj4gPiArCQl9DQo+ID4gKwl9IGVsc2Ugew0KPiA+ICsJCWZhdWx0X2xhcmIgPSBGX01N VV9JTlRfSURfTEFSQl9JRChyZWd2YWwpOw0KPiA+ICsJfQ0KPiA+ICANCj4gPiAtCWZhdWx0X2xh cmIgPSBkYXRhLT5wbGF0X2RhdGEtPmxhcmJpZF9yZW1hcFtmYXVsdF9sYXJiXTsNCj4gPiArCWZh dWx0X2xhcmIgPSBkYXRhLT5wbGF0X2RhdGEtPmxhcmJpZF9yZW1hcFtkYXRhLT5tNHVfaWRdW2Zh dWx0X2xhcmJdOw0KPiA+ICANCj4gPiAgCWlmIChyZXBvcnRfaW9tbXVfZmF1bHQoJmRvbS0+ZG9t YWluLCBkYXRhLT5kZXYsIGZhdWx0X2lvdmEsDQo+ID4gIAkJCSAgICAgICB3cml0ZSA/IElPTU1V X0ZBVUxUX1dSSVRFIDogSU9NTVVfRkFVTFRfUkVBRCkpIHsNCj4gPiAgCQlkZXZfZXJyX3JhdGVs aW1pdGVkKA0KPiA+ICAJCQlkYXRhLT5kZXYsDQo+ID4gLQkJCSJmYXVsdCB0eXBlPTB4JXggaW92 YT0weCV4IHBhPTB4JXggbGFyYj0lZCBwb3J0PSVkIGxheWVyPSVkICVzXG4iLA0KPiA+IC0JCQlp bnRfc3RhdGUsIGZhdWx0X2lvdmEsIGZhdWx0X3BhLCBmYXVsdF9sYXJiLCBmYXVsdF9wb3J0LA0K PiA+ICsJCQkiZmF1bHQgdHlwZT0weCV4IGlvdmE9MHgleCBwYT0weCV4IGxhcmI9JWQgc3ViX2Nv bW09JWQgcG9ydD0lZCByZWd2YWw9MHgleCBsYXllcj0lZCAlc1xuIiwNCj4gPiArCQkJaW50X3N0 YXRlLCBmYXVsdF9pb3ZhLCBmYXVsdF9wYSwgZmF1bHRfbGFyYiwNCj4gPiArCQkJc3ViX2NvbW0s IGZhdWx0X3BvcnQsIHJlZ3ZhbCwNCj4gPiAgCQkJbGF5ZXIsIHdyaXRlID8gIndyaXRlIiA6ICJy ZWFkIik7DQo+ID4gIAl9DQo+ID4gIA0KPiA+IEBAIC01NDUsMTEgKzU3NCwxMiBAQCBzdGF0aWMg aW50IG10a19pb21tdV9od19pbml0KGNvbnN0IHN0cnVjdCBtdGtfaW9tbXVfZGF0YSAqZGF0YSkN Cj4gPiAgCQlyZXR1cm4gcmV0Ow0KPiA+ICAJfQ0KPiA+ICANCj4gPiArCXJlZ3ZhbCA9IHJlYWRs X3JlbGF4ZWQoZGF0YS0+YmFzZSArIFJFR19NTVVfQ1RSTF9SRUcpOw0KPiA+ICAJaWYgKGRhdGEt PnBsYXRfZGF0YS0+bTR1X3BsYXQgPT0gTTRVX01UODE3MykNCj4gPiAtCQlyZWd2YWwgPSBGX01N VV9QUkVGRVRDSF9SVF9SRVBMQUNFX01PRCB8DQo+ID4gKwkJcmVndmFsIHw9IEZfTU1VX1BSRUZF VENIX1JUX1JFUExBQ0VfTU9EIHwNCj4gPiAgCQkJIEZfTU1VX1RGX1BST1RfVE9fUFJPR1JBTV9B RERSX01UODE3MzsNCj4gPiAgCWVsc2UNCj4gPiAtCQlyZWd2YWwgPSBGX01NVV9URl9QUk9UX1RP X1BST0dSQU1fQUREUjsNCj4gPiArCQlyZWd2YWwgfD0gRl9NTVVfVEZfUFJPVF9UT19QUk9HUkFN X0FERFI7DQo+ID4gIAl3cml0ZWxfcmVsYXhlZChyZWd2YWwsIGRhdGEtPmJhc2UgKyBSRUdfTU1V X0NUUkxfUkVHKTsNCj4gPiAgDQo+ID4gIAlyZWd2YWwgPSBGX0wyX01VTElUX0hJVF9FTiB8DQo+ ID4gQEAgLTU4OSw2ICs2MTksMjAgQEAgc3RhdGljIGludCBtdGtfaW9tbXVfaHdfaW5pdChjb25z dCBzdHJ1Y3QgbXRrX2lvbW11X2RhdGEgKmRhdGEpDQo+ID4gIAlpZiAoZGF0YS0+cGxhdF9kYXRh LT5yZXNldF9heGkpDQo+ID4gIAkJd3JpdGVsX3JlbGF4ZWQoMCwgZGF0YS0+YmFzZSArIFJFR19N TVVfU1RBTkRBUkRfQVhJX01PREUpOw0KPiA+ICANCj4gPiArCWlmIChkYXRhLT5wbGF0X2RhdGEt Pmhhc193cl9sZW4pIHsNCj4gPiArCQkvKiB3cml0ZSBjb21tYW5kIHRocm90dGxpbmcgbW9kZSAq Lw0KPiA+ICsJCXJlZ3ZhbCA9IHJlYWRsX3JlbGF4ZWQoZGF0YS0+YmFzZSArIFJFR19NTVVfV1Jf TEVOKTsNCj4gPiArCQlyZWd2YWwgJj0gfkZfTU1VX1dSX1RIUk9UX0RJUzsNCj4gPiArCQl3cml0 ZWxfcmVsYXhlZChyZWd2YWwsIGRhdGEtPmJhc2UgKyBSRUdfTU1VX1dSX0xFTik7DQo+ID4gKwl9 DQo+ID4gKwkvKiBzcGVjaWFsIHNldHRpbmdzIGZvciBtbXUwIChtdWx0aW1lZGlhIGlvbW11KSAq Lw0KPiA+ICsJaWYgKGRhdGEtPnBsYXRfZGF0YS0+aGFzX21pc2NfY3RybFtkYXRhLT5tNHVfaWRd KSB7DQo+ID4gKwkJcmVndmFsID0gcmVhZGxfcmVsYXhlZChkYXRhLT5iYXNlICsgUkVHX01NVV9N SVNDX0NSVExfTVQ2Nzc5KTsNCj4gPiArCQkvKiBub24tc3RhbmRhcmQgQVhJIG1vZGUgKi8NCj4g PiArCQlyZWd2YWwgJj0gflJFR19NTVVfU1RBTkRBUkRfQVhJX01PREVfTVQ2Nzc5Ow0KPiA+ICsJ CXdyaXRlbF9yZWxheGVkKHJlZ3ZhbCwgZGF0YS0+YmFzZSArIFJFR19NTVVfTUlTQ19DUlRMX01U Njc3OSk7DQo+ID4gKwl9DQo+IA0KPiAgICAgIDB4NDggYXJlIFJFR19NTVVfU1RBTkRBUkRfQVhJ X01PREUgaW4gYm90aCBtdDgxNzMgYW5kIG10ODE4Mywgd2hpbGUNCj4gaXQgaXMgUkVHX01NVV9N SVNDX0NSVEwgaW4gbXQyNzEyLCBtdDY3NzkgYW5kIHRoZSBsYXRlc3Qgc29jLCByaWdodD8gSQ0K PiB0aGluayB3ZSBjYW4gdXNlIG9uZSBkZWZpbmluZywgbGlrZSB0aGlzOg0KPiANCj4gICAgICAg ICAgICNkZWZpbmUgIFJFR19NTVVfTUlTQ19DVFJMIDB4NDgNCj4gDQo+ICAgICAgICAgIGlmICgh ZGF0YS0+cGxhdF9kYXRhLT5oYXNfbWlzY19jdHJsW2RhdGEtPm00dV9pZF0pIHsNCj4gICAgICAg ICAgICAgICAgLyogRGlzYWJsZSBzdGFuZGFyZCBheGkgbW9kZSB3aGlsZSBpdCBpcw0KPiBSRUdf TU1VX1NUQU5EQVJEX0FYSV9NT0RFICovDQo+IAkJd3JpdGVsX3JlbGF4ZWQoMCwgZGF0YS0+YmFz ZSArIFJFR19NTVVfTUlTQ19DVFJMKTsNCj4gCSB9IGVsc2UgaWYgKGRhdGEtPm00dV9pZCA9PSAw KSB7DQo+IAkJcmVndmFsID0gcmVhZGxfcmVsYXhlZChkYXRhLT5iYXNlICsgUkVHX01NVV9NSVND X0NUUkwpOw0KPiAJCXJlZ3ZhbCAmPSB+UkVHX01NVV9TVEFOREFSRF9BWElfTU9ERV9NVDY3Nzk7 DQo+IAkJd3JpdGVsX3JlbGF4ZWQocmVndmFsLCBkYXRhLT5iYXNlICsgUkVHX01NVV9NSVNDX0NU UkwpOw0KPiAgICAgICAgICB9DQo+IA0KPiAJIE1lYW53aGlsZSByZW1vdmUgdGhlIHNldHRpbmcg Zm9yIFJFR19NTVVfU1RBTkRBUkRfQVhJX01PREUgYWJvdmUuDQo+IA0KPiA+ICsNCj4gPiAgCWlm IChkZXZtX3JlcXVlc3RfaXJxKGRhdGEtPmRldiwgZGF0YS0+aXJxLCBtdGtfaW9tbXVfaXNyLCAw LA0KPiA+ICAJCQkgICAgIGRldl9uYW1lKGRhdGEtPmRldiksICh2b2lkICopZGF0YSkpIHsNCj4g PiAgCQl3cml0ZWxfcmVsYXhlZCgwLCBkYXRhLT5iYXNlICsgUkVHX01NVV9QVF9CQVNFX0FERFIp Ow0KPiA+IEBAIC02NzgsNiArNzIyLDkgQEAgc3RhdGljIGludCBtdGtfaW9tbXVfcHJvYmUoc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikNCj4gPiAgCQl9DQo+ID4gIAkJZGF0YS0+bGFyYl9p bXVbaWRdLmRldiA9ICZwbGFyYmRldi0+ZGV2Ow0KPiA+ICANCj4gPiArCQlpZiAoZGF0YS0+cGxh dF9kYXRhLT5tNHUxX21hc2sgPT0gKDEgPDwgaWQpKQ0KPiA+ICsJCQlkYXRhLT5tNHVfaWQgPSAx Ow0KPiA+ICsNCj4gPiAgCQljb21wb25lbnRfbWF0Y2hfYWRkX3JlbGVhc2UoZGV2LCAmbWF0Y2gs IHJlbGVhc2Vfb2YsDQo+ID4gIAkJCQkJICAgIGNvbXBhcmVfb2YsIGxhcmJub2RlKTsNCj4gPiAg CX0NCj4gPiBAQCAtNzMxLDYgKzc3OCw3IEBAIHN0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgbXRr X2lvbW11X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQ0KPiA+ICAJc3RydWN0IG10a19pb21t dV9zdXNwZW5kX3JlZyAqcmVnID0gJmRhdGEtPnJlZzsNCj4gPiAgCXZvaWQgX19pb21lbSAqYmFz ZSA9IGRhdGEtPmJhc2U7DQo+ID4gIA0KPiA+ICsJcmVnLT53cl9sZW4gPSByZWFkbF9yZWxheGVk KGJhc2UgKyBSRUdfTU1VX1dSX0xFTik7DQo+ID4gIAlyZWctPnN0YW5kYXJkX2F4aV9tb2RlID0g cmVhZGxfcmVsYXhlZChiYXNlICsNCj4gPiAgCQkJCQkgICAgICAgUkVHX01NVV9TVEFOREFSRF9B WElfTU9ERSk7DQo+ID4gIAlyZWctPmRjbV9kaXMgPSByZWFkbF9yZWxheGVkKGJhc2UgKyBSRUdf TU1VX0RDTV9ESVMpOw0KPiA+IEBAIC03NTYsNiArODA0LDcgQEAgc3RhdGljIGludCBfX21heWJl X3VudXNlZCBtdGtfaW9tbXVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikNCj4gPiAgCQlkZXZf ZXJyKGRhdGEtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgY2xrKCVkKSBpbiByZXN1bWVcbiIsIHJl dCk7DQo+ID4gIAkJcmV0dXJuIHJldDsNCj4gPiAgCX0NCj4gPiArCXdyaXRlbF9yZWxheGVkKHJl Zy0+d3JfbGVuLCBiYXNlICsgUkVHX01NVV9XUl9MRU4pOw0KPiA+ICAJd3JpdGVsX3JlbGF4ZWQo cmVnLT5zdGFuZGFyZF9heGlfbW9kZSwNCj4gPiAgCQkgICAgICAgYmFzZSArIFJFR19NTVVfU1RB TkRBUkRfQVhJX01PREUpOw0KPiA+ICAJd3JpdGVsX3JlbGF4ZWQocmVnLT5kY21fZGlzLCBiYXNl ICsgUkVHX01NVV9EQ01fRElTKTsNCj4gPiBAQCAtNzc5LDcgKzgyOCwyMCBAQCBzdGF0aWMgY29u c3Qgc3RydWN0IG10a19pb21tdV9wbGF0X2RhdGEgbXQyNzEyX2RhdGEgPSB7DQo+ID4gIAkuaGFz XzRnYl9tb2RlID0gdHJ1ZSwNCj4gPiAgCS5oYXNfYmNsayAgICAgPSB0cnVlLA0KPiA+ICAJLmhh c192bGRfcGFfcm5nICAgPSB0cnVlLA0KPiA+IC0JLmxhcmJpZF9yZW1hcCA9IHswLCAxLCAyLCAz LCA0LCA1LCA2LCA3LCA4LCA5fSwNCj4gPiArCS5sYXJiaWRfcmVtYXBbMF0gPSB7MCwgMSwgMiwg MywgNCwgNSwgNiwgNywgOCwgOX0sDQo+ID4gKwkuaW52X3NlbF9yZWcgPSBSRUdfTU1VX0lOVl9T RUwsDQo+ID4gK307DQo+ID4gKw0KPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG10a19pb21tdV9w bGF0X2RhdGEgbXQ2Nzc5X2RhdGEgPSB7DQo+ID4gKwkubTR1X3BsYXQgPSBNNFVfTVQ2Nzc5LA0K PiA+ICsJLmxhcmJpZF9yZW1hcFswXSA9IHswLCAxLCAyLCAzLCA1LCA3LCAxMCwgOX0sDQo+ID4g KwkvKiB2cDZhLCB2cDZiLCBtZGxhL2NvcmUyLCBtZGxhL2VkbWMqLw0KPiA+ICsJLmxhcmJpZF9y ZW1hcFsxXSA9IHsyLCAwLCAzLCAxfSwNCj4gPiArCS5oYXNfc3ViX2NvbW0gPSB7dHJ1ZSwgdHJ1 ZX0sDQo+ID4gKwkuaGFzX3dyX2xlbiA9IHRydWUsDQo+ID4gKwkuaGFzX21pc2NfY3RybCA9IHt0 cnVlLCBmYWxzZX0sDQo+ID4gKwkuaW52X3NlbF9yZWcgPSBSRUdfTU1VX0lOVl9TRUxfTVQ2Nzc5 LA0KPiA+ICsJLm00dTFfbWFzayA9ICBCSVQoNiksDQo+ID4gIH07DQo+ID4gIA0KPiA+ICBzdGF0 aWMgY29uc3Qgc3RydWN0IG10a19pb21tdV9wbGF0X2RhdGEgbXQ4MTczX2RhdGEgPSB7DQo+ID4g QEAgLTc4NywxNyArODQ5LDIwIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2lvbW11X3BsYXRf ZGF0YSBtdDgxNzNfZGF0YSA9IHsNCj4gPiAgCS5oYXNfNGdiX21vZGUgPSB0cnVlLA0KPiA+ICAJ Lmhhc19iY2xrICAgICA9IHRydWUsDQo+ID4gIAkucmVzZXRfYXhpICAgID0gdHJ1ZSwNCj4gPiAt CS5sYXJiaWRfcmVtYXAgPSB7MCwgMSwgMiwgMywgNCwgNX0sIC8qIExpbmVhciBtYXBwaW5nLiAq Lw0KPiA+ICsJLmxhcmJpZF9yZW1hcFswXSA9IHswLCAxLCAyLCAzLCA0LCA1fSwgLyogTGluZWFy IG1hcHBpbmcuICovDQo+ID4gKwkuaW52X3NlbF9yZWcgPSBSRUdfTU1VX0lOVl9TRUwsDQo+ID4g IH07DQo+ID4gIA0KPiA+ICBzdGF0aWMgY29uc3Qgc3RydWN0IG10a19pb21tdV9wbGF0X2RhdGEg bXQ4MTgzX2RhdGEgPSB7DQo+ID4gIAkubTR1X3BsYXQgICAgID0gTTRVX01UODE4MywNCj4gPiAg CS5yZXNldF9heGkgICAgPSB0cnVlLA0KPiA+IC0JLmxhcmJpZF9yZW1hcCA9IHswLCA0LCA1LCA2 LCA3LCAyLCAzLCAxfSwNCj4gPiArCS5sYXJiaWRfcmVtYXBbMF0gPSB7MCwgNCwgNSwgNiwgNywg MiwgMywgMX0sDQo+ID4gKwkuaW52X3NlbF9yZWcgPSBSRUdfTU1VX0lOVl9TRUwsDQo+ID4gIH07 DQo+ID4gIA0KPiA+ICBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtdGtfaW9tbXVf b2ZfaWRzW10gPSB7DQo+ID4gIAl7IC5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10MjcxMi1tNHUi LCAuZGF0YSA9ICZtdDI3MTJfZGF0YX0sDQo+ID4gKwl7IC5jb21wYXRpYmxlID0gIm1lZGlhdGVr LG10Njc3OS1tNHUiLCAuZGF0YSA9ICZtdDY3NzlfZGF0YX0sDQo+ID4gIAl7IC5jb21wYXRpYmxl ID0gIm1lZGlhdGVrLG10ODE3My1tNHUiLCAuZGF0YSA9ICZtdDgxNzNfZGF0YX0sDQo+ID4gIAl7 IC5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10ODE4My1tNHUiLCAuZGF0YSA9ICZtdDgxODNfZGF0 YX0sDQo+ID4gIAl7fQ0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L210a19pb21tdS5o IGIvZHJpdmVycy9pb21tdS9tdGtfaW9tbXUuaA0KPiA+IGluZGV4IGVhOTQ5YTMyNGUzMy4uMTMy ZGM3NjVhNDBiIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvaW9tbXUvbXRrX2lvbW11LmgNCj4g PiArKysgYi9kcml2ZXJzL2lvbW11L210a19pb21tdS5oDQo+ID4gQEAgLTI1LDExICsyNSwxMyBA QCBzdHJ1Y3QgbXRrX2lvbW11X3N1c3BlbmRfcmVnIHsNCj4gPiAgCXUzMgkJCQlpbnRfbWFpbl9j b250cm9sOw0KPiA+ICAJdTMyCQkJCWl2cnBfcGFkZHI7DQo+ID4gIAl1MzIJCQkJdmxkX3BhX3Ju ZzsNCj4gPiArCXUzMgkJCQl3cl9sZW47DQo+ID4gIH07DQo+ID4gIA0KPiA+ICBlbnVtIG10a19p b21tdV9wbGF0IHsNCj4gPiAgCU00VV9NVDI3MDEsDQo+ID4gIAlNNFVfTVQyNzEyLA0KPiA+ICsJ TTRVX01UNjc3OSwNCj4gPiAgCU00VV9NVDgxNzMsDQo+ID4gIAlNNFVfTVQ4MTgzLA0KPiA+ICB9 Ow0KPiA+IEBAIC00Miw3ICs0NCwxMiBAQCBzdHJ1Y3QgbXRrX2lvbW11X3BsYXRfZGF0YSB7DQo+ ID4gIAlib29sICAgICAgICAgICAgICAgIGhhc19iY2xrOw0KPiA+ICAJYm9vbCAgICAgICAgICAg ICAgICBoYXNfdmxkX3BhX3JuZzsNCj4gPiAgCWJvb2wgICAgICAgICAgICAgICAgcmVzZXRfYXhp Ow0KPiA+IC0JdW5zaWduZWQgY2hhciAgICAgICBsYXJiaWRfcmVtYXBbTVRLX0xBUkJfTlJfTUFY XTsNCj4gPiArCWJvb2wgICAgICAgICAgICAgICAgaGFzX3N1Yl9jb21tWzJdOw0KPiA+ICsJYm9v bCAgICAgICAgICAgICAgICBoYXNfd3JfbGVuOw0KPiA+ICsJYm9vbCAgICAgICAgICAgICAgICBo YXNfbWlzY19jdHJsWzJdOw0KPiA+ICsJdTMyICAgICAgICAgICAgICAgICBpbnZfc2VsX3JlZzsN Cj4gPiArCXUzMiAgICAgICAgICAgICAgICAgbTR1MV9tYXNrOw0KPiANCj4gYWxwaGFiZXRpY2Fs bHkgZm9yIHRoZSBuZXcgb25lcy4NCj4gDQo+ID4gKwl1bnNpZ25lZCBjaGFyICAgICAgIGxhcmJp ZF9yZW1hcFsyXVtNVEtfTEFSQl9OUl9NQVhdOw0KPiA+ICB9Ow0KPiA+ICANCj4gPiAgc3RydWN0 IG10a19pb21tdV9kb21haW47DQo+ID4gQEAgLTU5LDYgKzY2LDcgQEAgc3RydWN0IG10a19pb21t dV9kYXRhIHsNCj4gPiAgCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlXzRH QjsNCj4gPiAgCXNwaW5sb2NrX3QJCQl0bGJfbG9jazsgLyogbG9jayBmb3IgdGxiIHJhbmdlIGZs dXNoICovDQo+ID4gIA0KPiA+ICsJdTMyCQkJCW00dV9pZDsNCj4gPiAgCXN0cnVjdCBpb21tdV9k ZXZpY2UJCWlvbW11Ow0KPiA+ICAJY29uc3Qgc3RydWN0IG10a19pb21tdV9wbGF0X2RhdGEgKnBs YXRfZGF0YTsNCj4gDQo+IEJhc2ljYWxseSB0aGlzIHBhdGNoIGxvb2tzIG9rIGZvciBtZS4gQnV0 IHBsZWFzZSBzcGxpdCBpdCB0byBzZXZlcmFsDQo+IHBhdGNoZXM6DQo+IA0KPiAxKSBFeHRlbmQg bGFyYmlkX3JlbWFwIHRvIGxhcmJpZF9yZW1hcFsyXS4NCj4gICAgQWN0dWFsbHkgbXQyNzEyIGFs c28gbmVlZCB0aGlzLiB0aGlzIGlzIHRoZSBtdDI3MTIgZGVmaW5pdGlvbi4NCj4gICAgbGFyYmlk X3JlbWFwWzBdID0gezAsIDEsIDIsIDN9LA0KPiAgICBsYXJiaWRfcmVtYXBbMV0gPSB7NCwgNSwg NywgOCwgOX0sDQo+IA0KPiAyKSBSZWdhcmRpbmcgdGhlIDB4NDgobWlzY19jdHJsIHJlZ2lzdGVy KQ0KPiANCj4gMykgQWRkIG00dTFfbWFzayB0byBkaXN0aW5ndWlzaCB0aGUgbTR1X2lkLg0KPiAN Cj4gNCkgQWRkIFJFR19NTVVfV1JfTEVOIGlmIHlvdSBuZWVkLg0KPiANCj4gNSkgUHV0IGludl9z ZWxfcmVnIGluIHRoZSBwbGF0X2RhdGEgZm9yIHByZXBhcmluZyBhZGQgMHgyYyBzdXBwb3J0IGlu DQo+IG10Njc3OS4NCj4gDQo+IDYpIEFkZCBuZXcgZmxvdyB0byBnZXQgU1VCX0NPTU1PTiBJRCBh bmQgVlBVIGxhcmJpZCBpbiB0aGUgdHJhbnNsYXRpb24NCj4gZmF1bHQuDQo+IA0KPiA3KSBBZGQg bXQ2Nzc5IHN1cHBvcnQuDQo+IA0KPiA+IA0KDQpvaywgSSB3aWxsIG1vZGlmeSB0aGVtIGZvciB5 b3VyIGFib3ZlIGNvbW1lbnRzIGluIG5leHQgdmVyc2lvbiwgdGhhbmtzDQoNCj4gIA0KPiANCj4g DQoNCg==