From: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
To: Frank Li <Frank.li@nxp.com>
Cc: "Jingoo Han" <jingoohan1@gmail.com>,
"Gustavo Pimentel" <gustavo.pimentel@synopsys.com>,
"Lorenzo Pieralisi" <lpieralisi@kernel.org>,
"Krzysztof Wilczyński" <kw@linux.com>,
"Rob Herring" <robh@kernel.org>,
"Bjorn Helgaas" <bhelgaas@google.com>,
"Marek Vasut" <marek.vasut+renesas@gmail.com>,
"Yoshihiro Shimoda" <yoshihiro.shimoda.uh@renesas.com>,
"Thierry Reding" <thierry.reding@gmail.com>,
"Jonathan Hunter" <jonathanh@nvidia.com>,
"Kishon Vijay Abraham I" <kishon@ti.com>,
"Vidya Sagar" <vidyas@nvidia.com>,
"Vignesh Raghavendra" <vigneshr@ti.com>,
"Richard Zhu" <hongxing.zhu@nxp.com>,
"Lucas Stach" <l.stach@pengutronix.de>,
"Shawn Guo" <shawnguo@kernel.org>,
"Sascha Hauer" <s.hauer@pengutronix.de>,
"Pengutronix Kernel Team" <kernel@pengutronix.de>,
"Fabio Estevam" <festevam@gmail.com>,
"NXP Linux Team" <linux-imx@nxp.com>,
"Minghuan Lian" <minghuan.Lian@nxp.com>,
"Mingkai Hu" <mingkai.hu@nxp.com>, "Roy Zang" <roy.zang@nxp.com>,
"Kunihiko Hayashi" <hayashi.kunihiko@socionext.com>,
"Masami Hiramatsu" <mhiramat@kernel.org>,
"Kishon Vijay Abraham I" <kishon@kernel.org>,
linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-renesas-soc@vger.kernel.org, linux-arm-msm@vger.kernel.org,
linux-tegra@vger.kernel.org, linux-omap@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linuxppc-dev@lists.ozlabs.org,
"Niklas Cassel" <cassel@kernel.org>
Subject: Re: [PATCH v8 08/10] PCI: dwc: ep: Add a generic dw_pcie_ep_linkdown() API to handle LINK_DOWN event
Date: Wed, 28 Feb 2024 00:20:50 +0530 [thread overview]
Message-ID: <20240227185050.GV2587@thinkpad> (raw)
In-Reply-To: <Zd4bLZb2z4TEoR1a@lizhi-Precision-Tower-5810>
On Tue, Feb 27, 2024 at 12:26:05PM -0500, Frank Li wrote:
> On Tue, Feb 27, 2024 at 06:00:24PM +0530, Manivannan Sadhasivam wrote:
> > On Mon, Feb 26, 2024 at 12:18:18PM -0500, Frank Li wrote:
> > > On Sat, Feb 24, 2024 at 12:24:14PM +0530, Manivannan Sadhasivam wrote:
> > > > The PCIe link can go to LINK_DOWN state in one of the following scenarios:
> > > >
> > > > 1. Fundamental (PERST#)/hot/warm reset
> > > > 2. Link transition from L2/L3 to L0
> > >
> > > From L0 to L2/l3
> > >
> >
> > I don't understand what you mean here. Link down won't happen while moving from
> > L0 to L2/L3, it is the opposite.
>
> Strange, why there are not linkdown from L0 to L2/l3. But have linkdown
> from L2/l3 to L0? when linkup happen? Any document show these?
>
Refer PCIe Spec 5.0, Figure 5-1 Link Power Management State Flow Diagram.
- Mani
> Frank
>
> >
> > > >
> > > > In those cases, LINK_DOWN causes some non-sticky DWC registers to loose the
> > > > state (like REBAR, PTM_CAP etc...). So the drivers need to reinitialize
> > > > them to function properly once the link comes back again.
> > > >
> > > > This is not a problem for drivers supporting PERST# IRQ, since they can
> > > > reinitialize the registers in the PERST# IRQ callback. But for the drivers
> > > > not supporting PERST#, there is no way they can reinitialize the registers
> > > > other than relying on LINK_DOWN IRQ received when the link goes down. So
> > > > let's add a DWC generic API dw_pcie_ep_linkdown() that reinitializes the
> > > > non-sticky registers and also notifies the EPF drivers about link going
> > > > down.
> > > >
> > > > This API can also be used by the drivers supporting PERST# to handle the
> > > > scenario (2) mentioned above.
> > > >
> > > > Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
> > > > ---
> > > > drivers/pci/controller/dwc/pcie-designware-ep.c | 111 ++++++++++++++----------
> > > > drivers/pci/controller/dwc/pcie-designware.h | 5 ++
> > > > 2 files changed, 72 insertions(+), 44 deletions(-)
> > > >
> > > > diff --git a/drivers/pci/controller/dwc/pcie-designware-ep.c b/drivers/pci/controller/dwc/pcie-designware-ep.c
> > > > index 278bdc9b2269..fed4c2936c78 100644
> > > > --- a/drivers/pci/controller/dwc/pcie-designware-ep.c
> > > > +++ b/drivers/pci/controller/dwc/pcie-designware-ep.c
> > > > @@ -14,14 +14,6 @@
> > > > #include <linux/pci-epc.h>
> > > > #include <linux/pci-epf.h>
> > > >
> > > > -void dw_pcie_ep_linkup(struct dw_pcie_ep *ep)
> > > > -{
> > > > - struct pci_epc *epc = ep->epc;
> > > > -
> > > > - pci_epc_linkup(epc);
> > > > -}
> > > > -EXPORT_SYMBOL_GPL(dw_pcie_ep_linkup);
> > > > -
> > >
> > > No sure why git remove this block and add these back.
> > >
> >
> > Because, we are adding dw_pcie_ep_linkdown() API way below and it makes sense to
> > move this API also to keep it ordered. Maybe I should've described it in commit
> > message.
> >
> > - Mani
> >
> > >
> > > > void dw_pcie_ep_init_notify(struct dw_pcie_ep *ep)
> > > > {
> > > > struct pci_epc *epc = ep->epc;
> > > > @@ -603,19 +595,56 @@ static unsigned int dw_pcie_ep_find_ext_capability(struct dw_pcie *pci, int cap)
> > > > return 0;
> > > > }
> > > >
> > > > +static void dw_pcie_ep_init_non_sticky_registers(struct dw_pcie *pci)
> > > > +{
> > > > + unsigned int offset, ptm_cap_base;
> > > > + unsigned int nbars;
> > > > + u32 reg, i;
> > > > +
> > > > + offset = dw_pcie_ep_find_ext_capability(pci, PCI_EXT_CAP_ID_REBAR);
> > > > + ptm_cap_base = dw_pcie_ep_find_ext_capability(pci, PCI_EXT_CAP_ID_PTM);
> > > > +
> > > > + dw_pcie_dbi_ro_wr_en(pci);
> > > > +
> > > > + if (offset) {
> > > > + reg = dw_pcie_readl_dbi(pci, offset + PCI_REBAR_CTRL);
> > > > + nbars = (reg & PCI_REBAR_CTRL_NBAR_MASK) >>
> > > > + PCI_REBAR_CTRL_NBAR_SHIFT;
> > > > +
> > > > + for (i = 0; i < nbars; i++, offset += PCI_REBAR_CTRL)
> > > > + dw_pcie_writel_dbi(pci, offset + PCI_REBAR_CAP, 0x0);
> > > > + }
> > > > +
> > > > + /*
> > > > + * PTM responder capability can be disabled only after disabling
> > > > + * PTM root capability.
> > > > + */
> > > > + if (ptm_cap_base) {
> > > > + dw_pcie_dbi_ro_wr_en(pci);
> > > > + reg = dw_pcie_readl_dbi(pci, ptm_cap_base + PCI_PTM_CAP);
> > > > + reg &= ~PCI_PTM_CAP_ROOT;
> > > > + dw_pcie_writel_dbi(pci, ptm_cap_base + PCI_PTM_CAP, reg);
> > > > +
> > > > + reg = dw_pcie_readl_dbi(pci, ptm_cap_base + PCI_PTM_CAP);
> > > > + reg &= ~(PCI_PTM_CAP_RES | PCI_PTM_GRANULARITY_MASK);
> > > > + dw_pcie_writel_dbi(pci, ptm_cap_base + PCI_PTM_CAP, reg);
> > > > + dw_pcie_dbi_ro_wr_dis(pci);
> > > > + }
> > > > +
> > > > + dw_pcie_setup(pci);
> > > > + dw_pcie_dbi_ro_wr_dis(pci);
> > > > +}
> > > > +
> > > > int dw_pcie_ep_init_registers(struct dw_pcie_ep *ep)
> > > > {
> > > > struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
> > > > struct dw_pcie_ep_func *ep_func;
> > > > struct device *dev = pci->dev;
> > > > struct pci_epc *epc = ep->epc;
> > > > - unsigned int offset, ptm_cap_base;
> > > > - unsigned int nbars;
> > > > u8 hdr_type;
> > > > u8 func_no;
> > > > - int i, ret;
> > > > void *addr;
> > > > - u32 reg;
> > > > + int ret;
> > > >
> > > > hdr_type = dw_pcie_readb_dbi(pci, PCI_HEADER_TYPE) &
> > > > PCI_HEADER_TYPE_MASK;
> > > > @@ -678,38 +707,7 @@ int dw_pcie_ep_init_registers(struct dw_pcie_ep *ep)
> > > > if (ep->ops->init)
> > > > ep->ops->init(ep);
> > > >
> > > > - offset = dw_pcie_ep_find_ext_capability(pci, PCI_EXT_CAP_ID_REBAR);
> > > > - ptm_cap_base = dw_pcie_ep_find_ext_capability(pci, PCI_EXT_CAP_ID_PTM);
> > > > -
> > > > - dw_pcie_dbi_ro_wr_en(pci);
> > > > -
> > > > - if (offset) {
> > > > - reg = dw_pcie_readl_dbi(pci, offset + PCI_REBAR_CTRL);
> > > > - nbars = (reg & PCI_REBAR_CTRL_NBAR_MASK) >>
> > > > - PCI_REBAR_CTRL_NBAR_SHIFT;
> > > > -
> > > > - for (i = 0; i < nbars; i++, offset += PCI_REBAR_CTRL)
> > > > - dw_pcie_writel_dbi(pci, offset + PCI_REBAR_CAP, 0x0);
> > > > - }
> > > > -
> > > > - /*
> > > > - * PTM responder capability can be disabled only after disabling
> > > > - * PTM root capability.
> > > > - */
> > > > - if (ptm_cap_base) {
> > > > - dw_pcie_dbi_ro_wr_en(pci);
> > > > - reg = dw_pcie_readl_dbi(pci, ptm_cap_base + PCI_PTM_CAP);
> > > > - reg &= ~PCI_PTM_CAP_ROOT;
> > > > - dw_pcie_writel_dbi(pci, ptm_cap_base + PCI_PTM_CAP, reg);
> > > > -
> > > > - reg = dw_pcie_readl_dbi(pci, ptm_cap_base + PCI_PTM_CAP);
> > > > - reg &= ~(PCI_PTM_CAP_RES | PCI_PTM_GRANULARITY_MASK);
> > > > - dw_pcie_writel_dbi(pci, ptm_cap_base + PCI_PTM_CAP, reg);
> > > > - dw_pcie_dbi_ro_wr_dis(pci);
> > > > - }
> > > > -
> > > > - dw_pcie_setup(pci);
> > > > - dw_pcie_dbi_ro_wr_dis(pci);
> > > > + dw_pcie_ep_init_non_sticky_registers(pci);
> > > >
> > > > return 0;
> > > >
> > > > @@ -720,6 +718,31 @@ int dw_pcie_ep_init_registers(struct dw_pcie_ep *ep)
> > > > }
> > > > EXPORT_SYMBOL_GPL(dw_pcie_ep_init_registers);
> > > >
> > > > +void dw_pcie_ep_linkup(struct dw_pcie_ep *ep)
> > > > +{
> > > > + struct pci_epc *epc = ep->epc;
> > > > +
> > > > + pci_epc_linkup(epc);
> > > > +}
> > > > +EXPORT_SYMBOL_GPL(dw_pcie_ep_linkup);
> > > > +
> > > > +void dw_pcie_ep_linkdown(struct dw_pcie_ep *ep)
> > > > +{
> > > > + struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
> > > > + struct pci_epc *epc = ep->epc;
> > > > +
> > > > + /*
> > > > + * Initialize the non-sticky DWC registers as they would've reset post
> > > > + * LINK_DOWN. This is specifically needed for drivers not supporting
> > > > + * PERST# as they have no way to reinitialize the registers before the
> > > > + * link comes back again.
> > > > + */
> > > > + dw_pcie_ep_init_non_sticky_registers(pci);
> > > > +
> > > > + pci_epc_linkdown(epc);
> > > > +}
> > > > +EXPORT_SYMBOL_GPL(dw_pcie_ep_linkdown);
> > > > +
> > > > int dw_pcie_ep_init(struct dw_pcie_ep *ep)
> > > > {
> > > > int ret;
> > > > diff --git a/drivers/pci/controller/dwc/pcie-designware.h b/drivers/pci/controller/dwc/pcie-designware.h
> > > > index f8e5431a207b..152969545b0a 100644
> > > > --- a/drivers/pci/controller/dwc/pcie-designware.h
> > > > +++ b/drivers/pci/controller/dwc/pcie-designware.h
> > > > @@ -668,6 +668,7 @@ static inline void __iomem *dw_pcie_own_conf_map_bus(struct pci_bus *bus,
> > > >
> > > > #ifdef CONFIG_PCIE_DW_EP
> > > > void dw_pcie_ep_linkup(struct dw_pcie_ep *ep);
> > > > +void dw_pcie_ep_linkdown(struct dw_pcie_ep *ep);
> > > > int dw_pcie_ep_init(struct dw_pcie_ep *ep);
> > > > int dw_pcie_ep_init_registers(struct dw_pcie_ep *ep);
> > > > void dw_pcie_ep_init_notify(struct dw_pcie_ep *ep);
> > > > @@ -688,6 +689,10 @@ static inline void dw_pcie_ep_linkup(struct dw_pcie_ep *ep)
> > > > {
> > > > }
> > > >
> > > > +static inline void dw_pcie_ep_linkdown(struct dw_pcie_ep *ep)
> > > > +{
> > > > +}
> > > > +
> > > > static inline int dw_pcie_ep_init(struct dw_pcie_ep *ep)
> > > > {
> > > > return 0;
> > > >
> > > > --
> > > > 2.25.1
> > > >
> >
> > --
> > மணிவண்ணன் சதாசிவம்
--
மணிவண்ணன் சதாசிவம்
WARNING: multiple messages have this Message-ID (diff)
From: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
To: Frank Li <Frank.li@nxp.com>
Cc: "Krzysztof Wilczyński" <kw@linux.com>,
"Vignesh Raghavendra" <vigneshr@ti.com>,
"Kunihiko Hayashi" <hayashi.kunihiko@socionext.com>,
linux-pci@vger.kernel.org,
"Lorenzo Pieralisi" <lpieralisi@kernel.org>,
"Minghuan Lian" <minghuan.Lian@nxp.com>,
"Thierry Reding" <thierry.reding@gmail.com>,
"Kishon Vijay Abraham I" <kishon@ti.com>,
"Fabio Estevam" <festevam@gmail.com>,
"Marek Vasut" <marek.vasut+renesas@gmail.com>,
"Kishon Vijay Abraham I" <kishon@kernel.org>,
"Rob Herring" <robh@kernel.org>,
linux-tegra@vger.kernel.org,
"Jonathan Hunter" <jonathanh@nvidia.com>,
"NXP Linux Team" <linux-imx@nxp.com>,
"Richard Zhu" <hongxing.zhu@nxp.com>,
linux-arm-msm@vger.kernel.org,
"Sascha Hauer" <s.hauer@pengutronix.de>,
linuxppc-dev@lists.ozlabs.org,
"Bjorn Helgaas" <bhelgaas@google.com>,
linux-omap@vger.kernel.org, "Mingkai Hu" <mingkai.hu@nxp.com>,
linux-arm-kernel@lists.infradead.org,
"Roy Zang" <roy.zang@nxp.com>,
"Niklas Cassel" <cassel@kernel.org>,
"Jingoo Han" <jingoohan1@gmail.com>
Subject: Re: [PATCH v8 08/10] PCI: dwc: ep: Add a generic dw_pcie_ep_linkdown() API to handle LINK_DOWN event
Date: Wed, 28 Feb 2024 00:20:50 +0530 [thread overview]
Message-ID: <20240227185050.GV2587@thinkpad> (raw)
In-Reply-To: <Zd4bLZb2z4TEoR1a@lizhi-Precision-Tower-5810>
On Tue, Feb 27, 2024 at 12:26:05PM -0500, Frank Li wrote:
> On Tue, Feb 27, 2024 at 06:00:24PM +0530, Manivannan Sadhasivam wrote:
> > On Mon, Feb 26, 2024 at 12:18:18PM -0500, Frank Li wrote:
> > > On Sat, Feb 24, 2024 at 12:24:14PM +0530, Manivannan Sadhasivam wrote:
> > > > The PCIe link can go to LINK_DOWN state in one of the following scenarios:
> > > >
> > > > 1. Fundamental (PERST#)/hot/warm reset
> > > > 2. Link transition from L2/L3 to L0
> > >
> > > From L0 to L2/l3
> > >
> >
> > I don't understand what you mean here. Link down won't happen while moving from
> > L0 to L2/L3, it is the opposite.
>
> Strange, why there are not linkdown from L0 to L2/l3. But have linkdown
> from L2/l3 to L0? when linkup happen? Any document show these?
>
Refer PCIe Spec 5.0, Figure 5-1 Link Power Management State Flow Diagram.
- Mani
> Frank
>
> >
> > > >
> > > > In those cases, LINK_DOWN causes some non-sticky DWC registers to loose the
> > > > state (like REBAR, PTM_CAP etc...). So the drivers need to reinitialize
> > > > them to function properly once the link comes back again.
> > > >
> > > > This is not a problem for drivers supporting PERST# IRQ, since they can
> > > > reinitialize the registers in the PERST# IRQ callback. But for the drivers
> > > > not supporting PERST#, there is no way they can reinitialize the registers
> > > > other than relying on LINK_DOWN IRQ received when the link goes down. So
> > > > let's add a DWC generic API dw_pcie_ep_linkdown() that reinitializes the
> > > > non-sticky registers and also notifies the EPF drivers about link going
> > > > down.
> > > >
> > > > This API can also be used by the drivers supporting PERST# to handle the
> > > > scenario (2) mentioned above.
> > > >
> > > > Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
> > > > ---
> > > > drivers/pci/controller/dwc/pcie-designware-ep.c | 111 ++++++++++++++----------
> > > > drivers/pci/controller/dwc/pcie-designware.h | 5 ++
> > > > 2 files changed, 72 insertions(+), 44 deletions(-)
> > > >
> > > > diff --git a/drivers/pci/controller/dwc/pcie-designware-ep.c b/drivers/pci/controller/dwc/pcie-designware-ep.c
> > > > index 278bdc9b2269..fed4c2936c78 100644
> > > > --- a/drivers/pci/controller/dwc/pcie-designware-ep.c
> > > > +++ b/drivers/pci/controller/dwc/pcie-designware-ep.c
> > > > @@ -14,14 +14,6 @@
> > > > #include <linux/pci-epc.h>
> > > > #include <linux/pci-epf.h>
> > > >
> > > > -void dw_pcie_ep_linkup(struct dw_pcie_ep *ep)
> > > > -{
> > > > - struct pci_epc *epc = ep->epc;
> > > > -
> > > > - pci_epc_linkup(epc);
> > > > -}
> > > > -EXPORT_SYMBOL_GPL(dw_pcie_ep_linkup);
> > > > -
> > >
> > > No sure why git remove this block and add these back.
> > >
> >
> > Because, we are adding dw_pcie_ep_linkdown() API way below and it makes sense to
> > move this API also to keep it ordered. Maybe I should've described it in commit
> > message.
> >
> > - Mani
> >
> > >
> > > > void dw_pcie_ep_init_notify(struct dw_pcie_ep *ep)
> > > > {
> > > > struct pci_epc *epc = ep->epc;
> > > > @@ -603,19 +595,56 @@ static unsigned int dw_pcie_ep_find_ext_capability(struct dw_pcie *pci, int cap)
> > > > return 0;
> > > > }
> > > >
> > > > +static void dw_pcie_ep_init_non_sticky_registers(struct dw_pcie *pci)
> > > > +{
> > > > + unsigned int offset, ptm_cap_base;
> > > > + unsigned int nbars;
> > > > + u32 reg, i;
> > > > +
> > > > + offset = dw_pcie_ep_find_ext_capability(pci, PCI_EXT_CAP_ID_REBAR);
> > > > + ptm_cap_base = dw_pcie_ep_find_ext_capability(pci, PCI_EXT_CAP_ID_PTM);
> > > > +
> > > > + dw_pcie_dbi_ro_wr_en(pci);
> > > > +
> > > > + if (offset) {
> > > > + reg = dw_pcie_readl_dbi(pci, offset + PCI_REBAR_CTRL);
> > > > + nbars = (reg & PCI_REBAR_CTRL_NBAR_MASK) >>
> > > > + PCI_REBAR_CTRL_NBAR_SHIFT;
> > > > +
> > > > + for (i = 0; i < nbars; i++, offset += PCI_REBAR_CTRL)
> > > > + dw_pcie_writel_dbi(pci, offset + PCI_REBAR_CAP, 0x0);
> > > > + }
> > > > +
> > > > + /*
> > > > + * PTM responder capability can be disabled only after disabling
> > > > + * PTM root capability.
> > > > + */
> > > > + if (ptm_cap_base) {
> > > > + dw_pcie_dbi_ro_wr_en(pci);
> > > > + reg = dw_pcie_readl_dbi(pci, ptm_cap_base + PCI_PTM_CAP);
> > > > + reg &= ~PCI_PTM_CAP_ROOT;
> > > > + dw_pcie_writel_dbi(pci, ptm_cap_base + PCI_PTM_CAP, reg);
> > > > +
> > > > + reg = dw_pcie_readl_dbi(pci, ptm_cap_base + PCI_PTM_CAP);
> > > > + reg &= ~(PCI_PTM_CAP_RES | PCI_PTM_GRANULARITY_MASK);
> > > > + dw_pcie_writel_dbi(pci, ptm_cap_base + PCI_PTM_CAP, reg);
> > > > + dw_pcie_dbi_ro_wr_dis(pci);
> > > > + }
> > > > +
> > > > + dw_pcie_setup(pci);
> > > > + dw_pcie_dbi_ro_wr_dis(pci);
> > > > +}
> > > > +
> > > > int dw_pcie_ep_init_registers(struct dw_pcie_ep *ep)
> > > > {
> > > > struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
> > > > struct dw_pcie_ep_func *ep_func;
> > > > struct device *dev = pci->dev;
> > > > struct pci_epc *epc = ep->epc;
> > > > - unsigned int offset, ptm_cap_base;
> > > > - unsigned int nbars;
> > > > u8 hdr_type;
> > > > u8 func_no;
> > > > - int i, ret;
> > > > void *addr;
> > > > - u32 reg;
> > > > + int ret;
> > > >
> > > > hdr_type = dw_pcie_readb_dbi(pci, PCI_HEADER_TYPE) &
> > > > PCI_HEADER_TYPE_MASK;
> > > > @@ -678,38 +707,7 @@ int dw_pcie_ep_init_registers(struct dw_pcie_ep *ep)
> > > > if (ep->ops->init)
> > > > ep->ops->init(ep);
> > > >
> > > > - offset = dw_pcie_ep_find_ext_capability(pci, PCI_EXT_CAP_ID_REBAR);
> > > > - ptm_cap_base = dw_pcie_ep_find_ext_capability(pci, PCI_EXT_CAP_ID_PTM);
> > > > -
> > > > - dw_pcie_dbi_ro_wr_en(pci);
> > > > -
> > > > - if (offset) {
> > > > - reg = dw_pcie_readl_dbi(pci, offset + PCI_REBAR_CTRL);
> > > > - nbars = (reg & PCI_REBAR_CTRL_NBAR_MASK) >>
> > > > - PCI_REBAR_CTRL_NBAR_SHIFT;
> > > > -
> > > > - for (i = 0; i < nbars; i++, offset += PCI_REBAR_CTRL)
> > > > - dw_pcie_writel_dbi(pci, offset + PCI_REBAR_CAP, 0x0);
> > > > - }
> > > > -
> > > > - /*
> > > > - * PTM responder capability can be disabled only after disabling
> > > > - * PTM root capability.
> > > > - */
> > > > - if (ptm_cap_base) {
> > > > - dw_pcie_dbi_ro_wr_en(pci);
> > > > - reg = dw_pcie_readl_dbi(pci, ptm_cap_base + PCI_PTM_CAP);
> > > > - reg &= ~PCI_PTM_CAP_ROOT;
> > > > - dw_pcie_writel_dbi(pci, ptm_cap_base + PCI_PTM_CAP, reg);
> > > > -
> > > > - reg = dw_pcie_readl_dbi(pci, ptm_cap_base + PCI_PTM_CAP);
> > > > - reg &= ~(PCI_PTM_CAP_RES | PCI_PTM_GRANULARITY_MASK);
> > > > - dw_pcie_writel_dbi(pci, ptm_cap_base + PCI_PTM_CAP, reg);
> > > > - dw_pcie_dbi_ro_wr_dis(pci);
> > > > - }
> > > > -
> > > > - dw_pcie_setup(pci);
> > > > - dw_pcie_dbi_ro_wr_dis(pci);
> > > > + dw_pcie_ep_init_non_sticky_registers(pci);
> > > >
> > > > return 0;
> > > >
> > > > @@ -720,6 +718,31 @@ int dw_pcie_ep_init_registers(struct dw_pcie_ep *ep)
> > > > }
> > > > EXPORT_SYMBOL_GPL(dw_pcie_ep_init_registers);
> > > >
> > > > +void dw_pcie_ep_linkup(struct dw_pcie_ep *ep)
> > > > +{
> > > > + struct pci_epc *epc = ep->epc;
> > > > +
> > > > + pci_epc_linkup(epc);
> > > > +}
> > > > +EXPORT_SYMBOL_GPL(dw_pcie_ep_linkup);
> > > > +
> > > > +void dw_pcie_ep_linkdown(struct dw_pcie_ep *ep)
> > > > +{
> > > > + struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
> > > > + struct pci_epc *epc = ep->epc;
> > > > +
> > > > + /*
> > > > + * Initialize the non-sticky DWC registers as they would've reset post
> > > > + * LINK_DOWN. This is specifically needed for drivers not supporting
> > > > + * PERST# as they have no way to reinitialize the registers before the
> > > > + * link comes back again.
> > > > + */
> > > > + dw_pcie_ep_init_non_sticky_registers(pci);
> > > > +
> > > > + pci_epc_linkdown(epc);
> > > > +}
> > > > +EXPORT_SYMBOL_GPL(dw_pcie_ep_linkdown);
> > > > +
> > > > int dw_pcie_ep_init(struct dw_pcie_ep *ep)
> > > > {
> > > > int ret;
> > > > diff --git a/drivers/pci/controller/dwc/pcie-designware.h b/drivers/pci/controller/dwc/pcie-designware.h
> > > > index f8e5431a207b..152969545b0a 100644
> > > > --- a/drivers/pci/controller/dwc/pcie-designware.h
> > > > +++ b/drivers/pci/controller/dwc/pcie-designware.h
> > > > @@ -668,6 +668,7 @@ static inline void __iomem *dw_pcie_own_conf_map_bus(struct pci_bus *bus,
> > > >
> > > > #ifdef CONFIG_PCIE_DW_EP
> > > > void dw_pcie_ep_linkup(struct dw_pcie_ep *ep);
> > > > +void dw_pcie_ep_linkdown(struct dw_pcie_ep *ep);
> > > > int dw_pcie_ep_init(struct dw_pcie_ep *ep);
> > > > int dw_pcie_ep_init_registers(struct dw_pcie_ep *ep);
> > > > void dw_pcie_ep_init_notify(struct dw_pcie_ep *ep);
> > > > @@ -688,6 +689,10 @@ static inline void dw_pcie_ep_linkup(struct dw_pcie_ep *ep)
> > > > {
> > > > }
> > > >
> > > > +static inline void dw_pcie_ep_linkdown(struct dw_pcie_ep *ep)
> > > > +{
> > > > +}
> > > > +
> > > > static inline int dw_pcie_ep_init(struct dw_pcie_ep *ep)
> > > > {
> > > > return 0;
> > > >
> > > > --
> > > > 2.25.1
> > > >
> >
> > --
> > மணிவண்ணன் சதாசிவம்
--
மணிவண்ணன் சதாசிவம்
WARNING: multiple messages have this Message-ID (diff)
From: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
To: Frank Li <Frank.li@nxp.com>
Cc: "Jingoo Han" <jingoohan1@gmail.com>,
"Gustavo Pimentel" <gustavo.pimentel@synopsys.com>,
"Lorenzo Pieralisi" <lpieralisi@kernel.org>,
"Krzysztof Wilczyński" <kw@linux.com>,
"Rob Herring" <robh@kernel.org>,
"Bjorn Helgaas" <bhelgaas@google.com>,
"Marek Vasut" <marek.vasut+renesas@gmail.com>,
"Yoshihiro Shimoda" <yoshihiro.shimoda.uh@renesas.com>,
"Thierry Reding" <thierry.reding@gmail.com>,
"Jonathan Hunter" <jonathanh@nvidia.com>,
"Kishon Vijay Abraham I" <kishon@ti.com>,
"Vidya Sagar" <vidyas@nvidia.com>,
"Vignesh Raghavendra" <vigneshr@ti.com>,
"Richard Zhu" <hongxing.zhu@nxp.com>,
"Lucas Stach" <l.stach@pengutronix.de>,
"Shawn Guo" <shawnguo@kernel.org>,
"Sascha Hauer" <s.hauer@pengutronix.de>,
"Pengutronix Kernel Team" <kernel@pengutronix.de>,
"Fabio Estevam" <festevam@gmail.com>,
"NXP Linux Team" <linux-imx@nxp.com>,
"Minghuan Lian" <minghuan.Lian@nxp.com>,
"Mingkai Hu" <mingkai.hu@nxp.com>, "Roy Zang" <roy.zang@nxp.com>,
"Kunihiko Hayashi" <hayashi.kunihiko@socionext.com>,
"Masami Hiramatsu" <mhiramat@kernel.org>,
"Kishon Vijay Abraham I" <kishon@kernel.org>,
linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-renesas-soc@vger.kernel.org, linux-arm-msm@vger.kernel.org,
linux-tegra@vger.kernel.org, linux-omap@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linuxppc-dev@lists.ozlabs.org,
"Niklas Cassel" <cassel@kernel.org>
Subject: Re: [PATCH v8 08/10] PCI: dwc: ep: Add a generic dw_pcie_ep_linkdown() API to handle LINK_DOWN event
Date: Wed, 28 Feb 2024 00:20:50 +0530 [thread overview]
Message-ID: <20240227185050.GV2587@thinkpad> (raw)
In-Reply-To: <Zd4bLZb2z4TEoR1a@lizhi-Precision-Tower-5810>
On Tue, Feb 27, 2024 at 12:26:05PM -0500, Frank Li wrote:
> On Tue, Feb 27, 2024 at 06:00:24PM +0530, Manivannan Sadhasivam wrote:
> > On Mon, Feb 26, 2024 at 12:18:18PM -0500, Frank Li wrote:
> > > On Sat, Feb 24, 2024 at 12:24:14PM +0530, Manivannan Sadhasivam wrote:
> > > > The PCIe link can go to LINK_DOWN state in one of the following scenarios:
> > > >
> > > > 1. Fundamental (PERST#)/hot/warm reset
> > > > 2. Link transition from L2/L3 to L0
> > >
> > > From L0 to L2/l3
> > >
> >
> > I don't understand what you mean here. Link down won't happen while moving from
> > L0 to L2/L3, it is the opposite.
>
> Strange, why there are not linkdown from L0 to L2/l3. But have linkdown
> from L2/l3 to L0? when linkup happen? Any document show these?
>
Refer PCIe Spec 5.0, Figure 5-1 Link Power Management State Flow Diagram.
- Mani
> Frank
>
> >
> > > >
> > > > In those cases, LINK_DOWN causes some non-sticky DWC registers to loose the
> > > > state (like REBAR, PTM_CAP etc...). So the drivers need to reinitialize
> > > > them to function properly once the link comes back again.
> > > >
> > > > This is not a problem for drivers supporting PERST# IRQ, since they can
> > > > reinitialize the registers in the PERST# IRQ callback. But for the drivers
> > > > not supporting PERST#, there is no way they can reinitialize the registers
> > > > other than relying on LINK_DOWN IRQ received when the link goes down. So
> > > > let's add a DWC generic API dw_pcie_ep_linkdown() that reinitializes the
> > > > non-sticky registers and also notifies the EPF drivers about link going
> > > > down.
> > > >
> > > > This API can also be used by the drivers supporting PERST# to handle the
> > > > scenario (2) mentioned above.
> > > >
> > > > Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
> > > > ---
> > > > drivers/pci/controller/dwc/pcie-designware-ep.c | 111 ++++++++++++++----------
> > > > drivers/pci/controller/dwc/pcie-designware.h | 5 ++
> > > > 2 files changed, 72 insertions(+), 44 deletions(-)
> > > >
> > > > diff --git a/drivers/pci/controller/dwc/pcie-designware-ep.c b/drivers/pci/controller/dwc/pcie-designware-ep.c
> > > > index 278bdc9b2269..fed4c2936c78 100644
> > > > --- a/drivers/pci/controller/dwc/pcie-designware-ep.c
> > > > +++ b/drivers/pci/controller/dwc/pcie-designware-ep.c
> > > > @@ -14,14 +14,6 @@
> > > > #include <linux/pci-epc.h>
> > > > #include <linux/pci-epf.h>
> > > >
> > > > -void dw_pcie_ep_linkup(struct dw_pcie_ep *ep)
> > > > -{
> > > > - struct pci_epc *epc = ep->epc;
> > > > -
> > > > - pci_epc_linkup(epc);
> > > > -}
> > > > -EXPORT_SYMBOL_GPL(dw_pcie_ep_linkup);
> > > > -
> > >
> > > No sure why git remove this block and add these back.
> > >
> >
> > Because, we are adding dw_pcie_ep_linkdown() API way below and it makes sense to
> > move this API also to keep it ordered. Maybe I should've described it in commit
> > message.
> >
> > - Mani
> >
> > >
> > > > void dw_pcie_ep_init_notify(struct dw_pcie_ep *ep)
> > > > {
> > > > struct pci_epc *epc = ep->epc;
> > > > @@ -603,19 +595,56 @@ static unsigned int dw_pcie_ep_find_ext_capability(struct dw_pcie *pci, int cap)
> > > > return 0;
> > > > }
> > > >
> > > > +static void dw_pcie_ep_init_non_sticky_registers(struct dw_pcie *pci)
> > > > +{
> > > > + unsigned int offset, ptm_cap_base;
> > > > + unsigned int nbars;
> > > > + u32 reg, i;
> > > > +
> > > > + offset = dw_pcie_ep_find_ext_capability(pci, PCI_EXT_CAP_ID_REBAR);
> > > > + ptm_cap_base = dw_pcie_ep_find_ext_capability(pci, PCI_EXT_CAP_ID_PTM);
> > > > +
> > > > + dw_pcie_dbi_ro_wr_en(pci);
> > > > +
> > > > + if (offset) {
> > > > + reg = dw_pcie_readl_dbi(pci, offset + PCI_REBAR_CTRL);
> > > > + nbars = (reg & PCI_REBAR_CTRL_NBAR_MASK) >>
> > > > + PCI_REBAR_CTRL_NBAR_SHIFT;
> > > > +
> > > > + for (i = 0; i < nbars; i++, offset += PCI_REBAR_CTRL)
> > > > + dw_pcie_writel_dbi(pci, offset + PCI_REBAR_CAP, 0x0);
> > > > + }
> > > > +
> > > > + /*
> > > > + * PTM responder capability can be disabled only after disabling
> > > > + * PTM root capability.
> > > > + */
> > > > + if (ptm_cap_base) {
> > > > + dw_pcie_dbi_ro_wr_en(pci);
> > > > + reg = dw_pcie_readl_dbi(pci, ptm_cap_base + PCI_PTM_CAP);
> > > > + reg &= ~PCI_PTM_CAP_ROOT;
> > > > + dw_pcie_writel_dbi(pci, ptm_cap_base + PCI_PTM_CAP, reg);
> > > > +
> > > > + reg = dw_pcie_readl_dbi(pci, ptm_cap_base + PCI_PTM_CAP);
> > > > + reg &= ~(PCI_PTM_CAP_RES | PCI_PTM_GRANULARITY_MASK);
> > > > + dw_pcie_writel_dbi(pci, ptm_cap_base + PCI_PTM_CAP, reg);
> > > > + dw_pcie_dbi_ro_wr_dis(pci);
> > > > + }
> > > > +
> > > > + dw_pcie_setup(pci);
> > > > + dw_pcie_dbi_ro_wr_dis(pci);
> > > > +}
> > > > +
> > > > int dw_pcie_ep_init_registers(struct dw_pcie_ep *ep)
> > > > {
> > > > struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
> > > > struct dw_pcie_ep_func *ep_func;
> > > > struct device *dev = pci->dev;
> > > > struct pci_epc *epc = ep->epc;
> > > > - unsigned int offset, ptm_cap_base;
> > > > - unsigned int nbars;
> > > > u8 hdr_type;
> > > > u8 func_no;
> > > > - int i, ret;
> > > > void *addr;
> > > > - u32 reg;
> > > > + int ret;
> > > >
> > > > hdr_type = dw_pcie_readb_dbi(pci, PCI_HEADER_TYPE) &
> > > > PCI_HEADER_TYPE_MASK;
> > > > @@ -678,38 +707,7 @@ int dw_pcie_ep_init_registers(struct dw_pcie_ep *ep)
> > > > if (ep->ops->init)
> > > > ep->ops->init(ep);
> > > >
> > > > - offset = dw_pcie_ep_find_ext_capability(pci, PCI_EXT_CAP_ID_REBAR);
> > > > - ptm_cap_base = dw_pcie_ep_find_ext_capability(pci, PCI_EXT_CAP_ID_PTM);
> > > > -
> > > > - dw_pcie_dbi_ro_wr_en(pci);
> > > > -
> > > > - if (offset) {
> > > > - reg = dw_pcie_readl_dbi(pci, offset + PCI_REBAR_CTRL);
> > > > - nbars = (reg & PCI_REBAR_CTRL_NBAR_MASK) >>
> > > > - PCI_REBAR_CTRL_NBAR_SHIFT;
> > > > -
> > > > - for (i = 0; i < nbars; i++, offset += PCI_REBAR_CTRL)
> > > > - dw_pcie_writel_dbi(pci, offset + PCI_REBAR_CAP, 0x0);
> > > > - }
> > > > -
> > > > - /*
> > > > - * PTM responder capability can be disabled only after disabling
> > > > - * PTM root capability.
> > > > - */
> > > > - if (ptm_cap_base) {
> > > > - dw_pcie_dbi_ro_wr_en(pci);
> > > > - reg = dw_pcie_readl_dbi(pci, ptm_cap_base + PCI_PTM_CAP);
> > > > - reg &= ~PCI_PTM_CAP_ROOT;
> > > > - dw_pcie_writel_dbi(pci, ptm_cap_base + PCI_PTM_CAP, reg);
> > > > -
> > > > - reg = dw_pcie_readl_dbi(pci, ptm_cap_base + PCI_PTM_CAP);
> > > > - reg &= ~(PCI_PTM_CAP_RES | PCI_PTM_GRANULARITY_MASK);
> > > > - dw_pcie_writel_dbi(pci, ptm_cap_base + PCI_PTM_CAP, reg);
> > > > - dw_pcie_dbi_ro_wr_dis(pci);
> > > > - }
> > > > -
> > > > - dw_pcie_setup(pci);
> > > > - dw_pcie_dbi_ro_wr_dis(pci);
> > > > + dw_pcie_ep_init_non_sticky_registers(pci);
> > > >
> > > > return 0;
> > > >
> > > > @@ -720,6 +718,31 @@ int dw_pcie_ep_init_registers(struct dw_pcie_ep *ep)
> > > > }
> > > > EXPORT_SYMBOL_GPL(dw_pcie_ep_init_registers);
> > > >
> > > > +void dw_pcie_ep_linkup(struct dw_pcie_ep *ep)
> > > > +{
> > > > + struct pci_epc *epc = ep->epc;
> > > > +
> > > > + pci_epc_linkup(epc);
> > > > +}
> > > > +EXPORT_SYMBOL_GPL(dw_pcie_ep_linkup);
> > > > +
> > > > +void dw_pcie_ep_linkdown(struct dw_pcie_ep *ep)
> > > > +{
> > > > + struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
> > > > + struct pci_epc *epc = ep->epc;
> > > > +
> > > > + /*
> > > > + * Initialize the non-sticky DWC registers as they would've reset post
> > > > + * LINK_DOWN. This is specifically needed for drivers not supporting
> > > > + * PERST# as they have no way to reinitialize the registers before the
> > > > + * link comes back again.
> > > > + */
> > > > + dw_pcie_ep_init_non_sticky_registers(pci);
> > > > +
> > > > + pci_epc_linkdown(epc);
> > > > +}
> > > > +EXPORT_SYMBOL_GPL(dw_pcie_ep_linkdown);
> > > > +
> > > > int dw_pcie_ep_init(struct dw_pcie_ep *ep)
> > > > {
> > > > int ret;
> > > > diff --git a/drivers/pci/controller/dwc/pcie-designware.h b/drivers/pci/controller/dwc/pcie-designware.h
> > > > index f8e5431a207b..152969545b0a 100644
> > > > --- a/drivers/pci/controller/dwc/pcie-designware.h
> > > > +++ b/drivers/pci/controller/dwc/pcie-designware.h
> > > > @@ -668,6 +668,7 @@ static inline void __iomem *dw_pcie_own_conf_map_bus(struct pci_bus *bus,
> > > >
> > > > #ifdef CONFIG_PCIE_DW_EP
> > > > void dw_pcie_ep_linkup(struct dw_pcie_ep *ep);
> > > > +void dw_pcie_ep_linkdown(struct dw_pcie_ep *ep);
> > > > int dw_pcie_ep_init(struct dw_pcie_ep *ep);
> > > > int dw_pcie_ep_init_registers(struct dw_pcie_ep *ep);
> > > > void dw_pcie_ep_init_notify(struct dw_pcie_ep *ep);
> > > > @@ -688,6 +689,10 @@ static inline void dw_pcie_ep_linkup(struct dw_pcie_ep *ep)
> > > > {
> > > > }
> > > >
> > > > +static inline void dw_pcie_ep_linkdown(struct dw_pcie_ep *ep)
> > > > +{
> > > > +}
> > > > +
> > > > static inline int dw_pcie_ep_init(struct dw_pcie_ep *ep)
> > > > {
> > > > return 0;
> > > >
> > > > --
> > > > 2.25.1
> > > >
> >
> > --
> > மணிவண்ணன் சதாசிவம்
--
மணிவண்ணன் சதாசிவம்
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2024-02-27 18:51 UTC|newest]
Thread overview: 114+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-24 6:54 [PATCH v8 00/10] PCI: dwc: ep: Fix DBI access failure for drivers requiring refclk from host Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-24 6:54 ` [PATCH v8 01/10] PCI: dwc: ep: Remove deinit() callback from struct dw_pcie_ep_ops Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-26 16:49 ` Frank Li
2024-02-26 16:49 ` Frank Li
2024-02-26 16:49 ` Frank Li
2024-02-24 6:54 ` [PATCH v8 02/10] PCI: dwc: ep: Rename dw_pcie_ep_exit() to dw_pcie_ep_deinit() Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-26 16:51 ` Frank Li
2024-02-26 16:51 ` Frank Li
2024-02-26 16:51 ` Frank Li
2024-02-24 6:54 ` [PATCH v8 03/10] PCI: dwc: ep: Introduce dw_pcie_ep_cleanup() API for drivers supporting PERST# Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-26 16:53 ` Frank Li
2024-02-26 16:53 ` Frank Li
2024-02-26 16:53 ` Frank Li
2024-02-29 12:40 ` Niklas Cassel
2024-02-29 12:40 ` Niklas Cassel
2024-02-29 12:40 ` Niklas Cassel
2024-03-04 8:17 ` Manivannan Sadhasivam
2024-03-04 8:17 ` Manivannan Sadhasivam
2024-03-04 8:17 ` Manivannan Sadhasivam
2024-03-04 10:51 ` Niklas Cassel
2024-03-04 10:51 ` Niklas Cassel
2024-03-04 10:51 ` Niklas Cassel
2024-03-04 15:04 ` Manivannan Sadhasivam
2024-03-04 15:04 ` Manivannan Sadhasivam
2024-03-04 15:04 ` Manivannan Sadhasivam
2024-02-24 6:54 ` [PATCH v8 04/10] PCI: dwc: ep: Fix DBI access failure for drivers requiring refclk from host Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-26 16:57 ` Frank Li
2024-02-26 16:57 ` Frank Li
2024-02-26 16:57 ` Frank Li
2024-02-24 6:54 ` [PATCH v8 05/10] PCI: dwc: ep: Rename dw_pcie_ep_init_complete() to dw_pcie_ep_init_registers() Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-26 16:58 ` Frank Li
2024-02-26 16:58 ` Frank Li
2024-02-26 16:58 ` Frank Li
2024-02-24 6:54 ` [PATCH v8 06/10] PCI: dwc: ep: Call dw_pcie_ep_init_registers() API directly from all glue drivers Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-26 17:04 ` Frank Li
2024-02-26 17:04 ` Frank Li
2024-02-26 17:04 ` Frank Li
2024-02-27 12:21 ` Manivannan Sadhasivam
2024-02-27 12:21 ` Manivannan Sadhasivam
2024-02-27 12:21 ` Manivannan Sadhasivam
2024-02-27 17:28 ` Frank Li
2024-02-27 17:28 ` Frank Li
2024-02-27 17:28 ` Frank Li
2024-02-27 18:42 ` Manivannan Sadhasivam
2024-02-27 18:42 ` Manivannan Sadhasivam
2024-02-27 18:42 ` Manivannan Sadhasivam
2024-02-24 6:54 ` [PATCH v8 07/10] PCI: dwc: ep: Remove "core_init_notifier" flag Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-26 17:09 ` Frank Li
2024-02-26 17:09 ` Frank Li
2024-02-26 17:09 ` Frank Li
2024-02-29 11:23 ` Niklas Cassel
2024-02-29 11:23 ` Niklas Cassel
2024-02-29 11:23 ` Niklas Cassel
2024-03-04 6:26 ` Manivannan Sadhasivam
2024-03-04 6:26 ` Manivannan Sadhasivam
2024-03-04 6:26 ` Manivannan Sadhasivam
2024-02-24 6:54 ` [PATCH v8 08/10] PCI: dwc: ep: Add a generic dw_pcie_ep_linkdown() API to handle LINK_DOWN event Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-26 17:18 ` Frank Li
2024-02-26 17:18 ` Frank Li
2024-02-26 17:18 ` Frank Li
2024-02-27 12:30 ` Manivannan Sadhasivam
2024-02-27 12:30 ` Manivannan Sadhasivam
2024-02-27 12:30 ` Manivannan Sadhasivam
2024-02-27 17:26 ` Frank Li
2024-02-27 17:26 ` Frank Li
2024-02-27 17:26 ` Frank Li
2024-02-27 18:50 ` Manivannan Sadhasivam [this message]
2024-02-27 18:50 ` Manivannan Sadhasivam
2024-02-27 18:50 ` Manivannan Sadhasivam
2024-02-24 6:54 ` [PATCH v8 09/10] PCI: qcom-ep: Use the " Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-26 17:20 ` Frank Li
2024-02-26 17:20 ` Frank Li
2024-02-26 17:20 ` Frank Li
2024-02-27 12:32 ` Manivannan Sadhasivam
2024-02-27 12:32 ` Manivannan Sadhasivam
2024-02-27 12:32 ` Manivannan Sadhasivam
2024-02-27 17:34 ` Frank Li
2024-02-27 17:34 ` Frank Li
2024-02-27 17:34 ` Frank Li
2024-02-27 18:47 ` Manivannan Sadhasivam
2024-02-27 18:47 ` Manivannan Sadhasivam
2024-02-27 18:47 ` Manivannan Sadhasivam
2024-02-24 6:54 ` [PATCH v8 10/10] PCI: dwc: ep: Add Kernel-doc comments for APIs Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-24 6:54 ` Manivannan Sadhasivam
2024-02-26 17:21 ` Frank Li
2024-02-26 17:21 ` Frank Li
2024-02-26 17:21 ` Frank Li
2024-02-29 12:56 ` Niklas Cassel
2024-02-29 12:56 ` Niklas Cassel
2024-02-29 12:56 ` Niklas Cassel
2024-03-04 8:18 ` Manivannan Sadhasivam
2024-03-04 8:18 ` Manivannan Sadhasivam
2024-03-04 8:18 ` Manivannan Sadhasivam
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240227185050.GV2587@thinkpad \
--to=manivannan.sadhasivam@linaro.org \
--cc=Frank.li@nxp.com \
--cc=bhelgaas@google.com \
--cc=cassel@kernel.org \
--cc=festevam@gmail.com \
--cc=gustavo.pimentel@synopsys.com \
--cc=hayashi.kunihiko@socionext.com \
--cc=hongxing.zhu@nxp.com \
--cc=jingoohan1@gmail.com \
--cc=jonathanh@nvidia.com \
--cc=kernel@pengutronix.de \
--cc=kishon@kernel.org \
--cc=kishon@ti.com \
--cc=kw@linux.com \
--cc=l.stach@pengutronix.de \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-imx@nxp.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux-renesas-soc@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=lpieralisi@kernel.org \
--cc=marek.vasut+renesas@gmail.com \
--cc=mhiramat@kernel.org \
--cc=minghuan.Lian@nxp.com \
--cc=mingkai.hu@nxp.com \
--cc=robh@kernel.org \
--cc=roy.zang@nxp.com \
--cc=s.hauer@pengutronix.de \
--cc=shawnguo@kernel.org \
--cc=thierry.reding@gmail.com \
--cc=vidyas@nvidia.com \
--cc=vigneshr@ti.com \
--cc=yoshihiro.shimoda.uh@renesas.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.