summaryrefslogtreecommitdiffstats
path: root/src/sbefw/sbecmdgeneric.C
diff options
context:
space:
mode:
authorSachin Gupta <sgupta2m@in.ibm.com>2017-10-12 05:08:44 -0500
committerSachin Gupta <sgupta2m@in.ibm.com>2017-10-25 09:45:05 -0400
commit204fab916ae42cce6ec3942077b60c955e7e68ba (patch)
treec25a152cbe82bdbe5faf3b1998ec6b24f76391dc /src/sbefw/sbecmdgeneric.C
parentdb75522b35091a395bc911712c487a87a0debb61 (diff)
downloadtalos-sbe-204fab916ae42cce6ec3942077b60c955e7e68ba.tar.gz
talos-sbe-204fab916ae42cce6ec3942077b60c955e7e68ba.zip
Support SBE seeprom read
Change-Id: I92dfdc5c02867e7c7068b9b0966f3aff76b506ec RTC: 180510 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/48290 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Shakeeb A. Pasha B K <shakeebbk@in.ibm.com> Reviewed-by: RAJA DAS <rajadas2@in.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: AMIT J. TENDOLKAR <amit.tendolkar@in.ibm.com> Reviewed-by: Sachin Gupta <sgupta2m@in.ibm.com>
Diffstat (limited to 'src/sbefw/sbecmdgeneric.C')
-rw-r--r--src/sbefw/sbecmdgeneric.C83
1 files changed, 82 insertions, 1 deletions
diff --git a/src/sbefw/sbecmdgeneric.C b/src/sbefw/sbecmdgeneric.C
index 5c7320b4..1e0655aa 100644
--- a/src/sbefw/sbecmdgeneric.C
+++ b/src/sbefw/sbecmdgeneric.C
@@ -204,7 +204,7 @@ uint32_t sbeGetFfdc (uint8_t *i_pArg)
// @TODO via RTC : 149074
// primary and secondary status should be picked
// from the globals.
- // Check for Primary and Secondary Status from Globals and then send
+ // Check for Primary and Secondary Status from Globals and then send
// internal FFDC.
rc = sbeFfdcPack.sendOverFIFO(respHdr,
SBE_FFDC_ALL_DUMP,
@@ -442,5 +442,86 @@ uint32_t sbePsuQuiesce( uint8_t *i_pArg )
return rc;
#undef SBE_FUNC
}
+
+//----------------------------------------------------------------------------
+uint32_t sbeReadMem( uint8_t *i_pArg )
+{
+ #define SBE_FUNC "sbeReadMem"
+ SBE_ENTER(SBE_FUNC);
+ uint32_t rc = SBE_SEC_OPERATION_SUCCESSFUL;
+ uint32_t fapiRc = FAPI2_RC_SUCCESS;
+ sbeReadMemReq_t req = {};
+
+ do
+ {
+ // Extract the request
+ // and send Ack to Host via SBE_SBE2PSU_DOORBELL_SET_BIT1
+ rc = sbeReadPsu2SbeMbxReg(SBE_HOST_PSU_MBOX_REG1,
+ (sizeof(req)/sizeof(uint64_t)),
+ (uint64_t*)&req,
+ true);
+ if(SBE_SEC_OPERATION_SUCCESSFUL != rc)
+ {
+ SBE_ERROR(SBE_FUNC "Failed to extract SBE_HOST_PSU_MBOX_REG1 and "
+ "SBE_HOST_PSU_MBOX_REG2");
+ break;
+ }
+
+ if(!( req.validateReq()) )
+ {
+ SBE_ERROR(SBE_FUNC"Invalid data. offset:0x%08X size:0x%08X",
+ req.offset, req.size );
+ SBE_GLOBAL->sbeSbe2PsuRespHdr.setStatus(SBE_PRI_USER_ERROR,
+ SBE_SEC_INVALID_PARAMS);
+ break;
+ }
+
+ // Default EX Target Init. As its not LCO mode, ex does not matter.
+ fapi2::Target<fapi2::TARGET_TYPE_EX> l_ex(
+ fapi2::plat_getTargetHandleByChipletNumber<fapi2::TARGET_TYPE_EX>(
+ sbeMemAccessInterface::PBA_DEFAULT_EX_CHIPLET_ID));
+ p9_PBA_oper_flag l_myPbaFlag;
+ l_myPbaFlag.setOperationType(p9_PBA_oper_flag::INJ);
+
+ sbeMemAccessInterface pbaInterface(
+ SBE_MEM_ACCESS_PBA,
+ req.responseAddr,
+ &l_myPbaFlag,
+ SBE_MEM_ACCESS_WRITE,
+ sbeMemAccessInterface::PBA_GRAN_SIZE_BYTES,
+ l_ex);
+ uint32_t len = req.size;
+ uint64_t *seepromAddr = req.getEffectiveAddr();
+ while( len > 0)
+ {
+ uint64_t *dataBuffer = static_cast<uint64_t*>
+ (pbaInterface.getBuffer());
+ for(size_t idx=0;
+ idx < (sbeMemAccessInterface::PBA_GRAN_SIZE_BYTES/
+ sizeof(uint64_t));
+ idx++)
+ {
+ *dataBuffer = *seepromAddr;
+ dataBuffer++;
+ seepromAddr++;
+ }
+
+ fapi2::ReturnCode fapiRc = pbaInterface.accessGranule(
+ len == sbeMemAccessInterface::PBA_GRAN_SIZE_BYTES);
+ if( fapiRc != fapi2::FAPI2_RC_SUCCESS)
+ {
+ break;
+ }
+ len = len - sbeMemAccessInterface::PBA_GRAN_SIZE_BYTES;
+ }
+ } while(false);
+
+ // Send the response
+ sbePSUSendResponse(SBE_GLOBAL->sbeSbe2PsuRespHdr, fapiRc, rc);
+
+ SBE_EXIT(SBE_FUNC);
+ return rc;
+ #undef SBE_FUNC
+}
#endif //not __SBEFW_SEEPROM__
OpenPOWER on IntegriCloud