Skip to content

Commit b9ae59b

Browse files
robherringLorenzo Pieralisi
authored andcommitted
PCI: iproc: Use inbound resources for setup
Now that the helpers provide the inbound resources in the host bridge 'dma_ranges' resource list, convert Broadcom iProc host bridge to use the resource list to setup the inbound addresses. Signed-off-by: Rob Herring <[email protected]> Signed-off-by: Lorenzo Pieralisi <[email protected]> Reviewed-by: Andrew Murray <[email protected]> Cc: Lorenzo Pieralisi <[email protected]> Cc: Bjorn Helgaas <[email protected]> Cc: Ray Jui <[email protected]> Cc: Scott Branden <[email protected]> Cc: [email protected]
1 parent 6dce5aa commit b9ae59b

File tree

1 file changed

+17
-60
lines changed

1 file changed

+17
-60
lines changed

drivers/pci/controller/pcie-iproc.c

Lines changed: 17 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,15 +1122,16 @@ static int iproc_pcie_ib_write(struct iproc_pcie *pcie, int region_idx,
11221122
}
11231123

11241124
static int iproc_pcie_setup_ib(struct iproc_pcie *pcie,
1125-
struct of_pci_range *range,
1125+
struct resource_entry *entry,
11261126
enum iproc_pcie_ib_map_type type)
11271127
{
11281128
struct device *dev = pcie->dev;
11291129
struct iproc_pcie_ib *ib = &pcie->ib;
11301130
int ret;
11311131
unsigned int region_idx, size_idx;
1132-
u64 axi_addr = range->cpu_addr, pci_addr = range->pci_addr;
1133-
resource_size_t size = range->size;
1132+
u64 axi_addr = entry->res->start;
1133+
u64 pci_addr = entry->res->start - entry->offset;
1134+
resource_size_t size = resource_size(entry->res);
11341135

11351136
/* iterate through all IARR mapping regions */
11361137
for (region_idx = 0; region_idx < ib->nr_regions; region_idx++) {
@@ -1182,66 +1183,19 @@ static int iproc_pcie_setup_ib(struct iproc_pcie *pcie,
11821183
return ret;
11831184
}
11841185

1185-
static int iproc_pcie_add_dma_range(struct device *dev,
1186-
struct list_head *resources,
1187-
struct of_pci_range *range)
1188-
{
1189-
struct resource *res;
1190-
struct resource_entry *entry, *tmp;
1191-
struct list_head *head = resources;
1192-
1193-
res = devm_kzalloc(dev, sizeof(struct resource), GFP_KERNEL);
1194-
if (!res)
1195-
return -ENOMEM;
1196-
1197-
resource_list_for_each_entry(tmp, resources) {
1198-
if (tmp->res->start < range->cpu_addr)
1199-
head = &tmp->node;
1200-
}
1201-
1202-
res->start = range->cpu_addr;
1203-
res->end = res->start + range->size - 1;
1204-
1205-
entry = resource_list_create_entry(res, 0);
1206-
if (!entry)
1207-
return -ENOMEM;
1208-
1209-
entry->offset = res->start - range->cpu_addr;
1210-
resource_list_add(entry, head);
1211-
1212-
return 0;
1213-
}
1214-
12151186
static int iproc_pcie_map_dma_ranges(struct iproc_pcie *pcie)
12161187
{
12171188
struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
1218-
struct of_pci_range range;
1219-
struct of_pci_range_parser parser;
1220-
int ret;
1221-
LIST_HEAD(resources);
1222-
1223-
/* Get the dma-ranges from DT */
1224-
ret = of_pci_dma_range_parser_init(&parser, pcie->dev->of_node);
1225-
if (ret)
1226-
return ret;
1189+
struct resource_entry *entry;
1190+
int ret = 0;
12271191

1228-
for_each_of_pci_range(&parser, &range) {
1229-
ret = iproc_pcie_add_dma_range(pcie->dev,
1230-
&resources,
1231-
&range);
1232-
if (ret)
1233-
goto out;
1192+
resource_list_for_each_entry(entry, &host->dma_ranges) {
12341193
/* Each range entry corresponds to an inbound mapping region */
1235-
ret = iproc_pcie_setup_ib(pcie, &range, IPROC_PCIE_IB_MAP_MEM);
1194+
ret = iproc_pcie_setup_ib(pcie, entry, IPROC_PCIE_IB_MAP_MEM);
12361195
if (ret)
1237-
goto out;
1196+
break;
12381197
}
12391198

1240-
list_splice_init(&resources, &host->dma_ranges);
1241-
1242-
return 0;
1243-
out:
1244-
pci_free_resource_list(&resources);
12451199
return ret;
12461200
}
12471201

@@ -1276,13 +1230,16 @@ static int iproce_pcie_get_msi(struct iproc_pcie *pcie,
12761230
static int iproc_pcie_paxb_v2_msi_steer(struct iproc_pcie *pcie, u64 msi_addr)
12771231
{
12781232
int ret;
1279-
struct of_pci_range range;
1233+
struct resource_entry entry;
1234+
1235+
memset(&entry, 0, sizeof(entry));
1236+
entry.res = &entry.__res;
12801237

1281-
memset(&range, 0, sizeof(range));
1282-
range.size = SZ_32K;
1283-
range.pci_addr = range.cpu_addr = msi_addr & ~(range.size - 1);
1238+
msi_addr &= ~(SZ_32K - 1);
1239+
entry.res->start = msi_addr;
1240+
entry.res->end = msi_addr + SZ_32K - 1;
12841241

1285-
ret = iproc_pcie_setup_ib(pcie, &range, IPROC_PCIE_IB_MAP_IO);
1242+
ret = iproc_pcie_setup_ib(pcie, &entry, IPROC_PCIE_IB_MAP_IO);
12861243
return ret;
12871244
}
12881245

0 commit comments

Comments
 (0)