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=-3.8 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 92A89C48BD7 for ; Thu, 27 Jun 2019 16:16:18 +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 668CE20659 for ; Thu, 27 Jun 2019 16:16:18 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="e41qb7DZ" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 668CE20659 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=3gKQGeXJ7bPbrtPrA+jTzxH6QQWXmCGoX9ZzqLlwb6I=; b=e41qb7DZhxh5C/ EGIYZ+zY2cQxuYmZCjDYQOpQUY+tqmmGgch8GtT9T0eO+FXli0C6Xma4AmzQ1k6YsDo6Emww1tV6F OMs+VFB3YrSn+owEW5tuowNE0wLZEKc31RU2KLQZ50ttXu0jXYGQMHZPU/ulcS2wIT75V1nW2041T G8HxE+Y2rHykp55YItzpDL8Ui52jRDtUH3gS47IzqN/1c7/0pTVMoNoG7cN8dAesdbLuYcmJY3VtF mNag6kTIDDudWsnItyv1MCh5BRpOMAR5PPdCqwakcdYgj7mC57An4cnFSp5IRg3S5ml8yssQEbhCx 3sQtEhmZdICCRxLl4w3w==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1hgX4I-0000iM-C1; Thu, 27 Jun 2019 16:16:14 +0000 Received: from relay1-d.mail.gandi.net ([217.70.183.193]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1hgX4D-0000h1-Tq for linux-mtd@lists.infradead.org; Thu, 27 Jun 2019 16:16:12 +0000 X-Originating-IP: 91.224.148.103 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay1-d.mail.gandi.net (Postfix) with ESMTPSA id D671A240005; Thu, 27 Jun 2019 16:15:45 +0000 (UTC) Date: Thu, 27 Jun 2019 18:15:42 +0200 From: Miquel Raynal To: Piotr Sroka Subject: Re: [PATCH v2 1/2] mtd: nand: Add Cadence NAND controller driver Message-ID: <20190627181542.131aa061@xps13> In-Reply-To: <20190606151948.GA10565@global.cadence.com> References: <20190219161406.4340-1-piotrs@cadence.com> <20190219161823.22466-1-piotrs@cadence.com> <20190305190954.6c38d681@xps13> <20190321093356.GA19577@global.cadence.com> <20190512142426.11453a6c@xps13> <20190606151948.GA10565@global.cadence.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.1 (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-20190627_091610_286698_12081186 X-CRM114-Status: GOOD ( 43.01 ) 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: Arnd Bergmann , Boris Brezillon , Marcel Ziswiler , Richard Weinberger , linux-kernel@vger.kernel.org, Stefan Agner , Marek Vasut , Paul Burton , Geert Uytterhoeven , linux-mtd@lists.infradead.org, Dmitry Osipenko , Brian Norris , David Woodhouse 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 SGkgUGlvdHIsCgpQaW90ciBTcm9rYSA8cGlvdHJzQGNhZGVuY2UuY29tPiB3cm90ZSBvbiBUaHUs IDYgSnVuIDIwMTkgMTY6MTk6NTEKKzAxMDA6Cgo+IEhpIE1pcXVlbAo+IAo+IAo+IFRoZSAwNS8x Mi8yMDE5IDE0OjI0LCBNaXF1ZWwgUmF5bmFsIHdyb3RlOgo+ID5FWFRFUk5BTCBNQUlMCj4gPgo+ ID4KPiA+RVhURVJOQUwgTUFJTAo+ID4KPiA+Cj4gPkhpIFBpb3RyLAo+ID4KPiA+U29ycnkgZm9y IGRlIGRlbGF5Lgo+ID4KPiA+UGlvdHIgU3Jva2EgPHBpb3Ryc0BjYWRlbmNlLmNvbT4gd3JvdGUg b24gVGh1LCAyMSBNYXIgMjAxOSAwOTozMzo1OAo+ID4rMDAwMDoKPiA+ICAKPiA+PiBUaGUgMDMv MDUvMjAxOSAxOTowOSwgTWlxdWVsIFJheW5hbCB3cm90ZTogIAo+ID4+ID5FWFRFUk5BTCBNQUlM Cj4gPj4gPgo+ID4+ID4KPiA+PiA+SGkgUGlvdHIsCj4gPj4gPgo+ID4+ID5QaW90ciBTcm9rYSA8 cGlvdHJzQGNhZGVuY2UuY29tPiB3cm90ZSBvbiBUdWUsIDE5IEZlYiAyMDE5IDE2OjE4OjIzCj4g Pj4gPiswMDAwOgo+ID4+ID4gIAo+ID4+ID4+IFRoaXMgcGF0Y2ggYWRkcyBkcml2ZXIgZm9yIENh ZGVuY2UgSFBORkMgTkFORCBjb250cm9sbGVyLgo+ID4+ID4+Cj4gPj4gPj4gU2lnbmVkLW9mZi1i eTogUGlvdHIgU3Jva2EgPHBpb3Ryc0BjYWRlbmNlLmNvbT4KPiA+PiA+PiAtLS0KPiA+PiA+PiBD aGFuZ2VzIGZvciB2MjoKPiA+PiA+PiAtIGNyZWF0ZSBvbmUgdW5pdmVyc2FsIHdhaXQgZnVuY3Rp b24gZm9yIGFsbCBldmVudHMgaW5zdGVhZCBvZiBvbmUKPiA+PiA+PiAgIGZ1bmN0aW9uIHBlciBl dmVudC4KPiA+PiA+PiAtIHNwbGl0IG9uZSBiaWcgZnVuY3Rpb24gZXhlY3V0aW5nIG5hbmQgb3Bl cmF0aW9ucyB0byBzZXBhcmF0ZQo+ID4+ID4+ICAgZnVuY3Rpb25zIG9uZSBwZXIgZWFjaCB0eXBl IG9mIG9wZXJhdGlvbi4KPiA+PiA+PiAtIGFkZCBlcmFzZSBhdG9taWMgb3BlcmF0aW9uIHRvIG5h bmQgb3BlcmF0aW9uIHBhcnNlcgo+ID4+ID4+IC0gcmVtb3ZlIHVubmVjZXNzYXJ5IGluY2x1ZGVz Lgo+ID4+ID4+IC0gcmVtb3ZlIHVudXNlZCByZWdpc3RlciBkZWZpbmVzCj4gPj4gPj4gLSBhZGQg c3VwcG9ydCBmb3IgbXVsdGlwbGUgbmFuZCBjaGlwcwo+ID4+ID4+IC0gcmVtb3ZlIGFsbCBjb2Rl IHVzaW5nIGxlZ2FjeSBmdW5jdGlvbnMKPiA+PiA+PiAtIHJlbW92ZSBjaGlwIGRlcGVuZGVudHMg cGFyYW1ldGVycyBmcm9tIGR0cyBiaW5kaW5ncywgdGhleSB3ZXJlCj4gPj4gPj4gICBhdHRhY2hl ZCB0byB0aGUgU29DIHNwZWNpZmljIGNvbXBhdGlibGUgYXQgdGhlIGRyaXZlciBsZXZlbAo+ID4+ ID4+IC0gc2ltcGxpZnkgaW50ZXJydXB0IGhhbmRsaW5nCj4gPj4gPj4gLSBzaW1wbGlmeSB0aW1p bmcgY2FsY3VsYXRpb25zCj4gPj4gPj4gLSBmaXggY2FsY3VsYXRpb24gb2YgbWF4aW11bSBzdXBw b3J0ZWQgY3Mgc2lnbmFscwo+ID4+ID4+IC0gc2ltcGxpZnkgZWNjIHNpemUgY2FsY3VsYXRpb24K PiA+PiA+PiAtIHJlbW92ZSBoZWFkZXIgZmlsZSBhbmQgcHV0IHdob2xlIGNvZGUgdG8gb25lIGMg ZmlsZQo+ID4+ID4+IC0tLQo+ID4+ID4+ICBkcml2ZXJzL210ZC9uYW5kL3Jhdy9LY29uZmlnICAg ICAgICAgICAgICAgICAgIHwgICAgOCArCj4gPj4gPj4gIGRyaXZlcnMvbXRkL25hbmQvcmF3L01h a2VmaWxlICAgICAgICAgICAgICAgICAgfCAgICAxICsKPiA+PiA+PiAgZHJpdmVycy9tdGQvbmFu ZC9yYXcvY2FkZW5jZS1uYW5kLWNvbnRyb2xsZXIuYyB8IDMyODggKysrKysrKysrKysrKysrKysr KysrKysrICAKPiA+PiA+Cj4gPj4gPlRoaXMgZHJpdmVyIGlzIHdheSB0b28gbWFzc2l2ZSwgSSBh bSBwcmV0dHkgc3VyZSBpdCBjYW4gc2hyaW5rIGEKPiA+PiA+bGl0dGxlIGJpdCBtb3JlLgo+ID4+ ID5bLi4uXQo+ID4+ID4gIAo+ID4+IEkgd2lsbCB0cnkgdG8gbWFrZSBpdCBzaG9yZXIgYnV0IGl0 IHdpbGwgYmUgZGlmdWN1bHQgdG8gYWNoaXZlLiBJdCBpcyBiZWNhdXNlIC0gdGhlcmUgYXJlIGEg bG90IG9mIGNhbGN1bGF0aW9uIG5lZWRlZCBmb3IgUEhZICAgICAgLSBFQ0MgYXJlIGludGVybGVh dmVkIHdpdGggZGF0YSAobGlrZSBvbiBtYXJ2ZWxsLW5hbmQgb3IgZ3BtaS1uYW5kKS4KPiA+PiAg ICBUaGVyZWZvcmU6ICAgICsgUkFXIG1vZGUgaXMgY29tcGxpY2F0ZWQgICAgKyBwcm90ZWN0aW5n IEJCTSBpbmNyZWFzZXMgbnVtYmVyIG9mIGxpbmVzIG9mIHNvdXJjZSBjb2RlCj4gPj4gLSBuZWVk IHRvIHN1cHBvcnQgdHdvIERNQSBlbmdpbmVzIGludGVybmFsIGFuZCBleHRlcm5hbCAoc2xhdmUp IFdlIHdpbGwgc2VlIG9uIG5leHQgcGF0Y2ggdmVyc2lvbiB3aGF0IGlzIHRoZSByZXN1bHQuICAg ICAgVGhhdCBwYWdlIGxheW91dCBsb29rczogIAo+ID4KPiA+TWF5YmUgeW91IGRvbid0IG5lZWQg dG8gc3VwcG9ydCBib3RoIGludGVybmFsIGFuZCBleHRlcm5hbCBETUE/Cj4gPgo+ID5JIGFtIHBy ZXR0eSBzdXJlIHRoZXJlIGFyZSByb29tcyBmb3Igc2l6ZSByZWR1Y3Rpb24uICAKPiAKPiBJIGRl c2NyaWJlIGhvdyBpdCB3b3JrcyBpbiBnZW5lcmFsIGFuZCBtYXliZSB5b3UgaGVscCBtZSBjaG9z ZSBiZXR0ZXIgc29sdXRpb24uCj4gCj4gSFcgY29udHJvbGxlciBjYW4gd29yayBpbiAzIG1vZGVz LiBQSU8gLSBjYW4gd29yayBpbiBtYXN0ZXIgb3Igc2xhdmUgRE1BCj4gQ0RNQSAtIG5lZWRzIE1h c3RlciBETUEgZm9yIGFjY2Vzc2luZyBjb21tYW5kIGRlc2NyaXB0b3JzLgo+IEdlbmVyaWMgbW9k ZSAtIGNhbiB1c2Ugb25seSBTbGF2ZSBETUEuCj4gCj4gR2VuZXJpYyBtb2RlIGlzIG5lY2Nlc3Nl cnkgdG8gaW1wbGVtZW50IGZ1bmN0aW9ucyBvdGhlciB0aGFuIHBhZ2UKPiBwcm9ncmFtLCBwYWdl IHJlYWQsIGJsb2NrIGVyYXNlLiBTbyBpdCBpcyBlc3NlbnRpYWwuIEkgY2Fubm90IGF2b2lkCj4g dG8gdXNlIFNsYXZlIERNQS4KClRoaXMgZGVzZXJ2ZXMgYSBuaWNlIGNvbW1lbnQgYXQgdGhlIHRv cC4KCj4gCj4gSSBjaGFuZ2UgQ0RNQSBtb2RlIHRvIFBJTyBtb2RlLiBUaGVuIEkgY2FuIHVzZSBv bmx5IHNsYXZlIERNQS4gQnV0IENETUEgaGFzIGEgZmVhdHVyZSB3aGljaCBpcyBub3QgcHJlc2Vu dCBpbiBQSU8gbW9kZS4gVGhlIGZlYXR1cmUKPiBnaXZlcyBwb3NzaWJpbGl0eSB0byBwb2ludCBE TUEgZW5naW5lIHR3byBidWZmZXJzIHRvIHRyYW5zZmVyLiBJdCBpcwo+IHVzZWQgdG8gcG9pbnQg ZGF0YSBidWZmZXIgYW5kIG9vYiBidWZlci4gSW4gUElPIG1vZGUgSSB3b3VsZCBuZWVkIHRvCj4g Y29weSBkYXRhIGJ1ZmZlciBhbmQgb29iIGJ1ZmZlciB0byB0aGlyZCBidWZmZXIuIE5leHQgdHJh bnNmZXIgZGF0YSBmcm9tCj4gdGhpcmQgYnVmZmVyLgo+IEluIHRoYXQgc29sdXRpb24gd2UgbmVl ZCB0byBjb3B5IGFsbCBkYXRhIGJ5IENQVSBhbmQgdGhlbiB1c2UgRE1BLiAgQ29udHJvbGxlciBu ZWVkcyBhbHdheXMgdHJhbnNmZXIgb29iIGJlY2F1c2Ugb2YgSFcgRUNDIHJlc3RyaWN0aW9ucy4g U3VjaCBjaGFuZ2Ugd2lsbCBkZWNyZWFzZSBwZXJmb3JtY2UgZm9yIGFsbCBkYXRhIHRyYW5zZmVy cy4KPiBJIHRoaW5rIHBlcmZvcm1hbmNlIGlzIG1vcmUgaW1wb3J0YW50IGluIHRoYXQgY2FzZS4g V2hhdCBpcyB5b3VyCj4gb3Bpbmlvbj8gWy4uLl0KCkluZGVlZAoKPiA+PiA+Cj4gPj4gPldoYXQg aXMgdGhpcyBmb3I/ICAKPiA+PiBGdWNudGlvbnMgZW5hYmxlcy9kaXNhYmxlcyBoYXJkd2FyZSBk ZXRlY3Rpb24gb2YgZXJhc2VkIGRhdGEKPiA+PiBwYWdlcy4gPiAgCj4gPgo+ID5PaywgdGhlIG5h bWUgaXMgbm90IHZlcnkgZXhwbGljaXQgLCBtYXliZSB5b3UgY291bGQgdGVsbCB0aGlzIHdpdGgg YQo+ID5jb21tZW50Lgo+ID4gIAo+IE9rLgo+IAo+ID4+ID4+ICsKPiA+PiA+PiArLyogaGFyZHdh cmUgaW5pdGlhbGl6YXRpb24gKi8KPiA+PiA+PiArc3RhdGljIGludCBjYWRlbmNlX25hbmRfaHdf aW5pdChzdHJ1Y3QgY2Ruc19uYW5kX2N0cmwgKmNkbnNfY3RybCkKPiA+PiA+PiArewo+ID4+ID4+ ICsJaW50IHN0YXR1cyA9IDA7Cj4gPj4gPj4gKwl1MzIgcmVnOwo+ID4+ID4+ICsKPiA+PiA+PiAr CXN0YXR1cyA9IGNhZGVuY2VfbmFuZF93YWl0X2Zvcl92YWx1ZShjZG5zX2N0cmwsIENUUkxfU1RB VFVTLAo+ID4+ID4+ICsJCQkJCSAgICAgMTAwMDAwMCwKPiA+PiA+PiArCQkJCQkgICAgIENUUkxf U1RBVFVTX0lOSVRfQ09NUCwgZmFsc2UpOwo+ID4+ID4+ICsJaWYgKHN0YXR1cykKPiA+PiA+PiAr CQlyZXR1cm4gc3RhdHVzOwo+ID4+ID4+ICsKPiA+PiA+PiArCXJlZyA9IHJlYWRsKGNkbnNfY3Ry bC0+cmVnICsgQ1RSTF9WRVJTSU9OKTsKPiA+PiA+PiArCj4gPj4gPj4gKwlkZXZfaW5mbyhjZG5z X2N0cmwtPmRldiwKPiA+PiA+PiArCQkgIiVzOiBjYWRlbmNlIG5hbmQgY29udHJvbGxlciB2ZXJz aW9uIHJlZyAleFxuIiwKPiA+PiA+PiArCQkgX19mdW5jX18sIHJlZyk7Cj4gPj4gPj4gKwo+ID4+ ID4+ICsJLyogZGlzYWJsZSBjYWNoZSBhbmQgbXVsdGlwbGFuZSAqLwo+ID4+ID4+ICsJd3JpdGVs KDAsIGNkbnNfY3RybC0+cmVnICsgTVVMVElQTEFORV9DRkcpOwo+ID4+ID4+ICsJd3JpdGVsKDAs IGNkbnNfY3RybC0+cmVnICsgQ0FDSEVfQ0ZHKTsKPiA+PiA+PiArCj4gPj4gPj4gKwkvKiBjbGVh ciBhbGwgaW50ZXJydXB0cyAqLwo+ID4+ID4+ICsJd3JpdGVsKDB4RkZGRkZGRkYsIGNkbnNfY3Ry bC0+cmVnICsgSU5UUl9TVEFUVVMpOwo+ID4+ID4+ICsKPiA+PiA+PiArCWNhZGVuY2VfbmFuZF9n ZXRfY2FwcyhjZG5zX2N0cmwpOwo+ID4+ID4+ICsJY2FkZW5jZV9uYW5kX3JlYWRfYmNoX2NmZyhj ZG5zX2N0cmwpOyAgCj4gPj4gPgo+ID4+ID5ObywgeW91IGNhbm5vdCByZWx5IG9uIHRoZSBib290 bG9hZGVyJ3MgY29uZmlndXJhdGlvbi4gQW5kIEkgc3VwcG9zZQo+ID4+ID50aGlzIGlzIHdoYXQg dGhlIGZpcnN0IGNhbGwgdG8gcmVhZF9iY2hfY2ZnIGRvZXM/ICAKPiA+PiBJIGRvIG5vdCByZWFs eSBvbiBib290IGxvYWRlci4gSnVzdCByZWFkIE5BTkQgZmxhc2gKPiA+PiBjb250cm9sbGVyIGNv bmZpZ3VyYXRpb24gZnJvbSByZWFkIG9ubHkgY2FwYWJpbGl0aWVzIHJlZ2lzdGVycy4gIAo+ID4K PiA+T2ssIGlmIHRoZXNlIGFyZSBSTyByZWdpc3RlcnMsIGl0J3MgZmluZS4gQnV0IG1heWJlIGRv bid0IGNhbGwgdGhlCj4gPmZ1bmN0aW9uICJyZWFkIGJjaCBjb25maWciIHdoaWNoIHN1Z2dlc3Qg dGhhdCB0aGlzIGlzIHNvbWV0aGluZyB5b3UgY2FuCj4gPmNoYW5nZS4KPiA+ICAKPiBvay4KPiAK PiA+Pgo+ID4+ICAKPiA+PiA+PiArCj4gPj4gPj4gKyNkZWZpbmUgVFRfT09CX0FSRUEJCTEKPiA+ PiA+PiArI2RlZmluZSBUVF9NQUlOX09PQl9BUkVBUwkyCj4gPj4gPj4gKyNkZWZpbmUgVFRfUkFX X1BBR0UJCTMKPiA+PiA+PiArI2RlZmluZSBUVF9CQk0JCQk0Cj4gPj4gPj4gKyNkZWZpbmUgVFRf TUFJTl9PT0JfQVJFQV9FWFQJNQo+ID4+ID4+ICsKPiA+PiA+PiArLyogcHJlcGFyZSBzaXplIG9m IGRhdGEgdG8gdHJhbnNmZXIgKi8KPiA+PiA+PiArc3RhdGljIGludAo+ID4+ID4+ICtjYWRlbmNl X25hbmRfcHJlcGFyZV9kYXRhX3NpemUoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKPiA+PiA+PiAr CQkJICAgICAgIGludCB0cmFuc2Zlcl90eXBlKQo+ID4+ID4+ICt7Cj4gPj4gPj4gKwlzdHJ1Y3Qg Y2Ruc19uYW5kX2N0cmwgKmNkbnNfY3RybCA9IHRvX2NkbnNfbmFuZF9jdHJsKGNoaXAtPmNvbnRy b2xsZXIpOwo+ID4+ID4+ICsJc3RydWN0IGNkbnNfbmFuZF9jaGlwICpjZG5zX2NoaXAgPSB0b19j ZG5zX25hbmRfY2hpcChjaGlwKTsKPiA+PiA+PiArCXUzMiBzZWNfc2l6ZSA9IDAsIGxhc3Rfc2Vj X3NpemUsIG9mZnNldCA9IDAsIHNlY19jbnQgPSAxOwo+ID4+ID4+ICsJdTMyIGVjY19zaXplID0g Y2hpcC0+ZWNjLmJ5dGVzOwo+ID4+ID4+ICsJdTMyIGRhdGFfY3RybF9zaXplID0gMDsKPiA+PiA+ PiArCXUzMiByZWcgPSAwOwo+ID4+ID4+ICsKPiA+PiA+PiArCWlmIChjZG5zX2N0cmwtPmN1cnJf dHJhbnNfdHlwZSA9PSB0cmFuc2Zlcl90eXBlKQo+ID4+ID4+ICsJCXJldHVybiAwOwo+ID4+ID4+ ICsKPiA+PiA+PiArCXN3aXRjaCAodHJhbnNmZXJfdHlwZSkgeyAgCj4gPj4gPgo+ID4+ID5QbGVh c2UgdHVybiB0aGUgY29udHJvbGxlciBkcml2ZXIgYXMgZHVtYiBhcyBwb3NzaWJsZS4gWW91IHNo b3VsZCBub3QKPiA+PiA+Y2FyZSB3aGljaCBwYXJ0IG9mIHRoZSBPT0IgYXJlYSB5b3UgYXJlIGFj Y2Vzc2luZy4gIAo+ID4+IEl0IGlzIGEgYml0IGNvbmZ1c2luZyBmb3IgbWUgaG93IGFjY2Vzc2lu ZyBPT0Igc2hvdWxkIGJlIGltcGxlbWVudGVkLgo+ID4+IEkga25vdyB0aGF0IHJlYWRfb29iIGZ1 bmN0aW9uIGlzIGNhbGxlZCB0byBjaGVjayBCQk0gdmFsdWUgd2hlbiBCQlQgaXMKPiA+PiBpbml0 aWFsaXplZC4gSXQgaXMgYWxzbyBhIGJpdCBjb25mdXNpbmcgZm9yIG1lIHdoeSB0aGUgcmF3IHZl cnNpb24gaXMKPiA+PiBub3QgdXNlZCBmb3IgdGhhdCBwdXJwb3NlLiAgICBJbiBjdXJyZW50IGlt cGxlbWVudGF0aW9uIGlmIHlvdSB3cml0ZSBvb2IgYnkgd3JpdGVfcGFnZSBmdW5jdGlvbiBuZXh0 Cj4gPj4gcmVhZCBvb2IgYnkgcmVhZF9vb2IgZnVuY3Rpb24gdGhlbiBkYXRhIHdpbGwgYmUgdGhl IHNhbWUuCj4gPj4gSWYgSSBpbXBsZW1lbnQgZHVtcCBmdW5jdGlvbnMgcmVhZF9vb2IgYW5kIHdy aXRlX29vYiB0aGVuCj4gPj4gMS4gRUNDIG11c3QgYmUgZGlzYWJsZWQgZm9yIHRoZXNlIGZ1bmN0 aW9ucwo+ID4+IDIuIG9vYiBkYXRhIGFjY2Vzc2luZyBieSB3cml0ZV9wYWdlL3JlYWRfcGFnZSB3 aWxsIGJlIGRpZmZlcmVudAo+ID4+ICAgIChkaWZmZXJlbnQgb2Zmc2V0cykgdGhhdCB0aGUgZGF0 YSBhY2Nlc3NpbmcgYnkgcmVhZF9vb2Ivd3JpdGVfb29iCj4gPj4gICAgZnVuY3Rpb25zICAKPiA+ Cj4gPk5vLCBJIGZlYXIgdGhpcyBpcyBub3QgYWNjZXB0YWJsZS4KPiA+ICAKPiA+PiBJZiAgYWJv dmUgZGVzY3JpYmVkICJmdW5jdGlvbmFsaXRpZXMiIGFyZSBhY2NlcHRhYmxlIEkgd2lsbCBjaGFu Z2UgaW1wbGVtZW50YXRpb24gb2Ygd3JpdGVfb29iIGFuZCByZWFkX29vYiBmdW5jdGlvbnMuCj4g Pj4gVGhlIHdyaXRlX3BhZ2UgYW5kIHJlYWRfcGFnZSBtdXN0IGJlIGltcGxlbWVudGVkIGluIHRo YXQgd2F5IGFzIGl0IGlzIG5vdy4gICAgTGV0IG1lIGtub3cgd2hpY2ggc29sdXRpb24gaXMgcHJl ZmZlcmVkLiAgCj4gPgo+ID5JZiB0aGlzIGlzIHRvbyBjb21wbGljYXRlZCB0byBqdXN0IHdyaXRl IHRoZSBvb2IsIHdoeSBub3QgZmFsbGJhY2sgb24KPiA+cmVhZC93cml0ZV9wYWdlICh3aXRoIG9v Yl9yZXF1aXJlZCBhbmQgYSBkdW1teSBkYXRhIGJ1ZmZlcik/ICAKPiAKPiBJIGNvbnNpZGVyZWQg aXQuIEFjdHVhbGx5LCBpdCB3b3VsZCBzaW1wbGlmeSB0aGUgY29kZS4gVGhlIGRpc2FkdmFudGFn ZQo+IG9mIHVzaW5nIHRoZSBzYW1lIGZ1bmN0aW9uIGlzIHRoYXQgdGhlIGVhY2ggd3JpdGUvcmVh ZCBvb2Igd2lsbCBjYXVzZSBmdWxsIHBhZ2UKPiByZWFkL3dyaXRlLiBJbiBjdXJyZW50IHZlcnNp b24gb25seSBsYXN0IHNlY3RvciBpcyByZWFkL3dyaXRlIHRvZ2V0aGVyCj4gd2l0aCBvb2IuIFRo aXMgd2lsbCBhZmZlY3QgdGhlIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIG9mIG9vYiB3cml0ZS9y ZWFkIGZ1bmN0aW9uLiBTbyBJIGRvIG5vdCBrbm93IHdoYXQgaXMgbW9yZSBpbXBvcnRhbnQuIDEu IE9PQiBmdW5jdGlvbnMgcGVyZm9ybWFuY2UsCj4gMi4gc2ltcGxpZXIgY29kZS4KCkhvbmVzdGx5 IEkgZG9uJ3QgdGhpbmsgc2xvd2luZyBkb3duIGEgYml0IE9PQiBhY2Nlc3MgaXMgY3JpdGljYWwg YXMsCndpdGggcmVjZW50IHNvZnR3YXJlIGxheWVycyBsaWtlIFVCSS9VQklGUyB3ZSBkbyBub3Qg YWNjZXNzIE9PQiBvbmx5CnRoYXQgbXVjaC4gU28gaGVyZSBJIHdvdWxkIGNob29zZSAyLgoKPj4K PiA+PiA+PiArCWNhc2UgVFRfT09CX0FSRUE6Cj4gPj4gPj4gKwkJb2Zmc2V0ID0gY2Ruc19jaGlw LT5tYWluX3NpemUgLSBjZG5zX2NoaXAtPnNlY3Rvcl9zaXplOwo+ID4+ID4+ICsJCWVjY19zaXpl ID0gZWNjX3NpemUgKiAob2Zmc2V0IC8gY2Ruc19jaGlwLT5zZWN0b3Jfc2l6ZSk7Cj4gPj4gPj4g KwkJb2Zmc2V0ID0gb2Zmc2V0ICsgZWNjX3NpemU7Cj4gPj4gPj4gKwkJc2VjX2NudCA9IDE7Cj4g Pj4gPj4gKwkJbGFzdF9zZWNfc2l6ZSA9IGNkbnNfY2hpcC0+c2VjdG9yX3NpemUKPiA+PiA+PiAr CQkJKyBjZG5zX2NoaXAtPmF2YWlsX29vYl9zaXplOwo+ID4+ID4+ICsJCWJyZWFrOwo+ID4+ID4+ ICsJY2FzZSBUVF9NQUlOX09PQl9BUkVBX0VYVDoKPiA+PiA+PiArCQlzZWNfY250ID0gY2Ruc19j aGlwLT5zZWN0b3JfY291bnQ7Cj4gPj4gPj4gKwkJbGFzdF9zZWNfc2l6ZSA9IGNkbnNfY2hpcC0+ c2VjdG9yX3NpemU7Cj4gPj4gPj4gKwkJc2VjX3NpemUgPSBjZG5zX2NoaXAtPnNlY3Rvcl9zaXpl Owo+ID4+ID4+ICsJCWRhdGFfY3RybF9zaXplID0gY2Ruc19jaGlwLT5hdmFpbF9vb2Jfc2l6ZTsK PiA+PiA+PiArCQlicmVhazsKPiA+PiA+PiArCWNhc2UgVFRfTUFJTl9PT0JfQVJFQVM6Cj4gPj4g Pj4gKwkJc2VjX2NudCA9IGNkbnNfY2hpcC0+c2VjdG9yX2NvdW50Owo+ID4+ID4+ICsJCWxhc3Rf c2VjX3NpemUgPSBjZG5zX2NoaXAtPnNlY3Rvcl9zaXplCj4gPj4gPj4gKwkJCSsgY2Ruc19jaGlw LT5hdmFpbF9vb2Jfc2l6ZTsKPiA+PiA+PiArCQlzZWNfc2l6ZSA9IGNkbnNfY2hpcC0+c2VjdG9y X3NpemU7Cj4gPj4gPj4gKwkJYnJlYWs7Cj4gPj4gPj4gKwljYXNlIFRUX1JBV19QQUdFOgo+ID4+ ID4+ICsJCWxhc3Rfc2VjX3NpemUgPSBjZG5zX2NoaXAtPm1haW5fc2l6ZSArIGNkbnNfY2hpcC0+ b29iX3NpemU7Cj4gPj4gPj4gKwkJYnJlYWs7Cj4gPj4gPj4gKwljYXNlIFRUX0JCTToKPiA+PiA+ PiArCQlvZmZzZXQgPSBjZG5zX2NoaXAtPm1haW5fc2l6ZSArIGNkbnNfY2hpcC0+YmJtX29mZnM7 Cj4gPj4gPj4gKwkJbGFzdF9zZWNfc2l6ZSA9IDg7Cj4gPj4gPj4gKwkJYnJlYWs7Cj4gPj4gPj4g KwlkZWZhdWx0Ogo+ID4+ID4+ICsJCWRldl9lcnIoY2Ruc19jdHJsLT5kZXYsICJEYXRhIHNpemUg cHJlcGFyYXRpb24gZmFpbGVkXG4iKTsKPiA+PiA+PiArCQlyZXR1cm4gLUVJTlZBTDsKPiA+PiA+ PiArCX0KPiA+PiA+PiArCj4gPj4gPj4gKwlyZWcgPSAwOwo+ID4+ID4+ICsJcmVnIHw9IEZJRUxE X1BSRVAoVFJBTl9DRkdfMF9PRkZTRVQsIG9mZnNldCk7Cj4gPj4gPj4gKwlyZWcgfD0gRklFTERf UFJFUChUUkFOX0NGR18wX1NFQ19DTlQsIHNlY19jbnQpOwo+ID4+ID4+ICsJd3JpdGVsKHJlZywg Y2Ruc19jdHJsLT5yZWcgKyBUUkFOX0NGR18wKTsKPiA+PiA+PiArCj4gPj4gPj4gKwlyZWcgPSAw Owo+ID4+ID4+ICsJcmVnIHw9IEZJRUxEX1BSRVAoVFJBTl9DRkdfMV9MQVNUX1NFQ19TSVpFLCBs YXN0X3NlY19zaXplKTsKPiA+PiA+PiArCXJlZyB8PSBGSUVMRF9QUkVQKFRSQU5fQ0ZHXzFfU0VD VE9SX1NJWkUsIHNlY19zaXplKTsKPiA+PiA+PiArCXdyaXRlbChyZWcsIGNkbnNfY3RybC0+cmVn ICsgVFJBTl9DRkdfMSk7Cj4gPj4gPj4gKwo+ID4+ID4+ICsJcmVnID0gcmVhZGwoY2Ruc19jdHJs LT5yZWcgKyBDT05UUk9MX0RBVEFfQ1RSTCk7Cj4gPj4gPj4gKwlyZWcgJj0gfkNPTlRST0xfREFU QV9DVFJMX1NJWkU7Cj4gPj4gPj4gKwlyZWcgfD0gRklFTERfUFJFUChDT05UUk9MX0RBVEFfQ1RS TF9TSVpFLCBkYXRhX2N0cmxfc2l6ZSk7Cj4gPj4gPj4gKwl3cml0ZWwocmVnLCBjZG5zX2N0cmwt PnJlZyArIENPTlRST0xfREFUQV9DVFJMKTsKPiA+PiA+PiArCj4gPj4gPj4gKwljZG5zX2N0cmwt PmN1cnJfdHJhbnNfdHlwZSA9IHRyYW5zZmVyX3R5cGU7Cj4gPj4gPj4gKwo+ID4+ID4+ICsJcmV0 dXJuIDA7Cj4gPj4gPj4gK30KPiA+PiA+PiArICAKPiBbLi4uXSA+PiA+PiArCj4gPj4gWy4uLl0g Pj4gKwkvKiAgCj4gPj4gPj4gKwkgKiB0aGUgaWRlYSBvZiB0aG9zZSBjYWxjdWxhdGlvbiBpcyB0 byBnZXQgdGhlIG9wdGltdW0gdmFsdWUKPiA+PiA+PiArCSAqIGZvciB0UlAgYW5kIHRSSCB0aW1p bmdzIGlmIGl0IGlzIE5PVCBwb3NzaWJsZSB0byBzYW1wbGUgZGF0YQo+ID4+ID4+ICsJICogd2l0 aCBvcHRpbWFsIHRSUC90Ukggc2V0dGluZ3MgdGhlIHBhcmFtZXRlcnMgd2lsbCBiZSBleHRlbmRl ZAo+ID4+ID4+ICsJICovCj4gPj4gPj4gKwlpZiAoc2RyLT50UkNfbWluIDw9IGNsa19wZXJpb2Qg JiYKPiA+PiA+PiArCSAgICBzZHItPnRSUF9taW4gPD0gKGNsa19wZXJpb2QgLyAyKSAmJgo+ID4+ ID4+ICsJICAgIHNkci0+dFJFSF9taW4gPD0gKGNsa19wZXJpb2QgLyAyKSkgeyAgCj4gPj4gPgo+ ID4+ID5XaWxsIHRoaXMgc2l0dWF0aW9uIHJlYWxseSBoYXBwZW4/ICAKPiA+PiBJIHRoaW5rIHll cyBmb3IgZm9sbHdpbmcgdmFsdWVzIHRyY19taW4gIDIwMDAwIHBzCj4gPj4gdHJwX21pbiAgMTAw MDAgcHMKPiA+PiB0cmVoX21pbiA3MDAwICBwcwo+ID4+IGNsa19wZXJpb2QgMjAwMDAgcHMgIAo+ ID4KPiA+T2ssIHlvdSBtYXkgYWRkIGEgY29tbWVudCBzdGF0aW5nIHRoYXQgdGhpcyBtYXkgYmUg dGhlIGNhc2UgaW4gRURPIG1vZGUKPiA+NS4gIAo+IEkgZGlkIG5vdCBhbndlciBjbGVhcmx5IGxh c3QgdGltZS4gSXQgd2FzIGp1c3QgYW4gZXhhbXBsZS4gVGhlIHJlc3VsdCBvZiB0aGF0ICJpZiIg ZGVwZW5kcyBvbiBOQU5EIGZsYXNoIGRldmljZSB0aW1pbmcgbW9kZSBhbmQgTkFORCBmbGFzaCBj b250cm9sbGVyIGNsb2NrLiBNaW51bXVtIHZhbHVlIG9mIGNsayBpcyAyME1IeiAoNTBucykuIFNv IGl0IG1heSBiZSBhIGNhc2UgZm9yIEFzeW5jaHJvbm91cyBNb2RlIDEgaWYKPiBOQU5EIGZsYXNo IGNvbnRyb2xsZXIgY2xvY2sgaXMgMjBNSHouIEkgd2lsbCBhZGQgdGhpcyBpbmZvIGluIGNvbW1l bnQuCgpJIGFtIG5vdCBzdXJlIHRvIHVuZGVyc3RhbmQgY29ycmVjdGx5IHdoYXQgeW91IG1lYW4u IFBsZWFzZSB0cnkgdG8Kd3JpdGUgYSBuaWNlIGNvbW1lbnQgYW5kIHdlJ2xsIHNlZS4KCj4gPj4g Wy4uLl0gIAo+ID4+ID4+ICsJfQo+ID4+ID4+ICsKPiA+PiA+PiArCWlmIChjZG5zX2N0cmwtPmNh cHMyLmlzX3BoeV90eXBlX2RsbCkgeyAgCj4gPj4gPgo+ID4+ID5JcyB0aGUgZWxzZSBwYXJ0IGFs bG93ZWQ/ICAKPiBSZWdpc3RlciBhY2Nlc3NlZCBpbiB0aGlzIGJsb2NrIGRvZXMgbm90IGV4aXN0 cyBpZiBpc19waHlfdHlwZV9kbGwgaXMgMC4gU28gdGhleSBhcmUgcHJldmV0ZWQgdG8gYmUgYWNj ZXNzZWQuIHRoZSBlbHNlIGlzIG5vdCBuZWVkZWQuCj4gPj4gPiAgCj4gPj4gZm9sbG93aW5nIHJl Z2lzdGVyIGRvZXMgbm90IGV4aXN0IGlmIGNhcHMyLmlzX3BoeV90eXBlX2RsbCBpcyAwID4+ICsJ CXUzMiB0cHJlX2NudCA9IGNhbGNfY3ljbCh0cHJlLCBjbGtfcGVyaW9kKTsgIAo+ID4+ID4+ICsJ CXUzMiB0Y2Rxc3NfY250ID0gY2FsY19jeWNsKHRjZHFzcyArIGlmX3NrZXcsIGNsa19wZXJpb2Qp Owo+ID4+ID4+ICsJCXUzMiB0cHN0aF9jbnQgPSBjYWxjX2N5Y2wodHBzdGggKyBpZl9za2V3LCBj bGtfcGVyaW9kKTsKPiA+PiA+PiArCj4gPj4gPj4gKwkJdTMyIHRycHN0X2NudCA9IGNhbGNfY3lj bCh0cnBzdCArIGlmX3NrZXcsIGNsa19wZXJpb2QpICsgMTsKPiA+PiA+PiArCQl1MzIgdHdwc3Rf Y250ID0gY2FsY19jeWNsKHR3cHN0ICsgaWZfc2tldywgY2xrX3BlcmlvZCkgKyAxOwo+ID4+ID4+ ICsJCXUzMiB0Y3Jlc19jbnQgPSBjYWxjX2N5Y2wodGNyZXMgKyBpZl9za2V3LCBjbGtfcGVyaW9k KSArIDE7Cj4gPj4gPj4gKwkJdTMyIHRjZHFzaF9jbnQgPSBjYWxjX2N5Y2wodGNkcXNoICsgaWZf c2tldywgY2xrX3BlcmlvZCkgKyA1Owo+ID4+ID4+ICsKPiA+PiA+PiArCQl0Y3JfY250ID0gY2Fs Y19jeWNsKHRjciArIGlmX3NrZXcsIGNsa19wZXJpb2QpOwo+ID4+ID4+ICsJCS8qCj4gPj4gPj4g KwkJICogc2tldyBub3QgaW5jbHVkZWQgYmVjYXVzZSB0aGlzIHRpbWluZyBkZWZpbmVzIGR1cmF0 aW9uIG9mCj4gPj4gPj4gKwkJICogUkUgb3IgRFFTIGJlZm9yZSBkYXRhIHRyYW5zZmVyCj4gPj4g Pj4gKwkJICovCj4gPj4gPj4gKwkJdHBzdGhfY250ID0gdHBzdGhfY250ICsgMTsKPiA+PiA+PiAr CQlyZWcgPSBGSUVMRF9QUkVQKFRPR0dMRV9USU1JTkdTMF9UUFNUSCwgdHBzdGhfY250KTsKPiA+ PiA+PiArCQlyZWcgfD0gRklFTERfUFJFUChUT0dHTEVfVElNSU5HUzBfVENEUVNTLCB0Y2Rxc3Nf Y250KTsKPiA+PiA+PiArCQlyZWcgfD0gRklFTERfUFJFUChUT0dHTEVfVElNSU5HUzBfVFBSRSwg dHByZV9jbnQpOwo+ID4+ID4+ICsJCXJlZyB8PSBGSUVMRF9QUkVQKFRPR0dMRV9USU1JTkdTMF9U Q1IsIHRjcl9jbnQpOwo+ID4+ID4+ICsJCXQtPnRvZ2dsZV90aW1pbmdzXzAgPSByZWc7Cj4gPj4g Pj4gKwkJZGV2X2RiZyhjZG5zX2N0cmwtPmRldiwgIlRPR0dMRV9USU1JTkdTXzBfU0RSXHQleFxu IiwgcmVnKTsKPiA+PiA+PiArCj4gPj4gPj4gKwkJLy90b2dnbGVfdGltaW5nc18xIC0gdFJQU1Qs dFdQU1QKPiA+PiA+PiArCQlyZWcgPSBGSUVMRF9QUkVQKFRPR0dMRV9USU1JTkdTMV9UQ0RRU0gs IHRjZHFzaF9jbnQpOwo+ID4+ID4+ICsJCXJlZyB8PSBGSUVMRF9QUkVQKFRPR0dMRV9USU1JTkdT MV9UQ1JFUywgdGNyZXNfY250KTsKPiA+PiA+PiArCQlyZWcgfD0gRklFTERfUFJFUChUT0dHTEVf VElNSU5HUzFfVFJQU1QsIHRycHN0X2NudCk7Cj4gPj4gPj4gKwkJcmVnIHw9IEZJRUxEX1BSRVAo VE9HR0xFX1RJTUlOR1MxX1RXUFNULCB0d3BzdF9jbnQpOwo+ID4+ID4+ICsJCXQtPnRvZ2dsZV90 aW1pbmdzXzEgPSByZWc7Cj4gPj4gPj4gKwkJZGV2X2RiZyhjZG5zX2N0cmwtPmRldiwgIlRPR0dM RV9USU1JTkdTXzFfU0RSXHQleFxuIiwgcmVnKTsKPiA+PiA+PiArCX0gIAo+ID4+IFsuLi5dID4g IAo+ID4+ID5UaGlzIGZ1bmN0aW9uIGlzIHNvIGNvbXBsaWNhdGVkICEhISBIb3cgY2FuIHRoaXMg ZXZlbiB3b3JrPyBSZWFsbHksIGl0Cj4gPj4gPmlzIGhhcmQgdG8gZ2V0IGludG8gdGhlIGNvZGUg YW5kIGZvbGxvdywgSSBhbSBzdXJlIHlvdSBjYW4gZG8KPiA+PiA+c29tZXRoaW5nLiAgCj4gPj4g WWVzIGl0IGlzIGNvbXBsaWNhdGVkIGJ1dCB3b3JrcywgSSB3aWxsIHRyeSB0byBzaW1wbGlmeSBp dC4uLiAgIFsuLi5dICAKPiA+Cj4gPlllcyBwbGVhc2UhCj4gPiAgCj4gPj4gPj4gKwkJCQkiQ1Mg JWQgYWxyZWFkeSBhc3NpZ25lZFxuIiwgY3MpOwo+ID4+ID4+ICsJCQlyZXR1cm4gLUVJTlZBTDsK PiA+PiA+PiArCQl9Cj4gPj4gPj4gKwo+ID4+ID4+ICsJCWNkbnNfY2hpcC0+Y3NbaV0gPSBjczsK PiA+PiA+PiArCX0KPiA+PiA+PiArCj4gPj4gPj4gKwljaGlwID0gJmNkbnNfY2hpcC0+Y2hpcDsK PiA+PiA+PiArCWNoaXAtPmNvbnRyb2xsZXIgPSAmY2Ruc19jdHJsLT5jb250cm9sbGVyOwo+ID4+ ID4+ICsJbmFuZF9zZXRfZmxhc2hfbm9kZShjaGlwLCBucCk7Cj4gPj4gPj4gKwo+ID4+ID4+ICsJ bXRkID0gbmFuZF90b19tdGQoY2hpcCk7Cj4gPj4gPj4gKwltdGQtPmRldi5wYXJlbnQgPSBjZG5z X2N0cmwtPmRldjsKPiA+PiA+PiArCj4gPj4gPj4gKwkvKgo+ID4+ID4+ICsJICogRGVmYXVsdCB0 byBIVyBFQ0MgZW5naW5lIG1vZGUuIElmIHRoZSBuYW5kLWVjYy1tb2RlIHByb3BlcnR5IGlzIGdp dmVuCj4gPj4gPj4gKwkgKiBpbiB0aGUgRFQgbm9kZSwgdGhpcyBlbnRyeSB3aWxsIGJlIG92ZXJ3 cml0dGVuIGluIG5hbmRfc2Nhbl9pZGVudCgpLgo+ID4+ID4+ICsJICovCj4gPj4gPj4gKwljaGlw LT5lY2MubW9kZSA9IE5BTkRfRUNDX0hXOwo+ID4+ID4+ICsKPiA+PiA+PiArCS8qCj4gPj4gPj4g KwkgKiBTYXZlIGEgcmVmZXJlbmNlIHZhbHVlIGZvciB0aW1pbmcgcmVnaXN0ZXJzIGJlZm9yZQo+ ID4+ID4+ICsJICogLT5zZXR1cF9kYXRhX2ludGVyZmFjZSgpIGlzIGNhbGxlZC4KPiA+PiA+PiAr CSAqLwo+ID4+ID4+ICsJY2FkZW5jZV9uYW5kX2dldF90aW1pbmdzKGNkbnNfY3RybCwgJmNkbnNf Y2hpcC0+dGltaW5ncyk7ICAKPiA+PiA+Cj4gPj4gPllvdSBjYW5ub3QgcmVseSBvbiB0aGUgQm9v dGxvYWRlcidzIGNvbmZpZ3VyYXRpb24uIFRoaXMgZHJpdmVyIHNob3VsZAo+ID4+ID5kZXJpdmUg aXQuICAKPiA+PiBJIGRvIG5vdCByZWxheSBvbiB0aGUgQm9vdGxvYWRlcidzIGNvbmZpZ3VyYXRp b24gaW4gYW55IHBhcnQuIEkganVzdAo+ID4+IGluaXQgdGltaW5ncyBzdHJ1Y3R1cmUgYmFzZSBv biBjdXJyZW50IHZhbHVlcyBvZiByZWdpc3RlcnMgdG8gZG8gbm90Cj4gPj4gICBoYXZlIHJ1Ymlz aCBpbiB0aW1pbmcgc3RydWN0dXJlLiBWYWx1ZXMgd2lsbCBiZSBjYWxjdWxhdGVkIGJ5IGRyaXZl ciB3aGVuCj4gPj4gc2V0dXBfZGF0YV9pbnRlcmZhY2UgaXMgY2FsbGVkLiBJbiBjYXNlIHNldF90 aW1pbmdzIGlzIGNhbGxlZCBiZWZvcmUKPiA+PiBzZXR1cF9kYXRhX2ludGVyZmFjZSAgCj4gPgo+ ID5Eb2VzIHRoaXMgcmVhbGx5IGhhcHBlbnM/IEkgYW0gcHJldHR5IHN1cmUgaXQgaXMgdGFrZW4g Y2FyZSBvZiBieSB0aGUKPiA+Y29yZS4gSSBkb24ndCB0aGluayB5b3Ugc2hvdWxkIHJlbHkgb24g d2hhdCdzIGluIHRoZSByZWdpc3RlcnMgYXQgYm9vdAo+ID50aW1lLiAgCj4gT2sgSSB3aWxsIGNo ZWNrIGl0IG9uZSBtb3JlIHRpbWUgYW5kIHJlbW92ZSBpZiBub3QgbmVlZGVkLgo+IAo+ID4KPiA+ ICAKPiA+PiB0aGVuIHdlIHdyaXRlIHRoZSBzYW1lIHZhbHVzIHRvIHRpbWluZyByZWdpc3RlcnMK PiA+PiB3aGljaCBhcmUgcHJlc2V0IGluIHJlZ2lzdHJlcy4gVG8gYmUgc2hvcnRlciB0aW1pbmcg cmVnaXN0ZXJzIHdpbGwgc3RheQo+ID4+IHVuY2hhbmdlZC4gID4+ICsJcmV0ID0gbmFuZF9zY2Fu KGNoaXAsIGNkbnNfY2hpcC0+bnNlbHMpOyAgCj4gPj4gPj4gKwlpZiAocmV0KSB7Cj4gPj4gPj4g KwkJZGV2X2VycihjZG5zX2N0cmwtPmRldiwgImNvdWxkIG5vdCBzY2FuIHRoZSBuYW5kIGNoaXBc biIpOwo+ID4+ID4+ICsJCXJldHVybiByZXQ7Cj4gPj4gPj4gKwl9Cj4gPj4gPj4gKwo+ID4+ID4+ ICsJcmV0ID0gbXRkX2RldmljZV9yZWdpc3RlcihtdGQsIE5VTEwsIDApOwo+ID4+ID4+ICsJaWYg KHJldCkgewo+ID4+ID4+ICsJCWRldl9lcnIoY2Ruc19jdHJsLT5kZXYsCj4gPj4gPj4gKwkJCSJm YWlsZWQgdG8gcmVnaXN0ZXIgbXRkIGRldmljZTogJWRcbiIsIHJldCk7Cj4gPj4gPj4gKwkJbmFu ZF9yZWxlYXNlKGNoaXApOyAgCj4gPj4gPgo+ID4+ID5JIHRoaW5rIHlvdSBzaG91bGQgY2FsbCBu YW5kX2NsZWFudXAgaW5zdGVhZCBvZiBuYW5kX3JlbGVhc2UgaGVyZSBoYXMKPiA+PiA+dGhlIG10 ZCBkZXZpY2UgaXMgbm90IHJlZ2lzdGVyZWQgeWV0LiAgCj4gb2sKPiAKPiA+PiA+PiArCQlyZXR1 cm4gcmV0Owo+ID4+ID4+ICsJfQo+ID4+ID4+ICsKPiA+PiA+PiArCWxpc3RfYWRkX3RhaWwoJmNk bnNfY2hpcC0+bm9kZSwgJmNkbnNfY3RybC0+Y2hpcHMpOwo+ID4+ID4+ICsKPiA+PiA+PiArCXJl dHVybiAwOwo+ID4+ID4+ICt9Cj4gPj4gPj4gKwo+ID4+ID4+ICtzdGF0aWMgaW50IGNhZGVuY2Vf bmFuZF9jaGlwc19pbml0KHN0cnVjdCBjZG5zX25hbmRfY3RybCAqY2Ruc19jdHJsKQo+ID4+ID4+ ICt7Cj4gPj4gPj4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gY2Ruc19jdHJsLT5kZXYtPm9m X25vZGU7Cj4gPj4gPj4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5hbmRfbnA7Cj4gPj4gPj4gKwlp bnQgbWF4X2NzID0gY2Ruc19jdHJsLT5jYXBzMi5tYXhfYmFua3M7Cj4gPj4gPj4gKwlpbnQgbmNo aXBzOwo+ID4+ID4+ICsJaW50IHJldDsKPiA+PiA+PiArCj4gPj4gPj4gKwluY2hpcHMgPSBvZl9n ZXRfY2hpbGRfY291bnQobnApOwo+ID4+ID4+ICsKPiA+PiA+PiArCWlmIChuY2hpcHMgPiBtYXhf Y3MpIHsKPiA+PiA+PiArCQlkZXZfZXJyKGNkbnNfY3RybC0+ZGV2LAo+ID4+ID4+ICsJCQkidG9v IG1hbnkgTkFORCBjaGlwczogJWQgKG1heCA9ICVkIENTKVxuIiwKPiA+PiA+PiArCQkJbmNoaXBz LCBtYXhfY3MpOwo+ID4+ID4+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4+ID4+ICsJfQo+ID4+ID4+ ICsKPiA+PiA+PiArCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobnAsIG5hbmRfbnApIHsKPiA+PiA+ PiArCQlyZXQgPSBjYWRlbmNlX25hbmRfY2hpcF9pbml0KGNkbnNfY3RybCwgbmFuZF9ucCk7Cj4g Pj4gPj4gKwkJaWYgKHJldCkgewo+ID4+ID4+ICsJCQlvZl9ub2RlX3B1dChuYW5kX25wKTsKPiA+ PiA+PiArCQkJcmV0dXJuIHJldDsKPiA+PiA+PiArCQl9ICAKPiA+PiA+Cj4gPj4gPklmIG5hbmRf Y2hpcF9pbml0KCkgZmFpbHMgb24gYW5vdGhlciBjaGlwIHRoYW4gdGhlIGZpcnN0IG9uZSwgdGhl cmUgaXMKPiA+PiA+c29tZSBnYXJiYWdlIGNvbGxlY3Rpb24gdG8gZG8uICAKPiBvawo+IAo+ID4+ ID4+ICsJfQo+ID4+ID4+ICsKPiA+PiA+PiArCXJldHVybiAwOwo+ID4+ID4+ICt9Cj4gPj4gPj4g Kwo+ID4+ID4+ICtzdGF0aWMgaW50IGNhZGVuY2VfbmFuZF9pbml0KHN0cnVjdCBjZG5zX25hbmRf Y3RybCAqY2Ruc19jdHJsKQo+ID4+ID4+ICt7Cj4gPj4gPj4gKwlkbWFfY2FwX21hc2tfdCBtYXNr Owo+ID4+ID4+ICsJaW50IHJldCA9IDA7Cj4gPj4gPj4gKwo+ID4+ID4+ICsJY2Ruc19jdHJsLT5j ZG1hX2Rlc2MgPSBkbWFfYWxsb2NfY29oZXJlbnQoY2Ruc19jdHJsLT5kZXYsCj4gPj4gPj4gKwkJ CQkJCSAgc2l6ZW9mKCpjZG5zX2N0cmwtPmNkbWFfZGVzYyksCj4gPj4gPj4gKwkJCQkJCSAgJmNk bnNfY3RybC0+ZG1hX2NkbWFfZGVzYywKPiA+PiA+PiArCQkJCQkJICBHRlBfS0VSTkVMKTsKPiA+ PiA+PiArCWlmICghY2Ruc19jdHJsLT5kbWFfY2RtYV9kZXNjKQo+ID4+ID4+ICsJCXJldHVybiAt RU5PTUVNOwo+ID4+ID4+ICsKPiA+PiA+PiArCWNkbnNfY3RybC0+YnVmX3NpemUgPSAxNiAqIDEw MjQ7ICAKPiA+PiA+Cj4gPj4gPnMvMTAyNC9TWl8xSy8KPiA+PiA+ICAKPiA+PiA+PiArCWNkbnNf Y3RybC0+YnVmID0ga21hbGxvYyhjZG5zX2N0cmwtPmJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsgIAo+ ID4+ID4KPiA+PiA+SWYgeW91IHVzZSBrbWFsbG9jIGhlcmUgdGhlbiB0aGlzIGJ1ZmZlciB3aWxs IGFsd2F5cyBiZSBETUEtYWJsZSwKPiA+PiA+cmlnaHQ/ICAKPiA+PiBSaWdodCBJIGhhdmUgc2Vl biBzdWNoIHNvbHV0aW9uIGluIGFub3RoZXIgZHJpdmVyLgo+ID4+Cj4gPj4KPiA+PiBUaGFua3Mg Zm9yIHJldmlldmluZyB0aGlzIHBhdGNoLiBQbGVhc2UgYW5zd2VyIG9uIG15IHF1ZXN0aW9uIGhv dyB3cml0ZV9vb2IKPiA+PiBhbmQgcmVhZF9vb2IgZnVuY3Rpb25zIHNob3VsZCBiZSBpbXBsZW1l bnRlZC4KPiA+PiAgCj4gPj4gPgo+ID4+ID4KPiA+PiA+VGhhbmtzLAo+ID4+ID5NaXF1w6hsICAK PiA+Pgo+ID4+ICAgVGhhbmtzCj4gPj4gUGlvdHIgU3Jva2EgIAo+ID4KPiA+VGhhbmtzLAo+ID5N aXF1w6hsICAKPiAKPiBUaGFua3MKPiBQaW90cgoKVGhhbmtzLApNaXF1w6hsCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KTGludXggTVREIGRp c2N1c3Npb24gbWFpbGluZyBsaXN0Cmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4v bGlzdGluZm8vbGludXgtbXRkLwo= 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=-3.7 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 521A4C48BD6 for ; Thu, 27 Jun 2019 16:16:02 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1173A20659 for ; Thu, 27 Jun 2019 16:16:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726518AbfF0QQA convert rfc822-to-8bit (ORCPT ); Thu, 27 Jun 2019 12:16:00 -0400 Received: from relay1-d.mail.gandi.net ([217.70.183.193]:36541 "EHLO relay1-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726441AbfF0QQA (ORCPT ); Thu, 27 Jun 2019 12:16:00 -0400 X-Originating-IP: 91.224.148.103 Received: from xps13 (unknown [91.224.148.103]) (Authenticated sender: miquel.raynal@bootlin.com) by relay1-d.mail.gandi.net (Postfix) with ESMTPSA id D671A240005; Thu, 27 Jun 2019 16:15:45 +0000 (UTC) Date: Thu, 27 Jun 2019 18:15:42 +0200 From: Miquel Raynal To: Piotr Sroka Cc: , Boris Brezillon , Richard Weinberger , David Woodhouse , Brian Norris , Marek Vasut , Paul Burton , "Geert Uytterhoeven" , Arnd Bergmann , "Marcel Ziswiler" , Dmitry Osipenko , Stefan Agner , Subject: Re: [PATCH v2 1/2] mtd: nand: Add Cadence NAND controller driver Message-ID: <20190627181542.131aa061@xps13> In-Reply-To: <20190606151948.GA10565@global.cadence.com> References: <20190219161406.4340-1-piotrs@cadence.com> <20190219161823.22466-1-piotrs@cadence.com> <20190305190954.6c38d681@xps13> <20190321093356.GA19577@global.cadence.com> <20190512142426.11453a6c@xps13> <20190606151948.GA10565@global.cadence.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.1 (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-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Piotr, Piotr Sroka wrote on Thu, 6 Jun 2019 16:19:51 +0100: > Hi Miquel > > > The 05/12/2019 14:24, Miquel Raynal wrote: > >EXTERNAL MAIL > > > > > >EXTERNAL MAIL > > > > > >Hi Piotr, > > > >Sorry for de delay. > > > >Piotr Sroka wrote on Thu, 21 Mar 2019 09:33:58 > >+0000: > > > >> The 03/05/2019 19:09, Miquel Raynal wrote: > >> >EXTERNAL MAIL > >> > > >> > > >> >Hi Piotr, > >> > > >> >Piotr Sroka wrote on Tue, 19 Feb 2019 16:18:23 > >> >+0000: > >> > > >> >> This patch adds driver for Cadence HPNFC NAND controller. > >> >> > >> >> Signed-off-by: Piotr Sroka > >> >> --- > >> >> Changes for v2: > >> >> - create one universal wait function for all events instead of one > >> >> function per event. > >> >> - split one big function executing nand operations to separate > >> >> functions one per each type of operation. > >> >> - add erase atomic operation to nand operation parser > >> >> - remove unnecessary includes. > >> >> - remove unused register defines > >> >> - add support for multiple nand chips > >> >> - remove all code using legacy functions > >> >> - remove chip dependents parameters from dts bindings, they were > >> >> attached to the SoC specific compatible at the driver level > >> >> - simplify interrupt handling > >> >> - simplify timing calculations > >> >> - fix calculation of maximum supported cs signals > >> >> - simplify ecc size calculation > >> >> - remove header file and put whole code to one c file > >> >> --- > >> >> drivers/mtd/nand/raw/Kconfig | 8 + > >> >> drivers/mtd/nand/raw/Makefile | 1 + > >> >> drivers/mtd/nand/raw/cadence-nand-controller.c | 3288 ++++++++++++++++++++++++ > >> > > >> >This driver is way too massive, I am pretty sure it can shrink a > >> >little bit more. > >> >[...] > >> > > >> I will try to make it shorer but it will be difucult to achive. It is because - there are a lot of calculation needed for PHY - ECC are interleaved with data (like on marvell-nand or gpmi-nand). > >> Therefore: + RAW mode is complicated + protecting BBM increases number of lines of source code > >> - need to support two DMA engines internal and external (slave) We will see on next patch version what is the result. That page layout looks: > > > >Maybe you don't need to support both internal and external DMA? > > > >I am pretty sure there are rooms for size reduction. > > I describe how it works in general and maybe you help me chose better solution. > > HW controller can work in 3 modes. PIO - can work in master or slave DMA > CDMA - needs Master DMA for accessing command descriptors. > Generic mode - can use only Slave DMA. > > Generic mode is neccessery to implement functions other than page > program, page read, block erase. So it is essential. I cannot avoid > to use Slave DMA. This deserves a nice comment at the top. > > I change CDMA mode to PIO mode. Then I can use only slave DMA. But CDMA has a feature which is not present in PIO mode. The feature > gives possibility to point DMA engine two buffers to transfer. It is > used to point data buffer and oob bufer. In PIO mode I would need to > copy data buffer and oob buffer to third buffer. Next transfer data from > third buffer. > In that solution we need to copy all data by CPU and then use DMA. Controller needs always transfer oob because of HW ECC restrictions. Such change will decrease performce for all data transfers. > I think performance is more important in that case. What is your > opinion? [...] Indeed > >> > > >> >What is this for? > >> Fucntions enables/disables hardware detection of erased data > >> pages. > > > > >Ok, the name is not very explicit , maybe you could tell this with a > >comment. > > > Ok. > > >> >> + > >> >> +/* hardware initialization */ > >> >> +static int cadence_nand_hw_init(struct cdns_nand_ctrl *cdns_ctrl) > >> >> +{ > >> >> + int status = 0; > >> >> + u32 reg; > >> >> + > >> >> + status = cadence_nand_wait_for_value(cdns_ctrl, CTRL_STATUS, > >> >> + 1000000, > >> >> + CTRL_STATUS_INIT_COMP, false); > >> >> + if (status) > >> >> + return status; > >> >> + > >> >> + reg = readl(cdns_ctrl->reg + CTRL_VERSION); > >> >> + > >> >> + dev_info(cdns_ctrl->dev, > >> >> + "%s: cadence nand controller version reg %x\n", > >> >> + __func__, reg); > >> >> + > >> >> + /* disable cache and multiplane */ > >> >> + writel(0, cdns_ctrl->reg + MULTIPLANE_CFG); > >> >> + writel(0, cdns_ctrl->reg + CACHE_CFG); > >> >> + > >> >> + /* clear all interrupts */ > >> >> + writel(0xFFFFFFFF, cdns_ctrl->reg + INTR_STATUS); > >> >> + > >> >> + cadence_nand_get_caps(cdns_ctrl); > >> >> + cadence_nand_read_bch_cfg(cdns_ctrl); > >> > > >> >No, you cannot rely on the bootloader's configuration. And I suppose > >> >this is what the first call to read_bch_cfg does? > >> I do not realy on boot loader. Just read NAND flash > >> controller configuration from read only capabilities registers. > > > >Ok, if these are RO registers, it's fine. But maybe don't call the > >function "read bch config" which suggest that this is something you can > >change. > > > ok. > > >> > >> > >> >> + > >> >> +#define TT_OOB_AREA 1 > >> >> +#define TT_MAIN_OOB_AREAS 2 > >> >> +#define TT_RAW_PAGE 3 > >> >> +#define TT_BBM 4 > >> >> +#define TT_MAIN_OOB_AREA_EXT 5 > >> >> + > >> >> +/* prepare size of data to transfer */ > >> >> +static int > >> >> +cadence_nand_prepare_data_size(struct nand_chip *chip, > >> >> + int transfer_type) > >> >> +{ > >> >> + struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller); > >> >> + struct cdns_nand_chip *cdns_chip = to_cdns_nand_chip(chip); > >> >> + u32 sec_size = 0, last_sec_size, offset = 0, sec_cnt = 1; > >> >> + u32 ecc_size = chip->ecc.bytes; > >> >> + u32 data_ctrl_size = 0; > >> >> + u32 reg = 0; > >> >> + > >> >> + if (cdns_ctrl->curr_trans_type == transfer_type) > >> >> + return 0; > >> >> + > >> >> + switch (transfer_type) { > >> > > >> >Please turn the controller driver as dumb as possible. You should not > >> >care which part of the OOB area you are accessing. > >> It is a bit confusing for me how accessing OOB should be implemented. > >> I know that read_oob function is called to check BBM value when BBT is > >> initialized. It is also a bit confusing for me why the raw version is > >> not used for that purpose. In current implementation if you write oob by write_page function next > >> read oob by read_oob function then data will be the same. > >> If I implement dump functions read_oob and write_oob then > >> 1. ECC must be disabled for these functions > >> 2. oob data accessing by write_page/read_page will be different > >> (different offsets) that the data accessing by read_oob/write_oob > >> functions > > > >No, I fear this is not acceptable. > > > >> If above described "functionalities" are acceptable I will change implementation of write_oob and read_oob functions. > >> The write_page and read_page must be implemented in that way as it is now. Let me know which solution is preffered. > > > >If this is too complicated to just write the oob, why not fallback on > >read/write_page (with oob_required and a dummy data buffer)? > > I considered it. Actually, it would simplify the code. The disadvantage > of using the same function is that the each write/read oob will cause full page > read/write. In current version only last sector is read/write together > with oob. This will affect the performance degradation of oob write/read function. So I do not know what is more important. 1. OOB functions performance, > 2. simplier code. Honestly I don't think slowing down a bit OOB access is critical as, with recent software layers like UBI/UBIFS we do not access OOB only that much. So here I would choose 2. >> > >> >> + case TT_OOB_AREA: > >> >> + offset = cdns_chip->main_size - cdns_chip->sector_size; > >> >> + ecc_size = ecc_size * (offset / cdns_chip->sector_size); > >> >> + offset = offset + ecc_size; > >> >> + sec_cnt = 1; > >> >> + last_sec_size = cdns_chip->sector_size > >> >> + + cdns_chip->avail_oob_size; > >> >> + break; > >> >> + case TT_MAIN_OOB_AREA_EXT: > >> >> + sec_cnt = cdns_chip->sector_count; > >> >> + last_sec_size = cdns_chip->sector_size; > >> >> + sec_size = cdns_chip->sector_size; > >> >> + data_ctrl_size = cdns_chip->avail_oob_size; > >> >> + break; > >> >> + case TT_MAIN_OOB_AREAS: > >> >> + sec_cnt = cdns_chip->sector_count; > >> >> + last_sec_size = cdns_chip->sector_size > >> >> + + cdns_chip->avail_oob_size; > >> >> + sec_size = cdns_chip->sector_size; > >> >> + break; > >> >> + case TT_RAW_PAGE: > >> >> + last_sec_size = cdns_chip->main_size + cdns_chip->oob_size; > >> >> + break; > >> >> + case TT_BBM: > >> >> + offset = cdns_chip->main_size + cdns_chip->bbm_offs; > >> >> + last_sec_size = 8; > >> >> + break; > >> >> + default: > >> >> + dev_err(cdns_ctrl->dev, "Data size preparation failed\n"); > >> >> + return -EINVAL; > >> >> + } > >> >> + > >> >> + reg = 0; > >> >> + reg |= FIELD_PREP(TRAN_CFG_0_OFFSET, offset); > >> >> + reg |= FIELD_PREP(TRAN_CFG_0_SEC_CNT, sec_cnt); > >> >> + writel(reg, cdns_ctrl->reg + TRAN_CFG_0); > >> >> + > >> >> + reg = 0; > >> >> + reg |= FIELD_PREP(TRAN_CFG_1_LAST_SEC_SIZE, last_sec_size); > >> >> + reg |= FIELD_PREP(TRAN_CFG_1_SECTOR_SIZE, sec_size); > >> >> + writel(reg, cdns_ctrl->reg + TRAN_CFG_1); > >> >> + > >> >> + reg = readl(cdns_ctrl->reg + CONTROL_DATA_CTRL); > >> >> + reg &= ~CONTROL_DATA_CTRL_SIZE; > >> >> + reg |= FIELD_PREP(CONTROL_DATA_CTRL_SIZE, data_ctrl_size); > >> >> + writel(reg, cdns_ctrl->reg + CONTROL_DATA_CTRL); > >> >> + > >> >> + cdns_ctrl->curr_trans_type = transfer_type; > >> >> + > >> >> + return 0; > >> >> +} > >> >> + > [...] >> >> + > >> [...] >> + /* > >> >> + * the idea of those calculation is to get the optimum value > >> >> + * for tRP and tRH timings if it is NOT possible to sample data > >> >> + * with optimal tRP/tRH settings the parameters will be extended > >> >> + */ > >> >> + if (sdr->tRC_min <= clk_period && > >> >> + sdr->tRP_min <= (clk_period / 2) && > >> >> + sdr->tREH_min <= (clk_period / 2)) { > >> > > >> >Will this situation really happen? > >> I think yes for follwing values trc_min 20000 ps > >> trp_min 10000 ps > >> treh_min 7000 ps > >> clk_period 20000 ps > > > >Ok, you may add a comment stating that this may be the case in EDO mode > >5. > I did not anwer clearly last time. It was just an example. The result of that "if" depends on NAND flash device timing mode and NAND flash controller clock. Minumum value of clk is 20MHz (50ns). So it may be a case for Asynchronous Mode 1 if > NAND flash controller clock is 20MHz. I will add this info in comment. I am not sure to understand correctly what you mean. Please try to write a nice comment and we'll see. > >> [...] > >> >> + } > >> >> + > >> >> + if (cdns_ctrl->caps2.is_phy_type_dll) { > >> > > >> >Is the else part allowed? > Register accessed in this block does not exists if is_phy_type_dll is 0. So they are preveted to be accessed. the else is not needed. > >> > > >> following register does not exist if caps2.is_phy_type_dll is 0 >> + u32 tpre_cnt = calc_cycl(tpre, clk_period); > >> >> + u32 tcdqss_cnt = calc_cycl(tcdqss + if_skew, clk_period); > >> >> + u32 tpsth_cnt = calc_cycl(tpsth + if_skew, clk_period); > >> >> + > >> >> + u32 trpst_cnt = calc_cycl(trpst + if_skew, clk_period) + 1; > >> >> + u32 twpst_cnt = calc_cycl(twpst + if_skew, clk_period) + 1; > >> >> + u32 tcres_cnt = calc_cycl(tcres + if_skew, clk_period) + 1; > >> >> + u32 tcdqsh_cnt = calc_cycl(tcdqsh + if_skew, clk_period) + 5; > >> >> + > >> >> + tcr_cnt = calc_cycl(tcr + if_skew, clk_period); > >> >> + /* > >> >> + * skew not included because this timing defines duration of > >> >> + * RE or DQS before data transfer > >> >> + */ > >> >> + tpsth_cnt = tpsth_cnt + 1; > >> >> + reg = FIELD_PREP(TOGGLE_TIMINGS0_TPSTH, tpsth_cnt); > >> >> + reg |= FIELD_PREP(TOGGLE_TIMINGS0_TCDQSS, tcdqss_cnt); > >> >> + reg |= FIELD_PREP(TOGGLE_TIMINGS0_TPRE, tpre_cnt); > >> >> + reg |= FIELD_PREP(TOGGLE_TIMINGS0_TCR, tcr_cnt); > >> >> + t->toggle_timings_0 = reg; > >> >> + dev_dbg(cdns_ctrl->dev, "TOGGLE_TIMINGS_0_SDR\t%x\n", reg); > >> >> + > >> >> + //toggle_timings_1 - tRPST,tWPST > >> >> + reg = FIELD_PREP(TOGGLE_TIMINGS1_TCDQSH, tcdqsh_cnt); > >> >> + reg |= FIELD_PREP(TOGGLE_TIMINGS1_TCRES, tcres_cnt); > >> >> + reg |= FIELD_PREP(TOGGLE_TIMINGS1_TRPST, trpst_cnt); > >> >> + reg |= FIELD_PREP(TOGGLE_TIMINGS1_TWPST, twpst_cnt); > >> >> + t->toggle_timings_1 = reg; > >> >> + dev_dbg(cdns_ctrl->dev, "TOGGLE_TIMINGS_1_SDR\t%x\n", reg); > >> >> + } > >> [...] > > >> >This function is so complicated !!! How can this even work? Really, it > >> >is hard to get into the code and follow, I am sure you can do > >> >something. > >> Yes it is complicated but works, I will try to simplify it... [...] > > > >Yes please! > > > >> >> + "CS %d already assigned\n", cs); > >> >> + return -EINVAL; > >> >> + } > >> >> + > >> >> + cdns_chip->cs[i] = cs; > >> >> + } > >> >> + > >> >> + chip = &cdns_chip->chip; > >> >> + chip->controller = &cdns_ctrl->controller; > >> >> + nand_set_flash_node(chip, np); > >> >> + > >> >> + mtd = nand_to_mtd(chip); > >> >> + mtd->dev.parent = cdns_ctrl->dev; > >> >> + > >> >> + /* > >> >> + * Default to HW ECC engine mode. If the nand-ecc-mode property is given > >> >> + * in the DT node, this entry will be overwritten in nand_scan_ident(). > >> >> + */ > >> >> + chip->ecc.mode = NAND_ECC_HW; > >> >> + > >> >> + /* > >> >> + * Save a reference value for timing registers before > >> >> + * ->setup_data_interface() is called. > >> >> + */ > >> >> + cadence_nand_get_timings(cdns_ctrl, &cdns_chip->timings); > >> > > >> >You cannot rely on the Bootloader's configuration. This driver should > >> >derive it. > >> I do not relay on the Bootloader's configuration in any part. I just > >> init timings structure base on current values of registers to do not > >> have rubish in timing structure. Values will be calculated by driver when > >> setup_data_interface is called. In case set_timings is called before > >> setup_data_interface > > > >Does this really happens? I am pretty sure it is taken care of by the > >core. I don't think you should rely on what's in the registers at boot > >time. > Ok I will check it one more time and remove if not needed. > > > > > > >> then we write the same valus to timing registers > >> which are preset in registres. To be shorter timing registers will stay > >> unchanged. >> + ret = nand_scan(chip, cdns_chip->nsels); > >> >> + if (ret) { > >> >> + dev_err(cdns_ctrl->dev, "could not scan the nand chip\n"); > >> >> + return ret; > >> >> + } > >> >> + > >> >> + ret = mtd_device_register(mtd, NULL, 0); > >> >> + if (ret) { > >> >> + dev_err(cdns_ctrl->dev, > >> >> + "failed to register mtd device: %d\n", ret); > >> >> + nand_release(chip); > >> > > >> >I think you should call nand_cleanup instead of nand_release here has > >> >the mtd device is not registered yet. > ok > > >> >> + return ret; > >> >> + } > >> >> + > >> >> + list_add_tail(&cdns_chip->node, &cdns_ctrl->chips); > >> >> + > >> >> + return 0; > >> >> +} > >> >> + > >> >> +static int cadence_nand_chips_init(struct cdns_nand_ctrl *cdns_ctrl) > >> >> +{ > >> >> + struct device_node *np = cdns_ctrl->dev->of_node; > >> >> + struct device_node *nand_np; > >> >> + int max_cs = cdns_ctrl->caps2.max_banks; > >> >> + int nchips; > >> >> + int ret; > >> >> + > >> >> + nchips = of_get_child_count(np); > >> >> + > >> >> + if (nchips > max_cs) { > >> >> + dev_err(cdns_ctrl->dev, > >> >> + "too many NAND chips: %d (max = %d CS)\n", > >> >> + nchips, max_cs); > >> >> + return -EINVAL; > >> >> + } > >> >> + > >> >> + for_each_child_of_node(np, nand_np) { > >> >> + ret = cadence_nand_chip_init(cdns_ctrl, nand_np); > >> >> + if (ret) { > >> >> + of_node_put(nand_np); > >> >> + return ret; > >> >> + } > >> > > >> >If nand_chip_init() fails on another chip than the first one, there is > >> >some garbage collection to do. > ok > > >> >> + } > >> >> + > >> >> + return 0; > >> >> +} > >> >> + > >> >> +static int cadence_nand_init(struct cdns_nand_ctrl *cdns_ctrl) > >> >> +{ > >> >> + dma_cap_mask_t mask; > >> >> + int ret = 0; > >> >> + > >> >> + cdns_ctrl->cdma_desc = dma_alloc_coherent(cdns_ctrl->dev, > >> >> + sizeof(*cdns_ctrl->cdma_desc), > >> >> + &cdns_ctrl->dma_cdma_desc, > >> >> + GFP_KERNEL); > >> >> + if (!cdns_ctrl->dma_cdma_desc) > >> >> + return -ENOMEM; > >> >> + > >> >> + cdns_ctrl->buf_size = 16 * 1024; > >> > > >> >s/1024/SZ_1K/ > >> > > >> >> + cdns_ctrl->buf = kmalloc(cdns_ctrl->buf_size, GFP_KERNEL); > >> > > >> >If you use kmalloc here then this buffer will always be DMA-able, > >> >right? > >> Right I have seen such solution in another driver. > >> > >> > >> Thanks for revieving this patch. Please answer on my question how write_oob > >> and read_oob functions should be implemented. > >> > >> > > >> > > >> >Thanks, > >> >Miquèl > >> > >> Thanks > >> Piotr Sroka > > > >Thanks, > >Miquèl > > Thanks > Piotr Thanks, Miquèl