Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp577186ybl; Wed, 29 Jan 2020 06:01:09 -0800 (PST) X-Google-Smtp-Source: APXvYqyXy/Om3HQ0gWlmtMUg7mcKOQcwtC/6GesLrCLMwKODXXbEJq5LaB9AXNlGPMNlvxGN0ct4 X-Received: by 2002:a9d:6f0d:: with SMTP id n13mr20962764otq.165.1580306469727; Wed, 29 Jan 2020 06:01:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1580306469; cv=none; d=google.com; s=arc-20160816; b=OQsOR6kl1xWMBAN/75yM6ueUZEJ63McDSANhkB35gl6S/lxxuX52IKbGESHiMriWD5 ZQW7NkqJuc/LEg05U/Nk43hVjW7Lq1rw+XCf1ntNVCpSAvgpguTTgQW/Ygxz/w3YSZaV t59PbgwdhswWVQosNmWkDNUi4Ij4dFIYaHL/wSlrQ7AVxtdH0lJgVsohCoX0gHCtFoq/ 4R48elV7vAjoOIanwF9nO7ErDboYZ2kjRSM9Q4EzVarLd/JGryDFriTkpHYxXZzYT5nr v3PykrFmc3syEr6hL97iZt61WHjIlnScP3ZVvr8uePsn+UXucCot1/AqpipazAv4Bnhp fWHg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :organization:references:in-reply-to:message-id:subject:cc:to:from :date; bh=q2h/hGLpx0YYIuAJaLBEh5IRws9xyrmFSuQtqincXQE=; b=xppxGaUBtSaOpt3OpRHz7Q7FQEWL+5i9jpOCyTALk2Vgnkfhwv0BSrj0AbQlh60Xlp DNllwb4d/M1xZ8sVNsODgCk1TaDsg/G+m6KDzXUGgcekKwuhm5jLZysOWyIbOh5aElWa u0KSsyCqm0wRjcoEckQqM4U4eh4b0GRddQhZkTPF+tbuMsvg26jw9QO4iSFK5d/IkA6I X/e8o9XASe2dY8V1eWo4qaKiYStJfGMKN2a0NP3U7zgtBcTgAgo5wmgcComAIMiSTsdC dj8eIjEeOGe+v1aLgBP+NF+qguhFoPvZJ1WSRLRkcKS3l0h9J3Ai0XlmO+ChB5Bfi9EM c1Sw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o18si1057807oic.18.2020.01.29.06.00.54; Wed, 29 Jan 2020 06:01:09 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726385AbgA2N7y convert rfc822-to-8bit (ORCPT + 99 others); Wed, 29 Jan 2020 08:59:54 -0500 Received: from relay9-d.mail.gandi.net ([217.70.183.199]:56287 "EHLO relay9-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726261AbgA2N7y (ORCPT ); Wed, 29 Jan 2020 08:59:54 -0500 X-Originating-IP: 90.76.211.102 Received: from xps13 (lfbn-tou-1-1151-102.w90-76.abo.wanadoo.fr [90.76.211.102]) (Authenticated sender: miquel.raynal@bootlin.com) by relay9-d.mail.gandi.net (Postfix) with ESMTPSA id 197D2FF80F; Wed, 29 Jan 2020 13:59:51 +0000 (UTC) Date: Wed, 29 Jan 2020 14:59:50 +0100 From: Miquel Raynal To: Boris Brezillon Cc: Masahiro Yamada , linux-mtd , Linux Kernel Mailing List , Boris Brezillon Subject: Re: How to handle write-protect pin of NAND device ? Message-ID: <20200129145950.2a324acf@xps13> In-Reply-To: <20200129145336.66f840ea@collabora.com> References: <20200127153559.60a83e76@xps13> <20200127164554.34a21177@collabora.com> <20200127164755.29183962@xps13> <20200128075833.129902f6@collabora.com> <20200129143639.7f80addb@xps13> <20200129145336.66f840ea@collabora.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.4 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Boris, Boris Brezillon wrote on Wed, 29 Jan 2020 14:53:36 +0100: > On Wed, 29 Jan 2020 14:36:39 +0100 > Miquel Raynal wrote: > > > Hello, > > > > Masahiro Yamada wrote on Wed, 29 Jan 2020 > > 19:06:46 +0900: > > > > > On Tue, Jan 28, 2020 at 3:58 PM Boris Brezillon > > > wrote: > > > > > > > > On Mon, 27 Jan 2020 16:47:55 +0100 > > > > Miquel Raynal wrote: > > > > > > > > > Hi Hello, > > > > > > > > > > Boris Brezillon wrote on Mon, 27 Jan > > > > > 2020 16:45:54 +0100: > > > > > > > > > > > On Mon, 27 Jan 2020 15:35:59 +0100 > > > > > > Miquel Raynal wrote: > > > > > > > > > > > > > Hi Masahiro, > > > > > > > > > > > > > > Masahiro Yamada wrote on Mon, 27 Jan 2020 > > > > > > > 21:55:25 +0900: > > > > > > > > > > > > > > > Hi. > > > > > > > > > > > > > > > > I have a question about the > > > > > > > > WP_n pin of a NAND chip. > > > > > > > > > > > > > > > > > > > > > > > > As far as I see, the NAND framework does not > > > > > > > > handle it. > > > > > > > > > > > > > > There is a nand_check_wp() which reads the status of the pin before > > > > > > > erasing/writing. > > > > > > > > > > > > > > > > > > > > > > > Instead, it is handled in a driver level. > > > > > > > > I see some DT-bindings that handle the WP_n pin. > > > > > > > > > > > > > > > > $ git grep wp -- Documentation/devicetree/bindings/mtd/ > > > > > > > > Documentation/devicetree/bindings/mtd/brcm,brcmnand.txt:- > > > > > > > > brcm,nand-has-wp : Some versions of this IP include a > > > > > > > > write-protect > > > > > > > > > > > > > > Just checked: brcmnand de-assert WP when writing/erasing and asserts it > > > > > > > otherwise. IMHO this switching is useless. > > > > > > > > > > > > > > > Documentation/devicetree/bindings/mtd/ingenic,jz4780-nand.txt:- > > > > > > > > wp-gpios: GPIO specifier for the write protect pin. > > > > > > > > Documentation/devicetree/bindings/mtd/ingenic,jz4780-nand.txt: > > > > > > > > wp-gpios = <&gpf 22 GPIO_ACTIVE_LOW>; > > > > > > > > Documentation/devicetree/bindings/mtd/nvidia-tegra20-nand.txt:- > > > > > > > > wp-gpios: GPIO specifier for the write protect pin. > > > > > > > > Documentation/devicetree/bindings/mtd/nvidia-tegra20-nand.txt: > > > > > > > > wp-gpios = <&gpio TEGRA_GPIO(S, 0) GPIO_ACTIVE_LOW>; > > > > > > > > > > > > > > In both cases, the WP GPIO is unused in the code, just de-asserted at > > > > > > > boot time like what you do in the patch below. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > I wrote a patch to avoid read-only issue in some cases: > > > > > > > > http://patchwork.ozlabs.org/patch/1229749/ > > > > > > > > > > > > > > > > Generally speaking, we expect NAND devices > > > > > > > > are writable in Linux. So, I think my patch is OK. > > > > > > > > > > > > > > I think the patch is fine. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > However, I asked this myself: > > > > > > > > Is there a useful case to assert the write protect > > > > > > > > pin in order to make the NAND chip really read-only? > > > > > > > > For example, the system recovery image is stored in > > > > > > > > a read-only device, and the write-protect pin is > > > > > > > > kept asserted to assure nobody accidentally corrupts it. > > > > > > > > > > > > > > It is very likely that the same device is used for RO and RW storage so > > > > > > > in most cases this is not possible. We already have squashfs which is > > > > > > > actually read-only at filesystem level, I'm not sure it is needed to > > > > > > > enforce this at a lower level... Anyway if there is actually a pin for > > > > > > > that, one might want to handle the pin directly as a GPIO, what do you > > > > > > > think? > > > > > > > > > > > > FWIW, I've always considered the WP pin as a way to protect against > > > > > > spurious destructive command emission, which is most likely to happen > > > > > > during transition phases (bootloader -> linux, linux -> kexeced-linux, > > > > > > platform reset, ..., or any other transition where the pin state might > > > > > > be undefined at some point). This being said, if you're worried about > > > > > > other sources of spurious cmds (say your bus is shared between > > > > > > different kind of memory devices, and the CS pin is unreliable), you > > > > > > might want to leave the NAND in a write-protected state de-asserting WP > > > > > > only when explicitly issuing a destructive command (program page, erase > > > > > > block). > > > > > > > > > > Ok so with this in mind, only the brcmnand driver does a useful use of > > > > > the WP output. > > > > > > > > Well, I'd just say that brcmnand is more paranoid, which is a good > > > > thing I guess, but that doesn't make other solutions useless, just less > > > > safe. We could probably flag operations as 'destructive' at the > > > > nand_operation level, so drivers can assert/de-assert the pin on a > > > > per-operation basis. > > > > > > Sounds a good idea. > > > > > > If it is supported in the NAND framework, > > > I will be happy to implement in the Denali NAND driver. > > > > > > > There is currently no such thing at NAND level but I doubt there is > > more than erase and write operation during which it would be needed > > to assert/deassert WP. I don't see why having this flag would help > > the controller drivers? > > Because ->exec_op() was designed to avoid leaving such decisions to the > NAND controller drivers :P. If you now ask drivers to look at the > opcode and guess when they should de-assert the WP pin, you're just > going back to the ->cmdfunc() mess. I was actually thinking to the ->write_page(_raw)() helpers, but yeah, in the case of ->exec_op() it's different. However, for these helpers as don't use ->exec_op(), we need another way to flag the operation as destructive. But actually we could let the driver toggle the pin for any operation. If we want to be protected against spurious access, not directly ordered by the controller driver itself, then we don't care if the operation is actually destructive or not as long as the pin is deasserted during our operations and asserted otherwise. Miquèl