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=-1.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_PASS,URIBL_BLOCKED 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 8B41BC4646D for ; Mon, 13 Aug 2018 10:55:57 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 403762175F for ; Mon, 13 Aug 2018 10:55:57 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 403762175F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729180AbeHMNhj (ORCPT ); Mon, 13 Aug 2018 09:37:39 -0400 Received: from mga05.intel.com ([192.55.52.43]:44882 "EHLO mga05.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728443AbeHMNhi (ORCPT ); Mon, 13 Aug 2018 09:37:38 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Aug 2018 03:55:54 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.53,233,1531810800"; d="scan'208";a="62741949" Received: from sorvi.fi.intel.com ([10.237.72.167]) by fmsmga008.fm.intel.com with ESMTP; 13 Aug 2018 03:55:47 -0700 Message-ID: <1534157747.30780.19.camel@intel.com> Subject: Re: [Intel-gfx] [v3] drm/i915: Add detection of changing of edid on between suspend and resume From: Mika Kahola Reply-To: mika.kahola@intel.com To: "Lisovskiy, Stanislav" , "Mun, Gwan-gyeong" , "jani.nikula@linux.intel.com" Cc: "airlied@linux.ie" , "intel-gfx@lists.freedesktop.org" , "linux-kernel@vger.kernel.org" , "dri-devel@lists.freedesktop.org" , "Vivi, Rodrigo" Date: Mon, 13 Aug 2018 13:55:47 +0300 In-Reply-To: <919efd746382923946f9f443909cec65590ffc37.camel@intel.com> References: <20180803163453.7760-1-gwan-gyeong.mun@intel.com> <20180809111330.5113-1-gwan-gyeong.mun@intel.com> <919efd746382923946f9f443909cec65590ffc37.camel@intel.com> Organization: Intel OTC Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.18.5.2-0ubuntu3.2 Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 2018-08-10 at 13:02 +0000, Lisovskiy, Stanislav wrote: > On Thu, 2018-08-09 at 14:13 +0300, Gwan-gyeong Mun wrote: > > > > The hotplug detection routine of i915 uses > > drm_helper_hpd_irq_event(). This > > helper can detect changing of status of connector, but it can not > > detect > > changing of edid. > > > > Following scenario requires detection of changing of edid. > > > >  1) plug display device to a connector > >  2) system suspend > >  3) unplug 1)'s display device and plug the other display device to > > a > > connector > >  4) system resume > > > > It adds edid check routine when a connector status still remains as > > "connector_status_connected". > > > > v2: Add NULL check before comparing of EDIDs. > > > > Testcase: igt/kms_chamelium/hdmi-edid-change-during-hibernate > > Testcase: igt/kms_chamelium/hdmi-edid-change-during-suspend > > Testcase: igt/kms_chamelium/dp-edid-change-during-hibernate > > Testcase: igt/kms_chamelium/dp-edid-change-during-suspend > > > > Signed-off-by: Gwan-gyeong Mun > > --- > >  drivers/gpu/drm/i915/intel_hotplug.c | 84 > > +++++++++++++++++++++++++++- > >  1 file changed, 83 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/gpu/drm/i915/intel_hotplug.c > > b/drivers/gpu/drm/i915/intel_hotplug.c > > index 648a13c6043c..965f2d771fc0 100644 > > --- a/drivers/gpu/drm/i915/intel_hotplug.c > > +++ b/drivers/gpu/drm/i915/intel_hotplug.c > > @@ -507,6 +507,88 @@ void intel_hpd_init(struct drm_i915_private > > *dev_priv) > >   } > >  } > >   > > +/** > > + * intel_hpd_irq_event - hotplug processing > > + * @dev: drm_device > > + * > > + * Drivers can use this function to run a detect cycle on all > > connectors which > > + * have the DRM_CONNECTOR_POLL_HPD flag set in their &polled > > member. > > All other > > + * connectors are ignored, which is useful to avoid reprobing > > fixed > > panels. > > + * > > + * This function is useful for drivers which can't or don't track > > hotplug interrupts > > + * for each connector. This function is based on > > drm_helper_hpd_irq_event() helper > > + * function and besides it adds edid check routine when a > > connector > > status still > > + * remains as "connector_status_connected". > > + * > > + * Following scenario requires detection of changing of edid. > > + *  1) plug display device to a connector > > + *  2) system suspend > > + *  3) unplug 1)'s display device and plug the other display > > device > > to a connector > > + *  4) system resume > > + > > + * This function must be called from process context with no mode > > + * setting locks held. > > + * > > + * Note that a connector can be both polled and probed from the > > hotplug handler, > > + * in case the hotplug interrupt is known to be unreliable. > > + */ > > +static bool intel_hpd_irq_event(struct drm_device *dev) > > +{ > > + struct drm_connector *connector; > > + struct drm_connector_list_iter conn_iter; > > + enum drm_connector_status old_status, cur_status; > > + struct edid *old_edid; > > + bool changed = false; > > + > > + if (!dev->mode_config.poll_enabled) > > + return false; > > + > > + mutex_lock(&dev->mode_config.mutex); > > + drm_connector_list_iter_begin(dev, &conn_iter); > > + drm_for_each_connector_iter(connector, &conn_iter) { > > + /* Only handle HPD capable connectors. */ > > + if (!(connector->polled & DRM_CONNECTOR_POLL_HPD)) > > + continue; > > + > > + old_status = connector->status; > > + old_edid = to_intel_connector(connector)- > > > > > > detect_edid; > > + > > + cur_status = drm_helper_probe_detect(connector, > > NULL, false); > > + DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated > > from > > %s to %s\n", > > +       connector->base.id, connector->name, > > +       drm_get_connector_status_name(old_st > > at > > us), > > +       drm_get_connector_status_name(cur_st > > at > > us)); > > + > > + if (old_status != cur_status) > > + changed = true; > > + > > + /* Check changing of edid when a connector status > > still remains > > +  * as "connector_status_connected". > > +  */ > > + if (old_status == cur_status && > > +     cur_status == connector_status_connected) { > > + struct edid *cur_edid = > > to_intel_connector(connector)->detect_edid; > > + > > + if (!old_edid || !cur_edid) > > + continue; > > + > > + if (memcmp(old_edid, cur_edid, > > sizeof(*cur_edid))) { > > + changed = true; > > + DRM_DEBUG_KMS("[CONNECTOR:%d:%s] > > edid updated\n", > > +       connector->base.id, > > +       connector->name); > > + } > > + } > > + } > > + drm_connector_list_iter_end(&conn_iter); > > + mutex_unlock(&dev->mode_config.mutex); > > + > > + if (changed) > > + drm_kms_helper_hotplug_event(dev); > > + > > + return changed; > > +} > > + > >  static void i915_hpd_poll_init_work(struct work_struct *work) > >  { > >   struct drm_i915_private *dev_priv = > > @@ -552,7 +634,7 @@ static void i915_hpd_poll_init_work(struct > > work_struct *work) > >    * in the middle of disabling polling > >    */ > >   if (!enabled) > > - drm_helper_hpd_irq_event(dev); > > + intel_hpd_irq_event(dev); > >  } > Just wondering, as I saw previously drm_helper_hpd_irq_event function > was used, which basically does the same thing, except doing memcmp > for detecting the edid change. Is it only Intel specific change? As > we > could just add this modification to existing helper function or add > another helper function to the drm (drm_probe_helper.c), so that it > is > also usable elsewhere.. I second Stanislav's proposal to add this feature as part of drm. This edid check could be part of existing drm_helper_hpd_irq_event() function. Other drivers might find this change useful. > > > > >   > >  /** > --  > Best Regards, > > Lisovskiy Stanislav > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Mika Kahola - Intel OTC From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mika Kahola Subject: Re: [v3] drm/i915: Add detection of changing of edid on between suspend and resume Date: Mon, 13 Aug 2018 13:55:47 +0300 Message-ID: <1534157747.30780.19.camel@intel.com> References: <20180803163453.7760-1-gwan-gyeong.mun@intel.com> <20180809111330.5113-1-gwan-gyeong.mun@intel.com> <919efd746382923946f9f443909cec65590ffc37.camel@intel.com> Reply-To: mika.kahola@intel.com Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <919efd746382923946f9f443909cec65590ffc37.camel@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: "Lisovskiy, Stanislav" , "Mun, Gwan-gyeong" , "jani.nikula@linux.intel.com" Cc: "airlied@linux.ie" , "intel-gfx@lists.freedesktop.org" , "linux-kernel@vger.kernel.org" , "dri-devel@lists.freedesktop.org" , "Vivi, Rodrigo" List-Id: dri-devel@lists.freedesktop.org T24gRnJpLCAyMDE4LTA4LTEwIGF0IDEzOjAyICswMDAwLCBMaXNvdnNraXksIFN0YW5pc2xhdiB3 cm90ZToKPiBPbiBUaHUsIDIwMTgtMDgtMDkgYXQgMTQ6MTMgKzAzMDAsIEd3YW4tZ3llb25nIE11 biB3cm90ZToKPiA+IAo+ID4gVGhlIGhvdHBsdWcgZGV0ZWN0aW9uIHJvdXRpbmUgb2YgaTkxNSB1 c2VzCj4gPiBkcm1faGVscGVyX2hwZF9pcnFfZXZlbnQoKS4gVGhpcwo+ID4gaGVscGVyIGNhbiBk ZXRlY3QgY2hhbmdpbmcgb2Ygc3RhdHVzIG9mIGNvbm5lY3RvciwgYnV0IGl0IGNhbiBub3QKPiA+ IGRldGVjdAo+ID4gY2hhbmdpbmcgb2YgZWRpZC4KPiA+IAo+ID4gRm9sbG93aW5nIHNjZW5hcmlv IHJlcXVpcmVzIGRldGVjdGlvbiBvZiBjaGFuZ2luZyBvZiBlZGlkLgo+ID4gCj4gPiDCoDEpIHBs dWcgZGlzcGxheSBkZXZpY2UgdG8gYSBjb25uZWN0b3IKPiA+IMKgMikgc3lzdGVtIHN1c3BlbmQK PiA+IMKgMykgdW5wbHVnIDEpJ3MgZGlzcGxheSBkZXZpY2UgYW5kIHBsdWcgdGhlIG90aGVyIGRp c3BsYXkgZGV2aWNlIHRvCj4gPiBhCj4gPiBjb25uZWN0b3IKPiA+IMKgNCkgc3lzdGVtIHJlc3Vt ZQo+ID4gCj4gPiBJdCBhZGRzIGVkaWQgY2hlY2sgcm91dGluZSB3aGVuIGEgY29ubmVjdG9yIHN0 YXR1cyBzdGlsbCByZW1haW5zIGFzCj4gPiAiY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQiLgo+ ID4gCj4gPiB2MjogQWRkIE5VTEwgY2hlY2sgYmVmb3JlIGNvbXBhcmluZyBvZiBFRElEcy4KPiA+ IAo+ID4gVGVzdGNhc2U6IGlndC9rbXNfY2hhbWVsaXVtL2hkbWktZWRpZC1jaGFuZ2UtZHVyaW5n LWhpYmVybmF0ZQo+ID4gVGVzdGNhc2U6IGlndC9rbXNfY2hhbWVsaXVtL2hkbWktZWRpZC1jaGFu Z2UtZHVyaW5nLXN1c3BlbmQKPiA+IFRlc3RjYXNlOiBpZ3Qva21zX2NoYW1lbGl1bS9kcC1lZGlk LWNoYW5nZS1kdXJpbmctaGliZXJuYXRlCj4gPiBUZXN0Y2FzZTogaWd0L2ttc19jaGFtZWxpdW0v ZHAtZWRpZC1jaGFuZ2UtZHVyaW5nLXN1c3BlbmQKPiA+IAo+ID4gU2lnbmVkLW9mZi1ieTogR3dh bi1neWVvbmcgTXVuIDxnd2FuLWd5ZW9uZy5tdW5AaW50ZWwuY29tPgo+ID4gLS0tCj4gPiDCoGRy aXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hvdHBsdWcuYyB8IDg0Cj4gPiArKysrKysrKysrKysr KysrKysrKysrKysrKystCj4gPiDCoDEgZmlsZSBjaGFuZ2VkLCA4MyBpbnNlcnRpb25zKCspLCAx IGRlbGV0aW9uKC0pCj4gPiAKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9p bnRlbF9ob3RwbHVnLmMKPiA+IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaG90cGx1Zy5j Cj4gPiBpbmRleCA2NDhhMTNjNjA0M2MuLjk2NWYyZDc3MWZjMCAxMDA2NDQKPiA+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hvdHBsdWcuYwo+ID4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL2k5MTUvaW50ZWxfaG90cGx1Zy5jCj4gPiBAQCAtNTA3LDYgKzUwNyw4OCBAQCB2b2lkIGlu dGVsX2hwZF9pbml0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlCj4gPiAqZGV2X3ByaXYpCj4gPiDC oAl9Cj4gPiDCoH0KPiA+IMKgCj4gPiArLyoqCj4gPiArICogaW50ZWxfaHBkX2lycV9ldmVudCAt IGhvdHBsdWcgcHJvY2Vzc2luZwo+ID4gKyAqIEBkZXY6IGRybV9kZXZpY2UKPiA+ICsgKgo+ID4g KyAqIERyaXZlcnMgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHJ1biBhIGRldGVjdCBjeWNsZSBv biBhbGwKPiA+IGNvbm5lY3RvcnMgd2hpY2gKPiA+ICsgKiBoYXZlIHRoZSBEUk1fQ09OTkVDVE9S X1BPTExfSFBEIGZsYWcgc2V0IGluIHRoZWlyICZwb2xsZWQKPiA+IG1lbWJlci4KPiA+IEFsbCBv dGhlcgo+ID4gKyAqIGNvbm5lY3RvcnMgYXJlIGlnbm9yZWQsIHdoaWNoIGlzIHVzZWZ1bCB0byBh dm9pZCByZXByb2JpbmcKPiA+IGZpeGVkCj4gPiBwYW5lbHMuCj4gPiArICoKPiA+ICsgKiBUaGlz IGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgZHJpdmVycyB3aGljaCBjYW4ndCBvciBkb24ndCB0cmFj awo+ID4gaG90cGx1ZyBpbnRlcnJ1cHRzCj4gPiArICogZm9yIGVhY2ggY29ubmVjdG9yLiBUaGlz IGZ1bmN0aW9uIGlzIGJhc2VkIG9uCj4gPiBkcm1faGVscGVyX2hwZF9pcnFfZXZlbnQoKSBoZWxw ZXIKPiA+ICsgKiBmdW5jdGlvbiBhbmQgYmVzaWRlcyBpdCBhZGRzIGVkaWQgY2hlY2sgcm91dGlu ZSB3aGVuIGEKPiA+IGNvbm5lY3Rvcgo+ID4gc3RhdHVzIHN0aWxsCj4gPiArICogcmVtYWlucyBh cyAiY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQiLgo+ID4gKyAqCj4gPiArICogRm9sbG93aW5n IHNjZW5hcmlvIHJlcXVpcmVzIGRldGVjdGlvbiBvZiBjaGFuZ2luZyBvZiBlZGlkLgo+ID4gKyAq wqDCoDEpIHBsdWcgZGlzcGxheSBkZXZpY2UgdG8gYSBjb25uZWN0b3IKPiA+ICsgKsKgwqAyKSBz eXN0ZW0gc3VzcGVuZAo+ID4gKyAqwqDCoDMpIHVucGx1ZyAxKSdzIGRpc3BsYXkgZGV2aWNlIGFu ZCBwbHVnIHRoZSBvdGhlciBkaXNwbGF5Cj4gPiBkZXZpY2UKPiA+IHRvIGEgY29ubmVjdG9yCj4g PiArICrCoMKgNCkgc3lzdGVtIHJlc3VtZQo+ID4gKwo+ID4gKyAqIFRoaXMgZnVuY3Rpb24gbXVz dCBiZSBjYWxsZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQgd2l0aCBubyBtb2RlCj4gPiArICogc2V0 dGluZyBsb2NrcyBoZWxkLgo+ID4gKyAqCj4gPiArICogTm90ZSB0aGF0IGEgY29ubmVjdG9yIGNh biBiZSBib3RoIHBvbGxlZCBhbmQgcHJvYmVkIGZyb20gdGhlCj4gPiBob3RwbHVnIGhhbmRsZXIs Cj4gPiArICogaW4gY2FzZSB0aGUgaG90cGx1ZyBpbnRlcnJ1cHQgaXMga25vd24gdG8gYmUgdW5y ZWxpYWJsZS4KPiA+ICsgKi8KPiA+ICtzdGF0aWMgYm9vbCBpbnRlbF9ocGRfaXJxX2V2ZW50KHN0 cnVjdCBkcm1fZGV2aWNlICpkZXYpCj4gPiArewo+ID4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAq Y29ubmVjdG9yOwo+ID4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9saXN0X2l0ZXIgY29ubl9pdGVy Owo+ID4gKwllbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIG9sZF9zdGF0dXMsIGN1cl9zdGF0dXM7 Cj4gPiArCXN0cnVjdCBlZGlkICpvbGRfZWRpZDsKPiA+ICsJYm9vbCBjaGFuZ2VkID0gZmFsc2U7 Cj4gPiArCj4gPiArCWlmICghZGV2LT5tb2RlX2NvbmZpZy5wb2xsX2VuYWJsZWQpCj4gPiArCQly ZXR1cm4gZmFsc2U7Cj4gPiArCj4gPiArCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0 ZXgpOwo+ID4gKwlkcm1fY29ubmVjdG9yX2xpc3RfaXRlcl9iZWdpbihkZXYsICZjb25uX2l0ZXIp Owo+ID4gKwlkcm1fZm9yX2VhY2hfY29ubmVjdG9yX2l0ZXIoY29ubmVjdG9yLCAmY29ubl9pdGVy KSB7Cj4gPiArCQkvKiBPbmx5IGhhbmRsZSBIUEQgY2FwYWJsZSBjb25uZWN0b3JzLiAqLwo+ID4g KwkJaWYgKCEoY29ubmVjdG9yLT5wb2xsZWQgJiBEUk1fQ09OTkVDVE9SX1BPTExfSFBEKSkKPiA+ ICsJCQljb250aW51ZTsKPiA+ICsKPiA+ICsJCW9sZF9zdGF0dXMgPSBjb25uZWN0b3ItPnN0YXR1 czsKPiA+ICsJCW9sZF9lZGlkID0gdG9faW50ZWxfY29ubmVjdG9yKGNvbm5lY3RvciktCj4gPiA+ IAo+ID4gPiBkZXRlY3RfZWRpZDsKPiA+ICsKPiA+ICsJCWN1cl9zdGF0dXMgPSBkcm1faGVscGVy X3Byb2JlX2RldGVjdChjb25uZWN0b3IsCj4gPiBOVUxMLCBmYWxzZSk7Cj4gPiArCQlEUk1fREVC VUdfS01TKCJbQ09OTkVDVE9SOiVkOiVzXSBzdGF0dXMgdXBkYXRlZAo+ID4gZnJvbQo+ID4gJXMg dG8gJXNcbiIsCj4gPiArCQkJwqDCoMKgwqDCoMKgY29ubmVjdG9yLT5iYXNlLmlkLCBjb25uZWN0 b3ItPm5hbWUsCj4gPiArCQkJwqDCoMKgwqDCoMKgZHJtX2dldF9jb25uZWN0b3Jfc3RhdHVzX25h bWUob2xkX3N0Cj4gPiBhdAo+ID4gdXMpLAo+ID4gKwkJCcKgwqDCoMKgwqDCoGRybV9nZXRfY29u bmVjdG9yX3N0YXR1c19uYW1lKGN1cl9zdAo+ID4gYXQKPiA+IHVzKSk7Cj4gPiArCj4gPiArCQlp ZiAob2xkX3N0YXR1cyAhPSBjdXJfc3RhdHVzKQo+ID4gKwkJCWNoYW5nZWQgPSB0cnVlOwo+ID4g Kwo+ID4gKwkJLyogQ2hlY2sgY2hhbmdpbmcgb2YgZWRpZCB3aGVuIGEgY29ubmVjdG9yIHN0YXR1 cwo+ID4gc3RpbGwgcmVtYWlucwo+ID4gKwkJwqAqIGFzICJjb25uZWN0b3Jfc3RhdHVzX2Nvbm5l Y3RlZCIuCj4gPiArCQnCoCovCj4gPiArCQlpZiAob2xkX3N0YXR1cyA9PSBjdXJfc3RhdHVzICYm Cj4gPiArCQnCoMKgwqDCoGN1cl9zdGF0dXMgPT0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQp IHsKPiA+ICsJCQlzdHJ1Y3QgZWRpZCAqY3VyX2VkaWQgPQo+ID4gdG9faW50ZWxfY29ubmVjdG9y KGNvbm5lY3RvciktPmRldGVjdF9lZGlkOwo+ID4gKwo+ID4gKwkJCWlmICghb2xkX2VkaWQgfHwg IWN1cl9lZGlkKQo+ID4gKwkJCQljb250aW51ZTsKPiA+ICsKPiA+ICsJCQlpZiAobWVtY21wKG9s ZF9lZGlkLCBjdXJfZWRpZCwKPiA+IHNpemVvZigqY3VyX2VkaWQpKSkgewo+ID4gKwkJCQljaGFu Z2VkID0gdHJ1ZTsKPiA+ICsJCQkJRFJNX0RFQlVHX0tNUygiW0NPTk5FQ1RPUjolZDolc10KPiA+ IGVkaWQgdXBkYXRlZFxuIiwKPiA+ICsJCQkJCcKgwqDCoMKgwqDCoGNvbm5lY3Rvci0+YmFzZS5p ZCwKPiA+ICsJCQkJCcKgwqDCoMKgwqDCoGNvbm5lY3Rvci0+bmFtZSk7Cj4gPiArCQkJfQo+ID4g KwkJfQo+ID4gKwl9Cj4gPiArCWRybV9jb25uZWN0b3JfbGlzdF9pdGVyX2VuZCgmY29ubl9pdGVy KTsKPiA+ICsJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKPiA+ICsKPiA+ ICsJaWYgKGNoYW5nZWQpCj4gPiArCQlkcm1fa21zX2hlbHBlcl9ob3RwbHVnX2V2ZW50KGRldik7 Cj4gPiArCj4gPiArCXJldHVybiBjaGFuZ2VkOwo+ID4gK30KPiA+ICsKPiA+IMKgc3RhdGljIHZv aWQgaTkxNV9ocGRfcG9sbF9pbml0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ID4g wqB7Cj4gPiDCoAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPQo+ID4gQEAgLTU1 Miw3ICs2MzQsNyBAQCBzdGF0aWMgdm9pZCBpOTE1X2hwZF9wb2xsX2luaXRfd29yayhzdHJ1Y3QK PiA+IHdvcmtfc3RydWN0ICp3b3JrKQo+ID4gwqAJwqAqIGluIHRoZSBtaWRkbGUgb2YgZGlzYWJs aW5nIHBvbGxpbmcKPiA+IMKgCcKgKi8KPiA+IMKgCWlmICghZW5hYmxlZCkKPiA+IC0JCWRybV9o ZWxwZXJfaHBkX2lycV9ldmVudChkZXYpOwo+ID4gKwkJaW50ZWxfaHBkX2lycV9ldmVudChkZXYp Owo+ID4gwqB9Cj4gSnVzdCB3b25kZXJpbmcsIGFzIEkgc2F3IHByZXZpb3VzbHkgZHJtX2hlbHBl cl9ocGRfaXJxX2V2ZW50IGZ1bmN0aW9uCj4gd2FzIHVzZWQsIHdoaWNoIGJhc2ljYWxseSBkb2Vz IHRoZSBzYW1lIHRoaW5nLCBleGNlcHQgZG9pbmcgbWVtY21wCj4gZm9yIGRldGVjdGluZyB0aGUg ZWRpZCBjaGFuZ2UuIElzIGl0IG9ubHkgSW50ZWwgc3BlY2lmaWMgY2hhbmdlPyBBcwo+IHdlCj4g Y291bGQganVzdCBhZGQgdGhpcyBtb2RpZmljYXRpb24gdG8gZXhpc3RpbmcgaGVscGVyIGZ1bmN0 aW9uIG9yIGFkZAo+IGFub3RoZXIgaGVscGVyIGZ1bmN0aW9uIHRvIHRoZSBkcm0gKGRybV9wcm9i ZV9oZWxwZXIuYyksIHNvIHRoYXQgaXQKPiBpcwo+IGFsc28gdXNhYmxlIGVsc2V3aGVyZS4uCkkg c2Vjb25kIFN0YW5pc2xhdidzIHByb3Bvc2FsIHRvIGFkZCB0aGlzIGZlYXR1cmUgYXMgcGFydCBv ZiBkcm0uIFRoaXMKZWRpZCBjaGVjayBjb3VsZCBiZSBwYXJ0IG9mIGV4aXN0aW5nIGRybV9oZWxw ZXJfaHBkX2lycV9ldmVudCgpCmZ1bmN0aW9uLiBPdGhlciBkcml2ZXJzIG1pZ2h0IGZpbmQgdGhp cyBjaGFuZ2UgdXNlZnVsLgoKPiAKPiA+IAo+ID4gwqAKPiA+IMKgLyoqCj4gLS3CoAo+IEJlc3Qg UmVnYXJkcywKPiAKPiBMaXNvdnNraXkgU3RhbmlzbGF2Cj4gX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KPiBJbnRlbC1nZnggbWFpbGluZyBsaXN0Cj4gSW50 ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+IGh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Au b3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Ci0tIApNaWthIEthaG9sYSAtIEludGVsIE9U QwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwt Z2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8v bGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==