linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3]PCI: imx6: enable pcie on imx6sx sdb and imx6qdl sabreauto.
@ 2014-09-29  5:03 Richard Zhu
  2014-09-29  5:03 ` [PATCH v3 1/9] PCI: imx6: wait the clocks to stabilize after ref_en Richard Zhu
                   ` (8 more replies)
  0 siblings, 9 replies; 18+ messages in thread
From: Richard Zhu @ 2014-09-29  5:03 UTC (permalink / raw)
  To: linux-pci-owner; +Cc: linux-pci, shawn.guo, festevam, l.stach, tharvey

Main changes since the v2:
1. the async reset input need ref clock to sync internally, add one
10us delay between clks enable and the set of the pcie_ref_clk_en.
2. reformat imx6sx pcie dts, and split the dts changes into three part,
imx6sx pcie,imx6sx-sdb board, gpc dts.
3. add the pcie_phy-supply for imx6sx in dts and binding document.
4. figure out that display_axi clock is required by imx6sx pcie inbount
axi port. Add one more clk for imx6sx pcie.
5. Regarding to Lucas' suggestion, move "program correct class for RC"
from dw_pcie_host_init(), to dw_pcie_setup_rc().
6. add one re-store msi data function. Because that pcie controller
maybe powered off during system suspend, and the msi data configuration
would be lost. this functions can be used to restore the msi data
during the resume callback.
7. fix one possible dead lock during imx6sx pcie suspend resume
stress tests.

[PATCH v3 1/9] PCI: imx6: wait the clocks to stabilize after ref_en
[PATCH v3 2/9] PCI: imx6: enable pcie on imx6qdl sabreauto
[PATCH v3 3/9] PCI: imx6: update dts and binding for imx6sx pcie
[PATCH v3 4/9] PCI: imx6: add syscon into gpc dts
[PATCH v3 5/9] PCI: imx6: add imx6sx pcie related gpr bits
[PATCH v3 6/9] PCI: imx6: enable pcie on imx6sx sdb board
[PATCH v3 7/9] PCI: imx6: add imx6sx pcie support
[PATCH v3 8/9] PCI: designware: refine setup_rc and add msi data
[PATCH v3 9/9] PCI: imx6: Fix possible dead lock

^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH v3 1/9] PCI: imx6: wait the clocks to stabilize after ref_en
  2014-09-29  5:03 [PATCH v3]PCI: imx6: enable pcie on imx6sx sdb and imx6qdl sabreauto Richard Zhu
@ 2014-09-29  5:03 ` Richard Zhu
  2014-09-29  5:03 ` [PATCH v3 2/9] PCI: imx6: enable pcie on imx6qdl sabreauto Richard Zhu
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 18+ messages in thread
From: Richard Zhu @ 2014-09-29  5:03 UTC (permalink / raw)
  To: linux-pci-owner
  Cc: linux-pci, shawn.guo, festevam, l.stach, tharvey, Richard Zhu

For boards without a reset gpio we skip the delay between enabling
the pcie_ref_clk and touching the RC registers for configuration.
System would be hangs when the clocks are not yet settled in the DW
PCIe core. So we need to make sure that there is always an
appropriate delay between those two actions.

Signed-off-by: Richard Zhu <r65037@freescale.com>
---
 drivers/pci/host/pci-imx6.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c
index 233fe8a..eac96fb 100644
--- a/drivers/pci/host/pci-imx6.c
+++ b/drivers/pci/host/pci-imx6.c
@@ -275,15 +275,22 @@ static int imx6_pcie_deassert_core_reset(struct pcie_port *pp)
 		goto err_pcie;
 	}
 
-	/* allow the clocks to stabilize */
-	usleep_range(200, 500);
-
 	/* power up core phy and enable ref clock */
 	regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
 			IMX6Q_GPR1_PCIE_TEST_PD, 0 << 18);
+	/*
+	 * the async reset input need ref clock to sync internally,
+	 * when the ref clock comes after reset, internal synced
+	 * reset time is too short , cannot meet the requirement.
+	 * add one ~10us delay here.
+	 */
+	udelay(10);
 	regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
 			IMX6Q_GPR1_PCIE_REF_CLK_EN, 1 << 16);
 
+	/* allow the clocks to stabilize */
+	usleep_range(200, 500);
+
 	/* Some boards don't have PCIe reset GPIO. */
 	if (gpio_is_valid(imx6_pcie->reset_gpio)) {
 		gpio_set_value(imx6_pcie->reset_gpio, 0);
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH v3 2/9] PCI: imx6: enable pcie on imx6qdl sabreauto
  2014-09-29  5:03 [PATCH v3]PCI: imx6: enable pcie on imx6sx sdb and imx6qdl sabreauto Richard Zhu
  2014-09-29  5:03 ` [PATCH v3 1/9] PCI: imx6: wait the clocks to stabilize after ref_en Richard Zhu
@ 2014-09-29  5:03 ` Richard Zhu
  2014-09-29  9:56   ` Lucas Stach
  2014-09-29  5:03 ` [PATCH v3 3/9] PCI: imx6: update dts and binding for imx6sx pcie Richard Zhu
                   ` (6 subsequent siblings)
  8 siblings, 1 reply; 18+ messages in thread
From: Richard Zhu @ 2014-09-29  5:03 UTC (permalink / raw)
  To: linux-pci-owner
  Cc: linux-pci, shawn.guo, festevam, l.stach, tharvey, Richard Zhu

- enable pcie on imx6qdl sabreauto boards.

Signed-off-by: Richard Zhu <r65037@freescale.com>
Reviewed-by: Lucas Stach <l.stach@pengutronix.de>
---
 arch/arm/boot/dts/imx6qdl-sabreauto.dtsi | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi b/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi
index 009abd6..d6040a5 100644
--- a/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi
@@ -410,6 +410,10 @@
 	};
 };
 
+&pcie {
+	status = "okay";
+};
+
 &pwm3 {
 	pinctrl-names = "default";
 	pinctrl-0 = <&pinctrl_pwm3>;
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH v3 3/9] PCI: imx6: update dts and binding for imx6sx pcie
  2014-09-29  5:03 [PATCH v3]PCI: imx6: enable pcie on imx6sx sdb and imx6qdl sabreauto Richard Zhu
  2014-09-29  5:03 ` [PATCH v3 1/9] PCI: imx6: wait the clocks to stabilize after ref_en Richard Zhu
  2014-09-29  5:03 ` [PATCH v3 2/9] PCI: imx6: enable pcie on imx6qdl sabreauto Richard Zhu
@ 2014-09-29  5:03 ` Richard Zhu
  2014-09-29 10:13   ` Lucas Stach
  2014-09-29  5:03 ` [PATCH v3 4/9] PCI: imx6: add syscon into gpc dts Richard Zhu
                   ` (5 subsequent siblings)
  8 siblings, 1 reply; 18+ messages in thread
From: Richard Zhu @ 2014-09-29  5:03 UTC (permalink / raw)
  To: linux-pci-owner
  Cc: linux-pci, shawn.guo, festevam, l.stach, tharvey, Richard Zhu

- imx6sx pcie phy has its own power regulator. Add the
pcie phy power suppy into im6sx pcie dts and binding.
- in order to align with imx6qdl's pcie dts, re-format
imx6sx pcie dts.
- in order to align with imx6qdl pcie dts format and
keep clean of imx6 pcie driver, keep the pcie phy clock
in imx6sx pcie dts, although it's the parent clk of the
pcie bus clock now, and would be enabled automatically
when pcie bus clock is enabled. secondly, it's
possible that the external osc maybe used as source
of the pcie_bus clk in board design in future.
- disp_axi clock is required by pcie inbound axi port.
Add one more clock for imx6sx pcie.

Signed-off-by: Richard Zhu <r65037@freescale.com>
---
 .../devicetree/bindings/pci/fsl,imx6q-pcie.txt     |  5 +++-
 arch/arm/boot/dts/imx6sx.dtsi                      | 30 ++++++++++++----------
 2 files changed, 21 insertions(+), 14 deletions(-)

diff --git a/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt b/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt
index 9455fd0..981e41d 100644
--- a/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt
+++ b/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt
@@ -4,7 +4,7 @@ This PCIe host controller is based on the Synopsis Designware PCIe IP
 and thus inherits all the common properties defined in designware-pcie.txt.
 
 Required properties:
-- compatible: "fsl,imx6q-pcie"
+- compatible: "fsl,imx6q-pcie", "fsl,imx6sx-pcie"
 - reg: base addresse and length of the pcie controller
 - interrupts: A list of interrupt outputs of the controller. Must contain an
   entry for each entry in the interrupt-names property.
@@ -13,6 +13,9 @@ Required properties:
 - clock-names: Must include the following additional entries:
 	- "pcie_phy"
 
+Power supplies for imx6sx:
+- pcie_phy-supply: regulator used by imx6sx pcie phy.
+
 Example:
 
 	pcie@0x01000000 {
diff --git a/arch/arm/boot/dts/imx6sx.dtsi b/arch/arm/boot/dts/imx6sx.dtsi
index f4b9da6..b4ca94b 100644
--- a/arch/arm/boot/dts/imx6sx.dtsi
+++ b/arch/arm/boot/dts/imx6sx.dtsi
@@ -599,9 +599,9 @@
 					anatop-max-voltage = <1450000>;
 				};
 
-				reg_pcie: regulator-vddpcie@140 {
+				reg_pcie_phy: regulator-vddpcie_phy@140 {
 					compatible = "fsl,anatop-regulator";
-					regulator-name = "vddpcie";
+					regulator-name = "vddpcie_phy";
 					regulator-min-microvolt = <725000>;
 					regulator-max-microvolt = <1450000>;
 					anatop-reg-offset = <0x140>;
@@ -1188,20 +1188,24 @@
 			#address-cells = <3>;
 			#size-cells = <2>;
 			device_type = "pci";
-				  /* configuration space */
-			ranges = <0x00000800 0 0x08f00000 0x08f00000 0 0x00080000
-				  /* downstream I/O */
-				  0x81000000 0 0          0x08f80000 0 0x00010000
-				  /* non-prefetchable memory */
-				  0x82000000 0 0x08000000 0x08000000 0 0x00f00000>;
+			ranges = <0x00000800 0 0x08f00000 0x08f00000 0 0x00080000 /* configuration space */
+				  0x81000000 0 0          0x08f80000 0 0x00010000 /* downstream I/O */
+				  0x82000000 0 0x08000000 0x08000000 0 0x00f00000>; /* non-prefetchable memory */
 			num-lanes = <1>;
-			interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>;
-			clocks = <&clks IMX6SX_CLK_PCIE_REF_125M>,
-				 <&clks IMX6SX_CLK_PCIE_AXI>,
+			interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>;
+			interrupt-names = "msi";
+			#interrupt-cells = <1>;
+			interrupt-map-mask = <0 0 0 0x7>;
+			interrupt-map = <0 0 0 1 &intc GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>,
+			                <0 0 0 2 &intc GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>,
+			                <0 0 0 3 &intc GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
+			                <0 0 0 4 &intc GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>;
+			clocks = <&clks IMX6SX_CLK_PCIE_AXI>,
 				 <&clks IMX6SX_CLK_LVDS1_OUT>,
+				 <&clks IMX6SX_CLK_PCIE_REF_125M>,
 				 <&clks IMX6SX_CLK_DISPLAY_AXI>;
-			clock-names = "pcie_ref_125m", "pcie_axi",
-				      "lvds_gate", "display_axi";
+			clock-names = "pcie", "pcie_bus", "pcie_phy", "disp_axi";
+			pcie_phy-supply = <&reg_pcie_phy>;
 			status = "disabled";
 		};
 	};
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH v3 4/9] PCI: imx6: add syscon into gpc dts
  2014-09-29  5:03 [PATCH v3]PCI: imx6: enable pcie on imx6sx sdb and imx6qdl sabreauto Richard Zhu
                   ` (2 preceding siblings ...)
  2014-09-29  5:03 ` [PATCH v3 3/9] PCI: imx6: update dts and binding for imx6sx pcie Richard Zhu
@ 2014-09-29  5:03 ` Richard Zhu
  2014-09-29  5:03 ` [PATCH v3 5/9] PCI: imx6: add imx6sx pcie related gpr bits definitions Richard Zhu
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 18+ messages in thread
From: Richard Zhu @ 2014-09-29  5:03 UTC (permalink / raw)
  To: linux-pci-owner
  Cc: linux-pci, shawn.guo, festevam, l.stach, tharvey, Richard Zhu

In order to manipulate gpc bits for imx6sx
pcie in driver, add syscon into gpc dts

Signed-off-by: Richard Zhu <r65037@freescale.com>
---
 arch/arm/boot/dts/imx6sx.dtsi | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/arch/arm/boot/dts/imx6sx.dtsi b/arch/arm/boot/dts/imx6sx.dtsi
index b4ca94b..76b17e6 100644
--- a/arch/arm/boot/dts/imx6sx.dtsi
+++ b/arch/arm/boot/dts/imx6sx.dtsi
@@ -689,7 +689,8 @@
 			};
 
 			gpc: gpc@020dc000 {
-				compatible = "fsl,imx6sx-gpc", "fsl,imx6q-gpc";
+				compatible = "fsl,imx6sx-gpc",
+					     "fsl,imx6q-gpc", "syscon";
 				reg = <0x020dc000 0x4000>;
 				interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
 			};
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH v3 5/9] PCI: imx6: add imx6sx pcie related gpr bits definitions
  2014-09-29  5:03 [PATCH v3]PCI: imx6: enable pcie on imx6sx sdb and imx6qdl sabreauto Richard Zhu
                   ` (3 preceding siblings ...)
  2014-09-29  5:03 ` [PATCH v3 4/9] PCI: imx6: add syscon into gpc dts Richard Zhu
@ 2014-09-29  5:03 ` Richard Zhu
  2014-09-29  5:03 ` [PATCH v3 6/9] PCI: imx6: enable pcie on imx6sx sdb board Richard Zhu
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 18+ messages in thread
From: Richard Zhu @ 2014-09-29  5:03 UTC (permalink / raw)
  To: linux-pci-owner
  Cc: linux-pci, shawn.guo, festevam, l.stach, tharvey, Richard Zhu

Signed-off-by: Richard Zhu <r65037@freescale.com>
---
 include/linux/mfd/syscon/imx6q-iomuxc-gpr.h | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/include/linux/mfd/syscon/imx6q-iomuxc-gpr.h b/include/linux/mfd/syscon/imx6q-iomuxc-gpr.h
index ff44374..3273b87 100644
--- a/include/linux/mfd/syscon/imx6q-iomuxc-gpr.h
+++ b/include/linux/mfd/syscon/imx6q-iomuxc-gpr.h
@@ -301,6 +301,7 @@
 #define IMX6Q_GPR12_DEVICE_TYPE			(0xf << 12)
 #define IMX6Q_GPR12_PCIE_CTL_2			BIT(10)
 #define IMX6Q_GPR12_LOS_LEVEL			(0x1f << 4)
+#define IMX6Q_GPR12_LOS_LEVEL_9			(0x9 << 4)
 
 #define IMX6Q_GPR13_SDMA_STOP_REQ		BIT(30)
 #define IMX6Q_GPR13_CAN2_STOP_REQ		BIT(29)
@@ -395,4 +396,12 @@
 #define IMX6SL_GPR1_FEC_CLOCK_MUX1_SEL_MASK    (0x3 << 17)
 #define IMX6SL_GPR1_FEC_CLOCK_MUX2_SEL_MASK    (0x1 << 14)
 
+/* For imx6sx iomux gpr register field define */
+#define IMX6SX_GPR5_PCIE_BTNRST			BIT(19)
+#define IMX6SX_GPR5_PCIE_PERST			BIT(18)
+
+#define IMX6SX_GPR12_PCIE_PM_TURN_OFF		BIT(16)
+#define IMX6SX_GPR12_PCIE_TEST_PD		BIT(30)
+#define IMX6SX_GPR12_RX_EQ_MASK			(0x7 << 0)
+#define IMX6SX_GPR12_RX_EQ_2			(0x2 << 0)
 #endif /* __LINUX_IMX6Q_IOMUXC_GPR_H */
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH v3 6/9] PCI: imx6: enable pcie on imx6sx sdb board
  2014-09-29  5:03 [PATCH v3]PCI: imx6: enable pcie on imx6sx sdb and imx6qdl sabreauto Richard Zhu
                   ` (4 preceding siblings ...)
  2014-09-29  5:03 ` [PATCH v3 5/9] PCI: imx6: add imx6sx pcie related gpr bits definitions Richard Zhu
@ 2014-09-29  5:03 ` Richard Zhu
  2014-09-29  5:03 ` [PATCH v3 7/9] PCI: imx6: add imx6sx pcie support Richard Zhu
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 18+ messages in thread
From: Richard Zhu @ 2014-09-29  5:03 UTC (permalink / raw)
  To: linux-pci-owner
  Cc: linux-pci, shawn.guo, festevam, l.stach, tharvey, Richard Zhu

Signed-off-by: Richard Zhu <r65037@freescale.com>
---
 arch/arm/boot/dts/imx6sx-sdb.dts | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/arch/arm/boot/dts/imx6sx-sdb.dts b/arch/arm/boot/dts/imx6sx-sdb.dts
index a3980d9..2976913 100644
--- a/arch/arm/boot/dts/imx6sx-sdb.dts
+++ b/arch/arm/boot/dts/imx6sx-sdb.dts
@@ -251,6 +251,13 @@
 	};
 };
 
+&pcie {
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_pcie>;
+	reset-gpio = <&gpio2 0 0>;
+	status = "okay";
+};
+
 &ssi2 {
 	status = "okay";
 };
@@ -365,6 +372,12 @@
 			>;
 		};
 
+		pinctrl_pcie: pciegrp {
+			fsl,pins = <
+				MX6SX_PAD_ENET1_COL__GPIO2_IO_0 0x17059
+			>;
+		};
+
 		pinctrl_vcc_sd3: vccsd3grp {
 			fsl,pins = <
 				MX6SX_PAD_KEY_COL1__GPIO2_IO_11		0x17059
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH v3 7/9] PCI: imx6: add imx6sx pcie support
  2014-09-29  5:03 [PATCH v3]PCI: imx6: enable pcie on imx6sx sdb and imx6qdl sabreauto Richard Zhu
                   ` (5 preceding siblings ...)
  2014-09-29  5:03 ` [PATCH v3 6/9] PCI: imx6: enable pcie on imx6sx sdb board Richard Zhu
@ 2014-09-29  5:03 ` Richard Zhu
  2014-09-29 10:18   ` Lucas Stach
  2014-09-29  5:03 ` [PATCH v3 8/9] PCI: designware: refine setup_rc and add msi data restore Richard Zhu
  2014-09-29  5:03 ` [PATCH v3 9/9] PCI: imx6: Fix possible dead lock Richard Zhu
  8 siblings, 1 reply; 18+ messages in thread
From: Richard Zhu @ 2014-09-29  5:03 UTC (permalink / raw)
  To: linux-pci-owner
  Cc: linux-pci, shawn.guo, festevam, l.stach, tharvey, Richard Zhu

- imx6sx pcie has its own standalone pcie power supply.
In order to turn on the imx6sx pcie power during
initialization. Add the pcie regulator and the gpc regmap
into the imx6sx pcie structure.
- imx6sx pcie has the new added reset mechanism, add the
reset operations into the initialization.
- Register one PM call-back, enter/exit L2 state of the ASPM
during system suspend/resume.
- disp_axi clock is required by pcie inbound axi port actually.
Add one more clock for imx6sx pcie.

Signed-off-by: Richard Zhu <r65037@freescale.com>
---
 drivers/pci/host/pci-imx6.c | 162 +++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 144 insertions(+), 18 deletions(-)

diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c
index eac96fb..be953aa 100644
--- a/drivers/pci/host/pci-imx6.c
+++ b/drivers/pci/host/pci-imx6.c
@@ -18,12 +18,16 @@
 #include <linux/mfd/syscon.h>
 #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
 #include <linux/module.h>
+#include <linux/of_address.h>
+#include <linux/of_device.h>
 #include <linux/of_gpio.h>
 #include <linux/pci.h>
 #include <linux/platform_device.h>
 #include <linux/regmap.h>
+#include <linux/regulator/consumer.h>
 #include <linux/resource.h>
 #include <linux/signal.h>
+#include <linux/syscore_ops.h>
 #include <linux/types.h>
 #include <linux/interrupt.h>
 
@@ -35,11 +39,15 @@ struct imx6_pcie {
 	int			reset_gpio;
 	struct clk		*pcie_bus;
 	struct clk		*pcie_phy;
+	struct clk		*disp_axi;
 	struct clk		*pcie;
 	struct pcie_port	pp;
 	struct regmap		*iomuxc_gpr;
+	struct regmap		*gpc_ips_reg;
+	struct regulator	*pcie_regulator;
 	void __iomem		*mem_base;
 };
+static struct imx6_pcie *imx6_pcie;
 
 /* PCIe Root Complex registers (memory-mapped) */
 #define PCIE_RC_LCR				0x7c
@@ -77,6 +85,18 @@ struct imx6_pcie {
 #define PHY_RX_OVRD_IN_LO_RX_DATA_EN (1 << 5)
 #define PHY_RX_OVRD_IN_LO_RX_PLL_EN (1 << 3)
 
+/* GPC PCIE PHY bit definitions */
+#define GPC_CNTR			0
+#define GPC_CNTR_PCIE_PHY_PUP_REQ	BIT(7)
+
+static inline bool is_imx6sx_pcie(struct imx6_pcie *imx6_pcie)
+{
+	struct pcie_port *pp = &imx6_pcie->pp;
+	struct device_node *np = pp->dev->of_node;
+
+	return of_device_is_compatible(np, "fsl,imx6sx-pcie");
+}
+
 static int pcie_phy_poll_ack(void __iomem *dbi_base, int exp_val)
 {
 	u32 val;
@@ -275,18 +295,29 @@ static int imx6_pcie_deassert_core_reset(struct pcie_port *pp)
 		goto err_pcie;
 	}
 
-	/* power up core phy and enable ref clock */
-	regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
-			IMX6Q_GPR1_PCIE_TEST_PD, 0 << 18);
-	/*
-	 * the async reset input need ref clock to sync internally,
-	 * when the ref clock comes after reset, internal synced
-	 * reset time is too short , cannot meet the requirement.
-	 * add one ~10us delay here.
-	 */
-	udelay(10);
-	regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
-			IMX6Q_GPR1_PCIE_REF_CLK_EN, 1 << 16);
+	if (is_imx6sx_pcie(imx6_pcie)) {
+		ret = clk_prepare_enable(imx6_pcie->disp_axi);
+		if (ret) {
+			dev_err(pp->dev, "unable to enable pcie clock\n");
+			goto err_disp;
+		}
+
+		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
+				IMX6SX_GPR12_PCIE_TEST_PD, 0 << 30);
+	} else {
+		/* power up core phy and enable ref clock */
+		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
+				IMX6Q_GPR1_PCIE_TEST_PD, 0 << 18);
+		/*
+		 * the async reset input need ref clock to sync internally,
+		 * when the ref clock comes after reset, internal synced
+		 * reset time is too short , cannot meet the requirement.
+		 * add one ~10us delay here.
+		 */
+		udelay(10);
+		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
+				IMX6Q_GPR1_PCIE_REF_CLK_EN, 1 << 16);
+	}
 
 	/* allow the clocks to stabilize */
 	usleep_range(200, 500);
@@ -297,8 +328,19 @@ static int imx6_pcie_deassert_core_reset(struct pcie_port *pp)
 		msleep(100);
 		gpio_set_value(imx6_pcie->reset_gpio, 1);
 	}
+
+	/*
+	 * Release the PCIe PHY reset here, that we have set in
+	 * imx6_pcie_init_phy() now
+	 */
+	if (is_imx6sx_pcie(imx6_pcie))
+		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR5,
+				IMX6SX_GPR5_PCIE_BTNRST, 0 << 19);
+
 	return 0;
 
+err_disp:
+	clk_disable_unprepare(imx6_pcie->pcie);
 err_pcie:
 	clk_disable_unprepare(imx6_pcie->pcie_bus);
 err_pcie_bus:
@@ -311,6 +353,26 @@ err_pcie_phy:
 static void imx6_pcie_init_phy(struct pcie_port *pp)
 {
 	struct imx6_pcie *imx6_pcie = to_imx6_pcie(pp);
+	int ret;
+
+	/* Power up the separate domain available on i.MX6SX */
+	if (is_imx6sx_pcie(imx6_pcie)) {
+		/* Force PCIe PHY reset */
+		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR5,
+				IMX6SX_GPR5_PCIE_BTNRST,
+				IMX6SX_GPR5_PCIE_BTNRST);
+
+		regmap_update_bits(imx6_pcie->gpc_ips_reg, GPC_CNTR,
+				GPC_CNTR_PCIE_PHY_PUP_REQ,
+				GPC_CNTR_PCIE_PHY_PUP_REQ);
+		regulator_set_voltage(imx6_pcie->pcie_regulator,
+				1100000, 1100000);
+		ret = regulator_enable(imx6_pcie->pcie_regulator);
+		if (ret)
+			dev_info(pp->dev, "failed to enable pcie regulator.\n");
+		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
+				IMX6SX_GPR12_RX_EQ_MASK, IMX6SX_GPR12_RX_EQ_2);
+	}
 
 	regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
 			IMX6Q_GPR12_PCIE_CTL_2, 0 << 10);
@@ -319,7 +381,7 @@ static void imx6_pcie_init_phy(struct pcie_port *pp)
 	regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
 			IMX6Q_GPR12_DEVICE_TYPE, PCI_EXP_TYPE_ROOT_PORT << 12);
 	regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
-			IMX6Q_GPR12_LOS_LEVEL, 9 << 4);
+			IMX6Q_GPR12_LOS_LEVEL, IMX6Q_GPR12_LOS_LEVEL_9);
 
 	regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
 			IMX6Q_GPR8_TX_DEEMPH_GEN1, 0 << 0);
@@ -377,7 +439,8 @@ static int imx6_pcie_start_link(struct pcie_port *pp)
 
 	/* Start LTSSM. */
 	regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
-			IMX6Q_GPR12_PCIE_CTL_2, 1 << 10);
+			IMX6Q_GPR12_PCIE_CTL_2,
+			IMX6Q_GPR12_PCIE_CTL_2);
 
 	ret = imx6_pcie_wait_for_link(pp);
 	if (ret)
@@ -553,9 +616,50 @@ static int __init imx6_add_pcie_port(struct pcie_port *pp,
 	return 0;
 }
 
+#ifdef CONFIG_PM_SLEEP
+static int pci_imx_suspend(void)
+{
+	if (is_imx6sx_pcie(imx6_pcie)) {
+		/* PM_TURN_OFF */
+		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
+				IMX6SX_GPR12_PCIE_PM_TURN_OFF,
+				IMX6SX_GPR12_PCIE_PM_TURN_OFF);
+		udelay(10);
+		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
+				IMX6SX_GPR12_PCIE_PM_TURN_OFF, 0 << 16);
+	}
+
+	return 0;
+}
+
+static void pci_imx_resume(void)
+{
+	struct pcie_port *pp = &imx6_pcie->pp;
+
+	if (is_imx6sx_pcie(imx6_pcie)) {
+		/* Reset iMX6SX PCIe */
+		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR5,
+				IMX6SX_GPR5_PCIE_PERST, IMX6SX_GPR5_PCIE_PERST);
+		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR5,
+				IMX6SX_GPR5_PCIE_PERST, 0 << 18);
+		/*
+		 * controller maybe turn off, re-configure again
+		 */
+		dw_pcie_setup_rc(pp);
+
+		if (IS_ENABLED(CONFIG_PCI_MSI))
+			dw_pcie_msi_cfg_restore(pp);
+	}
+}
+
+static struct syscore_ops pci_imx_syscore_ops = {
+	.suspend = pci_imx_suspend,
+	.resume = pci_imx_resume,
+};
+#endif
+
 static int __init imx6_pcie_probe(struct platform_device *pdev)
 {
-	struct imx6_pcie *imx6_pcie;
 	struct pcie_port *pp;
 	struct device_node *np = pdev->dev.of_node;
 	struct resource *dbi_base;
@@ -610,9 +714,27 @@ static int __init imx6_pcie_probe(struct platform_device *pdev)
 		return PTR_ERR(imx6_pcie->pcie);
 	}
 
-	/* Grab GPR config register range */
-	imx6_pcie->iomuxc_gpr =
-		 syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr");
+	if (is_imx6sx_pcie(imx6_pcie)) {
+		imx6_pcie->disp_axi = devm_clk_get(&pdev->dev, "disp_axi");
+		if (IS_ERR(imx6_pcie->disp_axi)) {
+			dev_err(&pdev->dev,
+				"pcie clock source missing or invalid\n");
+			return PTR_ERR(imx6_pcie->disp_axi);
+		}
+
+		imx6_pcie->pcie_regulator = devm_regulator_get(pp->dev,
+				"pcie_phy");
+
+		imx6_pcie->iomuxc_gpr =
+			 syscon_regmap_lookup_by_compatible
+			 ("fsl,imx6sx-iomuxc-gpr");
+		imx6_pcie->gpc_ips_reg =
+			 syscon_regmap_lookup_by_compatible("fsl,imx6sx-gpc");
+	} else {
+		imx6_pcie->iomuxc_gpr =
+			syscon_regmap_lookup_by_compatible
+			("fsl,imx6q-iomuxc-gpr");
+	}
 	if (IS_ERR(imx6_pcie->iomuxc_gpr)) {
 		dev_err(&pdev->dev, "unable to find iomuxc registers\n");
 		return PTR_ERR(imx6_pcie->iomuxc_gpr);
@@ -623,6 +745,9 @@ static int __init imx6_pcie_probe(struct platform_device *pdev)
 		return ret;
 
 	platform_set_drvdata(pdev, imx6_pcie);
+#ifdef CONFIG_PM_SLEEP
+	register_syscore_ops(&pci_imx_syscore_ops);
+#endif
 	return 0;
 }
 
@@ -636,6 +761,7 @@ static void imx6_pcie_shutdown(struct platform_device *pdev)
 
 static const struct of_device_id imx6_pcie_of_match[] = {
 	{ .compatible = "fsl,imx6q-pcie", },
+	{ .compatible = "fsl,imx6sx-pcie", },
 	{},
 };
 MODULE_DEVICE_TABLE(of, imx6_pcie_of_match);
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH v3 8/9] PCI: designware: refine setup_rc and add msi data restore
  2014-09-29  5:03 [PATCH v3]PCI: imx6: enable pcie on imx6sx sdb and imx6qdl sabreauto Richard Zhu
                   ` (6 preceding siblings ...)
  2014-09-29  5:03 ` [PATCH v3 7/9] PCI: imx6: add imx6sx pcie support Richard Zhu
@ 2014-09-29  5:03 ` Richard Zhu
  2014-09-29 10:26   ` Lucas Stach
  2014-09-29  5:03 ` [PATCH v3 9/9] PCI: imx6: Fix possible dead lock Richard Zhu
  8 siblings, 1 reply; 18+ messages in thread
From: Richard Zhu @ 2014-09-29  5:03 UTC (permalink / raw)
  To: linux-pci-owner
  Cc: linux-pci, shawn.guo, festevam, l.stach, tharvey, Richard Zhu

- move "program correct class for RC" from dw_pcie_host_init()
to dw_pcie_setup_rc(). since this is RC setup, it's
better to contained in dw_pcie_setup_rc function.
Then, RC can be re-setup really by dw_pcie_setup_rc().
- add one re-store msi data function. Because that
pcie controller maybe powered off during system suspend,
and the msi data configuration would be lost.
this functions can be used to restore the msi data
during the resume callback.

Signed-off-by: Richard Zhu <r65037@freescale.com>
---
 drivers/pci/host/pcie-designware.c | 15 ++++++++++++---
 drivers/pci/host/pcie-designware.h |  1 +
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c
index 538bbf3..ae1e6c5 100644
--- a/drivers/pci/host/pcie-designware.c
+++ b/drivers/pci/host/pcie-designware.c
@@ -194,6 +194,13 @@ void dw_pcie_msi_init(struct pcie_port *pp)
 	dw_pcie_wr_own_conf(pp, PCIE_MSI_ADDR_HI, 4, 0);
 }
 
+void dw_pcie_msi_cfg_restore(struct pcie_port *pp)
+{
+	dw_pcie_wr_own_conf(pp, PCIE_MSI_ADDR_LO, 4,
+			virt_to_phys((void *)pp->msi_data));
+	dw_pcie_wr_own_conf(pp, PCIE_MSI_ADDR_HI, 4, 0);
+}
+
 static int find_valid_pos0(struct pcie_port *pp, int msgvec, int pos, int *pos0)
 {
 	int flag = 1;
@@ -570,9 +577,6 @@ int __init dw_pcie_host_init(struct pcie_port *pp)
 
 	dw_pcie_wr_own_conf(pp, PCI_BASE_ADDRESS_0, 4, 0);
 
-	/* program correct class for RC */
-	dw_pcie_wr_own_conf(pp, PCI_CLASS_DEVICE, 2, PCI_CLASS_BRIDGE_PCI);
-
 	dw_pcie_rd_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, &val);
 	val |= PORT_LOGIC_SPEED_CHANGE;
 	dw_pcie_wr_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, val);
@@ -917,6 +921,11 @@ void dw_pcie_setup_rc(struct pcie_port *pp)
 	val = memlimit | membase;
 	dw_pcie_writel_rc(pp, val, PCI_MEMORY_BASE);
 
+	/* program correct class for RC */
+	dw_pcie_readl_rc(pp, PCI_CLASS_REVISION, &val);
+	val |= PCI_CLASS_BRIDGE_PCI << 16;
+	dw_pcie_writel_rc(pp, val, PCI_CLASS_REVISION);
+
 	/* setup command register */
 	dw_pcie_readl_rc(pp, PCI_COMMAND, &val);
 	val &= 0xffff0000;
diff --git a/drivers/pci/host/pcie-designware.h b/drivers/pci/host/pcie-designware.h
index a476e60..bb75715 100644
--- a/drivers/pci/host/pcie-designware.h
+++ b/drivers/pci/host/pcie-designware.h
@@ -83,6 +83,7 @@ int dw_pcie_cfg_read(void __iomem *addr, int where, int size, u32 *val);
 int dw_pcie_cfg_write(void __iomem *addr, int where, int size, u32 val);
 irqreturn_t dw_handle_msi_irq(struct pcie_port *pp);
 void dw_pcie_msi_init(struct pcie_port *pp);
+void dw_pcie_msi_cfg_restore(struct pcie_port *pp);
 int dw_pcie_link_up(struct pcie_port *pp);
 void dw_pcie_setup_rc(struct pcie_port *pp);
 int dw_pcie_host_init(struct pcie_port *pp);
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH v3 9/9] PCI: imx6: Fix possible dead lock
  2014-09-29  5:03 [PATCH v3]PCI: imx6: enable pcie on imx6sx sdb and imx6qdl sabreauto Richard Zhu
                   ` (7 preceding siblings ...)
  2014-09-29  5:03 ` [PATCH v3 8/9] PCI: designware: refine setup_rc and add msi data restore Richard Zhu
@ 2014-09-29  5:03 ` Richard Zhu
  2014-09-29 10:38   ` Lucas Stach
  8 siblings, 1 reply; 18+ messages in thread
From: Richard Zhu @ 2014-09-29  5:03 UTC (permalink / raw)
  To: linux-pci-owner
  Cc: linux-pci, shawn.guo, festevam, l.stach, tharvey, Richard Zhu

kernel report one possible dead lock during imx6sx pcie
suspend resume stress tests, after enable Lock Debugging.
platform: imx6sx sdb board + xhci(pcie2usb3.0 ep)

reason: usleep_range used in imx6_pcie_link_up maybe scheduled
out from dw_pcie_valid_config.isra...
About details, please see the following logs.

solution: replace the usleep_range(1000, 2000) by udelay(10) and
enlarge the loop counter.

logs:
[   50.643062] xhci_hcd 0000:01:00.0: Refused to change power state, currently in D3
[   50.653390]
[   50.654898] =========================================================
[   50.661343] [ INFO: possible irq lock inversion dependency detected ]
[   50.667792] 3.17.0-rc2-01341-gfc43ff7-dirty #101 Not tainted
[   50.673454] ---------------------------------------------------------
[   50.679898] kworker/u2:2/48 just changed the state of lock:
[   50.685477]  (pci_lock){+.....}, at: [<802d650c>] pci_bus_read_config_dword+0x44/0x94
[   50.693394] but this lock was taken by another, HARDIRQ-safe lock in the past:
[   50.700619]  (&irq_desc_lock_class){-.-...}

and interrupts could create inverse lock ordering between them.

[   50.710843]
[   50.710843] other info that might help us debug this:
[   50.717377]  Possible interrupt unsafe locking scenario:
[   50.717377]
[   50.724169]        CPU0                    CPU1
[   50.728702]        ----                    ----
[   50.733234]   lock(pci_lock);
[   50.736232]                                local_irq_disable();
[   50.742154]                                lock(&irq_desc_lock_class);
[   50.748713]                                lock(pci_lock);
[   50.754229]   <Interrupt>
[   50.756852]     lock(&irq_desc_lock_class);
[   50.761065]
[   50.761065]  *** DEADLOCK ***
...

[   52.119515] [<806e8ad0>] (schedule_hrtimeout_range) from [<80077e90>] (usleep_range+0x50/0x58)
[   52.128141] [<80077e40>] (usleep_range) from [<802f3694>] (imx6_pcie_link_up+0x48/0x16c)
[   52.136242] [<802f364c>] (imx6_pcie_link_up) from [<802f1b74>] (dw_pcie_valid_config.isra.10+0x40/0x7c)
[   52.145637]  r6:ae72606d r5:ae72606c r4:ae711228
[   52.150311] [<802f1b34>] (dw_pcie_valid_config.isra.10) from [<802f1ca8>] (dw_pcie_rd_conf+0x4c/0x154)
[   52.159620]  r7:00000000 r6:00000000 r5:ae711228 r4:ae726000
[   52.165355] [<802f1c5c>] (dw_pcie_rd_conf) from [<802d6534>] (pci_bus_read_config_dword+0x6c/0x94)
[   52.174316]  r9:adf4e910 r8:809bc51c r7:00000000 r6:60000153 r5:adc3fd5c r4:ae726000
[   52.182152] [<802d64c8>] (pci_bus_read_config_dword) from [<802db588>] (pci_restore_config_dword+0x54/0xa4)
[   52.191894]  r6:00000024 r5:0000000a r4:ae61e000
[   52.196570] [<802db534>] (pci_restore_config_dword) from [<802dd150>] (pci_restore_state.part.37+0x7c/0x1f8)
[   52.206399]  r8:802e086c r7:ae61dfe8 r6:519e2024 r5:ae61e000 r4:ae61dffc
[   52.213187] [<802dd0d4>] (pci_restore_state.part.37) from [<802dd2e8>] (pci_restore_state+0x1c/0x20)
[   52.222322]  r7:adc3fea8 r6:809d90e0 r5:ae61e000 r4:ae61e068
[   52.228056] [<802dd2cc>] (pci_restore_state) from [<802e0894>] (pci_pm_resume_noirq+0x28/0xa4)
[   52.236683] [<802e086c>] (pci_pm_resume_noirq) from [<8037ea1c>] (dpm_run_callback.isra.12+0x34/0x7c)

Signed-off-by: Richard Zhu <r65037@freescale.com>
---
 drivers/pci/host/pci-imx6.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c
index be953aa..e60c195 100644
--- a/drivers/pci/host/pci-imx6.c
+++ b/drivers/pci/host/pci-imx6.c
@@ -521,7 +521,7 @@ static void imx6_pcie_reset_phy(struct pcie_port *pp)
 static int imx6_pcie_link_up(struct pcie_port *pp)
 {
 	u32 rc, debug_r0, rx_valid;
-	int count = 5;
+	int count = 500;
 
 	/*
 	 * Test if the PHY reports that the link is up and also that the LTSSM
@@ -552,7 +552,7 @@ static int imx6_pcie_link_up(struct pcie_port *pp)
 		 * Wait a little bit, then re-check if the link finished
 		 * the training.
 		 */
-		usleep_range(1000, 2000);
+		udelay(10);
 	}
 	/*
 	 * From L0, initiate MAC entry to gen2 if EP/RC supports gen2.
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* Re: [PATCH v3 2/9] PCI: imx6: enable pcie on imx6qdl sabreauto
  2014-09-29  5:03 ` [PATCH v3 2/9] PCI: imx6: enable pcie on imx6qdl sabreauto Richard Zhu
@ 2014-09-29  9:56   ` Lucas Stach
  2014-09-30  2:18     ` Hong-Xing.Zhu
  0 siblings, 1 reply; 18+ messages in thread
From: Lucas Stach @ 2014-09-29  9:56 UTC (permalink / raw)
  To: Richard Zhu; +Cc: linux-pci-owner, linux-pci, shawn.guo, festevam, tharvey

Am Montag, den 29.09.2014, 13:03 +0800 schrieb Richard Zhu:
> - enable pcie on imx6qdl sabreauto boards.
> 
> Signed-off-by: Richard Zhu <r65037@freescale.com>
> Reviewed-by: Lucas Stach <l.stach@pengutronix.de>
> ---
>  arch/arm/boot/dts/imx6qdl-sabreauto.dtsi | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi b/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi
> index 009abd6..d6040a5 100644
> --- a/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi
> +++ b/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi
> @@ -410,6 +410,10 @@
>  	};
>  };
>  
> +&pcie {
> +	status = "okay";
> +};
> +
>  &pwm3 {
>  	pinctrl-names = "default";
>  	pinctrl-0 = <&pinctrl_pwm3>;

The dts changes have a wrong prefix. They are not PCI subsystem patches,
but arch patches for i.MX and should be applied by Shawn. So prefix
needs to be ARM: imx6XX: ...

Also I would recommend that you sort them to the end of the series so
make it easy for Bjorn and Shawn to see where the slit between the two
is. Don't intermix those changes in the series, it certainly isn't
needed here.

Regards,
Lucas
-- 
Pengutronix e.K.             | Lucas Stach                 |
Industrial Linux Solutions   | http://www.pengutronix.de/  |


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v3 3/9] PCI: imx6: update dts and binding for imx6sx pcie
  2014-09-29  5:03 ` [PATCH v3 3/9] PCI: imx6: update dts and binding for imx6sx pcie Richard Zhu
@ 2014-09-29 10:13   ` Lucas Stach
  2014-09-30  2:58     ` Hong-Xing.Zhu
  0 siblings, 1 reply; 18+ messages in thread
From: Lucas Stach @ 2014-09-29 10:13 UTC (permalink / raw)
  To: Richard Zhu; +Cc: linux-pci-owner, linux-pci, shawn.guo, festevam, tharvey

Am Montag, den 29.09.2014, 13:03 +0800 schrieb Richard Zhu:
> - imx6sx pcie phy has its own power regulator. Add the
> pcie phy power suppy into im6sx pcie dts and binding.
> - in order to align with imx6qdl's pcie dts, re-format
> imx6sx pcie dts.
> - in order to align with imx6qdl pcie dts format and
> keep clean of imx6 pcie driver, keep the pcie phy clock
> in imx6sx pcie dts, although it's the parent clk of the
> pcie bus clock now, and would be enabled automatically
> when pcie bus clock is enabled. secondly, it's
> possible that the external osc maybe used as source
> of the pcie_bus clk in board design in future.
> - disp_axi clock is required by pcie inbound axi port.
> Add one more clock for imx6sx pcie.
> 
> Signed-off-by: Richard Zhu <r65037@freescale.com>
> ---
>  .../devicetree/bindings/pci/fsl,imx6q-pcie.txt     |  5 +++-
>  arch/arm/boot/dts/imx6sx.dtsi                      | 30 ++++++++++++----------
>  2 files changed, 21 insertions(+), 14 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt b/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt
> index 9455fd0..981e41d 100644
> --- a/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt
> +++ b/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt
> @@ -4,7 +4,7 @@ This PCIe host controller is based on the Synopsis Designware PCIe IP
>  and thus inherits all the common properties defined in designware-pcie.txt.
>  
>  Required properties:
> -- compatible: "fsl,imx6q-pcie"
> +- compatible: "fsl,imx6q-pcie", "fsl,imx6sx-pcie"
>  - reg: base addresse and length of the pcie controller
>  - interrupts: A list of interrupt outputs of the controller. Must contain an
>    entry for each entry in the interrupt-names property.
> @@ -13,6 +13,9 @@ Required properties:
>  - clock-names: Must include the following additional entries:
>  	- "pcie_phy"
>  
> +Power supplies for imx6sx:
> +- pcie_phy-supply: regulator used by imx6sx pcie phy.
> +
To align with the previous practice of naming regulator supplies please
don't use underscores in the name. Also you aren't documenting the
additional clock (which also needs a descriptive name, NOT "disp_axi").
I would recommend the documentation change to look like this:

Additional required properties for imx6sx-pcie:
- clock names: Must include the following additional entries:
	- "pcie_inbound_axi"
- power supplies:
	- pcie-phy-supply: regulator used to power the PCIe PHY

Please update the DTS and driver accordingly.

>  Example:
>  
>  	pcie@0x01000000 {
> diff --git a/arch/arm/boot/dts/imx6sx.dtsi b/arch/arm/boot/dts/imx6sx.dtsi
> index f4b9da6..b4ca94b 100644
> --- a/arch/arm/boot/dts/imx6sx.dtsi
> +++ b/arch/arm/boot/dts/imx6sx.dtsi
> @@ -599,9 +599,9 @@
>  					anatop-max-voltage = <1450000>;
>  				};
>  
> -				reg_pcie: regulator-vddpcie@140 {
> +				reg_pcie_phy: regulator-vddpcie_phy@140 {
>  					compatible = "fsl,anatop-regulator";
> -					regulator-name = "vddpcie";
> +					regulator-name = "vddpcie_phy";
>  					regulator-min-microvolt = <725000>;
>  					regulator-max-microvolt = <1450000>;
>  					anatop-reg-offset = <0x140>;
> @@ -1188,20 +1188,24 @@
>  			#address-cells = <3>;
>  			#size-cells = <2>;
>  			device_type = "pci";
> -				  /* configuration space */
> -			ranges = <0x00000800 0 0x08f00000 0x08f00000 0 0x00080000
> -				  /* downstream I/O */
> -				  0x81000000 0 0          0x08f80000 0 0x00010000
> -				  /* non-prefetchable memory */
> -				  0x82000000 0 0x08000000 0x08000000 0 0x00f00000>;
> +			ranges = <0x00000800 0 0x08f00000 0x08f00000 0 0x00080000 /* configuration space */
> +				  0x81000000 0 0          0x08f80000 0 0x00010000 /* downstream I/O */
> +				  0x82000000 0 0x08000000 0x08000000 0 0x00f00000>; /* non-prefetchable memory */
>  			num-lanes = <1>;
> -			interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>;
> -			clocks = <&clks IMX6SX_CLK_PCIE_REF_125M>,
> -				 <&clks IMX6SX_CLK_PCIE_AXI>,
> +			interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>;
> +			interrupt-names = "msi";
> +			#interrupt-cells = <1>;
> +			interrupt-map-mask = <0 0 0 0x7>;
> +			interrupt-map = <0 0 0 1 &intc GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>,
> +			                <0 0 0 2 &intc GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>,
> +			                <0 0 0 3 &intc GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
> +			                <0 0 0 4 &intc GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&clks IMX6SX_CLK_PCIE_AXI>,
>  				 <&clks IMX6SX_CLK_LVDS1_OUT>,
> +				 <&clks IMX6SX_CLK_PCIE_REF_125M>,
>  				 <&clks IMX6SX_CLK_DISPLAY_AXI>;
> -			clock-names = "pcie_ref_125m", "pcie_axi",
> -				      "lvds_gate", "display_axi";
> +			clock-names = "pcie", "pcie_bus", "pcie_phy", "disp_axi";
> +			pcie_phy-supply = <&reg_pcie_phy>;
>  			status = "disabled";
>  		};
>  	};

You are still missing the "config" reg space. Please look at the
designware-pcie.txt base binding, it's a required property now. Also
please be more careful to address my review comments.

Regards,
Lucas
-- 
Pengutronix e.K.             | Lucas Stach                 |
Industrial Linux Solutions   | http://www.pengutronix.de/  |


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v3 7/9] PCI: imx6: add imx6sx pcie support
  2014-09-29  5:03 ` [PATCH v3 7/9] PCI: imx6: add imx6sx pcie support Richard Zhu
@ 2014-09-29 10:18   ` Lucas Stach
  2014-09-30  2:37     ` Hong-Xing.Zhu
  0 siblings, 1 reply; 18+ messages in thread
From: Lucas Stach @ 2014-09-29 10:18 UTC (permalink / raw)
  To: Richard Zhu; +Cc: linux-pci-owner, linux-pci, shawn.guo, festevam, tharvey

Am Montag, den 29.09.2014, 13:03 +0800 schrieb Richard Zhu:
> - imx6sx pcie has its own standalone pcie power supply.
> In order to turn on the imx6sx pcie power during
> initialization. Add the pcie regulator and the gpc regmap
> into the imx6sx pcie structure.
> - imx6sx pcie has the new added reset mechanism, add the
> reset operations into the initialization.
> - Register one PM call-back, enter/exit L2 state of the ASPM
> during system suspend/resume.
> - disp_axi clock is required by pcie inbound axi port actually.
> Add one more clock for imx6sx pcie.
> 
> Signed-off-by: Richard Zhu <r65037@freescale.com>
> ---
>  drivers/pci/host/pci-imx6.c | 162 +++++++++++++++++++++++++++++++++++++++-----
>  1 file changed, 144 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c
> index eac96fb..be953aa 100644
> --- a/drivers/pci/host/pci-imx6.c
> +++ b/drivers/pci/host/pci-imx6.c
> @@ -18,12 +18,16 @@
>  #include <linux/mfd/syscon.h>
>  #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
>  #include <linux/module.h>
> +#include <linux/of_address.h>

Why do you need this include?

> +#include <linux/of_device.h>
>  #include <linux/of_gpio.h>
>  #include <linux/pci.h>
>  #include <linux/platform_device.h>
>  #include <linux/regmap.h>
> +#include <linux/regulator/consumer.h>
>  #include <linux/resource.h>
>  #include <linux/signal.h>
> +#include <linux/syscore_ops.h>
>  #include <linux/types.h>
>  #include <linux/interrupt.h>
>  
> @@ -35,11 +39,15 @@ struct imx6_pcie {
>  	int			reset_gpio;
>  	struct clk		*pcie_bus;
>  	struct clk		*pcie_phy;
> +	struct clk		*disp_axi;

This needs a more descriptive name, just like the binding.

>  	struct clk		*pcie;
>  	struct pcie_port	pp;
>  	struct regmap		*iomuxc_gpr;
> +	struct regmap		*gpc_ips_reg;
> +	struct regulator	*pcie_regulator;
>  	void __iomem		*mem_base;
>  };
> +static struct imx6_pcie *imx6_pcie;
>  
>  /* PCIe Root Complex registers (memory-mapped) */
>  #define PCIE_RC_LCR				0x7c
> @@ -77,6 +85,18 @@ struct imx6_pcie {
>  #define PHY_RX_OVRD_IN_LO_RX_DATA_EN (1 << 5)
>  #define PHY_RX_OVRD_IN_LO_RX_PLL_EN (1 << 3)
>  
> +/* GPC PCIE PHY bit definitions */
> +#define GPC_CNTR			0
> +#define GPC_CNTR_PCIE_PHY_PUP_REQ	BIT(7)
> +
> +static inline bool is_imx6sx_pcie(struct imx6_pcie *imx6_pcie)
> +{
> +	struct pcie_port *pp = &imx6_pcie->pp;
> +	struct device_node *np = pp->dev->of_node;
> +
> +	return of_device_is_compatible(np, "fsl,imx6sx-pcie");
> +}
> +
>  static int pcie_phy_poll_ack(void __iomem *dbi_base, int exp_val)
>  {
>  	u32 val;
> @@ -275,18 +295,29 @@ static int imx6_pcie_deassert_core_reset(struct pcie_port *pp)
>  		goto err_pcie;
>  	}
>  
> -	/* power up core phy and enable ref clock */
> -	regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
> -			IMX6Q_GPR1_PCIE_TEST_PD, 0 << 18);
> -	/*
> -	 * the async reset input need ref clock to sync internally,
> -	 * when the ref clock comes after reset, internal synced
> -	 * reset time is too short , cannot meet the requirement.
> -	 * add one ~10us delay here.
> -	 */
> -	udelay(10);
> -	regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
> -			IMX6Q_GPR1_PCIE_REF_CLK_EN, 1 << 16);
> +	if (is_imx6sx_pcie(imx6_pcie)) {
> +		ret = clk_prepare_enable(imx6_pcie->disp_axi);
> +		if (ret) {
> +			dev_err(pp->dev, "unable to enable pcie clock\n");
> +			goto err_disp;
> +		}
> +
> +		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
> +				IMX6SX_GPR12_PCIE_TEST_PD, 0 << 30);
> +	} else {
> +		/* power up core phy and enable ref clock */
> +		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
> +				IMX6Q_GPR1_PCIE_TEST_PD, 0 << 18);
> +		/*
> +		 * the async reset input need ref clock to sync internally,
> +		 * when the ref clock comes after reset, internal synced
> +		 * reset time is too short , cannot meet the requirement.
> +		 * add one ~10us delay here.
> +		 */
> +		udelay(10);
> +		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
> +				IMX6Q_GPR1_PCIE_REF_CLK_EN, 1 << 16);
> +	}
>  
>  	/* allow the clocks to stabilize */
>  	usleep_range(200, 500);
> @@ -297,8 +328,19 @@ static int imx6_pcie_deassert_core_reset(struct pcie_port *pp)
>  		msleep(100);
>  		gpio_set_value(imx6_pcie->reset_gpio, 1);
>  	}
> +
> +	/*
> +	 * Release the PCIe PHY reset here, that we have set in
> +	 * imx6_pcie_init_phy() now
> +	 */
> +	if (is_imx6sx_pcie(imx6_pcie))
> +		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR5,
> +				IMX6SX_GPR5_PCIE_BTNRST, 0 << 19);
> +
>  	return 0;
>  
> +err_disp:
> +	clk_disable_unprepare(imx6_pcie->pcie);
>  err_pcie:
>  	clk_disable_unprepare(imx6_pcie->pcie_bus);
>  err_pcie_bus:
> @@ -311,6 +353,26 @@ err_pcie_phy:
>  static void imx6_pcie_init_phy(struct pcie_port *pp)
>  {
>  	struct imx6_pcie *imx6_pcie = to_imx6_pcie(pp);
> +	int ret;
> +
> +	/* Power up the separate domain available on i.MX6SX */
> +	if (is_imx6sx_pcie(imx6_pcie)) {
> +		/* Force PCIe PHY reset */
> +		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR5,
> +				IMX6SX_GPR5_PCIE_BTNRST,
> +				IMX6SX_GPR5_PCIE_BTNRST);
> +
> +		regmap_update_bits(imx6_pcie->gpc_ips_reg, GPC_CNTR,
> +				GPC_CNTR_PCIE_PHY_PUP_REQ,
> +				GPC_CNTR_PCIE_PHY_PUP_REQ);
> +		regulator_set_voltage(imx6_pcie->pcie_regulator,
> +				1100000, 1100000);
> +		ret = regulator_enable(imx6_pcie->pcie_regulator);
> +		if (ret)
> +			dev_info(pp->dev, "failed to enable pcie regulator.\n");
> +		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
> +				IMX6SX_GPR12_RX_EQ_MASK, IMX6SX_GPR12_RX_EQ_2);
> +	}
>  
>  	regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
>  			IMX6Q_GPR12_PCIE_CTL_2, 0 << 10);
> @@ -319,7 +381,7 @@ static void imx6_pcie_init_phy(struct pcie_port *pp)
>  	regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
>  			IMX6Q_GPR12_DEVICE_TYPE, PCI_EXP_TYPE_ROOT_PORT << 12);
>  	regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
> -			IMX6Q_GPR12_LOS_LEVEL, 9 << 4);
> +			IMX6Q_GPR12_LOS_LEVEL, IMX6Q_GPR12_LOS_LEVEL_9);
>  
>  	regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
>  			IMX6Q_GPR8_TX_DEEMPH_GEN1, 0 << 0);
> @@ -377,7 +439,8 @@ static int imx6_pcie_start_link(struct pcie_port *pp)
>  
>  	/* Start LTSSM. */
>  	regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
> -			IMX6Q_GPR12_PCIE_CTL_2, 1 << 10);
> +			IMX6Q_GPR12_PCIE_CTL_2,
> +			IMX6Q_GPR12_PCIE_CTL_2);
>  
>  	ret = imx6_pcie_wait_for_link(pp);
>  	if (ret)
> @@ -553,9 +616,50 @@ static int __init imx6_add_pcie_port(struct pcie_port *pp,
>  	return 0;
>  }
>  
> +#ifdef CONFIG_PM_SLEEP
> +static int pci_imx_suspend(void)
> +{
> +	if (is_imx6sx_pcie(imx6_pcie)) {
> +		/* PM_TURN_OFF */
> +		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
> +				IMX6SX_GPR12_PCIE_PM_TURN_OFF,
> +				IMX6SX_GPR12_PCIE_PM_TURN_OFF);
> +		udelay(10);
> +		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
> +				IMX6SX_GPR12_PCIE_PM_TURN_OFF, 0 << 16);

Just use 0 as the last argument. Those shifts aren't adding anything and
I would like to get rid of them long term, so please don't introduce new
ones.

> +	}
> +
> +	return 0;
> +}
> +
> +static void pci_imx_resume(void)
> +{
> +	struct pcie_port *pp = &imx6_pcie->pp;
> +
> +	if (is_imx6sx_pcie(imx6_pcie)) {
> +		/* Reset iMX6SX PCIe */
> +		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR5,
> +				IMX6SX_GPR5_PCIE_PERST, IMX6SX_GPR5_PCIE_PERST);
> +		regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR5,
> +				IMX6SX_GPR5_PCIE_PERST, 0 << 18);
> +		/*
> +		 * controller maybe turn off, re-configure again
> +		 */
> +		dw_pcie_setup_rc(pp);
> +
> +		if (IS_ENABLED(CONFIG_PCI_MSI))
> +			dw_pcie_msi_cfg_restore(pp);
> +	}
> +}
> +
> +static struct syscore_ops pci_imx_syscore_ops = {
> +	.suspend = pci_imx_suspend,
> +	.resume = pci_imx_resume,
> +};
> +#endif
> +
>  static int __init imx6_pcie_probe(struct platform_device *pdev)
>  {
> -	struct imx6_pcie *imx6_pcie;
>  	struct pcie_port *pp;
>  	struct device_node *np = pdev->dev.of_node;
>  	struct resource *dbi_base;
> @@ -610,9 +714,27 @@ static int __init imx6_pcie_probe(struct platform_device *pdev)
>  		return PTR_ERR(imx6_pcie->pcie);
>  	}
>  
> -	/* Grab GPR config register range */
> -	imx6_pcie->iomuxc_gpr =
> -		 syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr");
> +	if (is_imx6sx_pcie(imx6_pcie)) {
> +		imx6_pcie->disp_axi = devm_clk_get(&pdev->dev, "disp_axi");
> +		if (IS_ERR(imx6_pcie->disp_axi)) {
> +			dev_err(&pdev->dev,
> +				"pcie clock source missing or invalid\n");
> +			return PTR_ERR(imx6_pcie->disp_axi);
> +		}
> +
> +		imx6_pcie->pcie_regulator = devm_regulator_get(pp->dev,
> +				"pcie_phy");
> +
> +		imx6_pcie->iomuxc_gpr =
> +			 syscon_regmap_lookup_by_compatible
> +			 ("fsl,imx6sx-iomuxc-gpr");
> +		imx6_pcie->gpc_ips_reg =
> +			 syscon_regmap_lookup_by_compatible("fsl,imx6sx-gpc");
> +	} else {
> +		imx6_pcie->iomuxc_gpr =
> +			syscon_regmap_lookup_by_compatible
> +			("fsl,imx6q-iomuxc-gpr");
> +	}
>  	if (IS_ERR(imx6_pcie->iomuxc_gpr)) {
>  		dev_err(&pdev->dev, "unable to find iomuxc registers\n");
>  		return PTR_ERR(imx6_pcie->iomuxc_gpr);
> @@ -623,6 +745,9 @@ static int __init imx6_pcie_probe(struct platform_device *pdev)
>  		return ret;
>  
>  	platform_set_drvdata(pdev, imx6_pcie);
> +#ifdef CONFIG_PM_SLEEP
> +	register_syscore_ops(&pci_imx_syscore_ops);
> +#endif
>  	return 0;
>  }
>  
> @@ -636,6 +761,7 @@ static void imx6_pcie_shutdown(struct platform_device *pdev)
>  
>  static const struct of_device_id imx6_pcie_of_match[] = {
>  	{ .compatible = "fsl,imx6q-pcie", },
> +	{ .compatible = "fsl,imx6sx-pcie", },
>  	{},
>  };
>  MODULE_DEVICE_TABLE(of, imx6_pcie_of_match);

-- 
Pengutronix e.K.             | Lucas Stach                 |
Industrial Linux Solutions   | http://www.pengutronix.de/  |


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v3 8/9] PCI: designware: refine setup_rc and add msi data restore
  2014-09-29  5:03 ` [PATCH v3 8/9] PCI: designware: refine setup_rc and add msi data restore Richard Zhu
@ 2014-09-29 10:26   ` Lucas Stach
  0 siblings, 0 replies; 18+ messages in thread
From: Lucas Stach @ 2014-09-29 10:26 UTC (permalink / raw)
  To: Richard Zhu; +Cc: linux-pci-owner, linux-pci, shawn.guo, festevam, tharvey

Am Montag, den 29.09.2014, 13:03 +0800 schrieb Richard Zhu:
> - move "program correct class for RC" from dw_pcie_host_init()
> to dw_pcie_setup_rc(). since this is RC setup, it's
> better to contained in dw_pcie_setup_rc function.
> Then, RC can be re-setup really by dw_pcie_setup_rc().
> - add one re-store msi data function. Because that
> pcie controller maybe powered off during system suspend,
> and the msi data configuration would be lost.
> this functions can be used to restore the msi data
> during the resume callback.
> 

Those are two independent changes. So split into two patches. Also you
are using the msi restore function in your imx6sx enable patch, so this
needs to earlier in the series in order to not break compilation.

> Signed-off-by: Richard Zhu <r65037@freescale.com>
> ---
>  drivers/pci/host/pcie-designware.c | 15 ++++++++++++---
>  drivers/pci/host/pcie-designware.h |  1 +
>  2 files changed, 13 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c
> index 538bbf3..ae1e6c5 100644
> --- a/drivers/pci/host/pcie-designware.c
> +++ b/drivers/pci/host/pcie-designware.c
> @@ -194,6 +194,13 @@ void dw_pcie_msi_init(struct pcie_port *pp)
>  	dw_pcie_wr_own_conf(pp, PCIE_MSI_ADDR_HI, 4, 0);
>  }
>  
> +void dw_pcie_msi_cfg_restore(struct pcie_port *pp)
> +{
> +	dw_pcie_wr_own_conf(pp, PCIE_MSI_ADDR_LO, 4,
> +			virt_to_phys((void *)pp->msi_data));
> +	dw_pcie_wr_own_conf(pp, PCIE_MSI_ADDR_HI, 4, 0);
> +}
> +
>  static int find_valid_pos0(struct pcie_port *pp, int msgvec, int pos, int *pos0)
>  {
>  	int flag = 1;
> @@ -570,9 +577,6 @@ int __init dw_pcie_host_init(struct pcie_port *pp)
>  
>  	dw_pcie_wr_own_conf(pp, PCI_BASE_ADDRESS_0, 4, 0);
>  
> -	/* program correct class for RC */
> -	dw_pcie_wr_own_conf(pp, PCI_CLASS_DEVICE, 2, PCI_CLASS_BRIDGE_PCI);
> -
>  	dw_pcie_rd_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, &val);
>  	val |= PORT_LOGIC_SPEED_CHANGE;
>  	dw_pcie_wr_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, val);
> @@ -917,6 +921,11 @@ void dw_pcie_setup_rc(struct pcie_port *pp)
>  	val = memlimit | membase;
>  	dw_pcie_writel_rc(pp, val, PCI_MEMORY_BASE);
>  
> +	/* program correct class for RC */
> +	dw_pcie_readl_rc(pp, PCI_CLASS_REVISION, &val);
> +	val |= PCI_CLASS_BRIDGE_PCI << 16;
> +	dw_pcie_writel_rc(pp, val, PCI_CLASS_REVISION);
> +
You don't need this read-modify-write dance and the shift if you only
access the upper word of the register. The call you are removing does
exactly the right thing, please don't change it, just move it.

>  	/* setup command register */
>  	dw_pcie_readl_rc(pp, PCI_COMMAND, &val);
>  	val &= 0xffff0000;
> diff --git a/drivers/pci/host/pcie-designware.h b/drivers/pci/host/pcie-designware.h
> index a476e60..bb75715 100644
> --- a/drivers/pci/host/pcie-designware.h
> +++ b/drivers/pci/host/pcie-designware.h
> @@ -83,6 +83,7 @@ int dw_pcie_cfg_read(void __iomem *addr, int where, int size, u32 *val);
>  int dw_pcie_cfg_write(void __iomem *addr, int where, int size, u32 val);
>  irqreturn_t dw_handle_msi_irq(struct pcie_port *pp);
>  void dw_pcie_msi_init(struct pcie_port *pp);
> +void dw_pcie_msi_cfg_restore(struct pcie_port *pp);
>  int dw_pcie_link_up(struct pcie_port *pp);
>  void dw_pcie_setup_rc(struct pcie_port *pp);
>  int dw_pcie_host_init(struct pcie_port *pp);

-- 
Pengutronix e.K.             | Lucas Stach                 |
Industrial Linux Solutions   | http://www.pengutronix.de/  |


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH v3 9/9] PCI: imx6: Fix possible dead lock
  2014-09-29  5:03 ` [PATCH v3 9/9] PCI: imx6: Fix possible dead lock Richard Zhu
@ 2014-09-29 10:38   ` Lucas Stach
  0 siblings, 0 replies; 18+ messages in thread
From: Lucas Stach @ 2014-09-29 10:38 UTC (permalink / raw)
  To: Richard Zhu; +Cc: linux-pci-owner, linux-pci, shawn.guo, festevam, tharvey

Am Montag, den 29.09.2014, 13:03 +0800 schrieb Richard Zhu:
> kernel report one possible dead lock during imx6sx pcie
> suspend resume stress tests, after enable Lock Debugging.
> platform: imx6sx sdb board + xhci(pcie2usb3.0 ep)
> 
> reason: usleep_range used in imx6_pcie_link_up maybe scheduled
> out from dw_pcie_valid_config.isra...
> About details, please see the following logs.
> 
> solution: replace the usleep_range(1000, 2000) by udelay(10) and
> enlarge the loop counter.
> 
I don't like this change, as we eat one CPU just to work around a
slightly wrong behavior of the link-up signaling. I had a look at the
code in question and it seems there are more things that need different
handling in there. I'll post a patch to resolve the deadlock without
using a udelay shortly.

Regards,
Lucas

> logs:
> [   50.643062] xhci_hcd 0000:01:00.0: Refused to change power state, currently in D3
> [   50.653390]
> [   50.654898] =========================================================
> [   50.661343] [ INFO: possible irq lock inversion dependency detected ]
> [   50.667792] 3.17.0-rc2-01341-gfc43ff7-dirty #101 Not tainted
> [   50.673454] ---------------------------------------------------------
> [   50.679898] kworker/u2:2/48 just changed the state of lock:
> [   50.685477]  (pci_lock){+.....}, at: [<802d650c>] pci_bus_read_config_dword+0x44/0x94
> [   50.693394] but this lock was taken by another, HARDIRQ-safe lock in the past:
> [   50.700619]  (&irq_desc_lock_class){-.-...}
> 
> and interrupts could create inverse lock ordering between them.
> 
> [   50.710843]
> [   50.710843] other info that might help us debug this:
> [   50.717377]  Possible interrupt unsafe locking scenario:
> [   50.717377]
> [   50.724169]        CPU0                    CPU1
> [   50.728702]        ----                    ----
> [   50.733234]   lock(pci_lock);
> [   50.736232]                                local_irq_disable();
> [   50.742154]                                lock(&irq_desc_lock_class);
> [   50.748713]                                lock(pci_lock);
> [   50.754229]   <Interrupt>
> [   50.756852]     lock(&irq_desc_lock_class);
> [   50.761065]
> [   50.761065]  *** DEADLOCK ***
> ...
> 
> [   52.119515] [<806e8ad0>] (schedule_hrtimeout_range) from [<80077e90>] (usleep_range+0x50/0x58)
> [   52.128141] [<80077e40>] (usleep_range) from [<802f3694>] (imx6_pcie_link_up+0x48/0x16c)
> [   52.136242] [<802f364c>] (imx6_pcie_link_up) from [<802f1b74>] (dw_pcie_valid_config.isra.10+0x40/0x7c)
> [   52.145637]  r6:ae72606d r5:ae72606c r4:ae711228
> [   52.150311] [<802f1b34>] (dw_pcie_valid_config.isra.10) from [<802f1ca8>] (dw_pcie_rd_conf+0x4c/0x154)
> [   52.159620]  r7:00000000 r6:00000000 r5:ae711228 r4:ae726000
> [   52.165355] [<802f1c5c>] (dw_pcie_rd_conf) from [<802d6534>] (pci_bus_read_config_dword+0x6c/0x94)
> [   52.174316]  r9:adf4e910 r8:809bc51c r7:00000000 r6:60000153 r5:adc3fd5c r4:ae726000
> [   52.182152] [<802d64c8>] (pci_bus_read_config_dword) from [<802db588>] (pci_restore_config_dword+0x54/0xa4)
> [   52.191894]  r6:00000024 r5:0000000a r4:ae61e000
> [   52.196570] [<802db534>] (pci_restore_config_dword) from [<802dd150>] (pci_restore_state.part.37+0x7c/0x1f8)
> [   52.206399]  r8:802e086c r7:ae61dfe8 r6:519e2024 r5:ae61e000 r4:ae61dffc
> [   52.213187] [<802dd0d4>] (pci_restore_state.part.37) from [<802dd2e8>] (pci_restore_state+0x1c/0x20)
> [   52.222322]  r7:adc3fea8 r6:809d90e0 r5:ae61e000 r4:ae61e068
> [   52.228056] [<802dd2cc>] (pci_restore_state) from [<802e0894>] (pci_pm_resume_noirq+0x28/0xa4)
> [   52.236683] [<802e086c>] (pci_pm_resume_noirq) from [<8037ea1c>] (dpm_run_callback.isra.12+0x34/0x7c)
> 
> Signed-off-by: Richard Zhu <r65037@freescale.com>
> ---
>  drivers/pci/host/pci-imx6.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c
> index be953aa..e60c195 100644
> --- a/drivers/pci/host/pci-imx6.c
> +++ b/drivers/pci/host/pci-imx6.c
> @@ -521,7 +521,7 @@ static void imx6_pcie_reset_phy(struct pcie_port *pp)
>  static int imx6_pcie_link_up(struct pcie_port *pp)
>  {
>  	u32 rc, debug_r0, rx_valid;
> -	int count = 5;
> +	int count = 500;
>  
>  	/*
>  	 * Test if the PHY reports that the link is up and also that the LTSSM
> @@ -552,7 +552,7 @@ static int imx6_pcie_link_up(struct pcie_port *pp)
>  		 * Wait a little bit, then re-check if the link finished
>  		 * the training.
>  		 */
> -		usleep_range(1000, 2000);
> +		udelay(10);
>  	}
>  	/*
>  	 * From L0, initiate MAC entry to gen2 if EP/RC supports gen2.

-- 
Pengutronix e.K.             | Lucas Stach                 |
Industrial Linux Solutions   | http://www.pengutronix.de/  |


^ permalink raw reply	[flat|nested] 18+ messages in thread

* RE: [PATCH v3 2/9] PCI: imx6: enable pcie on imx6qdl sabreauto
  2014-09-29  9:56   ` Lucas Stach
@ 2014-09-30  2:18     ` Hong-Xing.Zhu
  0 siblings, 0 replies; 18+ messages in thread
From: Hong-Xing.Zhu @ 2014-09-30  2:18 UTC (permalink / raw)
  To: Lucas Stach; +Cc: linux-pci-owner, linux-pci, Shengchao Guo, festevam, tharvey

DQoNCkJlc3QgUmVnYXJkcw0KUmljaGFyZCBaaHUNCg0KPiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2Ut
LS0tLQ0KPiBGcm9tOiBMdWNhcyBTdGFjaCBbbWFpbHRvOmwuc3RhY2hAcGVuZ3V0cm9uaXguZGVd
DQo+IFNlbnQ6IE1vbmRheSwgU2VwdGVtYmVyIDI5LCAyMDE0IDU6NTcgUE0NCj4gVG86IFpodSBS
aWNoYXJkLVI2NTAzNw0KPiBDYzogbGludXgtcGNpLW93bmVyQHZnZXIua2VybmVsLm9yZzsgbGlu
dXgtcGNpQHZnZXIua2VybmVsLm9yZzsgR3VvIFNoYXduLQ0KPiBSNjUwNzM7IGZlc3RldmFtQGdt
YWlsLmNvbTsgdGhhcnZleUBnYXRld29ya3MuY29tDQo+IFN1YmplY3Q6IFJlOiBbUEFUQ0ggdjMg
Mi85XSBQQ0k6IGlteDY6IGVuYWJsZSBwY2llIG9uIGlteDZxZGwgc2FicmVhdXRvDQo+IA0KPiBB
bSBNb250YWcsIGRlbiAyOS4wOS4yMDE0LCAxMzowMyArMDgwMCBzY2hyaWViIFJpY2hhcmQgWmh1
Og0KPiA+IC0gZW5hYmxlIHBjaWUgb24gaW14NnFkbCBzYWJyZWF1dG8gYm9hcmRzLg0KPiA+DQo+
ID4gU2lnbmVkLW9mZi1ieTogUmljaGFyZCBaaHUgPHI2NTAzN0BmcmVlc2NhbGUuY29tPg0KPiA+
IFJldmlld2VkLWJ5OiBMdWNhcyBTdGFjaCA8bC5zdGFjaEBwZW5ndXRyb25peC5kZT4NCj4gPiAt
LS0NCj4gPiAgYXJjaC9hcm0vYm9vdC9kdHMvaW14NnFkbC1zYWJyZWF1dG8uZHRzaSB8IDQgKysr
Kw0KPiA+ICAxIGZpbGUgY2hhbmdlZCwgNCBpbnNlcnRpb25zKCspDQo+ID4NCj4gPiBkaWZmIC0t
Z2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnFkbC1zYWJyZWF1dG8uZHRzaQ0KPiA+IGIvYXJj
aC9hcm0vYm9vdC9kdHMvaW14NnFkbC1zYWJyZWF1dG8uZHRzaQ0KPiA+IGluZGV4IDAwOWFiZDYu
LmQ2MDQwYTUgMTAwNjQ0DQo+ID4gLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnFkbC1zYWJy
ZWF1dG8uZHRzaQ0KPiA+ICsrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZxZGwtc2FicmVhdXRv
LmR0c2kNCj4gPiBAQCAtNDEwLDYgKzQxMCwxMCBAQA0KPiA+ICAJfTsNCj4gPiAgfTsNCj4gPg0K
PiA+ICsmcGNpZSB7DQo+ID4gKwlzdGF0dXMgPSAib2theSI7DQo+ID4gK307DQo+ID4gKw0KPiA+
ICAmcHdtMyB7DQo+ID4gIAlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOw0KPiA+ICAJcGluY3Ry
bC0wID0gPCZwaW5jdHJsX3B3bTM+Ow0KPiANCj4gVGhlIGR0cyBjaGFuZ2VzIGhhdmUgYSB3cm9u
ZyBwcmVmaXguIFRoZXkgYXJlIG5vdCBQQ0kgc3Vic3lzdGVtIHBhdGNoZXMsIGJ1dA0KPiBhcmNo
IHBhdGNoZXMgZm9yIGkuTVggYW5kIHNob3VsZCBiZSBhcHBsaWVkIGJ5IFNoYXduLiBTbyBwcmVm
aXggbmVlZHMgdG8gYmUNCj4gQVJNOiBpbXg2WFg6IC4uLg0KPiANCj4gQWxzbyBJIHdvdWxkIHJl
Y29tbWVuZCB0aGF0IHlvdSBzb3J0IHRoZW0gdG8gdGhlIGVuZCBvZiB0aGUgc2VyaWVzIHNvIG1h
a2UgaXQNCj4gZWFzeSBmb3IgQmpvcm4gYW5kIFNoYXduIHRvIHNlZSB3aGVyZSB0aGUgc2xpdCBi
ZXR3ZWVuIHRoZSB0d28gaXMuIERvbid0DQo+IGludGVybWl4IHRob3NlIGNoYW5nZXMgaW4gdGhl
IHNlcmllcywgaXQgY2VydGFpbmx5IGlzbid0IG5lZWRlZCBoZXJlLg0KPiANCltSaWNoYXJkXSBP
aywgbm8gcHJvYmxlbS4gVGhhbmtzLg0KPiBSZWdhcmRzLA0KPiBMdWNhcw0KPiAtLQ0KPiBQZW5n
dXRyb25peCBlLksuICAgICAgICAgICAgIHwgTHVjYXMgU3RhY2ggICAgICAgICAgICAgICAgIHwN
Cj4gSW5kdXN0cmlhbCBMaW51eCBTb2x1dGlvbnMgICB8IGh0dHA6Ly93d3cucGVuZ3V0cm9uaXgu
ZGUvICB8DQoNCg==

^ permalink raw reply	[flat|nested] 18+ messages in thread

* RE: [PATCH v3 7/9] PCI: imx6: add imx6sx pcie support
  2014-09-29 10:18   ` Lucas Stach
@ 2014-09-30  2:37     ` Hong-Xing.Zhu
  0 siblings, 0 replies; 18+ messages in thread
From: Hong-Xing.Zhu @ 2014-09-30  2:37 UTC (permalink / raw)
  To: Lucas Stach; +Cc: linux-pci-owner, linux-pci, Shengchao Guo, festevam, tharvey

SGkgTHVjYXM6DQpUaGFua3MgZm9yIHlvdXIgcmV2aWV3IGNvbW1lbnRzLg0KDQo+IC0tLS0tT3Jp
Z2luYWwgTWVzc2FnZS0tLS0tDQo+IEZyb206IEx1Y2FzIFN0YWNoIFttYWlsdG86bC5zdGFjaEBw
ZW5ndXRyb25peC5kZV0NCj4gU2VudDogTW9uZGF5LCBTZXB0ZW1iZXIgMjksIDIwMTQgNjoxOSBQ
TQ0KPiBUbzogWmh1IFJpY2hhcmQtUjY1MDM3DQo+IENjOiBsaW51eC1wY2ktb3duZXJAdmdlci5r
ZXJuZWwub3JnOyBsaW51eC1wY2lAdmdlci5rZXJuZWwub3JnOyBHdW8gU2hhd24tDQo+IFI2NTA3
MzsgZmVzdGV2YW1AZ21haWwuY29tOyB0aGFydmV5QGdhdGV3b3Jrcy5jb20NCj4gU3ViamVjdDog
UmU6IFtQQVRDSCB2MyA3LzldIFBDSTogaW14NjogYWRkIGlteDZzeCBwY2llIHN1cHBvcnQNCj4g
DQo+IEFtIE1vbnRhZywgZGVuIDI5LjA5LjIwMTQsIDEzOjAzICswODAwIHNjaHJpZWIgUmljaGFy
ZCBaaHU6DQo+ID4gLSBpbXg2c3ggcGNpZSBoYXMgaXRzIG93biBzdGFuZGFsb25lIHBjaWUgcG93
ZXIgc3VwcGx5Lg0KPiA+IEluIG9yZGVyIHRvIHR1cm4gb24gdGhlIGlteDZzeCBwY2llIHBvd2Vy
IGR1cmluZyBpbml0aWFsaXphdGlvbi4gQWRkDQo+ID4gdGhlIHBjaWUgcmVndWxhdG9yIGFuZCB0
aGUgZ3BjIHJlZ21hcCBpbnRvIHRoZSBpbXg2c3ggcGNpZSBzdHJ1Y3R1cmUuDQo+ID4gLSBpbXg2
c3ggcGNpZSBoYXMgdGhlIG5ldyBhZGRlZCByZXNldCBtZWNoYW5pc20sIGFkZCB0aGUgcmVzZXQN
Cj4gPiBvcGVyYXRpb25zIGludG8gdGhlIGluaXRpYWxpemF0aW9uLg0KPiA+IC0gUmVnaXN0ZXIg
b25lIFBNIGNhbGwtYmFjaywgZW50ZXIvZXhpdCBMMiBzdGF0ZSBvZiB0aGUgQVNQTSBkdXJpbmcN
Cj4gPiBzeXN0ZW0gc3VzcGVuZC9yZXN1bWUuDQo+ID4gLSBkaXNwX2F4aSBjbG9jayBpcyByZXF1
aXJlZCBieSBwY2llIGluYm91bmQgYXhpIHBvcnQgYWN0dWFsbHkuDQo+ID4gQWRkIG9uZSBtb3Jl
IGNsb2NrIGZvciBpbXg2c3ggcGNpZS4NCj4gPg0KPiA+IFNpZ25lZC1vZmYtYnk6IFJpY2hhcmQg
Wmh1IDxyNjUwMzdAZnJlZXNjYWxlLmNvbT4NCj4gPiAtLS0NCj4gPiAgZHJpdmVycy9wY2kvaG9z
dC9wY2ktaW14Ni5jIHwgMTYyDQo+ID4gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr
KysrKysrLS0tLS0NCj4gPiAgMSBmaWxlIGNoYW5nZWQsIDE0NCBpbnNlcnRpb25zKCspLCAxOCBk
ZWxldGlvbnMoLSkNCj4gPg0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1p
bXg2LmMgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS1pbXg2LmMNCj4gPiBpbmRleCBlYWM5NmZiLi5i
ZTk1M2FhIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWlteDYuYw0KPiA+
ICsrKyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWlteDYuYw0KPiA+IEBAIC0xOCwxMiArMTgsMTYg
QEANCj4gPiAgI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4NCj4gPiAgI2luY2x1ZGUgPGxp
bnV4L21mZC9zeXNjb24vaW14NnEtaW9tdXhjLWdwci5oPg0KPiA+ICAjaW5jbHVkZSA8bGludXgv
bW9kdWxlLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+DQo+IA0KPiBXaHkg
ZG8geW91IG5lZWQgdGhpcyBpbmNsdWRlPw0KW1JpY2hhcmRdSXQncyBub3QgcmVxdWlyZWQgYW55
bW9yZSwgd291bGQgYmUgcmVtb3ZlZCBsYXRlci4NCj4gDQo+ID4gKyNpbmNsdWRlIDxsaW51eC9v
Zl9kZXZpY2UuaD4NCj4gPiAgI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4NCj4gPiAgI2luY2x1
ZGUgPGxpbnV4L3BjaS5oPg0KPiA+ICAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+
DQo+ID4gICNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L3Jl
Z3VsYXRvci9jb25zdW1lci5oPg0KPiA+ICAjaW5jbHVkZSA8bGludXgvcmVzb3VyY2UuaD4NCj4g
PiAgI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvc3lzY29y
ZV9vcHMuaD4NCj4gPiAgI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+DQo+ID4gICNpbmNsdWRlIDxs
aW51eC9pbnRlcnJ1cHQuaD4NCj4gPg0KPiA+IEBAIC0zNSwxMSArMzksMTUgQEAgc3RydWN0IGlt
eDZfcGNpZSB7DQo+ID4gIAlpbnQJCQlyZXNldF9ncGlvOw0KPiA+ICAJc3RydWN0IGNsawkJKnBj
aWVfYnVzOw0KPiA+ICAJc3RydWN0IGNsawkJKnBjaWVfcGh5Ow0KPiA+ICsJc3RydWN0IGNsawkJ
KmRpc3BfYXhpOw0KPiANCj4gVGhpcyBuZWVkcyBhIG1vcmUgZGVzY3JpcHRpdmUgbmFtZSwganVz
dCBsaWtlIHRoZSBiaW5kaW5nLg0KW1JpY2hhcmRdaG93IGFib3V0IGxpa2UgInBjaWVfYXhpX2lu
Ym91bmQiPw0KPiANCj4gPiAgCXN0cnVjdCBjbGsJCSpwY2llOw0KPiA+ICAJc3RydWN0IHBjaWVf
cG9ydAlwcDsNCj4gPiAgCXN0cnVjdCByZWdtYXAJCSppb211eGNfZ3ByOw0KPiA+ICsJc3RydWN0
IHJlZ21hcAkJKmdwY19pcHNfcmVnOw0KPiA+ICsJc3RydWN0IHJlZ3VsYXRvcgkqcGNpZV9yZWd1
bGF0b3I7DQo+ID4gIAl2b2lkIF9faW9tZW0JCSptZW1fYmFzZTsNCj4gPiAgfTsNCj4gPiArc3Rh
dGljIHN0cnVjdCBpbXg2X3BjaWUgKmlteDZfcGNpZTsNCj4gPg0KPiA+ICAvKiBQQ0llIFJvb3Qg
Q29tcGxleCByZWdpc3RlcnMgKG1lbW9yeS1tYXBwZWQpICovDQo+ID4gICNkZWZpbmUgUENJRV9S
Q19MQ1IJCQkJMHg3Yw0KPiA+IEBAIC03Nyw2ICs4NSwxOCBAQCBzdHJ1Y3QgaW14Nl9wY2llIHsN
Cj4gPiAgI2RlZmluZSBQSFlfUlhfT1ZSRF9JTl9MT19SWF9EQVRBX0VOICgxIDw8IDUpICAjZGVm
aW5lDQo+ID4gUEhZX1JYX09WUkRfSU5fTE9fUlhfUExMX0VOICgxIDw8IDMpDQo+ID4NCj4gPiAr
LyogR1BDIFBDSUUgUEhZIGJpdCBkZWZpbml0aW9ucyAqLw0KPiA+ICsjZGVmaW5lIEdQQ19DTlRS
CQkJMA0KPiA+ICsjZGVmaW5lIEdQQ19DTlRSX1BDSUVfUEhZX1BVUF9SRVEJQklUKDcpDQo+ID4g
Kw0KPiA+ICtzdGF0aWMgaW5saW5lIGJvb2wgaXNfaW14NnN4X3BjaWUoc3RydWN0IGlteDZfcGNp
ZSAqaW14Nl9wY2llKSB7DQo+ID4gKwlzdHJ1Y3QgcGNpZV9wb3J0ICpwcCA9ICZpbXg2X3BjaWUt
PnBwOw0KPiA+ICsJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBwLT5kZXYtPm9mX25vZGU7DQo+
ID4gKw0KPiA+ICsJcmV0dXJuIG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLGlteDZz
eC1wY2llIik7IH0NCj4gPiArDQo+ID4gIHN0YXRpYyBpbnQgcGNpZV9waHlfcG9sbF9hY2sodm9p
ZCBfX2lvbWVtICpkYmlfYmFzZSwgaW50IGV4cF92YWwpICB7DQo+ID4gIAl1MzIgdmFsOw0KPiA+
IEBAIC0yNzUsMTggKzI5NSwyOSBAQCBzdGF0aWMgaW50IGlteDZfcGNpZV9kZWFzc2VydF9jb3Jl
X3Jlc2V0KHN0cnVjdA0KPiBwY2llX3BvcnQgKnBwKQ0KPiA+ICAJCWdvdG8gZXJyX3BjaWU7DQo+
ID4gIAl9DQo+ID4NCj4gPiAtCS8qIHBvd2VyIHVwIGNvcmUgcGh5IGFuZCBlbmFibGUgcmVmIGNs
b2NrICovDQo+ID4gLQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJ
T01VWENfR1BSMSwNCj4gPiAtCQkJSU1YNlFfR1BSMV9QQ0lFX1RFU1RfUEQsIDAgPDwgMTgpOw0K
PiA+IC0JLyoNCj4gPiAtCSAqIHRoZSBhc3luYyByZXNldCBpbnB1dCBuZWVkIHJlZiBjbG9jayB0
byBzeW5jIGludGVybmFsbHksDQo+ID4gLQkgKiB3aGVuIHRoZSByZWYgY2xvY2sgY29tZXMgYWZ0
ZXIgcmVzZXQsIGludGVybmFsIHN5bmNlZA0KPiA+IC0JICogcmVzZXQgdGltZSBpcyB0b28gc2hv
cnQgLCBjYW5ub3QgbWVldCB0aGUgcmVxdWlyZW1lbnQuDQo+ID4gLQkgKiBhZGQgb25lIH4xMHVz
IGRlbGF5IGhlcmUuDQo+ID4gLQkgKi8NCj4gPiAtCXVkZWxheSgxMCk7DQo+ID4gLQlyZWdtYXBf
dXBkYXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJT01VWENfR1BSMSwNCj4gPiAtCQkJ
SU1YNlFfR1BSMV9QQ0lFX1JFRl9DTEtfRU4sIDEgPDwgMTYpOw0KPiA+ICsJaWYgKGlzX2lteDZz
eF9wY2llKGlteDZfcGNpZSkpIHsNCj4gPiArCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoaW14
Nl9wY2llLT5kaXNwX2F4aSk7DQo+ID4gKwkJaWYgKHJldCkgew0KPiA+ICsJCQlkZXZfZXJyKHBw
LT5kZXYsICJ1bmFibGUgdG8gZW5hYmxlIHBjaWUgY2xvY2tcbiIpOw0KPiA+ICsJCQlnb3RvIGVy
cl9kaXNwOw0KPiA+ICsJCX0NCj4gPiArDQo+ID4gKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGlteDZf
cGNpZS0+aW9tdXhjX2dwciwgSU9NVVhDX0dQUjEyLA0KPiA+ICsJCQkJSU1YNlNYX0dQUjEyX1BD
SUVfVEVTVF9QRCwgMCA8PCAzMCk7DQo+ID4gKwl9IGVsc2Ugew0KPiA+ICsJCS8qIHBvd2VyIHVw
IGNvcmUgcGh5IGFuZCBlbmFibGUgcmVmIGNsb2NrICovDQo+ID4gKwkJcmVnbWFwX3VwZGF0ZV9i
aXRzKGlteDZfcGNpZS0+aW9tdXhjX2dwciwgSU9NVVhDX0dQUjEsDQo+ID4gKwkJCQlJTVg2UV9H
UFIxX1BDSUVfVEVTVF9QRCwgMCA8PCAxOCk7DQo+ID4gKwkJLyoNCj4gPiArCQkgKiB0aGUgYXN5
bmMgcmVzZXQgaW5wdXQgbmVlZCByZWYgY2xvY2sgdG8gc3luYyBpbnRlcm5hbGx5LA0KPiA+ICsJ
CSAqIHdoZW4gdGhlIHJlZiBjbG9jayBjb21lcyBhZnRlciByZXNldCwgaW50ZXJuYWwgc3luY2Vk
DQo+ID4gKwkJICogcmVzZXQgdGltZSBpcyB0b28gc2hvcnQgLCBjYW5ub3QgbWVldCB0aGUgcmVx
dWlyZW1lbnQuDQo+ID4gKwkJICogYWRkIG9uZSB+MTB1cyBkZWxheSBoZXJlLg0KPiA+ICsJCSAq
Lw0KPiA+ICsJCXVkZWxheSgxMCk7DQo+ID4gKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGlteDZfcGNp
ZS0+aW9tdXhjX2dwciwgSU9NVVhDX0dQUjEsDQo+ID4gKwkJCQlJTVg2UV9HUFIxX1BDSUVfUkVG
X0NMS19FTiwgMSA8PCAxNik7DQo+ID4gKwl9DQo+ID4NCj4gPiAgCS8qIGFsbG93IHRoZSBjbG9j
a3MgdG8gc3RhYmlsaXplICovDQo+ID4gIAl1c2xlZXBfcmFuZ2UoMjAwLCA1MDApOw0KPiA+IEBA
IC0yOTcsOCArMzI4LDE5IEBAIHN0YXRpYyBpbnQgaW14Nl9wY2llX2RlYXNzZXJ0X2NvcmVfcmVz
ZXQoc3RydWN0DQo+IHBjaWVfcG9ydCAqcHApDQo+ID4gIAkJbXNsZWVwKDEwMCk7DQo+ID4gIAkJ
Z3Bpb19zZXRfdmFsdWUoaW14Nl9wY2llLT5yZXNldF9ncGlvLCAxKTsNCj4gPiAgCX0NCj4gPiAr
DQo+ID4gKwkvKg0KPiA+ICsJICogUmVsZWFzZSB0aGUgUENJZSBQSFkgcmVzZXQgaGVyZSwgdGhh
dCB3ZSBoYXZlIHNldCBpbg0KPiA+ICsJICogaW14Nl9wY2llX2luaXRfcGh5KCkgbm93DQo+ID4g
KwkgKi8NCj4gPiArCWlmIChpc19pbXg2c3hfcGNpZShpbXg2X3BjaWUpKQ0KPiA+ICsJCXJlZ21h
cF91cGRhdGVfYml0cyhpbXg2X3BjaWUtPmlvbXV4Y19ncHIsIElPTVVYQ19HUFI1LA0KPiA+ICsJ
CQkJSU1YNlNYX0dQUjVfUENJRV9CVE5SU1QsIDAgPDwgMTkpOw0KPiA+ICsNCj4gPiAgCXJldHVy
biAwOw0KPiA+DQo+ID4gK2Vycl9kaXNwOg0KPiA+ICsJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGlt
eDZfcGNpZS0+cGNpZSk7DQo+ID4gIGVycl9wY2llOg0KPiA+ICAJY2xrX2Rpc2FibGVfdW5wcmVw
YXJlKGlteDZfcGNpZS0+cGNpZV9idXMpOw0KPiA+ICBlcnJfcGNpZV9idXM6DQo+ID4gQEAgLTMx
MSw2ICszNTMsMjYgQEAgZXJyX3BjaWVfcGh5Og0KPiA+ICBzdGF0aWMgdm9pZCBpbXg2X3BjaWVf
aW5pdF9waHkoc3RydWN0IHBjaWVfcG9ydCAqcHApICB7DQo+ID4gIAlzdHJ1Y3QgaW14Nl9wY2ll
ICppbXg2X3BjaWUgPSB0b19pbXg2X3BjaWUocHApOw0KPiA+ICsJaW50IHJldDsNCj4gPiArDQo+
ID4gKwkvKiBQb3dlciB1cCB0aGUgc2VwYXJhdGUgZG9tYWluIGF2YWlsYWJsZSBvbiBpLk1YNlNY
ICovDQo+ID4gKwlpZiAoaXNfaW14NnN4X3BjaWUoaW14Nl9wY2llKSkgew0KPiA+ICsJCS8qIEZv
cmNlIFBDSWUgUEhZIHJlc2V0ICovDQo+ID4gKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGlteDZfcGNp
ZS0+aW9tdXhjX2dwciwgSU9NVVhDX0dQUjUsDQo+ID4gKwkJCQlJTVg2U1hfR1BSNV9QQ0lFX0JU
TlJTVCwNCj4gPiArCQkJCUlNWDZTWF9HUFI1X1BDSUVfQlROUlNUKTsNCj4gPiArDQo+ID4gKwkJ
cmVnbWFwX3VwZGF0ZV9iaXRzKGlteDZfcGNpZS0+Z3BjX2lwc19yZWcsIEdQQ19DTlRSLA0KPiA+
ICsJCQkJR1BDX0NOVFJfUENJRV9QSFlfUFVQX1JFUSwNCj4gPiArCQkJCUdQQ19DTlRSX1BDSUVf
UEhZX1BVUF9SRVEpOw0KPiA+ICsJCXJlZ3VsYXRvcl9zZXRfdm9sdGFnZShpbXg2X3BjaWUtPnBj
aWVfcmVndWxhdG9yLA0KPiA+ICsJCQkJMTEwMDAwMCwgMTEwMDAwMCk7DQo+ID4gKwkJcmV0ID0g
cmVndWxhdG9yX2VuYWJsZShpbXg2X3BjaWUtPnBjaWVfcmVndWxhdG9yKTsNCj4gPiArCQlpZiAo
cmV0KQ0KPiA+ICsJCQlkZXZfaW5mbyhwcC0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBwY2llIHJl
Z3VsYXRvci5cbiIpOw0KPiA+ICsJCXJlZ21hcF91cGRhdGVfYml0cyhpbXg2X3BjaWUtPmlvbXV4
Y19ncHIsIElPTVVYQ19HUFIxMiwNCj4gPiArCQkJCUlNWDZTWF9HUFIxMl9SWF9FUV9NQVNLLCBJ
TVg2U1hfR1BSMTJfUlhfRVFfMik7DQo+ID4gKwl9DQo+ID4NCj4gPiAgCXJlZ21hcF91cGRhdGVf
Yml0cyhpbXg2X3BjaWUtPmlvbXV4Y19ncHIsIElPTVVYQ19HUFIxMiwNCj4gPiAgCQkJSU1YNlFf
R1BSMTJfUENJRV9DVExfMiwgMCA8PCAxMCk7DQo+ID4gQEAgLTMxOSw3ICszODEsNyBAQCBzdGF0
aWMgdm9pZCBpbXg2X3BjaWVfaW5pdF9waHkoc3RydWN0IHBjaWVfcG9ydCAqcHApDQo+ID4gIAly
ZWdtYXBfdXBkYXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJT01VWENfR1BSMTIsDQo+
ID4gIAkJCUlNWDZRX0dQUjEyX0RFVklDRV9UWVBFLCBQQ0lfRVhQX1RZUEVfUk9PVF9QT1JUIDw8
IDEyKTsNCj4gPiAgCXJlZ21hcF91cGRhdGVfYml0cyhpbXg2X3BjaWUtPmlvbXV4Y19ncHIsIElP
TVVYQ19HUFIxMiwNCj4gPiAtCQkJSU1YNlFfR1BSMTJfTE9TX0xFVkVMLCA5IDw8IDQpOw0KPiA+
ICsJCQlJTVg2UV9HUFIxMl9MT1NfTEVWRUwsIElNWDZRX0dQUjEyX0xPU19MRVZFTF85KTsNCj4g
Pg0KPiA+ICAJcmVnbWFwX3VwZGF0ZV9iaXRzKGlteDZfcGNpZS0+aW9tdXhjX2dwciwgSU9NVVhD
X0dQUjgsDQo+ID4gIAkJCUlNWDZRX0dQUjhfVFhfREVFTVBIX0dFTjEsIDAgPDwgMCk7IEBAIC0z
NzcsNyArNDM5LDggQEAgc3RhdGljDQo+IGludA0KPiA+IGlteDZfcGNpZV9zdGFydF9saW5rKHN0
cnVjdCBwY2llX3BvcnQgKnBwKQ0KPiA+DQo+ID4gIAkvKiBTdGFydCBMVFNTTS4gKi8NCj4gPiAg
CXJlZ21hcF91cGRhdGVfYml0cyhpbXg2X3BjaWUtPmlvbXV4Y19ncHIsIElPTVVYQ19HUFIxMiwN
Cj4gPiAtCQkJSU1YNlFfR1BSMTJfUENJRV9DVExfMiwgMSA8PCAxMCk7DQo+ID4gKwkJCUlNWDZR
X0dQUjEyX1BDSUVfQ1RMXzIsDQo+ID4gKwkJCUlNWDZRX0dQUjEyX1BDSUVfQ1RMXzIpOw0KPiA+
DQo+ID4gIAlyZXQgPSBpbXg2X3BjaWVfd2FpdF9mb3JfbGluayhwcCk7DQo+ID4gIAlpZiAocmV0
KQ0KPiA+IEBAIC01NTMsOSArNjE2LDUwIEBAIHN0YXRpYyBpbnQgX19pbml0IGlteDZfYWRkX3Bj
aWVfcG9ydChzdHJ1Y3QgcGNpZV9wb3J0DQo+ICpwcCwNCj4gPiAgCXJldHVybiAwOw0KPiA+ICB9
DQo+ID4NCj4gPiArI2lmZGVmIENPTkZJR19QTV9TTEVFUA0KPiA+ICtzdGF0aWMgaW50IHBjaV9p
bXhfc3VzcGVuZCh2b2lkKQ0KPiA+ICt7DQo+ID4gKwlpZiAoaXNfaW14NnN4X3BjaWUoaW14Nl9w
Y2llKSkgew0KPiA+ICsJCS8qIFBNX1RVUk5fT0ZGICovDQo+ID4gKwkJcmVnbWFwX3VwZGF0ZV9i
aXRzKGlteDZfcGNpZS0+aW9tdXhjX2dwciwgSU9NVVhDX0dQUjEyLA0KPiA+ICsJCQkJSU1YNlNY
X0dQUjEyX1BDSUVfUE1fVFVSTl9PRkYsDQo+ID4gKwkJCQlJTVg2U1hfR1BSMTJfUENJRV9QTV9U
VVJOX09GRik7DQo+ID4gKwkJdWRlbGF5KDEwKTsNCj4gPiArCQlyZWdtYXBfdXBkYXRlX2JpdHMo
aW14Nl9wY2llLT5pb211eGNfZ3ByLCBJT01VWENfR1BSMTIsDQo+ID4gKwkJCQlJTVg2U1hfR1BS
MTJfUENJRV9QTV9UVVJOX09GRiwgMCA8PCAxNik7DQo+IA0KPiBKdXN0IHVzZSAwIGFzIHRoZSBs
YXN0IGFyZ3VtZW50LiBUaG9zZSBzaGlmdHMgYXJlbid0IGFkZGluZyBhbnl0aGluZyBhbmQgSQ0K
PiB3b3VsZCBsaWtlIHRvIGdldCByaWQgb2YgdGhlbSBsb25nIHRlcm0sIHNvIHBsZWFzZSBkb24n
dCBpbnRyb2R1Y2UgbmV3IG9uZXMuDQo+IA0KW1JpY2hhcmRdIE9rLCBhbGwgdGhlc2Ugc2hpZnRz
IHdvdWxkbid0IGJlIHJlbW92ZWQuDQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJcmV0dXJuIDA7DQo+
ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyB2b2lkIHBjaV9pbXhfcmVzdW1lKHZvaWQpDQo+ID4g
K3sNCj4gPiArCXN0cnVjdCBwY2llX3BvcnQgKnBwID0gJmlteDZfcGNpZS0+cHA7DQo+ID4gKw0K
PiA+ICsJaWYgKGlzX2lteDZzeF9wY2llKGlteDZfcGNpZSkpIHsNCj4gPiArCQkvKiBSZXNldCBp
TVg2U1ggUENJZSAqLw0KPiA+ICsJCXJlZ21hcF91cGRhdGVfYml0cyhpbXg2X3BjaWUtPmlvbXV4
Y19ncHIsIElPTVVYQ19HUFI1LA0KPiA+ICsJCQkJSU1YNlNYX0dQUjVfUENJRV9QRVJTVCwgSU1Y
NlNYX0dQUjVfUENJRV9QRVJTVCk7DQo+ID4gKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGlteDZfcGNp
ZS0+aW9tdXhjX2dwciwgSU9NVVhDX0dQUjUsDQo+ID4gKwkJCQlJTVg2U1hfR1BSNV9QQ0lFX1BF
UlNULCAwIDw8IDE4KTsNCj4gPiArCQkvKg0KPiA+ICsJCSAqIGNvbnRyb2xsZXIgbWF5YmUgdHVy
biBvZmYsIHJlLWNvbmZpZ3VyZSBhZ2Fpbg0KPiA+ICsJCSAqLw0KPiA+ICsJCWR3X3BjaWVfc2V0
dXBfcmMocHApOw0KPiA+ICsNCj4gPiArCQlpZiAoSVNfRU5BQkxFRChDT05GSUdfUENJX01TSSkp
DQo+ID4gKwkJCWR3X3BjaWVfbXNpX2NmZ19yZXN0b3JlKHBwKTsNCj4gPiArCX0NCj4gPiArfQ0K
PiA+ICsNCj4gPiArc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyBwY2lfaW14X3N5c2NvcmVfb3Bz
ID0gew0KPiA+ICsJLnN1c3BlbmQgPSBwY2lfaW14X3N1c3BlbmQsDQo+ID4gKwkucmVzdW1lID0g
cGNpX2lteF9yZXN1bWUsDQo+ID4gK307DQo+ID4gKyNlbmRpZg0KPiA+ICsNCj4gPiAgc3RhdGlj
IGludCBfX2luaXQgaW14Nl9wY2llX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYp
ICB7DQo+ID4gLQlzdHJ1Y3QgaW14Nl9wY2llICppbXg2X3BjaWU7DQo+ID4gIAlzdHJ1Y3QgcGNp
ZV9wb3J0ICpwcDsNCj4gPiAgCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zf
bm9kZTsNCj4gPiAgCXN0cnVjdCByZXNvdXJjZSAqZGJpX2Jhc2U7DQo+ID4gQEAgLTYxMCw5ICs3
MTQsMjcgQEAgc3RhdGljIGludCBfX2luaXQgaW14Nl9wY2llX3Byb2JlKHN0cnVjdA0KPiBwbGF0
Zm9ybV9kZXZpY2UgKnBkZXYpDQo+ID4gIAkJcmV0dXJuIFBUUl9FUlIoaW14Nl9wY2llLT5wY2ll
KTsNCj4gPiAgCX0NCj4gPg0KPiA+IC0JLyogR3JhYiBHUFIgY29uZmlnIHJlZ2lzdGVyIHJhbmdl
ICovDQo+ID4gLQlpbXg2X3BjaWUtPmlvbXV4Y19ncHIgPQ0KPiA+IC0JCSBzeXNjb25fcmVnbWFw
X2xvb2t1cF9ieV9jb21wYXRpYmxlKCJmc2wsaW14NnEtaW9tdXhjLWdwciIpOw0KPiA+ICsJaWYg
KGlzX2lteDZzeF9wY2llKGlteDZfcGNpZSkpIHsNCj4gPiArCQlpbXg2X3BjaWUtPmRpc3BfYXhp
ID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJkaXNwX2F4aSIpOw0KPiA+ICsJCWlmIChJU19F
UlIoaW14Nl9wY2llLT5kaXNwX2F4aSkpIHsNCj4gPiArCQkJZGV2X2VycigmcGRldi0+ZGV2LA0K
PiA+ICsJCQkJInBjaWUgY2xvY2sgc291cmNlIG1pc3Npbmcgb3IgaW52YWxpZFxuIik7DQo+ID4g
KwkJCXJldHVybiBQVFJfRVJSKGlteDZfcGNpZS0+ZGlzcF9heGkpOw0KPiA+ICsJCX0NCj4gPiAr
DQo+ID4gKwkJaW14Nl9wY2llLT5wY2llX3JlZ3VsYXRvciA9IGRldm1fcmVndWxhdG9yX2dldChw
cC0+ZGV2LA0KPiA+ICsJCQkJInBjaWVfcGh5Iik7DQo+ID4gKw0KPiA+ICsJCWlteDZfcGNpZS0+
aW9tdXhjX2dwciA9DQo+ID4gKwkJCSBzeXNjb25fcmVnbWFwX2xvb2t1cF9ieV9jb21wYXRpYmxl
DQo+ID4gKwkJCSAoImZzbCxpbXg2c3gtaW9tdXhjLWdwciIpOw0KPiA+ICsJCWlteDZfcGNpZS0+
Z3BjX2lwc19yZWcgPQ0KPiA+ICsJCQkgc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfY29tcGF0aWJs
ZSgiZnNsLGlteDZzeC1ncGMiKTsNCj4gPiArCX0gZWxzZSB7DQo+ID4gKwkJaW14Nl9wY2llLT5p
b211eGNfZ3ByID0NCj4gPiArCQkJc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfY29tcGF0aWJsZQ0K
PiA+ICsJCQkoImZzbCxpbXg2cS1pb211eGMtZ3ByIik7DQo+ID4gKwl9DQo+ID4gIAlpZiAoSVNf
RVJSKGlteDZfcGNpZS0+aW9tdXhjX2dwcikpIHsNCj4gPiAgCQlkZXZfZXJyKCZwZGV2LT5kZXYs
ICJ1bmFibGUgdG8gZmluZCBpb211eGMgcmVnaXN0ZXJzXG4iKTsNCj4gPiAgCQlyZXR1cm4gUFRS
X0VSUihpbXg2X3BjaWUtPmlvbXV4Y19ncHIpOyBAQCAtNjIzLDYgKzc0NSw5IEBAIHN0YXRpYw0K
PiA+IGludCBfX2luaXQgaW14Nl9wY2llX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBk
ZXYpDQo+ID4gIAkJcmV0dXJuIHJldDsNCj4gPg0KPiA+ICAJcGxhdGZvcm1fc2V0X2RydmRhdGEo
cGRldiwgaW14Nl9wY2llKTsNCj4gPiArI2lmZGVmIENPTkZJR19QTV9TTEVFUA0KPiA+ICsJcmVn
aXN0ZXJfc3lzY29yZV9vcHMoJnBjaV9pbXhfc3lzY29yZV9vcHMpOw0KPiA+ICsjZW5kaWYNCj4g
PiAgCXJldHVybiAwOw0KPiA+ICB9DQo+ID4NCj4gPiBAQCAtNjM2LDYgKzc2MSw3IEBAIHN0YXRp
YyB2b2lkIGlteDZfcGNpZV9zaHV0ZG93bihzdHJ1Y3QNCj4gPiBwbGF0Zm9ybV9kZXZpY2UgKnBk
ZXYpDQo+ID4NCj4gPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgaW14Nl9wY2ll
X29mX21hdGNoW10gPSB7DQo+ID4gIAl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg2cS1wY2llIiwg
fSwNCj4gPiArCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDZzeC1wY2llIiwgfSwNCj4gPiAgCXt9
LA0KPiA+ICB9Ow0KPiA+ICBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBpbXg2X3BjaWVfb2ZfbWF0
Y2gpOw0KPiANCj4gLS0NCj4gUGVuZ3V0cm9uaXggZS5LLiAgICAgICAgICAgICB8IEx1Y2FzIFN0
YWNoICAgICAgICAgICAgICAgICB8DQo+IEluZHVzdHJpYWwgTGludXggU29sdXRpb25zICAgfCBo
dHRwOi8vd3d3LnBlbmd1dHJvbml4LmRlLyAgfA0KDQoNCkJlc3QgUmVnYXJkcw0KUmljaGFyZCBa
aHUNCg0K

^ permalink raw reply	[flat|nested] 18+ messages in thread

* RE: [PATCH v3 3/9] PCI: imx6: update dts and binding for imx6sx pcie
  2014-09-29 10:13   ` Lucas Stach
@ 2014-09-30  2:58     ` Hong-Xing.Zhu
  0 siblings, 0 replies; 18+ messages in thread
From: Hong-Xing.Zhu @ 2014-09-30  2:58 UTC (permalink / raw)
  To: Lucas Stach; +Cc: linux-pci-owner, linux-pci, Shengchao Guo, festevam, tharvey

SGkgTHVjYXM6DQpUaGFua3MgZm9yIHlvdXIgcmV2aWV3IGNvbW1lbnRzLg0KDQo+IC0tLS0tT3Jp
Z2luYWwgTWVzc2FnZS0tLS0tDQo+IEZyb206IEx1Y2FzIFN0YWNoIFttYWlsdG86bC5zdGFjaEBw
ZW5ndXRyb25peC5kZV0NCj4gU2VudDogTW9uZGF5LCBTZXB0ZW1iZXIgMjksIDIwMTQgNjoxMyBQ
TQ0KPiBUbzogWmh1IFJpY2hhcmQtUjY1MDM3DQo+IENjOiBsaW51eC1wY2ktb3duZXJAdmdlci5r
ZXJuZWwub3JnOyBsaW51eC1wY2lAdmdlci5rZXJuZWwub3JnOyBHdW8gU2hhd24tDQo+IFI2NTA3
MzsgZmVzdGV2YW1AZ21haWwuY29tOyB0aGFydmV5QGdhdGV3b3Jrcy5jb20NCj4gU3ViamVjdDog
UmU6IFtQQVRDSCB2MyAzLzldIFBDSTogaW14NjogdXBkYXRlIGR0cyBhbmQgYmluZGluZyBmb3Ig
aW14NnN4IHBjaWUNCj4gDQo+IEFtIE1vbnRhZywgZGVuIDI5LjA5LjIwMTQsIDEzOjAzICswODAw
IHNjaHJpZWIgUmljaGFyZCBaaHU6DQo+ID4gLSBpbXg2c3ggcGNpZSBwaHkgaGFzIGl0cyBvd24g
cG93ZXIgcmVndWxhdG9yLiBBZGQgdGhlIHBjaWUgcGh5IHBvd2VyDQo+ID4gc3VwcHkgaW50byBp
bTZzeCBwY2llIGR0cyBhbmQgYmluZGluZy4NCj4gPiAtIGluIG9yZGVyIHRvIGFsaWduIHdpdGgg
aW14NnFkbCdzIHBjaWUgZHRzLCByZS1mb3JtYXQgaW14NnN4IHBjaWUNCj4gPiBkdHMuDQo+ID4g
LSBpbiBvcmRlciB0byBhbGlnbiB3aXRoIGlteDZxZGwgcGNpZSBkdHMgZm9ybWF0IGFuZCBrZWVw
IGNsZWFuIG9mDQo+ID4gaW14NiBwY2llIGRyaXZlciwga2VlcCB0aGUgcGNpZSBwaHkgY2xvY2sg
aW4gaW14NnN4IHBjaWUgZHRzLCBhbHRob3VnaA0KPiA+IGl0J3MgdGhlIHBhcmVudCBjbGsgb2Yg
dGhlIHBjaWUgYnVzIGNsb2NrIG5vdywgYW5kIHdvdWxkIGJlIGVuYWJsZWQNCj4gPiBhdXRvbWF0
aWNhbGx5IHdoZW4gcGNpZSBidXMgY2xvY2sgaXMgZW5hYmxlZC4gc2Vjb25kbHksIGl0J3MgcG9z
c2libGUNCj4gPiB0aGF0IHRoZSBleHRlcm5hbCBvc2MgbWF5YmUgdXNlZCBhcyBzb3VyY2Ugb2Yg
dGhlIHBjaWVfYnVzIGNsayBpbg0KPiA+IGJvYXJkIGRlc2lnbiBpbiBmdXR1cmUuDQo+ID4gLSBk
aXNwX2F4aSBjbG9jayBpcyByZXF1aXJlZCBieSBwY2llIGluYm91bmQgYXhpIHBvcnQuDQo+ID4g
QWRkIG9uZSBtb3JlIGNsb2NrIGZvciBpbXg2c3ggcGNpZS4NCj4gPg0KPiA+IFNpZ25lZC1vZmYt
Ynk6IFJpY2hhcmQgWmh1IDxyNjUwMzdAZnJlZXNjYWxlLmNvbT4NCj4gPiAtLS0NCj4gPiAgLi4u
L2RldmljZXRyZWUvYmluZGluZ3MvcGNpL2ZzbCxpbXg2cS1wY2llLnR4dCAgICAgfCAgNSArKyst
DQo+ID4gIGFyY2gvYXJtL2Jvb3QvZHRzL2lteDZzeC5kdHNpICAgICAgICAgICAgICAgICAgICAg
IHwgMzAgKysrKysrKysrKysrLS0tLS0tLQ0KPiAtLS0NCj4gPiAgMiBmaWxlcyBjaGFuZ2VkLCAy
MSBpbnNlcnRpb25zKCspLCAxNCBkZWxldGlvbnMoLSkNCj4gPg0KPiA+IGRpZmYgLS1naXQgYS9E
b2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGNpL2ZzbCxpbXg2cS1wY2llLnR4dA0K
PiA+IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS9mc2wsaW14NnEtcGNp
ZS50eHQNCj4gPiBpbmRleCA5NDU1ZmQwLi45ODFlNDFkIDEwMDY0NA0KPiA+IC0tLSBhL0RvY3Vt
ZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kvZnNsLGlteDZxLXBjaWUudHh0DQo+ID4g
KysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS9mc2wsaW14NnEtcGNp
ZS50eHQNCj4gPiBAQCAtNCw3ICs0LDcgQEAgVGhpcyBQQ0llIGhvc3QgY29udHJvbGxlciBpcyBi
YXNlZCBvbiB0aGUgU3lub3BzaXMNCj4gPiBEZXNpZ253YXJlIFBDSWUgSVAgIGFuZCB0aHVzIGlu
aGVyaXRzIGFsbCB0aGUgY29tbW9uIHByb3BlcnRpZXMgZGVmaW5lZCBpbg0KPiBkZXNpZ253YXJl
LXBjaWUudHh0Lg0KPiA+DQo+ID4gIFJlcXVpcmVkIHByb3BlcnRpZXM6DQo+ID4gLS0gY29tcGF0
aWJsZTogImZzbCxpbXg2cS1wY2llIg0KPiA+ICstIGNvbXBhdGlibGU6ICJmc2wsaW14NnEtcGNp
ZSIsICJmc2wsaW14NnN4LXBjaWUiDQo+ID4gIC0gcmVnOiBiYXNlIGFkZHJlc3NlIGFuZCBsZW5n
dGggb2YgdGhlIHBjaWUgY29udHJvbGxlcg0KPiA+ICAtIGludGVycnVwdHM6IEEgbGlzdCBvZiBp
bnRlcnJ1cHQgb3V0cHV0cyBvZiB0aGUgY29udHJvbGxlci4gTXVzdCBjb250YWluDQo+IGFuDQo+
ID4gICAgZW50cnkgZm9yIGVhY2ggZW50cnkgaW4gdGhlIGludGVycnVwdC1uYW1lcyBwcm9wZXJ0
eS4NCj4gPiBAQCAtMTMsNiArMTMsOSBAQCBSZXF1aXJlZCBwcm9wZXJ0aWVzOg0KPiA+ICAtIGNs
b2NrLW5hbWVzOiBNdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGVudHJpZXM6
DQo+ID4gIAktICJwY2llX3BoeSINCj4gPg0KPiA+ICtQb3dlciBzdXBwbGllcyBmb3IgaW14NnN4
Og0KPiA+ICstIHBjaWVfcGh5LXN1cHBseTogcmVndWxhdG9yIHVzZWQgYnkgaW14NnN4IHBjaWUg
cGh5Lg0KPiA+ICsNCj4gVG8gYWxpZ24gd2l0aCB0aGUgcHJldmlvdXMgcHJhY3RpY2Ugb2YgbmFt
aW5nIHJlZ3VsYXRvciBzdXBwbGllcyBwbGVhc2UgZG9uJ3QNCj4gdXNlIHVuZGVyc2NvcmVzIGlu
IHRoZSBuYW1lLiBBbHNvIHlvdSBhcmVuJ3QgZG9jdW1lbnRpbmcgdGhlIGFkZGl0aW9uYWwgY2xv
Y2sNCj4gKHdoaWNoIGFsc28gbmVlZHMgYSBkZXNjcmlwdGl2ZSBuYW1lLCBOT1QgImRpc3BfYXhp
IikuDQo+IEkgd291bGQgcmVjb21tZW5kIHRoZSBkb2N1bWVudGF0aW9uIGNoYW5nZSB0byBsb29r
IGxpa2UgdGhpczoNCj4gDQo+IEFkZGl0aW9uYWwgcmVxdWlyZWQgcHJvcGVydGllcyBmb3IgaW14
NnN4LXBjaWU6DQo+IC0gY2xvY2sgbmFtZXM6IE11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFk
ZGl0aW9uYWwgZW50cmllczoNCj4gCS0gInBjaWVfaW5ib3VuZF9heGkiDQo+IC0gcG93ZXIgc3Vw
cGxpZXM6DQo+IAktIHBjaWUtcGh5LXN1cHBseTogcmVndWxhdG9yIHVzZWQgdG8gcG93ZXIgdGhl
IFBDSWUgUEhZDQo+IA0KPiBQbGVhc2UgdXBkYXRlIHRoZSBEVFMgYW5kIGRyaXZlciBhY2NvcmRp
bmdseS4NCj4gDQpbUmljaGFyZF0gQWNjZXB0ZWQuIHBjaWVfaW5ib3VuZF9heGkgaXMgb2suDQoN
Cj4gPiAgRXhhbXBsZToNCj4gPg0KPiA+ICAJcGNpZUAweDAxMDAwMDAwIHsNCj4gPiBkaWZmIC0t
Z2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnN4LmR0c2kNCj4gPiBiL2FyY2gvYXJtL2Jvb3Qv
ZHRzL2lteDZzeC5kdHNpIGluZGV4IGY0YjlkYTYuLmI0Y2E5NGIgMTAwNjQ0DQo+ID4gLS0tIGEv
YXJjaC9hcm0vYm9vdC9kdHMvaW14NnN4LmR0c2kNCj4gPiArKysgYi9hcmNoL2FybS9ib290L2R0
cy9pbXg2c3guZHRzaQ0KPiA+IEBAIC01OTksOSArNTk5LDkgQEANCj4gPiAgCQkJCQlhbmF0b3At
bWF4LXZvbHRhZ2UgPSA8MTQ1MDAwMD47DQo+ID4gIAkJCQl9Ow0KPiA+DQo+ID4gLQkJCQlyZWdf
cGNpZTogcmVndWxhdG9yLXZkZHBjaWVAMTQwIHsNCj4gPiArCQkJCXJlZ19wY2llX3BoeTogcmVn
dWxhdG9yLXZkZHBjaWVfcGh5QDE0MCB7DQo+ID4gIAkJCQkJY29tcGF0aWJsZSA9ICJmc2wsYW5h
dG9wLXJlZ3VsYXRvciI7DQo+ID4gLQkJCQkJcmVndWxhdG9yLW5hbWUgPSAidmRkcGNpZSI7DQo+
ID4gKwkJCQkJcmVndWxhdG9yLW5hbWUgPSAidmRkcGNpZV9waHkiOw0KPiA+ICAJCQkJCXJlZ3Vs
YXRvci1taW4tbWljcm92b2x0ID0gPDcyNTAwMD47DQo+ID4gIAkJCQkJcmVndWxhdG9yLW1heC1t
aWNyb3ZvbHQgPSA8MTQ1MDAwMD47DQo+ID4gIAkJCQkJYW5hdG9wLXJlZy1vZmZzZXQgPSA8MHgx
NDA+Ow0KPiA+IEBAIC0xMTg4LDIwICsxMTg4LDI0IEBADQo+ID4gIAkJCSNhZGRyZXNzLWNlbGxz
ID0gPDM+Ow0KPiA+ICAJCQkjc2l6ZS1jZWxscyA9IDwyPjsNCj4gPiAgCQkJZGV2aWNlX3R5cGUg
PSAicGNpIjsNCj4gPiAtCQkJCSAgLyogY29uZmlndXJhdGlvbiBzcGFjZSAqLw0KPiA+IC0JCQly
YW5nZXMgPSA8MHgwMDAwMDgwMCAwIDB4MDhmMDAwMDAgMHgwOGYwMDAwMCAwIDB4MDAwODAwMDAN
Cj4gPiAtCQkJCSAgLyogZG93bnN0cmVhbSBJL08gKi8NCj4gPiAtCQkJCSAgMHg4MTAwMDAwMCAw
IDAgICAgICAgICAgMHgwOGY4MDAwMCAwIDB4MDAwMTAwMDANCj4gPiAtCQkJCSAgLyogbm9uLXBy
ZWZldGNoYWJsZSBtZW1vcnkgKi8NCj4gPiAtCQkJCSAgMHg4MjAwMDAwMCAwIDB4MDgwMDAwMDAg
MHgwODAwMDAwMCAwIDB4MDBmMDAwMDA+Ow0KPiA+ICsJCQlyYW5nZXMgPSA8MHgwMDAwMDgwMCAw
IDB4MDhmMDAwMDAgMHgwOGYwMDAwMCAwIDB4MDAwODAwMDAgLyoNCj4gY29uZmlndXJhdGlvbiBz
cGFjZSAqLw0KPiA+ICsJCQkJICAweDgxMDAwMDAwIDAgMCAgICAgICAgICAweDA4ZjgwMDAwIDAg
MHgwMDAxMDAwMCAvKg0KPiBkb3duc3RyZWFtIEkvTyAqLw0KPiA+ICsJCQkJICAweDgyMDAwMDAw
IDAgMHgwODAwMDAwMCAweDA4MDAwMDAwIDAgMHgwMGYwMDAwMD47IC8qDQo+ID4gK25vbi1wcmVm
ZXRjaGFibGUgbWVtb3J5ICovDQo+ID4gIAkJCW51bS1sYW5lcyA9IDwxPjsNCj4gPiAtCQkJaW50
ZXJydXB0cyA9IDxHSUNfU1BJIDEyMyBJUlFfVFlQRV9MRVZFTF9ISUdIPjsNCj4gPiAtCQkJY2xv
Y2tzID0gPCZjbGtzIElNWDZTWF9DTEtfUENJRV9SRUZfMTI1TT4sDQo+ID4gLQkJCQkgPCZjbGtz
IElNWDZTWF9DTEtfUENJRV9BWEk+LA0KPiA+ICsJCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMTIw
IElSUV9UWVBFX0xFVkVMX0hJR0g+Ow0KPiA+ICsJCQlpbnRlcnJ1cHQtbmFtZXMgPSAibXNpIjsN
Cj4gPiArCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsNCj4gPiArCQkJaW50ZXJydXB0LW1hcC1t
YXNrID0gPDAgMCAwIDB4Nz47DQo+ID4gKwkJCWludGVycnVwdC1tYXAgPSA8MCAwIDAgMSAmaW50
YyBHSUNfU1BJIDEyMyBJUlFfVFlQRV9MRVZFTF9ISUdIPiwNCj4gPiArCQkJICAgICAgICAgICAg
ICAgIDwwIDAgMCAyICZpbnRjIEdJQ19TUEkgMTIyIElSUV9UWVBFX0xFVkVMX0hJR0g+LA0KPiA+
ICsJCQkgICAgICAgICAgICAgICAgPDAgMCAwIDMgJmludGMgR0lDX1NQSSAxMjEgSVJRX1RZUEVf
TEVWRUxfSElHSD4sDQo+ID4gKwkJCSAgICAgICAgICAgICAgICA8MCAwIDAgNCAmaW50YyBHSUNf
U1BJIDEyMCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsNCj4gPiArCQkJY2xvY2tzID0gPCZjbGtzIElN
WDZTWF9DTEtfUENJRV9BWEk+LA0KPiA+ICAJCQkJIDwmY2xrcyBJTVg2U1hfQ0xLX0xWRFMxX09V
VD4sDQo+ID4gKwkJCQkgPCZjbGtzIElNWDZTWF9DTEtfUENJRV9SRUZfMTI1TT4sDQo+ID4gIAkJ
CQkgPCZjbGtzIElNWDZTWF9DTEtfRElTUExBWV9BWEk+Ow0KPiA+IC0JCQljbG9jay1uYW1lcyA9
ICJwY2llX3JlZl8xMjVtIiwgInBjaWVfYXhpIiwNCj4gPiAtCQkJCSAgICAgICJsdmRzX2dhdGUi
LCAiZGlzcGxheV9heGkiOw0KPiA+ICsJCQljbG9jay1uYW1lcyA9ICJwY2llIiwgInBjaWVfYnVz
IiwgInBjaWVfcGh5IiwgImRpc3BfYXhpIjsNCj4gPiArCQkJcGNpZV9waHktc3VwcGx5ID0gPCZy
ZWdfcGNpZV9waHk+Ow0KPiA+ICAJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOw0KPiA+ICAJCX07DQo+
ID4gIAl9Ow0KPiANCj4gWW91IGFyZSBzdGlsbCBtaXNzaW5nIHRoZSAiY29uZmlnIiByZWcgc3Bh
Y2UuIFBsZWFzZSBsb29rIGF0IHRoZSBkZXNpZ253YXJlLQ0KPiBwY2llLnR4dCBiYXNlIGJpbmRp
bmcsIGl0J3MgYSByZXF1aXJlZCBwcm9wZXJ0eSBub3cuIEFsc28gcGxlYXNlIGJlIG1vcmUNCj4g
Y2FyZWZ1bCB0byBhZGRyZXNzIG15IHJldmlldyBjb21tZW50cy4NCj4gDQpbUmljaGFyZF1Tb3Jy
eSwgbWlzLXVuZGVyc3RhbmQgeW91ciBwcmV2aW91cyBjb21tZW50Lg0KQ2F0Y2ggeW91ciBwb2lu
dCBub3csIHdvdWxkIGFkZCB0aGUgbmV3ICJjb25maWciIHJlZyBzcGFjZSBsYXRlci4NCj4gUmVn
YXJkcywNCj4gTHVjYXMNCj4gLS0NCj4gUGVuZ3V0cm9uaXggZS5LLiAgICAgICAgICAgICB8IEx1
Y2FzIFN0YWNoICAgICAgICAgICAgICAgICB8DQo+IEluZHVzdHJpYWwgTGludXggU29sdXRpb25z
ICAgfCBodHRwOi8vd3d3LnBlbmd1dHJvbml4LmRlLyAgfA0KDQoNCkJlc3QgUmVnYXJkcw0KUmlj
aGFyZCBaaHUNCg==

^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2014-09-30  2:58 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-09-29  5:03 [PATCH v3]PCI: imx6: enable pcie on imx6sx sdb and imx6qdl sabreauto Richard Zhu
2014-09-29  5:03 ` [PATCH v3 1/9] PCI: imx6: wait the clocks to stabilize after ref_en Richard Zhu
2014-09-29  5:03 ` [PATCH v3 2/9] PCI: imx6: enable pcie on imx6qdl sabreauto Richard Zhu
2014-09-29  9:56   ` Lucas Stach
2014-09-30  2:18     ` Hong-Xing.Zhu
2014-09-29  5:03 ` [PATCH v3 3/9] PCI: imx6: update dts and binding for imx6sx pcie Richard Zhu
2014-09-29 10:13   ` Lucas Stach
2014-09-30  2:58     ` Hong-Xing.Zhu
2014-09-29  5:03 ` [PATCH v3 4/9] PCI: imx6: add syscon into gpc dts Richard Zhu
2014-09-29  5:03 ` [PATCH v3 5/9] PCI: imx6: add imx6sx pcie related gpr bits definitions Richard Zhu
2014-09-29  5:03 ` [PATCH v3 6/9] PCI: imx6: enable pcie on imx6sx sdb board Richard Zhu
2014-09-29  5:03 ` [PATCH v3 7/9] PCI: imx6: add imx6sx pcie support Richard Zhu
2014-09-29 10:18   ` Lucas Stach
2014-09-30  2:37     ` Hong-Xing.Zhu
2014-09-29  5:03 ` [PATCH v3 8/9] PCI: designware: refine setup_rc and add msi data restore Richard Zhu
2014-09-29 10:26   ` Lucas Stach
2014-09-29  5:03 ` [PATCH v3 9/9] PCI: imx6: Fix possible dead lock Richard Zhu
2014-09-29 10:38   ` Lucas Stach

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).