From e98e9b1ec9be918c9c607a414e6121f3163adc49 Mon Sep 17 00:00:00 2001 From: Vignesh Raghavendra Date: Thu, 26 Feb 2026 11:18:12 +0530 Subject: [PATCH 1/4] misc: k3_fuse: Fix printing of error codes Use signed int format to print error codes so that its more readable Fixes: ed5f2e5bed91 ("drivers: k3_fuse: Add fuse sub-system func calls") Signed-off-by: Vignesh Raghavendra Signed-off-by: Anshul Dalal --- drivers/misc/k3_fuse.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/misc/k3_fuse.c b/drivers/misc/k3_fuse.c index 4a8ff1f2523..cefdedaf411 100644 --- a/drivers/misc/k3_fuse.c +++ b/drivers/misc/k3_fuse.c @@ -28,7 +28,7 @@ int fuse_read(u32 bank, u32 word, u32 *val) *val = res.a1; if (res.a0 != 0) - printf("SMC call failed: Error code %lu\n", res.a0); + printf("SMC call failed: Error code %ld\n", res.a0); return res.a0; } @@ -53,7 +53,7 @@ int fuse_prog(u32 bank, u32 word, u32 val) val, mask, 0, 0, 0, 0, &res); if (res.a0 != 0) - printf("SMC call failed: Error code %lu\n", res.a0); + printf("SMC call failed: Error code %ld\n", res.a0); return res.a0; } @@ -72,7 +72,7 @@ int fuse_writebuff(ulong addr) 0, 0, 0, 0, 0, 0, &res); if (res.a0 != 0) - printf("SMC call failed: Error code %lu\n", res.a0); + printf("SMC call failed: Error code %ld\n", res.a0); return res.a0; } From 494782b6e0e5cfe12274f57ef7a8028a665957e9 Mon Sep 17 00:00:00 2001 From: Vignesh Raghavendra Date: Thu, 26 Feb 2026 11:18:13 +0530 Subject: [PATCH 2/4] misc: k3_fuse: Check readback on fuse prog Error out if readback value doesn't match the programmed value. Signed-off-by: Vignesh Raghavendra Signed-off-by: Anshul Dalal --- drivers/misc/k3_fuse.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/misc/k3_fuse.c b/drivers/misc/k3_fuse.c index cefdedaf411..882fd431659 100644 --- a/drivers/misc/k3_fuse.c +++ b/drivers/misc/k3_fuse.c @@ -52,8 +52,15 @@ int fuse_prog(u32 bank, u32 word, u32 val) arm_smccc_smc(K3_SIP_OTP_WRITE, word, val, mask, 0, 0, 0, 0, &res); - if (res.a0 != 0) + if (res.a0 != 0) { printf("SMC call failed: Error code %ld\n", res.a0); + return res.a0; + } + + if (res.a1 != val) { + printf("Readback failed, written 0x%x readback 0x%lx\n", val, res.a1); + return -EINVAL; + } return res.a0; } From b533d457aee435b4c19505617ce5a05be6e7255b Mon Sep 17 00:00:00 2001 From: Vignesh Raghavendra Date: Thu, 26 Feb 2026 11:18:14 +0530 Subject: [PATCH 3/4] misc: k3_fuse: Enable fuse Sense support fuse sense is essentially read, map it to fuse read. Signed-off-by: Vignesh Raghavendra Signed-off-by: Anshul Dalal --- drivers/misc/k3_fuse.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/misc/k3_fuse.c b/drivers/misc/k3_fuse.c index 882fd431659..d738f75f272 100644 --- a/drivers/misc/k3_fuse.c +++ b/drivers/misc/k3_fuse.c @@ -35,7 +35,7 @@ int fuse_read(u32 bank, u32 word, u32 *val) int fuse_sense(u32 bank, u32 word, u32 *val) { - return -EPERM; + return fuse_read(bank, word, val); } int fuse_prog(u32 bank, u32 word, u32 val) From 34c7bcacfab4a7efe83e0bad259fadc145be0046 Mon Sep 17 00:00:00 2001 From: Vignesh Raghavendra Date: Thu, 26 Feb 2026 11:18:15 +0530 Subject: [PATCH 4/4] misc: k3_fuse: Limit writes to 25bit values K3 OTP bits can only be programmed 25bits at a time. Limit the value accordingly using a 25 bit mask. Signed-off-by: Vignesh Raghavendra Signed-off-by: Anshul Dalal --- drivers/misc/k3_fuse.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/misc/k3_fuse.c b/drivers/misc/k3_fuse.c index d738f75f272..faafaffe07e 100644 --- a/drivers/misc/k3_fuse.c +++ b/drivers/misc/k3_fuse.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #define K3_SIP_OTP_WRITEBUFF 0xC2000000 @@ -41,7 +42,6 @@ int fuse_sense(u32 bank, u32 word, u32 *val) int fuse_prog(u32 bank, u32 word, u32 val) { struct arm_smccc_res res; - u32 mask = val; if (bank != 0U) { printf("Invalid bank argument, ONLY bank 0 is supported\n"); @@ -49,8 +49,8 @@ int fuse_prog(u32 bank, u32 word, u32 val) } /* Make SiP SMC call and send the word, val and mask in the parameter register */ - arm_smccc_smc(K3_SIP_OTP_WRITE, word, - val, mask, 0, 0, 0, 0, &res); + arm_smccc_smc(K3_SIP_OTP_WRITE, bank, word, + val, GENMASK(25, 0), 0, 0, 0, &res); if (res.a0 != 0) { printf("SMC call failed: Error code %ld\n", res.a0);