Message ID | 1477751795-20128-10-git-send-email-hegdevasant@linux.vnet.ibm.com |
---|---|
State | Changes Requested |
Headers | show |
Vasant Hegde <hegdevasant@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@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.
On 12/20/2016 11:52 AM, Stewart Smith wrote: > Vasant Hegde <hegdevasant@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@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 Yes. will fix in next iteration. > <64 - it'd be good to get clarification on this, or check the spec that > for such strings they *are* null terminated). Spec doesn't explicitly mention about ending with NULL char. Hence I assume its <= 64. Anyway I will cross check with Venkatesh. > >> + 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. Sure. I will try to grab HDAT dump and post it . So that we will have sample to compare with. -Vasant >
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)); + 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 @@ -49,3 +49,4 @@ STUB(op_display); STUB(fsp_preload_lid); STUB(fsp_wait_lid_loaded); STUB(fsp_adjust_lid_side); +STUB(mem_reserve_hw);
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@linux.vnet.ibm.com> --- hdata/memory.c | 38 ++++++++++++++++++++++++++++++++++++++ hdata/test/stubs.c | 1 + 2 files changed, 39 insertions(+)