linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Ram Pai <linuxram@us.ibm.com>
To: Bjorn Helgaas <bhelgaas@google.com>
Cc: Yinghai Lu <yinghai@kernel.org>,
	"linux-pci@vger.kernel.org" <linux-pci@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v3 03/27] PCI: pci resource iterator
Date: Tue, 9 Apr 2013 12:51:13 +0800	[thread overview]
Message-ID: <20130409045113.GA7251@ram.oc3035372033.ibm.com> (raw)
In-Reply-To: <CAErSpo4VzBZ=fAzPm1yWEs4+09_D1=rysMf6tGgnqpVEKytSzQ@mail.gmail.com>

On Thu, Apr 04, 2013 at 04:18:01PM -0600, Bjorn Helgaas wrote:
> On Wed, Mar 13, 2013 at 5:27 PM, Yinghai Lu <yinghai@kernel.org> wrote:
> > From: Ram Pai <linuxram@us.ibm.com>
> >
> > Currently pci_dev structure holds an array of 17 PCI resources; six base
> > BARs, one ROM BAR, four BRIDGE BARs, six sriov BARs.  This is wasteful.
> > A bridge device just needs the 4 bridge resources. A non-bridge device
> > just needs the six base resources and one ROM resource. The sriov
> > resources are needed only if the device has SRIOV capability.
> >
> > The pci_dev structure needs to be re-organized to avoid unnecessary
> > bloating.  However too much code outside the pci-bus driver, assumes the
> > internal details of the pci_dev structure, thus making it hard to
> > re-organize the datastructure.
> >
> > As a first step this patch provides generic methods to access the
> > resource structure of the pci_dev.
> >
> > Finally we can re-organize the resource structure in the pci_dev
> > structure and correspondingly update the methods.
> >
> > -v2: Consolidated iterator interface as per Bjorn's suggestion.
> > -v3: Add the idx back - Yinghai Lu
> > -v7: Change to use bitmap for searching - Yinghai Lu
> > -v8: Fix acpiphp module compiling error that is found by
> >         Steven Newbury <steve@snewbury.org.uk> - Yinghai Lu
> >
> > Signed-off-by: Ram Pai <linuxram@us.ibm.com>
> > Signed-off-by: Yinghai Lu <yinghai@kernel.org>
> > ---
> >  drivers/pci/probe.c |   48 ++++++++++++++++++++++++++++++++++++++++++++++++
> >  include/linux/pci.h |   24 ++++++++++++++++++++++++
> >  2 files changed, 72 insertions(+)
> >
> > diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> > index 1df75f7..ac751a6 100644
> > --- a/drivers/pci/probe.c
> > +++ b/drivers/pci/probe.c
> > @@ -123,6 +123,54 @@ int pci_dev_resource_idx(struct pci_dev *dev, struct resource *res)
> >         return -1;
> >  }
> >
> > +static void __init_res_idx_mask(unsigned long *mask, int flag)
> > +{
> > +       bitmap_zero(mask, PCI_NUM_RESOURCES);
> > +       if (flag & PCI_STD_RES)
> > +               bitmap_set(mask, PCI_STD_RESOURCES,
> > +                       PCI_STD_RESOURCE_END - PCI_STD_RESOURCES + 1);
> > +       if (flag & PCI_ROM_RES)
> > +               bitmap_set(mask, PCI_ROM_RESOURCE, 1);
> > +#ifdef CONFIG_PCI_IOV
> > +       if (flag & PCI_IOV_RES)
> > +               bitmap_set(mask, PCI_IOV_RESOURCES,
> > +                       PCI_IOV_RESOURCE_END - PCI_IOV_RESOURCES + 1);
> > +#endif
> > +       if (flag & PCI_BRIDGE_RES)
> > +               bitmap_set(mask, PCI_BRIDGE_RESOURCES,
> > +                       PCI_BRIDGE_RESOURCE_END - PCI_BRIDGE_RESOURCES + 1);
> > +}
> > +
> > +static DECLARE_BITMAP(res_idx_mask[1 << PCI_RES_BLOCK_NUM], PCI_NUM_RESOURCES);
> > +static int __init pci_res_idx_mask_init(void)
> > +{
> > +       int i;
> > +
> > +       for (i = 0; i < (1 << PCI_RES_BLOCK_NUM); i++)
> > +               __init_res_idx_mask(res_idx_mask[i], i);
> > +
> > +       return 0;
> > +}
> > +postcore_initcall(pci_res_idx_mask_init);
> > +
> > +static inline unsigned long *get_res_idx_mask(int flag)
> > +{
> > +       return res_idx_mask[flag & ((1 << PCI_RES_BLOCK_NUM) - 1)];
> > +}
> > +
> > +int pci_next_resource_idx(int i, int flag)
> > +{
> > +       i++;
> > +       if (i < PCI_NUM_RESOURCES)
> > +               i = find_next_bit(get_res_idx_mask(flag), PCI_NUM_RESOURCES, i);
> > +
> > +       if (i < PCI_NUM_RESOURCES)
> > +               return i;
> > +
> > +       return -1;
> > +}
> > +EXPORT_SYMBOL(pci_next_resource_idx);
> > +
> >  static u64 pci_size(u64 base, u64 maxbase, u64 mask)
> >  {
> >         u64 size = mask & maxbase;      /* Find the significant bits */
> > diff --git a/include/linux/pci.h b/include/linux/pci.h
> > index aefff8b..127a856 100644
> > --- a/include/linux/pci.h
> > +++ b/include/linux/pci.h
> > @@ -341,6 +341,30 @@ struct pci_dev {
> >  struct resource *pci_dev_resource_n(struct pci_dev *dev, int n);
> >  int pci_dev_resource_idx(struct pci_dev *dev, struct resource *res);
> >
> > +#define PCI_STD_RES            (1<<0)
> > +#define PCI_ROM_RES            (1<<1)
> > +#define PCI_IOV_RES            (1<<2)
> > +#define PCI_BRIDGE_RES         (1<<3)
> > +#define PCI_RES_BLOCK_NUM      4
> > +
> > +#define PCI_ALL_RES            (PCI_STD_RES | PCI_ROM_RES | PCI_BRIDGE_RES | PCI_IOV_RES)
> > +#define PCI_NOSTD_RES          (PCI_ALL_RES & ~PCI_STD_RES)
> > +#define PCI_NOIOV_RES          (PCI_ALL_RES & ~PCI_IOV_RES)
> > +#define PCI_NOROM_RES          (PCI_ALL_RES & ~PCI_ROM_RES)
> > +#define PCI_NOBRIDGE_RES       (PCI_ALL_RES & ~PCI_BRIDGE_RES)
> > +#define PCI_STD_ROM_RES                (PCI_STD_RES | PCI_ROM_RES)
> > +#define PCI_STD_IOV_RES                (PCI_STD_RES | PCI_IOV_RES)
> > +#define PCI_STD_ROM_IOV_RES    (PCI_STD_RES | PCI_ROM_RES | PCI_IOV_RES)
> > +
> > +int pci_next_resource_idx(int i, int flag);
> > +
> > +#define for_each_pci_resource(dev, res, i, flag)       \
> > +       for (i = pci_next_resource_idx(-1, flag),       \
> > +               res = pci_dev_resource_n(dev, i);       \
> > +            res;                                       \
> > +            i = pci_next_resource_idx(i, flag),        \
> > +               res = pci_dev_resource_n(dev, i))
> > +
> >  static inline struct pci_dev *pci_physfn(struct pci_dev *dev)
> >  {
> >  #ifdef CONFIG_PCI_IOV
> 
> I think this turned out to be a disaster, with all the bitmaps and
> helper functions.  Filtering in the bodies of the
> for_each_pci_resource() users has *got* to be better.  That probably
> requires a wrapper struct around the struct resource.  Or possibly
> having a wrapper struct with a "type" or "flags" field would make
> filtering in for_each_pci_resources() itself cleaner to implement.

I agree. There are two cleanups needed.

a) pci drivers should not assume the internal organization of the
	resources in the struct pci_dev.

b) The type of a resource has to be determined based on some
   information internal to the resource; possibly a flag, 
   instead of the relative position of the resource in some array.

My original patch was aimed at (a); to make the organization of the
resources transparent to the drivers, and then move to (b) where the
type of the resource would be determined based on some flag, instead
of its relative location. Unfortuately the current newer version has got 
morphed significantly, that I think is not clean enough.

RP


  reply	other threads:[~2013-04-09  4:51 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-13 23:27 [PATCH v3 00/27] PCI: Add for_each_pci_resource and addon_res support Yinghai Lu
2013-03-13 23:27 ` [PATCH v3 01/27] PCI: Add pci_dev_resource_n() Yinghai Lu
2013-03-13 23:27 ` [PATCH v3 02/27] PCI: Add pci_dev_resource_idx() helper Yinghai Lu
2013-04-04 22:00   ` Bjorn Helgaas
2013-03-13 23:27 ` [PATCH v3 03/27] PCI: pci resource iterator Yinghai Lu
2013-04-04 22:18   ` Bjorn Helgaas
2013-04-09  4:51     ` Ram Pai [this message]
2013-04-10 15:22       ` Bjorn Helgaas
2013-04-25  3:55         ` Ram Pai
2013-04-25 17:22           ` Bjorn Helgaas
2013-04-28  6:08             ` Ram Pai
2013-04-10 16:12     ` Yinghai Lu
2013-03-13 23:27 ` [PATCH v3 04/27] PCI: Add is_pci_*_resource_idx() helpers Yinghai Lu
2013-04-04 22:23   ` Bjorn Helgaas
2013-03-13 23:28 ` [PATCH v3 05/27] PCI: Update pci_resource_start etc to use pci_dev_resource_n() Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 06/27] PCI, x86: Use for_each_pci_resource() with pci_allocate_bridge_resources Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 07/27] PCI, x86: Use for_each_pci_resource() with pci_allocate_dev_resources Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 08/27] PCI: Use for_each_pci_resource() with IOV releated functions Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 09/27] PCI, acpiphp: Use for_each_pci_resource() helper Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 10/27] PCI, pciehp: " Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 11/27] PCI: Use for_each_pci_resource() in pci_enable_dev Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 12/27] PCI: Use for_each_pci_resource() in pci_reassigndev Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 13/27] PCI: Use for_each_pci_resource() with pci bar reassign funcs Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 14/27] PCI: Use for_each_pci_resource() in pci_assign_resource Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 15/27] PCI, x86: Use for_each_pci_resource() with noassign_bars Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 16/27] PCI: Use for_each_pci_resource() in pci_dev_driver() Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 17/27] PCI: Use for_each_pci_resource() in pci resource release Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 18/27] PCI: Use for_each_pci_resource() in pci bases reading Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 19/27] PCI, x86: Use for_each_pci_resource() with mrst Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 20/27] PCI, xen: Use for_each_pci_resource() with xen pci Yinghai Lu
2013-03-15 13:35   ` Konrad Rzeszutek Wilk
2013-03-13 23:28 ` [PATCH v3 21/27] PCI: Add addon_resource support for pci devices Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 22/27] PCI: Add helpers to add addon_resource Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 23/27] PCI: Update pci_resource_bar() to support addon_resource Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 24/27] PCI: Assign/update resource to addon_res Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 25/27] PCI: Make piix4 quirk to use addon_res Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 26/27] PCI: Make quirk_io_region " Yinghai Lu
2013-04-04 21:35   ` Bjorn Helgaas
2013-04-10  2:17     ` Yinghai Lu
2013-03-13 23:28 ` [PATCH v3 27/27] PCI: Use addon_fixed_resource with ati fixed resource Yinghai Lu

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=20130409045113.GA7251@ram.oc3035372033.ibm.com \
    --to=linuxram@us.ibm.com \
    --cc=bhelgaas@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=yinghai@kernel.org \
    /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;
as well as URLs for NNTP newsgroup(s).