diff mbox

[v2,09/12] hdat: Parse hostboot memory reservations from HDAT

Message ID 1477751795-20128-10-git-send-email-hegdevasant@linux.vnet.ibm.com
State Changes Requested
Headers show

Commit Message

Vasant Hegde Oct. 29, 2016, 2:36 p.m. UTC
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(+)

Comments

Stewart Smith Dec. 20, 2016, 6:22 a.m. UTC | #1
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.
Vasant Hegde Jan. 5, 2017, 5:57 a.m. UTC | #2
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 mbox

Patch

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);