RE: [PATCH] link up validation moved to pcie-designware

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> -----Original Message-----
> From: Joao Pinto [mailto:Joao.Pinto@xxxxxxxxxxxx]
> Sent: 08 February 2016 15:12
> To: Gabriele Paoloni; Joao Pinto; helgaas@xxxxxxxxxx
> Cc: arnd@xxxxxxxx; linux-pci@xxxxxxxxxxxxxxx; linux-
> kernel@xxxxxxxxxxxxxxx; CARLOS.PALMINHA@xxxxxxxxxxxx
> Subject: Re: [PATCH] link up validation moved to pcie-designware
> 
> 
> Hi Gab,
> This patch is part of the on going work of integrating a designware
> platform
> driver that is SoC agnostic. This code replication issue was raised
> during
> discussions.

Ok sorry, I missed it then

Cheers

Gab


> 
> Thanks
> Joao
> 
> On 2/8/2016 1:03 PM, Gabriele Paoloni wrote:
> > Hi Joao
> >
> >> -----Original Message-----
> >> From: linux-pci-owner@xxxxxxxxxxxxxxx [mailto:linux-pci-
> >> owner@xxxxxxxxxxxxxxx] On Behalf Of Joao Pinto
> >> Sent: 08 February 2016 12:44
> >> To: helgaas@xxxxxxxxxx
> >> Cc: arnd@xxxxxxxx; linux-pci@xxxxxxxxxxxxxxx; linux-
> >> kernel@xxxxxxxxxxxxxxx; CARLOS.PALMINHA@xxxxxxxxxxxx; Joao Pinto
> >> Subject: [PATCH] link up validation moved to pcie-designware
> >>
> >> This patch goal is to centralize in pcie-designware the link up
> >> validation. A new function was added to pci-designware that is
> >> responsible for doing such a task. This was implemented in a form
> that
> >> permits flexibility for all SoCs.
> >
> > Looking at the patch I don't think this is really needed,
> > it seems to me like it makes more confusion in reading the
> > drivers code.
> >
> > It is clear that each HW IP has got his own transient time
> > in setting the link up, this is clear looking at the code
> > of the single drivers now.
> >
> > With the modification you are proposing we are seeing
> > drivers calls with magic numbers and the need for the
> > reader to go and look into the designware framework to
> > understand a function that is not even designware
> > specific (in fact all these drivers need to wait different
> > times according to their HW IP and some other drivers do
> > not need to wait at all...)
> >
> > BTW I am quite new to PCIe so let's see what the other guys
> > think...
> >
> > Cheers
> >
> > Gab
> >
> >>
> >> Signed-off-by: Joao Pinto <jpinto@xxxxxxxxxxxx>
> >> ---
> >>  drivers/pci/host/pci-dra7xx.c      | 11 +++--------
> >>  drivers/pci/host/pci-exynos.c      | 11 ++---------
> >>  drivers/pci/host/pci-imx6.c        | 11 +++--------
> >>  drivers/pci/host/pcie-designware.c | 20 ++++++++++++++++++++
> >>  drivers/pci/host/pcie-designware.h |  2 ++
> >>  drivers/pci/host/pcie-spear13xx.c  | 12 ++----------
> >>  6 files changed, 32 insertions(+), 35 deletions(-)
> >>
> >> diff --git a/drivers/pci/host/pci-dra7xx.c b/drivers/pci/host/pci-
> >> dra7xx.c
> >> index 8c36880..e425944 100644
> >> --- a/drivers/pci/host/pci-dra7xx.c
> >> +++ b/drivers/pci/host/pci-dra7xx.c
> >> @@ -10,7 +10,6 @@
> >>   * published by the Free Software Foundation.
> >>   */
> >>
> >> -#include <linux/delay.h>
> >>  #include <linux/err.h>
> >>  #include <linux/interrupt.h>
> >>  #include <linux/irq.h>
> >> @@ -108,7 +107,6 @@ static int dra7xx_pcie_establish_link(struct
> >> pcie_port *pp)
> >>  {
> >>  	struct dra7xx_pcie *dra7xx = to_dra7xx_pcie(pp);
> >>  	u32 reg;
> >> -	unsigned int retries;
> >>
> >>  	if (dw_pcie_link_up(pp)) {
> >>  		dev_err(pp->dev, "link is already up\n");
> >> @@ -119,13 +117,10 @@ static int dra7xx_pcie_establish_link(struct
> >> pcie_port *pp)
> >>  	reg |= LTSSM_EN;
> >>  	dra7xx_pcie_writel(dra7xx, PCIECTRL_DRA7XX_CONF_DEVICE_CMD, reg);
> >>
> >> -	for (retries = 0; retries < 1000; retries++) {
> >> -		if (dw_pcie_link_up(pp))
> >> -			return 0;
> >> -		usleep_range(10, 20);
> >> -	}
> >> +	/* check if the link is up or not */
> >> +	if (!dw_pcie_check_link_is_up(pp, 1000, 10, 20))
> >> +		return 0;
> >>
> >> -	dev_err(pp->dev, "link is not up\n");
> >>  	return -EINVAL;
> >>  }
> >>
> >> diff --git a/drivers/pci/host/pci-exynos.c b/drivers/pci/host/pci-
> >> exynos.c
> >> index 01095e1..770c45a 100644
> >> --- a/drivers/pci/host/pci-exynos.c
> >> +++ b/drivers/pci/host/pci-exynos.c
> >> @@ -318,7 +318,6 @@ static int exynos_pcie_establish_link(struct
> >> pcie_port *pp)
> >>  {
> >>  	struct exynos_pcie *exynos_pcie = to_exynos_pcie(pp);
> >>  	u32 val;
> >> -	unsigned int retries;
> >>
> >>  	if (dw_pcie_link_up(pp)) {
> >>  		dev_err(pp->dev, "Link already up\n");
> >> @@ -357,13 +356,8 @@ static int exynos_pcie_establish_link(struct
> >> pcie_port *pp)
> >>  			  PCIE_APP_LTSSM_ENABLE);
> >>
> >>  	/* check if the link is up or not */
> >> -	for (retries = 0; retries < 10; retries++) {
> >> -		if (dw_pcie_link_up(pp)) {
> >> -			dev_info(pp->dev, "Link up\n");
> >> -			return 0;
> >> -		}
> >> -		mdelay(100);
> >> -	}
> >> +	if (!dw_pcie_check_link_is_up(pp, 10, 100000, 110000))
> >> +		return 0;
> >>
> >>  	while (exynos_phy_readl(exynos_pcie, PCIE_PHY_PLL_LOCKED) == 0) {
> >>  		val = exynos_blk_readl(exynos_pcie, PCIE_PHY_PLL_LOCKED);
> >> @@ -372,7 +366,6 @@ static int exynos_pcie_establish_link(struct
> >> pcie_port *pp)
> >>  	/* power off phy */
> >>  	exynos_pcie_power_off_phy(pp);
> >>
> >> -	dev_err(pp->dev, "PCIe Link Fail\n");
> >>  	return -EINVAL;
> >>  }
> >>
> >> diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-
> imx6.c
> >> index 22e8224..9e323be 100644
> >> --- a/drivers/pci/host/pci-imx6.c
> >> +++ b/drivers/pci/host/pci-imx6.c
> >> @@ -330,15 +330,10 @@ static void imx6_pcie_init_phy(struct
> pcie_port
> >> *pp)
> >>
> >>  static int imx6_pcie_wait_for_link(struct pcie_port *pp)
> >>  {
> >> -	unsigned int retries;
> >> -
> >> -	for (retries = 0; retries < 200; retries++) {
> >> -		if (dw_pcie_link_up(pp))
> >> -			return 0;
> >> -		usleep_range(100, 1000);
> >> -	}
> >> +	/* check if the link is up or not */
> >> +	if (!dw_pcie_check_link_is_up(pp, 200, 100, 1000))
> >> +		return 0;
> >>
> >> -	dev_err(pp->dev, "phy link never came up\n");
> >>  	dev_dbg(pp->dev, "DEBUG_R0: 0x%08x, DEBUG_R1: 0x%08x\n",
> >>  		readl(pp->dbi_base + PCIE_PHY_DEBUG_R0),
> >>  		readl(pp->dbi_base + PCIE_PHY_DEBUG_R1));
> >> diff --git a/drivers/pci/host/pcie-designware.c
> >> b/drivers/pci/host/pcie-designware.c
> >> index 540f077..6725231 100644
> >> --- a/drivers/pci/host/pcie-designware.c
> >> +++ b/drivers/pci/host/pcie-designware.c
> >> @@ -22,6 +22,7 @@
> >>  #include <linux/pci_regs.h>
> >>  #include <linux/platform_device.h>
> >>  #include <linux/types.h>
> >> +#include <linux/delay.h>
> >>
> >>  #include "pcie-designware.h"
> >>
> >> @@ -380,6 +381,25 @@ static struct msi_controller dw_pcie_msi_chip =
> {
> >>  	.teardown_irq = dw_msi_teardown_irq,
> >>  };
> >>
> >> +int dw_pcie_check_link_is_up(struct pcie_port *pp, int max_ret, int
> >> sleep_min,
> >> +								int sleep_max)
> >> +{
> >> +	int retries;
> >> +
> >> +	/* check if the link is up or not */
> >> +	for (retries = 0; retries < max_ret; retries++) {
> >> +		if (dw_pcie_link_up(pp)) {
> >> +			dev_info(pp->dev, "link up\n");
> >> +			return 0;
> >> +		}
> >> +		usleep_range(sleep_min, sleep_max);
> >> +	}
> >> +
> >> +	dev_err(pp->dev, "phy link never came up\n");
> >> +
> >> +	return 1;
> >> +}
> >> +
> >>  int dw_pcie_link_up(struct pcie_port *pp)
> >>  {
> >>  	if (pp->ops->link_up)
> >> diff --git a/drivers/pci/host/pcie-designware.h
> >> b/drivers/pci/host/pcie-designware.h
> >> index 2356d29..b077fe0 100644
> >> --- a/drivers/pci/host/pcie-designware.h
> >> +++ b/drivers/pci/host/pcie-designware.h
> >> @@ -76,6 +76,8 @@ int dw_pcie_cfg_read(void __iomem *addr, int size,
> >> u32 *val);
> >>  int dw_pcie_cfg_write(void __iomem *addr, int size, u32 val);
> >>  irqreturn_t dw_handle_msi_irq(struct pcie_port *pp);
> >>  void dw_pcie_msi_init(struct pcie_port *pp);
> >> +int dw_pcie_check_link_is_up(struct pcie_port *pp, int max_ret, int
> >> sleep_min,
> >> +								int sleep_max);
> >>  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);
> >> diff --git a/drivers/pci/host/pcie-spear13xx.c
> b/drivers/pci/host/pcie-
> >> spear13xx.c
> >> index b95b756..5c24595 100644
> >> --- a/drivers/pci/host/pcie-spear13xx.c
> >> +++ b/drivers/pci/host/pcie-spear13xx.c
> >> @@ -13,7 +13,6 @@
> >>   */
> >>
> >>  #include <linux/clk.h>
> >> -#include <linux/delay.h>
> >>  #include <linux/interrupt.h>
> >>  #include <linux/kernel.h>
> >>  #include <linux/module.h>
> >> @@ -149,7 +148,6 @@ static int spear13xx_pcie_establish_link(struct
> >> pcie_port *pp)
> >>  	struct spear13xx_pcie *spear13xx_pcie = to_spear13xx_pcie(pp);
> >>  	struct pcie_app_reg *app_reg = spear13xx_pcie->app_base;
> >>  	u32 exp_cap_off = EXP_CAP_ID_OFFSET;
> >> -	unsigned int retries;
> >>
> >>  	if (dw_pcie_link_up(pp)) {
> >>  		dev_err(pp->dev, "link already up\n");
> >> @@ -201,15 +199,9 @@ static int spear13xx_pcie_establish_link(struct
> >> pcie_port *pp)
> >>  			&app_reg->app_ctrl_0);
> >>
> >>  	/* check if the link is up or not */
> >> -	for (retries = 0; retries < 10; retries++) {
> >> -		if (dw_pcie_link_up(pp)) {
> >> -			dev_info(pp->dev, "link up\n");
> >> -			return 0;
> >> -		}
> >> -		mdelay(100);
> >> -	}
> >> +	if (!dw_pcie_check_link_is_up(pp, 10, 100000, 110000))
> >> +		return 0;
> >>
> >> -	dev_err(pp->dev, "link Fail\n");
> >>  	return -EINVAL;
> >>  }
> >>
> >> --
> >> 1.8.1.5
> >>
> >> --
> >> To unsubscribe from this list: send the line "unsubscribe linux-pci"
> in
> >> the body of a message to majordomo@xxxxxxxxxxxxxxx
> >> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux