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=-14.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 F0811C43461 for ; Tue, 15 Sep 2020 08:09:09 +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 77A4520771 for ; Tue, 15 Sep 2020 08:09:09 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="2QWkmVH3" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 77A4520771 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=kGG7enqNszMESfItFxzJIW7XwjH0BHJHajBZtQjJZj4=; b=2QWkmVH3Ocb7LaKQaScd4dvVN +re+m0xwM+mEgZyiY8HL071sF2NIfI0a9XP9Yt6H4uF3AEodLKuj86qW7BxbdLPPkyadfw1jyLEiH 6j0+thiSdJTj82cVPan5yW9/Lu1PSY7BPP41C1HVYRFv0Jy9JopdjuX17StZcOPJtOa0c4ZAVPDL/ fz8osYeAwBQHTnlGJyUFJpwuOlMV4QSjnuirQmBSWxykBkzVqJZXUMTnGxUH9oYB/SlfDYQqT8qHN Mg6awhqJEpchNgwNBkt6EOu+6O5eHSWZLsvAprKXXO8imt+Gj2/67n+TED9s+yvCtYszBeTrigwHt kYDpJ9gdA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kI60C-0004u2-D2; Tue, 15 Sep 2020 08:07:48 +0000 Received: from relay5-d.mail.gandi.net ([217.70.183.197]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kI600-0004s7-MP; Tue, 15 Sep 2020 08:07:39 +0000 X-Originating-IP: 91.224.148.103 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay5-d.mail.gandi.net (Postfix) with ESMTPSA id 538551C000E; Tue, 15 Sep 2020 08:07:29 +0000 (UTC) Date: Tue, 15 Sep 2020 10:07:28 +0200 From: Miquel Raynal To: Yifeng Zhao Subject: Re: [PATCH v8 2/8] mtd: rawnand: rockchip: NFC drivers for RK3308, RK2928 and others Message-ID: <20200915100728.5c866f89@xps13> In-Reply-To: <20200717092420.19798-3-yifeng.zhao@rock-chips.com> References: <20200717092420.19798-1-yifeng.zhao@rock-chips.com> <20200717092420.19798-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-20200915_040737_099718_FB02F21D X-CRM114-Status: GOOD ( 38.10 ) 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 SGkgWWlmZW5nLAoKSSBhbSB2ZXJ5IHNvcnJ5IGZvciB0aGUgZGVsYXkgaXQgdG9vayBtZSB0byBy ZXZpZXcgdGhpcyBkcml2ZXIsIGJ1dAp0aGVyZSBhcmUgc3RpbGwgc29tZSBzbWFsbCBpbmNvaGVy ZW5jZXMgSU1ITywgc2VlIGJlbG93LgoKWWlmZW5nIFpoYW8gPHlpZmVuZy56aGFvQHJvY2stY2hp cHMuY29tPiB3cm90ZSBvbiBGcmksIDE3IEp1bCAyMDIwCjE3OjI0OjE4ICswODAwOgoKPiBUaGlz IGRyaXZlciBzdXBwb3J0cyBSb2NrY2hpcCBORkMgKE5BTkQgRmxhc2ggQ29udHJvbGxlcikgZm91 bmQgb24gUkszMzA4LAo+IFJLMjkyOCwgUktQWDMwLCBSVjExMDggYW5kIG90aGVyIFNPQ3MuIFRo ZSBkcml2ZXIgaGFzIGJlZW4gdGVzdGVkIHVzaW5nCj4gOC1iaXQgTkFORCBpbnRlcmZhY2Ugb24g dGhlIEFSTSBiYXNlZCBSSzMzMDggcGxhdGZvcm0uCj4gCj4gU3VwcG9ydCBSb2NrY2hpcCBTb0Nz IGFuZCBORkMgdmVyc2lvbnM6Cj4gLSBQWDMwIGFuZCBSSzMzMjYoTkZDdjkwMCkuCj4gCUVDQzog MTYvNDAvNjAvNzAgYml0cy8xS0IuCj4gCUNMT0NLOiBhaGIgYW5kIG5mYy4KPiAtIFJLMzMwOCBh bmQgUlYxMTA4KE5GQ3Y4MDApLgo+IAlFQ0M6IDE2IGJpdHMvMUtCLgo+IAlDTE9DSzogYWhiIGFu ZCBuZmMuCj4gLSBSSzMwMzYgYW5kIFJLMzEyOChORkN2NjIyKS4KPiAJRUNDOiAxNi8yNC80MC82 MCBiaXRzLzFLQi4KPiAJQ0xPQ0s6IGFoYiBhbmQgbmZjLgo+IC0gUkszMDY2LCBSSzMxODggYW5k IFJLMjkyOChORkN2NjAwKS4KPiAJRUNDOiAxNi8yNC80MC82MCBiaXRzLzFLQi4KPiAJQ0xPQ0s6 IGFoYi4KPiAKPiBTdXBwb3J0ZWQgZmVhdHVyZXM6Cj4gLSBSZWFkIGZ1bGwgcGFnZSBkYXRhIGJ5 IERNQS4KPiAtIFN1cHBvcnQgSFcgRUNDKG9uZSBzdGVwIGlzIDFLQikuCj4gLSBTdXBwb3J0IDIg LSAzMksgcGFnZSBzaXplLgo+IC0gU3VwcG9ydCA4IENTKGRlcGVuZCBvbiBTb0NzKQo+IAo+IExp bWl0YXRpb25zOgo+IC0gTm8gc3VwcG9ydCBmb3IgdGhlIGVjYyBzdGVwIHNpemUgaXMgNTEyLgo+ IC0gVW50ZXN0ZWQgb24gc29tZSBTb0NzLgo+IC0gTm8gc3VwcG9ydCBmb3Igc3VicGFnZXMuCj4g LSBObyBzdXBwb3J0IGZvciB0aGUgYnVpbHRpbiByYW5kb21pemVyLgo+IC0gVGhlIG9yaWdpbmFs IGJhZCBibG9jayBtYXNrIGlzIG5vdCBzdXBwb3J0ZWQuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVz ZQo+ICAgdGhlIEJCVChiYWQgYmxvY2sgdGFibGUpLgo+IAo+IFNpZ25lZC1vZmYtYnk6IFlpZmVu ZyBaaGFvIDx5aWZlbmcuemhhb0Byb2NrLWNoaXBzLmNvbT4KPiAtLS0KPiAKPiBDaGFuZ2VzIGlu IHY4OiBOb25lCj4gQ2hhbmdlcyBpbiB2NzoKPiAtIFJlYmFzZSB0byBsaW51eC1uZXh0Lgo+IC0g Rml4IGNvZGluZyBzdHlsZS4KPiAtIFJlc2VydmVkIDQgYnl0ZXMgYXQgdGhlIGJlZ2luaW5nIG9m IHRoZSBvb2IgYXJlYS4KPiAtIFBhZ2UgcmF3IHJlYWQgYW5kIHdyaXRlIGluY2x1ZGVkIGVjYyBk YXRhLgo+IAo+IENoYW5nZXMgaW4gdjY6Cj4gLSBUaGUgbXRkLT5uYW1lIHNldCBieSBOQU5EIGxh YmVsIHByb3BlcnR5Lgo+IC0gQWRkIHNvbWUgY29tbWVudHMuCj4gLSBGaXggY29tcGlsZSBlcnJv ci4KPiAKPiBDaGFuZ2VzIGluIHY1Ogo+IC0gQWRkIGJvb3QgYmxvY2tzIHN1cHBvcnQgIHdpdGgg ZGlmZmVyZW50IEVDQyBmb3IgYm9vdFJPTS4KPiAtIFJlbmFtZSByb2NrY2hpcC1uYW5kLmMgdG8g cm9ja2NoaXAtbmFuZC1jb250cm9sbGVyLmMuCj4gLSBVbmlmaWNhdGlvbiBvZiBvdGhlciB2YXJp YWJsZSBuYW1lcy4KPiAtIFJlbW92ZSBzb21lIGNvbXBhdGlibGUgZGVmaW5lLgo+IAo+IENoYW5n ZXMgaW4gdjQ6Cj4gLSBEZWZpbmUgcGxhdGZvcm0gZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSByZWdp c3RlciBvZmZzZXRzLgo+IC0gVGhlIGNvbXBhdGlibGUgZGVmaW5lIHdpdGggcmt4eF9uZmMuCj4g LSBVc2UgU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMgdG8gZGVmaW5lIFBNX09QUy4KPiAtIFVzZSBl eGVjX29wIGluc3RlYWQgb2YgbGVnYWN5IGhvb2tzLgo+IAo+IENoYW5nZXMgaW4gdjM6IE5vbmUK PiBDaGFuZ2VzIGluIHYyOgo+IC0gRml4IGNvbXBpbGUgZXJyb3IuCj4gLSBJbmNsdWRlIGhlYWRl ciBmaWxlcyBzb3J0ZWQgYnkgZmlsZSBuYW1lLgo+IAo+ICBkcml2ZXJzL210ZC9uYW5kL3Jhdy9L Y29uZmlnICAgICAgICAgICAgICAgICAgfCAgIDEyICsKPiAgZHJpdmVycy9tdGQvbmFuZC9yYXcv TWFrZWZpbGUgICAgICAgICAgICAgICAgIHwgICAgMSArCj4gIC4uLi9tdGQvbmFuZC9yYXcvcm9j a2NoaXAtbmFuZC1jb250cm9sbGVyLmMgICB8IDE0MjIgKysrKysrKysrKysrKysrKysKPiAgMyBm aWxlcyBjaGFuZ2VkLCAxNDM1IGluc2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRy aXZlcnMvbXRkL25hbmQvcmF3L3JvY2tjaGlwLW5hbmQtY29udHJvbGxlci5jCj4gCj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvcmF3L0tjb25maWcgYi9kcml2ZXJzL210ZC9uYW5kL3Jh dy9LY29uZmlnCj4gaW5kZXggMTEzZjYxMDUyMjY5Li42NDkyODU1ZDRhNTUgMTAwNjQ0Cj4gLS0t IGEvZHJpdmVycy9tdGQvbmFuZC9yYXcvS2NvbmZpZwo+ICsrKyBiL2RyaXZlcnMvbXRkL25hbmQv cmF3L0tjb25maWcKPiBAQCAtNDYxLDYgKzQ2MSwxOCBAQCBjb25maWcgTVREX05BTkRfQVJBU0FO Cj4gIAkgIEVuYWJsZXMgdGhlIGRyaXZlciBmb3IgdGhlIEFyYXNhbiBOQU5EIGZsYXNoIGNvbnRy b2xsZXIgb24KPiAgCSAgWnlucSBVbHRyYXNjYWxlKyBNUFNvQy4KPiAgCj4gK2NvbmZpZyBNVERf TkFORF9ST0NLQ0hJUAo+ICsJdHJpc3RhdGUgIlJvY2tjaGlwIE5BTkQgY29udHJvbGxlciIKPiAr CWRlcGVuZHMgb24gQVJDSF9ST0NLQ0hJUCAmJiBIQVNfSU9NRU0KPiArCWhlbHAKPiArCSAgRW5h YmxlcyBzdXBwb3J0IGZvciBOQU5EIGNvbnRyb2xsZXIgb24gUm9ja2NoaXAgU29Dcy4KPiArCSAg VGhlcmUgYXJlIGZvdXIgZGlmZmVyZW50IHZlcnNpb25zIG9mIE5BTkQgRkxBU0ggQ29udHJvbGxl cnMsCj4gKwkgIGluY2x1ZGluZzoKPiArCSAgICBORkMgdjYwMDogUksyOTI4LCBSSzMwNjYsIFJL MzE4OAo+ICsJICAgIE5GQyB2NjIyOiBSSzMwMzYsIFJLMzEyOAo+ICsJICAgIE5GQyB2ODAwOiBS SzMzMDgsIFJWMTEwOAo+ICsJICAgIE5GQyB2OTAwOiBQWDMwLCBSSzMzMjYKPiArCj4gIGNvbW1l bnQgIk1pc2MiCj4gIAo+ICBjb25maWcgTVREX1NNX0NPTU1PTgo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL210ZC9uYW5kL3Jhdy9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L01ha2VmaWxl Cj4gaW5kZXggMjkzMGY1YjkwMTVkLi45NjBjOWJlMjUyMDQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVy cy9tdGQvbmFuZC9yYXcvTWFrZWZpbGUKPiArKysgYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9NYWtl ZmlsZQo+IEBAIC01OCw2ICs1OCw3IEBAIG9iai0kKENPTkZJR19NVERfTkFORF9TVE0zMl9GTUMy KQkrPSBzdG0zMl9mbWMyX25hbmQubwo+ICBvYmotJChDT05GSUdfTVREX05BTkRfTUVTT04pCQkr PSBtZXNvbl9uYW5kLm8KPiAgb2JqLSQoQ09ORklHX01URF9OQU5EX0NBREVOQ0UpCQkrPSBjYWRl bmNlLW5hbmQtY29udHJvbGxlci5vCj4gIG9iai0kKENPTkZJR19NVERfTkFORF9BUkFTQU4pCQkr PSBhcmFzYW4tbmFuZC1jb250cm9sbGVyLm8KPiArb2JqLSQoQ09ORklHX01URF9OQU5EX1JPQ0tD SElQKQkJKz0gcm9ja2NoaXAtbmFuZC1jb250cm9sbGVyLm8KPiAgCj4gIG5hbmQtb2JqcyA6PSBu YW5kX2Jhc2UubyBuYW5kX2xlZ2FjeS5vIG5hbmRfYmJ0Lm8gbmFuZF90aW1pbmdzLm8gbmFuZF9p ZHMubwo+ICBuYW5kLW9ianMgKz0gbmFuZF9vbmZpLm8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9t dGQvbmFuZC9yYXcvcm9ja2NoaXAtbmFuZC1jb250cm9sbGVyLmMgYi9kcml2ZXJzL210ZC9uYW5k L3Jhdy9yb2NrY2hpcC1uYW5kLWNvbnRyb2xsZXIuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4g aW5kZXggMDAwMDAwMDAwMDAwLi5mZWMxMzYwNjAzZTAKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIv ZHJpdmVycy9tdGQvbmFuZC9yYXcvcm9ja2NoaXAtbmFuZC1jb250cm9sbGVyLmMKPiBAQCAtMCww ICsxLDE0MjIgQEAKPiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgT1IgTUlU Cj4gKy8qCj4gKyAqIFJvY2tjaGlwIE5BTkQgRmxhc2ggY29udHJvbGxlciBkcml2ZXIuCj4gKyAq IENvcHlyaWdodCAoQykgMjAyMCBSb2NrY2hpcCBJbmMuCj4gKyAqIEF1dGhvcjogWWlmZW5nIFpo YW8gPHlpZmVuZy56aGFvQHJvY2stY2hpcHMuY29tPgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxs aW51eC9jbGsuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4gKyNpbmNsdWRlIDxsaW51 eC9kbWEtbWFwcGluZy5oPgo+ICsjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+Cj4gKyNpbmNs dWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgo+ICsj aW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Cj4g KyNpbmNsdWRlIDxsaW51eC9tdGQvcmF3bmFuZC5oPgo+ICsjaW5jbHVkZSA8bGludXgvb2YuaD4K PiArI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGxhdGZv cm1fZGV2aWNlLmg+Cj4gKwo+ICsvKgo+ICsgKiBORkMgUGFnZSBEYXRhIExheW91dDoKPiArICoJ MTAyNCBCeXRlcyBEYXRhICsgNEJ5dGVzIHN5cyBkYXRhICsgMjhCeXRlc34xMjRCeXRlcyBlY2Mg Kwo+ICsgKgkxMDI0IEJ5dGVzIERhdGEgKyA0Qnl0ZXMgc3lzIGRhdGEgKyAyOEJ5dGVzfjEyNEJ5 dGVzIGVjYyArCj4gKyAqCS4uLi4uLgo+ICsgKiBOQU5EIFBhZ2UgRGF0YSBMYXlvdXQ6Cj4gKyAq CTEwMjQgKiBuIERhdGEgKyBtIEJ5dGVzIG9vYgo+ICsgKiBPcmlnaW5hbCBCYWQgQmxvY2sgTWFz ayBMb2NhdGlvbjoKPiArICoJRmlyc3QgYnl0ZSBvZiBvb2Ioc3BhcmUpLgo+ICsgKiBuYW5kX2No aXAtPm9vYl9wb2kgZGF0YSBsYXlvdXQ6Cj4gKyAqCTRCeXRlcyBzeXMgZGF0YSArIC4uLi4gKyA0 Qnl0ZXMgc3lzIGRhdGEgKyBlY2MgZGF0YS4KPiArICovCj4gKwo+ICsvKiBOQU5EIGNvbnRyb2xs ZXIgcmVnaXN0ZXIgZGVmaW5pdGlvbiAqLwo+ICsjZGVmaW5lCU5GQ19SRUFECQkoMCkKPiArI2Rl ZmluZQlORkNfV1JJVEUJCSgxKQo+ICsjZGVmaW5lCU5GQ19GTUNUTAkJKDB4MDApCj4gKyNkZWZp bmUJCUZNQ1RMX0NFX1NFTF9NCQkweEZGCgpOaXRwaWNraW5nOiBJJ2QgcHJlZmVyCgojZGVmaW5l CU5GQ19GTUNUTAkJMHgwMAojZGVmaW5lCSAgRk1DVExfQ0VfU0VMX00JMHhGRgoKCj4gKyNkZWZp bmUJCUZNQ1RMX0NFX1NFTCh4KQkJKDEgPDwgKHgpKQo+ICsjZGVmaW5lCQlGTUNUTF9XUAkJQklU KDgpCj4gKyNkZWZpbmUJCUZNQ1RMX1JEWQkJQklUKDkpCj4gKyNkZWZpbmUJTkZDX0ZNV0FJVAkJ KDB4MDQpCj4gKyNkZWZpbmUJCUZMQ1RMX1JTVAkJQklUKDApCj4gKyNkZWZpbmUJCUZMQ1RMX1dS CQkoMSkJLyogMDogcmVhZCwgMTogd3JpdGUgKi8KPiArI2RlZmluZQkJRkxDVExfWEZFUl9TVAkJ QklUKDIpCj4gKyNkZWZpbmUJCUZMQ1RMX1hGRVJfRU4JCUJJVCgzKQo+ICsjZGVmaW5lCQlGTENU TF9BQ09SUkVDVAkJQklUKDEwKSAvKiBBdXRvIGNvcnJlY3QgZXJyb3IgYml0cy4gKi8KPiArI2Rl ZmluZQkJRkxDVExfWEZFUl9SRUFEWQlCSVQoMjApCj4gKyNkZWZpbmUJCUZMQ1RMX1hGRVJfU0VD VE9SCSgyMikKPiArI2RlZmluZQkJRkxDVExfVE9HX0ZJWAkJQklUKDI5KQo+ICsjZGVmaW5lCQlC Q0hDVExfQkFOS19NCSg3IDw8IDUpCj4gKyNkZWZpbmUJCUJDSENUTF9CQU5LCSg1KQo+ICsjZGVm aW5lCQlETUFfU1QJCQlCSVQoMCkKPiArI2RlZmluZQkJRE1BX1dSCQkJKDEpCS8qIDA6IHdyaXRl LCAxOiByZWFkICovCj4gKyNkZWZpbmUJCURNQV9FTgkJCUJJVCgyKQo+ICsjZGVmaW5lCQlETUFf QUhCX1NJWkUJCSgzKQkvKiAwOiAxLCAxOiAyLCAyOiA0ICovCj4gKyNkZWZpbmUJCURNQV9CVVJT VF9TSVpFCQkoNikJLyogMDogMSwgMzogNCwgNTogOCwgNzogMTYgKi8KPiArI2RlZmluZQkJRE1B X0lOQ19OVU0JCSg5KQkvKiAxIC0gMTYgKi8KPiArI2RlZmluZQkJRUNDX0VSUl9DTlQoeCwgZSkg KCgoKHgpID4+IChlKS5sb3cpICYgKGUpLmxvd19tYXNrKSBcCj4gKwkJCXwgKCgoeCkgPj4gKGUp LmhpZ2gpICYgKGUpLmhpZ2hfbWFzaykgPDwgKGUpLmxvd19ibikKPiArI2RlZmluZQkJSU5UX0RN QQkJCUJJVCgwKQo+ICsjZGVmaW5lCU5GQ19CQU5LCQkoMHg4MDApCj4gKyNkZWZpbmUJTkZDX0JB TktfU1RFUAkJKDB4MTAwKQo+ICsjZGVmaW5lCQlCQU5LX0RBVEEJCSgweDAwKQo+ICsjZGVmaW5l CQlCQU5LX0FERFIJCSgweDA0KQo+ICsjZGVmaW5lCQlCQU5LX0NNRAkJKDB4MDgpCj4gKyNkZWZp bmUJTkZDX1NSQU0wCQkoMHgxMDAwKQo+ICsjZGVmaW5lCU5GQ19TUkFNMQkJKDB4MTQwMCkKPiAr I2RlZmluZQlORkNfU1JBTV9TSVpFCQkoMHg0MDApCj4gKyNkZWZpbmUJTkZDX1RJTUVPVVQJCSg1 MDAwMDApCj4gKyNkZWZpbmUJTkZDX01BWF9PT0JfUEVSX1NURVAJMTI4Cj4gKyNkZWZpbmUJTkZD X01JTl9PT0JfUEVSX1NURVAJNjQKPiArI2RlZmluZQlNQVhfREFUQV9TSVpFCQkweEZGRkMKPiAr I2RlZmluZQlNQVhfQUREUkVTU19DWUMJCTYKPiArI2RlZmluZQlORkNfRUNDX01BWF9NT0RFUwk0 Cj4gKyNkZWZpbmUJTkZDX01BWF9OU0VMUwkJKDgpIC8qIFNvbWUgU29jcyBvbmx5IGhhdmUgMSBv ciAyIENTcy4gKi8KPiArI2RlZmluZQlORkNfU1lTX0RBVEFfU0laRQkoNCkgLyogNCBieXRlcyBz eXMgZGF0YSBpbiBvb2IgcHJlIDEwMjQgZGF0YS4qLwo+ICsjZGVmaW5lCVJLX0RFRkFVTFRfQ0xP Q0tfUkFURQkoMTUwICogMTAwMCAqIDEwMDApIC8qIDE1MCBNaHogKi8KPiArI2RlZmluZQlBQ0NU SU1JTkcoY3NydywgcndwdywgcndjcykgKChjc3J3KSA8PCAxMiB8IChyd3B3KSA8PCA1IHwgKHJ3 Y3MpKQo+ICsKPiArZW51bSBuZmNfdHlwZSB7Cj4gKwlORkNfVjYsCj4gKwlORkNfVjgsCj4gKwlO RkNfVjksCj4gK307Cj4gKwo+ICsvKioKPiArICogc3RydWN0IHJrX2VjY19jbnRfc3RhdHVzOiBy ZXByZXNlbnQgYSBlY2Mgc3RhdHVzIGRhdGEuCj4gKyAqIEBlcnJfZmxhZ19iaXQ6IGVycm9yIGZs YWcgYml0IGluZGV4IGF0IHJlZ2lzdGVyLgo+ICsgKiBAbG93OiBlY2MgY291bnQgbG93IGJpdCBp bmRleCBhdCByZWdpc3Rlci4KPiArICogQGxvd19tYXNrOiBtYXNrIGJpdC4KPiArICogQGxvd19i bjogZWNjIGNvdW50IGxvdyBiaXQgbnVtYmVyLgo+ICsgKiBAaGlnaDogZWNjIGNvdW50IGhpZ2gg Yml0IGluZGV4IGF0IHJlZ2lzdGVyLgo+ICsgKiBAaGlnaF9tYXNrOiBtYXNrIGJpdAo+ICsgKi8K PiArc3RydWN0IGVjY19jbnRfc3RhdHVzIHsKPiArCXU4IGVycl9mbGFnX2JpdDsKPiArCXU4IGxv dzsKPiArCXU4IGxvd19tYXNrOwo+ICsJdTggbG93X2JuOwo+ICsJdTggaGlnaDsKPiArCXU4IGhp Z2hfbWFzazsKPiArfTsKPiArCj4gKy8qCj4gKyAqIEB0eXBlOiBuZmMgdmVyc2lvbgo+ICsgKiBA ZWNjX3N0cmVuZ3RoczogZWNjIHN0cmVuZ3Rocwo+ICsgKiBAZWNjX2NmZ3M6IGVjYyBjb25maWcg dmFsdWVzCj4gKyAqIEBmbGN0bF9vZmY6IEZMQ1RMIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAYmNo Y3RsX29mZjogQkNIQ1RMIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAZG1hX2RhdGFfYnVmX29mZjog RE1BX0RBVEFfQlVGIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAZG1hX29vYl9idWZfb2ZmOiBETUFf T09CX0JVRiByZWdpc3RlciBvZmZzZXQKPiArICogQGRtYV9jZmdfb2ZmOiBETUFfQ0ZHIHJlZ2lz dGVyIG9mZnNldAo+ICsgKiBAZG1hX3N0X29mZjogRE1BX1NUIHJlZ2lzdGVyIG9mZnNldAo+ICsg KiBAYmNoX3N0X29mZjogQkNHX1NUIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAcmFuZG16X29mZjog UkFORE1aIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAaW50X2VuX29mZjogaW50ZXJydXB0IGVuYWJs ZSByZWdpc3RlciBvZmZzZXQKPiArICogQGludF9jbHJfb2ZmOiBpbnRlcnJ1cHQgY2xlYW4gcmVn aXN0ZXIgb2Zmc2V0Cj4gKyAqIEBpbnRfc3Rfb2ZmOiBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVy IG9mZnNldAo+ICsgKiBAb29iMF9vZmY6IG9vYjAgcmVnaXN0ZXIgb2Zmc2V0Cj4gKyAqIEBvb2Ix X29mZjogb29iMSByZWdpc3RlciBvZmZzZXQKPiArICogQGVjYzA6IHJlcHJlc2VudCBFQ0MwIHN0 YXR1cyBkYXRhCj4gKyAqIEBlY2MxOiByZXByZXNlbnQgRUNDMSBzdGF0dXMgZGF0YQo+ICsgKi8K PiArc3RydWN0IG5mY19jZmcgewo+ICsJZW51bSBuZmNfdHlwZSB0eXBlOwo+ICsJdTggZWNjX3N0 cmVuZ3Roc1tORkNfRUNDX01BWF9NT0RFU107Cj4gKwl1MzIgZWNjX2NmZ3NbTkZDX0VDQ19NQVhf TU9ERVNdOwo+ICsJdTMyIGZsY3RsX29mZjsKPiArCXUzMiBiY2hjdGxfb2ZmOwo+ICsJdTMyIGRt YV9jZmdfb2ZmOwo+ICsJdTMyIGRtYV9kYXRhX2J1Zl9vZmY7Cj4gKwl1MzIgZG1hX29vYl9idWZf b2ZmOwo+ICsJdTMyIGRtYV9zdF9vZmY7Cj4gKwl1MzIgYmNoX3N0X29mZjsKPiArCXUzMiByYW5k bXpfb2ZmOwo+ICsJdTMyIGludF9lbl9vZmY7Cj4gKwl1MzIgaW50X2Nscl9vZmY7Cj4gKwl1MzIg aW50X3N0X29mZjsKPiArCXUzMiBvb2IwX29mZjsKPiArCXUzMiBvb2IxX29mZjsKPiArCXN0cnVj dCBlY2NfY250X3N0YXR1cyBlY2MwOwo+ICsJc3RydWN0IGVjY19jbnRfc3RhdHVzIGVjYzE7Cj4g K307Cj4gKwo+ICtzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCB7Cj4gKwlzdHJ1Y3QgbGlzdF9oZWFk IG5vZGU7Cj4gKwlzdHJ1Y3QgbmFuZF9jaGlwIGNoaXA7Cj4gKwo+ICsJdTE2IHNwYXJlX3Blcl9z ZWN0b3I7Cj4gKwl1MTYgb29iX2J1Zl9wZXJfc2VjdG9yOwo+ICsJdTE2IGJvb3RfYmxrczsKPiAr CXUxNiBib290X2VjYzsKPiArCXUxNiBtZXRhZGF0YV9zaXplOwo+ICsKPiArCXU4IG5zZWxzOwo+ ICsJdTggc2Vsc1swXTsKPiArCS8qIE5vdGhpbmcgYWZ0ZXIgdGhpcyBmaWVsZC4gKi8KPiArfTsK PiArCj4gK3N0cnVjdCBya19uZmNfY2xrIHsKPiArCWludCBuZmNfcmF0ZTsKPiArCXN0cnVjdCBj bGsgKm5mY19jbGs7Cj4gKwlzdHJ1Y3QgY2xrICphaGJfY2xrOwoKTm90IHN1cmUgdGhpcyBkZXNl cnZlcyBpdHMgb3duIHN0cnVjdHVyZT8KCj4gK307Cj4gKwo+ICtzdHJ1Y3QgcmtfbmZjIHsKPiAr CXN0cnVjdCBuYW5kX2NvbnRyb2xsZXIgY29udHJvbGxlcjsKPiArCXN0cnVjdCBya19uZmNfY2xr IGNsazsKPiArCj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cj4gKwljb25zdCBzdHJ1Y3QgbmZjX2Nm ZyAqY2ZnOwo+ICsJdm9pZCBfX2lvbWVtICpyZWdzOwo+ICsKPiArCWludCBzZWxlY3RlZF9iYW5r Owo+ICsJaW50IGJhbmRfb2Zmc2V0Owo+ICsKPiArCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7Cj4g KwlzdHJ1Y3QgbGlzdF9oZWFkIGNoaXBzOwo+ICsKPiArCXU4ICpidWZmZXI7Cj4gKwl1OCAqcGFn ZV9idWY7Cj4gKwl1MzIgKm9vYl9idWY7Cj4gKwo+ICsJdW5zaWduZWQgbG9uZyBhc3NpZ25lZF9j czsKPiArfTsKPiArCj4gK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnRv X3JrbmFuZChzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwKQo+ICt7Cj4gKwlyZXR1cm4gY29udGFpbmVy X29mKGNoaXAsIHN0cnVjdCBya19uZmNfbmFuZF9jaGlwLCBjaGlwKTsKPiArfQo+ICsKPiArc3Rh dGljIGlubGluZSB1OCAqZGF0YV9wdHIoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgdTgg KnAsIGludCBpKQoKcmtfbmZjX2J1Zl90b19kYXRhX3B0ciA/Cgo+ICt7Cj4gKwlyZXR1cm4gKHU4 ICopcCArIGkgKiBjaGlwLT5lY2Muc2l6ZTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB1OCAq b29iX3B0cihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgaSkKCnNhbWUgaGVyZQoKPiArewo+ ICsJdTggKnBvaTsKPiArCj4gKwlwb2kgPSBjaGlwLT5vb2JfcG9pICsgaSAqIE5GQ19TWVNfREFU QV9TSVpFOwo+ICsKPiArCXJldHVybiBwb2k7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdTgg Km9vYl9lY2NfcHRyKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGludCBpKQoKc2FtZSBoZXJlCgo+ ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCAqcmtuYW5kID0gdG9fcmtuYW5kKGNoaXAp Owo+ICsJdTggKnBvaTsKPiArCj4gKwlwb2kgPSBjaGlwLT5vb2JfcG9pICsgcmtuYW5kLT5tZXRh ZGF0YV9zaXplICsKPiArCSAgICAgIGNoaXAtPmVjYy5ieXRlcyAqIGk7Cj4gKwo+ICsJcmV0dXJu IHBvaTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSBpbnQgcmtfZGF0YV9sZW4oc3RydWN0IG5h bmRfY2hpcCAqY2hpcCkKClBsZWFzZSBwcmVwZW5kIGFsbCB5b3UgZnVuY3Rpb25zIHdpdGggcmtf bmZjXwoKPiArewo+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHRvX3JrbmFu ZChjaGlwKTsKPiArCj4gKwlyZXR1cm4gY2hpcC0+ZWNjLnNpemUgKyBya25hbmQtPnNwYXJlX3Bl cl9zZWN0b3I7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdTggKnJrX2RhdGFfcHRyKHN0cnVj dCBuYW5kX2NoaXAgKmNoaXAsICBpbnQgaSkKPiArewo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0g bmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsKPiArCXJldHVybiBuZmMtPmJ1ZmZl ciArIGkgKiBya19kYXRhX2xlbihjaGlwKTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB1OCAq cmtfb29iX3B0cihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgaSkKPiArewo+ICsJc3RydWN0 IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsKPiArCXJl dHVybiBuZmMtPmJ1ZmZlciArIGkgKiBya19kYXRhX2xlbihjaGlwKSArIGNoaXAtPmVjYy5zaXpl Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBya19uZmNfc2VsZWN0X2NoaXAoc3RydWN0IG5hbmRf Y2hpcCAqY2hpcCwgaW50IGNzKQo+ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dl dF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4gKwlzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCAqcmtu YW5kID0gdG9fcmtuYW5kKGNoaXApOwo+ICsJdTMyIHZhbDsKPiArCj4gKwlpZiAoY3MgPCAwKSB7 Cj4gKwkJbmZjLT5zZWxlY3RlZF9iYW5rID0gLTE7Cj4gKwkJLyogRGVzZWxlY3QgdGhlIGN1cnJl bnRseSBzZWxlY3RlZCB0YXJnZXQuICovCj4gKwkJdmFsID0gcmVhZGxfcmVsYXhlZChuZmMtPnJl Z3MgKyBORkNfRk1DVEwpOwo+ICsJCXZhbCAmPSB+Rk1DVExfQ0VfU0VMX007Cj4gKwkJd3JpdGVs KHZhbCwgbmZjLT5yZWdzICsgTkZDX0ZNQ1RMKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJ bmZjLT5zZWxlY3RlZF9iYW5rID0gcmtuYW5kLT5zZWxzW2NzXTsKPiArCW5mYy0+YmFuZF9vZmZz ZXQgPSBORkNfQkFOSyArIG5mYy0+c2VsZWN0ZWRfYmFuayAqIE5GQ19CQU5LX1NURVA7Cj4gKwo+ ICsJdmFsID0gcmVhZGxfcmVsYXhlZChuZmMtPnJlZ3MgKyBORkNfRk1DVEwpOwo+ICsJdmFsICY9 IH5GTUNUTF9DRV9TRUxfTTsKPiArCXZhbCB8PSBGTUNUTF9DRV9TRUwobmZjLT5zZWxlY3RlZF9i YW5rKTsKPiArCj4gKwl3cml0ZWwodmFsLCBuZmMtPnJlZ3MgKyBORkNfRk1DVEwpOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgaW5saW5lIGludCBya19uZmNfd2FpdF9pb3JlYWR5KHN0cnVjdCBya19uZmMg Km5mYykKPiArewo+ICsJaW50IHJjOwo+ICsJdTMyIHZhbDsKPiArCj4gKwlyYyA9IHJlYWRsX3Bv bGxfdGltZW91dF9hdG9taWMobmZjLT5yZWdzICsgTkZDX0ZNQ1RMLCB2YWwsCj4gKwkJCQkgICAg ICAgdmFsICYgRk1DVExfUkRZLCAxMCwgTkZDX1RJTUVPVVQpOwoKRG8geW91IHJlYWxseSBuZWVk IGl0IHRvIGJlIGF0b21pYyA/IC0+ZXhlY19vcCgpIGlzIG5vdCBjYWxsZWQgaW4gYW4KYXRvbWlj IGNvbnRleHQuCgo+ICsKPiArCXJldHVybiByYzsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB1 OCBya19uZmNfcmVhZF9ieXRlKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXApCj4gK3sKPiArCXN0cnVj dCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsKPiArCj4gKwly ZXR1cm4gcmVhZGJfcmVsYXhlZChuZmMtPnJlZ3MgKyBuZmMtPmJhbmRfb2Zmc2V0ICsgQkFOS19E QVRBKTsKCm5vIG5lZWQgZm9yIHRoaXMgaGVscGVyLCBqdXN0IG1vdmUgdGhlIGNvZGUgYmVsb3cu Cgo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBya19uZmNfcmVhZF9idWYoc3RydWN0IG5hbmRfY2hp cCAqY2hpcCwgdTggKmJ1ZiwgaW50IGxlbikKPiArewo+ICsJaW50IGk7Cj4gKwo+ICsJZm9yIChp ID0gMDsgaSA8IGxlbjsgaSsrKQo+ICsJCWJ1ZltpXSA9IHJrX25mY19yZWFkX2J5dGUoY2hpcCk7 CgpFaXRoZXIgeW91IGZpbmQgbW9yZSBwbGFjZXMgd2hlcmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9u LCBvciB5b3UgY2FuCm1vdmUgdGhpcyBjb2RlIGRpcmVjdGx5IHRvIHRoZSB1bmlxdWUgbG9jYXRp b24gd2hlcmUgaXQgaXMgY2FsbGVkLgoKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgcmtfbmZjX3dy aXRlX2J5dGUoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgdTggYnl0ZSkKClNhbWUgaGVyZQoKPiAr ewo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXAp Owo+ICsKPiArCXdyaXRlYihieXRlLCBuZmMtPnJlZ3MgKyBuZmMtPmJhbmRfb2Zmc2V0ICsgQkFO S19EQVRBKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgcmtfbmZjX3dyaXRlX2J1ZihzdHJ1Y3Qg bmFuZF9jaGlwICpjaGlwLCBjb25zdCB1OCAqYnVmLCBpbnQgbGVuKQo+ICt7Cj4gKwlpbnQgaTsK PiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCj4gKwkJcmtfbmZjX3dyaXRlX2J5dGUo Y2hpcCwgYnVmW2ldKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBya19uZmNfY21kKHN0cnVjdCBu YW5kX2NoaXAgKmNoaXAsCj4gKwkJICAgICAgY29uc3Qgc3RydWN0IG5hbmRfc3Vib3AgKnN1Ym9w KQo+ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEo Y2hpcCk7Cj4gKwl1bnNpZ25lZCBpbnQgaSwgaiwgcmVtYWluaW5nLCBzdGFydDsKPiArCWludCBy ZWdfb2Zmc2V0ID0gbmZjLT5iYW5kX29mZnNldDsKPiArCXZvaWQgX19pb21lbSAqZGF0YV9yZWc7 Cj4gKwl1OCAqaW5idWYgPSBOVUxMOwo+ICsJY29uc3QgdTggKm91dGJ1ZjsKPiArCXUzMiBjbnQg PSAwOwo+ICsJaW50IHJldCA9IDA7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IHN1Ym9wLT5uaW5z dHJzOyBpKyspIHsKPiArCQljb25zdCBzdHJ1Y3QgbmFuZF9vcF9pbnN0ciAqaW5zdHIgPSAmc3Vi b3AtPmluc3Ryc1tpXTsKPiArCj4gKwkJc3dpdGNoIChpbnN0ci0+dHlwZSkgewo+ICsJCWNhc2Ug TkFORF9PUF9DTURfSU5TVFI6Cj4gKwkJCXdyaXRlYihpbnN0ci0+Y3R4LmNtZC5vcGNvZGUsCj4g KwkJCSAgICAgICBuZmMtPnJlZ3MgKyByZWdfb2Zmc2V0ICsgQkFOS19DTUQpOwo+ICsJCQlicmVh azsKPiArCj4gKwkJY2FzZSBOQU5EX09QX0FERFJfSU5TVFI6Cj4gKwkJCXJlbWFpbmluZyA9IG5h bmRfc3Vib3BfZ2V0X251bV9hZGRyX2N5YyhzdWJvcCwgaSk7Cj4gKwkJCXN0YXJ0ID0gbmFuZF9z dWJvcF9nZXRfYWRkcl9zdGFydF9vZmYoc3Vib3AsIGkpOwo+ICsKPiArCQkJZm9yIChqID0gMDsg aiA8IDggJiYgaiArIHN0YXJ0IDwgcmVtYWluaW5nOyBqKyspCj4gKwkJCQl3cml0ZWIoaW5zdHIt PmN0eC5hZGRyLmFkZHJzW2ogKyBzdGFydF0sCj4gKwkJCQkgICAgICAgbmZjLT5yZWdzICsgcmVn X29mZnNldCArIEJBTktfQUREUik7Cj4gKwkJCWJyZWFrOwo+ICsKPiArCQljYXNlIE5BTkRfT1Bf REFUQV9JTl9JTlNUUjoKPiArCQljYXNlIE5BTkRfT1BfREFUQV9PVVRfSU5TVFI6Cj4gKwkJCXN0 YXJ0ID0gbmFuZF9zdWJvcF9nZXRfZGF0YV9zdGFydF9vZmYoc3Vib3AsIGkpOwo+ICsJCQljbnQg PSBuYW5kX3N1Ym9wX2dldF9kYXRhX2xlbihzdWJvcCwgaSk7Cj4gKwkJCWRhdGFfcmVnID0gbmZj LT5yZWdzICsgbmZjLT5iYW5kX29mZnNldCArIEJBTktfREFUQTsKPiArCj4gKwkJCWlmIChpbnN0 ci0+dHlwZSA9PSBOQU5EX09QX0RBVEFfT1VUX0lOU1RSKSB7Cj4gKwkJCQlvdXRidWYgPSBpbnN0 ci0+Y3R4LmRhdGEuYnVmLm91dCArIHN0YXJ0Owo+ICsJCQkJZm9yIChqID0gMDsgaiA8IGNudDsg aisrKQo+ICsJCQkJCXdyaXRlYihvdXRidWZbal0sIGRhdGFfcmVnKTsKCldoeSBub3QgY2FsbGlu ZyB0aGUgcmVhZC93cml0ZSBidWYgaGVscGVycyBoZXJlPyBXaGljaCB3b3VsZCBiZSBiZXR0ZXIK bmFtZWQgcmVhZC93cml0ZV9kYXRhIGluc3RlYWQgZHVlIHRvIHRoZSByZWdpc3RlciBuYW1lcyBv ZiB5b3VyIElQLgoKPiArCQkJfSBlbHNlIHsKPiArCQkJCWluYnVmID0gaW5zdHItPmN0eC5kYXRh LmJ1Zi5pbiArIHN0YXJ0Owo+ICsJCQkJZm9yIChqID0gMDsgaiA8IGNudDsgaisrKQo+ICsJCQkJ CWluYnVmW2pdID0gcmVhZGJfcmVsYXhlZChkYXRhX3JlZyk7Cj4gKwkJCX0KPiArCQkJYnJlYWs7 Cj4gKwo+ICsJCWNhc2UgTkFORF9PUF9XQUlUUkRZX0lOU1RSOgo+ICsJCQlpZiAocmtfbmZjX3dh aXRfaW9yZWFkeShuZmMpIDwgMCkgewo+ICsJCQkJcmV0ID0gLUVUSU1FRE9VVDsKPiArCQkJCWRl dl9lcnIobmZjLT5kZXYsICJJTyBub3QgcmVhZHlcbiIpOwo+ICsJCQl9Cj4gKwkJCWJyZWFrOwo+ ICsJCX0KPiArCX0KPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qg c3RydWN0IG5hbmRfb3BfcGFyc2VyIHJrX25mY19vcF9wYXJzZXIgPSBOQU5EX09QX1BBUlNFUigK PiArCU5BTkRfT1BfUEFSU0VSX1BBVFRFUk4oCj4gKwkJcmtfbmZjX2NtZCwKPiArCQlOQU5EX09Q X1BBUlNFUl9QQVRfQ01EX0VMRU0odHJ1ZSksCj4gKwkJTkFORF9PUF9QQVJTRVJfUEFUX0FERFJf RUxFTSh0cnVlLCBNQVhfQUREUkVTU19DWUMpLAo+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9DTURf RUxFTSh0cnVlKSwKPiArCQlOQU5EX09QX1BBUlNFUl9QQVRfV0FJVFJEWV9FTEVNKHRydWUpLAo+ ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9EQVRBX0lOX0VMRU0odHJ1ZSwgTUFYX0RBVEFfU0laRSkp LAo+ICsJTkFORF9PUF9QQVJTRVJfUEFUVEVSTigKPiArCQlya19uZmNfY21kLAo+ICsJCU5BTkRf T1BfUEFSU0VSX1BBVF9DTURfRUxFTSh0cnVlKSwKPiArCQlOQU5EX09QX1BBUlNFUl9QQVRfQURE Ul9FTEVNKHRydWUsIE1BWF9BRERSRVNTX0NZQyksCj4gKwkJTkFORF9PUF9QQVJTRVJfUEFUX0RB VEFfT1VUX0VMRU0odHJ1ZSwgTUFYX0RBVEFfU0laRSksCj4gKwkJTkFORF9PUF9QQVJTRVJfUEFU X0NNRF9FTEVNKHRydWUpLAo+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9XQUlUUkRZX0VMRU0odHJ1 ZSkpLAo+ICspOwo+ICsKPiArc3RhdGljIGludCBya19uZmNfZXhlY19vcChzdHJ1Y3QgbmFuZF9j aGlwICpjaGlwLAo+ICsJCQkgIGNvbnN0IHN0cnVjdCBuYW5kX29wZXJhdGlvbiAqb3AsCj4gKwkJ CSAgYm9vbCBjaGVja19vbmx5KQo+ICt7Cj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwgb3At PmNzKTsKCkRvbid0IHNlbGVjdCB0aGUgZGllIGlmIGNoZWNrX29ubHkgPT0gdHJ1ZQoKPiArCXJl dHVybiBuYW5kX29wX3BhcnNlcl9leGVjX29wKGNoaXAsICZya19uZmNfb3BfcGFyc2VyLCBvcCwK PiArCQkJCSAgICAgIGNoZWNrX29ubHkpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19z ZXR1cF9kYXRhX2ludGVyZmFjZShzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgY3NsaW5lLAo+ ICsJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuYW5kX2RhdGFfaW50ZXJmYWNlICpjb25mKQo+ICt7 Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEoY2hpcCk7 Cj4gKwljb25zdCBzdHJ1Y3QgbmFuZF9zZHJfdGltaW5ncyAqdGltaW5nczsKPiArCXUzMiByYXRl LCB0YzJydywgdHJ3cHcsIHRydzJjOwo+ICsJdTMyIHRlbXA7Cj4gKwo+ICsJaWYgKGNzbGluZSA9 PSBOQU5EX0RBVEFfSUZBQ0VfQ0hFQ0tfT05MWSkKPiArCQlyZXR1cm4gMDsKPiArCj4gKwlpZiAo IWNoaXAtPnBhcmFtZXRlcnMub25maSkKPiArCQlyZXR1cm4gMDsKCllvdSBtdXN0IGFjY2VwdCBh bGwga2luZCBvZiB0aW1pbmdzIGlmIHRoZXkgZml0IHRoZSBjb250cm9sbGVyCnBvc3NpYmlsaXRp ZXMsIHBsZWFzZSBkcm9wIGl0IG9mZi4gSWYgeW91IGRvbid0IHN1cHBvcnQgYSBnaXZlbgpjb25m aWd1cmF0aW9uLCBqdXN0IGNoZWNrIGl0IGFuZCByZXR1cm4gYW4gZXJyb3Igd2hlbiBDSEVDS19P TkxZIGlzCnVzZWQuCgo+ICsKPiArCXRpbWluZ3MgPSBuYW5kX2dldF9zZHJfdGltaW5ncyhjb25m KTsKPiArCWlmIChJU19FUlIodGltaW5ncykpCj4gKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwo+ICsK PiArCWlmIChJU19FUlIobmZjLT5jbGsubmZjX2NsaykpCj4gKwkJcmF0ZSA9IGNsa19nZXRfcmF0 ZShuZmMtPmNsay5haGJfY2xrKTsKPiArCWVsc2UKPiArCQlyYXRlID0gY2xrX2dldF9yYXRlKG5m Yy0+Y2xrLm5mY19jbGspOwo+ICsKPiArCS8qIFR1cm4gY2xvY2sgcmF0ZSBpbnRvIGtIei4gKi8K PiArCXJhdGUgLz0gMTAwMDsKPiArCj4gKwl0YzJydyA9IDE7Cj4gKwl0cncyYyA9IDE7Cj4gKwo+ ICsJdHJ3cHcgPSBtYXgodGltaW5ncy0+dFdDX21pbiwgdGltaW5ncy0+dFJDX21pbikgLyAxMDAw Owo+ICsJdHJ3cHcgPSBESVZfUk9VTkRfVVAodHJ3cHcgKiByYXRlLCAxMDAwMDAwKTsKPiArCj4g Kwl0ZW1wID0gdGltaW5ncy0+dFJFQV9tYXggLyAxMDAwOwo+ICsJdGVtcCA9IERJVl9ST1VORF9V UCh0ZW1wICogcmF0ZSwgMTAwMDAwMCk7Cj4gKwo+ICsJaWYgKHRyd3B3IDwgdGVtcCkKPiArCQl0 cndwdyA9IHRlbXA7Cj4gKwo+ICsJLyoKPiArCSAqIEFDQ09OOiBhY2Nlc3MgdGltaW5nIGNvbnRy b2wgcmVnaXN0ZXIKPiArCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K PiArCSAqIDMxOjE4OiByZXNlcnZlZAo+ICsJICogMTc6MTI6IGNzcncsIGNsb2NrIGN5Y2xlcyBm cm9tIHRoZSBmYWxsaW5nIGVkZ2Ugb2YgQ1NuIHRvIHRoZQo+ICsJCSBmYWxsaW5nIGVkZ2Ugb2Yg UkRuIG9yIFdSbgoKU3R5bGUgY2hlY2s6ICcqJyB0byBzdGFydCBldmVyeSBjb21tZW50IGxpbmUK Cj4gKwkgKiAxMToxMTogcmVzZXJ2ZWQKPiArCSAqIDEwOjA1OiByd3B3LCB0aGUgd2lkdGggb2Yg UkRuIG9yIFdSbiBpbiBwcm9jZXNzb3IgY2xvY2sgY3ljbGVzCj4gKwkgKiAwNDowMDogcndjcywg Y2xvY2sgY3ljbGVzIGZyb20gdGhlIHJpc2luZyBlZGdlIG9mIFJEbiBvciBXUm4gdG8gdGhlCj4g KwkJIHJpc2luZyBlZGdlIG9mIENTbgo+ICsJICovCj4gKwl0ZW1wID0gQUNDVElNSU5HKHRjMnJ3 LCB0cndwdywgdHJ3MmMpOwo+ICsJd3JpdGVsKHRlbXAsIG5mYy0+cmVncyArIE5GQ19GTVdBSVQp Owo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19od19lY2Nf c2V0dXAoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKPiArCQkJICAgICAgIHN0cnVjdCBuYW5kX2Vj Y19jdHJsICplY2MsCj4gKwkJCSAgICAgICB1aW50MzJfdCBzdHJlbmd0aCkKPiArewo+ICsJc3Ry dWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsJdTMy IHJlZywgaTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgTkZDX0VDQ19NQVhfTU9ERVM7IGkrKykg ewo+ICsJCWlmIChlY2MtPnN0cmVuZ3RoID09IG5mYy0+Y2ZnLT5lY2Nfc3RyZW5ndGhzW2ldKSB7 Cj4gKwkJCXJlZyA9IG5mYy0+Y2ZnLT5lY2NfY2Znc1tpXTsKPiArCQkJYnJlYWs7Cj4gKwkJfQo+ ICsJfQo+ICsKPiArCWlmIChpID49IE5GQ19FQ0NfTUFYX01PREVTKQo+ICsJCXJldHVybiAtRUlO VkFMOwo+ICsKPiArCXdyaXRlbChyZWcsIG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5iY2hjdGxfb2Zm KTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgcmtfbmZjX3hmZXJf c3RhcnQoc3RydWN0IHJrX25mYyAqbmZjLCB1OCBydywgdTggbl9LQiwKPiArCQkJICAgICAgZG1h X2FkZHJfdCBkbWFfZGF0YSwgZG1hX2FkZHJfdCBkbWFfb29iKQo+ICt7Cj4gKwl1MzIgZG1hX3Jl ZywgZmxfcmVnLCBiY2hfcmVnOwo+ICsKPiArCWRtYV9yZWcgPSBETUFfU1QgfCAoKCFydykgPDwg RE1BX1dSKSB8IERNQV9FTiB8ICgyIDw8IERNQV9BSEJfU0laRSkgfAo+ICsJICAgICAgKDcgPDwg RE1BX0JVUlNUX1NJWkUpIHwgKDE2IDw8IERNQV9JTkNfTlVNKTsKPiArCj4gKwlmbF9yZWcgPSAo cncgPDwgRkxDVExfV1IpIHwgRkxDVExfWEZFUl9FTiB8IEZMQ1RMX0FDT1JSRUNUIHwKPiArCQkg KG5fS0IgPDwgRkxDVExfWEZFUl9TRUNUT1IpIHwgRkxDVExfVE9HX0ZJWDsKPiArCj4gKwlpZiAo bmZjLT5jZmctPnR5cGUgPT0gTkZDX1Y2IHx8IG5mYy0+Y2ZnLT50eXBlID09IE5GQ19WOCkgewo+ ICsJCWJjaF9yZWcgPSByZWFkbF9yZWxheGVkKG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5iY2hjdGxf b2ZmKTsKPiArCQliY2hfcmVnID0gKGJjaF9yZWcgJiAofkJDSENUTF9CQU5LX00pKSB8Cj4gKwkJ CSAgKG5mYy0+c2VsZWN0ZWRfYmFuayA8PCBCQ0hDVExfQkFOSyk7Cj4gKwkJd3JpdGVsKGJjaF9y ZWcsIG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5iY2hjdGxfb2ZmKTsKPiArCX0KPiArCj4gKwl3cml0 ZWwoZG1hX3JlZywgbmZjLT5yZWdzICsgbmZjLT5jZmctPmRtYV9jZmdfb2ZmKTsKPiArCXdyaXRl bCgodTMyKWRtYV9kYXRhLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZG1hX2RhdGFfYnVmX29mZik7 Cj4gKwl3cml0ZWwoKHUzMilkbWFfb29iLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZG1hX29vYl9i dWZfb2ZmKTsKPiArCXdyaXRlbChmbF9yZWcsIG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5mbGN0bF9v ZmYpOwo+ICsJZmxfcmVnIHw9IEZMQ1RMX1hGRVJfU1Q7Cj4gKwl3cml0ZWwoZmxfcmVnLCBuZmMt PnJlZ3MgKyBuZmMtPmNmZy0+ZmxjdGxfb2ZmKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBya19u ZmNfd2FpdF9mb3JfeGZlcl9kb25lKHN0cnVjdCBya19uZmMgKm5mYykKPiArewo+ICsJdm9pZCBf X2lvbWVtICpwdHI7Cj4gKwlpbnQgcmV0ID0gMDsKPiArCXUzMiByZWc7Cj4gKwo+ICsJcHRyID0g bmZjLT5yZWdzICsgbmZjLT5jZmctPmZsY3RsX29mZjsKPiArCj4gKwlyZXQgPSByZWFkbF9wb2xs X3RpbWVvdXRfYXRvbWljKHB0ciwgcmVnLAo+ICsJCQkJCXJlZyAmIEZMQ1RMX1hGRVJfUkVBRFks Cj4gKwkJCQkJMTAsIE5GQ19USU1FT1VUKTsKClNhbWUgcXVlc3Rpb24sIGRvIHlvdSBuZWVkIGl0 IHRvIGJlIGF0b21pYz8KCj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGlu dCBya19uZmNfd3JpdGVfcGFnZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hp cCAqY2hpcCwKPiArCQkJICAgICBjb25zdCB1OCAqYnVmLCBpbnQgcGFnZSwgaW50IHJhdykKPiAr ewo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXAp Owo+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHRvX3JrbmFuZChjaGlwKTsK PiArCXN0cnVjdCBuYW5kX2VjY19jdHJsICplY2MgPSAmY2hpcC0+ZWNjOwo+ICsJaW50IG9vYl9z dGVwID0gKGVjYy0+Ynl0ZXMgPiA2MCkgPyBORkNfTUFYX09PQl9QRVJfU1RFUCA6Cj4gKwkJCU5G Q19NSU5fT09CX1BFUl9TVEVQOwo+ICsJaW50IHBhZ2VzX3Blcl9ibGsgPSBtdGQtPmVyYXNlc2l6 ZSAvIG10ZC0+d3JpdGVzaXplOwo+ICsJaW50IHJldCA9IDAsIGksIGJvb3Rfcm9tX21vZGUgPSAw Owo+ICsJZG1hX2FkZHJfdCBkbWFfZGF0YSwgZG1hX29vYjsKPiArCXUzMiByZWc7Cj4gKwl1OCAq b29iOwo+ICsKPiArCW5hbmRfcHJvZ19wYWdlX2JlZ2luX29wKGNoaXAsIHBhZ2UsIDAsIE5VTEws IDApOwo+ICsKPiArCWlmICghcmF3KQoKSSB0aGluayBpdCB3aWxsIGJlIG11Y2ggYmV0dGVyIHRv IGhhdmUgdHdvIHJrX25mY193cml0ZV9wYWdlIGFuZApya19uZmNfd3JpdGVfcGFnZV9yYXcgZGlz dGluY3QgaGVscGVycy4KCj4gKwkJbWVtY3B5KG5mYy0+cGFnZV9idWYsIGJ1ZiwgbXRkLT53cml0 ZXNpemUpOwo+ICsJCW1lbXNldChuZmMtPm9vYl9idWYsIDB4ZmYsIG9vYl9zdGVwICogZWNjLT5z dGVwcyk7CgpZb3UgYXJlIGRpc2NhcmRpbmcgT09CIGRhdGEgaW50ZW50aW9uYWxseSwgdGhpcyBp cyBzdHJhbmdlLgoKPiArCj4gKwkJLyoKPiArCQkgKiBUaGUgZmlyc3QgOChzb21lIGRldmljZXMg YXJlIDQgb3IgMTYpIGJsb2NrcyBhcmUgaW4gdXNlIGJ5CgoiVGhlIGZpcnN0IGJsb2NrcyAoNCwg OCBvciAxNiBkZXBlbmRpbmcgb24gdGhlIGRldmljZSkgYXJlIHVzZWQgYnkuLi4KCj4gKwkJICog dGhlIGJvb3QgUk9NIGFuZCB0aGUgZmlyc3QgMzIgYml0cyBvZiBvb2IgbmVlZCB0byBsaW5rCj4g KwkJICogdG8gdGhlIG5leHQgcGFnZSBhZGRyZXNzIGluIHRoZSBzYW1lIGJsb2NrLgo+ICsJCSAq IENvbmZpZyB0aGUgRUNDIGFsZ29yaXRobSBzdXBwb3J0ZWQgYnkgdGhlIGJvb3QgUk9NLgoKcy9j b25maWcvY29uZmlndXJlLwoKVGhpcyBjb25mbGljdHMgd2l0aCBiYWQgYmxvY2sgbWFya2Vycy4u LgoKPiArCQkgKi8KPiArCQlpZiAocGFnZSA8IHBhZ2VzX3Blcl9ibGsgKiBya25hbmQtPmJvb3Rf YmxrcyAmJgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKQoKPiArCQkgICAgY2hpcC0+b3B0aW9ucyAmIE5BTkRfSVNfQk9PVF9NRURJ VU0pIHsKPiArCQkJYm9vdF9yb21fbW9kZSA9IDE7Cj4gKwkJCWlmIChya25hbmQtPmJvb3RfZWNj ICE9IGVjYy0+c3RyZW5ndGgpCj4gKwkJCQlya19uZmNfaHdfZWNjX3NldHVwKGNoaXAsIGVjYywK PiArCQkJCQkJICAgIHJrbmFuZC0+Ym9vdF9lY2MpOwo+ICsJCX0KPiArCj4gKwkJZm9yIChpID0g MDsgaSA8IGVjYy0+c3RlcHM7IGkrKykgewo+ICsJCQlpZiAoIWkpIHsKPiArCQkJCXJlZyA9IDB4 RkZGRkZGRkY7Cj4gKwkJCX0gZWxzZSB7Cj4gKwkJCQlvb2IgPSBjaGlwLT5vb2JfcG9pICsgKGkg LSAxKSAqIE5GQ19TWVNfREFUQV9TSVpFOwo+ICsJCQkJcmVnID0gb29iWzBdIHwgb29iWzFdIDw8 IDggfCBvb2JbMl0gPDwgMTYgfAo+ICsJCQkJICAgICAgb29iWzNdIDw8IDI0Owo+ICsJCQl9Cj4g KwkJCWlmICghaSAmJiBib290X3JvbV9tb2RlKQo+ICsJCQkJcmVnID0gKHBhZ2UgJiAocGFnZXNf cGVyX2JsayAtIDEpKSAqIDQ7Cj4gKwo+ICsJCQlpZiAobmZjLT5jZmctPnR5cGUgPT0gTkZDX1Y5 KQo+ICsJCQkJbmZjLT5vb2JfYnVmW2ldID0gcmVnOwo+ICsJCQllbHNlCj4gKwkJCQluZmMtPm9v Yl9idWZbaSAqIG9vYl9zdGVwIC8gNF0gPSByZWc7CgpQbGVhc2UgdXNlIGJyYWNrZXRzLgoKPiAr CQl9Cj4gKwo+ICsJCWRtYV9kYXRhID0gZG1hX21hcF9zaW5nbGUobmZjLT5kZXYsICh2b2lkICop bmZjLT5wYWdlX2J1ZiwKCkRvIHlvdSBuZWVkIHRoaXMgY2FzdD8KCj4gKwkJCQkJICBtdGQtPndy aXRlc2l6ZSwgRE1BX1RPX0RFVklDRSk7Cj4gKwkJZG1hX29vYiA9IGRtYV9tYXBfc2luZ2xlKG5m Yy0+ZGV2LCBuZmMtPm9vYl9idWYsCj4gKwkJCQkJIGVjYy0+c3RlcHMgKiBvb2Jfc3RlcCwKPiAr CQkJCQkgRE1BX1RPX0RFVklDRSk7Cj4gKwo+ICsJCXJlaW5pdF9jb21wbGV0aW9uKCZuZmMtPmRv bmUpOwo+ICsJCXdyaXRlbChJTlRfRE1BLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+aW50X2VuX29m Zik7Cj4gKwo+ICsJCXJrX25mY194ZmVyX3N0YXJ0KG5mYywgTkZDX1dSSVRFLCBlY2MtPnN0ZXBz LCBkbWFfZGF0YSwKPiArCQkJCSAgZG1hX29vYik7Cj4gKwkJcmV0ID0gd2FpdF9mb3JfY29tcGxl dGlvbl90aW1lb3V0KCZuZmMtPmRvbmUsCj4gKwkJCQkJCSAgbXNlY3NfdG9famlmZmllcygxMDAp KTsKPiArCQlpZiAoIXJldCkKPiArCQkJZGV2X3dhcm4obmZjLT5kZXYsICJ3cml0ZTogd2FpdCBk bWEgZG9uZSB0aW1lb3V0LlxuIik7Cj4gKwkJLyoKPiArCQkgKiBXaGV0aGVyIHRoZSBETUEgdHJh bnNmZXIgaXMgY29tcGxldGVkIG9yIG5vdC4gVGhlIGRyaXZlcgo+ICsJCSAqIG5lZWRzIHRvIGNo ZWNrIHRoZSBORkNgcyBzdGF0dXMgcmVnaXN0ZXIgdG8gc2VlIGlmIHRoZSBkYXRhCj4gKwkJICog dHJhbnNmZXIgd2FzIGNvbXBsZXRlZC4KPiArCQkgKi8KPiArCQlyZXQgPSBya19uZmNfd2FpdF9m b3JfeGZlcl9kb25lKG5mYyk7Cj4gKwo+ICsJCWRtYV91bm1hcF9zaW5nbGUobmZjLT5kZXYsIGRt YV9kYXRhLCBtdGQtPndyaXRlc2l6ZSwKPiArCQkJCSBETUFfVE9fREVWSUNFKTsKPiArCQlkbWFf dW5tYXBfc2luZ2xlKG5mYy0+ZGV2LCBkbWFfb29iLCBlY2MtPnN0ZXBzICogb29iX3N0ZXAsCj4g KwkJCQkgRE1BX1RPX0RFVklDRSk7Cj4gKwo+ICsJCWlmIChib290X3JvbV9tb2RlICYmIHJrbmFu ZC0+Ym9vdF9lY2MgIT0gZWNjLT5zdHJlbmd0aCkKPiArCQkJcmtfbmZjX2h3X2VjY19zZXR1cChj aGlwLCBlY2MsIGVjYy0+c3RyZW5ndGgpOwo+ICsKPiArCQlpZiAocmV0KSB7Cj4gKwkJCXJldCA9 IC1FSU87Cj4gKwkJCWRldl9lcnIobmZjLT5kZXYsCj4gKwkJCQkid3JpdGU6IHdhaXQgdHJhbnNm ZXIgZG9uZSB0aW1lb3V0LlxuIik7Cj4gKwkJfQo+ICsJfSBlbHNlIHsKPiArCQlya19uZmNfd3Jp dGVfYnVmKGNoaXAsIGJ1ZiwgbXRkLT53cml0ZXNpemUgKyBtdGQtPm9vYnNpemUpOwo+ICsJfQo+ ICsKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwlyZXQgPSBuYW5kX3Byb2df cGFnZV9lbmRfb3AoY2hpcCk7Cj4gKwo+ICsJLyogRGVzZWxlY3QgdGhlIGN1cnJlbnRseSBzZWxl Y3RlZCB0YXJnZXQuICovCj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwgLTEpOwoKTm90IHN1 cmUgdGhpcyBpcyBuZWVkZWQ/Cgo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRp YyBpbnQgcmtfbmZjX3dyaXRlX3BhZ2VfcmF3KHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGNvbnN0 IHU4ICpidWYsCj4gKwkJCQkgaW50IG9vYl9vbiwgaW50IHBhZ2UpCj4gK3sKPiArCXN0cnVjdCBt dGRfaW5mbyAqbXRkID0gbmFuZF90b19tdGQoY2hpcCk7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMg PSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4gKwl1MzIgaTsKPiArCj4gKwltZW1z ZXQobmZjLT5idWZmZXIsIDB4ZmYsIG10ZC0+d3JpdGVzaXplICsgbXRkLT5vb2JzaXplKTsKPiAr Cj4gKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+ZWNjLnN0ZXBzOyBpKyspIHsKPiArCQlpZiAoYnVm KQoKQ2FuIHRoaXMgY29uZGl0aW9uIGJlIHVubWV0IHJlYWxseT8KCj4gKwkJCW1lbWNweShya19k YXRhX3B0cihjaGlwLCBpKSwgZGF0YV9wdHIoY2hpcCwgYnVmLCBpKSwKPiArCQkJICAgICAgIGNo aXAtPmVjYy5zaXplKTsKPiArCj4gKwkJaWYgKCFpKQo+ICsJCQltZW1jcHkocmtfb29iX3B0cihj aGlwLCBpKSwKPiArCQkJICAgICAgIG9vYl9wdHIoY2hpcCwgY2hpcC0+ZWNjLnN0ZXBzIC0gMSks Cj4gKwkJCSAgICAgICBORkNfU1lTX0RBVEFfU0laRSk7CgpXaGF0IGlzIHRoaXM/Cgo+ICsJCWVs c2UKPiArCQkJbWVtY3B5KHJrX29vYl9wdHIoY2hpcCwgaSksIG9vYl9wdHIoY2hpcCwgaSAtIDEp LAo+ICsJCQkgICAgICAgTkZDX1NZU19EQVRBX1NJWkUpOwo+ICsKPiArCQltZW1jcHkocmtfb29i X3B0cihjaGlwLCBpKSArIE5GQ19TWVNfREFUQV9TSVpFLAo+ICsJCSAgICAgICBvb2JfZWNjX3B0 cihjaGlwLCBpKSwKPiArCQkgICAgICAgY2hpcC0+ZWNjLmJ5dGVzKTsKPiArCX0KPiArCj4gKwly ZXR1cm4gcmtfbmZjX3dyaXRlX3BhZ2UobXRkLCBjaGlwLCBuZmMtPmJ1ZmZlciwgcGFnZSwgMSk7 Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX3dyaXRlX29vYl9zdGQoc3RydWN0IG5hbmRf Y2hpcCAqY2hpcCwgaW50IHBhZ2UpCj4gK3sKPiArCXJldHVybiBya19uZmNfd3JpdGVfcGFnZV9y YXcoY2hpcCwgTlVMTCwgMSwgcGFnZSk7Cj4gK30KCldoYXQgaXMgdGhlIHB1cnBvc2Ugb2YgdGhp cyBpbmRpcmVjdGlvbj8gUGxlYXNlIGdldCByaWQgb2YgaXQuCgo+ICsKPiArc3RhdGljIGludCBy a19uZmNfcmVhZF9wYWdlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpj aGlwLAo+ICsJCQkgICAgdTMyIGRhdGFfb2ZmcywgdTMyIHJlYWRsZW4sCj4gKwkJCSAgICB1OCAq YnVmLCBpbnQgcGFnZSwgaW50IHJhdykKPiArewo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFu ZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAg KnJrbmFuZCA9IHRvX3JrbmFuZChjaGlwKTsKPiArCXN0cnVjdCBuYW5kX2VjY19jdHJsICplY2Mg PSAmY2hpcC0+ZWNjOwo+ICsJaW50IG9vYl9zdGVwID0gKGVjYy0+Ynl0ZXMgPiA2MCkgPyBORkNf TUFYX09PQl9QRVJfU1RFUCA6Cj4gKwkJCU5GQ19NSU5fT09CX1BFUl9TVEVQOwo+ICsJaW50IHBh Z2VzX3Blcl9ibGsgPSBtdGQtPmVyYXNlc2l6ZSAvIG10ZC0+d3JpdGVzaXplOwo+ICsJZG1hX2Fk ZHJfdCBkbWFfZGF0YSwgZG1hX29vYjsKPiArCWludCByZXQgPSAwLCBpLCBib290X3JvbV9tb2Rl ID0gMDsKPiArCWludCBiaXRmbGlwcyA9IDAsIGJjaF9zdDsKPiArCXU4ICpvb2I7Cj4gKwl1MzIg dG1wOwo+ICsKPiArCW5hbmRfcmVhZF9wYWdlX29wKGNoaXAsIHBhZ2UsIDAsIE5VTEwsIDApOwo+ ICsJaWYgKCFyYXcpIHsKClNhbWUgY29tbWVudCwgcGxlYXNlIHdyaXRlIHR3byBoZWxwZXJzLgoK PiArCQlkbWFfZGF0YSA9IGRtYV9tYXBfc2luZ2xlKG5mYy0+ZGV2LCBuZmMtPnBhZ2VfYnVmLAo+ ICsJCQkJCSAgbXRkLT53cml0ZXNpemUsCj4gKwkJCQkJICBETUFfRlJPTV9ERVZJQ0UpOwo+ICsJ CWRtYV9vb2IgPSBkbWFfbWFwX3NpbmdsZShuZmMtPmRldiwgbmZjLT5vb2JfYnVmLAo+ICsJCQkJ CSBlY2MtPnN0ZXBzICogb29iX3N0ZXAsCj4gKwkJCQkJIERNQV9GUk9NX0RFVklDRSk7Cj4gKwo+ ICsJCS8qCj4gKwkJICogVGhlIGZpcnN0IDgoc29tZSBkZXZpY2VzIGFyZSA0IG9yIDE2KSBibG9j a3MgYXJlIGluIHVzZSBieQoKU2FtZSByZXdvcmRpbmcKCj4gKwkJICogdGhlIGJvb3QgUk9NLgo+ ICsJCSAqIENvbmZpZyB0aGUgRUNDIGFsZ29yaXRobSBzdXBwb3J0ZWQgYnkgdGhlIGJvb3QgUk9N Lgo+ICsJCSAqLwo+ICsJCWlmIChwYWdlIDwgcGFnZXNfcGVyX2JsayAqIHJrbmFuZC0+Ym9vdF9i bGtzICYmCj4gKwkJICAgIGNoaXAtPm9wdGlvbnMgJiBOQU5EX0lTX0JPT1RfTUVESVVNKSB7Cj4g KwkJCWJvb3Rfcm9tX21vZGUgPSAxOwo+ICsJCQlpZiAocmtuYW5kLT5ib290X2VjYyAhPSBlY2Mt PnN0cmVuZ3RoKQo+ICsJCQkJcmtfbmZjX2h3X2VjY19zZXR1cChjaGlwLCBlY2MsCj4gKwkJCQkJ CSAgICBya25hbmQtPmJvb3RfZWNjKTsKPiArCQl9Cj4gKwo+ICsJCXJlaW5pdF9jb21wbGV0aW9u KCZuZmMtPmRvbmUpOwo+ICsJCXdyaXRlbChJTlRfRE1BLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ aW50X2VuX29mZik7Cj4gKwkJcmtfbmZjX3hmZXJfc3RhcnQobmZjLCBORkNfUkVBRCwgZWNjLT5z dGVwcywgZG1hX2RhdGEsCj4gKwkJCQkgIGRtYV9vb2IpOwo+ICsJCXJldCA9IHdhaXRfZm9yX2Nv bXBsZXRpb25fdGltZW91dCgmbmZjLT5kb25lLAo+ICsJCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMo MTAwKSk7Cj4gKwkJaWYgKCFyZXQpCj4gKwkJCWRldl93YXJuKG5mYy0+ZGV2LCAicmVhZDogd2Fp dCBkbWEgZG9uZSB0aW1lb3V0LlxuIik7Cj4gKwkJLyoKPiArCQkgKiBXaGV0aGVyIHRoZSBETUEg dHJhbnNmZXIgaXMgY29tcGxldGVkIG9yIG5vdC4gVGhlIGRyaXZlcgo+ICsJCSAqIG5lZWRzIHRv IGNoZWNrIHRoZSBORkNgcyBzdGF0dXMgcmVnaXN0ZXIgdG8gc2VlIGlmIHRoZSBkYXRhCj4gKwkJ ICogdHJhbnNmZXIgd2FzIGNvbXBsZXRlZC4KPiArCQkgKi8KPiArCQlyZXQgPSBya19uZmNfd2Fp dF9mb3JfeGZlcl9kb25lKG5mYyk7Cj4gKwkJZG1hX3VubWFwX3NpbmdsZShuZmMtPmRldiwgZG1h X2RhdGEsIG10ZC0+d3JpdGVzaXplLAo+ICsJCQkJIERNQV9GUk9NX0RFVklDRSk7Cj4gKwkJZG1h X3VubWFwX3NpbmdsZShuZmMtPmRldiwgZG1hX29vYiwgZWNjLT5zdGVwcyAqIG9vYl9zdGVwLAo+ ICsJCQkJIERNQV9GUk9NX0RFVklDRSk7Cj4gKwo+ICsJCWlmIChyZXQpIHsKPiArCQkJYml0Zmxp cHMgPSAtRUlPOwo+ICsJCQlkZXZfZXJyKG5mYy0+ZGV2LAo+ICsJCQkJInJlYWQ6IHdhaXQgdHJh bnNmZXIgZG9uZSB0aW1lb3V0LlxuIik7Cj4gKwkJCWdvdG8gb3V0Owo+ICsJCX0KPiArCj4gKwkJ Zm9yIChpID0gMTsgaSA8IGVjYy0+c3RlcHM7IGkrKykgewo+ICsJCQlvb2IgPSBjaGlwLT5vb2Jf cG9pICsgKGkgLSAxKSAqIE5GQ19TWVNfREFUQV9TSVpFOwo+ICsJCQlpZiAobmZjLT5jZmctPnR5 cGUgPT0gTkZDX1Y5KQo+ICsJCQkJdG1wID0gbmZjLT5vb2JfYnVmW2ldOwo+ICsJCQllbHNlCj4g KwkJCQl0bXAgPSBuZmMtPm9vYl9idWZbaSAqIG9vYl9zdGVwIC8gNF07Cj4gKwkJCSpvb2IrKyA9 ICh1OCl0bXA7Cj4gKwkJCSpvb2IrKyA9ICh1OCkodG1wID4+IDgpOwo+ICsJCQkqb29iKysgPSAo dTgpKHRtcCA+PiAxNik7Cj4gKwkJCSpvb2IrKyA9ICh1OCkodG1wID4+IDI0KTsKPiArCQl9Cj4g Kwo+ICsJCWZvciAoaSA9IDA7IGkgPCBlY2MtPnN0ZXBzIC8gMjsgaSsrKSB7CgpCcmFja2V0cyBo ZXJlIGFzIHdlbGwgcGxlYXNlCgo+ICsJCQliY2hfc3QgPSByZWFkbF9yZWxheGVkKG5mYy0+cmVn cyArCj4gKwkJCQkJICAgICAgIG5mYy0+Y2ZnLT5iY2hfc3Rfb2ZmICsgaSAqIDQpOwo+ICsJCQlp ZiAoYmNoX3N0ICYgQklUKG5mYy0+Y2ZnLT5lY2MwLmVycl9mbGFnX2JpdCkgfHwKPiArCQkJICAg IGJjaF9zdCAmIEJJVChuZmMtPmNmZy0+ZWNjMS5lcnJfZmxhZ19iaXQpKSB7Cj4gKwkJCQltdGQt PmVjY19zdGF0cy5mYWlsZWQrKzsKPiArCQkJCWJpdGZsaXBzID0gLTE7CgpJIHRoaW5rIHlvdSBz aG91bGQgcmV0dXJuIDAuCgpUaGVuIHRoZSB1cHBlciBsYXllciB3aWxsIGNoZWNrIGZvciBmYWls dXJlcy4KCj4gKwkJCX0gZWxzZSB7Cj4gKwkJCQlyZXQgPSBFQ0NfRVJSX0NOVChiY2hfc3QsIG5m Yy0+Y2ZnLT5lY2MwKTsKPiArCQkJCW10ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCArPSByZXQ7Cj4g KwkJCQliaXRmbGlwcyA9IG1heF90KHUzMiwgYml0ZmxpcHMsIHJldCk7Cj4gKwo+ICsJCQkJcmV0 ID0gRUNDX0VSUl9DTlQoYmNoX3N0LCBuZmMtPmNmZy0+ZWNjMSk7Cj4gKwkJCQltdGQtPmVjY19z dGF0cy5jb3JyZWN0ZWQgKz0gcmV0Owo+ICsJCQkJYml0ZmxpcHMgPSBtYXhfdCh1MzIsIGJpdGZs aXBzLCByZXQpOwo+ICsJCQl9Cj4gKwkJfQo+ICtvdXQ6Cj4gKwkJbWVtY3B5KGJ1ZiwgbmZjLT5w YWdlX2J1ZiwgbXRkLT53cml0ZXNpemUpOwo+ICsKPiArCQlpZiAoYm9vdF9yb21fbW9kZSAmJiBy a25hbmQtPmJvb3RfZWNjICE9IGVjYy0+c3RyZW5ndGgpCj4gKwkJCXJrX25mY19od19lY2Nfc2V0 dXAoY2hpcCwgZWNjLCBlY2MtPnN0cmVuZ3RoKTsKPiArCj4gKwkJaWYgKGJpdGZsaXBzIDwgMCkK PiArCQkJZGV2X2VycihuZmMtPmRldiwgInJlYWQgcGFnZTogJXggZWNjIGVycm9yIVxuIiwgcGFn ZSk7Cj4gKwl9IGVsc2Ugewo+ICsJCXJrX25mY19yZWFkX2J1ZihjaGlwLCBidWYsIG10ZC0+d3Jp dGVzaXplICsgbXRkLT5vb2JzaXplKTsKPiArCX0KPiArCS8qIERlc2VsZWN0IHRoZSBjdXJyZW50 bHkgc2VsZWN0ZWQgdGFyZ2V0LiAqLwo+ICsJcmtfbmZjX3NlbGVjdF9jaGlwKGNoaXAsIC0xKTsK PiArCj4gKwlyZXR1cm4gYml0ZmxpcHM7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX3dy aXRlX3BhZ2VfaHdlY2Moc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgdTggKmJ1ZiwKPiAr CQkJCSAgIGludCBvb2Jfb24sIGludCBwYWdlKQo+ICt7Cj4gKwlyZXR1cm4gcmtfbmZjX3dyaXRl X3BhZ2UobmFuZF90b19tdGQoY2hpcCksIGNoaXAsIGJ1ZiwgcGFnZSwgMCk7Cj4gK30KPiArCj4g K3N0YXRpYyBpbnQgcmtfbmZjX3JlYWRfcGFnZV9od2VjYyhzdHJ1Y3QgbmFuZF9jaGlwICpjaGlw LCB1OCAqcCwgaW50IG9vYl9vbiwKPiArCQkJCSAgaW50IHBnKQo+ICt7Cj4gKwlzdHJ1Y3QgbXRk X2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+ICsKPiArCXJldHVybiBya19uZmNfcmVh ZF9wYWdlKG10ZCwgY2hpcCwgMCwgbXRkLT53cml0ZXNpemUsIHAsIHBnLCAwKTsKPiArfQo+ICsK PiArc3RhdGljIGludCBya19uZmNfcmVhZF9wYWdlX3JhdyhzdHJ1Y3QgbmFuZF9jaGlwICpjaGlw LCB1OCAqYnVmLCBpbnQgb29iX29uLAo+ICsJCQkJaW50IHBhZ2UpCj4gK3sKPiArCXN0cnVjdCBt dGRfaW5mbyAqbXRkID0gbmFuZF90b19tdGQoY2hpcCk7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMg PSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4gKwlpbnQgaSwgcmV0Owo+ICsKPiAr CXJldCA9IHJrX25mY19yZWFkX3BhZ2UobXRkLCBjaGlwLCAwLCBtdGQtPndyaXRlc2l6ZSwgbmZj LT5idWZmZXIsCj4gKwkJCSAgICAgICBwYWdlLCAxKTsKPiArCWlmIChyZXQgPCAwKQo+ICsJCXJl dHVybiByZXQ7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IGNoaXAtPmVjYy5zdGVwczsgaSsrKSB7 Cj4gKwkJaWYgKCFpKQo+ICsJCQltZW1jcHkob29iX3B0cihjaGlwLCBjaGlwLT5lY2Muc3RlcHMg LSAxKSwKPiArCQkJICAgICAgIHJrX29vYl9wdHIoY2hpcCwgaSksCj4gKwkJCSAgICAgICBORkNf U1lTX0RBVEFfU0laRSk7Cj4gKwkJZWxzZQo+ICsJCQltZW1jcHkob29iX3B0cihjaGlwLCBpIC0g MSksIHJrX29vYl9wdHIoY2hpcCwgaSksCj4gKwkJCSAgICAgICBORkNfU1lTX0RBVEFfU0laRSk7 Cj4gKwo+ICsJCW1lbWNweShvb2JfZWNjX3B0cihjaGlwLCBpKSwKPiArCQkgICAgICAgcmtfb29i X3B0cihjaGlwLCBpKSArIE5GQ19TWVNfREFUQV9TSVpFLAo+ICsJCSAgICAgICBjaGlwLT5lY2Mu Ynl0ZXMpOwo+ICsKPiArCQlpZiAoYnVmKQo+ICsJCQltZW1jcHkoZGF0YV9wdHIoY2hpcCwgYnVm LCBpKSwgcmtfZGF0YV9wdHIoY2hpcCwgaSksCj4gKwkJCSAgICAgICBjaGlwLT5lY2Muc2l6ZSk7 Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBya19uZmNf cmVhZF9vb2Jfc3RkKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGludCBwYWdlKQo+ICt7Cj4gKwly ZXR1cm4gcmtfbmZjX3JlYWRfcGFnZV9yYXcoY2hpcCwgTlVMTCwgMSwgcGFnZSk7Cj4gK30KPiAr Cj4gK3N0YXRpYyBpbmxpbmUgdm9pZCBya19uZmNfaHdfaW5pdChzdHJ1Y3QgcmtfbmZjICpuZmMp Cj4gK3sKPiArCS8qIERpc2FibGUgZmxhc2ggd3AuICovCj4gKwl3cml0ZWwoRk1DVExfV1AsIG5m Yy0+cmVncyArIE5GQ19GTUNUTCk7Cj4gKwkvKiBDb25maWcgZGVmYXVsdCB0aW1pbmcgNDBucyBh dCAxNTAgTWh6IG5mYyBjbG9jay4gKi8KPiArCXdyaXRlbCgweDEwODEsIG5mYy0+cmVncyArIE5G Q19GTVdBSVQpOwo+ICsJLyogRGlzYWJsZSByYW5kb21pemVyIGFuZCBETUEuICovCj4gKwl3cml0 ZWwoMCwgbmZjLT5yZWdzICsgbmZjLT5jZmctPnJhbmRtel9vZmYpOwo+ICsJd3JpdGVsKDAsIG5m Yy0+cmVncyArIG5mYy0+Y2ZnLT5kbWFfY2ZnX29mZik7Cj4gKwl3cml0ZWwoRkxDVExfUlNULCBu ZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZmxjdGxfb2ZmKTsKPiArfQo+ICsKPiArc3RhdGljIGlycXJl dHVybl90IHJrX25mY19pcnEoaW50IGlycSwgdm9pZCAqaWQpCj4gK3sKPiArCXN0cnVjdCBya19u ZmMgKm5mYyA9IGlkOwo+ICsJdTMyIHN0YSwgaWVuOwo+ICsKPiArCXN0YSA9IHJlYWRsX3JlbGF4 ZWQobmZjLT5yZWdzICsgbmZjLT5jZmctPmludF9zdF9vZmYpOwo+ICsJaWVuID0gcmVhZGxfcmVs YXhlZChuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+aW50X2VuX29mZik7Cj4gKwo+ICsJaWYgKCEoc3Rh ICYgaWVuKSkKPiArCQlyZXR1cm4gSVJRX05PTkU7Cj4gKwo+ICsJd3JpdGVsKHN0YSwgbmZjLT5y ZWdzICsgbmZjLT5jZmctPmludF9jbHJfb2ZmKTsKPiArCXdyaXRlbCh+c3RhICYgaWVuLCBuZmMt PnJlZ3MgKyBuZmMtPmNmZy0+aW50X2VuX29mZik7Cj4gKwo+ICsJY29tcGxldGUoJm5mYy0+ZG9u ZSk7Cj4gKwo+ICsJcmV0dXJuIElSUV9IQU5ETEVEOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJr X25mY19lbmFibGVfY2xrKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJrX25mY19jbGsgKmNs aykKCl9jbGtzIHdpdGggYW4gcyB0byBpbmZvcm0gdGhhdCB0aGVyZSBhcmUgc2V2ZXJhbCBvZiB0 aGVtPwoKPiArewo+ICsJaW50IHJldDsKPiArCj4gKwlpZiAoIUlTX0VSUihjbGstPm5mY19jbGsp KSB7Cj4gKwkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGNsay0+bmZjX2Nsayk7Cj4gKwkJaWYg KHJldCkgewo+ICsJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBlbmFibGUgbmZjIGNsa1xuIik7 Cj4gKwkJCXJldHVybiByZXQ7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldCA9IGNsa19wcmVwYXJl X2VuYWJsZShjbGstPmFoYl9jbGspOwo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIoZGV2LCAi ZmFpbGVkIHRvIGVuYWJsZSBhaGIgY2xrXG4iKTsKPiArCQlpZiAoIUlTX0VSUihjbGstPm5mY19j bGspKQo+ICsJCQljbGtfZGlzYWJsZV91bnByZXBhcmUoY2xrLT5uZmNfY2xrKTsKPiArCQlyZXR1 cm4gcmV0Owo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBy a19uZmNfZGlzYWJsZV9jbGsoc3RydWN0IHJrX25mY19jbGsgKmNsaykKCmRpdHRvCgo+ICt7Cj4g KwlpZiAoIUlTX0VSUihjbGstPm5mY19jbGspKQo+ICsJCWNsa19kaXNhYmxlX3VucHJlcGFyZShj bGstPm5mY19jbGspOwo+ICsJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNsay0+YWhiX2Nsayk7Cj4g K30KPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX29vYmxheW91dF9mcmVlKHN0cnVjdCBtdGRfaW5m byAqbXRkLCBpbnQgc2VjdGlvbiwKPiArCQkJCSBzdHJ1Y3QgbXRkX29vYl9yZWdpb24gKm9vYl9y ZWdpb24pCj4gK3sKPiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGRfdG9fbmFuZChtdGQp Owo+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHRvX3JrbmFuZChjaGlwKTsK PiArCj4gKwlpZiAoc2VjdGlvbikKPiArCQlyZXR1cm4gLUVSQU5HRTsKPiArCj4gKwkvKgo+ICsJ ICogVGhlIGJlZ2lubmluZyBvZiB0aGUgb29iIGFyZWEgc3RvcmVzIHRoZSByZXNlcnZlZCBkYXRh IGZvciB0aGUgTkZDLAo+ICsJICogdGhlIHNpemUgb2YgdGhlIHJlc2VydmVkIGRhdGEgaXMgTkZD X1NZU19EQVRBX1NJWkUgYnl0ZXMuCj4gKwkgKi8KPiArCW9vYl9yZWdpb24tPmxlbmd0aCA9IHJr bmFuZC0+bWV0YWRhdGFfc2l6ZSAtIE5GQ19TWVNfREFUQV9TSVpFIC0gMjsKPiArCW9vYl9yZWdp b24tPm9mZnNldCA9IE5GQ19TWVNfREFUQV9TSVpFICsgMjsKPiArCj4gKwlyZXR1cm4gMDsKPiAr fQo+ICsKPiArc3RhdGljIGludCBya19uZmNfb29ibGF5b3V0X2VjYyhzdHJ1Y3QgbXRkX2luZm8g Km10ZCwgaW50IHNlY3Rpb24sCj4gKwkJCQlzdHJ1Y3QgbXRkX29vYl9yZWdpb24gKm9vYl9yZWdp b24pCj4gK3sKPiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGRfdG9fbmFuZChtdGQpOwo+ ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHRvX3JrbmFuZChjaGlwKTsKPiAr Cj4gKwlpZiAoc2VjdGlvbikKPiArCQlyZXR1cm4gLUVSQU5HRTsKPiArCj4gKwlvb2JfcmVnaW9u LT5vZmZzZXQgPSBya25hbmQtPm1ldGFkYXRhX3NpemU7Cj4gKwlvb2JfcmVnaW9uLT5sZW5ndGgg PSBtdGQtPm9vYnNpemUgLSBvb2JfcmVnaW9uLT5vZmZzZXQ7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4g K30KPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRkX29vYmxheW91dF9vcHMgcmtfbmZjX29v YmxheW91dF9vcHMgPSB7Cj4gKwkuZnJlZSA9IHJrX25mY19vb2JsYXlvdXRfZnJlZSwKPiArCS5l Y2MgPSBya19uZmNfb29ibGF5b3V0X2VjYywKPiArfTsKPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZj X2VjY19pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IG10ZF9pbmZvICptdGQpCj4gK3sK PiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGRfdG9fbmFuZChtdGQpOwo+ICsJc3RydWN0 IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsJc3RydWN0 IG5hbmRfZWNjX2N0cmwgKmVjYyA9ICZjaGlwLT5lY2M7Cj4gKwljb25zdCB1OCAqc3RyZW5ndGhz ID0gbmZjLT5jZmctPmVjY19zdHJlbmd0aHM7Cj4gKwl1OCBtYXhfc3RyZW5ndGgsIG5mY19tYXhf c3RyZW5ndGg7Cj4gKwlpbnQgaTsKPiArCj4gKwluZmNfbWF4X3N0cmVuZ3RoID0gbmZjLT5jZmct PmVjY19zdHJlbmd0aHNbMF07Cj4gKwkvKiBJZiBvcHRpb25hbCBkdCBzZXR0aW5ncyBub3QgcHJl c2VudC4gKi8KPiArCWlmICghZWNjLT5zaXplIHx8ICFlY2MtPnN0cmVuZ3RoIHx8Cj4gKwkgICAg ZWNjLT5zdHJlbmd0aCA+IG5mY19tYXhfc3RyZW5ndGgpIHsKPiArCQkvKiBVc2UgZGF0YXNoZWV0 IHJlcXVpcmVtZW50cy4gKi8KPiArCQllY2MtPnN0cmVuZ3RoID0gY2hpcC0+YmFzZS5lY2NyZXEu c3RyZW5ndGg7Cj4gKwkJZWNjLT5zaXplID0gY2hpcC0+YmFzZS5lY2NyZXEuc3RlcF9zaXplOwo+ ICsKPiArCQkvKiBBbGlnbiBFQ0Mgc3RyZW5ndGggYW5kIEVDQyBzaXplLiAqLwo+ICsJCWlmIChj aGlwLT5lY2Muc2l6ZSA8IDEwMjQpIHsKPiArCQkJaWYgKG10ZC0+d3JpdGVzaXplID4gNTEyKSB7 Cj4gKwkJCQljaGlwLT5lY2Muc2l6ZSA9IDEwMjQ7Cj4gKwkJCQljaGlwLT5lY2Muc3RyZW5ndGgg PDw9IDE7Cj4gKwkJCX0gZWxzZSB7Cj4gKwkJCQlkZXZfZXJyKGRldiwgIlVuc3VwcG9ydGVkIGVj Yy5zaXplXG4iKTsKPiArCQkJCXJldHVybiAtRUlOVkFMOwo+ICsJCQl9Cj4gKwkJfSBlbHNlIHsK PiArCQkJY2hpcC0+ZWNjLnNpemUgPSAxMDI0Owo+ICsJCX0KPiArCj4gKwkJZWNjLT5zdGVwcyA9 IG10ZC0+d3JpdGVzaXplIC8gZWNjLT5zaXplOwo+ICsKPiArCQkvKgo+ICsJCSAqIEhXIEVDQyBh bHdheXMgcmVxdWVzdHMgdGhlIG51bWJlciBvZiBFQ0MgYnl0ZXMgcGVyIDEwMjQgYnl0ZQo+ICsJ CSAqIGJsb2Nrcy4gNCBCeXRlcyBpcyBvb2IgZm9yIHN5cyBkYXRhLgo+ICsJCSAqLwo+ICsJCW1h eF9zdHJlbmd0aCA9ICgobXRkLT5vb2JzaXplIC8gZWNjLT5zdGVwcykgLSA0KSAqIDggLwo+ICsJ CQkJIGZscyg4ICogMTAyNCk7Cj4gKwkJaWYgKG1heF9zdHJlbmd0aCA+IG5mY19tYXhfc3RyZW5n dGgpCj4gKwkJCW1heF9zdHJlbmd0aCA9IG5mY19tYXhfc3RyZW5ndGg7Cj4gKwo+ICsJCWZvciAo aSA9IDA7IGkgPCA0OyBpKyspIHsKPiArCQkJaWYgKG1heF9zdHJlbmd0aCA+PSBzdHJlbmd0aHNb aV0pCj4gKwkJCQlicmVhazsKPiArCQl9Cj4gKwo+ICsJCWlmIChpID49IDQpIHsKPiArCQkJZGV2 X2VycihuZmMtPmRldiwgIlVuc3VwcG9ydGVkIEVDQyBzdHJlbmd0aFxuIik7Cj4gKwkJCXJldHVy biAtRU9QTk9UU1VQUDsKPiArCQl9Cj4gKwo+ICsJCWVjYy0+c3RyZW5ndGggPSBzdHJlbmd0aHNb aV07Cj4gKwl9Cj4gKwllY2MtPnN0ZXBzID0gbXRkLT53cml0ZXNpemUgLyBlY2MtPnNpemU7Cj4g KwllY2MtPmJ5dGVzID0gRElWX1JPVU5EX1VQKGVjYy0+c3RyZW5ndGggKiBmbHMoOCAqIDEwMjQp LCA4KTsKPiArCS8qIEhXIEVDQyBhbHdheXMgd29yayB3aXRoIGV2ZW4gbnVtYmVycyBvZiBFQ0Mg Ynl0ZXMuICovCj4gKwllY2MtPmJ5dGVzID0gQUxJR04oZWNjLT5ieXRlcywgMik7Cj4gKwo+ICsJ cmtfbmZjX2h3X2VjY19zZXR1cChjaGlwLCBlY2MsIGVjYy0+c3RyZW5ndGgpOwo+ICsKPiArCXJl dHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19hdHRhY2hfY2hpcChzdHJ1Y3Qg bmFuZF9jaGlwICpjaGlwKQo+ICt7Cj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9f bXRkKGNoaXApOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gbXRkLT5kZXYucGFyZW50Owo+ICsJ c3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsJ c3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHRvX3JrbmFuZChjaGlwKTsKPiArCXN0 cnVjdCBuYW5kX2VjY19jdHJsICplY2MgPSAmY2hpcC0+ZWNjOwo+ICsJaW50IGxlbjsKPiArCWlu dCByZXQ7Cj4gKwo+ICsJaWYgKGNoaXAtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KSB7Cj4g KwkJZGV2X2VycihkZXYsICIxNiBiaXRzIGJ1cyB3aWR0aCBub3Qgc3VwcG9ydGVkIik7Cj4gKwkJ cmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJaWYgKGVjYy0+bW9kZSAhPSBOQU5EX0VDQ19I VykKPiArCQlyZXR1cm4gMDsKPiArCj4gKwlyZXQgPSBya19uZmNfZWNjX2luaXQoZGV2LCBtdGQp Owo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4gcmV0Owo+ICsJcmtuYW5kLT5zcGFyZV9wZXJfc2Vj dG9yID0gZWNjLT5ieXRlcyArIE5GQ19TWVNfREFUQV9TSVpFOwo+ICsJcmtuYW5kLT5tZXRhZGF0 YV9zaXplID0gTkZDX1NZU19EQVRBX1NJWkUgKiBlY2MtPnN0ZXBzOwo+ICsKPiArCWlmIChya25h bmQtPm1ldGFkYXRhX3NpemUgPCBORkNfU1lTX0RBVEFfU0laRSArIDIpIHsKPiArCQlkZXZfZXJy KGRldiwKPiArCQkJIkRyaXZlciBuZWVkcyBhdCBsZWFzdCAlZCBieXRlcyBvZiBtZXRhIGRhdGFc biIsCj4gKwkJCU5GQ19TWVNfREFUQV9TSVpFICsgMik7Cj4gKwkJcmV0dXJuIC1FSU87Cj4gKwl9 Cj4gKwkvKiBDaGVjayBidWZmZXIgZmlyc3QsIGF2b2lkIGR1cGxpY2F0ZSBhbGxvYyBidWZmZXIu ICovCj4gKwlpZiAobmZjLT5idWZmZXIpCj4gKwkJcmV0dXJuIDA7CgpZb3UgY2FuJ3QgZG8gdGhh dCB0aGlzIHdheTogd2hhdCBpZiB0aGUgZmlyc3QgbXRkIHRvIGJlIHJlZ2lzdGVyZWQgdXNlcwph IHNtYWxsZXIgcGFnZSBzaXplIHRoYW4gdGhlIHNlY29uZD8KCj4gKwo+ICsJbGVuID0gbXRkLT53 cml0ZXNpemUgKyBtdGQtPm9vYnNpemU7Cj4gKwluZmMtPmJ1ZmZlciA9IGRldm1fa3phbGxvYyhk ZXYsIGxlbiwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwo+ICsJaWYgKCFuZmMtPmJ1ZmZlcikKPiAr CQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwluZmMtPnBhZ2VfYnVmID0gbmZjLT5idWZmZXI7Cj4g KwlsZW4gPSBlY2MtPnN0ZXBzICogTkZDX01BWF9PT0JfUEVSX1NURVA7Cj4gKwluZmMtPm9vYl9i dWYgPSBkZXZtX2t6YWxsb2MoZGV2LCBsZW4sIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKPiArCWlm ICghbmZjLT5vb2JfYnVmKSB7Cj4gKwkJbmZjLT5idWZmZXIgPSBOVUxMOwo+ICsJCW5mYy0+b29i X2J1ZiA9IE5VTEw7CgpJIGRvbid0IHRoaW5rIHRoaXMgaXMgbmVlZGVkCgo+ICsJCXJldHVybiAt RU5PTUVNOwo+ICsJfQo+ICsKPiArCWNoaXAtPmVjYy53cml0ZV9wYWdlX3JhdyA9IHJrX25mY193 cml0ZV9wYWdlX3JhdzsKPiArCWNoaXAtPmVjYy53cml0ZV9wYWdlID0gcmtfbmZjX3dyaXRlX3Bh Z2VfaHdlY2M7Cj4gKwljaGlwLT5lY2Mud3JpdGVfb29iX3JhdyA9IHJrX25mY193cml0ZV9vb2Jf c3RkOwo+ICsJY2hpcC0+ZWNjLndyaXRlX29vYiA9IHJrX25mY193cml0ZV9vb2Jfc3RkOwo+ICsK PiArCWNoaXAtPmVjYy5yZWFkX3BhZ2VfcmF3ID0gcmtfbmZjX3JlYWRfcGFnZV9yYXc7Cj4gKwlj aGlwLT5lY2MucmVhZF9wYWdlID0gcmtfbmZjX3JlYWRfcGFnZV9od2VjYzsKPiArCWNoaXAtPmVj Yy5yZWFkX29vYl9yYXcgPSBya19uZmNfcmVhZF9vb2Jfc3RkOwo+ICsJY2hpcC0+ZWNjLnJlYWRf b29iID0gcmtfbmZjX3JlYWRfb29iX3N0ZDsKCkkgZG9uJ3QgbGlrZSB0aGUgX3N0ZCBwcmVmaXgs IGJ1dCBpdCBzaG91bGQgYmUgZ29uZSB3aGVuIHNwbGl0dGluZyB0aGUKZnVuY3Rpb25zIGFzIGFk dmlzZWQuCgo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0 IG5hbmRfY29udHJvbGxlcl9vcHMgcmtfbmZjX2NvbnRyb2xsZXJfb3BzID0gewo+ICsJLmF0dGFj aF9jaGlwID0gcmtfbmZjX2F0dGFjaF9jaGlwLAo+ICsJLmV4ZWNfb3AgPSBya19uZmNfZXhlY19v cCwKPiArCS5zZXR1cF9kYXRhX2ludGVyZmFjZSA9IHJrX25mY19zZXR1cF9kYXRhX2ludGVyZmFj ZSwKPiArfTsKPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX25hbmRfY2hpcF9pbml0KHN0cnVjdCBk ZXZpY2UgKmRldiwgc3RydWN0IHJrX25mYyAqbmZjLAo+ICsJCQkJIHN0cnVjdCBkZXZpY2Vfbm9k ZSAqbnApCj4gK3sKPiArCXN0cnVjdCBya19uZmNfbmFuZF9jaGlwICpya25hbmQ7Cj4gKwlzdHJ1 Y3QgbmFuZF9jaGlwICpjaGlwOwo+ICsJc3RydWN0IG10ZF9pbmZvICptdGQ7Cj4gKwlpbnQgbnNl bHM7Cj4gKwl1MzIgdG1wOwo+ICsJaW50IHJldDsKPiArCWludCBpOwo+ICsKPiArCWlmICghb2Zf Z2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgJm5zZWxzKSkKPiArCQlyZXR1cm4gLUVOT0RFVjsKPiAr CW5zZWxzIC89IHNpemVvZih1MzIpOwo+ICsJaWYgKCFuc2VscyB8fCBuc2VscyA+IE5GQ19NQVhf TlNFTFMpIHsKPiArCQlkZXZfZXJyKGRldiwgImludmFsaWQgcmVnIHByb3BlcnR5IHNpemUgJWRc biIsIG5zZWxzKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlya25hbmQgPSBk ZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnJrbmFuZCkgKyBuc2VscyAqIHNpemVvZih1OCksCj4g KwkJCSAgICAgIEdGUF9LRVJORUwpOwo+ICsJaWYgKCFya25hbmQpCj4gKwkJcmV0dXJuIC1FTk9N RU07Cj4gKwo+ICsJcmtuYW5kLT5uc2VscyA9IG5zZWxzOwo+ICsJZm9yIChpID0gMDsgaSA8IG5z ZWxzOyBpKyspIHsKPiArCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChucCwgInJl ZyIsIGksICZ0bXApOwo+ICsJCWlmIChyZXQpIHsKPiArCQkJZGV2X2VycihkZXYsICJyZWcgcHJv cGVydHkgZmFpbHVyZSA6ICVkXG4iLCByZXQpOwo+ICsJCQlyZXR1cm4gcmV0Owo+ICsJCX0KPiAr Cj4gKwkJaWYgKHRtcCA+PSBORkNfTUFYX05TRUxTKSB7Cj4gKwkJCWRldl9lcnIoZGV2LCAiaW52 YWxpZCBDUzogJXVcbiIsIHRtcCk7Cj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ICsJCX0KPiArCj4g KwkJaWYgKHRlc3RfYW5kX3NldF9iaXQodG1wLCAmbmZjLT5hc3NpZ25lZF9jcykpIHsKPiArCQkJ ZGV2X2VycihkZXYsICJDUyAldSBhbHJlYWR5IGFzc2lnbmVkXG4iLCB0bXApOwo+ICsJCQlyZXR1 cm4gLUVJTlZBTDsKPiArCQl9Cj4gKwo+ICsJCXJrbmFuZC0+c2Vsc1tpXSA9IHRtcDsKPiArCX0K PiArCj4gKwljaGlwID0gJnJrbmFuZC0+Y2hpcDsKPiArCWNoaXAtPmNvbnRyb2xsZXIgPSAmbmZj LT5jb250cm9sbGVyOwo+ICsKPiArCW5hbmRfc2V0X2ZsYXNoX25vZGUoY2hpcCwgbnApOwo+ICsK PiArCW5hbmRfc2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwLCBuZmMpOwo+ICsKPiArCWNoaXAtPm9w dGlvbnMgfD0gTkFORF9VU0VTX0RNQSB8IE5BTkRfTk9fU1VCUEFHRV9XUklURTsKPiArCWNoaXAt PmJidF9vcHRpb25zID0gTkFORF9CQlRfVVNFX0ZMQVNIIHwgTkFORF9CQlRfTk9fT09COwo+ICsK PiArCS8qIFNldCBkZWZhdWx0IG1vZGUgaW4gY2FzZSBkdCBlbnRyeSBpcyBtaXNzaW5nLiAqLwo+ ICsJY2hpcC0+ZWNjLm1vZGUgPSBOQU5EX0VDQ19IVzsKPiArCj4gKwltdGQgPSBuYW5kX3RvX210 ZChjaGlwKTsKPiArCW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKPiArCW10ZC0+ZGV2LnBhcmVu dCA9IGRldjsKPiArCj4gKwlpZiAoIW10ZC0+bmFtZSkgewo+ICsJCWRldl9lcnIobmZjLT5kZXYs ICJOQU5EIGxhYmVsIHByb3BlcnR5IGlzIG1hbmRhdG9yeVxuIik7Cj4gKwkJcmV0dXJuIC1FSU5W QUw7Cj4gKwl9Cj4gKwo+ICsJbXRkX3NldF9vb2JsYXlvdXQobXRkLCAmcmtfbmZjX29vYmxheW91 dF9vcHMpOwo+ICsJcmtfbmZjX2h3X2luaXQobmZjKTsKPiArCXJldCA9IG5hbmRfc2NhbihjaGlw LCBuc2Vscyk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJaWYgKGNoaXAt Pm9wdGlvbnMgJiBOQU5EX0lTX0JPT1RfTUVESVVNKSB7Cj4gKwkJcmV0ID0gb2ZfcHJvcGVydHlf cmVhZF91MzIobnAsICJyb2NrY2hpcCxib290LWJsa3MiLCAmdG1wKTsKPiArCQlya25hbmQtPmJv b3RfYmxrcyA9IHJldCA/IDAgOiB0bXA7CgpDYW4ndCB5b3UgZ3Vlc3MgdGhpcyBlbnRyeSBrbm93 aW5nIHRoZSBJUCB2ZXJzaW9uL1NvQyB2ZXJzaW9uPwoKPiArCj4gKwkJcmV0ID0gb2ZfcHJvcGVy dHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxib290LWVjYy1zdHJlbmd0aCIsCj4gKwkJCQkJICAg JnRtcCk7Cj4gKwkJcmtuYW5kLT5ib290X2VjYyA9IHJldCA/IGNoaXAtPmVjYy5zdHJlbmd0aCA6 IHRtcDsKPiArCX0KPiArCj4gKwlyZXQgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKG10ZCwgTlVMTCwg MCk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJZGV2X2VycihkZXYsICJtdGQgcGFyc2UgcGFydGl0aW9u IGVycm9yXG4iKTsKPiArCQluYW5kX2NsZWFudXAoY2hpcCk7Cj4gKwkJcmV0dXJuIHJldDsKPiAr CX0KPiArCj4gKwlsaXN0X2FkZF90YWlsKCZya25hbmQtPm5vZGUsICZuZmMtPmNoaXBzKTsKPiAr Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgcmtfbmZjX2NoaXBzX2NsZWFu dXAoc3RydWN0IHJrX25mYyAqbmZjKQo+ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCAq cmtuYW5kLCAqdG1wOwo+ICsJc3RydWN0IG5hbmRfY2hpcCAqY2hpcDsKPiArCWludCByZXQ7Cj4g Kwo+ICsJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJrbmFuZCwgdG1wLCAmbmZjLT5jaGlwcywg bm9kZSkgewo+ICsJCWNoaXAgPSAmcmtuYW5kLT5jaGlwOwo+ICsJCXJldCA9IG10ZF9kZXZpY2Vf dW5yZWdpc3RlcihuYW5kX3RvX210ZChjaGlwKSk7Cj4gKwkJV0FSTl9PTihyZXQpOwo+ICsJCW5h bmRfY2xlYW51cChjaGlwKTsKPiArCQlsaXN0X2RlbCgmcmtuYW5kLT5ub2RlKTsKPiArCX0KPiAr fQo+ICsKPiArc3RhdGljIGludCBya19uZmNfbmFuZF9jaGlwc19pbml0KHN0cnVjdCBkZXZpY2Ug KmRldiwgc3RydWN0IHJrX25mYyAqbmZjKQo+ICt7Cj4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5w ID0gZGV2LT5vZl9ub2RlLCAqbmFuZF9ucDsKPiArCWludCBuY2hpcHMgPSBvZl9nZXRfY2hpbGRf Y291bnQobnApOwo+ICsJaW50IHJldDsKPiArCj4gKwlpZiAoIW5jaGlwcyB8fCBuY2hpcHMgPiBO RkNfTUFYX05TRUxTKSB7Cj4gKwkJZGV2X2VycihuZmMtPmRldiwgIkluY29ycmVjdCBudW1iZXIg b2YgTkFORCBjaGlwcyAoJWQpXG4iLAo+ICsJCQluY2hpcHMpOwo+ICsJCXJldHVybiAtRUlOVkFM Owo+ICsJfQo+ICsKPiArCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobnAsIG5hbmRfbnApIHsKPiAr CQlyZXQgPSBya19uZmNfbmFuZF9jaGlwX2luaXQoZGV2LCBuZmMsIG5hbmRfbnApOwo+ICsJCWlm IChyZXQpIHsKPiArCQkJb2Zfbm9kZV9wdXQobmFuZF9ucCk7Cj4gKwkJCXJrX25mY19jaGlwc19j bGVhbnVwKG5mYyk7Cj4gKwkJCXJldHVybiByZXQ7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldHVy biAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgc3RydWN0IG5mY19jZmcgbmZjX3Y2X2NmZyA9IHsKPiAr CQkudHlwZQkJCT0gTkZDX1Y2LAo+ICsJCS5lY2Nfc3RyZW5ndGhzCQk9IHs2MCwgNDAsIDI0LCAx Nn0sCj4gKwkJLmVjY19jZmdzCQk9IHsKPiArCQkJMHgwMDA0MDAxMSwgMHgwMDA0MDAwMSwgMHgw MDAwMDAxMSwgMHgwMDAwMDAwMSwKPiArCQl9LAo+ICsJCS5mbGN0bF9vZmYJCT0gMHgwOCwKPiAr CQkuYmNoY3RsX29mZgkJPSAweDBDLAo+ICsJCS5kbWFfY2ZnX29mZgkJPSAweDEwLAo+ICsJCS5k bWFfZGF0YV9idWZfb2ZmCT0gMHgxNCwKPiArCQkuZG1hX29vYl9idWZfb2ZmCT0gMHgxOCwKPiAr CQkuZG1hX3N0X29mZgkJPSAweDFDLAo+ICsJCS5iY2hfc3Rfb2ZmCQk9IDB4MjAsCj4gKwkJLnJh bmRtel9vZmYJCT0gMHgxNTAsCj4gKwkJLmludF9lbl9vZmYJCT0gMHgxNkMsCj4gKwkJLmludF9j bHJfb2ZmCQk9IDB4MTcwLAo+ICsJCS5pbnRfc3Rfb2ZmCQk9IDB4MTc0LAo+ICsJCS5vb2IwX29m ZgkJPSAweDIwMCwKPiArCQkub29iMV9vZmYJCT0gMHgyMzAsCj4gKwkJLmVjYzAJCQk9IHsKPiAr CQkJLmVycl9mbGFnX2JpdAk9IDIsCj4gKwkJCS5sb3cJCT0gMywKPiArCQkJLmxvd19tYXNrCT0g MHgxRiwKPiArCQkJLmxvd19ibgkJPSA1LAo+ICsJCQkuaGlnaAkJPSAyNywKPiArCQkJLmhpZ2hf bWFzawk9IDB4MSwKPiArCQl9LAo+ICsJCS5lY2MxCQkJPSB7Cj4gKwkJCS5lcnJfZmxhZ19iaXQJ PSAxNSwKPiArCQkJLmxvdwkJPSAxNiwKPiArCQkJLmxvd19tYXNrCT0gMHgxRiwKPiArCQkJLmxv d19ibgkJPSA1LAo+ICsJCQkuaGlnaAkJPSAyOSwKPiArCQkJLmhpZ2hfbWFzawk9IDB4MSwKPiAr CQl9LAo+ICt9Owo+ICsKPiArc3RhdGljIHN0cnVjdCBuZmNfY2ZnIG5mY192OF9jZmcgPSB7Cj4g KwkJLnR5cGUJCQk9IE5GQ19WOCwKPiArCQkuZWNjX3N0cmVuZ3RocwkJPSB7MTYsIDE2LCAxNiwg MTZ9LAo+ICsJCS5lY2NfY2ZncwkJPSB7Cj4gKwkJCTB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4 MDAwMDAwMDEsIDB4MDAwMDAwMDEsCj4gKwkJfSwKPiArCQkuZmxjdGxfb2ZmCQk9IDB4MDgsCj4g KwkJLmJjaGN0bF9vZmYJCT0gMHgwQywKPiArCQkuZG1hX2NmZ19vZmYJCT0gMHgxMCwKPiArCQku ZG1hX2RhdGFfYnVmX29mZgk9IDB4MTQsCj4gKwkJLmRtYV9vb2JfYnVmX29mZgk9IDB4MTgsCj4g KwkJLmRtYV9zdF9vZmYJCT0gMHgxQywKPiArCQkuYmNoX3N0X29mZgkJPSAweDIwLAo+ICsJCS5y YW5kbXpfb2ZmCQk9IDB4MTUwLAo+ICsJCS5pbnRfZW5fb2ZmCQk9IDB4MTZDLAo+ICsJCS5pbnRf Y2xyX29mZgkJPSAweDE3MCwKPiArCQkuaW50X3N0X29mZgkJPSAweDE3NCwKPiArCQkub29iMF9v ZmYJCT0gMHgyMDAsCj4gKwkJLm9vYjFfb2ZmCQk9IDB4MjMwLAo+ICsJCS5lY2MwCQkJPSB7Cj4g KwkJCS5lcnJfZmxhZ19iaXQJPSAyLAo+ICsJCQkubG93CQk9IDMsCj4gKwkJCS5sb3dfbWFzawk9 IDB4MUYsCj4gKwkJCS5sb3dfYm4JCT0gNSwKPiArCQkJLmhpZ2gJCT0gMjcsCj4gKwkJCS5oaWdo X21hc2sJPSAweDEsCj4gKwkJfSwKPiArCQkuZWNjMQkJCT0gewo+ICsJCQkuZXJyX2ZsYWdfYml0 CT0gMTUsCj4gKwkJCS5sb3cJCT0gMTYsCj4gKwkJCS5sb3dfbWFzawk9IDB4MUYsCj4gKwkJCS5s b3dfYm4JCT0gNSwKPiArCQkJLmhpZ2gJCT0gMjksCj4gKwkJCS5oaWdoX21hc2sJPSAweDEsCj4g KwkJfSwKPiArfTsKPiArCj4gK3N0YXRpYyBzdHJ1Y3QgbmZjX2NmZyBuZmNfdjlfY2ZnID0gewo+ ICsJCS50eXBlCQkJPSBORkNfVjksCj4gKwkJLmVjY19zdHJlbmd0aHMJCT0gezcwLCA2MCwgNDAs IDE2fSwKPiArCQkuZWNjX2NmZ3MJCT0gewo+ICsJCQkweDAwMDAwMDAxLCAweDA2MDAwMDAxLCAw eDA0MDAwMDAxLCAweDAyMDAwMDAxLAo+ICsJCX0sCj4gKwkJLmZsY3RsX29mZgkJPSAweDEwLAo+ ICsJCS5iY2hjdGxfb2ZmCQk9IDB4MjAsCj4gKwkJLmRtYV9jZmdfb2ZmCQk9IDB4MzAsCj4gKwkJ LmRtYV9kYXRhX2J1Zl9vZmYJPSAweDM0LAo+ICsJCS5kbWFfb29iX2J1Zl9vZmYJPSAweDM4LAo+ ICsJCS5kbWFfc3Rfb2ZmCQk9IDB4M0MsCj4gKwkJLmJjaF9zdF9vZmYJCT0gMHgxNTAsCj4gKwkJ LnJhbmRtel9vZmYJCT0gMHgyMDgsCj4gKwkJLmludF9lbl9vZmYJCT0gMHgxMjAsCj4gKwkJLmlu dF9jbHJfb2ZmCQk9IDB4MTI0LAo+ICsJCS5pbnRfc3Rfb2ZmCQk9IDB4MTI4LAo+ICsJCS5vb2Iw X29mZgkJPSAweDIwMCwKPiArCQkub29iMV9vZmYJCT0gMHgyMDQsCj4gKwkJLmVjYzAJCQk9IHsK PiArCQkJLmVycl9mbGFnX2JpdAk9IDIsCj4gKwkJCS5sb3cJCT0gMywKPiArCQkJLmxvd19tYXNr CT0gMHg3RiwKPiArCQkJLmxvd19ibgkJPSA3LAo+ICsJCQkuaGlnaAkJPSAwLAo+ICsJCQkuaGln aF9tYXNrCT0gMHgwLAo+ICsJCX0sCj4gKwkJLmVjYzEJCQk9IHsKPiArCQkJLmVycl9mbGFnX2Jp dAk9IDE4LAo+ICsJCQkubG93CQk9IDE5LAo+ICsJCQkubG93X21hc2sJPSAweDdGLAo+ICsJCQku bG93X2JuCQk9IDcsCj4gKwkJCS5oaWdoCQk9IDAsCj4gKwkJCS5oaWdoX21hc2sJPSAweDAsCj4g KwkJfSwKPiArfTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJrX25m Y19pZF90YWJsZVtdID0gewo+ICsJey5jb21wYXRpYmxlID0gInJvY2tjaGlwLHB4MzAtbmZjIiwK PiArCQkuZGF0YSA9ICZuZmNfdjlfY2ZnIH0sCgoJewoJCS5jb21wYXRpYmxlID0KCQkuZGF0YSA9 Cgl9LAoKb3IKCgl7IC5jb21wYXRpYmxlID0gLCAuZGF0YSA9IH0sCgpidXQgbm90OgoKPiArCXsu Y29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazI5MjgtbmZjIiwKPiArCQkuZGF0YSA9ICZuZmNfdjZf Y2ZnIH0sCj4gKwl7LmNvbXBhdGlibGUgPSAicm9ja2NoaXAscnYxMTA4LW5mYyIsCj4gKwkJLmRh dGEgPSAmbmZjX3Y4X2NmZyB9LAo+ICsJeyAvKiBzZW50aW5lbCAqLyB9Cj4gK307Cj4gK01PRFVM RV9ERVZJQ0VfVEFCTEUob2YsIHJrX25mY19pZF90YWJsZSk7Cj4gKwo+ICtzdGF0aWMgaW50IHJr X25mY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICt7Cj4gKwlzdHJ1Y3Qg ZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2Owo+ICsJc3RydWN0IHJrX25mYyAqbmZjOwo+ICsJaW50 IHJldCwgaXJxOwo+ICsKPiArCW5mYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqbmZjKSwg R0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIW5mYykKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwlu YW5kX2NvbnRyb2xsZXJfaW5pdCgmbmZjLT5jb250cm9sbGVyKTsKPiArCUlOSVRfTElTVF9IRUFE KCZuZmMtPmNoaXBzKTsKPiArCW5mYy0+Y29udHJvbGxlci5vcHMgPSAmcmtfbmZjX2NvbnRyb2xs ZXJfb3BzOwo+ICsKPiArCW5mYy0+Y2ZnID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKGRldik7 Cj4gKwluZmMtPmRldiA9IGRldjsKPiArCj4gKwlpbml0X2NvbXBsZXRpb24oJm5mYy0+ZG9uZSk7 Cj4gKwo+ICsJbmZjLT5yZWdzID0gZGV2bV9wbGF0Zm9ybV9pb3JlbWFwX3Jlc291cmNlKHBkZXYs IDApOwo+ICsJaWYgKElTX0VSUihuZmMtPnJlZ3MpKSB7Cj4gKwkJcmV0ID0gUFRSX0VSUihuZmMt PnJlZ3MpOwo+ICsJCWdvdG8gcmVsZWFzZV9uZmM7Cj4gKwl9Cj4gKwo+ICsJbmZjLT5jbGsubmZj X2NsayA9IGRldm1fY2xrX2dldChkZXYsICJuZmMiKTsKPiArCWlmIChJU19FUlIobmZjLT5jbGsu bmZjX2NsaykpIHsKPiArCQlkZXZfZGJnKGRldiwgIm5vIG5mYyBjbGtcbiIpOwo+ICsJCS8qIFNv bWUgZWFybGllciBtb2RlbHMsIHN1Y2ggYXMgcmszMDY2LCBoYXZlIG5vIG5mYyBjbGsuICovCj4g Kwl9Cj4gKwo+ICsJbmZjLT5jbGsuYWhiX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJhaGIiKTsK PiArCWlmIChJU19FUlIobmZjLT5jbGsuYWhiX2NsaykpIHsKPiArCQlkZXZfZXJyKGRldiwgIm5v IGFoYiBjbGtcbiIpOwo+ICsJCXJldCA9IFBUUl9FUlIobmZjLT5jbGsuYWhiX2Nsayk7Cj4gKwkJ Z290byByZWxlYXNlX25mYzsKPiArCX0KPiArCj4gKwlyZXQgPSBya19uZmNfZW5hYmxlX2Nsayhk ZXYsICZuZmMtPmNsayk7Cj4gKwlpZiAocmV0KQo+ICsJCWdvdG8gcmVsZWFzZV9uZmM7Cj4gKwo+ ICsJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKPiArCWlmIChpcnEgPCAwKSB7Cj4g KwkJZGV2X2VycihkZXYsICJubyBuZmMgaXJxIHJlc291cmNlXG4iKTsKPiArCQlyZXQgPSAtRUlO VkFMOwo+ICsJCWdvdG8gY2xrX2Rpc2FibGU7Cj4gKwl9Cj4gKwo+ICsJd3JpdGVsKDAsIG5mYy0+ cmVncyArIG5mYy0+Y2ZnLT5pbnRfZW5fb2ZmKTsKPiArCXJldCA9IGRldm1fcmVxdWVzdF9pcnEo ZGV2LCBpcnEsIHJrX25mY19pcnEsIDB4MCwgInJrLW5hbmQiLCBuZmMpOwo+ICsJaWYgKHJldCkg ewo+ICsJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgbmZjIGlycVxuIik7Cj4gKwkJ Z290byBjbGtfZGlzYWJsZTsKPiArCX0KPiArCj4gKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2 LCBuZmMpOwo+ICsKPiArCXJldCA9IHJrX25mY19uYW5kX2NoaXBzX2luaXQoZGV2LCBuZmMpOwo+ ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGluaXQgTkFORCBjaGlw c1xuIik7Cj4gKwkJZ290byBjbGtfZGlzYWJsZTsKPiArCX0KPiArCXJldHVybiAwOwo+ICsKPiAr Y2xrX2Rpc2FibGU6Cj4gKwlya19uZmNfZGlzYWJsZV9jbGsoJm5mYy0+Y2xrKTsKPiArcmVsZWFz ZV9uZmM6Cj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19yZW1v dmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiArewo+ICsJc3RydWN0IHJrX25mYyAq bmZjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Cj4gKwo+ICsJcmtfbmZjX2NoaXBzX2Ns ZWFudXAobmZjKTsKPiArCXJrX25mY19kaXNhYmxlX2NsaygmbmZjLT5jbGspOwoKRG9uJ3QgeW91 IGhhdmUgRE1BIHJlc291cmNlcyBhbmQgIWRldm0gYWxsb2NhdGVkIGJ1ZmZlcnMgdG8gZnJlZT8K Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQg cmtfbmZjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZj ICpuZmMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiArCj4gKwlya19uZmNfZGlzYWJsZV9jbGso Jm5mYy0+Y2xrKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBfX21h eWJlX3VudXNlZCBya19uZmNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKPiArewo+ICsJc3Ry dWN0IHJrX25mYyAqbmZjID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gKwlzdHJ1Y3QgcmtfbmZj X25hbmRfY2hpcCAqcmtuYW5kOwo+ICsJc3RydWN0IG5hbmRfY2hpcCAqY2hpcDsKPiArCWludCBy ZXQ7Cj4gKwl1MzIgaTsKPiArCj4gKwlyZXQgPSBya19uZmNfZW5hYmxlX2NsayhkZXYsICZuZmMt PmNsayk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJLyogUmVzZXQgTkFO RCBjaGlwIGlmIFZDQyB3YXMgcG93ZXJlZCBvZmYuICovCj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5 KHJrbmFuZCwgJm5mYy0+Y2hpcHMsIG5vZGUpIHsKPiArCQljaGlwID0gJnJrbmFuZC0+Y2hpcDsK PiArCQlmb3IgKGkgPSAwOyBpIDwgcmtuYW5kLT5uc2VsczsgaSsrKQo+ICsJCQluYW5kX3Jlc2V0 KGNoaXAsIGkpOwoKSSBhc3N1bWUgdGhpcyBpcyBoYW5kbGVkIGJ5IHRoZSBjb3JlIGFscmVhZHkg KHBsZWFzZSB2ZXJpZnkgaXQpCgo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtz dGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgcmtfbmZjX3BtX29wcyA9IHsKPiArCVNFVF9T WVNURU1fU0xFRVBfUE1fT1BTKHJrX25mY19zdXNwZW5kLCBya19uZmNfcmVzdW1lKQo+ICt9Owo+ ICsKPiArc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcmtfbmZjX2RyaXZlciA9IHsKPiAr CS5wcm9iZSA9IHJrX25mY19wcm9iZSwKPiArCS5yZW1vdmUgPSBya19uZmNfcmVtb3ZlLAo+ICsJ LmRyaXZlciA9IHsKPiArCQkubmFtZSA9ICJyb2NrY2hpcC1uZmMiLAo+ICsJCS5vZl9tYXRjaF90 YWJsZSA9IHJrX25mY19pZF90YWJsZSwKPiArCQkucG0gPSAmcmtfbmZjX3BtX29wcywKPiArCX0s Cj4gK307Cj4gKwo+ICttb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHJrX25mY19kcml2ZXIpOwo+ICsK PiArTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTUlUL0dQTCIpOwo+ICtNT0RVTEVfQVVUSE9SKCJZaWZl bmcgWmhhbyA8eWlmZW5nLnpoYW9Acm9jay1jaGlwcy5jb20+Iik7Cj4gK01PRFVMRV9ERVNDUklQ VElPTigiUm9ja2NoaXAgTmFuZCBGbGFzaCBDb250cm9sbGVyIERyaXZlciIpOwo+ICtNT0RVTEVf QUxJQVMoInBsYXRmb3JtOnJvY2tjaGlwLW5hbmQtY29udHJvbGxlciIpOwoKVGhhbmtzLApNaXF1 w6hsCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KTGludXggTVREIGRpc2N1c3Npb24gbWFpbGluZyBsaXN0Cmh0dHA6Ly9saXN0cy5pbmZyYWRl YWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtbXRkLwo= 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=-14.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,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 2AF17C43461 for ; Tue, 15 Sep 2020 08:07:58 +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 B33FB21D7D for ; Tue, 15 Sep 2020 08:07:57 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="kscqP0Xo" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B33FB21D7D 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=ho9eLg33vMP5mlyCWUbi8MOcP3dqpn2c+xaRPn0GfHI=; b=kscqP0XoLIUI7mvm70s69xBKK 1IfSO+fZ9Sste1YyOncCRuTEh+7yV5HVQOgDMQdHkiAwTaEj/D0qnMeMhEBL2rjd1/BTZce8m1s6g gBiBSqWHQW6KTbEGwGUfFkuWcG+aI1K/w8fujfz8wzepfnSceLKeceFNYnO/EggXIS8VJQe12u6NN g9vcu2hFTHuMuAhSPKqMiMsdN3HXkg9e+NXXhKYOPqee2pWKO996JvUGpit3IpSoIoRNHiTS32kgf JIKQ5zCu+ha3rz0u2VtyXTQYE2JW1f03ZqoEhR6wd8LnMi0NojIC5ter/OAu6g03jnG6JTnrXqsIy Pu4HXBZ9g==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kI60F-0004uR-BH; Tue, 15 Sep 2020 08:07:51 +0000 Received: from relay5-d.mail.gandi.net ([217.70.183.197]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kI600-0004s7-MP; Tue, 15 Sep 2020 08:07:39 +0000 X-Originating-IP: 91.224.148.103 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay5-d.mail.gandi.net (Postfix) with ESMTPSA id 538551C000E; Tue, 15 Sep 2020 08:07:29 +0000 (UTC) Date: Tue, 15 Sep 2020 10:07:28 +0200 From: Miquel Raynal To: Yifeng Zhao Subject: Re: [PATCH v8 2/8] mtd: rawnand: rockchip: NFC drivers for RK3308, RK2928 and others Message-ID: <20200915100728.5c866f89@xps13> In-Reply-To: <20200717092420.19798-3-yifeng.zhao@rock-chips.com> References: <20200717092420.19798-1-yifeng.zhao@rock-chips.com> <20200717092420.19798-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-20200915_040737_099718_FB02F21D X-CRM114-Status: GOOD ( 38.10 ) 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 SGkgWWlmZW5nLAoKSSBhbSB2ZXJ5IHNvcnJ5IGZvciB0aGUgZGVsYXkgaXQgdG9vayBtZSB0byBy ZXZpZXcgdGhpcyBkcml2ZXIsIGJ1dAp0aGVyZSBhcmUgc3RpbGwgc29tZSBzbWFsbCBpbmNvaGVy ZW5jZXMgSU1ITywgc2VlIGJlbG93LgoKWWlmZW5nIFpoYW8gPHlpZmVuZy56aGFvQHJvY2stY2hp cHMuY29tPiB3cm90ZSBvbiBGcmksIDE3IEp1bCAyMDIwCjE3OjI0OjE4ICswODAwOgoKPiBUaGlz IGRyaXZlciBzdXBwb3J0cyBSb2NrY2hpcCBORkMgKE5BTkQgRmxhc2ggQ29udHJvbGxlcikgZm91 bmQgb24gUkszMzA4LAo+IFJLMjkyOCwgUktQWDMwLCBSVjExMDggYW5kIG90aGVyIFNPQ3MuIFRo ZSBkcml2ZXIgaGFzIGJlZW4gdGVzdGVkIHVzaW5nCj4gOC1iaXQgTkFORCBpbnRlcmZhY2Ugb24g dGhlIEFSTSBiYXNlZCBSSzMzMDggcGxhdGZvcm0uCj4gCj4gU3VwcG9ydCBSb2NrY2hpcCBTb0Nz IGFuZCBORkMgdmVyc2lvbnM6Cj4gLSBQWDMwIGFuZCBSSzMzMjYoTkZDdjkwMCkuCj4gCUVDQzog MTYvNDAvNjAvNzAgYml0cy8xS0IuCj4gCUNMT0NLOiBhaGIgYW5kIG5mYy4KPiAtIFJLMzMwOCBh bmQgUlYxMTA4KE5GQ3Y4MDApLgo+IAlFQ0M6IDE2IGJpdHMvMUtCLgo+IAlDTE9DSzogYWhiIGFu ZCBuZmMuCj4gLSBSSzMwMzYgYW5kIFJLMzEyOChORkN2NjIyKS4KPiAJRUNDOiAxNi8yNC80MC82 MCBiaXRzLzFLQi4KPiAJQ0xPQ0s6IGFoYiBhbmQgbmZjLgo+IC0gUkszMDY2LCBSSzMxODggYW5k IFJLMjkyOChORkN2NjAwKS4KPiAJRUNDOiAxNi8yNC80MC82MCBiaXRzLzFLQi4KPiAJQ0xPQ0s6 IGFoYi4KPiAKPiBTdXBwb3J0ZWQgZmVhdHVyZXM6Cj4gLSBSZWFkIGZ1bGwgcGFnZSBkYXRhIGJ5 IERNQS4KPiAtIFN1cHBvcnQgSFcgRUNDKG9uZSBzdGVwIGlzIDFLQikuCj4gLSBTdXBwb3J0IDIg LSAzMksgcGFnZSBzaXplLgo+IC0gU3VwcG9ydCA4IENTKGRlcGVuZCBvbiBTb0NzKQo+IAo+IExp bWl0YXRpb25zOgo+IC0gTm8gc3VwcG9ydCBmb3IgdGhlIGVjYyBzdGVwIHNpemUgaXMgNTEyLgo+ IC0gVW50ZXN0ZWQgb24gc29tZSBTb0NzLgo+IC0gTm8gc3VwcG9ydCBmb3Igc3VicGFnZXMuCj4g LSBObyBzdXBwb3J0IGZvciB0aGUgYnVpbHRpbiByYW5kb21pemVyLgo+IC0gVGhlIG9yaWdpbmFs IGJhZCBibG9jayBtYXNrIGlzIG5vdCBzdXBwb3J0ZWQuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVz ZQo+ICAgdGhlIEJCVChiYWQgYmxvY2sgdGFibGUpLgo+IAo+IFNpZ25lZC1vZmYtYnk6IFlpZmVu ZyBaaGFvIDx5aWZlbmcuemhhb0Byb2NrLWNoaXBzLmNvbT4KPiAtLS0KPiAKPiBDaGFuZ2VzIGlu IHY4OiBOb25lCj4gQ2hhbmdlcyBpbiB2NzoKPiAtIFJlYmFzZSB0byBsaW51eC1uZXh0Lgo+IC0g Rml4IGNvZGluZyBzdHlsZS4KPiAtIFJlc2VydmVkIDQgYnl0ZXMgYXQgdGhlIGJlZ2luaW5nIG9m IHRoZSBvb2IgYXJlYS4KPiAtIFBhZ2UgcmF3IHJlYWQgYW5kIHdyaXRlIGluY2x1ZGVkIGVjYyBk YXRhLgo+IAo+IENoYW5nZXMgaW4gdjY6Cj4gLSBUaGUgbXRkLT5uYW1lIHNldCBieSBOQU5EIGxh YmVsIHByb3BlcnR5Lgo+IC0gQWRkIHNvbWUgY29tbWVudHMuCj4gLSBGaXggY29tcGlsZSBlcnJv ci4KPiAKPiBDaGFuZ2VzIGluIHY1Ogo+IC0gQWRkIGJvb3QgYmxvY2tzIHN1cHBvcnQgIHdpdGgg ZGlmZmVyZW50IEVDQyBmb3IgYm9vdFJPTS4KPiAtIFJlbmFtZSByb2NrY2hpcC1uYW5kLmMgdG8g cm9ja2NoaXAtbmFuZC1jb250cm9sbGVyLmMuCj4gLSBVbmlmaWNhdGlvbiBvZiBvdGhlciB2YXJp YWJsZSBuYW1lcy4KPiAtIFJlbW92ZSBzb21lIGNvbXBhdGlibGUgZGVmaW5lLgo+IAo+IENoYW5n ZXMgaW4gdjQ6Cj4gLSBEZWZpbmUgcGxhdGZvcm0gZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSByZWdp c3RlciBvZmZzZXRzLgo+IC0gVGhlIGNvbXBhdGlibGUgZGVmaW5lIHdpdGggcmt4eF9uZmMuCj4g LSBVc2UgU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMgdG8gZGVmaW5lIFBNX09QUy4KPiAtIFVzZSBl eGVjX29wIGluc3RlYWQgb2YgbGVnYWN5IGhvb2tzLgo+IAo+IENoYW5nZXMgaW4gdjM6IE5vbmUK PiBDaGFuZ2VzIGluIHYyOgo+IC0gRml4IGNvbXBpbGUgZXJyb3IuCj4gLSBJbmNsdWRlIGhlYWRl ciBmaWxlcyBzb3J0ZWQgYnkgZmlsZSBuYW1lLgo+IAo+ICBkcml2ZXJzL210ZC9uYW5kL3Jhdy9L Y29uZmlnICAgICAgICAgICAgICAgICAgfCAgIDEyICsKPiAgZHJpdmVycy9tdGQvbmFuZC9yYXcv TWFrZWZpbGUgICAgICAgICAgICAgICAgIHwgICAgMSArCj4gIC4uLi9tdGQvbmFuZC9yYXcvcm9j a2NoaXAtbmFuZC1jb250cm9sbGVyLmMgICB8IDE0MjIgKysrKysrKysrKysrKysrKysKPiAgMyBm aWxlcyBjaGFuZ2VkLCAxNDM1IGluc2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRy aXZlcnMvbXRkL25hbmQvcmF3L3JvY2tjaGlwLW5hbmQtY29udHJvbGxlci5jCj4gCj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvcmF3L0tjb25maWcgYi9kcml2ZXJzL210ZC9uYW5kL3Jh dy9LY29uZmlnCj4gaW5kZXggMTEzZjYxMDUyMjY5Li42NDkyODU1ZDRhNTUgMTAwNjQ0Cj4gLS0t IGEvZHJpdmVycy9tdGQvbmFuZC9yYXcvS2NvbmZpZwo+ICsrKyBiL2RyaXZlcnMvbXRkL25hbmQv cmF3L0tjb25maWcKPiBAQCAtNDYxLDYgKzQ2MSwxOCBAQCBjb25maWcgTVREX05BTkRfQVJBU0FO Cj4gIAkgIEVuYWJsZXMgdGhlIGRyaXZlciBmb3IgdGhlIEFyYXNhbiBOQU5EIGZsYXNoIGNvbnRy b2xsZXIgb24KPiAgCSAgWnlucSBVbHRyYXNjYWxlKyBNUFNvQy4KPiAgCj4gK2NvbmZpZyBNVERf TkFORF9ST0NLQ0hJUAo+ICsJdHJpc3RhdGUgIlJvY2tjaGlwIE5BTkQgY29udHJvbGxlciIKPiAr CWRlcGVuZHMgb24gQVJDSF9ST0NLQ0hJUCAmJiBIQVNfSU9NRU0KPiArCWhlbHAKPiArCSAgRW5h YmxlcyBzdXBwb3J0IGZvciBOQU5EIGNvbnRyb2xsZXIgb24gUm9ja2NoaXAgU29Dcy4KPiArCSAg VGhlcmUgYXJlIGZvdXIgZGlmZmVyZW50IHZlcnNpb25zIG9mIE5BTkQgRkxBU0ggQ29udHJvbGxl cnMsCj4gKwkgIGluY2x1ZGluZzoKPiArCSAgICBORkMgdjYwMDogUksyOTI4LCBSSzMwNjYsIFJL MzE4OAo+ICsJICAgIE5GQyB2NjIyOiBSSzMwMzYsIFJLMzEyOAo+ICsJICAgIE5GQyB2ODAwOiBS SzMzMDgsIFJWMTEwOAo+ICsJICAgIE5GQyB2OTAwOiBQWDMwLCBSSzMzMjYKPiArCj4gIGNvbW1l bnQgIk1pc2MiCj4gIAo+ICBjb25maWcgTVREX1NNX0NPTU1PTgo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL210ZC9uYW5kL3Jhdy9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L01ha2VmaWxl Cj4gaW5kZXggMjkzMGY1YjkwMTVkLi45NjBjOWJlMjUyMDQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVy cy9tdGQvbmFuZC9yYXcvTWFrZWZpbGUKPiArKysgYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9NYWtl ZmlsZQo+IEBAIC01OCw2ICs1OCw3IEBAIG9iai0kKENPTkZJR19NVERfTkFORF9TVE0zMl9GTUMy KQkrPSBzdG0zMl9mbWMyX25hbmQubwo+ICBvYmotJChDT05GSUdfTVREX05BTkRfTUVTT04pCQkr PSBtZXNvbl9uYW5kLm8KPiAgb2JqLSQoQ09ORklHX01URF9OQU5EX0NBREVOQ0UpCQkrPSBjYWRl bmNlLW5hbmQtY29udHJvbGxlci5vCj4gIG9iai0kKENPTkZJR19NVERfTkFORF9BUkFTQU4pCQkr PSBhcmFzYW4tbmFuZC1jb250cm9sbGVyLm8KPiArb2JqLSQoQ09ORklHX01URF9OQU5EX1JPQ0tD SElQKQkJKz0gcm9ja2NoaXAtbmFuZC1jb250cm9sbGVyLm8KPiAgCj4gIG5hbmQtb2JqcyA6PSBu YW5kX2Jhc2UubyBuYW5kX2xlZ2FjeS5vIG5hbmRfYmJ0Lm8gbmFuZF90aW1pbmdzLm8gbmFuZF9p ZHMubwo+ICBuYW5kLW9ianMgKz0gbmFuZF9vbmZpLm8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9t dGQvbmFuZC9yYXcvcm9ja2NoaXAtbmFuZC1jb250cm9sbGVyLmMgYi9kcml2ZXJzL210ZC9uYW5k L3Jhdy9yb2NrY2hpcC1uYW5kLWNvbnRyb2xsZXIuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4g aW5kZXggMDAwMDAwMDAwMDAwLi5mZWMxMzYwNjAzZTAKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIv ZHJpdmVycy9tdGQvbmFuZC9yYXcvcm9ja2NoaXAtbmFuZC1jb250cm9sbGVyLmMKPiBAQCAtMCww ICsxLDE0MjIgQEAKPiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgT1IgTUlU Cj4gKy8qCj4gKyAqIFJvY2tjaGlwIE5BTkQgRmxhc2ggY29udHJvbGxlciBkcml2ZXIuCj4gKyAq IENvcHlyaWdodCAoQykgMjAyMCBSb2NrY2hpcCBJbmMuCj4gKyAqIEF1dGhvcjogWWlmZW5nIFpo YW8gPHlpZmVuZy56aGFvQHJvY2stY2hpcHMuY29tPgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxs aW51eC9jbGsuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4gKyNpbmNsdWRlIDxsaW51 eC9kbWEtbWFwcGluZy5oPgo+ICsjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+Cj4gKyNpbmNs dWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgo+ICsj aW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Cj4g KyNpbmNsdWRlIDxsaW51eC9tdGQvcmF3bmFuZC5oPgo+ICsjaW5jbHVkZSA8bGludXgvb2YuaD4K PiArI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGxhdGZv cm1fZGV2aWNlLmg+Cj4gKwo+ICsvKgo+ICsgKiBORkMgUGFnZSBEYXRhIExheW91dDoKPiArICoJ MTAyNCBCeXRlcyBEYXRhICsgNEJ5dGVzIHN5cyBkYXRhICsgMjhCeXRlc34xMjRCeXRlcyBlY2Mg Kwo+ICsgKgkxMDI0IEJ5dGVzIERhdGEgKyA0Qnl0ZXMgc3lzIGRhdGEgKyAyOEJ5dGVzfjEyNEJ5 dGVzIGVjYyArCj4gKyAqCS4uLi4uLgo+ICsgKiBOQU5EIFBhZ2UgRGF0YSBMYXlvdXQ6Cj4gKyAq CTEwMjQgKiBuIERhdGEgKyBtIEJ5dGVzIG9vYgo+ICsgKiBPcmlnaW5hbCBCYWQgQmxvY2sgTWFz ayBMb2NhdGlvbjoKPiArICoJRmlyc3QgYnl0ZSBvZiBvb2Ioc3BhcmUpLgo+ICsgKiBuYW5kX2No aXAtPm9vYl9wb2kgZGF0YSBsYXlvdXQ6Cj4gKyAqCTRCeXRlcyBzeXMgZGF0YSArIC4uLi4gKyA0 Qnl0ZXMgc3lzIGRhdGEgKyBlY2MgZGF0YS4KPiArICovCj4gKwo+ICsvKiBOQU5EIGNvbnRyb2xs ZXIgcmVnaXN0ZXIgZGVmaW5pdGlvbiAqLwo+ICsjZGVmaW5lCU5GQ19SRUFECQkoMCkKPiArI2Rl ZmluZQlORkNfV1JJVEUJCSgxKQo+ICsjZGVmaW5lCU5GQ19GTUNUTAkJKDB4MDApCj4gKyNkZWZp bmUJCUZNQ1RMX0NFX1NFTF9NCQkweEZGCgpOaXRwaWNraW5nOiBJJ2QgcHJlZmVyCgojZGVmaW5l CU5GQ19GTUNUTAkJMHgwMAojZGVmaW5lCSAgRk1DVExfQ0VfU0VMX00JMHhGRgoKCj4gKyNkZWZp bmUJCUZNQ1RMX0NFX1NFTCh4KQkJKDEgPDwgKHgpKQo+ICsjZGVmaW5lCQlGTUNUTF9XUAkJQklU KDgpCj4gKyNkZWZpbmUJCUZNQ1RMX1JEWQkJQklUKDkpCj4gKyNkZWZpbmUJTkZDX0ZNV0FJVAkJ KDB4MDQpCj4gKyNkZWZpbmUJCUZMQ1RMX1JTVAkJQklUKDApCj4gKyNkZWZpbmUJCUZMQ1RMX1dS CQkoMSkJLyogMDogcmVhZCwgMTogd3JpdGUgKi8KPiArI2RlZmluZQkJRkxDVExfWEZFUl9TVAkJ QklUKDIpCj4gKyNkZWZpbmUJCUZMQ1RMX1hGRVJfRU4JCUJJVCgzKQo+ICsjZGVmaW5lCQlGTENU TF9BQ09SUkVDVAkJQklUKDEwKSAvKiBBdXRvIGNvcnJlY3QgZXJyb3IgYml0cy4gKi8KPiArI2Rl ZmluZQkJRkxDVExfWEZFUl9SRUFEWQlCSVQoMjApCj4gKyNkZWZpbmUJCUZMQ1RMX1hGRVJfU0VD VE9SCSgyMikKPiArI2RlZmluZQkJRkxDVExfVE9HX0ZJWAkJQklUKDI5KQo+ICsjZGVmaW5lCQlC Q0hDVExfQkFOS19NCSg3IDw8IDUpCj4gKyNkZWZpbmUJCUJDSENUTF9CQU5LCSg1KQo+ICsjZGVm aW5lCQlETUFfU1QJCQlCSVQoMCkKPiArI2RlZmluZQkJRE1BX1dSCQkJKDEpCS8qIDA6IHdyaXRl LCAxOiByZWFkICovCj4gKyNkZWZpbmUJCURNQV9FTgkJCUJJVCgyKQo+ICsjZGVmaW5lCQlETUFf QUhCX1NJWkUJCSgzKQkvKiAwOiAxLCAxOiAyLCAyOiA0ICovCj4gKyNkZWZpbmUJCURNQV9CVVJT VF9TSVpFCQkoNikJLyogMDogMSwgMzogNCwgNTogOCwgNzogMTYgKi8KPiArI2RlZmluZQkJRE1B X0lOQ19OVU0JCSg5KQkvKiAxIC0gMTYgKi8KPiArI2RlZmluZQkJRUNDX0VSUl9DTlQoeCwgZSkg KCgoKHgpID4+IChlKS5sb3cpICYgKGUpLmxvd19tYXNrKSBcCj4gKwkJCXwgKCgoeCkgPj4gKGUp LmhpZ2gpICYgKGUpLmhpZ2hfbWFzaykgPDwgKGUpLmxvd19ibikKPiArI2RlZmluZQkJSU5UX0RN QQkJCUJJVCgwKQo+ICsjZGVmaW5lCU5GQ19CQU5LCQkoMHg4MDApCj4gKyNkZWZpbmUJTkZDX0JB TktfU1RFUAkJKDB4MTAwKQo+ICsjZGVmaW5lCQlCQU5LX0RBVEEJCSgweDAwKQo+ICsjZGVmaW5l CQlCQU5LX0FERFIJCSgweDA0KQo+ICsjZGVmaW5lCQlCQU5LX0NNRAkJKDB4MDgpCj4gKyNkZWZp bmUJTkZDX1NSQU0wCQkoMHgxMDAwKQo+ICsjZGVmaW5lCU5GQ19TUkFNMQkJKDB4MTQwMCkKPiAr I2RlZmluZQlORkNfU1JBTV9TSVpFCQkoMHg0MDApCj4gKyNkZWZpbmUJTkZDX1RJTUVPVVQJCSg1 MDAwMDApCj4gKyNkZWZpbmUJTkZDX01BWF9PT0JfUEVSX1NURVAJMTI4Cj4gKyNkZWZpbmUJTkZD X01JTl9PT0JfUEVSX1NURVAJNjQKPiArI2RlZmluZQlNQVhfREFUQV9TSVpFCQkweEZGRkMKPiAr I2RlZmluZQlNQVhfQUREUkVTU19DWUMJCTYKPiArI2RlZmluZQlORkNfRUNDX01BWF9NT0RFUwk0 Cj4gKyNkZWZpbmUJTkZDX01BWF9OU0VMUwkJKDgpIC8qIFNvbWUgU29jcyBvbmx5IGhhdmUgMSBv ciAyIENTcy4gKi8KPiArI2RlZmluZQlORkNfU1lTX0RBVEFfU0laRQkoNCkgLyogNCBieXRlcyBz eXMgZGF0YSBpbiBvb2IgcHJlIDEwMjQgZGF0YS4qLwo+ICsjZGVmaW5lCVJLX0RFRkFVTFRfQ0xP Q0tfUkFURQkoMTUwICogMTAwMCAqIDEwMDApIC8qIDE1MCBNaHogKi8KPiArI2RlZmluZQlBQ0NU SU1JTkcoY3NydywgcndwdywgcndjcykgKChjc3J3KSA8PCAxMiB8IChyd3B3KSA8PCA1IHwgKHJ3 Y3MpKQo+ICsKPiArZW51bSBuZmNfdHlwZSB7Cj4gKwlORkNfVjYsCj4gKwlORkNfVjgsCj4gKwlO RkNfVjksCj4gK307Cj4gKwo+ICsvKioKPiArICogc3RydWN0IHJrX2VjY19jbnRfc3RhdHVzOiBy ZXByZXNlbnQgYSBlY2Mgc3RhdHVzIGRhdGEuCj4gKyAqIEBlcnJfZmxhZ19iaXQ6IGVycm9yIGZs YWcgYml0IGluZGV4IGF0IHJlZ2lzdGVyLgo+ICsgKiBAbG93OiBlY2MgY291bnQgbG93IGJpdCBp bmRleCBhdCByZWdpc3Rlci4KPiArICogQGxvd19tYXNrOiBtYXNrIGJpdC4KPiArICogQGxvd19i bjogZWNjIGNvdW50IGxvdyBiaXQgbnVtYmVyLgo+ICsgKiBAaGlnaDogZWNjIGNvdW50IGhpZ2gg Yml0IGluZGV4IGF0IHJlZ2lzdGVyLgo+ICsgKiBAaGlnaF9tYXNrOiBtYXNrIGJpdAo+ICsgKi8K PiArc3RydWN0IGVjY19jbnRfc3RhdHVzIHsKPiArCXU4IGVycl9mbGFnX2JpdDsKPiArCXU4IGxv dzsKPiArCXU4IGxvd19tYXNrOwo+ICsJdTggbG93X2JuOwo+ICsJdTggaGlnaDsKPiArCXU4IGhp Z2hfbWFzazsKPiArfTsKPiArCj4gKy8qCj4gKyAqIEB0eXBlOiBuZmMgdmVyc2lvbgo+ICsgKiBA ZWNjX3N0cmVuZ3RoczogZWNjIHN0cmVuZ3Rocwo+ICsgKiBAZWNjX2NmZ3M6IGVjYyBjb25maWcg dmFsdWVzCj4gKyAqIEBmbGN0bF9vZmY6IEZMQ1RMIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAYmNo Y3RsX29mZjogQkNIQ1RMIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAZG1hX2RhdGFfYnVmX29mZjog RE1BX0RBVEFfQlVGIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAZG1hX29vYl9idWZfb2ZmOiBETUFf T09CX0JVRiByZWdpc3RlciBvZmZzZXQKPiArICogQGRtYV9jZmdfb2ZmOiBETUFfQ0ZHIHJlZ2lz dGVyIG9mZnNldAo+ICsgKiBAZG1hX3N0X29mZjogRE1BX1NUIHJlZ2lzdGVyIG9mZnNldAo+ICsg KiBAYmNoX3N0X29mZjogQkNHX1NUIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAcmFuZG16X29mZjog UkFORE1aIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAaW50X2VuX29mZjogaW50ZXJydXB0IGVuYWJs ZSByZWdpc3RlciBvZmZzZXQKPiArICogQGludF9jbHJfb2ZmOiBpbnRlcnJ1cHQgY2xlYW4gcmVn aXN0ZXIgb2Zmc2V0Cj4gKyAqIEBpbnRfc3Rfb2ZmOiBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVy IG9mZnNldAo+ICsgKiBAb29iMF9vZmY6IG9vYjAgcmVnaXN0ZXIgb2Zmc2V0Cj4gKyAqIEBvb2Ix X29mZjogb29iMSByZWdpc3RlciBvZmZzZXQKPiArICogQGVjYzA6IHJlcHJlc2VudCBFQ0MwIHN0 YXR1cyBkYXRhCj4gKyAqIEBlY2MxOiByZXByZXNlbnQgRUNDMSBzdGF0dXMgZGF0YQo+ICsgKi8K PiArc3RydWN0IG5mY19jZmcgewo+ICsJZW51bSBuZmNfdHlwZSB0eXBlOwo+ICsJdTggZWNjX3N0 cmVuZ3Roc1tORkNfRUNDX01BWF9NT0RFU107Cj4gKwl1MzIgZWNjX2NmZ3NbTkZDX0VDQ19NQVhf TU9ERVNdOwo+ICsJdTMyIGZsY3RsX29mZjsKPiArCXUzMiBiY2hjdGxfb2ZmOwo+ICsJdTMyIGRt YV9jZmdfb2ZmOwo+ICsJdTMyIGRtYV9kYXRhX2J1Zl9vZmY7Cj4gKwl1MzIgZG1hX29vYl9idWZf b2ZmOwo+ICsJdTMyIGRtYV9zdF9vZmY7Cj4gKwl1MzIgYmNoX3N0X29mZjsKPiArCXUzMiByYW5k bXpfb2ZmOwo+ICsJdTMyIGludF9lbl9vZmY7Cj4gKwl1MzIgaW50X2Nscl9vZmY7Cj4gKwl1MzIg aW50X3N0X29mZjsKPiArCXUzMiBvb2IwX29mZjsKPiArCXUzMiBvb2IxX29mZjsKPiArCXN0cnVj dCBlY2NfY250X3N0YXR1cyBlY2MwOwo+ICsJc3RydWN0IGVjY19jbnRfc3RhdHVzIGVjYzE7Cj4g K307Cj4gKwo+ICtzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCB7Cj4gKwlzdHJ1Y3QgbGlzdF9oZWFk IG5vZGU7Cj4gKwlzdHJ1Y3QgbmFuZF9jaGlwIGNoaXA7Cj4gKwo+ICsJdTE2IHNwYXJlX3Blcl9z ZWN0b3I7Cj4gKwl1MTYgb29iX2J1Zl9wZXJfc2VjdG9yOwo+ICsJdTE2IGJvb3RfYmxrczsKPiAr CXUxNiBib290X2VjYzsKPiArCXUxNiBtZXRhZGF0YV9zaXplOwo+ICsKPiArCXU4IG5zZWxzOwo+ ICsJdTggc2Vsc1swXTsKPiArCS8qIE5vdGhpbmcgYWZ0ZXIgdGhpcyBmaWVsZC4gKi8KPiArfTsK PiArCj4gK3N0cnVjdCBya19uZmNfY2xrIHsKPiArCWludCBuZmNfcmF0ZTsKPiArCXN0cnVjdCBj bGsgKm5mY19jbGs7Cj4gKwlzdHJ1Y3QgY2xrICphaGJfY2xrOwoKTm90IHN1cmUgdGhpcyBkZXNl cnZlcyBpdHMgb3duIHN0cnVjdHVyZT8KCj4gK307Cj4gKwo+ICtzdHJ1Y3QgcmtfbmZjIHsKPiAr CXN0cnVjdCBuYW5kX2NvbnRyb2xsZXIgY29udHJvbGxlcjsKPiArCXN0cnVjdCBya19uZmNfY2xr IGNsazsKPiArCj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cj4gKwljb25zdCBzdHJ1Y3QgbmZjX2Nm ZyAqY2ZnOwo+ICsJdm9pZCBfX2lvbWVtICpyZWdzOwo+ICsKPiArCWludCBzZWxlY3RlZF9iYW5r Owo+ICsJaW50IGJhbmRfb2Zmc2V0Owo+ICsKPiArCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7Cj4g KwlzdHJ1Y3QgbGlzdF9oZWFkIGNoaXBzOwo+ICsKPiArCXU4ICpidWZmZXI7Cj4gKwl1OCAqcGFn ZV9idWY7Cj4gKwl1MzIgKm9vYl9idWY7Cj4gKwo+ICsJdW5zaWduZWQgbG9uZyBhc3NpZ25lZF9j czsKPiArfTsKPiArCj4gK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnRv X3JrbmFuZChzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwKQo+ICt7Cj4gKwlyZXR1cm4gY29udGFpbmVy X29mKGNoaXAsIHN0cnVjdCBya19uZmNfbmFuZF9jaGlwLCBjaGlwKTsKPiArfQo+ICsKPiArc3Rh dGljIGlubGluZSB1OCAqZGF0YV9wdHIoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgdTgg KnAsIGludCBpKQoKcmtfbmZjX2J1Zl90b19kYXRhX3B0ciA/Cgo+ICt7Cj4gKwlyZXR1cm4gKHU4 ICopcCArIGkgKiBjaGlwLT5lY2Muc2l6ZTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB1OCAq b29iX3B0cihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgaSkKCnNhbWUgaGVyZQoKPiArewo+ ICsJdTggKnBvaTsKPiArCj4gKwlwb2kgPSBjaGlwLT5vb2JfcG9pICsgaSAqIE5GQ19TWVNfREFU QV9TSVpFOwo+ICsKPiArCXJldHVybiBwb2k7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdTgg Km9vYl9lY2NfcHRyKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGludCBpKQoKc2FtZSBoZXJlCgo+ ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCAqcmtuYW5kID0gdG9fcmtuYW5kKGNoaXAp Owo+ICsJdTggKnBvaTsKPiArCj4gKwlwb2kgPSBjaGlwLT5vb2JfcG9pICsgcmtuYW5kLT5tZXRh ZGF0YV9zaXplICsKPiArCSAgICAgIGNoaXAtPmVjYy5ieXRlcyAqIGk7Cj4gKwo+ICsJcmV0dXJu IHBvaTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSBpbnQgcmtfZGF0YV9sZW4oc3RydWN0IG5h bmRfY2hpcCAqY2hpcCkKClBsZWFzZSBwcmVwZW5kIGFsbCB5b3UgZnVuY3Rpb25zIHdpdGggcmtf bmZjXwoKPiArewo+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHRvX3JrbmFu ZChjaGlwKTsKPiArCj4gKwlyZXR1cm4gY2hpcC0+ZWNjLnNpemUgKyBya25hbmQtPnNwYXJlX3Bl cl9zZWN0b3I7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdTggKnJrX2RhdGFfcHRyKHN0cnVj dCBuYW5kX2NoaXAgKmNoaXAsICBpbnQgaSkKPiArewo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0g bmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsKPiArCXJldHVybiBuZmMtPmJ1ZmZl ciArIGkgKiBya19kYXRhX2xlbihjaGlwKTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB1OCAq cmtfb29iX3B0cihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgaSkKPiArewo+ICsJc3RydWN0 IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsKPiArCXJl dHVybiBuZmMtPmJ1ZmZlciArIGkgKiBya19kYXRhX2xlbihjaGlwKSArIGNoaXAtPmVjYy5zaXpl Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBya19uZmNfc2VsZWN0X2NoaXAoc3RydWN0IG5hbmRf Y2hpcCAqY2hpcCwgaW50IGNzKQo+ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dl dF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4gKwlzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCAqcmtu YW5kID0gdG9fcmtuYW5kKGNoaXApOwo+ICsJdTMyIHZhbDsKPiArCj4gKwlpZiAoY3MgPCAwKSB7 Cj4gKwkJbmZjLT5zZWxlY3RlZF9iYW5rID0gLTE7Cj4gKwkJLyogRGVzZWxlY3QgdGhlIGN1cnJl bnRseSBzZWxlY3RlZCB0YXJnZXQuICovCj4gKwkJdmFsID0gcmVhZGxfcmVsYXhlZChuZmMtPnJl Z3MgKyBORkNfRk1DVEwpOwo+ICsJCXZhbCAmPSB+Rk1DVExfQ0VfU0VMX007Cj4gKwkJd3JpdGVs KHZhbCwgbmZjLT5yZWdzICsgTkZDX0ZNQ1RMKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJ bmZjLT5zZWxlY3RlZF9iYW5rID0gcmtuYW5kLT5zZWxzW2NzXTsKPiArCW5mYy0+YmFuZF9vZmZz ZXQgPSBORkNfQkFOSyArIG5mYy0+c2VsZWN0ZWRfYmFuayAqIE5GQ19CQU5LX1NURVA7Cj4gKwo+ ICsJdmFsID0gcmVhZGxfcmVsYXhlZChuZmMtPnJlZ3MgKyBORkNfRk1DVEwpOwo+ICsJdmFsICY9 IH5GTUNUTF9DRV9TRUxfTTsKPiArCXZhbCB8PSBGTUNUTF9DRV9TRUwobmZjLT5zZWxlY3RlZF9i YW5rKTsKPiArCj4gKwl3cml0ZWwodmFsLCBuZmMtPnJlZ3MgKyBORkNfRk1DVEwpOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgaW5saW5lIGludCBya19uZmNfd2FpdF9pb3JlYWR5KHN0cnVjdCBya19uZmMg Km5mYykKPiArewo+ICsJaW50IHJjOwo+ICsJdTMyIHZhbDsKPiArCj4gKwlyYyA9IHJlYWRsX3Bv bGxfdGltZW91dF9hdG9taWMobmZjLT5yZWdzICsgTkZDX0ZNQ1RMLCB2YWwsCj4gKwkJCQkgICAg ICAgdmFsICYgRk1DVExfUkRZLCAxMCwgTkZDX1RJTUVPVVQpOwoKRG8geW91IHJlYWxseSBuZWVk IGl0IHRvIGJlIGF0b21pYyA/IC0+ZXhlY19vcCgpIGlzIG5vdCBjYWxsZWQgaW4gYW4KYXRvbWlj IGNvbnRleHQuCgo+ICsKPiArCXJldHVybiByYzsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB1 OCBya19uZmNfcmVhZF9ieXRlKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXApCj4gK3sKPiArCXN0cnVj dCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsKPiArCj4gKwly ZXR1cm4gcmVhZGJfcmVsYXhlZChuZmMtPnJlZ3MgKyBuZmMtPmJhbmRfb2Zmc2V0ICsgQkFOS19E QVRBKTsKCm5vIG5lZWQgZm9yIHRoaXMgaGVscGVyLCBqdXN0IG1vdmUgdGhlIGNvZGUgYmVsb3cu Cgo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBya19uZmNfcmVhZF9idWYoc3RydWN0IG5hbmRfY2hp cCAqY2hpcCwgdTggKmJ1ZiwgaW50IGxlbikKPiArewo+ICsJaW50IGk7Cj4gKwo+ICsJZm9yIChp ID0gMDsgaSA8IGxlbjsgaSsrKQo+ICsJCWJ1ZltpXSA9IHJrX25mY19yZWFkX2J5dGUoY2hpcCk7 CgpFaXRoZXIgeW91IGZpbmQgbW9yZSBwbGFjZXMgd2hlcmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9u LCBvciB5b3UgY2FuCm1vdmUgdGhpcyBjb2RlIGRpcmVjdGx5IHRvIHRoZSB1bmlxdWUgbG9jYXRp b24gd2hlcmUgaXQgaXMgY2FsbGVkLgoKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgcmtfbmZjX3dy aXRlX2J5dGUoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgdTggYnl0ZSkKClNhbWUgaGVyZQoKPiAr ewo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXAp Owo+ICsKPiArCXdyaXRlYihieXRlLCBuZmMtPnJlZ3MgKyBuZmMtPmJhbmRfb2Zmc2V0ICsgQkFO S19EQVRBKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgcmtfbmZjX3dyaXRlX2J1ZihzdHJ1Y3Qg bmFuZF9jaGlwICpjaGlwLCBjb25zdCB1OCAqYnVmLCBpbnQgbGVuKQo+ICt7Cj4gKwlpbnQgaTsK PiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCj4gKwkJcmtfbmZjX3dyaXRlX2J5dGUo Y2hpcCwgYnVmW2ldKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBya19uZmNfY21kKHN0cnVjdCBu YW5kX2NoaXAgKmNoaXAsCj4gKwkJICAgICAgY29uc3Qgc3RydWN0IG5hbmRfc3Vib3AgKnN1Ym9w KQo+ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEo Y2hpcCk7Cj4gKwl1bnNpZ25lZCBpbnQgaSwgaiwgcmVtYWluaW5nLCBzdGFydDsKPiArCWludCBy ZWdfb2Zmc2V0ID0gbmZjLT5iYW5kX29mZnNldDsKPiArCXZvaWQgX19pb21lbSAqZGF0YV9yZWc7 Cj4gKwl1OCAqaW5idWYgPSBOVUxMOwo+ICsJY29uc3QgdTggKm91dGJ1ZjsKPiArCXUzMiBjbnQg PSAwOwo+ICsJaW50IHJldCA9IDA7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IHN1Ym9wLT5uaW5z dHJzOyBpKyspIHsKPiArCQljb25zdCBzdHJ1Y3QgbmFuZF9vcF9pbnN0ciAqaW5zdHIgPSAmc3Vi b3AtPmluc3Ryc1tpXTsKPiArCj4gKwkJc3dpdGNoIChpbnN0ci0+dHlwZSkgewo+ICsJCWNhc2Ug TkFORF9PUF9DTURfSU5TVFI6Cj4gKwkJCXdyaXRlYihpbnN0ci0+Y3R4LmNtZC5vcGNvZGUsCj4g KwkJCSAgICAgICBuZmMtPnJlZ3MgKyByZWdfb2Zmc2V0ICsgQkFOS19DTUQpOwo+ICsJCQlicmVh azsKPiArCj4gKwkJY2FzZSBOQU5EX09QX0FERFJfSU5TVFI6Cj4gKwkJCXJlbWFpbmluZyA9IG5h bmRfc3Vib3BfZ2V0X251bV9hZGRyX2N5YyhzdWJvcCwgaSk7Cj4gKwkJCXN0YXJ0ID0gbmFuZF9z dWJvcF9nZXRfYWRkcl9zdGFydF9vZmYoc3Vib3AsIGkpOwo+ICsKPiArCQkJZm9yIChqID0gMDsg aiA8IDggJiYgaiArIHN0YXJ0IDwgcmVtYWluaW5nOyBqKyspCj4gKwkJCQl3cml0ZWIoaW5zdHIt PmN0eC5hZGRyLmFkZHJzW2ogKyBzdGFydF0sCj4gKwkJCQkgICAgICAgbmZjLT5yZWdzICsgcmVn X29mZnNldCArIEJBTktfQUREUik7Cj4gKwkJCWJyZWFrOwo+ICsKPiArCQljYXNlIE5BTkRfT1Bf REFUQV9JTl9JTlNUUjoKPiArCQljYXNlIE5BTkRfT1BfREFUQV9PVVRfSU5TVFI6Cj4gKwkJCXN0 YXJ0ID0gbmFuZF9zdWJvcF9nZXRfZGF0YV9zdGFydF9vZmYoc3Vib3AsIGkpOwo+ICsJCQljbnQg PSBuYW5kX3N1Ym9wX2dldF9kYXRhX2xlbihzdWJvcCwgaSk7Cj4gKwkJCWRhdGFfcmVnID0gbmZj LT5yZWdzICsgbmZjLT5iYW5kX29mZnNldCArIEJBTktfREFUQTsKPiArCj4gKwkJCWlmIChpbnN0 ci0+dHlwZSA9PSBOQU5EX09QX0RBVEFfT1VUX0lOU1RSKSB7Cj4gKwkJCQlvdXRidWYgPSBpbnN0 ci0+Y3R4LmRhdGEuYnVmLm91dCArIHN0YXJ0Owo+ICsJCQkJZm9yIChqID0gMDsgaiA8IGNudDsg aisrKQo+ICsJCQkJCXdyaXRlYihvdXRidWZbal0sIGRhdGFfcmVnKTsKCldoeSBub3QgY2FsbGlu ZyB0aGUgcmVhZC93cml0ZSBidWYgaGVscGVycyBoZXJlPyBXaGljaCB3b3VsZCBiZSBiZXR0ZXIK bmFtZWQgcmVhZC93cml0ZV9kYXRhIGluc3RlYWQgZHVlIHRvIHRoZSByZWdpc3RlciBuYW1lcyBv ZiB5b3VyIElQLgoKPiArCQkJfSBlbHNlIHsKPiArCQkJCWluYnVmID0gaW5zdHItPmN0eC5kYXRh LmJ1Zi5pbiArIHN0YXJ0Owo+ICsJCQkJZm9yIChqID0gMDsgaiA8IGNudDsgaisrKQo+ICsJCQkJ CWluYnVmW2pdID0gcmVhZGJfcmVsYXhlZChkYXRhX3JlZyk7Cj4gKwkJCX0KPiArCQkJYnJlYWs7 Cj4gKwo+ICsJCWNhc2UgTkFORF9PUF9XQUlUUkRZX0lOU1RSOgo+ICsJCQlpZiAocmtfbmZjX3dh aXRfaW9yZWFkeShuZmMpIDwgMCkgewo+ICsJCQkJcmV0ID0gLUVUSU1FRE9VVDsKPiArCQkJCWRl dl9lcnIobmZjLT5kZXYsICJJTyBub3QgcmVhZHlcbiIpOwo+ICsJCQl9Cj4gKwkJCWJyZWFrOwo+ ICsJCX0KPiArCX0KPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qg c3RydWN0IG5hbmRfb3BfcGFyc2VyIHJrX25mY19vcF9wYXJzZXIgPSBOQU5EX09QX1BBUlNFUigK PiArCU5BTkRfT1BfUEFSU0VSX1BBVFRFUk4oCj4gKwkJcmtfbmZjX2NtZCwKPiArCQlOQU5EX09Q X1BBUlNFUl9QQVRfQ01EX0VMRU0odHJ1ZSksCj4gKwkJTkFORF9PUF9QQVJTRVJfUEFUX0FERFJf RUxFTSh0cnVlLCBNQVhfQUREUkVTU19DWUMpLAo+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9DTURf RUxFTSh0cnVlKSwKPiArCQlOQU5EX09QX1BBUlNFUl9QQVRfV0FJVFJEWV9FTEVNKHRydWUpLAo+ ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9EQVRBX0lOX0VMRU0odHJ1ZSwgTUFYX0RBVEFfU0laRSkp LAo+ICsJTkFORF9PUF9QQVJTRVJfUEFUVEVSTigKPiArCQlya19uZmNfY21kLAo+ICsJCU5BTkRf T1BfUEFSU0VSX1BBVF9DTURfRUxFTSh0cnVlKSwKPiArCQlOQU5EX09QX1BBUlNFUl9QQVRfQURE Ul9FTEVNKHRydWUsIE1BWF9BRERSRVNTX0NZQyksCj4gKwkJTkFORF9PUF9QQVJTRVJfUEFUX0RB VEFfT1VUX0VMRU0odHJ1ZSwgTUFYX0RBVEFfU0laRSksCj4gKwkJTkFORF9PUF9QQVJTRVJfUEFU X0NNRF9FTEVNKHRydWUpLAo+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9XQUlUUkRZX0VMRU0odHJ1 ZSkpLAo+ICspOwo+ICsKPiArc3RhdGljIGludCBya19uZmNfZXhlY19vcChzdHJ1Y3QgbmFuZF9j aGlwICpjaGlwLAo+ICsJCQkgIGNvbnN0IHN0cnVjdCBuYW5kX29wZXJhdGlvbiAqb3AsCj4gKwkJ CSAgYm9vbCBjaGVja19vbmx5KQo+ICt7Cj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwgb3At PmNzKTsKCkRvbid0IHNlbGVjdCB0aGUgZGllIGlmIGNoZWNrX29ubHkgPT0gdHJ1ZQoKPiArCXJl dHVybiBuYW5kX29wX3BhcnNlcl9leGVjX29wKGNoaXAsICZya19uZmNfb3BfcGFyc2VyLCBvcCwK PiArCQkJCSAgICAgIGNoZWNrX29ubHkpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19z ZXR1cF9kYXRhX2ludGVyZmFjZShzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgY3NsaW5lLAo+ ICsJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuYW5kX2RhdGFfaW50ZXJmYWNlICpjb25mKQo+ICt7 Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEoY2hpcCk7 Cj4gKwljb25zdCBzdHJ1Y3QgbmFuZF9zZHJfdGltaW5ncyAqdGltaW5nczsKPiArCXUzMiByYXRl LCB0YzJydywgdHJ3cHcsIHRydzJjOwo+ICsJdTMyIHRlbXA7Cj4gKwo+ICsJaWYgKGNzbGluZSA9 PSBOQU5EX0RBVEFfSUZBQ0VfQ0hFQ0tfT05MWSkKPiArCQlyZXR1cm4gMDsKPiArCj4gKwlpZiAo IWNoaXAtPnBhcmFtZXRlcnMub25maSkKPiArCQlyZXR1cm4gMDsKCllvdSBtdXN0IGFjY2VwdCBh bGwga2luZCBvZiB0aW1pbmdzIGlmIHRoZXkgZml0IHRoZSBjb250cm9sbGVyCnBvc3NpYmlsaXRp ZXMsIHBsZWFzZSBkcm9wIGl0IG9mZi4gSWYgeW91IGRvbid0IHN1cHBvcnQgYSBnaXZlbgpjb25m aWd1cmF0aW9uLCBqdXN0IGNoZWNrIGl0IGFuZCByZXR1cm4gYW4gZXJyb3Igd2hlbiBDSEVDS19P TkxZIGlzCnVzZWQuCgo+ICsKPiArCXRpbWluZ3MgPSBuYW5kX2dldF9zZHJfdGltaW5ncyhjb25m KTsKPiArCWlmIChJU19FUlIodGltaW5ncykpCj4gKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwo+ICsK PiArCWlmIChJU19FUlIobmZjLT5jbGsubmZjX2NsaykpCj4gKwkJcmF0ZSA9IGNsa19nZXRfcmF0 ZShuZmMtPmNsay5haGJfY2xrKTsKPiArCWVsc2UKPiArCQlyYXRlID0gY2xrX2dldF9yYXRlKG5m Yy0+Y2xrLm5mY19jbGspOwo+ICsKPiArCS8qIFR1cm4gY2xvY2sgcmF0ZSBpbnRvIGtIei4gKi8K PiArCXJhdGUgLz0gMTAwMDsKPiArCj4gKwl0YzJydyA9IDE7Cj4gKwl0cncyYyA9IDE7Cj4gKwo+ ICsJdHJ3cHcgPSBtYXgodGltaW5ncy0+dFdDX21pbiwgdGltaW5ncy0+dFJDX21pbikgLyAxMDAw Owo+ICsJdHJ3cHcgPSBESVZfUk9VTkRfVVAodHJ3cHcgKiByYXRlLCAxMDAwMDAwKTsKPiArCj4g Kwl0ZW1wID0gdGltaW5ncy0+dFJFQV9tYXggLyAxMDAwOwo+ICsJdGVtcCA9IERJVl9ST1VORF9V UCh0ZW1wICogcmF0ZSwgMTAwMDAwMCk7Cj4gKwo+ICsJaWYgKHRyd3B3IDwgdGVtcCkKPiArCQl0 cndwdyA9IHRlbXA7Cj4gKwo+ICsJLyoKPiArCSAqIEFDQ09OOiBhY2Nlc3MgdGltaW5nIGNvbnRy b2wgcmVnaXN0ZXIKPiArCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K PiArCSAqIDMxOjE4OiByZXNlcnZlZAo+ICsJICogMTc6MTI6IGNzcncsIGNsb2NrIGN5Y2xlcyBm cm9tIHRoZSBmYWxsaW5nIGVkZ2Ugb2YgQ1NuIHRvIHRoZQo+ICsJCSBmYWxsaW5nIGVkZ2Ugb2Yg UkRuIG9yIFdSbgoKU3R5bGUgY2hlY2s6ICcqJyB0byBzdGFydCBldmVyeSBjb21tZW50IGxpbmUK Cj4gKwkgKiAxMToxMTogcmVzZXJ2ZWQKPiArCSAqIDEwOjA1OiByd3B3LCB0aGUgd2lkdGggb2Yg UkRuIG9yIFdSbiBpbiBwcm9jZXNzb3IgY2xvY2sgY3ljbGVzCj4gKwkgKiAwNDowMDogcndjcywg Y2xvY2sgY3ljbGVzIGZyb20gdGhlIHJpc2luZyBlZGdlIG9mIFJEbiBvciBXUm4gdG8gdGhlCj4g KwkJIHJpc2luZyBlZGdlIG9mIENTbgo+ICsJICovCj4gKwl0ZW1wID0gQUNDVElNSU5HKHRjMnJ3 LCB0cndwdywgdHJ3MmMpOwo+ICsJd3JpdGVsKHRlbXAsIG5mYy0+cmVncyArIE5GQ19GTVdBSVQp Owo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19od19lY2Nf c2V0dXAoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKPiArCQkJICAgICAgIHN0cnVjdCBuYW5kX2Vj Y19jdHJsICplY2MsCj4gKwkJCSAgICAgICB1aW50MzJfdCBzdHJlbmd0aCkKPiArewo+ICsJc3Ry dWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsJdTMy IHJlZywgaTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgTkZDX0VDQ19NQVhfTU9ERVM7IGkrKykg ewo+ICsJCWlmIChlY2MtPnN0cmVuZ3RoID09IG5mYy0+Y2ZnLT5lY2Nfc3RyZW5ndGhzW2ldKSB7 Cj4gKwkJCXJlZyA9IG5mYy0+Y2ZnLT5lY2NfY2Znc1tpXTsKPiArCQkJYnJlYWs7Cj4gKwkJfQo+ ICsJfQo+ICsKPiArCWlmIChpID49IE5GQ19FQ0NfTUFYX01PREVTKQo+ICsJCXJldHVybiAtRUlO VkFMOwo+ICsKPiArCXdyaXRlbChyZWcsIG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5iY2hjdGxfb2Zm KTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgcmtfbmZjX3hmZXJf c3RhcnQoc3RydWN0IHJrX25mYyAqbmZjLCB1OCBydywgdTggbl9LQiwKPiArCQkJICAgICAgZG1h X2FkZHJfdCBkbWFfZGF0YSwgZG1hX2FkZHJfdCBkbWFfb29iKQo+ICt7Cj4gKwl1MzIgZG1hX3Jl ZywgZmxfcmVnLCBiY2hfcmVnOwo+ICsKPiArCWRtYV9yZWcgPSBETUFfU1QgfCAoKCFydykgPDwg RE1BX1dSKSB8IERNQV9FTiB8ICgyIDw8IERNQV9BSEJfU0laRSkgfAo+ICsJICAgICAgKDcgPDwg RE1BX0JVUlNUX1NJWkUpIHwgKDE2IDw8IERNQV9JTkNfTlVNKTsKPiArCj4gKwlmbF9yZWcgPSAo cncgPDwgRkxDVExfV1IpIHwgRkxDVExfWEZFUl9FTiB8IEZMQ1RMX0FDT1JSRUNUIHwKPiArCQkg KG5fS0IgPDwgRkxDVExfWEZFUl9TRUNUT1IpIHwgRkxDVExfVE9HX0ZJWDsKPiArCj4gKwlpZiAo bmZjLT5jZmctPnR5cGUgPT0gTkZDX1Y2IHx8IG5mYy0+Y2ZnLT50eXBlID09IE5GQ19WOCkgewo+ ICsJCWJjaF9yZWcgPSByZWFkbF9yZWxheGVkKG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5iY2hjdGxf b2ZmKTsKPiArCQliY2hfcmVnID0gKGJjaF9yZWcgJiAofkJDSENUTF9CQU5LX00pKSB8Cj4gKwkJ CSAgKG5mYy0+c2VsZWN0ZWRfYmFuayA8PCBCQ0hDVExfQkFOSyk7Cj4gKwkJd3JpdGVsKGJjaF9y ZWcsIG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5iY2hjdGxfb2ZmKTsKPiArCX0KPiArCj4gKwl3cml0 ZWwoZG1hX3JlZywgbmZjLT5yZWdzICsgbmZjLT5jZmctPmRtYV9jZmdfb2ZmKTsKPiArCXdyaXRl bCgodTMyKWRtYV9kYXRhLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZG1hX2RhdGFfYnVmX29mZik7 Cj4gKwl3cml0ZWwoKHUzMilkbWFfb29iLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZG1hX29vYl9i dWZfb2ZmKTsKPiArCXdyaXRlbChmbF9yZWcsIG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5mbGN0bF9v ZmYpOwo+ICsJZmxfcmVnIHw9IEZMQ1RMX1hGRVJfU1Q7Cj4gKwl3cml0ZWwoZmxfcmVnLCBuZmMt PnJlZ3MgKyBuZmMtPmNmZy0+ZmxjdGxfb2ZmKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBya19u ZmNfd2FpdF9mb3JfeGZlcl9kb25lKHN0cnVjdCBya19uZmMgKm5mYykKPiArewo+ICsJdm9pZCBf X2lvbWVtICpwdHI7Cj4gKwlpbnQgcmV0ID0gMDsKPiArCXUzMiByZWc7Cj4gKwo+ICsJcHRyID0g bmZjLT5yZWdzICsgbmZjLT5jZmctPmZsY3RsX29mZjsKPiArCj4gKwlyZXQgPSByZWFkbF9wb2xs X3RpbWVvdXRfYXRvbWljKHB0ciwgcmVnLAo+ICsJCQkJCXJlZyAmIEZMQ1RMX1hGRVJfUkVBRFks Cj4gKwkJCQkJMTAsIE5GQ19USU1FT1VUKTsKClNhbWUgcXVlc3Rpb24sIGRvIHlvdSBuZWVkIGl0 IHRvIGJlIGF0b21pYz8KCj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGlu dCBya19uZmNfd3JpdGVfcGFnZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hp cCAqY2hpcCwKPiArCQkJICAgICBjb25zdCB1OCAqYnVmLCBpbnQgcGFnZSwgaW50IHJhdykKPiAr ewo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXAp Owo+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHRvX3JrbmFuZChjaGlwKTsK PiArCXN0cnVjdCBuYW5kX2VjY19jdHJsICplY2MgPSAmY2hpcC0+ZWNjOwo+ICsJaW50IG9vYl9z dGVwID0gKGVjYy0+Ynl0ZXMgPiA2MCkgPyBORkNfTUFYX09PQl9QRVJfU1RFUCA6Cj4gKwkJCU5G Q19NSU5fT09CX1BFUl9TVEVQOwo+ICsJaW50IHBhZ2VzX3Blcl9ibGsgPSBtdGQtPmVyYXNlc2l6 ZSAvIG10ZC0+d3JpdGVzaXplOwo+ICsJaW50IHJldCA9IDAsIGksIGJvb3Rfcm9tX21vZGUgPSAw Owo+ICsJZG1hX2FkZHJfdCBkbWFfZGF0YSwgZG1hX29vYjsKPiArCXUzMiByZWc7Cj4gKwl1OCAq b29iOwo+ICsKPiArCW5hbmRfcHJvZ19wYWdlX2JlZ2luX29wKGNoaXAsIHBhZ2UsIDAsIE5VTEws IDApOwo+ICsKPiArCWlmICghcmF3KQoKSSB0aGluayBpdCB3aWxsIGJlIG11Y2ggYmV0dGVyIHRv IGhhdmUgdHdvIHJrX25mY193cml0ZV9wYWdlIGFuZApya19uZmNfd3JpdGVfcGFnZV9yYXcgZGlz dGluY3QgaGVscGVycy4KCj4gKwkJbWVtY3B5KG5mYy0+cGFnZV9idWYsIGJ1ZiwgbXRkLT53cml0 ZXNpemUpOwo+ICsJCW1lbXNldChuZmMtPm9vYl9idWYsIDB4ZmYsIG9vYl9zdGVwICogZWNjLT5z dGVwcyk7CgpZb3UgYXJlIGRpc2NhcmRpbmcgT09CIGRhdGEgaW50ZW50aW9uYWxseSwgdGhpcyBp cyBzdHJhbmdlLgoKPiArCj4gKwkJLyoKPiArCQkgKiBUaGUgZmlyc3QgOChzb21lIGRldmljZXMg YXJlIDQgb3IgMTYpIGJsb2NrcyBhcmUgaW4gdXNlIGJ5CgoiVGhlIGZpcnN0IGJsb2NrcyAoNCwg OCBvciAxNiBkZXBlbmRpbmcgb24gdGhlIGRldmljZSkgYXJlIHVzZWQgYnkuLi4KCj4gKwkJICog dGhlIGJvb3QgUk9NIGFuZCB0aGUgZmlyc3QgMzIgYml0cyBvZiBvb2IgbmVlZCB0byBsaW5rCj4g KwkJICogdG8gdGhlIG5leHQgcGFnZSBhZGRyZXNzIGluIHRoZSBzYW1lIGJsb2NrLgo+ICsJCSAq IENvbmZpZyB0aGUgRUNDIGFsZ29yaXRobSBzdXBwb3J0ZWQgYnkgdGhlIGJvb3QgUk9NLgoKcy9j b25maWcvY29uZmlndXJlLwoKVGhpcyBjb25mbGljdHMgd2l0aCBiYWQgYmxvY2sgbWFya2Vycy4u LgoKPiArCQkgKi8KPiArCQlpZiAocGFnZSA8IHBhZ2VzX3Blcl9ibGsgKiBya25hbmQtPmJvb3Rf YmxrcyAmJgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKQoKPiArCQkgICAgY2hpcC0+b3B0aW9ucyAmIE5BTkRfSVNfQk9PVF9NRURJ VU0pIHsKPiArCQkJYm9vdF9yb21fbW9kZSA9IDE7Cj4gKwkJCWlmIChya25hbmQtPmJvb3RfZWNj ICE9IGVjYy0+c3RyZW5ndGgpCj4gKwkJCQlya19uZmNfaHdfZWNjX3NldHVwKGNoaXAsIGVjYywK PiArCQkJCQkJICAgIHJrbmFuZC0+Ym9vdF9lY2MpOwo+ICsJCX0KPiArCj4gKwkJZm9yIChpID0g MDsgaSA8IGVjYy0+c3RlcHM7IGkrKykgewo+ICsJCQlpZiAoIWkpIHsKPiArCQkJCXJlZyA9IDB4 RkZGRkZGRkY7Cj4gKwkJCX0gZWxzZSB7Cj4gKwkJCQlvb2IgPSBjaGlwLT5vb2JfcG9pICsgKGkg LSAxKSAqIE5GQ19TWVNfREFUQV9TSVpFOwo+ICsJCQkJcmVnID0gb29iWzBdIHwgb29iWzFdIDw8 IDggfCBvb2JbMl0gPDwgMTYgfAo+ICsJCQkJICAgICAgb29iWzNdIDw8IDI0Owo+ICsJCQl9Cj4g KwkJCWlmICghaSAmJiBib290X3JvbV9tb2RlKQo+ICsJCQkJcmVnID0gKHBhZ2UgJiAocGFnZXNf cGVyX2JsayAtIDEpKSAqIDQ7Cj4gKwo+ICsJCQlpZiAobmZjLT5jZmctPnR5cGUgPT0gTkZDX1Y5 KQo+ICsJCQkJbmZjLT5vb2JfYnVmW2ldID0gcmVnOwo+ICsJCQllbHNlCj4gKwkJCQluZmMtPm9v Yl9idWZbaSAqIG9vYl9zdGVwIC8gNF0gPSByZWc7CgpQbGVhc2UgdXNlIGJyYWNrZXRzLgoKPiAr CQl9Cj4gKwo+ICsJCWRtYV9kYXRhID0gZG1hX21hcF9zaW5nbGUobmZjLT5kZXYsICh2b2lkICop bmZjLT5wYWdlX2J1ZiwKCkRvIHlvdSBuZWVkIHRoaXMgY2FzdD8KCj4gKwkJCQkJICBtdGQtPndy aXRlc2l6ZSwgRE1BX1RPX0RFVklDRSk7Cj4gKwkJZG1hX29vYiA9IGRtYV9tYXBfc2luZ2xlKG5m Yy0+ZGV2LCBuZmMtPm9vYl9idWYsCj4gKwkJCQkJIGVjYy0+c3RlcHMgKiBvb2Jfc3RlcCwKPiAr CQkJCQkgRE1BX1RPX0RFVklDRSk7Cj4gKwo+ICsJCXJlaW5pdF9jb21wbGV0aW9uKCZuZmMtPmRv bmUpOwo+ICsJCXdyaXRlbChJTlRfRE1BLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+aW50X2VuX29m Zik7Cj4gKwo+ICsJCXJrX25mY194ZmVyX3N0YXJ0KG5mYywgTkZDX1dSSVRFLCBlY2MtPnN0ZXBz LCBkbWFfZGF0YSwKPiArCQkJCSAgZG1hX29vYik7Cj4gKwkJcmV0ID0gd2FpdF9mb3JfY29tcGxl dGlvbl90aW1lb3V0KCZuZmMtPmRvbmUsCj4gKwkJCQkJCSAgbXNlY3NfdG9famlmZmllcygxMDAp KTsKPiArCQlpZiAoIXJldCkKPiArCQkJZGV2X3dhcm4obmZjLT5kZXYsICJ3cml0ZTogd2FpdCBk bWEgZG9uZSB0aW1lb3V0LlxuIik7Cj4gKwkJLyoKPiArCQkgKiBXaGV0aGVyIHRoZSBETUEgdHJh bnNmZXIgaXMgY29tcGxldGVkIG9yIG5vdC4gVGhlIGRyaXZlcgo+ICsJCSAqIG5lZWRzIHRvIGNo ZWNrIHRoZSBORkNgcyBzdGF0dXMgcmVnaXN0ZXIgdG8gc2VlIGlmIHRoZSBkYXRhCj4gKwkJICog dHJhbnNmZXIgd2FzIGNvbXBsZXRlZC4KPiArCQkgKi8KPiArCQlyZXQgPSBya19uZmNfd2FpdF9m b3JfeGZlcl9kb25lKG5mYyk7Cj4gKwo+ICsJCWRtYV91bm1hcF9zaW5nbGUobmZjLT5kZXYsIGRt YV9kYXRhLCBtdGQtPndyaXRlc2l6ZSwKPiArCQkJCSBETUFfVE9fREVWSUNFKTsKPiArCQlkbWFf dW5tYXBfc2luZ2xlKG5mYy0+ZGV2LCBkbWFfb29iLCBlY2MtPnN0ZXBzICogb29iX3N0ZXAsCj4g KwkJCQkgRE1BX1RPX0RFVklDRSk7Cj4gKwo+ICsJCWlmIChib290X3JvbV9tb2RlICYmIHJrbmFu ZC0+Ym9vdF9lY2MgIT0gZWNjLT5zdHJlbmd0aCkKPiArCQkJcmtfbmZjX2h3X2VjY19zZXR1cChj aGlwLCBlY2MsIGVjYy0+c3RyZW5ndGgpOwo+ICsKPiArCQlpZiAocmV0KSB7Cj4gKwkJCXJldCA9 IC1FSU87Cj4gKwkJCWRldl9lcnIobmZjLT5kZXYsCj4gKwkJCQkid3JpdGU6IHdhaXQgdHJhbnNm ZXIgZG9uZSB0aW1lb3V0LlxuIik7Cj4gKwkJfQo+ICsJfSBlbHNlIHsKPiArCQlya19uZmNfd3Jp dGVfYnVmKGNoaXAsIGJ1ZiwgbXRkLT53cml0ZXNpemUgKyBtdGQtPm9vYnNpemUpOwo+ICsJfQo+ ICsKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwlyZXQgPSBuYW5kX3Byb2df cGFnZV9lbmRfb3AoY2hpcCk7Cj4gKwo+ICsJLyogRGVzZWxlY3QgdGhlIGN1cnJlbnRseSBzZWxl Y3RlZCB0YXJnZXQuICovCj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwgLTEpOwoKTm90IHN1 cmUgdGhpcyBpcyBuZWVkZWQ/Cgo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRp YyBpbnQgcmtfbmZjX3dyaXRlX3BhZ2VfcmF3KHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGNvbnN0 IHU4ICpidWYsCj4gKwkJCQkgaW50IG9vYl9vbiwgaW50IHBhZ2UpCj4gK3sKPiArCXN0cnVjdCBt dGRfaW5mbyAqbXRkID0gbmFuZF90b19tdGQoY2hpcCk7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMg PSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4gKwl1MzIgaTsKPiArCj4gKwltZW1z ZXQobmZjLT5idWZmZXIsIDB4ZmYsIG10ZC0+d3JpdGVzaXplICsgbXRkLT5vb2JzaXplKTsKPiAr Cj4gKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+ZWNjLnN0ZXBzOyBpKyspIHsKPiArCQlpZiAoYnVm KQoKQ2FuIHRoaXMgY29uZGl0aW9uIGJlIHVubWV0IHJlYWxseT8KCj4gKwkJCW1lbWNweShya19k YXRhX3B0cihjaGlwLCBpKSwgZGF0YV9wdHIoY2hpcCwgYnVmLCBpKSwKPiArCQkJICAgICAgIGNo aXAtPmVjYy5zaXplKTsKPiArCj4gKwkJaWYgKCFpKQo+ICsJCQltZW1jcHkocmtfb29iX3B0cihj aGlwLCBpKSwKPiArCQkJICAgICAgIG9vYl9wdHIoY2hpcCwgY2hpcC0+ZWNjLnN0ZXBzIC0gMSks Cj4gKwkJCSAgICAgICBORkNfU1lTX0RBVEFfU0laRSk7CgpXaGF0IGlzIHRoaXM/Cgo+ICsJCWVs c2UKPiArCQkJbWVtY3B5KHJrX29vYl9wdHIoY2hpcCwgaSksIG9vYl9wdHIoY2hpcCwgaSAtIDEp LAo+ICsJCQkgICAgICAgTkZDX1NZU19EQVRBX1NJWkUpOwo+ICsKPiArCQltZW1jcHkocmtfb29i X3B0cihjaGlwLCBpKSArIE5GQ19TWVNfREFUQV9TSVpFLAo+ICsJCSAgICAgICBvb2JfZWNjX3B0 cihjaGlwLCBpKSwKPiArCQkgICAgICAgY2hpcC0+ZWNjLmJ5dGVzKTsKPiArCX0KPiArCj4gKwly ZXR1cm4gcmtfbmZjX3dyaXRlX3BhZ2UobXRkLCBjaGlwLCBuZmMtPmJ1ZmZlciwgcGFnZSwgMSk7 Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX3dyaXRlX29vYl9zdGQoc3RydWN0IG5hbmRf Y2hpcCAqY2hpcCwgaW50IHBhZ2UpCj4gK3sKPiArCXJldHVybiBya19uZmNfd3JpdGVfcGFnZV9y YXcoY2hpcCwgTlVMTCwgMSwgcGFnZSk7Cj4gK30KCldoYXQgaXMgdGhlIHB1cnBvc2Ugb2YgdGhp cyBpbmRpcmVjdGlvbj8gUGxlYXNlIGdldCByaWQgb2YgaXQuCgo+ICsKPiArc3RhdGljIGludCBy a19uZmNfcmVhZF9wYWdlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpj aGlwLAo+ICsJCQkgICAgdTMyIGRhdGFfb2ZmcywgdTMyIHJlYWRsZW4sCj4gKwkJCSAgICB1OCAq YnVmLCBpbnQgcGFnZSwgaW50IHJhdykKPiArewo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFu ZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAg KnJrbmFuZCA9IHRvX3JrbmFuZChjaGlwKTsKPiArCXN0cnVjdCBuYW5kX2VjY19jdHJsICplY2Mg PSAmY2hpcC0+ZWNjOwo+ICsJaW50IG9vYl9zdGVwID0gKGVjYy0+Ynl0ZXMgPiA2MCkgPyBORkNf TUFYX09PQl9QRVJfU1RFUCA6Cj4gKwkJCU5GQ19NSU5fT09CX1BFUl9TVEVQOwo+ICsJaW50IHBh Z2VzX3Blcl9ibGsgPSBtdGQtPmVyYXNlc2l6ZSAvIG10ZC0+d3JpdGVzaXplOwo+ICsJZG1hX2Fk ZHJfdCBkbWFfZGF0YSwgZG1hX29vYjsKPiArCWludCByZXQgPSAwLCBpLCBib290X3JvbV9tb2Rl ID0gMDsKPiArCWludCBiaXRmbGlwcyA9IDAsIGJjaF9zdDsKPiArCXU4ICpvb2I7Cj4gKwl1MzIg dG1wOwo+ICsKPiArCW5hbmRfcmVhZF9wYWdlX29wKGNoaXAsIHBhZ2UsIDAsIE5VTEwsIDApOwo+ ICsJaWYgKCFyYXcpIHsKClNhbWUgY29tbWVudCwgcGxlYXNlIHdyaXRlIHR3byBoZWxwZXJzLgoK PiArCQlkbWFfZGF0YSA9IGRtYV9tYXBfc2luZ2xlKG5mYy0+ZGV2LCBuZmMtPnBhZ2VfYnVmLAo+ ICsJCQkJCSAgbXRkLT53cml0ZXNpemUsCj4gKwkJCQkJICBETUFfRlJPTV9ERVZJQ0UpOwo+ICsJ CWRtYV9vb2IgPSBkbWFfbWFwX3NpbmdsZShuZmMtPmRldiwgbmZjLT5vb2JfYnVmLAo+ICsJCQkJ CSBlY2MtPnN0ZXBzICogb29iX3N0ZXAsCj4gKwkJCQkJIERNQV9GUk9NX0RFVklDRSk7Cj4gKwo+ ICsJCS8qCj4gKwkJICogVGhlIGZpcnN0IDgoc29tZSBkZXZpY2VzIGFyZSA0IG9yIDE2KSBibG9j a3MgYXJlIGluIHVzZSBieQoKU2FtZSByZXdvcmRpbmcKCj4gKwkJICogdGhlIGJvb3QgUk9NLgo+ ICsJCSAqIENvbmZpZyB0aGUgRUNDIGFsZ29yaXRobSBzdXBwb3J0ZWQgYnkgdGhlIGJvb3QgUk9N Lgo+ICsJCSAqLwo+ICsJCWlmIChwYWdlIDwgcGFnZXNfcGVyX2JsayAqIHJrbmFuZC0+Ym9vdF9i bGtzICYmCj4gKwkJICAgIGNoaXAtPm9wdGlvbnMgJiBOQU5EX0lTX0JPT1RfTUVESVVNKSB7Cj4g KwkJCWJvb3Rfcm9tX21vZGUgPSAxOwo+ICsJCQlpZiAocmtuYW5kLT5ib290X2VjYyAhPSBlY2Mt PnN0cmVuZ3RoKQo+ICsJCQkJcmtfbmZjX2h3X2VjY19zZXR1cChjaGlwLCBlY2MsCj4gKwkJCQkJ CSAgICBya25hbmQtPmJvb3RfZWNjKTsKPiArCQl9Cj4gKwo+ICsJCXJlaW5pdF9jb21wbGV0aW9u KCZuZmMtPmRvbmUpOwo+ICsJCXdyaXRlbChJTlRfRE1BLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ aW50X2VuX29mZik7Cj4gKwkJcmtfbmZjX3hmZXJfc3RhcnQobmZjLCBORkNfUkVBRCwgZWNjLT5z dGVwcywgZG1hX2RhdGEsCj4gKwkJCQkgIGRtYV9vb2IpOwo+ICsJCXJldCA9IHdhaXRfZm9yX2Nv bXBsZXRpb25fdGltZW91dCgmbmZjLT5kb25lLAo+ICsJCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMo MTAwKSk7Cj4gKwkJaWYgKCFyZXQpCj4gKwkJCWRldl93YXJuKG5mYy0+ZGV2LCAicmVhZDogd2Fp dCBkbWEgZG9uZSB0aW1lb3V0LlxuIik7Cj4gKwkJLyoKPiArCQkgKiBXaGV0aGVyIHRoZSBETUEg dHJhbnNmZXIgaXMgY29tcGxldGVkIG9yIG5vdC4gVGhlIGRyaXZlcgo+ICsJCSAqIG5lZWRzIHRv IGNoZWNrIHRoZSBORkNgcyBzdGF0dXMgcmVnaXN0ZXIgdG8gc2VlIGlmIHRoZSBkYXRhCj4gKwkJ ICogdHJhbnNmZXIgd2FzIGNvbXBsZXRlZC4KPiArCQkgKi8KPiArCQlyZXQgPSBya19uZmNfd2Fp dF9mb3JfeGZlcl9kb25lKG5mYyk7Cj4gKwkJZG1hX3VubWFwX3NpbmdsZShuZmMtPmRldiwgZG1h X2RhdGEsIG10ZC0+d3JpdGVzaXplLAo+ICsJCQkJIERNQV9GUk9NX0RFVklDRSk7Cj4gKwkJZG1h X3VubWFwX3NpbmdsZShuZmMtPmRldiwgZG1hX29vYiwgZWNjLT5zdGVwcyAqIG9vYl9zdGVwLAo+ ICsJCQkJIERNQV9GUk9NX0RFVklDRSk7Cj4gKwo+ICsJCWlmIChyZXQpIHsKPiArCQkJYml0Zmxp cHMgPSAtRUlPOwo+ICsJCQlkZXZfZXJyKG5mYy0+ZGV2LAo+ICsJCQkJInJlYWQ6IHdhaXQgdHJh bnNmZXIgZG9uZSB0aW1lb3V0LlxuIik7Cj4gKwkJCWdvdG8gb3V0Owo+ICsJCX0KPiArCj4gKwkJ Zm9yIChpID0gMTsgaSA8IGVjYy0+c3RlcHM7IGkrKykgewo+ICsJCQlvb2IgPSBjaGlwLT5vb2Jf cG9pICsgKGkgLSAxKSAqIE5GQ19TWVNfREFUQV9TSVpFOwo+ICsJCQlpZiAobmZjLT5jZmctPnR5 cGUgPT0gTkZDX1Y5KQo+ICsJCQkJdG1wID0gbmZjLT5vb2JfYnVmW2ldOwo+ICsJCQllbHNlCj4g KwkJCQl0bXAgPSBuZmMtPm9vYl9idWZbaSAqIG9vYl9zdGVwIC8gNF07Cj4gKwkJCSpvb2IrKyA9 ICh1OCl0bXA7Cj4gKwkJCSpvb2IrKyA9ICh1OCkodG1wID4+IDgpOwo+ICsJCQkqb29iKysgPSAo dTgpKHRtcCA+PiAxNik7Cj4gKwkJCSpvb2IrKyA9ICh1OCkodG1wID4+IDI0KTsKPiArCQl9Cj4g Kwo+ICsJCWZvciAoaSA9IDA7IGkgPCBlY2MtPnN0ZXBzIC8gMjsgaSsrKSB7CgpCcmFja2V0cyBo ZXJlIGFzIHdlbGwgcGxlYXNlCgo+ICsJCQliY2hfc3QgPSByZWFkbF9yZWxheGVkKG5mYy0+cmVn cyArCj4gKwkJCQkJICAgICAgIG5mYy0+Y2ZnLT5iY2hfc3Rfb2ZmICsgaSAqIDQpOwo+ICsJCQlp ZiAoYmNoX3N0ICYgQklUKG5mYy0+Y2ZnLT5lY2MwLmVycl9mbGFnX2JpdCkgfHwKPiArCQkJICAg IGJjaF9zdCAmIEJJVChuZmMtPmNmZy0+ZWNjMS5lcnJfZmxhZ19iaXQpKSB7Cj4gKwkJCQltdGQt PmVjY19zdGF0cy5mYWlsZWQrKzsKPiArCQkJCWJpdGZsaXBzID0gLTE7CgpJIHRoaW5rIHlvdSBz aG91bGQgcmV0dXJuIDAuCgpUaGVuIHRoZSB1cHBlciBsYXllciB3aWxsIGNoZWNrIGZvciBmYWls dXJlcy4KCj4gKwkJCX0gZWxzZSB7Cj4gKwkJCQlyZXQgPSBFQ0NfRVJSX0NOVChiY2hfc3QsIG5m Yy0+Y2ZnLT5lY2MwKTsKPiArCQkJCW10ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCArPSByZXQ7Cj4g KwkJCQliaXRmbGlwcyA9IG1heF90KHUzMiwgYml0ZmxpcHMsIHJldCk7Cj4gKwo+ICsJCQkJcmV0 ID0gRUNDX0VSUl9DTlQoYmNoX3N0LCBuZmMtPmNmZy0+ZWNjMSk7Cj4gKwkJCQltdGQtPmVjY19z dGF0cy5jb3JyZWN0ZWQgKz0gcmV0Owo+ICsJCQkJYml0ZmxpcHMgPSBtYXhfdCh1MzIsIGJpdGZs aXBzLCByZXQpOwo+ICsJCQl9Cj4gKwkJfQo+ICtvdXQ6Cj4gKwkJbWVtY3B5KGJ1ZiwgbmZjLT5w YWdlX2J1ZiwgbXRkLT53cml0ZXNpemUpOwo+ICsKPiArCQlpZiAoYm9vdF9yb21fbW9kZSAmJiBy a25hbmQtPmJvb3RfZWNjICE9IGVjYy0+c3RyZW5ndGgpCj4gKwkJCXJrX25mY19od19lY2Nfc2V0 dXAoY2hpcCwgZWNjLCBlY2MtPnN0cmVuZ3RoKTsKPiArCj4gKwkJaWYgKGJpdGZsaXBzIDwgMCkK PiArCQkJZGV2X2VycihuZmMtPmRldiwgInJlYWQgcGFnZTogJXggZWNjIGVycm9yIVxuIiwgcGFn ZSk7Cj4gKwl9IGVsc2Ugewo+ICsJCXJrX25mY19yZWFkX2J1ZihjaGlwLCBidWYsIG10ZC0+d3Jp dGVzaXplICsgbXRkLT5vb2JzaXplKTsKPiArCX0KPiArCS8qIERlc2VsZWN0IHRoZSBjdXJyZW50 bHkgc2VsZWN0ZWQgdGFyZ2V0LiAqLwo+ICsJcmtfbmZjX3NlbGVjdF9jaGlwKGNoaXAsIC0xKTsK PiArCj4gKwlyZXR1cm4gYml0ZmxpcHM7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX3dy aXRlX3BhZ2VfaHdlY2Moc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgdTggKmJ1ZiwKPiAr CQkJCSAgIGludCBvb2Jfb24sIGludCBwYWdlKQo+ICt7Cj4gKwlyZXR1cm4gcmtfbmZjX3dyaXRl X3BhZ2UobmFuZF90b19tdGQoY2hpcCksIGNoaXAsIGJ1ZiwgcGFnZSwgMCk7Cj4gK30KPiArCj4g K3N0YXRpYyBpbnQgcmtfbmZjX3JlYWRfcGFnZV9od2VjYyhzdHJ1Y3QgbmFuZF9jaGlwICpjaGlw LCB1OCAqcCwgaW50IG9vYl9vbiwKPiArCQkJCSAgaW50IHBnKQo+ICt7Cj4gKwlzdHJ1Y3QgbXRk X2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+ICsKPiArCXJldHVybiBya19uZmNfcmVh ZF9wYWdlKG10ZCwgY2hpcCwgMCwgbXRkLT53cml0ZXNpemUsIHAsIHBnLCAwKTsKPiArfQo+ICsK PiArc3RhdGljIGludCBya19uZmNfcmVhZF9wYWdlX3JhdyhzdHJ1Y3QgbmFuZF9jaGlwICpjaGlw LCB1OCAqYnVmLCBpbnQgb29iX29uLAo+ICsJCQkJaW50IHBhZ2UpCj4gK3sKPiArCXN0cnVjdCBt dGRfaW5mbyAqbXRkID0gbmFuZF90b19tdGQoY2hpcCk7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMg PSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4gKwlpbnQgaSwgcmV0Owo+ICsKPiAr CXJldCA9IHJrX25mY19yZWFkX3BhZ2UobXRkLCBjaGlwLCAwLCBtdGQtPndyaXRlc2l6ZSwgbmZj LT5idWZmZXIsCj4gKwkJCSAgICAgICBwYWdlLCAxKTsKPiArCWlmIChyZXQgPCAwKQo+ICsJCXJl dHVybiByZXQ7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IGNoaXAtPmVjYy5zdGVwczsgaSsrKSB7 Cj4gKwkJaWYgKCFpKQo+ICsJCQltZW1jcHkob29iX3B0cihjaGlwLCBjaGlwLT5lY2Muc3RlcHMg LSAxKSwKPiArCQkJICAgICAgIHJrX29vYl9wdHIoY2hpcCwgaSksCj4gKwkJCSAgICAgICBORkNf U1lTX0RBVEFfU0laRSk7Cj4gKwkJZWxzZQo+ICsJCQltZW1jcHkob29iX3B0cihjaGlwLCBpIC0g MSksIHJrX29vYl9wdHIoY2hpcCwgaSksCj4gKwkJCSAgICAgICBORkNfU1lTX0RBVEFfU0laRSk7 Cj4gKwo+ICsJCW1lbWNweShvb2JfZWNjX3B0cihjaGlwLCBpKSwKPiArCQkgICAgICAgcmtfb29i X3B0cihjaGlwLCBpKSArIE5GQ19TWVNfREFUQV9TSVpFLAo+ICsJCSAgICAgICBjaGlwLT5lY2Mu Ynl0ZXMpOwo+ICsKPiArCQlpZiAoYnVmKQo+ICsJCQltZW1jcHkoZGF0YV9wdHIoY2hpcCwgYnVm LCBpKSwgcmtfZGF0YV9wdHIoY2hpcCwgaSksCj4gKwkJCSAgICAgICBjaGlwLT5lY2Muc2l6ZSk7 Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBya19uZmNf cmVhZF9vb2Jfc3RkKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGludCBwYWdlKQo+ICt7Cj4gKwly ZXR1cm4gcmtfbmZjX3JlYWRfcGFnZV9yYXcoY2hpcCwgTlVMTCwgMSwgcGFnZSk7Cj4gK30KPiAr Cj4gK3N0YXRpYyBpbmxpbmUgdm9pZCBya19uZmNfaHdfaW5pdChzdHJ1Y3QgcmtfbmZjICpuZmMp Cj4gK3sKPiArCS8qIERpc2FibGUgZmxhc2ggd3AuICovCj4gKwl3cml0ZWwoRk1DVExfV1AsIG5m Yy0+cmVncyArIE5GQ19GTUNUTCk7Cj4gKwkvKiBDb25maWcgZGVmYXVsdCB0aW1pbmcgNDBucyBh dCAxNTAgTWh6IG5mYyBjbG9jay4gKi8KPiArCXdyaXRlbCgweDEwODEsIG5mYy0+cmVncyArIE5G Q19GTVdBSVQpOwo+ICsJLyogRGlzYWJsZSByYW5kb21pemVyIGFuZCBETUEuICovCj4gKwl3cml0 ZWwoMCwgbmZjLT5yZWdzICsgbmZjLT5jZmctPnJhbmRtel9vZmYpOwo+ICsJd3JpdGVsKDAsIG5m Yy0+cmVncyArIG5mYy0+Y2ZnLT5kbWFfY2ZnX29mZik7Cj4gKwl3cml0ZWwoRkxDVExfUlNULCBu ZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZmxjdGxfb2ZmKTsKPiArfQo+ICsKPiArc3RhdGljIGlycXJl dHVybl90IHJrX25mY19pcnEoaW50IGlycSwgdm9pZCAqaWQpCj4gK3sKPiArCXN0cnVjdCBya19u ZmMgKm5mYyA9IGlkOwo+ICsJdTMyIHN0YSwgaWVuOwo+ICsKPiArCXN0YSA9IHJlYWRsX3JlbGF4 ZWQobmZjLT5yZWdzICsgbmZjLT5jZmctPmludF9zdF9vZmYpOwo+ICsJaWVuID0gcmVhZGxfcmVs YXhlZChuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+aW50X2VuX29mZik7Cj4gKwo+ICsJaWYgKCEoc3Rh ICYgaWVuKSkKPiArCQlyZXR1cm4gSVJRX05PTkU7Cj4gKwo+ICsJd3JpdGVsKHN0YSwgbmZjLT5y ZWdzICsgbmZjLT5jZmctPmludF9jbHJfb2ZmKTsKPiArCXdyaXRlbCh+c3RhICYgaWVuLCBuZmMt PnJlZ3MgKyBuZmMtPmNmZy0+aW50X2VuX29mZik7Cj4gKwo+ICsJY29tcGxldGUoJm5mYy0+ZG9u ZSk7Cj4gKwo+ICsJcmV0dXJuIElSUV9IQU5ETEVEOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJr X25mY19lbmFibGVfY2xrKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJrX25mY19jbGsgKmNs aykKCl9jbGtzIHdpdGggYW4gcyB0byBpbmZvcm0gdGhhdCB0aGVyZSBhcmUgc2V2ZXJhbCBvZiB0 aGVtPwoKPiArewo+ICsJaW50IHJldDsKPiArCj4gKwlpZiAoIUlTX0VSUihjbGstPm5mY19jbGsp KSB7Cj4gKwkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGNsay0+bmZjX2Nsayk7Cj4gKwkJaWYg KHJldCkgewo+ICsJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBlbmFibGUgbmZjIGNsa1xuIik7 Cj4gKwkJCXJldHVybiByZXQ7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldCA9IGNsa19wcmVwYXJl X2VuYWJsZShjbGstPmFoYl9jbGspOwo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIoZGV2LCAi ZmFpbGVkIHRvIGVuYWJsZSBhaGIgY2xrXG4iKTsKPiArCQlpZiAoIUlTX0VSUihjbGstPm5mY19j bGspKQo+ICsJCQljbGtfZGlzYWJsZV91bnByZXBhcmUoY2xrLT5uZmNfY2xrKTsKPiArCQlyZXR1 cm4gcmV0Owo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBy a19uZmNfZGlzYWJsZV9jbGsoc3RydWN0IHJrX25mY19jbGsgKmNsaykKCmRpdHRvCgo+ICt7Cj4g KwlpZiAoIUlTX0VSUihjbGstPm5mY19jbGspKQo+ICsJCWNsa19kaXNhYmxlX3VucHJlcGFyZShj bGstPm5mY19jbGspOwo+ICsJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNsay0+YWhiX2Nsayk7Cj4g K30KPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX29vYmxheW91dF9mcmVlKHN0cnVjdCBtdGRfaW5m byAqbXRkLCBpbnQgc2VjdGlvbiwKPiArCQkJCSBzdHJ1Y3QgbXRkX29vYl9yZWdpb24gKm9vYl9y ZWdpb24pCj4gK3sKPiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGRfdG9fbmFuZChtdGQp Owo+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHRvX3JrbmFuZChjaGlwKTsK PiArCj4gKwlpZiAoc2VjdGlvbikKPiArCQlyZXR1cm4gLUVSQU5HRTsKPiArCj4gKwkvKgo+ICsJ ICogVGhlIGJlZ2lubmluZyBvZiB0aGUgb29iIGFyZWEgc3RvcmVzIHRoZSByZXNlcnZlZCBkYXRh IGZvciB0aGUgTkZDLAo+ICsJICogdGhlIHNpemUgb2YgdGhlIHJlc2VydmVkIGRhdGEgaXMgTkZD X1NZU19EQVRBX1NJWkUgYnl0ZXMuCj4gKwkgKi8KPiArCW9vYl9yZWdpb24tPmxlbmd0aCA9IHJr bmFuZC0+bWV0YWRhdGFfc2l6ZSAtIE5GQ19TWVNfREFUQV9TSVpFIC0gMjsKPiArCW9vYl9yZWdp b24tPm9mZnNldCA9IE5GQ19TWVNfREFUQV9TSVpFICsgMjsKPiArCj4gKwlyZXR1cm4gMDsKPiAr fQo+ICsKPiArc3RhdGljIGludCBya19uZmNfb29ibGF5b3V0X2VjYyhzdHJ1Y3QgbXRkX2luZm8g Km10ZCwgaW50IHNlY3Rpb24sCj4gKwkJCQlzdHJ1Y3QgbXRkX29vYl9yZWdpb24gKm9vYl9yZWdp b24pCj4gK3sKPiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGRfdG9fbmFuZChtdGQpOwo+ ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHRvX3JrbmFuZChjaGlwKTsKPiAr Cj4gKwlpZiAoc2VjdGlvbikKPiArCQlyZXR1cm4gLUVSQU5HRTsKPiArCj4gKwlvb2JfcmVnaW9u LT5vZmZzZXQgPSBya25hbmQtPm1ldGFkYXRhX3NpemU7Cj4gKwlvb2JfcmVnaW9uLT5sZW5ndGgg PSBtdGQtPm9vYnNpemUgLSBvb2JfcmVnaW9uLT5vZmZzZXQ7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4g K30KPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRkX29vYmxheW91dF9vcHMgcmtfbmZjX29v YmxheW91dF9vcHMgPSB7Cj4gKwkuZnJlZSA9IHJrX25mY19vb2JsYXlvdXRfZnJlZSwKPiArCS5l Y2MgPSBya19uZmNfb29ibGF5b3V0X2VjYywKPiArfTsKPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZj X2VjY19pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IG10ZF9pbmZvICptdGQpCj4gK3sK PiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGRfdG9fbmFuZChtdGQpOwo+ICsJc3RydWN0 IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsJc3RydWN0 IG5hbmRfZWNjX2N0cmwgKmVjYyA9ICZjaGlwLT5lY2M7Cj4gKwljb25zdCB1OCAqc3RyZW5ndGhz ID0gbmZjLT5jZmctPmVjY19zdHJlbmd0aHM7Cj4gKwl1OCBtYXhfc3RyZW5ndGgsIG5mY19tYXhf c3RyZW5ndGg7Cj4gKwlpbnQgaTsKPiArCj4gKwluZmNfbWF4X3N0cmVuZ3RoID0gbmZjLT5jZmct PmVjY19zdHJlbmd0aHNbMF07Cj4gKwkvKiBJZiBvcHRpb25hbCBkdCBzZXR0aW5ncyBub3QgcHJl c2VudC4gKi8KPiArCWlmICghZWNjLT5zaXplIHx8ICFlY2MtPnN0cmVuZ3RoIHx8Cj4gKwkgICAg ZWNjLT5zdHJlbmd0aCA+IG5mY19tYXhfc3RyZW5ndGgpIHsKPiArCQkvKiBVc2UgZGF0YXNoZWV0 IHJlcXVpcmVtZW50cy4gKi8KPiArCQllY2MtPnN0cmVuZ3RoID0gY2hpcC0+YmFzZS5lY2NyZXEu c3RyZW5ndGg7Cj4gKwkJZWNjLT5zaXplID0gY2hpcC0+YmFzZS5lY2NyZXEuc3RlcF9zaXplOwo+ ICsKPiArCQkvKiBBbGlnbiBFQ0Mgc3RyZW5ndGggYW5kIEVDQyBzaXplLiAqLwo+ICsJCWlmIChj aGlwLT5lY2Muc2l6ZSA8IDEwMjQpIHsKPiArCQkJaWYgKG10ZC0+d3JpdGVzaXplID4gNTEyKSB7 Cj4gKwkJCQljaGlwLT5lY2Muc2l6ZSA9IDEwMjQ7Cj4gKwkJCQljaGlwLT5lY2Muc3RyZW5ndGgg PDw9IDE7Cj4gKwkJCX0gZWxzZSB7Cj4gKwkJCQlkZXZfZXJyKGRldiwgIlVuc3VwcG9ydGVkIGVj Yy5zaXplXG4iKTsKPiArCQkJCXJldHVybiAtRUlOVkFMOwo+ICsJCQl9Cj4gKwkJfSBlbHNlIHsK PiArCQkJY2hpcC0+ZWNjLnNpemUgPSAxMDI0Owo+ICsJCX0KPiArCj4gKwkJZWNjLT5zdGVwcyA9 IG10ZC0+d3JpdGVzaXplIC8gZWNjLT5zaXplOwo+ICsKPiArCQkvKgo+ICsJCSAqIEhXIEVDQyBh bHdheXMgcmVxdWVzdHMgdGhlIG51bWJlciBvZiBFQ0MgYnl0ZXMgcGVyIDEwMjQgYnl0ZQo+ICsJ CSAqIGJsb2Nrcy4gNCBCeXRlcyBpcyBvb2IgZm9yIHN5cyBkYXRhLgo+ICsJCSAqLwo+ICsJCW1h eF9zdHJlbmd0aCA9ICgobXRkLT5vb2JzaXplIC8gZWNjLT5zdGVwcykgLSA0KSAqIDggLwo+ICsJ CQkJIGZscyg4ICogMTAyNCk7Cj4gKwkJaWYgKG1heF9zdHJlbmd0aCA+IG5mY19tYXhfc3RyZW5n dGgpCj4gKwkJCW1heF9zdHJlbmd0aCA9IG5mY19tYXhfc3RyZW5ndGg7Cj4gKwo+ICsJCWZvciAo aSA9IDA7IGkgPCA0OyBpKyspIHsKPiArCQkJaWYgKG1heF9zdHJlbmd0aCA+PSBzdHJlbmd0aHNb aV0pCj4gKwkJCQlicmVhazsKPiArCQl9Cj4gKwo+ICsJCWlmIChpID49IDQpIHsKPiArCQkJZGV2 X2VycihuZmMtPmRldiwgIlVuc3VwcG9ydGVkIEVDQyBzdHJlbmd0aFxuIik7Cj4gKwkJCXJldHVy biAtRU9QTk9UU1VQUDsKPiArCQl9Cj4gKwo+ICsJCWVjYy0+c3RyZW5ndGggPSBzdHJlbmd0aHNb aV07Cj4gKwl9Cj4gKwllY2MtPnN0ZXBzID0gbXRkLT53cml0ZXNpemUgLyBlY2MtPnNpemU7Cj4g KwllY2MtPmJ5dGVzID0gRElWX1JPVU5EX1VQKGVjYy0+c3RyZW5ndGggKiBmbHMoOCAqIDEwMjQp LCA4KTsKPiArCS8qIEhXIEVDQyBhbHdheXMgd29yayB3aXRoIGV2ZW4gbnVtYmVycyBvZiBFQ0Mg Ynl0ZXMuICovCj4gKwllY2MtPmJ5dGVzID0gQUxJR04oZWNjLT5ieXRlcywgMik7Cj4gKwo+ICsJ cmtfbmZjX2h3X2VjY19zZXR1cChjaGlwLCBlY2MsIGVjYy0+c3RyZW5ndGgpOwo+ICsKPiArCXJl dHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19hdHRhY2hfY2hpcChzdHJ1Y3Qg bmFuZF9jaGlwICpjaGlwKQo+ICt7Cj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9f bXRkKGNoaXApOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gbXRkLT5kZXYucGFyZW50Owo+ICsJ c3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsJ c3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHRvX3JrbmFuZChjaGlwKTsKPiArCXN0 cnVjdCBuYW5kX2VjY19jdHJsICplY2MgPSAmY2hpcC0+ZWNjOwo+ICsJaW50IGxlbjsKPiArCWlu dCByZXQ7Cj4gKwo+ICsJaWYgKGNoaXAtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KSB7Cj4g KwkJZGV2X2VycihkZXYsICIxNiBiaXRzIGJ1cyB3aWR0aCBub3Qgc3VwcG9ydGVkIik7Cj4gKwkJ cmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJaWYgKGVjYy0+bW9kZSAhPSBOQU5EX0VDQ19I VykKPiArCQlyZXR1cm4gMDsKPiArCj4gKwlyZXQgPSBya19uZmNfZWNjX2luaXQoZGV2LCBtdGQp Owo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4gcmV0Owo+ICsJcmtuYW5kLT5zcGFyZV9wZXJfc2Vj dG9yID0gZWNjLT5ieXRlcyArIE5GQ19TWVNfREFUQV9TSVpFOwo+ICsJcmtuYW5kLT5tZXRhZGF0 YV9zaXplID0gTkZDX1NZU19EQVRBX1NJWkUgKiBlY2MtPnN0ZXBzOwo+ICsKPiArCWlmIChya25h bmQtPm1ldGFkYXRhX3NpemUgPCBORkNfU1lTX0RBVEFfU0laRSArIDIpIHsKPiArCQlkZXZfZXJy KGRldiwKPiArCQkJIkRyaXZlciBuZWVkcyBhdCBsZWFzdCAlZCBieXRlcyBvZiBtZXRhIGRhdGFc biIsCj4gKwkJCU5GQ19TWVNfREFUQV9TSVpFICsgMik7Cj4gKwkJcmV0dXJuIC1FSU87Cj4gKwl9 Cj4gKwkvKiBDaGVjayBidWZmZXIgZmlyc3QsIGF2b2lkIGR1cGxpY2F0ZSBhbGxvYyBidWZmZXIu ICovCj4gKwlpZiAobmZjLT5idWZmZXIpCj4gKwkJcmV0dXJuIDA7CgpZb3UgY2FuJ3QgZG8gdGhh dCB0aGlzIHdheTogd2hhdCBpZiB0aGUgZmlyc3QgbXRkIHRvIGJlIHJlZ2lzdGVyZWQgdXNlcwph IHNtYWxsZXIgcGFnZSBzaXplIHRoYW4gdGhlIHNlY29uZD8KCj4gKwo+ICsJbGVuID0gbXRkLT53 cml0ZXNpemUgKyBtdGQtPm9vYnNpemU7Cj4gKwluZmMtPmJ1ZmZlciA9IGRldm1fa3phbGxvYyhk ZXYsIGxlbiwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwo+ICsJaWYgKCFuZmMtPmJ1ZmZlcikKPiAr CQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwluZmMtPnBhZ2VfYnVmID0gbmZjLT5idWZmZXI7Cj4g KwlsZW4gPSBlY2MtPnN0ZXBzICogTkZDX01BWF9PT0JfUEVSX1NURVA7Cj4gKwluZmMtPm9vYl9i dWYgPSBkZXZtX2t6YWxsb2MoZGV2LCBsZW4sIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKPiArCWlm ICghbmZjLT5vb2JfYnVmKSB7Cj4gKwkJbmZjLT5idWZmZXIgPSBOVUxMOwo+ICsJCW5mYy0+b29i X2J1ZiA9IE5VTEw7CgpJIGRvbid0IHRoaW5rIHRoaXMgaXMgbmVlZGVkCgo+ICsJCXJldHVybiAt RU5PTUVNOwo+ICsJfQo+ICsKPiArCWNoaXAtPmVjYy53cml0ZV9wYWdlX3JhdyA9IHJrX25mY193 cml0ZV9wYWdlX3JhdzsKPiArCWNoaXAtPmVjYy53cml0ZV9wYWdlID0gcmtfbmZjX3dyaXRlX3Bh Z2VfaHdlY2M7Cj4gKwljaGlwLT5lY2Mud3JpdGVfb29iX3JhdyA9IHJrX25mY193cml0ZV9vb2Jf c3RkOwo+ICsJY2hpcC0+ZWNjLndyaXRlX29vYiA9IHJrX25mY193cml0ZV9vb2Jfc3RkOwo+ICsK PiArCWNoaXAtPmVjYy5yZWFkX3BhZ2VfcmF3ID0gcmtfbmZjX3JlYWRfcGFnZV9yYXc7Cj4gKwlj aGlwLT5lY2MucmVhZF9wYWdlID0gcmtfbmZjX3JlYWRfcGFnZV9od2VjYzsKPiArCWNoaXAtPmVj Yy5yZWFkX29vYl9yYXcgPSBya19uZmNfcmVhZF9vb2Jfc3RkOwo+ICsJY2hpcC0+ZWNjLnJlYWRf b29iID0gcmtfbmZjX3JlYWRfb29iX3N0ZDsKCkkgZG9uJ3QgbGlrZSB0aGUgX3N0ZCBwcmVmaXgs IGJ1dCBpdCBzaG91bGQgYmUgZ29uZSB3aGVuIHNwbGl0dGluZyB0aGUKZnVuY3Rpb25zIGFzIGFk dmlzZWQuCgo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0 IG5hbmRfY29udHJvbGxlcl9vcHMgcmtfbmZjX2NvbnRyb2xsZXJfb3BzID0gewo+ICsJLmF0dGFj aF9jaGlwID0gcmtfbmZjX2F0dGFjaF9jaGlwLAo+ICsJLmV4ZWNfb3AgPSBya19uZmNfZXhlY19v cCwKPiArCS5zZXR1cF9kYXRhX2ludGVyZmFjZSA9IHJrX25mY19zZXR1cF9kYXRhX2ludGVyZmFj ZSwKPiArfTsKPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX25hbmRfY2hpcF9pbml0KHN0cnVjdCBk ZXZpY2UgKmRldiwgc3RydWN0IHJrX25mYyAqbmZjLAo+ICsJCQkJIHN0cnVjdCBkZXZpY2Vfbm9k ZSAqbnApCj4gK3sKPiArCXN0cnVjdCBya19uZmNfbmFuZF9jaGlwICpya25hbmQ7Cj4gKwlzdHJ1 Y3QgbmFuZF9jaGlwICpjaGlwOwo+ICsJc3RydWN0IG10ZF9pbmZvICptdGQ7Cj4gKwlpbnQgbnNl bHM7Cj4gKwl1MzIgdG1wOwo+ICsJaW50IHJldDsKPiArCWludCBpOwo+ICsKPiArCWlmICghb2Zf Z2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgJm5zZWxzKSkKPiArCQlyZXR1cm4gLUVOT0RFVjsKPiAr CW5zZWxzIC89IHNpemVvZih1MzIpOwo+ICsJaWYgKCFuc2VscyB8fCBuc2VscyA+IE5GQ19NQVhf TlNFTFMpIHsKPiArCQlkZXZfZXJyKGRldiwgImludmFsaWQgcmVnIHByb3BlcnR5IHNpemUgJWRc biIsIG5zZWxzKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlya25hbmQgPSBk ZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnJrbmFuZCkgKyBuc2VscyAqIHNpemVvZih1OCksCj4g KwkJCSAgICAgIEdGUF9LRVJORUwpOwo+ICsJaWYgKCFya25hbmQpCj4gKwkJcmV0dXJuIC1FTk9N RU07Cj4gKwo+ICsJcmtuYW5kLT5uc2VscyA9IG5zZWxzOwo+ICsJZm9yIChpID0gMDsgaSA8IG5z ZWxzOyBpKyspIHsKPiArCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChucCwgInJl ZyIsIGksICZ0bXApOwo+ICsJCWlmIChyZXQpIHsKPiArCQkJZGV2X2VycihkZXYsICJyZWcgcHJv cGVydHkgZmFpbHVyZSA6ICVkXG4iLCByZXQpOwo+ICsJCQlyZXR1cm4gcmV0Owo+ICsJCX0KPiAr Cj4gKwkJaWYgKHRtcCA+PSBORkNfTUFYX05TRUxTKSB7Cj4gKwkJCWRldl9lcnIoZGV2LCAiaW52 YWxpZCBDUzogJXVcbiIsIHRtcCk7Cj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ICsJCX0KPiArCj4g KwkJaWYgKHRlc3RfYW5kX3NldF9iaXQodG1wLCAmbmZjLT5hc3NpZ25lZF9jcykpIHsKPiArCQkJ ZGV2X2VycihkZXYsICJDUyAldSBhbHJlYWR5IGFzc2lnbmVkXG4iLCB0bXApOwo+ICsJCQlyZXR1 cm4gLUVJTlZBTDsKPiArCQl9Cj4gKwo+ICsJCXJrbmFuZC0+c2Vsc1tpXSA9IHRtcDsKPiArCX0K PiArCj4gKwljaGlwID0gJnJrbmFuZC0+Y2hpcDsKPiArCWNoaXAtPmNvbnRyb2xsZXIgPSAmbmZj LT5jb250cm9sbGVyOwo+ICsKPiArCW5hbmRfc2V0X2ZsYXNoX25vZGUoY2hpcCwgbnApOwo+ICsK PiArCW5hbmRfc2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwLCBuZmMpOwo+ICsKPiArCWNoaXAtPm9w dGlvbnMgfD0gTkFORF9VU0VTX0RNQSB8IE5BTkRfTk9fU1VCUEFHRV9XUklURTsKPiArCWNoaXAt PmJidF9vcHRpb25zID0gTkFORF9CQlRfVVNFX0ZMQVNIIHwgTkFORF9CQlRfTk9fT09COwo+ICsK PiArCS8qIFNldCBkZWZhdWx0IG1vZGUgaW4gY2FzZSBkdCBlbnRyeSBpcyBtaXNzaW5nLiAqLwo+ ICsJY2hpcC0+ZWNjLm1vZGUgPSBOQU5EX0VDQ19IVzsKPiArCj4gKwltdGQgPSBuYW5kX3RvX210 ZChjaGlwKTsKPiArCW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKPiArCW10ZC0+ZGV2LnBhcmVu dCA9IGRldjsKPiArCj4gKwlpZiAoIW10ZC0+bmFtZSkgewo+ICsJCWRldl9lcnIobmZjLT5kZXYs ICJOQU5EIGxhYmVsIHByb3BlcnR5IGlzIG1hbmRhdG9yeVxuIik7Cj4gKwkJcmV0dXJuIC1FSU5W QUw7Cj4gKwl9Cj4gKwo+ICsJbXRkX3NldF9vb2JsYXlvdXQobXRkLCAmcmtfbmZjX29vYmxheW91 dF9vcHMpOwo+ICsJcmtfbmZjX2h3X2luaXQobmZjKTsKPiArCXJldCA9IG5hbmRfc2NhbihjaGlw LCBuc2Vscyk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJaWYgKGNoaXAt Pm9wdGlvbnMgJiBOQU5EX0lTX0JPT1RfTUVESVVNKSB7Cj4gKwkJcmV0ID0gb2ZfcHJvcGVydHlf cmVhZF91MzIobnAsICJyb2NrY2hpcCxib290LWJsa3MiLCAmdG1wKTsKPiArCQlya25hbmQtPmJv b3RfYmxrcyA9IHJldCA/IDAgOiB0bXA7CgpDYW4ndCB5b3UgZ3Vlc3MgdGhpcyBlbnRyeSBrbm93 aW5nIHRoZSBJUCB2ZXJzaW9uL1NvQyB2ZXJzaW9uPwoKPiArCj4gKwkJcmV0ID0gb2ZfcHJvcGVy dHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxib290LWVjYy1zdHJlbmd0aCIsCj4gKwkJCQkJICAg JnRtcCk7Cj4gKwkJcmtuYW5kLT5ib290X2VjYyA9IHJldCA/IGNoaXAtPmVjYy5zdHJlbmd0aCA6 IHRtcDsKPiArCX0KPiArCj4gKwlyZXQgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKG10ZCwgTlVMTCwg MCk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJZGV2X2VycihkZXYsICJtdGQgcGFyc2UgcGFydGl0aW9u IGVycm9yXG4iKTsKPiArCQluYW5kX2NsZWFudXAoY2hpcCk7Cj4gKwkJcmV0dXJuIHJldDsKPiAr CX0KPiArCj4gKwlsaXN0X2FkZF90YWlsKCZya25hbmQtPm5vZGUsICZuZmMtPmNoaXBzKTsKPiAr Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgcmtfbmZjX2NoaXBzX2NsZWFu dXAoc3RydWN0IHJrX25mYyAqbmZjKQo+ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCAq cmtuYW5kLCAqdG1wOwo+ICsJc3RydWN0IG5hbmRfY2hpcCAqY2hpcDsKPiArCWludCByZXQ7Cj4g Kwo+ICsJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJrbmFuZCwgdG1wLCAmbmZjLT5jaGlwcywg bm9kZSkgewo+ICsJCWNoaXAgPSAmcmtuYW5kLT5jaGlwOwo+ICsJCXJldCA9IG10ZF9kZXZpY2Vf dW5yZWdpc3RlcihuYW5kX3RvX210ZChjaGlwKSk7Cj4gKwkJV0FSTl9PTihyZXQpOwo+ICsJCW5h bmRfY2xlYW51cChjaGlwKTsKPiArCQlsaXN0X2RlbCgmcmtuYW5kLT5ub2RlKTsKPiArCX0KPiAr fQo+ICsKPiArc3RhdGljIGludCBya19uZmNfbmFuZF9jaGlwc19pbml0KHN0cnVjdCBkZXZpY2Ug KmRldiwgc3RydWN0IHJrX25mYyAqbmZjKQo+ICt7Cj4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5w ID0gZGV2LT5vZl9ub2RlLCAqbmFuZF9ucDsKPiArCWludCBuY2hpcHMgPSBvZl9nZXRfY2hpbGRf Y291bnQobnApOwo+ICsJaW50IHJldDsKPiArCj4gKwlpZiAoIW5jaGlwcyB8fCBuY2hpcHMgPiBO RkNfTUFYX05TRUxTKSB7Cj4gKwkJZGV2X2VycihuZmMtPmRldiwgIkluY29ycmVjdCBudW1iZXIg b2YgTkFORCBjaGlwcyAoJWQpXG4iLAo+ICsJCQluY2hpcHMpOwo+ICsJCXJldHVybiAtRUlOVkFM Owo+ICsJfQo+ICsKPiArCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobnAsIG5hbmRfbnApIHsKPiAr CQlyZXQgPSBya19uZmNfbmFuZF9jaGlwX2luaXQoZGV2LCBuZmMsIG5hbmRfbnApOwo+ICsJCWlm IChyZXQpIHsKPiArCQkJb2Zfbm9kZV9wdXQobmFuZF9ucCk7Cj4gKwkJCXJrX25mY19jaGlwc19j bGVhbnVwKG5mYyk7Cj4gKwkJCXJldHVybiByZXQ7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldHVy biAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgc3RydWN0IG5mY19jZmcgbmZjX3Y2X2NmZyA9IHsKPiAr CQkudHlwZQkJCT0gTkZDX1Y2LAo+ICsJCS5lY2Nfc3RyZW5ndGhzCQk9IHs2MCwgNDAsIDI0LCAx Nn0sCj4gKwkJLmVjY19jZmdzCQk9IHsKPiArCQkJMHgwMDA0MDAxMSwgMHgwMDA0MDAwMSwgMHgw MDAwMDAxMSwgMHgwMDAwMDAwMSwKPiArCQl9LAo+ICsJCS5mbGN0bF9vZmYJCT0gMHgwOCwKPiAr CQkuYmNoY3RsX29mZgkJPSAweDBDLAo+ICsJCS5kbWFfY2ZnX29mZgkJPSAweDEwLAo+ICsJCS5k bWFfZGF0YV9idWZfb2ZmCT0gMHgxNCwKPiArCQkuZG1hX29vYl9idWZfb2ZmCT0gMHgxOCwKPiAr CQkuZG1hX3N0X29mZgkJPSAweDFDLAo+ICsJCS5iY2hfc3Rfb2ZmCQk9IDB4MjAsCj4gKwkJLnJh bmRtel9vZmYJCT0gMHgxNTAsCj4gKwkJLmludF9lbl9vZmYJCT0gMHgxNkMsCj4gKwkJLmludF9j bHJfb2ZmCQk9IDB4MTcwLAo+ICsJCS5pbnRfc3Rfb2ZmCQk9IDB4MTc0LAo+ICsJCS5vb2IwX29m ZgkJPSAweDIwMCwKPiArCQkub29iMV9vZmYJCT0gMHgyMzAsCj4gKwkJLmVjYzAJCQk9IHsKPiAr CQkJLmVycl9mbGFnX2JpdAk9IDIsCj4gKwkJCS5sb3cJCT0gMywKPiArCQkJLmxvd19tYXNrCT0g MHgxRiwKPiArCQkJLmxvd19ibgkJPSA1LAo+ICsJCQkuaGlnaAkJPSAyNywKPiArCQkJLmhpZ2hf bWFzawk9IDB4MSwKPiArCQl9LAo+ICsJCS5lY2MxCQkJPSB7Cj4gKwkJCS5lcnJfZmxhZ19iaXQJ PSAxNSwKPiArCQkJLmxvdwkJPSAxNiwKPiArCQkJLmxvd19tYXNrCT0gMHgxRiwKPiArCQkJLmxv d19ibgkJPSA1LAo+ICsJCQkuaGlnaAkJPSAyOSwKPiArCQkJLmhpZ2hfbWFzawk9IDB4MSwKPiAr CQl9LAo+ICt9Owo+ICsKPiArc3RhdGljIHN0cnVjdCBuZmNfY2ZnIG5mY192OF9jZmcgPSB7Cj4g KwkJLnR5cGUJCQk9IE5GQ19WOCwKPiArCQkuZWNjX3N0cmVuZ3RocwkJPSB7MTYsIDE2LCAxNiwg MTZ9LAo+ICsJCS5lY2NfY2ZncwkJPSB7Cj4gKwkJCTB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4 MDAwMDAwMDEsIDB4MDAwMDAwMDEsCj4gKwkJfSwKPiArCQkuZmxjdGxfb2ZmCQk9IDB4MDgsCj4g KwkJLmJjaGN0bF9vZmYJCT0gMHgwQywKPiArCQkuZG1hX2NmZ19vZmYJCT0gMHgxMCwKPiArCQku ZG1hX2RhdGFfYnVmX29mZgk9IDB4MTQsCj4gKwkJLmRtYV9vb2JfYnVmX29mZgk9IDB4MTgsCj4g KwkJLmRtYV9zdF9vZmYJCT0gMHgxQywKPiArCQkuYmNoX3N0X29mZgkJPSAweDIwLAo+ICsJCS5y YW5kbXpfb2ZmCQk9IDB4MTUwLAo+ICsJCS5pbnRfZW5fb2ZmCQk9IDB4MTZDLAo+ICsJCS5pbnRf Y2xyX29mZgkJPSAweDE3MCwKPiArCQkuaW50X3N0X29mZgkJPSAweDE3NCwKPiArCQkub29iMF9v ZmYJCT0gMHgyMDAsCj4gKwkJLm9vYjFfb2ZmCQk9IDB4MjMwLAo+ICsJCS5lY2MwCQkJPSB7Cj4g KwkJCS5lcnJfZmxhZ19iaXQJPSAyLAo+ICsJCQkubG93CQk9IDMsCj4gKwkJCS5sb3dfbWFzawk9 IDB4MUYsCj4gKwkJCS5sb3dfYm4JCT0gNSwKPiArCQkJLmhpZ2gJCT0gMjcsCj4gKwkJCS5oaWdo X21hc2sJPSAweDEsCj4gKwkJfSwKPiArCQkuZWNjMQkJCT0gewo+ICsJCQkuZXJyX2ZsYWdfYml0 CT0gMTUsCj4gKwkJCS5sb3cJCT0gMTYsCj4gKwkJCS5sb3dfbWFzawk9IDB4MUYsCj4gKwkJCS5s b3dfYm4JCT0gNSwKPiArCQkJLmhpZ2gJCT0gMjksCj4gKwkJCS5oaWdoX21hc2sJPSAweDEsCj4g KwkJfSwKPiArfTsKPiArCj4gK3N0YXRpYyBzdHJ1Y3QgbmZjX2NmZyBuZmNfdjlfY2ZnID0gewo+ ICsJCS50eXBlCQkJPSBORkNfVjksCj4gKwkJLmVjY19zdHJlbmd0aHMJCT0gezcwLCA2MCwgNDAs IDE2fSwKPiArCQkuZWNjX2NmZ3MJCT0gewo+ICsJCQkweDAwMDAwMDAxLCAweDA2MDAwMDAxLCAw eDA0MDAwMDAxLCAweDAyMDAwMDAxLAo+ICsJCX0sCj4gKwkJLmZsY3RsX29mZgkJPSAweDEwLAo+ ICsJCS5iY2hjdGxfb2ZmCQk9IDB4MjAsCj4gKwkJLmRtYV9jZmdfb2ZmCQk9IDB4MzAsCj4gKwkJ LmRtYV9kYXRhX2J1Zl9vZmYJPSAweDM0LAo+ICsJCS5kbWFfb29iX2J1Zl9vZmYJPSAweDM4LAo+ ICsJCS5kbWFfc3Rfb2ZmCQk9IDB4M0MsCj4gKwkJLmJjaF9zdF9vZmYJCT0gMHgxNTAsCj4gKwkJ LnJhbmRtel9vZmYJCT0gMHgyMDgsCj4gKwkJLmludF9lbl9vZmYJCT0gMHgxMjAsCj4gKwkJLmlu dF9jbHJfb2ZmCQk9IDB4MTI0LAo+ICsJCS5pbnRfc3Rfb2ZmCQk9IDB4MTI4LAo+ICsJCS5vb2Iw X29mZgkJPSAweDIwMCwKPiArCQkub29iMV9vZmYJCT0gMHgyMDQsCj4gKwkJLmVjYzAJCQk9IHsK PiArCQkJLmVycl9mbGFnX2JpdAk9IDIsCj4gKwkJCS5sb3cJCT0gMywKPiArCQkJLmxvd19tYXNr CT0gMHg3RiwKPiArCQkJLmxvd19ibgkJPSA3LAo+ICsJCQkuaGlnaAkJPSAwLAo+ICsJCQkuaGln aF9tYXNrCT0gMHgwLAo+ICsJCX0sCj4gKwkJLmVjYzEJCQk9IHsKPiArCQkJLmVycl9mbGFnX2Jp dAk9IDE4LAo+ICsJCQkubG93CQk9IDE5LAo+ICsJCQkubG93X21hc2sJPSAweDdGLAo+ICsJCQku bG93X2JuCQk9IDcsCj4gKwkJCS5oaWdoCQk9IDAsCj4gKwkJCS5oaWdoX21hc2sJPSAweDAsCj4g KwkJfSwKPiArfTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJrX25m Y19pZF90YWJsZVtdID0gewo+ICsJey5jb21wYXRpYmxlID0gInJvY2tjaGlwLHB4MzAtbmZjIiwK PiArCQkuZGF0YSA9ICZuZmNfdjlfY2ZnIH0sCgoJewoJCS5jb21wYXRpYmxlID0KCQkuZGF0YSA9 Cgl9LAoKb3IKCgl7IC5jb21wYXRpYmxlID0gLCAuZGF0YSA9IH0sCgpidXQgbm90OgoKPiArCXsu Y29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazI5MjgtbmZjIiwKPiArCQkuZGF0YSA9ICZuZmNfdjZf Y2ZnIH0sCj4gKwl7LmNvbXBhdGlibGUgPSAicm9ja2NoaXAscnYxMTA4LW5mYyIsCj4gKwkJLmRh dGEgPSAmbmZjX3Y4X2NmZyB9LAo+ICsJeyAvKiBzZW50aW5lbCAqLyB9Cj4gK307Cj4gK01PRFVM RV9ERVZJQ0VfVEFCTEUob2YsIHJrX25mY19pZF90YWJsZSk7Cj4gKwo+ICtzdGF0aWMgaW50IHJr X25mY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICt7Cj4gKwlzdHJ1Y3Qg ZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2Owo+ICsJc3RydWN0IHJrX25mYyAqbmZjOwo+ICsJaW50 IHJldCwgaXJxOwo+ICsKPiArCW5mYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqbmZjKSwg R0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIW5mYykKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwlu YW5kX2NvbnRyb2xsZXJfaW5pdCgmbmZjLT5jb250cm9sbGVyKTsKPiArCUlOSVRfTElTVF9IRUFE KCZuZmMtPmNoaXBzKTsKPiArCW5mYy0+Y29udHJvbGxlci5vcHMgPSAmcmtfbmZjX2NvbnRyb2xs ZXJfb3BzOwo+ICsKPiArCW5mYy0+Y2ZnID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKGRldik7 Cj4gKwluZmMtPmRldiA9IGRldjsKPiArCj4gKwlpbml0X2NvbXBsZXRpb24oJm5mYy0+ZG9uZSk7 Cj4gKwo+ICsJbmZjLT5yZWdzID0gZGV2bV9wbGF0Zm9ybV9pb3JlbWFwX3Jlc291cmNlKHBkZXYs IDApOwo+ICsJaWYgKElTX0VSUihuZmMtPnJlZ3MpKSB7Cj4gKwkJcmV0ID0gUFRSX0VSUihuZmMt PnJlZ3MpOwo+ICsJCWdvdG8gcmVsZWFzZV9uZmM7Cj4gKwl9Cj4gKwo+ICsJbmZjLT5jbGsubmZj X2NsayA9IGRldm1fY2xrX2dldChkZXYsICJuZmMiKTsKPiArCWlmIChJU19FUlIobmZjLT5jbGsu bmZjX2NsaykpIHsKPiArCQlkZXZfZGJnKGRldiwgIm5vIG5mYyBjbGtcbiIpOwo+ICsJCS8qIFNv bWUgZWFybGllciBtb2RlbHMsIHN1Y2ggYXMgcmszMDY2LCBoYXZlIG5vIG5mYyBjbGsuICovCj4g Kwl9Cj4gKwo+ICsJbmZjLT5jbGsuYWhiX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJhaGIiKTsK PiArCWlmIChJU19FUlIobmZjLT5jbGsuYWhiX2NsaykpIHsKPiArCQlkZXZfZXJyKGRldiwgIm5v IGFoYiBjbGtcbiIpOwo+ICsJCXJldCA9IFBUUl9FUlIobmZjLT5jbGsuYWhiX2Nsayk7Cj4gKwkJ Z290byByZWxlYXNlX25mYzsKPiArCX0KPiArCj4gKwlyZXQgPSBya19uZmNfZW5hYmxlX2Nsayhk ZXYsICZuZmMtPmNsayk7Cj4gKwlpZiAocmV0KQo+ICsJCWdvdG8gcmVsZWFzZV9uZmM7Cj4gKwo+ ICsJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKPiArCWlmIChpcnEgPCAwKSB7Cj4g KwkJZGV2X2VycihkZXYsICJubyBuZmMgaXJxIHJlc291cmNlXG4iKTsKPiArCQlyZXQgPSAtRUlO VkFMOwo+ICsJCWdvdG8gY2xrX2Rpc2FibGU7Cj4gKwl9Cj4gKwo+ICsJd3JpdGVsKDAsIG5mYy0+ cmVncyArIG5mYy0+Y2ZnLT5pbnRfZW5fb2ZmKTsKPiArCXJldCA9IGRldm1fcmVxdWVzdF9pcnEo ZGV2LCBpcnEsIHJrX25mY19pcnEsIDB4MCwgInJrLW5hbmQiLCBuZmMpOwo+ICsJaWYgKHJldCkg ewo+ICsJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgbmZjIGlycVxuIik7Cj4gKwkJ Z290byBjbGtfZGlzYWJsZTsKPiArCX0KPiArCj4gKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2 LCBuZmMpOwo+ICsKPiArCXJldCA9IHJrX25mY19uYW5kX2NoaXBzX2luaXQoZGV2LCBuZmMpOwo+ ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGluaXQgTkFORCBjaGlw c1xuIik7Cj4gKwkJZ290byBjbGtfZGlzYWJsZTsKPiArCX0KPiArCXJldHVybiAwOwo+ICsKPiAr Y2xrX2Rpc2FibGU6Cj4gKwlya19uZmNfZGlzYWJsZV9jbGsoJm5mYy0+Y2xrKTsKPiArcmVsZWFz ZV9uZmM6Cj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19yZW1v dmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiArewo+ICsJc3RydWN0IHJrX25mYyAq bmZjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Cj4gKwo+ICsJcmtfbmZjX2NoaXBzX2Ns ZWFudXAobmZjKTsKPiArCXJrX25mY19kaXNhYmxlX2NsaygmbmZjLT5jbGspOwoKRG9uJ3QgeW91 IGhhdmUgRE1BIHJlc291cmNlcyBhbmQgIWRldm0gYWxsb2NhdGVkIGJ1ZmZlcnMgdG8gZnJlZT8K Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQg cmtfbmZjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZj ICpuZmMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiArCj4gKwlya19uZmNfZGlzYWJsZV9jbGso Jm5mYy0+Y2xrKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBfX21h eWJlX3VudXNlZCBya19uZmNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKPiArewo+ICsJc3Ry dWN0IHJrX25mYyAqbmZjID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gKwlzdHJ1Y3QgcmtfbmZj X25hbmRfY2hpcCAqcmtuYW5kOwo+ICsJc3RydWN0IG5hbmRfY2hpcCAqY2hpcDsKPiArCWludCBy ZXQ7Cj4gKwl1MzIgaTsKPiArCj4gKwlyZXQgPSBya19uZmNfZW5hYmxlX2NsayhkZXYsICZuZmMt PmNsayk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJLyogUmVzZXQgTkFO RCBjaGlwIGlmIFZDQyB3YXMgcG93ZXJlZCBvZmYuICovCj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5 KHJrbmFuZCwgJm5mYy0+Y2hpcHMsIG5vZGUpIHsKPiArCQljaGlwID0gJnJrbmFuZC0+Y2hpcDsK PiArCQlmb3IgKGkgPSAwOyBpIDwgcmtuYW5kLT5uc2VsczsgaSsrKQo+ICsJCQluYW5kX3Jlc2V0 KGNoaXAsIGkpOwoKSSBhc3N1bWUgdGhpcyBpcyBoYW5kbGVkIGJ5IHRoZSBjb3JlIGFscmVhZHkg KHBsZWFzZSB2ZXJpZnkgaXQpCgo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtz dGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgcmtfbmZjX3BtX29wcyA9IHsKPiArCVNFVF9T WVNURU1fU0xFRVBfUE1fT1BTKHJrX25mY19zdXNwZW5kLCBya19uZmNfcmVzdW1lKQo+ICt9Owo+ ICsKPiArc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcmtfbmZjX2RyaXZlciA9IHsKPiAr CS5wcm9iZSA9IHJrX25mY19wcm9iZSwKPiArCS5yZW1vdmUgPSBya19uZmNfcmVtb3ZlLAo+ICsJ LmRyaXZlciA9IHsKPiArCQkubmFtZSA9ICJyb2NrY2hpcC1uZmMiLAo+ICsJCS5vZl9tYXRjaF90 YWJsZSA9IHJrX25mY19pZF90YWJsZSwKPiArCQkucG0gPSAmcmtfbmZjX3BtX29wcywKPiArCX0s Cj4gK307Cj4gKwo+ICttb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHJrX25mY19kcml2ZXIpOwo+ICsK PiArTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTUlUL0dQTCIpOwo+ICtNT0RVTEVfQVVUSE9SKCJZaWZl bmcgWmhhbyA8eWlmZW5nLnpoYW9Acm9jay1jaGlwcy5jb20+Iik7Cj4gK01PRFVMRV9ERVNDUklQ VElPTigiUm9ja2NoaXAgTmFuZCBGbGFzaCBDb250cm9sbGVyIERyaXZlciIpOwo+ICtNT0RVTEVf QUxJQVMoInBsYXRmb3JtOnJvY2tjaGlwLW5hbmQtY29udHJvbGxlciIpOwoKVGhhbmtzLApNaXF1 w6hsCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51 eC1yb2NrY2hpcCBtYWlsaW5nIGxpc3QKTGludXgtcm9ja2NoaXBAbGlzdHMuaW5mcmFkZWFkLm9y ZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJvY2tj aGlwCg== 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=-14.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 E9F93C2D0E0 for ; Tue, 15 Sep 2020 08:09: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 5BEA320771 for ; Tue, 15 Sep 2020 08:09:54 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="vJTjcqjd" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5BEA320771 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=eoVLl7bQ2F7ZwuhNmkmH0fUUY908VziLMGoGI5xg47M=; b=vJTjcqjdLVXa9/tR2cFBE/U7t BN7MKzdfRd4VnMGD7Y6q4O7LenT3qniCoealeRIDrj9HgNUCfYetUbBe4sTfo02QrifRi7AA8S0Zd 77Co6f0sxhXtJGL3+2eWlU75hIWZIpvce2Gt3GGD1WNNGjEGZqRZI52+xPhf819ZwSb+xSVjkhcvw q8Avm5k7qwWvNnRqNTyCuM6Wajd36HCn9a8tyz/yllYJ2eV0mxPU98NONLQheRP/ogpMd0+Eq97c9 YCfqqjaC37e0SOhqJw4yxKTfO+QlyklaA9R438ti+41JQdtTAlKRa98/Pgmaj3o58iXNwwSkulI1O I7SocNsyg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kI605-0004t2-T1; Tue, 15 Sep 2020 08:07:44 +0000 Received: from relay5-d.mail.gandi.net ([217.70.183.197]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kI600-0004s7-MP; Tue, 15 Sep 2020 08:07:39 +0000 X-Originating-IP: 91.224.148.103 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay5-d.mail.gandi.net (Postfix) with ESMTPSA id 538551C000E; Tue, 15 Sep 2020 08:07:29 +0000 (UTC) Date: Tue, 15 Sep 2020 10:07:28 +0200 From: Miquel Raynal To: Yifeng Zhao Subject: Re: [PATCH v8 2/8] mtd: rawnand: rockchip: NFC drivers for RK3308, RK2928 and others Message-ID: <20200915100728.5c866f89@xps13> In-Reply-To: <20200717092420.19798-3-yifeng.zhao@rock-chips.com> References: <20200717092420.19798-1-yifeng.zhao@rock-chips.com> <20200717092420.19798-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-20200915_040737_099718_FB02F21D X-CRM114-Status: GOOD ( 38.10 ) 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 SGkgWWlmZW5nLAoKSSBhbSB2ZXJ5IHNvcnJ5IGZvciB0aGUgZGVsYXkgaXQgdG9vayBtZSB0byBy ZXZpZXcgdGhpcyBkcml2ZXIsIGJ1dAp0aGVyZSBhcmUgc3RpbGwgc29tZSBzbWFsbCBpbmNvaGVy ZW5jZXMgSU1ITywgc2VlIGJlbG93LgoKWWlmZW5nIFpoYW8gPHlpZmVuZy56aGFvQHJvY2stY2hp cHMuY29tPiB3cm90ZSBvbiBGcmksIDE3IEp1bCAyMDIwCjE3OjI0OjE4ICswODAwOgoKPiBUaGlz IGRyaXZlciBzdXBwb3J0cyBSb2NrY2hpcCBORkMgKE5BTkQgRmxhc2ggQ29udHJvbGxlcikgZm91 bmQgb24gUkszMzA4LAo+IFJLMjkyOCwgUktQWDMwLCBSVjExMDggYW5kIG90aGVyIFNPQ3MuIFRo ZSBkcml2ZXIgaGFzIGJlZW4gdGVzdGVkIHVzaW5nCj4gOC1iaXQgTkFORCBpbnRlcmZhY2Ugb24g dGhlIEFSTSBiYXNlZCBSSzMzMDggcGxhdGZvcm0uCj4gCj4gU3VwcG9ydCBSb2NrY2hpcCBTb0Nz IGFuZCBORkMgdmVyc2lvbnM6Cj4gLSBQWDMwIGFuZCBSSzMzMjYoTkZDdjkwMCkuCj4gCUVDQzog MTYvNDAvNjAvNzAgYml0cy8xS0IuCj4gCUNMT0NLOiBhaGIgYW5kIG5mYy4KPiAtIFJLMzMwOCBh bmQgUlYxMTA4KE5GQ3Y4MDApLgo+IAlFQ0M6IDE2IGJpdHMvMUtCLgo+IAlDTE9DSzogYWhiIGFu ZCBuZmMuCj4gLSBSSzMwMzYgYW5kIFJLMzEyOChORkN2NjIyKS4KPiAJRUNDOiAxNi8yNC80MC82 MCBiaXRzLzFLQi4KPiAJQ0xPQ0s6IGFoYiBhbmQgbmZjLgo+IC0gUkszMDY2LCBSSzMxODggYW5k IFJLMjkyOChORkN2NjAwKS4KPiAJRUNDOiAxNi8yNC80MC82MCBiaXRzLzFLQi4KPiAJQ0xPQ0s6 IGFoYi4KPiAKPiBTdXBwb3J0ZWQgZmVhdHVyZXM6Cj4gLSBSZWFkIGZ1bGwgcGFnZSBkYXRhIGJ5 IERNQS4KPiAtIFN1cHBvcnQgSFcgRUNDKG9uZSBzdGVwIGlzIDFLQikuCj4gLSBTdXBwb3J0IDIg LSAzMksgcGFnZSBzaXplLgo+IC0gU3VwcG9ydCA4IENTKGRlcGVuZCBvbiBTb0NzKQo+IAo+IExp bWl0YXRpb25zOgo+IC0gTm8gc3VwcG9ydCBmb3IgdGhlIGVjYyBzdGVwIHNpemUgaXMgNTEyLgo+ IC0gVW50ZXN0ZWQgb24gc29tZSBTb0NzLgo+IC0gTm8gc3VwcG9ydCBmb3Igc3VicGFnZXMuCj4g LSBObyBzdXBwb3J0IGZvciB0aGUgYnVpbHRpbiByYW5kb21pemVyLgo+IC0gVGhlIG9yaWdpbmFs IGJhZCBibG9jayBtYXNrIGlzIG5vdCBzdXBwb3J0ZWQuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVz ZQo+ICAgdGhlIEJCVChiYWQgYmxvY2sgdGFibGUpLgo+IAo+IFNpZ25lZC1vZmYtYnk6IFlpZmVu ZyBaaGFvIDx5aWZlbmcuemhhb0Byb2NrLWNoaXBzLmNvbT4KPiAtLS0KPiAKPiBDaGFuZ2VzIGlu IHY4OiBOb25lCj4gQ2hhbmdlcyBpbiB2NzoKPiAtIFJlYmFzZSB0byBsaW51eC1uZXh0Lgo+IC0g Rml4IGNvZGluZyBzdHlsZS4KPiAtIFJlc2VydmVkIDQgYnl0ZXMgYXQgdGhlIGJlZ2luaW5nIG9m IHRoZSBvb2IgYXJlYS4KPiAtIFBhZ2UgcmF3IHJlYWQgYW5kIHdyaXRlIGluY2x1ZGVkIGVjYyBk YXRhLgo+IAo+IENoYW5nZXMgaW4gdjY6Cj4gLSBUaGUgbXRkLT5uYW1lIHNldCBieSBOQU5EIGxh YmVsIHByb3BlcnR5Lgo+IC0gQWRkIHNvbWUgY29tbWVudHMuCj4gLSBGaXggY29tcGlsZSBlcnJv ci4KPiAKPiBDaGFuZ2VzIGluIHY1Ogo+IC0gQWRkIGJvb3QgYmxvY2tzIHN1cHBvcnQgIHdpdGgg ZGlmZmVyZW50IEVDQyBmb3IgYm9vdFJPTS4KPiAtIFJlbmFtZSByb2NrY2hpcC1uYW5kLmMgdG8g cm9ja2NoaXAtbmFuZC1jb250cm9sbGVyLmMuCj4gLSBVbmlmaWNhdGlvbiBvZiBvdGhlciB2YXJp YWJsZSBuYW1lcy4KPiAtIFJlbW92ZSBzb21lIGNvbXBhdGlibGUgZGVmaW5lLgo+IAo+IENoYW5n ZXMgaW4gdjQ6Cj4gLSBEZWZpbmUgcGxhdGZvcm0gZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSByZWdp c3RlciBvZmZzZXRzLgo+IC0gVGhlIGNvbXBhdGlibGUgZGVmaW5lIHdpdGggcmt4eF9uZmMuCj4g LSBVc2UgU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMgdG8gZGVmaW5lIFBNX09QUy4KPiAtIFVzZSBl eGVjX29wIGluc3RlYWQgb2YgbGVnYWN5IGhvb2tzLgo+IAo+IENoYW5nZXMgaW4gdjM6IE5vbmUK PiBDaGFuZ2VzIGluIHYyOgo+IC0gRml4IGNvbXBpbGUgZXJyb3IuCj4gLSBJbmNsdWRlIGhlYWRl ciBmaWxlcyBzb3J0ZWQgYnkgZmlsZSBuYW1lLgo+IAo+ICBkcml2ZXJzL210ZC9uYW5kL3Jhdy9L Y29uZmlnICAgICAgICAgICAgICAgICAgfCAgIDEyICsKPiAgZHJpdmVycy9tdGQvbmFuZC9yYXcv TWFrZWZpbGUgICAgICAgICAgICAgICAgIHwgICAgMSArCj4gIC4uLi9tdGQvbmFuZC9yYXcvcm9j a2NoaXAtbmFuZC1jb250cm9sbGVyLmMgICB8IDE0MjIgKysrKysrKysrKysrKysrKysKPiAgMyBm aWxlcyBjaGFuZ2VkLCAxNDM1IGluc2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRy aXZlcnMvbXRkL25hbmQvcmF3L3JvY2tjaGlwLW5hbmQtY29udHJvbGxlci5jCj4gCj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvcmF3L0tjb25maWcgYi9kcml2ZXJzL210ZC9uYW5kL3Jh dy9LY29uZmlnCj4gaW5kZXggMTEzZjYxMDUyMjY5Li42NDkyODU1ZDRhNTUgMTAwNjQ0Cj4gLS0t IGEvZHJpdmVycy9tdGQvbmFuZC9yYXcvS2NvbmZpZwo+ICsrKyBiL2RyaXZlcnMvbXRkL25hbmQv cmF3L0tjb25maWcKPiBAQCAtNDYxLDYgKzQ2MSwxOCBAQCBjb25maWcgTVREX05BTkRfQVJBU0FO Cj4gIAkgIEVuYWJsZXMgdGhlIGRyaXZlciBmb3IgdGhlIEFyYXNhbiBOQU5EIGZsYXNoIGNvbnRy b2xsZXIgb24KPiAgCSAgWnlucSBVbHRyYXNjYWxlKyBNUFNvQy4KPiAgCj4gK2NvbmZpZyBNVERf TkFORF9ST0NLQ0hJUAo+ICsJdHJpc3RhdGUgIlJvY2tjaGlwIE5BTkQgY29udHJvbGxlciIKPiAr CWRlcGVuZHMgb24gQVJDSF9ST0NLQ0hJUCAmJiBIQVNfSU9NRU0KPiArCWhlbHAKPiArCSAgRW5h YmxlcyBzdXBwb3J0IGZvciBOQU5EIGNvbnRyb2xsZXIgb24gUm9ja2NoaXAgU29Dcy4KPiArCSAg VGhlcmUgYXJlIGZvdXIgZGlmZmVyZW50IHZlcnNpb25zIG9mIE5BTkQgRkxBU0ggQ29udHJvbGxl cnMsCj4gKwkgIGluY2x1ZGluZzoKPiArCSAgICBORkMgdjYwMDogUksyOTI4LCBSSzMwNjYsIFJL MzE4OAo+ICsJICAgIE5GQyB2NjIyOiBSSzMwMzYsIFJLMzEyOAo+ICsJICAgIE5GQyB2ODAwOiBS SzMzMDgsIFJWMTEwOAo+ICsJICAgIE5GQyB2OTAwOiBQWDMwLCBSSzMzMjYKPiArCj4gIGNvbW1l bnQgIk1pc2MiCj4gIAo+ICBjb25maWcgTVREX1NNX0NPTU1PTgo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL210ZC9uYW5kL3Jhdy9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L01ha2VmaWxl Cj4gaW5kZXggMjkzMGY1YjkwMTVkLi45NjBjOWJlMjUyMDQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVy cy9tdGQvbmFuZC9yYXcvTWFrZWZpbGUKPiArKysgYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9NYWtl ZmlsZQo+IEBAIC01OCw2ICs1OCw3IEBAIG9iai0kKENPTkZJR19NVERfTkFORF9TVE0zMl9GTUMy KQkrPSBzdG0zMl9mbWMyX25hbmQubwo+ICBvYmotJChDT05GSUdfTVREX05BTkRfTUVTT04pCQkr PSBtZXNvbl9uYW5kLm8KPiAgb2JqLSQoQ09ORklHX01URF9OQU5EX0NBREVOQ0UpCQkrPSBjYWRl bmNlLW5hbmQtY29udHJvbGxlci5vCj4gIG9iai0kKENPTkZJR19NVERfTkFORF9BUkFTQU4pCQkr PSBhcmFzYW4tbmFuZC1jb250cm9sbGVyLm8KPiArb2JqLSQoQ09ORklHX01URF9OQU5EX1JPQ0tD SElQKQkJKz0gcm9ja2NoaXAtbmFuZC1jb250cm9sbGVyLm8KPiAgCj4gIG5hbmQtb2JqcyA6PSBu YW5kX2Jhc2UubyBuYW5kX2xlZ2FjeS5vIG5hbmRfYmJ0Lm8gbmFuZF90aW1pbmdzLm8gbmFuZF9p ZHMubwo+ICBuYW5kLW9ianMgKz0gbmFuZF9vbmZpLm8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9t dGQvbmFuZC9yYXcvcm9ja2NoaXAtbmFuZC1jb250cm9sbGVyLmMgYi9kcml2ZXJzL210ZC9uYW5k L3Jhdy9yb2NrY2hpcC1uYW5kLWNvbnRyb2xsZXIuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4g aW5kZXggMDAwMDAwMDAwMDAwLi5mZWMxMzYwNjAzZTAKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIv ZHJpdmVycy9tdGQvbmFuZC9yYXcvcm9ja2NoaXAtbmFuZC1jb250cm9sbGVyLmMKPiBAQCAtMCww ICsxLDE0MjIgQEAKPiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgT1IgTUlU Cj4gKy8qCj4gKyAqIFJvY2tjaGlwIE5BTkQgRmxhc2ggY29udHJvbGxlciBkcml2ZXIuCj4gKyAq IENvcHlyaWdodCAoQykgMjAyMCBSb2NrY2hpcCBJbmMuCj4gKyAqIEF1dGhvcjogWWlmZW5nIFpo YW8gPHlpZmVuZy56aGFvQHJvY2stY2hpcHMuY29tPgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxs aW51eC9jbGsuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4gKyNpbmNsdWRlIDxsaW51 eC9kbWEtbWFwcGluZy5oPgo+ICsjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+Cj4gKyNpbmNs dWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgo+ICsj aW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Cj4g KyNpbmNsdWRlIDxsaW51eC9tdGQvcmF3bmFuZC5oPgo+ICsjaW5jbHVkZSA8bGludXgvb2YuaD4K PiArI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGxhdGZv cm1fZGV2aWNlLmg+Cj4gKwo+ICsvKgo+ICsgKiBORkMgUGFnZSBEYXRhIExheW91dDoKPiArICoJ MTAyNCBCeXRlcyBEYXRhICsgNEJ5dGVzIHN5cyBkYXRhICsgMjhCeXRlc34xMjRCeXRlcyBlY2Mg Kwo+ICsgKgkxMDI0IEJ5dGVzIERhdGEgKyA0Qnl0ZXMgc3lzIGRhdGEgKyAyOEJ5dGVzfjEyNEJ5 dGVzIGVjYyArCj4gKyAqCS4uLi4uLgo+ICsgKiBOQU5EIFBhZ2UgRGF0YSBMYXlvdXQ6Cj4gKyAq CTEwMjQgKiBuIERhdGEgKyBtIEJ5dGVzIG9vYgo+ICsgKiBPcmlnaW5hbCBCYWQgQmxvY2sgTWFz ayBMb2NhdGlvbjoKPiArICoJRmlyc3QgYnl0ZSBvZiBvb2Ioc3BhcmUpLgo+ICsgKiBuYW5kX2No aXAtPm9vYl9wb2kgZGF0YSBsYXlvdXQ6Cj4gKyAqCTRCeXRlcyBzeXMgZGF0YSArIC4uLi4gKyA0 Qnl0ZXMgc3lzIGRhdGEgKyBlY2MgZGF0YS4KPiArICovCj4gKwo+ICsvKiBOQU5EIGNvbnRyb2xs ZXIgcmVnaXN0ZXIgZGVmaW5pdGlvbiAqLwo+ICsjZGVmaW5lCU5GQ19SRUFECQkoMCkKPiArI2Rl ZmluZQlORkNfV1JJVEUJCSgxKQo+ICsjZGVmaW5lCU5GQ19GTUNUTAkJKDB4MDApCj4gKyNkZWZp bmUJCUZNQ1RMX0NFX1NFTF9NCQkweEZGCgpOaXRwaWNraW5nOiBJJ2QgcHJlZmVyCgojZGVmaW5l CU5GQ19GTUNUTAkJMHgwMAojZGVmaW5lCSAgRk1DVExfQ0VfU0VMX00JMHhGRgoKCj4gKyNkZWZp bmUJCUZNQ1RMX0NFX1NFTCh4KQkJKDEgPDwgKHgpKQo+ICsjZGVmaW5lCQlGTUNUTF9XUAkJQklU KDgpCj4gKyNkZWZpbmUJCUZNQ1RMX1JEWQkJQklUKDkpCj4gKyNkZWZpbmUJTkZDX0ZNV0FJVAkJ KDB4MDQpCj4gKyNkZWZpbmUJCUZMQ1RMX1JTVAkJQklUKDApCj4gKyNkZWZpbmUJCUZMQ1RMX1dS CQkoMSkJLyogMDogcmVhZCwgMTogd3JpdGUgKi8KPiArI2RlZmluZQkJRkxDVExfWEZFUl9TVAkJ QklUKDIpCj4gKyNkZWZpbmUJCUZMQ1RMX1hGRVJfRU4JCUJJVCgzKQo+ICsjZGVmaW5lCQlGTENU TF9BQ09SUkVDVAkJQklUKDEwKSAvKiBBdXRvIGNvcnJlY3QgZXJyb3IgYml0cy4gKi8KPiArI2Rl ZmluZQkJRkxDVExfWEZFUl9SRUFEWQlCSVQoMjApCj4gKyNkZWZpbmUJCUZMQ1RMX1hGRVJfU0VD VE9SCSgyMikKPiArI2RlZmluZQkJRkxDVExfVE9HX0ZJWAkJQklUKDI5KQo+ICsjZGVmaW5lCQlC Q0hDVExfQkFOS19NCSg3IDw8IDUpCj4gKyNkZWZpbmUJCUJDSENUTF9CQU5LCSg1KQo+ICsjZGVm aW5lCQlETUFfU1QJCQlCSVQoMCkKPiArI2RlZmluZQkJRE1BX1dSCQkJKDEpCS8qIDA6IHdyaXRl LCAxOiByZWFkICovCj4gKyNkZWZpbmUJCURNQV9FTgkJCUJJVCgyKQo+ICsjZGVmaW5lCQlETUFf QUhCX1NJWkUJCSgzKQkvKiAwOiAxLCAxOiAyLCAyOiA0ICovCj4gKyNkZWZpbmUJCURNQV9CVVJT VF9TSVpFCQkoNikJLyogMDogMSwgMzogNCwgNTogOCwgNzogMTYgKi8KPiArI2RlZmluZQkJRE1B X0lOQ19OVU0JCSg5KQkvKiAxIC0gMTYgKi8KPiArI2RlZmluZQkJRUNDX0VSUl9DTlQoeCwgZSkg KCgoKHgpID4+IChlKS5sb3cpICYgKGUpLmxvd19tYXNrKSBcCj4gKwkJCXwgKCgoeCkgPj4gKGUp LmhpZ2gpICYgKGUpLmhpZ2hfbWFzaykgPDwgKGUpLmxvd19ibikKPiArI2RlZmluZQkJSU5UX0RN QQkJCUJJVCgwKQo+ICsjZGVmaW5lCU5GQ19CQU5LCQkoMHg4MDApCj4gKyNkZWZpbmUJTkZDX0JB TktfU1RFUAkJKDB4MTAwKQo+ICsjZGVmaW5lCQlCQU5LX0RBVEEJCSgweDAwKQo+ICsjZGVmaW5l CQlCQU5LX0FERFIJCSgweDA0KQo+ICsjZGVmaW5lCQlCQU5LX0NNRAkJKDB4MDgpCj4gKyNkZWZp bmUJTkZDX1NSQU0wCQkoMHgxMDAwKQo+ICsjZGVmaW5lCU5GQ19TUkFNMQkJKDB4MTQwMCkKPiAr I2RlZmluZQlORkNfU1JBTV9TSVpFCQkoMHg0MDApCj4gKyNkZWZpbmUJTkZDX1RJTUVPVVQJCSg1 MDAwMDApCj4gKyNkZWZpbmUJTkZDX01BWF9PT0JfUEVSX1NURVAJMTI4Cj4gKyNkZWZpbmUJTkZD X01JTl9PT0JfUEVSX1NURVAJNjQKPiArI2RlZmluZQlNQVhfREFUQV9TSVpFCQkweEZGRkMKPiAr I2RlZmluZQlNQVhfQUREUkVTU19DWUMJCTYKPiArI2RlZmluZQlORkNfRUNDX01BWF9NT0RFUwk0 Cj4gKyNkZWZpbmUJTkZDX01BWF9OU0VMUwkJKDgpIC8qIFNvbWUgU29jcyBvbmx5IGhhdmUgMSBv ciAyIENTcy4gKi8KPiArI2RlZmluZQlORkNfU1lTX0RBVEFfU0laRQkoNCkgLyogNCBieXRlcyBz eXMgZGF0YSBpbiBvb2IgcHJlIDEwMjQgZGF0YS4qLwo+ICsjZGVmaW5lCVJLX0RFRkFVTFRfQ0xP Q0tfUkFURQkoMTUwICogMTAwMCAqIDEwMDApIC8qIDE1MCBNaHogKi8KPiArI2RlZmluZQlBQ0NU SU1JTkcoY3NydywgcndwdywgcndjcykgKChjc3J3KSA8PCAxMiB8IChyd3B3KSA8PCA1IHwgKHJ3 Y3MpKQo+ICsKPiArZW51bSBuZmNfdHlwZSB7Cj4gKwlORkNfVjYsCj4gKwlORkNfVjgsCj4gKwlO RkNfVjksCj4gK307Cj4gKwo+ICsvKioKPiArICogc3RydWN0IHJrX2VjY19jbnRfc3RhdHVzOiBy ZXByZXNlbnQgYSBlY2Mgc3RhdHVzIGRhdGEuCj4gKyAqIEBlcnJfZmxhZ19iaXQ6IGVycm9yIGZs YWcgYml0IGluZGV4IGF0IHJlZ2lzdGVyLgo+ICsgKiBAbG93OiBlY2MgY291bnQgbG93IGJpdCBp bmRleCBhdCByZWdpc3Rlci4KPiArICogQGxvd19tYXNrOiBtYXNrIGJpdC4KPiArICogQGxvd19i bjogZWNjIGNvdW50IGxvdyBiaXQgbnVtYmVyLgo+ICsgKiBAaGlnaDogZWNjIGNvdW50IGhpZ2gg Yml0IGluZGV4IGF0IHJlZ2lzdGVyLgo+ICsgKiBAaGlnaF9tYXNrOiBtYXNrIGJpdAo+ICsgKi8K PiArc3RydWN0IGVjY19jbnRfc3RhdHVzIHsKPiArCXU4IGVycl9mbGFnX2JpdDsKPiArCXU4IGxv dzsKPiArCXU4IGxvd19tYXNrOwo+ICsJdTggbG93X2JuOwo+ICsJdTggaGlnaDsKPiArCXU4IGhp Z2hfbWFzazsKPiArfTsKPiArCj4gKy8qCj4gKyAqIEB0eXBlOiBuZmMgdmVyc2lvbgo+ICsgKiBA ZWNjX3N0cmVuZ3RoczogZWNjIHN0cmVuZ3Rocwo+ICsgKiBAZWNjX2NmZ3M6IGVjYyBjb25maWcg dmFsdWVzCj4gKyAqIEBmbGN0bF9vZmY6IEZMQ1RMIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAYmNo Y3RsX29mZjogQkNIQ1RMIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAZG1hX2RhdGFfYnVmX29mZjog RE1BX0RBVEFfQlVGIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAZG1hX29vYl9idWZfb2ZmOiBETUFf T09CX0JVRiByZWdpc3RlciBvZmZzZXQKPiArICogQGRtYV9jZmdfb2ZmOiBETUFfQ0ZHIHJlZ2lz dGVyIG9mZnNldAo+ICsgKiBAZG1hX3N0X29mZjogRE1BX1NUIHJlZ2lzdGVyIG9mZnNldAo+ICsg KiBAYmNoX3N0X29mZjogQkNHX1NUIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAcmFuZG16X29mZjog UkFORE1aIHJlZ2lzdGVyIG9mZnNldAo+ICsgKiBAaW50X2VuX29mZjogaW50ZXJydXB0IGVuYWJs ZSByZWdpc3RlciBvZmZzZXQKPiArICogQGludF9jbHJfb2ZmOiBpbnRlcnJ1cHQgY2xlYW4gcmVn aXN0ZXIgb2Zmc2V0Cj4gKyAqIEBpbnRfc3Rfb2ZmOiBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVy IG9mZnNldAo+ICsgKiBAb29iMF9vZmY6IG9vYjAgcmVnaXN0ZXIgb2Zmc2V0Cj4gKyAqIEBvb2Ix X29mZjogb29iMSByZWdpc3RlciBvZmZzZXQKPiArICogQGVjYzA6IHJlcHJlc2VudCBFQ0MwIHN0 YXR1cyBkYXRhCj4gKyAqIEBlY2MxOiByZXByZXNlbnQgRUNDMSBzdGF0dXMgZGF0YQo+ICsgKi8K PiArc3RydWN0IG5mY19jZmcgewo+ICsJZW51bSBuZmNfdHlwZSB0eXBlOwo+ICsJdTggZWNjX3N0 cmVuZ3Roc1tORkNfRUNDX01BWF9NT0RFU107Cj4gKwl1MzIgZWNjX2NmZ3NbTkZDX0VDQ19NQVhf TU9ERVNdOwo+ICsJdTMyIGZsY3RsX29mZjsKPiArCXUzMiBiY2hjdGxfb2ZmOwo+ICsJdTMyIGRt YV9jZmdfb2ZmOwo+ICsJdTMyIGRtYV9kYXRhX2J1Zl9vZmY7Cj4gKwl1MzIgZG1hX29vYl9idWZf b2ZmOwo+ICsJdTMyIGRtYV9zdF9vZmY7Cj4gKwl1MzIgYmNoX3N0X29mZjsKPiArCXUzMiByYW5k bXpfb2ZmOwo+ICsJdTMyIGludF9lbl9vZmY7Cj4gKwl1MzIgaW50X2Nscl9vZmY7Cj4gKwl1MzIg aW50X3N0X29mZjsKPiArCXUzMiBvb2IwX29mZjsKPiArCXUzMiBvb2IxX29mZjsKPiArCXN0cnVj dCBlY2NfY250X3N0YXR1cyBlY2MwOwo+ICsJc3RydWN0IGVjY19jbnRfc3RhdHVzIGVjYzE7Cj4g K307Cj4gKwo+ICtzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCB7Cj4gKwlzdHJ1Y3QgbGlzdF9oZWFk IG5vZGU7Cj4gKwlzdHJ1Y3QgbmFuZF9jaGlwIGNoaXA7Cj4gKwo+ICsJdTE2IHNwYXJlX3Blcl9z ZWN0b3I7Cj4gKwl1MTYgb29iX2J1Zl9wZXJfc2VjdG9yOwo+ICsJdTE2IGJvb3RfYmxrczsKPiAr CXUxNiBib290X2VjYzsKPiArCXUxNiBtZXRhZGF0YV9zaXplOwo+ICsKPiArCXU4IG5zZWxzOwo+ ICsJdTggc2Vsc1swXTsKPiArCS8qIE5vdGhpbmcgYWZ0ZXIgdGhpcyBmaWVsZC4gKi8KPiArfTsK PiArCj4gK3N0cnVjdCBya19uZmNfY2xrIHsKPiArCWludCBuZmNfcmF0ZTsKPiArCXN0cnVjdCBj bGsgKm5mY19jbGs7Cj4gKwlzdHJ1Y3QgY2xrICphaGJfY2xrOwoKTm90IHN1cmUgdGhpcyBkZXNl cnZlcyBpdHMgb3duIHN0cnVjdHVyZT8KCj4gK307Cj4gKwo+ICtzdHJ1Y3QgcmtfbmZjIHsKPiAr CXN0cnVjdCBuYW5kX2NvbnRyb2xsZXIgY29udHJvbGxlcjsKPiArCXN0cnVjdCBya19uZmNfY2xr IGNsazsKPiArCj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cj4gKwljb25zdCBzdHJ1Y3QgbmZjX2Nm ZyAqY2ZnOwo+ICsJdm9pZCBfX2lvbWVtICpyZWdzOwo+ICsKPiArCWludCBzZWxlY3RlZF9iYW5r Owo+ICsJaW50IGJhbmRfb2Zmc2V0Owo+ICsKPiArCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7Cj4g KwlzdHJ1Y3QgbGlzdF9oZWFkIGNoaXBzOwo+ICsKPiArCXU4ICpidWZmZXI7Cj4gKwl1OCAqcGFn ZV9idWY7Cj4gKwl1MzIgKm9vYl9idWY7Cj4gKwo+ICsJdW5zaWduZWQgbG9uZyBhc3NpZ25lZF9j czsKPiArfTsKPiArCj4gK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnRv X3JrbmFuZChzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwKQo+ICt7Cj4gKwlyZXR1cm4gY29udGFpbmVy X29mKGNoaXAsIHN0cnVjdCBya19uZmNfbmFuZF9jaGlwLCBjaGlwKTsKPiArfQo+ICsKPiArc3Rh dGljIGlubGluZSB1OCAqZGF0YV9wdHIoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgdTgg KnAsIGludCBpKQoKcmtfbmZjX2J1Zl90b19kYXRhX3B0ciA/Cgo+ICt7Cj4gKwlyZXR1cm4gKHU4 ICopcCArIGkgKiBjaGlwLT5lY2Muc2l6ZTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB1OCAq b29iX3B0cihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgaSkKCnNhbWUgaGVyZQoKPiArewo+ ICsJdTggKnBvaTsKPiArCj4gKwlwb2kgPSBjaGlwLT5vb2JfcG9pICsgaSAqIE5GQ19TWVNfREFU QV9TSVpFOwo+ICsKPiArCXJldHVybiBwb2k7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdTgg Km9vYl9lY2NfcHRyKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGludCBpKQoKc2FtZSBoZXJlCgo+ ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCAqcmtuYW5kID0gdG9fcmtuYW5kKGNoaXAp Owo+ICsJdTggKnBvaTsKPiArCj4gKwlwb2kgPSBjaGlwLT5vb2JfcG9pICsgcmtuYW5kLT5tZXRh ZGF0YV9zaXplICsKPiArCSAgICAgIGNoaXAtPmVjYy5ieXRlcyAqIGk7Cj4gKwo+ICsJcmV0dXJu IHBvaTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSBpbnQgcmtfZGF0YV9sZW4oc3RydWN0IG5h bmRfY2hpcCAqY2hpcCkKClBsZWFzZSBwcmVwZW5kIGFsbCB5b3UgZnVuY3Rpb25zIHdpdGggcmtf bmZjXwoKPiArewo+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHRvX3JrbmFu ZChjaGlwKTsKPiArCj4gKwlyZXR1cm4gY2hpcC0+ZWNjLnNpemUgKyBya25hbmQtPnNwYXJlX3Bl cl9zZWN0b3I7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdTggKnJrX2RhdGFfcHRyKHN0cnVj dCBuYW5kX2NoaXAgKmNoaXAsICBpbnQgaSkKPiArewo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0g bmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsKPiArCXJldHVybiBuZmMtPmJ1ZmZl ciArIGkgKiBya19kYXRhX2xlbihjaGlwKTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB1OCAq cmtfb29iX3B0cihzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgaSkKPiArewo+ICsJc3RydWN0 IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsKPiArCXJl dHVybiBuZmMtPmJ1ZmZlciArIGkgKiBya19kYXRhX2xlbihjaGlwKSArIGNoaXAtPmVjYy5zaXpl Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBya19uZmNfc2VsZWN0X2NoaXAoc3RydWN0IG5hbmRf Y2hpcCAqY2hpcCwgaW50IGNzKQo+ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dl dF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4gKwlzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCAqcmtu YW5kID0gdG9fcmtuYW5kKGNoaXApOwo+ICsJdTMyIHZhbDsKPiArCj4gKwlpZiAoY3MgPCAwKSB7 Cj4gKwkJbmZjLT5zZWxlY3RlZF9iYW5rID0gLTE7Cj4gKwkJLyogRGVzZWxlY3QgdGhlIGN1cnJl bnRseSBzZWxlY3RlZCB0YXJnZXQuICovCj4gKwkJdmFsID0gcmVhZGxfcmVsYXhlZChuZmMtPnJl Z3MgKyBORkNfRk1DVEwpOwo+ICsJCXZhbCAmPSB+Rk1DVExfQ0VfU0VMX007Cj4gKwkJd3JpdGVs KHZhbCwgbmZjLT5yZWdzICsgTkZDX0ZNQ1RMKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJ bmZjLT5zZWxlY3RlZF9iYW5rID0gcmtuYW5kLT5zZWxzW2NzXTsKPiArCW5mYy0+YmFuZF9vZmZz ZXQgPSBORkNfQkFOSyArIG5mYy0+c2VsZWN0ZWRfYmFuayAqIE5GQ19CQU5LX1NURVA7Cj4gKwo+ ICsJdmFsID0gcmVhZGxfcmVsYXhlZChuZmMtPnJlZ3MgKyBORkNfRk1DVEwpOwo+ICsJdmFsICY9 IH5GTUNUTF9DRV9TRUxfTTsKPiArCXZhbCB8PSBGTUNUTF9DRV9TRUwobmZjLT5zZWxlY3RlZF9i YW5rKTsKPiArCj4gKwl3cml0ZWwodmFsLCBuZmMtPnJlZ3MgKyBORkNfRk1DVEwpOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgaW5saW5lIGludCBya19uZmNfd2FpdF9pb3JlYWR5KHN0cnVjdCBya19uZmMg Km5mYykKPiArewo+ICsJaW50IHJjOwo+ICsJdTMyIHZhbDsKPiArCj4gKwlyYyA9IHJlYWRsX3Bv bGxfdGltZW91dF9hdG9taWMobmZjLT5yZWdzICsgTkZDX0ZNQ1RMLCB2YWwsCj4gKwkJCQkgICAg ICAgdmFsICYgRk1DVExfUkRZLCAxMCwgTkZDX1RJTUVPVVQpOwoKRG8geW91IHJlYWxseSBuZWVk IGl0IHRvIGJlIGF0b21pYyA/IC0+ZXhlY19vcCgpIGlzIG5vdCBjYWxsZWQgaW4gYW4KYXRvbWlj IGNvbnRleHQuCgo+ICsKPiArCXJldHVybiByYzsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB1 OCBya19uZmNfcmVhZF9ieXRlKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXApCj4gK3sKPiArCXN0cnVj dCBya19uZmMgKm5mYyA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwKTsKPiArCj4gKwly ZXR1cm4gcmVhZGJfcmVsYXhlZChuZmMtPnJlZ3MgKyBuZmMtPmJhbmRfb2Zmc2V0ICsgQkFOS19E QVRBKTsKCm5vIG5lZWQgZm9yIHRoaXMgaGVscGVyLCBqdXN0IG1vdmUgdGhlIGNvZGUgYmVsb3cu Cgo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBya19uZmNfcmVhZF9idWYoc3RydWN0IG5hbmRfY2hp cCAqY2hpcCwgdTggKmJ1ZiwgaW50IGxlbikKPiArewo+ICsJaW50IGk7Cj4gKwo+ICsJZm9yIChp ID0gMDsgaSA8IGxlbjsgaSsrKQo+ICsJCWJ1ZltpXSA9IHJrX25mY19yZWFkX2J5dGUoY2hpcCk7 CgpFaXRoZXIgeW91IGZpbmQgbW9yZSBwbGFjZXMgd2hlcmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9u LCBvciB5b3UgY2FuCm1vdmUgdGhpcyBjb2RlIGRpcmVjdGx5IHRvIHRoZSB1bmlxdWUgbG9jYXRp b24gd2hlcmUgaXQgaXMgY2FsbGVkLgoKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgcmtfbmZjX3dy aXRlX2J5dGUoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgdTggYnl0ZSkKClNhbWUgaGVyZQoKPiAr ewo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXAp Owo+ICsKPiArCXdyaXRlYihieXRlLCBuZmMtPnJlZ3MgKyBuZmMtPmJhbmRfb2Zmc2V0ICsgQkFO S19EQVRBKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgcmtfbmZjX3dyaXRlX2J1ZihzdHJ1Y3Qg bmFuZF9jaGlwICpjaGlwLCBjb25zdCB1OCAqYnVmLCBpbnQgbGVuKQo+ICt7Cj4gKwlpbnQgaTsK PiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCj4gKwkJcmtfbmZjX3dyaXRlX2J5dGUo Y2hpcCwgYnVmW2ldKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBya19uZmNfY21kKHN0cnVjdCBu YW5kX2NoaXAgKmNoaXAsCj4gKwkJICAgICAgY29uc3Qgc3RydWN0IG5hbmRfc3Vib3AgKnN1Ym9w KQo+ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEo Y2hpcCk7Cj4gKwl1bnNpZ25lZCBpbnQgaSwgaiwgcmVtYWluaW5nLCBzdGFydDsKPiArCWludCBy ZWdfb2Zmc2V0ID0gbmZjLT5iYW5kX29mZnNldDsKPiArCXZvaWQgX19pb21lbSAqZGF0YV9yZWc7 Cj4gKwl1OCAqaW5idWYgPSBOVUxMOwo+ICsJY29uc3QgdTggKm91dGJ1ZjsKPiArCXUzMiBjbnQg PSAwOwo+ICsJaW50IHJldCA9IDA7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IHN1Ym9wLT5uaW5z dHJzOyBpKyspIHsKPiArCQljb25zdCBzdHJ1Y3QgbmFuZF9vcF9pbnN0ciAqaW5zdHIgPSAmc3Vi b3AtPmluc3Ryc1tpXTsKPiArCj4gKwkJc3dpdGNoIChpbnN0ci0+dHlwZSkgewo+ICsJCWNhc2Ug TkFORF9PUF9DTURfSU5TVFI6Cj4gKwkJCXdyaXRlYihpbnN0ci0+Y3R4LmNtZC5vcGNvZGUsCj4g KwkJCSAgICAgICBuZmMtPnJlZ3MgKyByZWdfb2Zmc2V0ICsgQkFOS19DTUQpOwo+ICsJCQlicmVh azsKPiArCj4gKwkJY2FzZSBOQU5EX09QX0FERFJfSU5TVFI6Cj4gKwkJCXJlbWFpbmluZyA9IG5h bmRfc3Vib3BfZ2V0X251bV9hZGRyX2N5YyhzdWJvcCwgaSk7Cj4gKwkJCXN0YXJ0ID0gbmFuZF9z dWJvcF9nZXRfYWRkcl9zdGFydF9vZmYoc3Vib3AsIGkpOwo+ICsKPiArCQkJZm9yIChqID0gMDsg aiA8IDggJiYgaiArIHN0YXJ0IDwgcmVtYWluaW5nOyBqKyspCj4gKwkJCQl3cml0ZWIoaW5zdHIt PmN0eC5hZGRyLmFkZHJzW2ogKyBzdGFydF0sCj4gKwkJCQkgICAgICAgbmZjLT5yZWdzICsgcmVn X29mZnNldCArIEJBTktfQUREUik7Cj4gKwkJCWJyZWFrOwo+ICsKPiArCQljYXNlIE5BTkRfT1Bf REFUQV9JTl9JTlNUUjoKPiArCQljYXNlIE5BTkRfT1BfREFUQV9PVVRfSU5TVFI6Cj4gKwkJCXN0 YXJ0ID0gbmFuZF9zdWJvcF9nZXRfZGF0YV9zdGFydF9vZmYoc3Vib3AsIGkpOwo+ICsJCQljbnQg PSBuYW5kX3N1Ym9wX2dldF9kYXRhX2xlbihzdWJvcCwgaSk7Cj4gKwkJCWRhdGFfcmVnID0gbmZj LT5yZWdzICsgbmZjLT5iYW5kX29mZnNldCArIEJBTktfREFUQTsKPiArCj4gKwkJCWlmIChpbnN0 ci0+dHlwZSA9PSBOQU5EX09QX0RBVEFfT1VUX0lOU1RSKSB7Cj4gKwkJCQlvdXRidWYgPSBpbnN0 ci0+Y3R4LmRhdGEuYnVmLm91dCArIHN0YXJ0Owo+ICsJCQkJZm9yIChqID0gMDsgaiA8IGNudDsg aisrKQo+ICsJCQkJCXdyaXRlYihvdXRidWZbal0sIGRhdGFfcmVnKTsKCldoeSBub3QgY2FsbGlu ZyB0aGUgcmVhZC93cml0ZSBidWYgaGVscGVycyBoZXJlPyBXaGljaCB3b3VsZCBiZSBiZXR0ZXIK bmFtZWQgcmVhZC93cml0ZV9kYXRhIGluc3RlYWQgZHVlIHRvIHRoZSByZWdpc3RlciBuYW1lcyBv ZiB5b3VyIElQLgoKPiArCQkJfSBlbHNlIHsKPiArCQkJCWluYnVmID0gaW5zdHItPmN0eC5kYXRh LmJ1Zi5pbiArIHN0YXJ0Owo+ICsJCQkJZm9yIChqID0gMDsgaiA8IGNudDsgaisrKQo+ICsJCQkJ CWluYnVmW2pdID0gcmVhZGJfcmVsYXhlZChkYXRhX3JlZyk7Cj4gKwkJCX0KPiArCQkJYnJlYWs7 Cj4gKwo+ICsJCWNhc2UgTkFORF9PUF9XQUlUUkRZX0lOU1RSOgo+ICsJCQlpZiAocmtfbmZjX3dh aXRfaW9yZWFkeShuZmMpIDwgMCkgewo+ICsJCQkJcmV0ID0gLUVUSU1FRE9VVDsKPiArCQkJCWRl dl9lcnIobmZjLT5kZXYsICJJTyBub3QgcmVhZHlcbiIpOwo+ICsJCQl9Cj4gKwkJCWJyZWFrOwo+ ICsJCX0KPiArCX0KPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qg c3RydWN0IG5hbmRfb3BfcGFyc2VyIHJrX25mY19vcF9wYXJzZXIgPSBOQU5EX09QX1BBUlNFUigK PiArCU5BTkRfT1BfUEFSU0VSX1BBVFRFUk4oCj4gKwkJcmtfbmZjX2NtZCwKPiArCQlOQU5EX09Q X1BBUlNFUl9QQVRfQ01EX0VMRU0odHJ1ZSksCj4gKwkJTkFORF9PUF9QQVJTRVJfUEFUX0FERFJf RUxFTSh0cnVlLCBNQVhfQUREUkVTU19DWUMpLAo+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9DTURf RUxFTSh0cnVlKSwKPiArCQlOQU5EX09QX1BBUlNFUl9QQVRfV0FJVFJEWV9FTEVNKHRydWUpLAo+ ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9EQVRBX0lOX0VMRU0odHJ1ZSwgTUFYX0RBVEFfU0laRSkp LAo+ICsJTkFORF9PUF9QQVJTRVJfUEFUVEVSTigKPiArCQlya19uZmNfY21kLAo+ICsJCU5BTkRf T1BfUEFSU0VSX1BBVF9DTURfRUxFTSh0cnVlKSwKPiArCQlOQU5EX09QX1BBUlNFUl9QQVRfQURE Ul9FTEVNKHRydWUsIE1BWF9BRERSRVNTX0NZQyksCj4gKwkJTkFORF9PUF9QQVJTRVJfUEFUX0RB VEFfT1VUX0VMRU0odHJ1ZSwgTUFYX0RBVEFfU0laRSksCj4gKwkJTkFORF9PUF9QQVJTRVJfUEFU X0NNRF9FTEVNKHRydWUpLAo+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9XQUlUUkRZX0VMRU0odHJ1 ZSkpLAo+ICspOwo+ICsKPiArc3RhdGljIGludCBya19uZmNfZXhlY19vcChzdHJ1Y3QgbmFuZF9j aGlwICpjaGlwLAo+ICsJCQkgIGNvbnN0IHN0cnVjdCBuYW5kX29wZXJhdGlvbiAqb3AsCj4gKwkJ CSAgYm9vbCBjaGVja19vbmx5KQo+ICt7Cj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwgb3At PmNzKTsKCkRvbid0IHNlbGVjdCB0aGUgZGllIGlmIGNoZWNrX29ubHkgPT0gdHJ1ZQoKPiArCXJl dHVybiBuYW5kX29wX3BhcnNlcl9leGVjX29wKGNoaXAsICZya19uZmNfb3BfcGFyc2VyLCBvcCwK PiArCQkJCSAgICAgIGNoZWNrX29ubHkpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19z ZXR1cF9kYXRhX2ludGVyZmFjZShzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBpbnQgY3NsaW5lLAo+ ICsJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuYW5kX2RhdGFfaW50ZXJmYWNlICpjb25mKQo+ICt7 Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMgPSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEoY2hpcCk7 Cj4gKwljb25zdCBzdHJ1Y3QgbmFuZF9zZHJfdGltaW5ncyAqdGltaW5nczsKPiArCXUzMiByYXRl LCB0YzJydywgdHJ3cHcsIHRydzJjOwo+ICsJdTMyIHRlbXA7Cj4gKwo+ICsJaWYgKGNzbGluZSA9 PSBOQU5EX0RBVEFfSUZBQ0VfQ0hFQ0tfT05MWSkKPiArCQlyZXR1cm4gMDsKPiArCj4gKwlpZiAo IWNoaXAtPnBhcmFtZXRlcnMub25maSkKPiArCQlyZXR1cm4gMDsKCllvdSBtdXN0IGFjY2VwdCBh bGwga2luZCBvZiB0aW1pbmdzIGlmIHRoZXkgZml0IHRoZSBjb250cm9sbGVyCnBvc3NpYmlsaXRp ZXMsIHBsZWFzZSBkcm9wIGl0IG9mZi4gSWYgeW91IGRvbid0IHN1cHBvcnQgYSBnaXZlbgpjb25m aWd1cmF0aW9uLCBqdXN0IGNoZWNrIGl0IGFuZCByZXR1cm4gYW4gZXJyb3Igd2hlbiBDSEVDS19P TkxZIGlzCnVzZWQuCgo+ICsKPiArCXRpbWluZ3MgPSBuYW5kX2dldF9zZHJfdGltaW5ncyhjb25m KTsKPiArCWlmIChJU19FUlIodGltaW5ncykpCj4gKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwo+ICsK PiArCWlmIChJU19FUlIobmZjLT5jbGsubmZjX2NsaykpCj4gKwkJcmF0ZSA9IGNsa19nZXRfcmF0 ZShuZmMtPmNsay5haGJfY2xrKTsKPiArCWVsc2UKPiArCQlyYXRlID0gY2xrX2dldF9yYXRlKG5m Yy0+Y2xrLm5mY19jbGspOwo+ICsKPiArCS8qIFR1cm4gY2xvY2sgcmF0ZSBpbnRvIGtIei4gKi8K PiArCXJhdGUgLz0gMTAwMDsKPiArCj4gKwl0YzJydyA9IDE7Cj4gKwl0cncyYyA9IDE7Cj4gKwo+ ICsJdHJ3cHcgPSBtYXgodGltaW5ncy0+dFdDX21pbiwgdGltaW5ncy0+dFJDX21pbikgLyAxMDAw Owo+ICsJdHJ3cHcgPSBESVZfUk9VTkRfVVAodHJ3cHcgKiByYXRlLCAxMDAwMDAwKTsKPiArCj4g Kwl0ZW1wID0gdGltaW5ncy0+dFJFQV9tYXggLyAxMDAwOwo+ICsJdGVtcCA9IERJVl9ST1VORF9V UCh0ZW1wICogcmF0ZSwgMTAwMDAwMCk7Cj4gKwo+ICsJaWYgKHRyd3B3IDwgdGVtcCkKPiArCQl0 cndwdyA9IHRlbXA7Cj4gKwo+ICsJLyoKPiArCSAqIEFDQ09OOiBhY2Nlc3MgdGltaW5nIGNvbnRy b2wgcmVnaXN0ZXIKPiArCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K PiArCSAqIDMxOjE4OiByZXNlcnZlZAo+ICsJICogMTc6MTI6IGNzcncsIGNsb2NrIGN5Y2xlcyBm cm9tIHRoZSBmYWxsaW5nIGVkZ2Ugb2YgQ1NuIHRvIHRoZQo+ICsJCSBmYWxsaW5nIGVkZ2Ugb2Yg UkRuIG9yIFdSbgoKU3R5bGUgY2hlY2s6ICcqJyB0byBzdGFydCBldmVyeSBjb21tZW50IGxpbmUK Cj4gKwkgKiAxMToxMTogcmVzZXJ2ZWQKPiArCSAqIDEwOjA1OiByd3B3LCB0aGUgd2lkdGggb2Yg UkRuIG9yIFdSbiBpbiBwcm9jZXNzb3IgY2xvY2sgY3ljbGVzCj4gKwkgKiAwNDowMDogcndjcywg Y2xvY2sgY3ljbGVzIGZyb20gdGhlIHJpc2luZyBlZGdlIG9mIFJEbiBvciBXUm4gdG8gdGhlCj4g KwkJIHJpc2luZyBlZGdlIG9mIENTbgo+ICsJICovCj4gKwl0ZW1wID0gQUNDVElNSU5HKHRjMnJ3 LCB0cndwdywgdHJ3MmMpOwo+ICsJd3JpdGVsKHRlbXAsIG5mYy0+cmVncyArIE5GQ19GTVdBSVQp Owo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19od19lY2Nf c2V0dXAoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKPiArCQkJICAgICAgIHN0cnVjdCBuYW5kX2Vj Y19jdHJsICplY2MsCj4gKwkJCSAgICAgICB1aW50MzJfdCBzdHJlbmd0aCkKPiArewo+ICsJc3Ry dWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsJdTMy IHJlZywgaTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgTkZDX0VDQ19NQVhfTU9ERVM7IGkrKykg ewo+ICsJCWlmIChlY2MtPnN0cmVuZ3RoID09IG5mYy0+Y2ZnLT5lY2Nfc3RyZW5ndGhzW2ldKSB7 Cj4gKwkJCXJlZyA9IG5mYy0+Y2ZnLT5lY2NfY2Znc1tpXTsKPiArCQkJYnJlYWs7Cj4gKwkJfQo+ ICsJfQo+ICsKPiArCWlmIChpID49IE5GQ19FQ0NfTUFYX01PREVTKQo+ICsJCXJldHVybiAtRUlO VkFMOwo+ICsKPiArCXdyaXRlbChyZWcsIG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5iY2hjdGxfb2Zm KTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgcmtfbmZjX3hmZXJf c3RhcnQoc3RydWN0IHJrX25mYyAqbmZjLCB1OCBydywgdTggbl9LQiwKPiArCQkJICAgICAgZG1h X2FkZHJfdCBkbWFfZGF0YSwgZG1hX2FkZHJfdCBkbWFfb29iKQo+ICt7Cj4gKwl1MzIgZG1hX3Jl ZywgZmxfcmVnLCBiY2hfcmVnOwo+ICsKPiArCWRtYV9yZWcgPSBETUFfU1QgfCAoKCFydykgPDwg RE1BX1dSKSB8IERNQV9FTiB8ICgyIDw8IERNQV9BSEJfU0laRSkgfAo+ICsJICAgICAgKDcgPDwg RE1BX0JVUlNUX1NJWkUpIHwgKDE2IDw8IERNQV9JTkNfTlVNKTsKPiArCj4gKwlmbF9yZWcgPSAo cncgPDwgRkxDVExfV1IpIHwgRkxDVExfWEZFUl9FTiB8IEZMQ1RMX0FDT1JSRUNUIHwKPiArCQkg KG5fS0IgPDwgRkxDVExfWEZFUl9TRUNUT1IpIHwgRkxDVExfVE9HX0ZJWDsKPiArCj4gKwlpZiAo bmZjLT5jZmctPnR5cGUgPT0gTkZDX1Y2IHx8IG5mYy0+Y2ZnLT50eXBlID09IE5GQ19WOCkgewo+ ICsJCWJjaF9yZWcgPSByZWFkbF9yZWxheGVkKG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5iY2hjdGxf b2ZmKTsKPiArCQliY2hfcmVnID0gKGJjaF9yZWcgJiAofkJDSENUTF9CQU5LX00pKSB8Cj4gKwkJ CSAgKG5mYy0+c2VsZWN0ZWRfYmFuayA8PCBCQ0hDVExfQkFOSyk7Cj4gKwkJd3JpdGVsKGJjaF9y ZWcsIG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5iY2hjdGxfb2ZmKTsKPiArCX0KPiArCj4gKwl3cml0 ZWwoZG1hX3JlZywgbmZjLT5yZWdzICsgbmZjLT5jZmctPmRtYV9jZmdfb2ZmKTsKPiArCXdyaXRl bCgodTMyKWRtYV9kYXRhLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZG1hX2RhdGFfYnVmX29mZik7 Cj4gKwl3cml0ZWwoKHUzMilkbWFfb29iLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZG1hX29vYl9i dWZfb2ZmKTsKPiArCXdyaXRlbChmbF9yZWcsIG5mYy0+cmVncyArIG5mYy0+Y2ZnLT5mbGN0bF9v ZmYpOwo+ICsJZmxfcmVnIHw9IEZMQ1RMX1hGRVJfU1Q7Cj4gKwl3cml0ZWwoZmxfcmVnLCBuZmMt PnJlZ3MgKyBuZmMtPmNmZy0+ZmxjdGxfb2ZmKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBya19u ZmNfd2FpdF9mb3JfeGZlcl9kb25lKHN0cnVjdCBya19uZmMgKm5mYykKPiArewo+ICsJdm9pZCBf X2lvbWVtICpwdHI7Cj4gKwlpbnQgcmV0ID0gMDsKPiArCXUzMiByZWc7Cj4gKwo+ICsJcHRyID0g bmZjLT5yZWdzICsgbmZjLT5jZmctPmZsY3RsX29mZjsKPiArCj4gKwlyZXQgPSByZWFkbF9wb2xs X3RpbWVvdXRfYXRvbWljKHB0ciwgcmVnLAo+ICsJCQkJCXJlZyAmIEZMQ1RMX1hGRVJfUkVBRFks Cj4gKwkJCQkJMTAsIE5GQ19USU1FT1VUKTsKClNhbWUgcXVlc3Rpb24sIGRvIHlvdSBuZWVkIGl0 IHRvIGJlIGF0b21pYz8KCj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGlu dCBya19uZmNfd3JpdGVfcGFnZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hp cCAqY2hpcCwKPiArCQkJICAgICBjb25zdCB1OCAqYnVmLCBpbnQgcGFnZSwgaW50IHJhdykKPiAr ewo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXAp Owo+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHRvX3JrbmFuZChjaGlwKTsK PiArCXN0cnVjdCBuYW5kX2VjY19jdHJsICplY2MgPSAmY2hpcC0+ZWNjOwo+ICsJaW50IG9vYl9z dGVwID0gKGVjYy0+Ynl0ZXMgPiA2MCkgPyBORkNfTUFYX09PQl9QRVJfU1RFUCA6Cj4gKwkJCU5G Q19NSU5fT09CX1BFUl9TVEVQOwo+ICsJaW50IHBhZ2VzX3Blcl9ibGsgPSBtdGQtPmVyYXNlc2l6 ZSAvIG10ZC0+d3JpdGVzaXplOwo+ICsJaW50IHJldCA9IDAsIGksIGJvb3Rfcm9tX21vZGUgPSAw Owo+ICsJZG1hX2FkZHJfdCBkbWFfZGF0YSwgZG1hX29vYjsKPiArCXUzMiByZWc7Cj4gKwl1OCAq b29iOwo+ICsKPiArCW5hbmRfcHJvZ19wYWdlX2JlZ2luX29wKGNoaXAsIHBhZ2UsIDAsIE5VTEws IDApOwo+ICsKPiArCWlmICghcmF3KQoKSSB0aGluayBpdCB3aWxsIGJlIG11Y2ggYmV0dGVyIHRv IGhhdmUgdHdvIHJrX25mY193cml0ZV9wYWdlIGFuZApya19uZmNfd3JpdGVfcGFnZV9yYXcgZGlz dGluY3QgaGVscGVycy4KCj4gKwkJbWVtY3B5KG5mYy0+cGFnZV9idWYsIGJ1ZiwgbXRkLT53cml0 ZXNpemUpOwo+ICsJCW1lbXNldChuZmMtPm9vYl9idWYsIDB4ZmYsIG9vYl9zdGVwICogZWNjLT5z dGVwcyk7CgpZb3UgYXJlIGRpc2NhcmRpbmcgT09CIGRhdGEgaW50ZW50aW9uYWxseSwgdGhpcyBp cyBzdHJhbmdlLgoKPiArCj4gKwkJLyoKPiArCQkgKiBUaGUgZmlyc3QgOChzb21lIGRldmljZXMg YXJlIDQgb3IgMTYpIGJsb2NrcyBhcmUgaW4gdXNlIGJ5CgoiVGhlIGZpcnN0IGJsb2NrcyAoNCwg OCBvciAxNiBkZXBlbmRpbmcgb24gdGhlIGRldmljZSkgYXJlIHVzZWQgYnkuLi4KCj4gKwkJICog dGhlIGJvb3QgUk9NIGFuZCB0aGUgZmlyc3QgMzIgYml0cyBvZiBvb2IgbmVlZCB0byBsaW5rCj4g KwkJICogdG8gdGhlIG5leHQgcGFnZSBhZGRyZXNzIGluIHRoZSBzYW1lIGJsb2NrLgo+ICsJCSAq IENvbmZpZyB0aGUgRUNDIGFsZ29yaXRobSBzdXBwb3J0ZWQgYnkgdGhlIGJvb3QgUk9NLgoKcy9j b25maWcvY29uZmlndXJlLwoKVGhpcyBjb25mbGljdHMgd2l0aCBiYWQgYmxvY2sgbWFya2Vycy4u LgoKPiArCQkgKi8KPiArCQlpZiAocGFnZSA8IHBhZ2VzX3Blcl9ibGsgKiBya25hbmQtPmJvb3Rf YmxrcyAmJgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKQoKPiArCQkgICAgY2hpcC0+b3B0aW9ucyAmIE5BTkRfSVNfQk9PVF9NRURJ VU0pIHsKPiArCQkJYm9vdF9yb21fbW9kZSA9IDE7Cj4gKwkJCWlmIChya25hbmQtPmJvb3RfZWNj ICE9IGVjYy0+c3RyZW5ndGgpCj4gKwkJCQlya19uZmNfaHdfZWNjX3NldHVwKGNoaXAsIGVjYywK PiArCQkJCQkJICAgIHJrbmFuZC0+Ym9vdF9lY2MpOwo+ICsJCX0KPiArCj4gKwkJZm9yIChpID0g MDsgaSA8IGVjYy0+c3RlcHM7IGkrKykgewo+ICsJCQlpZiAoIWkpIHsKPiArCQkJCXJlZyA9IDB4 RkZGRkZGRkY7Cj4gKwkJCX0gZWxzZSB7Cj4gKwkJCQlvb2IgPSBjaGlwLT5vb2JfcG9pICsgKGkg LSAxKSAqIE5GQ19TWVNfREFUQV9TSVpFOwo+ICsJCQkJcmVnID0gb29iWzBdIHwgb29iWzFdIDw8 IDggfCBvb2JbMl0gPDwgMTYgfAo+ICsJCQkJICAgICAgb29iWzNdIDw8IDI0Owo+ICsJCQl9Cj4g KwkJCWlmICghaSAmJiBib290X3JvbV9tb2RlKQo+ICsJCQkJcmVnID0gKHBhZ2UgJiAocGFnZXNf cGVyX2JsayAtIDEpKSAqIDQ7Cj4gKwo+ICsJCQlpZiAobmZjLT5jZmctPnR5cGUgPT0gTkZDX1Y5 KQo+ICsJCQkJbmZjLT5vb2JfYnVmW2ldID0gcmVnOwo+ICsJCQllbHNlCj4gKwkJCQluZmMtPm9v Yl9idWZbaSAqIG9vYl9zdGVwIC8gNF0gPSByZWc7CgpQbGVhc2UgdXNlIGJyYWNrZXRzLgoKPiAr CQl9Cj4gKwo+ICsJCWRtYV9kYXRhID0gZG1hX21hcF9zaW5nbGUobmZjLT5kZXYsICh2b2lkICop bmZjLT5wYWdlX2J1ZiwKCkRvIHlvdSBuZWVkIHRoaXMgY2FzdD8KCj4gKwkJCQkJICBtdGQtPndy aXRlc2l6ZSwgRE1BX1RPX0RFVklDRSk7Cj4gKwkJZG1hX29vYiA9IGRtYV9tYXBfc2luZ2xlKG5m Yy0+ZGV2LCBuZmMtPm9vYl9idWYsCj4gKwkJCQkJIGVjYy0+c3RlcHMgKiBvb2Jfc3RlcCwKPiAr CQkJCQkgRE1BX1RPX0RFVklDRSk7Cj4gKwo+ICsJCXJlaW5pdF9jb21wbGV0aW9uKCZuZmMtPmRv bmUpOwo+ICsJCXdyaXRlbChJTlRfRE1BLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+aW50X2VuX29m Zik7Cj4gKwo+ICsJCXJrX25mY194ZmVyX3N0YXJ0KG5mYywgTkZDX1dSSVRFLCBlY2MtPnN0ZXBz LCBkbWFfZGF0YSwKPiArCQkJCSAgZG1hX29vYik7Cj4gKwkJcmV0ID0gd2FpdF9mb3JfY29tcGxl dGlvbl90aW1lb3V0KCZuZmMtPmRvbmUsCj4gKwkJCQkJCSAgbXNlY3NfdG9famlmZmllcygxMDAp KTsKPiArCQlpZiAoIXJldCkKPiArCQkJZGV2X3dhcm4obmZjLT5kZXYsICJ3cml0ZTogd2FpdCBk bWEgZG9uZSB0aW1lb3V0LlxuIik7Cj4gKwkJLyoKPiArCQkgKiBXaGV0aGVyIHRoZSBETUEgdHJh bnNmZXIgaXMgY29tcGxldGVkIG9yIG5vdC4gVGhlIGRyaXZlcgo+ICsJCSAqIG5lZWRzIHRvIGNo ZWNrIHRoZSBORkNgcyBzdGF0dXMgcmVnaXN0ZXIgdG8gc2VlIGlmIHRoZSBkYXRhCj4gKwkJICog dHJhbnNmZXIgd2FzIGNvbXBsZXRlZC4KPiArCQkgKi8KPiArCQlyZXQgPSBya19uZmNfd2FpdF9m b3JfeGZlcl9kb25lKG5mYyk7Cj4gKwo+ICsJCWRtYV91bm1hcF9zaW5nbGUobmZjLT5kZXYsIGRt YV9kYXRhLCBtdGQtPndyaXRlc2l6ZSwKPiArCQkJCSBETUFfVE9fREVWSUNFKTsKPiArCQlkbWFf dW5tYXBfc2luZ2xlKG5mYy0+ZGV2LCBkbWFfb29iLCBlY2MtPnN0ZXBzICogb29iX3N0ZXAsCj4g KwkJCQkgRE1BX1RPX0RFVklDRSk7Cj4gKwo+ICsJCWlmIChib290X3JvbV9tb2RlICYmIHJrbmFu ZC0+Ym9vdF9lY2MgIT0gZWNjLT5zdHJlbmd0aCkKPiArCQkJcmtfbmZjX2h3X2VjY19zZXR1cChj aGlwLCBlY2MsIGVjYy0+c3RyZW5ndGgpOwo+ICsKPiArCQlpZiAocmV0KSB7Cj4gKwkJCXJldCA9 IC1FSU87Cj4gKwkJCWRldl9lcnIobmZjLT5kZXYsCj4gKwkJCQkid3JpdGU6IHdhaXQgdHJhbnNm ZXIgZG9uZSB0aW1lb3V0LlxuIik7Cj4gKwkJfQo+ICsJfSBlbHNlIHsKPiArCQlya19uZmNfd3Jp dGVfYnVmKGNoaXAsIGJ1ZiwgbXRkLT53cml0ZXNpemUgKyBtdGQtPm9vYnNpemUpOwo+ICsJfQo+ ICsKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwlyZXQgPSBuYW5kX3Byb2df cGFnZV9lbmRfb3AoY2hpcCk7Cj4gKwo+ICsJLyogRGVzZWxlY3QgdGhlIGN1cnJlbnRseSBzZWxl Y3RlZCB0YXJnZXQuICovCj4gKwlya19uZmNfc2VsZWN0X2NoaXAoY2hpcCwgLTEpOwoKTm90IHN1 cmUgdGhpcyBpcyBuZWVkZWQ/Cgo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRp YyBpbnQgcmtfbmZjX3dyaXRlX3BhZ2VfcmF3KHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGNvbnN0 IHU4ICpidWYsCj4gKwkJCQkgaW50IG9vYl9vbiwgaW50IHBhZ2UpCj4gK3sKPiArCXN0cnVjdCBt dGRfaW5mbyAqbXRkID0gbmFuZF90b19tdGQoY2hpcCk7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMg PSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4gKwl1MzIgaTsKPiArCj4gKwltZW1z ZXQobmZjLT5idWZmZXIsIDB4ZmYsIG10ZC0+d3JpdGVzaXplICsgbXRkLT5vb2JzaXplKTsKPiAr Cj4gKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+ZWNjLnN0ZXBzOyBpKyspIHsKPiArCQlpZiAoYnVm KQoKQ2FuIHRoaXMgY29uZGl0aW9uIGJlIHVubWV0IHJlYWxseT8KCj4gKwkJCW1lbWNweShya19k YXRhX3B0cihjaGlwLCBpKSwgZGF0YV9wdHIoY2hpcCwgYnVmLCBpKSwKPiArCQkJICAgICAgIGNo aXAtPmVjYy5zaXplKTsKPiArCj4gKwkJaWYgKCFpKQo+ICsJCQltZW1jcHkocmtfb29iX3B0cihj aGlwLCBpKSwKPiArCQkJICAgICAgIG9vYl9wdHIoY2hpcCwgY2hpcC0+ZWNjLnN0ZXBzIC0gMSks Cj4gKwkJCSAgICAgICBORkNfU1lTX0RBVEFfU0laRSk7CgpXaGF0IGlzIHRoaXM/Cgo+ICsJCWVs c2UKPiArCQkJbWVtY3B5KHJrX29vYl9wdHIoY2hpcCwgaSksIG9vYl9wdHIoY2hpcCwgaSAtIDEp LAo+ICsJCQkgICAgICAgTkZDX1NZU19EQVRBX1NJWkUpOwo+ICsKPiArCQltZW1jcHkocmtfb29i X3B0cihjaGlwLCBpKSArIE5GQ19TWVNfREFUQV9TSVpFLAo+ICsJCSAgICAgICBvb2JfZWNjX3B0 cihjaGlwLCBpKSwKPiArCQkgICAgICAgY2hpcC0+ZWNjLmJ5dGVzKTsKPiArCX0KPiArCj4gKwly ZXR1cm4gcmtfbmZjX3dyaXRlX3BhZ2UobXRkLCBjaGlwLCBuZmMtPmJ1ZmZlciwgcGFnZSwgMSk7 Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX3dyaXRlX29vYl9zdGQoc3RydWN0IG5hbmRf Y2hpcCAqY2hpcCwgaW50IHBhZ2UpCj4gK3sKPiArCXJldHVybiBya19uZmNfd3JpdGVfcGFnZV9y YXcoY2hpcCwgTlVMTCwgMSwgcGFnZSk7Cj4gK30KCldoYXQgaXMgdGhlIHB1cnBvc2Ugb2YgdGhp cyBpbmRpcmVjdGlvbj8gUGxlYXNlIGdldCByaWQgb2YgaXQuCgo+ICsKPiArc3RhdGljIGludCBy a19uZmNfcmVhZF9wYWdlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpj aGlwLAo+ICsJCQkgICAgdTMyIGRhdGFfb2ZmcywgdTMyIHJlYWRsZW4sCj4gKwkJCSAgICB1OCAq YnVmLCBpbnQgcGFnZSwgaW50IHJhdykKPiArewo+ICsJc3RydWN0IHJrX25mYyAqbmZjID0gbmFu ZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAg KnJrbmFuZCA9IHRvX3JrbmFuZChjaGlwKTsKPiArCXN0cnVjdCBuYW5kX2VjY19jdHJsICplY2Mg PSAmY2hpcC0+ZWNjOwo+ICsJaW50IG9vYl9zdGVwID0gKGVjYy0+Ynl0ZXMgPiA2MCkgPyBORkNf TUFYX09PQl9QRVJfU1RFUCA6Cj4gKwkJCU5GQ19NSU5fT09CX1BFUl9TVEVQOwo+ICsJaW50IHBh Z2VzX3Blcl9ibGsgPSBtdGQtPmVyYXNlc2l6ZSAvIG10ZC0+d3JpdGVzaXplOwo+ICsJZG1hX2Fk ZHJfdCBkbWFfZGF0YSwgZG1hX29vYjsKPiArCWludCByZXQgPSAwLCBpLCBib290X3JvbV9tb2Rl ID0gMDsKPiArCWludCBiaXRmbGlwcyA9IDAsIGJjaF9zdDsKPiArCXU4ICpvb2I7Cj4gKwl1MzIg dG1wOwo+ICsKPiArCW5hbmRfcmVhZF9wYWdlX29wKGNoaXAsIHBhZ2UsIDAsIE5VTEwsIDApOwo+ ICsJaWYgKCFyYXcpIHsKClNhbWUgY29tbWVudCwgcGxlYXNlIHdyaXRlIHR3byBoZWxwZXJzLgoK PiArCQlkbWFfZGF0YSA9IGRtYV9tYXBfc2luZ2xlKG5mYy0+ZGV2LCBuZmMtPnBhZ2VfYnVmLAo+ ICsJCQkJCSAgbXRkLT53cml0ZXNpemUsCj4gKwkJCQkJICBETUFfRlJPTV9ERVZJQ0UpOwo+ICsJ CWRtYV9vb2IgPSBkbWFfbWFwX3NpbmdsZShuZmMtPmRldiwgbmZjLT5vb2JfYnVmLAo+ICsJCQkJ CSBlY2MtPnN0ZXBzICogb29iX3N0ZXAsCj4gKwkJCQkJIERNQV9GUk9NX0RFVklDRSk7Cj4gKwo+ ICsJCS8qCj4gKwkJICogVGhlIGZpcnN0IDgoc29tZSBkZXZpY2VzIGFyZSA0IG9yIDE2KSBibG9j a3MgYXJlIGluIHVzZSBieQoKU2FtZSByZXdvcmRpbmcKCj4gKwkJICogdGhlIGJvb3QgUk9NLgo+ ICsJCSAqIENvbmZpZyB0aGUgRUNDIGFsZ29yaXRobSBzdXBwb3J0ZWQgYnkgdGhlIGJvb3QgUk9N Lgo+ICsJCSAqLwo+ICsJCWlmIChwYWdlIDwgcGFnZXNfcGVyX2JsayAqIHJrbmFuZC0+Ym9vdF9i bGtzICYmCj4gKwkJICAgIGNoaXAtPm9wdGlvbnMgJiBOQU5EX0lTX0JPT1RfTUVESVVNKSB7Cj4g KwkJCWJvb3Rfcm9tX21vZGUgPSAxOwo+ICsJCQlpZiAocmtuYW5kLT5ib290X2VjYyAhPSBlY2Mt PnN0cmVuZ3RoKQo+ICsJCQkJcmtfbmZjX2h3X2VjY19zZXR1cChjaGlwLCBlY2MsCj4gKwkJCQkJ CSAgICBya25hbmQtPmJvb3RfZWNjKTsKPiArCQl9Cj4gKwo+ICsJCXJlaW5pdF9jb21wbGV0aW9u KCZuZmMtPmRvbmUpOwo+ICsJCXdyaXRlbChJTlRfRE1BLCBuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ aW50X2VuX29mZik7Cj4gKwkJcmtfbmZjX3hmZXJfc3RhcnQobmZjLCBORkNfUkVBRCwgZWNjLT5z dGVwcywgZG1hX2RhdGEsCj4gKwkJCQkgIGRtYV9vb2IpOwo+ICsJCXJldCA9IHdhaXRfZm9yX2Nv bXBsZXRpb25fdGltZW91dCgmbmZjLT5kb25lLAo+ICsJCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMo MTAwKSk7Cj4gKwkJaWYgKCFyZXQpCj4gKwkJCWRldl93YXJuKG5mYy0+ZGV2LCAicmVhZDogd2Fp dCBkbWEgZG9uZSB0aW1lb3V0LlxuIik7Cj4gKwkJLyoKPiArCQkgKiBXaGV0aGVyIHRoZSBETUEg dHJhbnNmZXIgaXMgY29tcGxldGVkIG9yIG5vdC4gVGhlIGRyaXZlcgo+ICsJCSAqIG5lZWRzIHRv IGNoZWNrIHRoZSBORkNgcyBzdGF0dXMgcmVnaXN0ZXIgdG8gc2VlIGlmIHRoZSBkYXRhCj4gKwkJ ICogdHJhbnNmZXIgd2FzIGNvbXBsZXRlZC4KPiArCQkgKi8KPiArCQlyZXQgPSBya19uZmNfd2Fp dF9mb3JfeGZlcl9kb25lKG5mYyk7Cj4gKwkJZG1hX3VubWFwX3NpbmdsZShuZmMtPmRldiwgZG1h X2RhdGEsIG10ZC0+d3JpdGVzaXplLAo+ICsJCQkJIERNQV9GUk9NX0RFVklDRSk7Cj4gKwkJZG1h X3VubWFwX3NpbmdsZShuZmMtPmRldiwgZG1hX29vYiwgZWNjLT5zdGVwcyAqIG9vYl9zdGVwLAo+ ICsJCQkJIERNQV9GUk9NX0RFVklDRSk7Cj4gKwo+ICsJCWlmIChyZXQpIHsKPiArCQkJYml0Zmxp cHMgPSAtRUlPOwo+ICsJCQlkZXZfZXJyKG5mYy0+ZGV2LAo+ICsJCQkJInJlYWQ6IHdhaXQgdHJh bnNmZXIgZG9uZSB0aW1lb3V0LlxuIik7Cj4gKwkJCWdvdG8gb3V0Owo+ICsJCX0KPiArCj4gKwkJ Zm9yIChpID0gMTsgaSA8IGVjYy0+c3RlcHM7IGkrKykgewo+ICsJCQlvb2IgPSBjaGlwLT5vb2Jf cG9pICsgKGkgLSAxKSAqIE5GQ19TWVNfREFUQV9TSVpFOwo+ICsJCQlpZiAobmZjLT5jZmctPnR5 cGUgPT0gTkZDX1Y5KQo+ICsJCQkJdG1wID0gbmZjLT5vb2JfYnVmW2ldOwo+ICsJCQllbHNlCj4g KwkJCQl0bXAgPSBuZmMtPm9vYl9idWZbaSAqIG9vYl9zdGVwIC8gNF07Cj4gKwkJCSpvb2IrKyA9 ICh1OCl0bXA7Cj4gKwkJCSpvb2IrKyA9ICh1OCkodG1wID4+IDgpOwo+ICsJCQkqb29iKysgPSAo dTgpKHRtcCA+PiAxNik7Cj4gKwkJCSpvb2IrKyA9ICh1OCkodG1wID4+IDI0KTsKPiArCQl9Cj4g Kwo+ICsJCWZvciAoaSA9IDA7IGkgPCBlY2MtPnN0ZXBzIC8gMjsgaSsrKSB7CgpCcmFja2V0cyBo ZXJlIGFzIHdlbGwgcGxlYXNlCgo+ICsJCQliY2hfc3QgPSByZWFkbF9yZWxheGVkKG5mYy0+cmVn cyArCj4gKwkJCQkJICAgICAgIG5mYy0+Y2ZnLT5iY2hfc3Rfb2ZmICsgaSAqIDQpOwo+ICsJCQlp ZiAoYmNoX3N0ICYgQklUKG5mYy0+Y2ZnLT5lY2MwLmVycl9mbGFnX2JpdCkgfHwKPiArCQkJICAg IGJjaF9zdCAmIEJJVChuZmMtPmNmZy0+ZWNjMS5lcnJfZmxhZ19iaXQpKSB7Cj4gKwkJCQltdGQt PmVjY19zdGF0cy5mYWlsZWQrKzsKPiArCQkJCWJpdGZsaXBzID0gLTE7CgpJIHRoaW5rIHlvdSBz aG91bGQgcmV0dXJuIDAuCgpUaGVuIHRoZSB1cHBlciBsYXllciB3aWxsIGNoZWNrIGZvciBmYWls dXJlcy4KCj4gKwkJCX0gZWxzZSB7Cj4gKwkJCQlyZXQgPSBFQ0NfRVJSX0NOVChiY2hfc3QsIG5m Yy0+Y2ZnLT5lY2MwKTsKPiArCQkJCW10ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCArPSByZXQ7Cj4g KwkJCQliaXRmbGlwcyA9IG1heF90KHUzMiwgYml0ZmxpcHMsIHJldCk7Cj4gKwo+ICsJCQkJcmV0 ID0gRUNDX0VSUl9DTlQoYmNoX3N0LCBuZmMtPmNmZy0+ZWNjMSk7Cj4gKwkJCQltdGQtPmVjY19z dGF0cy5jb3JyZWN0ZWQgKz0gcmV0Owo+ICsJCQkJYml0ZmxpcHMgPSBtYXhfdCh1MzIsIGJpdGZs aXBzLCByZXQpOwo+ICsJCQl9Cj4gKwkJfQo+ICtvdXQ6Cj4gKwkJbWVtY3B5KGJ1ZiwgbmZjLT5w YWdlX2J1ZiwgbXRkLT53cml0ZXNpemUpOwo+ICsKPiArCQlpZiAoYm9vdF9yb21fbW9kZSAmJiBy a25hbmQtPmJvb3RfZWNjICE9IGVjYy0+c3RyZW5ndGgpCj4gKwkJCXJrX25mY19od19lY2Nfc2V0 dXAoY2hpcCwgZWNjLCBlY2MtPnN0cmVuZ3RoKTsKPiArCj4gKwkJaWYgKGJpdGZsaXBzIDwgMCkK PiArCQkJZGV2X2VycihuZmMtPmRldiwgInJlYWQgcGFnZTogJXggZWNjIGVycm9yIVxuIiwgcGFn ZSk7Cj4gKwl9IGVsc2Ugewo+ICsJCXJrX25mY19yZWFkX2J1ZihjaGlwLCBidWYsIG10ZC0+d3Jp dGVzaXplICsgbXRkLT5vb2JzaXplKTsKPiArCX0KPiArCS8qIERlc2VsZWN0IHRoZSBjdXJyZW50 bHkgc2VsZWN0ZWQgdGFyZ2V0LiAqLwo+ICsJcmtfbmZjX3NlbGVjdF9jaGlwKGNoaXAsIC0xKTsK PiArCj4gKwlyZXR1cm4gYml0ZmxpcHM7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX3dy aXRlX3BhZ2VfaHdlY2Moc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgY29uc3QgdTggKmJ1ZiwKPiAr CQkJCSAgIGludCBvb2Jfb24sIGludCBwYWdlKQo+ICt7Cj4gKwlyZXR1cm4gcmtfbmZjX3dyaXRl X3BhZ2UobmFuZF90b19tdGQoY2hpcCksIGNoaXAsIGJ1ZiwgcGFnZSwgMCk7Cj4gK30KPiArCj4g K3N0YXRpYyBpbnQgcmtfbmZjX3JlYWRfcGFnZV9od2VjYyhzdHJ1Y3QgbmFuZF9jaGlwICpjaGlw LCB1OCAqcCwgaW50IG9vYl9vbiwKPiArCQkJCSAgaW50IHBnKQo+ICt7Cj4gKwlzdHJ1Y3QgbXRk X2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+ICsKPiArCXJldHVybiBya19uZmNfcmVh ZF9wYWdlKG10ZCwgY2hpcCwgMCwgbXRkLT53cml0ZXNpemUsIHAsIHBnLCAwKTsKPiArfQo+ICsK PiArc3RhdGljIGludCBya19uZmNfcmVhZF9wYWdlX3JhdyhzdHJ1Y3QgbmFuZF9jaGlwICpjaGlw LCB1OCAqYnVmLCBpbnQgb29iX29uLAo+ICsJCQkJaW50IHBhZ2UpCj4gK3sKPiArCXN0cnVjdCBt dGRfaW5mbyAqbXRkID0gbmFuZF90b19tdGQoY2hpcCk7Cj4gKwlzdHJ1Y3QgcmtfbmZjICpuZmMg PSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEoY2hpcCk7Cj4gKwlpbnQgaSwgcmV0Owo+ICsKPiAr CXJldCA9IHJrX25mY19yZWFkX3BhZ2UobXRkLCBjaGlwLCAwLCBtdGQtPndyaXRlc2l6ZSwgbmZj LT5idWZmZXIsCj4gKwkJCSAgICAgICBwYWdlLCAxKTsKPiArCWlmIChyZXQgPCAwKQo+ICsJCXJl dHVybiByZXQ7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IGNoaXAtPmVjYy5zdGVwczsgaSsrKSB7 Cj4gKwkJaWYgKCFpKQo+ICsJCQltZW1jcHkob29iX3B0cihjaGlwLCBjaGlwLT5lY2Muc3RlcHMg LSAxKSwKPiArCQkJICAgICAgIHJrX29vYl9wdHIoY2hpcCwgaSksCj4gKwkJCSAgICAgICBORkNf U1lTX0RBVEFfU0laRSk7Cj4gKwkJZWxzZQo+ICsJCQltZW1jcHkob29iX3B0cihjaGlwLCBpIC0g MSksIHJrX29vYl9wdHIoY2hpcCwgaSksCj4gKwkJCSAgICAgICBORkNfU1lTX0RBVEFfU0laRSk7 Cj4gKwo+ICsJCW1lbWNweShvb2JfZWNjX3B0cihjaGlwLCBpKSwKPiArCQkgICAgICAgcmtfb29i X3B0cihjaGlwLCBpKSArIE5GQ19TWVNfREFUQV9TSVpFLAo+ICsJCSAgICAgICBjaGlwLT5lY2Mu Ynl0ZXMpOwo+ICsKPiArCQlpZiAoYnVmKQo+ICsJCQltZW1jcHkoZGF0YV9wdHIoY2hpcCwgYnVm LCBpKSwgcmtfZGF0YV9wdHIoY2hpcCwgaSksCj4gKwkJCSAgICAgICBjaGlwLT5lY2Muc2l6ZSk7 Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBya19uZmNf cmVhZF9vb2Jfc3RkKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIGludCBwYWdlKQo+ICt7Cj4gKwly ZXR1cm4gcmtfbmZjX3JlYWRfcGFnZV9yYXcoY2hpcCwgTlVMTCwgMSwgcGFnZSk7Cj4gK30KPiAr Cj4gK3N0YXRpYyBpbmxpbmUgdm9pZCBya19uZmNfaHdfaW5pdChzdHJ1Y3QgcmtfbmZjICpuZmMp Cj4gK3sKPiArCS8qIERpc2FibGUgZmxhc2ggd3AuICovCj4gKwl3cml0ZWwoRk1DVExfV1AsIG5m Yy0+cmVncyArIE5GQ19GTUNUTCk7Cj4gKwkvKiBDb25maWcgZGVmYXVsdCB0aW1pbmcgNDBucyBh dCAxNTAgTWh6IG5mYyBjbG9jay4gKi8KPiArCXdyaXRlbCgweDEwODEsIG5mYy0+cmVncyArIE5G Q19GTVdBSVQpOwo+ICsJLyogRGlzYWJsZSByYW5kb21pemVyIGFuZCBETUEuICovCj4gKwl3cml0 ZWwoMCwgbmZjLT5yZWdzICsgbmZjLT5jZmctPnJhbmRtel9vZmYpOwo+ICsJd3JpdGVsKDAsIG5m Yy0+cmVncyArIG5mYy0+Y2ZnLT5kbWFfY2ZnX29mZik7Cj4gKwl3cml0ZWwoRkxDVExfUlNULCBu ZmMtPnJlZ3MgKyBuZmMtPmNmZy0+ZmxjdGxfb2ZmKTsKPiArfQo+ICsKPiArc3RhdGljIGlycXJl dHVybl90IHJrX25mY19pcnEoaW50IGlycSwgdm9pZCAqaWQpCj4gK3sKPiArCXN0cnVjdCBya19u ZmMgKm5mYyA9IGlkOwo+ICsJdTMyIHN0YSwgaWVuOwo+ICsKPiArCXN0YSA9IHJlYWRsX3JlbGF4 ZWQobmZjLT5yZWdzICsgbmZjLT5jZmctPmludF9zdF9vZmYpOwo+ICsJaWVuID0gcmVhZGxfcmVs YXhlZChuZmMtPnJlZ3MgKyBuZmMtPmNmZy0+aW50X2VuX29mZik7Cj4gKwo+ICsJaWYgKCEoc3Rh ICYgaWVuKSkKPiArCQlyZXR1cm4gSVJRX05PTkU7Cj4gKwo+ICsJd3JpdGVsKHN0YSwgbmZjLT5y ZWdzICsgbmZjLT5jZmctPmludF9jbHJfb2ZmKTsKPiArCXdyaXRlbCh+c3RhICYgaWVuLCBuZmMt PnJlZ3MgKyBuZmMtPmNmZy0+aW50X2VuX29mZik7Cj4gKwo+ICsJY29tcGxldGUoJm5mYy0+ZG9u ZSk7Cj4gKwo+ICsJcmV0dXJuIElSUV9IQU5ETEVEOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJr X25mY19lbmFibGVfY2xrKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJrX25mY19jbGsgKmNs aykKCl9jbGtzIHdpdGggYW4gcyB0byBpbmZvcm0gdGhhdCB0aGVyZSBhcmUgc2V2ZXJhbCBvZiB0 aGVtPwoKPiArewo+ICsJaW50IHJldDsKPiArCj4gKwlpZiAoIUlTX0VSUihjbGstPm5mY19jbGsp KSB7Cj4gKwkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGNsay0+bmZjX2Nsayk7Cj4gKwkJaWYg KHJldCkgewo+ICsJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBlbmFibGUgbmZjIGNsa1xuIik7 Cj4gKwkJCXJldHVybiByZXQ7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldCA9IGNsa19wcmVwYXJl X2VuYWJsZShjbGstPmFoYl9jbGspOwo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIoZGV2LCAi ZmFpbGVkIHRvIGVuYWJsZSBhaGIgY2xrXG4iKTsKPiArCQlpZiAoIUlTX0VSUihjbGstPm5mY19j bGspKQo+ICsJCQljbGtfZGlzYWJsZV91bnByZXBhcmUoY2xrLT5uZmNfY2xrKTsKPiArCQlyZXR1 cm4gcmV0Owo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBy a19uZmNfZGlzYWJsZV9jbGsoc3RydWN0IHJrX25mY19jbGsgKmNsaykKCmRpdHRvCgo+ICt7Cj4g KwlpZiAoIUlTX0VSUihjbGstPm5mY19jbGspKQo+ICsJCWNsa19kaXNhYmxlX3VucHJlcGFyZShj bGstPm5mY19jbGspOwo+ICsJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNsay0+YWhiX2Nsayk7Cj4g K30KPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX29vYmxheW91dF9mcmVlKHN0cnVjdCBtdGRfaW5m byAqbXRkLCBpbnQgc2VjdGlvbiwKPiArCQkJCSBzdHJ1Y3QgbXRkX29vYl9yZWdpb24gKm9vYl9y ZWdpb24pCj4gK3sKPiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGRfdG9fbmFuZChtdGQp Owo+ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHRvX3JrbmFuZChjaGlwKTsK PiArCj4gKwlpZiAoc2VjdGlvbikKPiArCQlyZXR1cm4gLUVSQU5HRTsKPiArCj4gKwkvKgo+ICsJ ICogVGhlIGJlZ2lubmluZyBvZiB0aGUgb29iIGFyZWEgc3RvcmVzIHRoZSByZXNlcnZlZCBkYXRh IGZvciB0aGUgTkZDLAo+ICsJICogdGhlIHNpemUgb2YgdGhlIHJlc2VydmVkIGRhdGEgaXMgTkZD X1NZU19EQVRBX1NJWkUgYnl0ZXMuCj4gKwkgKi8KPiArCW9vYl9yZWdpb24tPmxlbmd0aCA9IHJr bmFuZC0+bWV0YWRhdGFfc2l6ZSAtIE5GQ19TWVNfREFUQV9TSVpFIC0gMjsKPiArCW9vYl9yZWdp b24tPm9mZnNldCA9IE5GQ19TWVNfREFUQV9TSVpFICsgMjsKPiArCj4gKwlyZXR1cm4gMDsKPiAr fQo+ICsKPiArc3RhdGljIGludCBya19uZmNfb29ibGF5b3V0X2VjYyhzdHJ1Y3QgbXRkX2luZm8g Km10ZCwgaW50IHNlY3Rpb24sCj4gKwkJCQlzdHJ1Y3QgbXRkX29vYl9yZWdpb24gKm9vYl9yZWdp b24pCj4gK3sKPiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGRfdG9fbmFuZChtdGQpOwo+ ICsJc3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHRvX3JrbmFuZChjaGlwKTsKPiAr Cj4gKwlpZiAoc2VjdGlvbikKPiArCQlyZXR1cm4gLUVSQU5HRTsKPiArCj4gKwlvb2JfcmVnaW9u LT5vZmZzZXQgPSBya25hbmQtPm1ldGFkYXRhX3NpemU7Cj4gKwlvb2JfcmVnaW9uLT5sZW5ndGgg PSBtdGQtPm9vYnNpemUgLSBvb2JfcmVnaW9uLT5vZmZzZXQ7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4g K30KPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRkX29vYmxheW91dF9vcHMgcmtfbmZjX29v YmxheW91dF9vcHMgPSB7Cj4gKwkuZnJlZSA9IHJrX25mY19vb2JsYXlvdXRfZnJlZSwKPiArCS5l Y2MgPSBya19uZmNfb29ibGF5b3V0X2VjYywKPiArfTsKPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZj X2VjY19pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IG10ZF9pbmZvICptdGQpCj4gK3sK PiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGRfdG9fbmFuZChtdGQpOwo+ICsJc3RydWN0 IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsJc3RydWN0 IG5hbmRfZWNjX2N0cmwgKmVjYyA9ICZjaGlwLT5lY2M7Cj4gKwljb25zdCB1OCAqc3RyZW5ndGhz ID0gbmZjLT5jZmctPmVjY19zdHJlbmd0aHM7Cj4gKwl1OCBtYXhfc3RyZW5ndGgsIG5mY19tYXhf c3RyZW5ndGg7Cj4gKwlpbnQgaTsKPiArCj4gKwluZmNfbWF4X3N0cmVuZ3RoID0gbmZjLT5jZmct PmVjY19zdHJlbmd0aHNbMF07Cj4gKwkvKiBJZiBvcHRpb25hbCBkdCBzZXR0aW5ncyBub3QgcHJl c2VudC4gKi8KPiArCWlmICghZWNjLT5zaXplIHx8ICFlY2MtPnN0cmVuZ3RoIHx8Cj4gKwkgICAg ZWNjLT5zdHJlbmd0aCA+IG5mY19tYXhfc3RyZW5ndGgpIHsKPiArCQkvKiBVc2UgZGF0YXNoZWV0 IHJlcXVpcmVtZW50cy4gKi8KPiArCQllY2MtPnN0cmVuZ3RoID0gY2hpcC0+YmFzZS5lY2NyZXEu c3RyZW5ndGg7Cj4gKwkJZWNjLT5zaXplID0gY2hpcC0+YmFzZS5lY2NyZXEuc3RlcF9zaXplOwo+ ICsKPiArCQkvKiBBbGlnbiBFQ0Mgc3RyZW5ndGggYW5kIEVDQyBzaXplLiAqLwo+ICsJCWlmIChj aGlwLT5lY2Muc2l6ZSA8IDEwMjQpIHsKPiArCQkJaWYgKG10ZC0+d3JpdGVzaXplID4gNTEyKSB7 Cj4gKwkJCQljaGlwLT5lY2Muc2l6ZSA9IDEwMjQ7Cj4gKwkJCQljaGlwLT5lY2Muc3RyZW5ndGgg PDw9IDE7Cj4gKwkJCX0gZWxzZSB7Cj4gKwkJCQlkZXZfZXJyKGRldiwgIlVuc3VwcG9ydGVkIGVj Yy5zaXplXG4iKTsKPiArCQkJCXJldHVybiAtRUlOVkFMOwo+ICsJCQl9Cj4gKwkJfSBlbHNlIHsK PiArCQkJY2hpcC0+ZWNjLnNpemUgPSAxMDI0Owo+ICsJCX0KPiArCj4gKwkJZWNjLT5zdGVwcyA9 IG10ZC0+d3JpdGVzaXplIC8gZWNjLT5zaXplOwo+ICsKPiArCQkvKgo+ICsJCSAqIEhXIEVDQyBh bHdheXMgcmVxdWVzdHMgdGhlIG51bWJlciBvZiBFQ0MgYnl0ZXMgcGVyIDEwMjQgYnl0ZQo+ICsJ CSAqIGJsb2Nrcy4gNCBCeXRlcyBpcyBvb2IgZm9yIHN5cyBkYXRhLgo+ICsJCSAqLwo+ICsJCW1h eF9zdHJlbmd0aCA9ICgobXRkLT5vb2JzaXplIC8gZWNjLT5zdGVwcykgLSA0KSAqIDggLwo+ICsJ CQkJIGZscyg4ICogMTAyNCk7Cj4gKwkJaWYgKG1heF9zdHJlbmd0aCA+IG5mY19tYXhfc3RyZW5n dGgpCj4gKwkJCW1heF9zdHJlbmd0aCA9IG5mY19tYXhfc3RyZW5ndGg7Cj4gKwo+ICsJCWZvciAo aSA9IDA7IGkgPCA0OyBpKyspIHsKPiArCQkJaWYgKG1heF9zdHJlbmd0aCA+PSBzdHJlbmd0aHNb aV0pCj4gKwkJCQlicmVhazsKPiArCQl9Cj4gKwo+ICsJCWlmIChpID49IDQpIHsKPiArCQkJZGV2 X2VycihuZmMtPmRldiwgIlVuc3VwcG9ydGVkIEVDQyBzdHJlbmd0aFxuIik7Cj4gKwkJCXJldHVy biAtRU9QTk9UU1VQUDsKPiArCQl9Cj4gKwo+ICsJCWVjYy0+c3RyZW5ndGggPSBzdHJlbmd0aHNb aV07Cj4gKwl9Cj4gKwllY2MtPnN0ZXBzID0gbXRkLT53cml0ZXNpemUgLyBlY2MtPnNpemU7Cj4g KwllY2MtPmJ5dGVzID0gRElWX1JPVU5EX1VQKGVjYy0+c3RyZW5ndGggKiBmbHMoOCAqIDEwMjQp LCA4KTsKPiArCS8qIEhXIEVDQyBhbHdheXMgd29yayB3aXRoIGV2ZW4gbnVtYmVycyBvZiBFQ0Mg Ynl0ZXMuICovCj4gKwllY2MtPmJ5dGVzID0gQUxJR04oZWNjLT5ieXRlcywgMik7Cj4gKwo+ICsJ cmtfbmZjX2h3X2VjY19zZXR1cChjaGlwLCBlY2MsIGVjYy0+c3RyZW5ndGgpOwo+ICsKPiArCXJl dHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19hdHRhY2hfY2hpcChzdHJ1Y3Qg bmFuZF9jaGlwICpjaGlwKQo+ICt7Cj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9f bXRkKGNoaXApOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gbXRkLT5kZXYucGFyZW50Owo+ICsJ c3RydWN0IHJrX25mYyAqbmZjID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKGNoaXApOwo+ICsJ c3RydWN0IHJrX25mY19uYW5kX2NoaXAgKnJrbmFuZCA9IHRvX3JrbmFuZChjaGlwKTsKPiArCXN0 cnVjdCBuYW5kX2VjY19jdHJsICplY2MgPSAmY2hpcC0+ZWNjOwo+ICsJaW50IGxlbjsKPiArCWlu dCByZXQ7Cj4gKwo+ICsJaWYgKGNoaXAtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KSB7Cj4g KwkJZGV2X2VycihkZXYsICIxNiBiaXRzIGJ1cyB3aWR0aCBub3Qgc3VwcG9ydGVkIik7Cj4gKwkJ cmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJaWYgKGVjYy0+bW9kZSAhPSBOQU5EX0VDQ19I VykKPiArCQlyZXR1cm4gMDsKPiArCj4gKwlyZXQgPSBya19uZmNfZWNjX2luaXQoZGV2LCBtdGQp Owo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4gcmV0Owo+ICsJcmtuYW5kLT5zcGFyZV9wZXJfc2Vj dG9yID0gZWNjLT5ieXRlcyArIE5GQ19TWVNfREFUQV9TSVpFOwo+ICsJcmtuYW5kLT5tZXRhZGF0 YV9zaXplID0gTkZDX1NZU19EQVRBX1NJWkUgKiBlY2MtPnN0ZXBzOwo+ICsKPiArCWlmIChya25h bmQtPm1ldGFkYXRhX3NpemUgPCBORkNfU1lTX0RBVEFfU0laRSArIDIpIHsKPiArCQlkZXZfZXJy KGRldiwKPiArCQkJIkRyaXZlciBuZWVkcyBhdCBsZWFzdCAlZCBieXRlcyBvZiBtZXRhIGRhdGFc biIsCj4gKwkJCU5GQ19TWVNfREFUQV9TSVpFICsgMik7Cj4gKwkJcmV0dXJuIC1FSU87Cj4gKwl9 Cj4gKwkvKiBDaGVjayBidWZmZXIgZmlyc3QsIGF2b2lkIGR1cGxpY2F0ZSBhbGxvYyBidWZmZXIu ICovCj4gKwlpZiAobmZjLT5idWZmZXIpCj4gKwkJcmV0dXJuIDA7CgpZb3UgY2FuJ3QgZG8gdGhh dCB0aGlzIHdheTogd2hhdCBpZiB0aGUgZmlyc3QgbXRkIHRvIGJlIHJlZ2lzdGVyZWQgdXNlcwph IHNtYWxsZXIgcGFnZSBzaXplIHRoYW4gdGhlIHNlY29uZD8KCj4gKwo+ICsJbGVuID0gbXRkLT53 cml0ZXNpemUgKyBtdGQtPm9vYnNpemU7Cj4gKwluZmMtPmJ1ZmZlciA9IGRldm1fa3phbGxvYyhk ZXYsIGxlbiwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwo+ICsJaWYgKCFuZmMtPmJ1ZmZlcikKPiAr CQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwluZmMtPnBhZ2VfYnVmID0gbmZjLT5idWZmZXI7Cj4g KwlsZW4gPSBlY2MtPnN0ZXBzICogTkZDX01BWF9PT0JfUEVSX1NURVA7Cj4gKwluZmMtPm9vYl9i dWYgPSBkZXZtX2t6YWxsb2MoZGV2LCBsZW4sIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKPiArCWlm ICghbmZjLT5vb2JfYnVmKSB7Cj4gKwkJbmZjLT5idWZmZXIgPSBOVUxMOwo+ICsJCW5mYy0+b29i X2J1ZiA9IE5VTEw7CgpJIGRvbid0IHRoaW5rIHRoaXMgaXMgbmVlZGVkCgo+ICsJCXJldHVybiAt RU5PTUVNOwo+ICsJfQo+ICsKPiArCWNoaXAtPmVjYy53cml0ZV9wYWdlX3JhdyA9IHJrX25mY193 cml0ZV9wYWdlX3JhdzsKPiArCWNoaXAtPmVjYy53cml0ZV9wYWdlID0gcmtfbmZjX3dyaXRlX3Bh Z2VfaHdlY2M7Cj4gKwljaGlwLT5lY2Mud3JpdGVfb29iX3JhdyA9IHJrX25mY193cml0ZV9vb2Jf c3RkOwo+ICsJY2hpcC0+ZWNjLndyaXRlX29vYiA9IHJrX25mY193cml0ZV9vb2Jfc3RkOwo+ICsK PiArCWNoaXAtPmVjYy5yZWFkX3BhZ2VfcmF3ID0gcmtfbmZjX3JlYWRfcGFnZV9yYXc7Cj4gKwlj aGlwLT5lY2MucmVhZF9wYWdlID0gcmtfbmZjX3JlYWRfcGFnZV9od2VjYzsKPiArCWNoaXAtPmVj Yy5yZWFkX29vYl9yYXcgPSBya19uZmNfcmVhZF9vb2Jfc3RkOwo+ICsJY2hpcC0+ZWNjLnJlYWRf b29iID0gcmtfbmZjX3JlYWRfb29iX3N0ZDsKCkkgZG9uJ3QgbGlrZSB0aGUgX3N0ZCBwcmVmaXgs IGJ1dCBpdCBzaG91bGQgYmUgZ29uZSB3aGVuIHNwbGl0dGluZyB0aGUKZnVuY3Rpb25zIGFzIGFk dmlzZWQuCgo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0 IG5hbmRfY29udHJvbGxlcl9vcHMgcmtfbmZjX2NvbnRyb2xsZXJfb3BzID0gewo+ICsJLmF0dGFj aF9jaGlwID0gcmtfbmZjX2F0dGFjaF9jaGlwLAo+ICsJLmV4ZWNfb3AgPSBya19uZmNfZXhlY19v cCwKPiArCS5zZXR1cF9kYXRhX2ludGVyZmFjZSA9IHJrX25mY19zZXR1cF9kYXRhX2ludGVyZmFj ZSwKPiArfTsKPiArCj4gK3N0YXRpYyBpbnQgcmtfbmZjX25hbmRfY2hpcF9pbml0KHN0cnVjdCBk ZXZpY2UgKmRldiwgc3RydWN0IHJrX25mYyAqbmZjLAo+ICsJCQkJIHN0cnVjdCBkZXZpY2Vfbm9k ZSAqbnApCj4gK3sKPiArCXN0cnVjdCBya19uZmNfbmFuZF9jaGlwICpya25hbmQ7Cj4gKwlzdHJ1 Y3QgbmFuZF9jaGlwICpjaGlwOwo+ICsJc3RydWN0IG10ZF9pbmZvICptdGQ7Cj4gKwlpbnQgbnNl bHM7Cj4gKwl1MzIgdG1wOwo+ICsJaW50IHJldDsKPiArCWludCBpOwo+ICsKPiArCWlmICghb2Zf Z2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgJm5zZWxzKSkKPiArCQlyZXR1cm4gLUVOT0RFVjsKPiAr CW5zZWxzIC89IHNpemVvZih1MzIpOwo+ICsJaWYgKCFuc2VscyB8fCBuc2VscyA+IE5GQ19NQVhf TlNFTFMpIHsKPiArCQlkZXZfZXJyKGRldiwgImludmFsaWQgcmVnIHByb3BlcnR5IHNpemUgJWRc biIsIG5zZWxzKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlya25hbmQgPSBk ZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnJrbmFuZCkgKyBuc2VscyAqIHNpemVvZih1OCksCj4g KwkJCSAgICAgIEdGUF9LRVJORUwpOwo+ICsJaWYgKCFya25hbmQpCj4gKwkJcmV0dXJuIC1FTk9N RU07Cj4gKwo+ICsJcmtuYW5kLT5uc2VscyA9IG5zZWxzOwo+ICsJZm9yIChpID0gMDsgaSA8IG5z ZWxzOyBpKyspIHsKPiArCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChucCwgInJl ZyIsIGksICZ0bXApOwo+ICsJCWlmIChyZXQpIHsKPiArCQkJZGV2X2VycihkZXYsICJyZWcgcHJv cGVydHkgZmFpbHVyZSA6ICVkXG4iLCByZXQpOwo+ICsJCQlyZXR1cm4gcmV0Owo+ICsJCX0KPiAr Cj4gKwkJaWYgKHRtcCA+PSBORkNfTUFYX05TRUxTKSB7Cj4gKwkJCWRldl9lcnIoZGV2LCAiaW52 YWxpZCBDUzogJXVcbiIsIHRtcCk7Cj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ICsJCX0KPiArCj4g KwkJaWYgKHRlc3RfYW5kX3NldF9iaXQodG1wLCAmbmZjLT5hc3NpZ25lZF9jcykpIHsKPiArCQkJ ZGV2X2VycihkZXYsICJDUyAldSBhbHJlYWR5IGFzc2lnbmVkXG4iLCB0bXApOwo+ICsJCQlyZXR1 cm4gLUVJTlZBTDsKPiArCQl9Cj4gKwo+ICsJCXJrbmFuZC0+c2Vsc1tpXSA9IHRtcDsKPiArCX0K PiArCj4gKwljaGlwID0gJnJrbmFuZC0+Y2hpcDsKPiArCWNoaXAtPmNvbnRyb2xsZXIgPSAmbmZj LT5jb250cm9sbGVyOwo+ICsKPiArCW5hbmRfc2V0X2ZsYXNoX25vZGUoY2hpcCwgbnApOwo+ICsK PiArCW5hbmRfc2V0X2NvbnRyb2xsZXJfZGF0YShjaGlwLCBuZmMpOwo+ICsKPiArCWNoaXAtPm9w dGlvbnMgfD0gTkFORF9VU0VTX0RNQSB8IE5BTkRfTk9fU1VCUEFHRV9XUklURTsKPiArCWNoaXAt PmJidF9vcHRpb25zID0gTkFORF9CQlRfVVNFX0ZMQVNIIHwgTkFORF9CQlRfTk9fT09COwo+ICsK PiArCS8qIFNldCBkZWZhdWx0IG1vZGUgaW4gY2FzZSBkdCBlbnRyeSBpcyBtaXNzaW5nLiAqLwo+ ICsJY2hpcC0+ZWNjLm1vZGUgPSBOQU5EX0VDQ19IVzsKPiArCj4gKwltdGQgPSBuYW5kX3RvX210 ZChjaGlwKTsKPiArCW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKPiArCW10ZC0+ZGV2LnBhcmVu dCA9IGRldjsKPiArCj4gKwlpZiAoIW10ZC0+bmFtZSkgewo+ICsJCWRldl9lcnIobmZjLT5kZXYs ICJOQU5EIGxhYmVsIHByb3BlcnR5IGlzIG1hbmRhdG9yeVxuIik7Cj4gKwkJcmV0dXJuIC1FSU5W QUw7Cj4gKwl9Cj4gKwo+ICsJbXRkX3NldF9vb2JsYXlvdXQobXRkLCAmcmtfbmZjX29vYmxheW91 dF9vcHMpOwo+ICsJcmtfbmZjX2h3X2luaXQobmZjKTsKPiArCXJldCA9IG5hbmRfc2NhbihjaGlw LCBuc2Vscyk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJaWYgKGNoaXAt Pm9wdGlvbnMgJiBOQU5EX0lTX0JPT1RfTUVESVVNKSB7Cj4gKwkJcmV0ID0gb2ZfcHJvcGVydHlf cmVhZF91MzIobnAsICJyb2NrY2hpcCxib290LWJsa3MiLCAmdG1wKTsKPiArCQlya25hbmQtPmJv b3RfYmxrcyA9IHJldCA/IDAgOiB0bXA7CgpDYW4ndCB5b3UgZ3Vlc3MgdGhpcyBlbnRyeSBrbm93 aW5nIHRoZSBJUCB2ZXJzaW9uL1NvQyB2ZXJzaW9uPwoKPiArCj4gKwkJcmV0ID0gb2ZfcHJvcGVy dHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxib290LWVjYy1zdHJlbmd0aCIsCj4gKwkJCQkJICAg JnRtcCk7Cj4gKwkJcmtuYW5kLT5ib290X2VjYyA9IHJldCA/IGNoaXAtPmVjYy5zdHJlbmd0aCA6 IHRtcDsKPiArCX0KPiArCj4gKwlyZXQgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKG10ZCwgTlVMTCwg MCk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJZGV2X2VycihkZXYsICJtdGQgcGFyc2UgcGFydGl0aW9u IGVycm9yXG4iKTsKPiArCQluYW5kX2NsZWFudXAoY2hpcCk7Cj4gKwkJcmV0dXJuIHJldDsKPiAr CX0KPiArCj4gKwlsaXN0X2FkZF90YWlsKCZya25hbmQtPm5vZGUsICZuZmMtPmNoaXBzKTsKPiAr Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgcmtfbmZjX2NoaXBzX2NsZWFu dXAoc3RydWN0IHJrX25mYyAqbmZjKQo+ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZjX25hbmRfY2hpcCAq cmtuYW5kLCAqdG1wOwo+ICsJc3RydWN0IG5hbmRfY2hpcCAqY2hpcDsKPiArCWludCByZXQ7Cj4g Kwo+ICsJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJrbmFuZCwgdG1wLCAmbmZjLT5jaGlwcywg bm9kZSkgewo+ICsJCWNoaXAgPSAmcmtuYW5kLT5jaGlwOwo+ICsJCXJldCA9IG10ZF9kZXZpY2Vf dW5yZWdpc3RlcihuYW5kX3RvX210ZChjaGlwKSk7Cj4gKwkJV0FSTl9PTihyZXQpOwo+ICsJCW5h bmRfY2xlYW51cChjaGlwKTsKPiArCQlsaXN0X2RlbCgmcmtuYW5kLT5ub2RlKTsKPiArCX0KPiAr fQo+ICsKPiArc3RhdGljIGludCBya19uZmNfbmFuZF9jaGlwc19pbml0KHN0cnVjdCBkZXZpY2Ug KmRldiwgc3RydWN0IHJrX25mYyAqbmZjKQo+ICt7Cj4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5w ID0gZGV2LT5vZl9ub2RlLCAqbmFuZF9ucDsKPiArCWludCBuY2hpcHMgPSBvZl9nZXRfY2hpbGRf Y291bnQobnApOwo+ICsJaW50IHJldDsKPiArCj4gKwlpZiAoIW5jaGlwcyB8fCBuY2hpcHMgPiBO RkNfTUFYX05TRUxTKSB7Cj4gKwkJZGV2X2VycihuZmMtPmRldiwgIkluY29ycmVjdCBudW1iZXIg b2YgTkFORCBjaGlwcyAoJWQpXG4iLAo+ICsJCQluY2hpcHMpOwo+ICsJCXJldHVybiAtRUlOVkFM Owo+ICsJfQo+ICsKPiArCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobnAsIG5hbmRfbnApIHsKPiAr CQlyZXQgPSBya19uZmNfbmFuZF9jaGlwX2luaXQoZGV2LCBuZmMsIG5hbmRfbnApOwo+ICsJCWlm IChyZXQpIHsKPiArCQkJb2Zfbm9kZV9wdXQobmFuZF9ucCk7Cj4gKwkJCXJrX25mY19jaGlwc19j bGVhbnVwKG5mYyk7Cj4gKwkJCXJldHVybiByZXQ7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldHVy biAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgc3RydWN0IG5mY19jZmcgbmZjX3Y2X2NmZyA9IHsKPiAr CQkudHlwZQkJCT0gTkZDX1Y2LAo+ICsJCS5lY2Nfc3RyZW5ndGhzCQk9IHs2MCwgNDAsIDI0LCAx Nn0sCj4gKwkJLmVjY19jZmdzCQk9IHsKPiArCQkJMHgwMDA0MDAxMSwgMHgwMDA0MDAwMSwgMHgw MDAwMDAxMSwgMHgwMDAwMDAwMSwKPiArCQl9LAo+ICsJCS5mbGN0bF9vZmYJCT0gMHgwOCwKPiAr CQkuYmNoY3RsX29mZgkJPSAweDBDLAo+ICsJCS5kbWFfY2ZnX29mZgkJPSAweDEwLAo+ICsJCS5k bWFfZGF0YV9idWZfb2ZmCT0gMHgxNCwKPiArCQkuZG1hX29vYl9idWZfb2ZmCT0gMHgxOCwKPiAr CQkuZG1hX3N0X29mZgkJPSAweDFDLAo+ICsJCS5iY2hfc3Rfb2ZmCQk9IDB4MjAsCj4gKwkJLnJh bmRtel9vZmYJCT0gMHgxNTAsCj4gKwkJLmludF9lbl9vZmYJCT0gMHgxNkMsCj4gKwkJLmludF9j bHJfb2ZmCQk9IDB4MTcwLAo+ICsJCS5pbnRfc3Rfb2ZmCQk9IDB4MTc0LAo+ICsJCS5vb2IwX29m ZgkJPSAweDIwMCwKPiArCQkub29iMV9vZmYJCT0gMHgyMzAsCj4gKwkJLmVjYzAJCQk9IHsKPiAr CQkJLmVycl9mbGFnX2JpdAk9IDIsCj4gKwkJCS5sb3cJCT0gMywKPiArCQkJLmxvd19tYXNrCT0g MHgxRiwKPiArCQkJLmxvd19ibgkJPSA1LAo+ICsJCQkuaGlnaAkJPSAyNywKPiArCQkJLmhpZ2hf bWFzawk9IDB4MSwKPiArCQl9LAo+ICsJCS5lY2MxCQkJPSB7Cj4gKwkJCS5lcnJfZmxhZ19iaXQJ PSAxNSwKPiArCQkJLmxvdwkJPSAxNiwKPiArCQkJLmxvd19tYXNrCT0gMHgxRiwKPiArCQkJLmxv d19ibgkJPSA1LAo+ICsJCQkuaGlnaAkJPSAyOSwKPiArCQkJLmhpZ2hfbWFzawk9IDB4MSwKPiAr CQl9LAo+ICt9Owo+ICsKPiArc3RhdGljIHN0cnVjdCBuZmNfY2ZnIG5mY192OF9jZmcgPSB7Cj4g KwkJLnR5cGUJCQk9IE5GQ19WOCwKPiArCQkuZWNjX3N0cmVuZ3RocwkJPSB7MTYsIDE2LCAxNiwg MTZ9LAo+ICsJCS5lY2NfY2ZncwkJPSB7Cj4gKwkJCTB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4 MDAwMDAwMDEsIDB4MDAwMDAwMDEsCj4gKwkJfSwKPiArCQkuZmxjdGxfb2ZmCQk9IDB4MDgsCj4g KwkJLmJjaGN0bF9vZmYJCT0gMHgwQywKPiArCQkuZG1hX2NmZ19vZmYJCT0gMHgxMCwKPiArCQku ZG1hX2RhdGFfYnVmX29mZgk9IDB4MTQsCj4gKwkJLmRtYV9vb2JfYnVmX29mZgk9IDB4MTgsCj4g KwkJLmRtYV9zdF9vZmYJCT0gMHgxQywKPiArCQkuYmNoX3N0X29mZgkJPSAweDIwLAo+ICsJCS5y YW5kbXpfb2ZmCQk9IDB4MTUwLAo+ICsJCS5pbnRfZW5fb2ZmCQk9IDB4MTZDLAo+ICsJCS5pbnRf Y2xyX29mZgkJPSAweDE3MCwKPiArCQkuaW50X3N0X29mZgkJPSAweDE3NCwKPiArCQkub29iMF9v ZmYJCT0gMHgyMDAsCj4gKwkJLm9vYjFfb2ZmCQk9IDB4MjMwLAo+ICsJCS5lY2MwCQkJPSB7Cj4g KwkJCS5lcnJfZmxhZ19iaXQJPSAyLAo+ICsJCQkubG93CQk9IDMsCj4gKwkJCS5sb3dfbWFzawk9 IDB4MUYsCj4gKwkJCS5sb3dfYm4JCT0gNSwKPiArCQkJLmhpZ2gJCT0gMjcsCj4gKwkJCS5oaWdo X21hc2sJPSAweDEsCj4gKwkJfSwKPiArCQkuZWNjMQkJCT0gewo+ICsJCQkuZXJyX2ZsYWdfYml0 CT0gMTUsCj4gKwkJCS5sb3cJCT0gMTYsCj4gKwkJCS5sb3dfbWFzawk9IDB4MUYsCj4gKwkJCS5s b3dfYm4JCT0gNSwKPiArCQkJLmhpZ2gJCT0gMjksCj4gKwkJCS5oaWdoX21hc2sJPSAweDEsCj4g KwkJfSwKPiArfTsKPiArCj4gK3N0YXRpYyBzdHJ1Y3QgbmZjX2NmZyBuZmNfdjlfY2ZnID0gewo+ ICsJCS50eXBlCQkJPSBORkNfVjksCj4gKwkJLmVjY19zdHJlbmd0aHMJCT0gezcwLCA2MCwgNDAs IDE2fSwKPiArCQkuZWNjX2NmZ3MJCT0gewo+ICsJCQkweDAwMDAwMDAxLCAweDA2MDAwMDAxLCAw eDA0MDAwMDAxLCAweDAyMDAwMDAxLAo+ICsJCX0sCj4gKwkJLmZsY3RsX29mZgkJPSAweDEwLAo+ ICsJCS5iY2hjdGxfb2ZmCQk9IDB4MjAsCj4gKwkJLmRtYV9jZmdfb2ZmCQk9IDB4MzAsCj4gKwkJ LmRtYV9kYXRhX2J1Zl9vZmYJPSAweDM0LAo+ICsJCS5kbWFfb29iX2J1Zl9vZmYJPSAweDM4LAo+ ICsJCS5kbWFfc3Rfb2ZmCQk9IDB4M0MsCj4gKwkJLmJjaF9zdF9vZmYJCT0gMHgxNTAsCj4gKwkJ LnJhbmRtel9vZmYJCT0gMHgyMDgsCj4gKwkJLmludF9lbl9vZmYJCT0gMHgxMjAsCj4gKwkJLmlu dF9jbHJfb2ZmCQk9IDB4MTI0LAo+ICsJCS5pbnRfc3Rfb2ZmCQk9IDB4MTI4LAo+ICsJCS5vb2Iw X29mZgkJPSAweDIwMCwKPiArCQkub29iMV9vZmYJCT0gMHgyMDQsCj4gKwkJLmVjYzAJCQk9IHsK PiArCQkJLmVycl9mbGFnX2JpdAk9IDIsCj4gKwkJCS5sb3cJCT0gMywKPiArCQkJLmxvd19tYXNr CT0gMHg3RiwKPiArCQkJLmxvd19ibgkJPSA3LAo+ICsJCQkuaGlnaAkJPSAwLAo+ICsJCQkuaGln aF9tYXNrCT0gMHgwLAo+ICsJCX0sCj4gKwkJLmVjYzEJCQk9IHsKPiArCQkJLmVycl9mbGFnX2Jp dAk9IDE4LAo+ICsJCQkubG93CQk9IDE5LAo+ICsJCQkubG93X21hc2sJPSAweDdGLAo+ICsJCQku bG93X2JuCQk9IDcsCj4gKwkJCS5oaWdoCQk9IDAsCj4gKwkJCS5oaWdoX21hc2sJPSAweDAsCj4g KwkJfSwKPiArfTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJrX25m Y19pZF90YWJsZVtdID0gewo+ICsJey5jb21wYXRpYmxlID0gInJvY2tjaGlwLHB4MzAtbmZjIiwK PiArCQkuZGF0YSA9ICZuZmNfdjlfY2ZnIH0sCgoJewoJCS5jb21wYXRpYmxlID0KCQkuZGF0YSA9 Cgl9LAoKb3IKCgl7IC5jb21wYXRpYmxlID0gLCAuZGF0YSA9IH0sCgpidXQgbm90OgoKPiArCXsu Y29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazI5MjgtbmZjIiwKPiArCQkuZGF0YSA9ICZuZmNfdjZf Y2ZnIH0sCj4gKwl7LmNvbXBhdGlibGUgPSAicm9ja2NoaXAscnYxMTA4LW5mYyIsCj4gKwkJLmRh dGEgPSAmbmZjX3Y4X2NmZyB9LAo+ICsJeyAvKiBzZW50aW5lbCAqLyB9Cj4gK307Cj4gK01PRFVM RV9ERVZJQ0VfVEFCTEUob2YsIHJrX25mY19pZF90YWJsZSk7Cj4gKwo+ICtzdGF0aWMgaW50IHJr X25mY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICt7Cj4gKwlzdHJ1Y3Qg ZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2Owo+ICsJc3RydWN0IHJrX25mYyAqbmZjOwo+ICsJaW50 IHJldCwgaXJxOwo+ICsKPiArCW5mYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqbmZjKSwg R0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIW5mYykKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwlu YW5kX2NvbnRyb2xsZXJfaW5pdCgmbmZjLT5jb250cm9sbGVyKTsKPiArCUlOSVRfTElTVF9IRUFE KCZuZmMtPmNoaXBzKTsKPiArCW5mYy0+Y29udHJvbGxlci5vcHMgPSAmcmtfbmZjX2NvbnRyb2xs ZXJfb3BzOwo+ICsKPiArCW5mYy0+Y2ZnID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKGRldik7 Cj4gKwluZmMtPmRldiA9IGRldjsKPiArCj4gKwlpbml0X2NvbXBsZXRpb24oJm5mYy0+ZG9uZSk7 Cj4gKwo+ICsJbmZjLT5yZWdzID0gZGV2bV9wbGF0Zm9ybV9pb3JlbWFwX3Jlc291cmNlKHBkZXYs IDApOwo+ICsJaWYgKElTX0VSUihuZmMtPnJlZ3MpKSB7Cj4gKwkJcmV0ID0gUFRSX0VSUihuZmMt PnJlZ3MpOwo+ICsJCWdvdG8gcmVsZWFzZV9uZmM7Cj4gKwl9Cj4gKwo+ICsJbmZjLT5jbGsubmZj X2NsayA9IGRldm1fY2xrX2dldChkZXYsICJuZmMiKTsKPiArCWlmIChJU19FUlIobmZjLT5jbGsu bmZjX2NsaykpIHsKPiArCQlkZXZfZGJnKGRldiwgIm5vIG5mYyBjbGtcbiIpOwo+ICsJCS8qIFNv bWUgZWFybGllciBtb2RlbHMsIHN1Y2ggYXMgcmszMDY2LCBoYXZlIG5vIG5mYyBjbGsuICovCj4g Kwl9Cj4gKwo+ICsJbmZjLT5jbGsuYWhiX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJhaGIiKTsK PiArCWlmIChJU19FUlIobmZjLT5jbGsuYWhiX2NsaykpIHsKPiArCQlkZXZfZXJyKGRldiwgIm5v IGFoYiBjbGtcbiIpOwo+ICsJCXJldCA9IFBUUl9FUlIobmZjLT5jbGsuYWhiX2Nsayk7Cj4gKwkJ Z290byByZWxlYXNlX25mYzsKPiArCX0KPiArCj4gKwlyZXQgPSBya19uZmNfZW5hYmxlX2Nsayhk ZXYsICZuZmMtPmNsayk7Cj4gKwlpZiAocmV0KQo+ICsJCWdvdG8gcmVsZWFzZV9uZmM7Cj4gKwo+ ICsJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKPiArCWlmIChpcnEgPCAwKSB7Cj4g KwkJZGV2X2VycihkZXYsICJubyBuZmMgaXJxIHJlc291cmNlXG4iKTsKPiArCQlyZXQgPSAtRUlO VkFMOwo+ICsJCWdvdG8gY2xrX2Rpc2FibGU7Cj4gKwl9Cj4gKwo+ICsJd3JpdGVsKDAsIG5mYy0+ cmVncyArIG5mYy0+Y2ZnLT5pbnRfZW5fb2ZmKTsKPiArCXJldCA9IGRldm1fcmVxdWVzdF9pcnEo ZGV2LCBpcnEsIHJrX25mY19pcnEsIDB4MCwgInJrLW5hbmQiLCBuZmMpOwo+ICsJaWYgKHJldCkg ewo+ICsJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgbmZjIGlycVxuIik7Cj4gKwkJ Z290byBjbGtfZGlzYWJsZTsKPiArCX0KPiArCj4gKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2 LCBuZmMpOwo+ICsKPiArCXJldCA9IHJrX25mY19uYW5kX2NoaXBzX2luaXQoZGV2LCBuZmMpOwo+ ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGluaXQgTkFORCBjaGlw c1xuIik7Cj4gKwkJZ290byBjbGtfZGlzYWJsZTsKPiArCX0KPiArCXJldHVybiAwOwo+ICsKPiAr Y2xrX2Rpc2FibGU6Cj4gKwlya19uZmNfZGlzYWJsZV9jbGsoJm5mYy0+Y2xrKTsKPiArcmVsZWFz ZV9uZmM6Cj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJrX25mY19yZW1v dmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiArewo+ICsJc3RydWN0IHJrX25mYyAq bmZjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Cj4gKwo+ICsJcmtfbmZjX2NoaXBzX2Ns ZWFudXAobmZjKTsKPiArCXJrX25mY19kaXNhYmxlX2NsaygmbmZjLT5jbGspOwoKRG9uJ3QgeW91 IGhhdmUgRE1BIHJlc291cmNlcyBhbmQgIWRldm0gYWxsb2NhdGVkIGJ1ZmZlcnMgdG8gZnJlZT8K Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQg cmtfbmZjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgcmtfbmZj ICpuZmMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiArCj4gKwlya19uZmNfZGlzYWJsZV9jbGso Jm5mYy0+Y2xrKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBfX21h eWJlX3VudXNlZCBya19uZmNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKPiArewo+ICsJc3Ry dWN0IHJrX25mYyAqbmZjID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gKwlzdHJ1Y3QgcmtfbmZj X25hbmRfY2hpcCAqcmtuYW5kOwo+ICsJc3RydWN0IG5hbmRfY2hpcCAqY2hpcDsKPiArCWludCBy ZXQ7Cj4gKwl1MzIgaTsKPiArCj4gKwlyZXQgPSBya19uZmNfZW5hYmxlX2NsayhkZXYsICZuZmMt PmNsayk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJLyogUmVzZXQgTkFO RCBjaGlwIGlmIFZDQyB3YXMgcG93ZXJlZCBvZmYuICovCj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5 KHJrbmFuZCwgJm5mYy0+Y2hpcHMsIG5vZGUpIHsKPiArCQljaGlwID0gJnJrbmFuZC0+Y2hpcDsK PiArCQlmb3IgKGkgPSAwOyBpIDwgcmtuYW5kLT5uc2VsczsgaSsrKQo+ICsJCQluYW5kX3Jlc2V0 KGNoaXAsIGkpOwoKSSBhc3N1bWUgdGhpcyBpcyBoYW5kbGVkIGJ5IHRoZSBjb3JlIGFscmVhZHkg KHBsZWFzZSB2ZXJpZnkgaXQpCgo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtz dGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgcmtfbmZjX3BtX29wcyA9IHsKPiArCVNFVF9T WVNURU1fU0xFRVBfUE1fT1BTKHJrX25mY19zdXNwZW5kLCBya19uZmNfcmVzdW1lKQo+ICt9Owo+ ICsKPiArc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcmtfbmZjX2RyaXZlciA9IHsKPiAr CS5wcm9iZSA9IHJrX25mY19wcm9iZSwKPiArCS5yZW1vdmUgPSBya19uZmNfcmVtb3ZlLAo+ICsJ LmRyaXZlciA9IHsKPiArCQkubmFtZSA9ICJyb2NrY2hpcC1uZmMiLAo+ICsJCS5vZl9tYXRjaF90 YWJsZSA9IHJrX25mY19pZF90YWJsZSwKPiArCQkucG0gPSAmcmtfbmZjX3BtX29wcywKPiArCX0s Cj4gK307Cj4gKwo+ICttb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHJrX25mY19kcml2ZXIpOwo+ICsK PiArTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTUlUL0dQTCIpOwo+ICtNT0RVTEVfQVVUSE9SKCJZaWZl bmcgWmhhbyA8eWlmZW5nLnpoYW9Acm9jay1jaGlwcy5jb20+Iik7Cj4gK01PRFVMRV9ERVNDUklQ VElPTigiUm9ja2NoaXAgTmFuZCBGbGFzaCBDb250cm9sbGVyIERyaXZlciIpOwo+ICtNT0RVTEVf QUxJQVMoInBsYXRmb3JtOnJvY2tjaGlwLW5hbmQtY29udHJvbGxlciIpOwoKVGhhbmtzLApNaXF1 w6hsCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51 eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVh ZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1h cm0ta2VybmVsCg== 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 D9638C43461 for ; Tue, 15 Sep 2020 08:09:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 86DB721D7A for ; Tue, 15 Sep 2020 08:09:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726133AbgIOIJN convert rfc822-to-8bit (ORCPT ); Tue, 15 Sep 2020 04:09:13 -0400 Received: from relay5-d.mail.gandi.net ([217.70.183.197]:45259 "EHLO relay5-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726169AbgIOIHp (ORCPT ); Tue, 15 Sep 2020 04:07:45 -0400 X-Originating-IP: 91.224.148.103 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay5-d.mail.gandi.net (Postfix) with ESMTPSA id 538551C000E; Tue, 15 Sep 2020 08:07:29 +0000 (UTC) Date: Tue, 15 Sep 2020 10:07:28 +0200 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 v8 2/8] mtd: rawnand: rockchip: NFC drivers for RK3308, RK2928 and others Message-ID: <20200915100728.5c866f89@xps13> In-Reply-To: <20200717092420.19798-3-yifeng.zhao@rock-chips.com> References: <20200717092420.19798-1-yifeng.zhao@rock-chips.com> <20200717092420.19798-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 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Hi Yifeng, I am very sorry for the delay it took me to review this driver, but there are still some small incoherences IMHO, see below. Yifeng Zhao wrote on Fri, 17 Jul 2020 17:24:18 +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 v8: None > Changes in v7: > - Rebase to linux-next. > - Fix coding style. > - Reserved 4 bytes at the begining 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 | 1422 +++++++++++++++++ > 3 files changed, 1435 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 113f61052269..6492855d4a55 100644 > --- a/drivers/mtd/nand/raw/Kconfig > +++ b/drivers/mtd/nand/raw/Kconfig > @@ -461,6 +461,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..fec1360603e0 > --- /dev/null > +++ b/drivers/mtd/nand/raw/rockchip-nand-controller.c > @@ -0,0 +1,1422 @@ > +// 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 > + > +/* > + * 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 Nitpicking: I'd prefer #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_clk { > + int nfc_rate; > + struct clk *nfc_clk; > + struct clk *ahb_clk; Not sure this deserves its own structure? > +}; > + > +struct rk_nfc { > + struct nand_controller controller; > + struct rk_nfc_clk clk; > + > + struct device *dev; > + const struct nfc_cfg *cfg; > + void __iomem *regs; > + > + int selected_bank; > + int band_offset; > + > + struct completion done; > + struct list_head chips; > + > + u8 *buffer; > + u8 *page_buf; > + u32 *oob_buf; > + > + unsigned long assigned_cs; > +}; > + > +static inline struct rk_nfc_nand_chip *to_rknand(struct nand_chip *chip) > +{ > + return container_of(chip, struct rk_nfc_nand_chip, chip); > +} > + > +static inline u8 *data_ptr(struct nand_chip *chip, const u8 *p, int i) rk_nfc_buf_to_data_ptr ? > +{ > + return (u8 *)p + i * chip->ecc.size; > +} > + > +static inline u8 *oob_ptr(struct nand_chip *chip, int i) same here > +{ > + u8 *poi; > + > + poi = chip->oob_poi + i * NFC_SYS_DATA_SIZE; > + > + return poi; > +} > + > +static inline u8 *oob_ecc_ptr(struct nand_chip *chip, int i) same here > +{ > + struct rk_nfc_nand_chip *rknand = to_rknand(chip); > + u8 *poi; > + > + poi = chip->oob_poi + rknand->metadata_size + > + chip->ecc.bytes * i; > + > + return poi; > +} > + > +static inline int rk_data_len(struct nand_chip *chip) Please prepend all you functions with rk_nfc_ > +{ > + struct rk_nfc_nand_chip *rknand = to_rknand(chip); > + > + return chip->ecc.size + rknand->spare_per_sector; > +} > + > +static inline u8 *rk_data_ptr(struct nand_chip *chip, int i) > +{ > + struct rk_nfc *nfc = nand_get_controller_data(chip); > + > + return nfc->buffer + i * rk_data_len(chip); > +} > + > +static inline u8 *rk_oob_ptr(struct nand_chip *chip, int i) > +{ > + struct rk_nfc *nfc = nand_get_controller_data(chip); > + > + return nfc->buffer + i * rk_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 = 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_poll_timeout_atomic(nfc->regs + NFC_FMCTL, val, > + val & FMCTL_RDY, 10, NFC_TIMEOUT); Do you really need it to be atomic ? ->exec_op() is not called in an atomic context. > + > + return rc; > +} > + > +static inline u8 rk_nfc_read_byte(struct nand_chip *chip) > +{ > + struct rk_nfc *nfc = nand_get_controller_data(chip); > + > + return readb_relaxed(nfc->regs + nfc->band_offset + BANK_DATA); no need for this helper, just move the code below. > +} > + > +static void rk_nfc_read_buf(struct nand_chip *chip, u8 *buf, int len) > +{ > + int i; > + > + for (i = 0; i < len; i++) > + buf[i] = rk_nfc_read_byte(chip); Either you find more places where to call this function, or you can move this code directly to the unique location where it is called. > +} > + > +static void rk_nfc_write_byte(struct nand_chip *chip, u8 byte) Same here > +{ > + struct rk_nfc *nfc = nand_get_controller_data(chip); > + > + writeb(byte, nfc->regs + nfc->band_offset + BANK_DATA); > +} > + > +static void rk_nfc_write_buf(struct nand_chip *chip, const u8 *buf, int len) > +{ > + int i; > + > + for (i = 0; i < len; i++) > + rk_nfc_write_byte(chip, buf[i]); > +} > + > +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; > + void __iomem *data_reg; > + 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); > + data_reg = nfc->regs + nfc->band_offset + BANK_DATA; > + > + if (instr->type == NAND_OP_DATA_OUT_INSTR) { > + outbuf = instr->ctx.data.buf.out + start; > + for (j = 0; j < cnt; j++) > + writeb(outbuf[j], data_reg); Why not calling the read/write buf helpers here? Which would be better named read/write_data instead due to the register names of your IP. > + } else { > + inbuf = instr->ctx.data.buf.in + start; > + for (j = 0; j < cnt; j++) > + inbuf[j] = readb_relaxed(data_reg); > + } > + 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) > +{ > + rk_nfc_select_chip(chip, op->cs); Don't select the die if check_only == true > + 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_data_interface *conf) > +{ > + 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; > + > + if (!chip->parameters.onfi) > + return 0; You must accept all kind of timings if they fit the controller possibilities, please drop it off. If you don't support a given configuration, just check it and return an error when CHECK_ONLY is used. > + > + timings = nand_get_sdr_timings(conf); > + if (IS_ERR(timings)) > + return -EOPNOTSUPP; > + > + if (IS_ERR(nfc->clk.nfc_clk)) > + rate = clk_get_rate(nfc->clk.ahb_clk); > + else > + rate = clk_get_rate(nfc->clk.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 Style check: '*' to start every comment line > + * 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); > + > + 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); > + > + 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_poll_timeout_atomic(ptr, reg, > + reg & FLCTL_XFER_READY, > + 10, NFC_TIMEOUT); Same question, do you need it to be atomic? > + > + return ret; > +} > + > +static int rk_nfc_write_page(struct mtd_info *mtd, struct nand_chip *chip, > + const u8 *buf, int page, int raw) > +{ > + struct rk_nfc *nfc = nand_get_controller_data(chip); > + struct rk_nfc_nand_chip *rknand = 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); > + > + if (!raw) I think it will be much better to have two rk_nfc_write_page and rk_nfc_write_page_raw distinct helpers. > + memcpy(nfc->page_buf, buf, mtd->writesize); > + memset(nfc->oob_buf, 0xff, oob_step * ecc->steps); You are discarding OOB data intentionally, this is strange. > + > + /* > + * The first 8(some devices are 4 or 16) blocks are in use by "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. > + * Config the ECC algorithm supported by the boot ROM. s/config/configure/ This conflicts with bad block markers... > + */ > + 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; Please use brackets. > + } > + > + dma_data = dma_map_single(nfc->dev, (void *)nfc->page_buf, Do you need this cast? > + 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"); > + } > + } else { > + rk_nfc_write_buf(chip, buf, mtd->writesize + mtd->oobsize); > + } > + > + if (ret) > + return ret; > + > + ret = nand_prog_page_end_op(chip); > + > + /* Deselect the currently selected target. */ > + rk_nfc_select_chip(chip, -1); Not sure this is needed? > + > + 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); > + u32 i; > + > + memset(nfc->buffer, 0xff, mtd->writesize + mtd->oobsize); > + > + for (i = 0; i < chip->ecc.steps; i++) { > + if (buf) Can this condition be unmet really? > + memcpy(rk_data_ptr(chip, i), data_ptr(chip, buf, i), > + chip->ecc.size); > + > + if (!i) > + memcpy(rk_oob_ptr(chip, i), > + oob_ptr(chip, chip->ecc.steps - 1), > + NFC_SYS_DATA_SIZE); What is this? > + else > + memcpy(rk_oob_ptr(chip, i), oob_ptr(chip, i - 1), > + NFC_SYS_DATA_SIZE); > + > + memcpy(rk_oob_ptr(chip, i) + NFC_SYS_DATA_SIZE, > + oob_ecc_ptr(chip, i), > + chip->ecc.bytes); > + } > + > + return rk_nfc_write_page(mtd, chip, nfc->buffer, page, 1); > +} > + > +static int rk_nfc_write_oob_std(struct nand_chip *chip, int page) > +{ > + return rk_nfc_write_page_raw(chip, NULL, 1, page); > +} What is the purpose of this indirection? Please get rid of it. > + > +static int rk_nfc_read_page(struct mtd_info *mtd, struct nand_chip *chip, > + u32 data_offs, u32 readlen, > + u8 *buf, int page, int raw) > +{ > + struct rk_nfc *nfc = nand_get_controller_data(chip); > + struct rk_nfc_nand_chip *rknand = 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); > + if (!raw) { Same comment, please write two helpers. > + 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 8(some devices are 4 or 16) blocks are in use by Same rewording > + * the boot ROM. > + * Config 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++) { Brackets here as well please > + 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 = -1; I think you should return 0. Then the upper layer will check for failures. > + } 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 < 0) > + dev_err(nfc->dev, "read page: %x ecc error!\n", page); > + } else { > + rk_nfc_read_buf(chip, buf, mtd->writesize + mtd->oobsize); > + } > + /* Deselect the currently selected target. */ > + rk_nfc_select_chip(chip, -1); > + > + return bitflips; > +} > + > +static int rk_nfc_write_page_hwecc(struct nand_chip *chip, const u8 *buf, > + int oob_on, int page) > +{ > + return rk_nfc_write_page(nand_to_mtd(chip), chip, buf, page, 0); > +} > + > +static int rk_nfc_read_page_hwecc(struct nand_chip *chip, u8 *p, int oob_on, > + int pg) > +{ > + struct mtd_info *mtd = nand_to_mtd(chip); > + > + return rk_nfc_read_page(mtd, chip, 0, mtd->writesize, p, pg, 0); > +} > + > +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); > + int i, ret; > + > + ret = rk_nfc_read_page(mtd, chip, 0, mtd->writesize, nfc->buffer, > + page, 1); > + if (ret < 0) > + return ret; > + > + for (i = 0; i < chip->ecc.steps; i++) { > + if (!i) > + memcpy(oob_ptr(chip, chip->ecc.steps - 1), > + rk_oob_ptr(chip, i), > + NFC_SYS_DATA_SIZE); > + else > + memcpy(oob_ptr(chip, i - 1), rk_oob_ptr(chip, i), > + NFC_SYS_DATA_SIZE); > + > + memcpy(oob_ecc_ptr(chip, i), > + rk_oob_ptr(chip, i) + NFC_SYS_DATA_SIZE, > + chip->ecc.bytes); > + > + if (buf) > + memcpy(data_ptr(chip, buf, i), rk_data_ptr(chip, i), > + chip->ecc.size); > + } > + > + return ret; > +} > + > +static int rk_nfc_read_oob_std(struct nand_chip *chip, int page) > +{ > + return rk_nfc_read_page_raw(chip, NULL, 1, page); > +} > + > +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_clk(struct device *dev, struct rk_nfc_clk *clk) _clks with an s to inform that there are several of them? > +{ > + int ret; > + > + if (!IS_ERR(clk->nfc_clk)) { > + ret = clk_prepare_enable(clk->nfc_clk); > + if (ret) { > + dev_err(dev, "failed to enable nfc clk\n"); > + return ret; > + } > + } > + > + ret = clk_prepare_enable(clk->ahb_clk); > + if (ret) { > + dev_err(dev, "failed to enable ahb clk\n"); > + if (!IS_ERR(clk->nfc_clk)) > + clk_disable_unprepare(clk->nfc_clk); > + return ret; > + } > + > + return 0; > +} > + > +static void rk_nfc_disable_clk(struct rk_nfc_clk *clk) ditto > +{ > + if (!IS_ERR(clk->nfc_clk)) > + clk_disable_unprepare(clk->nfc_clk); > + clk_disable_unprepare(clk->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 = 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 = to_rknand(chip); > + > + if (section) > + return -ERANGE; > + > + oob_region->offset = rknand->metadata_size; > + oob_region->length = mtd->oobsize - oob_region->offset; > + > + 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) { > + /* Use datasheet requirements. */ > + ecc->strength = chip->base.eccreq.strength; > + ecc->size = chip->base.eccreq.step_size; > + > + /* Align ECC strength and ECC size. */ > + if (chip->ecc.size < 1024) { > + if (mtd->writesize > 512) { > + chip->ecc.size = 1024; > + chip->ecc.strength <<= 1; > + } else { > + dev_err(dev, "Unsupported ecc.size\n"); > + return -EINVAL; > + } > + } else { > + chip->ecc.size = 1024; > + } > + > + ecc->steps = mtd->writesize / ecc->size; > + > + /* > + * HW ECC always requests the number of ECC bytes per 1024 byte > + * blocks. 4 Bytes is oob 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); > + /* HW ECC always work with even numbers of ECC bytes. */ > + ecc->bytes = ALIGN(ecc->bytes, 2); > + > + rk_nfc_hw_ecc_setup(chip, ecc, ecc->strength); > + > + return 0; > +} > + > +static int rk_nfc_attach_chip(struct nand_chip *chip) > +{ > + struct mtd_info *mtd = nand_to_mtd(chip); > + struct device *dev = mtd->dev.parent; > + struct rk_nfc *nfc = nand_get_controller_data(chip); > + struct rk_nfc_nand_chip *rknand = to_rknand(chip); > + struct nand_ecc_ctrl *ecc = &chip->ecc; > + int len; > + int ret; > + > + if (chip->options & NAND_BUSWIDTH_16) { > + dev_err(dev, "16 bits bus width not supported"); > + return -EINVAL; > + } > + > + if (ecc->mode != NAND_ECC_HW) > + return 0; > + > + ret = rk_nfc_ecc_init(dev, mtd); > + if (ret) > + return ret; > + rknand->spare_per_sector = ecc->bytes + NFC_SYS_DATA_SIZE; > + rknand->metadata_size = NFC_SYS_DATA_SIZE * ecc->steps; > + > + if (rknand->metadata_size < NFC_SYS_DATA_SIZE + 2) { > + dev_err(dev, > + "Driver needs at least %d bytes of meta data\n", > + NFC_SYS_DATA_SIZE + 2); > + return -EIO; > + } > + /* Check buffer first, avoid duplicate alloc buffer. */ > + if (nfc->buffer) > + return 0; You can't do that this way: what if the first mtd to be registered uses a smaller page size than the second? > + > + len = mtd->writesize + mtd->oobsize; > + nfc->buffer = devm_kzalloc(dev, len, GFP_KERNEL | GFP_DMA); > + if (!nfc->buffer) > + return -ENOMEM; > + > + nfc->page_buf = nfc->buffer; > + len = ecc->steps * NFC_MAX_OOB_PER_STEP; > + nfc->oob_buf = devm_kzalloc(dev, len, GFP_KERNEL | GFP_DMA); > + if (!nfc->oob_buf) { > + nfc->buffer = NULL; > + nfc->oob_buf = NULL; I don't think this is needed > + return -ENOMEM; > + } > + > + chip->ecc.write_page_raw = rk_nfc_write_page_raw; > + chip->ecc.write_page = rk_nfc_write_page_hwecc; > + chip->ecc.write_oob_raw = rk_nfc_write_oob_std; > + chip->ecc.write_oob = rk_nfc_write_oob_std; > + > + chip->ecc.read_page_raw = rk_nfc_read_page_raw; > + chip->ecc.read_page = rk_nfc_read_page_hwecc; > + chip->ecc.read_oob_raw = rk_nfc_read_oob_std; > + chip->ecc.read_oob = rk_nfc_read_oob_std; I don't like the _std prefix, but it should be gone when splitting the functions as advised. > + > + return 0; > +} > + > +static const struct nand_controller_ops rk_nfc_controller_ops = { > + .attach_chip = rk_nfc_attach_chip, > + .exec_op = rk_nfc_exec_op, > + .setup_data_interface = rk_nfc_setup_data_interface, > +}; > + > +static int rk_nfc_nand_chip_init(struct device *dev, struct rk_nfc *nfc, > + struct device_node *np) > +{ > + struct rk_nfc_nand_chip *rknand; > + struct nand_chip *chip; > + struct mtd_info *mtd; > + int nsels; > + u32 tmp; > + int ret; > + int i; > + > + if (!of_get_property(np, "reg", &nsels)) > + return -ENODEV; > + nsels /= sizeof(u32); > + if (!nsels || nsels > NFC_MAX_NSELS) { > + dev_err(dev, "invalid reg property size %d\n", nsels); > + return -EINVAL; > + } > + > + rknand = devm_kzalloc(dev, sizeof(*rknand) + nsels * sizeof(u8), > + GFP_KERNEL); > + if (!rknand) > + return -ENOMEM; > + > + rknand->nsels = nsels; > + for (i = 0; i < nsels; i++) { > + ret = of_property_read_u32_index(np, "reg", i, &tmp); > + if (ret) { > + dev_err(dev, "reg property failure : %d\n", ret); > + return ret; > + } > + > + if (tmp >= NFC_MAX_NSELS) { > + dev_err(dev, "invalid CS: %u\n", tmp); > + return -EINVAL; > + } > + > + if (test_and_set_bit(tmp, &nfc->assigned_cs)) { > + dev_err(dev, "CS %u already assigned\n", tmp); > + return -EINVAL; > + } > + > + rknand->sels[i] = tmp; > + } > + > + chip = &rknand->chip; > + chip->controller = &nfc->controller; > + > + nand_set_flash_node(chip, np); > + > + nand_set_controller_data(chip, nfc); > + > + chip->options |= NAND_USES_DMA | NAND_NO_SUBPAGE_WRITE; > + chip->bbt_options = NAND_BBT_USE_FLASH | NAND_BBT_NO_OOB; > + > + /* Set default mode in case dt entry is missing. */ > + chip->ecc.mode = NAND_ECC_HW; > + > + mtd = nand_to_mtd(chip); > + mtd->owner = THIS_MODULE; > + mtd->dev.parent = dev; > + > + if (!mtd->name) { > + dev_err(nfc->dev, "NAND label property is mandatory\n"); > + return -EINVAL; > + } > + > + mtd_set_ooblayout(mtd, &rk_nfc_ooblayout_ops); > + rk_nfc_hw_init(nfc); > + ret = nand_scan(chip, nsels); > + if (ret) > + return ret; > + > + if (chip->options & NAND_IS_BOOT_MEDIUM) { > + ret = of_property_read_u32(np, "rockchip,boot-blks", &tmp); > + rknand->boot_blks = ret ? 0 : tmp; Can't you guess this entry knowing the IP version/SoC version? > + > + ret = of_property_read_u32(np, "rockchip,boot-ecc-strength", > + &tmp); > + rknand->boot_ecc = ret ? chip->ecc.strength : tmp; > + } > + > + ret = mtd_device_register(mtd, NULL, 0); > + if (ret) { > + dev_err(dev, "mtd parse partition error\n"); > + nand_cleanup(chip); > + return ret; > + } > + > + list_add_tail(&rknand->node, &nfc->chips); > + > + return 0; > +} > + > +static void rk_nfc_chips_cleanup(struct rk_nfc *nfc) > +{ > + struct rk_nfc_nand_chip *rknand, *tmp; > + struct nand_chip *chip; > + int ret; > + > + list_for_each_entry_safe(rknand, tmp, &nfc->chips, node) { > + chip = &rknand->chip; > + ret = mtd_device_unregister(nand_to_mtd(chip)); > + WARN_ON(ret); > + nand_cleanup(chip); > + list_del(&rknand->node); > + } > +} > + > +static int rk_nfc_nand_chips_init(struct device *dev, struct rk_nfc *nfc) > +{ > + struct device_node *np = dev->of_node, *nand_np; > + int nchips = of_get_child_count(np); > + int ret; > + > + if (!nchips || nchips > NFC_MAX_NSELS) { > + dev_err(nfc->dev, "Incorrect number of NAND chips (%d)\n", > + nchips); > + return -EINVAL; > + } > + > + for_each_child_of_node(np, nand_np) { > + ret = rk_nfc_nand_chip_init(dev, nfc, nand_np); > + if (ret) { > + of_node_put(nand_np); > + rk_nfc_chips_cleanup(nfc); > + return ret; > + } > + } > + > + return 0; > +} > + > +static struct nfc_cfg nfc_v6_cfg = { > + .type = NFC_V6, > + .ecc_strengths = {60, 40, 24, 16}, > + .ecc_cfgs = { > + 0x00040011, 0x00040001, 0x00000011, 0x00000001, > + }, > + .flctl_off = 0x08, > + .bchctl_off = 0x0C, > + .dma_cfg_off = 0x10, > + .dma_data_buf_off = 0x14, > + .dma_oob_buf_off = 0x18, > + .dma_st_off = 0x1C, > + .bch_st_off = 0x20, > + .randmz_off = 0x150, > + .int_en_off = 0x16C, > + .int_clr_off = 0x170, > + .int_st_off = 0x174, > + .oob0_off = 0x200, > + .oob1_off = 0x230, > + .ecc0 = { > + .err_flag_bit = 2, > + .low = 3, > + .low_mask = 0x1F, > + .low_bn = 5, > + .high = 27, > + .high_mask = 0x1, > + }, > + .ecc1 = { > + .err_flag_bit = 15, > + .low = 16, > + .low_mask = 0x1F, > + .low_bn = 5, > + .high = 29, > + .high_mask = 0x1, > + }, > +}; > + > +static struct nfc_cfg nfc_v8_cfg = { > + .type = NFC_V8, > + .ecc_strengths = {16, 16, 16, 16}, > + .ecc_cfgs = { > + 0x00000001, 0x00000001, 0x00000001, 0x00000001, > + }, > + .flctl_off = 0x08, > + .bchctl_off = 0x0C, > + .dma_cfg_off = 0x10, > + .dma_data_buf_off = 0x14, > + .dma_oob_buf_off = 0x18, > + .dma_st_off = 0x1C, > + .bch_st_off = 0x20, > + .randmz_off = 0x150, > + .int_en_off = 0x16C, > + .int_clr_off = 0x170, > + .int_st_off = 0x174, > + .oob0_off = 0x200, > + .oob1_off = 0x230, > + .ecc0 = { > + .err_flag_bit = 2, > + .low = 3, > + .low_mask = 0x1F, > + .low_bn = 5, > + .high = 27, > + .high_mask = 0x1, > + }, > + .ecc1 = { > + .err_flag_bit = 15, > + .low = 16, > + .low_mask = 0x1F, > + .low_bn = 5, > + .high = 29, > + .high_mask = 0x1, > + }, > +}; > + > +static struct nfc_cfg nfc_v9_cfg = { > + .type = NFC_V9, > + .ecc_strengths = {70, 60, 40, 16}, > + .ecc_cfgs = { > + 0x00000001, 0x06000001, 0x04000001, 0x02000001, > + }, > + .flctl_off = 0x10, > + .bchctl_off = 0x20, > + .dma_cfg_off = 0x30, > + .dma_data_buf_off = 0x34, > + .dma_oob_buf_off = 0x38, > + .dma_st_off = 0x3C, > + .bch_st_off = 0x150, > + .randmz_off = 0x208, > + .int_en_off = 0x120, > + .int_clr_off = 0x124, > + .int_st_off = 0x128, > + .oob0_off = 0x200, > + .oob1_off = 0x204, > + .ecc0 = { > + .err_flag_bit = 2, > + .low = 3, > + .low_mask = 0x7F, > + .low_bn = 7, > + .high = 0, > + .high_mask = 0x0, > + }, > + .ecc1 = { > + .err_flag_bit = 18, > + .low = 19, > + .low_mask = 0x7F, > + .low_bn = 7, > + .high = 0, > + .high_mask = 0x0, > + }, > +}; > + > +static const struct of_device_id rk_nfc_id_table[] = { > + {.compatible = "rockchip,px30-nfc", > + .data = &nfc_v9_cfg }, { .compatible = .data = }, or { .compatible = , .data = }, but not: > + {.compatible = "rockchip,rk2928-nfc", > + .data = &nfc_v6_cfg }, > + {.compatible = "rockchip,rv1108-nfc", > + .data = &nfc_v8_cfg }, > + { /* sentinel */ } > +}; > +MODULE_DEVICE_TABLE(of, rk_nfc_id_table); > + > +static int rk_nfc_probe(struct platform_device *pdev) > +{ > + struct device *dev = &pdev->dev; > + struct rk_nfc *nfc; > + int ret, irq; > + > + nfc = devm_kzalloc(dev, sizeof(*nfc), GFP_KERNEL); > + if (!nfc) > + return -ENOMEM; > + > + nand_controller_init(&nfc->controller); > + INIT_LIST_HEAD(&nfc->chips); > + nfc->controller.ops = &rk_nfc_controller_ops; > + > + nfc->cfg = of_device_get_match_data(dev); > + nfc->dev = dev; > + > + init_completion(&nfc->done); > + > + nfc->regs = devm_platform_ioremap_resource(pdev, 0); > + if (IS_ERR(nfc->regs)) { > + ret = PTR_ERR(nfc->regs); > + goto release_nfc; > + } > + > + nfc->clk.nfc_clk = devm_clk_get(dev, "nfc"); > + if (IS_ERR(nfc->clk.nfc_clk)) { > + dev_dbg(dev, "no nfc clk\n"); > + /* Some earlier models, such as rk3066, have no nfc clk. */ > + } > + > + nfc->clk.ahb_clk = devm_clk_get(dev, "ahb"); > + if (IS_ERR(nfc->clk.ahb_clk)) { > + dev_err(dev, "no ahb clk\n"); > + ret = PTR_ERR(nfc->clk.ahb_clk); > + goto release_nfc; > + } > + > + ret = rk_nfc_enable_clk(dev, &nfc->clk); > + if (ret) > + goto release_nfc; > + > + irq = platform_get_irq(pdev, 0); > + if (irq < 0) { > + dev_err(dev, "no nfc irq resource\n"); > + ret = -EINVAL; > + goto clk_disable; > + } > + > + writel(0, nfc->regs + nfc->cfg->int_en_off); > + ret = devm_request_irq(dev, irq, rk_nfc_irq, 0x0, "rk-nand", nfc); > + if (ret) { > + dev_err(dev, "failed to request nfc irq\n"); > + goto clk_disable; > + } > + > + platform_set_drvdata(pdev, nfc); > + > + ret = rk_nfc_nand_chips_init(dev, nfc); > + if (ret) { > + dev_err(dev, "failed to init NAND chips\n"); > + goto clk_disable; > + } > + return 0; > + > +clk_disable: > + rk_nfc_disable_clk(&nfc->clk); > +release_nfc: > + return ret; > +} > + > +static int rk_nfc_remove(struct platform_device *pdev) > +{ > + struct rk_nfc *nfc = platform_get_drvdata(pdev); > + > + rk_nfc_chips_cleanup(nfc); > + rk_nfc_disable_clk(&nfc->clk); Don't you have DMA resources and !devm allocated buffers to free? > + > + return 0; > +} > + > +static int __maybe_unused rk_nfc_suspend(struct device *dev) > +{ > + struct rk_nfc *nfc = dev_get_drvdata(dev); > + > + rk_nfc_disable_clk(&nfc->clk); > + > + return 0; > +} > + > +static int __maybe_unused rk_nfc_resume(struct device *dev) > +{ > + struct rk_nfc *nfc = dev_get_drvdata(dev); > + struct rk_nfc_nand_chip *rknand; > + struct nand_chip *chip; > + int ret; > + u32 i; > + > + ret = rk_nfc_enable_clk(dev, &nfc->clk); > + if (ret) > + return ret; > + > + /* Reset NAND chip if VCC was powered off. */ > + list_for_each_entry(rknand, &nfc->chips, node) { > + chip = &rknand->chip; > + for (i = 0; i < rknand->nsels; i++) > + nand_reset(chip, i); I assume this is handled by the core already (please verify it) > + } > + > + return 0; > +} > + > +static const struct dev_pm_ops rk_nfc_pm_ops = { > + SET_SYSTEM_SLEEP_PM_OPS(rk_nfc_suspend, rk_nfc_resume) > +}; > + > +static struct platform_driver rk_nfc_driver = { > + .probe = rk_nfc_probe, > + .remove = rk_nfc_remove, > + .driver = { > + .name = "rockchip-nfc", > + .of_match_table = rk_nfc_id_table, > + .pm = &rk_nfc_pm_ops, > + }, > +}; > + > +module_platform_driver(rk_nfc_driver); > + > +MODULE_LICENSE("Dual MIT/GPL"); > +MODULE_AUTHOR("Yifeng Zhao "); > +MODULE_DESCRIPTION("Rockchip Nand Flash Controller Driver"); > +MODULE_ALIAS("platform:rockchip-nand-controller"); Thanks, Miquèl