On 3/24/26 3:48 AM, Mike Tipton wrote: > On Mon, Jan 19, 2026 at 11:28:07AM +0100, Konrad Dybcio wrote: >> >> >> On 1/19/26 11:20 AM, Konrad Dybcio wrote: >>> On 1/17/26 12:46 PM, Krzysztof Kozlowski wrote: >>>> On Fri, Jan 16, 2026 at 02:17:21PM +0100, Luca Weiss wrote: >>>>> Document an interconnect path for camcc that's required to enable >>>>> the CAMSS_TOP_GDSC power domain. >>>> >>>> I find it confusing. Enabling GDSC power domains is done via power >>>> domains, not via interconnects. Do not represent power domains as >>>> interconnects, it's something completely different. >>> >>> The name of the power domains is CAMSS_TOP_GDSC (seems you misread) >>> >>> For the power domain to successfully turn on, the MNoC needs to be >>> turned on (empirical evidence). The way to do it is to request a >>> nonzero vote on this interconnect path >>> >>> (presumably because the GDSC or its invisible providers require >>> something connected over that bus to carry out their enable sequences). > > The GDSC itself shouldn't depend on MMNOC in order to turn on properly. > It should turn on just fine without it. There *is* a dependency between > CAM_TOP_GDSC and MMNOC, but it's in the opposite direction. > > For MMNOC to turn off properly when all BW votes are removed, the > CAM_TOP_GDSC must already be off. If CAM_TOP_GDSC is still on when MMNOC > starts turning off, then MMNOC will get stuck in its collapse sequence. > MMNOC waits for all HW clients to de-assert their active signals before > it'll allow itself to collapse. Most HW blocks assert this active signal > more dynamically than camera does rather than tying it to GDSC state. > The GDSC asserting active signals to RPMh that prevent NOC collapse is > unique to this particular camera GDSC. > > If MMNOC BW is removed when CAM_TOP_GDSC is still enabled, then it > should reproduce as an icc_set_bw() failure on MMNOC rather than a GDSC > enable failure. The icc_set_bw(0) request would succeed because RPMh > immediately ACKs down requests, but the collapse sequence would get > stuck in the background. Later, when someone calls icc_set_bw() again > with a non-zero BW to enable MMNOC, then that request would fail because > MMNOC is still stuck in the prior collapse sequence. > > Note I haven't explicitly confirmed the Milos behavior, but this has > been the HW dependency for at least several generations of chips now. > I've never seen this GDSC get stuck turning on because MMNOC if off, nor > would I be able to explain offhand why that would happen. But MMNOC > certainly does depend on this GDSC for the reasons stated above.
In case that helps, I believe Luca originally observed that keeping the display on, specifically voting on the: &mmss_noc MASTER_MDP <-> &mc_virt SLAVE_EBI1 path made the GDSC power on successfully, lacking that made the problem come back The nodes that are hit on the way are: qnm_mdp (mmss_noc) qns_mem_noc_hf (mmss_noc) qnm_mnoc_hf (gem_noc) qns_llcc (gem_noc) llcc_mc (mc_virt) ebi (mc_virt) That translates into mmss_noc -> MM0, MM1 gem_noc -> SH0, SH1 mc_virt -> ACV, MC0 Notably, all of the foo_camnoc_bar nodes reside on mmss_noc as well. May it be that voting on them ungates a clock that (perhaps recursively) feeds the GDSC? Because the platform is not suspended, the latter two buses are already online, so I'd assume it's one of the MM BCMs that's causing something I can't see any details about its inputs.. In case that's useful, the GCC driver enables the following camera branches as always-on: GCC_CAMERA_AHB_CLK GCC_CAMERA_HF_XO_CLK GCC_CAMERA_SF_XO_CLK Konrad

