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 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D35F9C433EF for ; Fri, 19 Nov 2021 08:32:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B625161AD2 for ; Fri, 19 Nov 2021 08:32:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234433AbhKSIfK convert rfc822-to-8bit (ORCPT ); Fri, 19 Nov 2021 03:35:10 -0500 Received: from relay4-d.mail.gandi.net ([217.70.183.196]:57241 "EHLO relay4-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229633AbhKSIfJ (ORCPT ); Fri, 19 Nov 2021 03:35:09 -0500 Received: (Authenticated sender: miquel.raynal@bootlin.com) by relay4-d.mail.gandi.net (Postfix) with ESMTPSA id 94574E000B; Fri, 19 Nov 2021 08:32:05 +0000 (UTC) Date: Fri, 19 Nov 2021 09:32:04 +0100 From: Miquel Raynal To: Herve Codina Cc: Richard Weinberger , Vignesh Raghavendra , linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org, Thomas Petazzoni Subject: Re: [PATCH v2 4/4] mtd: rawnand: fsmc: Fix timing computation Message-ID: <20211119093204.1511b4b8@xps13> In-Reply-To: <20211119073909.1492538-5-herve.codina@bootlin.com> References: <20211119073909.1492538-1-herve.codina@bootlin.com> <20211119073909.1492538-5-herve.codina@bootlin.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.7 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Herve, herve.codina@bootlin.com wrote on Fri, 19 Nov 2021 08:39:09 +0100: > Under certain circumstances, the timing settings calculated by > the FSMC NAND controller driver were inaccurate. > These settings lead to incorrect data reads or fallback to led to oneOf: - fallbacks to timing mode 0 - fallbacks to mode 0 but "mode X timing" does not look good :) (same below, it applies all over this commit log) > mode 0 timings depending on NAND chip used. depending on the NAND chip used > > The timing computation did not take into account the following > constraint given in SPEAr3xx reference manual: > twait >= tCEA - tset*TCLK + TOUTDEL + TINDEL See below for the style request (this really is nitpicking, I'm sorry) > > Enhance the timings calculation by taking into account this > additional constraint. > > The change has no impact on slow timing mode such as mode 0. This change? slow timing modes > Indeed, on mode 0 timing, computed values are the same with and > without the patch. > > The NAND that previously used the mode 0 fallback timing is > working in mode 3 timing. I believe we should be more generic: "NANDs which previously stayed in mode 0 because of ... can now work at higher speeds and NANDs which were not working at all because of the corrupted data returned interact at high speeds without troubles. Overall improvement on a :" > The read/writes accesses performances (flash_speed tool result) > are the following: > mode0 mode3 > eraseblock write speed 3220 KiB/s 4511 KiB/s > eraseblock read speed 4491 KiB/s 7529 KiB/s > > The NAND where data reads were previously incorrect are correct > and this NAND is also working at mode 3 timing. > > Signed-off-by: Herve Codina > --- > Changes v1 to v2: > - Commit log reword > - Added performance details in commit log > - Used #define for TOUTDEL and TINDEL and > Fixed coding style > - Used max3() > > drivers/mtd/nand/raw/fsmc_nand.c | 32 ++++++++++++++++++++++++-------- > 1 file changed, 24 insertions(+), 8 deletions(-) > > diff --git a/drivers/mtd/nand/raw/fsmc_nand.c b/drivers/mtd/nand/raw/fsmc_nand.c > index 0a6c9ef0ea8b..56b9da252346 100644 > --- a/drivers/mtd/nand/raw/fsmc_nand.c > +++ b/drivers/mtd/nand/raw/fsmc_nand.c > @@ -94,6 +94,14 @@ > > #define FSMC_BUSY_WAIT_TIMEOUT (1 * HZ) > > +/* > + * According to SPEAr300 Reference Manual (RM0082) > + * TOUDEL = 7ns (Output delay from the flip-flops to the board) > + * TINDEL = 5ns (Input delay from the board to the flipflop) > + */ > +#define TOUTDEL 7000 > +#define TINDEL 5000 > + > struct fsmc_nand_timings { > u8 tclr; > u8 tar; > @@ -278,7 +286,7 @@ static int fsmc_calc_timings(struct fsmc_nand_data *host, > { > unsigned long hclk = clk_get_rate(host->clk); > unsigned long hclkn = NSEC_PER_SEC / hclk; > - u32 thiz, thold, twait, tset; > + u32 thiz, thold, twait, tset, twait_min; > > if (sdrt->tRC_min < 30000) > return -EOPNOTSUPP; > @@ -310,13 +318,6 @@ static int fsmc_calc_timings(struct fsmc_nand_data *host, > else if (tims->thold > FSMC_THOLD_MASK) > tims->thold = FSMC_THOLD_MASK; > > - twait = max(sdrt->tRP_min, sdrt->tWP_min); > - tims->twait = DIV_ROUND_UP(twait / 1000, hclkn) - 1; > - if (tims->twait == 0) > - tims->twait = 1; > - else if (tims->twait > FSMC_TWAIT_MASK) > - tims->twait = FSMC_TWAIT_MASK; > - > tset = max(sdrt->tCS_min - sdrt->tWP_min, > sdrt->tCEA_max - sdrt->tREA_max); > tims->tset = DIV_ROUND_UP(tset / 1000, hclkn) - 1; > @@ -325,6 +326,21 @@ static int fsmc_calc_timings(struct fsmc_nand_data *host, > else if (tims->tset > FSMC_TSET_MASK) > tims->tset = FSMC_TSET_MASK; > > + /* > + * According to SPEAr300 Reference Manual (RM0082) which gives more > + * information related to FSMSC timings than the SPEAr600 one (RM0305), > + * twait >= tCEA - tset*TCLK + TOUTDEL + TINDEL It is certainly best if in plain text we follow the same spacing convention than in the code: (tset * TCLK). Same applies to your commit log. > + */ > + twait_min = sdrt->tCEA_max - ((tims->tset + 1) * hclkn * 1000) > + + TOUTDEL + TINDEL; > + twait = max3(sdrt->tRP_min, sdrt->tWP_min, twait_min); > + > + tims->twait = DIV_ROUND_UP(twait / 1000, hclkn) - 1; > + if (tims->twait == 0) > + tims->twait = 1; > + else if (tims->twait > FSMC_TWAIT_MASK) > + tims->twait = FSMC_TWAIT_MASK; > + > return 0; > } > Otherwise looks good. Thanks, Miquèl 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 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C7962C433F5 for ; Fri, 19 Nov 2021 08:32:48 +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 7DB0661AD2 for ; Fri, 19 Nov 2021 08:32:48 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 7DB0661AD2 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: 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-Owner; bh=JQ/zXnW1SkSnokn+jxxeqdoGtxzQMHU7rhttUa/bbrc=; b=f1ilghT4cXL6Mz d7d4292XcvkdFY+mPp5kUUi/WsymdBrB8Fp2HRKQnrFF165h5rauROJ0OEeuL6eajKewOSl+u9bVe Q3h9stDgPraqbToPa5BSXZ/Ei+TUej5N8cIPKAFAx9lhCNxzD/DIYw/xgedMzc4Fy2GAtdtc7/J2E mMyVr5OB7PF0RLNceztld+RdjduH/g23vbz0HwY52u+ywtIKIfvQX+fehpLaySLkmazVVRUoFQ4pb IMrMDQr9EP1q1ho8KPl/jYEOTfqwn4hW9+mOi8ioOtNOY0IJoWg55S/RR56pji7cVdbT3tf5re5Xl Va5D5m6gblqccAGhdnlg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mnzJd-009mF5-Bs; Fri, 19 Nov 2021 08:32:13 +0000 Received: from relay4-d.mail.gandi.net ([217.70.183.196]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mnzJa-009mDg-3U for linux-mtd@lists.infradead.org; Fri, 19 Nov 2021 08:32:12 +0000 Received: (Authenticated sender: miquel.raynal@bootlin.com) by relay4-d.mail.gandi.net (Postfix) with ESMTPSA id 94574E000B; Fri, 19 Nov 2021 08:32:05 +0000 (UTC) Date: Fri, 19 Nov 2021 09:32:04 +0100 From: Miquel Raynal To: Herve Codina Cc: Richard Weinberger , Vignesh Raghavendra , linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org, Thomas Petazzoni Subject: Re: [PATCH v2 4/4] mtd: rawnand: fsmc: Fix timing computation Message-ID: <20211119093204.1511b4b8@xps13> In-Reply-To: <20211119073909.1492538-5-herve.codina@bootlin.com> References: <20211119073909.1492538-1-herve.codina@bootlin.com> <20211119073909.1492538-5-herve.codina@bootlin.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.7 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211119_003210_446119_8FE7835B X-CRM114-Status: GOOD ( 29.04 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org SGkgSGVydmUsCgpoZXJ2ZS5jb2RpbmFAYm9vdGxpbi5jb20gd3JvdGUgb24gRnJpLCAxOSBOb3Yg MjAyMSAwODozOTowOSArMDEwMDoKCj4gVW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLCB0aGUg dGltaW5nIHNldHRpbmdzIGNhbGN1bGF0ZWQgYnkKPiB0aGUgRlNNQyBOQU5EIGNvbnRyb2xsZXIg ZHJpdmVyIHdlcmUgaW5hY2N1cmF0ZS4KPiBUaGVzZSBzZXR0aW5ncyBsZWFkIHRvIGluY29ycmVj dCBkYXRhIHJlYWRzIG9yIGZhbGxiYWNrIHRvCgpsZWQgdG8KCm9uZU9mOgogIC0gZmFsbGJhY2tz IHRvIHRpbWluZyBtb2RlIDAKICAtIGZhbGxiYWNrcyB0byBtb2RlIDAKYnV0ICJtb2RlIFggdGlt aW5nIiBkb2VzIG5vdCBsb29rIGdvb2QgOikgKHNhbWUgYmVsb3csIGl0IGFwcGxpZXMgYWxsCm92 ZXIgdGhpcyBjb21taXQgbG9nKQoKPiBtb2RlIDAgdGltaW5ncyBkZXBlbmRpbmcgb24gTkFORCBj aGlwIHVzZWQuCgpkZXBlbmRpbmcgb24gdGhlIE5BTkQgY2hpcCB1c2VkCgo+IAo+IFRoZSB0aW1p bmcgY29tcHV0YXRpb24gZGlkIG5vdCB0YWtlIGludG8gYWNjb3VudCB0aGUgZm9sbG93aW5nCj4g Y29uc3RyYWludCBnaXZlbiBpbiBTUEVBcjN4eCByZWZlcmVuY2UgbWFudWFsOgo+ICAgdHdhaXQg Pj0gdENFQSAtIHRzZXQqVENMSyArIFRPVVRERUwgKyBUSU5ERUwKClNlZSBiZWxvdyBmb3IgdGhl IHN0eWxlIHJlcXVlc3QgKHRoaXMgcmVhbGx5IGlzIG5pdHBpY2tpbmcsIEknbSBzb3JyeSkKCj4g Cj4gRW5oYW5jZSB0aGUgdGltaW5ncyBjYWxjdWxhdGlvbiBieSB0YWtpbmcgaW50byBhY2NvdW50 IHRoaXMKPiBhZGRpdGlvbmFsIGNvbnN0cmFpbnQuCj4gCj4gVGhlIGNoYW5nZSBoYXMgbm8gaW1w YWN0IG9uIHNsb3cgdGltaW5nIG1vZGUgc3VjaCBhcyBtb2RlIDAuCgpUaGlzIGNoYW5nZT8Kc2xv dyB0aW1pbmcgbW9kZXMKCj4gSW5kZWVkLCBvbiBtb2RlIDAgdGltaW5nLCBjb21wdXRlZCB2YWx1 ZXMgYXJlIHRoZSBzYW1lIHdpdGggYW5kCj4gd2l0aG91dCB0aGUgcGF0Y2guCj4gCj4gVGhlIE5B TkQgdGhhdCBwcmV2aW91c2x5IHVzZWQgdGhlIG1vZGUgMCBmYWxsYmFjayB0aW1pbmcgaXMKPiB3 b3JraW5nIGluIG1vZGUgMyB0aW1pbmcuCgpJIGJlbGlldmUgd2Ugc2hvdWxkIGJlIG1vcmUgZ2Vu ZXJpYzoKIk5BTkRzIHdoaWNoIHByZXZpb3VzbHkgc3RheWVkIGluIG1vZGUgMCBiZWNhdXNlIG9m IC4uLiBjYW4gbm93IHdvcmsKYXQgaGlnaGVyIHNwZWVkcyBhbmQgTkFORHMgd2hpY2ggd2VyZSBu b3Qgd29ya2luZyBhdCBhbGwgYmVjYXVzZSBvZiB0aGUKY29ycnVwdGVkIGRhdGEgcmV0dXJuZWQg aW50ZXJhY3QgYXQgaGlnaCBzcGVlZHMgd2l0aG91dCB0cm91Ymxlcy4KCk92ZXJhbGwgaW1wcm92 ZW1lbnQgb24gYSA8Zmxhc2ggbmFtZS90eXBlPjoiCgo+IFRoZSByZWFkL3dyaXRlcyBhY2Nlc3Nl cyBwZXJmb3JtYW5jZXMgKGZsYXNoX3NwZWVkIHRvb2wgcmVzdWx0KQo+IGFyZSB0aGUgZm9sbG93 aW5nOgo+ICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUwICAgICAgIG1vZGUzCj4gZXJhc2Vi bG9jayB3cml0ZSBzcGVlZCAgMzIyMCBLaUIvcyAgNDUxMSBLaUIvcwo+IGVyYXNlYmxvY2sgcmVh ZCBzcGVlZCAgIDQ0OTEgS2lCL3MgIDc1MjkgS2lCL3MKPiAKPiBUaGUgTkFORCB3aGVyZSBkYXRh IHJlYWRzIHdlcmUgcHJldmlvdXNseSBpbmNvcnJlY3QgYXJlIGNvcnJlY3QKPiBhbmQgdGhpcyBO QU5EIGlzIGFsc28gd29ya2luZyBhdCBtb2RlIDMgdGltaW5nLgo+IAo+IFNpZ25lZC1vZmYtYnk6 IEhlcnZlIENvZGluYSA8aGVydmUuY29kaW5hQGJvb3RsaW4uY29tPgo+IC0tLQo+IENoYW5nZXMg djEgdG8gdjI6Cj4gLSBDb21taXQgbG9nIHJld29yZAo+IC0gQWRkZWQgcGVyZm9ybWFuY2UgZGV0 YWlscyBpbiBjb21taXQgbG9nCj4gLSBVc2VkICNkZWZpbmUgZm9yIFRPVVRERUwgYW5kIFRJTkRF TCBhbmQKPiAgIEZpeGVkIGNvZGluZyBzdHlsZQo+IC0gVXNlZCBtYXgzKCkKPiAKPiAgZHJpdmVy cy9tdGQvbmFuZC9yYXcvZnNtY19uYW5kLmMgfCAzMiArKysrKysrKysrKysrKysrKysrKysrKyst LS0tLS0tLQo+ICAxIGZpbGUgY2hhbmdlZCwgMjQgaW5zZXJ0aW9ucygrKSwgOCBkZWxldGlvbnMo LSkKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9yYXcvZnNtY19uYW5kLmMgYi9k cml2ZXJzL210ZC9uYW5kL3Jhdy9mc21jX25hbmQuYwo+IGluZGV4IDBhNmM5ZWYwZWE4Yi4uNTZi OWRhMjUyMzQ2IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvbXRkL25hbmQvcmF3L2ZzbWNfbmFuZC5j Cj4gKysrIGIvZHJpdmVycy9tdGQvbmFuZC9yYXcvZnNtY19uYW5kLmMKPiBAQCAtOTQsNiArOTQs MTQgQEAKPiAgCj4gICNkZWZpbmUgRlNNQ19CVVNZX1dBSVRfVElNRU9VVAkoMSAqIEhaKQo+ICAK PiArLyoKPiArICogQWNjb3JkaW5nIHRvIFNQRUFyMzAwIFJlZmVyZW5jZSBNYW51YWwgKFJNMDA4 MikKPiArICogIFRPVURFTCA9IDducyAoT3V0cHV0IGRlbGF5IGZyb20gdGhlIGZsaXAtZmxvcHMg dG8gdGhlIGJvYXJkKQo+ICsgKiAgVElOREVMID0gNW5zIChJbnB1dCBkZWxheSBmcm9tIHRoZSBi b2FyZCB0byB0aGUgZmxpcGZsb3ApCj4gKyAqLwo+ICsjZGVmaW5lIFRPVVRERUwJNzAwMAo+ICsj ZGVmaW5lIFRJTkRFTAk1MDAwCj4gKwo+ICBzdHJ1Y3QgZnNtY19uYW5kX3RpbWluZ3Mgewo+ICAJ dTggdGNscjsKPiAgCXU4IHRhcjsKPiBAQCAtMjc4LDcgKzI4Niw3IEBAIHN0YXRpYyBpbnQgZnNt Y19jYWxjX3RpbWluZ3Moc3RydWN0IGZzbWNfbmFuZF9kYXRhICpob3N0LAo+ICB7Cj4gIAl1bnNp Z25lZCBsb25nIGhjbGsgPSBjbGtfZ2V0X3JhdGUoaG9zdC0+Y2xrKTsKPiAgCXVuc2lnbmVkIGxv bmcgaGNsa24gPSBOU0VDX1BFUl9TRUMgLyBoY2xrOwo+IC0JdTMyIHRoaXosIHRob2xkLCB0d2Fp dCwgdHNldDsKPiArCXUzMiB0aGl6LCB0aG9sZCwgdHdhaXQsIHRzZXQsIHR3YWl0X21pbjsKPiAg Cj4gIAlpZiAoc2RydC0+dFJDX21pbiA8IDMwMDAwKQo+ICAJCXJldHVybiAtRU9QTk9UU1VQUDsK PiBAQCAtMzEwLDEzICszMTgsNiBAQCBzdGF0aWMgaW50IGZzbWNfY2FsY190aW1pbmdzKHN0cnVj dCBmc21jX25hbmRfZGF0YSAqaG9zdCwKPiAgCWVsc2UgaWYgKHRpbXMtPnRob2xkID4gRlNNQ19U SE9MRF9NQVNLKQo+ICAJCXRpbXMtPnRob2xkID0gRlNNQ19USE9MRF9NQVNLOwo+ICAKPiAtCXR3 YWl0ID0gbWF4KHNkcnQtPnRSUF9taW4sIHNkcnQtPnRXUF9taW4pOwo+IC0JdGltcy0+dHdhaXQg PSBESVZfUk9VTkRfVVAodHdhaXQgLyAxMDAwLCBoY2xrbikgLSAxOwo+IC0JaWYgKHRpbXMtPnR3 YWl0ID09IDApCj4gLQkJdGltcy0+dHdhaXQgPSAxOwo+IC0JZWxzZSBpZiAodGltcy0+dHdhaXQg PiBGU01DX1RXQUlUX01BU0spCj4gLQkJdGltcy0+dHdhaXQgPSBGU01DX1RXQUlUX01BU0s7Cj4g LQo+ICAJdHNldCA9IG1heChzZHJ0LT50Q1NfbWluIC0gc2RydC0+dFdQX21pbiwKPiAgCQkgICBz ZHJ0LT50Q0VBX21heCAtIHNkcnQtPnRSRUFfbWF4KTsKPiAgCXRpbXMtPnRzZXQgPSBESVZfUk9V TkRfVVAodHNldCAvIDEwMDAsIGhjbGtuKSAtIDE7Cj4gQEAgLTMyNSw2ICszMjYsMjEgQEAgc3Rh dGljIGludCBmc21jX2NhbGNfdGltaW5ncyhzdHJ1Y3QgZnNtY19uYW5kX2RhdGEgKmhvc3QsCj4g IAllbHNlIGlmICh0aW1zLT50c2V0ID4gRlNNQ19UU0VUX01BU0spCj4gIAkJdGltcy0+dHNldCA9 IEZTTUNfVFNFVF9NQVNLOwo+ICAKPiArCS8qCj4gKwkgKiBBY2NvcmRpbmcgdG8gU1BFQXIzMDAg UmVmZXJlbmNlIE1hbnVhbCAoUk0wMDgyKSB3aGljaCBnaXZlcyBtb3JlCj4gKwkgKiBpbmZvcm1h dGlvbiByZWxhdGVkIHRvIEZTTVNDIHRpbWluZ3MgdGhhbiB0aGUgU1BFQXI2MDAgb25lIChSTTAz MDUpLAo+ICsJICogICB0d2FpdCA+PSB0Q0VBIC0gdHNldCpUQ0xLICsgVE9VVERFTCArIFRJTkRF TAoKSXQgaXMgY2VydGFpbmx5IGJlc3QgaWYgaW4gcGxhaW4gdGV4dCB3ZSBmb2xsb3cgdGhlIHNh bWUgc3BhY2luZwpjb252ZW50aW9uIHRoYW4gaW4gdGhlIGNvZGU6ICh0c2V0ICogVENMSykuIFNh bWUgYXBwbGllcyB0byB5b3VyIGNvbW1pdApsb2cuCgo+ICsJICovCj4gKwl0d2FpdF9taW4gPSBz ZHJ0LT50Q0VBX21heCAtICgodGltcy0+dHNldCArIDEpICogaGNsa24gKiAxMDAwKQo+ICsJCSAg ICArIFRPVVRERUwgKyBUSU5ERUw7Cj4gKwl0d2FpdCA9IG1heDMoc2RydC0+dFJQX21pbiwgc2Ry dC0+dFdQX21pbiwgdHdhaXRfbWluKTsKPiArCj4gKwl0aW1zLT50d2FpdCA9IERJVl9ST1VORF9V UCh0d2FpdCAvIDEwMDAsIGhjbGtuKSAtIDE7Cj4gKwlpZiAodGltcy0+dHdhaXQgPT0gMCkKPiAr CQl0aW1zLT50d2FpdCA9IDE7Cj4gKwllbHNlIGlmICh0aW1zLT50d2FpdCA+IEZTTUNfVFdBSVRf TUFTSykKPiArCQl0aW1zLT50d2FpdCA9IEZTTUNfVFdBSVRfTUFTSzsKPiArCj4gIAlyZXR1cm4g MDsKPiAgfQo+ICAKCk90aGVyd2lzZSBsb29rcyBnb29kLgoKVGhhbmtzLApNaXF1w6hsCgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KTGludXgg TVREIGRpc2N1c3Npb24gbWFpbGluZyBsaXN0Cmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21h aWxtYW4vbGlzdGluZm8vbGludXgtbXRkLwo=