Hi Rob, I reviewed and verified this change.. It is working fine. Regards, Srinath. On Mon, Oct 28, 2019 at 10:03 PM Rob Herring <robh@xxxxxxxxxx> wrote: > > 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. > > Cc: Lorenzo Pieralisi <lorenzo.pieralisi@xxxxxxx> > Cc: Bjorn Helgaas <bhelgaas@xxxxxxxxxx> > Cc: Ray Jui <rjui@xxxxxxxxxxxx> > Cc: Scott Branden <sbranden@xxxxxxxxxxxx> > Cc: bcm-kernel-feedback-list@xxxxxxxxxxxx > Reviewed-by: Andrew Murray <andrew.murray@xxxxxxx> > Signed-off-by: Rob Herring <robh@xxxxxxxxxx> > --- > v2: > - Fix iproc_pcie_paxb_v2_msi_steer() to use resource_entry > --- > drivers/pci/controller/pcie-iproc.c | 77 +++++++---------------------- > 1 file changed, 17 insertions(+), 60 deletions(-) > > diff --git a/drivers/pci/controller/pcie-iproc.c b/drivers/pci/controller/pcie-iproc.c > index 223335ee791a..f4d78e66846e 100644 > --- a/drivers/pci/controller/pcie-iproc.c > +++ b/drivers/pci/controller/pcie-iproc.c > @@ -1122,15 +1122,16 @@ static int iproc_pcie_ib_write(struct iproc_pcie *pcie, int region_idx, > } > > static int iproc_pcie_setup_ib(struct iproc_pcie *pcie, > - struct of_pci_range *range, > + struct resource_entry *entry, > enum iproc_pcie_ib_map_type type) > { > struct device *dev = pcie->dev; > struct iproc_pcie_ib *ib = &pcie->ib; > int ret; > unsigned int region_idx, size_idx; > - u64 axi_addr = range->cpu_addr, pci_addr = range->pci_addr; > - resource_size_t size = range->size; > + u64 axi_addr = entry->res->start; > + u64 pci_addr = entry->res->start - entry->offset; > + resource_size_t size = resource_size(entry->res); > > /* iterate through all IARR mapping regions */ > 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, > return ret; > } > > -static int iproc_pcie_add_dma_range(struct device *dev, > - struct list_head *resources, > - struct of_pci_range *range) > -{ > - struct resource *res; > - struct resource_entry *entry, *tmp; > - struct list_head *head = resources; > - > - res = devm_kzalloc(dev, sizeof(struct resource), GFP_KERNEL); > - if (!res) > - return -ENOMEM; > - > - resource_list_for_each_entry(tmp, resources) { > - if (tmp->res->start < range->cpu_addr) > - head = &tmp->node; > - } > - > - res->start = range->cpu_addr; > - res->end = res->start + range->size - 1; > - > - entry = resource_list_create_entry(res, 0); > - if (!entry) > - return -ENOMEM; > - > - entry->offset = res->start - range->cpu_addr; > - resource_list_add(entry, head); > - > - return 0; > -} > - > static int iproc_pcie_map_dma_ranges(struct iproc_pcie *pcie) > { > struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie); > - struct of_pci_range range; > - struct of_pci_range_parser parser; > - int ret; > - LIST_HEAD(resources); > - > - /* Get the dma-ranges from DT */ > - ret = of_pci_dma_range_parser_init(&parser, pcie->dev->of_node); > - if (ret) > - return ret; > + struct resource_entry *entry; > + int ret = 0; > > - for_each_of_pci_range(&parser, &range) { > - ret = iproc_pcie_add_dma_range(pcie->dev, > - &resources, > - &range); > - if (ret) > - goto out; > + resource_list_for_each_entry(entry, &host->dma_ranges) { > /* Each range entry corresponds to an inbound mapping region */ > - ret = iproc_pcie_setup_ib(pcie, &range, IPROC_PCIE_IB_MAP_MEM); > + ret = iproc_pcie_setup_ib(pcie, entry, IPROC_PCIE_IB_MAP_MEM); > if (ret) > - goto out; > + break; > } > > - list_splice_init(&resources, &host->dma_ranges); > - > - return 0; > -out: > - pci_free_resource_list(&resources); > return ret; > } > > @@ -1276,13 +1230,16 @@ static int iproce_pcie_get_msi(struct iproc_pcie *pcie, > static int iproc_pcie_paxb_v2_msi_steer(struct iproc_pcie *pcie, u64 msi_addr) > { > int ret; > - struct of_pci_range range; > + struct resource_entry entry; > + > + memset(&entry, 0, sizeof(entry)); > + entry.res = &entry.__res; > > - memset(&range, 0, sizeof(range)); > - range.size = SZ_32K; > - range.pci_addr = range.cpu_addr = msi_addr & ~(range.size - 1); > + msi_addr &= ~(SZ_32K - 1); > + entry.res->start = msi_addr; > + entry.res->end = msi_addr + SZ_32K - 1; > > - ret = iproc_pcie_setup_ib(pcie, &range, IPROC_PCIE_IB_MAP_IO); > + ret = iproc_pcie_setup_ib(pcie, &entry, IPROC_PCIE_IB_MAP_IO); > return ret; > } > > -- > 2.20.1 >