[PATCH 10/22] firmware: ti_sci: Use tx_message as message buffer directly

From: Beleswar Padhi

Date: Tue Sep 29 2026 - 16:19:03 EST


From: Andrew Davis <afd@xxxxxx>

As we now have the tx_message during the whole xfer process we can use
that as our message buffer to be sent. This removes an extra copy.

Note: the mailbox framework keeps only a pointer to tx_message and may
submit it after ti_sci_do_xfer() returns if it was queued behind
other messages. But, this cannot happen in practice: messages expecting
a response are always submitted before their callers return, and the
only no-response message (PREPARE_SLEEP for Partial-IO) is sent from the
power-off handler with other CPUs stopped, after which nothing else uses
the TX channel.

Signed-off-by: Andrew Davis <afd@xxxxxx>
Co-developed-by: Beleswar Padhi <b-padhi@xxxxxx>
Signed-off-by: Beleswar Padhi <b-padhi@xxxxxx>
---
Note:
To avoid KASAN warnings, and possible duplicate message resend, it's
better for the following ti-msgmgr mbox patch series to be applied
before this one goes in:
https://lore.kernel.org/all/20260929200159.4033010-1-b-padhi@xxxxxx/

drivers/firmware/ti_sci.c | 14 ++------------
1 file changed, 2 insertions(+), 12 deletions(-)

diff --git a/drivers/firmware/ti_sci.c b/drivers/firmware/ti_sci.c
index dbe192142bf17..6ed67160c6a7f 100644
--- a/drivers/firmware/ti_sci.c
+++ b/drivers/firmware/ti_sci.c
@@ -43,18 +43,13 @@ static DEFINE_MUTEX(ti_sci_list_mutex);
/**
* struct ti_sci_xfer - Structure representing a message flow
* @tx_message: Transmit message
- * @tx_buf: Pointer to the message to send
* @rx_buf: Pointer to store received message
* @rx_len: Receive message length
* @xfer_buf: Preallocated buffer to store receive message
- * Since we work with request-ACK protocol, we can
- * reuse the same buffer for the rx path as we
- * use for the tx path.
* @done: completion event
*/
struct ti_sci_xfer {
struct ti_msgmgr_message tx_message;
- void *tx_buf;
void *rx_buf;
u8 rx_len;
u8 *xfer_buf;
@@ -372,16 +367,16 @@ static struct ti_sci_xfer *ti_sci_get_one_xfer(struct ti_sci_info *info,

xfer = &minfo->xfer_block[xfer_id];

- hdr = (struct ti_sci_msg_hdr *)xfer->tx_message.buf;
xfer->tx_message.len = tx_message_size;
xfer->tx_message.chan_rx = info->chan_rx;
xfer->tx_message.timeout_rx_ms = info->desc->max_rx_timeout_ms;
- xfer->tx_buf = tx_message;
+ xfer->tx_message.buf = tx_message;
xfer->rx_buf = rx_message;
xfer->rx_len = (u8)rx_message_size;

reinit_completion(&xfer->done);

+ hdr = (struct ti_sci_msg_hdr *)tx_message;
hdr->seq = xfer_id;
hdr->type = msg_type;
hdr->host = info->host_id;
@@ -487,10 +482,6 @@ static inline int ti_sci_do_xfer(const struct ti_sci_handle *handle,
if (IS_ERR(xfer))
return PTR_ERR(xfer);

- memcpy(xfer->xfer_buf + sizeof(struct ti_sci_msg_hdr),
- xfer->tx_buf + sizeof(struct ti_sci_msg_hdr),
- xfer->tx_message.len - sizeof(struct ti_sci_msg_hdr));
-
ret = mbox_send_message(info->chan_tx, &xfer->tx_message);
if (ret < 0) {
dev_err(dev, "Mbox send fail %d (caller: %pS)\n", ret, caller);
@@ -3396,7 +3387,6 @@ static int ti_sci_probe(struct platform_device *pdev)
if (!xfer->xfer_buf)
return -ENOMEM;

- xfer->tx_message.buf = xfer->xfer_buf;
init_completion(&xfer->done);
}

--
2.34.1