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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id 01855CED27C for ; Tue, 8 Oct 2024 08:57:05 +0000 (UTC) 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=iMTQY5uWV2KA51vIYAAe0jn8l9Q26Hf2t3HAgCG6ZWI=; b=Jo6DV7Y5/7I6f5 GCy+0cf77Z7sBfqapo56JwMscq6PdXKgLvBxQVYFex5iDYmOaIJUsc+fB38m3joeXLKHh3gcOC/Oc 5BcxCp0WEK9cCBq9YFnsKVbaNx3bJr5qa0c0gmgSP/G/lzawJxU9c9eRuz2C5VsI4G85/rVvtyyjJ 9TV3ora7QcCRtZfUUQ6Z9WC6RN8uFWOK5gKCbJzqwNd04NNGgH/Kva6chxkkKBt/IAxFFcisAMC29 Y4xlvP/OALfCE694wIxcHml4NBFDIFs2qrtSxV68abLrWsx0PYgiqlKytw7XfVFYarg3qji3zFTu8 P7OZFmvfxvUpmatnE+nQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1sy61g-00000005Akx-0Xd9; Tue, 08 Oct 2024 08:57:04 +0000 Received: from relay6-d.mail.gandi.net ([217.70.183.198]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1sy5xM-000000059YG-0hFD; Tue, 08 Oct 2024 08:52:39 +0000 Received: by mail.gandi.net (Postfix) with ESMTPSA id 68321C0008; Tue, 8 Oct 2024 08:52:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1728377552; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=BblGE6WTuC3EcDgLDgj8Gh9/9mU9eFyYH4IyM8CF5wY=; b=nq3yAv+8K3pMFYPI8bpJwFUc135b4BHyKOv1ozQhmzc5//Vzeq08/qk6WbO9dOxfOY/CSC U+707VPaHTBFuhB/MoWaRAFErBgavxDZ2CxRrCfkHEtzEstOfaZ5b2hBAeY6Z8UKgHysJV h1B3+0MMG3AGbFjK5LeyXFnJ13uWnCNsn+TRURB+gFzXoDfS4Uhlg1Ho3SqTgBK5juR1go 5lrvOMUfveqw+ypUfXUA/TjlvyobvD5o6YA590hPcpKkF3RR4/sKAgNqwzaerOVEbr0rdg /ymHwzg3b7DE5IgRup60mjY8H0tGindlLmh/77uew+DfU3uHHTgjygaW7Pvq7A== Date: Tue, 8 Oct 2024 10:52:30 +0200 From: Miquel Raynal To: Hui-Ping Chen Cc: richard@nod.at, vigneshr@ti.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, nikita.shubin@maquefel.me, arnd@arndb.de, vkoul@kernel.org, esben@geanix.com, linux-arm-kernel@lists.infradead.org, linux-mtd@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v6 2/2] mtd: rawnand: nuvoton: add new driver for the Nuvoton MA35 SoC Message-ID: <20241008105230.7fd25438@xps-13> In-Reply-To: <8d5e7755-17fd-4860-bcb0-8c1de04bf0c5@gmail.com> References: <20240927020749.46791-1-hpchen0nvt@gmail.com> <20240927020749.46791-3-hpchen0nvt@gmail.com> <20241001215755.5c2f8465@xps-13> <8d5e7755-17fd-4860-bcb0-8c1de04bf0c5@gmail.com> Organization: Bootlin X-Mailer: Claws Mail 4.2.0 (GTK 3.24.41; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-GND-Sasl: miquel.raynal@bootlin.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20241008_015236_501393_3F676C48 X-CRM114-Status: GOOD ( 42.92 ) 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 SGkgSHVpLVBpbmcsCgo+ID4+ICsJCXJldHVybiAwOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCW1h MzVfbmFuZF9kbWFjX2luaXQobmFuZCk7Cj4gPj4gKwo+ID4+ICsJd3JpdGVsKG10ZC0+b29ic2l6 ZSwgbmFuZC0+cmVncyArIE1BMzVfTkZJX1JFR19OQU5EUkFDVEwpOwo+ID4+ICsKPiA+PiArCS8q IHNldHVwIGFuZCBzdGFydCBETUEgdXNpbmcgZG1hX2FkZHIgKi8KPiA+PiArCWRtYV9hZGRyID0g ZG1hX21hcF9zaW5nbGUobmFuZC0+ZGV2LCAodm9pZCAqKWFkZHIsIGxlbiwgRE1BX0ZST01fREVW SUNFKTsKPiA+PiArCXJldCA9IGRtYV9tYXBwaW5nX2Vycm9yKG5hbmQtPmRldiwgZG1hX2FkZHIp Owo+ID4+ICsJaWYgKHJldCkgewo+ID4+ICsJCWRldl9lcnIobmFuZC0+ZGV2LCAiZG1hIG1hcHBp bmcgZXJyb3JcbiIpOwo+ID4+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4+ICsJfQo+ID4+ICsKPiA+ PiArCXdyaXRlbCgodW5zaWduZWQgbG9uZylkbWFfYWRkciwgbmFuZC0+cmVncyArIE1BMzVfTkZJ X1JFR19ETUFTQSk7ICAKPiA+IFBsZWFzZSBlbmZvcmNlIGEgZG1hIG1hc2sgb2YgMzIgKGV2ZW4g dGhvdWdoIGl0IG1pZ2h0IGJlIHRoZSBmYXVsdCkuICAKPiAKPiBJIHdpbGwgY2hhbmdlIGl0IHRv IGRtYV9hZGRyICYgMHhmZmZmZmZmZi4KClRoYXQncyBub3Qgd2hhdCBJIG1lYW4sIEkgYmVsaWV2 ZSB5b3Ugc2hvdWxkIHVzZSB0aGUgZG1hIEFQSSB0byBhc2sgZm9yCmEgbWFwcGluZyB3aXRoaW4g dGhlIGFjY2Vzc2libGUgMzItYml0IGFkZHJlc3MgcmFuZ2UuIFRoZQpkbWFfbWFwcGluZ19lcnJv cigpIGNoZWNrIHNob3VsZCByZXR1cm4gYW4gZXJyb3IgaWYgdGhhdCdzIG5vdCB0aGUKY2FzZS4g VGhlbiB5b3UgY2FuIHNhZmVseSB3cml0ZSB0aGUgdmFsdWUuCgo+ID4+ICsJd3JpdGVsKHJlYWRs KG5hbmQtPnJlZ3MgKyBNQTM1X05GSV9SRUdfTkFORENUTCkgfCBETUFfUl9FTiwKPiA+PiArCQlu YW5kLT5yZWdzICsgTUEzNV9ORklfUkVHX05BTkRDVEwpOwo+ID4+ICsJcmV0ID0gd2FpdF9mb3Jf Y29tcGxldGlvbl90aW1lb3V0KCZuYW5kLT5jb21wbGV0ZSwgbXNlY3NfdG9famlmZmllcygxMDAw KSk7Cj4gPj4gKwlpZiAoIXJldCkgewo+ID4+ICsJCWRldl9lcnIobmFuZC0+ZGV2LCAicmVhZCB0 aW1lb3V0XG4iKTsKPiA+PiArCQlyZXQgPSAtRVRJTUVET1VUOwo+ID4+ICsJfQo+ID4+ICsKPiA+ PiArCWRtYV91bm1hcF9zaW5nbGUobmFuZC0+ZGV2LCBkbWFfYWRkciwgbGVuLCBETUFfRlJPTV9E RVZJQ0UpOwo+ID4+ICsKPiA+PiArCXJlZyA9IHJlYWRsKG5hbmQtPnJlZ3MgKyBNQTM1X05GSV9S RUdfTkFORElOVFNUUyk7Cj4gPj4gKwlpZiAocmVnICYgSU5UX0VDQykgewo+ID4+ICsJCWNudCA9 IG1hMzVfbmZpX2VjY19jaGVjaygmbmFuZC0+Y2hpcCwgYWRkcik7Cj4gPj4gKwkJaWYgKGNudCA8 IDApIHsKPiA+PiArCQkJbXRkLT5lY2Nfc3RhdHMuZmFpbGVkKys7Cj4gPj4gKwkJCXdyaXRlbChE TUFfUlNUIHwgRE1BX0VOLCBuYW5kLT5yZWdzICsgTUEzNV9ORklfUkVHX0RNQUNUTCk7Cj4gPj4g KwkJCXdyaXRlbChyZWFkbChuYW5kLT5yZWdzICsgTUEzNV9ORklfUkVHX05BTkRDVEwpIHwgU1dS U1QsCj4gPj4gKwkJCQluYW5kLT5yZWdzICsgTUEzNV9ORklfUkVHX05BTkRDVEwpOwo+ID4+ICsJ CX0gZWxzZSB7Cj4gPj4gKwkJCW10ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCArPSBjbnQ7Cj4gPj4g KwkJCW5hbmQtPmJpdGZsaXBzID0gY250Owo+ID4+ICsJCX0KPiA+PiArCQl3cml0ZWwoSU5UX0VD QywgbmFuZC0+cmVncyArIE1BMzVfTkZJX1JFR19OQU5ESU5UU1RTKTsKPiA+PiArCX0KPiA+PiAr Cj4gPj4gKwlyZXR1cm4gcmV0Owo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50IG1hMzVf bmFuZF93cml0ZV9wYWdlX2h3ZWNjKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGNvbnN0IHU4ICpi dWYsCj4gPj4gKwkJCQkgICAgICBpbnQgb29iX3JlcXVpcmVkLCBpbnQgcGFnZSkKPiA+PiArewo+ ID4+ICsJc3RydWN0IG10ZF9pbmZvICptdGQgPSBuYW5kX3RvX210ZChjaGlwKTsKPiA+PiArCXZv aWQgKmVjY19jYWxjID0gY2hpcC0+ZWNjLmNhbGNfYnVmOwo+ID4+ICsKPiA+PiArCW1hMzVfY2xl YXJfc3BhcmUoY2hpcCwgbXRkLT5vb2JzaXplKTsKPiA+PiArCW1hMzVfd3JpdGVfc3BhcmUoY2hp cCwgbXRkLT5vb2JzaXplIC0gY2hpcC0+ZWNjLnRvdGFsLAo+ID4+ICsJCQkodTMyICopY2hpcC0+ b29iX3BvaSk7Cj4gPj4gKwo+ID4+ICsJbmFuZF9wcm9nX3BhZ2VfYmVnaW5fb3AoY2hpcCwgcGFn ZSwgMCwgYnVmLCBtdGQtPndyaXRlc2l6ZSk7Cj4gPj4gKwluYW5kX3Byb2dfcGFnZV9lbmRfb3Ao Y2hpcCk7Cj4gPj4gKwo+ID4+ICsJLyogQ29weSBwYXJpdHkgY29kZSBpbiBOQU5EUkEgdG8gY2Fs YyAqLwo+ID4+ICsJbWEzNV9yZWFkX3NwYXJlKGNoaXAsIGNoaXAtPmVjYy50b3RhbCwgKHUzMiAq KWVjY19jYWxjLAo+ID4+ICsJCQltdGQtPm9vYnNpemUgLSBjaGlwLT5lY2MudG90YWwpOwo+ID4+ ICsKPiA+PiArCS8qIENvcHkgcGFyaXR5IGNvZGUgaW4gY2FsYyB0byBvb2JfcG9pICovCj4gPj4g KwltZW1jcHkoY2hpcC0+b29iX3BvaSArIChtdGQtPm9vYnNpemUgLSBjaGlwLT5lY2MudG90YWwp LAo+ID4+ICsJCWVjY19jYWxjLCBjaGlwLT5lY2MudG90YWwpOwo+ID4+ICsKPiA+PiArCXJldHVy biAwOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50IG1hMzVfbmFuZF9yZWFkX3BhZ2Vf aHdlY2Moc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgdTggKmJ1ZiwKPiA+PiArCQkJCQlpbnQgb29i X3JlcXVpcmVkLCBpbnQgcGFnZSkKPiA+PiArewo+ID4+ICsJc3RydWN0IG1hMzVfbmFuZF9pbmZv ICpuYW5kID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ID4+ICsJc3RydWN0IG10 ZF9pbmZvICptdGQgPSBuYW5kX3RvX210ZChjaGlwKTsKPiA+PiArCXUzMiByZWc7Cj4gPj4gKwo+ ID4+ICsJLyogcmVhZCB0aGUgT09CIGFyZWEgICovCj4gPj4gKwluYW5kX3JlYWRfb29iX29wKGNo aXAsIHBhZ2UsIDAsIGNoaXAtPm9vYl9wb2ksIG10ZC0+b29ic2l6ZSk7Cj4gPj4gKwluYW5kLT5i aXRmbGlwcyA9IDA7ICAKPiA+IFdoeSBzdG9yaW5nIHRoaXMgdmFsdWUgaW4geW91ciBzdHJ1Y3R1 cmU/ICAKPiAKPiBCZWNhdXNlIGVjYy5yZWFkX3BhZ2UgbmVlZHMgdG8gcmV0dXJuIGJpdCBmbGlw cywgaXQgaXMgbmVjZXNzYXJ5IHRvIGxvZyB0aGVtLgoKSSBiZWxpZXZlIHlvdSBkb24ndCBuZWVk IGJpdGZsaXBzIHRvIGJlIHBhcnQgb2YgdGhlIG1hMzVfbmFuZF9pbmZvCnN0cnVjdHVyZS4KCj4g Pj4gKwo+ID4+ICsJLyogY29weSBPT0IgZGF0YSB0byBOQU5EUkEgZm9yIHBhZ2UgcmVhZCAqLwo+ ID4+ICsJbWEzNV93cml0ZV9zcGFyZShjaGlwLCBtdGQtPm9vYnNpemUsICh1MzIgKiljaGlwLT5v b2JfcG9pKTsKPiA+PiArCj4gPj4gKwlyZWcgPSByZWFkbChuYW5kLT5yZWdzICsgTUEzNV9ORklf UkVHX05BTkRSQTApOwo+ID4+ICsJaWYgKHJlZyAmIDB4ZmZmZjAwMDApIHsKPiA+PiArCQltZW1z ZXQoKHZvaWQgKilidWYsIDB4ZmYsIG10ZC0+d3JpdGVzaXplKTsKPiA+PiArCX0gZWxzZSB7Cj4g Pj4gKwkJLyogcmVhZCBkYXRhIGZyb20gbmFuZCAqLwo+ID4+ICsJCW5hbmRfcmVhZF9wYWdlX29w KGNoaXAsIHBhZ2UsIDAsIGJ1ZiwgbXRkLT53cml0ZXNpemUpOyAgCj4gPiByZXQgPQo+ID4gaWYg KHJldCkKPiA+IAkuLi4gIAo+IAo+IEkgd2lsbCBhZGQgYSByZXR1cm4gdmFsdWUgaGVyZS4KPiAK PiAKPiA+PiArCj4gPj4gKwkJLyogcmVzdG9yZSBPT0IgZGF0YSBmcm9tIFNNUkEgKi8KPiA+PiAr CQltYTM1X3JlYWRfc3BhcmUoY2hpcCwgbXRkLT5vb2JzaXplLCAodTMyICopY2hpcC0+b29iX3Bv aSwgMCk7ICAKPiA+Cj4gPiBzYW1lICAKPiAKPiBtYTM1X3JlYWRfc3BhcmUoKSBpcyBkZWNsYXJl ZCBhcyB2b2lkLCB3aXRoIG5vIHJldHVybiB2YWx1ZS4KPiAKPiBTTVJBIHdpbGwgYmUgY2hhbmdl ZCB0byBOQU5EUkEgcmVnaXN0ZXJzLgo+IAo+IAo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCXJldHVy biBuYW5kLT5iaXRmbGlwczsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBtYTM1X25h bmRfcmVhZF9vb2JfaHdlY2Moc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgaW50IHBhZ2UpCj4gPj4g K3sKPiA+PiArCXN0cnVjdCBtYTM1X25hbmRfaW5mbyAqbmFuZCA9IG5hbmRfZ2V0X2NvbnRyb2xs ZXJfZGF0YShjaGlwKTsKPiA+PiArCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gbmFuZF90b19tdGQo Y2hpcCk7Cj4gPj4gKwl1MzIgcmVnOwo+ID4+ICsKPiA+PiArCW5hbmRfcmVhZF9vb2Jfb3AoY2hp cCwgcGFnZSwgMCwgY2hpcC0+b29iX3BvaSwgbXRkLT5vb2JzaXplKTsKPiA+PiArCj4gPj4gKwkv KiBjb3B5IE9PQiBkYXRhIHRvIE5BTkRSQSBmb3IgcGFnZSByZWFkICovICAKPiA+IFdoYXQgaXMg TkFORFJBPyBkb2VzIG5vdCBtZWFuIGFueXRoaW5nIHRvIG1lLiAgCj4gCj4gTkFORFJBIGlzIHRo ZSBSZWR1bmRhbnQgQXJlYSBXb3JkIG9mIHRoZSBNQTM1IE5BTkQgY29udHJvbGxlci4KCk5BTkRS QSBpcyBzcGVjaWZpYyB0byB5b3VyIGNvbnRyb2xsZXIuICJyZWR1bmRhbnQgYXJlYSIgaXMgYWxy ZWFkeSBtb3JlCnVuZGVyc3RhbmRhYmxlLgoKPiAKPiBUaGUgY29udHJvbGxlciByZWFkcyBFQ0Mg cGFyaXR5IGZyb20gdGhpcyBhcmVhIGZvciBjYWxjdWxhdGlvbnMgb3IgdXNlcyB0aGUgaW5mb3Jt YXRpb24gZm9yIGNoZWNrLgoKVGhpcyBpcyB3aGF0IHdlIGdlbmVyaWNhbGx5IGNhbGwgdGhlICJF Q0MgYnl0ZXMvYXJlYSIgSSBndWVzcz8KCj4gCj4gSSB3aWxsIGNoYW5nZSBOQU5EUkEgdG8gTkFO RFJBIHJlZ2lzdGVycy4KPiAKPiAKPiA+PiArCW1hMzVfd3JpdGVfc3BhcmUoY2hpcCwgbXRkLT5v b2JzaXplLCAodTMyICopY2hpcC0+b29iX3BvaSk7Cj4gPj4gKwo+ID4+ICsJcmVnID0gcmVhZGwo bmFuZC0+cmVncyArIE1BMzVfTkZJX1JFR19OQU5EUkEwKTsKPiA+PiArCWlmIChyZWcgJiAweGZm ZmYwMDAwKQo+ID4+ICsJCW1lbXNldCgodm9pZCAqKWNoaXAtPm9vYl9wb2ksIDB4ZmYsIG10ZC0+ b29ic2l6ZSk7ICAKPiA+IFdoYXQgZG9lcyB0aGlzIG1lYW4/ICAKPiAKPiBNQTM1IE5BTkQgY29u dHJvbGxlciBjaGVja3Mgb29iIGJ5dGVzIDIgYW5kIDMuCj4gCj4gSWYgdGhpcyBwYWdlIGhhcyBi ZWVuIHdyaXR0ZW4sIG9vYiBieXRlcyAyIGFuZCAzIHdpbGwgYmUgc2V0IHRvIDAuCj4gCj4gVGhl cmVmb3JlLCBpZiBieXRlcyAyIGFuZCAzIGFyZSBub3QgMCwgaXQgaW5kaWNhdGVzIGFuIGVtcHR5 IHBhZ2UsIGFuZCBpdCB3aWxsIHJldHVybiAweGZmLgoKT2ssIHBsZWFzZSBkZWZpbmUgYSBtYWNy byBmb3IgdGhhdCwgc29tZXRoaW5nIGFsb25nOgoKI2RlZmluZSBQUkVGSVhfUkFfSEFTX0JFRU5f V1JJVFRFTihyZWcpIEZJRUxEX0dFVChHRU5NQVNLKC4uKSwgKHJlZykpCgppZiAoIVBSRUZJWF9S QV9IQVNfQkVFTl9XUklUVEVOKHJlZykpCgltZW1zZXQoKTsKCj4gCj4gCj4gPj4gKwo+ID4+ICsJ cmV0dXJuIDA7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBpcnFyZXR1cm5fdCBtYTM1X25h bmRfaXJxKGludCBpcnEsIHZvaWQgKmlkKQo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgbWEzNV9uYW5k X2luZm8gKm5hbmQgPSAoc3RydWN0IG1hMzVfbmFuZF9pbmZvICopaWQ7Cj4gPj4gKwl1MzIgaXNy Owo+ID4+ICsKPiA+PiArCWlzciA9IHJlYWRsKG5hbmQtPnJlZ3MgKyBNQTM1X05GSV9SRUdfTkFO RElOVFNUUyk7Cj4gPj4gKwlpZiAoaXNyICYgSU5UX0RNQSkgewo+ID4+ICsJCXdyaXRlbChJTlRf RE1BLCBuYW5kLT5yZWdzICsgTUEzNV9ORklfUkVHX05BTkRJTlRTVFMpOwo+ID4+ICsJCWNvbXBs ZXRlKCZuYW5kLT5jb21wbGV0ZSk7Cj4gPj4gKwl9ICAKPiA+IEkgZ3Vlc3MgYSBtb3JlIGZ1dHVy ZSBwcm9vZiBpbXBsZW1lbnRhdGlvbiB3b3VsZCBhbHdheXMgd3JpdGVsKGlzcik7IHRvCj4gPiBz aWxlbmNlIHRoZSBpbnRlcnJ1cHQuIE90aGVyd2lzZSBvZiBjb3Vyc2UgeW91IG11c3QgY2FsbCBj b21wbGV0ZSgpCj4gPiBvbmx5IHVwb24gaXNyICYgSU5UX0RNQS4gIAo+IAo+IFRoaXMgcGFydCBj YW4gcmVtb3ZlIHRoZSBpZigpLCBidXQgd3JpdGVsKGlzcikgaXMgbm90IGZlYXNpYmxlLgo+IAo+ IFRoZSBpc3IgbWF5IGNvbnRhaW4gdGhlIEVDQyBmbGFnLCBhbmQgY2xlYXJpbmcgaXQgY291bGQg Y2F1c2UgYSBtaXNzIGluIEVDQyBoYW5kbGluZy4KPiAKPiBJIHdpbGwgY2hhbmdlIGl0IHRvOgo+ IAo+ICDCoMKgwqAgd3JpdGVsKElOVF9ETUEsIG5hbmQtPnJlZ3MgKyBNQTM1X05GSV9SRUdfTkFO RElOVFNUUyk7Cj4gIMKgwqDCoCBjb21wbGV0ZSgmbmFuZC0+Y29tcGxldGUpOwoKSW4gdGhpcyBj YXNlIGtlZXAgdGhlIGlmKCkgYnV0IGJlIHN1cmUgdG8gaGFuZGxlIHRoZSB0aW1lb3V0IGNvcnJl Y3RseS4KPiAKPiAKPiA+PiArCj4gPj4gKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cj4gPj4gK30KPiA+ PiArCj4gPj4gK3N0YXRpYyBpbnQgbWEzNV9uYW5kX2F0dGFjaF9jaGlwKHN0cnVjdCBuYW5kX2No aXAgKmNoaXApCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBtYTM1X25hbmRfaW5mbyAqbmFuZCA9IG5h bmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsKPiA+PiArCXN0cnVjdCBtdGRfaW5mbyAqbXRk ID0gbmFuZF90b19tdGQoY2hpcCk7Cj4gPj4gKwl1bnNpZ25lZCBpbnQgcmVnOwo+ID4+ICsKPiA+ PiArCWlmIChjaGlwLT5vcHRpb25zICYgTkFORF9CVVNXSURUSF8xNikgewo+ID4+ICsJCWRldl9l cnIobmFuZC0+ZGV2LCAiMTYgYml0cyBidXMgd2lkdGggbm90IHN1cHBvcnRlZCIpOwo+ID4+ICsJ CXJldHVybiAtRUlOVkFMOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCS8qIHN1cHBvcnQgb25seSBl Y2MgaHcgbW9kZSAqLyAgCj4gPiBXaHkgPyBQbGVhc2UgZG9uJ3QuICAKPiAKPiBJIHdpbGwgYWRk IGhhbmRsaW5nIGZvciBvdGhlciBjYXNlcy4KPiAKPiAKPiA+PiArCWlmIChjaGlwLT5lY2MuZW5n aW5lX3R5cGUgIT0gTkFORF9FQ0NfRU5HSU5FX1RZUEVfT05fSE9TVCkgewo+ID4+ICsJCWRldl9l cnIobmFuZC0+ZGV2LCAiZWNjLmVuZ2luZV90eXBlIG5vdCBzdXBwb3J0ZWRcbiIpOwo+ID4+ICsJ CXJldHVybiAtRUlOVkFMOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCW5hbmQtPmVjY19idWYgPSBk ZXZtX2t6YWxsb2MobmFuZC0+ZGV2LCBtdGQtPndyaXRlc2l6ZSArIG10ZC0+b29ic2l6ZSwKPiA+ PiArCQkJCQlHRlBfS0VSTkVMKTsKPiA+PiArCWlmICghbmFuZC0+ZWNjX2J1ZikKPiA+PiArCQly ZXR1cm4gIC1FTk9NRU07Cj4gPj4gKwljaGlwLT5lY2MuY2FsY19idWYgPSBuYW5kLT5lY2NfYnVm OyAgCj4gPiBBcmUgeW91IHN1cmUgeW91IG5lZWQgdGhpcz8gSSBkb24ndCBzZWUgdGhlIHBvaW50 LiAgCj4gCj4gVGhpcyBpcyB1bm5lY2Vzc2FyeTsgSSB3aWxsIHJlbW92ZSBpdC4KPiAKPiAKPiA+ PiArCj4gPj4gKwkvKiBTZXQgUFNpemUgKi8KPiA+PiArCXJlZyA9IHJlYWRsKG5hbmQtPnJlZ3Mg KyBNQTM1X05GSV9SRUdfTkFORENUTCkgJiAoflBTSVpFX01BU0spOwo+ID4+ICsJaWYgKG10ZC0+ d3JpdGVzaXplID09IDIwNDgpCj4gPj4gKwkJd3JpdGVsKHJlZyB8IFBTSVpFXzJLLCBuYW5kLT5y ZWdzICsgTUEzNV9ORklfUkVHX05BTkRDVEwpOwo+ID4+ICsJZWxzZSBpZiAobXRkLT53cml0ZXNp emUgPT0gNDA5NikKPiA+PiArCQl3cml0ZWwocmVnIHwgUFNJWkVfNEssIG5hbmQtPnJlZ3MgKyBN QTM1X05GSV9SRUdfTkFORENUTCk7Cj4gPj4gKwllbHNlIGlmIChtdGQtPndyaXRlc2l6ZSA9PSA4 MTkyKQo+ID4+ICsJCXdyaXRlbChyZWcgfCBQU0laRV84SywgbmFuZC0+cmVncyArIE1BMzVfTkZJ X1JFR19OQU5EQ1RMKTsKPiA+PiArCj4gPj4gKwljaGlwLT5lY2Muc3RlcHMgPSBtdGQtPndyaXRl c2l6ZSAvIGNoaXAtPmVjYy5zaXplOwo+ID4+ICsJaWYgKGNoaXAtPmVjYy5zdHJlbmd0aCA9PSAw KSB7Cj4gPj4gKwkJbmFuZC0+YmNoID0gQkNIX05PTkU7IC8qIE5vIEVDQyAqLwo+ID4+ICsJCWNo aXAtPmVjYy50b3RhbCA9IDA7Cj4gPj4gKwl9IGVsc2UgaWYgKGNoaXAtPmVjYy5zdHJlbmd0aCA8 PSA4KSB7Cj4gPj4gKwkJbmFuZC0+YmNoID0gQkNIX1Q4OyAvKiBUOCAqLyAgCj4gPiBiY2ggaXMg cHJvYmFibHkgYSBiYWQgbmFtZSwgYW5kIGluIGdlbmVyYWwgSSBkb24ndCBzZWUgdGhlIHBvaW50 IG9mCj4gPiBzYXZpbmcgdGhpcyB2YWx1ZS4gSnVzdCBjaGVjayB0aGUgRUNDIHN0cmVuZ3RoIGlu IHRoZSBhYm92ZSBzd2l0Y2gKPiA+IGNhc2VzIGFuZCBkb24ndCB1c2UgdGhpcyBpbnRlcm1lZGlh dGUgdmFyaWFibGUuICAKPiAKPiBJIHdpbGwgY2hhbmdlIGl0IHRvIGRpcmVjdGx5IHVzZSBlY2Mu c3RyZW5ndGggZm9yIHRoZSBjaGVjay4KPiAKPiAKPiA+PiArCQljaGlwLT5lY2MudG90YWwgPSBj aGlwLT5lY2Muc3RlcHMgKiBNQTM1X1BBUklUWV9CQ0g4Owo+ID4+ICsJfSBlbHNlIGlmIChjaGlw LT5lY2Muc3RyZW5ndGggPD0gMTIpIHsKPiA+PiArCQluYW5kLT5iY2ggPSBCQ0hfVDEyOyAvKiBU MTIgKi8KPiA+PiArCQljaGlwLT5lY2MudG90YWwgPSBjaGlwLT5lY2Muc3RlcHMgKiBNQTM1X1BB UklUWV9CQ0gxMjsKPiA+PiArCX0gZWxzZSBpZiAoY2hpcC0+ZWNjLnN0cmVuZ3RoIDw9IDI0KSB7 Cj4gPj4gKwkJbmFuZC0+YmNoID0gQkNIX1QyNDsgLyogVDI0ICovCj4gPj4gKwkJY2hpcC0+ZWNj LnRvdGFsID0gY2hpcC0+ZWNjLnN0ZXBzICogTUEzNV9QQVJJVFlfQkNIMjQ7Cj4gPj4gKwl9IGVs c2Ugewo+ID4+ICsJCWRldl93YXJuKG5hbmQtPmRldiwgIk5BTkQgQ29udHJvbGxlciBpcyBub3Qg c3VwcG9ydCB0aGlzIGZsYXNoLiAoJWQsICVkKVxuIiwKPiA+PiArCQkJbXRkLT53cml0ZXNpemUs IG10ZC0+b29ic2l6ZSk7ICAKPiA+IFRoaXMgbXVzdCBiZSBhIGRldl9lcnIoKSBhbmQgcmV0dXJu IGFuIGVycm9yIGltbWVkaWF0ZWx5Lgo+ID4KPiA+IEFsc28gdGhlIHN0cmluZyBpcyBub3QgY29y cmVjdC4gIAo+IAo+IEkgd2lsbCBjaGFuZ2UgaXQgdG86Cj4gCj4gIMKgwqDCoMKgwqDCoMKgIGRl dl9lcnIobmFuZC0+ZGV2LCAiRUNDIHN0cmVuZ3RoIGVycm9yXG4iKTsKCgkJCQkJICAgIHVuc3Vw cG9ydGVkCgo+ICDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVJTlZBTDsKPiAKPiAKCi4uLgoKPiAK PiA+PiArCj4gPj4gK3N0YXRpYyBpbnQgbWEzNV9uZmNfZXhlY19vcChzdHJ1Y3QgbmFuZF9jaGlw ICpjaGlwLAo+ID4+ICsJCQkgIGNvbnN0IHN0cnVjdCBuYW5kX29wZXJhdGlvbiAqb3AsCj4gPj4g KwkJCSAgYm9vbCBjaGVja19vbmx5KQo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgbWEzNV9uYW5kX2lu Zm8gKm5hbmQgPSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4gPj4gKwlpbnQgcmV0 ID0gMDsKPiA+PiArCXUzMiBpLCByZWc7Cj4gPj4gKwo+ID4+ICsJaWYgKGNoZWNrX29ubHkpCj4g Pj4gKwkJcmV0dXJuIDA7Cj4gPj4gKwo+ID4+ICsJbWEzNV9uYW5kX3RhcmdldF9lbmFibGUobmFu ZCk7Cj4gPj4gKwo+ID4+ICsJcmVnID0gcmVhZGwobmFuZC0+cmVncyArIE1BMzVfTkZJX1JFR19O QU5ESU5UU1RTKTsKPiA+PiArCXJlZyB8PSBJTlRfUkIwOyAgCj4gPiBUaGlzIFJCIHBpbiBsb29r cyBsaWtlIHNvbWV0aGluZyBoYXJkY29kZWQsIHdoZXJlYXMgaXQgc2hvdWxkIG5vdCA6LSkKPiA+ Cj4gPiBJZiB5b3UgaGF2ZSBzZXZlcmFsIFJCLCBpdCBtZWFucyB5b3UgaGF2ZSBzZXZlcmFsIENT IGFzIHdlbGwhICAKPiAKPiBUaGUgTUEzNSBOQU5EIGNvbnRyb2xsZXIgaXMgaW5kZWVkIGV4cGVj dGVkIHRvIHN1cHBvcnQgdHdvIHNldHMgb2YgQ1MgYW5kIFJCLgo+IAo+IEhvd2V2ZXIsIGN1cnJl bnRseSwgdGhlIE1BMzUgc2VyaWVzIG9ubHkgc3VwcG9ydHMgb25lIHNldCwgc28gdGhpcyBuYW1l IHdpbGwgYmUgY2hhbmdlZCB0byBSQi4KCk5vLCBwbGVhc2UgdXNlIHRoZSBjb3JyZWN0IG5hbWVz IGZvciBSQiBhbmQgQ1MsIGJ1dCBwbGVhc2UgcmVhZCB0aGUKdmFsdWUgb2YgdGhlIHJpZ2h0IFJC IGFuZCByaWdodCBDUyBmcm9tIHRoZSBEVCAocmVnIGFuZCBuYW5kLXJiKS4gVGhlc2UKcHJvcGVy dGllcyBhcmUgc3RhbmRhcmQgYW5kIGNhbiBiZSB1c2VkIHRvIHVzZSBlZyBDUzEgYW5kIFJCMS4g SW4gdGhpcwpjYXNlIHRoZSB3aG9sZSBkcml2ZXIgbG9naWMgaXMgdGhlIHNhbWUsIHRoZXJlIGlz IGEgc2luZ2xlIENTCnN1cHBvcnRlZCwgYnV0IGl0IGJlY29tZXMgY29ycmVjdCBiZWNhdXNlIHlv dSBkb24ndCBzaWxlbnRseSBhc3N1bWUgQ1MwCmFuZCBSQjAgd2lsbCBhbHdheXMgYmUgdXNlZCAo eW91IHdvdWxkIGJlIHN1cnByaXNlZCBieSB0aGUgbnVtYmVyIG9mCmRlc2lnbnMgbm90IHVzaW5n IHRoZSBmaXJzdCBDUy9SQikuIEl0J3MganVzdCBhIGJpdCBvZiBhZGRpdGlvbmFsCmxvZ2ljLCBu b3RoaW5nIGNvbXBsZXggaGVyZS4KCgouLi4KCj4gPj4gKwo+ID4+ICsJbXRkID0gbmFuZF90b19t dGQoY2hpcCk7Cj4gPj4gKwltdGQtPnByaXYgPSBjaGlwOwo+ID4+ICsJbXRkLT5vd25lciA9IFRI SVNfTU9EVUxFOwo+ID4+ICsJbXRkLT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKPiA+PiArCj4g Pj4gKwl3cml0ZWwoTkFORF9FTiwgbmFuZC0+cmVncyArIE1BMzVfTkZJX1JFR19HQ1RMKTsgIAo+ ID4gSSB3b3VsZCBleHBlY3QgeW91ciByZXNldCBiaXQgdG8gYmUgc2V0IGJlZm9yZSB0aGlzIHdy aXRlbC4gIAo+IAo+IEFyZSB5b3UgcmVmZXJyaW5nIHRvIFNXUlNUPyBJIHdpbGwgY2FsbCB0aGUg cmVzZXQgZW5naW5lIGJlZm9yZSBlbmFibGluZyBpdC4KClllcywgdGhhbmtzLgoKVGhhbmtzLApN aXF1w6hsCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KTGludXggTVREIGRpc2N1c3Npb24gbWFpbGluZyBsaXN0Cmh0dHA6Ly9saXN0cy5pbmZy YWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtbXRkLwo=