]>
Commit | Line | Data |
---|---|---|
11fdf7f2 TL |
1 | /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0) |
2 | * Copyright 2013-2015 Freescale Semiconductor Inc. | |
3 | * Copyright 2016-2017 NXP | |
4 | * | |
5 | */ | |
6 | #ifndef __FSL_DPKG_H_ | |
7 | #define __FSL_DPKG_H_ | |
8 | ||
9 | #include <fsl_net.h> | |
10 | ||
11 | /* Data Path Key Generator API | |
12 | * Contains initialization APIs and runtime APIs for the Key Generator | |
13 | */ | |
14 | ||
15 | /** Key Generator properties */ | |
16 | ||
17 | /** | |
18 | * Number of masks per key extraction | |
19 | */ | |
20 | #define DPKG_NUM_OF_MASKS 4 | |
21 | /** | |
22 | * Number of extractions per key profile | |
23 | */ | |
24 | #define DPKG_MAX_NUM_OF_EXTRACTS 10 | |
25 | ||
26 | /** | |
27 | * enum dpkg_extract_from_hdr_type - Selecting extraction by header types | |
28 | * @DPKG_FROM_HDR: Extract selected bytes from header, by offset | |
29 | * @DPKG_FROM_FIELD: Extract selected bytes from header, by offset from field | |
30 | * @DPKG_FULL_FIELD: Extract a full field | |
31 | */ | |
32 | enum dpkg_extract_from_hdr_type { | |
33 | DPKG_FROM_HDR = 0, | |
34 | DPKG_FROM_FIELD = 1, | |
35 | DPKG_FULL_FIELD = 2 | |
36 | }; | |
37 | ||
38 | /** | |
39 | * enum dpkg_extract_type - Enumeration for selecting extraction type | |
40 | * @DPKG_EXTRACT_FROM_HDR: Extract from the header | |
41 | * @DPKG_EXTRACT_FROM_DATA: Extract from data not in specific header | |
42 | * @DPKG_EXTRACT_FROM_PARSE: Extract from parser-result; | |
43 | * e.g. can be used to extract header existence; | |
44 | * please refer to 'Parse Result definition' section in the parser BG | |
45 | */ | |
46 | enum dpkg_extract_type { | |
47 | DPKG_EXTRACT_FROM_HDR = 0, | |
48 | DPKG_EXTRACT_FROM_DATA = 1, | |
49 | DPKG_EXTRACT_FROM_PARSE = 3 | |
50 | }; | |
51 | ||
52 | /** | |
53 | * struct dpkg_mask - A structure for defining a single extraction mask | |
54 | * @mask: Byte mask for the extracted content | |
55 | * @offset: Offset within the extracted content | |
56 | */ | |
57 | struct dpkg_mask { | |
58 | uint8_t mask; | |
59 | uint8_t offset; | |
60 | }; | |
61 | ||
62 | /* Macros for accessing command fields smaller than 1byte */ | |
63 | #define DPKG_MASK(field) \ | |
64 | GENMASK(DPKG_##field##_SHIFT + DPKG_##field##_SIZE - 1, \ | |
65 | DPKG_##field##_SHIFT) | |
66 | #define dpkg_set_field(var, field, val) \ | |
67 | ((var) |= (((val) << DPKG_##field##_SHIFT) & DPKG_MASK(field))) | |
68 | #define dpkg_get_field(var, field) \ | |
69 | (((var) & DPKG_MASK(field)) >> DPKG_##field##_SHIFT) | |
70 | ||
71 | /** | |
72 | * struct dpkg_extract - A structure for defining a single extraction | |
73 | * @type: Determines how the union below is interpreted: | |
9f95a23c TL |
74 | * DPKG_EXTRACT_FROM_HDR: selects 'from_hdr'; |
75 | * DPKG_EXTRACT_FROM_DATA: selects 'from_data'; | |
76 | * DPKG_EXTRACT_FROM_PARSE: selects 'from_parse' | |
11fdf7f2 | 77 | * @extract: Selects extraction method |
9f95a23c TL |
78 | * @extract.from_hdr: Used when 'type = DPKG_EXTRACT_FROM_HDR' |
79 | * @extract.from_data: Used when 'type = DPKG_EXTRACT_FROM_DATA' | |
80 | * @extract.from_parse: Used when 'type = DPKG_EXTRACT_FROM_PARSE' | |
81 | * @extract.from_hdr.prot: Any of the supported headers | |
82 | * @extract.from_hdr.type: Defines the type of header extraction: | |
83 | * DPKG_FROM_HDR: use size & offset below; | |
84 | * DPKG_FROM_FIELD: use field, size and offset below; | |
85 | * DPKG_FULL_FIELD: use field below | |
86 | * @extract.from_hdr.field: One of the supported fields (NH_FLD_) | |
87 | * @extract.from_hdr.size: Size in bytes | |
88 | * @extract.from_hdr.offset: Byte offset | |
89 | * @extract.from_hdr.hdr_index: Clear for cases not listed below; | |
90 | * Used for protocols that may have more than a single | |
91 | * header, 0 indicates an outer header; | |
92 | * Supported protocols (possible values): | |
93 | * NET_PROT_VLAN (0, HDR_INDEX_LAST); | |
94 | * NET_PROT_MPLS (0, 1, HDR_INDEX_LAST); | |
95 | * NET_PROT_IP(0, HDR_INDEX_LAST); | |
96 | * NET_PROT_IPv4(0, HDR_INDEX_LAST); | |
97 | * NET_PROT_IPv6(0, HDR_INDEX_LAST); | |
98 | * @extract.from_data.size: Size in bytes | |
99 | * @extract.from_data.offset: Byte offset | |
100 | * @extract.from_parse.size: Size in bytes | |
101 | * @extract.from_parse.offset: Byte offset | |
11fdf7f2 TL |
102 | * @num_of_byte_masks: Defines the number of valid entries in the array below; |
103 | * This is also the number of bytes to be used as masks | |
104 | * @masks: Masks parameters | |
105 | */ | |
106 | struct dpkg_extract { | |
107 | enum dpkg_extract_type type; | |
11fdf7f2 | 108 | union { |
11fdf7f2 TL |
109 | struct { |
110 | enum net_prot prot; | |
111 | enum dpkg_extract_from_hdr_type type; | |
112 | uint32_t field; | |
113 | uint8_t size; | |
114 | uint8_t offset; | |
115 | uint8_t hdr_index; | |
116 | } from_hdr; | |
11fdf7f2 TL |
117 | struct { |
118 | uint8_t size; | |
119 | uint8_t offset; | |
120 | } from_data; | |
11fdf7f2 TL |
121 | struct { |
122 | uint8_t size; | |
123 | uint8_t offset; | |
124 | } from_parse; | |
125 | } extract; | |
126 | ||
127 | uint8_t num_of_byte_masks; | |
128 | struct dpkg_mask masks[DPKG_NUM_OF_MASKS]; | |
129 | }; | |
130 | ||
131 | /** | |
132 | * struct dpkg_profile_cfg - A structure for defining a full Key Generation | |
133 | * profile (rule) | |
134 | * @num_extracts: Defines the number of valid entries in the array below | |
135 | * @extracts: Array of required extractions | |
136 | */ | |
137 | struct dpkg_profile_cfg { | |
138 | uint8_t num_extracts; | |
139 | struct dpkg_extract extracts[DPKG_MAX_NUM_OF_EXTRACTS]; | |
140 | }; | |
141 | ||
142 | /* dpni_set_rx_tc_dist extension (structure of the DMA-able memory at | |
143 | * key_cfg_iova) | |
144 | */ | |
145 | struct dpni_mask_cfg { | |
146 | uint8_t mask; | |
147 | uint8_t offset; | |
148 | }; | |
149 | ||
150 | #define DPKG_EFH_TYPE_SHIFT 0 | |
151 | #define DPKG_EFH_TYPE_SIZE 4 | |
152 | #define DPKG_EXTRACT_TYPE_SHIFT 0 | |
153 | #define DPKG_EXTRACT_TYPE_SIZE 4 | |
154 | ||
155 | struct dpni_dist_extract { | |
156 | /* word 0 */ | |
157 | uint8_t prot; | |
158 | /* EFH type stored in the 4 least significant bits */ | |
159 | uint8_t efh_type; | |
160 | uint8_t size; | |
161 | uint8_t offset; | |
162 | uint32_t field; | |
163 | /* word 1 */ | |
164 | uint8_t hdr_index; | |
165 | uint8_t constant; | |
166 | uint8_t num_of_repeats; | |
167 | uint8_t num_of_byte_masks; | |
168 | /* Extraction type is stored in the 4 LSBs */ | |
169 | uint8_t extract_type; | |
170 | uint8_t pad[3]; | |
171 | /* word 2 */ | |
172 | struct dpni_mask_cfg masks[4]; | |
173 | }; | |
174 | ||
175 | struct dpni_ext_set_rx_tc_dist { | |
176 | /* extension word 0 */ | |
177 | uint8_t num_extracts; | |
178 | uint8_t pad[7]; | |
179 | /* words 1..25 */ | |
180 | struct dpni_dist_extract extracts[10]; | |
181 | }; | |
182 | ||
183 | int dpkg_prepare_key_cfg(const struct dpkg_profile_cfg *cfg, | |
184 | uint8_t *key_cfg_buf); | |
185 | ||
186 | #endif /* __FSL_DPKG_H_ */ |