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=-8.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,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 306D5C2D0DB for ; Wed, 22 Jan 2020 08:50:49 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 040742465B for ; Wed, 22 Jan 2020 08:50:48 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="RXseApVo" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 040742465B 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=bombadil.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=NdFa0yDuoDY9wVJ+mxJa4NBQu+QJPHtUuqwZxSGSUpI=; b=RXseApVo4QbBED iJNTzc6EAb834e9ke5I9DYfjXd+tymAccgqZ2Nuk3JnXbgktDP761LQ1vZdF93xfDGTSIZRBiRFF/ z3LbdjQ61OHtOZC8c7Y/77XIheV/fCYU4nPPPjKrYi8ijcl0/3zSexkPYScW+6RiAwAF0WBsj9VD2 lCIVsnUKIHEIvVrbzUlIOr3V9cYHHsQrw2v2utSySCA/XtS+nJLOcoTS57JmIwWWe5Z8ghXQIhrjo mg6KSjclf6Ao9DL6/4nTaAITbhzrCSj8FnZtnh8s5oIUlo+w9F1P94nVKqo4K4rZS1NiL2oCHQVBt cguZ9xIEyUqYCFWR1qTg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1iuBid-0001aF-Mx; Wed, 22 Jan 2020 08:50:35 +0000 Received: from relay3-d.mail.gandi.net ([217.70.183.195]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1iuBiZ-0001Z6-GN for linux-mtd@lists.infradead.org; Wed, 22 Jan 2020 08:50:34 +0000 X-Originating-IP: 90.76.211.102 Received: from xps13 (lfbn-tou-1-1151-102.w90-76.abo.wanadoo.fr [90.76.211.102]) (Authenticated sender: miquel.raynal@bootlin.com) by relay3-d.mail.gandi.net (Postfix) with ESMTPSA id 9027E6000E; Wed, 22 Jan 2020 08:50:21 +0000 (UTC) Date: Wed, 22 Jan 2020 09:50:20 +0100 From: Miquel Raynal To: Kamal Dasu Subject: Re: [PATCH V2 3/3] mtd: rawnand: brcmnand: Add support for flash-edu for dma transfers Message-ID: <20200122095020.4b916f34@xps13> In-Reply-To: <20200121200011.32296-3-kdasu.kdev@gmail.com> References: <20200121200011.32296-1-kdasu.kdev@gmail.com> <20200121200011.32296-3-kdasu.kdev@gmail.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-20200122_005031_824469_C63FA468 X-CRM114-Status: GOOD ( 25.26 ) 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: Vignesh Raghavendra , Richard Weinberger , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org, bcm-kernel-feedback-list@broadcom.com, linux-mtd@lists.infradead.org, Brian Norris , Sumit Semwal , linux-media@vger.kernel.org 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 SGkgS2FtYWwsCgpJJ20gZmluZSB3aXRoIHRoZSBwYXRjaCwgbml0cGlja2luZyBiZWxvdyA6KQoK S2FtYWwgRGFzdSA8a2Rhc3Uua2RldkBnbWFpbC5jb20+IHdyb3RlIG9uIFR1ZSwgMjEgSmFuIDIw MjAgMTU6MDA6MDgKLTA1MDA6Cgo+IExlZ2FjeSBtaXBzIHNvYyBwbGF0Zm9ybXMgdGhhdCBoYXZl IGNvbnRyb2xsZXIgdjUuMCBhbmQgNi4wIHVzZQo+IGZsYXNoLWVkdSBibG9jayBmb3IgZG1hIHRy YW5zZmVycy4gVGhpcyBjaGFuZ2UgYWRkcyBzdXBwb3J0IGZvcgo+IG5hbmQgZG1hIHRyYW5zZmVy cyB1c2luZyB0aGUgRURVIGJsb2NrLgo+IAo+IFNpZ25lZC1vZmYtYnk6IEthbWFsIERhc3UgPGtk YXN1LmtkZXZAZ21haWwuY29tPgo+IC0tLQo+ICBkcml2ZXJzL210ZC9uYW5kL3Jhdy9icmNtbmFu ZC9icmNtbmFuZC5jIHwgMjk2ICsrKysrKysrKysrKysrKysrKysrKystCj4gIDEgZmlsZSBjaGFu Z2VkLCAyOTAgaW5zZXJ0aW9ucygrKSwgNiBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9tdGQvbmFuZC9yYXcvYnJjbW5hbmQvYnJjbW5hbmQuYyBiL2RyaXZlcnMvbXRkL25h bmQvcmF3L2JyY21uYW5kL2JyY21uYW5kLmMKPiBpbmRleCAxYTY2YjFjZDUxYzAuLjYxMzQ3NjA3 ZjFkYSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL210ZC9uYW5kL3Jhdy9icmNtbmFuZC9icmNtbmFu ZC5jCj4gKysrIGIvZHJpdmVycy9tdGQvbmFuZC9yYXcvYnJjbW5hbmQvYnJjbW5hbmQuYwo+IEBA IC0xMDIsNiArMTAyLDQ1IEBAIHN0cnVjdCBicmNtX25hbmRfZG1hX2Rlc2Mgewo+ICAjZGVmaW5l IE5BTkRfQ1RSTF9SRFkJCQkoSU5URkNfQ1RMUl9SRUFEWSB8IElOVEZDX0ZMQVNIX1JFQURZKQo+ ICAjZGVmaW5lIE5BTkRfUE9MTF9TVEFUVVNfVElNRU9VVF9NUwkxMDAKPiAgCj4gKyNkZWZpbmUg RURVX0NNRF9XUklURSAgICAgICAgICAweDAwCj4gKyNkZWZpbmUgRURVX0NNRF9SRUFEICAgICAg ICAgICAweDAxCj4gKyNkZWZpbmUgRURVX1NUQVRVU19BQ1RJVkUgICAgICBCSVQoMCkKPiArI2Rl ZmluZSBFRFVfRVJSX1NUQVRVU19FUlJBQ0sgIEJJVCgwKQo+ICsjZGVmaW5lIEVEVV9ET05FX01B U0sJCUdFTk1BU0soMSwgMCkKPiArCj4gKyNkZWZpbmUgRURVX0NPTkZJR19NT0RFX05BTkQgICBC SVQoMCkKPiArI2RlZmluZSBFRFVfQ09ORklHX1NXQVBfQllURSAgIEJJVCgxKQo+ICsjaWZkZWYg Q09ORklHX0NQVV9CSUdfRU5ESUFOCj4gKyNkZWZpbmUgRURVX0NPTkZJR19TV0FQX0NGRyAgICAg RURVX0NPTkZJR19TV0FQX0JZVEUKPiArI2Vsc2UKPiArI2RlZmluZSBFRFVfQ09ORklHX1NXQVBf Q0ZHICAgICAwCj4gKyNlbmRpZgo+ICsKPiArLyogZWR1IHJlZ2lzdGVycyAqLwo+ICtlbnVtIGVk dV9yZWcgewo+ICsJRURVX0NPTkZJRyA9IDAsCj4gKwlFRFVfRFJBTV9BRERSLAo+ICsJRURVX0VY VF9BRERSLAo+ICsJRURVX0xFTkdUSCwKPiArCUVEVV9DTUQsCj4gKwlFRFVfU1RPUCwKPiArCUVE VV9TVEFUVVMsCj4gKwlFRFVfRE9ORSwKPiArCUVEVV9FUlJfU1RBVFVTLAo+ICt9Owo+ICsKPiAr c3RhdGljIGNvbnN0IHUxNiAgZWR1X3JlZ3NbXSA9IHsKPiArCVtFRFVfQ09ORklHXSA9IDB4MDAs Cj4gKwlbRURVX0RSQU1fQUREUl0gPSAweDA0LAo+ICsJW0VEVV9FWFRfQUREUl0gPSAweDA4LAo+ ICsJW0VEVV9MRU5HVEhdID0gMHgwYywKPiArCVtFRFVfQ01EXSA9IDB4MTAsCj4gKwlbRURVX1NU T1BdID0gMHgxNCwKPiArCVtFRFVfU1RBVFVTXSA9IDB4MTgsCj4gKwlbRURVX0RPTkVdID0gMHgx YywKPiArCVtFRFVfRVJSX1NUQVRVU10gPSAweDIwLAo+ICt9OwoKV2h5IG5vdCBkZWZpbmluZyB0 aGUgb2Zmc2V0cyBpbiB0aGUgZW51bSBkaXJlY3RseT8KCj4gKwo+ICAvKiBmbGFzaF9kbWEgcmVn aXN0ZXJzICovCj4gIGVudW0gZmxhc2hfZG1hX3JlZyB7Cj4gIAlGTEFTSF9ETUFfUkVWSVNJT04g PSAwLAo+IEBAIC0xNjcsNiArMjA2LDggQEAgZW51bSB7Cj4gIAlCUkNNTkFORF9IQVNfV1AJCQkJ PSBCSVQoMyksCj4gIH07Cj4gIAo+ICtzdHJ1Y3QgYnJjbW5hbmRfaG9zdDsKPiArCj4gIHN0cnVj dCBicmNtbmFuZF9jb250cm9sbGVyIHsKPiAgCXN0cnVjdCBkZXZpY2UJCSpkZXY7Cj4gIAlzdHJ1 Y3QgbmFuZF9jb250cm9sbGVyCWNvbnRyb2xsZXI7Cj4gQEAgLTE4NSwxNyArMjI2LDMyIEBAIHN0 cnVjdCBicmNtbmFuZF9jb250cm9sbGVyIHsKPiAgCj4gIAlpbnQJCQljbWRfcGVuZGluZzsKPiAg CWJvb2wJCQlkbWFfcGVuZGluZzsKPiArCWJvb2wgICAgICAgICAgICAgICAgICAgIGVkdV9wZW5k aW5nOwo+ICAJc3RydWN0IGNvbXBsZXRpb24JZG9uZTsKPiAgCXN0cnVjdCBjb21wbGV0aW9uCWRt YV9kb25lOwo+ICsJc3RydWN0IGNvbXBsZXRpb24gICAgICAgZWR1X2RvbmU7Cj4gIAo+ICAJLyog TGlzdCBvZiBOQU5EIGhvc3RzIChvbmUgZm9yIGVhY2ggY2hpcC1zZWxlY3QpICovCj4gIAlzdHJ1 Y3QgbGlzdF9oZWFkIGhvc3RfbGlzdDsKPiAgCj4gKwkvKiBFRFUgaW5mbywgcGVyLXRyYW5zYWN0 aW9uICovCj4gKwljb25zdCB1MTYgICAgICAgICAgICAgICAqZWR1X29mZnNldHM7Cj4gKwl2b2lk IF9faW9tZW0gICAgICAgICAgICAqZWR1X2Jhc2U7Cj4gKwl1bnNpZ25lZCBpbnQgICAgICAgICAg ICBlZHVfaXJxOwo+ICsJaW50ICAgICAgICAgICAgICAgICAgICAgZWR1X2NvdW50Owo+ICsJdTY0 ICAgICAgICAgICAgICAgICAgICAgZWR1X2RyYW1fYWRkcjsKPiArCXUzMiAgICAgICAgICAgICAg ICAgICAgIGVkdV9leHRfYWRkcjsKPiArCXUzMiAgICAgICAgICAgICAgICAgICAgIGVkdV9jbWQ7 Cj4gKwl1MzIgICAgICAgICAgICAgICAgICAgICBlZHVfY29uZmlnOwo+ICsKPiAgCS8qIGZsYXNo X2RtYSByZWcgKi8KPiAgCWNvbnN0IHUxNgkJKmZsYXNoX2RtYV9vZmZzZXRzOwo+ICAJc3RydWN0 IGJyY21fbmFuZF9kbWFfZGVzYyAqZG1hX2Rlc2M7Cj4gIAlkbWFfYWRkcl90CQlkbWFfcGE7Cj4g IAo+ICsJaW50ICgqZG1hX3RyYW5zKShzdHJ1Y3QgYnJjbW5hbmRfaG9zdCAqaG9zdCwgdTY0IGFk ZHIsIHUzMiAqYnVmLAo+ICsJCQkgdTMyIGxlbiwgdTggZG1hX2NtZCk7Cj4gKwo+ICAJLyogaW4t bWVtb3J5IGNhY2hlIG9mIHRoZSBGTEFTSF9DQUNIRSwgdXNlZCBvbmx5IGZvciBzb21lIGNvbW1h bmRzICovCj4gIAl1OAkJCWZsYXNoX2NhY2hlW0ZDX0JZVEVTXTsKPiAgCj4gQEAgLTIxNiw2ICsy NzIsNyBAQCBzdHJ1Y3QgYnJjbW5hbmRfY29udHJvbGxlciB7Cj4gIAl1MzIJCQluYW5kX2NzX25h bmRfeG9yOwo+ICAJdTMyCQkJY29ycl9zdGF0X3RocmVzaG9sZDsKPiAgCXUzMgkJCWZsYXNoX2Rt YV9tb2RlOwo+ICsJdTMyICAgICAgICAgICAgICAgICAgICAgZmxhc2hfZWR1X21vZGU7Cj4gIAli b29sCQkJcGlvX3BvbGxfbW9kZTsKPiAgfTsKPiAgCj4gQEAgLTY1Nyw2ICs3MTQsMjIgQEAgc3Rh dGljIGlubGluZSB2b2lkIGJyY21uYW5kX3dyaXRlX2ZjKHN0cnVjdCBicmNtbmFuZF9jb250cm9s bGVyICpjdHJsLAo+ICAJX19yYXdfd3JpdGVsKHZhbCwgY3RybC0+bmFuZF9mYyArIHdvcmQgKiA0 KTsKPiAgfQo+ICAKPiArc3RhdGljIGlubGluZSB2b2lkIGVkdV93cml0ZWwoc3RydWN0IGJyY21u YW5kX2NvbnRyb2xsZXIgKmN0cmwsCj4gKwkJCSAgICAgIGVudW0gZWR1X3JlZyByZWcsIHUzMiB2 YWwpCj4gK3sKPiArCXUxNiBvZmZzID0gY3RybC0+ZWR1X29mZnNldHNbcmVnXTsKPiArCj4gKwli cmNtbmFuZF93cml0ZWwodmFsLCBjdHJsLT5lZHVfYmFzZSArIG9mZnMpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgaW5saW5lIHUzMiBlZHVfcmVhZGwoc3RydWN0IGJyY21uYW5kX2NvbnRyb2xsZXIgKmN0 cmwsCj4gKwkJCSAgICBlbnVtIGVkdV9yZWcgcmVnKQo+ICt7Cj4gKwl1MTYgb2ZmcyA9IGN0cmwt PmVkdV9vZmZzZXRzW3JlZ107Cj4gKwo+ICsJcmV0dXJuIGJyY21uYW5kX3JlYWRsKGN0cmwtPmVk dV9iYXNlICsgb2Zmcyk7Cj4gK30KPiArCj4gIHN0YXRpYyB2b2lkIGJyY21uYW5kX2NsZWFyX2Vj Y19hZGRyKHN0cnVjdCBicmNtbmFuZF9jb250cm9sbGVyICpjdHJsKQo+ICB7Cj4gIAo+IEBAIC05 MjYsNiArOTk5LDE2IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBoYXNfZmxhc2hfZG1hKHN0cnVjdCBi cmNtbmFuZF9jb250cm9sbGVyICpjdHJsKQo+ICAJcmV0dXJuIGN0cmwtPmZsYXNoX2RtYV9iYXNl Owo+ICB9Cj4gIAo+ICtzdGF0aWMgaW5saW5lIGJvb2wgaGFzX2VkdShzdHJ1Y3QgYnJjbW5hbmRf Y29udHJvbGxlciAqY3RybCkKPiArewo+ICsJcmV0dXJuIGN0cmwtPmVkdV9iYXNlOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgaW5saW5lIGJvb2wgdXNlX2RtYShzdHJ1Y3QgYnJjbW5hbmRfY29udHJvbGxl ciAqY3RybCkKPiArewo+ICsJcmV0dXJuIGhhc19mbGFzaF9kbWEoY3RybCkgfHwgaGFzX2VkdShj dHJsKTsKPiArfQo+ICsKPiAgc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfY3RybF9pcnFzKHN0 cnVjdCBicmNtbmFuZF9jb250cm9sbGVyICpjdHJsKQo+ICB7Cj4gIAlpZiAoY3RybC0+cGlvX3Bv bGxfbW9kZSkKPiBAQCAtMTI5OSw2ICsxMzgyLDUyIEBAIHN0YXRpYyBpbnQgd3JpdGVfb29iX3Rv X3JlZ3Moc3RydWN0IGJyY21uYW5kX2NvbnRyb2xsZXIgKmN0cmwsIGludCBpLAo+ICAJcmV0dXJu IHRieXRlczsKPiAgfQo+ICAKPiArc3RhdGljIHZvaWQgYnJjbW5hbmRfZWR1X2luaXQoc3RydWN0 IGJyY21uYW5kX2NvbnRyb2xsZXIgKmN0cmwpCj4gK3sKPiArCS8qIGluaXRpYWxpemUgZWR1ICov Cj4gKwllZHVfd3JpdGVsKGN0cmwsIEVEVV9FUlJfU1RBVFVTLCAwKTsKPiArCWVkdV9yZWFkbChj dHJsLCBFRFVfRVJSX1NUQVRVUyk7Cj4gKwllZHVfd3JpdGVsKGN0cmwsIEVEVV9ET05FLCAwKTsK PiArCWVkdV93cml0ZWwoY3RybCwgRURVX0RPTkUsIDApOwo+ICsJZWR1X3dyaXRlbChjdHJsLCBF RFVfRE9ORSwgMCk7Cj4gKwllZHVfd3JpdGVsKGN0cmwsIEVEVV9ET05FLCAwKTsKPiArCWVkdV9y ZWFkbChjdHJsLCBFRFVfRE9ORSk7Cj4gK30KPiArCj4gKy8qIGVkdSBpcnEgKi8KPiArc3RhdGlj IGlycXJldHVybl90IGJyY21uYW5kX2VkdV9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKPiArewo+ ICsJc3RydWN0IGJyY21uYW5kX2NvbnRyb2xsZXIgKmN0cmwgPSBkYXRhOwo+ICsKPiArCWlmIChj dHJsLT5lZHVfY291bnQpIHsKPiArCQljdHJsLT5lZHVfY291bnQtLTsKPiArCQl3aGlsZSAoIShl ZHVfcmVhZGwoY3RybCwgRURVX0RPTkUpICYgRURVX0RPTkVfTUFTSykpCj4gKwkJCXVkZWxheSgx KTsKPiArCQllZHVfd3JpdGVsKGN0cmwsIEVEVV9ET05FLCAwKTsKPiArCQllZHVfcmVhZGwoY3Ry bCwgRURVX0RPTkUpOwo+ICsJfQo+ICsKPiArCWlmIChjdHJsLT5lZHVfY291bnQpIHsKPiArCQlj dHJsLT5lZHVfZHJhbV9hZGRyICs9IEZDX0JZVEVTOwo+ICsJCWN0cmwtPmVkdV9leHRfYWRkciAr PSBGQ19CWVRFUzsKPiArCj4gKwkJZWR1X3dyaXRlbChjdHJsLCBFRFVfRFJBTV9BRERSLCAodTMy KWN0cmwtPmVkdV9kcmFtX2FkZHIpOwo+ICsJCWVkdV9yZWFkbChjdHJsLCBFRFVfRFJBTV9BRERS KTsKPiArCQllZHVfd3JpdGVsKGN0cmwsIEVEVV9FWFRfQUREUiwgY3RybC0+ZWR1X2V4dF9hZGRy KTsKPiArCQllZHVfcmVhZGwoY3RybCwgRURVX0VYVF9BRERSKTsKPiArCj4gKwkJbWIoKTsgLyog Zmx1c2ggcHJldmlvdXMgd3JpdGVzICovCj4gKwkJZWR1X3dyaXRlbChjdHJsLCBFRFVfQ01ELCBj dHJsLT5lZHVfY21kKTsKPiArCQllZHVfcmVhZGwoY3RybCwgRURVX0NNRCk7Cj4gKwo+ICsJCXJl dHVybiBJUlFfSEFORExFRDsKPiArCX0KPiArCj4gKwljb21wbGV0ZSgmY3RybC0+ZWR1X2RvbmUp Owo+ICsKPiArCXJldHVybiBJUlFfSEFORExFRDsKPiArfQo+ICsKPiAgc3RhdGljIGlycXJldHVy bl90IGJyY21uYW5kX2N0bHJkeV9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKPiAgewo+ICAJc3Ry dWN0IGJyY21uYW5kX2NvbnRyb2xsZXIgKmN0cmwgPSBkYXRhOwo+IEBAIC0xMzA3LDYgKzE0MzYs MTYgQEAgc3RhdGljIGlycXJldHVybl90IGJyY21uYW5kX2N0bHJkeV9pcnEoaW50IGlycSwgdm9p ZCAqZGF0YSkKPiAgCWlmIChjdHJsLT5kbWFfcGVuZGluZykKPiAgCQlyZXR1cm4gSVJRX0hBTkRM RUQ7Cj4gIAo+ICsJLyogY2hlY2sgaWYgeW91IG5lZWQgdG8gcGlnZ3kgYmFjayBvbiB0aGUgY3Ry bHJkeSBpcnEgKi8KPiArCWlmIChjdHJsLT5lZHVfcGVuZGluZykgewo+ICsJCWlmIChpcnEgPT0g Y3RybC0+aXJxICYmICgoaW50KWN0cmwtPmVkdV9pcnEgPj0gMCkpCj4gKwkvKiBEaXNjYXJkIGlu dGVycnVwdHMgd2hpbGUgdXNpbmcgZGVkaWNhdGVkIGVkdSBpcnEgKi8KPiArCQkJcmV0dXJuIElS UV9IQU5ETEVEOwo+ICsKPiArCS8qIG5vIHJlZ2lzdGVyZWQgZWR1IGlycSwgY2FsbCBoYW5kbGVy ICovCj4gKwkJcmV0dXJuIGJyY21uYW5kX2VkdV9pcnEoaXJxLCBkYXRhKTsKPiArCX0KPiArCj4g IAljb21wbGV0ZSgmY3RybC0+ZG9uZSk7Cj4gIAlyZXR1cm4gSVJRX0hBTkRMRUQ7Cj4gIH0KPiBA QCAtMTY0NCw2ICsxNzgzLDgzIEBAIHN0YXRpYyB2b2lkIGJyY21uYW5kX3dyaXRlX2J1ZihzdHJ1 Y3QgbmFuZF9jaGlwICpjaGlwLCBjb25zdCB1aW50OF90ICpidWYsCj4gIAl9Cj4gIH0KPiAgCj4g Ky8qKgo+ICsgKiAgS2ljayBFRFUgZW5naW5lCj4gKyAqLwo+ICtzdGF0aWMgaW50IGJyY21uYW5k X2VkdV90cmFucyhzdHJ1Y3QgYnJjbW5hbmRfaG9zdCAqaG9zdCwgdTY0IGFkZHIsIHUzMiAqYnVm LAo+ICsJCQkgICAgICB1MzIgbGVuLCB1OCBjbWQpCj4gK3sKPiArCXN0cnVjdCBicmNtbmFuZF9j b250cm9sbGVyICpjdHJsID0gaG9zdC0+Y3RybDsKPiArCXVuc2lnbmVkIGxvbmcgdGltZW8gPSBt c2Vjc190b19qaWZmaWVzKDIwMCk7Cj4gKwlpbnQgcmV0ID0gMDsKPiArCWludCBkaXIgPSAoY21k ID09IENNRF9QQUdFX1JFQUQgPyBETUFfRlJPTV9ERVZJQ0UgOiBETUFfVE9fREVWSUNFKTsKPiAr CXU4IGVkdV9jbWQgPSAoY21kID09IENNRF9QQUdFX1JFQUQgPyBFRFVfQ01EX1JFQUQgOiBFRFVf Q01EX1dSSVRFKTsKPiArCXVuc2lnbmVkIGludCB0cmFucyA9IGxlbiA+PiBGQ19TSElGVDsKPiAr CWRtYV9hZGRyX3QgcGE7Cj4gKwo+ICsJcGEgPSBkbWFfbWFwX3NpbmdsZShjdHJsLT5kZXYsIGJ1 ZiwgbGVuLCBkaXIpOwo+ICsJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGN0cmwtPmRldiwgcGEpKSB7 Cj4gKwkJZGV2X2VycihjdHJsLT5kZXYsICJ1bmFibGUgdG8gbWFwIGJ1ZmZlciBmb3IgRURVIERN QVxuIik7Cj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4gKwl9Cj4gKwo+ICsJY3RybC0+ZWR1X3BlbmRp bmcgPSB0cnVlOwo+ICsJbWIoKTsgLyogZmx1c2ggcHJldmlvdXMgd3JpdGVzICovCgpJJ2QgcHJl ZmVyIHRvIGhhdmUgdGhlIGJhcnJpZXJzIHJpZ2h0IGFmdGVyIHRoZSBJTyBhY2Nlc3MuIEkgZG9u J3QKdGhpbmsgaXQgY2hhbmdlcyBhbnl0aGluZyBidXQgdGhhdCB3b3VsZCBlYXNlIHVuZGVyc3Rh bmQgd2hhdCB3cml0ZXMKYXJlIHlvdSBjb25jZXJuZWQgYWJvdXQuIEFsc28sIG1heWJlIHlvdSBj YW4gdXNlIG5vbiBfcmVsYXhlZCBhY2Nlc3NvcnMKYXMgeW91IHVzdWFsbHkgd3JpdGVsL3JlYWRs IGluIHJhdywgSSBkb24ndCB0aGluayB5b3UgYWN0dWFsbHkgbmVlZCBhCmJhcnJpZXIgaW4gdGhp cyBjYXNlLgoKPiArCj4gKwljdHJsLT5lZHVfZHJhbV9hZGRyID0gcGE7Cj4gKwljdHJsLT5lZHVf ZXh0X2FkZHIgPSBhZGRyOwo+ICsJY3RybC0+ZWR1X2NtZCA9IGVkdV9jbWQ7Cj4gKwljdHJsLT5l ZHVfY291bnQgPSB0cmFuczsKPiArCj4gKwllZHVfd3JpdGVsKGN0cmwsIEVEVV9EUkFNX0FERFIs ICh1MzIpY3RybC0+ZWR1X2RyYW1fYWRkcik7Cj4gKwllZHVfcmVhZGwoY3RybCwgIEVEVV9EUkFN X0FERFIpOwo+ICsJZWR1X3dyaXRlbChjdHJsLCBFRFVfRVhUX0FERFIsIGN0cmwtPmVkdV9leHRf YWRkcik7Cj4gKwllZHVfcmVhZGwoY3RybCwgRURVX0VYVF9BRERSKTsKPiArCWVkdV93cml0ZWwo Y3RybCwgRURVX0xFTkdUSCwgRkNfQllURVMpOwo+ICsJZWR1X3JlYWRsKGN0cmwsIEVEVV9MRU5H VEgpOwo+ICsKPiArCS8qIFN0YXJ0IGVkdSBlbmdpbmUgKi8KPiArCW1iKCk7IC8qIGZsdXNoIHBy ZXZpb3VzIHdyaXRlcyAqLwo+ICsJZWR1X3dyaXRlbChjdHJsLCBFRFVfQ01ELCBjdHJsLT5lZHVf Y21kKTsKPiArCWVkdV9yZWFkbChjdHJsLCBFRFVfQ01EKTsKPiArCj4gKwlpZiAod2FpdF9mb3Jf Y29tcGxldGlvbl90aW1lb3V0KCZjdHJsLT5lZHVfZG9uZSwgdGltZW8pIDw9IDApIHsKPiArCQlk ZXZfZXJyKGN0cmwtPmRldiwKPiArCQkJInRpbWVvdXQgd2FpdGluZyBmb3IgRURVOyBzdGF0dXMg JSN4LCBlcnJvciBzdGF0dXMgJSN4XG4iLAo+ICsJCQllZHVfcmVhZGwoY3RybCwgRURVX1NUQVRV UyksCj4gKwkJCWVkdV9yZWFkbChjdHJsLCBFRFVfRVJSX1NUQVRVUykpOwo+ICsJfQo+ICsKPiAr CWRtYV91bm1hcF9zaW5nbGUoY3RybC0+ZGV2LCBwYSwgbGVuLCBkaXIpOwo+ICsKPiArCS8qIGZv ciBwcm9ncmFtIHBhZ2UgY2hlY2sgTkFORCBzdGF0dXMgKi8KPiArCWlmICgoKGJyY21uYW5kX3Jl YWRfcmVnKGN0cmwsIEJSQ01OQU5EX0lOVEZDX1NUQVRVUykgJgo+ICsJICAgICAgSU5URkNfRkxB U0hfU1RBVFVTKSAmIE5BTkRfU1RBVFVTX0ZBSUwpICYmCj4gKwkgICAgZWR1X2NtZCA9PSBFRFVf Q01EX1dSSVRFKSB7Cj4gKwkJZGV2X2luZm8oY3RybC0+ZGV2LCAicHJvZ3JhbSBmYWlsZWQgYXQg JWxseFxuIiwKPiArCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpYWRkcik7Cj4gKwkJcmV0ID0gLUVJ TzsKPiArCX0KPiArCj4gKwkvKiBNYWtlIHN1cmUgdGhlIEVEVSBzdGF0dXMgaXMgY2xlYW4gKi8K PiArCWlmIChlZHVfcmVhZGwoY3RybCwgRURVX1NUQVRVUykgJiBFRFVfU1RBVFVTX0FDVElWRSkK PiArCQlkZXZfd2FybihjdHJsLT5kZXYsICJFRFUgc3RpbGwgYWN0aXZlOiAlI3hcbiIsCj4gKwkJ CSBlZHVfcmVhZGwoY3RybCwgRURVX1NUQVRVUykpOwo+ICsKPiArCWlmICh1bmxpa2VseShlZHVf cmVhZGwoY3RybCwgRURVX0VSUl9TVEFUVVMpICYgRURVX0VSUl9TVEFUVVNfRVJSQUNLKSkgewo+ ICsJCWRldl93YXJuKGN0cmwtPmRldiwgIkVEVSBSQlVTIGVycm9yIGF0IGFkZHIgJWxseFxuIiwK PiArCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpYWRkcik7Cj4gKwkJcmV0ID0gLUVJTzsKPiArCX0K PiArCj4gKwljdHJsLT5lZHVfcGVuZGluZyA9IGZhbHNlOwo+ICsJYnJjbW5hbmRfZWR1X2luaXQo Y3RybCk7Cj4gKwllZHVfd3JpdGVsKGN0cmwsIEVEVV9TVE9QLCAwKTsgLyogZm9yY2Ugc3RvcCAq Lwo+ICsJZWR1X3JlYWRsKGN0cmwsIEVEVV9TVE9QKTsKPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9 Cj4gKwo+ICAvKioKPiAgICogQ29uc3RydWN0IGEgRkxBU0hfRE1BIGRlc2NyaXB0b3IgYXMgcGFy dCBvZiBhIGxpbmtlZCBsaXN0LiBZb3UgbXVzdCBrbm93IHRoZQo+ICAgKiBmb2xsb3dpbmcgYWhl YWQgb2YgdGltZToKPiBAQCAtMTg1MCw5ICsyMDY2LDExIEBAIHN0YXRpYyBpbnQgYnJjbW5hbmRf cmVhZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKPiAgdHJ5 X2RtYXJlYWQ6Cj4gIAlicmNtbmFuZF9jbGVhcl9lY2NfYWRkcihjdHJsKTsKPiAgCj4gLQlpZiAo aGFzX2ZsYXNoX2RtYShjdHJsKSAmJiAhb29iICYmIGZsYXNoX2RtYV9idWZfb2soYnVmKSkgewo+ IC0JCWVyciA9IGJyY21uYW5kX2RtYV90cmFucyhob3N0LCBhZGRyLCBidWYsIHRyYW5zICogRkNf QllURVMsCj4gLQkJCQkJICAgICBDTURfUEFHRV9SRUFEKTsKPiArCWlmIChjdHJsLT5kbWFfdHJh bnMgJiYgIW9vYiAmJiBmbGFzaF9kbWFfYnVmX29rKGJ1ZikpIHsKPiArCQllcnIgPSBjdHJsLT5k bWFfdHJhbnMoaG9zdCwgYWRkciwgYnVmLAo+ICsJCQkJICAgICAgdHJhbnMgKiBGQ19CWVRFUywK PiArCQkJCSAgICAgIENNRF9QQUdFX1JFQUQpOwo+ICsKPiAgCQlpZiAoZXJyKSB7Cj4gIAkJCWlm IChtdGRfaXNfYml0ZmxpcF9vcl9lY2NlcnIoZXJyKSkKPiAgCQkJCWVycl9hZGRyID0gYWRkcjsK PiBAQCAtMTk4OCwxMCArMjIwNiwxMiBAQCBzdGF0aWMgaW50IGJyY21uYW5kX3dyaXRlKHN0cnVj dCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAo+ICAJZm9yIChpID0gMDsg aSA8IGN0cmwtPm1heF9vb2I7IGkgKz0gNCkKPiAgCQlvb2JfcmVnX3dyaXRlKGN0cmwsIGksIDB4 ZmZmZmZmZmYpOwo+ICAKPiAtCWlmIChoYXNfZmxhc2hfZG1hKGN0cmwpICYmICFvb2IgJiYgZmxh c2hfZG1hX2J1Zl9vayhidWYpKSB7Cj4gLQkJaWYgKGJyY21uYW5kX2RtYV90cmFucyhob3N0LCBh ZGRyLCAodTMyICopYnVmLAo+IC0JCQkJCW10ZC0+d3JpdGVzaXplLCBDTURfUFJPR1JBTV9QQUdF KSkKPiArCWlmICh1c2VfZG1hKGN0cmwpICYmICFvb2IgJiYgZmxhc2hfZG1hX2J1Zl9vayhidWYp KSB7Cj4gKwkJaWYgKGN0cmwtPmRtYV90cmFucyhob3N0LCBhZGRyLCAodTMyICopYnVmLCBtdGQt PndyaXRlc2l6ZSwKPiArCQkJCSAgICBDTURfUFJPR1JBTV9QQUdFKSkKPiArCj4gIAkJCXJldCA9 IC1FSU87Cj4gKwo+ICAJCWdvdG8gb3V0Owo+ICAJfQo+ICAKPiBAQCAtMjQ5NCw2ICsyNzE0LDgg QEAgc3RhdGljIGludCBicmNtbmFuZF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKPiAgCj4g IAlpZiAoaGFzX2ZsYXNoX2RtYShjdHJsKSkKPiAgCQljdHJsLT5mbGFzaF9kbWFfbW9kZSA9IGZs YXNoX2RtYV9yZWFkbChjdHJsLCBGTEFTSF9ETUFfTU9ERSk7Cj4gKwllbHNlIGlmIChoYXNfZWR1 KGN0cmwpKQo+ICsJCWN0cmwtPmVkdV9jb25maWcgPSBlZHVfcmVhZGwoY3RybCwgRURVX0NPTkZJ Ryk7Cj4gIAo+ICAJcmV0dXJuIDA7Cj4gIH0KPiBAQCAtMjUwOCw2ICsyNzMwLDE0IEBAIHN0YXRp YyBpbnQgYnJjbW5hbmRfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKPiAgCQlmbGFzaF9kbWFf d3JpdGVsKGN0cmwsIEZMQVNIX0RNQV9FUlJPUl9TVEFUVVMsIDApOwo+ICAJfQo+ICAKPiArCWlm IChoYXNfZWR1KGN0cmwpKQo+ICsJCWN0cmwtPmVkdV9jb25maWcgPSBlZHVfcmVhZGwoY3RybCwg RURVX0NPTkZJRyk7Cj4gKwllbHNlIHsKPiArCQllZHVfd3JpdGVsKGN0cmwsIEVEVV9DT05GSUcs IGN0cmwtPmVkdV9jb25maWcpOwo+ICsJCWVkdV9yZWFkbChjdHJsLCBFRFVfQ09ORklHKTsKPiAr CQlicmNtbmFuZF9lZHVfaW5pdChjdHJsKTsKPiArCX0KPiArCj4gIAlicmNtbmFuZF93cml0ZV9y ZWcoY3RybCwgQlJDTU5BTkRfQ1NfU0VMRUNULCBjdHJsLT5uYW5kX2NzX25hbmRfc2VsZWN0KTsK PiAgCWJyY21uYW5kX3dyaXRlX3JlZyhjdHJsLCBCUkNNTkFORF9DU19YT1IsIGN0cmwtPm5hbmRf Y3NfbmFuZF94b3IpOwo+ICAJYnJjbW5hbmRfd3JpdGVfcmVnKGN0cmwsIEJSQ01OQU5EX0NPUlJf VEhSRVNIT0xELAo+IEBAIC0yNTUzLDYgKzI3ODMsNTIgQEAgTU9EVUxFX0RFVklDRV9UQUJMRShv ZiwgYnJjbW5hbmRfb2ZfbWF0Y2gpOwo+ICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKPiAgICogUGxhdGZvcm0g ZHJpdmVyIHNldHVwIChwZXIgY29udHJvbGxlcikKPiAgICoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwo+ICtzdGF0 aWMgaW50IGJyY21uYW5kX2VkdV9zZXR1cChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ ICt7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2Owo+ICsJc3RydWN0IGJyY21u YW5kX2NvbnRyb2xsZXIgKmN0cmwgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7Cj4gKwlz dHJ1Y3QgcmVzb3VyY2UgKnJlczsKPiArCWludCByZXQ7Cj4gKwo+ICsJcmVzID0gcGxhdGZvcm1f Z2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgImZsYXNoLWVkdSIpOwo+ ICsJaWYgKHJlcykgewo+ICsJCWN0cmwtPmVkdV9iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNl KGRldiwgcmVzKTsKPiArCQlpZiAoSVNfRVJSKGN0cmwtPmVkdV9iYXNlKSkKPiArCQkJcmV0dXJu IFBUUl9FUlIoY3RybC0+ZWR1X2Jhc2UpOwo+ICsKPiArCQljdHJsLT5lZHVfb2Zmc2V0cyA9IGVk dV9yZWdzOwo+ICsKPiArCQllZHVfd3JpdGVsKGN0cmwsIEVEVV9DT05GSUcsIEVEVV9DT05GSUdf TU9ERV9OQU5EIHwKPiArCQkJICAgRURVX0NPTkZJR19TV0FQX0NGRyk7Cj4gKwkJZWR1X3JlYWRs KGN0cmwsIEVEVV9DT05GSUcpOwo+ICsKPiArCQkvKiBpbml0aWFsaXplIGVkdSAqLwo+ICsJCWJy Y21uYW5kX2VkdV9pbml0KGN0cmwpOwo+ICsKPiArCQljdHJsLT5lZHVfaXJxID0gcGxhdGZvcm1f Z2V0X2lycV9vcHRpb25hbChwZGV2LCAxKTsKPiArCQlpZiAoKGludCljdHJsLT5lZHVfaXJxIDwg MCkgewoKV2h5IG5vdCBkZWNsYXJpbmcgaXQgYXMgYW4gaW50IGRpcmVjdGx5PyBJIHRoaW5rIGl0 J3MgcHJlZmVycmVkLgoKPiArCQkJZGV2X3dhcm4oZGV2LAo+ICsJCQkJICJGTEFTSCBFRFUgZW5h YmxlZCwgdXNpbmcgY3RscmR5IGlycVxuIik7Cj4gKwkJfSBlbHNlIHsKPiArCQkJcmV0ID0gZGV2 bV9yZXF1ZXN0X2lycShkZXYsIGN0cmwtPmVkdV9pcnEsCj4gKwkJCQkJICAgICAgIGJyY21uYW5k X2VkdV9pcnEsIDAsCj4gKwkJCQkJICAgICAgICJicmNtbmFuZC1lZHUiLCBjdHJsKTsKPiArCQkJ aWYgKHJldCA8IDApIHsKPiArCQkJCWRldl9lcnIoY3RybC0+ZGV2LCAiY2FuJ3QgYWxsb2NhdGUg SVJRICVkOiBlcnJvciAlZFxuIiwKPiArCQkJCQljdHJsLT5lZHVfaXJxLCByZXQpOwo+ICsJCQkJ cmV0dXJuIHJldDsKPiArCQkJfQo+ICsKPiArCQkJZGV2X2luZm8oZGV2LCAiRkxBU0ggRURVIGVu YWJsZWQgdXNpbmcgaXJxICV1XG4iLAo+ICsJCQkJIGN0cmwtPmVkdV9pcnEpOwo+ICsJCX0KPiAr Cj4gKwkJLyogc2V0IHRoZSBhcHByb3ByaWF0ZSBlZHUgdHJhbnNmZXIgZnVuY3Rpb24gdG8gY2Fs bCAqLwo+ICsJCWN0cmwtPmRtYV90cmFucyA9IGJyY21uYW5kX2VkdV90cmFuczsKPiArCX0KPiAr Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICAKPiAgaW50IGJyY21uYW5kX3Byb2JlKHN0cnVjdCBwbGF0 Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBicmNtbmFuZF9zb2MgKnNvYykKPiAgewo+IEBAIC0y NTc4LDYgKzI4NTQsNyBAQCBpbnQgYnJjbW5hbmRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSAqcGRldiwgc3RydWN0IGJyY21uYW5kX3NvYyAqc29jKQo+ICAKPiAgCWluaXRfY29tcGxldGlv bigmY3RybC0+ZG9uZSk7Cj4gIAlpbml0X2NvbXBsZXRpb24oJmN0cmwtPmRtYV9kb25lKTsKPiAr CWluaXRfY29tcGxldGlvbigmY3RybC0+ZWR1X2RvbmUpOwo+ICAJbmFuZF9jb250cm9sbGVyX2lu aXQoJmN0cmwtPmNvbnRyb2xsZXIpOwo+ICAJY3RybC0+Y29udHJvbGxlci5vcHMgPSAmYnJjbW5h bmRfY29udHJvbGxlcl9vcHM7Cj4gIAlJTklUX0xJU1RfSEVBRCgmY3RybC0+aG9zdF9saXN0KTsK PiBAQCAtMjYyMyw2ICsyOTAwLDcgQEAgaW50IGJyY21uYW5kX3Byb2JlKHN0cnVjdCBwbGF0Zm9y bV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBicmNtbmFuZF9zb2MgKnNvYykKPiAgCQkJCWN0cmwtPnJl Z19vZmZzZXRzW0JSQ01OQU5EX0ZDX0JBU0VdOwo+ICAJfQo+ICAKPiArCWN0cmwtPmRtYV90cmFu cyA9IE5VTEw7Cj4gIAkvKiBGTEFTSF9ETUEgKi8KPiAgCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNv dXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJmbGFzaC1kbWEiKTsKPiAgCWlmIChy ZXMpIHsKPiBAQCAtMjY2NSw2ICsyOTQzLDEyIEBAIGludCBicmNtbmFuZF9wcm9iZShzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgYnJjbW5hbmRfc29jICpzb2MpCj4gIAkJfQo+ ICAKPiAgCQlkZXZfaW5mbyhkZXYsICJlbmFibGluZyBGTEFTSF9ETUFcbiIpOwo+ICsJCS8qIHNl dCB0aGUgYXBwcm9wcmlhdGUgZmxhc2ggZG1hIHRyYW5zZmVyIGZ1bmN0aW9uIHRvIGNhbGwgKi8K PiArCQljdHJsLT5kbWFfdHJhbnMgPSBicmNtbmFuZF9kbWFfdHJhbnM7Cj4gKwl9IGVsc2UJewo+ ICsJCXJldCA9IGJyY21uYW5kX2VkdV9zZXR1cChwZGV2KTsKPiArCQlpZiAocmV0IDwgMCkKPiAr CQkJZ290byBlcnI7CgpOaXRwaWNraW5nOiB5b3UgY291bGQgZHJvcCB0aGUgaW5pdGlhbGl6YXRp b24gb2YgZG1hX3RyYW5zIHRvIE5VTEwgYW5kCmFzc2lnbiBjdHJsLT5kbWFfdHJhbnMgaW4gYm90 aCBjYXNlcyBvZiB0aGlzIGlmL2Vsc2UgYmxvY2sgKGJ5IG1vdmluZwppdCBvdXQgb2YgdGhlIGJy Y21uYW5kX2VkdV9zZXR1cCgpKS4gSSB0aGluayBpdCBlbmhhbmNlcyByZWFkYWJpbGl0eS4KCj4g IAl9Cj4gIAo+ICAJLyogRGlzYWJsZSBhdXRvbWF0aWMgZGV2aWNlIElEIGNvbmZpZywgZGlyZWN0 IGFkZHJlc3NpbmcgKi8KCgpUaGFua3MsCk1pcXXDqGwKCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eCBNVEQgZGlzY3Vzc2lvbiBtYWls aW5nIGxpc3QKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51 eC1tdGQvCg== 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=-8.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, 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 91848C2D0DB for ; Wed, 22 Jan 2020 08:50:35 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6372C2465A for ; Wed, 22 Jan 2020 08:50:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726135AbgAVIu3 convert rfc822-to-8bit (ORCPT ); Wed, 22 Jan 2020 03:50:29 -0500 Received: from relay3-d.mail.gandi.net ([217.70.183.195]:50359 "EHLO relay3-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725883AbgAVIu2 (ORCPT ); Wed, 22 Jan 2020 03:50:28 -0500 X-Originating-IP: 90.76.211.102 Received: from xps13 (lfbn-tou-1-1151-102.w90-76.abo.wanadoo.fr [90.76.211.102]) (Authenticated sender: miquel.raynal@bootlin.com) by relay3-d.mail.gandi.net (Postfix) with ESMTPSA id 9027E6000E; Wed, 22 Jan 2020 08:50:21 +0000 (UTC) Date: Wed, 22 Jan 2020 09:50:20 +0100 From: Miquel Raynal To: Kamal Dasu Cc: linux-mtd@lists.infradead.org, bcm-kernel-feedback-list@broadcom.com, linux-kernel@vger.kernel.org, Brian Norris , Richard Weinberger , Vignesh Raghavendra , Sumit Semwal , linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org Subject: Re: [PATCH V2 3/3] mtd: rawnand: brcmnand: Add support for flash-edu for dma transfers Message-ID: <20200122095020.4b916f34@xps13> In-Reply-To: <20200121200011.32296-3-kdasu.kdev@gmail.com> References: <20200121200011.32296-1-kdasu.kdev@gmail.com> <20200121200011.32296-3-kdasu.kdev@gmail.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: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org Hi Kamal, I'm fine with the patch, nitpicking below :) Kamal Dasu wrote on Tue, 21 Jan 2020 15:00:08 -0500: > Legacy mips soc platforms that have controller v5.0 and 6.0 use > flash-edu block for dma transfers. This change adds support for > nand dma transfers using the EDU block. > > Signed-off-by: Kamal Dasu > --- > drivers/mtd/nand/raw/brcmnand/brcmnand.c | 296 ++++++++++++++++++++++- > 1 file changed, 290 insertions(+), 6 deletions(-) > > diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c b/drivers/mtd/nand/raw/brcmnand/brcmnand.c > index 1a66b1cd51c0..61347607f1da 100644 > --- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c > +++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c > @@ -102,6 +102,45 @@ struct brcm_nand_dma_desc { > #define NAND_CTRL_RDY (INTFC_CTLR_READY | INTFC_FLASH_READY) > #define NAND_POLL_STATUS_TIMEOUT_MS 100 > > +#define EDU_CMD_WRITE 0x00 > +#define EDU_CMD_READ 0x01 > +#define EDU_STATUS_ACTIVE BIT(0) > +#define EDU_ERR_STATUS_ERRACK BIT(0) > +#define EDU_DONE_MASK GENMASK(1, 0) > + > +#define EDU_CONFIG_MODE_NAND BIT(0) > +#define EDU_CONFIG_SWAP_BYTE BIT(1) > +#ifdef CONFIG_CPU_BIG_ENDIAN > +#define EDU_CONFIG_SWAP_CFG EDU_CONFIG_SWAP_BYTE > +#else > +#define EDU_CONFIG_SWAP_CFG 0 > +#endif > + > +/* edu registers */ > +enum edu_reg { > + EDU_CONFIG = 0, > + EDU_DRAM_ADDR, > + EDU_EXT_ADDR, > + EDU_LENGTH, > + EDU_CMD, > + EDU_STOP, > + EDU_STATUS, > + EDU_DONE, > + EDU_ERR_STATUS, > +}; > + > +static const u16 edu_regs[] = { > + [EDU_CONFIG] = 0x00, > + [EDU_DRAM_ADDR] = 0x04, > + [EDU_EXT_ADDR] = 0x08, > + [EDU_LENGTH] = 0x0c, > + [EDU_CMD] = 0x10, > + [EDU_STOP] = 0x14, > + [EDU_STATUS] = 0x18, > + [EDU_DONE] = 0x1c, > + [EDU_ERR_STATUS] = 0x20, > +}; Why not defining the offsets in the enum directly? > + > /* flash_dma registers */ > enum flash_dma_reg { > FLASH_DMA_REVISION = 0, > @@ -167,6 +206,8 @@ enum { > BRCMNAND_HAS_WP = BIT(3), > }; > > +struct brcmnand_host; > + > struct brcmnand_controller { > struct device *dev; > struct nand_controller controller; > @@ -185,17 +226,32 @@ struct brcmnand_controller { > > int cmd_pending; > bool dma_pending; > + bool edu_pending; > struct completion done; > struct completion dma_done; > + struct completion edu_done; > > /* List of NAND hosts (one for each chip-select) */ > struct list_head host_list; > > + /* EDU info, per-transaction */ > + const u16 *edu_offsets; > + void __iomem *edu_base; > + unsigned int edu_irq; > + int edu_count; > + u64 edu_dram_addr; > + u32 edu_ext_addr; > + u32 edu_cmd; > + u32 edu_config; > + > /* flash_dma reg */ > const u16 *flash_dma_offsets; > struct brcm_nand_dma_desc *dma_desc; > dma_addr_t dma_pa; > > + int (*dma_trans)(struct brcmnand_host *host, u64 addr, u32 *buf, > + u32 len, u8 dma_cmd); > + > /* in-memory cache of the FLASH_CACHE, used only for some commands */ > u8 flash_cache[FC_BYTES]; > > @@ -216,6 +272,7 @@ struct brcmnand_controller { > u32 nand_cs_nand_xor; > u32 corr_stat_threshold; > u32 flash_dma_mode; > + u32 flash_edu_mode; > bool pio_poll_mode; > }; > > @@ -657,6 +714,22 @@ static inline void brcmnand_write_fc(struct brcmnand_controller *ctrl, > __raw_writel(val, ctrl->nand_fc + word * 4); > } > > +static inline void edu_writel(struct brcmnand_controller *ctrl, > + enum edu_reg reg, u32 val) > +{ > + u16 offs = ctrl->edu_offsets[reg]; > + > + brcmnand_writel(val, ctrl->edu_base + offs); > +} > + > +static inline u32 edu_readl(struct brcmnand_controller *ctrl, > + enum edu_reg reg) > +{ > + u16 offs = ctrl->edu_offsets[reg]; > + > + return brcmnand_readl(ctrl->edu_base + offs); > +} > + > static void brcmnand_clear_ecc_addr(struct brcmnand_controller *ctrl) > { > > @@ -926,6 +999,16 @@ static inline bool has_flash_dma(struct brcmnand_controller *ctrl) > return ctrl->flash_dma_base; > } > > +static inline bool has_edu(struct brcmnand_controller *ctrl) > +{ > + return ctrl->edu_base; > +} > + > +static inline bool use_dma(struct brcmnand_controller *ctrl) > +{ > + return has_flash_dma(ctrl) || has_edu(ctrl); > +} > + > static inline void disable_ctrl_irqs(struct brcmnand_controller *ctrl) > { > if (ctrl->pio_poll_mode) > @@ -1299,6 +1382,52 @@ static int write_oob_to_regs(struct brcmnand_controller *ctrl, int i, > return tbytes; > } > > +static void brcmnand_edu_init(struct brcmnand_controller *ctrl) > +{ > + /* initialize edu */ > + edu_writel(ctrl, EDU_ERR_STATUS, 0); > + edu_readl(ctrl, EDU_ERR_STATUS); > + edu_writel(ctrl, EDU_DONE, 0); > + edu_writel(ctrl, EDU_DONE, 0); > + edu_writel(ctrl, EDU_DONE, 0); > + edu_writel(ctrl, EDU_DONE, 0); > + edu_readl(ctrl, EDU_DONE); > +} > + > +/* edu irq */ > +static irqreturn_t brcmnand_edu_irq(int irq, void *data) > +{ > + struct brcmnand_controller *ctrl = data; > + > + if (ctrl->edu_count) { > + ctrl->edu_count--; > + while (!(edu_readl(ctrl, EDU_DONE) & EDU_DONE_MASK)) > + udelay(1); > + edu_writel(ctrl, EDU_DONE, 0); > + edu_readl(ctrl, EDU_DONE); > + } > + > + if (ctrl->edu_count) { > + ctrl->edu_dram_addr += FC_BYTES; > + ctrl->edu_ext_addr += FC_BYTES; > + > + edu_writel(ctrl, EDU_DRAM_ADDR, (u32)ctrl->edu_dram_addr); > + edu_readl(ctrl, EDU_DRAM_ADDR); > + edu_writel(ctrl, EDU_EXT_ADDR, ctrl->edu_ext_addr); > + edu_readl(ctrl, EDU_EXT_ADDR); > + > + mb(); /* flush previous writes */ > + edu_writel(ctrl, EDU_CMD, ctrl->edu_cmd); > + edu_readl(ctrl, EDU_CMD); > + > + return IRQ_HANDLED; > + } > + > + complete(&ctrl->edu_done); > + > + return IRQ_HANDLED; > +} > + > static irqreturn_t brcmnand_ctlrdy_irq(int irq, void *data) > { > struct brcmnand_controller *ctrl = data; > @@ -1307,6 +1436,16 @@ static irqreturn_t brcmnand_ctlrdy_irq(int irq, void *data) > if (ctrl->dma_pending) > return IRQ_HANDLED; > > + /* check if you need to piggy back on the ctrlrdy irq */ > + if (ctrl->edu_pending) { > + if (irq == ctrl->irq && ((int)ctrl->edu_irq >= 0)) > + /* Discard interrupts while using dedicated edu irq */ > + return IRQ_HANDLED; > + > + /* no registered edu irq, call handler */ > + return brcmnand_edu_irq(irq, data); > + } > + > complete(&ctrl->done); > return IRQ_HANDLED; > } > @@ -1644,6 +1783,83 @@ static void brcmnand_write_buf(struct nand_chip *chip, const uint8_t *buf, > } > } > > +/** > + * Kick EDU engine > + */ > +static int brcmnand_edu_trans(struct brcmnand_host *host, u64 addr, u32 *buf, > + u32 len, u8 cmd) > +{ > + struct brcmnand_controller *ctrl = host->ctrl; > + unsigned long timeo = msecs_to_jiffies(200); > + int ret = 0; > + int dir = (cmd == CMD_PAGE_READ ? DMA_FROM_DEVICE : DMA_TO_DEVICE); > + u8 edu_cmd = (cmd == CMD_PAGE_READ ? EDU_CMD_READ : EDU_CMD_WRITE); > + unsigned int trans = len >> FC_SHIFT; > + dma_addr_t pa; > + > + pa = dma_map_single(ctrl->dev, buf, len, dir); > + if (dma_mapping_error(ctrl->dev, pa)) { > + dev_err(ctrl->dev, "unable to map buffer for EDU DMA\n"); > + return -ENOMEM; > + } > + > + ctrl->edu_pending = true; > + mb(); /* flush previous writes */ I'd prefer to have the barriers right after the IO access. I don't think it changes anything but that would ease understand what writes are you concerned about. Also, maybe you can use non _relaxed accessors as you usually writel/readl in raw, I don't think you actually need a barrier in this case. > + > + ctrl->edu_dram_addr = pa; > + ctrl->edu_ext_addr = addr; > + ctrl->edu_cmd = edu_cmd; > + ctrl->edu_count = trans; > + > + edu_writel(ctrl, EDU_DRAM_ADDR, (u32)ctrl->edu_dram_addr); > + edu_readl(ctrl, EDU_DRAM_ADDR); > + edu_writel(ctrl, EDU_EXT_ADDR, ctrl->edu_ext_addr); > + edu_readl(ctrl, EDU_EXT_ADDR); > + edu_writel(ctrl, EDU_LENGTH, FC_BYTES); > + edu_readl(ctrl, EDU_LENGTH); > + > + /* Start edu engine */ > + mb(); /* flush previous writes */ > + edu_writel(ctrl, EDU_CMD, ctrl->edu_cmd); > + edu_readl(ctrl, EDU_CMD); > + > + if (wait_for_completion_timeout(&ctrl->edu_done, timeo) <= 0) { > + dev_err(ctrl->dev, > + "timeout waiting for EDU; status %#x, error status %#x\n", > + edu_readl(ctrl, EDU_STATUS), > + edu_readl(ctrl, EDU_ERR_STATUS)); > + } > + > + dma_unmap_single(ctrl->dev, pa, len, dir); > + > + /* for program page check NAND status */ > + if (((brcmnand_read_reg(ctrl, BRCMNAND_INTFC_STATUS) & > + INTFC_FLASH_STATUS) & NAND_STATUS_FAIL) && > + edu_cmd == EDU_CMD_WRITE) { > + dev_info(ctrl->dev, "program failed at %llx\n", > + (unsigned long long)addr); > + ret = -EIO; > + } > + > + /* Make sure the EDU status is clean */ > + if (edu_readl(ctrl, EDU_STATUS) & EDU_STATUS_ACTIVE) > + dev_warn(ctrl->dev, "EDU still active: %#x\n", > + edu_readl(ctrl, EDU_STATUS)); > + > + if (unlikely(edu_readl(ctrl, EDU_ERR_STATUS) & EDU_ERR_STATUS_ERRACK)) { > + dev_warn(ctrl->dev, "EDU RBUS error at addr %llx\n", > + (unsigned long long)addr); > + ret = -EIO; > + } > + > + ctrl->edu_pending = false; > + brcmnand_edu_init(ctrl); > + edu_writel(ctrl, EDU_STOP, 0); /* force stop */ > + edu_readl(ctrl, EDU_STOP); > + > + return ret; > +} > + > /** > * Construct a FLASH_DMA descriptor as part of a linked list. You must know the > * following ahead of time: > @@ -1850,9 +2066,11 @@ static int brcmnand_read(struct mtd_info *mtd, struct nand_chip *chip, > try_dmaread: > brcmnand_clear_ecc_addr(ctrl); > > - if (has_flash_dma(ctrl) && !oob && flash_dma_buf_ok(buf)) { > - err = brcmnand_dma_trans(host, addr, buf, trans * FC_BYTES, > - CMD_PAGE_READ); > + if (ctrl->dma_trans && !oob && flash_dma_buf_ok(buf)) { > + err = ctrl->dma_trans(host, addr, buf, > + trans * FC_BYTES, > + CMD_PAGE_READ); > + > if (err) { > if (mtd_is_bitflip_or_eccerr(err)) > err_addr = addr; > @@ -1988,10 +2206,12 @@ static int brcmnand_write(struct mtd_info *mtd, struct nand_chip *chip, > for (i = 0; i < ctrl->max_oob; i += 4) > oob_reg_write(ctrl, i, 0xffffffff); > > - if (has_flash_dma(ctrl) && !oob && flash_dma_buf_ok(buf)) { > - if (brcmnand_dma_trans(host, addr, (u32 *)buf, > - mtd->writesize, CMD_PROGRAM_PAGE)) > + if (use_dma(ctrl) && !oob && flash_dma_buf_ok(buf)) { > + if (ctrl->dma_trans(host, addr, (u32 *)buf, mtd->writesize, > + CMD_PROGRAM_PAGE)) > + > ret = -EIO; > + > goto out; > } > > @@ -2494,6 +2714,8 @@ static int brcmnand_suspend(struct device *dev) > > if (has_flash_dma(ctrl)) > ctrl->flash_dma_mode = flash_dma_readl(ctrl, FLASH_DMA_MODE); > + else if (has_edu(ctrl)) > + ctrl->edu_config = edu_readl(ctrl, EDU_CONFIG); > > return 0; > } > @@ -2508,6 +2730,14 @@ static int brcmnand_resume(struct device *dev) > flash_dma_writel(ctrl, FLASH_DMA_ERROR_STATUS, 0); > } > > + if (has_edu(ctrl)) > + ctrl->edu_config = edu_readl(ctrl, EDU_CONFIG); > + else { > + edu_writel(ctrl, EDU_CONFIG, ctrl->edu_config); > + edu_readl(ctrl, EDU_CONFIG); > + brcmnand_edu_init(ctrl); > + } > + > brcmnand_write_reg(ctrl, BRCMNAND_CS_SELECT, ctrl->nand_cs_nand_select); > brcmnand_write_reg(ctrl, BRCMNAND_CS_XOR, ctrl->nand_cs_nand_xor); > brcmnand_write_reg(ctrl, BRCMNAND_CORR_THRESHOLD, > @@ -2553,6 +2783,52 @@ MODULE_DEVICE_TABLE(of, brcmnand_of_match); > /*********************************************************************** > * Platform driver setup (per controller) > ***********************************************************************/ > +static int brcmnand_edu_setup(struct platform_device *pdev) > +{ > + struct device *dev = &pdev->dev; > + struct brcmnand_controller *ctrl = dev_get_drvdata(&pdev->dev); > + struct resource *res; > + int ret; > + > + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "flash-edu"); > + if (res) { > + ctrl->edu_base = devm_ioremap_resource(dev, res); > + if (IS_ERR(ctrl->edu_base)) > + return PTR_ERR(ctrl->edu_base); > + > + ctrl->edu_offsets = edu_regs; > + > + edu_writel(ctrl, EDU_CONFIG, EDU_CONFIG_MODE_NAND | > + EDU_CONFIG_SWAP_CFG); > + edu_readl(ctrl, EDU_CONFIG); > + > + /* initialize edu */ > + brcmnand_edu_init(ctrl); > + > + ctrl->edu_irq = platform_get_irq_optional(pdev, 1); > + if ((int)ctrl->edu_irq < 0) { Why not declaring it as an int directly? I think it's preferred. > + dev_warn(dev, > + "FLASH EDU enabled, using ctlrdy irq\n"); > + } else { > + ret = devm_request_irq(dev, ctrl->edu_irq, > + brcmnand_edu_irq, 0, > + "brcmnand-edu", ctrl); > + if (ret < 0) { > + dev_err(ctrl->dev, "can't allocate IRQ %d: error %d\n", > + ctrl->edu_irq, ret); > + return ret; > + } > + > + dev_info(dev, "FLASH EDU enabled using irq %u\n", > + ctrl->edu_irq); > + } > + > + /* set the appropriate edu transfer function to call */ > + ctrl->dma_trans = brcmnand_edu_trans; > + } > + > + return 0; > +} > > int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) > { > @@ -2578,6 +2854,7 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) > > init_completion(&ctrl->done); > init_completion(&ctrl->dma_done); > + init_completion(&ctrl->edu_done); > nand_controller_init(&ctrl->controller); > ctrl->controller.ops = &brcmnand_controller_ops; > INIT_LIST_HEAD(&ctrl->host_list); > @@ -2623,6 +2900,7 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) > ctrl->reg_offsets[BRCMNAND_FC_BASE]; > } > > + ctrl->dma_trans = NULL; > /* FLASH_DMA */ > res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "flash-dma"); > if (res) { > @@ -2665,6 +2943,12 @@ int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc) > } > > dev_info(dev, "enabling FLASH_DMA\n"); > + /* set the appropriate flash dma transfer function to call */ > + ctrl->dma_trans = brcmnand_dma_trans; > + } else { > + ret = brcmnand_edu_setup(pdev); > + if (ret < 0) > + goto err; Nitpicking: you could drop the initialization of dma_trans to NULL and assign ctrl->dma_trans in both cases of this if/else block (by moving it out of the brcmnand_edu_setup()). I think it enhances readability. > } > > /* Disable automatic device ID config, direct addressing */ Thanks, Miquèl