[PATCH 09/15] pci: mediatek: add support for multiple ports in mediatek pcie gen3 driver

Weijie Gao weijie.gao at mediatek.com
Fri Jan 17 10:18:11 CET 2025


One MediaTek PCIe Gen3 controller has only one port, where PCI bus 0
on this port represents the controller itself and bus 1 represents
the external PCIe device.

If multiple PCIe controllers are probed in U-Boot, U-Boot will use
bus numbers greater than 2 as input parameters. Therefore, we should
convert the BDF bus number to either 0 or 1 by subtracting the
offset by controller->seq_.

Signed-off-by: Sam Shih <sam.shih at mediatek.com>
Signed-off-by: Weijie Gao <weijie.gao at mediatek.com>
---
 drivers/pci/pcie_mediatek_gen3.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/drivers/pci/pcie_mediatek_gen3.c b/drivers/pci/pcie_mediatek_gen3.c
index 0149edae0bf..1818d4c1e30 100644
--- a/drivers/pci/pcie_mediatek_gen3.c
+++ b/drivers/pci/pcie_mediatek_gen3.c
@@ -83,6 +83,28 @@ struct mtk_pcie {
 	struct phy phy;
 };
 
+static pci_dev_t convert_bdf(const struct udevice *controller, pci_dev_t bdf)
+{
+	int bdfs[3];
+
+	bdfs[0] = PCI_BUS(bdf);
+	bdfs[1] = PCI_DEV(bdf);
+	bdfs[2] = PCI_FUNC(bdf);
+
+	/*
+	 * One MediaTek PCIe Gen3 controller has only one port, where PCI bus 0 on
+	 * this port represents the controller itself and bus 1 represents the
+	 * external PCIe device. If multiple PCIe controllers are probed in U-Boot,
+	 * U-Boot will use bus numbers greater than 2 as input parameters. Therefore,
+	 * we should convert the BDF bus number to either 0 or 1 by subtracting the
+	 * offset by controller->seq_
+	 */
+
+	bdfs[0] = bdfs[0] - controller->seq_;
+
+	return PCI_BDF(bdfs[0], bdfs[1], bdfs[2]);
+}
+
 static void mtk_pcie_config_tlp_header(const struct udevice *bus,
 				       pci_dev_t devfn,
 				       int where, int size)
@@ -91,6 +113,8 @@ static void mtk_pcie_config_tlp_header(const struct udevice *bus,
 	int bytes;
 	u32 val;
 
+	devfn = convert_bdf(bus, devfn);
+
 	size = 1 << size;
 	bytes = (GENMASK(size - 1, 0) & 0xf) << (where & 0x3);
 
-- 
2.34.1



More information about the U-Boot mailing list