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 F0D54C433F5 for ; Fri, 19 Nov 2021 09:24:57 +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 BDAA561AFD for ; Fri, 19 Nov 2021 09:24:57 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org BDAA561AFD 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=q7dlNXdjM6LqOK96Hd6xnyhX0mDKdbip6W1GsEC3Pyk=; b=tKsN4bMTU3uXgV jNOiiHD/vaPLZZSUjWfEnXlWxCXSOQbClb4ZhaVSk0Or5x4fg+gWCbJ/EdGFrEoyVTELXPJHCIJsS epyQYRyknAT3nz+sMdtUzwKNe7iQlV8ieid62QgENaprc3bqehHkZFHceKMCFpkjsxhD/nQEga+TB kkbvvmHijXccpzSDODfQTv3+L/PvBILrbxxQEDcEUGvK/oU1MotKqWDDdnKL+BAbbKKo5v4RmdlIK r8CXRTbUWzdYZwVBOe/YAP4rWrnNPmb+ZymkCBiQCUakBtZrRghtbFIKfq48fs917JvRuhSXYOxFq Y2/rLaA1D0uF6p+Kieyw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mo080-009xQu-O3; Fri, 19 Nov 2021 09:24:16 +0000 Received: from relay2-d.mail.gandi.net ([217.70.183.194]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mo07W-009xKo-Nc; Fri, 19 Nov 2021 09:23:48 +0000 Received: (Authenticated sender: miquel.raynal@bootlin.com) by relay2-d.mail.gandi.net (Postfix) with ESMTPSA id DD04340003; Fri, 19 Nov 2021 09:23:41 +0000 (UTC) Date: Fri, 19 Nov 2021 10:23:40 +0100 From: Miquel Raynal To: Geert Uytterhoeven Cc: Richard Weinberger , Vignesh Raghavendra , Tudor Ambarus , Pratyush Yadav , Michael Walle , MTD Maling List , Thomas Petazzoni , Jimmy Lalande , Milan Stevanovic , Linux-Renesas , Magnus Damm , Linux ARM , Gareth Williams Subject: Re: [PATCH 2/3] mtd: rawnand: rzn1: Add new NAND controller driver Message-ID: <20211119102340.05f2f3e4@xps13> In-Reply-To: References: <20211118111940.1275351-1-miquel.raynal@bootlin.com> <20211118111940.1275351-3-miquel.raynal@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_012347_084186_6221F8AD X-CRM114-Status: GOOD ( 29.90 ) 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 SGkgR2VlcnQsCgpnZWVydEBsaW51eC1tNjhrLm9yZyB3cm90ZSBvbiBGcmksIDE5IE5vdiAyMDIx IDA5OjU1OjUzICswMTAwOgoKPiBIaSBNaXF1ZWwsCj4gCj4gQ0MgR2FyZXRoCj4gCj4gT24gVGh1 LCBOb3YgMTgsIDIwMjEgYXQgMTI6MTkgUE0gTWlxdWVsIFJheW5hbAo+IDxtaXF1ZWwucmF5bmFs QGJvb3RsaW4uY29tPiB3cm90ZToKPiA+IEludHJvZHVjZSBSZW5lc2FzIFJaL04xeCBOQU5EIGNv bnRyb2xsZXIgZHJpdmVyIHdoaWNoIHN1cHBvcnRzOgo+ID4gLSBBbGwgT05GSSB0aW1pbmcgbW9k ZXMKPiA+IC0gRGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zIG9mIGl0cyBpbnRlcm5hbCBFQ0MgY29u dHJvbGxlcgo+ID4gLSBPbi1kaWUgKG5vdCB0ZXN0ZWQpIGFuZCBzb2Z0d2FyZSBFQ0Mgc3VwcG9y dAo+ID4gLSBTZXZlcmFsIGNoaXBzIChub3QgdGVzdGVkKQo+ID4gLSBTdWJwYWdlIGFjY2Vzc2Vz Cj4gPiAtIERNQSBhbmQgUElPCj4gPgo+ID4gU2lnbmVkLW9mZi1ieTogTWlxdWVsIFJheW5hbCA8 bWlxdWVsLnJheW5hbEBib290bGluLmNvbT4gIAo+IAo+IFRoYW5rcyBmb3IgeW91ciBwYXRjaCEK PiAKPiA+IC0tLSBhL2RyaXZlcnMvbXRkL25hbmQvcmF3L0tjb25maWcKPiA+ICsrKyBiL2RyaXZl cnMvbXRkL25hbmQvcmF3L0tjb25maWcKPiA+IEBAIC00NjcsNiArNDY3LDEyIEBAIGNvbmZpZyBN VERfTkFORF9QTDM1WAo+ID4gICAgICAgICAgIEVuYWJsZXMgc3VwcG9ydCBmb3IgUHJpbWVDZWxs IFNNQyBQTDM1MSBhbmQgUEwzNTMgTkFORAo+ID4gICAgICAgICAgIGNvbnRyb2xsZXIgZm91bmQg b24gWnlucTcwMDAuCj4gPgo+ID4gK2NvbmZpZyBNVERfTkFORF9SWk4xCj4gPiArICAgICAgIHRy aXN0YXRlICJSZW5lc2FzIFJaL04xRCwgUlovTjFTLCBSWi9OMUwgTkFORCBjb250cm9sbGVyIgo+ ID4gKyAgICAgICBkZXBlbmRzIG9uIE9GIHx8IENPTVBJTEVfVEVTVCAgCj4gCj4gZGVwZW5kcyBv biBBUkNIX1JFTkVTQVMgfHwgQ09NUElMRV9URVNUCgpZZWFoIG9mIGNvdXJzZSwgc29ycnkgYWJv dXQgdGhhdC4KCj4gCj4gPiArICAgICAgIGhlbHAKPiA+ICsgICAgICAgICBFbmFibGVzIHN1cHBv cnQgZm9yIFJlbmVzYXMgUlovTjF4IFNvQyBmYW1pbHkgTkFORCBjb250cm9sbGVyLgo+ID4gKwo+ ID4gIGNvbW1lbnQgIk1pc2MiCj4gPgo+ID4gIGNvbmZpZyBNVERfU01fQ09NTU9OICAKPiAKPiA+ IC0tLSAvZGV2L251bGwKPiA+ICsrKyBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L3J6bjEtbmFuZC1j b250cm9sbGVyLmMgIAo+IAo+ID4gK3N0YXRpYyBpbnQgcnpuMV9yZWFkX3N1YnBhZ2VfaHdfZWNj KHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIHUzMiByZXFfb2Zmc2V0LAo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHJlcV9sZW4sIHU4ICpidWZwb2ksIGludCBwYWdl KQo+ID4gK3sKPiA+ICsgICAgICAgc3RydWN0IHJ6bjFfbmZjICpuZmMgPSB0b19yem4xX25mYyhj aGlwLT5jb250cm9sbGVyKTsKPiA+ICsgICAgICAgc3RydWN0IG10ZF9pbmZvICptdGQgPSBuYW5k X3RvX210ZChjaGlwKTsKPiA+ICsgICAgICAgc3RydWN0IHJ6bjFfbmFuZF9jaGlwICpyem4xX25h bmQgPSB0b19yem4xX25hbmQoY2hpcCk7Cj4gPiArICAgICAgIHVuc2lnbmVkIGludCBjcyA9IHRv X25mY19jcyhyem4xX25hbmQpOwo+ID4gKyAgICAgICB1bnNpZ25lZCBpbnQgcGFnZV9vZmYgPSBy b3VuZF9kb3duKHJlcV9vZmZzZXQsIGNoaXAtPmVjYy5zaXplKTsKPiA+ICsgICAgICAgdW5zaWdu ZWQgaW50IHJlYWxfbGVuID0gcm91bmRfdXAocmVxX29mZnNldCArIHJlcV9sZW4gLSBwYWdlX29m ZiwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpcC0+ZWNj LnNpemUpOwo+ID4gKyAgICAgICB1bnNpZ25lZCBpbnQgc3RhcnRfY2h1bmsgPSBwYWdlX29mZiAv IGNoaXAtPmVjYy5zaXplOwo+ID4gKyAgICAgICB1bnNpZ25lZCBpbnQgbmNodW5rcyA9IHJlYWxf bGVuIC8gY2hpcC0+ZWNjLnNpemU7Cj4gPiArICAgICAgIHVuc2lnbmVkIGludCBlY2Nfb2ZmID0g MiArIChzdGFydF9jaHVuayAqIGNoaXAtPmVjYy5ieXRlcyk7Cj4gPiArICAgICAgIHN0cnVjdCBy em4xX29wIHJvcCA9IHsKPiA+ICsgICAgICAgICAgICAgICAuY29tbWFuZCA9IENPTU1BTkRfSU5Q VVRfU0VMX0FIQlMgfCBDT01NQU5EXzAoTkFORF9DTURfUkVBRDApIHwKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgIENPTU1BTkRfMihOQU5EX0NNRF9SRUFEU1RBUlQpIHwgQ09NTUFORF9G SUZPX1NFTCB8Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EX1NFUV9SRUFE X1BBR0UsCj4gPiArICAgICAgICAgICAgICAgLmFkZHIwX3JvdyA9IHBhZ2UsCj4gPiArICAgICAg ICAgICAgICAgLmFkZHIwX2NvbCA9IHBhZ2Vfb2ZmLAo+ID4gKyAgICAgICAgICAgICAgIC5sZW4g PSByZWFsX2xlbiwKPiA+ICsgICAgICAgICAgICAgICAuZWNjX29mZnNldCA9IEVDQ19PRkZTRVQo bXRkLT53cml0ZXNpemUgKyBlY2Nfb2ZmKSwKPiA+ICsgICAgICAgfTsKPiA+ICsgICAgICAgdW5z aWduZWQgaW50IG1heF9iaXRmbGlwcyA9IDA7Cj4gPiArICAgICAgIHUzMiBlY2Nfc3RhdDsKPiA+ ICsgICAgICAgaW50IGJmLCByZXQsIGk7ICAKPiAKPiB1bnNpZ25lZCBpbnQgaQoKU3RyYW5nZWx5 IEknbSB1c2VkIHRvIGFsd2F5cyBzZXQgbXkgbG9vcCBpbmRleGVzIGFzIHNpZ25lZCBpbnRlZ2Vy cywKYnV0IEknbGwgaGFwcGlseSBjaGFuZ2UgdGhhdCBldmVyeXdoZXJlIGluIHRoZSBkcml2ZXIg YmVmb3JlCnJlLXN1Ym1pdHRpbmcuCgpbLi4uXQoKPiA+ICtzdGF0aWMgaW50IHJ6bjFfd3JpdGVf cGFnZV9od19lY2Moc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgdTggKmJ1ZiwKPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb29iX3JlcXVpcmVkLCBpbnQgcGFn ZSkKPiA+ICt7Cj4gPiArICAgICAgIHN0cnVjdCByem4xX25mYyAqbmZjID0gdG9fcnpuMV9uZmMo Y2hpcC0+Y29udHJvbGxlcik7Cj4gPiArICAgICAgIHN0cnVjdCBtdGRfaW5mbyAqbXRkID0gbmFu ZF90b19tdGQoY2hpcCk7Cj4gPiArICAgICAgIHN0cnVjdCByem4xX25hbmRfY2hpcCAqcnpuMV9u YW5kID0gdG9fcnpuMV9uYW5kKGNoaXApOwo+ID4gKyAgICAgICB1bnNpZ25lZCBpbnQgY3MgPSB0 b19uZmNfY3MocnpuMV9uYW5kKTsKPiA+ICsgICAgICAgc3RydWN0IHJ6bjFfb3Agcm9wID0gewo+ ID4gKyAgICAgICAgICAgICAgIC5jb21tYW5kID0gQ09NTUFORF9JTlBVVF9TRUxfRE1BIHwgQ09N TUFORF8wKE5BTkRfQ01EX1NFUUlOKSB8Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICBD T01NQU5EXzEoTkFORF9DTURfUEFHRVBST0cpIHwgQ09NTUFORF9GSUZPX1NFTCB8Cj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EX1NFUV9XUklURV9QQUdFLAo+ID4gKyAgICAg ICAgICAgICAgIC5hZGRyMF9yb3cgPSBwYWdlLAo+ID4gKyAgICAgICAgICAgICAgIC5sZW4gPSBt dGQtPndyaXRlc2l6ZSwKPiA+ICsgICAgICAgICAgICAgICAuZWNjX29mZnNldCA9IEVDQ19PRkZT RVQobXRkLT53cml0ZXNpemUgKyAyKSwKPiA+ICsgICAgICAgfTsKPiA+ICsgICAgICAgZG1hX2Fk ZHJfdCBkbWFfYWRkcjsKPiA+ICsgICAgICAgaW50IHJldDsKPiA+ICsKPiA+ICsgICAgICAgbWVt Y3B5KG5mYy0+YnVmLCBidWYsIG10ZC0+d3JpdGVzaXplKTsKPiA+ICsKPiA+ICsgICAgICAgLyog UHJlcGFyZSBjb250cm9sbGVyICovCj4gPiArICAgICAgIHJ6bjFfbmZjX3NlbGVjdF90YXJnZXQo Y2hpcCwgY2hpcC0+Y3VyX2NzKTsKPiA+ICsgICAgICAgcnpuMV9uZmNfY2xlYXJfc3RhdHVzKG5m Yyk7Cj4gPiArICAgICAgIHJlaW5pdF9jb21wbGV0aW9uKCZuZmMtPmNvbXBsZXRlKTsKPiA+ICsg ICAgICAgcnpuMV9uZmNfZW5faW50ZXJydXB0cyhuZmMsIElOVF9NRU1fUkRZKGNzKSk7Cj4gPiAr ICAgICAgIHJ6bjFfbmZjX2VuX2NvcnJlY3Rpb24obmZjKTsKPiA+ICsKPiA+ICsgICAgICAgLyog Q29uZmlndXJlIERNQSAqLwo+ID4gKyAgICAgICBkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKG5m Yy0+ZGV2LCAodm9pZCAqKW5mYy0+YnVmLCBtdGQtPndyaXRlc2l6ZSwKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBETUFfVE9fREVWSUNFKTsKPiA+ICsgICAgICAgd3JpdGVs KGRtYV9hZGRyLCBuZmMtPnJlZ3MgKyBETUFfQUREUl9MT1dfUkVHKTsKPiA+ICsgICAgICAgd3Jp dGVsKG10ZC0+d3JpdGVzaXplLCBuZmMtPnJlZ3MgKyBETUFfQ05UX1JFRyk7Cj4gPiArICAgICAg IHdyaXRlbChETUFfVExWTF9NQVgsIG5mYy0+cmVncyArIERNQV9UTFZMX1JFRyk7Cj4gPiArCj4g PiArICAgICAgIHJ6bjFfbmZjX3RyaWdnZXJfb3AobmZjLCAmcm9wKTsKPiA+ICsgICAgICAgcnpu MV9uZmNfdHJpZ2dlcl9kbWEobmZjKTsKPiA+ICsKPiA+ICsgICAgICAgcmV0ID0gcnpuMV9uZmNf d2FpdF9lbmRfb2ZfaW8obmZjLCBjaGlwKTsKPiA+ICsgICAgICAgZG1hX3VubWFwX3NpbmdsZShu ZmMtPmRldiwgZG1hX2FkZHIsIG10ZC0+d3JpdGVzaXplLCBETUFfVE9fREVWSUNFKTsKPiA+ICsg ICAgICAgcnpuMV9uZmNfZGlzX2NvcnJlY3Rpb24obmZjKTsKPiA+ICsgICAgICAgaWYgKHJldCkg ewo+ID4gKyAgICAgICAgICAgICAgIGRldl9lcnIobmZjLT5kZXYsICJXcml0ZSBwYWdlIG9wZXJh dGlvbiBuZXZlciBlbmRpbmdcbiIpOwo+ID4gKyAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4g PiArICAgICAgIH0KPiA+ICsKPiA+ICsgICAgICAgaWYgKG9vYl9yZXF1aXJlZCkgeyAgCj4gCj4g UmV0dXJuIGVhcmx5IGlmICFvb2JfcmVxdWlyZWQsIHRvIHJlZHVjZSBpbmRlbnRhdGlvbiBiZWxv dz8KClllYWggc3VyZS4KCj4gPiArICAgICAgICAgICAgICAgcmV0ID0gbmFuZF9jaGFuZ2Vfd3Jp dGVfY29sdW1uX29wKGNoaXAsIG10ZC0+d3JpdGVzaXplLAo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlwLT5vb2JfcG9pLCBtdGQtPm9vYnNp emUsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGZhbHNlKTsKPiA+ICsgICAgICAgICAgICAgICBpZiAocmV0KQo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgcmV0dXJuIHJldDsKPiA+ICsgICAgICAgfQo+ID4gKwo+ID4gKyAgICAgICByZXR1 cm4gMDsKPiA+ICt9ICAKClsuLi5dCgo+ID4gK3N0YXRpYyBpbnQgcnpuMV9uZmNfcHJvYmUoc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+ICt7Cj4gPiArICAgICAgIHN0cnVjdCByem4x X25mYyAqbmZjOwo+ID4gKyAgICAgICBpbnQgaXJxLCByZXQ7Cj4gPiArCj4gPiArICAgICAgIG5m YyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKm5mYyksIEdGUF9LRVJORUwpOwo+ ID4gKyAgICAgICBpZiAoIW5mYykKPiA+ICsgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsK PiA+ICsKPiA+ICsgICAgICAgbmZjLT5kZXYgPSAmcGRldi0+ZGV2Owo+ID4gKyAgICAgICBuYW5k X2NvbnRyb2xsZXJfaW5pdCgmbmZjLT5jb250cm9sbGVyKTsKPiA+ICsgICAgICAgbmZjLT5jb250 cm9sbGVyLm9wcyA9ICZyem4xX25mY19vcHM7Cj4gPiArICAgICAgIElOSVRfTElTVF9IRUFEKCZu ZmMtPmNoaXBzKTsKPiA+ICsgICAgICAgaW5pdF9jb21wbGV0aW9uKCZuZmMtPmNvbXBsZXRlKTsK PiA+ICsKPiA+ICsgICAgICAgbmZjLT5yZWdzID0gZGV2bV9wbGF0Zm9ybV9pb3JlbWFwX3Jlc291 cmNlKHBkZXYsIDApOwo+ID4gKyAgICAgICBpZiAoSVNfRVJSKG5mYy0+cmVncykpCj4gPiArICAg ICAgICAgICAgICAgcmV0dXJuIFBUUl9FUlIobmZjLT5yZWdzKTsKPiA+ICsKPiA+ICsgICAgICAg cnpuMV9uZmNfZGlzX2ludGVycnVwdHMobmZjKTsKPiA+ICsgICAgICAgaXJxID0gcGxhdGZvcm1f Z2V0X2lycShwZGV2LCAwKTsgIAo+IAo+IHBsYXRmb3JtX2dldF9pcnFfb3B0aW9uYWwoKQo+IAo+ ID4gKyAgICAgICBpZiAoaXJxIDwgMCkgeyAgCj4gCj4gV2hhdCBpZiB0aGlzIGlzIGEgcmVhbCBl cnJvciwgb3IgLUVQUk9CRV9ERUZFUj8KCklmIGl0J3MgYSByZWFsIGVycm9yIEkgYmVsaWV2ZSB3 ZSBzaG91bGQgc3RpbGwgZmFsbGJhY2sgdG8gcG9sbGluZz8gT3IKZG8geW91IHByZWZlciB0byBv bmx5IHVzZSBwb2xsaW5nIG9uIGEgZml4ZWQgY29uZGl0aW9uPwoKSG93ZXZlciBpdCdzIHRydWUg dGhhdCBJIGZvcmdvdCB0byBoYW5kbGUgdGhlIGRlZmVycmVkIGNhc2UgaGVyZS4KCj4gPiArICAg ICAgICAgICAgICAgZGV2X2luZm8oJnBkZXYtPmRldiwgIlVzaW5nIHBvbGxpbmdcbiIpOwo+ID4g KyAgICAgICAgICAgICAgIG5mYy0+dXNlX3BvbGxpbmcgPSB0cnVlOwo+ID4gKyAgICAgICB9IGVs c2Ugewo+ID4gKyAgICAgICAgICAgICAgIHJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRl diwgaXJxLCByem4xX25mY19pcnFfaGFuZGxlciwgMCwKPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICJyem4xLW5hbmQtY29udHJvbGxlciIsIG5mYyk7Cj4gPiArICAg ICAgICAgICAgICAgaWYgKHJldCA8IDApCj4gPiArICAgICAgICAgICAgICAgICAgICAgICByZXR1 cm4gcmV0Owo+ID4gKyAgICAgICB9Cj4gPiArCj4gPiArICAgICAgIHJldCA9IGRtYV9zZXRfbWFz aygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKPiA+ICsgICAgICAgaWYgKHJldCkKPiA+ ICsgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKwo+ID4gKyAgICAgICBuZmMtPmhjbGsg PSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImhjbGsiKTsKPiA+ICsgICAgICAgaWYgKElTX0VS UihuZmMtPmhjbGspKQo+ID4gKyAgICAgICAgICAgICAgIHJldHVybiBQVFJfRVJSKG5mYy0+aGNs ayk7Cj4gPiArCj4gPiArICAgICAgIG5mYy0+ZWNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2 LCAiZWNsayIpOwo+ID4gKyAgICAgICBpZiAoSVNfRVJSKG5mYy0+ZWNsaykpCj4gPiArICAgICAg ICAgICAgICAgcmV0dXJuIFBUUl9FUlIobmZjLT5lY2xrKTsKPiA+ICsKPiA+ICsgICAgICAgcmV0 ID0gY2xrX3ByZXBhcmVfZW5hYmxlKG5mYy0+aGNsayk7Cj4gPiArICAgICAgIGlmIChyZXQpCj4g PiArICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+ICsKPiA+ICsgICAgICAgcmV0ID0gY2xr X3ByZXBhcmVfZW5hYmxlKG5mYy0+ZWNsayk7Cj4gPiArICAgICAgIGlmIChyZXQpCj4gPiArICAg ICAgICAgICAgICAgZ290byBkaXNhYmxlX2hjbGs7Cj4gPiArCj4gPiArICAgICAgIHJ6bjFfbmZj X2NsZWFyX2ZpZm8obmZjKTsKPiA+ICsKPiA+ICsgICAgICAgcGxhdGZvcm1fc2V0X2RydmRhdGEo cGRldiwgbmZjKTsKPiA+ICsKPiA+ICsgICAgICAgcmV0ID0gcnpuMV9uYW5kX2NoaXBzX2luaXQo bmZjKTsKPiA+ICsgICAgICAgaWYgKHJldCkKPiA+ICsgICAgICAgICAgICAgICBnb3RvIGRpc2Fi bGVfZWNsazsKPiA+ICsKPiA+ICsgICAgICAgcmV0dXJuIDA7Cj4gPiArCj4gPiArZGlzYWJsZV9l Y2xrOgo+ID4gKyAgICAgICBjbGtfZGlzYWJsZV91bnByZXBhcmUobmZjLT5lY2xrKTsKPiA+ICtk aXNhYmxlX2hjbGs6Cj4gPiArICAgICAgIGNsa19kaXNhYmxlX3VucHJlcGFyZShuZmMtPmhjbGsp Owo+ID4gKwo+ID4gKyAgICAgICByZXR1cm4gcmV0Owo+ID4gK30gIAo+IAo+ID4gK3N0YXRpYyBj b25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJ6bjFfbmZjX2lkX3RhYmxlW10gPSB7Cj4gPiArICAg ICAgIHsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxyOWEwNmcwMzItbmFuZC1jb250cm9sbGVyIiB9 LCAgCj4gCj4gR2l2ZW4gbXkgY29tbWVudCBvbiB0aGUgYmluZGluZ3MsIHlvdSBwcm9iYWJseSB3 YW50IHRvIG1hdGNoIGFnYWluc3QKPiAicmVuZXNhcyxyem4xLW5hbmQtY29udHJvbGxlciIgaW5z dGVhZC4KClN1cmUuCgo+IAo+ID4gKyAgICAgICB7fSAvKiBzZW50aW5lbCAqLwo+ID4gK307Cj4g PiArTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbmZjX2lkX3RhYmxlKTsKPiA+ICsKPiA+ICtzdGF0 aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByem4xX25mY19kcml2ZXIgPSB7Cj4gPiArICAgICAg IC5kcml2ZXIgPSB7Cj4gPiArICAgICAgICAgICAgICAgLm5hbWUgICA9ICJyZW5lc2FzLW5mYyIs ICAKPiAKPiBQZXJoYXBzIHMvbmZjL25hbmRjLyBldmVyeXdoZXJlLCB0byBhdm9pZCBjb25mdXNp b24gd2l0aCB0aGUgb3RoZXIgbmZjPwoKVGhlcmUgYXJlIG1hbnkgTkFORCBjb250cm9sbGVyIGRy aXZlcnMgdGhhdCBhcmUgYWJicmV2aWF0ZWQgd2l0aCBuZmMKYmVjYXVzZSBpdCdzIHNob3J0IGFu ZCBlYXN5IHRvIHdyaXRlIHdoaWxlIHN0aWxsIHByZWNpc2UsIGJ1dCBJIGhhdmUgbm8KaXNzdWUg cmV3b3JkaW5nIG5mYyBpbnRvIG5hbmRjIGlmIHlvdSBwcmVmZXIuCgo+ID4gKyAgICAgICAgICAg ICAgIC5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihyem4xX25mY19pZF90YWJsZSksCj4g PiArICAgICAgIH0sCj4gPiArICAgICAgIC5wcm9iZSA9IHJ6bjFfbmZjX3Byb2JlLAo+ID4gKyAg ICAgICAucmVtb3ZlID0gcnpuMV9uZmNfcmVtb3ZlLAo+ID4gK307Cj4gPiArbW9kdWxlX3BsYXRm b3JtX2RyaXZlcihyem4xX25mY19kcml2ZXIpOyAgCj4gCgpUaGFua3MsCk1pcXXDqGwKCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eCBN VEQgZGlzY3Vzc2lvbiBtYWlsaW5nIGxpc3QKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFp bG1hbi9saXN0aW5mby9saW51eC1tdGQvCg== 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 4D4DFC433EF for ; Fri, 19 Nov 2021 09:23:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2ACF061175 for ; Fri, 19 Nov 2021 09:23:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233947AbhKSJ0r convert rfc822-to-8bit (ORCPT ); Fri, 19 Nov 2021 04:26:47 -0500 Received: from relay2-d.mail.gandi.net ([217.70.183.194]:59397 "EHLO relay2-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232838AbhKSJ0q (ORCPT ); Fri, 19 Nov 2021 04:26:46 -0500 Received: (Authenticated sender: miquel.raynal@bootlin.com) by relay2-d.mail.gandi.net (Postfix) with ESMTPSA id DD04340003; Fri, 19 Nov 2021 09:23:41 +0000 (UTC) Date: Fri, 19 Nov 2021 10:23:40 +0100 From: Miquel Raynal To: Geert Uytterhoeven Cc: Richard Weinberger , Vignesh Raghavendra , Tudor Ambarus , Pratyush Yadav , Michael Walle , MTD Maling List , Thomas Petazzoni , Jimmy Lalande , Milan Stevanovic , Linux-Renesas , Magnus Damm , Linux ARM , Gareth Williams Subject: Re: [PATCH 2/3] mtd: rawnand: rzn1: Add new NAND controller driver Message-ID: <20211119102340.05f2f3e4@xps13> In-Reply-To: References: <20211118111940.1275351-1-miquel.raynal@bootlin.com> <20211118111940.1275351-3-miquel.raynal@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-renesas-soc@vger.kernel.org Hi Geert, geert@linux-m68k.org wrote on Fri, 19 Nov 2021 09:55:53 +0100: > Hi Miquel, > > CC Gareth > > On Thu, Nov 18, 2021 at 12:19 PM Miquel Raynal > wrote: > > Introduce Renesas RZ/N1x NAND controller driver which supports: > > - All ONFI timing modes > > - Different configurations of its internal ECC controller > > - On-die (not tested) and software ECC support > > - Several chips (not tested) > > - Subpage accesses > > - DMA and PIO > > > > Signed-off-by: Miquel Raynal > > Thanks for your patch! > > > --- a/drivers/mtd/nand/raw/Kconfig > > +++ b/drivers/mtd/nand/raw/Kconfig > > @@ -467,6 +467,12 @@ config MTD_NAND_PL35X > > Enables support for PrimeCell SMC PL351 and PL353 NAND > > controller found on Zynq7000. > > > > +config MTD_NAND_RZN1 > > + tristate "Renesas RZ/N1D, RZ/N1S, RZ/N1L NAND controller" > > + depends on OF || COMPILE_TEST > > depends on ARCH_RENESAS || COMPILE_TEST Yeah of course, sorry about that. > > > + help > > + Enables support for Renesas RZ/N1x SoC family NAND controller. > > + > > comment "Misc" > > > > config MTD_SM_COMMON > > > --- /dev/null > > +++ b/drivers/mtd/nand/raw/rzn1-nand-controller.c > > > +static int rzn1_read_subpage_hw_ecc(struct nand_chip *chip, u32 req_offset, > > + u32 req_len, u8 *bufpoi, int page) > > +{ > > + struct rzn1_nfc *nfc = to_rzn1_nfc(chip->controller); > > + struct mtd_info *mtd = nand_to_mtd(chip); > > + struct rzn1_nand_chip *rzn1_nand = to_rzn1_nand(chip); > > + unsigned int cs = to_nfc_cs(rzn1_nand); > > + unsigned int page_off = round_down(req_offset, chip->ecc.size); > > + unsigned int real_len = round_up(req_offset + req_len - page_off, > > + chip->ecc.size); > > + unsigned int start_chunk = page_off / chip->ecc.size; > > + unsigned int nchunks = real_len / chip->ecc.size; > > + unsigned int ecc_off = 2 + (start_chunk * chip->ecc.bytes); > > + struct rzn1_op rop = { > > + .command = COMMAND_INPUT_SEL_AHBS | COMMAND_0(NAND_CMD_READ0) | > > + COMMAND_2(NAND_CMD_READSTART) | COMMAND_FIFO_SEL | > > + COMMAND_SEQ_READ_PAGE, > > + .addr0_row = page, > > + .addr0_col = page_off, > > + .len = real_len, > > + .ecc_offset = ECC_OFFSET(mtd->writesize + ecc_off), > > + }; > > + unsigned int max_bitflips = 0; > > + u32 ecc_stat; > > + int bf, ret, i; > > unsigned int i Strangely I'm used to always set my loop indexes as signed integers, but I'll happily change that everywhere in the driver before re-submitting. [...] > > +static int rzn1_write_page_hw_ecc(struct nand_chip *chip, const u8 *buf, > > + int oob_required, int page) > > +{ > > + struct rzn1_nfc *nfc = to_rzn1_nfc(chip->controller); > > + struct mtd_info *mtd = nand_to_mtd(chip); > > + struct rzn1_nand_chip *rzn1_nand = to_rzn1_nand(chip); > > + unsigned int cs = to_nfc_cs(rzn1_nand); > > + struct rzn1_op rop = { > > + .command = COMMAND_INPUT_SEL_DMA | COMMAND_0(NAND_CMD_SEQIN) | > > + COMMAND_1(NAND_CMD_PAGEPROG) | COMMAND_FIFO_SEL | > > + COMMAND_SEQ_WRITE_PAGE, > > + .addr0_row = page, > > + .len = mtd->writesize, > > + .ecc_offset = ECC_OFFSET(mtd->writesize + 2), > > + }; > > + dma_addr_t dma_addr; > > + int ret; > > + > > + memcpy(nfc->buf, buf, mtd->writesize); > > + > > + /* Prepare controller */ > > + rzn1_nfc_select_target(chip, chip->cur_cs); > > + rzn1_nfc_clear_status(nfc); > > + reinit_completion(&nfc->complete); > > + rzn1_nfc_en_interrupts(nfc, INT_MEM_RDY(cs)); > > + rzn1_nfc_en_correction(nfc); > > + > > + /* Configure DMA */ > > + dma_addr = dma_map_single(nfc->dev, (void *)nfc->buf, mtd->writesize, > > + DMA_TO_DEVICE); > > + writel(dma_addr, nfc->regs + DMA_ADDR_LOW_REG); > > + writel(mtd->writesize, nfc->regs + DMA_CNT_REG); > > + writel(DMA_TLVL_MAX, nfc->regs + DMA_TLVL_REG); > > + > > + rzn1_nfc_trigger_op(nfc, &rop); > > + rzn1_nfc_trigger_dma(nfc); > > + > > + ret = rzn1_nfc_wait_end_of_io(nfc, chip); > > + dma_unmap_single(nfc->dev, dma_addr, mtd->writesize, DMA_TO_DEVICE); > > + rzn1_nfc_dis_correction(nfc); > > + if (ret) { > > + dev_err(nfc->dev, "Write page operation never ending\n"); > > + return ret; > > + } > > + > > + if (oob_required) { > > Return early if !oob_required, to reduce indentation below? Yeah sure. > > + ret = nand_change_write_column_op(chip, mtd->writesize, > > + chip->oob_poi, mtd->oobsize, > > + false); > > + if (ret) > > + return ret; > > + } > > + > > + return 0; > > +} [...] > > +static int rzn1_nfc_probe(struct platform_device *pdev) > > +{ > > + struct rzn1_nfc *nfc; > > + int irq, ret; > > + > > + nfc = devm_kzalloc(&pdev->dev, sizeof(*nfc), GFP_KERNEL); > > + if (!nfc) > > + return -ENOMEM; > > + > > + nfc->dev = &pdev->dev; > > + nand_controller_init(&nfc->controller); > > + nfc->controller.ops = &rzn1_nfc_ops; > > + INIT_LIST_HEAD(&nfc->chips); > > + init_completion(&nfc->complete); > > + > > + nfc->regs = devm_platform_ioremap_resource(pdev, 0); > > + if (IS_ERR(nfc->regs)) > > + return PTR_ERR(nfc->regs); > > + > > + rzn1_nfc_dis_interrupts(nfc); > > + irq = platform_get_irq(pdev, 0); > > platform_get_irq_optional() > > > + if (irq < 0) { > > What if this is a real error, or -EPROBE_DEFER? If it's a real error I believe we should still fallback to polling? Or do you prefer to only use polling on a fixed condition? However it's true that I forgot to handle the deferred case here. > > + dev_info(&pdev->dev, "Using polling\n"); > > + nfc->use_polling = true; > > + } else { > > + ret = devm_request_irq(&pdev->dev, irq, rzn1_nfc_irq_handler, 0, > > + "rzn1-nand-controller", nfc); > > + if (ret < 0) > > + return ret; > > + } > > + > > + ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); > > + if (ret) > > + return ret; > > + > > + nfc->hclk = devm_clk_get(&pdev->dev, "hclk"); > > + if (IS_ERR(nfc->hclk)) > > + return PTR_ERR(nfc->hclk); > > + > > + nfc->eclk = devm_clk_get(&pdev->dev, "eclk"); > > + if (IS_ERR(nfc->eclk)) > > + return PTR_ERR(nfc->eclk); > > + > > + ret = clk_prepare_enable(nfc->hclk); > > + if (ret) > > + return ret; > > + > > + ret = clk_prepare_enable(nfc->eclk); > > + if (ret) > > + goto disable_hclk; > > + > > + rzn1_nfc_clear_fifo(nfc); > > + > > + platform_set_drvdata(pdev, nfc); > > + > > + ret = rzn1_nand_chips_init(nfc); > > + if (ret) > > + goto disable_eclk; > > + > > + return 0; > > + > > +disable_eclk: > > + clk_disable_unprepare(nfc->eclk); > > +disable_hclk: > > + clk_disable_unprepare(nfc->hclk); > > + > > + return ret; > > +} > > > +static const struct of_device_id rzn1_nfc_id_table[] = { > > + { .compatible = "renesas,r9a06g032-nand-controller" }, > > Given my comment on the bindings, you probably want to match against > "renesas,rzn1-nand-controller" instead. Sure. > > > + {} /* sentinel */ > > +}; > > +MODULE_DEVICE_TABLE(of, nfc_id_table); > > + > > +static struct platform_driver rzn1_nfc_driver = { > > + .driver = { > > + .name = "renesas-nfc", > > Perhaps s/nfc/nandc/ everywhere, to avoid confusion with the other nfc? There are many NAND controller drivers that are abbreviated with nfc because it's short and easy to write while still precise, but I have no issue rewording nfc into nandc if you prefer. > > + .of_match_table = of_match_ptr(rzn1_nfc_id_table), > > + }, > > + .probe = rzn1_nfc_probe, > > + .remove = rzn1_nfc_remove, > > +}; > > +module_platform_driver(rzn1_nfc_driver); > 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 BE21EC433FE for ; Fri, 19 Nov 2021 09:25:37 +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 8CDDC61A79 for ; Fri, 19 Nov 2021 09:25:37 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 8CDDC61A79 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=HG0REZMUNJcJR8oADlP0/aiYAVdVZSkIkc+EXNvWRIE=; b=YRZaYhseJDKeWX tsnSwg0i6Falip22hTfL0HTLKxGZ0cG5cDcsdhwSiSBXpJaxdpafqicALQ8IVlAziXtoabededV18 FMlVOHzCq1OZCKG8+I5q/LroFlzarbwQvBJUKK5y9rQUG0vPebOZGVgoY+lV2oHHhHRfXxAT0f2bF qbYegZVar0kUyKSgJx1wR6PLKiAjkSbaIOta+ttUZmw/lMnFQQflMcZA5+HEf/Z/4+rrlAcyjPYOC gRsub+10thYccDXb1yThjm4Dz+WIQZQGS3djBkKjKrXapSWtCpd0096JWrGDvIj4KmUJoJ2lLWWvf LKg1njn7QkENGp1C673g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mo07p-009xOu-RS; Fri, 19 Nov 2021 09:24:05 +0000 Received: from relay2-d.mail.gandi.net ([217.70.183.194]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mo07W-009xKo-Nc; Fri, 19 Nov 2021 09:23:48 +0000 Received: (Authenticated sender: miquel.raynal@bootlin.com) by relay2-d.mail.gandi.net (Postfix) with ESMTPSA id DD04340003; Fri, 19 Nov 2021 09:23:41 +0000 (UTC) Date: Fri, 19 Nov 2021 10:23:40 +0100 From: Miquel Raynal To: Geert Uytterhoeven Cc: Richard Weinberger , Vignesh Raghavendra , Tudor Ambarus , Pratyush Yadav , Michael Walle , MTD Maling List , Thomas Petazzoni , Jimmy Lalande , Milan Stevanovic , Linux-Renesas , Magnus Damm , Linux ARM , Gareth Williams Subject: Re: [PATCH 2/3] mtd: rawnand: rzn1: Add new NAND controller driver Message-ID: <20211119102340.05f2f3e4@xps13> In-Reply-To: References: <20211118111940.1275351-1-miquel.raynal@bootlin.com> <20211118111940.1275351-3-miquel.raynal@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_012347_084186_6221F8AD X-CRM114-Status: GOOD ( 29.90 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgR2VlcnQsCgpnZWVydEBsaW51eC1tNjhrLm9yZyB3cm90ZSBvbiBGcmksIDE5IE5vdiAyMDIx IDA5OjU1OjUzICswMTAwOgoKPiBIaSBNaXF1ZWwsCj4gCj4gQ0MgR2FyZXRoCj4gCj4gT24gVGh1 LCBOb3YgMTgsIDIwMjEgYXQgMTI6MTkgUE0gTWlxdWVsIFJheW5hbAo+IDxtaXF1ZWwucmF5bmFs QGJvb3RsaW4uY29tPiB3cm90ZToKPiA+IEludHJvZHVjZSBSZW5lc2FzIFJaL04xeCBOQU5EIGNv bnRyb2xsZXIgZHJpdmVyIHdoaWNoIHN1cHBvcnRzOgo+ID4gLSBBbGwgT05GSSB0aW1pbmcgbW9k ZXMKPiA+IC0gRGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zIG9mIGl0cyBpbnRlcm5hbCBFQ0MgY29u dHJvbGxlcgo+ID4gLSBPbi1kaWUgKG5vdCB0ZXN0ZWQpIGFuZCBzb2Z0d2FyZSBFQ0Mgc3VwcG9y dAo+ID4gLSBTZXZlcmFsIGNoaXBzIChub3QgdGVzdGVkKQo+ID4gLSBTdWJwYWdlIGFjY2Vzc2Vz Cj4gPiAtIERNQSBhbmQgUElPCj4gPgo+ID4gU2lnbmVkLW9mZi1ieTogTWlxdWVsIFJheW5hbCA8 bWlxdWVsLnJheW5hbEBib290bGluLmNvbT4gIAo+IAo+IFRoYW5rcyBmb3IgeW91ciBwYXRjaCEK PiAKPiA+IC0tLSBhL2RyaXZlcnMvbXRkL25hbmQvcmF3L0tjb25maWcKPiA+ICsrKyBiL2RyaXZl cnMvbXRkL25hbmQvcmF3L0tjb25maWcKPiA+IEBAIC00NjcsNiArNDY3LDEyIEBAIGNvbmZpZyBN VERfTkFORF9QTDM1WAo+ID4gICAgICAgICAgIEVuYWJsZXMgc3VwcG9ydCBmb3IgUHJpbWVDZWxs IFNNQyBQTDM1MSBhbmQgUEwzNTMgTkFORAo+ID4gICAgICAgICAgIGNvbnRyb2xsZXIgZm91bmQg b24gWnlucTcwMDAuCj4gPgo+ID4gK2NvbmZpZyBNVERfTkFORF9SWk4xCj4gPiArICAgICAgIHRy aXN0YXRlICJSZW5lc2FzIFJaL04xRCwgUlovTjFTLCBSWi9OMUwgTkFORCBjb250cm9sbGVyIgo+ ID4gKyAgICAgICBkZXBlbmRzIG9uIE9GIHx8IENPTVBJTEVfVEVTVCAgCj4gCj4gZGVwZW5kcyBv biBBUkNIX1JFTkVTQVMgfHwgQ09NUElMRV9URVNUCgpZZWFoIG9mIGNvdXJzZSwgc29ycnkgYWJv dXQgdGhhdC4KCj4gCj4gPiArICAgICAgIGhlbHAKPiA+ICsgICAgICAgICBFbmFibGVzIHN1cHBv cnQgZm9yIFJlbmVzYXMgUlovTjF4IFNvQyBmYW1pbHkgTkFORCBjb250cm9sbGVyLgo+ID4gKwo+ ID4gIGNvbW1lbnQgIk1pc2MiCj4gPgo+ID4gIGNvbmZpZyBNVERfU01fQ09NTU9OICAKPiAKPiA+ IC0tLSAvZGV2L251bGwKPiA+ICsrKyBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L3J6bjEtbmFuZC1j b250cm9sbGVyLmMgIAo+IAo+ID4gK3N0YXRpYyBpbnQgcnpuMV9yZWFkX3N1YnBhZ2VfaHdfZWNj KHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIHUzMiByZXFfb2Zmc2V0LAo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHJlcV9sZW4sIHU4ICpidWZwb2ksIGludCBwYWdl KQo+ID4gK3sKPiA+ICsgICAgICAgc3RydWN0IHJ6bjFfbmZjICpuZmMgPSB0b19yem4xX25mYyhj aGlwLT5jb250cm9sbGVyKTsKPiA+ICsgICAgICAgc3RydWN0IG10ZF9pbmZvICptdGQgPSBuYW5k X3RvX210ZChjaGlwKTsKPiA+ICsgICAgICAgc3RydWN0IHJ6bjFfbmFuZF9jaGlwICpyem4xX25h bmQgPSB0b19yem4xX25hbmQoY2hpcCk7Cj4gPiArICAgICAgIHVuc2lnbmVkIGludCBjcyA9IHRv X25mY19jcyhyem4xX25hbmQpOwo+ID4gKyAgICAgICB1bnNpZ25lZCBpbnQgcGFnZV9vZmYgPSBy b3VuZF9kb3duKHJlcV9vZmZzZXQsIGNoaXAtPmVjYy5zaXplKTsKPiA+ICsgICAgICAgdW5zaWdu ZWQgaW50IHJlYWxfbGVuID0gcm91bmRfdXAocmVxX29mZnNldCArIHJlcV9sZW4gLSBwYWdlX29m ZiwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpcC0+ZWNj LnNpemUpOwo+ID4gKyAgICAgICB1bnNpZ25lZCBpbnQgc3RhcnRfY2h1bmsgPSBwYWdlX29mZiAv IGNoaXAtPmVjYy5zaXplOwo+ID4gKyAgICAgICB1bnNpZ25lZCBpbnQgbmNodW5rcyA9IHJlYWxf bGVuIC8gY2hpcC0+ZWNjLnNpemU7Cj4gPiArICAgICAgIHVuc2lnbmVkIGludCBlY2Nfb2ZmID0g MiArIChzdGFydF9jaHVuayAqIGNoaXAtPmVjYy5ieXRlcyk7Cj4gPiArICAgICAgIHN0cnVjdCBy em4xX29wIHJvcCA9IHsKPiA+ICsgICAgICAgICAgICAgICAuY29tbWFuZCA9IENPTU1BTkRfSU5Q VVRfU0VMX0FIQlMgfCBDT01NQU5EXzAoTkFORF9DTURfUkVBRDApIHwKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgIENPTU1BTkRfMihOQU5EX0NNRF9SRUFEU1RBUlQpIHwgQ09NTUFORF9G SUZPX1NFTCB8Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EX1NFUV9SRUFE X1BBR0UsCj4gPiArICAgICAgICAgICAgICAgLmFkZHIwX3JvdyA9IHBhZ2UsCj4gPiArICAgICAg ICAgICAgICAgLmFkZHIwX2NvbCA9IHBhZ2Vfb2ZmLAo+ID4gKyAgICAgICAgICAgICAgIC5sZW4g PSByZWFsX2xlbiwKPiA+ICsgICAgICAgICAgICAgICAuZWNjX29mZnNldCA9IEVDQ19PRkZTRVQo bXRkLT53cml0ZXNpemUgKyBlY2Nfb2ZmKSwKPiA+ICsgICAgICAgfTsKPiA+ICsgICAgICAgdW5z aWduZWQgaW50IG1heF9iaXRmbGlwcyA9IDA7Cj4gPiArICAgICAgIHUzMiBlY2Nfc3RhdDsKPiA+ ICsgICAgICAgaW50IGJmLCByZXQsIGk7ICAKPiAKPiB1bnNpZ25lZCBpbnQgaQoKU3RyYW5nZWx5 IEknbSB1c2VkIHRvIGFsd2F5cyBzZXQgbXkgbG9vcCBpbmRleGVzIGFzIHNpZ25lZCBpbnRlZ2Vy cywKYnV0IEknbGwgaGFwcGlseSBjaGFuZ2UgdGhhdCBldmVyeXdoZXJlIGluIHRoZSBkcml2ZXIg YmVmb3JlCnJlLXN1Ym1pdHRpbmcuCgpbLi4uXQoKPiA+ICtzdGF0aWMgaW50IHJ6bjFfd3JpdGVf cGFnZV9od19lY2Moc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgdTggKmJ1ZiwKPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb29iX3JlcXVpcmVkLCBpbnQgcGFn ZSkKPiA+ICt7Cj4gPiArICAgICAgIHN0cnVjdCByem4xX25mYyAqbmZjID0gdG9fcnpuMV9uZmMo Y2hpcC0+Y29udHJvbGxlcik7Cj4gPiArICAgICAgIHN0cnVjdCBtdGRfaW5mbyAqbXRkID0gbmFu ZF90b19tdGQoY2hpcCk7Cj4gPiArICAgICAgIHN0cnVjdCByem4xX25hbmRfY2hpcCAqcnpuMV9u YW5kID0gdG9fcnpuMV9uYW5kKGNoaXApOwo+ID4gKyAgICAgICB1bnNpZ25lZCBpbnQgY3MgPSB0 b19uZmNfY3MocnpuMV9uYW5kKTsKPiA+ICsgICAgICAgc3RydWN0IHJ6bjFfb3Agcm9wID0gewo+ ID4gKyAgICAgICAgICAgICAgIC5jb21tYW5kID0gQ09NTUFORF9JTlBVVF9TRUxfRE1BIHwgQ09N TUFORF8wKE5BTkRfQ01EX1NFUUlOKSB8Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICBD T01NQU5EXzEoTkFORF9DTURfUEFHRVBST0cpIHwgQ09NTUFORF9GSUZPX1NFTCB8Cj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EX1NFUV9XUklURV9QQUdFLAo+ID4gKyAgICAg ICAgICAgICAgIC5hZGRyMF9yb3cgPSBwYWdlLAo+ID4gKyAgICAgICAgICAgICAgIC5sZW4gPSBt dGQtPndyaXRlc2l6ZSwKPiA+ICsgICAgICAgICAgICAgICAuZWNjX29mZnNldCA9IEVDQ19PRkZT RVQobXRkLT53cml0ZXNpemUgKyAyKSwKPiA+ICsgICAgICAgfTsKPiA+ICsgICAgICAgZG1hX2Fk ZHJfdCBkbWFfYWRkcjsKPiA+ICsgICAgICAgaW50IHJldDsKPiA+ICsKPiA+ICsgICAgICAgbWVt Y3B5KG5mYy0+YnVmLCBidWYsIG10ZC0+d3JpdGVzaXplKTsKPiA+ICsKPiA+ICsgICAgICAgLyog UHJlcGFyZSBjb250cm9sbGVyICovCj4gPiArICAgICAgIHJ6bjFfbmZjX3NlbGVjdF90YXJnZXQo Y2hpcCwgY2hpcC0+Y3VyX2NzKTsKPiA+ICsgICAgICAgcnpuMV9uZmNfY2xlYXJfc3RhdHVzKG5m Yyk7Cj4gPiArICAgICAgIHJlaW5pdF9jb21wbGV0aW9uKCZuZmMtPmNvbXBsZXRlKTsKPiA+ICsg ICAgICAgcnpuMV9uZmNfZW5faW50ZXJydXB0cyhuZmMsIElOVF9NRU1fUkRZKGNzKSk7Cj4gPiAr ICAgICAgIHJ6bjFfbmZjX2VuX2NvcnJlY3Rpb24obmZjKTsKPiA+ICsKPiA+ICsgICAgICAgLyog Q29uZmlndXJlIERNQSAqLwo+ID4gKyAgICAgICBkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKG5m Yy0+ZGV2LCAodm9pZCAqKW5mYy0+YnVmLCBtdGQtPndyaXRlc2l6ZSwKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBETUFfVE9fREVWSUNFKTsKPiA+ICsgICAgICAgd3JpdGVs KGRtYV9hZGRyLCBuZmMtPnJlZ3MgKyBETUFfQUREUl9MT1dfUkVHKTsKPiA+ICsgICAgICAgd3Jp dGVsKG10ZC0+d3JpdGVzaXplLCBuZmMtPnJlZ3MgKyBETUFfQ05UX1JFRyk7Cj4gPiArICAgICAg IHdyaXRlbChETUFfVExWTF9NQVgsIG5mYy0+cmVncyArIERNQV9UTFZMX1JFRyk7Cj4gPiArCj4g PiArICAgICAgIHJ6bjFfbmZjX3RyaWdnZXJfb3AobmZjLCAmcm9wKTsKPiA+ICsgICAgICAgcnpu MV9uZmNfdHJpZ2dlcl9kbWEobmZjKTsKPiA+ICsKPiA+ICsgICAgICAgcmV0ID0gcnpuMV9uZmNf d2FpdF9lbmRfb2ZfaW8obmZjLCBjaGlwKTsKPiA+ICsgICAgICAgZG1hX3VubWFwX3NpbmdsZShu ZmMtPmRldiwgZG1hX2FkZHIsIG10ZC0+d3JpdGVzaXplLCBETUFfVE9fREVWSUNFKTsKPiA+ICsg ICAgICAgcnpuMV9uZmNfZGlzX2NvcnJlY3Rpb24obmZjKTsKPiA+ICsgICAgICAgaWYgKHJldCkg ewo+ID4gKyAgICAgICAgICAgICAgIGRldl9lcnIobmZjLT5kZXYsICJXcml0ZSBwYWdlIG9wZXJh dGlvbiBuZXZlciBlbmRpbmdcbiIpOwo+ID4gKyAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4g PiArICAgICAgIH0KPiA+ICsKPiA+ICsgICAgICAgaWYgKG9vYl9yZXF1aXJlZCkgeyAgCj4gCj4g UmV0dXJuIGVhcmx5IGlmICFvb2JfcmVxdWlyZWQsIHRvIHJlZHVjZSBpbmRlbnRhdGlvbiBiZWxv dz8KClllYWggc3VyZS4KCj4gPiArICAgICAgICAgICAgICAgcmV0ID0gbmFuZF9jaGFuZ2Vfd3Jp dGVfY29sdW1uX29wKGNoaXAsIG10ZC0+d3JpdGVzaXplLAo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlwLT5vb2JfcG9pLCBtdGQtPm9vYnNp emUsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGZhbHNlKTsKPiA+ICsgICAgICAgICAgICAgICBpZiAocmV0KQo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgcmV0dXJuIHJldDsKPiA+ICsgICAgICAgfQo+ID4gKwo+ID4gKyAgICAgICByZXR1 cm4gMDsKPiA+ICt9ICAKClsuLi5dCgo+ID4gK3N0YXRpYyBpbnQgcnpuMV9uZmNfcHJvYmUoc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+ICt7Cj4gPiArICAgICAgIHN0cnVjdCByem4x X25mYyAqbmZjOwo+ID4gKyAgICAgICBpbnQgaXJxLCByZXQ7Cj4gPiArCj4gPiArICAgICAgIG5m YyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKm5mYyksIEdGUF9LRVJORUwpOwo+ ID4gKyAgICAgICBpZiAoIW5mYykKPiA+ICsgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsK PiA+ICsKPiA+ICsgICAgICAgbmZjLT5kZXYgPSAmcGRldi0+ZGV2Owo+ID4gKyAgICAgICBuYW5k X2NvbnRyb2xsZXJfaW5pdCgmbmZjLT5jb250cm9sbGVyKTsKPiA+ICsgICAgICAgbmZjLT5jb250 cm9sbGVyLm9wcyA9ICZyem4xX25mY19vcHM7Cj4gPiArICAgICAgIElOSVRfTElTVF9IRUFEKCZu ZmMtPmNoaXBzKTsKPiA+ICsgICAgICAgaW5pdF9jb21wbGV0aW9uKCZuZmMtPmNvbXBsZXRlKTsK PiA+ICsKPiA+ICsgICAgICAgbmZjLT5yZWdzID0gZGV2bV9wbGF0Zm9ybV9pb3JlbWFwX3Jlc291 cmNlKHBkZXYsIDApOwo+ID4gKyAgICAgICBpZiAoSVNfRVJSKG5mYy0+cmVncykpCj4gPiArICAg ICAgICAgICAgICAgcmV0dXJuIFBUUl9FUlIobmZjLT5yZWdzKTsKPiA+ICsKPiA+ICsgICAgICAg cnpuMV9uZmNfZGlzX2ludGVycnVwdHMobmZjKTsKPiA+ICsgICAgICAgaXJxID0gcGxhdGZvcm1f Z2V0X2lycShwZGV2LCAwKTsgIAo+IAo+IHBsYXRmb3JtX2dldF9pcnFfb3B0aW9uYWwoKQo+IAo+ ID4gKyAgICAgICBpZiAoaXJxIDwgMCkgeyAgCj4gCj4gV2hhdCBpZiB0aGlzIGlzIGEgcmVhbCBl cnJvciwgb3IgLUVQUk9CRV9ERUZFUj8KCklmIGl0J3MgYSByZWFsIGVycm9yIEkgYmVsaWV2ZSB3 ZSBzaG91bGQgc3RpbGwgZmFsbGJhY2sgdG8gcG9sbGluZz8gT3IKZG8geW91IHByZWZlciB0byBv bmx5IHVzZSBwb2xsaW5nIG9uIGEgZml4ZWQgY29uZGl0aW9uPwoKSG93ZXZlciBpdCdzIHRydWUg dGhhdCBJIGZvcmdvdCB0byBoYW5kbGUgdGhlIGRlZmVycmVkIGNhc2UgaGVyZS4KCj4gPiArICAg ICAgICAgICAgICAgZGV2X2luZm8oJnBkZXYtPmRldiwgIlVzaW5nIHBvbGxpbmdcbiIpOwo+ID4g KyAgICAgICAgICAgICAgIG5mYy0+dXNlX3BvbGxpbmcgPSB0cnVlOwo+ID4gKyAgICAgICB9IGVs c2Ugewo+ID4gKyAgICAgICAgICAgICAgIHJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRl diwgaXJxLCByem4xX25mY19pcnFfaGFuZGxlciwgMCwKPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICJyem4xLW5hbmQtY29udHJvbGxlciIsIG5mYyk7Cj4gPiArICAg ICAgICAgICAgICAgaWYgKHJldCA8IDApCj4gPiArICAgICAgICAgICAgICAgICAgICAgICByZXR1 cm4gcmV0Owo+ID4gKyAgICAgICB9Cj4gPiArCj4gPiArICAgICAgIHJldCA9IGRtYV9zZXRfbWFz aygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKPiA+ICsgICAgICAgaWYgKHJldCkKPiA+ ICsgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gKwo+ID4gKyAgICAgICBuZmMtPmhjbGsg PSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImhjbGsiKTsKPiA+ICsgICAgICAgaWYgKElTX0VS UihuZmMtPmhjbGspKQo+ID4gKyAgICAgICAgICAgICAgIHJldHVybiBQVFJfRVJSKG5mYy0+aGNs ayk7Cj4gPiArCj4gPiArICAgICAgIG5mYy0+ZWNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2 LCAiZWNsayIpOwo+ID4gKyAgICAgICBpZiAoSVNfRVJSKG5mYy0+ZWNsaykpCj4gPiArICAgICAg ICAgICAgICAgcmV0dXJuIFBUUl9FUlIobmZjLT5lY2xrKTsKPiA+ICsKPiA+ICsgICAgICAgcmV0 ID0gY2xrX3ByZXBhcmVfZW5hYmxlKG5mYy0+aGNsayk7Cj4gPiArICAgICAgIGlmIChyZXQpCj4g PiArICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+ICsKPiA+ICsgICAgICAgcmV0ID0gY2xr X3ByZXBhcmVfZW5hYmxlKG5mYy0+ZWNsayk7Cj4gPiArICAgICAgIGlmIChyZXQpCj4gPiArICAg ICAgICAgICAgICAgZ290byBkaXNhYmxlX2hjbGs7Cj4gPiArCj4gPiArICAgICAgIHJ6bjFfbmZj X2NsZWFyX2ZpZm8obmZjKTsKPiA+ICsKPiA+ICsgICAgICAgcGxhdGZvcm1fc2V0X2RydmRhdGEo cGRldiwgbmZjKTsKPiA+ICsKPiA+ICsgICAgICAgcmV0ID0gcnpuMV9uYW5kX2NoaXBzX2luaXQo bmZjKTsKPiA+ICsgICAgICAgaWYgKHJldCkKPiA+ICsgICAgICAgICAgICAgICBnb3RvIGRpc2Fi bGVfZWNsazsKPiA+ICsKPiA+ICsgICAgICAgcmV0dXJuIDA7Cj4gPiArCj4gPiArZGlzYWJsZV9l Y2xrOgo+ID4gKyAgICAgICBjbGtfZGlzYWJsZV91bnByZXBhcmUobmZjLT5lY2xrKTsKPiA+ICtk aXNhYmxlX2hjbGs6Cj4gPiArICAgICAgIGNsa19kaXNhYmxlX3VucHJlcGFyZShuZmMtPmhjbGsp Owo+ID4gKwo+ID4gKyAgICAgICByZXR1cm4gcmV0Owo+ID4gK30gIAo+IAo+ID4gK3N0YXRpYyBj b25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJ6bjFfbmZjX2lkX3RhYmxlW10gPSB7Cj4gPiArICAg ICAgIHsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxyOWEwNmcwMzItbmFuZC1jb250cm9sbGVyIiB9 LCAgCj4gCj4gR2l2ZW4gbXkgY29tbWVudCBvbiB0aGUgYmluZGluZ3MsIHlvdSBwcm9iYWJseSB3 YW50IHRvIG1hdGNoIGFnYWluc3QKPiAicmVuZXNhcyxyem4xLW5hbmQtY29udHJvbGxlciIgaW5z dGVhZC4KClN1cmUuCgo+IAo+ID4gKyAgICAgICB7fSAvKiBzZW50aW5lbCAqLwo+ID4gK307Cj4g PiArTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbmZjX2lkX3RhYmxlKTsKPiA+ICsKPiA+ICtzdGF0 aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByem4xX25mY19kcml2ZXIgPSB7Cj4gPiArICAgICAg IC5kcml2ZXIgPSB7Cj4gPiArICAgICAgICAgICAgICAgLm5hbWUgICA9ICJyZW5lc2FzLW5mYyIs ICAKPiAKPiBQZXJoYXBzIHMvbmZjL25hbmRjLyBldmVyeXdoZXJlLCB0byBhdm9pZCBjb25mdXNp b24gd2l0aCB0aGUgb3RoZXIgbmZjPwoKVGhlcmUgYXJlIG1hbnkgTkFORCBjb250cm9sbGVyIGRy aXZlcnMgdGhhdCBhcmUgYWJicmV2aWF0ZWQgd2l0aCBuZmMKYmVjYXVzZSBpdCdzIHNob3J0IGFu ZCBlYXN5IHRvIHdyaXRlIHdoaWxlIHN0aWxsIHByZWNpc2UsIGJ1dCBJIGhhdmUgbm8KaXNzdWUg cmV3b3JkaW5nIG5mYyBpbnRvIG5hbmRjIGlmIHlvdSBwcmVmZXIuCgo+ID4gKyAgICAgICAgICAg ICAgIC5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihyem4xX25mY19pZF90YWJsZSksCj4g PiArICAgICAgIH0sCj4gPiArICAgICAgIC5wcm9iZSA9IHJ6bjFfbmZjX3Byb2JlLAo+ID4gKyAg ICAgICAucmVtb3ZlID0gcnpuMV9uZmNfcmVtb3ZlLAo+ID4gK307Cj4gPiArbW9kdWxlX3BsYXRm b3JtX2RyaXZlcihyem4xX25mY19kcml2ZXIpOyAgCj4gCgpUaGFua3MsCk1pcXXDqGwKCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJu ZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRw Oi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK