Skip to content

Commit 7bd4c4a

Browse files
committed
Merge branch 'remotes/lorenzo/pci/mmio-dma-ranges'
- Consolidate DT "dma-ranges" parsing and convert all host drivers to use shared parsing (Rob Herring) * remotes/lorenzo/pci/mmio-dma-ranges: PCI: Make devm_of_pci_get_host_bridge_resources() static PCI: rcar: Use inbound resources for setup PCI: iproc: Use inbound resources for setup PCI: xgene: Use inbound resources for setup PCI: v3-semi: Use inbound resources for setup PCI: ftpci100: Use inbound resources for setup PCI: of: Add inbound resource parsing to helpers PCI: versatile: Enable COMPILE_TEST PCI: versatile: Remove usage of PHYS_OFFSET PCI: versatile: Use pci_parse_request_of_pci_ranges() PCI: xilinx-nwl: Use pci_parse_request_of_pci_ranges() PCI: xilinx: Use pci_parse_request_of_pci_ranges() PCI: xgene: Use pci_parse_request_of_pci_ranges() PCI: v3-semi: Use pci_parse_request_of_pci_ranges() PCI: rockchip: Drop storing driver private outbound resource data PCI: rockchip: Use pci_parse_request_of_pci_ranges() PCI: mobiveil: Use pci_parse_request_of_pci_ranges() PCI: mediatek: Use pci_parse_request_of_pci_ranges() PCI: iproc: Use pci_parse_request_of_pci_ranges() PCI: faraday: Use pci_parse_request_of_pci_ranges() PCI: dwc: Use pci_parse_request_of_pci_ranges() PCI: altera: Use pci_parse_request_of_pci_ranges() PCI: aardvark: Use pci_parse_request_of_pci_ranges() PCI: Export pci_parse_request_of_pci_ranges() resource: Add a resource_list_first_type helper # Conflicts: # drivers/pci/controller/pcie-rcar.c
2 parents d8ddab6 + 3b55809 commit 7bd4c4a

23 files changed

+272
-604
lines changed

drivers/pci/controller/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ config PCI_V3_SEMI
107107

108108
config PCI_VERSATILE
109109
bool "ARM Versatile PB PCI controller"
110-
depends on ARCH_VERSATILE
110+
depends on ARCH_VERSATILE || COMPILE_TEST
111111

112112
config PCIE_IPROC
113113
tristate

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ static int cdns_pcie_host_init(struct device *dev,
179179
int err;
180180

181181
/* Parse our PCI ranges and request their resources */
182-
err = pci_parse_request_of_pci_ranges(dev, resources, &bus_range);
182+
err = pci_parse_request_of_pci_ranges(dev, resources, NULL, &bus_range);
183183
if (err)
184184
return err;
185185

drivers/pci/controller/dwc/pcie-designware-host.c

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
321321
struct device *dev = pci->dev;
322322
struct device_node *np = dev->of_node;
323323
struct platform_device *pdev = to_platform_device(dev);
324-
struct resource_entry *win, *tmp;
324+
struct resource_entry *win;
325325
struct pci_bus *child;
326326
struct pci_host_bridge *bridge;
327327
struct resource *cfg_res;
@@ -344,31 +344,20 @@ int dw_pcie_host_init(struct pcie_port *pp)
344344
if (!bridge)
345345
return -ENOMEM;
346346

347-
ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
348-
&bridge->windows, &pp->io_base);
349-
if (ret)
350-
return ret;
351-
352-
ret = devm_request_pci_bus_resources(dev, &bridge->windows);
347+
ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
348+
&bridge->dma_ranges, NULL);
353349
if (ret)
354350
return ret;
355351

356352
/* Get the I/O and memory ranges from DT */
357-
resource_list_for_each_entry_safe(win, tmp, &bridge->windows) {
353+
resource_list_for_each_entry(win, &bridge->windows) {
358354
switch (resource_type(win->res)) {
359355
case IORESOURCE_IO:
360-
ret = devm_pci_remap_iospace(dev, win->res,
361-
pp->io_base);
362-
if (ret) {
363-
dev_warn(dev, "Error %d: failed to map resource %pR\n",
364-
ret, win->res);
365-
resource_list_destroy_entry(win);
366-
} else {
367-
pp->io = win->res;
368-
pp->io->name = "I/O";
369-
pp->io_size = resource_size(pp->io);
370-
pp->io_bus_addr = pp->io->start - win->offset;
371-
}
356+
pp->io = win->res;
357+
pp->io->name = "I/O";
358+
pp->io_size = resource_size(pp->io);
359+
pp->io_bus_addr = pp->io->start - win->offset;
360+
pp->io_base = pci_pio_to_address(pp->io->start);
372361
break;
373362
case IORESOURCE_MEM:
374363
pp->mem = win->res;

drivers/pci/controller/pci-aardvark.c

Lines changed: 4 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,6 @@
190190
struct advk_pcie {
191191
struct platform_device *pdev;
192192
void __iomem *base;
193-
struct list_head resources;
194193
struct irq_domain *irq_domain;
195194
struct irq_chip irq_chip;
196195
struct irq_domain *msi_domain;
@@ -953,63 +952,11 @@ static irqreturn_t advk_pcie_irq_handler(int irq, void *arg)
953952
return IRQ_HANDLED;
954953
}
955954

956-
static int advk_pcie_parse_request_of_pci_ranges(struct advk_pcie *pcie)
957-
{
958-
int err, res_valid = 0;
959-
struct device *dev = &pcie->pdev->dev;
960-
struct resource_entry *win, *tmp;
961-
resource_size_t iobase;
962-
963-
INIT_LIST_HEAD(&pcie->resources);
964-
965-
err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
966-
&pcie->resources, &iobase);
967-
if (err)
968-
return err;
969-
970-
err = devm_request_pci_bus_resources(dev, &pcie->resources);
971-
if (err)
972-
goto out_release_res;
973-
974-
resource_list_for_each_entry_safe(win, tmp, &pcie->resources) {
975-
struct resource *res = win->res;
976-
977-
switch (resource_type(res)) {
978-
case IORESOURCE_IO:
979-
err = devm_pci_remap_iospace(dev, res, iobase);
980-
if (err) {
981-
dev_warn(dev, "error %d: failed to map resource %pR\n",
982-
err, res);
983-
resource_list_destroy_entry(win);
984-
}
985-
break;
986-
case IORESOURCE_MEM:
987-
res_valid |= !(res->flags & IORESOURCE_PREFETCH);
988-
break;
989-
case IORESOURCE_BUS:
990-
pcie->root_bus_nr = res->start;
991-
break;
992-
}
993-
}
994-
995-
if (!res_valid) {
996-
dev_err(dev, "non-prefetchable memory resource required\n");
997-
err = -EINVAL;
998-
goto out_release_res;
999-
}
1000-
1001-
return 0;
1002-
1003-
out_release_res:
1004-
pci_free_resource_list(&pcie->resources);
1005-
return err;
1006-
}
1007-
1008955
static int advk_pcie_probe(struct platform_device *pdev)
1009956
{
1010957
struct device *dev = &pdev->dev;
1011958
struct advk_pcie *pcie;
1012-
struct resource *res;
959+
struct resource *res, *bus;
1013960
struct pci_host_bridge *bridge;
1014961
int ret, irq;
1015962

@@ -1034,11 +981,13 @@ static int advk_pcie_probe(struct platform_device *pdev)
1034981
return ret;
1035982
}
1036983

1037-
ret = advk_pcie_parse_request_of_pci_ranges(pcie);
984+
ret = pci_parse_request_of_pci_ranges(dev, &bridge->windows,
985+
&bridge->dma_ranges, &bus);
1038986
if (ret) {
1039987
dev_err(dev, "Failed to parse resources\n");
1040988
return ret;
1041989
}
990+
pcie->root_bus_nr = bus->start;
1042991

1043992
advk_pcie_setup_hw(pcie);
1044993

@@ -1057,7 +1006,6 @@ static int advk_pcie_probe(struct platform_device *pdev)
10571006
return ret;
10581007
}
10591008

1060-
list_splice_init(&pcie->resources, &bridge->windows);
10611009
bridge->dev.parent = dev;
10621010
bridge->sysdata = pcie;
10631011
bridge->busnr = 0;

drivers/pci/controller/pci-ftpci100.c

Lines changed: 22 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -375,12 +375,11 @@ static int faraday_pci_setup_cascaded_irq(struct faraday_pci *p)
375375
return 0;
376376
}
377377

378-
static int faraday_pci_parse_map_dma_ranges(struct faraday_pci *p,
379-
struct device_node *np)
378+
static int faraday_pci_parse_map_dma_ranges(struct faraday_pci *p)
380379
{
381-
struct of_pci_range range;
382-
struct of_pci_range_parser parser;
383380
struct device *dev = p->dev;
381+
struct pci_host_bridge *bridge = pci_host_bridge_from_priv(p);
382+
struct resource_entry *entry;
384383
u32 confreg[3] = {
385384
FARADAY_PCI_MEM1_BASE_SIZE,
386385
FARADAY_PCI_MEM2_BASE_SIZE,
@@ -389,27 +388,21 @@ static int faraday_pci_parse_map_dma_ranges(struct faraday_pci *p,
389388
int i = 0;
390389
u32 val;
391390

392-
if (of_pci_dma_range_parser_init(&parser, np)) {
393-
dev_err(dev, "missing dma-ranges property\n");
394-
return -EINVAL;
395-
}
396-
397-
/*
398-
* Get the dma-ranges from the device tree
399-
*/
400-
for_each_of_pci_range(&parser, &range) {
401-
u64 end = range.pci_addr + range.size - 1;
391+
resource_list_for_each_entry(entry, &bridge->dma_ranges) {
392+
u64 pci_addr = entry->res->start - entry->offset;
393+
u64 end = entry->res->end - entry->offset;
402394
int ret;
403395

404-
ret = faraday_res_to_memcfg(range.pci_addr, range.size, &val);
396+
ret = faraday_res_to_memcfg(pci_addr,
397+
resource_size(entry->res), &val);
405398
if (ret) {
406399
dev_err(dev,
407400
"DMA range %d: illegal MEM resource size\n", i);
408401
return -EINVAL;
409402
}
410403

411404
dev_info(dev, "DMA MEM%d BASE: 0x%016llx -> 0x%016llx config %08x\n",
412-
i + 1, range.pci_addr, end, val);
405+
i + 1, pci_addr, end, val);
413406
if (i <= 2) {
414407
faraday_raw_pci_write_config(p, 0, 0, confreg[i],
415408
4, val);
@@ -430,18 +423,15 @@ static int faraday_pci_probe(struct platform_device *pdev)
430423
const struct faraday_pci_variant *variant =
431424
of_device_get_match_data(dev);
432425
struct resource *regs;
433-
resource_size_t io_base;
434426
struct resource_entry *win;
435427
struct faraday_pci *p;
436-
struct resource *mem;
437428
struct resource *io;
438429
struct pci_host_bridge *host;
439430
struct clk *clk;
440431
unsigned char max_bus_speed = PCI_SPEED_33MHz;
441432
unsigned char cur_bus_speed = PCI_SPEED_33MHz;
442433
int ret;
443434
u32 val;
444-
LIST_HEAD(res);
445435

446436
host = devm_pci_alloc_host_bridge(dev, sizeof(*p));
447437
if (!host)
@@ -480,44 +470,21 @@ static int faraday_pci_probe(struct platform_device *pdev)
480470
if (IS_ERR(p->base))
481471
return PTR_ERR(p->base);
482472

483-
ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
484-
&res, &io_base);
485-
if (ret)
486-
return ret;
487-
488-
ret = devm_request_pci_bus_resources(dev, &res);
473+
ret = pci_parse_request_of_pci_ranges(dev, &host->windows,
474+
&host->dma_ranges, NULL);
489475
if (ret)
490476
return ret;
491477

492-
/* Get the I/O and memory ranges from DT */
493-
resource_list_for_each_entry(win, &res) {
494-
switch (resource_type(win->res)) {
495-
case IORESOURCE_IO:
496-
io = win->res;
497-
io->name = "Gemini PCI I/O";
498-
if (!faraday_res_to_memcfg(io->start - win->offset,
499-
resource_size(io), &val)) {
500-
/* setup I/O space size */
501-
writel(val, p->base + PCI_IOSIZE);
502-
} else {
503-
dev_err(dev, "illegal IO mem size\n");
504-
return -EINVAL;
505-
}
506-
ret = devm_pci_remap_iospace(dev, io, io_base);
507-
if (ret) {
508-
dev_warn(dev, "error %d: failed to map resource %pR\n",
509-
ret, io);
510-
continue;
511-
}
512-
break;
513-
case IORESOURCE_MEM:
514-
mem = win->res;
515-
mem->name = "Gemini PCI MEM";
516-
break;
517-
case IORESOURCE_BUS:
518-
break;
519-
default:
520-
break;
478+
win = resource_list_first_type(&host->windows, IORESOURCE_IO);
479+
if (win) {
480+
io = win->res;
481+
if (!faraday_res_to_memcfg(io->start - win->offset,
482+
resource_size(io), &val)) {
483+
/* setup I/O space size */
484+
writel(val, p->base + PCI_IOSIZE);
485+
} else {
486+
dev_err(dev, "illegal IO mem size\n");
487+
return -EINVAL;
521488
}
522489
}
523490

@@ -565,11 +532,10 @@ static int faraday_pci_probe(struct platform_device *pdev)
565532
cur_bus_speed = PCI_SPEED_66MHz;
566533
}
567534

568-
ret = faraday_pci_parse_map_dma_ranges(p, dev->of_node);
535+
ret = faraday_pci_parse_map_dma_ranges(p);
569536
if (ret)
570537
return ret;
571538

572-
list_splice_init(&res, &host->windows);
573539
ret = pci_scan_root_bus_bridge(host);
574540
if (ret) {
575541
dev_err(dev, "failed to scan host: %d\n", ret);
@@ -581,7 +547,6 @@ static int faraday_pci_probe(struct platform_device *pdev)
581547

582548
pci_bus_assign_resources(p->bus);
583549
pci_bus_add_devices(p->bus);
584-
pci_free_resource_list(&res);
585550

586551
return 0;
587552
}

drivers/pci/controller/pci-host-common.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ static struct pci_config_window *gen_pci_init(struct device *dev,
2727
struct pci_config_window *cfg;
2828

2929
/* Parse our PCI ranges and request their resources */
30-
err = pci_parse_request_of_pci_ranges(dev, resources, &bus_range);
30+
err = pci_parse_request_of_pci_ranges(dev, resources, NULL, &bus_range);
3131
if (err)
3232
return ERR_PTR(err);
3333

0 commit comments

Comments
 (0)