All of lore.kernel.org
 help / color / mirror / Atom feed
From: Liviu Dudau <Liviu.Dudau@arm.com>
To: Rob Herring <robherring2@gmail.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 07/10] OF: Introduce helper function for getting PCI domain_nr
Date: Mon, 8 Sep 2014 15:54:59 +0100	[thread overview]
Message-ID: <20140908145459.GO27864@e106497-lin.cambridge.arm.com> (raw)
In-Reply-To: <CAL_JsqJi8k1Goc3UmXhuxf9v7=4gJrYG_Di7v574PxS8TsJaXw@mail.gmail.com>

On Mon, Sep 08, 2014 at 03:27:56PM +0100, Rob Herring wrote:
> On Mon, Sep 8, 2014 at 8:54 AM, Liviu Dudau <Liviu.Dudau@arm.com> wrote:
> > Add of_pci_get_domain_nr() to retrieve the PCI domain number
> > of a given device from DT. If the information is not present,
> > the function can be requested to allocate a new domain number.
> >
> > 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>
> > Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
> > Signed-off-by: Liviu Dudau <Liviu.Dudau@arm.com>
> > ---
> >  drivers/of/of_pci.c    | 34 ++++++++++++++++++++++++++++++++++
> >  include/linux/of_pci.h |  7 +++++++
> >  2 files changed, 41 insertions(+)
> >
> > diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c
> > index 8481996..a107edb 100644
> > --- a/drivers/of/of_pci.c
> > +++ b/drivers/of/of_pci.c
> > @@ -89,6 +89,40 @@ int of_pci_parse_bus_range(struct device_node *node, struct resource *res)
> >  }
> >  EXPORT_SYMBOL_GPL(of_pci_parse_bus_range);
> >
> > +static atomic_t of_domain_nr = ATOMIC_INIT(-1);
> > +
> > +/**
> > + * This function will try to obtain the host bridge domain number by
> > + * using of_alias_get_id() call with "pci-domain" as a stem. If that
> > + * fails, a local allocator will be used. The local allocator can
> > + * be requested to return a new domain_nr if the information is missing
> > + * from the device tree.
> > + *
> > + * @node: device tree node with the domain information
> > + * @allocate_if_missing: if DT lacks information about the domain nr,
> > + * allocate a new number.
> > + *
> > + * Returns the associated domain number from DT, or a new domain number
> > + * if DT information is missing and @allocate_if_missing is true. If
> > + * @allocate_if_missing is false then the last allocated domain number
> > + * will be returned.
> > + */
> > +int of_pci_get_domain_nr(struct device_node *node, bool allocate_if_missing)
> > +{
> > +       int domain;
> > +
> > +       domain = of_alias_get_id(node, "pci-domain");
> > +       if (domain == -ENODEV) {
> > +               if (allocate_if_missing)
> > +                       domain = atomic_inc_return(&of_domain_nr);
> > +               else
> > +                       domain = atomic_read(&of_domain_nr);
> 
> This function seems a bit broken to me. It is overloaded with too many
> different outcomes. Think about how this would work if you have
> multiple PCI buses and a mixture of having pci-domain aliases or not.
> Aren't domain numbers global? Allocation should then start outside of
> the range of alias ids.
> 
> Rob
> 

Rob,

Would this version make more sense?

int of_pci_get_domain_nr(struct device_node *node, bool allocate_if_missing)
{
       int domain;

       domain = of_alias_get_id(node, "pci-domain");
       if (domain == -ENODEV) {
               if (allocate_if_missing)
                       domain = atomic_inc_return(&of_domain_nr);
               else
                       domain = atomic_read(&of_domain_nr);
       } else {
               /* remember the largest value seen */
               int d = atomic_read(&of_domain_nr);
               atomic_set(&of_domain_nr, max(domain, d));
       }

       return domain;
}
EXPORT_SYMBOL_GPL(of_pci_get_domain_nr);

It would still create gaps and possible duplicates, but this is just a number
and trying to create a new root bus in an existing domain should fail. I have
no clue on how to generate unique values without parsing the DT and filling
a sparse array with values found there and then checking for allocated values
on new requests. This function gets called quite a lot and I'm trying not to
make it too heavy weight.


Best regards,
Liviu

-- 
====================
| I would like to |
| fix the world,  |
| but they're not |
| giving me the   |
 \ source code!  /
  ---------------
    ¯\_(ツ)_/¯


WARNING: multiple messages have this Message-ID (diff)
From: Liviu.Dudau@arm.com (Liviu Dudau)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v10 07/10] OF: Introduce helper function for getting PCI domain_nr
Date: Mon, 8 Sep 2014 15:54:59 +0100	[thread overview]
Message-ID: <20140908145459.GO27864@e106497-lin.cambridge.arm.com> (raw)
In-Reply-To: <CAL_JsqJi8k1Goc3UmXhuxf9v7=4gJrYG_Di7v574PxS8TsJaXw@mail.gmail.com>

On Mon, Sep 08, 2014 at 03:27:56PM +0100, Rob Herring wrote:
> On Mon, Sep 8, 2014 at 8:54 AM, Liviu Dudau <Liviu.Dudau@arm.com> wrote:
> > Add of_pci_get_domain_nr() to retrieve the PCI domain number
> > of a given device from DT. If the information is not present,
> > the function can be requested to allocate a new domain number.
> >
> > 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>
> > Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
> > Signed-off-by: Liviu Dudau <Liviu.Dudau@arm.com>
> > ---
> >  drivers/of/of_pci.c    | 34 ++++++++++++++++++++++++++++++++++
> >  include/linux/of_pci.h |  7 +++++++
> >  2 files changed, 41 insertions(+)
> >
> > diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c
> > index 8481996..a107edb 100644
> > --- a/drivers/of/of_pci.c
> > +++ b/drivers/of/of_pci.c
> > @@ -89,6 +89,40 @@ int of_pci_parse_bus_range(struct device_node *node, struct resource *res)
> >  }
> >  EXPORT_SYMBOL_GPL(of_pci_parse_bus_range);
> >
> > +static atomic_t of_domain_nr = ATOMIC_INIT(-1);
> > +
> > +/**
> > + * This function will try to obtain the host bridge domain number by
> > + * using of_alias_get_id() call with "pci-domain" as a stem. If that
> > + * fails, a local allocator will be used. The local allocator can
> > + * be requested to return a new domain_nr if the information is missing
> > + * from the device tree.
> > + *
> > + * @node: device tree node with the domain information
> > + * @allocate_if_missing: if DT lacks information about the domain nr,
> > + * allocate a new number.
> > + *
> > + * Returns the associated domain number from DT, or a new domain number
> > + * if DT information is missing and @allocate_if_missing is true. If
> > + * @allocate_if_missing is false then the last allocated domain number
> > + * will be returned.
> > + */
> > +int of_pci_get_domain_nr(struct device_node *node, bool allocate_if_missing)
> > +{
> > +       int domain;
> > +
> > +       domain = of_alias_get_id(node, "pci-domain");
> > +       if (domain == -ENODEV) {
> > +               if (allocate_if_missing)
> > +                       domain = atomic_inc_return(&of_domain_nr);
> > +               else
> > +                       domain = atomic_read(&of_domain_nr);
> 
> This function seems a bit broken to me. It is overloaded with too many
> different outcomes. Think about how this would work if you have
> multiple PCI buses and a mixture of having pci-domain aliases or not.
> Aren't domain numbers global? Allocation should then start outside of
> the range of alias ids.
> 
> Rob
> 

Rob,

Would this version make more sense?

int of_pci_get_domain_nr(struct device_node *node, bool allocate_if_missing)
{
       int domain;

       domain = of_alias_get_id(node, "pci-domain");
       if (domain == -ENODEV) {
               if (allocate_if_missing)
                       domain = atomic_inc_return(&of_domain_nr);
               else
                       domain = atomic_read(&of_domain_nr);
       } else {
               /* remember the largest value seen */
               int d = atomic_read(&of_domain_nr);
               atomic_set(&of_domain_nr, max(domain, d));
       }

       return domain;
}
EXPORT_SYMBOL_GPL(of_pci_get_domain_nr);

It would still create gaps and possible duplicates, but this is just a number
and trying to create a new root bus in an existing domain should fail. I have
no clue on how to generate unique values without parsing the DT and filling
a sparse array with values found there and then checking for allocated values
on new requests. This function gets called quite a lot and I'm trying not to
make it too heavy weight.


Best regards,
Liviu

-- 
====================
| I would like to |
| fix the world,  |
| but they're not |
| giving me the   |
 \ source code!  /
  ---------------
    ?\_(?)_/?

  reply	other threads:[~2014-09-08 14:55 UTC|newest]

Thread overview: 121+ 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 from DT Liviu Dudau
2014-09-08 13:54 ` Liviu Dudau
2014-09-08 13:54 ` 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   ` Liviu Dudau
2014-09-08 13:54   ` 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   ` 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   ` 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   ` 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   ` Liviu Dudau
2014-09-08 13:54   ` Liviu Dudau
2014-09-08 13:54 ` [PATCH v10 06/10] PCI: Introduce generic domain handling for PCI busses Liviu Dudau
2014-09-08 13:54   ` Liviu Dudau
2014-09-08 13:54   ` Liviu Dudau
2014-09-08 14:03   ` Catalin Marinas
2014-09-08 14:03     ` Catalin Marinas
2014-09-08 14:05     ` Liviu Dudau
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 13:54   ` Liviu Dudau
2014-09-08 14:27   ` Rob Herring
2014-09-08 14:27     ` Rob Herring
2014-09-08 14:54     ` Liviu Dudau [this message]
2014-09-08 14:54       ` Liviu Dudau
2014-09-08 15:27       ` Rob Herring
2014-09-08 15:27         ` Rob Herring
2014-09-08 15:59         ` Liviu Dudau
2014-09-08 15:59           ` Liviu Dudau
2014-09-08 16:39           ` Jason Gunthorpe
2014-09-08 16:39             ` Jason Gunthorpe
2014-09-09  5:54           ` Yijing Wang
2014-09-09  5:54             ` Yijing Wang
2014-09-09  8:46             ` Liviu Dudau
2014-09-09  8:46               ` Liviu Dudau
2014-09-09  8:46               ` Liviu Dudau
2014-09-09  9:16               ` Arnd Bergmann
2014-09-09  9:16                 ` Arnd Bergmann
2014-09-09  9:16                 ` Arnd Bergmann
2014-09-09 11:20                 ` Catalin Marinas
2014-09-09 11:20                   ` Catalin Marinas
2014-09-09 11:20                   ` Catalin Marinas
2014-09-10 18:19                   ` Arnd Bergmann
2014-09-10 18:19                     ` Arnd Bergmann
2014-09-10 18:19                     ` Arnd Bergmann
2014-09-11 14:11                     ` Phil Edworthy
2014-09-11 14:11                       ` Phil Edworthy
2014-09-11 14:49                       ` Arnd Bergmann
2014-09-11 14:49                         ` Arnd Bergmann
2014-09-11 14:49                         ` Arnd Bergmann
2014-09-09 14:17                 ` Bjorn Helgaas
2014-09-09 14:17                   ` Bjorn Helgaas
2014-09-09 14:17                   ` Bjorn Helgaas
2014-09-09  9:30               ` Yijing Wang
2014-09-09  9:30                 ` Yijing Wang
2014-09-09  9:30                 ` Yijing Wang
2014-09-09 14:11                 ` Liviu Dudau
2014-09-09 14:11                   ` Liviu Dudau
2014-09-09 14:11                   ` Liviu Dudau
2014-09-10  1:44                   ` Yijing Wang
2014-09-10  1:44                     ` Yijing Wang
2014-09-10  1:44                     ` Yijing Wang
2014-09-09 14:26                 ` Bjorn Helgaas
2014-09-09 14:26                   ` Bjorn Helgaas
2014-09-09 14:26                   ` Bjorn Helgaas
2014-09-09 15:41                   ` Jason Gunthorpe
2014-09-09 15:41                     ` Jason Gunthorpe
2014-09-09 15:41                     ` Jason Gunthorpe
2014-09-10  2:44                     ` Rob Herring
2014-09-10  2:44                       ` Rob Herring
2014-09-10  2:44                       ` Rob Herring
2014-09-10 16:32                       ` Jason Gunthorpe
2014-09-10 16:32                         ` Jason Gunthorpe
2014-09-10 16:32                         ` Jason Gunthorpe
2014-09-10 19:36                         ` Rob Herring
2014-09-10  1:55                   ` Yijing Wang
2014-09-10  1:55                     ` Yijing Wang
2014-09-10  1:55                     ` Yijing Wang
2014-09-10 13:04           ` Liviu Dudau
2014-09-10 13:04             ` Liviu Dudau
2014-09-10 13:04             ` Liviu Dudau
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-08 13:54   ` Liviu Dudau
2014-09-09 13:35   ` Lorenzo Pieralisi
2014-09-09 13:35     ` Lorenzo Pieralisi
2014-09-10 14:22     ` Liviu Dudau
2014-09-10 14:22       ` Liviu Dudau
2014-09-10 15:10       ` Lorenzo Pieralisi
2014-09-10 15:10         ` Lorenzo Pieralisi
2014-09-10 15:32         ` Liviu Dudau
2014-09-10 15:32           ` Liviu Dudau
2014-09-10 16:37           ` Lorenzo Pieralisi
2014-09-10 16:37             ` Lorenzo Pieralisi
2014-09-10 16:53             ` Liviu Dudau
2014-09-10 16:53               ` Liviu Dudau
2014-09-10 16:53               ` Liviu Dudau
2014-09-10 17:06               ` Lorenzo Pieralisi
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-08 13:54   ` Liviu Dudau
2014-09-08 13:54   ` Liviu Dudau
2014-09-12 10:13   ` Suravee Suthikulpanit
2014-09-12 10:13     ` Suravee Suthikulpanit
2014-09-12 10:34     ` Liviu Dudau
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 13:54   ` Liviu Dudau
2014-09-08 13:54   ` Liviu Dudau
2014-09-08 16:07 ` [PATCH v10 00/10] Support for creating generic PCI host bridges from DT Liviu Dudau
2014-09-08 16:07   ` Liviu Dudau
2014-09-08 16:07   ` Liviu Dudau
2014-09-12  8:25 ` Suravee Suthikulpanit
2014-09-12  8:25   ` Suravee Suthikulpanit
2014-09-12  9:30   ` Liviu Dudau
2014-09-12  9:30     ` Liviu Dudau
2014-09-12 10:00     ` Suravee Suthikulpanit
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=20140908145459.GO27864@e106497-lin.cambridge.arm.com \
    --to=liviu.dudau@arm.com \
    --cc=Catalin.Marinas@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=robherring2@gmail.com \
    --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 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.