diff options
author | Brian Silver <bsilver@us.ibm.com> | 2016-08-11 14:31:20 -0500 |
---|---|---|
committer | William G. Hoffa <wghoffa@us.ibm.com> | 2016-08-12 13:15:09 -0400 |
commit | 4c35edebbed8ad665681f0863e49041e35ce9e6a (patch) | |
tree | 70a3eaa6978579e82a7852c5b4f63666cf253120 | |
parent | 78c72cd49b3562087808d4192b5bba3784f20868 (diff) | |
download | talos-hostboot-4c35edebbed8ad665681f0863e49041e35ce9e6a.tar.gz talos-hostboot-4c35edebbed8ad665681f0863e49041e35ce9e6a.zip |
Add reset_dll API
Note - not used in f/w, only mirrors what's done in the initfile for tooling.
Change-Id: Ia5d5264ad8bd90975d15008e77219d6191729a73
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/28176
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com>
Reviewed-by: Louis Stermole <stermole@us.ibm.com>
Reviewed-by: STEPHEN GLANCY <sglancy@us.ibm.com>
Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com>
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/28187
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: William G. Hoffa <wghoffa@us.ibm.com>
-rw-r--r-- | src/import/chips/p9/procedures/hwp/memory/lib/phy/dp16.C | 131 | ||||
-rw-r--r-- | src/import/chips/p9/procedures/hwp/memory/lib/phy/dp16.H | 19 |
2 files changed, 147 insertions, 3 deletions
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/phy/dp16.C b/src/import/chips/p9/procedures/hwp/memory/lib/phy/dp16.C index 4bedf809b..c725f5615 100644 --- a/src/import/chips/p9/procedures/hwp/memory/lib/phy/dp16.C +++ b/src/import/chips/p9/procedures/hwp/memory/lib/phy/dp16.C @@ -68,6 +68,111 @@ const std::vector< std::pair<uint64_t, uint64_t> > dp16Traits<TARGET_TYPE_MCA>:: { MCA_DDRPHY_DP16_DLL_CNTL0_P0_4, MCA_DDRPHY_DP16_DLL_CNTL1_P0_4 }, }; +// Definition of the DP16 DLL DAC Lower registers +// DP16 DLL registers all come in pairs - DLL per 8 bits +// 5 DLL per MCA gives us 10 DLL Config Registers. +// All-caps (as opposed to the others) as it's really in the dp16Traits class which is all caps <shrug>) +const std::vector< std::pair<uint64_t, uint64_t> > dp16Traits<TARGET_TYPE_MCA>::DLL_DAC_LOWER_REG = +{ + { MCA_DDRPHY_DP16_DLL_DAC_LOWER0_P0_0, MCA_DDRPHY_DP16_DLL_DAC_LOWER1_P0_0 }, + { MCA_DDRPHY_DP16_DLL_DAC_LOWER0_P0_1, MCA_DDRPHY_DP16_DLL_DAC_LOWER1_P0_1 }, + { MCA_DDRPHY_DP16_DLL_DAC_LOWER0_P0_2, MCA_DDRPHY_DP16_DLL_DAC_LOWER1_P0_2 }, + { MCA_DDRPHY_DP16_DLL_DAC_LOWER0_P0_3, MCA_DDRPHY_DP16_DLL_DAC_LOWER1_P0_3 }, + { MCA_DDRPHY_DP16_DLL_DAC_LOWER0_P0_4, MCA_DDRPHY_DP16_DLL_DAC_LOWER1_P0_4 }, +}; + +// Definition of the DP16 DLL DAC Upper registers +// DP16 DLL registers all come in pairs - DLL per 8 bits +// 5 DLL per MCA gives us 10 DLL Config Registers. +// All-caps (as opposed to the others) as it's really in the dp16Traits class which is all caps <shrug>) +const std::vector< std::pair<uint64_t, uint64_t> > dp16Traits<TARGET_TYPE_MCA>::DLL_DAC_UPPER_REG = +{ + { MCA_DDRPHY_DP16_DLL_DAC_UPPER0_P0_0, MCA_DDRPHY_DP16_DLL_DAC_UPPER1_P0_0 }, + { MCA_DDRPHY_DP16_DLL_DAC_UPPER0_P0_1, MCA_DDRPHY_DP16_DLL_DAC_UPPER1_P0_1 }, + { MCA_DDRPHY_DP16_DLL_DAC_UPPER0_P0_2, MCA_DDRPHY_DP16_DLL_DAC_UPPER1_P0_2 }, + { MCA_DDRPHY_DP16_DLL_DAC_UPPER0_P0_3, MCA_DDRPHY_DP16_DLL_DAC_UPPER1_P0_3 }, + { MCA_DDRPHY_DP16_DLL_DAC_UPPER0_P0_4, MCA_DDRPHY_DP16_DLL_DAC_UPPER1_P0_4 }, +}; + +// Definition of the DP16 DLL Slave Lower registers +// DP16 DLL registers all come in pairs - DLL per 8 bits +// 5 DLL per MCA gives us 10 DLL Config Registers. +// All-caps (as opposed to the others) as it's really in the dp16Traits class which is all caps <shrug>) +const std::vector< std::pair<uint64_t, uint64_t> > dp16Traits<TARGET_TYPE_MCA>::DLL_SLAVE_LOWER_REG = +{ + { MCA_DDRPHY_DP16_DLL_SLAVE_VREG_LOWER0_P0_0, MCA_DDRPHY_DP16_DLL_SLAVE_VREG_LOWER1_P0_0 }, + { MCA_DDRPHY_DP16_DLL_SLAVE_VREG_LOWER0_P0_1, MCA_DDRPHY_DP16_DLL_SLAVE_VREG_LOWER1_P0_1 }, + { MCA_DDRPHY_DP16_DLL_SLAVE_VREG_LOWER0_P0_2, MCA_DDRPHY_DP16_DLL_SLAVE_VREG_LOWER1_P0_2 }, + { MCA_DDRPHY_DP16_DLL_SLAVE_VREG_LOWER0_P0_3, MCA_DDRPHY_DP16_DLL_SLAVE_VREG_LOWER1_P0_3 }, + { MCA_DDRPHY_DP16_DLL_SLAVE_VREG_LOWER0_P0_4, MCA_DDRPHY_DP16_DLL_SLAVE_VREG_LOWER1_P0_4 }, +}; + +// Definition of the DP16 DLL Slave Upper registers +// DP16 DLL registers all come in pairs - DLL per 8 bits +// 5 DLL per MCA gives us 10 DLL Config Registers. +// All-caps (as opposed to the others) as it's really in the dp16Traits class which is all caps <shrug>) +const std::vector< std::pair<uint64_t, uint64_t> > dp16Traits<TARGET_TYPE_MCA>::DLL_SLAVE_UPPER_REG = +{ + { MCA_DDRPHY_DP16_DLL_SLAVE_VREG_UPPER0_P0_0, MCA_DDRPHY_DP16_DLL_SLAVE_VREG_UPPER1_P0_0 }, + { MCA_DDRPHY_DP16_DLL_SLAVE_VREG_UPPER0_P0_1, MCA_DDRPHY_DP16_DLL_SLAVE_VREG_UPPER1_P0_1 }, + { MCA_DDRPHY_DP16_DLL_SLAVE_VREG_UPPER0_P0_2, MCA_DDRPHY_DP16_DLL_SLAVE_VREG_UPPER1_P0_2 }, + { MCA_DDRPHY_DP16_DLL_SLAVE_VREG_UPPER0_P0_3, MCA_DDRPHY_DP16_DLL_SLAVE_VREG_UPPER1_P0_3 }, + { MCA_DDRPHY_DP16_DLL_SLAVE_VREG_UPPER0_P0_4, MCA_DDRPHY_DP16_DLL_SLAVE_VREG_UPPER1_P0_4 }, +}; + +// Definition of the DP16 DLL SW Control registers +// DP16 DLL registers all come in pairs - DLL per 8 bits +// 5 DLL per MCA gives us 10 DLL Config Registers. +// All-caps (as opposed to the others) as it's really in the dp16Traits class which is all caps <shrug>) +const std::vector< std::pair<uint64_t, uint64_t> > dp16Traits<TARGET_TYPE_MCA>::DLL_SW_CNTRL_REG = +{ + { MCA_DDRPHY_DP16_DLL_SW_CONTROL0_P0_0, MCA_DDRPHY_DP16_DLL_SW_CONTROL1_P0_0 }, + { MCA_DDRPHY_DP16_DLL_SW_CONTROL0_P0_1, MCA_DDRPHY_DP16_DLL_SW_CONTROL1_P0_1 }, + { MCA_DDRPHY_DP16_DLL_SW_CONTROL0_P0_2, MCA_DDRPHY_DP16_DLL_SW_CONTROL1_P0_2 }, + { MCA_DDRPHY_DP16_DLL_SW_CONTROL0_P0_3, MCA_DDRPHY_DP16_DLL_SW_CONTROL1_P0_3 }, + { MCA_DDRPHY_DP16_DLL_SW_CONTROL0_P0_4, MCA_DDRPHY_DP16_DLL_SW_CONTROL1_P0_4 }, +}; + +// Definition of the DP16 DLL VREG Coarse registers +// DP16 DLL registers all come in pairs - DLL per 8 bits +// 5 DLL per MCA gives us 10 DLL Config Registers. +// All-caps (as opposed to the others) as it's really in the dp16Traits class which is all caps <shrug>) +const std::vector< std::pair<uint64_t, uint64_t> > dp16Traits<TARGET_TYPE_MCA>::DLL_VREG_COARSE_REG = +{ + { MCA_DDRPHY_DP16_DLL_VREG_COARSE0_P0_0, MCA_DDRPHY_DP16_DLL_VREG_COARSE1_P0_0 }, + { MCA_DDRPHY_DP16_DLL_VREG_COARSE0_P0_1, MCA_DDRPHY_DP16_DLL_VREG_COARSE1_P0_1 }, + { MCA_DDRPHY_DP16_DLL_VREG_COARSE0_P0_2, MCA_DDRPHY_DP16_DLL_VREG_COARSE1_P0_2 }, + { MCA_DDRPHY_DP16_DLL_VREG_COARSE0_P0_3, MCA_DDRPHY_DP16_DLL_VREG_COARSE1_P0_3 }, + { MCA_DDRPHY_DP16_DLL_VREG_COARSE0_P0_4, MCA_DDRPHY_DP16_DLL_VREG_COARSE1_P0_4 }, +}; + +// Definition of the DP16 DLL VREG Control registers +// DP16 DLL registers all come in pairs - DLL per 8 bits +// 5 DLL per MCA gives us 10 DLL Config Registers. +// All-caps (as opposed to the others) as it's really in the dp16Traits class which is all caps <shrug>) +const std::vector< std::pair<uint64_t, uint64_t> > dp16Traits<TARGET_TYPE_MCA>::DLL_VREG_CNTRL_REG = +{ + { MCA_DDRPHY_DP16_DLL_VREG_CONTROL0_P0_0, MCA_DDRPHY_DP16_DLL_VREG_CONTROL1_P0_0 }, + { MCA_DDRPHY_DP16_DLL_VREG_CONTROL0_P0_1, MCA_DDRPHY_DP16_DLL_VREG_CONTROL1_P0_1 }, + { MCA_DDRPHY_DP16_DLL_VREG_CONTROL0_P0_2, MCA_DDRPHY_DP16_DLL_VREG_CONTROL1_P0_2 }, + { MCA_DDRPHY_DP16_DLL_VREG_CONTROL0_P0_3, MCA_DDRPHY_DP16_DLL_VREG_CONTROL1_P0_3 }, + { MCA_DDRPHY_DP16_DLL_VREG_CONTROL0_P0_4, MCA_DDRPHY_DP16_DLL_VREG_CONTROL1_P0_4 }, +}; + + +// Definition of the DP16 DLL Extra registers +// DP16 DLL registers all come in pairs - DLL per 8 bits +// 5 DLL per MCA gives us 10 DLL Config Registers. +// All-caps (as opposed to the others) as it's really in the dp16Traits class which is all caps <shrug>) +const std::vector< std::pair<uint64_t, uint64_t> > dp16Traits<TARGET_TYPE_MCA>::DLL_EXTRA_REG = +{ + { MCA_DDRPHY_DP16_DLL_EXTRA0_P0_0, MCA_DDRPHY_DP16_DLL_EXTRA1_P0_0 }, + { MCA_DDRPHY_DP16_DLL_EXTRA0_P0_1, MCA_DDRPHY_DP16_DLL_EXTRA1_P0_1 }, + { MCA_DDRPHY_DP16_DLL_EXTRA0_P0_2, MCA_DDRPHY_DP16_DLL_EXTRA1_P0_2 }, + { MCA_DDRPHY_DP16_DLL_EXTRA0_P0_3, MCA_DDRPHY_DP16_DLL_EXTRA1_P0_3 }, + { MCA_DDRPHY_DP16_DLL_EXTRA0_P0_4, MCA_DDRPHY_DP16_DLL_EXTRA1_P0_4 }, +}; + // Definition of the DP16 Data Bit Dir1 registers // All-caps (as opposed to the others) as it's really in the dp16Traits class which is all caps <shrug>) const std::vector< uint64_t > dp16Traits<TARGET_TYPE_MCA>::DATA_BIT_DIR1 = @@ -710,5 +815,31 @@ fapi_try_exit: return fapi2::current_err; } +/// +/// @brief Reset all of the DLL registers - Nimbus only +/// @param[in] i_target an MCA +/// @return FAPI2_RC_SUCCESs iff ok +/// +fapi2::ReturnCode reset_dll( const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target ) +{ + typedef dp16Traits<TARGET_TYPE_MCA> TT; + + // Magic numbers are from the PHY team (see the ddry phy initfile, too.) They are, in fact, + // magic numbers ... + // TK How about a little broadcast action here? BRS + FAPI_TRY( mss::scom_blastah(i_target, TT::DLL_CNFG_REG, 0x8100) ); + FAPI_TRY( mss::scom_blastah(i_target, TT::DLL_DAC_LOWER_REG, 0x8000) ); + FAPI_TRY( mss::scom_blastah(i_target, TT::DLL_DAC_UPPER_REG, 0xffe0) ); + FAPI_TRY( mss::scom_blastah(i_target, TT::DLL_SLAVE_LOWER_REG, 0x8000) ); + FAPI_TRY( mss::scom_blastah(i_target, TT::DLL_SLAVE_UPPER_REG, 0xffe0) ); + FAPI_TRY( mss::scom_blastah(i_target, TT::DLL_EXTRA_REG, 0x2020) ); + FAPI_TRY( mss::scom_blastah(i_target, TT::DLL_VREG_CNTRL_REG, 0x0040) ); + FAPI_TRY( mss::scom_blastah(i_target, TT::DLL_SW_CNTRL_REG, 0x0800) ); + FAPI_TRY( mss::scom_blastah(i_target, TT::DLL_VREG_COARSE_REG, 0x0402) ); + +fapi_try_exit: + return fapi2::current_err; +} + } // close namespace dp16 } // close namespace mss diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/phy/dp16.H b/src/import/chips/p9/procedures/hwp/memory/lib/phy/dp16.H index 81fe55eec..33a9f3c4c 100644 --- a/src/import/chips/p9/procedures/hwp/memory/lib/phy/dp16.H +++ b/src/import/chips/p9/procedures/hwp/memory/lib/phy/dp16.H @@ -125,6 +125,16 @@ class dp16Traits<fapi2::TARGET_TYPE_MCA> // Vectors of DP16 registers. The pair represents the two DLL in per DP16 static const std::vector< std::pair<uint64_t, uint64_t> > DLL_CNFG_REG; + static const std::vector< std::pair<uint64_t, uint64_t> > DLL_DAC_LOWER_REG; + static const std::vector< std::pair<uint64_t, uint64_t> > DLL_DAC_UPPER_REG; + static const std::vector< std::pair<uint64_t, uint64_t> > DLL_SLAVE_LOWER_REG; + static const std::vector< std::pair<uint64_t, uint64_t> > DLL_SLAVE_UPPER_REG; + static const std::vector< std::pair<uint64_t, uint64_t> > DLL_EXTRA_REG; + + static const std::vector< std::pair<uint64_t, uint64_t> > DLL_SW_CNTRL_REG; + static const std::vector< std::pair<uint64_t, uint64_t> > DLL_VREG_COARSE_REG; + static const std::vector< std::pair<uint64_t, uint64_t> > DLL_VREG_CNTRL_REG; + static const std::vector< std::pair<uint64_t, uint64_t> > AC_BOOST_CNTRL_REG; static const std::vector< std::pair<uint64_t, uint64_t> > CTLE_CNTRL_REG; static const std::vector< uint64_t > DATA_BIT_DIR1; @@ -211,9 +221,12 @@ fapi_try_exit: } -// -// Reseting the DLL registers TODO RTC:156518 -// +/// +/// @brief Reset all of the DLL registers - Nimbus only +/// @param[in] i_target an MCA +/// @return FAPI2_RC_SUCCESs iff ok +/// +fapi2::ReturnCode reset_dll( const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target ); /// /// @brief Read AC_BOOST_CNTL |