From: Liviu Dudau <Liviu.Dudau@arm.com>
To: Lorenzo Pieralisi <Lorenzo.Pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>,
Arnd Bergmann <arnd@arndb.de>, Rob Herring <robh+dt@kernel.org>,
Jason Gunthorpe <jgunthorpe@obsidianresearch.com>,
Benjamin Herrenschmidt <benh@kernel.crashing.org>,
Catalin Marinas <Catalin.Marinas@arm.com>,
Will Deacon <Will.Deacon@arm.com>,
Russell King <linux@arm.linux.org.uk>,
linux-pci <linux-pci@vger.kernel.org>,
Linus Walleij <linus.walleij@linaro.org>,
Tanmay Inamdar <tinamdar@apm.com>,
Grant Likely <grant.likely@secretlab.ca>,
Sinan Kaya <okaya@codeaurora.org>,
Jingoo Han <jg1.han@samsung.com>,
Kukjin Kim <kgene.kim@samsung.com>,
Suravee Suthikulanit <suravee.suthikulpanit@amd.com>,
linux-arch <linux-arch@vger.kernel.org>,
LKML <linux-kernel@vger.kernel.org>,
Device Tree ML <devicetree@vger.kernel.org>,
LAKML <linux-arm-kernel@lists.infradead.org>,
"grant.likely@linaro.org" <grant.likely@linaro.org>
Subject: Re: [PATCH v10 08/10] OF: PCI: Add support for parsing PCI host bridge resources from DT
Date: Wed, 10 Sep 2014 15:22:41 +0100 [thread overview]
Message-ID: <20140910142241.GD27864@e106497-lin.cambridge.arm.com> (raw)
In-Reply-To: <20140909133546.GB2636@e102568-lin.cambridge.arm.com>
On Tue, Sep 09, 2014 at 02:35:46PM +0100, Lorenzo Pieralisi wrote:
> On Mon, Sep 08, 2014 at 02:54:30PM +0100, Liviu Dudau wrote:
> > Provide a function to parse the PCI DT ranges that can be used to
> > create a pci_host_bridge structure together with its associated
> > bus.
> >
> > Cc: Bjorn Helgaas <bhelgaas@google.com>
> > Cc: Arnd Bergmann <arnd@arndb.de>
> > Cc: Grant Likely <grant.likely@linaro.org>
> > Cc: Rob Herring <robh+dt@kernel.org>
> > Cc: Catalin Marinas <catalin.marinas@arm.com>
> > Signed-off-by: Liviu Dudau <Liviu.Dudau@arm.com>
> > ---
> > drivers/of/of_pci.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++++
> > include/linux/of_pci.h | 11 ++++++
> > 2 files changed, 113 insertions(+)
> >
> > diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c
> > index a107edb..36701da 100644
> > --- a/drivers/of/of_pci.c
> > +++ b/drivers/of/of_pci.c
> > @@ -1,7 +1,9 @@
> > #include <linux/kernel.h>
> > #include <linux/export.h>
> > #include <linux/of.h>
> > +#include <linux/of_address.h>
> > #include <linux/of_pci.h>
> > +#include <linux/slab.h>
> >
> > static inline int __of_pci_pci_compare(struct device_node *node,
> > unsigned int data)
> > @@ -123,6 +125,106 @@ int of_pci_get_domain_nr(struct device_node *node, bool allocate_if_missing)
> > }
> > EXPORT_SYMBOL_GPL(of_pci_get_domain_nr);
> >
> > +/**
> > + * of_pci_get_host_bridge_resources - Parse PCI host bridge resources from DT
> > + * @dev: device node of the host bridge having the range property
> > + * @busno: bus number associated with the bridge root bus
> > + * @bus_max: maximum number of busses for this bridge
> > + * @resources: list where the range of resources will be added after DT parsing
> > + * @io_base: pointer to a variable that will contain on return the physical
> > + * address for the start of the I/O range.
> > + *
> > + * It is the callers job to free the @resources list.
> > + *
> > + * This function will parse the "ranges" property of a PCI host bridge device
> > + * node and setup the resource mapping based on its content. It is expected
> > + * that the property conforms with the Power ePAPR document.
>
> You should also define what it returns and when.
Thanks, will do.
>
> > + *
> > + */
> > +int of_pci_get_host_bridge_resources(struct device_node *dev,
> > + unsigned char busno, unsigned char bus_max,
> > + struct list_head *resources, resource_size_t *io_base)
> > +{
> > + struct resource *res;
> > + struct resource *bus_range;
> > + struct of_pci_range range;
> > + struct of_pci_range_parser parser;
> > + char range_type[4];
> > + int err;
> > +
> > + bus_range = kzalloc(sizeof(*bus_range), GFP_KERNEL);
> > + if (!bus_range)
> > + return -ENOMEM;
> > +
> > + pr_info("PCI host bridge %s ranges:\n", dev->full_name);
> > +
> > + err = of_pci_parse_bus_range(dev, bus_range);
> > + if (err) {
> > + bus_range->start = busno;
> > + bus_range->end = bus_max;
> > + bus_range->flags = IORESOURCE_BUS;
> > + pr_info(" No bus range found for %s, using %pR\n",
> > + dev->full_name, &bus_range);
> > + } else {
> > + if (bus_range->end > bus_range->start + bus_max)
> > + bus_range->end = bus_range->start + bus_max;
> > + }
> > + pci_add_resource(resources, bus_range);
>
> This means that eg in the PCI generic host controller I cannot "filter"
> the bus resource, unless I remove it, "filter" it, and add it again.
I'm not sure what you mean. Why do you have to remove the bus resource and
add it again? What you get back from of_pci_get_host_bridge_resources() is
a list of resources as they have been parsed from DT. You now have the option
of doing any filtering that you might have done pre-v10 in the
pcibios_fixup_bridge_ranges() but that is only on the list that was returned
from of_pci_get_host_bridge_resources(). At this moment no root bus or
host bridge structure has been created so no resource was added to those.
With the filtered list you can use it to call pci_scan_root_bus() and *then*
it gets added to the pci_host_bridge structure.
>
> I certainly can't filter a resource that has been already added without
> removing it first.
>
> Thoughts ?
Hope I have explained what happens. Please let me know if you have any other
comments.
Best regards,
Liviu
>
> > +
> > + /* Check for ranges property */
> > + err = of_pci_range_parser_init(&parser, dev);
> > + if (err)
> > + goto parse_failed;
> > +
> > + pr_debug("Parsing ranges property...\n");
> > + for_each_of_pci_range(&parser, &range) {
> > + /* Read next ranges element */
> > + if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_IO)
> > + snprintf(range_type, 4, " IO");
> > + else if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_MEM)
> > + snprintf(range_type, 4, "MEM");
> > + else
> > + snprintf(range_type, 4, "err");
> > + pr_info(" %s %#010llx..%#010llx -> %#010llx\n", range_type,
> > + range.cpu_addr, range.cpu_addr + range.size - 1,
> > + range.pci_addr);
> > +
> > + /*
> > + * If we failed translation or got a zero-sized region
> > + * then skip this range
> > + */
> > + if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
> > + continue;
> > +
> > + res = kzalloc(sizeof(struct resource), GFP_KERNEL);
> > + if (!res) {
> > + err = -ENOMEM;
> > + goto parse_failed;
> > + }
> > +
> > + err = of_pci_range_to_resource(&range, dev, res);
> > + if (err) {
> > + kfree(res);
>
> You might want to add a label to free res to make things more uniform.
>
> > + goto parse_failed;
> > + }
> > +
> > + if (resource_type(res) == IORESOURCE_IO) {
> > + if (*io_base)
>
> You do not zero io_base in the first place so you should ask the API
> user to do that. Is 0 a valid value BTW ? If it is you've got to resort
> to something else to detect multiple IO resources.
>
> Lorenzo
--
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯
next prev parent reply other threads:[~2014-09-10 14:22 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-08 13:54 [PATCH v10 00/10] Support for creating generic PCI host bridges " Liviu Dudau
2014-09-08 13:54 ` [PATCH v10 01/10] Fix ioport_map() for !CONFIG_GENERIC_IOMAP cases Liviu Dudau
2014-09-08 13:54 ` [PATCH v10 02/10] PCI: Introduce helper functions to deal with PCI I/O ranges Liviu Dudau
2014-09-08 13:54 ` [PATCH v10 03/10] ARM: Define PCI_IOBASE as the base of virtual PCI IO space Liviu Dudau
2014-09-08 13:54 ` [PATCH v10 04/10] PCI: OF: Fix the conversion of IO ranges into IO resources Liviu Dudau
2014-09-08 13:54 ` [PATCH v10 05/10] PCI: Create pci_host_bridge before its associated bus in pci_create_root_bus Liviu Dudau
2014-09-08 13:54 ` [PATCH v10 06/10] PCI: Introduce generic domain handling for PCI busses Liviu Dudau
2014-09-08 14:03 ` Catalin Marinas
2014-09-08 14:05 ` Liviu Dudau
2014-09-08 13:54 ` [PATCH v10 07/10] OF: Introduce helper function for getting PCI domain_nr Liviu Dudau
2014-09-08 14:27 ` Rob Herring
2014-09-08 14:54 ` Liviu Dudau
2014-09-08 15:27 ` Rob Herring
2014-09-08 15:59 ` Liviu Dudau
2014-09-08 16:39 ` Jason Gunthorpe
2014-09-09 5:54 ` Yijing Wang
2014-09-09 8:46 ` Liviu Dudau
2014-09-09 9:16 ` Arnd Bergmann
2014-09-09 11:20 ` Catalin Marinas
2014-09-10 18:19 ` Arnd Bergmann
2014-09-11 14:11 ` Phil Edworthy
2014-09-11 14:49 ` Arnd Bergmann
2014-09-09 14:17 ` Bjorn Helgaas
2014-09-09 9:30 ` Yijing Wang
2014-09-09 14:11 ` Liviu Dudau
2014-09-10 1:44 ` Yijing Wang
2014-09-09 14:26 ` Bjorn Helgaas
2014-09-09 15:41 ` Jason Gunthorpe
2014-09-10 2:44 ` Rob Herring
2014-09-10 16:32 ` Jason Gunthorpe
2014-09-10 1:55 ` Yijing Wang
2014-09-10 13:04 ` Liviu Dudau
2014-09-08 13:54 ` [PATCH v10 08/10] OF: PCI: Add support for parsing PCI host bridge resources from DT Liviu Dudau
2014-09-09 13:35 ` Lorenzo Pieralisi
2014-09-10 14:22 ` Liviu Dudau [this message]
2014-09-10 15:10 ` Lorenzo Pieralisi
2014-09-10 15:32 ` Liviu Dudau
2014-09-10 16:37 ` Lorenzo Pieralisi
2014-09-10 16:53 ` Liviu Dudau
2014-09-10 17:06 ` Lorenzo Pieralisi
2014-09-08 13:54 ` [PATCH v10 09/10] PCI: Assign unassigned bus resources in pci_scan_root_bus() Liviu Dudau
2014-09-12 10:13 ` Suravee Suthikulpanit
2014-09-12 10:34 ` Liviu Dudau
2014-09-08 13:54 ` [PATCH v10 10/10] PCI: Introduce pci_remap_iospace() for remapping PCI I/O bus resources into CPU space Liviu Dudau
2014-09-08 16:07 ` [PATCH v10 00/10] Support for creating generic PCI host bridges from DT Liviu Dudau
2014-09-12 8:25 ` Suravee Suthikulpanit
2014-09-12 9:30 ` Liviu Dudau
2014-09-12 10:00 ` Suravee Suthikulpanit
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=20140910142241.GD27864@e106497-lin.cambridge.arm.com \
--to=liviu.dudau@arm.com \
--cc=Catalin.Marinas@arm.com \
--cc=Lorenzo.Pieralisi@arm.com \
--cc=Will.Deacon@arm.com \
--cc=arnd@arndb.de \
--cc=benh@kernel.crashing.org \
--cc=bhelgaas@google.com \
--cc=devicetree@vger.kernel.org \
--cc=grant.likely@linaro.org \
--cc=grant.likely@secretlab.ca \
--cc=jg1.han@samsung.com \
--cc=jgunthorpe@obsidianresearch.com \
--cc=kgene.kim@samsung.com \
--cc=linus.walleij@linaro.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=okaya@codeaurora.org \
--cc=robh+dt@kernel.org \
--cc=suravee.suthikulpanit@amd.com \
--cc=tinamdar@apm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®