diff mbox series

[v2,08/11] hw/arm/boot: Expose the PC-DIMM nodes in the DT

Message ID 20190308114218.26692-9-shameerali.kolothum.thodi@huawei.com (mailing list archive)
State New, archived
Headers show
Series ARM virt: ACPI memory hotplug support | expand

Commit Message

Shameerali Kolothum Thodi March 8, 2019, 11:42 a.m. UTC
This patch adds memory nodes corresponding to PC-DIMM regions.

NVDIMM and ACPI_NVDIMM configs are not yet set for ARM so we
don't need to care about NVDIMM at this stage.

Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
Signed-off-by: Eric Auger <eric.auger@redhat.com>
---
 hw/arm/boot.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

Comments

Igor Mammedov March 11, 2019, 2:58 p.m. UTC | #1
On Fri, 8 Mar 2019 11:42:15 +0000
Shameer Kolothum <shameerali.kolothum.thodi@huawei.com> wrote:

> This patch adds memory nodes corresponding to PC-DIMM regions.
> 
> NVDIMM and ACPI_NVDIMM configs are not yet set for ARM so we
> don't need to care about NVDIMM at this stage.
> 
> Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
> Signed-off-by: Eric Auger <eric.auger@redhat.com>
> ---
>  hw/arm/boot.c | 42 ++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 42 insertions(+)
> 
> diff --git a/hw/arm/boot.c b/hw/arm/boot.c
> index a830655..4caaf91 100644
> --- a/hw/arm/boot.c
> +++ b/hw/arm/boot.c
> @@ -19,6 +19,7 @@
>  #include "sysemu/numa.h"
>  #include "hw/boards.h"
>  #include "hw/loader.h"
> +#include "hw/mem/memory-device.h"
>  #include "elf.h"
>  #include "sysemu/device_tree.h"
>  #include "qemu/config-file.h"
> @@ -522,6 +523,41 @@ static void fdt_add_psci_node(void *fdt)
>      qemu_fdt_setprop_cell(fdt, "/psci", "migrate", migrate_fn);
>  }
>  
> +static int fdt_add_hotpluggable_memory_nodes(void *fdt,
> +                                             uint32_t acells, uint32_t scells) {
> +    MemoryDeviceInfoList *info, *info_list = qmp_memory_device_list();
> +    MemoryDeviceInfo *mi;
> +    int ret = 0;
> +
> +    for (info = info_list; info != NULL; info = info->next) {
> +        mi = info->value;
> +        switch (mi->type) {
> +        case MEMORY_DEVICE_INFO_KIND_DIMM:
> +        {
> +            PCDIMMDeviceInfo *di = mi->u.dimm.data;
> +
> +            ret = fdt_add_memory_node(fdt, acells, di->addr,
> +                                      scells, di->size, di->node);
> +            if (ret) {
> +                fprintf(stderr,
> +                        "couldn't add PCDIMM /memory@%"PRIx64" node\n",
> +                        di->addr);
> +                goto out;
> +            }
> +            break;
> +        }
> +        default:
> +            fprintf(stderr, "%s memory nodes are not yet supported\n",
> +                    MemoryDeviceInfoKind_str(mi->type));
> +            ret = -ENOENT;
> +            goto out;
> +        }
> +    }
> +out:
> +    qapi_free_MemoryDeviceInfoList(info_list);
> +    return ret;
> +}
> +
>  int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
>                   hwaddr addr_limit, AddressSpace *as)
>  {
> @@ -621,6 +657,12 @@ int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
>          }
>      }
>  
> +    rc = fdt_add_hotpluggable_memory_nodes(fdt, acells, scells);
According to Eric's test, guest kernel picks this up. So it probably
should be an opt-in feature to avoid conflict with ACPI definition in DSDT.

> +    if (rc < 0) {
> +        fprintf(stderr, "couldn't add hotpluggable memory nodes\n");
> +        goto fail;
> +    }
> +
>      rc = fdt_path_offset(fdt, "/chosen");
>      if (rc < 0) {
>          qemu_fdt_add_subnode(fdt, "/chosen");
Shameerali Kolothum Thodi March 12, 2019, 3:13 p.m. UTC | #2
> -----Original Message-----
> From: Igor Mammedov [mailto:imammedo@redhat.com]
> Sent: 11 March 2019 14:59
> To: Shameerali Kolothum Thodi <shameerali.kolothum.thodi@huawei.com>
> Cc: qemu-devel@nongnu.org; qemu-arm@nongnu.org;
> eric.auger@redhat.com; peter.maydell@linaro.org;
> shannon.zhaosl@gmail.com; sameo@linux.intel.com;
> sebastien.boeuf@intel.com; Linuxarm <linuxarm@huawei.com>; xuwei (O)
> <xuwei5@huawei.com>
> Subject: Re: [PATCH v2 08/11] hw/arm/boot: Expose the PC-DIMM nodes in the
> DT
> 
> On Fri, 8 Mar 2019 11:42:15 +0000
> Shameer Kolothum <shameerali.kolothum.thodi@huawei.com> wrote:
> 
> > This patch adds memory nodes corresponding to PC-DIMM regions.
> >
> > NVDIMM and ACPI_NVDIMM configs are not yet set for ARM so we
> > don't need to care about NVDIMM at this stage.
> >
> > Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
> > Signed-off-by: Eric Auger <eric.auger@redhat.com>
> > ---
> >  hw/arm/boot.c | 42 ++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 42 insertions(+)
> >
> > diff --git a/hw/arm/boot.c b/hw/arm/boot.c
> > index a830655..4caaf91 100644
> > --- a/hw/arm/boot.c
> > +++ b/hw/arm/boot.c
> > @@ -19,6 +19,7 @@
> >  #include "sysemu/numa.h"
> >  #include "hw/boards.h"
> >  #include "hw/loader.h"
> > +#include "hw/mem/memory-device.h"
> >  #include "elf.h"
> >  #include "sysemu/device_tree.h"
> >  #include "qemu/config-file.h"
> > @@ -522,6 +523,41 @@ static void fdt_add_psci_node(void *fdt)
> >      qemu_fdt_setprop_cell(fdt, "/psci", "migrate", migrate_fn);
> >  }
> >
> > +static int fdt_add_hotpluggable_memory_nodes(void *fdt,
> > +                                             uint32_t acells,
> uint32_t scells) {
> > +    MemoryDeviceInfoList *info, *info_list = qmp_memory_device_list();
> > +    MemoryDeviceInfo *mi;
> > +    int ret = 0;
> > +
> > +    for (info = info_list; info != NULL; info = info->next) {
> > +        mi = info->value;
> > +        switch (mi->type) {
> > +        case MEMORY_DEVICE_INFO_KIND_DIMM:
> > +        {
> > +            PCDIMMDeviceInfo *di = mi->u.dimm.data;
> > +
> > +            ret = fdt_add_memory_node(fdt, acells, di->addr,
> > +                                      scells, di->size, di->node);
> > +            if (ret) {
> > +                fprintf(stderr,
> > +                        "couldn't add PCDIMM /memory@%"PRIx64"
> node\n",
> > +                        di->addr);
> > +                goto out;
> > +            }
> > +            break;
> > +        }
> > +        default:
> > +            fprintf(stderr, "%s memory nodes are not yet supported\n",
> > +                    MemoryDeviceInfoKind_str(mi->type));
> > +            ret = -ENOENT;
> > +            goto out;
> > +        }
> > +    }
> > +out:
> > +    qapi_free_MemoryDeviceInfoList(info_list);
> > +    return ret;
> > +}
> > +
> >  int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
> >                   hwaddr addr_limit, AddressSpace *as)
> >  {
> > @@ -621,6 +657,12 @@ int arm_load_dtb(hwaddr addr, const struct
> arm_boot_info *binfo,
> >          }
> >      }
> >
> > +    rc = fdt_add_hotpluggable_memory_nodes(fdt, acells, scells);
> According to Eric's test, guest kernel picks this up. So it probably
> should be an opt-in feature to avoid conflict with ACPI definition in DSDT.

Ok. My take away from that discussion was that if we properly describe the
PNP0C80 (which is what #06 of this series does) then we don't have to worry
about DT entries as ACPI will "override" it.  But it looks like that is not the case
and describing DT will anyway cause the memory being end up in UEFI
GeTMemoryMap() and results in being used as normal memory early at boot.

Hi Eric,

How do we verify that this is actually happening? I tried running the /proc/meminfo
on a Qemu build upto #06 of this series, and it reported memory including the
cold plugged dimm memory.

But not sure how to verify that this dimm mem is being treated as normal mem on
boot time or not? Please let me know.

Thanks,
Shameer


> > +    if (rc < 0) {
> > +        fprintf(stderr, "couldn't add hotpluggable memory nodes\n");
> > +        goto fail;
> > +    }
> > +
> >      rc = fdt_path_offset(fdt, "/chosen");
> >      if (rc < 0) {
> >          qemu_fdt_add_subnode(fdt, "/chosen");
Eric Auger March 12, 2019, 3:38 p.m. UTC | #3
Hi Shameer,

On 3/12/19 4:13 PM, Shameerali Kolothum Thodi wrote:
> 
> 
>> -----Original Message-----
>> From: Igor Mammedov [mailto:imammedo@redhat.com]
>> Sent: 11 March 2019 14:59
>> To: Shameerali Kolothum Thodi <shameerali.kolothum.thodi@huawei.com>
>> Cc: qemu-devel@nongnu.org; qemu-arm@nongnu.org;
>> eric.auger@redhat.com; peter.maydell@linaro.org;
>> shannon.zhaosl@gmail.com; sameo@linux.intel.com;
>> sebastien.boeuf@intel.com; Linuxarm <linuxarm@huawei.com>; xuwei (O)
>> <xuwei5@huawei.com>
>> Subject: Re: [PATCH v2 08/11] hw/arm/boot: Expose the PC-DIMM nodes in the
>> DT
>>
>> On Fri, 8 Mar 2019 11:42:15 +0000
>> Shameer Kolothum <shameerali.kolothum.thodi@huawei.com> wrote:
>>
>>> This patch adds memory nodes corresponding to PC-DIMM regions.
>>>
>>> NVDIMM and ACPI_NVDIMM configs are not yet set for ARM so we
>>> don't need to care about NVDIMM at this stage.
>>>
>>> Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
>>> Signed-off-by: Eric Auger <eric.auger@redhat.com>
>>> ---
>>>  hw/arm/boot.c | 42 ++++++++++++++++++++++++++++++++++++++++++
>>>  1 file changed, 42 insertions(+)
>>>
>>> diff --git a/hw/arm/boot.c b/hw/arm/boot.c
>>> index a830655..4caaf91 100644
>>> --- a/hw/arm/boot.c
>>> +++ b/hw/arm/boot.c
>>> @@ -19,6 +19,7 @@
>>>  #include "sysemu/numa.h"
>>>  #include "hw/boards.h"
>>>  #include "hw/loader.h"
>>> +#include "hw/mem/memory-device.h"
>>>  #include "elf.h"
>>>  #include "sysemu/device_tree.h"
>>>  #include "qemu/config-file.h"
>>> @@ -522,6 +523,41 @@ static void fdt_add_psci_node(void *fdt)
>>>      qemu_fdt_setprop_cell(fdt, "/psci", "migrate", migrate_fn);
>>>  }
>>>
>>> +static int fdt_add_hotpluggable_memory_nodes(void *fdt,
>>> +                                             uint32_t acells,
>> uint32_t scells) {
>>> +    MemoryDeviceInfoList *info, *info_list = qmp_memory_device_list();
>>> +    MemoryDeviceInfo *mi;
>>> +    int ret = 0;
>>> +
>>> +    for (info = info_list; info != NULL; info = info->next) {
>>> +        mi = info->value;
>>> +        switch (mi->type) {
>>> +        case MEMORY_DEVICE_INFO_KIND_DIMM:
>>> +        {
>>> +            PCDIMMDeviceInfo *di = mi->u.dimm.data;
>>> +
>>> +            ret = fdt_add_memory_node(fdt, acells, di->addr,
>>> +                                      scells, di->size, di->node);
>>> +            if (ret) {
>>> +                fprintf(stderr,
>>> +                        "couldn't add PCDIMM /memory@%"PRIx64"
>> node\n",
>>> +                        di->addr);
>>> +                goto out;
>>> +            }
>>> +            break;
>>> +        }
>>> +        default:
>>> +            fprintf(stderr, "%s memory nodes are not yet supported\n",
>>> +                    MemoryDeviceInfoKind_str(mi->type));
>>> +            ret = -ENOENT;
>>> +            goto out;
>>> +        }
>>> +    }
>>> +out:
>>> +    qapi_free_MemoryDeviceInfoList(info_list);
>>> +    return ret;
>>> +}
>>> +
>>>  int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
>>>                   hwaddr addr_limit, AddressSpace *as)
>>>  {
>>> @@ -621,6 +657,12 @@ int arm_load_dtb(hwaddr addr, const struct
>> arm_boot_info *binfo,
>>>          }
>>>      }
>>>
>>> +    rc = fdt_add_hotpluggable_memory_nodes(fdt, acells, scells);
>> According to Eric's test, guest kernel picks this up. So it probably
>> should be an opt-in feature to avoid conflict with ACPI definition in DSDT.
> 
> Ok. My take away from that discussion was that if we properly describe the
> PNP0C80 (which is what #06 of this series does) then we don't have to worry
> about DT entries as ACPI will "override" it.  But it looks like that is not the case
> and describing DT will anyway cause the memory being end up in UEFI
> GeTMemoryMap() and results in being used as normal memory early at boot.
> 
> Hi Eric,
> 
> How do we verify that this is actually happening? I tried running the /proc/meminfo
> on a Qemu build upto #06 of this series, and it reported memory including the
> cold plugged dimm memory.
> 
> But not sure how to verify that this dimm mem is being treated as normal mem on
> boot time or not? Please let me know.

At the time I tested I did not have PNP0C80 build. I confirm that if you
remove the dt description in ACPI mode, /proc/meminfo does not report
the DIMMs. Now that you have #06, if you remove the DT  hotpluggables
memory mode generation in ACPI mode, you should see them and if I
understand correctly this is what you confirm. I have not tested
anything else at the moment.

Thanks

Eric
> 
> Thanks,
> Shameer
> 
> 
>>> +    if (rc < 0) {
>>> +        fprintf(stderr, "couldn't add hotpluggable memory nodes\n");
>>> +        goto fail;
>>> +    }
>>> +
>>>      rc = fdt_path_offset(fdt, "/chosen");
>>>      if (rc < 0) {
>>>          qemu_fdt_add_subnode(fdt, "/chosen");
> 
>
Shameerali Kolothum Thodi March 12, 2019, 4:39 p.m. UTC | #4
> -----Original Message-----
> From: Auger Eric [mailto:eric.auger@redhat.com]
> Sent: 12 March 2019 15:38
> To: Shameerali Kolothum Thodi <shameerali.kolothum.thodi@huawei.com>;
> Igor Mammedov <imammedo@redhat.com>
> Cc: peter.maydell@linaro.org; sameo@linux.intel.com;
> shannon.zhaosl@gmail.com; qemu-devel@nongnu.org; Linuxarm
> <linuxarm@huawei.com>; qemu-arm@nongnu.org; xuwei (O)
> <xuwei5@huawei.com>; sebastien.boeuf@intel.com
> Subject: Re: [Qemu-devel] [PATCH v2 08/11] hw/arm/boot: Expose the
> PC-DIMM nodes in the DT
> 
> Hi Shameer,
> 
> On 3/12/19 4:13 PM, Shameerali Kolothum Thodi wrote:
> >
> >
> >> -----Original Message-----
> >> From: Igor Mammedov [mailto:imammedo@redhat.com]
> >> Sent: 11 March 2019 14:59
> >> To: Shameerali Kolothum Thodi <shameerali.kolothum.thodi@huawei.com>
> >> Cc: qemu-devel@nongnu.org; qemu-arm@nongnu.org;
> >> eric.auger@redhat.com; peter.maydell@linaro.org;
> >> shannon.zhaosl@gmail.com; sameo@linux.intel.com;
> >> sebastien.boeuf@intel.com; Linuxarm <linuxarm@huawei.com>; xuwei (O)
> >> <xuwei5@huawei.com>
> >> Subject: Re: [PATCH v2 08/11] hw/arm/boot: Expose the PC-DIMM nodes in
> the
> >> DT
> >>
> >> On Fri, 8 Mar 2019 11:42:15 +0000
> >> Shameer Kolothum <shameerali.kolothum.thodi@huawei.com> wrote:
> >>
> >>> This patch adds memory nodes corresponding to PC-DIMM regions.
> >>>
> >>> NVDIMM and ACPI_NVDIMM configs are not yet set for ARM so we
> >>> don't need to care about NVDIMM at this stage.
> >>>
> >>> Signed-off-by: Shameer Kolothum
> <shameerali.kolothum.thodi@huawei.com>
> >>> Signed-off-by: Eric Auger <eric.auger@redhat.com>
> >>> ---
> >>>  hw/arm/boot.c | 42 ++++++++++++++++++++++++++++++++++++++++++
> >>>  1 file changed, 42 insertions(+)
> >>>
> >>> diff --git a/hw/arm/boot.c b/hw/arm/boot.c
> >>> index a830655..4caaf91 100644
> >>> --- a/hw/arm/boot.c
> >>> +++ b/hw/arm/boot.c
> >>> @@ -19,6 +19,7 @@
> >>>  #include "sysemu/numa.h"
> >>>  #include "hw/boards.h"
> >>>  #include "hw/loader.h"
> >>> +#include "hw/mem/memory-device.h"
> >>>  #include "elf.h"
> >>>  #include "sysemu/device_tree.h"
> >>>  #include "qemu/config-file.h"
> >>> @@ -522,6 +523,41 @@ static void fdt_add_psci_node(void *fdt)
> >>>      qemu_fdt_setprop_cell(fdt, "/psci", "migrate", migrate_fn);
> >>>  }
> >>>
> >>> +static int fdt_add_hotpluggable_memory_nodes(void *fdt,
> >>> +                                             uint32_t acells,
> >> uint32_t scells) {
> >>> +    MemoryDeviceInfoList *info, *info_list = qmp_memory_device_list();
> >>> +    MemoryDeviceInfo *mi;
> >>> +    int ret = 0;
> >>> +
> >>> +    for (info = info_list; info != NULL; info = info->next) {
> >>> +        mi = info->value;
> >>> +        switch (mi->type) {
> >>> +        case MEMORY_DEVICE_INFO_KIND_DIMM:
> >>> +        {
> >>> +            PCDIMMDeviceInfo *di = mi->u.dimm.data;
> >>> +
> >>> +            ret = fdt_add_memory_node(fdt, acells, di->addr,
> >>> +                                      scells, di->size, di->node);
> >>> +            if (ret) {
> >>> +                fprintf(stderr,
> >>> +                        "couldn't add PCDIMM
> /memory@%"PRIx64"
> >> node\n",
> >>> +                        di->addr);
> >>> +                goto out;
> >>> +            }
> >>> +            break;
> >>> +        }
> >>> +        default:
> >>> +            fprintf(stderr, "%s memory nodes are not yet
> supported\n",
> >>> +                    MemoryDeviceInfoKind_str(mi->type));
> >>> +            ret = -ENOENT;
> >>> +            goto out;
> >>> +        }
> >>> +    }
> >>> +out:
> >>> +    qapi_free_MemoryDeviceInfoList(info_list);
> >>> +    return ret;
> >>> +}
> >>> +
> >>>  int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
> >>>                   hwaddr addr_limit, AddressSpace *as)
> >>>  {
> >>> @@ -621,6 +657,12 @@ int arm_load_dtb(hwaddr addr, const struct
> >> arm_boot_info *binfo,
> >>>          }
> >>>      }
> >>>
> >>> +    rc = fdt_add_hotpluggable_memory_nodes(fdt, acells, scells);
> >> According to Eric's test, guest kernel picks this up. So it probably
> >> should be an opt-in feature to avoid conflict with ACPI definition in DSDT.
> >
> > Ok. My take away from that discussion was that if we properly describe the
> > PNP0C80 (which is what #06 of this series does) then we don't have to worry
> > about DT entries as ACPI will "override" it.  But it looks like that is not the
> case
> > and describing DT will anyway cause the memory being end up in UEFI
> > GeTMemoryMap() and results in being used as normal memory early at boot.
> >
> > Hi Eric,
> >
> > How do we verify that this is actually happening? I tried running the
> /proc/meminfo
> > on a Qemu build upto #06 of this series, and it reported memory including the
> > cold plugged dimm memory.
> >
> > But not sure how to verify that this dimm mem is being treated as normal
> mem on
> > boot time or not? Please let me know.
> 
> At the time I tested I did not have PNP0C80 build. I confirm that if you
> remove the dt description in ACPI mode, /proc/meminfo does not report
> the DIMMs. Now that you have #06, if you remove the DT  hotpluggables
> memory mode generation in ACPI mode, you should see them and if I
> understand correctly this is what you confirm. I have not tested
> anything else at the moment.

Yes, that is what I confirmed. But the concern now is having DT memory node
generation will result in the problem described above - UEFI GetMemoryMap().

I was looking for a way to check that is a valid issue or not. I will try to look for 
a way to verify that. Please update if you come across anything.

Thanks,
Shameer

> Thanks
> 
> Eric
> >
> > Thanks,
> > Shameer
> >
> >
> >>> +    if (rc < 0) {
> >>> +        fprintf(stderr, "couldn't add hotpluggable memory nodes\n");
> >>> +        goto fail;
> >>> +    }
> >>> +
> >>>      rc = fdt_path_offset(fdt, "/chosen");
> >>>      if (rc < 0) {
> >>>          qemu_fdt_add_subnode(fdt, "/chosen");
> >
> >
Eric Auger March 12, 2019, 4:47 p.m. UTC | #5
Hi Shameer,

On 3/12/19 5:39 PM, Shameerali Kolothum Thodi wrote:
> 
> 
>> -----Original Message-----
>> From: Auger Eric [mailto:eric.auger@redhat.com]
>> Sent: 12 March 2019 15:38
>> To: Shameerali Kolothum Thodi <shameerali.kolothum.thodi@huawei.com>;
>> Igor Mammedov <imammedo@redhat.com>
>> Cc: peter.maydell@linaro.org; sameo@linux.intel.com;
>> shannon.zhaosl@gmail.com; qemu-devel@nongnu.org; Linuxarm
>> <linuxarm@huawei.com>; qemu-arm@nongnu.org; xuwei (O)
>> <xuwei5@huawei.com>; sebastien.boeuf@intel.com
>> Subject: Re: [Qemu-devel] [PATCH v2 08/11] hw/arm/boot: Expose the
>> PC-DIMM nodes in the DT
>>
>> Hi Shameer,
>>
>> On 3/12/19 4:13 PM, Shameerali Kolothum Thodi wrote:
>>>
>>>
>>>> -----Original Message-----
>>>> From: Igor Mammedov [mailto:imammedo@redhat.com]
>>>> Sent: 11 March 2019 14:59
>>>> To: Shameerali Kolothum Thodi <shameerali.kolothum.thodi@huawei.com>
>>>> Cc: qemu-devel@nongnu.org; qemu-arm@nongnu.org;
>>>> eric.auger@redhat.com; peter.maydell@linaro.org;
>>>> shannon.zhaosl@gmail.com; sameo@linux.intel.com;
>>>> sebastien.boeuf@intel.com; Linuxarm <linuxarm@huawei.com>; xuwei (O)
>>>> <xuwei5@huawei.com>
>>>> Subject: Re: [PATCH v2 08/11] hw/arm/boot: Expose the PC-DIMM nodes in
>> the
>>>> DT
>>>>
>>>> On Fri, 8 Mar 2019 11:42:15 +0000
>>>> Shameer Kolothum <shameerali.kolothum.thodi@huawei.com> wrote:
>>>>
>>>>> This patch adds memory nodes corresponding to PC-DIMM regions.
>>>>>
>>>>> NVDIMM and ACPI_NVDIMM configs are not yet set for ARM so we
>>>>> don't need to care about NVDIMM at this stage.
>>>>>
>>>>> Signed-off-by: Shameer Kolothum
>> <shameerali.kolothum.thodi@huawei.com>
>>>>> Signed-off-by: Eric Auger <eric.auger@redhat.com>
>>>>> ---
>>>>>  hw/arm/boot.c | 42 ++++++++++++++++++++++++++++++++++++++++++
>>>>>  1 file changed, 42 insertions(+)
>>>>>
>>>>> diff --git a/hw/arm/boot.c b/hw/arm/boot.c
>>>>> index a830655..4caaf91 100644
>>>>> --- a/hw/arm/boot.c
>>>>> +++ b/hw/arm/boot.c
>>>>> @@ -19,6 +19,7 @@
>>>>>  #include "sysemu/numa.h"
>>>>>  #include "hw/boards.h"
>>>>>  #include "hw/loader.h"
>>>>> +#include "hw/mem/memory-device.h"
>>>>>  #include "elf.h"
>>>>>  #include "sysemu/device_tree.h"
>>>>>  #include "qemu/config-file.h"
>>>>> @@ -522,6 +523,41 @@ static void fdt_add_psci_node(void *fdt)
>>>>>      qemu_fdt_setprop_cell(fdt, "/psci", "migrate", migrate_fn);
>>>>>  }
>>>>>
>>>>> +static int fdt_add_hotpluggable_memory_nodes(void *fdt,
>>>>> +                                             uint32_t acells,
>>>> uint32_t scells) {
>>>>> +    MemoryDeviceInfoList *info, *info_list = qmp_memory_device_list();
>>>>> +    MemoryDeviceInfo *mi;
>>>>> +    int ret = 0;
>>>>> +
>>>>> +    for (info = info_list; info != NULL; info = info->next) {
>>>>> +        mi = info->value;
>>>>> +        switch (mi->type) {
>>>>> +        case MEMORY_DEVICE_INFO_KIND_DIMM:
>>>>> +        {
>>>>> +            PCDIMMDeviceInfo *di = mi->u.dimm.data;
>>>>> +
>>>>> +            ret = fdt_add_memory_node(fdt, acells, di->addr,
>>>>> +                                      scells, di->size, di->node);
>>>>> +            if (ret) {
>>>>> +                fprintf(stderr,
>>>>> +                        "couldn't add PCDIMM
>> /memory@%"PRIx64"
>>>> node\n",
>>>>> +                        di->addr);
>>>>> +                goto out;
>>>>> +            }
>>>>> +            break;
>>>>> +        }
>>>>> +        default:
>>>>> +            fprintf(stderr, "%s memory nodes are not yet
>> supported\n",
>>>>> +                    MemoryDeviceInfoKind_str(mi->type));
>>>>> +            ret = -ENOENT;
>>>>> +            goto out;
>>>>> +        }
>>>>> +    }
>>>>> +out:
>>>>> +    qapi_free_MemoryDeviceInfoList(info_list);
>>>>> +    return ret;
>>>>> +}
>>>>> +
>>>>>  int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
>>>>>                   hwaddr addr_limit, AddressSpace *as)
>>>>>  {
>>>>> @@ -621,6 +657,12 @@ int arm_load_dtb(hwaddr addr, const struct
>>>> arm_boot_info *binfo,
>>>>>          }
>>>>>      }
>>>>>
>>>>> +    rc = fdt_add_hotpluggable_memory_nodes(fdt, acells, scells);
>>>> According to Eric's test, guest kernel picks this up. So it probably
>>>> should be an opt-in feature to avoid conflict with ACPI definition in DSDT.
>>>
>>> Ok. My take away from that discussion was that if we properly describe the
>>> PNP0C80 (which is what #06 of this series does) then we don't have to worry
>>> about DT entries as ACPI will "override" it.  But it looks like that is not the
>> case
>>> and describing DT will anyway cause the memory being end up in UEFI
>>> GeTMemoryMap() and results in being used as normal memory early at boot.
>>>
>>> Hi Eric,
>>>
>>> How do we verify that this is actually happening? I tried running the
>> /proc/meminfo
>>> on a Qemu build upto #06 of this series, and it reported memory including the
>>> cold plugged dimm memory.
>>>
>>> But not sure how to verify that this dimm mem is being treated as normal
>> mem on
>>> boot time or not? Please let me know.
>>
>> At the time I tested I did not have PNP0C80 build. I confirm that if you
>> remove the dt description in ACPI mode, /proc/meminfo does not report
>> the DIMMs. Now that you have #06, if you remove the DT  hotpluggables
>> memory mode generation in ACPI mode, you should see them and if I
>> understand correctly this is what you confirm. I have not tested
>> anything else at the moment.
> 
> Yes, that is what I confirmed. But the concern now is having DT memory node
> generation will result in the problem described above - UEFI GetMemoryMap().
Sorry I don't understand the stated problem. If you remove the call to
fdt_add_hotpluggable_memory_nodes when running in ACPI mode,  does the
above GetMemoryMap see the DIMMs?

Thanks

Eric
> 
> I was looking for a way to check that is a valid issue or not. I will try to look for 
> a way to verify that. Please update if you come across anything.
> 
> Thanks,
> Shameer
> 
>> Thanks
>>
>> Eric
>>>
>>> Thanks,
>>> Shameer
>>>
>>>
>>>>> +    if (rc < 0) {
>>>>> +        fprintf(stderr, "couldn't add hotpluggable memory nodes\n");
>>>>> +        goto fail;
>>>>> +    }
>>>>> +
>>>>>      rc = fdt_path_offset(fdt, "/chosen");
>>>>>      if (rc < 0) {
>>>>>          qemu_fdt_add_subnode(fdt, "/chosen");
>>>
>>>
Shameerali Kolothum Thodi March 12, 2019, 4:56 p.m. UTC | #6
Hi Eric,

> -----Original Message-----
> From: Auger Eric [mailto:eric.auger@redhat.com]
> Sent: 12 March 2019 16:48
> To: Shameerali Kolothum Thodi <shameerali.kolothum.thodi@huawei.com>;
> Igor Mammedov <imammedo@redhat.com>
> Cc: peter.maydell@linaro.org; sameo@linux.intel.com;
> shannon.zhaosl@gmail.com; qemu-devel@nongnu.org; Linuxarm
> <linuxarm@huawei.com>; qemu-arm@nongnu.org; xuwei (O)
> <xuwei5@huawei.com>; sebastien.boeuf@intel.com
> Subject: Re: [Qemu-devel] [PATCH v2 08/11] hw/arm/boot: Expose the
> PC-DIMM nodes in the DT
> 
> Hi Shameer,
> 
> On 3/12/19 5:39 PM, Shameerali Kolothum Thodi wrote:
> >
> >
> >> -----Original Message-----
> >> From: Auger Eric [mailto:eric.auger@redhat.com]
> >> Sent: 12 March 2019 15:38
> >> To: Shameerali Kolothum Thodi <shameerali.kolothum.thodi@huawei.com>;
> >> Igor Mammedov <imammedo@redhat.com>
> >> Cc: peter.maydell@linaro.org; sameo@linux.intel.com;
> >> shannon.zhaosl@gmail.com; qemu-devel@nongnu.org; Linuxarm
> >> <linuxarm@huawei.com>; qemu-arm@nongnu.org; xuwei (O)
> >> <xuwei5@huawei.com>; sebastien.boeuf@intel.com
> >> Subject: Re: [Qemu-devel] [PATCH v2 08/11] hw/arm/boot: Expose the
> >> PC-DIMM nodes in the DT
> >>
> >> Hi Shameer,
> >>
> >> On 3/12/19 4:13 PM, Shameerali Kolothum Thodi wrote:
> >>>
> >>>
> >>>> -----Original Message-----
> >>>> From: Igor Mammedov [mailto:imammedo@redhat.com]
> >>>> Sent: 11 March 2019 14:59
> >>>> To: Shameerali Kolothum Thodi
> <shameerali.kolothum.thodi@huawei.com>
> >>>> Cc: qemu-devel@nongnu.org; qemu-arm@nongnu.org;
> >>>> eric.auger@redhat.com; peter.maydell@linaro.org;
> >>>> shannon.zhaosl@gmail.com; sameo@linux.intel.com;
> >>>> sebastien.boeuf@intel.com; Linuxarm <linuxarm@huawei.com>; xuwei
> (O)
> >>>> <xuwei5@huawei.com>
> >>>> Subject: Re: [PATCH v2 08/11] hw/arm/boot: Expose the PC-DIMM nodes
> in
> >> the
> >>>> DT
> >>>>
> >>>> On Fri, 8 Mar 2019 11:42:15 +0000
> >>>> Shameer Kolothum <shameerali.kolothum.thodi@huawei.com> wrote:
> >>>>
> >>>>> This patch adds memory nodes corresponding to PC-DIMM regions.
> >>>>>
> >>>>> NVDIMM and ACPI_NVDIMM configs are not yet set for ARM so we
> >>>>> don't need to care about NVDIMM at this stage.
> >>>>>
> >>>>> Signed-off-by: Shameer Kolothum
> >> <shameerali.kolothum.thodi@huawei.com>
> >>>>> Signed-off-by: Eric Auger <eric.auger@redhat.com>
> >>>>> ---
> >>>>>  hw/arm/boot.c | 42
> ++++++++++++++++++++++++++++++++++++++++++
> >>>>>  1 file changed, 42 insertions(+)
> >>>>>
> >>>>> diff --git a/hw/arm/boot.c b/hw/arm/boot.c
> >>>>> index a830655..4caaf91 100644
> >>>>> --- a/hw/arm/boot.c
> >>>>> +++ b/hw/arm/boot.c
> >>>>> @@ -19,6 +19,7 @@
> >>>>>  #include "sysemu/numa.h"
> >>>>>  #include "hw/boards.h"
> >>>>>  #include "hw/loader.h"
> >>>>> +#include "hw/mem/memory-device.h"
> >>>>>  #include "elf.h"
> >>>>>  #include "sysemu/device_tree.h"
> >>>>>  #include "qemu/config-file.h"
> >>>>> @@ -522,6 +523,41 @@ static void fdt_add_psci_node(void *fdt)
> >>>>>      qemu_fdt_setprop_cell(fdt, "/psci", "migrate", migrate_fn);
> >>>>>  }
> >>>>>
> >>>>> +static int fdt_add_hotpluggable_memory_nodes(void *fdt,
> >>>>> +                                             uint32_t acells,
> >>>> uint32_t scells) {
> >>>>> +    MemoryDeviceInfoList *info, *info_list =
> qmp_memory_device_list();
> >>>>> +    MemoryDeviceInfo *mi;
> >>>>> +    int ret = 0;
> >>>>> +
> >>>>> +    for (info = info_list; info != NULL; info = info->next) {
> >>>>> +        mi = info->value;
> >>>>> +        switch (mi->type) {
> >>>>> +        case MEMORY_DEVICE_INFO_KIND_DIMM:
> >>>>> +        {
> >>>>> +            PCDIMMDeviceInfo *di = mi->u.dimm.data;
> >>>>> +
> >>>>> +            ret = fdt_add_memory_node(fdt, acells, di->addr,
> >>>>> +                                      scells, di->size,
> di->node);
> >>>>> +            if (ret) {
> >>>>> +                fprintf(stderr,
> >>>>> +                        "couldn't add PCDIMM
> >> /memory@%"PRIx64"
> >>>> node\n",
> >>>>> +                        di->addr);
> >>>>> +                goto out;
> >>>>> +            }
> >>>>> +            break;
> >>>>> +        }
> >>>>> +        default:
> >>>>> +            fprintf(stderr, "%s memory nodes are not yet
> >> supported\n",
> >>>>> +                    MemoryDeviceInfoKind_str(mi->type));
> >>>>> +            ret = -ENOENT;
> >>>>> +            goto out;
> >>>>> +        }
> >>>>> +    }
> >>>>> +out:
> >>>>> +    qapi_free_MemoryDeviceInfoList(info_list);
> >>>>> +    return ret;
> >>>>> +}
> >>>>> +
> >>>>>  int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
> >>>>>                   hwaddr addr_limit, AddressSpace *as)
> >>>>>  {
> >>>>> @@ -621,6 +657,12 @@ int arm_load_dtb(hwaddr addr, const struct
> >>>> arm_boot_info *binfo,
> >>>>>          }
> >>>>>      }
> >>>>>
> >>>>> +    rc = fdt_add_hotpluggable_memory_nodes(fdt, acells, scells);
> >>>> According to Eric's test, guest kernel picks this up. So it probably
> >>>> should be an opt-in feature to avoid conflict with ACPI definition in DSDT.
> >>>
> >>> Ok. My take away from that discussion was that if we properly describe the
> >>> PNP0C80 (which is what #06 of this series does) then we don't have to
> worry
> >>> about DT entries as ACPI will "override" it.  But it looks like that is not the
> >> case
> >>> and describing DT will anyway cause the memory being end up in UEFI
> >>> GeTMemoryMap() and results in being used as normal memory early at
> boot.
> >>>
> >>> Hi Eric,
> >>>
> >>> How do we verify that this is actually happening? I tried running the
> >> /proc/meminfo
> >>> on a Qemu build upto #06 of this series, and it reported memory including
> the
> >>> cold plugged dimm memory.
> >>>
> >>> But not sure how to verify that this dimm mem is being treated as normal
> >> mem on
> >>> boot time or not? Please let me know.
> >>
> >> At the time I tested I did not have PNP0C80 build. I confirm that if you
> >> remove the dt description in ACPI mode, /proc/meminfo does not report
> >> the DIMMs. Now that you have #06, if you remove the DT  hotpluggables
> >> memory mode generation in ACPI mode, you should see them and if I
> >> understand correctly this is what you confirm. I have not tested
> >> anything else at the moment.
> >
> > Yes, that is what I confirmed. But the concern now is having DT memory node
> > generation will result in the problem described above - UEFI
> GetMemoryMap().
> Sorry I don't understand the stated problem. If you remove the call to
> fdt_add_hotpluggable_memory_nodes when running in ACPI mode,  does the
> above GetMemoryMap see the DIMMs?

That is what I am also trying to verify :). How do we verify the GetMemoryMap() sees
the DIMMs or not? As I said, I have tested it with patch upto #06(means no 
fdt_add_hotpluggable_memory_nodes) and checked /proc/meminfo which has
the dimm memory included in the total memory it reports.

But not sure how you will verify whether GetMemoryMap() see the dimm or not.

Thanks,
Shameer
 
> Thanks
> 
> Eric
> >
> > I was looking for a way to check that is a valid issue or not. I will try to look for
> > a way to verify that. Please update if you come across anything.
> >
> > Thanks,
> > Shameer
> >
> >> Thanks
> >>
> >> Eric
> >>>
> >>> Thanks,
> >>> Shameer
> >>>
> >>>
> >>>>> +    if (rc < 0) {
> >>>>> +        fprintf(stderr, "couldn't add hotpluggable memory nodes\n");
> >>>>> +        goto fail;
> >>>>> +    }
> >>>>> +
> >>>>>      rc = fdt_path_offset(fdt, "/chosen");
> >>>>>      if (rc < 0) {
> >>>>>          qemu_fdt_add_subnode(fdt, "/chosen");
> >>>
> >>>
Eric Auger March 13, 2019, 11:12 a.m. UTC | #7
Hi Shameer,

On 3/12/19 5:56 PM, Shameerali Kolothum Thodi wrote:
> Hi Eric,
> 
>> -----Original Message-----
>> From: Auger Eric [mailto:eric.auger@redhat.com]
>> Sent: 12 March 2019 16:48
>> To: Shameerali Kolothum Thodi <shameerali.kolothum.thodi@huawei.com>;
>> Igor Mammedov <imammedo@redhat.com>
>> Cc: peter.maydell@linaro.org; sameo@linux.intel.com;
>> shannon.zhaosl@gmail.com; qemu-devel@nongnu.org; Linuxarm
>> <linuxarm@huawei.com>; qemu-arm@nongnu.org; xuwei (O)
>> <xuwei5@huawei.com>; sebastien.boeuf@intel.com
>> Subject: Re: [Qemu-devel] [PATCH v2 08/11] hw/arm/boot: Expose the
>> PC-DIMM nodes in the DT
>>
>> Hi Shameer,
>>
>> On 3/12/19 5:39 PM, Shameerali Kolothum Thodi wrote:
>>>
>>>
>>>> -----Original Message-----
>>>> From: Auger Eric [mailto:eric.auger@redhat.com]
>>>> Sent: 12 March 2019 15:38
>>>> To: Shameerali Kolothum Thodi <shameerali.kolothum.thodi@huawei.com>;
>>>> Igor Mammedov <imammedo@redhat.com>
>>>> Cc: peter.maydell@linaro.org; sameo@linux.intel.com;
>>>> shannon.zhaosl@gmail.com; qemu-devel@nongnu.org; Linuxarm
>>>> <linuxarm@huawei.com>; qemu-arm@nongnu.org; xuwei (O)
>>>> <xuwei5@huawei.com>; sebastien.boeuf@intel.com
>>>> Subject: Re: [Qemu-devel] [PATCH v2 08/11] hw/arm/boot: Expose the
>>>> PC-DIMM nodes in the DT
>>>>
>>>> Hi Shameer,
>>>>
>>>> On 3/12/19 4:13 PM, Shameerali Kolothum Thodi wrote:
>>>>>
>>>>>
>>>>>> -----Original Message-----
>>>>>> From: Igor Mammedov [mailto:imammedo@redhat.com]
>>>>>> Sent: 11 March 2019 14:59
>>>>>> To: Shameerali Kolothum Thodi
>> <shameerali.kolothum.thodi@huawei.com>
>>>>>> Cc: qemu-devel@nongnu.org; qemu-arm@nongnu.org;
>>>>>> eric.auger@redhat.com; peter.maydell@linaro.org;
>>>>>> shannon.zhaosl@gmail.com; sameo@linux.intel.com;
>>>>>> sebastien.boeuf@intel.com; Linuxarm <linuxarm@huawei.com>; xuwei
>> (O)
>>>>>> <xuwei5@huawei.com>
>>>>>> Subject: Re: [PATCH v2 08/11] hw/arm/boot: Expose the PC-DIMM nodes
>> in
>>>> the
>>>>>> DT
>>>>>>
>>>>>> On Fri, 8 Mar 2019 11:42:15 +0000
>>>>>> Shameer Kolothum <shameerali.kolothum.thodi@huawei.com> wrote:
>>>>>>
>>>>>>> This patch adds memory nodes corresponding to PC-DIMM regions.
>>>>>>>
>>>>>>> NVDIMM and ACPI_NVDIMM configs are not yet set for ARM so we
>>>>>>> don't need to care about NVDIMM at this stage.
>>>>>>>
>>>>>>> Signed-off-by: Shameer Kolothum
>>>> <shameerali.kolothum.thodi@huawei.com>
>>>>>>> Signed-off-by: Eric Auger <eric.auger@redhat.com>
>>>>>>> ---
>>>>>>>  hw/arm/boot.c | 42
>> ++++++++++++++++++++++++++++++++++++++++++
>>>>>>>  1 file changed, 42 insertions(+)
>>>>>>>
>>>>>>> diff --git a/hw/arm/boot.c b/hw/arm/boot.c
>>>>>>> index a830655..4caaf91 100644
>>>>>>> --- a/hw/arm/boot.c
>>>>>>> +++ b/hw/arm/boot.c
>>>>>>> @@ -19,6 +19,7 @@
>>>>>>>  #include "sysemu/numa.h"
>>>>>>>  #include "hw/boards.h"
>>>>>>>  #include "hw/loader.h"
>>>>>>> +#include "hw/mem/memory-device.h"
>>>>>>>  #include "elf.h"
>>>>>>>  #include "sysemu/device_tree.h"
>>>>>>>  #include "qemu/config-file.h"
>>>>>>> @@ -522,6 +523,41 @@ static void fdt_add_psci_node(void *fdt)
>>>>>>>      qemu_fdt_setprop_cell(fdt, "/psci", "migrate", migrate_fn);
>>>>>>>  }
>>>>>>>
>>>>>>> +static int fdt_add_hotpluggable_memory_nodes(void *fdt,
>>>>>>> +                                             uint32_t acells,
>>>>>> uint32_t scells) {
>>>>>>> +    MemoryDeviceInfoList *info, *info_list =
>> qmp_memory_device_list();
>>>>>>> +    MemoryDeviceInfo *mi;
>>>>>>> +    int ret = 0;
>>>>>>> +
>>>>>>> +    for (info = info_list; info != NULL; info = info->next) {
>>>>>>> +        mi = info->value;
>>>>>>> +        switch (mi->type) {
>>>>>>> +        case MEMORY_DEVICE_INFO_KIND_DIMM:
>>>>>>> +        {
>>>>>>> +            PCDIMMDeviceInfo *di = mi->u.dimm.data;
>>>>>>> +
>>>>>>> +            ret = fdt_add_memory_node(fdt, acells, di->addr,
>>>>>>> +                                      scells, di->size,
>> di->node);
>>>>>>> +            if (ret) {
>>>>>>> +                fprintf(stderr,
>>>>>>> +                        "couldn't add PCDIMM
>>>> /memory@%"PRIx64"
>>>>>> node\n",
>>>>>>> +                        di->addr);
>>>>>>> +                goto out;
>>>>>>> +            }
>>>>>>> +            break;
>>>>>>> +        }
>>>>>>> +        default:
>>>>>>> +            fprintf(stderr, "%s memory nodes are not yet
>>>> supported\n",
>>>>>>> +                    MemoryDeviceInfoKind_str(mi->type));
>>>>>>> +            ret = -ENOENT;
>>>>>>> +            goto out;
>>>>>>> +        }
>>>>>>> +    }
>>>>>>> +out:
>>>>>>> +    qapi_free_MemoryDeviceInfoList(info_list);
>>>>>>> +    return ret;
>>>>>>> +}
>>>>>>> +
>>>>>>>  int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
>>>>>>>                   hwaddr addr_limit, AddressSpace *as)
>>>>>>>  {
>>>>>>> @@ -621,6 +657,12 @@ int arm_load_dtb(hwaddr addr, const struct
>>>>>> arm_boot_info *binfo,
>>>>>>>          }
>>>>>>>      }
>>>>>>>
>>>>>>> +    rc = fdt_add_hotpluggable_memory_nodes(fdt, acells, scells);
>>>>>> According to Eric's test, guest kernel picks this up. So it probably
>>>>>> should be an opt-in feature to avoid conflict with ACPI definition in DSDT.
>>>>>
>>>>> Ok. My take away from that discussion was that if we properly describe the
>>>>> PNP0C80 (which is what #06 of this series does) then we don't have to
>> worry
>>>>> about DT entries as ACPI will "override" it.  But it looks like that is not the
>>>> case
>>>>> and describing DT will anyway cause the memory being end up in UEFI
>>>>> GeTMemoryMap() and results in being used as normal memory early at
>> boot.
>>>>>
>>>>> Hi Eric,
>>>>>
>>>>> How do we verify that this is actually happening? I tried running the
>>>> /proc/meminfo
>>>>> on a Qemu build upto #06 of this series, and it reported memory including
>> the
>>>>> cold plugged dimm memory.
>>>>>
>>>>> But not sure how to verify that this dimm mem is being treated as normal
>>>> mem on
>>>>> boot time or not? Please let me know.
>>>>
>>>> At the time I tested I did not have PNP0C80 build. I confirm that if you
>>>> remove the dt description in ACPI mode, /proc/meminfo does not report
>>>> the DIMMs. Now that you have #06, if you remove the DT  hotpluggables
>>>> memory mode generation in ACPI mode, you should see them and if I
>>>> understand correctly this is what you confirm. I have not tested
>>>> anything else at the moment.
>>>
>>> Yes, that is what I confirmed. But the concern now is having DT memory node
>>> generation will result in the problem described above - UEFI
>> GetMemoryMap().
>> Sorry I don't understand the stated problem. If you remove the call to
>> fdt_add_hotpluggable_memory_nodes when running in ACPI mode,  does the
>> above GetMemoryMap see the DIMMs?
> 
> That is what I am also trying to verify :). How do we verify the GetMemoryMap() sees
> the DIMMs or not? As I said, I have tested it with patch upto #06(means no 
> fdt_add_hotpluggable_memory_nodes) and checked /proc/meminfo which has
> the dimm memory included in the total memory it reports.
> 
> But not sure how you will verify whether GetMemoryMap() see the dimm or not.
> 
> Thanks,
> Shameer
>  
>> Thanks
>>
>> Eric
>>>
>>> I was looking for a way to check that is a valid issue or not. I will try to look for
>>> a way to verify that. Please update if you come across anything.

OK I get it. Thank you for your patience! Maybe actual status can be
checked in /sys/devices/system/memory/memoryX/*?

Thanks

Eric
>>>
>>> Thanks,
>>> Shameer
>>>
>>>> Thanks
>>>>
>>>> Eric
>>>>>
>>>>> Thanks,
>>>>> Shameer
>>>>>
>>>>>
>>>>>>> +    if (rc < 0) {
>>>>>>> +        fprintf(stderr, "couldn't add hotpluggable memory nodes\n");
>>>>>>> +        goto fail;
>>>>>>> +    }
>>>>>>> +
>>>>>>>      rc = fdt_path_offset(fdt, "/chosen");
>>>>>>>      if (rc < 0) {
>>>>>>>          qemu_fdt_add_subnode(fdt, "/chosen");
>>>>>
>>>>>
diff mbox series

Patch

diff --git a/hw/arm/boot.c b/hw/arm/boot.c
index a830655..4caaf91 100644
--- a/hw/arm/boot.c
+++ b/hw/arm/boot.c
@@ -19,6 +19,7 @@ 
 #include "sysemu/numa.h"
 #include "hw/boards.h"
 #include "hw/loader.h"
+#include "hw/mem/memory-device.h"
 #include "elf.h"
 #include "sysemu/device_tree.h"
 #include "qemu/config-file.h"
@@ -522,6 +523,41 @@  static void fdt_add_psci_node(void *fdt)
     qemu_fdt_setprop_cell(fdt, "/psci", "migrate", migrate_fn);
 }
 
+static int fdt_add_hotpluggable_memory_nodes(void *fdt,
+                                             uint32_t acells, uint32_t scells) {
+    MemoryDeviceInfoList *info, *info_list = qmp_memory_device_list();
+    MemoryDeviceInfo *mi;
+    int ret = 0;
+
+    for (info = info_list; info != NULL; info = info->next) {
+        mi = info->value;
+        switch (mi->type) {
+        case MEMORY_DEVICE_INFO_KIND_DIMM:
+        {
+            PCDIMMDeviceInfo *di = mi->u.dimm.data;
+
+            ret = fdt_add_memory_node(fdt, acells, di->addr,
+                                      scells, di->size, di->node);
+            if (ret) {
+                fprintf(stderr,
+                        "couldn't add PCDIMM /memory@%"PRIx64" node\n",
+                        di->addr);
+                goto out;
+            }
+            break;
+        }
+        default:
+            fprintf(stderr, "%s memory nodes are not yet supported\n",
+                    MemoryDeviceInfoKind_str(mi->type));
+            ret = -ENOENT;
+            goto out;
+        }
+    }
+out:
+    qapi_free_MemoryDeviceInfoList(info_list);
+    return ret;
+}
+
 int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
                  hwaddr addr_limit, AddressSpace *as)
 {
@@ -621,6 +657,12 @@  int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
         }
     }
 
+    rc = fdt_add_hotpluggable_memory_nodes(fdt, acells, scells);
+    if (rc < 0) {
+        fprintf(stderr, "couldn't add hotpluggable memory nodes\n");
+        goto fail;
+    }
+
     rc = fdt_path_offset(fdt, "/chosen");
     if (rc < 0) {
         qemu_fdt_add_subnode(fdt, "/chosen");