Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

firmware: exynos-acpm: Count number of commands in acpm_xfer

Struct acpm_xfer holds two buffers with u32 commands - rxd and txd - and
counts their size by rxlen and txlen. "len" suffix is here ambiguous,
so could mean length of the buffer or length of commands, and these are
not the same since each command is u32. Rename these to rxcnt and
txcnt, and change their usage to count the number of commands in each
buffer.

This will have a benefit of allowing to use __counted_by_ptr later.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
Reviewed-by: Tudor Ambarus <tudor.ambarus@linaro.org>
Link: https://patch.msgid.link/20260219-firmare-acpm-counted-v2-2-e1f7389237d3@oss.qualcomm.com
Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>

authored by

Krzysztof Kozlowski and committed by
Krzysztof Kozlowski
00808ae2 910e91a6

+21 -20
+5 -4
drivers/firmware/samsung/exynos-acpm-dvfs.c
··· 5 5 * Copyright 2025 Linaro Ltd. 6 6 */ 7 7 8 + #include <linux/array_size.h> 8 9 #include <linux/bitfield.h> 9 10 #include <linux/firmware/samsung/exynos-acpm-protocol.h> 10 11 #include <linux/ktime.h> ··· 26 25 { 27 26 xfer->acpm_chan_id = acpm_chan_id; 28 27 xfer->txd = cmd; 29 - xfer->txlen = cmdlen; 28 + xfer->txcnt = cmdlen; 30 29 31 30 if (response) { 32 31 xfer->rxd = cmd; 33 - xfer->rxlen = cmdlen; 32 + xfer->rxcnt = cmdlen; 34 33 } 35 34 } 36 35 ··· 51 50 u32 cmd[4]; 52 51 53 52 acpm_dvfs_init_set_rate_cmd(cmd, clk_id, rate); 54 - acpm_dvfs_set_xfer(&xfer, cmd, sizeof(cmd), acpm_chan_id, false); 53 + acpm_dvfs_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id, false); 55 54 56 55 return acpm_do_xfer(handle, &xfer); 57 56 } ··· 71 70 int ret; 72 71 73 72 acpm_dvfs_init_get_rate_cmd(cmd, clk_id); 74 - acpm_dvfs_set_xfer(&xfer, cmd, sizeof(cmd), acpm_chan_id, true); 73 + acpm_dvfs_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id, true); 75 74 76 75 ret = acpm_do_xfer(handle, &xfer); 77 76 if (ret)
+7 -7
drivers/firmware/samsung/exynos-acpm-pmic.c
··· 63 63 { 64 64 xfer->txd = cmd; 65 65 xfer->rxd = cmd; 66 - xfer->txlen = cmdlen; 67 - xfer->rxlen = cmdlen; 66 + xfer->txcnt = cmdlen; 67 + xfer->rxcnt = cmdlen; 68 68 xfer->acpm_chan_id = acpm_chan_id; 69 69 } 70 70 ··· 86 86 int ret; 87 87 88 88 acpm_pmic_init_read_cmd(cmd, type, reg, chan); 89 - acpm_pmic_set_xfer(&xfer, cmd, sizeof(cmd), acpm_chan_id); 89 + acpm_pmic_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id); 90 90 91 91 ret = acpm_do_xfer(handle, &xfer); 92 92 if (ret) ··· 119 119 return -EINVAL; 120 120 121 121 acpm_pmic_init_bulk_read_cmd(cmd, type, reg, chan, count); 122 - acpm_pmic_set_xfer(&xfer, cmd, sizeof(cmd), acpm_chan_id); 122 + acpm_pmic_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id); 123 123 124 124 ret = acpm_do_xfer(handle, &xfer); 125 125 if (ret) ··· 159 159 int ret; 160 160 161 161 acpm_pmic_init_write_cmd(cmd, type, reg, chan, value); 162 - acpm_pmic_set_xfer(&xfer, cmd, sizeof(cmd), acpm_chan_id); 162 + acpm_pmic_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id); 163 163 164 164 ret = acpm_do_xfer(handle, &xfer); 165 165 if (ret) ··· 199 199 return -EINVAL; 200 200 201 201 acpm_pmic_init_bulk_write_cmd(cmd, type, reg, chan, count, buf); 202 - acpm_pmic_set_xfer(&xfer, cmd, sizeof(cmd), acpm_chan_id); 202 + acpm_pmic_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id); 203 203 204 204 ret = acpm_do_xfer(handle, &xfer); 205 205 if (ret) ··· 229 229 int ret; 230 230 231 231 acpm_pmic_init_update_cmd(cmd, type, reg, chan, value, mask); 232 - acpm_pmic_set_xfer(&xfer, cmd, sizeof(cmd), acpm_chan_id); 232 + acpm_pmic_set_xfer(&xfer, cmd, ARRAY_SIZE(cmd), acpm_chan_id); 233 233 234 234 ret = acpm_do_xfer(handle, &xfer); 235 235 if (ret)
+7 -7
drivers/firmware/samsung/exynos-acpm.c
··· 205 205 rx_seqnum = FIELD_GET(ACPM_PROTOCOL_SEQNUM, rx_data->cmd[0]); 206 206 207 207 if (rx_seqnum == tx_seqnum) { 208 - memcpy(xfer->rxd, rx_data->cmd, xfer->rxlen); 208 + memcpy(xfer->rxd, rx_data->cmd, xfer->rxcnt * sizeof(*xfer->rxd)); 209 209 clear_bit(rx_seqnum - 1, achan->bitmap_seqnum); 210 210 } 211 211 } ··· 258 258 259 259 if (rx_data->response) { 260 260 if (rx_seqnum == tx_seqnum) { 261 - __ioread32_copy(xfer->rxd, addr, 262 - xfer->rxlen / 4); 261 + __ioread32_copy(xfer->rxd, addr, xfer->rxcnt); 263 262 rx_set = true; 264 263 clear_bit(seqnum, achan->bitmap_seqnum); 265 264 } else { ··· 268 269 * clear yet the bitmap. It will be cleared 269 270 * after the response is copied to the request. 270 271 */ 271 - __ioread32_copy(rx_data->cmd, addr, 272 - xfer->rxlen / 4); 272 + __ioread32_copy(rx_data->cmd, addr, xfer->rxcnt); 273 273 } 274 274 } else { 275 275 clear_bit(seqnum, achan->bitmap_seqnum); ··· 423 425 424 426 achan = &acpm->chans[xfer->acpm_chan_id]; 425 427 426 - if (!xfer->txd || xfer->txlen > achan->mlen || xfer->rxlen > achan->mlen) 428 + if (!xfer->txd || 429 + (xfer->txcnt * sizeof(*xfer->txd) > achan->mlen) || 430 + (xfer->rxcnt * sizeof(*xfer->rxd) > achan->mlen)) 427 431 return -EINVAL; 428 432 429 433 if (!achan->poll_completion) { ··· 448 448 449 449 /* Write TX command. */ 450 450 __iowrite32_copy(achan->tx.base + achan->mlen * tx_front, 451 - xfer->txd, xfer->txlen / 4); 451 + xfer->txd, xfer->txcnt); 452 452 453 453 /* Advance TX front. */ 454 454 writel(idx, achan->tx.front);
+2 -2
drivers/firmware/samsung/exynos-acpm.h
··· 10 10 struct acpm_xfer { 11 11 const u32 *txd; 12 12 u32 *rxd; 13 - size_t txlen; 14 - size_t rxlen; 13 + size_t txcnt; 14 + size_t rxcnt; 15 15 unsigned int acpm_chan_id; 16 16 }; 17 17