[Skiboot] [PATCH v2 09/12] hdat: Parse hostboot memory reservations from HDAT
Stewart Smith
stewart at linux.vnet.ibm.com
Tue Dec 20 17:22:12 AEDT 2016
Vasant Hegde <hegdevasant at linux.vnet.ibm.com> writes:
> Hostboot reserves some memory and passes via HDAT. This patch
> adds code to parse node reservation details and marks it as
> REGION_HW_RESERVED. Later mem_region_add_dt_reserved() populates
> DT entry.
>
> Signed-off-by: Vasant Hegde <hegdevasant at linux.vnet.ibm.com>
> ---
> hdata/memory.c | 38 ++++++++++++++++++++++++++++++++++++++
> hdata/test/stubs.c | 1 +
> 2 files changed, 39 insertions(+)
>
> diff --git a/hdata/memory.c b/hdata/memory.c
> index a8b9955..aade3be 100644
> --- a/hdata/memory.c
> +++ b/hdata/memory.c
> @@ -19,6 +19,7 @@
> #include <vpd.h>
> #include <ccan/str/str.h>
> #include <libfdt/libfdt.h>
> +#include <mem_region.h>
> #include <types.h>
>
> #include "spira.h"
> @@ -383,6 +384,41 @@ static void get_msareas(struct dt_node *root,
> }
> }
>
> +static void get_hb_reserved_mem(struct HDIF_common_hdr *ms_vpd)
> +{
> + char *label;
> + int count, i;
> + uint64_t len;
> + const struct msvpd_hb_reserved_mem *hb_resv_mem;
> +
> + if (proc_gen < proc_gen_p9)
> + return;
> +
> + count = HDIF_get_iarray_size(ms_vpd, MSVPD_IDATA_HB_RESERVED_MEM);
> + if (count <= 0) {
> + prerror("MS VPD: No hostboot reserved memory found\n");
> + return;
> + }
> +
> + for (i = 0; i < count; i++) {
> + hb_resv_mem = HDIF_get_iarray_item(ms_vpd,
> + MSVPD_IDATA_HB_RESERVED_MEM,
> + i, NULL);
> + if (!CHECK_SPPTR(hb_resv_mem))
> + continue;
> +
> + label = zalloc(be32_to_cpu(hb_resv_mem->label_size) + 1);
> + assert(label);
> + memcpy(label, hb_resv_mem->label,
> + be32_to_cpu(hb_resv_mem->label_size));
Could you also check the sanity of label_size ? We know it's <=64 (or
<64 - it'd be good to get clarification on this, or check the spec that
for such strings they *are* null terminated).
> + len = be64_to_cpu(hb_resv_mem->end_addr) -
> + be64_to_cpu(hb_resv_mem->start_addr);
> + mem_reserve_hw(label,
> + be64_to_cpu(hb_resv_mem->start_addr), len);
> + free(label);
> + }
> +}
> +
> static bool __memory_parse(struct dt_node *root)
> {
> struct HDIF_common_hdr *ms_vpd;
> @@ -431,6 +467,8 @@ static bool __memory_parse(struct dt_node *root)
>
> get_msareas(root, ms_vpd);
>
> + get_hb_reserved_mem(ms_vpd);
> +
> prlog(PR_INFO, "MS VPD: Total MB of RAM: 0x%llx\n",
> (long long)be64_to_cpu(tcms->total_in_mb));
>
> diff --git a/hdata/test/stubs.c b/hdata/test/stubs.c
> index 9687b31..735813f 100644
> --- a/hdata/test/stubs.c
> +++ b/hdata/test/stubs.c
Speaking of tests - any outlook on some test HDAT to check this new
code? I'd prefer to hold off merging until we have a HDAT dump to test
with.
--
Stewart Smith
OPAL Architect, IBM.
More information about the Skiboot
mailing list