[PATCH v5 3/7] PCI: mediatek-gen3: Move controller setup steps before PERST# control
Chen-Yu Tsai
wenst at chromium.org
Wed Mar 11 00:52:18 PDT 2026
Setting up the translation windows and enabling MSI involve only
configuring the controller, not the device. These can be done before the
device is enabled.
Move these steps before the existing PERST# control. This provides a
cleaner separation of controller vs device setup. This also allows the
later patches that split out PERST# control and add device power
control to have cleaner teardown.
This change only moves code. No functional change is expected.
Suggested-by: Bjorn Helgaas <helgaas at kernel.org>
Link: https://lore.kernel.org/all/20260309215056.GA603013@bhelgaas/
Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v3:
- New patch
---
drivers/pci/controller/pcie-mediatek-gen3.c | 50 ++++++++++-----------
1 file changed, 25 insertions(+), 25 deletions(-)
diff --git a/drivers/pci/controller/pcie-mediatek-gen3.c b/drivers/pci/controller/pcie-mediatek-gen3.c
index 04ae195d36c2..1b6290f2c360 100644
--- a/drivers/pci/controller/pcie-mediatek-gen3.c
+++ b/drivers/pci/controller/pcie-mediatek-gen3.c
@@ -464,6 +464,31 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
val |= PCIE_DISABLE_DVFSRC_VLT_REQ;
writel_relaxed(val, pcie->base + PCIE_MISC_CTRL_REG);
+ mtk_pcie_enable_msi(pcie);
+
+ /* Set PCIe translation windows */
+ resource_list_for_each_entry(entry, &host->windows) {
+ struct resource *res = entry->res;
+ unsigned long type = resource_type(res);
+ resource_size_t cpu_addr;
+ resource_size_t pci_addr;
+ resource_size_t size;
+
+ if (type == IORESOURCE_IO)
+ cpu_addr = pci_pio_to_address(res->start);
+ else if (type == IORESOURCE_MEM)
+ cpu_addr = res->start;
+ else
+ continue;
+
+ pci_addr = res->start - entry->offset;
+ size = resource_size(res);
+ err = mtk_pcie_set_trans_table(pcie, cpu_addr, pci_addr, size,
+ type, &table_index);
+ if (err)
+ return err;
+ }
+
/*
* Airoha EN7581 has a hw bug asserting/releasing PCIE_PE_RSTB signal
* causing occasional PCIe link down. In order to overcome the issue,
@@ -510,31 +535,6 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
return err;
}
- mtk_pcie_enable_msi(pcie);
-
- /* Set PCIe translation windows */
- resource_list_for_each_entry(entry, &host->windows) {
- struct resource *res = entry->res;
- unsigned long type = resource_type(res);
- resource_size_t cpu_addr;
- resource_size_t pci_addr;
- resource_size_t size;
-
- if (type == IORESOURCE_IO)
- cpu_addr = pci_pio_to_address(res->start);
- else if (type == IORESOURCE_MEM)
- cpu_addr = res->start;
- else
- continue;
-
- pci_addr = res->start - entry->offset;
- size = resource_size(res);
- err = mtk_pcie_set_trans_table(pcie, cpu_addr, pci_addr, size,
- type, &table_index);
- if (err)
- return err;
- }
-
return 0;
}
--
2.53.0.473.g4a7958ca14-goog
More information about the Linux-mediatek
mailing list