1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2020 Marvell International Ltd.
4  *
5  * Helper functions for PKI
6  */
7 
8 #ifndef __CVMX_HELPER_PKI_H__
9 #define __CVMX_HELPER_PKI_H__
10 
11 #include "cvmx-pki.h"
12 
13 /* Modify this if more than 8 ilk channels need to be supported */
14 #define CVMX_MAX_PORT_PER_INTERFACE  64
15 #define CVMX_MAX_QOS_PRIORITY	     64
16 #define CVMX_PKI_FIND_AVAILABLE_RSRC (-1)
17 
18 struct cvmx_pki_qos_schd {
19 	cvmx_fpa3_gaura_t _aura;
20 	cvmx_fpa3_pool_t _pool;
21 	bool pool_per_qos;
22 	int pool_num;
23 	char *pool_name;
24 	u64 pool_buff_size;
25 	u64 pool_max_buff;
26 	bool aura_per_qos;
27 	int aura_num;
28 	char *aura_name;
29 	u64 aura_buff_cnt;
30 	bool sso_grp_per_qos;
31 	int sso_grp;
32 	u16 port_add;
33 	int qpg_base;
34 };
35 
36 struct cvmx_pki_prt_schd {
37 	cvmx_fpa3_pool_t _pool;
38 	cvmx_fpa3_gaura_t _aura;
39 	bool cfg_port;
40 	int style;
41 	bool pool_per_prt;
42 	int pool_num;
43 	char *pool_name;
44 	u64 pool_buff_size;
45 	u64 pool_max_buff;
46 	bool aura_per_prt;
47 	int aura_num;
48 	char *aura_name;
49 	u64 aura_buff_cnt;
50 	bool sso_grp_per_prt;
51 	int sso_grp;
52 	enum cvmx_pki_qpg_qos qpg_qos;
53 	int qpg_base;
54 	struct cvmx_pki_qos_schd qos_s[CVMX_MAX_QOS_PRIORITY];
55 };
56 
57 struct cvmx_pki_intf_schd {
58 	cvmx_fpa3_pool_t _pool;
59 	cvmx_fpa3_gaura_t _aura;
60 	bool style_per_intf;
61 	int style;
62 	bool pool_per_intf;
63 	int pool_num;
64 	char *pool_name;
65 	u64 pool_buff_size;
66 	u64 pool_max_buff;
67 	bool aura_per_intf;
68 	int aura_num;
69 	char *aura_name;
70 	u64 aura_buff_cnt;
71 	bool sso_grp_per_intf;
72 	int sso_grp;
73 	bool qos_share_aura;
74 	bool qos_share_grp;
75 	int qpg_base;
76 	struct cvmx_pki_prt_schd prt_s[CVMX_MAX_PORT_PER_INTERFACE];
77 };
78 
79 struct cvmx_pki_global_schd {
80 	bool setup_pool;
81 	int pool_num;
82 	char *pool_name;
83 	u64 pool_buff_size;
84 	u64 pool_max_buff;
85 	bool setup_aura;
86 	int aura_num;
87 	char *aura_name;
88 	u64 aura_buff_cnt;
89 	bool setup_sso_grp;
90 	int sso_grp;
91 	cvmx_fpa3_pool_t _pool;
92 	cvmx_fpa3_gaura_t _aura;
93 };
94 
95 struct cvmx_pki_legacy_qos_watcher {
96 	bool configured;
97 	enum cvmx_pki_term field;
98 	u32 data;
99 	u32 data_mask;
100 	u8 advance;
101 	u8 sso_grp;
102 };
103 
104 extern bool cvmx_pki_dflt_init[CVMX_MAX_NODES];
105 
106 extern struct cvmx_pki_pool_config pki_dflt_pool[CVMX_MAX_NODES];
107 extern struct cvmx_pki_aura_config pki_dflt_aura[CVMX_MAX_NODES];
108 extern struct cvmx_pki_style_config pki_dflt_style[CVMX_MAX_NODES];
109 extern struct cvmx_pki_pkind_config pki_dflt_pkind[CVMX_MAX_NODES];
110 extern u64 pkind_style_map[CVMX_MAX_NODES][CVMX_PKI_NUM_PKIND];
111 extern struct cvmx_pki_sso_grp_config pki_dflt_sso_grp[CVMX_MAX_NODES];
112 extern struct cvmx_pki_legacy_qos_watcher qos_watcher[8];
113 
114 /**
115  * This function Enabled the PKI hardware to
116  * start accepting/processing packets.
117  * @param node    node number
118  */
119 void cvmx_helper_pki_enable(int node);
120 
121 /**
122  * This function frees up PKI resources consumed by that port.
123  * This function should only be called if port resources
124  * (fpa pools aura, style qpg entry pcam entry etc.) are not shared
125  * @param xipd_port     ipd port number for which resources need to
126  *                      be freed.
127  */
128 int cvmx_helper_pki_port_shutdown(int xipd_port);
129 
130 /**
131  * This function shuts down complete PKI hardware
132  * and software resources.
133  * @param node          node number where PKI needs to shutdown.
134  */
135 void cvmx_helper_pki_shutdown(int node);
136 
137 /**
138  * This function calculates how mant qpf entries will be needed for
139  * a particular QOS.
140  * @param qpg_qos       qos value for which entries need to be calculated.
141  */
142 int cvmx_helper_pki_get_num_qpg_entry(enum cvmx_pki_qpg_qos qpg_qos);
143 
144 /**
145  * This function setups the qos table by allocating qpg entry and writing
146  * the provided parameters to that entry (offset).
147  * @param node          node number.
148  * @param qpg_cfg       pointer to struct containing qpg configuration
149  */
150 int cvmx_helper_pki_set_qpg_entry(int node, struct cvmx_pki_qpg_config *qpg_cfg);
151 
152 /**
153  * This function sets up aura QOS for RED, backpressure and tail-drop.
154  *
155  * @param node       node number.
156  * @param aura       aura to configure.
157  * @param ena_red       enable RED based on [DROP] and [PASS] levels
158  *			1: enable 0:disable
159  * @param pass_thresh   pass threshold for RED.
160  * @param drop_thresh   drop threshold for RED
161  * @param ena_bp        enable backpressure based on [BP] level.
162  *			1:enable 0:disable
163  * @param bp_thresh     backpressure threshold.
164  * @param ena_drop      enable tail drop.
165  *			1:enable 0:disable
166  * @return Zero on success. Negative on failure
167  */
168 int cvmx_helper_setup_aura_qos(int node, int aura, bool ena_red, bool ena_drop, u64 pass_thresh,
169 			       u64 drop_thresh, bool ena_bp, u64 bp_thresh);
170 
171 /**
172  * This function maps specified bpid to all the auras from which it can receive bp and
173  * then maps that bpid to all the channels, that bpid can asserrt bp on.
174  *
175  * @param node          node number.
176  * @param aura          aura number which will back pressure specified bpid.
177  * @param bpid          bpid to map.
178  * @param chl_map       array of channels to map to that bpid.
179  * @param chl_cnt	number of channel/ports to map to that bpid.
180  * @return Zero on success. Negative on failure
181  */
182 int cvmx_helper_pki_map_aura_chl_bpid(int node, u16 aura, u16 bpid, u16 chl_map[], u16 chl_cnt);
183 
184 /**
185  * This function sets up the global pool, aura and sso group
186  * resources which application can use between any interfaces
187  * and ports.
188  * @param node          node number
189  * @param gblsch        pointer to struct containing global
190  *                      scheduling parameters.
191  */
192 int cvmx_helper_pki_set_gbl_schd(int node, struct cvmx_pki_global_schd *gblsch);
193 
194 /**
195  * This function sets up scheduling parameters (pool, aura, sso group etc)
196  * of an ipd port.
197  * @param xipd_port     ipd port number
198  * @param prtsch        pointer to struct containing port's
199  *                      scheduling parameters.
200  */
201 int cvmx_helper_pki_init_port(int xipd_port, struct cvmx_pki_prt_schd *prtsch);
202 
203 /**
204  * This function sets up scheduling parameters (pool, aura, sso group etc)
205  * of an interface (all ports/channels on that interface).
206  * @param xiface        interface number with node.
207  * @param intfsch      pointer to struct containing interface
208  *                      scheduling parameters.
209  * @param gblsch       pointer to struct containing global scheduling parameters
210  *                      (can be NULL if not used)
211  */
212 int cvmx_helper_pki_init_interface(const int xiface, struct cvmx_pki_intf_schd *intfsch,
213 				   struct cvmx_pki_global_schd *gblsch);
214 /**
215  * This function gets all the PKI parameters related to that
216  * particular port from hardware.
217  * @param xipd_port     ipd port number to get parameter of
218  * @param port_cfg      pointer to structure where to store read parameters
219  */
220 void cvmx_pki_get_port_config(int xipd_port, struct cvmx_pki_port_config *port_cfg);
221 
222 /**
223  * This function sets all the PKI parameters related to that
224  * particular port in hardware.
225  * @param xipd_port     ipd port number to get parameter of
226  * @param port_cfg      pointer to structure containing port parameters
227  */
228 void cvmx_pki_set_port_config(int xipd_port, struct cvmx_pki_port_config *port_cfg);
229 
230 /**
231  * This function displays all the PKI parameters related to that
232  * particular port.
233  * @param xipd_port      ipd port number to display parameter of
234  */
235 void cvmx_pki_show_port_config(int xipd_port);
236 
237 /**
238  * Modifies maximum frame length to check.
239  * It modifies the global frame length set used by this port, any other
240  * port using the same set will get affected too.
241  * @param xipd_port	ipd port for which to modify max len.
242  * @param max_size	maximum frame length
243  */
244 void cvmx_pki_set_max_frm_len(int xipd_port, u32 max_size);
245 
246 /**
247  * This function sets up all the ports of particular interface
248  * for chosen fcs mode. (only use for backward compatibility).
249  * New application can control it via init_interface calls.
250  * @param node          node number.
251  * @param interface     interface number.
252  * @param nports        number of ports
253  * @param has_fcs       1 -- enable fcs check and fcs strip.
254  *                      0 -- disable fcs check.
255  */
256 void cvmx_helper_pki_set_fcs_op(int node, int interface, int nports, int has_fcs);
257 
258 /**
259  * This function sets the wqe buffer mode of all ports. First packet data buffer can reside
260  * either in same buffer as wqe OR it can go in separate buffer. If used the later mode,
261  * make sure software allocate enough buffers to now have wqe separate from packet data.
262  * @param node	                node number.
263  * @param pkt_outside_wqe	0 = The packet link pointer will be at word [FIRST_SKIP]
264  *				    immediately followed by packet data, in the same buffer
265  *				    as the work queue entry.
266  *				1 = The packet link pointer will be at word [FIRST_SKIP] in a new
267  *				    buffer separate from the work queue entry. Words following the
268  *				    WQE in the same cache line will be zeroed, other lines in the
269  *				    buffer will not be modified and will retain stale data (from the
270  *				    buffer’s previous use). This setting may decrease the peak PKI
271  *				    performance by up to half on small packets.
272  */
273 void cvmx_helper_pki_set_wqe_mode(int node, bool pkt_outside_wqe);
274 
275 /**
276  * This function sets the Packet mode of all ports and styles to little-endian.
277  * It Changes write operations of packet data to L2C to
278  * be in little-endian. Does not change the WQE header format, which is
279  * properly endian neutral.
280  * @param node	                node number.
281  */
282 void cvmx_helper_pki_set_little_endian(int node);
283 
284 void cvmx_helper_pki_set_dflt_pool(int node, int pool, int buffer_size, int buffer_count);
285 void cvmx_helper_pki_set_dflt_aura(int node, int aura, int pool, int buffer_count);
286 void cvmx_helper_pki_set_dflt_pool_buffer(int node, int buffer_count);
287 
288 void cvmx_helper_pki_set_dflt_aura_buffer(int node, int buffer_count);
289 
290 void cvmx_helper_pki_set_dflt_pkind_map(int node, int pkind, int style);
291 
292 void cvmx_helper_pki_get_dflt_style(int node, struct cvmx_pki_style_config *style_cfg);
293 void cvmx_helper_pki_set_dflt_style(int node, struct cvmx_pki_style_config *style_cfg);
294 
295 void cvmx_helper_pki_get_dflt_qpg(int node, struct cvmx_pki_qpg_config *qpg_cfg);
296 void cvmx_helper_pki_set_dflt_qpg(int node, struct cvmx_pki_qpg_config *qpg_cfg);
297 
298 void cvmx_helper_pki_no_dflt_init(int node);
299 
300 void cvmx_helper_pki_set_dflt_bp_en(int node, bool bp_en);
301 
302 void cvmx_pki_dump_wqe(const cvmx_wqe_78xx_t *wqp);
303 
304 int __cvmx_helper_pki_port_setup(int node, int xipd_port);
305 
306 int __cvmx_helper_pki_global_setup(int node);
307 void cvmx_helper_pki_show_port_config(int xipd_port);
308 
309 int __cvmx_helper_pki_install_dflt_vlan(int node);
310 void __cvmx_helper_pki_set_dflt_ltype_map(int node);
311 int cvmx_helper_pki_route_dmac(int node, int style, u64 mac_addr, u64 mac_addr_mask,
312 			       int final_style);
313 int cvmx_pki_clone_style(int node, int style, u64 cluster_mask);
314 void cvmx_helper_pki_modify_prtgrp(int xipd_port, int grp_ok, int grp_bad);
315 int cvmx_helper_pki_route_prt_dmac(int xipd_port, u64 mac_addr, u64 mac_addr_mask, int grp);
316 
317 void cvmx_helper_pki_errata(int node);
318 
319 #endif /* __CVMX_HELPER_PKI_H__ */
320