diff options
author | Ilya Smirnov <ismirno@us.ibm.com> | 2017-06-15 16:36:10 -0500 |
---|---|---|
committer | Martha Broyles <mbroyles@us.ibm.com> | 2017-06-29 13:14:16 -0400 |
commit | 7adb49aeec6971ff0f3656a73829a793907f5567 (patch) | |
tree | 53f0d179233372cfa58d9a5735fd03c6cdc88dfb | |
parent | 00f6d894363b79e4e38f3f44fa6f78afb43e4f1d (diff) | |
download | talos-occ-7adb49aeec6971ff0f3656a73829a793907f5567.tar.gz talos-occ-7adb49aeec6971ff0f3656a73829a793907f5567.zip |
SBE FIFO: Change set #4
Enabled SCOM code paths that were disabled in p9.
Added SCOM_putScom for putscom operations.
Change-Id: I96b467df39e91531a607e56e70afafd7889d1d6e
RTC:175100
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/41935
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Prachi Gupta <pragupta@us.ibm.com>
Reviewed-by: Zane C. Shelley <zshelle@us.ibm.com>
Reviewed-by: Andres A. Lugo-Reyes <aalugore@us.ibm.com>
Reviewed-by: Martha Broyles <mbroyles@us.ibm.com>
-rw-r--r-- | src/occ_405/firdata/native.c | 6 | ||||
-rw-r--r-- | src/occ_405/firdata/scom_util.c | 26 | ||||
-rw-r--r-- | src/occ_405/firdata/scom_util.h | 13 | ||||
-rw-r--r-- | src/occ_405/scom.c | 86 |
4 files changed, 62 insertions, 69 deletions
diff --git a/src/occ_405/firdata/native.c b/src/occ_405/firdata/native.c index 3d57801..d214468 100644 --- a/src/occ_405/firdata/native.c +++ b/src/occ_405/firdata/native.c @@ -40,14 +40,11 @@ int32_t xscom_read( uint32_t i_address, uint64_t * o_data ) *o_data = 0; -// TODO: RTC 173636 Needs SCOM support. -#if 0 rc = getscom_ffdc( i_address, o_data, NULL ); if ( SUCCESS != rc ) { TRAC_ERR( "SCOM error in xscom_read wrapper, rc=%d", rc ); } -#endif if ( TRACE_XSCOM ) { @@ -62,14 +59,11 @@ int32_t xscom_write( uint32_t i_address, uint64_t i_data ) { int32_t rc = SUCCESS; -// TODO: RTC 173636 Needs SCOM support. -#if 0 rc = putscom_ffdc( i_address, i_data, NULL ); if ( SUCCESS != rc ) { TRAC_ERR( "SCOM error in xscom_write wrapper, rc=%d", rc ); } -#endif if ( TRACE_XSCOM ) { diff --git a/src/occ_405/firdata/scom_util.c b/src/occ_405/firdata/scom_util.c index 432d795..61a7a8e 100644 --- a/src/occ_405/firdata/scom_util.c +++ b/src/occ_405/firdata/scom_util.c @@ -574,3 +574,29 @@ int32_t SCOM_getIdScom( SCOM_Trgt_t i_trgt, uint64_t i_addr, uint32_t * o_val ) #undef FUNC } + +/** + * @brief Executes standard putscom. + * @param i_trgt Chip to SCOM. + * @param i_addr Address to SCOM. + * @param i_val Value to put. + * @return Non-SUCCESS if an internal function fails. SUCCESS otherwise. +*/ +int32_t SCOM_putScom( SCOM_Trgt_t i_trgt, uint32_t i_addr, uint64_t i_val ) +{ + int32_t l_rc = SUCCESS; + + /* Get the parent chip. */ + SCOM_Trgt_t l_chip_targ = SCOM_Trgt_getParentChip(i_trgt); + + /* Get the address relative to the parent chip. */ + uint64_t l_trans_addr; + l_rc = translate_addr( i_trgt, i_addr, &l_trans_addr ); + if ( SUCCESS == l_rc ) + { + /* Do the SCOM. */ + l_rc = putscomraw( l_chip_targ, l_trans_addr, i_val ); + } + + return l_rc; +} diff --git a/src/occ_405/firdata/scom_util.h b/src/occ_405/firdata/scom_util.h index ea0ae49..1ec7fd2 100644 --- a/src/occ_405/firdata/scom_util.h +++ b/src/occ_405/firdata/scom_util.h @@ -1,11 +1,11 @@ /* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ -/* $Source: src/occ/firdata/scom_util.H $ */ +/* $Source: src/occ_405/firdata/scom_util.h $ */ /* */ /* OpenPOWER OnChipController Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2015 */ +/* Contributors Listed Below - COPYRIGHT 2015,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -81,6 +81,14 @@ typedef enum */ int32_t SCOM_getScom( SCOM_Trgt_t i_trgt, uint32_t i_addr, uint64_t * o_val ); +/** @brief Performs a hardware put scom on a regular register. + * @param i_trgt The SCOM target. + * @param i_addr 32-bit SCOM address. + * @param i_val 64-bit value to write to the address. + * @return Non-SUCCESS if the SCOM fails. SUCCESS otherwise. +*/ +int32_t SCOM_putScom( SCOM_Trgt_t i_trgt, uint32_t i_addr, uint64_t i_val ); + /** @brief Performs a hardware scom on an indirect-SCOM register. * @param i_trgt The SCOM target. * @param i_addr 64-bit SCOM address. @@ -88,4 +96,3 @@ int32_t SCOM_getScom( SCOM_Trgt_t i_trgt, uint32_t i_addr, uint64_t * o_val ); * @return Non-SUCCESS if the SCOM fails. SUCCESS otherwise. */ int32_t SCOM_getIdScom( SCOM_Trgt_t i_trgt, uint64_t i_addr, uint32_t * o_val ); - diff --git a/src/occ_405/scom.c b/src/occ_405/scom.c index 7aed750..bda8ac0 100644 --- a/src/occ_405/scom.c +++ b/src/occ_405/scom.c @@ -30,8 +30,7 @@ #include "occ_service_codes.h" #include "occ_sys_config.h" #include "polling.h" - -#define MAX_SCOM_FFDC_RETRIES 1 +#include <scom_util.h> // Function Specification // @@ -44,45 +43,28 @@ // uncomitted error log. // // End Function Specification - -// In P9 we cannot do a scom from the 405. They must be done from a GPE. -#if 0 int getscom_ffdc(uint32_t i_addr, uint64_t* o_data, errlHndl_t* o_errp) { - pmc_o2p_addr_reg_t l_addr; - pmc_o2p_ctrl_status_reg_t l_status; int l_rc; - int l_retries = 0; errlHndl_t l_err = NULL; - while(l_retries <= MAX_SCOM_FFDC_RETRIES) - { - l_rc = _getscom(i_addr, o_data, SCOM_TIMEOUT); - if(!l_rc) - { - break; - } - - //_getscom returns immediately if the o2p interface was busy - //wait to see if busy condition clears up - if(l_rc == -SCOM_PROTOCOL_ERROR_GETSCOM_BUSY) - { - busy_wait(SCOM_TIMEOUT); - } - - l_retries++; - } + //P9 SCOM logic requires a target. However, if we're here, then it doesn't + //matter which target we pass in, so long as isMaster is true. This will + //allow to take the branch of code that schedules GPE scom job. See + //src/occ_405/firdata/scom_util.c for more info. + SCOM_Trgt_t l_tempTarget; + l_tempTarget.type = TRGT_PROC; + l_tempTarget.isMaster = TRUE; + l_tempTarget.procUnitPos = 0; + + l_rc = SCOM_getScom(l_tempTarget, i_addr, o_data); if(l_rc) { //grab additional ffdc - l_status.value = in32(PMC_O2P_CTRL_STATUS_REG); - l_addr.value = in32(PMC_O2P_ADDR_REG); - TRAC_ERR("getscom_ffdc: scom failed. addr[%08x] rc[%08x] o2p_stat[%08x] o2p_addr[%08x]", + TRAC_ERR("getscom_ffdc: scom failed. addr[%08x] rc[%08x]", i_addr, - -l_rc, - l_status.value, - l_addr.value); + -l_rc); /* @ * @errortype @@ -140,40 +122,25 @@ int getscom_ffdc(uint32_t i_addr, uint64_t* o_data, errlHndl_t* o_errp) // End Function Specification int putscom_ffdc(uint32_t i_addr, uint64_t i_data, errlHndl_t* o_errp) { - pmc_o2p_addr_reg_t l_addr; - pmc_o2p_ctrl_status_reg_t l_status; int l_rc; - int l_retries = 0; errlHndl_t l_err = NULL; - while(l_retries <= MAX_SCOM_FFDC_RETRIES) - { - l_rc = _putscom(i_addr, i_data, SCOM_TIMEOUT); - if(!l_rc) - { - break; - } - - //_putscom returns immediately if the o2p interface was busy. Instead, see if - //it cleared after SCOM_TIMEOUT period. - if(l_rc == -SCOM_PROTOCOL_ERROR_PUTSCOM_BUSY) - { - busy_wait(SCOM_TIMEOUT); - } - - l_retries++; - } + //P9 SCOM logic requires a target. However, if we're here, then it doesn't + //matter which target we pass in, so long as isMaster is true. This will + //allow to take the branch of code that schedules GPE scom job. See + //src/occ_405/firdata/scom_util.c for more info. + SCOM_Trgt_t l_tempTarget; + l_tempTarget.type = TRGT_PROC; + l_tempTarget.isMaster = TRUE; + l_tempTarget.procUnitPos = 0; + + l_rc = SCOM_putScom(l_tempTarget, i_addr, i_data); if(l_rc) { - //grab addtional ffdc - l_status.value = in32(PMC_O2P_CTRL_STATUS_REG); - l_addr.value = in32(PMC_O2P_ADDR_REG); - TRAC_ERR("putscom_ffdc: scom failed. addr[%08x] rc[%08x] o2p_stat[%08x] o2p_addr[%08x]", + TRAC_ERR("putscom_ffdc: scom failed. addr[%08x] rc[%08x]", i_addr, - -l_rc, - l_status.value, - l_addr.value); + -l_rc); /* @ * @errortype @@ -213,7 +180,6 @@ int putscom_ffdc(uint32_t i_addr, uint64_t i_data, errlHndl_t* o_errp) commitErrl(&l_err); } } - return l_rc; } -#endif + |