blob: 39260d86492e43ae9c76680d9897382123ad3737 [file] [log] [blame]
Aaron Williams3bda89d2020-12-11 17:05:24 +01001/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright (C) 2020 Marvell International Ltd.
4 *
5 * Helper Functions for the Configuration Framework
6 *
7 * OCTEON_CN68XX introduces a flexible hw interface configuration
8 * scheme. To cope with this change and the requirements of
9 * configurability for other system resources, e.g., IPD/PIP pknd and
10 * PKO ports and queues, a configuration framework for the SDK is
11 * designed. It has two goals: first to recognize and establish the
12 * default configuration and, second, to allow the user to define key
13 * parameters in a high-level language.
14 *
15 * The helper functions query the QLM setup to help achieving the
16 * first goal.
17 *
18 * The second goal is accomplished by generating
19 * cvmx_helper_cfg_init() from a high-level lanaguage.
20 */
21
22#ifndef __CVMX_HELPER_CFG_H__
23#define __CVMX_HELPER_CFG_H__
24
25#include "cvmx-helper-util.h"
26
27#define CVMX_HELPER_CFG_MAX_PKO_PORT 128
28#define CVMX_HELPER_CFG_MAX_PIP_BPID 64
29#define CVMX_HELPER_CFG_MAX_PIP_PKND 64
30#define CVMX_HELPER_CFG_MAX_PKO_QUEUES 256
31#define CVMX_HELPER_CFG_MAX_PORT_PER_IFACE 256
32
33#define CVMX_HELPER_CFG_INVALID_VALUE -1
34
35#define cvmx_helper_cfg_assert(cond) \
36 do { \
37 if (!(cond)) { \
38 debug("cvmx_helper_cfg_assert (%s) at %s:%d\n", #cond, __FILE__, \
39 __LINE__); \
40 } \
41 } while (0)
42
43extern int cvmx_npi_max_pknds;
44
45/*
46 * Config Options
47 *
48 * These options have to be set via cvmx_helper_cfg_opt_set() before calling the
49 * routines that set up the hw. These routines process the options and set them
50 * correctly to take effect at runtime.
51 */
52enum cvmx_helper_cfg_option {
53 CVMX_HELPER_CFG_OPT_USE_DWB, /*
54 * Global option to control if
55 * the SDK configures units (DMA,
56 * SSO, and PKO) to send don't
57 * write back (DWB) requests for
58 * freed buffers. Set to 1/0 to
59 * enable/disable DWB.
60 *
61 * For programs that fit inside
62 * L2, sending DWB just causes
63 * more L2 operations without
64 * benefit.
65 */
66
67 CVMX_HELPER_CFG_OPT_MAX
68};
69
70typedef enum cvmx_helper_cfg_option cvmx_helper_cfg_option_t;
71
72struct cvmx_phy_info;
73struct cvmx_fdt_sfp_info;
74struct cvmx_vsc7224_chan;
75struct phy_device;
76
77struct cvmx_srio_port_param {
78 /** True to override SRIO CTLE zero setting */
79 bool srio_rx_ctle_zero_override : 1;
80 /** Equalization peaking control dft: 6 */
81 u8 srio_rx_ctle_zero : 4;
82 /** Set true to override CTLE taps */
83 bool srio_rx_ctle_agc_override : 1;
84 u8 srio_rx_agc_pre_ctle : 4; /** AGC pre-CTLE gain */
85 u8 srio_rx_agc_post_ctle : 4; /** AGC post-CTLE gain */
86 bool srio_tx_swing_override : 1; /** True to override TX Swing */
87 u8 srio_tx_swing : 5; /** TX Swing */
88 bool srio_tx_gain_override : 1; /** True to override TX gain */
89 u8 srio_tx_gain : 3; /** TX gain */
90 bool srio_tx_premptap_override : 1; /** True to override premptap values */
91 u8 srio_tx_premptap_pre : 4; /** Pre premptap value */
92 u8 srio_tx_premptap_post : 5; /** Post premptap value */
93 bool srio_tx_vboost_override : 1; /** True to override TX vboost setting */
94 bool srio_tx_vboost : 1; /** vboost setting (default 1) */
95};
96
97/*
98 * Per physical port
99 * Note: This struct is passed between linux and SE apps.
100 */
101struct cvmx_cfg_port_param {
102 int port_fdt_node; /** Node offset in FDT of node */
103 int phy_fdt_node; /** Node offset in FDT of PHY */
104 struct cvmx_phy_info *phy_info; /** Data structure with PHY information */
105 int8_t ccpp_pknd;
106 int8_t ccpp_bpid;
107 int8_t ccpp_pko_port_base;
108 int8_t ccpp_pko_num_ports;
109 u8 agl_rx_clk_skew; /** AGL rx clock skew setting (default 0) */
110 u8 rgmii_tx_clk_delay; /** RGMII TX clock delay value if not bypassed */
111 bool valid : 1; /** 1 = port valid, 0 = invalid */
112 bool sgmii_phy_mode : 1; /** 1 = port in PHY mode, 0 = MAC mode */
113 bool sgmii_1000x_mode : 1; /** 1 = 1000Base-X mode, 0 = SGMII mode */
114 bool agl_rx_clk_delay_bypass : 1; /** 1 = use rx clock delay bypass for AGL mode */
115 bool force_link_up : 1; /** Ignore PHY and always report link up */
116 bool disable_an : 1; /** true to disable autonegotiation */
117 bool link_down_pwr_dn : 1; /** Power PCS off when link is down */
118 bool phy_present : 1; /** true if PHY is present */
119 bool tx_clk_delay_bypass : 1; /** True to bypass the TX clock delay */
120 bool enable_fec : 1; /** True to enable FEC for 10/40G links */
121 /** Settings for short-run SRIO host */
122 struct cvmx_srio_port_param srio_short;
123 /** Settings for long-run SRIO host */
124 struct cvmx_srio_port_param srio_long;
125 u8 agl_refclk_sel; /** RGMII refclk select to use */
126 /** Set if local (non-PHY) LEDs are used */
127 struct cvmx_phy_gpio_leds *gpio_leds;
128 struct cvmx_fdt_sfp_info *sfp_info; /** SFP+/QSFP info for port */
129 /** Offset of SFP/SFP+/QSFP slot in device tree */
130 int sfp_of_offset;
131 /** Microsemi VSC7224 channel info data structure */
132 struct cvmx_vsc7224_chan *vsc7224_chan;
133 /** Avago AVSP-5410 Phy */
134 struct cvmx_avsp5410 *avsp5410;
135 struct phy_device *phydev;
136};
137
138/*
139 * Per pko_port
140 */
141struct cvmx_cfg_pko_port_param {
142 s16 ccppp_queue_base;
143 s16 ccppp_num_queues;
144};
145
146/*
147 * A map from pko_port to
148 * interface,
149 * index, and
150 * pko engine id
151 */
152struct cvmx_cfg_pko_port_map {
153 s16 ccppl_interface;
154 s16 ccppl_index;
155 s16 ccppl_eid;
156};
157
158/*
159 * This is for looking up pko_base_port and pko_nport for ipd_port
160 */
161struct cvmx_cfg_pko_port_pair {
162 int8_t ccppp_base_port;
163 int8_t ccppp_nports;
164};
165
166typedef union cvmx_user_static_pko_queue_config {
167 struct {
168 struct pko_queues_cfg {
169 unsigned queues_per_port : 11, qos_enable : 1, pfc_enable : 1;
170 } pko_cfg_iface[6];
171 struct pko_queues_cfg pko_cfg_loop;
172 struct pko_queues_cfg pko_cfg_npi;
173 } pknd;
174 struct {
175 u8 pko_ports_per_interface[5];
176 u8 pko_queues_per_port_interface[5];
177 u8 pko_queues_per_port_loop;
178 u8 pko_queues_per_port_pci;
179 u8 pko_queues_per_port_srio[4];
180 } non_pknd;
181} cvmx_user_static_pko_queue_config_t;
182
183extern cvmx_user_static_pko_queue_config_t __cvmx_pko_queue_static_config[CVMX_MAX_NODES];
184extern struct cvmx_cfg_pko_port_map cvmx_cfg_pko_port_map[CVMX_HELPER_CFG_MAX_PKO_PORT];
185extern struct cvmx_cfg_port_param cvmx_cfg_port[CVMX_MAX_NODES][CVMX_HELPER_MAX_IFACE]
186 [CVMX_HELPER_CFG_MAX_PORT_PER_IFACE];
187extern struct cvmx_cfg_pko_port_param cvmx_pko_queue_table[];
188extern int cvmx_enable_helper_flag;
189
190/*
191 * @INTERNAL
192 * Return configured pknd for the port
193 *
194 * @param interface the interface number
195 * @param index the port's index number
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100196 * Return: the pknd
Aaron Williams3bda89d2020-12-11 17:05:24 +0100197 */
198int __cvmx_helper_cfg_pknd(int interface, int index);
199
200/*
201 * @INTERNAL
202 * Return the configured bpid for the port
203 *
204 * @param interface the interface number
205 * @param index the port's index number
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100206 * Return: the bpid
Aaron Williams3bda89d2020-12-11 17:05:24 +0100207 */
208int __cvmx_helper_cfg_bpid(int interface, int index);
209
210/**
211 * @INTERNAL
212 * Return the configured pko_port base for the port
213 *
214 * @param interface the interface number
215 * @param index the port's index number
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100216 * Return: the pko_port base
Aaron Williams3bda89d2020-12-11 17:05:24 +0100217 */
218int __cvmx_helper_cfg_pko_port_base(int interface, int index);
219
220/*
221 * @INTERNAL
222 * Return the configured number of pko_ports for the port
223 *
224 * @param interface the interface number
225 * @param index the port's index number
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100226 * Return: the number of pko_ports
Aaron Williams3bda89d2020-12-11 17:05:24 +0100227 */
228int __cvmx_helper_cfg_pko_port_num(int interface, int index);
229
230/*
231 * @INTERNAL
232 * Return the configured pko_queue base for the pko_port
233 *
234 * @param pko_port
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100235 * Return: the pko_queue base
Aaron Williams3bda89d2020-12-11 17:05:24 +0100236 */
237int __cvmx_helper_cfg_pko_queue_base(int pko_port);
238
239/*
240 * @INTERNAL
241 * Return the configured number of pko_queues for the pko_port
242 *
243 * @param pko_port
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100244 * Return: the number of pko_queues
Aaron Williams3bda89d2020-12-11 17:05:24 +0100245 */
246int __cvmx_helper_cfg_pko_queue_num(int pko_port);
247
248/*
249 * @INTERNAL
250 * Return the interface the pko_port is configured for
251 *
252 * @param pko_port
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100253 * Return: the interface for the pko_port
Aaron Williams3bda89d2020-12-11 17:05:24 +0100254 */
255int __cvmx_helper_cfg_pko_port_interface(int pko_port);
256
257/*
258 * @INTERNAL
259 * Return the index of the port the pko_port is configured for
260 *
261 * @param pko_port
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100262 * Return: the index of the port
Aaron Williams3bda89d2020-12-11 17:05:24 +0100263 */
264int __cvmx_helper_cfg_pko_port_index(int pko_port);
265
266/*
267 * @INTERNAL
268 * Return the pko_eid of the pko_port
269 *
270 * @param pko_port
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100271 * Return: the pko_eid
Aaron Williams3bda89d2020-12-11 17:05:24 +0100272 */
273int __cvmx_helper_cfg_pko_port_eid(int pko_port);
274
275/*
276 * @INTERNAL
277 * Return the max# of pko queues allocated.
278 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100279 * Return: the max# of pko queues
Aaron Williams3bda89d2020-12-11 17:05:24 +0100280 *
281 * Note: there might be holes in the queue space depending on user
282 * configuration. The function returns the highest queue's index in
283 * use.
284 */
285int __cvmx_helper_cfg_pko_max_queue(void);
286
287/*
288 * @INTERNAL
289 * Return the max# of PKO DMA engines allocated.
290 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100291 * Return: the max# of DMA engines
Aaron Williams3bda89d2020-12-11 17:05:24 +0100292 *
293 * NOTE: the DMA engines are allocated contiguously and starting from
294 * 0.
295 */
296int __cvmx_helper_cfg_pko_max_engine(void);
297
298/*
299 * Get the value set for the config option ``opt''.
300 *
301 * @param opt is the config option.
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100302 * Return: the value set for the option
Aaron Williams3bda89d2020-12-11 17:05:24 +0100303 *
304 * LR: only used for DWB in NPI, POW, PKO1
305 */
306u64 cvmx_helper_cfg_opt_get(cvmx_helper_cfg_option_t opt);
307
308/*
309 * Set the value for a config option.
310 *
311 * @param opt is the config option.
312 * @param val is the value to set for the opt.
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100313 * Return: 0 for success and -1 on error
Aaron Williams3bda89d2020-12-11 17:05:24 +0100314 *
315 * Note an option here is a config-time parameter and this means that
316 * it has to be set before calling the corresponding setup functions
317 * that actually sets the option in hw.
318 *
319 * LR: Not used.
320 */
321int cvmx_helper_cfg_opt_set(cvmx_helper_cfg_option_t opt, u64 val);
322
323/*
324 * Retrieve the pko_port base given ipd_port.
325 *
326 * @param ipd_port is the IPD eport
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100327 * Return: the corresponding PKO port base for the physical port
Aaron Williams3bda89d2020-12-11 17:05:24 +0100328 * represented by the IPD eport or CVMX_HELPER_CFG_INVALID_VALUE.
329 */
330int cvmx_helper_cfg_ipd2pko_port_base(int ipd_port);
331
332/*
333 * Retrieve the number of pko_ports given ipd_port.
334 *
335 * @param ipd_port is the IPD eport
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100336 * Return: the corresponding number of PKO ports for the physical port
Aaron Williams3bda89d2020-12-11 17:05:24 +0100337 * represented by IPD eport or CVMX_HELPER_CFG_INVALID_VALUE.
338 */
339int cvmx_helper_cfg_ipd2pko_port_num(int ipd_port);
340
341/*
342 * @INTERNAL
343 * The init function
344 *
345 * @param node
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100346 * Return: 0 for success.
Aaron Williams3bda89d2020-12-11 17:05:24 +0100347 *
348 * Note: this function is meant to be called to set the ``configured
349 * parameters,'' e.g., pknd, bpid, etc. and therefore should be before
350 * any of the corresponding cvmx_helper_cfg_xxxx() functions are
351 * called.
352 */
353int __cvmx_helper_init_port_config_data(int node);
354
355/*
356 * @INTERNAL
357 * The local init function
358 *
359 * @param none
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100360 * Return: 0 for success.
Aaron Williams3bda89d2020-12-11 17:05:24 +0100361 *
362 * Note: this function is meant to be called to set the ``configured
363 * parameters locally,'' e.g., pknd, bpid, etc. and therefore should be before
364 * any of the corresponding cvmx_helper_cfg_xxxx() functions are
365 * called.
366 */
367int __cvmx_helper_init_port_config_data_local(void);
368
369/*
370 * Set the frame max size and jabber size to 65535.
371 *
372 */
373void cvmx_helper_cfg_set_jabber_and_frame_max(void);
374
375/*
376 * Enable storing short packets only in the WQE.
377 */
378void cvmx_helper_cfg_store_short_packets_in_wqe(void);
379
380/*
381 * Allocated a block of internal ports and queues for the specified
382 * interface/port
383 *
384 * @param interface the interface for which the internal ports and queues
385 * are requested
386 * @param port the index of the port within in the interface for which
387 the internal ports and queues are requested.
388 * @param pot_count the number of internal ports requested
389 * @param queue_cnt the number of queues requested for each of the internal
390 * port. This call will allocate a total of
391 * (port_cnt * queue_cnt) queues
392 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100393 * Return: 0 on success
Aaron Williams3bda89d2020-12-11 17:05:24 +0100394 * -1 on failure
395 *
396 * LR: Called ONLY from comfig-parse!
397 */
398int cvmx_pko_alloc_iport_and_queues(int interface, int port, int port_cnt, int queue_cnt);
399
400/*
401 * Free the queues that are associated with the specified port
402 *
403 * @param port the internal port for which the queues are freed.
404 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100405 * Return: 0 on success
Aaron Williams3bda89d2020-12-11 17:05:24 +0100406 * -1 on failure
407 */
408int cvmx_pko_queue_free(u64 port);
409
410/*
411 * Initializes the pko queue range data structure.
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100412 * Return: 0 on success
Aaron Williams3bda89d2020-12-11 17:05:24 +0100413 * -1 on failure
414 */
415int init_cvmx_pko_que_range(void);
416
417/*
418 * Frees up all the allocated ques.
419 */
420void cvmx_pko_queue_free_all(void);
421
422/**
423 * Returns if port is valid for a given interface
424 *
425 * @param xiface interface to check
426 * @param index port index in the interface
427 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100428 * Return: status of the port present or not.
Aaron Williams3bda89d2020-12-11 17:05:24 +0100429 */
430int cvmx_helper_is_port_valid(int xiface, int index);
431
432/**
433 * Set whether or not a port is valid
434 *
435 * @param interface interface to set
436 * @param index port index to set
437 * @param valid set 0 to make port invalid, 1 for valid
438 */
439void cvmx_helper_set_port_valid(int interface, int index, bool valid);
440
441/**
442 * @INTERNAL
443 * Return if port is in PHY mode
444 *
445 * @param interface the interface number
446 * @param index the port's index number
447 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100448 * Return: 1 if port is in PHY mode, 0 if port is in MAC mode
Aaron Williams3bda89d2020-12-11 17:05:24 +0100449 */
450bool cvmx_helper_get_mac_phy_mode(int interface, int index);
451void cvmx_helper_set_mac_phy_mode(int interface, int index, bool valid);
452
453/**
454 * @INTERNAL
455 * Return if port is in 1000Base X mode
456 *
457 * @param interface the interface number
458 * @param index the port's index number
459 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100460 * Return: 1 if port is in 1000Base X mode, 0 if port is in SGMII mode
Aaron Williams3bda89d2020-12-11 17:05:24 +0100461 */
462bool cvmx_helper_get_1000x_mode(int interface, int index);
463void cvmx_helper_set_1000x_mode(int interface, int index, bool valid);
464
465/**
466 * @INTERNAL
467 * Return if an AGL port should bypass the RX clock delay
468 *
469 * @param interface the interface number
470 * @param index the port's index number
471 */
472bool cvmx_helper_get_agl_rx_clock_delay_bypass(int interface, int index);
473void cvmx_helper_set_agl_rx_clock_delay_bypass(int interface, int index, bool valid);
474
475/**
476 * @INTERNAL
477 * Forces a link to always return that it is up ignoring the PHY (if present)
478 *
479 * @param interface the interface number
480 * @param index the port's index
481 */
482bool cvmx_helper_get_port_force_link_up(int interface, int index);
483void cvmx_helper_set_port_force_link_up(int interface, int index, bool value);
484
485/**
486 * @INTERNAL
487 * Return true if PHY is present to the passed xiface
488 *
489 * @param xiface the interface number
490 * @param index the port's index
491 */
492bool cvmx_helper_get_port_phy_present(int xiface, int index);
493void cvmx_helper_set_port_phy_present(int xiface, int index, bool value);
494
495/**
496 * @INTERNAL
497 * Return the AGL port rx clock skew, only used
498 * if agl_rx_clock_delay_bypass is set.
499 *
500 * @param interface the interface number
501 * @param index the port's index number
502 */
503u8 cvmx_helper_get_agl_rx_clock_skew(int interface, int index);
504void cvmx_helper_set_agl_rx_clock_skew(int interface, int index, u8 value);
505u8 cvmx_helper_get_agl_refclk_sel(int interface, int index);
506void cvmx_helper_set_agl_refclk_sel(int interface, int index, u8 value);
507
508/**
509 * @INTERNAL
510 * Store the FDT node offset in the device tree of a port
511 *
512 * @param xiface node and interface
513 * @param index port index
514 * @param node_offset node offset to store
515 */
516void cvmx_helper_set_port_fdt_node_offset(int xiface, int index, int node_offset);
517
518/**
519 * @INTERNAL
520 * Return the FDT node offset in the device tree of a port
521 *
522 * @param xiface node and interface
523 * @param index port index
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100524 * Return: node offset of port or -1 if invalid
Aaron Williams3bda89d2020-12-11 17:05:24 +0100525 */
526int cvmx_helper_get_port_fdt_node_offset(int xiface, int index);
527
528/**
529 * @INTERNAL
530 * Store the FDT node offset in the device tree of a phy
531 *
532 * @param xiface node and interface
533 * @param index port index
534 * @param node_offset node offset to store
535 */
536void cvmx_helper_set_phy_fdt_node_offset(int xiface, int index, int node_offset);
537
538/**
539 * @INTERNAL
540 * Return the FDT node offset in the device tree of a phy
541 *
542 * @param xiface node and interface
543 * @param index port index
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100544 * Return: node offset of phy or -1 if invalid
Aaron Williams3bda89d2020-12-11 17:05:24 +0100545 */
546int cvmx_helper_get_phy_fdt_node_offset(int xiface, int index);
547
548/**
549 * @INTERNAL
550 * Override default autonegotiation for a port
551 *
552 * @param xiface node and interface
553 * @param index port index
554 * @param enable true to enable autonegotiation, false to force full
555 * duplex, full speed.
556 */
557void cvmx_helper_set_port_autonegotiation(int xiface, int index, bool enable);
558
559/**
560 * @INTERNAL
561 * Returns if autonegotiation is enabled or not.
562 *
563 * @param xiface node and interface
564 * @param index port index
565 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100566 * Return: 0 if autonegotiation is disabled, 1 if enabled.
Aaron Williams3bda89d2020-12-11 17:05:24 +0100567 */
568bool cvmx_helper_get_port_autonegotiation(int xiface, int index);
569
570/**
571 * @INTERNAL
572 * Returns if forward error correction is enabled or not.
573 *
574 * @param xiface node and interface
575 * @param index port index
576 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100577 * Return: 0 if fec is disabled, 1 if enabled.
Aaron Williams3bda89d2020-12-11 17:05:24 +0100578 */
579bool cvmx_helper_get_port_fec(int xiface, int index);
580
581/**
582 * @INTERNAL
583 * Override default forward error correction for a port
584 *
585 * @param xiface node and interface
586 * @param index port index
587 * @param enable true to enable fec, false to disable.
588 */
589void cvmx_helper_set_port_fec(int xiface, int index, bool enable);
590
591/**
592 * @INTERNAL
593 * Configure the SRIO RX interface AGC settings in host mode
594 *
595 * @param xiface node and interface
596 * @param index lane
597 * @param long_run true for long run, false for short run
598 * @param agc_override true to put AGC in manual mode
599 * @param ctle_zero RX equalizer peaking control (default 0x6)
600 * @param agc_pre_ctle AGC pre-CTLE gain (default 0x5)
601 * @param agc_post_ctle AGC post-CTLE gain (default 0x4)
602 *
603 * NOTE: This must be called before SRIO is initialized to take effect
604 */
605void cvmx_helper_set_srio_rx(int xiface, int index, bool long_run, bool ctle_zero_override,
606 u8 ctle_zero, bool agc_override, u8 agc_pre_ctle, u8 agc_post_ctle);
607
608/**
609 * @INTERNAL
610 * Get the SRIO RX interface AGC settings for host mode
611 *
612 * @param xiface node and interface
613 * @param index lane
614 * @param long_run true for long run, false for short run
615 * @param[out] ctle_zero_override true if overridden
616 * @param[out] ctle_zero RX equalizer peaking control (default 0x6)
617 * @param[out] agc_override true to put AGC in manual mode
618 * @param[out] agc_pre_ctle AGC pre-CTLE gain (default 0x5)
619 * @param[out] agc_post_ctle AGC post-CTLE gain (default 0x4)
620 */
621void cvmx_helper_get_srio_rx(int xiface, int index, bool long_run, bool *ctle_zero_override,
622 u8 *ctle_zero, bool *agc_override, u8 *agc_pre_ctle,
623 u8 *agc_post_ctle);
624
625/**
626 * @INTERNAL
627 * Configure the SRIO TX interface for host mode
628 *
629 * @param xiface node and interface
630 * @param index lane
631 * @param long_run true for long run, false for short run
632 * @param tx_swing tx swing value to use (default 0x7), -1 to not
633 * override.
634 * @param tx_gain PCS SDS TX gain (default 0x3), -1 to not
635 * override
636 * @param tx_premptap_override true to override preemphasis control
637 * @param tx_premptap_pre preemphasis pre tap value (default 0x0)
638 * @param tx_premptap_post preemphasis post tap value (default 0xF)
639 * @param tx_vboost vboost enable (1 = enable, -1 = don't override)
640 * hardware default is 1.
641 *
642 * NOTE: This must be called before SRIO is initialized to take effect
643 */
644void cvmx_helper_set_srio_tx(int xiface, int index, bool long_run, int tx_swing, int tx_gain,
645 bool tx_premptap_override, u8 tx_premptap_pre, u8 tx_premptap_post,
646 int tx_vboost);
647
648/**
649 * @INTERNAL
650 * Get the SRIO TX interface settings for host mode
651 *
652 * @param xiface node and interface
653 * @param index lane
654 * @param long_run true for long run, false for short run
655 * @param[out] tx_swing_override true to override pcs_sds_txX_swing
656 * @param[out] tx_swing tx swing value to use (default 0x7)
657 * @param[out] tx_gain_override true to override default gain
658 * @param[out] tx_gain PCS SDS TX gain (default 0x3)
659 * @param[out] tx_premptap_override true to override preemphasis control
660 * @param[out] tx_premptap_pre preemphasis pre tap value (default 0x0)
661 * @param[out] tx_premptap_post preemphasis post tap value (default 0xF)
662 * @param[out] tx_vboost_override override vboost setting
663 * @param[out] tx_vboost vboost enable (default true)
664 */
665void cvmx_helper_get_srio_tx(int xiface, int index, bool long_run, bool *tx_swing_override,
666 u8 *tx_swing, bool *tx_gain_override, u8 *tx_gain,
667 bool *tx_premptap_override, u8 *tx_premptap_pre, u8 *tx_premptap_post,
668 bool *tx_vboost_override, bool *tx_vboost);
669
670/**
671 * @INTERNAL
672 * Sets the PHY info data structure
673 *
674 * @param xiface node and interface
675 * @param index port index
676 * @param[in] phy_info phy information data structure pointer
677 */
678void cvmx_helper_set_port_phy_info(int xiface, int index, struct cvmx_phy_info *phy_info);
679/**
680 * @INTERNAL
681 * Returns the PHY information data structure for a port
682 *
683 * @param xiface node and interface
684 * @param index port index
685 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100686 * Return: pointer to PHY information data structure or NULL if not set
Aaron Williams3bda89d2020-12-11 17:05:24 +0100687 */
688struct cvmx_phy_info *cvmx_helper_get_port_phy_info(int xiface, int index);
689
690/**
691 * @INTERNAL
692 * Returns a pointer to the PHY LED configuration (if local GPIOs drive them)
693 *
694 * @param xiface node and interface
695 * @param index portindex
696 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100697 * Return: pointer to the PHY LED information data structure or NULL if not
Aaron Williams3bda89d2020-12-11 17:05:24 +0100698 * present
699 */
700struct cvmx_phy_gpio_leds *cvmx_helper_get_port_phy_leds(int xiface, int index);
701
702/**
703 * @INTERNAL
704 * Sets a pointer to the PHY LED configuration (if local GPIOs drive them)
705 *
706 * @param xiface node and interface
707 * @param index portindex
708 * @param leds pointer to led data structure
709 */
710void cvmx_helper_set_port_phy_leds(int xiface, int index, struct cvmx_phy_gpio_leds *leds);
711
712/**
713 * @INTERNAL
714 * Disables RGMII TX clock bypass and sets delay value
715 *
716 * @param xiface node and interface
717 * @param index portindex
718 * @param bypass Set true to enable the clock bypass and false
719 * to sync clock and data synchronously.
720 * Default is false.
721 * @param clk_delay Delay value to skew TXC from TXD
722 */
723void cvmx_helper_cfg_set_rgmii_tx_clk_delay(int xiface, int index, bool bypass, int clk_delay);
724
725/**
726 * @INTERNAL
727 * Gets RGMII TX clock bypass and delay value
728 *
729 * @param xiface node and interface
730 * @param index portindex
731 * @param bypass Set true to enable the clock bypass and false
732 * to sync clock and data synchronously.
733 * Default is false.
734 * @param clk_delay Delay value to skew TXC from TXD, default is 0.
735 */
736void cvmx_helper_cfg_get_rgmii_tx_clk_delay(int xiface, int index, bool *bypass, int *clk_delay);
737
738/**
739 * @INTERNAL
740 * Retrieve node-specific PKO Queue configuration.
741 *
742 * @param node OCTEON3 node.
743 * @param pkocfg PKO Queue static configuration.
744 */
745int cvmx_helper_pko_queue_config_get(int node, cvmx_user_static_pko_queue_config_t *cfg);
746
747/**
748 * @INTERNAL
749 * Update node-specific PKO Queue configuration.
750 *
751 * @param node OCTEON3 node.
752 * @param pkocfg PKO Queue static configuration.
753 */
754int cvmx_helper_pko_queue_config_set(int node, cvmx_user_static_pko_queue_config_t *cfg);
755
756/**
757 * @INTERNAL
758 * Retrieve the SFP node offset in the device tree
759 *
760 * @param xiface node and interface
761 * @param index port index
762 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100763 * Return: offset in device tree or -1 if error or not defined.
Aaron Williams3bda89d2020-12-11 17:05:24 +0100764 */
765int cvmx_helper_cfg_get_sfp_fdt_offset(int xiface, int index);
766
767/**
768 * Search for a port based on its FDT node offset
769 *
770 * @param of_offset Node offset of port to search for
771 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100772 * Return: ipd_port or -1 if not found
Aaron Williams3bda89d2020-12-11 17:05:24 +0100773 */
774int cvmx_helper_cfg_get_ipd_port_by_fdt_node_offset(int of_offset);
775
776/**
777 * @INTERNAL
778 * Sets the SFP node offset
779 *
780 * @param xiface node and interface
781 * @param index port index
782 * @param sfp_of_offset Offset of SFP node in device tree
783 */
784void cvmx_helper_cfg_set_sfp_fdt_offset(int xiface, int index, int sfp_of_offset);
785
786/**
787 * Search for a port based on its FDT node offset
788 *
789 * @param of_offset Node offset of port to search for
790 * @param[out] xiface xinterface of match
791 * @param[out] index port index of match
792 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100793 * Return: 0 if found, -1 if not found
Aaron Williams3bda89d2020-12-11 17:05:24 +0100794 */
795int cvmx_helper_cfg_get_xiface_index_by_fdt_node_offset(int of_offset, int *xiface, int *index);
796
797/**
798 * Get data structure defining the Microsemi VSC7224 channel info
799 * or NULL if not present
800 *
801 * @param xiface node and interface
802 * @param index port index
803 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100804 * Return: pointer to vsc7224 data structure or NULL if not present
Aaron Williams3bda89d2020-12-11 17:05:24 +0100805 */
806struct cvmx_vsc7224_chan *cvmx_helper_cfg_get_vsc7224_chan_info(int xiface, int index);
807
808/**
809 * Sets the Microsemi VSC7224 channel data structure
810 *
811 * @param xiface node and interface
812 * @param index port index
813 * @param[in] vsc7224_info Microsemi VSC7224 data structure
814 */
815void cvmx_helper_cfg_set_vsc7224_chan_info(int xiface, int index,
816 struct cvmx_vsc7224_chan *vsc7224_chan_info);
817
818/**
819 * Get data structure defining the Avago AVSP5410 phy info
820 * or NULL if not present
821 *
822 * @param xiface node and interface
823 * @param index port index
824 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100825 * Return: pointer to avsp5410 data structure or NULL if not present
Aaron Williams3bda89d2020-12-11 17:05:24 +0100826 */
827struct cvmx_avsp5410 *cvmx_helper_cfg_get_avsp5410_info(int xiface, int index);
828
829/**
830 * Sets the Avago AVSP5410 phy info data structure
831 *
832 * @param xiface node and interface
833 * @param index port index
834 * @param[in] avsp5410_info Avago AVSP5410 data structure
835 */
836void cvmx_helper_cfg_set_avsp5410_info(int xiface, int index, struct cvmx_avsp5410 *avsp5410_info);
837
838/**
839 * Gets the SFP data associated with a port
840 *
841 * @param xiface node and interface
842 * @param index port index
843 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100844 * Return: pointer to SFP data structure or NULL if none
Aaron Williams3bda89d2020-12-11 17:05:24 +0100845 */
846struct cvmx_fdt_sfp_info *cvmx_helper_cfg_get_sfp_info(int xiface, int index);
847
848/**
849 * Sets the SFP data associated with a port
850 *
851 * @param xiface node and interface
852 * @param index port index
853 * @param[in] sfp_info port SFP data or NULL for none
854 */
855void cvmx_helper_cfg_set_sfp_info(int xiface, int index, struct cvmx_fdt_sfp_info *sfp_info);
856
857/*
858 * Initializes cvmx with user specified config info.
859 */
860int cvmx_user_static_config(void);
861void cvmx_pko_queue_show(void);
862int cvmx_fpa_pool_init_from_cvmx_config(void);
863int __cvmx_helper_init_port_valid(void);
864
865/**
866 * Returns a pointer to the phy device associated with a port
867 *
868 * @param xiface node and interface
869 * @param index port index
870 *
871 * return pointer to phy device or NULL if none
872 */
873struct phy_device *cvmx_helper_cfg_get_phy_device(int xiface, int index);
874
875/**
876 * Sets the phy device associated with a port
877 *
878 * @param xiface node and interface
879 * @param index port index
880 * @param[in] phydev phy device to assiciate
881 */
882void cvmx_helper_cfg_set_phy_device(int xiface, int index, struct phy_device *phydev);
883
884#endif /* __CVMX_HELPER_CFG_H__ */