From: Niklas Cassel <cassel@kernel.org>
To: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
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>,
"Jesper Nilsson" <jesper.nilsson@axis.com>,
linux-tegra@vger.kernel.org, linux-arm-kernel@axis.com,
"Jonathan Hunter" <jonathanh@nvidia.com>,
"NXP Linux Team" <linux-imx@nxp.com>,
"Richard Zhu" <hongxing.zhu@nxp.com>,
"Srikanth Thokala" <srikanth.thokala@intel.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>,
"Jingoo Han" <jingoohan1@gmail.com>,
"Yoshihiro Shimoda" <yoshihiro.shimoda.uh@renesas.com>,
linux-kernel@vger.kernel.org, "Vidya Sagar" <vidyas@nvidia.com>,
linux-renesas-soc@vger.kernel.org,
"Masami Hiramatsu" <mhiramat@kernel.org>,
"Pengutronix Kernel Team" <kernel@pengutronix.de>,
"Gustavo Pimentel" <gustavo.pimentel@synopsys.com>,
"Shawn Guo" <shawnguo@kernel.org>,
"Lucas Stach" <l.stach@pengutronix.de>
Subject: Re: [PATCH v9 08/10] PCI: dwc: ep: Add a generic dw_pcie_ep_linkdown() API to handle LINK_DOWN event
Date: Fri, 8 Mar 2024 11:14:51 +0100 [thread overview]
Message-ID: <ZerlG5W-hUFIYY8b@ryzen> (raw)
In-Reply-To: <20240308094606.GG3789@thinkpad>
On Fri, Mar 08, 2024 at 03:16:06PM +0530, Manivannan Sadhasivam wrote:
> On Fri, Mar 08, 2024 at 09:56:33AM +0100, Niklas Cassel wrote:
> > On Fri, Mar 08, 2024 at 11:11:52AM +0530, Manivannan Sadhasivam wrote:
> > > On Thu, Mar 07, 2024 at 10:43:19PM +0100, Niklas Cassel wrote:
> > > > On Mon, Mar 04, 2024 at 02:52:20PM +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
> > > > >
> > > > > 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);
> > > > > -
> > > > > 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);
> > > >
> > > > If you look at PCI_REBAR_CAP, you will see that it is sticky,
> > > > but you have to actually read the databook to see that:
> > > >
> > > > "The RESBAR_CTRL_REG_BAR_SIZE field is automatically updated
> > > > when you write to RESBAR_CAP_REG_0_REG through the DBI."
> > > >
> > > > So the reason why we need to write this register, even though
> > > > it is sticky, is to update the RESBAR_CTRL_REG_BAR_SIZE register,
> > > > which is not sticky :)
> > > >
> > > > (Perhaps we should add that as a comment?)
> > > >
> > >
> > > Yeah, makes sense.
> >
> > Note that I add a (unrelated) comment related to REBAR_CAP in this patch:
> > https://lore.kernel.org/linux-pci/20240307111520.3303774-1-cassel@kernel.org/T/#u
> >
> > But once we move/add code to dw_pcie_ep_init_non_sticky_registers(), I think
> > that it might be a good "rule" to have a small comment for each write in
> > dw_pcie_ep_init_non_sticky_registers() which explains why the code should be
> > in dw_pcie_ep_init_non_sticky_registers() instead of dw_pcie_ep_init_registers(),
> > even if it just a small:
> >
> > /* Field PCI_XXX_YYY.ZZZ is non-sticky */
> > writel_dbi(pci, offset + PCI_XXX_YYY, 0);
> >
>
> Why? The function name itself suggests that we are reinitializing non-sticky
> registers. So a comment for each write is overkill.
So that you know which field it is in the register that you are writing which
you care about (which field it is that is non-sticky).
But I see your point, perhaps it is overkill.
Kind regards,
Niklas
next prev parent reply other threads:[~2024-03-08 10:15 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-04 9:22 [PATCH v9 00/10] PCI: dwc: ep: Fix DBI access failure for drivers requiring refclk from host Manivannan Sadhasivam
2024-03-04 9:22 ` [PATCH v9 01/10] PCI: dwc: ep: Remove deinit() callback from struct dw_pcie_ep_ops Manivannan Sadhasivam
2024-03-07 19:52 ` Niklas Cassel
2024-03-08 11:17 ` Yoshihiro Shimoda
2024-03-04 9:22 ` [PATCH v9 02/10] PCI: dwc: ep: Rename dw_pcie_ep_exit() to dw_pcie_ep_deinit() Manivannan Sadhasivam
2024-03-07 19:52 ` Niklas Cassel
2024-03-08 11:18 ` Yoshihiro Shimoda
2024-03-04 9:22 ` [PATCH v9 03/10] PCI: dwc: ep: Introduce dw_pcie_ep_cleanup() API for drivers supporting PERST# Manivannan Sadhasivam
2024-03-07 20:14 ` Niklas Cassel
2024-03-04 9:22 ` [PATCH v9 04/10] PCI: dwc: ep: Fix DBI access failure for drivers requiring refclk from host Manivannan Sadhasivam
2024-03-07 20:31 ` Niklas Cassel
2024-03-08 5:34 ` Manivannan Sadhasivam
2024-03-04 9:22 ` [PATCH v9 05/10] PCI: dwc: ep: Rename dw_pcie_ep_init_complete() to dw_pcie_ep_init_registers() Manivannan Sadhasivam
2024-03-07 20:32 ` Niklas Cassel
2024-03-04 9:22 ` [PATCH v9 06/10] PCI: dwc: ep: Call dw_pcie_ep_init_registers() API directly from all glue drivers Manivannan Sadhasivam
2024-03-07 20:36 ` Niklas Cassel
2024-03-08 5:36 ` Manivannan Sadhasivam
2024-03-08 9:05 ` Niklas Cassel
2024-03-08 9:49 ` Manivannan Sadhasivam
2024-03-08 10:22 ` Niklas Cassel
2024-03-14 7:22 ` Manivannan Sadhasivam
2024-03-08 11:22 ` Yoshihiro Shimoda
2024-03-04 9:22 ` [PATCH v9 07/10] PCI: dwc: ep: Remove "core_init_notifier" flag Manivannan Sadhasivam
2024-03-07 21:09 ` Niklas Cassel
2024-03-08 5:38 ` Manivannan Sadhasivam
2024-03-08 8:48 ` Niklas Cassel
2024-03-08 9:44 ` Manivannan Sadhasivam
2024-03-08 13:24 ` Niklas Cassel
2024-03-11 14:45 ` Manivannan Sadhasivam
2024-03-11 21:54 ` Niklas Cassel
2024-03-13 17:53 ` Manivannan Sadhasivam
2024-03-04 9:22 ` [PATCH v9 08/10] PCI: dwc: ep: Add a generic dw_pcie_ep_linkdown() API to handle LINK_DOWN event Manivannan Sadhasivam
2024-03-07 21:43 ` Niklas Cassel
2024-03-08 5:41 ` Manivannan Sadhasivam
2024-03-08 8:56 ` Niklas Cassel
2024-03-08 9:46 ` Manivannan Sadhasivam
2024-03-08 10:14 ` Niklas Cassel [this message]
2024-03-04 9:22 ` [PATCH v9 09/10] PCI: qcom-ep: Use the " Manivannan Sadhasivam
2024-03-07 21:43 ` Niklas Cassel
2024-03-04 9:22 ` [PATCH v9 10/10] PCI: dwc: ep: Add Kernel-doc comments for APIs Manivannan Sadhasivam
2024-03-07 21:58 ` Niklas Cassel
2024-03-08 5:43 ` 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=ZerlG5W-hUFIYY8b@ryzen \
--to=cassel@kernel.org \
--cc=bhelgaas@google.com \
--cc=festevam@gmail.com \
--cc=gustavo.pimentel@synopsys.com \
--cc=hayashi.kunihiko@socionext.com \
--cc=hongxing.zhu@nxp.com \
--cc=jesper.nilsson@axis.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@axis.com \
--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=manivannan.sadhasivam@linaro.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=srikanth.thokala@intel.com \
--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 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).