Skip to content

Commit

Permalink
STOP API: API to verify API and image compatibility.
Browse files Browse the repository at this point in the history
Commit defines a new API primarily intended for OPAL to determine
cpu register save API's compatibility with HOMER layout and
self save restore. It can help OPAL determine if version of
API integrated with OPAL is different from hostboot.

Change-Id: Ic0de45a336cfb8b6b6096a10ac1cd3ffbaa44fc0
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/77612
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com>
Reviewed-by: RANGANATHPRASAD G. BRAHMASAMUDRA <prasadbgr@in.ibm.com>
Reviewed-by: Gregory S Still <stillgs@us.ibm.com>
Reviewed-by: Jennifer A Stofer <stofer@us.ibm.com>
  • Loading branch information
premsjha authored and op-jenkins committed Jan 9, 2020
1 parent 4d14a3d commit b3180c3
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HCODE Project */
/* */
/* COPYRIGHT 2015,2018 */
/* COPYRIGHT 2015,2020 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -76,7 +76,8 @@ enum
SKIP_SPR_REST_INST = 0x4800001c, //b . +0x01c
MFLR_R30 = 0x7fc802a6,
SKIP_SPR_SELF_SAVE = 0x3bff0020, //addi r31 r31, 0x20
MTLR_INST = 0x7fc803a6 //mtlr r30
MTLR_INST = 0x7fc803a6, //mtlr r30
BRANCH_BE_INST = 0x48000020,
};

#ifdef __cplusplus
Expand Down
65 changes: 63 additions & 2 deletions import/chips/p9/procedures/utils/stopreg/p9_stop_api.C
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HCODE Project */
/* */
/* COPYRIGHT 2015,2019 */
/* COPYRIGHT 2015,2020 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -1829,7 +1829,68 @@ StopReturnCode_t proc_stop_init_self_save( void* const i_pImage, const uint32_t
}

//-----------------------------------------------------------------------------------------------------

StopReturnCode_t proc_stop_api_discover_capability( void* const i_pImage, uint64_t * o_inCompVector )
{
StopReturnCode_t l_rc = STOP_SAVE_SUCCESS;
uint64_t l_incompVector = 0;
uint32_t l_tempWord = 0;
*o_inCompVector = 0;

do
{
if( !i_pImage )
{
l_rc = STOP_SAVE_ARG_INVALID_IMG;
break;
}

l_tempWord =
*(uint32_t*)((uint8_t*)i_pImage + CPMR_HOMER_OFFSET + SMF_SUPPORT_SIGNATURE_OFFSET);

if( l_tempWord != SWIZZLE_4_BYTE(SMF_SELF_SIGNATURE) )
{
l_incompVector |= SMF_SUPPORT_MISSING_IN_HOMER;
}

l_tempWord = *(uint32_t *)((uint8_t *)i_pImage + CPMR_HOMER_OFFSET + CPMR_HEADER_SIZE );

if( l_tempWord != SWIZZLE_4_BYTE(BRANCH_BE_INST) )
{
l_incompVector |= SELF_SUPPORT_MISSING_FOR_LE_HYP;
}

l_tempWord = *(uint8_t *)((uint8_t *)i_pImage + CPMR_HOMER_OFFSET + CPMR_SELF_RESTORE_VER_BYTE );

if( l_tempWord < SELF_SAVE_RESTORE_VER )
{
l_incompVector |= SELF_RESTORE_VER_MISMATCH;
}

l_tempWord = *(uint8_t *)((uint8_t *)i_pImage + CPMR_HOMER_OFFSET + CPMR_STOP_API_VER_BYTE );

if( l_tempWord < STOP_API_CPU_SAVE_VER )
{
l_incompVector |= IPL_RUNTIME_CPU_SAVE_VER_MISMATCH;
}

*o_inCompVector = l_incompVector;

if( l_incompVector )
{
l_rc = STOP_SAVE_API_IMG_INCOMPATIBLE;
}

}while(0);

return l_rc;
}

} //extern "C"

#ifdef __cplusplus
} //namespace stopImageSection ends
} //extern "C"

//-----------------------------------------------------------------------------------------------------

#endif
26 changes: 25 additions & 1 deletion import/chips/p9/procedures/utils/stopreg/p9_stop_api.H
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HCODE Project */
/* */
/* COPYRIGHT 2015,2019 */
/* COPYRIGHT 2015,2020 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -114,6 +114,7 @@ typedef enum
STOP_SAVE_FAIL = 14, // for internal failure within firmware.
STOP_SAVE_SPR_ENTRY_MISSING = 15,
STOP_SAVE_SPR_BIT_POS_RESERVE = 16,
STOP_SAVE_API_IMG_INCOMPATIBLE = 18,
} StopReturnCode_t;

/**
Expand Down Expand Up @@ -198,6 +199,21 @@ typedef enum
BIT_POS_USPRG1 = 30,
} SprBitPositionList_t;

/**
* @brief List of major incompatibilities between API version.
* @note STOP APIs assumes a specific HOMER layout, certain
* level of CME-SGPE hcode and certain version of self-save restore
* binary. A mismatch can break STOP function.
*/

typedef enum
{
SMF_SUPPORT_MISSING_IN_HOMER = 0x01,
SELF_SUPPORT_MISSING_FOR_LE_HYP = 0x02,
IPL_RUNTIME_CPU_SAVE_VER_MISMATCH = 0x04,
SELF_RESTORE_VER_MISMATCH = 0x08,
} VersionIncompList_t;


#ifdef __cplusplus
extern "C" {
Expand Down Expand Up @@ -341,6 +357,14 @@ StopReturnCode_t proc_stop_save_cpureg( void* const i_pImage,
*/
StopReturnCode_t proc_stop_init_self_save( void* const i_pImage, const uint32_t i_corePos );

/**
* @brief verifies if API is compatible of current HOMER image.
* @param[in] i_pImage points to the start of HOMER image of P9 chip.
* @param[out] o_inCompVector list of incompatibilities found.
* @return STOP_SAVE_SUCCESS if if API succeeds, error code otherwise.
*/
StopReturnCode_t proc_stop_api_discover_capability( void* const i_pImage, uint64_t* o_inCompVector );

#ifdef __cplusplus
} // extern "C"
}; // namespace stopImageSection ends
Expand Down

0 comments on commit b3180c3

Please sign in to comment.