PCI host resource consolidation
Subsystems (17)
Rob Herring
maintainerv2 cover PCI host resource consolidation
This started with just dma-ranges parsing consolidation, but has expanded to converting all host drivers to use pci_parse_request_of_pci_ranges() rather than devm_of_pci_get_host_bridge_resources(). This series moves the DT 'dma-ranges' parsing into common helpers utilizing a resource list. There's no (intended) functional change in this series though I'm also working on a separate series now in dt/next to improve the handling of 'dma-ranges' and dma masks.
The last patch may need to wait if there's any new users of devm_of_pci_get_host_bridge_resources.
Only versatile has been tested (on QEMU). The rest is compiled only. A git branch is here[1].
Rob
[1] git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git pci-ranges-cleanup-v2
Rob Herring (25):
resource: Add a resource_list_get_entry_of_type helper
PCI: Export pci_parse_request_of_pci_ranges()
PCI: aardvark: Use pci_parse_request_of_pci_ranges()
PCI: altera: Use pci_parse_request_of_pci_ranges()
PCI: dwc: Use pci_parse_request_of_pci_ranges()
PCI: faraday: Use pci_parse_request_of_pci_ranges
PCI: iproc: Use pci_parse_request_of_pci_ranges()
PCI: mediatek: Use pci_parse_request_of_pci_ranges()
PCI: mobiveil: Use pci_parse_request_of_pci_ranges()
PCI: rockchip: Use pci_parse_request_of_pci_ranges()
PCI: rockchip: Drop storing driver private outbound resource data
PCI: v3-semi: Use pci_parse_request_of_pci_ranges()
PCI: xgene: Use pci_parse_request_of_pci_ranges()
PCI: xilinx: Use pci_parse_request_of_pci_ranges()
PCI: xilinx-nwl: Use pci_parse_request_of_pci_ranges()
PCI: versatile: Use pci_parse_request_of_pci_ranges()
PCI: versatile: Remove usage of PHYS_OFFSET
PCI: versatile: Enable COMPILE_TEST
PCI: of: Add inbound resource parsing to helpers
PCI: ftpci100: Use inbound resources for setup
PCI: v3-semi: Use inbound resources for setup
PCI: xgene: Use inbound resources for setup
PCI: iproc: Use inbound resources for setup
PCI: rcar: Use inbound resources for setup
PCI: Make devm_of_pci_get_host_bridge_resources() static
drivers/pci/controller/Kconfig | 2 +- .../pci/controller/dwc/pcie-designware-host.c | 29 ++---- drivers/pci/controller/pci-aardvark.c | 60 +------------ drivers/pci/controller/pci-ftpci100.c | 78 +++++----------- drivers/pci/controller/pci-host-common.c | 2 +- drivers/pci/controller/pci-v3-semi.c | 74 +++++---------- drivers/pci/controller/pci-versatile.c | 70 +++------------ drivers/pci/controller/pci-xgene.c | 72 +++++---------- drivers/pci/controller/pcie-altera.c | 41 +-------- drivers/pci/controller/pcie-cadence-host.c | 2 +- drivers/pci/controller/pcie-iproc-platform.c | 9 +- drivers/pci/controller/pcie-iproc.c | 81 ++++------------- drivers/pci/controller/pcie-mediatek.c | 43 +++------ drivers/pci/controller/pcie-mobiveil.c | 27 ++---- drivers/pci/controller/pcie-rcar.c | 48 ++++------ drivers/pci/controller/pcie-rockchip-host.c | 89 +++++++------------ drivers/pci/controller/pcie-rockchip.h | 5 -- drivers/pci/controller/pcie-xilinx-nwl.c | 21 ++--- drivers/pci/controller/pcie-xilinx.c | 18 +--- drivers/pci/of.c | 51 +++++++++-- drivers/pci/pci.h | 13 --- include/linux/pci.h | 2 + include/linux/resource_ext.h | 12 +++ 23 files changed, 253 insertions(+), 596 deletions(-)
--
2.20.1
Rob Herring
maintainerPATCH v2 1/25 resource: Add a resource_list_get_entry_of_type helper
A common pattern is looping over a resource_list just to get a matching entry with a specific type. Add resource_list_get_entry_of_type() helper which implements this.
---
v2:
- New patch
include/linux/resource_ext.h | 12 ++++++++++++ 1 file changed, 12 insertions(+)
include/linux/resource_ext.h +12 -0
@@ -66,4 +66,16 @@ resource_list_destroy_entry(struct resource_entry *entry)#define resource_list_for_each_entry_safe (entry, tmp, list) \ list_for_each_entry_safe((entry), (tmp), (list), node) +static inline struct resource_entry *resource_list_get_entry_of_type (struct list_head *list, +unsigned long type) +{ +struct resource_entry *entry; + +resource_list_for_each_entry (entry, list) { +if (resource_type (entry->res) == type) +return entry; + } +return NULL ; +} +#endif /* _LINUX_RESOURCE_EXT_H */
--
2.20.1
Re: [PATCH v2 01/25] resource: Add a resource_list_get_entry_of_type helper
include/linux/resource_ext.h resource_list_destroy_entry(struct resource_entry *entry) · line 70
Quoted 2 lines · Rob Herring
include/linux/resource_ext.h +2
-0+static inline struct resource_entry *resource_list_get_entry_of_type (struct list_head *list, +unsigned long type)
This adds a way too long line.
Part of that is that the name just seems way too long as well, any good shorter name? resourse_list_first_type?
Re: [PATCH v2 01/25] resource: Add a resource_list_get_entry_of_type helper
Quoted 8 lines · Christoph Hellwig
include/linux/resource_ext.h resource_list_destroy_entry(struct resource_entry *entry) · line 70
Quoted 2 lines · Rob Herring
include/linux/resource_ext.h +2
-0+static inline struct resource_entry *resource_list_get_entry_of_type (struct list_head *list, +unsigned long type)This adds a way too long line.
Part of that is that the name just seems way too long as well, any good shorter name?
resourse_list_first_type?
I think it's really helpful to use the word 'first' in there somewhere, it makes it a little clearer on what happens if there are multiple of the same type of resource.
Thanks,
Andrew Murray
Rob Herring
maintainerPATCH v2 2/25 PCI: Export pci_parse_request_of_pci_ranges()
In reply to Rob Herringpci_parse_request_of_pci_ranges() is missing a module export, so add it.
---
v2:
- New patch
drivers/pci/of.c | 1 + 1 file changed, 1 insertion(+)
drivers/pci/of.c +1 -0
@@ -530,6 +530,7 @@ int pci_parse_request_of_pci_ranges(struct device *dev,pci_free_resource_list (resources); return err; } +EXPORT_SYMBOL_GPL (pci_parse_request_of_pci_ranges);#endif /* CONFIG_PCI */
--
2.20.1
Re: [PATCH v2 02/25] PCI: Export pci_parse_request_of_pci_ranges()
Quoted 16 lines · Rob Herring
pci_parse_request_of_pci_ranges()is missing a module export, so add it.Cc Bjorn Helgaas <[email protected]>Signed-off-by Rob Herring <[email protected]>---
v2:
- New patchdrivers/pci/of.c | 1 + 1 file changed, 1 insertion(+)drivers/pci/of.c +0
-0
drivers/pci/of.c int pci_parse_request_of_pci_ranges(struct device *dev, · line 534
Quoted 5 lines
drivers/pci/of.c +1
-0@@ -530,6 +530,7 @@ int pci_parse_request_of_pci_ranges(struct device *dev,pci_free_resource_list (resources);return err; } +EXPORT_SYMBOL_GPL (pci_parse_request_of_pci_ranges);
Quoted 4 lines
drivers/pci/of.c +0
-1#endif /* CONFIG_PCI */ --2.20.1
Rob Herring
maintainerPATCH v2 3/25 PCI: aardvark: Use pci_parse_request_of_pci_ranges()
In reply to Rob HerringConvert aardvark to use the common pci_parse_request_of_pci_ranges().
There's no need to assign the resources to a temporary list first. Just use bridge->windows directly and remove all the temporary list handling.
---
v2:
- Remove the temporary list
--- drivers/pci/controller/pci-aardvark.c | 60 ++------------------------- 1 file changed, 4 insertions(+), 56 deletions(-)
drivers/pci/controller/pci-aardvark.c +4 -56
@@ -186,7 +186,6 @@struct advk_pcie {struct platform_device *pdev;void __iomem *base; -struct list_head resources;struct irq_domain *irq_domain;struct irq_chip irq_chip;struct irq_domain *msi_domain;
@@ -910,63 +909,11 @@ static irqreturn_t advk_pcie_irq_handler(int irq, void *arg)return IRQ_HANDLED ; } -static int advk_pcie_parse_request_of_pci_ranges (struct advk_pcie *pcie) -{ -int err, res_valid =0 ; -struct device *dev = &pcie->pdev->dev; -struct resource_entry *win, *tmp; -resource_size_t iobase; - -INIT_LIST_HEAD (&pcie->resources); - - err =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , - &pcie->resources, &iobase); -if (err) -return err; - - err =devm_request_pci_bus_resources (dev, &pcie->resources); -if (err) - goto out_release_res; - -resource_list_for_each_entry_safe (win, tmp, &pcie->resources) { -struct resource *res = win->res; - -switch (resource_type (res)) { -case IORESOURCE_IO : - err =devm_pci_remap_iospace (dev, 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 : - pcie->root_bus_nr = res->start; -break ; - } - } - -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 (&pcie->resources); -return err; -} -static int advk_pcie_probe (struct platform_device *pdev) {struct device *dev = &pdev->dev;struct advk_pcie *pcie; -struct resource *res; +struct resource *res, *bus;struct pci_host_bridge *bridge;int ret, irq;
@@ -991,11 +938,13 @@ static int advk_pcie_probe(struct platform_device *pdev)return ret; } - ret =advk_pcie_parse_request_of_pci_ranges (pcie); + ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows, + &bus);if (ret) {dev_err (dev,"Failed to parse resources\n" );return ret; } + pcie->root_bus_nr = bus->start;advk_pcie_setup_hw (pcie);
@@ -1014,7 +963,6 @@ static int advk_pcie_probe(struct platform_device *pdev)return ret; } -list_splice_init (&pcie->resources, &bridge->windows); bridge->dev.parent = dev; bridge->sysdata = pcie; bridge->busnr =0 ;
Signature · 1 line
2.20.1
Rob Herring
maintainerPATCH v2 4/25 PCI: altera: Use pci_parse_request_of_pci_ranges()
In reply to Rob HerringConvert altera host bridge to use the commonpci_parse_request_of_pci_ranges().
There's no need to assign the resources to a temporary list first. Just use bridge->windows directly and remove all the temporary list handling.
If an I/O range is present, then it will now be mapped. It's expected that h/w which doesn't support I/O range will not define one.
---
v2:
- Remove temporary resource list
--- drivers/pci/controller/pcie-altera.c | 41 ++-------------------------- 1 file changed, 2 insertions(+), 39 deletions(-)
drivers/pci/controller/pcie-altera.c +2 -39
@@ -92,7 +92,6 @@ struct altera_pcie {u8 root_bus_nr;struct irq_domain *irq_domain;struct resource bus_range; -struct list_head resources;const struct altera_pcie_data *pcie_data; };
@@ -670,39 +669,6 @@ static void altera_pcie_isr(struct irq_desc *desc)chained_irq_exit (chip, desc); } -static int altera_pcie_parse_request_of_pci_ranges (struct altera_pcie *pcie) -{ -int err, res_valid =0 ; -struct device *dev = &pcie->pdev->dev; -struct resource_entry *win; - - err =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , - &pcie->resources,NULL ); -if (err) -return err; - - err =devm_request_pci_bus_resources (dev, &pcie->resources); -if (err) - goto out_release_res; - -resource_list_for_each_entry (win, &pcie->resources) { -struct resource *res = win->res; - -if (resource_type (res) ==IORESOURCE_MEM ) - res_valid |= !(res->flags &IORESOURCE_PREFETCH ); - } - -if (res_valid) -return 0 ; - -dev_err (dev,"non-prefetchable memory resource required\n" ); - err = -EINVAL ; - -out_release_res: -pci_free_resource_list (&pcie->resources); -return err; -} -static int altera_pcie_init_irq_domain (struct altera_pcie *pcie) {struct device *dev = &pcie->pdev->dev;
@@ -833,9 +799,8 @@ static int altera_pcie_probe(struct platform_device *pdev)return ret; } -INIT_LIST_HEAD (&pcie->resources); - - ret =altera_pcie_parse_request_of_pci_ranges (pcie); + ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows, +NULL );if (ret) {dev_err (dev,"Failed add resources\n" );return ret;
@@ -853,7 +818,6 @@ static int altera_pcie_probe(struct platform_device *pdev)cra_writel (pcie,P2A_INT_ENA_ALL ,P2A_INT_ENABLE );altera_pcie_host_init (pcie); -list_splice_init (&pcie->resources, &bridge->windows); bridge->dev.parent = dev; bridge->sysdata = pcie; bridge->busnr = pcie->root_bus_nr;
@@ -884,7 +848,6 @@ static int altera_pcie_remove(struct platform_device *pdev)pci_stop_root_bus (bridge->bus);pci_remove_root_bus (bridge->bus); -pci_free_resource_list (&pcie->resources);altera_pcie_irq_teardown (pcie);return 0 ;
Signature · 1 line
2.20.1
Re: [PATCH v2 04/25] PCI: altera: Use pci_parse_request_of_pci_ranges()
Quoted 9 lines · Rob Herring
Convert altera host bridge to use the common
pci_parse_request_of_pci_ranges().There's no need to assign the resources to a temporary list first. Just use
bridge->windowsdirectly and remove all the temporary list handling.If an I/O range is present, then it will now be mapped. It's expected that h/w which doesn't support I/O range will not define one.
Quoted 6 lines
Cc Ley Foon Tan <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Bjorn Helgaas <[email protected]>Signed-off-by Rob Herring <[email protected]>---
Quoted 89 lines
v2:
- Remove temporary resource list--- drivers/pci/controller/pcie-altera.c | 41 ++-------------------------- 1 file changed, 2 insertions(+), 39 deletions(-)drivers/pci/controller/pcie-altera.c +2
-39@@ -92,7 +92,6 @@ struct altera_pcie {u8 root_bus_nr;struct irq_domain *irq_domain;struct resource bus_range; -struct list_head resources;const struct altera_pcie_data *pcie_data; };@@ -670,39 +669,6 @@ static void altera_pcie_isr(struct irq_desc *desc)chained_irq_exit (chip, desc); } -static int altera_pcie_parse_request_of_pci_ranges (struct altera_pcie *pcie) -{ -int err, res_valid =0 ; -struct device *dev = &pcie->pdev->dev; -struct resource_entry *win; - - err =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , - &pcie->resources,NULL ); -if (err) -return err; - - err =devm_request_pci_bus_resources (dev, &pcie->resources); -if (err) - goto out_release_res; - -resource_list_for_each_entry (win, &pcie->resources) { -struct resource *res = win->res; - -if (resource_type (res) ==IORESOURCE_MEM ) - res_valid |= !(res->flags &IORESOURCE_PREFETCH ); - } - -if (res_valid) -return 0 ; - -dev_err (dev,"non-prefetchable memory resource required\n" ); - err = -EINVAL ; - -out_release_res: -pci_free_resource_list (&pcie->resources); -return err; -} -static int altera_pcie_init_irq_domain (struct altera_pcie *pcie) {struct device *dev = &pcie->pdev->dev;@@ -833,9 +799,8 @@ static int altera_pcie_probe(struct platform_device *pdev)return ret; } -INIT_LIST_HEAD (&pcie->resources); - - ret =altera_pcie_parse_request_of_pci_ranges (pcie); + ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows, +NULL );if (ret) {dev_err (dev,"Failed add resources\n" );return ret;@@ -853,7 +818,6 @@ static int altera_pcie_probe(struct platform_device *pdev)cra_writel (pcie,P2A_INT_ENA_ALL ,P2A_INT_ENABLE );altera_pcie_host_init (pcie); -list_splice_init (&pcie->resources, &bridge->windows); bridge->dev.parent = dev; bridge->sysdata = pcie; bridge->busnr = pcie->root_bus_nr;@@ -884,7 +848,6 @@ static int altera_pcie_remove(struct platform_device *pdev)pci_stop_root_bus (bridge->bus);pci_remove_root_bus (bridge->bus); -pci_free_resource_list (&pcie->resources);altera_pcie_irq_teardown (pcie);return 0 ;Signature · 1 line
2.20.1
Rob Herring
maintainerPATCH v2 5/25 PCI: dwc: Use pci_parse_request_of_pci_ranges()
In reply to Rob HerringConvert the Designware host bridge to use the common pci_parse_request_of_pci_ranges().
---
v2:
- New patch
.../pci/controller/dwc/pcie-designware-host.c | 28 ++++++------------- 1 file changed, 8 insertions(+), 20 deletions(-)
drivers/pci/controller/dwc/pcie-designware-host.c +8 -20
@@ -319,7 +319,7 @@ int dw_pcie_host_init(struct pcie_port *pp)struct device *dev = pci->dev;struct device_node *np = dev->of_node;struct platform_device *pdev =to_platform_device (dev); -struct resource_entry *win, *tmp; +struct resource_entry *win;struct pci_bus *child;struct pci_host_bridge *bridge;struct resource *cfg_res;
@@ -342,31 +342,19 @@ int dw_pcie_host_init(struct pcie_port *pp)if (!bridge)return -ENOMEM ; - ret =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , - &bridge->windows, &pp->io_base); -if (ret) -return ret; - - ret =devm_request_pci_bus_resources (dev, &bridge->windows); + ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows,NULL );if (ret)return ret;/* Get the I/O and memory ranges from DT */ -resource_list_for_each_entry_safe (win, tmp, &bridge->windows) { +resource_list_for_each_entry (win, &bridge->windows) {switch (resource_type (win->res)) {case IORESOURCE_IO : - ret =devm_pci_remap_iospace (dev, win->res, - pp->io_base); -if (ret) { -dev_warn (dev,"Error %d: failed to map resource %pR\n" , - ret, win->res); -resource_list_destroy_entry (win); - }else { - pp->io = win->res; - pp->io->name ="I/O" ; - pp->io_size =resource_size (pp->io); - pp->io_bus_addr = pp->io->start - win->offset; - } + pp->io = win->res; + pp->io->name ="I/O" ; + pp->io_size =resource_size (pp->io); + pp->io_bus_addr = pp->io->start - win->offset; + pp->io_base =pci_pio_to_address (pp->io->start);break ;case IORESOURCE_MEM : pp->mem = win->res;
--
2.20.1
Re: [PATCH v2 05/25] PCI: dwc: Use pci_parse_request_of_pci_ranges()
Quoted 55 lines · Rob Herring
Convert the Designware host bridge to use the common
pci_parse_request_of_pci_ranges().Cc Jingoo Han <[email protected]>Cc Gustavo Pimentel <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Andrew Murray <[email protected]>Cc Bjorn Helgaas <[email protected]>Signed-off-by Rob Herring <[email protected]>---
v2:
- New patch.../pci/controller/dwc/pcie-designware-host.c | 28 ++++++------------- 1 file changed, 8 insertions(+), 20 deletions(-)drivers/pci/controller/dwc/pcie-designware-host.c +3
-15@@ -319,7 +319,7 @@ int dw_pcie_host_init(struct pcie_port *pp)struct device *dev = pci->dev;struct device_node *np = dev->of_node;struct platform_device *pdev =to_platform_device (dev); -struct resource_entry *win, *tmp; +struct resource_entry *win;struct pci_bus *child;struct pci_host_bridge *bridge;struct resource *cfg_res;@@ -342,31 +342,19 @@ int dw_pcie_host_init(struct pcie_port *pp)if (!bridge)return -ENOMEM ; - ret =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , - &bridge->windows, &pp->io_base); -if (ret) -return ret; - - ret =devm_request_pci_bus_resources (dev, &bridge->windows); + ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows,NULL );if (ret)return ret;/* Get the I/O and memory ranges from DT */ -resource_list_for_each_entry_safe (win, tmp, &bridge->windows) { +resource_list_for_each_entry (win, &bridge->windows) {switch (resource_type (win->res)) {case IORESOURCE_IO : - ret =devm_pci_remap_iospace (dev, win->res, - pp->io_base); -if (ret) { -dev_warn (dev,"Error %d: failed to map resource %pR\n" , - ret, win->res); -resource_list_destroy_entry (win); - }else {
drivers/pci/controller/dwc/pcie-designware-host.c int dw_pcie_host_init(struct pcie_port *pp) · line 357
Quoted 10 lines
drivers/pci/controller/dwc/pcie-designware-host.c +5
-5- pp->io = win->res; - pp->io->name ="I/O" ; - pp->io_size =resource_size (pp->io); - pp->io_bus_addr = pp->io->start - win->offset; - } + pp->io = win->res; + pp->io->name ="I/O" ; + pp->io_size =resource_size (pp->io); + pp->io_bus_addr = pp->io->start - win->offset; + pp->io_base =pci_pio_to_address (pp->io->start);
Where did io_base come from? This wasn't here before, so why are we setting it now?
Does this fix any issue?
Thanks,
Andrew Murray
Quoted 5 lines
drivers/pci/controller/dwc/pcie-designware-host.c +0
-1break ;case IORESOURCE_MEM : pp->mem = win->res; --2.20.1
Rob Herring
maintainerRe: [PATCH v2 05/25] PCI: dwc: Use pci_parse_request_of_pci_ranges()
Quoted 37 lines · Andrew Murray
Quoted 35 lines · Rob Herring
Convert the Designware host bridge to use the common
pci_parse_request_of_pci_ranges().Cc Jingoo Han <[email protected]>Cc Gustavo Pimentel <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Andrew Murray <[email protected]>Cc Bjorn Helgaas <[email protected]>Signed-off-by Rob Herring <[email protected]>---
v2:
- New patch.../pci/controller/dwc/pcie-designware-host.c | 28 ++++++------------- 1 file changed, 8 insertions(+), 20 deletions(-)drivers/pci/controller/dwc/pcie-designware-host.c +1
-3@@ -319,7 +319,7 @@ int dw_pcie_host_init(struct pcie_port *pp)struct device *dev = pci->dev;struct device_node *np = dev->of_node;struct platform_device *pdev =to_platform_device (dev); -struct resource_entry *win, *tmp; +struct resource_entry *win;struct pci_bus *child;struct pci_host_bridge *bridge;struct resource *cfg_res;@@ -342,31 +342,19 @@ int dw_pcie_host_init(struct pcie_port *pp)if (!bridge)return -ENOMEM ; - ret =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , - &bridge->windows, &pp->io_base);
[...]
Quoted 5 lines
drivers/pci/controller/dwc/pcie-designware-host.c int dw_pcie_host_init(struct pcie_port *pp) · line 357
Quoted 2 lines
drivers/pci/controller/dwc/pcie-designware-host.c +2
-0+ pp->io_bus_addr = pp->io->start - win->offset; + pp->io_base =pci_pio_to_address (pp->io->start);Where did
io_basecome from? This wasn't here before, so why are we setting it now?
It was set in the removed devm_of_pci_get_host_bridge_resources().
Rob
Rob Herring
maintainerPATCH v2 6/25 PCI: faraday: Use pci_parse_request_of_pci_ranges
In reply to Rob HerringConvert the Faraday host bridge to use the commonpci_parse_request_of_pci_ranges().
There's no need to assign the resources to a temporary list first. Just use bridge->windows directly and remove all the temporary list handling.
---
v2:
- New patch
drivers/pci/controller/pci-ftpci100.c | 51 ++++++--------------------- 1 file changed, 11 insertions(+), 40 deletions(-)
drivers/pci/controller/pci-ftpci100.c +11 -40
@@ -430,10 +430,8 @@ static int faraday_pci_probe(struct platform_device *pdev)const struct faraday_pci_variant *variant =of_device_get_match_data (dev);struct resource *regs; -resource_size_t io_base;struct resource_entry *win;struct faraday_pci *p; -struct resource *mem;struct resource *io;struct pci_host_bridge *host;struct clk *clk;
@@ -441,7 +439,6 @@ static int faraday_pci_probe(struct platform_device *pdev)unsigned char cur_bus_speed = PCI_SPEED_33MHz;int ret;u32 val; -LIST_HEAD (res); host =devm_pci_alloc_host_bridge (dev,sizeof (*p));if (!host)
@@ -480,44 +477,20 @@ static int faraday_pci_probe(struct platform_device *pdev)if (IS_ERR (p->base))return PTR_ERR (p->base); - ret =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , - &res, &io_base); + ret =pci_parse_request_of_pci_ranges (dev, &host->windows,NULL );if (ret)return ret; - ret =devm_request_pci_bus_resources (dev, &res); -if (ret) -return ret; - -/* Get the I/O and memory ranges from DT */ -resource_list_for_each_entry (win, &res) { -switch (resource_type (win->res)) { -case IORESOURCE_IO : - io = win->res; - io->name ="Gemini PCI I/O" ; -if (!faraday_res_to_memcfg (io->start - win->offset, -resource_size (io), &val)) { -/* setup I/O space size */ -writel (val, p->base +PCI_IOSIZE ); - }else { -dev_err (dev,"illegal IO mem size\n" ); -return -EINVAL ; - } - ret =devm_pci_remap_iospace (dev, io, io_base); -if (ret) { -dev_warn (dev,"error %d: failed to map resource %pR\n" , - ret, io); -continue ; - } -break ; -case IORESOURCE_MEM : - mem = win->res; - mem->name ="Gemini PCI MEM" ; -break ; -case IORESOURCE_BUS : -break ; -default : -break ; + win =resource_list_get_entry_of_type (&host->windows,IORESOURCE_IO ); +if (win) { + io = win->res; +if (!faraday_res_to_memcfg (io->start - win->offset, +resource_size (io), &val)) { +/* setup I/O space size */ +writel (val, p->base +PCI_IOSIZE ); + }else { +dev_err (dev,"illegal IO mem size\n" ); +return -EINVAL ; } }
@@ -569,7 +542,6 @@ static int faraday_pci_probe(struct platform_device *pdev)if (ret)return ret; -list_splice_init (&res, &host->windows); ret =pci_scan_root_bus_bridge (host);if (ret) {dev_err (dev,"failed to scan host: %d\n" , ret);
@@ -581,7 +553,6 @@ static int faraday_pci_probe(struct platform_device *pdev)pci_bus_assign_resources (p->bus);pci_bus_add_devices (p->bus); -pci_free_resource_list (&res);return 0 ; }
--
2.20.1
Re: [PATCH v2 06/25] PCI: faraday: Use pci_parse_request_of_pci_ranges
Quoted 6 lines · Rob Herring
Convert the Faraday host bridge to use the common
pci_parse_request_of_pci_ranges().There's no need to assign the resources to a temporary list first. Just use
bridge->windowsdirectly and remove all the temporary list handling.
Quoted 8 lines
Cc Lorenzo Pieralisi <[email protected]>Cc Andrew Murray <[email protected]>Cc Bjorn Helgaas <[email protected]>Signed-off-by Rob Herring <[email protected]>---
v2:
- New patch
Quoted 100 lines
drivers/pci/controller/pci-ftpci100.c | 51 ++++++--------------------- 1 file changed, 11 insertions(+), 40 deletions(-)drivers/pci/controller/pci-ftpci100.c +11
-41@@ -430,10 +430,8 @@ static int faraday_pci_probe(struct platform_device *pdev)const struct faraday_pci_variant *variant =of_device_get_match_data (dev);struct resource *regs; -resource_size_t io_base;struct resource_entry *win;struct faraday_pci *p; -struct resource *mem;struct resource *io;struct pci_host_bridge *host;struct clk *clk;@@ -441,7 +439,6 @@ static int faraday_pci_probe(struct platform_device *pdev)unsigned char cur_bus_speed = PCI_SPEED_33MHz;int ret;u32 val; -LIST_HEAD (res); host =devm_pci_alloc_host_bridge (dev,sizeof (*p));if (!host)@@ -480,44 +477,20 @@ static int faraday_pci_probe(struct platform_device *pdev)if (IS_ERR (p->base))return PTR_ERR (p->base); - ret =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , - &res, &io_base); + ret =pci_parse_request_of_pci_ranges (dev, &host->windows,NULL );if (ret)return ret; - ret =devm_request_pci_bus_resources (dev, &res); -if (ret) -return ret; - -/* Get the I/O and memory ranges from DT */ -resource_list_for_each_entry (win, &res) { -switch (resource_type (win->res)) { -case IORESOURCE_IO : - io = win->res; - io->name ="Gemini PCI I/O" ; -if (!faraday_res_to_memcfg (io->start - win->offset, -resource_size (io), &val)) { -/* setup I/O space size */ -writel (val, p->base +PCI_IOSIZE ); - }else { -dev_err (dev,"illegal IO mem size\n" ); -return -EINVAL ; - } - ret =devm_pci_remap_iospace (dev, io, io_base); -if (ret) { -dev_warn (dev,"error %d: failed to map resource %pR\n" , - ret, io); -continue ; - } -break ; -case IORESOURCE_MEM : - mem = win->res; - mem->name ="Gemini PCI MEM" ; -break ; -case IORESOURCE_BUS : -break ; -default : -break ; + win =resource_list_get_entry_of_type (&host->windows,IORESOURCE_IO ); +if (win) { + io = win->res; +if (!faraday_res_to_memcfg (io->start - win->offset, +resource_size (io), &val)) { +/* setup I/O space size */ +writel (val, p->base +PCI_IOSIZE ); + }else { +dev_err (dev,"illegal IO mem size\n" ); +return -EINVAL ; } }@@ -569,7 +542,6 @@ static int faraday_pci_probe(struct platform_device *pdev)if (ret)return ret; -list_splice_init (&res, &host->windows); ret =pci_scan_root_bus_bridge (host);if (ret) {dev_err (dev,"failed to scan host: %d\n" , ret);@@ -581,7 +553,6 @@ static int faraday_pci_probe(struct platform_device *pdev)pci_bus_assign_resources (p->bus);pci_bus_add_devices (p->bus); -pci_free_resource_list (&res);return 0 ; } --2.20.1
Rob Herring
maintainerPATCH v2 7/25 PCI: iproc: Use pci_parse_request_of_pci_ranges()
In reply to Rob HerringConvert the iProc host bridge to use the common pci_parse_request_of_pci_ranges().
There's no need to assign the resources to a temporary list, so just use bridge->windows directly.
---
v2:
- New patch
drivers/pci/controller/pcie-iproc-platform.c | 8 ++------ drivers/pci/controller/pcie-iproc.c | 5 ----- 2 files changed, 2 insertions(+), 11 deletions(-)
drivers/pci/controller/pcie-iproc-platform.c +2 -6
@@ -43,8 +43,6 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev)struct iproc_pcie *pcie;struct device_node *np = dev->of_node;struct resource reg; -resource_size_t iobase =0 ; -LIST_HEAD (resources);struct pci_host_bridge *bridge;int ret;
@@ -97,8 +95,7 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev)if (IS_ERR (pcie->phy))return PTR_ERR (pcie->phy); - ret =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , &resources, - &iobase); + ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows,NULL );if (ret) {dev_err (dev,"unable to get PCI host bridge resources\n" );return ret;
@@ -113,10 +110,9 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev) pcie->map_irq = of_irq_parse_and_map_pci; } - ret =iproc_pcie_setup (pcie, &resources); + ret =iproc_pcie_setup (pcie, &bridge->windows);if (ret) {dev_err (dev,"PCIe controller setup failed\n" ); -pci_free_resource_list (&resources);return ret; }
drivers/pci/controller/pcie-iproc.c +0 -5
@@ -1498,10 +1498,6 @@ int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res)return ret; } - ret =devm_request_pci_bus_resources (dev, res); -if (ret) -return ret; - ret =phy_init (pcie->phy);if (ret) {dev_err (dev,"unable to initialize PCIe PHY\n" );
@@ -1543,7 +1539,6 @@ int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res)if (iproc_pcie_msi_enable (pcie))dev_info (dev,"not using iProc MSI\n" ); -list_splice_init (res, &host->windows); host->busnr =0 ; host->dev.parent = dev; host->ops = &iproc_pcie_ops;
--
2.20.1
Re: [PATCH v2 07/25] PCI: iproc: Use pci_parse_request_of_pci_ranges()
Quoted 13 lines · Rob Herring
Convert the iProc host bridge to use the common
pci_parse_request_of_pci_ranges().There's no need to assign the resources to a temporary list, so just use
bridge->windowsdirectly.Cc Lorenzo Pieralisi <[email protected]>Cc Andrew Murray <[email protected]>Cc Bjorn Helgaas <[email protected]>Cc Ray Jui <[email protected]>Cc Scott Branden <[email protected]>Signed-off-by Rob Herring <[email protected]>
Quoted 3 lines
---
v2:
- New patch
Quoted 65 lines
drivers/pci/controller/pcie-iproc-platform.c | 8 ++------ drivers/pci/controller/pcie-iproc.c | 5 ----- 2 files changed, 2 insertions(+), 11 deletions(-)drivers/pci/controller/pcie-iproc-platform.c +2
-6@@ -43,8 +43,6 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev)struct iproc_pcie *pcie;struct device_node *np = dev->of_node;struct resource reg; -resource_size_t iobase =0 ; -LIST_HEAD (resources);struct pci_host_bridge *bridge;int ret;@@ -97,8 +95,7 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev)if (IS_ERR (pcie->phy))return PTR_ERR (pcie->phy); - ret =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , &resources, - &iobase); + ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows,NULL );if (ret) {dev_err (dev,"unable to get PCI host bridge resources\n" );return ret;@@ -113,10 +110,9 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev) pcie->map_irq = of_irq_parse_and_map_pci; } - ret =iproc_pcie_setup (pcie, &resources); + ret =iproc_pcie_setup (pcie, &bridge->windows);if (ret) {dev_err (dev,"PCIe controller setup failed\n" ); -pci_free_resource_list (&resources);return ret; }drivers/pci/controller/pcie-iproc.c +0
-6@@ -1498,10 +1498,6 @@ int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res)return ret; } - ret =devm_request_pci_bus_resources (dev, res); -if (ret) -return ret; - ret =phy_init (pcie->phy);if (ret) {dev_err (dev,"unable to initialize PCIe PHY\n" );@@ -1543,7 +1539,6 @@ int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res)if (iproc_pcie_msi_enable (pcie))dev_info (dev,"not using iProc MSI\n" ); -list_splice_init (res, &host->windows); host->busnr =0 ; host->dev.parent = dev; host->ops = &iproc_pcie_ops; --2.20.1
Rob Herring
maintainerPATCH v2 8/25 PCI: mediatek: Use pci_parse_request_of_pci_ranges()
In reply to Rob HerringConvert Mediatek host bridge to use the common pci_parse_request_of_pci_ranges().
---
v2:
- Use resource_list_get_entry_of_type
--- drivers/pci/controller/pcie-mediatek.c | 43 ++++++++------------------ 1 file changed, 13 insertions(+), 30 deletions(-)
drivers/pci/controller/pcie-mediatek.c +13 -30
@@ -216,7 +216,6 @@ struct mtk_pcie {void __iomem *base;struct clk *free_ck; -struct resource mem;struct list_head ports;const struct mtk_pcie_soc *soc;unsigned int busnr;
@@ -661,11 +660,19 @@ static int mtk_pcie_setup_irq(struct mtk_pcie_port *port,static int mtk_pcie_startup_port_v2 (struct mtk_pcie_port *port) {struct mtk_pcie *pcie = port->pcie; -struct resource *mem = &pcie->mem; +struct pci_host_bridge *host =pci_host_bridge_from_priv (pcie); +struct resource *mem =NULL ; +struct resource_entry *entry;const struct mtk_pcie_soc *soc = port->pcie->soc;u32 val;int err; + entry =resource_list_get_entry_of_type (&host->windows,IORESOURCE_MEM ); +if (entry) + mem = entry->res; +if (!mem) +return -EINVAL ; +/* MT7622 platforms need to enable LTSSM and ASPM from PCIe subsys */ if (pcie->base) { val =readl (pcie->base +PCIE_SYS_CFG_V2 );
@@ -1023,39 +1030,15 @@ static int mtk_pcie_setup(struct mtk_pcie *pcie)struct mtk_pcie_port *port, *tmp;struct pci_host_bridge *host =pci_host_bridge_from_priv (pcie);struct list_head *windows = &host->windows; -struct resource_entry *win, *tmp_win; -resource_size_t io_base; +struct resource *bus;int err; - err =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , - windows, &io_base); + err =pci_parse_request_of_pci_ranges (dev, windows, + &bus);if (err)return err; - err =devm_request_pci_bus_resources (dev, windows); -if (err <0 ) -return err; - -/* Get the I/O and memory ranges from DT */ -resource_list_for_each_entry_safe (win, tmp_win, windows) { -switch (resource_type (win->res)) { -case IORESOURCE_IO : - err =devm_pci_remap_iospace (dev, win->res, io_base); -if (err) { -dev_warn (dev,"error %d: failed to map resource %pR\n" , - err, win->res); -resource_list_destroy_entry (win); - } -break ; -case IORESOURCE_MEM : -memcpy (&pcie->mem, win->res,sizeof (*win->res)); - pcie->mem.name ="non-prefetchable" ; -break ; -case IORESOURCE_BUS : - pcie->busnr = win->res->start; -break ; - } - } + pcie->busnr = bus->start;for_each_available_child_of_node (node, child) {int slot;
Signature · 1 line
2.20.1
Rob Herring
maintainerPATCH v2 9/25 PCI: mobiveil: Use pci_parse_request_of_pci_ranges()
In reply to Rob HerringConvert the Mobiveil host bridge to use the common pci_parse_request_of_pci_ranges().
There's no need to assign the resources to a temporary list first. Just use bridge->windows directly and remove all the temporary list handling.
---
v2:
- New patch
drivers/pci/controller/pcie-mobiveil.c | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-)
drivers/pci/controller/pcie-mobiveil.c +7 -19
@@ -140,7 +140,6 @@ struct mobiveil_msi { /* MSI information */struct mobiveil_pcie {struct platform_device *pdev; -struct list_head resources;void __iomem *config_axi_slave_base;/* endpoint config base */ void __iomem *csr_axi_slave_base;/* root port config base */ void __iomem *apb_csr_base;/* MSI register base */
@@ -575,6 +574,7 @@ static void mobiveil_pcie_enable_msi(struct mobiveil_pcie *pcie)static int mobiveil_host_init (struct mobiveil_pcie *pcie) { +struct pci_host_bridge *bridge =pci_host_bridge_from_priv (pcie);u32 value, pab_ctrl, type;struct resource_entry *win;
@@ -631,7 +631,7 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie)program_ib_windows (pcie,WIN_NUM_0 ,0 ,0 ,MEM_WINDOW_TYPE ,IB_WIN_SIZE );/* Get the I/O and memory ranges from DT */ -resource_list_for_each_entry (win, &pcie->resources) { +resource_list_for_each_entry (win, &bridge->windows) {if (resource_type (win->res) ==IORESOURCE_MEM ) type =MEM_WINDOW_TYPE ;else if (resource_type (win->res) ==IORESOURCE_IO )
@@ -857,7 +857,6 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)struct pci_bus *child;struct pci_host_bridge *bridge;struct device *dev = &pdev->dev; -resource_size_t iobase;int ret;/* allocate the PCIe port */
@@ -875,11 +874,8 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)return ret; } -INIT_LIST_HEAD (&pcie->resources); -/* parse the host bridge base addresses from the device tree file */ - ret =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , - &pcie->resources, &iobase); + ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows,NULL );if (ret) {dev_err (dev,"Getting bridge resources failed\n" );return ret;
@@ -892,24 +888,19 @@ static int mobiveil_pcie_probe(struct platform_device *pdev) ret =mobiveil_host_init (pcie);if (ret) {dev_err (dev,"Failed to initialize host\n" ); - goto error; +return ret; }/* initialize the IRQ domains */ ret =mobiveil_pcie_init_irq_domain (pcie);if (ret) {dev_err (dev,"Failed creating IRQ Domain\n" ); - goto error; +return ret; }irq_set_chained_handler_and_data (pcie->irq, mobiveil_pcie_isr, pcie); - ret =devm_request_pci_bus_resources (dev, &pcie->resources); -if (ret) - goto error; -/* Initialize bridge */ -list_splice_init (&pcie->resources, &bridge->windows); bridge->dev.parent = dev; bridge->sysdata = pcie; bridge->busnr = pcie->root_bus_nr;
@@ -920,13 +911,13 @@ static int mobiveil_pcie_probe(struct platform_device *pdev) ret =mobiveil_bringup_link (pcie);if (ret) {dev_info (dev,"link bring-up failed\n" ); - goto error; +return ret; }/* setup the kernel resources for the newly added PCIe root bus */ ret =pci_scan_root_bus_bridge (bridge);if (ret) - goto error; +return ret; bus = bridge->bus;
@@ -936,9 +927,6 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)pci_bus_add_devices (bus);return 0 ; -error: -pci_free_resource_list (&pcie->resources); -return ret; }static const struct of_device_id mobiveil_pcie_of_match[] = {
--
2.20.1
Re: [PATCH v2 09/25] PCI: mobiveil: Use pci_parse_request_of_pci_ranges()
Quoted 6 lines · Rob Herring
Convert the Mobiveil host bridge to use the common
pci_parse_request_of_pci_ranges().There's no need to assign the resources to a temporary list first. Just use
bridge->windowsdirectly and remove all the temporary list handling.
Quoted 7 lines
Cc Karthikeyan Mitran <[email protected]>Cc Hou Zhiqiang <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Andrew Murray <[email protected]>Cc Bjorn Helgaas <[email protected]>Signed-off-by Rob Herring <[email protected]>---
Quoted 111 lines
v2:
- New patchdrivers/pci/controller/pcie-mobiveil.c | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-)drivers/pci/controller/pcie-mobiveil.c +7
-20@@ -140,7 +140,6 @@ struct mobiveil_msi { /* MSI information */struct mobiveil_pcie {struct platform_device *pdev; -struct list_head resources;void __iomem *config_axi_slave_base;/* endpoint config base */ void __iomem *csr_axi_slave_base;/* root port config base */ void __iomem *apb_csr_base;/* MSI register base */ @@ -575,6 +574,7 @@ static void mobiveil_pcie_enable_msi(struct mobiveil_pcie *pcie)static int mobiveil_host_init (struct mobiveil_pcie *pcie) { +struct pci_host_bridge *bridge =pci_host_bridge_from_priv (pcie);u32 value, pab_ctrl, type;struct resource_entry *win;@@ -631,7 +631,7 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie)program_ib_windows (pcie,WIN_NUM_0 ,0 ,0 ,MEM_WINDOW_TYPE ,IB_WIN_SIZE );/* Get the I/O and memory ranges from DT */ -resource_list_for_each_entry (win, &pcie->resources) { +resource_list_for_each_entry (win, &bridge->windows) {if (resource_type (win->res) ==IORESOURCE_MEM ) type =MEM_WINDOW_TYPE ;else if (resource_type (win->res) ==IORESOURCE_IO )@@ -857,7 +857,6 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)struct pci_bus *child;struct pci_host_bridge *bridge;struct device *dev = &pdev->dev; -resource_size_t iobase;int ret;/* allocate the PCIe port */ @@ -875,11 +874,8 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)return ret; } -INIT_LIST_HEAD (&pcie->resources); -/* parse the host bridge base addresses from the device tree file */ - ret =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , - &pcie->resources, &iobase); + ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows,NULL );if (ret) {dev_err (dev,"Getting bridge resources failed\n" );return ret;@@ -892,24 +888,19 @@ static int mobiveil_pcie_probe(struct platform_device *pdev) ret =mobiveil_host_init (pcie);if (ret) {dev_err (dev,"Failed to initialize host\n" ); - goto error; +return ret; }/* initialize the IRQ domains */ ret =mobiveil_pcie_init_irq_domain (pcie);if (ret) {dev_err (dev,"Failed creating IRQ Domain\n" ); - goto error; +return ret; }irq_set_chained_handler_and_data (pcie->irq, mobiveil_pcie_isr, pcie); - ret =devm_request_pci_bus_resources (dev, &pcie->resources); -if (ret) - goto error; -/* Initialize bridge */ -list_splice_init (&pcie->resources, &bridge->windows); bridge->dev.parent = dev; bridge->sysdata = pcie; bridge->busnr = pcie->root_bus_nr;@@ -920,13 +911,13 @@ static int mobiveil_pcie_probe(struct platform_device *pdev) ret =mobiveil_bringup_link (pcie);if (ret) {dev_info (dev,"link bring-up failed\n" ); - goto error; +return ret; }/* setup the kernel resources for the newly added PCIe root bus */ ret =pci_scan_root_bus_bridge (bridge);if (ret) - goto error; +return ret; bus = bridge->bus;@@ -936,9 +927,6 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)pci_bus_add_devices (bus);return 0 ; -error: -pci_free_resource_list (&pcie->resources); -return ret; }static const struct of_device_id mobiveil_pcie_of_match[] = { --2.20.1
Rob Herring
maintainerPATCH v2 10/25 PCI: rockchip: Use pci_parse_request_of_pci_ranges()
In reply to Rob HerringConvert the Rockchip host bridge to use the common pci_parse_request_of_pci_ranges().
There's no need to assign the resources to a temporary list first. Just use bridge->windows directly and remove all the temporary list handling.
---
v2:
- New patch
drivers/pci/controller/pcie-rockchip-host.c | 36 ++++----------------- 1 file changed, 7 insertions(+), 29 deletions(-)
drivers/pci/controller/pcie-rockchip-host.c +7 -29
@@ -950,14 +950,10 @@ static int rockchip_pcie_probe(struct platform_device *pdev)struct device *dev = &pdev->dev;struct pci_bus *bus, *child;struct pci_host_bridge *bridge; +struct resource *bus_res;struct resource_entry *win; -resource_size_t io_base; -struct resource *mem; -struct resource *io;int err; -LIST_HEAD (res); -if (!dev->of_node)return -ENODEV ;
@@ -995,29 +991,20 @@ static int rockchip_pcie_probe(struct platform_device *pdev)if (err <0 ) goto err_deinit_port; - err =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , - &res, &io_base); + err =pci_parse_request_of_pci_ranges (dev, &bridge->windows, &bus_res);if (err) goto err_remove_irq_domain; - err =devm_request_pci_bus_resources (dev, &res); -if (err) - goto err_free_res; + rockchip->root_bus_nr = bus_res->start;/* Get the I/O and memory ranges from DT */ -resource_list_for_each_entry (win, &res) { +resource_list_for_each_entry (win, &bridge->windows) {switch (resource_type (win->res)) {case IORESOURCE_IO : io = win->res; io->name ="I/O" ; rockchip->io_size =resource_size (io); rockchip->io_bus_addr = io->start - win->offset; - err =pci_remap_iospace (io, io_base); -if (err) { -dev_warn (dev,"error %d: failed to map resource %pR\n" , - err, io); -continue ; - } rockchip->io = io;break ;case IORESOURCE_MEM :
@@ -1026,9 +1013,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev) rockchip->mem_size =resource_size (mem); rockchip->mem_bus_addr = mem->start - win->offset;break ; -case IORESOURCE_BUS : - rockchip->root_bus_nr = win->res->start; -break ;default :continue ; }
@@ -1036,15 +1020,14 @@ static int rockchip_pcie_probe(struct platform_device *pdev) err =rockchip_pcie_cfg_atu (rockchip);if (err) - goto err_unmap_iospace; + goto err_remove_irq_domain; rockchip->msg_region =devm_ioremap (dev, rockchip->msg_bus_addr,SZ_1M );if (!rockchip->msg_region) { err = -ENOMEM ; - goto err_unmap_iospace; + goto err_remove_irq_domain; } -list_splice_init (&res, &bridge->windows); bridge->dev.parent = dev; bridge->sysdata = rockchip; bridge->busnr =0 ;
@@ -1054,7 +1037,7 @@ static int rockchip_pcie_probe(struct platform_device *pdev) err =pci_scan_root_bus_bridge (bridge);if (err <0 ) - goto err_unmap_iospace; + goto err_remove_irq_domain; bus = bridge->bus;
@@ -1068,10 +1051,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)pci_bus_add_devices (bus);return 0 ; -err_unmap_iospace: -pci_unmap_iospace (rockchip->io); -err_free_res: -pci_free_resource_list (&res); err_remove_irq_domain:irq_domain_remove (rockchip->irq_domain); err_deinit_port:
@@ -1097,7 +1076,6 @@ static int rockchip_pcie_remove(struct platform_device *pdev)pci_stop_root_bus (rockchip->root_bus);pci_remove_root_bus (rockchip->root_bus); -pci_unmap_iospace (rockchip->io);irq_domain_remove (rockchip->irq_domain);rockchip_pcie_deinit_phys (rockchip);
--
2.20.1
Re: [PATCH v2 10/25] PCI: rockchip: Use pci_parse_request_of_pci_ranges()
Quoted 52 lines · Rob Herring
Convert the Rockchip host bridge to use the common
pci_parse_request_of_pci_ranges().There's no need to assign the resources to a temporary list first. Just use
bridge->windowsdirectly and remove all the temporary list handling.Cc Shawn Lin <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Andrew Murray <[email protected]>Cc Bjorn Helgaas <[email protected]>Cc Heiko Stuebner <[email protected]>Signed-off-by Rob Herring <[email protected]>---
v2:
- New patchdrivers/pci/controller/pcie-rockchip-host.c | 36 ++++----------------- 1 file changed, 7 insertions(+), 29 deletions(-)drivers/pci/controller/pcie-rockchip-host.c +2
-9@@ -950,14 +950,10 @@ static int rockchip_pcie_probe(struct platform_device *pdev)struct device *dev = &pdev->dev;struct pci_bus *bus, *child;struct pci_host_bridge *bridge; +struct resource *bus_res;struct resource_entry *win; -resource_size_t io_base; -struct resource *mem; -struct resource *io;int err; -LIST_HEAD (res); -if (!dev->of_node)return -ENODEV ;@@ -995,29 +991,20 @@ static int rockchip_pcie_probe(struct platform_device *pdev)if (err <0 ) goto err_deinit_port; - err =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , - &res, &io_base); + err =pci_parse_request_of_pci_ranges (dev, &bridge->windows, &bus_res);if (err) goto err_remove_irq_domain; - err =devm_request_pci_bus_resources (dev, &res); -if (err)
drivers/pci/controller/pcie-rockchip-host.c static int rockchip_pcie_probe(struct platform_device *pdev) · line 1005
Quoted 10 lines
drivers/pci/controller/pcie-rockchip-host.c +2
-2- goto err_free_res; + rockchip->root_bus_nr = bus_res->start;/* Get the I/O and memory ranges from DT */ -resource_list_for_each_entry (win, &res) { +resource_list_for_each_entry (win, &bridge->windows) {switch (resource_type (win->res)) {case IORESOURCE_IO : io = win->res; io->name ="I/O" ;
In some patches of this series we drop the custom naming of memory resources, yet in others, like this one, we preserve the custom naming.
Should we be consistent in preserving the existing naming?
Thanks,
Andrew Murray
Quoted 69 lines
drivers/pci/controller/pcie-rockchip-host.c +3
-19rockchip->io_size =resource_size (io); rockchip->io_bus_addr = io->start - win->offset; - err =pci_remap_iospace (io, io_base); -if (err) { -dev_warn (dev,"error %d: failed to map resource %pR\n" , - err, io); -continue ; - } rockchip->io = io;break ;case IORESOURCE_MEM :@@ -1026,9 +1013,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev) rockchip->mem_size =resource_size (mem); rockchip->mem_bus_addr = mem->start - win->offset;break ; -case IORESOURCE_BUS : - rockchip->root_bus_nr = win->res->start; -break ;default :continue ; }@@ -1036,15 +1020,14 @@ static int rockchip_pcie_probe(struct platform_device *pdev) err =rockchip_pcie_cfg_atu (rockchip);if (err) - goto err_unmap_iospace; + goto err_remove_irq_domain; rockchip->msg_region =devm_ioremap (dev, rockchip->msg_bus_addr,SZ_1M );if (!rockchip->msg_region) { err = -ENOMEM ; - goto err_unmap_iospace; + goto err_remove_irq_domain; } -list_splice_init (&res, &bridge->windows); bridge->dev.parent = dev; bridge->sysdata = rockchip; bridge->busnr =0 ;@@ -1054,7 +1037,7 @@ static int rockchip_pcie_probe(struct platform_device *pdev) err =pci_scan_root_bus_bridge (bridge);if (err <0 ) - goto err_unmap_iospace; + goto err_remove_irq_domain; bus = bridge->bus;@@ -1068,10 +1051,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)pci_bus_add_devices (bus);return 0 ; -err_unmap_iospace: -pci_unmap_iospace (rockchip->io); -err_free_res: -pci_free_resource_list (&res); err_remove_irq_domain:irq_domain_remove (rockchip->irq_domain); err_deinit_port:@@ -1097,7 +1076,6 @@ static int rockchip_pcie_remove(struct platform_device *pdev)pci_stop_root_bus (rockchip->root_bus);pci_remove_root_bus (rockchip->root_bus); -pci_unmap_iospace (rockchip->io);irq_domain_remove (rockchip->irq_domain);rockchip_pcie_deinit_phys (rockchip); --2.20.1
Rob Herring
maintainerRe: [PATCH v2 10/25] PCI: rockchip: Use pci_parse_request_of_pci_ranges()
Quoted 57 lines · Andrew Murray
Quoted 55 lines · Rob Herring
Convert the Rockchip host bridge to use the common
pci_parse_request_of_pci_ranges().There's no need to assign the resources to a temporary list first. Just use
bridge->windowsdirectly and remove all the temporary list handling.Cc Shawn Lin <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Andrew Murray <[email protected]>Cc Bjorn Helgaas <[email protected]>Cc Heiko Stuebner <[email protected]>Signed-off-by Rob Herring <[email protected]>---
v2:
- New patchdrivers/pci/controller/pcie-rockchip-host.c | 36 ++++----------------- 1 file changed, 7 insertions(+), 29 deletions(-)drivers/pci/controller/pcie-rockchip-host.c +3
-10@@ -950,14 +950,10 @@ static int rockchip_pcie_probe(struct platform_device *pdev)struct device *dev = &pdev->dev;struct pci_bus *bus, *child;struct pci_host_bridge *bridge; +struct resource *bus_res;struct resource_entry *win; -resource_size_t io_base; -struct resource *mem; -struct resource *io;int err; -LIST_HEAD (res); -if (!dev->of_node)return -ENODEV ;@@ -995,29 +991,20 @@ static int rockchip_pcie_probe(struct platform_device *pdev)if (err <0 ) goto err_deinit_port; - err =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , - &res, &io_base); + err =pci_parse_request_of_pci_ranges (dev, &bridge->windows, &bus_res);if (err) goto err_remove_irq_domain; - err =devm_request_pci_bus_resources (dev, &res); -if (err) - goto err_free_res; + rockchip->root_bus_nr = bus_res->start;
Quoted 10 lines
drivers/pci/controller/pcie-rockchip-host.c static int rockchip_pcie_probe(struct platform_device *pdev) · line 1005
Quoted 7 lines
drivers/pci/controller/pcie-rockchip-host.c +1
-1/* Get the I/O and memory ranges from DT */ -resource_list_for_each_entry (win, &res) { +resource_list_for_each_entry (win, &bridge->windows) {switch (resource_type (win->res)) {case IORESOURCE_IO : io = win->res; io->name ="I/O" ;In some patches of this series we drop the custom naming of memory resources, yet in others, like this one, we preserve the custom naming.
Actually, patch #11 drops it for rockchip.
Quoted 1 line
Should we be consistent in preserving the existing naming?
The custom naming seems a bit pointless IMO and something mindlessly copied and pasted around, so I'd rather see removing the remaining cases. The only ones left AFAICT are designware and V3.
Rob
Rob Herring
maintainerPATCH v2 11/25 PCI: rockchip: Drop storing driver private outbound resource data
In reply to Rob HerringThe Rockchip host bridge driver doesn't need to store outboard resources in its private struct as they are already stored in struct pci_host_bridge.
---
v2:
- New patch
drivers/pci/controller/pcie-rockchip-host.c | 54 +++++++++------------ drivers/pci/controller/pcie-rockchip.h | 5 -- 2 files changed, 23 insertions(+), 36 deletions(-)
drivers/pci/controller/pcie-rockchip-host.c +23 -31
@@ -806,19 +806,28 @@ static int rockchip_pcie_prog_ib_atu(struct rockchip_pcie *rockchip,static int rockchip_pcie_cfg_atu (struct rockchip_pcie *rockchip) {struct device *dev = rockchip->dev; +struct pci_host_bridge *bridge =pci_host_bridge_from_priv (rockchip); +struct resource_entry *entry; +u64 pci_addr, size;int offset;int err;int reg_no;rockchip_pcie_cfg_configuration_accesses (rockchip,AXI_WRAPPER_TYPE0_CFG ); + entry =resource_list_get_entry_of_type (&bridge->windows,IORESOURCE_MEM ); +if (!entry) +return -ENODEV ; + + size =resource_size (entry->res); + pci_addr = entry->res->start - entry->offset; + rockchip->msg_bus_addr = pci_addr; -for (reg_no =0 ; reg_no < (rockchip->mem_size >>20 ); reg_no++) { +for (reg_no =0 ; reg_no < (size >>20 ); reg_no++) { err =rockchip_pcie_prog_ob_atu (rockchip, reg_no +1 ,AXI_WRAPPER_MEM_WRITE ,20 -1 , - rockchip->mem_bus_addr + - (reg_no <<20 ), + pci_addr + (reg_no <<20 ),0 );if (err) {dev_err (dev,"program RC mem outbound ATU failed\n" );
@@ -832,14 +841,20 @@ static int rockchip_pcie_cfg_atu(struct rockchip_pcie *rockchip)return err; } - offset = rockchip->mem_size >>20 ; -for (reg_no =0 ; reg_no < (rockchip->io_size >>20 ); reg_no++) { + entry =resource_list_get_entry_of_type (&bridge->windows,IORESOURCE_IO ); +if (!entry) +return -ENODEV ; + + size =resource_size (entry->res); + pci_addr = entry->res->start - entry->offset; + + offset = size >>20 ; +for (reg_no =0 ; reg_no < (size >>20 ); reg_no++) { err =rockchip_pcie_prog_ob_atu (rockchip, reg_no +1 + offset,AXI_WRAPPER_IO_WRITE ,20 -1 , - rockchip->io_bus_addr + - (reg_no <<20 ), + pci_addr + (reg_no <<20 ),0 );if (err) {dev_err (dev,"program RC io outbound ATU failed\n" );
@@ -852,8 +867,7 @@ static int rockchip_pcie_cfg_atu(struct rockchip_pcie *rockchip)AXI_WRAPPER_NOR_MSG , 20 - 1, 0, 0); - rockchip->msg_bus_addr = rockchip->mem_bus_addr + - ((reg_no + offset) <<20 ); + rockchip->msg_bus_addr += ((reg_no + offset) <<20 );return err; }
@@ -951,7 +965,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)struct pci_bus *bus, *child;struct pci_host_bridge *bridge;struct resource *bus_res; -struct resource_entry *win;int err;if (!dev->of_node)
@@ -997,27 +1010,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev) rockchip->root_bus_nr = bus_res->start; -/* Get the I/O and memory ranges from DT */ -resource_list_for_each_entry (win, &bridge->windows) { -switch (resource_type (win->res)) { -case IORESOURCE_IO : - io = win->res; - io->name ="I/O" ; - rockchip->io_size =resource_size (io); - rockchip->io_bus_addr = io->start - win->offset; - rockchip->io = io; -break ; -case IORESOURCE_MEM : - mem = win->res; - mem->name ="MEM" ; - rockchip->mem_size =resource_size (mem); - rockchip->mem_bus_addr = mem->start - win->offset; -break ; -default : -continue ; - } - } - err =rockchip_pcie_cfg_atu (rockchip);if (err) goto err_remove_irq_domain;
drivers/pci/controller/pcie-rockchip.h +0 -5
@@ -304,13 +304,8 @@ struct rockchip_pcie {struct irq_domain *irq_domain;int offset;struct pci_bus *root_bus; -struct resource *io; -phys_addr_t io_bus_addr; -u32 io_size;void __iomem *msg_region; -u32 mem_size;phys_addr_t msg_bus_addr; -phys_addr_t mem_bus_addr;bool is_rc;struct resource *mem_res; };
--
2.20.1
Re: [PATCH v2 11/25] PCI: rockchip: Drop storing driver private outbound resource data
drivers/pci/controller/pcie-rockchip-host.c static int rockchip_pcie_prog_ib_atu(struct rockchip_pcie *rockchip, · line 818
Quoted 1 line · Rob Herring
drivers/pci/controller/pcie-rockchip-host.c +1
-0+ entry =resource_list_get_entry_of_type (&bridge->windows,IORESOURCE_MEM );
This add another too long line. Please audit the whole series for that.
Rob Herring
maintainerRe: [PATCH v2 11/25] PCI: rockchip: Drop storing driver private outbound resource data
Quoted 5 lines · Christoph Hellwig
Quoted 1 line · Rob Herring
+ entry =
resource_list_get_entry_of_type(&bridge->windows, IORESOURCE_MEM);This add another too long line. Please audit the whole series for that.
82 characters didn't seem worth a line break...
Rob
Rob Herring
maintainerPATCH v2 12/25 PCI: v3-semi: Use pci_parse_request_of_pci_ranges()
In reply to Rob HerringConvert V3 host bridge to use the common pci_parse_request_of_pci_ranges().
---
v2:
- New patch
drivers/pci/controller/pci-v3-semi.c | 35 +++++----------------------- 1 file changed, 6 insertions(+), 29 deletions(-)
drivers/pci/controller/pci-v3-semi.c +6 -29
@@ -241,10 +241,8 @@ struct v3_pci {void __iomem *config_base;struct pci_bus *bus;u32 config_mem; -u32 io_mem;u32 non_pre_mem;u32 pre_mem; -phys_addr_t io_bus_addr;phys_addr_t non_pre_bus_addr;phys_addr_t pre_bus_addr;struct regmap *map;
@@ -520,35 +518,22 @@ static int v3_integrator_init(struct v3_pci *v3) }static int v3_pci_setup_resource (struct v3_pci *v3, -resource_size_t io_base,struct pci_host_bridge *host,struct resource_entry *win) {struct device *dev = v3->dev;struct resource *mem;struct resource *io; -int ret;switch (resource_type (win->res)) {case IORESOURCE_IO : io = win->res; - io->name ="V3 PCI I/O" ; - v3->io_mem = io_base; - v3->io_bus_addr = io->start - win->offset; -dev_dbg (dev,"I/O window %pR, bus addr %pap\n" , - io, &v3->io_bus_addr); - ret =devm_pci_remap_iospace (dev, io, io_base); -if (ret) { -dev_warn (dev, -"error %d: failed to map resource %pR\n" , - ret, io); -return ret; - } +/* Setup window 2 - PCI I/O */ -writel (v3_addr_to_lb_base2 (v3->io_mem) | +writel (v3_addr_to_lb_base2 (pci_pio_to_address (io->start)) |V3_LB_BASE2_ENABLE , v3->base +V3_LB_BASE2 ); -writew (v3_addr_to_lb_map2 (v3->io_bus_addr), +writew (v3_addr_to_lb_map2 (io->start - win->offset), v3->base +V3_LB_MAP2 );break ;case IORESOURCE_MEM :
@@ -732,7 +717,6 @@ static int v3_pci_probe(struct platform_device *pdev) {struct device *dev = &pdev->dev;struct device_node *np = dev->of_node; -resource_size_t io_base;struct resource *regs;struct resource_entry *win;struct v3_pci *v3;
@@ -741,7 +725,6 @@ static int v3_pci_probe(struct platform_device *pdev)u16 val;int irq;int ret; -LIST_HEAD (res); host =pci_alloc_host_bridge (sizeof (*v3));if (!host)
@@ -793,12 +776,7 @@ static int v3_pci_probe(struct platform_device *pdev)if (IS_ERR (v3->config_base))return PTR_ERR (v3->config_base); - ret =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , &res, - &io_base); -if (ret) -return ret; - - ret =devm_request_pci_bus_resources (dev, &res); + ret =pci_parse_request_of_pci_ranges (dev, &host->windows,NULL );if (ret)return ret;
@@ -852,8 +830,8 @@ static int v3_pci_probe(struct platform_device *pdev)writew (val, v3->base +V3_PCI_CMD );/* Get the I/O and memory ranges from DT */ -resource_list_for_each_entry (win, &res) { - ret =v3_pci_setup_resource (v3, io_base, host, win); +resource_list_for_each_entry (win, &host->windows) { + ret =v3_pci_setup_resource (v3, host, win);if (ret) {dev_err (dev,"error setting up resources\n" );return ret;
@@ -931,7 +909,6 @@ static int v3_pci_probe(struct platform_device *pdev) val |=V3_SYSTEM_M_LOCK ;writew (val, v3->base +V3_SYSTEM ); -list_splice_init (&res, &host->windows); ret =pci_scan_root_bus_bridge (host);if (ret) {dev_err (dev,"failed to register host: %d\n" , ret);
--
2.20.1
Re: [PATCH v2 12/25] PCI: v3-semi: Use pci_parse_request_of_pci_ranges()
Quoted 11 lines · Rob Herring
Convert V3 host bridge to use the common
pci_parse_request_of_pci_ranges().Cc Linus Walleij <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Andrew Murray <[email protected]>Cc Bjorn Helgaas <[email protected]>Signed-off-by Rob Herring <[email protected]>---
v2:
- New patch
Yours,
Linus Walleij
Rob Herring
maintainerPATCH v2 13/25 PCI: xgene: Use pci_parse_request_of_pci_ranges()
In reply to Rob HerringConvert the xgene host bridge to use the commonpci_parse_request_of_pci_ranges().
There's no need to assign the resources to a temporary list first. Just use bridge->windows directly and remove all the temporary list handling.
---
v2:
- New patch
drivers/pci/controller/pci-xgene.c | 39 +++++++++--------------------- 1 file changed, 11 insertions(+), 28 deletions(-)
drivers/pci/controller/pci-xgene.c +11 -28
@@ -405,15 +405,13 @@ static void xgene_pcie_setup_cfg_reg(struct xgene_pcie_port *port)xgene_pcie_writel (port,CFGCTL ,EN_REG ); } -static int xgene_pcie_map_ranges (struct xgene_pcie_port *port, -struct list_head *res, -resource_size_t io_base) +static int xgene_pcie_map_ranges (struct xgene_pcie_port *port) { +struct pci_host_bridge *bridge =pci_host_bridge_from_priv (port);struct resource_entry *window;struct device *dev = port->dev; -int ret; -resource_list_for_each_entry (window, res) { +resource_list_for_each_entry (window, &bridge->windows) {struct resource *res = window->res;u64 restype =resource_type (res);
@@ -421,11 +419,9 @@ static int xgene_pcie_map_ranges(struct xgene_pcie_port *port,switch (restype) {case IORESOURCE_IO : -xgene_pcie_setup_ob_reg (port, res,OMR3BARL , io_base, +xgene_pcie_setup_ob_reg (port, res,OMR3BARL , +pci_pio_to_address (res->start), res->start - window->offset); - ret =devm_pci_remap_iospace (dev, res, io_base); -if (ret <0 ) -return ret;break ;case IORESOURCE_MEM :if (res->flags &IORESOURCE_PREFETCH )
@@ -567,8 +563,7 @@ static void xgene_pcie_clear_config(struct xgene_pcie_port *port)xgene_pcie_writel (port, i,0 ); } -static int xgene_pcie_setup (struct xgene_pcie_port *port,struct list_head *res, -resource_size_t io_base) +static int xgene_pcie_setup (struct xgene_pcie_port *port) {struct device *dev = port->dev;u32 val, lanes =0 , speed =0 ;
@@ -580,7 +575,7 @@ static int xgene_pcie_setup(struct xgene_pcie_port *port, struct list_head *res, val = (XGENE_PCIE_DEVICEID <<16 ) |XGENE_PCIE_VENDORID ;xgene_pcie_writel (port,BRIDGE_CFG_0 , val); - ret =xgene_pcie_map_ranges (port, res, io_base); + ret =xgene_pcie_map_ranges (port);if (ret)return ret;
@@ -607,11 +602,9 @@ static int xgene_pcie_probe(struct platform_device *pdev)struct device *dev = &pdev->dev;struct device_node *dn = dev->of_node;struct xgene_pcie_port *port; -resource_size_t iobase =0 ;struct pci_bus *bus, *child;struct pci_host_bridge *bridge;int ret; -LIST_HEAD (res); bridge =devm_pci_alloc_host_bridge (dev,sizeof (*port));if (!bridge)
@@ -634,20 +627,14 @@ static int xgene_pcie_probe(struct platform_device *pdev)if (ret)return ret; - ret =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , &res, - &iobase); + ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows,NULL );if (ret)return ret; - ret =devm_request_pci_bus_resources (dev, &res); -if (ret) - goto error; - - ret =xgene_pcie_setup (port, &res, iobase); + ret =xgene_pcie_setup (port);if (ret) - goto error; +return ret; -list_splice_init (&res, &bridge->windows); bridge->dev.parent = dev; bridge->sysdata = port; bridge->busnr =0 ;
@@ -657,7 +644,7 @@ static int xgene_pcie_probe(struct platform_device *pdev) ret =pci_scan_root_bus_bridge (bridge);if (ret <0 ) - goto error; +return ret; bus = bridge->bus;
@@ -666,10 +653,6 @@ static int xgene_pcie_probe(struct platform_device *pdev)pcie_bus_configure_settings (child);pci_bus_add_devices (bus);return 0 ; - -error: -pci_free_resource_list (&res); -return ret; }static const struct of_device_id xgene_pcie_match_table[] = {
--
2.20.1
Rob Herring
maintainerPATCH v2 14/25 PCI: xilinx: Use pci_parse_request_of_pci_ranges()
In reply to Rob HerringConvert the Xilinx host bridge to use the commonpci_parse_request_of_pci_ranges().
There's no need to assign the resources to a temporary list first. Just use bridge->windows directly and remove all the temporary list handling.
---
v2:
- New patch
drivers/pci/controller/pcie-xilinx.c | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-)
drivers/pci/controller/pcie-xilinx.c +2 -15
@@ -619,8 +619,6 @@ static int xilinx_pcie_probe(struct platform_device *pdev)struct pci_bus *bus, *child;struct pci_host_bridge *bridge;int err; -resource_size_t iobase =0 ; -LIST_HEAD (res);if (!dev->of_node)return -ENODEV ;
@@ -647,19 +645,12 @@ static int xilinx_pcie_probe(struct platform_device *pdev)return err; } - err =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , &res, - &iobase); + err =pci_parse_request_of_pci_ranges (dev, &bridge->windows,NULL );if (err) {dev_err (dev,"Getting bridge resources failed\n" );return err; } - err =devm_request_pci_bus_resources (dev, &res); -if (err) - goto error; - - -list_splice_init (&res, &bridge->windows); bridge->dev.parent = dev; bridge->sysdata = port; bridge->busnr =0 ;
@@ -673,7 +664,7 @@ static int xilinx_pcie_probe(struct platform_device *pdev)#endif err =pci_scan_root_bus_bridge (bridge);if (err <0 ) - goto error; +return err; bus = bridge->bus;
@@ -682,10 +673,6 @@ static int xilinx_pcie_probe(struct platform_device *pdev)pcie_bus_configure_settings (child);pci_bus_add_devices (bus);return 0 ; - -error: -pci_free_resource_list (&res); -return err; }static const struct of_device_id xilinx_pcie_of_match[] = {
--
2.20.1
Rob Herring
maintainerPATCH v2 15/25 PCI: xilinx-nwl: Use pci_parse_request_of_pci_ranges()
In reply to Rob HerringConvert the xilinx-nwl host bridge to use the common pci_parse_request_of_pci_ranges().
There's no need to assign the resources to a temporary list first. Just use bridge->windows directly and remove all the temporary list handling.
---
v2:
- New patch
drivers/pci/controller/pcie-xilinx-nwl.c | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-)
drivers/pci/controller/pcie-xilinx-nwl.c +4 -16
@@ -821,8 +821,6 @@ static int nwl_pcie_probe(struct platform_device *pdev)struct pci_bus *child;struct pci_host_bridge *bridge;int err; -resource_size_t iobase =0 ; -LIST_HEAD (res); bridge =devm_pci_alloc_host_bridge (dev,sizeof (*pcie));if (!bridge)
@@ -845,24 +843,18 @@ static int nwl_pcie_probe(struct platform_device *pdev)return err; } - err =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , &res, - &iobase); + err =pci_parse_request_of_pci_ranges (dev, &bridge->windows,NULL );if (err) {dev_err (dev,"Getting bridge resources failed\n" );return err; } - err =devm_request_pci_bus_resources (dev, &res); -if (err) - goto error; - err =nwl_pcie_init_irq_domain (pcie);if (err) {dev_err (dev,"Failed creating IRQ Domain\n" ); - goto error; +return err; } -list_splice_init (&res, &bridge->windows); bridge->dev.parent = dev; bridge->sysdata = pcie; bridge->busnr = pcie->root_busno;
@@ -874,13 +866,13 @@ static int nwl_pcie_probe(struct platform_device *pdev) err =nwl_pcie_enable_msi (pcie);if (err <0 ) {dev_err (dev,"failed to enable MSI support: %d\n" , err); - goto error; +return err; } } err =pci_scan_root_bus_bridge (bridge);if (err) - goto error; +return err; bus = bridge->bus;
@@ -889,10 +881,6 @@ static int nwl_pcie_probe(struct platform_device *pdev)pcie_bus_configure_settings (child);pci_bus_add_devices (bus);return 0 ; - -error: -pci_free_resource_list (&res); -return err; }static struct platform_driver nwl_pcie_driver = {
--
2.20.1
Rob Herring
maintainerPATCH v2 16/25 PCI: versatile: Use pci_parse_request_of_pci_ranges()
In reply to Rob HerringConvert ARM Versatile host bridge to use the common pci_parse_request_of_pci_ranges().
There's no need to assign the resources to a temporary list first. Just use bridge->windows directly and remove all the temporary list handling.
---
v2:
- Fix 'mem' initial value to 1
- Remove temporary resource list
--- drivers/pci/controller/pci-versatile.c | 64 +++++--------------------- 1 file changed, 11 insertions(+), 53 deletions(-)
drivers/pci/controller/pci-versatile.c +11 -53
@@ -62,65 +62,16 @@ static struct pci_ops pci_versatile_ops = { .write = pci_generic_config_write, }; -static int versatile_pci_parse_request_of_pci_ranges (struct device *dev, -struct list_head *res) -{ -int err, mem =1 , res_valid =0 ; -resource_size_t iobase; -struct resource_entry *win, *tmp; - - err =devm_of_pci_get_host_bridge_resources (dev,0 ,0xff , res, &iobase); -if (err) -return err; - - err =devm_request_pci_bus_resources (dev, res); -if (err) - goto out_release_res; - -resource_list_for_each_entry_safe (win, tmp, res) { -struct resource *res = win->res; - -switch (resource_type (res)) { -case IORESOURCE_IO : - err =devm_pci_remap_iospace (dev, 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 ); - -writel (res->start >>28 ,PCI_IMAP (mem)); -writel (PHYS_OFFSET >>28 ,PCI_SMAP (mem)); - mem++; - -break ; - } - } - -if (res_valid) -return 0 ; - -dev_err (dev,"non-prefetchable memory resource required\n" ); - err = -EINVAL ; - -out_release_res: -pci_free_resource_list (res); -return err; -} -static int versatile_pci_probe (struct platform_device *pdev) {struct device *dev = &pdev->dev;struct resource *res; -int ret, i, myslot =-1 ; +struct resource_entry *entry; +int ret, i, myslot =-1 , mem =1 ;u32 val;void __iomem *local_pci_cfg_base;struct pci_bus *bus, *child;struct pci_host_bridge *bridge; -LIST_HEAD (pci_res); bridge =devm_pci_alloc_host_bridge (dev,0 );if (!bridge)
@@ -141,10 +92,18 @@ static int versatile_pci_probe(struct platform_device *pdev)if (IS_ERR (versatile_cfg_base[1 ]))return PTR_ERR (versatile_cfg_base[1 ]); - ret =versatile_pci_parse_request_of_pci_ranges (dev, &pci_res); + ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows,NULL );if (ret)return ret; +resource_list_for_each_entry (entry, &bridge->windows) { +if (resource_type (entry->res) ==IORESOURCE_MEM ) { +writel (entry->res->start >>28 ,PCI_IMAP (mem)); +writel (PHYS_OFFSET >>28 ,PCI_SMAP (mem)); + mem++; + } + } +/* * We need to discover the PCI core first to configure itself * before the main PCI probing is performed
@@ -197,7 +156,6 @@ static int versatile_pci_probe(struct platform_device *pdev)pci_add_flags (PCI_ENABLE_PROC_DOMAINS );pci_add_flags (PCI_REASSIGN_ALL_BUS ); -list_splice_init (&pci_res, &bridge->windows); bridge->dev.parent = dev; bridge->sysdata =NULL ; bridge->busnr =0 ;
Signature · 1 line
2.20.1
Re: [PATCH v2 16/25] PCI: versatile: Use pci_parse_request_of_pci_ranges()
Quoted 6 lines · Rob Herring
Convert ARM Versatile host bridge to use the common
pci_parse_request_of_pci_ranges().There's no need to assign the resources to a temporary list first. Just use
bridge->windowsdirectly and remove all the temporary list handling.
Quoted 7 lines
Cc Lorenzo Pieralisi <[email protected]>Cc Bjorn Helgaas <[email protected]>Signed-off-by Rob Herring <[email protected]>---
v2:
- Fix 'mem' initial value to 1
- Remove temporary resource list
Yours,
Linus Walleij
Rob Herring
maintainerPATCH v2 17/25 PCI: versatile: Remove usage of PHYS_OFFSET
In reply to Rob HerringPHYS_OFFSET is not universally defined on all arches and using it prevents enabling COMPILE_TEST. PAGE_OFFSET and __pa() are always available, so use them to get the physical start of memory address.
This should have probably used 'dma-ranges' to get the address, but we don't want to force a DT update to do that. At least in QEMU, the SMAP registers have no effect (or perhaps the only value that is handled is 0).
---
v2:
- New patch to fix build failure on some arches.
drivers/pci/controller/pci-versatile.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/pci/controller/pci-versatile.c +4 -4
@@ -99,7 +99,7 @@ static int versatile_pci_probe(struct platform_device *pdev)resource_list_for_each_entry (entry, &bridge->windows) {if (resource_type (entry->res) ==IORESOURCE_MEM ) {writel (entry->res->start >>28 ,PCI_IMAP (mem)); -writel (PHYS_OFFSET >>28 ,PCI_SMAP (mem)); +writel (__pa (PAGE_OFFSET ) >>28 ,PCI_SMAP (mem)); mem++; } }
@@ -136,9 +136,9 @@ static int versatile_pci_probe(struct platform_device *pdev)/* * Configure the PCI inbound memory windows to be 1:1 mapped to SDRAM */ -writel (PHYS_OFFSET , local_pci_cfg_base +PCI_BASE_ADDRESS_0 ); -writel (PHYS_OFFSET , local_pci_cfg_base +PCI_BASE_ADDRESS_1 ); -writel (PHYS_OFFSET , local_pci_cfg_base +PCI_BASE_ADDRESS_2 ); +writel (__pa (PAGE_OFFSET ), local_pci_cfg_base +PCI_BASE_ADDRESS_0 ); +writel (__pa (PAGE_OFFSET ), local_pci_cfg_base +PCI_BASE_ADDRESS_1 ); +writel (__pa (PAGE_OFFSET ), local_pci_cfg_base +PCI_BASE_ADDRESS_2 );/* * For many years the kernel and QEMU were symbiotically buggy
--
2.20.1
Re: [PATCH v2 17/25] PCI: versatile: Remove usage of PHYS_OFFSET
Quoted 8 lines · Rob Herring
PHYS_OFFSETis not universally defined on all arches and using it prevents enablingCOMPILE_TEST.PAGE_OFFSETand__pa()are always available, so use them to get the physical start of memory address.This should have probably used 'dma-ranges' to get the address, but we don't want to force a DT update to do that. At least in QEMU, the SMAP registers have no effect (or perhaps the only value that is handled is 0).
Quoted 7 lines
Cc Lorenzo Pieralisi <[email protected]>Cc Andrew Murray <[email protected]>Cc Bjorn Helgaas <[email protected]>Signed-off-by Rob Herring <[email protected]>---
v2:
- New patch to fix build failure on some arches.
Always wondered how to do this right, now I can fix other stuff!
Yours,
Linus Walleij
Rob Herring
maintainerPATCH v2 18/25 PCI: versatile: Enable COMPILE_TEST
In reply to Rob HerringSince commit a574795bc383 ("PCI: generic,versatile: Remove unused pci_sys_data structures") the build dependency on ARM is gone, so let's enable COMPILE_TEST for versatile.
--- drivers/pci/controller/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pci/controller/Kconfig +1 -1
@@ -135,7 +135,7 @@ config PCI_V3_SEMI config PCI_VERSATILE bool "ARM Versatile PB PCI controller" - depends on ARCH_VERSATILE + depends on ARCH_VERSATILE || COMPILE_TEST config PCIE_IPROC tristate
Signature · 1 line
2.20.1
Re: [PATCH v2 18/25] PCI: versatile: Enable COMPILE_TEST
Quoted 8 lines · Rob Herring
Since commit
a574795bc383("PCI: generic,versatile: Remove unusedpci_sys_datastructures") the build dependency on ARM is gone, so let's enableCOMPILE_TESTfor versatile.Reviewed-by Andrew Murray <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Bjorn Helgaas <[email protected]>Signed-off-by Rob Herring <[email protected]>
Yours,
Linus Walleij
Rob Herring
maintainerPATCH v2 19/25 PCI: of: Add inbound resource parsing to helpers
In reply to Rob HerringExtend devm_of_pci_get_host_bridge_resources() and pci_parse_request_of_pci_ranges() helpers to also parse the inbound addresses from DT 'dma-ranges' and populate a resource list with the translated addresses. This will help ensure 'dma-ranges' is always parsed in a consistent way.
---
v2:
- Fix crash in INIT_LIST_HEAD when ib_resources is NULL
--- .../pci/controller/dwc/pcie-designware-host.c | 3 +- drivers/pci/controller/pci-aardvark.c | 2 +- drivers/pci/controller/pci-ftpci100.c | 3 +- drivers/pci/controller/pci-host-common.c | 2 +- drivers/pci/controller/pci-v3-semi.c | 3 +- drivers/pci/controller/pci-versatile.c | 2 +- drivers/pci/controller/pci-xgene.c | 3 +- drivers/pci/controller/pcie-altera.c | 2 +- drivers/pci/controller/pcie-cadence-host.c | 2 +- drivers/pci/controller/pcie-iproc-platform.c | 3 +- drivers/pci/controller/pcie-mediatek.c | 2 +- drivers/pci/controller/pcie-mobiveil.c | 3 +- drivers/pci/controller/pcie-rcar.c | 3 +- drivers/pci/controller/pcie-rockchip-host.c | 3 +- drivers/pci/controller/pcie-xilinx-nwl.c | 3 +- drivers/pci/controller/pcie-xilinx.c | 3 +- drivers/pci/of.c | 45 ++++++++++++++++++- drivers/pci/pci.h | 8 +++- include/linux/pci.h | 2 + 19 files changed, 77 insertions(+), 20 deletions(-)
drivers/pci/controller/dwc/pcie-designware-host.c +2 -1
@@ -342,7 +342,8 @@ int dw_pcie_host_init(struct pcie_port *pp)if (!bridge)return -ENOMEM ; - ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows,NULL ); + ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows, + &bridge->dma_ranges,NULL );if (ret)return ret;
drivers/pci/controller/pci-aardvark.c +1 -1
@@ -939,7 +939,7 @@ static int advk_pcie_probe(struct platform_device *pdev) } ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows, - &bus); + &bridge->dma_ranges, &bus);if (ret) {dev_err (dev,"Failed to parse resources\n" );return ret;
drivers/pci/controller/pci-ftpci100.c +2 -1
@@ -477,7 +477,8 @@ static int faraday_pci_probe(struct platform_device *pdev)if (IS_ERR (p->base))return PTR_ERR (p->base); - ret =pci_parse_request_of_pci_ranges (dev, &host->windows,NULL ); + ret =pci_parse_request_of_pci_ranges (dev, &host->windows, + &host->dma_ranges,NULL );if (ret)return ret;
drivers/pci/controller/pci-host-common.c +1 -1
@@ -27,7 +27,7 @@ static struct pci_config_window *gen_pci_init(struct device *dev,struct pci_config_window *cfg;/* Parse our PCI ranges and request their resources */ - err =pci_parse_request_of_pci_ranges (dev, resources, &bus_range); + err =pci_parse_request_of_pci_ranges (dev, resources,NULL , &bus_range);if (err)return ERR_PTR (err);
drivers/pci/controller/pci-v3-semi.c +2 -1
@@ -776,7 +776,8 @@ static int v3_pci_probe(struct platform_device *pdev)if (IS_ERR (v3->config_base))return PTR_ERR (v3->config_base); - ret =pci_parse_request_of_pci_ranges (dev, &host->windows,NULL ); + ret =pci_parse_request_of_pci_ranges (dev, &host->windows, + &host->dma_ranges,NULL );if (ret)return ret;
drivers/pci/controller/pci-versatile.c +1 -1
@@ -92,7 +92,7 @@ static int versatile_pci_probe(struct platform_device *pdev)if (IS_ERR (versatile_cfg_base[1 ]))return PTR_ERR (versatile_cfg_base[1 ]); - ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows,NULL ); + ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows,NULL ,NULL );if (ret)return ret;
drivers/pci/controller/pci-xgene.c +2 -1
@@ -627,7 +627,8 @@ static int xgene_pcie_probe(struct platform_device *pdev)if (ret)return ret; - ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows,NULL ); + ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows, + &bridge->dma_ranges,NULL );if (ret)return ret;
drivers/pci/controller/pcie-altera.c +1 -1
@@ -800,7 +800,7 @@ static int altera_pcie_probe(struct platform_device *pdev) } ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows, -NULL ); + &bridge->dma_ranges,NULL );if (ret) {dev_err (dev,"Failed add resources\n" );return ret;
drivers/pci/controller/pcie-cadence-host.c +1 -1
@@ -211,7 +211,7 @@ static int cdns_pcie_host_init(struct device *dev,int err;/* Parse our PCI ranges and request their resources */ - err =pci_parse_request_of_pci_ranges (dev, resources, &bus_range); + err =pci_parse_request_of_pci_ranges (dev, resources,NULL , &bus_range);if (err)return err;
drivers/pci/controller/pcie-iproc-platform.c +2 -1
@@ -95,7 +95,8 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev)if (IS_ERR (pcie->phy))return PTR_ERR (pcie->phy); - ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows,NULL ); + ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows, + &bridge->dma_ranges,NULL );if (ret) {dev_err (dev,"unable to get PCI host bridge resources\n" );return ret;
drivers/pci/controller/pcie-mediatek.c +1 -1
@@ -1034,7 +1034,7 @@ static int mtk_pcie_setup(struct mtk_pcie *pcie)int err; err =pci_parse_request_of_pci_ranges (dev, windows, - &bus); + &host->dma_ranges, &bus);if (err)return err;
drivers/pci/controller/pcie-mobiveil.c +2 -1
@@ -875,7 +875,8 @@ static int mobiveil_pcie_probe(struct platform_device *pdev) }/* parse the host bridge base addresses from the device tree file */ - ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows,NULL ); + ret =pci_parse_request_of_pci_ranges (dev, &bridge->windows, + &bridge->dma_ranges,NULL );if (ret) {dev_err (dev,"Getting bridge resources failed\n" );return ret;
drivers/pci/controller/pcie-rcar.c +2 -1
@@ -1138,7 +1138,8 @@ static int rcar_pcie_probe(struct platform_device *pdev) pcie->dev = dev;platform_set_drvdata (pdev, pcie); - err =pci_parse_request_of_pci_ranges (dev, &pcie->resources,NULL ); + err =pci_parse_request_of_pci_ranges (dev, &pcie->resources, + &bridge->dma_ranges,NULL );if (err) goto err_free_bridge;
drivers/pci/controller/pcie-rockchip-host.c +2 -1
@@ -1004,7 +1004,8 @@ static int rockchip_pcie_probe(struct platform_device *pdev)if (err <0 ) goto err_deinit_port; - err =pci_parse_request_of_pci_ranges (dev, &bridge->windows, &bus_res); + err =pci_parse_request_of_pci_ranges (dev, &bridge->windows, + &bridge->dma_ranges, &bus_res);if (err) goto err_remove_irq_domain;
drivers/pci/controller/pcie-xilinx-nwl.c +2 -1
@@ -843,7 +843,8 @@ static int nwl_pcie_probe(struct platform_device *pdev)return err; } - err =pci_parse_request_of_pci_ranges (dev, &bridge->windows,NULL ); + err =pci_parse_request_of_pci_ranges (dev, &bridge->windows, + &bridge->dma_ranges,NULL );if (err) {dev_err (dev,"Getting bridge resources failed\n" );return err;
drivers/pci/controller/pcie-xilinx.c +2 -1
@@ -645,7 +645,8 @@ static int xilinx_pcie_probe(struct platform_device *pdev)return err; } - err =pci_parse_request_of_pci_ranges (dev, &bridge->windows,NULL ); + err =pci_parse_request_of_pci_ranges (dev, &bridge->windows, + &bridge->dma_ranges,NULL );if (err) {dev_err (dev,"Getting bridge resources failed\n" );return err;
drivers/pci/of.c +43 -2
70 lines not on this page · raw message
drivers/pci/pci.h +6 -2
@@ -633,11 +633,15 @@ static inline void pci_release_bus_of_node(struct pci_bus *bus) { }#if defined(CONFIG_OF_ADDRESS )int devm_of_pci_get_host_bridge_resources (struct device *dev,unsigned char busno,unsigned char bus_max, -struct list_head *resources,resource_size_t *io_base); +struct list_head *resources, +struct list_head *ib_resources, +resource_size_t *io_base);#else static inline int devm_of_pci_get_host_bridge_resources (struct device *dev,unsigned char busno,unsigned char bus_max, -struct list_head *resources,resource_size_t *io_base) +struct list_head *resources, +struct list_head *ib_resources, +resource_size_t *io_base) {return -EINVAL ; }
include/linux/pci.h +2 -0
@@ -2278,6 +2278,7 @@ struct irq_domain;struct irq_domain *pci_host_bridge_of_msi_domain (struct pci_bus *bus);int pci_parse_request_of_pci_ranges (struct device *dev,struct list_head *resources, +struct list_head *ib_resources,struct resource **bus_range);/* Arch may override this (weak) */
@@ -2288,6 +2289,7 @@ static inline struct irq_domain * pci_host_bridge_of_msi_domain(struct pci_bus *bus) { return NULL; }static inline int pci_parse_request_of_pci_ranges (struct device *dev,struct list_head *resources, +struct list_head *ib_resources,struct resource **bus_range) {return -EINVAL ;
Signature · 1 line
2.20.1
Rob Herring
maintainerPATCH v2 20/25 PCI: ftpci100: Use inbound resources for setup
In reply to Rob HerringNow that the helpers provide the inbound resources in the host bridge 'dma_ranges' resource list, convert Faraday ftpci100 host bridge to use the resource list to setup the inbound addresses.
--- drivers/pci/controller/pci-ftpci100.c | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-)
drivers/pci/controller/pci-ftpci100.c +9 -17
@@ -375,12 +375,11 @@ static int faraday_pci_setup_cascaded_irq(struct faraday_pci *p)return 0 ; } -static int faraday_pci_parse_map_dma_ranges (struct faraday_pci *p, -struct device_node *np) +static int faraday_pci_parse_map_dma_ranges (struct faraday_pci *p) { -struct of_pci_range range; -struct of_pci_range_parser parser;struct device *dev = p->dev; +struct pci_host_bridge *bridge =pci_host_bridge_from_priv (p); +struct resource_entry *entry;u32 confreg[3 ] = {FARADAY_PCI_MEM1_BASE_SIZE ,FARADAY_PCI_MEM2_BASE_SIZE ,
@@ -389,19 +388,12 @@ static int faraday_pci_parse_map_dma_ranges(struct faraday_pci *p,int i =0 ;u32 val; -if (of_pci_dma_range_parser_init (&parser, np)) { -dev_err (dev,"missing dma-ranges property\n" ); -return -EINVAL ; - } - -/* -* Get the dma-ranges from the device tree -*/ -for_each_of_pci_range (&parser, &range) { -u64 end = range.pci_addr + range.size -1 ; +resource_list_for_each_entry (entry, &bridge->dma_ranges) { +u64 pci_addr = entry->res->start - entry->offset; +u64 end = entry->res->end - entry->offset;int ret; - ret =faraday_res_to_memcfg (range.pci_addr, range.size, &val); + ret =faraday_res_to_memcfg (pci_addr,resource_size (entry->res), &val);if (ret) {dev_err (dev,"DMA range %d: illegal MEM resource size\n" , i);
@@ -409,7 +401,7 @@ static int faraday_pci_parse_map_dma_ranges(struct faraday_pci *p, }dev_info (dev,"DMA MEM%d BASE: 0x%016llx -> 0x%016llx config %08x\n" , - i +1 , range.pci_addr, end, val); + i +1 , pci_addr, end, val);if (i <=2 ) {faraday_raw_pci_write_config (p,0 ,0 , confreg[i],4 , val);
@@ -539,7 +531,7 @@ static int faraday_pci_probe(struct platform_device *pdev) cur_bus_speed = PCI_SPEED_66MHz; } - ret =faraday_pci_parse_map_dma_ranges (p, dev->of_node); + ret =faraday_pci_parse_map_dma_ranges (p);if (ret)return ret;
Signature · 1 line
2.20.1
Re: [PATCH v2 20/25] PCI: ftpci100: Use inbound resources for setup
Quoted 8 lines · Rob Herring
Now that the helpers provide the inbound resources in the host bridge '
dma_ranges' resource list, convert Faraday ftpci100 host bridge to use the resource list to setup the inbound addresses.Cc Lorenzo Pieralisi <[email protected]>Cc Bjorn Helgaas <[email protected]>Reviewed-by Andrew Murray <[email protected]>Signed-off-by Rob Herring <[email protected]>
Yours,
Linus Walleij
Rob Herring
maintainerPATCH v2 21/25 PCI: v3-semi: Use inbound resources for setup
In reply to Rob HerringNow that the helpers provide the inbound resources in the host bridge 'dma_ranges' resource list, convert the v3-semi host bridge to use the resource list to setup the inbound addresses.
--- drivers/pci/controller/pci-v3-semi.c | 38 ++++++++++++---------------- 1 file changed, 16 insertions(+), 22 deletions(-)
drivers/pci/controller/pci-v3-semi.c +16 -22
@@ -598,28 +598,30 @@ static int v3_pci_setup_resource(struct v3_pci *v3, }static int v3_get_dma_range_config (struct v3_pci *v3, -struct of_pci_range *range, +struct resource_entry *entry,u32 *pci_base,u32 *pci_map) {struct device *dev = v3->dev; -u64 cpu_end = range->cpu_addr + range->size -1 ; -u64 pci_end = range->pci_addr + range->size -1 ; +u64 cpu_addr = entry->res->start; +u64 cpu_end = entry->res->end; +u64 pci_end = cpu_end - entry->offset; +u64 pci_addr = entry->res->start - entry->offset;u32 val; -if (range->pci_addr & ~V3_PCI_BASE_M_ADR_BASE ) { +if (pci_addr & ~V3_PCI_BASE_M_ADR_BASE ) {dev_err (dev,"illegal range, only PCI bits 31..20 allowed\n" );return -EINVAL ; } - val = ((u32 )range->pci_addr) &V3_PCI_BASE_M_ADR_BASE ; + val = ((u32 )pci_addr) &V3_PCI_BASE_M_ADR_BASE ; *pci_base = val; -if (range->cpu_addr & ~V3_PCI_MAP_M_MAP_ADR ) { +if (cpu_addr & ~V3_PCI_MAP_M_MAP_ADR ) {dev_err (dev,"illegal range, only CPU bits 31..20 allowed\n" );return -EINVAL ; } - val = ((u32 )range->cpu_addr) &V3_PCI_MAP_M_MAP_ADR ; + val = ((u32 )cpu_addr) &V3_PCI_MAP_M_MAP_ADR ; -switch (range->size) { +switch (resource_size (entry->res)) {case SZ_1M : val |=V3_LB_BASE_ADR_SIZE_1MB ;break ;
@@ -667,8 +669,8 @@ static int v3_get_dma_range_config(struct v3_pci *v3,dev_dbg (dev,"DMA MEM CPU: 0x%016llx -> 0x%016llx => " "PCI: 0x%016llx -> 0x%016llx base %08x map %08x\n" , - range->cpu_addr, cpu_end, - range->pci_addr, pci_end, + cpu_addr, cpu_end, + pci_addr, pci_end, *pci_base, *pci_map);return 0 ;
@@ -677,24 +679,16 @@ static int v3_get_dma_range_config(struct v3_pci *v3,static int v3_pci_parse_map_dma_ranges (struct v3_pci *v3,struct device_node *np) { -struct of_pci_range range; -struct of_pci_range_parser parser; +struct pci_host_bridge *bridge =pci_host_bridge_from_priv (v3);struct device *dev = v3->dev; +struct resource_entry *entry;int i =0 ; -if (of_pci_dma_range_parser_init (&parser, np)) { -dev_err (dev,"missing dma-ranges property\n" ); -return -EINVAL ; - } - -/* -* Get the dma-ranges from the device tree -*/ -for_each_of_pci_range (&parser, &range) { +resource_list_for_each_entry (entry, &bridge->dma_ranges) {int ret;u32 pci_base, pci_map; - ret =v3_get_dma_range_config (v3, &range, &pci_base, &pci_map); + ret =v3_get_dma_range_config (v3, entry, &pci_base, &pci_map);if (ret)return ret;
Signature · 1 line
2.20.1
Rob Herring
maintainerPATCH v2 22/25 PCI: xgene: Use inbound resources for setup
In reply to Rob HerringNow that the helpers provide the inbound resources in the host bridge 'dma_ranges' resource list, convert the Xgene host bridge to use the resource list to setup the inbound addresses.
--- drivers/pci/controller/pci-xgene.c | 32 ++++++++++-------------------- 1 file changed, 10 insertions(+), 22 deletions(-)
drivers/pci/controller/pci-xgene.c +10 -22
@@ -481,27 +481,27 @@ static int xgene_pcie_select_ib_reg(u8 *ib_reg_mask, u64 size) }static void xgene_pcie_setup_ib_reg (struct xgene_pcie_port *port, -struct of_pci_range *range,u8 *ib_reg_mask) +struct resource_entry *entry,u8 *ib_reg_mask) {void __iomem *cfg_base = port->cfg_base;struct device *dev = port->dev;void *bar_addr;u32 pim_reg; -u64 cpu_addr = range->cpu_addr; -u64 pci_addr = range->pci_addr; -u64 size = range->size; +u64 cpu_addr = entry->res->start; +u64 pci_addr = cpu_addr - entry->offset; +u64 size =resource_size (entry->res);u64 mask = ~(size -1 ) |EN_REG ;u32 flags =PCI_BASE_ADDRESS_MEM_TYPE_64 ;u32 bar_low;int region; - region =xgene_pcie_select_ib_reg (ib_reg_mask, range->size); + region =xgene_pcie_select_ib_reg (ib_reg_mask, size);if (region <0 ) {dev_warn (dev,"invalid pcie dma-range config\n" );return ; } -if (range->flags &IORESOURCE_PREFETCH ) +if (entry->res->flags &IORESOURCE_PREFETCH ) flags |=PCI_BASE_ADDRESS_MEM_PREFETCH ; bar_low =pcie_bar_low_val ((u32 )cpu_addr, flags);
@@ -532,25 +532,13 @@ static void xgene_pcie_setup_ib_reg(struct xgene_pcie_port *port,static int xgene_pcie_parse_map_dma_ranges (struct xgene_pcie_port *port) { -struct device_node *np = port->node; -struct of_pci_range range; -struct of_pci_range_parser parser; -struct device *dev = port->dev; +struct pci_host_bridge *bridge =pci_host_bridge_from_priv (port); +struct resource_entry *entry;u8 ib_reg_mask =0 ; -if (of_pci_dma_range_parser_init (&parser, np)) { -dev_err (dev,"missing dma-ranges property\n" ); -return -EINVAL ; - } - -/* Get the dma-ranges from DT */ -for_each_of_pci_range (&parser, &range) { -u64 end = range.cpu_addr + range.size -1 ; +resource_list_for_each_entry (entry, &bridge->dma_ranges) +xgene_pcie_setup_ib_reg (port, entry, &ib_reg_mask); -dev_dbg (dev,"0x%08x 0x%016llx..0x%016llx -> 0x%016llx\n" , - range.flags, range.cpu_addr, end, range.pci_addr); -xgene_pcie_setup_ib_reg (port, &range, &ib_reg_mask); - }return 0 ; }
Signature · 1 line
2.20.1
Rob Herring
maintainerPATCH v2 23/25 PCI: iproc: Use inbound resources for setup
In reply to Rob HerringNow 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.
---
v2:
- Fix iproc_pcie_paxb_v2_msi_steer() to use resource_entry
--- drivers/pci/controller/pcie-iproc.c | 76 ++++++----------------------- 1 file changed, 16 insertions(+), 60 deletions(-)
drivers/pci/controller/pcie-iproc.c +16 -60
@@ -1122,15 +1122,15 @@ 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, 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 +1182,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 +1229,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; }
Signature · 1 line
2.20.1
Rob Herring
maintainerPATCH v2 24/25 PCI: rcar: Use inbound resources for setup
In reply to Rob HerringNow that the helpers provide the inbound resources in the host bridge 'dma_ranges' resource list, convert Renesas R-Car PCIe host bridge to use the resource list to setup the inbound addresses.
--- drivers/pci/controller/pcie-rcar.c | 45 +++++++++++------------------- 1 file changed, 16 insertions(+), 29 deletions(-)
drivers/pci/controller/pcie-rcar.c +16 -29
@@ -1014,16 +1014,16 @@ static int rcar_pcie_get_resources(struct rcar_pcie *pcie) }static int rcar_pcie_inbound_ranges (struct rcar_pcie *pcie, -struct of_pci_range *range, +struct resource_entry *entry,int *index) { -u64 restype = range->flags; -u64 cpu_addr = range->cpu_addr; -u64 cpu_end = range->cpu_addr + range->size; -u64 pci_addr = range->pci_addr; +u64 restype = entry->res->flags; +u64 cpu_addr = entry->res->start; +u64 cpu_end = entry->res->end; +u64 pci_addr = entry->res->start - entry->offset;u32 flags =LAM_64BIT |LAR_ENABLE ;u64 mask; -u64 size; +u64 size =resource_size (entry->res);int idx = *index;if (restype &IORESOURCE_PREFETCH )
@@ -1037,9 +1037,7 @@ static int rcar_pcie_inbound_ranges(struct rcar_pcie *pcie,unsigned long nr_zeros =__ffs64 (cpu_addr);u64 alignment =1ULL << nr_zeros; - size =min (range->size, alignment); - }else { - size = range->size; + size =min (size, alignment); }/* Hardware supports max 4GiB inbound region */ size =min (size,1ULL <<32 );
@@ -1078,30 +1076,19 @@ static int rcar_pcie_inbound_ranges(struct rcar_pcie *pcie,return 0 ; } -static int rcar_pcie_parse_map_dma_ranges (struct rcar_pcie *pcie, -struct device_node *np) +static int rcar_pcie_parse_map_dma_ranges (struct rcar_pcie *pcie) { -struct of_pci_range range; -struct of_pci_range_parser parser; -int index =0 ; -int err; - -if (of_pci_dma_range_parser_init (&parser, np)) -return -EINVAL ; - -/* Get the dma-ranges from DT */ -for_each_of_pci_range (&parser, &range) { -u64 end = range.cpu_addr + range.size -1 ; - -dev_dbg (pcie->dev,"0x%08x 0x%016llx..0x%016llx -> 0x%016llx\n" , - range.flags, range.cpu_addr, end, range.pci_addr); +struct pci_host_bridge *bridge =pci_host_bridge_from_priv (pcie); +struct resource_entry *entry; +int index =0 , err =0 ; - err =rcar_pcie_inbound_ranges (pcie, &range, &index); +resource_list_for_each_entry (entry, &bridge->dma_ranges) { + err =rcar_pcie_inbound_ranges (pcie, entry, &index);if (err) -return err; +break ; } -return 0 ; +return err; }static const struct of_device_id rcar_pcie_of_match[] = {
@@ -1162,7 +1149,7 @@ static int rcar_pcie_probe(struct platform_device *pdev) goto err_unmap_msi_irqs; } - err =rcar_pcie_parse_map_dma_ranges (pcie, dev->of_node); + err =rcar_pcie_parse_map_dma_ranges (pcie);if (err) goto err_clk_disable;
Signature · 1 line
2.20.1
Rob Herring
maintainerPATCH v2 25/25 PCI: Make devm_of_pci_get_host_bridge_resources() static
In reply to Rob HerringNow that all the PCI host drivers are using pci_parse_request_of_pci_ranges(), make devm_of_pci_get_host_bridge_resources() static.
--- drivers/pci/of.c | 5 +---- drivers/pci/pci.h | 17 ----------------- 2 files changed, 1 insertion(+), 21 deletions(-)
drivers/pci/of.c +1 -4
@@ -236,7 +236,6 @@ void of_pci_check_probe_only(void) }EXPORT_SYMBOL_GPL (of_pci_check_probe_only); -#if defined(CONFIG_OF_ADDRESS )/** * devm_of_pci_get_host_bridge_resources() - Resource-managed parsing of PCI * host bridge resources from DT
@@ -255,7 +254,7 @@ EXPORT_SYMBOL_GPL(of_pci_check_probe_only);* It returns zero if the range parsing has been successful or a standard error * value if it failed. */ -int devm_of_pci_get_host_bridge_resources(struct device *dev, +static int devm_of_pci_get_host_bridge_resources(struct device *dev, unsigned char busno, unsigned char bus_max, struct list_head *resources, struct list_head *ib_resources,
@@ -384,8 +383,6 @@ int devm_of_pci_get_host_bridge_resources(struct device *dev,pci_free_resource_list (resources);return err; } -EXPORT_SYMBOL_GPL (devm_of_pci_get_host_bridge_resources); -#endif /* CONFIG_OF_ADDRESS */ #if IS_ENABLED (CONFIG_OF_IRQ )/**
drivers/pci/pci.h +0 -17
@@ -630,23 +630,6 @@ static inline void pci_set_bus_of_node(struct pci_bus *bus) { }static inline void pci_release_bus_of_node (struct pci_bus *bus) { }#endif /* CONFIG_OF */ -#if defined(CONFIG_OF_ADDRESS ) -int devm_of_pci_get_host_bridge_resources (struct device *dev, -unsigned char busno,unsigned char bus_max, -struct list_head *resources, -struct list_head *ib_resources, -resource_size_t *io_base); -#else -static inline int devm_of_pci_get_host_bridge_resources (struct device *dev, -unsigned char busno,unsigned char bus_max, -struct list_head *resources, -struct list_head *ib_resources, -resource_size_t *io_base) -{ -return -EINVAL ; -} -#endif -#ifdef CONFIG_PCIEAER void pci_no_aer (void );void pci_aer_init (struct pci_dev *dev);
Signature · 1 line
2.20.1