All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Ungerer <gerg@kernel.org>
To: Marco Felsch <m.felsch@pengutronix.de>
Cc: peng.fan@nxp.com,
	Alexander Stein <alexander.stein@ew.tq-group.com>,
	abailon@baylibre.com, krzysztof.kozlowski+dt@linaro.org,
	festevam@gmail.com, abelvesa@kernel.org, marex@denx.de,
	Markus.Niebel@ew.tq-group.com,
	Ahmad Fatoum <a.fatoum@pengutronix.de>,
	paul.elder@ideasonboard.com, linux-imx@nxp.com,
	devicetree@vger.kernel.org,
	"Peng Fan (OSS)" <peng.fan@oss.nxp.com>,
	linux-pm@vger.kernel.org, s.hauer@pengutronix.de,
	robh+dt@kernel.org, aford173@gmail.com,
	"linux-arm-kernel@lists.infradead.org" 
	<linux-arm-kernel@lists.infradead.org>,
	laurent.pinchart@ideasonboard.com, linux-kernel@vger.kernel.org,
	kernel@pengutronix.de, djakov@kernel.org, shawnguo@kernel.org,
	l.stach@pengutronix.de
Subject: Re: [PATCH V3 7/7] arm64: dts: imx8mp: add interconnect for hsio blk ctrl
Date: Fri, 31 Mar 2023 15:55:20 +1000	[thread overview]
Message-ID: <792028b9-cd4c-4ff4-a7cb-e60c518aa573@kernel.org> (raw)
In-Reply-To: <20230328151100.msl46qupstwplkgw@pengutronix.de>

[-- Attachment #1: Type: text/plain, Size: 1110 bytes --]

Hi Marco,

On 29/3/23 01:11, Marco Felsch wrote:
> Hi Greg,
> 
> On 23-03-29, Greg Ungerer wrote:
>> Hi Marco,
> 
> ...
> 
>>> I forgot to ask: Does your i.MX8MP have a VPU? There are i.MX8MP devices
>>> (don't know the name) which don't have support for certain IPs. If this
>>
>> The hardware platform I have is using the MIMX8ML4CVNKZAB "i.MX 8M Plus QuadLite"
>> (https://www.nxp.com/part/MIMX8ML4CVNKZAB#/) which does not have the hardware
>> video encode/decoder module (like the "i.MX 8M Plus Quad" parts).
> 
> and that's the problem :) You need to update your bootloader to a
> version which support disabling the VPU nodes else you will always see
> the errors.

I agree this is the problem, I don't agree that the boot loader is the
only place to fix this :-)  I should be able to generate a working devicetree
blob from the kernel that is good, and ready to use no runtime changes
required I figure.

It is not overly difficult to break out the vpu nodes and have them
only included when you have a board that has the iMX8MP-quad with the
VPU hardware blocks.

Example patch attached.

Regards
Greg

[-- Attachment #2: 0001-arm64-dts-imx8mp-separate-out-VPU-nodes.patch --]
[-- Type: text/x-patch, Size: 11867 bytes --]

From c2e6af08d090216aae8c9f992a9e64014147be9f Mon Sep 17 00:00:00 2001
From: Greg Ungerer <gerg@linux-m68k.org>
Date: Fri, 31 Mar 2023 15:47:55 +1000
Subject: [PATCH] arm64: dts: imx8mp: separate out VPU nodes

The VPU hardware module is not included in all variants of the imx8mp SoC.
It will cause errors trying to initialize when not present:

    imx-pgc imx-pgc-domain.8: failed to command PGC

Break out the VPU nodes into a new dtsi file so that only platforms
that need them include them. Platforms with the "lite" version of
the imx8mp don't need to include it.

Signed-off-by: Greg Ungerer <gerg@kernel.org>
---
 .../boot/dts/freescale/imx8mp-beacon-kit.dts  |  1 +
 .../dts/freescale/imx8mp-debix-model-a.dts    |  1 +
 .../boot/dts/freescale/imx8mp-dhcom-som.dtsi  |  1 +
 arch/arm64/boot/dts/freescale/imx8mp-evk.dts  |  1 +
 .../freescale/imx8mp-icore-mx8mp-edimm2.2.dts |  1 +
 .../boot/dts/freescale/imx8mp-msc-sm2s.dtsi   |  1 +
 .../dts/freescale/imx8mp-phycore-som.dtsi     |  1 +
 .../boot/dts/freescale/imx8mp-tqma8mpql.dtsi  |  1 +
 .../dts/freescale/imx8mp-venice-gw74xx.dts    |  1 +
 .../boot/dts/freescale/imx8mp-verdin.dtsi     |  1 +
 arch/arm64/boot/dts/freescale/imx8mp-vpu.dtsi | 80 +++++++++++++++++++
 arch/arm64/boot/dts/freescale/imx8mp.dtsi     | 77 ------------------
 12 files changed, 90 insertions(+), 77 deletions(-)
 create mode 100644 arch/arm64/boot/dts/freescale/imx8mp-vpu.dtsi

diff --git a/arch/arm64/boot/dts/freescale/imx8mp-beacon-kit.dts b/arch/arm64/boot/dts/freescale/imx8mp-beacon-kit.dts
index cdae45a48c2c..a8dde370476f 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-beacon-kit.dts
+++ b/arch/arm64/boot/dts/freescale/imx8mp-beacon-kit.dts
@@ -8,6 +8,7 @@
 #include <dt-bindings/usb/pd.h>
 #include <dt-bindings/phy/phy-imx8-pcie.h>
 #include "imx8mp.dtsi"
+#include "imx8mp-vpu.dtsi"
 #include "imx8mp-beacon-som.dtsi"
 
 / {
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-debix-model-a.dts b/arch/arm64/boot/dts/freescale/imx8mp-debix-model-a.dts
index 2876d18f2a38..19b780594957 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-debix-model-a.dts
+++ b/arch/arm64/boot/dts/freescale/imx8mp-debix-model-a.dts
@@ -11,6 +11,7 @@
 #include <dt-bindings/usb/pd.h>
 
 #include "imx8mp.dtsi"
+#include "imx8mp-vpu.dtsi"
 
 / {
 	model = "Polyhex Debix Model A i.MX8MPlus board";
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-dhcom-som.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-dhcom-som.dtsi
index 9cdd4234c4ca..7383222f628a 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-dhcom-som.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mp-dhcom-som.dtsi
@@ -4,6 +4,7 @@
  */
 
 #include "imx8mp.dtsi"
+#include "imx8mp-vpu.dtsi"
 
 / {
 	model = "DH electronics i.MX8M Plus DHCOM SoM";
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-evk.dts b/arch/arm64/boot/dts/freescale/imx8mp-evk.dts
index 7816853162b3..5a146e7fa9d2 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-evk.dts
+++ b/arch/arm64/boot/dts/freescale/imx8mp-evk.dts
@@ -7,6 +7,7 @@
 
 #include <dt-bindings/phy/phy-imx8-pcie.h>
 #include "imx8mp.dtsi"
+#include "imx8mp-vpu.dtsi"
 
 / {
 	model = "NXP i.MX8MPlus EVK board";
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-icore-mx8mp-edimm2.2.dts b/arch/arm64/boot/dts/freescale/imx8mp-icore-mx8mp-edimm2.2.dts
index a02b31c42db4..d7a621938720 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-icore-mx8mp-edimm2.2.dts
+++ b/arch/arm64/boot/dts/freescale/imx8mp-icore-mx8mp-edimm2.2.dts
@@ -8,6 +8,7 @@
 /dts-v1/;
 
 #include "imx8mp.dtsi"
+#include "imx8mp-vpu.dtsi"
 #include "imx8mp-icore-mx8mp.dtsi"
 #include <dt-bindings/usb/pd.h>
 
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-msc-sm2s.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-msc-sm2s.dtsi
index 5dbec71747c3..1d3bb17ac92a 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-msc-sm2s.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mp-msc-sm2s.dtsi
@@ -6,6 +6,7 @@
 /dts-v1/;
 
 #include "imx8mp.dtsi"
+#include "imx8mp-vpu.dtsi"
 #include <dt-bindings/net/ti-dp83867.h>
 
 / {
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-phycore-som.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-phycore-som.dtsi
index ecc4bce6db97..12ed5402a4b4 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-phycore-som.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mp-phycore-som.dtsi
@@ -6,6 +6,7 @@
 
 #include <dt-bindings/net/ti-dp83867.h>
 #include "imx8mp.dtsi"
+#include "imx8mp-vpu.dtsi"
 
 / {
 	model = "PHYTEC phyCORE-i.MX8MP";
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql.dtsi
index ebc29a950ba9..e3db32505d0b 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql.dtsi
@@ -5,6 +5,7 @@
  */
 
 #include "imx8mp.dtsi"
+#include "imx8mp-vpu.dtsi"
 
 / {
 	model = "TQ-Systems i.MX8MPlus TQMa8MPxL";
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-venice-gw74xx.dts b/arch/arm64/boot/dts/freescale/imx8mp-venice-gw74xx.dts
index eb51d648359b..c4552da30789 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-venice-gw74xx.dts
+++ b/arch/arm64/boot/dts/freescale/imx8mp-venice-gw74xx.dts
@@ -11,6 +11,7 @@
 #include <dt-bindings/phy/phy-imx8-pcie.h>
 
 #include "imx8mp.dtsi"
+#include "imx8mp-vpu.dtsi"
 
 / {
 	model = "Gateworks Venice GW74xx i.MX8MP board";
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi
index 0dd6180a8e39..100b3ea2bd4d 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi
@@ -6,6 +6,7 @@
 #include <dt-bindings/phy/phy-imx8-pcie.h>
 #include <dt-bindings/pwm/pwm.h>
 #include "imx8mp.dtsi"
+#include "imx8mp-vpu.dtsi"
 
 / {
 	chosen {
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-vpu.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-vpu.dtsi
new file mode 100644
index 000000000000..3ca1bdf6262c
--- /dev/null
+++ b/arch/arm64/boot/dts/freescale/imx8mp-vpu.dtsi
@@ -0,0 +1,80 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright 2019 NXP
+ */
+
+&gpc {
+	pgc {
+		pgc_vpumix: power-domain@19 {
+			#power-domain-cells = <0>;
+			reg = <IMX8MP_POWER_DOMAIN_VPUMIX>;
+			clocks =<&clk IMX8MP_CLK_VPU_ROOT>;
+		};
+
+		pgc_vpu_g1: power-domain@20 {
+			#power-domain-cells = <0>;
+			power-domains = <&pgc_vpumix>;
+			reg = <IMX8MP_POWER_DOMAIN_VPU_G1>;
+			clocks = <&clk IMX8MP_CLK_VPU_G1_ROOT>;
+		};
+
+		pgc_vpu_g2: power-domain@21 {
+			#power-domain-cells = <0>;
+			power-domains = <&pgc_vpumix>;
+			reg = <IMX8MP_POWER_DOMAIN_VPU_G2>;
+			clocks = <&clk IMX8MP_CLK_VPU_G2_ROOT>;
+		};
+
+		pgc_vpu_vc8000e: power-domain@22 {
+			#power-domain-cells = <0>;
+			power-domains = <&pgc_vpumix>;
+			reg = <IMX8MP_POWER_DOMAIN_VPU_VC8000E>;
+			clocks = <&clk IMX8MP_CLK_VPU_VC8KE_ROOT>;
+		};
+	};
+};
+
+&soc {
+	vpu_g1: video-codec@38300000 {
+		compatible = "nxp,imx8mm-vpu-g1";
+		reg = <0x38300000 0x10000>;
+		interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&clk IMX8MP_CLK_VPU_G1_ROOT>;
+		assigned-clocks = <&clk IMX8MP_CLK_VPU_G1>;
+		assigned-clock-parents = <&clk IMX8MP_VPU_PLL_OUT>;
+		assigned-clock-rates = <600000000>;
+		power-domains = <&vpumix_blk_ctrl IMX8MP_VPUBLK_PD_G1>;
+	};
+
+	vpu_g2: video-codec@38310000 {
+		compatible = "nxp,imx8mq-vpu-g2";
+		reg = <0x38310000 0x10000>;
+		interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&clk IMX8MP_CLK_VPU_G2_ROOT>;
+		assigned-clocks = <&clk IMX8MP_CLK_VPU_G2>;
+		assigned-clock-parents = <&clk IMX8MP_SYS_PLL2_1000M>;
+		assigned-clock-rates = <500000000>;
+		power-domains = <&vpumix_blk_ctrl IMX8MP_VPUBLK_PD_G2>;
+	};
+
+	vpumix_blk_ctrl: blk-ctrl@38330000 {
+		compatible = "fsl,imx8mp-vpu-blk-ctrl", "syscon";
+		reg = <0x38330000 0x100>;
+		#power-domain-cells = <1>;
+		power-domains = <&pgc_vpumix>, <&pgc_vpu_g1>,
+				<&pgc_vpu_g2>, <&pgc_vpu_vc8000e>;
+		power-domain-names = "bus", "g1", "g2", "vc8000e";
+		clocks = <&clk IMX8MP_CLK_VPU_G1_ROOT>,
+			 <&clk IMX8MP_CLK_VPU_G2_ROOT>,
+			 <&clk IMX8MP_CLK_VPU_VC8KE_ROOT>;
+		clock-names = "g1", "g2", "vc8000e";
+		assigned-clocks = <&clk IMX8MP_CLK_VPU_BUS>, <&clk IMX8MP_VPU_PLL>;
+		assigned-clock-parents = <&clk IMX8MP_VPU_PLL_OUT>;
+		assigned-clock-rates = <600000000>, <600000000>;
+		interconnects = <&noc IMX8MP_ICM_VPU_G1 &noc IMX8MP_ICN_VIDEO>,
+				<&noc IMX8MP_ICM_VPU_G2 &noc IMX8MP_ICN_VIDEO>,
+				<&noc IMX8MP_ICM_VPU_H1 &noc IMX8MP_ICN_VIDEO>;
+		interconnect-names = "g1", "g2", "vc8000e";
+	};
+};
+
diff --git a/arch/arm64/boot/dts/freescale/imx8mp.dtsi b/arch/arm64/boot/dts/freescale/imx8mp.dtsi
index 2dd60e3252f3..e35409db3240 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mp.dtsi
@@ -625,41 +625,6 @@ pgc_ispdwp: power-domain@18 {
 						reg = <IMX8MP_POWER_DOMAIN_MEDIAMIX_ISPDWP>;
 						clocks = <&clk IMX8MP_CLK_MEDIA_ISP_ROOT>;
 					};
-
-					pgc_vpumix: power-domain@19 {
-						#power-domain-cells = <0>;
-						reg = <IMX8MP_POWER_DOMAIN_VPUMIX>;
-						clocks =<&clk IMX8MP_CLK_VPU_ROOT>;
-					};
-
-					pgc_vpu_g1: power-domain@20 {
-						#power-domain-cells = <0>;
-						power-domains = <&pgc_vpumix>;
-						reg = <IMX8MP_POWER_DOMAIN_VPU_G1>;
-						clocks = <&clk IMX8MP_CLK_VPU_G1_ROOT>;
-					};
-
-					pgc_vpu_g2: power-domain@21 {
-						#power-domain-cells = <0>;
-						power-domains = <&pgc_vpumix>;
-						reg = <IMX8MP_POWER_DOMAIN_VPU_G2>;
-						clocks = <&clk IMX8MP_CLK_VPU_G2_ROOT>;
-					};
-
-					pgc_vpu_vc8000e: power-domain@22 {
-						#power-domain-cells = <0>;
-						power-domains = <&pgc_vpumix>;
-						reg = <IMX8MP_POWER_DOMAIN_VPU_VC8000E>;
-						clocks = <&clk IMX8MP_CLK_VPU_VC8KE_ROOT>;
-					};
-
-					pgc_mlmix: power-domain@24 {
-						#power-domain-cells = <0>;
-						reg = <IMX8MP_POWER_DOMAIN_MLMIX>;
-						clocks = <&clk IMX8MP_CLK_ML_AXI>,
-							 <&clk IMX8MP_CLK_ML_AHB>,
-							 <&clk IMX8MP_CLK_NPU_ROOT>;
-					};
 				};
 			};
 		};
@@ -1340,48 +1305,6 @@ gpu2d: gpu@38008000 {
 			power-domains = <&pgc_gpu2d>;
 		};
 
-		vpu_g1: video-codec@38300000 {
-			compatible = "nxp,imx8mm-vpu-g1";
-			reg = <0x38300000 0x10000>;
-			interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
-			clocks = <&clk IMX8MP_CLK_VPU_G1_ROOT>;
-			assigned-clocks = <&clk IMX8MP_CLK_VPU_G1>;
-			assigned-clock-parents = <&clk IMX8MP_VPU_PLL_OUT>;
-			assigned-clock-rates = <600000000>;
-			power-domains = <&vpumix_blk_ctrl IMX8MP_VPUBLK_PD_G1>;
-		};
-
-		vpu_g2: video-codec@38310000 {
-			compatible = "nxp,imx8mq-vpu-g2";
-			reg = <0x38310000 0x10000>;
-			interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
-			clocks = <&clk IMX8MP_CLK_VPU_G2_ROOT>;
-			assigned-clocks = <&clk IMX8MP_CLK_VPU_G2>;
-			assigned-clock-parents = <&clk IMX8MP_SYS_PLL2_1000M>;
-			assigned-clock-rates = <500000000>;
-			power-domains = <&vpumix_blk_ctrl IMX8MP_VPUBLK_PD_G2>;
-		};
-
-		vpumix_blk_ctrl: blk-ctrl@38330000 {
-			compatible = "fsl,imx8mp-vpu-blk-ctrl", "syscon";
-			reg = <0x38330000 0x100>;
-			#power-domain-cells = <1>;
-			power-domains = <&pgc_vpumix>, <&pgc_vpu_g1>,
-					<&pgc_vpu_g2>, <&pgc_vpu_vc8000e>;
-			power-domain-names = "bus", "g1", "g2", "vc8000e";
-			clocks = <&clk IMX8MP_CLK_VPU_G1_ROOT>,
-				 <&clk IMX8MP_CLK_VPU_G2_ROOT>,
-				 <&clk IMX8MP_CLK_VPU_VC8KE_ROOT>;
-			clock-names = "g1", "g2", "vc8000e";
-			assigned-clocks = <&clk IMX8MP_CLK_VPU_BUS>, <&clk IMX8MP_VPU_PLL>;
-			assigned-clock-parents = <&clk IMX8MP_VPU_PLL_OUT>;
-			assigned-clock-rates = <600000000>, <600000000>;
-			interconnects = <&noc IMX8MP_ICM_VPU_G1 &noc IMX8MP_ICN_VIDEO>,
-					<&noc IMX8MP_ICM_VPU_G2 &noc IMX8MP_ICN_VIDEO>,
-					<&noc IMX8MP_ICM_VPU_H1 &noc IMX8MP_ICN_VIDEO>;
-			interconnect-names = "g1", "g2", "vc8000e";
-		};
-
 		gic: interrupt-controller@38800000 {
 			compatible = "arm,gic-v3";
 			reg = <0x38800000 0x10000>,
-- 
2.25.1


WARNING: multiple messages have this Message-ID (diff)
From: Greg Ungerer <gerg@kernel.org>
To: Marco Felsch <m.felsch@pengutronix.de>
Cc: peng.fan@nxp.com,
	Alexander Stein <alexander.stein@ew.tq-group.com>,
	abailon@baylibre.com, krzysztof.kozlowski+dt@linaro.org,
	festevam@gmail.com, abelvesa@kernel.org, marex@denx.de,
	Markus.Niebel@ew.tq-group.com,
	Ahmad Fatoum <a.fatoum@pengutronix.de>,
	paul.elder@ideasonboard.com, linux-imx@nxp.com,
	devicetree@vger.kernel.org,
	"Peng Fan (OSS)" <peng.fan@oss.nxp.com>,
	linux-pm@vger.kernel.org, s.hauer@pengutronix.de,
	robh+dt@kernel.org, aford173@gmail.com,
	"linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	laurent.pinchart@ideasonboard.com, linux-kernel@vger.kernel.org,
	kernel@pengutronix.de, djakov@kernel.org, shawnguo@kernel.org,
	l.stach@pengutronix.de
Subject: Re: [PATCH V3 7/7] arm64: dts: imx8mp: add interconnect for hsio blk ctrl
Date: Fri, 31 Mar 2023 15:55:20 +1000	[thread overview]
Message-ID: <792028b9-cd4c-4ff4-a7cb-e60c518aa573@kernel.org> (raw)
In-Reply-To: <20230328151100.msl46qupstwplkgw@pengutronix.de>

[-- Attachment #1: Type: text/plain, Size: 1110 bytes --]

Hi Marco,

On 29/3/23 01:11, Marco Felsch wrote:
> Hi Greg,
> 
> On 23-03-29, Greg Ungerer wrote:
>> Hi Marco,
> 
> ...
> 
>>> I forgot to ask: Does your i.MX8MP have a VPU? There are i.MX8MP devices
>>> (don't know the name) which don't have support for certain IPs. If this
>>
>> The hardware platform I have is using the MIMX8ML4CVNKZAB "i.MX 8M Plus QuadLite"
>> (https://www.nxp.com/part/MIMX8ML4CVNKZAB#/) which does not have the hardware
>> video encode/decoder module (like the "i.MX 8M Plus Quad" parts).
> 
> and that's the problem :) You need to update your bootloader to a
> version which support disabling the VPU nodes else you will always see
> the errors.

I agree this is the problem, I don't agree that the boot loader is the
only place to fix this :-)  I should be able to generate a working devicetree
blob from the kernel that is good, and ready to use no runtime changes
required I figure.

It is not overly difficult to break out the vpu nodes and have them
only included when you have a board that has the iMX8MP-quad with the
VPU hardware blocks.

Example patch attached.

Regards
Greg

[-- Attachment #2: 0001-arm64-dts-imx8mp-separate-out-VPU-nodes.patch --]
[-- Type: text/x-patch, Size: 11867 bytes --]

From c2e6af08d090216aae8c9f992a9e64014147be9f Mon Sep 17 00:00:00 2001
From: Greg Ungerer <gerg@linux-m68k.org>
Date: Fri, 31 Mar 2023 15:47:55 +1000
Subject: [PATCH] arm64: dts: imx8mp: separate out VPU nodes

The VPU hardware module is not included in all variants of the imx8mp SoC.
It will cause errors trying to initialize when not present:

    imx-pgc imx-pgc-domain.8: failed to command PGC

Break out the VPU nodes into a new dtsi file so that only platforms
that need them include them. Platforms with the "lite" version of
the imx8mp don't need to include it.

Signed-off-by: Greg Ungerer <gerg@kernel.org>
---
 .../boot/dts/freescale/imx8mp-beacon-kit.dts  |  1 +
 .../dts/freescale/imx8mp-debix-model-a.dts    |  1 +
 .../boot/dts/freescale/imx8mp-dhcom-som.dtsi  |  1 +
 arch/arm64/boot/dts/freescale/imx8mp-evk.dts  |  1 +
 .../freescale/imx8mp-icore-mx8mp-edimm2.2.dts |  1 +
 .../boot/dts/freescale/imx8mp-msc-sm2s.dtsi   |  1 +
 .../dts/freescale/imx8mp-phycore-som.dtsi     |  1 +
 .../boot/dts/freescale/imx8mp-tqma8mpql.dtsi  |  1 +
 .../dts/freescale/imx8mp-venice-gw74xx.dts    |  1 +
 .../boot/dts/freescale/imx8mp-verdin.dtsi     |  1 +
 arch/arm64/boot/dts/freescale/imx8mp-vpu.dtsi | 80 +++++++++++++++++++
 arch/arm64/boot/dts/freescale/imx8mp.dtsi     | 77 ------------------
 12 files changed, 90 insertions(+), 77 deletions(-)
 create mode 100644 arch/arm64/boot/dts/freescale/imx8mp-vpu.dtsi

diff --git a/arch/arm64/boot/dts/freescale/imx8mp-beacon-kit.dts b/arch/arm64/boot/dts/freescale/imx8mp-beacon-kit.dts
index cdae45a48c2c..a8dde370476f 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-beacon-kit.dts
+++ b/arch/arm64/boot/dts/freescale/imx8mp-beacon-kit.dts
@@ -8,6 +8,7 @@
 #include <dt-bindings/usb/pd.h>
 #include <dt-bindings/phy/phy-imx8-pcie.h>
 #include "imx8mp.dtsi"
+#include "imx8mp-vpu.dtsi"
 #include "imx8mp-beacon-som.dtsi"
 
 / {
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-debix-model-a.dts b/arch/arm64/boot/dts/freescale/imx8mp-debix-model-a.dts
index 2876d18f2a38..19b780594957 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-debix-model-a.dts
+++ b/arch/arm64/boot/dts/freescale/imx8mp-debix-model-a.dts
@@ -11,6 +11,7 @@
 #include <dt-bindings/usb/pd.h>
 
 #include "imx8mp.dtsi"
+#include "imx8mp-vpu.dtsi"
 
 / {
 	model = "Polyhex Debix Model A i.MX8MPlus board";
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-dhcom-som.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-dhcom-som.dtsi
index 9cdd4234c4ca..7383222f628a 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-dhcom-som.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mp-dhcom-som.dtsi
@@ -4,6 +4,7 @@
  */
 
 #include "imx8mp.dtsi"
+#include "imx8mp-vpu.dtsi"
 
 / {
 	model = "DH electronics i.MX8M Plus DHCOM SoM";
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-evk.dts b/arch/arm64/boot/dts/freescale/imx8mp-evk.dts
index 7816853162b3..5a146e7fa9d2 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-evk.dts
+++ b/arch/arm64/boot/dts/freescale/imx8mp-evk.dts
@@ -7,6 +7,7 @@
 
 #include <dt-bindings/phy/phy-imx8-pcie.h>
 #include "imx8mp.dtsi"
+#include "imx8mp-vpu.dtsi"
 
 / {
 	model = "NXP i.MX8MPlus EVK board";
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-icore-mx8mp-edimm2.2.dts b/arch/arm64/boot/dts/freescale/imx8mp-icore-mx8mp-edimm2.2.dts
index a02b31c42db4..d7a621938720 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-icore-mx8mp-edimm2.2.dts
+++ b/arch/arm64/boot/dts/freescale/imx8mp-icore-mx8mp-edimm2.2.dts
@@ -8,6 +8,7 @@
 /dts-v1/;
 
 #include "imx8mp.dtsi"
+#include "imx8mp-vpu.dtsi"
 #include "imx8mp-icore-mx8mp.dtsi"
 #include <dt-bindings/usb/pd.h>
 
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-msc-sm2s.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-msc-sm2s.dtsi
index 5dbec71747c3..1d3bb17ac92a 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-msc-sm2s.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mp-msc-sm2s.dtsi
@@ -6,6 +6,7 @@
 /dts-v1/;
 
 #include "imx8mp.dtsi"
+#include "imx8mp-vpu.dtsi"
 #include <dt-bindings/net/ti-dp83867.h>
 
 / {
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-phycore-som.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-phycore-som.dtsi
index ecc4bce6db97..12ed5402a4b4 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-phycore-som.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mp-phycore-som.dtsi
@@ -6,6 +6,7 @@
 
 #include <dt-bindings/net/ti-dp83867.h>
 #include "imx8mp.dtsi"
+#include "imx8mp-vpu.dtsi"
 
 / {
 	model = "PHYTEC phyCORE-i.MX8MP";
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql.dtsi
index ebc29a950ba9..e3db32505d0b 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql.dtsi
@@ -5,6 +5,7 @@
  */
 
 #include "imx8mp.dtsi"
+#include "imx8mp-vpu.dtsi"
 
 / {
 	model = "TQ-Systems i.MX8MPlus TQMa8MPxL";
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-venice-gw74xx.dts b/arch/arm64/boot/dts/freescale/imx8mp-venice-gw74xx.dts
index eb51d648359b..c4552da30789 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-venice-gw74xx.dts
+++ b/arch/arm64/boot/dts/freescale/imx8mp-venice-gw74xx.dts
@@ -11,6 +11,7 @@
 #include <dt-bindings/phy/phy-imx8-pcie.h>
 
 #include "imx8mp.dtsi"
+#include "imx8mp-vpu.dtsi"
 
 / {
 	model = "Gateworks Venice GW74xx i.MX8MP board";
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi
index 0dd6180a8e39..100b3ea2bd4d 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi
@@ -6,6 +6,7 @@
 #include <dt-bindings/phy/phy-imx8-pcie.h>
 #include <dt-bindings/pwm/pwm.h>
 #include "imx8mp.dtsi"
+#include "imx8mp-vpu.dtsi"
 
 / {
 	chosen {
diff --git a/arch/arm64/boot/dts/freescale/imx8mp-vpu.dtsi b/arch/arm64/boot/dts/freescale/imx8mp-vpu.dtsi
new file mode 100644
index 000000000000..3ca1bdf6262c
--- /dev/null
+++ b/arch/arm64/boot/dts/freescale/imx8mp-vpu.dtsi
@@ -0,0 +1,80 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright 2019 NXP
+ */
+
+&gpc {
+	pgc {
+		pgc_vpumix: power-domain@19 {
+			#power-domain-cells = <0>;
+			reg = <IMX8MP_POWER_DOMAIN_VPUMIX>;
+			clocks =<&clk IMX8MP_CLK_VPU_ROOT>;
+		};
+
+		pgc_vpu_g1: power-domain@20 {
+			#power-domain-cells = <0>;
+			power-domains = <&pgc_vpumix>;
+			reg = <IMX8MP_POWER_DOMAIN_VPU_G1>;
+			clocks = <&clk IMX8MP_CLK_VPU_G1_ROOT>;
+		};
+
+		pgc_vpu_g2: power-domain@21 {
+			#power-domain-cells = <0>;
+			power-domains = <&pgc_vpumix>;
+			reg = <IMX8MP_POWER_DOMAIN_VPU_G2>;
+			clocks = <&clk IMX8MP_CLK_VPU_G2_ROOT>;
+		};
+
+		pgc_vpu_vc8000e: power-domain@22 {
+			#power-domain-cells = <0>;
+			power-domains = <&pgc_vpumix>;
+			reg = <IMX8MP_POWER_DOMAIN_VPU_VC8000E>;
+			clocks = <&clk IMX8MP_CLK_VPU_VC8KE_ROOT>;
+		};
+	};
+};
+
+&soc {
+	vpu_g1: video-codec@38300000 {
+		compatible = "nxp,imx8mm-vpu-g1";
+		reg = <0x38300000 0x10000>;
+		interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&clk IMX8MP_CLK_VPU_G1_ROOT>;
+		assigned-clocks = <&clk IMX8MP_CLK_VPU_G1>;
+		assigned-clock-parents = <&clk IMX8MP_VPU_PLL_OUT>;
+		assigned-clock-rates = <600000000>;
+		power-domains = <&vpumix_blk_ctrl IMX8MP_VPUBLK_PD_G1>;
+	};
+
+	vpu_g2: video-codec@38310000 {
+		compatible = "nxp,imx8mq-vpu-g2";
+		reg = <0x38310000 0x10000>;
+		interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
+		clocks = <&clk IMX8MP_CLK_VPU_G2_ROOT>;
+		assigned-clocks = <&clk IMX8MP_CLK_VPU_G2>;
+		assigned-clock-parents = <&clk IMX8MP_SYS_PLL2_1000M>;
+		assigned-clock-rates = <500000000>;
+		power-domains = <&vpumix_blk_ctrl IMX8MP_VPUBLK_PD_G2>;
+	};
+
+	vpumix_blk_ctrl: blk-ctrl@38330000 {
+		compatible = "fsl,imx8mp-vpu-blk-ctrl", "syscon";
+		reg = <0x38330000 0x100>;
+		#power-domain-cells = <1>;
+		power-domains = <&pgc_vpumix>, <&pgc_vpu_g1>,
+				<&pgc_vpu_g2>, <&pgc_vpu_vc8000e>;
+		power-domain-names = "bus", "g1", "g2", "vc8000e";
+		clocks = <&clk IMX8MP_CLK_VPU_G1_ROOT>,
+			 <&clk IMX8MP_CLK_VPU_G2_ROOT>,
+			 <&clk IMX8MP_CLK_VPU_VC8KE_ROOT>;
+		clock-names = "g1", "g2", "vc8000e";
+		assigned-clocks = <&clk IMX8MP_CLK_VPU_BUS>, <&clk IMX8MP_VPU_PLL>;
+		assigned-clock-parents = <&clk IMX8MP_VPU_PLL_OUT>;
+		assigned-clock-rates = <600000000>, <600000000>;
+		interconnects = <&noc IMX8MP_ICM_VPU_G1 &noc IMX8MP_ICN_VIDEO>,
+				<&noc IMX8MP_ICM_VPU_G2 &noc IMX8MP_ICN_VIDEO>,
+				<&noc IMX8MP_ICM_VPU_H1 &noc IMX8MP_ICN_VIDEO>;
+		interconnect-names = "g1", "g2", "vc8000e";
+	};
+};
+
diff --git a/arch/arm64/boot/dts/freescale/imx8mp.dtsi b/arch/arm64/boot/dts/freescale/imx8mp.dtsi
index 2dd60e3252f3..e35409db3240 100644
--- a/arch/arm64/boot/dts/freescale/imx8mp.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx8mp.dtsi
@@ -625,41 +625,6 @@ pgc_ispdwp: power-domain@18 {
 						reg = <IMX8MP_POWER_DOMAIN_MEDIAMIX_ISPDWP>;
 						clocks = <&clk IMX8MP_CLK_MEDIA_ISP_ROOT>;
 					};
-
-					pgc_vpumix: power-domain@19 {
-						#power-domain-cells = <0>;
-						reg = <IMX8MP_POWER_DOMAIN_VPUMIX>;
-						clocks =<&clk IMX8MP_CLK_VPU_ROOT>;
-					};
-
-					pgc_vpu_g1: power-domain@20 {
-						#power-domain-cells = <0>;
-						power-domains = <&pgc_vpumix>;
-						reg = <IMX8MP_POWER_DOMAIN_VPU_G1>;
-						clocks = <&clk IMX8MP_CLK_VPU_G1_ROOT>;
-					};
-
-					pgc_vpu_g2: power-domain@21 {
-						#power-domain-cells = <0>;
-						power-domains = <&pgc_vpumix>;
-						reg = <IMX8MP_POWER_DOMAIN_VPU_G2>;
-						clocks = <&clk IMX8MP_CLK_VPU_G2_ROOT>;
-					};
-
-					pgc_vpu_vc8000e: power-domain@22 {
-						#power-domain-cells = <0>;
-						power-domains = <&pgc_vpumix>;
-						reg = <IMX8MP_POWER_DOMAIN_VPU_VC8000E>;
-						clocks = <&clk IMX8MP_CLK_VPU_VC8KE_ROOT>;
-					};
-
-					pgc_mlmix: power-domain@24 {
-						#power-domain-cells = <0>;
-						reg = <IMX8MP_POWER_DOMAIN_MLMIX>;
-						clocks = <&clk IMX8MP_CLK_ML_AXI>,
-							 <&clk IMX8MP_CLK_ML_AHB>,
-							 <&clk IMX8MP_CLK_NPU_ROOT>;
-					};
 				};
 			};
 		};
@@ -1340,48 +1305,6 @@ gpu2d: gpu@38008000 {
 			power-domains = <&pgc_gpu2d>;
 		};
 
-		vpu_g1: video-codec@38300000 {
-			compatible = "nxp,imx8mm-vpu-g1";
-			reg = <0x38300000 0x10000>;
-			interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
-			clocks = <&clk IMX8MP_CLK_VPU_G1_ROOT>;
-			assigned-clocks = <&clk IMX8MP_CLK_VPU_G1>;
-			assigned-clock-parents = <&clk IMX8MP_VPU_PLL_OUT>;
-			assigned-clock-rates = <600000000>;
-			power-domains = <&vpumix_blk_ctrl IMX8MP_VPUBLK_PD_G1>;
-		};
-
-		vpu_g2: video-codec@38310000 {
-			compatible = "nxp,imx8mq-vpu-g2";
-			reg = <0x38310000 0x10000>;
-			interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
-			clocks = <&clk IMX8MP_CLK_VPU_G2_ROOT>;
-			assigned-clocks = <&clk IMX8MP_CLK_VPU_G2>;
-			assigned-clock-parents = <&clk IMX8MP_SYS_PLL2_1000M>;
-			assigned-clock-rates = <500000000>;
-			power-domains = <&vpumix_blk_ctrl IMX8MP_VPUBLK_PD_G2>;
-		};
-
-		vpumix_blk_ctrl: blk-ctrl@38330000 {
-			compatible = "fsl,imx8mp-vpu-blk-ctrl", "syscon";
-			reg = <0x38330000 0x100>;
-			#power-domain-cells = <1>;
-			power-domains = <&pgc_vpumix>, <&pgc_vpu_g1>,
-					<&pgc_vpu_g2>, <&pgc_vpu_vc8000e>;
-			power-domain-names = "bus", "g1", "g2", "vc8000e";
-			clocks = <&clk IMX8MP_CLK_VPU_G1_ROOT>,
-				 <&clk IMX8MP_CLK_VPU_G2_ROOT>,
-				 <&clk IMX8MP_CLK_VPU_VC8KE_ROOT>;
-			clock-names = "g1", "g2", "vc8000e";
-			assigned-clocks = <&clk IMX8MP_CLK_VPU_BUS>, <&clk IMX8MP_VPU_PLL>;
-			assigned-clock-parents = <&clk IMX8MP_VPU_PLL_OUT>;
-			assigned-clock-rates = <600000000>, <600000000>;
-			interconnects = <&noc IMX8MP_ICM_VPU_G1 &noc IMX8MP_ICN_VIDEO>,
-					<&noc IMX8MP_ICM_VPU_G2 &noc IMX8MP_ICN_VIDEO>,
-					<&noc IMX8MP_ICM_VPU_H1 &noc IMX8MP_ICN_VIDEO>;
-			interconnect-names = "g1", "g2", "vc8000e";
-		};
-
 		gic: interrupt-controller@38800000 {
 			compatible = "arm,gic-v3";
 			reg = <0x38800000 0x10000>,
-- 
2.25.1


[-- Attachment #3: Type: text/plain, Size: 176 bytes --]

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2023-03-31  5:55 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-03  9:14 [PATCH V3 0/7] imx: blk-ctrl: Add interconnect for i.MX8MP Peng Fan (OSS)
2022-07-03  9:14 ` Peng Fan (OSS)
2022-07-03  9:14 ` [PATCH V3 1/7] dt-bindings: soc: imx: add interconnect property for i.MX8MP media blk ctrl Peng Fan (OSS)
2022-07-03  9:14   ` Peng Fan (OSS)
2022-07-03  9:14 ` [PATCH V3 2/7] dt-bindings: soc: imx: add interconnect property for i.MX8MP hdmi " Peng Fan (OSS)
2022-07-03  9:14   ` Peng Fan (OSS)
2022-07-03  9:14 ` [PATCH V3 3/7] dt-bindings: soc: imx: add interconnect property for i.MX8MP hsio " Peng Fan (OSS)
2022-07-03  9:14   ` Peng Fan (OSS)
2022-07-03  9:14 ` [PATCH V3 4/7] soc: imx: add icc paths for i.MX8MP media " Peng Fan (OSS)
2022-07-03  9:14   ` Peng Fan (OSS)
2022-07-03  9:14 ` [PATCH V3 5/7] soc: imx: add icc paths for i.MX8MP hsio/hdmi " Peng Fan (OSS)
2022-07-03  9:14   ` Peng Fan (OSS)
2022-07-03  9:14 ` [PATCH V3 6/7] arm64: dts: imx8mp: add interconnects for media " Peng Fan (OSS)
2022-07-03  9:14   ` Peng Fan (OSS)
2022-07-07 11:38   ` Marco Felsch
2022-07-07 11:38     ` Marco Felsch
2022-07-08  0:06     ` Peng Fan
2022-07-08  0:06       ` Peng Fan
2022-07-03  9:14 ` [PATCH V3 7/7] arm64: dts: imx8mp: add interconnect for hsio " Peng Fan (OSS)
2022-07-03  9:14   ` Peng Fan (OSS)
2023-03-27  4:50   ` Greg Ungerer
2023-03-27  4:50     ` Greg Ungerer
2023-03-27  6:27     ` Alexander Stein
2023-03-27  6:27       ` Alexander Stein
2023-03-27  7:16       ` Ahmad Fatoum
2023-03-27  7:16         ` Ahmad Fatoum
2023-03-27  8:07         ` Greg Ungerer
2023-03-27  8:07           ` Greg Ungerer
2023-03-28  7:33           ` Marco Felsch
2023-03-28  7:33             ` Marco Felsch
2023-03-28 12:58             ` Greg Ungerer
2023-03-28 12:58               ` Greg Ungerer
2023-03-28 13:42               ` Marco Felsch
2023-03-28 13:42                 ` Marco Felsch
2023-03-28 13:51                 ` Marco Felsch
2023-03-28 13:51                   ` Marco Felsch
2023-03-28 14:34                   ` Greg Ungerer
2023-03-28 14:34                     ` Greg Ungerer
2023-03-28 15:11                     ` Marco Felsch
2023-03-28 15:11                       ` Marco Felsch
2023-03-31  5:55                       ` Greg Ungerer [this message]
2023-03-31  5:55                         ` Greg Ungerer
2023-03-31  7:45                         ` Markus Niebel
2023-03-31  7:45                           ` Markus Niebel
2023-03-31  8:11                           ` Ahmad Fatoum
2023-03-31  8:11                             ` Ahmad Fatoum
2023-03-31 15:09                             ` Greg Ungerer
2023-03-31 15:09                               ` Greg Ungerer
2023-03-27  7:51       ` Greg Ungerer
2023-03-27  7:51         ` Greg Ungerer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=792028b9-cd4c-4ff4-a7cb-e60c518aa573@kernel.org \
    --to=gerg@kernel.org \
    --cc=Markus.Niebel@ew.tq-group.com \
    --cc=a.fatoum@pengutronix.de \
    --cc=abailon@baylibre.com \
    --cc=abelvesa@kernel.org \
    --cc=aford173@gmail.com \
    --cc=alexander.stein@ew.tq-group.com \
    --cc=devicetree@vger.kernel.org \
    --cc=djakov@kernel.org \
    --cc=festevam@gmail.com \
    --cc=kernel@pengutronix.de \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=l.stach@pengutronix.de \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-imx@nxp.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=m.felsch@pengutronix.de \
    --cc=marex@denx.de \
    --cc=paul.elder@ideasonboard.com \
    --cc=peng.fan@nxp.com \
    --cc=peng.fan@oss.nxp.com \
    --cc=robh+dt@kernel.org \
    --cc=s.hauer@pengutronix.de \
    --cc=shawnguo@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.