From 5d36ec40bf025c376246f2a75f8981d5d5ce1f96 Mon Sep 17 00:00:00 2001 From: Jon Lin Date: Fri, 25 Jul 2025 15:25:54 +0800 Subject: [PATCH] drivers: rkflash: Check unaligned sfc_request Change-Id: I1ad5c0c34a071178e3ef52f33e5ae5b905061e2b Signed-off-by: Jon Lin --- drivers/rkflash/sfc.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/rkflash/sfc.c b/drivers/rkflash/sfc.c index f8dddca665a0..c12de4793b6e 100644 --- a/drivers/rkflash/sfc.c +++ b/drivers/rkflash/sfc.c @@ -93,6 +93,8 @@ int sfc_request(struct rk_sfc_op *op, u32 addr, void *data, u32 size) union SFCCMD_DATA cmd; int reg; int timeout = 0; + u32 *p_data = (u32 *)data; + u32 temp = 0; reg = readl(g_sfc_reg + SFC_FSR); @@ -102,6 +104,20 @@ int sfc_request(struct rk_sfc_op *op, u32 addr, void *data, u32 size) cmd.d32 = op->sfcmd.d32; + if (size && size < 4 && cmd.b.rw == SFC_WRITE) { + if (size == 1) + temp = *((u8 *)data); + else if (size == 2) + temp = *((u16 *)data); + else + temp = ((u8 *)data)[0] | ((u8 *)data)[1] << 8 | ((u8 *)data)[2] << 16; + p_data = &temp; + } else if (size >= 4 && ((uintptr_t)data & 0x3)) { + pr_err("%s data addr unaligned access\n", __func__); + } else if (size & 0x3 && cmd.b.rw == SFC_WRITE) { + pr_err("%s data size unaligned access\n", __func__); + } + if (cmd.b.addrbits == SFC_ADDR_XBITS) { union SFCCTRL_DATA ctrl; @@ -158,7 +174,6 @@ int sfc_request(struct rk_sfc_op *op, u32 addr, void *data, u32 size) } else { u32 i, words, count, bytes; union SFCFSR_DATA fifostat; - u32 *p_data = (u32 *)data; if (cmd.b.rw == SFC_WRITE) { words = (size + 3) >> 2;