From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753519AbcHAD2b (ORCPT ); Sun, 31 Jul 2016 23:28:31 -0400 Received: from lucky1.263xmail.com ([211.157.147.130]:34320 "EHLO lucky1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753447AbcHAD2V (ORCPT ); Sun, 31 Jul 2016 23:28:21 -0400 X-263anti-spam: KSV:0; X-MAIL-GRAY: 1 X-MAIL-DELIVERY: 0 X-KSVirus-check: 0 X-ABS-CHECKED: 4 X-ADDR-CHECKED: 0 X-RL-SENDER: ykk@rock-chips.com X-FST-TO: linux-rockchip@lists.infradead.org X-SENDER-IP: 103.29.142.67 X-LOGIN-NAME: ykk@rock-chips.com X-UNIQUE-TAG: X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 Subject: Re: [PATCH] drm/analogix_dp: Ensure the panel is properly prepared/unprepared To: Sean Paul References: <1469819791-31860-1-git-send-email-seanpaul@chromium.org> Cc: yzq@rock-chips.com, inki.dae@samsung.com, treding@nvidia.com, heiko@sntech.de, jingoohan1@gmail.com, javier@osg.samsung.com, marcheu@chromium.org, tfiga@chromium.org, dianders@chromium.org, airlied@linux.ie, daniel.vetter@ffwll.ch, k.kozlowski@samsung.com, emil.l.velikov@gmail.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-samsung-soc@vger.kernel.org, linux-rockchip@lists.infradead.org From: Yakir Yang Message-ID: <579EC1B7.60608@rock-chips.com> Date: Mon, 1 Aug 2016 11:27:51 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.8.0 MIME-Version: 1.0 In-Reply-To: <1469819791-31860-1-git-send-email-seanpaul@chromium.org> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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: [ 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, From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yakir Yang Subject: Re: [PATCH] drm/analogix_dp: Ensure the panel is properly prepared/unprepared Date: Mon, 1 Aug 2016 11:27:51 +0800 Message-ID: <579EC1B7.60608@rock-chips.com> References: <1469819791-31860-1-git-send-email-seanpaul@chromium.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1469819791-31860-1-git-send-email-seanpaul@chromium.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Sean Paul Cc: k.kozlowski@samsung.com, linux-samsung-soc@vger.kernel.org, linux-rockchip@lists.infradead.org, yzq@rock-chips.com, jingoohan1@gmail.com, emil.l.velikov@gmail.com, dianders@chromium.org, dri-devel@lists.freedesktop.org, tfiga@chromium.org, javier@osg.samsung.com, daniel.vetter@ffwll.ch, marcheu@chromium.org, treding@nvidia.com, linux-kernel@vger.kernel.org List-Id: linux-samsung-soc@vger.kernel.org U2VhbiwKCk9uIDA3LzMwLzIwMTYgMDM6MTYgQU0sIFNlYW4gUGF1bCB3cm90ZToKPiBJbnN0ZWFk IG9mIGp1c3QgcHJlcGFyaW5nIHRoZSBwYW5lbCBvbiBiaW5kLCBhY3R1YWxseSBwcmVwYXJlL3Vu cHJlcGFyZQo+IGR1cmluZyBtb2Rlc2V0L2Rpc2FibGUuIFRoZSBwYW5lbCBtdXN0IGJlIHByZXBh cmVkIGluIG9yZGVyIHRvIHJlYWQgaHBkCj4gc3RhdHVzLCBzbyB3ZSBuZWVkIHRvIHJlZmNvdW50 IHRoZSBwcmVwYXJlcyBpbiBvcmRlciB0byBlbnN1cmUgd2UgZG9uJ3QKPiBhY2NpZGVudGFsbHkg dHVybiB0aGUgcGFuZWwgb2ZmIGF0IHRoZSB3cm9uZyB0aW1lLgo+Cj4gU2lnbmVkLW9mZi1ieTog U2VhbiBQYXVsIDxzZWFucGF1bEBjaHJvbWl1bS5vcmc+Cj4gLS0tCj4KPgo+IEhpIFlha2lyLAo+ IFRoaXMgaXMgd2hhdCBJIHdhcyB0YWxraW5nIGFib3V0IHVwdGhyZWFkLiBJJ3ZlIHRlc3RlZCBp dCBhbmQgaXQgc2VlbXMgdG8gYmUgd29ya2luZy4KPgo+IFdoYXQgZG8geW91IHRoaW5rPwoKVGhh bmtzIGZvciB5b3VyIHBhdGNoLCBhbmQgaXQgd29ya3MuIEJ1dCBJIGhhdmUgaW50cm9kdWNlZCB0 d28gCnF1ZXN0aW9ucywgYW5kIEkgaGF2ZW4ndCBmb3VuZCBhIHdheSB0byBmaXhlZCB0aGVtLgoK PiBTZWFuCj4KPgo+Cj4gZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hbmFsb2dpeC9hbmFsb2dpeF9k cF9jb3JlLmMgfCA0OCArKysrKysrKysrKysrKysrKy0tLS0tCj4gICAxIGZpbGUgY2hhbmdlZCwg MzcgaW5zZXJ0aW9ucygrKSwgMTEgZGVsZXRpb25zKC0pCj4KPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL2JyaWRnZS9hbmFsb2dpeC9hbmFsb2dpeF9kcF9jb3JlLmMgYi9kcml2ZXJzL2dw dS9kcm0vYnJpZGdlL2FuYWxvZ2l4L2FuYWxvZ2l4X2RwX2NvcmUuYwo+IGluZGV4IDMyNzE1ZGEu LjdiNzY0YTQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hbmFsb2dpeC9h bmFsb2dpeF9kcF9jb3JlLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2FuYWxvZ2l4 L2FuYWxvZ2l4X2RwX2NvcmUuYwo+IEBAIC05NjAsMTEgKzk2MCwyNyBAQCBlbnVtIGRybV9jb25u ZWN0b3Jfc3RhdHVzCj4gICBhbmFsb2dpeF9kcF9kZXRlY3Qoc3RydWN0IGRybV9jb25uZWN0b3Ig KmNvbm5lY3RvciwgYm9vbCBmb3JjZSkKPiAgIHsKPiAgIAlzdHJ1Y3QgYW5hbG9naXhfZHBfZGV2 aWNlICpkcCA9IHRvX2RwKGNvbm5lY3Rvcik7Cj4gKwllbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVz IHN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOwo+ICsJaW50IHJldDsKPiAg IAo+IC0JaWYgKGFuYWxvZ2l4X2RwX2RldGVjdF9ocGQoZHApKQo+IC0JCXJldHVybiBjb25uZWN0 b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKPiArCWlmIChkcC0+cGxhdF9kYXRhLT5wYW5lbCAmJiBk cC0+ZHBtc19tb2RlICE9IERSTV9NT0RFX0RQTVNfT04pIHsKPiArCQlyZXQgPSBkcm1fcGFuZWxf cHJlcGFyZShkcC0+cGxhdF9kYXRhLT5wYW5lbCk7Cj4gKwkJaWYgKHJldCkgewo+ICsJCQlEUk1f RVJST1IoImZhaWxlZCB0byBzZXR1cCBwYW5lbCAoJWQpXG4iLCByZXQpOwo+ICsJCQlyZXR1cm4g Y29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCWlmICgh YW5hbG9naXhfZHBfZGV0ZWN0X2hwZChkcCkpCj4gKwkJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1 c19jb25uZWN0ZWQ7Cj4gKwo+ICsJaWYgKGRwLT5wbGF0X2RhdGEtPnBhbmVsICYmIGRwLT5kcG1z X21vZGUgIT0gRFJNX01PREVfRFBNU19PTikgewo+ICsJCXJldCA9IGRybV9wYW5lbF91bnByZXBh cmUoZHAtPnBsYXRfZGF0YS0+cGFuZWwpOwo+ICsJCWlmIChyZXQpCj4gKwkJCURSTV9FUlJPUigi ZmFpbGVkIHRvIHNldHVwIHRoZSBwYW5lbCByZXQgPSAlZFxuIiwgcmV0KTsKPiArCX0KPiAgIAo+ IC0JcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwo+ICsJcmV0dXJuIHN0YXR1czsK CjEuIFBhbmVsIHdvdWxkIGZsaWNrZXIgYXQgc3lzdGVtIGJvb3QgdGltZS4gWW91ciBwYXRjaCB3 b3VsZCBmbGFzaCB0aGUgCnBhbmVsIHBvd2VyIGluIGNvbm5lY3Rvci0+ZGV0ZWN0KCkgZnVuY3Rp b24gd2hlbiBkcC0+ZHBtc19tb2RlIGlzbid0IApEUk1fTU9ERV9EUE1TX09GRi4gU28gd2hlbiB1 c2Vyc3BhY2Uga2VlcCBkZXRlY3QgdGhlIGNvbm5lY3RvciBzdGF0dXMgaW4gCmJvb3QgdGltZSwg d2UgY291bGQgc2VlIHBhbmVsIHdvdWxkIGZsaWNrZXIgKGxpZ2h0IHVwIGZvciBhIHdoaWxlLCBh bmQgCnR1cm4gb2ZmIGFnYWluLCBhbmQga2VlcCBsb29wIGZvciBzZXZlcmFsIHRpbWUpLiBJIGhh dmUgY29waWVkIHNvbWUgCmtlcm5lbCBsb2dzOgoKClsgICAxMS4wNjUyNjddIFlLSyAtLS0tLS0t LS0gYW5hbG9naXhfZHBfZGV0ZWN0OjEwNTIKWyAgIDExLjcyOTU5Nl0gWUtLIC0tLS0tLS0tLSBh bmFsb2dpeF9kcF9nZXRfbW9kZXM6MTAxNgpbICAgMTEuNzM3NjA4XSByb2NrY2hpcC1kcCBmZjk3 MDAwMC5lZHA6IAphbmFsb2dpeF9kcF9yZWFkX2J5dGVzX2Zyb21fZHBjZDogQXV4IFRyYW5zYWN0 aW9uIGZhaWwhClsgICAxMS43NDkyMjldIHJvY2tjaGlwLWRwIGZmOTcwMDAwLmVkcDogCmFuYWxv Z2l4X2RwX3JlYWRfYnl0ZXNfZnJvbV9kcGNkOiBBdXggVHJhbnNhY3Rpb24gZmFpbCEKWyAgIDEx Ljc2MDc5OV0gcm9ja2NoaXAtZHAgZmY5NzAwMDAuZWRwOiAKYW5hbG9naXhfZHBfcmVhZF9ieXRl c19mcm9tX2RwY2Q6IEF1eCBUcmFuc2FjdGlvbiBmYWlsIQpbICAgMTMuMzE1OTYyXSBZS0sgLS0t LS0tLS0tIGFuYWxvZ2l4X2RwX2RldGVjdDoxMDUyClsgICAxMy45ODQ3MDJdIFlLSyAtLS0tLS0t LS0gYW5hbG9naXhfZHBfZ2V0X21vZGVzOjEwMTYKWyAgIDEzLjk5Mjk3N10gcm9ja2NoaXAtZHAg ZmY5NzAwMDAuZWRwOiAKYW5hbG9naXhfZHBfcmVhZF9ieXRlc19mcm9tX2RwY2Q6IEF1eCBUcmFu c2FjdGlvbiBmYWlsIQpbICAgMTQuMDA0NDE0XSByb2NrY2hpcC1kcCBmZjk3MDAwMC5lZHA6IAph bmFsb2dpeF9kcF9yZWFkX2J5dGVzX2Zyb21fZHBjZDogQXV4IFRyYW5zYWN0aW9uIGZhaWwhClsg ICAxNC4wMTU4NDJdIHJvY2tjaGlwLWRwIGZmOTcwMDAwLmVkcDogCmFuYWxvZ2l4X2RwX3JlYWRf Ynl0ZXNfZnJvbV9kcGNkOiBBdXggVHJhbnNhY3Rpb24gZmFpbCEKWyAgIDE0LjE4MzEwOV0gWUtL IC0tLS0tLS0tLSBhbmFsb2dpeF9kcF9icmlkZ2VfcHJlX2VuYWJsZToxMTQ3ClsgICAxNC4zMDYz MDFdIHJvY2tjaGlwLWRwIGZmOTcwMDAwLmVkcDogTGluayBUcmFpbmluZyBDbG9jayBSZWNvdmVy eSAKc3VjY2VzcwpbICAgMTQuMzE5MTMwXSByb2NrY2hpcC1kcCBmZjk3MDAwMC5lZHA6IExpbmsg VHJhaW5pbmcgc3VjY2VzcyEKWyAgIDE0LjMyNjM4OF0gcm9ja2NoaXAtZHAgZmY5NzAwMDAuZWRw OiB3YWl0IFNZU19DVExfMi4KWyAgIDE0LjQzNzI0N10gcm9ja2NoaXAtZHAgZmY5NzAwMDAuZWRw OiBUaW1lb3V0IG9mIHZpZGVvIHN0cmVhbWNsayBvawpbICAgMTQuNDQzNTg1XSByb2NrY2hpcC1k cCBmZjk3MDAwMC5lZHA6IHVuYWJsZSB0byBjb25maWcgdmlkZW8KCgo+ICAgfQo+ICAgCj4gICBz dGF0aWMgdm9pZCBhbmFsb2dpeF9kcF9jb25uZWN0b3JfZGVzdHJveShzdHJ1Y3QgZHJtX2Nvbm5l Y3RvciAqY29ubmVjdG9yKQo+IEBAIC0xMDM1LDYgKzEwNTEsMTggQEAgc3RhdGljIGludCBhbmFs b2dpeF9kcF9icmlkZ2VfYXR0YWNoKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpCj4gICAJcmV0 dXJuIDA7Cj4gICB9Cj4gICAKPiArc3RhdGljIHZvaWQgYW5hbG9naXhfZHBfYnJpZGdlX3ByZV9l bmFibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKPiArewo+ICsJc3RydWN0IGFuYWxvZ2l4 X2RwX2RldmljZSAqZHAgPSBicmlkZ2UtPmRyaXZlcl9wcml2YXRlOwo+ICsJaW50IHJldDsKPiAr Cj4gKwlpZiAoZHAtPnBsYXRfZGF0YS0+cGFuZWwpIHsKPiArCQlyZXQgPSBkcm1fcGFuZWxfcHJl cGFyZShkcC0+cGxhdF9kYXRhLT5wYW5lbCk7Cj4gKwkJaWYgKHJldCkKPiArCQkJRFJNX0VSUk9S KCJmYWlsZWQgdG8gc2V0dXAgdGhlIHBhbmVsIHJldCA9ICVkXG4iLCByZXQpOwo+ICsJfQoKMi4g RHJpdmVyIHdvdWxkIGZhaWxlZCB0byByZWFkIEVESUQgaW4gc29tZSBjYXNlLiBQYW5lbCB3b3Vs ZCBvbmx5IGJlIApwb3dlcmVkIHVwIGluIGJyaWRnZS0+cHJlX2VuYWJsZSgpIGZ1bmN0aW9uIHdo aWNoIGxhdGVyIHRoYW4gCmNvbm5lY3Rvci0+Z2V0X21vZGVzKCkgZnVuY3Rpb24sIGFuZCB0aGlz IHdvdWxkIGNhdXNlZCBEUENEIHRyYW5zZmVyIApmYWlsZWQgaW4gYW5hbG9naXhfZHBfaGFuZGxl X2VkaWQoKS4gVGhpcyBzZWVtIHdvbid0IGNhdXNlZCB0b28gYmlnIAppc3N1ZSwgY2F1c2UgdXNl cnNwYWNlIHdvdWxkIHJlYWQgRURJRCBhZ2FpbiBhZnRlciBicmlkZ2UvZW5jb2RlciBpcyAKZW5h YmxlZC4gQnV0IGl0J3MgYmV0dGVyIHRvIGF2b2lkIHRoaXMgcG90ZW50aWFsIGJ1Zy4KCgpbICAg MTEuMDY1MjY3XSBZS0sgLS0tLS0tLS0tIGFuYWxvZ2l4X2RwX2RldGVjdDoxMDUyClsgICAxMS43 Mjk1OTZdIFlLSyAtLS0tLS0tLS0gYW5hbG9naXhfZHBfZ2V0X21vZGVzOjEwMTYKWyAgIDExLjcz NzYwOF0gcm9ja2NoaXAtZHAgZmY5NzAwMDAuZWRwOiAKYW5hbG9naXhfZHBfcmVhZF9ieXRlc19m cm9tX2RwY2Q6IEF1eCBUcmFuc2FjdGlvbiBmYWlsIQpbICAgMTEuNzQ5MjI5XSByb2NrY2hpcC1k cCBmZjk3MDAwMC5lZHA6IAphbmFsb2dpeF9kcF9yZWFkX2J5dGVzX2Zyb21fZHBjZDogQXV4IFRy YW5zYWN0aW9uIGZhaWwhClsgICAxMS43NjA3OTldIHJvY2tjaGlwLWRwIGZmOTcwMDAwLmVkcDog CmFuYWxvZ2l4X2RwX3JlYWRfYnl0ZXNfZnJvbV9kcGNkOiBBdXggVHJhbnNhY3Rpb24gZmFpbCEK WyAgIDEzLjMxNTk2Ml0gWUtLIC0tLS0tLS0tLSBhbmFsb2dpeF9kcF9kZXRlY3Q6MTA1MgpbICAg MTMuOTg0NzAyXSBZS0sgLS0tLS0tLS0tIGFuYWxvZ2l4X2RwX2dldF9tb2RlczoxMDE2ClsgICAx My45OTI5NzddIHJvY2tjaGlwLWRwIGZmOTcwMDAwLmVkcDogCmFuYWxvZ2l4X2RwX3JlYWRfYnl0 ZXNfZnJvbV9kcGNkOiBBdXggVHJhbnNhY3Rpb24gZmFpbCEKWyAgIDE0LjAwNDQxNF0gcm9ja2No aXAtZHAgZmY5NzAwMDAuZWRwOiAKYW5hbG9naXhfZHBfcmVhZF9ieXRlc19mcm9tX2RwY2Q6IEF1 eCBUcmFuc2FjdGlvbiBmYWlsIQpbICAgMTQuMDE1ODQyXSByb2NrY2hpcC1kcCBmZjk3MDAwMC5l ZHA6IAphbmFsb2dpeF9kcF9yZWFkX2J5dGVzX2Zyb21fZHBjZDogQXV4IFRyYW5zYWN0aW9uIGZh aWwhClsgICAxNC4xODMxMDldIFlLSyAtLS0tLS0tLS0gYW5hbG9naXhfZHBfYnJpZGdlX3ByZV9l bmFibGU6MTE0NwpbICAgMTQuMzA2MzAxXSByb2NrY2hpcC1kcCBmZjk3MDAwMC5lZHA6IExpbmsg VHJhaW5pbmcgQ2xvY2sgUmVjb3ZlcnkgCnN1Y2Nlc3MKWyAgIDE0LjMxOTEzMF0gcm9ja2NoaXAt ZHAgZmY5NzAwMDAuZWRwOiBMaW5rIFRyYWluaW5nIHN1Y2Nlc3MhClsgICAxNC4zMjYzODhdIHJv Y2tjaGlwLWRwIGZmOTcwMDAwLmVkcDogd2FpdCBTWVNfQ1RMXzIuClsgICAxNC40MzcyNDddIHJv Y2tjaGlwLWRwIGZmOTcwMDAwLmVkcDogVGltZW91dCBvZiB2aWRlbyBzdHJlYW1jbGsgb2sKWyAg IDE0LjQ0MzU4NV0gcm9ja2NoaXAtZHAgZmY5NzAwMDAuZWRwOiB1bmFibGUgdG8gY29uZmlnIHZp ZGVvClsgICAxNC41MjA1NjVdIFlLSyAtLS0tLS0tLS0gYW5hbG9naXhfZHBfZGV0ZWN0OjEwNTIK WyAgIDE0LjUyNTMzOV0gWUtLIC0tLS0tLS0tLSBhbmFsb2dpeF9kcF9nZXRfbW9kZXM6MTAxNgpb ICAgMTQuNTMxMjMzXSByb2NrY2hpcC1kcCBmZjk3MDAwMC5lZHA6IEVESUQgZGF0YSBkb2VzIG5v dCBpbmNsdWRlIGFueSAKZXh0ZW5zaW9ucy4KWyAgIDE1LjU5NTcyNF0gWUtLIC0tLS0tLS0tLSBh bmFsb2dpeF9kcF9kZXRlY3Q6MTA1MgpbICAgMTUuNjAwNDg4XSBZS0sgLS0tLS0tLS0tIGFuYWxv Z2l4X2RwX2dldF9tb2RlczoxMDE2ClsgICAxNS42MDY0NTFdIHJvY2tjaGlwLWRwIGZmOTcwMDAw LmVkcDogRURJRCBkYXRhIGRvZXMgbm90IGluY2x1ZGUgYW55IApleHRlbnNpb25zLgpbICAgMTcu MzI3MzU0XSBZS0sgLS0tLS0tLS0tIGFuYWxvZ2l4X2RwX2RldGVjdDoxMDUyClsgICAxNy4zMzIx MDVdIFlLSyAtLS0tLS0tLS0gYW5hbG9naXhfZHBfZ2V0X21vZGVzOjEwMTYKWyAgIDE3LjMzODE3 MV0gcm9ja2NoaXAtZHAgZmY5NzAwMDAuZWRwOiBFRElEIGRhdGEgZG9lcyBub3QgaW5jbHVkZSBh bnkgCmV4dGVuc2lvbnMuClsgICA1Ni4yMzYwMjRdIFlLSyAtLS0tLS0tLS0gYW5hbG9naXhfZHBf ZGV0ZWN0OjEwNTIKWyAgIDU2LjI0MDgyMF0gWUtLIC0tLS0tLS0tLSBhbmFsb2dpeF9kcF9nZXRf bW9kZXM6MTAxNgpbICAgNTYuMjQ2ODU1XSByb2NrY2hpcC1kcCBmZjk3MDAwMC5lZHA6IEVESUQg ZGF0YSBkb2VzIG5vdCBpbmNsdWRlIGFueSAKZXh0ZW5zaW9ucy4KWyAgIDY0LjA5MjQ3N10gWUtL IC0tLS0tLS0tLSBhbmFsb2dpeF9kcF9kZXRlY3Q6MTA1MgpbICAgNjQuNzYzNzEyXSBZS0sgLS0t LS0tLS0tIGFuYWxvZ2l4X2RwX2dldF9tb2RlczoxMDE2CgoKCkJSLAotIFlha2lyCgo+ICt9Cj4g Kwo+ICAgc3RhdGljIHZvaWQgYW5hbG9naXhfZHBfYnJpZGdlX2VuYWJsZShzdHJ1Y3QgZHJtX2Jy aWRnZSAqYnJpZGdlKQo+ICAgewo+ICAgCXN0cnVjdCBhbmFsb2dpeF9kcF9kZXZpY2UgKmRwID0g YnJpZGdlLT5kcml2ZXJfcHJpdmF0ZTsKPiBAQCAtMTA1OCw2ICsxMDg2LDcgQEAgc3RhdGljIHZv aWQgYW5hbG9naXhfZHBfYnJpZGdlX2VuYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ ICAgc3RhdGljIHZvaWQgYW5hbG9naXhfZHBfYnJpZGdlX2Rpc2FibGUoc3RydWN0IGRybV9icmlk Z2UgKmJyaWRnZSkKPiAgIHsKPiAgIAlzdHJ1Y3QgYW5hbG9naXhfZHBfZGV2aWNlICpkcCA9IGJy aWRnZS0+ZHJpdmVyX3ByaXZhdGU7Cj4gKwlpbnQgcmV0Owo+ICAgCj4gICAJaWYgKGRwLT5kcG1z X21vZGUgIT0gRFJNX01PREVfRFBNU19PTikKPiAgIAkJcmV0dXJuOwo+IEBAIC0xMDc3LDYgKzEx MDYsMTAgQEAgc3RhdGljIHZvaWQgYW5hbG9naXhfZHBfYnJpZGdlX2Rpc2FibGUoc3RydWN0IGRy bV9icmlkZ2UgKmJyaWRnZSkKPiAgIAo+ICAgCXBtX3J1bnRpbWVfcHV0X3N5bmMoZHAtPmRldik7 Cj4gICAKPiArCXJldCA9IGRybV9wYW5lbF91bnByZXBhcmUoZHAtPnBsYXRfZGF0YS0+cGFuZWwp Owo+ICsJaWYgKHJldCkKPiArCQlEUk1fRVJST1IoImZhaWxlZCB0byBzZXR1cCB0aGUgcGFuZWwg cmV0ID0gJWRcbiIsIHJldCk7Cj4gKwo+ICAgCWRwLT5kcG1zX21vZGUgPSBEUk1fTU9ERV9EUE1T X09GRjsKPiAgIH0KPiAgIAo+IEBAIC0xMTY1LDkgKzExOTgsOSBAQCBzdGF0aWMgdm9pZCBhbmFs b2dpeF9kcF9icmlkZ2Vfbm9wKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpCj4gICB9Cj4gICAK PiAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2JyaWRnZV9mdW5jcyBhbmFsb2dpeF9kcF9icmlk Z2VfZnVuY3MgPSB7Cj4gKwkucHJlX2VuYWJsZSA9IGFuYWxvZ2l4X2RwX2JyaWRnZV9wcmVfZW5h YmxlLAo+ICAgCS5lbmFibGUgPSBhbmFsb2dpeF9kcF9icmlkZ2VfZW5hYmxlLAo+ICAgCS5kaXNh YmxlID0gYW5hbG9naXhfZHBfYnJpZGdlX2Rpc2FibGUsCj4gLQkucHJlX2VuYWJsZSA9IGFuYWxv Z2l4X2RwX2JyaWRnZV9ub3AsCj4gICAJLnBvc3RfZGlzYWJsZSA9IGFuYWxvZ2l4X2RwX2JyaWRn ZV9ub3AsCj4gICAJLm1vZGVfc2V0ID0gYW5hbG9naXhfZHBfYnJpZGdlX21vZGVfc2V0LAo+ICAg CS5hdHRhY2ggPSBhbmFsb2dpeF9kcF9icmlkZ2VfYXR0YWNoLAo+IEBAIC0xMzMzLDEzICsxMzY2 LDYgQEAgaW50IGFuYWxvZ2l4X2RwX2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZHJt X2RldmljZSAqZHJtX2RldiwKPiAgIAo+ICAgCXBoeV9wb3dlcl9vbihkcC0+cGh5KTsKPiAgIAo+ IC0JaWYgKGRwLT5wbGF0X2RhdGEtPnBhbmVsKSB7Cj4gLQkJaWYgKGRybV9wYW5lbF9wcmVwYXJl KGRwLT5wbGF0X2RhdGEtPnBhbmVsKSkgewo+IC0JCQlEUk1fRVJST1IoImZhaWxlZCB0byBzZXR1 cCB0aGUgcGFuZWxcbiIpOwo+IC0JCQlyZXR1cm4gLUVCVVNZOwo+IC0JCX0KPiAtCX0KPiAtCj4g ICAJYW5hbG9naXhfZHBfaW5pdF9kcChkcCk7Cj4gICAKPiAgIAlyZXQgPSBkZXZtX3JlcXVlc3Rf dGhyZWFkZWRfaXJxKCZwZGV2LT5kZXYsIGRwLT5pcnEsCgoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2 ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21h aWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==