diff options
| author | Matt Derksen <v2cibmd@us.ibm.com> | 2016-04-07 14:51:26 -0500 |
|---|---|---|
| committer | Stephen Cprek <smcprek@us.ibm.com> | 2016-04-21 13:51:57 -0500 |
| commit | 6d2b7d0c32bf12e354be90f0d2cd58572c88d67f (patch) | |
| tree | a1e990a98ff64a8deacb8a8149aaa49262a371ed /src | |
| parent | 1709ac31da9777ddff1c1b08b44d6482dba376d0 (diff) | |
| download | blackbird-hostboot-6d2b7d0c32bf12e354be90f0d2cd58572c88d67f.tar.gz blackbird-hostboot-6d2b7d0c32bf12e354be90f0d2cd58572c88d67f.zip | |
Added platform implementations of fapi2 ring access functions.
fapi2::getRing(), fapi2::modifyRing() and fapi2::putRing().
Change-Id: I50fee8d2b04496e7ae7f0966dabdc53b5524a454
RTC:126630
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/23207
Tested-by: Jenkins Server
Tested-by: FSP CI Jenkins
Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com>
Reviewed-by: William G. Hoffa <wghoffa@us.ibm.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/include/usr/fapi2/plat_hw_access.H | 44 | ||||
| -rw-r--r-- | src/usr/fapi2/plat_hw_access.C | 236 | ||||
| -rw-r--r-- | src/usr/fapi2/test/fapi2HwAccessTest.H | 49 | ||||
| -rw-r--r-- | src/usr/fapi2/test/p9_hwtests.C | 103 | ||||
| -rw-r--r-- | src/usr/fapi2/test/p9_hwtests.H | 20 |
5 files changed, 416 insertions, 36 deletions
diff --git a/src/include/usr/fapi2/plat_hw_access.H b/src/include/usr/fapi2/plat_hw_access.H index d5e76e55c..f4c669fa8 100644 --- a/src/include/usr/fapi2/plat_hw_access.H +++ b/src/include/usr/fapi2/plat_hw_access.H @@ -41,6 +41,7 @@ #include <target.H> #include <target_types.H> #include <hw_access_def.H> +#include <p9_ringId.H> namespace fapi2 { @@ -103,7 +104,6 @@ ReturnCode platGetCfamRegister(const Target<TARGET_TYPE_ALL>& i_target, /// /// @brief Platform-level implementation called by putCfamRegister() /// Hardware procedures writers will not call this function. -/// @Tparam K template parameter, passed in target. /// @param[in] i_target HW target to operate on. /// @param[in] i_address CFAM address to write to. /// @param[out] i_data 32-bit buffer that holds data to write into address. @@ -117,7 +117,6 @@ ReturnCode platPutCfamRegister(const Target<TARGET_TYPE_ALL>& i_target, /// /// @brief Platform-level implementation of modifyCfamRegister() /// Hardware procedures writers will not call this function. -/// @Tparam K template parameter, passed in target. /// @param[in] i_target HW target to operate on. /// @param[in] i_address CFAM register address to modify. /// @param[out] i_data 32-bit buffer that holds data to modify. @@ -129,25 +128,20 @@ ReturnCode platModifyCfamRegister(const Target<TARGET_TYPE_ALL>& i_target, const buffer<uint32_t> i_data, const fapi2::ChipOpModifyMode i_modifyMode); -//@TODO RTC:126630 getRing is not yet supported -#if 0 /// @brief Reads a ring from a chip. -/// @tparam K template parameter, passed in target. /// @param[in] i_target Target to operate on. /// @param[in] i_address Ring address to read from. /// @param[out] o_data Buffer that holds data read from HW target. /// @param[in] i_ringMode Ring operation mode. /// @return fapi2::ReturnCode. FAPI2_RC_SUCCESS if success, else error code. -template< TargetType K > -inline ReturnCode getRing(const Target<K>& i_target, - const scanRingId_t i_address, - variable_buffer& o_data, - const RingMode i_ringMode = 0); +ReturnCode platGetRing(const Target<TARGET_TYPE_ALL>& i_target, + const scanRingId_t i_address, + variable_buffer& o_data, + const RingMode i_ringMode); /// @brief Read-modify-write a ring on a chip. -/// @tparam K template parameter, passed in target. /// @param[in] i_target Target to operate on. /// @param[in] i_address Ring address to modify. /// @param[in] i_data Buffer that contains RS4 compressed ring data @@ -155,14 +149,34 @@ inline ReturnCode getRing(const Target<K>& i_target, /// @param[in] i_modifyMode The modify mode (or/and/xor) /// @param[in] i_ringMode Ring operation mode. /// @return fapi2::ReturnCode. FAPI2_RC_SUCCESS if success, else error code. -template< TargetType K > -inline ReturnCode modifyRing(const Target<K>& i_target, +ReturnCode platModifyRing(const Target<TARGET_TYPE_ALL>& i_target, const scanRingId_t i_address, const variable_buffer& i_data, const ChipOpModifyMode i_modifyMode, - const RingMode i_ringMode = 0); + const RingMode i_ringMode); + -#endif // End if 0 +// This will be used in future Cumulus code +/// @brief Write a ring on a chip. +/// @param[in] i_target Target to operate on. +/// @param[in] i_address Ring address to modify. +/// @param[in] i_data Buffer that contains RS4 compressed ring data +/// to be written +/// @param[in] i_ringMode Ring operation mode. +/// @return fapi2::ReturnCode. FAPI2_RC_SUCCESS if success, else error code. +ReturnCode platPutRing(const Target<TARGET_TYPE_ALL>& i_target, + const scanRingId_t i_address, + variable_buffer& i_data, + const RingMode i_ringMode); + +/// @brief Writes a ring to a chip. +/// @param[in] i_target Target to operate on. +/// @param[in] i_ringID Ring ID that will identify the Ring in the image. +/// @param[in] i_ringMode Ring operation mode. +/// @return fapi2::ReturnCode. FAPI2_RC_SUCCESS if success, else error code. +ReturnCode platPutRing(const Target<TARGET_TYPE_ALL>& i_target, + const RingID i_ringID, + const RingMode i_ringMode); // -------------------------------------------------------------------------- // NOTE: diff --git a/src/usr/fapi2/plat_hw_access.C b/src/usr/fapi2/plat_hw_access.C index 367aea566..07e4c2a7c 100644 --- a/src/usr/fapi2/plat_hw_access.C +++ b/src/usr/fapi2/plat_hw_access.C @@ -39,9 +39,9 @@ #include <hwpf_fapi2_reasoncodes.H> #include <fapi2/plat_hw_access.H> -//@TODO-RTC:144504-Remove when the attribute shows up -//just use an existing string type for now -#define ATTR_FAPI_NAME_type ATTR_OPAL_MODEL_type +#include <scan/scanif.H> +#include <hw_access_def.H> + namespace fapi2 { @@ -52,6 +52,9 @@ const uint32_t CFAM_ADDRESS_MASK = 0x1FF; // Bits 0-6 are engine offset const uint32_t CFAM_ENGINE_OFFSET = 0xFE00; +// Function prototypes +uint64_t platGetDDScanMode(const uint32_t i_ringMode); + //------------------------------------------------------------------------------ // HW Communication Functions to be implemented at the platform layer. //------------------------------------------------------------------------------ @@ -616,17 +619,18 @@ ReturnCode platModifyCfamRegister(const Target<TARGET_TYPE_ALL>& i_target, return l_rc; } -//@TODO RTC:126630 getRing is not yet supported - -#if 0 - -/// @brief Platform-level implementation called by fapiGetRing() +/// @brief Platform-level implementation called by getRing() ReturnCode platGetRing(const Target<TARGET_TYPE_ALL>& i_target, const scanRingId_t i_address, variable_buffer& o_data, const RingMode i_ringMode) { FAPI_DBG(ENTER_MRK "platGetRing"); + + // Note: Trace is placed here in plat code because PPE doesn't support + // trace in common fapi2_hw_access.H + bool l_traceit = platIsScanTraceEnabled(); + ReturnCode l_rc; errlHndl_t l_err = NULL; @@ -634,42 +638,234 @@ ReturnCode platGetRing(const Target<TARGET_TYPE_ALL>& i_target, TARGETING::Target* l_target = reinterpret_cast<TARGETING::Target*>(i_target.get()); + // Grab the name of the target + TARGETING::ATTR_FAPI_NAME_type l_targName = {0}; + fapi2::toString(i_target, l_targName, sizeof(l_targName)); + // Output buffer must be set to ring's len by user uint64_t l_ringLen = o_data.getBitLength(); uint64_t l_flag = platGetDDScanMode(i_ringMode); - size_t l_size = o_data.getByteLength(); + size_t l_size = o_data.getLength<uint8_t>(); l_err = deviceRead(l_target, - ecmdDataBufferBaseImplementationHelper::getDataPtr(&o_data), - l_size, - DEVICE_SCAN_ADDRESS(i_address, l_ringLen, l_flag)); + o_data.pointer(), + l_size, + DEVICE_SCAN_ADDRESS(i_address, l_ringLen, l_flag)); if (l_err) { + FAPI_ERR("platGetRing: deviceRead returns error!"); + FAPI_ERR("fapiGetRing failed - Target %s, Addr %.16llX", + l_targName, i_address); l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_err)); } + if (l_traceit) + { + uint64_t l_data = o_data.get<uint64_t>(); + FAPI_SCAN("TRACE : GETRING : %s : %.16llX %.16llX", + l_targName, + i_address, + l_data); + } + FAPI_DBG(EXIT_MRK "platGetRing"); return l_rc; } -/// @brief Platform-level implementation called by fapiPutRing() +// This will be used in future Cumulus code +/// @brief Platform-level implementation called by putRing() inline ReturnCode platPutRing(const Target<TARGET_TYPE_ALL>& i_target, const scanRingId_t i_address, variable_buffer& i_data, const RingMode i_ringMode) { + FAPI_DBG(ENTER_MRK "platPutRing"); + ReturnCode l_rc; + errlHndl_t l_err = NULL; + + // Note: Trace is placed here in plat code because PPE doesn't support + // trace in common fapi2_hw_access.H + bool l_traceit = platIsScanTraceEnabled(); + + // Extract the component pointer + TARGETING::Target* l_target = + reinterpret_cast<TARGETING::Target*>(i_target.get()); + + // Grab the name of the target + TARGETING::ATTR_FAPI_NAME_type l_targName = {0}; + fapi2::toString(i_target, l_targName, sizeof(l_targName)); + + // Output buffer must be set to ring's len by user + uint64_t l_ringLen = i_data.getBitLength(); + uint64_t l_flag = platGetDDScanMode(i_ringMode); + size_t l_size = i_data.getLength<uint8_t>(); + l_err = deviceWrite(l_target, + i_data.pointer(), + l_size, + DEVICE_SCAN_ADDRESS(i_address, l_ringLen, l_flag)); + if (l_err) + { + FAPI_ERR("platPutRing: deviceRead returns error!"); + FAPI_ERR("fapiPutRing failed - Target %s, Addr %.16llX", + l_targName, i_address); + // Add the error log pointer as data to the ReturnCode + l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_err)); + } + + if (l_traceit) + { + uint64_t l_data = i_data.get<uint64_t>(); + FAPI_SCAN("TRACE : PUTRING : %s : %.16llX %.16llX", + l_targName, + i_address, + l_data); + } + + FAPI_DBG(EXIT_MRK "platPutRing"); + return l_rc; +} + + +/// @brief Platform-level implementation called by modifyRing() +ReturnCode platModifyRing(const Target<TARGET_TYPE_ALL>& i_target, + const scanRingId_t i_address, + const variable_buffer& i_data, + const ChipOpModifyMode i_modifyMode, + const RingMode i_ringMode) +{ + FAPI_DBG(ENTER_MRK "platModifyRing"); + ReturnCode l_rc; + errlHndl_t l_err = NULL; + variable_buffer l_current_data(i_data); + + // Note: Trace is placed here in plat code because PPE doesn't support + // trace in common fapi2_hw_access.H + bool l_traceit = platIsScanTraceEnabled(); + + // Grab the name of the target + TARGETING::ATTR_FAPI_NAME_type l_targName = {0}; + fapi2::toString(i_target, l_targName, sizeof(l_targName)); + + do + { + // Extract the component pointer + TARGETING::Target* l_target = + reinterpret_cast<TARGETING::Target*>(i_target.get()); + + // -------------------- + // Read current value + // -------------------- + uint64_t l_ringLen = l_current_data.getBitLength(); + uint64_t l_flag = platGetDDScanMode(i_ringMode); + size_t l_size = l_current_data.getLength<uint8_t>(); + l_err = deviceRead(l_target, + l_current_data.pointer(), + l_size, + DEVICE_SCAN_ADDRESS(i_address, l_ringLen, l_flag)); + if (l_err) + { + FAPI_ERR("platModifyRing: deviceRead returns error!"); + FAPI_ERR("platModifyRing failed - Target %s, Addr %.16llX", + l_targName, i_address); + + // Add the error log pointer as data to the ReturnCode + l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_err)); + + // break out if read fails + break; + } + + // ---------------------- + // Applying modification + // ---------------------- + /* TODO-RTC:151261 - re-enable when variable_buffer operations supported + if (fapi2::CHIP_OP_MODIFY_MODE_OR == i_modifyMode) + { + l_current_data |= i_data; + } + else if (fapi2::CHIP_OP_MODIFY_MODE_AND == i_modifyMode) + { + l_current_data &= i_data; + } + else + { + l_current_data ^= i_data; + } */ + + + // ------------------------- + // Write back updated data + // ------------------------- + l_err = deviceWrite(l_target, + l_current_data.pointer(), + l_size, + DEVICE_SCAN_ADDRESS(i_address, l_ringLen, l_flag)); + if (l_err) + { + FAPI_ERR("platModifyRing: deviceWrite returns error!"); + FAPI_ERR("platModifyRing failed - Target %s, Addr %.16llX", + l_targName, i_address); + // Add the error log pointer as data to the ReturnCode + l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_err)); + break; + } + + } while (0); + + if (l_traceit) + { + uint64_t l_data = l_current_data.get<uint64_t>(); + FAPI_SCAN("TRACE : MODIFYRING : %s : %.16llX %.16llX", + l_targName, + i_address, + l_data); + } + FAPI_DBG(EXIT_MRK "platModifyRing"); + return l_rc; } -/// @brief Platform-level implementation called by fapiModifyRing() -ReturnCode modifyRing(const Target<TARGET_TYPE_ALL>& i_target, - const scanRingId_t i_address, - variable_buffer& i_data, - const ChipOpModifyMode i_modifyMode, - const RingMode i_ringMode = 0) + +ReturnCode platPutRing(const Target<TARGET_TYPE_ALL>& i_target, + const RingID i_ringID, + const RingMode i_ringMode) { + FAPI_DBG(ENTER_MRK "platPutRing with RingID"); + ReturnCode l_rc; + + // TODO-RTC:132654:Use SBE to drive scans + + FAPI_DBG(EXIT_MRK "platPutRing with RingID"); + return l_rc; } -#endif // End if 0 +//****************************************************************************** +// platGetDDScanMode function +//****************************************************************************** +uint64_t platGetDDScanMode(const uint32_t i_ringMode) +{ + uint32_t l_scanMode = 0; + + if ( ((i_ringMode & fapi2::RING_MODE_SET_PULSE_NO_OPCG_COND) == + fapi2::RING_MODE_SET_PULSE_NO_OPCG_COND) || + ((i_ringMode & fapi2::RING_MODE_SET_PULSE_NSL) == + fapi2::RING_MODE_SET_PULSE_NSL) || + ((i_ringMode & fapi2::RING_MODE_SET_PULSE_SL) == + fapi2::RING_MODE_SET_PULSE_SL) || + ((i_ringMode & fapi2::RING_MODE_SET_PULSE_ALL) == + fapi2::RING_MODE_SET_PULSE_ALL) ) + { + l_scanMode |= SCAN::SET_PULSE; + } + + // Header Check + if ((i_ringMode & fapi2::RING_MODE_NO_HEADER_CHECK) == + fapi2::RING_MODE_NO_HEADER_CHECK ) + { + l_scanMode |= SCAN::NO_HEADER_CHECK; + } + + return l_scanMode; +} // -------------------------------------------------------------------------- // NOTE: diff --git a/src/usr/fapi2/test/fapi2HwAccessTest.H b/src/usr/fapi2/test/fapi2HwAccessTest.H index 626992fc3..8d7422f7f 100644 --- a/src/usr/fapi2/test/fapi2HwAccessTest.H +++ b/src/usr/fapi2/test/fapi2HwAccessTest.H @@ -157,6 +157,53 @@ void test_fapi2HwAccess() delete l_errl; // delete unexpected error log so we dont get // a false negative on the next case (future?) } + + numTests++; + FAPI_INVOKE_HWP(l_errl, p9_ringtest_getring_fail, fapi2_procTarget); + if(l_errl != NULL) + { + delete l_errl; // delete expected error log + } + else + { + TS_FAIL("No error from p9_ringtest_getring_fail !!"); + numFails++; + } + numTests++; + FAPI_INVOKE_HWP(l_errl, p9_ringtest_modring_fail, fapi2_procTarget); + if(l_errl != NULL) + { + delete l_errl; // delete expected error log + } + else + { + TS_FAIL("No error from p9_ringtest_modring_fail!!"); + numFails++; + } + +#if 0 // TODO-RTC:151428 - need simics support for these to pass + numTests++; + FAPI_INVOKE_HWP(l_errl, p9_ringtest_getring_pass, fapi2_procTarget); + if (l_errl) + { + TS_FAIL("Error from p9_ringtest_getring_pass!!"); + numFails++; + errlCommit(l_errl,FAPI2_COMP_ID); + delete l_errl; // delete unexpected error log so we dont get + // a false negative on the next case + } + numTests++; + FAPI_INVOKE_HWP(l_errl, p9_ringtest_modring_pass, fapi2_procTarget); + if (l_errl) + { + TS_FAIL("Error from p9_ringtest_modring_pass!!"); + numFails++; + errlCommit(l_errl,FAPI2_COMP_ID); + delete l_errl; // delete unexpected error log so we dont get + // a false negative on the next case + } +#endif + }while(0); FAPI_INF("fapi2HwAccessTest Test Complete. %d/%d fails", numFails , numTests); @@ -165,4 +212,4 @@ void test_fapi2HwAccess() }; -#endif // End __FAPI2_HWACCESSTEST_H
\ No newline at end of file +#endif // End __FAPI2_HWACCESSTEST_H diff --git a/src/usr/fapi2/test/p9_hwtests.C b/src/usr/fapi2/test/p9_hwtests.C index 2f066aa4e..c5e0322db 100644 --- a/src/usr/fapi2/test/p9_hwtests.C +++ b/src/usr/fapi2/test/p9_hwtests.C @@ -29,6 +29,7 @@ //----------------------------------------------------------------------------- #include <fapi2.H> +#include <fapi2_hw_access.H> fapi2::ReturnCode p9_scomtest_getscom_fail( @@ -91,6 +92,7 @@ fapi2::ReturnCode p9_cfamtest_getcfam_fail( } + fapi2::ReturnCode p9_cfamtest_putcfam_fail( fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target) { @@ -111,6 +113,7 @@ fapi2::ReturnCode p9_cfamtest_putcfam_fail( } + fapi2::ReturnCode p9_scomtest_getscom_pass( fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target) { @@ -190,3 +193,103 @@ fapi2::ReturnCode p9_cfamtest_putcfam_pass( return fapi2::current_err; } + + +fapi2::ReturnCode p9_ringtest_getring_fail( + fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target) +{ + fapi2::variable_buffer l_ringdata; + + FAPI_INF("Entering p9_ringtest_getring_fail..."); + + FAPI_INF("Do getring on proc target"); + FAPI_TRY(fapi2::getRing(i_target, + (scanRingId_t)(0x22334455), + l_ringdata, + fapi2::RING_MODE_HEADER_CHECK)); + + fapi_try_exit: + + FAPI_INF("Exiting p9_ringtest_getring_fail..."); + + return fapi2::current_err; + +} + + +fapi2::ReturnCode p9_ringtest_modring_fail( + fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target) +{ + fapi2::variable_buffer l_ringdata; + l_ringdata.resize(861); + + FAPI_INF("Entering p9_ringtest_modring_fail..."); + + FAPI_INF("Do modifyRing on proc target"); + FAPI_TRY(fapi2::modifyRing(i_target, + (scanRingId_t)0x22334455, + l_ringdata, + fapi2::CHIP_OP_MODIFY_MODE_OR, + fapi2::RING_MODE_HEADER_CHECK)); + + fapi_try_exit: + + FAPI_INF("Exiting p9_ringtest_modring_fail..."); + + return fapi2::current_err; + +} + + +fapi2::ReturnCode p9_ringtest_getring_pass( + fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target) +{ + fapi2::variable_buffer l_ringdata; + l_ringdata.resize(861); + + FAPI_INF("Entering p9_ringtest_getring_pass..."); + + FAPI_INF("Do getring on proc target"); + FAPI_TRY(fapi2::getRing(i_target, + (scanRingId_t)0x00030088, + l_ringdata, + fapi2::RING_MODE_HEADER_CHECK)); + + fapi_try_exit: + + FAPI_INF("Exiting p9_ringtest_getring_pass..."); + + return fapi2::current_err; + +} + + +fapi2::ReturnCode p9_ringtest_modring_pass( + fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target) +{ + uint32_t bit32_array[861]; + uint32_t length; + + for (length = 0; length < 861; length++) + { + bit32_array[length] = length; + } + + fapi2::variable_buffer l_ringdata(bit32_array, length, 32 * 861); + + FAPI_INF("Entering p9_ringtest_modring_pass..."); + + FAPI_INF("Do putring on proc target"); + FAPI_TRY(fapi2::modifyRing(i_target, + (scanRingId_t)0x00030088, + l_ringdata, + fapi2::CHIP_OP_MODIFY_MODE_OR, + fapi2::RING_MODE_HEADER_CHECK)); + + fapi_try_exit: + + FAPI_INF("Exiting p9_ringtest_modring_pass..."); + + return fapi2::current_err; + +} diff --git a/src/usr/fapi2/test/p9_hwtests.H b/src/usr/fapi2/test/p9_hwtests.H index 9143e2a64..40ba3d06b 100644 --- a/src/usr/fapi2/test/p9_hwtests.H +++ b/src/usr/fapi2/test/p9_hwtests.H @@ -48,6 +48,15 @@ fapi2::ReturnCode p9_cfamtest_putcfam_fail( fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target); +fapi2::ReturnCode p9_ringtest_getring_fail( + fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target); + + +fapi2::ReturnCode p9_ringtest_modring_fail( + fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target); + + + fapi2::ReturnCode p9_scomtest_getscom_pass( fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target); @@ -64,4 +73,15 @@ fapi2::ReturnCode p9_cfamtest_putcfam_pass( fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target); +///////////// +// +// TODO-RTC:151428 - need simics support for these ring functions to pass +// +fapi2::ReturnCode p9_ringtest_getring_pass( + fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target); + +fapi2::ReturnCode p9_ringtest_modring_pass( + fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target); +///////////// + #endif |

