Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(C) 2021 Marvell.
3 : : */
4 : :
5 : : #include <pthread.h>
6 : :
7 : : #include "roc_api.h"
8 : : #include "roc_priv.h"
9 : :
10 : : #define CGX_CMRX_CONFIG 0x00
11 : : #define CGX_CMRX_CONFIG_DATA_PKT_RX_EN BIT_ULL(54)
12 : : #define CGX_CMRX_CONFIG_DATA_PKT_TX_EN BIT_ULL(53)
13 : : #define CGX_CMRX_INT 0x40
14 : : #define CGX_CMRX_INT_OVERFLW BIT_ULL(1)
15 : : /*
16 : : * CN10K stores number of lmacs in 4 bit filed
17 : : * in contrary to CN9K which uses only 3 bits.
18 : : *
19 : : * In theory masks should differ yet on CN9K
20 : : * bits beyond specified range contain zeros.
21 : : *
22 : : * Hence common longer mask may be used.
23 : : */
24 : : #define CGX_CMRX_RX_LMACS 0x128
25 : : #define CGX_CMRX_RX_LMACS_LMACS GENMASK_ULL(3, 0)
26 : : #define CGX_CMRX_SCRATCH0 0x1050
27 : : #define CGX_CMRX_SCRATCH1 0x1058
28 : : #define CGX_MTI_MAC100X_COMMAND_CONFIG 0x8010
29 : : #define CGX_MTI_MAC100X_COMMAND_CONFIG_RX_ENA BIT_ULL(1)
30 : : #define CGX_MTI_MAC100X_COMMAND_CONFIG_TX_ENA BIT_ULL(0)
31 : :
32 : : static uint64_t
33 : : roc_bphy_cgx_read(struct roc_bphy_cgx *roc_cgx, uint64_t lmac, uint64_t offset)
34 : : {
35 [ # # # # : 0 : int shift = roc_model_is_cn10k() ? 20 : 18;
# # # # #
# # # ]
36 : 0 : uint64_t base = (uint64_t)roc_cgx->bar0_va;
37 : :
38 [ # # # # : 0 : return plt_read64(base + (lmac << shift) + offset);
# # # # #
# # # #
# ]
39 : : }
40 : :
41 : : static void
42 : : roc_bphy_cgx_write(struct roc_bphy_cgx *roc_cgx, uint64_t lmac, uint64_t offset,
43 : : uint64_t value)
44 : : {
45 [ # # # # ]: 0 : int shift = roc_model_is_cn10k() ? 20 : 18;
46 : 0 : uint64_t base = (uint64_t)roc_cgx->bar0_va;
47 : :
48 : 0 : plt_write64(value, base + (lmac << shift) + offset);
49 : : }
50 : :
51 : : static void
52 : 0 : roc_bphy_cgx_ack(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
53 : : uint64_t *scr0)
54 : : {
55 : : uint64_t val;
56 : :
57 : : /* clear interrupt */
58 [ # # ]: 0 : val = roc_bphy_cgx_read(roc_cgx, lmac, CGX_CMRX_INT);
59 [ # # ]: 0 : val |= FIELD_PREP(CGX_CMRX_INT_OVERFLW, 1);
60 : : roc_bphy_cgx_write(roc_cgx, lmac, CGX_CMRX_INT, val);
61 : :
62 : : /* ack fw response */
63 [ # # ]: 0 : *scr0 &= ~SCR0_ETH_EVT_STS_S_ACK;
64 : : roc_bphy_cgx_write(roc_cgx, lmac, CGX_CMRX_SCRATCH0, *scr0);
65 : 0 : }
66 : :
67 : : static int
68 : 0 : roc_bphy_cgx_wait_for_ownership(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
69 : : uint64_t *scr0)
70 : : {
71 : : int tries = 5000;
72 : : uint64_t scr1;
73 : :
74 : : do {
75 [ # # # # ]: 0 : *scr0 = roc_bphy_cgx_read(roc_cgx, lmac, CGX_CMRX_SCRATCH0);
76 : : scr1 = roc_bphy_cgx_read(roc_cgx, lmac, CGX_CMRX_SCRATCH1);
77 : :
78 [ # # ]: 0 : if (FIELD_GET(SCR1_OWN_STATUS, scr1) == ETH_OWN_NON_SECURE_SW &&
79 [ # # ]: 0 : FIELD_GET(SCR0_ETH_EVT_STS_S_ACK, *scr0) == 0)
80 : : break;
81 : :
82 : : /* clear async events if any */
83 : 0 : if (FIELD_GET(SCR0_ETH_EVT_STS_S_EVT_TYPE, *scr0) ==
84 [ # # ]: 0 : ETH_EVT_ASYNC &&
85 : : FIELD_GET(SCR0_ETH_EVT_STS_S_ACK, *scr0))
86 : 0 : roc_bphy_cgx_ack(roc_cgx, lmac, scr0);
87 : :
88 : : plt_delay_ms(1);
89 [ # # ]: 0 : } while (--tries);
90 : :
91 [ # # ]: 0 : return tries ? 0 : -ETIMEDOUT;
92 : : }
93 : :
94 : : static int
95 : 0 : roc_bphy_cgx_wait_for_ack(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
96 : : uint64_t *scr0)
97 : : {
98 : : int tries = 5000;
99 : : uint64_t scr1;
100 : :
101 : : do {
102 [ # # # # ]: 0 : *scr0 = roc_bphy_cgx_read(roc_cgx, lmac, CGX_CMRX_SCRATCH0);
103 : : scr1 = roc_bphy_cgx_read(roc_cgx, lmac, CGX_CMRX_SCRATCH1);
104 : :
105 [ # # ]: 0 : if (FIELD_GET(SCR1_OWN_STATUS, scr1) == ETH_OWN_NON_SECURE_SW &&
106 [ # # ]: 0 : FIELD_GET(SCR0_ETH_EVT_STS_S_ACK, *scr0))
107 : : break;
108 : :
109 : : plt_delay_ms(1);
110 [ # # ]: 0 : } while (--tries);
111 : :
112 [ # # ]: 0 : return tries ? 0 : -ETIMEDOUT;
113 : : }
114 : :
115 : : static int
116 : 0 : roc_bphy_cgx_intf_req(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
117 : : uint64_t scr1, uint64_t *scr0)
118 : : {
119 : 0 : uint8_t cmd_id = FIELD_GET(SCR1_ETH_CMD_ID, scr1);
120 : : int ret;
121 : :
122 : 0 : pthread_mutex_lock(&roc_cgx->lock);
123 : :
124 : : /* wait for ownership */
125 : 0 : ret = roc_bphy_cgx_wait_for_ownership(roc_cgx, lmac, scr0);
126 [ # # ]: 0 : if (ret) {
127 : 0 : plt_err("timed out waiting for ownership");
128 : 0 : goto out;
129 : : }
130 : :
131 : : /* write command */
132 : 0 : scr1 |= FIELD_PREP(SCR1_OWN_STATUS, ETH_OWN_FIRMWARE);
133 [ # # ]: 0 : roc_bphy_cgx_write(roc_cgx, lmac, CGX_CMRX_SCRATCH1, scr1);
134 : :
135 : : /* wait for command ack */
136 : 0 : ret = roc_bphy_cgx_wait_for_ack(roc_cgx, lmac, scr0);
137 [ # # ]: 0 : if (ret) {
138 : 0 : plt_err("timed out waiting for response");
139 : 0 : goto out;
140 : : }
141 : :
142 [ # # ]: 0 : if (cmd_id == ETH_CMD_INTF_SHUTDOWN)
143 : 0 : goto out;
144 : :
145 [ # # ]: 0 : if (FIELD_GET(SCR0_ETH_EVT_STS_S_EVT_TYPE, *scr0) != ETH_EVT_CMD_RESP) {
146 : 0 : plt_err("received async event instead of cmd resp event");
147 : : ret = -EIO;
148 : 0 : goto out;
149 : : }
150 : :
151 [ # # ]: 0 : if (FIELD_GET(SCR0_ETH_EVT_STS_S_ID, *scr0) != cmd_id) {
152 : 0 : plt_err("received resp for cmd %d expected for cmd %d",
153 : : (int)FIELD_GET(SCR0_ETH_EVT_STS_S_ID, *scr0), cmd_id);
154 : : ret = -EIO;
155 : 0 : goto out;
156 : : }
157 : :
158 [ # # ]: 0 : if (FIELD_GET(SCR0_ETH_EVT_STS_S_STAT, *scr0) != ETH_STAT_SUCCESS) {
159 : 0 : plt_err("cmd %d failed on cgx%u lmac%u with errcode %d", cmd_id,
160 : : roc_cgx->id, lmac,
161 : : (int)FIELD_GET(SCR0_ETH_LNK_STS_S_ERR_TYPE, *scr0));
162 : : ret = -EIO;
163 : : }
164 : :
165 : 0 : out:
166 : 0 : roc_bphy_cgx_ack(roc_cgx, lmac, scr0);
167 : :
168 : 0 : pthread_mutex_unlock(&roc_cgx->lock);
169 : :
170 : 0 : return ret;
171 : : }
172 : :
173 : : static unsigned int
174 : : roc_bphy_cgx_dev_id(struct roc_bphy_cgx *roc_cgx)
175 : : {
176 : : uint64_t cgx_id;
177 : :
178 [ # # ]: 0 : if (roc_model_is_cnf10kb())
179 : : cgx_id = GENMASK_ULL(27, 24);
180 [ # # ]: 0 : else if (roc_model_is_cn10k())
181 : : cgx_id = GENMASK_ULL(26, 24);
182 : : else
183 : : cgx_id = GENMASK_ULL(25, 24);
184 : :
185 : 0 : return FIELD_GET(cgx_id, roc_cgx->bar0_pa);
186 : : }
187 : :
188 : : int
189 : 0 : roc_bphy_cgx_dev_init(struct roc_bphy_cgx *roc_cgx)
190 : : {
191 : : uint64_t val;
192 : : int ret;
193 : :
194 [ # # # # : 0 : if (!roc_cgx || !roc_cgx->bar0_va || !roc_cgx->bar0_pa)
# # ]
195 : : return -EINVAL;
196 : :
197 : 0 : ret = pthread_mutex_init(&roc_cgx->lock, NULL);
198 [ # # ]: 0 : if (ret)
199 : : return ret;
200 : :
201 : : val = roc_bphy_cgx_read(roc_cgx, 0, CGX_CMRX_RX_LMACS);
202 [ # # ]: 0 : val = FIELD_GET(CGX_CMRX_RX_LMACS_LMACS, val);
203 [ # # ]: 0 : if (roc_model_is_cn9k())
204 : 0 : val = GENMASK_ULL(val - 1, 0);
205 [ # # ]: 0 : roc_cgx->lmac_bmap = val;
206 : 0 : roc_cgx->id = roc_bphy_cgx_dev_id(roc_cgx);
207 : :
208 : 0 : return 0;
209 : : }
210 : :
211 : : int
212 : 0 : roc_bphy_cgx_dev_fini(struct roc_bphy_cgx *roc_cgx)
213 : : {
214 [ # # ]: 0 : if (!roc_cgx)
215 : : return -EINVAL;
216 : :
217 : 0 : pthread_mutex_destroy(&roc_cgx->lock);
218 : :
219 : 0 : return 0;
220 : : }
221 : :
222 : : static bool
223 : : roc_bphy_cgx_lmac_exists(struct roc_bphy_cgx *roc_cgx, unsigned int lmac)
224 : : {
225 [ # # # # : 0 : return (lmac < MAX_LMACS_PER_CGX) &&
# # # # #
# # # # #
# # # # #
# # # ]
226 [ # # # # : 0 : (roc_cgx->lmac_bmap & BIT_ULL(lmac));
# # # # #
# # # # #
# # # # #
# # # ]
227 : : }
228 : :
229 : : static int
230 : 0 : roc_bphy_cgx_start_stop_rxtx(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
231 : : bool start)
232 : : {
233 : : uint64_t val, reg, rx_field, tx_field;
234 : :
235 [ # # ]: 0 : if (!roc_cgx)
236 : : return -EINVAL;
237 : :
238 [ # # ]: 0 : if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
239 : : return -ENODEV;
240 : :
241 [ # # ]: 0 : if (roc_model_is_cnf10kb()) {
242 : : reg = CGX_MTI_MAC100X_COMMAND_CONFIG;
243 : : rx_field = CGX_MTI_MAC100X_COMMAND_CONFIG_RX_ENA;
244 : : tx_field = CGX_MTI_MAC100X_COMMAND_CONFIG_TX_ENA;
245 : : } else {
246 : : reg = CGX_CMRX_CONFIG;
247 : : rx_field = CGX_CMRX_CONFIG_DATA_PKT_RX_EN;
248 : : tx_field = CGX_CMRX_CONFIG_DATA_PKT_TX_EN;
249 : : }
250 : :
251 : 0 : pthread_mutex_lock(&roc_cgx->lock);
252 [ # # ]: 0 : val = roc_bphy_cgx_read(roc_cgx, lmac, reg);
253 : 0 : val &= ~(rx_field | tx_field);
254 : :
255 [ # # ]: 0 : if (start)
256 : 0 : val |= FIELD_PREP(rx_field, 1) | FIELD_PREP(tx_field, 1);
257 : :
258 : : roc_bphy_cgx_write(roc_cgx, lmac, reg, val);
259 : 0 : pthread_mutex_unlock(&roc_cgx->lock);
260 : :
261 : 0 : return 0;
262 : : }
263 : :
264 : : static int
265 : 0 : roc_bphy_cgx_intlbk_ena_dis(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
266 : : bool enable)
267 : : {
268 : : uint64_t scr1, scr0;
269 : :
270 [ # # ]: 0 : if (!roc_cgx)
271 : : return -EINVAL;
272 : :
273 [ # # ]: 0 : if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
274 : : return -ENODEV;
275 : :
276 : 0 : scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_INTERNAL_LBK) |
277 : 0 : FIELD_PREP(SCR1_ETH_CTL_ARGS_ENABLE, enable);
278 : :
279 : 0 : return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
280 : : }
281 : :
282 : : static int
283 : 0 : roc_bphy_cgx_ptp_rx_ena_dis(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
284 : : bool enable)
285 : : {
286 : : uint64_t scr1, scr0;
287 : :
288 [ # # ]: 0 : if (!roc_cgx)
289 : : return -EINVAL;
290 : :
291 [ # # ]: 0 : if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
292 : : return -ENODEV;
293 : :
294 : 0 : scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_SET_PTP_MODE) |
295 : 0 : FIELD_PREP(SCR1_ETH_CTL_ARGS_ENABLE, enable);
296 : :
297 : 0 : return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
298 : : }
299 : :
300 : : int
301 : 0 : roc_bphy_cgx_start_rxtx(struct roc_bphy_cgx *roc_cgx, unsigned int lmac)
302 : : {
303 : 0 : return roc_bphy_cgx_start_stop_rxtx(roc_cgx, lmac, true);
304 : : }
305 : :
306 : : int
307 : 0 : roc_bphy_cgx_stop_rxtx(struct roc_bphy_cgx *roc_cgx, unsigned int lmac)
308 : : {
309 : 0 : return roc_bphy_cgx_start_stop_rxtx(roc_cgx, lmac, false);
310 : : }
311 : :
312 : : int
313 : 0 : roc_bphy_cgx_set_link_state(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
314 : : struct roc_bphy_cgx_link_state *state)
315 : : {
316 : : uint64_t scr1, scr0;
317 : :
318 [ # # ]: 0 : if (!roc_cgx)
319 : : return -EINVAL;
320 : :
321 [ # # ]: 0 : if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
322 : : return -ENODEV;
323 : :
324 [ # # ]: 0 : if (!state)
325 : : return -EINVAL;
326 : :
327 [ # # ]: 0 : scr1 = (state->state ? FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_LINK_BRING_UP) :
328 : 0 : FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_LINK_BRING_DOWN)) |
329 : 0 : FIELD_PREP(SCR1_CGX_LINK_BRINGUP_ARGS_TIMEOUT, state->timeout) |
330 : 0 : FIELD_PREP(SCR1_CGX_LINK_BRINGUP_ARGS_RX_TX_DIS, state->rx_tx_dis);
331 : :
332 : 0 : return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
333 : : }
334 : :
335 : : int
336 : 0 : roc_bphy_cgx_get_linkinfo(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
337 : : struct roc_bphy_cgx_link_info *info)
338 : : {
339 : : uint64_t scr1, scr0;
340 : : int ret;
341 : :
342 [ # # ]: 0 : if (!roc_cgx)
343 : : return -EINVAL;
344 : :
345 [ # # ]: 0 : if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
346 : : return -ENODEV;
347 : :
348 [ # # ]: 0 : if (!info)
349 : : return -EINVAL;
350 : :
351 : : scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_GET_LINK_STS);
352 : 0 : ret = roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
353 [ # # ]: 0 : if (ret)
354 : : return ret;
355 : :
356 : 0 : info->link_up = FIELD_GET(SCR0_ETH_LNK_STS_S_LINK_UP, scr0);
357 : 0 : info->full_duplex = FIELD_GET(SCR0_ETH_LNK_STS_S_FULL_DUPLEX, scr0);
358 : 0 : info->speed = FIELD_GET(SCR0_ETH_LNK_STS_S_SPEED, scr0);
359 : 0 : info->an = FIELD_GET(SCR0_ETH_LNK_STS_S_AN, scr0);
360 : 0 : info->fec = FIELD_GET(SCR0_ETH_LNK_STS_S_FEC, scr0);
361 : 0 : info->mode = FIELD_GET(SCR0_ETH_LNK_STS_S_MODE, scr0);
362 : :
363 : 0 : return 0;
364 : : }
365 : :
366 : : int
367 [ # # ]: 0 : roc_bphy_cgx_set_link_mode(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
368 : : struct roc_bphy_cgx_link_mode *mode)
369 : : {
370 : : uint64_t scr1, scr0;
371 : :
372 [ # # ]: 0 : if (roc_model_is_cn9k() &&
373 [ # # # # : 0 : (mode->use_portm_idx || mode->portm_idx || mode->mode_group_idx)) {
# # ]
374 : : return -ENOTSUP;
375 : : }
376 : :
377 [ # # ]: 0 : if (!roc_cgx)
378 : : return -EINVAL;
379 : :
380 [ # # ]: 0 : if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
381 : : return -ENODEV;
382 : :
383 [ # # ]: 0 : if (!mode)
384 : : return -EINVAL;
385 : :
386 : 0 : scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_MODE_CHANGE) |
387 : 0 : FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_SPEED, mode->speed) |
388 : 0 : FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_DUPLEX, mode->full_duplex) |
389 : 0 : FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_AN, mode->an) |
390 : 0 : FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_USE_PORTM_IDX,
391 : 0 : mode->use_portm_idx) |
392 : 0 : FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_PORTM_IDX,
393 : 0 : mode->portm_idx) |
394 : 0 : FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_MODE_GROUP_IDX,
395 : 0 : mode->mode_group_idx) |
396 : 0 : FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_MODE, BIT_ULL(mode->mode));
397 : :
398 : 0 : return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
399 : : }
400 : :
401 : : int
402 : 0 : roc_bphy_cgx_intlbk_enable(struct roc_bphy_cgx *roc_cgx, unsigned int lmac)
403 : : {
404 : 0 : return roc_bphy_cgx_intlbk_ena_dis(roc_cgx, lmac, true);
405 : : }
406 : :
407 : : int
408 : 0 : roc_bphy_cgx_intlbk_disable(struct roc_bphy_cgx *roc_cgx, unsigned int lmac)
409 : : {
410 : 0 : return roc_bphy_cgx_intlbk_ena_dis(roc_cgx, lmac, false);
411 : : }
412 : :
413 : : int
414 : 0 : roc_bphy_cgx_ptp_rx_enable(struct roc_bphy_cgx *roc_cgx, unsigned int lmac)
415 : : {
416 : 0 : return roc_bphy_cgx_ptp_rx_ena_dis(roc_cgx, lmac, true);
417 : : }
418 : :
419 : : int
420 : 0 : roc_bphy_cgx_ptp_rx_disable(struct roc_bphy_cgx *roc_cgx, unsigned int lmac)
421 : : {
422 : 0 : return roc_bphy_cgx_ptp_rx_ena_dis(roc_cgx, lmac, false);
423 : : }
424 : :
425 : : int
426 : 0 : roc_bphy_cgx_fec_set(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
427 : : enum roc_bphy_cgx_eth_link_fec fec)
428 : : {
429 : : uint64_t scr1, scr0;
430 : :
431 [ # # ]: 0 : if (!roc_cgx)
432 : : return -EINVAL;
433 : :
434 [ # # ]: 0 : if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
435 : : return -ENODEV;
436 : :
437 : 0 : scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_SET_FEC) |
438 : 0 : FIELD_PREP(SCR1_ETH_SET_FEC_ARGS, fec);
439 : :
440 : 0 : return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
441 : : }
442 : :
443 : : int
444 : 0 : roc_bphy_cgx_fec_supported_get(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
445 : : enum roc_bphy_cgx_eth_link_fec *fec)
446 : : {
447 : : uint64_t scr1, scr0;
448 : : int ret;
449 : :
450 [ # # ]: 0 : if (!roc_cgx || !fec)
451 : : return -EINVAL;
452 : :
453 [ # # ]: 0 : if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
454 : : return -ENODEV;
455 : :
456 : : scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_GET_SUPPORTED_FEC);
457 : :
458 : 0 : ret = roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
459 [ # # ]: 0 : if (ret)
460 : : return ret;
461 : :
462 : 0 : scr0 = FIELD_GET(SCR0_ETH_FEC_TYPES_S_FEC, scr0);
463 : 0 : *fec = (enum roc_bphy_cgx_eth_link_fec)scr0;
464 : :
465 : 0 : return 0;
466 : : }
467 : :
468 : : int
469 [ # # ]: 0 : roc_bphy_cgx_cpri_mode_change(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
470 : : struct roc_bphy_cgx_cpri_mode_change *mode)
471 : : {
472 : : uint64_t scr1, scr0;
473 : :
474 [ # # # # : 0 : if (!(roc_model_is_cnf95xxn_a0() ||
# # ]
475 : : roc_model_is_cnf95xxn_a1() ||
476 : : roc_model_is_cnf95xxn_b0()))
477 : : return -ENOTSUP;
478 : :
479 [ # # ]: 0 : if (!roc_cgx)
480 : : return -EINVAL;
481 : :
482 [ # # ]: 0 : if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
483 : : return -ENODEV;
484 : :
485 [ # # ]: 0 : if (!mode)
486 : : return -EINVAL;
487 : :
488 : 0 : scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_CPRI_MODE_CHANGE) |
489 : 0 : FIELD_PREP(SCR1_CPRI_MODE_CHANGE_ARGS_GSERC_IDX,
490 : 0 : mode->gserc_idx) |
491 : 0 : FIELD_PREP(SCR1_CPRI_MODE_CHANGE_ARGS_LANE_IDX, mode->lane_idx) |
492 : 0 : FIELD_PREP(SCR1_CPRI_MODE_CHANGE_ARGS_RATE, mode->rate) |
493 : 0 : FIELD_PREP(SCR1_CPRI_MODE_CHANGE_ARGS_DISABLE_LEQ,
494 : 0 : mode->disable_leq) |
495 : 0 : FIELD_PREP(SCR1_CPRI_MODE_CHANGE_ARGS_DISABLE_DFE,
496 : : mode->disable_dfe);
497 : :
498 : 0 : return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
499 : : }
500 : :
501 : : int
502 [ # # ]: 0 : roc_bphy_cgx_cpri_mode_tx_control(struct roc_bphy_cgx *roc_cgx,
503 : : unsigned int lmac,
504 : : struct roc_bphy_cgx_cpri_mode_tx_ctrl *mode)
505 : : {
506 : : uint64_t scr1, scr0;
507 : :
508 [ # # # # : 0 : if (!(roc_model_is_cnf95xxn_a0() ||
# # ]
509 : : roc_model_is_cnf95xxn_a1() ||
510 : : roc_model_is_cnf95xxn_b0()))
511 : : return -ENOTSUP;
512 : :
513 [ # # ]: 0 : if (!roc_cgx)
514 : : return -EINVAL;
515 : :
516 [ # # ]: 0 : if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
517 : : return -ENODEV;
518 : :
519 [ # # ]: 0 : if (!mode)
520 : : return -EINVAL;
521 : :
522 : 0 : scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_CPRI_TX_CONTROL) |
523 : 0 : FIELD_PREP(SCR1_CPRI_MODE_TX_CTRL_ARGS_GSERC_IDX,
524 : 0 : mode->gserc_idx) |
525 : 0 : FIELD_PREP(SCR1_CPRI_MODE_TX_CTRL_ARGS_LANE_IDX,
526 : 0 : mode->lane_idx) |
527 : 0 : FIELD_PREP(SCR1_CPRI_MODE_TX_CTRL_ARGS_ENABLE, mode->enable);
528 : :
529 : 0 : return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
530 : : }
531 : :
532 : : int
533 [ # # ]: 0 : roc_bphy_cgx_cpri_mode_misc(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
534 : : struct roc_bphy_cgx_cpri_mode_misc *mode)
535 : : {
536 : : uint64_t scr1, scr0;
537 : :
538 [ # # # # : 0 : if (!(roc_model_is_cnf95xxn_a0() ||
# # ]
539 : : roc_model_is_cnf95xxn_a1() ||
540 : : roc_model_is_cnf95xxn_b0()))
541 : : return -ENOTSUP;
542 : :
543 [ # # ]: 0 : if (!roc_cgx)
544 : : return -EINVAL;
545 : :
546 [ # # ]: 0 : if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
547 : : return -ENODEV;
548 : :
549 [ # # ]: 0 : if (!mode)
550 : : return -EINVAL;
551 : :
552 : 0 : scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_CPRI_MISC) |
553 : 0 : FIELD_PREP(SCR1_CPRI_MODE_MISC_ARGS_GSERC_IDX,
554 : 0 : mode->gserc_idx) |
555 : 0 : FIELD_PREP(SCR1_CPRI_MODE_MISC_ARGS_LANE_IDX,
556 : 0 : mode->lane_idx) |
557 : 0 : FIELD_PREP(SCR1_CPRI_MODE_MISC_ARGS_FLAGS, mode->flags);
558 : :
559 : 0 : return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
560 : : }
|