|
@@ -280,9 +280,9 @@ int dw_pcie_host_init(struct pcie_port *pp)
|
|
struct device_node *np = dev->of_node;
|
|
struct device_node *np = dev->of_node;
|
|
struct platform_device *pdev = to_platform_device(dev);
|
|
struct platform_device *pdev = to_platform_device(dev);
|
|
struct pci_bus *bus, *child;
|
|
struct pci_bus *bus, *child;
|
|
|
|
+ struct pci_host_bridge *bridge;
|
|
struct resource *cfg_res;
|
|
struct resource *cfg_res;
|
|
int i, ret;
|
|
int i, ret;
|
|
- LIST_HEAD(res);
|
|
|
|
struct resource_entry *win, *tmp;
|
|
struct resource_entry *win, *tmp;
|
|
|
|
|
|
cfg_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "config");
|
|
cfg_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "config");
|
|
@@ -295,16 +295,21 @@ int dw_pcie_host_init(struct pcie_port *pp)
|
|
dev_err(dev, "missing *config* reg space\n");
|
|
dev_err(dev, "missing *config* reg space\n");
|
|
}
|
|
}
|
|
|
|
|
|
- ret = of_pci_get_host_bridge_resources(np, 0, 0xff, &res, &pp->io_base);
|
|
|
|
|
|
+ bridge = pci_alloc_host_bridge(0);
|
|
|
|
+ if (!bridge)
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+
|
|
|
|
+ ret = of_pci_get_host_bridge_resources(np, 0, 0xff,
|
|
|
|
+ &bridge->windows, &pp->io_base);
|
|
if (ret)
|
|
if (ret)
|
|
return ret;
|
|
return ret;
|
|
|
|
|
|
- ret = devm_request_pci_bus_resources(dev, &res);
|
|
|
|
|
|
+ ret = devm_request_pci_bus_resources(dev, &bridge->windows);
|
|
if (ret)
|
|
if (ret)
|
|
goto error;
|
|
goto error;
|
|
|
|
|
|
/* Get the I/O and memory ranges from DT */
|
|
/* Get the I/O and memory ranges from DT */
|
|
- resource_list_for_each_entry_safe(win, tmp, &res) {
|
|
|
|
|
|
+ resource_list_for_each_entry_safe(win, tmp, &bridge->windows) {
|
|
switch (resource_type(win->res)) {
|
|
switch (resource_type(win->res)) {
|
|
case IORESOURCE_IO:
|
|
case IORESOURCE_IO:
|
|
ret = pci_remap_iospace(win->res, pp->io_base);
|
|
ret = pci_remap_iospace(win->res, pp->io_base);
|
|
@@ -400,19 +405,22 @@ int dw_pcie_host_init(struct pcie_port *pp)
|
|
pp->ops->host_init(pp);
|
|
pp->ops->host_init(pp);
|
|
|
|
|
|
pp->root_bus_nr = pp->busn->start;
|
|
pp->root_bus_nr = pp->busn->start;
|
|
|
|
+
|
|
|
|
+ bridge->dev.parent = dev;
|
|
|
|
+ bridge->sysdata = pp;
|
|
|
|
+ bridge->busnr = pp->root_bus_nr;
|
|
|
|
+ bridge->ops = &dw_pcie_ops;
|
|
if (IS_ENABLED(CONFIG_PCI_MSI)) {
|
|
if (IS_ENABLED(CONFIG_PCI_MSI)) {
|
|
- bus = pci_scan_root_bus_msi(dev, pp->root_bus_nr,
|
|
|
|
- &dw_pcie_ops, pp, &res,
|
|
|
|
- &dw_pcie_msi_chip);
|
|
|
|
|
|
+ bridge->msi = &dw_pcie_msi_chip;
|
|
dw_pcie_msi_chip.dev = dev;
|
|
dw_pcie_msi_chip.dev = dev;
|
|
- } else
|
|
|
|
- bus = pci_scan_root_bus(dev, pp->root_bus_nr, &dw_pcie_ops,
|
|
|
|
- pp, &res);
|
|
|
|
- if (!bus) {
|
|
|
|
- ret = -ENOMEM;
|
|
|
|
- goto error;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ ret = pci_scan_root_bus_bridge(bridge);
|
|
|
|
+ if (ret)
|
|
|
|
+ goto error;
|
|
|
|
+
|
|
|
|
+ bus = bridge->bus;
|
|
|
|
+
|
|
if (pp->ops->scan_bus)
|
|
if (pp->ops->scan_bus)
|
|
pp->ops->scan_bus(pp);
|
|
pp->ops->scan_bus(pp);
|
|
|
|
|
|
@@ -431,7 +439,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
error:
|
|
error:
|
|
- pci_free_resource_list(&res);
|
|
|
|
|
|
+ pci_free_host_bridge(bridge);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|