diff mbox series

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

Message ID 20201105174434.1817539-13-l.stach@pengutronix.de
State New
Headers show
Series i.MX8MM power domain support | expand

Commit Message

Lucas Stach Nov. 5, 2020, 5:44 p.m. UTC
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@pengutronix.de>
---
 arch/arm64/boot/dts/freescale/imx8mm.dtsi | 58 +++++++++++++++++++++++
 1 file changed, 58 insertions(+)

Comments

Frieder Schrempf Dec. 9, 2020, 3:26 p.m. UTC | #1
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@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@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@0 {

> +						#power-domain-cells = <0>;

> +						reg = <IMX8MM_POWER_DOMAIN_HSIOMIX>;

> +						clocks = <&clk IMX8MM_CLK_USB_BUS>;

> +					};

> +

> +					pgc_pcie: power-domain@1 {

> +						#power-domain-cells = <0>;

> +						reg = <IMX8MM_POWER_DOMAIN_PCIE>;

> +						power-domains = <&pgc_hsiomix>;

> +					};

> +

> +					pgc_otg1: power-domain@2 {

> +						#power-domain-cells = <0>;

> +						reg = <IMX8MM_POWER_DOMAIN_OTG1>;

> +						power-domains = <&pgc_hsiomix>;

> +					};

> +

> +					pgc_otg2: power-domain@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)

Any ideas?

Thanks
Frieder

> +

> +					pgc_gpumix: power-domain@4 {

> +						#power-domain-cells = <0>;

> +						reg = <IMX8MM_POWER_DOMAIN_GPUMIX>;

> +						clocks = <&clk IMX8MM_CLK_GPU_BUS_ROOT>,

> +						         <&clk IMX8MM_CLK_GPU_AHB>;

> +					};

> +

> +					pgc_gpu: power-domain@5 {

> +						#power-domain-cells = <0>;

> +						reg = <IMX8MM_POWER_DOMAIN_GPU>;

> +						clocks = <&clk IMX8MM_CLK_GPU_AHB>,

> +						         <&clk IMX8MM_CLK_GPU_BUS_ROOT>,

> +						         <&clk IMX8MM_CLK_GPU2D_ROOT>,

> +						         <&clk IMX8MM_CLK_GPU3D_ROOT>;

> +						resets = <&src IMX8MQ_RESET_GPU_RESET>;

> +						power-domains = <&pgc_gpumix>;

> +					};

> +				};

> +			};

>   		};

>   

>   		aips2: bus@30400000 {

>
diff mbox series

Patch

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@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@0 {
+						#power-domain-cells = <0>;
+						reg = <IMX8MM_POWER_DOMAIN_HSIOMIX>;
+						clocks = <&clk IMX8MM_CLK_USB_BUS>;
+					};
+
+					pgc_pcie: power-domain@1 {
+						#power-domain-cells = <0>;
+						reg = <IMX8MM_POWER_DOMAIN_PCIE>;
+						power-domains = <&pgc_hsiomix>;
+					};
+
+					pgc_otg1: power-domain@2 {
+						#power-domain-cells = <0>;
+						reg = <IMX8MM_POWER_DOMAIN_OTG1>;
+						power-domains = <&pgc_hsiomix>;
+					};
+
+					pgc_otg2: power-domain@3 {
+						#power-domain-cells = <0>;
+						reg = <IMX8MM_POWER_DOMAIN_OTG2>;
+						power-domains = <&pgc_hsiomix>;
+					};
+
+					pgc_gpumix: power-domain@4 {
+						#power-domain-cells = <0>;
+						reg = <IMX8MM_POWER_DOMAIN_GPUMIX>;
+						clocks = <&clk IMX8MM_CLK_GPU_BUS_ROOT>,
+						         <&clk IMX8MM_CLK_GPU_AHB>;
+					};
+
+					pgc_gpu: power-domain@5 {
+						#power-domain-cells = <0>;
+						reg = <IMX8MM_POWER_DOMAIN_GPU>;
+						clocks = <&clk IMX8MM_CLK_GPU_AHB>,
+						         <&clk IMX8MM_CLK_GPU_BUS_ROOT>,
+						         <&clk IMX8MM_CLK_GPU2D_ROOT>,
+						         <&clk IMX8MM_CLK_GPU3D_ROOT>;
+						resets = <&src IMX8MQ_RESET_GPU_RESET>;
+						power-domains = <&pgc_gpumix>;
+					};
+				};
+			};
 		};
 
 		aips2: bus@30400000 {