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=-8.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, 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 15A1DC43603 for ; Mon, 16 Dec 2019 12:11:00 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D1F5C206CB for ; Mon, 16 Dec 2019 12:10:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727495AbfLPMK6 convert rfc822-to-8bit (ORCPT ); Mon, 16 Dec 2019 07:10:58 -0500 Received: from relay12.mail.gandi.net ([217.70.178.232]:42793 "EHLO relay12.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727558AbfLPMK5 (ORCPT ); Mon, 16 Dec 2019 07:10:57 -0500 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay12.mail.gandi.net (Postfix) with ESMTPSA id 04911200004; Mon, 16 Dec 2019 12:10:45 +0000 (UTC) Date: Mon, 16 Dec 2019 13:10:44 +0100 From: Miquel Raynal To: Andy Yan Cc: Rob Herring , Mark Rutland , devicetree@vger.kernel.org, Heiko Stuebner , linux-rockchip@lists.infradead.org, Daniel Vetter , David Airlie , Sandy Huang , dri-devel@lists.freedesktop.org, Maxime Chevallier , Paul Kocialkowski , Thomas Petazzoni , linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH 09/12] drm/rockchip: lvds: Add PX30 =?UTF-8?B?c3VwcG9y?= =?UTF-8?B?dOOAkOivt+azqOaEj++8jOmCruS7tueUsWxpbnV4LXJvY2tjaGlwLWJvdW5j?= =?UTF-8?B?ZXMrYW5keS55YW49cm9jay1jaGlwcy5jb21AbGlzdHMuaW5mcmFkZWFkLm9y?= =?UTF-8?B?Z+S7o+WPkeOAkQ==?= Message-ID: <20191216131044.38582a49@xps13> In-Reply-To: <02b3373e-790b-5f0c-40a0-7cc423a0dac5@rock-chips.com> References: <20191213181051.25983-1-miquel.raynal@bootlin.com> <20191213181051.25983-10-miquel.raynal@bootlin.com> <02b3373e-790b-5f0c-40a0-7cc423a0dac5@rock-chips.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.4 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Hi Andy, Andy Yan wrote on Mon, 16 Dec 2019 20:00:31 +0800: > Hi Miquel: > > Thanks for your work here. > > A discussion about the grf write macro bellow. > > On 12/14/19 2:10 AM, Miquel Raynal wrote: > > Introduce PX30 LVDS support. This means adding the relevant helper > > functions, a specific probe and also the initialization of a specific > > PHY. > > > > Signed-off-by: Miquel Raynal > > --- > > drivers/gpu/drm/rockchip/rockchip_lvds.c | 173 +++++++++++++++++++++++ > > drivers/gpu/drm/rockchip/rockchip_lvds.h | 14 ++ > > 2 files changed, 187 insertions(+) > > > > diff --git a/drivers/gpu/drm/rockchip/rockchip_lvds.c b/drivers/gpu/drm/rockchip/rockchip_lvds.c > > index a0c203dcd66f..e550c2f102e0 100644 > > --- a/drivers/gpu/drm/rockchip/rockchip_lvds.c > > +++ b/drivers/gpu/drm/rockchip/rockchip_lvds.c > > @@ -10,6 +10,7 @@ > > #include > > #include > > #include > > +#include > > #include > > #include > > #include > > @@ -54,6 +55,7 @@ struct rockchip_lvds { > > void __iomem *regs; > > struct regmap *grf; > > struct clk *pclk; > > + struct phy *dphy; > > const struct rockchip_lvds_soc_data *soc_data; > > int output; /* rgb lvds or dual lvds output */ > > int format; /* vesa or jeida format */ > > @@ -322,6 +324,133 @@ static void rk3288_lvds_encoder_disable(struct drm_encoder *encoder) > > drm_panel_unprepare(lvds->panel); > > } > > > +static int px30_lvds_poweron(struct rockchip_lvds *lvds) > > +{ > > + int ret; > > + > > + ret = pm_runtime_get_sync(lvds->dev); > > + if (ret < 0) { > > + DRM_DEV_ERROR(lvds->dev, "failed to get pm runtime: %d\n", ret); > > + return ret; > > + } > > + > > + /* Enable LVDS mode */ > > + return regmap_update_bits(lvds->grf, PX30_LVDS_GRF_PD_VO_CON1, > > + PX30_LVDS_MODE_EN(1) | PX30_LVDS_P2S_EN(1), > > + PX30_LVDS_MODE_EN(1) | PX30_LVDS_P2S_EN(1)); > > +} > > + > > +static void px30_lvds_poweroff(struct rockchip_lvds *lvds) > > +{ > > + regmap_update_bits(lvds->grf, PX30_LVDS_GRF_PD_VO_CON1, > > + PX30_LVDS_MODE_EN(1) | PX30_LVDS_P2S_EN(1), > > + PX30_LVDS_MODE_EN(0) | PX30_LVDS_P2S_EN(0)); > > + > > + pm_runtime_put(lvds->dev); > > +} > > + > > +static int px30_lvds_grf_config(struct drm_encoder *encoder, > > + struct drm_display_mode *mode) > > +{ > > + struct rockchip_lvds *lvds = encoder_to_lvds(encoder); > > + u8 nhsync = !(mode->flags & DRM_MODE_FLAG_PHSYNC); > > + u8 nvsync = !(mode->flags & DRM_MODE_FLAG_PVSYNC); > > + u8 ndclk = !(mode->flags & DRM_MODE_FLAG_PCSYNC); > > + int ret; > > + > > + if (lvds->output != DISPLAY_OUTPUT_LVDS) { > > + DRM_DEV_ERROR(lvds->dev, "Unsupported display output %d\n", > > + lvds->output); > > + return -EINVAL; > > + } > > + > > + if (nhsync ^ nvsync) { > > + DRM_DEV_ERROR(lvds->dev, "Unsupported Hsync/Vsync polarity\n"); > > + return -EINVAL; > > + } > > + > > + /* Set format */ > > + ret = regmap_update_bits(lvds->grf, PX30_LVDS_GRF_PD_VO_CON1, > > + PX30_LVDS_FORMAT(lvds->format), > > + PX30_LVDS_FORMAT(lvds->format)); > > + if (ret) > > + return ret; > > + > > + /* Control Hsync/Vsync polarity */ > > + ret = regmap_update_bits(lvds->grf, PX30_LVDS_GRF_PD_VO_CON0, > > + PX30_LVDS_TIE_CLKS(1), > > + PX30_LVDS_TIE_CLKS(1)); > > + if (ret) > > + return ret; > > + > > + /* Set Hsync/Vsync polarity */ > > + ret = regmap_update_bits(lvds->grf, PX30_LVDS_GRF_PD_VO_CON0, > > + PX30_LVDS_INVERT_CLKS(1), > > + PX30_LVDS_INVERT_CLKS(nhsync)); > > + if (ret) > > + return ret; > > + > > + /* Set dclk polarity */ > > + return regmap_update_bits(lvds->grf, PX30_LVDS_GRF_PD_VO_CON0, > > + PX30_LVDS_INVERT_DCLK(1), > > + PX30_LVDS_INVERT_DCLK(ndclk)); > > +} > > + > > +static int px30_lvds_set_vop_source(struct rockchip_lvds *lvds, > > + struct drm_encoder *encoder) > > +{ > > + int vop; > > + > > + vop = drm_of_encoder_active_endpoint_id(lvds->dev->of_node, encoder); > > + if (vop < 0) > > + return vop; > > + > > + return regmap_update_bits(lvds->grf, PX30_LVDS_GRF_PD_VO_CON1, > > + PX30_LVDS_VOP_SEL(1), > > + PX30_LVDS_VOP_SEL(vop)); > > +} > > + > > +static void px30_lvds_encoder_enable(struct drm_encoder *encoder) > > +{ > > + struct rockchip_lvds *lvds = encoder_to_lvds(encoder); > > + struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode; > > + int ret; > > + > > + drm_panel_prepare(lvds->panel); > > + > > + ret = px30_lvds_poweron(lvds); > > + if (ret) { > > + DRM_DEV_ERROR(lvds->dev, "failed to power on LVDS: %d\n", ret); > > + drm_panel_unprepare(lvds->panel); > > + return; > > + } > > + > > + ret = px30_lvds_grf_config(encoder, mode); > > + if (ret) { > > + DRM_DEV_ERROR(lvds->dev, "failed to configure LVDS: %d\n", ret); > > + drm_panel_unprepare(lvds->panel); > > + return; > > + } > > + > > + ret = px30_lvds_set_vop_source(lvds, encoder); > > + if (ret) { > > + DRM_DEV_ERROR(lvds->dev, "failed to set VOP source: %d\n", ret); > > + drm_panel_unprepare(lvds->panel); > > + return; > > + } > > + > > + drm_panel_enable(lvds->panel); > > +} > > + > > +static void px30_lvds_encoder_disable(struct drm_encoder *encoder) > > +{ > > + struct rockchip_lvds *lvds = encoder_to_lvds(encoder); > > + > > + drm_panel_disable(lvds->panel); > > + px30_lvds_poweroff(lvds); > > + drm_panel_unprepare(lvds->panel); > > +} > > + > > static const > > struct drm_encoder_helper_funcs rk3288_lvds_encoder_helper_funcs = { > > .enable = rk3288_lvds_encoder_enable, > > @@ -329,6 +458,13 @@ struct drm_encoder_helper_funcs rk3288_lvds_encoder_helper_funcs = { > > .atomic_check = rockchip_lvds_encoder_atomic_check, > > }; > > > +static const > > +struct drm_encoder_helper_funcs px30_lvds_encoder_helper_funcs = { > > + .enable = px30_lvds_encoder_enable, > > + .disable = px30_lvds_encoder_disable, > > + .atomic_check = rockchip_lvds_encoder_atomic_check, > > +}; > > + > > static const struct drm_encoder_funcs rockchip_lvds_encoder_funcs = { > > .destroy = drm_encoder_cleanup, > > }; > > @@ -379,16 +515,53 @@ static int rk3288_lvds_probe(struct platform_device *pdev, > > return 0; > > } > > > +static int px30_lvds_probe(struct platform_device *pdev, > > + struct rockchip_lvds *lvds) > > +{ > > + int ret; > > + > > + /* MSB */ > > + ret = regmap_update_bits(lvds->grf, PX30_LVDS_GRF_PD_VO_CON1, > > + PX30_LVDS_MSBSEL(1), > > + PX30_LVDS_MSBSEL(1)); > > + if (ret) > > + return ret; > > + > > + /* PHY */ > > + lvds->dphy = devm_phy_get(&pdev->dev, "dphy"); > > + if (IS_ERR(lvds->dphy)) > > + return PTR_ERR(lvds->dphy); > > + > > + phy_init(lvds->dphy); > > + if (ret) > > + return ret; > > + > > + phy_set_mode(lvds->dphy, PHY_MODE_LVDS); > > + if (ret) > > + return ret; > > + > > + return phy_power_on(lvds->dphy); > > +} > > + > > static const struct rockchip_lvds_soc_data rk3288_lvds_data = { > > .probe = rk3288_lvds_probe, > > .helper_funcs = &rk3288_lvds_encoder_helper_funcs, > > }; > > > +static const struct rockchip_lvds_soc_data px30_lvds_data = { > > + .probe = px30_lvds_probe, > > + .helper_funcs = &px30_lvds_encoder_helper_funcs, > > +}; > > + > > static const struct of_device_id rockchip_lvds_dt_ids[] = { > > { > > .compatible = "rockchip,rk3288-lvds", > > .data = &rk3288_lvds_data > > }, > > + { > > + .compatible = "rockchip,px30-lvds", > > + .data = &px30_lvds_data > > + }, > > {} > > }; > > MODULE_DEVICE_TABLE(of, rockchip_lvds_dt_ids); > > diff --git a/drivers/gpu/drm/rockchip/rockchip_lvds.h b/drivers/gpu/drm/rockchip/rockchip_lvds.h > > index e41e9ab3c306..7cfb102b4854 100644 > > --- a/drivers/gpu/drm/rockchip/rockchip_lvds.h > > +++ b/drivers/gpu/drm/rockchip/rockchip_lvds.h > > @@ -106,4 +106,18 @@ > > #define LVDS_VESA_18 2 > > #define LVDS_JEIDA_18 3 > > > +#define WRITE_EN(v, h, l) ((GENMASK(h, l) << 16) | (v << l)) > > > How about rename WRITE_EN to HIWORD_UPDATE to keep align with other modules that write grf: such as dwmac-rk.c/dw-mipi-dsi-rockhip.c/dw-hdmi-rockchip.c Sure. It is also the name of this macro in the BSP but I found it so undescriptive that I changed it. I don't like very much its new name neither so I'll go back to the original one. Thanks, Miquèl From mboxrd@z Thu Jan 1 00:00:00 1970 From: Miquel Raynal Subject: Re: [PATCH 09/12] drm/rockchip: lvds: Add PX30 =?UTF-8?B?c3VwcG9y?= =?UTF-8?B?dOOAkOivt+azqOaEj++8jOmCruS7tueUsWxpbnV4LXJvY2tjaGlwLWJvdW5j?= =?UTF-8?B?ZXMrYW5keS55YW49cm9jay1jaGlwcy5jb21AbGlzdHMuaW5mcmFkZWFkLm9y?= =?UTF-8?B?Z+S7o+WPkeOAkQ==?= Date: Mon, 16 Dec 2019 13:10:44 +0100 Message-ID: <20191216131044.38582a49@xps13> References: <20191213181051.25983-1-miquel.raynal@bootlin.com> <20191213181051.25983-10-miquel.raynal@bootlin.com> <02b3373e-790b-5f0c-40a0-7cc423a0dac5@rock-chips.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <02b3373e-790b-5f0c-40a0-7cc423a0dac5@rock-chips.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org To: Andy Yan Cc: Mark Rutland , devicetree@vger.kernel.org, Thomas Petazzoni , Heiko Stuebner , David Airlie , Sandy Huang , dri-devel@lists.freedesktop.org, Maxime Chevallier , Paul Kocialkowski , linux-rockchip@lists.infradead.org, Rob Herring , Daniel Vetter , linux-arm-kernel@lists.infradead.org List-Id: linux-rockchip.vger.kernel.org SGkgQW5keSwKCkFuZHkgWWFuIDxhbmR5LnlhbkByb2NrLWNoaXBzLmNvbT4gd3JvdGUgb24gTW9u LCAxNiBEZWMgMjAxOSAyMDowMDozMQorMDgwMDoKCj4gSGkgTWlxdWVsOgo+IAo+IFRoYW5rcyBm b3IgeW91ciB3b3JrIGhlcmUuCj4gCj4gQSBkaXNjdXNzaW9uIGFib3V0IHRoZSBncmYgd3JpdGUg bWFjcm8gYmVsbG93Lgo+IAo+IE9uIDEyLzE0LzE5IDI6MTAgQU0sIE1pcXVlbCBSYXluYWwgd3Jv dGU6Cj4gPiBJbnRyb2R1Y2UgUFgzMCBMVkRTIHN1cHBvcnQuIFRoaXMgbWVhbnMgYWRkaW5nIHRo ZSByZWxldmFudCBoZWxwZXIKPiA+IGZ1bmN0aW9ucywgYSBzcGVjaWZpYyBwcm9iZSBhbmQgYWxz byB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYSBzcGVjaWZpYwo+ID4gUEhZLgo+ID4KPiA+IFNpZ25l ZC1vZmYtYnk6IE1pcXVlbCBSYXluYWwgPG1pcXVlbC5yYXluYWxAYm9vdGxpbi5jb20+Cj4gPiAt LS0KPiA+ICAgZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2x2ZHMuYyB8IDE3MyAr KysrKysrKysrKysrKysrKysrKysrKwo+ID4gICBkcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9j a2NoaXBfbHZkcy5oIHwgIDE0ICsrCj4gPiAgIDIgZmlsZXMgY2hhbmdlZCwgMTg3IGluc2VydGlv bnMoKykKPiA+Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tj aGlwX2x2ZHMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9sdmRzLmMKPiA+ IGluZGV4IGEwYzIwM2RjZDY2Zi4uZTU1MGMyZjEwMmUwIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVy cy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2x2ZHMuYwo+ID4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2x2ZHMuYwo+ID4gQEAgLTEwLDYgKzEwLDcgQEAKPiA+ICAg I2luY2x1ZGUgPGxpbnV4L2NvbXBvbmVudC5oPgo+ID4gICAjaW5jbHVkZSA8bGludXgvbWZkL3N5 c2Nvbi5oPgo+ID4gICAjaW5jbHVkZSA8bGludXgvb2ZfZ3JhcGguaD4KPiA+ICsjaW5jbHVkZSA8 bGludXgvcGh5L3BoeS5oPgo+ID4gICAjaW5jbHVkZSA8bGludXgvcGluY3RybC9kZXZpbmZvLmg+ Cj4gPiAgICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPiA+ICAgI2luY2x1ZGUg PGxpbnV4L3BtX3J1bnRpbWUuaD4KPiA+IEBAIC01NCw2ICs1NSw3IEBAIHN0cnVjdCByb2NrY2hp cF9sdmRzIHsKPiA+ICAgCXZvaWQgX19pb21lbSAqcmVnczsKPiA+ICAgCXN0cnVjdCByZWdtYXAg KmdyZjsKPiA+ICAgCXN0cnVjdCBjbGsgKnBjbGs7Cj4gPiArCXN0cnVjdCBwaHkgKmRwaHk7Cj4g PiAgIAljb25zdCBzdHJ1Y3Qgcm9ja2NoaXBfbHZkc19zb2NfZGF0YSAqc29jX2RhdGE7Cj4gPiAg IAlpbnQgb3V0cHV0OyAvKiByZ2IgbHZkcyBvciBkdWFsIGx2ZHMgb3V0cHV0ICovCj4gPiAgIAlp bnQgZm9ybWF0OyAvKiB2ZXNhIG9yIGplaWRhIGZvcm1hdCAqLwo+ID4gQEAgLTMyMiw2ICszMjQs MTMzIEBAIHN0YXRpYyB2b2lkIHJrMzI4OF9sdmRzX2VuY29kZXJfZGlzYWJsZShzdHJ1Y3QgZHJt X2VuY29kZXIgKmVuY29kZXIpCj4gPiAgIAlkcm1fcGFuZWxfdW5wcmVwYXJlKGx2ZHMtPnBhbmVs KTsKPiA+ICAgfSAgCj4gPiAgID4gK3N0YXRpYyBpbnQgcHgzMF9sdmRzX3Bvd2Vyb24oc3RydWN0 IHJvY2tjaGlwX2x2ZHMgKmx2ZHMpICAKPiA+ICt7Cj4gPiArCWludCByZXQ7Cj4gPiArCj4gPiAr CXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMobHZkcy0+ZGV2KTsKPiA+ICsJaWYgKHJldCA8IDAp IHsKPiA+ICsJCURSTV9ERVZfRVJST1IobHZkcy0+ZGV2LCAiZmFpbGVkIHRvIGdldCBwbSBydW50 aW1lOiAlZFxuIiwgcmV0KTsKPiA+ICsJCXJldHVybiByZXQ7Cj4gPiArCX0KPiA+ICsKPiA+ICsJ LyogRW5hYmxlIExWRFMgbW9kZSAqLwo+ID4gKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGx2 ZHMtPmdyZiwgUFgzMF9MVkRTX0dSRl9QRF9WT19DT04xLAo+ID4gKwkJCQkgIFBYMzBfTFZEU19N T0RFX0VOKDEpIHwgUFgzMF9MVkRTX1AyU19FTigxKSwKPiA+ICsJCQkJICBQWDMwX0xWRFNfTU9E RV9FTigxKSB8IFBYMzBfTFZEU19QMlNfRU4oMSkpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMg dm9pZCBweDMwX2x2ZHNfcG93ZXJvZmYoc3RydWN0IHJvY2tjaGlwX2x2ZHMgKmx2ZHMpCj4gPiAr ewo+ID4gKwlyZWdtYXBfdXBkYXRlX2JpdHMobHZkcy0+Z3JmLCBQWDMwX0xWRFNfR1JGX1BEX1ZP X0NPTjEsCj4gPiArCQkJICAgUFgzMF9MVkRTX01PREVfRU4oMSkgfCBQWDMwX0xWRFNfUDJTX0VO KDEpLAo+ID4gKwkJCSAgIFBYMzBfTFZEU19NT0RFX0VOKDApIHwgUFgzMF9MVkRTX1AyU19FTigw KSk7Cj4gPiArCj4gPiArCXBtX3J1bnRpbWVfcHV0KGx2ZHMtPmRldik7Cj4gPiArfQo+ID4gKwo+ ID4gK3N0YXRpYyBpbnQgcHgzMF9sdmRzX2dyZl9jb25maWcoc3RydWN0IGRybV9lbmNvZGVyICpl bmNvZGVyLAo+ID4gKwkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKPiA+ICt7Cj4g PiArCXN0cnVjdCByb2NrY2hpcF9sdmRzICpsdmRzID0gZW5jb2Rlcl90b19sdmRzKGVuY29kZXIp Owo+ID4gKwl1OCBuaHN5bmMgPSAhKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QSFNZTkMp Owo+ID4gKwl1OCBudnN5bmMgPSAhKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QVlNZTkMp Owo+ID4gKwl1OCBuZGNsayA9ICEobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX1BDU1lOQyk7 Cj4gPiArCWludCByZXQ7Cj4gPiArCj4gPiArCWlmIChsdmRzLT5vdXRwdXQgIT0gRElTUExBWV9P VVRQVVRfTFZEUykgewo+ID4gKwkJRFJNX0RFVl9FUlJPUihsdmRzLT5kZXYsICJVbnN1cHBvcnRl ZCBkaXNwbGF5IG91dHB1dCAlZFxuIiwKPiA+ICsJCQkgICAgICBsdmRzLT5vdXRwdXQpOwo+ID4g KwkJcmV0dXJuIC1FSU5WQUw7Cj4gPiArCX0KPiA+ICsKPiA+ICsJaWYgKG5oc3luYyBeIG52c3lu Yykgewo+ID4gKwkJRFJNX0RFVl9FUlJPUihsdmRzLT5kZXYsICJVbnN1cHBvcnRlZCBIc3luYy9W c3luYyBwb2xhcml0eVxuIik7Cj4gPiArCQlyZXR1cm4gLUVJTlZBTDsKPiA+ICsJfQo+ID4gKwo+ ID4gKwkvKiBTZXQgZm9ybWF0ICovCj4gPiArCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhsdmRz LT5ncmYsIFBYMzBfTFZEU19HUkZfUERfVk9fQ09OMSwKPiA+ICsJCQkJIFBYMzBfTFZEU19GT1JN QVQobHZkcy0+Zm9ybWF0KSwKPiA+ICsJCQkJIFBYMzBfTFZEU19GT1JNQVQobHZkcy0+Zm9ybWF0 KSk7Cj4gPiArCWlmIChyZXQpCj4gPiArCQlyZXR1cm4gcmV0Owo+ID4gKwo+ID4gKwkvKiBDb250 cm9sIEhzeW5jL1ZzeW5jIHBvbGFyaXR5ICovCj4gPiArCXJldCA9IHJlZ21hcF91cGRhdGVfYml0 cyhsdmRzLT5ncmYsIFBYMzBfTFZEU19HUkZfUERfVk9fQ09OMCwKPiA+ICsJCQkJIFBYMzBfTFZE U19USUVfQ0xLUygxKSwKPiA+ICsJCQkJIFBYMzBfTFZEU19USUVfQ0xLUygxKSk7Cj4gPiArCWlm IChyZXQpCj4gPiArCQlyZXR1cm4gcmV0Owo+ID4gKwo+ID4gKwkvKiBTZXQgSHN5bmMvVnN5bmMg cG9sYXJpdHkgKi8KPiA+ICsJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGx2ZHMtPmdyZiwgUFgz MF9MVkRTX0dSRl9QRF9WT19DT04wLAo+ID4gKwkJCQkgUFgzMF9MVkRTX0lOVkVSVF9DTEtTKDEp LAo+ID4gKwkJCQkgUFgzMF9MVkRTX0lOVkVSVF9DTEtTKG5oc3luYykpOwo+ID4gKwlpZiAocmV0 KQo+ID4gKwkJcmV0dXJuIHJldDsKPiA+ICsKPiA+ICsJLyogU2V0IGRjbGsgcG9sYXJpdHkgKi8K PiA+ICsJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhsdmRzLT5ncmYsIFBYMzBfTFZEU19HUkZf UERfVk9fQ09OMCwKPiA+ICsJCQkJICBQWDMwX0xWRFNfSU5WRVJUX0RDTEsoMSksCj4gPiArCQkJ CSAgUFgzMF9MVkRTX0lOVkVSVF9EQ0xLKG5kY2xrKSk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRp YyBpbnQgcHgzMF9sdmRzX3NldF92b3Bfc291cmNlKHN0cnVjdCByb2NrY2hpcF9sdmRzICpsdmRz LAo+ID4gKwkJCQkgICAgc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQo+ID4gK3sKPiA+ICsJ aW50IHZvcDsKPiA+ICsKPiA+ICsJdm9wID0gZHJtX29mX2VuY29kZXJfYWN0aXZlX2VuZHBvaW50 X2lkKGx2ZHMtPmRldi0+b2Zfbm9kZSwgZW5jb2Rlcik7Cj4gPiArCWlmICh2b3AgPCAwKQo+ID4g KwkJcmV0dXJuIHZvcDsKPiA+ICsKPiA+ICsJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhsdmRz LT5ncmYsIFBYMzBfTFZEU19HUkZfUERfVk9fQ09OMSwKPiA+ICsJCQkJICBQWDMwX0xWRFNfVk9Q X1NFTCgxKSwKPiA+ICsJCQkJICBQWDMwX0xWRFNfVk9QX1NFTCh2b3ApKTsKPiA+ICt9Cj4gPiAr Cj4gPiArc3RhdGljIHZvaWQgcHgzMF9sdmRzX2VuY29kZXJfZW5hYmxlKHN0cnVjdCBkcm1fZW5j b2RlciAqZW5jb2RlcikKPiA+ICt7Cj4gPiArCXN0cnVjdCByb2NrY2hpcF9sdmRzICpsdmRzID0g ZW5jb2Rlcl90b19sdmRzKGVuY29kZXIpOwo+ID4gKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAq bW9kZSA9ICZlbmNvZGVyLT5jcnRjLT5zdGF0ZS0+YWRqdXN0ZWRfbW9kZTsKPiA+ICsJaW50IHJl dDsKPiA+ICsKPiA+ICsJZHJtX3BhbmVsX3ByZXBhcmUobHZkcy0+cGFuZWwpOwo+ID4gKwo+ID4g KwlyZXQgPSBweDMwX2x2ZHNfcG93ZXJvbihsdmRzKTsKPiA+ICsJaWYgKHJldCkgewo+ID4gKwkJ RFJNX0RFVl9FUlJPUihsdmRzLT5kZXYsICJmYWlsZWQgdG8gcG93ZXIgb24gTFZEUzogJWRcbiIs IHJldCk7Cj4gPiArCQlkcm1fcGFuZWxfdW5wcmVwYXJlKGx2ZHMtPnBhbmVsKTsKPiA+ICsJCXJl dHVybjsKPiA+ICsJfQo+ID4gKwo+ID4gKwlyZXQgPSBweDMwX2x2ZHNfZ3JmX2NvbmZpZyhlbmNv ZGVyLCBtb2RlKTsKPiA+ICsJaWYgKHJldCkgewo+ID4gKwkJRFJNX0RFVl9FUlJPUihsdmRzLT5k ZXYsICJmYWlsZWQgdG8gY29uZmlndXJlIExWRFM6ICVkXG4iLCByZXQpOwo+ID4gKwkJZHJtX3Bh bmVsX3VucHJlcGFyZShsdmRzLT5wYW5lbCk7Cj4gPiArCQlyZXR1cm47Cj4gPiArCX0KPiA+ICsK PiA+ICsJcmV0ID0gcHgzMF9sdmRzX3NldF92b3Bfc291cmNlKGx2ZHMsIGVuY29kZXIpOwo+ID4g KwlpZiAocmV0KSB7Cj4gPiArCQlEUk1fREVWX0VSUk9SKGx2ZHMtPmRldiwgImZhaWxlZCB0byBz ZXQgVk9QIHNvdXJjZTogJWRcbiIsIHJldCk7Cj4gPiArCQlkcm1fcGFuZWxfdW5wcmVwYXJlKGx2 ZHMtPnBhbmVsKTsKPiA+ICsJCXJldHVybjsKPiA+ICsJfQo+ID4gKwo+ID4gKwlkcm1fcGFuZWxf ZW5hYmxlKGx2ZHMtPnBhbmVsKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgcHgzMF9s dmRzX2VuY29kZXJfZGlzYWJsZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCj4gPiArewo+ ID4gKwlzdHJ1Y3Qgcm9ja2NoaXBfbHZkcyAqbHZkcyA9IGVuY29kZXJfdG9fbHZkcyhlbmNvZGVy KTsKPiA+ICsKPiA+ICsJZHJtX3BhbmVsX2Rpc2FibGUobHZkcy0+cGFuZWwpOwo+ID4gKwlweDMw X2x2ZHNfcG93ZXJvZmYobHZkcyk7Cj4gPiArCWRybV9wYW5lbF91bnByZXBhcmUobHZkcy0+cGFu ZWwpOwo+ID4gK30KPiA+ICsKPiA+ICAgc3RhdGljIGNvbnN0Cj4gPiAgIHN0cnVjdCBkcm1fZW5j b2Rlcl9oZWxwZXJfZnVuY3MgcmszMjg4X2x2ZHNfZW5jb2Rlcl9oZWxwZXJfZnVuY3MgPSB7Cj4g PiAgIAkuZW5hYmxlID0gcmszMjg4X2x2ZHNfZW5jb2Rlcl9lbmFibGUsCj4gPiBAQCAtMzI5LDYg KzQ1OCwxMyBAQCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIHJrMzI4OF9sdmRzX2Vu Y29kZXJfaGVscGVyX2Z1bmNzID0gewo+ID4gICAJLmF0b21pY19jaGVjayA9IHJvY2tjaGlwX2x2 ZHNfZW5jb2Rlcl9hdG9taWNfY2hlY2ssCj4gPiAgIH07ICAKPiA+ICAgPiArc3RhdGljIGNvbnN0 ICAKPiA+ICtzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIHB4MzBfbHZkc19lbmNvZGVy X2hlbHBlcl9mdW5jcyA9IHsKPiA+ICsJLmVuYWJsZSA9IHB4MzBfbHZkc19lbmNvZGVyX2VuYWJs ZSwKPiA+ICsJLmRpc2FibGUgPSBweDMwX2x2ZHNfZW5jb2Rlcl9kaXNhYmxlLAo+ID4gKwkuYXRv bWljX2NoZWNrID0gcm9ja2NoaXBfbHZkc19lbmNvZGVyX2F0b21pY19jaGVjaywKPiA+ICt9Owo+ ID4gKwo+ID4gICBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIHJvY2tjaGlw X2x2ZHNfZW5jb2Rlcl9mdW5jcyA9IHsKPiA+ICAgCS5kZXN0cm95ID0gZHJtX2VuY29kZXJfY2xl YW51cCwKPiA+ICAgfTsKPiA+IEBAIC0zNzksMTYgKzUxNSw1MyBAQCBzdGF0aWMgaW50IHJrMzI4 OF9sdmRzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCj4gPiAgIAlyZXR1cm4g MDsKPiA+ICAgfSAgCj4gPiAgID4gK3N0YXRpYyBpbnQgcHgzMF9sdmRzX3Byb2JlKHN0cnVjdCBw bGF0Zm9ybV9kZXZpY2UgKnBkZXYsICAKPiA+ICsJCQkgICBzdHJ1Y3Qgcm9ja2NoaXBfbHZkcyAq bHZkcykKPiA+ICt7Cj4gPiArCWludCByZXQ7Cj4gPiArCj4gPiArCS8qIE1TQiAqLwo+ID4gKwly ZXQgPSAgcmVnbWFwX3VwZGF0ZV9iaXRzKGx2ZHMtPmdyZiwgUFgzMF9MVkRTX0dSRl9QRF9WT19D T04xLAo+ID4gKwkJCQkgIFBYMzBfTFZEU19NU0JTRUwoMSksCj4gPiArCQkJCSAgUFgzMF9MVkRT X01TQlNFTCgxKSk7Cj4gPiArCWlmIChyZXQpCj4gPiArCQlyZXR1cm4gcmV0Owo+ID4gKwo+ID4g KwkvKiBQSFkgKi8KPiA+ICsJbHZkcy0+ZHBoeSA9IGRldm1fcGh5X2dldCgmcGRldi0+ZGV2LCAi ZHBoeSIpOwo+ID4gKwlpZiAoSVNfRVJSKGx2ZHMtPmRwaHkpKQo+ID4gKwkJcmV0dXJuIFBUUl9F UlIobHZkcy0+ZHBoeSk7Cj4gPiArCj4gPiArCXBoeV9pbml0KGx2ZHMtPmRwaHkpOwo+ID4gKwlp ZiAocmV0KQo+ID4gKwkJcmV0dXJuIHJldDsKPiA+ICsKPiA+ICsJcGh5X3NldF9tb2RlKGx2ZHMt PmRwaHksIFBIWV9NT0RFX0xWRFMpOwo+ID4gKwlpZiAocmV0KQo+ID4gKwkJcmV0dXJuIHJldDsK PiA+ICsKPiA+ICsJcmV0dXJuIHBoeV9wb3dlcl9vbihsdmRzLT5kcGh5KTsKPiA+ICt9Cj4gPiAr Cj4gPiAgIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgcm9ja2NoaXBfbHZkc19zb2NfZGF0YSByazMyODhf bHZkc19kYXRhID0gewo+ID4gICAJLnByb2JlID0gcmszMjg4X2x2ZHNfcHJvYmUsCj4gPiAgIAku aGVscGVyX2Z1bmNzID0gJnJrMzI4OF9sdmRzX2VuY29kZXJfaGVscGVyX2Z1bmNzLAo+ID4gICB9 OyAgCj4gPiAgID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgcm9ja2NoaXBfbHZkc19zb2NfZGF0YSBw eDMwX2x2ZHNfZGF0YSA9IHsgIAo+ID4gKwkucHJvYmUgPSBweDMwX2x2ZHNfcHJvYmUsCj4gPiAr CS5oZWxwZXJfZnVuY3MgPSAmcHgzMF9sdmRzX2VuY29kZXJfaGVscGVyX2Z1bmNzLAo+ID4gK307 Cj4gPiArCj4gPiAgIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJvY2tjaGlwX2x2 ZHNfZHRfaWRzW10gPSB7Cj4gPiAgIAl7Cj4gPiAgIAkJLmNvbXBhdGlibGUgPSAicm9ja2NoaXAs cmszMjg4LWx2ZHMiLAo+ID4gICAJCS5kYXRhID0gJnJrMzI4OF9sdmRzX2RhdGEKPiA+ICAgCX0s Cj4gPiArCXsKPiA+ICsJCS5jb21wYXRpYmxlID0gInJvY2tjaGlwLHB4MzAtbHZkcyIsCj4gPiAr CQkuZGF0YSA9ICZweDMwX2x2ZHNfZGF0YQo+ID4gKwl9LAo+ID4gICAJe30KPiA+ICAgfTsKPiA+ ICAgTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcm9ja2NoaXBfbHZkc19kdF9pZHMpOwo+ID4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9sdmRzLmggYi9kcml2 ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfbHZkcy5oCj4gPiBpbmRleCBlNDFlOWFiM2Mz MDYuLjdjZmIxMDJiNDg1NCAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hp cC9yb2NrY2hpcF9sdmRzLmgKPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2Nr Y2hpcF9sdmRzLmgKPiA+IEBAIC0xMDYsNCArMTA2LDE4IEBACj4gPiAgICNkZWZpbmUgTFZEU19W RVNBXzE4CQkJCTIKPiA+ICAgI2RlZmluZSBMVkRTX0pFSURBXzE4CQkJCTMgIAo+ID4gICA+ICsj ZGVmaW5lIFdSSVRFX0VOKHYsIGgsIGwpICAoKEdFTk1BU0soaCwgbCkgPDwgMTYpIHwgKHYgPDwg bCkpICAKPiAKPiAKPiBIb3cgYWJvdXQgcmVuYW1lIFdSSVRFX0VOIHRvIEhJV09SRF9VUERBVEUg dG8ga2VlcCBhbGlnbiB3aXRoIG90aGVyIG1vZHVsZXMgdGhhdCB3cml0ZSBncmY6IHN1Y2ggYXMg ZHdtYWMtcmsuYy9kdy1taXBpLWRzaS1yb2NraGlwLmMvZHctaGRtaS1yb2NrY2hpcC5jCgpTdXJl LiBJdCBpcyBhbHNvIHRoZSBuYW1lIG9mIHRoaXMgbWFjcm8gaW4gdGhlIEJTUCBidXQgSSBmb3Vu ZCBpdCBzbwp1bmRlc2NyaXB0aXZlIHRoYXQgSSBjaGFuZ2VkIGl0LiBJIGRvbid0IGxpa2UgdmVy eSBtdWNoIGl0cyBuZXcgbmFtZQpuZWl0aGVyIHNvIEknbGwgZ28gYmFjayB0byB0aGUgb3JpZ2lu YWwgb25lLgoKVGhhbmtzLApNaXF1w6hsCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0t a2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFp bG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg== 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=-8.3 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, 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 9FC04C43603 for ; Tue, 17 Dec 2019 10:33:08 +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 7FED6206B7 for ; Tue, 17 Dec 2019 10:33:08 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7FED6206B7 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id BABF26E993; Tue, 17 Dec 2019 10:32:00 +0000 (UTC) Received: from relay12.mail.gandi.net (relay12.mail.gandi.net [217.70.178.232]) by gabe.freedesktop.org (Postfix) with ESMTPS id 719756E141 for ; Mon, 16 Dec 2019 12:10:56 +0000 (UTC) Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay12.mail.gandi.net (Postfix) with ESMTPSA id 04911200004; Mon, 16 Dec 2019 12:10:45 +0000 (UTC) Date: Mon, 16 Dec 2019 13:10:44 +0100 From: Miquel Raynal To: Andy Yan Subject: Re: [PATCH 09/12] drm/rockchip: lvds: Add PX30 =?UTF-8?B?c3VwcG9y?= =?UTF-8?B?dOOAkOivt+azqOaEj++8jOmCruS7tueUsWxpbnV4LXJvY2tjaGlwLWJvdW5j?= =?UTF-8?B?ZXMrYW5keS55YW49cm9jay1jaGlwcy5jb21AbGlzdHMuaW5mcmFkZWFkLm9y?= =?UTF-8?B?Z+S7o+WPkeOAkQ==?= Message-ID: <20191216131044.38582a49@xps13> In-Reply-To: <02b3373e-790b-5f0c-40a0-7cc423a0dac5@rock-chips.com> References: <20191213181051.25983-1-miquel.raynal@bootlin.com> <20191213181051.25983-10-miquel.raynal@bootlin.com> <02b3373e-790b-5f0c-40a0-7cc423a0dac5@rock-chips.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.4 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-Mailman-Approved-At: Tue, 17 Dec 2019 10:31:56 +0000 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: , Cc: Mark Rutland , devicetree@vger.kernel.org, Thomas Petazzoni , David Airlie , Sandy Huang , dri-devel@lists.freedesktop.org, Maxime Chevallier , Paul Kocialkowski , linux-rockchip@lists.infradead.org, Rob Herring , linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" SGkgQW5keSwKCkFuZHkgWWFuIDxhbmR5LnlhbkByb2NrLWNoaXBzLmNvbT4gd3JvdGUgb24gTW9u LCAxNiBEZWMgMjAxOSAyMDowMDozMQorMDgwMDoKCj4gSGkgTWlxdWVsOgo+IAo+IFRoYW5rcyBm b3IgeW91ciB3b3JrIGhlcmUuCj4gCj4gQSBkaXNjdXNzaW9uIGFib3V0IHRoZSBncmYgd3JpdGUg bWFjcm8gYmVsbG93Lgo+IAo+IE9uIDEyLzE0LzE5IDI6MTAgQU0sIE1pcXVlbCBSYXluYWwgd3Jv dGU6Cj4gPiBJbnRyb2R1Y2UgUFgzMCBMVkRTIHN1cHBvcnQuIFRoaXMgbWVhbnMgYWRkaW5nIHRo ZSByZWxldmFudCBoZWxwZXIKPiA+IGZ1bmN0aW9ucywgYSBzcGVjaWZpYyBwcm9iZSBhbmQgYWxz byB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYSBzcGVjaWZpYwo+ID4gUEhZLgo+ID4KPiA+IFNpZ25l ZC1vZmYtYnk6IE1pcXVlbCBSYXluYWwgPG1pcXVlbC5yYXluYWxAYm9vdGxpbi5jb20+Cj4gPiAt LS0KPiA+ICAgZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2x2ZHMuYyB8IDE3MyAr KysrKysrKysrKysrKysrKysrKysrKwo+ID4gICBkcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9j a2NoaXBfbHZkcy5oIHwgIDE0ICsrCj4gPiAgIDIgZmlsZXMgY2hhbmdlZCwgMTg3IGluc2VydGlv bnMoKykKPiA+Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tj aGlwX2x2ZHMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9sdmRzLmMKPiA+ IGluZGV4IGEwYzIwM2RjZDY2Zi4uZTU1MGMyZjEwMmUwIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVy cy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2x2ZHMuYwo+ID4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2x2ZHMuYwo+ID4gQEAgLTEwLDYgKzEwLDcgQEAKPiA+ICAg I2luY2x1ZGUgPGxpbnV4L2NvbXBvbmVudC5oPgo+ID4gICAjaW5jbHVkZSA8bGludXgvbWZkL3N5 c2Nvbi5oPgo+ID4gICAjaW5jbHVkZSA8bGludXgvb2ZfZ3JhcGguaD4KPiA+ICsjaW5jbHVkZSA8 bGludXgvcGh5L3BoeS5oPgo+ID4gICAjaW5jbHVkZSA8bGludXgvcGluY3RybC9kZXZpbmZvLmg+ Cj4gPiAgICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPiA+ICAgI2luY2x1ZGUg PGxpbnV4L3BtX3J1bnRpbWUuaD4KPiA+IEBAIC01NCw2ICs1NSw3IEBAIHN0cnVjdCByb2NrY2hp cF9sdmRzIHsKPiA+ICAgCXZvaWQgX19pb21lbSAqcmVnczsKPiA+ICAgCXN0cnVjdCByZWdtYXAg KmdyZjsKPiA+ICAgCXN0cnVjdCBjbGsgKnBjbGs7Cj4gPiArCXN0cnVjdCBwaHkgKmRwaHk7Cj4g PiAgIAljb25zdCBzdHJ1Y3Qgcm9ja2NoaXBfbHZkc19zb2NfZGF0YSAqc29jX2RhdGE7Cj4gPiAg IAlpbnQgb3V0cHV0OyAvKiByZ2IgbHZkcyBvciBkdWFsIGx2ZHMgb3V0cHV0ICovCj4gPiAgIAlp bnQgZm9ybWF0OyAvKiB2ZXNhIG9yIGplaWRhIGZvcm1hdCAqLwo+ID4gQEAgLTMyMiw2ICszMjQs MTMzIEBAIHN0YXRpYyB2b2lkIHJrMzI4OF9sdmRzX2VuY29kZXJfZGlzYWJsZShzdHJ1Y3QgZHJt X2VuY29kZXIgKmVuY29kZXIpCj4gPiAgIAlkcm1fcGFuZWxfdW5wcmVwYXJlKGx2ZHMtPnBhbmVs KTsKPiA+ICAgfSAgCj4gPiAgID4gK3N0YXRpYyBpbnQgcHgzMF9sdmRzX3Bvd2Vyb24oc3RydWN0 IHJvY2tjaGlwX2x2ZHMgKmx2ZHMpICAKPiA+ICt7Cj4gPiArCWludCByZXQ7Cj4gPiArCj4gPiAr CXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMobHZkcy0+ZGV2KTsKPiA+ICsJaWYgKHJldCA8IDAp IHsKPiA+ICsJCURSTV9ERVZfRVJST1IobHZkcy0+ZGV2LCAiZmFpbGVkIHRvIGdldCBwbSBydW50 aW1lOiAlZFxuIiwgcmV0KTsKPiA+ICsJCXJldHVybiByZXQ7Cj4gPiArCX0KPiA+ICsKPiA+ICsJ LyogRW5hYmxlIExWRFMgbW9kZSAqLwo+ID4gKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGx2 ZHMtPmdyZiwgUFgzMF9MVkRTX0dSRl9QRF9WT19DT04xLAo+ID4gKwkJCQkgIFBYMzBfTFZEU19N T0RFX0VOKDEpIHwgUFgzMF9MVkRTX1AyU19FTigxKSwKPiA+ICsJCQkJICBQWDMwX0xWRFNfTU9E RV9FTigxKSB8IFBYMzBfTFZEU19QMlNfRU4oMSkpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMg dm9pZCBweDMwX2x2ZHNfcG93ZXJvZmYoc3RydWN0IHJvY2tjaGlwX2x2ZHMgKmx2ZHMpCj4gPiAr ewo+ID4gKwlyZWdtYXBfdXBkYXRlX2JpdHMobHZkcy0+Z3JmLCBQWDMwX0xWRFNfR1JGX1BEX1ZP X0NPTjEsCj4gPiArCQkJICAgUFgzMF9MVkRTX01PREVfRU4oMSkgfCBQWDMwX0xWRFNfUDJTX0VO KDEpLAo+ID4gKwkJCSAgIFBYMzBfTFZEU19NT0RFX0VOKDApIHwgUFgzMF9MVkRTX1AyU19FTigw KSk7Cj4gPiArCj4gPiArCXBtX3J1bnRpbWVfcHV0KGx2ZHMtPmRldik7Cj4gPiArfQo+ID4gKwo+ ID4gK3N0YXRpYyBpbnQgcHgzMF9sdmRzX2dyZl9jb25maWcoc3RydWN0IGRybV9lbmNvZGVyICpl bmNvZGVyLAo+ID4gKwkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKPiA+ICt7Cj4g PiArCXN0cnVjdCByb2NrY2hpcF9sdmRzICpsdmRzID0gZW5jb2Rlcl90b19sdmRzKGVuY29kZXIp Owo+ID4gKwl1OCBuaHN5bmMgPSAhKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QSFNZTkMp Owo+ID4gKwl1OCBudnN5bmMgPSAhKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QVlNZTkMp Owo+ID4gKwl1OCBuZGNsayA9ICEobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX1BDU1lOQyk7 Cj4gPiArCWludCByZXQ7Cj4gPiArCj4gPiArCWlmIChsdmRzLT5vdXRwdXQgIT0gRElTUExBWV9P VVRQVVRfTFZEUykgewo+ID4gKwkJRFJNX0RFVl9FUlJPUihsdmRzLT5kZXYsICJVbnN1cHBvcnRl ZCBkaXNwbGF5IG91dHB1dCAlZFxuIiwKPiA+ICsJCQkgICAgICBsdmRzLT5vdXRwdXQpOwo+ID4g KwkJcmV0dXJuIC1FSU5WQUw7Cj4gPiArCX0KPiA+ICsKPiA+ICsJaWYgKG5oc3luYyBeIG52c3lu Yykgewo+ID4gKwkJRFJNX0RFVl9FUlJPUihsdmRzLT5kZXYsICJVbnN1cHBvcnRlZCBIc3luYy9W c3luYyBwb2xhcml0eVxuIik7Cj4gPiArCQlyZXR1cm4gLUVJTlZBTDsKPiA+ICsJfQo+ID4gKwo+ ID4gKwkvKiBTZXQgZm9ybWF0ICovCj4gPiArCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhsdmRz LT5ncmYsIFBYMzBfTFZEU19HUkZfUERfVk9fQ09OMSwKPiA+ICsJCQkJIFBYMzBfTFZEU19GT1JN QVQobHZkcy0+Zm9ybWF0KSwKPiA+ICsJCQkJIFBYMzBfTFZEU19GT1JNQVQobHZkcy0+Zm9ybWF0 KSk7Cj4gPiArCWlmIChyZXQpCj4gPiArCQlyZXR1cm4gcmV0Owo+ID4gKwo+ID4gKwkvKiBDb250 cm9sIEhzeW5jL1ZzeW5jIHBvbGFyaXR5ICovCj4gPiArCXJldCA9IHJlZ21hcF91cGRhdGVfYml0 cyhsdmRzLT5ncmYsIFBYMzBfTFZEU19HUkZfUERfVk9fQ09OMCwKPiA+ICsJCQkJIFBYMzBfTFZE U19USUVfQ0xLUygxKSwKPiA+ICsJCQkJIFBYMzBfTFZEU19USUVfQ0xLUygxKSk7Cj4gPiArCWlm IChyZXQpCj4gPiArCQlyZXR1cm4gcmV0Owo+ID4gKwo+ID4gKwkvKiBTZXQgSHN5bmMvVnN5bmMg cG9sYXJpdHkgKi8KPiA+ICsJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGx2ZHMtPmdyZiwgUFgz MF9MVkRTX0dSRl9QRF9WT19DT04wLAo+ID4gKwkJCQkgUFgzMF9MVkRTX0lOVkVSVF9DTEtTKDEp LAo+ID4gKwkJCQkgUFgzMF9MVkRTX0lOVkVSVF9DTEtTKG5oc3luYykpOwo+ID4gKwlpZiAocmV0 KQo+ID4gKwkJcmV0dXJuIHJldDsKPiA+ICsKPiA+ICsJLyogU2V0IGRjbGsgcG9sYXJpdHkgKi8K PiA+ICsJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhsdmRzLT5ncmYsIFBYMzBfTFZEU19HUkZf UERfVk9fQ09OMCwKPiA+ICsJCQkJICBQWDMwX0xWRFNfSU5WRVJUX0RDTEsoMSksCj4gPiArCQkJ CSAgUFgzMF9MVkRTX0lOVkVSVF9EQ0xLKG5kY2xrKSk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRp YyBpbnQgcHgzMF9sdmRzX3NldF92b3Bfc291cmNlKHN0cnVjdCByb2NrY2hpcF9sdmRzICpsdmRz LAo+ID4gKwkJCQkgICAgc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQo+ID4gK3sKPiA+ICsJ aW50IHZvcDsKPiA+ICsKPiA+ICsJdm9wID0gZHJtX29mX2VuY29kZXJfYWN0aXZlX2VuZHBvaW50 X2lkKGx2ZHMtPmRldi0+b2Zfbm9kZSwgZW5jb2Rlcik7Cj4gPiArCWlmICh2b3AgPCAwKQo+ID4g KwkJcmV0dXJuIHZvcDsKPiA+ICsKPiA+ICsJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhsdmRz LT5ncmYsIFBYMzBfTFZEU19HUkZfUERfVk9fQ09OMSwKPiA+ICsJCQkJICBQWDMwX0xWRFNfVk9Q X1NFTCgxKSwKPiA+ICsJCQkJICBQWDMwX0xWRFNfVk9QX1NFTCh2b3ApKTsKPiA+ICt9Cj4gPiAr Cj4gPiArc3RhdGljIHZvaWQgcHgzMF9sdmRzX2VuY29kZXJfZW5hYmxlKHN0cnVjdCBkcm1fZW5j b2RlciAqZW5jb2RlcikKPiA+ICt7Cj4gPiArCXN0cnVjdCByb2NrY2hpcF9sdmRzICpsdmRzID0g ZW5jb2Rlcl90b19sdmRzKGVuY29kZXIpOwo+ID4gKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAq bW9kZSA9ICZlbmNvZGVyLT5jcnRjLT5zdGF0ZS0+YWRqdXN0ZWRfbW9kZTsKPiA+ICsJaW50IHJl dDsKPiA+ICsKPiA+ICsJZHJtX3BhbmVsX3ByZXBhcmUobHZkcy0+cGFuZWwpOwo+ID4gKwo+ID4g KwlyZXQgPSBweDMwX2x2ZHNfcG93ZXJvbihsdmRzKTsKPiA+ICsJaWYgKHJldCkgewo+ID4gKwkJ RFJNX0RFVl9FUlJPUihsdmRzLT5kZXYsICJmYWlsZWQgdG8gcG93ZXIgb24gTFZEUzogJWRcbiIs IHJldCk7Cj4gPiArCQlkcm1fcGFuZWxfdW5wcmVwYXJlKGx2ZHMtPnBhbmVsKTsKPiA+ICsJCXJl dHVybjsKPiA+ICsJfQo+ID4gKwo+ID4gKwlyZXQgPSBweDMwX2x2ZHNfZ3JmX2NvbmZpZyhlbmNv ZGVyLCBtb2RlKTsKPiA+ICsJaWYgKHJldCkgewo+ID4gKwkJRFJNX0RFVl9FUlJPUihsdmRzLT5k ZXYsICJmYWlsZWQgdG8gY29uZmlndXJlIExWRFM6ICVkXG4iLCByZXQpOwo+ID4gKwkJZHJtX3Bh bmVsX3VucHJlcGFyZShsdmRzLT5wYW5lbCk7Cj4gPiArCQlyZXR1cm47Cj4gPiArCX0KPiA+ICsK PiA+ICsJcmV0ID0gcHgzMF9sdmRzX3NldF92b3Bfc291cmNlKGx2ZHMsIGVuY29kZXIpOwo+ID4g KwlpZiAocmV0KSB7Cj4gPiArCQlEUk1fREVWX0VSUk9SKGx2ZHMtPmRldiwgImZhaWxlZCB0byBz ZXQgVk9QIHNvdXJjZTogJWRcbiIsIHJldCk7Cj4gPiArCQlkcm1fcGFuZWxfdW5wcmVwYXJlKGx2 ZHMtPnBhbmVsKTsKPiA+ICsJCXJldHVybjsKPiA+ICsJfQo+ID4gKwo+ID4gKwlkcm1fcGFuZWxf ZW5hYmxlKGx2ZHMtPnBhbmVsKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgcHgzMF9s dmRzX2VuY29kZXJfZGlzYWJsZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCj4gPiArewo+ ID4gKwlzdHJ1Y3Qgcm9ja2NoaXBfbHZkcyAqbHZkcyA9IGVuY29kZXJfdG9fbHZkcyhlbmNvZGVy KTsKPiA+ICsKPiA+ICsJZHJtX3BhbmVsX2Rpc2FibGUobHZkcy0+cGFuZWwpOwo+ID4gKwlweDMw X2x2ZHNfcG93ZXJvZmYobHZkcyk7Cj4gPiArCWRybV9wYW5lbF91bnByZXBhcmUobHZkcy0+cGFu ZWwpOwo+ID4gK30KPiA+ICsKPiA+ICAgc3RhdGljIGNvbnN0Cj4gPiAgIHN0cnVjdCBkcm1fZW5j b2Rlcl9oZWxwZXJfZnVuY3MgcmszMjg4X2x2ZHNfZW5jb2Rlcl9oZWxwZXJfZnVuY3MgPSB7Cj4g PiAgIAkuZW5hYmxlID0gcmszMjg4X2x2ZHNfZW5jb2Rlcl9lbmFibGUsCj4gPiBAQCAtMzI5LDYg KzQ1OCwxMyBAQCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIHJrMzI4OF9sdmRzX2Vu Y29kZXJfaGVscGVyX2Z1bmNzID0gewo+ID4gICAJLmF0b21pY19jaGVjayA9IHJvY2tjaGlwX2x2 ZHNfZW5jb2Rlcl9hdG9taWNfY2hlY2ssCj4gPiAgIH07ICAKPiA+ICAgPiArc3RhdGljIGNvbnN0 ICAKPiA+ICtzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIHB4MzBfbHZkc19lbmNvZGVy X2hlbHBlcl9mdW5jcyA9IHsKPiA+ICsJLmVuYWJsZSA9IHB4MzBfbHZkc19lbmNvZGVyX2VuYWJs ZSwKPiA+ICsJLmRpc2FibGUgPSBweDMwX2x2ZHNfZW5jb2Rlcl9kaXNhYmxlLAo+ID4gKwkuYXRv bWljX2NoZWNrID0gcm9ja2NoaXBfbHZkc19lbmNvZGVyX2F0b21pY19jaGVjaywKPiA+ICt9Owo+ ID4gKwo+ID4gICBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIHJvY2tjaGlw X2x2ZHNfZW5jb2Rlcl9mdW5jcyA9IHsKPiA+ICAgCS5kZXN0cm95ID0gZHJtX2VuY29kZXJfY2xl YW51cCwKPiA+ICAgfTsKPiA+IEBAIC0zNzksMTYgKzUxNSw1MyBAQCBzdGF0aWMgaW50IHJrMzI4 OF9sdmRzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCj4gPiAgIAlyZXR1cm4g MDsKPiA+ICAgfSAgCj4gPiAgID4gK3N0YXRpYyBpbnQgcHgzMF9sdmRzX3Byb2JlKHN0cnVjdCBw bGF0Zm9ybV9kZXZpY2UgKnBkZXYsICAKPiA+ICsJCQkgICBzdHJ1Y3Qgcm9ja2NoaXBfbHZkcyAq bHZkcykKPiA+ICt7Cj4gPiArCWludCByZXQ7Cj4gPiArCj4gPiArCS8qIE1TQiAqLwo+ID4gKwly ZXQgPSAgcmVnbWFwX3VwZGF0ZV9iaXRzKGx2ZHMtPmdyZiwgUFgzMF9MVkRTX0dSRl9QRF9WT19D T04xLAo+ID4gKwkJCQkgIFBYMzBfTFZEU19NU0JTRUwoMSksCj4gPiArCQkJCSAgUFgzMF9MVkRT X01TQlNFTCgxKSk7Cj4gPiArCWlmIChyZXQpCj4gPiArCQlyZXR1cm4gcmV0Owo+ID4gKwo+ID4g KwkvKiBQSFkgKi8KPiA+ICsJbHZkcy0+ZHBoeSA9IGRldm1fcGh5X2dldCgmcGRldi0+ZGV2LCAi ZHBoeSIpOwo+ID4gKwlpZiAoSVNfRVJSKGx2ZHMtPmRwaHkpKQo+ID4gKwkJcmV0dXJuIFBUUl9F UlIobHZkcy0+ZHBoeSk7Cj4gPiArCj4gPiArCXBoeV9pbml0KGx2ZHMtPmRwaHkpOwo+ID4gKwlp ZiAocmV0KQo+ID4gKwkJcmV0dXJuIHJldDsKPiA+ICsKPiA+ICsJcGh5X3NldF9tb2RlKGx2ZHMt PmRwaHksIFBIWV9NT0RFX0xWRFMpOwo+ID4gKwlpZiAocmV0KQo+ID4gKwkJcmV0dXJuIHJldDsK PiA+ICsKPiA+ICsJcmV0dXJuIHBoeV9wb3dlcl9vbihsdmRzLT5kcGh5KTsKPiA+ICt9Cj4gPiAr Cj4gPiAgIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgcm9ja2NoaXBfbHZkc19zb2NfZGF0YSByazMyODhf bHZkc19kYXRhID0gewo+ID4gICAJLnByb2JlID0gcmszMjg4X2x2ZHNfcHJvYmUsCj4gPiAgIAku aGVscGVyX2Z1bmNzID0gJnJrMzI4OF9sdmRzX2VuY29kZXJfaGVscGVyX2Z1bmNzLAo+ID4gICB9 OyAgCj4gPiAgID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgcm9ja2NoaXBfbHZkc19zb2NfZGF0YSBw eDMwX2x2ZHNfZGF0YSA9IHsgIAo+ID4gKwkucHJvYmUgPSBweDMwX2x2ZHNfcHJvYmUsCj4gPiAr CS5oZWxwZXJfZnVuY3MgPSAmcHgzMF9sdmRzX2VuY29kZXJfaGVscGVyX2Z1bmNzLAo+ID4gK307 Cj4gPiArCj4gPiAgIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJvY2tjaGlwX2x2 ZHNfZHRfaWRzW10gPSB7Cj4gPiAgIAl7Cj4gPiAgIAkJLmNvbXBhdGlibGUgPSAicm9ja2NoaXAs cmszMjg4LWx2ZHMiLAo+ID4gICAJCS5kYXRhID0gJnJrMzI4OF9sdmRzX2RhdGEKPiA+ICAgCX0s Cj4gPiArCXsKPiA+ICsJCS5jb21wYXRpYmxlID0gInJvY2tjaGlwLHB4MzAtbHZkcyIsCj4gPiAr CQkuZGF0YSA9ICZweDMwX2x2ZHNfZGF0YQo+ID4gKwl9LAo+ID4gICAJe30KPiA+ICAgfTsKPiA+ ICAgTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcm9ja2NoaXBfbHZkc19kdF9pZHMpOwo+ID4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9sdmRzLmggYi9kcml2 ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfbHZkcy5oCj4gPiBpbmRleCBlNDFlOWFiM2Mz MDYuLjdjZmIxMDJiNDg1NCAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hp cC9yb2NrY2hpcF9sdmRzLmgKPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2Nr Y2hpcF9sdmRzLmgKPiA+IEBAIC0xMDYsNCArMTA2LDE4IEBACj4gPiAgICNkZWZpbmUgTFZEU19W RVNBXzE4CQkJCTIKPiA+ICAgI2RlZmluZSBMVkRTX0pFSURBXzE4CQkJCTMgIAo+ID4gICA+ICsj ZGVmaW5lIFdSSVRFX0VOKHYsIGgsIGwpICAoKEdFTk1BU0soaCwgbCkgPDwgMTYpIHwgKHYgPDwg bCkpICAKPiAKPiAKPiBIb3cgYWJvdXQgcmVuYW1lIFdSSVRFX0VOIHRvIEhJV09SRF9VUERBVEUg dG8ga2VlcCBhbGlnbiB3aXRoIG90aGVyIG1vZHVsZXMgdGhhdCB3cml0ZSBncmY6IHN1Y2ggYXMg ZHdtYWMtcmsuYy9kdy1taXBpLWRzaS1yb2NraGlwLmMvZHctaGRtaS1yb2NrY2hpcC5jCgpTdXJl LiBJdCBpcyBhbHNvIHRoZSBuYW1lIG9mIHRoaXMgbWFjcm8gaW4gdGhlIEJTUCBidXQgSSBmb3Vu ZCBpdCBzbwp1bmRlc2NyaXB0aXZlIHRoYXQgSSBjaGFuZ2VkIGl0LiBJIGRvbid0IGxpa2UgdmVy eSBtdWNoIGl0cyBuZXcgbmFtZQpuZWl0aGVyIHNvIEknbGwgZ28gYmFjayB0byB0aGUgb3JpZ2lu YWwgb25lLgoKVGhhbmtzLApNaXF1w6hsCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZy ZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2RyaS1kZXZlbAo=