diff options
Diffstat (limited to 'src')
5 files changed, 2831 insertions, 2743 deletions
diff --git a/src/build/citest/etc/workarounds.postsimsetup b/src/build/citest/etc/workarounds.postsimsetup index af86463f9..ac21ab399 100755 --- a/src/build/citest/etc/workarounds.postsimsetup +++ b/src/build/citest/etc/workarounds.postsimsetup @@ -34,3 +34,7 @@ #cp $BACKING_BUILD/src/simu/data/cec-chip/base_cec_chip_file $sb/simu/data/cec-chip #patch -p0 $sb/simu/data/cec-chip/base_cec_chip_file $PROJECT_ROOT/src/build/citest/etc/patches/my_patch_File +#Need a newer HW image due to some co-reqs, pull in hw022817a.910 +sbex -t 1018118 +cd $sb/engd/href/ +mk -a -k 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 49959dd34..cdecdd7c9 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 @@ -60,11 +60,11 @@ using namespace stopImageSection; extern "C" { -/** - * @brief aligns DATA_SIZE to 8B. - * @param TEMP_LEN temp storage - * @param DATA_SIZE size to be aligned. Aligned size is saved in same variable. - */ + /** + * @brief aligns DATA_SIZE to 8B. + * @param TEMP_LEN temp storage + * @param DATA_SIZE size to be aligned. Aligned size is saved in same variable. + */ #define ALIGN_DWORD(TEMP_LEN, DATA_SIZE) \ {TEMP_LEN = (DATA_SIZE % RING_ALIGN_BOUNDARY); \ if( TEMP_LEN ) \ @@ -73,11 +73,11 @@ extern "C" } \ } -/** - * @brief aligns start of scan ring to 8B boundary. - * @param RING_REGION_BASE start location of scan ring region in HOMER. - * @param RING_LOC start of scan ring. - */ + /** + * @brief aligns start of scan ring to 8B boundary. + * @param RING_REGION_BASE start location of scan ring region in HOMER. + * @param RING_LOC start of scan ring. + */ #define ALIGN_RING_LOC(RING_REGION_BASE, RING_LOC) \ { \ uint8_t tempDiff = \ @@ -88,9 +88,9 @@ extern "C" } \ } -/** - * @brief round of ring size to multiple of 32B - */ + /** + * @brief round of ring size to multiple of 32B + */ #define ROUND_OFF_32B( ROUND_SIZE) \ { \ uint32_t tempSize = ROUND_SIZE; \ @@ -99,210 +99,290 @@ extern "C" ROUND_SIZE = (( ( tempSize + 31 )/32 ) * 32 ); \ } \ } -namespace p9_hcodeImageBuild -{ + namespace p9_hcodeImageBuild + { -/** - * @brief some misc local constants - */ -enum -{ - ENABLE_ALL_CORE = 0x000FFFF, - RISK_LEVEL = 0x01, - QUAD_COMMON_RING_INDEX_SIZE = sizeof(QuadCmnRingsList_t), - QUAD_SPEC_RING_INDEX_SIZE = ((sizeof(QuadSpecRingsList_t)) / sizeof(uint16_t)), - QUAD_SPEC_RING_INDEX_LEN = (QUAD_SPEC_RING_INDEX_SIZE * 2 * MAX_QUADS_PER_CHIP), - CORE_COMMON_RING_INDEX_SIZE = sizeof(CoreCmnRingsList_t), - CORE_SPEC_RING_INDEX_SIZE = sizeof(CoreSpecRingList_t), - RING_START_TO_RS4_OFFSET = 8, - TOR_VER_ONE = 1, - TOR_VER_TWO = 2, - QUAD_BIT_POS = 24, - ODD_EVEN_EX_POS = 0x00000400, -}; - -/** - * @brief struct used to manipulate scan ring in HOMER. - */ -struct RingBufData -{ - void* iv_pRingBuffer; - uint32_t iv_ringBufSize; - void* iv_pWorkBuf1; - uint32_t iv_sizeWorkBuf1; - void* iv_pWorkBuf2; - uint32_t iv_sizeWorkBuf2; - - RingBufData( void* i_pRingBuf1, const uint32_t i_ringSize, - void* i_pWorkBuf1, const uint32_t i_sizeWorkBuf1, - void* i_pWorkBuf2, const uint32_t i_sizeWorkBuf2 ) : - iv_pRingBuffer( i_pRingBuf1), - iv_ringBufSize(i_ringSize), - iv_pWorkBuf1( i_pWorkBuf1 ), - iv_sizeWorkBuf1( i_sizeWorkBuf1 ), - iv_pWorkBuf2( i_pWorkBuf2 ), - iv_sizeWorkBuf2( i_sizeWorkBuf2 ) - - {} - - RingBufData(): - iv_pRingBuffer( NULL ), - iv_ringBufSize( 0 ), - iv_pWorkBuf1( NULL ), - iv_sizeWorkBuf1( 0 ), - iv_pWorkBuf2( NULL ), - iv_sizeWorkBuf2( 0 ) - { } -}; - -/** - * @brief models a section in HOMER. - */ -struct ImgSec -{ - PlatId iv_plat; - uint8_t iv_secId; - ImgSec( PlatId i_plat, uint8_t i_secId ): - iv_plat( i_plat ), - iv_secId( i_secId ) - { } - ImgSec(): iv_plat (PLAT_SELF), iv_secId (0 ) - { } -}; - -/** - * @brief operator < overloading for ImgSec. - */ -bool operator < ( const ImgSec& i_lhs, const ImgSec& i_rhs ) -{ - if( i_lhs.iv_plat == i_rhs.iv_plat ) + /** + * @brief some misc local constants + */ + enum { - return i_lhs.iv_secId < i_rhs.iv_secId; - } - else + ENABLE_ALL_CORE = 0x000FFFF, + RISK_LEVEL = 0x01, + QUAD_COMMON_RING_INDEX_SIZE = sizeof(QuadCmnRingsList_t), + QUAD_SPEC_RING_INDEX_SIZE = ((sizeof(QuadSpecRingsList_t)) / sizeof(uint16_t)), + QUAD_SPEC_RING_INDEX_LEN = (QUAD_SPEC_RING_INDEX_SIZE * 2 * MAX_QUADS_PER_CHIP), + CORE_COMMON_RING_INDEX_SIZE = sizeof(CoreCmnRingsList_t), + CORE_SPEC_RING_INDEX_SIZE = sizeof(CoreSpecRingList_t), + RING_START_TO_RS4_OFFSET = 8, + TOR_VER_ONE = 1, + TOR_VER_TWO = 2, + QUAD_BIT_POS = 24, + ODD_EVEN_EX_POS = 0x00000400, + SECTN_NAME_MAX_LEN = 20, + CME_SRAM_IMAGE = P9_XIP_SECTIONS + 1, + SGPE_SRAM_IMAGE = P9_XIP_SECTIONS + 2, + PGPE_SRAM_IMAGE = P9_XIP_SECTIONS + 3, + }; + + /** + * @brief struct used to manipulate scan ring in HOMER. + */ + struct RingBufData { - return i_lhs.iv_plat < i_rhs.iv_plat; - } -} + void* iv_pRingBuffer; + uint32_t iv_ringBufSize; + void* iv_pWorkBuf1; + uint32_t iv_sizeWorkBuf1; + void* iv_pWorkBuf2; + uint32_t iv_sizeWorkBuf2; + + RingBufData( void* i_pRingBuf1, const uint32_t i_ringSize, + void* i_pWorkBuf1, const uint32_t i_sizeWorkBuf1, + void* i_pWorkBuf2, const uint32_t i_sizeWorkBuf2 ) : + iv_pRingBuffer( i_pRingBuf1), + iv_ringBufSize(i_ringSize), + iv_pWorkBuf1( i_pWorkBuf1 ), + iv_sizeWorkBuf1( i_sizeWorkBuf1 ), + iv_pWorkBuf2( i_pWorkBuf2 ), + iv_sizeWorkBuf2( i_sizeWorkBuf2 ) + + {} + + RingBufData(): + iv_pRingBuffer( NULL ), + iv_ringBufSize( 0 ), + iv_pWorkBuf1( NULL ), + iv_sizeWorkBuf1( 0 ), + iv_pWorkBuf2( NULL ), + iv_sizeWorkBuf2( 0 ) + { } + }; -/** - * @brief operator == overloading for ImgSec. - */ -bool operator == ( const ImgSec& i_lhs, const ImgSec& i_rhs ) -{ - bool equal = false; + /** + * @brief models a section in HOMER. + */ + struct ImgSec + { + PlatId iv_plat; + uint8_t iv_secId; + char iv_secName[SECTN_NAME_MAX_LEN]; + ImgSec( PlatId i_plat, uint8_t i_secId, char* i_secName ): + iv_plat( i_plat ), + iv_secId( i_secId ) + { + memset( iv_secName, 0x00, SECTN_NAME_MAX_LEN ); + uint8_t secLength = strlen(i_secName); + secLength = ( secLength > SECTN_NAME_MAX_LEN ) ? SECTN_NAME_MAX_LEN : secLength; + memcpy( iv_secName, i_secName, secLength ); + } + + ImgSec( PlatId i_plat, uint8_t i_secId ): + iv_plat( i_plat ), + iv_secId( i_secId ) + { + memset( iv_secName, 0x00, SECTN_NAME_MAX_LEN ); + } + + ImgSec(): iv_plat (PLAT_SELF), iv_secId (0 ) + { + memcpy( iv_secName, "Self Restore", 12 ); + } + }; - if( i_lhs.iv_plat == i_rhs.iv_plat ) + /** + * @brief operator < overloading for ImgSec. + */ + bool operator < ( const ImgSec& i_lhs, const ImgSec& i_rhs ) { - if( i_lhs.iv_secId == i_rhs.iv_secId ) + if( i_lhs.iv_plat == i_rhs.iv_plat ) { - equal = true; + return i_lhs.iv_secId < i_rhs.iv_secId; + } + else + { + return i_lhs.iv_plat < i_rhs.iv_plat; } } - return equal; -} + /** + * @brief operator == overloading for ImgSec. + */ + bool operator == ( const ImgSec& i_lhs, const ImgSec& i_rhs ) + { + bool equal = false; -/** - * @brief compares size of a given image's section with maximum allowed size. - */ -class ImgSizeBank -{ - public: - ImgSizeBank(); - ~ImgSizeBank() {}; - uint32_t isSizeGood( PlatId i_plat, uint8_t i_sec, uint32_t i_size ); + if( i_lhs.iv_plat == i_rhs.iv_plat ) + { + if( i_lhs.iv_secId == i_rhs.iv_secId ) + { + equal = true; + } + } - private: - std::map< ImgSec, uint32_t> iv_secSize; + return equal; + } + + /** + * @brief compares size of a given image's section with maximum allowed size. + */ + class ImgSizeBank + { + public: + ImgSizeBank(); + ~ImgSizeBank() {}; + uint32_t isSizeGood( PlatId i_plat, uint8_t i_sec, uint32_t i_size, + char* i_secName, uint8_t i_bufLength ); + uint32_t getImgSectn( PlatId i_plat, uint8_t i_sec, uint32_t& o_secSize, + char* i_secName, uint8_t i_bufLength ); -}; + private: + std::map< ImgSec, uint32_t> iv_secSize; -/** - * @brief constructor - */ -ImgSizeBank::ImgSizeBank() -{ - iv_secSize[ImgSec(PLAT_SELF, P9_XIP_SECTION_RESTORE_SELF)] = SELF_RESTORE_CODE_SIZE; - iv_secSize[ImgSec(PLAT_SELF, P9_XIP_SECTION_RESTORE_CPMR)] = CPMR_HEADER_SIZE; - iv_secSize[ImgSec(PLAT_SGPE, P9_XIP_SECTION_SGPE_QPMR)] = HALF_KB; - iv_secSize[ImgSec(PLAT_SGPE, P9_XIP_SECTION_SGPE_LVL1_BL)] = SGPE_BOOT_COPIER_SIZE; - iv_secSize[ImgSec(PLAT_SGPE, P9_XIP_SECTION_SGPE_LVL2_BL)] = SGPE_BOOT_LOADER_SIZE; - iv_secSize[ImgSec(PLAT_SGPE, P9_XIP_SECTION_SGPE_HCODE)] = SGPE_IMAGE_SIZE; - - iv_secSize[ImgSec(PLAT_CME, P9_XIP_SECTION_CME_HCODE)] = CME_SRAM_SIZE; - - iv_secSize[ImgSec(PLAT_PGPE, P9_XIP_SECTION_PGPE_PPMR)] = HALF_KB; - iv_secSize[ImgSec(PLAT_PGPE, P9_XIP_SECTION_PGPE_LVL1_BL)] = PGPE_BOOT_COPIER_SIZE; - iv_secSize[ImgSec(PLAT_PGPE, P9_XIP_SECTION_PGPE_LVL2_BL)] = PGPE_BOOT_LOADER_SIZE; - iv_secSize[ImgSec(PLAT_PGPE, P9_XIP_SECTION_PGPE_HCODE)] = PGPE_IMAGE_SIZE; -} - -/** - * @brief verifies actual section size against max size allowed. - * @param i_plat platform associated with image section. - * @param i_sec image section. - * @param i_size actual image section size. - * @return zero if size within limit else max size allowed. - */ -uint32_t ImgSizeBank::isSizeGood( PlatId i_plat, uint8_t i_sec, uint32_t i_size ) -{ - uint32_t size = -1; - ImgSec key( i_plat, i_sec ); - std::map< ImgSec, uint32_t>::iterator it; + }; - for( it = iv_secSize.begin(); it != iv_secSize.end(); it++ ) + /** + * @brief constructor + */ + ImgSizeBank::ImgSizeBank() { - if( it->first == key ) + //A given section can be uniquely identified by platform to which it belongs, section id + //within the platform image. Name too has been added to assist debug in case of a failure. + //To identify a given image section say a bootloader, we are using it's id as defined in + //p9_xip_images.h. Inorder to identify a full SRAM Image, we introduced a new ID + //xxx_SRAM_IMAGE. + + iv_secSize[ImgSec(PLAT_SELF, P9_XIP_SECTION_RESTORE_SELF, (char*)"Self Restore")] = SELF_RESTORE_CODE_SIZE; + iv_secSize[ImgSec(PLAT_SELF, P9_XIP_SECTION_RESTORE_CPMR, (char*)"CPMR Header")] = CPMR_HEADER_SIZE; + iv_secSize[ImgSec(PLAT_SGPE, P9_XIP_SECTION_SGPE_QPMR, (char*)"QPMR Header")] = HALF_KB; + iv_secSize[ImgSec(PLAT_SGPE, P9_XIP_SECTION_SGPE_LVL1_BL, (char*)"SGPE Boot Copier")] = SGPE_BOOT_COPIER_SIZE; + iv_secSize[ImgSec(PLAT_SGPE, P9_XIP_SECTION_SGPE_LVL2_BL, (char*)"SGPE Boot Loader")] = SGPE_BOOT_LOADER_SIZE; + iv_secSize[ImgSec(PLAT_SGPE, P9_XIP_SECTION_SGPE_HCODE, (char*)"SGPE Hcode")] = SGPE_IMAGE_SIZE; + iv_secSize[ImgSec(PLAT_SGPE, SGPE_SRAM_IMAGE, (char*)"SGPE SRAM Image")] = SGPE_IMAGE_SIZE; + + iv_secSize[ImgSec(PLAT_CME, P9_XIP_SECTION_CME_HCODE, (char*)"CME Hcode")] = CME_SRAM_SIZE; + iv_secSize[ImgSec(PLAT_CME, CME_SRAM_IMAGE, (char*)"CME SRAM Image")] = CME_SRAM_SIZE; + + iv_secSize[ImgSec(PLAT_PGPE, P9_XIP_SECTION_PGPE_PPMR, (char*)"PPMR Header")] = HALF_KB; + iv_secSize[ImgSec(PLAT_PGPE, P9_XIP_SECTION_PGPE_LVL1_BL, (char*)"PGPE Boot Copier")] = PGPE_BOOT_COPIER_SIZE; + iv_secSize[ImgSec(PLAT_PGPE, P9_XIP_SECTION_PGPE_LVL2_BL, (char*)"PGPE Boot Loader")] = PGPE_BOOT_LOADER_SIZE;; + iv_secSize[ImgSec(PLAT_PGPE, P9_XIP_SECTION_PGPE_HCODE, (char*)"PGPE Hcode")] = PGPE_IMAGE_SIZE; + iv_secSize[ImgSec(PLAT_PGPE, PGPE_SRAM_IMAGE, (char*)"PGPE SRAM Image")] = PGPE_IMAGE_SIZE; + } + + /** + * @brief verifies actual section size against max size allowed. + * @param i_plat platform associated with image section. + * @param i_sec image section. + * @param i_size actual image section size. + * @param i_pSecName points to a buffer with section name. + * @param i_bufLength length of the buffer. + * @return zero if size within limit else max size allowed. + */ + uint32_t ImgSizeBank::isSizeGood( PlatId i_plat, uint8_t i_sec, + uint32_t i_size, char* i_pSecName, + uint8_t i_bufLength ) + { + uint32_t rc = 0; + uint32_t tempSize = 0; + ImgSec key( i_plat, i_sec ); + std::map< ImgSec, uint32_t>::iterator it; + + do { - size = 0; + rc = getImgSectn( i_plat, i_sec, tempSize, i_pSecName, i_bufLength ); + FAPI_DBG(" Sec: %s Max Size 0x%08X", i_pSecName ? i_pSecName : "--", tempSize ); - if( it->second < i_size ) + if( rc ) { - size = it->second; + FAPI_ERR( "Image Sectn not found i_plat 0x%08x i_sec 0x%08x", + (uint32_t) i_plat, i_sec ); + break; + } + + if( i_size > tempSize ) + { + rc = tempSize; // returning Max Allowed size as return code + break; } - break; } + while(0); + + return rc; } + /** + * @brief returns max size for a given image section + * @param i_plat platform associated with image section. + * @param i_sec image section. + * @param i_size actual image section size. + * @param i_pSecName points to a buffer with section name. + * @param i_bufLength length of the buffer. + * @return zero if section found, error code otherwise. + */ + uint32_t ImgSizeBank::getImgSectn( PlatId i_plat, uint8_t i_sec, uint32_t& o_secSize, + char* i_pSecName, uint8_t i_bufLength ) + { + uint32_t rc = -1; + ImgSec key( i_plat, i_sec ); + std::map< ImgSec, uint32_t>::iterator it; + o_secSize = 0; - FAPI_DBG(" Sec Size 0x%08X", size); - return size; -} + for( it = iv_secSize.begin(); it != iv_secSize.end(); it++ ) + { + if( key == it->first ) + { + rc = 0; + o_secSize = it->second; //Max Size allowed for section + + //Image section found and maximum size info obtained. + if( i_pSecName ) + { + //Copying Sectn name to assist debug + memcpy( i_pSecName, it->first.iv_secName, i_bufLength ); + } + + break; + } + + } + + return rc; + } -/** - * @brief models an Ex pair. - */ -struct ExpairId -{ - uint16_t iv_evenExId; - uint16_t iv_oddExId; /** - * @brief constructor + * @brief models an Ex pair. */ - ExpairId( uint32_t i_evenExId, uint32_t i_oddExId ): - iv_evenExId( i_evenExId ), - iv_oddExId( i_oddExId ) - { } + struct ExpairId + { + uint16_t iv_evenExId; + uint16_t iv_oddExId; + /** + * @brief constructor + */ + ExpairId( uint32_t i_evenExId, uint32_t i_oddExId ): + iv_evenExId( i_evenExId ), + iv_oddExId( i_oddExId ) + { } + + /** + * @brief constructor + */ + ExpairId() { }; + }; /** - * @brief constructor + * @brief a map to resolve Ex chiplet Id associated with all six quads in P9. */ - ExpairId() { }; -}; - -/** - * @brief a map to resolve Ex chiplet Id associated with all six quads in P9. - */ -class ExIdMap -{ - public: - ExIdMap(); - ~ExIdMap() {}; - uint32_t getInstanceId( uint32_t i_eqId, uint32_t i_ringOrder ); - private: - std::map<uint32_t, ExpairId> iv_idMap; -}; + class ExIdMap + { + public: + ExIdMap(); + ~ExIdMap() {}; + uint32_t getInstanceId( uint32_t i_eqId, uint32_t i_ringOrder ); + private: + std::map<uint32_t, ExpairId> iv_idMap; + }; #define ALIGN_DBWORD( OUTSIZE, INSIZE ) \ { \ @@ -313,87 +393,84 @@ class ExIdMap } \ } -/** - * @brief constructor - */ -ExIdMap::ExIdMap() -{ - ExpairId exPairIdMap[6] = { { 0x10, 0x11}, - { 0x12, 0x13 }, - { 0x14, 0x15 }, - { 0x16, 0x17 }, - { 0x18, 0x19 }, - { 0x1A, 0x1B } - }; - - for( uint32_t eqCnt = 0; eqCnt < MAX_QUADS_PER_CHIP; eqCnt++ ) + /** + * @brief constructor + */ + ExIdMap::ExIdMap() { - iv_idMap[CACHE0_CHIPLET_ID + eqCnt] = exPairIdMap[eqCnt]; + ExpairId exPairIdMap[6] = { { 0x10, 0x11}, + { 0x12, 0x13 }, + { 0x14, 0x15 }, + { 0x16, 0x17 }, + { 0x18, 0x19 }, + { 0x1A, 0x1B } + }; + + for( uint32_t eqCnt = 0; eqCnt < MAX_QUADS_PER_CHIP; eqCnt++ ) + { + iv_idMap[CACHE0_CHIPLET_ID + eqCnt] = exPairIdMap[eqCnt]; + } } -} //------------------------------------------------------------------------- -/** - * @brief returns ex chiplet ID associated with a scan ring and EQ id. - * @param i_eqId chiplet id for a given quad. - * @param i_ringOrder serial number associated with a scan ring in HOMER. - * @return chiplet Id associated with a scan ring. - */ -uint32_t ExIdMap::getInstanceId( uint32_t i_eqId, uint32_t i_ringOrder ) -{ - uint32_t exChipletId = 0xFFFFFFFF; - std::map<uint32_t, ExpairId>::iterator itChipId = iv_idMap.find( i_eqId ); - - do + /** + * @brief returns ex chiplet ID associated with a scan ring and EQ id. + * @param i_eqId chiplet id for a given quad. + * @param i_ringOrder serial number associated with a scan ring in HOMER. + * @return chiplet Id associated with a scan ring. + */ + uint32_t ExIdMap::getInstanceId( uint32_t i_eqId, uint32_t i_ringOrder ) { - if ( itChipId == iv_idMap.end() ) - { - break; - } - else + uint32_t exChipletId = 0xFFFFFFFF; + std::map<uint32_t, ExpairId>::iterator itChipId = iv_idMap.find( i_eqId ); + + do { - switch( i_ringOrder ) + if ( itChipId == iv_idMap.end() ) { - case 0: - exChipletId = i_eqId; - break; - - case 1: - case 3: - case 5: - case 7: - exChipletId = itChipId->second.iv_evenExId; - break; - - case 2: - case 4: - case 6: - case 8: - exChipletId = itChipId->second.iv_oddExId; - break; - - default: - break; + break; } + else + { + switch( i_ringOrder ) + { + case 0: + exChipletId = i_eqId; + break; + + case 1: + case 3: + case 5: + case 7: + exChipletId = itChipId->second.iv_evenExId; + break; + + case 2: + case 4: + case 6: + case 8: + exChipletId = itChipId->second.iv_oddExId; + break; + + default: + break; + } + } + } + while(0); + FAPI_DBG("Resolved Ex Id 0x%02x", exChipletId ); + return exChipletId; } - while(0); - - FAPI_DBG("Resolved Ex Id 0x%02x", exChipletId ); - return exChipletId; -} //------------------------------------------------------------------------- - -uint32_t validateSramImageSize( Homerlayout_t* i_pChipHomer, uint32_t& o_sramImgSize ) -{ - FAPI_DBG(">validateSramImageSize" ); - uint32_t rc = IMG_BUILD_SUCCESS; - - do + fapi2::ReturnCode validateSramImageSize( Homerlayout_t* i_pChipHomer, uint32_t& o_sramImgSize ) { + FAPI_DBG(">validateSramImageSize" ); + uint32_t rc = IMG_BUILD_SUCCESS; + ImgSizeBank sizebank; sgpeHeader_t* pSgpeHdr = (sgpeHeader_t*)& i_pChipHomer->qpmrRegion.sgpeRegion.sgpeSramImage[SGPE_INT_VECTOR_SIZE]; cmeHeader_t* pCmeHdr = (cmeHeader_t*) & i_pChipHomer->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE]; @@ -402,3023 +479,2994 @@ uint32_t validateSramImageSize( Homerlayout_t* i_pChipHomer, uint32_t& o_sramImg //FIXME size will change once SCOM and 24x7 are handled o_sramImgSize = SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_scom_offset); - rc = sizebank.isSizeGood( PLAT_SGPE, P9_XIP_SECTION_SGPE_HCODE, o_sramImgSize ); - FAPI_DBG("SGPE SRAM Image : 0x%08X Size Check : %s", o_sramImgSize, rc ? "FAILURE" : "SUCCESS" ); + rc = sizebank.isSizeGood( PLAT_SGPE, SGPE_SRAM_IMAGE, o_sramImgSize, NULL , 0 ); + FAPI_IMP("SGPE SRAM Image Size : 0x%08X Size Check : %s", o_sramImgSize, rc ? "FAILURE" : "SUCCESS" ); - if( rc ) - { - rc = SGPE_SRAM_IMG_SIZE_ERR; - break; - } + FAPI_ASSERT( ( IMG_BUILD_SUCCESS == rc ), + fapi2::SGPE_IMG_EXCEED_SRAM_SIZE( ) + .set_BAD_IMG_SIZE( o_sramImgSize ) + .set_MAX_SGPE_IMG_SIZE_ALLOWED( rc ), + "SGPE Image Size Exceeded Max Allowed Size" ); o_sramImgSize = (SWIZZLE_4_BYTE(pCmeHdr->g_cme_scom_offset) << CME_BLK_SIZE_SHIFT) + SWIZZLE_4_BYTE(pCmeHdr->g_cme_scom_length); FAPI_DBG("CME Offset 0x%08X size 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_scom_offset), o_sramImgSize ); - rc = sizebank.isSizeGood( PLAT_CME, P9_XIP_SECTION_CME_HCODE, o_sramImgSize ); - FAPI_DBG("CME SRAM Image : 0x%08X Size Check : %s", o_sramImgSize, rc ? "FAILURE" : "SUCCESS" ); - if( rc ) - { - rc = CME_SRAM_IMG_SIZE_ERR; - break; - } + rc = sizebank.isSizeGood( PLAT_CME, CME_SRAM_IMAGE, o_sramImgSize, NULL, 0 ); + FAPI_IMP("CME SRAM Image Size : 0x%08X Size Check : %s", o_sramImgSize, rc ? "FAILURE" : "SUCCESS" ); + + FAPI_ASSERT( ( IMG_BUILD_SUCCESS == rc ), + fapi2::CME_IMG_EXCEED_SRAM_SIZE( ) + .set_BAD_IMG_SIZE( o_sramImgSize ) + .set_MAX_CME_IMG_SIZE_ALLOWED( rc ), + "CME Image Size Exceeded Max Allowed Size" ); + o_sramImgSize = SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_pgpe_sram_img_size); - rc = sizebank.isSizeGood( PLAT_PGPE, P9_XIP_SECTION_PGPE_HCODE, o_sramImgSize ); - FAPI_DBG("PGPE SRAM Image : 0x%08X Size Check : %s", o_sramImgSize, rc ? "FAILURE" : "SUCCESS" ); - if( rc ) - { - rc = PGPE_SRAM_IMG_SIZE_ERR; - break; - } - } - while(0); + rc = sizebank.isSizeGood( PLAT_PGPE, PGPE_SRAM_IMAGE, o_sramImgSize, NULL, 0 ); + FAPI_IMP("PGPE SRAM Image Size : 0x%08X Size Check : %s", o_sramImgSize, rc ? "FAILURE" : "SUCCESS" ); + + FAPI_ASSERT( ( IMG_BUILD_SUCCESS == rc ), + fapi2::PGPE_IMG_EXCEED_SRAM_SIZE( ) + .set_BAD_IMG_SIZE( o_sramImgSize ) + .set_MAX_PGPE_IMG_SIZE_ALLOWED( rc ), + "PGPE Image Size Exceeded Max Allowed Size" ); - FAPI_DBG("<validateSramImageSize" ); + FAPI_DBG("<validateSramImageSize" ); + + fapi_try_exit: + return fapi2::current_err; + } - return rc; -} //------------------------------------------------------------------------- -/** - * @brief validates arguments passed for hcode image build - * @param refer to p9_hcode_image_build arguments - * @return fapi2 return code -*/ -fapi2::ReturnCode validateInputArguments( void* const i_pImageIn, void* i_pImageOut, - SysPhase_t i_phase, ImageType_t i_imgType, - void* i_pBuf1, uint32_t i_bufSize1, void* i_pBuf2, - uint32_t i_bufSize2, void* i_pBuf3, uint32_t i_bufSize3 ) -{ - uint32_t l_rc = IMG_BUILD_SUCCESS; - uint32_t hwImagSize = 0; - - FAPI_DBG("Entering validateInputArguments ..."); - - FAPI_ASSERT( (( i_pImageIn != NULL ) && ( i_pImageOut != NULL ) && - ( i_pImageIn != i_pImageOut )), - fapi2::IMG_PTR_ERROR() - .set_HW_IMG_BUF_PTR( i_pImageIn ) - .set_HOMER_IMG_BUF_PTR( i_pImageOut ), - "Bad pointer to HW Image or HOMER Image" ); - l_rc = p9_xip_image_size( i_pImageIn, &hwImagSize ); - - FAPI_DBG("size is 0x%08X; xip_image_size RC is 0x%02x HARDWARE_IMG_SIZE 0x%08X Sz 0x%08X", - hwImagSize, l_rc, HARDWARE_IMG_SIZE, hwImagSize ); - - FAPI_ASSERT( (( IMG_BUILD_SUCCESS == l_rc ) && ( hwImagSize > 0 ) && - ( HARDWARE_IMG_SIZE >= hwImagSize )), - fapi2::HW_IMAGE_INVALID_SIZE() - .set_HW_IMG_SIZE( hwImagSize ) - .set_MAX_HW_IMG_SIZE( HARDWARE_IMG_SIZE ), - "Hardware image size found out of range" ); - FAPI_ASSERT( (( i_phase > PHASE_NA ) && ( i_phase < PHASE_END )), - fapi2::HCODE_INVALID_PHASE() - .set_SYS_PHASE( i_phase ), - "Invalid value passed as build phase" ); - - FAPI_ASSERT( ( i_pBuf1 != NULL ), - fapi2::HCODE_INVALID_TEMP_BUF() - .set_TEMP_BUF_PTR( i_pBuf1 ), - "Invalid temp buffer1 passed for hcode image build" ); - - FAPI_ASSERT( (( i_bufSize1 != 0 ) && ( i_bufSize2 != 0 ) && ( i_bufSize3 != 0 )), - fapi2::HCODE_TEMP_BUF_SIZE() - .set_TEMP_BUF1_SIZE( i_bufSize1 ) - .set_TEMP_BUF2_SIZE( i_bufSize2 ) - .set_TEMP_BUF3_SIZE( i_bufSize3 ), - "Invalid work buffer size " ); - - FAPI_ASSERT( ( i_pBuf2 != NULL ), - fapi2::HCODE_INVALID_TEMP_BUF() - .set_TEMP_BUF_PTR( i_pBuf2 ), - "Invalid temp buffer2 passed for hcode image build" ); - - FAPI_ASSERT( ( i_pBuf3 != NULL ), - fapi2::HCODE_INVALID_TEMP_BUF() - .set_TEMP_BUF_PTR( i_pBuf3 ), - "Invalid temp buffer3 passed for hcode image build" ); - - FAPI_ASSERT( ( i_imgType.isBuildValid() ), - fapi2::HCODE_INVALID_IMG_TYPE(), - "Invalid temp buffer passed for hcode image build" ); - FAPI_DBG("Exiting validateInputArguments ..."); - -fapi_try_exit: - return fapi2::current_err; -} + /** + * @brief validates arguments passed for hcode image build + * @param refer to p9_hcode_image_build arguments + * @return fapi2 return code + */ + fapi2::ReturnCode validateInputArguments( void* const i_pImageIn, void* i_pImageOut, + SysPhase_t i_phase, ImageType_t i_imgType, + void* i_pBuf1, uint32_t i_bufSize1, void* i_pBuf2, + uint32_t i_bufSize2, void* i_pBuf3, uint32_t i_bufSize3 ) + { + uint32_t l_rc = IMG_BUILD_SUCCESS; + uint32_t hwImagSize = 0; + + FAPI_DBG("Entering validateInputArguments ..."); + + FAPI_ASSERT( (( i_pImageIn != NULL ) && ( i_pImageOut != NULL ) && + ( i_pImageIn != i_pImageOut )), + fapi2::IMG_PTR_ERROR() + .set_HW_IMG_BUF_PTR( i_pImageIn ) + .set_HOMER_IMG_BUF_PTR( i_pImageOut ), + "Bad pointer to HW Image or HOMER Image" ); + l_rc = p9_xip_image_size( i_pImageIn, &hwImagSize ); + + FAPI_DBG("size is 0x%08X; xip_image_size RC is 0x%02x HARDWARE_IMG_SIZE 0x%08X Sz 0x%08X", + hwImagSize, l_rc, HARDWARE_IMG_SIZE, hwImagSize ); + + FAPI_ASSERT( (( IMG_BUILD_SUCCESS == l_rc ) && ( hwImagSize > 0 ) && + ( HARDWARE_IMG_SIZE >= hwImagSize )), + fapi2::HW_IMAGE_INVALID_SIZE() + .set_HW_IMG_SIZE( hwImagSize ) + .set_MAX_HW_IMG_SIZE( HARDWARE_IMG_SIZE ), + "Hardware image size found out of range" ); + FAPI_ASSERT( (( i_phase > PHASE_NA ) && ( i_phase < PHASE_END )), + fapi2::HCODE_INVALID_PHASE() + .set_SYS_PHASE( i_phase ), + "Invalid value passed as build phase" ); + + FAPI_ASSERT( ( i_pBuf1 != NULL ), + fapi2::HCODE_INVALID_TEMP_BUF() + .set_TEMP_BUF_PTR( i_pBuf1 ), + "Invalid temp buffer1 passed for hcode image build" ); + + FAPI_ASSERT( (( i_bufSize1 != 0 ) && ( i_bufSize2 != 0 ) && ( i_bufSize3 != 0 )), + fapi2::HCODE_TEMP_BUF_SIZE() + .set_TEMP_BUF1_SIZE( i_bufSize1 ) + .set_TEMP_BUF2_SIZE( i_bufSize2 ) + .set_TEMP_BUF3_SIZE( i_bufSize3 ), + "Invalid work buffer size " ); + + FAPI_ASSERT( ( i_pBuf2 != NULL ), + fapi2::HCODE_INVALID_TEMP_BUF() + .set_TEMP_BUF_PTR( i_pBuf2 ), + "Invalid temp buffer2 passed for hcode image build" ); + + FAPI_ASSERT( ( i_pBuf3 != NULL ), + fapi2::HCODE_INVALID_TEMP_BUF() + .set_TEMP_BUF_PTR( i_pBuf3 ), + "Invalid temp buffer3 passed for hcode image build" ); + + FAPI_ASSERT( ( i_imgType.isBuildValid() ), + fapi2::HCODE_INVALID_IMG_TYPE(), + "Invalid temp buffer passed for hcode image build" ); + FAPI_DBG("Exiting validateInputArguments ..."); + + fapi_try_exit: + return fapi2::current_err; + } //------------------------------------------------------------------------------ -/** - * @brief Copies section of hardware image to HOMER - * @param i_destPtr a location in HOMER - * @param i_srcPtr a location in HW Image. - * @param i_secId XIP Section id to be copied. - * @param i_platId platform associated with the given section. - * @param o_ppeSection contains section details. - * @return IMG_BUILD_SUCCESS if successful, error code otherwise. - */ -uint32_t copySectionToHomer( uint8_t* i_destPtr, uint8_t* i_srcPtr, uint8_t i_secId, PlatId i_platId , - P9XipSection& o_ppeSection ) -{ - FAPI_INF("> copySectionToHomer"); - uint32_t retCode = IMG_BUILD_SUCCESS; - ImgSizeBank sizebank; - - do + /** + * @brief Copies section of hardware image to HOMER + * @param i_destPtr a location in HOMER + * @param i_srcPtr a location in HW Image. + * @param i_secId XIP Section id to be copied. + * @param i_platId platform associated with the given section. + * @param o_ppeSection contains section details. + * @return IMG_BUILD_SUCCESS if successful, error code otherwise. + */ + uint32_t copySectionToHomer( uint8_t* i_destPtr, uint8_t* i_srcPtr, uint8_t i_secId, PlatId i_platId , + P9XipSection& o_ppeSection ) { - o_ppeSection.iv_offset = 0; - o_ppeSection.iv_size = 0; - uint32_t rcTemp = p9_xip_get_section( i_srcPtr, i_secId, &o_ppeSection ); + FAPI_INF("> copySectionToHomer"); + uint32_t retCode = IMG_BUILD_SUCCESS; + ImgSizeBank sizebank; - if( rcTemp ) + do { - FAPI_ERR("Failed to get section 0x%08X of Plat 0x%08X", i_secId, i_platId ); - retCode = BUILD_FAIL_INVALID_SECTN; - break; - } + char secName[SECTN_NAME_MAX_LEN] = {0}; + o_ppeSection.iv_offset = 0; + o_ppeSection.iv_size = 0; + uint32_t rcTemp = p9_xip_get_section( i_srcPtr, i_secId, &o_ppeSection ); + + if( rcTemp ) + { + FAPI_ERR("Failed to get section 0x%08X of Plat 0x%08X", i_secId, i_platId ); + retCode = BUILD_FAIL_INVALID_SECTN; + break; + } - FAPI_DBG("o_ppeSection.iv_offset = %X, " - "o_ppeSection.iv_size = %X, " - "i_secId %d", - o_ppeSection.iv_offset, - o_ppeSection.iv_size, - i_secId); + FAPI_DBG("o_ppeSection.iv_offset = %X, " + "o_ppeSection.iv_size = %X, " + "i_secId %d", + o_ppeSection.iv_offset, + o_ppeSection.iv_size, + i_secId); - rcTemp = sizebank.isSizeGood( i_platId, i_secId, o_ppeSection.iv_size ); + rcTemp = sizebank.isSizeGood( i_platId, i_secId, o_ppeSection.iv_size, secName, SECTN_NAME_MAX_LEN ); - if ( rcTemp ) - { - FAPI_ERR("??????????Size Exceeds the permissible limit???????" ); - FAPI_ERR("Max Allowed 0x%08X (%08d) Actual Size 0x%08X (%08d)", - rcTemp, rcTemp, o_ppeSection.iv_size, o_ppeSection.iv_size); - retCode = BUILD_SEC_SIZE_OVERFLOW; - break; + if ( rcTemp ) + { + FAPI_ERR("??????????Size Exceeds the permissible limit???????" ); + FAPI_ERR("Sec Name: %s Max Allowed 0x%08X (%08d) Actual Size 0x%08X (%08d)", + secName, rcTemp, rcTemp, o_ppeSection.iv_size, o_ppeSection.iv_size); + retCode = BUILD_SEC_SIZE_OVERFLOW; + break; + } + + memcpy( i_destPtr, i_srcPtr + o_ppeSection.iv_offset, o_ppeSection.iv_size ); } + while(0); - memcpy( i_destPtr, i_srcPtr + o_ppeSection.iv_offset, o_ppeSection.iv_size ); + FAPI_INF("< copySectionToHomer"); + return retCode; } - while(0); - - FAPI_INF("< copySectionToHomer"); - return retCode; -} //------------------------------------------------------------------------------ -/** - * @brief Update the CME/SGPE Image Header Flag field. - * @param i_pChipHomer points to HOMER image. - * @return fapi2 return code. - */ -fapi2::ReturnCode updateImageFlags( Homerlayout_t* i_pChipHomer ) -{ - uint8_t attrVal = 0; - uint32_t cmeFlag = 0; - uint32_t sgpeFlag = 0; - pgpe_flags_t pgpeFlags; + /** + * @brief Update the CME/SGPE Image Header Flag field. + * @param i_pChipHomer points to HOMER image. + * @return fapi2 return code. + */ + fapi2::ReturnCode updateImageFlags( Homerlayout_t* i_pChipHomer ) + { + uint8_t attrVal = 0; + uint32_t cmeFlag = 0; + uint32_t sgpeFlag = 0; + pgpe_flags_t pgpeFlags; - const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM; - cmeHeader_t* pCmeHdr = (cmeHeader_t*) & i_pChipHomer->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE]; - sgpeHeader_t* pSgpeHdr = (sgpeHeader_t*)& i_pChipHomer->qpmrRegion.sgpeRegion.sgpeSramImage[SGPE_INT_VECTOR_SIZE]; - PgpeHeader_t* pPgpeHdr = (PgpeHeader_t*)& i_pChipHomer->ppmrRegion.pgpeSramImage[PGPE_INT_VECTOR_SIZE]; + const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM; + cmeHeader_t* pCmeHdr = (cmeHeader_t*) & i_pChipHomer->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE]; + sgpeHeader_t* pSgpeHdr = (sgpeHeader_t*)& i_pChipHomer->qpmrRegion.sgpeRegion.sgpeSramImage[SGPE_INT_VECTOR_SIZE]; + PgpeHeader_t* pPgpeHdr = (PgpeHeader_t*)& i_pChipHomer->ppmrRegion.pgpeSramImage[PGPE_INT_VECTOR_SIZE]; - //Handling flags common to CME and SGPE + //Handling flags common to CME and SGPE - FAPI_DBG(" ==================== CME/SGPE Flags ================="); - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_STOP4_DISABLE, - FAPI_SYSTEM, - attrVal), - "Error from FAPI_ATTR_GET for attribute ATTR_STOP4_DISABLE"); + FAPI_DBG(" ==================== CME/SGPE Flags ================="); + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_STOP4_DISABLE, + FAPI_SYSTEM, + attrVal), + "Error from FAPI_ATTR_GET for attribute ATTR_STOP4_DISABLE"); - if( attrVal ) - { - cmeFlag |= CME_STOP_4_TO_2_BIT_POS; - sgpeFlag |= SGPE_STOP_4_TO_2_BIT_POS; - } + if( attrVal ) + { + cmeFlag |= CME_STOP_4_TO_2_BIT_POS; + sgpeFlag |= SGPE_STOP_4_TO_2_BIT_POS; + } - FAPI_DBG("STOP_4_to_2 : %s", attrVal ? "TRUE" : "FALSE" ); + FAPI_DBG("STOP_4_to_2 : %s", attrVal ? "TRUE" : "FALSE" ); - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_STOP5_DISABLE, - FAPI_SYSTEM, - attrVal), - "Error from FAPI_ATTR_GET for attribute ATTR_STOP5_DISABLE"); + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_STOP5_DISABLE, + FAPI_SYSTEM, + attrVal), + "Error from FAPI_ATTR_GET for attribute ATTR_STOP5_DISABLE"); - if( attrVal ) - { - cmeFlag |= CME_STOP_5_TO_4_BIT_POS; - sgpeFlag |= SGPE_STOP_5_TO_4_BIT_POS; - } + if( attrVal ) + { + cmeFlag |= CME_STOP_5_TO_4_BIT_POS; + sgpeFlag |= SGPE_STOP_5_TO_4_BIT_POS; + } - FAPI_DBG("STOP_5_to_4 : %s", attrVal ? "TRUE" : "FALSE"); + FAPI_DBG("STOP_5_to_4 : %s", attrVal ? "TRUE" : "FALSE"); - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_STOP8_DISABLE, - FAPI_SYSTEM, - attrVal), - "Error from FAPI_ATTR_GET for attribute ATTR_STOP8_DISABLE"); + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_STOP8_DISABLE, + FAPI_SYSTEM, + attrVal), + "Error from FAPI_ATTR_GET for attribute ATTR_STOP8_DISABLE"); - if( attrVal ) - { - cmeFlag |= CME_STOP_8_TO_5_BIT_POS; - sgpeFlag |= SGPE_STOP_8_TO_5_BIT_POS; - } + if( attrVal ) + { + cmeFlag |= CME_STOP_8_TO_5_BIT_POS; + sgpeFlag |= SGPE_STOP_8_TO_5_BIT_POS; + } - FAPI_DBG("STOP_8_to_5 : %s", attrVal ? "TRUE" : "FALSE" ); + FAPI_DBG("STOP_8_to_5 : %s", attrVal ? "TRUE" : "FALSE" ); - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_STOP11_DISABLE, - FAPI_SYSTEM, - attrVal), - "Error from FAPI_ATTR_GET for attribute ATTR_STOP11_DISABLE"); + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_STOP11_DISABLE, + FAPI_SYSTEM, + attrVal), + "Error from FAPI_ATTR_GET for attribute ATTR_STOP11_DISABLE"); - if( attrVal ) - { - cmeFlag |= CME_STOP_11_TO_8_BIT_POS; - sgpeFlag |= SGPE_STOP_11_TO_8_BIT_POS; - } + if( attrVal ) + { + cmeFlag |= CME_STOP_11_TO_8_BIT_POS; + sgpeFlag |= SGPE_STOP_11_TO_8_BIT_POS; + } - FAPI_DBG("STOP_11_to_8 : %s", attrVal ? "TRUE" : "FALSE" ); + FAPI_DBG("STOP_11_to_8 : %s", attrVal ? "TRUE" : "FALSE" ); - // Set PGPE Header Flags from Attributes - FAPI_DBG(" -------------------- PGPE Flags -----------------"); - pgpeFlags.value = 0; - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PGPE_HCODE_FUNCTION_ENABLE, - FAPI_SYSTEM, - attrVal), - "Error from FAPI_ATTR_GET for attribute ATTR_PGPE_HCODE_FUNCTION_ENABLE"); + // Set PGPE Header Flags from Attributes + FAPI_DBG(" -------------------- PGPE Flags -----------------"); + pgpeFlags.value = 0; + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PGPE_HCODE_FUNCTION_ENABLE, + FAPI_SYSTEM, + attrVal), + "Error from FAPI_ATTR_GET for attribute ATTR_PGPE_HCODE_FUNCTION_ENABLE"); - // If 0 (Hcode disabled), then set the occ_opc_immed_response flag bit - if( !attrVal ) - { - pgpeFlags.fields.occ_ipc_immed_response = 1; - } + // If 0 (Hcode disabled), then set the occ_opc_immed_response flag bit + if( !attrVal ) + { + pgpeFlags.fields.occ_ipc_immed_response = 1; + } - FAPI_DBG("PGPE Hcode Mode : %s", attrVal ? "PSTATES Enabled" : "OCC IPC Immediate Response Mode" ); + FAPI_DBG("PGPE Hcode Mode : %s", attrVal ? "PSTATES Enabled" : "OCC IPC Immediate Response Mode" ); - // Updating flag fields in the headers - pCmeHdr->g_cme_mode_flags = SWIZZLE_4_BYTE(cmeFlag); - pSgpeHdr->g_sgpe_reserve_flags = SWIZZLE_4_BYTE(sgpeFlag); - pPgpeHdr->g_pgpe_flags = SWIZZLE_2_BYTE(pgpeFlags.value); + // Updating flag fields in the headers + pCmeHdr->g_cme_mode_flags = SWIZZLE_4_BYTE(cmeFlag); + pSgpeHdr->g_sgpe_reserve_flags = SWIZZLE_4_BYTE(sgpeFlag); + pPgpeHdr->g_pgpe_flags = SWIZZLE_2_BYTE(pgpeFlags.value); - FAPI_INF("CME Flag Value : 0x%08x", SWIZZLE_4_BYTE(pCmeHdr->g_cme_mode_flags)); - FAPI_INF("SGPE Flag Value : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_reserve_flags)); - FAPI_INF("PGPE Flag Value : 0x%08x", SWIZZLE_2_BYTE(pPgpeHdr->g_pgpe_flags)); - FAPI_DBG(" -------------------- CME/SGPE Flags Ends ---------------=="); + FAPI_INF("CME Flag Value : 0x%08x", SWIZZLE_4_BYTE(pCmeHdr->g_cme_mode_flags)); + FAPI_INF("SGPE Flag Value : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_reserve_flags)); + FAPI_INF("PGPE Flag Value : 0x%08x", SWIZZLE_2_BYTE(pPgpeHdr->g_pgpe_flags)); + FAPI_DBG(" -------------------- CME/SGPE Flags Ends ---------------=="); -fapi_try_exit: - return fapi2::current_err; -} + fapi_try_exit: + return fapi2::current_err; + } //------------------------------------------------------------------------------ -/** - * @brief updates various CPMR fields which are associated with scan rings. - * @param i_pChipHomer points to start of P9 HOMER. - */ -void updateCpmrCmeRegion( Homerlayout_t* i_pChipHomer ) -{ - cpmrHeader_t* pCpmrHdr = - (cpmrHeader_t*) & (i_pChipHomer->cpmrRegion.selfRestoreRegion.CPMR_SR.elements.CPMRHeader); - cmeHeader_t* pCmeHdr = (cmeHeader_t*) & i_pChipHomer->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE]; - - //Updating CPMR Header using info from CME Header - pCpmrHdr->cmeImgOffset = SWIZZLE_4_BYTE((CME_IMAGE_CPMR_OFFSET >> CME_BLK_SIZE_SHIFT)); - pCpmrHdr->cmePstateOffset = CME_IMAGE_CPMR_OFFSET + SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_offset); - pCpmrHdr->cmePstateOffset = SWIZZLE_4_BYTE(pCpmrHdr->cmePstateOffset); - pCpmrHdr->cmePstateLength = pCmeHdr->g_cme_pstate_region_length; - pCpmrHdr->cmeImgLength = pCmeHdr->g_cme_hcode_length;// already swizzled - pCpmrHdr->coreScomOffset = SWIZZLE_4_BYTE(CORE_SCOM_RESTORE_CPMR_OFFSET); - pCpmrHdr->coreScomLength = SWIZZLE_4_BYTE(CORE_SCOM_RESTORE_SIZE_TOTAL); - - if( pCmeHdr->g_cme_common_ring_length ) + /** + * @brief updates various CPMR fields which are associated with scan rings. + * @param i_pChipHomer points to start of P9 HOMER. + */ + void updateCpmrCmeRegion( Homerlayout_t* i_pChipHomer ) { - pCpmrHdr->cmeCommonRingOffset = CME_IMAGE_CPMR_OFFSET + SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_offset); - pCpmrHdr->cmeCommonRingOffset = SWIZZLE_4_BYTE(pCpmrHdr->cmeCommonRingOffset); - pCpmrHdr->cmeCommonRingLength = pCmeHdr->g_cme_common_ring_length; + cpmrHeader_t* pCpmrHdr = + (cpmrHeader_t*) & (i_pChipHomer->cpmrRegion.selfRestoreRegion.CPMR_SR.elements.CPMRHeader); + cmeHeader_t* pCmeHdr = (cmeHeader_t*) & i_pChipHomer->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE]; + + //Updating CPMR Header using info from CME Header + pCpmrHdr->cmeImgOffset = SWIZZLE_4_BYTE((CME_IMAGE_CPMR_OFFSET >> CME_BLK_SIZE_SHIFT)); + pCpmrHdr->cmePstateOffset = CME_IMAGE_CPMR_OFFSET + SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_offset); + pCpmrHdr->cmePstateOffset = SWIZZLE_4_BYTE(pCpmrHdr->cmePstateOffset); + pCpmrHdr->cmePstateLength = pCmeHdr->g_cme_pstate_region_length; + pCpmrHdr->cmeImgLength = pCmeHdr->g_cme_hcode_length;// already swizzled + pCpmrHdr->coreScomOffset = SWIZZLE_4_BYTE(CORE_SCOM_RESTORE_CPMR_OFFSET); + pCpmrHdr->coreScomLength = SWIZZLE_4_BYTE(CORE_SCOM_RESTORE_SIZE_TOTAL); + + if( pCmeHdr->g_cme_common_ring_length ) + { + pCpmrHdr->cmeCommonRingOffset = CME_IMAGE_CPMR_OFFSET + SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_offset); + pCpmrHdr->cmeCommonRingOffset = SWIZZLE_4_BYTE(pCpmrHdr->cmeCommonRingOffset); + pCpmrHdr->cmeCommonRingLength = pCmeHdr->g_cme_common_ring_length; + } + + if( pCmeHdr->g_cme_max_spec_ring_length ) + { + pCpmrHdr->coreSpecRingOffset = ( SWIZZLE_4_BYTE(pCpmrHdr->cmeImgOffset) << CME_BLK_SIZE_SHIFT ) + + SWIZZLE_4_BYTE( pCpmrHdr->cmeImgLength) + + SWIZZLE_4_BYTE(pCpmrHdr->cmePstateLength) + + SWIZZLE_4_BYTE(pCpmrHdr->cmeCommonRingLength); + pCpmrHdr->coreSpecRingOffset = (pCpmrHdr->coreSpecRingOffset + CME_BLOCK_READ_LEN - 1) >> CME_BLK_SIZE_SHIFT; + pCpmrHdr->coreSpecRingOffset = SWIZZLE_4_BYTE(pCpmrHdr->coreSpecRingOffset); + pCpmrHdr->coreSpecRingLength = pCmeHdr->g_cme_max_spec_ring_length; // already swizzled + } + + //Updating CME Image header + pCmeHdr->g_cme_magic_number = SWIZZLE_8_BYTE(CME_MAGIC_NUMBER); + pCmeHdr->g_cme_scom_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_hcode_length) + + SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_length) + + SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_length); + pCmeHdr->g_cme_scom_offset = + ((pCmeHdr->g_cme_scom_offset + CME_BLOCK_READ_LEN - 1 ) >> CME_BLK_SIZE_SHIFT); + //Adding to it instance ring length which is already a multiple of 32B + pCmeHdr->g_cme_scom_offset += SWIZZLE_4_BYTE(pCmeHdr->g_cme_max_spec_ring_length); + pCmeHdr->g_cme_scom_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_scom_offset); + pCmeHdr->g_cme_scom_length = SWIZZLE_4_BYTE(CORE_SCOM_RESTORE_SIZE_PER_CME); + + FAPI_INF("========================= CME Header Start =================================="); + char magicWord[16] = {0}; + uint64_t temp = pCmeHdr->g_cme_magic_number; + memcpy(magicWord, &temp, sizeof(uint64_t)); + FAPI_DBG(" Magic Num : %s", magicWord); + FAPI_INF(" HC Offset : 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_hcode_offset)); + FAPI_INF(" HC Size : 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_hcode_length)); + FAPI_INF(" PS Offset : 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_offset)); + FAPI_INF(" PS Size : 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_length)); + FAPI_INF(" CR Offset : 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_offset)); + FAPI_INF(" CR Ovrd Offset : 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_cmn_ring_ovrd_offset )); + FAPI_INF(" CR Size : 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_length)); + FAPI_INF(" CSR Offset : 0x%08X (Real offset / 32) ", SWIZZLE_4_BYTE(pCmeHdr->g_cme_core_spec_ring_offset)); + FAPI_INF(" CSR Length : 0x%08X (Real length / 32)", SWIZZLE_4_BYTE(pCmeHdr->g_cme_max_spec_ring_length) ); + FAPI_INF(" SCOM Offset : 0x%08X (Real offset / 32)", SWIZZLE_4_BYTE(pCmeHdr->g_cme_scom_offset)); + FAPI_INF(" SCOM Area Len : 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_scom_length)); + FAPI_INF(" CPMR Phy Add : 0x%016lx", SWIZZLE_8_BYTE(pCmeHdr->g_cme_cpmr_PhyAddr)); + FAPI_INF("========================= CME Header End =================================="); + + FAPI_INF("==========================CPMR Header==========================================="); + temp = pCpmrHdr->magic_number; + memcpy(magicWord, &temp, sizeof(uint64_t)); + FAPI_DBG(" Magic Num : %s", magicWord); + FAPI_INF(" CME HC Offset : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->cmeImgOffset)); + FAPI_INF(" CME HC Length : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->cmeImgLength)); + FAPI_INF(" PS Offset : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->cmePstateOffset)); + FAPI_INF(" PS Length : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->cmePstateLength)); + FAPI_INF(" CR Offset : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->cmeCommonRingOffset)); + FAPI_INF(" CR Length : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->cmeCommonRingLength)); + FAPI_INF(" CSR Offset : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->coreSpecRingOffset)); + FAPI_INF(" CSR Length : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->coreSpecRingLength)); + FAPI_INF(" Core SCOM Offset : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->coreScomOffset)); + FAPI_INF(" Core SCOM Length : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->coreScomLength )); + FAPI_INF("==================================CPMR Ends====================================="); + } - if( pCmeHdr->g_cme_max_spec_ring_length ) +//------------------------------------------------------------------------------ + /** + * @brief updates various CPMR fields which are associated with self restore code. + * @param i_pChipHomer points to start of P9 HOMER. + * @param i_fuseState core fuse status + */ + void updateCpmrHeaderSR( Homerlayout_t* i_pChipHomer, uint8_t i_fusedState ) { - pCpmrHdr->coreSpecRingOffset = ( SWIZZLE_4_BYTE(pCpmrHdr->cmeImgOffset) << CME_BLK_SIZE_SHIFT ) + - SWIZZLE_4_BYTE( pCpmrHdr->cmeImgLength) + - SWIZZLE_4_BYTE(pCpmrHdr->cmePstateLength) + - SWIZZLE_4_BYTE(pCpmrHdr->cmeCommonRingLength); - pCpmrHdr->coreSpecRingOffset = (pCpmrHdr->coreSpecRingOffset + CME_BLOCK_READ_LEN - 1) >> CME_BLK_SIZE_SHIFT; - pCpmrHdr->coreSpecRingOffset = SWIZZLE_4_BYTE(pCpmrHdr->coreSpecRingOffset); - pCpmrHdr->coreSpecRingLength = pCmeHdr->g_cme_max_spec_ring_length; // already swizzled - } + FAPI_INF("> updateCpmrHeaderSR"); + cpmrHeader_t* pCpmrHdr = + (cpmrHeader_t*) & (i_pChipHomer->cpmrRegion.selfRestoreRegion.CPMR_SR.elements.CPMRHeader); - //Updating CME Image header - pCmeHdr->g_cme_magic_number = SWIZZLE_8_BYTE(CME_MAGIC_NUMBER); - pCmeHdr->g_cme_scom_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_hcode_length) + - SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_length) + - SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_length); - pCmeHdr->g_cme_scom_offset = - ((pCmeHdr->g_cme_scom_offset + CME_BLOCK_READ_LEN - 1 ) >> CME_BLK_SIZE_SHIFT); - //Adding to it instance ring length which is already a multiple of 32B - pCmeHdr->g_cme_scom_offset += SWIZZLE_4_BYTE(pCmeHdr->g_cme_max_spec_ring_length); - pCmeHdr->g_cme_scom_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_scom_offset); - pCmeHdr->g_cme_scom_length = SWIZZLE_4_BYTE(CORE_SCOM_RESTORE_SIZE_PER_CME); - - FAPI_INF("========================= CME Header Start =================================="); - char magicWord[16] = {0}; - uint64_t temp = pCmeHdr->g_cme_magic_number; - memcpy(magicWord, &temp, sizeof(uint64_t)); - FAPI_DBG(" Magic Num : %s", magicWord); - FAPI_INF(" HC Offset : 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_hcode_offset)); - FAPI_INF(" HC Size : 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_hcode_length)); - FAPI_INF(" PS Offset : 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_offset)); - FAPI_INF(" PS Size : 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_length)); - FAPI_INF(" CR Offset : 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_offset)); - FAPI_INF(" CR Ovrd Offset : 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_cmn_ring_ovrd_offset )); - FAPI_INF(" CR Size : 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_length)); - FAPI_INF(" CSR Offset : 0x%08X (Real offset / 32) ", SWIZZLE_4_BYTE(pCmeHdr->g_cme_core_spec_ring_offset)); - FAPI_INF(" CSR Length : 0x%08X (Real length / 32)", SWIZZLE_4_BYTE(pCmeHdr->g_cme_max_spec_ring_length) ); - FAPI_INF(" SCOM Offset : 0x%08X (Real offset / 32)", SWIZZLE_4_BYTE(pCmeHdr->g_cme_scom_offset)); - FAPI_INF(" SCOM Area Len : 0x%08X", SWIZZLE_4_BYTE(pCmeHdr->g_cme_scom_length)); - FAPI_INF(" CPMR Phy Add : 0x%016lx", SWIZZLE_8_BYTE(pCmeHdr->g_cme_cpmr_PhyAddr)); - FAPI_INF("========================= CME Header End =================================="); - - FAPI_INF("==========================CPMR Header==========================================="); - temp = pCpmrHdr->magic_number; - memcpy(magicWord, &temp, sizeof(uint64_t)); - FAPI_DBG(" Magic Num : %s", magicWord); - FAPI_INF(" CME HC Offset : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->cmeImgOffset)); - FAPI_INF(" CME HC Length : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->cmeImgLength)); - FAPI_INF(" PS Offset : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->cmePstateOffset)); - FAPI_INF(" PS Length : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->cmePstateLength)); - FAPI_INF(" CR Offset : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->cmeCommonRingOffset)); - FAPI_INF(" CR Length : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->cmeCommonRingLength)); - FAPI_INF(" CSR Offset : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->coreSpecRingOffset)); - FAPI_INF(" CSR Length : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->coreSpecRingLength)); - FAPI_INF(" Core SCOM Offset : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->coreScomOffset)); - FAPI_INF(" Core SCOM Length : 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->coreScomLength )); - FAPI_INF("==================================CPMR Ends====================================="); - -} + cmeHeader_t* pCmeHdr = (cmeHeader_t*) & i_pChipHomer->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE]; + //populate CPMR header + pCpmrHdr->fusedModeStatus = i_fusedState ? uint32_t(FUSED_CORE_MODE) : + uint32_t(NONFUSED_CORE_MODE); + pCmeHdr->g_cme_mode_flags = SWIZZLE_4_BYTE(i_fusedState ? 1 : 0); + + FAPI_INF("CPMR SR"); + FAPI_INF(" Fuse Mode = 0x%08X CME Image Flag = 0x%08X", pCpmrHdr->fusedModeStatus, + SWIZZLE_4_BYTE(pCmeHdr->g_cme_mode_flags)); + FAPI_DBG(" Offset = 0x%08X, Header value 0x%08X (Real offset / 32)", + SWIZZLE_4_BYTE(pCpmrHdr->cmeImgOffset) * 32, + SWIZZLE_4_BYTE(pCpmrHdr->cmeImgOffset)); + FAPI_DBG(" Size = 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->cmeImgLength)); + + FAPI_INF("< updateCpmrHeaderSR"); + } //------------------------------------------------------------------------------ -/** - * @brief updates various CPMR fields which are associated with self restore code. - * @param i_pChipHomer points to start of P9 HOMER. - * @param i_fuseState core fuse status - */ -void updateCpmrHeaderSR( Homerlayout_t* i_pChipHomer, uint8_t i_fusedState ) -{ - FAPI_INF("> updateCpmrHeaderSR"); - cpmrHeader_t* pCpmrHdr = - (cpmrHeader_t*) & (i_pChipHomer->cpmrRegion.selfRestoreRegion.CPMR_SR.elements.CPMRHeader); - - cmeHeader_t* pCmeHdr = (cmeHeader_t*) & i_pChipHomer->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE]; - //populate CPMR header - pCpmrHdr->fusedModeStatus = i_fusedState ? uint32_t(FUSED_CORE_MODE) : - uint32_t(NONFUSED_CORE_MODE); - pCmeHdr->g_cme_mode_flags = SWIZZLE_4_BYTE(i_fusedState ? 1 : 0); - - FAPI_INF("CPMR SR"); - FAPI_INF(" Fuse Mode = 0x%08X CME Image Flag = 0x%08X", pCpmrHdr->fusedModeStatus, - SWIZZLE_4_BYTE(pCmeHdr->g_cme_mode_flags)); - FAPI_DBG(" Offset = 0x%08X, Header value 0x%08X (Real offset / 32)", - SWIZZLE_4_BYTE(pCpmrHdr->cmeImgOffset) * 32, - SWIZZLE_4_BYTE(pCpmrHdr->cmeImgOffset)); - FAPI_DBG(" Size = 0x%08X", SWIZZLE_4_BYTE(pCpmrHdr->cmeImgLength)); - - FAPI_INF("< updateCpmrHeaderSR"); -} + /** + * @brief updates various QPMR header region in HOMER. + * @param i_pChipHomer points to start of P9 HOMER. + * @param io_qpmrHdr temp instance of QpmrHeaderLayout_t used for data collection. + */ + void updateQpmrHeader( Homerlayout_t* i_pChipHomer, QpmrHeaderLayout_t& io_qpmrHdr ) + { + QpmrHeaderLayout_t* pQpmrHdr = ( QpmrHeaderLayout_t*) & (i_pChipHomer->qpmrRegion.sgpeRegion.qpmrHeader); + sgpeHeader_t* pSgpeHdr = (sgpeHeader_t*)& i_pChipHomer->qpmrRegion.sgpeRegion.sgpeSramImage[SGPE_INT_VECTOR_SIZE]; + memcpy( pQpmrHdr, &io_qpmrHdr, sizeof( QpmrHeaderLayout_t ) ); + //FIXME Populating headers fields with max possible values for now. This is to keep things in line with SGPE + //bootloader design. SGPE bootloader doesn't expect a hole in image layout how ever due to current design of + //hcode image build there are holes between various section of image say common and instance ring. + + pQpmrHdr->magic_number = SWIZZLE_8_BYTE(QPMR_MAGIC_NUMBER); + pSgpeHdr->g_sgpe_magic_number = SWIZZLE_8_BYTE(SGPE_MAGIC_NUMBER); + + FAPI_INF("==============================QPMR=================================="); + char magicWord[16] = {0}; + uint64_t temp = pQpmrHdr->magic_number; + memcpy(magicWord, &temp, sizeof(uint64_t)); + FAPI_DBG(" Magic Num : %s", magicWord); + FAPI_DBG(" Build Date : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->buildDate)); + FAPI_DBG(" Version : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->buildVersion)); + FAPI_DBG(" BC Offset : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->bootCopierOffset)); + FAPI_DBG(" BL Offset : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->bootLoaderOffset)); + FAPI_DBG(" BL Size : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->bootLoaderLength)); + FAPI_DBG(" HC Offset : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->sgpeImgOffset)); + FAPI_DBG(" HC Size : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->sgpeImgLength)); + FAPI_DBG(" Cmn Ring Offset : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->quadCommonRingOffset) ); + FAPI_DBG(" Cmn Ring Length : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->quadCommonRingLength) ); + FAPI_DBG(" Cmn Ring Ovrd Offset : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->quadCommonOvrdOffset) ); + FAPI_DBG(" Cmn Ring Ovrd Length : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->quadCommonOvrdLength) ); + FAPI_DBG(" Quad Spec Ring Offset : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->quadSpecRingOffset) ); + FAPI_DBG(" Quad Spec Ring Length : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->quadSpecRingLength) ); + FAPI_DBG("==============================QPMR Ends=============================="); + + FAPI_DBG("===========================SGPE Image Hdr============================="); + temp = pSgpeHdr->g_sgpe_magic_number; + memcpy(magicWord, &temp, sizeof(uint64_t)); + FAPI_DBG(" Magic Num : %s", magicWord); + FAPI_DBG(" Cmn Ring Offset : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_cmn_ring_occ_offset )); + FAPI_DBG(" Override Offset : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_cmn_ring_ovrd_occ_offset )); + FAPI_DBG(" Flags : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_reserve_flags )); + FAPI_DBG(" Quad Spec Ring Offset : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_spec_ring_occ_offset )); + FAPI_DBG(" Quad SCOM SRAM Offset : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_scom_offset)); + FAPI_DBG(" Quad SCOM Mem Offset : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_scom_mem_offset)); + FAPI_DBG(" Quad SCOM Mem Length : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_scom_mem_length )); + FAPI_DBG(" 24x7 Offset : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_24x7_offset )); + FAPI_DBG(" 24x7 Length : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_24x7_length )); + FAPI_DBG("========================SGPE Image Hdr Ends==========================="); -//------------------------------------------------------------------------------ -/** - * @brief updates various QPMR header region in HOMER. - * @param i_pChipHomer points to start of P9 HOMER. - * @param io_qpmrHdr temp instance of QpmrHeaderLayout_t used for data collection. - */ -uint32_t updateQpmrHeader( Homerlayout_t* i_pChipHomer, QpmrHeaderLayout_t& io_qpmrHdr ) -{ - uint32_t rc = IMG_BUILD_SUCCESS; - - - QpmrHeaderLayout_t* pQpmrHdr = ( QpmrHeaderLayout_t*) & (i_pChipHomer->qpmrRegion.sgpeRegion.qpmrHeader); - sgpeHeader_t* pSgpeHdr = (sgpeHeader_t*)& i_pChipHomer->qpmrRegion.sgpeRegion.sgpeSramImage[SGPE_INT_VECTOR_SIZE]; - memcpy( pQpmrHdr, &io_qpmrHdr, sizeof( QpmrHeaderLayout_t ) ); - //FIXME Populating headers fields with max possible values for now. This is to keep things in line with SGPE - //bootloader design. SGPE bootloader doesn't expect a hole in image layout how ever due to current design of - //hcode image build there are holes between various section of image say common and instance ring. - - pQpmrHdr->magic_number = SWIZZLE_8_BYTE(QPMR_MAGIC_NUMBER); - pSgpeHdr->g_sgpe_magic_number = SWIZZLE_8_BYTE(SGPE_MAGIC_NUMBER); - - FAPI_INF("==============================QPMR=================================="); - char magicWord[16] = {0}; - uint64_t temp = pQpmrHdr->magic_number; - memcpy(magicWord, &temp, sizeof(uint64_t)); - FAPI_DBG(" Magic Num : %s", magicWord); - FAPI_DBG(" Build Date : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->buildDate)); - FAPI_DBG(" Version : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->buildVersion)); - FAPI_DBG(" BC Offset : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->bootCopierOffset)); - FAPI_DBG(" BL Offset : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->bootLoaderOffset)); - FAPI_DBG(" BL Size : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->bootLoaderLength)); - FAPI_DBG(" HC Offset : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->sgpeImgOffset)); - FAPI_DBG(" HC Size : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->sgpeImgLength)); - FAPI_DBG(" Cmn Ring Offset : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->quadCommonRingOffset) ); - FAPI_DBG(" Cmn Ring Length : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->quadCommonRingLength) ); - FAPI_DBG(" Cmn Ring Ovrd Offset : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->quadCommonOvrdOffset) ); - FAPI_DBG(" Cmn Ring Ovrd Length : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->quadCommonOvrdLength) ); - FAPI_DBG(" Quad Spec Ring Offset : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->quadSpecRingOffset) ); - FAPI_DBG(" Quad Spec Ring Length : 0x%08X", SWIZZLE_4_BYTE(pQpmrHdr->quadSpecRingLength) ); - FAPI_DBG("==============================QPMR Ends=============================="); - - FAPI_DBG("===========================SGPE Image Hdr============================="); - temp = pSgpeHdr->g_sgpe_magic_number; - memcpy(magicWord, &temp, sizeof(uint64_t)); - FAPI_DBG(" Magic Num : %s", magicWord); - FAPI_DBG(" Cmn Ring Offset : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_cmn_ring_occ_offset )); - FAPI_DBG(" Override Offset : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_cmn_ring_ovrd_occ_offset )); - FAPI_DBG(" Flags : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_reserve_flags )); - FAPI_DBG(" Quad Spec Ring Offset : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_spec_ring_occ_offset )); - FAPI_DBG(" Quad SCOM SRAM Offset : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_scom_offset)); - FAPI_DBG(" Quad SCOM Mem Offset : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_scom_mem_offset)); - FAPI_DBG(" Quad SCOM Mem Length : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_scom_mem_length )); - FAPI_DBG(" 24x7 Offset : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_24x7_offset )); - FAPI_DBG(" 24x7 Length : 0x%08x", SWIZZLE_4_BYTE(pSgpeHdr->g_sgpe_24x7_length )); - FAPI_DBG("========================SGPE Image Hdr Ends==========================="); - - return rc; -} + } //------------------------------------------------------------------------------ -/** - * @brief copies image section associated with SGPE from HW Image to HOMER - * @param[in] i_pImageIn points to start of hardware image. - * @param[in] i_pChipHomer points to HOMER image. - * @param[in] i_imgType image sections to be built - */ -uint32_t buildSgpeImage( void* const i_pImageIn, Homerlayout_t* i_pChipHomer, ImageType_t i_imgType, - QpmrHeaderLayout_t& o_qpmrHdr ) -{ - FAPI_INF("> buildSgpeImage"); - uint32_t retCode = IMG_BUILD_SUCCESS; - - do + /** + * @brief copies image section associated with SGPE from HW Image to HOMER + * @param[in] i_pImageIn points to start of hardware image. + * @param[in] i_pChipHomer points to HOMER image. + * @param[in] i_imgType image sections to be built + */ + uint32_t buildSgpeImage( void* const i_pImageIn, Homerlayout_t* i_pChipHomer, ImageType_t i_imgType, + QpmrHeaderLayout_t& o_qpmrHdr ) { - uint32_t rcTemp = 0; - //Let us find XIP Header for SGPE - P9XipSection ppeSection; - uint8_t* pSgpeImg = NULL; + FAPI_INF("> buildSgpeImage"); + uint32_t retCode = IMG_BUILD_SUCCESS; - if(!i_imgType.sgpeHcodeBuild ) + do { - break; - } + uint32_t rcTemp = 0; + //Let us find XIP Header for SGPE + P9XipSection ppeSection; + uint8_t* pSgpeImg = NULL; - // Let us start with a clean slate in quad common ring area. - memset( (uint8_t*)&i_pChipHomer->qpmrRegion.sgpeRegion.sgpeSramImage, 0x00, SGPE_IMAGE_SIZE ); - rcTemp = p9_xip_get_section( i_pImageIn, P9_XIP_SECTION_HW_SGPE, &ppeSection ); + if(!i_imgType.sgpeHcodeBuild ) + { + break; + } - if( rcTemp ) - { - FAPI_ERR("Failed to get SGPE XIP Image Header" ); - retCode = BUILD_FAIL_SGPE_IMAGE; - break; - } + // Let us start with a clean slate in quad common ring area. + memset( (uint8_t*)&i_pChipHomer->qpmrRegion.sgpeRegion.sgpeSramImage, 0x00, SGPE_IMAGE_SIZE ); + rcTemp = p9_xip_get_section( i_pImageIn, P9_XIP_SECTION_HW_SGPE, &ppeSection ); - pSgpeImg = ppeSection.iv_offset + (uint8_t*) (i_pImageIn ); - FAPI_DBG("HW image SGPE Offset = 0x%08X", ppeSection.iv_offset); + if( rcTemp ) + { + FAPI_ERR("Failed to get SGPE XIP Image Header" ); + retCode = BUILD_FAIL_SGPE_IMAGE; + break; + } - FAPI_INF("QPMR Header"); - rcTemp = copySectionToHomer( i_pChipHomer->qpmrRegion.sgpeRegion.qpmrHeader, - pSgpeImg, - P9_XIP_SECTION_SGPE_QPMR, - PLAT_SGPE, - ppeSection ); + pSgpeImg = ppeSection.iv_offset + (uint8_t*) (i_pImageIn ); + FAPI_DBG("HW image SGPE Offset = 0x%08X", ppeSection.iv_offset); - if( rcTemp ) - { - FAPI_ERR("Failed to copy QPMR Header"); - retCode = BUILD_FAIL_SGPE_QPMR; - break; - } + FAPI_INF("QPMR Header"); + rcTemp = copySectionToHomer( i_pChipHomer->qpmrRegion.sgpeRegion.qpmrHeader, + pSgpeImg, + P9_XIP_SECTION_SGPE_QPMR, + PLAT_SGPE, + ppeSection ); - //updating local instance of QPMR header - memcpy( &o_qpmrHdr, i_pChipHomer->qpmrRegion.sgpeRegion.qpmrHeader, sizeof(QpmrHeaderLayout_t)); + if( rcTemp ) + { + FAPI_ERR("Failed to copy QPMR Header"); + retCode = BUILD_FAIL_SGPE_QPMR; + break; + } - FAPI_DBG("SGPE Boot Copier"); - rcTemp = copySectionToHomer( i_pChipHomer->qpmrRegion.sgpeRegion.l1BootLoader, - pSgpeImg, - P9_XIP_SECTION_SGPE_LVL1_BL, - PLAT_SGPE, - ppeSection ); + //updating local instance of QPMR header + memcpy( &o_qpmrHdr, i_pChipHomer->qpmrRegion.sgpeRegion.qpmrHeader, sizeof(QpmrHeaderLayout_t)); - if( rcTemp ) - { - FAPI_ERR("Failed to copy Level1 bootloader"); - retCode = BUILD_FAIL_SGPE_BL1; - break; - } + FAPI_DBG("SGPE Boot Copier"); + rcTemp = copySectionToHomer( i_pChipHomer->qpmrRegion.sgpeRegion.l1BootLoader, + pSgpeImg, + P9_XIP_SECTION_SGPE_LVL1_BL, + PLAT_SGPE, + ppeSection ); - o_qpmrHdr.bootCopierOffset = QPMR_HEADER_SIZE; - FAPI_DBG("SGPE Boot Copier Size = 0x%08X", - o_qpmrHdr.bootCopierOffset); + if( rcTemp ) + { + FAPI_ERR("Failed to copy Level1 bootloader"); + retCode = BUILD_FAIL_SGPE_BL1; + break; + } - FAPI_DBG(" SGPE Boot Loader"); + o_qpmrHdr.bootCopierOffset = QPMR_HEADER_SIZE; + FAPI_DBG("SGPE Boot Copier Size = 0x%08X", + o_qpmrHdr.bootCopierOffset); - rcTemp = copySectionToHomer( i_pChipHomer->qpmrRegion.sgpeRegion.l2BootLoader, - pSgpeImg, - P9_XIP_SECTION_SGPE_LVL2_BL, - PLAT_SGPE, - ppeSection ); + FAPI_DBG(" SGPE Boot Loader"); - if( rcTemp ) - { - FAPI_ERR("Failed to copy Level2 bootloader"); - retCode = BUILD_FAIL_SGPE_BL2; - break; - } + rcTemp = copySectionToHomer( i_pChipHomer->qpmrRegion.sgpeRegion.l2BootLoader, + pSgpeImg, + P9_XIP_SECTION_SGPE_LVL2_BL, + PLAT_SGPE, + ppeSection ); + + if( rcTemp ) + { + FAPI_ERR("Failed to copy Level2 bootloader"); + retCode = BUILD_FAIL_SGPE_BL2; + break; + } - o_qpmrHdr.bootLoaderOffset = o_qpmrHdr.bootCopierOffset + SGPE_BOOT_COPIER_SIZE; - o_qpmrHdr.bootLoaderLength = ppeSection.iv_size; + o_qpmrHdr.bootLoaderOffset = o_qpmrHdr.bootCopierOffset + SGPE_BOOT_COPIER_SIZE; + o_qpmrHdr.bootLoaderLength = ppeSection.iv_size; - FAPI_INF("SGPE Boot Loader QPMR Offset = 0x%08X, Size = 0x%08X", - o_qpmrHdr.bootLoaderOffset, o_qpmrHdr.bootLoaderLength); + FAPI_INF("SGPE Boot Loader QPMR Offset = 0x%08X, Size = 0x%08X", + o_qpmrHdr.bootLoaderOffset, o_qpmrHdr.bootLoaderLength); - rcTemp = copySectionToHomer( i_pChipHomer->qpmrRegion.sgpeRegion.sgpeSramImage, - pSgpeImg, - P9_XIP_SECTION_SGPE_HCODE, - PLAT_SGPE, - ppeSection ); + rcTemp = copySectionToHomer( i_pChipHomer->qpmrRegion.sgpeRegion.sgpeSramImage, + pSgpeImg, + P9_XIP_SECTION_SGPE_HCODE, + PLAT_SGPE, + ppeSection ); - if( rcTemp ) - { - FAPI_ERR("Failed to copy SGPE hcode"); - retCode = BUILD_FAIL_SGPE_HCODE; - break; - } + if( rcTemp ) + { + FAPI_ERR("Failed to copy SGPE hcode"); + retCode = BUILD_FAIL_SGPE_HCODE; + break; + } - memset( i_pChipHomer->qpmrRegion.cacheScomRegion, 0x00, - QUAD_SCOM_RESTORE_SIZE_TOTAL ); + memset( i_pChipHomer->qpmrRegion.cacheScomRegion, 0x00, + QUAD_SCOM_RESTORE_SIZE_TOTAL ); - o_qpmrHdr.sgpeImgOffset = o_qpmrHdr.bootLoaderOffset + SGPE_BOOT_LOADER_SIZE; + o_qpmrHdr.sgpeImgOffset = o_qpmrHdr.bootLoaderOffset + SGPE_BOOT_LOADER_SIZE; - FAPI_DBG("SGPE Hcode QPMR Offset = 0x%08X, Size = 0x%08X", - SWIZZLE_4_BYTE(o_qpmrHdr.sgpeImgOffset), - SWIZZLE_4_BYTE(o_qpmrHdr.sgpeImgLength)); + FAPI_DBG("SGPE Hcode QPMR Offset = 0x%08X, Size = 0x%08X", + SWIZZLE_4_BYTE(o_qpmrHdr.sgpeImgOffset), + SWIZZLE_4_BYTE(o_qpmrHdr.sgpeImgLength)); - o_qpmrHdr.sgpeImgOffset = o_qpmrHdr.bootLoaderOffset + SGPE_BOOT_LOADER_SIZE; + o_qpmrHdr.sgpeImgOffset = o_qpmrHdr.bootLoaderOffset + SGPE_BOOT_LOADER_SIZE; - o_qpmrHdr.sgpeImgLength = SWIZZLE_4_BYTE(ppeSection.iv_size); - o_qpmrHdr.bootLoaderOffset = SWIZZLE_4_BYTE(o_qpmrHdr.bootLoaderOffset); - //let us take care of endianess now. - o_qpmrHdr.bootCopierOffset = SWIZZLE_4_BYTE(o_qpmrHdr.bootCopierOffset); - o_qpmrHdr.bootLoaderLength = SWIZZLE_4_BYTE(o_qpmrHdr.bootLoaderLength); - o_qpmrHdr.sgpeImgOffset = SWIZZLE_4_BYTE(o_qpmrHdr.sgpeImgOffset); + o_qpmrHdr.sgpeImgLength = SWIZZLE_4_BYTE(ppeSection.iv_size); + o_qpmrHdr.bootLoaderOffset = SWIZZLE_4_BYTE(o_qpmrHdr.bootLoaderOffset); + //let us take care of endianess now. + o_qpmrHdr.bootCopierOffset = SWIZZLE_4_BYTE(o_qpmrHdr.bootCopierOffset); + o_qpmrHdr.bootLoaderLength = SWIZZLE_4_BYTE(o_qpmrHdr.bootLoaderLength); + o_qpmrHdr.sgpeImgOffset = SWIZZLE_4_BYTE(o_qpmrHdr.sgpeImgOffset); - //FIXME Need to confirm it - o_qpmrHdr.quadScomOffset = SWIZZLE_4_BYTE(QUAD_SCOM_RESTORE_QPMR_OFFSET); + //FIXME Need to confirm it + o_qpmrHdr.quadScomOffset = SWIZZLE_4_BYTE(QUAD_SCOM_RESTORE_QPMR_OFFSET); - sgpeHeader_t* pImgHdr = (sgpeHeader_t*)& i_pChipHomer->qpmrRegion.sgpeRegion.sgpeSramImage[SGPE_INT_VECTOR_SIZE]; - pImgHdr->g_sgpe_ivpr_address = OCC_SRAM_SGPE_BASE_ADDR; - pImgHdr->g_sgpe_cmn_ring_occ_offset = o_qpmrHdr.sgpeImgLength; - pImgHdr->g_sgpe_cmn_ring_ovrd_occ_offset = 0; - pImgHdr->g_sgpe_spec_ring_occ_offset = 0; - pImgHdr->g_sgpe_scom_offset = 0; + sgpeHeader_t* pImgHdr = (sgpeHeader_t*)& i_pChipHomer->qpmrRegion.sgpeRegion.sgpeSramImage[SGPE_INT_VECTOR_SIZE]; + pImgHdr->g_sgpe_ivpr_address = OCC_SRAM_SGPE_BASE_ADDR; + pImgHdr->g_sgpe_cmn_ring_occ_offset = o_qpmrHdr.sgpeImgLength; + pImgHdr->g_sgpe_cmn_ring_ovrd_occ_offset = 0; + pImgHdr->g_sgpe_spec_ring_occ_offset = 0; + pImgHdr->g_sgpe_scom_offset = 0; + FAPI_INF("SGPE Header"); + FAPI_INF(" Magic Num = 0x%16lX", SWIZZLE_8_BYTE(pImgHdr->g_sgpe_magic_number)); + FAPI_INF(" Reset Addr = 0x%08X", SWIZZLE_4_BYTE(pImgHdr->g_sgpe_reset_address)); + FAPI_INF(" IVPR Addr = 0x%08X", SWIZZLE_4_BYTE(pImgHdr->g_sgpe_ivpr_address)); + FAPI_INF(" Build Date = 0x%08X", SWIZZLE_4_BYTE(pImgHdr->g_sgpe_build_date)); + FAPI_INF(" Version = 0x%08X", SWIZZLE_4_BYTE(pImgHdr->g_sgpe_build_ver)); + FAPI_INF(" CR OCC Offset = 0x%08X", SWIZZLE_4_BYTE(pImgHdr->g_sgpe_cmn_ring_occ_offset)); + FAPI_INF(" CR Ovrd Offset = 0x%08X", SWIZZLE_4_BYTE(pImgHdr->g_sgpe_cmn_ring_ovrd_occ_offset)); - FAPI_INF("SGPE Header"); - FAPI_INF(" Magic Num = 0x%16lX", SWIZZLE_8_BYTE(pImgHdr->g_sgpe_magic_number)); - FAPI_INF(" Reset Addr = 0x%08X", SWIZZLE_4_BYTE(pImgHdr->g_sgpe_reset_address)); - FAPI_INF(" IVPR Addr = 0x%08X", SWIZZLE_4_BYTE(pImgHdr->g_sgpe_ivpr_address)); - FAPI_INF(" Build Date = 0x%08X", SWIZZLE_4_BYTE(pImgHdr->g_sgpe_build_date)); - FAPI_INF(" Version = 0x%08X", SWIZZLE_4_BYTE(pImgHdr->g_sgpe_build_ver)); - FAPI_INF(" CR OCC Offset = 0x%08X", SWIZZLE_4_BYTE(pImgHdr->g_sgpe_cmn_ring_occ_offset)); - FAPI_INF(" CR Ovrd Offset = 0x%08X", SWIZZLE_4_BYTE(pImgHdr->g_sgpe_cmn_ring_ovrd_occ_offset)); + } + while(0); + FAPI_INF("< buildSgpeImage") + return retCode; } - while(0); - - FAPI_INF("< buildSgpeImag") - return retCode; -} //------------------------------------------------------------------------------ -/** - * @brief copies core self restore section from hardware image to HOMER. - * @param[in] i_pImageIn points to start of hardware image. - * @param[in] i_pChipHomer points to HOMER image. - * @param[in] i_imgType image sections to be built - * @param[in] i_fuseState fuse state of core. - * @return IMG_BUILD_SUCCESS if function succeeds, error code otherwise. - */ -uint32_t buildCoreRestoreImage( void* const i_pImageIn, - Homerlayout_t* i_pChipHomer, ImageType_t i_imgType, - uint8_t i_fusedState ) -{ - uint32_t retCode = IMG_BUILD_SUCCESS; - - do + /** + * @brief copies core self restore section from hardware image to HOMER. + * @param[in] i_pImageIn points to start of hardware image. + * @param[in] i_pChipHomer points to HOMER image. + * @param[in] i_imgType image sections to be built + * @param[in] i_fuseState fuse state of core. + * @return IMG_BUILD_SUCCESS if function succeeds, error code otherwise. + */ + uint32_t buildCoreRestoreImage( void* const i_pImageIn, + Homerlayout_t* i_pChipHomer, ImageType_t i_imgType, + uint8_t i_fusedState ) { - uint32_t rcTemp = 0; - //Let us find XIP Header for Core Self Restore Image - P9XipSection ppeSection; - uint8_t* pSelfRestImg = NULL; - rcTemp = p9_xip_get_section( i_pImageIn, P9_XIP_SECTION_HW_RESTORE, &ppeSection ); + uint32_t retCode = IMG_BUILD_SUCCESS; - if( rcTemp ) + do { - FAPI_ERR("Failed to get P9 Self restore Image Header" ); - retCode = BUILD_FAIL_SELF_REST_IMAGE; - break; - } + uint32_t rcTemp = 0; + //Let us find XIP Header for Core Self Restore Image + P9XipSection ppeSection; + uint8_t* pSelfRestImg = NULL; + rcTemp = p9_xip_get_section( i_pImageIn, P9_XIP_SECTION_HW_RESTORE, &ppeSection ); - pSelfRestImg = ppeSection.iv_offset + (uint8_t*) (i_pImageIn ); + if( rcTemp ) + { + FAPI_ERR("Failed to get P9 Self restore Image Header" ); + retCode = BUILD_FAIL_SELF_REST_IMAGE; + break; + } - if( i_imgType.selfRestoreBuild ) - { - // first 256 bytes is expected to be zero here. It is by purpose. Just after this step, - // we will add CPMR header in that area. - FAPI_INF("Self Restore Image install"); - FAPI_INF(" Offset = 0x%08X, Size = 0x%08X", - ppeSection.iv_offset, ppeSection.iv_size); + pSelfRestImg = ppeSection.iv_offset + (uint8_t*) (i_pImageIn ); + + if( i_imgType.selfRestoreBuild ) + { + // first 256 bytes is expected to be zero here. It is by purpose. Just after this step, + // we will add CPMR header in that area. + FAPI_INF("Self Restore Image install"); + FAPI_INF(" Offset = 0x%08X, Size = 0x%08X", + ppeSection.iv_offset, ppeSection.iv_size); + rcTemp = copySectionToHomer( i_pChipHomer->cpmrRegion.selfRestoreRegion.CPMR_SR.region, + pSelfRestImg, + P9_XIP_SECTION_RESTORE_SELF, + PLAT_SELF, + ppeSection ); + + if( rcTemp ) + { + FAPI_ERR("Failed to copy SRESET Handler"); + retCode = BUILD_FAIL_SRESET_HNDLR; + break; + } + + } + + // adding CPMR header in first 256 bytes of the CPMR. + FAPI_INF("Overlay CPMR Header at the beginning of CPMR"); rcTemp = copySectionToHomer( i_pChipHomer->cpmrRegion.selfRestoreRegion.CPMR_SR.region, pSelfRestImg, - P9_XIP_SECTION_RESTORE_SELF, + P9_XIP_SECTION_RESTORE_CPMR, PLAT_SELF, ppeSection ); if( rcTemp ) { - FAPI_ERR("Failed to copy SRESET Handler"); - retCode = BUILD_FAIL_SRESET_HNDLR; + FAPI_ERR("Failed to copy CPMR header"); + retCode = BUILD_FAIL_CPMR_HDR; break; } - } + //Pad undefined or runtime section with ATTN Opcode + //Padding SPR restore area with ATTN Opcode + FAPI_INF("Padding CPMR Core Restore portion with Attn opcodes"); + uint32_t wordCnt = 0; + uint32_t l_fillBlr = SWIZZLE_4_BYTE(SELF_RESTORE_BLR_INST); + uint32_t l_fillAttn = SWIZZLE_4_BYTE(CORE_RESTORE_PAD_OPCODE); - // adding CPMR header in first 256 bytes of the CPMR. - FAPI_INF("Overlay CPMR Header at the beginning of CPMR"); - rcTemp = copySectionToHomer( i_pChipHomer->cpmrRegion.selfRestoreRegion.CPMR_SR.region, - pSelfRestImg, - P9_XIP_SECTION_RESTORE_CPMR, - PLAT_SELF, - ppeSection ); - - if( rcTemp ) - { - FAPI_ERR("Failed to copy CPMR header"); - retCode = BUILD_FAIL_CPMR_HDR; - break; - } + while( wordCnt < SELF_RESTORE_CORE_REGS_SIZE ) + { - //Pad undefined or runtime section with ATTN Opcode - //Padding SPR restore area with ATTN Opcode - FAPI_INF("Padding CPMR Core Restore portion with Attn opcodes"); - uint32_t wordCnt = 0; - uint32_t l_fillBlr = SWIZZLE_4_BYTE(SELF_RESTORE_BLR_INST); - uint32_t l_fillAttn = SWIZZLE_4_BYTE(CORE_RESTORE_PAD_OPCODE); + uint32_t l_fillPattern = 0; - while( wordCnt < SELF_RESTORE_CORE_REGS_SIZE ) - { + if( ( 0 == wordCnt ) || ( 0 == ( wordCnt % CORE_RESTORE_SIZE_PER_THREAD ) )) + { + l_fillPattern = l_fillBlr; + } + else + { + l_fillPattern = l_fillAttn; + } - uint32_t l_fillPattern = 0; + //Lab Need: First instruction in thread SPR restore region should be a blr instruction. + //This helps in a specific lab scenario. If Self Restore region is populated only for + //select number of threads, other threads will not hit attention during the self restore + //sequence. Instead, execution will hit a blr and control should return to thread launcher + //region. - if( ( 0 == wordCnt ) || ( 0 == ( wordCnt % CORE_RESTORE_SIZE_PER_THREAD ) )) - { - l_fillPattern = l_fillBlr; - } - else - { - l_fillPattern = l_fillAttn; + memcpy( (uint32_t*)&i_pChipHomer->cpmrRegion.selfRestoreRegion.coreSelfRestore[wordCnt], + &l_fillPattern, + sizeof( uint32_t )); + wordCnt += 4; } - //Lab Need: First instruction in thread SPR restore region should be a blr instruction. - //This helps in a specific lab scenario. If Self Restore region is populated only for - //select number of threads, other threads will not hit attention during the self restore - //sequence. Instead, execution will hit a blr and control should return to thread launcher - //region. + updateCpmrHeaderSR( i_pChipHomer, i_fusedState ); - memcpy( (uint32_t*)&i_pChipHomer->cpmrRegion.selfRestoreRegion.coreSelfRestore[wordCnt], - &l_fillPattern, - sizeof( uint32_t )); - wordCnt += 4; + memset( i_pChipHomer->cpmrRegion.selfRestoreRegion.coreScom, + 0x00, CORE_SCOM_RESTORE_SIZE_TOTAL ); } + while(0); - updateCpmrHeaderSR( i_pChipHomer, i_fusedState ); - - memset( i_pChipHomer->cpmrRegion.selfRestoreRegion.coreScom, - 0x00, CORE_SCOM_RESTORE_SIZE_TOTAL ); + return retCode; } - while(0); - - return retCode; -} //------------------------------------------------------------------------------ -/** - * @brief copies cme section from hardware image to HOMER. - * @param[in] i_pImageIn points to start of hardware image. - * @param[in] i_pChipHomer points to HOMER image. - * @param[in] i_imgType image sections to be built - * @return IMG_BUILD_SUCCESS if function succeeds, error code otherwise. - */ -uint32_t buildCmeImage( void* const i_pImageIn, Homerlayout_t* i_pChipHomer, - ImageType_t i_imgType, uint64_t i_cpmrPhyAdd ) -{ - uint32_t retCode = IMG_BUILD_SUCCESS; - - do + /** + * @brief copies cme section from hardware image to HOMER. + * @param[in] i_pImageIn points to start of hardware image. + * @param[in] i_pChipHomer points to HOMER image. + * @param[in] i_imgType image sections to be built + * @return IMG_BUILD_SUCCESS if function succeeds, error code otherwise. + */ + uint32_t buildCmeImage( void* const i_pImageIn, Homerlayout_t* i_pChipHomer, + ImageType_t i_imgType, uint64_t i_cpmrPhyAdd ) { - uint32_t rcTemp = 0; - //Let us find XIP Header for CME Image - P9XipSection ppeSection; - uint8_t* pCmeImg = NULL; - - rcTemp = p9_xip_get_section( i_pImageIn, P9_XIP_SECTION_HW_CME, &ppeSection ); + uint32_t retCode = IMG_BUILD_SUCCESS; - if( rcTemp ) + do { - FAPI_ERR("Failed to get CME Image XIP header" ); - retCode = BUILD_FAIL_CME_IMAGE; - break; - } + uint32_t rcTemp = 0; + //Let us find XIP Header for CME Image + P9XipSection ppeSection; + uint8_t* pCmeImg = NULL; - pCmeImg = ppeSection.iv_offset + (uint8_t*) (i_pImageIn ); - FAPI_DBG("ppeSection.iv_offset = 0x%08X, ppeSection.iv_size = 0x%08X", - ppeSection.iv_offset, ppeSection.iv_size); + rcTemp = p9_xip_get_section( i_pImageIn, P9_XIP_SECTION_HW_CME, &ppeSection ); - if( !i_imgType.cmeHcodeBuild ) - { - break; - } + if( rcTemp ) + { + FAPI_ERR("Failed to get CME Image XIP header" ); + retCode = BUILD_FAIL_CME_IMAGE; + break; + } - memset(i_pChipHomer->cpmrRegion.cmeSramRegion, 0x00, CME_REGION_SIZE); + pCmeImg = ppeSection.iv_offset + (uint8_t*) (i_pImageIn ); + FAPI_DBG("ppeSection.iv_offset = 0x%08X, ppeSection.iv_size = 0x%08X", + ppeSection.iv_offset, ppeSection.iv_size); - // The image in the HW Image has the Interrupt Vectors, CME Header and Debug - // Pointers already included. - rcTemp = copySectionToHomer( i_pChipHomer->cpmrRegion.cmeSramRegion, pCmeImg, - P9_XIP_SECTION_CME_HCODE, - PLAT_CME, - ppeSection ); + if( !i_imgType.cmeHcodeBuild ) + { + break; + } - if( rcTemp ) - { - FAPI_ERR("Failed to append CME Hcode"); - retCode = BUILD_FAIL_CME_HCODE; - break; - } + memset(i_pChipHomer->cpmrRegion.cmeSramRegion, 0x00, CME_REGION_SIZE); - // Initializing CME Image header - // Names have g_ prefix as these global variables for CME Hcode - // Note: Only the *memory* addresses are updated - cmeHeader_t* pImgHdr = (cmeHeader_t*) & i_pChipHomer->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE]; - pImgHdr->g_cme_hcode_offset = CME_SRAM_HCODE_OFFSET; - pImgHdr->g_cme_hcode_length = ppeSection.iv_size; - - //Populating common ring offset here. So, that other scan ring related field can be updated. - pImgHdr->g_cme_cpmr_PhyAddr = (i_cpmrPhyAdd | CPMR_HOMER_OFFSET); - pImgHdr->g_cme_pstate_region_offset = pImgHdr->g_cme_hcode_offset + pImgHdr->g_cme_hcode_length; - pImgHdr->g_cme_pstate_region_length = 0; - pImgHdr->g_cme_common_ring_offset = pImgHdr->g_cme_pstate_region_offset + pImgHdr->g_cme_pstate_region_length; - pImgHdr->g_cme_common_ring_length = 0; - pImgHdr->g_cme_scom_offset = 0; - pImgHdr->g_cme_scom_length = CORE_SCOM_RESTORE_SIZE_PER_CME; - pImgHdr->g_cme_core_spec_ring_offset = 0; // multiple of 32B blocks - pImgHdr->g_cme_max_spec_ring_length = 0; // multiple of 32B blocks - - //Let us handle the endianess at the end - pImgHdr->g_cme_pstate_region_offset = SWIZZLE_4_BYTE(pImgHdr->g_cme_pstate_region_offset); - pImgHdr->g_cme_common_ring_offset = SWIZZLE_4_BYTE(pImgHdr->g_cme_common_ring_offset); - pImgHdr->g_cme_hcode_offset = SWIZZLE_4_BYTE(pImgHdr->g_cme_hcode_offset); - pImgHdr->g_cme_hcode_length = SWIZZLE_4_BYTE(pImgHdr->g_cme_hcode_length); - pImgHdr->g_cme_scom_length = SWIZZLE_4_BYTE(pImgHdr->g_cme_scom_length); - pImgHdr->g_cme_cpmr_PhyAddr = SWIZZLE_8_BYTE(pImgHdr->g_cme_cpmr_PhyAddr); - } - while(0); + // The image in the HW Image has the Interrupt Vectors, CME Header and Debug + // Pointers already included. + rcTemp = copySectionToHomer( i_pChipHomer->cpmrRegion.cmeSramRegion, pCmeImg, + P9_XIP_SECTION_CME_HCODE, + PLAT_CME, + ppeSection ); - return retCode; -} + if( rcTemp ) + { + FAPI_ERR("Failed to append CME Hcode"); + retCode = BUILD_FAIL_CME_HCODE; + break; + } -//------------------------------------------------------------------------------ -/** - * @brief copies PGPE section from hardware image to HOMER. - * @param[in] i_pImageIn points to start of hardware image. - * @param[in] i_pChipHomer points to HOMER image in main memory. - * @param[io] io_ppmrHdr an instance of PpmrHeader_t - * @param[in] i_imgType image sections to be built - * @return IMG_BUILD_SUCCESS if function succeeds, error code otherwise. - */ -uint32_t buildPgpeImage( void* const i_pImageIn, Homerlayout_t* i_pChipHomer, - PpmrHeader_t& io_ppmrHdr, ImageType_t i_imgType ) -{ - uint32_t retCode = IMG_BUILD_SUCCESS; - FAPI_INF("> PGPE Img build") + // Initializing CME Image header + // Names have g_ prefix as these global variables for CME Hcode + // Note: Only the *memory* addresses are updated + cmeHeader_t* pImgHdr = (cmeHeader_t*) & i_pChipHomer->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE]; + pImgHdr->g_cme_hcode_offset = CME_SRAM_HCODE_OFFSET; + pImgHdr->g_cme_hcode_length = ppeSection.iv_size; + + //Populating common ring offset here. So, that other scan ring related field can be updated. + pImgHdr->g_cme_cpmr_PhyAddr = (i_cpmrPhyAdd | CPMR_HOMER_OFFSET); + pImgHdr->g_cme_pstate_region_offset = pImgHdr->g_cme_hcode_offset + pImgHdr->g_cme_hcode_length; + pImgHdr->g_cme_pstate_region_length = 0; + pImgHdr->g_cme_common_ring_offset = pImgHdr->g_cme_pstate_region_offset + pImgHdr->g_cme_pstate_region_length; + pImgHdr->g_cme_common_ring_length = 0; + pImgHdr->g_cme_scom_offset = 0; + pImgHdr->g_cme_scom_length = CORE_SCOM_RESTORE_SIZE_PER_CME; + pImgHdr->g_cme_core_spec_ring_offset = 0; // multiple of 32B blocks + pImgHdr->g_cme_max_spec_ring_length = 0; // multiple of 32B blocks + + //Let us handle the endianess at the end + pImgHdr->g_cme_pstate_region_offset = SWIZZLE_4_BYTE(pImgHdr->g_cme_pstate_region_offset); + pImgHdr->g_cme_common_ring_offset = SWIZZLE_4_BYTE(pImgHdr->g_cme_common_ring_offset); + pImgHdr->g_cme_hcode_offset = SWIZZLE_4_BYTE(pImgHdr->g_cme_hcode_offset); + pImgHdr->g_cme_hcode_length = SWIZZLE_4_BYTE(pImgHdr->g_cme_hcode_length); + pImgHdr->g_cme_scom_length = SWIZZLE_4_BYTE(pImgHdr->g_cme_scom_length); + pImgHdr->g_cme_cpmr_PhyAddr = SWIZZLE_8_BYTE(pImgHdr->g_cme_cpmr_PhyAddr); + } + while(0); + + return retCode; + } - do +//------------------------------------------------------------------------------ + /** + * @brief copies PGPE section from hardware image to HOMER. + * @param[in] i_pImageIn points to start of hardware image. + * @param[in] i_pChipHomer points to HOMER image in main memory. + * @param[io] io_ppmrHdr an instance of PpmrHeader_t + * @param[in] i_imgType image sections to be built + * @return IMG_BUILD_SUCCESS if function succeeds, error code otherwise. + */ + uint32_t buildPgpeImage( void* const i_pImageIn, Homerlayout_t* i_pChipHomer, + PpmrHeader_t& io_ppmrHdr, ImageType_t i_imgType ) { - uint32_t rcTemp = 0; - //Let us find XIP Header for SGPE - P9XipSection ppeSection; - uint8_t* pPgpeImg = NULL; - - //Init PGPE region with zero - memset( i_pChipHomer->ppmrRegion.ppmrHeader, 0x00, ONE_MB ); - - PpmrHeader_t* pPpmrHdr = ( PpmrHeader_t* ) i_pChipHomer->ppmrRegion.ppmrHeader; - - if(!i_imgType.pgpeImageBuild ) - { - break; - } - - rcTemp = p9_xip_get_section( i_pImageIn, P9_XIP_SECTION_HW_PGPE, &ppeSection ); - - if( rcTemp ) - { - FAPI_ERR("Failed to get PGPE XIP Image Header" ); - retCode = BUILD_FAIL_PGPE_IMAGE; - break; - } - - pPgpeImg = ppeSection.iv_offset + (uint8_t*) (i_pImageIn ); - FAPI_DBG("HW image PGPE Offset = 0x%08X", ppeSection.iv_offset); + uint32_t retCode = IMG_BUILD_SUCCESS; + FAPI_INF("> PGPE Img build") - FAPI_INF("PPMR Header"); - rcTemp = copySectionToHomer( i_pChipHomer->ppmrRegion.ppmrHeader, - pPgpeImg, - P9_XIP_SECTION_PGPE_PPMR, - PLAT_PGPE, - ppeSection ); - - if( rcTemp ) + do { - FAPI_ERR("Failed to copy PPMR Header"); - retCode = BUILD_FAIL_PGPE_PPMR; - break; - } + uint32_t rcTemp = 0; + //Let us find XIP Header for SGPE + P9XipSection ppeSection; + uint8_t* pPgpeImg = NULL; - memcpy( &io_ppmrHdr, pPpmrHdr, sizeof(PpmrHeader_t)); + //Init PGPE region with zero + memset( i_pChipHomer->ppmrRegion.ppmrHeader, 0x00, ONE_MB ); - rcTemp = copySectionToHomer( i_pChipHomer->ppmrRegion.l1BootLoader, - pPgpeImg, - P9_XIP_SECTION_PGPE_LVL1_BL, - PLAT_PGPE, - ppeSection ); + PpmrHeader_t* pPpmrHdr = ( PpmrHeader_t* ) i_pChipHomer->ppmrRegion.ppmrHeader; - if( rcTemp ) - { - FAPI_ERR("Failed to copy PGPE Level1 bootloader"); - retCode = BUILD_FAIL_PGPE_BL1; - break; - } + if(!i_imgType.pgpeImageBuild ) + { + break; + } - io_ppmrHdr.g_ppmr_bc_offset = PPMR_HEADER_SIZE; + rcTemp = p9_xip_get_section( i_pImageIn, P9_XIP_SECTION_HW_PGPE, &ppeSection ); + if( rcTemp ) + { + FAPI_ERR("Failed to get PGPE XIP Image Header" ); + retCode = BUILD_FAIL_PGPE_IMAGE; + break; + } - rcTemp = copySectionToHomer( i_pChipHomer->ppmrRegion.l2BootLoader, - pPgpeImg, - P9_XIP_SECTION_PGPE_LVL2_BL, - PLAT_PGPE, - ppeSection ); + pPgpeImg = ppeSection.iv_offset + (uint8_t*) (i_pImageIn ); + FAPI_DBG("HW image PGPE Offset = 0x%08X", ppeSection.iv_offset); - if( rcTemp ) - { - FAPI_ERR("Failed to copy PGPE Level2 bootloader"); - retCode = BUILD_FAIL_PGPE_BL2; - break; - } + FAPI_INF("PPMR Header"); + rcTemp = copySectionToHomer( i_pChipHomer->ppmrRegion.ppmrHeader, + pPgpeImg, + P9_XIP_SECTION_PGPE_PPMR, + PLAT_PGPE, + ppeSection ); - io_ppmrHdr.g_ppmr_bl_offset = io_ppmrHdr.g_ppmr_bc_offset + PGPE_BOOT_COPIER_SIZE; - io_ppmrHdr.g_ppmr_bl_length = ppeSection.iv_size; + if( rcTemp ) + { + FAPI_ERR("Failed to copy PPMR Header"); + retCode = BUILD_FAIL_PGPE_PPMR; + break; + } - rcTemp = copySectionToHomer( i_pChipHomer->ppmrRegion.pgpeSramImage, - pPgpeImg, - P9_XIP_SECTION_PGPE_HCODE, - PLAT_PGPE, - ppeSection ); + memcpy( &io_ppmrHdr, pPpmrHdr, sizeof(PpmrHeader_t)); - if( rcTemp ) - { - FAPI_ERR("Failed to copy PGPE hcode"); - retCode = BUILD_FAIL_PGPE_HCODE; - break; - } + rcTemp = copySectionToHomer( i_pChipHomer->ppmrRegion.l1BootLoader, + pPgpeImg, + P9_XIP_SECTION_PGPE_LVL1_BL, + PLAT_PGPE, + ppeSection ); - io_ppmrHdr.g_ppmr_hcode_offset = io_ppmrHdr.g_ppmr_bl_offset + PGPE_BOOT_LOADER_SIZE; - io_ppmrHdr.g_ppmr_hcode_length = ppeSection.iv_size; + if( rcTemp ) + { + FAPI_ERR("Failed to copy PGPE Level1 bootloader"); + retCode = BUILD_FAIL_PGPE_BL1; + break; + } - //Finally let us take care of endianess - io_ppmrHdr.g_ppmr_bc_offset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_bc_offset); - io_ppmrHdr.g_ppmr_bl_offset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_bl_offset); - io_ppmrHdr.g_ppmr_bl_length = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_bl_length); - io_ppmrHdr.g_ppmr_hcode_offset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_hcode_offset); - io_ppmrHdr.g_ppmr_hcode_length = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_hcode_length); - } - while(0); + io_ppmrHdr.g_ppmr_bc_offset = PPMR_HEADER_SIZE; - FAPI_INF("< PGPE Img build") - return retCode; -} -//------------------------------------------------------------------------------ + rcTemp = copySectionToHomer( i_pChipHomer->ppmrRegion.l2BootLoader, + pPgpeImg, + P9_XIP_SECTION_PGPE_LVL2_BL, + PLAT_PGPE, + ppeSection ); -/** - * @brief get a blob of platform rings in a temp buffer. - * @param i_hwImage points to hardware image. - * @param i_procTgt processor target - * @param i_ringData temp data struct - */ -uint32_t getPpeScanRings( void* const i_pHwImage, - PlatId i_ppeType, - CONST_FAPI2_PROC& i_procTgt, - RingBufData& i_ringData, - ImageType_t i_imgType ) -{ - FAPI_INF(">getPpeScanRings"); - uint32_t retCode = IMG_BUILD_SUCCESS; - uint32_t hwImageSize = 0; + if( rcTemp ) + { + FAPI_ERR("Failed to copy PGPE Level2 bootloader"); + retCode = BUILD_FAIL_PGPE_BL2; + break; + } - do - { - if(( !i_imgType.cmeCommonRingBuild && !i_imgType.cmeCoreSpecificRingBuild ) || - ( i_imgType.sgpeCommonRingBuild && !i_imgType.sgpeCacheSpecificRingBuild )) - { - break; - } + io_ppmrHdr.g_ppmr_bl_offset = io_ppmrHdr.g_ppmr_bc_offset + PGPE_BOOT_COPIER_SIZE; + io_ppmrHdr.g_ppmr_bl_length = ppeSection.iv_size; - p9_xip_image_size( i_pHwImage, &hwImageSize ); + rcTemp = copySectionToHomer( i_pChipHomer->ppmrRegion.pgpeSramImage, + pPgpeImg, + P9_XIP_SECTION_PGPE_HCODE, + PLAT_PGPE, + ppeSection ); - P9XipSection ppeSection; - retCode = p9_xip_get_section( i_pHwImage, P9_XIP_SECTION_HW_RINGS, &ppeSection ); + if( rcTemp ) + { + FAPI_ERR("Failed to copy PGPE hcode"); + retCode = BUILD_FAIL_PGPE_HCODE; + break; + } - if( retCode ) - { - FAPI_ERR("Failed to access scan rings for %s", (i_ppeType == PLAT_CME ) ? "CME" : "SGPE" ); - retCode = BUILD_FAIL_RING_EXTRACTN; - break; - } + io_ppmrHdr.g_ppmr_hcode_offset = io_ppmrHdr.g_ppmr_bl_offset + PGPE_BOOT_LOADER_SIZE; + io_ppmrHdr.g_ppmr_hcode_length = ppeSection.iv_size; - if( 0 == ppeSection.iv_size ) - { - retCode = BUILD_FAIL_RING_EXTRACTN; - FAPI_ERR("Empty .rings section not allowed: <.rings>.iv_size = %d Plat %s", - ppeSection.iv_size, (i_ppeType == PLAT_CME ) ? "CME" : "SGPE" ); - break; + //Finally let us take care of endianess + io_ppmrHdr.g_ppmr_bc_offset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_bc_offset); + io_ppmrHdr.g_ppmr_bl_offset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_bl_offset); + io_ppmrHdr.g_ppmr_bl_length = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_bl_length); + io_ppmrHdr.g_ppmr_hcode_offset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_hcode_offset); + io_ppmrHdr.g_ppmr_hcode_length = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_hcode_length); } + while(0); - FAPI_DBG("------------------ Input Buffer Specs --------------------"); - FAPI_DBG("Ring section (buf,size)=(0x%016llX,0x%08X)", - (uintptr_t)(i_ringData.iv_pRingBuffer), i_ringData.iv_ringBufSize); - FAPI_DBG("Work buf1 (buf,size)=(0x%016llX,0x%08X)", - (uintptr_t)(i_ringData.iv_pWorkBuf1), i_ringData.iv_sizeWorkBuf1); - FAPI_DBG("Work buf2 (buf,size)=(0x%016llX,0x%08X)", - (uintptr_t)(i_ringData.iv_pWorkBuf2), i_ringData.iv_sizeWorkBuf2); - FAPI_DBG("---------------=== Buffer Specs Ends --------------------"); - - uint32_t l_bootMask = ENABLE_ALL_CORE; - fapi2::ReturnCode l_fapiRc = fapi2::FAPI2_RC_SUCCESS; - - FAPI_EXEC_HWP( l_fapiRc, - p9_xip_customize, - i_procTgt, - i_pHwImage, - hwImageSize, - i_ringData.iv_pRingBuffer, - i_ringData.iv_ringBufSize, - (i_ppeType == PLAT_CME) ? SYSPHASE_RT_CME : SYSPHASE_RT_SGPE, - MODEBUILD_IPL, - i_ringData.iv_pWorkBuf1, - i_ringData.iv_sizeWorkBuf1, - i_ringData.iv_pWorkBuf2, - i_ringData.iv_sizeWorkBuf2, - l_bootMask ); - - if( l_fapiRc ) - { - retCode = BUILD_FAIL_RING_EXTRACTN; - FAPI_ERR("p9_xip_customize failed to extract rings for %s", - (i_ppeType == PLAT_CME ) ? "CME" : "SGPE" ); - break; - } + FAPI_INF("< PGPE Img build") + return retCode; } - while(0); - - FAPI_INF("<getPpeScanRings " ); - return retCode; -} //------------------------------------------------------------------------------ -uint32_t layoutSgpeScanOverride( Homerlayout_t* i_pHomer, - void* i_pOverride, - const P9FuncModel& i_chipState, - RingBufData& i_ringData, - RingDebugMode_t i_debugMode, - QpmrHeaderLayout_t& i_qpmrHdr, - ImageType_t i_imgType ) -{ - FAPI_INF("> layoutSgpeScanOverride "); - uint32_t rc = IMG_BUILD_SUCCESS; - sgpeHeader_t* pSgpeImgHdr = (sgpeHeader_t*)&i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage[SGPE_INT_VECTOR_SIZE]; - RingBucket sgpeOvrdRings( PLAT_SGPE, - (uint8_t*)&i_pHomer->qpmrRegion, - i_debugMode ); - - do + /** + * @brief get a blob of platform rings in a temp buffer. + * @param i_hwImage points to hardware image. + * @param i_procTgt processor target + * @param i_ringData temp data struct + */ + uint32_t getPpeScanRings( void* const i_pHwImage, + PlatId i_ppeType, + CONST_FAPI2_PROC& i_procTgt, + RingBufData& i_ringData, + ImageType_t i_imgType ) { - if( !i_imgType.sgpeCommonRingBuild ) - { - break; - } + FAPI_INF(">getPpeScanRings"); + uint32_t retCode = IMG_BUILD_SUCCESS; + uint32_t hwImageSize = 0; - if( !i_pOverride ) + do { - break; - } - - uint32_t commonRingLength = i_qpmrHdr.quadCommonRingLength; - - //Start override ring from the actual end of base common rings. Remeber overrides reside within area - //earmarked for common rings - uint8_t* pOverrideStart = - &i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage[commonRingLength + SWIZZLE_4_BYTE(i_qpmrHdr.sgpeImgLength)]; - uint16_t* pScanRingIndex = (uint16_t*)pOverrideStart; + if(( !i_imgType.cmeCommonRingBuild && !i_imgType.cmeCoreSpecificRingBuild ) || + ( i_imgType.sgpeCommonRingBuild && !i_imgType.sgpeCacheSpecificRingBuild )) + { + break; + } - //get core common rings - uint8_t* pOvrdRingPayload = pOverrideStart + QUAD_COMMON_RING_INDEX_SIZE; - uint32_t tempRingLength = 0; - uint32_t tempBufSize = 0; - bool overrideNotFound = true; - uint32_t ringStartToHdrOffset = ( TOR_VER_ONE == P9_TOR::tor_version() ) ? RING_START_TO_RS4_OFFSET : 0; - FAPI_DBG("TOR Version : 0x%02x", P9_TOR::tor_version() ); + p9_xip_image_size( i_pHwImage, &hwImageSize ); - for( uint32_t ringIndex = 0; ringIndex < EQ::g_eqData.iv_num_common_rings; - ringIndex++ ) - { - tempBufSize = i_ringData.iv_sizeWorkBuf1; + P9XipSection ppeSection; + retCode = p9_xip_get_section( i_pHwImage, P9_XIP_SECTION_HW_RINGS, &ppeSection ); - FAPI_DBG("Calling P9_TOR::tor_get_single_ring ring 0x%08X", ringIndex); - rc = tor_get_single_ring( i_pOverride, - P9_XIP_MAGIC_SEEPROM, - i_chipState.getChipLevel(), - sgpeOvrdRings.getCommonRingId( ringIndex ), - P9_TOR::SBE, - OVERRIDE, - CACHE0_CHIPLET_ID, - &i_ringData.iv_pWorkBuf2, - tempBufSize, - 0 ); + if( retCode ) + { + FAPI_ERR("Failed to access scan rings for %s", (i_ppeType == PLAT_CME ) ? "CME" : "SGPE" ); + retCode = BUILD_FAIL_RING_EXTRACTN; + break; + } - if( (i_ringData.iv_sizeWorkBuf2 == tempBufSize) || (0 == tempBufSize ) || - ( 0 != rc ) ) + if( 0 == ppeSection.iv_size ) { - tempBufSize = 0; - continue; + retCode = BUILD_FAIL_RING_EXTRACTN; + FAPI_ERR("Empty .rings section not allowed: <.rings>.iv_size = %d Plat %s", + ppeSection.iv_size, (i_ppeType == PLAT_CME ) ? "CME" : "SGPE" ); + break; } - overrideNotFound = false; - ALIGN_DWORD(tempRingLength, tempBufSize) - ALIGN_RING_LOC( pOverrideStart, pOvrdRingPayload ); + FAPI_DBG("------------------ Input Buffer Specs --------------------"); + FAPI_DBG("Ring section (buf,size)=(0x%016llX,0x%08X)", + (uintptr_t)(i_ringData.iv_pRingBuffer), i_ringData.iv_ringBufSize); + FAPI_DBG("Work buf1 (buf,size)=(0x%016llX,0x%08X)", + (uintptr_t)(i_ringData.iv_pWorkBuf1), i_ringData.iv_sizeWorkBuf1); + FAPI_DBG("Work buf2 (buf,size)=(0x%016llX,0x%08X)", + (uintptr_t)(i_ringData.iv_pWorkBuf2), i_ringData.iv_sizeWorkBuf2); + FAPI_DBG("---------------=== Buffer Specs Ends --------------------"); + uint32_t l_bootMask = ENABLE_ALL_CORE; + fapi2::ReturnCode l_fapiRc = fapi2::FAPI2_RC_SUCCESS; - memcpy( pOvrdRingPayload, i_ringData.iv_pWorkBuf2, tempBufSize); - *(pScanRingIndex + ringIndex) = SWIZZLE_2_BYTE((pOvrdRingPayload - pOverrideStart) + ringStartToHdrOffset); + FAPI_EXEC_HWP( l_fapiRc, + p9_xip_customize, + i_procTgt, + i_pHwImage, + hwImageSize, + i_ringData.iv_pRingBuffer, + i_ringData.iv_ringBufSize, + (i_ppeType == PLAT_CME) ? SYSPHASE_RT_CME : SYSPHASE_RT_SGPE, + MODEBUILD_IPL, + i_ringData.iv_pWorkBuf1, + i_ringData.iv_sizeWorkBuf1, + i_ringData.iv_pWorkBuf2, + i_ringData.iv_sizeWorkBuf2, + l_bootMask ); + + if( l_fapiRc ) + { + retCode = BUILD_FAIL_RING_EXTRACTN; + FAPI_ERR("p9_xip_customize failed to extract rings for %s", + (i_ppeType == PLAT_CME ) ? "CME" : "SGPE" ); + break; + } + } + while(0); - sgpeOvrdRings.setRingOffset(pOvrdRingPayload, sgpeOvrdRings.getCommonRingId( ringIndex )); - sgpeOvrdRings.setRingSize( sgpeOvrdRings.getCommonRingId( ringIndex ), tempBufSize ); - sgpeOvrdRings.extractRing( i_ringData.iv_pWorkBuf1, tempBufSize, sgpeOvrdRings.getCommonRingId( ringIndex ) ); + FAPI_INF("<getPpeScanRings " ); + return retCode; + } - pOvrdRingPayload = pOvrdRingPayload + tempBufSize; - } +//------------------------------------------------------------------------------ - if( overrideNotFound ) + uint32_t layoutSgpeScanOverride( Homerlayout_t* i_pHomer, + void* i_pOverride, + const P9FuncModel& i_chipState, + RingBufData& i_ringData, + RingDebugMode_t i_debugMode, + QpmrHeaderLayout_t& i_qpmrHdr, + ImageType_t i_imgType ) + { + FAPI_INF("> layoutSgpeScanOverride "); + uint32_t rc = IMG_BUILD_SUCCESS; + sgpeHeader_t* pSgpeImgHdr = (sgpeHeader_t*)&i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage[SGPE_INT_VECTOR_SIZE]; + RingBucket sgpeOvrdRings( PLAT_SGPE, + (uint8_t*)&i_pHomer->qpmrRegion, + i_debugMode ); + + do { - FAPI_INF("Overrides not found for SGPE"); - rc = BUILD_FAIL_OVERRIDE; // Not considered an error - break; - } + if( !i_imgType.sgpeCommonRingBuild ) + { + break; + } - tempRingLength = (pOvrdRingPayload - pOverrideStart ); - pSgpeImgHdr->g_sgpe_cmn_ring_ovrd_occ_offset = - SWIZZLE_4_BYTE(pSgpeImgHdr->g_sgpe_cmn_ring_occ_offset) + commonRingLength; - i_qpmrHdr.quadCommonRingLength = commonRingLength + tempRingLength; - i_qpmrHdr.quadCommonOvrdLength = tempRingLength; - i_qpmrHdr.quadCommonOvrdOffset = i_qpmrHdr.quadCommonRingOffset + commonRingLength; - pSgpeImgHdr->g_sgpe_cmn_ring_ovrd_occ_offset = SWIZZLE_4_BYTE(pSgpeImgHdr->g_sgpe_cmn_ring_ovrd_occ_offset); + if( !i_pOverride ) + { + break; + } - } - while(0); + uint32_t commonRingLength = i_qpmrHdr.quadCommonRingLength; - FAPI_DBG("--------------------SGPE Override Rings---------------=" ); - FAPI_DBG("--------------------SGPE Header --------------------===="); - FAPI_DBG("Override Ring Offset 0x%08X", SWIZZLE_4_BYTE(pSgpeImgHdr->g_sgpe_cmn_ring_ovrd_occ_offset)); + //Start override ring from the actual end of base common rings. Remeber overrides reside within area + //earmarked for common rings + uint8_t* pOverrideStart = + &i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage[commonRingLength + SWIZZLE_4_BYTE(i_qpmrHdr.sgpeImgLength)]; + uint16_t* pScanRingIndex = (uint16_t*)pOverrideStart; - sgpeOvrdRings.dumpOverrideRings(); + //get core common rings + uint8_t* pOvrdRingPayload = pOverrideStart + QUAD_COMMON_RING_INDEX_SIZE; + uint32_t tempRingLength = 0; + uint32_t tempBufSize = 0; + bool overrideNotFound = true; + uint32_t ringStartToHdrOffset = ( TOR_VER_ONE == P9_TOR::tor_version() ) ? RING_START_TO_RS4_OFFSET : 0; + FAPI_DBG("TOR Version : 0x%02x", P9_TOR::tor_version() ); - FAPI_INF("< layoutSgpeScanOverride") - return rc; -} + for( uint32_t ringIndex = 0; ringIndex < EQ::g_eqData.iv_num_common_rings; + ringIndex++ ) + { + tempBufSize = i_ringData.iv_sizeWorkBuf1; -/** - * @brief update fields of PGPE image header region with parameter block info. - * @param i_pHomer points to start of chip's HOMER. - */ + FAPI_DBG("Calling P9_TOR::tor_get_single_ring ring 0x%08X", ringIndex); + rc = tor_get_single_ring( i_pOverride, + P9_XIP_MAGIC_SEEPROM, + i_chipState.getChipLevel(), + sgpeOvrdRings.getCommonRingId( ringIndex ), + P9_TOR::SBE, + OVERRIDE, + CACHE0_CHIPLET_ID, + &i_ringData.iv_pWorkBuf2, + tempBufSize, + i_debugMode ); + if( (i_ringData.iv_sizeWorkBuf2 == tempBufSize) || (0 == tempBufSize ) || + ( 0 != rc ) ) + { + tempBufSize = 0; + continue; + } -void updatePgpeHeader( void* const i_pHomer ) -{ - FAPI_DBG("> updatePgpeHeader"); - Homerlayout_t* pHomerLayout = (Homerlayout_t*)i_pHomer; - PgpeHeader_t* pPgpeHdr = (PgpeHeader_t*)&pHomerLayout->ppmrRegion.pgpeSramImage[PGPE_INT_VECTOR_SIZE]; - PpmrHeader_t* pPpmrHdr = ( PpmrHeader_t* ) pHomerLayout->ppmrRegion.ppmrHeader; - - //Updating PGPE Image Header - pPgpeHdr->g_pgpe_ivpr_addr = OCC_SRAM_PGPE_BASE_ADDR; - - //Global P-State Parameter Block SRAM address - pPgpeHdr->g_pgpe_gppb_sram_addr = 0; // set by PGPE Hcode - - //PGPE Hcode length - pPgpeHdr->g_pgpe_hcode_length = SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_hcode_length); - - //Global P-State Parameter Block HOMER address - pPgpeHdr->g_pgpe_gppb_mem_offset = (HOMER_PPMR_BASE_ADDR | - (SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_gppb_offset))); - - //Global P-State Parameter Block length - pPgpeHdr->g_pgpe_gppb_length = SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_gppb_length); - - //P-State Parameter Block HOMER offset - pPgpeHdr->g_pgpe_gen_pstables_mem_offset = (HOMER_PPMR_BASE_ADDR | - (SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_pstables_offset))); - - //P-State Table length - pPgpeHdr->g_pgpe_gen_pstables_length = SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_pstables_length); - - //OCC P-State Table SRAM address - pPgpeHdr->g_pgpe_occ_pstables_sram_addr = 0; - - //OCC P-State Table Length - pPgpeHdr->g_pgpe_occ_pstables_len = 0; - - //PGPE Beacon SRAM address - pPgpeHdr->g_pgpe_beacon_addr = 0; - pPgpeHdr->g_quad_status_addr = 0; - pPgpeHdr->g_wof_table_addr = 0; - pPgpeHdr->g_wof_table_length = 0; - - //Finally handling the endianess - pPgpeHdr->g_pgpe_magic_number = SWIZZLE_8_BYTE(PGPE_MAGIC_NUMBER); - pPgpeHdr->g_pgpe_gppb_sram_addr = SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gppb_sram_addr); - pPgpeHdr->g_pgpe_hcode_length = SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_hcode_length); - pPgpeHdr->g_pgpe_gppb_mem_offset = SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gppb_mem_offset); - pPgpeHdr->g_pgpe_gppb_length = SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gppb_length); - pPgpeHdr->g_pgpe_gen_pstables_mem_offset = SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gen_pstables_mem_offset); - pPgpeHdr->g_pgpe_gen_pstables_length = SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gen_pstables_length); - pPgpeHdr->g_pgpe_occ_pstables_sram_addr = SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_occ_pstables_sram_addr); - pPgpeHdr->g_pgpe_occ_pstables_len = SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_occ_pstables_len); - pPgpeHdr->g_pgpe_beacon_addr = SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_beacon_addr); - pPgpeHdr->g_quad_status_addr = SWIZZLE_4_BYTE(pPgpeHdr->g_quad_status_addr); - pPgpeHdr->g_wof_table_addr = SWIZZLE_4_BYTE(pPgpeHdr->g_wof_table_addr); - pPgpeHdr->g_wof_table_length = SWIZZLE_4_BYTE(pPgpeHdr->g_wof_table_length); - - FAPI_DBG("================================PGPE Image Header==========================================") - char magicWord[16] = {0}; - uint64_t temp = pPgpeHdr->g_pgpe_magic_number; - memcpy(magicWord, &temp, sizeof(uint64_t)); - FAPI_DBG("PGPE Magic Word : %s", magicWord); - FAPI_DBG("Hcode Length : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gppb_length)); - FAPI_DBG("GPPB SRAM : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gppb_sram_addr)); - FAPI_DBG("GPPB Mem Offset : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gppb_mem_offset)); - FAPI_DBG("GPPB Length : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gppb_length)); - FAPI_DBG("PS Table Mem Offset : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gen_pstables_mem_offset)); - FAPI_DBG("PS Table Length : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gen_pstables_length)); - FAPI_DBG("OCC PST SRAM : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_occ_pstables_sram_addr)); - FAPI_DBG("OCC PST Length : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_occ_pstables_len)); - FAPI_DBG("Beacon Offset : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_beacon_addr)); - FAPI_DBG("Quad Status : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_quad_status_addr)); - FAPI_DBG("WOF Addr : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_wof_table_addr)); - FAPI_DBG("WOF Length : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_wof_table_length)); - FAPI_DBG("==============================PGPE Image Header End========================================") - - FAPI_DBG("< updatePgpeHeader"); -} + overrideNotFound = false; + ALIGN_DWORD(tempRingLength, tempBufSize) + ALIGN_RING_LOC( pOverrideStart, pOvrdRingPayload ); -//--------------------------------------------------------------------------- -void updatePpmrHeader( void* const i_pHomer, PpmrHeader_t& io_ppmrHdr ) -{ - FAPI_DBG("> updatePpmrHeader"); - Homerlayout_t* pHomerLayout = (Homerlayout_t*)i_pHomer; - PpmrHeader_t* pPpmrHdr = (PpmrHeader_t*) &pHomerLayout->ppmrRegion.ppmrHeader; - memcpy( pPpmrHdr, &io_ppmrHdr, sizeof(PpmrHeader_t) ); - - FAPI_DBG("=========================== PPMR Header ====================================" ); - char magicWord[16] = {0}; - uint64_t temp = io_ppmrHdr.g_ppmr_magic_number; - memcpy(magicWord, &temp, sizeof(uint64_t)); - FAPI_DBG("Magic Word : %s", magicWord); - FAPI_DBG("BC Offset : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_bc_offset)); - FAPI_DBG("BL Offset : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_bl_offset)); - FAPI_DBG("BL Length : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_bl_length)); - FAPI_DBG("Hcode Offset : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_hcode_offset)); - FAPI_DBG("Hcode Length : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_hcode_length)); - FAPI_DBG("GPPB Offset : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_gppb_offset)); - FAPI_DBG("GPPB Length : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_gppb_length)); - FAPI_DBG("LPPB Offset : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_lppb_offset)); - FAPI_DBG("LPPB Length : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_lppb_length)); - FAPI_DBG("OPPB Offset : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_oppb_offset)); - FAPI_DBG("OPPB Length : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_oppb_length)); - FAPI_DBG("PS Table Offset : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_pstables_offset)); - FAPI_DBG("PS Table Length : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_pstables_length)); - FAPI_DBG("PSGPE SRAM Size : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_pgpe_sram_img_size)); - FAPI_DBG("=========================== PPMR Header ends ==================================" ); - - updatePgpeHeader( i_pHomer ); - - FAPI_DBG("< updatePpmrHeader"); -} + memcpy( pOvrdRingPayload, i_ringData.iv_pWorkBuf2, tempBufSize); + *(pScanRingIndex + ringIndex) = SWIZZLE_2_BYTE((pOvrdRingPayload - pOverrideStart) + ringStartToHdrOffset); -//--------------------------------------------------------------------------- + sgpeOvrdRings.setRingOffset(pOvrdRingPayload, sgpeOvrdRings.getCommonRingId( ringIndex )); + sgpeOvrdRings.setRingSize( sgpeOvrdRings.getCommonRingId( ringIndex ), tempBufSize ); + sgpeOvrdRings.extractRing( i_ringData.iv_pWorkBuf1, tempBufSize, sgpeOvrdRings.getCommonRingId( ringIndex ) ); -/** - * @brief updates the PState parameter block info in CPMR and PPMR region. - * @param i_pHomer points to start of of chip's HOMER. - * @param i_procTgt fapi2 target associated with P9 chip. - * @param i_imgType image type to be built. - * return fapi2::Returncode - */ -fapi2::ReturnCode buildParameterBlock( void* const i_pHomer, CONST_FAPI2_PROC& i_procTgt, - PpmrHeader_t& io_ppmrHdr, - ImageType_t i_imgType ) -{ - FAPI_INF("buildParameterBlock entered"); + pOvrdRingPayload = pOvrdRingPayload + tempBufSize; + } - do - { - if( !i_imgType.pgpePstateParmBlockBuild ) - { - break; - } + if( overrideNotFound ) + { + FAPI_INF("Overrides not found for SGPE"); + rc = BUILD_FAIL_OVERRIDE; // Not considered an error + break; + } - fapi2::ReturnCode retCode; - Homerlayout_t* pHomerLayout = (Homerlayout_t*)i_pHomer; - PPMRLayout_t* pPpmr = (PPMRLayout_t*) &pHomerLayout->ppmrRegion; - cmeHeader_t* pCmeHdr = (cmeHeader_t*) &pHomerLayout->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE]; + tempRingLength = (pOvrdRingPayload - pOverrideStart ); + pSgpeImgHdr->g_sgpe_cmn_ring_ovrd_occ_offset = + SWIZZLE_4_BYTE(pSgpeImgHdr->g_sgpe_cmn_ring_occ_offset) + commonRingLength; + i_qpmrHdr.quadCommonRingLength = commonRingLength + tempRingLength; + i_qpmrHdr.quadCommonOvrdLength = tempRingLength; + i_qpmrHdr.quadCommonOvrdOffset = i_qpmrHdr.quadCommonRingOffset + commonRingLength; + pSgpeImgHdr->g_sgpe_cmn_ring_ovrd_occ_offset = SWIZZLE_4_BYTE(pSgpeImgHdr->g_sgpe_cmn_ring_ovrd_occ_offset); - uint32_t ppmrRunningOffset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_hcode_offset) + - SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_hcode_length); + } + while(0); - FAPI_DBG("Hcode ppmrRunningOffset 0x%08x", ppmrRunningOffset ); + FAPI_DBG("--------------------SGPE Override Rings---------------=" ); + FAPI_DBG("--------------------SGPE Header --------------------===="); + FAPI_DBG("Override Ring Offset 0x%08X", SWIZZLE_4_BYTE(pSgpeImgHdr->g_sgpe_cmn_ring_ovrd_occ_offset)); - uint32_t pgpeRunningOffset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_hcode_length); + sgpeOvrdRings.dumpOverrideRings(); - FAPI_DBG(" PGPE Hcode End 0x%08x", pgpeRunningOffset ); + FAPI_INF("< layoutSgpeScanOverride") + return rc; + } - uint32_t sizeAligned = 0; - uint32_t sizePStateBlock = 0; - PstateSuperStructure pStateSupStruct; + /** + * @brief update fields of PGPE image header region with parameter block info. + * @param i_pHomer points to start of chip's HOMER. + */ - //Building P-State Parameter block info by calling a HWP - FAPI_DBG("Generating P-State Parameter Block" ); - FAPI_EXEC_HWP(retCode, p9_pstate_parameter_block, i_procTgt, &pStateSupStruct); - FAPI_TRY(retCode); - //-------------------------- Local P-State Parameter Block ------------------------------ + void updatePgpeHeader( void* const i_pHomer ) + { + FAPI_DBG("> updatePgpeHeader"); + Homerlayout_t* pHomerLayout = (Homerlayout_t*)i_pHomer; + PgpeHeader_t* pPgpeHdr = (PgpeHeader_t*)&pHomerLayout->ppmrRegion.pgpeSramImage[PGPE_INT_VECTOR_SIZE]; + PpmrHeader_t* pPpmrHdr = ( PpmrHeader_t* ) pHomerLayout->ppmrRegion.ppmrHeader; + + //Updating PGPE Image Header + pPgpeHdr->g_pgpe_ivpr_addr = OCC_SRAM_PGPE_BASE_ADDR; + + //Global P-State Parameter Block SRAM address + pPgpeHdr->g_pgpe_gppb_sram_addr = 0; // set by PGPE Hcode + + //PGPE Hcode length + pPgpeHdr->g_pgpe_hcode_length = SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_hcode_length); + + //Global P-State Parameter Block HOMER address + pPgpeHdr->g_pgpe_gppb_mem_offset = (HOMER_PPMR_BASE_ADDR | + (SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_gppb_offset))); + + //Global P-State Parameter Block length + pPgpeHdr->g_pgpe_gppb_length = SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_gppb_length); + + //P-State Parameter Block HOMER offset + pPgpeHdr->g_pgpe_gen_pstables_mem_offset = (HOMER_PPMR_BASE_ADDR | + (SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_pstables_offset))); + + //P-State Table length + pPgpeHdr->g_pgpe_gen_pstables_length = SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_pstables_length); + + //OCC P-State Table SRAM address + pPgpeHdr->g_pgpe_occ_pstables_sram_addr = 0; + + //OCC P-State Table Length + pPgpeHdr->g_pgpe_occ_pstables_len = 0; + + //PGPE Beacon SRAM address + pPgpeHdr->g_pgpe_beacon_addr = 0; + pPgpeHdr->g_quad_status_addr = 0; + pPgpeHdr->g_wof_table_addr = 0; + pPgpeHdr->g_wof_table_length = 0; + + //Finally handling the endianess + pPgpeHdr->g_pgpe_magic_number = SWIZZLE_8_BYTE(PGPE_MAGIC_NUMBER); + pPgpeHdr->g_pgpe_gppb_sram_addr = SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gppb_sram_addr); + pPgpeHdr->g_pgpe_hcode_length = SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_hcode_length); + pPgpeHdr->g_pgpe_gppb_mem_offset = SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gppb_mem_offset); + pPgpeHdr->g_pgpe_gppb_length = SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gppb_length); + pPgpeHdr->g_pgpe_gen_pstables_mem_offset = SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gen_pstables_mem_offset); + pPgpeHdr->g_pgpe_gen_pstables_length = SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gen_pstables_length); + pPgpeHdr->g_pgpe_occ_pstables_sram_addr = SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_occ_pstables_sram_addr); + pPgpeHdr->g_pgpe_occ_pstables_len = SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_occ_pstables_len); + pPgpeHdr->g_pgpe_beacon_addr = SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_beacon_addr); + pPgpeHdr->g_quad_status_addr = SWIZZLE_4_BYTE(pPgpeHdr->g_quad_status_addr); + pPgpeHdr->g_wof_table_addr = SWIZZLE_4_BYTE(pPgpeHdr->g_wof_table_addr); + pPgpeHdr->g_wof_table_length = SWIZZLE_4_BYTE(pPgpeHdr->g_wof_table_length); + + FAPI_DBG("================================PGPE Image Header==========================================") + char magicWord[16] = {0}; + uint64_t temp = pPgpeHdr->g_pgpe_magic_number; + memcpy(magicWord, &temp, sizeof(uint64_t)); + FAPI_DBG("PGPE Magic Word : %s", magicWord); + FAPI_DBG("Hcode Length : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gppb_length)); + FAPI_DBG("GPPB SRAM : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gppb_sram_addr)); + FAPI_DBG("GPPB Mem Offset : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gppb_mem_offset)); + FAPI_DBG("GPPB Length : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gppb_length)); + FAPI_DBG("PS Table Mem Offset : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gen_pstables_mem_offset)); + FAPI_DBG("PS Table Length : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_gen_pstables_length)); + FAPI_DBG("OCC PST SRAM : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_occ_pstables_sram_addr)); + FAPI_DBG("OCC PST Length : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_occ_pstables_len)); + FAPI_DBG("Beacon Offset : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_pgpe_beacon_addr)); + FAPI_DBG("Quad Status : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_quad_status_addr)); + FAPI_DBG("WOF Addr : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_wof_table_addr)); + FAPI_DBG("WOF Length : 0x%08x", SWIZZLE_4_BYTE(pPgpeHdr->g_wof_table_length)); + FAPI_DBG("==============================PGPE Image Header End========================================") + + FAPI_DBG("< updatePgpeHeader"); + } - uint32_t localPspbStartIndex = SWIZZLE_4_BYTE(pCmeHdr->g_cme_hcode_length); - uint8_t* pLocalPState = &pHomerLayout->cpmrRegion.cmeSramRegion[localPspbStartIndex]; +//--------------------------------------------------------------------------- - sizePStateBlock = sizeof(LocalPstateParmBlock); + void updatePpmrHeader( void* const i_pHomer, PpmrHeader_t& io_ppmrHdr ) + { + FAPI_DBG("> updatePpmrHeader"); + Homerlayout_t* pHomerLayout = (Homerlayout_t*)i_pHomer; + PpmrHeader_t* pPpmrHdr = (PpmrHeader_t*) &pHomerLayout->ppmrRegion.ppmrHeader; + memcpy( pPpmrHdr, &io_ppmrHdr, sizeof(PpmrHeader_t) ); + + FAPI_DBG("=========================== PPMR Header ====================================" ); + char magicWord[16] = {0}; + uint64_t temp = io_ppmrHdr.g_ppmr_magic_number; + memcpy(magicWord, &temp, sizeof(uint64_t)); + FAPI_DBG("Magic Word : %s", magicWord); + FAPI_DBG("BC Offset : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_bc_offset)); + FAPI_DBG("BL Offset : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_bl_offset)); + FAPI_DBG("BL Length : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_bl_length)); + FAPI_DBG("Hcode Offset : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_hcode_offset)); + FAPI_DBG("Hcode Length : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_hcode_length)); + FAPI_DBG("GPPB Offset : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_gppb_offset)); + FAPI_DBG("GPPB Length : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_gppb_length)); + FAPI_DBG("LPPB Offset : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_lppb_offset)); + FAPI_DBG("LPPB Length : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_lppb_length)); + FAPI_DBG("OPPB Offset : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_oppb_offset)); + FAPI_DBG("OPPB Length : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_oppb_length)); + FAPI_DBG("PS Table Offset : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_pstables_offset)); + FAPI_DBG("PS Table Length : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_pstables_length)); + FAPI_DBG("PSGPE SRAM Size : 0x%08x", SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_pgpe_sram_img_size)); + FAPI_DBG("=========================== PPMR Header ends ==================================" ); + + updatePgpeHeader( i_pHomer ); + + FAPI_DBG("< updatePpmrHeader"); + } - FAPI_DBG("Copying Local P-State Parameter Block into CPMR" ); - memcpy( pLocalPState, &pStateSupStruct.localppb, sizePStateBlock ); +//--------------------------------------------------------------------------- - ALIGN_DBWORD( sizeAligned, sizePStateBlock ) - uint32_t localPStateBlock = sizeAligned; - FAPI_DBG("LPSPB Actual size 0x%08x After Alignment 0x%08x", sizePStateBlock, sizeAligned ); + /** + * @brief updates the PState parameter block info in CPMR and PPMR region. + * @param i_pHomer points to start of of chip's HOMER. + * @param i_procTgt fapi2 target associated with P9 chip. + * @param i_imgType image type to be built. + * return fapi2::Returncode + */ + fapi2::ReturnCode buildParameterBlock( void* const i_pHomer, CONST_FAPI2_PROC& i_procTgt, + PpmrHeader_t& io_ppmrHdr, + ImageType_t i_imgType ) + { + FAPI_INF("buildParameterBlock entered"); - pCmeHdr->g_cme_pstate_region_length = localPStateBlock; - pCmeHdr->g_cme_common_ring_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_offset) + localPStateBlock; + do + { + if( !i_imgType.pgpePstateParmBlockBuild ) + { + break; + } - //-------------------------- Local P-State Parameter Block Ends -------------------------- + fapi2::ReturnCode retCode; + Homerlayout_t* pHomerLayout = (Homerlayout_t*)i_pHomer; + PPMRLayout_t* pPpmr = (PPMRLayout_t*) &pHomerLayout->ppmrRegion; + cmeHeader_t* pCmeHdr = (cmeHeader_t*) &pHomerLayout->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE]; - //-------------------------- Global P-State Parameter Block ------------------------------ + uint32_t ppmrRunningOffset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_hcode_offset) + + SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_hcode_length); - FAPI_DBG("Copying Global P-State Parameter Block" ); - sizePStateBlock = sizeof(GlobalPstateParmBlock); + FAPI_DBG("Hcode ppmrRunningOffset 0x%08x", ppmrRunningOffset ); - // MAKE ASSERT - if (sizePStateBlock > PGPE_PSTATE_OUTPUT_TABLES_SIZE) - { - FAPI_ERR("GlobalPstateParmBlock exceeds allocation: size = %X (%d), allocation = %X (%d)", - sizePStateBlock, sizePStateBlock, - PGPE_PSTATE_OUTPUT_TABLES_SIZE, PGPE_PSTATE_OUTPUT_TABLES_SIZE); - } + uint32_t pgpeRunningOffset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_hcode_length); - FAPI_DBG("GPPBB pgpeRunningOffset 0x%08x", pgpeRunningOffset ); - memcpy( &pPpmr->pgpeSramImage[pgpeRunningOffset], &pStateSupStruct.globalppb, sizePStateBlock ); + FAPI_DBG(" PGPE Hcode End 0x%08x", pgpeRunningOffset ); - ALIGN_DBWORD( sizeAligned, sizePStateBlock ) - FAPI_DBG("GPSPB Actual size 0x%08x After Alignment 0x%08x", sizePStateBlock, sizeAligned ); + uint32_t sizeAligned = 0; + uint32_t sizePStateBlock = 0; + PstateSuperStructure pStateSupStruct; - //Updating PPMR header info with GPSPB offset and length - io_ppmrHdr.g_ppmr_gppb_offset = ppmrRunningOffset; - io_ppmrHdr.g_ppmr_gppb_length = sizeAligned; + //Building P-State Parameter block info by calling a HWP + FAPI_DBG("Generating P-State Parameter Block" ); + FAPI_EXEC_HWP(retCode, p9_pstate_parameter_block, i_procTgt, &pStateSupStruct); + FAPI_TRY(retCode); - ppmrRunningOffset += sizeAligned; - pgpeRunningOffset += sizeAligned; - FAPI_DBG("OPPB pgpeRunningOffset 0x%08x OPPB ppmrRunningOffset 0x%08x", - pgpeRunningOffset, ppmrRunningOffset ); + //-------------------------- Local P-State Parameter Block ------------------------------ - //------------------------------ Global P-State Parameter Block Ends ---------------------- + uint32_t localPspbStartIndex = SWIZZLE_4_BYTE(pCmeHdr->g_cme_hcode_length); + uint8_t* pLocalPState = &pHomerLayout->cpmrRegion.cmeSramRegion[localPspbStartIndex]; - //------------------------------ OCC P-State Parameter Block ------------------------------ + sizePStateBlock = sizeof(LocalPstateParmBlock); - FAPI_INF("Copying OCC P-State Parameter Block" ); - sizePStateBlock = sizeof(OCCPstateParmBlock); - ALIGN_DBWORD( sizeAligned, sizePStateBlock ) + FAPI_DBG("Copying Local P-State Parameter Block into CPMR" ); + memcpy( pLocalPState, &pStateSupStruct.localppb, sizePStateBlock ); - FAPI_DBG("OPPB size 0x%08x (%d)", sizeAligned, sizeAligned ); - FAPI_DBG("OPSPB Actual size = 0x%08x (%d); After Alignment = 0x%08x (%d)", - sizePStateBlock, sizePStateBlock, - sizeAligned, sizeAligned ); + ALIGN_DBWORD( sizeAligned, sizePStateBlock ) + uint32_t localPStateBlock = sizeAligned; + FAPI_DBG("LPSPB Actual size 0x%08x After Alignment 0x%08x", sizePStateBlock, sizeAligned ); - // MAKE ASSERT - if (sizePStateBlock > OCC_PSTATE_PARAM_BLOCK_SIZE) - { - FAPI_ERR("OCCPstateParmBlock exceeds allocation: size = %X (%d), allocation = %X (%d)", - sizePStateBlock, sizePStateBlock, - OCC_PSTATE_PARAM_BLOCK_SIZE, OCC_PSTATE_PARAM_BLOCK_SIZE); - } + pCmeHdr->g_cme_pstate_region_length = localPStateBlock; + pCmeHdr->g_cme_common_ring_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_offset) + localPStateBlock; - // The PPMR offset is from the begining --- which is the ppmrHeader - io_ppmrHdr.g_ppmr_oppb_offset = pPpmr->occParmBlock - pPpmr->ppmrHeader; - io_ppmrHdr.g_ppmr_oppb_length = sizeAligned; - FAPI_DBG("OPPB ppmrRunningOffset 0x%08x", io_ppmrHdr.g_ppmr_oppb_offset); + //-------------------------- Local P-State Parameter Block Ends -------------------------- - memcpy( &pPpmr->occParmBlock, &pStateSupStruct.occppb, sizePStateBlock ); + //-------------------------- Global P-State Parameter Block ------------------------------ - //-------------------------- OCC P-State Parameter Block Ends ------------------------------ + FAPI_DBG("Copying Global P-State Parameter Block" ); + sizePStateBlock = sizeof(GlobalPstateParmBlock); + // MAKE ASSERT + if (sizePStateBlock > PGPE_PSTATE_OUTPUT_TABLES_SIZE) + { + FAPI_ERR("GlobalPstateParmBlock exceeds allocation: size = %X (%d), allocation = %X (%d)", + sizePStateBlock, sizePStateBlock, + PGPE_PSTATE_OUTPUT_TABLES_SIZE, PGPE_PSTATE_OUTPUT_TABLES_SIZE); + } + FAPI_DBG("GPPBB pgpeRunningOffset 0x%08x", pgpeRunningOffset ); + memcpy( &pPpmr->pgpeSramImage[pgpeRunningOffset], &pStateSupStruct.globalppb, sizePStateBlock ); - io_ppmrHdr.g_ppmr_lppb_offset = CPMR_HOMER_OFFSET + CME_IMAGE_CPMR_OFFSET + localPspbStartIndex; - io_ppmrHdr.g_ppmr_lppb_length = - localPStateBlock; //FIXME RTC 159737 Need to clarify it from booting perspective + ALIGN_DBWORD( sizeAligned, sizePStateBlock ) + FAPI_DBG("GPSPB Actual size 0x%08x After Alignment 0x%08x", sizePStateBlock, sizeAligned ); + //Updating PPMR header info with GPSPB offset and length + io_ppmrHdr.g_ppmr_gppb_offset = ppmrRunningOffset; + io_ppmrHdr.g_ppmr_gppb_length = sizeAligned; - //------------------------------ OCC P-State Table Allocation ------------------------------ + ppmrRunningOffset += sizeAligned; + pgpeRunningOffset += sizeAligned; + FAPI_DBG("OPPB pgpeRunningOffset 0x%08x OPPB ppmrRunningOffset 0x%08x", + pgpeRunningOffset, ppmrRunningOffset ); - // The PPMR offset is from the begining --- which is the ppmrHeader - io_ppmrHdr.g_ppmr_pstables_offset = pPpmr->pstateTable - pPpmr->ppmrHeader;; - io_ppmrHdr.g_ppmr_pstables_length = sizeof(GeneratedPstateInfo); + //------------------------------ Global P-State Parameter Block Ends ---------------------- - //------------------------------ OCC P-State Table Allocation Ends ------------------------- + //------------------------------ OCC P-State Parameter Block ------------------------------ + FAPI_INF("Copying OCC P-State Parameter Block" ); + sizePStateBlock = sizeof(OCCPstateParmBlock); + ALIGN_DBWORD( sizeAligned, sizePStateBlock ) - //------------------------------ Calculating total PGPE Image Size in SRAM ------------------------ + FAPI_DBG("OPPB size 0x%08x (%d)", sizeAligned, sizeAligned ); + FAPI_DBG("OPSPB Actual size = 0x%08x (%d); After Alignment = 0x%08x (%d)", + sizePStateBlock, sizePStateBlock, + sizeAligned, sizeAligned ); - io_ppmrHdr.g_ppmr_pgpe_sram_img_size = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_hcode_length) + - io_ppmrHdr.g_ppmr_gppb_length; + // MAKE ASSERT + if (sizePStateBlock > OCC_PSTATE_PARAM_BLOCK_SIZE) + { + FAPI_ERR("OCCPstateParmBlock exceeds allocation: size = %X (%d), allocation = %X (%d)", + sizePStateBlock, sizePStateBlock, + OCC_PSTATE_PARAM_BLOCK_SIZE, OCC_PSTATE_PARAM_BLOCK_SIZE); + } - FAPI_DBG("OPPB pgpeRunningOffset 0x%08x io_ppmrHdr.g_ppmr_pgpe_sram_img_size 0x%08x", - pgpeRunningOffset, io_ppmrHdr.g_ppmr_pgpe_sram_img_size ); + // The PPMR offset is from the begining --- which is the ppmrHeader + io_ppmrHdr.g_ppmr_oppb_offset = pPpmr->occParmBlock - pPpmr->ppmrHeader; + io_ppmrHdr.g_ppmr_oppb_length = sizeAligned; + FAPI_DBG("OPPB ppmrRunningOffset 0x%08x", io_ppmrHdr.g_ppmr_oppb_offset); - //Finally let us handle endianess - //CME Header - pCmeHdr->g_cme_pstate_region_length = SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_length); - pCmeHdr->g_cme_common_ring_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_offset); + memcpy( &pPpmr->occParmBlock, &pStateSupStruct.occppb, sizePStateBlock ); - //PPMR Header - io_ppmrHdr.g_ppmr_magic_number = SWIZZLE_8_BYTE(PPMR_MAGIC_NUMBER); - io_ppmrHdr.g_ppmr_gppb_offset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_gppb_offset); - io_ppmrHdr.g_ppmr_gppb_length = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_gppb_length); - io_ppmrHdr.g_ppmr_oppb_offset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_oppb_offset); - io_ppmrHdr.g_ppmr_oppb_length = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_oppb_length); - io_ppmrHdr.g_ppmr_lppb_offset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_lppb_offset); - io_ppmrHdr.g_ppmr_lppb_length = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_lppb_length); - io_ppmrHdr.g_ppmr_pstables_offset = SWIZZLE_4_BYTE( io_ppmrHdr.g_ppmr_pstables_offset); - io_ppmrHdr.g_ppmr_pstables_length = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_pstables_length); - io_ppmrHdr.g_ppmr_pgpe_sram_img_size = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_pgpe_sram_img_size); - } - while(0); + //-------------------------- OCC P-State Parameter Block Ends ------------------------------ -fapi_try_exit: - FAPI_INF("buildParameterBlock exit"); - return fapi2::current_err; -} -//--------------------------------------------------------------------------- + io_ppmrHdr.g_ppmr_lppb_offset = CPMR_HOMER_OFFSET + CME_IMAGE_CPMR_OFFSET + localPspbStartIndex; + io_ppmrHdr.g_ppmr_lppb_length = + localPStateBlock; //FIXME RTC 159737 Need to clarify it from booting perspective -/** - * @brief copies override flavor of scan rings - * @param i_pImageIn points to start of hardware image. - * @param i_pOverride points to override rings. - * @param o_pImageOut points to HOMER image. - * @param i_ddLevel dd level associated with P9 chip. - * @param i_pBuf1 work buffer1 - * @param i_bufSize1 work buffer1 size. - * @param i_pBuf2 work buffer2 - * @param i_bufSize2 work buffer2 size. - * @param i_imgType image type to be built. - * @param o_qpmr temp instance of QpmrHeaderLayout_t - * @param i_platId platform associated with scan ring. - * @return IMG_BUILD_SUCCESS if successful else error code. - */ -uint32_t layoutCmnRingsForCme( Homerlayout_t* i_pHomer, - const P9FuncModel& i_chipState, - RingBufData& i_ringData, - RingDebugMode_t i_debugMode, - RingVariant_t i_ringVariant, - ImageType_t i_imgType, - RingBucket& io_cmeRings, - uint32_t& io_cmnRingSize ) -{ - FAPI_DBG( "> layoutCmnRingsForCme"); - uint32_t rc = IMG_BUILD_SUCCESS; - do - { + //------------------------------ OCC P-State Table Allocation ------------------------------ - uint32_t tempSize = 0; - uint32_t ringSize = 0; - uint8_t* pRingStart = &i_pHomer->cpmrRegion.cmeSramRegion[io_cmnRingSize]; - uint16_t* pScanRingIndex = (uint16_t*) pRingStart; - uint8_t* pRingPayload = pRingStart + CORE_COMMON_RING_INDEX_SIZE; - uint32_t ringStartToHdrOffset = ( TOR_VER_ONE == P9_TOR::tor_version() ) ? RING_START_TO_RS4_OFFSET : 0; + // The PPMR offset is from the begining --- which is the ppmrHeader + io_ppmrHdr.g_ppmr_pstables_offset = pPpmr->pstateTable - pPpmr->ppmrHeader;; + io_ppmrHdr.g_ppmr_pstables_length = sizeof(GeneratedPstateInfo); - if( !i_imgType.cmeCommonRingBuild ) - { - break; - } + //------------------------------ OCC P-State Table Allocation Ends ------------------------- - for( uint32_t ringIndex = 0; ringIndex < EC::g_ecData.iv_num_common_rings; - ringIndex++ ) - { - ringSize = i_ringData.iv_sizeWorkBuf1; - rc = tor_get_single_ring( i_ringData.iv_pRingBuffer, - P9_XIP_MAGIC_CME, - i_chipState.getChipLevel(), - io_cmeRings.getCommonRingId( ringIndex ), - P9_TOR::CME, - i_ringVariant, - CORE0_CHIPLET_ID , - &i_ringData.iv_pWorkBuf1, - ringSize, - 0 ); - - if( ( i_ringData.iv_sizeWorkBuf1 == ringSize ) || ( 0 == ringSize ) || - ( 0 != rc ) ) - { - FAPI_INF( "Did not find core common ring Id %d ", ringIndex ); - rc = 0; - ringSize = 0; - continue; - } - ALIGN_DWORD(tempSize, ringSize) - ALIGN_RING_LOC( pRingStart, pRingPayload ); + //------------------------------ Calculating total PGPE Image Size in SRAM ------------------------ - memcpy( pRingPayload, i_ringData.iv_pWorkBuf1, ringSize ); - *(pScanRingIndex + ringIndex) = SWIZZLE_2_BYTE((pRingPayload - pRingStart) + ringStartToHdrOffset); + io_ppmrHdr.g_ppmr_pgpe_sram_img_size = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_hcode_length) + + io_ppmrHdr.g_ppmr_gppb_length; + FAPI_DBG("OPPB pgpeRunningOffset 0x%08x io_ppmrHdr.g_ppmr_pgpe_sram_img_size 0x%08x", + pgpeRunningOffset, io_ppmrHdr.g_ppmr_pgpe_sram_img_size ); - io_cmeRings.setRingOffset( pRingPayload, io_cmeRings.getCommonRingId( ringIndex )); - io_cmeRings.setRingSize( io_cmeRings.getCommonRingId( ringIndex ), ringSize ); - io_cmeRings.extractRing( i_ringData.iv_pWorkBuf1, ringSize, io_cmeRings.getCommonRingId( ringIndex ) ); + //Finally let us handle endianess + //CME Header + pCmeHdr->g_cme_pstate_region_length = SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_length); + pCmeHdr->g_cme_common_ring_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_offset); - pRingPayload = pRingPayload + ringSize; + //PPMR Header + io_ppmrHdr.g_ppmr_magic_number = SWIZZLE_8_BYTE(PPMR_MAGIC_NUMBER); + io_ppmrHdr.g_ppmr_gppb_offset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_gppb_offset); + io_ppmrHdr.g_ppmr_gppb_length = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_gppb_length); + io_ppmrHdr.g_ppmr_oppb_offset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_oppb_offset); + io_ppmrHdr.g_ppmr_oppb_length = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_oppb_length); + io_ppmrHdr.g_ppmr_lppb_offset = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_lppb_offset); + io_ppmrHdr.g_ppmr_lppb_length = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_lppb_length); + io_ppmrHdr.g_ppmr_pstables_offset = SWIZZLE_4_BYTE( io_ppmrHdr.g_ppmr_pstables_offset); + io_ppmrHdr.g_ppmr_pstables_length = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_pstables_length); + io_ppmrHdr.g_ppmr_pgpe_sram_img_size = SWIZZLE_4_BYTE(io_ppmrHdr.g_ppmr_pgpe_sram_img_size); } + while(0); - ringSize = (pRingPayload - pRingStart); + fapi_try_exit: + FAPI_INF("buildParameterBlock exit"); - if( ringSize > CORE_COMMON_RING_INDEX_SIZE ) - { - io_cmnRingSize += (pRingPayload - pRingStart); - ALIGN_DWORD(tempSize, io_cmnRingSize) - } + return fapi2::current_err; } - while(0); - FAPI_DBG( "< layoutCmnRingsForCme"); - - return rc; -} +//--------------------------------------------------------------------------- -//------------------------------------------------------------------------------ -/** - * @brief creates a lean scan ring layout for core specific rings in HOMER. - * @param i_pHOMER points to HOMER image. - * @param i_chipState functional state of all cores within P9 chip - * @param i_ringData scan ring related data - * @param i_debugMode debug type set for scan rings - * @param i_ringVariant scan ring flavor - * @param i_imgType image type to be built - * @param io_cmeRings instance of RingBucket - * @param io_ringLength input: CME region length populated. Output: Max possible size of instance spec ring - * @param IMG_BUILD_SUCCESS if function succeeds else error code. - */ - -uint32_t layoutInstRingsForCme( Homerlayout_t* i_pHomer, + /** + * @brief copies override flavor of scan rings + * @param i_pImageIn points to start of hardware image. + * @param i_pOverride points to override rings. + * @param o_pImageOut points to HOMER image. + * @param i_ddLevel dd level associated with P9 chip. + * @param i_pBuf1 work buffer1 + * @param i_bufSize1 work buffer1 size. + * @param i_pBuf2 work buffer2 + * @param i_bufSize2 work buffer2 size. + * @param i_imgType image type to be built. + * @param o_qpmr temp instance of QpmrHeaderLayout_t + * @param i_platId platform associated with scan ring. + * @return IMG_BUILD_SUCCESS if successful else error code. + */ + uint32_t layoutCmnRingsForCme( Homerlayout_t* i_pHomer, const P9FuncModel& i_chipState, RingBufData& i_ringData, RingDebugMode_t i_debugMode, RingVariant_t i_ringVariant, ImageType_t i_imgType, RingBucket& io_cmeRings, - uint32_t& io_ringLength ) -{ - FAPI_DBG( "> layoutInstRingsForCme"); - uint32_t rc = IMG_BUILD_SUCCESS; - // Let us find out ring-pair which is biggest in list of 12 ring pairs - uint32_t maxCoreSpecRingLength = 0; - uint32_t ringLength = 0; - uint32_t tempSize = 0; - uint32_t tempRepairLength = 0; - uint32_t ringStartToHdrOffset = ( TOR_VER_ONE == P9_TOR::tor_version() ) ? RING_START_TO_RS4_OFFSET : 0; - - do + uint32_t& io_cmnRingSize ) { - if( !i_imgType.cmeCoreSpecificRingBuild ) - { - break; - } + FAPI_DBG( "> layoutCmnRingsForCme"); + uint32_t rc = IMG_BUILD_SUCCESS; - for( uint32_t exId = 0; exId < MAX_CMES_PER_CHIP; exId++ ) + do { - if( !i_chipState.isExFunctional( exId ) ) - { - FAPI_DBG( "ignoring ex %d for instance ring size consideration", exId); - continue; - } - ringLength = 0; + uint32_t tempSize = 0; + uint32_t ringSize = 0; + uint8_t* pRingStart = &i_pHomer->cpmrRegion.cmeSramRegion[io_cmnRingSize]; + uint16_t* pScanRingIndex = (uint16_t*) pRingStart; + uint8_t* pRingPayload = pRingStart + CORE_COMMON_RING_INDEX_SIZE; + uint32_t ringStartToHdrOffset = ( TOR_VER_ONE == P9_TOR::tor_version() ) ? RING_START_TO_RS4_OFFSET : 0; - for( uint32_t coreId = 0; coreId < MAX_CORES_PER_EX; coreId++ ) + if( !i_imgType.cmeCommonRingBuild ) { - if( !i_chipState.isCoreFunctional( ((2 * exId ) + coreId)) ) - { - FAPI_DBG( "ignoring core %d for instance ring size consideration", (2 * exId ) + coreId ); - continue; - } + break; + } - tempSize = i_ringData.iv_sizeWorkBuf1; + for( uint32_t ringIndex = 0; ringIndex < EC::g_ecData.iv_num_common_rings; + ringIndex++ ) + { + ringSize = i_ringData.iv_sizeWorkBuf1; rc = tor_get_single_ring( i_ringData.iv_pRingBuffer, P9_XIP_MAGIC_CME, i_chipState.getChipLevel(), - io_cmeRings.getInstRingId(0), + io_cmeRings.getCommonRingId( ringIndex ), P9_TOR::CME, i_ringVariant, - CORE0_CHIPLET_ID + ((2 * exId) + coreId), + CORE0_CHIPLET_ID , &i_ringData.iv_pWorkBuf1, - tempSize, - 0 ); + ringSize, + i_debugMode ); - if( (i_ringData.iv_sizeWorkBuf1 == tempSize) || (0 == tempSize ) || + if( ( i_ringData.iv_sizeWorkBuf1 == ringSize ) || ( 0 == ringSize ) || ( 0 != rc ) ) { - FAPI_DBG( "could not determine size of ring id %d of core %d", - io_cmeRings.getInstRingId(0), ((2 * exId) + coreId) ); + FAPI_INF( "Did not find core common ring Id %d ", ringIndex ); + rc = 0; + ringSize = 0; continue; } - ALIGN_DWORD(tempRepairLength, tempSize); - ringLength += tempSize; + ALIGN_DWORD(tempSize, ringSize) + ALIGN_RING_LOC( pRingStart, pRingPayload ); + + memcpy( pRingPayload, i_ringData.iv_pWorkBuf1, ringSize ); + *(pScanRingIndex + ringIndex) = SWIZZLE_2_BYTE((pRingPayload - pRingStart) + ringStartToHdrOffset); + + + io_cmeRings.setRingOffset( pRingPayload, io_cmeRings.getCommonRingId( ringIndex )); + io_cmeRings.setRingSize( io_cmeRings.getCommonRingId( ringIndex ), ringSize ); + io_cmeRings.extractRing( i_ringData.iv_pWorkBuf1, ringSize, io_cmeRings.getCommonRingId( ringIndex ) ); + + pRingPayload = pRingPayload + ringSize; } - maxCoreSpecRingLength = ringLength > maxCoreSpecRingLength ? ringLength : maxCoreSpecRingLength; - } + ringSize = (pRingPayload - pRingStart); - if( maxCoreSpecRingLength > 0 ) - { - maxCoreSpecRingLength += sizeof(CoreSpecRingList_t); - ROUND_OFF_32B(maxCoreSpecRingLength); + if( ringSize > CORE_COMMON_RING_INDEX_SIZE ) + { + io_cmnRingSize += (pRingPayload - pRingStart); + ALIGN_DWORD(tempSize, io_cmnRingSize) + } } + while(0); - FAPI_DBG("Max Instance Spec Ring 0x%08X", maxCoreSpecRingLength); - // Let us copy the rings now. + FAPI_DBG( "< layoutCmnRingsForCme"); - uint8_t* pRingStart = NULL; - uint8_t* pRingPayload = NULL; - uint16_t* pScanRingIndex = NULL; + return rc; + } - for( uint32_t exId = 0; exId < MAX_CMES_PER_CHIP; exId++ ) - { - pRingStart = (uint8_t*)&i_pHomer->cpmrRegion.cmeSramRegion[io_ringLength + ( exId * maxCoreSpecRingLength ) ]; - pRingPayload = pRingStart + sizeof(CoreSpecRingList_t); - pScanRingIndex = (uint16_t*)pRingStart; +//------------------------------------------------------------------------------ + /** + * @brief creates a lean scan ring layout for core specific rings in HOMER. + * @param i_pHOMER points to HOMER image. + * @param i_chipState functional state of all cores within P9 chip + * @param i_ringData scan ring related data + * @param i_debugMode debug type set for scan rings + * @param i_ringVariant scan ring flavor + * @param i_imgType image type to be built + * @param io_cmeRings instance of RingBucket + * @param io_ringLength input: CME region length populated. Output: Max possible size of instance spec ring + * @param IMG_BUILD_SUCCESS if function succeeds else error code. + */ - if( !i_chipState.isExFunctional( exId ) ) + uint32_t layoutInstRingsForCme( Homerlayout_t* i_pHomer, + const P9FuncModel& i_chipState, + RingBufData& i_ringData, + RingDebugMode_t i_debugMode, + RingVariant_t i_ringVariant, + ImageType_t i_imgType, + RingBucket& io_cmeRings, + uint32_t& io_ringLength ) + { + FAPI_DBG( "> layoutInstRingsForCme"); + uint32_t rc = IMG_BUILD_SUCCESS; + // Let us find out ring-pair which is biggest in list of 12 ring pairs + uint32_t maxCoreSpecRingLength = 0; + uint32_t ringLength = 0; + uint32_t tempSize = 0; + uint32_t tempRepairLength = 0; + uint32_t ringStartToHdrOffset = ( TOR_VER_ONE == P9_TOR::tor_version() ) ? RING_START_TO_RS4_OFFSET : 0; + + do + { + if( !i_imgType.cmeCoreSpecificRingBuild ) { - FAPI_DBG("skipping copy of core specific rings of ex %d", exId); - continue; + break; } - for( uint32_t coreId = 0; coreId < MAX_CORES_PER_EX; coreId++ ) + for( uint32_t exId = 0; exId < MAX_CMES_PER_CHIP; exId++ ) { - if( !i_chipState.isCoreFunctional( ((2 * exId ) + coreId)) ) + if( !i_chipState.isExFunctional( exId ) ) { - FAPI_DBG( "ignoring core %d for instance ring size consideration", (2 * exId ) + coreId ); + FAPI_DBG( "ignoring ex %d for instance ring size consideration", exId); continue; } - tempSize = i_ringData.iv_sizeWorkBuf1; - rc = tor_get_single_ring( i_ringData.iv_pRingBuffer, - P9_XIP_MAGIC_CME, - i_chipState.getChipLevel(), - io_cmeRings.getInstRingId(0), - P9_TOR::CME, - i_ringVariant, - CORE0_CHIPLET_ID + ((2 * exId) + coreId), - &i_ringData.iv_pWorkBuf1, - tempSize, - 0 ); + ringLength = 0; - if( (i_ringData.iv_sizeWorkBuf1 == tempSize) || (0 == tempSize ) || - ( 0 != rc ) ) + for( uint32_t coreId = 0; coreId < MAX_CORES_PER_EX; coreId++ ) { - FAPI_INF("Instance ring Id %d not found for EX %d core %d", - io_cmeRings.getInstRingId(0), exId, coreId ); - rc = 0; - tempSize = 0; - continue; + if( !i_chipState.isCoreFunctional( ((2 * exId ) + coreId)) ) + { + FAPI_DBG( "ignoring core %d for instance ring size consideration", (2 * exId ) + coreId ); + continue; + } + + tempSize = i_ringData.iv_sizeWorkBuf1; + rc = tor_get_single_ring( i_ringData.iv_pRingBuffer, + P9_XIP_MAGIC_CME, + i_chipState.getChipLevel(), + io_cmeRings.getInstRingId(0), + P9_TOR::CME, + i_ringVariant, + CORE0_CHIPLET_ID + ((2 * exId) + coreId), + &i_ringData.iv_pWorkBuf1, + tempSize, + i_debugMode ); + + if( (i_ringData.iv_sizeWorkBuf1 == tempSize) || (0 == tempSize ) || + ( 0 != rc ) ) + { + FAPI_DBG( "could not determine size of ring id %d of core %d", + io_cmeRings.getInstRingId(0), ((2 * exId) + coreId) ); + continue; + } + + ALIGN_DWORD(tempRepairLength, tempSize); + ringLength += tempSize; } - ALIGN_RING_LOC( pRingStart, pRingPayload ); - memcpy( pRingPayload, i_ringData.iv_pWorkBuf1, tempSize); - io_cmeRings.extractRing( i_ringData.iv_pWorkBuf1, tempSize, io_cmeRings.getInstRingId(0) ); - io_cmeRings.setRingOffset( pRingPayload, - io_cmeRings.getInstRingId(0), - ( MAX_CORES_PER_EX * exId ) + coreId ); - *(pScanRingIndex + coreId) = SWIZZLE_2_BYTE((pRingPayload - pRingStart ) + ringStartToHdrOffset); - - pRingPayload = pRingPayload + tempSize; - io_cmeRings.setRingSize( io_cmeRings.getInstRingId(0), tempSize, ((MAX_CORES_PER_EX * exId) + coreId) ); + maxCoreSpecRingLength = ringLength > maxCoreSpecRingLength ? ringLength : maxCoreSpecRingLength; } - } - io_ringLength = maxCoreSpecRingLength; - } - while(0); + if( maxCoreSpecRingLength > 0 ) + { + maxCoreSpecRingLength += sizeof(CoreSpecRingList_t); + ROUND_OFF_32B(maxCoreSpecRingLength); + } - FAPI_DBG( "< layoutInstRingsForCme"); + FAPI_DBG("Max Instance Spec Ring 0x%08X", maxCoreSpecRingLength); + // Let us copy the rings now. - return rc; -} + uint8_t* pRingStart = NULL; + uint8_t* pRingPayload = NULL; + uint16_t* pScanRingIndex = NULL; -//------------------------------------------------------------------------------ + for( uint32_t exId = 0; exId < MAX_CMES_PER_CHIP; exId++ ) + { + pRingStart = (uint8_t*)&i_pHomer->cpmrRegion.cmeSramRegion[io_ringLength + ( exId * maxCoreSpecRingLength ) ]; + pRingPayload = pRingStart + sizeof(CoreSpecRingList_t); + pScanRingIndex = (uint16_t*)pRingStart; -uint32_t layoutCmeScanOverride( Homerlayout_t* i_pHomer, - void* i_pOverride, - const P9FuncModel& i_chipState, - RingBufData& i_ringData, - RingDebugMode_t i_debugMode, - ImageType_t i_imgType, - uint32_t& io_ovrdRingLength ) -{ - FAPI_INF("> layoutCmeScanOverride" ); - uint32_t rc = IMG_BUILD_SUCCESS; - uint32_t tempRingLength = io_ovrdRingLength; - uint32_t tempBufSize = 0; - uint32_t ringStartToHdrOffset = ( TOR_VER_ONE == P9_TOR::tor_version() ) ? RING_START_TO_RS4_OFFSET : 0; + if( !i_chipState.isExFunctional( exId ) ) + { + FAPI_DBG("skipping copy of core specific rings of ex %d", exId); + continue; + } - RingBucket cmeOvrdRings( PLAT_CME, - (uint8_t*)&i_pHomer->cpmrRegion, - i_debugMode ); + for( uint32_t coreId = 0; coreId < MAX_CORES_PER_EX; coreId++ ) + { + if( !i_chipState.isCoreFunctional( ((2 * exId ) + coreId)) ) + { + FAPI_DBG( "ignoring core %d for instance ring size consideration", (2 * exId ) + coreId ); + continue; + } + + tempSize = i_ringData.iv_sizeWorkBuf1; + rc = tor_get_single_ring( i_ringData.iv_pRingBuffer, + P9_XIP_MAGIC_CME, + i_chipState.getChipLevel(), + io_cmeRings.getInstRingId(0), + P9_TOR::CME, + i_ringVariant, + CORE0_CHIPLET_ID + ((2 * exId) + coreId), + &i_ringData.iv_pWorkBuf1, + tempSize, + i_debugMode ); + + if( (i_ringData.iv_sizeWorkBuf1 == tempSize) || (0 == tempSize ) || + ( 0 != rc ) ) + { + FAPI_INF("Instance ring Id %d not found for EX %d core %d", + io_cmeRings.getInstRingId(0), exId, coreId ); + rc = 0; + tempSize = 0; + continue; + } + + ALIGN_RING_LOC( pRingStart, pRingPayload ); + memcpy( pRingPayload, i_ringData.iv_pWorkBuf1, tempSize); + io_cmeRings.extractRing( i_ringData.iv_pWorkBuf1, tempSize, io_cmeRings.getInstRingId(0) ); + io_cmeRings.setRingOffset( pRingPayload, + io_cmeRings.getInstRingId(0), + ( MAX_CORES_PER_EX * exId ) + coreId ); + *(pScanRingIndex + coreId) = SWIZZLE_2_BYTE((pRingPayload - pRingStart ) + ringStartToHdrOffset); + + pRingPayload = pRingPayload + tempSize; + io_cmeRings.setRingSize( io_cmeRings.getInstRingId(0), tempSize, ((MAX_CORES_PER_EX * exId) + coreId) ); + } + } - do - { - if( !i_imgType.cmeCommonRingBuild ) - { - break; + io_ringLength = maxCoreSpecRingLength; } + while(0); - //Start override ring from the actual end of base common rings. Remember overrides reside within - //common rings region - uint8_t* pOverrideStart = &i_pHomer->cpmrRegion.cmeSramRegion[tempRingLength]; - uint16_t* pScanRingIndex = (uint16_t*)pOverrideStart; + FAPI_DBG( "< layoutInstRingsForCme"); - //get core common rings - uint8_t* pOverrideRingPayload = pOverrideStart + CORE_COMMON_RING_INDEX_SIZE; - bool overrideNotFound = true; + return rc; + } - for( uint8_t ringIndex = 0; ringIndex < EC::g_ecData.iv_num_common_rings; - ringIndex++ ) - { - tempBufSize = i_ringData.iv_sizeWorkBuf2; +//------------------------------------------------------------------------------ - FAPI_DBG("Calling P9_TOR::tor_get_single_ring ring 0x%08X", ringIndex); - rc = tor_get_single_ring( i_pOverride, - P9_XIP_MAGIC_SEEPROM, - i_chipState.getChipLevel(), - cmeOvrdRings.getCommonRingId( ringIndex ), - P9_TOR::SBE, - OVERRIDE, - CORE0_CHIPLET_ID, - &i_ringData.iv_pWorkBuf2, - tempBufSize, - 0 ); + uint32_t layoutCmeScanOverride( Homerlayout_t* i_pHomer, + void* i_pOverride, + const P9FuncModel& i_chipState, + RingBufData& i_ringData, + RingDebugMode_t i_debugMode, + ImageType_t i_imgType, + uint32_t& io_ovrdRingLength ) + { + FAPI_INF("> layoutCmeScanOverride" ); + uint32_t rc = IMG_BUILD_SUCCESS; + uint32_t tempRingLength = io_ovrdRingLength; + uint32_t tempBufSize = 0; + uint32_t ringStartToHdrOffset = ( TOR_VER_ONE == P9_TOR::tor_version() ) ? RING_START_TO_RS4_OFFSET : 0; - if( (i_ringData.iv_sizeWorkBuf2 == tempBufSize) || (0 == tempBufSize ) || - ( 0 != rc ) ) + RingBucket cmeOvrdRings( PLAT_CME, + (uint8_t*)&i_pHomer->cpmrRegion, + i_debugMode ); + do + { + if( !i_imgType.cmeCommonRingBuild ) { - tempBufSize = 0; - continue; + break; } - overrideNotFound = false; - ALIGN_DWORD(tempRingLength, tempBufSize) - ALIGN_RING_LOC( pOverrideStart, pOverrideRingPayload ); - - memcpy( pOverrideRingPayload, i_ringData.iv_pWorkBuf2, tempBufSize); - *(pScanRingIndex + ringIndex) = SWIZZLE_2_BYTE((pOverrideRingPayload - pOverrideStart) + ringStartToHdrOffset); + //Start override ring from the actual end of base common rings. Remember overrides reside within + //common rings region + uint8_t* pOverrideStart = &i_pHomer->cpmrRegion.cmeSramRegion[tempRingLength]; + uint16_t* pScanRingIndex = (uint16_t*)pOverrideStart; - cmeOvrdRings.setRingOffset(pOverrideRingPayload, cmeOvrdRings.getCommonRingId( ringIndex )); - cmeOvrdRings.setRingSize( cmeOvrdRings.getCommonRingId( ringIndex ), tempBufSize ); - cmeOvrdRings.extractRing( i_ringData.iv_pWorkBuf1, tempBufSize, cmeOvrdRings.getCommonRingId( ringIndex ) ); - - pOverrideRingPayload = pOverrideRingPayload + tempBufSize; - } + //get core common rings + uint8_t* pOverrideRingPayload = pOverrideStart + CORE_COMMON_RING_INDEX_SIZE; + bool overrideNotFound = true; - if( overrideNotFound ) - { - FAPI_INF("Overrides not found for CME"); - rc = BUILD_FAIL_OVERRIDE; // Not considered an error - break; - } - - io_ovrdRingLength += (pOverrideRingPayload - pOverrideStart ); - ALIGN_DWORD(tempRingLength, io_ovrdRingLength) + for( uint8_t ringIndex = 0; ringIndex < EC::g_ecData.iv_num_common_rings; + ringIndex++ ) + { + tempBufSize = i_ringData.iv_sizeWorkBuf2; - FAPI_DBG( "Override Ring Length 0x%08X", io_ovrdRingLength ); - } - while(0); + FAPI_DBG("Calling P9_TOR::tor_get_single_ring ring 0x%08X", ringIndex); + rc = tor_get_single_ring( i_pOverride, + P9_XIP_MAGIC_SEEPROM, + i_chipState.getChipLevel(), + cmeOvrdRings.getCommonRingId( ringIndex ), + P9_TOR::SBE, + OVERRIDE, + CORE0_CHIPLET_ID, + &i_ringData.iv_pWorkBuf2, + tempBufSize, + i_debugMode ); - cmeOvrdRings.dumpOverrideRings(); + if( (i_ringData.iv_sizeWorkBuf2 == tempBufSize) || (0 == tempBufSize ) || + ( 0 != rc ) ) - FAPI_INF("< layoutCmeScanOverride" ); - return rc; -} + { + tempBufSize = 0; + continue; + } -//------------------------------------------------------------------------------ + overrideNotFound = false; + ALIGN_DWORD(tempRingLength, tempBufSize) + ALIGN_RING_LOC( pOverrideStart, pOverrideRingPayload ); -/** - * @brief creates a lean scan ring layout for core rings in HOMER. - * @param i_pHOMER points to HOMER image. - * @param i_chipState functional state of all cores within P9 chip - * @param i_ringData processor target - * @param i_debugMode debug mode type for scan rings - * @param i_riskLevel IPL type - * @param i_imgType image type to be built - * @param i_pOverride points to override binary. - * @param IMG_BUILD_SUCCESS if function succeeds else error code. - */ -uint32_t layoutRingsForCME( Homerlayout_t* i_pHomer, - const P9FuncModel& i_chipState, - RingBufData& i_ringData, - RingDebugMode_t i_debugMode, - uint32_t i_riskLevel, - ImageType_t i_imgType, - void* i_pOverride ) -{ - FAPI_DBG( "> layoutRingsForCME"); - uint32_t rc = IMG_BUILD_SUCCESS; - uint32_t ringLength = 0; - uint32_t tempLength = 0; - RingVariant_t l_ringVariant = BASE; - cmeHeader_t* pCmeHdr = (cmeHeader_t*) &i_pHomer->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE]; - RingBucket cmeRings( PLAT_CME, - (uint8_t*)&i_pHomer->cpmrRegion, - i_debugMode ); - - do - { - if( !i_imgType.cmeCommonRingBuild ) - { - break; - } + memcpy( pOverrideRingPayload, i_ringData.iv_pWorkBuf2, tempBufSize); + *(pScanRingIndex + ringIndex) = SWIZZLE_2_BYTE((pOverrideRingPayload - pOverrideStart) + ringStartToHdrOffset); - // get all the rings pertaining to CME in a work buffer first. - if( i_riskLevel ) - { - l_ringVariant = RL; - } + cmeOvrdRings.setRingOffset(pOverrideRingPayload, cmeOvrdRings.getCommonRingId( ringIndex )); + cmeOvrdRings.setRingSize( cmeOvrdRings.getCommonRingId( ringIndex ), tempBufSize ); + cmeOvrdRings.extractRing( i_ringData.iv_pWorkBuf1, tempBufSize, cmeOvrdRings.getCommonRingId( ringIndex ) ); - ringLength = SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_offset) + SWIZZLE_4_BYTE( - pCmeHdr->g_cme_pstate_region_length); - //save the length where hcode ends - tempLength = ringLength; - - layoutCmnRingsForCme( i_pHomer, - i_chipState, - i_ringData, - i_debugMode, - l_ringVariant, - i_imgType, - cmeRings, - ringLength ); - - if( i_pOverride ) - { - uint32_t temp = 0; - uint32_t tempRc = 0; - ALIGN_DWORD( temp, ringLength ); - temp = ringLength; - - tempRc = layoutCmeScanOverride( i_pHomer, - i_pOverride, - i_chipState, - i_ringData, - i_debugMode, - i_imgType, - ringLength ); - - if( BUILD_FAIL_OVERRIDE == tempRc ) - { - //found no core overrides - pCmeHdr->g_cme_cmn_ring_ovrd_offset = 0; + pOverrideRingPayload = pOverrideRingPayload + tempBufSize; } - else + + if( overrideNotFound ) { - pCmeHdr->g_cme_cmn_ring_ovrd_offset = temp; + FAPI_INF("Overrides not found for CME"); + rc = BUILD_FAIL_OVERRIDE; // Not considered an error + break; } - } - pCmeHdr->g_cme_common_ring_length = ringLength - tempLength; //cmn ring end - hcode end + io_ovrdRingLength += (pOverrideRingPayload - pOverrideStart ); + ALIGN_DWORD(tempRingLength, io_ovrdRingLength) - if( !pCmeHdr->g_cme_common_ring_length ) - { - //No common ring , so force offset to be 0 - pCmeHdr->g_cme_common_ring_offset = 0; + FAPI_DBG( "Override Ring Length 0x%08X", io_ovrdRingLength ); } + while(0); - tempLength = ringLength; - tempLength = (( tempLength + CME_BLOCK_READ_LEN - 1 ) >> CME_BLK_SIZE_SHIFT ); //multiple of 32B - ringLength = tempLength << CME_BLK_SIZE_SHIFT; //start position of instance rings - - layoutInstRingsForCme( i_pHomer, - i_chipState, - i_ringData, - i_debugMode, - BASE, // VPD rings are always BASE - i_imgType, - cmeRings, - ringLength ); + cmeOvrdRings.dumpOverrideRings(); - if( ringLength ) - { - pCmeHdr->g_cme_max_spec_ring_length = - ( ringLength + CME_BLOCK_READ_LEN - 1 ) >> CME_BLK_SIZE_SHIFT; - pCmeHdr->g_cme_core_spec_ring_offset = tempLength; - } - - //Let us handle endianess now - pCmeHdr->g_cme_common_ring_length = SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_length); - pCmeHdr->g_cme_core_spec_ring_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_core_spec_ring_offset); - pCmeHdr->g_cme_max_spec_ring_length = SWIZZLE_4_BYTE(pCmeHdr->g_cme_max_spec_ring_length); - pCmeHdr->g_cme_cmn_ring_ovrd_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_cmn_ring_ovrd_offset); + FAPI_INF("< layoutCmeScanOverride" ); + return rc; } - while(0); - - cmeRings.dumpRings(); - FAPI_DBG("CME Header Ring Details "); - FAPI_DBG( "PS Offset %d (0x%08X)", SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_offset), - SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_offset)); - FAPI_DBG("PS Lengtrh %d (0x%08X)", SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_length), - SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_length) ); - FAPI_DBG("Common Ring Offset %d (0x%08X) ", SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_offset), - SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_offset)); - FAPI_DBG("Common Ring Length %d (0x%08X) ", SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_length), - SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_length)); - FAPI_DBG("Instance Ring Offset / 32 %d (0x%08X) ", SWIZZLE_4_BYTE(pCmeHdr->g_cme_core_spec_ring_offset), - SWIZZLE_4_BYTE(pCmeHdr->g_cme_core_spec_ring_offset)); - FAPI_DBG("Instance Ring Length / 32 %d (0x%08X) ", SWIZZLE_4_BYTE(pCmeHdr->g_cme_max_spec_ring_length), - - SWIZZLE_4_BYTE(pCmeHdr->g_cme_max_spec_ring_length)); - - FAPI_DBG( "< layoutRingsForCME"); - - return rc; -} - //------------------------------------------------------------------------------ -/** - * @brief creates a scan ring layout for quad common rings in HOMER. - * @param i_pHOMER points to HOMER image. - * @param i_chipState functional state of all cores within P9 chip - * @param i_ringData contains ring buffers and respective sizes - * @param i_debugMode scan ring debug state - * @param i_ringVariant variant of the scan ring to be copied. - * @param io_qpmrHdr instance of QPMR header. - * @param i_imgType image type to be built - * @param io_sgpeRings stores position and length of all quad common rings. - * @param IMG_BUILD_SUCCESS if function succeeds else error code. - */ -uint32_t layoutCmnRingsForSgpe( Homerlayout_t* i_pHomer, + /** + * @brief creates a lean scan ring layout for core rings in HOMER. + * @param i_pHOMER points to HOMER image. + * @param i_chipState functional state of all cores within P9 chip + * @param i_ringData processor target + * @param i_debugMode debug mode type for scan rings + * @param i_riskLevel IPL type + * @param i_imgType image type to be built + * @param i_pOverride points to override binary. + * @param IMG_BUILD_SUCCESS if function succeeds else error code. + */ + uint32_t layoutRingsForCME( Homerlayout_t* i_pHomer, const P9FuncModel& i_chipState, - RingBufData& i_ringData, + RingBufData& i_ringData, RingDebugMode_t i_debugMode, - RingVariant_t i_ringVariant, - QpmrHeaderLayout_t& io_qpmrHdr, + uint32_t i_riskLevel, ImageType_t i_imgType, - RingBucket& io_sgpeRings ) -{ - FAPI_DBG("> layoutCmnRingsForSgpe"); - - uint32_t rc = IMG_BUILD_SUCCESS; - uint32_t sgpeHcodeSize = SWIZZLE_4_BYTE(io_qpmrHdr.sgpeImgLength); - uint8_t* pCmnRingPayload = &i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage[sgpeHcodeSize + - QUAD_COMMON_RING_INDEX_SIZE];; - uint16_t* pCmnRingIndex = (uint16_t*)&i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage[sgpeHcodeSize]; - uint8_t* pRingStart = &i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage[sgpeHcodeSize]; - uint32_t ringIndex = 0; - uint32_t tempLength = 0; - uint32_t tempBufSize = i_ringData.iv_sizeWorkBuf1; - uint32_t ringStartToHdrOffset = ( TOR_VER_ONE == P9_TOR::tor_version() ) ? RING_START_TO_RS4_OFFSET : 0; - - RingBucket sgpeRings( PLAT_SGPE, - (uint8_t*)&i_pHomer->qpmrRegion, - i_debugMode ); - - do + void* i_pOverride ) { - if( !i_imgType.sgpeCommonRingBuild ) - { - break; - } + FAPI_DBG( "> layoutRingsForCME"); + uint32_t rc = IMG_BUILD_SUCCESS; + uint32_t ringLength = 0; + uint32_t tempLength = 0; + RingVariant_t l_ringVariant = BASE; + cmeHeader_t* pCmeHdr = (cmeHeader_t*) &i_pHomer->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE]; + RingBucket cmeRings( PLAT_CME, + (uint8_t*)&i_pHomer->cpmrRegion, + i_debugMode ); - //get core common rings - for( ; ringIndex < EQ::g_eqData.iv_num_common_rings; ringIndex++ ) + do { - tempBufSize = i_ringData.iv_sizeWorkBuf1; - - rc = tor_get_single_ring( i_ringData.iv_pRingBuffer, - P9_XIP_MAGIC_SGPE, - i_chipState.getChipLevel(), - io_sgpeRings.getCommonRingId( ringIndex ), - P9_TOR::SGPE, - i_ringVariant, - CACHE0_CHIPLET_ID, - &i_ringData.iv_pWorkBuf1, - tempBufSize, - 0 ); - - if( (i_ringData.iv_sizeWorkBuf1 == tempBufSize) || (0 == tempBufSize ) || - ( 0 != rc ) ) - { - FAPI_INF( "did not find quad common ring %d", ringIndex ); - rc = IMG_BUILD_SUCCESS; - tempBufSize = 0; - continue; - } - - ALIGN_DWORD(tempLength, tempBufSize) - ALIGN_RING_LOC( pRingStart, pCmnRingPayload ); - - memcpy( pCmnRingPayload, i_ringData.iv_pWorkBuf1, tempBufSize); - io_sgpeRings.setRingOffset( pCmnRingPayload, io_sgpeRings.getCommonRingId( ringIndex ) ); - *(pCmnRingIndex + ringIndex) = SWIZZLE_2_BYTE((pCmnRingPayload - pRingStart ) + ringStartToHdrOffset); - io_sgpeRings.setRingSize( io_sgpeRings.getCommonRingId( ringIndex ), tempBufSize ); - io_sgpeRings.extractRing( i_ringData.iv_pWorkBuf1, tempBufSize, io_sgpeRings.getCommonRingId( ringIndex ) ); - pCmnRingPayload = pCmnRingPayload + tempBufSize; - - }//for common rings - - tempLength = pCmnRingPayload - pRingStart; - io_qpmrHdr.quadCommonRingLength = tempLength; - io_qpmrHdr.quadCommonRingOffset = i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage - - (uint8_t*)&i_pHomer->qpmrRegion; - io_qpmrHdr.quadCommonRingOffset += sgpeHcodeSize; - FAPI_DBG("Quad Cmn Ring Length 0x%08X", io_qpmrHdr.quadCommonRingLength ); + if( !i_imgType.cmeCommonRingBuild ) + { + break; + } - } - while(0); //building common rings + // get all the rings pertaining to CME in a work buffer first. + if( i_riskLevel ) + { + l_ringVariant = RL; + } - FAPI_DBG("< layoutCmnRingsForSgpe"); + ringLength = SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_offset) + SWIZZLE_4_BYTE( + pCmeHdr->g_cme_pstate_region_length); + //save the length where hcode ends + tempLength = ringLength; + + layoutCmnRingsForCme( i_pHomer, + i_chipState, + i_ringData, + i_debugMode, + l_ringVariant, + i_imgType, + cmeRings, + ringLength ); + + if( i_pOverride ) + { + uint32_t temp = 0; + uint32_t tempRc = 0; + ALIGN_DWORD( temp, ringLength ); + temp = ringLength; + + tempRc = layoutCmeScanOverride( i_pHomer, + i_pOverride, + i_chipState, + i_ringData, + i_debugMode, + i_imgType, + ringLength ); + + if( BUILD_FAIL_OVERRIDE == tempRc ) + { + //found no core overrides + pCmeHdr->g_cme_cmn_ring_ovrd_offset = 0; + } + else + { + pCmeHdr->g_cme_cmn_ring_ovrd_offset = temp; + } + } - return rc; -} + pCmeHdr->g_cme_common_ring_length = ringLength - tempLength; //cmn ring end - hcode end -//------------------------------------------------------------------------------ + if( !pCmeHdr->g_cme_common_ring_length ) + { + //No common ring , so force offset to be 0 + pCmeHdr->g_cme_common_ring_offset = 0; + } -/** - * @brief creates a scan ring layout for quad common rings in HOMER. - * @param i_pHOMER points to HOMER image. - * @param i_chipState functional state of all cores within P9 chip - * @param i_ringData contains ring buffers and respective sizes - * @param i_debugMode scan ring debug state - * @param i_ringVariant variant of the scan ring to be copied. - * @param io_qpmrHdr instance of QPMR header. - * @param i_imgType image type to be built - * @param io_sgpeRings stores position and length of all quad common rings. - * @param IMG_BUILD_SUCCESS if function succeeds else error code. - */ -uint32_t layoutInstRingsForSgpe( Homerlayout_t* i_pHomer, - const P9FuncModel& i_chipState, - RingBufData& i_ringData, - RingDebugMode_t i_debugMode, - RingVariant_t i_ringVariant, - QpmrHeaderLayout_t& io_qpmrHdr, - ImageType_t i_imgType, - RingBucket& io_sgpeRings ) -{ - uint32_t rc = IMG_BUILD_SUCCESS; + tempLength = ringLength; + tempLength = (( tempLength + CME_BLOCK_READ_LEN - 1 ) >> CME_BLK_SIZE_SHIFT ); //multiple of 32B + ringLength = tempLength << CME_BLK_SIZE_SHIFT; //start position of instance rings + + layoutInstRingsForCme( i_pHomer, + i_chipState, + i_ringData, + i_debugMode, + BASE, // VPD rings are always BASE + i_imgType, + cmeRings, + ringLength ); + + if( ringLength ) + { + pCmeHdr->g_cme_max_spec_ring_length = + ( ringLength + CME_BLOCK_READ_LEN - 1 ) >> CME_BLK_SIZE_SHIFT; + pCmeHdr->g_cme_core_spec_ring_offset = tempLength; + } - do + //Let us handle endianess now + pCmeHdr->g_cme_common_ring_length = SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_length); + pCmeHdr->g_cme_core_spec_ring_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_core_spec_ring_offset); + pCmeHdr->g_cme_max_spec_ring_length = SWIZZLE_4_BYTE(pCmeHdr->g_cme_max_spec_ring_length); + pCmeHdr->g_cme_cmn_ring_ovrd_offset = SWIZZLE_4_BYTE(pCmeHdr->g_cme_cmn_ring_ovrd_offset); + } + while(0); + + cmeRings.dumpRings(); + FAPI_DBG("CME Header Ring Details "); + FAPI_DBG( "PS Offset %d (0x%08X)", SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_offset), + SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_offset)); + FAPI_DBG("PS Lengtrh %d (0x%08X)", SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_length), + SWIZZLE_4_BYTE(pCmeHdr->g_cme_pstate_region_length) ); + FAPI_DBG("Common Ring Offset %d (0x%08X) ", SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_offset), + SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_offset)); + FAPI_DBG("Common Ring Length %d (0x%08X) ", SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_length), + SWIZZLE_4_BYTE(pCmeHdr->g_cme_common_ring_length)); + FAPI_DBG("Instance Ring Offset / 32 %d (0x%08X) ", SWIZZLE_4_BYTE(pCmeHdr->g_cme_core_spec_ring_offset), + SWIZZLE_4_BYTE(pCmeHdr->g_cme_core_spec_ring_offset)); + FAPI_DBG("Instance Ring Length / 32 %d (0x%08X) ", SWIZZLE_4_BYTE(pCmeHdr->g_cme_max_spec_ring_length), + + SWIZZLE_4_BYTE(pCmeHdr->g_cme_max_spec_ring_length)); + + FAPI_DBG( "< layoutRingsForCME"); + + return rc; + } + + +//------------------------------------------------------------------------------ + + /** + * @brief creates a scan ring layout for quad common rings in HOMER. + * @param i_pHOMER points to HOMER image. + * @param i_chipState functional state of all cores within P9 chip + * @param i_ringData contains ring buffers and respective sizes + * @param i_debugMode scan ring debug state + * @param i_ringVariant variant of the scan ring to be copied. + * @param io_qpmrHdr instance of QPMR header. + * @param i_imgType image type to be built + * @param io_sgpeRings stores position and length of all quad common rings. + * @param IMG_BUILD_SUCCESS if function succeeds else error code. + */ + uint32_t layoutCmnRingsForSgpe( Homerlayout_t* i_pHomer, + const P9FuncModel& i_chipState, + RingBufData& i_ringData, + RingDebugMode_t i_debugMode, + RingVariant_t i_ringVariant, + QpmrHeaderLayout_t& io_qpmrHdr, + ImageType_t i_imgType, + RingBucket& io_sgpeRings ) { - if( !i_imgType.sgpeCacheSpecificRingBuild ) - { - break; - } + FAPI_DBG("> layoutCmnRingsForSgpe"); - uint32_t quadSpecRingStart = SWIZZLE_4_BYTE(io_qpmrHdr.sgpeImgLength) + io_qpmrHdr.quadCommonRingLength; - uint16_t* pCmnRingIndex = (uint16_t*)&i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage[ quadSpecRingStart ]; - uint8_t* pRingStart = &i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage[quadSpecRingStart]; - uint8_t* instRingPayLoad = &i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage[ quadSpecRingStart + - QUAD_SPEC_RING_INDEX_LEN ]; + uint32_t rc = IMG_BUILD_SUCCESS; + uint32_t sgpeHcodeSize = SWIZZLE_4_BYTE(io_qpmrHdr.sgpeImgLength); + uint8_t* pCmnRingPayload = &i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage[sgpeHcodeSize + + QUAD_COMMON_RING_INDEX_SIZE];; + uint16_t* pCmnRingIndex = (uint16_t*)&i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage[sgpeHcodeSize]; + uint8_t* pRingStart = &i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage[sgpeHcodeSize]; + uint32_t ringIndex = 0; + uint32_t tempLength = 0; + uint32_t tempBufSize = i_ringData.iv_sizeWorkBuf1; uint32_t ringStartToHdrOffset = ( TOR_VER_ONE == P9_TOR::tor_version() ) ? RING_START_TO_RS4_OFFSET : 0; - for( uint32_t cacheInst = 0; cacheInst < MAX_QUADS_PER_CHIP; cacheInst++ ) + RingBucket sgpeRings( PLAT_SGPE, + (uint8_t*)&i_pHomer->qpmrRegion, + i_debugMode ); + + do { - if( !i_chipState.isQuadFunctional( cacheInst ) ) + if( !i_imgType.sgpeCommonRingBuild ) { - pCmnRingIndex = pCmnRingIndex + QUAD_SPEC_RING_INDEX_SIZE; // Jump to next Quad Index - //Quad is not functional. Don't populate rings. Ring Index will be zero by design - FAPI_INF("Skipping copy of cache chiplet%d", cacheInst); - continue; + break; } - ExIdMap ExChipletRingMap; - uint32_t chipletId = 0; - uint32_t tempBufSize = 0; - uint32_t tempLength = 0; - - for( uint32_t ringIndex = 0; ringIndex < EQ::g_eqData.iv_num_instance_rings_scan_addrs; - ringIndex++ ) + //get core common rings + for( ; ringIndex < EQ::g_eqData.iv_num_common_rings; ringIndex++ ) { tempBufSize = i_ringData.iv_sizeWorkBuf1; - chipletId = ExChipletRingMap.getInstanceId( CACHE0_CHIPLET_ID + cacheInst , ringIndex ); rc = tor_get_single_ring( i_ringData.iv_pRingBuffer, P9_XIP_MAGIC_SGPE, i_chipState.getChipLevel(), - io_sgpeRings.getInstRingId( ringIndex ), + io_sgpeRings.getCommonRingId( ringIndex ), P9_TOR::SGPE, i_ringVariant, - chipletId, + CACHE0_CHIPLET_ID, &i_ringData.iv_pWorkBuf1, tempBufSize, - 0 ); + i_debugMode ); if( (i_ringData.iv_sizeWorkBuf1 == tempBufSize) || (0 == tempBufSize ) || ( 0 != rc ) ) { - FAPI_DBG( "did not find quad spec ring %d for cache Inst %d", ringIndex , cacheInst ); - rc = 0; + FAPI_INF( "did not find quad common ring %d", ringIndex ); + rc = IMG_BUILD_SUCCESS; tempBufSize = 0; continue; } ALIGN_DWORD(tempLength, tempBufSize) - ALIGN_RING_LOC( pRingStart, instRingPayLoad ); + ALIGN_RING_LOC( pRingStart, pCmnRingPayload ); + + memcpy( pCmnRingPayload, i_ringData.iv_pWorkBuf1, tempBufSize); + io_sgpeRings.setRingOffset( pCmnRingPayload, io_sgpeRings.getCommonRingId( ringIndex ) ); + *(pCmnRingIndex + ringIndex) = SWIZZLE_2_BYTE((pCmnRingPayload - pRingStart ) + ringStartToHdrOffset); + io_sgpeRings.setRingSize( io_sgpeRings.getCommonRingId( ringIndex ), tempBufSize ); + io_sgpeRings.extractRing( i_ringData.iv_pWorkBuf1, tempBufSize, io_sgpeRings.getCommonRingId( ringIndex ) ); + pCmnRingPayload = pCmnRingPayload + tempBufSize; - memcpy( instRingPayLoad, i_ringData.iv_pWorkBuf1, tempBufSize); - io_sgpeRings.setRingOffset( instRingPayLoad, io_sgpeRings.getInstRingId( ringIndex ), chipletId ); - *(pCmnRingIndex + ringIndex) = SWIZZLE_2_BYTE((instRingPayLoad - pRingStart ) + ringStartToHdrOffset); - io_sgpeRings.setRingSize( io_sgpeRings.getInstRingId( ringIndex ), tempBufSize, chipletId ); - instRingPayLoad = instRingPayLoad + tempBufSize; - io_sgpeRings.extractRing( i_ringData.iv_pWorkBuf1, tempBufSize, io_sgpeRings.getInstRingId( ringIndex ) ); + }//for common rings - }//for quad spec rings + tempLength = pCmnRingPayload - pRingStart; + io_qpmrHdr.quadCommonRingLength = tempLength; + io_qpmrHdr.quadCommonRingOffset = i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage - + (uint8_t*)&i_pHomer->qpmrRegion; + io_qpmrHdr.quadCommonRingOffset += sgpeHcodeSize; + FAPI_DBG("Quad Cmn Ring Length 0x%08X", io_qpmrHdr.quadCommonRingLength ); - pCmnRingIndex = pCmnRingIndex + QUAD_SPEC_RING_INDEX_SIZE; // Jump to next Quad Index } + while(0); //building common rings - io_qpmrHdr.quadSpecRingOffset = io_qpmrHdr.quadCommonRingOffset + io_qpmrHdr.quadCommonRingLength; - io_qpmrHdr.quadSpecRingLength = (instRingPayLoad - pRingStart); - FAPI_DBG("Instance Ring Length 0x%08X", io_qpmrHdr.quadSpecRingLength); - } - while(0); + FAPI_DBG("< layoutCmnRingsForSgpe"); - return rc; -} + return rc; + } //------------------------------------------------------------------------------ -/** - * @brief creates a scan ring layout for quad common rings in HOMER. - * @param i_pHOMER points to HOMER image. - * @param i_chipState functional state of all cores within P9 chip - * @param i_ringData contains ring buffers and respective sizes - * @param i_debugMode scan ring debug state - * @param i_riskLevel true if system IPL is in risk level mode else false. - * @param io_qpmrHdr instance of QPMR header. - * @param i_imgType image type to be built - * @param IMG_BUILD_SUCCESS if function succeeds else error code. - */ -uint32_t layoutRingsForSGPE( Homerlayout_t* i_pHomer, - void* i_pOverride, - const P9FuncModel& i_chipState, - RingBufData& i_ringData, - RingDebugMode_t i_debugMode, - uint32_t i_riskLevel, - QpmrHeaderLayout_t& io_qpmrHdr, - ImageType_t i_imgType ) -{ - FAPI_DBG( "> layoutRingsForSGPE"); - uint32_t rc = IMG_BUILD_SUCCESS; - RingVariant_t l_ringVariant = BASE; - sgpeHeader_t* pSgpeImgHdr = (sgpeHeader_t*)& i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage[SGPE_INT_VECTOR_SIZE]; - RingBucket sgpeRings( PLAT_SGPE, - (uint8_t*)&i_pHomer->qpmrRegion, - i_debugMode ); - - do + /** + * @brief creates a scan ring layout for quad common rings in HOMER. + * @param i_pHOMER points to HOMER image. + * @param i_chipState functional state of all cores within P9 chip + * @param i_ringData contains ring buffers and respective sizes + * @param i_debugMode scan ring debug state + * @param i_ringVariant variant of the scan ring to be copied. + * @param io_qpmrHdr instance of QPMR header. + * @param i_imgType image type to be built + * @param io_sgpeRings stores position and length of all quad common rings. + * @param IMG_BUILD_SUCCESS if function succeeds else error code. + */ + uint32_t layoutInstRingsForSgpe( Homerlayout_t* i_pHomer, + const P9FuncModel& i_chipState, + RingBufData& i_ringData, + RingDebugMode_t i_debugMode, + RingVariant_t i_ringVariant, + QpmrHeaderLayout_t& io_qpmrHdr, + ImageType_t i_imgType, + RingBucket& io_sgpeRings ) { + uint32_t rc = IMG_BUILD_SUCCESS; - // get all the rings pertaining to CME in a work buffer first. - if( i_riskLevel ) + do { - l_ringVariant = RL; - } + if( !i_imgType.sgpeCacheSpecificRingBuild ) + { + break; + } - //Manage the Quad Common rings in HOMER - layoutCmnRingsForSgpe( i_pHomer, - i_chipState, - i_ringData, - i_debugMode, - l_ringVariant, - io_qpmrHdr, - i_imgType, - sgpeRings ); - - //Manage the Quad Override rings in HOMER - layoutSgpeScanOverride( i_pHomer, - i_pOverride, - i_chipState, - i_ringData, - i_debugMode, - io_qpmrHdr, - i_imgType ); - - //Manage the Quad specific rings in HOMER - layoutInstRingsForSgpe( i_pHomer, - i_chipState, - i_ringData, - i_debugMode, - BASE, // VPD rings are always BASE - io_qpmrHdr, - i_imgType, - sgpeRings ); - - if( 0 == io_qpmrHdr.quadCommonRingLength ) - { - //If quad common rings don't exist ensure its offset in image header is zero - pSgpeImgHdr->g_sgpe_cmn_ring_occ_offset = 0; + uint32_t quadSpecRingStart = SWIZZLE_4_BYTE(io_qpmrHdr.sgpeImgLength) + io_qpmrHdr.quadCommonRingLength; + uint16_t* pCmnRingIndex = (uint16_t*)&i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage[ quadSpecRingStart ]; + uint8_t* pRingStart = &i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage[quadSpecRingStart]; + uint8_t* instRingPayLoad = &i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage[ quadSpecRingStart + + QUAD_SPEC_RING_INDEX_LEN ]; + uint32_t ringStartToHdrOffset = ( TOR_VER_ONE == P9_TOR::tor_version() ) ? RING_START_TO_RS4_OFFSET : 0; + + for( uint32_t cacheInst = 0; cacheInst < MAX_QUADS_PER_CHIP; cacheInst++ ) + { + if( !i_chipState.isQuadFunctional( cacheInst ) ) + { + pCmnRingIndex = pCmnRingIndex + QUAD_SPEC_RING_INDEX_SIZE; // Jump to next Quad Index + //Quad is not functional. Don't populate rings. Ring Index will be zero by design + FAPI_INF("Skipping copy of cache chiplet%d", cacheInst); + continue; + } + + ExIdMap ExChipletRingMap; + uint32_t chipletId = 0; + uint32_t tempBufSize = 0; + uint32_t tempLength = 0; + + for( uint32_t ringIndex = 0; ringIndex < EQ::g_eqData.iv_num_instance_rings_scan_addrs; + ringIndex++ ) + { + tempBufSize = i_ringData.iv_sizeWorkBuf1; + chipletId = ExChipletRingMap.getInstanceId( CACHE0_CHIPLET_ID + cacheInst , ringIndex ); + + rc = tor_get_single_ring( i_ringData.iv_pRingBuffer, + P9_XIP_MAGIC_SGPE, + i_chipState.getChipLevel(), + io_sgpeRings.getInstRingId( ringIndex ), + P9_TOR::SGPE, + i_ringVariant, + chipletId, + &i_ringData.iv_pWorkBuf1, + tempBufSize, + i_debugMode ); + + if( (i_ringData.iv_sizeWorkBuf1 == tempBufSize) || (0 == tempBufSize ) || + ( 0 != rc ) ) + { + FAPI_DBG( "did not find quad spec ring %d for cache Inst %d", ringIndex , cacheInst ); + rc = 0; + tempBufSize = 0; + continue; + } + + ALIGN_DWORD(tempLength, tempBufSize) + ALIGN_RING_LOC( pRingStart, instRingPayLoad ); + + memcpy( instRingPayLoad, i_ringData.iv_pWorkBuf1, tempBufSize); + io_sgpeRings.setRingOffset( instRingPayLoad, io_sgpeRings.getInstRingId( ringIndex ), chipletId ); + *(pCmnRingIndex + ringIndex) = SWIZZLE_2_BYTE((instRingPayLoad - pRingStart ) + ringStartToHdrOffset); + io_sgpeRings.setRingSize( io_sgpeRings.getInstRingId( ringIndex ), tempBufSize, chipletId ); + instRingPayLoad = instRingPayLoad + tempBufSize; + io_sgpeRings.extractRing( i_ringData.iv_pWorkBuf1, tempBufSize, io_sgpeRings.getInstRingId( ringIndex ) ); + + }//for quad spec rings + + pCmnRingIndex = pCmnRingIndex + QUAD_SPEC_RING_INDEX_SIZE; // Jump to next Quad Index + } + + io_qpmrHdr.quadSpecRingOffset = io_qpmrHdr.quadCommonRingOffset + io_qpmrHdr.quadCommonRingLength; + io_qpmrHdr.quadSpecRingLength = (instRingPayLoad - pRingStart); + FAPI_DBG("Instance Ring Length 0x%08X", io_qpmrHdr.quadSpecRingLength); } + while(0); - if( io_qpmrHdr.quadSpecRingLength > 0 ) + return rc; + } + +//------------------------------------------------------------------------------ + + /** + * @brief creates a scan ring layout for quad common rings in HOMER. + * @param i_pHOMER points to HOMER image. + * @param i_chipState functional state of all cores within P9 chip + * @param i_ringData contains ring buffers and respective sizes + * @param i_debugMode scan ring debug state + * @param i_riskLevel true if system IPL is in risk level mode else false. + * @param io_qpmrHdr instance of QPMR header. + * @param i_imgType image type to be built + * @param IMG_BUILD_SUCCESS if function succeeds else error code. + */ + uint32_t layoutRingsForSGPE( Homerlayout_t* i_pHomer, + void* i_pOverride, + const P9FuncModel& i_chipState, + RingBufData& i_ringData, + RingDebugMode_t i_debugMode, + uint32_t i_riskLevel, + QpmrHeaderLayout_t& io_qpmrHdr, + ImageType_t i_imgType ) + { + FAPI_DBG( "> layoutRingsForSGPE"); + uint32_t rc = IMG_BUILD_SUCCESS; + RingVariant_t l_ringVariant = BASE; + sgpeHeader_t* pSgpeImgHdr = (sgpeHeader_t*)& i_pHomer->qpmrRegion.sgpeRegion.sgpeSramImage[SGPE_INT_VECTOR_SIZE]; + RingBucket sgpeRings( PLAT_SGPE, + (uint8_t*)&i_pHomer->qpmrRegion, + i_debugMode ); + + do { - pSgpeImgHdr->g_sgpe_spec_ring_occ_offset = io_qpmrHdr.quadCommonRingLength + - SWIZZLE_4_BYTE(io_qpmrHdr.sgpeImgLength); - pSgpeImgHdr->g_sgpe_scom_offset = - SWIZZLE_4_BYTE(io_qpmrHdr.sgpeImgLength) + io_qpmrHdr.quadCommonRingLength + - io_qpmrHdr.quadSpecRingLength; + + // get all the rings pertaining to CME in a work buffer first. + if( i_riskLevel ) + { + l_ringVariant = RL; + } + + //Manage the Quad Common rings in HOMER + layoutCmnRingsForSgpe( i_pHomer, + i_chipState, + i_ringData, + i_debugMode, + l_ringVariant, + io_qpmrHdr, + i_imgType, + sgpeRings ); + + //Manage the Quad Override rings in HOMER + layoutSgpeScanOverride( i_pHomer, + i_pOverride, + i_chipState, + i_ringData, + i_debugMode, + io_qpmrHdr, + i_imgType ); + + //Manage the Quad specific rings in HOMER + layoutInstRingsForSgpe( i_pHomer, + i_chipState, + i_ringData, + i_debugMode, + BASE, // VPD rings are always BASE + io_qpmrHdr, + i_imgType, + sgpeRings ); + + if( 0 == io_qpmrHdr.quadCommonRingLength ) + { + //If quad common rings don't exist ensure its offset in image header is zero + pSgpeImgHdr->g_sgpe_cmn_ring_occ_offset = 0; + } + + if( io_qpmrHdr.quadSpecRingLength > 0 ) + { + pSgpeImgHdr->g_sgpe_spec_ring_occ_offset = io_qpmrHdr.quadCommonRingLength + + SWIZZLE_4_BYTE(io_qpmrHdr.sgpeImgLength); + pSgpeImgHdr->g_sgpe_scom_offset = + SWIZZLE_4_BYTE(io_qpmrHdr.sgpeImgLength) + io_qpmrHdr.quadCommonRingLength + + io_qpmrHdr.quadSpecRingLength; + } } + while(0); //building instance rings + + //Let us handle endianes at last + io_qpmrHdr.quadCommonRingOffset = SWIZZLE_4_BYTE(io_qpmrHdr.quadCommonRingOffset); + io_qpmrHdr.quadCommonRingLength = SWIZZLE_4_BYTE(io_qpmrHdr.quadCommonRingLength); + io_qpmrHdr.quadCommonOvrdOffset = SWIZZLE_4_BYTE(io_qpmrHdr.quadCommonOvrdOffset); + io_qpmrHdr.quadCommonOvrdLength = SWIZZLE_4_BYTE(io_qpmrHdr.quadCommonOvrdLength); + io_qpmrHdr.quadSpecRingOffset = SWIZZLE_4_BYTE(io_qpmrHdr.quadSpecRingOffset); + io_qpmrHdr.quadSpecRingLength = SWIZZLE_4_BYTE(io_qpmrHdr.quadSpecRingLength); + pSgpeImgHdr->g_sgpe_spec_ring_occ_offset = SWIZZLE_4_BYTE(pSgpeImgHdr->g_sgpe_spec_ring_occ_offset); + pSgpeImgHdr->g_sgpe_scom_offset = SWIZZLE_4_BYTE(pSgpeImgHdr->g_sgpe_scom_offset); + sgpeRings.dumpRings(); + + FAPI_DBG("SGPE Header Ring Details "); + FAPI_DBG("Common Ring Offset %d (0x%08X) ", + SWIZZLE_4_BYTE(pSgpeImgHdr->g_sgpe_cmn_ring_occ_offset), + SWIZZLE_4_BYTE(pSgpeImgHdr->g_sgpe_cmn_ring_occ_offset)); + FAPI_DBG("Instance Ring Offset %d (0x%08X) ", + SWIZZLE_4_BYTE(pSgpeImgHdr->g_sgpe_spec_ring_occ_offset), + SWIZZLE_4_BYTE(pSgpeImgHdr->g_sgpe_spec_ring_occ_offset)); + + + return rc; } - while(0); //building instance rings - - //Let us handle endianes at last - io_qpmrHdr.quadCommonRingOffset = SWIZZLE_4_BYTE(io_qpmrHdr.quadCommonRingOffset); - io_qpmrHdr.quadCommonRingLength = SWIZZLE_4_BYTE(io_qpmrHdr.quadCommonRingLength); - io_qpmrHdr.quadCommonOvrdOffset = SWIZZLE_4_BYTE(io_qpmrHdr.quadCommonOvrdOffset); - io_qpmrHdr.quadCommonOvrdLength = SWIZZLE_4_BYTE(io_qpmrHdr.quadCommonOvrdLength); - io_qpmrHdr.quadSpecRingOffset = SWIZZLE_4_BYTE(io_qpmrHdr.quadSpecRingOffset); - io_qpmrHdr.quadSpecRingLength = SWIZZLE_4_BYTE(io_qpmrHdr.quadSpecRingLength); - pSgpeImgHdr->g_sgpe_spec_ring_occ_offset = SWIZZLE_4_BYTE(pSgpeImgHdr->g_sgpe_spec_ring_occ_offset); - pSgpeImgHdr->g_sgpe_scom_offset = SWIZZLE_4_BYTE(pSgpeImgHdr->g_sgpe_scom_offset); - sgpeRings.dumpRings(); - - FAPI_DBG("SGPE Header Ring Details "); - FAPI_DBG("Common Ring Offset %d (0x%08X) ", - SWIZZLE_4_BYTE(pSgpeImgHdr->g_sgpe_cmn_ring_occ_offset), - SWIZZLE_4_BYTE(pSgpeImgHdr->g_sgpe_cmn_ring_occ_offset)); - FAPI_DBG("Instance Ring Offset %d (0x%08X) ", - SWIZZLE_4_BYTE(pSgpeImgHdr->g_sgpe_spec_ring_occ_offset), - SWIZZLE_4_BYTE(pSgpeImgHdr->g_sgpe_spec_ring_occ_offset)); - - - return rc; -} //--------------------------------------------------------------------------- -/** - * @brief updates the IVPR attributes for SGPE, PGPE. - * @brief i_pChipHomer points to start of HOMER - */ -fapi2::ReturnCode updateGpeAttributes( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PROC& i_procTgt ) -{ - QpmrHeaderLayout_t* pQpmrHdr = (QpmrHeaderLayout_t*)i_pChipHomer->qpmrRegion.sgpeRegion.qpmrHeader; - PpmrHeader_t* pPpmrHdr = (PpmrHeader_t*) i_pChipHomer->ppmrRegion.ppmrHeader; + /** + * @brief updates the IVPR attributes for SGPE, PGPE. + * @brief i_pChipHomer points to start of HOMER + */ + fapi2::ReturnCode updateGpeAttributes( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PROC& i_procTgt ) + { + QpmrHeaderLayout_t* pQpmrHdr = (QpmrHeaderLayout_t*)i_pChipHomer->qpmrRegion.sgpeRegion.qpmrHeader; + PpmrHeader_t* pPpmrHdr = (PpmrHeader_t*) i_pChipHomer->ppmrRegion.ppmrHeader; - uint32_t attrVal = SWIZZLE_4_BYTE(pQpmrHdr->bootCopierOffset); - attrVal |= (0x80000000 | ONE_MB); + uint32_t attrVal = SWIZZLE_4_BYTE(pQpmrHdr->bootCopierOffset); + attrVal |= (0x80000000 | ONE_MB); - FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_STOPGPE_BOOT_COPIER_IVPR_OFFSET, - i_procTgt, - attrVal ), - "Error from FAPI_ATTR_SET for attribute ATTR_STOPGPE_BOOT_COPIER_IVPR_OFFSET"); + FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_STOPGPE_BOOT_COPIER_IVPR_OFFSET, + i_procTgt, + attrVal ), + "Error from FAPI_ATTR_SET for attribute ATTR_STOPGPE_BOOT_COPIER_IVPR_OFFSET"); - FAPI_DBG("Set ATTR_STOPGPE_BOOT_COPIER_IVPR_OFFSET to 0x%08X", attrVal ); + FAPI_DBG("Set ATTR_STOPGPE_BOOT_COPIER_IVPR_OFFSET to 0x%08X", attrVal ); - attrVal = SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_bc_offset); - attrVal |= (0x80000000 | PPMR_HOMER_OFFSET); + attrVal = SWIZZLE_4_BYTE(pPpmrHdr->g_ppmr_bc_offset); + attrVal |= (0x80000000 | PPMR_HOMER_OFFSET); - FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_PSTATEGPE_BOOT_COPIER_IVPR_OFFSET, - i_procTgt, - attrVal ), - "Error from FAPI_ATTR_SET for attribute ATTR_PSTATEGPE_BOOT_COPIER_IVPR_OFFSET"); + FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_PSTATEGPE_BOOT_COPIER_IVPR_OFFSET, + i_procTgt, + attrVal ), + "Error from FAPI_ATTR_SET for attribute ATTR_PSTATEGPE_BOOT_COPIER_IVPR_OFFSET"); - FAPI_DBG("Set ATTR_PSTATEGPE_BOOT_COPIER_IVPR_OFFSET to 0x%08X", attrVal ); + FAPI_DBG("Set ATTR_PSTATEGPE_BOOT_COPIER_IVPR_OFFSET to 0x%08X", attrVal ); -fapi_try_exit: - return fapi2::current_err; -} + fapi_try_exit: + return fapi2::current_err; + } //--------------------------------------------------------------------------- -/** - * @brief Set the Fabric System, Group and Chip IDs into SGPE and CME headers - * @brief i_pChipHomer points to start of HOMER - */ -fapi2::ReturnCode setFabricIds( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PROC& i_procTgt ) -{ + /** + * @brief Set the Fabric System, Group and Chip IDs into SGPE and CME headers + * @brief i_pChipHomer points to start of HOMER + */ + fapi2::ReturnCode setFabricIds( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PROC& i_procTgt ) + { - uint32_t l_system_id; - uint8_t l_group_id; - uint8_t l_chip_id; - fapi2::buffer<uint16_t> l_location_id = 0; - uint16_t l_locationVal = 0; + uint32_t l_system_id; + uint8_t l_group_id; + uint8_t l_chip_id; + fapi2::buffer<uint16_t> l_location_id = 0; + uint16_t l_locationVal = 0; - cmeHeader_t* pCmeHdr = (cmeHeader_t*) & i_pChipHomer->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE]; - sgpeHeader_t* pSgpeHdr = (sgpeHeader_t*)& i_pChipHomer->qpmrRegion.sgpeRegion.sgpeSramImage[SGPE_INT_VECTOR_SIZE]; + cmeHeader_t* pCmeHdr = (cmeHeader_t*) & i_pChipHomer->cpmrRegion.cmeSramRegion[CME_INT_VECTOR_SIZE]; + sgpeHeader_t* pSgpeHdr = (sgpeHeader_t*)& i_pChipHomer->qpmrRegion.sgpeRegion.sgpeSramImage[SGPE_INT_VECTOR_SIZE]; - FAPI_DBG(" ==================== Fabric IDs ================="); - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_FABRIC_SYSTEM_ID, - i_procTgt, - l_system_id), - "Error from FAPI_ATTR_GET for attribute ATTR_PROC_FABRIC_SYSTEM_ID"); + FAPI_DBG(" ==================== Fabric IDs ================="); + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_FABRIC_SYSTEM_ID, + i_procTgt, + l_system_id), + "Error from FAPI_ATTR_GET for attribute ATTR_PROC_FABRIC_SYSTEM_ID"); - FAPI_DBG("Fabric System ID : 0x%04X", l_system_id); + FAPI_DBG("Fabric System ID : 0x%04X", l_system_id); - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_FABRIC_GROUP_ID, - i_procTgt, - l_group_id), - "Error from FAPI_ATTR_GET for attribute ATTR_PROC_FABRIC_GROUP_ID"); + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_FABRIC_GROUP_ID, + i_procTgt, + l_group_id), + "Error from FAPI_ATTR_GET for attribute ATTR_PROC_FABRIC_GROUP_ID"); - FAPI_DBG("Fabric Group ID : 0x%01X", l_group_id); + FAPI_DBG("Fabric Group ID : 0x%01X", l_group_id); - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_FABRIC_CHIP_ID, - i_procTgt, - l_chip_id), - "Error from FAPI_ATTR_GET for attribute ATTR_PROC_FABRIC_CHIP_ID"); + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_FABRIC_CHIP_ID, + i_procTgt, + l_chip_id), + "Error from FAPI_ATTR_GET for attribute ATTR_PROC_FABRIC_CHIP_ID"); - FAPI_DBG("Fabric Chip ID : 0x%01X", l_chip_id); + FAPI_DBG("Fabric Chip ID : 0x%01X", l_chip_id); - // Create a unit16_t Location Ids in the form of: - // 0:3 Group ID (loaded from ATTR_PROC_FABRIC_GROUP_ID) - // 4:6 Chip ID (loaded from ATTR_PROC_FABRIC_CHIP_ID) - // 7 0 - // 8:12 System ID (loaded from ATTR_PROC_FABRIC_SYSTEM_ID) - // 13:15 00 + // Create a unit16_t Location Ids in the form of: + // 0:3 Group ID (loaded from ATTR_PROC_FABRIC_GROUP_ID) + // 4:6 Chip ID (loaded from ATTR_PROC_FABRIC_CHIP_ID) + // 7 0 + // 8:12 System ID (loaded from ATTR_PROC_FABRIC_SYSTEM_ID) + // 13:15 00 - l_location_id.insert < 0, 4, 8 - 4, uint8_t > ( l_group_id ); - l_location_id.insert < 4, 3, 8 - 3, uint8_t > ( l_chip_id ); - l_location_id.insert < 8, 5, 32 - 5, uint32_t > ( l_system_id ); + l_location_id.insert < 0, 4, 8 - 4, uint8_t > ( l_group_id ); + l_location_id.insert < 4, 3, 8 - 3, uint8_t > ( l_chip_id ); + l_location_id.insert < 8, 5, 32 - 5, uint32_t > ( l_system_id ); - FAPI_DBG("Location ID : 0x%04X", l_location_id); + FAPI_DBG("Location ID : 0x%04X", l_location_id); - l_location_id.extract<0, 16>(l_locationVal); - // Populate the CME Header - pCmeHdr->g_cme_location_id = SWIZZLE_2_BYTE(l_locationVal); + l_location_id.extract<0, 16>(l_locationVal); + // Populate the CME Header + pCmeHdr->g_cme_location_id = SWIZZLE_2_BYTE(l_locationVal); - // Populate the SGPE Header - pSgpeHdr->g_sgpe_location_id = SWIZZLE_2_BYTE(l_locationVal); + // Populate the SGPE Header + pSgpeHdr->g_sgpe_location_id = SWIZZLE_2_BYTE(l_locationVal); -fapi_try_exit: - return fapi2::current_err; + fapi_try_exit: + return fapi2::current_err; -} + } //--------------------------------------------------------------------------------------------------- -/** - * @brief populates EQ SCOM restore region of HOMER with SCOM restore value for NCU RNG BAR ENABLE. - * @param i_pChipHomer points to start of P9 HOMER - * @param i_procTgt fapi2 target for p9 chip. - * @return faip2 return code. - */ -fapi2::ReturnCode populateNcuRingBarScomReg( void* i_pChipHomer, CONST_FAPI2_PROC& i_procTgt ) -{ - FAPI_DBG("> populateNcuRingBarScomReg"); - - do + /** + * @brief populates EQ SCOM restore region of HOMER with SCOM restore value for NCU RNG BAR ENABLE. + * @param i_pChipHomer points to start of P9 HOMER + * @param i_procTgt fapi2 target for p9 chip. + * @return faip2 return code. + */ + fapi2::ReturnCode populateNcuRingBarScomReg( void* i_pChipHomer, CONST_FAPI2_PROC& i_procTgt ) { - uint8_t attrVal = 0; - uint64_t nxRangeBarAddrOffset = 0; - uint64_t regNcuRngBarData = 0; - uint64_t baseAddressNm0 = 0; - uint64_t baseAddressNm1 = 0; - uint64_t baseAddressMirror = 0; - uint32_t ncuBarRegisterAddr = 0; - const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM; - - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_NX_RNG_BAR_ENABLE, - i_procTgt, - attrVal ), - "Error from FAPI_ATTR_GET for attribute ATTR_PROC_NX_RNG_BAR_ENABLE"); - - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_NX_RNG_BAR_BASE_ADDR_OFFSET, - FAPI_SYSTEM, - nxRangeBarAddrOffset ), - "Error from FAPI_ATTR_GET for attribute ATTR_PROC_NX_RNG_BAR_BASE_ADDR_OFFSET"); - - FAPI_TRY(p9_fbc_utils_get_chip_base_address(i_procTgt, - baseAddressNm0, - baseAddressNm1, - baseAddressMirror, - regNcuRngBarData), - "Failed in p9_fbc_utils_get_chip_base_address" ); + FAPI_DBG("> populateNcuRingBarScomReg"); + + do + { + uint8_t attrVal = 0; + uint64_t nxRangeBarAddrOffset = 0; + uint64_t regNcuRngBarData = 0; + uint64_t baseAddressNm0 = 0; + uint64_t baseAddressNm1 = 0; + uint64_t baseAddressMirror = 0; + uint32_t ncuBarRegisterAddr = 0; + const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM; + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_NX_RNG_BAR_ENABLE, + i_procTgt, + attrVal ), + "Error from FAPI_ATTR_GET for attribute ATTR_PROC_NX_RNG_BAR_ENABLE"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_NX_RNG_BAR_BASE_ADDR_OFFSET, + FAPI_SYSTEM, + nxRangeBarAddrOffset ), + "Error from FAPI_ATTR_GET for attribute ATTR_PROC_NX_RNG_BAR_BASE_ADDR_OFFSET"); + + FAPI_TRY(p9_fbc_utils_get_chip_base_address(i_procTgt, + baseAddressNm0, + baseAddressNm1, + baseAddressMirror, + regNcuRngBarData), + "Failed in p9_fbc_utils_get_chip_base_address" ); + + + if( fapi2::ENUM_ATTR_PROC_NX_RNG_BAR_ENABLE_ENABLE == attrVal ) + { + //Set bit0 which corresponds to bit DARN_BAR_EN of reg NCU_DAR_BAR + regNcuRngBarData |= DARN_BAR_EN_POS ; + } + regNcuRngBarData += nxRangeBarAddrOffset; - if( fapi2::ENUM_ATTR_PROC_NX_RNG_BAR_ENABLE_ENABLE == attrVal ) - { - //Set bit0 which corresponds to bit DARN_BAR_EN of reg NCU_DAR_BAR - regNcuRngBarData |= DARN_BAR_EN_POS ; - } + for( uint32_t exIndex = 0; exIndex < MAX_CMES_PER_CHIP; exIndex++ ) + { + ncuBarRegisterAddr = EX_0_NCU_DARN_BAR_REG; + ncuBarRegisterAddr |= (( exIndex >> 1) << 24 ); + ncuBarRegisterAddr |= ( exIndex & 0x01 ) ? 0x0400 : 0x0000; - regNcuRngBarData += nxRangeBarAddrOffset; + FAPI_DBG("CME%d NCU_DARN_BAR Addr 0x%08x Data 0x%016lx ", + exIndex, ncuBarRegisterAddr, regNcuRngBarData ); - for( uint32_t exIndex = 0; exIndex < MAX_CMES_PER_CHIP; exIndex++ ) - { - ncuBarRegisterAddr = EX_0_NCU_DARN_BAR_REG; - ncuBarRegisterAddr |= (( exIndex >> 1) << 24 ); - ncuBarRegisterAddr |= ( exIndex & 0x01 ) ? 0x0400 : 0x0000; - - FAPI_DBG("CME%d NCU_DARN_BAR Addr 0x%08x Data 0x%016lx ", - exIndex, ncuBarRegisterAddr, regNcuRngBarData ); - - StopReturnCode_t stopRc = - stopImageSection::p9_stop_save_scom( i_pChipHomer, - ncuBarRegisterAddr, - regNcuRngBarData , - stopImageSection::P9_STOP_SCOM_REPLACE, - stopImageSection::P9_STOP_SECTION_EQ_SCOM ); + StopReturnCode_t stopRc = + stopImageSection::p9_stop_save_scom( i_pChipHomer, + ncuBarRegisterAddr, + regNcuRngBarData , + stopImageSection::P9_STOP_SCOM_REPLACE, + stopImageSection::P9_STOP_SECTION_EQ_SCOM ); - if( stopRc ) - { - FAPI_ERR("Failed to update CME%d NCU_DARN_RNG_BAR Reg RC: 0x%08x", - exIndex, stopRc ); - break; + if( stopRc ) + { + FAPI_ERR("Failed to update CME%d NCU_DARN_RNG_BAR Reg RC: 0x%08x", + exIndex, stopRc ); + break; + } } + } + while(0); + FAPI_DBG("< populateNcuRingBarScomReg"); + fapi_try_exit: + return fapi2::current_err; } - while(0); - - FAPI_DBG("< populateNcuRingBarScomReg"); -fapi_try_exit: - return fapi2::current_err; -} //-------------------------------------------------------------------------------------------- -/** - * @brief populate L2 Epsilon SCOM register. - * @param i_pChipHomer points to start of P9 HOMER. - * @return fapi2 return code. - */ -fapi2::ReturnCode populateEpsilonL2ScomReg( void* i_pChipHomer ) -{ - FAPI_DBG("> populateEpsilonL2ScomReg"); - - do + /** + * @brief populate L2 Epsilon SCOM register. + * @param i_pChipHomer points to start of P9 HOMER. + * @return fapi2 return code. + */ + fapi2::ReturnCode populateEpsilonL2ScomReg( void* i_pChipHomer ) { - uint32_t attrValT0 = 0; - uint32_t attrValT1 = 0; - uint32_t attrValT2 = 0; - uint32_t scomAddr = 0; - uint32_t rc = IMG_BUILD_SUCCESS; + FAPI_DBG("> populateEpsilonL2ScomReg"); - uint64_t l_epsilonScomVal; - fapi2::buffer<uint64_t> epsilonValBuf; + do + { + uint32_t attrValT0 = 0; + uint32_t attrValT1 = 0; + uint32_t attrValT2 = 0; + uint32_t scomAddr = 0; + uint32_t rc = IMG_BUILD_SUCCESS; - const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM; + uint64_t l_epsilonScomVal; + fapi2::buffer<uint64_t> epsilonValBuf; - //============================================================================= - //Determine SCOM register data value for EX_L2_RD_EPS_REG by reading attributes - //============================================================================= + const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM; - //----------------------------- Tier0(T0)-------------------------------------- + //============================================================================= + //Determine SCOM register data value for EX_L2_RD_EPS_REG by reading attributes + //============================================================================= - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_READ_CYCLES_T0, - FAPI_SYSTEM, - attrValT0 ), - "Error from FAPI_ATTR_GET for attribute ATTR_PROC_EPS_READ_CYCLES_T0"); + //----------------------------- Tier0(T0)-------------------------------------- - attrValT0 = attrValT0 / 8 + 1; - epsilonValBuf.insert<0, 12, 20, uint32_t>( attrValT0 ); + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_READ_CYCLES_T0, + FAPI_SYSTEM, + attrValT0 ), + "Error from FAPI_ATTR_GET for attribute ATTR_PROC_EPS_READ_CYCLES_T0"); - //----------------------------- Tier1(T1)-------------------------------------- + attrValT0 = attrValT0 / 8 + 1; + epsilonValBuf.insert<0, 12, 20, uint32_t>( attrValT0 ); - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_READ_CYCLES_T1, - FAPI_SYSTEM, - attrValT1 ), - "Error from FAPI_ATTR_GET for attribute ATTR_PROC_EPS_READ_CYCLES_T1"); + //----------------------------- Tier1(T1)-------------------------------------- - attrValT1 = attrValT1 / 8 + 1; - epsilonValBuf.insert<12, 12, 20, uint32_t>( attrValT1 ); + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_READ_CYCLES_T1, + FAPI_SYSTEM, + attrValT1 ), + "Error from FAPI_ATTR_GET for attribute ATTR_PROC_EPS_READ_CYCLES_T1"); - //----------------------------- Tier2(T2)-------------------------------------- + attrValT1 = attrValT1 / 8 + 1; + epsilonValBuf.insert<12, 12, 20, uint32_t>( attrValT1 ); - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_READ_CYCLES_T2, - FAPI_SYSTEM, - attrValT2 ), - "Error from FAPI_ATTR_GET for attribute ATTR_PROC_EPS_READ_CYCLES_T2"); + //----------------------------- Tier2(T2)-------------------------------------- + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_READ_CYCLES_T2, + FAPI_SYSTEM, + attrValT2 ), + "Error from FAPI_ATTR_GET for attribute ATTR_PROC_EPS_READ_CYCLES_T2"); - attrValT2 = attrValT2 / 8 + 1; - epsilonValBuf.insert<24, 12, 20, uint32_t>( attrValT2 ); - epsilonValBuf.extract<0, 64>(l_epsilonScomVal); + attrValT2 = attrValT2 / 8 + 1; + epsilonValBuf.insert<24, 12, 20, uint32_t>( attrValT2 ); - //----------------------- Updating SCOM Registers using STOP API -------------------- - uint32_t eqCnt = 0; + epsilonValBuf.extract<0, 64>(l_epsilonScomVal); - for( ; eqCnt < MAX_QUADS_PER_CHIP; eqCnt++ ) - { - scomAddr = (EX_L2_RD_EPS_REG | (eqCnt << QUAD_BIT_POS)); - rc = stopImageSection::p9_stop_save_scom( i_pChipHomer, - scomAddr, - l_epsilonScomVal, - stopImageSection::P9_STOP_SCOM_APPEND, - stopImageSection::P9_STOP_SECTION_EQ_SCOM ); + //----------------------- Updating SCOM Registers using STOP API -------------------- + uint32_t eqCnt = 0; - if( rc ) + for( ; eqCnt < MAX_QUADS_PER_CHIP; eqCnt++ ) { - FAPI_DBG(" p9_stop_save_scom Failed rc 0x%08x", rc ); - break; - } + scomAddr = (EX_L2_RD_EPS_REG | (eqCnt << QUAD_BIT_POS)); + rc = stopImageSection::p9_stop_save_scom( i_pChipHomer, + scomAddr, + l_epsilonScomVal, + stopImageSection::P9_STOP_SCOM_APPEND, + stopImageSection::P9_STOP_SECTION_EQ_SCOM ); + + if( rc ) + { + FAPI_DBG(" p9_stop_save_scom Failed rc 0x%08x", rc ); + break; + } - scomAddr |= ODD_EVEN_EX_POS; - rc = stopImageSection::p9_stop_save_scom( i_pChipHomer, - scomAddr, - l_epsilonScomVal, - stopImageSection::P9_STOP_SCOM_APPEND, - stopImageSection::P9_STOP_SECTION_EQ_SCOM ); + scomAddr |= ODD_EVEN_EX_POS; + rc = stopImageSection::p9_stop_save_scom( i_pChipHomer, + scomAddr, + l_epsilonScomVal, + stopImageSection::P9_STOP_SCOM_APPEND, + stopImageSection::P9_STOP_SECTION_EQ_SCOM ); - if( rc ) - { - FAPI_DBG(" p9_stop_save_scom Failed rc 0x%08x", rc ); - break; + if( rc ) + { + FAPI_DBG(" p9_stop_save_scom Failed rc 0x%08x", rc ); + break; + } } - } - //=============================================================================== - //Determine SCOM register data value for EX_L2_WR_EPS_REG by reading attributes - //=============================================================================== - l_epsilonScomVal = 0; - epsilonValBuf.flush<0>(); + //=============================================================================== + //Determine SCOM register data value for EX_L2_WR_EPS_REG by reading attributes + //=============================================================================== + l_epsilonScomVal = 0; + epsilonValBuf.flush<0>(); - //----------------------------- Tier1(T1)-------------------------------------- + //----------------------------- Tier1(T1)-------------------------------------- - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_WRITE_CYCLES_T1, - FAPI_SYSTEM, - attrValT1 ), - "Error from FAPI_ATTR_GET for attribute ATTR_PROC_EPS_WRITE_CYCLES_T1"); + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_WRITE_CYCLES_T1, + FAPI_SYSTEM, + attrValT1 ), + "Error from FAPI_ATTR_GET for attribute ATTR_PROC_EPS_WRITE_CYCLES_T1"); - attrValT1 = attrValT1 / 8 + 1; - epsilonValBuf.insert< 0, 12, 20, uint32_t >(attrValT1); + attrValT1 = attrValT1 / 8 + 1; + epsilonValBuf.insert< 0, 12, 20, uint32_t >(attrValT1); - //----------------------------- Tier2(T2)-------------------------------------- + //----------------------------- Tier2(T2)-------------------------------------- - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_WRITE_CYCLES_T2, - FAPI_SYSTEM, - attrValT2 ), - "Error from FAPI_ATTR_GET for attribute ATTR_PROC_EPS_WRITE_CYCLES_T2"); + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_WRITE_CYCLES_T2, + FAPI_SYSTEM, + attrValT2 ), + "Error from FAPI_ATTR_GET for attribute ATTR_PROC_EPS_WRITE_CYCLES_T2"); - attrValT2 = attrValT2 / 8 + 1; - epsilonValBuf.insert< 12, 12, 20, uint32_t >(attrValT2); + attrValT2 = attrValT2 / 8 + 1; + epsilonValBuf.insert< 12, 12, 20, uint32_t >(attrValT2); - // p9.l2.scom.inifile: - // EPS_DIVIDER_MODE = 0001 - // EPS_MODE_SEL = 0 - // EPS_CNT_USE_L2_DIVIDER_EN = 0 - // L2_EPS_STEP_MODE = 0000 - epsilonValBuf.setBit<27>(); + // p9.l2.scom.inifile: + // EPS_DIVIDER_MODE = 0001 + // EPS_MODE_SEL = 0 + // EPS_CNT_USE_L2_DIVIDER_EN = 0 + // L2_EPS_STEP_MODE = 0000 + epsilonValBuf.setBit<27>(); - epsilonValBuf.extract<0, 64>(l_epsilonScomVal); + epsilonValBuf.extract<0, 64>(l_epsilonScomVal); - //----------------------- Updating SCOM Registers using STOP API -------------------- + //----------------------- Updating SCOM Registers using STOP API -------------------- - for( eqCnt = 0; eqCnt < MAX_QUADS_PER_CHIP; eqCnt++ ) - { - scomAddr = (EX_L2_WR_EPS_REG | (eqCnt << QUAD_BIT_POS)); - FAPI_DBG("Calling STOP API to update SCOM reg 0x%08x value 0x%016llx", - scomAddr, l_epsilonScomVal); - rc = stopImageSection::p9_stop_save_scom( i_pChipHomer, - scomAddr, - l_epsilonScomVal, - stopImageSection::P9_STOP_SCOM_APPEND, - stopImageSection::P9_STOP_SECTION_EQ_SCOM ); - - if( rc ) + for( eqCnt = 0; eqCnt < MAX_QUADS_PER_CHIP; eqCnt++ ) { - FAPI_DBG(" p9_stop_save_scom Failed rc 0x%08x", rc ); - break; - } + scomAddr = (EX_L2_WR_EPS_REG | (eqCnt << QUAD_BIT_POS)); + FAPI_DBG("Calling STOP API to update SCOM reg 0x%08x value 0x%016llx", + scomAddr, l_epsilonScomVal); + + rc = stopImageSection::p9_stop_save_scom( i_pChipHomer, + scomAddr, + l_epsilonScomVal, + stopImageSection::P9_STOP_SCOM_APPEND, + stopImageSection::P9_STOP_SECTION_EQ_SCOM ); - scomAddr |= ODD_EVEN_EX_POS; - FAPI_DBG("Calling STOP API to update SCOM reg 0x%08x value 0x%016llx", - scomAddr, l_epsilonScomVal); - rc = stopImageSection::p9_stop_save_scom( i_pChipHomer, - scomAddr, - l_epsilonScomVal, - stopImageSection::P9_STOP_SCOM_APPEND, - stopImageSection::P9_STOP_SECTION_EQ_SCOM ); + if( rc ) + { + FAPI_DBG(" p9_stop_save_scom Failed rc 0x%08x", rc ); + break; + } - if( rc ) - { - FAPI_DBG(" p9_stop_save_scom Failed rc 0x%08x", rc ); - break; + scomAddr |= ODD_EVEN_EX_POS; + FAPI_DBG("Calling STOP API to update SCOM reg 0x%08x value 0x%016llx", + scomAddr, l_epsilonScomVal); + + rc = stopImageSection::p9_stop_save_scom( i_pChipHomer, + scomAddr, + l_epsilonScomVal, + stopImageSection::P9_STOP_SCOM_APPEND, + stopImageSection::P9_STOP_SECTION_EQ_SCOM ); + + if( rc ) + { + FAPI_DBG(" p9_stop_save_scom Failed rc 0x%08x", rc ); + break; + } } - } - FAPI_ASSERT( ( IMG_BUILD_SUCCESS == rc ), - fapi2::EPSILON_SCOM_UPDATE_FAIL() - .set_STOP_API_SCOM_ERR( rc ) - .set_EPSILON_REG_ADDR( scomAddr ) - .set_EPSILON_REG_DATA( l_epsilonScomVal ), - "Failed to create restore entry for L2 Epsilon register" ); + FAPI_ASSERT( ( IMG_BUILD_SUCCESS == rc ), + fapi2::EPSILON_SCOM_UPDATE_FAIL() + .set_STOP_API_SCOM_ERR( rc ) + .set_EPSILON_REG_ADDR( scomAddr ) + .set_EPSILON_REG_DATA( l_epsilonScomVal ), + "Failed to create restore entry for L2 Epsilon register" ); - } - while(0); + } + while(0); - FAPI_DBG("< populateEpsilonL2ScomReg"); -fapi_try_exit: - return fapi2::current_err; -} + FAPI_DBG("< populateEpsilonL2ScomReg"); + fapi_try_exit: + return fapi2::current_err; + } //--------------------------------------------------------------------------- -/** - * @brief populate L3 Epsilon SCOM register. - * @param i_pChipHomer points to start of P9 HOMER. - * @return fapi2 return code. - */ -fapi2::ReturnCode populateEpsilonL3ScomReg( void* i_pChipHomer ) -{ - FAPI_DBG("> populateEpsilonL3ScomReg"); - - do + /** + * @brief populate L3 Epsilon SCOM register. + * @param i_pChipHomer points to start of P9 HOMER. + * @return fapi2 return code. + */ + fapi2::ReturnCode populateEpsilonL3ScomReg( void* i_pChipHomer ) { - uint32_t attrValT0 = 0; - uint32_t attrValT1 = 0; - uint32_t attrValT2 = 0; - uint32_t scomAddr = 0; - uint32_t rc = IMG_BUILD_SUCCESS; - uint64_t l_epsilonScomVal; - fapi2::buffer<uint64_t> epsilonValBuf; + FAPI_DBG("> populateEpsilonL3ScomReg"); - const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM; + do + { + uint32_t attrValT0 = 0; + uint32_t attrValT1 = 0; + uint32_t attrValT2 = 0; + uint32_t scomAddr = 0; + uint32_t rc = IMG_BUILD_SUCCESS; + uint64_t l_epsilonScomVal; + fapi2::buffer<uint64_t> epsilonValBuf; - //===================================================================================== - //Determine SCOM register data value for EX_L3_RD_EPSILON_CFG_REG by reading attributes - //===================================================================================== + const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM; - //----------------------------- Tier0(T0)-------------------------------------- + //===================================================================================== + //Determine SCOM register data value for EX_L3_RD_EPSILON_CFG_REG by reading attributes + //===================================================================================== - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_READ_CYCLES_T0, - FAPI_SYSTEM, - attrValT0 ), - "Error from FAPI_ATTR_GET for attribute ATTR_PROC_EPS_READ_CYCLES_T0"); + //----------------------------- Tier0(T0)-------------------------------------- - attrValT0 = attrValT0 / 8 + 1; - epsilonValBuf.insert<0, 12, 20, uint32_t>( attrValT0 ); + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_READ_CYCLES_T0, + FAPI_SYSTEM, + attrValT0 ), + "Error from FAPI_ATTR_GET for attribute ATTR_PROC_EPS_READ_CYCLES_T0"); - //----------------------------- Tier1(T1)-------------------------------------- + attrValT0 = attrValT0 / 8 + 1; + epsilonValBuf.insert<0, 12, 20, uint32_t>( attrValT0 ); - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_READ_CYCLES_T1, - FAPI_SYSTEM, - attrValT1 ), - "Error from FAPI_ATTR_GET for attribute ATTR_PROC_EPS_READ_CYCLES_T1"); - - attrValT1 = attrValT1 / 8 + 1; - epsilonValBuf.insert<12, 12, 20, uint32_t>( attrValT1 ); + //----------------------------- Tier1(T1)-------------------------------------- - //----------------------------- Tier2(T2)-------------------------------------- + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_READ_CYCLES_T1, + FAPI_SYSTEM, + attrValT1 ), + "Error from FAPI_ATTR_GET for attribute ATTR_PROC_EPS_READ_CYCLES_T1"); - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_READ_CYCLES_T2, - FAPI_SYSTEM, - attrValT2 ), - "Error from FAPI_ATTR_GET for attribute ATTR_PROC_EPS_READ_CYCLES_T2"); + attrValT1 = attrValT1 / 8 + 1; + epsilonValBuf.insert<12, 12, 20, uint32_t>( attrValT1 ); - attrValT2 = attrValT2 / 8 + 1; - epsilonValBuf.insert<24, 12, 20, uint32_t>( attrValT2 ); + //----------------------------- Tier2(T2)-------------------------------------- - epsilonValBuf.extract<0, 64>(l_epsilonScomVal); + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_READ_CYCLES_T2, + FAPI_SYSTEM, + attrValT2 ), + "Error from FAPI_ATTR_GET for attribute ATTR_PROC_EPS_READ_CYCLES_T2"); - //----------------------- Updating SCOM Registers using STOP API -------------------- + attrValT2 = attrValT2 / 8 + 1; + epsilonValBuf.insert<24, 12, 20, uint32_t>( attrValT2 ); - uint32_t eqCnt = 0; + epsilonValBuf.extract<0, 64>(l_epsilonScomVal); - for( ; eqCnt < MAX_QUADS_PER_CHIP; eqCnt++ ) - { - scomAddr = (EX_L3_RD_EPSILON_CFG_REG | (eqCnt << QUAD_BIT_POS)); + //----------------------- Updating SCOM Registers using STOP API -------------------- - FAPI_DBG("Calling STOP API to update SCOM reg 0x%08x value 0x%016llx", - scomAddr, l_epsilonScomVal); - rc = stopImageSection::p9_stop_save_scom( i_pChipHomer, - scomAddr, - l_epsilonScomVal, - stopImageSection::P9_STOP_SCOM_APPEND, - stopImageSection::P9_STOP_SECTION_EQ_SCOM ); + uint32_t eqCnt = 0; - if( rc ) + for( ; eqCnt < MAX_QUADS_PER_CHIP; eqCnt++ ) { - FAPI_DBG(" p9_stop_save_scom Failed rc 0x%08x", rc ); - break; - } - - scomAddr |= ODD_EVEN_EX_POS; - FAPI_DBG("Calling STOP API to update SCOM reg 0x%08x value 0x%016llx", - scomAddr, l_epsilonScomVal); - rc = stopImageSection::p9_stop_save_scom( i_pChipHomer, - scomAddr, - l_epsilonScomVal, - stopImageSection::P9_STOP_SCOM_APPEND, - stopImageSection::P9_STOP_SECTION_EQ_SCOM ); + scomAddr = (EX_L3_RD_EPSILON_CFG_REG | (eqCnt << QUAD_BIT_POS)); + + FAPI_DBG("Calling STOP API to update SCOM reg 0x%08x value 0x%016llx", + scomAddr, l_epsilonScomVal); + rc = stopImageSection::p9_stop_save_scom( i_pChipHomer, + scomAddr, + l_epsilonScomVal, + stopImageSection::P9_STOP_SCOM_APPEND, + stopImageSection::P9_STOP_SECTION_EQ_SCOM ); - if( rc ) - { - FAPI_DBG(" p9_stop_save_scom Failed rc 0x%08x", rc ); - break; - } - } + if( rc ) + { + FAPI_DBG(" p9_stop_save_scom Failed rc 0x%08x", rc ); + break; + } - //===================================================================================== - //Determine SCOM register data value for EX_L3_L3_WR_EPSILON_CFG_REG by reading attributes - //===================================================================================== + scomAddr |= ODD_EVEN_EX_POS; + FAPI_DBG("Calling STOP API to update SCOM reg 0x%08x value 0x%016llx", + scomAddr, l_epsilonScomVal); + rc = stopImageSection::p9_stop_save_scom( i_pChipHomer, + scomAddr, + l_epsilonScomVal, + stopImageSection::P9_STOP_SCOM_APPEND, + stopImageSection::P9_STOP_SECTION_EQ_SCOM ); - l_epsilonScomVal = 0; - epsilonValBuf.flush<0>(); + if( rc ) + { + FAPI_DBG(" p9_stop_save_scom Failed rc 0x%08x", rc ); + break; + } + } - //----------------------------- Tier1(T1)-------------------------------------- + //===================================================================================== + //Determine SCOM register data value for EX_L3_L3_WR_EPSILON_CFG_REG by reading attributes + //===================================================================================== - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_WRITE_CYCLES_T1, - FAPI_SYSTEM, - attrValT1 ), - "Error from FAPI_ATTR_GET for attribute ATTR_PROC_EPS_WRITE_CYCLES_T1"); + l_epsilonScomVal = 0; + epsilonValBuf.flush<0>(); - attrValT1 = attrValT1 / 8 + 1; - epsilonValBuf.insert< 0, 12, 20, uint32_t >(attrValT1); + //----------------------------- Tier1(T1)-------------------------------------- - //----------------------------- Tier2(T2)-------------------------------------- + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_WRITE_CYCLES_T1, + FAPI_SYSTEM, + attrValT1 ), + "Error from FAPI_ATTR_GET for attribute ATTR_PROC_EPS_WRITE_CYCLES_T1"); - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_WRITE_CYCLES_T2, - FAPI_SYSTEM, - attrValT2 ), - "Error from FAPI_ATTR_GET for attribute ATTR_PROC_EPS_WRITE_CYCLES_T2"); + attrValT1 = attrValT1 / 8 + 1; + epsilonValBuf.insert< 0, 12, 20, uint32_t >(attrValT1); - attrValT2 = attrValT2 / 8 + 1; - epsilonValBuf.insert< 12, 12, 20, uint32_t >(attrValT2); + //----------------------------- Tier2(T2)-------------------------------------- - // p9.l3.scom.initfile: - // L3_EPS_STEP_MODE = 0000 - // L3_EPS_DIVIDER_MODE = 0001 - // EPS_CNT_USE_L3_DIVIDER_EN = 0 - epsilonValBuf.setBit<33>(); + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_WRITE_CYCLES_T2, + FAPI_SYSTEM, + attrValT2 ), + "Error from FAPI_ATTR_GET for attribute ATTR_PROC_EPS_WRITE_CYCLES_T2"); - epsilonValBuf.extract<0, 64>(l_epsilonScomVal); + attrValT2 = attrValT2 / 8 + 1; + epsilonValBuf.insert< 12, 12, 20, uint32_t >(attrValT2); - //----------------------- Updating SCOM Registers using STOP API -------------------- + // p9.l3.scom.initfile: + // L3_EPS_STEP_MODE = 0000 + // L3_EPS_DIVIDER_MODE = 0001 + // EPS_CNT_USE_L3_DIVIDER_EN = 0 + epsilonValBuf.setBit<33>(); - for( eqCnt = 0; eqCnt < MAX_QUADS_PER_CHIP; eqCnt++ ) - { - scomAddr = (EX_L3_L3_WR_EPSILON_CFG_REG | (eqCnt << QUAD_BIT_POS)); + epsilonValBuf.extract<0, 64>(l_epsilonScomVal); - FAPI_DBG("Calling STOP API to update SCOM reg 0x%08x value 0x%016llx", - scomAddr, l_epsilonScomVal); - rc = stopImageSection::p9_stop_save_scom( i_pChipHomer, - scomAddr, - l_epsilonScomVal, - stopImageSection::P9_STOP_SCOM_APPEND, - stopImageSection::P9_STOP_SECTION_EQ_SCOM ); + //----------------------- Updating SCOM Registers using STOP API -------------------- - if( rc ) + for( eqCnt = 0; eqCnt < MAX_QUADS_PER_CHIP; eqCnt++ ) { - FAPI_DBG(" p9_stop_save_scom Failed rc 0x%08x", rc ); - break; - } + scomAddr = (EX_L3_L3_WR_EPSILON_CFG_REG | (eqCnt << QUAD_BIT_POS)); + + FAPI_DBG("Calling STOP API to update SCOM reg 0x%08x value 0x%016llx", + scomAddr, l_epsilonScomVal); + rc = stopImageSection::p9_stop_save_scom( i_pChipHomer, + scomAddr, + l_epsilonScomVal, + stopImageSection::P9_STOP_SCOM_APPEND, + stopImageSection::P9_STOP_SECTION_EQ_SCOM ); - scomAddr |= ODD_EVEN_EX_POS; + if( rc ) + { + FAPI_DBG(" p9_stop_save_scom Failed rc 0x%08x", rc ); + break; + } - FAPI_DBG("Calling STOP API to update SCOM reg 0x%08x value 0x%016llx", - scomAddr, l_epsilonScomVal); + scomAddr |= ODD_EVEN_EX_POS; - rc = stopImageSection::p9_stop_save_scom( i_pChipHomer, - scomAddr, - l_epsilonScomVal, - stopImageSection::P9_STOP_SCOM_APPEND, - stopImageSection::P9_STOP_SECTION_EQ_SCOM ); + FAPI_DBG("Calling STOP API to update SCOM reg 0x%08x value 0x%016llx", + scomAddr, l_epsilonScomVal); - if( rc ) - { - FAPI_DBG(" p9_stop_save_scom Failed rc 0x%08x", rc ); - break; + rc = stopImageSection::p9_stop_save_scom( i_pChipHomer, + scomAddr, + l_epsilonScomVal, + stopImageSection::P9_STOP_SCOM_APPEND, + stopImageSection::P9_STOP_SECTION_EQ_SCOM ); + + if( rc ) + { + FAPI_DBG(" p9_stop_save_scom Failed rc 0x%08x", rc ); + break; + } } - } - FAPI_ASSERT( ( IMG_BUILD_SUCCESS == rc ), - fapi2::EPSILON_SCOM_UPDATE_FAIL() - .set_STOP_API_SCOM_ERR( rc ) - .set_EPSILON_REG_ADDR( scomAddr ) - .set_EPSILON_REG_DATA( l_epsilonScomVal ), - "Failed to create restore entry for L3 Epsilon register" ); + FAPI_ASSERT( ( IMG_BUILD_SUCCESS == rc ), + fapi2::EPSILON_SCOM_UPDATE_FAIL() + .set_STOP_API_SCOM_ERR( rc ) + .set_EPSILON_REG_ADDR( scomAddr ) + .set_EPSILON_REG_DATA( l_epsilonScomVal ), + "Failed to create restore entry for L3 Epsilon register" ); - } - while(0); + } + while(0); - FAPI_DBG("< populateEpsilonL3ScomReg"); -fapi_try_exit: - return fapi2::current_err; -} + FAPI_DBG("< populateEpsilonL3ScomReg"); + fapi_try_exit: + return fapi2::current_err; + } //--------------------------------------------------------------------------- -fapi2::ReturnCode p9_hcode_image_build( CONST_FAPI2_PROC& i_procTgt, - void* const i_pImageIn, - void* i_pHomerImage, - void* const i_pRingOverride, - SysPhase_t i_phase, - ImageType_t i_imgType, - void* const i_pBuf1, - const uint32_t i_sizeBuf1, - void* const i_pBuf2, - const uint32_t i_sizeBuf2, - void* const i_pBuf3, - const uint32_t i_sizeBuf3 ) - + fapi2::ReturnCode p9_hcode_image_build( CONST_FAPI2_PROC& i_procTgt, + void* const i_pImageIn, + void* i_pHomerImage, + void* const i_pRingOverride, + SysPhase_t i_phase, + ImageType_t i_imgType, + void* const i_pBuf1, + const uint32_t i_sizeBuf1, + void* const i_pBuf2, + const uint32_t i_sizeBuf2, + void* const i_pBuf3, + const uint32_t i_sizeBuf3 ) -{ - FAPI_IMP("Entering p9_hcode_image_build "); - fapi2::ReturnCode retCode; - do { - FAPI_DBG("validating argument .."); - - retCode = validateInputArguments( i_pImageIn, i_pHomerImage, i_phase, - i_imgType, - i_pBuf1, - i_sizeBuf1, - i_pBuf2, - i_sizeBuf2, - i_pBuf3, - i_sizeBuf3 ); - - if( retCode ) - { - FAPI_ERR("Invalid arguments, escaping hcode image build"); - break; - } - - uint8_t ecLevel = 0; - FAPI_TRY(FAPI_ATTR_GET_PRIVILEGED(fapi2::ATTR_EC, - i_procTgt, - ecLevel), - "Error from for attribute ATTR_EC"); - - FAPI_INF("Creating chip functional model"); - - P9FuncModel l_chipFuncModel( i_procTgt, ecLevel ); - Homerlayout_t* pChipHomer = ( Homerlayout_t*) i_pHomerImage; - const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM; - uint32_t ppeImgRc = IMG_BUILD_SUCCESS; - QpmrHeaderLayout_t l_qpmrHdr; - // HW Image is a nested XIP Image. Let us read global TOC of hardware image - // and find out if XIP header of PPE image is contained therein. - // Let us start with SGPE - FAPI_INF("SGPE building"); - ppeImgRc = buildSgpeImage( i_pImageIn, pChipHomer, i_imgType, l_qpmrHdr ); - - FAPI_ASSERT( ( IMG_BUILD_SUCCESS == ppeImgRc ), - fapi2::SGPE_BUILD_FAIL() - .set_SGPE_FAIL_SECTN( ppeImgRc ), - "Failed to copy SGPE section in HOMER" ); - FAPI_INF("SGPE built"); - - // copy sections pertaining to self restore - // Note: this creates the CPMR header portion - - //let us determine if system is configured in fuse mode. This needs to - //be updated in a CPMR region. - uint8_t fuseModeState = 0; - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_FUSED_CORE_MODE, - FAPI_SYSTEM, - fuseModeState), - "Error from FAPI_ATTR_GET for attribute ATTR_FUSED_CORE_MODE"); - - FAPI_INF("CPMR / Self Restore building"); - ppeImgRc = buildCoreRestoreImage( i_pImageIn, pChipHomer, i_imgType, fuseModeState ); - - FAPI_ASSERT( ( IMG_BUILD_SUCCESS == ppeImgRc ), - fapi2::SELF_RESTORE_BUILD_FAIL() - .set_SELF_RESTORE_FAIL_SECTN( ppeImgRc ), - "Failed to copy core self restore section in HOMER" ); - FAPI_INF("Self Restore built "); - - // copy sections pertaining to CME - FAPI_INF("CPMR / CME building"); - uint64_t cpmrPhyAdd = 0; - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_HOMER_PHYS_ADDR, i_procTgt, cpmrPhyAdd ), - "Error from FAPI_ATTR_GET for ATTR_HOMER_PHYS_ADDR"); - FAPI_DBG("HOMER base address 0x%016lX", cpmrPhyAdd ); - ppeImgRc = buildCmeImage( i_pImageIn, pChipHomer, i_imgType, cpmrPhyAdd ); - - FAPI_ASSERT( ( IMG_BUILD_SUCCESS == ppeImgRc ), - fapi2::CME_BUILD_FAIL() - .set_CME_FAIL_SECTN( ppeImgRc ), - "Failed to copy CME section in HOMER" ); - FAPI_INF("CME built"); - - FAPI_INF("PGPE building"); - PpmrHeader_t l_ppmrHdr; - ppeImgRc = buildPgpeImage( i_pImageIn, pChipHomer, l_ppmrHdr, i_imgType ); - - FAPI_ASSERT( ( IMG_BUILD_SUCCESS == ppeImgRc ), - fapi2::PGPE_BUILD_FAIL() - .set_PGPE_FAIL_SECTN( ppeImgRc ), - "Failed to copy PGPE section in HOMER" ); - - //Update P State parameter block info in HOMER - retCode = buildParameterBlock( pChipHomer, i_procTgt, l_ppmrHdr, i_imgType ); - - if( retCode ) - { - FAPI_ERR("Failed to add parameter block"); - break; - } - - FAPI_INF("PGPE built"); - //Let us add Scan Rings to the image. - uint8_t l_ringDebug = 0; - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SYSTEM_RING_DBG_MODE, - FAPI_SYSTEM, - l_ringDebug), - "Error from FAPI_ATTR_GET for attribute ATTR_SYSTEM_RING_DBG_MODE"); - - RingBufData l_ringData( i_pBuf1, - i_sizeBuf1, - i_pBuf2, - i_sizeBuf2, - i_pBuf3, - i_sizeBuf3 ); - - //Extract all the rings for CME platform from HW Image and VPD - ppeImgRc = getPpeScanRings( i_pImageIn, - PLAT_CME, - i_procTgt, - l_ringData, - i_imgType ); - - if( ppeImgRc ) - { - FAPI_ERR( "failed to extract core scan rings rc = 0x%08X", ppeImgRc ); - break; - } - - uint8_t l_iplPhase = 0 ; - FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_RISK_LEVEL, - FAPI_SYSTEM, - l_iplPhase), - "Error from FAPI_ATTR_GET for ATTR_RISK_LEVEL"); - // create a layout of rings in HOMER for consumption of CME - ppeImgRc = layoutRingsForCME( pChipHomer, - l_chipFuncModel, - l_ringData, - (RingDebugMode_t)l_ringDebug, - l_iplPhase, - i_imgType, - i_pRingOverride ); - - if( ppeImgRc ) - { - FAPI_ERR("Failed to copy core Scan rings in HOMER rc 0x%08X", ppeImgRc ); - break; - } - - l_ringData.iv_ringBufSize = i_sizeBuf1; - ppeImgRc = getPpeScanRings( i_pImageIn, - PLAT_SGPE, - i_procTgt, - l_ringData, - i_imgType ); - - if( ppeImgRc ) - { - FAPI_ERR( "failed to extract quad/ex scan rings" ); - break; - } - - // create a layout of rings in HOMER for consumption of SGPE - ppeImgRc = layoutRingsForSGPE( pChipHomer, - i_pRingOverride, - l_chipFuncModel, + FAPI_IMP("Entering p9_hcode_image_build "); + + do + { + FAPI_DBG("validating argument .."); + + FAPI_TRY( validateInputArguments( i_pImageIn, i_pHomerImage, i_phase, + i_imgType, + i_pBuf1, + i_sizeBuf1, + i_pBuf2, + i_sizeBuf2, + i_pBuf3, + i_sizeBuf3 ), + "Invalid arguments, escaping hcode image build" ); + + uint8_t ecLevel = 0; + FAPI_TRY(FAPI_ATTR_GET_PRIVILEGED(fapi2::ATTR_EC, + i_procTgt, + ecLevel), + "Error from for attribute ATTR_EC"); + + FAPI_INF("Creating chip functional model"); + + P9FuncModel l_chipFuncModel( i_procTgt, ecLevel ); + Homerlayout_t* pChipHomer = ( Homerlayout_t*) i_pHomerImage; + const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM; + uint32_t ppeImgRc = IMG_BUILD_SUCCESS; + QpmrHeaderLayout_t l_qpmrHdr; + // HW Image is a nested XIP Image. Let us read global TOC of hardware image + // and find out if XIP header of PPE image is contained therein. + // Let us start with SGPE + FAPI_INF("SGPE building"); + ppeImgRc = buildSgpeImage( i_pImageIn, pChipHomer, i_imgType, l_qpmrHdr ); + + FAPI_ASSERT( ( IMG_BUILD_SUCCESS == ppeImgRc ), + fapi2::SGPE_BUILD_FAIL() + .set_SGPE_FAIL_SECTN( ppeImgRc ), + "Failed to copy SGPE section in HOMER" ); + FAPI_INF("SGPE built"); + + // copy sections pertaining to self restore + // Note: this creates the CPMR header portion + + //let us determine if system is configured in fuse mode. This needs to + //be updated in a CPMR region. + uint8_t fuseModeState = 0; + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_FUSED_CORE_MODE, + FAPI_SYSTEM, + fuseModeState), + "Error from FAPI_ATTR_GET for attribute ATTR_FUSED_CORE_MODE"); + + FAPI_INF("CPMR / Self Restore building"); + ppeImgRc = buildCoreRestoreImage( i_pImageIn, pChipHomer, i_imgType, fuseModeState ); + + FAPI_ASSERT( ( IMG_BUILD_SUCCESS == ppeImgRc ), + fapi2::SELF_RESTORE_BUILD_FAIL() + .set_SELF_RESTORE_FAIL_SECTN( ppeImgRc ), + "Failed to copy core self restore section in HOMER" ); + FAPI_INF("Self Restore built "); + + // copy sections pertaining to CME + FAPI_INF("CPMR / CME building"); + uint64_t cpmrPhyAdd = 0; + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_HOMER_PHYS_ADDR, i_procTgt, cpmrPhyAdd ), + "Error from FAPI_ATTR_GET for ATTR_HOMER_PHYS_ADDR"); + FAPI_DBG("HOMER base address 0x%016lX", cpmrPhyAdd ); + ppeImgRc = buildCmeImage( i_pImageIn, pChipHomer, i_imgType, cpmrPhyAdd ); + + FAPI_ASSERT( ( IMG_BUILD_SUCCESS == ppeImgRc ), + fapi2::CME_BUILD_FAIL() + .set_CME_FAIL_SECTN( ppeImgRc ), + "Failed to copy CME section in HOMER" ); + + FAPI_INF("CME built"); + + FAPI_INF("PGPE building"); + PpmrHeader_t l_ppmrHdr; + ppeImgRc = buildPgpeImage( i_pImageIn, pChipHomer, l_ppmrHdr, i_imgType ); + + FAPI_ASSERT( ( IMG_BUILD_SUCCESS == ppeImgRc ), + fapi2::PGPE_BUILD_FAIL() + .set_PGPE_FAIL_SECTN( ppeImgRc ), + "Failed to copy PGPE section in HOMER" ); + + //Update P State parameter block info in HOMER + FAPI_TRY( buildParameterBlock( pChipHomer, i_procTgt, l_ppmrHdr, i_imgType ), + "Failed to add parameter block" ); + + FAPI_INF("PGPE built"); + //Let us add Scan Rings to the image. + uint8_t l_ringDebug = 0; + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SYSTEM_RING_DBG_MODE, + FAPI_SYSTEM, + l_ringDebug), + "Error from FAPI_ATTR_GET for attribute ATTR_SYSTEM_RING_DBG_MODE"); + FAPI_DBG("Ring Debug Level 0x%02x", l_ringDebug ); + + RingBufData l_ringData( i_pBuf1, + i_sizeBuf1, + i_pBuf2, + i_sizeBuf2, + i_pBuf3, + i_sizeBuf3 ); + + //Extract all the rings for CME platform from HW Image and VPD + ppeImgRc = getPpeScanRings( i_pImageIn, + PLAT_CME, + i_procTgt, l_ringData, - (RingDebugMode_t)l_ringDebug, - l_iplPhase, - l_qpmrHdr, i_imgType ); - if( ppeImgRc ) - { - FAPI_ERR("Failed to copy quad/ex Scan rings in HOMER rc 0x%08X", ppeImgRc ); - break; - } - - //Update CPMR Header with Scan Ring details - updateCpmrCmeRegion( pChipHomer ); + FAPI_ASSERT( ( IMG_BUILD_SUCCESS == ppeImgRc ), + fapi2::SCAN_RING_EXTRACTION_FAIL() + .set_EXTRACTION_FAIL_PLAT( PLAT_CME ) + .set_EXTRACTION_FAILURE_CODE( ppeImgRc ), + "Failed to extract core scan rings" ); + + uint8_t l_iplPhase = 0 ; + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_RISK_LEVEL, + FAPI_SYSTEM, + l_iplPhase), + "Error from FAPI_ATTR_GET for ATTR_RISK_LEVEL"); + + // create a layout of rings in HOMER for consumption of CME + ppeImgRc = layoutRingsForCME( pChipHomer, + l_chipFuncModel, + l_ringData, + (RingDebugMode_t)l_ringDebug, + l_iplPhase, + i_imgType, + i_pRingOverride ); + + FAPI_ASSERT( ( IMG_BUILD_SUCCESS == ppeImgRc ), + fapi2::SCAN_RING_PLACEMENT_FAIL() + .set_PLACEMENT_FAIL_PLAT( PLAT_CME ) + .set_PLACEMENT_FAILURE_CODE( ppeImgRc ), + "Failed to place core scan rings" ); + + l_ringData.iv_ringBufSize = i_sizeBuf1; + ppeImgRc = getPpeScanRings( i_pImageIn, + PLAT_SGPE, + i_procTgt, + l_ringData, + i_imgType ); - //Update QPMR Header area in HOMER - updateQpmrHeader( pChipHomer, l_qpmrHdr ); + FAPI_ASSERT( ( IMG_BUILD_SUCCESS == ppeImgRc ), + fapi2::SCAN_RING_EXTRACTION_FAIL() + .set_EXTRACTION_FAIL_PLAT( PLAT_SGPE ) + .set_EXTRACTION_FAILURE_CODE( ppeImgRc ), + "Failed to extract quad scan rings" ); - //update PPMR Header area in HOMER - updatePpmrHeader( pChipHomer, l_ppmrHdr ); + // create a layout of rings in HOMER for consumption of SGPE + ppeImgRc = layoutRingsForSGPE( pChipHomer, + i_pRingOverride, + l_chipFuncModel, + l_ringData, + (RingDebugMode_t)l_ringDebug, + l_iplPhase, + l_qpmrHdr, + i_imgType ); - //Update L2 Epsilon SCOM Registers - retCode = populateEpsilonL2ScomReg( pChipHomer ); + FAPI_ASSERT( ( IMG_BUILD_SUCCESS == ppeImgRc ), + fapi2::SCAN_RING_PLACEMENT_FAIL() + .set_PLACEMENT_FAIL_PLAT( PLAT_SGPE ) + .set_PLACEMENT_FAILURE_CODE( ppeImgRc ), + "Failed to place quad scan rings" ); - if( retCode ) - { - FAPI_ERR("populateEpsilonL2ScomReg failed" ); - break; - } + //Update CPMR Header with Scan Ring details + updateCpmrCmeRegion( pChipHomer ); - //Update L3 Epsilon SCOM Registers - retCode = populateEpsilonL3ScomReg( pChipHomer ); + //Update QPMR Header area in HOMER + updateQpmrHeader( pChipHomer, l_qpmrHdr ); - if( retCode ) - { - FAPI_ERR("populateEpsilonL3ScomReg failed" ); - break; - } + //update PPMR Header area in HOMER + updatePpmrHeader( pChipHomer, l_ppmrHdr ); - //populate HOMER with SCOM restore value of NCU RNG BAR SCOM Register - retCode = populateNcuRingBarScomReg( pChipHomer, i_procTgt ); + //Update L2 Epsilon SCOM Registers + FAPI_TRY( populateEpsilonL2ScomReg( pChipHomer ), + "populateEpsilonL2ScomReg failed" ); - if( retCode ) - { - FAPI_ERR("populateNcuRingBarScomReg failed" ); - break; - } + //Update L3 Epsilon SCOM Registers + FAPI_TRY( populateEpsilonL3ScomReg( pChipHomer ), + "populateEpsilonL3ScomReg failed" ); - //validate SRAM Image Sizes of PPE's - uint32_t sramImgSize = 0; - ppeImgRc = validateSramImageSize( pChipHomer, sramImgSize ); - FAPI_ASSERT( ( IMG_BUILD_SUCCESS == ppeImgRc ), - fapi2::IMG_EXCEED_SRAM_SIZE( ) - .set_BAD_IMG_SIZE( sramImgSize ), - "SRAM Image Size Exceeded Max Allowed Size" ); + //populate HOMER with SCOM restore value of NCU RNG BAR SCOM Register + FAPI_TRY( populateNcuRingBarScomReg( pChipHomer, i_procTgt ), + "populateNcuRingBarScomReg failed" ); - //Update CME/SGPE Flags in respective image header. - updateImageFlags( pChipHomer ); + //validate SRAM Image Sizes of PPE's + uint32_t sramImgSize = 0; + FAPI_TRY( validateSramImageSize( pChipHomer, sramImgSize ), + "Final SRAM Image Size Check Failed" ); - //Set the Fabric IDs - FAPI_TRY(setFabricIds( pChipHomer, i_procTgt ), - "Failed to set Fabric IDs"); + //Update CME/SGPE Flags in respective image header. + FAPI_TRY( updateImageFlags( pChipHomer ), + "updateImageFlags Failed" ); - //Update the attributes storing PGPE and SGPE's boot copier offset. - retCode = updateGpeAttributes( pChipHomer, i_procTgt ); + //Set the Fabric IDs + FAPI_TRY(setFabricIds( pChipHomer, i_procTgt ), + "Failed to set Fabric IDs"); - if( retCode ) - { - FAPI_ERR("Failed to update SGPE/PGPE IVPR attributes"); - break; + //Update the attributes storing PGPE and SGPE's boot copier offset. + FAPI_TRY( updateGpeAttributes( pChipHomer, i_procTgt ), + "Failed to update SGPE/PGPE IVPR attributes" ); } - } - while(0); + while(0); - FAPI_IMP("Exit p9_hcode_image_build" ); + FAPI_IMP("Exit p9_hcode_image_build" ); -fapi_try_exit: - return retCode; -} + fapi_try_exit: + return fapi2::current_err; + } -} //namespace p9_hcodeImageBuild ends + } //namespace p9_hcodeImageBuild ends }// extern "C" diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_scan_ring_util.H b/src/import/chips/p9/procedures/hwp/pm/p9_scan_ring_util.H index 3e8980b4e..5962f7e1a 100644 --- a/src/import/chips/p9/procedures/hwp/pm/p9_scan_ring_util.H +++ b/src/import/chips/p9/procedures/hwp/pm/p9_scan_ring_util.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016 */ +/* Contributors Listed Below - COPYRIGHT 2016,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -73,8 +73,9 @@ enum FakeScanRing_t */ enum RingDebugMode_t { - SCAN_RING_NO_DEBUG = 0x00, - SCAN_RING_TRACE_DEBUG = 0x01, + SCAN_RING_NO_DEBUG = 0x00, + SCAN_RING_TRACE_DEBUG = 0x01, + SCAN_RING_TRACE_DEEP_DEBUG = 0x02, }; /** * @brief models a fake ring for debug. diff --git a/src/import/chips/p9/procedures/xml/attribute_info/pm_plat_attributes.xml b/src/import/chips/p9/procedures/xml/attribute_info/pm_plat_attributes.xml index 38b0de8a4..3509ac6c1 100644 --- a/src/import/chips/p9/procedures/xml/attribute_info/pm_plat_attributes.xml +++ b/src/import/chips/p9/procedures/xml/attribute_info/pm_plat_attributes.xml @@ -267,7 +267,7 @@ Valid range: 500KHz to 2500KHz - Consumer: p8_pss_init + Consumer: p9_pss_init Overridden by the Machine Readable Workbook. @@ -1534,17 +1534,17 @@ </attribute> <!-- ********************************************************************* --> <attribute> - <id>ATTR_SYSTEM_RING_DBG_MODE</id> - <description> - Debug modes supported for CME/SGPE Scan layout in HOMER. - </description> - <targetType>TARGET_TYPE_SYSTEM</targetType> - <valueType>uint8</valueType> - <enum> - SCAN_RING_NO_DEBUG = 0x00, SCAN_RING_TRACE_DEBUG = 0x01 - </enum> - <initToZero/> - <platInit/> + <id>ATTR_SYSTEM_RING_DBG_MODE</id> + <description> + Debug modes supported for CME/SGPE Scan layout in HOMER. + </description> + <targetType>TARGET_TYPE_SYSTEM</targetType> + <valueType>uint8</valueType> + <enum> + SCAN_RING_NO_DEBUG = 0x00, SCAN_RING_TRACE_DEBUG = 0x01, SCAN_RING_DEEP_DEBUG = 0x02 + </enum> + <initToZero/> + <platInit/> </attribute> <!-- ********************************************************************* --> <attribute> diff --git a/src/import/chips/p9/procedures/xml/error_info/p9_hcode_image_build_errors.xml b/src/import/chips/p9/procedures/xml/error_info/p9_hcode_image_build_errors.xml index 529de50a5..4728875b3 100755 --- a/src/import/chips/p9/procedures/xml/error_info/p9_hcode_image_build_errors.xml +++ b/src/import/chips/p9/procedures/xml/error_info/p9_hcode_image_build_errors.xml @@ -5,7 +5,7 @@ <!-- --> <!-- OpenPOWER HostBoot Project --> <!-- --> -<!-- Contributors Listed Below - COPYRIGHT 2016 --> +<!-- Contributors Listed Below - COPYRIGHT 2016,2017 --> <!-- [+] International Business Machines Corp. --> <!-- --> <!-- --> @@ -131,9 +131,43 @@ </hwpError> <!-- *********************************************************************** --> <hwpError> - <rc>RC_SCAN_RING_BUILD_FAIL</rc> - <description>hcode image build procedure failed to add PGPE image</description> - <ffdc>RING_FAIL_RC</ffdc> + <rc>RC_SCAN_RING_EXTRACTION_FAIL</rc> + <description>hcode image build procedure failed to extract scan rings</description> + <ffdc>EXTRACTION_FAIL_PLAT</ffdc> + <ffdc>EXTRACTION_FAILURE_CODE</ffdc> + <callout> + <procedure>CODE</procedure> + <priority>HIGH</priority> + </callout> + </hwpError> + <!-- *********************************************************************** --> + <hwpError> + <rc>RC_SCAN_RING_PLACEMENT_FAIL</rc> + <description>hcode image build procedure failed to place rings in HOMER</description> + <ffdc>PLACEMENT_FAIL_PLAT</ffdc> + <ffdc>PLACEMENT_FAILURE_CODE</ffdc> + <callout> + <procedure>CODE</procedure> + <priority>HIGH</priority> + </callout> + </hwpError> + <!-- *********************************************************************** --> + <hwpError> + <rc>RC_CME_IMG_EXCEED_SRAM_SIZE</rc> + <description>Size of CME image exceeded the SRAM size</description> + <ffdc>BAD_IMG_SIZE</ffdc> + <ffdc>MAX_CME_IMG_SIZE_ALLOWED</ffdc> + <callout> + <procedure>CODE</procedure> + <priority>HIGH</priority> + </callout> + </hwpError> + <!-- *********************************************************************** --> + <hwpError> + <rc>RC_SGPE_IMG_EXCEED_SRAM_SIZE</rc> + <description>Size of SGPE image exceeded the size allowed in OCC SRAM</description> + <ffdc>BAD_IMG_SIZE</ffdc> + <ffdc>MAX_SGPE_IMG_SIZE_ALLOWED</ffdc> <callout> <procedure>CODE</procedure> <priority>HIGH</priority> @@ -141,9 +175,10 @@ </hwpError> <!-- *********************************************************************** --> <hwpError> - <rc>RC_IMG_EXCEED_SRAM_SIZE</rc> - <description>Size of image exceeded the SRAM size of platform</description> + <rc>RC_PGPE_IMG_EXCEED_SRAM_SIZE</rc> + <description>Size of PGPE image exceeded the size allowed in OCC SRAM</description> <ffdc>BAD_IMG_SIZE</ffdc> + <ffdc>MAX_PGPE_IMG_SIZE_ALLOWED</ffdc> <callout> <procedure>CODE</procedure> <priority>HIGH</priority> |