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 , Archit Taneja , Fabio Estevam , Heiko Stuebner , Jose Abreu , Kieran Bingham , Mark Yao , Philipp Zabel , Ulrich Hecht , Vladimir Zapolskiy , linux-renesas-soc@vger.kernel.org Subject: Re: [PATCH 13/22] drm: bridge: dw-hdmi: Replace device type with platform quirks Date: Fri, 02 Dec 2016 17:43:43 +0200 Message-ID: <4921806.T6YjZHsEAd@avalon> In-Reply-To: <20161202142401.GD14217@n2100.armlinux.org.uk> References: <1480635817-1258-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> <1480635817-1258-14-git-send-email-laurent.pinchart+renesas@ideasonboard.com> <20161202142401.GD14217@n2100.armlinux.org.uk> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" List-ID: Hi Russell, On Friday 02 Dec 2016 14:24:01 Russell King - ARM Linux wrote: > On Fri, Dec 02, 2016 at 01:43:28AM +0200, Laurent Pinchart wrote: > > From: Kieran Bingham > > > > The dw-hdmi driver declares a dev_type to distinguish platform specific > > changes. Replace this with a quirk field, so that the platform can > > specify the required quirks for the driver, rather than the driver > > becoming conditional on multiple platforms. > > > > As part of this, we rename the dw-hdmi 'spare' which is defined as the > > SVSRET bit in later documentation. > > I'd really prefer that we did not go down the broken route of adding > a set of "quirk" flags - look at what a mess SDHCI has become through > allowing that kind of practice. > > I'd much rather we find a saner structure to this - and we know that > the hardware has ID registers in it which can be used (so far) to > identify the buggy hardware. I'd much prefer something that would allow runtime identification of the device and the corresponding actions to be taken. However, the amount of documentation we have on the DWC HDMI TX IP core (and the associated PHY) is pretty limited, given that Synopsys doesn't make the documentation available publicly. Changes made to the IP core by integrators could complicate this further. I'm trying to gather as much information as possible to make clean the code up, for instance by trying to identify the PHYs used on the various platforms we support. Progress is slow on that front, there isn't enough leaked information available online :-) I haven't given up though, but I'll need more time. I don't like quirks much either. They are however already used today, even if we trigger them through dev_type instead of quirk flags. This patch came from a previous version found in a BSP that simply sprinkled several if (hdmi- >dev_type == RCAR_HDMI) through the code. For instance, - if (hdmi->dev_type == RK3288_HDMI) + if (hdmi->dev_type == RK3288_HDMI || hdmi->dev_type == RCAR_HDMI) dw_hdmi_phy_enable_spare(hdmi, 1); which I think is worse than flags as it would quickly degenerate to spaghetti code. For this specific case, we've managed to identify that on Renesas platforms the bit set by this function is called SVSRET. Its usage isn't clear yet, but I suspect it to control one of the PHY input control signals, like the other bits in the same register. I'm trying to get more information to clean the implementation further, hopefully with a way to determine whether the signal is used based on PHY identification. This is all work in progress, and if anyone has access to any documentation and can provide additional information I'll be grateful. > > Signed-off-by: Kieran Bingham > > Signed-off-by: Laurent Pinchart > > > > --- > > > > drivers/gpu/drm/bridge/dw-hdmi.c | 14 ++++++-------- > > drivers/gpu/drm/bridge/dw-hdmi.h | 4 ++-- > > drivers/gpu/drm/imx/dw_hdmi-imx.c | 3 +-- > > drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 2 +- > > include/drm/bridge/dw_hdmi.h | 12 +++++------- > > 5 files changed, 15 insertions(+), 20 deletions(-) > > > > diff --git a/drivers/gpu/drm/bridge/dw-hdmi.c > > b/drivers/gpu/drm/bridge/dw-hdmi.c index 06a44a2cdf3b..26607185722f > > 100644 > > --- a/drivers/gpu/drm/bridge/dw-hdmi.c > > +++ b/drivers/gpu/drm/bridge/dw-hdmi.c > > @@ -118,7 +118,6 @@ struct dw_hdmi { > > struct drm_bridge bridge; > > struct platform_device *audio; > > > > - enum dw_hdmi_devtype dev_type; > > struct device *dev; > > struct clk *isfr_clk; > > struct clk *iahb_clk; > > @@ -896,11 +895,11 @@ static void dw_hdmi_phy_enable_tmds(struct dw_hdmi > > *hdmi, u8 enable) > > HDMI_PHY_CONF0_ENTMDS_MASK); > > } > > > > -static void dw_hdmi_phy_enable_spare(struct dw_hdmi *hdmi, u8 enable) > > +static void dw_hdmi_phy_enable_svsret(struct dw_hdmi *hdmi, u8 enable) > > { > > hdmi_mask_writeb(hdmi, enable, HDMI_PHY_CONF0, > > - HDMI_PHY_CONF0_SPARECTRL_OFFSET, > > - HDMI_PHY_CONF0_SPARECTRL_MASK); > > + HDMI_PHY_CONF0_SVSRET_OFFSET, > > + HDMI_PHY_CONF0_SVSRET_MASK); > > } > > > > static void dw_hdmi_phy_gen2_pddq(struct dw_hdmi *hdmi, u8 enable) > > @@ -1031,8 +1030,8 @@ static int hdmi_phy_configure(struct dw_hdmi *hdmi, > > dw_hdmi_phy_gen2_txpwron(hdmi, 1); > > dw_hdmi_phy_gen2_pddq(hdmi, 0); > > > > - if (hdmi->dev_type == RK3288_HDMI) > > - dw_hdmi_phy_enable_spare(hdmi, 1); > > + if (pdata->quirks & DW_HDMI_QUIRK_PHY_SVSRET) > > + dw_hdmi_phy_enable_svsret(hdmi, 1); > > If we get a proper split between the encoder and the PHY, this should be > dealt with at the PHY side of the driver. That's possible, and some other PHY-related setup code might be better placed in the PHY side as well. My problem, as explained above, is that I don't have enough information yet to design a perfect API. I think this patch is a good step forward, but it should not be the last one. I wish I could spend more time writing clean code instead of trying to reverse engineer the behaviour of the PHY :-) > > /*Wait for PHY PLL lock */ > > msec = 5; > > > > @@ -1348,7 +1347,7 @@ static void dw_hdmi_clear_overflow(struct dw_hdmi > > *hdmi) > > hdmi_writeb(hdmi, (u8)~HDMI_MC_SWRSTZ_TMDSSWRST_REQ, HDMI_MC_SWRSTZ); > > > > val = hdmi_readb(hdmi, HDMI_FC_INVIDCONF); > > - if (hdmi->dev_type == IMX6DL_HDMI) { > > + if (hdmi->plat_data->quirks & DW_HDMI_QUIRK_FC_INVIDCONF) { > > hdmi_writeb(hdmi, val, HDMI_FC_INVIDCONF); > > return; > > } > > This is a bug found on iMX6DL versions of the IP - I don't have a 6DL > board powered up at the moment to grab its revision information, but > it would be nice to make that conditional on the revision. From what > I gather, it's a workaround issued by Synopsis rather than specific > to the (ex)FSL implementation. DW_HDMI_QUIRK_FC_INVIDCONF is indeed a bad name, I'll fix that. Do you know why this function needs to write to the HDMI_FC_INVIDCONF register four times in the normal case, and once only for IMX6DL ? -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH 13/22] drm: bridge: dw-hdmi: Replace device type with platform quirks Date: Fri, 02 Dec 2016 17:43:43 +0200 Message-ID: <4921806.T6YjZHsEAd@avalon> References: <1480635817-1258-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> <1480635817-1258-14-git-send-email-laurent.pinchart+renesas@ideasonboard.com> <20161202142401.GD14217@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 [IPv6:2001:4b98:dc2:45:216:3eff:febb:480d]) by gabe.freedesktop.org (Postfix) with ESMTPS id 5E2F86E9A7 for ; Fri, 2 Dec 2016 15:43:26 +0000 (UTC) In-Reply-To: <20161202142401.GD14217@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 , Ulrich Hecht , Kieran Bingham , dri-devel@lists.freedesktop.org, linux-renesas-soc@vger.kernel.org, Andy Yan , Vladimir Zapolskiy List-Id: dri-devel@lists.freedesktop.org SGkgUnVzc2VsbCwKCk9uIEZyaWRheSAwMiBEZWMgMjAxNiAxNDoyNDowMSBSdXNzZWxsIEtpbmcg LSBBUk0gTGludXggd3JvdGU6Cj4gT24gRnJpLCBEZWMgMDIsIDIwMTYgYXQgMDE6NDM6MjhBTSAr MDIwMCwgTGF1cmVudCBQaW5jaGFydCB3cm90ZToKPiA+IEZyb206IEtpZXJhbiBCaW5naGFtIDxr aWVyYW4uYmluZ2hhbStyZW5lc2FzQGlkZWFzb25ib2FyZC5jb20+Cj4gPiAKPiA+IFRoZSBkdy1o ZG1pIGRyaXZlciBkZWNsYXJlcyBhIGRldl90eXBlIHRvIGRpc3Rpbmd1aXNoIHBsYXRmb3JtIHNw ZWNpZmljCj4gPiBjaGFuZ2VzLiBSZXBsYWNlIHRoaXMgd2l0aCBhIHF1aXJrIGZpZWxkLCBzbyB0 aGF0IHRoZSBwbGF0Zm9ybSBjYW4KPiA+IHNwZWNpZnkgdGhlIHJlcXVpcmVkIHF1aXJrcyBmb3Ig dGhlIGRyaXZlciwgcmF0aGVyIHRoYW4gdGhlIGRyaXZlcgo+ID4gYmVjb21pbmcgY29uZGl0aW9u YWwgb24gbXVsdGlwbGUgcGxhdGZvcm1zLgo+ID4gCj4gPiBBcyBwYXJ0IG9mIHRoaXMsIHdlIHJl bmFtZSB0aGUgZHctaGRtaSAnc3BhcmUnIHdoaWNoIGlzIGRlZmluZWQgYXMgdGhlCj4gPiBTVlNS RVQgYml0IGluIGxhdGVyIGRvY3VtZW50YXRpb24uCj4gCj4gSSdkIHJlYWxseSBwcmVmZXIgdGhh dCB3ZSBkaWQgbm90IGdvIGRvd24gdGhlIGJyb2tlbiByb3V0ZSBvZiBhZGRpbmcKPiBhIHNldCBv ZiAicXVpcmsiIGZsYWdzIC0gbG9vayBhdCB3aGF0IGEgbWVzcyBTREhDSSBoYXMgYmVjb21lIHRo cm91Z2gKPiBhbGxvd2luZyB0aGF0IGtpbmQgb2YgcHJhY3RpY2UuCj4gCj4gSSdkIG11Y2ggcmF0 aGVyIHdlIGZpbmQgYSBzYW5lciBzdHJ1Y3R1cmUgdG8gdGhpcyAtIGFuZCB3ZSBrbm93IHRoYXQK PiB0aGUgaGFyZHdhcmUgaGFzIElEIHJlZ2lzdGVycyBpbiBpdCB3aGljaCBjYW4gYmUgdXNlZCAo c28gZmFyKSB0bwo+IGlkZW50aWZ5IHRoZSBidWdneSBoYXJkd2FyZS4KCkknZCBtdWNoIHByZWZl ciBzb21ldGhpbmcgdGhhdCB3b3VsZCBhbGxvdyBydW50aW1lIGlkZW50aWZpY2F0aW9uIG9mIHRo ZSAKZGV2aWNlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBhY3Rpb25zIHRvIGJlIHRha2VuLiBIb3dl dmVyLCB0aGUgYW1vdW50IG9mIApkb2N1bWVudGF0aW9uIHdlIGhhdmUgb24gdGhlIERXQyBIRE1J IFRYIElQIGNvcmUgKGFuZCB0aGUgYXNzb2NpYXRlZCBQSFkpIGlzIApwcmV0dHkgbGltaXRlZCwg Z2l2ZW4gdGhhdCBTeW5vcHN5cyBkb2Vzbid0IG1ha2UgdGhlIGRvY3VtZW50YXRpb24gYXZhaWxh YmxlIApwdWJsaWNseS4gQ2hhbmdlcyBtYWRlIHRvIHRoZSBJUCBjb3JlIGJ5IGludGVncmF0b3Jz IGNvdWxkIGNvbXBsaWNhdGUgdGhpcyAKZnVydGhlci4gSSdtIHRyeWluZyB0byBnYXRoZXIgYXMg bXVjaCBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZSB0byBtYWtlIGNsZWFuIAp0aGUgY29kZSB1cCwg Zm9yIGluc3RhbmNlIGJ5IHRyeWluZyB0byBpZGVudGlmeSB0aGUgUEhZcyB1c2VkIG9uIHRoZSB2 YXJpb3VzIApwbGF0Zm9ybXMgd2Ugc3VwcG9ydC4gUHJvZ3Jlc3MgaXMgc2xvdyBvbiB0aGF0IGZy b250LCB0aGVyZSBpc24ndCBlbm91Z2ggCmxlYWtlZCBpbmZvcm1hdGlvbiBhdmFpbGFibGUgb25s aW5lIDotKSBJIGhhdmVuJ3QgZ2l2ZW4gdXAgdGhvdWdoLCBidXQgSSdsbCAKbmVlZCBtb3JlIHRp bWUuCgpJIGRvbid0IGxpa2UgcXVpcmtzIG11Y2ggZWl0aGVyLiBUaGV5IGFyZSBob3dldmVyIGFs cmVhZHkgdXNlZCB0b2RheSwgZXZlbiBpZiAKd2UgdHJpZ2dlciB0aGVtIHRocm91Z2ggZGV2X3R5 cGUgaW5zdGVhZCBvZiBxdWlyayBmbGFncy4gVGhpcyBwYXRjaCBjYW1lIGZyb20gCmEgcHJldmlv dXMgdmVyc2lvbiBmb3VuZCBpbiBhIEJTUCB0aGF0IHNpbXBseSBzcHJpbmtsZWQgc2V2ZXJhbCBp ZiAoaGRtaS0KPmRldl90eXBlID09IFJDQVJfSERNSSkgdGhyb3VnaCB0aGUgY29kZS4gRm9yIGlu c3RhbmNlLAoKLQlpZiAoaGRtaS0+ZGV2X3R5cGUgPT0gUkszMjg4X0hETUkpCisJaWYgKGhkbWkt PmRldl90eXBlID09IFJLMzI4OF9IRE1JIHx8IGhkbWktPmRldl90eXBlID09IFJDQVJfSERNSSkK CQlkd19oZG1pX3BoeV9lbmFibGVfc3BhcmUoaGRtaSwgMSk7Cgp3aGljaCBJIHRoaW5rIGlzIHdv cnNlIHRoYW4gZmxhZ3MgYXMgaXQgd291bGQgcXVpY2tseSBkZWdlbmVyYXRlIHRvIHNwYWdoZXR0 aSAKY29kZS4KCkZvciB0aGlzIHNwZWNpZmljIGNhc2UsIHdlJ3ZlIG1hbmFnZWQgdG8gaWRlbnRp ZnkgdGhhdCBvbiBSZW5lc2FzIHBsYXRmb3JtcyAKdGhlIGJpdCBzZXQgYnkgdGhpcyBmdW5jdGlv biBpcyBjYWxsZWQgU1ZTUkVULiBJdHMgdXNhZ2UgaXNuJ3QgY2xlYXIgeWV0LCBidXQgCkkgc3Vz cGVjdCBpdCB0byBjb250cm9sIG9uZSBvZiB0aGUgUEhZIGlucHV0IGNvbnRyb2wgc2lnbmFscywg bGlrZSB0aGUgb3RoZXIgCmJpdHMgaW4gdGhlIHNhbWUgcmVnaXN0ZXIuIEknbSB0cnlpbmcgdG8g Z2V0IG1vcmUgaW5mb3JtYXRpb24gdG8gY2xlYW4gdGhlIAppbXBsZW1lbnRhdGlvbiBmdXJ0aGVy LCBob3BlZnVsbHkgd2l0aCBhIHdheSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgc2lnbmFsIApp cyB1c2VkIGJhc2VkIG9uIFBIWSBpZGVudGlmaWNhdGlvbi4KClRoaXMgaXMgYWxsIHdvcmsgaW4g cHJvZ3Jlc3MsIGFuZCBpZiBhbnlvbmUgaGFzIGFjY2VzcyB0byBhbnkgZG9jdW1lbnRhdGlvbiAK YW5kIGNhbiBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gSSdsbCBiZSBncmF0ZWZ1bC4K Cj4gPiBTaWduZWQtb2ZmLWJ5OiBLaWVyYW4gQmluZ2hhbSA8a2llcmFuLmJpbmdoYW0rcmVuZXNh c0BpZGVhc29uYm9hcmQuY29tPgo+ID4gU2lnbmVkLW9mZi1ieTogTGF1cmVudCBQaW5jaGFydAo+ ID4gPGxhdXJlbnQucGluY2hhcnQrcmVuZXNhc0BpZGVhc29uYm9hcmQuY29tPgo+ID4gLS0tCj4g PiAKPiA+ICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2R3LWhkbWkuYyAgICAgICAgICAgIHwgMTQg KysrKysrLS0tLS0tLS0KPiA+ICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2R3LWhkbWkuaCAgICAg ICAgICAgIHwgIDQgKystLQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9pbXgvZHdfaGRtaS1pbXguYyAg ICAgICAgICAgfCAgMyArLS0KPiA+ICBkcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvZHdfaGRtaS1y b2NrY2hpcC5jIHwgIDIgKy0KPiA+ICBpbmNsdWRlL2RybS9icmlkZ2UvZHdfaGRtaS5oICAgICAg ICAgICAgICAgIHwgMTIgKysrKystLS0tLS0tCj4gPiAgNSBmaWxlcyBjaGFuZ2VkLCAxNSBpbnNl cnRpb25zKCspLCAyMCBkZWxldGlvbnMoLSkKPiA+IAo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9icmlkZ2UvZHctaGRtaS5jCj4gPiBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvZHct aGRtaS5jIGluZGV4IDA2YTQ0YTJjZGYzYi4uMjY2MDcxODU3MjJmCj4gPiAxMDA2NDQKPiA+IC0t LSBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvZHctaGRtaS5jCj4gPiArKysgYi9kcml2ZXJzL2dw dS9kcm0vYnJpZGdlL2R3LWhkbWkuYwo+ID4gQEAgLTExOCw3ICsxMTgsNiBAQCBzdHJ1Y3QgZHdf aGRtaSB7Cj4gPiAgCXN0cnVjdCBkcm1fYnJpZGdlIGJyaWRnZTsKPiA+ICAJc3RydWN0IHBsYXRm b3JtX2RldmljZSAqYXVkaW87Cj4gPiAKPiA+IC0JZW51bSBkd19oZG1pX2RldnR5cGUgZGV2X3R5 cGU7Cj4gPiAgCXN0cnVjdCBkZXZpY2UgKmRldjsKPiA+ICAJc3RydWN0IGNsayAqaXNmcl9jbGs7 Cj4gPiAgCXN0cnVjdCBjbGsgKmlhaGJfY2xrOwo+ID4gQEAgLTg5NiwxMSArODk1LDExIEBAIHN0 YXRpYyB2b2lkIGR3X2hkbWlfcGh5X2VuYWJsZV90bWRzKHN0cnVjdCBkd19oZG1pCj4gPiAqaGRt aSwgdTggZW5hYmxlKQo+ID4gIAkJCSBIRE1JX1BIWV9DT05GMF9FTlRNRFNfTUFTSyk7Cj4gPiAg fQo+ID4gCj4gPiAtc3RhdGljIHZvaWQgZHdfaGRtaV9waHlfZW5hYmxlX3NwYXJlKHN0cnVjdCBk d19oZG1pICpoZG1pLCB1OCBlbmFibGUpCj4gPiArc3RhdGljIHZvaWQgZHdfaGRtaV9waHlfZW5h YmxlX3N2c3JldChzdHJ1Y3QgZHdfaGRtaSAqaGRtaSwgdTggZW5hYmxlKQo+ID4gIHsKPiA+ICAJ aGRtaV9tYXNrX3dyaXRlYihoZG1pLCBlbmFibGUsIEhETUlfUEhZX0NPTkYwLAo+ID4gLQkJCSBI RE1JX1BIWV9DT05GMF9TUEFSRUNUUkxfT0ZGU0VULAo+ID4gLQkJCSBIRE1JX1BIWV9DT05GMF9T UEFSRUNUUkxfTUFTSyk7Cj4gPiArCQkJIEhETUlfUEhZX0NPTkYwX1NWU1JFVF9PRkZTRVQsCj4g PiArCQkJIEhETUlfUEhZX0NPTkYwX1NWU1JFVF9NQVNLKTsKPiA+ICB9Cj4gPiAgCj4gPiAgc3Rh dGljIHZvaWQgZHdfaGRtaV9waHlfZ2VuMl9wZGRxKHN0cnVjdCBkd19oZG1pICpoZG1pLCB1OCBl bmFibGUpCj4gPiBAQCAtMTAzMSw4ICsxMDMwLDggQEAgc3RhdGljIGludCBoZG1pX3BoeV9jb25m aWd1cmUoc3RydWN0IGR3X2hkbWkgKmhkbWksCj4gPiAgCWR3X2hkbWlfcGh5X2dlbjJfdHhwd3Jv bihoZG1pLCAxKTsKPiA+ICAJZHdfaGRtaV9waHlfZ2VuMl9wZGRxKGhkbWksIDApOwo+ID4gCj4g PiAtCWlmIChoZG1pLT5kZXZfdHlwZSA9PSBSSzMyODhfSERNSSkKPiA+IC0JCWR3X2hkbWlfcGh5 X2VuYWJsZV9zcGFyZShoZG1pLCAxKTsKPiA+ICsJaWYgKHBkYXRhLT5xdWlya3MgJiBEV19IRE1J X1FVSVJLX1BIWV9TVlNSRVQpCj4gPiArCQlkd19oZG1pX3BoeV9lbmFibGVfc3ZzcmV0KGhkbWks IDEpOwo+IAo+IElmIHdlIGdldCBhIHByb3BlciBzcGxpdCBiZXR3ZWVuIHRoZSBlbmNvZGVyIGFu ZCB0aGUgUEhZLCB0aGlzIHNob3VsZCBiZQo+IGRlYWx0IHdpdGggYXQgdGhlIFBIWSBzaWRlIG9m IHRoZSBkcml2ZXIuCgpUaGF0J3MgcG9zc2libGUsIGFuZCBzb21lIG90aGVyIFBIWS1yZWxhdGVk IHNldHVwIGNvZGUgbWlnaHQgYmUgYmV0dGVyIHBsYWNlZCAKaW4gdGhlIFBIWSBzaWRlIGFzIHdl bGwuIE15IHByb2JsZW0sIGFzIGV4cGxhaW5lZCBhYm92ZSwgaXMgdGhhdCBJIGRvbid0IGhhdmUg CmVub3VnaCBpbmZvcm1hdGlvbiB5ZXQgdG8gZGVzaWduIGEgcGVyZmVjdCBBUEkuIEkgdGhpbmsg dGhpcyBwYXRjaCBpcyBhIGdvb2QgCnN0ZXAgZm9yd2FyZCwgYnV0IGl0IHNob3VsZCBub3QgYmUg dGhlIGxhc3Qgb25lLiBJIHdpc2ggSSBjb3VsZCBzcGVuZCBtb3JlIAp0aW1lIHdyaXRpbmcgY2xl YW4gY29kZSBpbnN0ZWFkIG9mIHRyeWluZyB0byByZXZlcnNlIGVuZ2luZWVyIHRoZSBiZWhhdmlv dXIgb2YgCnRoZSBQSFkgOi0pCgo+ID4gIAkvKldhaXQgZm9yIFBIWSBQTEwgbG9jayAqLwo+ID4g IAltc2VjID0gNTsKPiA+IAo+ID4gQEAgLTEzNDgsNyArMTM0Nyw3IEBAIHN0YXRpYyB2b2lkIGR3 X2hkbWlfY2xlYXJfb3ZlcmZsb3coc3RydWN0IGR3X2hkbWkKPiA+ICpoZG1pKQo+ID4gIAloZG1p X3dyaXRlYihoZG1pLCAodTgpfkhETUlfTUNfU1dSU1RaX1RNRFNTV1JTVF9SRVEsIEhETUlfTUNf U1dSU1RaKTsKPiA+ICAJCj4gPiAgCXZhbCA9IGhkbWlfcmVhZGIoaGRtaSwgSERNSV9GQ19JTlZJ RENPTkYpOwo+ID4gLQlpZiAoaGRtaS0+ZGV2X3R5cGUgPT0gSU1YNkRMX0hETUkpIHsKPiA+ICsJ aWYgKGhkbWktPnBsYXRfZGF0YS0+cXVpcmtzICYgRFdfSERNSV9RVUlSS19GQ19JTlZJRENPTkYp IHsKPiA+ICAJCWhkbWlfd3JpdGViKGhkbWksIHZhbCwgSERNSV9GQ19JTlZJRENPTkYpOwo+ID4g IAkJcmV0dXJuOwo+ID4gIAl9Cj4gCj4gVGhpcyBpcyBhIGJ1ZyBmb3VuZCBvbiBpTVg2REwgdmVy c2lvbnMgb2YgdGhlIElQIC0gSSBkb24ndCBoYXZlIGEgNkRMCj4gYm9hcmQgcG93ZXJlZCB1cCBh dCB0aGUgbW9tZW50IHRvIGdyYWIgaXRzIHJldmlzaW9uIGluZm9ybWF0aW9uLCBidXQKPiBpdCB3 b3VsZCBiZSBuaWNlIHRvIG1ha2UgdGhhdCBjb25kaXRpb25hbCBvbiB0aGUgcmV2aXNpb24uICBG cm9tIHdoYXQKPiBJIGdhdGhlciwgaXQncyBhIHdvcmthcm91bmQgaXNzdWVkIGJ5IFN5bm9wc2lz IHJhdGhlciB0aGFuIHNwZWNpZmljCj4gdG8gdGhlIChleClGU0wgaW1wbGVtZW50YXRpb24uCgpE V19IRE1JX1FVSVJLX0ZDX0lOVklEQ09ORiBpcyBpbmRlZWQgYSBiYWQgbmFtZSwgSSdsbCBmaXgg dGhhdC4KCkRvIHlvdSBrbm93IHdoeSB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIHdyaXRlIHRvIHRo ZSBIRE1JX0ZDX0lOVklEQ09ORiByZWdpc3RlciAKZm91ciB0aW1lcyBpbiB0aGUgbm9ybWFsIGNh c2UsIGFuZCBvbmNlIG9ubHkgZm9yIElNWDZETCA/CgotLSAKUmVnYXJkcywKCkxhdXJlbnQgUGlu Y2hhcnQKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRy aS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRw czovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=