summaryrefslogtreecommitdiffstats
path: root/src/usr
diff options
context:
space:
mode:
authorDan Crowell <dcrowell@us.ibm.com>2013-08-14 10:23:01 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2013-09-13 10:59:41 -0500
commit97e007ba1b3c283bb7dcbd35e692385bb91fb5e6 (patch)
treec0430f61160bd44caa6f73c06c53355a9bc3fee8 /src/usr
parentb082024bbc723c6c9a3a15c03011302ffef4efdf (diff)
downloadtalos-hostboot-97e007ba1b3c283bb7dcbd35e692385bb91fb5e6.tar.gz
talos-hostboot-97e007ba1b3c283bb7dcbd35e692385bb91fb5e6.zip
Convert to fixed SLW interfaces
There are two SLW image formats possible, the fixed format is required to allow concurrent updates to portions of the image. This is the version that PHYP is using. To keep things consistent and tested we need to use the fixed format for the images produced in Hostboot as well. Change-Id: I4e1f86b2f5abfcba34d1cdd5f1c2ae9c40c6f02e RTC: 79613 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/5788 Tested-by: Jenkins Server Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr')
-rw-r--r--src/usr/hwpf/hwp/build_winkle_images/build_winkle_images.C67
-rw-r--r--src/usr/hwpf/hwp/build_winkle_images/makefile3
-rw-r--r--src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/HvPlicModule.H23
-rw-r--r--src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_pore_table_gen_api.C740
-rw-r--r--src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_pore_table_gen_api.H8
-rw-r--r--src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_pore_table_static_data.c4
-rw-r--r--src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_slw_build.C731
-rw-r--r--src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_slw_build.H81
-rw-r--r--src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_slw_build_errors.xml10
-rw-r--r--src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_slw_build_fixed.C768
-rw-r--r--src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_xip_customize.C73
-rw-r--r--src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_xip_customize.H11
12 files changed, 911 insertions, 1608 deletions
diff --git a/src/usr/hwpf/hwp/build_winkle_images/build_winkle_images.C b/src/usr/hwpf/hwp/build_winkle_images/build_winkle_images.C
index 6a67bcd7c..48bbc2fea 100644
--- a/src/usr/hwpf/hwp/build_winkle_images/build_winkle_images.C
+++ b/src/usr/hwpf/hwp/build_winkle_images/build_winkle_images.C
@@ -76,6 +76,7 @@
#include "p8_set_pore_bar/p8_poreslw_init.H"
#include "p8_slw_build/sbe_xip_image.h"
#include <runtime/runtime.H>
+#include "p8_slw_build/p8_image_help_base.H"
namespace BUILD_WINKLE_IMAGES
@@ -100,7 +101,7 @@ using namespace DeviceFW;
* @return NULL if success, errorlog if failure
*
*/
-errlHndl_t loadPoreImage( const char *& o_rporeAddr,
+errlHndl_t loadPoreImage( char *& o_rporeAddr,
uint32_t & o_rporeSize )
{
errlHndl_t l_errl = NULL;
@@ -144,7 +145,7 @@ errlHndl_t loadPoreImage( const char *& o_rporeAddr,
break;
}
- o_rporeAddr = reinterpret_cast<const char*>(l_info.vaddr);
+ o_rporeAddr = reinterpret_cast<char*>(l_info.vaddr);
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
"WINK addr = 0x%p, size=0x%x",
@@ -223,12 +224,12 @@ errlHndl_t applyPoreGenCpuRegs( TARGETING::Target *i_cpuTarget,
// msr and hrmor are common across all threads, only set for thread 0
// on each core
l_threadId = 0;
- l_rc = p8_pore_gen_cpureg( io_image,
- i_sizeImage,
- P8_MSR_MSR,
- l_msrVal,
- l_coreId,
- l_threadId);
+ l_rc = p8_pore_gen_cpureg_fixed( io_image,
+ P8_SLW_MODEBUILD_IPL,
+ P8_MSR_MSR,
+ l_msrVal,
+ l_coreId,
+ l_threadId);
if ( l_rc )
{
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
@@ -237,12 +238,12 @@ errlHndl_t applyPoreGenCpuRegs( TARGETING::Target *i_cpuTarget,
break;
}
- l_rc = p8_pore_gen_cpureg( io_image,
- i_sizeImage,
- P8_SPR_HRMOR,
- l_hrmorVal,
- l_coreId,
- l_threadId);
+ l_rc = p8_pore_gen_cpureg_fixed( io_image,
+ P8_SLW_MODEBUILD_IPL,
+ P8_SPR_HRMOR,
+ l_hrmorVal,
+ l_coreId,
+ l_threadId);
if ( l_rc ){
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
"ERROR: HRMOR: core=0x%x,thread=0x%x,l_rc=0x%x",
@@ -266,12 +267,12 @@ errlHndl_t applyPoreGenCpuRegs( TARGETING::Target *i_cpuTarget,
"applyPoreGenCpuRegs: msrc=0x%x,lpcr=0x%x,hrmor=0x%x",
l_msrVal, l_lpcrVal, l_hrmorVal );
- l_rc = p8_pore_gen_cpureg( io_image,
- i_sizeImage,
- P8_SPR_LPCR,
- l_lpcrVal,
- l_coreId,
- l_threadId);
+ l_rc = p8_pore_gen_cpureg_fixed( io_image,
+ P8_SLW_MODEBUILD_IPL,
+ P8_SPR_LPCR,
+ l_lpcrVal,
+ l_coreId,
+ l_threadId);
if ( l_rc )
{
TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
@@ -356,7 +357,7 @@ void* call_host_build_winkle( void *io_pArgs )
{
errlHndl_t l_errl = NULL;
- const char *l_pPoreImage = NULL;
+ char *l_pPoreImage = NULL;
uint32_t l_poreSize = 0;
void *l_pRealMemBase = NULL;
void* l_pVirtMemBase = NULL;
@@ -369,6 +370,11 @@ void* call_host_build_winkle( void *io_pArgs )
// @@@@@ CUSTOM BLOCK: @@@@@
+ // allocate some working buffers
+ void* l_rs4_tmp = malloc(FIXED_RING_BUF_SIZE);
+ void* l_wf_tmp = malloc(FIXED_RING_BUF_SIZE);
+
+
do {
// Get a chunk of real memory big enough to store all the possible
// SLW images.
@@ -475,13 +481,16 @@ void* call_host_build_winkle( void *io_pArgs )
// call the HWP with each fapi::Target
FAPI_INVOKE_HWP( l_errl,
- p8_slw_build,
- l_fapi_cpu_target,
- reinterpret_cast<const void*>(l_pPoreImage),
- l_poreSize,
+ p8_slw_build_fixed,
+ l_fapi_cpu_target, //Proc chip target.
+ reinterpret_cast<void*>(l_pPoreImage),
l_pImageOut,
- &l_sizeImageOut
- );
+ l_sizeImageOut,
+ P8_SLW_MODEBUILD_IPL, //i_modeBuild
+ l_rs4_tmp,//RS4
+ FIXED_RING_BUF_SIZE,
+ l_wf_tmp,//WF
+ FIXED_RING_BUF_SIZE );
if ( l_errl )
{
TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
@@ -555,6 +564,10 @@ void* call_host_build_winkle( void *io_pArgs )
} while (0);
// @@@@@ END CUSTOM BLOCK: @@@@@
+ // delete working buffers
+ if( l_rs4_tmp ) { free(l_rs4_tmp); }
+ if( l_wf_tmp ) { free(l_wf_tmp); }
+
if(l_pVirtMemBase)
{
int rc = 0;
diff --git a/src/usr/hwpf/hwp/build_winkle_images/makefile b/src/usr/hwpf/hwp/build_winkle_images/makefile
index 3e79e2c22..f5901964b 100644
--- a/src/usr/hwpf/hwp/build_winkle_images/makefile
+++ b/src/usr/hwpf/hwp/build_winkle_images/makefile
@@ -56,14 +56,13 @@ OBJS = build_winkle_images.o \
p8_pba_bar_config.o \
sbe_xip_image.o \
p8_pore_table_static_data.o \
- p8_pore_table_gen_api.o \
p8_pore_table_gen_api_fixed.o \
p8_pmc_deconfig_setup.o \
p8_poreslw_init.o \
p8_set_pore_bar.o \
p8_xip_customize.o \
p8_ring_identification.o \
- p8_slw_build.o \
+ p8_slw_build_fixed.o \
p8_image_help_base.o \
p8_pfet_init.o \
p8_pfet_control.o
diff --git a/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/HvPlicModule.H b/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/HvPlicModule.H
deleted file mode 100644
index a74bc37d4..000000000
--- a/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/HvPlicModule.H
+++ /dev/null
@@ -1,23 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG */
-/* This is an automatically generated prolog. */
-/* */
-/* $Source: src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/HvPlicModule.H $ */
-/* */
-/* IBM CONFIDENTIAL */
-/* */
-/* COPYRIGHT International Business Machines Corp. 2012 */
-/* */
-/* p1 */
-/* */
-/* Object Code Only (OCO) source materials */
-/* Licensed Internal Code Source Materials */
-/* IBM HostBoot Licensed Internal Code */
-/* */
-/* The source code for this program is not published or otherwise */
-/* divested of its trade secrets, irrespective of what has been */
-/* deposited with the U.S. Copyright Office. */
-/* */
-/* Origin: 30 */
-/* */
-/* IBM_PROLOG_END_TAG */
-
diff --git a/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_pore_table_gen_api.C b/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_pore_table_gen_api.C
deleted file mode 100644
index b38c02ee0..000000000
--- a/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_pore_table_gen_api.C
+++ /dev/null
@@ -1,740 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG */
-/* This is an automatically generated prolog. */
-/* */
-/* $Source: src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_pore_table_gen_api.C $ */
-/* */
-/* IBM CONFIDENTIAL */
-/* */
-/* COPYRIGHT International Business Machines Corp. 2012,2013 */
-/* */
-/* p1 */
-/* */
-/* Object Code Only (OCO) source materials */
-/* Licensed Internal Code Source Materials */
-/* IBM HostBoot Licensed Internal Code */
-/* */
-/* The source code for this program is not published or otherwise */
-/* divested of its trade secrets, irrespective of what has been */
-/* deposited with the U.S. Copyright Office. */
-/* */
-/* Origin: 30 */
-/* */
-/* IBM_PROLOG_END_TAG */
-// $Id: p8_pore_table_gen_api.C,v 1.13 2013/05/08 20:16:58 cmolsen Exp $
-//
-/*------------------------------------------------------------------------------*/
-/* *! (C) Copyright International Business Machines Corp. 2012 */
-/* *! All Rights Reserved -- Property of IBM */
-/* *! *** IBM Confidential *** */
-/*------------------------------------------------------------------------------*/
-/* *! TITLE : p8_pore_table_gen_api.C */
-/* *! DESCRIPTION : PORE SLW table generaion APIs */
-/* *! OWNER NAME : Michael Olsen Email: cmolsen@us.ibm.com */
-/* *! USAGE : To build for PHYP command-line - */
-// buildecmdprcd_cmo -d "sbe_xip_image.c,pore_inline_assembler.c" p8_pore_table_gen_api.C
-// Other usages:
-// - Passing the DYNAMIC_RAM_TABLE PPD, gen_cpureg() will build
-// up the ramming table in a space saving way, occupying only
-// as much space as needed in the [pre-defined sized] .slw
-// section. This implementation, even though presently not
-// safe due to race condition to the ramming vector, may come
-// in handy at a later stage.
-//
-/* *! COMMENTS : Start file: p7p_pore_api.c */
-//
-/*------------------------------------------------------------------------------*/
-
-#define __P8_PORE_TABLE_GEN_API_C
-#include <HvPlicModule.H>
-#include <p8_pore_api_custom.h>
-#include <p8_pore_table_gen_api.H>
-#include <p8_delta_scan_rw.h>
-
-/*
-// io_image - pointer to SLW image
-// i_sizeImage - size of SLW image
-// i_regName - unswizzled enum SPR value (NOT a name)
-// i_regData - data to write
-// i_coreIndex - core ID
-// i_threadIndex - thread to operate on, API changes thread num to 0 for shared SPRs, except for HRMOR which
-// is always done on thread 3 to be the last SPR
-*/
-uint32_t p8_pore_gen_cpureg( void *io_image,
- uint32_t i_sizeImage,
- uint32_t i_regName,
- uint64_t i_regData,
- uint32_t i_coreId, // [0:15]
- uint32_t i_threadId)
-{
- uint32_t rc=0, rcLoc=0, iCount=0;
- int i=0, iReg=-1;
- uint32_t sizeImageIn=0;
- uint64_t xipSlwRamSection;
- void *hostSlwRamSection;
- uint64_t xipRamTableThis;
- void *hostRamVector;
- void *hostRamTableThis;
- void *hostRamEntryThis, *hostRamEntryNext;
- uint8_t bNewTable=0, bFound=0;
- uint8_t bEntryEnd=1, headerType=0;
- SbeXipSection xipSection;
- SbeXipItem xipTocItem;
- RamTableEntry ramEntryThis, *ramEntryNext;
- uint32_t sprSwiz=0;
-#ifdef DYNAMIC_RAM_TABLE
- uint32_t iCore=0, sizeTableThis=0, sizeTableAll=0;
- void *hostRamEntryFirstAll; // First entry of all Ram tables.
- void *hostRamEntryLastAll; // Last entry of all Ram tables.
- uint64_t xipRamTableNext;
- void *hostRamTableNext;
-#endif
-
- // -------------------------------------------------------------------------
- // Validate Ramming parameters.
- //
- // ...check register value
- bFound = 0;
- for (i=0;i<SLW_SPR_REGS_SIZE;i++) {
- if (i_regName==SLW_SPR_REGS[i].value) {
- bFound = 1;
- iReg = i;
- break;
- }
- }
- if (!bFound) {
- MY_ERR("Register value = %i is not supported.\n",i_regName);
- MY_ERR("The following registers are supported:\n");
- for (i=0;i<SLW_SPR_REGS_SIZE;i++)
- MY_ERR("\t(%s,%i)\n",SLW_SPR_REGS[i].name,SLW_SPR_REGS[i].value);
- rcLoc = 1;
- }
- // ...check core ID
- if (i_coreId>=SLW_MAX_CORES) {
- MY_ERR("Core ID = %i is not within valid range of [0;%i]\n",i_coreId,SLW_MAX_CORES-1);
- rcLoc = 1;
- }
- // ...check thread ID
- if (i_threadId>=SLW_CORE_THREADS) {
- MY_ERR("Thread ID = %i is not within valid range of [0;%i]\n",i_threadId,SLW_CORE_THREADS-1);
- rcLoc = 1;
- }
- if (rcLoc)
- return IMGBUILD_ERR_RAM_INVALID_PARM;
- rcLoc = 0;
-
- // -------------------------------------------------------------------------
- // Validate image and get pointer to SLW section.
- //
- // ...validate
- rc = sbe_xip_validate( io_image, i_sizeImage);
- if (rc) {
- MY_ERR("Invalid image.\n");
- return IMGBUILD_INVALID_IMAGE;
- }
- // ...size check
- sbe_xip_image_size( io_image, &sizeImageIn);
- if (sizeImageIn!=i_sizeImage) {
- MY_ERR("Supplied image size (=%i) differs from size in image header (=%i).\n",
- i_sizeImage, sizeImageIn);
- return IMGBUILD_IMAGE_SIZE_MISMATCH;
- }
- // ...get pointer to SLW section where Ram table resides
- rc = sbe_xip_get_section( io_image, SBE_XIP_SECTION_SLW, &xipSection);
- if (rc) {
- MY_ERR("Probably invalid section name for SBE_XIP_SECTION_SLW.\n");
- return IMGBUILD_ERR_GET_SECTION;
- }
- hostSlwRamSection = (void*)((uint8_t*)io_image + xipSection.iv_offset);
- sbe_xip_host2pore( io_image, hostSlwRamSection, &xipSlwRamSection);
-
- // -------------------------------------------------------------------------
- // Cross check SPR register and table defines
- //
- if (SLW_SPR_REGS_SIZE!=(SLW_MAX_CPUREGS_CORE+SLW_MAX_CPUREGS_THREADS)) {
- MY_ERR("Defines in *.H header file not in sync.\n");
- return IMGBUILD_ERR_RAM_HDRS_NOT_SYNCED;
- }
- if (xipSection.iv_size!=SLW_RAM_TABLE_SIZE+SLW_SCOM_TABLE_SIZE_ALL) {
- MY_ERR("SLW table size in *.H header file differs from SLW section size in image.\n");
- MY_ERR("Check code or image version.\n");
- return IMGBUILD_ERR_RAM_HDRS_NOT_SYNCED;
- }
- // -------------------------------------------------------------------------
- // Summarize parameters and checking results.
- //
- MY_INF("Input parameter checks - OK\n");
- MY_INF("\tRegister = (%s,%i)\n",SLW_SPR_REGS[iReg].name,SLW_SPR_REGS[iReg].value);
- MY_INF("\tCore ID = %i\n",i_coreId);
- MY_INF("\tThread ID = %i\n",i_threadId);
- MY_INF("Image validation and size checks - OK\n");
- MY_INF("\tImage size = %i\n",i_sizeImage);
- MY_INF("\tSLW section size= %i\n",xipSection.iv_size);
-
- // -------------------------------------------------------------------------
- // Locate RAM vector and locate RAM table associated with "This" core ID.
- //
- rc = sbe_xip_find( io_image, SLW_HOST_REG_VECTOR_TOC_NAME, &xipTocItem);
- if (rc) {
- MY_ERR("Probably invalid key word for SLW_HOST_REG_VECTOR_TOC_NAME.\n");
- return IMGBUILD_ERR_KEYWORD_NOT_FOUND;
- }
- sbe_xip_pore2host( io_image, xipTocItem.iv_address, &hostRamVector);
- xipRamTableThis = myRev64(*((uint64_t*)hostRamVector + i_coreId));
- if (xipRamTableThis) {
- sbe_xip_pore2host( io_image, xipRamTableThis, &hostRamTableThis);
- bNewTable = 0;
- }
- else {
- hostRamTableThis = NULL;
- bNewTable = 1;
- }
-
-#ifdef DYNAMIC_RAM_TABLE
- hostRamEntryFirstAll = hostSlwRamSection;
- hostRamEntryLastAll = hostRamEntryFirstAll;
-
- // -------------------------------------------------------------------------
- // Walk the RAM vector and RAM tables to
- // - determine size of present tables, sizeTableAll - we'll need it when/if shifting entries forward
- // - check for RAM table overflow.
- //
- sizeTableAll = 0;
- for (iCore=0; iCore<SLW_MAX_CORES; iCore++) {
- xipRamTableNext = myRev64(*((uint64_t*)hostRamVector + iCore));
- if (xipRamTableNext)
- sbe_xip_pore2host( io_image, xipRamTableNext, &hostRamTableNext);
- else
- hostRamTableNext = NULL;
- sizeTableThis = 0;
- if (hostRamTableNext) {
- hostRamEntryNext = hostRamTableNext;
- ramEntryNext = (RamTableEntry*)hostRamEntryNext;
- sizeTableThis = sizeTableThis + XIPSIZE_RAM_ENTRY;
- while ((myRev32(ramEntryNext->header) & RAM_HEADER_END_MASK_C)==0) {
- hostRamEntryNext = (void*)((uint8_t*)hostRamEntryNext + XIPSIZE_RAM_ENTRY);
- ramEntryNext = (RamTableEntry*)hostRamEntryNext;
- sizeTableThis = sizeTableThis + XIPSIZE_RAM_ENTRY;
- }
- // Keep searching for last entry.
- if ((uint64_t)hostRamEntryLastAll<(uint64_t)hostRamEntryNext)
- hostRamEntryLastAll = hostRamEntryNext;
- // Check hostRamTableThis for sizeTableThis>SLW_MAX_CPUREGS_OPS
- if ((uint64_t)hostRamTableNext==(uint64_t)hostRamTableThis) {
- if ((sizeTableThis/XIPSIZE_RAM_ENTRY+1)>SLW_MAX_CPUREGS_OPS) {
- MY_ERR("RAM table is full. Max %i entries allowed.\n",SLW_MAX_CPUREGS_OPS);
- return IMGBUILD_ERR_RAM_TABLE_FULL;
- }
- }
- // Update total table size.
- sizeTableAll = sizeTableAll + sizeTableThis;
- // Increment RAM vector entries, if needed, but not if a new table which goes at the end.
- // (This must be done at this stage while walking everything.)
- if (!bNewTable && ((uint64_t)hostRamTableNext>(uint64_t)hostRamTableThis)) {
- sbe_xip_host2pore( io_image, (void*)((uint8_t*)hostRamTableNext + XIPSIZE_RAM_ENTRY), &xipRamTableNext);
- *((uint64_t*)hostRamVector + iCore) = myRev64(xipRamTableNext);
- }
- }
- }
-#else
- // -------------------------------------------------------------------------
- // We don't need to walk the "this" RAM table to check for RAM table
- // as this is done further down during insertion of the entry.
- //
-#endif
-
-
- // -------------------------------------------------------------------------
- // Walk the "This" core ID's RAM table to
- // - determine insertion point, hostRamEntryThis, of new RAM entry
- //
- if (bNewTable) {
-#ifdef DYNAMIC_RAM_TABLE
- // Append to end of table.
- hostRamTableThis = (void*)((uint8_t*)hostRamEntryFirstAll + sizeTableAll);
- hostRamEntryThis = hostRamTableThis;
- // ...update RAM vector (since it is currently NULL)
- sbe_xip_host2pore( io_image, hostRamTableThis, &xipRamTableThis);
- *((uint64_t*)hostRamVector + i_coreId) = myRev64(xipRamTableThis);
- bEntryEnd = 1;
-#else
- // Append to beginning of agreed upon static position for this coreId.
- hostRamTableThis = (void*)((uint8_t*)hostSlwRamSection +
- (uint32_t)(SLW_RAM_TABLE_SIZE/SLW_MAX_CORES)*i_coreId );
- hostRamEntryThis = hostRamTableThis;
- // ...update RAM vector (since it is currently NULL)
- *((uint64_t*)hostRamVector + i_coreId) = myRev64( xipSlwRamSection +
- (uint32_t)(SLW_RAM_TABLE_SIZE/SLW_MAX_CORES)*i_coreId );
- bEntryEnd = 1;
-#endif
- }
- else {
- // Insert at end of existing table.
- hostRamEntryNext = hostRamTableThis;
- ramEntryNext = (RamTableEntry*)hostRamEntryNext;
- iCount = 1;
- while ((myRev32(ramEntryNext->header) & RAM_HEADER_END_MASK_C)==0) {
- if (iCount>=SLW_MAX_CPUREGS_OPS) {
- MY_ERR("Bad table! Header end bit not found and RAM table full (=%i entries).\n",SLW_MAX_CPUREGS_OPS);
- return IMGBUILD_ERR_RAM_TABLE_END_NOT_FOUND;
- }
- hostRamEntryNext = (void*)((uint8_t*)hostRamEntryNext + XIPSIZE_RAM_ENTRY);
- ramEntryNext = (RamTableEntry*)hostRamEntryNext;
- iCount++;
- }
- if (iCount<SLW_MAX_CPUREGS_OPS) {
- // ...zero out previous END bit in header
- if ((myRev32(ramEntryNext->header) & RAM_HEADER_END_MASK_C)) {
- ramEntryNext->header = ramEntryNext->header & myRev32(~RAM_HEADER_END_MASK_C);
- }
- else {
- MY_ERR("We should never get here. Check code. Dumping data:\n");
- MY_ERR("myRev32(ramEntryNext->header) = 0x%08x\n",myRev32(ramEntryNext->header));
- MY_ERR("RAM_HEADER_END_MASK_C = 0x%08x\n",RAM_HEADER_END_MASK_C);
- return IMGBUILD_ERR_RAM_CODE;
- }
- }
- else {
- MY_ERR("RAM table is full. Max %i entries allowed.\n",SLW_MAX_CPUREGS_OPS);
- return IMGBUILD_ERR_RAM_TABLE_FULL;
- }
- // ...this is the spot for the new entry
- hostRamEntryThis = (void*)((uint8_t*)hostRamEntryNext + XIPSIZE_RAM_ENTRY);
- bEntryEnd = 1;
- }
-
-#ifdef DYNAMIC_RAM_TABLE
- // -------------------------------------------------------------------------
- // Shift RAM entries forward by XIPSIZE_RAM_ENTRY
- // (Need to do this before inserting new RAM entry at hostRamEntryThis.)
- //
- if (!bNewTable)
- for ( ramEntryNext=(RamTableEntry*)hostRamEntryLastAll;
- ramEntryNext>=(RamTableEntry*)hostRamEntryThis;
- ramEntryNext-- ) {
- *(ramEntryNext+1) = *ramEntryNext;
- if ((ramEntryNext+1)->instr!=ramEntryNext->instr) {
- MY_ERR("Incorrect shifting of table entries. Check code.\n");
- return IMGBUILD_ERR_RAM_CODE;
- }
- }
-#endif
-
- // -------------------------------------------------------------------------
- // Create, or modify, the RAM entry.
- //
- if (i_regName==P8_MSR_MSR) {
- // ...do the MSR header
- headerType = 0x1; // MTMSRD header.
- ramEntryThis.header = ( ((uint32_t)bEntryEnd) << RAM_HEADER_END_START_C & RAM_HEADER_END_MASK_C ) |
- ( ((uint32_t)headerType) << RAM_HEADER_TYPE_START_C & RAM_HEADER_TYPE_MASK_C ) |
- ( i_threadId << RAM_HEADER_THREAD_START_C & RAM_HEADER_THREAD_MASK_C );
- // ...do the MSR instr
- ramEntryThis.instr = RAM_MTMSRD_INSTR_TEMPL_C;
- }
- else {
- // ...do the SPR header
- headerType = 0x0; // MTSPR header.
- ramEntryThis.header = ( ((uint32_t)bEntryEnd) << RAM_HEADER_END_START_C & RAM_HEADER_END_MASK_C ) |
- ( ((uint32_t)headerType) << RAM_HEADER_TYPE_START_C & RAM_HEADER_TYPE_MASK_C ) |
- ( i_regName << RAM_HEADER_SPRN_START_C & RAM_HEADER_SPRN_MASK_C ) |
- ( i_threadId << RAM_HEADER_THREAD_START_C & RAM_HEADER_THREAD_MASK_C );
- // ...do the SPR instr
- sprSwiz = i_regName>>5 | (i_regName & 0x0000001f)<<5;
- if (sprSwiz!=SLW_SPR_REGS[iReg].swizzled) {
- MY_ERR("Inconsistent swizzle rules implemented. Check code. Dumping data.\n");
- MY_ERR("\tsprSwiz (on-the-fly-calc)=%i\n",sprSwiz);
- MY_ERR("\tSLW_SPR_REGS[%i].swizzled=%i\n",iReg,SLW_SPR_REGS[iReg].swizzled);
- return IMGBUILD_ERR_RAM_CODE;
- }
- ramEntryThis.instr = RAM_MTSPR_INSTR_TEMPL_C | ( ( sprSwiz<<RAM_MTSPR_SPR_START_C ) & RAM_MTSPR_SPR_MASK_C );
- }
- // ...do the data
- ramEntryThis.data = i_regData;
- // ...summarize new table entry data
- MY_INF("New table entry data (host format):\n");
- MY_INF("\theader = 0x%08x\n",ramEntryThis.header);
- MY_INF("\tinstr = 0x%08x\n",ramEntryThis.instr);
- MY_INF("\tdata = 0x%016llx\n",ramEntryThis.data);
-
- // -------------------------------------------------------------------------
- // Insert the new RAM entry into the table in BE format.
- //
- ramEntryNext = (RamTableEntry*)hostRamEntryThis;
- // ...some redundant checking
- if (bNewTable) {
- // For any new table, the insertion location should be clean. We check for this here.
- if (myRev32(ramEntryNext->header)!=0) {
- MY_ERR("WARNING : Table entry location should be empty for a new table. Check code and image. Dumping data:\n");
- MY_ERR("\theader = 0x%08x\n",myRev32(ramEntryNext->header));
- MY_ERR("\tinstr = 0x%08x\n",myRev32(ramEntryNext->instr));
- MY_ERR("\tdata = 0x%016llx\n",myRev64(ramEntryNext->data));
- rc = IMGBUILD_WARN_RAM_TABLE_CONTAMINATION;
- }
- }
- ramEntryNext->header = myRev32(ramEntryThis.header);
- ramEntryNext->instr = myRev32(ramEntryThis.instr);
- ramEntryNext->data = myRev64(ramEntryThis.data);
-
- return rc;
-}
-
-
-/*
-// io_image - pointer to SLW image
-// i_sizeImage - size of SLW image
-// i_scomAddr - Scom address
-// i_scomData - Data to write to scom register
-// i_operation - What to do with the scom addr and data
-// i_coreId - The core ID [0:15].
-*/
-uint32_t p8_pore_gen_scom( void *io_image,
- uint32_t i_sizeImage,
- uint32_t i_scomAddr,
- uint32_t i_coreId, // [0:15]
- uint64_t i_scomData,
- uint32_t i_operation, // [0:5]
- uint32_t i_section) // [0,2,3]
-{
- uint32_t rc=0, rcLoc=0, iEntry=0;
- uint32_t chipletId=0;
- uint32_t operation=0;
- uint32_t entriesCount=0, entriesMatch=0, entriesNOP=0;
- uint32_t sizeImageIn=0;
- uint64_t xipScomTableThis;
- void *hostScomVector, *hostScomTableThis;
- void *hostScomEntryNext; // running entry pointer
- void *hostScomEntryMatch=NULL; // pointer to entry that matches scomAddr
- void *hostScomEntryRET=NULL; // pointer to first return instr after table
- void *hostScomEntryNOP=NULL; // pointer to first nop IIS
- uint8_t bufIIS[XIPSIZE_SCOM_ENTRY], bufNOP[4], bufRET[4];
- SbeXipSection xipSection;
- SbeXipItem xipTocItem;
- PoreInlineContext ctx;
-
- // -------------------------------------------------------------------------
- // Validate Scom parameters.
- //
- // ...check if valid Scom register (is there anything we can do here to check?)
- // Skipping check. We blindly trust caller.
- //
- // ...check Scom operation
- if (i_operation<P8_PORE_SCOM_FIRST_OP || i_operation>P8_PORE_SCOM_LAST_OP) {
- MY_ERR("Scom operation = %i is not within valid range of [%d;%d]\n",
- i_operation, P8_PORE_SCOM_FIRST_OP, P8_PORE_SCOM_LAST_OP);
- rcLoc = 1;
- }
- // ...check that core ID corresponds to valid chiplet ID
- chipletId = i_coreId + P8_CID_EX_LOW;
- if (chipletId<P8_CID_EX_LOW || chipletId>P8_CID_EX_HIGH) {
- MY_ERR("Chiplet ID = 0x%02x is not within valid range of [0x%02x;0x%02x]\n",
- chipletId, P8_CID_EX_LOW, P8_CID_EX_HIGH);
- rcLoc = 1;
- }
- if (rcLoc)
- return IMGBUILD_ERR_SCOM_INVALID_PARM;
- rcLoc = 0;
-
- // -------------------------------------------------------------------------
- // Validate image and get pointer to SLW section.
- //
- // ...validate
- rc = sbe_xip_validate( io_image, i_sizeImage);
- if (rc) {
- MY_ERR("Invalid image.\n");
- return IMGBUILD_INVALID_IMAGE;
- }
- // ...size check
- sbe_xip_image_size( io_image, &sizeImageIn);
- if (sizeImageIn!=i_sizeImage) {
- MY_ERR("Supplied image size (=%i) differs from size in image header (=%i).\n",
- i_sizeImage, sizeImageIn);
- return IMGBUILD_IMAGE_SIZE_MISMATCH;
- }
- // ...get pointer to SLW section where Scom table resides
- rc = sbe_xip_get_section( io_image, SBE_XIP_SECTION_SLW, &xipSection);
- if (rc) {
- MY_ERR("Probably invalid section name for SBE_XIP_SECTION_SLW.\n");
- return IMGBUILD_ERR_GET_SECTION;
- }
- // ...check .slw section size
- if (xipSection.iv_size!=SLW_RAM_TABLE_SIZE+SLW_SCOM_TABLE_SIZE_ALL) {
- MY_ERR("SLW table size in *.H header file differs from SLW section size in image.\n");
- MY_ERR("Check code or image version.\n");
- return IMGBUILD_ERR_SCOM_HDRS_NOT_SYNCD;
- }
-
- // -------------------------------------------------------------------------
- // Summarize parameters and checking results.
- //
- MY_INF("Input parameter checks - OK\n");
- MY_INF("\tRegister = 0x%08x\n",i_scomAddr);
- MY_INF("\tOperation = %i\n",i_operation);
- MY_INF("\tSection = %i\n",i_section);
- MY_INF("\tCore ID = %i\n",i_coreId);
- MY_INF("Image validation and size checks - OK\n");
- MY_INF("\tImage size = %i\n",i_sizeImage);
- MY_INF("\tSLW section size= %i\n",xipSection.iv_size);
-
- // -------------------------------------------------------------------------
- // Locate Scom vector according to i_section and then locate Scom table
- // associated with "This" core ID.
- //
- switch (i_section) {
- case 0:
- rc = sbe_xip_find( io_image, SLW_HOST_SCOM_NC_VECTOR_TOC_NAME, &xipTocItem);
- if (rc) {
- MY_ERR("Probably invalid key word for SLW_HOST_SCOM_NC_VECTOR_TOC_NAME.\n");
- return IMGBUILD_ERR_KEYWORD_NOT_FOUND;
- }
- break;
- case 2:
- rc = sbe_xip_find( io_image, SLW_HOST_SCOM_L2_VECTOR_TOC_NAME, &xipTocItem);
- if (rc) {
- MY_ERR("Probably invalid key word for SLW_HOST_SCOM_L2_VECTOR_TOC_NAME.\n");
- return IMGBUILD_ERR_KEYWORD_NOT_FOUND;
- }
- break;
- case 3:
- rc = sbe_xip_find( io_image, SLW_HOST_SCOM_L3_VECTOR_TOC_NAME, &xipTocItem);
- if (rc) {
- MY_ERR("Probably invalid key word for SLW_HOST_SCOM_L3_VECTOR_TOC_NAME.\n");
- return IMGBUILD_ERR_KEYWORD_NOT_FOUND;
- }
- break;
- default:
- MY_ERR("Invalid value for i_section (=%i).\n",i_section);
- MY_ERR("Valid values for i_section = [0,2,3].\n");
- return IMGBUILD_ERR_SCOM_INVALID_SUBSECTION;
- }
- MY_INF("xipTocItem.iv_address = 0x%016llx\n",xipTocItem.iv_address);
- sbe_xip_pore2host( io_image, xipTocItem.iv_address, &hostScomVector);
- MY_INF("hostScomVector = 0x%016llx\n",(uint64_t)hostScomVector);
- xipScomTableThis = myRev64(*((uint64_t*)hostScomVector + i_coreId));
- MY_INF("xipScomTableThis = 0x%016llx\n",xipScomTableThis);
- if (xipScomTableThis) {
- sbe_xip_pore2host( io_image, xipScomTableThis, &hostScomTableThis);
- }
- else { // Should never be here.
- MY_ERR("Code or image bug. Scom vector table entries should never be null.\n");
- return IMGBUILD_ERR_CHECK_CODE;
- }
-
- //
- // Determine where to place/do Scom action and if entry already exists.
- // Insertion rules:
- // - If entry doesn't exist, insert at first NOP. (Note that if you don't do
- // this, then the table might potentially overflow since the max table size
- // doesn't include NOP entries.)
- // - If no NOP found, insert at first RET.
- //
-
- // First, create search strings for addr, nop and ret.
- // Note, the following IIS will also be used in case of
- // - i_operation==append
- // - i_operation==replace
- pore_inline_context_create( &ctx, (void*)bufIIS, XIPSIZE_SCOM_ENTRY, 0, 0);
- pore_LS( &ctx, P1, chipletId);
- pore_STI( &ctx, i_scomAddr, P1, i_scomData);
- if (ctx.error > 0) {
- MY_ERR("pore_LS or _STI generated rc = %d", ctx.error);
- return IMGBUILD_ERR_PORE_INLINE_ASM;
- }
- pore_inline_context_create( &ctx, (void*)bufRET, 4, 0, 0);
- pore_RET( &ctx);
- if (ctx.error > 0) {
- MY_ERR("pore_RET generated rc = %d", ctx.error);
- return IMGBUILD_ERR_PORE_INLINE_ASM;
- }
- pore_inline_context_create( &ctx, (void*)bufNOP, 4, 0, 0);
- pore_NOP( &ctx);
- if (ctx.error > 0) {
- MY_ERR("pore_NOP generated rc = %d", ctx.error);
- return IMGBUILD_ERR_PORE_INLINE_ASM;
- }
-
- // Second, search for addr and nop in relevant coreId table until first RET.
- // Note:
- // - We go through ALL entries until first RET instr. We MUST find a RET instr,
- // though we don't check for overrun until later. (Should be improved.)
- // - Count number of entries and check for overrun, though we'll continue
- // searching until we find an RET. (Should be improved.)
- // - The STI(+SCOM_addr) opcode is in the 2nd word of the Scom entry.
- // - For an append operation, if a NOP is found (before a RET obviously), the
- // SCOM is replacing that NNNN sequence.
- hostScomEntryNext = hostScomTableThis;
- while (memcmp(hostScomEntryNext, bufRET, sizeof(uint32_t))) {
- entriesCount++;
- if (*((uint32_t*)bufIIS+1)==*((uint32_t*)hostScomEntryNext+1) && entriesMatch==0) {// +1 skips 1st word in Scom entry (which loads the PC in an LS operation.)
- hostScomEntryMatch = hostScomEntryNext;
- entriesMatch++;
- }
- if ((0 == memcmp(hostScomEntryNext, bufNOP, sizeof(uint32_t))) && entriesNOP==0) {
- hostScomEntryNOP = hostScomEntryNext;
- entriesNOP++;
- }
- hostScomEntryNext = (void*)((uintptr_t)hostScomEntryNext + XIPSIZE_SCOM_ENTRY);
- }
- hostScomEntryRET = hostScomEntryNext; // The last EntryNext will always be the first RET.
-
- switch (i_section) {
- case 0:
- if (entriesCount>=SLW_MAX_SCOMS_NC) {
- MY_ERR("SCOM table NC is full. Max %i entries allowed.\n",SLW_MAX_SCOMS_NC);
- return IMGBUILD_ERR_CHECK_CODE;
- }
- break;
- case 2:
- if (entriesCount>=SLW_MAX_SCOMS_L2) {
- MY_ERR("SCOM table L2 is full. Max %i entries allowed.\n",SLW_MAX_SCOMS_L2);
- return IMGBUILD_ERR_CHECK_CODE;
- }
- break;
- case 3:
- if (entriesCount>=SLW_MAX_SCOMS_L3) {
- MY_ERR("SCOM table L3 is full. Max %i entries allowed.\n",SLW_MAX_SCOMS_L3);
- return IMGBUILD_ERR_CHECK_CODE;
- }
- break;
- default:
- MY_ERR("Invalid value for i_section (=%i).\n",i_section);
- MY_ERR("Valid values for i_section = [0,2,3].\n");
- return IMGBUILD_ERR_SCOM_INVALID_SUBSECTION;
- }
-
- //
- // Further qualify (translate) operation and IIS.
- //
- if (i_operation==P8_PORE_SCOM_APPEND) {
- operation = i_operation;
- }
- else if (i_operation==P8_PORE_SCOM_REPLACE) {
- if (hostScomEntryMatch)
- // ... do a replace
- operation = i_operation;
- else
- // ... do an append
- operation = P8_PORE_SCOM_APPEND;
- }
- else if (i_operation==P8_PORE_SCOM_NOOP) {
- // ...overwrite earlier bufIIS from the search step
- pore_inline_context_create( &ctx, (void*)bufIIS, XIPSIZE_SCOM_ENTRY, 0, 0);
- pore_NOP( &ctx);
- pore_NOP( &ctx);
- pore_NOP( &ctx);
- pore_NOP( &ctx);
- if (ctx.error > 0) {
- MY_ERR("*** _NOP generated rc = %d", ctx.error);
- return IMGBUILD_ERR_PORE_INLINE_ASM;
- }
- operation = i_operation;
- }
- else if (i_operation==P8_PORE_SCOM_AND ||
- i_operation==P8_PORE_SCOM_OR) {
- operation = i_operation;
- }
- else if (i_operation==P8_PORE_SCOM_RESET) {
- // ... create RNNN instruction sequence.
- pore_inline_context_create( &ctx, (void*)bufIIS, XIPSIZE_SCOM_ENTRY, 0, 0);
- pore_RET( &ctx);
- pore_NOP( &ctx);
- pore_NOP( &ctx);
- pore_NOP( &ctx);
- if (ctx.error > 0) {
- MY_ERR("***_RET or _NOP generated rc = %d", ctx.error);
- return IMGBUILD_ERR_PORE_INLINE_ASM;
- }
- operation = i_operation;
- }
- else {
- MY_ERR("Scom operation = %i is not within valid range of [%d;%d]\n",
- i_operation, P8_PORE_SCOM_FIRST_OP, P8_PORE_SCOM_LAST_OP);
- return IMGBUILD_ERR_SCOM_INVALID_PARM;
- }
-
- // -------------------------------------------------------------------------
- // Assuming pre-allocated Scom table (after pre-allocated Ram table):
- // - Table is pre-filled with RNNN ISS.
- // - Each core Id has dedicated space, uniformly distributed by SLW_MAX_SCOMS_NC*
- // XIPSIZE_SCOM_ENTRY.
- // - Remember to check for more than SLW_MAX_SCOMS_NC entries!
- switch (operation) {
-
- case P8_PORE_SCOM_APPEND: // Append a Scom at first occurring NNNN or RNNN,
- if (hostScomEntryNOP) {
- // ... replace the NNNN
- MY_INF("Append at NOP\n");
- memcpy(hostScomEntryNOP,(void*)bufIIS,XIPSIZE_SCOM_ENTRY);
- }
- else if (hostScomEntryRET) {
- // ... replace the RNNN
- MY_INF("Append at RET\n");
- memcpy(hostScomEntryRET,(void*)bufIIS,XIPSIZE_SCOM_ENTRY);
- }
- else {
- // We should never be here.
- MY_ERR("In case=_SCOM_APPEND: EntryRET=NULL is impossible. Check code.\n");
- return IMGBUILD_ERR_CHECK_CODE;
- }
- break;
- case P8_PORE_SCOM_REPLACE: // Replace existing Scom with new data
- if (hostScomEntryMatch) {
- // ... do a vanilla replace
- MY_INF("Replace existing Scom\n");
- memcpy(hostScomEntryMatch,(void*)bufIIS,XIPSIZE_SCOM_ENTRY);
- }
- else {
- // We should never be here.
- MY_ERR("In case=_SCOM_REPLACE: EntryMatch=NULL is impossible. Check code.\n");
- return IMGBUILD_ERR_CHECK_CODE;
- }
- break;
- case P8_PORE_SCOM_NOOP:
- if (hostScomEntryMatch) {
- // ... do a vanilla replace
- MY_INF("Replace existing Scom w/NOPs\n");
- memcpy(hostScomEntryMatch,(void*)bufIIS,XIPSIZE_SCOM_ENTRY);
- }
- else {
- // do nothing, and assume everything is fine, since we did no damage.
- }
- break;
- case P8_PORE_SCOM_OR: // Overlay Scom data onto existing data by bitwise OR
- if (hostScomEntryMatch) {
- // ... do an OR on the data (which is the 2nd DWord in the entry)
- MY_INF("Overlay existing Scom - OR case\n");
- *((uint64_t*)hostScomEntryMatch+1) =
- *((uint64_t*)hostScomEntryMatch+1) | myRev64(i_scomData);
- }
- else {
- MY_ERR("No Scom entry found to do OR operation with.\n");
- return IMGBUILD_ERR_SCOM_ENTRY_NOT_FOUND;
- }
- break;
- case P8_PORE_SCOM_AND: // Overlay Scom data onto existing data by bitwise AND
- if (hostScomEntryMatch) {
- // ... do an AND on the data (which is the 2nd DWord in the entry)
- MY_INF("Overlay existing Scom - AND case\n");
- *((uint64_t*)hostScomEntryMatch+1) =
- *((uint64_t*)hostScomEntryMatch+1) & myRev64(i_scomData);
- }
- else {
- MY_ERR("No Scom entry found to do AND operation with.\n");
- return IMGBUILD_ERR_SCOM_ENTRY_NOT_FOUND;
- }
- break;
- case P8_PORE_SCOM_RESET: // Reset (delete) table. Refill w/RNNN ISS.
- MY_INF("Reset table\n");
- hostScomEntryNext = hostScomTableThis;
- for ( iEntry=0; iEntry<entriesCount; iEntry++) {
- memcpy( hostScomEntryNext, (void*)bufIIS, XIPSIZE_SCOM_ENTRY);
- hostScomEntryNext = (void*)((uintptr_t)hostScomEntryNext + XIPSIZE_SCOM_ENTRY);
- }
- break;
- default:
- MY_ERR("Impossible value of operation (=%i). Check code.\n",operation);
- return IMGBUILD_ERR_CHECK_CODE;
-
- } // End of switch(operation)
-
- return rc;
-}
diff --git a/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_pore_table_gen_api.H b/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_pore_table_gen_api.H
index 4ba6dedf6..896e8feb5 100644
--- a/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_pore_table_gen_api.H
+++ b/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_pore_table_gen_api.H
@@ -20,7 +20,7 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: p8_pore_table_gen_api.H,v 1.20 2013/05/08 20:18:50 cmolsen Exp $
+// $Id: p8_pore_table_gen_api.H,v 1.21 2013/05/23 21:10:40 dcrowell Exp $
/*------------------------------------------------------------------------------*/
/* *! (C) Copyright International Business Machines Corp. 2012 */
/* *! All Rights Reserved -- Property of IBM */
@@ -156,7 +156,9 @@ CONST_UINT64_T( SCRATCH0_RESET_VALUE, (0xABBA99EBBA33DADA) );
//#include <stdio.h>
+#ifndef PPC_HYP
#include <stdlib.h>
+#endif // PPC_HYP
#ifndef __P8_PORE_TABLE_GEN_API_C
#include <p8_pore_api_custom.h>
#endif
@@ -313,9 +315,11 @@ enum {
#define SLW_RAM_WARNING_TABLE_CONTAMINATION 6
+#ifndef PPC_HYP
#ifdef __cplusplus
extern "C" {
#endif
+#endif // PPC_HYP
/********************************************************************/
/* C-code RAM section - begin */
@@ -410,9 +414,11 @@ uint32_t p8_pore_gen_scom_fixed(void *io_image,
uint32_t i_operation,
uint32_t i_section);
+#ifndef PPC_HYP
#ifdef __cplusplus
}
#endif
+#endif // PPC_HYP
#endif // FOR_PORE_RAMMING
diff --git a/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_pore_table_static_data.c b/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_pore_table_static_data.c
index 48d3b8460..0181203f6 100644
--- a/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_pore_table_static_data.c
+++ b/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_pore_table_static_data.c
@@ -20,7 +20,8 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: p8_pore_table_static_data.c,v 1.6 2013/05/08 20:19:41 cmolsen Exp $
+
+// $Id: p8_pore_table_static_data.c,v 1.7 2013-05-23 21:10:38 dcrowell Exp $
/*------------------------------------------------------------------------------*/
/* *! (C) Copyright International Business Machines Corp. 2012 */
/* *! All Rights Reserved -- Property of IBM */
@@ -33,7 +34,6 @@
/* *! COMMENTS : This file is exclusively for PHYP environment. */
//
/*------------------------------------------------------------------------------*/
-#include <HvPlicModule.H>
#include <p8_pore_table_gen_api.H>
const SlwSprRegs SLW_SPR_REGS[] = {
diff --git a/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_slw_build.C b/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_slw_build.C
deleted file mode 100644
index 822cca027..000000000
--- a/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_slw_build.C
+++ /dev/null
@@ -1,731 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG */
-/* This is an automatically generated prolog. */
-/* */
-/* $Source: src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_slw_build.C $ */
-/* */
-/* IBM CONFIDENTIAL */
-/* */
-/* COPYRIGHT International Business Machines Corp. 2012,2013 */
-/* */
-/* p1 */
-/* */
-/* Object Code Only (OCO) source materials */
-/* Licensed Internal Code Source Materials */
-/* IBM HostBoot Licensed Internal Code */
-/* */
-/* The source code for this program is not published or otherwise */
-/* divested of its trade secrets, irrespective of what has been */
-/* deposited with the U.S. Copyright Office. */
-/* */
-/* Origin: 30 */
-/* */
-/* IBM_PROLOG_END_TAG */
-// $Id: p8_slw_build.C,v 1.23 2013/06/13 15:15:14 cmolsen Exp $
-/*------------------------------------------------------------------------------*/
-/* *! TITLE : p8_slw_build */
-/* *! DESCRIPTION : Extracts and decompresses delta ring states from EPROM */
-// image. Utilizes the linked list approach (LLA) to extract
-// and position wiggle-flip programs in .rings according to
-// back pointer, DD level, phase and override settings.
-/* *! OWNER NAME : Michael Olsen cmolsen@us.ibm.com */
-//
-/* *! EXTENDED DESCRIPTION : */
-//
-/* *! USAGE : To build (for Hostboot) - */
-// buildfapiprcd -C "p8_image_help.C,p8_image_help_base.C,p8_scan_compression.C" -c "sbe_xip_image.c,pore_inline_assembler.c" -e "../../xml/error_info/p8_slw_build_errors.xml" p8_slw_build.C
-// To build (for command-line) -
-// buildfapiprcd -r ver-13-0 -C "p8_image_help.C,p8_image_help_base.C,p8_scan_compression.C" -c "sbe_xip_image.c,pore_inline_assembler.c" -e "../../xml/error_info/p8_slw_build_errors.xml" -u "SLW_COMMAND_LINE,IMGBUILD_PPD_IGNORE_XIPC,IMGBUILD_PPD_WF_POLLING_PROT" p8_slw_build.C
-// Other Pre-Processor Directive (PPD) options -
-// To debug WF programs:
-// -u "IMGBUILD_PPD_DEBUG_WF"
-// To add worst-case PIB access to wf programs:
-// -u "IMGBUILD_PPD_WF_WORST_CASE_PIB"
-// To add polling protocol to wf programs:
-// -u "IMGBUILD_PPD_WF_POLLING_PROT"
-// (NB! This will eventually be changed to IMGBUILD_PPD_WF_NO POLLING_PROT
-// because we want the polling protocol to be default.)
-// To NOT run xip_customize:
-// -u "IMGBUILD_PPD_IGNORE_XIPC"
-// (NB! Thus, by defaul for HB and PHYP, since they don't used PPDs,
-// xip_customize() will always be called.)
-//
-/* *! ASSUMPTIONS : */
-// - For Hostboot environment:
-// - No precompiler directives needed
-// - dynamic P0/P1 calculation
-// - polling scan protocol
-// - check header word after WF
-// - sysPhase=1
-// - non-command-line mode, FAPI call
-//
-/* *! COMMENTS : */
-// - All image content, incl .initf content and ring layout, is handled
-// in BE format. No matter which platform.
-// - A ring may only be requested with the sysPhase=0 or 1. Any other
-// sysPhase value, incl sysPhase=2, will cause no rings to be found.
-//
-/*------------------------------------------------------------------------------*/
-
-#include <p8_pore_api_custom.h>
-#include <HvPlicModule.H>
-#include <p8_slw_build.H>
-#include <p8_xip_customize.H>
-#include <p8_delta_scan_rw.h>
-#include <p8_pore_table_gen_api.H>
-
-extern "C" {
-
-using namespace fapi;
-
-// Parameter list:
-// fapi::Target &i_target: Hardware target
-// void *i_imageIn: Pointer to memory mapped input Reference PNOR image
-// uint32_t i_sizeImageIn: Size of input image.
-// void *i_imageOut: Pointer to where to put SLW mainstore image
-// uint32_t *io_sizeImageOut: Size of output image. Initial upper limit supplied by HB. Final size returned.
-//
-ReturnCode p8_slw_build( const fapi::Target &i_target,
- const void *i_imageIn,
- uint32_t i_sizeImageIn,
- void *i_imageOut,
- uint32_t *io_sizeImageOut)
-{
- ReturnCode rc;
- uint8_t l_uint8 = 0;
- uint32_t ddLevel=0;
- uint8_t sysPhase=1;
- uint32_t rcLoc=0, rcSearch=0, i, countWF=0;
- uint32_t sizeImage=0, sizeImageOutMax, sizeImageTmp, sizeImageOld;
- CompressedScanData *deltaRingRS4=NULL;
- DeltaRingLayout rs4RingLayout;
- void *nextRing=NULL;
- uint32_t ringBitLen=0;
- uint32_t *wfInline=NULL;
- uint32_t wfInlineLenInWords;
- uint64_t scanMaxRotate=SCAN_ROTATE_DEFAULT;
- sizeImageOutMax = *io_sizeImageOut;
- uint32_t bootCoreMask=0x000FFFF;
-
-
- // 2012-11-13: CMO- Temporary defines of ring buffers. This will be changed by
- // Dec 03 where we'll switch over to a fixed size image for ffdc
- // support and will schedule the enhancement to slw_build's
- // interface to accept these buffers as well as to ditch
- // io_sizeImageOut. We also should drop i_sizeImageIn. It really
- // serves no purpose to require caller to pass this when we can
- // immediately retrieve through xip_image_size().
- // CMO- Very important. Stop freeing buffers, incl wfInline, once
- // these buffers are being passed as parms by slw_build().
- void *buf1=NULL, *buf2=NULL;
- uint32_t sizeBuf1=0, sizeBuf2=0;
- uint32_t rcTmp=1;
- sizeBuf1 = FIXED_RING_BUF_SIZE;
- buf1 = malloc(sizeBuf1);
- if (!buf1) {
- FAPI_ERR("malloc() for ring buffer 1 failed.");
- uint32_t & RC_LOCAL = rcTmp;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_MEMORY_ERROR);
- return rc;
- }
- sizeBuf2 = FIXED_RING_BUF_SIZE;
- buf2 = malloc(sizeBuf2);
- if (!buf2) {
- FAPI_ERR("malloc() for ring buffer 1 failed.");
- uint32_t & RC_LOCAL = rcTmp;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_MEMORY_ERROR);
- free(buf1);
- return rc;
- }
-
-
- // Sanity check.
- if (sizeImageOutMax<i_sizeImageIn) {
- FAPI_ERR("Inp image size (from caller): %i",i_sizeImageIn);
- FAPI_ERR("Max image size (from caller): %i",*io_sizeImageOut);
- uint32_t & DATA_IMG_SIZE_INP = i_sizeImageIn;
- uint32_t & DATA_IMG_SIZE_MAX = *io_sizeImageOut;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_INPUT_IMAGE_SIZE_MESS);
- return rc;
- }
-
- // ==========================================================================
- // Check and copy image to mainstore and clean it up.
- // ==========================================================================
- // ToDo:
- // - Eventually, automate emptying sections in proper order (last section goes first).
- // - For 5/15, assume following order of removal: rings, pibmem0, and halt.
- //
- // First, check supplied size and validation of input EPROM image.
- //
- sbe_xip_image_size((void*)i_imageIn, &sizeImage);
- rcLoc = sbe_xip_validate((void*)i_imageIn, sizeImage);
- if (rcLoc) {
- FAPI_ERR("xip_validate() failed w/rcLoc=%i",rcLoc);
- uint32_t & RC_LOCAL = rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_INTERNAL_IMAGE_ERR);
- return rc;
- }
- if (sizeImage!=i_sizeImageIn) {
- FAPI_ERR("Size obtained from image's header (=%i) differs from supplied size (=%i).",
- sizeImage,i_sizeImageIn);
- uint32_t & DATA_IMG_SIZE_INP = i_sizeImageIn;
- uint32_t & DATA_IMG_SIZE = sizeImage;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_IMAGE_SIZE_MISMATCH);
- return rc;
- }
- FAPI_DBG("Image size (in EPROM): %i",i_sizeImageIn);
-
- // Second, copy input image to supplied mainstore location.
- //
- memcpy( i_imageOut, i_imageIn, i_sizeImageIn);
- sbe_xip_image_size(i_imageOut, &sizeImage);
- rcLoc = sbe_xip_validate(i_imageOut, sizeImage);
- if (rcLoc) {
- FAPI_ERR("xip_validate() failed w/rcLoc=%i",rcLoc);
- uint32_t & RC_LOCAL=rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_MS_INTERNAL_IMAGE_ERR);
- return rc;
- }
- if (sizeImage!=i_sizeImageIn) {
- FAPI_ERR("Size obtained from image's header (=%i) differs from supplied size (=%i).",
- sizeImage,i_sizeImageIn);
- uint32_t & DATA_IMG_SIZE_INP = i_sizeImageIn;
- uint32_t & DATA_IMG_SIZE = sizeImage;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_MS_IMAGE_SIZE_MISMATCH);
- return rc;
- }
-
- // Third, delete .dcrings, .rings and .pibmem0 sections (but keep .halt)
- //
- rcLoc = sbe_xip_delete_section( i_imageOut, SBE_XIP_SECTION_DCRINGS);
- if (rcLoc) {
- FAPI_ERR("xip_delete_section(.dcrings) failed w/rcLoc=%i",rcLoc);
- uint32_t & RC_LOCAL=rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_DELETE_IMAGE_SECTION_ERROR);
- return rc;
- }
- sbe_xip_image_size(i_imageOut, &sizeImage);
- rcLoc = sbe_xip_validate(i_imageOut, sizeImage);
- if (rcLoc) {
- FAPI_ERR("xip_validate() failed w/rcLoc=%i",rcLoc);
- uint32_t & RC_LOCAL=rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_MS_INTERNAL_IMAGE_ERR);
- return rc;
- }
- FAPI_DBG("Image size (after .dcrings delete): %i",sizeImage);
-
- rcLoc = sbe_xip_delete_section( i_imageOut, SBE_XIP_SECTION_RINGS);
- if (rcLoc) {
- FAPI_ERR("xip_delete_section(.rings) failed w/rcLoc=%i",rcLoc);
- uint32_t & RC_LOCAL=rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_DELETE_IMAGE_SECTION_ERROR);
- return rc;
- }
- sbe_xip_image_size(i_imageOut, &sizeImage);
- rcLoc = sbe_xip_validate(i_imageOut, sizeImage);
- if (rcLoc) {
- FAPI_ERR("xip_validate() failed w/rcLoc=%i",rcLoc);
- uint32_t & RC_LOCAL=rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_MS_INTERNAL_IMAGE_ERR);
- return rc;
- }
- FAPI_DBG("Image size (after .rings delete): %i",sizeImage);
-
- rcLoc = sbe_xip_delete_section( i_imageOut, SBE_XIP_SECTION_PIBMEM0);
- if (rcLoc) {
- FAPI_ERR("xip_delete_section(.pibmem0) failed w/rcLoc=%i",rcLoc);
- uint32_t & RC_LOCAL=rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_DELETE_IMAGE_SECTION_ERROR);
- return rc;
- }
- sbe_xip_image_size(i_imageOut, &sizeImage);
- rcLoc = sbe_xip_validate(i_imageOut, sizeImage);
- if (rcLoc) {
- FAPI_ERR("xip_validate() failed w/rcLoc=%i",rcLoc);
- uint32_t & RC_LOCAL=rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_MS_INTERNAL_IMAGE_ERR);
- return rc;
- }
- FAPI_DBG("Image size (after .pibmem0 delete): %i",sizeImage);
-
- //
- // DD level.
- //
- rc = FAPI_ATTR_GET_PRIVILEGED(ATTR_EC, &i_target, l_uint8);
- ddLevel = (uint32_t)l_uint8;
- if (rc) {
- FAPI_ERR("FAPI_ATTR_GET_PRIVILEGED() failed w/rc=%i and ddLevel=0x%02x",(uint32_t)rc,l_uint8);
- return rc;
- }
-
-
-#ifndef IMGBUILD_PPD_IGNORE_XIPC
- // ==========================================================================
- // Get various FAPI attributes and variables needed for ring unraveling.
- // ==========================================================================
- uint8_t attrAsyncSafeMode=0, bAsyncSafeMode;
- uint32_t attrFuncL3RingList[MAX_FUNC_L3_RING_LIST_ENTRIES]={0};
- uint8_t attrFuncL3RingData[MAX_FUNC_L3_RING_SIZE]={0};
- uint32_t attrFuncL3RingLength=0;
- SbeXipItem xipTocItem;
- uint64_t xipFuncL3RingVector=0;
- uint32_t iEntry;
-
- // Safe mode status.
- //
- rc = FAPI_ATTR_GET(ATTR_PROC_FABRIC_ASYNC_SAFE_MODE, NULL, attrAsyncSafeMode);
- FAPI_DBG("--> attrAsyncSafeMode = 0x%x ",attrAsyncSafeMode);
- if (rc) {
- FAPI_ERR("FAPI_ATTR_GET(ATTR_PROC_FABRIC_ASYNC_SAFE_MODE) returned error.");
- return rc;
- }
- bAsyncSafeMode = attrAsyncSafeMode;
- FAPI_DBG("--> bAsyncSafeMode = 0x%x ",bAsyncSafeMode);
-
- // Obtain ex_func_l3_ring overlay data and length from attributes.
- // Obtain ring name and ring's vector location from image.
- //
- FAPI_DBG("--> (1) Check if we should modify the ex_func_l3_ring with attribute data.");
- if (!bAsyncSafeMode) {
- FAPI_DBG("--> (1) Yes, we should modify the ex_func_l3_ring with attribute data.");
- // Get overlay ring from attributes.
- rc = FAPI_ATTR_GET(ATTR_PROC_EX_FUNC_L3_DELTA_DATA, &i_target, attrFuncL3RingList);
- if (rc) {
- FAPI_ERR("FAPI_ATTR_GET(ATTR_PROC_EX_FUNC_L3_DELTA_DATA) returned error.");
- return rc;
- }
- rc = FAPI_ATTR_GET(ATTR_PROC_EX_FUNC_L3_LENGTH, &i_target, attrFuncL3RingLength);
- if (rc) {
- FAPI_ERR("FAPI_ATTR_GET(ATTR_PROC_EX_FUNC_L3_LENGTH) returned error.");
- return rc;
- }
- //attrFuncL3RingLength = 0xBEBA;
- for (iEntry=0; iEntry<MAX_FUNC_L3_RING_LIST_ENTRIES; iEntry++) {
- if (attrFuncL3RingList[iEntry]!=0xffff0000) {
- attrFuncL3RingData[attrFuncL3RingList[iEntry]>>16] = (uint8_t)((attrFuncL3RingList[iEntry]<<24)>>24);
- }
- else
- break;
- }
- FAPI_DBG("Overlay [raw] ring created for func L3 ring.");
- // Get ring name from xip image.
- rcLoc = sbe_xip_find((void*)i_imageIn, FUNC_L3_RING_TOC_NAME, &xipTocItem);
- if (rcLoc) {
- FAPI_ERR("sbe_xip_find() failed w/rc=%i", rcLoc);
- FAPI_ERR("Probable cause:");
- FAPI_ERR("\tThe keyword (=%s) was not found.", FUNC_L3_RING_TOC_NAME);
- uint32_t & RC_LOCAL = rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_KEYWORD_NOT_FOUND_ERROR);
- return rc;
- }
- xipFuncL3RingVector = xipTocItem.iv_address;
- }
-#endif
-
-
- /***************************************************************************
- * SEARCH LOOP - Begin *
- ***************************************************************************/
- do {
-
- FAPI_DBG("nextRing (at top)=0x%016llx",(uint64_t)nextRing);
-
-
- // ==========================================================================
- // Get ring layout from image
- // ==========================================================================
- FAPI_DBG("--> Reading RS4 delta ring info from SBE-XIP Image.");
- rcLoc = get_ring_layout_from_image( i_imageIn,
- ddLevel,
- sysPhase,
- &rs4RingLayout,
- &nextRing);
- rcSearch = rcLoc;
- if (rcSearch!=DSLWB_RING_SEARCH_MATCH &&
- rcSearch!=DSLWB_RING_SEARCH_EXHAUST_MATCH &&
- rcSearch!=DSLWB_RING_SEARCH_NO_MATCH) {
- FAPI_ERR("\tGetting delta ring from image was unsuccessful (rcSearch=%i).",rcSearch);
- FAPI_ERR("\tNo wiggle-flip programs will be stored in .rings section.");
- FAPI_ERR("\tThe following ELF sections have been emptied: .rings, .pibmem0, .ipl_text.");
- uint32_t & RC_LOCAL=rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_RING_RETRIEVAL_ERROR);
- return rc;
- }
- if (rcSearch==DSLWB_RING_SEARCH_MATCH ||
- rcSearch==DSLWB_RING_SEARCH_EXHAUST_MATCH)
- FAPI_DBG("\tRetrieving RS4 delta ring was successful.");
-
- // Check if we're done at this point.
- //
- if (rcSearch==DSLWB_RING_SEARCH_NO_MATCH) {
- FAPI_INF("Wiggle-flip programming done.");
- FAPI_INF("Number of wf programs appended: %i", countWF);
- if (countWF==0)
- FAPI_INF("ZERO WF programs appended to .rings section.");
-#ifndef IMGBUILD_PPD_IGNORE_XIPC
- // Do various customizations to image.
- if (!buf1 || !buf2) {
- FAPI_ERR("The [assumed] pre-allocated ring buffers, buf1/2, do not exist.\n");
- uint32_t & RC_LOCAL = rcTmp;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_MEMORY_ERROR);
- return rc;
- }
- sizeImageTmp = sizeImageOutMax;
- FAPI_INF("Calling xip_customize().\n");
- FAPI_EXEC_HWP(rc, p8_xip_customize,
- i_target,
- (void*)i_imageIn,
- i_imageOut,
- sizeImageTmp,
- sysPhase,
- 2, // We're only interested in SRAM mode for non-fixed img.
- buf1,
- sizeBuf1,
- buf2,
- sizeBuf2,
- bootCoreMask);
- free(buf1);
- free(buf2);
- buf1 = buf2 = NULL;
- if (rc!=FAPI_RC_SUCCESS) {
- FAPI_ERR("Xip customization failed.");
- return rc;
- }
- FAPI_INF("Xip customization done.");
-#else
- // Initialize .slw section with PORE table.
- sizeImageTmp = sizeImageOutMax;
- rcLoc = initialize_slw_section( i_imageOut,
- &sizeImageTmp);
- if (rcLoc) {
- if (rcLoc==IMGBUILD_ERR_IMAGE_TOO_LARGE) {
- uint32_t & DATA_IMG_SIZE_OLD=sizeImageOld;
- uint32_t & DATA_IMG_SIZE_EST=sizeImageTmp;
- uint32_t & DATA_IMG_SIZE_MAX=sizeImageOutMax;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_MAX_IMAGE_SIZE_EXCEEDED);
- }
- else {
- uint32_t & RC_LOCAL=rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_APPEND_SLW_SECTION_ERROR);
- }
- return rc;
- }
- FAPI_INF("SLW section allocated for Ramming and Scomming tables.");
-#endif
-
- // Update host_runtime_scom pointer to point to sub_slw_runtime_scom
- rcLoc = update_runtime_scom_pointer( i_imageOut);
- if (rcLoc==IMGBUILD_ERR_KEYWORD_NOT_FOUND) {
- uint32_t &RC_LOCAL=rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_KEYWORD_NOT_FOUND_ERROR);
- return rc;
- }
- // Report final size.
- sbe_xip_image_size( i_imageOut, io_sizeImageOut);
- FAPI_INF("Final SLW image size: %i", *io_sizeImageOut);
- return FAPI_RC_SUCCESS;
- }
-
- deltaRingRS4 = (CompressedScanData*)rs4RingLayout.rs4Delta;
-
- FAPI_DBG("Dumping ring layout:");
- FAPI_DBG("\tentryOffset = %i",(uint32_t)myRev64(rs4RingLayout.entryOffset));
- FAPI_DBG("\tbackItemPtr = 0x%016llx",myRev64(rs4RingLayout.backItemPtr));
- FAPI_DBG("\tsizeOfThis = %i",myRev32(rs4RingLayout.sizeOfThis));
- FAPI_DBG("\tsizeOfMeta = %i",myRev32(rs4RingLayout.sizeOfMeta));
- FAPI_DBG("\tddLevel = %i",myRev32(rs4RingLayout.ddLevel));
- FAPI_DBG("\tsysPhase = %i",rs4RingLayout.sysPhase);
- FAPI_DBG("\toverride = %i",rs4RingLayout.override);
- FAPI_DBG("\treserved1+2 = %i",rs4RingLayout.reserved1|rs4RingLayout.reserved2);
- FAPI_DBG("\tRS4 magic # = 0x%08x",myRev32(deltaRingRS4->iv_magic));
- FAPI_DBG("\tRS4 total size = %i",myRev32(deltaRingRS4->iv_size));
- FAPI_DBG("\tUnXed data size = %i",myRev32(deltaRingRS4->iv_length));
- FAPI_DBG("\tScan select = 0x%08x",myRev32(deltaRingRS4->iv_scanSelect));
- FAPI_DBG("\tHeader version = 0x%02x",deltaRingRS4->iv_headerVersion);
- FAPI_DBG("\tFlush optimize = 0x%02x (reverse of override)",deltaRingRS4->iv_flushOptimization);
- FAPI_DBG("\tRing ID = 0x%02x",deltaRingRS4->iv_ringId);
- FAPI_DBG("\tChiplet ID = 0x%02x",deltaRingRS4->iv_chipletId);
- FAPI_DBG("Dumping meta data:");
- FAPI_DBG("\tsizeOfData = %i",myRev32(rs4RingLayout.sizeOfMeta));
- FAPI_DBG("\tMeta data = ");
- for (i=0; i<myRev32(rs4RingLayout.sizeOfMeta); i++) { // String may not be null terminated.
- FAPI_DBG("%c",rs4RingLayout.metaData[i]);
- }
-
-
- // ==========================================================================
- // Decompress RS4 delta state.
- // ==========================================================================
- FAPI_DBG("--> Decompressing RS4 delta ring.");
- rcLoc = _rs4_decompress((uint8_t*)buf2,
- sizeBuf2,
- &ringBitLen,
- deltaRingRS4);
- if (rcLoc) {
- FAPI_ERR("\t_rs4_decompress() failed: rc=%i",rcLoc);
- if (buf2) free(buf2);
- uint32_t & RC_LOCAL=rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_RS4_DECOMPRESSION_ERROR);
- return rc;
- }
- FAPI_DBG("\tDecompression successful.\n");
-
-
-#ifndef IMGBUILD_PPD_IGNORE_XIPC
- // ==========================================================================
- // CUSTOMIZE item: Overlay ex_func_l3_ring.
- // Retrieval method: Attribute.
- // Note: Check if ex_func_l3_ring's vector address matches current backPtr.
- // If so, perform OR operation with new attribute data for this ring.
- // Assumptions:
- // - Base ring only.
- // - Correct DD level rings only.
- // ==========================================================================
- uint8_t byteExisting=0, byteOverlay=0, bGoodByte=1;
- uint32_t iByte, sizeRingInBytes;
- FAPI_DBG("--> (2) Check if we should modify the ex_func_l3_ring with attribute data.");
- if (!bAsyncSafeMode) {
- FAPI_DBG("--> (2) Yes, we should modify the ex_func_l3_ring with attribute data.");
- // Find ring match by comparing backItemPtr and ring lengths. Note that
- // we can't use fwdPtr for finding a match since we don't know which DD
- // level ring it ended up pointing at.
- if (xipFuncL3RingVector==myRev64(rs4RingLayout.backItemPtr) &&
- attrFuncL3RingLength==myRev32(deltaRingRS4->iv_length)) {
- // Perform OR between the existing ring and attribute ring.
- sizeRingInBytes = (attrFuncL3RingLength-1)/8 + 1;
- bGoodByte = 1;
-//// FAPI_DBG("Byte[ # ]: ER OR FR ");
- FAPI_DBG("Byte[ # ]: ER OR =ER? ");
- FAPI_DBG("-----------------------");
- for (iByte=0; (iByte<sizeRingInBytes && bGoodByte); iByte++) {
-//// FAPI_DBG("Byte[%4i]: %02x ",
-//// iByte,
-//// *((uint8_t*)buf2+iByte));
- if (*(attrFuncL3RingData+iByte)) {
- // Check there are 0-bits in the existing byte where there are
- // 1-bits in the overlay byte.
- byteExisting = *((uint8_t*)buf2+iByte);
- byteOverlay = *(&attrFuncL3RingData[0]+iByte);
- if (byteExisting!=(byteExisting & ~byteOverlay)) {
- FAPI_ERR("Byte[%4i]: %02x %02x %02x <-violation",iByte,byteExisting,byteOverlay,byteExisting&~byteOverlay);
- bGoodByte = 0;
- break;
- }
- else {
- FAPI_DBG("Byte[%4i]: %02x %02x %02x ",iByte,byteExisting,byteOverlay,byteExisting&~byteOverlay);
- }
- // Only update existing ring when there's content in overlay data.
-//// FAPI_DBG("Byte[%4i]: %02x %02x %02x ",
-//// iByte,
-//// *((uint8_t*)buf2+iByte),
-//// *(&attrFuncL3RingData[0]+iByte),
-//// *((uint8_t*)buf2+iByte) | *(&attrFuncL3RingData[0]+iByte));
- *((uint8_t*)buf2+iByte) = byteExisting | byteOverlay;
-//// FAPI_DBG("Byte[%4i]: %02x ",
-//// iByte,
-//// *((uint8_t*)buf2+iByte));
- }
-//// FAPI_DBG("Byte[%4i]: %02x ",
-//// iByte,
-//// *((uint8_t*)buf2+iByte));
- }
- FAPI_DBG("-----------------------");
- if (!bGoodByte) {
- FAPI_ERR("The existing ex_l3_func_ring has 1-bits in overlay locations. ");
- if (buf2) free(buf2);
- uint32_t & DATA_FAIL_BYTE_NO = iByte;
- uint8_t & DATA_EXISTING_RING_BYTE = byteExisting;
- uint8_t & DATA_OVERLAY_RING_BYTE = byteOverlay;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_L3_FUNC_OVERLAY_ERROR);
- return rc;
- }
- }
- }
-#endif
-
-
- // ==========================================================================
- // Create Wiggle-Flip Programs (but first resolve max rotate status.)
- // ==========================================================================
- FAPI_DBG("--> Creating Wiggle-Flip Program.");
- rcLoc = sbe_xip_get_scalar( (void*)i_imageIn, SCAN_MAX_ROTATE_38XXX_NAME, &scanMaxRotate);
- if (rcLoc) {
- FAPI_INF("WARNING: sbe_xip_get_scalar() failed...but we might wing it.");
- if (rcLoc==SBE_XIP_ITEM_NOT_FOUND) {
- FAPI_INF("Probable cause:");
- FAPI_INF("\tThe key word in SCAN_MAX_ROTATE_38XXX_NAME does not exist the TOC.");
- scanMaxRotate = SCAN_ROTATE_DEFAULT;
- FAPI_INF("\tscanMaxRotate set to 0x%llx", scanMaxRotate);
- FAPI_INF("Continuing...");
- }
- else {
- FAPI_ERR("ERROR: Nope, couldn't wing it.");
- if (buf2) free(buf2);
- uint32_t & RC_LOCAL=rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_UNKNOWN_XIP_ERROR);
- return rc;
- }
- }
- if (scanMaxRotate<0x20 || scanMaxRotate>SCAN_MAX_ROTATE) {
- FAPI_INF("WARNING: Value of key word SCAN_MAX_ROTATE_38XXX_NAME=0x%llx is not permitted.\n",scanMaxRotate);
- scanMaxRotate = SCAN_ROTATE_DEFAULT;
- FAPI_INF("\tscanMaxRotate set to 0x%llx\n", scanMaxRotate);
- FAPI_INF("Continuing...\n");
- }
-
- // Support for enforcing delay after WF scan write scoms.
- uint64_t waitsScanDelay=10;
- rcLoc = sbe_xip_get_scalar( (void*)i_imageIn, "waits_delay_for_scan", &waitsScanDelay);
- if (rcLoc) {
- FAPI_ERR("Error obtaining waits_delay_for_scan keyword.\n");
- if (buf2) free(buf2);
- uint32_t & RC_LOCAL=rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_UNKNOWN_XIP_ERROR);
- return rc;
- }
-
- wfInline = (uint32_t*)buf1;
- wfInlineLenInWords = sizeBuf1/4;
- rcLoc = create_wiggle_flip_prg( (uint32_t*)buf2,
- ringBitLen,
- myRev32(deltaRingRS4->iv_scanSelect),
- (uint32_t)deltaRingRS4->iv_chipletId,
- &wfInline,
- &wfInlineLenInWords,
- deltaRingRS4->iv_flushOptimization,
- (uint32_t)scanMaxRotate,
- (uint32_t)waitsScanDelay);
- if (rcLoc) {
- FAPI_ERR("create_wiggle_flip_prg() failed w/rcLoc=%i",rcLoc);
- //if (deltaRingDxed) free(deltaRingDxed);
- if (buf1) free(buf1);
- if (buf2) free(buf2);
- uint32_t & RC_LOCAL=rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_WF_CREATION_ERROR);
- return rc;
- }
- FAPI_DBG("\tWiggle-flip programming successful.");
-
-
- // ==========================================================================
- // Append Wiggle-Flip programs to .rings section.
- // ==========================================================================
- FAPI_DBG("--> Appending wiggle-flip and layout header to .rings section.");
- sizeImageTmp = sizeImageOutMax;
- rcLoc = write_wiggle_flip_to_image( i_imageOut,
- &sizeImageTmp,
- &rs4RingLayout,
- wfInline,
- wfInlineLenInWords);
- if (rcLoc) {
- FAPI_ERR("write_wiggle_flip_to_image() failed w/rcLoc=%i",rcLoc);
- //if (deltaRingDxed) free(deltaRingDxed);
- if (buf1) free(buf1);
- if (buf2) free(buf2);
- if (rcLoc==IMGBUILD_ERR_IMAGE_TOO_LARGE) {
- uint32_t & DATA_IMG_SIZE_OLD=sizeImageOld;
- uint32_t & DATA_IMG_SIZE_EST=sizeImageTmp;
- uint32_t & DATA_IMG_SIZE_MAX=sizeImageOutMax;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_MAX_IMAGE_SIZE_EXCEEDED);
- }
- else {
- uint32_t & RC_LOCAL=rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_IMAGE_UPDATE_ERROR);
- }
- return rc;
- }
- FAPI_DBG("\tUpdating image w/wiggle-flip program + header was successful.");
-
- // Update some variables for debugging and error reporting.
- sizeImageOld = sizeImageTmp;
- countWF++;
-
- // ==========================================================================
- // Are we done?
- // ==========================================================================
- if (rcSearch==DSLWB_RING_SEARCH_EXHAUST_MATCH) {
- FAPI_INF("Wiggle-flip programming done.");
- FAPI_INF("Number of wf programs appended: %i", countWF);
- if (countWF==0)
- FAPI_INF("ZERO WF programs appended to .rings section.");
-#ifndef IMGBUILD_PPD_IGNORE_XIPC
- // Do various customizations to image.
- if (!buf1 || !buf2) {
- FAPI_ERR("The [assumed] pre-allocated ring buffers, buf1/2, do not exist.\n");
- uint32_t & RC_LOCAL = rcTmp;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_MEMORY_ERROR);
- return rc;
- }
- sizeImageTmp = sizeImageOutMax;
- FAPI_INF("Calling xip_customize().\n");
- FAPI_EXEC_HWP(rc, p8_xip_customize,
- i_target,
- (void*)i_imageIn,
- i_imageOut,
- sizeImageTmp,
- sysPhase,
- 2, // We're only interested in SRAM mode for non-fixed img.
- buf1,
- sizeBuf1,
- buf2,
- sizeBuf2,
- bootCoreMask);
- free(buf1);
- free(buf2);
- buf1 = buf2 = NULL;
- if (rc!=FAPI_RC_SUCCESS) {
- FAPI_ERR("Xip customization failed.");
- return rc;
- }
- FAPI_INF("Xip customization done.");
-#else
- // Initialize .slw section with PORE table.
- sizeImageTmp = sizeImageOutMax;
- rcLoc = initialize_slw_section( i_imageOut,
- &sizeImageTmp);
- if (rcLoc) {
- if (rcLoc==IMGBUILD_ERR_IMAGE_TOO_LARGE) {
- uint32_t & DATA_IMG_SIZE_OLD=sizeImageOld;
- uint32_t & DATA_IMG_SIZE_EST=sizeImageTmp;
- uint32_t & DATA_IMG_SIZE_MAX=sizeImageOutMax;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_MAX_IMAGE_SIZE_EXCEEDED);
- }
- else {
- uint32_t & RC_LOCAL=rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_APPEND_SLW_SECTION_ERROR);
- }
- return rc;
- }
- FAPI_INF("SLW section initialized for Ramming and Scomming tables.");
-#endif
-
- // Update host_runtime_scom pointer to point to sub_slw_runtime_scom
- rcLoc = update_runtime_scom_pointer(i_imageOut);
- if (rcLoc==IMGBUILD_ERR_KEYWORD_NOT_FOUND) {
- uint32_t &RC_LOCAL=rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_KEYWORD_NOT_FOUND_ERROR);
- return rc;
- }
-
- // Report final size.
- sbe_xip_image_size( i_imageOut, io_sizeImageOut);
- FAPI_INF("Final SLW image size: %i", *io_sizeImageOut);
- return FAPI_RC_SUCCESS;
- }
-
- FAPI_DBG("nextRing (at bottom)=0x%016llx",(uint64_t)nextRing);
-
- } while (nextRing!=NULL);
- /***************************************************************************
- * SEARCH LOOP - End *
- ***************************************************************************/
-
- FAPI_ERR("Shouldn't be in this code section. Check code.");
- rcLoc = IMGBUILD_ERR_CHECK_CODE;
- uint32_t & RC_LOCAL=rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_UNKNOWN_ERROR);
- return rc;
-
-}
-
-} // End of extern C
diff --git a/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_slw_build.H b/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_slw_build.H
index 831c51d46..3e202686e 100644
--- a/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_slw_build.H
+++ b/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_slw_build.H
@@ -20,35 +20,36 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: p8_slw_build.H,v 1.4 2013/02/12 23:25:58 cmolsen Exp $
+
+// $Id: p8_slw_build.H,v 1.4 2013-02-12 23:25:58 cmolsen Exp $
#include <fapi.H>
#include <p8_scan_compression.H>
typedef fapi::ReturnCode (*p8_slw_build_FP_t) ( const fapi::Target&,
- const void*,
- uint32_t,
- void*,
- uint32_t*);
+ const void*,
+ uint32_t,
+ void*,
+ uint32_t*);
typedef fapi::ReturnCode (*p8_slw_build_fixed_FP_t) ( const fapi::Target&,
- void*,
- void*,
- uint32_t&,
- const uint8_t,
- void*,
- const uint32_t,
- void*,
- const uint32_t );
+ void*,
+ void*,
+ uint32_t&,
+ const uint8_t,
+ void*,
+ const uint32_t,
+ void*,
+ const uint32_t );
typedef fapi::ReturnCode (*p8_slw_repair_FP_t) (const fapi::Target&,
- void*,
- CompressedScanData*,
- void*,
- const uint32_t,
- void*,
- const uint32_t);
+ void*,
+ CompressedScanData*,
+ void*,
+ const uint32_t,
+ void*,
+ const uint32_t);
extern "C"
@@ -63,11 +64,11 @@ extern "C"
// mainstore.
// *io_sizeImageOut: On input, upper limit of size of output
// image. On output, final size of output image.
- fapi::ReturnCode p8_slw_build( const fapi::Target &i_target,
- const void *i_imageIn,
- uint32_t i_sizeImageIn,
- void *i_imageOut,
- uint32_t *io_sizeImageOut);
+ fapi::ReturnCode p8_slw_build( const fapi::Target &i_target,
+ const void *i_imageIn,
+ uint32_t i_sizeImageIn,
+ void *i_imageOut,
+ uint32_t *io_sizeImageOut);
// Description: FAPI HWP entry point. p8_slw_build_fixed() constructs the
@@ -86,15 +87,15 @@ extern "C"
// *i_buf2: Temp buffer 2 for WF ring. (Caller
// allocs/frees.)
// i_sizeBuf2: Size of buf2.
- fapi::ReturnCode p8_slw_build_fixed( const fapi::Target &i_target,
- void *i_imageIn,
- void *i_imageOut,
- uint32_t &io_sizeImageOut,
- const uint8_t i_modeBuild,
- void *i_buf1,
- const uint32_t i_sizeBuf1,
- void *i_buf2,
- const uint32_t i_sizeBuf2 );
+ fapi::ReturnCode p8_slw_build_fixed( const fapi::Target &i_target,
+ void *i_imageIn,
+ void *i_imageOut,
+ uint32_t &io_sizeImageOut,
+ const uint8_t i_modeBuild,
+ void *i_buf1,
+ const uint32_t i_sizeBuf1,
+ void *i_buf2,
+ const uint32_t i_sizeBuf2 );
// Description: FAPI HWP entry point. p8_slw_repair() updates the L2 (core)
@@ -108,12 +109,12 @@ extern "C"
// *i_buf2: Temp buffer 2 for WF ring. (Caller
// allocs/frees.)
// i_sizeBuf2: Size of buf2.
- fapi::ReturnCode p8_slw_repair( const fapi::Target &i_target,
- void *io_image,
- CompressedScanData *i_bufRs4,
- void *i_buf1,
- const uint32_t i_sizeBuf1,
- void *i_buf2,
- const uint32_t i_sizeBuf2);
+ fapi::ReturnCode p8_slw_repair( const fapi::Target &i_target,
+ void *io_image,
+ CompressedScanData *i_bufRs4,
+ void *i_buf1,
+ const uint32_t i_sizeBuf1,
+ void *i_buf2,
+ const uint32_t i_sizeBuf2);
}
diff --git a/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_slw_build_errors.xml b/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_slw_build_errors.xml
index 5acb92c56..5748ef689 100644
--- a/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_slw_build_errors.xml
+++ b/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_slw_build_errors.xml
@@ -20,6 +20,7 @@
<!-- Origin: 30 -->
<!-- -->
<!-- IBM_PROLOG_END_TAG -->
+<!-- $Id: p8_slw_build_errors.xml,v 1.8 2013-04-23 22:47:26 wenning Exp $ -->
<!-- Error definitions for proc_slw_build procedure -->
<hwpErrors>
<!-- *********************************************************************** -->
@@ -31,8 +32,15 @@
</hwpError>
<!-- *********************************************************************** -->
<hwpError>
+ <rc>RC_PROC_SLWB_IMG_PTR_ERROR</rc>
+ <description>Supplied image ptrs are the same. This is not allowed.</description>
+ <ffdc>DATA_BUF1_PTR</ffdc>
+ <ffdc>DATA_BUF2_PTR</ffdc>
+ </hwpError>
+ <!-- *********************************************************************** -->
+ <hwpError>
<rc>RC_PROC_SLWB_BUF_PTR_ERROR</rc>
- <description>Supplied buffer(s) is invalid.</description>
+ <description>Supplied buffer(s) is invalid. Either it (they) does not exist or they are the same. This is not allowed.</description>
<ffdc>DATA_BUF1_PTR</ffdc>
<ffdc>DATA_BUF2_PTR</ffdc>
</hwpError>
diff --git a/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_slw_build_fixed.C b/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_slw_build_fixed.C
new file mode 100644
index 000000000..721756a91
--- /dev/null
+++ b/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_slw_build_fixed.C
@@ -0,0 +1,768 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_slw_build_fixed.C $ */
+/* */
+/* IBM CONFIDENTIAL */
+/* */
+/* COPYRIGHT International Business Machines Corp. 2013 */
+/* */
+/* p1 */
+/* */
+/* Object Code Only (OCO) source materials */
+/* Licensed Internal Code Source Materials */
+/* IBM HostBoot Licensed Internal Code */
+/* */
+/* The source code for this program is not published or otherwise */
+/* divested of its trade secrets, irrespective of what has been */
+/* deposited with the U.S. Copyright Office. */
+/* */
+/* Origin: 30 */
+/* */
+/* IBM_PROLOG_END_TAG */
+// $Id: p8_slw_build_fixed.C,v 1.16 2013/07/25 15:50:47 dcrowell Exp $
+/*------------------------------------------------------------------------------*/
+/* *! TITLE : p8_slw_build_fixed */
+/* *! DESCRIPTION : Extracts and decompresses delta ring states from EPROM */
+// image. Utilizes the linked list approach (LLA) to extract
+// and position wiggle-flip programs in .rings according to
+// back pointer, DD level, phase and override settings.
+/* *! OWNER NAME : Michael Olsen cmolsen@us.ibm.com */
+//
+/* *! EXTENDED DESCRIPTION : */
+//
+/* *! USAGE : To build (for Hostboot) - */
+// buildfapiprcd -C "p8_image_help.C,p8_image_help_base.C,p8_scan_compression.C" -c "sbe_xip_image.c,pore_inline_assembler.c" -e "../../xml/error_info/p8_slw_build_errors.xml" p8_slw_build_fixed.C
+// To build (for command-line) -
+// buildfapiprcd -r ver-13-0 -C "p8_image_help.C,p8_image_help_base.C,p8_scan_compression.C" -c "sbe_xip_image.c,pore_inline_assembler.c" -e "../../xml/error_info/p8_slw_build_errors.xml" -u "SLW_COMMAND_LINE,IMGBUILD_PPD_IGNORE_XIPC" p8_slw_build_fixed.C
+// Other Pre-Processor Directive (PPD) options -
+// To add worst-case PIB access to wf programs:
+// -u "IMGBUILD_PPD_WF_WORST_CASE_PIB"
+// To add polling protocol to wf programs:
+// -u "IMGBUILD_PPD_WF_POLLING_PROT"
+// To NOT run xip_customize:
+// -u "IMGBUILD_PPD_IGNORE_XIPC"
+//
+/* *! ASSUMPTIONS : */
+//
+/* *! COMMENTS : */
+// - All image content, incl .rings content and ring layout, is handled
+// in BE format. No matter which platform.
+// - A ring may only be requested with the sysPhase=0 or 1. Any other
+// sysPhase value, incl sysPhase=2, will cause no rings to be found.
+// - io_sizeImageOut may only change value for SRAM mode 2. For modes 0 and 1,
+// it should be the agreed upon fixed SLW image size of 1MB.
+//
+/*------------------------------------------------------------------------------*/
+
+#include <p8_pore_api_custom.h>
+#include <p8_slw_build.H>
+#include <p8_xip_customize.H>
+#include <p8_delta_scan_rw.h>
+#include <p8_pore_table_gen_api.H>
+
+extern "C" {
+
+using namespace fapi;
+
+// Parameter list:
+// fapi::Target &i_target: Hardware target
+// void *i_imageIn: Pointer to memory mapped input Reference PNOR image
+// void *i_imageOut: Pointer to where to put SLW mainstore image
+// uint32_t &io_sizeImageOut: In: Max size of outp img. Out: Final size of outp img.
+// On input, this MUST be equal to FIXED_SLW_IMAGE_SIZE for
+// i_modeBuild={0,1}.
+// uint8_t i_modeBuild: 0: HB/IPL mode, 1: PHYP/Rebuild mode, 2: SRAM mode.
+// void *i_buf1: Temp buffer 1 for dexed RS4 ring. (Caller allocs/frees.)
+// uint32_t i_sizeBuf1: Size of buf1.
+// This MUST be equal to FIXED_RING_BUF_SIZE.
+// void *i_buf2: Temp buffer 2 for WF ring. (Caller allocs/frees.)
+// uint32_t i_sizeBuf22 Size of buf2.
+// This MUST be equal to FIXED_RING_BUF_SIZE.
+//
+ReturnCode p8_slw_build_fixed( const fapi::Target &i_target,
+ void *i_imageIn,
+ void *i_imageOut,
+ uint32_t &io_sizeImageOut,
+ const uint8_t i_modeBuild,
+ void *i_buf1,
+ const uint32_t i_sizeBuf1,
+ void *i_buf2,
+ const uint32_t i_sizeBuf2 )
+{
+ ReturnCode rc;
+ uint8_t l_uint8=0;
+ uint8_t bSearchDone=0;
+ uint32_t ddLevel=0;
+ uint8_t sysPhase=1; // SLW image build phase.
+ uint32_t rcLoc=0, rcSearch=0, i, countWF=0;
+ uint32_t sizeImage=0, sizeImageIn=0, sizeImageOutMax, sizeImageTmp, sizeImageOld;
+ CompressedScanData *deltaRingRS4=NULL;
+ DeltaRingLayout rs4RingLayout;
+ void *nextRing=NULL;
+ uint32_t ringBitLen=0;
+ uint32_t *wfInline=NULL;
+ uint32_t wfInlineLenInWords;
+ uint64_t scanMaxRotate=SCAN_ROTATE_DEFAULT;
+ uint32_t dataTmp1, dataTmp2, dataTmp3;
+ uint64_t ptrTmp1, ptrTmp2;
+ uint32_t bufLC;
+ uint32_t bootCoreMask=0x000FFFF;
+
+ // Sanity checks on buffers and image.
+ // - validate image.
+ // - do pre-allocated buffers exist?
+ // - are pre-allocated buffers the correct size?
+ // - is supplied output image size the correct size?
+ // - is input image smaller than the output image size?
+ // - is modeBuild valid?
+ //
+ sbe_xip_image_size((void*)i_imageIn, &sizeImageIn);
+ rcLoc = sbe_xip_validate((void*)i_imageIn, sizeImageIn);
+ if (rcLoc) {
+ FAPI_ERR("xip_validate() failed w/rcLoc=%i",rcLoc);
+ uint32_t & RC_LOCAL = rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_INTERNAL_IMAGE_ERR);
+ return rc;
+ }
+ if (i_imageOut==i_imageIn) {
+ FAPI_ERR("The images, imageIn and imageOut, point to the same buffer space.");
+ ptrTmp1 = (uint64_t)i_imageIn;
+ ptrTmp2 = (uint64_t)i_imageOut;
+ uint64_t & DATA_BUF1_PTR = ptrTmp1;
+ uint64_t & DATA_BUF2_PTR = ptrTmp2;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_IMG_PTR_ERROR);
+ return rc;
+ }
+ sizeImageOutMax = io_sizeImageOut; // This should be 1MB for mode 0 and 1.
+ FAPI_DBG("Mode build = %i\n",i_modeBuild);
+ if ((i_modeBuild==P8_SLW_MODEBUILD_IPL ||
+ i_modeBuild==P8_SLW_MODEBUILD_REBUILD) &&
+ sizeImageOutMax!=FIXED_SLW_IMAGE_SIZE) {
+ FAPI_ERR("Supplied output image size differs from agreed upon fixed SLW image size.");
+ FAPI_ERR("Supplied output image size: %i",sizeImageOutMax);
+ FAPI_ERR("Agreed upon fixed SLW image size: %i",FIXED_SLW_IMAGE_SIZE);
+ dataTmp1 = FIXED_SLW_IMAGE_SIZE;
+ uint32_t & DATA_IMG_SIZE_MAX = sizeImageOutMax;
+ uint32_t & DATA_IMG_SIZE_FIXED = dataTmp1;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_IMAGE_SIZE_NOT_FIXED);
+ return rc;
+ }
+ if ((i_modeBuild==P8_SLW_MODEBUILD_IPL ||
+ i_modeBuild==P8_SLW_MODEBUILD_REBUILD) &&
+ sizeImageIn>sizeImageOutMax) {
+ FAPI_ERR("Input image size exceeds fixed output image size.");
+ FAPI_ERR("Size of supplied input image: %i",sizeImageIn);
+ FAPI_ERR("Supplied output image size: %i",sizeImageOutMax);
+ uint32_t & DATA_IMG_SIZE_INP = sizeImageIn;
+ uint32_t & DATA_IMG_SIZE_MAX = sizeImageOutMax;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_INPUT_IMAGE_SIZE_MESS);
+ return rc;
+ }
+ if (!i_buf1 || !i_buf2) {
+ FAPI_ERR("The [assumed] pre-allocated ring buffers, i_buf1/2, do not exist.");
+ ptrTmp1 = (uint64_t)i_buf1;
+ ptrTmp2 = (uint64_t)i_buf2;
+ uint64_t & DATA_BUF1_PTR = ptrTmp1;
+ uint64_t & DATA_BUF2_PTR = ptrTmp2;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_BUF_PTR_ERROR);
+ return rc;
+ }
+ if (i_buf1==i_buf2) {
+ FAPI_ERR("The buffers, buf1 and buf2, point to the same buffer space.");
+ ptrTmp1 = (uint64_t)i_buf1;
+ ptrTmp2 = (uint64_t)i_buf2;
+ uint64_t & DATA_BUF1_PTR = ptrTmp1;
+ uint64_t & DATA_BUF2_PTR = ptrTmp2;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_BUF_PTR_ERROR);
+ return rc;
+ }
+ if (i_sizeBuf1!=FIXED_RING_BUF_SIZE || i_sizeBuf2!=FIXED_RING_BUF_SIZE) {
+ FAPI_ERR("Supplied ring buffer size(s) differs from agreed upon fixed size.");
+ FAPI_ERR("Supplied ring buf1 size: %i",i_sizeBuf1);
+ FAPI_ERR("Supplied ring buf2 size: %i",i_sizeBuf2);
+ FAPI_ERR("Agreed upon fixed ring buf size: %i",FIXED_RING_BUF_SIZE);
+ dataTmp1 = i_sizeBuf1;
+ dataTmp2 = i_sizeBuf2;
+ dataTmp3 = FIXED_RING_BUF_SIZE;
+ uint32_t & DATA_BUF1_SIZE = dataTmp1;
+ uint32_t & DATA_BUF2_SIZE = dataTmp2;
+ uint32_t & DATA_BUF_SIZE_FIXED = dataTmp3;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_BUF_SIZE_NOT_FIXED);
+ return rc;
+ }
+ if (i_modeBuild>P8_SLW_MODEBUILD_MAX_VALUE) {
+ FAPI_ERR("modeBuild=%i invalid. Valid range is [0;%i].",
+ i_modeBuild,P8_SLW_MODEBUILD_MAX_VALUE);
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_BAD_CODE_OR_PARM);
+ return rc;
+ }
+ FAPI_DBG("Reference/input image size: %i",sizeImageIn);
+
+
+ // ==========================================================================
+ // Check and copy image to mainstore and clean it up.
+ // ==========================================================================
+ // ToDo:
+ // - Eventually, automate emptying sections in proper order (last section goes first).
+ // - For 5/15, assume following order of removal: rings, pibmem0, and halt.
+ //
+ // First, copy input image to supplied mainstore location.
+ //
+ memcpy( i_imageOut, i_imageIn, sizeImageIn);
+ sbe_xip_image_size(i_imageOut, &sizeImage);
+ rcLoc = sbe_xip_validate(i_imageOut, sizeImage);
+ if (rcLoc) {
+ FAPI_ERR("xip_validate() failed w/rcLoc=%i",rcLoc);
+ uint32_t & RC_LOCAL=rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_MS_INTERNAL_IMAGE_ERR);
+ return rc;
+ }
+ if (sizeImage!=sizeImageIn) {
+ FAPI_ERR("Size obtained from copied image's header (=%i) differs from input image's size (=%i).",
+ sizeImage,sizeImageIn);
+ uint32_t & DATA_IMG_SIZE = sizeImage;
+ uint32_t & DATA_IMG_SIZE_INP = sizeImageIn;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_MS_IMAGE_SIZE_MISMATCH);
+ return rc;
+ }
+
+ // Second, delete .dcrings, .rings and .pibmem0 sections (but keep .halt)
+ //
+ rcLoc = sbe_xip_delete_section( i_imageOut, SBE_XIP_SECTION_DCRINGS);
+ if (rcLoc) {
+ FAPI_ERR("xip_delete_section(.dcrings) failed w/rcLoc=%i",rcLoc);
+ uint32_t & RC_LOCAL=rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_DELETE_IMAGE_SECTION_ERROR);
+ return rc;
+ }
+ sbe_xip_image_size(i_imageOut, &sizeImage);
+ rcLoc = sbe_xip_validate(i_imageOut, sizeImage);
+ if (rcLoc) {
+ FAPI_ERR("xip_validate() failed w/rcLoc=%i",rcLoc);
+ uint32_t & RC_LOCAL=rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_MS_INTERNAL_IMAGE_ERR);
+ return rc;
+ }
+ FAPI_DBG("Image size (after .dcrings delete): %i",sizeImage);
+
+ rcLoc = sbe_xip_delete_section( i_imageOut, SBE_XIP_SECTION_RINGS);
+ if (rcLoc) {
+ FAPI_ERR("xip_delete_section(.rings) failed w/rcLoc=%i",rcLoc);
+ uint32_t & RC_LOCAL=rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_DELETE_IMAGE_SECTION_ERROR);
+ return rc;
+ }
+ sbe_xip_image_size(i_imageOut, &sizeImage);
+ rcLoc = sbe_xip_validate(i_imageOut, sizeImage);
+ if (rcLoc) {
+ FAPI_ERR("xip_validate() failed w/rcLoc=%i",rcLoc);
+ uint32_t & RC_LOCAL=rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_MS_INTERNAL_IMAGE_ERR);
+ return rc;
+ }
+ FAPI_DBG("Image size (after .rings delete): %i",sizeImage);
+
+ rcLoc = sbe_xip_delete_section( i_imageOut, SBE_XIP_SECTION_PIBMEM0);
+ if (rcLoc) {
+ FAPI_ERR("xip_delete_section(.pibmem0) failed w/rcLoc=%i",rcLoc);
+ uint32_t & RC_LOCAL=rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_DELETE_IMAGE_SECTION_ERROR);
+ return rc;
+ }
+ sbe_xip_image_size(i_imageOut, &sizeImage);
+ rcLoc = sbe_xip_validate(i_imageOut, sizeImage);
+ if (rcLoc) {
+ FAPI_ERR("xip_validate() failed w/rcLoc=%i",rcLoc);
+ uint32_t & RC_LOCAL=rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_MS_INTERNAL_IMAGE_ERR);
+ return rc;
+ }
+ FAPI_DBG("Image size (after .pibmem0 delete): %i",sizeImage);
+
+ //
+ // DD level.
+ //
+ rc = FAPI_ATTR_GET_PRIVILEGED(ATTR_EC, &i_target, l_uint8);
+ ddLevel = (uint32_t)l_uint8;
+ if (rc) {
+ FAPI_ERR("FAPI_ATTR_GET_PRIVILEGED() failed w/rc=%i and ddLevel=0x%02x",(uint32_t)rc,l_uint8);
+ return rc;
+ }
+
+
+#ifndef IMGBUILD_PPD_IGNORE_XIPC
+ // ==========================================================================
+ // Get various FAPI attributes and variables needed for ring unraveling.
+ // ==========================================================================
+ uint8_t attrAsyncSafeMode=0, bAsyncSafeMode;
+ uint32_t attrFuncL3RingList[MAX_FUNC_L3_RING_LIST_ENTRIES]={0};
+ uint8_t attrFuncL3RingData[MAX_FUNC_L3_RING_SIZE]={0};
+ uint32_t attrFuncL3RingLength=0;
+ SbeXipItem xipTocItem;
+ uint64_t xipFuncL3RingVector=0;
+ uint32_t iEntry;
+
+ // Safe mode status.
+ //
+ rc = FAPI_ATTR_GET(ATTR_PROC_FABRIC_ASYNC_SAFE_MODE, NULL, attrAsyncSafeMode);
+ if (rc) {
+ FAPI_ERR("FAPI_ATTR_GET(ATTR_PROC_FABRIC_ASYNC_SAFE_MODE) returned error.");
+ return rc;
+ }
+ bAsyncSafeMode = attrAsyncSafeMode;
+
+ // Obtain ex_func_l3_ring overlay data and length from attributes.
+ // Obtain ring name and ring's vector location from image.
+ //
+ if (!bAsyncSafeMode) {
+ // Get overlay ring from attributes.
+ rc = FAPI_ATTR_GET(ATTR_PROC_EX_FUNC_L3_DELTA_DATA, &i_target, attrFuncL3RingList);
+ if (rc) {
+ FAPI_ERR("FAPI_ATTR_GET(ATTR_PROC_EX_FUNC_L3_DELTA_DATA) returned error.");
+ return rc;
+ }
+ rc = FAPI_ATTR_GET(ATTR_PROC_EX_FUNC_L3_LENGTH, &i_target, attrFuncL3RingLength);
+ if (rc) {
+ FAPI_ERR("FAPI_ATTR_GET(ATTR_PROC_EX_FUNC_L3_LENGTH) returned error.");
+ return rc;
+ }
+ //attrFuncL3RingLength = 0xBEBA;
+ for (iEntry=0; iEntry<MAX_FUNC_L3_RING_LIST_ENTRIES; iEntry++) {
+ if (attrFuncL3RingList[iEntry]!=0xffff0000) {
+ attrFuncL3RingData[attrFuncL3RingList[iEntry]>>16] =
+ (uint8_t)((attrFuncL3RingList[iEntry]<<24)>>24);
+ }
+ else
+ break;
+ }
+ FAPI_DBG("Overlay [raw] ring created for func L3.");
+ // Get ring name from xip image.
+ rcLoc = sbe_xip_find((void*)i_imageIn, FUNC_L3_RING_TOC_NAME, &xipTocItem);
+ if (rcLoc) {
+ FAPI_ERR("sbe_xip_find() failed w/rc=%i", rcLoc);
+ FAPI_ERR("Probable cause:");
+ FAPI_ERR("\tThe keyword (=%s) was not found.", FUNC_L3_RING_TOC_NAME);
+ uint32_t & RC_LOCAL = rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_KEYWORD_NOT_FOUND_ERROR);
+ return rc;
+ }
+ xipFuncL3RingVector = xipTocItem.iv_address;
+ }
+#endif
+
+
+ /***************************************************************************
+ * SEARCH LOOP - Begin *
+ ***************************************************************************/
+ do {
+
+ FAPI_DBG("nextRing (at top)=0x%016llx",(uint64_t)nextRing);
+
+
+ // ==========================================================================
+ // Get ring layout from image
+ // ==========================================================================
+ FAPI_DBG("--> Reading RS4 delta ring info from SBE-XIP Image.");
+ rcLoc = get_ring_layout_from_image( i_imageIn,
+ ddLevel,
+ sysPhase,
+ &rs4RingLayout,
+ &nextRing);
+ rcSearch = rcLoc;
+ if (rcSearch!=DSLWB_RING_SEARCH_MATCH &&
+ rcSearch!=DSLWB_RING_SEARCH_EXHAUST_MATCH &&
+ rcSearch!=DSLWB_RING_SEARCH_NO_MATCH) {
+ FAPI_ERR("\tGetting delta ring from image was unsuccessful (rcSearch=%i).",rcSearch);
+ FAPI_ERR("\tNo wiggle-flip programs will be stored in .rings section.");
+ FAPI_ERR("\tThe following ELF sections have been emptied: .rings, .pibmem0, .ipl_text.");
+ uint32_t & RC_LOCAL=rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_RING_RETRIEVAL_ERROR);
+ return rc;
+ }
+ if (rcSearch==DSLWB_RING_SEARCH_MATCH ||
+ rcSearch==DSLWB_RING_SEARCH_EXHAUST_MATCH)
+ FAPI_DBG("\tRetrieving RS4 delta ring was successful.");
+
+ //
+ // Check if we're done at this point, and save status in bSearchDone.
+ //
+ if (rcSearch==DSLWB_RING_SEARCH_NO_MATCH) {
+
+ bSearchDone = 1;
+
+ }
+ else { // More rings to search...
+
+ deltaRingRS4 = (CompressedScanData*)rs4RingLayout.rs4Delta;
+
+ FAPI_DBG("Dumping ring layout:");
+ FAPI_DBG("\tentryOffset = %i",(uint32_t)myRev64(rs4RingLayout.entryOffset));
+ FAPI_DBG("\tbackItemPtr = 0x%016llx",myRev64(rs4RingLayout.backItemPtr));
+ FAPI_DBG("\tsizeOfThis = %i",myRev32(rs4RingLayout.sizeOfThis));
+ FAPI_DBG("\tsizeOfMeta = %i",myRev32(rs4RingLayout.sizeOfMeta));
+ FAPI_DBG("\tddLevel = %i",myRev32(rs4RingLayout.ddLevel));
+ FAPI_DBG("\tsysPhase = %i",rs4RingLayout.sysPhase);
+ FAPI_DBG("\toverride = %i",rs4RingLayout.override);
+ FAPI_DBG("\treserved1+2 = %i",rs4RingLayout.reserved1|rs4RingLayout.reserved2);
+ FAPI_DBG("\tRS4 magic # = 0x%08x",myRev32(deltaRingRS4->iv_magic));
+ FAPI_DBG("\tRS4 total size = %i",myRev32(deltaRingRS4->iv_size));
+ FAPI_DBG("\tUnXed data size = %i",myRev32(deltaRingRS4->iv_length));
+ FAPI_DBG("\tScan select = 0x%08x",myRev32(deltaRingRS4->iv_scanSelect));
+ FAPI_DBG("\tHeader version = 0x%02x",deltaRingRS4->iv_headerVersion);
+ FAPI_DBG("\tFlush optimize = 0x%02x (reverse of override)",deltaRingRS4->iv_flushOptimization);
+ FAPI_DBG("\tRing ID = 0x%02x",deltaRingRS4->iv_ringId);
+ FAPI_DBG("\tChiplet ID = 0x%02x",deltaRingRS4->iv_chipletId);
+ FAPI_DBG("Dumping meta data:");
+ FAPI_DBG("\tsizeOfData = %i",myRev32(rs4RingLayout.sizeOfMeta));
+ FAPI_DBG("\tMeta data = ");
+ for (i=0; i<myRev32(rs4RingLayout.sizeOfMeta); i++) { // String may not be null terminated.
+ FAPI_DBG("%c",rs4RingLayout.metaData[i]);
+ }
+
+
+ // ==========================================================================
+ // Decompress RS4 delta state.
+ // ==========================================================================
+ FAPI_DBG("--> Decompressing RS4 delta ring.");
+ rcLoc = _rs4_decompress((uint8_t*)i_buf2,
+ i_sizeBuf2,
+ &ringBitLen,
+ deltaRingRS4);
+ if (rcLoc) {
+ FAPI_ERR("\t_rs4_decompress() failed: rc=%i",rcLoc);
+ uint32_t & RC_LOCAL=rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_RS4_DECOMPRESSION_ERROR);
+ return rc;
+ }
+ FAPI_DBG("\tDecompression successful.\n");
+
+
+#ifndef IMGBUILD_PPD_IGNORE_XIPC
+ // ==========================================================================
+ // CUSTOMIZE item: Overlay ex_func_l3_ring.
+ // Retrieval method: Attribute.
+ // Note: Check if ex_func_l3_ring's vector address matches current backPtr.
+ // If so, perform OR operation with new attribute data for this ring.
+ // Assumptions:
+ // - Base ring only.
+ // - Correct DD level rings only.
+ // ==========================================================================
+ uint8_t byteExisting=0, byteOverlay=0, bGoodByte=1;
+ uint32_t iByte, sizeRingInBytes;
+ FAPI_DBG("--> Check if we should modify the ex_func_l3_ring with attribute data.");
+ if (!bAsyncSafeMode) {
+ // Find ring match by comparing backItemPtr and ring lengths. Note that
+ // we can't use fwdPtr for finding a match since we don't know which DD
+ // level ring it ended up pointing at.
+ if (xipFuncL3RingVector==myRev64(rs4RingLayout.backItemPtr) &&
+ attrFuncL3RingLength==myRev32(deltaRingRS4->iv_length)) {
+ // Perform OR between the existing ring and attribute ring.
+ sizeRingInBytes = (attrFuncL3RingLength-1)/8 + 1;
+ bGoodByte = 1;
+ FAPI_DBG("Byte[ # ]: ER OR =ER? ");
+ FAPI_DBG("-----------------------");
+ for (iByte=0; (iByte<sizeRingInBytes && bGoodByte); iByte++) {
+ if (*(attrFuncL3RingData+iByte)) {
+ // Check there are 0-bits in the existing byte where there are
+ // 1-bits in the overlay byte.
+ byteExisting = *((uint8_t*)i_buf2+iByte);
+ byteOverlay = *(&attrFuncL3RingData[0]+iByte);
+ if (byteExisting!=(byteExisting & ~byteOverlay)) {
+ FAPI_ERR("Byte[%4i]: %02x %02x %02x <-violation",iByte,byteExisting,byteOverlay,byteExisting&~byteOverlay);
+ bGoodByte = 0;
+ break;
+ }
+ else {
+ FAPI_DBG("Byte[%4i]: %02x %02x %02x ",iByte,byteExisting,byteOverlay,byteExisting&~byteOverlay);
+ }
+ // Only update existing ring when there's content in overlay data.
+ *((uint8_t*)i_buf2+iByte) = byteExisting | byteOverlay;
+ }
+ }
+ FAPI_DBG("-----------------------");
+ if (!bGoodByte) {
+ FAPI_ERR("The existing ex_l3_func_ring has 1-bits in overlay locations. ");
+ uint32_t & DATA_FAIL_BYTE_NO = iByte;
+ uint8_t & DATA_EXISTING_RING_BYTE = byteExisting;
+ uint8_t & DATA_OVERLAY_RING_BYTE = byteOverlay;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_L3_FUNC_OVERLAY_ERROR);
+ return rc;
+ }
+ }
+ }
+#endif
+
+ // ==========================================================================
+ // Create Wiggle-Flip Programs (but first resolve max rotate status.)
+ // ==========================================================================
+ FAPI_DBG("--> Creating Wiggle-Flip Program.");
+
+ rcLoc = sbe_xip_get_scalar( (void*)i_imageIn, SCAN_MAX_ROTATE_38XXX_NAME, &scanMaxRotate);
+ if (rcLoc) {
+ FAPI_INF("WARNING: sbe_xip_get_scalar() failed...but we might wing it.");
+ if (rcLoc==SBE_XIP_ITEM_NOT_FOUND) {
+ FAPI_INF("Probable cause:");
+ FAPI_INF("\tThe key word in SCAN_MAX_ROTATE_38XXX_NAME does not exist the TOC.");
+ scanMaxRotate = SCAN_ROTATE_DEFAULT;
+ FAPI_INF("\tscanMaxRotate set to 0x%llx", scanMaxRotate);
+ FAPI_INF("Continuing...");
+ }
+ else {
+ FAPI_ERR("ERROR: Nope, couldn't wing it.");
+ uint32_t & RC_LOCAL=rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_UNKNOWN_XIP_ERROR);
+ return rc;
+ }
+ }
+ if (scanMaxRotate<0x20 || scanMaxRotate>SCAN_MAX_ROTATE) {
+ FAPI_INF("WARNING: Value of key word SCAN_MAX_ROTATE_38XXX_NAME=0x%llx is not permitted.\n",scanMaxRotate);
+ scanMaxRotate = SCAN_ROTATE_DEFAULT;
+ FAPI_INF("\tscanMaxRotate set to 0x%llx\n", scanMaxRotate);
+ FAPI_INF("Continuing...\n");
+ }
+
+ // Support for enforcing delay after WF scan write scoms.
+ uint64_t waitsScanDelay=10;
+ rcLoc = sbe_xip_get_scalar( (void*)i_imageIn, "waits_delay_for_scan", &waitsScanDelay);
+ if (rcLoc) {
+ FAPI_ERR("Error obtaining waits_delay_for_scan keyword.\n");
+ uint32_t & RC_LOCAL=rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_UNKNOWN_XIP_ERROR);
+ return rc;
+ }
+
+ wfInline = (uint32_t*)i_buf1;
+ wfInlineLenInWords = i_sizeBuf1/4;
+ rcLoc = create_wiggle_flip_prg( (uint32_t*)i_buf2, // Input buffer, buf2
+ ringBitLen,
+ myRev32(deltaRingRS4->iv_scanSelect),
+ (uint32_t)deltaRingRS4->iv_chipletId,
+ &wfInline, // Output buffer, buf1
+ &wfInlineLenInWords,
+ deltaRingRS4->iv_flushOptimization,
+ (uint32_t)scanMaxRotate,
+ (uint32_t)waitsScanDelay);
+ if (rcLoc) {
+ FAPI_ERR("create_wiggle_flip_prg() failed w/rcLoc=%i",rcLoc);
+ uint32_t & RC_LOCAL=rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_WF_CREATION_ERROR);
+ return rc;
+ }
+ FAPI_DBG("\tWiggle-flip programming successful.");
+
+
+ // ==========================================================================
+ // Append Wiggle-Flip programs to .rings section. (But 1st put ring block together.)
+ // ==========================================================================
+ FAPI_DBG("--> Building WF ring header.");
+ //
+ // Populate ring header and put ring header and Wf ring into
+ // proper spots in pre-allocated bufWfRingBlock buffer (HB buf1).
+ //
+ DeltaRingLayout *bufWfRingBlock;
+ uint64_t entryOffsetWfRingBlock;
+ uint32_t sizeWfRingBlock, sizeWfRingBlockMax;
+
+ bufWfRingBlock = (DeltaRingLayout*)i_buf2; // Previously contained delta ring state.
+ sizeWfRingBlockMax = i_sizeBuf2;
+
+ entryOffsetWfRingBlock = calc_ring_layout_entry_offset(
+ 1,
+ myRev32(rs4RingLayout.sizeOfMeta) );
+ bufWfRingBlock->entryOffset = myRev64(entryOffsetWfRingBlock);
+ bufWfRingBlock->sizeOfMeta = rs4RingLayout.sizeOfMeta;
+ bufWfRingBlock->backItemPtr = rs4RingLayout.backItemPtr;
+ sizeWfRingBlock = entryOffsetWfRingBlock + // Must be 8-byte aligned.
+ wfInlineLenInWords*4; // Must be 8-byte aligned.
+ // Quick check to see if final ring block size will fit in HB buffer.
+ if (sizeWfRingBlock>sizeWfRingBlockMax) {
+ FAPI_ERR("WF ring block size (=%i) exceeds pre-allocated buf1 size (=%i).",
+ sizeWfRingBlock, sizeWfRingBlockMax);
+ uint32_t &DATA_RING_BLOCK_SIZEOFTHIS=sizeWfRingBlock;
+ uint32_t &DATA_SIZE_OF_BUF1=sizeWfRingBlock;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_RING_BLOCK_TOO_LARGE);
+ return rc;
+ }
+ bufWfRingBlock->sizeOfThis = myRev32(sizeWfRingBlock);
+ // Find where meta data goes.
+ bufLC = (uint32_t)( entryOffsetWfRingBlock -
+ myByteAlign(8, myRev32(bufWfRingBlock->sizeOfMeta)) );
+ // Copy over meta data. Do not worry about alignment here.
+ memcpy( (uint8_t*)bufWfRingBlock+bufLC,
+ rs4RingLayout.metaData,
+ (size_t)myRev32(rs4RingLayout.sizeOfMeta));
+ // Find where WF prg goes.
+ bufLC = (uint32_t)entryOffsetWfRingBlock;
+ // Copy over WF ring prg which is already 8-byte aligned.
+ memcpy( (uint8_t*)bufWfRingBlock+bufLC,
+ wfInline,
+ (size_t)wfInlineLenInWords*4);
+
+ // Now, some post-sanity checks on alignments.
+ if ( entryOffsetWfRingBlock%8 ||
+ sizeWfRingBlock%8) {
+ FAPI_ERR("Member(s) of WF ring block are not 8-byte aligned:");
+ FAPI_ERR(" Entry offset = %i", (uint32_t)entryOffsetWfRingBlock);
+ FAPI_ERR(" Size of ring block = %i", sizeWfRingBlock);
+ dataTmp1=(uint32_t)entryOffsetWfRingBlock;
+ uint32_t &DATA_RING_BLOCK_ENTRYOFFSET=dataTmp1;
+ uint32_t &DATA_RING_BLOCK_SIZEOFTHIS=sizeWfRingBlock;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_RING_BLOCK_ALIGN_ERROR);
+ return rc;
+ }
+
+ FAPI_DBG("--> Appending WF ring to .rings section.");
+ rcLoc = write_ring_block_to_image(i_imageOut,
+ NULL,
+ bufWfRingBlock,
+ 0,
+ rs4RingLayout.override,
+ 1,
+ sizeImageOutMax,
+ SBE_XIP_SECTION_RINGS,
+ i_buf1, // Use buf1 as temp buf.
+ i_sizeBuf1);
+ if (rcLoc) {
+ FAPI_ERR("write_ring_block_to_image() failed w/rc=%i",rcLoc);
+ FAPI_ERR("Check p8_delta_scan_rw.h for meaning of IMGBUILD_xyz rc code.");
+ uint32_t &RC_LOCAL=rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_IMGBUILD_ERROR);
+ return rc;
+ }
+
+
+ // Update some variables for debugging and error reporting.
+ sizeImageOld = sizeImageTmp;
+ countWF++;
+ FAPI_DBG("\tUpdating image w/WF prg + ring header was successful.sizeImageOld=%d",sizeImageOld);
+
+ } // End of if (rcSearch!=DSLWB_RING_SEARCH_NO_MATCH)
+
+ // ============================================================================
+ // Are we done now?
+ // ============================================================================
+ if (bSearchDone || rcSearch==DSLWB_RING_SEARCH_EXHAUST_MATCH) {
+ FAPI_INF("Wiggle-flip programming done.");
+ FAPI_INF("Number of wf programs appended: %i", countWF);
+ if (countWF==0)
+ FAPI_INF("ZERO WF programs appended to .rings section.");
+#ifndef IMGBUILD_PPD_IGNORE_XIPC
+ //
+ // Do various customizations to image.
+ //
+ sizeImageTmp = sizeImageOutMax;
+ FAPI_INF("Calling xip_customize().\n");
+ FAPI_EXEC_HWP(rc, p8_xip_customize,
+ i_target,
+ i_imageIn,
+ i_imageOut,
+ sizeImageTmp,
+ sysPhase,
+ i_modeBuild,
+ i_buf1,
+ i_sizeBuf1,
+ i_buf2,
+ i_sizeBuf2,
+ bootCoreMask);
+ if (rc!=FAPI_RC_SUCCESS) {
+ FAPI_ERR("Xip customization failed.");
+ return rc;
+ }
+ FAPI_INF("Xip customization done.");
+#else
+ //
+ // Initialize .slw section, just in case we ignore xip_customize in a build.
+ //
+ switch (i_modeBuild) {
+ // --------------------------------------------------------------------
+ // case 0: IPL mode.
+ // - This is first time SLW image is built. Go all out.
+ // --------------------------------------------------------------------
+ case P8_SLW_MODEBUILD_IPL: // IPL mode.
+ rcLoc = create_and_initialize_fixed_image( i_imageOut);
+ if (rcLoc) {
+ uint32_t & RC_LOCAL=rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_CREATE_FIXED_IMAGE_ERROR);
+ return rc;
+ }
+ FAPI_INF("IPL mode build: Fixed SLW and FFDC sections allocated and SLW section initialized for Ramming and Scomming tables.");
+ break;
+ // --------------------------------------------------------------------
+ // case 1: Rebuild mode - Nothing to do.
+ // - Image size already fixed at 1MB during IPL mode.
+ // - Fixed positioning of .slw and .ffdc already done during IPL mode.
+ // --------------------------------------------------------------------
+ case P8_SLW_MODEBUILD_REBUILD: // Rebuild mode. (Need to update Ram/Scom vectors.)
+ rcLoc = create_and_initialize_fixed_image( i_imageOut);
+ if (rcLoc) {
+ uint32_t & RC_LOCAL=rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_CREATE_FIXED_IMAGE_ERROR);
+ return rc;
+ }
+ FAPI_INF("Rebuild mode build: Fixed SLW and FFDC sections allocated and SLW section initialized for Ramming and Scomming tables.");
+ break;
+ // --------------------------------------------------------------------
+ // case 2: SRAM mode.
+ // - Assumption: slw_build() called by OCC.
+ // - Need to make image as slim as possible.
+ // - Do not append .fit.
+ // - Position .slw right after .rings.
+ // - Do not append .ffdc.
+ // --------------------------------------------------------------------
+ case P8_SLW_MODEBUILD_SRAM: // SRAM mode.
+ sizeImageTmp = sizeImageOutMax;
+ rcLoc = initialize_slw_section( i_imageOut,
+ &sizeImageTmp);
+ if (rcLoc) {
+ if (rcLoc==IMGBUILD_ERR_IMAGE_TOO_LARGE) {
+ uint32_t & DATA_IMG_SIZE_OLD=sizeImageOld;
+ uint32_t & DATA_IMG_SIZE_EST=sizeImageTmp;
+ uint32_t & DATA_IMG_SIZE_MAX=sizeImageOutMax;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_MAX_IMAGE_SIZE_EXCEEDED);
+ }
+ else {
+ uint32_t & RC_LOCAL=rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_APPEND_SLW_SECTION_ERROR);
+ }
+ return rc;
+ }
+ FAPI_INF("SRAM mode build: SLW section allocated for Ramming and Scomming tables.");
+ break;
+ // Default case - Should never get here.
+ default:
+ FAPI_ERR("Bad code, or bad modeBuild (=%i) parm.",i_modeBuild);
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_BAD_CODE_OR_PARM);
+ return rc;
+ }
+#endif
+
+ // Update host_runtime_scom pointer to point to sub_slw_runtime_scom
+ rcLoc = update_runtime_scom_pointer(i_imageOut);
+ if (rcLoc==IMGBUILD_ERR_KEYWORD_NOT_FOUND) {
+ uint32_t &RC_LOCAL=rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_KEYWORD_NOT_FOUND_ERROR);
+ return rc;
+ }
+ // Report final size.
+ sbe_xip_image_size( i_imageOut, &io_sizeImageOut);
+ FAPI_INF("Final SLW image size (should be 1MB for modeBuild={0,1}): %i", io_sizeImageOut);
+ return FAPI_RC_SUCCESS;
+ }
+
+ FAPI_DBG("nextRing (at bottom)=0x%016llx",(uint64_t)nextRing);
+
+ } while (nextRing!=NULL);
+ /***************************************************************************
+ * RING SEARCH LOOP - End *
+ ***************************************************************************/
+
+ FAPI_ERR("Shouldn't be in this code section. Check code.");
+ rcLoc = IMGBUILD_ERR_CHECK_CODE;
+ uint32_t & RC_LOCAL=rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_SLWB_UNKNOWN_ERROR);
+ return rc;
+
+}
+
+} // End of extern C
diff --git a/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_xip_customize.C b/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_xip_customize.C
index e85815a1c..2567780b6 100644
--- a/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_xip_customize.C
+++ b/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_xip_customize.C
@@ -20,7 +20,8 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: p8_xip_customize.C,v 1.51 2013/06/13 22:38:28 cmolsen Exp $
+
+// $Id: p8_xip_customize.C,v 1.52 2013-08-06 18:47:46 jeshua Exp $
/*------------------------------------------------------------------------------*/
/* *! TITLE : p8_xip_customize */
/* *! DESCRIPTION : Obtains repair rings from VPD and adds them to either */
@@ -238,21 +239,21 @@ ReturnCode p8_xip_customize_insert_chiplet_rings( const fapi::Target &i_target,
return rc;
}
}
- // Check if the VPD ring is redundant
- int redundant = 0;
- rcLoc = rs4_redundant((CompressedScanData*)bufVpdRing, &redundant);
- if(rcLoc) {
- FAPI_ERR("rs4_redundant() failed w/rc=%i ",rcLoc);
- uint32_t & RC_LOCAL = rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_XIPC_CHECK_REDUNDANT_ERROR);
- return rc;
- }
- rcLoc = 0;
- // Add VPD ring to image if not redundant
- if( redundant ) {
- FAPI_INF("Skipping VPD ring because it doesn't change the ring (iRing,ringId,chipletId)=(%i,0x%02X,0x%02X).",iRing,ringId,chipletId);
- } else {
- if (i_sysPhase==0) {
+ if (i_sysPhase==0) {
+ // Check if the VPD ring is redundant
+ int redundant = 0;
+ rcLoc = rs4_redundant((CompressedScanData*)bufVpdRing, &redundant);
+ if(rcLoc) {
+ FAPI_ERR("rs4_redundant() failed w/rc=%i ",rcLoc);
+ uint32_t & RC_LOCAL = rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_XIPC_CHECK_REDUNDANT_ERROR);
+ return rc;
+ }
+ rcLoc = 0;
+ // Add VPD ring to image if not redundant
+ if( redundant ) {
+ FAPI_INF("Skipping VPD ring because it doesn't change the ring (iRing,ringId,chipletId)=(%i,0x%02X,0x%02X).",iRing,ringId,chipletId);
+ } else {
// Add VPD ring to --->>> IPL <<<--- image
rcLoc = write_vpd_ring_to_ipl_image(
o_imageOut,
@@ -282,27 +283,27 @@ ReturnCode p8_xip_customize_insert_chiplet_rings( const fapi::Target &i_target,
return rc;
}
}
+ } //if not redundant
+ }
+ else {
+ // Add VPD ring to --->>> SLW <<<--- image
+ rcLoc = write_vpd_ring_to_slw_image(
+ o_imageOut,
+ sizeImageOut,
+ (CompressedScanData*)bufVpdRing, //HB buf1
+ ddLevel,
+ i_sysPhase,
+ (char*)(ring_id_list+iRing)->ringNameImg,
+ (void*)i_buf2, //HB buf2
+ i_sizeBuf2,
+ (ring_id_list+iRing)->bWcSpace);
+ if (rcLoc) {
+ FAPI_ERR("write_vpd_ring_to_slw_image() failed w/rc=%i",rcLoc);
+ uint32_t & RC_LOCAL = rcLoc;
+ FAPI_SET_HWP_ERROR(rc, RC_PROC_XIPC_WRITE_VPD_RING_TO_SLW_IMAGE_ERROR);
+ return rc;
}
- else {
- // Add VPD ring to --->>> SLW <<<--- image
- rcLoc = write_vpd_ring_to_slw_image(
- o_imageOut,
- sizeImageOut,
- (CompressedScanData*)bufVpdRing, //HB buf1
- ddLevel,
- i_sysPhase,
- (char*)(ring_id_list+iRing)->ringNameImg,
- (void*)i_buf2, //HB buf2
- i_sizeBuf2,
- (ring_id_list+iRing)->bWcSpace);
- if (rcLoc) {
- FAPI_ERR("write_vpd_ring_to_slw_image() failed w/rc=%i",rcLoc);
- uint32_t & RC_LOCAL = rcLoc;
- FAPI_SET_HWP_ERROR(rc, RC_PROC_XIPC_WRITE_VPD_RING_TO_SLW_IMAGE_ERROR);
- return rc;
- }
- }
- } //if not redundant
+ }
} //no buffer overflow
} //ring found in VPD
} //chiplet ID is valid for this ring name
diff --git a/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_xip_customize.H b/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_xip_customize.H
index 42387de78..ec018eed9 100644
--- a/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_xip_customize.H
+++ b/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_xip_customize.H
@@ -20,6 +20,7 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
+
// $Id: p8_xip_customize.H,v 1.8 2013/06/13 16:52:41 jeshua Exp $
#include <fapi.H>
@@ -30,7 +31,7 @@ typedef fapi::ReturnCode (*fapiGetMvpdField_FP_t) ( const fapi::MvpdRecord i_rec
uint8_t * const i_pBuffer,
uint32_t &io_fieldSize);
-typedef fapi::ReturnCode (*p8_xip_customize_FP_t) ( const fapi::Target&,
+typedef fapi::ReturnCode (*p8_xip_customize_FP_t) ( const fapi::Target&,
void*,
void*,
uint32_t&,
@@ -49,18 +50,18 @@ extern "C"
// Function declares.
//
- // Description:
+ // Description:
// FAPI HWP entry point for p8_xip_customize().
// p8_xip_customize() adds VPD rings to the IPL and SLW images and updates
// various vectors in the images.
//
- // Parameters:
+ // Parameters:
// fapi::Target &i_target: Processor chip target.
// void *i_imageIn: Ptr to input IPL or SLW image.
// void *i_imageOut: Ptr to output IPL img. (Ignored for SLW/RAM imgs.)
// uint32_t &io_sizeImageOut: In: Max size of IPL/SRAM img. Out: Final size.
// uint8_t i_sysPhase: 0: IPL 1: SLW
- // uint8_t i_modeBuild: 0: HB/IPL 1: PHYP/Rebuild 2: SRAM
+ // uint8_t i_modeBuild: 0: HB/IPL 1: PHYP/Rebuild 2: SRAM
// void *i_buf1: Temp buffer1 for dexed RS4 ring. Caller allocs/frees.
// uint32_t i_sizeBuf1: Size of buf1.
// void *i_buf2: Temp buffer2 for WF ring. Caller allocs/frees.
@@ -73,7 +74,7 @@ extern "C"
void *i_imageOut,
uint32_t &io_sizeImageOut,
const uint8_t i_sysPhase,
- const uint8_t i_modeBuild,
+ const uint8_t i_modeBuild,
void *i_buf1,
const uint32_t i_sizeBuf1,
void *i_buf2,
OpenPOWER on IntegriCloud