static int versatile_pci_parse_request_of_pci_ranges(struct device *dev, struct list_head *res) { int err, mem = 1, res_valid = 0; struct device_node *np = dev->of_node; resource_size_t iobase; struct resource_entry *win; err = of_pci_get_host_bridge_resources(np, 0, 0xff, res, &iobase); if (err) return err; resource_list_for_each_entry(win, res) { struct resource *parent, *res = win->res; switch (resource_type(res)) { case IORESOURCE_IO: parent = &ioport_resource; err = pci_remap_iospace(res, iobase); if (err) { dev_warn(dev, "error %d: failed to map resource %pR\n", err, res); continue; } break; case IORESOURCE_MEM: parent = &iomem_resource; res_valid |= !(res->flags & IORESOURCE_PREFETCH); writel(res->start >> 28, PCI_IMAP(mem)); writel(PHYS_OFFSET >> 28, PCI_SMAP(mem)); mem++; break; case IORESOURCE_BUS: default: continue; } err = devm_request_resource(dev, parent, res); if (err) goto out_release_res; } if (!res_valid) { dev_err(dev, "non-prefetchable memory resource required\n"); err = -EINVAL; goto out_release_res; } return 0; out_release_res: pci_free_resource_list(res); return err; }
static int gen_pci_parse_request_of_pci_ranges(struct device *dev, struct list_head *resources, struct resource **bus_range) { int err, res_valid = 0; struct device_node *np = dev->of_node; resource_size_t iobase; struct resource_entry *win, *tmp; err = of_pci_get_host_bridge_resources(np, 0, 0xff, resources, &iobase); if (err) return err; err = devm_request_pci_bus_resources(dev, resources); if (err) return err; resource_list_for_each_entry_safe(win, tmp, resources) { struct resource *res = win->res; switch (resource_type(res)) { case IORESOURCE_IO: err = pci_remap_iospace(res, iobase); if (err) { dev_warn(dev, "error %d: failed to map resource %pR\n", err, res); resource_list_destroy_entry(win); } break; case IORESOURCE_MEM: res_valid |= !(res->flags & IORESOURCE_PREFETCH); break; case IORESOURCE_BUS: *bus_range = res; break; } } if (res_valid) return 0; dev_err(dev, "non-prefetchable memory resource required\n"); return -EINVAL; }