[PATCH v3 0/7] Implement the Generic System Interconnect Subsystem for U-Boot
Neil Armstrong
neil.armstrong at linaro.org
Mon Oct 27 13:51:36 CET 2025
Hi,
On 10/10/25 16:35, Neil Armstrong wrote:
> Let's introduce the Generic System Interconnect subsystem based on
> the counterpart Linux framework which is used to vote for bandwidth
> across multiple SoC busses.
>
> Documentation for the Linux Generic System Interconnect Subsystem can
> be found at [1].
>
> Each bus endpoints are materialised as "nodes" which are linked together,
> and the DT will specify a pair of nodes to enable and set a bandwidth
> on the route between those endpoints.
>
> The hardware resources that provide those nodes and provides the way
> to vote for the bandwidth are called "providers".
>
> The Interconnect uclass code is heavily based on the Linux one, with
> some small differences:
> - nodes are allocated as udevices instead of Linux idr_alloc()
> - tag management is minimal, only normal xlate is supported
> - getting nodes states at probe is not implemented
> - providers are probed on demand while the nodes links are traversed
> - nodes are populated on bind
> - id management is simplified, static IDs and dynamics IDs can be used
> - identical consume API as Linux, only implementation differs
>
> DM Testsuite is provided, testing all the API and nodes lifetime.
Is there any comments on this patchset ? or at least the DM emums and
the general code organization ?
Thanks,
Neil
>
> A first implementation for Qualcomm SoCs using the RPMh subsystem
> is added, bandwidth vote is required to have full bandwidth for
> storage devices and enabling some subsystem like Display to access
> the DDR memory.
>
> [1] https://docs.kernel.org/driver-api/interconnect.html
>
> Qcom implementation depends on:
> - https://lore.kernel.org/all/20250711143851.1490617-2-aswin.murugan@oss.qualcomm.com/
>
> Signed-off-by: Neil Armstrong <neil.armstrong at linaro.org>
> ---
> Changes in v3:
> - Add doc page, hevily based on the linux one
> - Documented all the structs and functions
> - Removed id field from icc_node, now using the device driver_data
> - icc_node id is not an ulong, can accept a pointer for dynamic id
> - Removed all functions call with icc_provider, now using the struct device only
> - Removed the icc_node provider entry, now only using dev->parent
> - Removed the interconnect pre_remove and pre_unbind, they are not needed
> - Removed more unused struct entries
> - Fixed the icc_path alloc, added the called dev to print errors with dev_err()
> - Removed IDs in sandbox interconnect, uses the "dynamic id" using the node pointers as ID
> - Now of_icc_get/_index will return NULL is prop is missing, like for Linux
> - Cleaned all the debug() calls, added new ones to track the bw agregations
> - Renamed node_find() to icc_node_find() to avoid name collision
> - Moved icc_node busy check to icc_node_busy()
> - Now icc_node_create passes the ID via driver_data
> - Added more bw test after put() calls, moved enable() after disable()
> - Used "Generic System Interconnect Subsystem" when possible
> - Dropped the icc_node init_avg/init_peak which is a Linux thing for sync_state
> - Dropped icc_node_add
> - Link to v2: https://lore.kernel.org/r/20251008-topic-interconnect-next-v2-0-c46e94dd328e@linaro.org
>
> Changes in v2:
> - Simplified nodes linking, looking for nodes at traversal instead of complexe debice reparent
> - Populates nodes at bind time, only probinf nodes and providers when a path if found
> - With proper refcounting the node lifetime is safe
> - DM test is added, testing with a small graph that calculations are good
> - Fixed plenty of typo and errors, and dropped useless code
> - Dropped RFC since DM test is available, and code works as expected
> - Link to v1: https://lore.kernel.org/r/20251003-topic-interconnect-next-v1-0-955eef068b6e@linaro.org
>
> ---
> Neil Armstrong (7):
> Introduce the Generic System Interconnect Subsystem
> interconnect: add DM test suite
> MAINTAINERS: add myself as Maintainer of the Generic System Interconnect Subsystem
> interconnect: add support for the Qualcomm RPMh helpers
> interconnect: add support for the SM8650 SoC
> ufs: qcom: vote for interconnect bandwidth on probe
> qcom_defconfig: enable interconnect for SM8650
>
> MAINTAINERS | 11 +
> arch/sandbox/dts/test.dts | 36 +
> arch/sandbox/include/asm/interconnect.h | 19 +
> configs/qcom_defconfig | 3 +
> configs/sandbox64_defconfig | 2 +
> configs/sandbox_defconfig | 2 +
> doc/api/index.rst | 1 +
> doc/api/interconnect.rst | 117 ++
> drivers/Kconfig | 2 +
> drivers/Makefile | 1 +
> drivers/interconnect/Kconfig | 22 +
> drivers/interconnect/Makefile | 8 +
> drivers/interconnect/interconnect-uclass.c | 543 +++++++
> drivers/interconnect/qcom/Kconfig | 12 +
> drivers/interconnect/qcom/Makefile | 7 +
> drivers/interconnect/qcom/bcm-voter.c | 340 +++++
> drivers/interconnect/qcom/bcm-voter.h | 19 +
> drivers/interconnect/qcom/icc-rpmh.c | 215 +++
> drivers/interconnect/qcom/icc-rpmh.h | 129 ++
> drivers/interconnect/qcom/sm8650.c | 1664 ++++++++++++++++++++++
> drivers/interconnect/qcom/sm8650.h | 144 ++
> drivers/interconnect/sandbox-interconnect-test.c | 89 ++
> drivers/interconnect/sandbox-interconnect.c | 293 ++++
> drivers/ufs/ufs-qcom.c | 13 +
> include/dm/uclass-id.h | 2 +
> include/interconnect-uclass.h | 136 ++
> include/interconnect.h | 155 ++
> test/dm/Makefile | 1 +
> test/dm/interconnect.c | 195 +++
> 29 files changed, 4181 insertions(+)
> ---
> base-commit: b8cea886d50e6c09985256e546904d640f600e4d
> change-id: 20251003-topic-interconnect-next-4ed75aecc01c
>
> Best regards,
More information about the U-Boot
mailing list