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