New upstream version 18.11-rc1
[deb_dpdk.git] / drivers / net / dpaa2 / mc / fsl_dpkg.h
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:
74  *      DPKG_EXTRACT_FROM_HDR: selects 'from_hdr';
75  *      DPKG_EXTRACT_FROM_DATA: selects 'from_data';
76  *      DPKG_EXTRACT_FROM_PARSE: selects 'from_parse'
77  * @extract: Selects extraction method
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
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;
108         union {
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;
117                 struct {
118                         uint8_t size;
119                         uint8_t offset;
120                 } from_data;
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_ */