diff options
Diffstat (limited to 'src/import/chips/ocmb/explorer/procedures/hwp/memory/exp_omi_init.C')
-rw-r--r-- | src/import/chips/ocmb/explorer/procedures/hwp/memory/exp_omi_init.C | 650 |
1 files changed, 650 insertions, 0 deletions
diff --git a/src/import/chips/ocmb/explorer/procedures/hwp/memory/exp_omi_init.C b/src/import/chips/ocmb/explorer/procedures/hwp/memory/exp_omi_init.C index 2dabce66b..0620d2ba5 100644 --- a/src/import/chips/ocmb/explorer/procedures/hwp/memory/exp_omi_init.C +++ b/src/import/chips/ocmb/explorer/procedures/hwp/memory/exp_omi_init.C @@ -31,3 +31,653 @@ // *HWP Team: // *HWP Level: 2 // *HWP Consumed by: HB + +#include <exp_omi_init.H> +#include <exp_oc_regs.H> +#include <exp_inband.H> +#include <chips/common/utils/chipids.H> + +/// +/// @brief Verify we know how to talk to the connected device +/// +/// @param[in] i_target Explorer to initialize +/// +/// @return fapi2:ReturnCode. FAPI2_RC_SUCCESS if success, else error code. +/// +fapi2::ReturnCode omiDeviceVerify(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target) +{ + FAPI_DBG("Start"); + fapi2::buffer<uint32_t> l_data; + + FAPI_TRY(mss::exp::ib::getOCCfg(i_target, EXPLR_OC_O0MBIT_O0DID_LSB, l_data)); + + FAPI_ASSERT(l_data == ((POWER_OCID::EXPLORER << 16) | (POWER_OCID::VENDOR_IBM)), + fapi2::OCMB_IS_NOT_EXPLORER() + .set_TARGET(i_target) + .set_ID(l_data), + "Explorer ID was not found"); + +fapi_try_exit: + + FAPI_DBG("Exiting with return code : 0x%08X...", (uint64_t) fapi2::current_err); + return fapi2::current_err; +} + + +/// +/// @brief Set the upstream templates and pacing +/// +/// @param[in] i_target Explorer to initialize +/// +/// @return fapi2:ReturnCode. FAPI2_RC_SUCCESS if success, else error code. +/// +fapi2::ReturnCode omiSetUpstreamTemplates(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target) +{ + //Expected dnstream 0,1,4 to OCMB + //Expected upstream 0,5,9 to Axone + fapi2::buffer<uint32_t> l_data; + fapi2::ATTR_EXPLR_ENABLE_US_TMPL_1_Type l_enable_tmpl_1; + fapi2::ATTR_EXPLR_ENABLE_US_TMPL_5_Type l_enable_tmpl_5; + fapi2::ATTR_EXPLR_ENABLE_US_TMPL_9_Type l_enable_tmpl_9; + fapi2::ATTR_EXPLR_ENABLE_US_TMPL_B_Type l_enable_tmpl_B; + fapi2::ATTR_EXPLR_TMPL_0_PACING_Type l_tmpl_0_pacing; + fapi2::ATTR_EXPLR_TMPL_1_PACING_Type l_tmpl_1_pacing; + fapi2::ATTR_EXPLR_TMPL_5_PACING_Type l_tmpl_5_pacing; + fapi2::ATTR_EXPLR_TMPL_9_PACING_Type l_tmpl_9_pacing; + fapi2::ATTR_EXPLR_TMPL_B_PACING_Type l_tmpl_B_pacing; + + fapi2::ATTR_CHIP_EC_FEATURE_US_TEMPLATES_0159_Type l_us_only_0159; + + auto const& l_proc = i_target.getParent<fapi2::TARGET_TYPE_OMI>() + .getParent<fapi2::TARGET_TYPE_PROC_CHIP>(); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_EC_FEATURE_US_TEMPLATES_0159, + l_proc, + l_us_only_0159), + "Error from FAPI_ATTR_GET (ATTR_CHIP_EC_FEATURE_US_TEMPLATES_0159)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_EXPLR_ENABLE_US_TMPL_1, + i_target, + l_enable_tmpl_1), + "Error from FAPI_ATTR_GET (ATTR_EXPLR_ENABLE_US_TMPL_1)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_EXPLR_ENABLE_US_TMPL_5, + i_target, + l_enable_tmpl_5), + "Error from FAPI_ATTR_GET (ATTR_EXPLR_ENABLE_US_TMPL_5)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_EXPLR_ENABLE_US_TMPL_9, + i_target, + l_enable_tmpl_9), + "Error from FAPI_ATTR_GET (ATTR_EXPLR_ENABLE_US_TMPL_9)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_EXPLR_ENABLE_US_TMPL_B, + i_target, + l_enable_tmpl_B), + "Error from FAPI_ATTR_GET (ATTR_EXPLR_ENABLE_US_TMPL_B)"); + + FAPI_ASSERT(!l_us_only_0159 || !l_enable_tmpl_B, + fapi2::PROC_DOES_NOT_SUPPORT_US_B() + .set_TARGET(l_proc) + .set_B(l_enable_tmpl_B), + "Upstream template B requested, but not supported by proc"); + + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_EXPLR_TMPL_0_PACING, + i_target, + l_tmpl_0_pacing), + "Error from FAPI_ATTR_GET (ATTR_EXPLR_TMPL_0_PACING)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_EXPLR_TMPL_1_PACING, + i_target, + l_tmpl_1_pacing), + "Error from FAPI_ATTR_GET (ATTR_EXPLR_TMPL_1_PACING)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_EXPLR_TMPL_5_PACING, + i_target, + l_tmpl_5_pacing), + "Error from FAPI_ATTR_GET (ATTR_EXPLR_TMPL_5_PACING)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_EXPLR_TMPL_9_PACING, + i_target, + l_tmpl_9_pacing), + "Error from FAPI_ATTR_GET (ATTR_EXPLR_TMPL_9_PACING)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_EXPLR_TMPL_B_PACING, + i_target, + l_tmpl_B_pacing), + "Error from FAPI_ATTR_GET (ATTR_EXPLR_TMPL_B_PACING)"); + + + l_data.setBit<EXPLR_OC_OTTCFG_MSB_TEMPLATE_0>(); //Template 0 + + l_data.writeBit<EXPLR_OC_OTTCFG_MSB_TEMPLATE_1> + (l_enable_tmpl_1 == fapi2::ENUM_ATTR_EXPLR_ENABLE_US_TMPL_1_ENABLED); //Template 1 + l_data.writeBit<EXPLR_OC_OTTCFG_MSB_TEMPLATE_5> + (l_enable_tmpl_5 == fapi2::ENUM_ATTR_EXPLR_ENABLE_US_TMPL_5_ENABLED); //Template 5 + l_data.writeBit<EXPLR_OC_OTTCFG_MSB_TEMPLATE_9> + (l_enable_tmpl_9 == fapi2::ENUM_ATTR_EXPLR_ENABLE_US_TMPL_9_ENABLED); //Template 9 + l_data.writeBit<EXPLR_OC_OTTCFG_MSB_TEMPLATE_11> + (l_enable_tmpl_B == fapi2::ENUM_ATTR_EXPLR_ENABLE_US_TMPL_B_ENABLED); //Template B + + + FAPI_TRY(mss::exp::ib::putOCCfg(i_target, EXPLR_OC_OTTCFG_MSB, l_data)); + + //Update template pacing + l_data.flush<0>(); + l_data.insertFromRight<EXPLR_OC_OTRCFG76_MSB_TEMPLATE_0, + EXPLR_OC_OTRCFG76_MSB_TEMPLATE_0_LEN>(l_tmpl_0_pacing); + FAPI_DBG("Upstream template 0 enabled with pacing %X", l_tmpl_0_pacing); + + if (l_enable_tmpl_1 == fapi2::ENUM_ATTR_EXPLR_ENABLE_US_TMPL_1_ENABLED) + { + l_data.insertFromRight<EXPLR_OC_OTRCFG76_MSB_TEMPLATE_1, + EXPLR_OC_OTRCFG76_MSB_TEMPLATE_1_LEN>(l_tmpl_1_pacing); + FAPI_DBG("WARNING Upstream template 1 enabled with pacing %X", l_tmpl_1_pacing); + } + + if (l_enable_tmpl_5 == fapi2::ENUM_ATTR_EXPLR_ENABLE_US_TMPL_5_ENABLED) + { + l_data.insertFromRight<EXPLR_OC_OTRCFG76_MSB_TEMPLATE_5, + EXPLR_OC_OTRCFG76_MSB_TEMPLATE_5_LEN>(l_tmpl_5_pacing); + FAPI_DBG("Upstream template 5 enabled with pacing %X", l_tmpl_5_pacing); + } + + FAPI_TRY(mss::exp::ib::putOCCfg(i_target, EXPLR_OC_OTRCFG76_MSB, l_data)); + + l_data.flush<0>(); + + if (l_enable_tmpl_9 == fapi2::ENUM_ATTR_EXPLR_ENABLE_US_TMPL_9_ENABLED) + { + l_data.insertFromRight<EXPLR_OC_OTRCFG76_LSB_TEMPLATE_9, + EXPLR_OC_OTRCFG76_LSB_TEMPLATE_9_LEN>(l_tmpl_9_pacing); + FAPI_DBG("Upstream template 9 enabled with pacing %X", l_tmpl_9_pacing); + } + + if (l_enable_tmpl_B == fapi2::ENUM_ATTR_EXPLR_ENABLE_US_TMPL_B_ENABLED) + { + l_data.insertFromRight<EXPLR_OC_OTRCFG76_LSB_TEMPLATE_11, + EXPLR_OC_OTRCFG76_LSB_TEMPLATE_11_LEN>(l_tmpl_B_pacing); + FAPI_DBG("Upstream template B enabled with pacing %X", l_tmpl_B_pacing); + } + + FAPI_TRY(mss::exp::ib::putOCCfg(i_target, EXPLR_OC_OTRCFG76_LSB, l_data)); + +fapi_try_exit: + + FAPI_DBG("Exiting with return code : 0x%08X...", (uint64_t) fapi2::current_err); + return fapi2::current_err; +} + + +/// +/// @brief Set the major minor version and short back-off timer values. +/// +/// @param[in] i_target Explorer to initialize +/// +/// @return fapi2:ReturnCode. FAPI2_RC_SUCCESS if success, else error code. +/// +fapi2::ReturnCode omiTLVersionShortBackOff(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target) +{ + fapi2::buffer<uint32_t> l_data; + fapi2::buffer<uint8_t> l_short_backoff; + fapi2::ATTR_PROC_OMI_OC_MAJOR_VER_Type l_proc_oc_major; + fapi2::ATTR_PROC_OMI_OC_MINOR_VER_Type l_proc_oc_minor; + + auto const& l_proc = i_target.getParent<fapi2::TARGET_TYPE_OMI>() + .getParent<fapi2::TARGET_TYPE_PROC_CHIP>(); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_EXPLR_SHRT_BACKOFF_TIMER, + i_target, + l_short_backoff), + "Error from FAPI_ATTR_GET (ATTR_EXPLR_SHRT_BACKOFF_TIMER)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_OMI_OC_MAJOR_VER, + l_proc, + l_proc_oc_major), + "Error from FAPI_ATTR_GET (ATTR_PROC_OMI_OC_MAJOR_VER)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_OMI_OC_MINOR_VER, + l_proc, + l_proc_oc_minor), + "Error from FAPI_ATTR_GET (ATTR_PROC_OMI_OC_MINOR_VER)"); + + + //Write proc's supported OC version + l_data.insertFromRight<EXPLR_OC_OVERCFG_LSB_TL_MAJOR_VERSION_CONFIGURATION, + EXPLR_OC_OVERCFG_LSB_TL_MAJOR_VERSION_CONFIGURATION_LEN>(l_proc_oc_major); + l_data.insertFromRight<EXPLR_OC_OVERCFG_LSB_TL_MINOR_VERSION_CONFIGURATION, + EXPLR_OC_OVERCFG_LSB_TL_MINOR_VERSION_CONFIGURATION_LEN>(l_proc_oc_minor); + + //Short back-off timer + l_data.insertFromRight<EXPLR_OC_OVERCFG_LSB_SHORT_BACK_OFF_TIMER, + EXPLR_OC_OVERCFG_LSB_SHORT_BACK_OFF_TIMER_LEN>(l_short_backoff); + + FAPI_TRY(mss::exp::ib::putOCCfg(i_target, EXPLR_OC_OVERCFG_LSB, l_data)); + +fapi_try_exit: + + FAPI_DBG("Exiting with return code : 0x%08X...", (uint64_t) fapi2::current_err); + return fapi2::current_err; +} + + +/// +/// @brief Check if a bit/feature is supported if we want to use it. +/// +/// @param[in] i_data Register data to check +/// @param[in] i_offset Offset in register value starts +/// @param[in] i_useFeature Do we want to use this feature +/// @param[in] i_warn Warning message to display if reg value does not match attribute +/// @param[out] o_val Value to use +/// +/// @return fapi2::ReturnCode Success if no errors +/// +fapi2::ReturnCode omiCheckSupportedBit(const fapi2::buffer<uint32_t>& i_data, const uint32_t i_offset, + const uint8_t i_useFeature, const char* i_warn, uint8_t& o_val) +{ + uint8_t l_supported = 0; + o_val = i_useFeature; + FAPI_TRY(i_data.extractToRight<uint8_t>(l_supported, i_offset, 1)); + + if (i_useFeature != 0 && l_supported == 0) + { + //This feature is not supported by the hardware even though we requested it + FAPI_ERR("%s", i_warn); + o_val = 0; + } + +fapi_try_exit: + FAPI_ERR("extractToRight failed return code : 0x%08X", (uint64_t) fapi2::current_err); + return fapi2::current_err; +} + +/// +/// @brief Check if the requested pacing for a template is supported +/// +/// @param[in] i_data Register data to check +/// @param[in] i_offset Offset in register value starts +/// @param[in] i_len The length of the pacing field +/// @param[in] i_usePace The desired pacing value +/// @param[in] i_warn Warning message to display if reg value does not match attribute +/// @param[out] o_val The pacing value to use +/// +/// @return fapi2::ReturnCode Success if no errors +/// +fapi2::ReturnCode omiCheckSupportedPacing(const fapi2::buffer<uint32_t>& i_data, const uint32_t i_offset, + const uint32_t i_len, const uint8_t i_usePace, const char* i_warn, uint8_t& o_val) +{ + uint8_t l_supported = 0; + o_val = i_usePace; + FAPI_TRY(i_data.extractToRight<uint8_t>(l_supported, i_offset, i_len)); + + if (i_usePace < l_supported) + { + //This pacing is not supported by the hardware + FAPI_ERR("%s", i_warn); + o_val = l_supported; + } + +fapi_try_exit: + FAPI_ERR("extractToRight failed return code : 0x%08X", (uint64_t) fapi2::current_err); + return fapi2::current_err; +} + +/// +/// @brief Validate downstream receive templates +/// +/// @param[in] i_target Explorer to initialize +/// +/// @return fapi2:ReturnCode. FAPI2_RC_SUCCESS if success, else error code. +/// +fapi2::ReturnCode omiValidateDownstream(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target) +{ + //Expected dnstream 0,1,4 to OCMB + //Expected upstream 0,5,9 to Axone + fapi2::buffer<uint32_t> l_data; + fapi2::ATTR_PROC_ENABLE_DL_TMPL_1_Type l_enable_tmpl_1; + fapi2::ATTR_PROC_ENABLE_DL_TMPL_4_Type l_enable_tmpl_4; + fapi2::ATTR_PROC_ENABLE_DL_TMPL_7_Type l_enable_tmpl_7; + fapi2::ATTR_PROC_ENABLE_DL_TMPL_A_Type l_enable_tmpl_A; + fapi2::ATTR_PROC_TMPL_0_PACING_Type l_tmpl_0_pace; + fapi2::ATTR_PROC_TMPL_1_PACING_Type l_tmpl_1_pace; + fapi2::ATTR_PROC_TMPL_4_PACING_Type l_tmpl_4_pace; + fapi2::ATTR_PROC_TMPL_7_PACING_Type l_tmpl_7_pace; + fapi2::ATTR_PROC_TMPL_A_PACING_Type l_tmpl_A_pace; + uint8_t l_tmp = 0x0; + + fapi2::ATTR_CHIP_EC_FEATURE_DS_TEMPLATES_0147_Type l_ds_only_0147; + + const auto& l_proc = i_target.getParent<fapi2::TARGET_TYPE_OMI>() + .getParent<fapi2::TARGET_TYPE_PROC_CHIP>(); + + const auto& l_mcc_target = i_target.getParent<fapi2::TARGET_TYPE_OMI>() + .getParent<fapi2::TARGET_TYPE_MCC>(); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_EC_FEATURE_DS_TEMPLATES_0147, + l_proc, + l_ds_only_0147), + "Error from FAPI_ATTR_GET (ATTR_CHIP_EC_FEATURE_DS_TEMPLATES_0147)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_ENABLE_DL_TMPL_1, + l_mcc_target, + l_enable_tmpl_1), + "Error from FAPI_ATTR_GET (ATTR_PROC_ENABLE_DL_TMPL_1)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_ENABLE_DL_TMPL_4, + l_mcc_target, + l_enable_tmpl_4), + "Error from FAPI_ATTR_GET (ATTR_PROC_ENABLE_DL_TMPL_4)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_ENABLE_DL_TMPL_7, + l_mcc_target, + l_enable_tmpl_7), + "Error from FAPI_ATTR_GET (ATTR_PROC_ENABLE_DL_TMPL_7)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_ENABLE_DL_TMPL_A, + l_mcc_target, + l_enable_tmpl_A), + "Error from FAPI_ATTR_GET (ATTR_PROC_ENABLE_DL_TMPL_A)"); + + FAPI_ASSERT(!l_ds_only_0147 || !l_enable_tmpl_A, + fapi2::PROC_DOES_NOT_SUPPORT_DS_A() + .set_TARGET(l_proc) + .set_A(l_enable_tmpl_A), + "Downstream template A requested, but not supported by proc"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_TMPL_0_PACING, + l_mcc_target, + l_tmpl_0_pace), + "Error from FAPI_ATTR_GET (ATTR_PROC_TMPL_0_PACING)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_TMPL_1_PACING, + l_mcc_target, + l_tmpl_1_pace), + "Error from FAPI_ATTR_GET (ATTR_PROC_TMPL_1_PACING)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_TMPL_4_PACING, + l_mcc_target, + l_tmpl_4_pace), + "Error from FAPI_ATTR_GET (ATTR_PROC_TMPL_4_PACING)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_TMPL_7_PACING, + l_mcc_target, + l_tmpl_7_pace), + "Error from FAPI_ATTR_GET (ATTR_PROC_TMPL_7_PACING)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_TMPL_A_PACING, + l_mcc_target, + l_tmpl_A_pace), + "Error from FAPI_ATTR_GET (ATTR_PROC_TMPL_A_PACING)"); + + FAPI_TRY(mss::exp::ib::getOCCfg(i_target, EXPLR_OC_ORTCAP_MSB, l_data)); + + FAPI_TRY(omiCheckSupportedBit(l_data, EXPLR_OC_ORTCAP_MSB_TEMPLATE_1, l_enable_tmpl_1, + "OCMB Template 1 requested, but not supported", l_tmp)); + + FAPI_TRY( FAPI_ATTR_SET( fapi2::ATTR_PROC_ENABLE_DL_TMPL_1, + l_mcc_target, + l_tmp ) ); + + FAPI_TRY(omiCheckSupportedBit(l_data, EXPLR_OC_ORTCAP_MSB_TEMPLATE_4, l_enable_tmpl_4, + "OCMB Template 4 requested, but not supported", l_tmp)); + FAPI_TRY( FAPI_ATTR_SET( fapi2::ATTR_PROC_ENABLE_DL_TMPL_4, + l_mcc_target, + l_tmp ) ); + + FAPI_TRY(omiCheckSupportedBit(l_data, EXPLR_OC_ORTCAP_MSB_TEMPLATE_7, l_enable_tmpl_7, + "OCMB Template 7 requested, but not supported", l_tmp)); + FAPI_TRY( FAPI_ATTR_SET( fapi2::ATTR_PROC_ENABLE_DL_TMPL_7, + l_mcc_target, + l_tmp ) ); + + FAPI_TRY(omiCheckSupportedBit(l_data, EXPLR_OC_ORTCAP_MSB_TEMPLATE_10, l_enable_tmpl_A, + "OCMB Template A requested, but not supported", l_tmp)) + FAPI_TRY( FAPI_ATTR_SET( fapi2::ATTR_PROC_ENABLE_DL_TMPL_A, + l_mcc_target, + l_tmp ) ); + + + + FAPI_TRY(mss::exp::ib::getOCCfg(i_target, EXPLR_OC_ORRCAP76_MSB, l_data)); + + FAPI_TRY(omiCheckSupportedPacing(l_data, EXPLR_OC_ORRCAP76_MSB_TEMPLATE_0, + EXPLR_OC_ORRCAP76_MSB_TEMPLATE_0_LEN, l_tmpl_0_pace, + "OCMB Template 0 requested pacing not supported", l_tmp)); + FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_PROC_TMPL_0_PACING, + l_mcc_target, + l_tmp )); + + FAPI_TRY(omiCheckSupportedPacing(l_data, EXPLR_OC_ORRCAP76_MSB_TEMPLATE_1, + EXPLR_OC_ORRCAP76_MSB_TEMPLATE_1_LEN, l_tmpl_1_pace, + "OCMB Template 1 requested pacing not supported", l_tmp)); + FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_PROC_TMPL_1_PACING, + l_mcc_target, + l_tmp )); + + FAPI_TRY(omiCheckSupportedPacing(l_data, EXPLR_OC_ORRCAP76_MSB_TEMPLATE_4, + EXPLR_OC_ORRCAP76_MSB_TEMPLATE_4_LEN, l_tmpl_4_pace, + "OCMB Template 4 requested pacing not supported", l_tmp)); + FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_PROC_TMPL_4_PACING, + l_mcc_target, + l_tmp )); + + FAPI_TRY(omiCheckSupportedPacing(l_data, EXPLR_OC_ORRCAP76_MSB_TEMPLATE_7, + EXPLR_OC_ORRCAP76_MSB_TEMPLATE_7_LEN, l_tmpl_7_pace, + "OCMB Template 7 requested pacing not supported", l_tmp)); + FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_PROC_TMPL_7_PACING, + l_mcc_target, + l_tmp )); + + FAPI_TRY(mss::exp::ib::getOCCfg(i_target, EXPLR_OC_ORRCAP76_LSB, l_data)); + + FAPI_TRY(omiCheckSupportedPacing(l_data, EXPLR_OC_ORRCAP76_LSB_TEMPLATE_10, + EXPLR_OC_ORRCAP76_LSB_TEMPLATE_10_LEN, l_tmpl_A_pace, + "OCMB Template A requested pacing not supported", l_tmp)); + FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_PROC_TMPL_A_PACING, + l_mcc_target, + l_tmp )); + +fapi_try_exit: + + FAPI_DBG("Exiting with return code : 0x%08X...", (uint64_t) fapi2::current_err); + return fapi2::current_err; +} + + +/// +/// @brief Set the MMIO BAR +/// +/// @param[in] i_target Explorer to initialize +/// +/// @return fapi2:ReturnCode. FAPI2_RC_SUCCESS if success, else error code. +/// +fapi2::ReturnCode omiSetMMIOEnableBAR(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target) +{ + uint8_t l_addrbit; + fapi2::buffer<uint32_t> l_value; + + const auto& l_mcc_target = i_target.getParent<fapi2::TARGET_TYPE_OMI>() + .getParent<fapi2::TARGET_TYPE_MCC>(); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_DSTLCFG_MMIO_ADDRBIT_POS, + l_mcc_target, + l_addrbit), + "Error from FAPI_ATTR_GET (ATTR_PROC_DSTLCFG_MMIO_ADDRBIT_POS)"); + + //Mask bit should be 43 + l_addrbit in le bit ordering + //subtract from 63 for big endian bit order + l_value.flush<0>(); + FAPI_TRY(l_value.setBit(63 - (43 + l_addrbit))); + FAPI_TRY(mss::exp::ib::putOCCfg(i_target, EXPLR_OC_O1BAR0_MSB, l_value)); + + //Enable the bar + FAPI_TRY(mss::exp::ib::getOCCfg(i_target, EXPLR_OC_O1MBIT_O1DID_MSB, l_value)); + l_value.setBit<EXPLR_OC_O1MBIT_O1DID_MSB_MEMORY_SPACE>(); + FAPI_TRY(mss::exp::ib::putOCCfg(i_target, EXPLR_OC_O1MBIT_O1DID_MSB, l_value)); + +fapi_try_exit: + + FAPI_DBG("Exiting with return code : 0x%08X...", (uint64_t) fapi2::current_err); + return fapi2::current_err; +} + +/// +/// @brief Set the actag and pasid lengths and bases, enable metadata. +/// +/// @param[in] i_target Explorer to initialize +/// +/// @return fapi2:ReturnCode. FAPI2_RC_SUCCESS if success, else error code. +/// +fapi2::ReturnCode omiSetACTagPASIDMetaData(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target) +{ + fapi2::ATTR_EXPLR_METADATA_ENABLE_Type l_meta_data_ena; + fapi2::ATTR_EXPLR_ACTAG_BASE_Type l_actag_base; + fapi2::ATTR_EXPLR_PASID_BASE_Type l_pasid_base; + fapi2::ATTR_EXPLR_AFU_ACTAG_LEN_Type l_afu_actag_len; + fapi2::ATTR_EXPLR_PASID_LEN_Type l_pasid_len; + fapi2::buffer<uint32_t> l_value; + fapi2::buffer<uint32_t> l_afu_actag_len_supported; + fapi2::buffer<uint32_t> l_pasid_len_supported; + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_EXPLR_METADATA_ENABLE, + i_target, + l_meta_data_ena), + "Error from FAPI_ATTR_GET (ATTR_EXPLR_METADATA_ENABLE)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_EXPLR_PASID_BASE, + i_target, + l_pasid_base), + "Error from FAPI_ATTR_GET (ATTR_EXPLR_PASID_BASE)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_EXPLR_ACTAG_BASE, + i_target, + l_actag_base), + "Error from FAPI_ATTR_GET (ATTR_EXPLR_ACTAG_BASE)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_EXPLR_AFU_ACTAG_LEN, + i_target, + l_afu_actag_len), + "Error from FAPI_ATTR_GET (ATTR_EXPLR_AFU_ACTAG_LEN)"); + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_EXPLR_PASID_LEN, + i_target, + l_pasid_len), + "Error from FAPI_ATTR_GET (ATTR_EXPLR_PASID_LEN)"); + + //Set PASID Base and enable metadata + FAPI_TRY(mss::exp::ib::getOCCfg(i_target, EXPLR_OC_OCTRLPID_MSB, l_value)); + FAPI_TRY(omiCheckSupportedBit(l_value, + EXPLR_OC_OCTRLPID_MSB_METADATA_SUPPORTED, + l_meta_data_ena, + "Metadata requested but not supported", l_meta_data_ena)); + + l_value.insertFromRight<EXPLR_OC_OCTRLPID_MSB_METADATA_ENABLED, + EXPLR_OC_OCTRLPID_MSB_METADATA_ENABLED_LEN> + (l_meta_data_ena); + l_value.insertFromRight<EXPLR_OC_OCTRLPID_MSB_PASID_BASE, + EXPLR_OC_OCTRLPID_MSB_PASID_BASE_LEN> + (l_pasid_base); + FAPI_TRY(mss::exp::ib::putOCCfg(i_target, EXPLR_OC_OCTRLPID_MSB, l_value)); + + + //Establish PASID supported, check expected, set enabled. + FAPI_TRY(mss::exp::ib::getOCCfg(i_target, EXPLR_OC_OCTRLPID_LSB, l_value)); + + FAPI_TRY(l_value.extractToRight<uint32_t>(l_pasid_len_supported, EXPLR_OC_OCTRLPID_LSB_PASID_LENGTH_SUPPORTED, + EXPLR_OC_OCTRLPID_LSB_PASID_LENGTH_SUPPORTED_LEN)); + + //If we want a smaller PASID length than what is supported use it, otherwise + //use the supported length. + if (l_pasid_len_supported < l_pasid_len) + { + FAPI_ERR("Requested PASID value (%d) greater than supported (%d)", l_pasid_len, l_pasid_len_supported); + l_pasid_len = l_pasid_len_supported; + } + + l_value.insertFromRight<EXPLR_OC_OCTRLPID_LSB_PASID_LENGTH_ENABLED, + EXPLR_OC_OCTRLPID_LSB_PASID_LENGTH_ENABLED_LEN> + (l_pasid_len); + FAPI_TRY(mss::exp::ib::putOCCfg(i_target, EXPLR_OC_OCTRLPID_LSB, l_value)); + + //Establish supported AFU ACTAG length, check expected, set + FAPI_TRY(mss::exp::ib::getOCCfg(i_target, EXPLR_OC_OCTRLTAG_LSB, l_value)); + + FAPI_TRY(l_value.extractToRight<uint32_t>(l_afu_actag_len_supported, + EXPLR_OC_OCTRLTAG_LSB_AFU_ACTAG_LENGTH_SUPPORTED, + EXPLR_OC_OCTRLTAG_LSB_AFU_ACTAG_LENGTH_SUPPORTED_LEN)); + + //If we want a smaller ACTAG length than what is supported use it, otherwise + //use the supported length; + if (l_afu_actag_len_supported < l_afu_actag_len) + { + FAPI_ERR("Requested ACTAG length value (%d) greater than supported (%d)", l_afu_actag_len, l_afu_actag_len_supported); + l_afu_actag_len = l_afu_actag_len_supported; + } + + l_value.insertFromRight<EXPLR_OC_OCTRLTAG_LSB_AFU_ACTAG_LENGTH_ENABLED, + EXPLR_OC_OCTRLTAG_LSB_AFU_ACTAG_LENGTH_ENABLED_LEN> + (l_afu_actag_len); + FAPI_TRY(mss::exp::ib::putOCCfg(i_target, EXPLR_OC_OCTRLTAG_LSB, l_value)); + + //Write the Functions actag length. There's only 1 AFU so set + //the function the same as the AFU. + //(Note: on explorer this causes it to send a assign_acTag to the host) + FAPI_TRY(mss::exp::ib::getOCCfg(i_target, EXPLR_OC_O1ACTAG_O1FNID_MSB, l_value)); + l_value.insertFromRight<EXPLR_OC_O1ACTAG_O1FNID_MSB_ACTAG_LENGTH, + EXPLR_OC_O1ACTAG_O1FNID_MSB_ACTAG_LENGTH_LEN> + (l_afu_actag_len); + l_value.insertFromRight<EXPLR_OC_O1ACTAG_O1FNID_MSB_ACTAG_BASE, + EXPLR_OC_O1ACTAG_O1FNID_MSB_ACTAG_BASE_LEN> + (l_actag_base); + FAPI_TRY(mss::exp::ib::putOCCfg(i_target, EXPLR_OC_O1ACTAG_O1FNID_MSB, l_value)); + +fapi_try_exit: + + FAPI_DBG("Exiting with return code : 0x%08X...", (uint64_t) fapi2::current_err); + return fapi2::current_err; +} + +/// +/// @brief Enable the AFU +/// +/// @param[in] i_target Explorer to initialize +/// +/// @return fapi2:ReturnCode. FAPI2_RC_SUCCESS if success, else error code. +/// +fapi2::ReturnCode omiEnableAFU(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target) +{ + fapi2::buffer<uint32_t> l_value; + FAPI_TRY(mss::exp::ib::getOCCfg(i_target, EXPLR_OC_OCTRLENB_OCTRLID_MSB, l_value)); + l_value.setBit<EXPLR_OC_OCTRLENB_OCTRLID_MSB_ENABLE_AFU>(); + FAPI_TRY(mss::exp::ib::putOCCfg(i_target, EXPLR_OC_OCTRLENB_OCTRLID_MSB, l_value)); + +fapi_try_exit: + + FAPI_DBG("Exiting with return code : 0x%08X...", (uint64_t) fapi2::current_err); + return fapi2::current_err; +} + +/// +/// @brief Initialize Explorer OpenCAPI configuration +/// +/// @param[in] i_target Explorer to initialize +/// +/// @return fapi2:ReturnCode. FAPI2_RC_SUCCESS if success, else error code. +/// +fapi2::ReturnCode exp_omi_init(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target) +{ + FAPI_DBG("Start"); + FAPI_TRY(omiDeviceVerify(i_target)); + FAPI_TRY(omiSetUpstreamTemplates(i_target)); + FAPI_TRY(omiValidateDownstream(i_target)); + FAPI_TRY(omiTLVersionShortBackOff(i_target)); + FAPI_TRY(omiSetMMIOEnableBAR(i_target)); + FAPI_TRY(omiSetACTagPASIDMetaData(i_target)); + FAPI_TRY(omiEnableAFU(i_target)); + +fapi_try_exit: + + FAPI_DBG("Exiting with return code : 0x%08X...", (uint64_t) fapi2::current_err); + return fapi2::current_err; +} |