All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Hans Zhang" <18255117159@163.com>
Cc: linux-pci@vger.kernel.org
Subject: Re: [PATCH] PCI: cadence: Use cdns_pcie_find_capability() to get PCIe Cap offset in host driver
Date: Sun, 03 May 2026 16:52:42 +0000	[thread overview]
Message-ID: <20260503165243.4A676C2BCB4@smtp.kernel.org> (raw)
In-Reply-To: <20260503161913.77878-1-18255117159@163.com>

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Critical] cdns_pcie_find_capability() searches the wrong register space in Host mode and its return value is not validated, leading to Root Port configuration space corruption.
--

commit 09b3c64b8f5892eb365acd13030a8067652a15e8
Author: Hans Zhang <18255117159@163.com>

PCI: cadence: Use cdns_pcie_find_capability() to get PCIe Cap offset in host driver

This commit replaces the hardcoded CDNS_PCIE_RP_CAP_OFFSET with a dynamic
lookup using cdns_pcie_find_capability() in Cadence PCIe host-related
functions. The goal is to ensure correct operation across various SoC designs
where the capability might not reside at offset 0xC0.

> diff --git a/drivers/pci/controller/cadence/pcie-cadence-host-common.c b/drivers/pci/controller/cadence/pcie-cadence-host-common.c
> index 2b0211870f02..5013d3fe23b5 100644
> --- a/drivers/pci/controller/cadence/pcie-cadence-host-common.c
> +++ b/drivers/pci/controller/cadence/pcie-cadence-host-common.c
> @@ -26,14 +26,14 @@ EXPORT_SYMBOL_GPL(bar_max_size);
>  
>  int cdns_pcie_host_training_complete(struct cdns_pcie *pcie)
>  {
> -	u32 pcie_cap_off = CDNS_PCIE_RP_CAP_OFFSET;
>  	unsigned long end_jiffies;
>  	u16 lnk_stat;
> +	u8 cap = cdns_pcie_find_capability(pcie, PCI_CAP_ID_EXP);

Does this capability search scan the correct register space when operating in
host mode?

Looking at the helper function, it uses cdns_pcie_read_cfg() which reads
directly from the base address without the Root Port offset:

drivers/pci/controller/cadence/pcie-cadence.c:cdns_pcie_find_capability() {
    return PCI_FIND_NEXT_CAP(cdns_pcie_read_cfg, PCI_CAPABILITY_LIST,
                             cap, NULL, pcie);
}

However, the Root Port configuration registers are physically located at
pcie->reg_base + CDNS_PCIE_RP_BASE. Could this cause the search to scan the
Local Management register space instead, failing to find PCI_CAP_ID_EXP
and returning 0?

[ ... ]

> @@ -68,27 +68,26 @@ EXPORT_SYMBOL_GPL(cdns_pcie_host_wait_for_link);
>  int cdns_pcie_retrain(struct cdns_pcie *pcie,
>  		      cdns_pcie_linkup_func pcie_link_up)
>  {
> -	u32 lnk_cap_sls, pcie_cap_off = CDNS_PCIE_RP_CAP_OFFSET;
> +	u32 lnk_cap_sls;
>  	u16 lnk_stat, lnk_ctl;
>  	int ret = 0;
> +	u8 cap = cdns_pcie_find_capability(pcie, PCI_CAP_ID_EXP);
>  
>  	/*
>  	 * Set retrain bit if current speed is 2.5 GB/s,
>  	 * but the PCIe root port support is > 2.5 GB/s.
>  	 */
>  
> -	lnk_cap_sls = cdns_pcie_readl(pcie, (CDNS_PCIE_RP_BASE + pcie_cap_off +
> +	lnk_cap_sls = cdns_pcie_readl(pcie, (CDNS_PCIE_RP_BASE + cap +
>  					     PCI_EXP_LNKCAP));

If the capability is not found and cap evaluates to 0, is it safe to proceed
without validating the return value?

Since the fallback value would be 0, evaluating cap + PCI_EXP_LNKCAP will
result in an offset of 0x0C.

[ ... ]

> diff --git a/drivers/pci/controller/cadence/pcie-cadence-host.c b/drivers/pci/controller/cadence/pcie-cadence-host.c
> index 0bc9e6e90e0e..2a3fd41c1cf4 100644
> --- a/drivers/pci/controller/cadence/pcie-cadence-host.c
> +++ b/drivers/pci/controller/cadence/pcie-cadence-host.c
> @@ -147,12 +148,12 @@ static int cdns_pcie_host_init_root_port(struct cdns_pcie_rc *rc)
>  	cdns_pcie_rp_writeb(pcie, PCI_CLASS_PROG, 0);
>  	cdns_pcie_rp_writew(pcie, PCI_CLASS_DEVICE, PCI_CLASS_BRIDGE_PCI);
>  
> -	value = cdns_pcie_rp_readl(pcie, CDNS_PCIE_RP_CAP_OFFSET + PCI_EXP_LNKCAP);
> +	value = cdns_pcie_rp_readl(pcie, cap + PCI_EXP_LNKCAP);
>  	if (rc->quirk_broken_aspm_l0s)
>  		value &= ~PCI_EXP_LNKCAP_ASPM_L0S;
>  	if (rc->quirk_broken_aspm_l1)
>  		value &= ~PCI_EXP_LNKCAP_ASPM_L1;
> -	cdns_pcie_rp_writel(pcie, CDNS_PCIE_RP_CAP_OFFSET + PCI_EXP_LNKCAP, value);
> +	cdns_pcie_rp_writel(pcie, cap + PCI_EXP_LNKCAP, value);

Will this overwrite the wrong configuration registers if cap is 0?

The cdns_pcie_rp_writel() function automatically adds CDNS_PCIE_RP_BASE to
the destination offset. If cap is 0, writing to cap + PCI_EXP_LNKCAP will
access offset 0x0C.

Could this regression unintentionally clobber the standard Type 1 PCI header
registers, such as the Cache Line Size and Latency Timer, and corrupt the
Root Port hardware state?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260503161913.77878-1-18255117159@163.com?part=1

  reply	other threads:[~2026-05-03 16:52 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-03 16:19 [PATCH] PCI: cadence: Use cdns_pcie_find_capability() to get PCIe Cap offset in host driver Hans Zhang
2026-05-03 16:52 ` sashiko-bot [this message]
2026-05-04  8:22   ` Hans Zhang
2026-05-05 21:23     ` Bjorn Helgaas
2026-05-06 16:04       ` Hans Zhang
2026-05-06 17:12         ` Bjorn Helgaas
2026-05-07  3:31           ` Hans Zhang
2026-05-07  3:48             ` Hans Zhang
2026-05-07 12:31               ` Aksh Garg
2026-05-07 15:21                 ` Hans Zhang
2026-05-07 15:32                   ` Bjorn Helgaas

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=20260503165243.4A676C2BCB4@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=18255117159@163.com \
    --cc=linux-pci@vger.kernel.org \
    --cc=sashiko@lists.linux.dev \
    /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.