From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754038AbcHAU5U (ORCPT ); Mon, 1 Aug 2016 16:57:20 -0400 Received: from mail-yw0-f177.google.com ([209.85.161.177]:36430 "EHLO mail-yw0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751559AbcHAU5M (ORCPT ); Mon, 1 Aug 2016 16:57:12 -0400 MIME-Version: 1.0 In-Reply-To: <579EC1B7.60608@rock-chips.com> References: <1469819791-31860-1-git-send-email-seanpaul@chromium.org> <579EC1B7.60608@rock-chips.com> From: Sean Paul Date: Mon, 1 Aug 2016 16:20:08 -0400 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH] drm/analogix_dp: Ensure the panel is properly prepared/unprepared To: Yakir Yang Cc: =?UTF-8?B?5aea5pm65oOF?= , InKi Dae , Thierry Reding , =?UTF-8?Q?Heiko_St=C3=BCbner?= , Jingoo Han , Javier Martinez Canillas , =?UTF-8?Q?St=C3=A9phane_Marchesin?= , Tomasz Figa , Douglas Anderson , Dave Airlie , Daniel Vetter , =?UTF-8?Q?Krzysztof_Koz=C5=82owski?= , Emil Velikov , dri-devel , Linux Kernel Mailing List , linux-samsung-soc , linux-rockchip@lists.infradead.org Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sun, Jul 31, 2016 at 11:27 PM, Yakir Yang wrote: > Sean, > > On 07/30/2016 03:16 AM, Sean Paul wrote: >> >> Instead of just preparing the panel on bind, actually prepare/unprepare >> during modeset/disable. The panel must be prepared in order to read hpd >> status, so we need to refcount the prepares in order to ensure we don't >> accidentally turn the panel off at the wrong time. >> >> Signed-off-by: Sean Paul >> --- >> >> >> Hi Yakir, >> This is what I was talking about upthread. I've tested it and it seems to >> be working. >> >> What do you think? > > > Thanks for your patch, and it works. But I have introduced two questions, > and I haven't found a way to fixed them. > > >> Sean >> >> >> >> drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 48 >> +++++++++++++++++----- >> 1 file changed, 37 insertions(+), 11 deletions(-) >> >> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c >> b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c >> index 32715da..7b764a4 100644 >> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c >> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c >> @@ -960,11 +960,27 @@ enum drm_connector_status >> analogix_dp_detect(struct drm_connector *connector, bool force) >> { >> struct analogix_dp_device *dp = to_dp(connector); >> + enum drm_connector_status status = connector_status_disconnected; >> + int ret; >> - if (analogix_dp_detect_hpd(dp)) >> - return connector_status_disconnected; >> + if (dp->plat_data->panel && dp->dpms_mode != DRM_MODE_DPMS_ON) { >> + ret = drm_panel_prepare(dp->plat_data->panel); >> + if (ret) { >> + DRM_ERROR("failed to setup panel (%d)\n", ret); >> + return connector_status_disconnected; >> + } >> + } >> + >> + if (!analogix_dp_detect_hpd(dp)) >> + status = connector_status_connected; >> + >> + if (dp->plat_data->panel && dp->dpms_mode != DRM_MODE_DPMS_ON) { >> + ret = drm_panel_unprepare(dp->plat_data->panel); >> + if (ret) >> + DRM_ERROR("failed to setup the panel ret = %d\n", >> ret); >> + } >> - return connector_status_connected; >> + return status; > > > 1. Panel would flicker at system boot time. Your patch would flash the panel > power in connector->detect() function when dp->dpms_mode isn't > DRM_MODE_DPMS_OFF. So when userspace keep detect the connector status in > boot time, we could see panel would flicker (light up for a while, and turn > off again, and keep loop for several time). I have copied some kernel logs: > Hmm, yeah, the backlight does seem to flash. It seems like backlight shouldn't be on if the panel isn't enabled. this would also fix the issue below since you could add panel prepare/unprepare in get_modes. Alternatively, have you played around with moving things around in prepare/unprepare? Perhaps just enabling the supply regulator (without the enable gpio set) is sufficient to read HPD/EDID, but will still prevent the original backlight flicker/burn-in issue? Sean > > [ 11.065267] YKK --------- analogix_dp_detect:1052 > [ 11.729596] YKK --------- analogix_dp_get_modes:1016 > [ 11.737608] rockchip-dp ff970000.edp: analogix_dp_read_bytes_from_dpcd: > Aux Transaction fail! > [ 11.749229] rockchip-dp ff970000.edp: analogix_dp_read_bytes_from_dpcd: > Aux Transaction fail! > [ 11.760799] rockchip-dp ff970000.edp: analogix_dp_read_bytes_from_dpcd: > Aux Transaction fail! > [ 13.315962] YKK --------- analogix_dp_detect:1052 > [ 13.984702] YKK --------- analogix_dp_get_modes:1016 > [ 13.992977] rockchip-dp ff970000.edp: analogix_dp_read_bytes_from_dpcd: > Aux Transaction fail! > [ 14.004414] rockchip-dp ff970000.edp: analogix_dp_read_bytes_from_dpcd: > Aux Transaction fail! > [ 14.015842] rockchip-dp ff970000.edp: analogix_dp_read_bytes_from_dpcd: > Aux Transaction fail! > [ 14.183109] YKK --------- analogix_dp_bridge_pre_enable:1147 > [ 14.306301] rockchip-dp ff970000.edp: Link Training Clock Recovery > success > [ 14.319130] rockchip-dp ff970000.edp: Link Training success! > [ 14.326388] rockchip-dp ff970000.edp: wait SYS_CTL_2. > [ 14.437247] rockchip-dp ff970000.edp: Timeout of video streamclk ok > [ 14.443585] rockchip-dp ff970000.edp: unable to config video > > >> } >> static void analogix_dp_connector_destroy(struct drm_connector >> *connector) >> @@ -1035,6 +1051,18 @@ static int analogix_dp_bridge_attach(struct >> drm_bridge *bridge) >> return 0; >> } >> +static void analogix_dp_bridge_pre_enable(struct drm_bridge *bridge) >> +{ >> + struct analogix_dp_device *dp = bridge->driver_private; >> + int ret; >> + >> + if (dp->plat_data->panel) { >> + ret = drm_panel_prepare(dp->plat_data->panel); >> + if (ret) >> + DRM_ERROR("failed to setup the panel ret = %d\n", >> ret); >> + } > > > 2. Driver would failed to read EDID in some case. Panel would only be > powered up in bridge->pre_enable() function which later than > connector->get_modes() function, and this would caused DPCD transfer failed > in analogix_dp_handle_edid(). This seem won't caused too big issue, cause > userspace would read EDID again after bridge/encoder is enabled. But it's > better to avoid this potential bug. > > > [ 11.065267] YKK --------- analogix_dp_detect:1052 > [ 11.729596] YKK --------- analogix_dp_get_modes:1016 > [ 11.737608] rockchip-dp ff970000.edp: analogix_dp_read_bytes_from_dpcd: > Aux Transaction fail! > [ 11.749229] rockchip-dp ff970000.edp: analogix_dp_read_bytes_from_dpcd: > Aux Transaction fail! > [ 11.760799] rockchip-dp ff970000.edp: analogix_dp_read_bytes_from_dpcd: > Aux Transaction fail! > [ 13.315962] YKK --------- analogix_dp_detect:1052 > [ 13.984702] YKK --------- analogix_dp_get_modes:1016 > [ 13.992977] rockchip-dp ff970000.edp: analogix_dp_read_bytes_from_dpcd: > Aux Transaction fail! > [ 14.004414] rockchip-dp ff970000.edp: analogix_dp_read_bytes_from_dpcd: > Aux Transaction fail! > [ 14.015842] rockchip-dp ff970000.edp: analogix_dp_read_bytes_from_dpcd: > Aux Transaction fail! > [ 14.183109] YKK --------- analogix_dp_bridge_pre_enable:1147 > [ 14.306301] rockchip-dp ff970000.edp: Link Training Clock Recovery > success > [ 14.319130] rockchip-dp ff970000.edp: Link Training success! > [ 14.326388] rockchip-dp ff970000.edp: wait SYS_CTL_2. > [ 14.437247] rockchip-dp ff970000.edp: Timeout of video streamclk ok > [ 14.443585] rockchip-dp ff970000.edp: unable to config video > [ 14.520565] YKK --------- analogix_dp_detect:1052 > [ 14.525339] YKK --------- analogix_dp_get_modes:1016 > [ 14.531233] rockchip-dp ff970000.edp: EDID data does not include any > extensions. > [ 15.595724] YKK --------- analogix_dp_detect:1052 > [ 15.600488] YKK --------- analogix_dp_get_modes:1016 > [ 15.606451] rockchip-dp ff970000.edp: EDID data does not include any > extensions. > [ 17.327354] YKK --------- analogix_dp_detect:1052 > [ 17.332105] YKK --------- analogix_dp_get_modes:1016 > [ 17.338171] rockchip-dp ff970000.edp: EDID data does not include any > extensions. > [ 56.236024] YKK --------- analogix_dp_detect:1052 > [ 56.240820] YKK --------- analogix_dp_get_modes:1016 > [ 56.246855] rockchip-dp ff970000.edp: EDID data does not include any > extensions. > [ 64.092477] YKK --------- analogix_dp_detect:1052 > [ 64.763712] YKK --------- analogix_dp_get_modes:1016 > > > > BR, > - Yakir > > >> +} >> + >> static void analogix_dp_bridge_enable(struct drm_bridge *bridge) >> { >> struct analogix_dp_device *dp = bridge->driver_private; >> @@ -1058,6 +1086,7 @@ static void analogix_dp_bridge_enable(struct >> drm_bridge *bridge) >> static void analogix_dp_bridge_disable(struct drm_bridge *bridge) >> { >> struct analogix_dp_device *dp = bridge->driver_private; >> + int ret; >> if (dp->dpms_mode != DRM_MODE_DPMS_ON) >> return; >> @@ -1077,6 +1106,10 @@ static void analogix_dp_bridge_disable(struct >> drm_bridge *bridge) >> pm_runtime_put_sync(dp->dev); >> + ret = drm_panel_unprepare(dp->plat_data->panel); >> + if (ret) >> + DRM_ERROR("failed to setup the panel ret = %d\n", ret); >> + >> dp->dpms_mode = DRM_MODE_DPMS_OFF; >> } >> @@ -1165,9 +1198,9 @@ static void analogix_dp_bridge_nop(struct >> drm_bridge *bridge) >> } >> static const struct drm_bridge_funcs analogix_dp_bridge_funcs = { >> + .pre_enable = analogix_dp_bridge_pre_enable, >> .enable = analogix_dp_bridge_enable, >> .disable = analogix_dp_bridge_disable, >> - .pre_enable = analogix_dp_bridge_nop, >> .post_disable = analogix_dp_bridge_nop, >> .mode_set = analogix_dp_bridge_mode_set, >> .attach = analogix_dp_bridge_attach, >> @@ -1333,13 +1366,6 @@ int analogix_dp_bind(struct device *dev, struct >> drm_device *drm_dev, >> phy_power_on(dp->phy); >> - if (dp->plat_data->panel) { >> - if (drm_panel_prepare(dp->plat_data->panel)) { >> - DRM_ERROR("failed to setup the panel\n"); >> - return -EBUSY; >> - } >> - } >> - >> analogix_dp_init_dp(dp); >> ret = devm_request_threaded_irq(&pdev->dev, dp->irq, > > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" > in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sean Paul Subject: Re: [PATCH] drm/analogix_dp: Ensure the panel is properly prepared/unprepared Date: Mon, 1 Aug 2016 16:20:08 -0400 Message-ID: References: <1469819791-31860-1-git-send-email-seanpaul@chromium.org> <579EC1B7.60608@rock-chips.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <579EC1B7.60608@rock-chips.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Yakir Yang Cc: =?UTF-8?Q?Krzysztof_Koz=C5=82owski?= , linux-samsung-soc , linux-rockchip@lists.infradead.org, =?UTF-8?B?5aea5pm65oOF?= , Jingoo Han , Emil Velikov , Douglas Anderson , dri-devel , Tomasz Figa , Javier Martinez Canillas , Daniel Vetter , =?UTF-8?Q?St=C3=A9phane_Marchesin?= , Thierry Reding , Linux Kernel Mailing List List-Id: linux-samsung-soc@vger.kernel.org T24gU3VuLCBKdWwgMzEsIDIwMTYgYXQgMTE6MjcgUE0sIFlha2lyIFlhbmcgPHlra0Byb2NrLWNo aXBzLmNvbT4gd3JvdGU6Cj4gU2VhbiwKPgo+IE9uIDA3LzMwLzIwMTYgMDM6MTYgQU0sIFNlYW4g UGF1bCB3cm90ZToKPj4KPj4gSW5zdGVhZCBvZiBqdXN0IHByZXBhcmluZyB0aGUgcGFuZWwgb24g YmluZCwgYWN0dWFsbHkgcHJlcGFyZS91bnByZXBhcmUKPj4gZHVyaW5nIG1vZGVzZXQvZGlzYWJs ZS4gVGhlIHBhbmVsIG11c3QgYmUgcHJlcGFyZWQgaW4gb3JkZXIgdG8gcmVhZCBocGQKPj4gc3Rh dHVzLCBzbyB3ZSBuZWVkIHRvIHJlZmNvdW50IHRoZSBwcmVwYXJlcyBpbiBvcmRlciB0byBlbnN1 cmUgd2UgZG9uJ3QKPj4gYWNjaWRlbnRhbGx5IHR1cm4gdGhlIHBhbmVsIG9mZiBhdCB0aGUgd3Jv bmcgdGltZS4KPj4KPj4gU2lnbmVkLW9mZi1ieTogU2VhbiBQYXVsIDxzZWFucGF1bEBjaHJvbWl1 bS5vcmc+Cj4+IC0tLQo+Pgo+Pgo+PiBIaSBZYWtpciwKPj4gVGhpcyBpcyB3aGF0IEkgd2FzIHRh bGtpbmcgYWJvdXQgdXB0aHJlYWQuIEkndmUgdGVzdGVkIGl0IGFuZCBpdCBzZWVtcyB0bwo+PiBi ZSB3b3JraW5nLgo+Pgo+PiBXaGF0IGRvIHlvdSB0aGluaz8KPgo+Cj4gVGhhbmtzIGZvciB5b3Vy IHBhdGNoLCBhbmQgaXQgd29ya3MuIEJ1dCBJIGhhdmUgaW50cm9kdWNlZCB0d28gcXVlc3Rpb25z LAo+IGFuZCBJIGhhdmVuJ3QgZm91bmQgYSB3YXkgdG8gZml4ZWQgdGhlbS4KPgo+Cj4+IFNlYW4K Pj4KPj4KPj4KPj4gZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hbmFsb2dpeC9hbmFsb2dpeF9kcF9j b3JlLmMgfCA0OAo+PiArKysrKysrKysrKysrKysrKy0tLS0tCj4+ICAgMSBmaWxlIGNoYW5nZWQs IDM3IGluc2VydGlvbnMoKyksIDExIGRlbGV0aW9ucygtKQo+Pgo+PiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL2JyaWRnZS9hbmFsb2dpeC9hbmFsb2dpeF9kcF9jb3JlLmMKPj4gYi9kcml2 ZXJzL2dwdS9kcm0vYnJpZGdlL2FuYWxvZ2l4L2FuYWxvZ2l4X2RwX2NvcmUuYwo+PiBpbmRleCAz MjcxNWRhLi43Yjc2NGE0IDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2Fu YWxvZ2l4L2FuYWxvZ2l4X2RwX2NvcmUuYwo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdl L2FuYWxvZ2l4L2FuYWxvZ2l4X2RwX2NvcmUuYwo+PiBAQCAtOTYwLDExICs5NjAsMjcgQEAgZW51 bSBkcm1fY29ubmVjdG9yX3N0YXR1cwo+PiAgIGFuYWxvZ2l4X2RwX2RldGVjdChzdHJ1Y3QgZHJt X2Nvbm5lY3RvciAqY29ubmVjdG9yLCBib29sIGZvcmNlKQo+PiAgIHsKPj4gICAgICAgICBzdHJ1 Y3QgYW5hbG9naXhfZHBfZGV2aWNlICpkcCA9IHRvX2RwKGNvbm5lY3Rvcik7Cj4+ICsgICAgICAg ZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBzdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nv bm5lY3RlZDsKPj4gKyAgICAgICBpbnQgcmV0Owo+PiAgIC0gICAgIGlmIChhbmFsb2dpeF9kcF9k ZXRlY3RfaHBkKGRwKSkKPj4gLSAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0b3Jfc3RhdHVz X2Rpc2Nvbm5lY3RlZDsKPj4gKyAgICAgICBpZiAoZHAtPnBsYXRfZGF0YS0+cGFuZWwgJiYgZHAt PmRwbXNfbW9kZSAhPSBEUk1fTU9ERV9EUE1TX09OKSB7Cj4+ICsgICAgICAgICAgICAgICByZXQg PSBkcm1fcGFuZWxfcHJlcGFyZShkcC0+cGxhdF9kYXRhLT5wYW5lbCk7Cj4+ICsgICAgICAgICAg ICAgICBpZiAocmV0KSB7Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgIERSTV9FUlJPUigiZmFp bGVkIHRvIHNldHVwIHBhbmVsICglZClcbiIsIHJldCk7Cj4+ICsgICAgICAgICAgICAgICAgICAg ICAgIHJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKPj4gKyAgICAgICAgICAg ICAgIH0KPj4gKyAgICAgICB9Cj4+ICsKPj4gKyAgICAgICBpZiAoIWFuYWxvZ2l4X2RwX2RldGVj dF9ocGQoZHApKQo+PiArICAgICAgICAgICAgICAgc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19j b25uZWN0ZWQ7Cj4+ICsKPj4gKyAgICAgICBpZiAoZHAtPnBsYXRfZGF0YS0+cGFuZWwgJiYgZHAt PmRwbXNfbW9kZSAhPSBEUk1fTU9ERV9EUE1TX09OKSB7Cj4+ICsgICAgICAgICAgICAgICByZXQg PSBkcm1fcGFuZWxfdW5wcmVwYXJlKGRwLT5wbGF0X2RhdGEtPnBhbmVsKTsKPj4gKyAgICAgICAg ICAgICAgIGlmIChyZXQpCj4+ICsgICAgICAgICAgICAgICAgICAgICAgIERSTV9FUlJPUigiZmFp bGVkIHRvIHNldHVwIHRoZSBwYW5lbCByZXQgPSAlZFxuIiwKPj4gcmV0KTsKPj4gKyAgICAgICB9 Cj4+ICAgLSAgICAgcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwo+PiArICAgICAg IHJldHVybiBzdGF0dXM7Cj4KPgo+IDEuIFBhbmVsIHdvdWxkIGZsaWNrZXIgYXQgc3lzdGVtIGJv b3QgdGltZS4gWW91ciBwYXRjaCB3b3VsZCBmbGFzaCB0aGUgcGFuZWwKPiBwb3dlciBpbiBjb25u ZWN0b3ItPmRldGVjdCgpIGZ1bmN0aW9uIHdoZW4gZHAtPmRwbXNfbW9kZSBpc24ndAo+IERSTV9N T0RFX0RQTVNfT0ZGLiBTbyB3aGVuIHVzZXJzcGFjZSBrZWVwIGRldGVjdCB0aGUgY29ubmVjdG9y IHN0YXR1cyBpbgo+IGJvb3QgdGltZSwgd2UgY291bGQgc2VlIHBhbmVsIHdvdWxkIGZsaWNrZXIg KGxpZ2h0IHVwIGZvciBhIHdoaWxlLCBhbmQgdHVybgo+IG9mZiBhZ2FpbiwgYW5kIGtlZXAgbG9v cCBmb3Igc2V2ZXJhbCB0aW1lKS4gSSBoYXZlIGNvcGllZCBzb21lIGtlcm5lbCBsb2dzOgo+CgoK SG1tLCB5ZWFoLCB0aGUgYmFja2xpZ2h0IGRvZXMgc2VlbSB0byBmbGFzaC4gSXQgc2VlbXMgbGlr ZSBiYWNrbGlnaHQKc2hvdWxkbid0IGJlIG9uIGlmIHRoZSBwYW5lbCBpc24ndCBlbmFibGVkLiB0 aGlzIHdvdWxkIGFsc28gZml4IHRoZQppc3N1ZSBiZWxvdyBzaW5jZSB5b3UgY291bGQgYWRkIHBh bmVsIHByZXBhcmUvdW5wcmVwYXJlIGluIGdldF9tb2Rlcy4KCkFsdGVybmF0aXZlbHksIGhhdmUg eW91IHBsYXllZCBhcm91bmQgd2l0aCBtb3ZpbmcgdGhpbmdzIGFyb3VuZCBpbgpwcmVwYXJlL3Vu cHJlcGFyZT8gUGVyaGFwcyBqdXN0IGVuYWJsaW5nIHRoZSBzdXBwbHkgcmVndWxhdG9yICh3aXRo b3V0CnRoZSBlbmFibGUgZ3BpbyBzZXQpIGlzIHN1ZmZpY2llbnQgdG8gcmVhZCBIUEQvRURJRCwg YnV0IHdpbGwgc3RpbGwKcHJldmVudCB0aGUgb3JpZ2luYWwgYmFja2xpZ2h0IGZsaWNrZXIvYnVy bi1pbiBpc3N1ZT8KClNlYW4KCgoKPgo+IFsgICAxMS4wNjUyNjddIFlLSyAtLS0tLS0tLS0gYW5h bG9naXhfZHBfZGV0ZWN0OjEwNTIKPiBbICAgMTEuNzI5NTk2XSBZS0sgLS0tLS0tLS0tIGFuYWxv Z2l4X2RwX2dldF9tb2RlczoxMDE2Cj4gWyAgIDExLjczNzYwOF0gcm9ja2NoaXAtZHAgZmY5NzAw MDAuZWRwOiBhbmFsb2dpeF9kcF9yZWFkX2J5dGVzX2Zyb21fZHBjZDoKPiBBdXggVHJhbnNhY3Rp b24gZmFpbCEKPiBbICAgMTEuNzQ5MjI5XSByb2NrY2hpcC1kcCBmZjk3MDAwMC5lZHA6IGFuYWxv Z2l4X2RwX3JlYWRfYnl0ZXNfZnJvbV9kcGNkOgo+IEF1eCBUcmFuc2FjdGlvbiBmYWlsIQo+IFsg ICAxMS43NjA3OTldIHJvY2tjaGlwLWRwIGZmOTcwMDAwLmVkcDogYW5hbG9naXhfZHBfcmVhZF9i eXRlc19mcm9tX2RwY2Q6Cj4gQXV4IFRyYW5zYWN0aW9uIGZhaWwhCj4gWyAgIDEzLjMxNTk2Ml0g WUtLIC0tLS0tLS0tLSBhbmFsb2dpeF9kcF9kZXRlY3Q6MTA1Mgo+IFsgICAxMy45ODQ3MDJdIFlL SyAtLS0tLS0tLS0gYW5hbG9naXhfZHBfZ2V0X21vZGVzOjEwMTYKPiBbICAgMTMuOTkyOTc3XSBy b2NrY2hpcC1kcCBmZjk3MDAwMC5lZHA6IGFuYWxvZ2l4X2RwX3JlYWRfYnl0ZXNfZnJvbV9kcGNk Ogo+IEF1eCBUcmFuc2FjdGlvbiBmYWlsIQo+IFsgICAxNC4wMDQ0MTRdIHJvY2tjaGlwLWRwIGZm OTcwMDAwLmVkcDogYW5hbG9naXhfZHBfcmVhZF9ieXRlc19mcm9tX2RwY2Q6Cj4gQXV4IFRyYW5z YWN0aW9uIGZhaWwhCj4gWyAgIDE0LjAxNTg0Ml0gcm9ja2NoaXAtZHAgZmY5NzAwMDAuZWRwOiBh bmFsb2dpeF9kcF9yZWFkX2J5dGVzX2Zyb21fZHBjZDoKPiBBdXggVHJhbnNhY3Rpb24gZmFpbCEK PiBbICAgMTQuMTgzMTA5XSBZS0sgLS0tLS0tLS0tIGFuYWxvZ2l4X2RwX2JyaWRnZV9wcmVfZW5h YmxlOjExNDcKPiBbICAgMTQuMzA2MzAxXSByb2NrY2hpcC1kcCBmZjk3MDAwMC5lZHA6IExpbmsg VHJhaW5pbmcgQ2xvY2sgUmVjb3ZlcnkKPiBzdWNjZXNzCj4gWyAgIDE0LjMxOTEzMF0gcm9ja2No aXAtZHAgZmY5NzAwMDAuZWRwOiBMaW5rIFRyYWluaW5nIHN1Y2Nlc3MhCj4gWyAgIDE0LjMyNjM4 OF0gcm9ja2NoaXAtZHAgZmY5NzAwMDAuZWRwOiB3YWl0IFNZU19DVExfMi4KPiBbICAgMTQuNDM3 MjQ3XSByb2NrY2hpcC1kcCBmZjk3MDAwMC5lZHA6IFRpbWVvdXQgb2YgdmlkZW8gc3RyZWFtY2xr IG9rCj4gWyAgIDE0LjQ0MzU4NV0gcm9ja2NoaXAtZHAgZmY5NzAwMDAuZWRwOiB1bmFibGUgdG8g Y29uZmlnIHZpZGVvCj4KPgo+PiAgIH0KPj4gICAgIHN0YXRpYyB2b2lkIGFuYWxvZ2l4X2RwX2Nv bm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yCj4+ICpjb25uZWN0b3IpCj4+IEBA IC0xMDM1LDYgKzEwNTEsMTggQEAgc3RhdGljIGludCBhbmFsb2dpeF9kcF9icmlkZ2VfYXR0YWNo KHN0cnVjdAo+PiBkcm1fYnJpZGdlICpicmlkZ2UpCj4+ICAgICAgICAgcmV0dXJuIDA7Cj4+ICAg fQo+PiAgICtzdGF0aWMgdm9pZCBhbmFsb2dpeF9kcF9icmlkZ2VfcHJlX2VuYWJsZShzdHJ1Y3Qg ZHJtX2JyaWRnZSAqYnJpZGdlKQo+PiArewo+PiArICAgICAgIHN0cnVjdCBhbmFsb2dpeF9kcF9k ZXZpY2UgKmRwID0gYnJpZGdlLT5kcml2ZXJfcHJpdmF0ZTsKPj4gKyAgICAgICBpbnQgcmV0Owo+ PiArCj4+ICsgICAgICAgaWYgKGRwLT5wbGF0X2RhdGEtPnBhbmVsKSB7Cj4+ICsgICAgICAgICAg ICAgICByZXQgPSBkcm1fcGFuZWxfcHJlcGFyZShkcC0+cGxhdF9kYXRhLT5wYW5lbCk7Cj4+ICsg ICAgICAgICAgICAgICBpZiAocmV0KQo+PiArICAgICAgICAgICAgICAgICAgICAgICBEUk1fRVJS T1IoImZhaWxlZCB0byBzZXR1cCB0aGUgcGFuZWwgcmV0ID0gJWRcbiIsCj4+IHJldCk7Cj4+ICsg ICAgICAgfQo+Cj4KPiAyLiBEcml2ZXIgd291bGQgZmFpbGVkIHRvIHJlYWQgRURJRCBpbiBzb21l IGNhc2UuIFBhbmVsIHdvdWxkIG9ubHkgYmUKPiBwb3dlcmVkIHVwIGluIGJyaWRnZS0+cHJlX2Vu YWJsZSgpIGZ1bmN0aW9uIHdoaWNoIGxhdGVyIHRoYW4KPiBjb25uZWN0b3ItPmdldF9tb2Rlcygp IGZ1bmN0aW9uLCBhbmQgdGhpcyB3b3VsZCBjYXVzZWQgRFBDRCB0cmFuc2ZlciBmYWlsZWQKPiBp biBhbmFsb2dpeF9kcF9oYW5kbGVfZWRpZCgpLiBUaGlzIHNlZW0gd29uJ3QgY2F1c2VkIHRvbyBi aWcgaXNzdWUsIGNhdXNlCj4gdXNlcnNwYWNlIHdvdWxkIHJlYWQgRURJRCBhZ2FpbiBhZnRlciBi cmlkZ2UvZW5jb2RlciBpcyBlbmFibGVkLiBCdXQgaXQncwo+IGJldHRlciB0byBhdm9pZCB0aGlz IHBvdGVudGlhbCBidWcuCj4KPgo+IFsgICAxMS4wNjUyNjddIFlLSyAtLS0tLS0tLS0gYW5hbG9n aXhfZHBfZGV0ZWN0OjEwNTIKPiBbICAgMTEuNzI5NTk2XSBZS0sgLS0tLS0tLS0tIGFuYWxvZ2l4 X2RwX2dldF9tb2RlczoxMDE2Cj4gWyAgIDExLjczNzYwOF0gcm9ja2NoaXAtZHAgZmY5NzAwMDAu ZWRwOiBhbmFsb2dpeF9kcF9yZWFkX2J5dGVzX2Zyb21fZHBjZDoKPiBBdXggVHJhbnNhY3Rpb24g ZmFpbCEKPiBbICAgMTEuNzQ5MjI5XSByb2NrY2hpcC1kcCBmZjk3MDAwMC5lZHA6IGFuYWxvZ2l4 X2RwX3JlYWRfYnl0ZXNfZnJvbV9kcGNkOgo+IEF1eCBUcmFuc2FjdGlvbiBmYWlsIQo+IFsgICAx MS43NjA3OTldIHJvY2tjaGlwLWRwIGZmOTcwMDAwLmVkcDogYW5hbG9naXhfZHBfcmVhZF9ieXRl c19mcm9tX2RwY2Q6Cj4gQXV4IFRyYW5zYWN0aW9uIGZhaWwhCj4gWyAgIDEzLjMxNTk2Ml0gWUtL IC0tLS0tLS0tLSBhbmFsb2dpeF9kcF9kZXRlY3Q6MTA1Mgo+IFsgICAxMy45ODQ3MDJdIFlLSyAt LS0tLS0tLS0gYW5hbG9naXhfZHBfZ2V0X21vZGVzOjEwMTYKPiBbICAgMTMuOTkyOTc3XSByb2Nr Y2hpcC1kcCBmZjk3MDAwMC5lZHA6IGFuYWxvZ2l4X2RwX3JlYWRfYnl0ZXNfZnJvbV9kcGNkOgo+ IEF1eCBUcmFuc2FjdGlvbiBmYWlsIQo+IFsgICAxNC4wMDQ0MTRdIHJvY2tjaGlwLWRwIGZmOTcw MDAwLmVkcDogYW5hbG9naXhfZHBfcmVhZF9ieXRlc19mcm9tX2RwY2Q6Cj4gQXV4IFRyYW5zYWN0 aW9uIGZhaWwhCj4gWyAgIDE0LjAxNTg0Ml0gcm9ja2NoaXAtZHAgZmY5NzAwMDAuZWRwOiBhbmFs b2dpeF9kcF9yZWFkX2J5dGVzX2Zyb21fZHBjZDoKPiBBdXggVHJhbnNhY3Rpb24gZmFpbCEKPiBb ICAgMTQuMTgzMTA5XSBZS0sgLS0tLS0tLS0tIGFuYWxvZ2l4X2RwX2JyaWRnZV9wcmVfZW5hYmxl OjExNDcKPiBbICAgMTQuMzA2MzAxXSByb2NrY2hpcC1kcCBmZjk3MDAwMC5lZHA6IExpbmsgVHJh aW5pbmcgQ2xvY2sgUmVjb3ZlcnkKPiBzdWNjZXNzCj4gWyAgIDE0LjMxOTEzMF0gcm9ja2NoaXAt ZHAgZmY5NzAwMDAuZWRwOiBMaW5rIFRyYWluaW5nIHN1Y2Nlc3MhCj4gWyAgIDE0LjMyNjM4OF0g cm9ja2NoaXAtZHAgZmY5NzAwMDAuZWRwOiB3YWl0IFNZU19DVExfMi4KPiBbICAgMTQuNDM3MjQ3 XSByb2NrY2hpcC1kcCBmZjk3MDAwMC5lZHA6IFRpbWVvdXQgb2YgdmlkZW8gc3RyZWFtY2xrIG9r Cj4gWyAgIDE0LjQ0MzU4NV0gcm9ja2NoaXAtZHAgZmY5NzAwMDAuZWRwOiB1bmFibGUgdG8gY29u ZmlnIHZpZGVvCj4gWyAgIDE0LjUyMDU2NV0gWUtLIC0tLS0tLS0tLSBhbmFsb2dpeF9kcF9kZXRl Y3Q6MTA1Mgo+IFsgICAxNC41MjUzMzldIFlLSyAtLS0tLS0tLS0gYW5hbG9naXhfZHBfZ2V0X21v ZGVzOjEwMTYKPiBbICAgMTQuNTMxMjMzXSByb2NrY2hpcC1kcCBmZjk3MDAwMC5lZHA6IEVESUQg ZGF0YSBkb2VzIG5vdCBpbmNsdWRlIGFueQo+IGV4dGVuc2lvbnMuCj4gWyAgIDE1LjU5NTcyNF0g WUtLIC0tLS0tLS0tLSBhbmFsb2dpeF9kcF9kZXRlY3Q6MTA1Mgo+IFsgICAxNS42MDA0ODhdIFlL SyAtLS0tLS0tLS0gYW5hbG9naXhfZHBfZ2V0X21vZGVzOjEwMTYKPiBbICAgMTUuNjA2NDUxXSBy b2NrY2hpcC1kcCBmZjk3MDAwMC5lZHA6IEVESUQgZGF0YSBkb2VzIG5vdCBpbmNsdWRlIGFueQo+ IGV4dGVuc2lvbnMuCj4gWyAgIDE3LjMyNzM1NF0gWUtLIC0tLS0tLS0tLSBhbmFsb2dpeF9kcF9k ZXRlY3Q6MTA1Mgo+IFsgICAxNy4zMzIxMDVdIFlLSyAtLS0tLS0tLS0gYW5hbG9naXhfZHBfZ2V0 X21vZGVzOjEwMTYKPiBbICAgMTcuMzM4MTcxXSByb2NrY2hpcC1kcCBmZjk3MDAwMC5lZHA6IEVE SUQgZGF0YSBkb2VzIG5vdCBpbmNsdWRlIGFueQo+IGV4dGVuc2lvbnMuCj4gWyAgIDU2LjIzNjAy NF0gWUtLIC0tLS0tLS0tLSBhbmFsb2dpeF9kcF9kZXRlY3Q6MTA1Mgo+IFsgICA1Ni4yNDA4MjBd IFlLSyAtLS0tLS0tLS0gYW5hbG9naXhfZHBfZ2V0X21vZGVzOjEwMTYKPiBbICAgNTYuMjQ2ODU1 XSByb2NrY2hpcC1kcCBmZjk3MDAwMC5lZHA6IEVESUQgZGF0YSBkb2VzIG5vdCBpbmNsdWRlIGFu eQo+IGV4dGVuc2lvbnMuCj4gWyAgIDY0LjA5MjQ3N10gWUtLIC0tLS0tLS0tLSBhbmFsb2dpeF9k cF9kZXRlY3Q6MTA1Mgo+IFsgICA2NC43NjM3MTJdIFlLSyAtLS0tLS0tLS0gYW5hbG9naXhfZHBf Z2V0X21vZGVzOjEwMTYKPgo+Cj4KPiBCUiwKPiAtIFlha2lyCj4KPgo+PiArfQo+PiArCj4+ICAg c3RhdGljIHZvaWQgYW5hbG9naXhfZHBfYnJpZGdlX2VuYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAq YnJpZGdlKQo+PiAgIHsKPj4gICAgICAgICBzdHJ1Y3QgYW5hbG9naXhfZHBfZGV2aWNlICpkcCA9 IGJyaWRnZS0+ZHJpdmVyX3ByaXZhdGU7Cj4+IEBAIC0xMDU4LDYgKzEwODYsNyBAQCBzdGF0aWMg dm9pZCBhbmFsb2dpeF9kcF9icmlkZ2VfZW5hYmxlKHN0cnVjdAo+PiBkcm1fYnJpZGdlICpicmlk Z2UpCj4+ICAgc3RhdGljIHZvaWQgYW5hbG9naXhfZHBfYnJpZGdlX2Rpc2FibGUoc3RydWN0IGRy bV9icmlkZ2UgKmJyaWRnZSkKPj4gICB7Cj4+ICAgICAgICAgc3RydWN0IGFuYWxvZ2l4X2RwX2Rl dmljZSAqZHAgPSBicmlkZ2UtPmRyaXZlcl9wcml2YXRlOwo+PiArICAgICAgIGludCByZXQ7Cj4+ ICAgICAgICAgaWYgKGRwLT5kcG1zX21vZGUgIT0gRFJNX01PREVfRFBNU19PTikKPj4gICAgICAg ICAgICAgICAgIHJldHVybjsKPj4gQEAgLTEwNzcsNiArMTEwNiwxMCBAQCBzdGF0aWMgdm9pZCBh bmFsb2dpeF9kcF9icmlkZ2VfZGlzYWJsZShzdHJ1Y3QKPj4gZHJtX2JyaWRnZSAqYnJpZGdlKQo+ PiAgICAgICAgIHBtX3J1bnRpbWVfcHV0X3N5bmMoZHAtPmRldik7Cj4+ICAgKyAgICAgcmV0ID0g ZHJtX3BhbmVsX3VucHJlcGFyZShkcC0+cGxhdF9kYXRhLT5wYW5lbCk7Cj4+ICsgICAgICAgaWYg KHJldCkKPj4gKyAgICAgICAgICAgICAgIERSTV9FUlJPUigiZmFpbGVkIHRvIHNldHVwIHRoZSBw YW5lbCByZXQgPSAlZFxuIiwgcmV0KTsKPj4gKwo+PiAgICAgICAgIGRwLT5kcG1zX21vZGUgPSBE Uk1fTU9ERV9EUE1TX09GRjsKPj4gICB9Cj4+ICAgQEAgLTExNjUsOSArMTE5OCw5IEBAIHN0YXRp YyB2b2lkIGFuYWxvZ2l4X2RwX2JyaWRnZV9ub3Aoc3RydWN0Cj4+IGRybV9icmlkZ2UgKmJyaWRn ZSkKPj4gICB9Cj4+ICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9icmlkZ2VfZnVuY3MgYW5h bG9naXhfZHBfYnJpZGdlX2Z1bmNzID0gewo+PiArICAgICAgIC5wcmVfZW5hYmxlID0gYW5hbG9n aXhfZHBfYnJpZGdlX3ByZV9lbmFibGUsCj4+ICAgICAgICAgLmVuYWJsZSA9IGFuYWxvZ2l4X2Rw X2JyaWRnZV9lbmFibGUsCj4+ICAgICAgICAgLmRpc2FibGUgPSBhbmFsb2dpeF9kcF9icmlkZ2Vf ZGlzYWJsZSwKPj4gLSAgICAgICAucHJlX2VuYWJsZSA9IGFuYWxvZ2l4X2RwX2JyaWRnZV9ub3As Cj4+ICAgICAgICAgLnBvc3RfZGlzYWJsZSA9IGFuYWxvZ2l4X2RwX2JyaWRnZV9ub3AsCj4+ICAg ICAgICAgLm1vZGVfc2V0ID0gYW5hbG9naXhfZHBfYnJpZGdlX21vZGVfc2V0LAo+PiAgICAgICAg IC5hdHRhY2ggPSBhbmFsb2dpeF9kcF9icmlkZ2VfYXR0YWNoLAo+PiBAQCAtMTMzMywxMyArMTM2 Niw2IEBAIGludCBhbmFsb2dpeF9kcF9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0Cj4+ IGRybV9kZXZpY2UgKmRybV9kZXYsCj4+ICAgICAgICAgcGh5X3Bvd2VyX29uKGRwLT5waHkpOwo+ PiAgIC0gICAgIGlmIChkcC0+cGxhdF9kYXRhLT5wYW5lbCkgewo+PiAtICAgICAgICAgICAgICAg aWYgKGRybV9wYW5lbF9wcmVwYXJlKGRwLT5wbGF0X2RhdGEtPnBhbmVsKSkgewo+PiAtICAgICAg ICAgICAgICAgICAgICAgICBEUk1fRVJST1IoImZhaWxlZCB0byBzZXR1cCB0aGUgcGFuZWxcbiIp Owo+PiAtICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwo+PiAtICAgICAgICAg ICAgICAgfQo+PiAtICAgICAgIH0KPj4gLQo+PiAgICAgICAgIGFuYWxvZ2l4X2RwX2luaXRfZHAo ZHApOwo+PiAgICAgICAgIHJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJnBkZXYtPmRl diwgZHAtPmlycSwKPgo+Cj4KPiAtLQo+IFRvIHVuc3Vic2NyaWJlIGZyb20gdGhpcyBsaXN0OiBz ZW5kIHRoZSBsaW5lICJ1bnN1YnNjcmliZSBsaW51eC1zYW1zdW5nLXNvYyIKPiBpbgo+IHRoZSBi b2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnCj4gTW9yZSBtYWpv cmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRvbW8taW5mby5odG1s Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZl bCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xp c3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=