From: Rob Herring <robherring2@gmail.com>
To: Will Deacon <will.deacon@arm.com>, Arnd Bergmann <arnd@arndb.de>
Cc: Catalin Marinas <Catalin.Marinas@arm.com>,
Bjorn Helgaas <bhelgaas@google.com>,
"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
linaro-kernel <linaro-kernel@lists.linaro.org>,
linux-pci <linux-pci@vger.kernel.org>,
LKML <linux-kernel@vger.kernel.org>,
Grant Likely <grant.likely@secretlab.ca>,
Tanmay Inamdar <tinamdar@apm.com>,
Benjamin Herrenschmidt <benh@kernel.crashing.org>,
Jon Masters <jonathan@jonmasters.org>,
Liviu Dudau <Liviu.Dudau@arm.com>,
LAKML <linux-arm-kernel@lists.infradead.org>,
Michal Simek <monstr@monstr.eu>
Subject: Re: [PATCH v7 1/6] pci: Introduce pci_register_io_range() helper function.
Date: Fri, 27 Jun 2014 11:15:53 -0500 [thread overview]
Message-ID: <53AD98B9.2020109@gmail.com> (raw)
In-Reply-To: <20140627124949.GR26276@arm.com>
On 06/27/2014 07:49 AM, Will Deacon wrote:
> On Fri, Jun 27, 2014 at 12:03:34PM +0100, Arnd Bergmann wrote:
>> On Thursday 26 June 2014 19:44:21 Rob Herring wrote:
>>> I don't agree arm32 is harder than microblaze. Yes, converting ALL of
>>> arm would be, but that is not necessary. With Liviu's latest branch
>>> the hacks I previously needed are gone (thanks!), and this is all I
>>> need to get Versatile PCI working (under QEMU):
>>
>> I meant converting all of arm32 would be harder, but I agree we don't
>> have to do it. It would be nice to convert all of the drivers/pci/host
>> drivers though, iow all multiplatform-enabled ones, and leaving the
>> current arm32 pci implementation for the platforms we don't want to
>> convert to multiplatform anyway (footbridge, iop, ixp4xx, ks8695 (?),
>> pxa, sa1100).
>
> I'm more than happy to convert the generic host controller we merged
> recently, but I'd probably want the core changes merged first so that I
> know I'm not wasting my time!
Something like this untested patch...
Another issue I found still present is pci_ioremap_io needs some work
to unify with the arm implementation. That's a matter of changing the
function from an offset to i/o resource. That should be a pretty
mechanical change.
Also, there is a potential for memory leak because there is no undo
for of_create_pci_host_bridge.
Rob
8<------------------------------------------------------------------
>From 301b402631b2867ced38d5533586da0bd888045c Mon Sep 17 00:00:00 2001
From: Rob Herring <robh@kernel.org>
Date: Fri, 27 Jun 2014 09:46:09 -0500
Subject: [PATCH] pci: generic-host: refactor to use common range parsing
Signed-off-by: Rob Herring <robh@kernel.org>
---
drivers/pci/host/pci-host-generic.c | 191 ++++++------------------------------
1 file changed, 29 insertions(+), 162 deletions(-)
diff --git a/drivers/pci/host/pci-host-generic.c b/drivers/pci/host/pci-host-generic.c
index 44fe6aa..57fd1e1 100644
--- a/drivers/pci/host/pci-host-generic.c
+++ b/drivers/pci/host/pci-host-generic.c
@@ -32,16 +32,14 @@ struct gen_pci_cfg_bus_ops {
struct gen_pci_cfg_windows {
struct resource res;
- struct resource bus_range;
void __iomem **win;
const struct gen_pci_cfg_bus_ops *ops;
};
struct gen_pci {
- struct pci_host_bridge host;
+ struct pci_host_bridge *host;
struct gen_pci_cfg_windows cfg;
- struct list_head resources;
};
static void __iomem *gen_pci_map_cfg_bus_cam(struct pci_bus *bus,
@@ -50,7 +48,7 @@ static void __iomem *gen_pci_map_cfg_bus_cam(struct pci_bus *bus,
{
struct pci_sys_data *sys = bus->sysdata;
struct gen_pci *pci = sys->private_data;
- resource_size_t idx = bus->number - pci->cfg.bus_range.start;
+ resource_size_t idx = bus->number - bus->busn_res.start;
return pci->cfg.win[idx] + ((devfn << 8) | where);
}
@@ -66,7 +64,7 @@ static void __iomem *gen_pci_map_cfg_bus_ecam(struct pci_bus *bus,
{
struct pci_sys_data *sys = bus->sysdata;
struct gen_pci *pci = sys->private_data;
- resource_size_t idx = bus->number - pci->cfg.bus_range.start;
+ resource_size_t idx = bus->number - bus->busn_res.start;
return pci->cfg.win[idx] + ((devfn << 12) | where);
}
@@ -138,154 +136,32 @@ static const struct of_device_id gen_pci_of_match[] = {
};
MODULE_DEVICE_TABLE(of, gen_pci_of_match);
-static int gen_pci_calc_io_offset(struct device *dev,
- struct of_pci_range *range,
- struct resource *res,
- resource_size_t *offset)
-{
- static atomic_t wins = ATOMIC_INIT(0);
- int err, idx, max_win;
- unsigned int window;
-
- if (!PAGE_ALIGNED(range->cpu_addr))
- return -EINVAL;
-
- max_win = (IO_SPACE_LIMIT + 1) / SZ_64K;
- idx = atomic_inc_return(&wins);
- if (idx > max_win)
- return -ENOSPC;
-
- window = (idx - 1) * SZ_64K;
- err = pci_ioremap_io(window, range->cpu_addr);
- if (err)
- return err;
-
- of_pci_range_to_resource(range, dev->of_node, res);
- res->start = window;
- res->end = res->start + range->size - 1;
- *offset = window - range->pci_addr;
- return 0;
-}
-
-static int gen_pci_calc_mem_offset(struct device *dev,
- struct of_pci_range *range,
- struct resource *res,
- resource_size_t *offset)
-{
- of_pci_range_to_resource(range, dev->of_node, res);
- *offset = range->cpu_addr - range->pci_addr;
- return 0;
-}
-
-static void gen_pci_release_of_pci_ranges(struct gen_pci *pci)
-{
- struct pci_host_bridge_window *win;
-
- list_for_each_entry(win, &pci->resources, list)
- release_resource(win->res);
-
- pci_free_resource_list(&pci->resources);
-}
-
-static int gen_pci_parse_request_of_pci_ranges(struct gen_pci *pci)
-{
- struct of_pci_range range;
- struct of_pci_range_parser parser;
- int err, res_valid = 0;
- struct device *dev = pci->host.dev.parent;
- struct device_node *np = dev->of_node;
-
- if (of_pci_range_parser_init(&parser, np)) {
- dev_err(dev, "missing \"ranges\" property\n");
- return -EINVAL;
- }
-
- for_each_of_pci_range(&parser, &range) {
- struct resource *parent, *res;
- resource_size_t offset;
- u32 restype = range.flags & IORESOURCE_TYPE_BITS;
-
- res = devm_kmalloc(dev, sizeof(*res), GFP_KERNEL);
- if (!res) {
- err = -ENOMEM;
- goto out_release_res;
- }
-
- switch (restype) {
- case IORESOURCE_IO:
- parent = &ioport_resource;
- err = gen_pci_calc_io_offset(dev, &range, res, &offset);
- break;
- case IORESOURCE_MEM:
- parent = &iomem_resource;
- err = gen_pci_calc_mem_offset(dev, &range, res, &offset);
- res_valid |= !(res->flags & IORESOURCE_PREFETCH || err);
- break;
- default:
- err = -EINVAL;
- continue;
- }
-
- if (err) {
- dev_warn(dev,
- "error %d: failed to add resource [type 0x%x, %lld bytes]\n",
- err, restype, range.size);
- continue;
- }
-
- err = request_resource(parent, res);
- if (err)
- goto out_release_res;
-
- pci_add_resource_offset(&pci->resources, res, offset);
- }
-
- if (!res_valid) {
- dev_err(dev, "non-prefetchable memory resource required\n");
- err = -EINVAL;
- goto out_release_res;
- }
-
- return 0;
-
-out_release_res:
- gen_pci_release_of_pci_ranges(pci);
- return err;
-}
-
static int gen_pci_parse_map_cfg_windows(struct gen_pci *pci)
{
int err;
u8 bus_max;
resource_size_t busn;
- struct resource *bus_range;
- struct device *dev = pci->host.dev.parent;
+ struct pci_bus *bus = pci->host->bus;
+ struct resource *bus_range = &bus->busn_res;
+ struct device *dev = pci->host->dev.parent;
struct device_node *np = dev->of_node;
- if (of_pci_parse_bus_range(np, &pci->cfg.bus_range))
- pci->cfg.bus_range = (struct resource) {
- .name = np->name,
- .start = 0,
- .end = 0xff,
- .flags = IORESOURCE_BUS,
- };
-
err = of_address_to_resource(np, 0, &pci->cfg.res);
if (err) {
dev_err(dev, "missing \"reg\" property\n");
return err;
}
- pci->cfg.win = devm_kcalloc(dev, resource_size(&pci->cfg.bus_range),
+ pci->cfg.win = devm_kcalloc(dev, resource_size(bus_range),
sizeof(*pci->cfg.win), GFP_KERNEL);
if (!pci->cfg.win)
return -ENOMEM;
/* Limit the bus-range to fit within reg */
- bus_max = pci->cfg.bus_range.start +
+ bus_max = bus_range->start +
(resource_size(&pci->cfg.res) >> pci->cfg.ops->bus_shift) - 1;
- pci->cfg.bus_range.end = min_t(resource_size_t, pci->cfg.bus_range.end,
- bus_max);
+ pci_bus_update_busn_res_end(bus, min_t(resource_size_t,
+ bus_range->end, bus_max));
/* Map our Configuration Space windows */
if (!devm_request_mem_region(dev, pci->cfg.res.start,
@@ -293,7 +169,6 @@ static int gen_pci_parse_map_cfg_windows(struct gen_pci *pci)
"Configuration Space"))
return -ENOMEM;
- bus_range = &pci->cfg.bus_range;
for (busn = bus_range->start; busn <= bus_range->end; ++busn) {
u32 idx = busn - bus_range->start;
u32 sz = 1 << pci->cfg.ops->bus_shift;
@@ -305,34 +180,21 @@ static int gen_pci_parse_map_cfg_windows(struct gen_pci *pci)
return -ENOMEM;
}
- /* Register bus resource */
- pci_add_resource(&pci->resources, bus_range);
return 0;
}
-static int gen_pci_setup(int nr, struct pci_sys_data *sys)
-{
- struct gen_pci *pci = sys->private_data;
- list_splice_init(&pci->resources, &sys->resources);
- return 1;
-}
+/* Unused, temporary to satisfy ARM arch code */
+static struct pci_sys_data sys;
static int gen_pci_probe(struct platform_device *pdev)
{
- int err;
+ int err, lastbus;
const char *type;
const struct of_device_id *of_id;
const int *prop;
struct device *dev = &pdev->dev;
struct device_node *np = dev->of_node;
struct gen_pci *pci = devm_kzalloc(dev, sizeof(*pci), GFP_KERNEL);
- struct hw_pci hw = {
- .nr_controllers = 1,
- .private_data = (void **)&pci,
- .setup = gen_pci_setup,
- .map_irq = of_irq_parse_and_map_pci,
- .ops = &gen_pci_ops,
- };
if (!pci)
return -ENOMEM;
@@ -353,23 +215,28 @@ static int gen_pci_probe(struct platform_device *pdev)
of_id = of_match_node(gen_pci_of_match, np);
pci->cfg.ops = of_id->data;
- pci->host.dev.parent = dev;
- INIT_LIST_HEAD(&pci->host.windows);
- INIT_LIST_HEAD(&pci->resources);
- /* Parse our PCI ranges and request their resources */
- err = gen_pci_parse_request_of_pci_ranges(pci);
- if (err)
- return err;
+ pci->host = of_create_pci_host_bridge(&pdev->dev, &gen_pci_ops, &sys);
+ if (PTR_ERR(pci->host))
+ return PTR_ERR(pci->host);
/* Parse and map our Configuration Space windows */
err = gen_pci_parse_map_cfg_windows(pci);
- if (err) {
- gen_pci_release_of_pci_ranges(pci);
+ if (err)
return err;
- }
- pci_common_init_dev(dev, &hw);
+ pci_ioremap_io(0, pci->host->io_base);
+
+ pci_add_flags(PCI_ENABLE_PROC_DOMAINS);
+ pci_add_flags(PCI_REASSIGN_ALL_BUS | PCI_REASSIGN_ALL_RSRC);
+
+ lastbus = pci_scan_child_bus(pci->host->bus);
+ pci_bus_update_busn_res_end(pci->host->bus, lastbus);
+
+ pci_assign_unassigned_bus_resources(pci->host->bus);
+
+ pci_bus_add_devices(pci->host->bus);
+
return 0;
}
--
1.9.1
WARNING: multiple messages have this Message-ID (diff)
From: robherring2@gmail.com (Rob Herring)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v7 1/6] pci: Introduce pci_register_io_range() helper function.
Date: Fri, 27 Jun 2014 11:15:53 -0500 [thread overview]
Message-ID: <53AD98B9.2020109@gmail.com> (raw)
In-Reply-To: <20140627124949.GR26276@arm.com>
On 06/27/2014 07:49 AM, Will Deacon wrote:
> On Fri, Jun 27, 2014 at 12:03:34PM +0100, Arnd Bergmann wrote:
>> On Thursday 26 June 2014 19:44:21 Rob Herring wrote:
>>> I don't agree arm32 is harder than microblaze. Yes, converting ALL of
>>> arm would be, but that is not necessary. With Liviu's latest branch
>>> the hacks I previously needed are gone (thanks!), and this is all I
>>> need to get Versatile PCI working (under QEMU):
>>
>> I meant converting all of arm32 would be harder, but I agree we don't
>> have to do it. It would be nice to convert all of the drivers/pci/host
>> drivers though, iow all multiplatform-enabled ones, and leaving the
>> current arm32 pci implementation for the platforms we don't want to
>> convert to multiplatform anyway (footbridge, iop, ixp4xx, ks8695 (?),
>> pxa, sa1100).
>
> I'm more than happy to convert the generic host controller we merged
> recently, but I'd probably want the core changes merged first so that I
> know I'm not wasting my time!
Something like this untested patch...
Another issue I found still present is pci_ioremap_io needs some work
to unify with the arm implementation. That's a matter of changing the
function from an offset to i/o resource. That should be a pretty
mechanical change.
Also, there is a potential for memory leak because there is no undo
for of_create_pci_host_bridge.
Rob
8<------------------------------------------------------------------
>From 301b402631b2867ced38d5533586da0bd888045c Mon Sep 17 00:00:00 2001
From: Rob Herring <robh@kernel.org>
Date: Fri, 27 Jun 2014 09:46:09 -0500
Subject: [PATCH] pci: generic-host: refactor to use common range parsing
Signed-off-by: Rob Herring <robh@kernel.org>
---
drivers/pci/host/pci-host-generic.c | 191 ++++++------------------------------
1 file changed, 29 insertions(+), 162 deletions(-)
diff --git a/drivers/pci/host/pci-host-generic.c b/drivers/pci/host/pci-host-generic.c
index 44fe6aa..57fd1e1 100644
--- a/drivers/pci/host/pci-host-generic.c
+++ b/drivers/pci/host/pci-host-generic.c
@@ -32,16 +32,14 @@ struct gen_pci_cfg_bus_ops {
struct gen_pci_cfg_windows {
struct resource res;
- struct resource bus_range;
void __iomem **win;
const struct gen_pci_cfg_bus_ops *ops;
};
struct gen_pci {
- struct pci_host_bridge host;
+ struct pci_host_bridge *host;
struct gen_pci_cfg_windows cfg;
- struct list_head resources;
};
static void __iomem *gen_pci_map_cfg_bus_cam(struct pci_bus *bus,
@@ -50,7 +48,7 @@ static void __iomem *gen_pci_map_cfg_bus_cam(struct pci_bus *bus,
{
struct pci_sys_data *sys = bus->sysdata;
struct gen_pci *pci = sys->private_data;
- resource_size_t idx = bus->number - pci->cfg.bus_range.start;
+ resource_size_t idx = bus->number - bus->busn_res.start;
return pci->cfg.win[idx] + ((devfn << 8) | where);
}
@@ -66,7 +64,7 @@ static void __iomem *gen_pci_map_cfg_bus_ecam(struct pci_bus *bus,
{
struct pci_sys_data *sys = bus->sysdata;
struct gen_pci *pci = sys->private_data;
- resource_size_t idx = bus->number - pci->cfg.bus_range.start;
+ resource_size_t idx = bus->number - bus->busn_res.start;
return pci->cfg.win[idx] + ((devfn << 12) | where);
}
@@ -138,154 +136,32 @@ static const struct of_device_id gen_pci_of_match[] = {
};
MODULE_DEVICE_TABLE(of, gen_pci_of_match);
-static int gen_pci_calc_io_offset(struct device *dev,
- struct of_pci_range *range,
- struct resource *res,
- resource_size_t *offset)
-{
- static atomic_t wins = ATOMIC_INIT(0);
- int err, idx, max_win;
- unsigned int window;
-
- if (!PAGE_ALIGNED(range->cpu_addr))
- return -EINVAL;
-
- max_win = (IO_SPACE_LIMIT + 1) / SZ_64K;
- idx = atomic_inc_return(&wins);
- if (idx > max_win)
- return -ENOSPC;
-
- window = (idx - 1) * SZ_64K;
- err = pci_ioremap_io(window, range->cpu_addr);
- if (err)
- return err;
-
- of_pci_range_to_resource(range, dev->of_node, res);
- res->start = window;
- res->end = res->start + range->size - 1;
- *offset = window - range->pci_addr;
- return 0;
-}
-
-static int gen_pci_calc_mem_offset(struct device *dev,
- struct of_pci_range *range,
- struct resource *res,
- resource_size_t *offset)
-{
- of_pci_range_to_resource(range, dev->of_node, res);
- *offset = range->cpu_addr - range->pci_addr;
- return 0;
-}
-
-static void gen_pci_release_of_pci_ranges(struct gen_pci *pci)
-{
- struct pci_host_bridge_window *win;
-
- list_for_each_entry(win, &pci->resources, list)
- release_resource(win->res);
-
- pci_free_resource_list(&pci->resources);
-}
-
-static int gen_pci_parse_request_of_pci_ranges(struct gen_pci *pci)
-{
- struct of_pci_range range;
- struct of_pci_range_parser parser;
- int err, res_valid = 0;
- struct device *dev = pci->host.dev.parent;
- struct device_node *np = dev->of_node;
-
- if (of_pci_range_parser_init(&parser, np)) {
- dev_err(dev, "missing \"ranges\" property\n");
- return -EINVAL;
- }
-
- for_each_of_pci_range(&parser, &range) {
- struct resource *parent, *res;
- resource_size_t offset;
- u32 restype = range.flags & IORESOURCE_TYPE_BITS;
-
- res = devm_kmalloc(dev, sizeof(*res), GFP_KERNEL);
- if (!res) {
- err = -ENOMEM;
- goto out_release_res;
- }
-
- switch (restype) {
- case IORESOURCE_IO:
- parent = &ioport_resource;
- err = gen_pci_calc_io_offset(dev, &range, res, &offset);
- break;
- case IORESOURCE_MEM:
- parent = &iomem_resource;
- err = gen_pci_calc_mem_offset(dev, &range, res, &offset);
- res_valid |= !(res->flags & IORESOURCE_PREFETCH || err);
- break;
- default:
- err = -EINVAL;
- continue;
- }
-
- if (err) {
- dev_warn(dev,
- "error %d: failed to add resource [type 0x%x, %lld bytes]\n",
- err, restype, range.size);
- continue;
- }
-
- err = request_resource(parent, res);
- if (err)
- goto out_release_res;
-
- pci_add_resource_offset(&pci->resources, res, offset);
- }
-
- if (!res_valid) {
- dev_err(dev, "non-prefetchable memory resource required\n");
- err = -EINVAL;
- goto out_release_res;
- }
-
- return 0;
-
-out_release_res:
- gen_pci_release_of_pci_ranges(pci);
- return err;
-}
-
static int gen_pci_parse_map_cfg_windows(struct gen_pci *pci)
{
int err;
u8 bus_max;
resource_size_t busn;
- struct resource *bus_range;
- struct device *dev = pci->host.dev.parent;
+ struct pci_bus *bus = pci->host->bus;
+ struct resource *bus_range = &bus->busn_res;
+ struct device *dev = pci->host->dev.parent;
struct device_node *np = dev->of_node;
- if (of_pci_parse_bus_range(np, &pci->cfg.bus_range))
- pci->cfg.bus_range = (struct resource) {
- .name = np->name,
- .start = 0,
- .end = 0xff,
- .flags = IORESOURCE_BUS,
- };
-
err = of_address_to_resource(np, 0, &pci->cfg.res);
if (err) {
dev_err(dev, "missing \"reg\" property\n");
return err;
}
- pci->cfg.win = devm_kcalloc(dev, resource_size(&pci->cfg.bus_range),
+ pci->cfg.win = devm_kcalloc(dev, resource_size(bus_range),
sizeof(*pci->cfg.win), GFP_KERNEL);
if (!pci->cfg.win)
return -ENOMEM;
/* Limit the bus-range to fit within reg */
- bus_max = pci->cfg.bus_range.start +
+ bus_max = bus_range->start +
(resource_size(&pci->cfg.res) >> pci->cfg.ops->bus_shift) - 1;
- pci->cfg.bus_range.end = min_t(resource_size_t, pci->cfg.bus_range.end,
- bus_max);
+ pci_bus_update_busn_res_end(bus, min_t(resource_size_t,
+ bus_range->end, bus_max));
/* Map our Configuration Space windows */
if (!devm_request_mem_region(dev, pci->cfg.res.start,
@@ -293,7 +169,6 @@ static int gen_pci_parse_map_cfg_windows(struct gen_pci *pci)
"Configuration Space"))
return -ENOMEM;
- bus_range = &pci->cfg.bus_range;
for (busn = bus_range->start; busn <= bus_range->end; ++busn) {
u32 idx = busn - bus_range->start;
u32 sz = 1 << pci->cfg.ops->bus_shift;
@@ -305,34 +180,21 @@ static int gen_pci_parse_map_cfg_windows(struct gen_pci *pci)
return -ENOMEM;
}
- /* Register bus resource */
- pci_add_resource(&pci->resources, bus_range);
return 0;
}
-static int gen_pci_setup(int nr, struct pci_sys_data *sys)
-{
- struct gen_pci *pci = sys->private_data;
- list_splice_init(&pci->resources, &sys->resources);
- return 1;
-}
+/* Unused, temporary to satisfy ARM arch code */
+static struct pci_sys_data sys;
static int gen_pci_probe(struct platform_device *pdev)
{
- int err;
+ int err, lastbus;
const char *type;
const struct of_device_id *of_id;
const int *prop;
struct device *dev = &pdev->dev;
struct device_node *np = dev->of_node;
struct gen_pci *pci = devm_kzalloc(dev, sizeof(*pci), GFP_KERNEL);
- struct hw_pci hw = {
- .nr_controllers = 1,
- .private_data = (void **)&pci,
- .setup = gen_pci_setup,
- .map_irq = of_irq_parse_and_map_pci,
- .ops = &gen_pci_ops,
- };
if (!pci)
return -ENOMEM;
@@ -353,23 +215,28 @@ static int gen_pci_probe(struct platform_device *pdev)
of_id = of_match_node(gen_pci_of_match, np);
pci->cfg.ops = of_id->data;
- pci->host.dev.parent = dev;
- INIT_LIST_HEAD(&pci->host.windows);
- INIT_LIST_HEAD(&pci->resources);
- /* Parse our PCI ranges and request their resources */
- err = gen_pci_parse_request_of_pci_ranges(pci);
- if (err)
- return err;
+ pci->host = of_create_pci_host_bridge(&pdev->dev, &gen_pci_ops, &sys);
+ if (PTR_ERR(pci->host))
+ return PTR_ERR(pci->host);
/* Parse and map our Configuration Space windows */
err = gen_pci_parse_map_cfg_windows(pci);
- if (err) {
- gen_pci_release_of_pci_ranges(pci);
+ if (err)
return err;
- }
- pci_common_init_dev(dev, &hw);
+ pci_ioremap_io(0, pci->host->io_base);
+
+ pci_add_flags(PCI_ENABLE_PROC_DOMAINS);
+ pci_add_flags(PCI_REASSIGN_ALL_BUS | PCI_REASSIGN_ALL_RSRC);
+
+ lastbus = pci_scan_child_bus(pci->host->bus);
+ pci_bus_update_busn_res_end(pci->host->bus, lastbus);
+
+ pci_assign_unassigned_bus_resources(pci->host->bus);
+
+ pci_bus_add_devices(pci->host->bus);
+
return 0;
}
--
1.9.1
next prev parent reply other threads:[~2014-06-27 16:15 UTC|newest]
Thread overview: 177+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-14 15:34 [PATCH v7 0/6] Support for creating generic host_bridge from device tree Liviu Dudau
2014-03-14 15:34 ` Liviu Dudau
2014-03-14 15:34 ` [PATCH v7 1/6] pci: Introduce pci_register_io_range() helper function Liviu Dudau
2014-03-14 15:34 ` Liviu Dudau
2014-04-05 0:19 ` Bjorn Helgaas
2014-04-05 0:19 ` Bjorn Helgaas
2014-04-05 0:19 ` Bjorn Helgaas
2014-04-06 9:49 ` Benjamin Herrenschmidt
2014-04-06 9:49 ` Benjamin Herrenschmidt
2014-04-06 9:49 ` Benjamin Herrenschmidt
2014-04-07 8:35 ` Liviu Dudau
2014-04-07 8:35 ` Liviu Dudau
2014-04-07 8:35 ` Liviu Dudau
2014-04-07 9:13 ` Benjamin Herrenschmidt
2014-04-07 9:13 ` Benjamin Herrenschmidt
2014-04-07 9:13 ` Benjamin Herrenschmidt
2014-04-07 11:16 ` Arnd Bergmann
2014-04-07 11:16 ` Arnd Bergmann
2014-04-07 11:16 ` Arnd Bergmann
2014-04-07 8:31 ` Liviu Dudau
2014-04-07 8:31 ` Liviu Dudau
2014-04-07 8:31 ` Liviu Dudau
2014-04-07 11:36 ` Arnd Bergmann
2014-04-07 11:36 ` Arnd Bergmann
2014-04-07 11:36 ` Arnd Bergmann
2014-04-07 13:42 ` Liviu Dudau
2014-04-07 13:42 ` Liviu Dudau
2014-04-07 13:42 ` Liviu Dudau
2014-04-07 17:58 ` Bjorn Helgaas
2014-04-07 17:58 ` Bjorn Helgaas
2014-04-07 17:58 ` Bjorn Helgaas
2014-04-08 9:50 ` Liviu Dudau
2014-04-08 9:50 ` Liviu Dudau
2014-04-08 10:22 ` Arnd Bergmann
2014-04-08 10:22 ` Arnd Bergmann
2014-04-08 16:54 ` Bjorn Helgaas
2014-04-08 16:54 ` Bjorn Helgaas
2014-06-26 8:59 ` Catalin Marinas
2014-06-26 8:59 ` Catalin Marinas
2014-06-26 9:30 ` Liviu Dudau
2014-06-26 9:30 ` Liviu Dudau
2014-06-26 14:11 ` Catalin Marinas
2014-06-26 14:11 ` Catalin Marinas
2014-06-26 14:11 ` Catalin Marinas
2014-06-26 14:14 ` Will Deacon
2014-06-26 14:14 ` Will Deacon
2014-06-27 0:44 ` Rob Herring
2014-06-27 0:44 ` Rob Herring
2014-06-27 11:03 ` Arnd Bergmann
2014-06-27 11:03 ` Arnd Bergmann
2014-06-27 12:49 ` Will Deacon
2014-06-27 12:49 ` Will Deacon
2014-06-27 13:16 ` Arnd Bergmann
2014-06-27 13:16 ` Arnd Bergmann
2014-06-27 13:38 ` Catalin Marinas
2014-06-27 13:38 ` Catalin Marinas
2014-06-27 13:38 ` Catalin Marinas
2014-06-27 16:15 ` Rob Herring [this message]
2014-06-27 16:15 ` Rob Herring
2014-06-30 10:17 ` Will Deacon
2014-06-30 10:17 ` Will Deacon
2014-06-27 14:14 ` Catalin Marinas
2014-06-27 14:14 ` Catalin Marinas
2014-06-27 14:14 ` Catalin Marinas
2014-06-27 14:55 ` Bjorn Helgaas
2014-06-27 14:55 ` Bjorn Helgaas
2014-06-27 15:18 ` Liviu Dudau
2014-06-27 15:18 ` Liviu Dudau
2014-04-07 23:21 ` Bjorn Helgaas
2014-04-07 23:21 ` Bjorn Helgaas
2014-04-08 7:12 ` Arnd Bergmann
2014-04-08 7:12 ` Arnd Bergmann
2014-04-08 9:49 ` Liviu Dudau
2014-04-08 9:49 ` Liviu Dudau
2014-04-08 10:11 ` Arnd Bergmann
2014-04-08 10:11 ` Arnd Bergmann
2014-04-08 16:48 ` Bjorn Helgaas
2014-04-08 16:48 ` Bjorn Helgaas
2014-03-14 15:34 ` [PATCH v7 2/6] pci: OF: Fix the conversion of IO ranges into IO resources Liviu Dudau
2014-03-14 15:34 ` Liviu Dudau
2014-03-14 17:05 ` Arnd Bergmann
2014-03-14 17:05 ` Arnd Bergmann
2014-03-14 17:05 ` Arnd Bergmann
2014-03-14 17:19 ` Liviu Dudau
2014-03-14 17:19 ` Liviu Dudau
2014-03-14 17:19 ` Liviu Dudau
2014-03-14 18:46 ` Arnd Bergmann
2014-03-14 18:46 ` Arnd Bergmann
2014-03-14 19:00 ` Liviu Dudau
2014-03-14 19:00 ` Liviu Dudau
2014-03-14 19:16 ` Arnd Bergmann
2014-03-14 19:16 ` Arnd Bergmann
2014-03-14 19:16 ` Arnd Bergmann
2014-03-17 13:41 ` Liviu Dudau
2014-03-17 13:41 ` Liviu Dudau
2014-03-14 15:34 ` [PATCH v7 3/6] pci: Create pci_host_bridge before its associated bus in pci_create_root_bus Liviu Dudau
2014-03-14 15:34 ` Liviu Dudau
2014-03-14 15:34 ` [PATCH v7 4/6] pci: Introduce a domain number for pci_host_bridge Liviu Dudau
2014-03-14 15:34 ` Liviu Dudau
2014-03-14 15:34 ` Liviu Dudau
2014-04-05 0:00 ` Bjorn Helgaas
2014-04-05 0:00 ` Bjorn Helgaas
2014-04-07 8:46 ` Liviu Dudau
2014-04-07 8:46 ` Liviu Dudau
2014-04-07 9:14 ` Benjamin Herrenschmidt
2014-04-07 9:14 ` Benjamin Herrenschmidt
2014-04-07 9:14 ` Benjamin Herrenschmidt
2014-04-07 10:07 ` Liviu Dudau
2014-04-07 10:07 ` Liviu Dudau
2014-04-07 10:07 ` Liviu Dudau
2014-04-07 22:44 ` Bjorn Helgaas
2014-04-07 22:44 ` Bjorn Helgaas
2014-04-08 10:20 ` Liviu Dudau
2014-04-08 10:20 ` Liviu Dudau
2014-04-08 16:28 ` Bjorn Helgaas
2014-04-08 16:28 ` Bjorn Helgaas
2014-04-08 16:28 ` Bjorn Helgaas
2014-04-09 12:07 ` Liviu Dudau
2014-04-09 12:07 ` Liviu Dudau
2014-04-09 14:02 ` Bjorn Helgaas
2014-04-09 14:02 ` Bjorn Helgaas
2014-04-09 14:08 ` Arnd Bergmann
2014-04-09 14:08 ` Arnd Bergmann
2014-04-09 23:49 ` Benjamin Herrenschmidt
2014-04-09 23:49 ` Benjamin Herrenschmidt
2014-04-10 1:27 ` Liviu Dudau
2014-04-10 1:27 ` Liviu Dudau
2014-04-10 1:27 ` Liviu Dudau
2014-04-10 3:48 ` Bjorn Helgaas
2014-04-10 3:48 ` Bjorn Helgaas
2014-04-10 8:00 ` Arnd Bergmann
2014-04-10 8:00 ` Arnd Bergmann
2014-04-10 8:00 ` Arnd Bergmann
2014-04-10 13:50 ` Bjorn Helgaas
2014-04-10 13:50 ` Bjorn Helgaas
2014-04-10 14:07 ` Arnd Bergmann
2014-04-10 14:07 ` Arnd Bergmann
2014-04-10 14:07 ` Arnd Bergmann
2014-04-10 14:53 ` Liviu Dudau
2014-04-10 14:53 ` Liviu Dudau
2014-04-10 14:53 ` Liviu Dudau
2014-04-10 20:46 ` Arnd Bergmann
2014-04-10 20:46 ` Arnd Bergmann
2014-04-11 5:01 ` Benjamin Herrenschmidt
2014-04-11 5:01 ` Benjamin Herrenschmidt
2014-04-11 8:36 ` Arnd Bergmann
2014-04-11 8:36 ` Arnd Bergmann
2014-04-11 9:16 ` Benjamin Herrenschmidt
2014-04-11 9:16 ` Benjamin Herrenschmidt
2014-04-11 9:22 ` Liviu Dudau
2014-04-11 9:22 ` Liviu Dudau
2014-04-11 13:51 ` Arnd Bergmann
2014-04-11 13:51 ` Arnd Bergmann
2014-04-11 13:51 ` Arnd Bergmann
2014-07-01 16:37 ` Liviu Dudau
2014-07-01 16:37 ` Liviu Dudau
2014-07-04 14:57 ` Liviu Dudau
2014-07-04 14:57 ` Liviu Dudau
2014-07-08 1:11 ` Bjorn Helgaas
2014-07-08 1:11 ` Bjorn Helgaas
2014-07-08 10:21 ` Liviu Dudau
2014-07-08 10:21 ` Liviu Dudau
2014-03-14 15:34 ` [PATCH v7 5/6] pci: Export find_pci_host_bridge() function Liviu Dudau
2014-03-14 15:34 ` Liviu Dudau
2014-04-04 23:39 ` Bjorn Helgaas
2014-04-04 23:39 ` Bjorn Helgaas
2014-04-07 14:20 ` Liviu Dudau
2014-04-07 14:20 ` Liviu Dudau
2014-04-07 14:38 ` One Thousand Gnomes
2014-04-07 14:38 ` One Thousand Gnomes
2014-04-07 14:38 ` One Thousand Gnomes
2014-03-14 15:34 ` [PATCH v7 6/6] pci: Add support for creating a generic host_bridge from device tree Liviu Dudau
2014-03-14 15:34 ` Liviu Dudau
2014-04-08 12:57 ` Hanjun Guo
2014-04-08 12:57 ` Hanjun Guo
2014-04-08 13:09 ` Liviu Dudau
2014-04-08 13:09 ` Liviu Dudau
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=53AD98B9.2020109@gmail.com \
--to=robherring2@gmail.com \
--cc=Catalin.Marinas@arm.com \
--cc=Liviu.Dudau@arm.com \
--cc=arnd@arndb.de \
--cc=benh@kernel.crashing.org \
--cc=bhelgaas@google.com \
--cc=devicetree@vger.kernel.org \
--cc=grant.likely@secretlab.ca \
--cc=jonathan@jonmasters.org \
--cc=linaro-kernel@lists.linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=monstr@monstr.eu \
--cc=tinamdar@apm.com \
--cc=will.deacon@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.