[PATCH v1] mailbox: support timeout when sending

alice.guo at oss.nxp.com alice.guo at oss.nxp.com
Sun Sep 29 14:53:42 CEST 2024


From: Peng Fan <peng.fan at nxp.com>

Add timeout support for mbox_send.

Signed-off-by: Peng Fan <peng.fan at nxp.com>
Signed-off-by: Alice Guo <alice.guo at nxp.com>
Reviewed-by: Ye Li <ye.li at nxp.com>
---
 drivers/mailbox/mailbox-uclass.c | 19 ++++++++++++++++++-
 include/mailbox.h                |  2 ++
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/drivers/mailbox/mailbox-uclass.c b/drivers/mailbox/mailbox-uclass.c
index 4bf4987ce0..0ca8b3770f 100644
--- a/drivers/mailbox/mailbox-uclass.c
+++ b/drivers/mailbox/mailbox-uclass.c
@@ -117,10 +117,27 @@ int mbox_free(struct mbox_chan *chan)
 int mbox_send(struct mbox_chan *chan, const void *data)
 {
 	struct mbox_ops *ops = mbox_dev_ops(chan->dev);
+	ulong start_time, timeout_us;
+	int ret;
 
 	debug("%s(chan=%p, data=%p)\n", __func__, chan, data);
 
-	return ops->send(chan, data);
+	start_time = timer_get_us();
+	timeout_us = chan->tx_timeout_us;
+	/*
+	 * Account for partial us ticks, but if timeout_us is 0, ensure we
+	 * still don't wait at all.
+	 */
+	if (timeout_us)
+		timeout_us++;
+
+	for (;;) {
+		ret = ops->send(chan, data);
+		if (ret != -EBUSY)
+			return ret;
+		if ((timer_get_us() - start_time) >= timeout_us)
+			return -ETIMEDOUT;
+	}
 }
 
 int mbox_recv(struct mbox_chan *chan, void *data, ulong timeout_us)
diff --git a/include/mailbox.h b/include/mailbox.h
index e70266fb61..3cc64f20b7 100644
--- a/include/mailbox.h
+++ b/include/mailbox.h
@@ -46,6 +46,7 @@ struct udevice;
  *
  * @dev: The device which implements the mailbox.
  * @id: The mailbox channel ID within the provider.
+ * @tx_timeout_us: The tx timeout in us.
  * @con_priv: Hook for controller driver to attach private data
  *
  * Currently, the mailbox API assumes that a single integer ID is enough to
@@ -61,6 +62,7 @@ struct mbox_chan {
 	struct udevice *dev;
 	/* Written by of_xlate.*/
 	unsigned long id;
+	unsigned long tx_timeout_us;
 	void *con_priv;
 };
 
-- 
2.34.1



More information about the U-Boot mailing list