1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3 * Copyright (C) 2020 Marvell International Ltd.
4 *
5 * Interface to the hardware Input Packet Data unit.
6 */
7
8 #ifndef __CVMX_IPD_H__
9 #define __CVMX_IPD_H__
10
11 #include "cvmx-pki.h"
12
13 /* CSR typedefs have been moved to cvmx-ipd-defs.h */
14
15 typedef cvmx_ipd_1st_mbuff_skip_t cvmx_ipd_mbuff_not_first_skip_t;
16 typedef cvmx_ipd_1st_next_ptr_back_t cvmx_ipd_second_next_ptr_back_t;
17
18 typedef struct cvmx_ipd_tag_fields {
19 u64 ipv6_src_ip : 1;
20 u64 ipv6_dst_ip : 1;
21 u64 ipv6_src_port : 1;
22 u64 ipv6_dst_port : 1;
23 u64 ipv6_next_header : 1;
24 u64 ipv4_src_ip : 1;
25 u64 ipv4_dst_ip : 1;
26 u64 ipv4_src_port : 1;
27 u64 ipv4_dst_port : 1;
28 u64 ipv4_protocol : 1;
29 u64 input_port : 1;
30 } cvmx_ipd_tag_fields_t;
31
32 typedef struct cvmx_pip_port_config {
33 u64 parse_mode;
34 u64 tag_type;
35 u64 tag_mode;
36 cvmx_ipd_tag_fields_t tag_fields;
37 } cvmx_pip_port_config_t;
38
39 typedef struct cvmx_ipd_config_struct {
40 u64 first_mbuf_skip;
41 u64 not_first_mbuf_skip;
42 u64 ipd_enable;
43 u64 enable_len_M8_fix;
44 u64 cache_mode;
45 cvmx_fpa_pool_config_t packet_pool;
46 cvmx_fpa_pool_config_t wqe_pool;
47 cvmx_pip_port_config_t port_config;
48 } cvmx_ipd_config_t;
49
50 extern cvmx_ipd_config_t cvmx_ipd_cfg;
51
52 /**
53 * Gets the fpa pool number of packet pool
54 */
cvmx_fpa_get_packet_pool(void)55 static inline s64 cvmx_fpa_get_packet_pool(void)
56 {
57 return (cvmx_ipd_cfg.packet_pool.pool_num);
58 }
59
60 /**
61 * Gets the buffer size of packet pool buffer
62 */
cvmx_fpa_get_packet_pool_block_size(void)63 static inline u64 cvmx_fpa_get_packet_pool_block_size(void)
64 {
65 return (cvmx_ipd_cfg.packet_pool.buffer_size);
66 }
67
68 /**
69 * Gets the buffer count of packet pool
70 */
cvmx_fpa_get_packet_pool_buffer_count(void)71 static inline u64 cvmx_fpa_get_packet_pool_buffer_count(void)
72 {
73 return (cvmx_ipd_cfg.packet_pool.buffer_count);
74 }
75
76 /**
77 * Gets the fpa pool number of wqe pool
78 */
cvmx_fpa_get_wqe_pool(void)79 static inline s64 cvmx_fpa_get_wqe_pool(void)
80 {
81 return (cvmx_ipd_cfg.wqe_pool.pool_num);
82 }
83
84 /**
85 * Gets the buffer size of wqe pool buffer
86 */
cvmx_fpa_get_wqe_pool_block_size(void)87 static inline u64 cvmx_fpa_get_wqe_pool_block_size(void)
88 {
89 return (cvmx_ipd_cfg.wqe_pool.buffer_size);
90 }
91
92 /**
93 * Gets the buffer count of wqe pool
94 */
cvmx_fpa_get_wqe_pool_buffer_count(void)95 static inline u64 cvmx_fpa_get_wqe_pool_buffer_count(void)
96 {
97 return (cvmx_ipd_cfg.wqe_pool.buffer_count);
98 }
99
100 /**
101 * Sets the ipd related configuration in internal structure which is then used
102 * for seting IPD hardware block
103 */
104 int cvmx_ipd_set_config(cvmx_ipd_config_t ipd_config);
105
106 /**
107 * Gets the ipd related configuration from internal structure.
108 */
109 void cvmx_ipd_get_config(cvmx_ipd_config_t *ipd_config);
110
111 /**
112 * Sets the internal FPA pool data structure for packet buffer pool.
113 * @param pool fpa pool number yo use
114 * @param buffer_size buffer size of pool
115 * @param buffer_count number of buufers to allocate to pool
116 */
117 void cvmx_ipd_set_packet_pool_config(s64 pool, u64 buffer_size, u64 buffer_count);
118
119 /**
120 * Sets the internal FPA pool data structure for wqe pool.
121 * @param pool fpa pool number yo use
122 * @param buffer_size buffer size of pool
123 * @param buffer_count number of buufers to allocate to pool
124 */
125 void cvmx_ipd_set_wqe_pool_config(s64 pool, u64 buffer_size, u64 buffer_count);
126
127 /**
128 * Gets the FPA packet buffer pool parameters.
129 */
cvmx_fpa_get_packet_pool_config(s64 * pool,u64 * buffer_size,u64 * buffer_count)130 static inline void cvmx_fpa_get_packet_pool_config(s64 *pool, u64 *buffer_size, u64 *buffer_count)
131 {
132 if (pool)
133 *pool = cvmx_ipd_cfg.packet_pool.pool_num;
134 if (buffer_size)
135 *buffer_size = cvmx_ipd_cfg.packet_pool.buffer_size;
136 if (buffer_count)
137 *buffer_count = cvmx_ipd_cfg.packet_pool.buffer_count;
138 }
139
140 /**
141 * Sets the FPA packet buffer pool parameters.
142 */
cvmx_fpa_set_packet_pool_config(s64 pool,u64 buffer_size,u64 buffer_count)143 static inline void cvmx_fpa_set_packet_pool_config(s64 pool, u64 buffer_size, u64 buffer_count)
144 {
145 cvmx_ipd_set_packet_pool_config(pool, buffer_size, buffer_count);
146 }
147
148 /**
149 * Gets the FPA WQE pool parameters.
150 */
cvmx_fpa_get_wqe_pool_config(s64 * pool,u64 * buffer_size,u64 * buffer_count)151 static inline void cvmx_fpa_get_wqe_pool_config(s64 *pool, u64 *buffer_size, u64 *buffer_count)
152 {
153 if (pool)
154 *pool = cvmx_ipd_cfg.wqe_pool.pool_num;
155 if (buffer_size)
156 *buffer_size = cvmx_ipd_cfg.wqe_pool.buffer_size;
157 if (buffer_count)
158 *buffer_count = cvmx_ipd_cfg.wqe_pool.buffer_count;
159 }
160
161 /**
162 * Sets the FPA WQE pool parameters.
163 */
cvmx_fpa_set_wqe_pool_config(s64 pool,u64 buffer_size,u64 buffer_count)164 static inline void cvmx_fpa_set_wqe_pool_config(s64 pool, u64 buffer_size, u64 buffer_count)
165 {
166 cvmx_ipd_set_wqe_pool_config(pool, buffer_size, buffer_count);
167 }
168
169 /**
170 * Configure IPD
171 *
172 * @param mbuff_size Packets buffer size in 8 byte words
173 * @param first_mbuff_skip
174 * Number of 8 byte words to skip in the first buffer
175 * @param not_first_mbuff_skip
176 * Number of 8 byte words to skip in each following buffer
177 * @param first_back Must be same as first_mbuff_skip / 128
178 * @param second_back
179 * Must be same as not_first_mbuff_skip / 128
180 * @param wqe_fpa_pool
181 * FPA pool to get work entries from
182 * @param cache_mode
183 * @param back_pres_enable_flag
184 * Enable or disable port back pressure at a global level.
185 * This should always be 1 as more accurate control can be
186 * found in IPD_PORTX_BP_PAGE_CNT[BP_ENB].
187 */
188 void cvmx_ipd_config(u64 mbuff_size, u64 first_mbuff_skip, u64 not_first_mbuff_skip, u64 first_back,
189 u64 second_back, u64 wqe_fpa_pool, cvmx_ipd_mode_t cache_mode,
190 u64 back_pres_enable_flag);
191 /**
192 * Enable IPD
193 */
194 void cvmx_ipd_enable(void);
195
196 /**
197 * Disable IPD
198 */
199 void cvmx_ipd_disable(void);
200
201 void __cvmx_ipd_free_ptr(void);
202
203 void cvmx_ipd_set_packet_pool_buffer_count(u64 buffer_count);
204 void cvmx_ipd_set_wqe_pool_buffer_count(u64 buffer_count);
205
206 /**
207 * Setup Random Early Drop on a specific input queue
208 *
209 * @param queue Input queue to setup RED on (0-7)
210 * @param pass_thresh
211 * Packets will begin slowly dropping when there are less than
212 * this many packet buffers free in FPA 0.
213 * @param drop_thresh
214 * All incoming packets will be dropped when there are less
215 * than this many free packet buffers in FPA 0.
216 * @return Zero on success. Negative on failure
217 */
218 int cvmx_ipd_setup_red_queue(int queue, int pass_thresh, int drop_thresh);
219
220 /**
221 * Setup Random Early Drop to automatically begin dropping packets.
222 *
223 * @param pass_thresh
224 * Packets will begin slowly dropping when there are less than
225 * this many packet buffers free in FPA 0.
226 * @param drop_thresh
227 * All incoming packets will be dropped when there are less
228 * than this many free packet buffers in FPA 0.
229 * @return Zero on success. Negative on failure
230 */
231 int cvmx_ipd_setup_red(int pass_thresh, int drop_thresh);
232
233 #endif /* __CVMX_IPD_H__ */
234