From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 81D75EB64DA for ; Wed, 14 Jun 2023 09:10:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=NAfVcUb9gQISEQjzgl6MdDSetlKlzeenq6CgQD5ZxVw=; b=ovaryaY7VHhP0m QnhB4NzFuV5K89igrjrG0nZn/zMNQl/W4+/XhwkfasiOGiu9n07mKrPuXG9OMw9BKIw64qarwNfok 0HfbOLJB72SrixBbnEaAw9NE3jp7wx75LIKGMT1SKX2z5KeFreaMh3lhtakSpUcg031jsLqcDN+k/ JF0sIktJ3DwutbPdZZjSU8/UP+wlOfj7bV4LP8gVc+61jsuQ6pAGatKV6yfXj034mVNo0ClJI0xr+ 2Li2E01uVJjprtuqldb1IhWBA8cjqITMP5qctFw0jFjDDCmyEoN/QoCT6yTGww3Rw/IpY7RDL9a5b AfpRSnlp1pk45CP+mr/A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1q9MW7-00B0nH-2i; Wed, 14 Jun 2023 09:10:15 +0000 Received: from relay8-d.mail.gandi.net ([2001:4b98:dc4:8::228]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1q9MW3-00B0lk-2V for linux-mtd@lists.infradead.org; Wed, 14 Jun 2023 09:10:14 +0000 X-GND-Sasl: miquel.raynal@bootlin.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1686733806; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=WAO5PoZt2knoBaPqUHhj1MWZZ6nSInLED8yri3KtZlU=; b=dbO9elaRNuDZck4qiTEc3pGJCibUD8JclWSoc7sNAJymaXu4bKXWjqeflYagBks5OOEHZX 3a1D+82Dypr6PV+d0T5CbS99ulko1Pu6FX7mYCIcAkAmeaotiBRWUNx6L3fHlFTTHfzy3d 8RHn4031SlvyhG7J25Q9crNfdud4jwP6A1ow/6k14qObkDJEL4UU5s/7/lajqa34kNJe3r AJZWgo9+ASO+HEXUs+VP5eBcXrGfPEeHQnBBhwDGNQq59LVPCxE3sk0TUU7kZeneMm5e7f fEhB4Y93yo9sC4O9vjp9JIunrte2yHJrY0e09P7bSbrazwoa2EXrSOC/Pjzt3Q== X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com Received: by mail.gandi.net (Postfix) with ESMTPSA id CD1FA1BF20C; Wed, 14 Jun 2023 09:10:02 +0000 (UTC) Date: Wed, 14 Jun 2023 11:10:01 +0200 From: Miquel Raynal To: liao jaime Cc: Arseniy Krasnov , Richard Weinberger , Vignesh Raghavendra , Sumit Semwal , Christian =?UTF-8?B?S8O2bmln?= , oxffffaa@gmail.com, kernel@sberdevices.ru, Boris Brezillon , Jaime Liao , Mason Yang , linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org Subject: Re: [PATCH v4] mtd: rawnand: macronix: OTP access for MX30LFxG18AC Message-ID: <20230614111001.6b0417d4@xps-13> In-Reply-To: References: <20230523101637.3009746-1-AVKrasnov@sberdevices.ru> <20230612185354.09b88e0d@xps-13> Organization: Bootlin X-Mailer: Claws Mail 4.0.0 (GTK+ 3.24.33; 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-20230614_021012_260610_D76CB482 X-CRM114-Status: GOOD ( 38.30 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org SGkgbGlhbywKCmphaW1lbGlhby50d0BnbWFpbC5jb20gd3JvdGUgb24gV2VkLCAxNCBKdW4gMjAy MyAxNzowNjoxNiArMDgwMDoKCj4gSGkgTWlxdWVsCj4gCj4gCj4gPgo+ID4gSGVsbG8sCj4gPgo+ ID4gQVZLcmFzbm92QHNiZXJkZXZpY2VzLnJ1IHdyb3RlIG9uIFR1ZSwgMjMgTWF5IDIwMjMgMTM6 MTY6MzQgKzAzMDA6Cj4gPiAgCj4gPiA+IFRoaXMgYWRkcyBzdXBwb3J0IGZvciBPVFAgYXJlYSBh Y2Nlc3Mgb24gTVgzMExGeEcxOEFDIGNoaXAgc2VyaWVzLiAgCj4gPgo+ID4gSmFpbWUsIGFueSBm ZWVkYmFjayBvbiB0aGlzPyBXaWxsIHlvdSB0ZXN0IGl0Pwo+ID4KPiA+IEhvdyBhcmUgd2Ugc3Vw cG9zZWQgdG8gdGVzdCB0aGUgT1RQIGlzIGxvY2tlZD8gSSBzZWUgdGhpcyBpcyBzdGlsbCBhbgo+ ID4gb3BlbiBwb2ludC4gIAo+IEFmdGVyIGNoZWNraW5nIHdpdGggaW50ZXJuYWwsIHN1YiBmZWF0 dXJlIHBhcmFtZXRlciBhcmUgdm9sYXRpbGUgcmVnaXN0ZXIuCj4gCj4gSXQgY291bGQgYmUgY2hh bmdlIGFmdGVyIGVudGVyL2V4aXQgT1RQIHJlZ2lvbiBvciBwb3dlciBjeWNsZSBldmVuIE9UUAo+ IAo+IHJlZ2lvbiBoYXZlIGJlZW4gbG9ja2VkLgo+IAo+IE9UUCBvcGVyYXRpb24gbW9kZSBzdGls bCBjb3VsZCBiZSBlbnRlci9leGl0IGFuZCByZWdpb24gaXMgcmVhZCBvbmx5Cj4gYWZ0ZXIgT1RQ IGluIHByb3RlY3QgbW9kZS4KPiAKPiAjcHJvZ3JhbSBjb21tYW5kIGNvdWxkIGV4ZWN1dGUgYnV0 IG5vIHVzZSBhZnRlciBzZXR0aW5nIE9UUCByZWdpb24gaW4KPiBwcm90ZWN0IG1vZGUuCj4gCj4g U28gdGhhdCB3ZSBjYW4ndCBjaGVjayB3aGV0aGVyIE9UUCByZWdpb24gaXMgbG9ja2VkIHZpYSBn ZXQgZmVhdHVyZS4KPiAKPiBBbmQgd2UgZG9uJ3QgaGF2ZSByZWdpb24gZm9yIGNoZWNraW5nIHN0 YXR1cyBvZiBPVFAgbG9ja2VkLgoKQWgsIHRvbyBiYWQuIEJ1dCB0aGFua3MgYSBsb3QgZm9yIHRo ZSBleHBsYW5hdGlvbi4gQXJzZW5peSwgY2FuIHlvdQpwbGVhc2UgY2hhbmdlIHlvdXIgY29tbWVu dCB0byBleHBsYWluIHRoYXQgdGhlIGJpdCBpcyB2b2xhdGlsZSBhbmQgdGh1cwp0aGVyZSBpcyBu byB3YXkgdG8gY2hlY2sgaWYgYW4gb3RwIHJlZ2lvbiBpcyBsb2NrZWQ/IEkgd291bGQgcmV0dXJu CkVPUE5PVFNVUFAgaW4gdGhpcyBjYXNlIGFuZCB2ZXJpZnkgdGhhdCB0aGUgY29yZSBjbGVhbmx5 IGhhbmRsZXMgdGhlCnNpdHVhdGlvbi4KClRoYW5rcywKTWlxdcOobAoKPiAKPiA+ICAKPiA+ID4K PiA+ID4gU2lnbmVkLW9mZi1ieTogQXJzZW5peSBLcmFzbm92IDxBVktyYXNub3ZAc2JlcmRldmlj ZXMucnU+Cj4gPiA+IC0tLQo+ID4gPiAgIHYxIC0+IHYyOgo+ID4gPiAgICogQWRkIHNsYWIuaCBp bmNsdWRlIGR1ZSB0byBrZXJuZWwgdGVzdCByb2JvdCBlcnJvci4KPiA+ID4gICB2MiAtPiB2MzoK PiA+ID4gICAqIFVzZSAndWludDY0X3QnIGFzIGlucHV0IGFyZ3VtZW50IGZvciAnZG9fZGl2KCkn IGluc3RlYWQKPiA+ID4gICAgIG9mICd1bnNpZ25lZCBsb25nJyBkdWUgdG8ga2VybmVsIHRlc3Qg cm9ib3QgZXJyb3IuCj4gPiA+ICAgdjMgLT4gdjQ6Cj4gPiA+ICAgKiBVc2UgJ2Rldl9lcnIoKScg aW5zdGVhZCBvZiAnV0FSTigpJy4KPiA+ID4gICAqIENhbGwgJ21hdGNoX3N0cmluZygpJyBiZWZv cmUgY2hlY2tpbmcgJ3N1cHBvcnRzX3NldF9nZXRfZmVhdHVyZXMnCj4gPiA+ICAgICBpbiAnbWFj cm9uaXhfbmFuZF9zZXR1cF9vdHAoKS4KPiA+ID4gICAqIFVzZSAndTgnIGluc3RlYWQgb2YgJ3Vp bnQ4X3QnIGFzIC4vY2hlY2twYXRjaC5wbCB3YW50cy4KPiA+ID4KPiA+ID4gIGRyaXZlcnMvbXRk L25hbmQvcmF3L25hbmRfbWFjcm9uaXguYyB8IDIxNiArKysrKysrKysrKysrKysrKysrKysrKysr KysKPiA+ID4gIDEgZmlsZSBjaGFuZ2VkLCAyMTYgaW5zZXJ0aW9ucygrKQo+ID4gPgo+ID4gPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9yYXcvbmFuZF9tYWNyb25peC5jIGIvZHJpdmVy cy9tdGQvbmFuZC9yYXcvbmFuZF9tYWNyb25peC5jCj4gPiA+IGluZGV4IDE0NzJmOTI1ZjM4Ni4u YmUxZmZhOTNiZWJiIDEwMDY0NAo+ID4gPiAtLS0gYS9kcml2ZXJzL210ZC9uYW5kL3Jhdy9uYW5k X21hY3Jvbml4LmMKPiA+ID4gKysrIGIvZHJpdmVycy9tdGQvbmFuZC9yYXcvbmFuZF9tYWNyb25p eC5jCj4gPiA+IEBAIC02LDYgKzYsNyBAQAo+ID4gPiAgICogQXV0aG9yOiBCb3JpcyBCcmV6aWxs b24gPGJvcmlzLmJyZXppbGxvbkBmcmVlLWVsZWN0cm9ucy5jb20+Cj4gPiA+ICAgKi8KPiA+ID4K PiA+ID4gKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4gPiA+ICAjaW5jbHVkZSAibGludXgvZGVs YXkuaCIKPiA+ID4gICNpbmNsdWRlICJpbnRlcm5hbHMuaCIKPiA+ID4KPiA+ID4gQEAgLTMxLDYg KzMyLDIwIEBACj4gPiA+Cj4gPiA+ICAjZGVmaW5lIE1YSUNfQ01EX1BPV0VSX0RPV04gMHhCOQo+ ID4gPgo+ID4gPiArI2RlZmluZSBPTkZJX0ZFQVRVUkVfQUREUl8zMExGWEcxOEFDX09UUCAgICAg MHg5MAo+ID4gPiArI2RlZmluZSBNQUNST05JWF8zMExGWEcxOEFDX09UUF9TVEFSVF9QQUdFICAg MAo+ID4gPiArI2RlZmluZSBNQUNST05JWF8zMExGWEcxOEFDX09UUF9QQUdFUyAgICAgICAgICAg ICAgICAzMAo+ID4gPiArI2RlZmluZSBNQUNST05JWF8zMExGWEcxOEFDX09UUF9QQUdFX1NJWkUg ICAgMjExMgo+ID4gPiArI2RlZmluZSBNQUNST05JWF8zMExGWEcxOEFDX09UUF9TVEFSVF9CWVRF ICAgXAo+ID4gPiArICAgICAoTUFDUk9OSVhfMzBMRlhHMThBQ19PVFBfU1RBUlRfUEFHRSAqICAg XAo+ID4gPiArICAgICAgTUFDUk9OSVhfMzBMRlhHMThBQ19PVFBfUEFHRV9TSVpFKQo+ID4gPiAr I2RlZmluZSBNQUNST05JWF8zMExGWEcxOEFDX09UUF9TSVpFX0JZVEVTICAgXAo+ID4gPiArICAg ICAoTUFDUk9OSVhfMzBMRlhHMThBQ19PVFBfUEFHRVMgKiAgICAgICAgXAo+ID4gPiArICAgICAg TUFDUk9OSVhfMzBMRlhHMThBQ19PVFBfUEFHRV9TSVpFKQo+ID4gPiArCj4gPiA+ICsjZGVmaW5l IE1BQ1JPTklYXzMwTEZYRzE4QUNfT1RQX0VOICAgICAgICAgICBCSVQoMCkKPiA+ID4gKyNkZWZp bmUgTUFDUk9OSVhfMzBMRlhHMThBQ19PVFBfTE9DS0VEICAgICAgICAgICAgICAgQklUKDEpCj4g PiA+ICsKPiA+ID4gIHN0cnVjdCBuYW5kX29uZmlfdmVuZG9yX21hY3Jvbml4IHsKPiA+ID4gICAg ICAgdTggcmVzZXJ2ZWQ7Cj4gPiA+ICAgICAgIHU4IHJlbGlhYmlsaXR5X2Z1bmM7Cj4gPiA+IEBA IC0zMTYsNiArMzMxLDIwNiBAQCBzdGF0aWMgdm9pZCBtYWNyb25peF9uYW5kX2RlZXBfcG93ZXJf ZG93bl9zdXBwb3J0KHN0cnVjdCBuYW5kX2NoaXAgKmNoaXApCj4gPiA+ICAgICAgIGNoaXAtPm9w cy5yZXN1bWUgPSBteGljX25hbmRfcmVzdW1lOwo+ID4gPiAgfQo+ID4gPgo+ID4gPiArc3RhdGlj IGludCBtYWNyb25peF8zMGxmeGcxOGFjX2dldF9vdHBfaW5mbyhzdHJ1Y3QgbXRkX2luZm8gKm10 ZCwgc2l6ZV90IGxlbiwKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgc2l6ZV90ICpyZXRsZW4sCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHN0cnVjdCBvdHBfaW5mbyAqYnVmKQo+ID4gPiArewo+ID4gPiArICAgICBp ZiAobGVuIDwgc2l6ZW9mKCpidWYpKQo+ID4gPiArICAgICAgICAgICAgIHJldHVybiAtRUlOVkFM Owo+ID4gPiArCj4gPiA+ICsgICAgIC8qIERvbid0IGtub3cgaG93IHRvIGNoZWNrIHRoYXQgT1RQ IGlzIGxvY2tlZC4gKi8KPiA+ID4gKyAgICAgYnVmLT5sb2NrZWQgPSAwOwo+ID4gPiArICAgICBi dWYtPnN0YXJ0ID0gTUFDUk9OSVhfMzBMRlhHMThBQ19PVFBfU1RBUlRfQllURTsKPiA+ID4gKyAg ICAgYnVmLT5sZW5ndGggPSBNQUNST05JWF8zMExGWEcxOEFDX09UUF9TSVpFX0JZVEVTOwo+ID4g PiArCj4gPiA+ICsgICAgICpyZXRsZW4gPSBzaXplb2YoKmJ1Zik7Cj4gPiA+ICsKPiA+ID4gKyAg ICAgcmV0dXJuIDA7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyBpbnQgbWFjcm9uaXhf MzBsZnhnMThhY19vdHBfZW5hYmxlKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQpCj4gPiA+ICt7Cj4g PiA+ICsgICAgIHU4IGZlYXR1cmVfYnVmW09ORklfU1VCRkVBVFVSRV9QQVJBTV9MRU5dID0geyAw IH07Cj4gPiA+ICsKPiA+ID4gKyAgICAgZmVhdHVyZV9idWZbMF0gPSBNQUNST05JWF8zMExGWEcx OEFDX09UUF9FTjsKPiA+ID4gKyAgICAgcmV0dXJuIG5hbmRfc2V0X2ZlYXR1cmVzKG5hbmQsIE9O RklfRkVBVFVSRV9BRERSXzMwTEZYRzE4QUNfT1RQLAo+ID4gPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgZmVhdHVyZV9idWYpOwo+ID4gPiArfQo+ID4gPiArCj4gPiA+ICtzdGF0aWMg aW50IG1hY3Jvbml4XzMwbGZ4ZzE4YWNfb3RwX2Rpc2FibGUoc3RydWN0IG5hbmRfY2hpcCAqbmFu ZCkKPiA+ID4gK3sKPiA+ID4gKyAgICAgdTggZmVhdHVyZV9idWZbT05GSV9TVUJGRUFUVVJFX1BB UkFNX0xFTl0gPSB7IDAgfTsKPiA+ID4gKwo+ID4gPiArICAgICByZXR1cm4gbmFuZF9zZXRfZmVh dHVyZXMobmFuZCwgT05GSV9GRUFUVVJFX0FERFJfMzBMRlhHMThBQ19PVFAsCj4gPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX2J1Zik7Cj4gPiA+ICt9Cj4gPiA+ICsK PiA+ID4gK3N0YXRpYyBpbnQgX19tYWNyb25peF8zMGxmeGcxOGFjX3J3X290cChzdHJ1Y3QgbXRk X2luZm8gKm10ZCwKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBs b2ZmX3Qgb2Zmc19pbl9mbGFzaCwKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwKPiA+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKmJ1ZiwgYm9vbCB3cml0ZSkKPiA+ID4gK3sK PiA+ID4gKyAgICAgc3RydWN0IG5hbmRfY2hpcCAqbmFuZDsKPiA+ID4gKyAgICAgc2l6ZV90IGJ5 dGVzX2hhbmRsZWQ7Cj4gPiA+ICsgICAgIG9mZl90IG9mZnNfaW5fcGFnZTsKPiA+ID4gKyAgICAg dm9pZCAqZG1hX2J1ZjsKPiA+ID4gKyAgICAgdTY0IHBhZ2U7Cj4gPiA+ICsgICAgIGludCByZXQ7 Cj4gPiA+ICsKPiA+ID4gKyAgICAgLyogJ25hbmRfcHJvZy9yZWFkX3BhZ2Vfb3AoKScgbWF5IHVz ZSAnYnVmJyBhcyBETUEgYnVmZmVyLAo+ID4gPiArICAgICAgKiBzbyBhbGxvY2F0ZSBwcm9wZXJs eSBhbGlnbmVkIG1lbW9yeSBmb3IgaXQuIFRoaXMgaXMKPiA+ID4gKyAgICAgICogbmVlZGVkIGJl Y2F1c2UgY3Jvc3MgcGFnZSBhY2Nlc3NlcyBtYXkgbGVhZCB0byB1bmFsaWduZWQKPiA+ID4gKyAg ICAgICogYnVmZmVyIGFkZHJlc3MgZm9yIERNQS4KPiA+ID4gKyAgICAgICovCj4gPiA+ICsgICAg IGRtYV9idWYgPSBrbWFsbG9jKE1BQ1JPTklYXzMwTEZYRzE4QUNfT1RQX1BBR0VfU0laRSwgR0ZQ X0tFUk5FTCk7Cj4gPiA+ICsgICAgIGlmICghZG1hX2J1ZikKPiA+ID4gKyAgICAgICAgICAgICBy ZXR1cm4gLUVOT01FTTsKPiA+ID4gKwo+ID4gPiArICAgICBuYW5kID0gbXRkX3RvX25hbmQobXRk KTsKPiA+ID4gKyAgICAgbmFuZF9zZWxlY3RfdGFyZ2V0KG5hbmQsIDApOwo+ID4gPiArCj4gPiA+ ICsgICAgIHJldCA9IG1hY3Jvbml4XzMwbGZ4ZzE4YWNfb3RwX2VuYWJsZShuYW5kKTsKPiA+ID4g KyAgICAgaWYgKHJldCkKPiA+ID4gKyAgICAgICAgICAgICBnb3RvIG91dF9vdHA7Cj4gPiA+ICsK PiA+ID4gKyAgICAgcGFnZSA9IG9mZnNfaW5fZmxhc2g7Cj4gPiA+ICsgICAgIC8qICdwYWdlJyB3 aWxsIGJlIHJlc3VsdCBvZiBkaXZpc2lvbi4gKi8KPiA+ID4gKyAgICAgb2Zmc19pbl9wYWdlID0g ZG9fZGl2KHBhZ2UsIE1BQ1JPTklYXzMwTEZYRzE4QUNfT1RQX1BBR0VfU0laRSk7Cj4gPiA+ICsg ICAgIGJ5dGVzX2hhbmRsZWQgPSAwOwo+ID4gPiArCj4gPiA+ICsgICAgIHdoaWxlIChieXRlc19o YW5kbGVkIDwgbGVuICYmCj4gPiA+ICsgICAgICAgICAgICBwYWdlIDwgTUFDUk9OSVhfMzBMRlhH MThBQ19PVFBfUEFHRVMpIHsKPiA+ID4gKyAgICAgICAgICAgICBzaXplX3QgYnl0ZXNfdG9faGFu ZGxlOwo+ID4gPiArCj4gPiA+ICsgICAgICAgICAgICAgYnl0ZXNfdG9faGFuZGxlID0gbWluX3Qo c2l6ZV90LCBsZW4gLSBieXRlc19oYW5kbGVkLAo+ID4gPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIE1BQ1JPTklYXzMwTEZYRzE4QUNfT1RQX1BBR0VfU0laRSAtCj4gPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc19pbl9wYWdlKTsKPiA+ ID4gKwo+ID4gPiArICAgICAgICAgICAgIGlmICh3cml0ZSkgewo+ID4gPiArICAgICAgICAgICAg ICAgICAgICAgbWVtY3B5KGRtYV9idWYsICZidWZbYnl0ZXNfaGFuZGxlZF0sIGJ5dGVzX3RvX2hh bmRsZSk7Cj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICByZXQgPSBuYW5kX3Byb2dfcGFnZV9v cChuYW5kLCBwYWdlLCBvZmZzX2luX3BhZ2UsCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBkbWFfYnVmLCBieXRlc190b19oYW5kbGUpOwo+ID4gPiAr ICAgICAgICAgICAgIH0gZWxzZSB7Cj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICByZXQgPSBu YW5kX3JlYWRfcGFnZV9vcChuYW5kLCBwYWdlLCBvZmZzX2luX3BhZ2UsCj4gPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbWFfYnVmLCBieXRlc190b19o YW5kbGUpOwo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXQpCj4gPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmYnVmW2J5dGVzX2hhbmRsZWRdLCBkbWFf YnVmLAo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfdG9f aGFuZGxlKTsKPiA+ID4gKyAgICAgICAgICAgICB9Cj4gPiA+ICsgICAgICAgICAgICAgaWYgKHJl dCkKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0X290cDsKPiA+ID4gKwo+ID4g PiArICAgICAgICAgICAgIGJ5dGVzX2hhbmRsZWQgKz0gYnl0ZXNfdG9faGFuZGxlOwo+ID4gPiAr ICAgICAgICAgICAgIG9mZnNfaW5fcGFnZSA9IDA7Cj4gPiA+ICsgICAgICAgICAgICAgcGFnZSsr Owo+ID4gPiArICAgICB9Cj4gPiA+ICsKPiA+ID4gKyAgICAgKnJldGxlbiA9IGJ5dGVzX2hhbmRs ZWQ7Cj4gPiA+ICsKPiA+ID4gK291dF9vdHA6Cj4gPiA+ICsgICAgIGlmIChyZXQpCj4gPiA+ICsg ICAgICAgICAgICAgZGV2X2VycigmbXRkLT5kZXYsICJmYWlsZWQgdG8gcGVyZm9ybSBPVFAgSU86 ICVpXG4iLCByZXQpOwo+ID4gPiArCj4gPiA+ICsgICAgIHJldCA9IG1hY3Jvbml4XzMwbGZ4ZzE4 YWNfb3RwX2Rpc2FibGUobmFuZCk7Cj4gPiA+ICsgICAgIGlmIChyZXQpCj4gPiA+ICsgICAgICAg ICAgICAgZGV2X2VycigmbXRkLT5kZXYsICJmYWlsZWQgdG8gbGVhdmUgT1RQIG1vZGUgYWZ0ZXIg JXNcbiIsCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICB3cml0ZSA/ICJ3cml0ZSIgOiAicmVh ZCIpOwo+ID4gPiArCj4gPiA+ICsgICAgIG5hbmRfZGVzZWxlY3RfdGFyZ2V0KG5hbmQpOwo+ID4g PiArICAgICBrZnJlZShkbWFfYnVmKTsKPiA+ID4gKwo+ID4gPiArICAgICByZXR1cm4gcmV0Owo+ ID4gPiArfQo+ID4gPiArCj4gPiA+ICtzdGF0aWMgaW50IG1hY3Jvbml4XzMwbGZ4ZzE4YWNfd3Jp dGVfb3RwKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sCj4gPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sIHNpemVfdCAqcmxlbiwKPiA+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdV9jaGFyICpi dWYpCj4gPiA+ICt7Cj4gPiA+ICsgICAgIHJldHVybiBfX21hY3Jvbml4XzMwbGZ4ZzE4YWNfcndf b3RwKG10ZCwgdG8sIGxlbiwgcmxlbiwgKHVfY2hhciAqKWJ1ZiwKPiA+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ ID4gK3N0YXRpYyBpbnQgbWFjcm9uaXhfMzBsZnhnMThhY19yZWFkX290cChzdHJ1Y3QgbXRkX2lu Zm8gKm10ZCwgbG9mZl90IGZyb20sCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgc2l6ZV90IGxlbiwgc2l6ZV90ICpybGVuLAo+ID4gPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqYnVmKQo+ID4gPiArewo+ID4gPiArICAgICBy ZXR1cm4gX19tYWNyb25peF8zMGxmeGcxOGFjX3J3X290cChtdGQsIGZyb20sIGxlbiwgcmxlbiwg YnVmLCBmYWxzZSk7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyBpbnQgbWFjcm9uaXhf MzBsZnhnMThhY19sb2NrX290cChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sCj4g PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbikKPiA+ ID4gK3sKPiA+ID4gKyAgICAgdTggZmVhdHVyZV9idWZbT05GSV9TVUJGRUFUVVJFX1BBUkFNX0xF Tl0gPSB7IDAgfTsKPiA+ID4gKyAgICAgc3RydWN0IG5hbmRfY2hpcCAqbmFuZDsKPiA+ID4gKyAg ICAgaW50IHJldDsKPiA+ID4gKwo+ID4gPiArICAgICBpZiAoZnJvbSAhPSBNQUNST05JWF8zMExG WEcxOEFDX09UUF9TVEFSVF9CWVRFIHx8Cj4gPiA+ICsgICAgICAgICBsZW4gIT0gTUFDUk9OSVhf MzBMRlhHMThBQ19PVFBfU0laRV9CWVRFUykKPiA+ID4gKyAgICAgICAgICAgICByZXR1cm4gLUVJ TlZBTDsKPiA+ID4gKwo+ID4gPiArICAgICBkZXZfZGJnKCZtdGQtPmRldiwgImxvY2tpbmcgT1RQ XG4iKTsKPiA+ID4gKwo+ID4gPiArICAgICBuYW5kID0gbXRkX3RvX25hbmQobXRkKTsKPiA+ID4g KyAgICAgbmFuZF9zZWxlY3RfdGFyZ2V0KG5hbmQsIDApOwo+ID4gPiArCj4gPiA+ICsgICAgIGZl YXR1cmVfYnVmWzBdID0gTUFDUk9OSVhfMzBMRlhHMThBQ19PVFBfRU4gfAo+ID4gPiArICAgICAg ICAgICAgICAgICAgICAgIE1BQ1JPTklYXzMwTEZYRzE4QUNfT1RQX0xPQ0tFRDsKPiA+ID4gKyAg ICAgcmV0ID0gbmFuZF9zZXRfZmVhdHVyZXMobmFuZCwgT05GSV9GRUFUVVJFX0FERFJfMzBMRlhH MThBQ19PVFAsCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVfYnVm KTsKPiA+ID4gKyAgICAgaWYgKHJldCkgewo+ID4gPiArICAgICAgICAgICAgIGRldl9lcnIoJm10 ZC0+ZGV2LAo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBsb2NrIE9UUCAo c2V0IGZlYXR1cmVzKTogJWlcbiIsIHJldCk7Cj4gPiA+ICsgICAgICAgICAgICAgbmFuZF9kZXNl bGVjdF90YXJnZXQobmFuZCk7Cj4gPiA+ICsgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+ID4g KyAgICAgfQo+ID4gPiArCj4gPiA+ICsgICAgIC8qIERvIGR1bW15IHBhZ2UgcHJvZyB3aXRoIHpl cm8gYWRkcmVzcy4gKi8KPiA+ID4gKyAgICAgZmVhdHVyZV9idWZbMF0gPSAwOwo+ID4gPiArICAg ICByZXQgPSBuYW5kX3Byb2dfcGFnZV9vcChuYW5kLCAwLCAwLCBmZWF0dXJlX2J1ZiwgMSk7Cj4g PiA+ICsgICAgIGlmIChyZXQpCj4gPiA+ICsgICAgICAgICAgICAgZGV2X2VycigmbXRkLT5kZXYs Cj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGxvY2sgT1RQIChwYWdlIHBy b2cpOiAlaVxuIiwgcmV0KTsKPiA+ID4gKwo+ID4gPiArICAgICByZXQgPSBtYWNyb25peF8zMGxm eGcxOGFjX290cF9kaXNhYmxlKG5hbmQpOwo+ID4gPiArICAgICBpZiAocmV0KQo+ID4gPiArICAg ICAgICAgICAgIGRldl9lcnIoJm10ZC0+ZGV2LCAiZmFpbGVkIHRvIGxlYXZlIE9UUCBtb2RlIGFm dGVyIGxvY2tcbiIpOwo+ID4gPiArCj4gPiA+ICsgICAgIG5hbmRfZGVzZWxlY3RfdGFyZ2V0KG5h bmQpOwo+ID4gPiArCj4gPiA+ICsgICAgIHJldHVybiByZXQ7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ ID4gK3N0YXRpYyB2b2lkIG1hY3Jvbml4X25hbmRfc2V0dXBfb3RwKHN0cnVjdCBuYW5kX2NoaXAg KmNoaXApCj4gPiA+ICt7Cj4gPiA+ICsgICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3Vw cG9ydGVkX290cF9tb2RlbHNbXSA9IHsKPiA+ID4gKyAgICAgICAgICAgICAiTVgzMExGMUcxOEFD IiwKPiA+ID4gKyAgICAgICAgICAgICAiTVgzMExGMkcxOEFDIiwKPiA+ID4gKyAgICAgICAgICAg ICAiTVgzMExGNEcxOEFDIiwKPiA+ID4gKyAgICAgfTsKPiA+ID4gKyAgICAgc3RydWN0IG10ZF9p bmZvICptdGQ7Cj4gPiA+ICsKPiA+ID4gKyAgICAgaWYgKG1hdGNoX3N0cmluZyhzdXBwb3J0ZWRf b3RwX21vZGVscywKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHN1cHBv cnRlZF9vdHBfbW9kZWxzKSwKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICBjaGlwLT5wYXJh bWV0ZXJzLm1vZGVsKSA8IDApCj4gPiA+ICsgICAgICAgICAgICAgcmV0dXJuOwo+ID4gPiArCj4g PiA+ICsgICAgIGlmICghY2hpcC0+cGFyYW1ldGVycy5zdXBwb3J0c19zZXRfZ2V0X2ZlYXR1cmVz KQo+ID4gPiArICAgICAgICAgICAgIHJldHVybjsKPiA+ID4gKwo+ID4gPiArICAgICBiaXRtYXBf c2V0KGNoaXAtPnBhcmFtZXRlcnMuZ2V0X2ZlYXR1cmVfbGlzdCwKPiA+ID4gKyAgICAgICAgICAg ICAgICBPTkZJX0ZFQVRVUkVfQUREUl8zMExGWEcxOEFDX09UUCwgMSk7Cj4gPiA+ICsgICAgIGJp dG1hcF9zZXQoY2hpcC0+cGFyYW1ldGVycy5zZXRfZmVhdHVyZV9saXN0LAo+ID4gPiArICAgICAg ICAgICAgICAgIE9ORklfRkVBVFVSRV9BRERSXzMwTEZYRzE4QUNfT1RQLCAxKTsKPiA+ID4gKwo+ ID4gPiArICAgICBtdGQgPSBuYW5kX3RvX210ZChjaGlwKTsKPiA+ID4gKyAgICAgbXRkLT5fZ2V0 X2ZhY3RfcHJvdF9pbmZvID0gbWFjcm9uaXhfMzBsZnhnMThhY19nZXRfb3RwX2luZm87Cj4gPiA+ ICsgICAgIG10ZC0+X3JlYWRfZmFjdF9wcm90X3JlZyA9IG1hY3Jvbml4XzMwbGZ4ZzE4YWNfcmVh ZF9vdHA7Cj4gPiA+ICsgICAgIG10ZC0+X2dldF91c2VyX3Byb3RfaW5mbyA9IG1hY3Jvbml4XzMw bGZ4ZzE4YWNfZ2V0X290cF9pbmZvOwo+ID4gPiArICAgICBtdGQtPl9yZWFkX3VzZXJfcHJvdF9y ZWcgPSBtYWNyb25peF8zMGxmeGcxOGFjX3JlYWRfb3RwOwo+ID4gPiArICAgICBtdGQtPl93cml0 ZV91c2VyX3Byb3RfcmVnID0gbWFjcm9uaXhfMzBsZnhnMThhY193cml0ZV9vdHA7Cj4gPiA+ICsg ICAgIG10ZC0+X2xvY2tfdXNlcl9wcm90X3JlZyA9IG1hY3Jvbml4XzMwbGZ4ZzE4YWNfbG9ja19v dHA7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gIHN0YXRpYyBpbnQgbWFjcm9uaXhfbmFuZF9pbml0 KHN0cnVjdCBuYW5kX2NoaXAgKmNoaXApCj4gPiA+ICB7Cj4gPiA+ICAgICAgIGlmIChuYW5kX2lz X3NsYyhjaGlwKSkKPiA+ID4gQEAgLTMyNSw2ICs1NDAsNyBAQCBzdGF0aWMgaW50IG1hY3Jvbml4 X25hbmRfaW5pdChzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwKQo+ID4gPiAgICAgICBtYWNyb25peF9u YW5kX29uZmlfaW5pdChjaGlwKTsKPiA+ID4gICAgICAgbWFjcm9uaXhfbmFuZF9ibG9ja19wcm90 ZWN0aW9uX3N1cHBvcnQoY2hpcCk7Cj4gPiA+ICAgICAgIG1hY3Jvbml4X25hbmRfZGVlcF9wb3dl cl9kb3duX3N1cHBvcnQoY2hpcCk7Cj4gPiA+ICsgICAgIG1hY3Jvbml4X25hbmRfc2V0dXBfb3Rw KGNoaXApOwo+ID4gPgo+ID4gPiAgICAgICByZXR1cm4gMDsKPiA+ID4gIH0gIAo+ID4KPiA+Cj4g PiBUaGFua3MsCj4gPiBNaXF1w6hsICAKPiAKPiBUaGFua3MKPiBKYWltZQoKCgpfX19fX19fX19f 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 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 09458EB64DA for ; Wed, 14 Jun 2023 09:10:39 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id BAC9610E18E; Wed, 14 Jun 2023 09:10:36 +0000 (UTC) Received: from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net [217.70.183.201]) by gabe.freedesktop.org (Postfix) with ESMTPS id 5162B10E434 for ; Wed, 14 Jun 2023 09:10:09 +0000 (UTC) X-GND-Sasl: miquel.raynal@bootlin.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1686733806; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=WAO5PoZt2knoBaPqUHhj1MWZZ6nSInLED8yri3KtZlU=; b=dbO9elaRNuDZck4qiTEc3pGJCibUD8JclWSoc7sNAJymaXu4bKXWjqeflYagBks5OOEHZX 3a1D+82Dypr6PV+d0T5CbS99ulko1Pu6FX7mYCIcAkAmeaotiBRWUNx6L3fHlFTTHfzy3d 8RHn4031SlvyhG7J25Q9crNfdud4jwP6A1ow/6k14qObkDJEL4UU5s/7/lajqa34kNJe3r AJZWgo9+ASO+HEXUs+VP5eBcXrGfPEeHQnBBhwDGNQq59LVPCxE3sk0TUU7kZeneMm5e7f fEhB4Y93yo9sC4O9vjp9JIunrte2yHJrY0e09P7bSbrazwoa2EXrSOC/Pjzt3Q== X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com Received: by mail.gandi.net (Postfix) with ESMTPSA id CD1FA1BF20C; Wed, 14 Jun 2023 09:10:02 +0000 (UTC) Date: Wed, 14 Jun 2023 11:10:01 +0200 From: Miquel Raynal To: liao jaime Subject: Re: [PATCH v4] mtd: rawnand: macronix: OTP access for MX30LFxG18AC Message-ID: <20230614111001.6b0417d4@xps-13> In-Reply-To: References: <20230523101637.3009746-1-AVKrasnov@sberdevices.ru> <20230612185354.09b88e0d@xps-13> Organization: Bootlin X-Mailer: Claws Mail 4.0.0 (GTK+ 3.24.33; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Arseniy Krasnov , Vignesh Raghavendra , Richard Weinberger , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Sumit Semwal , linaro-mm-sig@lists.linaro.org, Boris Brezillon , linux-mtd@lists.infradead.org, oxffffaa@gmail.com, kernel@sberdevices.ru, Mason Yang , linux-media@vger.kernel.org, Christian =?UTF-8?B?S8O2bmln?= , Jaime Liao Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Hi liao, jaimeliao.tw@gmail.com wrote on Wed, 14 Jun 2023 17:06:16 +0800: > Hi Miquel >=20 >=20 > > > > Hello, > > > > AVKrasnov@sberdevices.ru wrote on Tue, 23 May 2023 13:16:34 +0300: > > =20 > > > This adds support for OTP area access on MX30LFxG18AC chip series. =20 > > > > Jaime, any feedback on this? Will you test it? > > > > How are we supposed to test the OTP is locked? I see this is still an > > open point. =20 > After checking with internal, sub feature parameter are volatile register. >=20 > It could be change after enter/exit OTP region or power cycle even OTP >=20 > region have been locked. >=20 > OTP operation mode still could be enter/exit and region is read only > after OTP in protect mode. >=20 > #program command could execute but no use after setting OTP region in > protect mode. >=20 > So that we can't check whether OTP region is locked via get feature. >=20 > And we don't have region for checking status of OTP locked. Ah, too bad. But thanks a lot for the explanation. Arseniy, can you please change your comment to explain that the bit is volatile and thus there is no way to check if an otp region is locked? I would return EOPNOTSUPP in this case and verify that the core cleanly handles the situation. Thanks, Miqu=C3=A8l >=20 > > =20 > > > > > > Signed-off-by: Arseniy Krasnov > > > --- > > > v1 -> v2: > > > * Add slab.h include due to kernel test robot error. > > > v2 -> v3: > > > * Use 'uint64_t' as input argument for 'do_div()' instead > > > of 'unsigned long' due to kernel test robot error. > > > v3 -> v4: > > > * Use 'dev_err()' instead of 'WARN()'. > > > * Call 'match_string()' before checking 'supports_set_get_features' > > > in 'macronix_nand_setup_otp(). > > > * Use 'u8' instead of 'uint8_t' as ./checkpatch.pl wants. > > > > > > drivers/mtd/nand/raw/nand_macronix.c | 216 +++++++++++++++++++++++++= ++ > > > 1 file changed, 216 insertions(+) > > > > > > diff --git a/drivers/mtd/nand/raw/nand_macronix.c b/drivers/mtd/nand/= raw/nand_macronix.c > > > index 1472f925f386..be1ffa93bebb 100644 > > > --- a/drivers/mtd/nand/raw/nand_macronix.c > > > +++ b/drivers/mtd/nand/raw/nand_macronix.c > > > @@ -6,6 +6,7 @@ > > > * Author: Boris Brezillon > > > */ > > > > > > +#include > > > #include "linux/delay.h" > > > #include "internals.h" > > > > > > @@ -31,6 +32,20 @@ > > > > > > #define MXIC_CMD_POWER_DOWN 0xB9 > > > > > > +#define ONFI_FEATURE_ADDR_30LFXG18AC_OTP 0x90 > > > +#define MACRONIX_30LFXG18AC_OTP_START_PAGE 0 > > > +#define MACRONIX_30LFXG18AC_OTP_PAGES 30 > > > +#define MACRONIX_30LFXG18AC_OTP_PAGE_SIZE 2112 > > > +#define MACRONIX_30LFXG18AC_OTP_START_BYTE \ > > > + (MACRONIX_30LFXG18AC_OTP_START_PAGE * \ > > > + MACRONIX_30LFXG18AC_OTP_PAGE_SIZE) > > > +#define MACRONIX_30LFXG18AC_OTP_SIZE_BYTES \ > > > + (MACRONIX_30LFXG18AC_OTP_PAGES * \ > > > + MACRONIX_30LFXG18AC_OTP_PAGE_SIZE) > > > + > > > +#define MACRONIX_30LFXG18AC_OTP_EN BIT(0) > > > +#define MACRONIX_30LFXG18AC_OTP_LOCKED BIT(1) > > > + > > > struct nand_onfi_vendor_macronix { > > > u8 reserved; > > > u8 reliability_func; > > > @@ -316,6 +331,206 @@ static void macronix_nand_deep_power_down_suppo= rt(struct nand_chip *chip) > > > chip->ops.resume =3D mxic_nand_resume; > > > } > > > > > > +static int macronix_30lfxg18ac_get_otp_info(struct mtd_info *mtd, si= ze_t len, > > > + size_t *retlen, > > > + struct otp_info *buf) > > > +{ > > > + if (len < sizeof(*buf)) > > > + return -EINVAL; > > > + > > > + /* Don't know how to check that OTP is locked. */ > > > + buf->locked =3D 0; > > > + buf->start =3D MACRONIX_30LFXG18AC_OTP_START_BYTE; > > > + buf->length =3D MACRONIX_30LFXG18AC_OTP_SIZE_BYTES; > > > + > > > + *retlen =3D sizeof(*buf); > > > + > > > + return 0; > > > +} > > > + > > > +static int macronix_30lfxg18ac_otp_enable(struct nand_chip *nand) > > > +{ > > > + u8 feature_buf[ONFI_SUBFEATURE_PARAM_LEN] =3D { 0 }; > > > + > > > + feature_buf[0] =3D MACRONIX_30LFXG18AC_OTP_EN; > > > + return nand_set_features(nand, ONFI_FEATURE_ADDR_30LFXG18AC_OTP, > > > + feature_buf); > > > +} > > > + > > > +static int macronix_30lfxg18ac_otp_disable(struct nand_chip *nand) > > > +{ > > > + u8 feature_buf[ONFI_SUBFEATURE_PARAM_LEN] =3D { 0 }; > > > + > > > + return nand_set_features(nand, ONFI_FEATURE_ADDR_30LFXG18AC_OTP, > > > + feature_buf); > > > +} > > > + > > > +static int __macronix_30lfxg18ac_rw_otp(struct mtd_info *mtd, > > > + loff_t offs_in_flash, > > > + size_t len, size_t *retlen, > > > + u_char *buf, bool write) > > > +{ > > > + struct nand_chip *nand; > > > + size_t bytes_handled; > > > + off_t offs_in_page; > > > + void *dma_buf; > > > + u64 page; > > > + int ret; > > > + > > > + /* 'nand_prog/read_page_op()' may use 'buf' as DMA buffer, > > > + * so allocate properly aligned memory for it. This is > > > + * needed because cross page accesses may lead to unaligned > > > + * buffer address for DMA. > > > + */ > > > + dma_buf =3D kmalloc(MACRONIX_30LFXG18AC_OTP_PAGE_SIZE, GFP_KERN= EL); > > > + if (!dma_buf) > > > + return -ENOMEM; > > > + > > > + nand =3D mtd_to_nand(mtd); > > > + nand_select_target(nand, 0); > > > + > > > + ret =3D macronix_30lfxg18ac_otp_enable(nand); > > > + if (ret) > > > + goto out_otp; > > > + > > > + page =3D offs_in_flash; > > > + /* 'page' will be result of division. */ > > > + offs_in_page =3D do_div(page, MACRONIX_30LFXG18AC_OTP_PAGE_SIZE= ); > > > + bytes_handled =3D 0; > > > + > > > + while (bytes_handled < len && > > > + page < MACRONIX_30LFXG18AC_OTP_PAGES) { > > > + size_t bytes_to_handle; > > > + > > > + bytes_to_handle =3D min_t(size_t, len - bytes_handled, > > > + MACRONIX_30LFXG18AC_OTP_PAGE_SI= ZE - > > > + offs_in_page); > > > + > > > + if (write) { > > > + memcpy(dma_buf, &buf[bytes_handled], bytes_to_h= andle); > > > + ret =3D nand_prog_page_op(nand, page, offs_in_p= age, > > > + dma_buf, bytes_to_handl= e); > > > + } else { > > > + ret =3D nand_read_page_op(nand, page, offs_in_p= age, > > > + dma_buf, bytes_to_handl= e); > > > + if (!ret) > > > + memcpy(&buf[bytes_handled], dma_buf, > > > + bytes_to_handle); > > > + } > > > + if (ret) > > > + goto out_otp; > > > + > > > + bytes_handled +=3D bytes_to_handle; > > > + offs_in_page =3D 0; > > > + page++; > > > + } > > > + > > > + *retlen =3D bytes_handled; > > > + > > > +out_otp: > > > + if (ret) > > > + dev_err(&mtd->dev, "failed to perform OTP IO: %i\n", re= t); > > > + > > > + ret =3D macronix_30lfxg18ac_otp_disable(nand); > > > + if (ret) > > > + dev_err(&mtd->dev, "failed to leave OTP mode after %s\n= ", > > > + write ? "write" : "read"); > > > + > > > + nand_deselect_target(nand); > > > + kfree(dma_buf); > > > + > > > + return ret; > > > +} > > > + > > > +static int macronix_30lfxg18ac_write_otp(struct mtd_info *mtd, loff_= t to, > > > + size_t len, size_t *rlen, > > > + const u_char *buf) > > > +{ > > > + return __macronix_30lfxg18ac_rw_otp(mtd, to, len, rlen, (u_char= *)buf, > > > + true); > > > +} > > > + > > > +static int macronix_30lfxg18ac_read_otp(struct mtd_info *mtd, loff_t= from, > > > + size_t len, size_t *rlen, > > > + u_char *buf) > > > +{ > > > + return __macronix_30lfxg18ac_rw_otp(mtd, from, len, rlen, buf, = false); > > > +} > > > + > > > +static int macronix_30lfxg18ac_lock_otp(struct mtd_info *mtd, loff_t= from, > > > + size_t len) > > > +{ > > > + u8 feature_buf[ONFI_SUBFEATURE_PARAM_LEN] =3D { 0 }; > > > + struct nand_chip *nand; > > > + int ret; > > > + > > > + if (from !=3D MACRONIX_30LFXG18AC_OTP_START_BYTE || > > > + len !=3D MACRONIX_30LFXG18AC_OTP_SIZE_BYTES) > > > + return -EINVAL; > > > + > > > + dev_dbg(&mtd->dev, "locking OTP\n"); > > > + > > > + nand =3D mtd_to_nand(mtd); > > > + nand_select_target(nand, 0); > > > + > > > + feature_buf[0] =3D MACRONIX_30LFXG18AC_OTP_EN | > > > + MACRONIX_30LFXG18AC_OTP_LOCKED; > > > + ret =3D nand_set_features(nand, ONFI_FEATURE_ADDR_30LFXG18AC_OT= P, > > > + feature_buf); > > > + if (ret) { > > > + dev_err(&mtd->dev, > > > + "failed to lock OTP (set features): %i\n", ret); > > > + nand_deselect_target(nand); > > > + return ret; > > > + } > > > + > > > + /* Do dummy page prog with zero address. */ > > > + feature_buf[0] =3D 0; > > > + ret =3D nand_prog_page_op(nand, 0, 0, feature_buf, 1); > > > + if (ret) > > > + dev_err(&mtd->dev, > > > + "failed to lock OTP (page prog): %i\n", ret); > > > + > > > + ret =3D macronix_30lfxg18ac_otp_disable(nand); > > > + if (ret) > > > + dev_err(&mtd->dev, "failed to leave OTP mode after lock= \n"); > > > + > > > + nand_deselect_target(nand); > > > + > > > + return ret; > > > +} > > > + > > > +static void macronix_nand_setup_otp(struct nand_chip *chip) > > > +{ > > > + static const char * const supported_otp_models[] =3D { > > > + "MX30LF1G18AC", > > > + "MX30LF2G18AC", > > > + "MX30LF4G18AC", > > > + }; > > > + struct mtd_info *mtd; > > > + > > > + if (match_string(supported_otp_models, > > > + ARRAY_SIZE(supported_otp_models), > > > + chip->parameters.model) < 0) > > > + return; > > > + > > > + if (!chip->parameters.supports_set_get_features) > > > + return; > > > + > > > + bitmap_set(chip->parameters.get_feature_list, > > > + ONFI_FEATURE_ADDR_30LFXG18AC_OTP, 1); > > > + bitmap_set(chip->parameters.set_feature_list, > > > + ONFI_FEATURE_ADDR_30LFXG18AC_OTP, 1); > > > + > > > + mtd =3D nand_to_mtd(chip); > > > + mtd->_get_fact_prot_info =3D macronix_30lfxg18ac_get_otp_info; > > > + mtd->_read_fact_prot_reg =3D macronix_30lfxg18ac_read_otp; > > > + mtd->_get_user_prot_info =3D macronix_30lfxg18ac_get_otp_info; > > > + mtd->_read_user_prot_reg =3D macronix_30lfxg18ac_read_otp; > > > + mtd->_write_user_prot_reg =3D macronix_30lfxg18ac_write_otp; > > > + mtd->_lock_user_prot_reg =3D macronix_30lfxg18ac_lock_otp; > > > +} > > > + > > > static int macronix_nand_init(struct nand_chip *chip) > > > { > > > if (nand_is_slc(chip)) > > > @@ -325,6 +540,7 @@ static int macronix_nand_init(struct nand_chip *c= hip) > > > macronix_nand_onfi_init(chip); > > > macronix_nand_block_protection_support(chip); > > > macronix_nand_deep_power_down_support(chip); > > > + macronix_nand_setup_otp(chip); > > > > > > return 0; > > > } =20 > > > > > > Thanks, > > Miqu=C3=A8l =20 >=20 > Thanks > Jaime From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B23CEEB64D9 for ; Wed, 14 Jun 2023 09:10:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235830AbjFNJKW (ORCPT ); Wed, 14 Jun 2023 05:10:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53032 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243936AbjFNJKK (ORCPT ); Wed, 14 Jun 2023 05:10:10 -0400 Received: from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net [217.70.183.201]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2A53F10C2; Wed, 14 Jun 2023 02:10:07 -0700 (PDT) X-GND-Sasl: miquel.raynal@bootlin.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1686733806; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=WAO5PoZt2knoBaPqUHhj1MWZZ6nSInLED8yri3KtZlU=; b=dbO9elaRNuDZck4qiTEc3pGJCibUD8JclWSoc7sNAJymaXu4bKXWjqeflYagBks5OOEHZX 3a1D+82Dypr6PV+d0T5CbS99ulko1Pu6FX7mYCIcAkAmeaotiBRWUNx6L3fHlFTTHfzy3d 8RHn4031SlvyhG7J25Q9crNfdud4jwP6A1ow/6k14qObkDJEL4UU5s/7/lajqa34kNJe3r AJZWgo9+ASO+HEXUs+VP5eBcXrGfPEeHQnBBhwDGNQq59LVPCxE3sk0TUU7kZeneMm5e7f fEhB4Y93yo9sC4O9vjp9JIunrte2yHJrY0e09P7bSbrazwoa2EXrSOC/Pjzt3Q== X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com Received: by mail.gandi.net (Postfix) with ESMTPSA id CD1FA1BF20C; Wed, 14 Jun 2023 09:10:02 +0000 (UTC) Date: Wed, 14 Jun 2023 11:10:01 +0200 From: Miquel Raynal To: liao jaime Cc: Arseniy Krasnov , Richard Weinberger , Vignesh Raghavendra , Sumit Semwal , Christian =?UTF-8?B?S8O2bmln?= , oxffffaa@gmail.com, kernel@sberdevices.ru, Boris Brezillon , Jaime Liao , Mason Yang , linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org Subject: Re: [PATCH v4] mtd: rawnand: macronix: OTP access for MX30LFxG18AC Message-ID: <20230614111001.6b0417d4@xps-13> In-Reply-To: References: <20230523101637.3009746-1-AVKrasnov@sberdevices.ru> <20230612185354.09b88e0d@xps-13> Organization: Bootlin X-Mailer: Claws Mail 4.0.0 (GTK+ 3.24.33; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org Hi liao, jaimeliao.tw@gmail.com wrote on Wed, 14 Jun 2023 17:06:16 +0800: > Hi Miquel >=20 >=20 > > > > Hello, > > > > AVKrasnov@sberdevices.ru wrote on Tue, 23 May 2023 13:16:34 +0300: > > =20 > > > This adds support for OTP area access on MX30LFxG18AC chip series. =20 > > > > Jaime, any feedback on this? Will you test it? > > > > How are we supposed to test the OTP is locked? I see this is still an > > open point. =20 > After checking with internal, sub feature parameter are volatile register. >=20 > It could be change after enter/exit OTP region or power cycle even OTP >=20 > region have been locked. >=20 > OTP operation mode still could be enter/exit and region is read only > after OTP in protect mode. >=20 > #program command could execute but no use after setting OTP region in > protect mode. >=20 > So that we can't check whether OTP region is locked via get feature. >=20 > And we don't have region for checking status of OTP locked. Ah, too bad. But thanks a lot for the explanation. Arseniy, can you please change your comment to explain that the bit is volatile and thus there is no way to check if an otp region is locked? I would return EOPNOTSUPP in this case and verify that the core cleanly handles the situation. Thanks, Miqu=C3=A8l >=20 > > =20 > > > > > > Signed-off-by: Arseniy Krasnov > > > --- > > > v1 -> v2: > > > * Add slab.h include due to kernel test robot error. > > > v2 -> v3: > > > * Use 'uint64_t' as input argument for 'do_div()' instead > > > of 'unsigned long' due to kernel test robot error. > > > v3 -> v4: > > > * Use 'dev_err()' instead of 'WARN()'. > > > * Call 'match_string()' before checking 'supports_set_get_features' > > > in 'macronix_nand_setup_otp(). > > > * Use 'u8' instead of 'uint8_t' as ./checkpatch.pl wants. > > > > > > drivers/mtd/nand/raw/nand_macronix.c | 216 +++++++++++++++++++++++++= ++ > > > 1 file changed, 216 insertions(+) > > > > > > diff --git a/drivers/mtd/nand/raw/nand_macronix.c b/drivers/mtd/nand/= raw/nand_macronix.c > > > index 1472f925f386..be1ffa93bebb 100644 > > > --- a/drivers/mtd/nand/raw/nand_macronix.c > > > +++ b/drivers/mtd/nand/raw/nand_macronix.c > > > @@ -6,6 +6,7 @@ > > > * Author: Boris Brezillon > > > */ > > > > > > +#include > > > #include "linux/delay.h" > > > #include "internals.h" > > > > > > @@ -31,6 +32,20 @@ > > > > > > #define MXIC_CMD_POWER_DOWN 0xB9 > > > > > > +#define ONFI_FEATURE_ADDR_30LFXG18AC_OTP 0x90 > > > +#define MACRONIX_30LFXG18AC_OTP_START_PAGE 0 > > > +#define MACRONIX_30LFXG18AC_OTP_PAGES 30 > > > +#define MACRONIX_30LFXG18AC_OTP_PAGE_SIZE 2112 > > > +#define MACRONIX_30LFXG18AC_OTP_START_BYTE \ > > > + (MACRONIX_30LFXG18AC_OTP_START_PAGE * \ > > > + MACRONIX_30LFXG18AC_OTP_PAGE_SIZE) > > > +#define MACRONIX_30LFXG18AC_OTP_SIZE_BYTES \ > > > + (MACRONIX_30LFXG18AC_OTP_PAGES * \ > > > + MACRONIX_30LFXG18AC_OTP_PAGE_SIZE) > > > + > > > +#define MACRONIX_30LFXG18AC_OTP_EN BIT(0) > > > +#define MACRONIX_30LFXG18AC_OTP_LOCKED BIT(1) > > > + > > > struct nand_onfi_vendor_macronix { > > > u8 reserved; > > > u8 reliability_func; > > > @@ -316,6 +331,206 @@ static void macronix_nand_deep_power_down_suppo= rt(struct nand_chip *chip) > > > chip->ops.resume =3D mxic_nand_resume; > > > } > > > > > > +static int macronix_30lfxg18ac_get_otp_info(struct mtd_info *mtd, si= ze_t len, > > > + size_t *retlen, > > > + struct otp_info *buf) > > > +{ > > > + if (len < sizeof(*buf)) > > > + return -EINVAL; > > > + > > > + /* Don't know how to check that OTP is locked. */ > > > + buf->locked =3D 0; > > > + buf->start =3D MACRONIX_30LFXG18AC_OTP_START_BYTE; > > > + buf->length =3D MACRONIX_30LFXG18AC_OTP_SIZE_BYTES; > > > + > > > + *retlen =3D sizeof(*buf); > > > + > > > + return 0; > > > +} > > > + > > > +static int macronix_30lfxg18ac_otp_enable(struct nand_chip *nand) > > > +{ > > > + u8 feature_buf[ONFI_SUBFEATURE_PARAM_LEN] =3D { 0 }; > > > + > > > + feature_buf[0] =3D MACRONIX_30LFXG18AC_OTP_EN; > > > + return nand_set_features(nand, ONFI_FEATURE_ADDR_30LFXG18AC_OTP, > > > + feature_buf); > > > +} > > > + > > > +static int macronix_30lfxg18ac_otp_disable(struct nand_chip *nand) > > > +{ > > > + u8 feature_buf[ONFI_SUBFEATURE_PARAM_LEN] =3D { 0 }; > > > + > > > + return nand_set_features(nand, ONFI_FEATURE_ADDR_30LFXG18AC_OTP, > > > + feature_buf); > > > +} > > > + > > > +static int __macronix_30lfxg18ac_rw_otp(struct mtd_info *mtd, > > > + loff_t offs_in_flash, > > > + size_t len, size_t *retlen, > > > + u_char *buf, bool write) > > > +{ > > > + struct nand_chip *nand; > > > + size_t bytes_handled; > > > + off_t offs_in_page; > > > + void *dma_buf; > > > + u64 page; > > > + int ret; > > > + > > > + /* 'nand_prog/read_page_op()' may use 'buf' as DMA buffer, > > > + * so allocate properly aligned memory for it. This is > > > + * needed because cross page accesses may lead to unaligned > > > + * buffer address for DMA. > > > + */ > > > + dma_buf =3D kmalloc(MACRONIX_30LFXG18AC_OTP_PAGE_SIZE, GFP_KERN= EL); > > > + if (!dma_buf) > > > + return -ENOMEM; > > > + > > > + nand =3D mtd_to_nand(mtd); > > > + nand_select_target(nand, 0); > > > + > > > + ret =3D macronix_30lfxg18ac_otp_enable(nand); > > > + if (ret) > > > + goto out_otp; > > > + > > > + page =3D offs_in_flash; > > > + /* 'page' will be result of division. */ > > > + offs_in_page =3D do_div(page, MACRONIX_30LFXG18AC_OTP_PAGE_SIZE= ); > > > + bytes_handled =3D 0; > > > + > > > + while (bytes_handled < len && > > > + page < MACRONIX_30LFXG18AC_OTP_PAGES) { > > > + size_t bytes_to_handle; > > > + > > > + bytes_to_handle =3D min_t(size_t, len - bytes_handled, > > > + MACRONIX_30LFXG18AC_OTP_PAGE_SI= ZE - > > > + offs_in_page); > > > + > > > + if (write) { > > > + memcpy(dma_buf, &buf[bytes_handled], bytes_to_h= andle); > > > + ret =3D nand_prog_page_op(nand, page, offs_in_p= age, > > > + dma_buf, bytes_to_handl= e); > > > + } else { > > > + ret =3D nand_read_page_op(nand, page, offs_in_p= age, > > > + dma_buf, bytes_to_handl= e); > > > + if (!ret) > > > + memcpy(&buf[bytes_handled], dma_buf, > > > + bytes_to_handle); > > > + } > > > + if (ret) > > > + goto out_otp; > > > + > > > + bytes_handled +=3D bytes_to_handle; > > > + offs_in_page =3D 0; > > > + page++; > > > + } > > > + > > > + *retlen =3D bytes_handled; > > > + > > > +out_otp: > > > + if (ret) > > > + dev_err(&mtd->dev, "failed to perform OTP IO: %i\n", re= t); > > > + > > > + ret =3D macronix_30lfxg18ac_otp_disable(nand); > > > + if (ret) > > > + dev_err(&mtd->dev, "failed to leave OTP mode after %s\n= ", > > > + write ? "write" : "read"); > > > + > > > + nand_deselect_target(nand); > > > + kfree(dma_buf); > > > + > > > + return ret; > > > +} > > > + > > > +static int macronix_30lfxg18ac_write_otp(struct mtd_info *mtd, loff_= t to, > > > + size_t len, size_t *rlen, > > > + const u_char *buf) > > > +{ > > > + return __macronix_30lfxg18ac_rw_otp(mtd, to, len, rlen, (u_char= *)buf, > > > + true); > > > +} > > > + > > > +static int macronix_30lfxg18ac_read_otp(struct mtd_info *mtd, loff_t= from, > > > + size_t len, size_t *rlen, > > > + u_char *buf) > > > +{ > > > + return __macronix_30lfxg18ac_rw_otp(mtd, from, len, rlen, buf, = false); > > > +} > > > + > > > +static int macronix_30lfxg18ac_lock_otp(struct mtd_info *mtd, loff_t= from, > > > + size_t len) > > > +{ > > > + u8 feature_buf[ONFI_SUBFEATURE_PARAM_LEN] =3D { 0 }; > > > + struct nand_chip *nand; > > > + int ret; > > > + > > > + if (from !=3D MACRONIX_30LFXG18AC_OTP_START_BYTE || > > > + len !=3D MACRONIX_30LFXG18AC_OTP_SIZE_BYTES) > > > + return -EINVAL; > > > + > > > + dev_dbg(&mtd->dev, "locking OTP\n"); > > > + > > > + nand =3D mtd_to_nand(mtd); > > > + nand_select_target(nand, 0); > > > + > > > + feature_buf[0] =3D MACRONIX_30LFXG18AC_OTP_EN | > > > + MACRONIX_30LFXG18AC_OTP_LOCKED; > > > + ret =3D nand_set_features(nand, ONFI_FEATURE_ADDR_30LFXG18AC_OT= P, > > > + feature_buf); > > > + if (ret) { > > > + dev_err(&mtd->dev, > > > + "failed to lock OTP (set features): %i\n", ret); > > > + nand_deselect_target(nand); > > > + return ret; > > > + } > > > + > > > + /* Do dummy page prog with zero address. */ > > > + feature_buf[0] =3D 0; > > > + ret =3D nand_prog_page_op(nand, 0, 0, feature_buf, 1); > > > + if (ret) > > > + dev_err(&mtd->dev, > > > + "failed to lock OTP (page prog): %i\n", ret); > > > + > > > + ret =3D macronix_30lfxg18ac_otp_disable(nand); > > > + if (ret) > > > + dev_err(&mtd->dev, "failed to leave OTP mode after lock= \n"); > > > + > > > + nand_deselect_target(nand); > > > + > > > + return ret; > > > +} > > > + > > > +static void macronix_nand_setup_otp(struct nand_chip *chip) > > > +{ > > > + static const char * const supported_otp_models[] =3D { > > > + "MX30LF1G18AC", > > > + "MX30LF2G18AC", > > > + "MX30LF4G18AC", > > > + }; > > > + struct mtd_info *mtd; > > > + > > > + if (match_string(supported_otp_models, > > > + ARRAY_SIZE(supported_otp_models), > > > + chip->parameters.model) < 0) > > > + return; > > > + > > > + if (!chip->parameters.supports_set_get_features) > > > + return; > > > + > > > + bitmap_set(chip->parameters.get_feature_list, > > > + ONFI_FEATURE_ADDR_30LFXG18AC_OTP, 1); > > > + bitmap_set(chip->parameters.set_feature_list, > > > + ONFI_FEATURE_ADDR_30LFXG18AC_OTP, 1); > > > + > > > + mtd =3D nand_to_mtd(chip); > > > + mtd->_get_fact_prot_info =3D macronix_30lfxg18ac_get_otp_info; > > > + mtd->_read_fact_prot_reg =3D macronix_30lfxg18ac_read_otp; > > > + mtd->_get_user_prot_info =3D macronix_30lfxg18ac_get_otp_info; > > > + mtd->_read_user_prot_reg =3D macronix_30lfxg18ac_read_otp; > > > + mtd->_write_user_prot_reg =3D macronix_30lfxg18ac_write_otp; > > > + mtd->_lock_user_prot_reg =3D macronix_30lfxg18ac_lock_otp; > > > +} > > > + > > > static int macronix_nand_init(struct nand_chip *chip) > > > { > > > if (nand_is_slc(chip)) > > > @@ -325,6 +540,7 @@ static int macronix_nand_init(struct nand_chip *c= hip) > > > macronix_nand_onfi_init(chip); > > > macronix_nand_block_protection_support(chip); > > > macronix_nand_deep_power_down_support(chip); > > > + macronix_nand_setup_otp(chip); > > > > > > return 0; > > > } =20 > > > > > > Thanks, > > Miqu=C3=A8l =20 >=20 > Thanks > Jaime