hc
2024-05-10 cde9070d9970eef1f7ec2360586c802a16230ad8
kernel/drivers/pci/controller/pci-versatile.c
....@@ -62,77 +62,25 @@
6262 .write = pci_generic_config_write,
6363 };
6464
65
-static int versatile_pci_parse_request_of_pci_ranges(struct device *dev,
66
- struct list_head *res)
67
-{
68
- int err, mem = 1, res_valid = 0;
69
- resource_size_t iobase;
70
- struct resource_entry *win, *tmp;
71
-
72
- err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, res, &iobase);
73
- if (err)
74
- return err;
75
-
76
- err = devm_request_pci_bus_resources(dev, res);
77
- if (err)
78
- goto out_release_res;
79
-
80
- resource_list_for_each_entry_safe(win, tmp, res) {
81
- struct resource *res = win->res;
82
-
83
- switch (resource_type(res)) {
84
- case IORESOURCE_IO:
85
- err = devm_pci_remap_iospace(dev, res, iobase);
86
- if (err) {
87
- dev_warn(dev, "error %d: failed to map resource %pR\n",
88
- err, res);
89
- resource_list_destroy_entry(win);
90
- }
91
- break;
92
- case IORESOURCE_MEM:
93
- res_valid |= !(res->flags & IORESOURCE_PREFETCH);
94
-
95
- writel(res->start >> 28, PCI_IMAP(mem));
96
- writel(PHYS_OFFSET >> 28, PCI_SMAP(mem));
97
- mem++;
98
-
99
- break;
100
- }
101
- }
102
-
103
- if (res_valid)
104
- return 0;
105
-
106
- dev_err(dev, "non-prefetchable memory resource required\n");
107
- err = -EINVAL;
108
-
109
-out_release_res:
110
- pci_free_resource_list(res);
111
- return err;
112
-}
113
-
11465 static int versatile_pci_probe(struct platform_device *pdev)
11566 {
11667 struct device *dev = &pdev->dev;
11768 struct resource *res;
118
- int ret, i, myslot = -1;
69
+ struct resource_entry *entry;
70
+ int i, myslot = -1, mem = 1;
11971 u32 val;
12072 void __iomem *local_pci_cfg_base;
121
- struct pci_bus *bus, *child;
12273 struct pci_host_bridge *bridge;
123
- LIST_HEAD(pci_res);
12474
12575 bridge = devm_pci_alloc_host_bridge(dev, 0);
12676 if (!bridge)
12777 return -ENOMEM;
12878
129
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
130
- versatile_pci_base = devm_ioremap_resource(dev, res);
79
+ versatile_pci_base = devm_platform_ioremap_resource(pdev, 0);
13180 if (IS_ERR(versatile_pci_base))
13281 return PTR_ERR(versatile_pci_base);
13382
134
- res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
135
- versatile_cfg_base[0] = devm_ioremap_resource(dev, res);
83
+ versatile_cfg_base[0] = devm_platform_ioremap_resource(pdev, 1);
13684 if (IS_ERR(versatile_cfg_base[0]))
13785 return PTR_ERR(versatile_cfg_base[0]);
13886
....@@ -141,9 +89,13 @@
14189 if (IS_ERR(versatile_cfg_base[1]))
14290 return PTR_ERR(versatile_cfg_base[1]);
14391
144
- ret = versatile_pci_parse_request_of_pci_ranges(dev, &pci_res);
145
- if (ret)
146
- return ret;
92
+ resource_list_for_each_entry(entry, &bridge->windows) {
93
+ if (resource_type(entry->res) == IORESOURCE_MEM) {
94
+ writel(entry->res->start >> 28, PCI_IMAP(mem));
95
+ writel(__pa(PAGE_OFFSET) >> 28, PCI_SMAP(mem));
96
+ mem++;
97
+ }
98
+ }
14799
148100 /*
149101 * We need to discover the PCI core first to configure itself
....@@ -177,9 +129,9 @@
177129 /*
178130 * Configure the PCI inbound memory windows to be 1:1 mapped to SDRAM
179131 */
180
- writel(PHYS_OFFSET, local_pci_cfg_base + PCI_BASE_ADDRESS_0);
181
- writel(PHYS_OFFSET, local_pci_cfg_base + PCI_BASE_ADDRESS_1);
182
- writel(PHYS_OFFSET, local_pci_cfg_base + PCI_BASE_ADDRESS_2);
132
+ writel(__pa(PAGE_OFFSET), local_pci_cfg_base + PCI_BASE_ADDRESS_0);
133
+ writel(__pa(PAGE_OFFSET), local_pci_cfg_base + PCI_BASE_ADDRESS_1);
134
+ writel(__pa(PAGE_OFFSET), local_pci_cfg_base + PCI_BASE_ADDRESS_2);
183135
184136 /*
185137 * For many years the kernel and QEMU were symbiotically buggy
....@@ -194,29 +146,11 @@
194146 */
195147 writel(0, versatile_cfg_base[0] + PCI_INTERRUPT_LINE);
196148
197
- pci_add_flags(PCI_ENABLE_PROC_DOMAINS);
198149 pci_add_flags(PCI_REASSIGN_ALL_BUS);
199150
200
- list_splice_init(&pci_res, &bridge->windows);
201
- bridge->dev.parent = dev;
202
- bridge->sysdata = NULL;
203
- bridge->busnr = 0;
204151 bridge->ops = &pci_versatile_ops;
205
- bridge->map_irq = of_irq_parse_and_map_pci;
206
- bridge->swizzle_irq = pci_common_swizzle;
207152
208
- ret = pci_scan_root_bus_bridge(bridge);
209
- if (ret < 0)
210
- return ret;
211
-
212
- bus = bridge->bus;
213
-
214
- pci_assign_unassigned_bus_resources(bus);
215
- list_for_each_entry(child, &bus->children, node)
216
- pcie_bus_configure_settings(child);
217
- pci_bus_add_devices(bus);
218
-
219
- return 0;
153
+ return pci_host_probe(bridge);
220154 }
221155
222156 static const struct of_device_id versatile_pci_of_match[] = {