diff --git a/src/import/chips/p9/procedures/hwp/io/p9_io_common.C b/src/import/chips/p9/procedures/hwp/io/p9_io_common.C index fb43fa5cdb0..454bd4b98fa 100644 --- a/src/import/chips/p9/procedures/hwp/io/p9_io_common.C +++ b/src/import/chips/p9/procedures/hwp/io/p9_io_common.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016 */ +/* Contributors Listed Below - COPYRIGHT 2016,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -57,58 +57,125 @@ * @param[in] i_grp Clock group * @return Field Data */ -fapi2::ReturnCode p9_io_xbus_shorten_timers( const XBUS_TGT i_tgt, const uint8_t i_grp ) +fapi2::ReturnCode p9_io_xbus_shorten_timers(const XBUS_TGT& i_tgt, const uint8_t i_grp) { - FAPI_IMP( "p9_io_xbus_shorten_timers: I/O EDI+ Xbus Entering" ); + FAPI_IMP("p9_io_xbus_shorten_timers: I/O EDI+ Xbus Entering"); const uint8_t LN0 = 0; uint64_t reg_data = 0; uint8_t l_is_sim = 0; - FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_IS_SIMULATION, fapi2::Target(), l_is_sim) ); + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_IS_SIMULATION, fapi2::Target(), l_is_sim)); - if( l_is_sim ) + if(l_is_sim) { - FAPI_TRY( io::read( EDIP_RX_CTL_MODE7_EO_PG, i_tgt, i_grp, LN0, reg_data ), - "read edip_rx_ctl_mode7_eo_pg failed" ); - io::set( EDIP_RX_ABORT_CHECK_TIMEOUT_SEL, 0x0, reg_data ); - io::set( EDIP_RX_POLLING_TIMEOUT_SEL, 0x0, reg_data ); - FAPI_TRY( io::write( EDIP_RX_CTL_MODE7_EO_PG, i_tgt, i_grp, LN0, reg_data ), - "write edip_rx_ctl_mode7_eo_pg failed" ); - - FAPI_TRY( io::rmw( EDIP_RX_SERVO_CHG_CFG, i_tgt, i_grp, LN0, 0x0 ), - "rmw edip_rx_rx_servo_chg_cfg failed" ); - - - FAPI_TRY( io::read( EDIP_RX_CTL_MODE14_EO_PG, i_tgt, i_grp, LN0, reg_data ), - "read edip_rx_ctl_mode14_eo_pg failed" ); - io::set( EDIP_RX_AMP_INIT_TIMEOUT, 0x0, reg_data ); - io::set( EDIP_RX_AMP_RECAL_TIMEOUT, 0x0, reg_data ); - io::set( EDIP_RX_PEAK_INIT_TIMEOUT, 0x0, reg_data ); - io::set( EDIP_RX_PEAK_RECAL_TIMEOUT, 0x0, reg_data ); - FAPI_TRY( io::write( EDIP_RX_CTL_MODE14_EO_PG, i_tgt, i_grp, LN0, reg_data ), - "write edip_rx_ctl_mode14_eo_pg failed" ); - - FAPI_TRY( io::read( EDIP_RX_CTL_MODE15_EO_PG, i_tgt, i_grp, LN0, reg_data ), - "read edip_rx_ctl_mode15_eo_pg failed" ); - io::set( EDIP_RX_AMIN_TIMEOUT, 0x0, reg_data ); - io::set( EDIP_RX_CM_TIMEOUT, 0x0, reg_data ); - io::set( EDIP_RX_OFF_INIT_TIMEOUT, 0x0, reg_data ); - io::set( EDIP_RX_OFF_RECAL_TIMEOUT, 0x0, reg_data ); - FAPI_TRY( io::write( EDIP_RX_CTL_MODE15_EO_PG, i_tgt, i_grp, LN0, reg_data ), - "write edip_rx_ctl_mode15_eo_pg failed" ); - - FAPI_TRY( io::read( EDIP_RX_CTL_MODE16_EO_PG, i_tgt, i_grp, LN0, reg_data ), - "read edip_rx_ctl_mode16_eo_pg failed" ); - io::set( EDIP_RX_AMP_TIMEOUT, 0x0, reg_data ); - io::set( EDIP_RX_BER_TIMEOUT, 0x0, reg_data ); - io::set( EDIP_RX_USERDEF_TIMEOUT, 0x0, reg_data ); - FAPI_TRY( io::write( EDIP_RX_CTL_MODE16_EO_PG, i_tgt, i_grp, LN0, reg_data ), - "write edip_rx_ctl_mode16_eo_pg failed" ); + FAPI_TRY(io::read(EDIP_RX_CTL_MODE7_EO_PG, i_tgt, i_grp, LN0, reg_data)); + io::set(EDIP_RX_ABORT_CHECK_TIMEOUT_SEL, 0x0, reg_data); + io::set(EDIP_RX_POLLING_TIMEOUT_SEL, 0x0, reg_data); + FAPI_TRY(io::write(EDIP_RX_CTL_MODE7_EO_PG, i_tgt, i_grp, LN0, reg_data)); + + FAPI_TRY(io::rmw(EDIP_RX_SERVO_CHG_CFG, i_tgt, i_grp, LN0, 0x0)); + + + FAPI_TRY(io::read(EDIP_RX_CTL_MODE14_EO_PG, i_tgt, i_grp, LN0, reg_data)); + io::set(EDIP_RX_AMP_INIT_TIMEOUT, 0x0, reg_data); + io::set(EDIP_RX_AMP_RECAL_TIMEOUT, 0x0, reg_data); + io::set(EDIP_RX_PEAK_INIT_TIMEOUT, 0x0, reg_data); + io::set(EDIP_RX_PEAK_RECAL_TIMEOUT, 0x0, reg_data); + FAPI_TRY(io::write(EDIP_RX_CTL_MODE14_EO_PG, i_tgt, i_grp, LN0, reg_data)); + + FAPI_TRY(io::read(EDIP_RX_CTL_MODE15_EO_PG, i_tgt, i_grp, LN0, reg_data)); + io::set(EDIP_RX_AMIN_TIMEOUT, 0x0, reg_data); + io::set(EDIP_RX_CM_TIMEOUT, 0x0, reg_data); + io::set(EDIP_RX_OFF_INIT_TIMEOUT, 0x0, reg_data); + io::set(EDIP_RX_OFF_RECAL_TIMEOUT, 0x0, reg_data); + FAPI_TRY(io::write(EDIP_RX_CTL_MODE15_EO_PG, i_tgt, i_grp, LN0, reg_data)); + + FAPI_TRY(io::read(EDIP_RX_CTL_MODE16_EO_PG, i_tgt, i_grp, LN0, reg_data)); + io::set(EDIP_RX_AMP_TIMEOUT, 0x0, reg_data); + io::set(EDIP_RX_BER_TIMEOUT, 0x0, reg_data); + io::set(EDIP_RX_USERDEF_TIMEOUT, 0x0, reg_data); + FAPI_TRY(io::write(EDIP_RX_CTL_MODE16_EO_PG, i_tgt, i_grp, LN0, reg_data)); } fapi_try_exit: - FAPI_IMP( "p9_io_xbus_shorten_timers: I/O EDI+ Xbus Exiting" ); + FAPI_IMP("p9_io_xbus_shorten_timers: I/O EDI+ Xbus Exiting"); return fapi2::current_err; } +/** + * @brief Shorten timers if we are running in simulation + * a right aligned value. + * @param[in] i_tgt FAPI2 Target + * @return Field Data + */ +fapi2::ReturnCode p9_io_dmi_proc_shorten_timers(const DMI_PROC_TGT& i_tgt) +{ + FAPI_IMP("p9_io_dmi_proc_shorten_timers: I/O EDI+ DMI Proc Entering"); + const uint8_t GRP3 = 3; + const uint8_t LN0 = 0; + uint64_t reg_data = 0; + uint8_t l_is_sim = 0; + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_IS_SIMULATION, fapi2::Target(), l_is_sim)); + + if(l_is_sim) + { + FAPI_TRY(io::read(EDIP_RX_CTL_MODE7_EO_PG, i_tgt, GRP3, LN0, reg_data)); + io::set(EDIP_RX_ABORT_CHECK_TIMEOUT_SEL, 0x0, reg_data); + io::set(EDIP_RX_POLLING_TIMEOUT_SEL, 0x0, reg_data); + FAPI_TRY(io::write(EDIP_RX_CTL_MODE7_EO_PG, i_tgt, GRP3, LN0, reg_data)); + + FAPI_TRY(io::rmw(EDIP_RX_SERVO_CHG_CFG, i_tgt, GRP3, LN0, 0x0)); + + + FAPI_TRY(io::read(EDIP_RX_CTL_MODE14_EO_PG, i_tgt, GRP3, LN0, reg_data)); + io::set(EDIP_RX_AMP_INIT_TIMEOUT, 0x0, reg_data); + io::set(EDIP_RX_AMP_RECAL_TIMEOUT, 0x0, reg_data); + io::set(EDIP_RX_PEAK_INIT_TIMEOUT, 0x0, reg_data); + io::set(EDIP_RX_PEAK_RECAL_TIMEOUT, 0x0, reg_data); + FAPI_TRY(io::write(EDIP_RX_CTL_MODE14_EO_PG, i_tgt, GRP3, LN0, reg_data)); + + FAPI_TRY(io::read(EDIP_RX_CTL_MODE15_EO_PG, i_tgt, GRP3, LN0, reg_data)); + io::set(EDIP_RX_AMIN_TIMEOUT, 0x0, reg_data); + io::set(EDIP_RX_CM_TIMEOUT, 0x0, reg_data); + io::set(EDIP_RX_OFF_INIT_TIMEOUT, 0x0, reg_data); + io::set(EDIP_RX_OFF_RECAL_TIMEOUT, 0x0, reg_data); + FAPI_TRY(io::write(EDIP_RX_CTL_MODE15_EO_PG, i_tgt, GRP3, LN0, reg_data)); + + FAPI_TRY(io::read(EDIP_RX_CTL_MODE16_EO_PG, i_tgt, GRP3, LN0, reg_data)); + io::set(EDIP_RX_AMP_TIMEOUT, 0x0, reg_data); + io::set(EDIP_RX_BER_TIMEOUT, 0x0, reg_data); + io::set(EDIP_RX_USERDEF_TIMEOUT, 0x0, reg_data); + FAPI_TRY(io::write(EDIP_RX_CTL_MODE16_EO_PG, i_tgt, GRP3, LN0, reg_data)); + } + +fapi_try_exit: + FAPI_IMP("p9_io_dmi_proc_shorten_timers: I/O EDI+ DMI Proc Exiting"); + return fapi2::current_err; +} + +/** + * @brief Shorten timers if we are running in simulation + * a right aligned value. + * @param[in] i_tgt FAPI2 Target + * @return Field Data + */ +fapi2::ReturnCode p9_io_dmi_cn_shorten_timers(const DMI_CN_TGT& i_tgt) +{ + FAPI_IMP("p9_io_dmi_cn_shorten_timers: I/O EDI DMI Centaur Entering"); + //const uint8_t GRP0 = 0; + //const uint8_t LN0 = 0; + //uint64_t reg_data = 0; + uint8_t l_is_sim = 0; + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_IS_SIMULATION, fapi2::Target(), l_is_sim)); + + if(l_is_sim) + { + } + +fapi_try_exit: + FAPI_IMP("p9_io_dmi_cn_shorten_timers: I/O EDI DMI Centaur Exiting"); + return fapi2::current_err; +} diff --git a/src/import/chips/p9/procedures/hwp/io/p9_io_common.H b/src/import/chips/p9/procedures/hwp/io/p9_io_common.H index efefdc1d0c3..acde428f319 100644 --- a/src/import/chips/p9/procedures/hwp/io/p9_io_common.H +++ b/src/import/chips/p9/procedures/hwp/io/p9_io_common.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016 */ +/* Contributors Listed Below - COPYRIGHT 2016,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -52,6 +52,8 @@ #include typedef fapi2::Target XBUS_TGT; +typedef fapi2::Target DMI_PROC_TGT; +typedef fapi2::Target DMI_CN_TGT; extern "C" { @@ -64,9 +66,24 @@ extern "C" * @return Field Data */ fapi2::ReturnCode p9_io_xbus_shorten_timers( - const XBUS_TGT i_tgt, + const XBUS_TGT& i_tgt, const uint8_t i_grp ); -} + /** + * @brief Shorten timers if we are running in simulation + * a right aligned value. + * @param[in] i_tgt FAPI2 Target + * @return Field Data + */ + fapi2::ReturnCode p9_io_dmi_proc_shorten_timers(const DMI_PROC_TGT& i_tgt); + +} /** + * @brief Shorten timers if we are running in simulation + * a right aligned value. + * @param[in] i_tgt FAPI2 Target + * @return Field Data + */ +fapi2::ReturnCode p9_io_dmi_cn_shorten_timers(const DMI_CN_TGT& i_tgt); + #endif /* P9_IO_COMMON_H_ */ diff --git a/src/import/chips/p9/procedures/hwp/io/p9_io_regs.H b/src/import/chips/p9/procedures/hwp/io/p9_io_regs.H index 484032f867d..370a0c995a3 100644 --- a/src/import/chips/p9/procedures/hwp/io/p9_io_regs.H +++ b/src/import/chips/p9/procedures/hwp/io/p9_io_regs.H @@ -169,11 +169,67 @@ #define EDIP_RX_CTL_MODE16_EO_PG 0x800888000000003f, 48, 16 // register -- description - - - - - +#define EDI_RX_WTM_STATE 0x800950000000003f, 48, 5 // main wiretest state machine current state (rjr)): \r\n\tx00: idle \r\n\tx01: drv data wt \r\n\tx02: drv clock wt \r\n\tx03: drv data 0 \r\n\tx04: drv clock 0 \r\n\tx05: rx wt \r\n\tx06: wait all ones \r\n\tx07: reset pll \r\n\tx08: wait pll \r\n\tx09: drive clock \r\n\tx0a: drive data 1 \r\n\tx0b: wait all zeroes \r\n\tx0c: drive data 0 \r\n\tx0d: done \r\n\tx0e: unused \r\n\tx0f: unused \r\n\tx10: wait prev done \r\n\tx11: drv prev done \r\n\tx12: drv all done \r\n\tx13: wait all done \r\n\tx14: init tx fifo \r\n\tx15: unused \r\n\tx16: unused \r\n\tx17: unused \r\n\tx18: set c & d dr strength \r\n\tx19: set data only dr strength \r\n\tx1a: clock fail \r\n\tx1b: all bad lanes \r\n\tx1c: wt timeout fail \r\n\tx1d: pll/dll fail \r\n\tx1e: all ones fail \r\n\tx1f: all zeroes fail \r\n\trjr +#define EDI_RX_WTR_STATE 0x800950000000003f, 53, 4 // receiver wiretest state machine current state (rjr):x0: idle\r\n\tx1: check clock\r\n\tx2: check lane disabled\r\n\tx3: check data lane\r\n\tx4: store data lane results\r\n\tx5: check if done\r\n\tx6: done--passed\r\n\t: done--failed\r\n\t:x8-xf: unused\r\n\trjr +#define EDI_RX_WTL_STATE 0x800950000000003f, 59, 5 // lane wiretest sub state machine current state (rjr)\r\n\tx00: idle\r\n\tx01: wait 1st long transition\r\n\tx02: wait 2nd long transition\r\n\tx03: wait short transition\r\n\tx04: wait transition from pn=01\r\n\tx05: wait transition from 10\r\n\tx06: wait transition from 00\r\n\tx07: wait transition from 11\r\n\tx10: good-no swap\r\n\tx11: bad-n=1-no swap\r\n\tx12: bad-n=0-no swap\r\n\tx13: bad-p=1-no swap\r\n\tx14: bad-p=0-no swap\r\n\tx15: bad-p or n floating\r\n\tx16: bad-pn=00\r\n\tx17: bad-pn=11\r\n\tx18: good--swapped\r\n\tx19: bad-n=1-swapped\r\n\tx1a: bad-n=0-swapped\r\n\tx1b: bad-p=1-swapped\r\n\tx1c: bad-p=0-swapped\r\n\tx1d: bad-pn=10\r\n\tx1e: bad-pn=01\r\n\tx1f: bad-unknown failure\r\n\trjr +#define EDI_RX_WIRETEST_STATE_PG 0x800950000000003f, 48, 16 // rx wiretest state machine reg -- rx main and rx wiretest state machines +#define EDI_RX_WTR_BAD_LANE_COUNT 0x800958000000003f, 59, 5 // wiretest current number of bad lanes in this clk group\r\n\trjr +#define EDI_RX_WIRETEST_LANEINFO_PG 0x800958000000003f, 48, 16 // rx wiretest lane info reg -- rx wiretest current lane, max bad lanes allowed and number of currently marked bad lanes +#define EDI_RX_WT_CLK_LANE_INVERTED 0x800a10000000003f, 49, 1 // clock wiretest lane inverted/swapped status \r\n\t0:(now_swapped) not swapped or inverted \r\n\t1:(swapped) p-n swapped or inverted\r\n\trjr +#define EDI_RX_WT_CLK_LANE_BAD_CODE 0x800a10000000003f, 50, 3 // clock wiretest lane bad code\r\n\t000:(no_error) lane tested good \r\n\t001:(n_stuck_1) n leg stuck at 1 \r\n\t010:(n_stuck_0) n leg stuck at 0 \r\n\t011:(p_stuck_1) p leg stuck at 1 \r\n\t100:(p_stuck_0) p leg stuck at 0 \r\n\t101:(n_or_p_floating) n or p leg floating or swapping undetermined \r\n\t110:(not_used_110)unused.\r\n\t111:(not_used_111)unused\r\n\trjr +#define EDI_RX_WT_CLK_STATUS_PG 0x800a10000000003f, 48, 16 // rx clock wiretest status -- description +#define EDI_RX_EYE_OPT_STATE 0x800ac0000000003f, 48, 8 // common edi/ei4 eye optimizaton state machine \r\n\t00000000: idle \r\n\t00000001: init latch offset cal done \r\n\t00000010: vref/dcd cal done \r\n\t00000011: vga done \r\n\t00000100: unused \r\n\t00000101: unused \r\n\t00000110: unused \r\n\t00000111: ctle done \r\n\t00001000: h1ap adjust done \r\n\t00001001: ddc done \r\n\t00001010: measure eye width done \r\n\t00001011: final l2u adjust done \r\n\t00001100: unused \r\n\t00001101: results check done \r\n\t00001110: eye opt all done \r\n\t00001111: unused \r\n\t00010000: start latch offset cal \r\n\t00010001: start latch offset cal 0 \r\n\t00010010: read latch offset cal 0 status \r\n\t00010011: check latch offset cal 0 status \r\n\t00010100: start latch offset cal 1 \r\n\t00010101: read latch offset cal 1 status \r\n\t00010110: check latch offset cal 1 status \r\n\t00010111: bist latch offset cal done \r\n\t00011000: unused \r\n\t00011001: unused \r\n\t00011010: unused \r\n\t00011011: unused \r\n\t00011100: unused \r\n\t00011101: unused \r\n\t00011110: unused \r\n\t00011111: unused \r\n\t00100000: start vref cal \r\n\t00100001: start vref servo \r\n\t00100010: read vref servo status \r\n\t00100011: check vref servo status \r\n\t00100100: start dcd adjust servo \r\n\t00100101: read dcd adjust servo status \r\n\t00100110: check dcd adjust servo status \r\n\t00100111: unused \r\n\t00101000: unused \r\n\t00101001: unused \r\n\t00101010: unused \r\n\t00101011: unused \r\n\t00101100: unused \r\n\t00101101: unused \r\n\t00101110: unused \r\n\t00101111: unused \r\n\t00110000: vga start-clear done flags \r\n\t00110001: vga measure ape/apo \r\n\t00110010: vga read ape/apo status \r\n\t00110011: vga check ape/apo status \r\n\t00110100: vga measure ane/ano \r\n\t00110101: vga read ane/ano status \r\n\t00110110: vga check ane/ano status \r\n\t00110111: vga measure ape dfe \r\n\t00111000: vga read ape dfe status \r\n\t00111001: vga check ape dfe status \r\n\t00111010: vga measure ane dfe \r\n\t00111011: vga read ane dfe status \r\n\t00111100: vga check ane dfe status \r\n\t00111101: vga measure apo dfe \r\n\t00111110: vga read apo dfe status \r\n\t00111111: vga check apo dfe status \r\n\t01000000: vga measure ano dfe \r\n\t01000001: vga read ano dfe status \r\n\t01000010: vga check ano dfe status \r\n\t01000011: vga measure amin no dfe \r\n\t01000100: vga read amin no dfe status \r\n\t01000101: vga check amin no dfe status \r\n\t01000110: vga measure amin dfe \r\n\t01000111: vga read amin dfe status \r\n\t01001000: vga check amin dfestatus \r\n\t01001001: vga clear lane address \r\n\t01001010: vga check lane valid \r\n\t01001011: vga read rx amp cntl \r\n\t01001100: vga read rx amp values \r\n\t01001101: vga read ape and apo \r\n\t01001110: vga read ane and ano \r\n\t01001111: vga read amine and amino \r\n\t01010000: vga check offset \r\n\t01010001: vga check amax \r\n\t01010010: vga write vga done control \r\n\t01010011: vga write all done status \r\n\t01010100: vga write vga adjust value \r\n\t01010101: vga check done \r\n\t01010110: unused \r\n\t01010111: unused \r\n\t01011000: unused \r\n\t01011001: unused \r\n\t01011010: unused \r\n\t01011011: unused \r\n\t01011100: unused \r\n\t01011101: unused \r\n\t01011110: unused \r\n\t01011111: unused \r\n\t01100000: unused \r\n\t01100001: unused \r\n\t01100010: unused \r\n\t01100011: unused \r\n\t01100100: unused \r\n\t01100101: unused \r\n\t01100110: unused \r\n\t01100111: unused \r\n\t01101000: unused \r\n\t01101001: unused \r\n\t01101010: unused \r\n\t01101011: unused \r\n\t01101100: unused \r\n\t01101101: unused \r\n\t01101110: unused \r\n\t01101111: unused \r\n\t01110000: ctle start \r\n\t01110001: ctle bump left \r\n\t01110010: ctle read bump left status \r\n\t01110011: ctle check bump left status \r\n\t01110100: ctle start servo \r\n\t01110101: ctle read servo status \r\n\t01110110: ctle check servo status \r\n\t01110111: ctle bump right \r\n\t01111000: ctle read bump right status \r\n\t01111001: ctle check bump rightstatus \r\n\t01111010: unused \r\n\t01111011: unused \r\n\t01111100: unused \r\n\t01111101: unused \r\n\t01111110: unused \r\n\t01111111: unused \r\n\t10000000: h1ap tweak start \r\n\t10000001: h1ap tweak run servo \r\n\t10000010: h1ap tweak read servo status \r\n\t10000011: h1ap tweak check servo status \r\n\t10000100: unused \r\n\t10000101: unused \r\n\t10000110: unused \r\n\t10000111: unused \r\n\t10001000: unused \r\n\t10001001: unused \r\n\t10001010: unused \r\n\t10001011: unused \r\n\t10001100: unused \r\n\t10001101: unused \r\n\t10001110: unused \r\n\t10001111: unused \r\n\t10010000: ddc start \r\n\t10010001: ddc run servo \r\n\t10010010: ddc read servo status \r\n\t10010011: ddc check servo status \r\n\t10010100: ddc check clear counter \r\n\t10010101: ddc check fly state \r\n\t10010110: ddc check lane \r\n\t10010111: ddc read lane status \r\n\t10011000: ddc check lane status \r\n\t10011001: ddc write bad ddc \r\n\t10011010: ddc check if all done \r\n\t10011011: unused \r\n\t10011100: unused \r\n\t10011101: unused \r\n\t10011110: unused \r\n\t10011111: unused \r\n\t10100000: eye measure start \r\n\t10100001: eye measure start edge track \r\n\t10100010: eye measure read edge track status \r\n\t10100011: eye measure check edge track status \r\n\t10100100: eye measure fly state \r\n\t10100101: eye measure start eye track \r\n\t10100110: eye measure read eye track status \r\n\t10100111: eye measure check eye track status \r\n\t10101000: unused \r\n\t10101001: unused \r\n\t10101010: unused \r\n\t10101011: unused \r\n\t10101100: unused \r\n\t10101101: unused \r\n\t10101110: unused \r\n\t10101111: unused \r\n\t10110000: final l2u set sls checkers \r\n\t10110001: final l2u run err check timer \r\n\t10110010: final l2u dec l2u delay \r\n\t10110011: final l2u inc prbs \r\n\t10110100: final l2u inc l2u delay \r\n\t10110101: final l2u dec prbs \r\n\t10110110: unused \r\n\t10110111: final l2u run err check timer \r\n\t10111000: final l2u clear l2u counter \r\n\t10111001: final l2u check final delay \r\n\t10111010: final l2u inc l2u final delay \r\n\t10111011: final l2u dec prbs \r\n\t10111100: unused \r\n\t10111101: unused \r\n\t10111110: final l2u done \r\n\t10111111: final l2u fail \r\n\t11000000: final l2u wait for prev group status \r\n\t11000001: final l2u send status to next group \r\n\t11000010: final l2u wait for all group status \r\n\t11000011: unused \r\n\t11000100: unused \r\n\t11000101: unused \r\n\t11000110: unused \r\n\t11000111: unused \r\n\t11001000: unused \r\n\t11001001: unused \r\n\t11001010: unused \r\n\t11001011: unused \r\n\t11001100: unused \r\n\t11001101: unused \r\n\t11001110: final l2u max change send fail \r\n\t11001111: final l2u max change recv fail \r\n\t11010000: result check clear and start \r\n\t11010001: result check fly state \r\n\t11010010: result check for valid lane \r\n\t11010011: result check read eye width \r\n\t11010100: result check write bad width \r\n\t11010101: result check read amin values \r\n\t11010110: result check check height \r\n\t11010111: result check write bad height \r\n\t11011000: result check start ber servo \r\n\t11011001: result check read ber servo stat \r\n\t11011010: result check checkber status \r\n\t11011011: result check read ber count \r\n\t11011100: result checkcheck ber \r\n\t11011101: result check write bad ber \r\n\t11011110: result checkcheck if done \r\n\t11011111: result check fail \r\n\t11100000: completion start \r\n\t11100001: completion enable driving all \r\n\t11100010: completion drive eye opt done \r\n\t11100011: completion set up sls rcvr \r\n\t11100100: completion watch for sls nop \r\n\t11100101: completion drive sls nop ds \r\n\t11100110: completion wait for sls nop \r\n\t11100111: completion undrive lanes \r\n\t11101000: completion drive bogus sls nop \r\n\t11101001: completion wait non-sls data \r\n\t11101010: completion enable receive sls \r\n\t11101011: completion eye opt done \r\n\t11101100: unused \r\n\t11101101: unused \r\n\t11101110: unused \r\n\t11101111: unused \r\n\t11110000: latch offset fail \r\n\t11110001: vref fail \r\n\t11110010: vga measure ape/o fail \r\n\t11110011: vga measure ane/o fail \r\n\t11110100: vga measure ape dfe fail \r\n\t11110101: vga measure ane/o fail \r\n\t11110110: vga measure ane/o fail \r\n\t11110111: vga measure ano dfe fail \r\n\t11111000: vga measure amine fail \r\n\t11111001: vga measure amine fail \r\n\t11111010: ctle adjust fail \r\n\t11111011: h1ap tweak fail \r\n\t11111100: ddc fail \r\n\t11111101: measure eye fail \r\n\t11111110: dcd duty cycle fail \r\n\t11111111: unused \r\n\trjr +#define EDI_RX_EO_RECAL_PG 0x800ac0000000003f, 48, 16 // rx eye opt and recal status -- description +#define EDI_RX_RPR_STATE 0x800990000000003f, 48, 6 // static repair state machine\r\n\tdetailed drawing can be found in the workbook by searching for rx_rpr_state\r\n\tsmr +#define EDI_RX_STATIC_REPAIR_STATE_PG 0x800990000000003f, 48, 16 // rx static repair state machine reg -- description +#define EDI_RX_BAD_LANE1_GCRMSG 0x800988000000003f, 48, 7 // gcr message: encoded bad lane one in relation to the entire rx bus\r\n\tsmr +#define EDI_RX_BAD_LANE2_GCRMSG 0x800988000000003f, 55, 7 // gcr message: encoded bad lane two in relation to the entire rx bus\r\n\tsmr +#define EDI_RX_BAD_LANE_CODE_GCRMSG 0x800988000000003f, 62, 2 // gcr message: rx bad lane code\r\n\t00:(0_bad_lns) zero bad lanes\r\n\t01:(bad_ln1_val) bad lane 1 valid\r\n\t10:(bad_lns12_val) bad lanes 1 and 2 valid\r\n\t11:(3plus_bad_lns) 3+ bad lanes\r\n\tsmr +#define EDI_RX_BAD_LANE_ENC_GCRMSG_PG 0x800988000000003f, 48, 16 // rx bad lanes encoded -- description +#define EDI_RX_START_WDERF_ALIAS 0x800880000000003f, 48, 5 // alias for rx_start_* bits\r\n\tpmt +#define EDI_RX_TRAINING_START_PG 0x800880000000003f, 48, 16 // rx training state start reg -- description +#define EDI_RX_WDERF_DONE_ALIAS 0x800888000000003f, 48, 5 // alias for rx_*_done bits\r\n\tpmt +#define EDI_RX_WDERF_FAILED_ALIAS 0x800888000000003f, 56, 5 // alias for rx_*_failed bits\r\n\tpmt +#define EDI_RX_TRAINING_STATUS_PG 0x800888000000003f, 48, 16 // rx training state status reg -- description +#define EDI_RX_LANE_BAD_VEC_0_15 0x800918000000003f, 48, 16 // lanes found bad by hw (status) or method to force lane bad from software (control).to be clear, the bad_lane vector is only updated during training. it will not reflect bad lanes found post training during dynamic repair or dynamic recal. for that, you need to read the [rx,tx]_bad_lane[1,2]_gcrmsg registers. to calculate what you want to know, you need five registers:\r\n\t rx_bad_lane1_gcrmsg\r\n\t rx_bad_lane2_gcrmsg\r\n\t rx_bad_lane_code_gcrmsg\r\n\t rx_sls_lane_gcrmsg\r\n\t rx_wtr_max_bad_lanes\r\n\tin general, if the spares deployed fir goes on, and the bad_lane_code is a 1, then the newly spared lane resides in the rx_bad_lane1_gcrmsg register. if the spares deployed fir goes on, and the bad_lane_code is a 2, then the newly spared lane resides in the rx_bad_lane2_gcrmsg register. if the spares deployed fir goes on, and the bad_lane_code is a 3, then the newly spared lane resides in the rx_sls_lane_gcrmsg register. that might be enough information for what you want to know, trying to keep the answer very general. at the moment, this case where both the spare deployed and max spares exceeded both come on at the same time, is for the edi where a third bad lane has been found and we have chosen to use the sls lane as a third spare. edi normally only has two spare lanes. in that case, i first set the spare deployed fir as the sls lane is being used as a third spare. but then a few cycles later, i set the max spares exceeded because i no longer have an sls lane and cant finish my sls repair handshake.\r\n\trjr +#define EDI_RX_LANE_BAD_VEC_0_15_PG 0x800918000000003f, 48, 16 // rx bad lanes 0 to 15 reg -- lanes found bad by wiretest or set as bad by firmware +#define EDI_RX_LANE_BAD_VEC_16_31 0x800920000000003f, 48, 16 // lanes found bad by hw (status) or method to force lane bad from software (control).\r\n\trjr +#define EDI_RX_LANE_BAD_VEC_16_31_PG 0x800920000000003f, 48, 16 // rx bad lanes 16 to 31 reg -- lanes found bad by wiretest or set as bad by firmware +#define EDI_RX_LANE_DISABLED_VEC_0_15 0x800928000000003f, 48, 16 // lanes disabled by hw (status) or method to force lane to be disabled (save power) from software (control)\r\n\trjr +#define EDI_RX_LANE_DISABLED_VEC_0_15_PG 0x800928000000003f, 48, 16 // rx lane disable(d) 0 to 15 reg -- lanes disabled by firmware and therefore do not participate in link training +#define EDI_RX_LANE_DISABLED_VEC_16_31 0x800930000000003f, 48, 16 // lanes disabled by hw (status) or method to force lane to be disabled (save power) from software (control)\r\n\trjr +#define EDI_RX_LANE_DISABLED_VEC_16_31_PG 0x800930000000003f, 48, 16 // rx lane disable(d) 16_31 reg -- lanes disabled by firmware and therefore do not participate in link training +#define EDI_SCOM_FIR_PB 0x0000000000000000, 0, 64 // fir scom rw reg -- description +#define EDI_TX_FIR_RESET 0x800c44000000003f, 63, 1 // fir reset\r\n\ttoggle this field 0->1->0 to reset all tx fir related latches including parity error latches, including the parity error latches.\r\n\tpmt +#define EDI_RX_FIR_RESET 0x800848000000003f, 63, 1 // fir reset\r\n\ttoggle this field 0->1->0 to reset all rx fir related latches, including the isolation and parity error latches.\r\n\tpmt +#define EDI_TX_ZCAL_N 0x800f0c000000003f, 48, 9 // calibration circuit nseg enable value this holds the current value of the enabled segments and is 4x multiple of the actual segment count. may be read for current calibration result set during calibration sequence. may be written to immediately update circuit enables on each write. used with tx_zcal_swo_* for manual calibration. do not write when tx_zcal_req = 1. (binary code - 0x00 is zero slices and 0xa1 is maximum slices).\r\n\tjfg +#define EDI_TX_IMPCAL_NVAL_PB 0x800f0c000000003f, 48, 16 // tx impedance cal n value reg -- tx impedance cal n value reg +#define EDI_TX_ZCAL_P 0x800f14000000003f, 48, 9 // calibration circuit pseg enable value this holds the current value of the enabled segments and is 4x multiple of the actual segment count. may be read for current calibration result set during calibration sequence. may be written to immediately update circuit enables on each write. used with tx_zcal_swo_* for manual calibration. do not write when tx_zcal_req = 1. (binary code - 0x00 is zero slices and 0xa1 is maximum slices).\r\n\tjfg +#define EDI_TX_IMPCAL_PVAL_PB 0x800f14000000003f, 48, 16 // tx impedance cal p value reg -- tx impedance cal p value reg +#define EDI_TX_IMPCAL_PB 0x800f04000000003f, 48, 16 // tx impedance cal cntl and status reg -- tx impedance cal cntl and status reg +#define EDI_TX_FFE_MAIN_P_ENC 0x800cd4000000003f, 49, 7 // tbd\r\n\tjfg +#define EDI_TX_FFE_MAIN_N_ENC 0x800cd4000000003f, 57, 7 // tbd\r\n\tjfg +#define EDI_TX_FFE_POST_P_ENC 0x800cdc000000003f, 51, 5 // tbd this field is updated during tx bist by logic temporarily\r\n\tjfg +#define EDI_TX_FFE_POST_N_ENC 0x800cdc000000003f, 59, 5 // tbd\r\n\tjfg +#define EDI_TX_FFE_MARGIN_P_ENC 0x800ce4000000003f, 51, 5 // tbd\r\n\tjfg +#define EDI_TX_FFE_MARGIN_N_ENC 0x800ce4000000003f, 59, 5 // tbd\r\n\tjfg +#define EDI_RX_PDWN_LITE_DISABLE 0x800818000000003f, 50, 1 // disables the power down lite feature of unused spare lanes (generally should match tx_pdwn_lite_disable)\r\n\tsmr +#define EDI_RX_WT_TIMEOUT_SEL 0x800898000000003f, 58, 3 // selects wiretest timeout value. \r\n\t000:(tap0) 64k ui or 6.8us \r\n\t001:(tap1) 128k ui or 13.6us \r\n\t010:(tap2) 256k ui or 27.3us \r\n\t011:(tap3) 1m ui or 109.2us \r\n\t100:(tap4) 2m ui or 218.5us \r\n\t101:(tap5) 4m ui or 436.9us \r\n\t110:(tap6) 8m ui or 873.8us \r\n\t111:(tap7) infinite\r\n\trjr +#define EDI_RX_WT_CU_PLL_PGOOD 0x800a30000000003f, 48, 1 // rx pll/dll enable\r\n\t1:(pgood) sets pgood on rx pll for locking \r\n\t0:(reset) places rx pll in reset\r\n\tjfg +#define EDI_RX_WT_CU_PLL_RESET 0x800a30000000003f, 49, 1 // rx pll/dll enable request\r\n\t1:(enable) clears pll pgood and begins reset timer. see rx_wt_cu_pll_pgooddly. \r\n\t0:(not_enable) do nothing\r\n\tjfg +#define EDI_RX_WT_CU_PLL_PGOODDLY 0x800a30000000003f, 50, 3 // rx pll/dll pgood delay selects length of reset period after rx_wt_cu_pll_reset is set. \r\n\t000:(16ui) minimum 16ui for sim bypass \r\n\t001:(50ns) nominal 50ns reset per pll spec \r\n\t010:(100ns) double nominal 50ns reset per pll spec \r\n\t011:(960ui) typical simulation delay exceeding tx pll 40-refclk locking period \r\n\t100:(unused_100) reserved \r\n\t101:(unused_101) reserved \r\n\t110:(max) 1024 ui \r\n\t111:(disable) disable rx_wt_cu_pll_reset\r\n\tjfg +#define EDI_RX_WT_CU_PLL_LOCK 0x800a30000000003f, 53, 1 // rx pll/dll locked\r\n\tjfg +#define EDI_RX_WT_PLL_REFCLKSEL 0x800a30000000003f, 54, 1 // select between io clock and bist/refclock\r\n\t0:(io_clock) selects io clock \r\n\t1:(alt_refclk) selects bist refclock\r\n\tdmb +#define EDI_RX_PLL_REFCLKSEL_SCOM_EN 0x800a30000000003f, 55, 1 // selects between pll controls and gcr register to select refclk\r\n\t0:(pll_refclk_cntl) uses pll control to select refclk \r\n\t1:(scom_refclk) uses gcr register, rx_wt_pll_refclksel, to select refclock\r\n\tdmb +#define EDI_RX_WIRETEST_PLL_CNTL_PG 0x800a30000000003f, 48, 16 // rx pll or dll reset and calibration controls -- description +#define EDI_RX_OFFSET_CAL_DONE 0x800888000000003f, 54, 1 // when this bit is read as a 1, offset cal has completed. \r\n\tjgr +#define EDI_RX_OFFSET_CAL_FAILED 0x800888000000003f, 62, 1 // when this bit is read as a 1, the rx cu pll failed to lock and offset cal was not performed. (this bit is set along with rx_wt_bypass_failed and rx_start_bist_failed)\r\n\tjgr +#define EDI_RX_TRAINING_STATUS_PG 0x800888000000003f, 48, 16 // rx training state status reg -- description +#define EDI_RX_START_OFFSET_CAL 0x800880000000003f, 54, 1 // set bit to run offset cal and the required tx fifo init, rx cu pll lock, and rx fifo init through the bist helper state machine. \r\n\t0: (idle) idle \r\n\t1: (ocal) start offset cal \r\n\tjgr +#define EDI_RX_EO_LATCH_OFFSET_DONE 0x800a40000000003f, 48, 1 // rx eye optimization latch offset adjustment done\r\n\trjr +#define EDI_TX_ZCAL_REQ 0x800f04000000003f, 49, 1 // impedance calibration sequence enable\r\n\t rising edge initiates calibration seqeunce and clears all status. tx_zcal_done indicates completion and valid results available(default)\r\n\t0:(disabled) inactive. must be set prior to enable. \r\n\t1:(enabled) enable.\r\n\tjfg +#define EDI_TX_ZCAL_DONE 0x800f04000000003f, 50, 1 // impedance calibration sequence complete\r\n\t results are valid when 1.\r\n\tjfg +#define EDI_TX_ZCAL_ERROR 0x800f04000000003f, 51, 1 // impedance calibration sequence error\r\n\t indicates, independent of tx_zcal_done, whether no calibration answer was found, or state machine failed. cleared on tx_zcal_req.\r\n\tjfg @@ -1065,7 +1121,7 @@ #define OPT_SCOM_PPE_FLAGS_CLR_REG 0x0000000000000025, 0, 64 // normal scom mode reg in ppe macro -- description */ - +/* #define EDI_TX_MODE_PL_FULL_REG 0x800404000000003f, 48, 16 // iotk alias: for entire tx_mode_pl register #define EDI_TX_LANE_PDWN 0x800404000000003f, 48, 1 // used to drive inhibit (tristate) and fully power down a lane independent of the logical lane disable. this control is independent from the per-group logical lane disable settings (tx_lane_disable_vec*) in order to allow for flexibility. note that this control routes through the boundary scan logic, which has dominance. also note that per-group registers tx_lane_disabled_vec_0_15 and tx_lane_disabled_vec_16_31 are used to logically disable a lane with respect to the training, recalibration, and repair machines so both this per-lane and the per-group registers need to be set in order to logically disable and powerdown a lane. note that this per-lane register is adjusted for lane swizzling automatically in hw but it is not adjusted automatically in hw when in the msb-lsb swap mode so the erepair procedure needs to take care to power down the correct lane when in this mode. \r\n\t0:(enabled) lane powered up (default)\r\n\t1:(disabled) lane drive inhibited (tristated) and powered down. the lane_disable_vec_* per-group registers configure the state machine but do not automatically power down or tristate the lanes. debug note: you have to account for swizzle when correlating the per-pack latch to the per-group latch setting.\r\n\tmbs #define EDI_TX_LANE_INVERT 0x800404000000003f, 49, 1 // used to invert the polarity of a lane.\r\n\t0:(normal) normal lane polarity (default)\r\n\t1:(inverted) lane inverted.\r\n\tmbs @@ -1673,8 +1729,8 @@ #define EDI_RX_LANE_SWAPPED_VEC_0_15_PG 0x800938000000003f, 48, 16 // rx p & n lanes swapped 0 to 15 reg -- lanes whose p&n receivers are swapped #define EDI_RX_LANE_SWAPPED_VEC_16_31 0x800940000000003f, 48, 16 // wiretest found that the p & n wire legs have been swapped on the lane indicated. has the effect of basically inverting the signal. note that this status is invalid if the lane is marked bad\r\n\trjr #define EDI_RX_LANE_SWAPPED_VEC_16_31_PG 0x800940000000003f, 48, 16 // rx p & n lanes swapped 16 to 31 reg -- lanes whose p&n receivers are swapped -#define EDI_RX_MAIN_INIT_STATE 0x800948000000003f, 48, 4 // main initialization state machine(rjr):\r\n\t0000: idle\r\n\t0001: wiretest running\r\n\t0010: deskew running\r\n\t0011: eye optimization running\r\n\t0100: repair running\r\n\t0101: go functional running\r\n\t1001: wiretest failed\r\n\t:1010: deskew failed\r\n\t1011: eye optimization failed\r\n\t1100: repair failed\r\n\t1101: go functional failed\r\n\tothers: unused\r\n\trjr -#define EDI_RX_INIT_STATE_PG 0x800948000000003f, 48, 16 // rx init machine status -- description +#define edi_rx_main_init_state 0x800948000000003f, 48, 4 // main initialization state machine(rjr):\r\n\t0000: idle\r\n\t0001: wiretest running\r\n\t0010: deskew running\r\n\t0011: eye optimization running\r\n\t0100: repair running\r\n\t0101: go functional running\r\n\t1001: wiretest failed\r\n\t:1010: deskew failed\r\n\t1011: eye optimization failed\r\n\t1100: repair failed\r\n\t1101: go functional failed\r\n\tothers: unused\r\n\trjr +#define edi_rx_init_state_pg 0x800948000000003f, 48, 16 // rx init machine status -- description #define EDI_RX_WTM_STATE 0x800950000000003f, 48, 5 // main wiretest state machine current state (rjr)): \r\n\tx00: idle \r\n\tx01: drv data wt \r\n\tx02: drv clock wt \r\n\tx03: drv data 0 \r\n\tx04: drv clock 0 \r\n\tx05: rx wt \r\n\tx06: wait all ones \r\n\tx07: reset pll \r\n\tx08: wait pll \r\n\tx09: drive clock \r\n\tx0a: drive data 1 \r\n\tx0b: wait all zeroes \r\n\tx0c: drive data 0 \r\n\tx0d: done \r\n\tx0e: unused \r\n\tx0f: unused \r\n\tx10: wait prev done \r\n\tx11: drv prev done \r\n\tx12: drv all done \r\n\tx13: wait all done \r\n\tx14: init tx fifo \r\n\tx15: unused \r\n\tx16: unused \r\n\tx17: unused \r\n\tx18: set c & d dr strength \r\n\tx19: set data only dr strength \r\n\tx1a: clock fail \r\n\tx1b: all bad lanes \r\n\tx1c: wt timeout fail \r\n\tx1d: pll/dll fail \r\n\tx1e: all ones fail \r\n\tx1f: all zeroes fail \r\n\trjr #define EDI_RX_WTR_STATE 0x800950000000003f, 53, 4 // receiver wiretest state machine current state (rjr):x0: idle\r\n\tx1: check clock\r\n\tx2: check lane disabled\r\n\tx3: check data lane\r\n\tx4: store data lane results\r\n\tx5: check if done\r\n\tx6: done--passed\r\n\t: done--failed\r\n\t:x8-xf: unused\r\n\trjr #define EDI_RX_WTL_STATE 0x800950000000003f, 59, 5 // lane wiretest sub state machine current state (rjr)\r\n\tx00: idle\r\n\tx01: wait 1st long transition\r\n\tx02: wait 2nd long transition\r\n\tx03: wait short transition\r\n\tx04: wait transition from pn=01\r\n\tx05: wait transition from 10\r\n\tx06: wait transition from 00\r\n\tx07: wait transition from 11\r\n\tx10: good-no swap\r\n\tx11: bad-n=1-no swap\r\n\tx12: bad-n=0-no swap\r\n\tx13: bad-p=1-no swap\r\n\tx14: bad-p=0-no swap\r\n\tx15: bad-p or n floating\r\n\tx16: bad-pn=00\r\n\tx17: bad-pn=11\r\n\tx18: good--swapped\r\n\tx19: bad-n=1-swapped\r\n\tx1a: bad-n=0-swapped\r\n\tx1b: bad-p=1-swapped\r\n\tx1c: bad-p=0-swapped\r\n\tx1d: bad-pn=10\r\n\tx1e: bad-pn=01\r\n\tx1f: bad-unknown failure\r\n\trjr @@ -2040,6 +2096,7 @@ #define EDI_SCOM_FIR_ACTION0_PB 0x0000000000000006, 0, 64 // fir scom action0 reg -- description #define EDI_SCOM_FIR_ACTION1_PB 0x0000000000000007, 0, 64 // fir scom action1 reg -- description #define EDI_SCOM_FIR_WOF_PB 0x0000000000000008, 0, 64 // fir scom wof reg -- description +*/ /* * Leaving these as comments until we close out EDI+ RAS discussions