Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : *
3 : : * Copyright 2022 NXP
4 : : *
5 : : */
6 : :
7 : : #ifndef _DPAA2_PARSE_DUMP_H
8 : : #define _DPAA2_PARSE_DUMP_H
9 : :
10 : : #include <rte_event_eth_rx_adapter.h>
11 : : #include <rte_pmd_dpaa2.h>
12 : :
13 : : #include <dpaa2_hw_pvt.h>
14 : : #include "dpaa2_tm.h"
15 : :
16 : : #include <mc/fsl_dpni.h>
17 : : #include <mc/fsl_mc_sys.h>
18 : :
19 : : #include "base/dpaa2_hw_dpni_annot.h"
20 : :
21 : : #define DPAA2_PR_PRINT printf
22 : :
23 : : struct dpaa2_faf_bit_info {
24 : : const char *name;
25 : : int position;
26 : : };
27 : :
28 : : struct dpaa2_fapr_field_info {
29 : : const char *name;
30 : : uint16_t value;
31 : : };
32 : :
33 : : struct dpaa2_fapr_array {
34 : : union {
35 : : uint64_t pr_64[DPAA2_FAPR_SIZE / 8];
36 : : uint8_t pr[DPAA2_FAPR_SIZE];
37 : : };
38 : : };
39 : :
40 : : #define NEXT_HEADER_NAME "Next Header"
41 : : #define ETH_OFF_NAME "ETH OFFSET"
42 : : #define VLAN_TCI_OFF_NAME "VLAN TCI OFFSET"
43 : : #define LAST_ENTRY_OFF_NAME "LAST ETYPE Offset"
44 : : #define L3_OFF_NAME "L3 Offset"
45 : : #define L4_OFF_NAME "L4 Offset"
46 : : #define L5_OFF_NAME "L5 Offset"
47 : : #define NEXT_HEADER_OFF_NAME "Next Header Offset"
48 : :
49 : : static const
50 : : struct dpaa2_fapr_field_info support_dump_fields[] = {
51 : : {
52 : : .name = NEXT_HEADER_NAME,
53 : : },
54 : : {
55 : : .name = ETH_OFF_NAME,
56 : : },
57 : : {
58 : : .name = VLAN_TCI_OFF_NAME,
59 : : },
60 : : {
61 : : .name = LAST_ENTRY_OFF_NAME,
62 : : },
63 : : {
64 : : .name = L3_OFF_NAME,
65 : : },
66 : : {
67 : : .name = L4_OFF_NAME,
68 : : },
69 : : {
70 : : .name = L5_OFF_NAME,
71 : : },
72 : : {
73 : : .name = NEXT_HEADER_OFF_NAME,
74 : : }
75 : : };
76 : :
77 : : static inline void
78 : 0 : dpaa2_print_ecpri(struct dpaa2_fapr_array *fapr)
79 : : {
80 : : uint8_t ecpri_type;
81 : : struct rte_ecpri_combined_msg_hdr ecpri_msg;
82 : :
83 : 0 : ecpri_type = fapr->pr[DPAA2_FAFE_PSR_OFFSET];
84 [ # # ]: 0 : if ((ecpri_type >> 1) > 7) {
85 : 0 : DPAA2_PR_PRINT("Invalid ECPRI type(0x%02x)\r\n",
86 : : ecpri_type);
87 : : } else {
88 : 0 : DPAA2_PR_PRINT("ECPRI type %d present\r\n",
89 : : ecpri_type >> 1);
90 : 0 : if (ecpri_type == ECPRI_FAFE_TYPE_0 ||
91 [ # # ]: 0 : ecpri_type == ECPRI_FAFE_TYPE_1) {
92 : : /* Type 0 is identical to type1*/
93 : : ecpri_msg.type0.pc_id =
94 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET + 1];
95 : : ecpri_msg.type0.pc_id =
96 : 0 : ecpri_msg.type0.pc_id << 8;
97 : 0 : ecpri_msg.type0.pc_id |=
98 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET];
99 : :
100 : : ecpri_msg.type0.seq_id =
101 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET + 3];
102 : : ecpri_msg.type0.seq_id =
103 : 0 : ecpri_msg.type0.seq_id << 8;
104 : 0 : ecpri_msg.type0.seq_id |=
105 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET + 2];
106 : :
107 : 0 : DPAA2_PR_PRINT("pc_id(0x%04x) seq_id(0x%04x)\r\n",
108 [ # # ]: 0 : rte_be_to_cpu_16(ecpri_msg.type0.pc_id),
109 [ # # ]: 0 : rte_be_to_cpu_16(ecpri_msg.type0.seq_id));
110 : : } else if (ecpri_type == ECPRI_FAFE_TYPE_2) {
111 : : ecpri_msg.type2.rtc_id =
112 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET + 1];
113 : : ecpri_msg.type2.rtc_id =
114 : 0 : ecpri_msg.type2.rtc_id << 8;
115 : 0 : ecpri_msg.type2.rtc_id |=
116 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET];
117 : :
118 : : ecpri_msg.type2.seq_id =
119 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET + 3];
120 : : ecpri_msg.type2.seq_id =
121 : 0 : ecpri_msg.type2.seq_id << 8;
122 : 0 : ecpri_msg.type2.seq_id |=
123 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET + 2];
124 : :
125 : 0 : DPAA2_PR_PRINT("rtc_id(0x%04x) seq_id(0x%04x)\r\n",
126 [ # # ]: 0 : rte_be_to_cpu_16(ecpri_msg.type2.rtc_id),
127 [ # # ]: 0 : rte_be_to_cpu_16(ecpri_msg.type2.seq_id));
128 : : } else if (ecpri_type == ECPRI_FAFE_TYPE_3) {
129 : : DPAA2_PR_PRINT("ECPRI type3 extract not support\r\n");
130 : : } else if (ecpri_type == ECPRI_FAFE_TYPE_4) {
131 : : ecpri_msg.type4.rma_id =
132 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET];
133 : : ecpri_msg.type4.rw =
134 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET + 1] >> 4;
135 : : ecpri_msg.type4.rr =
136 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET + 1] & 0xf;
137 : :
138 : : ecpri_msg.type4.ele_id =
139 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET + 3];
140 : : ecpri_msg.type4.ele_id =
141 : 0 : ecpri_msg.type4.ele_id << 8;
142 : 0 : ecpri_msg.type4.ele_id |=
143 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET + 2];
144 : :
145 : 0 : DPAA2_PR_PRINT("rma_id(0x%02x) rw(0x%02x)",
146 : : ecpri_msg.type4.rma_id, ecpri_msg.type4.rw);
147 : 0 : DPAA2_PR_PRINT(" rr(0x%02x) ele_id(0x%04x)\r\n",
148 : : ecpri_msg.type4.rr,
149 [ # # ]: 0 : rte_be_to_cpu_16(ecpri_msg.type4.ele_id));
150 : : } else if (ecpri_type == ECPRI_FAFE_TYPE_5) {
151 : : ecpri_msg.type5.msr_id =
152 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET];
153 : : ecpri_msg.type5.act_type =
154 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET + 1];
155 : :
156 : 0 : DPAA2_PR_PRINT("rma_id(0x%02x) rw(0x%02x)\r\n",
157 : : ecpri_msg.type5.msr_id,
158 : : ecpri_msg.type5.act_type);
159 : : } else if (ecpri_type == ECPRI_FAFE_TYPE_6) {
160 : : ecpri_msg.type6.rst_id =
161 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET + 1];
162 : : ecpri_msg.type6.rst_id =
163 : 0 : ecpri_msg.type6.rst_id << 8;
164 : 0 : ecpri_msg.type6.rst_id |=
165 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET];
166 : :
167 : : ecpri_msg.type6.rst_op =
168 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET + 2];
169 : :
170 : 0 : DPAA2_PR_PRINT("rst_id(0x%04x) rst_op(0x%02x)\r\n",
171 [ # # ]: 0 : rte_be_to_cpu_16(ecpri_msg.type6.rst_id),
172 : : ecpri_msg.type6.rst_op);
173 : : } else if (ecpri_type == ECPRI_FAFE_TYPE_7) {
174 : : ecpri_msg.type7.evt_id =
175 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET];
176 : : ecpri_msg.type7.evt_type =
177 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET + 1];
178 : : ecpri_msg.type7.seq =
179 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET + 2];
180 : : ecpri_msg.type7.number =
181 : 0 : fapr->pr[DPAA2_ECPRI_MSG_OFFSET + 3];
182 : :
183 : 0 : DPAA2_PR_PRINT("evt_id(0x%02x) evt_type(0x%02x)",
184 : : ecpri_msg.type7.evt_id,
185 : : ecpri_msg.type7.evt_type);
186 : 0 : DPAA2_PR_PRINT(" seq(0x%02x) number(0x%02x)\r\n",
187 : : ecpri_msg.type7.seq,
188 : : ecpri_msg.type7.number);
189 : : }
190 : : }
191 : 0 : }
192 : :
193 : : static inline void
194 : 0 : dpaa2_print_faf(struct dpaa2_fapr_array *fapr)
195 : 0 : {
196 : : const int faf_bit_len = DPAA2_FAF_TOTAL_SIZE * 8;
197 : 0 : struct dpaa2_faf_bit_info faf_bits[faf_bit_len];
198 : : int i, byte_pos, bit_pos, vxlan = 0, vxlan_vlan = 0;
199 : : struct rte_ether_hdr vxlan_in_eth;
200 : : uint16_t vxlan_vlan_tci;
201 : : int ecpri = 0;
202 : :
203 [ # # ]: 0 : for (i = 0; i < faf_bit_len; i++) {
204 : 0 : faf_bits[i].position = i;
205 [ # # ]: 0 : if (i == FAFE_VXLAN_IN_VLAN_FRAM)
206 : 0 : faf_bits[i].name = "VXLAN VLAN Present";
207 : : else if (i == FAFE_VXLAN_IN_IPV4_FRAM)
208 : 0 : faf_bits[i].name = "VXLAN IPV4 Present";
209 : : else if (i == FAFE_VXLAN_IN_IPV6_FRAM)
210 : 0 : faf_bits[i].name = "VXLAN IPV6 Present";
211 : : else if (i == FAFE_VXLAN_IN_UDP_FRAM)
212 : 0 : faf_bits[i].name = "VXLAN UDP Present";
213 : : else if (i == FAFE_VXLAN_IN_TCP_FRAM)
214 : 0 : faf_bits[i].name = "VXLAN TCP Present";
215 : : else if (i == FAF_VXLAN_FRAM)
216 : 0 : faf_bits[i].name = "VXLAN Present";
217 : : else if (i == FAF_ETH_FRAM)
218 : 0 : faf_bits[i].name = "Ethernet MAC Present";
219 : : else if (i == FAF_VLAN_FRAM)
220 : 0 : faf_bits[i].name = "VLAN 1 Present";
221 : : else if (i == FAF_IPV4_FRAM)
222 : 0 : faf_bits[i].name = "IPv4 1 Present";
223 : : else if (i == FAF_IPV6_FRAM)
224 : 0 : faf_bits[i].name = "IPv6 1 Present";
225 : : else if (i == FAF_IP_FRAG_FRAM)
226 : 0 : faf_bits[i].name = "IP fragment Present";
227 : : else if (i == FAF_UDP_FRAM)
228 : 0 : faf_bits[i].name = "UDP Present";
229 : : else if (i == FAF_TCP_FRAM)
230 : 0 : faf_bits[i].name = "TCP Present";
231 : : else if (i == FAFE_ECPRI_FRAM)
232 : 0 : faf_bits[i].name = "ECPRI Present";
233 : : else
234 : 0 : faf_bits[i].name = "Check RM for this unusual frame";
235 : : }
236 : :
237 : : DPAA2_PR_PRINT("Frame Annotation Flags:\r\n");
238 [ # # ]: 0 : for (i = 0; i < faf_bit_len; i++) {
239 : 0 : byte_pos = i / 8 + DPAA2_FAFE_PSR_OFFSET;
240 : 0 : bit_pos = i % 8;
241 [ # # ]: 0 : if (fapr->pr[byte_pos] & (1 << (7 - bit_pos))) {
242 : 0 : DPAA2_PR_PRINT("FAF bit %d : %s\r\n",
243 : : faf_bits[i].position, faf_bits[i].name);
244 [ # # ]: 0 : if (i == FAF_VXLAN_FRAM)
245 : : vxlan = 1;
246 [ # # ]: 0 : else if (i == FAFE_ECPRI_FRAM)
247 : : ecpri = 1;
248 : : }
249 : : }
250 : :
251 [ # # ]: 0 : if (vxlan) {
252 : 0 : vxlan_in_eth.dst_addr.addr_bytes[0] =
253 : 0 : fapr->pr[DPAA2_VXLAN_IN_DADDR0_OFFSET];
254 : 0 : vxlan_in_eth.dst_addr.addr_bytes[1] =
255 : 0 : fapr->pr[DPAA2_VXLAN_IN_DADDR1_OFFSET];
256 : 0 : vxlan_in_eth.dst_addr.addr_bytes[2] =
257 : 0 : fapr->pr[DPAA2_VXLAN_IN_DADDR2_OFFSET];
258 : 0 : vxlan_in_eth.dst_addr.addr_bytes[3] =
259 : 0 : fapr->pr[DPAA2_VXLAN_IN_DADDR3_OFFSET];
260 : 0 : vxlan_in_eth.dst_addr.addr_bytes[4] =
261 : 0 : fapr->pr[DPAA2_VXLAN_IN_DADDR4_OFFSET];
262 : 0 : vxlan_in_eth.dst_addr.addr_bytes[5] =
263 : 0 : fapr->pr[DPAA2_VXLAN_IN_DADDR5_OFFSET];
264 : :
265 : 0 : vxlan_in_eth.src_addr.addr_bytes[0] =
266 : 0 : fapr->pr[DPAA2_VXLAN_IN_SADDR0_OFFSET];
267 : 0 : vxlan_in_eth.src_addr.addr_bytes[1] =
268 : 0 : fapr->pr[DPAA2_VXLAN_IN_SADDR1_OFFSET];
269 : 0 : vxlan_in_eth.src_addr.addr_bytes[2] =
270 : 0 : fapr->pr[DPAA2_VXLAN_IN_SADDR2_OFFSET];
271 : 0 : vxlan_in_eth.src_addr.addr_bytes[3] =
272 : 0 : fapr->pr[DPAA2_VXLAN_IN_SADDR3_OFFSET];
273 : 0 : vxlan_in_eth.src_addr.addr_bytes[4] =
274 : 0 : fapr->pr[DPAA2_VXLAN_IN_SADDR4_OFFSET];
275 : 0 : vxlan_in_eth.src_addr.addr_bytes[5] =
276 : 0 : fapr->pr[DPAA2_VXLAN_IN_SADDR5_OFFSET];
277 : :
278 : : vxlan_in_eth.ether_type =
279 : 0 : fapr->pr[DPAA2_VXLAN_IN_TYPE_OFFSET];
280 : : vxlan_in_eth.ether_type =
281 : 0 : vxlan_in_eth.ether_type << 8;
282 : 0 : vxlan_in_eth.ether_type |=
283 : 0 : fapr->pr[DPAA2_VXLAN_IN_TYPE_OFFSET + 1];
284 : :
285 [ # # ]: 0 : if (vxlan_in_eth.ether_type == RTE_ETHER_TYPE_VLAN)
286 : : vxlan_vlan = 1;
287 : : DPAA2_PR_PRINT("VXLAN inner eth:\r\n");
288 : : DPAA2_PR_PRINT("dst addr: ");
289 [ # # ]: 0 : for (i = 0; i < RTE_ETHER_ADDR_LEN; i++) {
290 [ # # ]: 0 : if (i != 0)
291 : : DPAA2_PR_PRINT(":");
292 : 0 : DPAA2_PR_PRINT("%02x",
293 : 0 : vxlan_in_eth.dst_addr.addr_bytes[i]);
294 : : }
295 : : DPAA2_PR_PRINT("\r\n");
296 : : DPAA2_PR_PRINT("src addr: ");
297 [ # # ]: 0 : for (i = 0; i < RTE_ETHER_ADDR_LEN; i++) {
298 [ # # ]: 0 : if (i != 0)
299 : : DPAA2_PR_PRINT(":");
300 : 0 : DPAA2_PR_PRINT("%02x",
301 : 0 : vxlan_in_eth.src_addr.addr_bytes[i]);
302 : : }
303 : : DPAA2_PR_PRINT("\r\n");
304 : 0 : DPAA2_PR_PRINT("type: 0x%04x\r\n",
305 : : vxlan_in_eth.ether_type);
306 [ # # ]: 0 : if (vxlan_vlan) {
307 : 0 : vxlan_vlan_tci = fapr->pr[DPAA2_VXLAN_IN_TCI_OFFSET];
308 : 0 : vxlan_vlan_tci = vxlan_vlan_tci << 8;
309 : 0 : vxlan_vlan_tci |=
310 : 0 : fapr->pr[DPAA2_VXLAN_IN_TCI_OFFSET + 1];
311 : :
312 : 0 : DPAA2_PR_PRINT("vlan tci: 0x%04x\r\n",
313 : : vxlan_vlan_tci);
314 : : }
315 : : }
316 : :
317 [ # # ]: 0 : if (ecpri)
318 : 0 : dpaa2_print_ecpri(fapr);
319 : 0 : }
320 : :
321 : : static inline void
322 : 0 : dpaa2_print_parse_result(struct dpaa2_annot_hdr *annotation)
323 : : {
324 : : struct dpaa2_fapr_array fapr;
325 : : struct dpaa2_fapr_field_info
326 : : fapr_fields[sizeof(support_dump_fields) /
327 : : sizeof(struct dpaa2_fapr_field_info)];
328 : : uint64_t len, i;
329 : :
330 : 0 : memcpy(&fapr, &annotation->word3, DPAA2_FAPR_SIZE);
331 [ # # ]: 0 : for (i = 0; i < (DPAA2_FAPR_SIZE / 8); i++)
332 [ # # ]: 0 : fapr.pr_64[i] = rte_cpu_to_be_64(fapr.pr_64[i]);
333 : :
334 : : memcpy(fapr_fields, support_dump_fields,
335 : : sizeof(support_dump_fields));
336 : :
337 : 0 : for (i = 0;
338 [ # # ]: 0 : i < sizeof(fapr_fields) /
339 : : sizeof(struct dpaa2_fapr_field_info);
340 : 0 : i++) {
341 [ # # ]: 0 : if (!strcmp(fapr_fields[i].name, NEXT_HEADER_NAME)) {
342 : 0 : fapr_fields[i].value = fapr.pr[DPAA2_PR_NXTHDR_OFFSET];
343 : 0 : fapr_fields[i].value = fapr_fields[i].value << 8;
344 : 0 : fapr_fields[i].value |=
345 : 0 : fapr.pr[DPAA2_PR_NXTHDR_OFFSET + 1];
346 [ # # ]: 0 : } else if (!strcmp(fapr_fields[i].name, ETH_OFF_NAME)) {
347 : 0 : fapr_fields[i].value = fapr.pr[DPAA2_PR_ETH_OFF_OFFSET];
348 [ # # ]: 0 : } else if (!strcmp(fapr_fields[i].name, VLAN_TCI_OFF_NAME)) {
349 : 0 : fapr_fields[i].value = fapr.pr[DPAA2_PR_TCI_OFF_OFFSET];
350 [ # # ]: 0 : } else if (!strcmp(fapr_fields[i].name, LAST_ENTRY_OFF_NAME)) {
351 : 0 : fapr_fields[i].value =
352 : 0 : fapr.pr[DPAA2_PR_LAST_ETYPE_OFFSET];
353 [ # # ]: 0 : } else if (!strcmp(fapr_fields[i].name, L3_OFF_NAME)) {
354 : 0 : fapr_fields[i].value = fapr.pr[DPAA2_PR_L3_OFF_OFFSET];
355 [ # # ]: 0 : } else if (!strcmp(fapr_fields[i].name, L4_OFF_NAME)) {
356 : 0 : fapr_fields[i].value = fapr.pr[DPAA2_PR_L4_OFF_OFFSET];
357 [ # # ]: 0 : } else if (!strcmp(fapr_fields[i].name, L5_OFF_NAME)) {
358 : 0 : fapr_fields[i].value = fapr.pr[DPAA2_PR_L5_OFF_OFFSET];
359 [ # # ]: 0 : } else if (!strcmp(fapr_fields[i].name, NEXT_HEADER_OFF_NAME)) {
360 : 0 : fapr_fields[i].value =
361 : 0 : fapr.pr[DPAA2_PR_NXTHDR_OFF_OFFSET];
362 : : }
363 : : }
364 : :
365 : : len = sizeof(fapr_fields) / sizeof(struct dpaa2_fapr_field_info);
366 : : DPAA2_PR_PRINT("Parse Result:\r\n");
367 [ # # ]: 0 : for (i = 0; i < len; i++) {
368 : 0 : DPAA2_PR_PRINT("%21s : 0x%02x\r\n",
369 : 0 : fapr_fields[i].name, fapr_fields[i].value);
370 : : }
371 : 0 : dpaa2_print_faf(&fapr);
372 : 0 : }
373 : :
374 : : #endif
|