No problem! Thanks for your comments! Joao On 2/8/2016 3:29 PM, Gabriele Paoloni wrote: >> -----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