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 : : bool 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 : scr1 = state ? FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_LINK_BRING_UP) :
325 : : FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_LINK_BRING_DOWN);
326 : :
327 : 0 : return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
328 : : }
329 : :
330 : : int
331 : 0 : roc_bphy_cgx_get_linkinfo(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
332 : : struct roc_bphy_cgx_link_info *info)
333 : : {
334 : : uint64_t scr1, scr0;
335 : : int ret;
336 : :
337 [ # # ]: 0 : if (!roc_cgx)
338 : : return -EINVAL;
339 : :
340 [ # # ]: 0 : if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
341 : : return -ENODEV;
342 : :
343 [ # # ]: 0 : if (!info)
344 : : return -EINVAL;
345 : :
346 : : scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_GET_LINK_STS);
347 : 0 : ret = roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
348 [ # # ]: 0 : if (ret)
349 : : return ret;
350 : :
351 : 0 : info->link_up = FIELD_GET(SCR0_ETH_LNK_STS_S_LINK_UP, scr0);
352 : 0 : info->full_duplex = FIELD_GET(SCR0_ETH_LNK_STS_S_FULL_DUPLEX, scr0);
353 : 0 : info->speed = FIELD_GET(SCR0_ETH_LNK_STS_S_SPEED, scr0);
354 : 0 : info->an = FIELD_GET(SCR0_ETH_LNK_STS_S_AN, scr0);
355 : 0 : info->fec = FIELD_GET(SCR0_ETH_LNK_STS_S_FEC, scr0);
356 : 0 : info->mode = FIELD_GET(SCR0_ETH_LNK_STS_S_MODE, scr0);
357 : :
358 : 0 : return 0;
359 : : }
360 : :
361 : : int
362 [ # # ]: 0 : roc_bphy_cgx_set_link_mode(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
363 : : struct roc_bphy_cgx_link_mode *mode)
364 : : {
365 : : uint64_t scr1, scr0;
366 : :
367 [ # # ]: 0 : if (roc_model_is_cn9k() &&
368 [ # # # # : 0 : (mode->use_portm_idx || mode->portm_idx || mode->mode_group_idx)) {
# # ]
369 : : return -ENOTSUP;
370 : : }
371 : :
372 [ # # ]: 0 : if (!roc_cgx)
373 : : return -EINVAL;
374 : :
375 [ # # ]: 0 : if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
376 : : return -ENODEV;
377 : :
378 [ # # ]: 0 : if (!mode)
379 : : return -EINVAL;
380 : :
381 : 0 : scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_MODE_CHANGE) |
382 : 0 : FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_SPEED, mode->speed) |
383 : 0 : FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_DUPLEX, mode->full_duplex) |
384 : 0 : FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_AN, mode->an) |
385 : 0 : FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_USE_PORTM_IDX,
386 : 0 : mode->use_portm_idx) |
387 : 0 : FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_PORTM_IDX,
388 : 0 : mode->portm_idx) |
389 : 0 : FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_MODE_GROUP_IDX,
390 : 0 : mode->mode_group_idx) |
391 : 0 : FIELD_PREP(SCR1_ETH_MODE_CHANGE_ARGS_MODE, BIT_ULL(mode->mode));
392 : :
393 : 0 : return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
394 : : }
395 : :
396 : : int
397 : 0 : roc_bphy_cgx_intlbk_enable(struct roc_bphy_cgx *roc_cgx, unsigned int lmac)
398 : : {
399 : 0 : return roc_bphy_cgx_intlbk_ena_dis(roc_cgx, lmac, true);
400 : : }
401 : :
402 : : int
403 : 0 : roc_bphy_cgx_intlbk_disable(struct roc_bphy_cgx *roc_cgx, unsigned int lmac)
404 : : {
405 : 0 : return roc_bphy_cgx_intlbk_ena_dis(roc_cgx, lmac, false);
406 : : }
407 : :
408 : : int
409 : 0 : roc_bphy_cgx_ptp_rx_enable(struct roc_bphy_cgx *roc_cgx, unsigned int lmac)
410 : : {
411 : 0 : return roc_bphy_cgx_ptp_rx_ena_dis(roc_cgx, lmac, true);
412 : : }
413 : :
414 : : int
415 : 0 : roc_bphy_cgx_ptp_rx_disable(struct roc_bphy_cgx *roc_cgx, unsigned int lmac)
416 : : {
417 : 0 : return roc_bphy_cgx_ptp_rx_ena_dis(roc_cgx, lmac, false);
418 : : }
419 : :
420 : : int
421 : 0 : roc_bphy_cgx_fec_set(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
422 : : enum roc_bphy_cgx_eth_link_fec fec)
423 : : {
424 : : uint64_t scr1, scr0;
425 : :
426 [ # # ]: 0 : if (!roc_cgx)
427 : : return -EINVAL;
428 : :
429 [ # # ]: 0 : if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
430 : : return -ENODEV;
431 : :
432 : 0 : scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_SET_FEC) |
433 : 0 : FIELD_PREP(SCR1_ETH_SET_FEC_ARGS, fec);
434 : :
435 : 0 : return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
436 : : }
437 : :
438 : : int
439 : 0 : roc_bphy_cgx_fec_supported_get(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
440 : : enum roc_bphy_cgx_eth_link_fec *fec)
441 : : {
442 : : uint64_t scr1, scr0;
443 : : int ret;
444 : :
445 [ # # ]: 0 : if (!roc_cgx || !fec)
446 : : return -EINVAL;
447 : :
448 [ # # ]: 0 : if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
449 : : return -ENODEV;
450 : :
451 : : scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_GET_SUPPORTED_FEC);
452 : :
453 : 0 : ret = roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
454 [ # # ]: 0 : if (ret)
455 : : return ret;
456 : :
457 : 0 : scr0 = FIELD_GET(SCR0_ETH_FEC_TYPES_S_FEC, scr0);
458 : 0 : *fec = (enum roc_bphy_cgx_eth_link_fec)scr0;
459 : :
460 : 0 : return 0;
461 : : }
462 : :
463 : : int
464 [ # # ]: 0 : roc_bphy_cgx_cpri_mode_change(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
465 : : struct roc_bphy_cgx_cpri_mode_change *mode)
466 : : {
467 : : uint64_t scr1, scr0;
468 : :
469 [ # # # # : 0 : if (!(roc_model_is_cnf95xxn_a0() ||
# # ]
470 : : roc_model_is_cnf95xxn_a1() ||
471 : : roc_model_is_cnf95xxn_b0()))
472 : : return -ENOTSUP;
473 : :
474 [ # # ]: 0 : if (!roc_cgx)
475 : : return -EINVAL;
476 : :
477 [ # # ]: 0 : if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
478 : : return -ENODEV;
479 : :
480 [ # # ]: 0 : if (!mode)
481 : : return -EINVAL;
482 : :
483 : 0 : scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_CPRI_MODE_CHANGE) |
484 : 0 : FIELD_PREP(SCR1_CPRI_MODE_CHANGE_ARGS_GSERC_IDX,
485 : 0 : mode->gserc_idx) |
486 : 0 : FIELD_PREP(SCR1_CPRI_MODE_CHANGE_ARGS_LANE_IDX, mode->lane_idx) |
487 : 0 : FIELD_PREP(SCR1_CPRI_MODE_CHANGE_ARGS_RATE, mode->rate) |
488 : 0 : FIELD_PREP(SCR1_CPRI_MODE_CHANGE_ARGS_DISABLE_LEQ,
489 : 0 : mode->disable_leq) |
490 : 0 : FIELD_PREP(SCR1_CPRI_MODE_CHANGE_ARGS_DISABLE_DFE,
491 : : mode->disable_dfe);
492 : :
493 : 0 : return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
494 : : }
495 : :
496 : : int
497 [ # # ]: 0 : roc_bphy_cgx_cpri_mode_tx_control(struct roc_bphy_cgx *roc_cgx,
498 : : unsigned int lmac,
499 : : struct roc_bphy_cgx_cpri_mode_tx_ctrl *mode)
500 : : {
501 : : uint64_t scr1, scr0;
502 : :
503 [ # # # # : 0 : if (!(roc_model_is_cnf95xxn_a0() ||
# # ]
504 : : roc_model_is_cnf95xxn_a1() ||
505 : : roc_model_is_cnf95xxn_b0()))
506 : : return -ENOTSUP;
507 : :
508 [ # # ]: 0 : if (!roc_cgx)
509 : : return -EINVAL;
510 : :
511 [ # # ]: 0 : if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
512 : : return -ENODEV;
513 : :
514 [ # # ]: 0 : if (!mode)
515 : : return -EINVAL;
516 : :
517 : 0 : scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_CPRI_TX_CONTROL) |
518 : 0 : FIELD_PREP(SCR1_CPRI_MODE_TX_CTRL_ARGS_GSERC_IDX,
519 : 0 : mode->gserc_idx) |
520 : 0 : FIELD_PREP(SCR1_CPRI_MODE_TX_CTRL_ARGS_LANE_IDX,
521 : 0 : mode->lane_idx) |
522 : 0 : FIELD_PREP(SCR1_CPRI_MODE_TX_CTRL_ARGS_ENABLE, mode->enable);
523 : :
524 : 0 : return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
525 : : }
526 : :
527 : : int
528 [ # # ]: 0 : roc_bphy_cgx_cpri_mode_misc(struct roc_bphy_cgx *roc_cgx, unsigned int lmac,
529 : : struct roc_bphy_cgx_cpri_mode_misc *mode)
530 : : {
531 : : uint64_t scr1, scr0;
532 : :
533 [ # # # # : 0 : if (!(roc_model_is_cnf95xxn_a0() ||
# # ]
534 : : roc_model_is_cnf95xxn_a1() ||
535 : : roc_model_is_cnf95xxn_b0()))
536 : : return -ENOTSUP;
537 : :
538 [ # # ]: 0 : if (!roc_cgx)
539 : : return -EINVAL;
540 : :
541 [ # # ]: 0 : if (!roc_bphy_cgx_lmac_exists(roc_cgx, lmac))
542 : : return -ENODEV;
543 : :
544 [ # # ]: 0 : if (!mode)
545 : : return -EINVAL;
546 : :
547 : 0 : scr1 = FIELD_PREP(SCR1_ETH_CMD_ID, ETH_CMD_CPRI_MISC) |
548 : 0 : FIELD_PREP(SCR1_CPRI_MODE_MISC_ARGS_GSERC_IDX,
549 : 0 : mode->gserc_idx) |
550 : 0 : FIELD_PREP(SCR1_CPRI_MODE_MISC_ARGS_LANE_IDX,
551 : 0 : mode->lane_idx) |
552 : 0 : FIELD_PREP(SCR1_CPRI_MODE_MISC_ARGS_FLAGS, mode->flags);
553 : :
554 : 0 : return roc_bphy_cgx_intf_req(roc_cgx, lmac, scr1, &scr0);
555 : : }
|