All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gavin Shan <gwshan@linux.vnet.ibm.com>
To: Rob Herring <robherring2@gmail.com>
Cc: Gavin Shan <gwshan@linux.vnet.ibm.com>,
	linuxppc-dev <linuxppc-dev@lists.ozlabs.org>,
	"linux-pci@vger.kernel.org" <linux-pci@vger.kernel.org>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Michael Ellerman <mpe@ellerman.id.au>,
	aik@ozlabs.ru, Bjorn Helgaas <bhelgaas@google.com>,
	Grant Likely <grant.likely@linaro.org>,
	Pantelis Antoniou <panto@antoniou-consulting.com>,
	Frank Rowand <frowand.list@gmail.com>
Subject: Re: [PATCH v7 44/50] drivers/of: Split unflatten_dt_node()
Date: Thu, 5 Nov 2015 10:05:41 +1100	[thread overview]
Message-ID: <20151104230541.GA9287@gwshan> (raw)
In-Reply-To: <CAL_JsqLp29DBdhqaaU4U7pn0juitmBBmgwaFvm+ATu+nhhwj5A@mail.gmail.com>

On Wed, Nov 04, 2015 at 12:43:08PM -0600, Rob Herring wrote:
>On Wed, Nov 4, 2015 at 7:12 AM, Gavin Shan <gwshan@linux.vnet.ibm.com> wrote:
>> The function unflatten_dt_node() is called recursively to unflatten
>> device nodes and properties in the FDT blob. It looks complicated
>> and hard to be understood.
>>
>> This splits the function into 3 functions: populate_properties(),
>> populate_node() and unflatten_dt_node(). populate_properties(),
>> which is called by populate_node(), creates properties for the
>> indicated device node. The later one creates the device nodes
>> from FDT blob. populate_node() gets the offset in FDT blob for
>> next device nodes and then calls populate_node(). No logical
>> changes introduced.
>>
>> Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
>> ---
>>  drivers/of/fdt.c | 275 ++++++++++++++++++++++++++++++++-----------------------
>>  1 file changed, 160 insertions(+), 115 deletions(-)
>>
>> diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
>> index 6e82bc42..173b036 100644
>> --- a/drivers/of/fdt.c
>> +++ b/drivers/of/fdt.c
>> @@ -160,39 +160,127 @@ static void *unflatten_dt_alloc(void **mem, unsigned long size,
>>         return res;
>>  }
>>
>> -/**
>> - * unflatten_dt_node - Alloc and populate a device_node from the flat tree
>> - * @blob: The parent device tree blob
>> - * @mem: Memory chunk to use for allocating device nodes and properties
>> - * @poffset: pointer to node in flat tree
>> - * @dad: Parent struct device_node
>> - * @nodepp: The device_node tree created by the call
>> - * @fpsize: Size of the node path up at the current depth.
>> - * @dryrun: If true, do not allocate device nodes but still calculate needed
>> - * memory size
>> - */
>> -static void * unflatten_dt_node(const void *blob,
>> -                               void *mem,
>> -                               int *poffset,
>> -                               struct device_node *dad,
>> -                               struct device_node **nodepp,
>> -                               unsigned long fpsize,
>> +static void populate_properties(const void *blob,
>> +                               int offset,
>> +                               void **mem,
>> +                               struct device_node *np,
>> +                               const char *nodename,
>>                                 bool dryrun)
>
>I'd like to make dryrun implicit. It is basically a function of NULL
>or near NULL pointers.
>


[1] The condition would be something like below:

    if ((unsigned long)(*mem) < limit)
	dryrun = true;
    else
        dryrun = false;

The question here is how to choose a sane @limit in practice. In !dryrun case,
the memory is allocated from memblock at system booting time, or slab when system
is up. memblock could assign memory in bottom-up fasion.

When @limit is too small, the condition wouldn't be comprehensive in !dryrun
case. When @limit is too large, the !dryrun cases can be regarded as dryrun case.

>>  {
>> -       const __be32 *p;
>> +       struct property *pp, **pprev = NULL;
>> +       int cur;
>> +       bool has_name = false;
>> +
>> +       pprev = &np->properties;
>> +       cur = fdt_first_property_offset(blob, offset);
>> +       while (cur >= 0) {
>
>This could be better written as a for loop to avoid the gotos:
>
>for (cur = fdt_first_property_offset(blob, offset); cur >=0; cur =
>fdt_next_property_offset(blob, cur))
>

Thanks, the changes will be included in next revision.

>> +               const __be32 *val;
>> +               const char *pname;
>> +               u32 sz;
>> +
>> +               val = fdt_getprop_by_offset(blob, cur, &pname, &sz);
>> +               if (!val) {
>> +                       pr_warn("%s: Cannot locate property at 0x%x\n",
>> +                               __func__, cur);
>> +                       goto next;
>> +               }
>> +
>> +               if (!pname) {
>> +                       pr_warn("%s: Cannot find property name at 0x%x\n",
>> +                               __func__, cur);
>> +                       goto next;
>> +               } else if (!strcmp(pname, "name")) {
>> +                       has_name = true;
>> +               }
>> +
>> +               pp = unflatten_dt_alloc(mem, sizeof(struct property),
>> +                                       __alignof__(struct property));
>> +               if (!dryrun) {
>
>Then:
>
>if (dryrun)
>  continue;
>
>to save some indentation and vertical code.
>

Good idea, it will be included in next revision.

>> +                       /* We accept flattened tree phandles either in
>> +                        * ePAPR-style "phandle" properties, or the
>> +                        * legacy "linux,phandle" properties.  If both
>> +                        * appear and have different values, things
>> +                        * will get weird. Don't do that.
>> +                        */
>> +                       if (!strcmp(pname, "phandle") ||
>> +                           !strcmp(pname, "linux,phandle")) {
>> +                               if (!np->phandle)
>> +                                       np->phandle = be32_to_cpup(val);
>> +                       }
>> +
>> +                       /* And we process the "ibm,phandle" property
>> +                        * used in pSeries dynamic device tree
>> +                        * stuff
>> +                        */
>> +                       if (!strcmp(pname, "ibm,phandle"))
>> +                               np->phandle = be32_to_cpup(val);
>> +
>> +                       pp->name   = (char *)pname;
>> +                       pp->length = sz;
>> +                       pp->value  = (__be32 *)val;
>> +                       *pprev     = pp;
>> +                       pprev      = &pp->next;
>> +               }
>> +next:
>> +               cur = fdt_next_property_offset(blob, cur);
>> +       }
>> +
>> +       /* With version 0x10 we may not have the name property,
>> +        * recreate it here from the unit name if absent
>> +        */
>> +       if (!has_name) {
>> +               const char *p = nodename, *ps = p, *pa = NULL;
>> +               int len;
>> +
>> +               while (*p) {
>> +                       if ((*p) == '@')
>> +                               pa = p;
>> +                       else if ((*p) == '/')
>> +                               ps = p + 1;
>> +                       p++;
>> +               }
>> +
>> +               if (pa < ps)
>> +                       pa = p;
>> +               len = (pa - ps) + 1;
>> +               pp = unflatten_dt_alloc(mem, sizeof(struct property) + len,
>> +                                       __alignof__(struct property));
>> +               if (!dryrun) {
>> +                       pp->name   = "name";
>> +                       pp->length = len;
>> +                       pp->value  = pp + 1;
>> +                       *pprev     = pp;
>> +                       pprev      = &pp->next;
>> +                       memcpy(pp->value, ps, len - 1);
>> +                       ((char *)pp->value)[len - 1] = 0;
>> +                       pr_debug("fixed up name for %s -> %s\n",
>> +                                nodename, (char *)pp->value);
>> +               }
>> +       }
>> +
>> +       if (!dryrun)
>> +               *pprev = NULL;
>> +}
>> +
>> +static unsigned long populate_node(const void *blob,
>> +                                  int offset,
>> +                                  void **mem,
>> +                                  struct device_node *dad,
>> +                                  unsigned long fpsize,
>> +                                  struct device_node **pnp,
>> +                                  bool dryrun)
>
>I think dryrun could be implied here too.
>

I don't think so. Please refer to the explanation at [1].

>> +{
>>         struct device_node *np;
>> -       struct property *pp, **prev_pp = NULL;
>>         const char *pathp;
>>         unsigned int l, allocl;
>> -       static int depth = 0;
>> -       int old_depth;
>> -       int offset;
>> -       int has_name = 0;
>> -       int new_format = 0;
>> +       bool new_format = false;
>> +       char *fname;
>>
>> -       pathp = fdt_get_name(blob, *poffset, &l);
>> -       if (!pathp)
>> -               return mem;
>> +       pathp = fdt_get_name(blob, offset, &l);
>> +       if (!pathp) {
>> +               *pnp = NULL;
>
>Can't pnp be NULL?
>

It can't be NULL in both dryrun and !dryrun cases.

>> +               return 0;
>> +       }
>>
>>         allocl = ++l;
>>
>> @@ -202,7 +290,7 @@ static void * unflatten_dt_node(const void *blob,
>>          * not '/'.
>>          */
>>         if ((*pathp) != '/') {
>> -               new_format = 1;
>> +               new_format = true;
>>                 if (fpsize == 0) {
>>                         /* root node: special case. fpsize accounts for path
>>                          * plus terminating zero. root node only has '/', so
>> @@ -222,112 +310,38 @@ static void * unflatten_dt_node(const void *blob,
>>                 }
>>         }
>>
>> -       np = unflatten_dt_alloc(&mem, sizeof(struct device_node) + allocl,
>> +       np = unflatten_dt_alloc(mem, sizeof(struct device_node) + allocl,
>>                                 __alignof__(struct device_node));
>>         if (!dryrun) {
>> -               char *fn;
>>                 of_node_init(np);
>> -               np->full_name = fn = ((char *)np) + sizeof(*np);
>> +               np->full_name = fname = ((char *)np) + sizeof(*np);
>
>If you kept "fn" that would cut down the diff and make it a bit easier
>to review.
>

Agree, I'll drop the rename in next revision. I perhaps have separate
patch to do the renaming after this patch. In that way, unrelated code
changes will be avoided in this one.

>>                 if (new_format) {
>> -                       /* rebuild full path for new format */
>> +                       /* Rebuild full path for new format */
>>                         if (dad && dad->parent) {
>> -                               strcpy(fn, dad->full_name);
>> +                               strcpy(fname, dad->full_name);
>>  #ifdef DEBUG
>> -                               if ((strlen(fn) + l + 1) != allocl) {
>> +                               if ((strlen(fname) + l + 1) != allocl) {
>>                                         pr_debug("%s: p: %d, l: %d, a: %d\n",
>> -                                               pathp, (int)strlen(fn),
>> -                                               l, allocl);
>> +                                                pathp, (int)strlen(fn),
>
>This won't compile if enabled (should be fname).
>

Indeed, I even didn't try to compile this piece of debugging code. Will change
accordingly in next revision.

>> +                                                l, allocl);
>>                                 }
>>  #endif
>> -                               fn += strlen(fn);
>> +                               fname += strlen(fname);
>>                         }
>> -                       *(fn++) = '/';
>> +                       *(fname++) = '/';
>>                 }
>> -               memcpy(fn, pathp, l);
>> +               memcpy(fname, pathp, l);
>>
>> -               prev_pp = &np->properties;
>> -               if (dad != NULL) {
>> +               if (dad) {
>>                         np->parent = dad;
>>                         np->sibling = dad->child;
>>                         dad->child = np;
>>                 }
>>         }
>> -       /* process properties */
>> -       for (offset = fdt_first_property_offset(blob, *poffset);
>> -            (offset >= 0);
>> -            (offset = fdt_next_property_offset(blob, offset))) {
>> -               const char *pname;
>> -               u32 sz;
>>
>> -               if (!(p = fdt_getprop_by_offset(blob, offset, &pname, &sz))) {
>> -                       offset = -FDT_ERR_INTERNAL;
>> -                       break;
>> -               }
>> -
>> -               if (pname == NULL) {
>> -                       pr_info("Can't find property name in list !\n");
>> -                       break;
>> -               }
>> -               if (strcmp(pname, "name") == 0)
>> -                       has_name = 1;
>> -               pp = unflatten_dt_alloc(&mem, sizeof(struct property),
>> -                                       __alignof__(struct property));
>> -               if (!dryrun) {
>> -                       /* We accept flattened tree phandles either in
>> -                        * ePAPR-style "phandle" properties, or the
>> -                        * legacy "linux,phandle" properties.  If both
>> -                        * appear and have different values, things
>> -                        * will get weird.  Don't do that. */
>> -                       if ((strcmp(pname, "phandle") == 0) ||
>> -                           (strcmp(pname, "linux,phandle") == 0)) {
>> -                               if (np->phandle == 0)
>> -                                       np->phandle = be32_to_cpup(p);
>> -                       }
>> -                       /* And we process the "ibm,phandle" property
>> -                        * used in pSeries dynamic device tree
>> -                        * stuff */
>> -                       if (strcmp(pname, "ibm,phandle") == 0)
>> -                               np->phandle = be32_to_cpup(p);
>> -                       pp->name = (char *)pname;
>> -                       pp->length = sz;
>> -                       pp->value = (__be32 *)p;
>> -                       *prev_pp = pp;
>> -                       prev_pp = &pp->next;
>> -               }
>> -       }
>> -       /* with version 0x10 we may not have the name property, recreate
>> -        * it here from the unit name if absent
>> -        */
>> -       if (!has_name) {
>> -               const char *p1 = pathp, *ps = pathp, *pa = NULL;
>> -               int sz;
>> -
>> -               while (*p1) {
>> -                       if ((*p1) == '@')
>> -                               pa = p1;
>> -                       if ((*p1) == '/')
>> -                               ps = p1 + 1;
>> -                       p1++;
>> -               }
>> -               if (pa < ps)
>> -                       pa = p1;
>> -               sz = (pa - ps) + 1;
>> -               pp = unflatten_dt_alloc(&mem, sizeof(struct property) + sz,
>> -                                       __alignof__(struct property));
>> -               if (!dryrun) {
>> -                       pp->name = "name";
>> -                       pp->length = sz;
>> -                       pp->value = pp + 1;
>> -                       *prev_pp = pp;
>> -                       prev_pp = &pp->next;
>> -                       memcpy(pp->value, ps, sz - 1);
>> -                       ((char *)pp->value)[sz - 1] = 0;
>> -                       pr_debug("fixed up name for %s -> %s\n", pathp,
>> -                               (char *)pp->value);
>> -               }
>> -       }
>> +       /* Populate the properties */
>
>Kind of a useless comment.
>

Agree, will drop in next revision.

>> +       populate_properties(blob, offset, mem, np, pathp, dryrun);
>>         if (!dryrun) {
>> -               *prev_pp = NULL;
>>                 np->name = of_get_property(np, "name", NULL);
>>                 np->type = of_get_property(np, "device_type", NULL);
>>
>> @@ -337,6 +351,37 @@ static void * unflatten_dt_node(const void *blob,
>>                         np->type = "<NULL>";
>>         }
>>
>> +       *pnp = np;
>> +       return fpsize;
>> +}
>> +
>> +/**
>> + * unflatten_dt_node - Alloc and populate a device_node from the flat tree
>> + * @blob: The parent device tree blob
>> + * @mem: Memory chunk to use for allocating device nodes and properties
>> + * @poffset: pointer to node in flat tree
>> + * @dad: Parent struct device_node
>> + * @nodepp: The device_node tree created by the call
>> + * @fpsize: Size of the node path up at the current depth.
>> + * @dryrun: If true, do not allocate device nodes but still calculate needed
>> + * memory size
>> + */
>> +static void *unflatten_dt_node(const void *blob,
>> +                              void *mem,
>> +                              int *poffset,
>> +                              struct device_node *dad,
>> +                              struct device_node **nodepp,
>> +                              unsigned long fpsize,
>> +                              bool dryrun)
>> +{
>> +       struct device_node *np;
>> +       static int depth;
>> +       int old_depth;
>> +
>> +       fpsize = populate_node(blob, *poffset, &mem, dad, fpsize, &np, dryrun);
>
>Doesn't this give a warning assigning a ptr to long?
>
>Looks like np can be moved internal to populate_node.
>

@fpsize and the return value of populate_node() are "unsigned long".

Nope, @np will be used in next patch in this function, which tracks the
device node unflattened in last level of depth.

>
>> +       if (!fpsize)
>> +               return mem;
>> +
>>         old_depth = depth;
>>         *poffset = fdt_next_node(blob, *poffset, &depth);
>>         if (depth < 0)

Thanks,
Gavin

  reply	other threads:[~2015-11-04 23:05 UTC|newest]

Thread overview: 201+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-04 13:12 [PATCH v7 00/50] powerpc/powernv: PCI hotplug support Gavin Shan
2015-11-04 13:12 ` [PATCH v7 01/50] PCI: Add pcibios_setup_bridge() Gavin Shan
2015-11-04 13:12 ` [PATCH v7 02/50] powerpc/pci: Override pcibios_setup_bridge() Gavin Shan
2015-11-05 22:27   ` Daniel Axtens
2015-11-05 22:27     ` Daniel Axtens
2015-11-05 23:44     ` Gavin Shan
2015-11-04 13:12 ` [PATCH v7 04/50] powerpc/powernv: Cleanup on pnv_pci_ioda_controller_ops Gavin Shan
2015-11-04 13:12   ` Gavin Shan
2015-11-05 22:28   ` Daniel Axtens
2015-11-05 22:28     ` Daniel Axtens
2015-11-06  1:09     ` Gavin Shan
2015-11-04 13:12 ` [PATCH v7 05/50] powerpc/powernv: Drop pnv_ioda_setup_dev_PE() Gavin Shan
2015-11-04 13:12 ` [PATCH v7 07/50] powerpc/powernv: Reorder fields in struct pnv_phb Gavin Shan
2015-11-04 13:12 ` [PATCH v7 08/50] powerpc/powernv: Rename PE# " Gavin Shan
2015-11-04 13:12   ` Gavin Shan
2015-11-16  8:01   ` Alexey Kardashevskiy
2015-11-17  1:22     ` Gavin Shan
2015-11-04 13:12 ` [PATCH v7 09/50] powerpc/powernv: Fix initial IO and M32 segmap Gavin Shan
2015-11-04 13:12   ` Gavin Shan
2015-11-04 13:12 ` [PATCH v7 12/50] powerpc/powernv: Track M64 segment consumption Gavin Shan
2015-11-12  4:18   ` Daniel Axtens
2015-11-12  4:18     ` Daniel Axtens
2015-11-16  8:01   ` Alexey Kardashevskiy
2015-11-17  1:04     ` Gavin Shan
2015-11-19  0:10       ` Alexey Kardashevskiy
2015-11-23 22:42         ` Gavin Shan
2015-11-04 13:12 ` [PATCH v7 13/50] powerpc/powernv: Rename M64 related functions Gavin Shan
2015-11-04 13:12 ` [PATCH v7 14/50] powerpc/powernv: M64 support on P7IOC Gavin Shan
2015-11-16  8:01   ` Alexey Kardashevskiy
2015-11-17  1:37     ` Gavin Shan
2015-11-19  0:18       ` Alexey Kardashevskiy
2015-11-22 22:46         ` Gavin Shan
2015-11-16  8:02   ` Alexey Kardashevskiy
2015-11-17  1:38     ` Gavin Shan
2015-11-17  2:11       ` Alexey Kardashevskiy
2015-11-17  2:44         ` Gavin Shan
2015-11-16  8:02   ` Alexey Kardashevskiy
2015-11-17  1:42     ` Gavin Shan
2015-11-17  2:37       ` Alexey Kardashevskiy
2015-11-17  3:04         ` Gavin Shan
2015-11-17  3:40           ` Benjamin Herrenschmidt
2015-11-17  4:43           ` Alexey Kardashevskiy
2015-11-17  8:44             ` Gavin Shan
2015-11-04 13:12 ` [PATCH v7 15/50] powerpc/powernv: Rename pnv_pci_ioda_setup_dma_pe() Gavin Shan
     [not found] ` <1446642770-4681-1-git-send-email-gwshan-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
2015-11-04 13:12   ` [PATCH v7 03/50] powerpc/pci: Cleanup on struct pci_controller_ops Gavin Shan
2015-11-04 13:12     ` Gavin Shan
2015-11-05 22:32     ` Daniel Axtens
2015-11-05 22:32       ` Daniel Axtens
2015-11-05 23:45       ` Gavin Shan
2015-11-04 13:12   ` [PATCH v7 06/50] powerpc/powernv: Drop phb->bdfn_to_pe() Gavin Shan
2015-11-04 13:12     ` Gavin Shan
2015-11-04 13:12   ` [PATCH v7 10/50] powerpc/powernv: Simplify pnv_ioda_setup_pe_seg() Gavin Shan
2015-11-04 13:12     ` Gavin Shan
2015-11-05 22:56     ` Daniel Axtens
2015-11-05 22:56       ` Daniel Axtens
2015-11-05 23:52       ` Gavin Shan
2015-11-16  8:01         ` Alexey Kardashevskiy
2015-11-17  0:54           ` Gavin Shan
2015-11-04 13:12   ` [PATCH v7 11/50] powerpc/powernv: IO and M32 mapping based on PCI device resources Gavin Shan
2015-11-04 13:12     ` Gavin Shan
2015-11-12  3:30     ` Daniel Axtens
2015-11-12  3:30       ` Daniel Axtens
2015-11-12  4:55       ` Gavin Shan
2015-11-16  8:01         ` Alexey Kardashevskiy
2015-11-17  1:33           ` Gavin Shan
2015-11-04 13:12   ` [PATCH v7 16/50] powerpc/powernv: Define PNV_IODA1_DMA32_SEGSIZE Gavin Shan
2015-11-04 13:12     ` Gavin Shan
2015-11-04 13:12   ` [PATCH v7 19/50] powerpc/powernv: Track DMA32 segment consumption Gavin Shan
2015-11-04 13:12     ` Gavin Shan
2015-11-17  0:28     ` Daniel Axtens
2015-11-17  0:28       ` Daniel Axtens
2015-11-17  1:55       ` Gavin Shan
2015-11-04 13:12   ` [PATCH v7 22/50] powerpc/powernv: Introduce pnv_ioda_init_pe() Gavin Shan
2015-11-04 13:12     ` Gavin Shan
2015-11-17  0:30     ` Daniel Axtens
2015-11-17  0:30       ` Daniel Axtens
2015-11-17  1:58       ` Gavin Shan
2015-11-17  2:37         ` Alexey Kardashevskiy
2015-11-17  2:53           ` Gavin Shan
2015-11-04 13:12   ` [PATCH v7 24/50] powerpc/powernv: Allocate PE# in reverse order Gavin Shan
2015-11-04 13:12     ` Gavin Shan
2015-11-04 13:12   ` [PATCH v7 29/50] powerpc/pci: Rename pcibios_find_pci_bus() Gavin Shan
2015-11-04 13:12     ` Gavin Shan
2015-11-18  3:59     ` Alexey Kardashevskiy
2015-11-23 23:11       ` Gavin Shan
2015-11-04 13:12   ` [PATCH v7 33/50] powerpc/pci: Export pci_traverse_device_nodes() Gavin Shan
2015-11-04 13:12     ` Gavin Shan
2015-11-18  3:14     ` Alexey Kardashevskiy
2015-11-23 23:23       ` Gavin Shan
2015-11-04 13:12   ` [PATCH v7 36/50] powerpc/pci: Update bridge windows on PCI plug Gavin Shan
2015-11-04 13:12     ` Gavin Shan
2015-11-04 13:12   ` [PATCH v7 47/50] drivers/of: Specify parent node in of_fdt_unflatten_tree() Gavin Shan
2015-11-04 13:12     ` Gavin Shan
2015-11-04 13:12   ` [PATCH v7 49/50] drivers/of: Export OF changeset functions Gavin Shan
2015-11-04 13:12     ` Gavin Shan
2015-11-04 16:12     ` Rob Herring
2015-11-04 23:23       ` Gavin Shan
2016-01-13 13:54     ` [v7,49/50] " Wolfram Sang
2016-01-13 21:18       ` Michael Ellerman
2016-01-13 21:18         ` Michael Ellerman
     [not found]         ` <1452719886.8203.1.camel-Gsx/Oe8HsFggBc27wqDAHg@public.gmane.org>
2016-01-13 21:20           ` Wolfram Sang
2016-01-13 21:20             ` Wolfram Sang
2016-01-13 23:53             ` Rob Herring
     [not found]               ` <CAL_JsqLaCMYMGLu_2aoXopgMHmT09xU1CSO4NZokMVUOZTPSJg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-01-14  7:28                 ` Wolfram Sang
2016-01-14  7:28                   ` Wolfram Sang
2015-11-04 13:12 ` [PATCH v7 17/50] powerpc/powernv: Avoid calculating DMA32 segments on PHB3 Gavin Shan
2015-11-04 13:12   ` Gavin Shan
2015-11-17  1:07   ` Alexey Kardashevskiy
2015-11-17  8:48     ` Gavin Shan
2015-11-17 23:59       ` Alexey Kardashevskiy
2015-11-04 13:12 ` [PATCH v7 18/50] powerpc/powernv: Remove DMA32 PE list Gavin Shan
2015-11-17  1:54   ` Alexey Kardashevskiy
2015-11-17  2:01     ` Gavin Shan
2015-11-04 13:12 ` [PATCH v7 20/50] powerpc/powernv: Improve DMA32 segment calculation Gavin Shan
2015-11-04 13:12   ` Gavin Shan
2015-11-20  3:14   ` Daniel Axtens
2015-11-20  3:14     ` Daniel Axtens
2015-11-04 13:12 ` [PATCH v7 21/50] powerpc/powernv: Increase PE# capacity Gavin Shan
2015-11-17  0:29   ` Daniel Axtens
2015-11-17  0:29     ` Daniel Axtens
2015-11-17  1:56     ` Gavin Shan
2015-11-04 13:12 ` [PATCH v7 23/50] powerpc/powernv: Use PE instead of number during setup and release Gavin Shan
2015-11-04 13:12   ` Gavin Shan
2015-11-17  5:08   ` Alexey Kardashevskiy
2015-11-17  9:03     ` Gavin Shan
2015-11-18  0:13       ` Alexey Kardashevskiy
2015-11-22 22:52         ` Gavin Shan
2015-11-04 13:12 ` [PATCH v7 25/50] powerpc/powernv: Reserve PE for root bus Gavin Shan
2015-11-17  6:04   ` Alexey Kardashevskiy
2015-11-17  9:06     ` Gavin Shan
2015-11-19  0:21       ` Alexey Kardashevskiy
2015-11-04 13:12 ` [PATCH v7 26/50] powerpc/powernv: Create PEs at PCI hot plugging time Gavin Shan
2015-11-17  7:57   ` Alexey Kardashevskiy
2015-11-17  9:12     ` Gavin Shan
2015-11-04 13:12 ` [PATCH v7 27/50] powerpc/powernv: Dynamically release PEs Gavin Shan
2015-11-18  2:23   ` Alexey Kardashevskiy
2015-11-23 23:06     ` Gavin Shan
2015-11-24  0:22       ` Alexey Kardashevskiy
2015-11-04 13:12 ` [PATCH v7 28/50] powerpc/pci: Rename pcibios_{add,remove}_pci_devices() Gavin Shan
2015-11-04 13:12   ` [PATCH v7 28/50] powerpc/pci: Rename pcibios_{add, remove}_pci_devices() Gavin Shan
2015-11-18  2:43   ` [PATCH v7 28/50] powerpc/pci: Rename pcibios_{add,remove}_pci_devices() Alexey Kardashevskiy
2015-11-23 23:08     ` Gavin Shan
2015-11-04 13:12 ` [PATCH v7 30/50] powerpc/pci: Move pci_find_bus_by_node() around Gavin Shan
2015-11-04 13:12 ` [PATCH v7 31/50] powerpc/pci: Export pci_add_device_node_info() Gavin Shan
2015-11-04 13:12 ` [PATCH v7 32/50] powerpc/pci: Introduce pci_remove_device_node_info() Gavin Shan
2015-11-04 13:12 ` [PATCH v7 34/50] powerpc/pci: Delay populating pdn Gavin Shan
2015-11-18  4:24   ` Alexey Kardashevskiy
2015-11-23 23:42     ` Gavin Shan
2015-11-04 13:12 ` [PATCH v7 35/50] powerpc/pci: Don't scan empty slot Gavin Shan
2015-11-04 13:12 ` [PATCH v7 37/50] powerpc/powernv: Simplify pnv_eeh_reset() Gavin Shan
2015-11-12  5:11   ` Daniel Axtens
2015-11-12  5:11     ` Daniel Axtens
2015-11-12  6:11     ` Gavin Shan
2015-11-04 13:12 ` [PATCH v7 38/50] powerpc/powernv: Exclude root bus in pnv_pci_reset_secondary_bus() Gavin Shan
2015-11-12 22:59   ` Daniel Axtens
2015-11-12 22:59     ` Daniel Axtens
2015-11-12 23:25     ` Gavin Shan
2015-11-04 13:12 ` [PATCH v7 39/50] powerpc/powernv: Fundamental reset " Gavin Shan
2015-11-12  6:15   ` Gavin Shan
2015-11-13  0:08   ` Daniel Axtens
2015-11-13  0:08     ` Daniel Axtens
2015-11-13  0:20     ` Gavin Shan
     [not found]     ` <87fv0azrpe.fsf-lvn/ZZ/ogF85kJ7NmlRacFaTQe2KTcn/@public.gmane.org>
2015-11-13  0:23       ` Benjamin Herrenschmidt
2015-11-13  0:23         ` Benjamin Herrenschmidt
2015-11-13  0:23   ` Daniel Axtens
2015-11-13  0:23     ` Daniel Axtens
2015-11-04 13:12 ` [PATCH v7 40/50] powerpc/powernv: Support PCI slot ID Gavin Shan
2015-11-04 13:12 ` [PATCH v7 41/50] powerpc/powernv: Use firmware PCI slot reset infrastructure Gavin Shan
2015-11-04 13:12 ` [PATCH v7 42/50] powerpc/powernv: Functions to get/set PCI slot status Gavin Shan
2015-11-04 13:12 ` [PATCH v7 43/50] powerpc/powernv: Select OF_DYNAMIC Gavin Shan
2015-11-04 13:12 ` [PATCH v7 44/50] drivers/of: Split unflatten_dt_node() Gavin Shan
2015-11-04 18:43   ` Rob Herring
2015-11-04 23:05     ` Gavin Shan [this message]
2015-11-04 13:12 ` [PATCH v7 45/50] drivers/of: Avoid recursively calling unflatten_dt_node() Gavin Shan
2015-11-04 16:07   ` Rob Herring
2015-11-04 23:23     ` Gavin Shan
2015-11-04 23:26       ` Gavin Shan
     [not found]     ` <CAL_JsqJGpV-+JYyA1g0dw_nEduhmrMEouTH03kHtuCkGSOP57Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-05-13  7:16       ` Geert Uytterhoeven
2016-05-13  7:16         ` Geert Uytterhoeven
2016-05-13 11:31         ` [PATCH] drivers/of: Fix build warning in populate_node() Gavin Shan
2016-05-16 14:11           ` Rob Herring
     [not found]   ` <1446642770-4681-46-git-send-email-gwshan-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
2015-12-06 20:28     ` [PATCH v7 45/50] drivers/of: Avoid recursively calling unflatten_dt_node() Rob Herring
2015-12-06 20:28       ` Rob Herring
     [not found]       ` <CAL_Jsq+BnPEKkRgQX4+e0MA9dKLVLhy8rVF25Fr9yXL2jp+WLA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-12-06 21:49         ` Guenter Roeck
2015-12-06 21:49           ` Guenter Roeck
2015-12-06 23:54       ` Benjamin Herrenschmidt
2015-12-06 23:54         ` Benjamin Herrenschmidt
2015-12-07  2:21         ` Guenter Roeck
2015-12-07  2:33           ` Rob Herring
2015-12-07  3:40             ` Guenter Roeck
2015-11-04 13:12 ` [PATCH v7 46/50] drivers/of: Rename unflatten_dt_node() Gavin Shan
2015-11-04 13:12 ` [PATCH v7 48/50] drivers/of: Return allocated memory from of_fdt_unflatten_tree() Gavin Shan
2015-11-04 13:12 ` [PATCH v7 50/50] PCI/hotplug: PowerPC PowerNV PCI hotplug driver Gavin Shan
     [not found]   ` <1446642770-4681-51-git-send-email-gwshan-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
2015-11-18  7:33     ` Alexey Kardashevskiy
2015-11-18  7:33       ` Alexey Kardashevskiy
2015-11-23 23:16       ` Gavin Shan
2015-11-09  3:09 ` [PATCH v7 00/50] powerpc/powernv: PCI hotplug support Gavin Shan
2015-11-09  4:24   ` Pramod Sudheendra
2015-11-09  4:24     ` Pramod Sudheendra
2015-11-09  4:29     ` Gavin Shan
2015-11-09  6:43       ` Benjamin Herrenschmidt

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=20151104230541.GA9287@gwshan \
    --to=gwshan@linux.vnet.ibm.com \
    --cc=aik@ozlabs.ru \
    --cc=benh@kernel.crashing.org \
    --cc=bhelgaas@google.com \
    --cc=devicetree@vger.kernel.org \
    --cc=frowand.list@gmail.com \
    --cc=grant.likely@linaro.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=mpe@ellerman.id.au \
    --cc=panto@antoniou-consulting.com \
    --cc=robherring2@gmail.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.