blob: 4edfdf9cc2318021985e22e2e1c0000305a0d884 [file] [log] [blame]
Aaron Williamse7bc6ea2020-12-11 17:05:24 +01001/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright (C) 2020 Marvell International Ltd.
4 *
5 * Functions to configure the BGX MAC.
6 */
7
8#ifndef __CVMX_HELPER_BGX_H__
9#define __CVMX_HELPER_BGX_H__
10
11#define CVMX_BGX_RX_FIFO_SIZE (64 * 1024)
12#define CVMX_BGX_TX_FIFO_SIZE (32 * 1024)
13
14int __cvmx_helper_bgx_enumerate(int xiface);
15
16/**
17 * @INTERNAL
18 * Disable the BGX port
19 *
20 * @param xipd_port IPD port of the BGX interface to disable
21 */
22void cvmx_helper_bgx_disable(int xipd_port);
23
24/**
25 * @INTERNAL
26 * Probe a SGMII interface and determine the number of ports
27 * connected to it. The SGMII/XAUI interface should still be down after
28 * this call. This is used by interfaces using the bgx mac.
29 *
30 * @param xiface Interface to probe
31 *
Heinrich Schuchardt185f8122022-01-19 18:05:50 +010032 * Return: Number of ports on the interface. Zero to disable.
Aaron Williamse7bc6ea2020-12-11 17:05:24 +010033 */
34int __cvmx_helper_bgx_probe(int xiface);
35
36/**
37 * @INTERNAL
38 * Bringup and enable a SGMII interface. After this call packet
39 * I/O should be fully functional. This is called with IPD
40 * enabled but PKO disabled. This is used by interfaces using the
41 * bgx mac.
42 *
43 * @param xiface Interface to bring up
44 *
Heinrich Schuchardt185f8122022-01-19 18:05:50 +010045 * Return: Zero on success, negative on failure
Aaron Williamse7bc6ea2020-12-11 17:05:24 +010046 */
47int __cvmx_helper_bgx_sgmii_enable(int xiface);
48
49/**
50 * @INTERNAL
51 * Return the link state of an IPD/PKO port as returned by
52 * auto negotiation. The result of this function may not match
53 * Octeon's link config if auto negotiation has changed since
54 * the last call to cvmx_helper_link_set(). This is used by
55 * interfaces using the bgx mac.
56 *
57 * @param xipd_port IPD/PKO port to query
58 *
Heinrich Schuchardt185f8122022-01-19 18:05:50 +010059 * Return: Link state
Aaron Williamse7bc6ea2020-12-11 17:05:24 +010060 */
61cvmx_helper_link_info_t __cvmx_helper_bgx_sgmii_link_get(int xipd_port);
62
63/**
64 * @INTERNAL
65 * Configure an IPD/PKO port for the specified link state. This
66 * function does not influence auto negotiation at the PHY level.
67 * The passed link state must always match the link state returned
68 * by cvmx_helper_link_get(). It is normally best to use
69 * cvmx_helper_link_autoconf() instead. This is used by interfaces
70 * using the bgx mac.
71 *
72 * @param xipd_port IPD/PKO port to configure
73 * @param link_info The new link state
74 *
Heinrich Schuchardt185f8122022-01-19 18:05:50 +010075 * Return: Zero on success, negative on failure
Aaron Williamse7bc6ea2020-12-11 17:05:24 +010076 */
77int __cvmx_helper_bgx_sgmii_link_set(int xipd_port, cvmx_helper_link_info_t link_info);
78
79/**
80 * @INTERNAL
81 * Configure a port for internal and/or external loopback. Internal loopback
82 * causes packets sent by the port to be received by Octeon. External loopback
83 * causes packets received from the wire to sent out again. This is used by
84 * interfaces using the bgx mac.
85 *
86 * @param xipd_port IPD/PKO port to loopback.
87 * @param enable_internal
88 * Non zero if you want internal loopback
89 * @param enable_external
90 * Non zero if you want external loopback
91 *
Heinrich Schuchardt185f8122022-01-19 18:05:50 +010092 * Return: Zero on success, negative on failure.
Aaron Williamse7bc6ea2020-12-11 17:05:24 +010093 */
94int __cvmx_helper_bgx_sgmii_configure_loopback(int xipd_port, int enable_internal,
95 int enable_external);
96
97/**
98 * @INTERNAL
99 * Bringup and enable a XAUI interface. After this call packet
100 * I/O should be fully functional. This is called with IPD
101 * enabled but PKO disabled. This is used by interfaces using the
102 * bgx mac.
103 *
104 * @param xiface Interface to bring up
105 *
Heinrich Schuchardt185f8122022-01-19 18:05:50 +0100106 * Return: Zero on success, negative on failure
Aaron Williamse7bc6ea2020-12-11 17:05:24 +0100107 */
108int __cvmx_helper_bgx_xaui_enable(int xiface);
109
110/**
111 * @INTERNAL
112 * Return the link state of an IPD/PKO port as returned by
113 * auto negotiation. The result of this function may not match
114 * Octeon's link config if auto negotiation has changed since
115 * the last call to cvmx_helper_link_set(). This is used by
116 * interfaces using the bgx mac.
117 *
118 * @param xipd_port IPD/PKO port to query
119 *
Heinrich Schuchardt185f8122022-01-19 18:05:50 +0100120 * Return: Link state
Aaron Williamse7bc6ea2020-12-11 17:05:24 +0100121 */
122cvmx_helper_link_info_t __cvmx_helper_bgx_xaui_link_get(int xipd_port);
123
124/**
125 * @INTERNAL
126 * Configure an IPD/PKO port for the specified link state. This
127 * function does not influence auto negotiation at the PHY level.
128 * The passed link state must always match the link state returned
129 * by cvmx_helper_link_get(). It is normally best to use
130 * cvmx_helper_link_autoconf() instead. This is used by interfaces
131 * using the bgx mac.
132 *
133 * @param xipd_port IPD/PKO port to configure
134 * @param link_info The new link state
135 *
Heinrich Schuchardt185f8122022-01-19 18:05:50 +0100136 * Return: Zero on success, negative on failure
Aaron Williamse7bc6ea2020-12-11 17:05:24 +0100137 */
138int __cvmx_helper_bgx_xaui_link_set(int xipd_port, cvmx_helper_link_info_t link_info);
139
140/**
141 * @INTERNAL
142 * Configure a port for internal and/or external loopback. Internal loopback
143 * causes packets sent by the port to be received by Octeon. External loopback
144 * causes packets received from the wire to sent out again. This is used by
145 * interfaces using the bgx mac.
146 *
147 * @param xipd_port IPD/PKO port to loopback.
148 * @param enable_internal
149 * Non zero if you want internal loopback
150 * @param enable_external
151 * Non zero if you want external loopback
152 *
Heinrich Schuchardt185f8122022-01-19 18:05:50 +0100153 * Return: Zero on success, negative on failure.
Aaron Williamse7bc6ea2020-12-11 17:05:24 +0100154 */
155int __cvmx_helper_bgx_xaui_configure_loopback(int xipd_port, int enable_internal,
156 int enable_external);
157
158int __cvmx_helper_bgx_mixed_enable(int xiface);
159
160cvmx_helper_link_info_t __cvmx_helper_bgx_mixed_link_get(int xipd_port);
161
162int __cvmx_helper_bgx_mixed_link_set(int xipd_port, cvmx_helper_link_info_t link_info);
163
164int __cvmx_helper_bgx_mixed_configure_loopback(int xipd_port, int enable_internal,
165 int enable_external);
166
167cvmx_helper_interface_mode_t cvmx_helper_bgx_get_mode(int xiface, int index);
168
169/**
170 * @INTERNAL
171 * Configure Priority-Based Flow Control (a.k.a. PFC/CBFC)
172 * on a specific BGX interface/port.
173 */
174void __cvmx_helper_bgx_xaui_config_pfc(unsigned int node, unsigned int interface, unsigned int port,
175 bool pfc_enable);
176
177/**
178 * This function control how the hardware handles incoming PAUSE
179 * packets. The most common modes of operation:
180 * ctl_bck = 1, ctl_drp = 1: hardware handles everything
181 * ctl_bck = 0, ctl_drp = 0: software sees all PAUSE frames
182 * ctl_bck = 0, ctl_drp = 1: all PAUSE frames are completely ignored
183 * @param node node number.
184 * @param interface interface number
185 * @param port port number
186 * @param ctl_bck 1: Forward PAUSE information to TX block
187 * @param ctl_drp 1: Drop control PAUSE frames.
188 */
189void cvmx_helper_bgx_rx_pause_ctl(unsigned int node, unsigned int interface, unsigned int port,
190 unsigned int ctl_bck, unsigned int ctl_drp);
191
192/**
193 * This function configures the receive action taken for multicast, broadcast
194 * and dmac filter match packets.
195 * @param node node number.
196 * @param interface interface number
197 * @param port port number
198 * @param cam_accept 0: reject packets on dmac filter match
199 * 1: accept packet on dmac filter match
200 * @param mcast_mode 0x0 = Force reject all multicast packets
201 * 0x1 = Force accept all multicast packets
202 * 0x2 = Use the address filter CAM
203 * @param bcast_accept 0 = Reject all broadcast packets
204 * 1 = Accept all broadcast packets
205 */
206void cvmx_helper_bgx_rx_adr_ctl(unsigned int node, unsigned int interface, unsigned int port,
207 unsigned int cam_accept, unsigned int mcast_mode,
208 unsigned int bcast_accept);
209
210/**
211 * Function to control the generation of FCS, padding by the BGX
212 *
213 */
214void cvmx_helper_bgx_tx_options(unsigned int node, unsigned int interface, unsigned int index,
215 bool fcs_enable, bool pad_enable);
216
217/**
218 * Set mac for the ipd_port
219 *
220 * @param xipd_port ipd_port to set the mac
221 * @param bcst If set, accept all broadcast packets
222 * @param mcst Multicast mode
223 * 0 = Force reject all multicast packets
224 * 1 = Force accept all multicast packets
225 * 2 = use the address filter CAM.
226 * @param mac mac address for the ipd_port
227 */
228void cvmx_helper_bgx_set_mac(int xipd_port, int bcst, int mcst, u64 mac);
229
230int __cvmx_helper_bgx_port_init(int xipd_port, int phy_pres);
231void cvmx_helper_bgx_set_jabber(int xiface, unsigned int index, unsigned int size);
232int cvmx_helper_bgx_shutdown_port(int xiface, int index);
233int cvmx_bgx_set_backpressure_override(int xiface, unsigned int port_mask);
234int __cvmx_helper_bgx_fifo_size(int xiface, unsigned int lmac);
235
236/**
237 * Returns if an interface is RGMII or not
238 *
239 * @param xiface xinterface to check
240 * @param index port index (must be 0 for rgmii)
241 *
Heinrich Schuchardt185f8122022-01-19 18:05:50 +0100242 * Return: true if RGMII, false otherwise
Aaron Williamse7bc6ea2020-12-11 17:05:24 +0100243 */
244static inline bool cvmx_helper_bgx_is_rgmii(int xiface, int index)
245{
246 union cvmx_bgxx_cmrx_config cmr_config;
247
248 if (!OCTEON_IS_MODEL(OCTEON_CN73XX) || index != 0)
249 return false;
250 cmr_config.u64 = csr_rd(CVMX_BGXX_CMRX_CONFIG(index, xiface));
251 return cmr_config.s.lmac_type == 5;
252}
253
254/**
255 * Probes the BGX Super Path (SMU/SPU) mode
256 *
257 * @param xiface global interface number
258 * @param index interface index
259 *
Heinrich Schuchardt185f8122022-01-19 18:05:50 +0100260 * Return: true, if Super-MAC/PCS mode, false -- otherwise
Aaron Williamse7bc6ea2020-12-11 17:05:24 +0100261 */
262bool cvmx_helper_bgx_is_smu(int xiface, int index);
263
264/**
265 * @INTERNAL
266 * Configure parameters of PAUSE packet.
267 *
268 * @param xipd_port Global IPD port (node + IPD port).
269 * @param smac Source MAC address.
270 * @param dmac Destination MAC address.
271 * @param type PAUSE packet type.
272 * @param time Pause time for PAUSE packets (number of 512 bit-times).
273 * @param interval Interval between PAUSE packets (number of 512 bit-times).
Heinrich Schuchardt185f8122022-01-19 18:05:50 +0100274 * Return: Zero on success, negative on failure.
Aaron Williamse7bc6ea2020-12-11 17:05:24 +0100275 */
276int cvmx_bgx_set_pause_pkt_param(int xipd_port, u64 smac, u64 dmac, unsigned int type,
277 unsigned int time, unsigned int interval);
278
279/**
280 * @INTERNAL
281 * Setup the BGX flow-control mode.
282 *
283 * @param xipd_port Global IPD port (node + IPD port).
284 * @param type Flow-control type/protocol.
285 * @param mode Flow-control mode.
Heinrich Schuchardt185f8122022-01-19 18:05:50 +0100286 * Return: Zero on success, negative on failure.
Aaron Williamse7bc6ea2020-12-11 17:05:24 +0100287 */
288int cvmx_bgx_set_flowctl_mode(int xipd_port, cvmx_qos_proto_t qos, cvmx_qos_pkt_mode_t mode);
289
290/**
291 * Enables or disables autonegotiation for an interface.
292 *
293 * @param xiface interface to set autonegotiation
294 * @param index port index
295 * @param enable true to enable autonegotiation, false to disable it
296 *
Heinrich Schuchardt185f8122022-01-19 18:05:50 +0100297 * Return: 0 for success, -1 on error.
Aaron Williamse7bc6ea2020-12-11 17:05:24 +0100298 */
299int cvmx_helper_set_autonegotiation(int xiface, int index, bool enable);
300
301/**
302 * Enables or disables forward error correction
303 *
304 * @param xiface interface
305 * @param index port index
306 * @param enable set to true to enable FEC, false to disable
307 *
Heinrich Schuchardt185f8122022-01-19 18:05:50 +0100308 * Return: 0 for success, -1 on error
Aaron Williamse7bc6ea2020-12-11 17:05:24 +0100309 *
310 * @NOTE: If autonegotiation is enabled then autonegotiation will be
311 * restarted for negotiating FEC.
312 */
313int cvmx_helper_set_fec(int xiface, int index, bool enable);
314
315#ifdef CVMX_DUMP_BGX
316/**
317 * Dump BGX configuration for node 0
318 */
319int cvmx_dump_bgx_config(unsigned int bgx);
320/**
321 * Dump BGX status for node 0
322 */
323int cvmx_dump_bgx_status(unsigned int bgx);
324/**
325 * Dump BGX configuration
326 */
327int cvmx_dump_bgx_config_node(unsigned int node, unsigned int bgx);
328/**
329 * Dump BGX status
330 */
331int cvmx_dump_bgx_status_node(unsigned int node, unsigned int bgx);
332
333#endif
334
335#endif