diff mbox series

Add nest_memory region to exports node

Message ID 1504871765-15773-1-git-send-email-anju@linux.vnet.ibm.com
State Superseded
Headers show
Series Add nest_memory region to exports node | expand

Commit Message

Anju T Sudhakar Sept. 8, 2017, 11:56 a.m. UTC
From: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>

Adds nest_memory region to exports node, so that sysfs interface exposes
the nest-imc memory dump. This is really helpful incase of debugging nest-imc 
counters data and verify whether the counter values are updated in the main
memory properly or not.
Also helps to analyse the values populated in the control block structure. 

Example:

/proc/device-tree/ibm,opal/firmware/exports# ls
hdat_map  imc_nest_chip_0  name  phandle  symbol_map

/sys/firmware/opal/exports# ls
hdat_map  imc_nest_chip_0  symbol_map

/sys/firmware/opal/exports# hexdump imc_nest_chip_0 
0000000 0000 0000 0000 47af 0000 0000 0000 b41e
0000010 0000 0000 0400 7798 0000 0000 0000 0f6c
0000020 0000 0000 0000 0000 0000 0000 0000 c206
0000030 0000 0000 0000 f17b 0000 0000 0000 9100
0000040 0000 0000 0000 0000 0000 0000 0000 b71e
0000050 0000 0000 0400 6f98 0000 0000 0000 fc2b
***

Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
Tested-by : Anju T Sudhakar <anju@linux.vnet.ibm.com>
---
 hw/imc.c | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

Comments

Oliver O'Halloran Sept. 12, 2017, 4:50 a.m. UTC | #1
On Fri, Sep 8, 2017 at 9:56 PM, Anju T Sudhakar <anju@linux.vnet.ibm.com> wrote:
> From: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
>
> Adds nest_memory region to exports node, so that sysfs interface exposes
> the nest-imc memory dump. This is really helpful incase of debugging nest-imc
> counters data and verify whether the counter values are updated in the main
> memory properly or not.
> Also helps to analyse the values populated in the control block structure.
>
> Example:
>
> /proc/device-tree/ibm,opal/firmware/exports# ls
> hdat_map  imc_nest_chip_0  name  phandle  symbol_map
>
> /sys/firmware/opal/exports# ls
> hdat_map  imc_nest_chip_0  symbol_map
>
> /sys/firmware/opal/exports# hexdump imc_nest_chip_0
> 0000000 0000 0000 0000 47af 0000 0000 0000 b41e
> 0000010 0000 0000 0400 7798 0000 0000 0000 0f6c
> 0000020 0000 0000 0000 0000 0000 0000 0000 c206
> 0000030 0000 0000 0000 f17b 0000 0000 0000 9100
> 0000040 0000 0000 0000 0000 0000 0000 0000 b71e
> 0000050 0000 0000 0400 6f98 0000 0000 0000 fc2b
> ***
>
> Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
> Tested-by : Anju T Sudhakar <anju@linux.vnet.ibm.com>
> ---
>  hw/imc.c | 30 ++++++++++++++++++++++++++++++
>  1 file changed, 30 insertions(+)
>
> diff --git a/hw/imc.c b/hw/imc.c
> index b29a2a1ba270..11df258601d1 100644
> --- a/hw/imc.c
> +++ b/hw/imc.c
> @@ -113,6 +113,7 @@ static char *compress_buf;
>  static size_t compress_buf_size;
>  const char **prop_to_fix(struct dt_node *node);
>  const char *props_to_fix[] = {"events", NULL};
> +static uint32_t imc_nest_offset;
>
>  static bool is_nest_mem_initialized(struct imc_chip_cb *ptr)
>  {
> @@ -416,6 +417,33 @@ static void imc_dt_update_nest_node(struct dt_node *dev)
>         }
>  }
>
> +static void add_nest_mem_exports_node(struct dt_node *root, struct dt_node *dev)
> +{
> +       struct proc_chip *chip;
> +       struct dt_node *node;
> +       uint64_t baddr;
> +       const struct dt_property *type;
> +       char namebuf[32];
> +       int i=0;
> +
> +       dt_for_each_compatible(dev, node, "ibm,imc-counters") {
> +               type = dt_find_property(node, "type");
> +               if (type && is_nest_node(node))
> +                       imc_nest_offset = dt_prop_get_u32(node, "offset");
> +       }
> +
> +       node = dt_find_by_name(root, "exports");

You could remove the param "root" from this function and rewrite it as:

     dt_find_by_name(dt_opal, "exports");

> +       if (!node)
> +               return;
> +
> +       for_each_chip(chip) {

> +               snprintf(namebuf, sizeof(namebuf), "imc_nest_chip_%d", i++);

Can you use the chip_id (in hex) here rather than a counter?

> +               baddr = chip->homer_base;
> +               baddr += imc_nest_offset;
> +               dt_add_property_u64s(node, namebuf, baddr, 0x40000);

Why is the size hard coded rather than using the imc-nest-size property?

> +       }
> +}
> +
>  /*
>   * Load the IMC pnor partition and find the appropriate sub-partition
>   * based on the platform's PVR.
> @@ -522,6 +550,8 @@ imc_mambo:
>                 goto err;
>         }
>
> +       add_nest_mem_exports_node(dt_root, dev);
> +
>         free(compress_buf);
>         return;
>  err:
> --
> 2.7.4
>
> _______________________________________________
> Skiboot mailing list
> Skiboot@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/skiboot
maddy Sept. 12, 2017, 5:02 a.m. UTC | #2
On Tuesday 12 September 2017 10:20 AM, Oliver wrote:
> On Fri, Sep 8, 2017 at 9:56 PM, Anju T Sudhakar <anju@linux.vnet.ibm.com> wrote:
>> From: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
>>
>> Adds nest_memory region to exports node, so that sysfs interface exposes
>> the nest-imc memory dump. This is really helpful incase of debugging nest-imc
>> counters data and verify whether the counter values are updated in the main
>> memory properly or not.
>> Also helps to analyse the values populated in the control block structure.
>>
>> Example:
>>
>> /proc/device-tree/ibm,opal/firmware/exports# ls
>> hdat_map  imc_nest_chip_0  name  phandle  symbol_map
>>
>> /sys/firmware/opal/exports# ls
>> hdat_map  imc_nest_chip_0  symbol_map
>>
>> /sys/firmware/opal/exports# hexdump imc_nest_chip_0
>> 0000000 0000 0000 0000 47af 0000 0000 0000 b41e
>> 0000010 0000 0000 0400 7798 0000 0000 0000 0f6c
>> 0000020 0000 0000 0000 0000 0000 0000 0000 c206
>> 0000030 0000 0000 0000 f17b 0000 0000 0000 9100
>> 0000040 0000 0000 0000 0000 0000 0000 0000 b71e
>> 0000050 0000 0000 0400 6f98 0000 0000 0000 fc2b
>> ***
>>
>> Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
>> Tested-by : Anju T Sudhakar <anju@linux.vnet.ibm.com>
>> ---
>>   hw/imc.c | 30 ++++++++++++++++++++++++++++++
>>   1 file changed, 30 insertions(+)
>>
>> diff --git a/hw/imc.c b/hw/imc.c
>> index b29a2a1ba270..11df258601d1 100644
>> --- a/hw/imc.c
>> +++ b/hw/imc.c
>> @@ -113,6 +113,7 @@ static char *compress_buf;
>>   static size_t compress_buf_size;
>>   const char **prop_to_fix(struct dt_node *node);
>>   const char *props_to_fix[] = {"events", NULL};
>> +static uint32_t imc_nest_offset;
>>
>>   static bool is_nest_mem_initialized(struct imc_chip_cb *ptr)
>>   {
>> @@ -416,6 +417,33 @@ static void imc_dt_update_nest_node(struct dt_node *dev)
>>          }
>>   }
>>
>> +static void add_nest_mem_exports_node(struct dt_node *root, struct dt_node *dev)
>> +{
>> +       struct proc_chip *chip;
>> +       struct dt_node *node;
>> +       uint64_t baddr;
>> +       const struct dt_property *type;
>> +       char namebuf[32];
>> +       int i=0;
>> +
>> +       dt_for_each_compatible(dev, node, "ibm,imc-counters") {
>> +               type = dt_find_property(node, "type");
>> +               if (type && is_nest_node(node))
>> +                       imc_nest_offset = dt_prop_get_u32(node, "offset");
>> +       }
>> +
>> +       node = dt_find_by_name(root, "exports");
> You could remove the param "root" from this function and rewrite it as:
>
>       dt_find_by_name(dt_opal, "exports");

Yes, make sense. B/w you mean "dt_root" right?

>
>> +       if (!node)
>> +               return;
>> +
>> +       for_each_chip(chip) {
>> +               snprintf(namebuf, sizeof(namebuf), "imc_nest_chip_%d", i++);
> Can you use the chip_id (in hex) here rather than a counter?

sure.

>
>> +               baddr = chip->homer_base;
>> +               baddr += imc_nest_offset;
>> +               dt_add_property_u64s(node, namebuf, baddr, 0x40000);
> Why is the size hard coded rather than using the imc-nest-size property?

Yep fixed it in v2 of the patch

Thanks for the review
Maddy

>
>> +       }
>> +}
>> +
>>   /*
>>    * Load the IMC pnor partition and find the appropriate sub-partition
>>    * based on the platform's PVR.
>> @@ -522,6 +550,8 @@ imc_mambo:
>>                  goto err;
>>          }
>>
>> +       add_nest_mem_exports_node(dt_root, dev);
>> +
>>          free(compress_buf);
>>          return;
>>   err:
>> --
>> 2.7.4
>>
>> _______________________________________________
>> Skiboot mailing list
>> Skiboot@lists.ozlabs.org
>> https://lists.ozlabs.org/listinfo/skiboot
Oliver O'Halloran Sept. 12, 2017, 5:07 a.m. UTC | #3
On Tue, Sep 12, 2017 at 3:02 PM, Madhavan Srinivasan
<maddy@linux.vnet.ibm.com> wrote:
>
>
> On Tuesday 12 September 2017 10:20 AM, Oliver wrote:
>>
>> On Fri, Sep 8, 2017 at 9:56 PM, Anju T Sudhakar <anju@linux.vnet.ibm.com>
>> wrote:
>>>
>>> From: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
>>>
>>> Adds nest_memory region to exports node, so that sysfs interface exposes
>>> the nest-imc memory dump. This is really helpful incase of debugging
>>> nest-imc
>>> counters data and verify whether the counter values are updated in the
>>> main
>>> memory properly or not.
>>> Also helps to analyse the values populated in the control block
>>> structure.
>>>
>>> Example:
>>>
>>> /proc/device-tree/ibm,opal/firmware/exports# ls
>>> hdat_map  imc_nest_chip_0  name  phandle  symbol_map
>>>
>>> /sys/firmware/opal/exports# ls
>>> hdat_map  imc_nest_chip_0  symbol_map
>>>
>>> /sys/firmware/opal/exports# hexdump imc_nest_chip_0
>>> 0000000 0000 0000 0000 47af 0000 0000 0000 b41e
>>> 0000010 0000 0000 0400 7798 0000 0000 0000 0f6c
>>> 0000020 0000 0000 0000 0000 0000 0000 0000 c206
>>> 0000030 0000 0000 0000 f17b 0000 0000 0000 9100
>>> 0000040 0000 0000 0000 0000 0000 0000 0000 b71e
>>> 0000050 0000 0000 0400 6f98 0000 0000 0000 fc2b
>>> ***
>>>
>>> Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
>>> Tested-by : Anju T Sudhakar <anju@linux.vnet.ibm.com>
>>> ---
>>>   hw/imc.c | 30 ++++++++++++++++++++++++++++++
>>>   1 file changed, 30 insertions(+)
>>>
>>> diff --git a/hw/imc.c b/hw/imc.c
>>> index b29a2a1ba270..11df258601d1 100644
>>> --- a/hw/imc.c
>>> +++ b/hw/imc.c
>>> @@ -113,6 +113,7 @@ static char *compress_buf;
>>>   static size_t compress_buf_size;
>>>   const char **prop_to_fix(struct dt_node *node);
>>>   const char *props_to_fix[] = {"events", NULL};
>>> +static uint32_t imc_nest_offset;
>>>
>>>   static bool is_nest_mem_initialized(struct imc_chip_cb *ptr)
>>>   {
>>> @@ -416,6 +417,33 @@ static void imc_dt_update_nest_node(struct dt_node
>>> *dev)
>>>          }
>>>   }
>>>
>>> +static void add_nest_mem_exports_node(struct dt_node *root, struct
>>> dt_node *dev)
>>> +{
>>> +       struct proc_chip *chip;
>>> +       struct dt_node *node;
>>> +       uint64_t baddr;
>>> +       const struct dt_property *type;
>>> +       char namebuf[32];
>>> +       int i=0;
>>> +
>>> +       dt_for_each_compatible(dev, node, "ibm,imc-counters") {
>>> +               type = dt_find_property(node, "type");
>>> +               if (type && is_nest_node(node))
>>> +                       imc_nest_offset = dt_prop_get_u32(node,
>>> "offset");
>>> +       }
>>> +
>>> +       node = dt_find_by_name(root, "exports");
>>
>> You could remove the param "root" from this function and rewrite it as:
>>
>>       dt_find_by_name(dt_opal, "exports");
>
>
> Yes, make sense. B/w you mean "dt_root" right?

No, but dt_root would also work. dt_opal refers to the /ibm,opal/ node
so it'll be slightly faster since there's a smaller search space. It's
possible we might add another node caleld "exports" elsewhere in the
tree some day so using dt_opal is probably safer too.

>
>>
>>> +       if (!node)
>>> +               return;
>>> +
>>> +       for_each_chip(chip) {
>>> +               snprintf(namebuf, sizeof(namebuf), "imc_nest_chip_%d",
>>> i++);
>>
>> Can you use the chip_id (in hex) here rather than a counter?
>
>
> sure.
>
>>
>>> +               baddr = chip->homer_base;
>>> +               baddr += imc_nest_offset;
>>> +               dt_add_property_u64s(node, namebuf, baddr, 0x40000);
>>
>> Why is the size hard coded rather than using the imc-nest-size property?
>
>
> Yep fixed it in v2 of the patch
>
> Thanks for the review

no worries.

> Maddy
>
>
>>
>>> +       }
>>> +}
>>> +
>>>   /*
>>>    * Load the IMC pnor partition and find the appropriate sub-partition
>>>    * based on the platform's PVR.
>>> @@ -522,6 +550,8 @@ imc_mambo:
>>>                  goto err;
>>>          }
>>>
>>> +       add_nest_mem_exports_node(dt_root, dev);
>>> +
>>>          free(compress_buf);
>>>          return;
>>>   err:
>>> --
>>> 2.7.4
>>>
>>> _______________________________________________
>>> Skiboot mailing list
>>> Skiboot@lists.ozlabs.org
>>> https://lists.ozlabs.org/listinfo/skiboot
>
>
maddy Sept. 12, 2017, 5:09 a.m. UTC | #4
On Tuesday 12 September 2017 10:37 AM, Oliver wrote:
> On Tue, Sep 12, 2017 at 3:02 PM, Madhavan Srinivasan
> <maddy@linux.vnet.ibm.com> wrote:
>>
>> On Tuesday 12 September 2017 10:20 AM, Oliver wrote:
>>> On Fri, Sep 8, 2017 at 9:56 PM, Anju T Sudhakar <anju@linux.vnet.ibm.com>
>>> wrote:
>>>> From: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
>>>>
>>>> Adds nest_memory region to exports node, so that sysfs interface exposes
>>>> the nest-imc memory dump. This is really helpful incase of debugging
>>>> nest-imc
>>>> counters data and verify whether the counter values are updated in the
>>>> main
>>>> memory properly or not.
>>>> Also helps to analyse the values populated in the control block
>>>> structure.
>>>>
>>>> Example:
>>>>
>>>> /proc/device-tree/ibm,opal/firmware/exports# ls
>>>> hdat_map  imc_nest_chip_0  name  phandle  symbol_map
>>>>
>>>> /sys/firmware/opal/exports# ls
>>>> hdat_map  imc_nest_chip_0  symbol_map
>>>>
>>>> /sys/firmware/opal/exports# hexdump imc_nest_chip_0
>>>> 0000000 0000 0000 0000 47af 0000 0000 0000 b41e
>>>> 0000010 0000 0000 0400 7798 0000 0000 0000 0f6c
>>>> 0000020 0000 0000 0000 0000 0000 0000 0000 c206
>>>> 0000030 0000 0000 0000 f17b 0000 0000 0000 9100
>>>> 0000040 0000 0000 0000 0000 0000 0000 0000 b71e
>>>> 0000050 0000 0000 0400 6f98 0000 0000 0000 fc2b
>>>> ***
>>>>
>>>> Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
>>>> Tested-by : Anju T Sudhakar <anju@linux.vnet.ibm.com>
>>>> ---
>>>>    hw/imc.c | 30 ++++++++++++++++++++++++++++++
>>>>    1 file changed, 30 insertions(+)
>>>>
>>>> diff --git a/hw/imc.c b/hw/imc.c
>>>> index b29a2a1ba270..11df258601d1 100644
>>>> --- a/hw/imc.c
>>>> +++ b/hw/imc.c
>>>> @@ -113,6 +113,7 @@ static char *compress_buf;
>>>>    static size_t compress_buf_size;
>>>>    const char **prop_to_fix(struct dt_node *node);
>>>>    const char *props_to_fix[] = {"events", NULL};
>>>> +static uint32_t imc_nest_offset;
>>>>
>>>>    static bool is_nest_mem_initialized(struct imc_chip_cb *ptr)
>>>>    {
>>>> @@ -416,6 +417,33 @@ static void imc_dt_update_nest_node(struct dt_node
>>>> *dev)
>>>>           }
>>>>    }
>>>>
>>>> +static void add_nest_mem_exports_node(struct dt_node *root, struct
>>>> dt_node *dev)
>>>> +{
>>>> +       struct proc_chip *chip;
>>>> +       struct dt_node *node;
>>>> +       uint64_t baddr;
>>>> +       const struct dt_property *type;
>>>> +       char namebuf[32];
>>>> +       int i=0;
>>>> +
>>>> +       dt_for_each_compatible(dev, node, "ibm,imc-counters") {
>>>> +               type = dt_find_property(node, "type");
>>>> +               if (type && is_nest_node(node))
>>>> +                       imc_nest_offset = dt_prop_get_u32(node,
>>>> "offset");
>>>> +       }
>>>> +
>>>> +       node = dt_find_by_name(root, "exports");
>>> You could remove the param "root" from this function and rewrite it as:
>>>
>>>        dt_find_by_name(dt_opal, "exports");
>>
>> Yes, make sense. B/w you mean "dt_root" right?
> No, but dt_root would also work. dt_opal refers to the /ibm,opal/ node
> so it'll be slightly faster since there's a smaller search space. It's
Yep. Thats right.

> possible we might add another node caleld "exports" elsewhere in the
> tree some day so using dt_opal is probably safer too.

Ok thanks for details. Will make change.

Maddy

>
>>>> +       if (!node)
>>>> +               return;
>>>> +
>>>> +       for_each_chip(chip) {
>>>> +               snprintf(namebuf, sizeof(namebuf), "imc_nest_chip_%d",
>>>> i++);
>>> Can you use the chip_id (in hex) here rather than a counter?
>>
>> sure.
>>
>>>> +               baddr = chip->homer_base;
>>>> +               baddr += imc_nest_offset;
>>>> +               dt_add_property_u64s(node, namebuf, baddr, 0x40000);
>>> Why is the size hard coded rather than using the imc-nest-size property?
>>
>> Yep fixed it in v2 of the patch
>>
>> Thanks for the review
> no worries.
>
>> Maddy
>>
>>
>>>> +       }
>>>> +}
>>>> +
>>>>    /*
>>>>     * Load the IMC pnor partition and find the appropriate sub-partition
>>>>     * based on the platform's PVR.
>>>> @@ -522,6 +550,8 @@ imc_mambo:
>>>>                   goto err;
>>>>           }
>>>>
>>>> +       add_nest_mem_exports_node(dt_root, dev);
>>>> +
>>>>           free(compress_buf);
>>>>           return;
>>>>    err:
>>>> --
>>>> 2.7.4
>>>>
>>>> _______________________________________________
>>>> Skiboot mailing list
>>>> Skiboot@lists.ozlabs.org
>>>> https://lists.ozlabs.org/listinfo/skiboot
>>
diff mbox series

Patch

diff --git a/hw/imc.c b/hw/imc.c
index b29a2a1ba270..11df258601d1 100644
--- a/hw/imc.c
+++ b/hw/imc.c
@@ -113,6 +113,7 @@  static char *compress_buf;
 static size_t compress_buf_size;
 const char **prop_to_fix(struct dt_node *node);
 const char *props_to_fix[] = {"events", NULL};
+static uint32_t imc_nest_offset;
 
 static bool is_nest_mem_initialized(struct imc_chip_cb *ptr)
 {
@@ -416,6 +417,33 @@  static void imc_dt_update_nest_node(struct dt_node *dev)
 	}
 }
 
+static void add_nest_mem_exports_node(struct dt_node *root, struct dt_node *dev)
+{
+	struct proc_chip *chip;
+	struct dt_node *node;
+	uint64_t baddr;
+	const struct dt_property *type;
+	char namebuf[32];
+	int i=0;
+
+	dt_for_each_compatible(dev, node, "ibm,imc-counters") {
+		type = dt_find_property(node, "type");
+		if (type && is_nest_node(node))
+			imc_nest_offset = dt_prop_get_u32(node, "offset");
+	}
+
+	node = dt_find_by_name(root, "exports");
+	if (!node)
+		return;
+
+	for_each_chip(chip) {
+		snprintf(namebuf, sizeof(namebuf), "imc_nest_chip_%d", i++);
+		baddr = chip->homer_base;
+		baddr += imc_nest_offset;
+		dt_add_property_u64s(node, namebuf, baddr, 0x40000);
+	}
+}
+
 /*
  * Load the IMC pnor partition and find the appropriate sub-partition
  * based on the platform's PVR.
@@ -522,6 +550,8 @@  imc_mambo:
 		goto err;
 	}
 
+	add_nest_mem_exports_node(dt_root, dev);
+
 	free(compress_buf);
 	return;
 err: