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=-11.2 required=3.0 tests=BAYES_00,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_2 autolearn=unavailable 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 6B56AC4363A for ; Wed, 28 Oct 2020 10:49:19 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 97A5124697 for ; Wed, 28 Oct 2020 10:49:18 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="alKpO7zu" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 97A5124697 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: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=DECG2qN4CPnD1r9ujsi+GS7rHs+GLSgGxItLirtwDQ4=; b=alKpO7zu/z/4dRcLjNEOeUjWn HRKRIdsk5PE0vy4t0MvcPqVA/VSUlGKcffeSmcdjMBcnFJYj/O+uy/W7TUNL5+cPp0uuM/pM1hgpi RQeyBRtwvAKSgAm+bY+5g/fXYWErmXMbKIBLa1nRdjCNZwunUMni31zmMEFAmc1YxzFmXsMB1vNID 5kvguBcTiy/J6EN7GzXHayLljakOeIE+HAu4KrnbpFZdJx8t44muSU4yy17cM6z5s7u5zhnNtngI0 9VxRhGWuHkbutfIfdmC1Gg/hov7Cm1pP/4whtRg4i0MADD3FJ5TXJuSAsb2bhSyMU9g+lI4QPG6bA Caw53vkVg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kXj0Q-0001kP-NI; Wed, 28 Oct 2020 10:48:38 +0000 Received: from relay3-d.mail.gandi.net ([217.70.183.195]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kXj0L-0001jE-5V; Wed, 28 Oct 2020 10:48:35 +0000 X-Originating-IP: 91.224.148.103 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay3-d.mail.gandi.net (Postfix) with ESMTPSA id 9E8F66001A; Wed, 28 Oct 2020 10:48:27 +0000 (UTC) Date: Wed, 28 Oct 2020 11:48:26 +0100 From: Miquel Raynal To: Yifeng Zhao Subject: Re: [PATCH v13 2/8] mtd: rawnand: rockchip: NFC drivers for RK3308, RK2928 and others Message-ID: <20201028114826.6cd6b841@xps13> In-Reply-To: <20201028095326.15562-3-yifeng.zhao@rock-chips.com> References: <20201028095326.15562-1-yifeng.zhao@rock-chips.com> <20201028095326.15562-3-yifeng.zhao@rock-chips.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.4 (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-20201028_064833_444741_41509BB4 X-CRM114-Status: GOOD ( 38.03 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree@vger.kernel.org, vigneshr@ti.com, richard@nod.at, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, robh+dt@kernel.org, linux-mtd@lists.infradead.org, linux-arm-kernel@lists.infradead.org, heiko@sntech.de 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 SGkgWWlmZW5nLAoKQSBmZXcgbW9yZSBjb21tZW50cyBiZWxvdywgYnV0IG92ZXJhbGwgbG9va3Mg YmV0dGVyLgoKWWlmZW5nIFpoYW8gPHlpZmVuZy56aGFvQHJvY2stY2hpcHMuY29tPiB3cm90ZSBv biBXZWQsIDI4IE9jdCAyMDIwCjE3OjUzOjI0ICswODAwOgoKPiBUaGlzIGRyaXZlciBzdXBwb3J0 cyBSb2NrY2hpcCBORkMgKE5BTkQgRmxhc2ggQ29udHJvbGxlcikgZm91bmQgb24gUkszMzA4LAo+ IFJLMjkyOCwgUktQWDMwLCBSVjExMDggYW5kIG90aGVyIFNPQ3MuIFRoZSBkcml2ZXIgaGFzIGJl ZW4gdGVzdGVkIHVzaW5nCj4gOC1iaXQgTkFORCBpbnRlcmZhY2Ugb24gdGhlIEFSTSBiYXNlZCBS SzMzMDggcGxhdGZvcm0uCj4gCj4gU3VwcG9ydCBSb2NrY2hpcCBTb0NzIGFuZCBORkMgdmVyc2lv bnM6Cj4gLSBQWDMwIGFuZCBSSzMzMjYoTkZDdjkwMCkuCj4gCUVDQzogMTYvNDAvNjAvNzAgYml0 cy8xS0IuCj4gCUNMT0NLOiBhaGIgYW5kIG5mYy4KPiAtIFJLMzMwOCBhbmQgUlYxMTA4KE5GQ3Y4 MDApLgo+IAlFQ0M6IDE2IGJpdHMvMUtCLgo+IAlDTE9DSzogYWhiIGFuZCBuZmMuCj4gLSBSSzMw MzYgYW5kIFJLMzEyOChORkN2NjIyKS4KPiAJRUNDOiAxNi8yNC80MC82MCBiaXRzLzFLQi4KPiAJ Q0xPQ0s6IGFoYiBhbmQgbmZjLgo+IC0gUkszMDY2LCBSSzMxODggYW5kIFJLMjkyOChORkN2NjAw KS4KPiAJRUNDOiAxNi8yNC80MC82MCBiaXRzLzFLQi4KPiAJQ0xPQ0s6IGFoYi4KPiAKPiBTdXBw b3J0ZWQgZmVhdHVyZXM6Cj4gLSBSZWFkIGZ1bGwgcGFnZSBkYXRhIGJ5IERNQS4KPiAtIFN1cHBv cnQgSFcgRUNDKG9uZSBzdGVwIGlzIDFLQikuCj4gLSBTdXBwb3J0IDIgLSAzMksgcGFnZSBzaXpl Lgo+IC0gU3VwcG9ydCA4IENTKGRlcGVuZCBvbiBTb0NzKQo+IAo+IExpbWl0YXRpb25zOgo+IC0g Tm8gc3VwcG9ydCBmb3IgdGhlIGVjYyBzdGVwIHNpemUgaXMgNTEyLgo+IC0gVW50ZXN0ZWQgb24g c29tZSBTb0NzLgo+IC0gTm8gc3VwcG9ydCBmb3Igc3VicGFnZXMuCj4gLSBObyBzdXBwb3J0IGZv ciB0aGUgYnVpbHRpbiByYW5kb21pemVyLgo+IC0gVGhlIG9yaWdpbmFsIGJhZCBibG9jayBtYXNr IGlzIG5vdCBzdXBwb3J0ZWQuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZQo+ICAgdGhlIEJCVChi YWQgYmxvY2sgdGFibGUpLgo+IAo+IFNpZ25lZC1vZmYtYnk6IFlpZmVuZyBaaGFvIDx5aWZlbmcu emhhb0Byb2NrLWNoaXBzLmNvbT4KPiAtLS0KPiAKPiBDaGFuZ2VzIGluIHYxMzoKPiAtIFRoZSBu ZmMtPmJ1ZmZlciB3aWxsIHJlYWxsb2Mgd2hpbGUgdGhlIHBhZ2Ugc2l6ZSBvZiB0aGUgc2Vjb25k IG10ZAo+ICAgaXMgbGFyZ2UgdGhhbiB0aGUgZmlyc3Qgb25lLgo+IC0gRml4IGNvZGluZyBzdHls ZS4KPiAtIEZpeCBzb21lIGNvbW1lbnRzLgo+IAo+IENoYW5nZXMgaW4gdjEyOiBOb25lCj4gQ2hh bmdlcyBpbiB2MTE6Cj4gLSBGaXggY29tcGlsZSBlcnJvci4KPiAKPiBDaGFuZ2VzIGluIHYxMDoK PiAtIEZpeCBjb21waWxlIGVycm9yIG9uIG1hc3RlciB2NS45LXJjNy4KPiAKPiBDaGFuZ2VzIGlu IHY5Ogo+IC0gVGhlIG5mYy0+YnVmZmVyIHdpbGwgcmVhbGxvYyB3aGlsZSB0aGUgcGFnZSBzaXpl IG9mIHRoZSBzZWNvbmQgbXRkCj4gICBpcyBsYXJnZSB0aGFuIHRoZSBmaXJzdCBvbmUKPiAtIEZp eCBjb2Rpbmcgc3R5bGUuCj4gLSBSZW1vdmUgc3RydWN0IHJrX25mY19jbGsuCj4gLSBQcmVwZW5k IHNvbWUgZnVuY3Rpb24gd2l0aCBya19uZmNfLgo+IC0gUmVwbGFjZSBmdW5jdGlvbiByZWFkbF9w b2xsX3RpbWVvdXRfYXRvbWljIHdpdGggcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXQuCj4gLSBS ZW1vdmUgZnVuY3Rpb24gcmtfbmZjX3JlYWRfYnl0ZSBhbmQgcmtfbmZjX3dyaXRlX2J5dGUuCj4g LSBEb24ndCBzZWxlY3QgdGhlIGRpZSBpZiAnY2hlY2tfb25seSA9PSB0cnVlJyBpbiBmdW5jdGlv biBya19uZmNfZXhlY19vcC4KPiAtIE1vZGlmeSBmdW5jdGlvbiBya19uZmNfd3JpdGVfcGFnZSBh bmQgcmtfbmZjX3dyaXRlX3BhZ2VfcmF3Lgo+IAo+IENoYW5nZXMgaW4gdjg6IE5vbmUKPiBDaGFu Z2VzIGluIHY3Ogo+IC0gUmViYXNlIHRvIGxpbnV4LW5leHQuCj4gLSBGaXggY29kaW5nIHN0eWxl Lgo+IC0gUmVzZXJ2ZWQgNCBieXRlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvb2IgYXJlYS4K PiAtIFBhZ2UgcmF3IHJlYWQgYW5kIHdyaXRlIGluY2x1ZGVkIGVjYyBkYXRhLgo+IAo+IENoYW5n ZXMgaW4gdjY6Cj4gLSBUaGUgbXRkLT5uYW1lIHNldCBieSBOQU5EIGxhYmVsIHByb3BlcnR5Lgo+ IC0gQWRkIHNvbWUgY29tbWVudHMuCj4gLSBGaXggY29tcGlsZSBlcnJvci4KPiAKPiBDaGFuZ2Vz IGluIHY1Ogo+IC0gQWRkIGJvb3QgYmxvY2tzIHN1cHBvcnQgIHdpdGggZGlmZmVyZW50IEVDQyBm b3IgYm9vdFJPTS4KPiAtIFJlbmFtZSByb2NrY2hpcC1uYW5kLmMgdG8gcm9ja2NoaXAtbmFuZC1j b250cm9sbGVyLmMuCj4gLSBVbmlmaWNhdGlvbiBvZiBvdGhlciB2YXJpYWJsZSBuYW1lcy4KPiAt IFJlbW92ZSBzb21lIGNvbXBhdGlibGUgZGVmaW5lLgo+IAo+IENoYW5nZXMgaW4gdjQ6Cj4gLSBE ZWZpbmUgcGxhdGZvcm0gZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSByZWdpc3RlciBvZmZzZXRzLgo+ IC0gVGhlIGNvbXBhdGlibGUgZGVmaW5lIHdpdGggcmt4eF9uZmMuCj4gLSBVc2UgU0VUX1NZU1RF TV9TTEVFUF9QTV9PUFMgdG8gZGVmaW5lIFBNX09QUy4KPiAtIFVzZSBleGVjX29wIGluc3RlYWQg b2YgbGVnYWN5IGhvb2tzLgo+IAo+IENoYW5nZXMgaW4gdjM6IE5vbmUKPiBDaGFuZ2VzIGluIHYy Ogo+IC0gRml4IGNvbXBpbGUgZXJyb3IuCj4gLSBJbmNsdWRlIGhlYWRlciBmaWxlcyBzb3J0ZWQg YnkgZmlsZSBuYW1lLgo+IAo+ICBkcml2ZXJzL210ZC9uYW5kL3Jhdy9LY29uZmlnICAgICAgICAg ICAgICAgICAgfCAgIDEyICsKPiAgZHJpdmVycy9tdGQvbmFuZC9yYXcvTWFrZWZpbGUgICAgICAg ICAgICAgICAgIHwgICAgMSArCj4gIC4uLi9tdGQvbmFuZC9yYXcvcm9ja2NoaXAtbmFuZC1jb250 cm9sbGVyLmMgICB8IDE0NjAgKysrKysrKysrKysrKysrKysKPiAgMyBmaWxlcyBjaGFuZ2VkLCAx NDczIGluc2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbXRkL25hbmQv cmF3L3JvY2tjaGlwLW5hbmQtY29udHJvbGxlci5jCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv bXRkL25hbmQvcmF3L0tjb25maWcgYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9LY29uZmlnCj4gaW5k ZXggNmM0NmYyNWI1N2UyLi4yY2M1MzNlNGUyMzkgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tdGQv bmFuZC9yYXcvS2NvbmZpZwo+ICsrKyBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L0tjb25maWcKPiBA QCAtNDYyLDYgKzQ2MiwxOCBAQCBjb25maWcgTVREX05BTkRfQVJBU0FOCj4gIAkgIEVuYWJsZXMg dGhlIGRyaXZlciBmb3IgdGhlIEFyYXNhbiBOQU5EIGZsYXNoIGNvbnRyb2xsZXIgb24KPiAgCSAg WnlucSBVbHRyYXNjYWxlKyBNUFNvQy4KPiAgCj4gK2NvbmZpZyBNVERfTkFORF9ST0NLQ0hJUAo+ ICsJdHJpc3RhdGUgIlJvY2tjaGlwIE5BTkQgY29udHJvbGxlciIKPiArCWRlcGVuZHMgb24gQVJD SF9ST0NLQ0hJUCAmJiBIQVNfSU9NRU0KPiArCWhlbHAKPiArCSAgRW5hYmxlcyBzdXBwb3J0IGZv ciBOQU5EIGNvbnRyb2xsZXIgb24gUm9ja2NoaXAgU29Dcy4KPiArCSAgVGhlcmUgYXJlIGZvdXIg ZGlmZmVyZW50IHZlcnNpb25zIG9mIE5BTkQgRkxBU0ggQ29udHJvbGxlcnMsCj4gKwkgIGluY2x1 ZGluZzoKPiArCSAgICBORkMgdjYwMDogUksyOTI4LCBSSzMwNjYsIFJLMzE4OAo+ICsJICAgIE5G QyB2NjIyOiBSSzMwMzYsIFJLMzEyOAo+ICsJICAgIE5GQyB2ODAwOiBSSzMzMDgsIFJWMTEwOAo+ ICsJICAgIE5GQyB2OTAwOiBQWDMwLCBSSzMzMjYKPiArCj4gIGNvbW1lbnQgIk1pc2MiCj4gIAo+ ICBjb25maWcgTVREX1NNX0NPTU1PTgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3Jh dy9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L01ha2VmaWxlCj4gaW5kZXggMjkzMGY1 YjkwMTVkLi45NjBjOWJlMjUyMDQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9yYXcv TWFrZWZpbGUKPiArKysgYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9NYWtlZmlsZQo+IEBAIC01OCw2 ICs1OCw3IEBAIG9iai0kKENPTkZJR19NVERfTkFORF9TVE0zMl9GTUMyKQkrPSBzdG0zMl9mbWMy X25hbmQubwo+ICBvYmotJChDT05GSUdfTVREX05BTkRfTUVTT04pCQkrPSBtZXNvbl9uYW5kLm8K PiAgb2JqLSQoQ09ORklHX01URF9OQU5EX0NBREVOQ0UpCQkrPSBjYWRlbmNlLW5hbmQtY29udHJv bGxlci5vCj4gIG9iai0kKENPTkZJR19NVERfTkFORF9BUkFTQU4pCQkrPSBhcmFzYW4tbmFuZC1j b250cm9sbGVyLm8KPiArb2JqLSQoQ09ORklHX01URF9OQU5EX1JPQ0tDSElQKQkJKz0gcm9ja2No aXAtbmFuZC1jb250cm9sbGVyLm8KPiAgCj4gIG5hbmQtb2JqcyA6PSBuYW5kX2Jhc2UubyBuYW5k X2xlZ2FjeS5vIG5hbmRfYmJ0Lm8gbmFuZF90aW1pbmdzLm8gbmFuZF9pZHMubwo+ICBuYW5kLW9i anMgKz0gbmFuZF9vbmZpLm8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9yYXcvcm9j a2NoaXAtbmFuZC1jb250cm9sbGVyLmMgYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9yb2NrY2hpcC1u YW5kLWNvbnRyb2xsZXIuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAw MDAwLi4yZTk2ZmQzMTQzNDYKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9tdGQvbmFu ZC9yYXcvcm9ja2NoaXAtbmFuZC1jb250cm9sbGVyLmMKPiBAQCAtMCwwICsxLDE0NjAgQEAKPiAr Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgT1IgTUlUCj4gKy8qCj4gKyAqIFJv Y2tjaGlwIE5BTkQgRmxhc2ggY29udHJvbGxlciBkcml2ZXIuCj4gKyAqIENvcHlyaWdodCAoQykg MjAyMCBSb2NrY2hpcCBJbmMuCj4gKyAqIEF1dGhvcjogWWlmZW5nIFpoYW8gPHlpZmVuZy56aGFv QHJvY2stY2hpcHMuY29tPgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KPiAr I2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5o Pgo+ICsjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9pbnRl cnJ1cHQuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgo+ICsjaW5jbHVkZSA8bGludXgv bW9kdWxlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Cj4gKyNpbmNsdWRlIDxsaW51 eC9tdGQvcmF3bmFuZC5oPgo+ICsjaW5jbHVkZSA8bGludXgvb2YuaD4KPiArI2luY2x1ZGUgPGxp bnV4L29mX2RldmljZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4g KyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4gKwo+ICsvKgo+ICsgKiBORkMgUGFnZSBEYXRhIExh eW91dDoKPiArICoJMTAyNCBCeXRlcyBEYXRhICsgNEJ5dGVzIHN5cyBkYXRhICsgMjhCeXRlc34x MjRCeXRlcyBlY2MgKwo+ICsgKgkxMDI0IEJ5dGVzIERhdGEgKyA0Qnl0ZXMgc3lzIGRhdGEgKyAy OEJ5dGVzfjEyNEJ5dGVzIGVjYyArCj4gKyAqCS4uLi4uLgo+ICsgKiBOQU5EIFBhZ2UgRGF0YSBM YXlvdXQ6Cj4gKyAqCTEwMjQgKiBuIERhdGEgKyBtIEJ5dGVzIG9vYgo+ICsgKiBPcmlnaW5hbCBC YWQgQmxvY2sgTWFzayBMb2NhdGlvbjoKPiArICoJRmlyc3QgYnl0ZSBvZiBvb2Ioc3BhcmUpLgo+ ICsgKiBuYW5kX2NoaXAtPm9vYl9wb2kgZGF0YSBsYXlvdXQ6Cj4gKyAqCTRCeXRlcyBzeXMgZGF0 YSArIC4uLi4gKyA0Qnl0ZXMgc3lzIGRhdGEgKyBlY2MgZGF0YS4KPiArICovCj4gKwo+ICsvKiBO QU5EIGNvbnRyb2xsZXIgcmVnaXN0ZXIgZGVmaW5pdGlvbiAqLwo+ICsjZGVmaW5lIE5GQ19SRUFE CQkJKDApCj4gKyNkZWZpbmUgTkZDX1dSSVRFCQkJKDEpCj4gKwo+ICsjZGVmaW5lIE5GQ19GTUNU TAkJCSgweDAwKQo+ICsjZGVmaW5lICAgRk1DVExfQ0VfU0VMX00JCTB4RkYKPiArI2RlZmluZSAg IEZNQ1RMX0NFX1NFTCh4KQkJKDEgPDwgKHgpKQo+ICsjZGVmaW5lICAgRk1DVExfV1AJCQlCSVQo OCkKPiArI2RlZmluZSAgIEZNQ1RMX1JEWQkJCUJJVCg5KQo+ICsKPiArI2RlZmluZSBORkNfRk1X QUlUCQkJKDB4MDQpCj4gKyNkZWZpbmUgICBGTENUTF9SU1QJCQlCSVQoMCkKPiArI2RlZmluZSAg IEZMQ1RMX1dSCQkJKDEpCS8qIDA6IHJlYWQsIDE6IHdyaXRlICovCj4gKyNkZWZpbmUgICBGTENU TF9YRkVSX1NUCQkJQklUKDIpCj4gKyNkZWZpbmUgICBGTENUTF9YRkVSX0VOCQkJQklUKDMpCj4g KyNkZWZpbmUgICBGTENUTF9BQ09SUkVDVAkJQklUKDEwKSAvKiBBdXRvIGNvcnJlY3QgZXJyb3Ig Yml0cy4gKi8KPiArI2RlZmluZSAgIEZMQ1RMX1hGRVJfUkVBRFkJCUJJVCgyMCkKPiArI2RlZmlu ZSAgIEZMQ1RMX1hGRVJfU0VDVE9SCQkoMjIpCj4gKyNkZWZpbmUgICBGTENUTF9UT0dfRklYCQkJ QklUKDI5KQo+ICsKPiArI2RlZmluZSAgIEJDSENUTF9CQU5LX00JCQkoNyA8PCA1KQo+ICsjZGVm aW5lICAgQkNIQ1RMX0JBTksJCQkoNSkKPiArCj4gKyNkZWZpbmUgICBETUFfU1QJCQlCSVQoMCkK PiArI2RlZmluZSAgIERNQV9XUgkJCSgxKQkvKiAwOiB3cml0ZSwgMTogcmVhZCAqLwo+ICsjZGVm aW5lICAgRE1BX0VOCQkJQklUKDIpCj4gKyNkZWZpbmUgICBETUFfQUhCX1NJWkUJCQkoMykJLyog MDogMSwgMTogMiwgMjogNCAqLwo+ICsjZGVmaW5lICAgRE1BX0JVUlNUX1NJWkUJCSg2KQkvKiAw OiAxLCAzOiA0LCA1OiA4LCA3OiAxNiAqLwo+ICsjZGVmaW5lICAgRE1BX0lOQ19OVU0JCQkoOSkJ LyogMSAtIDE2ICovCj4gKwo+ICsjZGVmaW5lIEVDQ19FUlJfQ05UKHgsIGUpICgoKCh4KSA+PiAo ZSkubG93KSAmIChlKS5sb3dfbWFzaykgfFwKPiArCSAgKCgoeCkgPj4gKGUpLmhpZ2gpICYgKGUp LmhpZ2hfbWFzaykgPDwgKGUpLmxvd19ibikKPiArI2RlZmluZSAgIElOVF9ETUEJCQlCSVQoMCkK PiArI2RlZmluZSBORkNfQkFOSwkJCSgweDgwMCkKPiArI2RlZmluZSBORkNfQkFOS19TVEVQCQkJ KDB4MTAwKQo+ICsjZGVmaW5lICAgQkFOS19EQVRBCQkJKDB4MDApCj4gKyNkZWZpbmUgICBCQU5L X0FERFIJCQkoMHgwNCkKPiArI2RlZmluZSAgIEJBTktfQ01ECQkJKDB4MDgpCj4gKyNkZWZpbmUg TkZDX1NSQU0wCQkJKDB4MTAwMCkKPiArI2RlZmluZSBORkNfU1JBTTEJCQkoMHgxNDAwKQo+ICsj ZGVmaW5lIE5GQ19TUkFNX1NJWkUJCQkoMHg0MDApCj4gKyNkZWZpbmUgTkZDX1RJTUVPVVQJCQko NTAwMDAwKQo+ICsjZGVmaW5lIE5GQ19NQVhfT09CX1BFUl9TVEVQCQkxMjgKPiArI2RlZmluZSBO RkNfTUlOX09PQl9QRVJfU1RFUAkJNjQKPiArI2RlZmluZSBNQVhfREFUQV9TSVpFCQkJMHhGRkZD Cj4gKyNkZWZpbmUgTUFYX0FERFJFU1NfQ1lDCQkJNgo+ICsjZGVmaW5lIE5GQ19FQ0NfTUFYX01P REVTCQk0Cj4gKyNkZWZpbmUgTkZDX01BWF9OU0VMUwkJCSg4KSAvKiBTb21lIFNvY3Mgb25seSBo YXZlIDEgb3IgMiBDU3MuICovCj4gKyNkZWZpbmUgTkZDX1NZU19EQVRBX1NJWkUJCSg0KSAvKiA0 IGJ5dGVzIHN5cyBkYXRhIGluIG9vYiBwcmUgMTAyNCBkYXRhLiovCj4gKyNkZWZpbmUgUktfREVG QVVMVF9DTE9DS19SQVRFCQkoMTUwICogMTAwMCAqIDEwMDApIC8qIDE1MCBNaHogKi8KPiArI2Rl ZmluZSBBQ0NUSU1JTkcoY3NydywgcndwdywgcndjcykJKChjc3J3KSA8PCAxMiB8IChyd3B3KSA8 PCA1IHwgKHJ3Y3MpKQo+ICsKPiArZW51bSBuZmNfdHlwZSB7Cj4gKwlORkNfVjYsCj4gKwlORkNf VjgsCj4gKwlORkNfVjksCj4gK307Cj4gKwo+ICsvKioKPiArICogc3RydWN0IHJrX2VjY19jbnRf c3RhdHVzOiByZXByZXNlbnQgYSBlY2Mgc3RhdHVzIGRhdGEuCj4gKyAqIEBlcnJfZmxhZ19iaXQ6 IGVycm9yIGZsYWcgYml0IGluZGV4IGF0IHJlZ2lzdGVyLgo+ICsgKiBAbG93OiBlY2MgY291bnQg bG93IGJpdCBpbmRleCBhdCByZWdpc3Rlci4KPiArICogQGxvd19tYXNrOiBtYXNrIGJpdC4KPiAr ICogQGxvd19ibjogZWNjIGNvdW50IGxvdyBiaXQgbnVtYmVyLgo+ICsgKiBAaGlnaDogZWNjIGNv dW50IGhpZ2ggYml0IGluZGV4IGF0IHJlZ2lzdGVyLgo+ICsgKiBAaGlnaF9tYXNrOiBtYXNrIGJp dAo+ICsgKi8KPiArc3RydWN0IGVjY19jbnRfc3RhdHVzIHsKPiArCXU4IGVycl9mbGFnX2JpdDsK PiArCXU4IGxvdzsKPiArCXU4IGxvd19tYXNrOwo+ICsJdTggbG93X2JuOwo+ICsJdTggaGlnaDsK PiArCXU4IGhpZ2hfbWFzazsKPiArfTsKPiArCj4gKy8qCj4gKyAqIEB0eXBlOiBuZmMgdmVyc2lv bgo+ICsgKiBAZWNjX3N0cmVuZ3RoczogZWNjIHN0cmVuZ3Rocwo+ICsgKiBAZWNjX2NmZ3M6IGVj YyBjb25maWcgdmFsdWVzCj4gKyAqIEBmbGN0bF9vZmY6IEZMQ1RMIHJlZ2lzdGVyIG9mZnNldAo+ ICsgKiBAYmNoY3RsX29mZjogQkNIQ1RMIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAZG1hX2RhdGFf YnVmX29mZjogRE1BX0RBVEFfQlVGIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAZG1hX29vYl9idWZf b2ZmOiBETUFfT09CX0JVRiByZWdpc3RlciBvZmZzZXQKPiArICogQGRtYV9jZmdfb2ZmOiBETUFf Q0ZHIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAZG1hX3N0X29mZjogRE1BX1NUIHJlZ2lzdGVyIG9m ZnNldAo+ICsgKiBAYmNoX3N0X29mZjogQkNHX1NUIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAcmFu ZG16X29mZjogUkFORE1aIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAaW50X2VuX29mZjogaW50ZXJy dXB0IGVuYWJsZSByZWdpc3RlciBvZmZzZXQKPiArICogQGludF9jbHJfb2ZmOiBpbnRlcnJ1cHQg Y2xlYW4gcmVnaXN0ZXIgb2Zmc2V0Cj4gKyAqIEBpbnRfc3Rfb2ZmOiBpbnRlcnJ1cHQgc3RhdHVz IHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAb29iMF9vZmY6IG9vYjAgcmVnaXN0ZXIgb2Zmc2V0Cj4g KyAqIEBvb2IxX29mZjogb29iMSByZWdpc3RlciBvZmZzZXQKPiArICogQGVjYzA6IHJlcHJlc2Vu dCBFQ0MwIHN0YXR1cyBkYXRhCj4gKyAqIEBlY2MxOiByZXByZXNlbnQgRUNDMSBzdGF0dXMgZGF0 YQo+ICsgKi8KPiArc3RydWN0IG5mY19jZmcgewo+ICsJZW51bSBuZmNfdHlwZSB0eXBlOwo+ICsJ dTggZWNjX3N0cmVuZ3Roc1tORkNfRUNDX01BWF9NT0RFU107Cj4gKwl1MzIgZWNjX2NmZ3NbTkZD X0VDQ19NQVhfTU9ERVNdOwo+ICsJdTMyIGZsY3RsX29mZjsKPiArCXUzMiBiY2hjdGxfb2ZmOwo+ ICsJdTMyIGRtYV9jZmdfb2ZmOwo+ICsJdTMyIGRtYV9kYXRhX2J1Zl9vZmY7Cj4gKwl1MzIgZG1h X29vYl9idWZfb2ZmOwo+ICsJdTMyIGRtYV9zdF9vZmY7Cj4gKwl1MzIgYmNoX3N0X29mZjsKPiAr CXUzMiByYW5kbXpfb2ZmOwo+ICsJdTMyIGludF9lbl9vZmY7Cj4gKwl1MzIgaW50X2Nscl9vZmY7 Cj4gKwl1MzIgaW50X3N0X29mZjsKPiArCXUzMiBvb2IwX29mZjsKPiArCXUzMiBvb2IxX29mZjsK PiArCXN0cnVjdCBlY2NfY250X3N0YXR1cyBlY2MwOwo+ICsJc3RydWN0IGVjY19jbnRfc3RhdHVz IGVjYzE7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCB7Cj4gKwlzdHJ1Y3Qg bGlzdF9oZWFkIG5vZGU7Cj4gKwlzdHJ1Y3QgbmFuZF9jaGlwIGNoaXA7Cj4gKwo+ICsJdTE2IHNw YXJlX3Blcl9zZWN0b3I7Cj4gKwl1MTYgb29iX2J1Zl9wZXJfc2VjdG9yOwo+ICsJdTE2IGJvb3Rf YmxrczsKPiArCXUxNiBib290X2VjYzsKPiArCXUxNiBtZXRhZGF0YV9zaXplOwo+ICsKPiArCXU4 IG5zZWxzOwo+ICsJdTggc2Vsc1swXTsKPiArCS8qIE5vdGhpbmcgYWZ0ZXIgdGhpcyBmaWVsZC4g Ki8KPiArfTsKPiArCj4gK3N0cnVjdCBya19uZmMgewo+ICsJc3RydWN0IG5hbmRfY29udHJvbGxl ciBjb250cm9sbGVyOwo+ICsJY29uc3Qgc3RydWN0IG5mY19jZmcgKmNmZzsKPiArCXN0cnVjdCBk ZXZpY2UgKmRldjsKPiArCj4gKwlzdHJ1Y3QgY2xrICpuZmNfY2xrOwo+ICsJc3RydWN0IGNsayAq YWhiX2NsazsKPiArCXZvaWQgX19pb21lbSAqcmVnczsKPiArCj4gKwl1MzIgc2VsZWN0ZWRfYmFu azsKPiArCXUzMiBiYW5kX29mZnNldDsKPiArCXUzMiBjdXJfY2xrOwo+ICsKPiArCXN0cnVjdCBj b21wbGV0aW9uIGRvbmU7Cj4gKwlzdHJ1Y3QgbGlzdF9oZWFkIGNoaXBzOwo+ICsKPiArCXU4ICpi dWZmZXI7Cj4gKwl1OCAqcGFnZV9idWY7Cj4gKwl1MzIgKm9vYl9idWY7Cj4gKwl1MzIgYnVmZmVy X3NpemU7Cj4gKwl1MzIgb29iX2J1Zl9zaXplOwo+ICsKPiArCXVuc2lnbmVkIGxvbmcgYXNzaWdu ZWRfY3M7Cj4gK307Cj4gKwo+ICtzdGF0aWMgaW5saW5lIHN0cnVjdCBya19uZmNfbmFuZF9jaGlw ICpya19uZmNfdG9fcmtuYW5kKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXApCj4gK3sKPiArCXJldHVy biBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IHJrX25mY19uYW5kX2NoaXAsIGNoaXApOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW5saW5lIHU4ICpya19uZmNfYnVmX3RvX2RhdGFfcHRyKHN0cnVjdCBu YW5kX2NoaXAgKmNoaXAsIGNvbnN0IHU4ICpwLCBpbnQgaSkKPiArewo+ICsJcmV0dXJuICh1OCAq KXAgKyBpICogY2hpcC0+ZWNjLnNpemU7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdTggKnJr X25mY19idWZfdG9fb29iX3B0cihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgaSkKPiArewo+ ICsJdTggKnBvaTsKPiArCj4gKwlwb2kgPSBjaGlwLT5vb2JfcG9pICsgaSAqIE5GQ19TWVNfREFU QV9TSVpFOwo+ICsKPiArCXJldHVybiBwb2k7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdTgg KnJrX25mY19idWZfdG9fb29iX2VjY19wdHIoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgaW50IGkp Cj4gK3sKPiArCXN0cnVjdCBya19uZmNfbmFuZF9jaGlwICpya25hbmQgPSBya19uZmNfdG9fcmtu YW5kKGNoaXApOwo+ICsJdTggKnBvaTsKPiArCj4gKwlwb2kgPSBjaGlwLT5vb2JfcG9pICsgcmtu YW5kLT5tZXRhZGF0YV9zaXplICsKPiArCSAgICAgIGNoaXAtPmVjYy5ieXRlcyAqIGk7Cj4gKwo+ ICsJcmV0dXJuIHBvaTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSBpbnQgcmtfbmZjX2RhdGFf bGVuKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXApCj4gK3sKPiArCXN0cnVjdCBya19uZmNfbmFuZF9j aGlwICpya25hbmQgPSBya19uZmNfdG9fcmtuYW5kKGNoaXApOwo+ICsKPiArCXJldHVybiBjaGlw LT5lY2Muc2l6ZSArIHJrbmFuZC0+c3BhcmVfcGVyX3NlY3RvcjsKPiArfQo+ICsKPiArc3RhdGlj IGlubGluZSB1OCAqcmtfbmZjX2RhdGFfcHRyKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsICBpbnQg aSkKPiArewo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRh KGNoaXApOwo+ICsKPiArCXJldHVybiBuZmMtPmJ1ZmZlciArIGkgKiBya19uZmNfZGF0YV9sZW4o Y2hpcCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdTggKnJrX25mY19vb2JfcHRyKHN0cnVj dCBuYW5kX2NoaXAgKmNoaXAsIGludCBpKQo+ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBu YW5kX2dldF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4gKwo+ICsJcmV0dXJuIG5mYy0+YnVmZmVy ICsgaSAqIHJrX25mY19kYXRhX2xlbihjaGlwKSArIGNoaXAtPmVjYy5zaXplOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgdm9pZCBya19uZmNfc2VsZWN0X2NoaXAoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwg aW50IGNzKQo+ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dldF9jb250cm9sbGVy X2RhdGEoY2hpcCk7Cj4gKwlzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCAqcmtuYW5kID0gcmtfbmZj X3RvX3JrbmFuZChjaGlwKTsKPiArCXUzMiB2YWw7Cj4gKwo+ICsJaWYgKGNzIDwgMCkgewo+ICsJ CW5mYy0+c2VsZWN0ZWRfYmFuayA9IC0xOwo+ICsJCS8qIERlc2VsZWN0IHRoZSBjdXJyZW50bHkg c2VsZWN0ZWQgdGFyZ2V0LiAqLwo+ICsJCXZhbCA9IHJlYWRsX3JlbGF4ZWQobmZjLT5yZWdzICsg TkZDX0ZNQ1RMKTsKPiArCQl2YWwgJj0gfkZNQ1RMX0NFX1NFTF9NOwo+ICsJCXdyaXRlbCh2YWws IG5mYy0+cmVncyArIE5GQ19GTUNUTCk7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCW5mYy0+ c2VsZWN0ZWRfYmFuayA9IHJrbmFuZC0+c2Vsc1tjc107Cj4gKwluZmMtPmJhbmRfb2Zmc2V0ID0g TkZDX0JBTksgKyBuZmMtPnNlbGVjdGVkX2JhbmsgKiBORkNfQkFOS19TVEVQOwo+ICsKPiArCXZh bCA9IHJlYWRsX3JlbGF4ZWQobmZjLT5yZWdzICsgTkZDX0ZNQ1RMKTsKPiArCXZhbCAmPSB+Rk1D VExfQ0VfU0VMX007Cj4gKwl2YWwgfD0gRk1DVExfQ0VfU0VMKG5mYy0+c2VsZWN0ZWRfYmFuayk7 Cj4gKwo+ICsJd3JpdGVsKHZhbCwgbmZjLT5yZWdzICsgTkZDX0ZNQ1RMKTsKPiArfQo+ICsKPiAr c3RhdGljIGlubGluZSBpbnQgcmtfbmZjX3dhaXRfaW9yZWFkeShzdHJ1Y3QgcmtfbmZjICpuZmMp Cj4gK3sKPiArCWludCByYzsKPiArCXUzMiB2YWw7Cj4gKwo+ICsJcmMgPSByZWFkbF9yZWxheGVk X3BvbGxfdGltZW91dChuZmMtPnJlZ3MgKyBORkNfRk1DVEwsIHZhbCwKPiArCQkJCQl2YWwgJiBG TUNUTF9SRFksIDEwLCBORkNfVElNRU9VVCk7Cj4gKwo+ICsJcmV0dXJuIHJjOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgdm9pZCBya19uZmNfcmVhZF9idWYoc3RydWN0IHJrX25mYyAqbmZjLCB1OCAqYnVm LCBpbnQgbGVuKQo+ICt7Cj4gKwlpbnQgaTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBp KyspCj4gKwkJYnVmW2ldID0gcmVhZGJfcmVsYXhlZChuZmMtPnJlZ3MgKyBuZmMtPmJhbmRfb2Zm c2V0ICsKPiArCQkJCSAgICAgICBCQU5LX0RBVEEpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBy a19uZmNfd3JpdGVfYnVmKHN0cnVjdCBya19uZmMgKm5mYywgY29uc3QgdTggKmJ1ZiwgaW50IGxl bikKPiArewo+ICsJaW50IGk7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQo+ICsJ CXdyaXRlYihidWZbaV0sIG5mYy0+cmVncyArIG5mYy0+YmFuZF9vZmZzZXQgKyBCQU5LX0RBVEEp Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19jbWQoc3RydWN0IG5hbmRfY2hpcCAqY2hp cCwKPiArCQkgICAgICBjb25zdCBzdHJ1Y3QgbmFuZF9zdWJvcCAqc3Vib3ApCj4gK3sKPiArCXN0 cnVjdCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsKPiArCXVu c2lnbmVkIGludCBpLCBqLCByZW1haW5pbmcsIHN0YXJ0Owo+ICsJaW50IHJlZ19vZmZzZXQgPSBu ZmMtPmJhbmRfb2Zmc2V0Owo+ICsJdTggKmluYnVmID0gTlVMTDsKPiArCWNvbnN0IHU4ICpvdXRi dWY7Cj4gKwl1MzIgY250ID0gMDsKPiArCWludCByZXQgPSAwOwo+ICsKPiArCWZvciAoaSA9IDA7 IGkgPCBzdWJvcC0+bmluc3RyczsgaSsrKSB7Cj4gKwkJY29uc3Qgc3RydWN0IG5hbmRfb3BfaW5z dHIgKmluc3RyID0gJnN1Ym9wLT5pbnN0cnNbaV07Cj4gKwo+ICsJCXN3aXRjaCAoaW5zdHItPnR5 cGUpIHsKPiArCQljYXNlIE5BTkRfT1BfQ01EX0lOU1RSOgo+ICsJCQl3cml0ZWIoaW5zdHItPmN0 eC5jbWQub3Bjb2RlLAo+ICsJCQkgICAgICAgbmZjLT5yZWdzICsgcmVnX29mZnNldCArIEJBTktf Q01EKTsKPiArCQkJYnJlYWs7Cj4gKwo+ICsJCWNhc2UgTkFORF9PUF9BRERSX0lOU1RSOgo+ICsJ CQlyZW1haW5pbmcgPSBuYW5kX3N1Ym9wX2dldF9udW1fYWRkcl9jeWMoc3Vib3AsIGkpOwo+ICsJ CQlzdGFydCA9IG5hbmRfc3Vib3BfZ2V0X2FkZHJfc3RhcnRfb2ZmKHN1Ym9wLCBpKTsKPiArCj4g KwkJCWZvciAoaiA9IDA7IGogPCA4ICYmIGogKyBzdGFydCA8IHJlbWFpbmluZzsgaisrKQo+ICsJ CQkJd3JpdGViKGluc3RyLT5jdHguYWRkci5hZGRyc1tqICsgc3RhcnRdLAo+ICsJCQkJICAgICAg IG5mYy0+cmVncyArIHJlZ19vZmZzZXQgKyBCQU5LX0FERFIpOwo+ICsJCQlicmVhazsKPiArCj4g KwkJY2FzZSBOQU5EX09QX0RBVEFfSU5fSU5TVFI6Cj4gKwkJY2FzZSBOQU5EX09QX0RBVEFfT1VU X0lOU1RSOgo+ICsJCQlzdGFydCA9IG5hbmRfc3Vib3BfZ2V0X2RhdGFfc3RhcnRfb2ZmKHN1Ym9w LCBpKTsKPiArCQkJY250ID0gbmFuZF9zdWJvcF9nZXRfZGF0YV9sZW4oc3Vib3AsIGkpOwo+ICsK PiArCQkJaWYgKGluc3RyLT50eXBlID09IE5BTkRfT1BfREFUQV9PVVRfSU5TVFIpIHsKPiArCQkJ CW91dGJ1ZiA9IGluc3RyLT5jdHguZGF0YS5idWYub3V0ICsgc3RhcnQ7Cj4gKwkJCQlya19uZmNf d3JpdGVfYnVmKG5mYywgb3V0YnVmLCBjbnQpOwo+ICsJCQl9IGVsc2Ugewo+ICsJCQkJaW5idWYg PSBpbnN0ci0+Y3R4LmRhdGEuYnVmLmluICsgc3RhcnQ7Cj4gKwkJCQlya19uZmNfcmVhZF9idWYo bmZjLCBpbmJ1ZiwgY250KTsKPiArCQkJfQo+ICsJCQlicmVhazsKPiArCj4gKwkJY2FzZSBOQU5E X09QX1dBSVRSRFlfSU5TVFI6Cj4gKwkJCWlmIChya19uZmNfd2FpdF9pb3JlYWR5KG5mYykgPCAw KSB7Cj4gKwkJCQlyZXQgPSAtRVRJTUVET1VUOwo+ICsJCQkJZGV2X2VycihuZmMtPmRldiwgIklP IG5vdCByZWFkeVxuIik7Cj4gKwkJCX0KPiArCQkJYnJlYWs7Cj4gKwkJfQo+ICsJfQo+ICsKPiAr CXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmFuZF9vcF9wYXJz ZXIgcmtfbmZjX29wX3BhcnNlciA9IE5BTkRfT1BfUEFSU0VSKAo+ICsJTkFORF9PUF9QQVJTRVJf UEFUVEVSTigKPiArCQlya19uZmNfY21kLAo+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9DTURfRUxF TSh0cnVlKSwKPiArCQlOQU5EX09QX1BBUlNFUl9QQVRfQUREUl9FTEVNKHRydWUsIE1BWF9BRERS RVNTX0NZQyksCj4gKwkJTkFORF9PUF9QQVJTRVJfUEFUX0NNRF9FTEVNKHRydWUpLAo+ICsJCU5B TkRfT1BfUEFSU0VSX1BBVF9XQUlUUkRZX0VMRU0odHJ1ZSksCj4gKwkJTkFORF9PUF9QQVJTRVJf UEFUX0RBVEFfSU5fRUxFTSh0cnVlLCBNQVhfREFUQV9TSVpFKSksCj4gKwlOQU5EX09QX1BBUlNF Ul9QQVRURVJOKAo+ICsJCXJrX25mY19jbWQsCj4gKwkJTkFORF9PUF9QQVJTRVJfUEFUX0NNRF9F TEVNKHRydWUpLAo+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9BRERSX0VMRU0odHJ1ZSwgTUFYX0FE RFJFU1NfQ1lDKSwKPiArCQlOQU5EX09QX1BBUlNFUl9QQVRfREFUQV9PVVRfRUxFTSh0cnVlLCBN QVhfREFUQV9TSVpFKSwKPiArCQlOQU5EX09QX1BBUlNFUl9QQVRfQ01EX0VMRU0odHJ1ZSksCj4g KwkJTkFORF9PUF9QQVJTRVJfUEFUX1dBSVRSRFlfRUxFTSh0cnVlKSksCj4gKyk7Cj4gKwo+ICtz dGF0aWMgaW50IHJrX25mY19leGVjX29wKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCj4gKwkJCSAg Y29uc3Qgc3RydWN0IG5hbmRfb3BlcmF0aW9uICpvcCwKPiArCQkJICBib29sIGNoZWNrX29ubHkp Cj4gK3sKPiArCWlmICghY2hlY2tfb25seSkKPiArCQlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwg b3AtPmNzKTsKPiArCj4gKwlyZXR1cm4gbmFuZF9vcF9wYXJzZXJfZXhlY19vcChjaGlwLCAmcmtf bmZjX29wX3BhcnNlciwgb3AsCj4gKwkJCQkgICAgICBjaGVja19vbmx5KTsKPiArfQo+ICsKPiAr c3RhdGljIGludCBya19uZmNfc2V0dXBfZGF0YV9pbnRlcmZhY2Uoc3RydWN0IG5hbmRfY2hpcCAq Y2hpcCwgaW50IGNzbGluZSwKPiArCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmFuZF9pbnRlcmZh Y2VfY29uZmlnICpjb25mKQoKUGxlYXNlIGhhdmUgYSBsb29rIGF0IHRoZSByZWNlbnQgY2hhbmdl cyBpbiB0aGUgY29yZSwgdGhpcyBoZWxwZXIKc2hvdWxkIGJlIG5hbWVkICJzZXR1cF9pbnRlcmZh Y2UiLgoKPiArewo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9k YXRhKGNoaXApOwo+ICsJY29uc3Qgc3RydWN0IG5hbmRfc2RyX3RpbWluZ3MgKnRpbWluZ3M7Cj4g Kwl1MzIgcmF0ZSwgdGMycncsIHRyd3B3LCB0cncyYzsKPiArCXUzMiB0ZW1wOwo+ICsKPiArCWlm IChjc2xpbmUgPT0gTkFORF9EQVRBX0lGQUNFX0NIRUNLX09OTFkpCj4gKwkJcmV0dXJuIDA7Cj4g Kwo+ICsJdGltaW5ncyA9IG5hbmRfZ2V0X3Nkcl90aW1pbmdzKGNvbmYpOwo+ICsJaWYgKElTX0VS Uih0aW1pbmdzKSkKPiArCQlyZXR1cm4gLUVPUE5PVFNVUFA7Cj4gKwo+ICsJaWYgKElTX0VSUihu ZmMtPm5mY19jbGspKQo+ICsJCXJhdGUgPSBjbGtfZ2V0X3JhdGUobmZjLT5haGJfY2xrKTsKPiAr CWVsc2UKPiArCQlyYXRlID0gY2xrX2dldF9yYXRlKG5mYy0+bmZjX2Nsayk7Cj4gKwo+ICsJLyog VHVybiBjbG9jayByYXRlIGludG8ga0h6LiAqLwo+ICsJcmF0ZSAvPSAxMDAwOwo+ICsKPiArCXRj MnJ3ID0gMTsKPiArCXRydzJjID0gMTsKPiArCj4gKwl0cndwdyA9IG1heCh0aW1pbmdzLT50V0Nf bWluLCB0aW1pbmdzLT50UkNfbWluKSAvIDEwMDA7Cj4gKwl0cndwdyA9IERJVl9ST1VORF9VUCh0 cndwdyAqIHJhdGUsIDEwMDAwMDApOwo+ICsKPiArCXRlbXAgPSB0aW1pbmdzLT50UkVBX21heCAv IDEwMDA7Cj4gKwl0ZW1wID0gRElWX1JPVU5EX1VQKHRlbXAgKiByYXRlLCAxMDAwMDAwKTsKPiAr Cj4gKwlpZiAodHJ3cHcgPCB0ZW1wKQo+ICsJCXRyd3B3ID0gdGVtcDsKPiArCj4gKwkvKgo+ICsJ ICogQUNDT046IGFjY2VzcyB0aW1pbmcgY29udHJvbCByZWdpc3Rlcgo+ICsJICogLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICsJICogMzE6MTg6IHJlc2VydmVkCj4gKwkg KiAxNzoxMjogY3NydywgY2xvY2sgY3ljbGVzIGZyb20gdGhlIGZhbGxpbmcgZWRnZSBvZiBDU24g dG8gdGhlCj4gKwkgKiAgIGZhbGxpbmcgZWRnZSBvZiBSRG4gb3IgV1JuCj4gKwkgKiAxMToxMTog cmVzZXJ2ZWQKPiArCSAqIDEwOjA1OiByd3B3LCB0aGUgd2lkdGggb2YgUkRuIG9yIFdSbiBpbiBw cm9jZXNzb3IgY2xvY2sgY3ljbGVzCj4gKwkgKiAwNDowMDogcndjcywgY2xvY2sgY3ljbGVzIGZy b20gdGhlIHJpc2luZyBlZGdlIG9mIFJEbiBvciBXUm4gdG8gdGhlCj4gKwkgKiAgIHJpc2luZyBl ZGdlIG9mIENTbgo+ICsJICovCj4gKwl0ZW1wID0gQUNDVElNSU5HKHRjMnJ3LCB0cndwdywgdHJ3 MmMpOwo+ICsJd3JpdGVsKHRlbXAsIG5mYy0+cmVncyArIE5GQ19GTVdBSVQpOwoKWW91IHNob3Vs ZCBzYXZlIHRoZSBjaGlwJ3MgdGltaW5nIGNvbmZpZ3VyYXRpb24gaW5zdGVhZCBvZiB3cml0aW5n IGl0CmhlcmUsIGFuZCBzZXR0aW5nIHRoZSByZWdpc3RlciB2YWx1ZSBkdXJpbmcgY2hpcCBzZWxl Y3Rpb24uIFRoaXMgd2F5CnlvdSBtYXkgaGFuZGxlIHNldmVyYWwgY2hpcHMgd2l0aCBkaWZmZXJl bnQgdGltaW5nCmNvbnN0cmFpbnRzL2NvbmZpZ3VyYXRpb25zLgoKPiArCj4gKwlyZXR1cm4gMDsK PiArfQo+ICsKPiArc3RhdGljIGludCBya19uZmNfaHdfZWNjX3NldHVwKHN0cnVjdCBuYW5kX2No aXAgKmNoaXAsCj4gKwkJCSAgICAgICBzdHJ1Y3QgbmFuZF9lY2NfY3RybCAqZWNjLAo+ICsJCQkg ICAgICAgdWludDMyX3Qgc3RyZW5ndGgpCj4gK3sKPiArCXN0cnVjdCBya19uZmMgKm5mYyA9IG5h bmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsKPiArCXUzMiByZWcsIGk7Cj4gKwo+ICsJZm9y IChpID0gMDsgaSA8IE5GQ19FQ0NfTUFYX01PREVTOyBpKyspIHsKPiArCQlpZiAoZWNjLT5zdHJl bmd0aCA9PSBuZmMtPmNmZy0+ZWNjX3N0cmVuZ3Roc1tpXSkgewo+ICsJCQlyZWcgPSBuZmMtPmNm Zy0+ZWNjX2NmZ3NbaV07Cj4gKwkJCWJyZWFrOwo+ICsJCX0KPiArCX0KPiArCj4gKwlpZiAoaSA+ PSBORkNfRUNDX01BWF9NT0RFUykKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwl3cml0ZWwo cmVnLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+YmNoY3RsX29mZik7CgpTYW1lIGhlcmUsIGlmIHlv dSBoYW5kbGUgZGlmZmVyZW50IGNoaXBzLCB0aGV5IG1heSB1c2UgZGlmZmVyZW50IEVDQwpjb25m aWd1cmF0aW9ucywgdGhpcyBzaG91bGQgYmUgaGFuZGxlZC4KCj4gKwo+ICsJcmV0dXJuIDA7Cj4g K30KPiArCj4gK3N0YXRpYyB2b2lkIHJrX25mY194ZmVyX3N0YXJ0KHN0cnVjdCBya19uZmMgKm5m YywgdTggcncsIHU4IG5fS0IsCj4gKwkJCSAgICAgIGRtYV9hZGRyX3QgZG1hX2RhdGEsIGRtYV9h ZGRyX3QgZG1hX29vYikKPiArewo+ICsJdTMyIGRtYV9yZWcsIGZsX3JlZywgYmNoX3JlZzsKPiAr Cj4gKwlkbWFfcmVnID0gRE1BX1NUIHwgKCghcncpIDw8IERNQV9XUikgfCBETUFfRU4gfCAoMiA8 PCBETUFfQUhCX1NJWkUpIHwKPiArCSAgICAgICg3IDw8IERNQV9CVVJTVF9TSVpFKSB8ICgxNiA8 PCBETUFfSU5DX05VTSk7Cj4gKwo+ICsJZmxfcmVnID0gKHJ3IDw8IEZMQ1RMX1dSKSB8IEZMQ1RM X1hGRVJfRU4gfCBGTENUTF9BQ09SUkVDVCB8Cj4gKwkJIChuX0tCIDw8IEZMQ1RMX1hGRVJfU0VD VE9SKSB8IEZMQ1RMX1RPR19GSVg7Cj4gKwo+ICsJaWYgKG5mYy0+Y2ZnLT50eXBlID09IE5GQ19W NiB8fCBuZmMtPmNmZy0+dHlwZSA9PSBORkNfVjgpIHsKPiArCQliY2hfcmVnID0gcmVhZGxfcmVs YXhlZChuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+YmNoY3RsX29mZik7Cj4gKwkJYmNoX3JlZyA9IChi Y2hfcmVnICYgKH5CQ0hDVExfQkFOS19NKSkgfAo+ICsJCQkgIChuZmMtPnNlbGVjdGVkX2Jhbmsg PDwgQkNIQ1RMX0JBTkspOwo+ICsJCXdyaXRlbChiY2hfcmVnLCBuZmMtPnJlZ3MgKyBuZmMtPmNm Zy0+YmNoY3RsX29mZik7Cj4gKwl9Cj4gKwo+ICsJd3JpdGVsKGRtYV9yZWcsIG5mYy0+cmVncyAr IG5mYy0+Y2ZnLT5kbWFfY2ZnX29mZik7Cj4gKwl3cml0ZWwoKHUzMilkbWFfZGF0YSwgbmZjLT5y ZWdzICsgbmZjLT5jZmctPmRtYV9kYXRhX2J1Zl9vZmYpOwo+ICsJd3JpdGVsKCh1MzIpZG1hX29v YiwgbmZjLT5yZWdzICsgbmZjLT5jZmctPmRtYV9vb2JfYnVmX29mZik7Cj4gKwl3cml0ZWwoZmxf cmVnLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZmxjdGxfb2ZmKTsKPiArCWZsX3JlZyB8PSBGTENU TF9YRkVSX1NUOwo+ICsJd3JpdGVsKGZsX3JlZywgbmZjLT5yZWdzICsgbmZjLT5jZmctPmZsY3Rs X29mZik7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX3dhaXRfZm9yX3hmZXJfZG9uZShz dHJ1Y3QgcmtfbmZjICpuZmMpCj4gK3sKPiArCXZvaWQgX19pb21lbSAqcHRyOwo+ICsJaW50IHJl dCA9IDA7Cj4gKwl1MzIgcmVnOwo+ICsKPiArCXB0ciA9IG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5m bGN0bF9vZmY7Cj4gKwo+ICsJcmV0ID0gcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXQocHRyLCBy ZWcsCj4gKwkJCQkJIHJlZyAmIEZMQ1RMX1hGRVJfUkVBRFksCj4gKwkJCQkJIDEwLCBORkNfVElN RU9VVCk7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBya19uZmNf d3JpdGVfcGFnZV9yYXcoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgdTggKmJ1ZiwKPiAr CQkJCSBpbnQgb29iX29uLCBpbnQgcGFnZSkKPiArewo+ICsJc3RydWN0IG10ZF9pbmZvICptdGQg PSBuYW5kX3RvX210ZChjaGlwKTsKPiArCXN0cnVjdCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2Nv bnRyb2xsZXJfZGF0YShjaGlwKTsKPiArCXN0cnVjdCBuYW5kX2VjY19jdHJsICplY2MgPSAmY2hp cC0+ZWNjOwo+ICsJaW50IHJldCA9IDA7Cj4gKwl1MzIgaTsKPiArCj4gKwlpZiAoIWJ1ZikKPiAr CQltZW1zZXQobmZjLT5idWZmZXIsIDB4ZmYsIG10ZC0+d3JpdGVzaXplICsgbXRkLT5vb2JzaXpl KTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgZWNjLT5zdGVwczsgaSsrKSB7Cj4gKwkJLyogQ29w eSBkYXRhIHRvIG5mYyBidWZmZXIuICovCj4gKwkJaWYgKGJ1ZikKPiArCQkJbWVtY3B5KHJrX25m Y19kYXRhX3B0cihjaGlwLCBpKSwKPiArCQkJICAgICAgIHJrX25mY19idWZfdG9fZGF0YV9wdHIo Y2hpcCwgYnVmLCBpKSwKPiArCQkJICAgICAgIGVjYy0+c2l6ZSk7Cj4gKwkJLyoKPiArCQkgKiBU aGUgZmlyc3QgZm91ciBieXRlcyBvZiBPT0IgYXJlIHJlc2VydmVkIGZvciB0aGUKPiArCQkgKiBi b290IFJPTS4gSW4gc29tZSBkZWJ1Z2dpbmcgY2FzZXMsIHN1Y2ggYXMgd2l0aCBhCj4gKwkJICog cmVhZCwgZXJhc2UgYW5kIHdyaXRlIGJhY2sgdGVzdCB0aGVzZSA0IGJ5dGVzIHN0b3JlZAo+ICsJ CSAqIGluIE9PQiBhbHNvIG5lZWQgdG8gYmUgd3JpdHRlbiBiYWNrLgo+ICsJCSAqLwoKVGhlIGNv bnRyb2xsZXIgZHJpdmVyIHNob3VsZCBub3QgYXJiaXRyYXRlIHRoaXMuIElmIHlvdSBkb24ndCB3 YW50IHRvCmV4cG9zZSB0aGVzZSBieXRlcywgdGhleSBzaG91bGQgbm90IGFwcGVhciAiZnJlZSIg aW4gdGhlIE9PQiBsYXlvdXQsCmJ1dCBhIHJhdyBhY2Nlc3MgKm11c3QqIGJ1dCBhYmxlIHRvIGFk ZHJlc3MgdGhlIGVudGlyZSBwYWdlL29vYi4KCj4gKwkJaWYgKCFpKQo+ICsJCQltZW1jcHkocmtf bmZjX29vYl9wdHIoY2hpcCwgaSksCj4gKwkJCSAgICAgICBya19uZmNfYnVmX3RvX29vYl9wdHIo Y2hpcCwgZWNjLT5zdGVwcyAtIDEpLAo+ICsJCQkgICAgICAgTkZDX1NZU19EQVRBX1NJWkUpOwo+ ICsJCWVsc2UKPiArCQkJbWVtY3B5KHJrX25mY19vb2JfcHRyKGNoaXAsIGkpLAo+ICsJCQkgICAg ICAgcmtfbmZjX2J1Zl90b19vb2JfcHRyKGNoaXAsIGkgLSAxKSwKPiArCQkJICAgICAgIE5GQ19T WVNfREFUQV9TSVpFKTsKPiArCQkvKiBDb3B5IEVDQyBkYXRhIHRvIHRoZSBORkMgYnVmZmVyLiAq Lwo+ICsJCW1lbWNweShya19uZmNfb29iX3B0cihjaGlwLCBpKSArIE5GQ19TWVNfREFUQV9TSVpF LAo+ICsJCSAgICAgICBya19uZmNfYnVmX3RvX29vYl9lY2NfcHRyKGNoaXAsIGkpLAo+ICsJCSAg ICAgICBlY2MtPmJ5dGVzKTsKPiArCX0KPiArCj4gKwluYW5kX3Byb2dfcGFnZV9iZWdpbl9vcChj aGlwLCBwYWdlLCAwLCBOVUxMLCAwKTsKPiArCXJrX25mY193cml0ZV9idWYobmZjLCBidWYsIG10 ZC0+d3JpdGVzaXplICsgbXRkLT5vb2JzaXplKTsKPiArCXJldCA9IG5hbmRfcHJvZ19wYWdlX2Vu ZF9vcChjaGlwKTsKPiArCj4gKwkvKgo+ICsJICogRGVzZWxlY3QgdGhlIGN1cnJlbnRseSBzZWxl Y3RlZCB0YXJnZXQgYWZ0ZXIgdGhlIG9wcyBpcyBkb25lCj4gKwkgKiB0byByZWR1Y2UgdGhlIHBv d2VyIGNvbnN1bXB0aW9uLgo+ICsJICovCj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwgLTEp Owo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX3dyaXRl X29vYihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgcGFnZSkKPiArewo+ICsJcmV0dXJuIHJr X25mY193cml0ZV9wYWdlX3JhdyhjaGlwLCBOVUxMLCAxLCBwYWdlKTsKCk5vdCBzdXJlIHRoaXMg aXMgcmVsZXZhbnQuIFlvdSBzaG91bGQgbm90IGRvIHRoYXQsIEkgZ3Vlc3MgdGhlIGNvcmUKd2ls bCBhdXRvbWF0aWNhbGx5IHRha2UgY2FyZSBvZiBpdC4KCj4gK30KPiArCj4gK3N0YXRpYyBpbnQg cmtfbmZjX3dyaXRlX3BhZ2VfaHdlY2Moc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgdTgg KmJ1ZiwKPiArCQkJCSAgIGludCBvb2Jfb24sIGludCBwYWdlKQo+ICt7Cj4gKwlzdHJ1Y3QgbXRk X2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0g bmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsJc3RydWN0IHJrX25mY19uYW5kX2No aXAgKnJrbmFuZCA9IHJrX25mY190b19ya25hbmQoY2hpcCk7Cj4gKwlzdHJ1Y3QgbmFuZF9lY2Nf Y3RybCAqZWNjID0gJmNoaXAtPmVjYzsKPiArCWludCBvb2Jfc3RlcCA9IChlY2MtPmJ5dGVzID4g NjApID8gTkZDX01BWF9PT0JfUEVSX1NURVAgOgo+ICsJCQlORkNfTUlOX09PQl9QRVJfU1RFUDsK PiArCWludCBwYWdlc19wZXJfYmxrID0gbXRkLT5lcmFzZXNpemUgLyBtdGQtPndyaXRlc2l6ZTsK PiArCWludCByZXQgPSAwLCBpLCBib290X3JvbV9tb2RlID0gMDsKPiArCWRtYV9hZGRyX3QgZG1h X2RhdGEsIGRtYV9vb2I7Cj4gKwl1MzIgcmVnOwo+ICsJdTggKm9vYjsKPiArCj4gKwluYW5kX3By b2dfcGFnZV9iZWdpbl9vcChjaGlwLCBwYWdlLCAwLCBOVUxMLCAwKTsKPiArCj4gKwltZW1jcHko bmZjLT5wYWdlX2J1ZiwgYnVmLCBtdGQtPndyaXRlc2l6ZSk7Cj4gKwo+ICsJLyoKPiArCSAqIFRo ZSBmaXJzdCBibG9ja3MgKDQsIDggb3IgMTYgZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UpIGFyZSB1 c2VkCj4gKwkgKiBieSB0aGUgYm9vdCBST00gYW5kIHRoZSBmaXJzdCAzMiBiaXRzIG9mIE9PQiBu ZWVkIHRvIGxpbmsgdG8KPiArCSAqIHRoZSBuZXh0IHBhZ2UgYWRkcmVzcyBpbiB0aGUgc2FtZSBi bG9jay4gV2UgY2FuJ3QgZGlyZWN0bHkgY29weQo+ICsJICogT09CIGRhdGEgZnJvbSB0aGUgTVRE IGZyYW1ld29yaywgYmVjYXVzZSB0aGlzIHBhZ2UgYWRkcmVzcwo+ICsJICogY29uZmxpY3RzIGZv ciBleGFtcGxlIHdpdGggdGhlIGJhZCBibG9jayBtYXJrZXIgKEJCTSksCj4gKwkgKiBzbyB3ZSBz aGlmdCBhbGwgT09CIGRhdGEgaW5jbHVkaW5nIHRoZSBCQk0gd2l0aCA0IGJ5dGUgcG9zaXRpb25z Lgo+ICsJICogQXMgYSBjb25zZXF1ZW5jZSB0aGUgT09CIHNpemUgYXZhaWxhYmxlIHRvIHRoZSBN VEQgZnJhbWV3b3JrIGlzCj4gKwkgKiBhbHNvIHJlZHVjZWQgd2l0aCA0IGJ5dGVzLgo+ICsJICoK PiArCSAqICAgIFBBMCBQQTEgUEEyIFBBMyB8IEJCTSBPT0IxIE9PQjIgT09CMyB8IC4uLgo+ICsJ ICoKPiArCSAqIElmIGEgTkFORCBpcyBub3QgYSBib290IG1lZGl1bSBvciB0aGUgcGFnZSBpcyBu b3QgYSBib290IGJsb2NrLAo+ICsJICogdGhlIGZpcnN0IDQgYnl0ZXMgYXJlIGxlZnQgdW50b3Vj aGVkIGJ5IHdyaXRpbmcgMHhGRiB0byB0aGVtLgo+ICsJICoKPiArCSAqICAgMHhGRiAweEZGIDB4 RkYgMHhGRiB8IEJCTSBPT0IxIE9PQjIgT09CMyB8IC4uLgo+ICsJICoKPiArCSAqIENvbmZpZ3Vy ZSB0aGUgRUNDIGFsZ29yaXRobSBzdXBwb3J0ZWQgYnkgdGhlIGJvb3QgUk9NLgo+ICsJICovCj4g KwlpZiAoKHBhZ2UgPCBwYWdlc19wZXJfYmxrICogcmtuYW5kLT5ib290X2Jsa3MpICYmCj4gKwkg ICAgKGNoaXAtPm9wdGlvbnMgJiBOQU5EX0lTX0JPT1RfTUVESVVNKSkgewo+ICsJCWJvb3Rfcm9t X21vZGUgPSAxOwo+ICsJCWlmIChya25hbmQtPmJvb3RfZWNjICE9IGVjYy0+c3RyZW5ndGgpCj4g KwkJCXJrX25mY19od19lY2Nfc2V0dXAoY2hpcCwgZWNjLAo+ICsJCQkJCSAgICBya25hbmQtPmJv b3RfZWNjKTsKPiArCX0KPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgZWNjLT5zdGVwczsgaSsrKSB7 Cj4gKwkJaWYgKCFpKSB7Cj4gKwkJCXJlZyA9IDB4RkZGRkZGRkY7Cj4gKwkJfSBlbHNlIHsKPiAr CQkJb29iID0gY2hpcC0+b29iX3BvaSArIChpIC0gMSkgKiBORkNfU1lTX0RBVEFfU0laRTsKPiAr CQkJcmVnID0gb29iWzBdIHwgb29iWzFdIDw8IDggfCBvb2JbMl0gPDwgMTYgfAo+ICsJCQkgICAg ICBvb2JbM10gPDwgMjQ7Cj4gKwkJfQo+ICsJCWlmICghaSAmJiBib290X3JvbV9tb2RlKQo+ICsJ CQlyZWcgPSAocGFnZSAmIChwYWdlc19wZXJfYmxrIC0gMSkpICogNDsKPiArCj4gKwkJaWYgKG5m Yy0+Y2ZnLT50eXBlID09IE5GQ19WOSkKPiArCQkJbmZjLT5vb2JfYnVmW2ldID0gcmVnOwo+ICsJ CWVsc2UKPiArCQkJbmZjLT5vb2JfYnVmW2kgKiAob29iX3N0ZXAgLyA0KV0gPSByZWc7Cj4gKwl9 Cj4gKwo+ICsJZG1hX2RhdGEgPSBkbWFfbWFwX3NpbmdsZShuZmMtPmRldiwgKHZvaWQgKiluZmMt PnBhZ2VfYnVmLAo+ICsJCQkJICBtdGQtPndyaXRlc2l6ZSwgRE1BX1RPX0RFVklDRSk7Cj4gKwlk bWFfb29iID0gZG1hX21hcF9zaW5nbGUobmZjLT5kZXYsIG5mYy0+b29iX2J1ZiwKPiArCQkJCSBl Y2MtPnN0ZXBzICogb29iX3N0ZXAsCj4gKwkJCQkgRE1BX1RPX0RFVklDRSk7Cj4gKwo+ICsJcmVp bml0X2NvbXBsZXRpb24oJm5mYy0+ZG9uZSk7Cj4gKwl3cml0ZWwoSU5UX0RNQSwgbmZjLT5yZWdz ICsgbmZjLT5jZmctPmludF9lbl9vZmYpOwo+ICsKPiArCXJrX25mY194ZmVyX3N0YXJ0KG5mYywg TkZDX1dSSVRFLCBlY2MtPnN0ZXBzLCBkbWFfZGF0YSwKPiArCQkJICBkbWFfb29iKTsKPiArCXJl dCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmbmZjLT5kb25lLAo+ICsJCQkJCSAgbXNl Y3NfdG9famlmZmllcygxMDApKTsKPiArCWlmICghcmV0KQo+ICsJCWRldl93YXJuKG5mYy0+ZGV2 LCAid3JpdGU6IHdhaXQgZG1hIGRvbmUgdGltZW91dC5cbiIpOwo+ICsJLyoKPiArCSAqIFdoZXRo ZXIgdGhlIERNQSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQgb3Igbm90LiBUaGUgZHJpdmVyCj4gKwkg KiBuZWVkcyB0byBjaGVjayB0aGUgTkZDYHMgc3RhdHVzIHJlZ2lzdGVyIHRvIHNlZSBpZiB0aGUg ZGF0YQo+ICsJICogdHJhbnNmZXIgd2FzIGNvbXBsZXRlZC4KPiArCSAqLwo+ICsJcmV0ID0gcmtf bmZjX3dhaXRfZm9yX3hmZXJfZG9uZShuZmMpOwo+ICsKPiArCWRtYV91bm1hcF9zaW5nbGUobmZj LT5kZXYsIGRtYV9kYXRhLCBtdGQtPndyaXRlc2l6ZSwKPiArCQkJIERNQV9UT19ERVZJQ0UpOwo+ ICsJZG1hX3VubWFwX3NpbmdsZShuZmMtPmRldiwgZG1hX29vYiwgZWNjLT5zdGVwcyAqIG9vYl9z dGVwLAo+ICsJCQkgRE1BX1RPX0RFVklDRSk7Cj4gKwo+ICsJaWYgKGJvb3Rfcm9tX21vZGUgJiYg cmtuYW5kLT5ib290X2VjYyAhPSBlY2MtPnN0cmVuZ3RoKQo+ICsJCXJrX25mY19od19lY2Nfc2V0 dXAoY2hpcCwgZWNjLCBlY2MtPnN0cmVuZ3RoKTsKPiArCj4gKwlpZiAocmV0KSB7Cj4gKwkJcmV0 ID0gLUVJTzsKPiArCQlkZXZfZXJyKG5mYy0+ZGV2LAo+ICsJCQkid3JpdGU6IHdhaXQgdHJhbnNm ZXIgZG9uZSB0aW1lb3V0LlxuIik7Cj4gKwl9Cj4gKwo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4g cmV0Owo+ICsKPiArCXJldCA9IG5hbmRfcHJvZ19wYWdlX2VuZF9vcChjaGlwKTsKPiArCj4gKwkv Kgo+ICsJICogRGVzZWxlY3QgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0YXJnZXQgYWZ0ZXIgdGhl IG9wcyBpcyBkb25lCj4gKwkgKiB0byByZWR1Y2UgdGhlIHBvd2VyIGNvbnN1bXB0aW9uLgo+ICsJ ICovCgpJZiB5b3UgZm9yY2UgdGhpcyBkZXNlbGVjdGlvbiwgeW91ciBzaG91bGQgcHJvYmFibHkg ZG8gaXQgZXZlbiBpbiBjYXNlCm9mIGVycm9yPwoKPiArCXJrX25mY19zZWxlY3RfY2hpcChjaGlw LCAtMSk7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBya19uZmNf cmVhZF9wYWdlX3JhdyhzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCB1OCAqYnVmLCBpbnQgb29iX29u LAo+ICsJCQkJaW50IHBhZ2UpCj4gK3sKPiArCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gbmFuZF90 b19tdGQoY2hpcCk7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dldF9jb250cm9sbGVy X2RhdGEoY2hpcCk7Cj4gKwlzdHJ1Y3QgbmFuZF9lY2NfY3RybCAqZWNjID0gJmNoaXAtPmVjYzsK PiArCWludCBpOwo+ICsKPiArCW5hbmRfcmVhZF9wYWdlX29wKGNoaXAsIHBhZ2UsIDAsIE5VTEws IDApOwo+ICsJcmtfbmZjX3JlYWRfYnVmKG5mYywgbmZjLT5idWZmZXIsIG10ZC0+d3JpdGVzaXpl ICsgbXRkLT5vb2JzaXplKTsKPiArCj4gKwkvKgo+ICsJICogRGVzZWxlY3QgdGhlIGN1cnJlbnRs eSBzZWxlY3RlZCB0YXJnZXQgYWZ0ZXIgdGhlIG9wcyBpcyBkb25lCj4gKwkgKiB0byByZWR1Y2Ug dGhlIHBvd2VyIGNvbnN1bXB0aW9uLgo+ICsJICovCj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hp cCwgLTEpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBlY2MtPnN0ZXBzOyBpKyspIHsKPiArCQkv Kgo+ICsJCSAqIFRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIE9PQiBhcmUgcmVzZXJ2ZWQgZm9yIHRo ZQo+ICsJCSAqIGJvb3QgUk9NLiBJbiBzb21lIGRlYnVnZ2luZyBjYXNlcywgc3VjaCBhcyB3aXRo IGEgcmVhZCwKPiArCQkgKiBlcmFzZSBhbmQgd3JpdGUgYmFjayB0ZXN0LCB0aGVzZSA0IGJ5dGVz IGFsc28gbXVzdCBiZQo+ICsJCSAqIHNhdmVkIHNvbWV3aGVyZSwgb3RoZXJ3aXNlIHRoaXMgaW5m b3JtYXRpb24gd2lsbCBiZQo+ICsJCSAqIGxvc3QgZHVyaW5nIGEgd3JpdGUgYmFjay4KCkRpdHRv Cgo+ICsJCSAqLwo+ICsJCWlmICghaSkKPiArCQkJbWVtY3B5KHJrX25mY19idWZfdG9fb29iX3B0 cihjaGlwLCBlY2MtPnN0ZXBzIC0gMSksCj4gKwkJCSAgICAgICBya19uZmNfb29iX3B0cihjaGlw LCBpKSwKPiArCQkJICAgICAgIE5GQ19TWVNfREFUQV9TSVpFKTsKPiArCQllbHNlCj4gKwkJCW1l bWNweShya19uZmNfYnVmX3RvX29vYl9wdHIoY2hpcCwgaSAtIDEpLAo+ICsJCQkgICAgICAgcmtf bmZjX29vYl9wdHIoY2hpcCwgaSksCj4gKwkJCSAgICAgICBORkNfU1lTX0RBVEFfU0laRSk7Cj4g KwkJLyogQ29weSBFQ0MgZGF0YSBmcm9tIHRoZSBORkMgYnVmZmVyLiAqLwo+ICsJCW1lbWNweShy a19uZmNfYnVmX3RvX29vYl9lY2NfcHRyKGNoaXAsIGkpLAo+ICsJCSAgICAgICBya19uZmNfb29i X3B0cihjaGlwLCBpKSArIE5GQ19TWVNfREFUQV9TSVpFLAo+ICsJCSAgICAgICBlY2MtPmJ5dGVz KTsKPiArCQkvKiBDb3B5IGRhdGEgZnJvbSB0aGUgTkZDIGJ1ZmZlci4gKi8KPiArCQlpZiAoYnVm KQo+ICsJCQltZW1jcHkocmtfbmZjX2J1Zl90b19kYXRhX3B0cihjaGlwLCBidWYsIGkpLAo+ICsJ CQkgICAgICAgcmtfbmZjX2RhdGFfcHRyKGNoaXAsIGkpLAo+ICsJCQkgICAgICAgZWNjLT5zaXpl KTsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBya19uZmNf cmVhZF9vb2Ioc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgaW50IHBhZ2UpCj4gK3sKPiArCXJldHVy biBya19uZmNfcmVhZF9wYWdlX3JhdyhjaGlwLCBOVUxMLCAxLCBwYWdlKTsKCkRpdHRvCgo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19yZWFkX3BhZ2VfaHdlY2Moc3RydWN0IG5hbmRfY2hp cCAqY2hpcCwgdTggKmJ1ZiwgaW50IG9vYl9vbiwKPiArCQkJCSAgaW50IHBhZ2UpCj4gK3sKPiAr CXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gbmFuZF90b19tdGQoY2hpcCk7Cj4gKwlzdHJ1Y3Qgcmtf bmZjICpuZmMgPSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4gKwlzdHJ1Y3Qgcmtf bmZjX25hbmRfY2hpcCAqcmtuYW5kID0gcmtfbmZjX3RvX3JrbmFuZChjaGlwKTsKPiArCXN0cnVj dCBuYW5kX2VjY19jdHJsICplY2MgPSAmY2hpcC0+ZWNjOwo+ICsJaW50IG9vYl9zdGVwID0gKGVj Yy0+Ynl0ZXMgPiA2MCkgPyBORkNfTUFYX09PQl9QRVJfU1RFUCA6Cj4gKwkJCU5GQ19NSU5fT09C X1BFUl9TVEVQOwo+ICsJaW50IHBhZ2VzX3Blcl9ibGsgPSBtdGQtPmVyYXNlc2l6ZSAvIG10ZC0+ d3JpdGVzaXplOwo+ICsJZG1hX2FkZHJfdCBkbWFfZGF0YSwgZG1hX29vYjsKPiArCWludCByZXQg PSAwLCBpLCBib290X3JvbV9tb2RlID0gMDsKPiArCWludCBiaXRmbGlwcyA9IDAsIGJjaF9zdDsK PiArCXU4ICpvb2I7Cj4gKwl1MzIgdG1wOwo+ICsKPiArCW5hbmRfcmVhZF9wYWdlX29wKGNoaXAs IHBhZ2UsIDAsIE5VTEwsIDApOwo+ICsKPiArCWRtYV9kYXRhID0gZG1hX21hcF9zaW5nbGUobmZj LT5kZXYsIG5mYy0+cGFnZV9idWYsCj4gKwkJCQkgIG10ZC0+d3JpdGVzaXplLAo+ICsJCQkJICBE TUFfRlJPTV9ERVZJQ0UpOwo+ICsJZG1hX29vYiA9IGRtYV9tYXBfc2luZ2xlKG5mYy0+ZGV2LCBu ZmMtPm9vYl9idWYsCj4gKwkJCQkgZWNjLT5zdGVwcyAqIG9vYl9zdGVwLAo+ICsJCQkJIERNQV9G Uk9NX0RFVklDRSk7Cj4gKwo+ICsJLyoKPiArCSAqIFRoZSBmaXJzdCBibG9ja3MgKDQsIDggb3Ig MTYgZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UpCj4gKwkgKiBhcmUgdXNlZCBieSB0aGUgYm9vdCBS T00uCj4gKwkgKiBDb25maWd1cmUgdGhlIEVDQyBhbGdvcml0aG0gc3VwcG9ydGVkIGJ5IHRoZSBi b290IFJPTS4KPiArCSAqLwo+ICsJaWYgKChwYWdlIDwgcGFnZXNfcGVyX2JsayAqIHJrbmFuZC0+ Ym9vdF9ibGtzKSAmJgo+ICsJICAgIChjaGlwLT5vcHRpb25zICYgTkFORF9JU19CT09UX01FRElV TSkpIHsKPiArCQlib290X3JvbV9tb2RlID0gMTsKPiArCQlpZiAocmtuYW5kLT5ib290X2VjYyAh PSBlY2MtPnN0cmVuZ3RoKQo+ICsJCQlya19uZmNfaHdfZWNjX3NldHVwKGNoaXAsIGVjYywKPiAr CQkJCQkgICAgcmtuYW5kLT5ib290X2VjYyk7Cj4gKwl9Cj4gKwo+ICsJcmVpbml0X2NvbXBsZXRp b24oJm5mYy0+ZG9uZSk7Cj4gKwl3cml0ZWwoSU5UX0RNQSwgbmZjLT5yZWdzICsgbmZjLT5jZmct PmludF9lbl9vZmYpOwo+ICsJcmtfbmZjX3hmZXJfc3RhcnQobmZjLCBORkNfUkVBRCwgZWNjLT5z dGVwcywgZG1hX2RhdGEsCj4gKwkJCSAgZG1hX29vYik7Cj4gKwlyZXQgPSB3YWl0X2Zvcl9jb21w bGV0aW9uX3RpbWVvdXQoJm5mYy0+ZG9uZSwKPiArCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoMTAw KSk7Cj4gKwlpZiAoIXJldCkKPiArCQlkZXZfd2FybihuZmMtPmRldiwgInJlYWQ6IHdhaXQgZG1h IGRvbmUgdGltZW91dC5cbiIpOwo+ICsJLyoKPiArCSAqIFdoZXRoZXIgdGhlIERNQSB0cmFuc2Zl ciBpcyBjb21wbGV0ZWQgb3Igbm90LiBUaGUgZHJpdmVyCj4gKwkgKiBuZWVkcyB0byBjaGVjayB0 aGUgTkZDYHMgc3RhdHVzIHJlZ2lzdGVyIHRvIHNlZSBpZiB0aGUgZGF0YQo+ICsJICogdHJhbnNm ZXIgd2FzIGNvbXBsZXRlZC4KPiArCSAqLwo+ICsJcmV0ID0gcmtfbmZjX3dhaXRfZm9yX3hmZXJf ZG9uZShuZmMpOwo+ICsJZG1hX3VubWFwX3NpbmdsZShuZmMtPmRldiwgZG1hX2RhdGEsIG10ZC0+ d3JpdGVzaXplLAo+ICsJCQkgRE1BX0ZST01fREVWSUNFKTsKPiArCWRtYV91bm1hcF9zaW5nbGUo bmZjLT5kZXYsIGRtYV9vb2IsIGVjYy0+c3RlcHMgKiBvb2Jfc3RlcCwKPiArCQkJIERNQV9GUk9N X0RFVklDRSk7Cj4gKwo+ICsJaWYgKHJldCkgewo+ICsJCWJpdGZsaXBzID0gLUVJTzsKPiArCQlk ZXZfZXJyKG5mYy0+ZGV2LAo+ICsJCQkicmVhZDogd2FpdCB0cmFuc2ZlciBkb25lIHRpbWVvdXQu XG4iKTsKPiArCQlnb3RvIG91dDsKPiArCX0KPiArCj4gKwlmb3IgKGkgPSAxOyBpIDwgZWNjLT5z dGVwczsgaSsrKSB7Cj4gKwkJb29iID0gY2hpcC0+b29iX3BvaSArIChpIC0gMSkgKiBORkNfU1lT X0RBVEFfU0laRTsKPiArCQlpZiAobmZjLT5jZmctPnR5cGUgPT0gTkZDX1Y5KQo+ICsJCQl0bXAg PSBuZmMtPm9vYl9idWZbaV07Cj4gKwkJZWxzZQo+ICsJCQl0bXAgPSBuZmMtPm9vYl9idWZbaSAq IChvb2Jfc3RlcCAvIDQpXTsKPiArCQkqb29iKysgPSAodTgpdG1wOwo+ICsJCSpvb2IrKyA9ICh1 OCkodG1wID4+IDgpOwo+ICsJCSpvb2IrKyA9ICh1OCkodG1wID4+IDE2KTsKPiArCQkqb29iKysg PSAodTgpKHRtcCA+PiAyNCk7Cj4gKwl9Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IChlY2MtPnN0 ZXBzIC8gMik7IGkrKykgewo+ICsJCWJjaF9zdCA9IHJlYWRsX3JlbGF4ZWQobmZjLT5yZWdzICsK PiArCQkJCSAgICAgICBuZmMtPmNmZy0+YmNoX3N0X29mZiArIGkgKiA0KTsKPiArCQlpZiAoYmNo X3N0ICYgQklUKG5mYy0+Y2ZnLT5lY2MwLmVycl9mbGFnX2JpdCkgfHwKPiArCQkgICAgYmNoX3N0 ICYgQklUKG5mYy0+Y2ZnLT5lY2MxLmVycl9mbGFnX2JpdCkpIHsKPiArCQkJbXRkLT5lY2Nfc3Rh dHMuZmFpbGVkKys7Cj4gKwkJCWJpdGZsaXBzID0gMDsKPiArCQl9IGVsc2Ugewo+ICsJCQlyZXQg PSBFQ0NfRVJSX0NOVChiY2hfc3QsIG5mYy0+Y2ZnLT5lY2MwKTsKPiArCQkJbXRkLT5lY2Nfc3Rh dHMuY29ycmVjdGVkICs9IHJldDsKPiArCQkJYml0ZmxpcHMgPSBtYXhfdCh1MzIsIGJpdGZsaXBz LCByZXQpOwo+ICsKPiArCQkJcmV0ID0gRUNDX0VSUl9DTlQoYmNoX3N0LCBuZmMtPmNmZy0+ZWNj MSk7Cj4gKwkJCW10ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCArPSByZXQ7Cj4gKwkJCWJpdGZsaXBz ID0gbWF4X3QodTMyLCBiaXRmbGlwcywgcmV0KTsKPiArCQl9Cj4gKwl9Cj4gK291dDoKPiArCW1l bWNweShidWYsIG5mYy0+cGFnZV9idWYsIG10ZC0+d3JpdGVzaXplKTsKPiArCj4gKwlpZiAoYm9v dF9yb21fbW9kZSAmJiBya25hbmQtPmJvb3RfZWNjICE9IGVjYy0+c3RyZW5ndGgpCj4gKwkJcmtf bmZjX2h3X2VjY19zZXR1cChjaGlwLCBlY2MsIGVjYy0+c3RyZW5ndGgpOwo+ICsKPiArCWlmIChi aXRmbGlwcyA+IGVjYy0+c3RyZW5ndGgpCj4gKwkJZGV2X2VycihuZmMtPmRldiwgInJlYWQgcGFn ZTogJXggZWNjIGVycm9yIVxuIiwgcGFnZSk7Cj4gKwo+ICsJLyoKPiArCSAqIERlc2VsZWN0IHRo ZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGFyZ2V0IGFmdGVyIHRoZSBvcHMgaXMgZG9uZQo+ICsJICog dG8gcmVkdWNlIHRoZSBwb3dlciBjb25zdW1wdGlvbi4KPiArCSAqLwo+ICsJcmtfbmZjX3NlbGVj dF9jaGlwKGNoaXAsIC0xKTsKPiArCj4gKwlyZXR1cm4gYml0ZmxpcHM7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbmxpbmUgdm9pZCBya19uZmNfaHdfaW5pdChzdHJ1Y3QgcmtfbmZjICpuZmMpCj4gK3sK PiArCS8qIERpc2FibGUgZmxhc2ggd3AuICovCj4gKwl3cml0ZWwoRk1DVExfV1AsIG5mYy0+cmVn cyArIE5GQ19GTUNUTCk7Cj4gKwkvKiBDb25maWcgZGVmYXVsdCB0aW1pbmcgNDBucyBhdCAxNTAg TWh6IG5mYyBjbG9jay4gKi8KPiArCXdyaXRlbCgweDEwODEsIG5mYy0+cmVncyArIE5GQ19GTVdB SVQpOwo+ICsJLyogRGlzYWJsZSByYW5kb21pemVyIGFuZCBETUEuICovCj4gKwl3cml0ZWwoMCwg bmZjLT5yZWdzICsgbmZjLT5jZmctPnJhbmRtel9vZmYpOwo+ICsJd3JpdGVsKDAsIG5mYy0+cmVn cyArIG5mYy0+Y2ZnLT5kbWFfY2ZnX29mZik7Cj4gKwl3cml0ZWwoRkxDVExfUlNULCBuZmMtPnJl Z3MgKyBuZmMtPmNmZy0+ZmxjdGxfb2ZmKTsKPiArfQo+ICsKPiArc3RhdGljIGlycXJldHVybl90 IHJrX25mY19pcnEoaW50IGlycSwgdm9pZCAqaWQpCj4gK3sKPiArCXN0cnVjdCBya19uZmMgKm5m YyA9IGlkOwo+ICsJdTMyIHN0YSwgaWVuOwo+ICsKPiArCXN0YSA9IHJlYWRsX3JlbGF4ZWQobmZj LT5yZWdzICsgbmZjLT5jZmctPmludF9zdF9vZmYpOwo+ICsJaWVuID0gcmVhZGxfcmVsYXhlZChu ZmMtPnJlZ3MgKyBuZmMtPmNmZy0+aW50X2VuX29mZik7Cj4gKwo+ICsJaWYgKCEoc3RhICYgaWVu KSkKPiArCQlyZXR1cm4gSVJRX05PTkU7Cj4gKwo+ICsJd3JpdGVsKHN0YSwgbmZjLT5yZWdzICsg bmZjLT5jZmctPmludF9jbHJfb2ZmKTsKPiArCXdyaXRlbCh+c3RhICYgaWVuLCBuZmMtPnJlZ3Mg KyBuZmMtPmNmZy0+aW50X2VuX29mZik7Cj4gKwo+ICsJY29tcGxldGUoJm5mYy0+ZG9uZSk7Cj4g Kwo+ICsJcmV0dXJuIElSUV9IQU5ETEVEOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19l bmFibGVfY2xrcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBya19uZmMgKm5mYykKPiArewo+ ICsJaW50IHJldDsKPiArCj4gKwlpZiAoIUlTX0VSUihuZmMtPm5mY19jbGspKSB7Cj4gKwkJcmV0 ID0gY2xrX3ByZXBhcmVfZW5hYmxlKG5mYy0+bmZjX2Nsayk7Cj4gKwkJaWYgKHJldCkgewo+ICsJ CQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBlbmFibGUgbmZjIGNsa1xuIik7Cj4gKwkJCXJldHVy biByZXQ7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShuZmMt PmFoYl9jbGspOwo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGVu YWJsZSBhaGIgY2xrXG4iKTsKPiArCQlpZiAoIUlTX0VSUihuZmMtPm5mY19jbGspKQo+ICsJCQlj bGtfZGlzYWJsZV91bnByZXBhcmUobmZjLT5uZmNfY2xrKTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJ fQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBya19uZmNfZGlzYWJs ZV9jbGtzKHN0cnVjdCBya19uZmMgKm5mYykKPiArewo+ICsJaWYgKCFJU19FUlIobmZjLT5uZmNf Y2xrKSkKPiArCQljbGtfZGlzYWJsZV91bnByZXBhcmUobmZjLT5uZmNfY2xrKTsKPiArCWNsa19k aXNhYmxlX3VucHJlcGFyZShuZmMtPmFoYl9jbGspOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJr X25mY19vb2JsYXlvdXRfZnJlZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IHNlY3Rpb24sCj4g KwkJCQkgc3RydWN0IG10ZF9vb2JfcmVnaW9uICpvb2JfcmVnaW9uKQo+ICt7Cj4gKwlzdHJ1Y3Qg bmFuZF9jaGlwICpjaGlwID0gbXRkX3RvX25hbmQobXRkKTsKPiArCXN0cnVjdCBya19uZmNfbmFu ZF9jaGlwICpya25hbmQgPSBya19uZmNfdG9fcmtuYW5kKGNoaXApOwo+ICsKPiArCWlmIChzZWN0 aW9uKQo+ICsJCXJldHVybiAtRVJBTkdFOwo+ICsKPiArCS8qCj4gKwkgKiBUaGUgYmVnaW5uaW5n IG9mIHRoZSBPT0IgYXJlYSBzdG9yZXMgdGhlIHJlc2VydmVkIGRhdGEgZm9yIHRoZSBORkMsCj4g KwkgKiB0aGUgc2l6ZSBvZiB0aGUgcmVzZXJ2ZWQgZGF0YSBpcyBORkNfU1lTX0RBVEFfU0laRSBi eXRlcy4KPiArCSAqLwo+ICsJb29iX3JlZ2lvbi0+bGVuZ3RoID0gcmtuYW5kLT5tZXRhZGF0YV9z aXplIC0gTkZDX1NZU19EQVRBX1NJWkUgLSAyOwo+ICsJb29iX3JlZ2lvbi0+b2Zmc2V0ID0gTkZD X1NZU19EQVRBX1NJWkUgKyAyOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMg aW50IHJrX25mY19vb2JsYXlvdXRfZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgc2VjdGlv biwKPiArCQkJCXN0cnVjdCBtdGRfb29iX3JlZ2lvbiAqb29iX3JlZ2lvbikKPiArewo+ICsJc3Ry dWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZF90b19uYW5kKG10ZCk7Cj4gKwlzdHJ1Y3QgcmtfbmZj X25hbmRfY2hpcCAqcmtuYW5kID0gcmtfbmZjX3RvX3JrbmFuZChjaGlwKTsKPiArCj4gKwlpZiAo c2VjdGlvbikKPiArCQlyZXR1cm4gLUVSQU5HRTsKPiArCj4gKwlvb2JfcmVnaW9uLT5sZW5ndGgg PSBtdGQtPm9vYnNpemUgLSBya25hbmQtPm1ldGFkYXRhX3NpemU7Cj4gKwlvb2JfcmVnaW9uLT5v ZmZzZXQgPSBya25hbmQtPm1ldGFkYXRhX3NpemU7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiAr Cj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRkX29vYmxheW91dF9vcHMgcmtfbmZjX29vYmxheW91 dF9vcHMgPSB7Cj4gKwkuZnJlZSA9IHJrX25mY19vb2JsYXlvdXRfZnJlZSwKPiArCS5lY2MgPSBy a19uZmNfb29ibGF5b3V0X2VjYywKPiArfTsKPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX2VjY19p bml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IG10ZF9pbmZvICptdGQpCj4gK3sKPiArCXN0 cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGRfdG9fbmFuZChtdGQpOwo+ICsJc3RydWN0IHJrX25m YyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsJc3RydWN0IG5hbmRf ZWNjX2N0cmwgKmVjYyA9ICZjaGlwLT5lY2M7Cj4gKwljb25zdCB1OCAqc3RyZW5ndGhzID0gbmZj LT5jZmctPmVjY19zdHJlbmd0aHM7Cj4gKwl1OCBtYXhfc3RyZW5ndGgsIG5mY19tYXhfc3RyZW5n dGg7Cj4gKwlpbnQgaTsKPiArCj4gKwluZmNfbWF4X3N0cmVuZ3RoID0gbmZjLT5jZmctPmVjY19z dHJlbmd0aHNbMF07Cj4gKwkvKiBJZiBvcHRpb25hbCBkdCBzZXR0aW5ncyBub3QgcHJlc2VudC4g Ki8KPiArCWlmICghZWNjLT5zaXplIHx8ICFlY2MtPnN0cmVuZ3RoIHx8Cj4gKwkgICAgZWNjLT5z dHJlbmd0aCA+IG5mY19tYXhfc3RyZW5ndGgpIHsKPiArCQljaGlwLT5lY2Muc2l6ZSA9IDEwMjQ7 Cj4gKwkJZWNjLT5zdGVwcyA9IG10ZC0+d3JpdGVzaXplIC8gZWNjLT5zaXplOwo+ICsKPiArCQkv Kgo+ICsJCSAqIEhXIEVDQyBhbHdheXMgcmVxdWVzdHMgdGhlIG51bWJlciBvZiBFQ0MgYnl0ZXMg cGVyIDEwMjQgYnl0ZQo+ICsJCSAqIGJsb2Nrcy4gVGhlIGZpcnN0IDQgT09CIGJ5dGVzIGFyZSBy ZXNlcnZlZCBmb3Igc3lzIGRhdGEuCj4gKwkJICovCj4gKwkJbWF4X3N0cmVuZ3RoID0gKChtdGQt Pm9vYnNpemUgLyBlY2MtPnN0ZXBzKSAtIDQpICogOCAvCj4gKwkJCQkgZmxzKDggKiAxMDI0KTsK PiArCQlpZiAobWF4X3N0cmVuZ3RoID4gbmZjX21heF9zdHJlbmd0aCkKPiArCQkJbWF4X3N0cmVu Z3RoID0gbmZjX21heF9zdHJlbmd0aDsKPiArCj4gKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykg ewo+ICsJCQlpZiAobWF4X3N0cmVuZ3RoID49IHN0cmVuZ3Roc1tpXSkKPiArCQkJCWJyZWFrOwo+ ICsJCX0KPiArCj4gKwkJaWYgKGkgPj0gNCkgewo+ICsJCQlkZXZfZXJyKG5mYy0+ZGV2LCAiVW5z dXBwb3J0ZWQgRUNDIHN0cmVuZ3RoXG4iKTsKPiArCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwo+ICsJ CX0KPiArCj4gKwkJZWNjLT5zdHJlbmd0aCA9IHN0cmVuZ3Roc1tpXTsKPiArCX0KPiArCWVjYy0+ c3RlcHMgPSBtdGQtPndyaXRlc2l6ZSAvIGVjYy0+c2l6ZTsKPiArCWVjYy0+Ynl0ZXMgPSBESVZf Uk9VTkRfVVAoZWNjLT5zdHJlbmd0aCAqIGZscyg4ICogMTAyNCksIDgpOwoKSGVyZSB5b3UgYXNz dW1lIDEwMjQgRUNDIHN0ZXAgc2l6ZSwgdGhpcyBpcyB3cm9uZy4gRWl0aGVyIHRoZQpjb250cm9s bGVyIG9ubHkgc3VwcG9ydHMgMTAyNCBieXRlcyBvciB5b3Ugb2ZmaWNpYWxseSBzdGF0ZSBzb21l d2hlcmUKdGhhdCB5b3UgZG9uJ3Qgc3VwcG9ydCBtb3JlIEVDQyBzdGVwIHNpemVzIHlldC4KCj4g KwkvKiBIVyBFQ0MgYWx3YXlzIHdvcmsgd2l0aCBldmVuIG51bWJlcnMgb2YgRUNDIGJ5dGVzLiAq Lwo+ICsJZWNjLT5ieXRlcyA9IEFMSUdOKGVjYy0+Ynl0ZXMsIDIpOwoKU2hvdWxkbid0IHlvdSBl bnN1cmUgdGhlIG51bWJlciBvZiBieXRlcyBpcyByb3VuZGVkIHVwID8KCj4gKwo+ICsJcmtfbmZj X2h3X2VjY19zZXR1cChjaGlwLCBlY2MsIGVjYy0+c3RyZW5ndGgpOwo+ICsKPiArCXJldHVybiAw Owo+ICt9Cj4gKwoKClRoYW5rcywKTWlxdcOobAoKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4IE1URCBkaXNjdXNzaW9uIG1haWxpbmcg bGlzdApodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LW10 ZC8K 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=-11.2 required=3.0 tests=BAYES_00,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_2 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 458C6C4363A for ; Wed, 28 Oct 2020 10:48:54 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 D420F24696 for ; Wed, 28 Oct 2020 10:48:51 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="rd/FdGdd" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D420F24696 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: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=YToLXGRAVGyHTaICkXKBo6Q6RE+hZV1wLpwycml1dD8=; b=rd/FdGddTPmi0flx1UTeLQBi+ yxGIavsLygUgBvfvLt2rhni9EF9vKoUc9VquvUwVwF7/wpdEj5uu8JizS9bbhfAmnDYaRCz/uqf2R ZMyQIDcV8wLQSZX0UnHU6sxgR4JFunndRJp/ilJ+9Aca4UowJOMzw54n6MSGZns834YwpW7vtwud+ 8T/iZLozOEOn8gnEG992sOdgS9b6nmEA4i5UbipYY+0bunQlEzbBu/ixU6Uwv/p97+2XN3CVUnnHI DoQbR7Aj91FN/1DIlZJmbV+hhYKoWjuI8kZorKCxD1reSB6r2LFgq9Jx/8swhtlpaoffdnoH0urdQ 2O8LmQCJw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kXj0S-0001kq-Ib; Wed, 28 Oct 2020 10:48:40 +0000 Received: from relay3-d.mail.gandi.net ([217.70.183.195]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kXj0L-0001jE-5V; Wed, 28 Oct 2020 10:48:35 +0000 X-Originating-IP: 91.224.148.103 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay3-d.mail.gandi.net (Postfix) with ESMTPSA id 9E8F66001A; Wed, 28 Oct 2020 10:48:27 +0000 (UTC) Date: Wed, 28 Oct 2020 11:48:26 +0100 From: Miquel Raynal To: Yifeng Zhao Subject: Re: [PATCH v13 2/8] mtd: rawnand: rockchip: NFC drivers for RK3308, RK2928 and others Message-ID: <20201028114826.6cd6b841@xps13> In-Reply-To: <20201028095326.15562-3-yifeng.zhao@rock-chips.com> References: <20201028095326.15562-1-yifeng.zhao@rock-chips.com> <20201028095326.15562-3-yifeng.zhao@rock-chips.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.4 (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-20201028_064833_444741_41509BB4 X-CRM114-Status: GOOD ( 38.03 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree@vger.kernel.org, vigneshr@ti.com, richard@nod.at, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, robh+dt@kernel.org, linux-mtd@lists.infradead.org, linux-arm-kernel@lists.infradead.org, heiko@sntech.de Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org SGkgWWlmZW5nLAoKQSBmZXcgbW9yZSBjb21tZW50cyBiZWxvdywgYnV0IG92ZXJhbGwgbG9va3Mg YmV0dGVyLgoKWWlmZW5nIFpoYW8gPHlpZmVuZy56aGFvQHJvY2stY2hpcHMuY29tPiB3cm90ZSBv biBXZWQsIDI4IE9jdCAyMDIwCjE3OjUzOjI0ICswODAwOgoKPiBUaGlzIGRyaXZlciBzdXBwb3J0 cyBSb2NrY2hpcCBORkMgKE5BTkQgRmxhc2ggQ29udHJvbGxlcikgZm91bmQgb24gUkszMzA4LAo+ IFJLMjkyOCwgUktQWDMwLCBSVjExMDggYW5kIG90aGVyIFNPQ3MuIFRoZSBkcml2ZXIgaGFzIGJl ZW4gdGVzdGVkIHVzaW5nCj4gOC1iaXQgTkFORCBpbnRlcmZhY2Ugb24gdGhlIEFSTSBiYXNlZCBS SzMzMDggcGxhdGZvcm0uCj4gCj4gU3VwcG9ydCBSb2NrY2hpcCBTb0NzIGFuZCBORkMgdmVyc2lv bnM6Cj4gLSBQWDMwIGFuZCBSSzMzMjYoTkZDdjkwMCkuCj4gCUVDQzogMTYvNDAvNjAvNzAgYml0 cy8xS0IuCj4gCUNMT0NLOiBhaGIgYW5kIG5mYy4KPiAtIFJLMzMwOCBhbmQgUlYxMTA4KE5GQ3Y4 MDApLgo+IAlFQ0M6IDE2IGJpdHMvMUtCLgo+IAlDTE9DSzogYWhiIGFuZCBuZmMuCj4gLSBSSzMw MzYgYW5kIFJLMzEyOChORkN2NjIyKS4KPiAJRUNDOiAxNi8yNC80MC82MCBiaXRzLzFLQi4KPiAJ Q0xPQ0s6IGFoYiBhbmQgbmZjLgo+IC0gUkszMDY2LCBSSzMxODggYW5kIFJLMjkyOChORkN2NjAw KS4KPiAJRUNDOiAxNi8yNC80MC82MCBiaXRzLzFLQi4KPiAJQ0xPQ0s6IGFoYi4KPiAKPiBTdXBw b3J0ZWQgZmVhdHVyZXM6Cj4gLSBSZWFkIGZ1bGwgcGFnZSBkYXRhIGJ5IERNQS4KPiAtIFN1cHBv cnQgSFcgRUNDKG9uZSBzdGVwIGlzIDFLQikuCj4gLSBTdXBwb3J0IDIgLSAzMksgcGFnZSBzaXpl Lgo+IC0gU3VwcG9ydCA4IENTKGRlcGVuZCBvbiBTb0NzKQo+IAo+IExpbWl0YXRpb25zOgo+IC0g Tm8gc3VwcG9ydCBmb3IgdGhlIGVjYyBzdGVwIHNpemUgaXMgNTEyLgo+IC0gVW50ZXN0ZWQgb24g c29tZSBTb0NzLgo+IC0gTm8gc3VwcG9ydCBmb3Igc3VicGFnZXMuCj4gLSBObyBzdXBwb3J0IGZv ciB0aGUgYnVpbHRpbiByYW5kb21pemVyLgo+IC0gVGhlIG9yaWdpbmFsIGJhZCBibG9jayBtYXNr IGlzIG5vdCBzdXBwb3J0ZWQuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZQo+ICAgdGhlIEJCVChi YWQgYmxvY2sgdGFibGUpLgo+IAo+IFNpZ25lZC1vZmYtYnk6IFlpZmVuZyBaaGFvIDx5aWZlbmcu emhhb0Byb2NrLWNoaXBzLmNvbT4KPiAtLS0KPiAKPiBDaGFuZ2VzIGluIHYxMzoKPiAtIFRoZSBu ZmMtPmJ1ZmZlciB3aWxsIHJlYWxsb2Mgd2hpbGUgdGhlIHBhZ2Ugc2l6ZSBvZiB0aGUgc2Vjb25k IG10ZAo+ICAgaXMgbGFyZ2UgdGhhbiB0aGUgZmlyc3Qgb25lLgo+IC0gRml4IGNvZGluZyBzdHls ZS4KPiAtIEZpeCBzb21lIGNvbW1lbnRzLgo+IAo+IENoYW5nZXMgaW4gdjEyOiBOb25lCj4gQ2hh bmdlcyBpbiB2MTE6Cj4gLSBGaXggY29tcGlsZSBlcnJvci4KPiAKPiBDaGFuZ2VzIGluIHYxMDoK PiAtIEZpeCBjb21waWxlIGVycm9yIG9uIG1hc3RlciB2NS45LXJjNy4KPiAKPiBDaGFuZ2VzIGlu IHY5Ogo+IC0gVGhlIG5mYy0+YnVmZmVyIHdpbGwgcmVhbGxvYyB3aGlsZSB0aGUgcGFnZSBzaXpl IG9mIHRoZSBzZWNvbmQgbXRkCj4gICBpcyBsYXJnZSB0aGFuIHRoZSBmaXJzdCBvbmUKPiAtIEZp eCBjb2Rpbmcgc3R5bGUuCj4gLSBSZW1vdmUgc3RydWN0IHJrX25mY19jbGsuCj4gLSBQcmVwZW5k IHNvbWUgZnVuY3Rpb24gd2l0aCBya19uZmNfLgo+IC0gUmVwbGFjZSBmdW5jdGlvbiByZWFkbF9w b2xsX3RpbWVvdXRfYXRvbWljIHdpdGggcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXQuCj4gLSBS ZW1vdmUgZnVuY3Rpb24gcmtfbmZjX3JlYWRfYnl0ZSBhbmQgcmtfbmZjX3dyaXRlX2J5dGUuCj4g LSBEb24ndCBzZWxlY3QgdGhlIGRpZSBpZiAnY2hlY2tfb25seSA9PSB0cnVlJyBpbiBmdW5jdGlv biBya19uZmNfZXhlY19vcC4KPiAtIE1vZGlmeSBmdW5jdGlvbiBya19uZmNfd3JpdGVfcGFnZSBh bmQgcmtfbmZjX3dyaXRlX3BhZ2VfcmF3Lgo+IAo+IENoYW5nZXMgaW4gdjg6IE5vbmUKPiBDaGFu Z2VzIGluIHY3Ogo+IC0gUmViYXNlIHRvIGxpbnV4LW5leHQuCj4gLSBGaXggY29kaW5nIHN0eWxl Lgo+IC0gUmVzZXJ2ZWQgNCBieXRlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvb2IgYXJlYS4K PiAtIFBhZ2UgcmF3IHJlYWQgYW5kIHdyaXRlIGluY2x1ZGVkIGVjYyBkYXRhLgo+IAo+IENoYW5n ZXMgaW4gdjY6Cj4gLSBUaGUgbXRkLT5uYW1lIHNldCBieSBOQU5EIGxhYmVsIHByb3BlcnR5Lgo+ IC0gQWRkIHNvbWUgY29tbWVudHMuCj4gLSBGaXggY29tcGlsZSBlcnJvci4KPiAKPiBDaGFuZ2Vz IGluIHY1Ogo+IC0gQWRkIGJvb3QgYmxvY2tzIHN1cHBvcnQgIHdpdGggZGlmZmVyZW50IEVDQyBm b3IgYm9vdFJPTS4KPiAtIFJlbmFtZSByb2NrY2hpcC1uYW5kLmMgdG8gcm9ja2NoaXAtbmFuZC1j b250cm9sbGVyLmMuCj4gLSBVbmlmaWNhdGlvbiBvZiBvdGhlciB2YXJpYWJsZSBuYW1lcy4KPiAt IFJlbW92ZSBzb21lIGNvbXBhdGlibGUgZGVmaW5lLgo+IAo+IENoYW5nZXMgaW4gdjQ6Cj4gLSBE ZWZpbmUgcGxhdGZvcm0gZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSByZWdpc3RlciBvZmZzZXRzLgo+ IC0gVGhlIGNvbXBhdGlibGUgZGVmaW5lIHdpdGggcmt4eF9uZmMuCj4gLSBVc2UgU0VUX1NZU1RF TV9TTEVFUF9QTV9PUFMgdG8gZGVmaW5lIFBNX09QUy4KPiAtIFVzZSBleGVjX29wIGluc3RlYWQg b2YgbGVnYWN5IGhvb2tzLgo+IAo+IENoYW5nZXMgaW4gdjM6IE5vbmUKPiBDaGFuZ2VzIGluIHYy Ogo+IC0gRml4IGNvbXBpbGUgZXJyb3IuCj4gLSBJbmNsdWRlIGhlYWRlciBmaWxlcyBzb3J0ZWQg YnkgZmlsZSBuYW1lLgo+IAo+ICBkcml2ZXJzL210ZC9uYW5kL3Jhdy9LY29uZmlnICAgICAgICAg ICAgICAgICAgfCAgIDEyICsKPiAgZHJpdmVycy9tdGQvbmFuZC9yYXcvTWFrZWZpbGUgICAgICAg ICAgICAgICAgIHwgICAgMSArCj4gIC4uLi9tdGQvbmFuZC9yYXcvcm9ja2NoaXAtbmFuZC1jb250 cm9sbGVyLmMgICB8IDE0NjAgKysrKysrKysrKysrKysrKysKPiAgMyBmaWxlcyBjaGFuZ2VkLCAx NDczIGluc2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbXRkL25hbmQv cmF3L3JvY2tjaGlwLW5hbmQtY29udHJvbGxlci5jCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv bXRkL25hbmQvcmF3L0tjb25maWcgYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9LY29uZmlnCj4gaW5k ZXggNmM0NmYyNWI1N2UyLi4yY2M1MzNlNGUyMzkgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tdGQv bmFuZC9yYXcvS2NvbmZpZwo+ICsrKyBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L0tjb25maWcKPiBA QCAtNDYyLDYgKzQ2MiwxOCBAQCBjb25maWcgTVREX05BTkRfQVJBU0FOCj4gIAkgIEVuYWJsZXMg dGhlIGRyaXZlciBmb3IgdGhlIEFyYXNhbiBOQU5EIGZsYXNoIGNvbnRyb2xsZXIgb24KPiAgCSAg WnlucSBVbHRyYXNjYWxlKyBNUFNvQy4KPiAgCj4gK2NvbmZpZyBNVERfTkFORF9ST0NLQ0hJUAo+ ICsJdHJpc3RhdGUgIlJvY2tjaGlwIE5BTkQgY29udHJvbGxlciIKPiArCWRlcGVuZHMgb24gQVJD SF9ST0NLQ0hJUCAmJiBIQVNfSU9NRU0KPiArCWhlbHAKPiArCSAgRW5hYmxlcyBzdXBwb3J0IGZv ciBOQU5EIGNvbnRyb2xsZXIgb24gUm9ja2NoaXAgU29Dcy4KPiArCSAgVGhlcmUgYXJlIGZvdXIg ZGlmZmVyZW50IHZlcnNpb25zIG9mIE5BTkQgRkxBU0ggQ29udHJvbGxlcnMsCj4gKwkgIGluY2x1 ZGluZzoKPiArCSAgICBORkMgdjYwMDogUksyOTI4LCBSSzMwNjYsIFJLMzE4OAo+ICsJICAgIE5G QyB2NjIyOiBSSzMwMzYsIFJLMzEyOAo+ICsJICAgIE5GQyB2ODAwOiBSSzMzMDgsIFJWMTEwOAo+ ICsJICAgIE5GQyB2OTAwOiBQWDMwLCBSSzMzMjYKPiArCj4gIGNvbW1lbnQgIk1pc2MiCj4gIAo+ ICBjb25maWcgTVREX1NNX0NPTU1PTgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3Jh dy9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L01ha2VmaWxlCj4gaW5kZXggMjkzMGY1 YjkwMTVkLi45NjBjOWJlMjUyMDQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9yYXcv TWFrZWZpbGUKPiArKysgYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9NYWtlZmlsZQo+IEBAIC01OCw2 ICs1OCw3IEBAIG9iai0kKENPTkZJR19NVERfTkFORF9TVE0zMl9GTUMyKQkrPSBzdG0zMl9mbWMy X25hbmQubwo+ICBvYmotJChDT05GSUdfTVREX05BTkRfTUVTT04pCQkrPSBtZXNvbl9uYW5kLm8K PiAgb2JqLSQoQ09ORklHX01URF9OQU5EX0NBREVOQ0UpCQkrPSBjYWRlbmNlLW5hbmQtY29udHJv bGxlci5vCj4gIG9iai0kKENPTkZJR19NVERfTkFORF9BUkFTQU4pCQkrPSBhcmFzYW4tbmFuZC1j b250cm9sbGVyLm8KPiArb2JqLSQoQ09ORklHX01URF9OQU5EX1JPQ0tDSElQKQkJKz0gcm9ja2No aXAtbmFuZC1jb250cm9sbGVyLm8KPiAgCj4gIG5hbmQtb2JqcyA6PSBuYW5kX2Jhc2UubyBuYW5k X2xlZ2FjeS5vIG5hbmRfYmJ0Lm8gbmFuZF90aW1pbmdzLm8gbmFuZF9pZHMubwo+ICBuYW5kLW9i anMgKz0gbmFuZF9vbmZpLm8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9yYXcvcm9j a2NoaXAtbmFuZC1jb250cm9sbGVyLmMgYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9yb2NrY2hpcC1u YW5kLWNvbnRyb2xsZXIuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAw MDAwLi4yZTk2ZmQzMTQzNDYKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9tdGQvbmFu ZC9yYXcvcm9ja2NoaXAtbmFuZC1jb250cm9sbGVyLmMKPiBAQCAtMCwwICsxLDE0NjAgQEAKPiAr Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgT1IgTUlUCj4gKy8qCj4gKyAqIFJv Y2tjaGlwIE5BTkQgRmxhc2ggY29udHJvbGxlciBkcml2ZXIuCj4gKyAqIENvcHlyaWdodCAoQykg MjAyMCBSb2NrY2hpcCBJbmMuCj4gKyAqIEF1dGhvcjogWWlmZW5nIFpoYW8gPHlpZmVuZy56aGFv QHJvY2stY2hpcHMuY29tPgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KPiAr I2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5o Pgo+ICsjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9pbnRl cnJ1cHQuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgo+ICsjaW5jbHVkZSA8bGludXgv bW9kdWxlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Cj4gKyNpbmNsdWRlIDxsaW51 eC9tdGQvcmF3bmFuZC5oPgo+ICsjaW5jbHVkZSA8bGludXgvb2YuaD4KPiArI2luY2x1ZGUgPGxp bnV4L29mX2RldmljZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4g KyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4gKwo+ICsvKgo+ICsgKiBORkMgUGFnZSBEYXRhIExh eW91dDoKPiArICoJMTAyNCBCeXRlcyBEYXRhICsgNEJ5dGVzIHN5cyBkYXRhICsgMjhCeXRlc34x MjRCeXRlcyBlY2MgKwo+ICsgKgkxMDI0IEJ5dGVzIERhdGEgKyA0Qnl0ZXMgc3lzIGRhdGEgKyAy OEJ5dGVzfjEyNEJ5dGVzIGVjYyArCj4gKyAqCS4uLi4uLgo+ICsgKiBOQU5EIFBhZ2UgRGF0YSBM YXlvdXQ6Cj4gKyAqCTEwMjQgKiBuIERhdGEgKyBtIEJ5dGVzIG9vYgo+ICsgKiBPcmlnaW5hbCBC YWQgQmxvY2sgTWFzayBMb2NhdGlvbjoKPiArICoJRmlyc3QgYnl0ZSBvZiBvb2Ioc3BhcmUpLgo+ ICsgKiBuYW5kX2NoaXAtPm9vYl9wb2kgZGF0YSBsYXlvdXQ6Cj4gKyAqCTRCeXRlcyBzeXMgZGF0 YSArIC4uLi4gKyA0Qnl0ZXMgc3lzIGRhdGEgKyBlY2MgZGF0YS4KPiArICovCj4gKwo+ICsvKiBO QU5EIGNvbnRyb2xsZXIgcmVnaXN0ZXIgZGVmaW5pdGlvbiAqLwo+ICsjZGVmaW5lIE5GQ19SRUFE CQkJKDApCj4gKyNkZWZpbmUgTkZDX1dSSVRFCQkJKDEpCj4gKwo+ICsjZGVmaW5lIE5GQ19GTUNU TAkJCSgweDAwKQo+ICsjZGVmaW5lICAgRk1DVExfQ0VfU0VMX00JCTB4RkYKPiArI2RlZmluZSAg IEZNQ1RMX0NFX1NFTCh4KQkJKDEgPDwgKHgpKQo+ICsjZGVmaW5lICAgRk1DVExfV1AJCQlCSVQo OCkKPiArI2RlZmluZSAgIEZNQ1RMX1JEWQkJCUJJVCg5KQo+ICsKPiArI2RlZmluZSBORkNfRk1X QUlUCQkJKDB4MDQpCj4gKyNkZWZpbmUgICBGTENUTF9SU1QJCQlCSVQoMCkKPiArI2RlZmluZSAg IEZMQ1RMX1dSCQkJKDEpCS8qIDA6IHJlYWQsIDE6IHdyaXRlICovCj4gKyNkZWZpbmUgICBGTENU TF9YRkVSX1NUCQkJQklUKDIpCj4gKyNkZWZpbmUgICBGTENUTF9YRkVSX0VOCQkJQklUKDMpCj4g KyNkZWZpbmUgICBGTENUTF9BQ09SUkVDVAkJQklUKDEwKSAvKiBBdXRvIGNvcnJlY3QgZXJyb3Ig Yml0cy4gKi8KPiArI2RlZmluZSAgIEZMQ1RMX1hGRVJfUkVBRFkJCUJJVCgyMCkKPiArI2RlZmlu ZSAgIEZMQ1RMX1hGRVJfU0VDVE9SCQkoMjIpCj4gKyNkZWZpbmUgICBGTENUTF9UT0dfRklYCQkJ QklUKDI5KQo+ICsKPiArI2RlZmluZSAgIEJDSENUTF9CQU5LX00JCQkoNyA8PCA1KQo+ICsjZGVm aW5lICAgQkNIQ1RMX0JBTksJCQkoNSkKPiArCj4gKyNkZWZpbmUgICBETUFfU1QJCQlCSVQoMCkK PiArI2RlZmluZSAgIERNQV9XUgkJCSgxKQkvKiAwOiB3cml0ZSwgMTogcmVhZCAqLwo+ICsjZGVm aW5lICAgRE1BX0VOCQkJQklUKDIpCj4gKyNkZWZpbmUgICBETUFfQUhCX1NJWkUJCQkoMykJLyog MDogMSwgMTogMiwgMjogNCAqLwo+ICsjZGVmaW5lICAgRE1BX0JVUlNUX1NJWkUJCSg2KQkvKiAw OiAxLCAzOiA0LCA1OiA4LCA3OiAxNiAqLwo+ICsjZGVmaW5lICAgRE1BX0lOQ19OVU0JCQkoOSkJ LyogMSAtIDE2ICovCj4gKwo+ICsjZGVmaW5lIEVDQ19FUlJfQ05UKHgsIGUpICgoKCh4KSA+PiAo ZSkubG93KSAmIChlKS5sb3dfbWFzaykgfFwKPiArCSAgKCgoeCkgPj4gKGUpLmhpZ2gpICYgKGUp LmhpZ2hfbWFzaykgPDwgKGUpLmxvd19ibikKPiArI2RlZmluZSAgIElOVF9ETUEJCQlCSVQoMCkK PiArI2RlZmluZSBORkNfQkFOSwkJCSgweDgwMCkKPiArI2RlZmluZSBORkNfQkFOS19TVEVQCQkJ KDB4MTAwKQo+ICsjZGVmaW5lICAgQkFOS19EQVRBCQkJKDB4MDApCj4gKyNkZWZpbmUgICBCQU5L X0FERFIJCQkoMHgwNCkKPiArI2RlZmluZSAgIEJBTktfQ01ECQkJKDB4MDgpCj4gKyNkZWZpbmUg TkZDX1NSQU0wCQkJKDB4MTAwMCkKPiArI2RlZmluZSBORkNfU1JBTTEJCQkoMHgxNDAwKQo+ICsj ZGVmaW5lIE5GQ19TUkFNX1NJWkUJCQkoMHg0MDApCj4gKyNkZWZpbmUgTkZDX1RJTUVPVVQJCQko NTAwMDAwKQo+ICsjZGVmaW5lIE5GQ19NQVhfT09CX1BFUl9TVEVQCQkxMjgKPiArI2RlZmluZSBO RkNfTUlOX09PQl9QRVJfU1RFUAkJNjQKPiArI2RlZmluZSBNQVhfREFUQV9TSVpFCQkJMHhGRkZD Cj4gKyNkZWZpbmUgTUFYX0FERFJFU1NfQ1lDCQkJNgo+ICsjZGVmaW5lIE5GQ19FQ0NfTUFYX01P REVTCQk0Cj4gKyNkZWZpbmUgTkZDX01BWF9OU0VMUwkJCSg4KSAvKiBTb21lIFNvY3Mgb25seSBo YXZlIDEgb3IgMiBDU3MuICovCj4gKyNkZWZpbmUgTkZDX1NZU19EQVRBX1NJWkUJCSg0KSAvKiA0 IGJ5dGVzIHN5cyBkYXRhIGluIG9vYiBwcmUgMTAyNCBkYXRhLiovCj4gKyNkZWZpbmUgUktfREVG QVVMVF9DTE9DS19SQVRFCQkoMTUwICogMTAwMCAqIDEwMDApIC8qIDE1MCBNaHogKi8KPiArI2Rl ZmluZSBBQ0NUSU1JTkcoY3NydywgcndwdywgcndjcykJKChjc3J3KSA8PCAxMiB8IChyd3B3KSA8 PCA1IHwgKHJ3Y3MpKQo+ICsKPiArZW51bSBuZmNfdHlwZSB7Cj4gKwlORkNfVjYsCj4gKwlORkNf VjgsCj4gKwlORkNfVjksCj4gK307Cj4gKwo+ICsvKioKPiArICogc3RydWN0IHJrX2VjY19jbnRf c3RhdHVzOiByZXByZXNlbnQgYSBlY2Mgc3RhdHVzIGRhdGEuCj4gKyAqIEBlcnJfZmxhZ19iaXQ6 IGVycm9yIGZsYWcgYml0IGluZGV4IGF0IHJlZ2lzdGVyLgo+ICsgKiBAbG93OiBlY2MgY291bnQg bG93IGJpdCBpbmRleCBhdCByZWdpc3Rlci4KPiArICogQGxvd19tYXNrOiBtYXNrIGJpdC4KPiAr ICogQGxvd19ibjogZWNjIGNvdW50IGxvdyBiaXQgbnVtYmVyLgo+ICsgKiBAaGlnaDogZWNjIGNv dW50IGhpZ2ggYml0IGluZGV4IGF0IHJlZ2lzdGVyLgo+ICsgKiBAaGlnaF9tYXNrOiBtYXNrIGJp dAo+ICsgKi8KPiArc3RydWN0IGVjY19jbnRfc3RhdHVzIHsKPiArCXU4IGVycl9mbGFnX2JpdDsK PiArCXU4IGxvdzsKPiArCXU4IGxvd19tYXNrOwo+ICsJdTggbG93X2JuOwo+ICsJdTggaGlnaDsK PiArCXU4IGhpZ2hfbWFzazsKPiArfTsKPiArCj4gKy8qCj4gKyAqIEB0eXBlOiBuZmMgdmVyc2lv bgo+ICsgKiBAZWNjX3N0cmVuZ3RoczogZWNjIHN0cmVuZ3Rocwo+ICsgKiBAZWNjX2NmZ3M6IGVj YyBjb25maWcgdmFsdWVzCj4gKyAqIEBmbGN0bF9vZmY6IEZMQ1RMIHJlZ2lzdGVyIG9mZnNldAo+ ICsgKiBAYmNoY3RsX29mZjogQkNIQ1RMIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAZG1hX2RhdGFf YnVmX29mZjogRE1BX0RBVEFfQlVGIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAZG1hX29vYl9idWZf b2ZmOiBETUFfT09CX0JVRiByZWdpc3RlciBvZmZzZXQKPiArICogQGRtYV9jZmdfb2ZmOiBETUFf Q0ZHIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAZG1hX3N0X29mZjogRE1BX1NUIHJlZ2lzdGVyIG9m ZnNldAo+ICsgKiBAYmNoX3N0X29mZjogQkNHX1NUIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAcmFu ZG16X29mZjogUkFORE1aIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAaW50X2VuX29mZjogaW50ZXJy dXB0IGVuYWJsZSByZWdpc3RlciBvZmZzZXQKPiArICogQGludF9jbHJfb2ZmOiBpbnRlcnJ1cHQg Y2xlYW4gcmVnaXN0ZXIgb2Zmc2V0Cj4gKyAqIEBpbnRfc3Rfb2ZmOiBpbnRlcnJ1cHQgc3RhdHVz IHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAb29iMF9vZmY6IG9vYjAgcmVnaXN0ZXIgb2Zmc2V0Cj4g KyAqIEBvb2IxX29mZjogb29iMSByZWdpc3RlciBvZmZzZXQKPiArICogQGVjYzA6IHJlcHJlc2Vu dCBFQ0MwIHN0YXR1cyBkYXRhCj4gKyAqIEBlY2MxOiByZXByZXNlbnQgRUNDMSBzdGF0dXMgZGF0 YQo+ICsgKi8KPiArc3RydWN0IG5mY19jZmcgewo+ICsJZW51bSBuZmNfdHlwZSB0eXBlOwo+ICsJ dTggZWNjX3N0cmVuZ3Roc1tORkNfRUNDX01BWF9NT0RFU107Cj4gKwl1MzIgZWNjX2NmZ3NbTkZD X0VDQ19NQVhfTU9ERVNdOwo+ICsJdTMyIGZsY3RsX29mZjsKPiArCXUzMiBiY2hjdGxfb2ZmOwo+ ICsJdTMyIGRtYV9jZmdfb2ZmOwo+ICsJdTMyIGRtYV9kYXRhX2J1Zl9vZmY7Cj4gKwl1MzIgZG1h X29vYl9idWZfb2ZmOwo+ICsJdTMyIGRtYV9zdF9vZmY7Cj4gKwl1MzIgYmNoX3N0X29mZjsKPiAr CXUzMiByYW5kbXpfb2ZmOwo+ICsJdTMyIGludF9lbl9vZmY7Cj4gKwl1MzIgaW50X2Nscl9vZmY7 Cj4gKwl1MzIgaW50X3N0X29mZjsKPiArCXUzMiBvb2IwX29mZjsKPiArCXUzMiBvb2IxX29mZjsK PiArCXN0cnVjdCBlY2NfY250X3N0YXR1cyBlY2MwOwo+ICsJc3RydWN0IGVjY19jbnRfc3RhdHVz IGVjYzE7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCB7Cj4gKwlzdHJ1Y3Qg bGlzdF9oZWFkIG5vZGU7Cj4gKwlzdHJ1Y3QgbmFuZF9jaGlwIGNoaXA7Cj4gKwo+ICsJdTE2IHNw YXJlX3Blcl9zZWN0b3I7Cj4gKwl1MTYgb29iX2J1Zl9wZXJfc2VjdG9yOwo+ICsJdTE2IGJvb3Rf YmxrczsKPiArCXUxNiBib290X2VjYzsKPiArCXUxNiBtZXRhZGF0YV9zaXplOwo+ICsKPiArCXU4 IG5zZWxzOwo+ICsJdTggc2Vsc1swXTsKPiArCS8qIE5vdGhpbmcgYWZ0ZXIgdGhpcyBmaWVsZC4g Ki8KPiArfTsKPiArCj4gK3N0cnVjdCBya19uZmMgewo+ICsJc3RydWN0IG5hbmRfY29udHJvbGxl ciBjb250cm9sbGVyOwo+ICsJY29uc3Qgc3RydWN0IG5mY19jZmcgKmNmZzsKPiArCXN0cnVjdCBk ZXZpY2UgKmRldjsKPiArCj4gKwlzdHJ1Y3QgY2xrICpuZmNfY2xrOwo+ICsJc3RydWN0IGNsayAq YWhiX2NsazsKPiArCXZvaWQgX19pb21lbSAqcmVnczsKPiArCj4gKwl1MzIgc2VsZWN0ZWRfYmFu azsKPiArCXUzMiBiYW5kX29mZnNldDsKPiArCXUzMiBjdXJfY2xrOwo+ICsKPiArCXN0cnVjdCBj b21wbGV0aW9uIGRvbmU7Cj4gKwlzdHJ1Y3QgbGlzdF9oZWFkIGNoaXBzOwo+ICsKPiArCXU4ICpi dWZmZXI7Cj4gKwl1OCAqcGFnZV9idWY7Cj4gKwl1MzIgKm9vYl9idWY7Cj4gKwl1MzIgYnVmZmVy X3NpemU7Cj4gKwl1MzIgb29iX2J1Zl9zaXplOwo+ICsKPiArCXVuc2lnbmVkIGxvbmcgYXNzaWdu ZWRfY3M7Cj4gK307Cj4gKwo+ICtzdGF0aWMgaW5saW5lIHN0cnVjdCBya19uZmNfbmFuZF9jaGlw ICpya19uZmNfdG9fcmtuYW5kKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXApCj4gK3sKPiArCXJldHVy biBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IHJrX25mY19uYW5kX2NoaXAsIGNoaXApOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW5saW5lIHU4ICpya19uZmNfYnVmX3RvX2RhdGFfcHRyKHN0cnVjdCBu YW5kX2NoaXAgKmNoaXAsIGNvbnN0IHU4ICpwLCBpbnQgaSkKPiArewo+ICsJcmV0dXJuICh1OCAq KXAgKyBpICogY2hpcC0+ZWNjLnNpemU7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdTggKnJr X25mY19idWZfdG9fb29iX3B0cihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgaSkKPiArewo+ ICsJdTggKnBvaTsKPiArCj4gKwlwb2kgPSBjaGlwLT5vb2JfcG9pICsgaSAqIE5GQ19TWVNfREFU QV9TSVpFOwo+ICsKPiArCXJldHVybiBwb2k7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdTgg KnJrX25mY19idWZfdG9fb29iX2VjY19wdHIoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgaW50IGkp Cj4gK3sKPiArCXN0cnVjdCBya19uZmNfbmFuZF9jaGlwICpya25hbmQgPSBya19uZmNfdG9fcmtu YW5kKGNoaXApOwo+ICsJdTggKnBvaTsKPiArCj4gKwlwb2kgPSBjaGlwLT5vb2JfcG9pICsgcmtu YW5kLT5tZXRhZGF0YV9zaXplICsKPiArCSAgICAgIGNoaXAtPmVjYy5ieXRlcyAqIGk7Cj4gKwo+ ICsJcmV0dXJuIHBvaTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSBpbnQgcmtfbmZjX2RhdGFf bGVuKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXApCj4gK3sKPiArCXN0cnVjdCBya19uZmNfbmFuZF9j aGlwICpya25hbmQgPSBya19uZmNfdG9fcmtuYW5kKGNoaXApOwo+ICsKPiArCXJldHVybiBjaGlw LT5lY2Muc2l6ZSArIHJrbmFuZC0+c3BhcmVfcGVyX3NlY3RvcjsKPiArfQo+ICsKPiArc3RhdGlj IGlubGluZSB1OCAqcmtfbmZjX2RhdGFfcHRyKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsICBpbnQg aSkKPiArewo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRh KGNoaXApOwo+ICsKPiArCXJldHVybiBuZmMtPmJ1ZmZlciArIGkgKiBya19uZmNfZGF0YV9sZW4o Y2hpcCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdTggKnJrX25mY19vb2JfcHRyKHN0cnVj dCBuYW5kX2NoaXAgKmNoaXAsIGludCBpKQo+ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBu YW5kX2dldF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4gKwo+ICsJcmV0dXJuIG5mYy0+YnVmZmVy ICsgaSAqIHJrX25mY19kYXRhX2xlbihjaGlwKSArIGNoaXAtPmVjYy5zaXplOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgdm9pZCBya19uZmNfc2VsZWN0X2NoaXAoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwg aW50IGNzKQo+ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dldF9jb250cm9sbGVy X2RhdGEoY2hpcCk7Cj4gKwlzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCAqcmtuYW5kID0gcmtfbmZj X3RvX3JrbmFuZChjaGlwKTsKPiArCXUzMiB2YWw7Cj4gKwo+ICsJaWYgKGNzIDwgMCkgewo+ICsJ CW5mYy0+c2VsZWN0ZWRfYmFuayA9IC0xOwo+ICsJCS8qIERlc2VsZWN0IHRoZSBjdXJyZW50bHkg c2VsZWN0ZWQgdGFyZ2V0LiAqLwo+ICsJCXZhbCA9IHJlYWRsX3JlbGF4ZWQobmZjLT5yZWdzICsg TkZDX0ZNQ1RMKTsKPiArCQl2YWwgJj0gfkZNQ1RMX0NFX1NFTF9NOwo+ICsJCXdyaXRlbCh2YWws IG5mYy0+cmVncyArIE5GQ19GTUNUTCk7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCW5mYy0+ c2VsZWN0ZWRfYmFuayA9IHJrbmFuZC0+c2Vsc1tjc107Cj4gKwluZmMtPmJhbmRfb2Zmc2V0ID0g TkZDX0JBTksgKyBuZmMtPnNlbGVjdGVkX2JhbmsgKiBORkNfQkFOS19TVEVQOwo+ICsKPiArCXZh bCA9IHJlYWRsX3JlbGF4ZWQobmZjLT5yZWdzICsgTkZDX0ZNQ1RMKTsKPiArCXZhbCAmPSB+Rk1D VExfQ0VfU0VMX007Cj4gKwl2YWwgfD0gRk1DVExfQ0VfU0VMKG5mYy0+c2VsZWN0ZWRfYmFuayk7 Cj4gKwo+ICsJd3JpdGVsKHZhbCwgbmZjLT5yZWdzICsgTkZDX0ZNQ1RMKTsKPiArfQo+ICsKPiAr c3RhdGljIGlubGluZSBpbnQgcmtfbmZjX3dhaXRfaW9yZWFkeShzdHJ1Y3QgcmtfbmZjICpuZmMp Cj4gK3sKPiArCWludCByYzsKPiArCXUzMiB2YWw7Cj4gKwo+ICsJcmMgPSByZWFkbF9yZWxheGVk X3BvbGxfdGltZW91dChuZmMtPnJlZ3MgKyBORkNfRk1DVEwsIHZhbCwKPiArCQkJCQl2YWwgJiBG TUNUTF9SRFksIDEwLCBORkNfVElNRU9VVCk7Cj4gKwo+ICsJcmV0dXJuIHJjOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgdm9pZCBya19uZmNfcmVhZF9idWYoc3RydWN0IHJrX25mYyAqbmZjLCB1OCAqYnVm LCBpbnQgbGVuKQo+ICt7Cj4gKwlpbnQgaTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBp KyspCj4gKwkJYnVmW2ldID0gcmVhZGJfcmVsYXhlZChuZmMtPnJlZ3MgKyBuZmMtPmJhbmRfb2Zm c2V0ICsKPiArCQkJCSAgICAgICBCQU5LX0RBVEEpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBy a19uZmNfd3JpdGVfYnVmKHN0cnVjdCBya19uZmMgKm5mYywgY29uc3QgdTggKmJ1ZiwgaW50IGxl bikKPiArewo+ICsJaW50IGk7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQo+ICsJ CXdyaXRlYihidWZbaV0sIG5mYy0+cmVncyArIG5mYy0+YmFuZF9vZmZzZXQgKyBCQU5LX0RBVEEp Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19jbWQoc3RydWN0IG5hbmRfY2hpcCAqY2hp cCwKPiArCQkgICAgICBjb25zdCBzdHJ1Y3QgbmFuZF9zdWJvcCAqc3Vib3ApCj4gK3sKPiArCXN0 cnVjdCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsKPiArCXVu c2lnbmVkIGludCBpLCBqLCByZW1haW5pbmcsIHN0YXJ0Owo+ICsJaW50IHJlZ19vZmZzZXQgPSBu ZmMtPmJhbmRfb2Zmc2V0Owo+ICsJdTggKmluYnVmID0gTlVMTDsKPiArCWNvbnN0IHU4ICpvdXRi dWY7Cj4gKwl1MzIgY250ID0gMDsKPiArCWludCByZXQgPSAwOwo+ICsKPiArCWZvciAoaSA9IDA7 IGkgPCBzdWJvcC0+bmluc3RyczsgaSsrKSB7Cj4gKwkJY29uc3Qgc3RydWN0IG5hbmRfb3BfaW5z dHIgKmluc3RyID0gJnN1Ym9wLT5pbnN0cnNbaV07Cj4gKwo+ICsJCXN3aXRjaCAoaW5zdHItPnR5 cGUpIHsKPiArCQljYXNlIE5BTkRfT1BfQ01EX0lOU1RSOgo+ICsJCQl3cml0ZWIoaW5zdHItPmN0 eC5jbWQub3Bjb2RlLAo+ICsJCQkgICAgICAgbmZjLT5yZWdzICsgcmVnX29mZnNldCArIEJBTktf Q01EKTsKPiArCQkJYnJlYWs7Cj4gKwo+ICsJCWNhc2UgTkFORF9PUF9BRERSX0lOU1RSOgo+ICsJ CQlyZW1haW5pbmcgPSBuYW5kX3N1Ym9wX2dldF9udW1fYWRkcl9jeWMoc3Vib3AsIGkpOwo+ICsJ CQlzdGFydCA9IG5hbmRfc3Vib3BfZ2V0X2FkZHJfc3RhcnRfb2ZmKHN1Ym9wLCBpKTsKPiArCj4g KwkJCWZvciAoaiA9IDA7IGogPCA4ICYmIGogKyBzdGFydCA8IHJlbWFpbmluZzsgaisrKQo+ICsJ CQkJd3JpdGViKGluc3RyLT5jdHguYWRkci5hZGRyc1tqICsgc3RhcnRdLAo+ICsJCQkJICAgICAg IG5mYy0+cmVncyArIHJlZ19vZmZzZXQgKyBCQU5LX0FERFIpOwo+ICsJCQlicmVhazsKPiArCj4g KwkJY2FzZSBOQU5EX09QX0RBVEFfSU5fSU5TVFI6Cj4gKwkJY2FzZSBOQU5EX09QX0RBVEFfT1VU X0lOU1RSOgo+ICsJCQlzdGFydCA9IG5hbmRfc3Vib3BfZ2V0X2RhdGFfc3RhcnRfb2ZmKHN1Ym9w LCBpKTsKPiArCQkJY250ID0gbmFuZF9zdWJvcF9nZXRfZGF0YV9sZW4oc3Vib3AsIGkpOwo+ICsK PiArCQkJaWYgKGluc3RyLT50eXBlID09IE5BTkRfT1BfREFUQV9PVVRfSU5TVFIpIHsKPiArCQkJ CW91dGJ1ZiA9IGluc3RyLT5jdHguZGF0YS5idWYub3V0ICsgc3RhcnQ7Cj4gKwkJCQlya19uZmNf d3JpdGVfYnVmKG5mYywgb3V0YnVmLCBjbnQpOwo+ICsJCQl9IGVsc2Ugewo+ICsJCQkJaW5idWYg PSBpbnN0ci0+Y3R4LmRhdGEuYnVmLmluICsgc3RhcnQ7Cj4gKwkJCQlya19uZmNfcmVhZF9idWYo bmZjLCBpbmJ1ZiwgY250KTsKPiArCQkJfQo+ICsJCQlicmVhazsKPiArCj4gKwkJY2FzZSBOQU5E X09QX1dBSVRSRFlfSU5TVFI6Cj4gKwkJCWlmIChya19uZmNfd2FpdF9pb3JlYWR5KG5mYykgPCAw KSB7Cj4gKwkJCQlyZXQgPSAtRVRJTUVET1VUOwo+ICsJCQkJZGV2X2VycihuZmMtPmRldiwgIklP IG5vdCByZWFkeVxuIik7Cj4gKwkJCX0KPiArCQkJYnJlYWs7Cj4gKwkJfQo+ICsJfQo+ICsKPiAr CXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmFuZF9vcF9wYXJz ZXIgcmtfbmZjX29wX3BhcnNlciA9IE5BTkRfT1BfUEFSU0VSKAo+ICsJTkFORF9PUF9QQVJTRVJf UEFUVEVSTigKPiArCQlya19uZmNfY21kLAo+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9DTURfRUxF TSh0cnVlKSwKPiArCQlOQU5EX09QX1BBUlNFUl9QQVRfQUREUl9FTEVNKHRydWUsIE1BWF9BRERS RVNTX0NZQyksCj4gKwkJTkFORF9PUF9QQVJTRVJfUEFUX0NNRF9FTEVNKHRydWUpLAo+ICsJCU5B TkRfT1BfUEFSU0VSX1BBVF9XQUlUUkRZX0VMRU0odHJ1ZSksCj4gKwkJTkFORF9PUF9QQVJTRVJf UEFUX0RBVEFfSU5fRUxFTSh0cnVlLCBNQVhfREFUQV9TSVpFKSksCj4gKwlOQU5EX09QX1BBUlNF Ul9QQVRURVJOKAo+ICsJCXJrX25mY19jbWQsCj4gKwkJTkFORF9PUF9QQVJTRVJfUEFUX0NNRF9F TEVNKHRydWUpLAo+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9BRERSX0VMRU0odHJ1ZSwgTUFYX0FE RFJFU1NfQ1lDKSwKPiArCQlOQU5EX09QX1BBUlNFUl9QQVRfREFUQV9PVVRfRUxFTSh0cnVlLCBN QVhfREFUQV9TSVpFKSwKPiArCQlOQU5EX09QX1BBUlNFUl9QQVRfQ01EX0VMRU0odHJ1ZSksCj4g KwkJTkFORF9PUF9QQVJTRVJfUEFUX1dBSVRSRFlfRUxFTSh0cnVlKSksCj4gKyk7Cj4gKwo+ICtz dGF0aWMgaW50IHJrX25mY19leGVjX29wKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCj4gKwkJCSAg Y29uc3Qgc3RydWN0IG5hbmRfb3BlcmF0aW9uICpvcCwKPiArCQkJICBib29sIGNoZWNrX29ubHkp Cj4gK3sKPiArCWlmICghY2hlY2tfb25seSkKPiArCQlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwg b3AtPmNzKTsKPiArCj4gKwlyZXR1cm4gbmFuZF9vcF9wYXJzZXJfZXhlY19vcChjaGlwLCAmcmtf bmZjX29wX3BhcnNlciwgb3AsCj4gKwkJCQkgICAgICBjaGVja19vbmx5KTsKPiArfQo+ICsKPiAr c3RhdGljIGludCBya19uZmNfc2V0dXBfZGF0YV9pbnRlcmZhY2Uoc3RydWN0IG5hbmRfY2hpcCAq Y2hpcCwgaW50IGNzbGluZSwKPiArCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmFuZF9pbnRlcmZh Y2VfY29uZmlnICpjb25mKQoKUGxlYXNlIGhhdmUgYSBsb29rIGF0IHRoZSByZWNlbnQgY2hhbmdl cyBpbiB0aGUgY29yZSwgdGhpcyBoZWxwZXIKc2hvdWxkIGJlIG5hbWVkICJzZXR1cF9pbnRlcmZh Y2UiLgoKPiArewo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9k YXRhKGNoaXApOwo+ICsJY29uc3Qgc3RydWN0IG5hbmRfc2RyX3RpbWluZ3MgKnRpbWluZ3M7Cj4g Kwl1MzIgcmF0ZSwgdGMycncsIHRyd3B3LCB0cncyYzsKPiArCXUzMiB0ZW1wOwo+ICsKPiArCWlm IChjc2xpbmUgPT0gTkFORF9EQVRBX0lGQUNFX0NIRUNLX09OTFkpCj4gKwkJcmV0dXJuIDA7Cj4g Kwo+ICsJdGltaW5ncyA9IG5hbmRfZ2V0X3Nkcl90aW1pbmdzKGNvbmYpOwo+ICsJaWYgKElTX0VS Uih0aW1pbmdzKSkKPiArCQlyZXR1cm4gLUVPUE5PVFNVUFA7Cj4gKwo+ICsJaWYgKElTX0VSUihu ZmMtPm5mY19jbGspKQo+ICsJCXJhdGUgPSBjbGtfZ2V0X3JhdGUobmZjLT5haGJfY2xrKTsKPiAr CWVsc2UKPiArCQlyYXRlID0gY2xrX2dldF9yYXRlKG5mYy0+bmZjX2Nsayk7Cj4gKwo+ICsJLyog VHVybiBjbG9jayByYXRlIGludG8ga0h6LiAqLwo+ICsJcmF0ZSAvPSAxMDAwOwo+ICsKPiArCXRj MnJ3ID0gMTsKPiArCXRydzJjID0gMTsKPiArCj4gKwl0cndwdyA9IG1heCh0aW1pbmdzLT50V0Nf bWluLCB0aW1pbmdzLT50UkNfbWluKSAvIDEwMDA7Cj4gKwl0cndwdyA9IERJVl9ST1VORF9VUCh0 cndwdyAqIHJhdGUsIDEwMDAwMDApOwo+ICsKPiArCXRlbXAgPSB0aW1pbmdzLT50UkVBX21heCAv IDEwMDA7Cj4gKwl0ZW1wID0gRElWX1JPVU5EX1VQKHRlbXAgKiByYXRlLCAxMDAwMDAwKTsKPiAr Cj4gKwlpZiAodHJ3cHcgPCB0ZW1wKQo+ICsJCXRyd3B3ID0gdGVtcDsKPiArCj4gKwkvKgo+ICsJ ICogQUNDT046IGFjY2VzcyB0aW1pbmcgY29udHJvbCByZWdpc3Rlcgo+ICsJICogLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICsJICogMzE6MTg6IHJlc2VydmVkCj4gKwkg KiAxNzoxMjogY3NydywgY2xvY2sgY3ljbGVzIGZyb20gdGhlIGZhbGxpbmcgZWRnZSBvZiBDU24g dG8gdGhlCj4gKwkgKiAgIGZhbGxpbmcgZWRnZSBvZiBSRG4gb3IgV1JuCj4gKwkgKiAxMToxMTog cmVzZXJ2ZWQKPiArCSAqIDEwOjA1OiByd3B3LCB0aGUgd2lkdGggb2YgUkRuIG9yIFdSbiBpbiBw cm9jZXNzb3IgY2xvY2sgY3ljbGVzCj4gKwkgKiAwNDowMDogcndjcywgY2xvY2sgY3ljbGVzIGZy b20gdGhlIHJpc2luZyBlZGdlIG9mIFJEbiBvciBXUm4gdG8gdGhlCj4gKwkgKiAgIHJpc2luZyBl ZGdlIG9mIENTbgo+ICsJICovCj4gKwl0ZW1wID0gQUNDVElNSU5HKHRjMnJ3LCB0cndwdywgdHJ3 MmMpOwo+ICsJd3JpdGVsKHRlbXAsIG5mYy0+cmVncyArIE5GQ19GTVdBSVQpOwoKWW91IHNob3Vs ZCBzYXZlIHRoZSBjaGlwJ3MgdGltaW5nIGNvbmZpZ3VyYXRpb24gaW5zdGVhZCBvZiB3cml0aW5n IGl0CmhlcmUsIGFuZCBzZXR0aW5nIHRoZSByZWdpc3RlciB2YWx1ZSBkdXJpbmcgY2hpcCBzZWxl Y3Rpb24uIFRoaXMgd2F5CnlvdSBtYXkgaGFuZGxlIHNldmVyYWwgY2hpcHMgd2l0aCBkaWZmZXJl bnQgdGltaW5nCmNvbnN0cmFpbnRzL2NvbmZpZ3VyYXRpb25zLgoKPiArCj4gKwlyZXR1cm4gMDsK PiArfQo+ICsKPiArc3RhdGljIGludCBya19uZmNfaHdfZWNjX3NldHVwKHN0cnVjdCBuYW5kX2No aXAgKmNoaXAsCj4gKwkJCSAgICAgICBzdHJ1Y3QgbmFuZF9lY2NfY3RybCAqZWNjLAo+ICsJCQkg ICAgICAgdWludDMyX3Qgc3RyZW5ndGgpCj4gK3sKPiArCXN0cnVjdCBya19uZmMgKm5mYyA9IG5h bmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsKPiArCXUzMiByZWcsIGk7Cj4gKwo+ICsJZm9y IChpID0gMDsgaSA8IE5GQ19FQ0NfTUFYX01PREVTOyBpKyspIHsKPiArCQlpZiAoZWNjLT5zdHJl bmd0aCA9PSBuZmMtPmNmZy0+ZWNjX3N0cmVuZ3Roc1tpXSkgewo+ICsJCQlyZWcgPSBuZmMtPmNm Zy0+ZWNjX2NmZ3NbaV07Cj4gKwkJCWJyZWFrOwo+ICsJCX0KPiArCX0KPiArCj4gKwlpZiAoaSA+ PSBORkNfRUNDX01BWF9NT0RFUykKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwl3cml0ZWwo cmVnLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+YmNoY3RsX29mZik7CgpTYW1lIGhlcmUsIGlmIHlv dSBoYW5kbGUgZGlmZmVyZW50IGNoaXBzLCB0aGV5IG1heSB1c2UgZGlmZmVyZW50IEVDQwpjb25m aWd1cmF0aW9ucywgdGhpcyBzaG91bGQgYmUgaGFuZGxlZC4KCj4gKwo+ICsJcmV0dXJuIDA7Cj4g K30KPiArCj4gK3N0YXRpYyB2b2lkIHJrX25mY194ZmVyX3N0YXJ0KHN0cnVjdCBya19uZmMgKm5m YywgdTggcncsIHU4IG5fS0IsCj4gKwkJCSAgICAgIGRtYV9hZGRyX3QgZG1hX2RhdGEsIGRtYV9h ZGRyX3QgZG1hX29vYikKPiArewo+ICsJdTMyIGRtYV9yZWcsIGZsX3JlZywgYmNoX3JlZzsKPiAr Cj4gKwlkbWFfcmVnID0gRE1BX1NUIHwgKCghcncpIDw8IERNQV9XUikgfCBETUFfRU4gfCAoMiA8 PCBETUFfQUhCX1NJWkUpIHwKPiArCSAgICAgICg3IDw8IERNQV9CVVJTVF9TSVpFKSB8ICgxNiA8 PCBETUFfSU5DX05VTSk7Cj4gKwo+ICsJZmxfcmVnID0gKHJ3IDw8IEZMQ1RMX1dSKSB8IEZMQ1RM X1hGRVJfRU4gfCBGTENUTF9BQ09SUkVDVCB8Cj4gKwkJIChuX0tCIDw8IEZMQ1RMX1hGRVJfU0VD VE9SKSB8IEZMQ1RMX1RPR19GSVg7Cj4gKwo+ICsJaWYgKG5mYy0+Y2ZnLT50eXBlID09IE5GQ19W NiB8fCBuZmMtPmNmZy0+dHlwZSA9PSBORkNfVjgpIHsKPiArCQliY2hfcmVnID0gcmVhZGxfcmVs YXhlZChuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+YmNoY3RsX29mZik7Cj4gKwkJYmNoX3JlZyA9IChi Y2hfcmVnICYgKH5CQ0hDVExfQkFOS19NKSkgfAo+ICsJCQkgIChuZmMtPnNlbGVjdGVkX2Jhbmsg PDwgQkNIQ1RMX0JBTkspOwo+ICsJCXdyaXRlbChiY2hfcmVnLCBuZmMtPnJlZ3MgKyBuZmMtPmNm Zy0+YmNoY3RsX29mZik7Cj4gKwl9Cj4gKwo+ICsJd3JpdGVsKGRtYV9yZWcsIG5mYy0+cmVncyAr IG5mYy0+Y2ZnLT5kbWFfY2ZnX29mZik7Cj4gKwl3cml0ZWwoKHUzMilkbWFfZGF0YSwgbmZjLT5y ZWdzICsgbmZjLT5jZmctPmRtYV9kYXRhX2J1Zl9vZmYpOwo+ICsJd3JpdGVsKCh1MzIpZG1hX29v YiwgbmZjLT5yZWdzICsgbmZjLT5jZmctPmRtYV9vb2JfYnVmX29mZik7Cj4gKwl3cml0ZWwoZmxf cmVnLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZmxjdGxfb2ZmKTsKPiArCWZsX3JlZyB8PSBGTENU TF9YRkVSX1NUOwo+ICsJd3JpdGVsKGZsX3JlZywgbmZjLT5yZWdzICsgbmZjLT5jZmctPmZsY3Rs X29mZik7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX3dhaXRfZm9yX3hmZXJfZG9uZShz dHJ1Y3QgcmtfbmZjICpuZmMpCj4gK3sKPiArCXZvaWQgX19pb21lbSAqcHRyOwo+ICsJaW50IHJl dCA9IDA7Cj4gKwl1MzIgcmVnOwo+ICsKPiArCXB0ciA9IG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5m bGN0bF9vZmY7Cj4gKwo+ICsJcmV0ID0gcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXQocHRyLCBy ZWcsCj4gKwkJCQkJIHJlZyAmIEZMQ1RMX1hGRVJfUkVBRFksCj4gKwkJCQkJIDEwLCBORkNfVElN RU9VVCk7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBya19uZmNf d3JpdGVfcGFnZV9yYXcoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgdTggKmJ1ZiwKPiAr CQkJCSBpbnQgb29iX29uLCBpbnQgcGFnZSkKPiArewo+ICsJc3RydWN0IG10ZF9pbmZvICptdGQg PSBuYW5kX3RvX210ZChjaGlwKTsKPiArCXN0cnVjdCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2Nv bnRyb2xsZXJfZGF0YShjaGlwKTsKPiArCXN0cnVjdCBuYW5kX2VjY19jdHJsICplY2MgPSAmY2hp cC0+ZWNjOwo+ICsJaW50IHJldCA9IDA7Cj4gKwl1MzIgaTsKPiArCj4gKwlpZiAoIWJ1ZikKPiAr CQltZW1zZXQobmZjLT5idWZmZXIsIDB4ZmYsIG10ZC0+d3JpdGVzaXplICsgbXRkLT5vb2JzaXpl KTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgZWNjLT5zdGVwczsgaSsrKSB7Cj4gKwkJLyogQ29w eSBkYXRhIHRvIG5mYyBidWZmZXIuICovCj4gKwkJaWYgKGJ1ZikKPiArCQkJbWVtY3B5KHJrX25m Y19kYXRhX3B0cihjaGlwLCBpKSwKPiArCQkJICAgICAgIHJrX25mY19idWZfdG9fZGF0YV9wdHIo Y2hpcCwgYnVmLCBpKSwKPiArCQkJICAgICAgIGVjYy0+c2l6ZSk7Cj4gKwkJLyoKPiArCQkgKiBU aGUgZmlyc3QgZm91ciBieXRlcyBvZiBPT0IgYXJlIHJlc2VydmVkIGZvciB0aGUKPiArCQkgKiBi b290IFJPTS4gSW4gc29tZSBkZWJ1Z2dpbmcgY2FzZXMsIHN1Y2ggYXMgd2l0aCBhCj4gKwkJICog cmVhZCwgZXJhc2UgYW5kIHdyaXRlIGJhY2sgdGVzdCB0aGVzZSA0IGJ5dGVzIHN0b3JlZAo+ICsJ CSAqIGluIE9PQiBhbHNvIG5lZWQgdG8gYmUgd3JpdHRlbiBiYWNrLgo+ICsJCSAqLwoKVGhlIGNv bnRyb2xsZXIgZHJpdmVyIHNob3VsZCBub3QgYXJiaXRyYXRlIHRoaXMuIElmIHlvdSBkb24ndCB3 YW50IHRvCmV4cG9zZSB0aGVzZSBieXRlcywgdGhleSBzaG91bGQgbm90IGFwcGVhciAiZnJlZSIg aW4gdGhlIE9PQiBsYXlvdXQsCmJ1dCBhIHJhdyBhY2Nlc3MgKm11c3QqIGJ1dCBhYmxlIHRvIGFk ZHJlc3MgdGhlIGVudGlyZSBwYWdlL29vYi4KCj4gKwkJaWYgKCFpKQo+ICsJCQltZW1jcHkocmtf bmZjX29vYl9wdHIoY2hpcCwgaSksCj4gKwkJCSAgICAgICBya19uZmNfYnVmX3RvX29vYl9wdHIo Y2hpcCwgZWNjLT5zdGVwcyAtIDEpLAo+ICsJCQkgICAgICAgTkZDX1NZU19EQVRBX1NJWkUpOwo+ ICsJCWVsc2UKPiArCQkJbWVtY3B5KHJrX25mY19vb2JfcHRyKGNoaXAsIGkpLAo+ICsJCQkgICAg ICAgcmtfbmZjX2J1Zl90b19vb2JfcHRyKGNoaXAsIGkgLSAxKSwKPiArCQkJICAgICAgIE5GQ19T WVNfREFUQV9TSVpFKTsKPiArCQkvKiBDb3B5IEVDQyBkYXRhIHRvIHRoZSBORkMgYnVmZmVyLiAq Lwo+ICsJCW1lbWNweShya19uZmNfb29iX3B0cihjaGlwLCBpKSArIE5GQ19TWVNfREFUQV9TSVpF LAo+ICsJCSAgICAgICBya19uZmNfYnVmX3RvX29vYl9lY2NfcHRyKGNoaXAsIGkpLAo+ICsJCSAg ICAgICBlY2MtPmJ5dGVzKTsKPiArCX0KPiArCj4gKwluYW5kX3Byb2dfcGFnZV9iZWdpbl9vcChj aGlwLCBwYWdlLCAwLCBOVUxMLCAwKTsKPiArCXJrX25mY193cml0ZV9idWYobmZjLCBidWYsIG10 ZC0+d3JpdGVzaXplICsgbXRkLT5vb2JzaXplKTsKPiArCXJldCA9IG5hbmRfcHJvZ19wYWdlX2Vu ZF9vcChjaGlwKTsKPiArCj4gKwkvKgo+ICsJICogRGVzZWxlY3QgdGhlIGN1cnJlbnRseSBzZWxl Y3RlZCB0YXJnZXQgYWZ0ZXIgdGhlIG9wcyBpcyBkb25lCj4gKwkgKiB0byByZWR1Y2UgdGhlIHBv d2VyIGNvbnN1bXB0aW9uLgo+ICsJICovCj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwgLTEp Owo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX3dyaXRl X29vYihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgcGFnZSkKPiArewo+ICsJcmV0dXJuIHJr X25mY193cml0ZV9wYWdlX3JhdyhjaGlwLCBOVUxMLCAxLCBwYWdlKTsKCk5vdCBzdXJlIHRoaXMg aXMgcmVsZXZhbnQuIFlvdSBzaG91bGQgbm90IGRvIHRoYXQsIEkgZ3Vlc3MgdGhlIGNvcmUKd2ls bCBhdXRvbWF0aWNhbGx5IHRha2UgY2FyZSBvZiBpdC4KCj4gK30KPiArCj4gK3N0YXRpYyBpbnQg cmtfbmZjX3dyaXRlX3BhZ2VfaHdlY2Moc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgdTgg KmJ1ZiwKPiArCQkJCSAgIGludCBvb2Jfb24sIGludCBwYWdlKQo+ICt7Cj4gKwlzdHJ1Y3QgbXRk X2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0g bmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsJc3RydWN0IHJrX25mY19uYW5kX2No aXAgKnJrbmFuZCA9IHJrX25mY190b19ya25hbmQoY2hpcCk7Cj4gKwlzdHJ1Y3QgbmFuZF9lY2Nf Y3RybCAqZWNjID0gJmNoaXAtPmVjYzsKPiArCWludCBvb2Jfc3RlcCA9IChlY2MtPmJ5dGVzID4g NjApID8gTkZDX01BWF9PT0JfUEVSX1NURVAgOgo+ICsJCQlORkNfTUlOX09PQl9QRVJfU1RFUDsK PiArCWludCBwYWdlc19wZXJfYmxrID0gbXRkLT5lcmFzZXNpemUgLyBtdGQtPndyaXRlc2l6ZTsK PiArCWludCByZXQgPSAwLCBpLCBib290X3JvbV9tb2RlID0gMDsKPiArCWRtYV9hZGRyX3QgZG1h X2RhdGEsIGRtYV9vb2I7Cj4gKwl1MzIgcmVnOwo+ICsJdTggKm9vYjsKPiArCj4gKwluYW5kX3By b2dfcGFnZV9iZWdpbl9vcChjaGlwLCBwYWdlLCAwLCBOVUxMLCAwKTsKPiArCj4gKwltZW1jcHko bmZjLT5wYWdlX2J1ZiwgYnVmLCBtdGQtPndyaXRlc2l6ZSk7Cj4gKwo+ICsJLyoKPiArCSAqIFRo ZSBmaXJzdCBibG9ja3MgKDQsIDggb3IgMTYgZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UpIGFyZSB1 c2VkCj4gKwkgKiBieSB0aGUgYm9vdCBST00gYW5kIHRoZSBmaXJzdCAzMiBiaXRzIG9mIE9PQiBu ZWVkIHRvIGxpbmsgdG8KPiArCSAqIHRoZSBuZXh0IHBhZ2UgYWRkcmVzcyBpbiB0aGUgc2FtZSBi bG9jay4gV2UgY2FuJ3QgZGlyZWN0bHkgY29weQo+ICsJICogT09CIGRhdGEgZnJvbSB0aGUgTVRE IGZyYW1ld29yaywgYmVjYXVzZSB0aGlzIHBhZ2UgYWRkcmVzcwo+ICsJICogY29uZmxpY3RzIGZv ciBleGFtcGxlIHdpdGggdGhlIGJhZCBibG9jayBtYXJrZXIgKEJCTSksCj4gKwkgKiBzbyB3ZSBz aGlmdCBhbGwgT09CIGRhdGEgaW5jbHVkaW5nIHRoZSBCQk0gd2l0aCA0IGJ5dGUgcG9zaXRpb25z Lgo+ICsJICogQXMgYSBjb25zZXF1ZW5jZSB0aGUgT09CIHNpemUgYXZhaWxhYmxlIHRvIHRoZSBN VEQgZnJhbWV3b3JrIGlzCj4gKwkgKiBhbHNvIHJlZHVjZWQgd2l0aCA0IGJ5dGVzLgo+ICsJICoK PiArCSAqICAgIFBBMCBQQTEgUEEyIFBBMyB8IEJCTSBPT0IxIE9PQjIgT09CMyB8IC4uLgo+ICsJ ICoKPiArCSAqIElmIGEgTkFORCBpcyBub3QgYSBib290IG1lZGl1bSBvciB0aGUgcGFnZSBpcyBu b3QgYSBib290IGJsb2NrLAo+ICsJICogdGhlIGZpcnN0IDQgYnl0ZXMgYXJlIGxlZnQgdW50b3Vj aGVkIGJ5IHdyaXRpbmcgMHhGRiB0byB0aGVtLgo+ICsJICoKPiArCSAqICAgMHhGRiAweEZGIDB4 RkYgMHhGRiB8IEJCTSBPT0IxIE9PQjIgT09CMyB8IC4uLgo+ICsJICoKPiArCSAqIENvbmZpZ3Vy ZSB0aGUgRUNDIGFsZ29yaXRobSBzdXBwb3J0ZWQgYnkgdGhlIGJvb3QgUk9NLgo+ICsJICovCj4g KwlpZiAoKHBhZ2UgPCBwYWdlc19wZXJfYmxrICogcmtuYW5kLT5ib290X2Jsa3MpICYmCj4gKwkg ICAgKGNoaXAtPm9wdGlvbnMgJiBOQU5EX0lTX0JPT1RfTUVESVVNKSkgewo+ICsJCWJvb3Rfcm9t X21vZGUgPSAxOwo+ICsJCWlmIChya25hbmQtPmJvb3RfZWNjICE9IGVjYy0+c3RyZW5ndGgpCj4g KwkJCXJrX25mY19od19lY2Nfc2V0dXAoY2hpcCwgZWNjLAo+ICsJCQkJCSAgICBya25hbmQtPmJv b3RfZWNjKTsKPiArCX0KPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgZWNjLT5zdGVwczsgaSsrKSB7 Cj4gKwkJaWYgKCFpKSB7Cj4gKwkJCXJlZyA9IDB4RkZGRkZGRkY7Cj4gKwkJfSBlbHNlIHsKPiAr CQkJb29iID0gY2hpcC0+b29iX3BvaSArIChpIC0gMSkgKiBORkNfU1lTX0RBVEFfU0laRTsKPiAr CQkJcmVnID0gb29iWzBdIHwgb29iWzFdIDw8IDggfCBvb2JbMl0gPDwgMTYgfAo+ICsJCQkgICAg ICBvb2JbM10gPDwgMjQ7Cj4gKwkJfQo+ICsJCWlmICghaSAmJiBib290X3JvbV9tb2RlKQo+ICsJ CQlyZWcgPSAocGFnZSAmIChwYWdlc19wZXJfYmxrIC0gMSkpICogNDsKPiArCj4gKwkJaWYgKG5m Yy0+Y2ZnLT50eXBlID09IE5GQ19WOSkKPiArCQkJbmZjLT5vb2JfYnVmW2ldID0gcmVnOwo+ICsJ CWVsc2UKPiArCQkJbmZjLT5vb2JfYnVmW2kgKiAob29iX3N0ZXAgLyA0KV0gPSByZWc7Cj4gKwl9 Cj4gKwo+ICsJZG1hX2RhdGEgPSBkbWFfbWFwX3NpbmdsZShuZmMtPmRldiwgKHZvaWQgKiluZmMt PnBhZ2VfYnVmLAo+ICsJCQkJICBtdGQtPndyaXRlc2l6ZSwgRE1BX1RPX0RFVklDRSk7Cj4gKwlk bWFfb29iID0gZG1hX21hcF9zaW5nbGUobmZjLT5kZXYsIG5mYy0+b29iX2J1ZiwKPiArCQkJCSBl Y2MtPnN0ZXBzICogb29iX3N0ZXAsCj4gKwkJCQkgRE1BX1RPX0RFVklDRSk7Cj4gKwo+ICsJcmVp bml0X2NvbXBsZXRpb24oJm5mYy0+ZG9uZSk7Cj4gKwl3cml0ZWwoSU5UX0RNQSwgbmZjLT5yZWdz ICsgbmZjLT5jZmctPmludF9lbl9vZmYpOwo+ICsKPiArCXJrX25mY194ZmVyX3N0YXJ0KG5mYywg TkZDX1dSSVRFLCBlY2MtPnN0ZXBzLCBkbWFfZGF0YSwKPiArCQkJICBkbWFfb29iKTsKPiArCXJl dCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmbmZjLT5kb25lLAo+ICsJCQkJCSAgbXNl Y3NfdG9famlmZmllcygxMDApKTsKPiArCWlmICghcmV0KQo+ICsJCWRldl93YXJuKG5mYy0+ZGV2 LCAid3JpdGU6IHdhaXQgZG1hIGRvbmUgdGltZW91dC5cbiIpOwo+ICsJLyoKPiArCSAqIFdoZXRo ZXIgdGhlIERNQSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQgb3Igbm90LiBUaGUgZHJpdmVyCj4gKwkg KiBuZWVkcyB0byBjaGVjayB0aGUgTkZDYHMgc3RhdHVzIHJlZ2lzdGVyIHRvIHNlZSBpZiB0aGUg ZGF0YQo+ICsJICogdHJhbnNmZXIgd2FzIGNvbXBsZXRlZC4KPiArCSAqLwo+ICsJcmV0ID0gcmtf bmZjX3dhaXRfZm9yX3hmZXJfZG9uZShuZmMpOwo+ICsKPiArCWRtYV91bm1hcF9zaW5nbGUobmZj LT5kZXYsIGRtYV9kYXRhLCBtdGQtPndyaXRlc2l6ZSwKPiArCQkJIERNQV9UT19ERVZJQ0UpOwo+ ICsJZG1hX3VubWFwX3NpbmdsZShuZmMtPmRldiwgZG1hX29vYiwgZWNjLT5zdGVwcyAqIG9vYl9z dGVwLAo+ICsJCQkgRE1BX1RPX0RFVklDRSk7Cj4gKwo+ICsJaWYgKGJvb3Rfcm9tX21vZGUgJiYg cmtuYW5kLT5ib290X2VjYyAhPSBlY2MtPnN0cmVuZ3RoKQo+ICsJCXJrX25mY19od19lY2Nfc2V0 dXAoY2hpcCwgZWNjLCBlY2MtPnN0cmVuZ3RoKTsKPiArCj4gKwlpZiAocmV0KSB7Cj4gKwkJcmV0 ID0gLUVJTzsKPiArCQlkZXZfZXJyKG5mYy0+ZGV2LAo+ICsJCQkid3JpdGU6IHdhaXQgdHJhbnNm ZXIgZG9uZSB0aW1lb3V0LlxuIik7Cj4gKwl9Cj4gKwo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4g cmV0Owo+ICsKPiArCXJldCA9IG5hbmRfcHJvZ19wYWdlX2VuZF9vcChjaGlwKTsKPiArCj4gKwkv Kgo+ICsJICogRGVzZWxlY3QgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0YXJnZXQgYWZ0ZXIgdGhl IG9wcyBpcyBkb25lCj4gKwkgKiB0byByZWR1Y2UgdGhlIHBvd2VyIGNvbnN1bXB0aW9uLgo+ICsJ ICovCgpJZiB5b3UgZm9yY2UgdGhpcyBkZXNlbGVjdGlvbiwgeW91ciBzaG91bGQgcHJvYmFibHkg ZG8gaXQgZXZlbiBpbiBjYXNlCm9mIGVycm9yPwoKPiArCXJrX25mY19zZWxlY3RfY2hpcChjaGlw LCAtMSk7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBya19uZmNf cmVhZF9wYWdlX3JhdyhzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCB1OCAqYnVmLCBpbnQgb29iX29u LAo+ICsJCQkJaW50IHBhZ2UpCj4gK3sKPiArCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gbmFuZF90 b19tdGQoY2hpcCk7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dldF9jb250cm9sbGVy X2RhdGEoY2hpcCk7Cj4gKwlzdHJ1Y3QgbmFuZF9lY2NfY3RybCAqZWNjID0gJmNoaXAtPmVjYzsK PiArCWludCBpOwo+ICsKPiArCW5hbmRfcmVhZF9wYWdlX29wKGNoaXAsIHBhZ2UsIDAsIE5VTEws IDApOwo+ICsJcmtfbmZjX3JlYWRfYnVmKG5mYywgbmZjLT5idWZmZXIsIG10ZC0+d3JpdGVzaXpl ICsgbXRkLT5vb2JzaXplKTsKPiArCj4gKwkvKgo+ICsJICogRGVzZWxlY3QgdGhlIGN1cnJlbnRs eSBzZWxlY3RlZCB0YXJnZXQgYWZ0ZXIgdGhlIG9wcyBpcyBkb25lCj4gKwkgKiB0byByZWR1Y2Ug dGhlIHBvd2VyIGNvbnN1bXB0aW9uLgo+ICsJICovCj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hp cCwgLTEpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBlY2MtPnN0ZXBzOyBpKyspIHsKPiArCQkv Kgo+ICsJCSAqIFRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIE9PQiBhcmUgcmVzZXJ2ZWQgZm9yIHRo ZQo+ICsJCSAqIGJvb3QgUk9NLiBJbiBzb21lIGRlYnVnZ2luZyBjYXNlcywgc3VjaCBhcyB3aXRo IGEgcmVhZCwKPiArCQkgKiBlcmFzZSBhbmQgd3JpdGUgYmFjayB0ZXN0LCB0aGVzZSA0IGJ5dGVz IGFsc28gbXVzdCBiZQo+ICsJCSAqIHNhdmVkIHNvbWV3aGVyZSwgb3RoZXJ3aXNlIHRoaXMgaW5m b3JtYXRpb24gd2lsbCBiZQo+ICsJCSAqIGxvc3QgZHVyaW5nIGEgd3JpdGUgYmFjay4KCkRpdHRv Cgo+ICsJCSAqLwo+ICsJCWlmICghaSkKPiArCQkJbWVtY3B5KHJrX25mY19idWZfdG9fb29iX3B0 cihjaGlwLCBlY2MtPnN0ZXBzIC0gMSksCj4gKwkJCSAgICAgICBya19uZmNfb29iX3B0cihjaGlw LCBpKSwKPiArCQkJICAgICAgIE5GQ19TWVNfREFUQV9TSVpFKTsKPiArCQllbHNlCj4gKwkJCW1l bWNweShya19uZmNfYnVmX3RvX29vYl9wdHIoY2hpcCwgaSAtIDEpLAo+ICsJCQkgICAgICAgcmtf bmZjX29vYl9wdHIoY2hpcCwgaSksCj4gKwkJCSAgICAgICBORkNfU1lTX0RBVEFfU0laRSk7Cj4g KwkJLyogQ29weSBFQ0MgZGF0YSBmcm9tIHRoZSBORkMgYnVmZmVyLiAqLwo+ICsJCW1lbWNweShy a19uZmNfYnVmX3RvX29vYl9lY2NfcHRyKGNoaXAsIGkpLAo+ICsJCSAgICAgICBya19uZmNfb29i X3B0cihjaGlwLCBpKSArIE5GQ19TWVNfREFUQV9TSVpFLAo+ICsJCSAgICAgICBlY2MtPmJ5dGVz KTsKPiArCQkvKiBDb3B5IGRhdGEgZnJvbSB0aGUgTkZDIGJ1ZmZlci4gKi8KPiArCQlpZiAoYnVm KQo+ICsJCQltZW1jcHkocmtfbmZjX2J1Zl90b19kYXRhX3B0cihjaGlwLCBidWYsIGkpLAo+ICsJ CQkgICAgICAgcmtfbmZjX2RhdGFfcHRyKGNoaXAsIGkpLAo+ICsJCQkgICAgICAgZWNjLT5zaXpl KTsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBya19uZmNf cmVhZF9vb2Ioc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgaW50IHBhZ2UpCj4gK3sKPiArCXJldHVy biBya19uZmNfcmVhZF9wYWdlX3JhdyhjaGlwLCBOVUxMLCAxLCBwYWdlKTsKCkRpdHRvCgo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19yZWFkX3BhZ2VfaHdlY2Moc3RydWN0IG5hbmRfY2hp cCAqY2hpcCwgdTggKmJ1ZiwgaW50IG9vYl9vbiwKPiArCQkJCSAgaW50IHBhZ2UpCj4gK3sKPiAr CXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gbmFuZF90b19tdGQoY2hpcCk7Cj4gKwlzdHJ1Y3Qgcmtf bmZjICpuZmMgPSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4gKwlzdHJ1Y3Qgcmtf bmZjX25hbmRfY2hpcCAqcmtuYW5kID0gcmtfbmZjX3RvX3JrbmFuZChjaGlwKTsKPiArCXN0cnVj dCBuYW5kX2VjY19jdHJsICplY2MgPSAmY2hpcC0+ZWNjOwo+ICsJaW50IG9vYl9zdGVwID0gKGVj Yy0+Ynl0ZXMgPiA2MCkgPyBORkNfTUFYX09PQl9QRVJfU1RFUCA6Cj4gKwkJCU5GQ19NSU5fT09C X1BFUl9TVEVQOwo+ICsJaW50IHBhZ2VzX3Blcl9ibGsgPSBtdGQtPmVyYXNlc2l6ZSAvIG10ZC0+ d3JpdGVzaXplOwo+ICsJZG1hX2FkZHJfdCBkbWFfZGF0YSwgZG1hX29vYjsKPiArCWludCByZXQg PSAwLCBpLCBib290X3JvbV9tb2RlID0gMDsKPiArCWludCBiaXRmbGlwcyA9IDAsIGJjaF9zdDsK PiArCXU4ICpvb2I7Cj4gKwl1MzIgdG1wOwo+ICsKPiArCW5hbmRfcmVhZF9wYWdlX29wKGNoaXAs IHBhZ2UsIDAsIE5VTEwsIDApOwo+ICsKPiArCWRtYV9kYXRhID0gZG1hX21hcF9zaW5nbGUobmZj LT5kZXYsIG5mYy0+cGFnZV9idWYsCj4gKwkJCQkgIG10ZC0+d3JpdGVzaXplLAo+ICsJCQkJICBE TUFfRlJPTV9ERVZJQ0UpOwo+ICsJZG1hX29vYiA9IGRtYV9tYXBfc2luZ2xlKG5mYy0+ZGV2LCBu ZmMtPm9vYl9idWYsCj4gKwkJCQkgZWNjLT5zdGVwcyAqIG9vYl9zdGVwLAo+ICsJCQkJIERNQV9G Uk9NX0RFVklDRSk7Cj4gKwo+ICsJLyoKPiArCSAqIFRoZSBmaXJzdCBibG9ja3MgKDQsIDggb3Ig MTYgZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UpCj4gKwkgKiBhcmUgdXNlZCBieSB0aGUgYm9vdCBS T00uCj4gKwkgKiBDb25maWd1cmUgdGhlIEVDQyBhbGdvcml0aG0gc3VwcG9ydGVkIGJ5IHRoZSBi b290IFJPTS4KPiArCSAqLwo+ICsJaWYgKChwYWdlIDwgcGFnZXNfcGVyX2JsayAqIHJrbmFuZC0+ Ym9vdF9ibGtzKSAmJgo+ICsJICAgIChjaGlwLT5vcHRpb25zICYgTkFORF9JU19CT09UX01FRElV TSkpIHsKPiArCQlib290X3JvbV9tb2RlID0gMTsKPiArCQlpZiAocmtuYW5kLT5ib290X2VjYyAh PSBlY2MtPnN0cmVuZ3RoKQo+ICsJCQlya19uZmNfaHdfZWNjX3NldHVwKGNoaXAsIGVjYywKPiAr CQkJCQkgICAgcmtuYW5kLT5ib290X2VjYyk7Cj4gKwl9Cj4gKwo+ICsJcmVpbml0X2NvbXBsZXRp b24oJm5mYy0+ZG9uZSk7Cj4gKwl3cml0ZWwoSU5UX0RNQSwgbmZjLT5yZWdzICsgbmZjLT5jZmct PmludF9lbl9vZmYpOwo+ICsJcmtfbmZjX3hmZXJfc3RhcnQobmZjLCBORkNfUkVBRCwgZWNjLT5z dGVwcywgZG1hX2RhdGEsCj4gKwkJCSAgZG1hX29vYik7Cj4gKwlyZXQgPSB3YWl0X2Zvcl9jb21w bGV0aW9uX3RpbWVvdXQoJm5mYy0+ZG9uZSwKPiArCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoMTAw KSk7Cj4gKwlpZiAoIXJldCkKPiArCQlkZXZfd2FybihuZmMtPmRldiwgInJlYWQ6IHdhaXQgZG1h IGRvbmUgdGltZW91dC5cbiIpOwo+ICsJLyoKPiArCSAqIFdoZXRoZXIgdGhlIERNQSB0cmFuc2Zl ciBpcyBjb21wbGV0ZWQgb3Igbm90LiBUaGUgZHJpdmVyCj4gKwkgKiBuZWVkcyB0byBjaGVjayB0 aGUgTkZDYHMgc3RhdHVzIHJlZ2lzdGVyIHRvIHNlZSBpZiB0aGUgZGF0YQo+ICsJICogdHJhbnNm ZXIgd2FzIGNvbXBsZXRlZC4KPiArCSAqLwo+ICsJcmV0ID0gcmtfbmZjX3dhaXRfZm9yX3hmZXJf ZG9uZShuZmMpOwo+ICsJZG1hX3VubWFwX3NpbmdsZShuZmMtPmRldiwgZG1hX2RhdGEsIG10ZC0+ d3JpdGVzaXplLAo+ICsJCQkgRE1BX0ZST01fREVWSUNFKTsKPiArCWRtYV91bm1hcF9zaW5nbGUo bmZjLT5kZXYsIGRtYV9vb2IsIGVjYy0+c3RlcHMgKiBvb2Jfc3RlcCwKPiArCQkJIERNQV9GUk9N X0RFVklDRSk7Cj4gKwo+ICsJaWYgKHJldCkgewo+ICsJCWJpdGZsaXBzID0gLUVJTzsKPiArCQlk ZXZfZXJyKG5mYy0+ZGV2LAo+ICsJCQkicmVhZDogd2FpdCB0cmFuc2ZlciBkb25lIHRpbWVvdXQu XG4iKTsKPiArCQlnb3RvIG91dDsKPiArCX0KPiArCj4gKwlmb3IgKGkgPSAxOyBpIDwgZWNjLT5z dGVwczsgaSsrKSB7Cj4gKwkJb29iID0gY2hpcC0+b29iX3BvaSArIChpIC0gMSkgKiBORkNfU1lT X0RBVEFfU0laRTsKPiArCQlpZiAobmZjLT5jZmctPnR5cGUgPT0gTkZDX1Y5KQo+ICsJCQl0bXAg PSBuZmMtPm9vYl9idWZbaV07Cj4gKwkJZWxzZQo+ICsJCQl0bXAgPSBuZmMtPm9vYl9idWZbaSAq IChvb2Jfc3RlcCAvIDQpXTsKPiArCQkqb29iKysgPSAodTgpdG1wOwo+ICsJCSpvb2IrKyA9ICh1 OCkodG1wID4+IDgpOwo+ICsJCSpvb2IrKyA9ICh1OCkodG1wID4+IDE2KTsKPiArCQkqb29iKysg PSAodTgpKHRtcCA+PiAyNCk7Cj4gKwl9Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IChlY2MtPnN0 ZXBzIC8gMik7IGkrKykgewo+ICsJCWJjaF9zdCA9IHJlYWRsX3JlbGF4ZWQobmZjLT5yZWdzICsK PiArCQkJCSAgICAgICBuZmMtPmNmZy0+YmNoX3N0X29mZiArIGkgKiA0KTsKPiArCQlpZiAoYmNo X3N0ICYgQklUKG5mYy0+Y2ZnLT5lY2MwLmVycl9mbGFnX2JpdCkgfHwKPiArCQkgICAgYmNoX3N0 ICYgQklUKG5mYy0+Y2ZnLT5lY2MxLmVycl9mbGFnX2JpdCkpIHsKPiArCQkJbXRkLT5lY2Nfc3Rh dHMuZmFpbGVkKys7Cj4gKwkJCWJpdGZsaXBzID0gMDsKPiArCQl9IGVsc2Ugewo+ICsJCQlyZXQg PSBFQ0NfRVJSX0NOVChiY2hfc3QsIG5mYy0+Y2ZnLT5lY2MwKTsKPiArCQkJbXRkLT5lY2Nfc3Rh dHMuY29ycmVjdGVkICs9IHJldDsKPiArCQkJYml0ZmxpcHMgPSBtYXhfdCh1MzIsIGJpdGZsaXBz LCByZXQpOwo+ICsKPiArCQkJcmV0ID0gRUNDX0VSUl9DTlQoYmNoX3N0LCBuZmMtPmNmZy0+ZWNj MSk7Cj4gKwkJCW10ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCArPSByZXQ7Cj4gKwkJCWJpdGZsaXBz ID0gbWF4X3QodTMyLCBiaXRmbGlwcywgcmV0KTsKPiArCQl9Cj4gKwl9Cj4gK291dDoKPiArCW1l bWNweShidWYsIG5mYy0+cGFnZV9idWYsIG10ZC0+d3JpdGVzaXplKTsKPiArCj4gKwlpZiAoYm9v dF9yb21fbW9kZSAmJiBya25hbmQtPmJvb3RfZWNjICE9IGVjYy0+c3RyZW5ndGgpCj4gKwkJcmtf bmZjX2h3X2VjY19zZXR1cChjaGlwLCBlY2MsIGVjYy0+c3RyZW5ndGgpOwo+ICsKPiArCWlmIChi aXRmbGlwcyA+IGVjYy0+c3RyZW5ndGgpCj4gKwkJZGV2X2VycihuZmMtPmRldiwgInJlYWQgcGFn ZTogJXggZWNjIGVycm9yIVxuIiwgcGFnZSk7Cj4gKwo+ICsJLyoKPiArCSAqIERlc2VsZWN0IHRo ZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGFyZ2V0IGFmdGVyIHRoZSBvcHMgaXMgZG9uZQo+ICsJICog dG8gcmVkdWNlIHRoZSBwb3dlciBjb25zdW1wdGlvbi4KPiArCSAqLwo+ICsJcmtfbmZjX3NlbGVj dF9jaGlwKGNoaXAsIC0xKTsKPiArCj4gKwlyZXR1cm4gYml0ZmxpcHM7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbmxpbmUgdm9pZCBya19uZmNfaHdfaW5pdChzdHJ1Y3QgcmtfbmZjICpuZmMpCj4gK3sK PiArCS8qIERpc2FibGUgZmxhc2ggd3AuICovCj4gKwl3cml0ZWwoRk1DVExfV1AsIG5mYy0+cmVn cyArIE5GQ19GTUNUTCk7Cj4gKwkvKiBDb25maWcgZGVmYXVsdCB0aW1pbmcgNDBucyBhdCAxNTAg TWh6IG5mYyBjbG9jay4gKi8KPiArCXdyaXRlbCgweDEwODEsIG5mYy0+cmVncyArIE5GQ19GTVdB SVQpOwo+ICsJLyogRGlzYWJsZSByYW5kb21pemVyIGFuZCBETUEuICovCj4gKwl3cml0ZWwoMCwg bmZjLT5yZWdzICsgbmZjLT5jZmctPnJhbmRtel9vZmYpOwo+ICsJd3JpdGVsKDAsIG5mYy0+cmVn cyArIG5mYy0+Y2ZnLT5kbWFfY2ZnX29mZik7Cj4gKwl3cml0ZWwoRkxDVExfUlNULCBuZmMtPnJl Z3MgKyBuZmMtPmNmZy0+ZmxjdGxfb2ZmKTsKPiArfQo+ICsKPiArc3RhdGljIGlycXJldHVybl90 IHJrX25mY19pcnEoaW50IGlycSwgdm9pZCAqaWQpCj4gK3sKPiArCXN0cnVjdCBya19uZmMgKm5m YyA9IGlkOwo+ICsJdTMyIHN0YSwgaWVuOwo+ICsKPiArCXN0YSA9IHJlYWRsX3JlbGF4ZWQobmZj LT5yZWdzICsgbmZjLT5jZmctPmludF9zdF9vZmYpOwo+ICsJaWVuID0gcmVhZGxfcmVsYXhlZChu ZmMtPnJlZ3MgKyBuZmMtPmNmZy0+aW50X2VuX29mZik7Cj4gKwo+ICsJaWYgKCEoc3RhICYgaWVu KSkKPiArCQlyZXR1cm4gSVJRX05PTkU7Cj4gKwo+ICsJd3JpdGVsKHN0YSwgbmZjLT5yZWdzICsg bmZjLT5jZmctPmludF9jbHJfb2ZmKTsKPiArCXdyaXRlbCh+c3RhICYgaWVuLCBuZmMtPnJlZ3Mg KyBuZmMtPmNmZy0+aW50X2VuX29mZik7Cj4gKwo+ICsJY29tcGxldGUoJm5mYy0+ZG9uZSk7Cj4g Kwo+ICsJcmV0dXJuIElSUV9IQU5ETEVEOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19l bmFibGVfY2xrcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBya19uZmMgKm5mYykKPiArewo+ ICsJaW50IHJldDsKPiArCj4gKwlpZiAoIUlTX0VSUihuZmMtPm5mY19jbGspKSB7Cj4gKwkJcmV0 ID0gY2xrX3ByZXBhcmVfZW5hYmxlKG5mYy0+bmZjX2Nsayk7Cj4gKwkJaWYgKHJldCkgewo+ICsJ CQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBlbmFibGUgbmZjIGNsa1xuIik7Cj4gKwkJCXJldHVy biByZXQ7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShuZmMt PmFoYl9jbGspOwo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGVu YWJsZSBhaGIgY2xrXG4iKTsKPiArCQlpZiAoIUlTX0VSUihuZmMtPm5mY19jbGspKQo+ICsJCQlj bGtfZGlzYWJsZV91bnByZXBhcmUobmZjLT5uZmNfY2xrKTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJ fQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBya19uZmNfZGlzYWJs ZV9jbGtzKHN0cnVjdCBya19uZmMgKm5mYykKPiArewo+ICsJaWYgKCFJU19FUlIobmZjLT5uZmNf Y2xrKSkKPiArCQljbGtfZGlzYWJsZV91bnByZXBhcmUobmZjLT5uZmNfY2xrKTsKPiArCWNsa19k aXNhYmxlX3VucHJlcGFyZShuZmMtPmFoYl9jbGspOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJr X25mY19vb2JsYXlvdXRfZnJlZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IHNlY3Rpb24sCj4g KwkJCQkgc3RydWN0IG10ZF9vb2JfcmVnaW9uICpvb2JfcmVnaW9uKQo+ICt7Cj4gKwlzdHJ1Y3Qg bmFuZF9jaGlwICpjaGlwID0gbXRkX3RvX25hbmQobXRkKTsKPiArCXN0cnVjdCBya19uZmNfbmFu ZF9jaGlwICpya25hbmQgPSBya19uZmNfdG9fcmtuYW5kKGNoaXApOwo+ICsKPiArCWlmIChzZWN0 aW9uKQo+ICsJCXJldHVybiAtRVJBTkdFOwo+ICsKPiArCS8qCj4gKwkgKiBUaGUgYmVnaW5uaW5n IG9mIHRoZSBPT0IgYXJlYSBzdG9yZXMgdGhlIHJlc2VydmVkIGRhdGEgZm9yIHRoZSBORkMsCj4g KwkgKiB0aGUgc2l6ZSBvZiB0aGUgcmVzZXJ2ZWQgZGF0YSBpcyBORkNfU1lTX0RBVEFfU0laRSBi eXRlcy4KPiArCSAqLwo+ICsJb29iX3JlZ2lvbi0+bGVuZ3RoID0gcmtuYW5kLT5tZXRhZGF0YV9z aXplIC0gTkZDX1NZU19EQVRBX1NJWkUgLSAyOwo+ICsJb29iX3JlZ2lvbi0+b2Zmc2V0ID0gTkZD X1NZU19EQVRBX1NJWkUgKyAyOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMg aW50IHJrX25mY19vb2JsYXlvdXRfZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgc2VjdGlv biwKPiArCQkJCXN0cnVjdCBtdGRfb29iX3JlZ2lvbiAqb29iX3JlZ2lvbikKPiArewo+ICsJc3Ry dWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZF90b19uYW5kKG10ZCk7Cj4gKwlzdHJ1Y3QgcmtfbmZj X25hbmRfY2hpcCAqcmtuYW5kID0gcmtfbmZjX3RvX3JrbmFuZChjaGlwKTsKPiArCj4gKwlpZiAo c2VjdGlvbikKPiArCQlyZXR1cm4gLUVSQU5HRTsKPiArCj4gKwlvb2JfcmVnaW9uLT5sZW5ndGgg PSBtdGQtPm9vYnNpemUgLSBya25hbmQtPm1ldGFkYXRhX3NpemU7Cj4gKwlvb2JfcmVnaW9uLT5v ZmZzZXQgPSBya25hbmQtPm1ldGFkYXRhX3NpemU7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiAr Cj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRkX29vYmxheW91dF9vcHMgcmtfbmZjX29vYmxheW91 dF9vcHMgPSB7Cj4gKwkuZnJlZSA9IHJrX25mY19vb2JsYXlvdXRfZnJlZSwKPiArCS5lY2MgPSBy a19uZmNfb29ibGF5b3V0X2VjYywKPiArfTsKPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX2VjY19p bml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IG10ZF9pbmZvICptdGQpCj4gK3sKPiArCXN0 cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGRfdG9fbmFuZChtdGQpOwo+ICsJc3RydWN0IHJrX25m YyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsJc3RydWN0IG5hbmRf ZWNjX2N0cmwgKmVjYyA9ICZjaGlwLT5lY2M7Cj4gKwljb25zdCB1OCAqc3RyZW5ndGhzID0gbmZj LT5jZmctPmVjY19zdHJlbmd0aHM7Cj4gKwl1OCBtYXhfc3RyZW5ndGgsIG5mY19tYXhfc3RyZW5n dGg7Cj4gKwlpbnQgaTsKPiArCj4gKwluZmNfbWF4X3N0cmVuZ3RoID0gbmZjLT5jZmctPmVjY19z dHJlbmd0aHNbMF07Cj4gKwkvKiBJZiBvcHRpb25hbCBkdCBzZXR0aW5ncyBub3QgcHJlc2VudC4g Ki8KPiArCWlmICghZWNjLT5zaXplIHx8ICFlY2MtPnN0cmVuZ3RoIHx8Cj4gKwkgICAgZWNjLT5z dHJlbmd0aCA+IG5mY19tYXhfc3RyZW5ndGgpIHsKPiArCQljaGlwLT5lY2Muc2l6ZSA9IDEwMjQ7 Cj4gKwkJZWNjLT5zdGVwcyA9IG10ZC0+d3JpdGVzaXplIC8gZWNjLT5zaXplOwo+ICsKPiArCQkv Kgo+ICsJCSAqIEhXIEVDQyBhbHdheXMgcmVxdWVzdHMgdGhlIG51bWJlciBvZiBFQ0MgYnl0ZXMg cGVyIDEwMjQgYnl0ZQo+ICsJCSAqIGJsb2Nrcy4gVGhlIGZpcnN0IDQgT09CIGJ5dGVzIGFyZSBy ZXNlcnZlZCBmb3Igc3lzIGRhdGEuCj4gKwkJICovCj4gKwkJbWF4X3N0cmVuZ3RoID0gKChtdGQt Pm9vYnNpemUgLyBlY2MtPnN0ZXBzKSAtIDQpICogOCAvCj4gKwkJCQkgZmxzKDggKiAxMDI0KTsK PiArCQlpZiAobWF4X3N0cmVuZ3RoID4gbmZjX21heF9zdHJlbmd0aCkKPiArCQkJbWF4X3N0cmVu Z3RoID0gbmZjX21heF9zdHJlbmd0aDsKPiArCj4gKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykg ewo+ICsJCQlpZiAobWF4X3N0cmVuZ3RoID49IHN0cmVuZ3Roc1tpXSkKPiArCQkJCWJyZWFrOwo+ ICsJCX0KPiArCj4gKwkJaWYgKGkgPj0gNCkgewo+ICsJCQlkZXZfZXJyKG5mYy0+ZGV2LCAiVW5z dXBwb3J0ZWQgRUNDIHN0cmVuZ3RoXG4iKTsKPiArCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwo+ICsJ CX0KPiArCj4gKwkJZWNjLT5zdHJlbmd0aCA9IHN0cmVuZ3Roc1tpXTsKPiArCX0KPiArCWVjYy0+ c3RlcHMgPSBtdGQtPndyaXRlc2l6ZSAvIGVjYy0+c2l6ZTsKPiArCWVjYy0+Ynl0ZXMgPSBESVZf Uk9VTkRfVVAoZWNjLT5zdHJlbmd0aCAqIGZscyg4ICogMTAyNCksIDgpOwoKSGVyZSB5b3UgYXNz dW1lIDEwMjQgRUNDIHN0ZXAgc2l6ZSwgdGhpcyBpcyB3cm9uZy4gRWl0aGVyIHRoZQpjb250cm9s bGVyIG9ubHkgc3VwcG9ydHMgMTAyNCBieXRlcyBvciB5b3Ugb2ZmaWNpYWxseSBzdGF0ZSBzb21l d2hlcmUKdGhhdCB5b3UgZG9uJ3Qgc3VwcG9ydCBtb3JlIEVDQyBzdGVwIHNpemVzIHlldC4KCj4g KwkvKiBIVyBFQ0MgYWx3YXlzIHdvcmsgd2l0aCBldmVuIG51bWJlcnMgb2YgRUNDIGJ5dGVzLiAq Lwo+ICsJZWNjLT5ieXRlcyA9IEFMSUdOKGVjYy0+Ynl0ZXMsIDIpOwoKU2hvdWxkbid0IHlvdSBl bnN1cmUgdGhlIG51bWJlciBvZiBieXRlcyBpcyByb3VuZGVkIHVwID8KCj4gKwo+ICsJcmtfbmZj X2h3X2VjY19zZXR1cChjaGlwLCBlY2MsIGVjYy0+c3RyZW5ndGgpOwo+ICsKPiArCXJldHVybiAw Owo+ICt9Cj4gKwoKClRoYW5rcywKTWlxdcOobAoKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KTGludXgtcm9ja2NoaXAgbWFpbGluZyBsaXN0CkxpbnV4LXJv Y2tjaGlwQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFp bG1hbi9saXN0aW5mby9saW51eC1yb2NrY2hpcAo= 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=-11.2 required=3.0 tests=BAYES_00,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_2 autolearn=unavailable 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 4CF27C4363A for ; Wed, 28 Oct 2020 10:49:25 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 93C8A24696 for ; Wed, 28 Oct 2020 10:49:24 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="VrdHvCSQ" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 93C8A24696 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+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=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: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=/wxRXT+jDE//y7HTvGbaeBgxhgGTHg1qBpZdywVnv2I=; b=VrdHvCSQlOMmuJRzGfFhSVp+I r+7vGFJ/5FQN/cQUmRvD4fT+UgJQYO4nyElpRnotUchPt6S+EXkONL+ssWWtUm1Z92/4twKdPsfai 8m3eVC3jpIJA6Wi7MKx7xeECmDEkyQn8k7njzvJteM2IaYTNdcLCmJSsUj2lblw1WsjTHeaMm6TNc GLJmSUCNhQJi1Ft96uSUwzfcJhnHvkdwlQWEQbs0l3Ieg+EqOjJVcvVoEAY5cOPrB3et5H4am1mPA WTj4TBAiEk0kz68/eyInCj3Up1POK3gngTF5iUIbDi1iv+aqflFnuawvQgAKdbvMHs++Ja3AYtkTM +CwgXcGNA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kXj0O-0001k5-U3; Wed, 28 Oct 2020 10:48:36 +0000 Received: from relay3-d.mail.gandi.net ([217.70.183.195]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kXj0L-0001jE-5V; Wed, 28 Oct 2020 10:48:35 +0000 X-Originating-IP: 91.224.148.103 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay3-d.mail.gandi.net (Postfix) with ESMTPSA id 9E8F66001A; Wed, 28 Oct 2020 10:48:27 +0000 (UTC) Date: Wed, 28 Oct 2020 11:48:26 +0100 From: Miquel Raynal To: Yifeng Zhao Subject: Re: [PATCH v13 2/8] mtd: rawnand: rockchip: NFC drivers for RK3308, RK2928 and others Message-ID: <20201028114826.6cd6b841@xps13> In-Reply-To: <20201028095326.15562-3-yifeng.zhao@rock-chips.com> References: <20201028095326.15562-1-yifeng.zhao@rock-chips.com> <20201028095326.15562-3-yifeng.zhao@rock-chips.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.4 (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-20201028_064833_444741_41509BB4 X-CRM114-Status: GOOD ( 38.03 ) 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: devicetree@vger.kernel.org, vigneshr@ti.com, richard@nod.at, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, robh+dt@kernel.org, linux-mtd@lists.infradead.org, linux-arm-kernel@lists.infradead.org, heiko@sntech.de 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 SGkgWWlmZW5nLAoKQSBmZXcgbW9yZSBjb21tZW50cyBiZWxvdywgYnV0IG92ZXJhbGwgbG9va3Mg YmV0dGVyLgoKWWlmZW5nIFpoYW8gPHlpZmVuZy56aGFvQHJvY2stY2hpcHMuY29tPiB3cm90ZSBv biBXZWQsIDI4IE9jdCAyMDIwCjE3OjUzOjI0ICswODAwOgoKPiBUaGlzIGRyaXZlciBzdXBwb3J0 cyBSb2NrY2hpcCBORkMgKE5BTkQgRmxhc2ggQ29udHJvbGxlcikgZm91bmQgb24gUkszMzA4LAo+ IFJLMjkyOCwgUktQWDMwLCBSVjExMDggYW5kIG90aGVyIFNPQ3MuIFRoZSBkcml2ZXIgaGFzIGJl ZW4gdGVzdGVkIHVzaW5nCj4gOC1iaXQgTkFORCBpbnRlcmZhY2Ugb24gdGhlIEFSTSBiYXNlZCBS SzMzMDggcGxhdGZvcm0uCj4gCj4gU3VwcG9ydCBSb2NrY2hpcCBTb0NzIGFuZCBORkMgdmVyc2lv bnM6Cj4gLSBQWDMwIGFuZCBSSzMzMjYoTkZDdjkwMCkuCj4gCUVDQzogMTYvNDAvNjAvNzAgYml0 cy8xS0IuCj4gCUNMT0NLOiBhaGIgYW5kIG5mYy4KPiAtIFJLMzMwOCBhbmQgUlYxMTA4KE5GQ3Y4 MDApLgo+IAlFQ0M6IDE2IGJpdHMvMUtCLgo+IAlDTE9DSzogYWhiIGFuZCBuZmMuCj4gLSBSSzMw MzYgYW5kIFJLMzEyOChORkN2NjIyKS4KPiAJRUNDOiAxNi8yNC80MC82MCBiaXRzLzFLQi4KPiAJ Q0xPQ0s6IGFoYiBhbmQgbmZjLgo+IC0gUkszMDY2LCBSSzMxODggYW5kIFJLMjkyOChORkN2NjAw KS4KPiAJRUNDOiAxNi8yNC80MC82MCBiaXRzLzFLQi4KPiAJQ0xPQ0s6IGFoYi4KPiAKPiBTdXBw b3J0ZWQgZmVhdHVyZXM6Cj4gLSBSZWFkIGZ1bGwgcGFnZSBkYXRhIGJ5IERNQS4KPiAtIFN1cHBv cnQgSFcgRUNDKG9uZSBzdGVwIGlzIDFLQikuCj4gLSBTdXBwb3J0IDIgLSAzMksgcGFnZSBzaXpl Lgo+IC0gU3VwcG9ydCA4IENTKGRlcGVuZCBvbiBTb0NzKQo+IAo+IExpbWl0YXRpb25zOgo+IC0g Tm8gc3VwcG9ydCBmb3IgdGhlIGVjYyBzdGVwIHNpemUgaXMgNTEyLgo+IC0gVW50ZXN0ZWQgb24g c29tZSBTb0NzLgo+IC0gTm8gc3VwcG9ydCBmb3Igc3VicGFnZXMuCj4gLSBObyBzdXBwb3J0IGZv ciB0aGUgYnVpbHRpbiByYW5kb21pemVyLgo+IC0gVGhlIG9yaWdpbmFsIGJhZCBibG9jayBtYXNr IGlzIG5vdCBzdXBwb3J0ZWQuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZQo+ICAgdGhlIEJCVChi YWQgYmxvY2sgdGFibGUpLgo+IAo+IFNpZ25lZC1vZmYtYnk6IFlpZmVuZyBaaGFvIDx5aWZlbmcu emhhb0Byb2NrLWNoaXBzLmNvbT4KPiAtLS0KPiAKPiBDaGFuZ2VzIGluIHYxMzoKPiAtIFRoZSBu ZmMtPmJ1ZmZlciB3aWxsIHJlYWxsb2Mgd2hpbGUgdGhlIHBhZ2Ugc2l6ZSBvZiB0aGUgc2Vjb25k IG10ZAo+ICAgaXMgbGFyZ2UgdGhhbiB0aGUgZmlyc3Qgb25lLgo+IC0gRml4IGNvZGluZyBzdHls ZS4KPiAtIEZpeCBzb21lIGNvbW1lbnRzLgo+IAo+IENoYW5nZXMgaW4gdjEyOiBOb25lCj4gQ2hh bmdlcyBpbiB2MTE6Cj4gLSBGaXggY29tcGlsZSBlcnJvci4KPiAKPiBDaGFuZ2VzIGluIHYxMDoK PiAtIEZpeCBjb21waWxlIGVycm9yIG9uIG1hc3RlciB2NS45LXJjNy4KPiAKPiBDaGFuZ2VzIGlu IHY5Ogo+IC0gVGhlIG5mYy0+YnVmZmVyIHdpbGwgcmVhbGxvYyB3aGlsZSB0aGUgcGFnZSBzaXpl IG9mIHRoZSBzZWNvbmQgbXRkCj4gICBpcyBsYXJnZSB0aGFuIHRoZSBmaXJzdCBvbmUKPiAtIEZp eCBjb2Rpbmcgc3R5bGUuCj4gLSBSZW1vdmUgc3RydWN0IHJrX25mY19jbGsuCj4gLSBQcmVwZW5k IHNvbWUgZnVuY3Rpb24gd2l0aCBya19uZmNfLgo+IC0gUmVwbGFjZSBmdW5jdGlvbiByZWFkbF9w b2xsX3RpbWVvdXRfYXRvbWljIHdpdGggcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXQuCj4gLSBS ZW1vdmUgZnVuY3Rpb24gcmtfbmZjX3JlYWRfYnl0ZSBhbmQgcmtfbmZjX3dyaXRlX2J5dGUuCj4g LSBEb24ndCBzZWxlY3QgdGhlIGRpZSBpZiAnY2hlY2tfb25seSA9PSB0cnVlJyBpbiBmdW5jdGlv biBya19uZmNfZXhlY19vcC4KPiAtIE1vZGlmeSBmdW5jdGlvbiBya19uZmNfd3JpdGVfcGFnZSBh bmQgcmtfbmZjX3dyaXRlX3BhZ2VfcmF3Lgo+IAo+IENoYW5nZXMgaW4gdjg6IE5vbmUKPiBDaGFu Z2VzIGluIHY3Ogo+IC0gUmViYXNlIHRvIGxpbnV4LW5leHQuCj4gLSBGaXggY29kaW5nIHN0eWxl Lgo+IC0gUmVzZXJ2ZWQgNCBieXRlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvb2IgYXJlYS4K PiAtIFBhZ2UgcmF3IHJlYWQgYW5kIHdyaXRlIGluY2x1ZGVkIGVjYyBkYXRhLgo+IAo+IENoYW5n ZXMgaW4gdjY6Cj4gLSBUaGUgbXRkLT5uYW1lIHNldCBieSBOQU5EIGxhYmVsIHByb3BlcnR5Lgo+ IC0gQWRkIHNvbWUgY29tbWVudHMuCj4gLSBGaXggY29tcGlsZSBlcnJvci4KPiAKPiBDaGFuZ2Vz IGluIHY1Ogo+IC0gQWRkIGJvb3QgYmxvY2tzIHN1cHBvcnQgIHdpdGggZGlmZmVyZW50IEVDQyBm b3IgYm9vdFJPTS4KPiAtIFJlbmFtZSByb2NrY2hpcC1uYW5kLmMgdG8gcm9ja2NoaXAtbmFuZC1j b250cm9sbGVyLmMuCj4gLSBVbmlmaWNhdGlvbiBvZiBvdGhlciB2YXJpYWJsZSBuYW1lcy4KPiAt IFJlbW92ZSBzb21lIGNvbXBhdGlibGUgZGVmaW5lLgo+IAo+IENoYW5nZXMgaW4gdjQ6Cj4gLSBE ZWZpbmUgcGxhdGZvcm0gZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSByZWdpc3RlciBvZmZzZXRzLgo+ IC0gVGhlIGNvbXBhdGlibGUgZGVmaW5lIHdpdGggcmt4eF9uZmMuCj4gLSBVc2UgU0VUX1NZU1RF TV9TTEVFUF9QTV9PUFMgdG8gZGVmaW5lIFBNX09QUy4KPiAtIFVzZSBleGVjX29wIGluc3RlYWQg b2YgbGVnYWN5IGhvb2tzLgo+IAo+IENoYW5nZXMgaW4gdjM6IE5vbmUKPiBDaGFuZ2VzIGluIHYy Ogo+IC0gRml4IGNvbXBpbGUgZXJyb3IuCj4gLSBJbmNsdWRlIGhlYWRlciBmaWxlcyBzb3J0ZWQg YnkgZmlsZSBuYW1lLgo+IAo+ICBkcml2ZXJzL210ZC9uYW5kL3Jhdy9LY29uZmlnICAgICAgICAg ICAgICAgICAgfCAgIDEyICsKPiAgZHJpdmVycy9tdGQvbmFuZC9yYXcvTWFrZWZpbGUgICAgICAg ICAgICAgICAgIHwgICAgMSArCj4gIC4uLi9tdGQvbmFuZC9yYXcvcm9ja2NoaXAtbmFuZC1jb250 cm9sbGVyLmMgICB8IDE0NjAgKysrKysrKysrKysrKysrKysKPiAgMyBmaWxlcyBjaGFuZ2VkLCAx NDczIGluc2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbXRkL25hbmQv cmF3L3JvY2tjaGlwLW5hbmQtY29udHJvbGxlci5jCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv bXRkL25hbmQvcmF3L0tjb25maWcgYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9LY29uZmlnCj4gaW5k ZXggNmM0NmYyNWI1N2UyLi4yY2M1MzNlNGUyMzkgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tdGQv bmFuZC9yYXcvS2NvbmZpZwo+ICsrKyBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L0tjb25maWcKPiBA QCAtNDYyLDYgKzQ2MiwxOCBAQCBjb25maWcgTVREX05BTkRfQVJBU0FOCj4gIAkgIEVuYWJsZXMg dGhlIGRyaXZlciBmb3IgdGhlIEFyYXNhbiBOQU5EIGZsYXNoIGNvbnRyb2xsZXIgb24KPiAgCSAg WnlucSBVbHRyYXNjYWxlKyBNUFNvQy4KPiAgCj4gK2NvbmZpZyBNVERfTkFORF9ST0NLQ0hJUAo+ ICsJdHJpc3RhdGUgIlJvY2tjaGlwIE5BTkQgY29udHJvbGxlciIKPiArCWRlcGVuZHMgb24gQVJD SF9ST0NLQ0hJUCAmJiBIQVNfSU9NRU0KPiArCWhlbHAKPiArCSAgRW5hYmxlcyBzdXBwb3J0IGZv ciBOQU5EIGNvbnRyb2xsZXIgb24gUm9ja2NoaXAgU29Dcy4KPiArCSAgVGhlcmUgYXJlIGZvdXIg ZGlmZmVyZW50IHZlcnNpb25zIG9mIE5BTkQgRkxBU0ggQ29udHJvbGxlcnMsCj4gKwkgIGluY2x1 ZGluZzoKPiArCSAgICBORkMgdjYwMDogUksyOTI4LCBSSzMwNjYsIFJLMzE4OAo+ICsJICAgIE5G QyB2NjIyOiBSSzMwMzYsIFJLMzEyOAo+ICsJICAgIE5GQyB2ODAwOiBSSzMzMDgsIFJWMTEwOAo+ ICsJICAgIE5GQyB2OTAwOiBQWDMwLCBSSzMzMjYKPiArCj4gIGNvbW1lbnQgIk1pc2MiCj4gIAo+ ICBjb25maWcgTVREX1NNX0NPTU1PTgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3Jh dy9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L01ha2VmaWxlCj4gaW5kZXggMjkzMGY1 YjkwMTVkLi45NjBjOWJlMjUyMDQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9yYXcv TWFrZWZpbGUKPiArKysgYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9NYWtlZmlsZQo+IEBAIC01OCw2 ICs1OCw3IEBAIG9iai0kKENPTkZJR19NVERfTkFORF9TVE0zMl9GTUMyKQkrPSBzdG0zMl9mbWMy X25hbmQubwo+ICBvYmotJChDT05GSUdfTVREX05BTkRfTUVTT04pCQkrPSBtZXNvbl9uYW5kLm8K PiAgb2JqLSQoQ09ORklHX01URF9OQU5EX0NBREVOQ0UpCQkrPSBjYWRlbmNlLW5hbmQtY29udHJv bGxlci5vCj4gIG9iai0kKENPTkZJR19NVERfTkFORF9BUkFTQU4pCQkrPSBhcmFzYW4tbmFuZC1j b250cm9sbGVyLm8KPiArb2JqLSQoQ09ORklHX01URF9OQU5EX1JPQ0tDSElQKQkJKz0gcm9ja2No aXAtbmFuZC1jb250cm9sbGVyLm8KPiAgCj4gIG5hbmQtb2JqcyA6PSBuYW5kX2Jhc2UubyBuYW5k X2xlZ2FjeS5vIG5hbmRfYmJ0Lm8gbmFuZF90aW1pbmdzLm8gbmFuZF9pZHMubwo+ICBuYW5kLW9i anMgKz0gbmFuZF9vbmZpLm8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9yYXcvcm9j a2NoaXAtbmFuZC1jb250cm9sbGVyLmMgYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9yb2NrY2hpcC1u YW5kLWNvbnRyb2xsZXIuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAw MDAwLi4yZTk2ZmQzMTQzNDYKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9tdGQvbmFu ZC9yYXcvcm9ja2NoaXAtbmFuZC1jb250cm9sbGVyLmMKPiBAQCAtMCwwICsxLDE0NjAgQEAKPiAr Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgT1IgTUlUCj4gKy8qCj4gKyAqIFJv Y2tjaGlwIE5BTkQgRmxhc2ggY29udHJvbGxlciBkcml2ZXIuCj4gKyAqIENvcHlyaWdodCAoQykg MjAyMCBSb2NrY2hpcCBJbmMuCj4gKyAqIEF1dGhvcjogWWlmZW5nIFpoYW8gPHlpZmVuZy56aGFv QHJvY2stY2hpcHMuY29tPgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KPiAr I2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5o Pgo+ICsjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9pbnRl cnJ1cHQuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgo+ICsjaW5jbHVkZSA8bGludXgv bW9kdWxlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Cj4gKyNpbmNsdWRlIDxsaW51 eC9tdGQvcmF3bmFuZC5oPgo+ICsjaW5jbHVkZSA8bGludXgvb2YuaD4KPiArI2luY2x1ZGUgPGxp bnV4L29mX2RldmljZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4g KyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4gKwo+ICsvKgo+ICsgKiBORkMgUGFnZSBEYXRhIExh eW91dDoKPiArICoJMTAyNCBCeXRlcyBEYXRhICsgNEJ5dGVzIHN5cyBkYXRhICsgMjhCeXRlc34x MjRCeXRlcyBlY2MgKwo+ICsgKgkxMDI0IEJ5dGVzIERhdGEgKyA0Qnl0ZXMgc3lzIGRhdGEgKyAy OEJ5dGVzfjEyNEJ5dGVzIGVjYyArCj4gKyAqCS4uLi4uLgo+ICsgKiBOQU5EIFBhZ2UgRGF0YSBM YXlvdXQ6Cj4gKyAqCTEwMjQgKiBuIERhdGEgKyBtIEJ5dGVzIG9vYgo+ICsgKiBPcmlnaW5hbCBC YWQgQmxvY2sgTWFzayBMb2NhdGlvbjoKPiArICoJRmlyc3QgYnl0ZSBvZiBvb2Ioc3BhcmUpLgo+ ICsgKiBuYW5kX2NoaXAtPm9vYl9wb2kgZGF0YSBsYXlvdXQ6Cj4gKyAqCTRCeXRlcyBzeXMgZGF0 YSArIC4uLi4gKyA0Qnl0ZXMgc3lzIGRhdGEgKyBlY2MgZGF0YS4KPiArICovCj4gKwo+ICsvKiBO QU5EIGNvbnRyb2xsZXIgcmVnaXN0ZXIgZGVmaW5pdGlvbiAqLwo+ICsjZGVmaW5lIE5GQ19SRUFE CQkJKDApCj4gKyNkZWZpbmUgTkZDX1dSSVRFCQkJKDEpCj4gKwo+ICsjZGVmaW5lIE5GQ19GTUNU TAkJCSgweDAwKQo+ICsjZGVmaW5lICAgRk1DVExfQ0VfU0VMX00JCTB4RkYKPiArI2RlZmluZSAg IEZNQ1RMX0NFX1NFTCh4KQkJKDEgPDwgKHgpKQo+ICsjZGVmaW5lICAgRk1DVExfV1AJCQlCSVQo OCkKPiArI2RlZmluZSAgIEZNQ1RMX1JEWQkJCUJJVCg5KQo+ICsKPiArI2RlZmluZSBORkNfRk1X QUlUCQkJKDB4MDQpCj4gKyNkZWZpbmUgICBGTENUTF9SU1QJCQlCSVQoMCkKPiArI2RlZmluZSAg IEZMQ1RMX1dSCQkJKDEpCS8qIDA6IHJlYWQsIDE6IHdyaXRlICovCj4gKyNkZWZpbmUgICBGTENU TF9YRkVSX1NUCQkJQklUKDIpCj4gKyNkZWZpbmUgICBGTENUTF9YRkVSX0VOCQkJQklUKDMpCj4g KyNkZWZpbmUgICBGTENUTF9BQ09SUkVDVAkJQklUKDEwKSAvKiBBdXRvIGNvcnJlY3QgZXJyb3Ig Yml0cy4gKi8KPiArI2RlZmluZSAgIEZMQ1RMX1hGRVJfUkVBRFkJCUJJVCgyMCkKPiArI2RlZmlu ZSAgIEZMQ1RMX1hGRVJfU0VDVE9SCQkoMjIpCj4gKyNkZWZpbmUgICBGTENUTF9UT0dfRklYCQkJ QklUKDI5KQo+ICsKPiArI2RlZmluZSAgIEJDSENUTF9CQU5LX00JCQkoNyA8PCA1KQo+ICsjZGVm aW5lICAgQkNIQ1RMX0JBTksJCQkoNSkKPiArCj4gKyNkZWZpbmUgICBETUFfU1QJCQlCSVQoMCkK PiArI2RlZmluZSAgIERNQV9XUgkJCSgxKQkvKiAwOiB3cml0ZSwgMTogcmVhZCAqLwo+ICsjZGVm aW5lICAgRE1BX0VOCQkJQklUKDIpCj4gKyNkZWZpbmUgICBETUFfQUhCX1NJWkUJCQkoMykJLyog MDogMSwgMTogMiwgMjogNCAqLwo+ICsjZGVmaW5lICAgRE1BX0JVUlNUX1NJWkUJCSg2KQkvKiAw OiAxLCAzOiA0LCA1OiA4LCA3OiAxNiAqLwo+ICsjZGVmaW5lICAgRE1BX0lOQ19OVU0JCQkoOSkJ LyogMSAtIDE2ICovCj4gKwo+ICsjZGVmaW5lIEVDQ19FUlJfQ05UKHgsIGUpICgoKCh4KSA+PiAo ZSkubG93KSAmIChlKS5sb3dfbWFzaykgfFwKPiArCSAgKCgoeCkgPj4gKGUpLmhpZ2gpICYgKGUp LmhpZ2hfbWFzaykgPDwgKGUpLmxvd19ibikKPiArI2RlZmluZSAgIElOVF9ETUEJCQlCSVQoMCkK PiArI2RlZmluZSBORkNfQkFOSwkJCSgweDgwMCkKPiArI2RlZmluZSBORkNfQkFOS19TVEVQCQkJ KDB4MTAwKQo+ICsjZGVmaW5lICAgQkFOS19EQVRBCQkJKDB4MDApCj4gKyNkZWZpbmUgICBCQU5L X0FERFIJCQkoMHgwNCkKPiArI2RlZmluZSAgIEJBTktfQ01ECQkJKDB4MDgpCj4gKyNkZWZpbmUg TkZDX1NSQU0wCQkJKDB4MTAwMCkKPiArI2RlZmluZSBORkNfU1JBTTEJCQkoMHgxNDAwKQo+ICsj ZGVmaW5lIE5GQ19TUkFNX1NJWkUJCQkoMHg0MDApCj4gKyNkZWZpbmUgTkZDX1RJTUVPVVQJCQko NTAwMDAwKQo+ICsjZGVmaW5lIE5GQ19NQVhfT09CX1BFUl9TVEVQCQkxMjgKPiArI2RlZmluZSBO RkNfTUlOX09PQl9QRVJfU1RFUAkJNjQKPiArI2RlZmluZSBNQVhfREFUQV9TSVpFCQkJMHhGRkZD Cj4gKyNkZWZpbmUgTUFYX0FERFJFU1NfQ1lDCQkJNgo+ICsjZGVmaW5lIE5GQ19FQ0NfTUFYX01P REVTCQk0Cj4gKyNkZWZpbmUgTkZDX01BWF9OU0VMUwkJCSg4KSAvKiBTb21lIFNvY3Mgb25seSBo YXZlIDEgb3IgMiBDU3MuICovCj4gKyNkZWZpbmUgTkZDX1NZU19EQVRBX1NJWkUJCSg0KSAvKiA0 IGJ5dGVzIHN5cyBkYXRhIGluIG9vYiBwcmUgMTAyNCBkYXRhLiovCj4gKyNkZWZpbmUgUktfREVG QVVMVF9DTE9DS19SQVRFCQkoMTUwICogMTAwMCAqIDEwMDApIC8qIDE1MCBNaHogKi8KPiArI2Rl ZmluZSBBQ0NUSU1JTkcoY3NydywgcndwdywgcndjcykJKChjc3J3KSA8PCAxMiB8IChyd3B3KSA8 PCA1IHwgKHJ3Y3MpKQo+ICsKPiArZW51bSBuZmNfdHlwZSB7Cj4gKwlORkNfVjYsCj4gKwlORkNf VjgsCj4gKwlORkNfVjksCj4gK307Cj4gKwo+ICsvKioKPiArICogc3RydWN0IHJrX2VjY19jbnRf c3RhdHVzOiByZXByZXNlbnQgYSBlY2Mgc3RhdHVzIGRhdGEuCj4gKyAqIEBlcnJfZmxhZ19iaXQ6 IGVycm9yIGZsYWcgYml0IGluZGV4IGF0IHJlZ2lzdGVyLgo+ICsgKiBAbG93OiBlY2MgY291bnQg bG93IGJpdCBpbmRleCBhdCByZWdpc3Rlci4KPiArICogQGxvd19tYXNrOiBtYXNrIGJpdC4KPiAr ICogQGxvd19ibjogZWNjIGNvdW50IGxvdyBiaXQgbnVtYmVyLgo+ICsgKiBAaGlnaDogZWNjIGNv dW50IGhpZ2ggYml0IGluZGV4IGF0IHJlZ2lzdGVyLgo+ICsgKiBAaGlnaF9tYXNrOiBtYXNrIGJp dAo+ICsgKi8KPiArc3RydWN0IGVjY19jbnRfc3RhdHVzIHsKPiArCXU4IGVycl9mbGFnX2JpdDsK PiArCXU4IGxvdzsKPiArCXU4IGxvd19tYXNrOwo+ICsJdTggbG93X2JuOwo+ICsJdTggaGlnaDsK PiArCXU4IGhpZ2hfbWFzazsKPiArfTsKPiArCj4gKy8qCj4gKyAqIEB0eXBlOiBuZmMgdmVyc2lv bgo+ICsgKiBAZWNjX3N0cmVuZ3RoczogZWNjIHN0cmVuZ3Rocwo+ICsgKiBAZWNjX2NmZ3M6IGVj YyBjb25maWcgdmFsdWVzCj4gKyAqIEBmbGN0bF9vZmY6IEZMQ1RMIHJlZ2lzdGVyIG9mZnNldAo+ ICsgKiBAYmNoY3RsX29mZjogQkNIQ1RMIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAZG1hX2RhdGFf YnVmX29mZjogRE1BX0RBVEFfQlVGIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAZG1hX29vYl9idWZf b2ZmOiBETUFfT09CX0JVRiByZWdpc3RlciBvZmZzZXQKPiArICogQGRtYV9jZmdfb2ZmOiBETUFf Q0ZHIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAZG1hX3N0X29mZjogRE1BX1NUIHJlZ2lzdGVyIG9m ZnNldAo+ICsgKiBAYmNoX3N0X29mZjogQkNHX1NUIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAcmFu ZG16X29mZjogUkFORE1aIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAaW50X2VuX29mZjogaW50ZXJy dXB0IGVuYWJsZSByZWdpc3RlciBvZmZzZXQKPiArICogQGludF9jbHJfb2ZmOiBpbnRlcnJ1cHQg Y2xlYW4gcmVnaXN0ZXIgb2Zmc2V0Cj4gKyAqIEBpbnRfc3Rfb2ZmOiBpbnRlcnJ1cHQgc3RhdHVz IHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAb29iMF9vZmY6IG9vYjAgcmVnaXN0ZXIgb2Zmc2V0Cj4g KyAqIEBvb2IxX29mZjogb29iMSByZWdpc3RlciBvZmZzZXQKPiArICogQGVjYzA6IHJlcHJlc2Vu dCBFQ0MwIHN0YXR1cyBkYXRhCj4gKyAqIEBlY2MxOiByZXByZXNlbnQgRUNDMSBzdGF0dXMgZGF0 YQo+ICsgKi8KPiArc3RydWN0IG5mY19jZmcgewo+ICsJZW51bSBuZmNfdHlwZSB0eXBlOwo+ICsJ dTggZWNjX3N0cmVuZ3Roc1tORkNfRUNDX01BWF9NT0RFU107Cj4gKwl1MzIgZWNjX2NmZ3NbTkZD X0VDQ19NQVhfTU9ERVNdOwo+ICsJdTMyIGZsY3RsX29mZjsKPiArCXUzMiBiY2hjdGxfb2ZmOwo+ ICsJdTMyIGRtYV9jZmdfb2ZmOwo+ICsJdTMyIGRtYV9kYXRhX2J1Zl9vZmY7Cj4gKwl1MzIgZG1h X29vYl9idWZfb2ZmOwo+ICsJdTMyIGRtYV9zdF9vZmY7Cj4gKwl1MzIgYmNoX3N0X29mZjsKPiAr CXUzMiByYW5kbXpfb2ZmOwo+ICsJdTMyIGludF9lbl9vZmY7Cj4gKwl1MzIgaW50X2Nscl9vZmY7 Cj4gKwl1MzIgaW50X3N0X29mZjsKPiArCXUzMiBvb2IwX29mZjsKPiArCXUzMiBvb2IxX29mZjsK PiArCXN0cnVjdCBlY2NfY250X3N0YXR1cyBlY2MwOwo+ICsJc3RydWN0IGVjY19jbnRfc3RhdHVz IGVjYzE7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCB7Cj4gKwlzdHJ1Y3Qg bGlzdF9oZWFkIG5vZGU7Cj4gKwlzdHJ1Y3QgbmFuZF9jaGlwIGNoaXA7Cj4gKwo+ICsJdTE2IHNw YXJlX3Blcl9zZWN0b3I7Cj4gKwl1MTYgb29iX2J1Zl9wZXJfc2VjdG9yOwo+ICsJdTE2IGJvb3Rf YmxrczsKPiArCXUxNiBib290X2VjYzsKPiArCXUxNiBtZXRhZGF0YV9zaXplOwo+ICsKPiArCXU4 IG5zZWxzOwo+ICsJdTggc2Vsc1swXTsKPiArCS8qIE5vdGhpbmcgYWZ0ZXIgdGhpcyBmaWVsZC4g Ki8KPiArfTsKPiArCj4gK3N0cnVjdCBya19uZmMgewo+ICsJc3RydWN0IG5hbmRfY29udHJvbGxl ciBjb250cm9sbGVyOwo+ICsJY29uc3Qgc3RydWN0IG5mY19jZmcgKmNmZzsKPiArCXN0cnVjdCBk ZXZpY2UgKmRldjsKPiArCj4gKwlzdHJ1Y3QgY2xrICpuZmNfY2xrOwo+ICsJc3RydWN0IGNsayAq YWhiX2NsazsKPiArCXZvaWQgX19pb21lbSAqcmVnczsKPiArCj4gKwl1MzIgc2VsZWN0ZWRfYmFu azsKPiArCXUzMiBiYW5kX29mZnNldDsKPiArCXUzMiBjdXJfY2xrOwo+ICsKPiArCXN0cnVjdCBj b21wbGV0aW9uIGRvbmU7Cj4gKwlzdHJ1Y3QgbGlzdF9oZWFkIGNoaXBzOwo+ICsKPiArCXU4ICpi dWZmZXI7Cj4gKwl1OCAqcGFnZV9idWY7Cj4gKwl1MzIgKm9vYl9idWY7Cj4gKwl1MzIgYnVmZmVy X3NpemU7Cj4gKwl1MzIgb29iX2J1Zl9zaXplOwo+ICsKPiArCXVuc2lnbmVkIGxvbmcgYXNzaWdu ZWRfY3M7Cj4gK307Cj4gKwo+ICtzdGF0aWMgaW5saW5lIHN0cnVjdCBya19uZmNfbmFuZF9jaGlw ICpya19uZmNfdG9fcmtuYW5kKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXApCj4gK3sKPiArCXJldHVy biBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IHJrX25mY19uYW5kX2NoaXAsIGNoaXApOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW5saW5lIHU4ICpya19uZmNfYnVmX3RvX2RhdGFfcHRyKHN0cnVjdCBu YW5kX2NoaXAgKmNoaXAsIGNvbnN0IHU4ICpwLCBpbnQgaSkKPiArewo+ICsJcmV0dXJuICh1OCAq KXAgKyBpICogY2hpcC0+ZWNjLnNpemU7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdTggKnJr X25mY19idWZfdG9fb29iX3B0cihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgaSkKPiArewo+ ICsJdTggKnBvaTsKPiArCj4gKwlwb2kgPSBjaGlwLT5vb2JfcG9pICsgaSAqIE5GQ19TWVNfREFU QV9TSVpFOwo+ICsKPiArCXJldHVybiBwb2k7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdTgg KnJrX25mY19idWZfdG9fb29iX2VjY19wdHIoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgaW50IGkp Cj4gK3sKPiArCXN0cnVjdCBya19uZmNfbmFuZF9jaGlwICpya25hbmQgPSBya19uZmNfdG9fcmtu YW5kKGNoaXApOwo+ICsJdTggKnBvaTsKPiArCj4gKwlwb2kgPSBjaGlwLT5vb2JfcG9pICsgcmtu YW5kLT5tZXRhZGF0YV9zaXplICsKPiArCSAgICAgIGNoaXAtPmVjYy5ieXRlcyAqIGk7Cj4gKwo+ ICsJcmV0dXJuIHBvaTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSBpbnQgcmtfbmZjX2RhdGFf bGVuKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXApCj4gK3sKPiArCXN0cnVjdCBya19uZmNfbmFuZF9j aGlwICpya25hbmQgPSBya19uZmNfdG9fcmtuYW5kKGNoaXApOwo+ICsKPiArCXJldHVybiBjaGlw LT5lY2Muc2l6ZSArIHJrbmFuZC0+c3BhcmVfcGVyX3NlY3RvcjsKPiArfQo+ICsKPiArc3RhdGlj IGlubGluZSB1OCAqcmtfbmZjX2RhdGFfcHRyKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsICBpbnQg aSkKPiArewo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRh KGNoaXApOwo+ICsKPiArCXJldHVybiBuZmMtPmJ1ZmZlciArIGkgKiBya19uZmNfZGF0YV9sZW4o Y2hpcCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdTggKnJrX25mY19vb2JfcHRyKHN0cnVj dCBuYW5kX2NoaXAgKmNoaXAsIGludCBpKQo+ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBu YW5kX2dldF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4gKwo+ICsJcmV0dXJuIG5mYy0+YnVmZmVy ICsgaSAqIHJrX25mY19kYXRhX2xlbihjaGlwKSArIGNoaXAtPmVjYy5zaXplOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgdm9pZCBya19uZmNfc2VsZWN0X2NoaXAoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwg aW50IGNzKQo+ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dldF9jb250cm9sbGVy X2RhdGEoY2hpcCk7Cj4gKwlzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCAqcmtuYW5kID0gcmtfbmZj X3RvX3JrbmFuZChjaGlwKTsKPiArCXUzMiB2YWw7Cj4gKwo+ICsJaWYgKGNzIDwgMCkgewo+ICsJ CW5mYy0+c2VsZWN0ZWRfYmFuayA9IC0xOwo+ICsJCS8qIERlc2VsZWN0IHRoZSBjdXJyZW50bHkg c2VsZWN0ZWQgdGFyZ2V0LiAqLwo+ICsJCXZhbCA9IHJlYWRsX3JlbGF4ZWQobmZjLT5yZWdzICsg TkZDX0ZNQ1RMKTsKPiArCQl2YWwgJj0gfkZNQ1RMX0NFX1NFTF9NOwo+ICsJCXdyaXRlbCh2YWws IG5mYy0+cmVncyArIE5GQ19GTUNUTCk7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsKPiArCW5mYy0+ c2VsZWN0ZWRfYmFuayA9IHJrbmFuZC0+c2Vsc1tjc107Cj4gKwluZmMtPmJhbmRfb2Zmc2V0ID0g TkZDX0JBTksgKyBuZmMtPnNlbGVjdGVkX2JhbmsgKiBORkNfQkFOS19TVEVQOwo+ICsKPiArCXZh bCA9IHJlYWRsX3JlbGF4ZWQobmZjLT5yZWdzICsgTkZDX0ZNQ1RMKTsKPiArCXZhbCAmPSB+Rk1D VExfQ0VfU0VMX007Cj4gKwl2YWwgfD0gRk1DVExfQ0VfU0VMKG5mYy0+c2VsZWN0ZWRfYmFuayk7 Cj4gKwo+ICsJd3JpdGVsKHZhbCwgbmZjLT5yZWdzICsgTkZDX0ZNQ1RMKTsKPiArfQo+ICsKPiAr c3RhdGljIGlubGluZSBpbnQgcmtfbmZjX3dhaXRfaW9yZWFkeShzdHJ1Y3QgcmtfbmZjICpuZmMp Cj4gK3sKPiArCWludCByYzsKPiArCXUzMiB2YWw7Cj4gKwo+ICsJcmMgPSByZWFkbF9yZWxheGVk X3BvbGxfdGltZW91dChuZmMtPnJlZ3MgKyBORkNfRk1DVEwsIHZhbCwKPiArCQkJCQl2YWwgJiBG TUNUTF9SRFksIDEwLCBORkNfVElNRU9VVCk7Cj4gKwo+ICsJcmV0dXJuIHJjOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgdm9pZCBya19uZmNfcmVhZF9idWYoc3RydWN0IHJrX25mYyAqbmZjLCB1OCAqYnVm LCBpbnQgbGVuKQo+ICt7Cj4gKwlpbnQgaTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBp KyspCj4gKwkJYnVmW2ldID0gcmVhZGJfcmVsYXhlZChuZmMtPnJlZ3MgKyBuZmMtPmJhbmRfb2Zm c2V0ICsKPiArCQkJCSAgICAgICBCQU5LX0RBVEEpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBy a19uZmNfd3JpdGVfYnVmKHN0cnVjdCBya19uZmMgKm5mYywgY29uc3QgdTggKmJ1ZiwgaW50IGxl bikKPiArewo+ICsJaW50IGk7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQo+ICsJ CXdyaXRlYihidWZbaV0sIG5mYy0+cmVncyArIG5mYy0+YmFuZF9vZmZzZXQgKyBCQU5LX0RBVEEp Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19jbWQoc3RydWN0IG5hbmRfY2hpcCAqY2hp cCwKPiArCQkgICAgICBjb25zdCBzdHJ1Y3QgbmFuZF9zdWJvcCAqc3Vib3ApCj4gK3sKPiArCXN0 cnVjdCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsKPiArCXVu c2lnbmVkIGludCBpLCBqLCByZW1haW5pbmcsIHN0YXJ0Owo+ICsJaW50IHJlZ19vZmZzZXQgPSBu ZmMtPmJhbmRfb2Zmc2V0Owo+ICsJdTggKmluYnVmID0gTlVMTDsKPiArCWNvbnN0IHU4ICpvdXRi dWY7Cj4gKwl1MzIgY250ID0gMDsKPiArCWludCByZXQgPSAwOwo+ICsKPiArCWZvciAoaSA9IDA7 IGkgPCBzdWJvcC0+bmluc3RyczsgaSsrKSB7Cj4gKwkJY29uc3Qgc3RydWN0IG5hbmRfb3BfaW5z dHIgKmluc3RyID0gJnN1Ym9wLT5pbnN0cnNbaV07Cj4gKwo+ICsJCXN3aXRjaCAoaW5zdHItPnR5 cGUpIHsKPiArCQljYXNlIE5BTkRfT1BfQ01EX0lOU1RSOgo+ICsJCQl3cml0ZWIoaW5zdHItPmN0 eC5jbWQub3Bjb2RlLAo+ICsJCQkgICAgICAgbmZjLT5yZWdzICsgcmVnX29mZnNldCArIEJBTktf Q01EKTsKPiArCQkJYnJlYWs7Cj4gKwo+ICsJCWNhc2UgTkFORF9PUF9BRERSX0lOU1RSOgo+ICsJ CQlyZW1haW5pbmcgPSBuYW5kX3N1Ym9wX2dldF9udW1fYWRkcl9jeWMoc3Vib3AsIGkpOwo+ICsJ CQlzdGFydCA9IG5hbmRfc3Vib3BfZ2V0X2FkZHJfc3RhcnRfb2ZmKHN1Ym9wLCBpKTsKPiArCj4g KwkJCWZvciAoaiA9IDA7IGogPCA4ICYmIGogKyBzdGFydCA8IHJlbWFpbmluZzsgaisrKQo+ICsJ CQkJd3JpdGViKGluc3RyLT5jdHguYWRkci5hZGRyc1tqICsgc3RhcnRdLAo+ICsJCQkJICAgICAg IG5mYy0+cmVncyArIHJlZ19vZmZzZXQgKyBCQU5LX0FERFIpOwo+ICsJCQlicmVhazsKPiArCj4g KwkJY2FzZSBOQU5EX09QX0RBVEFfSU5fSU5TVFI6Cj4gKwkJY2FzZSBOQU5EX09QX0RBVEFfT1VU X0lOU1RSOgo+ICsJCQlzdGFydCA9IG5hbmRfc3Vib3BfZ2V0X2RhdGFfc3RhcnRfb2ZmKHN1Ym9w LCBpKTsKPiArCQkJY250ID0gbmFuZF9zdWJvcF9nZXRfZGF0YV9sZW4oc3Vib3AsIGkpOwo+ICsK PiArCQkJaWYgKGluc3RyLT50eXBlID09IE5BTkRfT1BfREFUQV9PVVRfSU5TVFIpIHsKPiArCQkJ CW91dGJ1ZiA9IGluc3RyLT5jdHguZGF0YS5idWYub3V0ICsgc3RhcnQ7Cj4gKwkJCQlya19uZmNf d3JpdGVfYnVmKG5mYywgb3V0YnVmLCBjbnQpOwo+ICsJCQl9IGVsc2Ugewo+ICsJCQkJaW5idWYg PSBpbnN0ci0+Y3R4LmRhdGEuYnVmLmluICsgc3RhcnQ7Cj4gKwkJCQlya19uZmNfcmVhZF9idWYo bmZjLCBpbmJ1ZiwgY250KTsKPiArCQkJfQo+ICsJCQlicmVhazsKPiArCj4gKwkJY2FzZSBOQU5E X09QX1dBSVRSRFlfSU5TVFI6Cj4gKwkJCWlmIChya19uZmNfd2FpdF9pb3JlYWR5KG5mYykgPCAw KSB7Cj4gKwkJCQlyZXQgPSAtRVRJTUVET1VUOwo+ICsJCQkJZGV2X2VycihuZmMtPmRldiwgIklP IG5vdCByZWFkeVxuIik7Cj4gKwkJCX0KPiArCQkJYnJlYWs7Cj4gKwkJfQo+ICsJfQo+ICsKPiAr CXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmFuZF9vcF9wYXJz ZXIgcmtfbmZjX29wX3BhcnNlciA9IE5BTkRfT1BfUEFSU0VSKAo+ICsJTkFORF9PUF9QQVJTRVJf UEFUVEVSTigKPiArCQlya19uZmNfY21kLAo+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9DTURfRUxF TSh0cnVlKSwKPiArCQlOQU5EX09QX1BBUlNFUl9QQVRfQUREUl9FTEVNKHRydWUsIE1BWF9BRERS RVNTX0NZQyksCj4gKwkJTkFORF9PUF9QQVJTRVJfUEFUX0NNRF9FTEVNKHRydWUpLAo+ICsJCU5B TkRfT1BfUEFSU0VSX1BBVF9XQUlUUkRZX0VMRU0odHJ1ZSksCj4gKwkJTkFORF9PUF9QQVJTRVJf UEFUX0RBVEFfSU5fRUxFTSh0cnVlLCBNQVhfREFUQV9TSVpFKSksCj4gKwlOQU5EX09QX1BBUlNF Ul9QQVRURVJOKAo+ICsJCXJrX25mY19jbWQsCj4gKwkJTkFORF9PUF9QQVJTRVJfUEFUX0NNRF9F TEVNKHRydWUpLAo+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9BRERSX0VMRU0odHJ1ZSwgTUFYX0FE RFJFU1NfQ1lDKSwKPiArCQlOQU5EX09QX1BBUlNFUl9QQVRfREFUQV9PVVRfRUxFTSh0cnVlLCBN QVhfREFUQV9TSVpFKSwKPiArCQlOQU5EX09QX1BBUlNFUl9QQVRfQ01EX0VMRU0odHJ1ZSksCj4g KwkJTkFORF9PUF9QQVJTRVJfUEFUX1dBSVRSRFlfRUxFTSh0cnVlKSksCj4gKyk7Cj4gKwo+ICtz dGF0aWMgaW50IHJrX25mY19leGVjX29wKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCj4gKwkJCSAg Y29uc3Qgc3RydWN0IG5hbmRfb3BlcmF0aW9uICpvcCwKPiArCQkJICBib29sIGNoZWNrX29ubHkp Cj4gK3sKPiArCWlmICghY2hlY2tfb25seSkKPiArCQlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwg b3AtPmNzKTsKPiArCj4gKwlyZXR1cm4gbmFuZF9vcF9wYXJzZXJfZXhlY19vcChjaGlwLCAmcmtf bmZjX29wX3BhcnNlciwgb3AsCj4gKwkJCQkgICAgICBjaGVja19vbmx5KTsKPiArfQo+ICsKPiAr c3RhdGljIGludCBya19uZmNfc2V0dXBfZGF0YV9pbnRlcmZhY2Uoc3RydWN0IG5hbmRfY2hpcCAq Y2hpcCwgaW50IGNzbGluZSwKPiArCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmFuZF9pbnRlcmZh Y2VfY29uZmlnICpjb25mKQoKUGxlYXNlIGhhdmUgYSBsb29rIGF0IHRoZSByZWNlbnQgY2hhbmdl cyBpbiB0aGUgY29yZSwgdGhpcyBoZWxwZXIKc2hvdWxkIGJlIG5hbWVkICJzZXR1cF9pbnRlcmZh Y2UiLgoKPiArewo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9k YXRhKGNoaXApOwo+ICsJY29uc3Qgc3RydWN0IG5hbmRfc2RyX3RpbWluZ3MgKnRpbWluZ3M7Cj4g Kwl1MzIgcmF0ZSwgdGMycncsIHRyd3B3LCB0cncyYzsKPiArCXUzMiB0ZW1wOwo+ICsKPiArCWlm IChjc2xpbmUgPT0gTkFORF9EQVRBX0lGQUNFX0NIRUNLX09OTFkpCj4gKwkJcmV0dXJuIDA7Cj4g Kwo+ICsJdGltaW5ncyA9IG5hbmRfZ2V0X3Nkcl90aW1pbmdzKGNvbmYpOwo+ICsJaWYgKElTX0VS Uih0aW1pbmdzKSkKPiArCQlyZXR1cm4gLUVPUE5PVFNVUFA7Cj4gKwo+ICsJaWYgKElTX0VSUihu ZmMtPm5mY19jbGspKQo+ICsJCXJhdGUgPSBjbGtfZ2V0X3JhdGUobmZjLT5haGJfY2xrKTsKPiAr CWVsc2UKPiArCQlyYXRlID0gY2xrX2dldF9yYXRlKG5mYy0+bmZjX2Nsayk7Cj4gKwo+ICsJLyog VHVybiBjbG9jayByYXRlIGludG8ga0h6LiAqLwo+ICsJcmF0ZSAvPSAxMDAwOwo+ICsKPiArCXRj MnJ3ID0gMTsKPiArCXRydzJjID0gMTsKPiArCj4gKwl0cndwdyA9IG1heCh0aW1pbmdzLT50V0Nf bWluLCB0aW1pbmdzLT50UkNfbWluKSAvIDEwMDA7Cj4gKwl0cndwdyA9IERJVl9ST1VORF9VUCh0 cndwdyAqIHJhdGUsIDEwMDAwMDApOwo+ICsKPiArCXRlbXAgPSB0aW1pbmdzLT50UkVBX21heCAv IDEwMDA7Cj4gKwl0ZW1wID0gRElWX1JPVU5EX1VQKHRlbXAgKiByYXRlLCAxMDAwMDAwKTsKPiAr Cj4gKwlpZiAodHJ3cHcgPCB0ZW1wKQo+ICsJCXRyd3B3ID0gdGVtcDsKPiArCj4gKwkvKgo+ICsJ ICogQUNDT046IGFjY2VzcyB0aW1pbmcgY29udHJvbCByZWdpc3Rlcgo+ICsJICogLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICsJICogMzE6MTg6IHJlc2VydmVkCj4gKwkg KiAxNzoxMjogY3NydywgY2xvY2sgY3ljbGVzIGZyb20gdGhlIGZhbGxpbmcgZWRnZSBvZiBDU24g dG8gdGhlCj4gKwkgKiAgIGZhbGxpbmcgZWRnZSBvZiBSRG4gb3IgV1JuCj4gKwkgKiAxMToxMTog cmVzZXJ2ZWQKPiArCSAqIDEwOjA1OiByd3B3LCB0aGUgd2lkdGggb2YgUkRuIG9yIFdSbiBpbiBw cm9jZXNzb3IgY2xvY2sgY3ljbGVzCj4gKwkgKiAwNDowMDogcndjcywgY2xvY2sgY3ljbGVzIGZy b20gdGhlIHJpc2luZyBlZGdlIG9mIFJEbiBvciBXUm4gdG8gdGhlCj4gKwkgKiAgIHJpc2luZyBl ZGdlIG9mIENTbgo+ICsJICovCj4gKwl0ZW1wID0gQUNDVElNSU5HKHRjMnJ3LCB0cndwdywgdHJ3 MmMpOwo+ICsJd3JpdGVsKHRlbXAsIG5mYy0+cmVncyArIE5GQ19GTVdBSVQpOwoKWW91IHNob3Vs ZCBzYXZlIHRoZSBjaGlwJ3MgdGltaW5nIGNvbmZpZ3VyYXRpb24gaW5zdGVhZCBvZiB3cml0aW5n IGl0CmhlcmUsIGFuZCBzZXR0aW5nIHRoZSByZWdpc3RlciB2YWx1ZSBkdXJpbmcgY2hpcCBzZWxl Y3Rpb24uIFRoaXMgd2F5CnlvdSBtYXkgaGFuZGxlIHNldmVyYWwgY2hpcHMgd2l0aCBkaWZmZXJl bnQgdGltaW5nCmNvbnN0cmFpbnRzL2NvbmZpZ3VyYXRpb25zLgoKPiArCj4gKwlyZXR1cm4gMDsK PiArfQo+ICsKPiArc3RhdGljIGludCBya19uZmNfaHdfZWNjX3NldHVwKHN0cnVjdCBuYW5kX2No aXAgKmNoaXAsCj4gKwkJCSAgICAgICBzdHJ1Y3QgbmFuZF9lY2NfY3RybCAqZWNjLAo+ICsJCQkg ICAgICAgdWludDMyX3Qgc3RyZW5ndGgpCj4gK3sKPiArCXN0cnVjdCBya19uZmMgKm5mYyA9IG5h bmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsKPiArCXUzMiByZWcsIGk7Cj4gKwo+ICsJZm9y IChpID0gMDsgaSA8IE5GQ19FQ0NfTUFYX01PREVTOyBpKyspIHsKPiArCQlpZiAoZWNjLT5zdHJl bmd0aCA9PSBuZmMtPmNmZy0+ZWNjX3N0cmVuZ3Roc1tpXSkgewo+ICsJCQlyZWcgPSBuZmMtPmNm Zy0+ZWNjX2NmZ3NbaV07Cj4gKwkJCWJyZWFrOwo+ICsJCX0KPiArCX0KPiArCj4gKwlpZiAoaSA+ PSBORkNfRUNDX01BWF9NT0RFUykKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwl3cml0ZWwo cmVnLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+YmNoY3RsX29mZik7CgpTYW1lIGhlcmUsIGlmIHlv dSBoYW5kbGUgZGlmZmVyZW50IGNoaXBzLCB0aGV5IG1heSB1c2UgZGlmZmVyZW50IEVDQwpjb25m aWd1cmF0aW9ucywgdGhpcyBzaG91bGQgYmUgaGFuZGxlZC4KCj4gKwo+ICsJcmV0dXJuIDA7Cj4g K30KPiArCj4gK3N0YXRpYyB2b2lkIHJrX25mY194ZmVyX3N0YXJ0KHN0cnVjdCBya19uZmMgKm5m YywgdTggcncsIHU4IG5fS0IsCj4gKwkJCSAgICAgIGRtYV9hZGRyX3QgZG1hX2RhdGEsIGRtYV9h ZGRyX3QgZG1hX29vYikKPiArewo+ICsJdTMyIGRtYV9yZWcsIGZsX3JlZywgYmNoX3JlZzsKPiAr Cj4gKwlkbWFfcmVnID0gRE1BX1NUIHwgKCghcncpIDw8IERNQV9XUikgfCBETUFfRU4gfCAoMiA8 PCBETUFfQUhCX1NJWkUpIHwKPiArCSAgICAgICg3IDw8IERNQV9CVVJTVF9TSVpFKSB8ICgxNiA8 PCBETUFfSU5DX05VTSk7Cj4gKwo+ICsJZmxfcmVnID0gKHJ3IDw8IEZMQ1RMX1dSKSB8IEZMQ1RM X1hGRVJfRU4gfCBGTENUTF9BQ09SUkVDVCB8Cj4gKwkJIChuX0tCIDw8IEZMQ1RMX1hGRVJfU0VD VE9SKSB8IEZMQ1RMX1RPR19GSVg7Cj4gKwo+ICsJaWYgKG5mYy0+Y2ZnLT50eXBlID09IE5GQ19W NiB8fCBuZmMtPmNmZy0+dHlwZSA9PSBORkNfVjgpIHsKPiArCQliY2hfcmVnID0gcmVhZGxfcmVs YXhlZChuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+YmNoY3RsX29mZik7Cj4gKwkJYmNoX3JlZyA9IChi Y2hfcmVnICYgKH5CQ0hDVExfQkFOS19NKSkgfAo+ICsJCQkgIChuZmMtPnNlbGVjdGVkX2Jhbmsg PDwgQkNIQ1RMX0JBTkspOwo+ICsJCXdyaXRlbChiY2hfcmVnLCBuZmMtPnJlZ3MgKyBuZmMtPmNm Zy0+YmNoY3RsX29mZik7Cj4gKwl9Cj4gKwo+ICsJd3JpdGVsKGRtYV9yZWcsIG5mYy0+cmVncyAr IG5mYy0+Y2ZnLT5kbWFfY2ZnX29mZik7Cj4gKwl3cml0ZWwoKHUzMilkbWFfZGF0YSwgbmZjLT5y ZWdzICsgbmZjLT5jZmctPmRtYV9kYXRhX2J1Zl9vZmYpOwo+ICsJd3JpdGVsKCh1MzIpZG1hX29v YiwgbmZjLT5yZWdzICsgbmZjLT5jZmctPmRtYV9vb2JfYnVmX29mZik7Cj4gKwl3cml0ZWwoZmxf cmVnLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZmxjdGxfb2ZmKTsKPiArCWZsX3JlZyB8PSBGTENU TF9YRkVSX1NUOwo+ICsJd3JpdGVsKGZsX3JlZywgbmZjLT5yZWdzICsgbmZjLT5jZmctPmZsY3Rs X29mZik7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX3dhaXRfZm9yX3hmZXJfZG9uZShz dHJ1Y3QgcmtfbmZjICpuZmMpCj4gK3sKPiArCXZvaWQgX19pb21lbSAqcHRyOwo+ICsJaW50IHJl dCA9IDA7Cj4gKwl1MzIgcmVnOwo+ICsKPiArCXB0ciA9IG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5m bGN0bF9vZmY7Cj4gKwo+ICsJcmV0ID0gcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXQocHRyLCBy ZWcsCj4gKwkJCQkJIHJlZyAmIEZMQ1RMX1hGRVJfUkVBRFksCj4gKwkJCQkJIDEwLCBORkNfVElN RU9VVCk7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBya19uZmNf d3JpdGVfcGFnZV9yYXcoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgdTggKmJ1ZiwKPiAr CQkJCSBpbnQgb29iX29uLCBpbnQgcGFnZSkKPiArewo+ICsJc3RydWN0IG10ZF9pbmZvICptdGQg PSBuYW5kX3RvX210ZChjaGlwKTsKPiArCXN0cnVjdCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2Nv bnRyb2xsZXJfZGF0YShjaGlwKTsKPiArCXN0cnVjdCBuYW5kX2VjY19jdHJsICplY2MgPSAmY2hp cC0+ZWNjOwo+ICsJaW50IHJldCA9IDA7Cj4gKwl1MzIgaTsKPiArCj4gKwlpZiAoIWJ1ZikKPiAr CQltZW1zZXQobmZjLT5idWZmZXIsIDB4ZmYsIG10ZC0+d3JpdGVzaXplICsgbXRkLT5vb2JzaXpl KTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgZWNjLT5zdGVwczsgaSsrKSB7Cj4gKwkJLyogQ29w eSBkYXRhIHRvIG5mYyBidWZmZXIuICovCj4gKwkJaWYgKGJ1ZikKPiArCQkJbWVtY3B5KHJrX25m Y19kYXRhX3B0cihjaGlwLCBpKSwKPiArCQkJICAgICAgIHJrX25mY19idWZfdG9fZGF0YV9wdHIo Y2hpcCwgYnVmLCBpKSwKPiArCQkJICAgICAgIGVjYy0+c2l6ZSk7Cj4gKwkJLyoKPiArCQkgKiBU aGUgZmlyc3QgZm91ciBieXRlcyBvZiBPT0IgYXJlIHJlc2VydmVkIGZvciB0aGUKPiArCQkgKiBi b290IFJPTS4gSW4gc29tZSBkZWJ1Z2dpbmcgY2FzZXMsIHN1Y2ggYXMgd2l0aCBhCj4gKwkJICog cmVhZCwgZXJhc2UgYW5kIHdyaXRlIGJhY2sgdGVzdCB0aGVzZSA0IGJ5dGVzIHN0b3JlZAo+ICsJ CSAqIGluIE9PQiBhbHNvIG5lZWQgdG8gYmUgd3JpdHRlbiBiYWNrLgo+ICsJCSAqLwoKVGhlIGNv bnRyb2xsZXIgZHJpdmVyIHNob3VsZCBub3QgYXJiaXRyYXRlIHRoaXMuIElmIHlvdSBkb24ndCB3 YW50IHRvCmV4cG9zZSB0aGVzZSBieXRlcywgdGhleSBzaG91bGQgbm90IGFwcGVhciAiZnJlZSIg aW4gdGhlIE9PQiBsYXlvdXQsCmJ1dCBhIHJhdyBhY2Nlc3MgKm11c3QqIGJ1dCBhYmxlIHRvIGFk ZHJlc3MgdGhlIGVudGlyZSBwYWdlL29vYi4KCj4gKwkJaWYgKCFpKQo+ICsJCQltZW1jcHkocmtf bmZjX29vYl9wdHIoY2hpcCwgaSksCj4gKwkJCSAgICAgICBya19uZmNfYnVmX3RvX29vYl9wdHIo Y2hpcCwgZWNjLT5zdGVwcyAtIDEpLAo+ICsJCQkgICAgICAgTkZDX1NZU19EQVRBX1NJWkUpOwo+ ICsJCWVsc2UKPiArCQkJbWVtY3B5KHJrX25mY19vb2JfcHRyKGNoaXAsIGkpLAo+ICsJCQkgICAg ICAgcmtfbmZjX2J1Zl90b19vb2JfcHRyKGNoaXAsIGkgLSAxKSwKPiArCQkJICAgICAgIE5GQ19T WVNfREFUQV9TSVpFKTsKPiArCQkvKiBDb3B5IEVDQyBkYXRhIHRvIHRoZSBORkMgYnVmZmVyLiAq Lwo+ICsJCW1lbWNweShya19uZmNfb29iX3B0cihjaGlwLCBpKSArIE5GQ19TWVNfREFUQV9TSVpF LAo+ICsJCSAgICAgICBya19uZmNfYnVmX3RvX29vYl9lY2NfcHRyKGNoaXAsIGkpLAo+ICsJCSAg ICAgICBlY2MtPmJ5dGVzKTsKPiArCX0KPiArCj4gKwluYW5kX3Byb2dfcGFnZV9iZWdpbl9vcChj aGlwLCBwYWdlLCAwLCBOVUxMLCAwKTsKPiArCXJrX25mY193cml0ZV9idWYobmZjLCBidWYsIG10 ZC0+d3JpdGVzaXplICsgbXRkLT5vb2JzaXplKTsKPiArCXJldCA9IG5hbmRfcHJvZ19wYWdlX2Vu ZF9vcChjaGlwKTsKPiArCj4gKwkvKgo+ICsJICogRGVzZWxlY3QgdGhlIGN1cnJlbnRseSBzZWxl Y3RlZCB0YXJnZXQgYWZ0ZXIgdGhlIG9wcyBpcyBkb25lCj4gKwkgKiB0byByZWR1Y2UgdGhlIHBv d2VyIGNvbnN1bXB0aW9uLgo+ICsJICovCj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwgLTEp Owo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX3dyaXRl X29vYihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgcGFnZSkKPiArewo+ICsJcmV0dXJuIHJr X25mY193cml0ZV9wYWdlX3JhdyhjaGlwLCBOVUxMLCAxLCBwYWdlKTsKCk5vdCBzdXJlIHRoaXMg aXMgcmVsZXZhbnQuIFlvdSBzaG91bGQgbm90IGRvIHRoYXQsIEkgZ3Vlc3MgdGhlIGNvcmUKd2ls bCBhdXRvbWF0aWNhbGx5IHRha2UgY2FyZSBvZiBpdC4KCj4gK30KPiArCj4gK3N0YXRpYyBpbnQg cmtfbmZjX3dyaXRlX3BhZ2VfaHdlY2Moc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgdTgg KmJ1ZiwKPiArCQkJCSAgIGludCBvb2Jfb24sIGludCBwYWdlKQo+ICt7Cj4gKwlzdHJ1Y3QgbXRk X2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0g bmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsJc3RydWN0IHJrX25mY19uYW5kX2No aXAgKnJrbmFuZCA9IHJrX25mY190b19ya25hbmQoY2hpcCk7Cj4gKwlzdHJ1Y3QgbmFuZF9lY2Nf Y3RybCAqZWNjID0gJmNoaXAtPmVjYzsKPiArCWludCBvb2Jfc3RlcCA9IChlY2MtPmJ5dGVzID4g NjApID8gTkZDX01BWF9PT0JfUEVSX1NURVAgOgo+ICsJCQlORkNfTUlOX09PQl9QRVJfU1RFUDsK PiArCWludCBwYWdlc19wZXJfYmxrID0gbXRkLT5lcmFzZXNpemUgLyBtdGQtPndyaXRlc2l6ZTsK PiArCWludCByZXQgPSAwLCBpLCBib290X3JvbV9tb2RlID0gMDsKPiArCWRtYV9hZGRyX3QgZG1h X2RhdGEsIGRtYV9vb2I7Cj4gKwl1MzIgcmVnOwo+ICsJdTggKm9vYjsKPiArCj4gKwluYW5kX3By b2dfcGFnZV9iZWdpbl9vcChjaGlwLCBwYWdlLCAwLCBOVUxMLCAwKTsKPiArCj4gKwltZW1jcHko bmZjLT5wYWdlX2J1ZiwgYnVmLCBtdGQtPndyaXRlc2l6ZSk7Cj4gKwo+ICsJLyoKPiArCSAqIFRo ZSBmaXJzdCBibG9ja3MgKDQsIDggb3IgMTYgZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UpIGFyZSB1 c2VkCj4gKwkgKiBieSB0aGUgYm9vdCBST00gYW5kIHRoZSBmaXJzdCAzMiBiaXRzIG9mIE9PQiBu ZWVkIHRvIGxpbmsgdG8KPiArCSAqIHRoZSBuZXh0IHBhZ2UgYWRkcmVzcyBpbiB0aGUgc2FtZSBi bG9jay4gV2UgY2FuJ3QgZGlyZWN0bHkgY29weQo+ICsJICogT09CIGRhdGEgZnJvbSB0aGUgTVRE IGZyYW1ld29yaywgYmVjYXVzZSB0aGlzIHBhZ2UgYWRkcmVzcwo+ICsJICogY29uZmxpY3RzIGZv ciBleGFtcGxlIHdpdGggdGhlIGJhZCBibG9jayBtYXJrZXIgKEJCTSksCj4gKwkgKiBzbyB3ZSBz aGlmdCBhbGwgT09CIGRhdGEgaW5jbHVkaW5nIHRoZSBCQk0gd2l0aCA0IGJ5dGUgcG9zaXRpb25z Lgo+ICsJICogQXMgYSBjb25zZXF1ZW5jZSB0aGUgT09CIHNpemUgYXZhaWxhYmxlIHRvIHRoZSBN VEQgZnJhbWV3b3JrIGlzCj4gKwkgKiBhbHNvIHJlZHVjZWQgd2l0aCA0IGJ5dGVzLgo+ICsJICoK PiArCSAqICAgIFBBMCBQQTEgUEEyIFBBMyB8IEJCTSBPT0IxIE9PQjIgT09CMyB8IC4uLgo+ICsJ ICoKPiArCSAqIElmIGEgTkFORCBpcyBub3QgYSBib290IG1lZGl1bSBvciB0aGUgcGFnZSBpcyBu b3QgYSBib290IGJsb2NrLAo+ICsJICogdGhlIGZpcnN0IDQgYnl0ZXMgYXJlIGxlZnQgdW50b3Vj aGVkIGJ5IHdyaXRpbmcgMHhGRiB0byB0aGVtLgo+ICsJICoKPiArCSAqICAgMHhGRiAweEZGIDB4 RkYgMHhGRiB8IEJCTSBPT0IxIE9PQjIgT09CMyB8IC4uLgo+ICsJICoKPiArCSAqIENvbmZpZ3Vy ZSB0aGUgRUNDIGFsZ29yaXRobSBzdXBwb3J0ZWQgYnkgdGhlIGJvb3QgUk9NLgo+ICsJICovCj4g KwlpZiAoKHBhZ2UgPCBwYWdlc19wZXJfYmxrICogcmtuYW5kLT5ib290X2Jsa3MpICYmCj4gKwkg ICAgKGNoaXAtPm9wdGlvbnMgJiBOQU5EX0lTX0JPT1RfTUVESVVNKSkgewo+ICsJCWJvb3Rfcm9t X21vZGUgPSAxOwo+ICsJCWlmIChya25hbmQtPmJvb3RfZWNjICE9IGVjYy0+c3RyZW5ndGgpCj4g KwkJCXJrX25mY19od19lY2Nfc2V0dXAoY2hpcCwgZWNjLAo+ICsJCQkJCSAgICBya25hbmQtPmJv b3RfZWNjKTsKPiArCX0KPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgZWNjLT5zdGVwczsgaSsrKSB7 Cj4gKwkJaWYgKCFpKSB7Cj4gKwkJCXJlZyA9IDB4RkZGRkZGRkY7Cj4gKwkJfSBlbHNlIHsKPiAr CQkJb29iID0gY2hpcC0+b29iX3BvaSArIChpIC0gMSkgKiBORkNfU1lTX0RBVEFfU0laRTsKPiAr CQkJcmVnID0gb29iWzBdIHwgb29iWzFdIDw8IDggfCBvb2JbMl0gPDwgMTYgfAo+ICsJCQkgICAg ICBvb2JbM10gPDwgMjQ7Cj4gKwkJfQo+ICsJCWlmICghaSAmJiBib290X3JvbV9tb2RlKQo+ICsJ CQlyZWcgPSAocGFnZSAmIChwYWdlc19wZXJfYmxrIC0gMSkpICogNDsKPiArCj4gKwkJaWYgKG5m Yy0+Y2ZnLT50eXBlID09IE5GQ19WOSkKPiArCQkJbmZjLT5vb2JfYnVmW2ldID0gcmVnOwo+ICsJ CWVsc2UKPiArCQkJbmZjLT5vb2JfYnVmW2kgKiAob29iX3N0ZXAgLyA0KV0gPSByZWc7Cj4gKwl9 Cj4gKwo+ICsJZG1hX2RhdGEgPSBkbWFfbWFwX3NpbmdsZShuZmMtPmRldiwgKHZvaWQgKiluZmMt PnBhZ2VfYnVmLAo+ICsJCQkJICBtdGQtPndyaXRlc2l6ZSwgRE1BX1RPX0RFVklDRSk7Cj4gKwlk bWFfb29iID0gZG1hX21hcF9zaW5nbGUobmZjLT5kZXYsIG5mYy0+b29iX2J1ZiwKPiArCQkJCSBl Y2MtPnN0ZXBzICogb29iX3N0ZXAsCj4gKwkJCQkgRE1BX1RPX0RFVklDRSk7Cj4gKwo+ICsJcmVp bml0X2NvbXBsZXRpb24oJm5mYy0+ZG9uZSk7Cj4gKwl3cml0ZWwoSU5UX0RNQSwgbmZjLT5yZWdz ICsgbmZjLT5jZmctPmludF9lbl9vZmYpOwo+ICsKPiArCXJrX25mY194ZmVyX3N0YXJ0KG5mYywg TkZDX1dSSVRFLCBlY2MtPnN0ZXBzLCBkbWFfZGF0YSwKPiArCQkJICBkbWFfb29iKTsKPiArCXJl dCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmbmZjLT5kb25lLAo+ICsJCQkJCSAgbXNl Y3NfdG9famlmZmllcygxMDApKTsKPiArCWlmICghcmV0KQo+ICsJCWRldl93YXJuKG5mYy0+ZGV2 LCAid3JpdGU6IHdhaXQgZG1hIGRvbmUgdGltZW91dC5cbiIpOwo+ICsJLyoKPiArCSAqIFdoZXRo ZXIgdGhlIERNQSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQgb3Igbm90LiBUaGUgZHJpdmVyCj4gKwkg KiBuZWVkcyB0byBjaGVjayB0aGUgTkZDYHMgc3RhdHVzIHJlZ2lzdGVyIHRvIHNlZSBpZiB0aGUg ZGF0YQo+ICsJICogdHJhbnNmZXIgd2FzIGNvbXBsZXRlZC4KPiArCSAqLwo+ICsJcmV0ID0gcmtf bmZjX3dhaXRfZm9yX3hmZXJfZG9uZShuZmMpOwo+ICsKPiArCWRtYV91bm1hcF9zaW5nbGUobmZj LT5kZXYsIGRtYV9kYXRhLCBtdGQtPndyaXRlc2l6ZSwKPiArCQkJIERNQV9UT19ERVZJQ0UpOwo+ ICsJZG1hX3VubWFwX3NpbmdsZShuZmMtPmRldiwgZG1hX29vYiwgZWNjLT5zdGVwcyAqIG9vYl9z dGVwLAo+ICsJCQkgRE1BX1RPX0RFVklDRSk7Cj4gKwo+ICsJaWYgKGJvb3Rfcm9tX21vZGUgJiYg cmtuYW5kLT5ib290X2VjYyAhPSBlY2MtPnN0cmVuZ3RoKQo+ICsJCXJrX25mY19od19lY2Nfc2V0 dXAoY2hpcCwgZWNjLCBlY2MtPnN0cmVuZ3RoKTsKPiArCj4gKwlpZiAocmV0KSB7Cj4gKwkJcmV0 ID0gLUVJTzsKPiArCQlkZXZfZXJyKG5mYy0+ZGV2LAo+ICsJCQkid3JpdGU6IHdhaXQgdHJhbnNm ZXIgZG9uZSB0aW1lb3V0LlxuIik7Cj4gKwl9Cj4gKwo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4g cmV0Owo+ICsKPiArCXJldCA9IG5hbmRfcHJvZ19wYWdlX2VuZF9vcChjaGlwKTsKPiArCj4gKwkv Kgo+ICsJICogRGVzZWxlY3QgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0YXJnZXQgYWZ0ZXIgdGhl IG9wcyBpcyBkb25lCj4gKwkgKiB0byByZWR1Y2UgdGhlIHBvd2VyIGNvbnN1bXB0aW9uLgo+ICsJ ICovCgpJZiB5b3UgZm9yY2UgdGhpcyBkZXNlbGVjdGlvbiwgeW91ciBzaG91bGQgcHJvYmFibHkg ZG8gaXQgZXZlbiBpbiBjYXNlCm9mIGVycm9yPwoKPiArCXJrX25mY19zZWxlY3RfY2hpcChjaGlw LCAtMSk7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBya19uZmNf cmVhZF9wYWdlX3JhdyhzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCB1OCAqYnVmLCBpbnQgb29iX29u LAo+ICsJCQkJaW50IHBhZ2UpCj4gK3sKPiArCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gbmFuZF90 b19tdGQoY2hpcCk7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dldF9jb250cm9sbGVy X2RhdGEoY2hpcCk7Cj4gKwlzdHJ1Y3QgbmFuZF9lY2NfY3RybCAqZWNjID0gJmNoaXAtPmVjYzsK PiArCWludCBpOwo+ICsKPiArCW5hbmRfcmVhZF9wYWdlX29wKGNoaXAsIHBhZ2UsIDAsIE5VTEws IDApOwo+ICsJcmtfbmZjX3JlYWRfYnVmKG5mYywgbmZjLT5idWZmZXIsIG10ZC0+d3JpdGVzaXpl ICsgbXRkLT5vb2JzaXplKTsKPiArCj4gKwkvKgo+ICsJICogRGVzZWxlY3QgdGhlIGN1cnJlbnRs eSBzZWxlY3RlZCB0YXJnZXQgYWZ0ZXIgdGhlIG9wcyBpcyBkb25lCj4gKwkgKiB0byByZWR1Y2Ug dGhlIHBvd2VyIGNvbnN1bXB0aW9uLgo+ICsJICovCj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hp cCwgLTEpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBlY2MtPnN0ZXBzOyBpKyspIHsKPiArCQkv Kgo+ICsJCSAqIFRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIE9PQiBhcmUgcmVzZXJ2ZWQgZm9yIHRo ZQo+ICsJCSAqIGJvb3QgUk9NLiBJbiBzb21lIGRlYnVnZ2luZyBjYXNlcywgc3VjaCBhcyB3aXRo IGEgcmVhZCwKPiArCQkgKiBlcmFzZSBhbmQgd3JpdGUgYmFjayB0ZXN0LCB0aGVzZSA0IGJ5dGVz IGFsc28gbXVzdCBiZQo+ICsJCSAqIHNhdmVkIHNvbWV3aGVyZSwgb3RoZXJ3aXNlIHRoaXMgaW5m b3JtYXRpb24gd2lsbCBiZQo+ICsJCSAqIGxvc3QgZHVyaW5nIGEgd3JpdGUgYmFjay4KCkRpdHRv Cgo+ICsJCSAqLwo+ICsJCWlmICghaSkKPiArCQkJbWVtY3B5KHJrX25mY19idWZfdG9fb29iX3B0 cihjaGlwLCBlY2MtPnN0ZXBzIC0gMSksCj4gKwkJCSAgICAgICBya19uZmNfb29iX3B0cihjaGlw LCBpKSwKPiArCQkJICAgICAgIE5GQ19TWVNfREFUQV9TSVpFKTsKPiArCQllbHNlCj4gKwkJCW1l bWNweShya19uZmNfYnVmX3RvX29vYl9wdHIoY2hpcCwgaSAtIDEpLAo+ICsJCQkgICAgICAgcmtf bmZjX29vYl9wdHIoY2hpcCwgaSksCj4gKwkJCSAgICAgICBORkNfU1lTX0RBVEFfU0laRSk7Cj4g KwkJLyogQ29weSBFQ0MgZGF0YSBmcm9tIHRoZSBORkMgYnVmZmVyLiAqLwo+ICsJCW1lbWNweShy a19uZmNfYnVmX3RvX29vYl9lY2NfcHRyKGNoaXAsIGkpLAo+ICsJCSAgICAgICBya19uZmNfb29i X3B0cihjaGlwLCBpKSArIE5GQ19TWVNfREFUQV9TSVpFLAo+ICsJCSAgICAgICBlY2MtPmJ5dGVz KTsKPiArCQkvKiBDb3B5IGRhdGEgZnJvbSB0aGUgTkZDIGJ1ZmZlci4gKi8KPiArCQlpZiAoYnVm KQo+ICsJCQltZW1jcHkocmtfbmZjX2J1Zl90b19kYXRhX3B0cihjaGlwLCBidWYsIGkpLAo+ICsJ CQkgICAgICAgcmtfbmZjX2RhdGFfcHRyKGNoaXAsIGkpLAo+ICsJCQkgICAgICAgZWNjLT5zaXpl KTsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBya19uZmNf cmVhZF9vb2Ioc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgaW50IHBhZ2UpCj4gK3sKPiArCXJldHVy biBya19uZmNfcmVhZF9wYWdlX3JhdyhjaGlwLCBOVUxMLCAxLCBwYWdlKTsKCkRpdHRvCgo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19yZWFkX3BhZ2VfaHdlY2Moc3RydWN0IG5hbmRfY2hp cCAqY2hpcCwgdTggKmJ1ZiwgaW50IG9vYl9vbiwKPiArCQkJCSAgaW50IHBhZ2UpCj4gK3sKPiAr CXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gbmFuZF90b19tdGQoY2hpcCk7Cj4gKwlzdHJ1Y3Qgcmtf bmZjICpuZmMgPSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4gKwlzdHJ1Y3Qgcmtf bmZjX25hbmRfY2hpcCAqcmtuYW5kID0gcmtfbmZjX3RvX3JrbmFuZChjaGlwKTsKPiArCXN0cnVj dCBuYW5kX2VjY19jdHJsICplY2MgPSAmY2hpcC0+ZWNjOwo+ICsJaW50IG9vYl9zdGVwID0gKGVj Yy0+Ynl0ZXMgPiA2MCkgPyBORkNfTUFYX09PQl9QRVJfU1RFUCA6Cj4gKwkJCU5GQ19NSU5fT09C X1BFUl9TVEVQOwo+ICsJaW50IHBhZ2VzX3Blcl9ibGsgPSBtdGQtPmVyYXNlc2l6ZSAvIG10ZC0+ d3JpdGVzaXplOwo+ICsJZG1hX2FkZHJfdCBkbWFfZGF0YSwgZG1hX29vYjsKPiArCWludCByZXQg PSAwLCBpLCBib290X3JvbV9tb2RlID0gMDsKPiArCWludCBiaXRmbGlwcyA9IDAsIGJjaF9zdDsK PiArCXU4ICpvb2I7Cj4gKwl1MzIgdG1wOwo+ICsKPiArCW5hbmRfcmVhZF9wYWdlX29wKGNoaXAs IHBhZ2UsIDAsIE5VTEwsIDApOwo+ICsKPiArCWRtYV9kYXRhID0gZG1hX21hcF9zaW5nbGUobmZj LT5kZXYsIG5mYy0+cGFnZV9idWYsCj4gKwkJCQkgIG10ZC0+d3JpdGVzaXplLAo+ICsJCQkJICBE TUFfRlJPTV9ERVZJQ0UpOwo+ICsJZG1hX29vYiA9IGRtYV9tYXBfc2luZ2xlKG5mYy0+ZGV2LCBu ZmMtPm9vYl9idWYsCj4gKwkJCQkgZWNjLT5zdGVwcyAqIG9vYl9zdGVwLAo+ICsJCQkJIERNQV9G Uk9NX0RFVklDRSk7Cj4gKwo+ICsJLyoKPiArCSAqIFRoZSBmaXJzdCBibG9ja3MgKDQsIDggb3Ig MTYgZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UpCj4gKwkgKiBhcmUgdXNlZCBieSB0aGUgYm9vdCBS T00uCj4gKwkgKiBDb25maWd1cmUgdGhlIEVDQyBhbGdvcml0aG0gc3VwcG9ydGVkIGJ5IHRoZSBi b290IFJPTS4KPiArCSAqLwo+ICsJaWYgKChwYWdlIDwgcGFnZXNfcGVyX2JsayAqIHJrbmFuZC0+ Ym9vdF9ibGtzKSAmJgo+ICsJICAgIChjaGlwLT5vcHRpb25zICYgTkFORF9JU19CT09UX01FRElV TSkpIHsKPiArCQlib290X3JvbV9tb2RlID0gMTsKPiArCQlpZiAocmtuYW5kLT5ib290X2VjYyAh PSBlY2MtPnN0cmVuZ3RoKQo+ICsJCQlya19uZmNfaHdfZWNjX3NldHVwKGNoaXAsIGVjYywKPiAr CQkJCQkgICAgcmtuYW5kLT5ib290X2VjYyk7Cj4gKwl9Cj4gKwo+ICsJcmVpbml0X2NvbXBsZXRp b24oJm5mYy0+ZG9uZSk7Cj4gKwl3cml0ZWwoSU5UX0RNQSwgbmZjLT5yZWdzICsgbmZjLT5jZmct PmludF9lbl9vZmYpOwo+ICsJcmtfbmZjX3hmZXJfc3RhcnQobmZjLCBORkNfUkVBRCwgZWNjLT5z dGVwcywgZG1hX2RhdGEsCj4gKwkJCSAgZG1hX29vYik7Cj4gKwlyZXQgPSB3YWl0X2Zvcl9jb21w bGV0aW9uX3RpbWVvdXQoJm5mYy0+ZG9uZSwKPiArCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoMTAw KSk7Cj4gKwlpZiAoIXJldCkKPiArCQlkZXZfd2FybihuZmMtPmRldiwgInJlYWQ6IHdhaXQgZG1h IGRvbmUgdGltZW91dC5cbiIpOwo+ICsJLyoKPiArCSAqIFdoZXRoZXIgdGhlIERNQSB0cmFuc2Zl ciBpcyBjb21wbGV0ZWQgb3Igbm90LiBUaGUgZHJpdmVyCj4gKwkgKiBuZWVkcyB0byBjaGVjayB0 aGUgTkZDYHMgc3RhdHVzIHJlZ2lzdGVyIHRvIHNlZSBpZiB0aGUgZGF0YQo+ICsJICogdHJhbnNm ZXIgd2FzIGNvbXBsZXRlZC4KPiArCSAqLwo+ICsJcmV0ID0gcmtfbmZjX3dhaXRfZm9yX3hmZXJf ZG9uZShuZmMpOwo+ICsJZG1hX3VubWFwX3NpbmdsZShuZmMtPmRldiwgZG1hX2RhdGEsIG10ZC0+ d3JpdGVzaXplLAo+ICsJCQkgRE1BX0ZST01fREVWSUNFKTsKPiArCWRtYV91bm1hcF9zaW5nbGUo bmZjLT5kZXYsIGRtYV9vb2IsIGVjYy0+c3RlcHMgKiBvb2Jfc3RlcCwKPiArCQkJIERNQV9GUk9N X0RFVklDRSk7Cj4gKwo+ICsJaWYgKHJldCkgewo+ICsJCWJpdGZsaXBzID0gLUVJTzsKPiArCQlk ZXZfZXJyKG5mYy0+ZGV2LAo+ICsJCQkicmVhZDogd2FpdCB0cmFuc2ZlciBkb25lIHRpbWVvdXQu XG4iKTsKPiArCQlnb3RvIG91dDsKPiArCX0KPiArCj4gKwlmb3IgKGkgPSAxOyBpIDwgZWNjLT5z dGVwczsgaSsrKSB7Cj4gKwkJb29iID0gY2hpcC0+b29iX3BvaSArIChpIC0gMSkgKiBORkNfU1lT X0RBVEFfU0laRTsKPiArCQlpZiAobmZjLT5jZmctPnR5cGUgPT0gTkZDX1Y5KQo+ICsJCQl0bXAg PSBuZmMtPm9vYl9idWZbaV07Cj4gKwkJZWxzZQo+ICsJCQl0bXAgPSBuZmMtPm9vYl9idWZbaSAq IChvb2Jfc3RlcCAvIDQpXTsKPiArCQkqb29iKysgPSAodTgpdG1wOwo+ICsJCSpvb2IrKyA9ICh1 OCkodG1wID4+IDgpOwo+ICsJCSpvb2IrKyA9ICh1OCkodG1wID4+IDE2KTsKPiArCQkqb29iKysg PSAodTgpKHRtcCA+PiAyNCk7Cj4gKwl9Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IChlY2MtPnN0 ZXBzIC8gMik7IGkrKykgewo+ICsJCWJjaF9zdCA9IHJlYWRsX3JlbGF4ZWQobmZjLT5yZWdzICsK PiArCQkJCSAgICAgICBuZmMtPmNmZy0+YmNoX3N0X29mZiArIGkgKiA0KTsKPiArCQlpZiAoYmNo X3N0ICYgQklUKG5mYy0+Y2ZnLT5lY2MwLmVycl9mbGFnX2JpdCkgfHwKPiArCQkgICAgYmNoX3N0 ICYgQklUKG5mYy0+Y2ZnLT5lY2MxLmVycl9mbGFnX2JpdCkpIHsKPiArCQkJbXRkLT5lY2Nfc3Rh dHMuZmFpbGVkKys7Cj4gKwkJCWJpdGZsaXBzID0gMDsKPiArCQl9IGVsc2Ugewo+ICsJCQlyZXQg PSBFQ0NfRVJSX0NOVChiY2hfc3QsIG5mYy0+Y2ZnLT5lY2MwKTsKPiArCQkJbXRkLT5lY2Nfc3Rh dHMuY29ycmVjdGVkICs9IHJldDsKPiArCQkJYml0ZmxpcHMgPSBtYXhfdCh1MzIsIGJpdGZsaXBz LCByZXQpOwo+ICsKPiArCQkJcmV0ID0gRUNDX0VSUl9DTlQoYmNoX3N0LCBuZmMtPmNmZy0+ZWNj MSk7Cj4gKwkJCW10ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCArPSByZXQ7Cj4gKwkJCWJpdGZsaXBz ID0gbWF4X3QodTMyLCBiaXRmbGlwcywgcmV0KTsKPiArCQl9Cj4gKwl9Cj4gK291dDoKPiArCW1l bWNweShidWYsIG5mYy0+cGFnZV9idWYsIG10ZC0+d3JpdGVzaXplKTsKPiArCj4gKwlpZiAoYm9v dF9yb21fbW9kZSAmJiBya25hbmQtPmJvb3RfZWNjICE9IGVjYy0+c3RyZW5ndGgpCj4gKwkJcmtf bmZjX2h3X2VjY19zZXR1cChjaGlwLCBlY2MsIGVjYy0+c3RyZW5ndGgpOwo+ICsKPiArCWlmIChi aXRmbGlwcyA+IGVjYy0+c3RyZW5ndGgpCj4gKwkJZGV2X2VycihuZmMtPmRldiwgInJlYWQgcGFn ZTogJXggZWNjIGVycm9yIVxuIiwgcGFnZSk7Cj4gKwo+ICsJLyoKPiArCSAqIERlc2VsZWN0IHRo ZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGFyZ2V0IGFmdGVyIHRoZSBvcHMgaXMgZG9uZQo+ICsJICog dG8gcmVkdWNlIHRoZSBwb3dlciBjb25zdW1wdGlvbi4KPiArCSAqLwo+ICsJcmtfbmZjX3NlbGVj dF9jaGlwKGNoaXAsIC0xKTsKPiArCj4gKwlyZXR1cm4gYml0ZmxpcHM7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbmxpbmUgdm9pZCBya19uZmNfaHdfaW5pdChzdHJ1Y3QgcmtfbmZjICpuZmMpCj4gK3sK PiArCS8qIERpc2FibGUgZmxhc2ggd3AuICovCj4gKwl3cml0ZWwoRk1DVExfV1AsIG5mYy0+cmVn cyArIE5GQ19GTUNUTCk7Cj4gKwkvKiBDb25maWcgZGVmYXVsdCB0aW1pbmcgNDBucyBhdCAxNTAg TWh6IG5mYyBjbG9jay4gKi8KPiArCXdyaXRlbCgweDEwODEsIG5mYy0+cmVncyArIE5GQ19GTVdB SVQpOwo+ICsJLyogRGlzYWJsZSByYW5kb21pemVyIGFuZCBETUEuICovCj4gKwl3cml0ZWwoMCwg bmZjLT5yZWdzICsgbmZjLT5jZmctPnJhbmRtel9vZmYpOwo+ICsJd3JpdGVsKDAsIG5mYy0+cmVn cyArIG5mYy0+Y2ZnLT5kbWFfY2ZnX29mZik7Cj4gKwl3cml0ZWwoRkxDVExfUlNULCBuZmMtPnJl Z3MgKyBuZmMtPmNmZy0+ZmxjdGxfb2ZmKTsKPiArfQo+ICsKPiArc3RhdGljIGlycXJldHVybl90 IHJrX25mY19pcnEoaW50IGlycSwgdm9pZCAqaWQpCj4gK3sKPiArCXN0cnVjdCBya19uZmMgKm5m YyA9IGlkOwo+ICsJdTMyIHN0YSwgaWVuOwo+ICsKPiArCXN0YSA9IHJlYWRsX3JlbGF4ZWQobmZj LT5yZWdzICsgbmZjLT5jZmctPmludF9zdF9vZmYpOwo+ICsJaWVuID0gcmVhZGxfcmVsYXhlZChu ZmMtPnJlZ3MgKyBuZmMtPmNmZy0+aW50X2VuX29mZik7Cj4gKwo+ICsJaWYgKCEoc3RhICYgaWVu KSkKPiArCQlyZXR1cm4gSVJRX05PTkU7Cj4gKwo+ICsJd3JpdGVsKHN0YSwgbmZjLT5yZWdzICsg bmZjLT5jZmctPmludF9jbHJfb2ZmKTsKPiArCXdyaXRlbCh+c3RhICYgaWVuLCBuZmMtPnJlZ3Mg KyBuZmMtPmNmZy0+aW50X2VuX29mZik7Cj4gKwo+ICsJY29tcGxldGUoJm5mYy0+ZG9uZSk7Cj4g Kwo+ICsJcmV0dXJuIElSUV9IQU5ETEVEOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19l bmFibGVfY2xrcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBya19uZmMgKm5mYykKPiArewo+ ICsJaW50IHJldDsKPiArCj4gKwlpZiAoIUlTX0VSUihuZmMtPm5mY19jbGspKSB7Cj4gKwkJcmV0 ID0gY2xrX3ByZXBhcmVfZW5hYmxlKG5mYy0+bmZjX2Nsayk7Cj4gKwkJaWYgKHJldCkgewo+ICsJ CQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBlbmFibGUgbmZjIGNsa1xuIik7Cj4gKwkJCXJldHVy biByZXQ7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShuZmMt PmFoYl9jbGspOwo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGVu YWJsZSBhaGIgY2xrXG4iKTsKPiArCQlpZiAoIUlTX0VSUihuZmMtPm5mY19jbGspKQo+ICsJCQlj bGtfZGlzYWJsZV91bnByZXBhcmUobmZjLT5uZmNfY2xrKTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJ fQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBya19uZmNfZGlzYWJs ZV9jbGtzKHN0cnVjdCBya19uZmMgKm5mYykKPiArewo+ICsJaWYgKCFJU19FUlIobmZjLT5uZmNf Y2xrKSkKPiArCQljbGtfZGlzYWJsZV91bnByZXBhcmUobmZjLT5uZmNfY2xrKTsKPiArCWNsa19k aXNhYmxlX3VucHJlcGFyZShuZmMtPmFoYl9jbGspOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJr X25mY19vb2JsYXlvdXRfZnJlZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IHNlY3Rpb24sCj4g KwkJCQkgc3RydWN0IG10ZF9vb2JfcmVnaW9uICpvb2JfcmVnaW9uKQo+ICt7Cj4gKwlzdHJ1Y3Qg bmFuZF9jaGlwICpjaGlwID0gbXRkX3RvX25hbmQobXRkKTsKPiArCXN0cnVjdCBya19uZmNfbmFu ZF9jaGlwICpya25hbmQgPSBya19uZmNfdG9fcmtuYW5kKGNoaXApOwo+ICsKPiArCWlmIChzZWN0 aW9uKQo+ICsJCXJldHVybiAtRVJBTkdFOwo+ICsKPiArCS8qCj4gKwkgKiBUaGUgYmVnaW5uaW5n IG9mIHRoZSBPT0IgYXJlYSBzdG9yZXMgdGhlIHJlc2VydmVkIGRhdGEgZm9yIHRoZSBORkMsCj4g KwkgKiB0aGUgc2l6ZSBvZiB0aGUgcmVzZXJ2ZWQgZGF0YSBpcyBORkNfU1lTX0RBVEFfU0laRSBi eXRlcy4KPiArCSAqLwo+ICsJb29iX3JlZ2lvbi0+bGVuZ3RoID0gcmtuYW5kLT5tZXRhZGF0YV9z aXplIC0gTkZDX1NZU19EQVRBX1NJWkUgLSAyOwo+ICsJb29iX3JlZ2lvbi0+b2Zmc2V0ID0gTkZD X1NZU19EQVRBX1NJWkUgKyAyOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMg aW50IHJrX25mY19vb2JsYXlvdXRfZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgc2VjdGlv biwKPiArCQkJCXN0cnVjdCBtdGRfb29iX3JlZ2lvbiAqb29iX3JlZ2lvbikKPiArewo+ICsJc3Ry dWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZF90b19uYW5kKG10ZCk7Cj4gKwlzdHJ1Y3QgcmtfbmZj X25hbmRfY2hpcCAqcmtuYW5kID0gcmtfbmZjX3RvX3JrbmFuZChjaGlwKTsKPiArCj4gKwlpZiAo c2VjdGlvbikKPiArCQlyZXR1cm4gLUVSQU5HRTsKPiArCj4gKwlvb2JfcmVnaW9uLT5sZW5ndGgg PSBtdGQtPm9vYnNpemUgLSBya25hbmQtPm1ldGFkYXRhX3NpemU7Cj4gKwlvb2JfcmVnaW9uLT5v ZmZzZXQgPSBya25hbmQtPm1ldGFkYXRhX3NpemU7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiAr Cj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRkX29vYmxheW91dF9vcHMgcmtfbmZjX29vYmxheW91 dF9vcHMgPSB7Cj4gKwkuZnJlZSA9IHJrX25mY19vb2JsYXlvdXRfZnJlZSwKPiArCS5lY2MgPSBy a19uZmNfb29ibGF5b3V0X2VjYywKPiArfTsKPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX2VjY19p bml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IG10ZF9pbmZvICptdGQpCj4gK3sKPiArCXN0 cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGRfdG9fbmFuZChtdGQpOwo+ICsJc3RydWN0IHJrX25m YyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsJc3RydWN0IG5hbmRf ZWNjX2N0cmwgKmVjYyA9ICZjaGlwLT5lY2M7Cj4gKwljb25zdCB1OCAqc3RyZW5ndGhzID0gbmZj LT5jZmctPmVjY19zdHJlbmd0aHM7Cj4gKwl1OCBtYXhfc3RyZW5ndGgsIG5mY19tYXhfc3RyZW5n dGg7Cj4gKwlpbnQgaTsKPiArCj4gKwluZmNfbWF4X3N0cmVuZ3RoID0gbmZjLT5jZmctPmVjY19z dHJlbmd0aHNbMF07Cj4gKwkvKiBJZiBvcHRpb25hbCBkdCBzZXR0aW5ncyBub3QgcHJlc2VudC4g Ki8KPiArCWlmICghZWNjLT5zaXplIHx8ICFlY2MtPnN0cmVuZ3RoIHx8Cj4gKwkgICAgZWNjLT5z dHJlbmd0aCA+IG5mY19tYXhfc3RyZW5ndGgpIHsKPiArCQljaGlwLT5lY2Muc2l6ZSA9IDEwMjQ7 Cj4gKwkJZWNjLT5zdGVwcyA9IG10ZC0+d3JpdGVzaXplIC8gZWNjLT5zaXplOwo+ICsKPiArCQkv Kgo+ICsJCSAqIEhXIEVDQyBhbHdheXMgcmVxdWVzdHMgdGhlIG51bWJlciBvZiBFQ0MgYnl0ZXMg cGVyIDEwMjQgYnl0ZQo+ICsJCSAqIGJsb2Nrcy4gVGhlIGZpcnN0IDQgT09CIGJ5dGVzIGFyZSBy ZXNlcnZlZCBmb3Igc3lzIGRhdGEuCj4gKwkJICovCj4gKwkJbWF4X3N0cmVuZ3RoID0gKChtdGQt Pm9vYnNpemUgLyBlY2MtPnN0ZXBzKSAtIDQpICogOCAvCj4gKwkJCQkgZmxzKDggKiAxMDI0KTsK PiArCQlpZiAobWF4X3N0cmVuZ3RoID4gbmZjX21heF9zdHJlbmd0aCkKPiArCQkJbWF4X3N0cmVu Z3RoID0gbmZjX21heF9zdHJlbmd0aDsKPiArCj4gKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykg ewo+ICsJCQlpZiAobWF4X3N0cmVuZ3RoID49IHN0cmVuZ3Roc1tpXSkKPiArCQkJCWJyZWFrOwo+ ICsJCX0KPiArCj4gKwkJaWYgKGkgPj0gNCkgewo+ICsJCQlkZXZfZXJyKG5mYy0+ZGV2LCAiVW5z dXBwb3J0ZWQgRUNDIHN0cmVuZ3RoXG4iKTsKPiArCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwo+ICsJ CX0KPiArCj4gKwkJZWNjLT5zdHJlbmd0aCA9IHN0cmVuZ3Roc1tpXTsKPiArCX0KPiArCWVjYy0+ c3RlcHMgPSBtdGQtPndyaXRlc2l6ZSAvIGVjYy0+c2l6ZTsKPiArCWVjYy0+Ynl0ZXMgPSBESVZf Uk9VTkRfVVAoZWNjLT5zdHJlbmd0aCAqIGZscyg4ICogMTAyNCksIDgpOwoKSGVyZSB5b3UgYXNz dW1lIDEwMjQgRUNDIHN0ZXAgc2l6ZSwgdGhpcyBpcyB3cm9uZy4gRWl0aGVyIHRoZQpjb250cm9s bGVyIG9ubHkgc3VwcG9ydHMgMTAyNCBieXRlcyBvciB5b3Ugb2ZmaWNpYWxseSBzdGF0ZSBzb21l d2hlcmUKdGhhdCB5b3UgZG9uJ3Qgc3VwcG9ydCBtb3JlIEVDQyBzdGVwIHNpemVzIHlldC4KCj4g KwkvKiBIVyBFQ0MgYWx3YXlzIHdvcmsgd2l0aCBldmVuIG51bWJlcnMgb2YgRUNDIGJ5dGVzLiAq Lwo+ICsJZWNjLT5ieXRlcyA9IEFMSUdOKGVjYy0+Ynl0ZXMsIDIpOwoKU2hvdWxkbid0IHlvdSBl bnN1cmUgdGhlIG51bWJlciBvZiBieXRlcyBpcyByb3VuZGVkIHVwID8KCj4gKwo+ICsJcmtfbmZj X2h3X2VjY19zZXR1cChjaGlwLCBlY2MsIGVjYy0+c3RyZW5ndGgpOwo+ICsKPiArCXJldHVybiAw Owo+ICt9Cj4gKwoKClRoYW5rcywKTWlxdcOobAoKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgt YXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3Jn L21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo= 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=-11.2 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_2 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 392D7C388F7 for ; Wed, 28 Oct 2020 21:46:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CD54B24724 for ; Wed, 28 Oct 2020 21:46:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726495AbgJ1Vqm convert rfc822-to-8bit (ORCPT ); Wed, 28 Oct 2020 17:46:42 -0400 Received: from mslow2.mail.gandi.net ([217.70.178.242]:57322 "EHLO mslow2.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725446AbgJ1Vqj (ORCPT ); Wed, 28 Oct 2020 17:46:39 -0400 Received: from relay3-d.mail.gandi.net (unknown [217.70.183.195]) by mslow2.mail.gandi.net (Postfix) with ESMTP id A79003ADDB9; Wed, 28 Oct 2020 10:48:51 +0000 (UTC) X-Originating-IP: 91.224.148.103 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay3-d.mail.gandi.net (Postfix) with ESMTPSA id 9E8F66001A; Wed, 28 Oct 2020 10:48:27 +0000 (UTC) Date: Wed, 28 Oct 2020 11:48:26 +0100 From: Miquel Raynal To: Yifeng Zhao Cc: richard@nod.at, vigneshr@ti.com, robh+dt@kernel.org, devicetree@vger.kernel.org, linux-mtd@lists.infradead.org, heiko@sntech.de, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v13 2/8] mtd: rawnand: rockchip: NFC drivers for RK3308, RK2928 and others Message-ID: <20201028114826.6cd6b841@xps13> In-Reply-To: <20201028095326.15562-3-yifeng.zhao@rock-chips.com> References: <20201028095326.15562-1-yifeng.zhao@rock-chips.com> <20201028095326.15562-3-yifeng.zhao@rock-chips.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.4 (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: devicetree@vger.kernel.org Hi Yifeng, A few more comments below, but overall looks better. Yifeng Zhao wrote on Wed, 28 Oct 2020 17:53:24 +0800: > This driver supports Rockchip NFC (NAND Flash Controller) found on RK3308, > RK2928, RKPX30, RV1108 and other SOCs. The driver has been tested using > 8-bit NAND interface on the ARM based RK3308 platform. > > Support Rockchip SoCs and NFC versions: > - PX30 and RK3326(NFCv900). > ECC: 16/40/60/70 bits/1KB. > CLOCK: ahb and nfc. > - RK3308 and RV1108(NFCv800). > ECC: 16 bits/1KB. > CLOCK: ahb and nfc. > - RK3036 and RK3128(NFCv622). > ECC: 16/24/40/60 bits/1KB. > CLOCK: ahb and nfc. > - RK3066, RK3188 and RK2928(NFCv600). > ECC: 16/24/40/60 bits/1KB. > CLOCK: ahb. > > Supported features: > - Read full page data by DMA. > - Support HW ECC(one step is 1KB). > - Support 2 - 32K page size. > - Support 8 CS(depend on SoCs) > > Limitations: > - No support for the ecc step size is 512. > - Untested on some SoCs. > - No support for subpages. > - No support for the builtin randomizer. > - The original bad block mask is not supported. It is recommended to use > the BBT(bad block table). > > Signed-off-by: Yifeng Zhao > --- > > Changes in v13: > - The nfc->buffer will realloc while the page size of the second mtd > is large than the first one. > - Fix coding style. > - Fix some comments. > > Changes in v12: None > Changes in v11: > - Fix compile error. > > Changes in v10: > - Fix compile error on master v5.9-rc7. > > Changes in v9: > - The nfc->buffer will realloc while the page size of the second mtd > is large than the first one > - Fix coding style. > - Remove struct rk_nfc_clk. > - Prepend some function with rk_nfc_. > - Replace function readl_poll_timeout_atomic with readl_relaxed_poll_timeout. > - Remove function rk_nfc_read_byte and rk_nfc_write_byte. > - Don't select the die if 'check_only == true' in function rk_nfc_exec_op. > - Modify function rk_nfc_write_page and rk_nfc_write_page_raw. > > Changes in v8: None > Changes in v7: > - Rebase to linux-next. > - Fix coding style. > - Reserved 4 bytes at the beginning of the oob area. > - Page raw read and write included ecc data. > > Changes in v6: > - The mtd->name set by NAND label property. > - Add some comments. > - Fix compile error. > > Changes in v5: > - Add boot blocks support with different ECC for bootROM. > - Rename rockchip-nand.c to rockchip-nand-controller.c. > - Unification of other variable names. > - Remove some compatible define. > > Changes in v4: > - Define platform data structure for the register offsets. > - The compatible define with rkxx_nfc. > - Use SET_SYSTEM_SLEEP_PM_OPS to define PM_OPS. > - Use exec_op instead of legacy hooks. > > Changes in v3: None > Changes in v2: > - Fix compile error. > - Include header files sorted by file name. > > drivers/mtd/nand/raw/Kconfig | 12 + > drivers/mtd/nand/raw/Makefile | 1 + > .../mtd/nand/raw/rockchip-nand-controller.c | 1460 +++++++++++++++++ > 3 files changed, 1473 insertions(+) > create mode 100644 drivers/mtd/nand/raw/rockchip-nand-controller.c > > diff --git a/drivers/mtd/nand/raw/Kconfig b/drivers/mtd/nand/raw/Kconfig > index 6c46f25b57e2..2cc533e4e239 100644 > --- a/drivers/mtd/nand/raw/Kconfig > +++ b/drivers/mtd/nand/raw/Kconfig > @@ -462,6 +462,18 @@ config MTD_NAND_ARASAN > Enables the driver for the Arasan NAND flash controller on > Zynq Ultrascale+ MPSoC. > > +config MTD_NAND_ROCKCHIP > + tristate "Rockchip NAND controller" > + depends on ARCH_ROCKCHIP && HAS_IOMEM > + help > + Enables support for NAND controller on Rockchip SoCs. > + There are four different versions of NAND FLASH Controllers, > + including: > + NFC v600: RK2928, RK3066, RK3188 > + NFC v622: RK3036, RK3128 > + NFC v800: RK3308, RV1108 > + NFC v900: PX30, RK3326 > + > comment "Misc" > > config MTD_SM_COMMON > diff --git a/drivers/mtd/nand/raw/Makefile b/drivers/mtd/nand/raw/Makefile > index 2930f5b9015d..960c9be25204 100644 > --- a/drivers/mtd/nand/raw/Makefile > +++ b/drivers/mtd/nand/raw/Makefile > @@ -58,6 +58,7 @@ obj-$(CONFIG_MTD_NAND_STM32_FMC2) += stm32_fmc2_nand.o > obj-$(CONFIG_MTD_NAND_MESON) += meson_nand.o > obj-$(CONFIG_MTD_NAND_CADENCE) += cadence-nand-controller.o > obj-$(CONFIG_MTD_NAND_ARASAN) += arasan-nand-controller.o > +obj-$(CONFIG_MTD_NAND_ROCKCHIP) += rockchip-nand-controller.o > > nand-objs := nand_base.o nand_legacy.o nand_bbt.o nand_timings.o nand_ids.o > nand-objs += nand_onfi.o > diff --git a/drivers/mtd/nand/raw/rockchip-nand-controller.c b/drivers/mtd/nand/raw/rockchip-nand-controller.c > new file mode 100644 > index 000000000000..2e96fd314346 > --- /dev/null > +++ b/drivers/mtd/nand/raw/rockchip-nand-controller.c > @@ -0,0 +1,1460 @@ > +// SPDX-License-Identifier: GPL-2.0 OR MIT > +/* > + * Rockchip NAND Flash controller driver. > + * Copyright (C) 2020 Rockchip Inc. > + * Author: Yifeng Zhao > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +/* > + * NFC Page Data Layout: > + * 1024 Bytes Data + 4Bytes sys data + 28Bytes~124Bytes ecc + > + * 1024 Bytes Data + 4Bytes sys data + 28Bytes~124Bytes ecc + > + * ...... > + * NAND Page Data Layout: > + * 1024 * n Data + m Bytes oob > + * Original Bad Block Mask Location: > + * First byte of oob(spare). > + * nand_chip->oob_poi data layout: > + * 4Bytes sys data + .... + 4Bytes sys data + ecc data. > + */ > + > +/* NAND controller register definition */ > +#define NFC_READ (0) > +#define NFC_WRITE (1) > + > +#define NFC_FMCTL (0x00) > +#define FMCTL_CE_SEL_M 0xFF > +#define FMCTL_CE_SEL(x) (1 << (x)) > +#define FMCTL_WP BIT(8) > +#define FMCTL_RDY BIT(9) > + > +#define NFC_FMWAIT (0x04) > +#define FLCTL_RST BIT(0) > +#define FLCTL_WR (1) /* 0: read, 1: write */ > +#define FLCTL_XFER_ST BIT(2) > +#define FLCTL_XFER_EN BIT(3) > +#define FLCTL_ACORRECT BIT(10) /* Auto correct error bits. */ > +#define FLCTL_XFER_READY BIT(20) > +#define FLCTL_XFER_SECTOR (22) > +#define FLCTL_TOG_FIX BIT(29) > + > +#define BCHCTL_BANK_M (7 << 5) > +#define BCHCTL_BANK (5) > + > +#define DMA_ST BIT(0) > +#define DMA_WR (1) /* 0: write, 1: read */ > +#define DMA_EN BIT(2) > +#define DMA_AHB_SIZE (3) /* 0: 1, 1: 2, 2: 4 */ > +#define DMA_BURST_SIZE (6) /* 0: 1, 3: 4, 5: 8, 7: 16 */ > +#define DMA_INC_NUM (9) /* 1 - 16 */ > + > +#define ECC_ERR_CNT(x, e) ((((x) >> (e).low) & (e).low_mask) |\ > + (((x) >> (e).high) & (e).high_mask) << (e).low_bn) > +#define INT_DMA BIT(0) > +#define NFC_BANK (0x800) > +#define NFC_BANK_STEP (0x100) > +#define BANK_DATA (0x00) > +#define BANK_ADDR (0x04) > +#define BANK_CMD (0x08) > +#define NFC_SRAM0 (0x1000) > +#define NFC_SRAM1 (0x1400) > +#define NFC_SRAM_SIZE (0x400) > +#define NFC_TIMEOUT (500000) > +#define NFC_MAX_OOB_PER_STEP 128 > +#define NFC_MIN_OOB_PER_STEP 64 > +#define MAX_DATA_SIZE 0xFFFC > +#define MAX_ADDRESS_CYC 6 > +#define NFC_ECC_MAX_MODES 4 > +#define NFC_MAX_NSELS (8) /* Some Socs only have 1 or 2 CSs. */ > +#define NFC_SYS_DATA_SIZE (4) /* 4 bytes sys data in oob pre 1024 data.*/ > +#define RK_DEFAULT_CLOCK_RATE (150 * 1000 * 1000) /* 150 Mhz */ > +#define ACCTIMING(csrw, rwpw, rwcs) ((csrw) << 12 | (rwpw) << 5 | (rwcs)) > + > +enum nfc_type { > + NFC_V6, > + NFC_V8, > + NFC_V9, > +}; > + > +/** > + * struct rk_ecc_cnt_status: represent a ecc status data. > + * @err_flag_bit: error flag bit index at register. > + * @low: ecc count low bit index at register. > + * @low_mask: mask bit. > + * @low_bn: ecc count low bit number. > + * @high: ecc count high bit index at register. > + * @high_mask: mask bit > + */ > +struct ecc_cnt_status { > + u8 err_flag_bit; > + u8 low; > + u8 low_mask; > + u8 low_bn; > + u8 high; > + u8 high_mask; > +}; > + > +/* > + * @type: nfc version > + * @ecc_strengths: ecc strengths > + * @ecc_cfgs: ecc config values > + * @flctl_off: FLCTL register offset > + * @bchctl_off: BCHCTL register offset > + * @dma_data_buf_off: DMA_DATA_BUF register offset > + * @dma_oob_buf_off: DMA_OOB_BUF register offset > + * @dma_cfg_off: DMA_CFG register offset > + * @dma_st_off: DMA_ST register offset > + * @bch_st_off: BCG_ST register offset > + * @randmz_off: RANDMZ register offset > + * @int_en_off: interrupt enable register offset > + * @int_clr_off: interrupt clean register offset > + * @int_st_off: interrupt status register offset > + * @oob0_off: oob0 register offset > + * @oob1_off: oob1 register offset > + * @ecc0: represent ECC0 status data > + * @ecc1: represent ECC1 status data > + */ > +struct nfc_cfg { > + enum nfc_type type; > + u8 ecc_strengths[NFC_ECC_MAX_MODES]; > + u32 ecc_cfgs[NFC_ECC_MAX_MODES]; > + u32 flctl_off; > + u32 bchctl_off; > + u32 dma_cfg_off; > + u32 dma_data_buf_off; > + u32 dma_oob_buf_off; > + u32 dma_st_off; > + u32 bch_st_off; > + u32 randmz_off; > + u32 int_en_off; > + u32 int_clr_off; > + u32 int_st_off; > + u32 oob0_off; > + u32 oob1_off; > + struct ecc_cnt_status ecc0; > + struct ecc_cnt_status ecc1; > +}; > + > +struct rk_nfc_nand_chip { > + struct list_head node; > + struct nand_chip chip; > + > + u16 spare_per_sector; > + u16 oob_buf_per_sector; > + u16 boot_blks; > + u16 boot_ecc; > + u16 metadata_size; > + > + u8 nsels; > + u8 sels[0]; > + /* Nothing after this field. */ > +}; > + > +struct rk_nfc { > + struct nand_controller controller; > + const struct nfc_cfg *cfg; > + struct device *dev; > + > + struct clk *nfc_clk; > + struct clk *ahb_clk; > + void __iomem *regs; > + > + u32 selected_bank; > + u32 band_offset; > + u32 cur_clk; > + > + struct completion done; > + struct list_head chips; > + > + u8 *buffer; > + u8 *page_buf; > + u32 *oob_buf; > + u32 buffer_size; > + u32 oob_buf_size; > + > + unsigned long assigned_cs; > +}; > + > +static inline struct rk_nfc_nand_chip *rk_nfc_to_rknand(struct nand_chip *chip) > +{ > + return container_of(chip, struct rk_nfc_nand_chip, chip); > +} > + > +static inline u8 *rk_nfc_buf_to_data_ptr(struct nand_chip *chip, const u8 *p, int i) > +{ > + return (u8 *)p + i * chip->ecc.size; > +} > + > +static inline u8 *rk_nfc_buf_to_oob_ptr(struct nand_chip *chip, int i) > +{ > + u8 *poi; > + > + poi = chip->oob_poi + i * NFC_SYS_DATA_SIZE; > + > + return poi; > +} > + > +static inline u8 *rk_nfc_buf_to_oob_ecc_ptr(struct nand_chip *chip, int i) > +{ > + struct rk_nfc_nand_chip *rknand = rk_nfc_to_rknand(chip); > + u8 *poi; > + > + poi = chip->oob_poi + rknand->metadata_size + > + chip->ecc.bytes * i; > + > + return poi; > +} > + > +static inline int rk_nfc_data_len(struct nand_chip *chip) > +{ > + struct rk_nfc_nand_chip *rknand = rk_nfc_to_rknand(chip); > + > + return chip->ecc.size + rknand->spare_per_sector; > +} > + > +static inline u8 *rk_nfc_data_ptr(struct nand_chip *chip, int i) > +{ > + struct rk_nfc *nfc = nand_get_controller_data(chip); > + > + return nfc->buffer + i * rk_nfc_data_len(chip); > +} > + > +static inline u8 *rk_nfc_oob_ptr(struct nand_chip *chip, int i) > +{ > + struct rk_nfc *nfc = nand_get_controller_data(chip); > + > + return nfc->buffer + i * rk_nfc_data_len(chip) + chip->ecc.size; > +} > + > +static void rk_nfc_select_chip(struct nand_chip *chip, int cs) > +{ > + struct rk_nfc *nfc = nand_get_controller_data(chip); > + struct rk_nfc_nand_chip *rknand = rk_nfc_to_rknand(chip); > + u32 val; > + > + if (cs < 0) { > + nfc->selected_bank = -1; > + /* Deselect the currently selected target. */ > + val = readl_relaxed(nfc->regs + NFC_FMCTL); > + val &= ~FMCTL_CE_SEL_M; > + writel(val, nfc->regs + NFC_FMCTL); > + return; > + } > + > + nfc->selected_bank = rknand->sels[cs]; > + nfc->band_offset = NFC_BANK + nfc->selected_bank * NFC_BANK_STEP; > + > + val = readl_relaxed(nfc->regs + NFC_FMCTL); > + val &= ~FMCTL_CE_SEL_M; > + val |= FMCTL_CE_SEL(nfc->selected_bank); > + > + writel(val, nfc->regs + NFC_FMCTL); > +} > + > +static inline int rk_nfc_wait_ioready(struct rk_nfc *nfc) > +{ > + int rc; > + u32 val; > + > + rc = readl_relaxed_poll_timeout(nfc->regs + NFC_FMCTL, val, > + val & FMCTL_RDY, 10, NFC_TIMEOUT); > + > + return rc; > +} > + > +static void rk_nfc_read_buf(struct rk_nfc *nfc, u8 *buf, int len) > +{ > + int i; > + > + for (i = 0; i < len; i++) > + buf[i] = readb_relaxed(nfc->regs + nfc->band_offset + > + BANK_DATA); > +} > + > +static void rk_nfc_write_buf(struct rk_nfc *nfc, const u8 *buf, int len) > +{ > + int i; > + > + for (i = 0; i < len; i++) > + writeb(buf[i], nfc->regs + nfc->band_offset + BANK_DATA); > +} > + > +static int rk_nfc_cmd(struct nand_chip *chip, > + const struct nand_subop *subop) > +{ > + struct rk_nfc *nfc = nand_get_controller_data(chip); > + unsigned int i, j, remaining, start; > + int reg_offset = nfc->band_offset; > + u8 *inbuf = NULL; > + const u8 *outbuf; > + u32 cnt = 0; > + int ret = 0; > + > + for (i = 0; i < subop->ninstrs; i++) { > + const struct nand_op_instr *instr = &subop->instrs[i]; > + > + switch (instr->type) { > + case NAND_OP_CMD_INSTR: > + writeb(instr->ctx.cmd.opcode, > + nfc->regs + reg_offset + BANK_CMD); > + break; > + > + case NAND_OP_ADDR_INSTR: > + remaining = nand_subop_get_num_addr_cyc(subop, i); > + start = nand_subop_get_addr_start_off(subop, i); > + > + for (j = 0; j < 8 && j + start < remaining; j++) > + writeb(instr->ctx.addr.addrs[j + start], > + nfc->regs + reg_offset + BANK_ADDR); > + break; > + > + case NAND_OP_DATA_IN_INSTR: > + case NAND_OP_DATA_OUT_INSTR: > + start = nand_subop_get_data_start_off(subop, i); > + cnt = nand_subop_get_data_len(subop, i); > + > + if (instr->type == NAND_OP_DATA_OUT_INSTR) { > + outbuf = instr->ctx.data.buf.out + start; > + rk_nfc_write_buf(nfc, outbuf, cnt); > + } else { > + inbuf = instr->ctx.data.buf.in + start; > + rk_nfc_read_buf(nfc, inbuf, cnt); > + } > + break; > + > + case NAND_OP_WAITRDY_INSTR: > + if (rk_nfc_wait_ioready(nfc) < 0) { > + ret = -ETIMEDOUT; > + dev_err(nfc->dev, "IO not ready\n"); > + } > + break; > + } > + } > + > + return ret; > +} > + > +static const struct nand_op_parser rk_nfc_op_parser = NAND_OP_PARSER( > + NAND_OP_PARSER_PATTERN( > + rk_nfc_cmd, > + NAND_OP_PARSER_PAT_CMD_ELEM(true), > + NAND_OP_PARSER_PAT_ADDR_ELEM(true, MAX_ADDRESS_CYC), > + NAND_OP_PARSER_PAT_CMD_ELEM(true), > + NAND_OP_PARSER_PAT_WAITRDY_ELEM(true), > + NAND_OP_PARSER_PAT_DATA_IN_ELEM(true, MAX_DATA_SIZE)), > + NAND_OP_PARSER_PATTERN( > + rk_nfc_cmd, > + NAND_OP_PARSER_PAT_CMD_ELEM(true), > + NAND_OP_PARSER_PAT_ADDR_ELEM(true, MAX_ADDRESS_CYC), > + NAND_OP_PARSER_PAT_DATA_OUT_ELEM(true, MAX_DATA_SIZE), > + NAND_OP_PARSER_PAT_CMD_ELEM(true), > + NAND_OP_PARSER_PAT_WAITRDY_ELEM(true)), > +); > + > +static int rk_nfc_exec_op(struct nand_chip *chip, > + const struct nand_operation *op, > + bool check_only) > +{ > + if (!check_only) > + rk_nfc_select_chip(chip, op->cs); > + > + return nand_op_parser_exec_op(chip, &rk_nfc_op_parser, op, > + check_only); > +} > + > +static int rk_nfc_setup_data_interface(struct nand_chip *chip, int csline, > + const struct nand_interface_config *conf) Please have a look at the recent changes in the core, this helper should be named "setup_interface". > +{ > + struct rk_nfc *nfc = nand_get_controller_data(chip); > + const struct nand_sdr_timings *timings; > + u32 rate, tc2rw, trwpw, trw2c; > + u32 temp; > + > + if (csline == NAND_DATA_IFACE_CHECK_ONLY) > + return 0; > + > + timings = nand_get_sdr_timings(conf); > + if (IS_ERR(timings)) > + return -EOPNOTSUPP; > + > + if (IS_ERR(nfc->nfc_clk)) > + rate = clk_get_rate(nfc->ahb_clk); > + else > + rate = clk_get_rate(nfc->nfc_clk); > + > + /* Turn clock rate into kHz. */ > + rate /= 1000; > + > + tc2rw = 1; > + trw2c = 1; > + > + trwpw = max(timings->tWC_min, timings->tRC_min) / 1000; > + trwpw = DIV_ROUND_UP(trwpw * rate, 1000000); > + > + temp = timings->tREA_max / 1000; > + temp = DIV_ROUND_UP(temp * rate, 1000000); > + > + if (trwpw < temp) > + trwpw = temp; > + > + /* > + * ACCON: access timing control register > + * ------------------------------------- > + * 31:18: reserved > + * 17:12: csrw, clock cycles from the falling edge of CSn to the > + * falling edge of RDn or WRn > + * 11:11: reserved > + * 10:05: rwpw, the width of RDn or WRn in processor clock cycles > + * 04:00: rwcs, clock cycles from the rising edge of RDn or WRn to the > + * rising edge of CSn > + */ > + temp = ACCTIMING(tc2rw, trwpw, trw2c); > + writel(temp, nfc->regs + NFC_FMWAIT); You should save the chip's timing configuration instead of writing it here, and setting the register value during chip selection. This way you may handle several chips with different timing constraints/configurations. > + > + return 0; > +} > + > +static int rk_nfc_hw_ecc_setup(struct nand_chip *chip, > + struct nand_ecc_ctrl *ecc, > + uint32_t strength) > +{ > + struct rk_nfc *nfc = nand_get_controller_data(chip); > + u32 reg, i; > + > + for (i = 0; i < NFC_ECC_MAX_MODES; i++) { > + if (ecc->strength == nfc->cfg->ecc_strengths[i]) { > + reg = nfc->cfg->ecc_cfgs[i]; > + break; > + } > + } > + > + if (i >= NFC_ECC_MAX_MODES) > + return -EINVAL; > + > + writel(reg, nfc->regs + nfc->cfg->bchctl_off); Same here, if you handle different chips, they may use different ECC configurations, this should be handled. > + > + return 0; > +} > + > +static void rk_nfc_xfer_start(struct rk_nfc *nfc, u8 rw, u8 n_KB, > + dma_addr_t dma_data, dma_addr_t dma_oob) > +{ > + u32 dma_reg, fl_reg, bch_reg; > + > + dma_reg = DMA_ST | ((!rw) << DMA_WR) | DMA_EN | (2 << DMA_AHB_SIZE) | > + (7 << DMA_BURST_SIZE) | (16 << DMA_INC_NUM); > + > + fl_reg = (rw << FLCTL_WR) | FLCTL_XFER_EN | FLCTL_ACORRECT | > + (n_KB << FLCTL_XFER_SECTOR) | FLCTL_TOG_FIX; > + > + if (nfc->cfg->type == NFC_V6 || nfc->cfg->type == NFC_V8) { > + bch_reg = readl_relaxed(nfc->regs + nfc->cfg->bchctl_off); > + bch_reg = (bch_reg & (~BCHCTL_BANK_M)) | > + (nfc->selected_bank << BCHCTL_BANK); > + writel(bch_reg, nfc->regs + nfc->cfg->bchctl_off); > + } > + > + writel(dma_reg, nfc->regs + nfc->cfg->dma_cfg_off); > + writel((u32)dma_data, nfc->regs + nfc->cfg->dma_data_buf_off); > + writel((u32)dma_oob, nfc->regs + nfc->cfg->dma_oob_buf_off); > + writel(fl_reg, nfc->regs + nfc->cfg->flctl_off); > + fl_reg |= FLCTL_XFER_ST; > + writel(fl_reg, nfc->regs + nfc->cfg->flctl_off); > +} > + > +static int rk_nfc_wait_for_xfer_done(struct rk_nfc *nfc) > +{ > + void __iomem *ptr; > + int ret = 0; > + u32 reg; > + > + ptr = nfc->regs + nfc->cfg->flctl_off; > + > + ret = readl_relaxed_poll_timeout(ptr, reg, > + reg & FLCTL_XFER_READY, > + 10, NFC_TIMEOUT); > + > + return ret; > +} > + > +static int rk_nfc_write_page_raw(struct nand_chip *chip, const u8 *buf, > + int oob_on, int page) > +{ > + struct mtd_info *mtd = nand_to_mtd(chip); > + struct rk_nfc *nfc = nand_get_controller_data(chip); > + struct nand_ecc_ctrl *ecc = &chip->ecc; > + int ret = 0; > + u32 i; > + > + if (!buf) > + memset(nfc->buffer, 0xff, mtd->writesize + mtd->oobsize); > + > + for (i = 0; i < ecc->steps; i++) { > + /* Copy data to nfc buffer. */ > + if (buf) > + memcpy(rk_nfc_data_ptr(chip, i), > + rk_nfc_buf_to_data_ptr(chip, buf, i), > + ecc->size); > + /* > + * The first four bytes of OOB are reserved for the > + * boot ROM. In some debugging cases, such as with a > + * read, erase and write back test these 4 bytes stored > + * in OOB also need to be written back. > + */ The controller driver should not arbitrate this. If you don't want to expose these bytes, they should not appear "free" in the OOB layout, but a raw access *must* but able to address the entire page/oob. > + if (!i) > + memcpy(rk_nfc_oob_ptr(chip, i), > + rk_nfc_buf_to_oob_ptr(chip, ecc->steps - 1), > + NFC_SYS_DATA_SIZE); > + else > + memcpy(rk_nfc_oob_ptr(chip, i), > + rk_nfc_buf_to_oob_ptr(chip, i - 1), > + NFC_SYS_DATA_SIZE); > + /* Copy ECC data to the NFC buffer. */ > + memcpy(rk_nfc_oob_ptr(chip, i) + NFC_SYS_DATA_SIZE, > + rk_nfc_buf_to_oob_ecc_ptr(chip, i), > + ecc->bytes); > + } > + > + nand_prog_page_begin_op(chip, page, 0, NULL, 0); > + rk_nfc_write_buf(nfc, buf, mtd->writesize + mtd->oobsize); > + ret = nand_prog_page_end_op(chip); > + > + /* > + * Deselect the currently selected target after the ops is done > + * to reduce the power consumption. > + */ > + rk_nfc_select_chip(chip, -1); > + > + return ret; > +} > + > +static int rk_nfc_write_oob(struct nand_chip *chip, int page) > +{ > + return rk_nfc_write_page_raw(chip, NULL, 1, page); Not sure this is relevant. You should not do that, I guess the core will automatically take care of it. > +} > + > +static int rk_nfc_write_page_hwecc(struct nand_chip *chip, const u8 *buf, > + int oob_on, int page) > +{ > + struct mtd_info *mtd = nand_to_mtd(chip); > + struct rk_nfc *nfc = nand_get_controller_data(chip); > + struct rk_nfc_nand_chip *rknand = rk_nfc_to_rknand(chip); > + struct nand_ecc_ctrl *ecc = &chip->ecc; > + int oob_step = (ecc->bytes > 60) ? NFC_MAX_OOB_PER_STEP : > + NFC_MIN_OOB_PER_STEP; > + int pages_per_blk = mtd->erasesize / mtd->writesize; > + int ret = 0, i, boot_rom_mode = 0; > + dma_addr_t dma_data, dma_oob; > + u32 reg; > + u8 *oob; > + > + nand_prog_page_begin_op(chip, page, 0, NULL, 0); > + > + memcpy(nfc->page_buf, buf, mtd->writesize); > + > + /* > + * The first blocks (4, 8 or 16 depending on the device) are used > + * by the boot ROM and the first 32 bits of OOB need to link to > + * the next page address in the same block. We can't directly copy > + * OOB data from the MTD framework, because this page address > + * conflicts for example with the bad block marker (BBM), > + * so we shift all OOB data including the BBM with 4 byte positions. > + * As a consequence the OOB size available to the MTD framework is > + * also reduced with 4 bytes. > + * > + * PA0 PA1 PA2 PA3 | BBM OOB1 OOB2 OOB3 | ... > + * > + * If a NAND is not a boot medium or the page is not a boot block, > + * the first 4 bytes are left untouched by writing 0xFF to them. > + * > + * 0xFF 0xFF 0xFF 0xFF | BBM OOB1 OOB2 OOB3 | ... > + * > + * Configure the ECC algorithm supported by the boot ROM. > + */ > + if ((page < pages_per_blk * rknand->boot_blks) && > + (chip->options & NAND_IS_BOOT_MEDIUM)) { > + boot_rom_mode = 1; > + if (rknand->boot_ecc != ecc->strength) > + rk_nfc_hw_ecc_setup(chip, ecc, > + rknand->boot_ecc); > + } > + > + for (i = 0; i < ecc->steps; i++) { > + if (!i) { > + reg = 0xFFFFFFFF; > + } else { > + oob = chip->oob_poi + (i - 1) * NFC_SYS_DATA_SIZE; > + reg = oob[0] | oob[1] << 8 | oob[2] << 16 | > + oob[3] << 24; > + } > + if (!i && boot_rom_mode) > + reg = (page & (pages_per_blk - 1)) * 4; > + > + if (nfc->cfg->type == NFC_V9) > + nfc->oob_buf[i] = reg; > + else > + nfc->oob_buf[i * (oob_step / 4)] = reg; > + } > + > + dma_data = dma_map_single(nfc->dev, (void *)nfc->page_buf, > + mtd->writesize, DMA_TO_DEVICE); > + dma_oob = dma_map_single(nfc->dev, nfc->oob_buf, > + ecc->steps * oob_step, > + DMA_TO_DEVICE); > + > + reinit_completion(&nfc->done); > + writel(INT_DMA, nfc->regs + nfc->cfg->int_en_off); > + > + rk_nfc_xfer_start(nfc, NFC_WRITE, ecc->steps, dma_data, > + dma_oob); > + ret = wait_for_completion_timeout(&nfc->done, > + msecs_to_jiffies(100)); > + if (!ret) > + dev_warn(nfc->dev, "write: wait dma done timeout.\n"); > + /* > + * Whether the DMA transfer is completed or not. The driver > + * needs to check the NFC`s status register to see if the data > + * transfer was completed. > + */ > + ret = rk_nfc_wait_for_xfer_done(nfc); > + > + dma_unmap_single(nfc->dev, dma_data, mtd->writesize, > + DMA_TO_DEVICE); > + dma_unmap_single(nfc->dev, dma_oob, ecc->steps * oob_step, > + DMA_TO_DEVICE); > + > + if (boot_rom_mode && rknand->boot_ecc != ecc->strength) > + rk_nfc_hw_ecc_setup(chip, ecc, ecc->strength); > + > + if (ret) { > + ret = -EIO; > + dev_err(nfc->dev, > + "write: wait transfer done timeout.\n"); > + } > + > + if (ret) > + return ret; > + > + ret = nand_prog_page_end_op(chip); > + > + /* > + * Deselect the currently selected target after the ops is done > + * to reduce the power consumption. > + */ If you force this deselection, your should probably do it even in case of error? > + rk_nfc_select_chip(chip, -1); > + > + return ret; > +} > + > +static int rk_nfc_read_page_raw(struct nand_chip *chip, u8 *buf, int oob_on, > + int page) > +{ > + struct mtd_info *mtd = nand_to_mtd(chip); > + struct rk_nfc *nfc = nand_get_controller_data(chip); > + struct nand_ecc_ctrl *ecc = &chip->ecc; > + int i; > + > + nand_read_page_op(chip, page, 0, NULL, 0); > + rk_nfc_read_buf(nfc, nfc->buffer, mtd->writesize + mtd->oobsize); > + > + /* > + * Deselect the currently selected target after the ops is done > + * to reduce the power consumption. > + */ > + rk_nfc_select_chip(chip, -1); > + > + for (i = 0; i < ecc->steps; i++) { > + /* > + * The first four bytes of OOB are reserved for the > + * boot ROM. In some debugging cases, such as with a read, > + * erase and write back test, these 4 bytes also must be > + * saved somewhere, otherwise this information will be > + * lost during a write back. Ditto > + */ > + if (!i) > + memcpy(rk_nfc_buf_to_oob_ptr(chip, ecc->steps - 1), > + rk_nfc_oob_ptr(chip, i), > + NFC_SYS_DATA_SIZE); > + else > + memcpy(rk_nfc_buf_to_oob_ptr(chip, i - 1), > + rk_nfc_oob_ptr(chip, i), > + NFC_SYS_DATA_SIZE); > + /* Copy ECC data from the NFC buffer. */ > + memcpy(rk_nfc_buf_to_oob_ecc_ptr(chip, i), > + rk_nfc_oob_ptr(chip, i) + NFC_SYS_DATA_SIZE, > + ecc->bytes); > + /* Copy data from the NFC buffer. */ > + if (buf) > + memcpy(rk_nfc_buf_to_data_ptr(chip, buf, i), > + rk_nfc_data_ptr(chip, i), > + ecc->size); > + } > + > + return 0; > +} > + > +static int rk_nfc_read_oob(struct nand_chip *chip, int page) > +{ > + return rk_nfc_read_page_raw(chip, NULL, 1, page); Ditto > +} > + > +static int rk_nfc_read_page_hwecc(struct nand_chip *chip, u8 *buf, int oob_on, > + int page) > +{ > + struct mtd_info *mtd = nand_to_mtd(chip); > + struct rk_nfc *nfc = nand_get_controller_data(chip); > + struct rk_nfc_nand_chip *rknand = rk_nfc_to_rknand(chip); > + struct nand_ecc_ctrl *ecc = &chip->ecc; > + int oob_step = (ecc->bytes > 60) ? NFC_MAX_OOB_PER_STEP : > + NFC_MIN_OOB_PER_STEP; > + int pages_per_blk = mtd->erasesize / mtd->writesize; > + dma_addr_t dma_data, dma_oob; > + int ret = 0, i, boot_rom_mode = 0; > + int bitflips = 0, bch_st; > + u8 *oob; > + u32 tmp; > + > + nand_read_page_op(chip, page, 0, NULL, 0); > + > + dma_data = dma_map_single(nfc->dev, nfc->page_buf, > + mtd->writesize, > + DMA_FROM_DEVICE); > + dma_oob = dma_map_single(nfc->dev, nfc->oob_buf, > + ecc->steps * oob_step, > + DMA_FROM_DEVICE); > + > + /* > + * The first blocks (4, 8 or 16 depending on the device) > + * are used by the boot ROM. > + * Configure the ECC algorithm supported by the boot ROM. > + */ > + if ((page < pages_per_blk * rknand->boot_blks) && > + (chip->options & NAND_IS_BOOT_MEDIUM)) { > + boot_rom_mode = 1; > + if (rknand->boot_ecc != ecc->strength) > + rk_nfc_hw_ecc_setup(chip, ecc, > + rknand->boot_ecc); > + } > + > + reinit_completion(&nfc->done); > + writel(INT_DMA, nfc->regs + nfc->cfg->int_en_off); > + rk_nfc_xfer_start(nfc, NFC_READ, ecc->steps, dma_data, > + dma_oob); > + ret = wait_for_completion_timeout(&nfc->done, > + msecs_to_jiffies(100)); > + if (!ret) > + dev_warn(nfc->dev, "read: wait dma done timeout.\n"); > + /* > + * Whether the DMA transfer is completed or not. The driver > + * needs to check the NFC`s status register to see if the data > + * transfer was completed. > + */ > + ret = rk_nfc_wait_for_xfer_done(nfc); > + dma_unmap_single(nfc->dev, dma_data, mtd->writesize, > + DMA_FROM_DEVICE); > + dma_unmap_single(nfc->dev, dma_oob, ecc->steps * oob_step, > + DMA_FROM_DEVICE); > + > + if (ret) { > + bitflips = -EIO; > + dev_err(nfc->dev, > + "read: wait transfer done timeout.\n"); > + goto out; > + } > + > + for (i = 1; i < ecc->steps; i++) { > + oob = chip->oob_poi + (i - 1) * NFC_SYS_DATA_SIZE; > + if (nfc->cfg->type == NFC_V9) > + tmp = nfc->oob_buf[i]; > + else > + tmp = nfc->oob_buf[i * (oob_step / 4)]; > + *oob++ = (u8)tmp; > + *oob++ = (u8)(tmp >> 8); > + *oob++ = (u8)(tmp >> 16); > + *oob++ = (u8)(tmp >> 24); > + } > + > + for (i = 0; i < (ecc->steps / 2); i++) { > + bch_st = readl_relaxed(nfc->regs + > + nfc->cfg->bch_st_off + i * 4); > + if (bch_st & BIT(nfc->cfg->ecc0.err_flag_bit) || > + bch_st & BIT(nfc->cfg->ecc1.err_flag_bit)) { > + mtd->ecc_stats.failed++; > + bitflips = 0; > + } else { > + ret = ECC_ERR_CNT(bch_st, nfc->cfg->ecc0); > + mtd->ecc_stats.corrected += ret; > + bitflips = max_t(u32, bitflips, ret); > + > + ret = ECC_ERR_CNT(bch_st, nfc->cfg->ecc1); > + mtd->ecc_stats.corrected += ret; > + bitflips = max_t(u32, bitflips, ret); > + } > + } > +out: > + memcpy(buf, nfc->page_buf, mtd->writesize); > + > + if (boot_rom_mode && rknand->boot_ecc != ecc->strength) > + rk_nfc_hw_ecc_setup(chip, ecc, ecc->strength); > + > + if (bitflips > ecc->strength) > + dev_err(nfc->dev, "read page: %x ecc error!\n", page); > + > + /* > + * Deselect the currently selected target after the ops is done > + * to reduce the power consumption. > + */ > + rk_nfc_select_chip(chip, -1); > + > + return bitflips; > +} > + > +static inline void rk_nfc_hw_init(struct rk_nfc *nfc) > +{ > + /* Disable flash wp. */ > + writel(FMCTL_WP, nfc->regs + NFC_FMCTL); > + /* Config default timing 40ns at 150 Mhz nfc clock. */ > + writel(0x1081, nfc->regs + NFC_FMWAIT); > + /* Disable randomizer and DMA. */ > + writel(0, nfc->regs + nfc->cfg->randmz_off); > + writel(0, nfc->regs + nfc->cfg->dma_cfg_off); > + writel(FLCTL_RST, nfc->regs + nfc->cfg->flctl_off); > +} > + > +static irqreturn_t rk_nfc_irq(int irq, void *id) > +{ > + struct rk_nfc *nfc = id; > + u32 sta, ien; > + > + sta = readl_relaxed(nfc->regs + nfc->cfg->int_st_off); > + ien = readl_relaxed(nfc->regs + nfc->cfg->int_en_off); > + > + if (!(sta & ien)) > + return IRQ_NONE; > + > + writel(sta, nfc->regs + nfc->cfg->int_clr_off); > + writel(~sta & ien, nfc->regs + nfc->cfg->int_en_off); > + > + complete(&nfc->done); > + > + return IRQ_HANDLED; > +} > + > +static int rk_nfc_enable_clks(struct device *dev, struct rk_nfc *nfc) > +{ > + int ret; > + > + if (!IS_ERR(nfc->nfc_clk)) { > + ret = clk_prepare_enable(nfc->nfc_clk); > + if (ret) { > + dev_err(dev, "failed to enable nfc clk\n"); > + return ret; > + } > + } > + > + ret = clk_prepare_enable(nfc->ahb_clk); > + if (ret) { > + dev_err(dev, "failed to enable ahb clk\n"); > + if (!IS_ERR(nfc->nfc_clk)) > + clk_disable_unprepare(nfc->nfc_clk); > + return ret; > + } > + > + return 0; > +} > + > +static void rk_nfc_disable_clks(struct rk_nfc *nfc) > +{ > + if (!IS_ERR(nfc->nfc_clk)) > + clk_disable_unprepare(nfc->nfc_clk); > + clk_disable_unprepare(nfc->ahb_clk); > +} > + > +static int rk_nfc_ooblayout_free(struct mtd_info *mtd, int section, > + struct mtd_oob_region *oob_region) > +{ > + struct nand_chip *chip = mtd_to_nand(mtd); > + struct rk_nfc_nand_chip *rknand = rk_nfc_to_rknand(chip); > + > + if (section) > + return -ERANGE; > + > + /* > + * The beginning of the OOB area stores the reserved data for the NFC, > + * the size of the reserved data is NFC_SYS_DATA_SIZE bytes. > + */ > + oob_region->length = rknand->metadata_size - NFC_SYS_DATA_SIZE - 2; > + oob_region->offset = NFC_SYS_DATA_SIZE + 2; > + > + return 0; > +} > + > +static int rk_nfc_ooblayout_ecc(struct mtd_info *mtd, int section, > + struct mtd_oob_region *oob_region) > +{ > + struct nand_chip *chip = mtd_to_nand(mtd); > + struct rk_nfc_nand_chip *rknand = rk_nfc_to_rknand(chip); > + > + if (section) > + return -ERANGE; > + > + oob_region->length = mtd->oobsize - rknand->metadata_size; > + oob_region->offset = rknand->metadata_size; > + > + return 0; > +} > + > +static const struct mtd_ooblayout_ops rk_nfc_ooblayout_ops = { > + .free = rk_nfc_ooblayout_free, > + .ecc = rk_nfc_ooblayout_ecc, > +}; > + > +static int rk_nfc_ecc_init(struct device *dev, struct mtd_info *mtd) > +{ > + struct nand_chip *chip = mtd_to_nand(mtd); > + struct rk_nfc *nfc = nand_get_controller_data(chip); > + struct nand_ecc_ctrl *ecc = &chip->ecc; > + const u8 *strengths = nfc->cfg->ecc_strengths; > + u8 max_strength, nfc_max_strength; > + int i; > + > + nfc_max_strength = nfc->cfg->ecc_strengths[0]; > + /* If optional dt settings not present. */ > + if (!ecc->size || !ecc->strength || > + ecc->strength > nfc_max_strength) { > + chip->ecc.size = 1024; > + ecc->steps = mtd->writesize / ecc->size; > + > + /* > + * HW ECC always requests the number of ECC bytes per 1024 byte > + * blocks. The first 4 OOB bytes are reserved for sys data. > + */ > + max_strength = ((mtd->oobsize / ecc->steps) - 4) * 8 / > + fls(8 * 1024); > + if (max_strength > nfc_max_strength) > + max_strength = nfc_max_strength; > + > + for (i = 0; i < 4; i++) { > + if (max_strength >= strengths[i]) > + break; > + } > + > + if (i >= 4) { > + dev_err(nfc->dev, "Unsupported ECC strength\n"); > + return -EOPNOTSUPP; > + } > + > + ecc->strength = strengths[i]; > + } > + ecc->steps = mtd->writesize / ecc->size; > + ecc->bytes = DIV_ROUND_UP(ecc->strength * fls(8 * 1024), 8); Here you assume 1024 ECC step size, this is wrong. Either the controller only supports 1024 bytes or you officially state somewhere that you don't support more ECC step sizes yet. > + /* HW ECC always work with even numbers of ECC bytes. */ > + ecc->bytes = ALIGN(ecc->bytes, 2); Shouldn't you ensure the number of bytes is rounded up ? > + > + rk_nfc_hw_ecc_setup(chip, ecc, ecc->strength); > + > + return 0; > +} > + Thanks, Miquèl