[linux-yocto] [linux-yocto-dev standard/xlnx-soc][PATCH 1/2] driver: pcie: reset pcie device with MIO31 on xilinx-zcu102 platform

quanyang.wang at windriver.com quanyang.wang at windriver.com
Sun Jul 21 22:22:49 PDT 2019


From: Limeng <Meng.Li at windriver.com>

On xilinx-zcu102 platform, when run kdump feature, an active pcie
device need to be reset with MIO31 so that the crash kernel is able
to boot up successfully.

Signed-off-by: Meng Li <Meng.Li at windriver.com>
[Quanyang: When power on zcu102 board, pcie bus also occur that PCI link
is down, and this patch can fix it. Also, we need add a 100ms delay
for some NIC (Intel X520 etc), or else PCI config read will fail due to
unstable device status.]
Signed-off-by: Quanyang Wang <quanyang.wang at windriver.com>
---
 .../boot/dts/xilinx/zynqmp-zcu102-revA.dts    |  1 +
 drivers/pci/controller/pcie-xilinx-nwl.c      | 35 +++++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git a/arch/arm64/boot/dts/xilinx/zynqmp-zcu102-revA.dts b/arch/arm64/boot/dts/xilinx/zynqmp-zcu102-revA.dts
index 36863f65e94e..2741040fe26a 100644
--- a/arch/arm64/boot/dts/xilinx/zynqmp-zcu102-revA.dts
+++ b/arch/arm64/boot/dts/xilinx/zynqmp-zcu102-revA.dts
@@ -772,6 +772,7 @@
 
 &pcie {
 	status = "okay";
+	reset-gpio = <&gpio 31 GPIO_ACTIVE_HIGH>;
 };
 
 &qspi {
diff --git a/drivers/pci/controller/pcie-xilinx-nwl.c b/drivers/pci/controller/pcie-xilinx-nwl.c
index a1fd436dba8f..908166dc4f3e 100644
--- a/drivers/pci/controller/pcie-xilinx-nwl.c
+++ b/drivers/pci/controller/pcie-xilinx-nwl.c
@@ -21,6 +21,8 @@
 #include <linux/pci.h>
 #include <linux/platform_device.h>
 #include <linux/irqchip/chained_irq.h>
+#include <linux/gpio.h>
+#include <linux/of_gpio.h>
 
 #include "../pci.h"
 
@@ -830,6 +832,31 @@ static const struct of_device_id nwl_pcie_of_match[] = {
 	{}
 };
 
+static int nwl_pcie_reset_ep_device(struct platform_device *pdev)
+{
+	struct device_node *node = pdev->dev.of_node;
+	int gpio;
+	int err;
+
+	gpio = of_get_named_gpio(node, "reset-gpio", 0);
+	if (!gpio_is_valid(gpio)) {
+		dev_err(&pdev->dev, "failed to parse reset gpio\n");
+		return gpio;
+	}
+
+	err = devm_gpio_request_one(&pdev->dev, gpio, GPIOF_OUT_INIT_HIGH,
+					"pcie reset gpio");
+	if (err)
+		return err;
+
+	udelay(2);
+	gpio_set_value(gpio, 0);
+	udelay(10);
+	gpio_set_value(gpio, 1);
+
+	return err;
+}
+
 static int nwl_pcie_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
@@ -841,6 +868,14 @@ static int nwl_pcie_probe(struct platform_device *pdev)
 	resource_size_t iobase = 0;
 	LIST_HEAD(res);
 
+	err = nwl_pcie_reset_ep_device(pdev);
+	if (err) {
+		dev_err(dev, "fail to reset pcie device\n");
+		return err;
+	}
+	/* wait for ep device reset finished */
+	mdelay(100);
+
 	bridge = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
 	if (!bridge)
 		return -ENODEV;
-- 
2.17.1



More information about the linux-yocto mailing list