Message ID | 20241219-topic-am62-partialio-v6-12-b4-v4-1-1cb8eabd407e@baylibre.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | firmware: ti_sci: Partial-IO support | expand |
On Dec 19, 2024 at 21:02:12 +0100, Markus Schneider-Pargmann wrote: > Check the header flags if an response is expected or not. If it is not > expected skip the receive part of ti_sci_do_xfer(). This prepares the > driver for one-way messages as prepare_sleep for Partial-IO. > > Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com> > --- > drivers/firmware/ti_sci.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/drivers/firmware/ti_sci.c b/drivers/firmware/ti_sci.c > index 806a975fff22ae00ecb88587b2c47ba172120bc2..ec0c54935ac0d667323d98b86ac9d288b73be6aa 100644 > --- a/drivers/firmware/ti_sci.c > +++ b/drivers/firmware/ti_sci.c > @@ -398,10 +398,13 @@ static void ti_sci_put_one_xfer(struct ti_sci_xfers_info *minfo, > static inline int ti_sci_do_xfer(struct ti_sci_info *info, > struct ti_sci_xfer *xfer) > { > + struct ti_sci_msg_hdr *hdr = (struct ti_sci_msg_hdr *)xfer->tx_message.buf; I think it's best to sort this in order? so it will come below struct device? > int ret; > int timeout; > struct device *dev = info->dev; > bool done_state = true; > + bool response_expected = !!(hdr->flags & (TI_SCI_FLAG_REQ_ACK_ON_PROCESSED | > + TI_SCI_FLAG_REQ_ACK_ON_RECEIVED)); > > ret = mbox_send_message(info->chan_tx, &xfer->tx_message); > if (ret < 0) > @@ -409,6 +412,9 @@ static inline int ti_sci_do_xfer(struct ti_sci_info *info, > > ret = 0; > > + if (!response_expected) > + goto no_response; > + I am not a very big fan of using goto here, it feels like we should be more clear in our implementation and make the else part below more specific by using `else if` and checking for more specific SYSTEM_XX states. Then based on POWEROFF, skip any polling or whatever wait for response. Infact, with that we may not even need the response_expected part, but I am okay keeping both checks in place just for the clarity in design. > if (system_state <= SYSTEM_RUNNING) { > /* And we wait for the response. */ > timeout = msecs_to_jiffies(info->desc->max_rx_timeout_ms); > @@ -429,6 +435,7 @@ static inline int ti_sci_do_xfer(struct ti_sci_info *info, > dev_err(dev, "Mbox timedout in resp(caller: %pS)\n", > (void *)_RET_IP_); >
diff --git a/drivers/firmware/ti_sci.c b/drivers/firmware/ti_sci.c index 806a975fff22ae00ecb88587b2c47ba172120bc2..ec0c54935ac0d667323d98b86ac9d288b73be6aa 100644 --- a/drivers/firmware/ti_sci.c +++ b/drivers/firmware/ti_sci.c @@ -398,10 +398,13 @@ static void ti_sci_put_one_xfer(struct ti_sci_xfers_info *minfo, static inline int ti_sci_do_xfer(struct ti_sci_info *info, struct ti_sci_xfer *xfer) { + struct ti_sci_msg_hdr *hdr = (struct ti_sci_msg_hdr *)xfer->tx_message.buf; int ret; int timeout; struct device *dev = info->dev; bool done_state = true; + bool response_expected = !!(hdr->flags & (TI_SCI_FLAG_REQ_ACK_ON_PROCESSED | + TI_SCI_FLAG_REQ_ACK_ON_RECEIVED)); ret = mbox_send_message(info->chan_tx, &xfer->tx_message); if (ret < 0) @@ -409,6 +412,9 @@ static inline int ti_sci_do_xfer(struct ti_sci_info *info, ret = 0; + if (!response_expected) + goto no_response; + if (system_state <= SYSTEM_RUNNING) { /* And we wait for the response. */ timeout = msecs_to_jiffies(info->desc->max_rx_timeout_ms); @@ -429,6 +435,7 @@ static inline int ti_sci_do_xfer(struct ti_sci_info *info, dev_err(dev, "Mbox timedout in resp(caller: %pS)\n", (void *)_RET_IP_); +no_response: /* * NOTE: we might prefer not to need the mailbox ticker to manage the * transfer queueing since the protocol layer queues things by itself.
Check the header flags if an response is expected or not. If it is not expected skip the receive part of ti_sci_do_xfer(). This prepares the driver for one-way messages as prepare_sleep for Partial-IO. Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com> --- drivers/firmware/ti_sci.c | 7 +++++++ 1 file changed, 7 insertions(+)