* [PATCH v5 0/4] i.MX7 PCI support @ 2017-02-20 15:30 Andrey Smirnov 2017-02-20 15:30 ` [PATCH v5 1/4] PCI: imx6: Add code to support i.MX7D Andrey Smirnov ` (4 more replies) 0 siblings, 5 replies; 7+ messages in thread From: Andrey Smirnov @ 2017-02-20 15:30 UTC (permalink / raw) To: linux-pci Cc: Andrey Smirnov, linux-kernel, Bjorn Helgaas, Rob Herring, Fabio Estevam, yurovsky, linux-arm-kernel, Lucas Stach Hello, everyone: This is a fifth iteration of the code that adds PCI-subsystem bits necessary for enabling PCI support on i.MX7. Rob, Bjorn, power domain and reset bindings remained the same, please let me know if you still think that PHY aspect of the driver needs to be moved into a separate abstraction. Changes since v4 (can be found at [version4]): - Dropped typo-fix patch (originally patch #1 of the series). Bjorn, I am assuming that patch from v4 survived and stayed in your tree, let me know if that is not true. - Added patch with workaround to address speed change false failures (I kept it as a separate patch to better document exchange with NXP/Freescale that lead to that patch) - Added patch to avoid speed change on links configured Gen1 only (Let me know if that is a terrible idea) - Addressed section mismatch problem by moving call to hook_fault_code to happend before driver registration. Changes since v3 (can be found at [version3]): - Move all of the reset_control_assert's into imx6_pcie_assert_core_reset - Documented required reset and power domain DT bindings Changes since v2 (can be found at [version2]): - Collected Reviewed-by for patch #2 from Lucas - Reset logic implementation moved out into a reset controller driver (see [reset1]) - Removed unused leftover code Changes since v1 (can be found at [version1]): - All GPC related code moved into a separate driver (see [gpc1]) - Removed GPIO probe deferral logging - Fixed section mismatch warning - Minor reformatting of fsl,imx6q-pcie.txt(as per Rob Herring's request) [version4] https://lkml.org/lkml/2017/2/7/478 [version3] https://lkml.org/lkml/2017/2/6/565 [version2] https://lkml.org/lkml/2017/2/1/510 [version1] https://lkml.org/lkml/2017/1/19/488 [gpc1] https://lkml.org/lkml/2017/2/6/551 [reset1] https://lkml.org/lkml/2017/2/6/554 Andrey Smirnov (4): PCI: imx6: Add code to support i.MX7D PCI: imx6: Do not wait for speed change on i.MX7 PCI: imx6: Do not switch speed if Gen2 is disabled PCI: imx6: Allow probe deferal by reset GPIO .../devicetree/bindings/pci/fsl,imx6q-pcie.txt | 13 +- drivers/pci/host/pci-imx6.c | 199 +++++++++++++++------ include/linux/mfd/syscon/imx7-iomuxc-gpr.h | 4 + 3 files changed, 161 insertions(+), 55 deletions(-) -- 2.9.3 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v5 1/4] PCI: imx6: Add code to support i.MX7D 2017-02-20 15:30 [PATCH v5 0/4] i.MX7 PCI support Andrey Smirnov @ 2017-02-20 15:30 ` Andrey Smirnov 2017-03-14 14:43 ` Lee Jones 2017-02-20 15:30 ` [PATCH v5 2/4] PCI: imx6: Do not wait for speed change on i.MX7 Andrey Smirnov ` (3 subsequent siblings) 4 siblings, 1 reply; 7+ messages in thread From: Andrey Smirnov @ 2017-02-20 15:30 UTC (permalink / raw) To: linux-pci Cc: Mark Rutland, devicetree, Andrey Smirnov, linux-kernel, Fabio Estevam, Rob Herring, Bjorn Helgaas, yurovsky, Lee Jones, linux-arm-kernel, Lucas Stach Add various bits of code needed to support i.MX7D variant of the IP. Cc: yurovsky@gmail.com Cc: Lucas Stach <l.stach@pengutronix.de> Cc: Bjorn Helgaas <bhelgaas@google.com> Cc: Rob Herring <robh+dt@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Lee Jones <lee.jones@linaro.org> Cc: Fabio Estevam <fabio.estevam@nxp.com> Cc: linux-arm-kernel@lists.infradead.org Cc: devicetree@vger.kernel.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> --- .../devicetree/bindings/pci/fsl,imx6q-pcie.txt | 13 ++- drivers/pci/host/pci-imx6.c | 121 ++++++++++++++++----- include/linux/mfd/syscon/imx7-iomuxc-gpr.h | 4 + 3 files changed, 112 insertions(+), 26 deletions(-) diff --git a/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt b/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt index 83aeb1f..11db2ab 100644 --- a/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt +++ b/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt @@ -4,7 +4,11 @@ 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", "fsl,imx6sx-pcie", "fsl,imx6qp-pcie" +- compatible: + - "fsl,imx6q-pcie" + - "fsl,imx6sx-pcie", + - "fsl,imx6qp-pcie" + - "fsl,imx7d-pcie" - reg: base address 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. @@ -34,6 +38,13 @@ Additional required properties for imx6sx-pcie: - clock names: Must include the following additional entries: - "pcie_inbound_axi" +Additional required properties for imx7d-pcie: +- power-domains: Must be set to a phandle pointing to PCIE_PHY power domain +- resets: Must contain phandles to PCIE related reset lines exposed by SRC IP block +- reset-names: Must contain the following entires: + - "pciephy" + - "apps" + Example: pcie@0x01000000 { diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c index 50a1291..2f3f375 100644 --- a/drivers/pci/host/pci-imx6.c +++ b/drivers/pci/host/pci-imx6.c @@ -17,6 +17,7 @@ #include <linux/kernel.h> #include <linux/mfd/syscon.h> #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h> +#include <linux/mfd/syscon/imx7-iomuxc-gpr.h> #include <linux/module.h> #include <linux/of_gpio.h> #include <linux/of_device.h> @@ -27,6 +28,7 @@ #include <linux/signal.h> #include <linux/types.h> #include <linux/interrupt.h> +#include <linux/reset.h> #include "pcie-designware.h" @@ -36,6 +38,7 @@ enum imx6_pcie_variants { IMX6Q, IMX6SX, IMX6QP, + IMX7D, }; struct imx6_pcie { @@ -47,6 +50,8 @@ struct imx6_pcie { struct clk *pcie_inbound_axi; struct clk *pcie; struct regmap *iomuxc_gpr; + struct reset_control *pciephy_reset; + struct reset_control *apps_reset; enum imx6_pcie_variants variant; u32 tx_deemph_gen1; u32 tx_deemph_gen2_3p5db; @@ -56,6 +61,11 @@ struct imx6_pcie { int link_gen; }; +/* Parameters for the waiting for PCIe PHY PLL to lock on i.MX7 */ +#define PHY_PLL_LOCK_WAIT_MAX_RETRIES 2000 +#define PHY_PLL_LOCK_WAIT_USLEEP_MIN 50 +#define PHY_PLL_LOCK_WAIT_USLEEP_MAX 200 + /* PCIe Root Complex registers (memory-mapped) */ #define PCIE_RC_LCR 0x7c #define PCIE_RC_LCR_MAX_LINK_SPEEDS_GEN1 0x1 @@ -251,6 +261,10 @@ static void imx6_pcie_assert_core_reset(struct imx6_pcie *imx6_pcie) u32 val, gpr1, gpr12; switch (imx6_pcie->variant) { + case IMX7D: + reset_control_assert(imx6_pcie->pciephy_reset); + reset_control_assert(imx6_pcie->apps_reset); + break; case IMX6SX: regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, IMX6SX_GPR12_PCIE_TEST_POWERDOWN, @@ -333,11 +347,33 @@ static int imx6_pcie_enable_ref_clk(struct imx6_pcie *imx6_pcie) regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1, IMX6Q_GPR1_PCIE_REF_CLK_EN, 1 << 16); break; + case IMX7D: + break; } return ret; } +static void imx7d_pcie_wait_for_phy_pll_lock(struct imx6_pcie *imx6_pcie) +{ + u32 val; + unsigned int retries; + struct pcie_port *pp = &imx6_pcie->pp; + struct device *dev = pp->dev; + + for (retries = 0; retries < PHY_PLL_LOCK_WAIT_MAX_RETRIES; retries++) { + regmap_read(imx6_pcie->iomuxc_gpr, IOMUXC_GPR22, &val); + + if (val & IMX7D_GPR22_PCIE_PHY_PLL_LOCKED) + return; + + usleep_range(PHY_PLL_LOCK_WAIT_USLEEP_MIN, + PHY_PLL_LOCK_WAIT_USLEEP_MAX); + } + + dev_err(dev, "PCIe PLL lock timeout\n"); +} + static void imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie) { struct pcie_port *pp = &imx6_pcie->pp; @@ -381,6 +417,10 @@ static void imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie) } switch (imx6_pcie->variant) { + case IMX7D: + reset_control_deassert(imx6_pcie->pciephy_reset); + imx7d_pcie_wait_for_phy_pll_lock(imx6_pcie); + break; case IMX6SX: regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR5, IMX6SX_GPR5_PCIE_BTNRST_RESET, 0); @@ -407,35 +447,44 @@ static void imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie) static void imx6_pcie_init_phy(struct imx6_pcie *imx6_pcie) { - if (imx6_pcie->variant == IMX6SX) + switch (imx6_pcie->variant) { + case IMX7D: + regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, + IMX7D_GPR12_PCIE_PHY_REFCLK_SEL, 0); + break; + case IMX6SX: regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, IMX6SX_GPR12_PCIE_RX_EQ_MASK, IMX6SX_GPR12_PCIE_RX_EQ_2); + /* FALLTHROUGH */ + default: + regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, + IMX6Q_GPR12_PCIE_CTL_2, 0 << 10); - regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, - IMX6Q_GPR12_PCIE_CTL_2, 0 << 10); + /* configure constant input signal to the pcie ctrl and phy */ + regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, + IMX6Q_GPR12_LOS_LEVEL, 9 << 4); + + regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8, + IMX6Q_GPR8_TX_DEEMPH_GEN1, + imx6_pcie->tx_deemph_gen1 << 0); + regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8, + IMX6Q_GPR8_TX_DEEMPH_GEN2_3P5DB, + imx6_pcie->tx_deemph_gen2_3p5db << 6); + regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8, + IMX6Q_GPR8_TX_DEEMPH_GEN2_6DB, + imx6_pcie->tx_deemph_gen2_6db << 12); + regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8, + IMX6Q_GPR8_TX_SWING_FULL, + imx6_pcie->tx_swing_full << 18); + regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8, + IMX6Q_GPR8_TX_SWING_LOW, + imx6_pcie->tx_swing_low << 25); + break; + } - /* configure constant input signal to the pcie ctrl and phy */ 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); - - regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8, - IMX6Q_GPR8_TX_DEEMPH_GEN1, - imx6_pcie->tx_deemph_gen1 << 0); - regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8, - IMX6Q_GPR8_TX_DEEMPH_GEN2_3P5DB, - imx6_pcie->tx_deemph_gen2_3p5db << 6); - regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8, - IMX6Q_GPR8_TX_DEEMPH_GEN2_6DB, - imx6_pcie->tx_deemph_gen2_6db << 12); - regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8, - IMX6Q_GPR8_TX_SWING_FULL, - imx6_pcie->tx_swing_full << 18); - regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8, - IMX6Q_GPR8_TX_SWING_LOW, - imx6_pcie->tx_swing_low << 25); } static int imx6_pcie_wait_for_link(struct imx6_pcie *imx6_pcie) @@ -498,8 +547,11 @@ static int imx6_pcie_establish_link(struct imx6_pcie *imx6_pcie) dw_pcie_writel_rc(pp, PCIE_RC_LCR, tmp); /* Start LTSSM. */ - regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, - IMX6Q_GPR12_PCIE_CTL_2, 1 << 10); + if (imx6_pcie->variant == IMX7D) + reset_control_deassert(imx6_pcie->apps_reset); + else + regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, + IMX6Q_GPR12_PCIE_CTL_2, 1 << 10); ret = imx6_pcie_wait_for_link(imx6_pcie); if (ret) { @@ -674,13 +726,31 @@ static int __init imx6_pcie_probe(struct platform_device *pdev) return PTR_ERR(imx6_pcie->pcie); } - if (imx6_pcie->variant == IMX6SX) { + switch (imx6_pcie->variant) { + case IMX6SX: imx6_pcie->pcie_inbound_axi = devm_clk_get(dev, "pcie_inbound_axi"); if (IS_ERR(imx6_pcie->pcie_inbound_axi)) { dev_err(dev, "pcie_inbound_axi clock missing or invalid\n"); return PTR_ERR(imx6_pcie->pcie_inbound_axi); } + break; + case IMX7D: + imx6_pcie->pciephy_reset = devm_reset_control_get(dev, + "pciephy"); + if (IS_ERR(imx6_pcie->pciephy_reset)) { + dev_err(dev, "Failed to get PCIEPHY reset contol\n"); + return PTR_ERR(imx6_pcie->pciephy_reset); + } + + imx6_pcie->apps_reset = devm_reset_control_get(dev, "apps"); + if (IS_ERR(imx6_pcie->apps_reset)) { + dev_err(dev, "Failed to get PCIE APPS reset contol\n"); + return PTR_ERR(imx6_pcie->apps_reset); + } + break; + default: + break; } /* Grab GPR config register range */ @@ -738,6 +808,7 @@ static const struct of_device_id imx6_pcie_of_match[] = { { .compatible = "fsl,imx6q-pcie", .data = (void *)IMX6Q, }, { .compatible = "fsl,imx6sx-pcie", .data = (void *)IMX6SX, }, { .compatible = "fsl,imx6qp-pcie", .data = (void *)IMX6QP, }, + { .compatible = "fsl,imx7d-pcie", .data = (void *)IMX7D, }, {}, }; diff --git a/include/linux/mfd/syscon/imx7-iomuxc-gpr.h b/include/linux/mfd/syscon/imx7-iomuxc-gpr.h index 4585d61..abbd524 100644 --- a/include/linux/mfd/syscon/imx7-iomuxc-gpr.h +++ b/include/linux/mfd/syscon/imx7-iomuxc-gpr.h @@ -44,4 +44,8 @@ #define IMX7D_GPR5_CSI_MUX_CONTROL_MIPI (0x1 << 4) +#define IMX7D_GPR12_PCIE_PHY_REFCLK_SEL BIT(5) + +#define IMX7D_GPR22_PCIE_PHY_PLL_LOCKED BIT(31) + #endif /* __LINUX_IMX7_IOMUXC_GPR_H */ -- 2.9.3 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v5 1/4] PCI: imx6: Add code to support i.MX7D 2017-02-20 15:30 ` [PATCH v5 1/4] PCI: imx6: Add code to support i.MX7D Andrey Smirnov @ 2017-03-14 14:43 ` Lee Jones 0 siblings, 0 replies; 7+ messages in thread From: Lee Jones @ 2017-03-14 14:43 UTC (permalink / raw) To: Andrey Smirnov Cc: Mark Rutland, devicetree, linux-pci, linux-kernel, Fabio Estevam, Rob Herring, Bjorn Helgaas, yurovsky, linux-arm-kernel, Lucas Stach T24gTW9uLCAyMCBGZWIgMjAxNywgQW5kcmV5IFNtaXJub3Ygd3JvdGU6Cgo+IEFkZCB2YXJpb3Vz IGJpdHMgb2YgY29kZSBuZWVkZWQgdG8gc3VwcG9ydCBpLk1YN0QgdmFyaWFudCBvZiB0aGUgSVAu Cj4gCj4gQ2M6IHl1cm92c2t5QGdtYWlsLmNvbQo+IENjOiBMdWNhcyBTdGFjaCA8bC5zdGFjaEBw ZW5ndXRyb25peC5kZT4KPiBDYzogQmpvcm4gSGVsZ2FhcyA8YmhlbGdhYXNAZ29vZ2xlLmNvbT4K PiBDYzogUm9iIEhlcnJpbmcgPHJvYmgrZHRAa2VybmVsLm9yZz4KPiBDYzogTWFyayBSdXRsYW5k IDxtYXJrLnJ1dGxhbmRAYXJtLmNvbT4KPiBDYzogTGVlIEpvbmVzIDxsZWUuam9uZXNAbGluYXJv Lm9yZz4KPiBDYzogRmFiaW8gRXN0ZXZhbSA8ZmFiaW8uZXN0ZXZhbUBueHAuY29tPgo+IENjOiBs aW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKPiBDYzogZGV2aWNldHJlZUB2Z2Vy Lmtlcm5lbC5vcmcKPiBDYzogbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwo+IFNpZ25lZC1v ZmYtYnk6IEFuZHJleSBTbWlybm92IDxhbmRyZXcuc21pcm5vdkBnbWFpbC5jb20+Cj4gLS0tCj4g IC4uLi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS9mc2wsaW14NnEtcGNpZS50eHQgICAgIHwgIDEz ICsrLQo+ICBkcml2ZXJzL3BjaS9ob3N0L3BjaS1pbXg2LmMgICAgICAgICAgICAgICAgICAgICAg ICB8IDEyMSArKysrKysrKysrKysrKysrLS0tLS0KCj4gIGluY2x1ZGUvbGludXgvbWZkL3N5c2Nv bi9pbXg3LWlvbXV4Yy1ncHIuaCAgICAgICAgIHwgICA0ICsKCkFja2VkLWJ5OiBMZWUgSm9uZXMg PGxlZS5qb25lc0BsaW5hcm8ub3JnPgoKPiAgMyBmaWxlcyBjaGFuZ2VkLCAxMTIgaW5zZXJ0aW9u cygrKSwgMjYgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2 aWNldHJlZS9iaW5kaW5ncy9wY2kvZnNsLGlteDZxLXBjaWUudHh0IGIvRG9jdW1lbnRhdGlvbi9k ZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS9mc2wsaW14NnEtcGNpZS50eHQKPiBpbmRleCA4M2FlYjFm Li4xMWRiMmFiIDEwMDY0NAo+IC0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5n cy9wY2kvZnNsLGlteDZxLXBjaWUudHh0Cj4gKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVl L2JpbmRpbmdzL3BjaS9mc2wsaW14NnEtcGNpZS50eHQKPiBAQCAtNCw3ICs0LDExIEBAIFRoaXMg UENJZSBob3N0IGNvbnRyb2xsZXIgaXMgYmFzZWQgb24gdGhlIFN5bm9wc2lzIERlc2lnbndhcmUg UENJZSBJUAo+ICBhbmQgdGh1cyBpbmhlcml0cyBhbGwgdGhlIGNvbW1vbiBwcm9wZXJ0aWVzIGRl ZmluZWQgaW4gZGVzaWdud2FyZS1wY2llLnR4dC4KPiAgCj4gIFJlcXVpcmVkIHByb3BlcnRpZXM6 Cj4gLS0gY29tcGF0aWJsZTogImZzbCxpbXg2cS1wY2llIiwgImZzbCxpbXg2c3gtcGNpZSIsICJm c2wsaW14NnFwLXBjaWUiCj4gKy0gY29tcGF0aWJsZToKPiArCS0gImZzbCxpbXg2cS1wY2llIgo+ ICsJLSAiZnNsLGlteDZzeC1wY2llIiwKPiArCS0gImZzbCxpbXg2cXAtcGNpZSIKPiArCS0gImZz bCxpbXg3ZC1wY2llIgo+ICAtIHJlZzogYmFzZSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIFBD SWUgY29udHJvbGxlcgo+ICAtIGludGVycnVwdHM6IEEgbGlzdCBvZiBpbnRlcnJ1cHQgb3V0cHV0 cyBvZiB0aGUgY29udHJvbGxlci4gTXVzdCBjb250YWluIGFuCj4gICAgZW50cnkgZm9yIGVhY2gg ZW50cnkgaW4gdGhlIGludGVycnVwdC1uYW1lcyBwcm9wZXJ0eS4KPiBAQCAtMzQsNiArMzgsMTMg QEAgQWRkaXRpb25hbCByZXF1aXJlZCBwcm9wZXJ0aWVzIGZvciBpbXg2c3gtcGNpZToKPiAgLSBj bG9jayBuYW1lczogTXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBlbnRyaWVz Ogo+ICAJLSAicGNpZV9pbmJvdW5kX2F4aSIKPiAgCj4gK0FkZGl0aW9uYWwgcmVxdWlyZWQgcHJv cGVydGllcyBmb3IgaW14N2QtcGNpZToKPiArLSBwb3dlci1kb21haW5zOiBNdXN0IGJlIHNldCB0 byBhIHBoYW5kbGUgcG9pbnRpbmcgdG8gUENJRV9QSFkgcG93ZXIgZG9tYWluCj4gKy0gcmVzZXRz OiBNdXN0IGNvbnRhaW4gcGhhbmRsZXMgdG8gUENJRSByZWxhdGVkIHJlc2V0IGxpbmVzIGV4cG9z ZWQgYnkgU1JDIElQIGJsb2NrCj4gKy0gcmVzZXQtbmFtZXM6IE11c3QgY29udGFpbiB0aGUgZm9s bG93aW5nIGVudGlyZXM6Cj4gKyAgCSAgICAgICAtICJwY2llcGh5Igo+ICsJICAgICAgIC0gImFw cHMiCj4gKwo+ICBFeGFtcGxlOgo+ICAKPiAgCXBjaWVAMHgwMTAwMDAwMCB7Cj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWlteDYuYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWlt eDYuYwo+IGluZGV4IDUwYTEyOTEuLjJmM2YzNzUgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9wY2kv aG9zdC9wY2ktaW14Ni5jCj4gKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2ktaW14Ni5jCj4gQEAg LTE3LDYgKzE3LDcgQEAKPiAgI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgo+ICAjaW5jbHVkZSA8 bGludXgvbWZkL3N5c2Nvbi5oPgo+ICAjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi9pbXg2cS1p b211eGMtZ3ByLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uL2lteDctaW9tdXhjLWdw ci5oPgo+ICAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gICNpbmNsdWRlIDxsaW51eC9vZl9n cGlvLmg+Cj4gICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KPiBAQCAtMjcsNiArMjgsNyBA QAo+ICAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+Cj4gICNpbmNsdWRlIDxsaW51eC90eXBlcy5o Pgo+ICAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9yZXNl dC5oPgo+ICAKPiAgI2luY2x1ZGUgInBjaWUtZGVzaWdud2FyZS5oIgo+ICAKPiBAQCAtMzYsNiAr MzgsNyBAQCBlbnVtIGlteDZfcGNpZV92YXJpYW50cyB7Cj4gIAlJTVg2USwKPiAgCUlNWDZTWCwK PiAgCUlNWDZRUCwKPiArCUlNWDdELAo+ICB9Owo+ICAKPiAgc3RydWN0IGlteDZfcGNpZSB7Cj4g QEAgLTQ3LDYgKzUwLDggQEAgc3RydWN0IGlteDZfcGNpZSB7Cj4gIAlzdHJ1Y3QgY2xrCQkqcGNp ZV9pbmJvdW5kX2F4aTsKPiAgCXN0cnVjdCBjbGsJCSpwY2llOwo+ICAJc3RydWN0IHJlZ21hcAkJ KmlvbXV4Y19ncHI7Cj4gKwlzdHJ1Y3QgcmVzZXRfY29udHJvbAkqcGNpZXBoeV9yZXNldDsKPiAr CXN0cnVjdCByZXNldF9jb250cm9sCSphcHBzX3Jlc2V0Owo+ICAJZW51bSBpbXg2X3BjaWVfdmFy aWFudHMgdmFyaWFudDsKPiAgCXUzMgkJCXR4X2RlZW1waF9nZW4xOwo+ICAJdTMyCQkJdHhfZGVl bXBoX2dlbjJfM3A1ZGI7Cj4gQEAgLTU2LDYgKzYxLDExIEBAIHN0cnVjdCBpbXg2X3BjaWUgewo+ ICAJaW50CQkJbGlua19nZW47Cj4gIH07Cj4gIAo+ICsvKiBQYXJhbWV0ZXJzIGZvciB0aGUgd2Fp dGluZyBmb3IgUENJZSBQSFkgUExMIHRvIGxvY2sgb24gaS5NWDcgKi8KPiArI2RlZmluZSBQSFlf UExMX0xPQ0tfV0FJVF9NQVhfUkVUUklFUwkyMDAwCj4gKyNkZWZpbmUgUEhZX1BMTF9MT0NLX1dB SVRfVVNMRUVQX01JTgk1MAo+ICsjZGVmaW5lIFBIWV9QTExfTE9DS19XQUlUX1VTTEVFUF9NQVgJ MjAwCj4gKwo+ICAvKiBQQ0llIFJvb3QgQ29tcGxleCByZWdpc3RlcnMgKG1lbW9yeS1tYXBwZWQp ICovCj4gICNkZWZpbmUgUENJRV9SQ19MQ1IJCQkJMHg3Ywo+ICAjZGVmaW5lIFBDSUVfUkNfTENS X01BWF9MSU5LX1NQRUVEU19HRU4xCTB4MQo+IEBAIC0yNTEsNiArMjYxLDEwIEBAIHN0YXRpYyB2 b2lkIGlteDZfcGNpZV9hc3NlcnRfY29yZV9yZXNldChzdHJ1Y3QgaW14Nl9wY2llICppbXg2X3Bj aWUpCj4gIAl1MzIgdmFsLCBncHIxLCBncHIxMjsKPiAgCj4gIAlzd2l0Y2ggKGlteDZfcGNpZS0+ dmFyaWFudCkgewo+ICsJY2FzZSBJTVg3RDoKPiArCQlyZXNldF9jb250cm9sX2Fzc2VydChpbXg2 X3BjaWUtPnBjaWVwaHlfcmVzZXQpOwo+ICsJCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KGlteDZfcGNp ZS0+YXBwc19yZXNldCk7Cj4gKwkJYnJlYWs7Cj4gIAljYXNlIElNWDZTWDoKPiAgCQlyZWdtYXBf dXBkYXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJT01VWENfR1BSMTIsCj4gIAkJCQkg ICBJTVg2U1hfR1BSMTJfUENJRV9URVNUX1BPV0VSRE9XTiwKPiBAQCAtMzMzLDExICszNDcsMzMg QEAgc3RhdGljIGludCBpbXg2X3BjaWVfZW5hYmxlX3JlZl9jbGsoc3RydWN0IGlteDZfcGNpZSAq aW14Nl9wY2llKQo+ICAJCXJlZ21hcF91cGRhdGVfYml0cyhpbXg2X3BjaWUtPmlvbXV4Y19ncHIs IElPTVVYQ19HUFIxLAo+ICAJCQkJICAgSU1YNlFfR1BSMV9QQ0lFX1JFRl9DTEtfRU4sIDEgPDwg MTYpOwo+ICAJCWJyZWFrOwo+ICsJY2FzZSBJTVg3RDoKPiArCQlicmVhazsKPiAgCX0KPiAgCj4g IAlyZXR1cm4gcmV0Owo+ICB9Cj4gIAo+ICtzdGF0aWMgdm9pZCBpbXg3ZF9wY2llX3dhaXRfZm9y X3BoeV9wbGxfbG9jayhzdHJ1Y3QgaW14Nl9wY2llICppbXg2X3BjaWUpCj4gK3sKPiArCXUzMiB2 YWw7Cj4gKwl1bnNpZ25lZCBpbnQgcmV0cmllczsKPiArCXN0cnVjdCBwY2llX3BvcnQgKnBwID0g JmlteDZfcGNpZS0+cHA7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwcC0+ZGV2Owo+ICsKPiAr CWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCBQSFlfUExMX0xPQ0tfV0FJVF9NQVhfUkVUUklF UzsgcmV0cmllcysrKSB7Cj4gKwkJcmVnbWFwX3JlYWQoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJ T01VWENfR1BSMjIsICZ2YWwpOwo+ICsKPiArCQlpZiAodmFsICYgSU1YN0RfR1BSMjJfUENJRV9Q SFlfUExMX0xPQ0tFRCkKPiArCQkJcmV0dXJuOwo+ICsKPiArCQl1c2xlZXBfcmFuZ2UoUEhZX1BM TF9MT0NLX1dBSVRfVVNMRUVQX01JTiwKPiArCQkJICAgICBQSFlfUExMX0xPQ0tfV0FJVF9VU0xF RVBfTUFYKTsKPiArCX0KPiArCj4gKwlkZXZfZXJyKGRldiwgIlBDSWUgUExMIGxvY2sgdGltZW91 dFxuIik7Cj4gK30KPiArCj4gIHN0YXRpYyB2b2lkIGlteDZfcGNpZV9kZWFzc2VydF9jb3JlX3Jl c2V0KHN0cnVjdCBpbXg2X3BjaWUgKmlteDZfcGNpZSkKPiAgewo+ICAJc3RydWN0IHBjaWVfcG9y dCAqcHAgPSAmaW14Nl9wY2llLT5wcDsKPiBAQCAtMzgxLDYgKzQxNywxMCBAQCBzdGF0aWMgdm9p ZCBpbXg2X3BjaWVfZGVhc3NlcnRfY29yZV9yZXNldChzdHJ1Y3QgaW14Nl9wY2llICppbXg2X3Bj aWUpCj4gIAl9Cj4gIAo+ICAJc3dpdGNoIChpbXg2X3BjaWUtPnZhcmlhbnQpIHsKPiArCWNhc2Ug SU1YN0Q6Cj4gKwkJcmVzZXRfY29udHJvbF9kZWFzc2VydChpbXg2X3BjaWUtPnBjaWVwaHlfcmVz ZXQpOwo+ICsJCWlteDdkX3BjaWVfd2FpdF9mb3JfcGh5X3BsbF9sb2NrKGlteDZfcGNpZSk7Cj4g KwkJYnJlYWs7Cj4gIAljYXNlIElNWDZTWDoKPiAgCQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14Nl9w Y2llLT5pb211eGNfZ3ByLCBJT01VWENfR1BSNSwKPiAgCQkJCSAgIElNWDZTWF9HUFI1X1BDSUVf QlROUlNUX1JFU0VULCAwKTsKPiBAQCAtNDA3LDM1ICs0NDcsNDQgQEAgc3RhdGljIHZvaWQgaW14 Nl9wY2llX2RlYXNzZXJ0X2NvcmVfcmVzZXQoc3RydWN0IGlteDZfcGNpZSAqaW14Nl9wY2llKQo+ ICAKPiAgc3RhdGljIHZvaWQgaW14Nl9wY2llX2luaXRfcGh5KHN0cnVjdCBpbXg2X3BjaWUgKmlt eDZfcGNpZSkKPiAgewo+IC0JaWYgKGlteDZfcGNpZS0+dmFyaWFudCA9PSBJTVg2U1gpCj4gKwlz d2l0Y2ggKGlteDZfcGNpZS0+dmFyaWFudCkgewo+ICsJY2FzZSBJTVg3RDoKPiArCQlyZWdtYXBf dXBkYXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJT01VWENfR1BSMTIsCj4gKwkJCQkg ICBJTVg3RF9HUFIxMl9QQ0lFX1BIWV9SRUZDTEtfU0VMLCAwKTsKPiArCQlicmVhazsKPiArCWNh c2UgSU1YNlNYOgo+ICAJCXJlZ21hcF91cGRhdGVfYml0cyhpbXg2X3BjaWUtPmlvbXV4Y19ncHIs IElPTVVYQ19HUFIxMiwKPiAgCQkJCSAgIElNWDZTWF9HUFIxMl9QQ0lFX1JYX0VRX01BU0ssCj4g IAkJCQkgICBJTVg2U1hfR1BSMTJfUENJRV9SWF9FUV8yKTsKPiArCQkvKiBGQUxMVEhST1VHSCAq Lwo+ICsJZGVmYXVsdDoKPiArCQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNf Z3ByLCBJT01VWENfR1BSMTIsCj4gKwkJCQkgICBJTVg2UV9HUFIxMl9QQ0lFX0NUTF8yLCAwIDw8 IDEwKTsKPiAgCj4gLQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJ T01VWENfR1BSMTIsCj4gLQkJCUlNWDZRX0dQUjEyX1BDSUVfQ1RMXzIsIDAgPDwgMTApOwo+ICsJ CS8qIGNvbmZpZ3VyZSBjb25zdGFudCBpbnB1dCBzaWduYWwgdG8gdGhlIHBjaWUgY3RybCBhbmQg cGh5ICovCj4gKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGlteDZfcGNpZS0+aW9tdXhjX2dwciwgSU9N VVhDX0dQUjEyLAo+ICsJCQkJICAgSU1YNlFfR1BSMTJfTE9TX0xFVkVMLCA5IDw8IDQpOwo+ICsK PiArCQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJT01VWENfR1BS OCwKPiArCQkJCSAgIElNWDZRX0dQUjhfVFhfREVFTVBIX0dFTjEsCj4gKwkJCQkgICBpbXg2X3Bj aWUtPnR4X2RlZW1waF9nZW4xIDw8IDApOwo+ICsJCXJlZ21hcF91cGRhdGVfYml0cyhpbXg2X3Bj aWUtPmlvbXV4Y19ncHIsIElPTVVYQ19HUFI4LAo+ICsJCQkJICAgSU1YNlFfR1BSOF9UWF9ERUVN UEhfR0VOMl8zUDVEQiwKPiArCQkJCSAgIGlteDZfcGNpZS0+dHhfZGVlbXBoX2dlbjJfM3A1ZGIg PDwgNik7Cj4gKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGlteDZfcGNpZS0+aW9tdXhjX2dwciwgSU9N VVhDX0dQUjgsCj4gKwkJCQkgICBJTVg2UV9HUFI4X1RYX0RFRU1QSF9HRU4yXzZEQiwKPiArCQkJ CSAgIGlteDZfcGNpZS0+dHhfZGVlbXBoX2dlbjJfNmRiIDw8IDEyKTsKPiArCQlyZWdtYXBfdXBk YXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJT01VWENfR1BSOCwKPiArCQkJCSAgIElN WDZRX0dQUjhfVFhfU1dJTkdfRlVMTCwKPiArCQkJCSAgIGlteDZfcGNpZS0+dHhfc3dpbmdfZnVs bCA8PCAxOCk7Cj4gKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGlteDZfcGNpZS0+aW9tdXhjX2dwciwg SU9NVVhDX0dQUjgsCj4gKwkJCQkgICBJTVg2UV9HUFI4X1RYX1NXSU5HX0xPVywKPiArCQkJCSAg IGlteDZfcGNpZS0+dHhfc3dpbmdfbG93IDw8IDI1KTsKPiArCQlicmVhazsKPiArCX0KPiAgCj4g LQkvKiBjb25maWd1cmUgY29uc3RhbnQgaW5wdXQgc2lnbmFsIHRvIHRoZSBwY2llIGN0cmwgYW5k IHBoeSAqLwo+ICAJcmVnbWFwX3VwZGF0ZV9iaXRzKGlteDZfcGNpZS0+aW9tdXhjX2dwciwgSU9N VVhDX0dQUjEyLAo+ICAJCQlJTVg2UV9HUFIxMl9ERVZJQ0VfVFlQRSwgUENJX0VYUF9UWVBFX1JP T1RfUE9SVCA8PCAxMik7Cj4gLQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNf Z3ByLCBJT01VWENfR1BSMTIsCj4gLQkJCUlNWDZRX0dQUjEyX0xPU19MRVZFTCwgOSA8PCA0KTsK PiAtCj4gLQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJT01VWENf R1BSOCwKPiAtCQkJICAgSU1YNlFfR1BSOF9UWF9ERUVNUEhfR0VOMSwKPiAtCQkJICAgaW14Nl9w Y2llLT50eF9kZWVtcGhfZ2VuMSA8PCAwKTsKPiAtCXJlZ21hcF91cGRhdGVfYml0cyhpbXg2X3Bj aWUtPmlvbXV4Y19ncHIsIElPTVVYQ19HUFI4LAo+IC0JCQkgICBJTVg2UV9HUFI4X1RYX0RFRU1Q SF9HRU4yXzNQNURCLAo+IC0JCQkgICBpbXg2X3BjaWUtPnR4X2RlZW1waF9nZW4yXzNwNWRiIDw8 IDYpOwo+IC0JcmVnbWFwX3VwZGF0ZV9iaXRzKGlteDZfcGNpZS0+aW9tdXhjX2dwciwgSU9NVVhD X0dQUjgsCj4gLQkJCSAgIElNWDZRX0dQUjhfVFhfREVFTVBIX0dFTjJfNkRCLAo+IC0JCQkgICBp bXg2X3BjaWUtPnR4X2RlZW1waF9nZW4yXzZkYiA8PCAxMik7Cj4gLQlyZWdtYXBfdXBkYXRlX2Jp dHMoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJT01VWENfR1BSOCwKPiAtCQkJICAgSU1YNlFfR1BS OF9UWF9TV0lOR19GVUxMLAo+IC0JCQkgICBpbXg2X3BjaWUtPnR4X3N3aW5nX2Z1bGwgPDwgMTgp Owo+IC0JcmVnbWFwX3VwZGF0ZV9iaXRzKGlteDZfcGNpZS0+aW9tdXhjX2dwciwgSU9NVVhDX0dQ UjgsCj4gLQkJCSAgIElNWDZRX0dQUjhfVFhfU1dJTkdfTE9XLAo+IC0JCQkgICBpbXg2X3BjaWUt PnR4X3N3aW5nX2xvdyA8PCAyNSk7Cj4gIH0KPiAgCj4gIHN0YXRpYyBpbnQgaW14Nl9wY2llX3dh aXRfZm9yX2xpbmsoc3RydWN0IGlteDZfcGNpZSAqaW14Nl9wY2llKQo+IEBAIC00OTgsOCArNTQ3 LDExIEBAIHN0YXRpYyBpbnQgaW14Nl9wY2llX2VzdGFibGlzaF9saW5rKHN0cnVjdCBpbXg2X3Bj aWUgKmlteDZfcGNpZSkKPiAgCWR3X3BjaWVfd3JpdGVsX3JjKHBwLCBQQ0lFX1JDX0xDUiwgdG1w KTsKPiAgCj4gIAkvKiBTdGFydCBMVFNTTS4gKi8KPiAtCXJlZ21hcF91cGRhdGVfYml0cyhpbXg2 X3BjaWUtPmlvbXV4Y19ncHIsIElPTVVYQ19HUFIxMiwKPiAtCQkJSU1YNlFfR1BSMTJfUENJRV9D VExfMiwgMSA8PCAxMCk7Cj4gKwlpZiAoaW14Nl9wY2llLT52YXJpYW50ID09IElNWDdEKQo+ICsJ CXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQoaW14Nl9wY2llLT5hcHBzX3Jlc2V0KTsKPiArCWVsc2UK PiArCQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJT01VWENfR1BS MTIsCj4gKwkJCQkgICBJTVg2UV9HUFIxMl9QQ0lFX0NUTF8yLCAxIDw8IDEwKTsKPiAgCj4gIAly ZXQgPSBpbXg2X3BjaWVfd2FpdF9mb3JfbGluayhpbXg2X3BjaWUpOwo+ICAJaWYgKHJldCkgewo+ IEBAIC02NzQsMTMgKzcyNiwzMSBAQCBzdGF0aWMgaW50IF9faW5pdCBpbXg2X3BjaWVfcHJvYmUo c3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiAgCQlyZXR1cm4gUFRSX0VSUihpbXg2X3Bj aWUtPnBjaWUpOwo+ICAJfQo+ICAKPiAtCWlmIChpbXg2X3BjaWUtPnZhcmlhbnQgPT0gSU1YNlNY KSB7Cj4gKwlzd2l0Y2ggKGlteDZfcGNpZS0+dmFyaWFudCkgewo+ICsJY2FzZSBJTVg2U1g6Cj4g IAkJaW14Nl9wY2llLT5wY2llX2luYm91bmRfYXhpID0gZGV2bV9jbGtfZ2V0KGRldiwKPiAgCQkJ CQkJCSAgICJwY2llX2luYm91bmRfYXhpIik7Cj4gIAkJaWYgKElTX0VSUihpbXg2X3BjaWUtPnBj aWVfaW5ib3VuZF9heGkpKSB7Cj4gIAkJCWRldl9lcnIoZGV2LCAicGNpZV9pbmJvdW5kX2F4aSBj bG9jayBtaXNzaW5nIG9yIGludmFsaWRcbiIpOwo+ICAJCQlyZXR1cm4gUFRSX0VSUihpbXg2X3Bj aWUtPnBjaWVfaW5ib3VuZF9heGkpOwo+ICAJCX0KPiArCQlicmVhazsKPiArCWNhc2UgSU1YN0Q6 Cj4gKwkJaW14Nl9wY2llLT5wY2llcGh5X3Jlc2V0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldChk ZXYsCj4gKwkJCQkJCQkJICAicGNpZXBoeSIpOwo+ICsJCWlmIChJU19FUlIoaW14Nl9wY2llLT5w Y2llcGh5X3Jlc2V0KSkgewo+ICsJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBnZXQgUENJRVBI WSByZXNldCBjb250b2xcbiIpOwo+ICsJCQlyZXR1cm4gUFRSX0VSUihpbXg2X3BjaWUtPnBjaWVw aHlfcmVzZXQpOwo+ICsJCX0KPiArCj4gKwkJaW14Nl9wY2llLT5hcHBzX3Jlc2V0ID0gZGV2bV9y ZXNldF9jb250cm9sX2dldChkZXYsICJhcHBzIik7Cj4gKwkJaWYgKElTX0VSUihpbXg2X3BjaWUt PmFwcHNfcmVzZXQpKSB7Cj4gKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCBQQ0lFIEFQ UFMgcmVzZXQgY29udG9sXG4iKTsKPiArCQkJcmV0dXJuIFBUUl9FUlIoaW14Nl9wY2llLT5hcHBz X3Jlc2V0KTsKPiArCQl9Cj4gKwkJYnJlYWs7Cj4gKwlkZWZhdWx0Ogo+ICsJCWJyZWFrOwo+ICAJ fQo+ICAKPiAgCS8qIEdyYWIgR1BSIGNvbmZpZyByZWdpc3RlciByYW5nZSAqLwo+IEBAIC03Mzgs NiArODA4LDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgaW14Nl9wY2llX29m X21hdGNoW10gPSB7Cj4gIAl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg2cS1wY2llIiwgIC5kYXRh ID0gKHZvaWQgKilJTVg2USwgIH0sCj4gIAl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg2c3gtcGNp ZSIsIC5kYXRhID0gKHZvaWQgKilJTVg2U1gsIH0sCj4gIAl7IC5jb21wYXRpYmxlID0gImZzbCxp bXg2cXAtcGNpZSIsIC5kYXRhID0gKHZvaWQgKilJTVg2UVAsIH0sCj4gKwl7IC5jb21wYXRpYmxl ID0gImZzbCxpbXg3ZC1wY2llIiwgIC5kYXRhID0gKHZvaWQgKilJTVg3RCwgIH0sCj4gIAl7fSwK PiAgfTsKPiAgCj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3N5c2Nvbi9pbXg3LWlv bXV4Yy1ncHIuaCBiL2luY2x1ZGUvbGludXgvbWZkL3N5c2Nvbi9pbXg3LWlvbXV4Yy1ncHIuaAo+ IGluZGV4IDQ1ODVkNjEuLmFiYmQ1MjQgMTAwNjQ0Cj4gLS0tIGEvaW5jbHVkZS9saW51eC9tZmQv c3lzY29uL2lteDctaW9tdXhjLWdwci5oCj4gKysrIGIvaW5jbHVkZS9saW51eC9tZmQvc3lzY29u L2lteDctaW9tdXhjLWdwci5oCj4gQEAgLTQ0LDQgKzQ0LDggQEAKPiAgCj4gICNkZWZpbmUgSU1Y N0RfR1BSNV9DU0lfTVVYX0NPTlRST0xfTUlQSQkJKDB4MSA8PCA0KQo+ICAKPiArI2RlZmluZSBJ TVg3RF9HUFIxMl9QQ0lFX1BIWV9SRUZDTEtfU0VMCQlCSVQoNSkKPiArCj4gKyNkZWZpbmUgSU1Y N0RfR1BSMjJfUENJRV9QSFlfUExMX0xPQ0tFRAkJQklUKDMxKQo+ICsKPiAgI2VuZGlmIC8qIF9f TElOVVhfSU1YN19JT01VWENfR1BSX0ggKi8KCi0tIApMZWUgSm9uZXMKTGluYXJvIFNUTWljcm9l bGVjdHJvbmljcyBMYW5kaW5nIFRlYW0gTGVhZApMaW5hcm8ub3JnIOKUgiBPcGVuIHNvdXJjZSBz b2Z0d2FyZSBmb3IgQVJNIFNvQ3MKRm9sbG93IExpbmFybzogRmFjZWJvb2sgfCBUd2l0dGVyIHwg QmxvZwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGlu dXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRl YWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgt YXJtLWtlcm5lbAo= ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v5 2/4] PCI: imx6: Do not wait for speed change on i.MX7 2017-02-20 15:30 [PATCH v5 0/4] i.MX7 PCI support Andrey Smirnov 2017-02-20 15:30 ` [PATCH v5 1/4] PCI: imx6: Add code to support i.MX7D Andrey Smirnov @ 2017-02-20 15:30 ` Andrey Smirnov 2017-02-20 15:30 ` [PATCH v5 3/4] PCI: imx6: Do not switch speed if Gen2 is disabled Andrey Smirnov ` (2 subsequent siblings) 4 siblings, 0 replies; 7+ messages in thread From: Andrey Smirnov @ 2017-02-20 15:30 UTC (permalink / raw) To: linux-pci; +Cc: Andrey Smirnov As can be seen from [1]: "...the different behavior between iMX6Q PCIe and iMX7D PCIe maybe caused by the different controller version. Regarding to the DOC description, the DIRECT_SPEED_CHANGE should be cleared after the speed change from GEN1 to GEN2. Unfortunately, when GEN1 device is used, the behavior is not documented. So, IC design guys run the simulation and find out the following behaviors: 1. DIRECT_SPEED_CHANGE will be cleared in 7D after speed change from GEN1 to GEN2. This matches doc’s description 2. set MAX link speed(PCIE_CAP_TARGET_LINK_SPEED=0x01) as GEN1 and re-run the simulation, DIRECT_SPEED_CHANGE will not be cleared; remain as 1, this matches your result, but function test is passed, so this bit should not affect the normal PCIe function. ..." imx6_pcie_wait_for_speed_change will report false failures for Gen1 -> Gen1 speed transition, so avoid doing that check and just rely on imx6_pcie_wait_for_link only. [1] https://community.nxp.com/message/867943 Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> --- drivers/pci/host/pci-imx6.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c index 2f3f375..473bbdc 100644 --- a/drivers/pci/host/pci-imx6.c +++ b/drivers/pci/host/pci-imx6.c @@ -577,10 +577,21 @@ static int imx6_pcie_establish_link(struct imx6_pcie *imx6_pcie) tmp |= PORT_LOGIC_SPEED_CHANGE; dw_pcie_writel_rc(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, tmp); - ret = imx6_pcie_wait_for_speed_change(imx6_pcie); - if (ret) { - dev_err(dev, "Failed to bring link up!\n"); - goto err_reset_phy; + if (imx6_pcie->variant != IMX7D) { + /* + * On i.MX7, DIRECT_SPEED_CHANGE behaves differently + * from i.MX6 family when no link speed transition + * occurs and we go Gen1 -> yep, Gen1. The difference + * is that, in such case, it will not be cleared by HW + * which will cause the following code to report false + * failure. + */ + + ret = imx6_pcie_wait_for_speed_change(imx6_pcie); + if (ret) { + dev_err(dev, "Failed to bring link up!\n"); + goto err_reset_phy; + } } /* Make sure link training is finished as well! */ -- 2.9.3 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v5 3/4] PCI: imx6: Do not switch speed if Gen2 is disabled 2017-02-20 15:30 [PATCH v5 0/4] i.MX7 PCI support Andrey Smirnov 2017-02-20 15:30 ` [PATCH v5 1/4] PCI: imx6: Add code to support i.MX7D Andrey Smirnov 2017-02-20 15:30 ` [PATCH v5 2/4] PCI: imx6: Do not wait for speed change on i.MX7 Andrey Smirnov @ 2017-02-20 15:30 ` Andrey Smirnov 2017-02-20 15:30 ` [PATCH v5 4/4] PCI: imx6: Allow probe deferal by reset GPIO Andrey Smirnov 2017-02-20 15:47 ` [PATCH v5 0/4] i.MX7 PCI support Andrey Smirnov 4 siblings, 0 replies; 7+ messages in thread From: Andrey Smirnov @ 2017-02-20 15:30 UTC (permalink / raw) To: linux-pci; +Cc: Andrey Smirnov Save a bit of time and avoid going through link speed change procedure in configuration where link max speed is limited to Gen1 in DT. Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> --- drivers/pci/host/pci-imx6.c | 52 ++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c index 473bbdc..071251f3 100644 --- a/drivers/pci/host/pci-imx6.c +++ b/drivers/pci/host/pci-imx6.c @@ -565,40 +565,40 @@ static int imx6_pcie_establish_link(struct imx6_pcie *imx6_pcie) tmp &= ~PCIE_RC_LCR_MAX_LINK_SPEEDS_MASK; tmp |= PCIE_RC_LCR_MAX_LINK_SPEEDS_GEN2; dw_pcie_writel_rc(pp, PCIE_RC_LCR, tmp); - } else { - dev_info(dev, "Link: Gen2 disabled\n"); - } - - /* - * Start Directed Speed Change so the best possible speed both link - * partners support can be negotiated. - */ - tmp = dw_pcie_readl_rc(pp, PCIE_LINK_WIDTH_SPEED_CONTROL); - tmp |= PORT_LOGIC_SPEED_CHANGE; - dw_pcie_writel_rc(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, tmp); - if (imx6_pcie->variant != IMX7D) { /* - * On i.MX7, DIRECT_SPEED_CHANGE behaves differently - * from i.MX6 family when no link speed transition - * occurs and we go Gen1 -> yep, Gen1. The difference - * is that, in such case, it will not be cleared by HW - * which will cause the following code to report false - * failure. + * Start Directed Speed Change so the best possible + * speed both link partners support can be negotiated. */ + tmp = dw_pcie_readl_rc(pp, PCIE_LINK_WIDTH_SPEED_CONTROL); + tmp |= PORT_LOGIC_SPEED_CHANGE; + dw_pcie_writel_rc(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, tmp); + + if (imx6_pcie->variant != IMX7D) { + /* + * On i.MX7, DIRECT_SPEED_CHANGE behaves differently + * from i.MX6 family when no link speed transition + * occurs and we go Gen1 -> yep, Gen1. The difference + * is that, in such case, it will not be cleared by HW + * which will cause the following code to report false + * failure. + */ + + ret = imx6_pcie_wait_for_speed_change(imx6_pcie); + if (ret) { + dev_err(dev, "Failed to bring link up!\n"); + goto err_reset_phy; + } + } - ret = imx6_pcie_wait_for_speed_change(imx6_pcie); + /* Make sure link training is finished as well! */ + ret = imx6_pcie_wait_for_link(imx6_pcie); if (ret) { dev_err(dev, "Failed to bring link up!\n"); goto err_reset_phy; } - } - - /* Make sure link training is finished as well! */ - ret = imx6_pcie_wait_for_link(imx6_pcie); - if (ret) { - dev_err(dev, "Failed to bring link up!\n"); - goto err_reset_phy; + } else { + dev_info(dev, "Link: Gen2 disabled\n"); } tmp = dw_pcie_readl_rc(pp, PCIE_RC_LCSR); -- 2.9.3 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v5 4/4] PCI: imx6: Allow probe deferal by reset GPIO 2017-02-20 15:30 [PATCH v5 0/4] i.MX7 PCI support Andrey Smirnov ` (2 preceding siblings ...) 2017-02-20 15:30 ` [PATCH v5 3/4] PCI: imx6: Do not switch speed if Gen2 is disabled Andrey Smirnov @ 2017-02-20 15:30 ` Andrey Smirnov 2017-02-20 15:47 ` [PATCH v5 0/4] i.MX7 PCI support Andrey Smirnov 4 siblings, 0 replies; 7+ messages in thread From: Andrey Smirnov @ 2017-02-20 15:30 UTC (permalink / raw) To: linux-pci Cc: Andrey Smirnov, linux-kernel, Fabio Estevam, Bjorn Helgaas, yurovsky, linux-arm-kernel, Lucas Stach Some designs implement reset GPIO via a GPIO expander connected to a peripheral bus. One such example would be i.MX7 Sabre board where said GPIO is provided by SPI shift register connected to a bitbanged SPI bus. In order to support such designs allow reset GPIO request to defer probing of the driver. Cc: yurovsky@gmail.com Cc: Lucas Stach <l.stach@pengutronix.de> Cc: Bjorn Helgaas <bhelgaas@google.com> Cc: Fabio Estevam <fabio.estevam@nxp.com> Cc: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org Reviewed-by: Lucas Stach <l.stach@pengutronix.de> Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> --- drivers/pci/host/pci-imx6.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c index 071251f3..fe832e7f 100644 --- a/drivers/pci/host/pci-imx6.c +++ b/drivers/pci/host/pci-imx6.c @@ -638,8 +638,8 @@ static struct pcie_host_ops imx6_pcie_host_ops = { .host_init = imx6_pcie_host_init, }; -static int __init imx6_add_pcie_port(struct imx6_pcie *imx6_pcie, - struct platform_device *pdev) +static int imx6_add_pcie_port(struct imx6_pcie *imx6_pcie, + struct platform_device *pdev) { struct pcie_port *pp = &imx6_pcie->pp; struct device *dev = pp->dev; @@ -674,7 +674,7 @@ static int __init imx6_add_pcie_port(struct imx6_pcie *imx6_pcie, return 0; } -static int __init imx6_pcie_probe(struct platform_device *pdev) +static int imx6_pcie_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct imx6_pcie *imx6_pcie; @@ -693,10 +693,6 @@ static int __init imx6_pcie_probe(struct platform_device *pdev) imx6_pcie->variant = (enum imx6_pcie_variants)of_device_get_match_data(dev); - /* Added for PCI abort handling */ - hook_fault_code(16 + 6, imx6q_pcie_abort_handler, SIGBUS, 0, - "imprecise external abort"); - dbi_base = platform_get_resource(pdev, IORESOURCE_MEM, 0); pp->dbi_base = devm_ioremap_resource(dev, dbi_base); if (IS_ERR(pp->dbi_base)) @@ -716,6 +712,8 @@ static int __init imx6_pcie_probe(struct platform_device *pdev) dev_err(dev, "unable to get reset gpio\n"); return ret; } + } else if (imx6_pcie->reset_gpio == -EPROBE_DEFER) { + return imx6_pcie->reset_gpio; } /* Fetch clocks */ @@ -828,11 +826,22 @@ static struct platform_driver imx6_pcie_driver = { .name = "imx6q-pcie", .of_match_table = imx6_pcie_of_match, }, + .probe = imx6_pcie_probe, .shutdown = imx6_pcie_shutdown, }; static int __init imx6_pcie_init(void) { - return platform_driver_probe(&imx6_pcie_driver, imx6_pcie_probe); + /* + * Since probe() can be deferred we need to make sure that + * hook_fault_code is not called after __init memory is freed + * by kernel and since imx6q_pcie_abort_handler() is a no-op + * we can install the handler here without risking it + * accessing some unitialized driver state + */ + hook_fault_code(16 + 6, imx6q_pcie_abort_handler, SIGBUS, 0, + "imprecise external abort"); + + return platform_driver_register(&imx6_pcie_driver); } device_initcall(imx6_pcie_init); -- 2.9.3 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v5 0/4] i.MX7 PCI support 2017-02-20 15:30 [PATCH v5 0/4] i.MX7 PCI support Andrey Smirnov ` (3 preceding siblings ...) 2017-02-20 15:30 ` [PATCH v5 4/4] PCI: imx6: Allow probe deferal by reset GPIO Andrey Smirnov @ 2017-02-20 15:47 ` Andrey Smirnov 4 siblings, 0 replies; 7+ messages in thread From: Andrey Smirnov @ 2017-02-20 15:47 UTC (permalink / raw) To: linux-pci Cc: Andrey Smirnov, linux-kernel, Bjorn Helgaas, Rob Herring, Fabio Estevam, Andrey Yurovsky, linux-arm-kernel, Lucas Stach Ugh. Forgot to add correct CC list to patches #2 and #3 and drop Lucas' Reviewed-by from patch #4 since code there changed. Please ignore this thread. I'll resend all of the patches with aforementioned corrections shortly. Sorry for the noise. Andrey On Mon, Feb 20, 2017 at 7:30 AM, Andrey Smirnov <andrew.smirnov@gmail.com> wrote: > Hello, everyone: > > This is a fifth iteration of the code that adds PCI-subsystem bits > necessary for enabling PCI support on i.MX7. > > Rob, Bjorn, power domain and reset bindings remained the same, please > let me know if you still think that PHY aspect of the driver needs to > be moved into a separate abstraction. > > Changes since v4 (can be found at [version4]): > > - Dropped typo-fix patch (originally patch #1 of the > series). Bjorn, I am assuming that patch from v4 survived > and stayed in your tree, let me know if that is not true. > > - Added patch with workaround to address speed change false > failures (I kept it as a separate patch to better document > exchange with NXP/Freescale that lead to that patch) > > - Added patch to avoid speed change on links configured Gen1 > only (Let me know if that is a terrible idea) > > - Addressed section mismatch problem by moving call to > hook_fault_code to happend before driver registration. > > Changes since v3 (can be found at [version3]): > - Move all of the reset_control_assert's into imx6_pcie_assert_core_reset > - Documented required reset and power domain DT bindings > > Changes since v2 (can be found at [version2]): > > - Collected Reviewed-by for patch #2 from Lucas > - Reset logic implementation moved out into a reset controller > driver (see [reset1]) > - Removed unused leftover code > > Changes since v1 (can be found at [version1]): > > - All GPC related code moved into a separate driver (see [gpc1]) > - Removed GPIO probe deferral logging > - Fixed section mismatch warning > - Minor reformatting of fsl,imx6q-pcie.txt(as per Rob > Herring's request) > > [version4] https://lkml.org/lkml/2017/2/7/478 > [version3] https://lkml.org/lkml/2017/2/6/565 > [version2] https://lkml.org/lkml/2017/2/1/510 > [version1] https://lkml.org/lkml/2017/1/19/488 > [gpc1] https://lkml.org/lkml/2017/2/6/551 > [reset1] https://lkml.org/lkml/2017/2/6/554 > > Andrey Smirnov (4): > PCI: imx6: Add code to support i.MX7D > PCI: imx6: Do not wait for speed change on i.MX7 > PCI: imx6: Do not switch speed if Gen2 is disabled > PCI: imx6: Allow probe deferal by reset GPIO > > .../devicetree/bindings/pci/fsl,imx6q-pcie.txt | 13 +- > drivers/pci/host/pci-imx6.c | 199 +++++++++++++++------ > include/linux/mfd/syscon/imx7-iomuxc-gpr.h | 4 + > 3 files changed, 161 insertions(+), 55 deletions(-) > > -- > 2.9.3 > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2017-03-14 14:43 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-02-20 15:30 [PATCH v5 0/4] i.MX7 PCI support Andrey Smirnov 2017-02-20 15:30 ` [PATCH v5 1/4] PCI: imx6: Add code to support i.MX7D Andrey Smirnov 2017-03-14 14:43 ` Lee Jones 2017-02-20 15:30 ` [PATCH v5 2/4] PCI: imx6: Do not wait for speed change on i.MX7 Andrey Smirnov 2017-02-20 15:30 ` [PATCH v5 3/4] PCI: imx6: Do not switch speed if Gen2 is disabled Andrey Smirnov 2017-02-20 15:30 ` [PATCH v5 4/4] PCI: imx6: Allow probe deferal by reset GPIO Andrey Smirnov 2017-02-20 15:47 ` [PATCH v5 0/4] i.MX7 PCI support Andrey Smirnov
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).