From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Return-Path: From: Laurent Pinchart To: Russell King - ARM Linux Cc: Laurent Pinchart , dri-devel@lists.freedesktop.org, Andy Yan , Fabio Estevam , Jose Abreu , Kieran Bingham , Ulrich Hecht , Vladimir Zapolskiy , linux-renesas-soc@vger.kernel.org Subject: Re: [PATCH v2 17/29] drm: bridge: dw-hdmi: Refactor PHY power handling Date: Tue, 20 Dec 2016 15:50:34 +0200 Message-ID: <17861036.j3qVTS9FcC@avalon> In-Reply-To: <20161220114553.GS14217@n2100.armlinux.org.uk> References: <20161220013400.28317-1-laurent.pinchart+renesas@ideasonboard.com> <20161220013400.28317-18-laurent.pinchart+renesas@ideasonboard.com> <20161220114553.GS14217@n2100.armlinux.org.uk> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" List-ID: Hi Russell, Thank you for the review. On Tuesday 20 Dec 2016 11:45:53 Russell King - ARM Linux wrote: > On Tue, Dec 20, 2016 at 03:33:48AM +0200, Laurent Pinchart wrote: > > Instead of spreading version-dependent PHY power handling code around, > > group it in two functions to power the PHY on and off and use them > > through the driver. > > > > Powering off the PHY at the beginning of the setup phase is currently > > split in two locations for first and second generation PHYs, group all > > the operations in the dw_hdmi_phy_init() function. > > This changes the behaviour of the driver. It does, but slightly only (I'm of course very aware that slightly can easily be way too much :-)). Let's analyse the differences, starting with PHY initialization in dw_hdmi_phy_init(). Before this patch, the function calls for (i = 0; i < 2; i++) { dw_hdmi_phy_sel_data_en_pol(hdmi, 1); dw_hdmi_phy_sel_interface_control(hdmi, 0); dw_hdmi_phy_enable_tmds(hdmi, 0); dw_hdmi_phy_enable_powerdown(hdmi, true); /* Enable CSC */ ret = hdmi_phy_configure(hdmi, cscon); if (ret) return ret; } and hdmi_phy_configure() starts with (I've removed lines that don't touch the hardware) /* Enable csc path */ if (cscon) val = HDMI_MC_FLOWCTRL_FEED_THROUGH_OFF_CSC_IN_PATH; else val = HDMI_MC_FLOWCTRL_FEED_THROUGH_OFF_CSC_BYPASS; hdmi_writeb(hdmi, val, HDMI_MC_FLOWCTRL); /* gen2 tx power off */ dw_hdmi_phy_gen2_txpwron(hdmi, 0); /* gen2 pddq */ dw_hdmi_phy_gen2_pddq(hdmi, 1); After the change, dw_hdmi_phy_init() calls for (i = 0; i < 2; i++) { dw_hdmi_phy_sel_data_en_pol(hdmi, 1); dw_hdmi_phy_sel_interface_control(hdmi, 0); /* Enable CSC */ ret = hdmi_phy_configure(hdmi, cscon); if (ret) return ret; } and hdmi_phy_configure() starts with /* Enable csc path */ if (cscon) val = HDMI_MC_FLOWCTRL_FEED_THROUGH_OFF_CSC_IN_PATH; else val = HDMI_MC_FLOWCTRL_FEED_THROUGH_OFF_CSC_BYPASS; hdmi_writeb(hdmi, val, HDMI_MC_FLOWCTRL); dw_hdmi_phy_power_off(hdmi); with dw_hdmi_phy_power_off() defined as if (hdmi->phy->gen == 1) { dw_hdmi_phy_enable_tmds(hdmi, 0); dw_hdmi_phy_enable_powerdown(hdmi, true); } else { dw_hdmi_phy_gen2_txpwron(hdmi, 0); dw_hdmi_phy_gen2_pddq(hdmi, 1); } This patch thus changes the behaviour in two ways: - Move the dw_hdmi_phy_enable_tmds() and dw_hdmi_phy_enable_powerdown() calls after CSC configuration (HDMI_MC_FLOWCTRL). - Only touch the power bits related to the PHY generation. I believe the first change to be harmless. Furthermore, given that the i.MX6 and Rockchip SoCs use a Gen2 PHY, the TMDS and POWERDOWN bits should be no- ops, so it should have no effect at all on those platforms. I also believe the second change to be harmless as the TMDS and POWERDOWN bits should be no-ops on i.MX6 and Rockchip. I have tested this patch series on RK3288 and i.MX6Q and haven't noticed any regression. The power on path should similarly be fine too, as the change - dw_hdmi_phy_enable_powerdown(hdmi, false); - - /* toggle TMDS enable */ - dw_hdmi_phy_enable_tmds(hdmi, 0); - dw_hdmi_phy_enable_tmds(hdmi, 1); - - /* gen2 tx power on */ - dw_hdmi_phy_gen2_txpwron(hdmi, 1); - dw_hdmi_phy_gen2_pddq(hdmi, 0); + dw_hdmi_phy_power_on(hdmi); results in static void dw_hdmi_phy_power_on(struct dw_hdmi *hdmi) { if (hdmi->phy->gen == 1) { dw_hdmi_phy_enable_powerdown(hdmi, false); /* Toggle TMDS enable. */ dw_hdmi_phy_enable_tmds(hdmi, 0); dw_hdmi_phy_enable_tmds(hdmi, 1); } else { dw_hdmi_phy_gen2_txpwron(hdmi, 1); dw_hdmi_phy_gen2_pddq(hdmi, 0); } } which splits the Gen1/Gen2 code but doesn't reorder anything. The last change is in dw_hdmi_phy_disable(), see below. > > +static void dw_hdmi_phy_power_off(struct dw_hdmi *hdmi) > > +{ > > + if (hdmi->phy->gen == 1) { > > + dw_hdmi_phy_enable_tmds(hdmi, 0); > > + dw_hdmi_phy_enable_powerdown(hdmi, true); > > + } else { > > + dw_hdmi_phy_gen2_txpwron(hdmi, 0); > > + dw_hdmi_phy_gen2_pddq(hdmi, 1); > > + } > > +} > > > > @@ -1290,9 +1302,7 @@ static void dw_hdmi_phy_disable(struct dw_hdmi > > *hdmi) > > if (!hdmi->phy_enabled) > > return; > > > > - dw_hdmi_phy_enable_tmds(hdmi, 0); > > - dw_hdmi_phy_enable_powerdown(hdmi, true); > > - > > + dw_hdmi_phy_power_off(hdmi); > > This makes dw_hdmi_phy_disable() power down a gen2 phy. That's correct. > The iMX6 has a DW_HDMI_PHY_DWC_HDMI_3D_TX_PHY phy, which you list as a > gen2 phy. To the best of my knowledge, based on the documentation I've been able to gather, the information I've received from different developers and the tests I've performed so far, this is the case. > I've been carrying this change for a while, which I've had > to revert (and finally expunge), as it causes problems on iMX6: > > @@ -1112,6 +1112,14 @@ static void dw_hdmi_phy_disable(struct dw_hdmi *hdmi) > if (!hdmi->phy_enabled) > return; > > + /* Actually set the phy into low power mode */ > + dw_hdmi_phy_gen2_txpwron(hdmi, 0); > + > + /* FIXME: We should wait for TX_READY to be deasserted */ > + > + dw_hdmi_phy_gen2_pddq(hdmi, 1); > + > + /* This appears to have no effect on iMX6 */ > dw_hdmi_phy_enable_tmds(hdmi, 0); > dw_hdmi_phy_enable_powerdown(hdmi, true); > > So, I think your change here will cause problems for iMX6. > > From what I remember, it seems that iMX6 has issues with RXSENSE/HPD > bouncing when the PHY is powered down. I can't promise when I'll be > able to check for that again. The current code is supposed to power the PHY down in dw_hdmi_phy_disable() but doesn't do so as it only handles Gen1 PHY signals there. Gen2 PHYs thus always stay enabled. If this causes an issue on i.MX6 related to RXSENSE and HPD, I think it should be handled by explicitly skipping power down in dw_hdmi_phy_disable() instead of pretending we power the PHY down. This could be achieved through a quirk flag if the issue is specific to i.MX6, or based on the PHY model if the issue is present in all DW_HDMI_PHY_DWC_HDMI_3D_TX_PHY_HEAC PHYs. Jose, would you happen to be aware of RXSENSE/HPD issues when the PHY is disabled ? If there's an easy way to reproduce the problem on i.MX6Q I can try locally. I unfortunately don't have access to i.MX6DL. -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH v2 17/29] drm: bridge: dw-hdmi: Refactor PHY power handling Date: Tue, 20 Dec 2016 15:50:34 +0200 Message-ID: <17861036.j3qVTS9FcC@avalon> References: <20161220013400.28317-1-laurent.pinchart+renesas@ideasonboard.com> <20161220013400.28317-18-laurent.pinchart+renesas@ideasonboard.com> <20161220114553.GS14217@n2100.armlinux.org.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from galahad.ideasonboard.com (galahad.ideasonboard.com [185.26.127.97]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3F52B6EE4B for ; Tue, 20 Dec 2016 13:50:06 +0000 (UTC) In-Reply-To: <20161220114553.GS14217@n2100.armlinux.org.uk> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Russell King - ARM Linux Cc: Fabio Estevam , Jose Abreu , Laurent Pinchart , Kieran Bingham , dri-devel@lists.freedesktop.org, linux-renesas-soc@vger.kernel.org, Ulrich Hecht , Andy Yan , Vladimir Zapolskiy List-Id: dri-devel@lists.freedesktop.org SGkgUnVzc2VsbCwKClRoYW5rIHlvdSBmb3IgdGhlIHJldmlldy4KCk9uIFR1ZXNkYXkgMjAgRGVj IDIwMTYgMTE6NDU6NTMgUnVzc2VsbCBLaW5nIC0gQVJNIExpbnV4IHdyb3RlOgo+IE9uIFR1ZSwg RGVjIDIwLCAyMDE2IGF0IDAzOjMzOjQ4QU0gKzAyMDAsIExhdXJlbnQgUGluY2hhcnQgd3JvdGU6 Cj4gPiBJbnN0ZWFkIG9mIHNwcmVhZGluZyB2ZXJzaW9uLWRlcGVuZGVudCBQSFkgcG93ZXIgaGFu ZGxpbmcgY29kZSBhcm91bmQsCj4gPiBncm91cCBpdCBpbiB0d28gZnVuY3Rpb25zIHRvIHBvd2Vy IHRoZSBQSFkgb24gYW5kIG9mZiBhbmQgdXNlIHRoZW0KPiA+IHRocm91Z2ggdGhlIGRyaXZlci4K PiA+IAo+ID4gUG93ZXJpbmcgb2ZmIHRoZSBQSFkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2V0 dXAgcGhhc2UgaXMgY3VycmVudGx5Cj4gPiBzcGxpdCBpbiB0d28gbG9jYXRpb25zIGZvciBmaXJz dCBhbmQgc2Vjb25kIGdlbmVyYXRpb24gUEhZcywgZ3JvdXAgYWxsCj4gPiB0aGUgb3BlcmF0aW9u cyBpbiB0aGUgZHdfaGRtaV9waHlfaW5pdCgpIGZ1bmN0aW9uLgo+IAo+IFRoaXMgY2hhbmdlcyB0 aGUgYmVoYXZpb3VyIG9mIHRoZSBkcml2ZXIuCgpJdCBkb2VzLCBidXQgc2xpZ2h0bHkgb25seSAo SSdtIG9mIGNvdXJzZSB2ZXJ5IGF3YXJlIHRoYXQgc2xpZ2h0bHkgY2FuIGVhc2lseSAKYmUgd2F5 IHRvbyBtdWNoIDotKSkuCgpMZXQncyBhbmFseXNlIHRoZSBkaWZmZXJlbmNlcywgc3RhcnRpbmcg d2l0aCBQSFkgaW5pdGlhbGl6YXRpb24gaW4gCmR3X2hkbWlfcGh5X2luaXQoKS4gQmVmb3JlIHRo aXMgcGF0Y2gsIHRoZSBmdW5jdGlvbiBjYWxscwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsg aSsrKSB7CiAgICAgICAgICAgICAgICBkd19oZG1pX3BoeV9zZWxfZGF0YV9lbl9wb2woaGRtaSwg MSk7CiAgICAgICAgICAgICAgICBkd19oZG1pX3BoeV9zZWxfaW50ZXJmYWNlX2NvbnRyb2woaGRt aSwgMCk7CiAgICAgICAgICAgICAgICBkd19oZG1pX3BoeV9lbmFibGVfdG1kcyhoZG1pLCAwKTsK ICAgICAgICAgICAgICAgIGR3X2hkbWlfcGh5X2VuYWJsZV9wb3dlcmRvd24oaGRtaSwgdHJ1ZSk7 CgogICAgICAgICAgICAgICAgLyogRW5hYmxlIENTQyAqLwogICAgICAgICAgICAgICAgcmV0ID0g aGRtaV9waHlfY29uZmlndXJlKGhkbWksIGNzY29uKTsKICAgICAgICAgICAgICAgIGlmIChyZXQp CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfQoKYW5kIGhkbWlf cGh5X2NvbmZpZ3VyZSgpIHN0YXJ0cyB3aXRoIChJJ3ZlIHJlbW92ZWQgbGluZXMgdGhhdCBkb24n dCB0b3VjaCB0aGUgCmhhcmR3YXJlKQoKICAgICAgICAvKiBFbmFibGUgY3NjIHBhdGggKi8KICAg ICAgICBpZiAoY3Njb24pCiAgICAgICAgICAgICAgICB2YWwgPSBIRE1JX01DX0ZMT1dDVFJMX0ZF RURfVEhST1VHSF9PRkZfQ1NDX0lOX1BBVEg7CiAgICAgICAgZWxzZQogICAgICAgICAgICAgICAg dmFsID0gSERNSV9NQ19GTE9XQ1RSTF9GRUVEX1RIUk9VR0hfT0ZGX0NTQ19CWVBBU1M7CgogICAg ICAgIGhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9NQ19GTE9XQ1RSTCk7CgogICAgICAgIC8q IGdlbjIgdHggcG93ZXIgb2ZmICovCiAgICAgICAgZHdfaGRtaV9waHlfZ2VuMl90eHB3cm9uKGhk bWksIDApOwoKICAgICAgICAvKiBnZW4yIHBkZHEgKi8KICAgICAgICBkd19oZG1pX3BoeV9nZW4y X3BkZHEoaGRtaSwgMSk7CgpBZnRlciB0aGUgY2hhbmdlLCBkd19oZG1pX3BoeV9pbml0KCkgY2Fs bHMKCiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgICAgICAgICAgZHdf aGRtaV9waHlfc2VsX2RhdGFfZW5fcG9sKGhkbWksIDEpOwogICAgICAgICAgICAgICAgZHdfaGRt aV9waHlfc2VsX2ludGVyZmFjZV9jb250cm9sKGhkbWksIDApOwoKICAgICAgICAgICAgICAgIC8q IEVuYWJsZSBDU0MgKi8KICAgICAgICAgICAgICAgIHJldCA9IGhkbWlfcGh5X2NvbmZpZ3VyZSho ZG1pLCBjc2Nvbik7CiAgICAgICAgICAgICAgICBpZiAocmV0KQogICAgICAgICAgICAgICAgICAg ICAgICByZXR1cm4gcmV0OwogICAgICAgIH0KCmFuZCBoZG1pX3BoeV9jb25maWd1cmUoKSBzdGFy dHMgd2l0aAoKICAgICAgICAvKiBFbmFibGUgY3NjIHBhdGggKi8KICAgICAgICBpZiAoY3Njb24p CiAgICAgICAgICAgICAgICB2YWwgPSBIRE1JX01DX0ZMT1dDVFJMX0ZFRURfVEhST1VHSF9PRkZf Q1NDX0lOX1BBVEg7CiAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdmFsID0gSERNSV9NQ19G TE9XQ1RSTF9GRUVEX1RIUk9VR0hfT0ZGX0NTQ19CWVBBU1M7CgogICAgICAgIGhkbWlfd3JpdGVi KGhkbWksIHZhbCwgSERNSV9NQ19GTE9XQ1RSTCk7CgogICAgICAgIGR3X2hkbWlfcGh5X3Bvd2Vy X29mZihoZG1pKTsKCndpdGggZHdfaGRtaV9waHlfcG93ZXJfb2ZmKCkgZGVmaW5lZCBhcwoKICAg ICAgICBpZiAoaGRtaS0+cGh5LT5nZW4gPT0gMSkgewogICAgICAgICAgICAgICAgZHdfaGRtaV9w aHlfZW5hYmxlX3RtZHMoaGRtaSwgMCk7CiAgICAgICAgICAgICAgICBkd19oZG1pX3BoeV9lbmFi bGVfcG93ZXJkb3duKGhkbWksIHRydWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAg ICBkd19oZG1pX3BoeV9nZW4yX3R4cHdyb24oaGRtaSwgMCk7CiAgICAgICAgICAgICAgICBkd19o ZG1pX3BoeV9nZW4yX3BkZHEoaGRtaSwgMSk7CiAgICAgICAgfQoKVGhpcyBwYXRjaCB0aHVzIGNo YW5nZXMgdGhlIGJlaGF2aW91ciBpbiB0d28gd2F5czoKCi0gTW92ZSB0aGUgZHdfaGRtaV9waHlf ZW5hYmxlX3RtZHMoKSBhbmQgZHdfaGRtaV9waHlfZW5hYmxlX3Bvd2VyZG93bigpIGNhbGxzIAph ZnRlciBDU0MgY29uZmlndXJhdGlvbiAoSERNSV9NQ19GTE9XQ1RSTCkuCgotIE9ubHkgdG91Y2gg dGhlIHBvd2VyIGJpdHMgcmVsYXRlZCB0byB0aGUgUEhZIGdlbmVyYXRpb24uCgpJIGJlbGlldmUg dGhlIGZpcnN0IGNoYW5nZSB0byBiZSBoYXJtbGVzcy4gRnVydGhlcm1vcmUsIGdpdmVuIHRoYXQg dGhlIGkuTVg2IAphbmQgUm9ja2NoaXAgU29DcyB1c2UgYSBHZW4yIFBIWSwgdGhlIFRNRFMgYW5k IFBPV0VSRE9XTiBiaXRzIHNob3VsZCBiZSBuby0Kb3BzLCBzbyBpdCBzaG91bGQgaGF2ZSBubyBl ZmZlY3QgYXQgYWxsIG9uIHRob3NlIHBsYXRmb3Jtcy4KCkkgYWxzbyBiZWxpZXZlIHRoZSBzZWNv bmQgY2hhbmdlIHRvIGJlIGhhcm1sZXNzIGFzIHRoZSBUTURTIGFuZCBQT1dFUkRPV04gYml0cyAK c2hvdWxkIGJlIG5vLW9wcyBvbiBpLk1YNiBhbmQgUm9ja2NoaXAuIEkgaGF2ZSB0ZXN0ZWQgdGhp cyBwYXRjaCBzZXJpZXMgb24gClJLMzI4OCBhbmQgaS5NWDZRIGFuZCBoYXZlbid0IG5vdGljZWQg YW55IHJlZ3Jlc3Npb24uCgpUaGUgcG93ZXIgb24gcGF0aCBzaG91bGQgc2ltaWxhcmx5IGJlIGZp bmUgdG9vLCBhcyB0aGUgY2hhbmdlCgotICAgICAgIGR3X2hkbWlfcGh5X2VuYWJsZV9wb3dlcmRv d24oaGRtaSwgZmFsc2UpOwotCi0gICAgICAgLyogdG9nZ2xlIFRNRFMgZW5hYmxlICovCi0gICAg ICAgZHdfaGRtaV9waHlfZW5hYmxlX3RtZHMoaGRtaSwgMCk7Ci0gICAgICAgZHdfaGRtaV9waHlf ZW5hYmxlX3RtZHMoaGRtaSwgMSk7Ci0KLSAgICAgICAvKiBnZW4yIHR4IHBvd2VyIG9uICovCi0g ICAgICAgZHdfaGRtaV9waHlfZ2VuMl90eHB3cm9uKGhkbWksIDEpOwotICAgICAgIGR3X2hkbWlf cGh5X2dlbjJfcGRkcShoZG1pLCAwKTsKKyAgICAgICBkd19oZG1pX3BoeV9wb3dlcl9vbihoZG1p KTsKCnJlc3VsdHMgaW4KCnN0YXRpYyB2b2lkIGR3X2hkbWlfcGh5X3Bvd2VyX29uKHN0cnVjdCBk d19oZG1pICpoZG1pKQp7CglpZiAoaGRtaS0+cGh5LT5nZW4gPT0gMSkgewoJCWR3X2hkbWlfcGh5 X2VuYWJsZV9wb3dlcmRvd24oaGRtaSwgZmFsc2UpOwoKCQkvKiBUb2dnbGUgVE1EUyBlbmFibGUu ICovCgkJZHdfaGRtaV9waHlfZW5hYmxlX3RtZHMoaGRtaSwgMCk7CgkJZHdfaGRtaV9waHlfZW5h YmxlX3RtZHMoaGRtaSwgMSk7Cgl9IGVsc2UgewoJCWR3X2hkbWlfcGh5X2dlbjJfdHhwd3Jvbiho ZG1pLCAxKTsKCQlkd19oZG1pX3BoeV9nZW4yX3BkZHEoaGRtaSwgMCk7Cgl9Cn0KCndoaWNoIHNw bGl0cyB0aGUgR2VuMS9HZW4yIGNvZGUgYnV0IGRvZXNuJ3QgcmVvcmRlciBhbnl0aGluZy4KClRo ZSBsYXN0IGNoYW5nZSBpcyBpbiBkd19oZG1pX3BoeV9kaXNhYmxlKCksIHNlZSBiZWxvdy4KCj4g PiArc3RhdGljIHZvaWQgZHdfaGRtaV9waHlfcG93ZXJfb2ZmKHN0cnVjdCBkd19oZG1pICpoZG1p KQo+ID4gK3sKPiA+ICsJaWYgKGhkbWktPnBoeS0+Z2VuID09IDEpIHsKPiA+ICsJCWR3X2hkbWlf cGh5X2VuYWJsZV90bWRzKGhkbWksIDApOwo+ID4gKwkJZHdfaGRtaV9waHlfZW5hYmxlX3Bvd2Vy ZG93bihoZG1pLCB0cnVlKTsKPiA+ICsJfSBlbHNlIHsKPiA+ICsJCWR3X2hkbWlfcGh5X2dlbjJf dHhwd3JvbihoZG1pLCAwKTsKPiA+ICsJCWR3X2hkbWlfcGh5X2dlbjJfcGRkcShoZG1pLCAxKTsK PiA+ICsJfQo+ID4gK30KPiA+IAo+ID4gQEAgLTEyOTAsOSArMTMwMiw3IEBAIHN0YXRpYyB2b2lk IGR3X2hkbWlfcGh5X2Rpc2FibGUoc3RydWN0IGR3X2hkbWkKPiA+ICpoZG1pKQo+ID4gIAlpZiAo IWhkbWktPnBoeV9lbmFibGVkKQo+ID4gIAkJcmV0dXJuOwo+ID4gCj4gPiAtCWR3X2hkbWlfcGh5 X2VuYWJsZV90bWRzKGhkbWksIDApOwo+ID4gLQlkd19oZG1pX3BoeV9lbmFibGVfcG93ZXJkb3du KGhkbWksIHRydWUpOwo+ID4gLQo+ID4gKwlkd19oZG1pX3BoeV9wb3dlcl9vZmYoaGRtaSk7Cj4g Cj4gVGhpcyBtYWtlcyBkd19oZG1pX3BoeV9kaXNhYmxlKCkgcG93ZXIgZG93biBhIGdlbjIgcGh5 LgoKVGhhdCdzIGNvcnJlY3QuCgo+IFRoZSBpTVg2IGhhcyBhIERXX0hETUlfUEhZX0RXQ19IRE1J XzNEX1RYX1BIWSBwaHksIHdoaWNoIHlvdSBsaXN0IGFzIGEKPiBnZW4yIHBoeS4KClRvIHRoZSBi ZXN0IG9mIG15IGtub3dsZWRnZSwgYmFzZWQgb24gdGhlIGRvY3VtZW50YXRpb24gSSd2ZSBiZWVu IGFibGUgdG8gCmdhdGhlciwgdGhlIGluZm9ybWF0aW9uIEkndmUgcmVjZWl2ZWQgZnJvbSBkaWZm ZXJlbnQgZGV2ZWxvcGVycyBhbmQgdGhlIHRlc3RzIApJJ3ZlIHBlcmZvcm1lZCBzbyBmYXIsIHRo aXMgaXMgdGhlIGNhc2UuCgo+IEkndmUgYmVlbiBjYXJyeWluZyB0aGlzIGNoYW5nZSBmb3IgYSB3 aGlsZSwgd2hpY2ggSSd2ZSBoYWQKPiB0byByZXZlcnQgKGFuZCBmaW5hbGx5IGV4cHVuZ2UpLCBh cyBpdCBjYXVzZXMgcHJvYmxlbXMgb24gaU1YNjoKPiAKPiBAQCAtMTExMiw2ICsxMTEyLDE0IEBA IHN0YXRpYyB2b2lkIGR3X2hkbWlfcGh5X2Rpc2FibGUoc3RydWN0IGR3X2hkbWkgKmhkbWkpCj4g aWYgKCFoZG1pLT5waHlfZW5hYmxlZCkKPiAgICAgICAgICAgICAgICAgcmV0dXJuOwo+IAo+ICsg ICAgICAgLyogQWN0dWFsbHkgc2V0IHRoZSBwaHkgaW50byBsb3cgcG93ZXIgbW9kZSAqLwo+ICsg ICAgICAgZHdfaGRtaV9waHlfZ2VuMl90eHB3cm9uKGhkbWksIDApOwo+ICsKPiArICAgICAgIC8q IEZJWE1FOiBXZSBzaG91bGQgd2FpdCBmb3IgVFhfUkVBRFkgdG8gYmUgZGVhc3NlcnRlZCAqLwo+ ICsKPiArICAgICAgIGR3X2hkbWlfcGh5X2dlbjJfcGRkcShoZG1pLCAxKTsKPiArCj4gKyAgICAg ICAvKiBUaGlzIGFwcGVhcnMgdG8gaGF2ZSBubyBlZmZlY3Qgb24gaU1YNiAqLwo+ICAgICAgICAg ZHdfaGRtaV9waHlfZW5hYmxlX3RtZHMoaGRtaSwgMCk7Cj4gICAgICAgICBkd19oZG1pX3BoeV9l bmFibGVfcG93ZXJkb3duKGhkbWksIHRydWUpOwo+IAo+IFNvLCBJIHRoaW5rIHlvdXIgY2hhbmdl IGhlcmUgd2lsbCBjYXVzZSBwcm9ibGVtcyBmb3IgaU1YNi4KPiAKPiBGcm9tIHdoYXQgSSByZW1l bWJlciwgaXQgc2VlbXMgdGhhdCBpTVg2IGhhcyBpc3N1ZXMgd2l0aCBSWFNFTlNFL0hQRAo+IGJv dW5jaW5nIHdoZW4gdGhlIFBIWSBpcyBwb3dlcmVkIGRvd24uICBJIGNhbid0IHByb21pc2Ugd2hl biBJJ2xsIGJlCj4gYWJsZSB0byBjaGVjayBmb3IgdGhhdCBhZ2Fpbi4KClRoZSBjdXJyZW50IGNv ZGUgaXMgc3VwcG9zZWQgdG8gcG93ZXIgdGhlIFBIWSBkb3duIGluIGR3X2hkbWlfcGh5X2Rpc2Fi bGUoKSAKYnV0IGRvZXNuJ3QgZG8gc28gYXMgaXQgb25seSBoYW5kbGVzIEdlbjEgUEhZIHNpZ25h bHMgdGhlcmUuIEdlbjIgUEhZcyB0aHVzIAphbHdheXMgc3RheSBlbmFibGVkLgoKSWYgdGhpcyBj YXVzZXMgYW4gaXNzdWUgb24gaS5NWDYgcmVsYXRlZCB0byBSWFNFTlNFIGFuZCBIUEQsIEkgdGhp bmsgaXQgc2hvdWxkIApiZSBoYW5kbGVkIGJ5IGV4cGxpY2l0bHkgc2tpcHBpbmcgcG93ZXIgZG93 biBpbiBkd19oZG1pX3BoeV9kaXNhYmxlKCkgaW5zdGVhZCAKb2YgcHJldGVuZGluZyB3ZSBwb3dl ciB0aGUgUEhZIGRvd24uIFRoaXMgY291bGQgYmUgYWNoaWV2ZWQgdGhyb3VnaCBhIHF1aXJrIApm bGFnIGlmIHRoZSBpc3N1ZSBpcyBzcGVjaWZpYyB0byBpLk1YNiwgb3IgYmFzZWQgb24gdGhlIFBI WSBtb2RlbCBpZiB0aGUgaXNzdWUgCmlzIHByZXNlbnQgaW4gYWxsIERXX0hETUlfUEhZX0RXQ19I RE1JXzNEX1RYX1BIWV9IRUFDIFBIWXMuIEpvc2UsIHdvdWxkIHlvdSAKaGFwcGVuIHRvIGJlIGF3 YXJlIG9mIFJYU0VOU0UvSFBEIGlzc3VlcyB3aGVuIHRoZSBQSFkgaXMgZGlzYWJsZWQgPwoKSWYg dGhlcmUncyBhbiBlYXN5IHdheSB0byByZXByb2R1Y2UgdGhlIHByb2JsZW0gb24gaS5NWDZRIEkg Y2FuIHRyeSBsb2NhbGx5LiBJIAp1bmZvcnR1bmF0ZWx5IGRvbid0IGhhdmUgYWNjZXNzIHRvIGku TVg2REwuCgotLSAKUmVnYXJkcywKCkxhdXJlbnQgUGluY2hhcnQKCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJp LWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=