[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CAPDyKFpk639BP+xa5Hy1Ji8JsVOsmx3bomQWZ1+hG3jAy2juVA@mail.gmail.com>
Date: Thu, 10 Jul 2025 13:48:26 +0200
From: Ulf Hansson <ulf.hansson@...aro.org>
To: Kendall Willis <k-willis@...com>
Cc: nm@...com, kristo@...nel.org, ssantosh@...nel.org,
linux-arm-kernel@...ts.infradead.org, linux-kernel@...r.kernel.org,
d-gole@...com, vishalm@...com, sebin.francis@...com, msp@...libre.com,
khilman@...libre.com
Subject: Re: [PATCH v2] firmware: ti_sci: Enable abort handling of entry to LPM
On Wed, 9 Jul 2025 at 22:54, Kendall Willis <k-willis@...com> wrote:
>
> The PM co-processor (device manager or DM) adds the ability to abort
> entry to a low power mode by clearing the mode selection in the
> latest version of its firmware (11.x). The following power management
> operation defined in the TISCI Low Power Mode API [1] is implemented to
> enable aborting entry to LPM:
>
> TISCI_MSG_LPM_ABORT
> Abort the current low power mode entry by clearing the current mode
> selection.
>
> Introduce LPM abort call that enables the ti_sci driver to support abort
> by clearing the low power mode selection of the DM. This fixes behavior
> from the DM where if system suspend failed, the next time system suspend
> is entered, it will fail because DM did not have the low power mode
> selection cleared. Instead of this behavior, the low power mode selection
> will be cleared after Linux resume which will allow subsequent system
> suspends to work correctly.
>
> When Linux suspends, the TI SCI ->suspend() call will send a prepare_sleep
> message to the DM. The DM will choose what low power mode to enter once
> Linux is suspended based on constraints given by devices in the TI SCI PM
> domain. After system suspend completes, regardless of if system suspend
> succeeds or fails, the ->complete() hook in TI SCI will be called. In the
> ->complete() hook, a message will be sent to the DM to clear the current
> low power mode selection. This is necessary because if suspend fails, the
> low power mode selection in the DM is not cleared and the next system
> suspend will fail due to the low power mode not having been cleared from
> the previous failed system suspend.
>
> Clearing the mode selection unconditionally acts as a cleanup from sending
> the prepare_sleep message in ->suspend(). The DM already clears the low
> power selection automatically when resuming from system suspend. If
> suspend/resume executed without failure, clearing the low power mode
> selection will not cause an error in the DM.
>
> The flow for the abort sequence is the following:
> 1. User sends a command to enter sleep
> 2. Linux starts to suspend drivers
> 3. TI SCI suspends and sends prepare_sleep message to DM
> 4. A driver fails to suspend
> 5. Linux resumes the drivers that have already suspended
> 6. Linux sends DM to clear the current low power mode selection from
> TI SCI ->complete() hook
> 7. DM aborts LPM entry by clearing the current mode selection
> 8. Linux works as normal
>
> [1] https://software-dl.ti.com/tisci/esd/latest/2_tisci_msgs/pm/lpm.html
>
> Signed-off-by: Kendall Willis <k-willis@...com>
Reviewed-by: Ulf Hansson <ulf.hansson@...aro.org>
Kind regards
Uffe
> ---
> Series has been tested on an SK-AM62B-P1 board. Normal suspend/resume
> has been verified. Abort was tested by adding an error into the TI SCI
> suspend hook.
> ---
> drivers/firmware/ti_sci.c | 61 +++++++++++++++++++++++++++++++++++++++
> drivers/firmware/ti_sci.h | 3 +-
> 2 files changed, 63 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/firmware/ti_sci.c b/drivers/firmware/ti_sci.c
> index ae5fd1936ad32..63c405f7037f0 100644
> --- a/drivers/firmware/ti_sci.c
> +++ b/drivers/firmware/ti_sci.c
> @@ -2015,6 +2015,58 @@ static int ti_sci_cmd_set_latency_constraint(const struct ti_sci_handle *handle,
> return ret;
> }
>
> +/**
> + * ti_sci_cmd_lpm_abort() - Abort entry to LPM by clearing selection of LPM to enter
> + * @handle: pointer to TI SCI handle
> + *
> + * Return: 0 if all went well, else returns appropriate error value.
> + */
> +static int ti_sci_cmd_lpm_abort(const struct ti_sci_handle *handle)
> +{
> + struct ti_sci_info *info;
> + struct ti_sci_msg_hdr *req;
> + struct ti_sci_msg_hdr *resp;
> + struct ti_sci_xfer *xfer;
> + struct device *dev;
> + int ret = 0;
> +
> + if (IS_ERR(handle))
> + return PTR_ERR(handle);
> + if (!handle)
> + return -EINVAL;
> +
> + info = handle_to_ti_sci_info(handle);
> + dev = info->dev;
> +
> + xfer = ti_sci_get_one_xfer(info, TI_SCI_MSG_LPM_ABORT,
> + TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
> + sizeof(*req), sizeof(*resp));
> + if (IS_ERR(xfer)) {
> + ret = PTR_ERR(xfer);
> + dev_err(dev, "Message alloc failed(%d)\n", ret);
> + return ret;
> + }
> + req = (struct ti_sci_msg_hdr *)xfer->xfer_buf;
> +
> + ret = ti_sci_do_xfer(info, xfer);
> + if (ret) {
> + dev_err(dev, "Mbox send fail %d\n", ret);
> + goto fail;
> + }
> +
> + resp = (struct ti_sci_msg_hdr *)xfer->xfer_buf;
> +
> + if (!ti_sci_is_response_ack(resp))
> + ret = -ENODEV;
> + else
> + ret = 0;
> +
> +fail:
> + ti_sci_put_one_xfer(&info->minfo, xfer);
> +
> + return ret;
> +}
> +
> static int ti_sci_cmd_core_reboot(const struct ti_sci_handle *handle)
> {
> struct ti_sci_info *info;
> @@ -3739,11 +3791,20 @@ static int __maybe_unused ti_sci_resume_noirq(struct device *dev)
> return 0;
> }
>
> +static void __maybe_unused ti_sci_complete(struct device *dev)
> +{
> + struct ti_sci_info *info = dev_get_drvdata(dev);
> +
> + if (ti_sci_cmd_lpm_abort(&info->handle))
> + dev_err(dev, "LPM clear selection failed.\n");
> +}
> +
> static const struct dev_pm_ops ti_sci_pm_ops = {
> #ifdef CONFIG_PM_SLEEP
> .suspend = ti_sci_suspend,
> .suspend_noirq = ti_sci_suspend_noirq,
> .resume_noirq = ti_sci_resume_noirq,
> + .complete = ti_sci_complete,
> #endif
> };
>
> diff --git a/drivers/firmware/ti_sci.h b/drivers/firmware/ti_sci.h
> index 053387d7baa06..51d77f90a32cc 100644
> --- a/drivers/firmware/ti_sci.h
> +++ b/drivers/firmware/ti_sci.h
> @@ -6,7 +6,7 @@
> * The system works in a message response protocol
> * See: https://software-dl.ti.com/tisci/esd/latest/index.html for details
> *
> - * Copyright (C) 2015-2024 Texas Instruments Incorporated - https://www.ti.com/
> + * Copyright (C) 2015-2025 Texas Instruments Incorporated - https://www.ti.com/
> */
>
> #ifndef __TI_SCI_H
> @@ -42,6 +42,7 @@
> #define TI_SCI_MSG_SET_IO_ISOLATION 0x0307
> #define TI_SCI_MSG_LPM_SET_DEVICE_CONSTRAINT 0x0309
> #define TI_SCI_MSG_LPM_SET_LATENCY_CONSTRAINT 0x030A
> +#define TI_SCI_MSG_LPM_ABORT 0x0311
>
> /* Resource Management Requests */
> #define TI_SCI_MSG_GET_RESOURCE_RANGE 0x1500
> --
> 2.34.1
>
Powered by blists - more mailing lists