[PATCH AUTOSEL 6.15 9/9] Revert "bus: ti-sysc: Probe for l4_wkup and l4_cfg interconnect devices first"

Sasha Levin
2025-06-04T11:49:42Z

From: Alexander Sverdlin <alexander.sverdlin@siemens.com>

[ Upstream commit 36305857b1ead8f6ca033a913162ebc09bee0b43 ]

This reverts commit 4700a00755fb5a4bb5109128297d6fd2d1272ee6.

It breaks target-module@2b300050 ("ti,sysc-omap2") probe on AM62x in a case
when minimally-configured system tries to network-boot:

[ 6.888776] probe of 2b300050.target-module returned 517 after 258 usecs
[ 17.129637] probe of 2b300050.target-module returned 517 after 708 usecs
[ 17.137397] platform 2b300050.target-module: deferred probe pending: (reason unknown)
[ 26.878471] Waiting up to 100 more seconds for network.

There are minimal configurations possible when the deferred device is not
being probed any more (because everything else has been successfully
probed) and deferral lists are not processed any more.

Stable mmc enumeration can be achieved by filling /aliases node properly
(4700a00755fb commit's rationale).

After revert:

[ 9.006816] IP-Config: Complete:
[ 9.010058] device=lan0, ...

Tested-by: Andreas Kemnade <andreas@kemnade.info> # GTA04, Panda, BT200
Reviewed-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Alexander Sverdlin <alexander.sverdlin@siemens.com>
Link: https://lore.kernel.org/r/20250401090643.2776793-1-alexander.sverdlin@siemens.com
Signed-off-by: Kevin Hilman <khilman@baylibre.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---

Based on my analysis, I can see that the current tree still has the
original problematic code that needs to be reverted. Now let me provide
my assessment: **YES** This commit should be backported to stable kernel
trees. Here's my extensive analysis: ## Bug Analysis **1. Critical Boot
Issue:** The commit fixes a critical boot failure on AM62x systems
during network boot scenarios. The problem manifests as: - Target module
probe returning -517 (EPROBE_DEFER) repeatedly - Network boot timing out
after waiting 100+ seconds - Deferred probe mechanism getting stuck in
minimal configurations **2. Root Cause:** The original commit
4700a00755fb introduced a probe deferral mechanism that: - Uses a global
atomic counter `sysc_defer` initialized to 10 - Forces non-critical
interconnect devices to defer probe until l4_wkup/l4_cfg devices probe
first - In minimal configurations, this can create a deadlock where
deferred devices never get re-probed ## Code Impact Assessment **1.
Minimal and Safe Changes:** The revert removes exactly 47 lines of code:
- `early_bus_ranges[]` array definition - `sysc_defer` atomic counter -
`sysc_defer_non_critical()` function - Call to
`sysc_defer_non_critical()` in `sysc_map_and_check_registers()` **2. No
Architectural Changes:** The revert simply removes a probe ordering
mechanism without touching core functionality. **3. Well-Contained:**
Changes are limited to `drivers/bus/ti-sysc.c` with no impact on other
subsystems. ## Stability Considerations **1. Extensive Testing:** The
commit has been tested on multiple platforms: - GTA04, Panda, BT200
(confirmed by Andreas Kemnade) - AM62x systems (confirmed by original
reporter) **2. Maintainer Approval:** The revert was reviewed and
approved by Tony Lindgren, the original author of the problematic
commit. **3. Alternative Solution Available:** The commit message notes
that stable MMC enumeration (the original goal) can be achieved through
proper `/aliases` node configuration instead. ## Comparison with Similar
Commits Looking at the historical examples: - Similar Commit #1 (Status:
YES) shows that ti-sysc probe ordering fixes are suitable for
backporting - However, this revert fixes a regression introduced by such
changes - The boot failure on AM62x represents a more critical issue
than the original MMC renumbering problem ## Risk Assessment **Low
Risk:** - Removes problematic code rather than adding new functionality
- Well-tested across multiple platforms - Has maintainer blessing -
Addresses a critical boot failure scenario **Benefits:** - Fixes network
boot failures on AM62x - Eliminates potential deadlocks in deferred
probe mechanism - Maintains system stability in minimal configurations
The commit clearly meets stable tree criteria: it fixes an important
bug, has minimal regression risk, is well-contained, and has been
thoroughly tested. The boot failure it addresses affects real-world
deployments, making it a priority for stable kernel inclusion.

drivers/bus/ti-sysc.c | 49 -------------------------------------------
1 file changed, 49 deletions(-)

diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c
index f67b927ae4caa..e5c02e950f2c1 100644
--- a/drivers/bus/ti-sysc.c
+++ b/drivers/bus/ti-sysc.c
@@ -677,51 +677,6 @@ static int sysc_parse_and_check_child_range(struct sysc *ddata)
return 0;
}

-/* Interconnect instances to probe before l4_per instances */
-static struct resource early_bus_ranges[] = {
- /* am3/4 l4_wkup */
- { .start = 0x44c00000, .end = 0x44c00000 + 0x300000, },
- /* omap4/5 and dra7 l4_cfg */
- { .start = 0x4a000000, .end = 0x4a000000 + 0x300000, },
- /* omap4 l4_wkup */
- { .start = 0x4a300000, .end = 0x4a300000 + 0x30000, },
- /* omap5 and dra7 l4_wkup without dra7 dcan segment */
- { .start = 0x4ae00000, .end = 0x4ae00000 + 0x30000, },
-};
-
-static atomic_t sysc_defer = ATOMIC_INIT(10);
-
-/**
- * sysc_defer_non_critical - defer non_critical interconnect probing
- * @ddata: device driver data
- *
- * We want to probe l4_cfg and l4_wkup interconnect instances before any
- * l4_per instances as l4_per instances depend on resources on l4_cfg and
- * l4_wkup interconnects.
- */
-static int sysc_defer_non_critical(struct sysc *ddata)
-{
- struct resource *res;
- int i;
-
- if (!atomic_read(&sysc_defer))
- return 0;
-
- for (i = 0; i < ARRAY_SIZE(early_bus_ranges); i++) {
- res = &early_bus_ranges[i];
- if (ddata->module_pa >= res->start &&
- ddata->module_pa <= res->end) {
- atomic_set(&sysc_defer, 0);
-
- return 0;
- }
- }
-
- atomic_dec_if_positive(&sysc_defer);
-
- return -EPROBE_DEFER;
-}
-
static struct device_node *stdout_path;

static void sysc_init_stdout_path(struct sysc *ddata)
@@ -947,10 +902,6 @@ static int sysc_map_and_check_registers(struct sysc *ddata)
if (error)
return error;

- error = sysc_defer_non_critical(ddata);
- if (error)
- return error;
-
sysc_check_children(ddata);

if (!of_property_present(np, "reg"))
--
2.39.5