From: Caleb James DeLisle <cjd@cjdns.fr>
To: sashiko-reviews@lists.linux.dev
Cc: krzk+dt@kernel.org, devicetree@vger.kernel.org,
linux-pci@vger.kernel.org, robh@kernel.org, conor+dt@kernel.org
Subject: Re: [PATCH v6 2/2] PCI: mediatek: Add support for EcoNet EN7528 SoC
Date: Thu, 14 May 2026 14:32:12 +0200 [thread overview]
Message-ID: <e09cabda-93eb-4cbc-b962-c6a55bc8f628@cjdns.fr> (raw)
In-Reply-To: <20260514113514.15297C2BCB3@smtp.kernel.org>
On 14/05/2026 13:35, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 6 potential issue(s) to consider:
> - [High] Use-after-free on probe error path due to missing pci_remove_root_bus().
> - [High] Hardware is exposed to endpoint drivers before link retraining completes, causing MMIO failures.
> - [High] mtk_pcie_retrain() only retrains the first root port, ignoring others.
> - [Medium] Data race and potential use-after-free due to unprotected iteration of the PCI bus list.
> - [Medium] Truncation of 64-bit resource_size_t in fls() causes incorrect AXI window size calculation.
> - [Medium] Silent feature degradation when the driver is compiled as a loadable module.
> --
>
> commit 940197600e9e8eb5cb8f108830edfaee6eeb6d16
> Author: Caleb James DeLisle <cjd@cjdns.fr>
>
> PCI: mediatek: Add support for EcoNet EN7528 SoC
>
> This commit adds support for the PCIe controller on the EcoNet EN7528 and
> EN751221 SoCs. It includes logic to re-train Gen2 capable ports that
> initially start at Gen1 speeds.
>
>> diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
>> --- a/drivers/pci/controller/pcie-mediatek.c
>> +++ b/drivers/pci/controller/pcie-mediatek.c
> [ ... ]
>> @@ -753,6 +764,132 @@ static int mtk_pcie_startup_port_v2(struct mtk_pcie_port *port)
>> return 0;
>> }
>>
>> +static int mtk_pcie_startup_port_en7528(struct mtk_pcie_port *port)
>> +{
> [ ... ]
>> + if (IS_ENABLED(CONFIG_PCI_MSI))
>> + mtk_pcie_enable_msi(port);
>> +
>> + /* Set AHB to PCIe translation windows */
>> + val = lower_32_bits(mem->start) |
>> + AHB2PCIE_SIZE(fls(resource_size(mem)));
> Does passing resource_size(mem) to fls() risk truncating 64-bit values?
> Since resource_size_t can be a 64-bit integer and fls() expects a 32-bit
> unsigned int, an exact 4GB window (0x100000000) or larger could truncate
> to 0, leading to an incorrect translation window size. Should this use
> fls64() instead?
32 bit machine so I don't think that's worth worrying about.
>
>> + writel(val, port->base + PCIE_AHB_TRANS_BASE0_L);
> [ ... ]
>> +static int mtk_pcie_retrain(struct device *dev, struct pci_host_bridge *host)
>> +{
>> + struct pci_dev *rp;
>> + int ret = -ENOENT;
>> + u16 lnksta = 0;
>> + u32 speed;
>> +
>> + for_each_pci_bridge(rp, host->bus) {
>> + if (pci_pcie_type(rp) == PCI_EXP_TYPE_ROOT_PORT)
>> + goto found_port;
>> + }
> By jumping to found_port immediately upon finding the first root port, does
> this skip retraining for any subsequent ports (like RC1 on the EN7528)? The
> commit message mentions it is most convenient to re-train every port after
> startup.
Only one root port per host bridge.
>
> Also, is it safe to iterate host->bus->devices via for_each_pci_bridge()
> and use the rp device pointer without holding down_read(&pci_bus_sem) or
> taking a reference via pci_dev_get()? Since this function runs after
> pci_host_probe() finishes, could the device list change concurrently?
That I don't know, but I tend to think it's okay because mtk_pcie_probe
has not finished.
>
>> +
>> + /* Should not happen */
>> + return dev_err_probe(dev, ret, "root bridge not found\n");
>> +
>> +found_port:
>> + if (!IS_BUILTIN(CONFIG_PCIE_MEDIATEK)) {
>> + /* Let it go because the device will work as Gen1 */
>> + dev_warn(dev, "module must be built-in to retrain to Gen2\n");
>> + return 0;
>> + }
>> +
>> +#if IS_BUILTIN(CONFIG_PCIE_MEDIATEK)
>> + ret = pcie_retrain_link(rp, true);
>> +#endif
> If the driver is built as a loadable module, this skips link retraining and
> silently leaves the hardware operating at Gen1 speeds. Is there a way to
> achieve consistent hardware capabilities regardless of the build
> configuration without relying on IS_BUILTIN checks?
If statement a few lines above.
>
>> +
>> + if (ret)
>> + return dev_err_probe(dev, ret, "failed to retrain port\n");
> [ ... ]
>> @@ -1149,6 +1286,11 @@ static int mtk_pcie_probe(struct platform_device *pdev)
>> err = pci_host_probe(host);
>> if (err)
>> goto put_resources;
>>
>> + if (pcie->soc->quirks & MTK_PCIE_RETRAIN)
>> + err = mtk_pcie_retrain(dev, host);
>> + if (err)
>> + goto put_resources;
>> +
>> return 0;
>>
>> put_resources:
> Since mtk_pcie_retrain() is called after pci_host_probe() returns, are the
> devices exposed to endpoint drivers before the link retraining completes?
Practically speaking, no. Theoretically speaking I'm not sure.
> If endpoint drivers are actively probing and communicating with the hardware
> via MMIO while the link is forced into the Recovery state, could this cause
> transactions to fail or timeout?
>
> Additionally, if mtk_pcie_retrain() fails, the code jumps to put_resources
> and returns an error. This causes devres to free the host bridge memory.
> However, since pci_host_probe() already fully registered the PCI root bus
> and its child devices, does this error path leave dangling references in the
> PCI subsystem by failing to call pci_stop_root_bus() and
> pci_remove_root_bus() before freeing resources?
That's a bug, I think the best thing to do is continue because it's
possible that the port will work anyway as Gen1. I'll update accordingly.
Thanks,
Caleb
prev parent reply other threads:[~2026-05-14 12:32 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-13 19:16 [PATCH v6 0/2] Add EcoNet EN7528 (and EN751221) PCIe support Caleb James DeLisle
2026-05-13 19:16 ` [PATCH v6 1/2] dt-bindings: PCI: mediatek: Add support for EcoNet EN7528 Caleb James DeLisle
2026-05-14 10:39 ` sashiko-bot
2026-05-13 19:16 ` [PATCH v6 2/2] PCI: mediatek: Add support for EcoNet EN7528 SoC Caleb James DeLisle
2026-05-13 21:07 ` Bjorn Helgaas
2026-05-13 21:39 ` Caleb James DeLisle
2026-05-13 22:06 ` Bjorn Helgaas
2026-05-13 22:17 ` Caleb James DeLisle
2026-05-14 11:35 ` sashiko-bot
2026-05-14 12:32 ` Caleb James DeLisle [this message]
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=e09cabda-93eb-4cbc-b962-c6a55bc8f628@cjdns.fr \
--to=cjd@cjdns.fr \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=robh@kernel.org \
--cc=sashiko-reviews@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox