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=-15.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, URIBL_BLOCKED,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 23D33C4338F for ; Mon, 2 Aug 2021 03:35:13 +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 AC83061050 for ; Mon, 2 Aug 2021 03:35:12 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org AC83061050 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:CC: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=onJjZfMAql6O8wUbSrOvFoCUCOhHYyT7dt8I/xCuxGo=; b=W5+1mvhYcVHdzZ PAY7LtdBAVPKg+oAaVb3NWen7l0ieKDrdHoTK2QJw9i88oPoa/yrfq6IwPt/rP4KeVbDKuaN2BStQ hG4rtqQlu71h48pZtOU5Q1TcmAhLB1AABwRTpFE02CQ/J0tn1QhsEuTjc6FBbxuHuV8IkvL7LGyt5 GJmmYbKQWmcRZ2uWe/DWmhBIEa+U/f9SNVUUMTFvMZ+MvixG0kpIi/HKVfSXvRxveP6vVuXncC473 V2VR2u/cHAkuNXHOqnOBhQOP0rs7ORNynf+KoOEFZPxqFX0cE7qb7N6EqchtMYp88lE2xXAN/vce9 eVkaOQyUOl/z891NMTNg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mAOj9-00EqC4-Aq; Mon, 02 Aug 2021 03:34:55 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mAOj3-00EqAL-WC; Mon, 02 Aug 2021 03:34:53 +0000 X-UUID: de921cd6db2a41978b55ff365b257853-20210801 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=UpfEaLGXWwDvxkBt/ER6jVYgEdEuWnDagKMHKa99T00=; b=GCSa5AubDISxcg1ou5EXhOiqMUjwFRj1LflgalW3tNCO+RE+cqJBHKV4psB/TrM9EkiCSA7RyD1JYCRZo3pbu0jrNfwTXj7qsWAI5acGAOqgaga9TxOLeEs6QZzh0HHTOcn4P2J/c/x5tUiBIqamr3snjtwBvAEYN/DLGFKryHg=; X-UUID: de921cd6db2a41978b55ff365b257853-20210801 Received: from mtkcas67.mediatek.inc [(172.29.193.45)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 1221207536; Sun, 01 Aug 2021 20:34:45 -0700 Received: from mtkmbs05n2.mediatek.inc (172.21.101.140) by MTKMBS62N1.mediatek.inc (172.29.193.41) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 1 Aug 2021 20:34:43 -0700 Received: from MTKCAS06.mediatek.inc (172.21.101.30) by mtkmbs05n2.mediatek.inc (172.21.101.140) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 2 Aug 2021 11:34:41 +0800 Received: from [172.21.77.4] (172.21.77.4) by MTKCAS06.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Mon, 2 Aug 2021 11:34:41 +0800 Message-ID: <1627875280.15536.4.camel@mtksdaap41> Subject: Re: [PATCH v2 14/14] drm/mediatek: add mediatek-drm of vdosys1 support for MT8195 From: CK Hu To: Nancy.Lin CC: Chun-Kuang Hu , Philipp Zabel , David Airlie , Daniel Vetter , Rob Herring , Matthias Brugger , "jason-jh . lin" , Yongqiang Niu , , , , , , , Date: Mon, 2 Aug 2021 11:34:40 +0800 In-Reply-To: <20210722094551.15255-15-nancy.lin@mediatek.com> References: <20210722094551.15255-1-nancy.lin@mediatek.com> <20210722094551.15255-15-nancy.lin@mediatek.com> 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-20210801_203450_112198_F87B50DD X-CRM114-Status: GOOD ( 29.67 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , 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 Hi, Nancy: On Thu, 2021-07-22 at 17:45 +0800, Nancy.Lin wrote: > Add driver data of mt8195 vdosys1 to mediatek-drm and modify drm for > multi-mmsys support. The two mmsys (vdosys0 and vdosys1) will bring > up two drm drivers, only one drm driver register as the drm device. > Each drm driver binds its own component. The first bind drm driver > will allocate the drm device, and the last bind drm driver registers > the drm device to drm core. Each crtc path is created with the > corresponding drm driver data. > > Signed-off-by: Nancy.Lin > --- > drivers/gpu/drm/mediatek/mtk_disp_merge.c | 4 + > drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 18 +- > drivers/gpu/drm/mediatek/mtk_drm_crtc.h | 3 +- > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 15 + > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 1 + > drivers/gpu/drm/mediatek/mtk_drm_drv.c | 378 ++++++++++++++++---- > drivers/gpu/drm/mediatek/mtk_drm_drv.h | 8 +- > 7 files changed, 356 insertions(+), 71 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_merge.c b/drivers/gpu/drm/mediatek/mtk_disp_merge.c > index 768c282d2d63..829570308761 100644 > --- a/drivers/gpu/drm/mediatek/mtk_disp_merge.c > +++ b/drivers/gpu/drm/mediatek/mtk_disp_merge.c > @@ -4,6 +4,7 @@ > */ > > #include > +#include > #include > #include > #include > @@ -106,6 +107,9 @@ void mtk_merge_stop(struct device *dev) > struct mtk_disp_merge *priv = dev_get_drvdata(dev); > > mtk_ddp_write(NULL, 0x0, &priv->cmdq_reg, priv->regs, DISP_REG_MERGE_CTRL); > + > + if (priv->async_clk) > + device_reset_optional(dev); Move this to the merge patch [1]. [1] https://patchwork.kernel.org/project/linux-mediatek/patch/20210729170737.21424-7-jason-jh.lin@mediatek.com/ > } > > static int mtk_merge_check_params(struct mtk_merge_config_struct *merge_config) > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > index 40df2c823187..3324fa1a9e8c 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > @@ -737,21 +737,28 @@ static int mtk_drm_crtc_init_comp_planes(struct drm_device *drm_dev, > } > > int mtk_drm_crtc_create(struct drm_device *drm_dev, > - const enum mtk_ddp_comp_id *path, unsigned int path_len) > + const enum mtk_ddp_comp_id *path, unsigned int path_len, > + int priv_data_index) > { > struct mtk_drm_private *priv = drm_dev->dev_private; > struct device *dev = drm_dev->dev; > struct mtk_drm_crtc *mtk_crtc; > unsigned int num_comp_planes = 0; > - int pipe = priv->num_pipes; > int ret; > int i; > bool has_ctm = false; > uint gamma_lut_size = 0; > + struct drm_crtc *tmp; > + int crtc_i = 0; > > if (!path) > return 0; > > + priv = priv->all_drm_private[priv_data_index]; > + > + drm_for_each_crtc(tmp, drm_dev) > + crtc_i++; > + > for (i = 0; i < path_len; i++) { > enum mtk_ddp_comp_id comp_id = path[i]; > struct device_node *node; > @@ -760,7 +767,7 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev, > if (!node) { > dev_info(dev, > "Not creating crtc %d because component %d is disabled or missing\n", > - pipe, comp_id); > + crtc_i, comp_id); > return 0; > } > } > @@ -816,19 +823,18 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev, > > for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) { > ret = mtk_drm_crtc_init_comp_planes(drm_dev, mtk_crtc, i, > - pipe); > + crtc_i); > if (ret) > return ret; > } > > - ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, pipe); > + ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, crtc_i); > if (ret < 0) > return ret; > > if (gamma_lut_size) > drm_mode_crtc_set_gamma_size(&mtk_crtc->base, gamma_lut_size); > drm_crtc_enable_color_mgmt(&mtk_crtc->base, 0, has_ctm, gamma_lut_size); > - priv->num_pipes++; > mutex_init(&mtk_crtc->hw_lock); > > #if IS_REACHABLE(CONFIG_MTK_CMDQ) > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h > index 66d1cf03dfe8..0646fafffd8b 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h > +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h > @@ -31,7 +31,8 @@ > void mtk_drm_crtc_commit(struct drm_crtc *crtc); > int mtk_drm_crtc_create(struct drm_device *drm_dev, > const enum mtk_ddp_comp_id *path, > - unsigned int path_len); > + unsigned int path_len, > + int priv_data_index); > int mtk_drm_crtc_plane_check(struct drm_crtc *crtc, struct drm_plane *plane, > struct mtk_plane_state *state); > void mtk_drm_crtc_async_update(struct drm_crtc *crtc, struct drm_plane *plane, > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > index 9125d0f6352f..25f293542f79 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > @@ -355,6 +355,18 @@ static const struct mtk_ddp_comp_funcs ddp_ufoe = { > .start = mtk_ufoe_start, > }; > > +static const struct mtk_ddp_comp_funcs ddp_pseudo_ovl = { > + .clk_enable = mtk_ethdr_clk_enable, > + .clk_disable = mtk_ethdr_clk_disable, > + .config = mtk_ethdr_config, > + .start = mtk_ethdr_start, > + .stop = mtk_ethdr_stop, > + .layer_nr = mtk_ethdr_layer_nr, > + .layer_config = mtk_ethdr_layer_config, > + .enable_vblank = mtk_ethdr_enable_vblank, > + .disable_vblank = mtk_ethdr_disable_vblank, > +}; Move this to the pseudo ovl patch. > + > static const char * const mtk_ddp_comp_stem[MTK_DDP_COMP_TYPE_MAX] = { > [MTK_DISP_OVL] = "ovl", > [MTK_DISP_OVL_2L] = "ovl-2l", > @@ -368,6 +380,7 @@ static const char * const mtk_ddp_comp_stem[MTK_DDP_COMP_TYPE_MAX] = { > [MTK_DISP_UFOE] = "ufoe", > [MTK_DSI] = "dsi", > [MTK_DPI] = "dpi", > + [MTK_DISP_PSEUDO_OVL] = "pseudo_ovl", ditto. > [MTK_DISP_PWM] = "pwm", > [MTK_DISP_MUTEX] = "mutex", > [MTK_DISP_OD] = "od", > @@ -412,6 +425,7 @@ static const struct mtk_ddp_comp_match mtk_ddp_matches[DDP_COMPONENT_ID_MAX] = { > [DDP_COMPONENT_OVL1] = { MTK_DISP_OVL, 1, &ddp_ovl }, > [DDP_COMPONENT_OVL_2L0] = { MTK_DISP_OVL_2L, 0, &ddp_ovl }, > [DDP_COMPONENT_OVL_2L1] = { MTK_DISP_OVL_2L, 1, &ddp_ovl }, > + [DDP_COMPONENT_PSEUDO_OVL] = { MTK_DISP_PSEUDO_OVL, 0, &ddp_pseudo_ovl }, ditto. > [DDP_COMPONENT_PWM0] = { MTK_DISP_PWM, 0, NULL }, > [DDP_COMPONENT_PWM1] = { MTK_DISP_PWM, 1, NULL }, > [DDP_COMPONENT_PWM2] = { MTK_DISP_PWM, 2, NULL }, > @@ -540,6 +554,7 @@ int mtk_ddp_comp_init(struct device_node *node, struct mtk_ddp_comp *comp, > type == MTK_DISP_MERGE || > type == MTK_DISP_OVL || > type == MTK_DISP_OVL_2L || > + type == MTK_DISP_PSEUDO_OVL || ditto. > type == MTK_DISP_PWM || > type == MTK_DISP_RDMA || > type == MTK_DPI || > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h > index 0afd78c0bc92..f2a184b1eceb 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h > @@ -36,6 +36,7 @@ enum mtk_ddp_comp_type { > MTK_DISP_BLS, > MTK_DISP_DSC, > MTK_DISP_MERGE, > + MTK_DISP_PSEUDO_OVL, ditto. > MTK_DDP_COMP_TYPE_MAX, > }; > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c > index 58f9f9f06e94..94527fb040be 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c > @@ -11,6 +11,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -35,6 +36,16 @@ > #define DRIVER_MAJOR 1 > #define DRIVER_MINOR 0 > > +/* duplicate with mmsys private data */ > +struct mtk_mmsys_private { > + void __iomem *regs_reserved; > + struct cmdq_client_reg cmdq_base_reserved; > + void *data_reserved; > + spinlock_t lock_reserved; /* protects mmsys_sw_rst_b reg */ > + struct reset_controller_dev rcdev_reserved; > + void *drm_private; > +}; > + > static const struct drm_mode_config_helper_funcs mtk_drm_mode_config_helpers = { > .atomic_commit_tail = drm_atomic_helper_commit_tail_rpm, > }; > @@ -160,12 +171,20 @@ static const enum mtk_ddp_comp_id mt8195_mtk_ddp_main[] = { > DDP_COMPONENT_DP_INTF0, > }; > > +static const enum mtk_ddp_comp_id mt8195_mtk_ddp_ext[] = { > + DDP_COMPONENT_PSEUDO_OVL, > + DDP_COMPONENT_MERGE5, > + DDP_COMPONENT_DP_INTF1, > +}; > + > static const struct mtk_mmsys_driver_data mt2701_mmsys_driver_data = { > .main_path = mt2701_mtk_ddp_main, > .main_len = ARRAY_SIZE(mt2701_mtk_ddp_main), > .ext_path = mt2701_mtk_ddp_ext, > .ext_len = ARRAY_SIZE(mt2701_mtk_ddp_ext), > .shadow_register = true, > + .mmsys_id = 0, > + .mmsys_dev_num = 1, > }; > > static const struct mtk_mmsys_driver_data mt7623_mmsys_driver_data = { > @@ -174,6 +193,8 @@ static const struct mtk_mmsys_driver_data mt7623_mmsys_driver_data = { > .ext_path = mt7623_mtk_ddp_ext, > .ext_len = ARRAY_SIZE(mt7623_mtk_ddp_ext), > .shadow_register = true, > + .mmsys_id = 0, > + .mmsys_dev_num = 1, > }; > > static const struct mtk_mmsys_driver_data mt2712_mmsys_driver_data = { > @@ -183,6 +204,8 @@ static const struct mtk_mmsys_driver_data mt2712_mmsys_driver_data = { > .ext_len = ARRAY_SIZE(mt2712_mtk_ddp_ext), > .third_path = mt2712_mtk_ddp_third, > .third_len = ARRAY_SIZE(mt2712_mtk_ddp_third), > + .mmsys_id = 0, > + .mmsys_dev_num = 1, > }; > > static const struct mtk_mmsys_driver_data mt8173_mmsys_driver_data = { > @@ -190,6 +213,8 @@ static const struct mtk_mmsys_driver_data mt8173_mmsys_driver_data = { > .main_len = ARRAY_SIZE(mt8173_mtk_ddp_main), > .ext_path = mt8173_mtk_ddp_ext, > .ext_len = ARRAY_SIZE(mt8173_mtk_ddp_ext), > + .mmsys_id = 0, > + .mmsys_dev_num = 1, > }; > > static const struct mtk_mmsys_driver_data mt8183_mmsys_driver_data = { > @@ -197,32 +222,219 @@ static const struct mtk_mmsys_driver_data mt8183_mmsys_driver_data = { > .main_len = ARRAY_SIZE(mt8183_mtk_ddp_main), > .ext_path = mt8183_mtk_ddp_ext, > .ext_len = ARRAY_SIZE(mt8183_mtk_ddp_ext), > + .mmsys_id = 0, > + .mmsys_dev_num = 1, > }; > > static const struct mtk_mmsys_driver_data mt8195_vdosys0_driver_data = { > .main_path = mt8195_mtk_ddp_main, > .main_len = ARRAY_SIZE(mt8195_mtk_ddp_main), > + .mmsys_id = 0, > + .mmsys_dev_num = 2, > +}; > + > +static const struct mtk_mmsys_driver_data mt8195_vdosys1_driver_data = { > + .ext_path = mt8195_mtk_ddp_ext, > + .ext_len = ARRAY_SIZE(mt8195_mtk_ddp_ext), > + .mmsys_id = 1, > + .mmsys_dev_num = 2, > +}; > + > +static const struct of_device_id mtk_drm_of_ids[] = { > + { .compatible = "mediatek,mt2701-mmsys", > + .data = &mt2701_mmsys_driver_data}, > + { .compatible = "mediatek,mt7623-mmsys", > + .data = &mt7623_mmsys_driver_data}, > + { .compatible = "mediatek,mt2712-mmsys", > + .data = &mt2712_mmsys_driver_data}, > + { .compatible = "mediatek,mt8173-mmsys", > + .data = &mt8173_mmsys_driver_data}, > + { .compatible = "mediatek,mt8183-mmsys", > + .data = &mt8183_mmsys_driver_data}, > + { .compatible = "mediatek,mt8195-vdosys0", > + .data = &mt8195_vdosys0_driver_data}, > + { .compatible = "mediatek,mt8195-vdosys1", > + .data = &mt8195_vdosys1_driver_data}, > + { } > }; > +MODULE_DEVICE_TABLE(of, mtk_drm_of_ids); > + > +static int mtk_drm_get_mmsys_priv(struct device *dev, > + struct mtk_drm_private **all_drm_priv, > + int num) > +{ > + struct mtk_drm_private *drm_priv = dev_get_drvdata(dev); > + struct device_node *phandle = dev->parent->of_node; > + const struct of_device_id *of_id; > + struct device_node *node; > + int cnt = 0; > + > + for_each_child_of_node(phandle->parent, node) { > + struct platform_device *pdev; > + struct mtk_mmsys_private *mmsys_priv; > + > + of_id = of_match_node(mtk_drm_of_ids, node); > + if (!of_id) > + continue; > + > + pdev = of_find_device_by_node(node); > + if (!pdev) > + continue; > + > + mmsys_priv = dev_get_drvdata(&pdev->dev); > + if (!mmsys_priv || !mmsys_priv->drm_private) > + continue; > + > + all_drm_priv[cnt++] = mmsys_priv->drm_private; > + if (cnt == num) > + break; > + } > + > + return 0; > +} Move "support multiple mmsys" related code to another patch, and left only mt8195 part in this patch. Regards, CK > + > +static bool mtk_drm_check_last_drm_bind(struct device *dev) > +{ > + struct mtk_drm_private *drm_priv = dev_get_drvdata(dev); > + struct mtk_drm_private *all_drm_priv[MAX_CRTC]; > + int cnt = 0; > + int i; > + > + mtk_drm_get_mmsys_priv(dev, all_drm_priv, drm_priv->data->mmsys_dev_num); > + > + for (i = 0; i < MAX_CRTC; i++) > + if (all_drm_priv[i] && all_drm_priv[i]->mtk_drm_bound) > + cnt++; > + > + return (drm_priv->data->mmsys_dev_num == cnt); > +} > + > +static bool mtk_drm_find_drm_dev(struct device *dev, struct drm_device **drm) > +{ > + struct device_node *phandle = dev->parent->of_node; > + struct mtk_drm_private *drm_priv = dev_get_drvdata(dev); > + struct mtk_drm_private *all_drm_priv[MAX_CRTC]; > + int i; > + > + if (!drm_priv->data->mmsys_dev_num) > + return false; > + > + mtk_drm_get_mmsys_priv(dev, all_drm_priv, drm_priv->data->mmsys_dev_num); > + > + for (i = 0; i < MAX_CRTC; i++) { > + if (all_drm_priv[i] && all_drm_priv[i]->mtk_drm_bound) { > + *drm = all_drm_priv[i]->drm; > + return true; > + } > + } > + > + return false; > +} > + > +static int mtk_drm_setup_all_drm_private(struct device *dev) > +{ > + struct mtk_drm_private *drm_priv = dev_get_drvdata(dev); > + struct mtk_drm_private *all_drm_priv[MAX_CRTC]; > + int mmsys_dev_num = drm_priv->data->mmsys_dev_num; > + int i; > + int j; > + > + mtk_drm_get_mmsys_priv(dev, all_drm_priv, mmsys_dev_num); > + > + for (i = 0; i < mmsys_dev_num; i++) > + for (j = 0; j < mmsys_dev_num; j++) > + all_drm_priv[j]->all_drm_private[i] = all_drm_priv[i]; > + > + return 0; > +} > + > +static bool mtk_drm_find_mmsys_comp(struct mtk_drm_private *private, int comp_id) > +{ > + const struct mtk_mmsys_driver_data *drv_data = private->data; > + int ret = false; > + int i; > + > + if (drv_data->mmsys_dev_num == 1) > + return true; > + > + if (drv_data->main_path) { > + for (i = 0; i < drv_data->main_len; i++) > + if (drv_data->main_path[i] == comp_id) > + ret |= true; > + > + if (i == drv_data->main_len) > + ret |= false; > + } > + > + if (drv_data->ext_path) { > + for (i = 0; i < drv_data->ext_len; i++) > + if (drv_data->ext_path[i] == comp_id) > + ret |= true; > + > + if (i == drv_data->ext_len) > + ret |= false; > + } > + > + if (drv_data->third_path) { > + for (i = 0; i < drv_data->third_len; i++) > + if (drv_data->third_path[i] == comp_id) > + ret |= true; > + > + if (i == drv_data->third_len) > + ret |= false; > + } > + > + return ret; > +} > + > +static int mtk_drm_check_mutex_dev(struct mtk_drm_private *private) > +{ > + struct platform_device *pdev; > + struct mtk_drm_private *priv_i; > + int ret; > + int i; > + > + for (i = 0; i < private->data->mmsys_dev_num; i++) { > + priv_i = private->all_drm_private[i]; > + > + pdev = of_find_device_by_node(priv_i->mutex_node); > + if (!pdev) { > + dev_err(priv_i->dev, "Waiting for disp-mutex device %pOF\n", > + priv_i->mutex_node); > + ret = -EPROBE_DEFER; > + goto err_put_mutex; > + } > + priv_i->mutex_dev = &pdev->dev; > + } > + > + return 0; > + > +err_put_mutex: > + for (i = 0; i < private->data->mmsys_dev_num; i++) { > + priv_i = private->all_drm_private[i]; > + of_node_put(priv_i->mutex_node); > + } > + > + return ret; > +} > > static int mtk_drm_kms_init(struct drm_device *drm) > { > struct mtk_drm_private *private = drm->dev_private; > + struct mtk_drm_private *priv_n; > struct platform_device *pdev; > - struct device_node *np; > + struct device_node *np = NULL; > struct device *dma_dev; > int ret; > + int i; > + int j; > > if (!iommu_present(&platform_bus_type)) > return -EPROBE_DEFER; > > - pdev = of_find_device_by_node(private->mutex_node); > - if (!pdev) { > - dev_err(drm->dev, "Waiting for disp-mutex device %pOF\n", > - private->mutex_node); > - of_node_put(private->mutex_node); > - return -EPROBE_DEFER; > - } > - private->mutex_dev = &pdev->dev; > + ret = mtk_drm_check_mutex_dev(private); > + if (ret) > + return ret; > > ret = drmm_mode_config_init(drm); > if (ret) > @@ -241,33 +453,57 @@ static int mtk_drm_kms_init(struct drm_device *drm) > drm->mode_config.funcs = &mtk_drm_mode_config_funcs; > drm->mode_config.helper_private = &mtk_drm_mode_config_helpers; > > - ret = component_bind_all(drm->dev, drm); > + for (i = 0; i < private->data->mmsys_dev_num; i++) { > + drm->dev_private = private->all_drm_private[i]; > + ret = component_bind_all(private->all_drm_private[i]->dev, drm); > if (ret) > goto put_mutex_dev; > + } > > /* > * We currently support two fixed data streams, each optional, > * and each statically assigned to a crtc: > * OVL0 -> COLOR0 -> AAL -> OD -> RDMA0 -> UFOE -> DSI0 ... > */ > - ret = mtk_drm_crtc_create(drm, private->data->main_path, > - private->data->main_len); > - if (ret < 0) > - goto err_component_unbind; > - /* ... and OVL1 -> COLOR1 -> GAMMA -> RDMA1 -> DPI0. */ > - ret = mtk_drm_crtc_create(drm, private->data->ext_path, > - private->data->ext_len); > - if (ret < 0) > - goto err_component_unbind; > - > - ret = mtk_drm_crtc_create(drm, private->data->third_path, > - private->data->third_len); > - if (ret < 0) > - goto err_component_unbind; > + for (i = 0; i < MAX_CRTC; i++) { > + for (j = 0; j < private->data->mmsys_dev_num; j++) { > + priv_n = private->all_drm_private[j]; > + > + if (i == 0 && priv_n->data->main_len) { > + ret = mtk_drm_crtc_create(drm, priv_n->data->main_path, > + priv_n->data->main_len, j); > + if (ret) > + goto err_component_unbind; > + > + if (!np) > + np = priv_n->comp_node[priv_n->data->main_path[0]]; > + > + continue; > + } else if (i == 1 && priv_n->data->ext_len) { > + ret = mtk_drm_crtc_create(drm, priv_n->data->ext_path, > + priv_n->data->ext_len, j); > + if (ret) > + goto err_component_unbind; > + > + if (!np) > + np = priv_n->comp_node[priv_n->data->ext_path[0]]; > + > + continue; > + } else if (i == 2 && priv_n->data->third_len) { > + ret = mtk_drm_crtc_create(drm, priv_n->data->third_path, > + priv_n->data->third_len, j); > + if (ret) > + goto err_component_unbind; > + > + if (!np) > + np = priv_n->comp_node[priv_n->data->third_path[0]]; > + > + continue; > + } > + } > + } > > /* Use OVL device for all DMA memory allocations */ > - np = private->comp_node[private->data->main_path[0]] ?: > - private->comp_node[private->data->ext_path[0]]; > pdev = of_find_device_by_node(np); > if (!pdev) { > ret = -ENODEV; > @@ -276,13 +512,15 @@ static int mtk_drm_kms_init(struct drm_device *drm) > } > > dma_dev = &pdev->dev; > - private->dma_dev = dma_dev; > + for (i = 0; i < private->data->mmsys_dev_num; i++) > + private->all_drm_private[i]->dma_dev = dma_dev; > > /* > * Configure the DMA segment size to make sure we get contiguous IOVA > * when importing PRIME buffers. > */ > ret = dma_set_max_seg_size(dma_dev, UINT_MAX); > + > if (ret) { > dev_err(dma_dev, "Failed to set DMA segment size\n"); > goto err_component_unbind; > @@ -304,9 +542,12 @@ static int mtk_drm_kms_init(struct drm_device *drm) > return 0; > > err_component_unbind: > - component_unbind_all(drm->dev, drm); > + for (i = 0; i < private->data->mmsys_dev_num; i++) > + component_unbind_all(private->all_drm_private[i]->dev, drm); > put_mutex_dev: > - put_device(private->mutex_dev); > + for (i = 0; i < private->data->mmsys_dev_num; i++) > + put_device(private->all_drm_private[i]->mutex_dev); > + > return ret; > } > > @@ -371,12 +612,21 @@ static int mtk_drm_bind(struct device *dev) > struct drm_device *drm; > int ret; > > - drm = drm_dev_alloc(&mtk_drm_driver, dev); > - if (IS_ERR(drm)) > - return PTR_ERR(drm); > + if (!mtk_drm_find_drm_dev(dev, &drm)) { > + drm = drm_dev_alloc(&mtk_drm_driver, dev); > + if (IS_ERR(drm)) > + return PTR_ERR(drm); > + drm->dev_private = private; > + } > > - drm->dev_private = private; > + private->dev = dev; > private->drm = drm; > + private->mtk_drm_bound = true; > + > + if (!mtk_drm_check_last_drm_bind(dev)) > + return 0; > + > + mtk_drm_setup_all_drm_private(dev); > > ret = mtk_drm_kms_init(drm); > if (ret < 0) > @@ -401,10 +651,13 @@ static void mtk_drm_unbind(struct device *dev) > { > struct mtk_drm_private *private = dev_get_drvdata(dev); > > - drm_dev_unregister(private->drm); > - mtk_drm_kms_deinit(private->drm); > - drm_dev_put(private->drm); > - private->num_pipes = 0; > + /* for multi mmsys dev, unregister drm dev in mmsys master */ > + if (private->data->mmsys_id == 0) { > + drm_dev_unregister(private->drm); > + mtk_drm_kms_deinit(private->drm); > + drm_dev_put(private->drm); > + } > + private->mtk_drm_bound = false; > private->drm = NULL; > } > > @@ -485,49 +738,42 @@ static const struct of_device_id mtk_ddp_comp_dt_ids[] = { > { } > }; > > -static const struct of_device_id mtk_drm_of_ids[] = { > - { .compatible = "mediatek,mt2701-mmsys", > - .data = &mt2701_mmsys_driver_data}, > - { .compatible = "mediatek,mt7623-mmsys", > - .data = &mt7623_mmsys_driver_data}, > - { .compatible = "mediatek,mt2712-mmsys", > - .data = &mt2712_mmsys_driver_data}, > - { .compatible = "mediatek,mt8173-mmsys", > - .data = &mt8173_mmsys_driver_data}, > - { .compatible = "mediatek,mt8183-mmsys", > - .data = &mt8183_mmsys_driver_data}, > - {.compatible = "mediatek,mt8195-vdosys0", > - .data = &mt8195_vdosys0_driver_data}, > - { } > -}; > -MODULE_DEVICE_TABLE(of, mtk_drm_of_ids); > - > static int mtk_drm_probe(struct platform_device *pdev) > { > struct device *dev = &pdev->dev; > struct device_node *phandle = dev->parent->of_node; > const struct of_device_id *of_id; > + const struct mtk_mmsys_driver_data *drv_data; > struct mtk_drm_private *private; > struct device_node *node; > struct component_match *match = NULL; > + struct mtk_mmsys_private *mmsys_priv; > int ret; > int i; > > + of_id = of_match_node(mtk_drm_of_ids, phandle); > + if (!of_id) > + return -ENODEV; > + > + drv_data = of_id->data; > private = devm_kzalloc(dev, sizeof(*private), GFP_KERNEL); > if (!private) > return -ENOMEM; > > + private->all_drm_private = devm_kmalloc_array(dev, drv_data->mmsys_dev_num, > + sizeof(*private->all_drm_private), > + GFP_KERNEL); > + if (!private->all_drm_private) > + return -ENOMEM; > + > + private->data = drv_data; > private->mmsys_dev = dev->parent; > if (!private->mmsys_dev) { > dev_err(dev, "Failed to get MMSYS device\n"); > return -ENODEV; > } > - > - of_id = of_match_node(mtk_drm_of_ids, phandle); > - if (!of_id) > - return -ENODEV; > - > - private->data = of_id->data; > + mmsys_priv = dev_get_drvdata(private->mmsys_dev); > + mmsys_priv->drm_private = private; > > /* Iterate over sibling DISP function blocks */ > for_each_child_of_node(phandle->parent, node) { > @@ -548,7 +794,13 @@ static int mtk_drm_probe(struct platform_device *pdev) > comp_type = (enum mtk_ddp_comp_type)of_id->data; > > if (comp_type == MTK_DISP_MUTEX) { > - private->mutex_node = of_node_get(node); > + int id; > + > + id = of_alias_get_id(node, "mutex"); > + if (id < 0 || id == drv_data->mmsys_id) { > + private->mutex_node = of_node_get(node); > + dev_dbg(dev, "get mutex for mmsys %d", drv_data->mmsys_id); > + } > continue; > } > > @@ -559,6 +811,9 @@ static int mtk_drm_probe(struct platform_device *pdev) > continue; > } > > + if (!mtk_drm_find_mmsys_comp(private, comp_id)) > + continue; > + > private->comp_node[comp_id] = of_node_get(node); > > /* > @@ -573,6 +828,7 @@ static int mtk_drm_probe(struct platform_device *pdev) > comp_type == MTK_DISP_MERGE || > comp_type == MTK_DISP_OVL || > comp_type == MTK_DISP_OVL_2L || > + comp_type == MTK_DISP_PSEUDO_OVL || > comp_type == MTK_DISP_RDMA || > comp_type == MTK_DPI || > comp_type == MTK_DSI) { > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h b/drivers/gpu/drm/mediatek/mtk_drm_drv.h > index c87ebb5309d0..212e4f87c35c 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h > @@ -29,14 +29,15 @@ struct mtk_mmsys_driver_data { > unsigned int third_len; > > bool shadow_register; > + unsigned int mmsys_id; > + unsigned int mmsys_dev_num; > }; > > struct mtk_drm_private { > struct drm_device *drm; > struct device *dma_dev; > - > - unsigned int num_pipes; > - > + bool mtk_drm_bound; > + struct device *dev; > struct device_node *mutex_node; > struct device *mutex_dev; > struct device *mmsys_dev; > @@ -44,6 +45,7 @@ struct mtk_drm_private { > struct mtk_ddp_comp ddp_comp[DDP_COMPONENT_ID_MAX]; > const struct mtk_mmsys_driver_data *data; > struct drm_atomic_state *suspend_state; > + struct mtk_drm_private **all_drm_private; > }; > > extern struct platform_driver mtk_disp_ccorr_driver; _______________________________________________ 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=-15.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, URIBL_BLOCKED,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 256D4C4338F for ; Mon, 2 Aug 2021 03:37:08 +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 E346460F6E for ; Mon, 2 Aug 2021 03:37:07 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org E346460F6E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:CC: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=oioTwgI6/XJctNXMCM7ISD4PDfDuw7jABkgqqF+anEU=; b=JR/EHxP7YmL6OV 6bAShEr0cCd+tqZyDv/GMrlcnFR/dYh1D3QmjZUFWo1jObysRstK+uix9iSnM7pcgPK53eacl5L45 GDZjEcHLoFYmAHFdzS8z9ML4cDGnrEwNh/KemoAQ14C+2V5nL1WeuDxyB1xAhAcTTniF8FLkZcv5X PrBbWwoCLFO2g0igGQLpYPIq0aY9Gjxff4sAybe/WfCiPFXKuxoU1Q4IW5ZD/0gI5zFdNe3kcIaLR 3TJOGV/whxlLCxqhEurJEsW11yRUH7UGqM9V32XHZRzYQ5JFPgZP8qPDUn6Z7+YqRSHu0xxz3Zf9g RzITPX4j0VvnOCHlHOgA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mAOjB-00EqCJ-4s; Mon, 02 Aug 2021 03:34:57 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mAOj3-00EqAL-WC; Mon, 02 Aug 2021 03:34:53 +0000 X-UUID: de921cd6db2a41978b55ff365b257853-20210801 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=UpfEaLGXWwDvxkBt/ER6jVYgEdEuWnDagKMHKa99T00=; b=GCSa5AubDISxcg1ou5EXhOiqMUjwFRj1LflgalW3tNCO+RE+cqJBHKV4psB/TrM9EkiCSA7RyD1JYCRZo3pbu0jrNfwTXj7qsWAI5acGAOqgaga9TxOLeEs6QZzh0HHTOcn4P2J/c/x5tUiBIqamr3snjtwBvAEYN/DLGFKryHg=; X-UUID: de921cd6db2a41978b55ff365b257853-20210801 Received: from mtkcas67.mediatek.inc [(172.29.193.45)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 1221207536; Sun, 01 Aug 2021 20:34:45 -0700 Received: from mtkmbs05n2.mediatek.inc (172.21.101.140) by MTKMBS62N1.mediatek.inc (172.29.193.41) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 1 Aug 2021 20:34:43 -0700 Received: from MTKCAS06.mediatek.inc (172.21.101.30) by mtkmbs05n2.mediatek.inc (172.21.101.140) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 2 Aug 2021 11:34:41 +0800 Received: from [172.21.77.4] (172.21.77.4) by MTKCAS06.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Mon, 2 Aug 2021 11:34:41 +0800 Message-ID: <1627875280.15536.4.camel@mtksdaap41> Subject: Re: [PATCH v2 14/14] drm/mediatek: add mediatek-drm of vdosys1 support for MT8195 From: CK Hu To: Nancy.Lin CC: Chun-Kuang Hu , Philipp Zabel , David Airlie , Daniel Vetter , Rob Herring , Matthias Brugger , "jason-jh . lin" , Yongqiang Niu , , , , , , , Date: Mon, 2 Aug 2021 11:34:40 +0800 In-Reply-To: <20210722094551.15255-15-nancy.lin@mediatek.com> References: <20210722094551.15255-1-nancy.lin@mediatek.com> <20210722094551.15255-15-nancy.lin@mediatek.com> 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-20210801_203450_112198_F87B50DD X-CRM114-Status: GOOD ( 29.67 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi, Nancy: On Thu, 2021-07-22 at 17:45 +0800, Nancy.Lin wrote: > Add driver data of mt8195 vdosys1 to mediatek-drm and modify drm for > multi-mmsys support. The two mmsys (vdosys0 and vdosys1) will bring > up two drm drivers, only one drm driver register as the drm device. > Each drm driver binds its own component. The first bind drm driver > will allocate the drm device, and the last bind drm driver registers > the drm device to drm core. Each crtc path is created with the > corresponding drm driver data. > > Signed-off-by: Nancy.Lin > --- > drivers/gpu/drm/mediatek/mtk_disp_merge.c | 4 + > drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 18 +- > drivers/gpu/drm/mediatek/mtk_drm_crtc.h | 3 +- > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 15 + > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 1 + > drivers/gpu/drm/mediatek/mtk_drm_drv.c | 378 ++++++++++++++++---- > drivers/gpu/drm/mediatek/mtk_drm_drv.h | 8 +- > 7 files changed, 356 insertions(+), 71 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_merge.c b/drivers/gpu/drm/mediatek/mtk_disp_merge.c > index 768c282d2d63..829570308761 100644 > --- a/drivers/gpu/drm/mediatek/mtk_disp_merge.c > +++ b/drivers/gpu/drm/mediatek/mtk_disp_merge.c > @@ -4,6 +4,7 @@ > */ > > #include > +#include > #include > #include > #include > @@ -106,6 +107,9 @@ void mtk_merge_stop(struct device *dev) > struct mtk_disp_merge *priv = dev_get_drvdata(dev); > > mtk_ddp_write(NULL, 0x0, &priv->cmdq_reg, priv->regs, DISP_REG_MERGE_CTRL); > + > + if (priv->async_clk) > + device_reset_optional(dev); Move this to the merge patch [1]. [1] https://patchwork.kernel.org/project/linux-mediatek/patch/20210729170737.21424-7-jason-jh.lin@mediatek.com/ > } > > static int mtk_merge_check_params(struct mtk_merge_config_struct *merge_config) > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > index 40df2c823187..3324fa1a9e8c 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c > @@ -737,21 +737,28 @@ static int mtk_drm_crtc_init_comp_planes(struct drm_device *drm_dev, > } > > int mtk_drm_crtc_create(struct drm_device *drm_dev, > - const enum mtk_ddp_comp_id *path, unsigned int path_len) > + const enum mtk_ddp_comp_id *path, unsigned int path_len, > + int priv_data_index) > { > struct mtk_drm_private *priv = drm_dev->dev_private; > struct device *dev = drm_dev->dev; > struct mtk_drm_crtc *mtk_crtc; > unsigned int num_comp_planes = 0; > - int pipe = priv->num_pipes; > int ret; > int i; > bool has_ctm = false; > uint gamma_lut_size = 0; > + struct drm_crtc *tmp; > + int crtc_i = 0; > > if (!path) > return 0; > > + priv = priv->all_drm_private[priv_data_index]; > + > + drm_for_each_crtc(tmp, drm_dev) > + crtc_i++; > + > for (i = 0; i < path_len; i++) { > enum mtk_ddp_comp_id comp_id = path[i]; > struct device_node *node; > @@ -760,7 +767,7 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev, > if (!node) { > dev_info(dev, > "Not creating crtc %d because component %d is disabled or missing\n", > - pipe, comp_id); > + crtc_i, comp_id); > return 0; > } > } > @@ -816,19 +823,18 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev, > > for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) { > ret = mtk_drm_crtc_init_comp_planes(drm_dev, mtk_crtc, i, > - pipe); > + crtc_i); > if (ret) > return ret; > } > > - ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, pipe); > + ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, crtc_i); > if (ret < 0) > return ret; > > if (gamma_lut_size) > drm_mode_crtc_set_gamma_size(&mtk_crtc->base, gamma_lut_size); > drm_crtc_enable_color_mgmt(&mtk_crtc->base, 0, has_ctm, gamma_lut_size); > - priv->num_pipes++; > mutex_init(&mtk_crtc->hw_lock); > > #if IS_REACHABLE(CONFIG_MTK_CMDQ) > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h > index 66d1cf03dfe8..0646fafffd8b 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h > +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h > @@ -31,7 +31,8 @@ > void mtk_drm_crtc_commit(struct drm_crtc *crtc); > int mtk_drm_crtc_create(struct drm_device *drm_dev, > const enum mtk_ddp_comp_id *path, > - unsigned int path_len); > + unsigned int path_len, > + int priv_data_index); > int mtk_drm_crtc_plane_check(struct drm_crtc *crtc, struct drm_plane *plane, > struct mtk_plane_state *state); > void mtk_drm_crtc_async_update(struct drm_crtc *crtc, struct drm_plane *plane, > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > index 9125d0f6352f..25f293542f79 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > @@ -355,6 +355,18 @@ static const struct mtk_ddp_comp_funcs ddp_ufoe = { > .start = mtk_ufoe_start, > }; > > +static const struct mtk_ddp_comp_funcs ddp_pseudo_ovl = { > + .clk_enable = mtk_ethdr_clk_enable, > + .clk_disable = mtk_ethdr_clk_disable, > + .config = mtk_ethdr_config, > + .start = mtk_ethdr_start, > + .stop = mtk_ethdr_stop, > + .layer_nr = mtk_ethdr_layer_nr, > + .layer_config = mtk_ethdr_layer_config, > + .enable_vblank = mtk_ethdr_enable_vblank, > + .disable_vblank = mtk_ethdr_disable_vblank, > +}; Move this to the pseudo ovl patch. > + > static const char * const mtk_ddp_comp_stem[MTK_DDP_COMP_TYPE_MAX] = { > [MTK_DISP_OVL] = "ovl", > [MTK_DISP_OVL_2L] = "ovl-2l", > @@ -368,6 +380,7 @@ static const char * const mtk_ddp_comp_stem[MTK_DDP_COMP_TYPE_MAX] = { > [MTK_DISP_UFOE] = "ufoe", > [MTK_DSI] = "dsi", > [MTK_DPI] = "dpi", > + [MTK_DISP_PSEUDO_OVL] = "pseudo_ovl", ditto. > [MTK_DISP_PWM] = "pwm", > [MTK_DISP_MUTEX] = "mutex", > [MTK_DISP_OD] = "od", > @@ -412,6 +425,7 @@ static const struct mtk_ddp_comp_match mtk_ddp_matches[DDP_COMPONENT_ID_MAX] = { > [DDP_COMPONENT_OVL1] = { MTK_DISP_OVL, 1, &ddp_ovl }, > [DDP_COMPONENT_OVL_2L0] = { MTK_DISP_OVL_2L, 0, &ddp_ovl }, > [DDP_COMPONENT_OVL_2L1] = { MTK_DISP_OVL_2L, 1, &ddp_ovl }, > + [DDP_COMPONENT_PSEUDO_OVL] = { MTK_DISP_PSEUDO_OVL, 0, &ddp_pseudo_ovl }, ditto. > [DDP_COMPONENT_PWM0] = { MTK_DISP_PWM, 0, NULL }, > [DDP_COMPONENT_PWM1] = { MTK_DISP_PWM, 1, NULL }, > [DDP_COMPONENT_PWM2] = { MTK_DISP_PWM, 2, NULL }, > @@ -540,6 +554,7 @@ int mtk_ddp_comp_init(struct device_node *node, struct mtk_ddp_comp *comp, > type == MTK_DISP_MERGE || > type == MTK_DISP_OVL || > type == MTK_DISP_OVL_2L || > + type == MTK_DISP_PSEUDO_OVL || ditto. > type == MTK_DISP_PWM || > type == MTK_DISP_RDMA || > type == MTK_DPI || > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h > index 0afd78c0bc92..f2a184b1eceb 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h > @@ -36,6 +36,7 @@ enum mtk_ddp_comp_type { > MTK_DISP_BLS, > MTK_DISP_DSC, > MTK_DISP_MERGE, > + MTK_DISP_PSEUDO_OVL, ditto. > MTK_DDP_COMP_TYPE_MAX, > }; > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c > index 58f9f9f06e94..94527fb040be 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c > @@ -11,6 +11,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -35,6 +36,16 @@ > #define DRIVER_MAJOR 1 > #define DRIVER_MINOR 0 > > +/* duplicate with mmsys private data */ > +struct mtk_mmsys_private { > + void __iomem *regs_reserved; > + struct cmdq_client_reg cmdq_base_reserved; > + void *data_reserved; > + spinlock_t lock_reserved; /* protects mmsys_sw_rst_b reg */ > + struct reset_controller_dev rcdev_reserved; > + void *drm_private; > +}; > + > static const struct drm_mode_config_helper_funcs mtk_drm_mode_config_helpers = { > .atomic_commit_tail = drm_atomic_helper_commit_tail_rpm, > }; > @@ -160,12 +171,20 @@ static const enum mtk_ddp_comp_id mt8195_mtk_ddp_main[] = { > DDP_COMPONENT_DP_INTF0, > }; > > +static const enum mtk_ddp_comp_id mt8195_mtk_ddp_ext[] = { > + DDP_COMPONENT_PSEUDO_OVL, > + DDP_COMPONENT_MERGE5, > + DDP_COMPONENT_DP_INTF1, > +}; > + > static const struct mtk_mmsys_driver_data mt2701_mmsys_driver_data = { > .main_path = mt2701_mtk_ddp_main, > .main_len = ARRAY_SIZE(mt2701_mtk_ddp_main), > .ext_path = mt2701_mtk_ddp_ext, > .ext_len = ARRAY_SIZE(mt2701_mtk_ddp_ext), > .shadow_register = true, > + .mmsys_id = 0, > + .mmsys_dev_num = 1, > }; > > static const struct mtk_mmsys_driver_data mt7623_mmsys_driver_data = { > @@ -174,6 +193,8 @@ static const struct mtk_mmsys_driver_data mt7623_mmsys_driver_data = { > .ext_path = mt7623_mtk_ddp_ext, > .ext_len = ARRAY_SIZE(mt7623_mtk_ddp_ext), > .shadow_register = true, > + .mmsys_id = 0, > + .mmsys_dev_num = 1, > }; > > static const struct mtk_mmsys_driver_data mt2712_mmsys_driver_data = { > @@ -183,6 +204,8 @@ static const struct mtk_mmsys_driver_data mt2712_mmsys_driver_data = { > .ext_len = ARRAY_SIZE(mt2712_mtk_ddp_ext), > .third_path = mt2712_mtk_ddp_third, > .third_len = ARRAY_SIZE(mt2712_mtk_ddp_third), > + .mmsys_id = 0, > + .mmsys_dev_num = 1, > }; > > static const struct mtk_mmsys_driver_data mt8173_mmsys_driver_data = { > @@ -190,6 +213,8 @@ static const struct mtk_mmsys_driver_data mt8173_mmsys_driver_data = { > .main_len = ARRAY_SIZE(mt8173_mtk_ddp_main), > .ext_path = mt8173_mtk_ddp_ext, > .ext_len = ARRAY_SIZE(mt8173_mtk_ddp_ext), > + .mmsys_id = 0, > + .mmsys_dev_num = 1, > }; > > static const struct mtk_mmsys_driver_data mt8183_mmsys_driver_data = { > @@ -197,32 +222,219 @@ static const struct mtk_mmsys_driver_data mt8183_mmsys_driver_data = { > .main_len = ARRAY_SIZE(mt8183_mtk_ddp_main), > .ext_path = mt8183_mtk_ddp_ext, > .ext_len = ARRAY_SIZE(mt8183_mtk_ddp_ext), > + .mmsys_id = 0, > + .mmsys_dev_num = 1, > }; > > static const struct mtk_mmsys_driver_data mt8195_vdosys0_driver_data = { > .main_path = mt8195_mtk_ddp_main, > .main_len = ARRAY_SIZE(mt8195_mtk_ddp_main), > + .mmsys_id = 0, > + .mmsys_dev_num = 2, > +}; > + > +static const struct mtk_mmsys_driver_data mt8195_vdosys1_driver_data = { > + .ext_path = mt8195_mtk_ddp_ext, > + .ext_len = ARRAY_SIZE(mt8195_mtk_ddp_ext), > + .mmsys_id = 1, > + .mmsys_dev_num = 2, > +}; > + > +static const struct of_device_id mtk_drm_of_ids[] = { > + { .compatible = "mediatek,mt2701-mmsys", > + .data = &mt2701_mmsys_driver_data}, > + { .compatible = "mediatek,mt7623-mmsys", > + .data = &mt7623_mmsys_driver_data}, > + { .compatible = "mediatek,mt2712-mmsys", > + .data = &mt2712_mmsys_driver_data}, > + { .compatible = "mediatek,mt8173-mmsys", > + .data = &mt8173_mmsys_driver_data}, > + { .compatible = "mediatek,mt8183-mmsys", > + .data = &mt8183_mmsys_driver_data}, > + { .compatible = "mediatek,mt8195-vdosys0", > + .data = &mt8195_vdosys0_driver_data}, > + { .compatible = "mediatek,mt8195-vdosys1", > + .data = &mt8195_vdosys1_driver_data}, > + { } > }; > +MODULE_DEVICE_TABLE(of, mtk_drm_of_ids); > + > +static int mtk_drm_get_mmsys_priv(struct device *dev, > + struct mtk_drm_private **all_drm_priv, > + int num) > +{ > + struct mtk_drm_private *drm_priv = dev_get_drvdata(dev); > + struct device_node *phandle = dev->parent->of_node; > + const struct of_device_id *of_id; > + struct device_node *node; > + int cnt = 0; > + > + for_each_child_of_node(phandle->parent, node) { > + struct platform_device *pdev; > + struct mtk_mmsys_private *mmsys_priv; > + > + of_id = of_match_node(mtk_drm_of_ids, node); > + if (!of_id) > + continue; > + > + pdev = of_find_device_by_node(node); > + if (!pdev) > + continue; > + > + mmsys_priv = dev_get_drvdata(&pdev->dev); > + if (!mmsys_priv || !mmsys_priv->drm_private) > + continue; > + > + all_drm_priv[cnt++] = mmsys_priv->drm_private; > + if (cnt == num) > + break; > + } > + > + return 0; > +} Move "support multiple mmsys" related code to another patch, and left only mt8195 part in this patch. Regards, CK > + > +static bool mtk_drm_check_last_drm_bind(struct device *dev) > +{ > + struct mtk_drm_private *drm_priv = dev_get_drvdata(dev); > + struct mtk_drm_private *all_drm_priv[MAX_CRTC]; > + int cnt = 0; > + int i; > + > + mtk_drm_get_mmsys_priv(dev, all_drm_priv, drm_priv->data->mmsys_dev_num); > + > + for (i = 0; i < MAX_CRTC; i++) > + if (all_drm_priv[i] && all_drm_priv[i]->mtk_drm_bound) > + cnt++; > + > + return (drm_priv->data->mmsys_dev_num == cnt); > +} > + > +static bool mtk_drm_find_drm_dev(struct device *dev, struct drm_device **drm) > +{ > + struct device_node *phandle = dev->parent->of_node; > + struct mtk_drm_private *drm_priv = dev_get_drvdata(dev); > + struct mtk_drm_private *all_drm_priv[MAX_CRTC]; > + int i; > + > + if (!drm_priv->data->mmsys_dev_num) > + return false; > + > + mtk_drm_get_mmsys_priv(dev, all_drm_priv, drm_priv->data->mmsys_dev_num); > + > + for (i = 0; i < MAX_CRTC; i++) { > + if (all_drm_priv[i] && all_drm_priv[i]->mtk_drm_bound) { > + *drm = all_drm_priv[i]->drm; > + return true; > + } > + } > + > + return false; > +} > + > +static int mtk_drm_setup_all_drm_private(struct device *dev) > +{ > + struct mtk_drm_private *drm_priv = dev_get_drvdata(dev); > + struct mtk_drm_private *all_drm_priv[MAX_CRTC]; > + int mmsys_dev_num = drm_priv->data->mmsys_dev_num; > + int i; > + int j; > + > + mtk_drm_get_mmsys_priv(dev, all_drm_priv, mmsys_dev_num); > + > + for (i = 0; i < mmsys_dev_num; i++) > + for (j = 0; j < mmsys_dev_num; j++) > + all_drm_priv[j]->all_drm_private[i] = all_drm_priv[i]; > + > + return 0; > +} > + > +static bool mtk_drm_find_mmsys_comp(struct mtk_drm_private *private, int comp_id) > +{ > + const struct mtk_mmsys_driver_data *drv_data = private->data; > + int ret = false; > + int i; > + > + if (drv_data->mmsys_dev_num == 1) > + return true; > + > + if (drv_data->main_path) { > + for (i = 0; i < drv_data->main_len; i++) > + if (drv_data->main_path[i] == comp_id) > + ret |= true; > + > + if (i == drv_data->main_len) > + ret |= false; > + } > + > + if (drv_data->ext_path) { > + for (i = 0; i < drv_data->ext_len; i++) > + if (drv_data->ext_path[i] == comp_id) > + ret |= true; > + > + if (i == drv_data->ext_len) > + ret |= false; > + } > + > + if (drv_data->third_path) { > + for (i = 0; i < drv_data->third_len; i++) > + if (drv_data->third_path[i] == comp_id) > + ret |= true; > + > + if (i == drv_data->third_len) > + ret |= false; > + } > + > + return ret; > +} > + > +static int mtk_drm_check_mutex_dev(struct mtk_drm_private *private) > +{ > + struct platform_device *pdev; > + struct mtk_drm_private *priv_i; > + int ret; > + int i; > + > + for (i = 0; i < private->data->mmsys_dev_num; i++) { > + priv_i = private->all_drm_private[i]; > + > + pdev = of_find_device_by_node(priv_i->mutex_node); > + if (!pdev) { > + dev_err(priv_i->dev, "Waiting for disp-mutex device %pOF\n", > + priv_i->mutex_node); > + ret = -EPROBE_DEFER; > + goto err_put_mutex; > + } > + priv_i->mutex_dev = &pdev->dev; > + } > + > + return 0; > + > +err_put_mutex: > + for (i = 0; i < private->data->mmsys_dev_num; i++) { > + priv_i = private->all_drm_private[i]; > + of_node_put(priv_i->mutex_node); > + } > + > + return ret; > +} > > static int mtk_drm_kms_init(struct drm_device *drm) > { > struct mtk_drm_private *private = drm->dev_private; > + struct mtk_drm_private *priv_n; > struct platform_device *pdev; > - struct device_node *np; > + struct device_node *np = NULL; > struct device *dma_dev; > int ret; > + int i; > + int j; > > if (!iommu_present(&platform_bus_type)) > return -EPROBE_DEFER; > > - pdev = of_find_device_by_node(private->mutex_node); > - if (!pdev) { > - dev_err(drm->dev, "Waiting for disp-mutex device %pOF\n", > - private->mutex_node); > - of_node_put(private->mutex_node); > - return -EPROBE_DEFER; > - } > - private->mutex_dev = &pdev->dev; > + ret = mtk_drm_check_mutex_dev(private); > + if (ret) > + return ret; > > ret = drmm_mode_config_init(drm); > if (ret) > @@ -241,33 +453,57 @@ static int mtk_drm_kms_init(struct drm_device *drm) > drm->mode_config.funcs = &mtk_drm_mode_config_funcs; > drm->mode_config.helper_private = &mtk_drm_mode_config_helpers; > > - ret = component_bind_all(drm->dev, drm); > + for (i = 0; i < private->data->mmsys_dev_num; i++) { > + drm->dev_private = private->all_drm_private[i]; > + ret = component_bind_all(private->all_drm_private[i]->dev, drm); > if (ret) > goto put_mutex_dev; > + } > > /* > * We currently support two fixed data streams, each optional, > * and each statically assigned to a crtc: > * OVL0 -> COLOR0 -> AAL -> OD -> RDMA0 -> UFOE -> DSI0 ... > */ > - ret = mtk_drm_crtc_create(drm, private->data->main_path, > - private->data->main_len); > - if (ret < 0) > - goto err_component_unbind; > - /* ... and OVL1 -> COLOR1 -> GAMMA -> RDMA1 -> DPI0. */ > - ret = mtk_drm_crtc_create(drm, private->data->ext_path, > - private->data->ext_len); > - if (ret < 0) > - goto err_component_unbind; > - > - ret = mtk_drm_crtc_create(drm, private->data->third_path, > - private->data->third_len); > - if (ret < 0) > - goto err_component_unbind; > + for (i = 0; i < MAX_CRTC; i++) { > + for (j = 0; j < private->data->mmsys_dev_num; j++) { > + priv_n = private->all_drm_private[j]; > + > + if (i == 0 && priv_n->data->main_len) { > + ret = mtk_drm_crtc_create(drm, priv_n->data->main_path, > + priv_n->data->main_len, j); > + if (ret) > + goto err_component_unbind; > + > + if (!np) > + np = priv_n->comp_node[priv_n->data->main_path[0]]; > + > + continue; > + } else if (i == 1 && priv_n->data->ext_len) { > + ret = mtk_drm_crtc_create(drm, priv_n->data->ext_path, > + priv_n->data->ext_len, j); > + if (ret) > + goto err_component_unbind; > + > + if (!np) > + np = priv_n->comp_node[priv_n->data->ext_path[0]]; > + > + continue; > + } else if (i == 2 && priv_n->data->third_len) { > + ret = mtk_drm_crtc_create(drm, priv_n->data->third_path, > + priv_n->data->third_len, j); > + if (ret) > + goto err_component_unbind; > + > + if (!np) > + np = priv_n->comp_node[priv_n->data->third_path[0]]; > + > + continue; > + } > + } > + } > > /* Use OVL device for all DMA memory allocations */ > - np = private->comp_node[private->data->main_path[0]] ?: > - private->comp_node[private->data->ext_path[0]]; > pdev = of_find_device_by_node(np); > if (!pdev) { > ret = -ENODEV; > @@ -276,13 +512,15 @@ static int mtk_drm_kms_init(struct drm_device *drm) > } > > dma_dev = &pdev->dev; > - private->dma_dev = dma_dev; > + for (i = 0; i < private->data->mmsys_dev_num; i++) > + private->all_drm_private[i]->dma_dev = dma_dev; > > /* > * Configure the DMA segment size to make sure we get contiguous IOVA > * when importing PRIME buffers. > */ > ret = dma_set_max_seg_size(dma_dev, UINT_MAX); > + > if (ret) { > dev_err(dma_dev, "Failed to set DMA segment size\n"); > goto err_component_unbind; > @@ -304,9 +542,12 @@ static int mtk_drm_kms_init(struct drm_device *drm) > return 0; > > err_component_unbind: > - component_unbind_all(drm->dev, drm); > + for (i = 0; i < private->data->mmsys_dev_num; i++) > + component_unbind_all(private->all_drm_private[i]->dev, drm); > put_mutex_dev: > - put_device(private->mutex_dev); > + for (i = 0; i < private->data->mmsys_dev_num; i++) > + put_device(private->all_drm_private[i]->mutex_dev); > + > return ret; > } > > @@ -371,12 +612,21 @@ static int mtk_drm_bind(struct device *dev) > struct drm_device *drm; > int ret; > > - drm = drm_dev_alloc(&mtk_drm_driver, dev); > - if (IS_ERR(drm)) > - return PTR_ERR(drm); > + if (!mtk_drm_find_drm_dev(dev, &drm)) { > + drm = drm_dev_alloc(&mtk_drm_driver, dev); > + if (IS_ERR(drm)) > + return PTR_ERR(drm); > + drm->dev_private = private; > + } > > - drm->dev_private = private; > + private->dev = dev; > private->drm = drm; > + private->mtk_drm_bound = true; > + > + if (!mtk_drm_check_last_drm_bind(dev)) > + return 0; > + > + mtk_drm_setup_all_drm_private(dev); > > ret = mtk_drm_kms_init(drm); > if (ret < 0) > @@ -401,10 +651,13 @@ static void mtk_drm_unbind(struct device *dev) > { > struct mtk_drm_private *private = dev_get_drvdata(dev); > > - drm_dev_unregister(private->drm); > - mtk_drm_kms_deinit(private->drm); > - drm_dev_put(private->drm); > - private->num_pipes = 0; > + /* for multi mmsys dev, unregister drm dev in mmsys master */ > + if (private->data->mmsys_id == 0) { > + drm_dev_unregister(private->drm); > + mtk_drm_kms_deinit(private->drm); > + drm_dev_put(private->drm); > + } > + private->mtk_drm_bound = false; > private->drm = NULL; > } > > @@ -485,49 +738,42 @@ static const struct of_device_id mtk_ddp_comp_dt_ids[] = { > { } > }; > > -static const struct of_device_id mtk_drm_of_ids[] = { > - { .compatible = "mediatek,mt2701-mmsys", > - .data = &mt2701_mmsys_driver_data}, > - { .compatible = "mediatek,mt7623-mmsys", > - .data = &mt7623_mmsys_driver_data}, > - { .compatible = "mediatek,mt2712-mmsys", > - .data = &mt2712_mmsys_driver_data}, > - { .compatible = "mediatek,mt8173-mmsys", > - .data = &mt8173_mmsys_driver_data}, > - { .compatible = "mediatek,mt8183-mmsys", > - .data = &mt8183_mmsys_driver_data}, > - {.compatible = "mediatek,mt8195-vdosys0", > - .data = &mt8195_vdosys0_driver_data}, > - { } > -}; > -MODULE_DEVICE_TABLE(of, mtk_drm_of_ids); > - > static int mtk_drm_probe(struct platform_device *pdev) > { > struct device *dev = &pdev->dev; > struct device_node *phandle = dev->parent->of_node; > const struct of_device_id *of_id; > + const struct mtk_mmsys_driver_data *drv_data; > struct mtk_drm_private *private; > struct device_node *node; > struct component_match *match = NULL; > + struct mtk_mmsys_private *mmsys_priv; > int ret; > int i; > > + of_id = of_match_node(mtk_drm_of_ids, phandle); > + if (!of_id) > + return -ENODEV; > + > + drv_data = of_id->data; > private = devm_kzalloc(dev, sizeof(*private), GFP_KERNEL); > if (!private) > return -ENOMEM; > > + private->all_drm_private = devm_kmalloc_array(dev, drv_data->mmsys_dev_num, > + sizeof(*private->all_drm_private), > + GFP_KERNEL); > + if (!private->all_drm_private) > + return -ENOMEM; > + > + private->data = drv_data; > private->mmsys_dev = dev->parent; > if (!private->mmsys_dev) { > dev_err(dev, "Failed to get MMSYS device\n"); > return -ENODEV; > } > - > - of_id = of_match_node(mtk_drm_of_ids, phandle); > - if (!of_id) > - return -ENODEV; > - > - private->data = of_id->data; > + mmsys_priv = dev_get_drvdata(private->mmsys_dev); > + mmsys_priv->drm_private = private; > > /* Iterate over sibling DISP function blocks */ > for_each_child_of_node(phandle->parent, node) { > @@ -548,7 +794,13 @@ static int mtk_drm_probe(struct platform_device *pdev) > comp_type = (enum mtk_ddp_comp_type)of_id->data; > > if (comp_type == MTK_DISP_MUTEX) { > - private->mutex_node = of_node_get(node); > + int id; > + > + id = of_alias_get_id(node, "mutex"); > + if (id < 0 || id == drv_data->mmsys_id) { > + private->mutex_node = of_node_get(node); > + dev_dbg(dev, "get mutex for mmsys %d", drv_data->mmsys_id); > + } > continue; > } > > @@ -559,6 +811,9 @@ static int mtk_drm_probe(struct platform_device *pdev) > continue; > } > > + if (!mtk_drm_find_mmsys_comp(private, comp_id)) > + continue; > + > private->comp_node[comp_id] = of_node_get(node); > > /* > @@ -573,6 +828,7 @@ static int mtk_drm_probe(struct platform_device *pdev) > comp_type == MTK_DISP_MERGE || > comp_type == MTK_DISP_OVL || > comp_type == MTK_DISP_OVL_2L || > + comp_type == MTK_DISP_PSEUDO_OVL || > comp_type == MTK_DISP_RDMA || > comp_type == MTK_DPI || > comp_type == MTK_DSI) { > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h b/drivers/gpu/drm/mediatek/mtk_drm_drv.h > index c87ebb5309d0..212e4f87c35c 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h > @@ -29,14 +29,15 @@ struct mtk_mmsys_driver_data { > unsigned int third_len; > > bool shadow_register; > + unsigned int mmsys_id; > + unsigned int mmsys_dev_num; > }; > > struct mtk_drm_private { > struct drm_device *drm; > struct device *dma_dev; > - > - unsigned int num_pipes; > - > + bool mtk_drm_bound; > + struct device *dev; > struct device_node *mutex_node; > struct device *mutex_dev; > struct device *mmsys_dev; > @@ -44,6 +45,7 @@ struct mtk_drm_private { > struct mtk_ddp_comp ddp_comp[DDP_COMPONENT_ID_MAX]; > const struct mtk_mmsys_driver_data *data; > struct drm_atomic_state *suspend_state; > + struct mtk_drm_private **all_drm_private; > }; > > extern struct platform_driver mtk_disp_ccorr_driver; _______________________________________________ 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=-17.2 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, URIBL_BLOCKED,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 614D5C4338F for ; Mon, 2 Aug 2021 03:34:52 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 0A56660E97 for ; Mon, 2 Aug 2021 03:34:52 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 0A56660E97 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 5FE9A6E3CE; Mon, 2 Aug 2021 03:34:51 +0000 (UTC) Received: from mailgw02.mediatek.com (unknown [210.61.82.184]) by gabe.freedesktop.org (Postfix) with ESMTPS id 2011D6E3C1 for ; Mon, 2 Aug 2021 03:34:48 +0000 (UTC) X-UUID: 17ac77ad196143be8567ace9ab06585e-20210802 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=UpfEaLGXWwDvxkBt/ER6jVYgEdEuWnDagKMHKa99T00=; b=GCSa5AubDISxcg1ou5EXhOiqMUjwFRj1LflgalW3tNCO+RE+cqJBHKV4psB/TrM9EkiCSA7RyD1JYCRZo3pbu0jrNfwTXj7qsWAI5acGAOqgaga9TxOLeEs6QZzh0HHTOcn4P2J/c/x5tUiBIqamr3snjtwBvAEYN/DLGFKryHg=; X-UUID: 17ac77ad196143be8567ace9ab06585e-20210802 Received: from mtkexhb02.mediatek.inc [(172.21.101.103)] by mailgw02.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 1037126082; Mon, 02 Aug 2021 11:34:43 +0800 Received: from MTKCAS06.mediatek.inc (172.21.101.30) by mtkmbs05n2.mediatek.inc (172.21.101.140) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 2 Aug 2021 11:34:41 +0800 Received: from [172.21.77.4] (172.21.77.4) by MTKCAS06.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Mon, 2 Aug 2021 11:34:41 +0800 Message-ID: <1627875280.15536.4.camel@mtksdaap41> Subject: Re: [PATCH v2 14/14] drm/mediatek: add mediatek-drm of vdosys1 support for MT8195 From: CK Hu To: Nancy.Lin CC: Chun-Kuang Hu , Philipp Zabel , David Airlie , Daniel Vetter , Rob Herring , Matthias Brugger , "jason-jh . lin" , Yongqiang Niu , , , , , , , Date: Mon, 2 Aug 2021 11:34:40 +0800 In-Reply-To: <20210722094551.15255-15-nancy.lin@mediatek.com> References: <20210722094551.15255-1-nancy.lin@mediatek.com> <20210722094551.15255-15-nancy.lin@mediatek.com> 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 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" SGksIE5hbmN5Og0KDQpPbiBUaHUsIDIwMjEtMDctMjIgYXQgMTc6NDUgKzA4MDAsIE5hbmN5Lkxp biB3cm90ZToNCj4gQWRkIGRyaXZlciBkYXRhIG9mIG10ODE5NSB2ZG9zeXMxIHRvIG1lZGlhdGVr LWRybSBhbmQgbW9kaWZ5IGRybSBmb3INCj4gbXVsdGktbW1zeXMgc3VwcG9ydC4gVGhlIHR3byBt bXN5cyAodmRvc3lzMCBhbmQgdmRvc3lzMSkgd2lsbCBicmluZw0KPiB1cCB0d28gZHJtIGRyaXZl cnMsIG9ubHkgb25lIGRybSBkcml2ZXIgcmVnaXN0ZXIgYXMgdGhlIGRybSBkZXZpY2UuDQo+IEVh Y2ggZHJtIGRyaXZlciBiaW5kcyBpdHMgb3duIGNvbXBvbmVudC4gVGhlIGZpcnN0IGJpbmQgZHJt IGRyaXZlcg0KPiB3aWxsIGFsbG9jYXRlIHRoZSBkcm0gZGV2aWNlLCBhbmQgdGhlIGxhc3QgYmlu ZCBkcm0gZHJpdmVyIHJlZ2lzdGVycw0KPiB0aGUgZHJtIGRldmljZSB0byBkcm0gY29yZS4gRWFj aCBjcnRjIHBhdGggaXMgY3JlYXRlZCB3aXRoIHRoZQ0KPiBjb3JyZXNwb25kaW5nIGRybSBkcml2 ZXIgZGF0YS4NCj4gDQo+IFNpZ25lZC1vZmYtYnk6IE5hbmN5LkxpbiA8bmFuY3kubGluQG1lZGlh dGVrLmNvbT4NCj4gLS0tDQo+ICBkcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2Rpc3BfbWVy Z2UuYyAgIHwgICA0ICsNCj4gIGRyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2NydGMu YyAgICAgfCAgMTggKy0NCj4gIGRyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2NydGMu aCAgICAgfCAgIDMgKy0NCj4gIGRyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2RkcF9j b21wLmMgfCAgMTUgKw0KPiAgZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZGRwX2Nv bXAuaCB8ICAgMSArDQo+ICBkcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9kcnYuYyAg ICAgIHwgMzc4ICsrKysrKysrKysrKysrKystLS0tDQo+ICBkcml2ZXJzL2dwdS9kcm0vbWVkaWF0 ZWsvbXRrX2RybV9kcnYuaCAgICAgIHwgICA4ICstDQo+ICA3IGZpbGVzIGNoYW5nZWQsIDM1NiBp bnNlcnRpb25zKCspLCA3MSBkZWxldGlvbnMoLSkNCj4gDQo+IGRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2Rpc3BfbWVyZ2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9tZWRp YXRlay9tdGtfZGlzcF9tZXJnZS5jDQo+IGluZGV4IDc2OGMyODJkMmQ2My4uODI5NTcwMzA4NzYx IDEwMDY0NA0KPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2Rpc3BfbWVyZ2Uu Yw0KPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2Rpc3BfbWVyZ2UuYw0KPiBA QCAtNCw2ICs0LDcgQEANCj4gICAqLw0KPiAgDQo+ICAjaW5jbHVkZSA8bGludXgvY2xrLmg+DQo+ ICsjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4NCj4gICNpbmNsdWRlIDxsaW51eC9jb21wb25lbnQu aD4NCj4gICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4NCj4gICNpbmNsdWRlIDxsaW51eC9v Zl9pcnEuaD4NCj4gQEAgLTEwNiw2ICsxMDcsOSBAQCB2b2lkIG10a19tZXJnZV9zdG9wKHN0cnVj dCBkZXZpY2UgKmRldikNCj4gIAlzdHJ1Y3QgbXRrX2Rpc3BfbWVyZ2UgKnByaXYgPSBkZXZfZ2V0 X2RydmRhdGEoZGV2KTsNCj4gIA0KPiAgCW10a19kZHBfd3JpdGUoTlVMTCwgMHgwLCAmcHJpdi0+ Y21kcV9yZWcsIHByaXYtPnJlZ3MsIERJU1BfUkVHX01FUkdFX0NUUkwpOw0KPiArDQo+ICsJaWYg KHByaXYtPmFzeW5jX2NsaykNCj4gKwkJZGV2aWNlX3Jlc2V0X29wdGlvbmFsKGRldik7DQoNCk1v dmUgdGhpcyB0byB0aGUgbWVyZ2UgcGF0Y2ggWzFdLg0KDQpbMV0NCmh0dHBzOi8vcGF0Y2h3b3Jr Lmtlcm5lbC5vcmcvcHJvamVjdC9saW51eC1tZWRpYXRlay9wYXRjaC8yMDIxMDcyOTE3MDczNy4y MTQyNC03LWphc29uLWpoLmxpbkBtZWRpYXRlay5jb20vDQoNCj4gIH0NCj4gIA0KPiAgc3RhdGlj IGludCBtdGtfbWVyZ2VfY2hlY2tfcGFyYW1zKHN0cnVjdCBtdGtfbWVyZ2VfY29uZmlnX3N0cnVj dCAqbWVyZ2VfY29uZmlnKQ0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVr L210a19kcm1fY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fY3J0Yy5j DQo+IGluZGV4IDQwZGYyYzgyMzE4Ny4uMzMyNGZhMWE5ZThjIDEwMDY0NA0KPiAtLS0gYS9kcml2 ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9jcnRjLmMNCj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL21lZGlhdGVrL210a19kcm1fY3J0Yy5jDQo+IEBAIC03MzcsMjEgKzczNywyOCBAQCBzdGF0 aWMgaW50IG10a19kcm1fY3J0Y19pbml0X2NvbXBfcGxhbmVzKHN0cnVjdCBkcm1fZGV2aWNlICpk cm1fZGV2LA0KPiAgfQ0KPiAgDQo+ICBpbnQgbXRrX2RybV9jcnRjX2NyZWF0ZShzdHJ1Y3QgZHJt X2RldmljZSAqZHJtX2RldiwNCj4gLQkJCWNvbnN0IGVudW0gbXRrX2RkcF9jb21wX2lkICpwYXRo LCB1bnNpZ25lZCBpbnQgcGF0aF9sZW4pDQo+ICsJCQljb25zdCBlbnVtIG10a19kZHBfY29tcF9p ZCAqcGF0aCwgdW5zaWduZWQgaW50IHBhdGhfbGVuLA0KPiArCQkJaW50IHByaXZfZGF0YV9pbmRl eCkNCj4gIHsNCj4gIAlzdHJ1Y3QgbXRrX2RybV9wcml2YXRlICpwcml2ID0gZHJtX2Rldi0+ZGV2 X3ByaXZhdGU7DQo+ICAJc3RydWN0IGRldmljZSAqZGV2ID0gZHJtX2Rldi0+ZGV2Ow0KPiAgCXN0 cnVjdCBtdGtfZHJtX2NydGMgKm10a19jcnRjOw0KPiAgCXVuc2lnbmVkIGludCBudW1fY29tcF9w bGFuZXMgPSAwOw0KPiAtCWludCBwaXBlID0gcHJpdi0+bnVtX3BpcGVzOw0KPiAgCWludCByZXQ7 DQo+ICAJaW50IGk7DQo+ICAJYm9vbCBoYXNfY3RtID0gZmFsc2U7DQo+ICAJdWludCBnYW1tYV9s dXRfc2l6ZSA9IDA7DQo+ICsJc3RydWN0IGRybV9jcnRjICp0bXA7DQo+ICsJaW50IGNydGNfaSA9 IDA7DQo+ICANCj4gIAlpZiAoIXBhdGgpDQo+ICAJCXJldHVybiAwOw0KPiAgDQo+ICsJcHJpdiA9 IHByaXYtPmFsbF9kcm1fcHJpdmF0ZVtwcml2X2RhdGFfaW5kZXhdOw0KPiArDQo+ICsJZHJtX2Zv cl9lYWNoX2NydGModG1wLCBkcm1fZGV2KQ0KPiArCQljcnRjX2krKzsNCj4gKw0KPiAgCWZvciAo aSA9IDA7IGkgPCBwYXRoX2xlbjsgaSsrKSB7DQo+ICAJCWVudW0gbXRrX2RkcF9jb21wX2lkIGNv bXBfaWQgPSBwYXRoW2ldOw0KPiAgCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7DQo+IEBAIC03 NjAsNyArNzY3LDcgQEAgaW50IG10a19kcm1fY3J0Y19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2Ug KmRybV9kZXYsDQo+ICAJCWlmICghbm9kZSkgew0KPiAgCQkJZGV2X2luZm8oZGV2LA0KPiAgCQkJ CSAiTm90IGNyZWF0aW5nIGNydGMgJWQgYmVjYXVzZSBjb21wb25lbnQgJWQgaXMgZGlzYWJsZWQg b3IgbWlzc2luZ1xuIiwNCj4gLQkJCQkgcGlwZSwgY29tcF9pZCk7DQo+ICsJCQkJIGNydGNfaSwg Y29tcF9pZCk7DQo+ICAJCQlyZXR1cm4gMDsNCj4gIAkJfQ0KPiAgCX0NCj4gQEAgLTgxNiwxOSAr ODIzLDE4IEBAIGludCBtdGtfZHJtX2NydGNfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkcm1f ZGV2LA0KPiAgDQo+ICAJZm9yIChpID0gMDsgaSA8IG10a19jcnRjLT5kZHBfY29tcF9ucjsgaSsr KSB7DQo+ICAJCXJldCA9IG10a19kcm1fY3J0Y19pbml0X2NvbXBfcGxhbmVzKGRybV9kZXYsIG10 a19jcnRjLCBpLA0KPiAtCQkJCQkJICAgIHBpcGUpOw0KPiArCQkJCQkJICAgIGNydGNfaSk7DQo+ ICAJCWlmIChyZXQpDQo+ICAJCQlyZXR1cm4gcmV0Ow0KPiAgCX0NCj4gIA0KPiAtCXJldCA9IG10 a19kcm1fY3J0Y19pbml0KGRybV9kZXYsIG10a19jcnRjLCBwaXBlKTsNCj4gKwlyZXQgPSBtdGtf ZHJtX2NydGNfaW5pdChkcm1fZGV2LCBtdGtfY3J0YywgY3J0Y19pKTsNCj4gIAlpZiAocmV0IDwg MCkNCj4gIAkJcmV0dXJuIHJldDsNCj4gIA0KPiAgCWlmIChnYW1tYV9sdXRfc2l6ZSkNCj4gIAkJ ZHJtX21vZGVfY3J0Y19zZXRfZ2FtbWFfc2l6ZSgmbXRrX2NydGMtPmJhc2UsIGdhbW1hX2x1dF9z aXplKTsNCj4gIAlkcm1fY3J0Y19lbmFibGVfY29sb3JfbWdtdCgmbXRrX2NydGMtPmJhc2UsIDAs IGhhc19jdG0sIGdhbW1hX2x1dF9zaXplKTsNCj4gLQlwcml2LT5udW1fcGlwZXMrKzsNCj4gIAlt dXRleF9pbml0KCZtdGtfY3J0Yy0+aHdfbG9jayk7DQo+ICANCj4gICNpZiBJU19SRUFDSEFCTEUo Q09ORklHX01US19DTURRKQ0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVr L210a19kcm1fY3J0Yy5oIGIvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fY3J0Yy5o DQo+IGluZGV4IDY2ZDFjZjAzZGZlOC4uMDY0NmZhZmZmZDhiIDEwMDY0NA0KPiAtLS0gYS9kcml2 ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9jcnRjLmgNCj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL21lZGlhdGVrL210a19kcm1fY3J0Yy5oDQo+IEBAIC0zMSw3ICszMSw4IEBADQo+ICB2b2lk IG10a19kcm1fY3J0Y19jb21taXQoc3RydWN0IGRybV9jcnRjICpjcnRjKTsNCj4gIGludCBtdGtf ZHJtX2NydGNfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2LA0KPiAgCQkJY29uc3Qg ZW51bSBtdGtfZGRwX2NvbXBfaWQgKnBhdGgsDQo+IC0JCQl1bnNpZ25lZCBpbnQgcGF0aF9sZW4p Ow0KPiArCQkJdW5zaWduZWQgaW50IHBhdGhfbGVuLA0KPiArCQkJaW50IHByaXZfZGF0YV9pbmRl eCk7DQo+ICBpbnQgbXRrX2RybV9jcnRjX3BsYW5lX2NoZWNrKHN0cnVjdCBkcm1fY3J0YyAqY3J0 Yywgc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsDQo+ICAJCQkgICAgIHN0cnVjdCBtdGtfcGxhbmVf c3RhdGUgKnN0YXRlKTsNCj4gIHZvaWQgbXRrX2RybV9jcnRjX2FzeW5jX3VwZGF0ZShzdHJ1Y3Qg ZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLA0KPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZGRwX2NvbXAuYyBiL2RyaXZlcnMvZ3B1 L2RybS9tZWRpYXRlay9tdGtfZHJtX2RkcF9jb21wLmMNCj4gaW5kZXggOTEyNWQwZjYzNTJmLi4y NWYyOTM1NDJmNzkgMTAwNjQ0DQo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtf ZHJtX2RkcF9jb21wLmMNCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1f ZGRwX2NvbXAuYw0KPiBAQCAtMzU1LDYgKzM1NSwxOCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IG10 a19kZHBfY29tcF9mdW5jcyBkZHBfdWZvZSA9IHsNCj4gIAkuc3RhcnQgPSBtdGtfdWZvZV9zdGFy dCwNCj4gIH07DQo+ICANCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2RkcF9jb21wX2Z1bmNz IGRkcF9wc2V1ZG9fb3ZsID0gew0KPiArCS5jbGtfZW5hYmxlID0gbXRrX2V0aGRyX2Nsa19lbmFi bGUsDQo+ICsJLmNsa19kaXNhYmxlID0gbXRrX2V0aGRyX2Nsa19kaXNhYmxlLA0KPiArCS5jb25m aWcgPSBtdGtfZXRoZHJfY29uZmlnLA0KPiArCS5zdGFydCA9IG10a19ldGhkcl9zdGFydCwNCj4g Kwkuc3RvcCA9IG10a19ldGhkcl9zdG9wLA0KPiArCS5sYXllcl9uciA9IG10a19ldGhkcl9sYXll cl9uciwNCj4gKwkubGF5ZXJfY29uZmlnID0gbXRrX2V0aGRyX2xheWVyX2NvbmZpZywNCj4gKwku ZW5hYmxlX3ZibGFuayA9IG10a19ldGhkcl9lbmFibGVfdmJsYW5rLA0KPiArCS5kaXNhYmxlX3Zi bGFuayA9IG10a19ldGhkcl9kaXNhYmxlX3ZibGFuaywNCj4gK307DQoNCk1vdmUgdGhpcyB0byB0 aGUgcHNldWRvIG92bCBwYXRjaC4NCg0KPiArDQo+ICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0 IG10a19kZHBfY29tcF9zdGVtW01US19ERFBfQ09NUF9UWVBFX01BWF0gPSB7DQo+ICAJW01US19E SVNQX09WTF0gPSAib3ZsIiwNCj4gIAlbTVRLX0RJU1BfT1ZMXzJMXSA9ICJvdmwtMmwiLA0KPiBA QCAtMzY4LDYgKzM4MCw3IEBAIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXRrX2RkcF9jb21w X3N0ZW1bTVRLX0REUF9DT01QX1RZUEVfTUFYXSA9IHsNCj4gIAlbTVRLX0RJU1BfVUZPRV0gPSAi dWZvZSIsDQo+ICAJW01US19EU0ldID0gImRzaSIsDQo+ICAJW01US19EUEldID0gImRwaSIsDQo+ ICsJW01US19ESVNQX1BTRVVET19PVkxdID0gInBzZXVkb19vdmwiLA0KDQpkaXR0by4NCg0KPiAg CVtNVEtfRElTUF9QV01dID0gInB3bSIsDQo+ICAJW01US19ESVNQX01VVEVYXSA9ICJtdXRleCIs DQo+ICAJW01US19ESVNQX09EXSA9ICJvZCIsDQo+IEBAIC00MTIsNiArNDI1LDcgQEAgc3RhdGlj IGNvbnN0IHN0cnVjdCBtdGtfZGRwX2NvbXBfbWF0Y2ggbXRrX2RkcF9tYXRjaGVzW0REUF9DT01Q T05FTlRfSURfTUFYXSA9IHsNCj4gIAlbRERQX0NPTVBPTkVOVF9PVkwxXQk9IHsgTVRLX0RJU1Bf T1ZMLAkxLCAmZGRwX292bCB9LA0KPiAgCVtERFBfQ09NUE9ORU5UX09WTF8yTDBdCT0geyBNVEtf RElTUF9PVkxfMkwsCTAsICZkZHBfb3ZsIH0sDQo+ICAJW0REUF9DT01QT05FTlRfT1ZMXzJMMV0J PSB7IE1US19ESVNQX09WTF8yTCwJMSwgJmRkcF9vdmwgfSwNCj4gKwlbRERQX0NPTVBPTkVOVF9Q U0VVRE9fT1ZMXSA9IHsgTVRLX0RJU1BfUFNFVURPX09WTCwJMCwgJmRkcF9wc2V1ZG9fb3ZsIH0s DQoNCmRpdHRvLg0KDQo+ICAJW0REUF9DT01QT05FTlRfUFdNMF0JPSB7IE1US19ESVNQX1BXTSwJ MCwgTlVMTCB9LA0KPiAgCVtERFBfQ09NUE9ORU5UX1BXTTFdCT0geyBNVEtfRElTUF9QV00sCTEs IE5VTEwgfSwNCj4gIAlbRERQX0NPTVBPTkVOVF9QV00yXQk9IHsgTVRLX0RJU1BfUFdNLAkyLCBO VUxMIH0sDQo+IEBAIC01NDAsNiArNTU0LDcgQEAgaW50IG10a19kZHBfY29tcF9pbml0KHN0cnVj dCBkZXZpY2Vfbm9kZSAqbm9kZSwgc3RydWN0IG10a19kZHBfY29tcCAqY29tcCwNCj4gIAkgICAg dHlwZSA9PSBNVEtfRElTUF9NRVJHRSB8fA0KPiAgCSAgICB0eXBlID09IE1US19ESVNQX09WTCB8 fA0KPiAgCSAgICB0eXBlID09IE1US19ESVNQX09WTF8yTCB8fA0KPiArCSAgICB0eXBlID09IE1U S19ESVNQX1BTRVVET19PVkwgfHwNCg0KZGl0dG8uDQoNCj4gIAkgICAgdHlwZSA9PSBNVEtfRElT UF9QV00gfHwNCj4gIAkgICAgdHlwZSA9PSBNVEtfRElTUF9SRE1BIHx8DQo+ICAJICAgIHR5cGUg PT0gTVRLX0RQSSB8fA0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210 a19kcm1fZGRwX2NvbXAuaCBiL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2RkcF9j b21wLmgNCj4gaW5kZXggMGFmZDc4YzBiYzkyLi5mMmExODRiMWVjZWIgMTAwNjQ0DQo+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2RkcF9jb21wLmgNCj4gKysrIGIvZHJp dmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZGRwX2NvbXAuaA0KPiBAQCAtMzYsNiArMzYs NyBAQCBlbnVtIG10a19kZHBfY29tcF90eXBlIHsNCj4gIAlNVEtfRElTUF9CTFMsDQo+ICAJTVRL X0RJU1BfRFNDLA0KPiAgCU1US19ESVNQX01FUkdFLA0KPiArCU1US19ESVNQX1BTRVVET19PVkws DQoNCmRpdHRvLg0KDQo+ICAJTVRLX0REUF9DT01QX1RZUEVfTUFYLA0KPiAgfTsNCj4gIA0KPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZHJ2LmMgYi9kcml2 ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9kcnYuYw0KPiBpbmRleCA1OGY5ZjlmMDZlOTQu Ljk0NTI3ZmIwNDBiZSAxMDA2NDQNCj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210 a19kcm1fZHJ2LmMNCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZHJ2 LmMNCj4gQEAgLTExLDYgKzExLDcgQEANCj4gICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5o Pg0KPiAgI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4NCj4gICNpbmNsdWRlIDxsaW51eC9k bWEtbWFwcGluZy5oPg0KPiArI2luY2x1ZGUgPGxpbnV4L3Jlc2V0LWNvbnRyb2xsZXIuaD4NCj4g IA0KPiAgI2luY2x1ZGUgPGRybS9kcm1fYXRvbWljLmg+DQo+ICAjaW5jbHVkZSA8ZHJtL2RybV9h dG9taWNfaGVscGVyLmg+DQo+IEBAIC0zNSw2ICszNiwxNiBAQA0KPiAgI2RlZmluZSBEUklWRVJf TUFKT1IgMQ0KPiAgI2RlZmluZSBEUklWRVJfTUlOT1IgMA0KPiAgDQo+ICsvKiBkdXBsaWNhdGUg d2l0aCBtbXN5cyBwcml2YXRlIGRhdGEgKi8NCj4gK3N0cnVjdCBtdGtfbW1zeXNfcHJpdmF0ZSB7 DQo+ICsJdm9pZCBfX2lvbWVtICpyZWdzX3Jlc2VydmVkOw0KPiArCXN0cnVjdCBjbWRxX2NsaWVu dF9yZWcgY21kcV9iYXNlX3Jlc2VydmVkOw0KPiArCXZvaWQgKmRhdGFfcmVzZXJ2ZWQ7DQo+ICsJ c3BpbmxvY2tfdCBsb2NrX3Jlc2VydmVkOyAvKiBwcm90ZWN0cyBtbXN5c19zd19yc3RfYiByZWcg Ki8NCj4gKwlzdHJ1Y3QgcmVzZXRfY29udHJvbGxlcl9kZXYgcmNkZXZfcmVzZXJ2ZWQ7DQo+ICsJ dm9pZCAqZHJtX3ByaXZhdGU7DQo+ICt9Ow0KPiArDQo+ICBzdGF0aWMgY29uc3Qgc3RydWN0IGRy bV9tb2RlX2NvbmZpZ19oZWxwZXJfZnVuY3MgbXRrX2RybV9tb2RlX2NvbmZpZ19oZWxwZXJzID0g ew0KPiAgCS5hdG9taWNfY29tbWl0X3RhaWwgPSBkcm1fYXRvbWljX2hlbHBlcl9jb21taXRfdGFp bF9ycG0sDQo+ICB9Ow0KPiBAQCAtMTYwLDEyICsxNzEsMjAgQEAgc3RhdGljIGNvbnN0IGVudW0g bXRrX2RkcF9jb21wX2lkIG10ODE5NV9tdGtfZGRwX21haW5bXSA9IHsNCj4gIAlERFBfQ09NUE9O RU5UX0RQX0lOVEYwLA0KPiAgfTsNCj4gIA0KPiArc3RhdGljIGNvbnN0IGVudW0gbXRrX2RkcF9j b21wX2lkIG10ODE5NV9tdGtfZGRwX2V4dFtdID0gew0KPiArCUREUF9DT01QT05FTlRfUFNFVURP X09WTCwNCj4gKwlERFBfQ09NUE9ORU5UX01FUkdFNSwNCj4gKwlERFBfQ09NUE9ORU5UX0RQX0lO VEYxLA0KPiArfTsNCj4gKw0KPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfbW1zeXNfZHJpdmVy X2RhdGEgbXQyNzAxX21tc3lzX2RyaXZlcl9kYXRhID0gew0KPiAgCS5tYWluX3BhdGggPSBtdDI3 MDFfbXRrX2RkcF9tYWluLA0KPiAgCS5tYWluX2xlbiA9IEFSUkFZX1NJWkUobXQyNzAxX210a19k ZHBfbWFpbiksDQo+ICAJLmV4dF9wYXRoID0gbXQyNzAxX210a19kZHBfZXh0LA0KPiAgCS5leHRf bGVuID0gQVJSQVlfU0laRShtdDI3MDFfbXRrX2RkcF9leHQpLA0KPiAgCS5zaGFkb3dfcmVnaXN0 ZXIgPSB0cnVlLA0KPiArCS5tbXN5c19pZCA9IDAsDQo+ICsJLm1tc3lzX2Rldl9udW0gPSAxLA0K PiAgfTsNCj4gIA0KPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfbW1zeXNfZHJpdmVyX2RhdGEg bXQ3NjIzX21tc3lzX2RyaXZlcl9kYXRhID0gew0KPiBAQCAtMTc0LDYgKzE5Myw4IEBAIHN0YXRp YyBjb25zdCBzdHJ1Y3QgbXRrX21tc3lzX2RyaXZlcl9kYXRhIG10NzYyM19tbXN5c19kcml2ZXJf ZGF0YSA9IHsNCj4gIAkuZXh0X3BhdGggPSBtdDc2MjNfbXRrX2RkcF9leHQsDQo+ICAJLmV4dF9s ZW4gPSBBUlJBWV9TSVpFKG10NzYyM19tdGtfZGRwX2V4dCksDQo+ICAJLnNoYWRvd19yZWdpc3Rl ciA9IHRydWUsDQo+ICsJLm1tc3lzX2lkID0gMCwNCj4gKwkubW1zeXNfZGV2X251bSA9IDEsDQo+ ICB9Ow0KPiAgDQo+ICBzdGF0aWMgY29uc3Qgc3RydWN0IG10a19tbXN5c19kcml2ZXJfZGF0YSBt dDI3MTJfbW1zeXNfZHJpdmVyX2RhdGEgPSB7DQo+IEBAIC0xODMsNiArMjA0LDggQEAgc3RhdGlj IGNvbnN0IHN0cnVjdCBtdGtfbW1zeXNfZHJpdmVyX2RhdGEgbXQyNzEyX21tc3lzX2RyaXZlcl9k YXRhID0gew0KPiAgCS5leHRfbGVuID0gQVJSQVlfU0laRShtdDI3MTJfbXRrX2RkcF9leHQpLA0K PiAgCS50aGlyZF9wYXRoID0gbXQyNzEyX210a19kZHBfdGhpcmQsDQo+ICAJLnRoaXJkX2xlbiA9 IEFSUkFZX1NJWkUobXQyNzEyX210a19kZHBfdGhpcmQpLA0KPiArCS5tbXN5c19pZCA9IDAsDQo+ ICsJLm1tc3lzX2Rldl9udW0gPSAxLA0KPiAgfTsNCj4gIA0KPiAgc3RhdGljIGNvbnN0IHN0cnVj dCBtdGtfbW1zeXNfZHJpdmVyX2RhdGEgbXQ4MTczX21tc3lzX2RyaXZlcl9kYXRhID0gew0KPiBA QCAtMTkwLDYgKzIxMyw4IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX21tc3lzX2RyaXZlcl9k YXRhIG10ODE3M19tbXN5c19kcml2ZXJfZGF0YSA9IHsNCj4gIAkubWFpbl9sZW4gPSBBUlJBWV9T SVpFKG10ODE3M19tdGtfZGRwX21haW4pLA0KPiAgCS5leHRfcGF0aCA9IG10ODE3M19tdGtfZGRw X2V4dCwNCj4gIAkuZXh0X2xlbiA9IEFSUkFZX1NJWkUobXQ4MTczX210a19kZHBfZXh0KSwNCj4g KwkubW1zeXNfaWQgPSAwLA0KPiArCS5tbXN5c19kZXZfbnVtID0gMSwNCj4gIH07DQo+ICANCj4g IHN0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX21tc3lzX2RyaXZlcl9kYXRhIG10ODE4M19tbXN5c19k cml2ZXJfZGF0YSA9IHsNCj4gQEAgLTE5NywzMiArMjIyLDIxOSBAQCBzdGF0aWMgY29uc3Qgc3Ry dWN0IG10a19tbXN5c19kcml2ZXJfZGF0YSBtdDgxODNfbW1zeXNfZHJpdmVyX2RhdGEgPSB7DQo+ ICAJLm1haW5fbGVuID0gQVJSQVlfU0laRShtdDgxODNfbXRrX2RkcF9tYWluKSwNCj4gIAkuZXh0 X3BhdGggPSBtdDgxODNfbXRrX2RkcF9leHQsDQo+ICAJLmV4dF9sZW4gPSBBUlJBWV9TSVpFKG10 ODE4M19tdGtfZGRwX2V4dCksDQo+ICsJLm1tc3lzX2lkID0gMCwNCj4gKwkubW1zeXNfZGV2X251 bSA9IDEsDQo+ICB9Ow0KPiAgDQo+ICBzdGF0aWMgY29uc3Qgc3RydWN0IG10a19tbXN5c19kcml2 ZXJfZGF0YSBtdDgxOTVfdmRvc3lzMF9kcml2ZXJfZGF0YSA9IHsNCj4gIAkubWFpbl9wYXRoID0g bXQ4MTk1X210a19kZHBfbWFpbiwNCj4gIAkubWFpbl9sZW4gPSBBUlJBWV9TSVpFKG10ODE5NV9t dGtfZGRwX21haW4pLA0KPiArCS5tbXN5c19pZCA9IDAsDQo+ICsJLm1tc3lzX2Rldl9udW0gPSAy LA0KPiArfTsNCj4gKw0KPiArc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfbW1zeXNfZHJpdmVyX2Rh dGEgbXQ4MTk1X3Zkb3N5czFfZHJpdmVyX2RhdGEgPSB7DQo+ICsJLmV4dF9wYXRoID0gbXQ4MTk1 X210a19kZHBfZXh0LA0KPiArCS5leHRfbGVuID0gQVJSQVlfU0laRShtdDgxOTVfbXRrX2RkcF9l eHQpLA0KPiArCS5tbXN5c19pZCA9IDEsDQo+ICsJLm1tc3lzX2Rldl9udW0gPSAyLA0KPiArfTsN Cj4gKw0KPiArc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXRrX2RybV9vZl9pZHNb XSA9IHsNCj4gKwl7IC5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10MjcwMS1tbXN5cyIsDQo+ICsJ ICAuZGF0YSA9ICZtdDI3MDFfbW1zeXNfZHJpdmVyX2RhdGF9LA0KPiArCXsgLmNvbXBhdGlibGUg PSAibWVkaWF0ZWssbXQ3NjIzLW1tc3lzIiwNCj4gKwkgIC5kYXRhID0gJm10NzYyM19tbXN5c19k cml2ZXJfZGF0YX0sDQo+ICsJeyAuY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDI3MTItbW1zeXMi LA0KPiArCSAgLmRhdGEgPSAmbXQyNzEyX21tc3lzX2RyaXZlcl9kYXRhfSwNCj4gKwl7IC5jb21w YXRpYmxlID0gIm1lZGlhdGVrLG10ODE3My1tbXN5cyIsDQo+ICsJICAuZGF0YSA9ICZtdDgxNzNf bW1zeXNfZHJpdmVyX2RhdGF9LA0KPiArCXsgLmNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ4MTgz LW1tc3lzIiwNCj4gKwkgIC5kYXRhID0gJm10ODE4M19tbXN5c19kcml2ZXJfZGF0YX0sDQo+ICsJ eyAuY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDgxOTUtdmRvc3lzMCIsDQo+ICsJICAuZGF0YSA9 ICZtdDgxOTVfdmRvc3lzMF9kcml2ZXJfZGF0YX0sDQo+ICsJeyAuY29tcGF0aWJsZSA9ICJtZWRp YXRlayxtdDgxOTUtdmRvc3lzMSIsDQo+ICsJICAuZGF0YSA9ICZtdDgxOTVfdmRvc3lzMV9kcml2 ZXJfZGF0YX0sDQo+ICsJeyB9DQo+ICB9Ow0KPiArTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXRr X2RybV9vZl9pZHMpOw0KPiArDQo+ICtzdGF0aWMgaW50IG10a19kcm1fZ2V0X21tc3lzX3ByaXYo c3RydWN0IGRldmljZSAqZGV2LA0KPiArCQkJCSAgc3RydWN0IG10a19kcm1fcHJpdmF0ZSAqKmFs bF9kcm1fcHJpdiwNCj4gKwkJCQkgIGludCBudW0pDQo+ICt7DQo+ICsJc3RydWN0IG10a19kcm1f cHJpdmF0ZSAqZHJtX3ByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsNCj4gKwlzdHJ1Y3QgZGV2 aWNlX25vZGUgKnBoYW5kbGUgPSBkZXYtPnBhcmVudC0+b2Zfbm9kZTsNCj4gKwljb25zdCBzdHJ1 Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZDsNCj4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7DQo+ ICsJaW50IGNudCA9IDA7DQo+ICsNCj4gKwlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKHBoYW5kbGUt PnBhcmVudCwgbm9kZSkgew0KPiArCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2Ow0KPiAr CQlzdHJ1Y3QgbXRrX21tc3lzX3ByaXZhdGUgKm1tc3lzX3ByaXY7DQo+ICsNCj4gKwkJb2ZfaWQg PSBvZl9tYXRjaF9ub2RlKG10a19kcm1fb2ZfaWRzLCBub2RlKTsNCj4gKwkJaWYgKCFvZl9pZCkN Cj4gKwkJCWNvbnRpbnVlOw0KPiArDQo+ICsJCXBkZXYgPSBvZl9maW5kX2RldmljZV9ieV9ub2Rl KG5vZGUpOw0KPiArCQlpZiAoIXBkZXYpDQo+ICsJCQljb250aW51ZTsNCj4gKw0KPiArCQltbXN5 c19wcml2ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOw0KPiArCQlpZiAoIW1tc3lzX3By aXYgfHwgIW1tc3lzX3ByaXYtPmRybV9wcml2YXRlKQ0KPiArCQkJY29udGludWU7DQo+ICsNCj4g KwkJYWxsX2RybV9wcml2W2NudCsrXSA9IG1tc3lzX3ByaXYtPmRybV9wcml2YXRlOw0KPiArCQlp ZiAoY250ID09IG51bSkNCj4gKwkJCWJyZWFrOw0KPiArCX0NCj4gKw0KPiArCXJldHVybiAwOw0K PiArfQ0KDQpNb3ZlICJzdXBwb3J0IG11bHRpcGxlIG1tc3lzIiByZWxhdGVkIGNvZGUgdG8gYW5v dGhlciBwYXRjaCwgYW5kIGxlZnQNCm9ubHkgbXQ4MTk1IHBhcnQgaW4gdGhpcyBwYXRjaC4NCg0K UmVnYXJkcywNCkNLDQoNCj4gKw0KPiArc3RhdGljIGJvb2wgbXRrX2RybV9jaGVja19sYXN0X2Ry bV9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldikNCj4gK3sNCj4gKwlzdHJ1Y3QgbXRrX2RybV9wcml2 YXRlICpkcm1fcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOw0KPiArCXN0cnVjdCBtdGtfZHJt X3ByaXZhdGUgKmFsbF9kcm1fcHJpdltNQVhfQ1JUQ107DQo+ICsJaW50IGNudCA9IDA7DQo+ICsJ aW50IGk7DQo+ICsNCj4gKwltdGtfZHJtX2dldF9tbXN5c19wcml2KGRldiwgYWxsX2RybV9wcml2 LCBkcm1fcHJpdi0+ZGF0YS0+bW1zeXNfZGV2X251bSk7DQo+ICsNCj4gKwlmb3IgKGkgPSAwOyBp IDwgTUFYX0NSVEM7IGkrKykNCj4gKwkJaWYgKGFsbF9kcm1fcHJpdltpXSAmJiBhbGxfZHJtX3By aXZbaV0tPm10a19kcm1fYm91bmQpDQo+ICsJCQljbnQrKzsNCj4gKw0KPiArCXJldHVybiAoZHJt X3ByaXYtPmRhdGEtPm1tc3lzX2Rldl9udW0gPT0gY250KTsNCj4gK30NCj4gKw0KPiArc3RhdGlj IGJvb2wgbXRrX2RybV9maW5kX2RybV9kZXYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZHJt X2RldmljZSAqKmRybSkNCj4gK3sNCj4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBoYW5kbGUgPSBk ZXYtPnBhcmVudC0+b2Zfbm9kZTsNCj4gKwlzdHJ1Y3QgbXRrX2RybV9wcml2YXRlICpkcm1fcHJp diA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOw0KPiArCXN0cnVjdCBtdGtfZHJtX3ByaXZhdGUgKmFs bF9kcm1fcHJpdltNQVhfQ1JUQ107DQo+ICsJaW50IGk7DQo+ICsNCj4gKwlpZiAoIWRybV9wcml2 LT5kYXRhLT5tbXN5c19kZXZfbnVtKQ0KPiArCQlyZXR1cm4gZmFsc2U7DQo+ICsNCj4gKwltdGtf ZHJtX2dldF9tbXN5c19wcml2KGRldiwgYWxsX2RybV9wcml2LCBkcm1fcHJpdi0+ZGF0YS0+bW1z eXNfZGV2X251bSk7DQo+ICsNCj4gKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NSVEM7IGkrKykgew0K PiArCQlpZiAoYWxsX2RybV9wcml2W2ldICYmIGFsbF9kcm1fcHJpdltpXS0+bXRrX2RybV9ib3Vu ZCkgew0KPiArCQkJKmRybSA9IGFsbF9kcm1fcHJpdltpXS0+ZHJtOw0KPiArCQkJcmV0dXJuIHRy dWU7DQo+ICsJCX0NCj4gKwl9DQo+ICsNCj4gKwlyZXR1cm4gZmFsc2U7DQo+ICt9DQo+ICsNCj4g K3N0YXRpYyBpbnQgbXRrX2RybV9zZXR1cF9hbGxfZHJtX3ByaXZhdGUoc3RydWN0IGRldmljZSAq ZGV2KQ0KPiArew0KPiArCXN0cnVjdCBtdGtfZHJtX3ByaXZhdGUgKmRybV9wcml2ID0gZGV2X2dl dF9kcnZkYXRhKGRldik7DQo+ICsJc3RydWN0IG10a19kcm1fcHJpdmF0ZSAqYWxsX2RybV9wcml2 W01BWF9DUlRDXTsNCj4gKwlpbnQgbW1zeXNfZGV2X251bSA9IGRybV9wcml2LT5kYXRhLT5tbXN5 c19kZXZfbnVtOw0KPiArCWludCBpOw0KPiArCWludCBqOw0KPiArDQo+ICsJbXRrX2RybV9nZXRf bW1zeXNfcHJpdihkZXYsIGFsbF9kcm1fcHJpdiwgbW1zeXNfZGV2X251bSk7DQo+ICsNCj4gKwlm b3IgKGkgPSAwOyBpIDwgbW1zeXNfZGV2X251bTsgaSsrKQ0KPiArCQlmb3IgKGogPSAwOyBqIDwg bW1zeXNfZGV2X251bTsgaisrKQ0KPiArCQkJYWxsX2RybV9wcml2W2pdLT5hbGxfZHJtX3ByaXZh dGVbaV0gPSBhbGxfZHJtX3ByaXZbaV07DQo+ICsNCj4gKwlyZXR1cm4gMDsNCj4gK30NCj4gKw0K PiArc3RhdGljIGJvb2wgbXRrX2RybV9maW5kX21tc3lzX2NvbXAoc3RydWN0IG10a19kcm1fcHJp dmF0ZSAqcHJpdmF0ZSwgaW50IGNvbXBfaWQpDQo+ICt7DQo+ICsJY29uc3Qgc3RydWN0IG10a19t bXN5c19kcml2ZXJfZGF0YSAqZHJ2X2RhdGEgPSBwcml2YXRlLT5kYXRhOw0KPiArCWludCByZXQg PSBmYWxzZTsNCj4gKwlpbnQgaTsNCj4gKw0KPiArCWlmIChkcnZfZGF0YS0+bW1zeXNfZGV2X251 bSA9PSAxKQ0KPiArCQlyZXR1cm4gdHJ1ZTsNCj4gKw0KPiArCWlmIChkcnZfZGF0YS0+bWFpbl9w YXRoKSB7DQo+ICsJCWZvciAoaSA9IDA7IGkgPCBkcnZfZGF0YS0+bWFpbl9sZW47IGkrKykNCj4g KwkJCWlmIChkcnZfZGF0YS0+bWFpbl9wYXRoW2ldID09IGNvbXBfaWQpDQo+ICsJCQkJcmV0IHw9 IHRydWU7DQo+ICsNCj4gKwkJaWYgKGkgPT0gZHJ2X2RhdGEtPm1haW5fbGVuKQ0KPiArCQkJcmV0 IHw9IGZhbHNlOw0KPiArCX0NCj4gKw0KPiArCWlmIChkcnZfZGF0YS0+ZXh0X3BhdGgpIHsNCj4g KwkJZm9yIChpID0gMDsgaSA8IGRydl9kYXRhLT5leHRfbGVuOyBpKyspDQo+ICsJCQlpZiAoZHJ2 X2RhdGEtPmV4dF9wYXRoW2ldID09IGNvbXBfaWQpDQo+ICsJCQkJcmV0IHw9IHRydWU7DQo+ICsN Cj4gKwkJaWYgKGkgPT0gZHJ2X2RhdGEtPmV4dF9sZW4pDQo+ICsJCQlyZXQgfD0gZmFsc2U7DQo+ ICsJfQ0KPiArDQo+ICsJaWYgKGRydl9kYXRhLT50aGlyZF9wYXRoKSB7DQo+ICsJCWZvciAoaSA9 IDA7IGkgPCBkcnZfZGF0YS0+dGhpcmRfbGVuOyBpKyspDQo+ICsJCQlpZiAoZHJ2X2RhdGEtPnRo aXJkX3BhdGhbaV0gPT0gY29tcF9pZCkNCj4gKwkJCQlyZXQgfD0gdHJ1ZTsNCj4gKw0KPiArCQlp ZiAoaSA9PSBkcnZfZGF0YS0+dGhpcmRfbGVuKQ0KPiArCQkJcmV0IHw9IGZhbHNlOw0KPiArCX0N Cj4gKw0KPiArCXJldHVybiByZXQ7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBpbnQgbXRrX2RybV9j aGVja19tdXRleF9kZXYoc3RydWN0IG10a19kcm1fcHJpdmF0ZSAqcHJpdmF0ZSkNCj4gK3sNCj4g KwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2Ow0KPiArCXN0cnVjdCBtdGtfZHJtX3ByaXZh dGUgKnByaXZfaTsNCj4gKwlpbnQgcmV0Ow0KPiArCWludCBpOw0KPiArDQo+ICsJZm9yIChpID0g MDsgaSA8IHByaXZhdGUtPmRhdGEtPm1tc3lzX2Rldl9udW07IGkrKykgew0KPiArCQlwcml2X2kg PSBwcml2YXRlLT5hbGxfZHJtX3ByaXZhdGVbaV07DQo+ICsNCj4gKwkJcGRldiA9IG9mX2ZpbmRf ZGV2aWNlX2J5X25vZGUocHJpdl9pLT5tdXRleF9ub2RlKTsNCj4gKwkJaWYgKCFwZGV2KSB7DQo+ ICsJCQlkZXZfZXJyKHByaXZfaS0+ZGV2LCAiV2FpdGluZyBmb3IgZGlzcC1tdXRleCBkZXZpY2Ug JXBPRlxuIiwNCj4gKwkJCQlwcml2X2ktPm11dGV4X25vZGUpOw0KPiArCQkJcmV0ID0gLUVQUk9C RV9ERUZFUjsNCj4gKwkJCWdvdG8gZXJyX3B1dF9tdXRleDsNCj4gKwkJfQ0KPiArCQlwcml2X2kt Pm11dGV4X2RldiA9ICZwZGV2LT5kZXY7DQo+ICsJfQ0KPiArDQo+ICsJcmV0dXJuIDA7DQo+ICsN Cj4gK2Vycl9wdXRfbXV0ZXg6DQo+ICsJZm9yIChpID0gMDsgaSA8IHByaXZhdGUtPmRhdGEtPm1t c3lzX2Rldl9udW07IGkrKykgew0KPiArCQlwcml2X2kgPSBwcml2YXRlLT5hbGxfZHJtX3ByaXZh dGVbaV07DQo+ICsJCW9mX25vZGVfcHV0KHByaXZfaS0+bXV0ZXhfbm9kZSk7DQo+ICsJfQ0KPiAr DQo+ICsJcmV0dXJuIHJldDsNCj4gK30NCj4gIA0KPiAgc3RhdGljIGludCBtdGtfZHJtX2ttc19p bml0KHN0cnVjdCBkcm1fZGV2aWNlICpkcm0pDQo+ICB7DQo+ICAJc3RydWN0IG10a19kcm1fcHJp dmF0ZSAqcHJpdmF0ZSA9IGRybS0+ZGV2X3ByaXZhdGU7DQo+ICsJc3RydWN0IG10a19kcm1fcHJp dmF0ZSAqcHJpdl9uOw0KPiAgCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7DQo+IC0Jc3Ry dWN0IGRldmljZV9ub2RlICpucDsNCj4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gTlVMTDsN Cj4gIAlzdHJ1Y3QgZGV2aWNlICpkbWFfZGV2Ow0KPiAgCWludCByZXQ7DQo+ICsJaW50IGk7DQo+ ICsJaW50IGo7DQo+ICANCj4gIAlpZiAoIWlvbW11X3ByZXNlbnQoJnBsYXRmb3JtX2J1c190eXBl KSkNCj4gIAkJcmV0dXJuIC1FUFJPQkVfREVGRVI7DQo+ICANCj4gLQlwZGV2ID0gb2ZfZmluZF9k ZXZpY2VfYnlfbm9kZShwcml2YXRlLT5tdXRleF9ub2RlKTsNCj4gLQlpZiAoIXBkZXYpIHsNCj4g LQkJZGV2X2Vycihkcm0tPmRldiwgIldhaXRpbmcgZm9yIGRpc3AtbXV0ZXggZGV2aWNlICVwT0Zc biIsDQo+IC0JCQlwcml2YXRlLT5tdXRleF9ub2RlKTsNCj4gLQkJb2Zfbm9kZV9wdXQocHJpdmF0 ZS0+bXV0ZXhfbm9kZSk7DQo+IC0JCXJldHVybiAtRVBST0JFX0RFRkVSOw0KPiAtCX0NCj4gLQlw cml2YXRlLT5tdXRleF9kZXYgPSAmcGRldi0+ZGV2Ow0KPiArCXJldCA9IG10a19kcm1fY2hlY2tf bXV0ZXhfZGV2KHByaXZhdGUpOw0KPiArCWlmIChyZXQpDQo+ICsJCXJldHVybiByZXQ7DQo+ICAN Cj4gIAlyZXQgPSBkcm1tX21vZGVfY29uZmlnX2luaXQoZHJtKTsNCj4gIAlpZiAocmV0KQ0KPiBA QCAtMjQxLDMzICs0NTMsNTcgQEAgc3RhdGljIGludCBtdGtfZHJtX2ttc19pbml0KHN0cnVjdCBk cm1fZGV2aWNlICpkcm0pDQo+ICAJZHJtLT5tb2RlX2NvbmZpZy5mdW5jcyA9ICZtdGtfZHJtX21v ZGVfY29uZmlnX2Z1bmNzOw0KPiAgCWRybS0+bW9kZV9jb25maWcuaGVscGVyX3ByaXZhdGUgPSAm bXRrX2RybV9tb2RlX2NvbmZpZ19oZWxwZXJzOw0KPiAgDQo+IC0JcmV0ID0gY29tcG9uZW50X2Jp bmRfYWxsKGRybS0+ZGV2LCBkcm0pOw0KPiArCWZvciAoaSA9IDA7IGkgPCBwcml2YXRlLT5kYXRh LT5tbXN5c19kZXZfbnVtOyBpKyspIHsNCj4gKwkJZHJtLT5kZXZfcHJpdmF0ZSA9IHByaXZhdGUt PmFsbF9kcm1fcHJpdmF0ZVtpXTsNCj4gKwkJcmV0ID0gY29tcG9uZW50X2JpbmRfYWxsKHByaXZh dGUtPmFsbF9kcm1fcHJpdmF0ZVtpXS0+ZGV2LCBkcm0pOw0KPiAgCWlmIChyZXQpDQo+ICAJCWdv dG8gcHV0X211dGV4X2RldjsNCj4gKwl9DQo+ICANCj4gIAkvKg0KPiAgCSAqIFdlIGN1cnJlbnRs eSBzdXBwb3J0IHR3byBmaXhlZCBkYXRhIHN0cmVhbXMsIGVhY2ggb3B0aW9uYWwsDQo+ICAJICog YW5kIGVhY2ggc3RhdGljYWxseSBhc3NpZ25lZCB0byBhIGNydGM6DQo+ICAJICogT1ZMMCAtPiBD T0xPUjAgLT4gQUFMIC0+IE9EIC0+IFJETUEwIC0+IFVGT0UgLT4gRFNJMCAuLi4NCj4gIAkgKi8N Cj4gLQlyZXQgPSBtdGtfZHJtX2NydGNfY3JlYXRlKGRybSwgcHJpdmF0ZS0+ZGF0YS0+bWFpbl9w YXRoLA0KPiAtCQkJCSAgcHJpdmF0ZS0+ZGF0YS0+bWFpbl9sZW4pOw0KPiAtCWlmIChyZXQgPCAw KQ0KPiAtCQlnb3RvIGVycl9jb21wb25lbnRfdW5iaW5kOw0KPiAtCS8qIC4uLiBhbmQgT1ZMMSAt PiBDT0xPUjEgLT4gR0FNTUEgLT4gUkRNQTEgLT4gRFBJMC4gKi8NCj4gLQlyZXQgPSBtdGtfZHJt X2NydGNfY3JlYXRlKGRybSwgcHJpdmF0ZS0+ZGF0YS0+ZXh0X3BhdGgsDQo+IC0JCQkJICBwcml2 YXRlLT5kYXRhLT5leHRfbGVuKTsNCj4gLQlpZiAocmV0IDwgMCkNCj4gLQkJZ290byBlcnJfY29t cG9uZW50X3VuYmluZDsNCj4gLQ0KPiAtCXJldCA9IG10a19kcm1fY3J0Y19jcmVhdGUoZHJtLCBw cml2YXRlLT5kYXRhLT50aGlyZF9wYXRoLA0KPiAtCQkJCSAgcHJpdmF0ZS0+ZGF0YS0+dGhpcmRf bGVuKTsNCj4gLQlpZiAocmV0IDwgMCkNCj4gLQkJZ290byBlcnJfY29tcG9uZW50X3VuYmluZDsN Cj4gKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NSVEM7IGkrKykgew0KPiArCQlmb3IgKGogPSAwOyBq IDwgcHJpdmF0ZS0+ZGF0YS0+bW1zeXNfZGV2X251bTsgaisrKSB7DQo+ICsJCQlwcml2X24gPSBw cml2YXRlLT5hbGxfZHJtX3ByaXZhdGVbal07DQo+ICsNCj4gKwkJCWlmIChpID09IDAgJiYgcHJp dl9uLT5kYXRhLT5tYWluX2xlbikgew0KPiArCQkJCXJldCA9IG10a19kcm1fY3J0Y19jcmVhdGUo ZHJtLCBwcml2X24tPmRhdGEtPm1haW5fcGF0aCwNCj4gKwkJCQkJCQkgIHByaXZfbi0+ZGF0YS0+ bWFpbl9sZW4sIGopOw0KPiArCQkJCWlmIChyZXQpDQo+ICsJCQkJCWdvdG8gZXJyX2NvbXBvbmVu dF91bmJpbmQ7DQo+ICsNCj4gKwkJCQlpZiAoIW5wKQ0KPiArCQkJCQlucCA9IHByaXZfbi0+Y29t cF9ub2RlW3ByaXZfbi0+ZGF0YS0+bWFpbl9wYXRoWzBdXTsNCj4gKw0KPiArCQkJCWNvbnRpbnVl Ow0KPiArCQkJfSBlbHNlIGlmIChpID09IDEgJiYgcHJpdl9uLT5kYXRhLT5leHRfbGVuKSB7DQo+ ICsJCQkJcmV0ID0gbXRrX2RybV9jcnRjX2NyZWF0ZShkcm0sIHByaXZfbi0+ZGF0YS0+ZXh0X3Bh dGgsDQo+ICsJCQkJCQkJICBwcml2X24tPmRhdGEtPmV4dF9sZW4sIGopOw0KPiArCQkJCWlmIChy ZXQpDQo+ICsJCQkJCWdvdG8gZXJyX2NvbXBvbmVudF91bmJpbmQ7DQo+ICsNCj4gKwkJCQlpZiAo IW5wKQ0KPiArCQkJCQlucCA9IHByaXZfbi0+Y29tcF9ub2RlW3ByaXZfbi0+ZGF0YS0+ZXh0X3Bh dGhbMF1dOw0KPiArDQo+ICsJCQkJY29udGludWU7DQo+ICsJCQl9IGVsc2UgaWYgKGkgPT0gMiAm JiBwcml2X24tPmRhdGEtPnRoaXJkX2xlbikgew0KPiArCQkJCXJldCA9IG10a19kcm1fY3J0Y19j cmVhdGUoZHJtLCBwcml2X24tPmRhdGEtPnRoaXJkX3BhdGgsDQo+ICsJCQkJCQkJICBwcml2X24t PmRhdGEtPnRoaXJkX2xlbiwgaik7DQo+ICsJCQkJaWYgKHJldCkNCj4gKwkJCQkJZ290byBlcnJf Y29tcG9uZW50X3VuYmluZDsNCj4gKw0KPiArCQkJCWlmICghbnApDQo+ICsJCQkJCW5wID0gcHJp dl9uLT5jb21wX25vZGVbcHJpdl9uLT5kYXRhLT50aGlyZF9wYXRoWzBdXTsNCj4gKw0KPiArCQkJ CWNvbnRpbnVlOw0KPiArCQkJfQ0KPiArCQl9DQo+ICsJfQ0KPiAgDQo+ICAJLyogVXNlIE9WTCBk ZXZpY2UgZm9yIGFsbCBETUEgbWVtb3J5IGFsbG9jYXRpb25zICovDQo+IC0JbnAgPSBwcml2YXRl LT5jb21wX25vZGVbcHJpdmF0ZS0+ZGF0YS0+bWFpbl9wYXRoWzBdXSA/Og0KPiAtCSAgICAgcHJp dmF0ZS0+Y29tcF9ub2RlW3ByaXZhdGUtPmRhdGEtPmV4dF9wYXRoWzBdXTsNCj4gIAlwZGV2ID0g b2ZfZmluZF9kZXZpY2VfYnlfbm9kZShucCk7DQo+ICAJaWYgKCFwZGV2KSB7DQo+ICAJCXJldCA9 IC1FTk9ERVY7DQo+IEBAIC0yNzYsMTMgKzUxMiwxNSBAQCBzdGF0aWMgaW50IG10a19kcm1fa21z X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRybSkNCj4gIAl9DQo+ICANCj4gIAlkbWFfZGV2ID0g JnBkZXYtPmRldjsNCj4gLQlwcml2YXRlLT5kbWFfZGV2ID0gZG1hX2RldjsNCj4gKwlmb3IgKGkg PSAwOyBpIDwgcHJpdmF0ZS0+ZGF0YS0+bW1zeXNfZGV2X251bTsgaSsrKQ0KPiArCQlwcml2YXRl LT5hbGxfZHJtX3ByaXZhdGVbaV0tPmRtYV9kZXYgPSBkbWFfZGV2Ow0KPiAgDQo+ICAJLyoNCj4g IAkgKiBDb25maWd1cmUgdGhlIERNQSBzZWdtZW50IHNpemUgdG8gbWFrZSBzdXJlIHdlIGdldCBj b250aWd1b3VzIElPVkENCj4gIAkgKiB3aGVuIGltcG9ydGluZyBQUklNRSBidWZmZXJzLg0KPiAg CSAqLw0KPiAgCXJldCA9IGRtYV9zZXRfbWF4X3NlZ19zaXplKGRtYV9kZXYsIFVJTlRfTUFYKTsN Cj4gKw0KPiAgCWlmIChyZXQpIHsNCj4gIAkJZGV2X2VycihkbWFfZGV2LCAiRmFpbGVkIHRvIHNl dCBETUEgc2VnbWVudCBzaXplXG4iKTsNCj4gIAkJZ290byBlcnJfY29tcG9uZW50X3VuYmluZDsN Cj4gQEAgLTMwNCw5ICs1NDIsMTIgQEAgc3RhdGljIGludCBtdGtfZHJtX2ttc19pbml0KHN0cnVj dCBkcm1fZGV2aWNlICpkcm0pDQo+ICAJcmV0dXJuIDA7DQo+ICANCj4gIGVycl9jb21wb25lbnRf dW5iaW5kOg0KPiAtCWNvbXBvbmVudF91bmJpbmRfYWxsKGRybS0+ZGV2LCBkcm0pOw0KPiArCWZv ciAoaSA9IDA7IGkgPCBwcml2YXRlLT5kYXRhLT5tbXN5c19kZXZfbnVtOyBpKyspDQo+ICsJCWNv bXBvbmVudF91bmJpbmRfYWxsKHByaXZhdGUtPmFsbF9kcm1fcHJpdmF0ZVtpXS0+ZGV2LCBkcm0p Ow0KPiAgcHV0X211dGV4X2RldjoNCj4gLQlwdXRfZGV2aWNlKHByaXZhdGUtPm11dGV4X2Rldik7 DQo+ICsJZm9yIChpID0gMDsgaSA8IHByaXZhdGUtPmRhdGEtPm1tc3lzX2Rldl9udW07IGkrKykN Cj4gKwkJcHV0X2RldmljZShwcml2YXRlLT5hbGxfZHJtX3ByaXZhdGVbaV0tPm11dGV4X2Rldik7 DQo+ICsNCj4gIAlyZXR1cm4gcmV0Ow0KPiAgfQ0KPiAgDQo+IEBAIC0zNzEsMTIgKzYxMiwyMSBA QCBzdGF0aWMgaW50IG10a19kcm1fYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYpDQo+ICAJc3RydWN0 IGRybV9kZXZpY2UgKmRybTsNCj4gIAlpbnQgcmV0Ow0KPiAgDQo+IC0JZHJtID0gZHJtX2Rldl9h bGxvYygmbXRrX2RybV9kcml2ZXIsIGRldik7DQo+IC0JaWYgKElTX0VSUihkcm0pKQ0KPiAtCQly ZXR1cm4gUFRSX0VSUihkcm0pOw0KPiArCWlmICghbXRrX2RybV9maW5kX2RybV9kZXYoZGV2LCAm ZHJtKSkgew0KPiArCQlkcm0gPSBkcm1fZGV2X2FsbG9jKCZtdGtfZHJtX2RyaXZlciwgZGV2KTsN Cj4gKwkJaWYgKElTX0VSUihkcm0pKQ0KPiArCQkJcmV0dXJuIFBUUl9FUlIoZHJtKTsNCj4gKwkJ ZHJtLT5kZXZfcHJpdmF0ZSA9IHByaXZhdGU7DQo+ICsJfQ0KPiAgDQo+IC0JZHJtLT5kZXZfcHJp dmF0ZSA9IHByaXZhdGU7DQo+ICsJcHJpdmF0ZS0+ZGV2ID0gZGV2Ow0KPiAgCXByaXZhdGUtPmRy bSA9IGRybTsNCj4gKwlwcml2YXRlLT5tdGtfZHJtX2JvdW5kID0gdHJ1ZTsNCj4gKw0KPiArCWlm ICghbXRrX2RybV9jaGVja19sYXN0X2RybV9iaW5kKGRldikpDQo+ICsJCXJldHVybiAwOw0KPiAr DQo+ICsJbXRrX2RybV9zZXR1cF9hbGxfZHJtX3ByaXZhdGUoZGV2KTsNCj4gIA0KPiAgCXJldCA9 IG10a19kcm1fa21zX2luaXQoZHJtKTsNCj4gIAlpZiAocmV0IDwgMCkNCj4gQEAgLTQwMSwxMCAr NjUxLDEzIEBAIHN0YXRpYyB2b2lkIG10a19kcm1fdW5iaW5kKHN0cnVjdCBkZXZpY2UgKmRldikN Cj4gIHsNCj4gIAlzdHJ1Y3QgbXRrX2RybV9wcml2YXRlICpwcml2YXRlID0gZGV2X2dldF9kcnZk YXRhKGRldik7DQo+ICANCj4gLQlkcm1fZGV2X3VucmVnaXN0ZXIocHJpdmF0ZS0+ZHJtKTsNCj4g LQltdGtfZHJtX2ttc19kZWluaXQocHJpdmF0ZS0+ZHJtKTsNCj4gLQlkcm1fZGV2X3B1dChwcml2 YXRlLT5kcm0pOw0KPiAtCXByaXZhdGUtPm51bV9waXBlcyA9IDA7DQo+ICsJLyogZm9yIG11bHRp IG1tc3lzIGRldiwgdW5yZWdpc3RlciBkcm0gZGV2IGluIG1tc3lzIG1hc3RlciAqLw0KPiArCWlm IChwcml2YXRlLT5kYXRhLT5tbXN5c19pZCA9PSAwKSB7DQo+ICsJCWRybV9kZXZfdW5yZWdpc3Rl cihwcml2YXRlLT5kcm0pOw0KPiArCQltdGtfZHJtX2ttc19kZWluaXQocHJpdmF0ZS0+ZHJtKTsN Cj4gKwkJZHJtX2Rldl9wdXQocHJpdmF0ZS0+ZHJtKTsNCj4gKwl9DQo+ICsJcHJpdmF0ZS0+bXRr X2RybV9ib3VuZCA9IGZhbHNlOw0KPiAgCXByaXZhdGUtPmRybSA9IE5VTEw7DQo+ICB9DQo+ICAN Cj4gQEAgLTQ4NSw0OSArNzM4LDQyIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lk IG10a19kZHBfY29tcF9kdF9pZHNbXSA9IHsNCj4gIAl7IH0NCj4gIH07DQo+ICANCj4gLXN0YXRp YyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG10a19kcm1fb2ZfaWRzW10gPSB7DQo+IC0JeyAu Y29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDI3MDEtbW1zeXMiLA0KPiAtCSAgLmRhdGEgPSAmbXQy NzAxX21tc3lzX2RyaXZlcl9kYXRhfSwNCj4gLQl7IC5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10 NzYyMy1tbXN5cyIsDQo+IC0JICAuZGF0YSA9ICZtdDc2MjNfbW1zeXNfZHJpdmVyX2RhdGF9LA0K PiAtCXsgLmNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQyNzEyLW1tc3lzIiwNCj4gLQkgIC5kYXRh ID0gJm10MjcxMl9tbXN5c19kcml2ZXJfZGF0YX0sDQo+IC0JeyAuY29tcGF0aWJsZSA9ICJtZWRp YXRlayxtdDgxNzMtbW1zeXMiLA0KPiAtCSAgLmRhdGEgPSAmbXQ4MTczX21tc3lzX2RyaXZlcl9k YXRhfSwNCj4gLQl7IC5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10ODE4My1tbXN5cyIsDQo+IC0J ICAuZGF0YSA9ICZtdDgxODNfbW1zeXNfZHJpdmVyX2RhdGF9LA0KPiAtCXsuY29tcGF0aWJsZSA9 ICJtZWRpYXRlayxtdDgxOTUtdmRvc3lzMCIsDQo+IC0JICAuZGF0YSA9ICZtdDgxOTVfdmRvc3lz MF9kcml2ZXJfZGF0YX0sDQo+IC0JeyB9DQo+IC19Ow0KPiAtTU9EVUxFX0RFVklDRV9UQUJMRShv ZiwgbXRrX2RybV9vZl9pZHMpOw0KPiAtDQo+ICBzdGF0aWMgaW50IG10a19kcm1fcHJvYmUoc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikNCj4gIHsNCj4gIAlzdHJ1Y3QgZGV2aWNlICpkZXYg PSAmcGRldi0+ZGV2Ow0KPiAgCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGhhbmRsZSA9IGRldi0+cGFy ZW50LT5vZl9ub2RlOw0KPiAgCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOw0KPiAr CWNvbnN0IHN0cnVjdCBtdGtfbW1zeXNfZHJpdmVyX2RhdGEgKmRydl9kYXRhOw0KPiAgCXN0cnVj dCBtdGtfZHJtX3ByaXZhdGUgKnByaXZhdGU7DQo+ICAJc3RydWN0IGRldmljZV9ub2RlICpub2Rl Ow0KPiAgCXN0cnVjdCBjb21wb25lbnRfbWF0Y2ggKm1hdGNoID0gTlVMTDsNCj4gKwlzdHJ1Y3Qg bXRrX21tc3lzX3ByaXZhdGUgKm1tc3lzX3ByaXY7DQo+ICAJaW50IHJldDsNCj4gIAlpbnQgaTsN Cj4gIA0KPiArCW9mX2lkID0gb2ZfbWF0Y2hfbm9kZShtdGtfZHJtX29mX2lkcywgcGhhbmRsZSk7 DQo+ICsJaWYgKCFvZl9pZCkNCj4gKwkJcmV0dXJuIC1FTk9ERVY7DQo+ICsNCj4gKwlkcnZfZGF0 YSA9IG9mX2lkLT5kYXRhOw0KPiAgCXByaXZhdGUgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yo KnByaXZhdGUpLCBHRlBfS0VSTkVMKTsNCj4gIAlpZiAoIXByaXZhdGUpDQo+ICAJCXJldHVybiAt RU5PTUVNOw0KPiAgDQo+ICsJcHJpdmF0ZS0+YWxsX2RybV9wcml2YXRlID0gZGV2bV9rbWFsbG9j X2FycmF5KGRldiwgZHJ2X2RhdGEtPm1tc3lzX2Rldl9udW0sDQo+ICsJCQkJCQkgICAgICBzaXpl b2YoKnByaXZhdGUtPmFsbF9kcm1fcHJpdmF0ZSksDQo+ICsJCQkJCQkgICAgICBHRlBfS0VSTkVM KTsNCj4gKwlpZiAoIXByaXZhdGUtPmFsbF9kcm1fcHJpdmF0ZSkNCj4gKwkJcmV0dXJuIC1FTk9N RU07DQo+ICsNCj4gKwlwcml2YXRlLT5kYXRhID0gZHJ2X2RhdGE7DQo+ICAJcHJpdmF0ZS0+bW1z eXNfZGV2ID0gZGV2LT5wYXJlbnQ7DQo+ICAJaWYgKCFwcml2YXRlLT5tbXN5c19kZXYpIHsNCj4g IAkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IE1NU1lTIGRldmljZVxuIik7DQo+ICAJCXJl dHVybiAtRU5PREVWOw0KPiAgCX0NCj4gLQ0KPiAtCW9mX2lkID0gb2ZfbWF0Y2hfbm9kZShtdGtf ZHJtX29mX2lkcywgcGhhbmRsZSk7DQo+IC0JaWYgKCFvZl9pZCkNCj4gLQkJcmV0dXJuIC1FTk9E RVY7DQo+IC0NCj4gLQlwcml2YXRlLT5kYXRhID0gb2ZfaWQtPmRhdGE7DQo+ICsJbW1zeXNfcHJp diA9IGRldl9nZXRfZHJ2ZGF0YShwcml2YXRlLT5tbXN5c19kZXYpOw0KPiArCW1tc3lzX3ByaXYt PmRybV9wcml2YXRlID0gcHJpdmF0ZTsNCj4gIA0KPiAgCS8qIEl0ZXJhdGUgb3ZlciBzaWJsaW5n IERJU1AgZnVuY3Rpb24gYmxvY2tzICovDQo+ICAJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShwaGFu ZGxlLT5wYXJlbnQsIG5vZGUpIHsNCj4gQEAgLTU0OCw3ICs3OTQsMTMgQEAgc3RhdGljIGludCBt dGtfZHJtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQo+ICAJCWNvbXBfdHlw ZSA9IChlbnVtIG10a19kZHBfY29tcF90eXBlKW9mX2lkLT5kYXRhOw0KPiAgDQo+ICAJCWlmIChj b21wX3R5cGUgPT0gTVRLX0RJU1BfTVVURVgpIHsNCj4gLQkJCXByaXZhdGUtPm11dGV4X25vZGUg PSBvZl9ub2RlX2dldChub2RlKTsNCj4gKwkJCWludCBpZDsNCj4gKw0KPiArCQkJaWQgPSBvZl9h bGlhc19nZXRfaWQobm9kZSwgIm11dGV4Iik7DQo+ICsJCQlpZiAoaWQgPCAwIHx8IGlkID09IGRy dl9kYXRhLT5tbXN5c19pZCkgew0KPiArCQkJCXByaXZhdGUtPm11dGV4X25vZGUgPSBvZl9ub2Rl X2dldChub2RlKTsNCj4gKwkJCQlkZXZfZGJnKGRldiwgImdldCBtdXRleCBmb3IgbW1zeXMgJWQi LCBkcnZfZGF0YS0+bW1zeXNfaWQpOw0KPiArCQkJfQ0KPiAgCQkJY29udGludWU7DQo+ICAJCX0N Cj4gIA0KPiBAQCAtNTU5LDYgKzgxMSw5IEBAIHN0YXRpYyBpbnQgbXRrX2RybV9wcm9iZShzdHJ1 Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQ0KPiAgCQkJY29udGludWU7DQo+ICAJCX0NCj4gIA0K PiArCQlpZiAoIW10a19kcm1fZmluZF9tbXN5c19jb21wKHByaXZhdGUsIGNvbXBfaWQpKQ0KPiAr CQkJY29udGludWU7DQo+ICsNCj4gIAkJcHJpdmF0ZS0+Y29tcF9ub2RlW2NvbXBfaWRdID0gb2Zf bm9kZV9nZXQobm9kZSk7DQo+ICANCj4gIAkJLyoNCj4gQEAgLTU3Myw2ICs4MjgsNyBAQCBzdGF0 aWMgaW50IG10a19kcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikNCj4gIAkJ ICAgIGNvbXBfdHlwZSA9PSBNVEtfRElTUF9NRVJHRSB8fA0KPiAgCQkgICAgY29tcF90eXBlID09 IE1US19ESVNQX09WTCB8fA0KPiAgCQkgICAgY29tcF90eXBlID09IE1US19ESVNQX09WTF8yTCB8 fA0KPiArCQkgICAgY29tcF90eXBlID09IE1US19ESVNQX1BTRVVET19PVkwgfHwNCj4gIAkJICAg IGNvbXBfdHlwZSA9PSBNVEtfRElTUF9SRE1BIHx8DQo+ICAJCSAgICBjb21wX3R5cGUgPT0gTVRL X0RQSSB8fA0KPiAgCQkgICAgY29tcF90eXBlID09IE1US19EU0kpIHsNCj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJt L21lZGlhdGVrL210a19kcm1fZHJ2LmgNCj4gaW5kZXggYzg3ZWJiNTMwOWQwLi4yMTJlNGY4N2Mz NWMgMTAwNjQ0DQo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2Rydi5o DQo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHJtX2Rydi5oDQo+IEBAIC0y OSwxNCArMjksMTUgQEAgc3RydWN0IG10a19tbXN5c19kcml2ZXJfZGF0YSB7DQo+ICAJdW5zaWdu ZWQgaW50IHRoaXJkX2xlbjsNCj4gIA0KPiAgCWJvb2wgc2hhZG93X3JlZ2lzdGVyOw0KPiArCXVu c2lnbmVkIGludCBtbXN5c19pZDsNCj4gKwl1bnNpZ25lZCBpbnQgbW1zeXNfZGV2X251bTsNCj4g IH07DQo+ICANCj4gIHN0cnVjdCBtdGtfZHJtX3ByaXZhdGUgew0KPiAgCXN0cnVjdCBkcm1fZGV2 aWNlICpkcm07DQo+ICAJc3RydWN0IGRldmljZSAqZG1hX2RldjsNCj4gLQ0KPiAtCXVuc2lnbmVk IGludCBudW1fcGlwZXM7DQo+IC0NCj4gKwlib29sIG10a19kcm1fYm91bmQ7DQo+ICsJc3RydWN0 IGRldmljZSAqZGV2Ow0KPiAgCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbXV0ZXhfbm9kZTsNCj4gIAlz dHJ1Y3QgZGV2aWNlICptdXRleF9kZXY7DQo+ICAJc3RydWN0IGRldmljZSAqbW1zeXNfZGV2Ow0K PiBAQCAtNDQsNiArNDUsNyBAQCBzdHJ1Y3QgbXRrX2RybV9wcml2YXRlIHsNCj4gIAlzdHJ1Y3Qg bXRrX2RkcF9jb21wIGRkcF9jb21wW0REUF9DT01QT05FTlRfSURfTUFYXTsNCj4gIAljb25zdCBz dHJ1Y3QgbXRrX21tc3lzX2RyaXZlcl9kYXRhICpkYXRhOw0KPiAgCXN0cnVjdCBkcm1fYXRvbWlj X3N0YXRlICpzdXNwZW5kX3N0YXRlOw0KPiArCXN0cnVjdCBtdGtfZHJtX3ByaXZhdGUgKiphbGxf ZHJtX3ByaXZhdGU7DQo+ICB9Ow0KPiAgDQo+ICBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RyaXZl ciBtdGtfZGlzcF9jY29ycl9kcml2ZXI7DQoNCg==