From mboxrd@z Thu Jan 1 00:00:00 1970 From: Russell King - ARM Linux admin Subject: Re: [EXT] Re: [PATCH] i2c: imx: Defer probing if EDMA not available Date: Wed, 11 Dec 2019 11:42:30 +0000 Message-ID: <20191211114230.GC25745@shell.armlinux.org.uk> References: <20191127071136.5240-1-peng.ma@nxp.com> <20191128100613.GI25745@shell.armlinux.org.uk> <20191211104347.GA25745@shell.armlinux.org.uk> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Return-path: Content-Disposition: inline In-Reply-To: Sender: linux-kernel-owner@vger.kernel.org To: Peng Ma Cc: "shawnguo@kernel.org" , "s.hauer@pengutronix.de" , "linux-kernel@vger.kernel.org" , "linux@rempel-privat.de" , dl-linux-imx , "kernel@pengutronix.de" , "festevam@gmail.com" , "linux-arm-kernel@lists.infradead.org" , "linux-i2c@vger.kernel.org" List-Id: linux-i2c@vger.kernel.org On Wed, Dec 11, 2019 at 11:22:00AM +0000, Peng Ma wrote: > > > >-----Original Message----- > >From: Russell King - ARM Linux admin > >Sent: 2019年12月11日 18:44 > >To: Peng Ma > >Cc: festevam@gmail.com; s.hauer@pengutronix.de; > >linux-kernel@vger.kernel.org; linux@rempel-privat.de; dl-linux-imx > >; kernel@pengutronix.de; shawnguo@kernel.org; > >linux-arm-kernel@lists.infradead.org; linux-i2c@vger.kernel.org > >Subject: Re: [EXT] Re: [PATCH] i2c: imx: Defer probing if EDMA not available > > > >Caution: EXT Email > > > >On Wed, Dec 11, 2019 at 10:25:26AM +0000, Peng Ma wrote: > >> Hi Russell, > >> > >> I am sorry to reply late, thanks for your patient reminding, Please > >> see my comments inline. > >> > >> Best Regards, > >> Peng > >> >-----Original Message----- > >> >From: Russell King - ARM Linux admin > >> >Sent: 2019年11月28日 18:06 > >> >To: Peng Ma > >> >Cc: linux@rempel-privat.de; kernel@pengutronix.de; > >> >shawnguo@kernel.org; s.hauer@pengutronix.de; > >> >linux-kernel@vger.kernel.org; dl-linux-imx ; > >> >festevam@gmail.com; linux-arm-kernel@lists.infradead.org; > >> >linux-i2c@vger.kernel.org > >> >Subject: [EXT] Re: [PATCH] i2c: imx: Defer probing if EDMA not > >> >available > >> > > >> >Caution: EXT Email > >> > > >> >On Wed, Nov 27, 2019 at 07:12:09AM +0000, Peng Ma wrote: > >> >> EDMA may be not available or defered due to dependencies on other > >> >> modules, If these scenarios is encountered, we should defer probing. > >> > > >> >This has been tried before in this form, and it causes regressions. > >> > > >> >> Signed-off-by: Peng Ma > >> >> --- > >> >> drivers/i2c/busses/i2c-imx.c | 16 +++++++++++----- > >> >> 1 file changed, 11 insertions(+), 5 deletions(-) > >> >> > >> >> diff --git a/drivers/i2c/busses/i2c-imx.c > >> >> b/drivers/i2c/busses/i2c-imx.c index 40111a3..c2b0693 100644 > >> >> --- a/drivers/i2c/busses/i2c-imx.c > >> >> +++ b/drivers/i2c/busses/i2c-imx.c > >> >> @@ -369,8 +369,8 @@ static void i2c_imx_reset_regs(struct > >> >> imx_i2c_struct *i2c_imx) } > >> >> > >> >> /* Functions for DMA support */ > >> >> -static void i2c_imx_dma_request(struct imx_i2c_struct *i2c_imx, > >> >> - dma_addr_t > >> >phy_addr) > >> >> +static int i2c_imx_dma_request(struct imx_i2c_struct *i2c_imx, > >> >> + dma_addr_t phy_addr) > >> >> { > >> >> struct imx_i2c_dma *dma; > >> >> struct dma_slave_config dma_sconfig; @@ -379,7 +379,7 @@ > >> >> static void i2c_imx_dma_request(struct imx_i2c_struct *i2c_imx, > >> >> > >> >> dma = devm_kzalloc(dev, sizeof(*dma), GFP_KERNEL); > >> >> if (!dma) > >> >> - return; > >> >> + return -ENOMEM; > >> >> > >> >> dma->chan_tx = dma_request_chan(dev, "tx"); > >> >> if (IS_ERR(dma->chan_tx)) { > >> >> @@ -424,7 +424,7 @@ static void i2c_imx_dma_request(struct > >> >imx_i2c_struct *i2c_imx, > >> >> dev_info(dev, "using %s (tx) and %s (rx) for DMA transfers\n", > >> >> dma_chan_name(dma->chan_tx), > >> >> dma_chan_name(dma->chan_rx)); > >> >> > >> >> - return; > >> >> + return 0; > >> >> > >> >> fail_rx: > >> >> dma_release_channel(dma->chan_rx); > >> >> @@ -432,6 +432,8 @@ static void i2c_imx_dma_request(struct > >> >imx_i2c_struct *i2c_imx, > >> >> dma_release_channel(dma->chan_tx); > >> >> fail_al: > >> >> devm_kfree(dev, dma); > >> >> + > >> >> + return ret; > >> > > >> >Some platforms don't have EDMA. Doesn't this force everyone who > >> >wants I2C to have DMA? The last attempt at this had: > >> > > >> > /* return successfully if there is no dma support */ > >> > return ret == -ENODEV ? 0 : ret; > >> > > >> >here because of exactly this. > >> > > >> >> } > >> >> > >> >> static void i2c_imx_dma_callback(void *arg) @@ -1605,10 +1607,14 > >> >> @@ static int i2c_imx_probe(struct platform_device *pdev) > >> >> dev_info(&i2c_imx->adapter.dev, "IMX I2C adapter > >> >> registered\n"); > >> >> > >> >> /* Init DMA config if supported */ > >> >> - i2c_imx_dma_request(i2c_imx, phy_addr); > >> >> + ret = i2c_imx_dma_request(i2c_imx, phy_addr); > >> >> + if (ret == -EPROBE_DEFER) > >> >> + goto i2c_adapter_remove; > >> > > >> >This happens _after_ the adapter has been published to the rest of the > >kernel. > >> >Claiming resources after publication is racy - the adapter may be in > >> >use by a request at this point. Secondly, there's been problems with > >> >this causing regressions when EDMA is built as a module and i2c-imx is > >built-in. > >> > > >> >See e8c220fac415 ("Revert "i2c: imx: improve the error handling in > >> >i2c_imx_dma_request()"") when exactly what you're proposing was tried > >> >and ended up having to be reverted. > >> > > >> >AFAIK nothing has changed since, so merely reinstating the known to > >> >be broken code, thereby reintroducing the same (and more) problems, > >> >isn't going to be acceptable. > >> > > >> >Sorry, but this gets a big NAK from me. > >> > > >> [Peng Ma] I saw the revert commit e8c220fac415 and understand your > >concerns. > >> I scan the i2c-imx.c driver, All platforms that use i2c driver and > >> support dma use an eDMA engine, So I change the code(compare with last > >patch) as follows, please review and give me your precious comments. > >> Thanks very much. > >> > >> diff --git a/drivers/i2c/busses/i2c-imx.c > >> b/drivers/i2c/busses/i2c-imx.c index 12f7934fddb4..6cafee52dd67 100644 > >> --- a/drivers/i2c/busses/i2c-imx.c > >> +++ b/drivers/i2c/busses/i2c-imx.c > >> @@ -1605,8 +1605,11 @@ static int i2c_imx_probe(struct platform_device > >> *pdev) > >> > >> /* Init DMA config if supported */ > >> ret = i2c_imx_dma_request(i2c_imx, phy_addr); > >> - if (ret == -EPROBE_DEFER) > >> + if (ret == -EPROBE_DEFER) { > >> +#if IS_BUILTIN(CONFIG_FSL_EDMA) > >> goto i2c_adapter_remove; > >> +#endif > >> + } > > > >You haven't understood _why_ the problem occurs, you're just attempting to > >patch around it. You're hacking the code, rather than engineering the code. > > > >The infinite deferred probe occurs because: > > > >- i2c-imx is attempted to be probed. > >- i2c-imx sets up the hardware, and then calls > > i2c_add_numbered_adapter() > >- i2c_add_numbered_adapter() publishes the bus to the world, and then > > searches DT for any children to create - and it finds some and > > creates them. > >- the children devices are matched to their drivers, which bind. This > > triggers a deferred probe to be scheduled. > >- back in the i2c-imx driver, we get to i2c_imx_dma_request(), which > > fails, and you return -EPROBE_DEFER. > >- the i2c-imx driver probe actions are unwound, and probe exits. > >- the driver core processes the deferred probe request, finds the > > i2c-imx device(s) on the deferred probe list, and attempts to > > probe them. Goto the top of this list. > > > [Peng Ma] Thanks for your quick reply, No, I don't think so, when first,second,third...... time probe failed, the i2c_del_adapter will be called(it will remove the i2c children device). I think if We build-in EDMA, after EDMA probe successful, the deffer probe of i2c will probe with no return -EPROBE_DEFER. Yes, i2c_del_adapter will be called, but that is neither here nor there. The deferred probe is triggered by _any_ driver binding. The facts are: i2c_add_numbered_adapter() creates devices. These new devices get bound to drivers. As soon as any one of those devices binds to a driver, deferred probing is triggered. When i2c_imx_probe() returns -EPROBE_DEFER, it will be added to the list of devices to be re-probed by the deferred probing. > So you say " Goto the top of this list " just i2c drive probe failed with i2c_imx_dma_request() return -EPROBE_DEFER, > If the EDMA build-in and probe successful this case not happened. Now I am worried about EDMA failed to probe, your case is correct. You are assuming that EDMA has successfully probed. What if EDMA hasn't been probed yet, because it has been deferred for some other reason (e.g. a clock)? The fact is, the way i2c-imx is structured at present, it is unsafe to propagate the EPROBE_DEFER error code from i2c_imx_dma_request() under ANY CIRCUMSTANCES. > >If, for whatever reason, i2c_imx_dma_request() ever returns -EPROBE_DEFER, > >the above loop WILL happen. > > > >The FUNDAMENTAL rule of kernel programming is that you do NOT publish > >before you have completed setup. i2c-imx violates that rule as the probe > >function is ordered at present. > > > [Peng Ma] Yes, I agree, but kernel provide the deffer probe and for the platform devices we don't decide who probe first. So, because the kernel provides a facility, you think it's fine to create infinite loops using it? > >i2c-imx has been written for i2c_imx_dma_request() to be safe to call after the > >device has been published, but with the current probe function order, it is > >unsafe to propagate the EPROBE_DEFER return value for the reason above. > >For the reason the original attempt got reverted. > > > >So, if you want to do this (and yes, I'd also encourage it to be conditional on > >EDMA being built-in, as I2C is commonly used as a way to get at RTCs, which > >are read before kernel modules can be loaded) then you MUST move > >i2c_imx_dma_request() before > >i2c_add_numbered_adapter() to avoid the infinite loop. > > > [Peng Ma] To do this, the i2c devices not probe and i2c adapter not register before edma probe. Which is the correct behaviour, rather than having the kernel cycle through creating i2c devices, probing i2c drivers, tearing down the i2c devices and repeating endlessly. Until you see this, sorry, no, you can't propagate the return value from i2c_imx_dma_request(). We've tried it, it's caused regressions, and a problem has been identified that you don't seem to be willing to recognise _as_ a serious problem with the approach you're trying to re-implement. -- RMK's Patch system: https://www.armlinux.org.uk/developer/patches/ FTTC broadband for 0.8mile line in suburbia: sync at 12.1Mbps down 622kbps up According to speedtest.net: 11.9Mbps down 500kbps up 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=-8.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 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 B61A7C43603 for ; Wed, 11 Dec 2019 11:43:03 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7B835214AF for ; Wed, 11 Dec 2019 11:43:03 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="rPCLC3B4"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=armlinux.org.uk header.i=@armlinux.org.uk header.b="eGxKFcH/" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7B835214AF Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=armlinux.org.uk Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=Ias2A40He8pqtbrazoTLbdLQGcb7SX4lM7rRI4bUDFE=; b=rPCLC3B4dDoG25 LXtYS3k31rfaQFyzEhwIhpRlJWkoxnasRK3FDBoyWGR1okI19hprF7fLwKVAG20Alav/toRHZb4iK sJ7acAZNDEKxPtuizzS3lRuNS7vFi06v6Bsl9e70Qv0W68ioRzQ7NKyhqqpk9LToYFI9r9vS4f7sD WKFChMHHWsaGepT5/OWiZ2CxwWzKorZqMd/oAY4K0hQS6ebDWeZqhCGdhvz7cZdC2IWhVcRUpuAZy NbkvoSkeiyp8yCd4ggi/lohUQ+dx3wFQywh4ZPFCVYSKjGJuNa5Yy4COfVjGgb09bx0yYAX1pNuyp zk1XicZeaS5TDHYmVy7A==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1if0OO-0006ke-R6; Wed, 11 Dec 2019 11:42:56 +0000 Received: from pandora.armlinux.org.uk ([2001:4d48:ad52:3201:214:fdff:fe10:1be6]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1if0OJ-0006jr-SP for linux-arm-kernel@lists.infradead.org; Wed, 11 Dec 2019 11:42:54 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=armlinux.org.uk; s=pandora-2019; h=Sender:In-Reply-To: Content-Transfer-Encoding:Content-Type:MIME-Version:References:Message-ID: Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=upVO43a9Ci5B5se9s37thb0usXFTi2WSd9CirMnPlUI=; b=eGxKFcH/4423IzJF91pk4eaie adHLOhIkDXN9vgQoAlTHZqRQe8mjyy7W1Jg7K/sZ19MzI7eml0mybh4WxnpA0Bkn/H8VjWN/8stZz 3lridy+yMPYPiYuKjL1uwaX7V24i3QwpQUxWckpE7C/ACtZoXqA5iBN6Y12HOxK+jcPcqIQdNEeKd aQrEPOYPquoxrRtowk8mpWLC5wh/y0AlZ3HVfqvyyfWEzhOhbhEeDG9L5fBPkgC+bZ+fdNzHGkLzt /Vem5a8+pXG9vyFa2BfVj/dx5YjoNEgSzbFx0QE5QB3bp8yUlQvW7gnO7ueSHm1hCbDTBx562XZWb LmXzo2p3g==; Received: from shell.armlinux.org.uk ([fd8f:7570:feb6:1:5054:ff:fe00:4ec]:51518) by pandora.armlinux.org.uk with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.90_1) (envelope-from ) id 1if0O2-00088j-1L; Wed, 11 Dec 2019 11:42:34 +0000 Received: from linux by shell.armlinux.org.uk with local (Exim 4.92) (envelope-from ) id 1if0Ny-0005pI-I4; Wed, 11 Dec 2019 11:42:30 +0000 Date: Wed, 11 Dec 2019 11:42:30 +0000 From: Russell King - ARM Linux admin To: Peng Ma Subject: Re: [EXT] Re: [PATCH] i2c: imx: Defer probing if EDMA not available Message-ID: <20191211114230.GC25745@shell.armlinux.org.uk> References: <20191127071136.5240-1-peng.ma@nxp.com> <20191128100613.GI25745@shell.armlinux.org.uk> <20191211104347.GA25745@shell.armlinux.org.uk> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20191211_034252_248028_4C7B2251 X-CRM114-Status: GOOD ( 38.35 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "festevam@gmail.com" , "s.hauer@pengutronix.de" , "linux-kernel@vger.kernel.org" , "linux@rempel-privat.de" , dl-linux-imx , "kernel@pengutronix.de" , "shawnguo@kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-i2c@vger.kernel.org" Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gV2VkLCBEZWMgMTEsIDIwMTkgYXQgMTE6MjI6MDBBTSArMDAwMCwgUGVuZyBNYSB3cm90ZToK PiAKPiAKPiA+LS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0KPiA+RnJvbTogUnVzc2VsbCBLaW5n IC0gQVJNIExpbnV4IGFkbWluIDxsaW51eEBhcm1saW51eC5vcmcudWs+Cj4gPlNlbnQ6IDIwMTnl ubQxMuaciDEx5pelIDE4OjQ0Cj4gPlRvOiBQZW5nIE1hIDxwZW5nLm1hQG54cC5jb20+Cj4gPkNj OiBmZXN0ZXZhbUBnbWFpbC5jb207IHMuaGF1ZXJAcGVuZ3V0cm9uaXguZGU7Cj4gPmxpbnV4LWtl cm5lbEB2Z2VyLmtlcm5lbC5vcmc7IGxpbnV4QHJlbXBlbC1wcml2YXQuZGU7IGRsLWxpbnV4LWlt eAo+ID48bGludXgtaW14QG54cC5jb20+OyBrZXJuZWxAcGVuZ3V0cm9uaXguZGU7IHNoYXduZ3Vv QGtlcm5lbC5vcmc7Cj4gPmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZzsgbGlu dXgtaTJjQHZnZXIua2VybmVsLm9yZwo+ID5TdWJqZWN0OiBSZTogW0VYVF0gUmU6IFtQQVRDSF0g aTJjOiBpbXg6IERlZmVyIHByb2JpbmcgaWYgRURNQSBub3QgYXZhaWxhYmxlCj4gPgo+ID5DYXV0 aW9uOiBFWFQgRW1haWwKPiA+Cj4gPk9uIFdlZCwgRGVjIDExLCAyMDE5IGF0IDEwOjI1OjI2QU0g KzAwMDAsIFBlbmcgTWEgd3JvdGU6Cj4gPj4gSGkgUnVzc2VsbCwKPiA+Pgo+ID4+IEkgYW0gc29y cnkgdG8gcmVwbHkgbGF0ZSwgdGhhbmtzIGZvciB5b3VyIHBhdGllbnQgcmVtaW5kaW5nLCBQbGVh c2UKPiA+PiBzZWUgbXkgY29tbWVudHMgaW5saW5lLgo+ID4+Cj4gPj4gQmVzdCBSZWdhcmRzLAo+ ID4+IFBlbmcKPiA+PiA+LS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0KPiA+PiA+RnJvbTogUnVz c2VsbCBLaW5nIC0gQVJNIExpbnV4IGFkbWluIDxsaW51eEBhcm1saW51eC5vcmcudWs+Cj4gPj4g PlNlbnQ6IDIwMTnlubQxMeaciDI45pelIDE4OjA2Cj4gPj4gPlRvOiBQZW5nIE1hIDxwZW5nLm1h QG54cC5jb20+Cj4gPj4gPkNjOiBsaW51eEByZW1wZWwtcHJpdmF0LmRlOyBrZXJuZWxAcGVuZ3V0 cm9uaXguZGU7Cj4gPj4gPnNoYXduZ3VvQGtlcm5lbC5vcmc7IHMuaGF1ZXJAcGVuZ3V0cm9uaXgu ZGU7Cj4gPj4gPmxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc7IGRsLWxpbnV4LWlteCA8bGlu dXgtaW14QG54cC5jb20+Owo+ID4+ID5mZXN0ZXZhbUBnbWFpbC5jb207IGxpbnV4LWFybS1rZXJu ZWxAbGlzdHMuaW5mcmFkZWFkLm9yZzsKPiA+PiA+bGludXgtaTJjQHZnZXIua2VybmVsLm9yZwo+ ID4+ID5TdWJqZWN0OiBbRVhUXSBSZTogW1BBVENIXSBpMmM6IGlteDogRGVmZXIgcHJvYmluZyBp ZiBFRE1BIG5vdAo+ID4+ID5hdmFpbGFibGUKPiA+PiA+Cj4gPj4gPkNhdXRpb246IEVYVCBFbWFp bAo+ID4+ID4KPiA+PiA+T24gV2VkLCBOb3YgMjcsIDIwMTkgYXQgMDc6MTI6MDlBTSArMDAwMCwg UGVuZyBNYSB3cm90ZToKPiA+PiA+PiBFRE1BIG1heSBiZSBub3QgYXZhaWxhYmxlIG9yIGRlZmVy ZWQgZHVlIHRvIGRlcGVuZGVuY2llcyBvbiBvdGhlcgo+ID4+ID4+IG1vZHVsZXMsIElmIHRoZXNl IHNjZW5hcmlvcyBpcyBlbmNvdW50ZXJlZCwgd2Ugc2hvdWxkIGRlZmVyIHByb2JpbmcuCj4gPj4g Pgo+ID4+ID5UaGlzIGhhcyBiZWVuIHRyaWVkIGJlZm9yZSBpbiB0aGlzIGZvcm0sIGFuZCBpdCBj YXVzZXMgcmVncmVzc2lvbnMuCj4gPj4gPgo+ID4+ID4+IFNpZ25lZC1vZmYtYnk6IFBlbmcgTWEg PHBlbmcubWFAbnhwLmNvbT4KPiA+PiA+PiAtLS0KPiA+PiA+PiAgZHJpdmVycy9pMmMvYnVzc2Vz L2kyYy1pbXguYyB8IDE2ICsrKysrKysrKysrLS0tLS0KPiA+PiA+PiAgMSBmaWxlIGNoYW5nZWQs IDExIGluc2VydGlvbnMoKyksIDUgZGVsZXRpb25zKC0pCj4gPj4gPj4KPiA+PiA+PiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pbXguYwo+ID4+ID4+IGIvZHJpdmVycy9pMmMv YnVzc2VzL2kyYy1pbXguYyBpbmRleCA0MDExMWEzLi5jMmIwNjkzIDEwMDY0NAo+ID4+ID4+IC0t LSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW14LmMKPiA+PiA+PiArKysgYi9kcml2ZXJzL2ky Yy9idXNzZXMvaTJjLWlteC5jCj4gPj4gPj4gQEAgLTM2OSw4ICszNjksOCBAQCBzdGF0aWMgdm9p ZCBpMmNfaW14X3Jlc2V0X3JlZ3Moc3RydWN0Cj4gPj4gPj4gaW14X2kyY19zdHJ1Y3QgKmkyY19p bXgpICB9Cj4gPj4gPj4KPiA+PiA+PiAgLyogRnVuY3Rpb25zIGZvciBETUEgc3VwcG9ydCAqLwo+ ID4+ID4+IC1zdGF0aWMgdm9pZCBpMmNfaW14X2RtYV9yZXF1ZXN0KHN0cnVjdCBpbXhfaTJjX3N0 cnVjdCAqaTJjX2lteCwKPiA+PiA+PiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgZG1hX2FkZHJfdAo+ID4+ID5waHlfYWRkcikKPiA+PiA+PiArc3RhdGljIGlu dCBpMmNfaW14X2RtYV9yZXF1ZXN0KHN0cnVjdCBpbXhfaTJjX3N0cnVjdCAqaTJjX2lteCwKPiA+ PiA+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtYV9hZGRyX3QgcGh5X2FkZHIpCj4g Pj4gPj4gIHsKPiA+PiA+PiAgICAgICBzdHJ1Y3QgaW14X2kyY19kbWEgKmRtYTsKPiA+PiA+PiAg ICAgICBzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyBkbWFfc2NvbmZpZzsgQEAgLTM3OSw3ICszNzks NyBAQAo+ID4+ID4+IHN0YXRpYyB2b2lkIGkyY19pbXhfZG1hX3JlcXVlc3Qoc3RydWN0IGlteF9p MmNfc3RydWN0ICppMmNfaW14LAo+ID4+ID4+Cj4gPj4gPj4gICAgICAgZG1hID0gZGV2bV9remFs bG9jKGRldiwgc2l6ZW9mKCpkbWEpLCBHRlBfS0VSTkVMKTsKPiA+PiA+PiAgICAgICBpZiAoIWRt YSkKPiA+PiA+PiAtICAgICAgICAgICAgIHJldHVybjsKPiA+PiA+PiArICAgICAgICAgICAgIHJl dHVybiAtRU5PTUVNOwo+ID4+ID4+Cj4gPj4gPj4gICAgICAgZG1hLT5jaGFuX3R4ID0gZG1hX3Jl cXVlc3RfY2hhbihkZXYsICJ0eCIpOwo+ID4+ID4+ICAgICAgIGlmIChJU19FUlIoZG1hLT5jaGFu X3R4KSkgewo+ID4+ID4+IEBAIC00MjQsNyArNDI0LDcgQEAgc3RhdGljIHZvaWQgaTJjX2lteF9k bWFfcmVxdWVzdChzdHJ1Y3QKPiA+PiA+aW14X2kyY19zdHJ1Y3QgKmkyY19pbXgsCj4gPj4gPj4g ICAgICAgZGV2X2luZm8oZGV2LCAidXNpbmcgJXMgKHR4KSBhbmQgJXMgKHJ4KSBmb3IgRE1BIHRy YW5zZmVyc1xuIiwKPiA+PiA+PiAgICAgICAgICAgICAgIGRtYV9jaGFuX25hbWUoZG1hLT5jaGFu X3R4KSwKPiA+PiA+PiBkbWFfY2hhbl9uYW1lKGRtYS0+Y2hhbl9yeCkpOwo+ID4+ID4+Cj4gPj4g Pj4gLSAgICAgcmV0dXJuOwo+ID4+ID4+ICsgICAgIHJldHVybiAwOwo+ID4+ID4+Cj4gPj4gPj4g IGZhaWxfcng6Cj4gPj4gPj4gICAgICAgZG1hX3JlbGVhc2VfY2hhbm5lbChkbWEtPmNoYW5fcngp Owo+ID4+ID4+IEBAIC00MzIsNiArNDMyLDggQEAgc3RhdGljIHZvaWQgaTJjX2lteF9kbWFfcmVx dWVzdChzdHJ1Y3QKPiA+PiA+aW14X2kyY19zdHJ1Y3QgKmkyY19pbXgsCj4gPj4gPj4gICAgICAg ZG1hX3JlbGVhc2VfY2hhbm5lbChkbWEtPmNoYW5fdHgpOwo+ID4+ID4+ICBmYWlsX2FsOgo+ID4+ ID4+ICAgICAgIGRldm1fa2ZyZWUoZGV2LCBkbWEpOwo+ID4+ID4+ICsKPiA+PiA+PiArICAgICBy ZXR1cm4gcmV0Owo+ID4+ID4KPiA+PiA+U29tZSBwbGF0Zm9ybXMgZG9uJ3QgaGF2ZSBFRE1BLiAg RG9lc24ndCB0aGlzIGZvcmNlIGV2ZXJ5b25lIHdobwo+ID4+ID53YW50cyBJMkMgdG8gaGF2ZSBE TUE/ICBUaGUgbGFzdCBhdHRlbXB0IGF0IHRoaXMgaGFkOgo+ID4+ID4KPiA+PiA+ICAgICAgICAv KiByZXR1cm4gc3VjY2Vzc2Z1bGx5IGlmIHRoZXJlIGlzIG5vIGRtYSBzdXBwb3J0ICovCj4gPj4g PiAgICAgICAgcmV0dXJuIHJldCA9PSAtRU5PREVWID8gMCA6IHJldDsKPiA+PiA+Cj4gPj4gPmhl cmUgYmVjYXVzZSBvZiBleGFjdGx5IHRoaXMuCj4gPj4gPgo+ID4+ID4+ICB9Cj4gPj4gPj4KPiA+ PiA+PiAgc3RhdGljIHZvaWQgaTJjX2lteF9kbWFfY2FsbGJhY2sodm9pZCAqYXJnKSBAQCAtMTYw NSwxMCArMTYwNywxNAo+ID4+ID4+IEBAIHN0YXRpYyBpbnQgaTJjX2lteF9wcm9iZShzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ID4+ID4+ICAgICAgIGRldl9pbmZvKCZpMmNfaW14LT5h ZGFwdGVyLmRldiwgIklNWCBJMkMgYWRhcHRlcgo+ID4+ID4+IHJlZ2lzdGVyZWRcbiIpOwo+ID4+ ID4+Cj4gPj4gPj4gICAgICAgLyogSW5pdCBETUEgY29uZmlnIGlmIHN1cHBvcnRlZCAqLwo+ID4+ ID4+IC0gICAgIGkyY19pbXhfZG1hX3JlcXVlc3QoaTJjX2lteCwgcGh5X2FkZHIpOwo+ID4+ID4+ ICsgICAgIHJldCA9IGkyY19pbXhfZG1hX3JlcXVlc3QoaTJjX2lteCwgcGh5X2FkZHIpOwo+ID4+ ID4+ICsgICAgIGlmIChyZXQgPT0gLUVQUk9CRV9ERUZFUikKPiA+PiA+PiArICAgICAgICAgICAg IGdvdG8gaTJjX2FkYXB0ZXJfcmVtb3ZlOwo+ID4+ID4KPiA+PiA+VGhpcyBoYXBwZW5zIF9hZnRl cl8gdGhlIGFkYXB0ZXIgaGFzIGJlZW4gcHVibGlzaGVkIHRvIHRoZSByZXN0IG9mIHRoZQo+ID5r ZXJuZWwuCj4gPj4gPkNsYWltaW5nIHJlc291cmNlcyBhZnRlciBwdWJsaWNhdGlvbiBpcyByYWN5 IC0gdGhlIGFkYXB0ZXIgbWF5IGJlIGluCj4gPj4gPnVzZSBieSBhIHJlcXVlc3QgYXQgdGhpcyBw b2ludC4gIFNlY29uZGx5LCB0aGVyZSdzIGJlZW4gcHJvYmxlbXMgd2l0aAo+ID4+ID50aGlzIGNh dXNpbmcgcmVncmVzc2lvbnMgd2hlbiBFRE1BIGlzIGJ1aWx0IGFzIGEgbW9kdWxlIGFuZCBpMmMt aW14IGlzCj4gPmJ1aWx0LWluLgo+ID4+ID4KPiA+PiA+U2VlIGU4YzIyMGZhYzQxNSAoIlJldmVy dCAiaTJjOiBpbXg6IGltcHJvdmUgdGhlIGVycm9yIGhhbmRsaW5nIGluCj4gPj4gPmkyY19pbXhf ZG1hX3JlcXVlc3QoKSIiKSB3aGVuIGV4YWN0bHkgd2hhdCB5b3UncmUgcHJvcG9zaW5nIHdhcyB0 cmllZAo+ID4+ID5hbmQgZW5kZWQgdXAgaGF2aW5nIHRvIGJlIHJldmVydGVkLgo+ID4+ID4KPiA+ PiA+QUZBSUsgbm90aGluZyBoYXMgY2hhbmdlZCBzaW5jZSwgc28gbWVyZWx5IHJlaW5zdGF0aW5n IHRoZSBrbm93biB0bwo+ID4+ID5iZSBicm9rZW4gY29kZSwgdGhlcmVieSByZWludHJvZHVjaW5n IHRoZSBzYW1lIChhbmQgbW9yZSkgcHJvYmxlbXMsCj4gPj4gPmlzbid0IGdvaW5nIHRvIGJlIGFj Y2VwdGFibGUuCj4gPj4gPgo+ID4+ID5Tb3JyeSwgYnV0IHRoaXMgZ2V0cyBhIGJpZyBOQUsgZnJv bSBtZS4KPiA+PiA+Cj4gPj4gW1BlbmcgTWFdIEkgc2F3IHRoZSByZXZlcnQgY29tbWl0IGU4YzIy MGZhYzQxNSBhbmQgdW5kZXJzdGFuZCB5b3VyCj4gPmNvbmNlcm5zLgo+ID4+IEkgc2NhbiB0aGUg aTJjLWlteC5jIGRyaXZlciwgQWxsIHBsYXRmb3JtcyB0aGF0IHVzZSBpMmMgZHJpdmVyIGFuZAo+ ID4+IHN1cHBvcnQgZG1hIHVzZSBhbiBlRE1BIGVuZ2luZSwgU28gSSBjaGFuZ2UgdGhlIGNvZGUo Y29tcGFyZSB3aXRoIGxhc3QKPiA+cGF0Y2gpIGFzIGZvbGxvd3MsIHBsZWFzZSByZXZpZXcgYW5k IGdpdmUgbWUgeW91ciBwcmVjaW91cyBjb21tZW50cy4KPiA+PiBUaGFua3MgdmVyeSBtdWNoLgo+ ID4+Cj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW14LmMKPiA+PiBi L2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW14LmMgaW5kZXggMTJmNzkzNGZkZGI0Li42Y2FmZWU1 MmRkNjcgMTAwNjQ0Cj4gPj4gLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pbXguYwo+ID4+ ICsrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW14LmMKPiA+PiBAQCAtMTYwNSw4ICsxNjA1 LDExIEBAIHN0YXRpYyBpbnQgaTJjX2lteF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCj4g Pj4gKnBkZXYpCj4gPj4KPiA+PiAgICAgICAgIC8qIEluaXQgRE1BIGNvbmZpZyBpZiBzdXBwb3J0 ZWQgKi8KPiA+PiAgICAgICAgIHJldCA9IGkyY19pbXhfZG1hX3JlcXVlc3QoaTJjX2lteCwgcGh5 X2FkZHIpOwo+ID4+IC0gICAgICAgaWYgKHJldCA9PSAtRVBST0JFX0RFRkVSKQo+ID4+ICsgICAg ICAgaWYgKHJldCA9PSAtRVBST0JFX0RFRkVSKSB7Cj4gPj4gKyNpZiAgICBJU19CVUlMVElOKENP TkZJR19GU0xfRURNQSkKPiA+PiAgICAgICAgICAgICAgICAgZ290byBpMmNfYWRhcHRlcl9yZW1v dmU7Cj4gPj4gKyNlbmRpZgo+ID4+ICsgICAgICAgfQo+ID4KPiA+WW91IGhhdmVuJ3QgdW5kZXJz dG9vZCBfd2h5XyB0aGUgcHJvYmxlbSBvY2N1cnMsIHlvdSdyZSBqdXN0IGF0dGVtcHRpbmcgdG8K PiA+cGF0Y2ggYXJvdW5kIGl0LiBZb3UncmUgaGFja2luZyB0aGUgY29kZSwgcmF0aGVyIHRoYW4g ZW5naW5lZXJpbmcgdGhlIGNvZGUuCj4gPgo+ID5UaGUgaW5maW5pdGUgZGVmZXJyZWQgcHJvYmUg b2NjdXJzIGJlY2F1c2U6Cj4gPgo+ID4tIGkyYy1pbXggaXMgYXR0ZW1wdGVkIHRvIGJlIHByb2Jl ZC4KPiA+LSBpMmMtaW14IHNldHMgdXAgdGhlIGhhcmR3YXJlLCBhbmQgdGhlbiBjYWxscwo+ID4g IGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcigpCj4gPi0gaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVy KCkgcHVibGlzaGVzIHRoZSBidXMgdG8gdGhlIHdvcmxkLCBhbmQgdGhlbgo+ID4gIHNlYXJjaGVz IERUIGZvciBhbnkgY2hpbGRyZW4gdG8gY3JlYXRlIC0gYW5kIGl0IGZpbmRzIHNvbWUgYW5kCj4g PiAgY3JlYXRlcyB0aGVtLgo+ID4tIHRoZSBjaGlsZHJlbiBkZXZpY2VzIGFyZSBtYXRjaGVkIHRv IHRoZWlyIGRyaXZlcnMsIHdoaWNoIGJpbmQuICBUaGlzCj4gPiAgdHJpZ2dlcnMgYSBkZWZlcnJl ZCBwcm9iZSB0byBiZSBzY2hlZHVsZWQuCj4gPi0gYmFjayBpbiB0aGUgaTJjLWlteCBkcml2ZXIs IHdlIGdldCB0byBpMmNfaW14X2RtYV9yZXF1ZXN0KCksIHdoaWNoCj4gPiAgZmFpbHMsIGFuZCB5 b3UgcmV0dXJuIC1FUFJPQkVfREVGRVIuCj4gPi0gdGhlIGkyYy1pbXggZHJpdmVyIHByb2JlIGFj dGlvbnMgYXJlIHVud291bmQsIGFuZCBwcm9iZSBleGl0cy4KPiA+LSB0aGUgZHJpdmVyIGNvcmUg cHJvY2Vzc2VzIHRoZSBkZWZlcnJlZCBwcm9iZSByZXF1ZXN0LCBmaW5kcyB0aGUKPiA+ICBpMmMt aW14IGRldmljZShzKSBvbiB0aGUgZGVmZXJyZWQgcHJvYmUgbGlzdCwgYW5kIGF0dGVtcHRzIHRv Cj4gPiAgcHJvYmUgdGhlbS4gIEdvdG8gdGhlIHRvcCBvZiB0aGlzIGxpc3QuCj4gPgo+IFtQZW5n IE1hXSBUaGFua3MgZm9yIHlvdXIgcXVpY2sgcmVwbHksIE5vLCBJIGRvbid0IHRoaW5rIHNvLCB3 aGVuIGZpcnN0LHNlY29uZCx0aGlyZC4uLi4uLiB0aW1lIHByb2JlIGZhaWxlZCwgdGhlIGkyY19k ZWxfYWRhcHRlciB3aWxsIGJlIGNhbGxlZChpdCB3aWxsIHJlbW92ZSB0aGUgaTJjIGNoaWxkcmVu IGRldmljZSkuIEkgdGhpbmsgaWYgV2UgYnVpbGQtaW4gRURNQSwgYWZ0ZXIgRURNQSBwcm9iZSBz dWNjZXNzZnVsLCB0aGUgZGVmZmVyIHByb2JlIG9mIGkyYyB3aWxsIHByb2JlIHdpdGggbm8gcmV0 dXJuIC1FUFJPQkVfREVGRVIuCgpZZXMsIGkyY19kZWxfYWRhcHRlciB3aWxsIGJlIGNhbGxlZCwg YnV0IHRoYXQgaXMgbmVpdGhlciBoZXJlIG5vciB0aGVyZS4KVGhlIGRlZmVycmVkIHByb2JlIGlz IHRyaWdnZXJlZCBieSBfYW55XyBkcml2ZXIgYmluZGluZy4gIFRoZSBmYWN0cyBhcmU6CgppMmNf YWRkX251bWJlcmVkX2FkYXB0ZXIoKSBjcmVhdGVzIGRldmljZXMuClRoZXNlIG5ldyBkZXZpY2Vz IGdldCBib3VuZCB0byBkcml2ZXJzLgpBcyBzb29uIGFzIGFueSBvbmUgb2YgdGhvc2UgZGV2aWNl cyBiaW5kcyB0byBhIGRyaXZlciwgZGVmZXJyZWQgcHJvYmluZwppcyB0cmlnZ2VyZWQuCldoZW4g aTJjX2lteF9wcm9iZSgpIHJldHVybnMgLUVQUk9CRV9ERUZFUiwgaXQgd2lsbCBiZSBhZGRlZCB0 byB0aGUgbGlzdApvZiBkZXZpY2VzIHRvIGJlIHJlLXByb2JlZCBieSB0aGUgZGVmZXJyZWQgcHJv YmluZy4KCj4gU28geW91IHNheSAiIEdvdG8gdGhlIHRvcCBvZiB0aGlzIGxpc3QgIiBqdXN0IGky YyBkcml2ZSBwcm9iZSBmYWlsZWQgd2l0aCBpMmNfaW14X2RtYV9yZXF1ZXN0KCkgcmV0dXJuIC1F UFJPQkVfREVGRVIsCj4gSWYgdGhlIEVETUEgYnVpbGQtaW4gYW5kIHByb2JlIHN1Y2Nlc3NmdWwg dGhpcyBjYXNlIG5vdCBoYXBwZW5lZC4gTm93IEkgYW0gd29ycmllZCBhYm91dCBFRE1BIGZhaWxl ZCB0byBwcm9iZSwgeW91ciBjYXNlIGlzIGNvcnJlY3QuCgpZb3UgYXJlIGFzc3VtaW5nIHRoYXQg RURNQSBoYXMgc3VjY2Vzc2Z1bGx5IHByb2JlZC4gV2hhdCBpZiBFRE1BIGhhc24ndApiZWVuIHBy b2JlZCB5ZXQsIGJlY2F1c2UgaXQgaGFzIGJlZW4gZGVmZXJyZWQgZm9yIHNvbWUgb3RoZXIgcmVh c29uIChlLmcuCmEgY2xvY2spPwoKVGhlIGZhY3QgaXMsIHRoZSB3YXkgaTJjLWlteCBpcyBzdHJ1 Y3R1cmVkIGF0IHByZXNlbnQsIGl0IGlzIHVuc2FmZSB0bwpwcm9wYWdhdGUgdGhlIEVQUk9CRV9E RUZFUiBlcnJvciBjb2RlIGZyb20gaTJjX2lteF9kbWFfcmVxdWVzdCgpIHVuZGVyCkFOWSBDSVJD VU1TVEFOQ0VTLgoKPiA+SWYsIGZvciB3aGF0ZXZlciByZWFzb24sIGkyY19pbXhfZG1hX3JlcXVl c3QoKSBldmVyIHJldHVybnMgLUVQUk9CRV9ERUZFUiwKPiA+dGhlIGFib3ZlIGxvb3AgV0lMTCBo YXBwZW4uCj4gPgo+ID5UaGUgRlVOREFNRU5UQUwgcnVsZSBvZiBrZXJuZWwgcHJvZ3JhbW1pbmcg aXMgdGhhdCB5b3UgZG8gTk9UIHB1Ymxpc2gKPiA+YmVmb3JlIHlvdSBoYXZlIGNvbXBsZXRlZCBz ZXR1cC4gIGkyYy1pbXggdmlvbGF0ZXMgdGhhdCBydWxlIGFzIHRoZSBwcm9iZQo+ID5mdW5jdGlv biBpcyBvcmRlcmVkIGF0IHByZXNlbnQuCj4gPgo+IFtQZW5nIE1hXSBZZXMsIEkgYWdyZWUsIGJ1 dCBrZXJuZWwgcHJvdmlkZSB0aGUgZGVmZmVyIHByb2JlIGFuZCBmb3IgdGhlIHBsYXRmb3JtIGRl dmljZXMgd2UgZG9uJ3QgZGVjaWRlIHdobyBwcm9iZSBmaXJzdC4KClNvLCBiZWNhdXNlIHRoZSBr ZXJuZWwgcHJvdmlkZXMgYSBmYWNpbGl0eSwgeW91IHRoaW5rIGl0J3MgZmluZSB0bwpjcmVhdGUg aW5maW5pdGUgbG9vcHMgdXNpbmcgaXQ/Cgo+ID5pMmMtaW14IGhhcyBiZWVuIHdyaXR0ZW4gZm9y IGkyY19pbXhfZG1hX3JlcXVlc3QoKSB0byBiZSBzYWZlIHRvIGNhbGwgYWZ0ZXIgdGhlCj4gPmRl dmljZSBoYXMgYmVlbiBwdWJsaXNoZWQsIGJ1dCB3aXRoIHRoZSBjdXJyZW50IHByb2JlIGZ1bmN0 aW9uIG9yZGVyLCBpdCBpcwo+ID51bnNhZmUgdG8gcHJvcGFnYXRlIHRoZSBFUFJPQkVfREVGRVIg cmV0dXJuIHZhbHVlIGZvciB0aGUgcmVhc29uIGFib3ZlLgo+ID5Gb3IgdGhlIHJlYXNvbiB0aGUg b3JpZ2luYWwgYXR0ZW1wdCBnb3QgcmV2ZXJ0ZWQuCj4gPgo+ID5TbywgaWYgeW91IHdhbnQgdG8g ZG8gdGhpcyAoYW5kIHllcywgSSdkIGFsc28gZW5jb3VyYWdlIGl0IHRvIGJlIGNvbmRpdGlvbmFs IG9uCj4gPkVETUEgYmVpbmcgYnVpbHQtaW4sIGFzIEkyQyBpcyBjb21tb25seSB1c2VkIGFzIGEg d2F5IHRvIGdldCBhdCBSVENzLCB3aGljaAo+ID5hcmUgcmVhZCBiZWZvcmUga2VybmVsIG1vZHVs ZXMgY2FuIGJlIGxvYWRlZCkgdGhlbiB5b3UgTVVTVCBtb3ZlCj4gPmkyY19pbXhfZG1hX3JlcXVl c3QoKSBiZWZvcmUKPiA+aTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKCkgdG8gYXZvaWQgdGhlIGlu ZmluaXRlIGxvb3AuCj4gPgo+IFtQZW5nIE1hXSBUbyBkbyB0aGlzLCB0aGUgaTJjIGRldmljZXMg bm90IHByb2JlIGFuZCBpMmMgYWRhcHRlciBub3QgcmVnaXN0ZXIgYmVmb3JlIGVkbWEgcHJvYmUu CgpXaGljaCBpcyB0aGUgY29ycmVjdCBiZWhhdmlvdXIsIHJhdGhlciB0aGFuIGhhdmluZyB0aGUg a2VybmVsIGN5Y2xlCnRocm91Z2ggY3JlYXRpbmcgaTJjIGRldmljZXMsIHByb2JpbmcgaTJjIGRy aXZlcnMsIHRlYXJpbmcgZG93biB0aGUKaTJjIGRldmljZXMgYW5kIHJlcGVhdGluZyBlbmRsZXNz bHkuCgpVbnRpbCB5b3Ugc2VlIHRoaXMsIHNvcnJ5LCBubywgeW91IGNhbid0IHByb3BhZ2F0ZSB0 aGUgcmV0dXJuIHZhbHVlCmZyb20gaTJjX2lteF9kbWFfcmVxdWVzdCgpLiAgV2UndmUgdHJpZWQg aXQsIGl0J3MgY2F1c2VkIHJlZ3Jlc3Npb25zLAphbmQgYSBwcm9ibGVtIGhhcyBiZWVuIGlkZW50 aWZpZWQgdGhhdCB5b3UgZG9uJ3Qgc2VlbSB0byBiZSB3aWxsaW5nCnRvIHJlY29nbmlzZSBfYXNf IGEgc2VyaW91cyBwcm9ibGVtIHdpdGggdGhlIGFwcHJvYWNoIHlvdSdyZSB0cnlpbmcKdG8gcmUt aW1wbGVtZW50LgoKLS0gClJNSydzIFBhdGNoIHN5c3RlbTogaHR0cHM6Ly93d3cuYXJtbGludXgu b3JnLnVrL2RldmVsb3Blci9wYXRjaGVzLwpGVFRDIGJyb2FkYmFuZCBmb3IgMC44bWlsZSBsaW5l IGluIHN1YnVyYmlhOiBzeW5jIGF0IDEyLjFNYnBzIGRvd24gNjIya2JwcyB1cApBY2NvcmRpbmcg dG8gc3BlZWR0ZXN0Lm5ldDogMTEuOU1icHMgZG93biA1MDBrYnBzIHVwCgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxp bmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3Rz LmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==