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