Skip to content

Commit bac406c

Browse files
Daire McNamaraLorenzo Pieralisi
authored andcommitted
PCI: microchip: Re-partition code between probe() and init()
Continuing to use pci_host_common_probe() for the PCIe Root Complex on PolarFire SoC is leading to an extremely large _init() function and some unnatural code flow. Re-partition the code so that some tasks are done in a _probe() routine, which calls pci_host_common_probe() and then use a much smaller _init() function, mainly to enable interrupts after address translation tables are set up. Link: https://lore.kernel.org/r/20230728131401.1615724-8-daire.mcnamara@microchip.com Signed-off-by: Daire McNamara <daire.mcnamara@microchip.com> Signed-off-by: Lorenzo Pieralisi <lpieralisi@kernel.org> Reviewed-by: Conor Dooley <conor.dooley@microchip.com>
1 parent 1abb722 commit bac406c

File tree

1 file changed

+38
-20
lines changed

1 file changed

+38
-20
lines changed

drivers/pci/controller/pcie-microchip-host.c

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,8 @@ static struct {
384384

385385
static char poss_clks[][5] = { "fic0", "fic1", "fic2", "fic3" };
386386

387+
static struct mc_pcie *port;
388+
387389
static void mc_pcie_enable_msi(struct mc_pcie *port, void __iomem *ecam)
388390
{
389391
struct mc_msi *msi = &port->msi;
@@ -1104,21 +1106,43 @@ static int mc_platform_init(struct pci_config_window *cfg)
11041106
{
11051107
struct device *dev = cfg->parent;
11061108
struct platform_device *pdev = to_platform_device(dev);
1107-
struct mc_pcie *port;
1109+
void __iomem *bridge_base_addr =
1110+
port->axi_base_addr + MC_PCIE_BRIDGE_ADDR;
1111+
int ret;
1112+
1113+
/* Configure address translation table 0 for PCIe config space */
1114+
mc_pcie_setup_window(bridge_base_addr, 0, cfg->res.start,
1115+
cfg->res.start,
1116+
resource_size(&cfg->res));
1117+
1118+
/* Need some fixups in config space */
1119+
mc_pcie_enable_msi(port, cfg->win);
1120+
1121+
/* Configure non-config space outbound ranges */
1122+
ret = mc_pcie_setup_windows(pdev, port);
1123+
if (ret)
1124+
return ret;
1125+
1126+
/* Address translation is up; safe to enable interrupts */
1127+
ret = mc_init_interrupts(pdev, port);
1128+
if (ret)
1129+
return ret;
1130+
1131+
return 0;
1132+
}
1133+
1134+
static int mc_host_probe(struct platform_device *pdev)
1135+
{
1136+
struct device *dev = &pdev->dev;
11081137
void __iomem *bridge_base_addr;
11091138
int ret;
11101139
u32 val;
11111140

11121141
port = devm_kzalloc(dev, sizeof(*port), GFP_KERNEL);
11131142
if (!port)
11141143
return -ENOMEM;
1115-
port->dev = dev;
11161144

1117-
ret = mc_pcie_init_clks(dev);
1118-
if (ret) {
1119-
dev_err(dev, "failed to get clock resources, error %d\n", ret);
1120-
return -ENODEV;
1121-
}
1145+
port->dev = dev;
11221146

11231147
port->axi_base_addr = devm_platform_ioremap_resource(pdev, 1);
11241148
if (IS_ERR(port->axi_base_addr))
@@ -1133,9 +1157,6 @@ static int mc_platform_init(struct pci_config_window *cfg)
11331157
val &= ~MSIX_CAP_MASK;
11341158
writel(val, bridge_base_addr + PCIE_PCI_IRQ_DW0);
11351159

1136-
/* Hardware doesn't setup MSI by default */
1137-
mc_pcie_enable_msi(port, cfg->win);
1138-
11391160
/* Pick num vectors from bitfile programmed onto FPGA fabric */
11401161
val = readl(bridge_base_addr + PCIE_PCI_IRQ_DW0);
11411162
val &= NUM_MSI_MSGS_MASK;
@@ -1146,16 +1167,13 @@ static int mc_platform_init(struct pci_config_window *cfg)
11461167
/* Pick vector address from design */
11471168
port->msi.vector_phy = readl_relaxed(bridge_base_addr + IMSI_ADDR);
11481169

1149-
/* Configure Address Translation Table 0 for PCIe config space */
1150-
mc_pcie_setup_window(bridge_base_addr, 0, cfg->res.start & 0xffffffff,
1151-
cfg->res.start, resource_size(&cfg->res));
1152-
1153-
ret = mc_pcie_setup_windows(pdev, port);
1154-
if (ret)
1155-
return ret;
1170+
ret = mc_pcie_init_clks(dev);
1171+
if (ret) {
1172+
dev_err(dev, "failed to get clock resources, error %d\n", ret);
1173+
return -ENODEV;
1174+
}
11561175

1157-
/* Address translation is up; safe to enable interrupts */
1158-
return mc_init_interrupts(pdev, port);
1176+
return pci_host_common_probe(pdev);
11591177
}
11601178

11611179
static const struct pci_ecam_ops mc_ecam_ops = {
@@ -1178,7 +1196,7 @@ static const struct of_device_id mc_pcie_of_match[] = {
11781196
MODULE_DEVICE_TABLE(of, mc_pcie_of_match);
11791197

11801198
static struct platform_driver mc_pcie_driver = {
1181-
.probe = pci_host_common_probe,
1199+
.probe = mc_host_probe,
11821200
.driver = {
11831201
.name = "microchip-pcie",
11841202
.of_match_table = mc_pcie_of_match,

0 commit comments

Comments
 (0)