summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C')
-rw-r--r--src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C b/src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C
index c408c1dd8..26b86098c 100644
--- a/src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C
+++ b/src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C
@@ -144,6 +144,8 @@ enum
CORE_REST_WORDS_PER_THREAD = (CORE_RESTORE_SIZE_PER_THREAD >> 2),
TWO_MB_ALIGNMENT_CHECK = 0x1FFFFF,
SMF_BIT_CHECK = 0x0001000000000000ull,
+ INST_VALUE_SC2 = 0x44400042,
+ SRESET_WORD_POS = 0x40,
};
/**
@@ -4797,6 +4799,14 @@ fapi_try_exit:
//---------------------------------------------------------------------------
+/**
+ * @brief populates CME image header with base address of unsecure HOMER.
+ * @param[in] i_procTgt fapi2 target for P9 chip
+ * @param[in] i_pHomer points to HOMER
+ * @return fapi2 return code
+ * @note: initializes CME image header irrespective of SMF enable state for
+ * simplicity. It will be a behave as NOP for SMF disabled system.
+ */
fapi2::ReturnCode populateUnsecureHomerAddress( CONST_FAPI2_PROC& i_procTgt, Homerlayout_t* i_pHomer )
{
uint64_t l_unsecureHomerAdd = 0;
@@ -4809,6 +4819,7 @@ fapi2::ReturnCode populateUnsecureHomerAddress( CONST_FAPI2_PROC& i_procTgt, Hom
i_procTgt,
l_unsecureHomerAdd),
"Error from FAPI_ATTR_GET for attribute ATTR_UNSECURE_HOMER_ADDRESS");
+
FAPI_INF( "Atrribute ATTR_UNSECURE_HOMER_ADDRESS 0x%016lx", l_unsecureHomerAdd );
if( l_unsecureHomerAdd & 0x1fffff )
@@ -4834,6 +4845,56 @@ fapi2::ReturnCode populateUnsecureHomerAddress( CONST_FAPI2_PROC& i_procTgt, Hom
//--------------------------------------------------------------------------------------------------------
+/**
+ * @brief initializes temp buffer with special attn and sc2 instruction.
+ * @param[in] i_pBuf2 points to temp buffer
+ * @param[in] i_sizeBuf2 size of temp buffer
+ * @return fapi2 return code
+ * @note: initializes buffer irrespective of SMF enable state for simplicity.
+ * It will behave as NOP for SMF disabled systems.
+ */
+fapi2::ReturnCode initUnsecureHomer( void* const i_pBuf2, const uint32_t i_sizeBuf2 )
+{
+ FAPI_DBG( ">> initUnsecureHomer" );
+ const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM;
+ uint32_t l_unsecureHomerSize = ONE_KB;
+ uint32_t l_attr_unsecureHomerSize;
+ uint32_t * l_pWord = (uint32_t *) i_pBuf2;
+ uint32_t l_initInst = SWIZZLE_4_BYTE(CORE_RESTORE_PAD_OPCODE);
+
+
+ FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_UNSECURE_HOMER_SIZE,
+ FAPI_SYSTEM,
+ l_attr_unsecureHomerSize),
+ "Error from FAPI_ATTR_GET for attribute ATTR_UNSECURE_HOMER_SIZE" );
+
+ FAPI_ASSERT( ( i_sizeBuf2 >= l_unsecureHomerSize &&
+ l_attr_unsecureHomerSize >= l_unsecureHomerSize ),
+ fapi2::FAILED_TO_INIT_UNSECURE_HOMER()
+ .set_UNSECURE_HOMER_MIN_SIZE( l_unsecureHomerSize )
+ .set_UNSECURE_HOMER_ACTUAL_SIZE( l_attr_unsecureHomerSize )
+ .set_TEMP_BUFFER_SIZE( i_sizeBuf2 ),
+ "Bad size value for unsecure HOMER attr=0x%08x min=0x%08x buf=0x%08x",
+ l_attr_unsecureHomerSize, l_unsecureHomerSize, i_sizeBuf2 );
+
+
+ l_unsecureHomerSize = (l_unsecureHomerSize >> 2);
+
+ for( size_t wordCnt = 0; wordCnt < l_unsecureHomerSize; wordCnt++ )
+ {
+ memcpy( l_pWord + wordCnt, &l_initInst, sizeof(uint32_t) );
+ }
+
+ l_initInst = INST_VALUE_SC2;
+ memcpy( l_pWord + SRESET_WORD_POS, &l_initInst, sizeof(uint32_t) );
+
+ fapi_try_exit:
+ FAPI_DBG( "<< initUnsecureHomer" );
+ return fapi2::current_err;
+}
+
+//--------------------------------------------------------------------------------------------------------
+
fapi2::ReturnCode p9_hcode_image_build( CONST_FAPI2_PROC& i_procTgt,
void* const i_pImageIn,
void* i_pHomerImage,
@@ -5068,6 +5129,9 @@ fapi2::ReturnCode p9_hcode_image_build( CONST_FAPI2_PROC& i_procTgt,
FAPI_TRY( verifySprSelfSave( i_pHomerImage, fuseModeState, l_chipFuncModel ),
"Failed to create SPR self save restore entry" );
+ FAPI_TRY( initUnsecureHomer( i_pBuf2, i_sizeBuf2 ),
+ "Failed to initialize unsecure HOMER" );
+
fapi_try_exit:
FAPI_IMP("<< p9_hcode_image_build" );
return fapi2::current_err;
OpenPOWER on IntegriCloud