All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] PCI: cadence: Disable Function Level Reset support
@ 2021-10-18 18:07 ` Parshuram Raju Thombare
  0 siblings, 0 replies; 6+ messages in thread
From: Parshuram Raju Thombare @ 2021-10-18 18:07 UTC (permalink / raw)
  To: kishon, tjoseph, lorenzo.pieralisi, robh, kw, bhelgaas
  Cc: linux-omap, linux-pci, linux-arm-kernel, linux-kernel, mparab, pthombar

From: Parshuram Thombare <pthombar@cadence.com>

This patch disables FLR (Function Level Reset) support on all physical
functions.
During FLR, the Margining Lane Status and Margining Lane Control
registers should not be reset, as per PCIe specification.
However, the Controller incorrectly resets these registers upon FLR.
This causes PCISIG compliance FLR test to fail. Hence disabling
FLR on all functions using quirk flag.

Signed-off-by: Parshuram Thombare <pthombar@cadence.com>
---
 drivers/pci/controller/cadence/pci-j721e.c       |  3 +++
 drivers/pci/controller/cadence/pcie-cadence-ep.c | 18 +++++++++++++++++-
 drivers/pci/controller/cadence/pcie-cadence.h    |  3 +++
 3 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/pci/controller/cadence/pci-j721e.c b/drivers/pci/controller/cadence/pci-j721e.c
index ffb176d..635e36c 100644
--- a/drivers/pci/controller/cadence/pci-j721e.c
+++ b/drivers/pci/controller/cadence/pci-j721e.c
@@ -70,6 +70,7 @@ struct j721e_pcie_data {
 	enum j721e_pcie_mode	mode;
 	unsigned int		quirk_retrain_flag:1;
 	unsigned int		quirk_detect_quiet_flag:1;
+	unsigned int		quirk_disable_flr:1;
 	u32			linkdown_irq_regfield;
 	unsigned int		byte_access_allowed:1;
 };
@@ -308,6 +309,7 @@ static int cdns_ti_pcie_config_write(struct pci_bus *bus, unsigned int devfn,
 static const struct j721e_pcie_data j7200_pcie_ep_data = {
 	.mode = PCI_MODE_EP,
 	.quirk_detect_quiet_flag = true,
+	.quirk_disable_flr = true,
 };
 
 static const struct j721e_pcie_data am64_pcie_rc_data = {
@@ -510,6 +512,7 @@ static int j721e_pcie_probe(struct platform_device *pdev)
 			goto err_get_sync;
 		}
 		ep->quirk_detect_quiet_flag = data->quirk_detect_quiet_flag;
+		ep->quirk_disable_flr = data->quirk_disable_flr;
 
 		cdns_pcie = &ep->pcie;
 		cdns_pcie->dev = dev;
diff --git a/drivers/pci/controller/cadence/pcie-cadence-ep.c b/drivers/pci/controller/cadence/pcie-cadence-ep.c
index 88e05b9..4b1c4bc 100644
--- a/drivers/pci/controller/cadence/pcie-cadence-ep.c
+++ b/drivers/pci/controller/cadence/pcie-cadence-ep.c
@@ -565,7 +565,8 @@ static int cdns_pcie_ep_start(struct pci_epc *epc)
 	struct cdns_pcie_ep *ep = epc_get_drvdata(epc);
 	struct cdns_pcie *pcie = &ep->pcie;
 	struct device *dev = pcie->dev;
-	int ret;
+	int max_epfs = sizeof(epc->function_num_map) * 8;
+	int ret, value, epf;
 
 	/*
 	 * BIT(0) is hardwired to 1, hence function 0 is always enabled
@@ -573,6 +574,21 @@ static int cdns_pcie_ep_start(struct pci_epc *epc)
 	 */
 	cdns_pcie_writel(pcie, CDNS_PCIE_LM_EP_FUNC_CFG, epc->function_num_map);
 
+	if (ep->quirk_disable_flr) {
+		for (epf = 0; epf < max_epfs; epf++) {
+			if (!(epc->function_num_map & BIT(epf)))
+				continue;
+
+			value = cdns_pcie_ep_fn_readl(pcie, epf,
+					CDNS_PCIE_EP_FUNC_DEV_CAP_OFFSET +
+					PCI_EXP_DEVCAP);
+			value &= ~PCI_EXP_DEVCAP_FLR;
+			cdns_pcie_ep_fn_writel(pcie, epf,
+					CDNS_PCIE_EP_FUNC_DEV_CAP_OFFSET +
+					PCI_EXP_DEVCAP, value);
+		}
+	}
+
 	ret = cdns_pcie_start_link(pcie);
 	if (ret) {
 		dev_err(dev, "Failed to start link\n");
diff --git a/drivers/pci/controller/cadence/pcie-cadence.h b/drivers/pci/controller/cadence/pcie-cadence.h
index 262421e..e978e7c 100644
--- a/drivers/pci/controller/cadence/pcie-cadence.h
+++ b/drivers/pci/controller/cadence/pcie-cadence.h
@@ -123,6 +123,7 @@
 
 #define CDNS_PCIE_EP_FUNC_MSI_CAP_OFFSET	0x90
 #define CDNS_PCIE_EP_FUNC_MSIX_CAP_OFFSET	0xb0
+#define CDNS_PCIE_EP_FUNC_DEV_CAP_OFFSET	0xc0
 #define CDNS_PCIE_EP_FUNC_SRIOV_CAP_OFFSET	0x200
 
 /*
@@ -357,6 +358,7 @@ struct cdns_pcie_epf {
  *        minimize time between read and write
  * @epf: Structure to hold info about endpoint function
  * @quirk_detect_quiet_flag: LTSSM Detect Quiet min delay set as quirk
+ * @quirk_disable_flr: Disable FLR (Function Level Reset) quirk flag
  */
 struct cdns_pcie_ep {
 	struct cdns_pcie	pcie;
@@ -372,6 +374,7 @@ struct cdns_pcie_ep {
 	spinlock_t		lock;
 	struct cdns_pcie_epf	*epf;
 	unsigned int		quirk_detect_quiet_flag:1;
+	unsigned int		quirk_disable_flr:1;
 };
 
 
-- 
1.9.1


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

* [PATCH] PCI: cadence: Disable Function Level Reset support
@ 2021-10-18 18:07 ` Parshuram Raju Thombare
  0 siblings, 0 replies; 6+ messages in thread
From: Parshuram Raju Thombare @ 2021-10-18 18:07 UTC (permalink / raw)
  To: kishon, tjoseph, lorenzo.pieralisi, robh, kw, bhelgaas
  Cc: linux-omap, linux-pci, linux-arm-kernel, linux-kernel, mparab, pthombar

From: Parshuram Thombare <pthombar@cadence.com>

This patch disables FLR (Function Level Reset) support on all physical
functions.
During FLR, the Margining Lane Status and Margining Lane Control
registers should not be reset, as per PCIe specification.
However, the Controller incorrectly resets these registers upon FLR.
This causes PCISIG compliance FLR test to fail. Hence disabling
FLR on all functions using quirk flag.

Signed-off-by: Parshuram Thombare <pthombar@cadence.com>
---
 drivers/pci/controller/cadence/pci-j721e.c       |  3 +++
 drivers/pci/controller/cadence/pcie-cadence-ep.c | 18 +++++++++++++++++-
 drivers/pci/controller/cadence/pcie-cadence.h    |  3 +++
 3 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/pci/controller/cadence/pci-j721e.c b/drivers/pci/controller/cadence/pci-j721e.c
index ffb176d..635e36c 100644
--- a/drivers/pci/controller/cadence/pci-j721e.c
+++ b/drivers/pci/controller/cadence/pci-j721e.c
@@ -70,6 +70,7 @@ struct j721e_pcie_data {
 	enum j721e_pcie_mode	mode;
 	unsigned int		quirk_retrain_flag:1;
 	unsigned int		quirk_detect_quiet_flag:1;
+	unsigned int		quirk_disable_flr:1;
 	u32			linkdown_irq_regfield;
 	unsigned int		byte_access_allowed:1;
 };
@@ -308,6 +309,7 @@ static int cdns_ti_pcie_config_write(struct pci_bus *bus, unsigned int devfn,
 static const struct j721e_pcie_data j7200_pcie_ep_data = {
 	.mode = PCI_MODE_EP,
 	.quirk_detect_quiet_flag = true,
+	.quirk_disable_flr = true,
 };
 
 static const struct j721e_pcie_data am64_pcie_rc_data = {
@@ -510,6 +512,7 @@ static int j721e_pcie_probe(struct platform_device *pdev)
 			goto err_get_sync;
 		}
 		ep->quirk_detect_quiet_flag = data->quirk_detect_quiet_flag;
+		ep->quirk_disable_flr = data->quirk_disable_flr;
 
 		cdns_pcie = &ep->pcie;
 		cdns_pcie->dev = dev;
diff --git a/drivers/pci/controller/cadence/pcie-cadence-ep.c b/drivers/pci/controller/cadence/pcie-cadence-ep.c
index 88e05b9..4b1c4bc 100644
--- a/drivers/pci/controller/cadence/pcie-cadence-ep.c
+++ b/drivers/pci/controller/cadence/pcie-cadence-ep.c
@@ -565,7 +565,8 @@ static int cdns_pcie_ep_start(struct pci_epc *epc)
 	struct cdns_pcie_ep *ep = epc_get_drvdata(epc);
 	struct cdns_pcie *pcie = &ep->pcie;
 	struct device *dev = pcie->dev;
-	int ret;
+	int max_epfs = sizeof(epc->function_num_map) * 8;
+	int ret, value, epf;
 
 	/*
 	 * BIT(0) is hardwired to 1, hence function 0 is always enabled
@@ -573,6 +574,21 @@ static int cdns_pcie_ep_start(struct pci_epc *epc)
 	 */
 	cdns_pcie_writel(pcie, CDNS_PCIE_LM_EP_FUNC_CFG, epc->function_num_map);
 
+	if (ep->quirk_disable_flr) {
+		for (epf = 0; epf < max_epfs; epf++) {
+			if (!(epc->function_num_map & BIT(epf)))
+				continue;
+
+			value = cdns_pcie_ep_fn_readl(pcie, epf,
+					CDNS_PCIE_EP_FUNC_DEV_CAP_OFFSET +
+					PCI_EXP_DEVCAP);
+			value &= ~PCI_EXP_DEVCAP_FLR;
+			cdns_pcie_ep_fn_writel(pcie, epf,
+					CDNS_PCIE_EP_FUNC_DEV_CAP_OFFSET +
+					PCI_EXP_DEVCAP, value);
+		}
+	}
+
 	ret = cdns_pcie_start_link(pcie);
 	if (ret) {
 		dev_err(dev, "Failed to start link\n");
diff --git a/drivers/pci/controller/cadence/pcie-cadence.h b/drivers/pci/controller/cadence/pcie-cadence.h
index 262421e..e978e7c 100644
--- a/drivers/pci/controller/cadence/pcie-cadence.h
+++ b/drivers/pci/controller/cadence/pcie-cadence.h
@@ -123,6 +123,7 @@
 
 #define CDNS_PCIE_EP_FUNC_MSI_CAP_OFFSET	0x90
 #define CDNS_PCIE_EP_FUNC_MSIX_CAP_OFFSET	0xb0
+#define CDNS_PCIE_EP_FUNC_DEV_CAP_OFFSET	0xc0
 #define CDNS_PCIE_EP_FUNC_SRIOV_CAP_OFFSET	0x200
 
 /*
@@ -357,6 +358,7 @@ struct cdns_pcie_epf {
  *        minimize time between read and write
  * @epf: Structure to hold info about endpoint function
  * @quirk_detect_quiet_flag: LTSSM Detect Quiet min delay set as quirk
+ * @quirk_disable_flr: Disable FLR (Function Level Reset) quirk flag
  */
 struct cdns_pcie_ep {
 	struct cdns_pcie	pcie;
@@ -372,6 +374,7 @@ struct cdns_pcie_ep {
 	spinlock_t		lock;
 	struct cdns_pcie_epf	*epf;
 	unsigned int		quirk_detect_quiet_flag:1;
+	unsigned int		quirk_disable_flr:1;
 };
 
 
-- 
1.9.1


_______________________________________________
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] 6+ messages in thread

* Re: [PATCH] PCI: cadence: Disable Function Level Reset support
  2021-10-18 18:07 ` Parshuram Raju Thombare
@ 2021-10-18 19:42   ` Bjorn Helgaas
  -1 siblings, 0 replies; 6+ messages in thread
From: Bjorn Helgaas @ 2021-10-18 19:42 UTC (permalink / raw)
  To: Parshuram Raju Thombare
  Cc: kishon, tjoseph, lorenzo.pieralisi, robh, kw, bhelgaas,
	linux-omap, linux-pci, linux-arm-kernel, linux-kernel, mparab

On Mon, Oct 18, 2021 at 11:07:25AM -0700, Parshuram Raju Thombare wrote:
> From: Parshuram Thombare <pthombar@cadence.com>
> 
> This patch disables FLR (Function Level Reset) support on all physical
> functions.
> During FLR, the Margining Lane Status and Margining Lane Control
> registers should not be reset, as per PCIe specification.
> However, the Controller incorrectly resets these registers upon FLR.
> This causes PCISIG compliance FLR test to fail. Hence disabling
> FLR on all functions using quirk flag.

Add blank lines between paragraphs.

Write the text in imperative mood, e.g.,

  Disable FLR (Function Level Reset) support on all functions.

It looks like this patch clears PCI_EXP_DEVCAP_FLR in the Device
Capabilities register.  From the point of view of Linux, that means
the device doesn't *advertise* FLR support.

That's different from actualy *disabling* FLR support, but maybe
there's internal logic in the device that ignores
PCI_EXP_DEVCTL_BCR_FLR when PCI_EXP_DEVCAP_FLR is cleared?

> Signed-off-by: Parshuram Thombare <pthombar@cadence.com>
> ---
>  drivers/pci/controller/cadence/pci-j721e.c       |  3 +++
>  drivers/pci/controller/cadence/pcie-cadence-ep.c | 18 +++++++++++++++++-
>  drivers/pci/controller/cadence/pcie-cadence.h    |  3 +++
>  3 files changed, 23 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/pci/controller/cadence/pci-j721e.c b/drivers/pci/controller/cadence/pci-j721e.c
> index ffb176d..635e36c 100644
> --- a/drivers/pci/controller/cadence/pci-j721e.c
> +++ b/drivers/pci/controller/cadence/pci-j721e.c
> @@ -70,6 +70,7 @@ struct j721e_pcie_data {
>  	enum j721e_pcie_mode	mode;
>  	unsigned int		quirk_retrain_flag:1;
>  	unsigned int		quirk_detect_quiet_flag:1;
> +	unsigned int		quirk_disable_flr:1;
>  	u32			linkdown_irq_regfield;
>  	unsigned int		byte_access_allowed:1;
>  };
> @@ -308,6 +309,7 @@ static int cdns_ti_pcie_config_write(struct pci_bus *bus, unsigned int devfn,
>  static const struct j721e_pcie_data j7200_pcie_ep_data = {
>  	.mode = PCI_MODE_EP,
>  	.quirk_detect_quiet_flag = true,
> +	.quirk_disable_flr = true,
>  };
>  
>  static const struct j721e_pcie_data am64_pcie_rc_data = {
> @@ -510,6 +512,7 @@ static int j721e_pcie_probe(struct platform_device *pdev)
>  			goto err_get_sync;
>  		}
>  		ep->quirk_detect_quiet_flag = data->quirk_detect_quiet_flag;
> +		ep->quirk_disable_flr = data->quirk_disable_flr;
>  
>  		cdns_pcie = &ep->pcie;
>  		cdns_pcie->dev = dev;
> diff --git a/drivers/pci/controller/cadence/pcie-cadence-ep.c b/drivers/pci/controller/cadence/pcie-cadence-ep.c
> index 88e05b9..4b1c4bc 100644
> --- a/drivers/pci/controller/cadence/pcie-cadence-ep.c
> +++ b/drivers/pci/controller/cadence/pcie-cadence-ep.c
> @@ -565,7 +565,8 @@ static int cdns_pcie_ep_start(struct pci_epc *epc)
>  	struct cdns_pcie_ep *ep = epc_get_drvdata(epc);
>  	struct cdns_pcie *pcie = &ep->pcie;
>  	struct device *dev = pcie->dev;
> -	int ret;
> +	int max_epfs = sizeof(epc->function_num_map) * 8;
> +	int ret, value, epf;
>  
>  	/*
>  	 * BIT(0) is hardwired to 1, hence function 0 is always enabled
> @@ -573,6 +574,21 @@ static int cdns_pcie_ep_start(struct pci_epc *epc)
>  	 */
>  	cdns_pcie_writel(pcie, CDNS_PCIE_LM_EP_FUNC_CFG, epc->function_num_map);
>  
> +	if (ep->quirk_disable_flr) {
> +		for (epf = 0; epf < max_epfs; epf++) {
> +			if (!(epc->function_num_map & BIT(epf)))
> +				continue;
> +
> +			value = cdns_pcie_ep_fn_readl(pcie, epf,
> +					CDNS_PCIE_EP_FUNC_DEV_CAP_OFFSET +
> +					PCI_EXP_DEVCAP);
> +			value &= ~PCI_EXP_DEVCAP_FLR;
> +			cdns_pcie_ep_fn_writel(pcie, epf,
> +					CDNS_PCIE_EP_FUNC_DEV_CAP_OFFSET +
> +					PCI_EXP_DEVCAP, value);
> +		}
> +	}
> +
>  	ret = cdns_pcie_start_link(pcie);
>  	if (ret) {
>  		dev_err(dev, "Failed to start link\n");
> diff --git a/drivers/pci/controller/cadence/pcie-cadence.h b/drivers/pci/controller/cadence/pcie-cadence.h
> index 262421e..e978e7c 100644
> --- a/drivers/pci/controller/cadence/pcie-cadence.h
> +++ b/drivers/pci/controller/cadence/pcie-cadence.h
> @@ -123,6 +123,7 @@
>  
>  #define CDNS_PCIE_EP_FUNC_MSI_CAP_OFFSET	0x90
>  #define CDNS_PCIE_EP_FUNC_MSIX_CAP_OFFSET	0xb0
> +#define CDNS_PCIE_EP_FUNC_DEV_CAP_OFFSET	0xc0
>  #define CDNS_PCIE_EP_FUNC_SRIOV_CAP_OFFSET	0x200
>  
>  /*
> @@ -357,6 +358,7 @@ struct cdns_pcie_epf {
>   *        minimize time between read and write
>   * @epf: Structure to hold info about endpoint function
>   * @quirk_detect_quiet_flag: LTSSM Detect Quiet min delay set as quirk
> + * @quirk_disable_flr: Disable FLR (Function Level Reset) quirk flag
>   */
>  struct cdns_pcie_ep {
>  	struct cdns_pcie	pcie;
> @@ -372,6 +374,7 @@ struct cdns_pcie_ep {
>  	spinlock_t		lock;
>  	struct cdns_pcie_epf	*epf;
>  	unsigned int		quirk_detect_quiet_flag:1;
> +	unsigned int		quirk_disable_flr:1;
>  };
>  
>  
> -- 
> 1.9.1
> 

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

* Re: [PATCH] PCI: cadence: Disable Function Level Reset support
@ 2021-10-18 19:42   ` Bjorn Helgaas
  0 siblings, 0 replies; 6+ messages in thread
From: Bjorn Helgaas @ 2021-10-18 19:42 UTC (permalink / raw)
  To: Parshuram Raju Thombare
  Cc: kishon, tjoseph, lorenzo.pieralisi, robh, kw, bhelgaas,
	linux-omap, linux-pci, linux-arm-kernel, linux-kernel, mparab

On Mon, Oct 18, 2021 at 11:07:25AM -0700, Parshuram Raju Thombare wrote:
> From: Parshuram Thombare <pthombar@cadence.com>
> 
> This patch disables FLR (Function Level Reset) support on all physical
> functions.
> During FLR, the Margining Lane Status and Margining Lane Control
> registers should not be reset, as per PCIe specification.
> However, the Controller incorrectly resets these registers upon FLR.
> This causes PCISIG compliance FLR test to fail. Hence disabling
> FLR on all functions using quirk flag.

Add blank lines between paragraphs.

Write the text in imperative mood, e.g.,

  Disable FLR (Function Level Reset) support on all functions.

It looks like this patch clears PCI_EXP_DEVCAP_FLR in the Device
Capabilities register.  From the point of view of Linux, that means
the device doesn't *advertise* FLR support.

That's different from actualy *disabling* FLR support, but maybe
there's internal logic in the device that ignores
PCI_EXP_DEVCTL_BCR_FLR when PCI_EXP_DEVCAP_FLR is cleared?

> Signed-off-by: Parshuram Thombare <pthombar@cadence.com>
> ---
>  drivers/pci/controller/cadence/pci-j721e.c       |  3 +++
>  drivers/pci/controller/cadence/pcie-cadence-ep.c | 18 +++++++++++++++++-
>  drivers/pci/controller/cadence/pcie-cadence.h    |  3 +++
>  3 files changed, 23 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/pci/controller/cadence/pci-j721e.c b/drivers/pci/controller/cadence/pci-j721e.c
> index ffb176d..635e36c 100644
> --- a/drivers/pci/controller/cadence/pci-j721e.c
> +++ b/drivers/pci/controller/cadence/pci-j721e.c
> @@ -70,6 +70,7 @@ struct j721e_pcie_data {
>  	enum j721e_pcie_mode	mode;
>  	unsigned int		quirk_retrain_flag:1;
>  	unsigned int		quirk_detect_quiet_flag:1;
> +	unsigned int		quirk_disable_flr:1;
>  	u32			linkdown_irq_regfield;
>  	unsigned int		byte_access_allowed:1;
>  };
> @@ -308,6 +309,7 @@ static int cdns_ti_pcie_config_write(struct pci_bus *bus, unsigned int devfn,
>  static const struct j721e_pcie_data j7200_pcie_ep_data = {
>  	.mode = PCI_MODE_EP,
>  	.quirk_detect_quiet_flag = true,
> +	.quirk_disable_flr = true,
>  };
>  
>  static const struct j721e_pcie_data am64_pcie_rc_data = {
> @@ -510,6 +512,7 @@ static int j721e_pcie_probe(struct platform_device *pdev)
>  			goto err_get_sync;
>  		}
>  		ep->quirk_detect_quiet_flag = data->quirk_detect_quiet_flag;
> +		ep->quirk_disable_flr = data->quirk_disable_flr;
>  
>  		cdns_pcie = &ep->pcie;
>  		cdns_pcie->dev = dev;
> diff --git a/drivers/pci/controller/cadence/pcie-cadence-ep.c b/drivers/pci/controller/cadence/pcie-cadence-ep.c
> index 88e05b9..4b1c4bc 100644
> --- a/drivers/pci/controller/cadence/pcie-cadence-ep.c
> +++ b/drivers/pci/controller/cadence/pcie-cadence-ep.c
> @@ -565,7 +565,8 @@ static int cdns_pcie_ep_start(struct pci_epc *epc)
>  	struct cdns_pcie_ep *ep = epc_get_drvdata(epc);
>  	struct cdns_pcie *pcie = &ep->pcie;
>  	struct device *dev = pcie->dev;
> -	int ret;
> +	int max_epfs = sizeof(epc->function_num_map) * 8;
> +	int ret, value, epf;
>  
>  	/*
>  	 * BIT(0) is hardwired to 1, hence function 0 is always enabled
> @@ -573,6 +574,21 @@ static int cdns_pcie_ep_start(struct pci_epc *epc)
>  	 */
>  	cdns_pcie_writel(pcie, CDNS_PCIE_LM_EP_FUNC_CFG, epc->function_num_map);
>  
> +	if (ep->quirk_disable_flr) {
> +		for (epf = 0; epf < max_epfs; epf++) {
> +			if (!(epc->function_num_map & BIT(epf)))
> +				continue;
> +
> +			value = cdns_pcie_ep_fn_readl(pcie, epf,
> +					CDNS_PCIE_EP_FUNC_DEV_CAP_OFFSET +
> +					PCI_EXP_DEVCAP);
> +			value &= ~PCI_EXP_DEVCAP_FLR;
> +			cdns_pcie_ep_fn_writel(pcie, epf,
> +					CDNS_PCIE_EP_FUNC_DEV_CAP_OFFSET +
> +					PCI_EXP_DEVCAP, value);
> +		}
> +	}
> +
>  	ret = cdns_pcie_start_link(pcie);
>  	if (ret) {
>  		dev_err(dev, "Failed to start link\n");
> diff --git a/drivers/pci/controller/cadence/pcie-cadence.h b/drivers/pci/controller/cadence/pcie-cadence.h
> index 262421e..e978e7c 100644
> --- a/drivers/pci/controller/cadence/pcie-cadence.h
> +++ b/drivers/pci/controller/cadence/pcie-cadence.h
> @@ -123,6 +123,7 @@
>  
>  #define CDNS_PCIE_EP_FUNC_MSI_CAP_OFFSET	0x90
>  #define CDNS_PCIE_EP_FUNC_MSIX_CAP_OFFSET	0xb0
> +#define CDNS_PCIE_EP_FUNC_DEV_CAP_OFFSET	0xc0
>  #define CDNS_PCIE_EP_FUNC_SRIOV_CAP_OFFSET	0x200
>  
>  /*
> @@ -357,6 +358,7 @@ struct cdns_pcie_epf {
>   *        minimize time between read and write
>   * @epf: Structure to hold info about endpoint function
>   * @quirk_detect_quiet_flag: LTSSM Detect Quiet min delay set as quirk
> + * @quirk_disable_flr: Disable FLR (Function Level Reset) quirk flag
>   */
>  struct cdns_pcie_ep {
>  	struct cdns_pcie	pcie;
> @@ -372,6 +374,7 @@ struct cdns_pcie_ep {
>  	spinlock_t		lock;
>  	struct cdns_pcie_epf	*epf;
>  	unsigned int		quirk_detect_quiet_flag:1;
> +	unsigned int		quirk_disable_flr:1;
>  };
>  
>  
> -- 
> 1.9.1
> 

_______________________________________________
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] 6+ messages in thread

* RE: [PATCH] PCI: cadence: Disable Function Level Reset support
  2021-10-18 19:42   ` Bjorn Helgaas
@ 2021-10-20  3:38     ` Parshuram Raju Thombare
  -1 siblings, 0 replies; 6+ messages in thread
From: Parshuram Raju Thombare @ 2021-10-20  3:38 UTC (permalink / raw)
  To: Bjorn Helgaas
  Cc: kishon, Tom Joseph, lorenzo.pieralisi, robh, kw, bhelgaas,
	linux-omap, linux-pci, linux-arm-kernel, linux-kernel,
	Milind Parab

>Add blank lines between paragraphs.
>Write the text in imperative mood, e.g.,

Ok

>  Disable FLR (Function Level Reset) support on all functions.
>It looks like this patch clears PCI_EXP_DEVCAP_FLR in the Device
>Capabilities register.  From the point of view of Linux, that means
>the device doesn't *advertise* FLR support.
>
>That's different from actualy *disabling* FLR support, but maybe
>there's internal logic in the device that ignores
>PCI_EXP_DEVCTL_BCR_FLR when PCI_EXP_DEVCAP_FLR is cleared?

Yes, this patch is just to prevent device from advertising FLR support.

Regards,
Parshuram Thombare

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

* RE: [PATCH] PCI: cadence: Disable Function Level Reset support
@ 2021-10-20  3:38     ` Parshuram Raju Thombare
  0 siblings, 0 replies; 6+ messages in thread
From: Parshuram Raju Thombare @ 2021-10-20  3:38 UTC (permalink / raw)
  To: Bjorn Helgaas
  Cc: kishon, Tom Joseph, lorenzo.pieralisi, robh, kw, bhelgaas,
	linux-omap, linux-pci, linux-arm-kernel, linux-kernel,
	Milind Parab

>Add blank lines between paragraphs.
>Write the text in imperative mood, e.g.,

Ok

>  Disable FLR (Function Level Reset) support on all functions.
>It looks like this patch clears PCI_EXP_DEVCAP_FLR in the Device
>Capabilities register.  From the point of view of Linux, that means
>the device doesn't *advertise* FLR support.
>
>That's different from actualy *disabling* FLR support, but maybe
>there's internal logic in the device that ignores
>PCI_EXP_DEVCTL_BCR_FLR when PCI_EXP_DEVCAP_FLR is cleared?

Yes, this patch is just to prevent device from advertising FLR support.

Regards,
Parshuram Thombare

_______________________________________________
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] 6+ messages in thread

end of thread, other threads:[~2021-10-20  3:41 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-18 18:07 [PATCH] PCI: cadence: Disable Function Level Reset support Parshuram Raju Thombare
2021-10-18 18:07 ` Parshuram Raju Thombare
2021-10-18 19:42 ` Bjorn Helgaas
2021-10-18 19:42   ` Bjorn Helgaas
2021-10-20  3:38   ` Parshuram Raju Thombare
2021-10-20  3:38     ` Parshuram Raju Thombare

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.