From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755359AbcHAUrt (ORCPT ); Mon, 1 Aug 2016 16:47:49 -0400 Received: from mail-yw0-f178.google.com ([209.85.161.178]:36395 "EHLO mail-yw0-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753291AbcHAUrc (ORCPT ); Mon, 1 Aug 2016 16:47:32 -0400 MIME-Version: 1.0 In-Reply-To: References: <1469819791-31860-1-git-send-email-seanpaul@chromium.org> <579EC1B7.60608@rock-chips.com> From: Sean Paul Date: Mon, 1 Aug 2016 16:46:32 -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 Mon, Aug 1, 2016 at 4:20 PM, Sean Paul wrote: > 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? > To answer my own question, the enable_gpio isn't populated in the dts, so reordering things in prepare isn't feasible. Sean > 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:46:32 -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: 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 T24gTW9uLCBBdWcgMSwgMjAxNiBhdCA0OjIwIFBNLCBTZWFuIFBhdWwgPHNlYW5wYXVsQGNocm9t aXVtLm9yZz4gd3JvdGU6Cj4gT24gU3VuLCBKdWwgMzEsIDIwMTYgYXQgMTE6MjcgUE0sIFlha2ly IFlhbmcgPHlra0Byb2NrLWNoaXBzLmNvbT4gd3JvdGU6Cj4+IFNlYW4sCj4+Cj4+IE9uIDA3LzMw LzIwMTYgMDM6MTYgQU0sIFNlYW4gUGF1bCB3cm90ZToKPj4+Cj4+PiBJbnN0ZWFkIG9mIGp1c3Qg cHJlcGFyaW5nIHRoZSBwYW5lbCBvbiBiaW5kLCBhY3R1YWxseSBwcmVwYXJlL3VucHJlcGFyZQo+ Pj4gZHVyaW5nIG1vZGVzZXQvZGlzYWJsZS4gVGhlIHBhbmVsIG11c3QgYmUgcHJlcGFyZWQgaW4g b3JkZXIgdG8gcmVhZCBocGQKPj4+IHN0YXR1cywgc28gd2UgbmVlZCB0byByZWZjb3VudCB0aGUg cHJlcGFyZXMgaW4gb3JkZXIgdG8gZW5zdXJlIHdlIGRvbid0Cj4+PiBhY2NpZGVudGFsbHkgdHVy biB0aGUgcGFuZWwgb2ZmIGF0IHRoZSB3cm9uZyB0aW1lLgo+Pj4KPj4+IFNpZ25lZC1vZmYtYnk6 IFNlYW4gUGF1bCA8c2VhbnBhdWxAY2hyb21pdW0ub3JnPgo+Pj4gLS0tCj4+Pgo+Pj4KPj4+IEhp IFlha2lyLAo+Pj4gVGhpcyBpcyB3aGF0IEkgd2FzIHRhbGtpbmcgYWJvdXQgdXB0aHJlYWQuIEkn dmUgdGVzdGVkIGl0IGFuZCBpdCBzZWVtcyB0bwo+Pj4gYmUgd29ya2luZy4KPj4+Cj4+PiBXaGF0 IGRvIHlvdSB0aGluaz8KPj4KPj4KPj4gVGhhbmtzIGZvciB5b3VyIHBhdGNoLCBhbmQgaXQgd29y a3MuIEJ1dCBJIGhhdmUgaW50cm9kdWNlZCB0d28gcXVlc3Rpb25zLAo+PiBhbmQgSSBoYXZlbid0 IGZvdW5kIGEgd2F5IHRvIGZpeGVkIHRoZW0uCj4+Cj4+Cj4+PiBTZWFuCj4+Pgo+Pj4KPj4+Cj4+ PiBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2FuYWxvZ2l4L2FuYWxvZ2l4X2RwX2NvcmUuYyB8IDQ4 Cj4+PiArKysrKysrKysrKysrKysrKy0tLS0tCj4+PiAgIDEgZmlsZSBjaGFuZ2VkLCAzNyBpbnNl cnRpb25zKCspLCAxMSBkZWxldGlvbnMoLSkKPj4+Cj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL2JyaWRnZS9hbmFsb2dpeC9hbmFsb2dpeF9kcF9jb3JlLmMKPj4+IGIvZHJpdmVycy9n cHUvZHJtL2JyaWRnZS9hbmFsb2dpeC9hbmFsb2dpeF9kcF9jb3JlLmMKPj4+IGluZGV4IDMyNzE1 ZGEuLjdiNzY0YTQgMTAwNjQ0Cj4+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2FuYWxv Z2l4L2FuYWxvZ2l4X2RwX2NvcmUuYwo+Pj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9h bmFsb2dpeC9hbmFsb2dpeF9kcF9jb3JlLmMKPj4+IEBAIC05NjAsMTEgKzk2MCwyNyBAQCBlbnVt IGRybV9jb25uZWN0b3Jfc3RhdHVzCj4+PiAgIGFuYWxvZ2l4X2RwX2RldGVjdChzdHJ1Y3QgZHJt X2Nvbm5lY3RvciAqY29ubmVjdG9yLCBib29sIGZvcmNlKQo+Pj4gICB7Cj4+PiAgICAgICAgIHN0 cnVjdCBhbmFsb2dpeF9kcF9kZXZpY2UgKmRwID0gdG9fZHAoY29ubmVjdG9yKTsKPj4+ICsgICAg ICAgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBzdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Rp c2Nvbm5lY3RlZDsKPj4+ICsgICAgICAgaW50IHJldDsKPj4+ICAgLSAgICAgaWYgKGFuYWxvZ2l4 X2RwX2RldGVjdF9ocGQoZHApKQo+Pj4gLSAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0b3Jf c3RhdHVzX2Rpc2Nvbm5lY3RlZDsKPj4+ICsgICAgICAgaWYgKGRwLT5wbGF0X2RhdGEtPnBhbmVs ICYmIGRwLT5kcG1zX21vZGUgIT0gRFJNX01PREVfRFBNU19PTikgewo+Pj4gKyAgICAgICAgICAg ICAgIHJldCA9IGRybV9wYW5lbF9wcmVwYXJlKGRwLT5wbGF0X2RhdGEtPnBhbmVsKTsKPj4+ICsg ICAgICAgICAgICAgICBpZiAocmV0KSB7Cj4+PiArICAgICAgICAgICAgICAgICAgICAgICBEUk1f RVJST1IoImZhaWxlZCB0byBzZXR1cCBwYW5lbCAoJWQpXG4iLCByZXQpOwo+Pj4gKyAgICAgICAg ICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOwo+Pj4g KyAgICAgICAgICAgICAgIH0KPj4+ICsgICAgICAgfQo+Pj4gKwo+Pj4gKyAgICAgICBpZiAoIWFu YWxvZ2l4X2RwX2RldGVjdF9ocGQoZHApKQo+Pj4gKyAgICAgICAgICAgICAgIHN0YXR1cyA9IGNv bm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwo+Pj4gKwo+Pj4gKyAgICAgICBpZiAoZHAtPnBsYXRf ZGF0YS0+cGFuZWwgJiYgZHAtPmRwbXNfbW9kZSAhPSBEUk1fTU9ERV9EUE1TX09OKSB7Cj4+PiAr ICAgICAgICAgICAgICAgcmV0ID0gZHJtX3BhbmVsX3VucHJlcGFyZShkcC0+cGxhdF9kYXRhLT5w YW5lbCk7Cj4+PiArICAgICAgICAgICAgICAgaWYgKHJldCkKPj4+ICsgICAgICAgICAgICAgICAg ICAgICAgIERSTV9FUlJPUigiZmFpbGVkIHRvIHNldHVwIHRoZSBwYW5lbCByZXQgPSAlZFxuIiwK Pj4+IHJldCk7Cj4+PiArICAgICAgIH0KPj4+ICAgLSAgICAgcmV0dXJuIGNvbm5lY3Rvcl9zdGF0 dXNfY29ubmVjdGVkOwo+Pj4gKyAgICAgICByZXR1cm4gc3RhdHVzOwo+Pgo+Pgo+PiAxLiBQYW5l bCB3b3VsZCBmbGlja2VyIGF0IHN5c3RlbSBib290IHRpbWUuIFlvdXIgcGF0Y2ggd291bGQgZmxh c2ggdGhlIHBhbmVsCj4+IHBvd2VyIGluIGNvbm5lY3Rvci0+ZGV0ZWN0KCkgZnVuY3Rpb24gd2hl biBkcC0+ZHBtc19tb2RlIGlzbid0Cj4+IERSTV9NT0RFX0RQTVNfT0ZGLiBTbyB3aGVuIHVzZXJz cGFjZSBrZWVwIGRldGVjdCB0aGUgY29ubmVjdG9yIHN0YXR1cyBpbgo+PiBib290IHRpbWUsIHdl IGNvdWxkIHNlZSBwYW5lbCB3b3VsZCBmbGlja2VyIChsaWdodCB1cCBmb3IgYSB3aGlsZSwgYW5k IHR1cm4KPj4gb2ZmIGFnYWluLCBhbmQga2VlcCBsb29wIGZvciBzZXZlcmFsIHRpbWUpLiBJIGhh dmUgY29waWVkIHNvbWUga2VybmVsIGxvZ3M6Cj4+Cj4KPgo+IEhtbSwgeWVhaCwgdGhlIGJhY2ts aWdodCBkb2VzIHNlZW0gdG8gZmxhc2guIEl0IHNlZW1zIGxpa2UgYmFja2xpZ2h0Cj4gc2hvdWxk bid0IGJlIG9uIGlmIHRoZSBwYW5lbCBpc24ndCBlbmFibGVkLiB0aGlzIHdvdWxkIGFsc28gZml4 IHRoZQo+IGlzc3VlIGJlbG93IHNpbmNlIHlvdSBjb3VsZCBhZGQgcGFuZWwgcHJlcGFyZS91bnBy ZXBhcmUgaW4gZ2V0X21vZGVzLgo+Cj4gQWx0ZXJuYXRpdmVseSwgaGF2ZSB5b3UgcGxheWVkIGFy b3VuZCB3aXRoIG1vdmluZyB0aGluZ3MgYXJvdW5kIGluCj4gcHJlcGFyZS91bnByZXBhcmU/IFBl cmhhcHMganVzdCBlbmFibGluZyB0aGUgc3VwcGx5IHJlZ3VsYXRvciAod2l0aG91dAo+IHRoZSBl bmFibGUgZ3BpbyBzZXQpIGlzIHN1ZmZpY2llbnQgdG8gcmVhZCBIUEQvRURJRCwgYnV0IHdpbGwg c3RpbGwKPiBwcmV2ZW50IHRoZSBvcmlnaW5hbCBiYWNrbGlnaHQgZmxpY2tlci9idXJuLWluIGlz c3VlPwo+CgpUbyBhbnN3ZXIgbXkgb3duIHF1ZXN0aW9uLCB0aGUgZW5hYmxlX2dwaW8gaXNuJ3Qg cG9wdWxhdGVkIGluIHRoZSBkdHMsCnNvIHJlb3JkZXJpbmcgdGhpbmdzIGluIHByZXBhcmUgaXNu J3QgZmVhc2libGUuCgpTZWFuCgoKPiBTZWFuCj4KPgo+Cj4+Cj4+IFsgICAxMS4wNjUyNjddIFlL SyAtLS0tLS0tLS0gYW5hbG9naXhfZHBfZGV0ZWN0OjEwNTIKPj4gWyAgIDExLjcyOTU5Nl0gWUtL IC0tLS0tLS0tLSBhbmFsb2dpeF9kcF9nZXRfbW9kZXM6MTAxNgo+PiBbICAgMTEuNzM3NjA4XSBy b2NrY2hpcC1kcCBmZjk3MDAwMC5lZHA6IGFuYWxvZ2l4X2RwX3JlYWRfYnl0ZXNfZnJvbV9kcGNk Ogo+PiBBdXggVHJhbnNhY3Rpb24gZmFpbCEKPj4gWyAgIDExLjc0OTIyOV0gcm9ja2NoaXAtZHAg ZmY5NzAwMDAuZWRwOiBhbmFsb2dpeF9kcF9yZWFkX2J5dGVzX2Zyb21fZHBjZDoKPj4gQXV4IFRy YW5zYWN0aW9uIGZhaWwhCj4+IFsgICAxMS43NjA3OTldIHJvY2tjaGlwLWRwIGZmOTcwMDAwLmVk cDogYW5hbG9naXhfZHBfcmVhZF9ieXRlc19mcm9tX2RwY2Q6Cj4+IEF1eCBUcmFuc2FjdGlvbiBm YWlsIQo+PiBbICAgMTMuMzE1OTYyXSBZS0sgLS0tLS0tLS0tIGFuYWxvZ2l4X2RwX2RldGVjdDox MDUyCj4+IFsgICAxMy45ODQ3MDJdIFlLSyAtLS0tLS0tLS0gYW5hbG9naXhfZHBfZ2V0X21vZGVz OjEwMTYKPj4gWyAgIDEzLjk5Mjk3N10gcm9ja2NoaXAtZHAgZmY5NzAwMDAuZWRwOiBhbmFsb2dp eF9kcF9yZWFkX2J5dGVzX2Zyb21fZHBjZDoKPj4gQXV4IFRyYW5zYWN0aW9uIGZhaWwhCj4+IFsg ICAxNC4wMDQ0MTRdIHJvY2tjaGlwLWRwIGZmOTcwMDAwLmVkcDogYW5hbG9naXhfZHBfcmVhZF9i eXRlc19mcm9tX2RwY2Q6Cj4+IEF1eCBUcmFuc2FjdGlvbiBmYWlsIQo+PiBbICAgMTQuMDE1ODQy XSByb2NrY2hpcC1kcCBmZjk3MDAwMC5lZHA6IGFuYWxvZ2l4X2RwX3JlYWRfYnl0ZXNfZnJvbV9k cGNkOgo+PiBBdXggVHJhbnNhY3Rpb24gZmFpbCEKPj4gWyAgIDE0LjE4MzEwOV0gWUtLIC0tLS0t LS0tLSBhbmFsb2dpeF9kcF9icmlkZ2VfcHJlX2VuYWJsZToxMTQ3Cj4+IFsgICAxNC4zMDYzMDFd IHJvY2tjaGlwLWRwIGZmOTcwMDAwLmVkcDogTGluayBUcmFpbmluZyBDbG9jayBSZWNvdmVyeQo+ PiBzdWNjZXNzCj4+IFsgICAxNC4zMTkxMzBdIHJvY2tjaGlwLWRwIGZmOTcwMDAwLmVkcDogTGlu ayBUcmFpbmluZyBzdWNjZXNzIQo+PiBbICAgMTQuMzI2Mzg4XSByb2NrY2hpcC1kcCBmZjk3MDAw MC5lZHA6IHdhaXQgU1lTX0NUTF8yLgo+PiBbICAgMTQuNDM3MjQ3XSByb2NrY2hpcC1kcCBmZjk3 MDAwMC5lZHA6IFRpbWVvdXQgb2YgdmlkZW8gc3RyZWFtY2xrIG9rCj4+IFsgICAxNC40NDM1ODVd IHJvY2tjaGlwLWRwIGZmOTcwMDAwLmVkcDogdW5hYmxlIHRvIGNvbmZpZyB2aWRlbwo+Pgo+Pgo+ Pj4gICB9Cj4+PiAgICAgc3RhdGljIHZvaWQgYW5hbG9naXhfZHBfY29ubmVjdG9yX2Rlc3Ryb3ko c3RydWN0IGRybV9jb25uZWN0b3IKPj4+ICpjb25uZWN0b3IpCj4+PiBAQCAtMTAzNSw2ICsxMDUx LDE4IEBAIHN0YXRpYyBpbnQgYW5hbG9naXhfZHBfYnJpZGdlX2F0dGFjaChzdHJ1Y3QKPj4+IGRy bV9icmlkZ2UgKmJyaWRnZSkKPj4+ICAgICAgICAgcmV0dXJuIDA7Cj4+PiAgIH0KPj4+ICAgK3N0 YXRpYyB2b2lkIGFuYWxvZ2l4X2RwX2JyaWRnZV9wcmVfZW5hYmxlKHN0cnVjdCBkcm1fYnJpZGdl ICpicmlkZ2UpCj4+PiArewo+Pj4gKyAgICAgICBzdHJ1Y3QgYW5hbG9naXhfZHBfZGV2aWNlICpk cCA9IGJyaWRnZS0+ZHJpdmVyX3ByaXZhdGU7Cj4+PiArICAgICAgIGludCByZXQ7Cj4+PiArCj4+ PiArICAgICAgIGlmIChkcC0+cGxhdF9kYXRhLT5wYW5lbCkgewo+Pj4gKyAgICAgICAgICAgICAg IHJldCA9IGRybV9wYW5lbF9wcmVwYXJlKGRwLT5wbGF0X2RhdGEtPnBhbmVsKTsKPj4+ICsgICAg ICAgICAgICAgICBpZiAocmV0KQo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgRFJNX0VSUk9S KCJmYWlsZWQgdG8gc2V0dXAgdGhlIHBhbmVsIHJldCA9ICVkXG4iLAo+Pj4gcmV0KTsKPj4+ICsg ICAgICAgfQo+Pgo+Pgo+PiAyLiBEcml2ZXIgd291bGQgZmFpbGVkIHRvIHJlYWQgRURJRCBpbiBz b21lIGNhc2UuIFBhbmVsIHdvdWxkIG9ubHkgYmUKPj4gcG93ZXJlZCB1cCBpbiBicmlkZ2UtPnBy ZV9lbmFibGUoKSBmdW5jdGlvbiB3aGljaCBsYXRlciB0aGFuCj4+IGNvbm5lY3Rvci0+Z2V0X21v ZGVzKCkgZnVuY3Rpb24sIGFuZCB0aGlzIHdvdWxkIGNhdXNlZCBEUENEIHRyYW5zZmVyIGZhaWxl ZAo+PiBpbiBhbmFsb2dpeF9kcF9oYW5kbGVfZWRpZCgpLiBUaGlzIHNlZW0gd29uJ3QgY2F1c2Vk IHRvbyBiaWcgaXNzdWUsIGNhdXNlCj4+IHVzZXJzcGFjZSB3b3VsZCByZWFkIEVESUQgYWdhaW4g YWZ0ZXIgYnJpZGdlL2VuY29kZXIgaXMgZW5hYmxlZC4gQnV0IGl0J3MKPj4gYmV0dGVyIHRvIGF2 b2lkIHRoaXMgcG90ZW50aWFsIGJ1Zy4KPj4KPj4KPj4gWyAgIDExLjA2NTI2N10gWUtLIC0tLS0t LS0tLSBhbmFsb2dpeF9kcF9kZXRlY3Q6MTA1Mgo+PiBbICAgMTEuNzI5NTk2XSBZS0sgLS0tLS0t LS0tIGFuYWxvZ2l4X2RwX2dldF9tb2RlczoxMDE2Cj4+IFsgICAxMS43Mzc2MDhdIHJvY2tjaGlw LWRwIGZmOTcwMDAwLmVkcDogYW5hbG9naXhfZHBfcmVhZF9ieXRlc19mcm9tX2RwY2Q6Cj4+IEF1 eCBUcmFuc2FjdGlvbiBmYWlsIQo+PiBbICAgMTEuNzQ5MjI5XSByb2NrY2hpcC1kcCBmZjk3MDAw MC5lZHA6IGFuYWxvZ2l4X2RwX3JlYWRfYnl0ZXNfZnJvbV9kcGNkOgo+PiBBdXggVHJhbnNhY3Rp b24gZmFpbCEKPj4gWyAgIDExLjc2MDc5OV0gcm9ja2NoaXAtZHAgZmY5NzAwMDAuZWRwOiBhbmFs b2dpeF9kcF9yZWFkX2J5dGVzX2Zyb21fZHBjZDoKPj4gQXV4IFRyYW5zYWN0aW9uIGZhaWwhCj4+ IFsgICAxMy4zMTU5NjJdIFlLSyAtLS0tLS0tLS0gYW5hbG9naXhfZHBfZGV0ZWN0OjEwNTIKPj4g WyAgIDEzLjk4NDcwMl0gWUtLIC0tLS0tLS0tLSBhbmFsb2dpeF9kcF9nZXRfbW9kZXM6MTAxNgo+ PiBbICAgMTMuOTkyOTc3XSByb2NrY2hpcC1kcCBmZjk3MDAwMC5lZHA6IGFuYWxvZ2l4X2RwX3Jl YWRfYnl0ZXNfZnJvbV9kcGNkOgo+PiBBdXggVHJhbnNhY3Rpb24gZmFpbCEKPj4gWyAgIDE0LjAw NDQxNF0gcm9ja2NoaXAtZHAgZmY5NzAwMDAuZWRwOiBhbmFsb2dpeF9kcF9yZWFkX2J5dGVzX2Zy b21fZHBjZDoKPj4gQXV4IFRyYW5zYWN0aW9uIGZhaWwhCj4+IFsgICAxNC4wMTU4NDJdIHJvY2tj aGlwLWRwIGZmOTcwMDAwLmVkcDogYW5hbG9naXhfZHBfcmVhZF9ieXRlc19mcm9tX2RwY2Q6Cj4+ IEF1eCBUcmFuc2FjdGlvbiBmYWlsIQo+PiBbICAgMTQuMTgzMTA5XSBZS0sgLS0tLS0tLS0tIGFu YWxvZ2l4X2RwX2JyaWRnZV9wcmVfZW5hYmxlOjExNDcKPj4gWyAgIDE0LjMwNjMwMV0gcm9ja2No aXAtZHAgZmY5NzAwMDAuZWRwOiBMaW5rIFRyYWluaW5nIENsb2NrIFJlY292ZXJ5Cj4+IHN1Y2Nl c3MKPj4gWyAgIDE0LjMxOTEzMF0gcm9ja2NoaXAtZHAgZmY5NzAwMDAuZWRwOiBMaW5rIFRyYWlu aW5nIHN1Y2Nlc3MhCj4+IFsgICAxNC4zMjYzODhdIHJvY2tjaGlwLWRwIGZmOTcwMDAwLmVkcDog d2FpdCBTWVNfQ1RMXzIuCj4+IFsgICAxNC40MzcyNDddIHJvY2tjaGlwLWRwIGZmOTcwMDAwLmVk cDogVGltZW91dCBvZiB2aWRlbyBzdHJlYW1jbGsgb2sKPj4gWyAgIDE0LjQ0MzU4NV0gcm9ja2No aXAtZHAgZmY5NzAwMDAuZWRwOiB1bmFibGUgdG8gY29uZmlnIHZpZGVvCj4+IFsgICAxNC41MjA1 NjVdIFlLSyAtLS0tLS0tLS0gYW5hbG9naXhfZHBfZGV0ZWN0OjEwNTIKPj4gWyAgIDE0LjUyNTMz OV0gWUtLIC0tLS0tLS0tLSBhbmFsb2dpeF9kcF9nZXRfbW9kZXM6MTAxNgo+PiBbICAgMTQuNTMx MjMzXSByb2NrY2hpcC1kcCBmZjk3MDAwMC5lZHA6IEVESUQgZGF0YSBkb2VzIG5vdCBpbmNsdWRl IGFueQo+PiBleHRlbnNpb25zLgo+PiBbICAgMTUuNTk1NzI0XSBZS0sgLS0tLS0tLS0tIGFuYWxv Z2l4X2RwX2RldGVjdDoxMDUyCj4+IFsgICAxNS42MDA0ODhdIFlLSyAtLS0tLS0tLS0gYW5hbG9n aXhfZHBfZ2V0X21vZGVzOjEwMTYKPj4gWyAgIDE1LjYwNjQ1MV0gcm9ja2NoaXAtZHAgZmY5NzAw MDAuZWRwOiBFRElEIGRhdGEgZG9lcyBub3QgaW5jbHVkZSBhbnkKPj4gZXh0ZW5zaW9ucy4KPj4g WyAgIDE3LjMyNzM1NF0gWUtLIC0tLS0tLS0tLSBhbmFsb2dpeF9kcF9kZXRlY3Q6MTA1Mgo+PiBb ICAgMTcuMzMyMTA1XSBZS0sgLS0tLS0tLS0tIGFuYWxvZ2l4X2RwX2dldF9tb2RlczoxMDE2Cj4+ IFsgICAxNy4zMzgxNzFdIHJvY2tjaGlwLWRwIGZmOTcwMDAwLmVkcDogRURJRCBkYXRhIGRvZXMg bm90IGluY2x1ZGUgYW55Cj4+IGV4dGVuc2lvbnMuCj4+IFsgICA1Ni4yMzYwMjRdIFlLSyAtLS0t LS0tLS0gYW5hbG9naXhfZHBfZGV0ZWN0OjEwNTIKPj4gWyAgIDU2LjI0MDgyMF0gWUtLIC0tLS0t LS0tLSBhbmFsb2dpeF9kcF9nZXRfbW9kZXM6MTAxNgo+PiBbICAgNTYuMjQ2ODU1XSByb2NrY2hp cC1kcCBmZjk3MDAwMC5lZHA6IEVESUQgZGF0YSBkb2VzIG5vdCBpbmNsdWRlIGFueQo+PiBleHRl bnNpb25zLgo+PiBbICAgNjQuMDkyNDc3XSBZS0sgLS0tLS0tLS0tIGFuYWxvZ2l4X2RwX2RldGVj dDoxMDUyCj4+IFsgICA2NC43NjM3MTJdIFlLSyAtLS0tLS0tLS0gYW5hbG9naXhfZHBfZ2V0X21v ZGVzOjEwMTYKPj4KPj4KPj4KPj4gQlIsCj4+IC0gWWFraXIKPj4KPj4KPj4+ICt9Cj4+PiArCj4+ PiAgIHN0YXRpYyB2b2lkIGFuYWxvZ2l4X2RwX2JyaWRnZV9lbmFibGUoc3RydWN0IGRybV9icmlk Z2UgKmJyaWRnZSkKPj4+ICAgewo+Pj4gICAgICAgICBzdHJ1Y3QgYW5hbG9naXhfZHBfZGV2aWNl ICpkcCA9IGJyaWRnZS0+ZHJpdmVyX3ByaXZhdGU7Cj4+PiBAQCAtMTA1OCw2ICsxMDg2LDcgQEAg c3RhdGljIHZvaWQgYW5hbG9naXhfZHBfYnJpZGdlX2VuYWJsZShzdHJ1Y3QKPj4+IGRybV9icmlk Z2UgKmJyaWRnZSkKPj4+ICAgc3RhdGljIHZvaWQgYW5hbG9naXhfZHBfYnJpZGdlX2Rpc2FibGUo c3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKPj4+ICAgewo+Pj4gICAgICAgICBzdHJ1Y3QgYW5h bG9naXhfZHBfZGV2aWNlICpkcCA9IGJyaWRnZS0+ZHJpdmVyX3ByaXZhdGU7Cj4+PiArICAgICAg IGludCByZXQ7Cj4+PiAgICAgICAgIGlmIChkcC0+ZHBtc19tb2RlICE9IERSTV9NT0RFX0RQTVNf T04pCj4+PiAgICAgICAgICAgICAgICAgcmV0dXJuOwo+Pj4gQEAgLTEwNzcsNiArMTEwNiwxMCBA QCBzdGF0aWMgdm9pZCBhbmFsb2dpeF9kcF9icmlkZ2VfZGlzYWJsZShzdHJ1Y3QKPj4+IGRybV9i cmlkZ2UgKmJyaWRnZSkKPj4+ICAgICAgICAgcG1fcnVudGltZV9wdXRfc3luYyhkcC0+ZGV2KTsK Pj4+ICAgKyAgICAgcmV0ID0gZHJtX3BhbmVsX3VucHJlcGFyZShkcC0+cGxhdF9kYXRhLT5wYW5l bCk7Cj4+PiArICAgICAgIGlmIChyZXQpCj4+PiArICAgICAgICAgICAgICAgRFJNX0VSUk9SKCJm YWlsZWQgdG8gc2V0dXAgdGhlIHBhbmVsIHJldCA9ICVkXG4iLCByZXQpOwo+Pj4gKwo+Pj4gICAg ICAgICBkcC0+ZHBtc19tb2RlID0gRFJNX01PREVfRFBNU19PRkY7Cj4+PiAgIH0KPj4+ICAgQEAg LTExNjUsOSArMTE5OCw5IEBAIHN0YXRpYyB2b2lkIGFuYWxvZ2l4X2RwX2JyaWRnZV9ub3Aoc3Ry dWN0Cj4+PiBkcm1fYnJpZGdlICpicmlkZ2UpCj4+PiAgIH0KPj4+ICAgICBzdGF0aWMgY29uc3Qg c3RydWN0IGRybV9icmlkZ2VfZnVuY3MgYW5hbG9naXhfZHBfYnJpZGdlX2Z1bmNzID0gewo+Pj4g KyAgICAgICAucHJlX2VuYWJsZSA9IGFuYWxvZ2l4X2RwX2JyaWRnZV9wcmVfZW5hYmxlLAo+Pj4g ICAgICAgICAuZW5hYmxlID0gYW5hbG9naXhfZHBfYnJpZGdlX2VuYWJsZSwKPj4+ICAgICAgICAg LmRpc2FibGUgPSBhbmFsb2dpeF9kcF9icmlkZ2VfZGlzYWJsZSwKPj4+IC0gICAgICAgLnByZV9l bmFibGUgPSBhbmFsb2dpeF9kcF9icmlkZ2Vfbm9wLAo+Pj4gICAgICAgICAucG9zdF9kaXNhYmxl ID0gYW5hbG9naXhfZHBfYnJpZGdlX25vcCwKPj4+ICAgICAgICAgLm1vZGVfc2V0ID0gYW5hbG9n aXhfZHBfYnJpZGdlX21vZGVfc2V0LAo+Pj4gICAgICAgICAuYXR0YWNoID0gYW5hbG9naXhfZHBf YnJpZGdlX2F0dGFjaCwKPj4+IEBAIC0xMzMzLDEzICsxMzY2LDYgQEAgaW50IGFuYWxvZ2l4X2Rw X2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QKPj4+IGRybV9kZXZpY2UgKmRybV9kZXYs Cj4+PiAgICAgICAgIHBoeV9wb3dlcl9vbihkcC0+cGh5KTsKPj4+ICAgLSAgICAgaWYgKGRwLT5w bGF0X2RhdGEtPnBhbmVsKSB7Cj4+PiAtICAgICAgICAgICAgICAgaWYgKGRybV9wYW5lbF9wcmVw YXJlKGRwLT5wbGF0X2RhdGEtPnBhbmVsKSkgewo+Pj4gLSAgICAgICAgICAgICAgICAgICAgICAg RFJNX0VSUk9SKCJmYWlsZWQgdG8gc2V0dXAgdGhlIHBhbmVsXG4iKTsKPj4+IC0gICAgICAgICAg ICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7Cj4+PiAtICAgICAgICAgICAgICAgfQo+Pj4gLSAg ICAgICB9Cj4+PiAtCj4+PiAgICAgICAgIGFuYWxvZ2l4X2RwX2luaXRfZHAoZHApOwo+Pj4gICAg ICAgICByZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKCZwZGV2LT5kZXYsIGRwLT5pcnEs Cj4+Cj4+Cj4+Cj4+IC0tCj4+IFRvIHVuc3Vic2NyaWJlIGZyb20gdGhpcyBsaXN0OiBzZW5kIHRo ZSBsaW5lICJ1bnN1YnNjcmliZSBsaW51eC1zYW1zdW5nLXNvYyIKPj4gaW4KPj4gdGhlIGJvZHkg b2YgYSBtZXNzYWdlIHRvIG1ham9yZG9tb0B2Z2VyLmtlcm5lbC5vcmcKPj4gTW9yZSBtYWpvcmRv bW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRvbW8taW5mby5odG1sCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBt YWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3Rz LmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=