[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20c226de-c53a-41f3-b432-6f75a6f83e75@ti.com>
Date: Mon, 3 Nov 2025 16:10:33 -0600
From: Andrew Davis <afd@...com>
To: Beleswar Padhi <b-padhi@...com>, <jassisinghbrar@...il.com>,
	<linux-kernel@...r.kernel.org>, <hiago.franco@...adex.com>,
	<francesco.dolcini@...adex.com>
CC: <hnagalla@...com>, <u-kumar1@...com>, <nm@...com>, <vigneshr@...com>
Subject: Re: [PATCH v2] mailbox: omap-mailbox: Check for pending msgs only
 when mbox is exclusive
On 11/3/25 2:11 PM, 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/
> Signed-off-by: Beleswar Padhi <b-padhi@...com>
> ---
> Cc: Francesco Dolcini <francesco.dolcini@...adex.com>
> Cc: Hiago De Franco <hiago.franco@...adex.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;
Not a fan of this, you could have stored just the relevant
flag from the match data here in the instance data, not a
pointer to the whole const struct. The issue being now you
have the same info stored in two places, `intr_type` in the
match data above, and intr_type on the line above that.
Looking more into it, the use of `intr_type` doesn't need to be
stored in each mbox's instance data either, but that is an existing
issue. For now I don't want to hold up an otherwise good bugfix
over that, but we will want to come back here and clean some of
this up next cycle, for now,
Reviewed-by: Andrew Davis <afd@...com>
>   };
>   
>   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);
Powered by blists - more mailing lists