[PATCH v4 03/11] firmware: samsung: acpm: Annotate rx_data->cmd with __counted_by_ptr

Tudor Ambarus
2026-04-23T15:23:02Z

Rename the `n_cmd` member of `struct acpm_rx_data` to `cmdcnt` to
maintain consistent nomenclature across the driver (aligning with
`txcnt`, `rxcnt`, and transfer helpers).

With the member renamed, annotate the dynamically allocated `cmd`
pointer with the `__counted_by_ptr(cmdcnt)` macro to improve runtime
bounds checking.

Signed-off-by: Tudor Ambarus <tudor.ambarus@linaro.org>
---
drivers/firmware/samsung/exynos-acpm.c | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/firmware/samsung/exynos-acpm.c b/drivers/firmware/samsung/exynos-acpm.c
index c4aca61a63e4..e5c85d769d0a 100644
--- a/drivers/firmware/samsung/exynos-acpm.c
+++ b/drivers/firmware/samsung/exynos-acpm.c
@@ -103,12 +103,12 @@ struct acpm_queue {
* struct acpm_rx_data - RX queue data.
*
* @cmd: pointer to where the data shall be saved.
- * @n_cmd: number of 32-bit commands.
+ * @cmdcnt: allocated capacity of the @cmd buffer in 32-bit words.
* @rxcnt: expected length of the response in 32-bit words.
*/
struct acpm_rx_data {
- u32 *cmd;
- size_t n_cmd;
+ u32 *cmd __counted_by_ptr(cmdcnt);
+ size_t cmdcnt;
size_t rxcnt;
};

@@ -384,7 +384,7 @@ static void acpm_prepare_xfer(struct acpm_chan *achan,

/* Clear data for upcoming responses */
rx_data = &achan->rx_data[achan->seqnum - 1];
- memset(rx_data->cmd, 0, sizeof(*rx_data->cmd) * rx_data->n_cmd);
+ memset(rx_data->cmd, 0, sizeof(*rx_data->cmd) * rx_data->cmdcnt);
/* zero means no response expected */
rx_data->rxcnt = xfer->rxcnt;

@@ -537,19 +537,19 @@ static int acpm_achan_alloc_cmds(struct acpm_chan *achan)
{
struct device *dev = achan->acpm->dev;
struct acpm_rx_data *rx_data;
- size_t cmd_size, n_cmd;
+ size_t cmd_size, cmdcnt;
int i;

if (achan->mlen == 0)
return 0;

cmd_size = sizeof(*(achan->rx_data[0].cmd));
- n_cmd = DIV_ROUND_UP_ULL(achan->mlen, cmd_size);
+ cmdcnt = DIV_ROUND_UP_ULL(achan->mlen, cmd_size);

for (i = 0; i < ACPM_SEQNUM_MAX; i++) {
rx_data = &achan->rx_data[i];
- rx_data->n_cmd = n_cmd;
- rx_data->cmd = devm_kcalloc(dev, n_cmd, cmd_size, GFP_KERNEL);
+ rx_data->cmdcnt = cmdcnt;
+ rx_data->cmd = devm_kcalloc(dev, cmdcnt, cmd_size, GFP_KERNEL);
if (!rx_data->cmd)
return -ENOMEM;
}

--
2.54.0.545.g6539524ca2-goog