[PATCH v2 12/13] arm64: dts: imx8mm: add GPC node and power domains

Frieder Schrempf frieder.schrempf at kontron.de
Thu Jan 14 05:39:46 EST 2021


On 09.12.20 16:26, Frieder Schrempf wrote:
> Hi Lucas,
> 
> On 05.11.20 18:44, Lucas Stach wrote:
>> This adds the DT nodes to describe the power domains available on the
>> i.MX8MM. Things are a bit more complex compared to other GPCv2 power
>> domain setups, as there is now a hierarchy of domains where complete
>> subsystems (HSIO, GPU, DISPLAY) can be gated as a whole, but also
>> fine granular gating within those subsystems is possible.
>>
>> Note that this is still incomplete, as both VPU and DISP domains are
>> missing their reset clocks. Those aren't directly sourced from the CCM,
>> but have another level of clock gating in the BLKCTL of those domains,
>> which needs a separate driver.
>>
>> Signed-off-by: Lucas Stach <l.stach at pengutronix.de>
>> ---
>>   arch/arm64/boot/dts/freescale/imx8mm.dtsi | 58 +++++++++++++++++++++++
>>   1 file changed, 58 insertions(+)
>>
>> diff --git a/arch/arm64/boot/dts/freescale/imx8mm.dtsi 
>> b/arch/arm64/boot/dts/freescale/imx8mm.dtsi
>> index b83f400def8b..c21901a8aea9 100644
>> --- a/arch/arm64/boot/dts/freescale/imx8mm.dtsi
>> +++ b/arch/arm64/boot/dts/freescale/imx8mm.dtsi
>> @@ -4,6 +4,8 @@
>>    */
>>   #include <dt-bindings/clock/imx8mm-clock.h>
>> +#include <dt-bindings/power/imx8mm-power.h>
>> +#include <dt-bindings/reset/imx8mq-reset.h>
>>   #include <dt-bindings/gpio/gpio.h>
>>   #include <dt-bindings/input/input.h>
>>   #include <dt-bindings/interrupt-controller/arm-gic.h>
>> @@ -547,6 +549,62 @@
>>                   interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
>>                   #reset-cells = <1>;
>>               };
>> +
>> +            gpc: gpc at 303a0000 {
>> +                compatible = "fsl,imx8mm-gpc";
>> +                reg = <0x303a0000 0x10000>;
>> +                interrupts = <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>;
>> +                interrupt-parent = <&gic>;
>> +                interrupt-controller;
>> +                #interrupt-cells = <3>;
>> +
>> +                pgc {
>> +                    #address-cells = <1>;
>> +                    #size-cells = <0>;
>> +
>> +                    pgc_hsiomix: power-domain at 0 {
>> +                        #power-domain-cells = <0>;
>> +                        reg = <IMX8MM_POWER_DOMAIN_HSIOMIX>;
>> +                        clocks = <&clk IMX8MM_CLK_USB_BUS>;
>> +                    };
>> +
>> +                    pgc_pcie: power-domain at 1 {
>> +                        #power-domain-cells = <0>;
>> +                        reg = <IMX8MM_POWER_DOMAIN_PCIE>;
>> +                        power-domains = <&pgc_hsiomix>;
>> +                    };
>> +
>> +                    pgc_otg1: power-domain at 2 {
>> +                        #power-domain-cells = <0>;
>> +                        reg = <IMX8MM_POWER_DOMAIN_OTG1>;
>> +                        power-domains = <&pgc_hsiomix>;
>> +                    };
>> +
>> +                    pgc_otg2: power-domain at 3 {
>> +                        #power-domain-cells = <0>;
>> +                        reg = <IMX8MM_POWER_DOMAIN_OTG2>;
>> +                        power-domains = <&pgc_hsiomix>;
>> +                    };
> 
> I'm currently doing some testing on top of v5.10-rc with GPC, BLK-CTL, 
> DSIM, etc. I noticed that as soon as I add the nodes above for HSIO/OTG 
> (even without referencing them elsewhere) my system freezes on 
> suspend/resume.
> 
> The same problem exists when I remove the power domains for HSIO/USB and 
> add the ones for DISPMIX and DSI to test Marek's work on BLK-CTL.
> 
> I'm not really sure at what point exactly the system freezes but this is 
> what I see (no_console_suspend is set) and the system does not wake up 
> anymore:
> 
> echo mem > /sys/power/state
> [   13.888711] PM: suspend entry (deep)
> [   13.892429] Filesystems sync: 0.000 seconds
> [   13.907231] Freezing user space processes ... (elapsed 0.031 seconds) 
> done.
> [   13.945407] OOM killer disabled.
> [   13.948642] Freezing remaining freezable tasks ... (elapsed 0.001 
> seconds) done.
> [   13.957216] printk: Suspending console(s) (use no_console_suspend to 
> debug)

It seems like I failed to set no_console_suspend correctly. Here is a 
proper log with kernel 5.10.6. The system wakes up, but stalls.

Can you reproduce this on your system?

# echo mem > /sys/power/state
[ 1033.094465] PM: suspend entry (deep)
[ 1033.098195] Filesystems sync: 0.000 seconds
[ 1033.104327] Freezing user space processes ... (elapsed 0.005 seconds) 
done.
[ 1033.117406] OOM killer disabled.
[ 1033.120713] Freezing remaining freezable tasks ... (elapsed 0.001 
seconds) done.
[ 1033.207420] smsc95xx 1-1.1:1.0 eth1: entering SUSPEND2 mode
[ 1033.365054] Disabling non-boot CPUs ...
[ 1033.369460] CPU1: shutdown
[ 1033.372198] psci: CPU1 killed (polled 0 ms)
[ 1033.377338] CPU2: shutdown
[ 1033.380077] psci: CPU2 killed (polled 0 ms)
[ 1033.385079] CPU3: shutdown
[ 1033.387830] psci: CPU3 killed (polled 0 ms)
[ 1033.392617] Enabling non-boot CPUs ...
[ 1033.396924] Detected VIPT I-cache on CPU1
[ 1033.396952] GICv3: CPU1: found redistributor 1 region 
0:0x00000000388a0000
[ 1033.397004] CPU1: Booted secondary processor 0x0000000001 [0x410fd034]
[ 1033.397474] CPU1 is up
[ 1033.417628] Detected VIPT I-cache on CPU2
[ 1033.417645] GICv3: CPU2: found redistributor 2 region 
0:0x00000000388c0000
[ 1033.417671] CPU2: Booted secondary processor 0x0000000002 [0x410fd034]
[ 1033.417987] CPU2 is up
[ 1033.438139] Detected VIPT I-cache on CPU3
[ 1033.438155] GICv3: CPU3: found redistributor 3 region 
0:0x00000000388e0000
[ 1033.438183] CPU3: Booted secondary processor 0x0000000003 [0x410fd034]
[ 1033.438507] CPU3 is up
[ 1054.474194] rcu: INFO: rcu_preempt detected stalls on CPUs/tasks:
[ 1054.480311] rcu:     0-...0: (1 GPs behind) 
idle=732/1/0x4000000000000000 softirq=85335/85336 fqs=2029
[ 1054.489447]  (detected by 3, t=5255 jiffies, g=188005, q=6)



More information about the linux-arm-kernel mailing list