lkml.org 
[lkml]   [2020]   [Apr]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v8 2/3] API to verify the STOP API and image compatibility
    Date
    From: Prem Shanker Jha <premjha2@in.ibm.com>

    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>
    Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/77614
    Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
    Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
    Reviewed-by: Daniel M Crowell <dcrowell@us.ibm.com>
    Signed-off-by: Pratik Rajesh Sampat <psampat@linux.ibm.com>
    ---
    include/p9_stop_api.H | 25 ++++++++++
    libpore/p9_cpu_reg_restore_instruction.H | 7 ++-
    libpore/p9_hcd_memmap_base.H | 7 +++
    libpore/p9_stop_api.C | 58 +++++++++++++++++++++++-
    libpore/p9_stop_api.H | 26 ++++++++++-
    libpore/p9_stop_util.H | 20 ++++----
    6 files changed, 130 insertions(+), 13 deletions(-)

    diff --git a/include/p9_stop_api.H b/include/p9_stop_api.H
    index 9d3bc1e5..cb5ffd6f 100644
    --- a/include/p9_stop_api.H
    +++ b/include/p9_stop_api.H
    @@ -107,6 +107,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;

    /**
    @@ -161,6 +162,14 @@ typedef enum

    } ScomSection_t;

    +/**
    + * @brief versions pertaining relvant to STOP API.
    + */
    +typedef enum
    +{
    + STOP_API_VER = 0x00,
    + STOP_API_VER_CONTROL = 0x02,
    +} VersionList_t;


    /**
    @@ -192,6 +201,14 @@ typedef enum
    BIT_POS_USPRG1 = 30,
    } SprBitPositionList_t;

    +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" {
    #endif
    @@ -230,6 +247,14 @@ StopReturnCode_t p9_stop_save_scom( void* const i_pImage,
    const ScomOperation_t i_operation,
    const ScomSection_t i_section );

    +/**
    + * @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
    diff --git a/libpore/p9_cpu_reg_restore_instruction.H b/libpore/p9_cpu_reg_restore_instruction.H
    index d69a4212..5f168855 100644
    --- a/libpore/p9_cpu_reg_restore_instruction.H
    +++ b/libpore/p9_cpu_reg_restore_instruction.H
    @@ -5,7 +5,7 @@
    /* */
    /* OpenPOWER HostBoot Project */
    /* */
    -/* Contributors Listed Below - COPYRIGHT 2015,2018 */
    +/* Contributors Listed Below - COPYRIGHT 2015,2020 */
    /* [+] International Business Machines Corp. */
    /* */
    /* */
    @@ -69,6 +69,11 @@ enum
    OPCODE_18 = 18,
    SELF_SAVE_FUNC_ADD = 0x2300,
    SELF_SAVE_OFFSET = 0x180,
    + SKIP_SPR_REST_INST = 0x4800001c, //b . +0x01c
    + MFLR_R30 = 0x7fc802a6,
    + SKIP_SPR_SELF_SAVE = 0x3bff0020, //addi r31 r31, 0x20
    + MTLR_INST = 0x7fc803a6, //mtlr r30
    + BRANCH_BE_INST = 0x48000020,
    };

    #define MR_R0_TO_R10 0x7c0a0378UL //mr r10 r0
    diff --git a/libpore/p9_hcd_memmap_base.H b/libpore/p9_hcd_memmap_base.H
    index 000fafef..ddb56728 100644
    --- a/libpore/p9_hcd_memmap_base.H
    +++ b/libpore/p9_hcd_memmap_base.H
    @@ -444,6 +444,13 @@ HCD_CONST(CME_QUAD_PSTATE_SIZE, HALF_KB)

    HCD_CONST(CME_REGION_SIZE, (64 * ONE_KB))

    +
    +// HOMER compatibility
    +
    +HCD_CONST(STOP_API_CPU_SAVE_VER, 0x02)
    +HCD_CONST(SELF_SAVE_RESTORE_VER, 0x02)
    +HCD_CONST(SMF_SUPPORT_SIGNATURE_OFFSET, 0x1300)
    +HCD_CONST(SMF_SELF_SIGNATURE, (0x5f534d46))
    // Debug

    HCD_CONST(CPMR_TRACE_REGION_OFFSET, (512 * ONE_KB))
    diff --git a/libpore/p9_stop_api.C b/libpore/p9_stop_api.C
    index 2d9bb549..10e050a1 100644
    --- a/libpore/p9_stop_api.C
    +++ b/libpore/p9_stop_api.C
    @@ -5,7 +5,7 @@
    /* */
    /* OpenPOWER HostBoot Project */
    /* */
    -/* Contributors Listed Below - COPYRIGHT 2015,2018 */
    +/* Contributors Listed Below - COPYRIGHT 2015,2020 */
    /* [+] International Business Machines Corp. */
    /* */
    /* */
    @@ -1828,6 +1828,62 @@ StopReturnCode_t proc_stop_init_self_save( void* const i_pImage, const uint32_t
    return l_rc;
    }

    +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;
    +}
    +
    #ifdef __cplusplus
    } //namespace stopImageSection ends

    diff --git a/libpore/p9_stop_api.H b/libpore/p9_stop_api.H
    index 3f6420ff..983a3845 100644
    --- a/libpore/p9_stop_api.H
    +++ b/libpore/p9_stop_api.H
    @@ -5,7 +5,7 @@
    /* */
    /* OpenPOWER HostBoot Project */
    /* */
    -/* Contributors Listed Below - COPYRIGHT 2015,2018 */
    +/* Contributors Listed Below - COPYRIGHT 2015,2020 */
    /* [+] International Business Machines Corp. */
    /* */
    /* */
    @@ -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;

    /**
    @@ -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" {
    @@ -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
    diff --git a/libpore/p9_stop_util.H b/libpore/p9_stop_util.H
    index 79b4e959..1328a54b 100644
    --- a/libpore/p9_stop_util.H
    +++ b/libpore/p9_stop_util.H
    @@ -72,18 +72,18 @@ namespace stopImageSection
    ( (((WORD) >> 8) & 0x00FF) | (((WORD) << 8) & 0xFF00) )

    #define SWIZZLE_4_BYTE(WORD) \
    - ( (((WORD) >> 24) & 0x000000FF) | (((WORD) >> 8) & 0x0000FF00) | \
    - (((WORD) << 8) & 0x00FF0000) | (((WORD) << 24) & 0xFF000000) )
    + ( (((WORD) & 0x000000FF) << 24) | (((WORD) & 0x0000FF00) << 8) | \
    + (((WORD) & 0x00FF0000) >> 8) | (((WORD) & 0xFF000000) >> 24) )

    #define SWIZZLE_8_BYTE(WORD) \
    - ( (((WORD) >> 56) & 0x00000000000000FF) | \
    - (((WORD) >> 40) & 0x000000000000FF00)| \
    - (((WORD) >> 24) & 0x0000000000FF0000) | \
    - (((WORD) >> 8) & 0x00000000FF000000) | \
    - (((WORD) << 8) & 0x000000FF00000000) | \
    - (((WORD) << 24) & 0x0000FF0000000000) | \
    - (((WORD) << 40) & 0x00FF000000000000) | \
    - (((WORD) << 56) & 0xFF00000000000000) )
    + ( (((WORD) & 0x00000000000000ffULL) << 56) | \
    + (((WORD) & 0x000000000000ff00ULL) << 40) | \
    + (((WORD) & 0x0000000000ff0000ULL) << 24) | \
    + (((WORD) & 0x00000000ff000000ULL) << 8) | \
    + (((WORD) & 0x000000ff00000000ULL) >> 8) | \
    + (((WORD) & 0x0000ff0000000000ULL) >> 24) | \
    + (((WORD) & 0x00ff000000000000ULL) >> 40) | \
    + (((WORD) & 0xff00000000000000ULL) >> 56) )
    #endif

    /**
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-04-23 12:55    [W:4.279 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site