Commit eff0306b authored by Manivannan Sadhasivam's avatar Manivannan Sadhasivam Committed by Manivannan Sadhasivam
Browse files

PCI: meson: Fix parsing the DBI register region



First of all, the driver was parsing the 'dbi' register region as 'elbi'.
This was due to DT mistakenly passing 'dbi' as 'elbi'. Since the DT is
now fixed to supply 'dbi' region, this driver can rely on the DWC core
driver to parse and map it.

However, to support the old DTs, if the 'elbi' region is found in DT, parse
and map the region as both 'dw_pcie::elbi_base' as 'dw_pcie::dbi_base'.
This will allow the driver to work with both broken and fixed DTs.

Also, skip parsing the 'elbi' region in DWC core if 'pci->elbi_base' was
already populated.

Fixes: 9c0ef6d3 ("PCI: amlogic: Add the Amlogic Meson PCIe controller driver")
Fixes: c96992a2 ("PCI: dwc: Add support for ELBI resource mapping")
Reported-by: default avatarLinnaea Lavia <linnaea-von-lavia@live.com>
Closes: https://lore.kernel.org/linux-pci/DM4PR05MB102707B8CDF84D776C39F22F2C7F0A@DM4PR05MB10270.namprd05.prod.outlook.com/


Signed-off-by: default avatarManivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com>
Signed-off-by: default avatarManivannan Sadhasivam <mani@kernel.org>
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on Bananapi-M2S
Reviewed-by: default avatarNeil Armstrong <neil.armstrong@linaro.org>
Cc: stable@vger.kernel.org # 6.2
Link: https://patch.msgid.link/20251101-pci-meson-fix-v1-3-c50dcc56ed6a@oss.qualcomm.com
parent 4813dea9
Loading
Loading
Loading
Loading
+15 −3
Original line number Diff line number Diff line
@@ -108,10 +108,22 @@ static int meson_pcie_get_mems(struct platform_device *pdev,
			       struct meson_pcie *mp)
{
	struct dw_pcie *pci = &mp->pci;
	struct resource *res;

	pci->dbi_base = devm_platform_ioremap_resource_byname(pdev, "elbi");
	if (IS_ERR(pci->dbi_base))
		return PTR_ERR(pci->dbi_base);
	/*
	 * For the broken DTs that supply 'dbi' as 'elbi', parse the 'elbi'
	 * region and assign it to both 'pci->elbi_base' and 'pci->dbi_space' so
	 * that the DWC core can skip parsing both regions.
	 */
	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "elbi");
	if (res) {
		pci->elbi_base = devm_pci_remap_cfg_resource(pci->dev, res);
		if (IS_ERR(pci->elbi_base))
			return PTR_ERR(pci->elbi_base);

		pci->dbi_base = pci->elbi_base;
		pci->dbi_phys_addr = res->start;
	}

	mp->cfg_base = devm_platform_ioremap_resource_byname(pdev, "cfg");
	if (IS_ERR(mp->cfg_base))
+7 −5
Original line number Diff line number Diff line
@@ -168,12 +168,14 @@ int dw_pcie_get_resources(struct dw_pcie *pci)
	}

	/* ELBI is an optional resource */
	if (!pci->elbi_base) {
		res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "elbi");
		if (res) {
			pci->elbi_base = devm_ioremap_resource(pci->dev, res);
			if (IS_ERR(pci->elbi_base))
				return PTR_ERR(pci->elbi_base);
		}
	}

	/* LLDD is supposed to manually switch the clocks and resets state */
	if (dw_pcie_cap_is(pci, REQ_RES)) {