xref: /freebsd-src/sys/contrib/alpine-hal/al_hal_serdes_interface.h (revision d002f039aeb370370cd2cba63ad55cc4cf16c932)
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