The Linux Kernel Mailing List
 help / color / mirror / Atom feed
* [PATCH v2] mailbox: omap-mailbox: Check for pending msgs only when mbox is exclusive
@ 2025-11-03 20:11 Beleswar Padhi
  2025-11-03 22:10 ` Andrew Davis
  2025-11-26  9:51 ` Francesco Dolcini
  0 siblings, 2 replies; 5+ messages in thread
From: Beleswar Padhi @ 2025-11-03 20:11 UTC (permalink / raw)
  To: jassisinghbrar, linux-kernel, hiago.franco, francesco.dolcini
  Cc: afd, hnagalla, u-kumar1, nm, vigneshr, b-padhi

On TI K3 devices, the mailbox resides in the Always-On power domain
(LPSC_main_alwayson) and is shared among multiple processors. The
mailbox is not solely exclusive to Linux.

Currently, the suspend path checks all FIFO queues for pending messages
and blocks suspend if any are present. This behavior is unnecessary for
K3 devices, since some of the FIFOs are used for RTOS<->RTOS
communication and are independent of Linux.

For FIFOs used in Linux<->RTOS communication, any pending message would
trigger an interrupt, which naturally prevents suspend from completing.
Hence, there is no need for the mailbox driver to explicitly check for
pending messages on K3 platforms.

Introduce a device match flag to indicate whether the mailbox instance
is exclusive to Linux, and skip the pending message check for
non-exclusive instances (such as in K3).

Fixes: a49f991e740f ("arm64: dts: ti: k3-am62-verdin: Add missing cfg for TI IPC Firmware")
Closes: https://lore.kernel.org/all/sid7gtg5vay5qgicsl6smnzwg5mnneoa35cempt5ddwjvedaio@hzsgcx6oo74l/
Signed-off-by: Beleswar Padhi <b-padhi@ti.com>
---
Cc: Francesco Dolcini <francesco.dolcini@toradex.com>
Cc: Hiago De Franco <hiago.franco@toradex.com>
Please help in testing the patch on Toradex platforms.

Testing Done:
1. Tested Boot across all TI K3 EVM/SK boards.
2. Tested IPC on all TI K3 J7* EVM/SK boards (& AM62x SK).
3. Tested mbox driver probe & device boot on AM57x-evm (OMAP5 based).
4. Tested that the patch generates no new warnings/errors.

Changes since v1:
1. Use device_get_match_data() in probe and store result for re-use.

Link to v1:
https://lore.kernel.org/all/20251103075920.2611642-1-b-padhi@ti.com/

Changes since RFC:
1. Skip checking pending messages instead of flushing
them explicitly for K3 devices.

Link to RFC Version:
https://lore.kernel.org/all/20251022102015.1345696-1-b-padhi@ti.com/

 drivers/mailbox/omap-mailbox.c | 35 +++++++++++++++++++---------------
 1 file changed, 20 insertions(+), 15 deletions(-)

diff --git a/drivers/mailbox/omap-mailbox.c b/drivers/mailbox/omap-mailbox.c
index 680243751d62..17fe6545875d 100644
--- a/drivers/mailbox/omap-mailbox.c
+++ b/drivers/mailbox/omap-mailbox.c
@@ -68,6 +68,7 @@ struct omap_mbox_fifo {
 
 struct omap_mbox_match_data {
 	u32 intr_type;
+	bool is_exclusive;
 };
 
 struct omap_mbox_device {
@@ -78,6 +79,7 @@ struct omap_mbox_device {
 	u32 num_users;
 	u32 num_fifos;
 	u32 intr_type;
+	const struct omap_mbox_match_data *mbox_data;
 };
 
 struct omap_mbox {
@@ -341,11 +343,13 @@ static int omap_mbox_suspend(struct device *dev)
 	if (pm_runtime_status_suspended(dev))
 		return 0;
 
-	for (fifo = 0; fifo < mdev->num_fifos; fifo++) {
-		if (mbox_read_reg(mdev, MAILBOX_MSGSTATUS(fifo))) {
-			dev_err(mdev->dev, "fifo %d has unexpected unread messages\n",
-				fifo);
-			return -EBUSY;
+	if (mdev->mbox_data->is_exclusive) {
+		for (fifo = 0; fifo < mdev->num_fifos; fifo++) {
+			if (mbox_read_reg(mdev, MAILBOX_MSGSTATUS(fifo))) {
+				dev_err(mdev->dev, "fifo %d has unexpected unread messages\n",
+					fifo);
+				return -EBUSY;
+			}
 		}
 	}
 
@@ -378,8 +382,9 @@ static const struct dev_pm_ops omap_mbox_pm_ops = {
 	SET_SYSTEM_SLEEP_PM_OPS(omap_mbox_suspend, omap_mbox_resume)
 };
 
-static const struct omap_mbox_match_data omap2_data = { MBOX_INTR_CFG_TYPE1 };
-static const struct omap_mbox_match_data omap4_data = { MBOX_INTR_CFG_TYPE2 };
+static const struct omap_mbox_match_data omap2_data = { MBOX_INTR_CFG_TYPE1, true };
+static const struct omap_mbox_match_data omap4_data = { MBOX_INTR_CFG_TYPE2, true };
+static const struct omap_mbox_match_data am654_data = { MBOX_INTR_CFG_TYPE2, false };
 
 static const struct of_device_id omap_mailbox_of_match[] = {
 	{
@@ -396,11 +401,11 @@ static const struct of_device_id omap_mailbox_of_match[] = {
 	},
 	{
 		.compatible	= "ti,am654-mailbox",
-		.data		= &omap4_data,
+		.data		= &am654_data,
 	},
 	{
 		.compatible	= "ti,am64-mailbox",
-		.data		= &omap4_data,
+		.data		= &am654_data,
 	},
 	{
 		/* end */
@@ -449,7 +454,6 @@ static int omap_mbox_probe(struct platform_device *pdev)
 	struct omap_mbox_fifo *fifo;
 	struct device_node *node = pdev->dev.of_node;
 	struct device_node *child;
-	const struct omap_mbox_match_data *match_data;
 	struct mbox_controller *controller;
 	u32 intr_type, info_count;
 	u32 num_users, num_fifos;
@@ -462,11 +466,6 @@ static int omap_mbox_probe(struct platform_device *pdev)
 		return -ENODEV;
 	}
 
-	match_data = of_device_get_match_data(&pdev->dev);
-	if (!match_data)
-		return -ENODEV;
-	intr_type = match_data->intr_type;
-
 	if (of_property_read_u32(node, "ti,mbox-num-users", &num_users))
 		return -ENODEV;
 
@@ -483,6 +482,12 @@ static int omap_mbox_probe(struct platform_device *pdev)
 	if (!mdev)
 		return -ENOMEM;
 
+	mdev->mbox_data = device_get_match_data(&pdev->dev);
+	if (!mdev->mbox_data)
+		return -ENODEV;
+
+	intr_type = mdev->mbox_data->intr_type;
+
 	mdev->mbox_base = devm_platform_ioremap_resource(pdev, 0);
 	if (IS_ERR(mdev->mbox_base))
 		return PTR_ERR(mdev->mbox_base);
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread
* Re: [PATCH v2] mailbox: omap-mailbox: Check for pending msgs only when mbox is exclusive
@ 2025-11-03 20:47 Hiago De Franco
  0 siblings, 0 replies; 5+ messages in thread
From: Hiago De Franco @ 2025-11-03 20:47 UTC (permalink / raw)
  To: Beleswar Padhi
  Cc: jassisinghbrar, linux-kernel, hiago.franco, francesco.dolcini,
	afd, hnagalla, u-kumar1, nm, vigneshr

On 04.11.2025 01:41, Beleswar Padhi wrote:
> On TI K3 devices, the mailbox resides in the Always-On power domain
> (LPSC_main_alwayson) and is shared among multiple processors. The
> mailbox is not solely exclusive to Linux.
> 
> Currently, the suspend path checks all FIFO queues for pending messages
> and blocks suspend if any are present. This behavior is unnecessary for
> K3 devices, since some of the FIFOs are used for RTOS<->RTOS
> communication and are independent of Linux.
> 
> For FIFOs used in Linux<->RTOS communication, any pending message would
> trigger an interrupt, which naturally prevents suspend from completing.
> Hence, there is no need for the mailbox driver to explicitly check for
> pending messages on K3 platforms.
> 
> Introduce a device match flag to indicate whether the mailbox instance
> is exclusive to Linux, and skip the pending message check for
> non-exclusive instances (such as in K3).
> 
> Fixes: a49f991e740f ("arm64: dts: ti: k3-am62-verdin: Add missing cfg for TI IPC Firmware")
> Closes: https://lore.kernel.org/all/sid7gtg5vay5qgicsl6smnzwg5mnneoa35cempt5ddwjvedaio@hzsgcx6oo74l/

Thanks for the patch, I tested on both Verdin AM62 and AM62P and looks
like everything is good, I can enter suspend without the error
previously reported.

Tested-by: Hiago De Franco <hiago.franco@toradex.com> # Verdin AM62/AM62P

Regards,
Hiago.

> Signed-off-by: Beleswar Padhi <b-padhi@ti.com>
> ---
> Cc: Francesco Dolcini <francesco.dolcini@toradex.com>
> Cc: Hiago De Franco <hiago.franco@toradex.com>
> Please help in testing the patch on Toradex platforms.
> 
> Testing Done:
> 1. Tested Boot across all TI K3 EVM/SK boards.
> 2. Tested IPC on all TI K3 J7* EVM/SK boards (& AM62x SK).
> 3. Tested mbox driver probe & device boot on AM57x-evm (OMAP5 based).
> 4. Tested that the patch generates no new warnings/errors.
> 
> Changes since v1:
> 1. Use device_get_match_data() in probe and store result for re-use.
> 
> Link to v1:
> https://lore.kernel.org/all/20251103075920.2611642-1-b-padhi@ti.com/
> 
> Changes since RFC:
> 1. Skip checking pending messages instead of flushing
> them explicitly for K3 devices.
> 
> Link to RFC Version:
> https://lore.kernel.org/all/20251022102015.1345696-1-b-padhi@ti.com/
> 
>  drivers/mailbox/omap-mailbox.c | 35 +++++++++++++++++++---------------
>  1 file changed, 20 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/mailbox/omap-mailbox.c b/drivers/mailbox/omap-mailbox.c
> index 680243751d62..17fe6545875d 100644
> --- a/drivers/mailbox/omap-mailbox.c
> +++ b/drivers/mailbox/omap-mailbox.c
> @@ -68,6 +68,7 @@ struct omap_mbox_fifo {
>  
>  struct omap_mbox_match_data {
>  	u32 intr_type;
> +	bool is_exclusive;
>  };
>  
>  struct omap_mbox_device {
> @@ -78,6 +79,7 @@ struct omap_mbox_device {
>  	u32 num_users;
>  	u32 num_fifos;
>  	u32 intr_type;
> +	const struct omap_mbox_match_data *mbox_data;
>  };
>  
>  struct omap_mbox {
> @@ -341,11 +343,13 @@ static int omap_mbox_suspend(struct device *dev)
>  	if (pm_runtime_status_suspended(dev))
>  		return 0;
>  
> -	for (fifo = 0; fifo < mdev->num_fifos; fifo++) {
> -		if (mbox_read_reg(mdev, MAILBOX_MSGSTATUS(fifo))) {
> -			dev_err(mdev->dev, "fifo %d has unexpected unread messages\n",
> -				fifo);
> -			return -EBUSY;
> +	if (mdev->mbox_data->is_exclusive) {
> +		for (fifo = 0; fifo < mdev->num_fifos; fifo++) {
> +			if (mbox_read_reg(mdev, MAILBOX_MSGSTATUS(fifo))) {
> +				dev_err(mdev->dev, "fifo %d has unexpected unread messages\n",
> +					fifo);
> +				return -EBUSY;
> +			}
>  		}
>  	}
>  
> @@ -378,8 +382,9 @@ static const struct dev_pm_ops omap_mbox_pm_ops = {
>  	SET_SYSTEM_SLEEP_PM_OPS(omap_mbox_suspend, omap_mbox_resume)
>  };
>  
> -static const struct omap_mbox_match_data omap2_data = { MBOX_INTR_CFG_TYPE1 };
> -static const struct omap_mbox_match_data omap4_data = { MBOX_INTR_CFG_TYPE2 };
> +static const struct omap_mbox_match_data omap2_data = { MBOX_INTR_CFG_TYPE1, true };
> +static const struct omap_mbox_match_data omap4_data = { MBOX_INTR_CFG_TYPE2, true };
> +static const struct omap_mbox_match_data am654_data = { MBOX_INTR_CFG_TYPE2, false };
>  
>  static const struct of_device_id omap_mailbox_of_match[] = {
>  	{
> @@ -396,11 +401,11 @@ static const struct of_device_id omap_mailbox_of_match[] = {
>  	},
>  	{
>  		.compatible	= "ti,am654-mailbox",
> -		.data		= &omap4_data,
> +		.data		= &am654_data,
>  	},
>  	{
>  		.compatible	= "ti,am64-mailbox",
> -		.data		= &omap4_data,
> +		.data		= &am654_data,
>  	},
>  	{
>  		/* end */
> @@ -449,7 +454,6 @@ static int omap_mbox_probe(struct platform_device *pdev)
>  	struct omap_mbox_fifo *fifo;
>  	struct device_node *node = pdev->dev.of_node;
>  	struct device_node *child;
> -	const struct omap_mbox_match_data *match_data;
>  	struct mbox_controller *controller;
>  	u32 intr_type, info_count;
>  	u32 num_users, num_fifos;
> @@ -462,11 +466,6 @@ static int omap_mbox_probe(struct platform_device *pdev)
>  		return -ENODEV;
>  	}
>  
> -	match_data = of_device_get_match_data(&pdev->dev);
> -	if (!match_data)
> -		return -ENODEV;
> -	intr_type = match_data->intr_type;
> -
>  	if (of_property_read_u32(node, "ti,mbox-num-users", &num_users))
>  		return -ENODEV;
>  
> @@ -483,6 +482,12 @@ static int omap_mbox_probe(struct platform_device *pdev)
>  	if (!mdev)
>  		return -ENOMEM;
>  
> +	mdev->mbox_data = device_get_match_data(&pdev->dev);
> +	if (!mdev->mbox_data)
> +		return -ENODEV;
> +
> +	intr_type = mdev->mbox_data->intr_type;
> +
>  	mdev->mbox_base = devm_platform_ioremap_resource(pdev, 0);
>  	if (IS_ERR(mdev->mbox_base))
>  		return PTR_ERR(mdev->mbox_base);
> -- 
> 2.34.1
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-11-26  9:51 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-03 20:11 [PATCH v2] mailbox: omap-mailbox: Check for pending msgs only when mbox is exclusive Beleswar Padhi
2025-11-03 22:10 ` Andrew Davis
2025-11-04  4:28   ` Beleswar Prasad Padhi
2025-11-26  9:51 ` Francesco Dolcini
  -- strict thread matches above, loose matches on Subject: below --
2025-11-03 20:47 Hiago De Franco

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox