xref: /dpdk/drivers/net/dpaa2/dpaa2_sparser.h (revision 9df62f8574c2ea139432e3fff010d756f0980c45)
1 /* * SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright 2018-2019 NXP
3  */
4 
5 /**
6  * @file	dpaa2_sparser.h
7  *
8  * @brief	Soft parser related macros & functions support for DPAA2 device
9  *	framework based applications.
10  *
11  */
12 
13 #ifndef _DPAA2_SPARSER_H
14 #define _DPAA2_SPARSER_H
15 
16 #define WRIOP_SS_INITIALIZER(priv)				\
17 do {								\
18 	/* Base offset of parse profile memory in WRIOP */	\
19 	(priv)->ss_offset = 0x20;				\
20 	(priv)->ss_iova	= (size_t)NULL;			\
21 	(priv)->ss_param_iova = (size_t)NULL;			\
22 } while (0)
23 
24 /**************************************************************************/
25 /*
26  * @enum   parser_starting_hxs_code
27  * @Description PARSER Starting HXS code
28  */
29 /***************************************************************************/
30 enum parser_starting_hxs_code {
31 	/** Ethernet Starting HXS coding */
32 	PARSER_ETH_STARTING_HXS = 0x0000,
33 	/** LLC+SNAP Starting HXS coding */
34 	PARSER_LLC_SNAP_STARTING_HXS = 0x0001,
35 	/** VLAN Starting HXS coding */
36 	PARSER_VLAN_STARTING_HXS = 0x0002,
37 	/** PPPoE+PPP Starting HXS coding */
38 	PARSER_PPPOE_PPP_STARTING_HXS = 0x0003,
39 	/** MPLS Starting HXS coding */
40 	PARSER_MPLS_STARTING_HXS = 0x0004,
41 	/** ARP Starting HXS coding */
42 	PARSER_ARP_STARTING_HXS = 0x0005,
43 	/** IP Starting HXS coding */
44 	PARSER_IP_STARTING_HXS  = 0x0006,
45 	/** IPv4 Starting HXS coding */
46 	PARSER_IPV4_STARTING_HXS = 0x0007,
47 	/** IPv6 Starting HXS coding */
48 	PARSER_IPV6_STARTING_HXS = 0x0008,
49 	/** GRE Starting HXS coding */
50 	PARSER_GRE_STARTING_HXS = 0x0009,
51 	/** MinEncap Starting HXS coding */
52 	PARSER_MINENCAP_STARTING_HXS = 0x000A,
53 	/** Other L3 Shell Starting HXS coding */
54 	PARSER_OTHER_L3_SHELL_STARTING_HXS = 0x000B,
55 	/** TCP Starting HXS coding */
56 	PARSER_TCP_STARTING_HXS = 0x000C,
57 	/** UDP Starting HXS coding */
58 	PARSER_UDP_STARTING_HXS = 0x000D,
59 	/** IPSec Starting HXS coding */
60 	PARSER_IPSEC_STARTING_HXS = 0x000E,
61 	/** SCTP Starting HXS coding */
62 	PARSER_SCTP_STARTING_HXS = 0x000F,
63 	/** DCCP Starting HXS coding */
64 	PARSER_DCCP_STARTING_HXS = 0x0010,
65 	/** Other L4 Shell Starting HXS coding */
66 	PARSER_OTHER_L4_SHELL_STARTING_HXS = 0x0011,
67 	/** GTP Starting HXS coding */
68 	PARSER_GTP_STARTING_HXS = 0x0012,
69 	/** ESP Starting HXS coding */
70 	PARSER_ESP_STARTING_HXS = 0x0013,
71 	/** VXLAN Starting HXS coding */
72 	PARSER_VXLAN_STARTING_HXS = 0x0014,
73 	/** L5 (and above) Shell Starting HXS coding */
74 	PARSER_L5_SHELL_STARTING_HXS = 0x001E,
75 	/** Final Shell Starting HXS coding */
76 	PARSER_FINAL_SHELL_STARTING_HXS = 0x001F
77 };
78 
79 /**************************************************************************/
80 /*
81  * @Description    struct dpni_drv_sparser_param - Structure representing the
82  *			information needed to activate(enable) a Soft Parser.
83  */
84 /***************************************************************************/
85 
86 struct dpni_drv_sparser_param {
87 	/* The "custom_header_first" must be set if the custom header to parse
88 	 * is the first header in the packet, otherwise "custom_header_first"
89 	 * must be cleared.
90 	 */
91 	uint8_t             custom_header_first;
92 	/* Hard HXS on which a soft parser is activated. This must be
93 	 * configured.
94 	 * if the header to parse is not the first header in the packet.
95 	 */
96 	enum parser_starting_hxs_code   link_to_hard_hxs;
97 	/* Soft Sequence Start PC */
98 	uint16_t            start_pc;
99 	/* Soft Sequence byte-code */
100 	uint8_t             *byte_code;
101 	/* Soft Sequence size */
102 	uint16_t            size;
103 	/* Pointer to the Parameters Array of the SP */
104 	uint8_t             *param_array;
105 	/* Parameters offset */
106 	uint8_t             param_offset;
107 	/* Parameters size */
108 	uint8_t             param_size;
109 };
110 
111 struct sp_parse_result {
112 	/* Next header */
113 	uint16_t    nxt_hdr;
114 	/* Frame Attribute Flags Extension */
115 	uint16_t    frame_attribute_flags_extension;
116 	/* Frame Attribute Flags (part 1) */
117 	uint32_t    frame_attribute_flags_1;
118 	/* Frame Attribute Flags (part 2) */
119 	uint32_t    frame_attribute_flags_2;
120 	/* Frame Attribute Flags (part 3) */
121 	uint32_t    frame_attribute_flags_3;
122 	/* Shim Offset 1 */
123 	uint8_t     shim_offset_1;
124 	/* Shim Offset 2 */
125 	uint8_t     shim_offset_2;
126 	/* Outer IP protocol field offset */
127 	uint8_t     ip_1_pid_offset;
128 	/* Ethernet offset */
129 	uint8_t     eth_offset;
130 	/* LLC+SNAP offset */
131 	uint8_t     llc_snap_offset;
132 	/* First VLAN's TCI field offset*/
133 	uint8_t     vlan_tci1_offset;
134 	/* Last VLAN's TCI field offset*/
135 	uint8_t     vlan_tcin_offset;
136 	/* Last Ethertype offset*/
137 	uint8_t     last_etype_offset;
138 	/* PPPoE offset */
139 	uint8_t     pppoe_offset;
140 	/* First MPLS offset */
141 	uint8_t     mpls_offset_1;
142 	/* Last MPLS offset */
143 	uint8_t     mpls_offset_n;
144 	/* Layer 3 (Outer IP, ARP, FCoE or FIP) offset */
145 	uint8_t     l3_offset;
146 	/* Inner IP or MinEncap offset*/
147 	uint8_t     ipn_or_minencap_offset;
148 	/* GRE offset */
149 	uint8_t     gre_offset;
150 	/* Layer 4 offset*/
151 	uint8_t     l4_offset;
152 	/* Layer 5 offset */
153 	uint8_t     l5_offset;
154 	/* Routing header offset of 1st IPv6 header */
155 	uint8_t     routing_hdr_offset1;
156 	/* Routing header offset of 2nd IPv6 header */
157 	uint8_t     routing_hdr_offset2;
158 	/* Next header offset */
159 	uint8_t     nxt_hdr_offset;
160 	/* IPv6 fragmentable part offset */
161 	uint8_t     ipv6_frag_offset;
162 	/* Frame's untouched running sum, input to parser */
163 	uint16_t    gross_running_sum;
164 	/* Running Sum */
165 	uint16_t    running_sum;
166 	/* Parse Error code */
167 	uint8_t     parse_error_code;
168 	/* Offset to the next header field before IPv6 fragment extension */
169 	uint8_t     nxt_hdr_before_ipv6_frag_ext;
170 	/* Inner IP Protocol field offset */
171 	uint8_t     ip_n_pid_offset;
172 	/* Reserved for Soft parsing context*/
173 	uint8_t     soft_parsing_context[21];
174 };
175 
176 struct frame_attr {
177 	const char *fld_name;
178 	uint8_t     faf_offset;
179 	uint32_t    fld_mask;
180 };
181 
182 struct frame_attr_ext {
183 	const char *fld_name;
184 	uint8_t     faf_ext_offset;
185 	uint16_t    fld_mask;
186 };
187 
188 
189 struct parse_err {
190 	uint16_t    code;
191 	const char *err_name;
192 };
193 
194 /* Macro definitions */
195 #define IS_ONE_BIT_FIELD(_mask)                 \
196 (!((_mask) & ((_mask) - 1)) || (_mask == 1))
197 
198 int dpaa2_eth_load_wriop_soft_parser(struct dpaa2_dev_priv *priv,
199 		enum dpni_soft_sequence_dest dest);
200 int dpaa2_eth_enable_wriop_soft_parser(struct dpaa2_dev_priv *priv,
201 		enum dpni_soft_sequence_dest dest);
202 #endif /* _DPAA2_SPARSER_H_ */
203