[PATCH 1/2] power-domain: Add support for refcounting (again)

Heiko Schocher hs at denx.de
Fri Apr 25 13:12:57 CEST 2025


Hello Miquel,

Thanks for the fast fix, and sorry, that I did not found the
time to look into faster...

On 25.04.25 08:49, Miquel Raynal wrote:
> It is very surprising that such an uclass, specifically designed to
> handle resources that may be shared by different devices, is not keeping
> the count of the number of times a power domain has been
> enabled/disabled to avoid shutting it down unexpectedly or disabling it
> several times.
> 
> Doing this causes troubles on eg. i.MX8MP because disabling power
> domains can be done in recursive loops were the same power domain
> disabled up to 4 times in a row. PGCs seem to have tight FSM internal
> timings to respect and it is easy to produce a race condition that puts
> the power domains in an unstable state, leading to ADB400 errors and
> later crashes in Linux.
> 
> Some drivers implement their own mechanism for that, but it is probably
> best to add this feature in the uclass and share the common code across
> drivers. In order to avoid breaking existing drivers, refcounting is
> only enabled if the number of subdomains a device node supports is
> explicitly set in the probe function. ->xlate() callbacks will return
> the power domain ID which is then being used as the array index to reach
> the correct refcounter.
> 
> As we do not want to break existing users while stile getting
> interesting error codes, the implementation is split between:
> - a low-level helper reporting error codes if the requested transition
>    could not be operated,
> - a higher-level helper ignoring the "non error" codes, like EALREADY and
>    EBUSY.
> 
> CI tests using power domains are slightly updated to make sure the count
> of on/off calls is even and the results match what we *now* expect. They
> are also extended to test the low-level functions.
> 
> Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>
> ---
>   arch/sandbox/include/asm/power-domain.h          |  2 +
>   drivers/firmware/scmi/sandbox-scmi_devices.c     |  1 +
>   drivers/power/domain/power-domain-uclass.c       | 90 ++++++++++++++++++++++--
>   drivers/power/domain/sandbox-power-domain-test.c | 15 ++++
>   drivers/power/domain/sandbox-power-domain.c      |  4 ++
>   include/power-domain.h                           | 69 +++++++++++++++---
>   test/dm/power-domain.c                           | 11 ++-
>   7 files changed, 177 insertions(+), 15 deletions(-)

after reverting locally commit "197376fbf300e92afa0a1583815d9c9eb52d613a."
and applying this patch and patch 2/2 of this series, "pci enum"
works again on imx8mp based board:

u-boot=> pci enum
PCIE-0: Link up (Gen1-x1, Bus0)
u-boot=> print update_ub_emmc
update_ub_emmc=run prepemmc loadub updub cmpub
u-boot=> run loadub
e1000: 00:30:d6:39:7a:c1
        e1000: 00:30:d6:39:7a:c2
        Using e1000#1 device
TFTP from server 192.168.3.1; our IP address is 192.168.3.51
Filename 'lec/20250327/flash.bin.4g'.
Load address: 0x50000000
Loading: ##################################################  2 MiB
          354.5 KiB/s
done
Bytes transferred = 2097152 (200000 hex)
u-boot=>

Thanks!

Reviewed-by: Heiko Schocher <hs at denx.de>
Tested-by: Heiko Schocher <hs at denx.de>

bye,
Heiko
-- 
DENX Software Engineering GmbH,      Managing Director: Erika Unter
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-52   Fax: +49-8142-66989-80   Email: hs at denx.de


More information about the U-Boot mailing list