|
@@ -253,6 +253,7 @@ struct tegra_pcie {
|
|
struct list_head buses;
|
|
struct list_head buses;
|
|
struct resource *cs;
|
|
struct resource *cs;
|
|
|
|
|
|
|
|
+ struct resource all;
|
|
struct resource io;
|
|
struct resource io;
|
|
struct resource mem;
|
|
struct resource mem;
|
|
struct resource prefetch;
|
|
struct resource prefetch;
|
|
@@ -626,6 +627,15 @@ DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, tegra_pcie_relax_enable);
|
|
static int tegra_pcie_setup(int nr, struct pci_sys_data *sys)
|
|
static int tegra_pcie_setup(int nr, struct pci_sys_data *sys)
|
|
{
|
|
{
|
|
struct tegra_pcie *pcie = sys_to_pcie(sys);
|
|
struct tegra_pcie *pcie = sys_to_pcie(sys);
|
|
|
|
+ int err;
|
|
|
|
+
|
|
|
|
+ err = devm_request_resource(pcie->dev, &pcie->all, &pcie->mem);
|
|
|
|
+ if (err < 0)
|
|
|
|
+ return err;
|
|
|
|
+
|
|
|
|
+ err = devm_request_resource(pcie->dev, &pcie->all, &pcie->prefetch);
|
|
|
|
+ if (err)
|
|
|
|
+ return err;
|
|
|
|
|
|
pci_add_resource_offset(&sys->resources, &pcie->mem, sys->mem_offset);
|
|
pci_add_resource_offset(&sys->resources, &pcie->mem, sys->mem_offset);
|
|
pci_add_resource_offset(&sys->resources, &pcie->prefetch,
|
|
pci_add_resource_offset(&sys->resources, &pcie->prefetch,
|
|
@@ -1518,6 +1528,12 @@ static int tegra_pcie_parse_dt(struct tegra_pcie *pcie)
|
|
struct resource res;
|
|
struct resource res;
|
|
int err;
|
|
int err;
|
|
|
|
|
|
|
|
+ memset(&pcie->all, 0, sizeof(pcie->all));
|
|
|
|
+ pcie->all.flags = IORESOURCE_MEM;
|
|
|
|
+ pcie->all.name = np->full_name;
|
|
|
|
+ pcie->all.start = ~0;
|
|
|
|
+ pcie->all.end = 0;
|
|
|
|
+
|
|
if (of_pci_range_parser_init(&parser, np)) {
|
|
if (of_pci_range_parser_init(&parser, np)) {
|
|
dev_err(pcie->dev, "missing \"ranges\" property\n");
|
|
dev_err(pcie->dev, "missing \"ranges\" property\n");
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
@@ -1529,21 +1545,31 @@ static int tegra_pcie_parse_dt(struct tegra_pcie *pcie)
|
|
switch (res.flags & IORESOURCE_TYPE_BITS) {
|
|
switch (res.flags & IORESOURCE_TYPE_BITS) {
|
|
case IORESOURCE_IO:
|
|
case IORESOURCE_IO:
|
|
memcpy(&pcie->io, &res, sizeof(res));
|
|
memcpy(&pcie->io, &res, sizeof(res));
|
|
- pcie->io.name = "I/O";
|
|
|
|
|
|
+ pcie->io.name = np->full_name;
|
|
break;
|
|
break;
|
|
|
|
|
|
case IORESOURCE_MEM:
|
|
case IORESOURCE_MEM:
|
|
if (res.flags & IORESOURCE_PREFETCH) {
|
|
if (res.flags & IORESOURCE_PREFETCH) {
|
|
memcpy(&pcie->prefetch, &res, sizeof(res));
|
|
memcpy(&pcie->prefetch, &res, sizeof(res));
|
|
- pcie->prefetch.name = "PREFETCH";
|
|
|
|
|
|
+ pcie->prefetch.name = "prefetchable";
|
|
} else {
|
|
} else {
|
|
memcpy(&pcie->mem, &res, sizeof(res));
|
|
memcpy(&pcie->mem, &res, sizeof(res));
|
|
- pcie->mem.name = "MEM";
|
|
|
|
|
|
+ pcie->mem.name = "non-prefetchable";
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (res.start <= pcie->all.start)
|
|
|
|
+ pcie->all.start = res.start;
|
|
|
|
+
|
|
|
|
+ if (res.end >= pcie->all.end)
|
|
|
|
+ pcie->all.end = res.end;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ err = devm_request_resource(pcie->dev, &iomem_resource, &pcie->all);
|
|
|
|
+ if (err < 0)
|
|
|
|
+ return err;
|
|
|
|
+
|
|
err = of_pci_parse_bus_range(np, &pcie->busn);
|
|
err = of_pci_parse_bus_range(np, &pcie->busn);
|
|
if (err < 0) {
|
|
if (err < 0) {
|
|
dev_err(pcie->dev, "failed to parse ranges property: %d\n",
|
|
dev_err(pcie->dev, "failed to parse ranges property: %d\n",
|