1 /* 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 
14 int __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  */
22 void 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  *
32  * @return Number of ports on the interface. Zero to disable.
33  */
34 int __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  *
45  * @return Zero on success, negative on failure
46  */
47 int __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  *
59  * @return Link state
60  */
61 cvmx_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  *
75  * @return Zero on success, negative on failure
76  */
77 int __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  *
92  * @return Zero on success, negative on failure.
93  */
94 int __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  *
106  * @return Zero on success, negative on failure
107  */
108 int __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  *
120  * @return Link state
121  */
122 cvmx_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  *
136  * @return Zero on success, negative on failure
137  */
138 int __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  *
153  * @return Zero on success, negative on failure.
154  */
155 int __cvmx_helper_bgx_xaui_configure_loopback(int xipd_port, int enable_internal,
156 					      int enable_external);
157 
158 int __cvmx_helper_bgx_mixed_enable(int xiface);
159 
160 cvmx_helper_link_info_t __cvmx_helper_bgx_mixed_link_get(int xipd_port);
161 
162 int __cvmx_helper_bgx_mixed_link_set(int xipd_port, cvmx_helper_link_info_t link_info);
163 
164 int __cvmx_helper_bgx_mixed_configure_loopback(int xipd_port, int enable_internal,
165 					       int enable_external);
166 
167 cvmx_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  */
174 void __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  */
189 void 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  */
206 void 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  */
214 void 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  */
228 void cvmx_helper_bgx_set_mac(int xipd_port, int bcst, int mcst, u64 mac);
229 
230 int __cvmx_helper_bgx_port_init(int xipd_port, int phy_pres);
231 void cvmx_helper_bgx_set_jabber(int xiface, unsigned int index, unsigned int size);
232 int cvmx_helper_bgx_shutdown_port(int xiface, int index);
233 int cvmx_bgx_set_backpressure_override(int xiface, unsigned int port_mask);
234 int __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  *
242  * @return	true if RGMII, false otherwise
243  */
cvmx_helper_bgx_is_rgmii(int xiface,int index)244 static 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  *
260  * @return	true, if Super-MAC/PCS mode, false -- otherwise
261  */
262 bool 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).
274  * @return Zero on success, negative on failure.
275  */
276 int 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.
286  * @return Zero on success, negative on failure.
287  */
288 int 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  *
297  * @return	0 for success, -1 on error.
298  */
299 int 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  *
308  * @return	0 for success, -1 on error
309  *
310  * @NOTE:	If autonegotiation is enabled then autonegotiation will be
311  *		restarted for negotiating FEC.
312  */
313 int 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  */
319 int cvmx_dump_bgx_config(unsigned int bgx);
320 /**
321  * Dump BGX status for node 0
322  */
323 int cvmx_dump_bgx_status(unsigned int bgx);
324 /**
325  * Dump BGX configuration
326  */
327 int cvmx_dump_bgx_config_node(unsigned int node, unsigned int bgx);
328 /**
329  * Dump BGX status
330  */
331 int cvmx_dump_bgx_status_node(unsigned int node, unsigned int bgx);
332 
333 #endif
334 
335 #endif
336