diff mbox series

[U-Boot] misc: mxc_ocotp: check fuse word before programming on i.MX7ULP

Message ID 1514879480-24535-1-git-send-email-peng.fan@nxp.com
State Accepted
Commit 8df42bee0e728707ef4f7e7d2b12b015a4a95200
Delegated to: Stefano Babic
Headers show
Series [U-Boot] misc: mxc_ocotp: check fuse word before programming on i.MX7ULP | expand

Commit Message

Peng Fan Jan. 2, 2018, 7:51 a.m. UTC
On i.MX7ULP, the fuse words (except bank 0 and 1) only supports to
write once, because they use ECC mode. Multiple writes may damage
the ECC value and cause a wrong fuse value decoded when reading.
This patch adds a checking before the fuse word programming, only
can write when the word value is 0.

Signed-off-by: Ye Li <ye.li@nxp.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
 drivers/misc/mxc_ocotp.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

Comments

Stefano Babic Jan. 12, 2018, 1:35 p.m. UTC | #1
On 02/01/2018 08:51, Peng Fan wrote:
> On i.MX7ULP, the fuse words (except bank 0 and 1) only supports to
> write once, because they use ECC mode. Multiple writes may damage
> the ECC value and cause a wrong fuse value decoded when reading.
> This patch adds a checking before the fuse word programming, only
> can write when the word value is 0.
> 
> Signed-off-by: Ye Li <ye.li@nxp.com>
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> ---

Applied to u-boot-imx, thanks !

Best regards,
Stefano Babic
diff mbox series

Patch

diff --git a/drivers/misc/mxc_ocotp.c b/drivers/misc/mxc_ocotp.c
index 8986bb4ad0..18a2730909 100644
--- a/drivers/misc/mxc_ocotp.c
+++ b/drivers/misc/mxc_ocotp.c
@@ -342,6 +342,23 @@  int fuse_sense(u32 bank, u32 word, u32 *val)
 static int prepare_write(struct ocotp_regs **regs, u32 bank, u32 word,
 				const char *caller)
 {
+#ifdef CONFIG_MX7ULP
+	u32 val;
+	int ret;
+
+	/* Only bank 0 and 1 are redundancy mode, others are ECC mode */
+	if (bank != 0 && bank != 1) {
+		ret = fuse_sense(bank, word, &val);
+		if (ret)
+			return ret;
+
+		if (val != 0) {
+			printf("mxc_ocotp: The word has been programmed, no more write\n");
+			return -EPERM;
+		}
+	}
+#endif
+
 	return prepare_access(regs, bank, word, true, caller);
 }