/* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ /* $Source: src/import/chips/p9a/procedures/hwp/memory/lib/mc/omi.H $ */ /* */ /* OpenPOWER HostBoot Project */ /* */ /* Contributors Listed Below - COPYRIGHT 2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ /* Licensed under the Apache License, Version 2.0 (the "License"); */ /* you may not use this file except in compliance with the License. */ /* You may obtain a copy of the License at */ /* */ /* http://www.apache.org/licenses/LICENSE-2.0 */ /* */ /* Unless required by applicable law or agreed to in writing, software */ /* distributed under the License is distributed on an "AS IS" BASIS, */ /* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ /* implied. See the License for the specific language governing */ /* permissions and limitations under the License. */ /* */ /* IBM_PROLOG_END_TAG */ /// /// @file omi.H /// @brief The omi library /// // *HWP HWP Owner: Andre Marin // *HWP HWP Backup: Stephen Glancy // *HWP Team: Memory // *HWP Level: 3 // *HWP Consumed by: Memory #ifndef P9A_OMI_H_ #define P9A_OMI_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include namespace mss { namespace mc { /// /// @brief Function to setup the CMN_CONFIG /// @tparam PROC the proc type /// @tparam T the fapi2 target type of the target /// @tparam TT the class traits for the omi /// @param[in] i_target the PROC target to operate on /// @return FAPI2_RC_SUCCESS iff ok /// template< mss::proc_type PROC = DEFAULT_PROC_TYPE, fapi2::TargetType T, typename TT = omiTraits> fapi2::ReturnCode setup_mc_mcn_config(const fapi2::Target& i_target) { // The value is 0x042364008874630F fapi2::buffer l_val; // CFG_CMN_SPARE: Spare l_val.insertFromRight< TT::MC_REG0_CMN_CONFIG_SPARE, TT::MC_REG0_CMN_CONFIG_SPARE_LEN>(0); l_val.insertFromRight (mss::omi::rx_cdr_timer::CDR_TIMER_250NS); l_val.insertFromRight (mss::omi::didt_timer::DIDT_TIMER_10NS); l_val.writeBit(0); l_val.insertFromRight (mss::omi::recal_timer::RECAL_TIMER_100MS); // CFG_CMN_1US_TMR: Number of cycles in 1us. Needs to be changed based on clock frequency l_val.insertFromRight (1600); // CFG_CMN_DBG_EN: Enable the debug logic l_val.writeBit(0); // CFG_CMN_DBG_SEL: Debug select // 000 - zeros // 001 - DL0 trace information // 010 - DL1 trace information // 011 - DL2 trace information // 100 - trace information common macro 0 // 101 - trace information common macro 2 // 110 - 22 bits from common 0 plus // 11 bits from all 3 DLs plus // 33 bits from common macro 2 // 111 - zeros l_val.insertFromRight(0); // CFG_CMN_RD_RST: Reset the PMU counters when the PMU counters are read l_val.writeBit(1); l_val.insertFromRight (mss::omi::pmu_prescalar::PRESCALAR_16BIT); // CFG_CMN_FREEZE: PMU freeze mode - when set, the PMU will stop all counters when 1 of the counters wraps. l_val.writeBit(1); // CFG_CMN_PORT_SEL: PMU port select - select which of the 8 groups of inputs will be used by the PMU. l_val.insertFromRight(0); l_val.insertFromRight( mss::omi::cntrl_pair_selector::SEL_EVEN); l_val.insertFromRight( mss::omi::cntrl_event_selector::SIG_1_0); l_val.insertFromRight( mss::omi::cntrl_pair_selector::SEL_EVEN); l_val.insertFromRight( mss::omi::cntrl_event_selector::SIG_7_6); l_val.insertFromRight( mss::omi::cntrl_pair_selector::SEL_EVEN); l_val.insertFromRight( mss::omi::cntrl_event_selector::SIG_3_2); l_val.insertFromRight( mss::omi::cntrl_pair_selector::SEL_ODD); l_val.insertFromRight( mss::omi::cntrl_event_selector::SIG_1_0); // CFG_CMN_CNTRx_PE: PMU cntrx positive edge select l_val.writeBit(0); l_val.writeBit(0); l_val.writeBit(0); l_val.writeBit(0); // CFG_CMN_CNTRx_EN: PMU cntrx enable l_val.writeBit(1); l_val.writeBit(1); l_val.writeBit(1); l_val.writeBit(1); FAPI_TRY( mss::putScom(i_target, TT::MC_REG0_CMN_CONFIG, l_val) ); FAPI_TRY( mss::putScom(i_target, TT::MC_REG1_CMN_CONFIG, l_val) ); FAPI_TRY( mss::putScom(i_target, TT::MC_REG2_CMN_CONFIG, l_val) ); fapi_try_exit: return fapi2::current_err; } /// /// @brief Function to set the CONFIG0 for the given train mode and backoff_en bit /// @tparam PROC the proc type /// @tparam T the fapi2 target type of the target /// @tparam TT the class traits for the omi /// @param[in] i_target the OMI target to operate on /// @param[in] i_train_mode training step to enable /// @param[in] i_dl_x4_backoff_en backoff enable mode /// @return FAPI2_RC_SUCCESS iff ok /// template< mss::proc_type PROC = DEFAULT_PROC_TYPE, fapi2::TargetType T, typename TT = omiTraits> fapi2::ReturnCode setup_mc_config0( const fapi2::Target& i_target, const uint8_t i_train_mode, const uint8_t i_dl_x4_backoff_en) { // The value is 0x8200040000152824 fapi2::buffer l_val; uint8_t l_dl_tx_ln_rev_en = 1; // CFG_DL0_ENABLE: dl0 enabled l_val.writeBit(1); // CFG_DL0_CFG_SPARE: dl0 Spare l_val.insertFromRight(0); // CFG_DL0_CFG_TL_CREDITS: dl0 TL credits - Maximum number of credits that can be sent to the TL l_val.template insertFromRight(32); // CFG_DL0_TL_EVENT_ACTIONS: dl0 TL event actions // Bit 0 = Freeze all // Bit 1 = Freeze afu, leave TL and DL running // Bit 2 = Trigger Internal Logic Analyzers // Bit 3 = Bring down the link l_val.template insertFromRight(0); // CFG_DL0_TL_ERROR_ACTIONS: dl0 TL error actions // Bit 0 = Freeze all // Bit 1 = Freeze afu, leave TL and DL running // Bit 2 = Trigger Internal Logic Analyzers // Bit 3 = Bring down the link l_val.template insertFromRight(0); l_val.template insertFromRight( mss::omi::no_forward_progress_timer::NO_FORWARD_TIMER_16US); // CFG_DL0_REPLAY_RSVD_ENTRIES: dl0 replay buffers reserved - times 16 is the number of replay buffers reserved l_val.template insertFromRight (0); // CFG_DL0_DEBUG_SELECT: dl0 trace mux select // "000" = zeros // "001" = RX information // "010" = TX flit information // "011" = Tx training information // "100" = 11 bits of RX information // "101" = 11 bits of TX flit information // "110" = 11 bits of Tx training information // "111" = zeros l_val.insertFromRight (0); // CFG_DL0_DEBUG_ENABLE: dl0 trace enable l_val.writeBit(0); // CFG_DL0_DL2TL_DATA_PARITY_INJECT: dl0 inject a data parity error l_val.writeBit(0); // CFG_DL0_DL2TL_CONTROL_PARITY_INJECT: dl0 inject a control parity error l_val.writeBit(0); // CFG_DL0_ECC_UE_INJECTION: dl0 inject a ECC UE error l_val.writeBit(0); // CFG_DL0_ECC_CE_INJECTION: dl0 inject a ECC CE error l_val.writeBit(0); // CFG_DL0_FP_DISABLE: dl0 fastpath disabled l_val.writeBit(0); // CFG_DL0_UNUSED2: dl0 Spare l_val.writeBit(0); // CFG_DL0_TX_LN_REV_ENA: When set will allow dl0 to perform tx lane reversals. FAPI_TRY(mss::attr::get_omi_dl_ln_rev_enable(i_target, l_dl_tx_ln_rev_en), "Error from FAPI_ATTR_GET (ATTR_OMI_DL_LN_REV_ENABLE)"); l_val.writeBit(l_dl_tx_ln_rev_en); // CFG_DL0_128_130_ENCODING_ENABLED: dl0 128/130 encoding enabled l_val.writeBit(0); l_val.template insertFromRight( mss::omi::phy_ctr_mode::PHY_CTR_MODE_50US); // CFG_DL0_RUNLANE_OVRD_ENABLE: When enabled, the dl0 will drive run lane to the PHY for all training states. l_val.writeBit(0); // CFG_DL0_PWRMGT_ENABLE: dl0 power management enabled l_val.writeBit(1); // CFG_DL0_QUARTER_WIDTH_BACKOFF_ENABLE: dl0 x1 backoff enabled l_val.writeBit(0); // CFG_DL0_HALF_WIDTH_BACKOFF_ENABLE: dl0 x4 backoff enabled l_val.writeBit(i_dl_x4_backoff_en); l_val.template insertFromRight( mss::omi::link_widths::LINK_WIDTHS_X8); // CFG_DL0_TRAIN_MODE: dl0 train mode l_val.insertFromRight( i_train_mode); // CFG_DL0_VERSION: dl0 version number l_val.insertFromRight(9); // CFG_DL0_RETRAIN: dl0 retrain - Reset dl0 back to training state 4 l_val.writeBit(0); // CFG_DL0_RESET: dl0 reset - Reset dl0 back to traning state 0 l_val.writeBit(0); FAPI_TRY( mss::putScom(i_target, TT::MC_REG2_DL0_CONFIG0, l_val) ); fapi_try_exit: return fapi2::current_err; } /// /// @brief Function to setup the CONFIG1 /// @tparam PROC the proc type /// @tparam T the fapi2 target type of the target /// @tparam TT the class traits for the omi /// @param[in] i_target the OMI target to operate on /// @return FAPI2_RC_SUCCESS iff ok /// template< mss::proc_type PROC = DEFAULT_PROC_TYPE, fapi2::TargetType T, typename TT = omiTraits> fapi2::ReturnCode setup_mc_config1(const fapi2::Target& i_target) { // The value is 0x0C00050000000059; fapi2::buffer l_val; uint8_t l_sim = 0; uint8_t l_edpl_disable = 0; FAPI_TRY( mss::attr::get_is_simulation( l_sim) ); // CFG_DL0_CFG1_PREIPL_PRBS l_val.template insertFromRight( l_sim ? mss::omi::preipl_prbs_time::PREIPL_PRBS_1US : mss::omi::preipl_prbs_time::PREIPL_PRBS_256MS); // PRE-IPL PRBS Timing is not functional in Axone, so set to disable l_val.writeBit(0); // Disable l_val.insertFromRight( mss::omi::lan_width_override::TL_CTR_BY_SIDEBAND); l_val.insertFromRight( mss::omi::b_hysteresis::B_HYSTERESIS_16); l_val.insertFromRight( mss::omi::a_hysteresis::A_HYSTERESIS_16); // CFG_DL0_B_PATTERN_LENGTH: Number of consecutive 1s and 0s needed to represent training Pattern // B=> "11111111111111110000000000000000" // "00" = two Xs => "11111111111111XX00000000000000XX" // "10" = four Xs => "111111111111XXXX000000000000XXXX" // "01" = one Xs => "111111111111111X000000000000000X" // "11" = same as "10" l_val.insertFromRight(0); // CFG_DL0_A_PATTERN_LENGTH: Number of consecutive 1s and 0s needed to represent training Pattern // A => "1111111100000000" // "00" = two Xs => "111111XX000000XX" // "10" = four Xs => "1111XXXX0000XXXX" // "01" = one Xs => "1111111X0000000X" // "11" = same as "10" l_val.insertFromRight(0); // CFG_DL0_TX_PERF_DEGRADED: "00" = if tx perf is degraded by 1% set error bit 25 // "01" = if tx perf is degraded by 2% set error bit 25 // "10" = if tx perf is degraded by 3% set error bit 25 // "11" = if tx perf is degraded by 4% set error bit 25 l_val.insertFromRight(1); // CFG_DL0_RX_PERF_DEGRADED: "00" = if rx performance is degraded by 1% set error bit 26 // "01" = if rx perf is degraded by 2% set error bit 26 // "10" = if rx perf is degraded by 3% set error bit 26 // "11" = if rx perf is degraded by 4% set error bit 26 l_val.insertFromRight(1); l_val.insertFromRight(mss::omi::LANE_DISABLED_NONE); l_val.insertFromRight(mss::omi::LANE_DISABLED_NONE); // CFG_DL0_RESET_ERR_HLD: dl0 reset the error hold register when it is read l_val.writeBit(0); // CFG_DL0_RESET_ERR_CAP: dl0 reset the error capture register when it is read l_val.writeBit(0); // CFG_DL0_RESET_TSHD_REG: dl0 reset the edpl threshold register when it is read l_val.writeBit(0); // CFG_DL0_RESET_RMT_MSG: dl0 reset the remote register when it is read l_val.writeBit(0); // CFG_DL0_INJECT_CRC_DIRECTION: dl0 inject crc direction l_val.writeBit(mss::omi::crc_inject_dir::CRC_DIR_RX); l_val.insertFromRight(mss::omi::crc_inject_rate::CRC_INJ_RATE_1US); // CFG_DL0_INJECT_CRC_LANE: dl0 inject crc error on lane number l_val.template insertFromRight(0); // CFG_DL0_INJECT_CRC_ERROR: dl0 inject crc error enable l_val.writeBit(0); l_val.insertFromRight(mss::omi::edpl_time_win::EDPL_TIME_WIN_16MS); l_val.insertFromRight(mss::omi::edpl_err_thres::EDPL_ERR_THRES_16); // CFG_DL0_EDPL_ENA: dl0 error detection per lane "edpl" enable FAPI_TRY(mss::attr::get_mss_omi_edpl_disable(l_edpl_disable)); l_val.writeBit(l_edpl_disable ? 0 : 1); FAPI_TRY( mss::putScom(i_target, TT::MC_REG2_DL0_CONFIG1, l_val) ); fapi_try_exit: return fapi2::current_err; } /// /// @brief Function to set the DL0_CYA_BITS /// @tparam PROC the proc type /// @tparam T the fapi2 target type of the target /// @tparam TT the class traits for the omi /// @param[in] i_target the OMI target to operate on /// @return FAPI2_RC_SUCCESS iff ok /// template< mss::proc_type PROC = DEFAULT_PROC_TYPE, fapi2::TargetType T, typename TT = omiTraits> fapi2::ReturnCode setup_mc_cya_bits(const fapi2::Target& i_target) { fapi2::buffer l_val; // The value is 0x00000200 (32:63) FAPI_TRY( mss::getScom(i_target, TT::MC_REG2_DL0_CYA_BITS, l_val) ); // CFG_CYA_BITS0: Chicken switch control bits l_val.insertFromRight(0x00000200); FAPI_TRY( mss::putScom(i_target, TT::MC_REG2_DL0_CYA_BITS, l_val) ); fapi_try_exit: return fapi2::current_err; } /// /// @brief Function to set the DL0_ERROR_ACTION /// @tparam PROC the memory controller type /// @tparam T the fapi2 target type of the target /// @tparam TT the class traits for the omi /// @param[in] i_target the OMI target to operate on /// @return FAPI2_RC_SUCCESS iff ok /// template< mss::proc_type PROC = DEFAULT_PROC_TYPE, fapi2::TargetType T, typename TT = omiTraits> fapi2::ReturnCode setup_mc_error_action(const fapi2::Target& i_target) { fapi2::buffer l_val; // The value is 0x000000000001 (16:63) FAPI_TRY( mss::getScom(i_target, TT::MC_REG2_DL0_ERROR_ACTION, l_val) ); l_val.insertFromRight(0); l_val.insertFromRight(0); l_val.insertFromRight(0); l_val.insertFromRight(0); l_val.insertFromRight(0); l_val.insertFromRight(0); l_val.insertFromRight(0); l_val.insertFromRight(0); l_val.insertFromRight(0); l_val.insertFromRight(0); l_val.insertFromRight(0); l_val.insertFromRight(1); FAPI_TRY( mss::putScom(i_target, TT::MC_REG2_DL0_ERROR_ACTION, l_val) ); fapi_try_exit: return fapi2::current_err; } /// /// @brief Function to set the DL0_RMT_CONFIG /// @tparam PROC the proc type /// @tparam T the fapi2 target type of the target /// @tparam TT the class traits for the omi /// @param[in] i_target the OMI target to operate on /// @return FAPI2_RC_SUCCESS iff ok /// template< mss::proc_type PROC = DEFAULT_PROC_TYPE, fapi2::TargetType T, typename TT = omiTraits> fapi2::ReturnCode setup_mc_rmt_config(const fapi2::Target& i_target) { fapi2::buffer l_val; // The value is 0x00000000 (32:63) FAPI_TRY( mss::getScom(i_target, TT::MC_REG2_DL0_RMT_CONFIG, l_val) ); // CFG_DLX0 l_val.insertFromRight(0x00000000); FAPI_TRY( mss::putScom(i_target, TT::MC_REG2_DL0_RMT_CONFIG, l_val) ); fapi_try_exit: return fapi2::current_err; } /// /// @brief Check OMI training status /// @tparam PROC the proc type /// @tparam T the fapi2 target type of the target /// @tparam TT the class traits for the omi /// @param[in] i_target the OMI target to operate on /// @param[out] o_state_machine_state training state mahcine /// @param[out] o_omi_training_status training status /// @return FAPI2_RC_SUCCESS iff ok /// template< mss::proc_type PROC = DEFAULT_PROC_TYPE, fapi2::TargetType T, typename TT = omiTraits> fapi2::ReturnCode omi_train_status(const fapi2::Target& i_target, uint8_t& o_state_machine_state, fapi2::buffer& o_omi_training_status) { fapi2::buffer l_omi_status; // Check OMI training status FAPI_TRY(mss::getScom(i_target, TT::MC_REG2_DL0_STATUS, l_omi_status)); o_omi_training_status = l_omi_status; o_state_machine_state = 0; l_omi_status.extractToRight(o_state_machine_state); fapi_try_exit: return fapi2::current_err; } } // namespace mc } // namespace mss #endif