1*3fc36ee0SWojciech Macek /******************************************************************************* 2*3fc36ee0SWojciech Macek Copyright (C) 2015 Annapurna Labs Ltd. 3*3fc36ee0SWojciech Macek 4*3fc36ee0SWojciech Macek This file may be licensed under the terms of the Annapurna Labs Commercial 5*3fc36ee0SWojciech Macek License Agreement. 6*3fc36ee0SWojciech Macek 7*3fc36ee0SWojciech Macek Alternatively, this file can be distributed under the terms of the GNU General 8*3fc36ee0SWojciech Macek Public License V2 as published by the Free Software Foundation and can be 9*3fc36ee0SWojciech Macek found at http://www.gnu.org/licenses/gpl-2.0.html 10*3fc36ee0SWojciech Macek 11*3fc36ee0SWojciech Macek Alternatively, redistribution and use in source and binary forms, with or 12*3fc36ee0SWojciech Macek without modification, are permitted provided that the following conditions are 13*3fc36ee0SWojciech Macek met: 14*3fc36ee0SWojciech Macek 15*3fc36ee0SWojciech Macek * Redistributions of source code must retain the above copyright notice, 16*3fc36ee0SWojciech Macek this list of conditions and the following disclaimer. 17*3fc36ee0SWojciech Macek 18*3fc36ee0SWojciech Macek * Redistributions in binary form must reproduce the above copyright 19*3fc36ee0SWojciech Macek notice, this list of conditions and the following disclaimer in 20*3fc36ee0SWojciech Macek the documentation and/or other materials provided with the 21*3fc36ee0SWojciech Macek distribution. 22*3fc36ee0SWojciech Macek 23*3fc36ee0SWojciech Macek THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 24*3fc36ee0SWojciech Macek ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 25*3fc36ee0SWojciech Macek WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 26*3fc36ee0SWojciech Macek DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 27*3fc36ee0SWojciech Macek ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 28*3fc36ee0SWojciech Macek (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 29*3fc36ee0SWojciech Macek LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 30*3fc36ee0SWojciech Macek ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31*3fc36ee0SWojciech Macek (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 32*3fc36ee0SWojciech Macek SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33*3fc36ee0SWojciech Macek 34*3fc36ee0SWojciech Macek *******************************************************************************/ 35*3fc36ee0SWojciech Macek 36*3fc36ee0SWojciech Macek /** 37*3fc36ee0SWojciech Macek * @defgroup group_serdes_api API 38*3fc36ee0SWojciech Macek * SerDes HAL driver API 39*3fc36ee0SWojciech Macek * @ingroup group_serdes SerDes 40*3fc36ee0SWojciech Macek * @{ 41*3fc36ee0SWojciech Macek * 42*3fc36ee0SWojciech Macek * @file al_hal_serdes_interface.h 43*3fc36ee0SWojciech Macek * 44*3fc36ee0SWojciech Macek * @brief Header file for the SerDes HAL driver 45*3fc36ee0SWojciech Macek * 46*3fc36ee0SWojciech Macek */ 47*3fc36ee0SWojciech Macek 48*3fc36ee0SWojciech Macek #ifndef __AL_HAL_SERDES_INTERFACE_H__ 49*3fc36ee0SWojciech Macek #define __AL_HAL_SERDES_INTERFACE_H__ 50*3fc36ee0SWojciech Macek 51*3fc36ee0SWojciech Macek #include "al_hal_common.h" 52*3fc36ee0SWojciech Macek 53*3fc36ee0SWojciech Macek /* *INDENT-OFF* */ 54*3fc36ee0SWojciech Macek #ifdef __cplusplus 55*3fc36ee0SWojciech Macek extern "C" { 56*3fc36ee0SWojciech Macek #endif 57*3fc36ee0SWojciech Macek /* *INDENT-ON* */ 58*3fc36ee0SWojciech Macek 59*3fc36ee0SWojciech Macek enum al_serdes_type { 60*3fc36ee0SWojciech Macek AL_SRDS_TYPE_HSSP, 61*3fc36ee0SWojciech Macek AL_SRDS_TYPE_25G, 62*3fc36ee0SWojciech Macek }; 63*3fc36ee0SWojciech Macek 64*3fc36ee0SWojciech Macek enum al_serdes_reg_page { 65*3fc36ee0SWojciech Macek /* Relevant to Serdes hssp and 25g */ 66*3fc36ee0SWojciech Macek AL_SRDS_REG_PAGE_0_LANE_0 = 0, 67*3fc36ee0SWojciech Macek AL_SRDS_REG_PAGE_1_LANE_1, 68*3fc36ee0SWojciech Macek /* Relevant to Serdes hssp only */ 69*3fc36ee0SWojciech Macek AL_SRDS_REG_PAGE_2_LANE_2, 70*3fc36ee0SWojciech Macek AL_SRDS_REG_PAGE_3_LANE_3, 71*3fc36ee0SWojciech Macek /* Relevant to Serdes hssp and 25g */ 72*3fc36ee0SWojciech Macek AL_SRDS_REG_PAGE_4_COMMON, 73*3fc36ee0SWojciech Macek /* Relevant to Serdes hssp only */ 74*3fc36ee0SWojciech Macek AL_SRDS_REG_PAGE_0123_LANES_0123 = 7, 75*3fc36ee0SWojciech Macek /* Relevant to Serdes 25g only */ 76*3fc36ee0SWojciech Macek AL_SRDS_REG_PAGE_TOP, 77*3fc36ee0SWojciech Macek }; 78*3fc36ee0SWojciech Macek 79*3fc36ee0SWojciech Macek /* Relevant to Serdes hssp only */ 80*3fc36ee0SWojciech Macek enum al_serdes_reg_type { 81*3fc36ee0SWojciech Macek AL_SRDS_REG_TYPE_PMA = 0, 82*3fc36ee0SWojciech Macek AL_SRDS_REG_TYPE_PCS, 83*3fc36ee0SWojciech Macek }; 84*3fc36ee0SWojciech Macek 85*3fc36ee0SWojciech Macek enum al_serdes_lane { 86*3fc36ee0SWojciech Macek AL_SRDS_LANE_0 = AL_SRDS_REG_PAGE_0_LANE_0, 87*3fc36ee0SWojciech Macek AL_SRDS_LANE_1 = AL_SRDS_REG_PAGE_1_LANE_1, 88*3fc36ee0SWojciech Macek AL_SRDS_LANE_2 = AL_SRDS_REG_PAGE_2_LANE_2, 89*3fc36ee0SWojciech Macek AL_SRDS_LANE_3 = AL_SRDS_REG_PAGE_3_LANE_3, 90*3fc36ee0SWojciech Macek 91*3fc36ee0SWojciech Macek AL_SRDS_NUM_LANES, 92*3fc36ee0SWojciech Macek AL_SRDS_LANES_0123 = AL_SRDS_REG_PAGE_0123_LANES_0123, 93*3fc36ee0SWojciech Macek }; 94*3fc36ee0SWojciech Macek 95*3fc36ee0SWojciech Macek /** Serdes loopback mode */ 96*3fc36ee0SWojciech Macek enum al_serdes_lb_mode { 97*3fc36ee0SWojciech Macek /** No loopback */ 98*3fc36ee0SWojciech Macek AL_SRDS_LB_MODE_OFF, 99*3fc36ee0SWojciech Macek 100*3fc36ee0SWojciech Macek /** 101*3fc36ee0SWojciech Macek * Transmits the untimed, partial equalized RX signal out the transmit 102*3fc36ee0SWojciech Macek * IO pins. 103*3fc36ee0SWojciech Macek * No clock used (untimed) 104*3fc36ee0SWojciech Macek */ 105*3fc36ee0SWojciech Macek AL_SRDS_LB_MODE_PMA_IO_UN_TIMED_RX_TO_TX, 106*3fc36ee0SWojciech Macek 107*3fc36ee0SWojciech Macek /** 108*3fc36ee0SWojciech Macek * Loops back the TX serializer output into the CDR. 109*3fc36ee0SWojciech Macek * CDR recovered bit clock used (without attenuation) 110*3fc36ee0SWojciech Macek */ 111*3fc36ee0SWojciech Macek AL_SRDS_LB_MODE_PMA_INTERNALLY_BUFFERED_SERIAL_TX_TO_RX, 112*3fc36ee0SWojciech Macek 113*3fc36ee0SWojciech Macek /** 114*3fc36ee0SWojciech Macek * Loops back the TX driver IO signal to the RX IO pins 115*3fc36ee0SWojciech Macek * CDR recovered bit clock used (only through IO) 116*3fc36ee0SWojciech Macek */ 117*3fc36ee0SWojciech Macek AL_SRDS_LB_MODE_PMA_SERIAL_TX_IO_TO_RX_IO, 118*3fc36ee0SWojciech Macek 119*3fc36ee0SWojciech Macek /** 120*3fc36ee0SWojciech Macek * Parallel loopback from the PMA receive lane data ports, to the 121*3fc36ee0SWojciech Macek * transmit lane data ports 122*3fc36ee0SWojciech Macek * CDR recovered bit clock used 123*3fc36ee0SWojciech Macek */ 124*3fc36ee0SWojciech Macek AL_SRDS_LB_MODE_PMA_PARALLEL_RX_TO_TX, 125*3fc36ee0SWojciech Macek 126*3fc36ee0SWojciech Macek /** Loops received data after elastic buffer to transmit path */ 127*3fc36ee0SWojciech Macek AL_SRDS_LB_MODE_PCS_PIPE, 128*3fc36ee0SWojciech Macek 129*3fc36ee0SWojciech Macek /** Loops TX data (to PMA) to RX path (instead of PMA data) */ 130*3fc36ee0SWojciech Macek AL_SRDS_LB_MODE_PCS_NEAR_END, 131*3fc36ee0SWojciech Macek 132*3fc36ee0SWojciech Macek /** Loops receive data prior to interface block to transmit path */ 133*3fc36ee0SWojciech Macek AL_SRDS_LB_MODE_PCS_FAR_END, 134*3fc36ee0SWojciech Macek }; 135*3fc36ee0SWojciech Macek 136*3fc36ee0SWojciech Macek enum al_serdes_clk_freq { 137*3fc36ee0SWojciech Macek AL_SRDS_CLK_FREQ_NA, 138*3fc36ee0SWojciech Macek AL_SRDS_CLK_FREQ_100_MHZ, 139*3fc36ee0SWojciech Macek AL_SRDS_CLK_FREQ_125_MHZ, 140*3fc36ee0SWojciech Macek AL_SRDS_CLK_FREQ_156_MHZ, 141*3fc36ee0SWojciech Macek }; 142*3fc36ee0SWojciech Macek 143*3fc36ee0SWojciech Macek enum al_serdes_clk_src { 144*3fc36ee0SWojciech Macek AL_SRDS_CLK_SRC_LOGIC_0, 145*3fc36ee0SWojciech Macek AL_SRDS_CLK_SRC_REF_PINS, 146*3fc36ee0SWojciech Macek AL_SRDS_CLK_SRC_R2L, 147*3fc36ee0SWojciech Macek AL_SRDS_CLK_SRC_R2L_PLL, 148*3fc36ee0SWojciech Macek AL_SRDS_CLK_SRC_L2R, 149*3fc36ee0SWojciech Macek }; 150*3fc36ee0SWojciech Macek 151*3fc36ee0SWojciech Macek /** Serdes BIST pattern */ 152*3fc36ee0SWojciech Macek enum al_serdes_bist_pattern { 153*3fc36ee0SWojciech Macek AL_SRDS_BIST_PATTERN_USER, 154*3fc36ee0SWojciech Macek AL_SRDS_BIST_PATTERN_PRBS7, 155*3fc36ee0SWojciech Macek AL_SRDS_BIST_PATTERN_PRBS23, 156*3fc36ee0SWojciech Macek AL_SRDS_BIST_PATTERN_PRBS31, 157*3fc36ee0SWojciech Macek AL_SRDS_BIST_PATTERN_CLK1010, 158*3fc36ee0SWojciech Macek }; 159*3fc36ee0SWojciech Macek 160*3fc36ee0SWojciech Macek /** SerDes group rate */ 161*3fc36ee0SWojciech Macek enum al_serdes_rate { 162*3fc36ee0SWojciech Macek AL_SRDS_RATE_1_8, 163*3fc36ee0SWojciech Macek AL_SRDS_RATE_1_4, 164*3fc36ee0SWojciech Macek AL_SRDS_RATE_1_2, 165*3fc36ee0SWojciech Macek AL_SRDS_RATE_FULL, 166*3fc36ee0SWojciech Macek }; 167*3fc36ee0SWojciech Macek 168*3fc36ee0SWojciech Macek /** SerDes power mode */ 169*3fc36ee0SWojciech Macek enum al_serdes_pm { 170*3fc36ee0SWojciech Macek AL_SRDS_PM_PD, 171*3fc36ee0SWojciech Macek AL_SRDS_PM_P2, 172*3fc36ee0SWojciech Macek AL_SRDS_PM_P1, 173*3fc36ee0SWojciech Macek AL_SRDS_PM_P0S, 174*3fc36ee0SWojciech Macek AL_SRDS_PM_P0, 175*3fc36ee0SWojciech Macek }; 176*3fc36ee0SWojciech Macek 177*3fc36ee0SWojciech Macek /** 178*3fc36ee0SWojciech Macek * Tx de-emphasis parameters 179*3fc36ee0SWojciech Macek */ 180*3fc36ee0SWojciech Macek enum al_serdes_tx_deemph_param { 181*3fc36ee0SWojciech Macek AL_SERDES_TX_DEEMP_C_ZERO, /*< c(0) */ 182*3fc36ee0SWojciech Macek AL_SERDES_TX_DEEMP_C_PLUS, /*< c(1) */ 183*3fc36ee0SWojciech Macek AL_SERDES_TX_DEEMP_C_MINUS, /*< c(-1) */ 184*3fc36ee0SWojciech Macek }; 185*3fc36ee0SWojciech Macek 186*3fc36ee0SWojciech Macek struct al_serdes_adv_tx_params { 187*3fc36ee0SWojciech Macek /* 188*3fc36ee0SWojciech Macek * select the input values location. 189*3fc36ee0SWojciech Macek * When set to true the values will be taken from the internal registers 190*3fc36ee0SWojciech Macek * that will be override with the next following parameters. 191*3fc36ee0SWojciech Macek * When set to false the values will be taken from external pins (the 192*3fc36ee0SWojciech Macek * other parameters in this case is not needed) 193*3fc36ee0SWojciech Macek */ 194*3fc36ee0SWojciech Macek al_bool override; 195*3fc36ee0SWojciech Macek /* 196*3fc36ee0SWojciech Macek * Transmit Amplitude control signal. Used to define the full-scale 197*3fc36ee0SWojciech Macek * maximum swing of the driver. 198*3fc36ee0SWojciech Macek * 000 - Not Supported 199*3fc36ee0SWojciech Macek * 001 - 952mVdiff-pkpk 200*3fc36ee0SWojciech Macek * 010 - 1024mVdiff-pkpk 201*3fc36ee0SWojciech Macek * 011 - 1094mVdiff-pkpk 202*3fc36ee0SWojciech Macek * 100 - 1163mVdiff-pkpk 203*3fc36ee0SWojciech Macek * 101 - 1227mVdiff-pkpk 204*3fc36ee0SWojciech Macek * 110 - 1283mVdiff-pkpk 205*3fc36ee0SWojciech Macek * 111 - 1331mVdiff-pkpk 206*3fc36ee0SWojciech Macek */ 207*3fc36ee0SWojciech Macek uint8_t amp; 208*3fc36ee0SWojciech Macek /* Defines the total number of driver units allocated in the driver */ 209*3fc36ee0SWojciech Macek uint8_t total_driver_units; 210*3fc36ee0SWojciech Macek /* Defines the total number of driver units allocated to the 211*3fc36ee0SWojciech Macek * first post-cursor (C+1) tap. */ 212*3fc36ee0SWojciech Macek uint8_t c_plus_1; 213*3fc36ee0SWojciech Macek /* Defines the total number of driver units allocated to the 214*3fc36ee0SWojciech Macek * second post-cursor (C+2) tap. */ 215*3fc36ee0SWojciech Macek uint8_t c_plus_2; 216*3fc36ee0SWojciech Macek /* Defines the total number of driver units allocated to the 217*3fc36ee0SWojciech Macek * first pre-cursor (C-1) tap. */ 218*3fc36ee0SWojciech Macek uint8_t c_minus_1; 219*3fc36ee0SWojciech Macek /* TX driver Slew Rate control: 220*3fc36ee0SWojciech Macek * 00 - 31ps 221*3fc36ee0SWojciech Macek * 01 - 33ps 222*3fc36ee0SWojciech Macek * 10 - 68ps 223*3fc36ee0SWojciech Macek * 11 - 170ps 224*3fc36ee0SWojciech Macek */ 225*3fc36ee0SWojciech Macek uint8_t slew_rate; 226*3fc36ee0SWojciech Macek }; 227*3fc36ee0SWojciech Macek 228*3fc36ee0SWojciech Macek struct al_serdes_adv_rx_params { 229*3fc36ee0SWojciech Macek /* 230*3fc36ee0SWojciech Macek * select the input values location. 231*3fc36ee0SWojciech Macek * When set to true the values will be taken from the internal registers 232*3fc36ee0SWojciech Macek * that will be override with the next following parameters. 233*3fc36ee0SWojciech Macek * When set to false the values will be taken based in the equalization 234*3fc36ee0SWojciech Macek * results (the other parameters in this case is not needed) 235*3fc36ee0SWojciech Macek */ 236*3fc36ee0SWojciech Macek al_bool override; 237*3fc36ee0SWojciech Macek /* RX agc high frequency dc gain: 238*3fc36ee0SWojciech Macek * -3'b000: -3dB 239*3fc36ee0SWojciech Macek * -3'b001: -2.5dB 240*3fc36ee0SWojciech Macek * -3'b010: -2dB 241*3fc36ee0SWojciech Macek * -3'b011: -1.5dB 242*3fc36ee0SWojciech Macek * -3'b100: -1dB 243*3fc36ee0SWojciech Macek * -3'b101: -0.5dB 244*3fc36ee0SWojciech Macek * -3'b110: -0dB 245*3fc36ee0SWojciech Macek * -3'b111: 0.5dB 246*3fc36ee0SWojciech Macek */ 247*3fc36ee0SWojciech Macek uint8_t dcgain; 248*3fc36ee0SWojciech Macek /* DFE post-shaping tap 3dB frequency 249*3fc36ee0SWojciech Macek * -3'b000: 684MHz 250*3fc36ee0SWojciech Macek * -3'b001: 576MHz 251*3fc36ee0SWojciech Macek * -3'b010: 514MHz 252*3fc36ee0SWojciech Macek * -3'b011: 435MHz 253*3fc36ee0SWojciech Macek * -3'b100: 354MHz 254*3fc36ee0SWojciech Macek * -3'b101: 281MHz 255*3fc36ee0SWojciech Macek * -3'b110: 199MHz 256*3fc36ee0SWojciech Macek * -3'b111: 125MHz 257*3fc36ee0SWojciech Macek */ 258*3fc36ee0SWojciech Macek uint8_t dfe_3db_freq; 259*3fc36ee0SWojciech Macek /* DFE post-shaping tap gain 260*3fc36ee0SWojciech Macek * 0: no pulse shaping tap 261*3fc36ee0SWojciech Macek * 1: -24mVpeak 262*3fc36ee0SWojciech Macek * 2: -45mVpeak 263*3fc36ee0SWojciech Macek * 3: -64mVpeak 264*3fc36ee0SWojciech Macek * 4: -80mVpeak 265*3fc36ee0SWojciech Macek * 5: -93mVpeak 266*3fc36ee0SWojciech Macek * 6: -101mVpeak 267*3fc36ee0SWojciech Macek * 7: -105mVpeak 268*3fc36ee0SWojciech Macek */ 269*3fc36ee0SWojciech Macek uint8_t dfe_gain; 270*3fc36ee0SWojciech Macek /* DFE first tap gain control 271*3fc36ee0SWojciech Macek * -4'b0000: +1mVpeak 272*3fc36ee0SWojciech Macek * -4'b0001: +10mVpeak 273*3fc36ee0SWojciech Macek * .... 274*3fc36ee0SWojciech Macek * -4'b0110: +55mVpeak 275*3fc36ee0SWojciech Macek * -4'b0111: +64mVpeak 276*3fc36ee0SWojciech Macek * -4'b1000: -1mVpeak 277*3fc36ee0SWojciech Macek * -4'b1001: -10mVpeak 278*3fc36ee0SWojciech Macek * .... 279*3fc36ee0SWojciech Macek * -4'b1110: -55mVpeak 280*3fc36ee0SWojciech Macek * -4'b1111: -64mVpeak 281*3fc36ee0SWojciech Macek */ 282*3fc36ee0SWojciech Macek uint8_t dfe_first_tap_ctrl; 283*3fc36ee0SWojciech Macek /* DFE second tap gain control 284*3fc36ee0SWojciech Macek * -4'b0000: +0mVpeak 285*3fc36ee0SWojciech Macek * -4'b0001: +9mVpeak 286*3fc36ee0SWojciech Macek * .... 287*3fc36ee0SWojciech Macek * -4'b0110: +46mVpeak 288*3fc36ee0SWojciech Macek * -4'b0111: +53mVpeak 289*3fc36ee0SWojciech Macek * -4'b1000: -0mVpeak 290*3fc36ee0SWojciech Macek * -4'b1001: -9mVpeak 291*3fc36ee0SWojciech Macek * .... 292*3fc36ee0SWojciech Macek * -4'b1110: -46mVpeak 293*3fc36ee0SWojciech Macek * -4'b1111: -53mVpeak 294*3fc36ee0SWojciech Macek */ 295*3fc36ee0SWojciech Macek uint8_t dfe_secound_tap_ctrl; 296*3fc36ee0SWojciech Macek /* DFE third tap gain control 297*3fc36ee0SWojciech Macek * -4'b0000: +0mVpeak 298*3fc36ee0SWojciech Macek * -4'b0001: +7mVpeak 299*3fc36ee0SWojciech Macek * .... 300*3fc36ee0SWojciech Macek * -4'b0110: +38mVpeak 301*3fc36ee0SWojciech Macek * -4'b0111: +44mVpeak 302*3fc36ee0SWojciech Macek * -4'b1000: -0mVpeak 303*3fc36ee0SWojciech Macek * -4'b1001: -7mVpeak 304*3fc36ee0SWojciech Macek * .... 305*3fc36ee0SWojciech Macek * -4'b1110: -38mVpeak 306*3fc36ee0SWojciech Macek * -4'b1111: -44mVpeak 307*3fc36ee0SWojciech Macek */ 308*3fc36ee0SWojciech Macek uint8_t dfe_third_tap_ctrl; 309*3fc36ee0SWojciech Macek /* DFE fourth tap gain control 310*3fc36ee0SWojciech Macek * -4'b0000: +0mVpeak 311*3fc36ee0SWojciech Macek * -4'b0001: +6mVpeak 312*3fc36ee0SWojciech Macek * .... 313*3fc36ee0SWojciech Macek * -4'b0110: +29mVpeak 314*3fc36ee0SWojciech Macek * -4'b0111: +33mVpeak 315*3fc36ee0SWojciech Macek * -4'b1000: -0mVpeak 316*3fc36ee0SWojciech Macek * -4'b1001: -6mVpeak 317*3fc36ee0SWojciech Macek * .... 318*3fc36ee0SWojciech Macek * -4'b1110: -29mVpeak 319*3fc36ee0SWojciech Macek * -4'b1111: -33mVpeak 320*3fc36ee0SWojciech Macek */ 321*3fc36ee0SWojciech Macek uint8_t dfe_fourth_tap_ctrl; 322*3fc36ee0SWojciech Macek /* Low frequency agc gain (att) select 323*3fc36ee0SWojciech Macek * -3'b000: Disconnected 324*3fc36ee0SWojciech Macek * -3'b001: -18.5dB 325*3fc36ee0SWojciech Macek * -3'b010: -12.5dB 326*3fc36ee0SWojciech Macek * -3'b011: -9dB 327*3fc36ee0SWojciech Macek * -3'b100: -6.5dB 328*3fc36ee0SWojciech Macek * -3'b101: -4.5dB 329*3fc36ee0SWojciech Macek * -3'b110: -2.9dB 330*3fc36ee0SWojciech Macek * -3'b111: -1.6dB 331*3fc36ee0SWojciech Macek */ 332*3fc36ee0SWojciech Macek uint8_t low_freq_agc_gain; 333*3fc36ee0SWojciech Macek /* Provides a RX Equalizer pre-hint, prior to beginning 334*3fc36ee0SWojciech Macek * adaptive equalization */ 335*3fc36ee0SWojciech Macek uint8_t precal_code_sel; 336*3fc36ee0SWojciech Macek /* High frequency agc boost control 337*3fc36ee0SWojciech Macek * Min d0: Boost ~4dB 338*3fc36ee0SWojciech Macek * Max d31: Boost ~20dB 339*3fc36ee0SWojciech Macek */ 340*3fc36ee0SWojciech Macek uint8_t high_freq_agc_boost; 341*3fc36ee0SWojciech Macek }; 342*3fc36ee0SWojciech Macek 343*3fc36ee0SWojciech Macek struct al_serdes_25g_adv_rx_params { 344*3fc36ee0SWojciech Macek /* ATT (PLE Flat-Band Gain) */ 345*3fc36ee0SWojciech Macek uint8_t att; 346*3fc36ee0SWojciech Macek /* APG (CTLE's Flat-Band Gain) */ 347*3fc36ee0SWojciech Macek uint8_t apg; 348*3fc36ee0SWojciech Macek /* LFG (Low-Freq Gain) */ 349*3fc36ee0SWojciech Macek uint8_t lfg; 350*3fc36ee0SWojciech Macek /* HFG (High-Freq Gain) */ 351*3fc36ee0SWojciech Macek uint8_t hfg; 352*3fc36ee0SWojciech Macek /* MBG (MidBand-Freq-knob Gain) */ 353*3fc36ee0SWojciech Macek uint8_t mbg; 354*3fc36ee0SWojciech Macek /* MBF (MidBand-Freq-knob Frequency position Gain) */ 355*3fc36ee0SWojciech Macek uint8_t mbf; 356*3fc36ee0SWojciech Macek /* DFE Tap1 even#0 Value */ 357*3fc36ee0SWojciech Macek int8_t dfe_first_tap_even0_ctrl; 358*3fc36ee0SWojciech Macek /* DFE Tap1 even#1 Value */ 359*3fc36ee0SWojciech Macek int8_t dfe_first_tap_even1_ctrl; 360*3fc36ee0SWojciech Macek /* DFE Tap1 odd#0 Value */ 361*3fc36ee0SWojciech Macek int8_t dfe_first_tap_odd0_ctrl; 362*3fc36ee0SWojciech Macek /* DFE Tap1 odd#1 Value */ 363*3fc36ee0SWojciech Macek int8_t dfe_first_tap_odd1_ctrl; 364*3fc36ee0SWojciech Macek /* DFE Tap2 Value */ 365*3fc36ee0SWojciech Macek int8_t dfe_second_tap_ctrl; 366*3fc36ee0SWojciech Macek /* DFE Tap3 Value */ 367*3fc36ee0SWojciech Macek int8_t dfe_third_tap_ctrl; 368*3fc36ee0SWojciech Macek /* DFE Tap4 Value */ 369*3fc36ee0SWojciech Macek int8_t dfe_fourth_tap_ctrl; 370*3fc36ee0SWojciech Macek /* DFE Tap5 Value */ 371*3fc36ee0SWojciech Macek int8_t dfe_fifth_tap_ctrl; 372*3fc36ee0SWojciech Macek }; 373*3fc36ee0SWojciech Macek 374*3fc36ee0SWojciech Macek struct al_serdes_25g_tx_diag_info { 375*3fc36ee0SWojciech Macek uint8_t regulated_supply; 376*3fc36ee0SWojciech Macek int8_t dcd_trim; 377*3fc36ee0SWojciech Macek uint8_t clk_delay; 378*3fc36ee0SWojciech Macek uint8_t calp_multiplied_by_2; 379*3fc36ee0SWojciech Macek uint8_t caln_multiplied_by_2; 380*3fc36ee0SWojciech Macek }; 381*3fc36ee0SWojciech Macek 382*3fc36ee0SWojciech Macek struct al_serdes_25g_rx_diag_info { 383*3fc36ee0SWojciech Macek int8_t los_offset; 384*3fc36ee0SWojciech Macek int8_t agc_offset; 385*3fc36ee0SWojciech Macek int8_t leq_gainstage_offset; 386*3fc36ee0SWojciech Macek int8_t leq_eq1_offset; 387*3fc36ee0SWojciech Macek int8_t leq_eq2_offset; 388*3fc36ee0SWojciech Macek int8_t leq_eq3_offset; 389*3fc36ee0SWojciech Macek int8_t leq_eq4_offset; 390*3fc36ee0SWojciech Macek int8_t leq_eq5_offset; 391*3fc36ee0SWojciech Macek int8_t summer_even_offset; 392*3fc36ee0SWojciech Macek int8_t summer_odd_offset; 393*3fc36ee0SWojciech Macek int8_t vscan_even_offset; 394*3fc36ee0SWojciech Macek int8_t vscan_odd_offset; 395*3fc36ee0SWojciech Macek int8_t data_slicer_even0_offset; 396*3fc36ee0SWojciech Macek int8_t data_slicer_even1_offset; 397*3fc36ee0SWojciech Macek int8_t data_slicer_odd0_offset; 398*3fc36ee0SWojciech Macek int8_t data_slicer_odd1_offset; 399*3fc36ee0SWojciech Macek int8_t edge_slicer_even_offset; 400*3fc36ee0SWojciech Macek int8_t edge_slicer_odd_offset; 401*3fc36ee0SWojciech Macek int8_t eye_slicer_even_offset; 402*3fc36ee0SWojciech Macek int8_t eye_slicer_odd_offset; 403*3fc36ee0SWojciech Macek uint8_t cdr_clk_i; 404*3fc36ee0SWojciech Macek uint8_t cdr_clk_q; 405*3fc36ee0SWojciech Macek uint8_t cdr_dll; 406*3fc36ee0SWojciech Macek uint8_t cdr_vco_dosc; 407*3fc36ee0SWojciech Macek uint8_t cdr_vco_fr; 408*3fc36ee0SWojciech Macek uint16_t cdr_dlpf; 409*3fc36ee0SWojciech Macek uint8_t ple_resistance; 410*3fc36ee0SWojciech Macek uint8_t rx_term_mode; 411*3fc36ee0SWojciech Macek uint8_t rx_coupling; 412*3fc36ee0SWojciech Macek uint8_t rx_term_cal_code; 413*3fc36ee0SWojciech Macek uint8_t rx_sheet_res_cal_code; 414*3fc36ee0SWojciech Macek }; 415*3fc36ee0SWojciech Macek 416*3fc36ee0SWojciech Macek /** 417*3fc36ee0SWojciech Macek * SRIS parameters 418*3fc36ee0SWojciech Macek */ 419*3fc36ee0SWojciech Macek struct al_serdes_sris_params { 420*3fc36ee0SWojciech Macek /* Controls the frequency accuracy threshold (ppm) for lock detection CDR */ 421*3fc36ee0SWojciech Macek uint16_t ppm_drift_count; 422*3fc36ee0SWojciech Macek /* Controls the frequency accuracy threshold (ppm) for lock detection in the CDR */ 423*3fc36ee0SWojciech Macek uint16_t ppm_drift_max; 424*3fc36ee0SWojciech Macek /* Controls the frequency accuracy threshold (ppm) for lock detection in PLL */ 425*3fc36ee0SWojciech Macek uint16_t synth_ppm_drift_max; 426*3fc36ee0SWojciech Macek /* Elastic buffer full threshold for PCIE modes: GEN1/GEN2 */ 427*3fc36ee0SWojciech Macek uint8_t full_d2r1; 428*3fc36ee0SWojciech Macek /* Elastic buffer full threshold for PCIE modes: GEN3 */ 429*3fc36ee0SWojciech Macek uint8_t full_pcie_g3; 430*3fc36ee0SWojciech Macek /* Elastic buffer midpoint threshold. 431*3fc36ee0SWojciech Macek * Sets the depth of the buffer while in PCIE mode, GEN1/GEN2 432*3fc36ee0SWojciech Macek */ 433*3fc36ee0SWojciech Macek uint8_t rd_threshold_d2r1; 434*3fc36ee0SWojciech Macek /* Elastic buffer midpoint threshold. 435*3fc36ee0SWojciech Macek * Sets the depth of the buffer while in PCIE mode, GEN3 436*3fc36ee0SWojciech Macek */ 437*3fc36ee0SWojciech Macek uint8_t rd_threshold_pcie_g3; 438*3fc36ee0SWojciech Macek }; 439*3fc36ee0SWojciech Macek 440*3fc36ee0SWojciech Macek /** SerDes PCIe Rate - values are important for proper behavior */ 441*3fc36ee0SWojciech Macek enum al_serdes_pcie_rate { 442*3fc36ee0SWojciech Macek AL_SRDS_PCIE_RATE_GEN1 = 0, 443*3fc36ee0SWojciech Macek AL_SRDS_PCIE_RATE_GEN2, 444*3fc36ee0SWojciech Macek AL_SRDS_PCIE_RATE_GEN3, 445*3fc36ee0SWojciech Macek }; 446*3fc36ee0SWojciech Macek 447*3fc36ee0SWojciech Macek struct al_serdes_grp_obj { 448*3fc36ee0SWojciech Macek void __iomem *regs_base; 449*3fc36ee0SWojciech Macek 450*3fc36ee0SWojciech Macek /** 451*3fc36ee0SWojciech Macek * get the type of the serdes. 452*3fc36ee0SWojciech Macek * Must be implemented for all SerDes unit. 453*3fc36ee0SWojciech Macek * 454*3fc36ee0SWojciech Macek * @return the serdes type. 455*3fc36ee0SWojciech Macek */ 456*3fc36ee0SWojciech Macek enum al_serdes_type (*type_get)(void); 457*3fc36ee0SWojciech Macek 458*3fc36ee0SWojciech Macek /** 459*3fc36ee0SWojciech Macek * Reads a SERDES internal register 460*3fc36ee0SWojciech Macek * 461*3fc36ee0SWojciech Macek * @param obj The object context 462*3fc36ee0SWojciech Macek * @param page The SERDES register page within the group 463*3fc36ee0SWojciech Macek * @param type The SERDES register type (PMA /PCS) 464*3fc36ee0SWojciech Macek * @param offset The SERDES register offset (0 - 4095) 465*3fc36ee0SWojciech Macek * @param data The read data 466*3fc36ee0SWojciech Macek * 467*3fc36ee0SWojciech Macek * @return 0 if no error found. 468*3fc36ee0SWojciech Macek */ 469*3fc36ee0SWojciech Macek int (*reg_read)(struct al_serdes_grp_obj *, enum al_serdes_reg_page, 470*3fc36ee0SWojciech Macek enum al_serdes_reg_type, uint16_t, uint8_t *); 471*3fc36ee0SWojciech Macek 472*3fc36ee0SWojciech Macek /** 473*3fc36ee0SWojciech Macek * Writes a SERDES internal register 474*3fc36ee0SWojciech Macek * 475*3fc36ee0SWojciech Macek * @param obj The object context 476*3fc36ee0SWojciech Macek * @param page The SERDES register page within the group 477*3fc36ee0SWojciech Macek * @param type The SERDES register type (PMA /PCS) 478*3fc36ee0SWojciech Macek * @param offset The SERDES register offset (0 - 4095) 479*3fc36ee0SWojciech Macek * @param data The data to write 480*3fc36ee0SWojciech Macek * 481*3fc36ee0SWojciech Macek * @return 0 if no error found. 482*3fc36ee0SWojciech Macek */ 483*3fc36ee0SWojciech Macek int (*reg_write)(struct al_serdes_grp_obj *, enum al_serdes_reg_page, 484*3fc36ee0SWojciech Macek enum al_serdes_reg_type, uint16_t, uint8_t); 485*3fc36ee0SWojciech Macek 486*3fc36ee0SWojciech Macek /** 487*3fc36ee0SWojciech Macek * Enable BIST required overrides 488*3fc36ee0SWojciech Macek * 489*3fc36ee0SWojciech Macek * @param obj The object context 490*3fc36ee0SWojciech Macek * @param grp The SERDES group 491*3fc36ee0SWojciech Macek * @param rate The required speed rate 492*3fc36ee0SWojciech Macek */ 493*3fc36ee0SWojciech Macek void (*bist_overrides_enable)(struct al_serdes_grp_obj *, enum al_serdes_rate); 494*3fc36ee0SWojciech Macek /** 495*3fc36ee0SWojciech Macek * Disable BIST required overrides 496*3fc36ee0SWojciech Macek * 497*3fc36ee0SWojciech Macek * @param obj The object context 498*3fc36ee0SWojciech Macek * @param grp The SERDES group 499*3fc36ee0SWojciech Macek * @param rate The required speed rate 500*3fc36ee0SWojciech Macek */ 501*3fc36ee0SWojciech Macek void (*bist_overrides_disable)(struct al_serdes_grp_obj *); 502*3fc36ee0SWojciech Macek /** 503*3fc36ee0SWojciech Macek * Rx rate change 504*3fc36ee0SWojciech Macek * 505*3fc36ee0SWojciech Macek * @param obj The object context 506*3fc36ee0SWojciech Macek * @param grp The SERDES group 507*3fc36ee0SWojciech Macek * @param rate The Rx required rate 508*3fc36ee0SWojciech Macek */ 509*3fc36ee0SWojciech Macek void (*rx_rate_change)(struct al_serdes_grp_obj *, enum al_serdes_rate); 510*3fc36ee0SWojciech Macek /** 511*3fc36ee0SWojciech Macek * SERDES lane Rx rate change software flow enable 512*3fc36ee0SWojciech Macek * 513*3fc36ee0SWojciech Macek * @param obj The object context 514*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 515*3fc36ee0SWojciech Macek */ 516*3fc36ee0SWojciech Macek void (*rx_rate_change_sw_flow_en)(struct al_serdes_grp_obj *, enum al_serdes_lane); 517*3fc36ee0SWojciech Macek /** 518*3fc36ee0SWojciech Macek * SERDES lane Rx rate change software flow disable 519*3fc36ee0SWojciech Macek * 520*3fc36ee0SWojciech Macek * @param obj The object context 521*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 522*3fc36ee0SWojciech Macek */ 523*3fc36ee0SWojciech Macek void (*rx_rate_change_sw_flow_dis)(struct al_serdes_grp_obj *, enum al_serdes_lane); 524*3fc36ee0SWojciech Macek /** 525*3fc36ee0SWojciech Macek * PCIe lane rate override check 526*3fc36ee0SWojciech Macek * 527*3fc36ee0SWojciech Macek * @param obj The object context 528*3fc36ee0SWojciech Macek * @param grp The SERDES group 529*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 530*3fc36ee0SWojciech Macek * 531*3fc36ee0SWojciech Macek * @returns AL_TRUE if the override is enabled 532*3fc36ee0SWojciech Macek */ 533*3fc36ee0SWojciech Macek al_bool (*pcie_rate_override_is_enabled)(struct al_serdes_grp_obj *, enum al_serdes_lane); 534*3fc36ee0SWojciech Macek /** 535*3fc36ee0SWojciech Macek * PCIe lane rate override control 536*3fc36ee0SWojciech Macek * 537*3fc36ee0SWojciech Macek * @param obj The object context 538*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 539*3fc36ee0SWojciech Macek * @param en Enable/disable 540*3fc36ee0SWojciech Macek */ 541*3fc36ee0SWojciech Macek void (*pcie_rate_override_enable_set)(struct al_serdes_grp_obj *, enum al_serdes_lane, 542*3fc36ee0SWojciech Macek al_bool en); 543*3fc36ee0SWojciech Macek /** 544*3fc36ee0SWojciech Macek * PCIe lane rate get 545*3fc36ee0SWojciech Macek * 546*3fc36ee0SWojciech Macek * @param obj The object context 547*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 548*3fc36ee0SWojciech Macek */ 549*3fc36ee0SWojciech Macek enum al_serdes_pcie_rate (*pcie_rate_get)(struct al_serdes_grp_obj *, enum al_serdes_lane); 550*3fc36ee0SWojciech Macek /** 551*3fc36ee0SWojciech Macek * PCIe lane rate set 552*3fc36ee0SWojciech Macek * 553*3fc36ee0SWojciech Macek * @param obj The object context 554*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 555*3fc36ee0SWojciech Macek * @param rate The required rate 556*3fc36ee0SWojciech Macek */ 557*3fc36ee0SWojciech Macek void (*pcie_rate_set)(struct al_serdes_grp_obj *, enum al_serdes_lane, 558*3fc36ee0SWojciech Macek enum al_serdes_pcie_rate rate); 559*3fc36ee0SWojciech Macek /** 560*3fc36ee0SWojciech Macek * SERDES group power mode control 561*3fc36ee0SWojciech Macek * 562*3fc36ee0SWojciech Macek * @param obj The object context 563*3fc36ee0SWojciech Macek * @param grp The SERDES group 564*3fc36ee0SWojciech Macek * @param pm The required power mode 565*3fc36ee0SWojciech Macek */ 566*3fc36ee0SWojciech Macek void (*group_pm_set)(struct al_serdes_grp_obj *, enum al_serdes_pm); 567*3fc36ee0SWojciech Macek /** 568*3fc36ee0SWojciech Macek * SERDES lane power mode control 569*3fc36ee0SWojciech Macek * 570*3fc36ee0SWojciech Macek * @param obj The object context 571*3fc36ee0SWojciech Macek * @param grp The SERDES group 572*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 573*3fc36ee0SWojciech Macek * @param rx_pm The required RX power mode 574*3fc36ee0SWojciech Macek * @param tx_pm The required TX power mode 575*3fc36ee0SWojciech Macek */ 576*3fc36ee0SWojciech Macek void (*lane_pm_set)(struct al_serdes_grp_obj *, enum al_serdes_lane, 577*3fc36ee0SWojciech Macek enum al_serdes_pm, enum al_serdes_pm); 578*3fc36ee0SWojciech Macek 579*3fc36ee0SWojciech Macek /** 580*3fc36ee0SWojciech Macek * SERDES group PMA hard reset 581*3fc36ee0SWojciech Macek * Controls Serdes group PMA hard reset 582*3fc36ee0SWojciech Macek * 583*3fc36ee0SWojciech Macek * @param obj The object context 584*3fc36ee0SWojciech Macek * @param grp The SERDES group 585*3fc36ee0SWojciech Macek * @param enable Enable/disable hard reset 586*3fc36ee0SWojciech Macek */ 587*3fc36ee0SWojciech Macek void (*pma_hard_reset_group)(struct al_serdes_grp_obj *, al_bool); 588*3fc36ee0SWojciech Macek /** 589*3fc36ee0SWojciech Macek * SERDES lane PMA hard reset 590*3fc36ee0SWojciech Macek * Controls Serdes lane PMA hard reset 591*3fc36ee0SWojciech Macek * 592*3fc36ee0SWojciech Macek * @param obj The object context 593*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 594*3fc36ee0SWojciech Macek * @param enable Enable/disable hard reset 595*3fc36ee0SWojciech Macek */ 596*3fc36ee0SWojciech Macek void (*pma_hard_reset_lane)(struct al_serdes_grp_obj *, enum al_serdes_lane, al_bool); 597*3fc36ee0SWojciech Macek /** 598*3fc36ee0SWojciech Macek * Configure SERDES loopback 599*3fc36ee0SWojciech Macek * Controls the loopback 600*3fc36ee0SWojciech Macek * 601*3fc36ee0SWojciech Macek * @param obj The object context 602*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 603*3fc36ee0SWojciech Macek * @param mode The requested loopback mode 604*3fc36ee0SWojciech Macek */ 605*3fc36ee0SWojciech Macek void (*loopback_control)(struct al_serdes_grp_obj *, enum al_serdes_lane, 606*3fc36ee0SWojciech Macek enum al_serdes_lb_mode); 607*3fc36ee0SWojciech Macek /** 608*3fc36ee0SWojciech Macek * SERDES BIST pattern selection 609*3fc36ee0SWojciech Macek * Selects the BIST pattern to be used 610*3fc36ee0SWojciech Macek * 611*3fc36ee0SWojciech Macek * @param obj The object context 612*3fc36ee0SWojciech Macek * @param pattern The pattern to set 613*3fc36ee0SWojciech Macek * @param user_data The pattern user data (when pattern == AL_SRDS_BIST_PATTERN_USER) 614*3fc36ee0SWojciech Macek * 80 bits (8 bytes array) 615*3fc36ee0SWojciech Macek */ 616*3fc36ee0SWojciech Macek void (*bist_pattern_select)(struct al_serdes_grp_obj *, 617*3fc36ee0SWojciech Macek enum al_serdes_bist_pattern, uint8_t *); 618*3fc36ee0SWojciech Macek /** 619*3fc36ee0SWojciech Macek * SERDES BIST TX Enable 620*3fc36ee0SWojciech Macek * Enables/disables TX BIST per lane 621*3fc36ee0SWojciech Macek * 622*3fc36ee0SWojciech Macek * @param obj The object context 623*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 624*3fc36ee0SWojciech Macek * @param enable Enable or disable TX BIST 625*3fc36ee0SWojciech Macek */ 626*3fc36ee0SWojciech Macek void (*bist_tx_enable)(struct al_serdes_grp_obj *, enum al_serdes_lane, al_bool); 627*3fc36ee0SWojciech Macek /** 628*3fc36ee0SWojciech Macek * SERDES BIST TX single bit error injection 629*3fc36ee0SWojciech Macek * Injects single bit error during a TX BIST 630*3fc36ee0SWojciech Macek * 631*3fc36ee0SWojciech Macek * @param obj The object context 632*3fc36ee0SWojciech Macek */ 633*3fc36ee0SWojciech Macek void (*bist_tx_err_inject)(struct al_serdes_grp_obj *); 634*3fc36ee0SWojciech Macek /** 635*3fc36ee0SWojciech Macek * SERDES BIST RX Enable 636*3fc36ee0SWojciech Macek * Enables/disables RX BIST per lane 637*3fc36ee0SWojciech Macek * 638*3fc36ee0SWojciech Macek * @param obj The object context 639*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 640*3fc36ee0SWojciech Macek * @param enable Enable or disable TX BIST 641*3fc36ee0SWojciech Macek */ 642*3fc36ee0SWojciech Macek void (*bist_rx_enable)(struct al_serdes_grp_obj *, enum al_serdes_lane, al_bool); 643*3fc36ee0SWojciech Macek /** 644*3fc36ee0SWojciech Macek * SERDES BIST RX status 645*3fc36ee0SWojciech Macek * Checks the RX BIST status for a specific SERDES lane 646*3fc36ee0SWojciech Macek * 647*3fc36ee0SWojciech Macek * @param obj The object context 648*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 649*3fc36ee0SWojciech Macek * @param is_locked An indication whether RX BIST is locked 650*3fc36ee0SWojciech Macek * @param err_cnt_overflow An indication whether error count overflow occured 651*3fc36ee0SWojciech Macek * @param err_cnt Current bit error count 652*3fc36ee0SWojciech Macek */ 653*3fc36ee0SWojciech Macek void (*bist_rx_status)(struct al_serdes_grp_obj *, enum al_serdes_lane, al_bool *, 654*3fc36ee0SWojciech Macek al_bool *, uint32_t *); 655*3fc36ee0SWojciech Macek 656*3fc36ee0SWojciech Macek /** 657*3fc36ee0SWojciech Macek * Set the tx de-emphasis to preset values 658*3fc36ee0SWojciech Macek * 659*3fc36ee0SWojciech Macek * @param obj The object context 660*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 661*3fc36ee0SWojciech Macek * 662*3fc36ee0SWojciech Macek */ 663*3fc36ee0SWojciech Macek void (*tx_deemph_preset)(struct al_serdes_grp_obj *, enum al_serdes_lane); 664*3fc36ee0SWojciech Macek /** 665*3fc36ee0SWojciech Macek * Increase tx de-emphasis param. 666*3fc36ee0SWojciech Macek * 667*3fc36ee0SWojciech Macek * @param obj The object context 668*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 669*3fc36ee0SWojciech Macek * @param param which tx de-emphasis to change 670*3fc36ee0SWojciech Macek * 671*3fc36ee0SWojciech Macek * @return false in case max is reached. true otherwise. 672*3fc36ee0SWojciech Macek */ 673*3fc36ee0SWojciech Macek al_bool (*tx_deemph_inc)(struct al_serdes_grp_obj *, enum al_serdes_lane, 674*3fc36ee0SWojciech Macek enum al_serdes_tx_deemph_param); 675*3fc36ee0SWojciech Macek /** 676*3fc36ee0SWojciech Macek * Decrease tx de-emphasis param. 677*3fc36ee0SWojciech Macek * 678*3fc36ee0SWojciech Macek * @param obj The object context 679*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 680*3fc36ee0SWojciech Macek * @param param which tx de-emphasis to change 681*3fc36ee0SWojciech Macek * 682*3fc36ee0SWojciech Macek * @return false in case min is reached. true otherwise. 683*3fc36ee0SWojciech Macek */ 684*3fc36ee0SWojciech Macek al_bool (*tx_deemph_dec)(struct al_serdes_grp_obj *, enum al_serdes_lane, 685*3fc36ee0SWojciech Macek enum al_serdes_tx_deemph_param); 686*3fc36ee0SWojciech Macek /** 687*3fc36ee0SWojciech Macek * run Rx eye measurement. 688*3fc36ee0SWojciech Macek * 689*3fc36ee0SWojciech Macek * @param obj The object context 690*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 691*3fc36ee0SWojciech Macek * @param timeout timeout in uSec 692*3fc36ee0SWojciech Macek * @param value Rx eye measurement value 693*3fc36ee0SWojciech Macek * (0 - completely closed eye, 0xffff - completely open eye). 694*3fc36ee0SWojciech Macek * 695*3fc36ee0SWojciech Macek * @return 0 if no error found. 696*3fc36ee0SWojciech Macek */ 697*3fc36ee0SWojciech Macek int (*eye_measure_run)(struct al_serdes_grp_obj *, enum al_serdes_lane, 698*3fc36ee0SWojciech Macek uint32_t, unsigned int *); 699*3fc36ee0SWojciech Macek /** 700*3fc36ee0SWojciech Macek * Eye diagram single sampling 701*3fc36ee0SWojciech Macek * 702*3fc36ee0SWojciech Macek * @param obj The object context 703*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 704*3fc36ee0SWojciech Macek * @param x Sampling X position (0 - 63 --> -1.00 UI ... 1.00 UI) 705*3fc36ee0SWojciech Macek * @param y Sampling Y position (0 - 62 --> 500mV ... -500mV) 706*3fc36ee0SWojciech Macek * @param timeout timeout in uSec 707*3fc36ee0SWojciech Macek * @param value Eye diagram sample value (BER - 0x0000 - 0xffff) 708*3fc36ee0SWojciech Macek * 709*3fc36ee0SWojciech Macek * @return 0 if no error found. 710*3fc36ee0SWojciech Macek */ 711*3fc36ee0SWojciech Macek int (*eye_diag_sample)(struct al_serdes_grp_obj *, enum al_serdes_lane, 712*3fc36ee0SWojciech Macek unsigned int, int, unsigned int, unsigned int *); 713*3fc36ee0SWojciech Macek 714*3fc36ee0SWojciech Macek /** 715*3fc36ee0SWojciech Macek * Eye diagram full run 716*3fc36ee0SWojciech Macek * 717*3fc36ee0SWojciech Macek * @param obj The object context 718*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 719*3fc36ee0SWojciech Macek * @param x_start Sampling from X position 720*3fc36ee0SWojciech Macek * @param x_stop Sampling to X position 721*3fc36ee0SWojciech Macek * @param x_step jump in x_step 722*3fc36ee0SWojciech Macek * @param y_start Sampling from Y position 723*3fc36ee0SWojciech Macek * @param y_stop Sampling to Y position 724*3fc36ee0SWojciech Macek * @param y_step jump in y_step 725*3fc36ee0SWojciech Macek * @param num_bits_per_sample How many bits to check 726*3fc36ee0SWojciech Macek * @param buf array of results 727*3fc36ee0SWojciech Macek * @param buf_size array size - must be equal to 728*3fc36ee0SWojciech Macek * (((y_stop - y_start) / y_step) + 1) * 729*3fc36ee0SWojciech Macek * (((x_stop - x_start) / x_step) + 1) 730*3fc36ee0SWojciech Macek * 731*3fc36ee0SWojciech Macek * @return 0 if no error found. 732*3fc36ee0SWojciech Macek */ 733*3fc36ee0SWojciech Macek int (*eye_diag_run)(struct al_serdes_grp_obj *, enum al_serdes_lane, 734*3fc36ee0SWojciech Macek int, int, unsigned int, int, int, unsigned int, uint64_t, uint64_t *, 735*3fc36ee0SWojciech Macek uint32_t); 736*3fc36ee0SWojciech Macek /** 737*3fc36ee0SWojciech Macek * Check if signal is detected 738*3fc36ee0SWojciech Macek * 739*3fc36ee0SWojciech Macek * @param obj The object context 740*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 741*3fc36ee0SWojciech Macek * 742*3fc36ee0SWojciech Macek * @return true if signal is detected. false otherwise. 743*3fc36ee0SWojciech Macek */ 744*3fc36ee0SWojciech Macek al_bool (*signal_is_detected)(struct al_serdes_grp_obj *, enum al_serdes_lane); 745*3fc36ee0SWojciech Macek 746*3fc36ee0SWojciech Macek /** 747*3fc36ee0SWojciech Macek * Check if CDR is locked 748*3fc36ee0SWojciech Macek * 749*3fc36ee0SWojciech Macek * @param obj The object context 750*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 751*3fc36ee0SWojciech Macek * 752*3fc36ee0SWojciech Macek * @return true if cdr is locked. false otherwise. 753*3fc36ee0SWojciech Macek */ 754*3fc36ee0SWojciech Macek al_bool (*cdr_is_locked)(struct al_serdes_grp_obj *, enum al_serdes_lane); 755*3fc36ee0SWojciech Macek 756*3fc36ee0SWojciech Macek /** 757*3fc36ee0SWojciech Macek * Check if rx is valid for this lane 758*3fc36ee0SWojciech Macek * 759*3fc36ee0SWojciech Macek * @param obj The object context 760*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 761*3fc36ee0SWojciech Macek * 762*3fc36ee0SWojciech Macek * @return true if rx is valid. false otherwise. 763*3fc36ee0SWojciech Macek */ 764*3fc36ee0SWojciech Macek al_bool (*rx_valid)(struct al_serdes_grp_obj *, enum al_serdes_lane); 765*3fc36ee0SWojciech Macek 766*3fc36ee0SWojciech Macek /** 767*3fc36ee0SWojciech Macek * configure tx advanced parameters 768*3fc36ee0SWojciech Macek * 769*3fc36ee0SWojciech Macek * @param obj The object context 770*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 771*3fc36ee0SWojciech Macek * @param params pointer to the tx parameters 772*3fc36ee0SWojciech Macek */ 773*3fc36ee0SWojciech Macek void (*tx_advanced_params_set)(struct al_serdes_grp_obj *, enum al_serdes_lane, void *); 774*3fc36ee0SWojciech Macek /** 775*3fc36ee0SWojciech Macek * read tx advanced parameters 776*3fc36ee0SWojciech Macek * 777*3fc36ee0SWojciech Macek * @param obj The object context 778*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 779*3fc36ee0SWojciech Macek * @param params pointer to the tx parameters 780*3fc36ee0SWojciech Macek */ 781*3fc36ee0SWojciech Macek void (*tx_advanced_params_get)(struct al_serdes_grp_obj *, enum al_serdes_lane, void *); 782*3fc36ee0SWojciech Macek /** 783*3fc36ee0SWojciech Macek * configure rx advanced parameters 784*3fc36ee0SWojciech Macek * 785*3fc36ee0SWojciech Macek * @param obj The object context 786*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 787*3fc36ee0SWojciech Macek * @param params pointer to the rx parameters 788*3fc36ee0SWojciech Macek */ 789*3fc36ee0SWojciech Macek void (*rx_advanced_params_set)(struct al_serdes_grp_obj *, enum al_serdes_lane, void *); 790*3fc36ee0SWojciech Macek /** 791*3fc36ee0SWojciech Macek * read rx advanced parameters 792*3fc36ee0SWojciech Macek * 793*3fc36ee0SWojciech Macek * @param obj The object context 794*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 795*3fc36ee0SWojciech Macek * @param params pointer to the rx parameters 796*3fc36ee0SWojciech Macek */ 797*3fc36ee0SWojciech Macek void (*rx_advanced_params_get)(struct al_serdes_grp_obj *, enum al_serdes_lane, void *); 798*3fc36ee0SWojciech Macek /** 799*3fc36ee0SWojciech Macek * Switch entire SerDes group to SGMII mode based on 156.25 Mhz reference clock 800*3fc36ee0SWojciech Macek * 801*3fc36ee0SWojciech Macek * @param obj The object context 802*3fc36ee0SWojciech Macek * 803*3fc36ee0SWojciech Macek */ 804*3fc36ee0SWojciech Macek void (*mode_set_sgmii)(struct al_serdes_grp_obj *); 805*3fc36ee0SWojciech Macek /** 806*3fc36ee0SWojciech Macek * Switch entire SerDes group to KR mode based on 156.25 Mhz reference clock 807*3fc36ee0SWojciech Macek * 808*3fc36ee0SWojciech Macek * @param obj The object context 809*3fc36ee0SWojciech Macek * 810*3fc36ee0SWojciech Macek */ 811*3fc36ee0SWojciech Macek void (*mode_set_kr)(struct al_serdes_grp_obj *); 812*3fc36ee0SWojciech Macek /** 813*3fc36ee0SWojciech Macek * performs SerDes HW equalization test and update equalization parameters 814*3fc36ee0SWojciech Macek * 815*3fc36ee0SWojciech Macek * @param obj the object context 816*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 817*3fc36ee0SWojciech Macek */ 818*3fc36ee0SWojciech Macek int (*rx_equalization)(struct al_serdes_grp_obj *, enum al_serdes_lane); 819*3fc36ee0SWojciech Macek /** 820*3fc36ee0SWojciech Macek * performs Rx equalization and compute the width and height of the eye 821*3fc36ee0SWojciech Macek * 822*3fc36ee0SWojciech Macek * @param obj the object context 823*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 824*3fc36ee0SWojciech Macek * @param width the output width of the eye 825*3fc36ee0SWojciech Macek * @param height the output height of the eye 826*3fc36ee0SWojciech Macek */ 827*3fc36ee0SWojciech Macek int (*calc_eye_size)(struct al_serdes_grp_obj *, enum al_serdes_lane, int *, int *); 828*3fc36ee0SWojciech Macek /** 829*3fc36ee0SWojciech Macek * SRIS: Separate Refclk Independent SSC (Spread Spectrum Clocking) 830*3fc36ee0SWojciech Macek * Currently available only for PCIe interfaces. 831*3fc36ee0SWojciech Macek * When working with local Refclk, same SRIS configuration in both serdes sides 832*3fc36ee0SWojciech Macek * (EP and RC in PCIe interface) is required. 833*3fc36ee0SWojciech Macek * 834*3fc36ee0SWojciech Macek * performs SRIS configuration according to params 835*3fc36ee0SWojciech Macek * 836*3fc36ee0SWojciech Macek * @param obj the object context 837*3fc36ee0SWojciech Macek * @param params the SRIS parameters 838*3fc36ee0SWojciech Macek */ 839*3fc36ee0SWojciech Macek void (*sris_config)(struct al_serdes_grp_obj *, void *); 840*3fc36ee0SWojciech Macek /** 841*3fc36ee0SWojciech Macek * set SERDES dcgain parameter 842*3fc36ee0SWojciech Macek * 843*3fc36ee0SWojciech Macek * @param obj the object context 844*3fc36ee0SWojciech Macek * @param dcgain dcgain value to set 845*3fc36ee0SWojciech Macek */ 846*3fc36ee0SWojciech Macek void (*dcgain_set)(struct al_serdes_grp_obj *, uint8_t); 847*3fc36ee0SWojciech Macek /** 848*3fc36ee0SWojciech Macek * read tx diagnostics info 849*3fc36ee0SWojciech Macek * 850*3fc36ee0SWojciech Macek * @param obj The object context 851*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 852*3fc36ee0SWojciech Macek * @param params pointer to the tx diagnostics info structure 853*3fc36ee0SWojciech Macek */ 854*3fc36ee0SWojciech Macek void (*tx_diag_info_get)(struct al_serdes_grp_obj *, enum al_serdes_lane, void*); 855*3fc36ee0SWojciech Macek /** 856*3fc36ee0SWojciech Macek * read rx diagnostics info 857*3fc36ee0SWojciech Macek * 858*3fc36ee0SWojciech Macek * @param obj The object context 859*3fc36ee0SWojciech Macek * @param lane The SERDES lane within the group 860*3fc36ee0SWojciech Macek * @param params pointer to the rx diagnostics info structure 861*3fc36ee0SWojciech Macek */ 862*3fc36ee0SWojciech Macek void (*rx_diag_info_get)(struct al_serdes_grp_obj *, enum al_serdes_lane, void*); 863*3fc36ee0SWojciech Macek }; 864*3fc36ee0SWojciech Macek 865*3fc36ee0SWojciech Macek 866*3fc36ee0SWojciech Macek /* *INDENT-OFF* */ 867*3fc36ee0SWojciech Macek #ifdef __cplusplus 868*3fc36ee0SWojciech Macek } 869*3fc36ee0SWojciech Macek #endif 870*3fc36ee0SWojciech Macek 871*3fc36ee0SWojciech Macek /* *INDENT-ON* */ 872*3fc36ee0SWojciech Macek #endif /* __AL_HAL_SERDES_INTERFACE_H__ */ 873*3fc36ee0SWojciech Macek 874*3fc36ee0SWojciech Macek /** @} end of SERDES group */ 875*3fc36ee0SWojciech Macek 876