xref: /freebsd/sys/contrib/alpine-hal/al_hal_serdes_hssp.c (revision 8c4282b370bd66908b45b6a223226a9fc2b69d57)
1*eaa79794SWojciech Macek /*******************************************************************************
2*eaa79794SWojciech Macek Copyright (C) 2015 Annapurna Labs Ltd.
3*eaa79794SWojciech Macek 
4*eaa79794SWojciech Macek This file may be licensed under the terms of the Annapurna Labs Commercial
5*eaa79794SWojciech Macek License Agreement.
6*eaa79794SWojciech Macek 
7*eaa79794SWojciech Macek Alternatively, this file can be distributed under the terms of the GNU General
8*eaa79794SWojciech Macek Public License V2 as published by the Free Software Foundation and can be
9*eaa79794SWojciech Macek found at http://www.gnu.org/licenses/gpl-2.0.html
10*eaa79794SWojciech Macek 
11*eaa79794SWojciech Macek Alternatively, redistribution and use in source and binary forms, with or
12*eaa79794SWojciech Macek without modification, are permitted provided that the following conditions are
13*eaa79794SWojciech Macek met:
14*eaa79794SWojciech Macek 
15*eaa79794SWojciech Macek     *     Redistributions of source code must retain the above copyright notice,
16*eaa79794SWojciech Macek this list of conditions and the following disclaimer.
17*eaa79794SWojciech Macek 
18*eaa79794SWojciech Macek     *     Redistributions in binary form must reproduce the above copyright
19*eaa79794SWojciech Macek notice, this list of conditions and the following disclaimer in
20*eaa79794SWojciech Macek the documentation and/or other materials provided with the
21*eaa79794SWojciech Macek distribution.
22*eaa79794SWojciech Macek 
23*eaa79794SWojciech Macek THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
24*eaa79794SWojciech Macek ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25*eaa79794SWojciech Macek WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26*eaa79794SWojciech Macek DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
27*eaa79794SWojciech Macek ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28*eaa79794SWojciech Macek (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29*eaa79794SWojciech Macek LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
30*eaa79794SWojciech Macek ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31*eaa79794SWojciech Macek (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32*eaa79794SWojciech Macek SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33*eaa79794SWojciech Macek 
34*eaa79794SWojciech Macek *******************************************************************************/
35*eaa79794SWojciech Macek 
36*eaa79794SWojciech Macek #include "al_hal_serdes_hssp.h"
37*eaa79794SWojciech Macek #include "al_hal_serdes_hssp_regs.h"
38*eaa79794SWojciech Macek #include "al_hal_serdes_hssp_internal_regs.h"
39*eaa79794SWojciech Macek 
40*eaa79794SWojciech Macek #define SRDS_CORE_REG_ADDR(page, type, offset)\
41*eaa79794SWojciech Macek 	(((page) << 13) | ((type) << 12) | (offset))
42*eaa79794SWojciech Macek 
43*eaa79794SWojciech Macek /* Link Training configuration */
44*eaa79794SWojciech Macek #define AL_SERDES_TX_DEEMPH_SUM_MAX		0x1b
45*eaa79794SWojciech Macek 
46*eaa79794SWojciech Macek /* c configurations */
47*eaa79794SWojciech Macek #define AL_SERDES_TX_DEEMPH_C_ZERO_MAX_VAL	0x1b
48*eaa79794SWojciech Macek #define AL_SERDES_TX_DEEMPH_C_ZERO_MIN_VAL	0
49*eaa79794SWojciech Macek #define AL_SERDES_TX_DEEMPH_C_ZERO_PRESET	AL_SERDES_TX_DEEMPH_C_ZERO_MAX_VAL
50*eaa79794SWojciech Macek 
51*eaa79794SWojciech Macek /* c(+1) configurations */
52*eaa79794SWojciech Macek #define AL_SERDES_TX_DEEMPH_C_PLUS_MAX_VAL	0x9
53*eaa79794SWojciech Macek #define AL_SERDES_TX_DEEMPH_C_PLUS_MIN_VAL	0
54*eaa79794SWojciech Macek #define AL_SERDES_TX_DEEMPH_C_PLUS_PRESET	AL_SERDES_TX_DEEMPH_C_PLUS_MIN_VAL
55*eaa79794SWojciech Macek 
56*eaa79794SWojciech Macek /* c(-1) configurations */
57*eaa79794SWojciech Macek #define AL_SERDES_TX_DEEMPH_C_MINUS_MAX_VAL	0x6
58*eaa79794SWojciech Macek #define AL_SERDES_TX_DEEMPH_C_MINUS_MIN_VAL	0
59*eaa79794SWojciech Macek #define AL_SERDES_TX_DEEMPH_C_MINUS_PRESET	AL_SERDES_TX_DEEMPH_C_MINUS_MIN_VAL
60*eaa79794SWojciech Macek 
61*eaa79794SWojciech Macek /* Rx equal total delay = MDELAY * TRIES */
62*eaa79794SWojciech Macek #define AL_SERDES_RX_EQUAL_MDELAY		10
63*eaa79794SWojciech Macek #define AL_SERDES_RX_EQUAL_TRIES		50
64*eaa79794SWojciech Macek 
65*eaa79794SWojciech Macek /* Rx eye calculation delay = MDELAY * TRIES */
66*eaa79794SWojciech Macek #define AL_SERDES_RX_EYE_CAL_MDELAY		50
67*eaa79794SWojciech Macek #define AL_SERDES_RX_EYE_CAL_TRIES		70
68*eaa79794SWojciech Macek 
69*eaa79794SWojciech Macek #if (!defined(AL_SERDES_BASIC_SERVICES_ONLY)) || (AL_SERDES_BASIC_SERVICES_ONLY == 0)
70*eaa79794SWojciech Macek #define AL_SRDS_ADV_SRVC(func)			func
71*eaa79794SWojciech Macek #else
al_serdes_hssp_stub_func(void)72*eaa79794SWojciech Macek static void al_serdes_hssp_stub_func(void)
73*eaa79794SWojciech Macek {
74*eaa79794SWojciech Macek 	al_err("%s: not implemented service called!\n", __func__);
75*eaa79794SWojciech Macek }
76*eaa79794SWojciech Macek 
77*eaa79794SWojciech Macek #define AL_SRDS_ADV_SRVC(func)			((typeof(func) *)al_serdes_hssp_stub_func)
78*eaa79794SWojciech Macek #endif
79*eaa79794SWojciech Macek 
80*eaa79794SWojciech Macek /**
81*eaa79794SWojciech Macek  * SERDES core reg read
82*eaa79794SWojciech Macek  */
83*eaa79794SWojciech Macek static inline uint8_t al_serdes_grp_reg_read(
84*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
85*eaa79794SWojciech Macek 	enum al_serdes_reg_page		page,
86*eaa79794SWojciech Macek 	enum al_serdes_reg_type		type,
87*eaa79794SWojciech Macek 	uint16_t			offset);
88*eaa79794SWojciech Macek 
89*eaa79794SWojciech Macek /**
90*eaa79794SWojciech Macek  * SERDES core reg write
91*eaa79794SWojciech Macek  */
92*eaa79794SWojciech Macek static inline void al_serdes_grp_reg_write(
93*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
94*eaa79794SWojciech Macek 	enum al_serdes_reg_page		page,
95*eaa79794SWojciech Macek 	enum al_serdes_reg_type		type,
96*eaa79794SWojciech Macek 	uint16_t			offset,
97*eaa79794SWojciech Macek 	uint8_t				data);
98*eaa79794SWojciech Macek 
99*eaa79794SWojciech Macek /**
100*eaa79794SWojciech Macek  * SERDES core masked reg write
101*eaa79794SWojciech Macek  */
102*eaa79794SWojciech Macek static inline void al_serdes_grp_reg_masked_write(
103*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
104*eaa79794SWojciech Macek 	enum al_serdes_reg_page		page,
105*eaa79794SWojciech Macek 	enum al_serdes_reg_type		type,
106*eaa79794SWojciech Macek 	uint16_t			offset,
107*eaa79794SWojciech Macek 	uint8_t				mask,
108*eaa79794SWojciech Macek 	uint8_t				data);
109*eaa79794SWojciech Macek 
110*eaa79794SWojciech Macek /**
111*eaa79794SWojciech Macek  * Lane Rx rate change software flow disable
112*eaa79794SWojciech Macek  */
113*eaa79794SWojciech Macek static void _al_serdes_lane_rx_rate_change_sw_flow_dis(
114*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
115*eaa79794SWojciech Macek 	enum al_serdes_lane		lane);
116*eaa79794SWojciech Macek 
117*eaa79794SWojciech Macek /**
118*eaa79794SWojciech Macek  * Group Rx rate change software flow enable if all conditions met
119*eaa79794SWojciech Macek  */
120*eaa79794SWojciech Macek static void al_serdes_group_rx_rate_change_sw_flow_dis(
121*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj);
122*eaa79794SWojciech Macek 
123*eaa79794SWojciech Macek /**
124*eaa79794SWojciech Macek  * Lane Rx rate change software flow enable if all conditions met
125*eaa79794SWojciech Macek  */
126*eaa79794SWojciech Macek static void _al_serdes_lane_rx_rate_change_sw_flow_en_cond(
127*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
128*eaa79794SWojciech Macek 	enum al_serdes_lane		lane);
129*eaa79794SWojciech Macek 
130*eaa79794SWojciech Macek /**
131*eaa79794SWojciech Macek  * Group Rx rate change software flow enable if all conditions met
132*eaa79794SWojciech Macek  */
133*eaa79794SWojciech Macek static void al_serdes_group_rx_rate_change_sw_flow_en_cond(
134*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj);
135*eaa79794SWojciech Macek 
136*eaa79794SWojciech Macek /******************************************************************************/
137*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_hssp_type_get(void)138*eaa79794SWojciech Macek static enum al_serdes_type al_serdes_hssp_type_get(void)
139*eaa79794SWojciech Macek {
140*eaa79794SWojciech Macek 	return AL_SRDS_TYPE_HSSP;
141*eaa79794SWojciech Macek }
142*eaa79794SWojciech Macek 
143*eaa79794SWojciech Macek /******************************************************************************/
144*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_reg_read(struct al_serdes_grp_obj * obj,enum al_serdes_reg_page page,enum al_serdes_reg_type type,uint16_t offset,uint8_t * data)145*eaa79794SWojciech Macek static int al_serdes_reg_read(
146*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
147*eaa79794SWojciech Macek 	enum al_serdes_reg_page		page,
148*eaa79794SWojciech Macek 	enum al_serdes_reg_type		type,
149*eaa79794SWojciech Macek 	uint16_t			offset,
150*eaa79794SWojciech Macek 	uint8_t				*data)
151*eaa79794SWojciech Macek {
152*eaa79794SWojciech Macek 	int status = 0;
153*eaa79794SWojciech Macek 
154*eaa79794SWojciech Macek 	al_dbg(
155*eaa79794SWojciech Macek 		"%s(%p, %d, %d, %u)\n",
156*eaa79794SWojciech Macek 		__func__,
157*eaa79794SWojciech Macek 		obj,
158*eaa79794SWojciech Macek 		page,
159*eaa79794SWojciech Macek 		type,
160*eaa79794SWojciech Macek 		offset);
161*eaa79794SWojciech Macek 
162*eaa79794SWojciech Macek 	al_assert(obj);
163*eaa79794SWojciech Macek 	al_assert(data);
164*eaa79794SWojciech Macek 	al_assert(((int)page) >= AL_SRDS_REG_PAGE_0_LANE_0);
165*eaa79794SWojciech Macek 	al_assert(((int)page) <= AL_SRDS_REG_PAGE_4_COMMON);
166*eaa79794SWojciech Macek 	al_assert(((int)type) >= AL_SRDS_REG_TYPE_PMA);
167*eaa79794SWojciech Macek 	al_assert(((int)type) <= AL_SRDS_REG_TYPE_PCS);
168*eaa79794SWojciech Macek 
169*eaa79794SWojciech Macek 	*data = al_serdes_grp_reg_read(
170*eaa79794SWojciech Macek 		obj,
171*eaa79794SWojciech Macek 		page,
172*eaa79794SWojciech Macek 		type,
173*eaa79794SWojciech Macek 		offset);
174*eaa79794SWojciech Macek 
175*eaa79794SWojciech Macek 	al_dbg(
176*eaa79794SWojciech Macek 		"%s: return(%u)\n",
177*eaa79794SWojciech Macek 		__func__,
178*eaa79794SWojciech Macek 		*data);
179*eaa79794SWojciech Macek 
180*eaa79794SWojciech Macek 	return status;
181*eaa79794SWojciech Macek }
182*eaa79794SWojciech Macek 
183*eaa79794SWojciech Macek /******************************************************************************/
184*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_reg_write(struct al_serdes_grp_obj * obj,enum al_serdes_reg_page page,enum al_serdes_reg_type type,uint16_t offset,uint8_t data)185*eaa79794SWojciech Macek static int al_serdes_reg_write(
186*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
187*eaa79794SWojciech Macek 	enum al_serdes_reg_page		page,
188*eaa79794SWojciech Macek 	enum al_serdes_reg_type		type,
189*eaa79794SWojciech Macek 	uint16_t			offset,
190*eaa79794SWojciech Macek 	uint8_t				data)
191*eaa79794SWojciech Macek {
192*eaa79794SWojciech Macek 	int status = 0;
193*eaa79794SWojciech Macek 
194*eaa79794SWojciech Macek 	al_dbg(
195*eaa79794SWojciech Macek 		"%s(%p, %d, %d, %u, %u)\n",
196*eaa79794SWojciech Macek 		__func__,
197*eaa79794SWojciech Macek 		obj,
198*eaa79794SWojciech Macek 		page,
199*eaa79794SWojciech Macek 		type,
200*eaa79794SWojciech Macek 		offset,
201*eaa79794SWojciech Macek 		data);
202*eaa79794SWojciech Macek 
203*eaa79794SWojciech Macek 	al_assert(obj);
204*eaa79794SWojciech Macek 	al_assert(((int)page) >= AL_SRDS_REG_PAGE_0_LANE_0);
205*eaa79794SWojciech Macek 	al_assert(((int)page) <= AL_SRDS_REG_PAGE_0123_LANES_0123);
206*eaa79794SWojciech Macek 	al_assert(((int)type) >= AL_SRDS_REG_TYPE_PMA);
207*eaa79794SWojciech Macek 	al_assert(((int)type) <= AL_SRDS_REG_TYPE_PCS);
208*eaa79794SWojciech Macek 
209*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(
210*eaa79794SWojciech Macek 		obj,
211*eaa79794SWojciech Macek 		page,
212*eaa79794SWojciech Macek 		type,
213*eaa79794SWojciech Macek 		offset,
214*eaa79794SWojciech Macek 		data);
215*eaa79794SWojciech Macek 
216*eaa79794SWojciech Macek 	return status;
217*eaa79794SWojciech Macek }
218*eaa79794SWojciech Macek 
219*eaa79794SWojciech Macek /******************************************************************************/
220*eaa79794SWojciech Macek /******************************************************************************/
221*eaa79794SWojciech Macek #if (SERDES_IREG_FLD_PCSRX_DATAWIDTH_REG_NUM != SERDES_IREG_FLD_PCSTX_DATAWIDTH_REG_NUM)
222*eaa79794SWojciech Macek #error "Wrong assumption!"
223*eaa79794SWojciech Macek #endif
224*eaa79794SWojciech Macek #if (SERDES_IREG_FLD_PCSRX_DIVRATE_REG_NUM != SERDES_IREG_FLD_PCSTX_DIVRATE_REG_NUM)
225*eaa79794SWojciech Macek #error "Wrong assumption!"
226*eaa79794SWojciech Macek #endif
227*eaa79794SWojciech Macek #if (SERDES_IREG_FLD_CMNPCIEGEN3_LOCWREN_REG_NUM != SERDES_IREG_FLD_CMNPCS_LOCWREN_REG_NUM)
228*eaa79794SWojciech Macek #error "Wrong assumption!"
229*eaa79794SWojciech Macek #endif
230*eaa79794SWojciech Macek #if (SERDES_IREG_FLD_CMNPCIEGEN3_LOCWREN_REG_NUM != SERDES_IREG_FLD_CMNPCSBIST_LOCWREN_REG_NUM)
231*eaa79794SWojciech Macek #error "Wrong assumption!"
232*eaa79794SWojciech Macek #endif
233*eaa79794SWojciech Macek #if (SERDES_IREG_FLD_CMNPCIEGEN3_LOCWREN_REG_NUM != SERDES_IREG_FLD_CMNPCSPSTATE_LOCWREN_REG_NUM)
234*eaa79794SWojciech Macek #error "Wrong assumption!"
235*eaa79794SWojciech Macek #endif
236*eaa79794SWojciech Macek #if (SERDES_IREG_FLD_LANEPCSPSTATE_LOCWREN_REG_NUM != SERDES_IREG_FLD_LB_LOCWREN_REG_NUM)
237*eaa79794SWojciech Macek #error "Wrong assumption!"
238*eaa79794SWojciech Macek #endif
239*eaa79794SWojciech Macek #if (SERDES_IREG_FLD_LANEPCSPSTATE_LOCWREN_REG_NUM != SERDES_IREG_FLD_PCSRX_LOCWREN_REG_NUM)
240*eaa79794SWojciech Macek #error "Wrong assumption!"
241*eaa79794SWojciech Macek #endif
242*eaa79794SWojciech Macek #if (SERDES_IREG_FLD_LANEPCSPSTATE_LOCWREN_REG_NUM != SERDES_IREG_FLD_PCSRXBIST_LOCWREN_REG_NUM)
243*eaa79794SWojciech Macek #error "Wrong assumption!"
244*eaa79794SWojciech Macek #endif
245*eaa79794SWojciech Macek #if (SERDES_IREG_FLD_LANEPCSPSTATE_LOCWREN_REG_NUM != SERDES_IREG_FLD_PCSRXEQ_LOCWREN_REG_NUM)
246*eaa79794SWojciech Macek #error "Wrong assumption!"
247*eaa79794SWojciech Macek #endif
248*eaa79794SWojciech Macek #if (SERDES_IREG_FLD_LANEPCSPSTATE_LOCWREN_REG_NUM != SERDES_IREG_FLD_PCSTX_LOCWREN_REG_NUM)
249*eaa79794SWojciech Macek #error "Wrong assumption!"
250*eaa79794SWojciech Macek #endif
al_serdes_bist_overrides_enable(struct al_serdes_grp_obj * obj,enum al_serdes_rate rate)251*eaa79794SWojciech Macek static void al_serdes_bist_overrides_enable(
252*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
253*eaa79794SWojciech Macek 	enum al_serdes_rate		rate)
254*eaa79794SWojciech Macek {
255*eaa79794SWojciech Macek 	int i;
256*eaa79794SWojciech Macek 
257*eaa79794SWojciech Macek 	uint8_t rx_rate_val;
258*eaa79794SWojciech Macek 	uint8_t tx_rate_val;
259*eaa79794SWojciech Macek 
260*eaa79794SWojciech Macek 	switch (rate) {
261*eaa79794SWojciech Macek 	case AL_SRDS_RATE_1_8:
262*eaa79794SWojciech Macek 		rx_rate_val = SERDES_IREG_FLD_PCSRX_DIVRATE_VAL_1_8;
263*eaa79794SWojciech Macek 		tx_rate_val = SERDES_IREG_FLD_PCSTX_DIVRATE_VAL_1_8;
264*eaa79794SWojciech Macek 		break;
265*eaa79794SWojciech Macek 	case AL_SRDS_RATE_1_4:
266*eaa79794SWojciech Macek 		rx_rate_val = SERDES_IREG_FLD_PCSRX_DIVRATE_VAL_1_4;
267*eaa79794SWojciech Macek 		tx_rate_val = SERDES_IREG_FLD_PCSTX_DIVRATE_VAL_1_4;
268*eaa79794SWojciech Macek 		break;
269*eaa79794SWojciech Macek 	case AL_SRDS_RATE_1_2:
270*eaa79794SWojciech Macek 		rx_rate_val = SERDES_IREG_FLD_PCSRX_DIVRATE_VAL_1_2;
271*eaa79794SWojciech Macek 		tx_rate_val = SERDES_IREG_FLD_PCSTX_DIVRATE_VAL_1_2;
272*eaa79794SWojciech Macek 		break;
273*eaa79794SWojciech Macek 	case AL_SRDS_RATE_FULL:
274*eaa79794SWojciech Macek 		rx_rate_val = SERDES_IREG_FLD_PCSRX_DIVRATE_VAL_1_1;
275*eaa79794SWojciech Macek 		tx_rate_val = SERDES_IREG_FLD_PCSTX_DIVRATE_VAL_1_1;
276*eaa79794SWojciech Macek 		break;
277*eaa79794SWojciech Macek 	default:
278*eaa79794SWojciech Macek 		al_err("%s: invalid rate (%d)\n",  __func__, rate);
279*eaa79794SWojciech Macek 		al_assert(0);
280*eaa79794SWojciech Macek 		rx_rate_val = SERDES_IREG_FLD_PCSRX_DIVRATE_VAL_1_1;
281*eaa79794SWojciech Macek 		tx_rate_val = SERDES_IREG_FLD_PCSTX_DIVRATE_VAL_1_1;
282*eaa79794SWojciech Macek 	}
283*eaa79794SWojciech Macek 
284*eaa79794SWojciech Macek 	for (i = 0; i < AL_SRDS_NUM_LANES; i++) {
285*eaa79794SWojciech Macek 		al_serdes_grp_reg_masked_write(
286*eaa79794SWojciech Macek 			obj,
287*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)i,
288*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
289*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSRX_DATAWIDTH_REG_NUM,
290*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSRX_DATAWIDTH_MASK |
291*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSTX_DATAWIDTH_MASK,
292*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSRX_DATAWIDTH_VAL_20 |
293*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSTX_DATAWIDTH_VAL_20);
294*eaa79794SWojciech Macek 
295*eaa79794SWojciech Macek 		al_serdes_grp_reg_masked_write(
296*eaa79794SWojciech Macek 			obj,
297*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)i,
298*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
299*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSRX_DIVRATE_REG_NUM,
300*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSRX_DIVRATE_MASK |
301*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSTX_DIVRATE_MASK,
302*eaa79794SWojciech Macek 			rx_rate_val | tx_rate_val);
303*eaa79794SWojciech Macek 	}
304*eaa79794SWojciech Macek 
305*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
306*eaa79794SWojciech Macek 		obj,
307*eaa79794SWojciech Macek 		AL_SRDS_REG_PAGE_4_COMMON,
308*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
309*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCIEGEN3_LOCWREN_REG_NUM,
310*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCIEGEN3_LOCWREN |
311*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCS_LOCWREN |
312*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCSBIST_LOCWREN |
313*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCSPSTATE_LOCWREN,
314*eaa79794SWojciech Macek 		0);
315*eaa79794SWojciech Macek 
316*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
317*eaa79794SWojciech Macek 		obj,
318*eaa79794SWojciech Macek 		AL_SRDS_REG_PAGE_4_COMMON,
319*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
320*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCIEGEN3_LOCWREN_REG_NUM,
321*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCIEGEN3_LOCWREN |
322*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCS_LOCWREN |
323*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCSBIST_LOCWREN |
324*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCSPSTATE_LOCWREN,
325*eaa79794SWojciech Macek 		0);
326*eaa79794SWojciech Macek 
327*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
328*eaa79794SWojciech Macek 		obj,
329*eaa79794SWojciech Macek 		AL_SRDS_REG_PAGE_4_COMMON,
330*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
331*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCS_LOCWREN_REG_NUM,
332*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCS_LOCWREN,
333*eaa79794SWojciech Macek 		0);
334*eaa79794SWojciech Macek 
335*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
336*eaa79794SWojciech Macek 		obj,
337*eaa79794SWojciech Macek 		AL_SRDS_REG_PAGE_4_COMMON,
338*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
339*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCS_TXENABLE_REG_NUM,
340*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCS_TXENABLE,
341*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCS_TXENABLE);
342*eaa79794SWojciech Macek 
343*eaa79794SWojciech Macek 	for (i = 0; i < AL_SRDS_NUM_LANES; i++) {
344*eaa79794SWojciech Macek 		al_serdes_grp_reg_masked_write(
345*eaa79794SWojciech Macek 			obj,
346*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)i,
347*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
348*eaa79794SWojciech Macek 			SERDES_IREG_FLD_LANEPCSPSTATE_LOCWREN_REG_NUM,
349*eaa79794SWojciech Macek 			SERDES_IREG_FLD_LANEPCSPSTATE_LOCWREN |
350*eaa79794SWojciech Macek 			SERDES_IREG_FLD_LB_LOCWREN |
351*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSRX_LOCWREN |
352*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSRXBIST_LOCWREN |
353*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSRXEQ_LOCWREN |
354*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSTX_LOCWREN,
355*eaa79794SWojciech Macek 			0);
356*eaa79794SWojciech Macek 
357*eaa79794SWojciech Macek 		al_serdes_grp_reg_masked_write(
358*eaa79794SWojciech Macek 			obj,
359*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)i,
360*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
361*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSTXBIST_LOCWREN_REG_NUM,
362*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSTXBIST_LOCWREN,
363*eaa79794SWojciech Macek 			0);
364*eaa79794SWojciech Macek 
365*eaa79794SWojciech Macek 		al_serdes_grp_reg_masked_write(
366*eaa79794SWojciech Macek 			obj,
367*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)i,
368*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
369*eaa79794SWojciech Macek 			SERDES_IREG_FLD_TX_DRV_OVERRIDE_EN_REG_NUM,
370*eaa79794SWojciech Macek 			SERDES_IREG_FLD_TX_DRV_OVERRIDE_EN,
371*eaa79794SWojciech Macek 			0);
372*eaa79794SWojciech Macek 
373*eaa79794SWojciech Macek 		al_serdes_grp_reg_masked_write(
374*eaa79794SWojciech Macek 			obj,
375*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)i,
376*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
377*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXLOCK2REF_OVREN_REG_NUM,
378*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXLOCK2REF_OVREN,
379*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXLOCK2REF_OVREN);
380*eaa79794SWojciech Macek 	}
381*eaa79794SWojciech Macek }
382*eaa79794SWojciech Macek 
383*eaa79794SWojciech Macek /******************************************************************************/
384*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_bist_overrides_disable(struct al_serdes_grp_obj * obj)385*eaa79794SWojciech Macek static void al_serdes_bist_overrides_disable(
386*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj)
387*eaa79794SWojciech Macek {
388*eaa79794SWojciech Macek 	int i;
389*eaa79794SWojciech Macek 
390*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
391*eaa79794SWojciech Macek 		obj,
392*eaa79794SWojciech Macek 		AL_SRDS_REG_PAGE_4_COMMON,
393*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
394*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCIEGEN3_LOCWREN_REG_NUM,
395*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCSBIST_LOCWREN,
396*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCSBIST_LOCWREN);
397*eaa79794SWojciech Macek 
398*eaa79794SWojciech Macek 	for (i = 0; i < AL_SRDS_NUM_LANES; i++) {
399*eaa79794SWojciech Macek 		al_serdes_grp_reg_masked_write(
400*eaa79794SWojciech Macek 			obj,
401*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)i,
402*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
403*eaa79794SWojciech Macek 			SERDES_IREG_FLD_LANEPCSPSTATE_LOCWREN_REG_NUM,
404*eaa79794SWojciech Macek 			SERDES_IREG_FLD_LB_LOCWREN |
405*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSRXBIST_LOCWREN,
406*eaa79794SWojciech Macek 			SERDES_IREG_FLD_LB_LOCWREN |
407*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSRXBIST_LOCWREN);
408*eaa79794SWojciech Macek 
409*eaa79794SWojciech Macek 		al_serdes_grp_reg_masked_write(
410*eaa79794SWojciech Macek 			obj,
411*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)i,
412*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
413*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSTXBIST_LOCWREN_REG_NUM,
414*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSTXBIST_LOCWREN,
415*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSTXBIST_LOCWREN);
416*eaa79794SWojciech Macek 	}
417*eaa79794SWojciech Macek }
418*eaa79794SWojciech Macek 
419*eaa79794SWojciech Macek /******************************************************************************/
420*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_rx_rate_change(struct al_serdes_grp_obj * obj,enum al_serdes_rate rate)421*eaa79794SWojciech Macek static void al_serdes_rx_rate_change(
422*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
423*eaa79794SWojciech Macek 	enum al_serdes_rate		rate)
424*eaa79794SWojciech Macek {
425*eaa79794SWojciech Macek 	int i;
426*eaa79794SWojciech Macek 
427*eaa79794SWojciech Macek 	uint8_t rx_rate_val;
428*eaa79794SWojciech Macek 
429*eaa79794SWojciech Macek 	switch (rate) {
430*eaa79794SWojciech Macek 	case AL_SRDS_RATE_1_8:
431*eaa79794SWojciech Macek 		rx_rate_val = SERDES_IREG_FLD_PCSRX_DIVRATE_VAL_1_8;
432*eaa79794SWojciech Macek 		break;
433*eaa79794SWojciech Macek 	case AL_SRDS_RATE_1_4:
434*eaa79794SWojciech Macek 		rx_rate_val = SERDES_IREG_FLD_PCSRX_DIVRATE_VAL_1_4;
435*eaa79794SWojciech Macek 		break;
436*eaa79794SWojciech Macek 	case AL_SRDS_RATE_1_2:
437*eaa79794SWojciech Macek 		rx_rate_val = SERDES_IREG_FLD_PCSRX_DIVRATE_VAL_1_2;
438*eaa79794SWojciech Macek 		break;
439*eaa79794SWojciech Macek 	case AL_SRDS_RATE_FULL:
440*eaa79794SWojciech Macek 		rx_rate_val = SERDES_IREG_FLD_PCSRX_DIVRATE_VAL_1_1;
441*eaa79794SWojciech Macek 		break;
442*eaa79794SWojciech Macek 	default:
443*eaa79794SWojciech Macek 		al_err("%s: invalid rate (%d)\n",  __func__, rate);
444*eaa79794SWojciech Macek 		rx_rate_val = SERDES_IREG_FLD_PCSRX_DIVRATE_VAL_1_1;
445*eaa79794SWojciech Macek 		break;
446*eaa79794SWojciech Macek 	}
447*eaa79794SWojciech Macek 
448*eaa79794SWojciech Macek 	for (i = 0; i < AL_SRDS_NUM_LANES; i++) {
449*eaa79794SWojciech Macek 		al_serdes_grp_reg_masked_write(
450*eaa79794SWojciech Macek 				   obj,
451*eaa79794SWojciech Macek 				   (enum al_serdes_reg_page)i,
452*eaa79794SWojciech Macek 				   AL_SRDS_REG_TYPE_PMA,
453*eaa79794SWojciech Macek 				   SERDES_IREG_FLD_PCSRX_DIVRATE_REG_NUM,
454*eaa79794SWojciech Macek 				   SERDES_IREG_FLD_PCSRX_DIVRATE_MASK,
455*eaa79794SWojciech Macek 				   rx_rate_val);
456*eaa79794SWojciech Macek 	}
457*eaa79794SWojciech Macek }
458*eaa79794SWojciech Macek 
459*eaa79794SWojciech Macek /******************************************************************************/
460*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_group_pm_set(struct al_serdes_grp_obj * obj,enum al_serdes_pm pm)461*eaa79794SWojciech Macek static void al_serdes_group_pm_set(
462*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
463*eaa79794SWojciech Macek 	enum al_serdes_pm		pm)
464*eaa79794SWojciech Macek {
465*eaa79794SWojciech Macek 	uint8_t pm_val;
466*eaa79794SWojciech Macek 
467*eaa79794SWojciech Macek 	switch (pm) {
468*eaa79794SWojciech Macek 	case AL_SRDS_PM_PD:
469*eaa79794SWojciech Macek 		pm_val = SERDES_IREG_FLD_CMNPCSPSTATE_SYNTH_VAL_PD;
470*eaa79794SWojciech Macek 		break;
471*eaa79794SWojciech Macek 	case AL_SRDS_PM_P2:
472*eaa79794SWojciech Macek 		pm_val = SERDES_IREG_FLD_CMNPCSPSTATE_SYNTH_VAL_P2;
473*eaa79794SWojciech Macek 		break;
474*eaa79794SWojciech Macek 	case AL_SRDS_PM_P1:
475*eaa79794SWojciech Macek 		pm_val = SERDES_IREG_FLD_CMNPCSPSTATE_SYNTH_VAL_P1;
476*eaa79794SWojciech Macek 		break;
477*eaa79794SWojciech Macek 	case AL_SRDS_PM_P0S:
478*eaa79794SWojciech Macek 		pm_val = SERDES_IREG_FLD_CMNPCSPSTATE_SYNTH_VAL_P0S;
479*eaa79794SWojciech Macek 		break;
480*eaa79794SWojciech Macek 	case AL_SRDS_PM_P0:
481*eaa79794SWojciech Macek 		pm_val = SERDES_IREG_FLD_CMNPCSPSTATE_SYNTH_VAL_P0;
482*eaa79794SWojciech Macek 		break;
483*eaa79794SWojciech Macek 	default:
484*eaa79794SWojciech Macek 		al_err("%s: invalid power mode (%d)\n",  __func__, pm);
485*eaa79794SWojciech Macek 		al_assert(0);
486*eaa79794SWojciech Macek 		pm_val = SERDES_IREG_FLD_CMNPCSPSTATE_SYNTH_VAL_P0;
487*eaa79794SWojciech Macek 	}
488*eaa79794SWojciech Macek 
489*eaa79794SWojciech Macek 	if (pm == AL_SRDS_PM_PD)
490*eaa79794SWojciech Macek 		al_serdes_group_rx_rate_change_sw_flow_dis(obj);
491*eaa79794SWojciech Macek 
492*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
493*eaa79794SWojciech Macek 		obj,
494*eaa79794SWojciech Macek 		AL_SRDS_REG_PAGE_4_COMMON,
495*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
496*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCSPSTATE_SYNTH_REG_NUM,
497*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCSPSTATE_SYNTH_MASK,
498*eaa79794SWojciech Macek 		pm_val);
499*eaa79794SWojciech Macek 
500*eaa79794SWojciech Macek 	if (pm != AL_SRDS_PM_PD)
501*eaa79794SWojciech Macek 		al_serdes_group_rx_rate_change_sw_flow_en_cond(obj);
502*eaa79794SWojciech Macek }
503*eaa79794SWojciech Macek 
504*eaa79794SWojciech Macek /******************************************************************************/
505*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_lane_rx_rate_change_sw_flow_en(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane)506*eaa79794SWojciech Macek static void al_serdes_lane_rx_rate_change_sw_flow_en(
507*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
508*eaa79794SWojciech Macek 	enum al_serdes_lane	lane)
509*eaa79794SWojciech Macek {
510*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, (enum al_serdes_reg_page)lane, AL_SRDS_REG_TYPE_PMA, 201, 0xfc);
511*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, (enum al_serdes_reg_page)lane, AL_SRDS_REG_TYPE_PMA, 202, 0xff);
512*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, (enum al_serdes_reg_page)lane, AL_SRDS_REG_TYPE_PMA, 203, 0xff);
513*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, (enum al_serdes_reg_page)lane, AL_SRDS_REG_TYPE_PMA, 204, 0xff);
514*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, (enum al_serdes_reg_page)lane, AL_SRDS_REG_TYPE_PMA, 205, 0x7f);
515*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, (enum al_serdes_reg_page)lane, AL_SRDS_REG_TYPE_PMA, 205, 0xff);
516*eaa79794SWojciech Macek }
517*eaa79794SWojciech Macek 
518*eaa79794SWojciech Macek /******************************************************************************/
519*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_lane_rx_rate_change_sw_flow_dis(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane)520*eaa79794SWojciech Macek static void al_serdes_lane_rx_rate_change_sw_flow_dis(
521*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
522*eaa79794SWojciech Macek 	enum al_serdes_lane		lane)
523*eaa79794SWojciech Macek {
524*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, (enum al_serdes_reg_page)lane, AL_SRDS_REG_TYPE_PMA, 205, 0x7f);
525*eaa79794SWojciech Macek }
526*eaa79794SWojciech Macek 
527*eaa79794SWojciech Macek /******************************************************************************/
528*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_lane_pcie_rate_override_enable_set(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane,al_bool en)529*eaa79794SWojciech Macek static void al_serdes_lane_pcie_rate_override_enable_set(
530*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
531*eaa79794SWojciech Macek 	enum al_serdes_lane		lane,
532*eaa79794SWojciech Macek 	al_bool				en)
533*eaa79794SWojciech Macek {
534*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
535*eaa79794SWojciech Macek 		obj,
536*eaa79794SWojciech Macek 		(enum al_serdes_reg_page)lane,
537*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PCS,
538*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCS_VPCSIF_OVR_RATE_ENA_REG_NUM,
539*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCS_VPCSIF_OVR_RATE_ENA,
540*eaa79794SWojciech Macek 		en ? SERDES_IREG_FLD_PCS_VPCSIF_OVR_RATE_ENA : 0);
541*eaa79794SWojciech Macek }
542*eaa79794SWojciech Macek 
543*eaa79794SWojciech Macek /******************************************************************************/
544*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_lane_pcie_rate_override_is_enabled(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane)545*eaa79794SWojciech Macek static al_bool al_serdes_lane_pcie_rate_override_is_enabled(
546*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
547*eaa79794SWojciech Macek 	enum al_serdes_lane		lane)
548*eaa79794SWojciech Macek {
549*eaa79794SWojciech Macek 	return (al_serdes_grp_reg_read(
550*eaa79794SWojciech Macek 		obj,
551*eaa79794SWojciech Macek 		(enum al_serdes_reg_page)lane,
552*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PCS,
553*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCS_VPCSIF_OVR_RATE_ENA_REG_NUM) &
554*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCS_VPCSIF_OVR_RATE_ENA) ? AL_TRUE : AL_FALSE;
555*eaa79794SWojciech Macek }
556*eaa79794SWojciech Macek 
557*eaa79794SWojciech Macek /******************************************************************************/
558*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_lane_pcie_rate_get(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane)559*eaa79794SWojciech Macek static enum al_serdes_pcie_rate al_serdes_lane_pcie_rate_get(
560*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
561*eaa79794SWojciech Macek 	enum al_serdes_lane		lane)
562*eaa79794SWojciech Macek {
563*eaa79794SWojciech Macek 	return (al_serdes_grp_reg_read(
564*eaa79794SWojciech Macek 		obj,
565*eaa79794SWojciech Macek 		(enum al_serdes_reg_page)lane,
566*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PCS,
567*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCS_VPCSIF_OVR_RATE_REG_NUM) &
568*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCS_VPCSIF_OVR_RATE_MASK) >>
569*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCS_VPCSIF_OVR_RATE_SHIFT;
570*eaa79794SWojciech Macek }
571*eaa79794SWojciech Macek 
572*eaa79794SWojciech Macek /******************************************************************************/
573*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_lane_pcie_rate_set(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane,enum al_serdes_pcie_rate rate)574*eaa79794SWojciech Macek static void al_serdes_lane_pcie_rate_set(
575*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
576*eaa79794SWojciech Macek 	enum al_serdes_lane		lane,
577*eaa79794SWojciech Macek 	enum al_serdes_pcie_rate	rate)
578*eaa79794SWojciech Macek {
579*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
580*eaa79794SWojciech Macek 		obj,
581*eaa79794SWojciech Macek 		(enum al_serdes_reg_page)lane,
582*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PCS,
583*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCS_VPCSIF_OVR_RATE_REG_NUM,
584*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCS_VPCSIF_OVR_RATE_MASK,
585*eaa79794SWojciech Macek 		rate << SERDES_IREG_FLD_PCS_VPCSIF_OVR_RATE_SHIFT);
586*eaa79794SWojciech Macek }
587*eaa79794SWojciech Macek 
588*eaa79794SWojciech Macek /******************************************************************************/
589*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_lane_pm_set(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane,enum al_serdes_pm rx_pm,enum al_serdes_pm tx_pm)590*eaa79794SWojciech Macek static void al_serdes_lane_pm_set(
591*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
592*eaa79794SWojciech Macek 	enum al_serdes_lane		lane,
593*eaa79794SWojciech Macek 	enum al_serdes_pm		rx_pm,
594*eaa79794SWojciech Macek 	enum al_serdes_pm		tx_pm)
595*eaa79794SWojciech Macek {
596*eaa79794SWojciech Macek 	uint8_t rx_pm_val;
597*eaa79794SWojciech Macek 	uint8_t tx_pm_val;
598*eaa79794SWojciech Macek 
599*eaa79794SWojciech Macek 	switch (rx_pm) {
600*eaa79794SWojciech Macek 	case AL_SRDS_PM_PD:
601*eaa79794SWojciech Macek 		rx_pm_val = SERDES_IREG_FLD_LANEPCSPSTATE_RX_VAL_PD;
602*eaa79794SWojciech Macek 		break;
603*eaa79794SWojciech Macek 	case AL_SRDS_PM_P2:
604*eaa79794SWojciech Macek 		rx_pm_val = SERDES_IREG_FLD_LANEPCSPSTATE_RX_VAL_P2;
605*eaa79794SWojciech Macek 		break;
606*eaa79794SWojciech Macek 	case AL_SRDS_PM_P1:
607*eaa79794SWojciech Macek 		rx_pm_val = SERDES_IREG_FLD_LANEPCSPSTATE_RX_VAL_P1;
608*eaa79794SWojciech Macek 		break;
609*eaa79794SWojciech Macek 	case AL_SRDS_PM_P0S:
610*eaa79794SWojciech Macek 		rx_pm_val = SERDES_IREG_FLD_LANEPCSPSTATE_RX_VAL_P0S;
611*eaa79794SWojciech Macek 		break;
612*eaa79794SWojciech Macek 	case AL_SRDS_PM_P0:
613*eaa79794SWojciech Macek 		rx_pm_val = SERDES_IREG_FLD_LANEPCSPSTATE_RX_VAL_P0;
614*eaa79794SWojciech Macek 		break;
615*eaa79794SWojciech Macek 	default:
616*eaa79794SWojciech Macek 		al_err("%s: invalid rx power mode (%d)\n",  __func__, rx_pm);
617*eaa79794SWojciech Macek 		al_assert(0);
618*eaa79794SWojciech Macek 		rx_pm_val = SERDES_IREG_FLD_LANEPCSPSTATE_RX_VAL_P0;
619*eaa79794SWojciech Macek 	}
620*eaa79794SWojciech Macek 
621*eaa79794SWojciech Macek 	switch (tx_pm) {
622*eaa79794SWojciech Macek 	case AL_SRDS_PM_PD:
623*eaa79794SWojciech Macek 		tx_pm_val = SERDES_IREG_FLD_LANEPCSPSTATE_TX_VAL_PD;
624*eaa79794SWojciech Macek 		break;
625*eaa79794SWojciech Macek 	case AL_SRDS_PM_P2:
626*eaa79794SWojciech Macek 		tx_pm_val = SERDES_IREG_FLD_LANEPCSPSTATE_TX_VAL_P2;
627*eaa79794SWojciech Macek 		break;
628*eaa79794SWojciech Macek 	case AL_SRDS_PM_P1:
629*eaa79794SWojciech Macek 		tx_pm_val = SERDES_IREG_FLD_LANEPCSPSTATE_TX_VAL_P1;
630*eaa79794SWojciech Macek 		break;
631*eaa79794SWojciech Macek 	case AL_SRDS_PM_P0S:
632*eaa79794SWojciech Macek 		tx_pm_val = SERDES_IREG_FLD_LANEPCSPSTATE_TX_VAL_P0S;
633*eaa79794SWojciech Macek 		break;
634*eaa79794SWojciech Macek 	case AL_SRDS_PM_P0:
635*eaa79794SWojciech Macek 		tx_pm_val = SERDES_IREG_FLD_LANEPCSPSTATE_TX_VAL_P0;
636*eaa79794SWojciech Macek 		break;
637*eaa79794SWojciech Macek 	default:
638*eaa79794SWojciech Macek 		al_err("%s: invalid tx power mode (%d)\n",  __func__, tx_pm);
639*eaa79794SWojciech Macek 		al_assert(0);
640*eaa79794SWojciech Macek 		tx_pm_val = SERDES_IREG_FLD_LANEPCSPSTATE_TX_VAL_P0;
641*eaa79794SWojciech Macek 	}
642*eaa79794SWojciech Macek 
643*eaa79794SWojciech Macek 	if (rx_pm == AL_SRDS_PM_PD)
644*eaa79794SWojciech Macek 		_al_serdes_lane_rx_rate_change_sw_flow_dis(obj, lane);
645*eaa79794SWojciech Macek 
646*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
647*eaa79794SWojciech Macek 		obj,
648*eaa79794SWojciech Macek 		(enum al_serdes_reg_page)lane,
649*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
650*eaa79794SWojciech Macek 		SERDES_IREG_FLD_LANEPCSPSTATE_RX_REG_NUM,
651*eaa79794SWojciech Macek 		SERDES_IREG_FLD_LANEPCSPSTATE_RX_MASK,
652*eaa79794SWojciech Macek 		rx_pm_val);
653*eaa79794SWojciech Macek 
654*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
655*eaa79794SWojciech Macek 		obj,
656*eaa79794SWojciech Macek 		(enum al_serdes_reg_page)lane,
657*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
658*eaa79794SWojciech Macek 		SERDES_IREG_FLD_LANEPCSPSTATE_TX_REG_NUM,
659*eaa79794SWojciech Macek 		SERDES_IREG_FLD_LANEPCSPSTATE_TX_MASK,
660*eaa79794SWojciech Macek 		tx_pm_val);
661*eaa79794SWojciech Macek 
662*eaa79794SWojciech Macek 	if (rx_pm != AL_SRDS_PM_PD)
663*eaa79794SWojciech Macek 		_al_serdes_lane_rx_rate_change_sw_flow_en_cond(obj, lane);
664*eaa79794SWojciech Macek }
665*eaa79794SWojciech Macek 
666*eaa79794SWojciech Macek /******************************************************************************/
667*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_pma_hard_reset_group(struct al_serdes_grp_obj * obj,al_bool enable)668*eaa79794SWojciech Macek static void al_serdes_pma_hard_reset_group(
669*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
670*eaa79794SWojciech Macek 	al_bool				enable)
671*eaa79794SWojciech Macek {
672*eaa79794SWojciech Macek 	if (enable)
673*eaa79794SWojciech Macek 		al_serdes_group_rx_rate_change_sw_flow_dis(obj);
674*eaa79794SWojciech Macek 
675*eaa79794SWojciech Macek 	/* Enable Hard Reset Override */
676*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
677*eaa79794SWojciech Macek 		obj,
678*eaa79794SWojciech Macek 		AL_SRDS_REG_PAGE_4_COMMON,
679*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
680*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASSEN_SYNTH_REG_NUM,
681*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASSEN_SYNTH_MASK,
682*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASSEN_SYNTH_VAL_REGS);
683*eaa79794SWojciech Macek 
684*eaa79794SWojciech Macek 	/* Assert/Deassert Hard Reset Override */
685*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
686*eaa79794SWojciech Macek 		obj,
687*eaa79794SWojciech Macek 		AL_SRDS_REG_PAGE_4_COMMON,
688*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
689*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASS_SYNTH_REG_NUM,
690*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASS_SYNTH_MASK,
691*eaa79794SWojciech Macek 		enable ?
692*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASS_SYNTH_VAL_ASSERT :
693*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASS_SYNTH_VAL_DEASSERT);
694*eaa79794SWojciech Macek 
695*eaa79794SWojciech Macek 	if (!enable)
696*eaa79794SWojciech Macek 		al_serdes_group_rx_rate_change_sw_flow_en_cond(obj);
697*eaa79794SWojciech Macek }
698*eaa79794SWojciech Macek 
699*eaa79794SWojciech Macek /******************************************************************************/
700*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_pma_hard_reset_lane(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane,al_bool enable)701*eaa79794SWojciech Macek static void al_serdes_pma_hard_reset_lane(
702*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
703*eaa79794SWojciech Macek 	enum al_serdes_lane		lane,
704*eaa79794SWojciech Macek 	al_bool				enable)
705*eaa79794SWojciech Macek {
706*eaa79794SWojciech Macek 	if (enable)
707*eaa79794SWojciech Macek 		_al_serdes_lane_rx_rate_change_sw_flow_dis(obj, lane);
708*eaa79794SWojciech Macek 
709*eaa79794SWojciech Macek 	/* Enable Hard Reset Override */
710*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
711*eaa79794SWojciech Macek 		obj,
712*eaa79794SWojciech Macek 		(enum al_serdes_reg_page)lane,
713*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
714*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASSEN_REG_NUM,
715*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASSEN_MASK,
716*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASSEN_VAL_REGS);
717*eaa79794SWojciech Macek 
718*eaa79794SWojciech Macek 	/* Assert/Deassert Hard Reset Override */
719*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
720*eaa79794SWojciech Macek 		obj,
721*eaa79794SWojciech Macek 		(enum al_serdes_reg_page)lane,
722*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
723*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASS_REG_NUM,
724*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASS_MASK,
725*eaa79794SWojciech Macek 		enable ?
726*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASS_VAL_ASSERT :
727*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASS_VAL_DEASSERT);
728*eaa79794SWojciech Macek 
729*eaa79794SWojciech Macek 	if (!enable)
730*eaa79794SWojciech Macek 		_al_serdes_lane_rx_rate_change_sw_flow_en_cond(obj, lane);
731*eaa79794SWojciech Macek }
732*eaa79794SWojciech Macek 
733*eaa79794SWojciech Macek /******************************************************************************/
734*eaa79794SWojciech Macek /******************************************************************************/
735*eaa79794SWojciech Macek #if	(SERDES_IREG_FLD_LB_RX2TXUNTIMEDEN_REG_NUM !=\
736*eaa79794SWojciech Macek 	SERDES_IREG_FLD_LB_TX2RXBUFTIMEDEN_REG_NUM) ||\
737*eaa79794SWojciech Macek 	(SERDES_IREG_FLD_LB_TX2RXBUFTIMEDEN_REG_NUM !=\
738*eaa79794SWojciech Macek 	SERDES_IREG_FLD_LB_TX2RXIOTIMEDEN_REG_NUM) ||\
739*eaa79794SWojciech Macek 	(SERDES_IREG_FLD_LB_TX2RXIOTIMEDEN_REG_NUM !=\
740*eaa79794SWojciech Macek 	 SERDES_IREG_FLD_LB_PARRX2TXTIMEDEN_REG_NUM) ||\
741*eaa79794SWojciech Macek 	(SERDES_IREG_FLD_LB_PARRX2TXTIMEDEN_REG_NUM !=\
742*eaa79794SWojciech Macek 	 SERDES_IREG_FLD_LB_CDRCLK2TXEN_REG_NUM)
743*eaa79794SWojciech Macek #error Wrong assumption
744*eaa79794SWojciech Macek #endif
745*eaa79794SWojciech Macek 
al_serdes_loopback_control(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane,enum al_serdes_lb_mode mode)746*eaa79794SWojciech Macek static void al_serdes_loopback_control(
747*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
748*eaa79794SWojciech Macek 	enum al_serdes_lane		lane,
749*eaa79794SWojciech Macek 	enum al_serdes_lb_mode		mode)
750*eaa79794SWojciech Macek {
751*eaa79794SWojciech Macek 	uint8_t val = 0;
752*eaa79794SWojciech Macek 
753*eaa79794SWojciech Macek 	switch (mode) {
754*eaa79794SWojciech Macek 	case AL_SRDS_LB_MODE_OFF:
755*eaa79794SWojciech Macek 		break;
756*eaa79794SWojciech Macek 	case AL_SRDS_LB_MODE_PMA_IO_UN_TIMED_RX_TO_TX:
757*eaa79794SWojciech Macek 		val = SERDES_IREG_FLD_LB_RX2TXUNTIMEDEN;
758*eaa79794SWojciech Macek 		break;
759*eaa79794SWojciech Macek 	case AL_SRDS_LB_MODE_PMA_INTERNALLY_BUFFERED_SERIAL_TX_TO_RX:
760*eaa79794SWojciech Macek 		val = SERDES_IREG_FLD_LB_TX2RXBUFTIMEDEN;
761*eaa79794SWojciech Macek 		break;
762*eaa79794SWojciech Macek 	case AL_SRDS_LB_MODE_PMA_SERIAL_TX_IO_TO_RX_IO:
763*eaa79794SWojciech Macek 		val = SERDES_IREG_FLD_LB_TX2RXIOTIMEDEN;
764*eaa79794SWojciech Macek 		break;
765*eaa79794SWojciech Macek 	case AL_SRDS_LB_MODE_PMA_PARALLEL_RX_TO_TX:
766*eaa79794SWojciech Macek 		val = SERDES_IREG_FLD_LB_PARRX2TXTIMEDEN |
767*eaa79794SWojciech Macek 			SERDES_IREG_FLD_LB_CDRCLK2TXEN;
768*eaa79794SWojciech Macek 		break;
769*eaa79794SWojciech Macek 	default:
770*eaa79794SWojciech Macek 		al_err("%s: invalid mode (%d)\n",  __func__, mode);
771*eaa79794SWojciech Macek 		al_assert(0);
772*eaa79794SWojciech Macek 	}
773*eaa79794SWojciech Macek 
774*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
775*eaa79794SWojciech Macek 		obj,
776*eaa79794SWojciech Macek 		(enum al_serdes_reg_page)lane,
777*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
778*eaa79794SWojciech Macek 		SERDES_IREG_FLD_LB_RX2TXUNTIMEDEN_REG_NUM,
779*eaa79794SWojciech Macek 		SERDES_IREG_FLD_LB_RX2TXUNTIMEDEN |
780*eaa79794SWojciech Macek 		SERDES_IREG_FLD_LB_TX2RXBUFTIMEDEN |
781*eaa79794SWojciech Macek 		SERDES_IREG_FLD_LB_TX2RXIOTIMEDEN |
782*eaa79794SWojciech Macek 		SERDES_IREG_FLD_LB_PARRX2TXTIMEDEN |
783*eaa79794SWojciech Macek 		SERDES_IREG_FLD_LB_CDRCLK2TXEN,
784*eaa79794SWojciech Macek 		val);
785*eaa79794SWojciech Macek }
786*eaa79794SWojciech Macek 
787*eaa79794SWojciech Macek /******************************************************************************/
788*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_bist_pattern_select(struct al_serdes_grp_obj * obj,enum al_serdes_bist_pattern pattern,uint8_t * user_data)789*eaa79794SWojciech Macek static void al_serdes_bist_pattern_select(
790*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
791*eaa79794SWojciech Macek 	enum al_serdes_bist_pattern	pattern,
792*eaa79794SWojciech Macek 	uint8_t				*user_data)
793*eaa79794SWojciech Macek {
794*eaa79794SWojciech Macek 	uint8_t val = 0;
795*eaa79794SWojciech Macek 
796*eaa79794SWojciech Macek 	switch (pattern) {
797*eaa79794SWojciech Macek 	case AL_SRDS_BIST_PATTERN_USER:
798*eaa79794SWojciech Macek 		al_assert(user_data);
799*eaa79794SWojciech Macek 		val = SERDES_IREG_FLD_CMNPCSBIST_MODESEL_VAL_USER;
800*eaa79794SWojciech Macek 		break;
801*eaa79794SWojciech Macek 	case AL_SRDS_BIST_PATTERN_PRBS7:
802*eaa79794SWojciech Macek 		val = SERDES_IREG_FLD_CMNPCSBIST_MODESEL_VAL_PRBS7;
803*eaa79794SWojciech Macek 		break;
804*eaa79794SWojciech Macek 	case AL_SRDS_BIST_PATTERN_PRBS23:
805*eaa79794SWojciech Macek 		val = SERDES_IREG_FLD_CMNPCSBIST_MODESEL_VAL_PRBS23;
806*eaa79794SWojciech Macek 		break;
807*eaa79794SWojciech Macek 	case AL_SRDS_BIST_PATTERN_PRBS31:
808*eaa79794SWojciech Macek 		val = SERDES_IREG_FLD_CMNPCSBIST_MODESEL_VAL_PRBS31;
809*eaa79794SWojciech Macek 		break;
810*eaa79794SWojciech Macek 	case AL_SRDS_BIST_PATTERN_CLK1010:
811*eaa79794SWojciech Macek 		val = SERDES_IREG_FLD_CMNPCSBIST_MODESEL_VAL_CLK1010;
812*eaa79794SWojciech Macek 		break;
813*eaa79794SWojciech Macek 	default:
814*eaa79794SWojciech Macek 		al_err("%s: invalid pattern (%d)\n", __func__, pattern);
815*eaa79794SWojciech Macek 		al_assert(0);
816*eaa79794SWojciech Macek 	}
817*eaa79794SWojciech Macek 
818*eaa79794SWojciech Macek 	if (pattern == AL_SRDS_BIST_PATTERN_USER) {
819*eaa79794SWojciech Macek 		int i;
820*eaa79794SWojciech Macek 
821*eaa79794SWojciech Macek 		for (i = 0; i < SERDES_IREG_FLD_TX_BIST_PAT_NUM_BYTES; i++)
822*eaa79794SWojciech Macek 			al_serdes_grp_reg_write(
823*eaa79794SWojciech Macek 				obj,
824*eaa79794SWojciech Macek 				AL_SRDS_REG_PAGE_4_COMMON,
825*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
826*eaa79794SWojciech Macek 				SERDES_IREG_FLD_TX_BIST_PAT_REG_NUM(i),
827*eaa79794SWojciech Macek 				user_data[i]);
828*eaa79794SWojciech Macek 	}
829*eaa79794SWojciech Macek 
830*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
831*eaa79794SWojciech Macek 		obj,
832*eaa79794SWojciech Macek 		AL_SRDS_REG_PAGE_4_COMMON,
833*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
834*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCSBIST_MODESEL_REG_NUM,
835*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCSBIST_MODESEL_MASK,
836*eaa79794SWojciech Macek 		val);
837*eaa79794SWojciech Macek }
838*eaa79794SWojciech Macek 
839*eaa79794SWojciech Macek /******************************************************************************/
840*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_bist_tx_enable(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane,al_bool enable)841*eaa79794SWojciech Macek static void al_serdes_bist_tx_enable(
842*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
843*eaa79794SWojciech Macek 	enum al_serdes_lane		lane,
844*eaa79794SWojciech Macek 	al_bool				enable)
845*eaa79794SWojciech Macek {
846*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
847*eaa79794SWojciech Macek 		obj,
848*eaa79794SWojciech Macek 		(enum al_serdes_reg_page)lane,
849*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
850*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCSTXBIST_EN_REG_NUM,
851*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCSTXBIST_EN,
852*eaa79794SWojciech Macek 		enable ? SERDES_IREG_FLD_PCSTXBIST_EN : 0);
853*eaa79794SWojciech Macek }
854*eaa79794SWojciech Macek 
855*eaa79794SWojciech Macek /******************************************************************************/
856*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_bist_tx_err_inject(struct al_serdes_grp_obj * obj)857*eaa79794SWojciech Macek static void al_serdes_bist_tx_err_inject(
858*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj)
859*eaa79794SWojciech Macek {
860*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
861*eaa79794SWojciech Macek 		obj,
862*eaa79794SWojciech Macek 		AL_SRDS_REG_PAGE_4_COMMON,
863*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
864*eaa79794SWojciech Macek 		SERDES_IREG_FLD_TXBIST_BITERROR_EN_REG_NUM,
865*eaa79794SWojciech Macek 		SERDES_IREG_FLD_TXBIST_BITERROR_EN,
866*eaa79794SWojciech Macek 		SERDES_IREG_FLD_TXBIST_BITERROR_EN);
867*eaa79794SWojciech Macek 
868*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
869*eaa79794SWojciech Macek 		obj,
870*eaa79794SWojciech Macek 		AL_SRDS_REG_PAGE_4_COMMON,
871*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
872*eaa79794SWojciech Macek 		SERDES_IREG_FLD_TXBIST_BITERROR_EN_REG_NUM,
873*eaa79794SWojciech Macek 		SERDES_IREG_FLD_TXBIST_BITERROR_EN,
874*eaa79794SWojciech Macek 		0);
875*eaa79794SWojciech Macek }
876*eaa79794SWojciech Macek 
877*eaa79794SWojciech Macek /******************************************************************************/
878*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_bist_rx_enable(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane,al_bool enable)879*eaa79794SWojciech Macek static void al_serdes_bist_rx_enable(
880*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
881*eaa79794SWojciech Macek 	enum al_serdes_lane		lane,
882*eaa79794SWojciech Macek 	al_bool				enable)
883*eaa79794SWojciech Macek {
884*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
885*eaa79794SWojciech Macek 		obj,
886*eaa79794SWojciech Macek 		(enum al_serdes_reg_page)lane,
887*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
888*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCSRXBIST_EN_REG_NUM,
889*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCSRXBIST_EN,
890*eaa79794SWojciech Macek 		enable ? SERDES_IREG_FLD_PCSRXBIST_EN : 0);
891*eaa79794SWojciech Macek }
892*eaa79794SWojciech Macek 
893*eaa79794SWojciech Macek /******************************************************************************/
894*eaa79794SWojciech Macek /******************************************************************************/
895*eaa79794SWojciech Macek #if	(SERDES_IREG_FLD_RXBIST_ERRCOUNT_OVERFLOW_REG_NUM !=\
896*eaa79794SWojciech Macek 	SERDES_IREG_FLD_RXBIST_RXLOCKED_REG_NUM)
897*eaa79794SWojciech Macek #error Wrong assumption
898*eaa79794SWojciech Macek #endif
899*eaa79794SWojciech Macek 
al_serdes_bist_rx_status(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane,al_bool * is_locked,al_bool * err_cnt_overflow,uint32_t * err_cnt)900*eaa79794SWojciech Macek static void al_serdes_bist_rx_status(
901*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
902*eaa79794SWojciech Macek 	enum al_serdes_lane		lane,
903*eaa79794SWojciech Macek 	al_bool				*is_locked,
904*eaa79794SWojciech Macek 	al_bool				*err_cnt_overflow,
905*eaa79794SWojciech Macek 	uint32_t			*err_cnt)
906*eaa79794SWojciech Macek {
907*eaa79794SWojciech Macek 	uint8_t status_reg_val;
908*eaa79794SWojciech Macek 	uint16_t err_cnt_msb_reg_val;
909*eaa79794SWojciech Macek 	uint16_t err_cnt_lsb_reg_val;
910*eaa79794SWojciech Macek 
911*eaa79794SWojciech Macek 	status_reg_val = al_serdes_grp_reg_read(
912*eaa79794SWojciech Macek 		obj,
913*eaa79794SWojciech Macek 		(enum al_serdes_reg_page)lane,
914*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
915*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXBIST_RXLOCKED_REG_NUM);
916*eaa79794SWojciech Macek 
917*eaa79794SWojciech Macek 	err_cnt_msb_reg_val = al_serdes_grp_reg_read(
918*eaa79794SWojciech Macek 		obj,
919*eaa79794SWojciech Macek 		(enum al_serdes_reg_page)lane,
920*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
921*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXBIST_ERRCOUNT_MSB_REG_NUM);
922*eaa79794SWojciech Macek 
923*eaa79794SWojciech Macek 	err_cnt_lsb_reg_val = al_serdes_grp_reg_read(
924*eaa79794SWojciech Macek 		obj,
925*eaa79794SWojciech Macek 		(enum al_serdes_reg_page)lane,
926*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
927*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXBIST_ERRCOUNT_LSB_REG_NUM);
928*eaa79794SWojciech Macek 
929*eaa79794SWojciech Macek 	*is_locked =
930*eaa79794SWojciech Macek 		(status_reg_val & SERDES_IREG_FLD_RXBIST_RXLOCKED) ?
931*eaa79794SWojciech Macek 		AL_TRUE : AL_FALSE;
932*eaa79794SWojciech Macek 
933*eaa79794SWojciech Macek 	*err_cnt_overflow =
934*eaa79794SWojciech Macek 		(status_reg_val & SERDES_IREG_FLD_RXBIST_ERRCOUNT_OVERFLOW) ?
935*eaa79794SWojciech Macek 		AL_TRUE : AL_FALSE;
936*eaa79794SWojciech Macek 
937*eaa79794SWojciech Macek 	*err_cnt = (err_cnt_msb_reg_val << 8) + err_cnt_lsb_reg_val;
938*eaa79794SWojciech Macek }
939*eaa79794SWojciech Macek 
940*eaa79794SWojciech Macek /******************************************************************************/
941*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_grp_reg_read(struct al_serdes_grp_obj * obj,enum al_serdes_reg_page page,enum al_serdes_reg_type type,uint16_t offset)942*eaa79794SWojciech Macek static inline uint8_t al_serdes_grp_reg_read(
943*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
944*eaa79794SWojciech Macek 	enum al_serdes_reg_page		page,
945*eaa79794SWojciech Macek 	enum al_serdes_reg_type		type,
946*eaa79794SWojciech Macek 	uint16_t			offset)
947*eaa79794SWojciech Macek {
948*eaa79794SWojciech Macek 	struct al_serdes_regs __iomem	*regs_base = obj->regs_base;
949*eaa79794SWojciech Macek 
950*eaa79794SWojciech Macek 	al_reg_write32(
951*eaa79794SWojciech Macek 		&regs_base->gen.reg_addr,
952*eaa79794SWojciech Macek 		SRDS_CORE_REG_ADDR(page, type, offset));
953*eaa79794SWojciech Macek 
954*eaa79794SWojciech Macek 	return al_reg_read32(&regs_base->gen.reg_data);
955*eaa79794SWojciech Macek }
956*eaa79794SWojciech Macek 
957*eaa79794SWojciech Macek /******************************************************************************/
958*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_grp_reg_write(struct al_serdes_grp_obj * obj,enum al_serdes_reg_page page,enum al_serdes_reg_type type,uint16_t offset,uint8_t data)959*eaa79794SWojciech Macek static inline void al_serdes_grp_reg_write(
960*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
961*eaa79794SWojciech Macek 	enum al_serdes_reg_page		page,
962*eaa79794SWojciech Macek 	enum al_serdes_reg_type		type,
963*eaa79794SWojciech Macek 	uint16_t			offset,
964*eaa79794SWojciech Macek 	uint8_t				data)
965*eaa79794SWojciech Macek {
966*eaa79794SWojciech Macek 	struct al_serdes_regs __iomem	*regs_base = obj->regs_base;
967*eaa79794SWojciech Macek 
968*eaa79794SWojciech Macek 	al_reg_write32(
969*eaa79794SWojciech Macek 		&regs_base->gen.reg_addr,
970*eaa79794SWojciech Macek 		SRDS_CORE_REG_ADDR(page, type, offset));
971*eaa79794SWojciech Macek 
972*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->gen.reg_data, data);
973*eaa79794SWojciech Macek }
974*eaa79794SWojciech Macek 
975*eaa79794SWojciech Macek /******************************************************************************/
976*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_ns_delay(int cnt)977*eaa79794SWojciech Macek static inline void al_serdes_ns_delay(int cnt)
978*eaa79794SWojciech Macek {
979*eaa79794SWojciech Macek 	al_udelay((cnt + 999) / 1000);
980*eaa79794SWojciech Macek }
981*eaa79794SWojciech Macek 
982*eaa79794SWojciech Macek /******************************************************************************/
983*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_grp_reg_masked_write(struct al_serdes_grp_obj * obj,enum al_serdes_reg_page page,enum al_serdes_reg_type type,uint16_t offset,uint8_t mask,uint8_t data)984*eaa79794SWojciech Macek static inline void al_serdes_grp_reg_masked_write(
985*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
986*eaa79794SWojciech Macek 	enum al_serdes_reg_page		page,
987*eaa79794SWojciech Macek 	enum al_serdes_reg_type		type,
988*eaa79794SWojciech Macek 	uint16_t			offset,
989*eaa79794SWojciech Macek 	uint8_t				mask,
990*eaa79794SWojciech Macek 	uint8_t				data)
991*eaa79794SWojciech Macek {
992*eaa79794SWojciech Macek 	uint8_t val;
993*eaa79794SWojciech Macek 	enum al_serdes_reg_page	start_page = page;
994*eaa79794SWojciech Macek 	enum al_serdes_reg_page	end_page   = page;
995*eaa79794SWojciech Macek 	enum al_serdes_reg_page	iter_page;
996*eaa79794SWojciech Macek 
997*eaa79794SWojciech Macek 	if (page == AL_SRDS_REG_PAGE_0123_LANES_0123) {
998*eaa79794SWojciech Macek 		start_page = AL_SRDS_REG_PAGE_0_LANE_0;
999*eaa79794SWojciech Macek 		end_page   = AL_SRDS_REG_PAGE_3_LANE_3;
1000*eaa79794SWojciech Macek 	}
1001*eaa79794SWojciech Macek 
1002*eaa79794SWojciech Macek 	for (iter_page = start_page; iter_page <= end_page; ++iter_page) {
1003*eaa79794SWojciech Macek 		val = al_serdes_grp_reg_read(obj, iter_page, type, offset);
1004*eaa79794SWojciech Macek 		val &= ~mask;
1005*eaa79794SWojciech Macek 		val |= data;
1006*eaa79794SWojciech Macek 		al_serdes_grp_reg_write(obj, iter_page, type, offset, val);
1007*eaa79794SWojciech Macek 	}
1008*eaa79794SWojciech Macek }
1009*eaa79794SWojciech Macek 
1010*eaa79794SWojciech Macek /******************************************************************************/
1011*eaa79794SWojciech Macek /******************************************************************************/
_al_serdes_lane_rx_rate_change_sw_flow_dis(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane)1012*eaa79794SWojciech Macek static void _al_serdes_lane_rx_rate_change_sw_flow_dis(
1013*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
1014*eaa79794SWojciech Macek 	enum al_serdes_lane		lane)
1015*eaa79794SWojciech Macek {
1016*eaa79794SWojciech Macek 	al_bool lane_sw_flow_enabled;
1017*eaa79794SWojciech Macek 
1018*eaa79794SWojciech Macek 	al_assert(lane != AL_SRDS_LANES_0123);
1019*eaa79794SWojciech Macek 
1020*eaa79794SWojciech Macek 	lane_sw_flow_enabled =
1021*eaa79794SWojciech Macek 		(al_serdes_grp_reg_read(obj, (enum al_serdes_reg_page)lane,
1022*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA, 201) == 0xfc) &&
1023*eaa79794SWojciech Macek 		(al_serdes_grp_reg_read(obj, (enum al_serdes_reg_page)lane,
1024*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA, 202) == 0xff) &&
1025*eaa79794SWojciech Macek 		(al_serdes_grp_reg_read(obj, (enum al_serdes_reg_page)lane,
1026*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA, 203) == 0xff) &&
1027*eaa79794SWojciech Macek 		(al_serdes_grp_reg_read(obj, (enum al_serdes_reg_page)lane,
1028*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA, 204) == 0xff) &&
1029*eaa79794SWojciech Macek 		(al_serdes_grp_reg_read(obj, (enum al_serdes_reg_page)lane,
1030*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA, 205) == 0xff);
1031*eaa79794SWojciech Macek 
1032*eaa79794SWojciech Macek 	/**
1033*eaa79794SWojciech Macek 	 * Disable the Rx rate change software flow by clearing bit 7 of lane PMA register 205
1034*eaa79794SWojciech Macek 	 * (RSTPDOVR_RX_OVREN)
1035*eaa79794SWojciech Macek 	 */
1036*eaa79794SWojciech Macek 	if (lane_sw_flow_enabled) {
1037*eaa79794SWojciech Macek 		al_dbg("%s(%d): actually disabling\n", __func__, lane);
1038*eaa79794SWojciech Macek 		al_serdes_grp_reg_masked_write(obj, (enum al_serdes_reg_page)lane,
1039*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA, 205, 0x80, 0x00);
1040*eaa79794SWojciech Macek 	}
1041*eaa79794SWojciech Macek }
1042*eaa79794SWojciech Macek 
1043*eaa79794SWojciech Macek /******************************************************************************/
1044*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_group_rx_rate_change_sw_flow_dis(struct al_serdes_grp_obj * obj)1045*eaa79794SWojciech Macek static void al_serdes_group_rx_rate_change_sw_flow_dis(
1046*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj)
1047*eaa79794SWojciech Macek {
1048*eaa79794SWojciech Macek 	int lane;
1049*eaa79794SWojciech Macek 
1050*eaa79794SWojciech Macek 	for (lane = AL_SRDS_LANE_0; lane < AL_SRDS_NUM_LANES; lane++)
1051*eaa79794SWojciech Macek 		_al_serdes_lane_rx_rate_change_sw_flow_dis(obj, lane);
1052*eaa79794SWojciech Macek }
1053*eaa79794SWojciech Macek 
1054*eaa79794SWojciech Macek /******************************************************************************/
1055*eaa79794SWojciech Macek /******************************************************************************/
_al_serdes_lane_rx_rate_change_sw_flow_en_cond(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane)1056*eaa79794SWojciech Macek static void _al_serdes_lane_rx_rate_change_sw_flow_en_cond(
1057*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
1058*eaa79794SWojciech Macek 	enum al_serdes_lane		lane)
1059*eaa79794SWojciech Macek {
1060*eaa79794SWojciech Macek 	al_bool lane_sw_flow_almost_enabled;
1061*eaa79794SWojciech Macek 	al_bool group_reset_enabled;
1062*eaa79794SWojciech Macek 	al_bool lane_reset_enabled;
1063*eaa79794SWojciech Macek 	al_bool group_pd_enabled;
1064*eaa79794SWojciech Macek 	al_bool lane_pd_enabled;
1065*eaa79794SWojciech Macek 
1066*eaa79794SWojciech Macek 	al_assert(lane != AL_SRDS_LANES_0123);
1067*eaa79794SWojciech Macek 
1068*eaa79794SWojciech Macek 	lane_sw_flow_almost_enabled =
1069*eaa79794SWojciech Macek 		(al_serdes_grp_reg_read(obj, (enum al_serdes_reg_page)lane,
1070*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA, 201) == 0xfc) &&
1071*eaa79794SWojciech Macek 		(al_serdes_grp_reg_read(obj, (enum al_serdes_reg_page)lane,
1072*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA, 202) == 0xff) &&
1073*eaa79794SWojciech Macek 		(al_serdes_grp_reg_read(obj, (enum al_serdes_reg_page)lane,
1074*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA, 203) == 0xff) &&
1075*eaa79794SWojciech Macek 		(al_serdes_grp_reg_read(obj, (enum al_serdes_reg_page)lane,
1076*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA, 204) == 0xff) &&
1077*eaa79794SWojciech Macek 		(al_serdes_grp_reg_read(obj, (enum al_serdes_reg_page)lane,
1078*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA, 205) == 0x7f);
1079*eaa79794SWojciech Macek 
1080*eaa79794SWojciech Macek 	group_reset_enabled =
1081*eaa79794SWojciech Macek 		((al_serdes_grp_reg_read(
1082*eaa79794SWojciech Macek 			obj, AL_SRDS_REG_PAGE_4_COMMON, AL_SRDS_REG_TYPE_PMA,
1083*eaa79794SWojciech Macek 			SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASSEN_SYNTH_REG_NUM) &
1084*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASSEN_SYNTH_MASK) ==
1085*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASSEN_SYNTH_VAL_REGS) &&
1086*eaa79794SWojciech Macek 		((al_serdes_grp_reg_read(
1087*eaa79794SWojciech Macek 			obj, AL_SRDS_REG_PAGE_4_COMMON, AL_SRDS_REG_TYPE_PMA,
1088*eaa79794SWojciech Macek 			SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASS_SYNTH_REG_NUM) &
1089*eaa79794SWojciech Macek 			SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASS_SYNTH_MASK) ==
1090*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASS_SYNTH_VAL_ASSERT);
1091*eaa79794SWojciech Macek 
1092*eaa79794SWojciech Macek 	lane_reset_enabled =
1093*eaa79794SWojciech Macek 		((al_serdes_grp_reg_read(
1094*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane, AL_SRDS_REG_TYPE_PMA,
1095*eaa79794SWojciech Macek 			SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASSEN_REG_NUM) &
1096*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASSEN_MASK) ==
1097*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASSEN_VAL_REGS) &&
1098*eaa79794SWojciech Macek 		((al_serdes_grp_reg_read(
1099*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane, AL_SRDS_REG_TYPE_PMA,
1100*eaa79794SWojciech Macek 			SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASS_REG_NUM) &
1101*eaa79794SWojciech Macek 			SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASS_MASK) ==
1102*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNCTLPOR_HARDRSTBYPASS_VAL_ASSERT);
1103*eaa79794SWojciech Macek 
1104*eaa79794SWojciech Macek 	group_pd_enabled =
1105*eaa79794SWojciech Macek 		(al_serdes_grp_reg_read(
1106*eaa79794SWojciech Macek 			obj, AL_SRDS_REG_PAGE_4_COMMON, AL_SRDS_REG_TYPE_PMA,
1107*eaa79794SWojciech Macek 			SERDES_IREG_FLD_CMNPCSPSTATE_SYNTH_REG_NUM) &
1108*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCSPSTATE_SYNTH_MASK) ==
1109*eaa79794SWojciech Macek 		SERDES_IREG_FLD_CMNPCSPSTATE_SYNTH_VAL_PD;
1110*eaa79794SWojciech Macek 
1111*eaa79794SWojciech Macek 	lane_pd_enabled =
1112*eaa79794SWojciech Macek 		(al_serdes_grp_reg_read(
1113*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane, AL_SRDS_REG_TYPE_PMA,
1114*eaa79794SWojciech Macek 			SERDES_IREG_FLD_LANEPCSPSTATE_RX_REG_NUM) &
1115*eaa79794SWojciech Macek 		SERDES_IREG_FLD_LANEPCSPSTATE_RX_MASK) ==
1116*eaa79794SWojciech Macek 		SERDES_IREG_FLD_LANEPCSPSTATE_RX_VAL_PD;
1117*eaa79794SWojciech Macek 
1118*eaa79794SWojciech Macek 	/**
1119*eaa79794SWojciech Macek 	 * Enable the Rx rate change software flow by setting bit 7 of lane PMA register 205
1120*eaa79794SWojciech Macek 	 * (RSTPDOVR_RX_OVREN)
1121*eaa79794SWojciech Macek 	 */
1122*eaa79794SWojciech Macek 	if (lane_sw_flow_almost_enabled && !group_reset_enabled && !lane_reset_enabled &&
1123*eaa79794SWojciech Macek 		!group_pd_enabled && !lane_pd_enabled) {
1124*eaa79794SWojciech Macek 		al_dbg("%s(%d): actually enabling\n", __func__, lane);
1125*eaa79794SWojciech Macek 
1126*eaa79794SWojciech Macek 		al_serdes_ns_delay(500);
1127*eaa79794SWojciech Macek 		al_serdes_grp_reg_masked_write(obj, (enum al_serdes_reg_page)lane,
1128*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA, 205, 0x80, 0x80);
1129*eaa79794SWojciech Macek 	}
1130*eaa79794SWojciech Macek }
1131*eaa79794SWojciech Macek 
1132*eaa79794SWojciech Macek /******************************************************************************/
1133*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_group_rx_rate_change_sw_flow_en_cond(struct al_serdes_grp_obj * obj)1134*eaa79794SWojciech Macek static void al_serdes_group_rx_rate_change_sw_flow_en_cond(
1135*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj)
1136*eaa79794SWojciech Macek {
1137*eaa79794SWojciech Macek 	int lane;
1138*eaa79794SWojciech Macek 
1139*eaa79794SWojciech Macek 	for (lane = AL_SRDS_LANE_0; lane < AL_SRDS_NUM_LANES; lane++)
1140*eaa79794SWojciech Macek 		_al_serdes_lane_rx_rate_change_sw_flow_en_cond(obj, lane);
1141*eaa79794SWojciech Macek }
1142*eaa79794SWojciech Macek 
1143*eaa79794SWojciech Macek /******************************************************************************/
1144*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_eye_measure_run(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane,uint32_t timeout,unsigned int * value)1145*eaa79794SWojciech Macek static int al_serdes_eye_measure_run(
1146*eaa79794SWojciech Macek 		struct al_serdes_grp_obj	*obj,
1147*eaa79794SWojciech Macek 		enum al_serdes_lane		lane,
1148*eaa79794SWojciech Macek 		uint32_t			timeout,
1149*eaa79794SWojciech Macek 		unsigned int			*value)
1150*eaa79794SWojciech Macek {
1151*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*grp_obj = obj;
1152*eaa79794SWojciech Macek 	struct al_serdes_regs __iomem	*regs_base = grp_obj->regs_base;
1153*eaa79794SWojciech Macek 	uint32_t reg = 0;
1154*eaa79794SWojciech Macek 	uint32_t i;
1155*eaa79794SWojciech Macek 	struct serdes_lane *lane_regs;
1156*eaa79794SWojciech Macek 
1157*eaa79794SWojciech Macek 	lane_regs = &regs_base->lane[lane];
1158*eaa79794SWojciech Macek 
1159*eaa79794SWojciech Macek 	al_reg_write32(&lane_regs->ictl_multi_rxeq,
1160*eaa79794SWojciech Macek 		       SERDES_LANE_ICTL_MULTI_RXEQ_START_L_A);
1161*eaa79794SWojciech Macek 
1162*eaa79794SWojciech Macek 	for (i = 0; i < timeout; i++) {
1163*eaa79794SWojciech Macek 		reg = al_reg_read32(&lane_regs->octl_multi);
1164*eaa79794SWojciech Macek 
1165*eaa79794SWojciech Macek 		if (reg & SERDES_LANE_OCTL_MULTI_RXEQ_DONE_L_A)
1166*eaa79794SWojciech Macek 			break;
1167*eaa79794SWojciech Macek 
1168*eaa79794SWojciech Macek 		al_msleep(10);
1169*eaa79794SWojciech Macek 	}
1170*eaa79794SWojciech Macek 
1171*eaa79794SWojciech Macek 	if (i == timeout) {
1172*eaa79794SWojciech Macek 		al_err("%s: measure eye failed on timeout\n", __func__);
1173*eaa79794SWojciech Macek 		return -ETIMEDOUT;
1174*eaa79794SWojciech Macek 	}
1175*eaa79794SWojciech Macek 
1176*eaa79794SWojciech Macek 	*value = al_reg_read32(&lane_regs->odat_multi_rxeq);
1177*eaa79794SWojciech Macek 
1178*eaa79794SWojciech Macek 	al_reg_write32(&lane_regs->ictl_multi_rxeq, 0);
1179*eaa79794SWojciech Macek 
1180*eaa79794SWojciech Macek 	return 0;
1181*eaa79794SWojciech Macek }
1182*eaa79794SWojciech Macek 
1183*eaa79794SWojciech Macek /******************************************************************************/
1184*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_eye_diag_sample(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane,unsigned int x,int y,unsigned int timeout,unsigned int * value)1185*eaa79794SWojciech Macek static int al_serdes_eye_diag_sample(
1186*eaa79794SWojciech Macek 		struct al_serdes_grp_obj	*obj,
1187*eaa79794SWojciech Macek 		enum al_serdes_lane		lane,
1188*eaa79794SWojciech Macek 		unsigned int			x,
1189*eaa79794SWojciech Macek 		int				y,
1190*eaa79794SWojciech Macek 		unsigned int			timeout,
1191*eaa79794SWojciech Macek 		unsigned int			*value)
1192*eaa79794SWojciech Macek {
1193*eaa79794SWojciech Macek 	enum al_serdes_reg_page	page = (enum al_serdes_reg_page)lane;
1194*eaa79794SWojciech Macek 	uint32_t i;
1195*eaa79794SWojciech Macek 	uint8_t sample_count_orig_msb;
1196*eaa79794SWojciech Macek 	uint8_t sample_count_orig_lsb;
1197*eaa79794SWojciech Macek 
1198*eaa79794SWojciech Macek 	al_assert(obj);
1199*eaa79794SWojciech Macek 	al_assert(((int)page) >= AL_SRDS_REG_PAGE_0_LANE_0);
1200*eaa79794SWojciech Macek 	al_assert(((int)page) <= AL_SRDS_REG_PAGE_0123_LANES_0123);
1201*eaa79794SWojciech Macek 
1202*eaa79794SWojciech Macek 	/* Obtain sample count by reading RXCALROAMEYEMEAS_COUNT */
1203*eaa79794SWojciech Macek 	sample_count_orig_msb = al_serdes_grp_reg_read(obj,
1204*eaa79794SWojciech Macek 		AL_SRDS_REG_PAGE_4_COMMON, AL_SRDS_REG_TYPE_PMA,
1205*eaa79794SWojciech Macek 		SERDES_IREG_FLD_EYE_DIAG_SAMPLE_CNT_MSB_REG_NUM);
1206*eaa79794SWojciech Macek 	sample_count_orig_lsb = al_serdes_grp_reg_read(obj,
1207*eaa79794SWojciech Macek 		AL_SRDS_REG_PAGE_4_COMMON, AL_SRDS_REG_TYPE_PMA,
1208*eaa79794SWojciech Macek 		SERDES_IREG_FLD_EYE_DIAG_SAMPLE_CNT_LSB_REG_NUM);
1209*eaa79794SWojciech Macek 
1210*eaa79794SWojciech Macek 	/* Set sample count to ~100000 samples */
1211*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
1212*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
1213*eaa79794SWojciech Macek 		SERDES_IREG_FLD_EYE_DIAG_SAMPLE_CNT_MSB_REG_NUM, 0x13);
1214*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
1215*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
1216*eaa79794SWojciech Macek 		SERDES_IREG_FLD_EYE_DIAG_SAMPLE_CNT_LSB_REG_NUM, 0x88);
1217*eaa79794SWojciech Macek 
1218*eaa79794SWojciech Macek 	/* BER Contour Overwrite */
1219*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj, page, AL_SRDS_REG_TYPE_PMA,
1220*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMEYEMEASIN_LOCWREN_REG_NUM,
1221*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMEYEMEASIN_LOCWREN,
1222*eaa79794SWojciech Macek 		0);
1223*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj, page, AL_SRDS_REG_TYPE_PMA,
1224*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMXADJUST_LOCWREN_REG_NUM,
1225*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMXADJUST_LOCWREN,
1226*eaa79794SWojciech Macek 		0);
1227*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj, page, AL_SRDS_REG_TYPE_PMA,
1228*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMYADJUST_LOCWREN_REG_NUM,
1229*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMYADJUST_LOCWREN,
1230*eaa79794SWojciech Macek 		0);
1231*eaa79794SWojciech Macek 
1232*eaa79794SWojciech Macek 	/* RXROAM_XORBITSEL = 0x1 or 0x0 */
1233*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj, page, AL_SRDS_REG_TYPE_PMA,
1234*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXROAM_XORBITSEL_REG_NUM,
1235*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXROAM_XORBITSEL,
1236*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXROAM_XORBITSEL_2ND);
1237*eaa79794SWojciech Macek 
1238*eaa79794SWojciech Macek 	/* Set X */
1239*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, page, AL_SRDS_REG_TYPE_PMA,
1240*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMXADJUST_REG_NUM, x);
1241*eaa79794SWojciech Macek 
1242*eaa79794SWojciech Macek 	/* Set Y */
1243*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, page, AL_SRDS_REG_TYPE_PMA,
1244*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMYADJUST_REG_NUM,
1245*eaa79794SWojciech Macek 		y < 32 ? 31 - y : y + 1);
1246*eaa79794SWojciech Macek 
1247*eaa79794SWojciech Macek 	/* Start Measurement by setting RXCALROAMEYEMEASIN_CYCLEEN = 0x1 */
1248*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj, page, AL_SRDS_REG_TYPE_PMA,
1249*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMEYEMEASIN_CYCLEEN_REG_NUM,
1250*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMEYEMEASIN_CYCLEEN_START,
1251*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMEYEMEASIN_CYCLEEN_START);
1252*eaa79794SWojciech Macek 
1253*eaa79794SWojciech Macek 	/* Check RXCALROAMEYEMEASDONE Signal (Polling Until 0x1) */
1254*eaa79794SWojciech Macek 	for (i = 0; i < timeout; i++) {
1255*eaa79794SWojciech Macek 		if (al_serdes_grp_reg_read(obj, page, AL_SRDS_REG_TYPE_PMA,
1256*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALROAMEYEMEASDONE_REG_NUM) &
1257*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALROAMEYEMEASDONE)
1258*eaa79794SWojciech Macek 			break;
1259*eaa79794SWojciech Macek 		al_udelay(1);
1260*eaa79794SWojciech Macek 	}
1261*eaa79794SWojciech Macek 	if (i == timeout) {
1262*eaa79794SWojciech Macek 		al_err("%s: eye diagram sampling timed out!\n", __func__);
1263*eaa79794SWojciech Macek 		return -ETIMEDOUT;
1264*eaa79794SWojciech Macek 	}
1265*eaa79794SWojciech Macek 
1266*eaa79794SWojciech Macek 	/* Stop Measurement by setting RXCALROAMEYEMEASIN_CYCLEEN = 0x0 */
1267*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj, page, AL_SRDS_REG_TYPE_PMA,
1268*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMEYEMEASIN_CYCLEEN_REG_NUM,
1269*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMEYEMEASIN_CYCLEEN_START,
1270*eaa79794SWojciech Macek 		0);
1271*eaa79794SWojciech Macek 
1272*eaa79794SWojciech Macek 	/* Obtain Error Counts by reading RXCALROAMEYEMEAS_ACC */
1273*eaa79794SWojciech Macek 	*value = ((unsigned int)al_serdes_grp_reg_read(obj, page,
1274*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
1275*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMEYEMEAS_ACC_MSB_REG_NUM)) << 8 |
1276*eaa79794SWojciech Macek 		al_serdes_grp_reg_read(obj, page, AL_SRDS_REG_TYPE_PMA,
1277*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMEYEMEAS_ACC_LSB_REG_NUM);
1278*eaa79794SWojciech Macek 
1279*eaa79794SWojciech Macek 	/* BER Contour Overwrite */
1280*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj, page, AL_SRDS_REG_TYPE_PMA,
1281*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMEYEMEASIN_LOCWREN_REG_NUM,
1282*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMEYEMEASIN_LOCWREN,
1283*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMEYEMEASIN_LOCWREN);
1284*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj, page, AL_SRDS_REG_TYPE_PMA,
1285*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMXADJUST_LOCWREN_REG_NUM,
1286*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMXADJUST_LOCWREN,
1287*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMXADJUST_LOCWREN);
1288*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj, page, AL_SRDS_REG_TYPE_PMA,
1289*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMYADJUST_LOCWREN_REG_NUM,
1290*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMYADJUST_LOCWREN,
1291*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMYADJUST_LOCWREN);
1292*eaa79794SWojciech Macek 
1293*eaa79794SWojciech Macek 	/* Restore sample count */
1294*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
1295*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
1296*eaa79794SWojciech Macek 		SERDES_IREG_FLD_EYE_DIAG_SAMPLE_CNT_MSB_REG_NUM,
1297*eaa79794SWojciech Macek 		sample_count_orig_msb);
1298*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
1299*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA,
1300*eaa79794SWojciech Macek 		SERDES_IREG_FLD_EYE_DIAG_SAMPLE_CNT_LSB_REG_NUM,
1301*eaa79794SWojciech Macek 		sample_count_orig_lsb);
1302*eaa79794SWojciech Macek 
1303*eaa79794SWojciech Macek 	return 0;
1304*eaa79794SWojciech Macek }
1305*eaa79794SWojciech Macek 
1306*eaa79794SWojciech Macek /******************************************************************************/
1307*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_tx_deemph_set(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane,uint32_t c_zero,uint32_t c_plus_1,uint32_t c_minus_1)1308*eaa79794SWojciech Macek static void al_serdes_tx_deemph_set(
1309*eaa79794SWojciech Macek 		struct al_serdes_grp_obj	*obj,
1310*eaa79794SWojciech Macek 		enum al_serdes_lane		lane,
1311*eaa79794SWojciech Macek 		uint32_t			c_zero,
1312*eaa79794SWojciech Macek 		uint32_t			c_plus_1,
1313*eaa79794SWojciech Macek 		uint32_t			c_minus_1)
1314*eaa79794SWojciech Macek {
1315*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1316*eaa79794SWojciech Macek 			obj,
1317*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)lane,
1318*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
1319*eaa79794SWojciech Macek 			SERDES_IREG_TX_DRV_1_REG_NUM,
1320*eaa79794SWojciech Macek 			SERDES_IREG_TX_DRV_1_LEVN_MASK,
1321*eaa79794SWojciech Macek 			((c_zero + c_plus_1 + c_minus_1)
1322*eaa79794SWojciech Macek 				<< SERDES_IREG_TX_DRV_1_LEVN_SHIFT));
1323*eaa79794SWojciech Macek 
1324*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1325*eaa79794SWojciech Macek 			obj,
1326*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)lane,
1327*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
1328*eaa79794SWojciech Macek 			SERDES_IREG_TX_DRV_2_REG_NUM,
1329*eaa79794SWojciech Macek 			SERDES_IREG_TX_DRV_2_LEVNM1_MASK,
1330*eaa79794SWojciech Macek 			(c_plus_1 << SERDES_IREG_TX_DRV_2_LEVNM1_SHIFT));
1331*eaa79794SWojciech Macek 
1332*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1333*eaa79794SWojciech Macek 			obj,
1334*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)lane,
1335*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
1336*eaa79794SWojciech Macek 			SERDES_IREG_TX_DRV_3_REG_NUM,
1337*eaa79794SWojciech Macek 			SERDES_IREG_TX_DRV_3_LEVNP1_MASK,
1338*eaa79794SWojciech Macek 			(c_minus_1 << SERDES_IREG_TX_DRV_3_LEVNP1_SHIFT));
1339*eaa79794SWojciech Macek }
1340*eaa79794SWojciech Macek 
al_serdes_tx_deemph_get(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane,uint32_t * c_zero,uint32_t * c_plus_1,uint32_t * c_minus_1)1341*eaa79794SWojciech Macek static void al_serdes_tx_deemph_get(
1342*eaa79794SWojciech Macek 		struct al_serdes_grp_obj	*obj,
1343*eaa79794SWojciech Macek 		enum al_serdes_lane		lane,
1344*eaa79794SWojciech Macek 		uint32_t			*c_zero,
1345*eaa79794SWojciech Macek 		uint32_t			*c_plus_1,
1346*eaa79794SWojciech Macek 		uint32_t			*c_minus_1)
1347*eaa79794SWojciech Macek {
1348*eaa79794SWojciech Macek 	uint32_t reg = 0;
1349*eaa79794SWojciech Macek 
1350*eaa79794SWojciech Macek 	reg = al_serdes_grp_reg_read(
1351*eaa79794SWojciech Macek 			obj,
1352*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)lane,
1353*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
1354*eaa79794SWojciech Macek 			SERDES_IREG_TX_DRV_2_REG_NUM);
1355*eaa79794SWojciech Macek 
1356*eaa79794SWojciech Macek 	*c_plus_1 = ((reg & SERDES_IREG_TX_DRV_2_LEVNM1_MASK) >>
1357*eaa79794SWojciech Macek 					SERDES_IREG_TX_DRV_2_LEVNM1_SHIFT);
1358*eaa79794SWojciech Macek 
1359*eaa79794SWojciech Macek 	reg = al_serdes_grp_reg_read(
1360*eaa79794SWojciech Macek 			obj,
1361*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)lane,
1362*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
1363*eaa79794SWojciech Macek 			SERDES_IREG_TX_DRV_3_REG_NUM);
1364*eaa79794SWojciech Macek 
1365*eaa79794SWojciech Macek 	*c_minus_1 = ((reg & SERDES_IREG_TX_DRV_3_LEVNP1_MASK) >>
1366*eaa79794SWojciech Macek 					SERDES_IREG_TX_DRV_3_LEVNP1_SHIFT);
1367*eaa79794SWojciech Macek 
1368*eaa79794SWojciech Macek 	reg = al_serdes_grp_reg_read(
1369*eaa79794SWojciech Macek 			obj,
1370*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)lane,
1371*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
1372*eaa79794SWojciech Macek 			SERDES_IREG_TX_DRV_1_REG_NUM);
1373*eaa79794SWojciech Macek 
1374*eaa79794SWojciech Macek 	*c_zero = (((reg & SERDES_IREG_TX_DRV_1_LEVN_MASK) >>
1375*eaa79794SWojciech Macek 		SERDES_IREG_TX_DRV_1_LEVN_SHIFT) - *c_plus_1 - *c_minus_1);
1376*eaa79794SWojciech Macek }
1377*eaa79794SWojciech Macek 
al_serdes_tx_deemph_inc(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane,enum al_serdes_tx_deemph_param param)1378*eaa79794SWojciech Macek static al_bool al_serdes_tx_deemph_inc(
1379*eaa79794SWojciech Macek 		struct al_serdes_grp_obj	*obj,
1380*eaa79794SWojciech Macek 		enum al_serdes_lane		lane,
1381*eaa79794SWojciech Macek 		enum al_serdes_tx_deemph_param	param)
1382*eaa79794SWojciech Macek {
1383*eaa79794SWojciech Macek 	al_bool ret = AL_TRUE;
1384*eaa79794SWojciech Macek 	uint32_t c0;
1385*eaa79794SWojciech Macek 	uint32_t c1;
1386*eaa79794SWojciech Macek 	uint32_t c_1;
1387*eaa79794SWojciech Macek 
1388*eaa79794SWojciech Macek 	al_serdes_tx_deemph_get(obj, lane, &c0, &c1, &c_1);
1389*eaa79794SWojciech Macek 
1390*eaa79794SWojciech Macek 	al_dbg("%s: current txdeemph: c0 = 0x%x c1 = 0x%x c-1 = 0x%x\n",
1391*eaa79794SWojciech Macek 		__func__, c0, c1, c_1);
1392*eaa79794SWojciech Macek 
1393*eaa79794SWojciech Macek 	switch (param) {
1394*eaa79794SWojciech Macek 	case AL_SERDES_TX_DEEMP_C_ZERO:
1395*eaa79794SWojciech Macek 
1396*eaa79794SWojciech Macek 		if (c0 == AL_SERDES_TX_DEEMPH_C_ZERO_MAX_VAL)
1397*eaa79794SWojciech Macek 			return AL_FALSE;
1398*eaa79794SWojciech Macek 
1399*eaa79794SWojciech Macek 		c0++;
1400*eaa79794SWojciech Macek 
1401*eaa79794SWojciech Macek 		break;
1402*eaa79794SWojciech Macek 	case AL_SERDES_TX_DEEMP_C_PLUS:
1403*eaa79794SWojciech Macek 
1404*eaa79794SWojciech Macek 		if (c1 == AL_SERDES_TX_DEEMPH_C_PLUS_MAX_VAL)
1405*eaa79794SWojciech Macek 			return AL_FALSE;
1406*eaa79794SWojciech Macek 
1407*eaa79794SWojciech Macek 		c1++;
1408*eaa79794SWojciech Macek 
1409*eaa79794SWojciech Macek 		break;
1410*eaa79794SWojciech Macek 	case AL_SERDES_TX_DEEMP_C_MINUS:
1411*eaa79794SWojciech Macek 
1412*eaa79794SWojciech Macek 		if (c_1 == AL_SERDES_TX_DEEMPH_C_MINUS_MAX_VAL)
1413*eaa79794SWojciech Macek 			return AL_FALSE;
1414*eaa79794SWojciech Macek 
1415*eaa79794SWojciech Macek 		c_1++;
1416*eaa79794SWojciech Macek 
1417*eaa79794SWojciech Macek 		break;
1418*eaa79794SWojciech Macek 	}
1419*eaa79794SWojciech Macek 
1420*eaa79794SWojciech Macek 	if ((c0 + c1 + c_1) > AL_SERDES_TX_DEEMPH_SUM_MAX) {
1421*eaa79794SWojciech Macek 		al_dbg("%s: sum of all tx de-emphasis over the max limit\n",
1422*eaa79794SWojciech Macek 			__func__);
1423*eaa79794SWojciech Macek 
1424*eaa79794SWojciech Macek 		return AL_FALSE;
1425*eaa79794SWojciech Macek 	}
1426*eaa79794SWojciech Macek 
1427*eaa79794SWojciech Macek 	al_dbg("%s: new txdeemph: c0 = 0x%x c1 = 0x%x c-1 = 0x%x\n",
1428*eaa79794SWojciech Macek 		__func__, c0, c1, c_1);
1429*eaa79794SWojciech Macek 
1430*eaa79794SWojciech Macek 	al_serdes_tx_deemph_set(obj, lane, c0, c1, c_1);
1431*eaa79794SWojciech Macek 
1432*eaa79794SWojciech Macek 	return ret;
1433*eaa79794SWojciech Macek }
1434*eaa79794SWojciech Macek 
al_serdes_tx_deemph_dec(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane,enum al_serdes_tx_deemph_param param)1435*eaa79794SWojciech Macek static al_bool al_serdes_tx_deemph_dec(
1436*eaa79794SWojciech Macek 		struct al_serdes_grp_obj	*obj,
1437*eaa79794SWojciech Macek 		enum al_serdes_lane		lane,
1438*eaa79794SWojciech Macek 		enum al_serdes_tx_deemph_param	param)
1439*eaa79794SWojciech Macek {
1440*eaa79794SWojciech Macek 	al_bool ret = AL_TRUE;
1441*eaa79794SWojciech Macek 	uint32_t c0;
1442*eaa79794SWojciech Macek 	uint32_t c1;
1443*eaa79794SWojciech Macek 	uint32_t c_1;
1444*eaa79794SWojciech Macek 
1445*eaa79794SWojciech Macek 	al_serdes_tx_deemph_get(obj, lane, &c0, &c1, &c_1);
1446*eaa79794SWojciech Macek 
1447*eaa79794SWojciech Macek 	al_dbg("%s: current txdeemph: c0 = 0x%x c1 = 0x%x c-1 = 0x%x\n",
1448*eaa79794SWojciech Macek 		__func__, c0, c1, c_1);
1449*eaa79794SWojciech Macek 
1450*eaa79794SWojciech Macek 	switch (param) {
1451*eaa79794SWojciech Macek 	case AL_SERDES_TX_DEEMP_C_ZERO:
1452*eaa79794SWojciech Macek 
1453*eaa79794SWojciech Macek 		if (c0 == AL_SERDES_TX_DEEMPH_C_ZERO_MIN_VAL)
1454*eaa79794SWojciech Macek 			return AL_FALSE;
1455*eaa79794SWojciech Macek 
1456*eaa79794SWojciech Macek 		c0--;
1457*eaa79794SWojciech Macek 
1458*eaa79794SWojciech Macek 		break;
1459*eaa79794SWojciech Macek 	case AL_SERDES_TX_DEEMP_C_PLUS:
1460*eaa79794SWojciech Macek 
1461*eaa79794SWojciech Macek 		if (c1 == AL_SERDES_TX_DEEMPH_C_PLUS_MIN_VAL)
1462*eaa79794SWojciech Macek 			return AL_FALSE;
1463*eaa79794SWojciech Macek 
1464*eaa79794SWojciech Macek 		c1--;
1465*eaa79794SWojciech Macek 
1466*eaa79794SWojciech Macek 		break;
1467*eaa79794SWojciech Macek 	case AL_SERDES_TX_DEEMP_C_MINUS:
1468*eaa79794SWojciech Macek 
1469*eaa79794SWojciech Macek 		if (c_1 == AL_SERDES_TX_DEEMPH_C_MINUS_MIN_VAL)
1470*eaa79794SWojciech Macek 			return AL_FALSE;
1471*eaa79794SWojciech Macek 
1472*eaa79794SWojciech Macek 		c_1--;
1473*eaa79794SWojciech Macek 
1474*eaa79794SWojciech Macek 		break;
1475*eaa79794SWojciech Macek 	}
1476*eaa79794SWojciech Macek 
1477*eaa79794SWojciech Macek 	al_dbg("%s: new txdeemph: c0 = 0x%x c1 = 0x%x c-1 = 0x%x\n",
1478*eaa79794SWojciech Macek 		__func__, c0, c1, c_1);
1479*eaa79794SWojciech Macek 
1480*eaa79794SWojciech Macek 	al_serdes_tx_deemph_set(obj, lane, c0, c1, c_1);
1481*eaa79794SWojciech Macek 
1482*eaa79794SWojciech Macek 	return ret;
1483*eaa79794SWojciech Macek }
1484*eaa79794SWojciech Macek 
al_serdes_tx_deemph_preset(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane)1485*eaa79794SWojciech Macek static void al_serdes_tx_deemph_preset(
1486*eaa79794SWojciech Macek 		struct al_serdes_grp_obj	*obj,
1487*eaa79794SWojciech Macek 		enum al_serdes_lane		lane)
1488*eaa79794SWojciech Macek {
1489*eaa79794SWojciech Macek 	uint32_t c0;
1490*eaa79794SWojciech Macek 	uint32_t c1;
1491*eaa79794SWojciech Macek 	uint32_t c_1;
1492*eaa79794SWojciech Macek 
1493*eaa79794SWojciech Macek 	c0 = AL_SERDES_TX_DEEMPH_C_ZERO_PRESET;
1494*eaa79794SWojciech Macek 
1495*eaa79794SWojciech Macek 	c1 = AL_SERDES_TX_DEEMPH_C_PLUS_PRESET;
1496*eaa79794SWojciech Macek 
1497*eaa79794SWojciech Macek 	c_1 = AL_SERDES_TX_DEEMPH_C_MINUS_PRESET;
1498*eaa79794SWojciech Macek 
1499*eaa79794SWojciech Macek 	al_dbg("preset: new txdeemph: c0 = 0x%x c1 = 0x%x c-1 = 0x%x\n",
1500*eaa79794SWojciech Macek 		c0, c1, c_1);
1501*eaa79794SWojciech Macek 
1502*eaa79794SWojciech Macek 	al_serdes_tx_deemph_set(obj, lane, c0, c1, c_1);
1503*eaa79794SWojciech Macek }
1504*eaa79794SWojciech Macek 
al_serdes_signal_is_detected(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane)1505*eaa79794SWojciech Macek static al_bool al_serdes_signal_is_detected(
1506*eaa79794SWojciech Macek 		struct al_serdes_grp_obj	*obj,
1507*eaa79794SWojciech Macek 		enum al_serdes_lane		lane)
1508*eaa79794SWojciech Macek {
1509*eaa79794SWojciech Macek 	uint32_t reg = 0;
1510*eaa79794SWojciech Macek 
1511*eaa79794SWojciech Macek 	reg = al_serdes_grp_reg_read(
1512*eaa79794SWojciech Macek 			obj,
1513*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)lane,
1514*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
1515*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXRANDET_REG_NUM);
1516*eaa79794SWojciech Macek 
1517*eaa79794SWojciech Macek 	return ((reg & SERDES_IREG_FLD_RXRANDET_STAT) ? AL_TRUE : AL_FALSE);
1518*eaa79794SWojciech Macek }
1519*eaa79794SWojciech Macek 
al_serdes_tx_advanced_params_set(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane,void * tx_params)1520*eaa79794SWojciech Macek static void al_serdes_tx_advanced_params_set(struct al_serdes_grp_obj	*obj,
1521*eaa79794SWojciech Macek 				      enum al_serdes_lane		lane,
1522*eaa79794SWojciech Macek 				      void				*tx_params)
1523*eaa79794SWojciech Macek {
1524*eaa79794SWojciech Macek 	uint8_t reg = 0;
1525*eaa79794SWojciech Macek 	struct al_serdes_adv_tx_params	*params = tx_params;
1526*eaa79794SWojciech Macek 
1527*eaa79794SWojciech Macek 	if (!params->override) {
1528*eaa79794SWojciech Macek 		al_serdes_grp_reg_masked_write(obj,
1529*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)lane,
1530*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
1531*eaa79794SWojciech Macek 			SERDES_IREG_FLD_TX_DRV_OVERRIDE_EN_REG_NUM,
1532*eaa79794SWojciech Macek 			SERDES_IREG_FLD_TX_DRV_OVERRIDE_EN,
1533*eaa79794SWojciech Macek 			SERDES_IREG_FLD_TX_DRV_OVERRIDE_EN);
1534*eaa79794SWojciech Macek 
1535*eaa79794SWojciech Macek 		return;
1536*eaa79794SWojciech Macek 	}
1537*eaa79794SWojciech Macek 
1538*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj,
1539*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)lane,
1540*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
1541*eaa79794SWojciech Macek 			SERDES_IREG_FLD_TX_DRV_OVERRIDE_EN_REG_NUM,
1542*eaa79794SWojciech Macek 			SERDES_IREG_FLD_TX_DRV_OVERRIDE_EN,
1543*eaa79794SWojciech Macek 			0);
1544*eaa79794SWojciech Macek 
1545*eaa79794SWojciech Macek 	AL_REG_FIELD_SET(reg,
1546*eaa79794SWojciech Macek 			 SERDES_IREG_TX_DRV_1_HLEV_MASK,
1547*eaa79794SWojciech Macek 			 SERDES_IREG_TX_DRV_1_HLEV_SHIFT,
1548*eaa79794SWojciech Macek 			 params->amp);
1549*eaa79794SWojciech Macek 
1550*eaa79794SWojciech Macek 	AL_REG_FIELD_SET(reg,
1551*eaa79794SWojciech Macek 			 SERDES_IREG_TX_DRV_1_LEVN_MASK,
1552*eaa79794SWojciech Macek 			 SERDES_IREG_TX_DRV_1_LEVN_SHIFT,
1553*eaa79794SWojciech Macek 			 params->total_driver_units);
1554*eaa79794SWojciech Macek 
1555*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj,
1556*eaa79794SWojciech Macek 				(enum al_serdes_reg_page)lane,
1557*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1558*eaa79794SWojciech Macek 				SERDES_IREG_TX_DRV_1_REG_NUM,
1559*eaa79794SWojciech Macek 				reg);
1560*eaa79794SWojciech Macek 
1561*eaa79794SWojciech Macek 	reg = 0;
1562*eaa79794SWojciech Macek 	AL_REG_FIELD_SET(reg,
1563*eaa79794SWojciech Macek 			 SERDES_IREG_TX_DRV_2_LEVNM1_MASK,
1564*eaa79794SWojciech Macek 			 SERDES_IREG_TX_DRV_2_LEVNM1_SHIFT,
1565*eaa79794SWojciech Macek 			 params->c_plus_1);
1566*eaa79794SWojciech Macek 
1567*eaa79794SWojciech Macek 	AL_REG_FIELD_SET(reg,
1568*eaa79794SWojciech Macek 			 SERDES_IREG_TX_DRV_2_LEVNM2_MASK,
1569*eaa79794SWojciech Macek 			 SERDES_IREG_TX_DRV_2_LEVNM2_SHIFT,
1570*eaa79794SWojciech Macek 			 params->c_plus_2);
1571*eaa79794SWojciech Macek 
1572*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj,
1573*eaa79794SWojciech Macek 				(enum al_serdes_reg_page)lane,
1574*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1575*eaa79794SWojciech Macek 				SERDES_IREG_TX_DRV_2_REG_NUM,
1576*eaa79794SWojciech Macek 				reg);
1577*eaa79794SWojciech Macek 
1578*eaa79794SWojciech Macek 	reg = 0;
1579*eaa79794SWojciech Macek 	AL_REG_FIELD_SET(reg,
1580*eaa79794SWojciech Macek 			 SERDES_IREG_TX_DRV_3_LEVNP1_MASK,
1581*eaa79794SWojciech Macek 			 SERDES_IREG_TX_DRV_3_LEVNP1_SHIFT,
1582*eaa79794SWojciech Macek 			 params->c_minus_1);
1583*eaa79794SWojciech Macek 
1584*eaa79794SWojciech Macek 	AL_REG_FIELD_SET(reg,
1585*eaa79794SWojciech Macek 			 SERDES_IREG_TX_DRV_3_SLEW_MASK,
1586*eaa79794SWojciech Macek 			 SERDES_IREG_TX_DRV_3_SLEW_SHIFT,
1587*eaa79794SWojciech Macek 			 params->slew_rate);
1588*eaa79794SWojciech Macek 
1589*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj,
1590*eaa79794SWojciech Macek 				(enum al_serdes_reg_page)lane,
1591*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1592*eaa79794SWojciech Macek 				SERDES_IREG_TX_DRV_3_REG_NUM,
1593*eaa79794SWojciech Macek 				reg);
1594*eaa79794SWojciech Macek 
1595*eaa79794SWojciech Macek }
1596*eaa79794SWojciech Macek 
al_serdes_tx_advanced_params_get(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane,void * tx_params)1597*eaa79794SWojciech Macek static void al_serdes_tx_advanced_params_get(struct al_serdes_grp_obj	*obj,
1598*eaa79794SWojciech Macek 				      enum al_serdes_lane		lane,
1599*eaa79794SWojciech Macek 				      void				*tx_params)
1600*eaa79794SWojciech Macek {
1601*eaa79794SWojciech Macek 	struct al_serdes_adv_tx_params	*params = tx_params;
1602*eaa79794SWojciech Macek 	uint8_t reg_val = 0;
1603*eaa79794SWojciech Macek 
1604*eaa79794SWojciech Macek 	al_serdes_reg_read(obj, (enum al_serdes_reg_page)lane,
1605*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
1606*eaa79794SWojciech Macek 			SERDES_IREG_TX_DRV_1_REG_NUM,
1607*eaa79794SWojciech Macek 			&reg_val);
1608*eaa79794SWojciech Macek 	params->amp = (reg_val & SERDES_IREG_TX_DRV_1_HLEV_MASK) >>
1609*eaa79794SWojciech Macek 				SERDES_IREG_TX_DRV_1_HLEV_SHIFT;
1610*eaa79794SWojciech Macek 	params->total_driver_units = (reg_val &
1611*eaa79794SWojciech Macek 					SERDES_IREG_TX_DRV_1_LEVN_MASK) >>
1612*eaa79794SWojciech Macek 					SERDES_IREG_TX_DRV_1_LEVN_SHIFT;
1613*eaa79794SWojciech Macek 
1614*eaa79794SWojciech Macek 	al_serdes_reg_read(obj, (enum al_serdes_reg_page)lane,
1615*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
1616*eaa79794SWojciech Macek 			SERDES_IREG_TX_DRV_2_REG_NUM,
1617*eaa79794SWojciech Macek 			&reg_val);
1618*eaa79794SWojciech Macek 	params->c_plus_1 = (reg_val & SERDES_IREG_TX_DRV_2_LEVNM1_MASK) >>
1619*eaa79794SWojciech Macek 				SERDES_IREG_TX_DRV_2_LEVNM1_SHIFT;
1620*eaa79794SWojciech Macek 	params->c_plus_2 = (reg_val & SERDES_IREG_TX_DRV_2_LEVNM2_MASK) >>
1621*eaa79794SWojciech Macek 				SERDES_IREG_TX_DRV_2_LEVNM2_SHIFT;
1622*eaa79794SWojciech Macek 
1623*eaa79794SWojciech Macek 	al_serdes_reg_read(obj, (enum al_serdes_reg_page)lane,
1624*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
1625*eaa79794SWojciech Macek 			SERDES_IREG_TX_DRV_3_REG_NUM,
1626*eaa79794SWojciech Macek 			&reg_val);
1627*eaa79794SWojciech Macek 	params->c_minus_1 = (reg_val & SERDES_IREG_TX_DRV_3_LEVNP1_MASK) >>
1628*eaa79794SWojciech Macek 				SERDES_IREG_TX_DRV_3_LEVNP1_SHIFT;
1629*eaa79794SWojciech Macek 	params->slew_rate = (reg_val & SERDES_IREG_TX_DRV_3_SLEW_MASK) >>
1630*eaa79794SWojciech Macek 				SERDES_IREG_TX_DRV_3_SLEW_SHIFT;
1631*eaa79794SWojciech Macek 
1632*eaa79794SWojciech Macek 	al_serdes_reg_read(obj, (enum al_serdes_reg_page)lane,
1633*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
1634*eaa79794SWojciech Macek 			SERDES_IREG_FLD_TX_DRV_OVERRIDE_EN_REG_NUM,
1635*eaa79794SWojciech Macek 			&reg_val);
1636*eaa79794SWojciech Macek 	params->override = ((reg_val & SERDES_IREG_FLD_TX_DRV_OVERRIDE_EN) == 0);
1637*eaa79794SWojciech Macek }
1638*eaa79794SWojciech Macek 
1639*eaa79794SWojciech Macek 
al_serdes_rx_advanced_params_set(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane,void * rx_params)1640*eaa79794SWojciech Macek static void al_serdes_rx_advanced_params_set(struct al_serdes_grp_obj	*obj,
1641*eaa79794SWojciech Macek 				      enum al_serdes_lane		lane,
1642*eaa79794SWojciech Macek 				      void				*rx_params)
1643*eaa79794SWojciech Macek {
1644*eaa79794SWojciech Macek 	struct al_serdes_adv_rx_params	*params = rx_params;
1645*eaa79794SWojciech Macek 	uint8_t reg = 0;
1646*eaa79794SWojciech Macek 
1647*eaa79794SWojciech Macek 	if (!params->override) {
1648*eaa79794SWojciech Macek 		al_serdes_grp_reg_masked_write(obj,
1649*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)lane,
1650*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
1651*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RX_DRV_OVERRIDE_EN_REG_NUM,
1652*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RX_DRV_OVERRIDE_EN,
1653*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RX_DRV_OVERRIDE_EN);
1654*eaa79794SWojciech Macek 
1655*eaa79794SWojciech Macek 		return;
1656*eaa79794SWojciech Macek 	}
1657*eaa79794SWojciech Macek 
1658*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj,
1659*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)lane,
1660*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
1661*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RX_DRV_OVERRIDE_EN_REG_NUM,
1662*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RX_DRV_OVERRIDE_EN,
1663*eaa79794SWojciech Macek 			0);
1664*eaa79794SWojciech Macek 
1665*eaa79794SWojciech Macek 	AL_REG_FIELD_SET(reg,
1666*eaa79794SWojciech Macek 			 SERDES_IREG_RX_CALEQ_1_DCGAIN_MASK,
1667*eaa79794SWojciech Macek 			 SERDES_IREG_RX_CALEQ_1_DCGAIN_SHIFT,
1668*eaa79794SWojciech Macek 			 params->dcgain);
1669*eaa79794SWojciech Macek 
1670*eaa79794SWojciech Macek 	AL_REG_FIELD_SET(reg,
1671*eaa79794SWojciech Macek 			 SERDES_IREG_RX_CALEQ_1_DFEPSTAP3DB_MASK,
1672*eaa79794SWojciech Macek 			 SERDES_IREG_RX_CALEQ_1_DFEPSTAP3DB_SHIFT,
1673*eaa79794SWojciech Macek 			 params->dfe_3db_freq);
1674*eaa79794SWojciech Macek 
1675*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj,
1676*eaa79794SWojciech Macek 				(enum al_serdes_reg_page)lane,
1677*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1678*eaa79794SWojciech Macek 				SERDES_IREG_RX_CALEQ_1_REG_NUM,
1679*eaa79794SWojciech Macek 				reg);
1680*eaa79794SWojciech Macek 
1681*eaa79794SWojciech Macek 	reg = 0;
1682*eaa79794SWojciech Macek 	AL_REG_FIELD_SET(reg,
1683*eaa79794SWojciech Macek 			 SERDES_IREG_RX_CALEQ_2_DFEPSTAPGAIN_MASK,
1684*eaa79794SWojciech Macek 			 SERDES_IREG_RX_CALEQ_2_DFEPSTAPGAIN_SHIFT,
1685*eaa79794SWojciech Macek 			 params->dfe_gain);
1686*eaa79794SWojciech Macek 
1687*eaa79794SWojciech Macek 	AL_REG_FIELD_SET(reg,
1688*eaa79794SWojciech Macek 			 SERDES_IREG_RX_CALEQ_2_DFETAP1GAIN_MASK,
1689*eaa79794SWojciech Macek 			 SERDES_IREG_RX_CALEQ_2_DFETAP1GAIN_SHIFT,
1690*eaa79794SWojciech Macek 			 params->dfe_first_tap_ctrl);
1691*eaa79794SWojciech Macek 
1692*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj,
1693*eaa79794SWojciech Macek 				(enum al_serdes_reg_page)lane,
1694*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1695*eaa79794SWojciech Macek 				SERDES_IREG_RX_CALEQ_2_REG_NUM,
1696*eaa79794SWojciech Macek 				reg);
1697*eaa79794SWojciech Macek 
1698*eaa79794SWojciech Macek 	reg = 0;
1699*eaa79794SWojciech Macek 	AL_REG_FIELD_SET(reg,
1700*eaa79794SWojciech Macek 			 SERDES_IREG_RX_CALEQ_3_DFETAP2GAIN_MASK,
1701*eaa79794SWojciech Macek 			 SERDES_IREG_RX_CALEQ_3_DFETAP2GAIN_SHIFT,
1702*eaa79794SWojciech Macek 			 params->dfe_secound_tap_ctrl);
1703*eaa79794SWojciech Macek 
1704*eaa79794SWojciech Macek 	AL_REG_FIELD_SET(reg,
1705*eaa79794SWojciech Macek 			 SERDES_IREG_RX_CALEQ_3_DFETAP3GAIN_MASK,
1706*eaa79794SWojciech Macek 			 SERDES_IREG_RX_CALEQ_3_DFETAP3GAIN_SHIFT,
1707*eaa79794SWojciech Macek 			 params->dfe_third_tap_ctrl);
1708*eaa79794SWojciech Macek 
1709*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj,
1710*eaa79794SWojciech Macek 				(enum al_serdes_reg_page)lane,
1711*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1712*eaa79794SWojciech Macek 				SERDES_IREG_RX_CALEQ_3_REG_NUM,
1713*eaa79794SWojciech Macek 				reg);
1714*eaa79794SWojciech Macek 
1715*eaa79794SWojciech Macek 	reg = 0;
1716*eaa79794SWojciech Macek 	AL_REG_FIELD_SET(reg,
1717*eaa79794SWojciech Macek 			 SERDES_IREG_RX_CALEQ_4_DFETAP4GAIN_MASK,
1718*eaa79794SWojciech Macek 			 SERDES_IREG_RX_CALEQ_4_DFETAP4GAIN_SHIFT,
1719*eaa79794SWojciech Macek 			 params->dfe_fourth_tap_ctrl);
1720*eaa79794SWojciech Macek 
1721*eaa79794SWojciech Macek 	AL_REG_FIELD_SET(reg,
1722*eaa79794SWojciech Macek 			 SERDES_IREG_RX_CALEQ_4_LOFREQAGCGAIN_MASK,
1723*eaa79794SWojciech Macek 			 SERDES_IREG_RX_CALEQ_4_LOFREQAGCGAIN_SHIFT,
1724*eaa79794SWojciech Macek 			 params->low_freq_agc_gain);
1725*eaa79794SWojciech Macek 
1726*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj,
1727*eaa79794SWojciech Macek 				(enum al_serdes_reg_page)lane,
1728*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1729*eaa79794SWojciech Macek 				SERDES_IREG_RX_CALEQ_4_REG_NUM,
1730*eaa79794SWojciech Macek 				reg);
1731*eaa79794SWojciech Macek 
1732*eaa79794SWojciech Macek 	reg = 0;
1733*eaa79794SWojciech Macek 	AL_REG_FIELD_SET(reg,
1734*eaa79794SWojciech Macek 			 SERDES_IREG_RX_CALEQ_5_PRECAL_CODE_SEL_MASK,
1735*eaa79794SWojciech Macek 			 SERDES_IREG_RX_CALEQ_5_PRECAL_CODE_SEL_SHIFT,
1736*eaa79794SWojciech Macek 			 params->precal_code_sel);
1737*eaa79794SWojciech Macek 
1738*eaa79794SWojciech Macek 	AL_REG_FIELD_SET(reg,
1739*eaa79794SWojciech Macek 			 SERDES_IREG_RX_CALEQ_5_HIFREQAGCCAP_MASK,
1740*eaa79794SWojciech Macek 			 SERDES_IREG_RX_CALEQ_5_HIFREQAGCCAP_SHIFT,
1741*eaa79794SWojciech Macek 			 params->high_freq_agc_boost);
1742*eaa79794SWojciech Macek 
1743*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj,
1744*eaa79794SWojciech Macek 				(enum al_serdes_reg_page)lane,
1745*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1746*eaa79794SWojciech Macek 				SERDES_IREG_RX_CALEQ_5_REG_NUM,
1747*eaa79794SWojciech Macek 				reg);
1748*eaa79794SWojciech Macek }
1749*eaa79794SWojciech Macek 
al_serdes_common_cfg_eth(struct al_serdes_grp_obj * obj)1750*eaa79794SWojciech Macek static inline void al_serdes_common_cfg_eth(struct al_serdes_grp_obj	*obj)
1751*eaa79794SWojciech Macek {
1752*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1753*eaa79794SWojciech Macek 				obj,
1754*eaa79794SWojciech Macek 				AL_SRDS_REG_PAGE_4_COMMON,
1755*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1756*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXEQ_LOOKUP_CODE_EN_REG_NUM,
1757*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXEQ_LOOKUP_CODE_EN_MASK,
1758*eaa79794SWojciech Macek 				(0x1 << SERDES_IREG_FLD_RXEQ_LOOKUP_CODE_EN_SHIFT));
1759*eaa79794SWojciech Macek 
1760*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1761*eaa79794SWojciech Macek 				obj,
1762*eaa79794SWojciech Macek 				AL_SRDS_REG_PAGE_4_COMMON,
1763*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1764*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXEQ_LOOKUP_LASTCODE_REG_NUM,
1765*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXEQ_LOOKUP_LASTCODE_MASK,
1766*eaa79794SWojciech Macek 				(0 << SERDES_IREG_FLD_RXEQ_LOOKUP_LASTCODE_SHIFT));
1767*eaa79794SWojciech Macek 
1768*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1769*eaa79794SWojciech Macek 				obj,
1770*eaa79794SWojciech Macek 				AL_SRDS_REG_PAGE_4_COMMON,
1771*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1772*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXEQ_COARSE_RUN1_MASK_REG_NUM,
1773*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXEQ_COARSE_RUN1_MASK_MASK,
1774*eaa79794SWojciech Macek 				(0x2 << SERDES_IREG_FLD_RXEQ_COARSE_RUN1_MASK_SHIFT));
1775*eaa79794SWojciech Macek 
1776*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1777*eaa79794SWojciech Macek 				obj,
1778*eaa79794SWojciech Macek 				AL_SRDS_REG_PAGE_4_COMMON,
1779*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1780*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXEQ_COARSE_RUN2_MASK_REG_NUM,
1781*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXEQ_COARSE_RUN2_MASK_MASK,
1782*eaa79794SWojciech Macek 				(0 << SERDES_IREG_FLD_RXEQ_COARSE_RUN2_MASK_SHIFT));
1783*eaa79794SWojciech Macek 
1784*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1785*eaa79794SWojciech Macek 				obj,
1786*eaa79794SWojciech Macek 				AL_SRDS_REG_PAGE_4_COMMON,
1787*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1788*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXEQ_COARSE_STEP_REG_NUM,
1789*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXEQ_COARSE_STEP_MASK,
1790*eaa79794SWojciech Macek 				(0x1 << SERDES_IREG_FLD_RXEQ_COARSE_STEP_SHIFT));
1791*eaa79794SWojciech Macek 
1792*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1793*eaa79794SWojciech Macek 				obj,
1794*eaa79794SWojciech Macek 				AL_SRDS_REG_PAGE_4_COMMON,
1795*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1796*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXEQ_COARSE_ITER_NUM_REG_NUM,
1797*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXEQ_COARSE_ITER_NUM_MASK,
1798*eaa79794SWojciech Macek 				(0x1 << SERDES_IREG_FLD_RXEQ_COARSE_ITER_NUM_SHIFT));
1799*eaa79794SWojciech Macek 
1800*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1801*eaa79794SWojciech Macek 				obj,
1802*eaa79794SWojciech Macek 				AL_SRDS_REG_PAGE_4_COMMON,
1803*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1804*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXEQ_FINE_RUN1_MASK_REG_NUM,
1805*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXEQ_FINE_RUN1_MASK_MASK,
1806*eaa79794SWojciech Macek 				(0xf0 << SERDES_IREG_FLD_RXEQ_FINE_RUN1_MASK_SHIFT));
1807*eaa79794SWojciech Macek 
1808*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1809*eaa79794SWojciech Macek 				obj,
1810*eaa79794SWojciech Macek 				AL_SRDS_REG_PAGE_4_COMMON,
1811*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1812*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXEQ_FINE_RUN2_MASK_REG_NUM,
1813*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXEQ_FINE_RUN2_MASK_MASK,
1814*eaa79794SWojciech Macek 				(0 << SERDES_IREG_FLD_RXEQ_FINE_RUN2_MASK_SHIFT));
1815*eaa79794SWojciech Macek 
1816*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1817*eaa79794SWojciech Macek 				obj,
1818*eaa79794SWojciech Macek 				AL_SRDS_REG_PAGE_4_COMMON,
1819*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1820*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXEQ_FINE_STEP_REG_NUM,
1821*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXEQ_FINE_STEP_MASK,
1822*eaa79794SWojciech Macek 				(1 << SERDES_IREG_FLD_RXEQ_FINE_STEP_SHIFT));
1823*eaa79794SWojciech Macek 
1824*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1825*eaa79794SWojciech Macek 				obj,
1826*eaa79794SWojciech Macek 				AL_SRDS_REG_PAGE_4_COMMON,
1827*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1828*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXEQ_FINE_ITER_NUM_REG_NUM,
1829*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXEQ_FINE_ITER_NUM_MASK,
1830*eaa79794SWojciech Macek 				(0x8 << SERDES_IREG_FLD_RXEQ_FINE_ITER_NUM_SHIFT));
1831*eaa79794SWojciech Macek 
1832*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1833*eaa79794SWojciech Macek 				obj,
1834*eaa79794SWojciech Macek 				AL_SRDS_REG_PAGE_4_COMMON,
1835*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1836*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSM_BERTHRESHOLD1_REG_NUM,
1837*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSM_BERTHRESHOLD1_MASK,
1838*eaa79794SWojciech Macek 				(0 << SERDES_IREG_FLD_RXCALEYEDIAGFSM_BERTHRESHOLD1_SHIFT));
1839*eaa79794SWojciech Macek 
1840*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1841*eaa79794SWojciech Macek 				obj,
1842*eaa79794SWojciech Macek 				AL_SRDS_REG_PAGE_4_COMMON,
1843*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1844*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSM_BERTHRESHOLD2_REG_NUM,
1845*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSM_BERTHRESHOLD2_MASK,
1846*eaa79794SWojciech Macek 				(0x64 << SERDES_IREG_FLD_RXCALEYEDIAGFSM_BERTHRESHOLD2_SHIFT));
1847*eaa79794SWojciech Macek 
1848*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1849*eaa79794SWojciech Macek 				obj,
1850*eaa79794SWojciech Macek 				AL_SRDS_REG_PAGE_4_COMMON,
1851*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1852*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSM_XVALCOARSE_REG_NUM,
1853*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSM_XVALCOARSE_MASK,
1854*eaa79794SWojciech Macek 				(0x3 << SERDES_IREG_FLD_RXCALEYEDIAGFSM_XVALCOARSE_SHIFT));
1855*eaa79794SWojciech Macek 
1856*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1857*eaa79794SWojciech Macek 				obj,
1858*eaa79794SWojciech Macek 				AL_SRDS_REG_PAGE_4_COMMON,
1859*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1860*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSM_XVALFINE_REG_NUM,
1861*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSM_XVALFINE_MASK,
1862*eaa79794SWojciech Macek 				(0x1 << SERDES_IREG_FLD_RXCALEYEDIAGFSM_XVALFINE_SHIFT));
1863*eaa79794SWojciech Macek 
1864*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1865*eaa79794SWojciech Macek 				obj,
1866*eaa79794SWojciech Macek 				AL_SRDS_REG_PAGE_4_COMMON,
1867*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1868*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSM_YVALCOARSE_REG_NUM,
1869*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSM_YVALCOARSE_MASK,
1870*eaa79794SWojciech Macek 				(3 << SERDES_IREG_FLD_RXCALEYEDIAGFSM_YVALCOARSE_SHIFT));
1871*eaa79794SWojciech Macek 
1872*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1873*eaa79794SWojciech Macek 				obj,
1874*eaa79794SWojciech Macek 				AL_SRDS_REG_PAGE_4_COMMON,
1875*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1876*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSM_YVALFINE_REG_NUM,
1877*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSM_YVALFINE_MASK,
1878*eaa79794SWojciech Macek 				(1 << SERDES_IREG_FLD_RXCALEYEDIAGFSM_YVALFINE_SHIFT));
1879*eaa79794SWojciech Macek 
1880*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1881*eaa79794SWojciech Macek 				obj,
1882*eaa79794SWojciech Macek 				AL_SRDS_REG_PAGE_4_COMMON,
1883*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1884*eaa79794SWojciech Macek 				SERDES_IREG_FLD_EYE_DIAG_SAMPLE_CNT_MSB_REG_NUM,
1885*eaa79794SWojciech Macek 				SERDES_IREG_FLD_EYE_DIAG_SAMPLE_CNT_MSB_MASK,
1886*eaa79794SWojciech Macek 				(0xc << SERDES_IREG_FLD_EYE_DIAG_SAMPLE_CNT_MSB_SHIFT));
1887*eaa79794SWojciech Macek 
1888*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(
1889*eaa79794SWojciech Macek 				obj,
1890*eaa79794SWojciech Macek 				AL_SRDS_REG_PAGE_4_COMMON,
1891*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1892*eaa79794SWojciech Macek 				SERDES_IREG_FLD_EYE_DIAG_SAMPLE_CNT_LSB_REG_NUM,
1893*eaa79794SWojciech Macek 				SERDES_IREG_FLD_EYE_DIAG_SAMPLE_CNT_LSB_MASK,
1894*eaa79794SWojciech Macek 				(0xcc << SERDES_IREG_FLD_EYE_DIAG_SAMPLE_CNT_LSB_SHIFT));
1895*eaa79794SWojciech Macek }
1896*eaa79794SWojciech Macek 
1897*eaa79794SWojciech Macek struct al_serdes_mode_rx_tx_inv_state {
1898*eaa79794SWojciech Macek 	al_bool		restore;
1899*eaa79794SWojciech Macek 	uint32_t	pipe_rst;
1900*eaa79794SWojciech Macek 	uint32_t	ipd_multi[AL_SRDS_NUM_LANES];
1901*eaa79794SWojciech Macek 	uint8_t		inv_value[AL_SRDS_NUM_LANES];
1902*eaa79794SWojciech Macek };
1903*eaa79794SWojciech Macek 
al_serdes_mode_rx_tx_inv_state_save(struct al_serdes_grp_obj * obj,struct al_serdes_mode_rx_tx_inv_state * state)1904*eaa79794SWojciech Macek static void al_serdes_mode_rx_tx_inv_state_save(
1905*eaa79794SWojciech Macek 	struct al_serdes_grp_obj		*obj,
1906*eaa79794SWojciech Macek 	struct al_serdes_mode_rx_tx_inv_state	*state)
1907*eaa79794SWojciech Macek {
1908*eaa79794SWojciech Macek 	struct al_serdes_regs __iomem	*regs_base = obj->regs_base;
1909*eaa79794SWojciech Macek 
1910*eaa79794SWojciech Macek 	if (al_reg_read32(&regs_base->gen.irst) & SERDES_GEN_IRST_POR_B_A) {
1911*eaa79794SWojciech Macek 		int i;
1912*eaa79794SWojciech Macek 
1913*eaa79794SWojciech Macek 		state->restore = AL_TRUE;
1914*eaa79794SWojciech Macek 		state->pipe_rst = al_reg_read32(&regs_base->gen.irst);
1915*eaa79794SWojciech Macek 
1916*eaa79794SWojciech Macek 		for (i = 0; i < AL_SRDS_NUM_LANES; i++) {
1917*eaa79794SWojciech Macek 			state->inv_value[i] = al_serdes_grp_reg_read(
1918*eaa79794SWojciech Macek 				obj,
1919*eaa79794SWojciech Macek 				i,
1920*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1921*eaa79794SWojciech Macek 				SERDES_IREG_FLD_POLARITY_RX_REG_NUM);
1922*eaa79794SWojciech Macek 			state->ipd_multi[i] =
1923*eaa79794SWojciech Macek 				al_reg_read32(&regs_base->lane[i].ipd_multi);
1924*eaa79794SWojciech Macek 		}
1925*eaa79794SWojciech Macek 	} else {
1926*eaa79794SWojciech Macek 		state->restore = AL_FALSE;
1927*eaa79794SWojciech Macek 	}
1928*eaa79794SWojciech Macek }
1929*eaa79794SWojciech Macek 
al_serdes_mode_rx_tx_inv_state_restore(struct al_serdes_grp_obj * obj,struct al_serdes_mode_rx_tx_inv_state * state)1930*eaa79794SWojciech Macek static void al_serdes_mode_rx_tx_inv_state_restore(
1931*eaa79794SWojciech Macek 	struct al_serdes_grp_obj		*obj,
1932*eaa79794SWojciech Macek 	struct al_serdes_mode_rx_tx_inv_state	*state)
1933*eaa79794SWojciech Macek {
1934*eaa79794SWojciech Macek 	struct al_serdes_regs __iomem	*regs_base = obj->regs_base;
1935*eaa79794SWojciech Macek 
1936*eaa79794SWojciech Macek 	if (state->restore) {
1937*eaa79794SWojciech Macek 		int i;
1938*eaa79794SWojciech Macek 
1939*eaa79794SWojciech Macek 		for (i = 0; i < AL_SRDS_NUM_LANES; i++) {
1940*eaa79794SWojciech Macek 			al_serdes_grp_reg_write(
1941*eaa79794SWojciech Macek 				obj,
1942*eaa79794SWojciech Macek 				i,
1943*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
1944*eaa79794SWojciech Macek 				SERDES_IREG_FLD_POLARITY_RX_REG_NUM,
1945*eaa79794SWojciech Macek 				state->inv_value[i]);
1946*eaa79794SWojciech Macek 			al_reg_write32(
1947*eaa79794SWojciech Macek 				&regs_base->lane[i].ipd_multi, state->ipd_multi[i]);
1948*eaa79794SWojciech Macek 			al_reg_write32_masked(
1949*eaa79794SWojciech Macek 				&regs_base->gen.irst,
1950*eaa79794SWojciech Macek 				(SERDES_GEN_IRST_PIPE_RST_L0_B_A_SEL >> i) |
1951*eaa79794SWojciech Macek 				(SERDES_GEN_IRST_PIPE_RST_L0_B_A >> i),
1952*eaa79794SWojciech Macek 				state->pipe_rst);
1953*eaa79794SWojciech Macek 		}
1954*eaa79794SWojciech Macek 	}
1955*eaa79794SWojciech Macek }
1956*eaa79794SWojciech Macek 
al_serdes_mode_set_sgmii(struct al_serdes_grp_obj * obj)1957*eaa79794SWojciech Macek static void al_serdes_mode_set_sgmii(
1958*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj)
1959*eaa79794SWojciech Macek {
1960*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*grp_obj = obj;
1961*eaa79794SWojciech Macek 	struct al_serdes_regs __iomem	*regs_base = grp_obj->regs_base;
1962*eaa79794SWojciech Macek 	struct al_serdes_mode_rx_tx_inv_state rx_tx_inv_state;
1963*eaa79794SWojciech Macek 
1964*eaa79794SWojciech Macek 	al_assert(obj);
1965*eaa79794SWojciech Macek 
1966*eaa79794SWojciech Macek 	al_serdes_mode_rx_tx_inv_state_save(grp_obj, &rx_tx_inv_state);
1967*eaa79794SWojciech Macek 
1968*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->gen.irst, 0x000000);
1969*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->lane[0].ictl_multi, 0x10110010);
1970*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->lane[1].ictl_multi, 0x10110010);
1971*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->lane[2].ictl_multi, 0x10110010);
1972*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->lane[3].ictl_multi, 0x10110010);
1973*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->gen.ipd_multi_synth , 0x0001);
1974*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->lane[0].ipd_multi, 0x0003);
1975*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->lane[1].ipd_multi, 0x0003);
1976*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->lane[2].ipd_multi, 0x0003);
1977*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->lane[3].ipd_multi, 0x0003);
1978*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->gen.ictl_pcs , 0);
1979*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->gen.irst, 0x001000);
1980*eaa79794SWojciech Macek 	al_serdes_ns_delay(800);
1981*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->gen.irst, 0x000000);
1982*eaa79794SWojciech Macek 	al_serdes_ns_delay(500);
1983*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->gen.irst, 0x001000);
1984*eaa79794SWojciech Macek 	al_serdes_ns_delay(500);
1985*eaa79794SWojciech Macek 
1986*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
1987*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 101, 183);
1988*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
1989*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 102, 183);
1990*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
1991*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 103, 12);
1992*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
1993*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 104, 12);
1994*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
1995*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 105, 26);
1996*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
1997*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 106, 26);
1998*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
1999*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 107, 2);
2000*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
2001*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 108, 2);
2002*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
2003*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 109, 17);
2004*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
2005*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 110, 13);
2006*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2007*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 101, 153);
2008*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2009*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 102, 0);
2010*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2011*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 103, 108);
2012*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2013*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 104, 183);
2014*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2015*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 105, 183);
2016*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2017*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 106, 12);
2018*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2019*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 107, 12);
2020*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2021*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 108, 26);
2022*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2023*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 109, 26);
2024*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2025*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 110, 7);
2026*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2027*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 111, 12);
2028*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2029*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 112, 8);
2030*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2031*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 113, 0);
2032*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2033*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 114, 8);
2034*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2035*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 115, 0);
2036*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2037*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 116, 255);
2038*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2039*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 117, 179);
2040*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2041*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 118, 246);
2042*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2043*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 119, 208);
2044*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2045*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 120, 239);
2046*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2047*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 121, 251);
2048*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2049*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 122, 255);
2050*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2051*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 123, 255);
2052*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2053*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 124, 255);
2054*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2055*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 125, 255);
2056*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2057*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 126, 255);
2058*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2059*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 127, 211);
2060*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2061*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 128, 211);
2062*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2063*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 129, 226);
2064*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2065*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 130, 239);
2066*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2067*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 131, 251);
2068*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2069*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 132, 251);
2070*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2071*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 133, 255);
2072*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2073*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 134, 239);
2074*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2075*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 135, 255);
2076*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2077*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 136, 255);
2078*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2079*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 137, 211);
2080*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2081*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 138, 211);
2082*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2083*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 139, 226);
2084*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2085*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 140, 239);
2086*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2087*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 141, 251);
2088*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2089*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 142, 251);
2090*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2091*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 143, 255);
2092*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2093*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 144, 239);
2094*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2095*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 145, 255);
2096*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2097*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 146, 255);
2098*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2099*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 147, 251);
2100*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2101*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 148, 255);
2102*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2103*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 149, 63);
2104*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2105*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 150, 0);
2106*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2107*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 151, 100);
2108*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2109*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 152, 0);
2110*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2111*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 153, 4);
2112*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2113*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 154, 2);
2114*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2115*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 155, 5);
2116*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2117*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 156, 5);
2118*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2119*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 157, 4);
2120*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2121*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 158, 0);
2122*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2123*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 159, 0);
2124*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2125*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 160, 8);
2126*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2127*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 161, 4);
2128*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2129*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 162, 0);
2130*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2131*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 163, 0);
2132*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2133*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 164, 4);
2134*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0_LANE_0,
2135*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 7, 0);
2136*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_1_LANE_1,
2137*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 7, 0);
2138*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_2_LANE_2,
2139*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 7, 0);
2140*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_3_LANE_3,
2141*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 7, 0);
2142*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2143*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 13, 16);
2144*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2145*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 48, 0);
2146*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2147*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 49, 0);
2148*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2149*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 54, 0);
2150*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2151*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 55, 180);
2152*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2153*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 93, 2);
2154*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2155*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 165, 3);
2156*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
2157*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 41, 6);
2158*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2159*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 354, 3);
2160*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2161*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 355, 58);
2162*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2163*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 356, 9);
2164*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2165*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 357, 3);
2166*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2167*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 358, 62);
2168*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2169*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 359, 12);
2170*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
2171*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 701, 0);
2172*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
2173*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 87, 0x1f);
2174*eaa79794SWojciech Macek 
2175*eaa79794SWojciech Macek 	al_serdes_common_cfg_eth(obj);
2176*eaa79794SWojciech Macek 
2177*eaa79794SWojciech Macek 	al_serdes_mode_rx_tx_inv_state_restore(grp_obj, &rx_tx_inv_state);
2178*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->gen.irst, 0x0011F0);
2179*eaa79794SWojciech Macek 
2180*eaa79794SWojciech Macek 	al_serdes_ns_delay(500);
2181*eaa79794SWojciech Macek }
2182*eaa79794SWojciech Macek 
al_serdes_mode_set_kr(struct al_serdes_grp_obj * obj)2183*eaa79794SWojciech Macek static void al_serdes_mode_set_kr(
2184*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj)
2185*eaa79794SWojciech Macek {
2186*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*grp_obj = obj;
2187*eaa79794SWojciech Macek 	struct al_serdes_regs __iomem	*regs_base = grp_obj->regs_base;
2188*eaa79794SWojciech Macek 	struct al_serdes_mode_rx_tx_inv_state rx_tx_inv_state;
2189*eaa79794SWojciech Macek 
2190*eaa79794SWojciech Macek 	al_assert(obj);
2191*eaa79794SWojciech Macek 	al_serdes_mode_rx_tx_inv_state_save(grp_obj, &rx_tx_inv_state);
2192*eaa79794SWojciech Macek 
2193*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->gen.irst, 0x000000);
2194*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->lane[0].ictl_multi, 0x30330030);
2195*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->lane[1].ictl_multi, 0x30330030);
2196*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->lane[2].ictl_multi, 0x30330030);
2197*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->lane[3].ictl_multi, 0x30330030);
2198*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->gen.ipd_multi_synth , 0x0001);
2199*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->lane[0].ipd_multi, 0x0003);
2200*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->lane[1].ipd_multi, 0x0003);
2201*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->lane[2].ipd_multi, 0x0003);
2202*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->lane[3].ipd_multi, 0x0003);
2203*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->gen.ictl_pcs , 0);
2204*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->gen.irst, 0x001000);
2205*eaa79794SWojciech Macek 	al_serdes_ns_delay(800);
2206*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->gen.irst, 0x000000);
2207*eaa79794SWojciech Macek 	al_serdes_ns_delay(500);
2208*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->gen.irst, 0x001000);
2209*eaa79794SWojciech Macek 	al_serdes_ns_delay(500);
2210*eaa79794SWojciech Macek 
2211*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
2212*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 101, 189);
2213*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
2214*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 102, 189);
2215*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
2216*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 103, 6);
2217*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
2218*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 104, 6);
2219*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
2220*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 105, 27);
2221*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
2222*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 106, 27);
2223*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
2224*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 107, 1);
2225*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
2226*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 108, 1);
2227*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
2228*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 109, 119);
2229*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
2230*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 110, 5);
2231*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2232*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 101, 170);
2233*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2234*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 102, 0);
2235*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2236*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 103, 108);
2237*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2238*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 104, 189);
2239*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2240*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 105, 189);
2241*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2242*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 106, 6);
2243*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2244*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 107, 6);
2245*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2246*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 108, 27);
2247*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2248*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 109, 27);
2249*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2250*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 110, 7);
2251*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2252*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 111, 12);
2253*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2254*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 112, 16);
2255*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2256*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 113, 0);
2257*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2258*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 114, 16);
2259*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2260*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 115, 0);
2261*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2262*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 116, 255);
2263*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2264*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 117, 179);
2265*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2266*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 118, 246);
2267*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2268*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 119, 208);
2269*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2270*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 120, 239);
2271*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2272*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 121, 251);
2273*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2274*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 122, 255);
2275*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2276*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 123, 255);
2277*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2278*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 124, 255);
2279*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2280*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 125, 255);
2281*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2282*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 126, 255);
2283*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2284*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 127, 211);
2285*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2286*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 128, 211);
2287*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2288*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 129, 226);
2289*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2290*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 130, 239);
2291*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2292*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 131, 251);
2293*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2294*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 132, 251);
2295*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2296*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 133, 255);
2297*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2298*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 134, 239);
2299*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2300*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 135, 255);
2301*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2302*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 136, 255);
2303*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2304*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 137, 211);
2305*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2306*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 138, 211);
2307*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2308*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 139, 226);
2309*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2310*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 140, 239);
2311*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2312*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 141, 251);
2313*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2314*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 142, 251);
2315*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2316*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 143, 255);
2317*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2318*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 144, 239);
2319*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2320*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 145, 255);
2321*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2322*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 146, 255);
2323*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2324*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 147, 251);
2325*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2326*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 148, 255);
2327*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2328*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 149, 63);
2329*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2330*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 150, 0);
2331*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2332*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 151, 50);
2333*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2334*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 152, 17);
2335*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2336*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 153, 2);
2337*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2338*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 154, 1);
2339*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2340*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 155, 0);
2341*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2342*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 156, 0);
2343*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2344*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 157, 4);
2345*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2346*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 158, 0);
2347*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2348*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 159, 0);
2349*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2350*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 160, 8);
2351*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2352*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 161, 4);
2353*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2354*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 162, 0);
2355*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2356*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 163, 0);
2357*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2358*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 164, 4);
2359*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0_LANE_0,
2360*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 7, 0);
2361*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_1_LANE_1,
2362*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 7, 0);
2363*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_2_LANE_2,
2364*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 7, 0);
2365*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_3_LANE_3,
2366*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 7, 0);
2367*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2368*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 13, 16);
2369*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2370*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 48, 0);
2371*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2372*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 49, 0);
2373*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2374*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 54, 0);
2375*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2376*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 55, 149); /*Was 182*/
2377*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2378*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 93, 2);
2379*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2380*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 165, 3);
2381*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
2382*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 41, 6);
2383*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2384*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 354, 3);
2385*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2386*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 355, 58);
2387*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2388*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 356, 9);
2389*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2390*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 357, 3);
2391*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2392*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 358, 62);
2393*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2394*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 359, 12);
2395*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
2396*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 701, 0);
2397*eaa79794SWojciech Macek 	al_serdes_grp_reg_write(obj, AL_SRDS_REG_PAGE_0123_LANES_0123,
2398*eaa79794SWojciech Macek 		AL_SRDS_REG_TYPE_PMA, 87, 0x1f);
2399*eaa79794SWojciech Macek 
2400*eaa79794SWojciech Macek 	al_serdes_common_cfg_eth(obj);
2401*eaa79794SWojciech Macek 
2402*eaa79794SWojciech Macek 	al_serdes_mode_rx_tx_inv_state_restore(grp_obj, &rx_tx_inv_state);
2403*eaa79794SWojciech Macek 
2404*eaa79794SWojciech Macek 	al_reg_write32(&regs_base->gen.irst, 0x0011F0);
2405*eaa79794SWojciech Macek 	al_serdes_ns_delay(500);
2406*eaa79794SWojciech Macek }
2407*eaa79794SWojciech Macek 
al_serdes_rx_advanced_params_get(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane,void * rx_params)2408*eaa79794SWojciech Macek static void al_serdes_rx_advanced_params_get(struct al_serdes_grp_obj	*obj,
2409*eaa79794SWojciech Macek 				      enum al_serdes_lane		lane,
2410*eaa79794SWojciech Macek 				      void				*rx_params)
2411*eaa79794SWojciech Macek {
2412*eaa79794SWojciech Macek 	struct al_serdes_adv_rx_params	*params = rx_params;
2413*eaa79794SWojciech Macek 	uint8_t temp_val;
2414*eaa79794SWojciech Macek 
2415*eaa79794SWojciech Macek 	al_serdes_reg_read(
2416*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2417*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2418*eaa79794SWojciech Macek 			SERDES_IREG_RX_CALEQ_1_REG_NUM,
2419*eaa79794SWojciech Macek 			&temp_val);
2420*eaa79794SWojciech Macek 	params->dcgain = (temp_val & SERDES_IREG_RX_CALEQ_1_DCGAIN_MASK) >>
2421*eaa79794SWojciech Macek 				SERDES_IREG_RX_CALEQ_1_DCGAIN_SHIFT;
2422*eaa79794SWojciech Macek 	params->dfe_3db_freq = (temp_val &
2423*eaa79794SWojciech Macek 				SERDES_IREG_RX_CALEQ_1_DFEPSTAP3DB_MASK) >>
2424*eaa79794SWojciech Macek 				SERDES_IREG_RX_CALEQ_1_DFEPSTAP3DB_SHIFT;
2425*eaa79794SWojciech Macek 
2426*eaa79794SWojciech Macek 	al_serdes_reg_read(
2427*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2428*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2429*eaa79794SWojciech Macek 			SERDES_IREG_RX_CALEQ_2_REG_NUM,
2430*eaa79794SWojciech Macek 			&temp_val);
2431*eaa79794SWojciech Macek 	params->dfe_gain = (temp_val &
2432*eaa79794SWojciech Macek 				SERDES_IREG_RX_CALEQ_2_DFEPSTAPGAIN_MASK) >>
2433*eaa79794SWojciech Macek 				SERDES_IREG_RX_CALEQ_2_DFEPSTAPGAIN_SHIFT;
2434*eaa79794SWojciech Macek 	params->dfe_first_tap_ctrl = (temp_val &
2435*eaa79794SWojciech Macek 			SERDES_IREG_RX_CALEQ_2_DFETAP1GAIN_MASK) >>
2436*eaa79794SWojciech Macek 			SERDES_IREG_RX_CALEQ_2_DFETAP1GAIN_SHIFT;
2437*eaa79794SWojciech Macek 
2438*eaa79794SWojciech Macek 	al_serdes_reg_read(
2439*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2440*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2441*eaa79794SWojciech Macek 			SERDES_IREG_RX_CALEQ_3_REG_NUM,
2442*eaa79794SWojciech Macek 			&temp_val);
2443*eaa79794SWojciech Macek 	params->dfe_secound_tap_ctrl = (temp_val &
2444*eaa79794SWojciech Macek 			SERDES_IREG_RX_CALEQ_3_DFETAP2GAIN_MASK) >>
2445*eaa79794SWojciech Macek 			SERDES_IREG_RX_CALEQ_3_DFETAP2GAIN_SHIFT;
2446*eaa79794SWojciech Macek 	params->dfe_third_tap_ctrl = (temp_val &
2447*eaa79794SWojciech Macek 			SERDES_IREG_RX_CALEQ_3_DFETAP3GAIN_MASK) >>
2448*eaa79794SWojciech Macek 			SERDES_IREG_RX_CALEQ_3_DFETAP3GAIN_SHIFT;
2449*eaa79794SWojciech Macek 
2450*eaa79794SWojciech Macek 	al_serdes_reg_read(
2451*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2452*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2453*eaa79794SWojciech Macek 			SERDES_IREG_RX_CALEQ_4_REG_NUM,
2454*eaa79794SWojciech Macek 			&temp_val);
2455*eaa79794SWojciech Macek 	params->dfe_fourth_tap_ctrl = (temp_val &
2456*eaa79794SWojciech Macek 			SERDES_IREG_RX_CALEQ_4_DFETAP4GAIN_MASK) >>
2457*eaa79794SWojciech Macek 			SERDES_IREG_RX_CALEQ_4_DFETAP4GAIN_SHIFT;
2458*eaa79794SWojciech Macek 	params->low_freq_agc_gain = (temp_val &
2459*eaa79794SWojciech Macek 			SERDES_IREG_RX_CALEQ_4_LOFREQAGCGAIN_MASK) >>
2460*eaa79794SWojciech Macek 			SERDES_IREG_RX_CALEQ_4_LOFREQAGCGAIN_SHIFT;
2461*eaa79794SWojciech Macek 
2462*eaa79794SWojciech Macek 	al_serdes_reg_read(
2463*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2464*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2465*eaa79794SWojciech Macek 			SERDES_IREG_RX_CALEQ_5_REG_NUM,
2466*eaa79794SWojciech Macek 			&temp_val);
2467*eaa79794SWojciech Macek 	params->precal_code_sel = (temp_val &
2468*eaa79794SWojciech Macek 			SERDES_IREG_RX_CALEQ_5_PRECAL_CODE_SEL_MASK) >>
2469*eaa79794SWojciech Macek 			SERDES_IREG_RX_CALEQ_5_PRECAL_CODE_SEL_SHIFT;
2470*eaa79794SWojciech Macek 	params->high_freq_agc_boost = (temp_val &
2471*eaa79794SWojciech Macek 			SERDES_IREG_RX_CALEQ_5_HIFREQAGCCAP_MASK) >>
2472*eaa79794SWojciech Macek 			SERDES_IREG_RX_CALEQ_5_HIFREQAGCCAP_SHIFT;
2473*eaa79794SWojciech Macek 
2474*eaa79794SWojciech Macek 	al_serdes_reg_read(obj, (enum al_serdes_reg_page)lane,
2475*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2476*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RX_DRV_OVERRIDE_EN_REG_NUM,
2477*eaa79794SWojciech Macek 			&temp_val);
2478*eaa79794SWojciech Macek 	params->override = ((temp_val & SERDES_IREG_FLD_RX_DRV_OVERRIDE_EN) == 0);
2479*eaa79794SWojciech Macek }
2480*eaa79794SWojciech Macek 
2481*eaa79794SWojciech Macek #if (SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_LOCWREN_REG_NUM != \
2482*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMEYEMEASIN_LOCWREN_REG_NUM || \
2483*eaa79794SWojciech Macek 	SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_LOCWREN_REG_NUM != \
2484*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMXADJUST_LOCWREN_REG_NUM)
2485*eaa79794SWojciech Macek #error Wrong assumption
2486*eaa79794SWojciech Macek #endif
al_serdes_rx_equalization(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane)2487*eaa79794SWojciech Macek static int al_serdes_rx_equalization(
2488*eaa79794SWojciech Macek 		struct al_serdes_grp_obj	*obj,
2489*eaa79794SWojciech Macek 		enum al_serdes_lane		lane)
2490*eaa79794SWojciech Macek {
2491*eaa79794SWojciech Macek 	uint8_t serdes_ireg_fld_rxcalroamyadjust_locwren_val;
2492*eaa79794SWojciech Macek 	uint8_t serdes_ireg_fld_rxroam_xorbitsel_val;
2493*eaa79794SWojciech Macek 	uint8_t serdes_ireg_fld_pcsrxeq_locwren_val;
2494*eaa79794SWojciech Macek 	uint8_t serdes_ireg_fld_rxcal_locwren_val;
2495*eaa79794SWojciech Macek 	uint8_t temp_val;
2496*eaa79794SWojciech Macek 	uint8_t done;
2497*eaa79794SWojciech Macek 
2498*eaa79794SWojciech Macek 	int test_score;
2499*eaa79794SWojciech Macek 	int i;
2500*eaa79794SWojciech Macek 
2501*eaa79794SWojciech Macek 	/*
2502*eaa79794SWojciech Macek 	 * Make sure Roam Eye mechanism is not overridden
2503*eaa79794SWojciech Macek 	 * Lane SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_LOCWREN = 1,
2504*eaa79794SWojciech Macek 	 *	so Rx 4-Point Eye process is not overridden
2505*eaa79794SWojciech Macek 	 * Lane SERDES_IREG_FLD_RXCALROAMEYEMEASIN_LOCWREN = 1,
2506*eaa79794SWojciech Macek 	 *	so Eye Roam latch is not overridden
2507*eaa79794SWojciech Macek 	 * Lane SERDES_IREG_FLD_RXCALROAMXADJUST_LOCWREN = 1,
2508*eaa79794SWojciech Macek 	 *	so Eye Roam latch 'X adjust' is not overridden
2509*eaa79794SWojciech Macek 	 * Lane SERDES_IREG_FLD_RXCALROAMYADJUST_LOCWREN = 1,
2510*eaa79794SWojciech Macek 	 *	so Eye Roam latch 'Y adjust' is not overridden
2511*eaa79794SWojciech Macek 	 * Lane SERDES_IREG_FLD_RXROAM_XORBITSEL = 0/1,
2512*eaa79794SWojciech Macek 	 *	so Eye Roamlatch works on the right Eye position (XORBITSEL)
2513*eaa79794SWojciech Macek 	 *	For most cases 0 is needed, but sometimes 1 is needed.
2514*eaa79794SWojciech Macek 	 *	I couldn't sort out why is this so the code uses a global
2515*eaa79794SWojciech Macek 	 *      XORBITSELmode variable, set by the user (GUI). Default is 0.
2516*eaa79794SWojciech Macek 	 * control must be internal. At the end we restore original setting
2517*eaa79794SWojciech Macek 	 */
2518*eaa79794SWojciech Macek 
2519*eaa79794SWojciech Macek 	/* save current values for restoring them later in the end */
2520*eaa79794SWojciech Macek 	al_serdes_reg_read(
2521*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2522*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2523*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCAL_LOCWREN_REG_NUM,
2524*eaa79794SWojciech Macek 			&serdes_ireg_fld_rxcal_locwren_val);
2525*eaa79794SWojciech Macek 
2526*eaa79794SWojciech Macek 	al_serdes_reg_read(
2527*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2528*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2529*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALROAMYADJUST_LOCWREN_REG_NUM,
2530*eaa79794SWojciech Macek 			&serdes_ireg_fld_rxcalroamyadjust_locwren_val);
2531*eaa79794SWojciech Macek 	al_serdes_reg_read(
2532*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2533*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2534*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXROAM_XORBITSEL_REG_NUM,
2535*eaa79794SWojciech Macek 			&serdes_ireg_fld_rxroam_xorbitsel_val);
2536*eaa79794SWojciech Macek 	al_serdes_reg_read(
2537*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2538*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2539*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSRXEQ_LOCWREN_REG_NUM,
2540*eaa79794SWojciech Macek 			&serdes_ireg_fld_pcsrxeq_locwren_val);
2541*eaa79794SWojciech Macek 
2542*eaa79794SWojciech Macek 	/*
2543*eaa79794SWojciech Macek 	 * Set Bits:
2544*eaa79794SWojciech Macek 	 * SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_LOCWREN
2545*eaa79794SWojciech Macek 	 * SERDES_IREG_FLD_RXCALROAMEYEMEASIN_LOCWREN
2546*eaa79794SWojciech Macek 	 * SERDES_IREG_FLD_RXCALROAMXADJUST_LOCWREN
2547*eaa79794SWojciech Macek 	 * to return 4pt-RxEye and EyeRoam Latch to internal logic
2548*eaa79794SWojciech Macek 	 *
2549*eaa79794SWojciech Macek 	 * clear bit SERDES_IREG_FLD_RX_DRV_OVERRIDE_EN
2550*eaa79794SWojciech Macek 	 * AGC/DFE controlled via PMA registers
2551*eaa79794SWojciech Macek 	 */
2552*eaa79794SWojciech Macek 	temp_val  = serdes_ireg_fld_rxcal_locwren_val;
2553*eaa79794SWojciech Macek 	temp_val |= SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_LOCWREN;
2554*eaa79794SWojciech Macek 	temp_val |= SERDES_IREG_FLD_RXCALROAMEYEMEASIN_LOCWREN;
2555*eaa79794SWojciech Macek 	temp_val |= SERDES_IREG_FLD_RXCALROAMXADJUST_LOCWREN;
2556*eaa79794SWojciech Macek 	temp_val |= SERDES_IREG_FLD_RX_DRV_OVERRIDE_EN;
2557*eaa79794SWojciech Macek 
2558*eaa79794SWojciech Macek 	al_serdes_reg_write(
2559*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2560*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2561*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCAL_LOCWREN_REG_NUM,
2562*eaa79794SWojciech Macek 			temp_val);
2563*eaa79794SWojciech Macek 
2564*eaa79794SWojciech Macek 	/*
2565*eaa79794SWojciech Macek 	 * Set bit SERDES_IREG_FLD_RXCALROAMYADJUST_LOCWREN
2566*eaa79794SWojciech Macek 	 * to return EyeRoam Latch Y to internal logic
2567*eaa79794SWojciech Macek 	 */
2568*eaa79794SWojciech Macek 	temp_val = serdes_ireg_fld_rxcalroamyadjust_locwren_val |
2569*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALROAMYADJUST_LOCWREN;
2570*eaa79794SWojciech Macek 	al_serdes_reg_write(
2571*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2572*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2573*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALROAMYADJUST_LOCWREN_REG_NUM,
2574*eaa79794SWojciech Macek 			temp_val);
2575*eaa79794SWojciech Macek 
2576*eaa79794SWojciech Macek 	/*
2577*eaa79794SWojciech Macek 	 * Clear Bit: SERDES_IREG_FLD_RXROAM_XORBITSEL
2578*eaa79794SWojciech Macek 	 * so XORBITSEL=0, needed for the Eye mapping.
2579*eaa79794SWojciech Macek 	 */
2580*eaa79794SWojciech Macek 	temp_val = serdes_ireg_fld_rxroam_xorbitsel_val &
2581*eaa79794SWojciech Macek 			~SERDES_IREG_FLD_RXROAM_XORBITSEL;
2582*eaa79794SWojciech Macek 	al_serdes_reg_write(
2583*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2584*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2585*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXROAM_XORBITSEL_REG_NUM,
2586*eaa79794SWojciech Macek 			temp_val);
2587*eaa79794SWojciech Macek 
2588*eaa79794SWojciech Macek 	/*
2589*eaa79794SWojciech Macek 	 * Take Control from int.pin over RxEQ process.
2590*eaa79794SWojciech Macek 	 * Clear Bit SERDES_IREG_FLD_PCSRXEQ_LOCWREN
2591*eaa79794SWojciech Macek 	 * to override RxEQ via PMA
2592*eaa79794SWojciech Macek 	 */
2593*eaa79794SWojciech Macek 	temp_val = serdes_ireg_fld_pcsrxeq_locwren_val &
2594*eaa79794SWojciech Macek 			~SERDES_IREG_FLD_PCSRXEQ_LOCWREN;
2595*eaa79794SWojciech Macek 	al_serdes_reg_write(
2596*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2597*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2598*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSRXEQ_LOCWREN_REG_NUM,
2599*eaa79794SWojciech Macek 			temp_val);
2600*eaa79794SWojciech Macek 
2601*eaa79794SWojciech Macek 
2602*eaa79794SWojciech Macek 	/*
2603*eaa79794SWojciech Macek 	 * Start/Stop RxEQ Cal is via PCSRXEQ_START: 1=START. 0=STOP.
2604*eaa79794SWojciech Macek 	 * Clear Bit SERDES_IREG_FLD_PCSRXEQ_START
2605*eaa79794SWojciech Macek 	 * to start fresh from Stop
2606*eaa79794SWojciech Macek 	 */
2607*eaa79794SWojciech Macek 	al_serdes_reg_read(
2608*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2609*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2610*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSRXEQ_START_REG_NUM,
2611*eaa79794SWojciech Macek 			&temp_val);
2612*eaa79794SWojciech Macek 	temp_val &= ~SERDES_IREG_FLD_PCSRXEQ_START;
2613*eaa79794SWojciech Macek 	al_serdes_reg_write(
2614*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2615*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2616*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSRXEQ_START_REG_NUM,
2617*eaa79794SWojciech Macek 			temp_val);
2618*eaa79794SWojciech Macek 
2619*eaa79794SWojciech Macek 	/* Set Bit SERDES_IREG_FLD_PCSRXEQ_START
2620*eaa79794SWojciech Macek 	 * to begin Rx Eq Cal */
2621*eaa79794SWojciech Macek 	temp_val |= SERDES_IREG_FLD_PCSRXEQ_START;
2622*eaa79794SWojciech Macek 	al_serdes_reg_write(
2623*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2624*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2625*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSRXEQ_START_REG_NUM,
2626*eaa79794SWojciech Macek 			temp_val);
2627*eaa79794SWojciech Macek 
2628*eaa79794SWojciech Macek 	/* Poll on RxEq Cal completion. SERDES_IREG_FLD_RXEQ_DONE. 1=Done. */
2629*eaa79794SWojciech Macek 	for (i = 0; i < AL_SERDES_RX_EQUAL_TRIES; ++i) {
2630*eaa79794SWojciech Macek 		al_serdes_reg_read(
2631*eaa79794SWojciech Macek 				obj, (enum al_serdes_reg_page)lane,
2632*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
2633*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALROAMEYEMEASDONE_REG_NUM,
2634*eaa79794SWojciech Macek 				&done);
2635*eaa79794SWojciech Macek 		done &= SERDES_IREG_FLD_RXEQ_DONE;
2636*eaa79794SWojciech Macek 
2637*eaa79794SWojciech Macek 		/* Check if RxEQ Cal is done */
2638*eaa79794SWojciech Macek 		if (done)
2639*eaa79794SWojciech Macek 			break;
2640*eaa79794SWojciech Macek 		al_msleep(AL_SERDES_RX_EQUAL_MDELAY);
2641*eaa79794SWojciech Macek 	}
2642*eaa79794SWojciech Macek 
2643*eaa79794SWojciech Macek 	if (!done) {
2644*eaa79794SWojciech Macek 		al_err("%s: Timeout!\n", __func__);
2645*eaa79794SWojciech Macek 		return -1;
2646*eaa79794SWojciech Macek 	}
2647*eaa79794SWojciech Macek 
2648*eaa79794SWojciech Macek 	/* Stop the RxEQ process. */
2649*eaa79794SWojciech Macek 	temp_val &= ~SERDES_IREG_FLD_PCSRXEQ_START;
2650*eaa79794SWojciech Macek 	al_serdes_reg_write(
2651*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2652*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2653*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSRXEQ_START_REG_NUM,
2654*eaa79794SWojciech Macek 			temp_val);
2655*eaa79794SWojciech Macek 	/* Get score */
2656*eaa79794SWojciech Macek 	al_serdes_reg_read(
2657*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2658*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2659*eaa79794SWojciech Macek 			SERDES_IREG_RXEQ_BEST_EYE_MSB_VAL_REG_NUM,
2660*eaa79794SWojciech Macek 			&temp_val);
2661*eaa79794SWojciech Macek 	test_score = (int)((temp_val & 0xFF) << 6);
2662*eaa79794SWojciech Macek 	al_serdes_reg_read(
2663*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2664*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2665*eaa79794SWojciech Macek 			SERDES_IREG_RXEQ_BEST_EYE_LSB_VAL_REG_NUM,
2666*eaa79794SWojciech Macek 			&temp_val);
2667*eaa79794SWojciech Macek 	test_score += (int)(temp_val & SERDES_IREG_RXEQ_BEST_EYE_LSB_VAL_MASK);
2668*eaa79794SWojciech Macek 
2669*eaa79794SWojciech Macek 	/* Restore start values */
2670*eaa79794SWojciech Macek 	al_serdes_reg_write(
2671*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2672*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2673*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCAL_LOCWREN_REG_NUM,
2674*eaa79794SWojciech Macek 			serdes_ireg_fld_rxcal_locwren_val);
2675*eaa79794SWojciech Macek 	al_serdes_reg_write(
2676*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2677*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2678*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALROAMYADJUST_LOCWREN_REG_NUM,
2679*eaa79794SWojciech Macek 			serdes_ireg_fld_rxcalroamyadjust_locwren_val);
2680*eaa79794SWojciech Macek 	al_serdes_reg_write(
2681*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2682*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2683*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXROAM_XORBITSEL_REG_NUM,
2684*eaa79794SWojciech Macek 			serdes_ireg_fld_rxroam_xorbitsel_val);
2685*eaa79794SWojciech Macek 	al_serdes_reg_write(
2686*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2687*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2688*eaa79794SWojciech Macek 			SERDES_IREG_FLD_PCSRXEQ_LOCWREN_REG_NUM,
2689*eaa79794SWojciech Macek 			serdes_ireg_fld_pcsrxeq_locwren_val);
2690*eaa79794SWojciech Macek 
2691*eaa79794SWojciech Macek 	return test_score;
2692*eaa79794SWojciech Macek }
2693*eaa79794SWojciech Macek 
2694*eaa79794SWojciech Macek #if (SERDES_IREG_FLD_RXCAL_LOCWREN_REG_NUM != \
2695*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMEYEMEASIN_LOCWREN_REG_NUM || \
2696*eaa79794SWojciech Macek 	SERDES_IREG_FLD_RXCAL_LOCWREN_REG_NUM != \
2697*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALROAMXADJUST_LOCWREN_REG_NUM || \
2698*eaa79794SWojciech Macek 	SERDES_IREG_FLD_RXCAL_LOCWREN_REG_NUM != \
2699*eaa79794SWojciech Macek 		SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_LOCWREN_REG_NUM)
2700*eaa79794SWojciech Macek #error Wrong assumption
2701*eaa79794SWojciech Macek #endif
al_serdes_calc_eye_size(struct al_serdes_grp_obj * obj,enum al_serdes_lane lane,int * width,int * height)2702*eaa79794SWojciech Macek static int al_serdes_calc_eye_size(
2703*eaa79794SWojciech Macek 		struct al_serdes_grp_obj	*obj,
2704*eaa79794SWojciech Macek 		enum al_serdes_lane		lane,
2705*eaa79794SWojciech Macek 		int				*width,
2706*eaa79794SWojciech Macek 		int				*height)
2707*eaa79794SWojciech Macek {
2708*eaa79794SWojciech Macek 	uint8_t rxcaleyediagfsm_x_y_valweight_val;
2709*eaa79794SWojciech Macek 	uint8_t rxcaleyediagfsm_xvalcoarse_val;
2710*eaa79794SWojciech Macek 	uint8_t rxcaleyediagfsm_xvalfine_val;
2711*eaa79794SWojciech Macek 	uint8_t rxcaleyediagfsm_yvalcoarse_val;
2712*eaa79794SWojciech Macek 	uint8_t rxcaleyediagfsm_yvalfine_val;
2713*eaa79794SWojciech Macek 	uint8_t rxlock2ref_locwren_val;
2714*eaa79794SWojciech Macek 	uint8_t rxcal_locwren_val;
2715*eaa79794SWojciech Macek 	uint8_t rxcalroamyadjust_locwren_val;
2716*eaa79794SWojciech Macek 	uint8_t rxlock2ref_ovren_val;
2717*eaa79794SWojciech Macek 
2718*eaa79794SWojciech Macek 	int i;
2719*eaa79794SWojciech Macek 	uint8_t status;
2720*eaa79794SWojciech Macek 	uint8_t reg_value;
2721*eaa79794SWojciech Macek 
2722*eaa79794SWojciech Macek 	/* Save Registers */
2723*eaa79794SWojciech Macek 	al_serdes_reg_read(obj, (enum al_serdes_reg_page)lane,
2724*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2725*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXLOCK2REF_LOCWREN_REG_NUM,
2726*eaa79794SWojciech Macek 			&rxlock2ref_locwren_val);
2727*eaa79794SWojciech Macek 	al_serdes_reg_read(obj, (enum al_serdes_reg_page)lane,
2728*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2729*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCAL_LOCWREN_REG_NUM,
2730*eaa79794SWojciech Macek 			&rxcal_locwren_val);
2731*eaa79794SWojciech Macek 	al_serdes_reg_read(obj, (enum al_serdes_reg_page)lane,
2732*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2733*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALROAMYADJUST_LOCWREN_REG_NUM,
2734*eaa79794SWojciech Macek 			&rxcalroamyadjust_locwren_val);
2735*eaa79794SWojciech Macek 	al_serdes_reg_read(obj, (enum al_serdes_reg_page)lane,
2736*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2737*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXLOCK2REF_OVREN_REG_NUM,
2738*eaa79794SWojciech Macek 			&rxlock2ref_ovren_val);
2739*eaa79794SWojciech Macek 
2740*eaa79794SWojciech Macek 	al_serdes_reg_read(obj, AL_SRDS_REG_PAGE_4_COMMON,
2741*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2742*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_X_Y_VALWEIGHT_REG_NUM,
2743*eaa79794SWojciech Macek 			&rxcaleyediagfsm_x_y_valweight_val);
2744*eaa79794SWojciech Macek 	al_serdes_reg_read(obj, AL_SRDS_REG_PAGE_4_COMMON,
2745*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2746*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_XVALCOARSE_REG_NUM,
2747*eaa79794SWojciech Macek 			&rxcaleyediagfsm_xvalcoarse_val);
2748*eaa79794SWojciech Macek 	al_serdes_reg_read(obj, AL_SRDS_REG_PAGE_4_COMMON,
2749*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2750*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_XVALFINE_REG_NUM,
2751*eaa79794SWojciech Macek 			&rxcaleyediagfsm_xvalfine_val);
2752*eaa79794SWojciech Macek 	al_serdes_reg_read(obj, AL_SRDS_REG_PAGE_4_COMMON,
2753*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2754*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_YVALCOARSE_REG_NUM,
2755*eaa79794SWojciech Macek 			&rxcaleyediagfsm_yvalcoarse_val);
2756*eaa79794SWojciech Macek 	al_serdes_reg_read(obj, AL_SRDS_REG_PAGE_4_COMMON,
2757*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2758*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_YVALFINE_REG_NUM,
2759*eaa79794SWojciech Macek 			&rxcaleyediagfsm_yvalfine_val);
2760*eaa79794SWojciech Macek 
2761*eaa79794SWojciech Macek 	/*
2762*eaa79794SWojciech Macek 	 * Clear Bit:
2763*eaa79794SWojciech Macek 	 *	SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_LOCWREN
2764*eaa79794SWojciech Macek 	 *	to override RxEQ via PMA
2765*eaa79794SWojciech Macek 	 * Set Bits:
2766*eaa79794SWojciech Macek 	 *	SERDES_IREG_FLD_RXCALROAMEYEMEASIN_LOCWREN,
2767*eaa79794SWojciech Macek 	 *	SERDES_IREG_FLD_RXCALROAMXADJUST_LOCWREN
2768*eaa79794SWojciech Macek 	 *	to keep Eye Diag Roam controlled internally
2769*eaa79794SWojciech Macek 	 */
2770*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj,
2771*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)lane,
2772*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2773*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCAL_LOCWREN_REG_NUM,
2774*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_LOCWREN  |
2775*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALROAMEYEMEASIN_LOCWREN |
2776*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALROAMXADJUST_LOCWREN,
2777*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALROAMEYEMEASIN_LOCWREN |
2778*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALROAMXADJUST_LOCWREN);
2779*eaa79794SWojciech Macek 	/*
2780*eaa79794SWojciech Macek 	 * Set Bit:
2781*eaa79794SWojciech Macek 	 *	 SERDES_IREG_FLD_RXCALROAMYADJUST_LOCWREN
2782*eaa79794SWojciech Macek 	 *	 to keep Eye Diag Roam controlled internally
2783*eaa79794SWojciech Macek 	 */
2784*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj,
2785*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)lane,
2786*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2787*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALROAMYADJUST_LOCWREN_REG_NUM,
2788*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALROAMYADJUST_LOCWREN,
2789*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALROAMYADJUST_LOCWREN);
2790*eaa79794SWojciech Macek 
2791*eaa79794SWojciech Macek 	/*
2792*eaa79794SWojciech Macek 	 * Clear Bit:
2793*eaa79794SWojciech Macek 	 *	SERDES_IREG_FLD_RXROAM_XORBITSEL,
2794*eaa79794SWojciech Macek 	 *	so XORBITSEL=0, needed for the Eye mapping
2795*eaa79794SWojciech Macek 	 *  Set Bit:
2796*eaa79794SWojciech Macek 	 *  SERDES_IREG_FLD_RXLOCK2REF_OVREN,
2797*eaa79794SWojciech Macek 	 *  so RXLOCK2REF_OVREN=1, keeping lock to data, preventing data hit
2798*eaa79794SWojciech Macek 	 */
2799*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj,
2800*eaa79794SWojciech Macek 			(enum al_serdes_reg_page)lane,
2801*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2802*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXROAM_XORBITSEL_REG_NUM,
2803*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXLOCK2REF_OVREN |
2804*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXROAM_XORBITSEL,
2805*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXLOCK2REF_OVREN);
2806*eaa79794SWojciech Macek 
2807*eaa79794SWojciech Macek 
2808*eaa79794SWojciech Macek 	/*
2809*eaa79794SWojciech Macek 	 * Clear Bit:
2810*eaa79794SWojciech Macek 	 *	SERDES_IREG_FLD_RXLOCK2REF_LOCWREN,
2811*eaa79794SWojciech Macek 	 *	so RXLOCK2REF_LOCWREN=0, to override control
2812*eaa79794SWojciech Macek 	 */
2813*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj,
2814*eaa79794SWojciech Macek 				(enum al_serdes_reg_page)lane,
2815*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
2816*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXLOCK2REF_LOCWREN_REG_NUM,
2817*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXLOCK2REF_LOCWREN,
2818*eaa79794SWojciech Macek 				0);
2819*eaa79794SWojciech Macek 
2820*eaa79794SWojciech Macek 	/* Width Calculation */
2821*eaa79794SWojciech Macek 
2822*eaa79794SWojciech Macek 	/* Return Value = 0*Y + 1*X */
2823*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2824*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2825*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_X_Y_VALWEIGHT_REG_NUM,
2826*eaa79794SWojciech Macek 			0x01);
2827*eaa79794SWojciech Macek 	/* X coarse scan step = 3 */
2828*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2829*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2830*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_XVALCOARSE_REG_NUM,
2831*eaa79794SWojciech Macek 			0x03);
2832*eaa79794SWojciech Macek 	/* X fine scan step = 1   */
2833*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2834*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2835*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_XVALFINE_REG_NUM,
2836*eaa79794SWojciech Macek 			0x01);
2837*eaa79794SWojciech Macek 	/* Y coarse scan step = 0 */
2838*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2839*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2840*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_YVALCOARSE_REG_NUM,
2841*eaa79794SWojciech Macek 			0x00);
2842*eaa79794SWojciech Macek 	/* Y fine scan step = 0   */
2843*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2844*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2845*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_YVALFINE_REG_NUM,
2846*eaa79794SWojciech Macek 			0x00);
2847*eaa79794SWojciech Macek 
2848*eaa79794SWojciech Macek 	/*
2849*eaa79794SWojciech Macek 	 * Set Bit:
2850*eaa79794SWojciech Macek 	 *	SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_START,
2851*eaa79794SWojciech Macek 	 *	to start Eye measurement
2852*eaa79794SWojciech Macek 	 */
2853*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj,
2854*eaa79794SWojciech Macek 				(enum al_serdes_reg_page)lane,
2855*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
2856*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_START_REG_NUM,
2857*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_START,
2858*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_START);
2859*eaa79794SWojciech Macek 
2860*eaa79794SWojciech Macek 	for(i = 0; i < AL_SERDES_RX_EYE_CAL_TRIES; ++i) {
2861*eaa79794SWojciech Macek 		/* Check if RxEQ Cal is done */
2862*eaa79794SWojciech Macek 		al_serdes_reg_read(
2863*eaa79794SWojciech Macek 				obj, (enum al_serdes_reg_page)lane,
2864*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
2865*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSM_DONE_REG_NUM,
2866*eaa79794SWojciech Macek 				&status);
2867*eaa79794SWojciech Macek 		if (status & SERDES_IREG_FLD_RXCALEYEDIAGFSM_DONE)
2868*eaa79794SWojciech Macek 			break;
2869*eaa79794SWojciech Macek 		al_msleep(AL_SERDES_RX_EYE_CAL_MDELAY);
2870*eaa79794SWojciech Macek 	}
2871*eaa79794SWojciech Macek 
2872*eaa79794SWojciech Macek 	if (status & SERDES_IREG_FLD_RXCALEYEDIAGFSM_ERR) {
2873*eaa79794SWojciech Macek 		al_err("%s: eye measure error!\n", __func__);
2874*eaa79794SWojciech Macek 		return -1;
2875*eaa79794SWojciech Macek 	}
2876*eaa79794SWojciech Macek 
2877*eaa79794SWojciech Macek 	if (!(status & SERDES_IREG_FLD_RXCALEYEDIAGFSM_DONE)) {
2878*eaa79794SWojciech Macek 		al_err("%s: eye measure timeout!\n", __func__);
2879*eaa79794SWojciech Macek 		return -1;
2880*eaa79794SWojciech Macek 	}
2881*eaa79794SWojciech Macek 
2882*eaa79794SWojciech Macek 	/*  Read Eye Opening Metrics, Bits:
2883*eaa79794SWojciech Macek 	 *	SERDES_IREG_FLD_RXCALEYEDIAGFSM_EYESUM_LSB,
2884*eaa79794SWojciech Macek 	 *	SERDES_IREG_FLD_RXCALEYEDIAGFSM_EYESUM_LSB
2885*eaa79794SWojciech Macek 	 */
2886*eaa79794SWojciech Macek 	al_serdes_reg_read(
2887*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2888*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2889*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_EYESUM_MSB_REG_NUM,
2890*eaa79794SWojciech Macek 			&reg_value);
2891*eaa79794SWojciech Macek 	*width = reg_value << 6;
2892*eaa79794SWojciech Macek 	al_serdes_reg_read(
2893*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2894*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2895*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_EYESUM_LSB_REG_NUM,
2896*eaa79794SWojciech Macek 			&reg_value);
2897*eaa79794SWojciech Macek 	*width =+ reg_value & SERDES_IREG_FLD_RXCALEYEDIAGFSM_EYESUM_LSB_MAKE;
2898*eaa79794SWojciech Macek 
2899*eaa79794SWojciech Macek 	/*
2900*eaa79794SWojciech Macek 	 * Clear Bit:
2901*eaa79794SWojciech Macek 	 *	SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_START,
2902*eaa79794SWojciech Macek 	 *	to stop Eye measurement
2903*eaa79794SWojciech Macek 	 */
2904*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj,
2905*eaa79794SWojciech Macek 				(enum al_serdes_reg_page)lane,
2906*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
2907*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_START_REG_NUM,
2908*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_START,
2909*eaa79794SWojciech Macek 				0);
2910*eaa79794SWojciech Macek 
2911*eaa79794SWojciech Macek 	/* Height Calculation */
2912*eaa79794SWojciech Macek 
2913*eaa79794SWojciech Macek 	/* Return Value = 1*Y + 0*X */
2914*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2915*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2916*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_X_Y_VALWEIGHT_REG_NUM,
2917*eaa79794SWojciech Macek 			0x10);
2918*eaa79794SWojciech Macek 	/* X coarse scan step = 0 */
2919*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2920*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2921*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_XVALCOARSE_REG_NUM,
2922*eaa79794SWojciech Macek 			0x00);
2923*eaa79794SWojciech Macek 	/* X fine scan step = 0   */
2924*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2925*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2926*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_XVALFINE_REG_NUM,
2927*eaa79794SWojciech Macek 			0x00);
2928*eaa79794SWojciech Macek 	/* Y coarse scan step = 3 */
2929*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2930*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2931*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_YVALCOARSE_REG_NUM,
2932*eaa79794SWojciech Macek 			0x03);
2933*eaa79794SWojciech Macek 	/* Y fine scan step = 1   */
2934*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
2935*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2936*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_YVALFINE_REG_NUM,
2937*eaa79794SWojciech Macek 			0x01);
2938*eaa79794SWojciech Macek 
2939*eaa79794SWojciech Macek 	/*
2940*eaa79794SWojciech Macek 	 * Set Bit:
2941*eaa79794SWojciech Macek 	 *	SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_START,
2942*eaa79794SWojciech Macek 	 *	to start Eye measurement
2943*eaa79794SWojciech Macek 	 */
2944*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj,
2945*eaa79794SWojciech Macek 				(enum al_serdes_reg_page)lane,
2946*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
2947*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_START_REG_NUM,
2948*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_START,
2949*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_START);
2950*eaa79794SWojciech Macek 
2951*eaa79794SWojciech Macek 	for( i = 0; i < AL_SERDES_RX_EYE_CAL_TRIES; ++i ) {
2952*eaa79794SWojciech Macek 		/* Check if RxEQ Cal is done */
2953*eaa79794SWojciech Macek 		al_serdes_reg_read(
2954*eaa79794SWojciech Macek 				obj, (enum al_serdes_reg_page)lane,
2955*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
2956*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSM_DONE_REG_NUM,
2957*eaa79794SWojciech Macek 				&status );
2958*eaa79794SWojciech Macek 		if (status & SERDES_IREG_FLD_RXCALEYEDIAGFSM_DONE)
2959*eaa79794SWojciech Macek 			break;
2960*eaa79794SWojciech Macek 		al_msleep(AL_SERDES_RX_EYE_CAL_MDELAY);
2961*eaa79794SWojciech Macek 	}
2962*eaa79794SWojciech Macek 
2963*eaa79794SWojciech Macek 	if (status & SERDES_IREG_FLD_RXCALEYEDIAGFSM_ERR) {
2964*eaa79794SWojciech Macek 		al_err("%s: eye measure error!\n", __func__);
2965*eaa79794SWojciech Macek 		return -1;
2966*eaa79794SWojciech Macek 	}
2967*eaa79794SWojciech Macek 
2968*eaa79794SWojciech Macek 	if (!(status & SERDES_IREG_FLD_RXCALEYEDIAGFSM_DONE)) {
2969*eaa79794SWojciech Macek 		al_err("%s: eye measure timeout!\n", __func__);
2970*eaa79794SWojciech Macek 		return -1;
2971*eaa79794SWojciech Macek 	}
2972*eaa79794SWojciech Macek 
2973*eaa79794SWojciech Macek 	/*  Read Eye Opening Metrics, Bits:
2974*eaa79794SWojciech Macek 	 *	SERDES_IREG_FLD_RXCALEYEDIAGFSM_EYESUM_LSB,
2975*eaa79794SWojciech Macek 	 *	SERDES_IREG_FLD_RXCALEYEDIAGFSM_EYESUM_LSB
2976*eaa79794SWojciech Macek 	 */
2977*eaa79794SWojciech Macek 	al_serdes_reg_read(
2978*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2979*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2980*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_EYESUM_MSB_REG_NUM,
2981*eaa79794SWojciech Macek 			&reg_value );
2982*eaa79794SWojciech Macek 	*height = reg_value << 6;
2983*eaa79794SWojciech Macek 	al_serdes_reg_read(
2984*eaa79794SWojciech Macek 			obj, (enum al_serdes_reg_page)lane,
2985*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
2986*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_EYESUM_LSB_REG_NUM,
2987*eaa79794SWojciech Macek 			&reg_value );
2988*eaa79794SWojciech Macek 	*height =+ reg_value & SERDES_IREG_FLD_RXCALEYEDIAGFSM_EYESUM_LSB_MAKE;
2989*eaa79794SWojciech Macek 
2990*eaa79794SWojciech Macek 	/*
2991*eaa79794SWojciech Macek 	 * Clear Bit:
2992*eaa79794SWojciech Macek 	 *	SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_START,
2993*eaa79794SWojciech Macek 	 *	to stop Eye measurement
2994*eaa79794SWojciech Macek 	 */
2995*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj,
2996*eaa79794SWojciech Macek 				(enum al_serdes_reg_page)lane,
2997*eaa79794SWojciech Macek 				AL_SRDS_REG_TYPE_PMA,
2998*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_START_REG_NUM,
2999*eaa79794SWojciech Macek 				SERDES_IREG_FLD_RXCALEYEDIAGFSMIN_START,
3000*eaa79794SWojciech Macek 				0);
3001*eaa79794SWojciech Macek 
3002*eaa79794SWojciech Macek 	/* Restore Registers */
3003*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
3004*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
3005*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_X_Y_VALWEIGHT_REG_NUM,
3006*eaa79794SWojciech Macek 			rxcaleyediagfsm_x_y_valweight_val);
3007*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
3008*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
3009*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_XVALCOARSE_REG_NUM,
3010*eaa79794SWojciech Macek 			rxcaleyediagfsm_xvalcoarse_val);
3011*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
3012*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
3013*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_XVALFINE_REG_NUM,
3014*eaa79794SWojciech Macek 			rxcaleyediagfsm_xvalfine_val);
3015*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
3016*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
3017*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_YVALCOARSE_REG_NUM,
3018*eaa79794SWojciech Macek 			rxcaleyediagfsm_yvalcoarse_val);
3019*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON,
3020*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
3021*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALEYEDIAGFSM_YVALFINE_REG_NUM,
3022*eaa79794SWojciech Macek 			rxcaleyediagfsm_yvalfine_val);
3023*eaa79794SWojciech Macek 
3024*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, (enum al_serdes_reg_page)lane, AL_SRDS_REG_TYPE_PMA,
3025*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXLOCK2REF_LOCWREN_REG_NUM,
3026*eaa79794SWojciech Macek 			rxlock2ref_locwren_val);
3027*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, (enum al_serdes_reg_page)lane, AL_SRDS_REG_TYPE_PMA,
3028*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCAL_LOCWREN_REG_NUM,
3029*eaa79794SWojciech Macek 			rxcal_locwren_val);
3030*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, (enum al_serdes_reg_page)lane, AL_SRDS_REG_TYPE_PMA,
3031*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXCALROAMYADJUST_LOCWREN_REG_NUM,
3032*eaa79794SWojciech Macek 			rxcalroamyadjust_locwren_val);
3033*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, (enum al_serdes_reg_page)lane, AL_SRDS_REG_TYPE_PMA,
3034*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXLOCK2REF_OVREN_REG_NUM,
3035*eaa79794SWojciech Macek 			rxlock2ref_ovren_val);
3036*eaa79794SWojciech Macek 	return 0;
3037*eaa79794SWojciech Macek }
3038*eaa79794SWojciech Macek 
al_serdes_sris_config(struct al_serdes_grp_obj * obj,void * sris_params)3039*eaa79794SWojciech Macek static void al_serdes_sris_config(
3040*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
3041*eaa79794SWojciech Macek 	void				*sris_params)
3042*eaa79794SWojciech Macek {
3043*eaa79794SWojciech Macek 	struct al_serdes_sris_params	*params = sris_params;
3044*eaa79794SWojciech Macek 
3045*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON, AL_SRDS_REG_TYPE_PMA,
3046*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PPMDRIFTCOUNT1_REG_NUM,
3047*eaa79794SWojciech Macek 		(params->ppm_drift_count & AL_FIELD_MASK(7, 0)) >> 0);
3048*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON, AL_SRDS_REG_TYPE_PMA,
3049*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PPMDRIFTCOUNT2_REG_NUM,
3050*eaa79794SWojciech Macek 		(params->ppm_drift_count & AL_FIELD_MASK(15, 8)) >> 8);
3051*eaa79794SWojciech Macek 
3052*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON, AL_SRDS_REG_TYPE_PMA,
3053*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PPMDRIFTMAX1_REG_NUM,
3054*eaa79794SWojciech Macek 		(params->ppm_drift_max & AL_FIELD_MASK(7, 0)) >> 0);
3055*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON, AL_SRDS_REG_TYPE_PMA,
3056*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PPMDRIFTMAX2_REG_NUM,
3057*eaa79794SWojciech Macek 		(params->ppm_drift_max & AL_FIELD_MASK(15, 8)) >> 8);
3058*eaa79794SWojciech Macek 
3059*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON, AL_SRDS_REG_TYPE_PMA,
3060*eaa79794SWojciech Macek 		SERDES_IREG_FLD_SYNTHPPMDRIFTMAX1_REG_NUM,
3061*eaa79794SWojciech Macek 		(params->synth_ppm_drift_max & AL_FIELD_MASK(7, 0)) >> 0);
3062*eaa79794SWojciech Macek 	al_serdes_reg_write(obj, AL_SRDS_REG_PAGE_4_COMMON, AL_SRDS_REG_TYPE_PMA,
3063*eaa79794SWojciech Macek 		SERDES_IREG_FLD_SYNTHPPMDRIFTMAX2_REG_NUM,
3064*eaa79794SWojciech Macek 		(params->synth_ppm_drift_max & AL_FIELD_MASK(15, 8)) >> 8);
3065*eaa79794SWojciech Macek 
3066*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj, AL_SRDS_REG_PAGE_4_COMMON, AL_SRDS_REG_TYPE_PCS,
3067*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCS_EBUF_FULL_D2R1_REG_NUM,
3068*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCS_EBUF_FULL_D2R1_REG_MASK,
3069*eaa79794SWojciech Macek 		(params->full_d2r1)
3070*eaa79794SWojciech Macek 			<< SERDES_IREG_FLD_PCS_EBUF_FULL_D2R1_REG_SHIFT);
3071*eaa79794SWojciech Macek 
3072*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj, AL_SRDS_REG_PAGE_4_COMMON, AL_SRDS_REG_TYPE_PCS,
3073*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCS_EBUF_FULL_PCIE_G3_REG_NUM,
3074*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCS_EBUF_FULL_PCIE_G3_REG_MASK,
3075*eaa79794SWojciech Macek 		(params->full_pcie_g3)
3076*eaa79794SWojciech Macek 			<< SERDES_IREG_FLD_PCS_EBUF_FULL_PCIE_G3_REG_SHIFT);
3077*eaa79794SWojciech Macek 
3078*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj, AL_SRDS_REG_PAGE_4_COMMON, AL_SRDS_REG_TYPE_PCS,
3079*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCS_EBUF_RD_THRESHOLD_D2R1_REG_NUM,
3080*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCS_EBUF_RD_THRESHOLD_D2R1_REG_MASK,
3081*eaa79794SWojciech Macek 		(params->rd_threshold_d2r1)
3082*eaa79794SWojciech Macek 			<< SERDES_IREG_FLD_PCS_EBUF_RD_THRESHOLD_D2R1_REG_SHIFT);
3083*eaa79794SWojciech Macek 
3084*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj, AL_SRDS_REG_PAGE_4_COMMON, AL_SRDS_REG_TYPE_PCS,
3085*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCS_EBUF_RD_THRESHOLD_PCIE_G3_REG_NUM,
3086*eaa79794SWojciech Macek 		SERDES_IREG_FLD_PCS_EBUF_RD_THRESHOLD_PCIE_G3_REG_MASK,
3087*eaa79794SWojciech Macek 		(params->rd_threshold_pcie_g3)
3088*eaa79794SWojciech Macek 			<< SERDES_IREG_FLD_PCS_EBUF_RD_THRESHOLD_PCIE_G3_REG_SHIFT);
3089*eaa79794SWojciech Macek }
3090*eaa79794SWojciech Macek 
3091*eaa79794SWojciech Macek /******************************************************************************/
3092*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_dcgain_set(struct al_serdes_grp_obj * obj,uint8_t dcgain)3093*eaa79794SWojciech Macek static void al_serdes_dcgain_set(
3094*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj,
3095*eaa79794SWojciech Macek 	uint8_t				dcgain)
3096*eaa79794SWojciech Macek {
3097*eaa79794SWojciech Macek 	al_serdes_grp_reg_masked_write(obj,
3098*eaa79794SWojciech Macek 			AL_SRDS_REG_PAGE_4_COMMON,
3099*eaa79794SWojciech Macek 			AL_SRDS_REG_TYPE_PMA,
3100*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXEQ_DCGAIN_LUP0_REG_NUM,
3101*eaa79794SWojciech Macek 			SERDES_IREG_FLD_RXEQ_DCGAIN_LUP0_MASK,
3102*eaa79794SWojciech Macek 			(dcgain << SERDES_IREG_FLD_RXEQ_DCGAIN_LUP0_SHIFT));
3103*eaa79794SWojciech Macek }
3104*eaa79794SWojciech Macek 
3105*eaa79794SWojciech Macek 
3106*eaa79794SWojciech Macek /******************************************************************************/
3107*eaa79794SWojciech Macek /******************************************************************************/
al_serdes_hssp_handle_init(void __iomem * serdes_regs_base,struct al_serdes_grp_obj * obj)3108*eaa79794SWojciech Macek int al_serdes_hssp_handle_init(
3109*eaa79794SWojciech Macek 	void __iomem			*serdes_regs_base,
3110*eaa79794SWojciech Macek 	struct al_serdes_grp_obj	*obj)
3111*eaa79794SWojciech Macek {
3112*eaa79794SWojciech Macek 	al_dbg(
3113*eaa79794SWojciech Macek 		"%s(%p, %p)\n",
3114*eaa79794SWojciech Macek 		__func__,
3115*eaa79794SWojciech Macek 		serdes_regs_base,
3116*eaa79794SWojciech Macek 		obj);
3117*eaa79794SWojciech Macek 
3118*eaa79794SWojciech Macek 	al_memset(obj, 0, sizeof(struct al_serdes_grp_obj));
3119*eaa79794SWojciech Macek 
3120*eaa79794SWojciech Macek 	obj->regs_base = (struct al_serdes_regs *)serdes_regs_base;
3121*eaa79794SWojciech Macek 	obj->type_get = al_serdes_hssp_type_get;
3122*eaa79794SWojciech Macek 	obj->reg_read = al_serdes_reg_read;
3123*eaa79794SWojciech Macek 	obj->reg_write = al_serdes_reg_write;
3124*eaa79794SWojciech Macek 	obj->bist_overrides_enable = AL_SRDS_ADV_SRVC(al_serdes_bist_overrides_enable);
3125*eaa79794SWojciech Macek 	obj->bist_overrides_disable = AL_SRDS_ADV_SRVC(al_serdes_bist_overrides_disable);
3126*eaa79794SWojciech Macek 	obj->rx_rate_change = AL_SRDS_ADV_SRVC(al_serdes_rx_rate_change);
3127*eaa79794SWojciech Macek 	obj->rx_rate_change_sw_flow_en = AL_SRDS_ADV_SRVC(al_serdes_lane_rx_rate_change_sw_flow_en);
3128*eaa79794SWojciech Macek 	obj->rx_rate_change_sw_flow_dis =
3129*eaa79794SWojciech Macek 		AL_SRDS_ADV_SRVC(al_serdes_lane_rx_rate_change_sw_flow_dis);
3130*eaa79794SWojciech Macek 	obj->pcie_rate_override_is_enabled =
3131*eaa79794SWojciech Macek 		AL_SRDS_ADV_SRVC(al_serdes_lane_pcie_rate_override_is_enabled);
3132*eaa79794SWojciech Macek 	obj->pcie_rate_override_enable_set =
3133*eaa79794SWojciech Macek 		AL_SRDS_ADV_SRVC(al_serdes_lane_pcie_rate_override_enable_set);
3134*eaa79794SWojciech Macek 	obj->pcie_rate_get = AL_SRDS_ADV_SRVC(al_serdes_lane_pcie_rate_get);
3135*eaa79794SWojciech Macek 	obj->pcie_rate_set = AL_SRDS_ADV_SRVC(al_serdes_lane_pcie_rate_set);
3136*eaa79794SWojciech Macek 	obj->group_pm_set = AL_SRDS_ADV_SRVC(al_serdes_group_pm_set);
3137*eaa79794SWojciech Macek 	obj->lane_pm_set = AL_SRDS_ADV_SRVC(al_serdes_lane_pm_set);
3138*eaa79794SWojciech Macek 	obj->pma_hard_reset_group = AL_SRDS_ADV_SRVC(al_serdes_pma_hard_reset_group);
3139*eaa79794SWojciech Macek 	obj->pma_hard_reset_lane = AL_SRDS_ADV_SRVC(al_serdes_pma_hard_reset_lane);
3140*eaa79794SWojciech Macek 	obj->loopback_control = AL_SRDS_ADV_SRVC(al_serdes_loopback_control);
3141*eaa79794SWojciech Macek 	obj->bist_pattern_select = AL_SRDS_ADV_SRVC(al_serdes_bist_pattern_select);
3142*eaa79794SWojciech Macek 	obj->bist_tx_enable = AL_SRDS_ADV_SRVC(al_serdes_bist_tx_enable);
3143*eaa79794SWojciech Macek 	obj->bist_tx_err_inject = AL_SRDS_ADV_SRVC(al_serdes_bist_tx_err_inject);
3144*eaa79794SWojciech Macek 	obj->bist_rx_enable = AL_SRDS_ADV_SRVC(al_serdes_bist_rx_enable);
3145*eaa79794SWojciech Macek 	obj->bist_rx_status = AL_SRDS_ADV_SRVC(al_serdes_bist_rx_status);
3146*eaa79794SWojciech Macek 	obj->tx_deemph_preset = AL_SRDS_ADV_SRVC(al_serdes_tx_deemph_preset);
3147*eaa79794SWojciech Macek 	obj->tx_deemph_inc = AL_SRDS_ADV_SRVC(al_serdes_tx_deemph_inc);
3148*eaa79794SWojciech Macek 	obj->tx_deemph_dec = AL_SRDS_ADV_SRVC(al_serdes_tx_deemph_dec);
3149*eaa79794SWojciech Macek 	obj->eye_measure_run = AL_SRDS_ADV_SRVC(al_serdes_eye_measure_run);
3150*eaa79794SWojciech Macek 	obj->eye_diag_sample = AL_SRDS_ADV_SRVC(al_serdes_eye_diag_sample);
3151*eaa79794SWojciech Macek 	obj->signal_is_detected = AL_SRDS_ADV_SRVC(al_serdes_signal_is_detected);
3152*eaa79794SWojciech Macek 	obj->tx_advanced_params_set = AL_SRDS_ADV_SRVC(al_serdes_tx_advanced_params_set);
3153*eaa79794SWojciech Macek 	obj->tx_advanced_params_get = AL_SRDS_ADV_SRVC(al_serdes_tx_advanced_params_get);
3154*eaa79794SWojciech Macek 	obj->rx_advanced_params_set = AL_SRDS_ADV_SRVC(al_serdes_rx_advanced_params_set);
3155*eaa79794SWojciech Macek 	obj->rx_advanced_params_get = AL_SRDS_ADV_SRVC(al_serdes_rx_advanced_params_get);
3156*eaa79794SWojciech Macek 	obj->mode_set_sgmii = AL_SRDS_ADV_SRVC(al_serdes_mode_set_sgmii);
3157*eaa79794SWojciech Macek 	obj->mode_set_kr = AL_SRDS_ADV_SRVC(al_serdes_mode_set_kr);
3158*eaa79794SWojciech Macek 	obj->rx_equalization = AL_SRDS_ADV_SRVC(al_serdes_rx_equalization);
3159*eaa79794SWojciech Macek 	obj->calc_eye_size = AL_SRDS_ADV_SRVC(al_serdes_calc_eye_size);
3160*eaa79794SWojciech Macek 	obj->sris_config = AL_SRDS_ADV_SRVC(al_serdes_sris_config);
3161*eaa79794SWojciech Macek 	obj->dcgain_set = AL_SRDS_ADV_SRVC(al_serdes_dcgain_set);
3162*eaa79794SWojciech Macek 
3163*eaa79794SWojciech Macek 	return 0;
3164*eaa79794SWojciech Macek }
3165