summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/xip
diff options
context:
space:
mode:
authorMartin Peschke <mpeschke@de.ibm.com>2017-05-11 08:10:35 +0200
committerSachin Gupta <sgupta2m@in.ibm.com>2017-05-25 00:28:47 -0400
commit9ad3454eb398c34465725c6799a210262d80c376 (patch)
tree4fc0b1e8a263fa200eede7621f1e37458f40e73f /src/import/chips/p9/xip
parent157dc75ec016e311b528d616f408652db024c775 (diff)
downloadtalos-sbe-9ad3454eb398c34465725c6799a210262d80c376.tar.gz
talos-sbe-9ad3454eb398c34465725c6799a210262d80c376.zip
H-code ddLevel support: Bridging front-end to back-end.
Further add a small update to xip_image.C to clear the ddSupport field in XipSection upon deleting a section. Change-Id: I5a0aa28ac209d8d31a1e30a75389910da366c5f6 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/40046 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: PPE CI <ppe-ci+hostboot@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: Richard J. Knight <rjknight@us.ibm.com> Reviewed-by: Prem Shanker Jha <premjha2@in.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/40476 Reviewed-by: Hostboot Team <hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Sachin Gupta <sgupta2m@in.ibm.com>
Diffstat (limited to 'src/import/chips/p9/xip')
-rw-r--r--src/import/chips/p9/xip/p9_xip_image.C84
-rw-r--r--src/import/chips/p9/xip/p9_xip_image.h8
2 files changed, 81 insertions, 11 deletions
diff --git a/src/import/chips/p9/xip/p9_xip_image.C b/src/import/chips/p9/xip/p9_xip_image.C
index 96e83c67..f12fc26e 100644
--- a/src/import/chips/p9/xip/p9_xip_image.C
+++ b/src/import/chips/p9/xip/p9_xip_image.C
@@ -44,6 +44,9 @@
#else
#include <stdint.h>
#include <endian.h>
+ #ifndef __PPE__
+ #include "p9_dd_container.h"
+ #endif
#endif
#include <stdlib.h>
#include <string.h>
@@ -555,6 +558,25 @@ xipSetSectionSize(void* io_image, const int i_section, const uint32_t i_size)
}
+/// Set the properties of a section
+//
+XIP_STATIC int
+xipSetSectionProps(void* io_image, const int i_section, const uint8_t i_props)
+{
+ P9XipSection* section;
+ int rc;
+
+ rc = xipGetSectionPointer(io_image, i_section, &section);
+
+ if (!rc)
+ {
+ section->iv_ddSupport = i_props;
+ }
+
+ return rc;
+}
+
+
/// Translate a IMAGE address in the image to a section and offset
// We first check to be sure that the IMAGE address is contained in the image,
@@ -650,7 +672,7 @@ xipDeleteLastSection(void* io_image,
xipSetSectionOffset(io_image, i_sectionId, 0);
xipSetSectionSize(io_image, i_sectionId, 0);
-
+ xipSetSectionProps(io_image, i_sectionId, 0);
// For cleanliness we also remove any alignment padding that had been
// appended between the now-last section and the deleted section, then
@@ -2004,7 +2026,7 @@ p9_xip_image_size(void* io_image, uint32_t* o_size)
}
-#ifdef __PPE__
+#if defined(__PPE__) || defined(WIN32)
int
p9_xip_get_section(const void* i_image,
const int i_sectionId,
@@ -2031,14 +2053,9 @@ p9_xip_get_section(const void* i_image,
P9XipSection* o_hostSection,
const uint8_t i_ddLevel)
{
- int rc;
+ int rc = 0;
P9XipSection* imageSection;
- if (i_ddLevel != P9_XIP_UNDEFINED_DDLEVEL)
- {
- return P9_XIP_NO_DDLEVEL_SUPPORT;
- }
-
rc = xipGetSectionPointer(i_image, i_sectionId, &imageSection);
if (!rc)
@@ -2046,6 +2063,55 @@ p9_xip_get_section(const void* i_image,
xipTranslateSection(o_hostSection, imageSection);
}
+ if (i_ddLevel == P9_XIP_UNDEFINED_DDLEVEL)
+ {
+ //Here we always return the entire XIP section. Nothing more to do.
+ }
+ else if (o_hostSection->iv_ddSupport == 1)
+ {
+ uint8_t* buf;
+ uint32_t size;
+ rc = p9_dd_get( (uint8_t*)i_image + o_hostSection->iv_offset,
+ i_ddLevel,
+ &buf,
+ &size );
+
+ if (!rc)
+ {
+ o_hostSection->iv_offset = (uint32_t)(buf - (uint8_t*)i_image);
+ o_hostSection->iv_size = size;
+ o_hostSection->iv_alignment = 0;
+ o_hostSection->iv_ddSupport = 0;
+ //@FIXME: In order to inform caller more clearly, we could do this instead
+ // where the idea is to clear the DD support flag which no longer
+ // applies and to clear the flag that indicates this section is no
+ // longer the full/original XIP section.
+ //o_hostSection->iv_support = o_hostSection->iv_support & ~SECTION_ATTRIBS_DD_SUPP
+ //o_hostSection->iv_support = o_hostSection->iv_support & ~SECTION_ATTRIBS_XIP_SECTION
+ }
+ else
+ {
+ switch (rc)
+ {
+ case P9_DD_FAILURE_NOT_FOUND:
+ rc = P9_XIP_DDLEVEL_NOT_FOUND;
+ break;
+
+ case P9_DD_FAILURE_DOES_NOT_EXIST:
+ rc = P9_XIP_NULL_BUFFER;
+ break;
+
+ case P9_DD_FAILURE_BROKEN:
+ rc = P9_XIP_NO_DDLEVEL_SUPPORT;
+ break;
+
+ default:
+ rc = P9_XIP_DDLEVEL_CODE_BUG;
+ break;
+ }
+ }
+ }
+
return rc;
}
#endif
@@ -3188,7 +3254,7 @@ p9_xip_map_toc(void* io_image,
}
-#ifndef __PPE__
+#if !defined(__PPE__) && !defined(WIN32)
//
// Inform caller if specified sectionId has DD support
//
diff --git a/src/import/chips/p9/xip/p9_xip_image.h b/src/import/chips/p9/xip/p9_xip_image.h
index 484ce5a8..924acfa8 100644
--- a/src/import/chips/p9/xip/p9_xip_image.h
+++ b/src/import/chips/p9/xip/p9_xip_image.h
@@ -699,7 +699,7 @@ p9_xip_image_size(void* i_image, uint32_t* o_size);
int
p9_xip_get_section(const void* i_image,
const int i_sectionId,
-#ifdef __PPE__
+#if defined(__PPE__) || defined(WIN32)
P9XipSection* o_hostSection);
#else
P9XipSection* o_hostSection,
@@ -1380,7 +1380,7 @@ p9_xip_get_toc(void* i_image,
/// \retval 0 Success
///
/// \retval non-0 See \ref p9_xip_image_errors
-#ifndef __PPE__
+#if !defined(__PPE__) && !defined(WIN32)
int
p9_xip_dd_section_support(const void* i_image,
const int i_sectionId,
@@ -1504,6 +1504,9 @@ p9_xip_decode_toc_dump(void* i_image, void* i_dump,
/// Specified ddLevel was not found in section
#define P9_XIP_DDLEVEL_NOT_FOUND 21
+/// Code bug in the ddLevel handling codes
+#define P9_XIP_DDLEVEL_CODE_BUG 22
+
/// Applications can expand this macro to declare an array of string forms of
/// the error codes if desired.
#define P9_XIP_ERROR_STRINGS(var) \
@@ -1530,6 +1533,7 @@ p9_xip_decode_toc_dump(void* i_image, void* i_dump,
"P9_XIP_SBE_DD_SIZE_ERR", \
"P9_XIP_NO_DDLEVEL_SUPPORT", \
"P9_XIP_DDLEVEL_NOT_FOUND", \
+ "P9_XIP_DDLEVEL_CODE_BUG", \
}
/// Applications can use this macro to safely index the array of error
OpenPOWER on IntegriCloud