[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