[PATCH V2] firmware: ti_sci: Scan all device instances when releasing exclusive devices
Francis, Neha
n-francis at ti.com
Thu Apr 10 17:50:08 CEST 2025
Hi Nishanth
On 4/7/2025 5:45 PM, Nishanth Menon wrote:
> When FIT image with multiple dtbs are involved for R5 boot process,
> R5 SPL starts off with the first instance of dtb to probe the
> eeprom, then once we have identified the type of board, invocation
> of setup_multi_dtb_fit will replace the gd->fdt_blob with the proper
> board dtb match. However, when we do this, two things happen:
>
> a) Prior to the invocation of setup_multi_dtb_fit, as part of the eeprom
> discovery process, i2c controller device is already probed and marked
> as exclusive with the match of the very first tisci match (from the
> original boot dtb). This list is stored in the info->dev_list of the
> first probe.
> b) When the second dtb is loaded, tisci is probed again (since this is a
> new node) and the new info->dev_list is empty.
>
> At this stage, the exclusive devices such as i2c instances used to
> probe the board information is left in the old info->dev_list that is
> no longer used actively by the system using the replaced dtb.
>
> As a result of this, the cleanup we intend to do with
> ti_sci_cmd_release_exclusive_devices is no longer complete and
> leaves the instances such as i2c for eeprom marked used as we scan just
> the new info->dev_list.
>
> This creates a problem when Device Manager(DM) firmware starts up later
> on in the boot process and identifies that this instance of i2c is
> already marked active, so it assumes this can no longer be controlled
> by software and is marked internally as reserved and HLOS can no
> longer control these instances. This defeated the purpose of
> ti_sci_cmd_release_exclusive_devices.
>
> NOTE: This scheme works just fine if the FIT has just a single dtb as
> the info->dev_list is upto date.
>
> To fix this, let us make ti_sci_cmd_release_exclusive_devices scan the
> all registrations of tisci instances and cleanup all exclusive devices
> that have ever been registered.
>
> As part of this, change the prototype of release_exclusive_devices to
> drop the handle since that has no further meaning now.
>
> Though this issue was identified on AM64-sk, this can be present in
> other builds which use multi-fit-dtb for R5 SPL startup.
>
> Fixes: 9566b777ae0a ("firmware: ti_sci: Add a command for releasing all exclusive devices")
> Signed-off-by: Nishanth Menon <nm at ti.com>
> ---
> Changes since V1:
> * commit message: s/intent/intend (review comment)
> * Added comment to indicate am64x-sk
> * No functional changes.
>
> V1: https://lore.kernel.org/r/20250401205515.4078312-1-nm@ti.com
>
> Retaining test log:
>
> Test logs:
> ==========
> prior to this patch:
> https://gist.github.com/nmenon/8ce817ac991b6ff898734d15ae5ce623#file-before
> With this patch
> https://gist.github.com/nmenon/8ce817ac991b6ff898734d15ae5ce623#file-after
> Notice that 20000000.i2c is no longer deffered in Linux.
>
> Test of platforms (on c17f03a7e93d Merge tag 'net-20250314' of https://source.denx.de/u-boot/custodians/u-boot-net)
>
> https://gist.github.com/nmenon/917e15b397e5249dd76664ea62e9e662
>
> Though this was uncovered in automated check in upstream testing, this was also
> independently reported in:
> https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1459509/sk-am64b-deferred-probe-of-i2c-bus-using-sdk-09-and-10
>
> arch/arm/mach-k3/r5/common.c | 2 +-
> drivers/firmware/ti_sci.c | 23 ++++++++++++++---------
> include/linux/soc/ti/ti_sci_protocol.h | 2 +-
> 3 files changed, 16 insertions(+), 11 deletions(-)
>
> diff --git a/arch/arm/mach-k3/r5/common.c b/arch/arm/mach-k3/r5/common.c
> index 0f6c294f1eb2..fd188e7c90e4 100644
> --- a/arch/arm/mach-k3/r5/common.c
> +++ b/arch/arm/mach-k3/r5/common.c
> @@ -144,7 +144,7 @@ void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
> int ret, size = 0, shut_cpu = 0;
>
> /* Release all the exclusive devices held by SPL before starting ATF */
> - ti_sci->ops.dev_ops.release_exclusive_devices(ti_sci);
> + ti_sci->ops.dev_ops.release_exclusive_devices();
>
> ret = rproc_init();
> if (ret)
> diff --git a/drivers/firmware/ti_sci.c b/drivers/firmware/ti_sci.c
> index 190a1e3f5fc3..54d6689ce783 100644
> --- a/drivers/firmware/ti_sci.c
> +++ b/drivers/firmware/ti_sci.c
> @@ -696,20 +696,25 @@ static int ti_sci_cmd_put_device(const struct ti_sci_handle *handle, u32 id)
> MSG_DEVICE_SW_STATE_AUTO_OFF);
> }
>
> -static
> -int ti_sci_cmd_release_exclusive_devices(const struct ti_sci_handle *handle)
> +static int ti_sci_cmd_release_exclusive_devices(void)
> {
> struct ti_sci_exclusive_dev *dev, *tmp;
> struct ti_sci_info *info;
> int i, cnt;
>
> - info = handle_to_ti_sci_info(handle);
> -
> - list_for_each_entry_safe(dev, tmp, &info->dev_list, list) {
> - cnt = dev->count;
> - debug("%s: id = %d, cnt = %d\n", __func__, dev->id, cnt);
> - for (i = 0; i < cnt; i++)
> - ti_sci_cmd_put_device(handle, dev->id);
> + /*
> + * Scan all ti_sci_list registrations, since with FIT images, we could
> + * have started with one device tree registration and switched over
> + * to a final version. This prevents exclusive devices identified
> + * during the first probe to be left orphan.
> + */
> + list_for_each_entry(info, &ti_sci_list, list) {
> + list_for_each_entry_safe(dev, tmp, &info->dev_list, list) {
> + cnt = dev->count;
> + debug("%s: id = %d, cnt = %d\n", __func__, dev->id, cnt);
> + for (i = 0; i < cnt; i++)
> + ti_sci_cmd_put_device(&info->handle, dev->id);
> + }
> }
>
> return 0;
> diff --git a/include/linux/soc/ti/ti_sci_protocol.h b/include/linux/soc/ti/ti_sci_protocol.h
> index 8e4c43cef311..aa4d105ee988 100644
> --- a/include/linux/soc/ti/ti_sci_protocol.h
> +++ b/include/linux/soc/ti/ti_sci_protocol.h
> @@ -143,7 +143,7 @@ struct ti_sci_dev_ops {
> u32 reset_state);
> int (*get_device_resets)(const struct ti_sci_handle *handle, u32 id,
> u32 *reset_state);
> - int (*release_exclusive_devices)(const struct ti_sci_handle *handle);
> + int (*release_exclusive_devices)(void);
> };
>
> /**
Reviewed-by: Neha Malcom Francis <n-francis at ti.com>
--
Thanking You
Neha Malcom Francis
More information about the U-Boot
mailing list