Loading...
Note: File does not exist in v5.14.15.
1// SPDX-License-Identifier: GPL-2.0
2/* Copyright (C) 2024 Intel Corporation */
3
4#include "ice_common.h"
5
6struct ice_pkg_sect_hdr {
7 __le16 count;
8 __le16 offset;
9};
10
11/**
12 * ice_parser_sect_item_get - parse an item from a section
13 * @sect_type: section type
14 * @section: section object
15 * @index: index of the item to get
16 * @offset: dummy as prototype of ice_pkg_enum_entry's last parameter
17 *
18 * Return: a pointer to the item or NULL.
19 */
20static void *ice_parser_sect_item_get(u32 sect_type, void *section,
21 u32 index, u32 __maybe_unused *offset)
22{
23 size_t data_off = ICE_SEC_DATA_OFFSET;
24 struct ice_pkg_sect_hdr *hdr;
25 size_t size;
26
27 if (!section)
28 return NULL;
29
30 switch (sect_type) {
31 case ICE_SID_RXPARSER_IMEM:
32 size = ICE_SID_RXPARSER_IMEM_ENTRY_SIZE;
33 break;
34 case ICE_SID_RXPARSER_METADATA_INIT:
35 size = ICE_SID_RXPARSER_METADATA_INIT_ENTRY_SIZE;
36 break;
37 case ICE_SID_RXPARSER_CAM:
38 size = ICE_SID_RXPARSER_CAM_ENTRY_SIZE;
39 break;
40 case ICE_SID_RXPARSER_PG_SPILL:
41 size = ICE_SID_RXPARSER_PG_SPILL_ENTRY_SIZE;
42 break;
43 case ICE_SID_RXPARSER_NOMATCH_CAM:
44 size = ICE_SID_RXPARSER_NOMATCH_CAM_ENTRY_SIZE;
45 break;
46 case ICE_SID_RXPARSER_NOMATCH_SPILL:
47 size = ICE_SID_RXPARSER_NOMATCH_SPILL_ENTRY_SIZE;
48 break;
49 case ICE_SID_RXPARSER_BOOST_TCAM:
50 size = ICE_SID_RXPARSER_BOOST_TCAM_ENTRY_SIZE;
51 break;
52 case ICE_SID_LBL_RXPARSER_TMEM:
53 data_off = ICE_SEC_LBL_DATA_OFFSET;
54 size = ICE_SID_LBL_ENTRY_SIZE;
55 break;
56 case ICE_SID_RXPARSER_MARKER_PTYPE:
57 size = ICE_SID_RXPARSER_MARKER_TYPE_ENTRY_SIZE;
58 break;
59 case ICE_SID_RXPARSER_MARKER_GRP:
60 size = ICE_SID_RXPARSER_MARKER_GRP_ENTRY_SIZE;
61 break;
62 case ICE_SID_RXPARSER_PROTO_GRP:
63 size = ICE_SID_RXPARSER_PROTO_GRP_ENTRY_SIZE;
64 break;
65 case ICE_SID_RXPARSER_FLAG_REDIR:
66 size = ICE_SID_RXPARSER_FLAG_REDIR_ENTRY_SIZE;
67 break;
68 default:
69 return NULL;
70 }
71
72 hdr = section;
73 if (index >= le16_to_cpu(hdr->count))
74 return NULL;
75
76 return section + data_off + index * size;
77}
78
79/**
80 * ice_parser_create_table - create an item table from a section
81 * @hw: pointer to the hardware structure
82 * @sect_type: section type
83 * @item_size: item size in bytes
84 * @length: number of items in the table to create
85 * @parse_item: the function to parse the item
86 * @no_offset: ignore header offset, calculate index from 0
87 *
88 * Return: a pointer to the allocated table or ERR_PTR.
89 */
90static void *
91ice_parser_create_table(struct ice_hw *hw, u32 sect_type,
92 u32 item_size, u32 length,
93 void (*parse_item)(struct ice_hw *hw, u16 idx,
94 void *item, void *data,
95 int size), bool no_offset)
96{
97 struct ice_pkg_enum state = {};
98 struct ice_seg *seg = hw->seg;
99 void *table, *data, *item;
100 u16 idx = 0;
101
102 if (!seg)
103 return ERR_PTR(-EINVAL);
104
105 table = kzalloc(item_size * length, GFP_KERNEL);
106 if (!table)
107 return ERR_PTR(-ENOMEM);
108
109 do {
110 data = ice_pkg_enum_entry(seg, &state, sect_type, NULL,
111 ice_parser_sect_item_get);
112 seg = NULL;
113 if (data) {
114 struct ice_pkg_sect_hdr *hdr = state.sect;
115
116 if (!no_offset)
117 idx = le16_to_cpu(hdr->offset) +
118 state.entry_idx;
119
120 item = (void *)((uintptr_t)table + idx * item_size);
121 parse_item(hw, idx, item, data, item_size);
122
123 if (no_offset)
124 idx++;
125 }
126 } while (data);
127
128 return table;
129}
130
131/*** ICE_SID_RXPARSER_IMEM section ***/
132static void ice_imem_bst_bm_dump(struct ice_hw *hw, struct ice_bst_main *bm)
133{
134 struct device *dev = ice_hw_to_dev(hw);
135
136 dev_info(dev, "boost main:\n");
137 dev_info(dev, "\talu0 = %d\n", bm->alu0);
138 dev_info(dev, "\talu1 = %d\n", bm->alu1);
139 dev_info(dev, "\talu2 = %d\n", bm->alu2);
140 dev_info(dev, "\tpg = %d\n", bm->pg);
141}
142
143static void ice_imem_bst_kb_dump(struct ice_hw *hw,
144 struct ice_bst_keybuilder *kb)
145{
146 struct device *dev = ice_hw_to_dev(hw);
147
148 dev_info(dev, "boost key builder:\n");
149 dev_info(dev, "\tpriority = %d\n", kb->prio);
150 dev_info(dev, "\ttsr_ctrl = %d\n", kb->tsr_ctrl);
151}
152
153static void ice_imem_np_kb_dump(struct ice_hw *hw,
154 struct ice_np_keybuilder *kb)
155{
156 struct device *dev = ice_hw_to_dev(hw);
157
158 dev_info(dev, "next proto key builder:\n");
159 dev_info(dev, "\topc = %d\n", kb->opc);
160 dev_info(dev, "\tstart_or_reg0 = %d\n", kb->start_reg0);
161 dev_info(dev, "\tlen_or_reg1 = %d\n", kb->len_reg1);
162}
163
164static void ice_imem_pg_kb_dump(struct ice_hw *hw,
165 struct ice_pg_keybuilder *kb)
166{
167 struct device *dev = ice_hw_to_dev(hw);
168
169 dev_info(dev, "parse graph key builder:\n");
170 dev_info(dev, "\tflag0_ena = %d\n", kb->flag0_ena);
171 dev_info(dev, "\tflag1_ena = %d\n", kb->flag1_ena);
172 dev_info(dev, "\tflag2_ena = %d\n", kb->flag2_ena);
173 dev_info(dev, "\tflag3_ena = %d\n", kb->flag3_ena);
174 dev_info(dev, "\tflag0_idx = %d\n", kb->flag0_idx);
175 dev_info(dev, "\tflag1_idx = %d\n", kb->flag1_idx);
176 dev_info(dev, "\tflag2_idx = %d\n", kb->flag2_idx);
177 dev_info(dev, "\tflag3_idx = %d\n", kb->flag3_idx);
178 dev_info(dev, "\talu_reg_idx = %d\n", kb->alu_reg_idx);
179}
180
181static void ice_imem_alu_dump(struct ice_hw *hw,
182 struct ice_alu *alu, int index)
183{
184 struct device *dev = ice_hw_to_dev(hw);
185
186 dev_info(dev, "alu%d:\n", index);
187 dev_info(dev, "\topc = %d\n", alu->opc);
188 dev_info(dev, "\tsrc_start = %d\n", alu->src_start);
189 dev_info(dev, "\tsrc_len = %d\n", alu->src_len);
190 dev_info(dev, "\tshift_xlate_sel = %d\n", alu->shift_xlate_sel);
191 dev_info(dev, "\tshift_xlate_key = %d\n", alu->shift_xlate_key);
192 dev_info(dev, "\tsrc_reg_id = %d\n", alu->src_reg_id);
193 dev_info(dev, "\tdst_reg_id = %d\n", alu->dst_reg_id);
194 dev_info(dev, "\tinc0 = %d\n", alu->inc0);
195 dev_info(dev, "\tinc1 = %d\n", alu->inc1);
196 dev_info(dev, "\tproto_offset_opc = %d\n", alu->proto_offset_opc);
197 dev_info(dev, "\tproto_offset = %d\n", alu->proto_offset);
198 dev_info(dev, "\tbranch_addr = %d\n", alu->branch_addr);
199 dev_info(dev, "\timm = %d\n", alu->imm);
200 dev_info(dev, "\tdst_start = %d\n", alu->dst_start);
201 dev_info(dev, "\tdst_len = %d\n", alu->dst_len);
202 dev_info(dev, "\tflags_extr_imm = %d\n", alu->flags_extr_imm);
203 dev_info(dev, "\tflags_start_imm= %d\n", alu->flags_start_imm);
204}
205
206/**
207 * ice_imem_dump - dump an imem item info
208 * @hw: pointer to the hardware structure
209 * @item: imem item to dump
210 */
211static void ice_imem_dump(struct ice_hw *hw, struct ice_imem_item *item)
212{
213 struct device *dev = ice_hw_to_dev(hw);
214
215 dev_info(dev, "index = %d\n", item->idx);
216 ice_imem_bst_bm_dump(hw, &item->b_m);
217 ice_imem_bst_kb_dump(hw, &item->b_kb);
218 dev_info(dev, "pg priority = %d\n", item->pg_prio);
219 ice_imem_np_kb_dump(hw, &item->np_kb);
220 ice_imem_pg_kb_dump(hw, &item->pg_kb);
221 ice_imem_alu_dump(hw, &item->alu0, 0);
222 ice_imem_alu_dump(hw, &item->alu1, 1);
223 ice_imem_alu_dump(hw, &item->alu2, 2);
224}
225
226#define ICE_IM_BM_ALU0 BIT(0)
227#define ICE_IM_BM_ALU1 BIT(1)
228#define ICE_IM_BM_ALU2 BIT(2)
229#define ICE_IM_BM_PG BIT(3)
230
231/**
232 * ice_imem_bm_init - parse 4 bits of Boost Main
233 * @bm: pointer to the Boost Main structure
234 * @data: Boost Main data to be parsed
235 */
236static void ice_imem_bm_init(struct ice_bst_main *bm, u8 data)
237{
238 bm->alu0 = FIELD_GET(ICE_IM_BM_ALU0, data);
239 bm->alu1 = FIELD_GET(ICE_IM_BM_ALU1, data);
240 bm->alu2 = FIELD_GET(ICE_IM_BM_ALU2, data);
241 bm->pg = FIELD_GET(ICE_IM_BM_PG, data);
242}
243
244#define ICE_IM_BKB_PRIO GENMASK(7, 0)
245#define ICE_IM_BKB_TSR_CTRL BIT(8)
246
247/**
248 * ice_imem_bkb_init - parse 10 bits of Boost Main Build
249 * @bkb: pointer to the Boost Main Build structure
250 * @data: Boost Main Build data to be parsed
251 */
252static void ice_imem_bkb_init(struct ice_bst_keybuilder *bkb, u16 data)
253{
254 bkb->prio = FIELD_GET(ICE_IM_BKB_PRIO, data);
255 bkb->tsr_ctrl = FIELD_GET(ICE_IM_BKB_TSR_CTRL, data);
256}
257
258#define ICE_IM_NPKB_OPC GENMASK(1, 0)
259#define ICE_IM_NPKB_S_R0 GENMASK(9, 2)
260#define ICE_IM_NPKB_L_R1 GENMASK(17, 10)
261
262/**
263 * ice_imem_npkb_init - parse 18 bits of Next Protocol Key Build
264 * @kb: pointer to the Next Protocol Key Build structure
265 * @data: Next Protocol Key Build data to be parsed
266 */
267static void ice_imem_npkb_init(struct ice_np_keybuilder *kb, u32 data)
268{
269 kb->opc = FIELD_GET(ICE_IM_NPKB_OPC, data);
270 kb->start_reg0 = FIELD_GET(ICE_IM_NPKB_S_R0, data);
271 kb->len_reg1 = FIELD_GET(ICE_IM_NPKB_L_R1, data);
272}
273
274#define ICE_IM_PGKB_F0_ENA BIT_ULL(0)
275#define ICE_IM_PGKB_F0_IDX GENMASK_ULL(6, 1)
276#define ICE_IM_PGKB_F1_ENA BIT_ULL(7)
277#define ICE_IM_PGKB_F1_IDX GENMASK_ULL(13, 8)
278#define ICE_IM_PGKB_F2_ENA BIT_ULL(14)
279#define ICE_IM_PGKB_F2_IDX GENMASK_ULL(20, 15)
280#define ICE_IM_PGKB_F3_ENA BIT_ULL(21)
281#define ICE_IM_PGKB_F3_IDX GENMASK_ULL(27, 22)
282#define ICE_IM_PGKB_AR_IDX GENMASK_ULL(34, 28)
283
284/**
285 * ice_imem_pgkb_init - parse 35 bits of Parse Graph Key Build
286 * @kb: pointer to the Parse Graph Key Build structure
287 * @data: Parse Graph Key Build data to be parsed
288 */
289static void ice_imem_pgkb_init(struct ice_pg_keybuilder *kb, u64 data)
290{
291 kb->flag0_ena = FIELD_GET(ICE_IM_PGKB_F0_ENA, data);
292 kb->flag0_idx = FIELD_GET(ICE_IM_PGKB_F0_IDX, data);
293 kb->flag1_ena = FIELD_GET(ICE_IM_PGKB_F1_ENA, data);
294 kb->flag1_idx = FIELD_GET(ICE_IM_PGKB_F1_IDX, data);
295 kb->flag2_ena = FIELD_GET(ICE_IM_PGKB_F2_ENA, data);
296 kb->flag2_idx = FIELD_GET(ICE_IM_PGKB_F2_IDX, data);
297 kb->flag3_ena = FIELD_GET(ICE_IM_PGKB_F3_ENA, data);
298 kb->flag3_idx = FIELD_GET(ICE_IM_PGKB_F3_IDX, data);
299 kb->alu_reg_idx = FIELD_GET(ICE_IM_PGKB_AR_IDX, data);
300}
301
302#define ICE_IM_ALU_OPC GENMASK_ULL(5, 0)
303#define ICE_IM_ALU_SS GENMASK_ULL(13, 6)
304#define ICE_IM_ALU_SL GENMASK_ULL(18, 14)
305#define ICE_IM_ALU_SXS BIT_ULL(19)
306#define ICE_IM_ALU_SXK GENMASK_ULL(23, 20)
307#define ICE_IM_ALU_SRID GENMASK_ULL(30, 24)
308#define ICE_IM_ALU_DRID GENMASK_ULL(37, 31)
309#define ICE_IM_ALU_INC0 BIT_ULL(38)
310#define ICE_IM_ALU_INC1 BIT_ULL(39)
311#define ICE_IM_ALU_POO GENMASK_ULL(41, 40)
312#define ICE_IM_ALU_PO GENMASK_ULL(49, 42)
313#define ICE_IM_ALU_BA_S 50 /* offset for the 2nd 64-bits field */
314#define ICE_IM_ALU_BA GENMASK_ULL(57 - ICE_IM_ALU_BA_S, \
315 50 - ICE_IM_ALU_BA_S)
316#define ICE_IM_ALU_IMM GENMASK_ULL(73 - ICE_IM_ALU_BA_S, \
317 58 - ICE_IM_ALU_BA_S)
318#define ICE_IM_ALU_DFE BIT_ULL(74 - ICE_IM_ALU_BA_S)
319#define ICE_IM_ALU_DS GENMASK_ULL(80 - ICE_IM_ALU_BA_S, \
320 75 - ICE_IM_ALU_BA_S)
321#define ICE_IM_ALU_DL GENMASK_ULL(86 - ICE_IM_ALU_BA_S, \
322 81 - ICE_IM_ALU_BA_S)
323#define ICE_IM_ALU_FEI BIT_ULL(87 - ICE_IM_ALU_BA_S)
324#define ICE_IM_ALU_FSI GENMASK_ULL(95 - ICE_IM_ALU_BA_S, \
325 88 - ICE_IM_ALU_BA_S)
326
327/**
328 * ice_imem_alu_init - parse 96 bits of ALU entry
329 * @alu: pointer to the ALU entry structure
330 * @data: ALU entry data to be parsed
331 * @off: offset of the ALU entry data
332 */
333static void ice_imem_alu_init(struct ice_alu *alu, u8 *data, u8 off)
334{
335 u64 d64;
336 u8 idd;
337
338 d64 = *((u64 *)data) >> off;
339
340 alu->opc = FIELD_GET(ICE_IM_ALU_OPC, d64);
341 alu->src_start = FIELD_GET(ICE_IM_ALU_SS, d64);
342 alu->src_len = FIELD_GET(ICE_IM_ALU_SL, d64);
343 alu->shift_xlate_sel = FIELD_GET(ICE_IM_ALU_SXS, d64);
344 alu->shift_xlate_key = FIELD_GET(ICE_IM_ALU_SXK, d64);
345 alu->src_reg_id = FIELD_GET(ICE_IM_ALU_SRID, d64);
346 alu->dst_reg_id = FIELD_GET(ICE_IM_ALU_DRID, d64);
347 alu->inc0 = FIELD_GET(ICE_IM_ALU_INC0, d64);
348 alu->inc1 = FIELD_GET(ICE_IM_ALU_INC1, d64);
349 alu->proto_offset_opc = FIELD_GET(ICE_IM_ALU_POO, d64);
350 alu->proto_offset = FIELD_GET(ICE_IM_ALU_PO, d64);
351
352 idd = (ICE_IM_ALU_BA_S + off) / BITS_PER_BYTE;
353 off = (ICE_IM_ALU_BA_S + off) % BITS_PER_BYTE;
354 d64 = *((u64 *)(&data[idd])) >> off;
355
356 alu->branch_addr = FIELD_GET(ICE_IM_ALU_BA, d64);
357 alu->imm = FIELD_GET(ICE_IM_ALU_IMM, d64);
358 alu->dedicate_flags_ena = FIELD_GET(ICE_IM_ALU_DFE, d64);
359 alu->dst_start = FIELD_GET(ICE_IM_ALU_DS, d64);
360 alu->dst_len = FIELD_GET(ICE_IM_ALU_DL, d64);
361 alu->flags_extr_imm = FIELD_GET(ICE_IM_ALU_FEI, d64);
362 alu->flags_start_imm = FIELD_GET(ICE_IM_ALU_FSI, d64);
363}
364
365#define ICE_IMEM_BM_S 0
366#define ICE_IMEM_BKB_S 4
367#define ICE_IMEM_BKB_IDD (ICE_IMEM_BKB_S / BITS_PER_BYTE)
368#define ICE_IMEM_BKB_OFF (ICE_IMEM_BKB_S % BITS_PER_BYTE)
369#define ICE_IMEM_PGP GENMASK(15, 14)
370#define ICE_IMEM_NPKB_S 16
371#define ICE_IMEM_NPKB_IDD (ICE_IMEM_NPKB_S / BITS_PER_BYTE)
372#define ICE_IMEM_NPKB_OFF (ICE_IMEM_NPKB_S % BITS_PER_BYTE)
373#define ICE_IMEM_PGKB_S 34
374#define ICE_IMEM_PGKB_IDD (ICE_IMEM_PGKB_S / BITS_PER_BYTE)
375#define ICE_IMEM_PGKB_OFF (ICE_IMEM_PGKB_S % BITS_PER_BYTE)
376#define ICE_IMEM_ALU0_S 69
377#define ICE_IMEM_ALU0_IDD (ICE_IMEM_ALU0_S / BITS_PER_BYTE)
378#define ICE_IMEM_ALU0_OFF (ICE_IMEM_ALU0_S % BITS_PER_BYTE)
379#define ICE_IMEM_ALU1_S 165
380#define ICE_IMEM_ALU1_IDD (ICE_IMEM_ALU1_S / BITS_PER_BYTE)
381#define ICE_IMEM_ALU1_OFF (ICE_IMEM_ALU1_S % BITS_PER_BYTE)
382#define ICE_IMEM_ALU2_S 357
383#define ICE_IMEM_ALU2_IDD (ICE_IMEM_ALU2_S / BITS_PER_BYTE)
384#define ICE_IMEM_ALU2_OFF (ICE_IMEM_ALU2_S % BITS_PER_BYTE)
385
386/**
387 * ice_imem_parse_item - parse 384 bits of IMEM entry
388 * @hw: pointer to the hardware structure
389 * @idx: index of IMEM entry
390 * @item: item of IMEM entry
391 * @data: IMEM entry data to be parsed
392 * @size: size of IMEM entry
393 */
394static void ice_imem_parse_item(struct ice_hw *hw, u16 idx, void *item,
395 void *data, int __maybe_unused size)
396{
397 struct ice_imem_item *ii = item;
398 u8 *buf = data;
399
400 ii->idx = idx;
401
402 ice_imem_bm_init(&ii->b_m, *(u8 *)buf);
403 ice_imem_bkb_init(&ii->b_kb,
404 *((u16 *)(&buf[ICE_IMEM_BKB_IDD])) >>
405 ICE_IMEM_BKB_OFF);
406
407 ii->pg_prio = FIELD_GET(ICE_IMEM_PGP, *(u16 *)buf);
408
409 ice_imem_npkb_init(&ii->np_kb,
410 *((u32 *)(&buf[ICE_IMEM_NPKB_IDD])) >>
411 ICE_IMEM_NPKB_OFF);
412 ice_imem_pgkb_init(&ii->pg_kb,
413 *((u64 *)(&buf[ICE_IMEM_PGKB_IDD])) >>
414 ICE_IMEM_PGKB_OFF);
415
416 ice_imem_alu_init(&ii->alu0,
417 &buf[ICE_IMEM_ALU0_IDD],
418 ICE_IMEM_ALU0_OFF);
419 ice_imem_alu_init(&ii->alu1,
420 &buf[ICE_IMEM_ALU1_IDD],
421 ICE_IMEM_ALU1_OFF);
422 ice_imem_alu_init(&ii->alu2,
423 &buf[ICE_IMEM_ALU2_IDD],
424 ICE_IMEM_ALU2_OFF);
425
426 if (hw->debug_mask & ICE_DBG_PARSER)
427 ice_imem_dump(hw, ii);
428}
429
430/**
431 * ice_imem_table_get - create an imem table
432 * @hw: pointer to the hardware structure
433 *
434 * Return: a pointer to the allocated IMEM table.
435 */
436static struct ice_imem_item *ice_imem_table_get(struct ice_hw *hw)
437{
438 return ice_parser_create_table(hw, ICE_SID_RXPARSER_IMEM,
439 sizeof(struct ice_imem_item),
440 ICE_IMEM_TABLE_SIZE,
441 ice_imem_parse_item, false);
442}
443
444/*** ICE_SID_RXPARSER_METADATA_INIT section ***/
445/**
446 * ice_metainit_dump - dump an metainit item info
447 * @hw: pointer to the hardware structure
448 * @item: metainit item to dump
449 */
450static void ice_metainit_dump(struct ice_hw *hw, struct ice_metainit_item *item)
451{
452 struct device *dev = ice_hw_to_dev(hw);
453
454 dev_info(dev, "index = %d\n", item->idx);
455
456 dev_info(dev, "tsr = %d\n", item->tsr);
457 dev_info(dev, "ho = %d\n", item->ho);
458 dev_info(dev, "pc = %d\n", item->pc);
459 dev_info(dev, "pg_rn = %d\n", item->pg_rn);
460 dev_info(dev, "cd = %d\n", item->cd);
461
462 dev_info(dev, "gpr_a_ctrl = %d\n", item->gpr_a_ctrl);
463 dev_info(dev, "gpr_a_data_mdid = %d\n", item->gpr_a_data_mdid);
464 dev_info(dev, "gpr_a_data_start = %d\n", item->gpr_a_data_start);
465 dev_info(dev, "gpr_a_data_len = %d\n", item->gpr_a_data_len);
466 dev_info(dev, "gpr_a_id = %d\n", item->gpr_a_id);
467
468 dev_info(dev, "gpr_b_ctrl = %d\n", item->gpr_b_ctrl);
469 dev_info(dev, "gpr_b_data_mdid = %d\n", item->gpr_b_data_mdid);
470 dev_info(dev, "gpr_b_data_start = %d\n", item->gpr_b_data_start);
471 dev_info(dev, "gpr_b_data_len = %d\n", item->gpr_b_data_len);
472 dev_info(dev, "gpr_b_id = %d\n", item->gpr_b_id);
473
474 dev_info(dev, "gpr_c_ctrl = %d\n", item->gpr_c_ctrl);
475 dev_info(dev, "gpr_c_data_mdid = %d\n", item->gpr_c_data_mdid);
476 dev_info(dev, "gpr_c_data_start = %d\n", item->gpr_c_data_start);
477 dev_info(dev, "gpr_c_data_len = %d\n", item->gpr_c_data_len);
478 dev_info(dev, "gpr_c_id = %d\n", item->gpr_c_id);
479
480 dev_info(dev, "gpr_d_ctrl = %d\n", item->gpr_d_ctrl);
481 dev_info(dev, "gpr_d_data_mdid = %d\n", item->gpr_d_data_mdid);
482 dev_info(dev, "gpr_d_data_start = %d\n", item->gpr_d_data_start);
483 dev_info(dev, "gpr_d_data_len = %d\n", item->gpr_d_data_len);
484 dev_info(dev, "gpr_d_id = %d\n", item->gpr_d_id);
485
486 dev_info(dev, "flags = 0x%llx\n", (unsigned long long)(item->flags));
487}
488
489#define ICE_MI_TSR GENMASK_ULL(7, 0)
490#define ICE_MI_HO GENMASK_ULL(16, 8)
491#define ICE_MI_PC GENMASK_ULL(24, 17)
492#define ICE_MI_PGRN GENMASK_ULL(35, 25)
493#define ICE_MI_CD GENMASK_ULL(38, 36)
494#define ICE_MI_GAC BIT_ULL(39)
495#define ICE_MI_GADM GENMASK_ULL(44, 40)
496#define ICE_MI_GADS GENMASK_ULL(48, 45)
497#define ICE_MI_GADL GENMASK_ULL(53, 49)
498#define ICE_MI_GAI GENMASK_ULL(59, 56)
499#define ICE_MI_GBC BIT_ULL(60)
500#define ICE_MI_GBDM_S 61 /* offset for the 2nd 64-bits field */
501#define ICE_MI_GBDM_IDD (ICE_MI_GBDM_S / BITS_PER_BYTE)
502#define ICE_MI_GBDM_OFF (ICE_MI_GBDM_S % BITS_PER_BYTE)
503
504#define ICE_MI_GBDM_GENMASK_ULL(high, low) \
505 GENMASK_ULL((high) - ICE_MI_GBDM_S, (low) - ICE_MI_GBDM_S)
506#define ICE_MI_GBDM ICE_MI_GBDM_GENMASK_ULL(65, 61)
507#define ICE_MI_GBDS ICE_MI_GBDM_GENMASK_ULL(69, 66)
508#define ICE_MI_GBDL ICE_MI_GBDM_GENMASK_ULL(74, 70)
509#define ICE_MI_GBI ICE_MI_GBDM_GENMASK_ULL(80, 77)
510#define ICE_MI_GCC BIT_ULL(81 - ICE_MI_GBDM_S)
511#define ICE_MI_GCDM ICE_MI_GBDM_GENMASK_ULL(86, 82)
512#define ICE_MI_GCDS ICE_MI_GBDM_GENMASK_ULL(90, 87)
513#define ICE_MI_GCDL ICE_MI_GBDM_GENMASK_ULL(95, 91)
514#define ICE_MI_GCI ICE_MI_GBDM_GENMASK_ULL(101, 98)
515#define ICE_MI_GDC BIT_ULL(102 - ICE_MI_GBDM_S)
516#define ICE_MI_GDDM ICE_MI_GBDM_GENMASK_ULL(107, 103)
517#define ICE_MI_GDDS ICE_MI_GBDM_GENMASK_ULL(111, 108)
518#define ICE_MI_GDDL ICE_MI_GBDM_GENMASK_ULL(116, 112)
519#define ICE_MI_GDI ICE_MI_GBDM_GENMASK_ULL(122, 119)
520#define ICE_MI_FLAG_S 123 /* offset for the 3rd 64-bits field */
521#define ICE_MI_FLAG_IDD (ICE_MI_FLAG_S / BITS_PER_BYTE)
522#define ICE_MI_FLAG_OFF (ICE_MI_FLAG_S % BITS_PER_BYTE)
523#define ICE_MI_FLAG GENMASK_ULL(186 - ICE_MI_FLAG_S, \
524 123 - ICE_MI_FLAG_S)
525
526/**
527 * ice_metainit_parse_item - parse 192 bits of Metadata Init entry
528 * @hw: pointer to the hardware structure
529 * @idx: index of Metadata Init entry
530 * @item: item of Metadata Init entry
531 * @data: Metadata Init entry data to be parsed
532 * @size: size of Metadata Init entry
533 */
534static void ice_metainit_parse_item(struct ice_hw *hw, u16 idx, void *item,
535 void *data, int __maybe_unused size)
536{
537 struct ice_metainit_item *mi = item;
538 u8 *buf = data;
539 u64 d64;
540
541 mi->idx = idx;
542
543 d64 = *(u64 *)buf;
544
545 mi->tsr = FIELD_GET(ICE_MI_TSR, d64);
546 mi->ho = FIELD_GET(ICE_MI_HO, d64);
547 mi->pc = FIELD_GET(ICE_MI_PC, d64);
548 mi->pg_rn = FIELD_GET(ICE_MI_PGRN, d64);
549 mi->cd = FIELD_GET(ICE_MI_CD, d64);
550
551 mi->gpr_a_ctrl = FIELD_GET(ICE_MI_GAC, d64);
552 mi->gpr_a_data_mdid = FIELD_GET(ICE_MI_GADM, d64);
553 mi->gpr_a_data_start = FIELD_GET(ICE_MI_GADS, d64);
554 mi->gpr_a_data_len = FIELD_GET(ICE_MI_GADL, d64);
555 mi->gpr_a_id = FIELD_GET(ICE_MI_GAI, d64);
556
557 mi->gpr_b_ctrl = FIELD_GET(ICE_MI_GBC, d64);
558
559 d64 = *((u64 *)&buf[ICE_MI_GBDM_IDD]) >> ICE_MI_GBDM_OFF;
560
561 mi->gpr_b_data_mdid = FIELD_GET(ICE_MI_GBDM, d64);
562 mi->gpr_b_data_start = FIELD_GET(ICE_MI_GBDS, d64);
563 mi->gpr_b_data_len = FIELD_GET(ICE_MI_GBDL, d64);
564 mi->gpr_b_id = FIELD_GET(ICE_MI_GBI, d64);
565
566 mi->gpr_c_ctrl = FIELD_GET(ICE_MI_GCC, d64);
567 mi->gpr_c_data_mdid = FIELD_GET(ICE_MI_GCDM, d64);
568 mi->gpr_c_data_start = FIELD_GET(ICE_MI_GCDS, d64);
569 mi->gpr_c_data_len = FIELD_GET(ICE_MI_GCDL, d64);
570 mi->gpr_c_id = FIELD_GET(ICE_MI_GCI, d64);
571
572 mi->gpr_d_ctrl = FIELD_GET(ICE_MI_GDC, d64);
573 mi->gpr_d_data_mdid = FIELD_GET(ICE_MI_GDDM, d64);
574 mi->gpr_d_data_start = FIELD_GET(ICE_MI_GDDS, d64);
575 mi->gpr_d_data_len = FIELD_GET(ICE_MI_GDDL, d64);
576 mi->gpr_d_id = FIELD_GET(ICE_MI_GDI, d64);
577
578 d64 = *((u64 *)&buf[ICE_MI_FLAG_IDD]) >> ICE_MI_FLAG_OFF;
579
580 mi->flags = FIELD_GET(ICE_MI_FLAG, d64);
581
582 if (hw->debug_mask & ICE_DBG_PARSER)
583 ice_metainit_dump(hw, mi);
584}
585
586/**
587 * ice_metainit_table_get - create a metainit table
588 * @hw: pointer to the hardware structure
589 *
590 * Return: a pointer to the allocated Metadata initialization table.
591 */
592static struct ice_metainit_item *ice_metainit_table_get(struct ice_hw *hw)
593{
594 return ice_parser_create_table(hw, ICE_SID_RXPARSER_METADATA_INIT,
595 sizeof(struct ice_metainit_item),
596 ICE_METAINIT_TABLE_SIZE,
597 ice_metainit_parse_item, false);
598}
599
600/**
601 * ice_bst_tcam_search - find a TCAM item with specific type
602 * @tcam_table: the TCAM table
603 * @lbl_table: the lbl table to search
604 * @type: the type we need to match against
605 * @start: start searching from this index
606 *
607 * Return: a pointer to the matching BOOST TCAM item or NULL.
608 */
609struct ice_bst_tcam_item *
610ice_bst_tcam_search(struct ice_bst_tcam_item *tcam_table,
611 struct ice_lbl_item *lbl_table,
612 enum ice_lbl_type type, u16 *start)
613{
614 u16 i = *start;
615
616 for (; i < ICE_BST_TCAM_TABLE_SIZE; i++) {
617 if (lbl_table[i].type == type) {
618 *start = i;
619 return &tcam_table[lbl_table[i].idx];
620 }
621 }
622
623 return NULL;
624}
625
626/*** ICE_SID_RXPARSER_CAM, ICE_SID_RXPARSER_PG_SPILL,
627 * ICE_SID_RXPARSER_NOMATCH_CAM and ICE_SID_RXPARSER_NOMATCH_CAM
628 * sections ***/
629static void ice_pg_cam_key_dump(struct ice_hw *hw, struct ice_pg_cam_key *key)
630{
631 struct device *dev = ice_hw_to_dev(hw);
632
633 dev_info(dev, "key:\n");
634 dev_info(dev, "\tvalid = %d\n", key->valid);
635 dev_info(dev, "\tnode_id = %d\n", key->node_id);
636 dev_info(dev, "\tflag0 = %d\n", key->flag0);
637 dev_info(dev, "\tflag1 = %d\n", key->flag1);
638 dev_info(dev, "\tflag2 = %d\n", key->flag2);
639 dev_info(dev, "\tflag3 = %d\n", key->flag3);
640 dev_info(dev, "\tboost_idx = %d\n", key->boost_idx);
641 dev_info(dev, "\talu_reg = 0x%04x\n", key->alu_reg);
642 dev_info(dev, "\tnext_proto = 0x%08x\n", key->next_proto);
643}
644
645static void ice_pg_nm_cam_key_dump(struct ice_hw *hw,
646 struct ice_pg_nm_cam_key *key)
647{
648 struct device *dev = ice_hw_to_dev(hw);
649
650 dev_info(dev, "key:\n");
651 dev_info(dev, "\tvalid = %d\n", key->valid);
652 dev_info(dev, "\tnode_id = %d\n", key->node_id);
653 dev_info(dev, "\tflag0 = %d\n", key->flag0);
654 dev_info(dev, "\tflag1 = %d\n", key->flag1);
655 dev_info(dev, "\tflag2 = %d\n", key->flag2);
656 dev_info(dev, "\tflag3 = %d\n", key->flag3);
657 dev_info(dev, "\tboost_idx = %d\n", key->boost_idx);
658 dev_info(dev, "\talu_reg = 0x%04x\n", key->alu_reg);
659}
660
661static void ice_pg_cam_action_dump(struct ice_hw *hw,
662 struct ice_pg_cam_action *action)
663{
664 struct device *dev = ice_hw_to_dev(hw);
665
666 dev_info(dev, "action:\n");
667 dev_info(dev, "\tnext_node = %d\n", action->next_node);
668 dev_info(dev, "\tnext_pc = %d\n", action->next_pc);
669 dev_info(dev, "\tis_pg = %d\n", action->is_pg);
670 dev_info(dev, "\tproto_id = %d\n", action->proto_id);
671 dev_info(dev, "\tis_mg = %d\n", action->is_mg);
672 dev_info(dev, "\tmarker_id = %d\n", action->marker_id);
673 dev_info(dev, "\tis_last_round = %d\n", action->is_last_round);
674 dev_info(dev, "\tho_polarity = %d\n", action->ho_polarity);
675 dev_info(dev, "\tho_inc = %d\n", action->ho_inc);
676}
677
678/**
679 * ice_pg_cam_dump - dump an parse graph cam info
680 * @hw: pointer to the hardware structure
681 * @item: parse graph cam to dump
682 */
683static void ice_pg_cam_dump(struct ice_hw *hw, struct ice_pg_cam_item *item)
684{
685 dev_info(ice_hw_to_dev(hw), "index = %d\n", item->idx);
686 ice_pg_cam_key_dump(hw, &item->key);
687 ice_pg_cam_action_dump(hw, &item->action);
688}
689
690/**
691 * ice_pg_nm_cam_dump - dump an parse graph no match cam info
692 * @hw: pointer to the hardware structure
693 * @item: parse graph no match cam to dump
694 */
695static void ice_pg_nm_cam_dump(struct ice_hw *hw,
696 struct ice_pg_nm_cam_item *item)
697{
698 dev_info(ice_hw_to_dev(hw), "index = %d\n", item->idx);
699 ice_pg_nm_cam_key_dump(hw, &item->key);
700 ice_pg_cam_action_dump(hw, &item->action);
701}
702
703#define ICE_PGCA_NN GENMASK_ULL(10, 0)
704#define ICE_PGCA_NPC GENMASK_ULL(18, 11)
705#define ICE_PGCA_IPG BIT_ULL(19)
706#define ICE_PGCA_PID GENMASK_ULL(30, 23)
707#define ICE_PGCA_IMG BIT_ULL(31)
708#define ICE_PGCA_MID GENMASK_ULL(39, 32)
709#define ICE_PGCA_ILR BIT_ULL(40)
710#define ICE_PGCA_HOP BIT_ULL(41)
711#define ICE_PGCA_HOI GENMASK_ULL(50, 42)
712
713/**
714 * ice_pg_cam_action_init - parse 55 bits of Parse Graph CAM Action
715 * @action: pointer to the Parse Graph CAM Action structure
716 * @data: Parse Graph CAM Action data to be parsed
717 */
718static void ice_pg_cam_action_init(struct ice_pg_cam_action *action, u64 data)
719{
720 action->next_node = FIELD_GET(ICE_PGCA_NN, data);
721 action->next_pc = FIELD_GET(ICE_PGCA_NPC, data);
722 action->is_pg = FIELD_GET(ICE_PGCA_IPG, data);
723 action->proto_id = FIELD_GET(ICE_PGCA_PID, data);
724 action->is_mg = FIELD_GET(ICE_PGCA_IMG, data);
725 action->marker_id = FIELD_GET(ICE_PGCA_MID, data);
726 action->is_last_round = FIELD_GET(ICE_PGCA_ILR, data);
727 action->ho_polarity = FIELD_GET(ICE_PGCA_HOP, data);
728 action->ho_inc = FIELD_GET(ICE_PGCA_HOI, data);
729}
730
731#define ICE_PGNCK_VLD BIT_ULL(0)
732#define ICE_PGNCK_NID GENMASK_ULL(11, 1)
733#define ICE_PGNCK_F0 BIT_ULL(12)
734#define ICE_PGNCK_F1 BIT_ULL(13)
735#define ICE_PGNCK_F2 BIT_ULL(14)
736#define ICE_PGNCK_F3 BIT_ULL(15)
737#define ICE_PGNCK_BH BIT_ULL(16)
738#define ICE_PGNCK_BI GENMASK_ULL(24, 17)
739#define ICE_PGNCK_AR GENMASK_ULL(40, 25)
740
741/**
742 * ice_pg_nm_cam_key_init - parse 41 bits of Parse Graph NoMatch CAM Key
743 * @key: pointer to the Parse Graph NoMatch CAM Key structure
744 * @data: Parse Graph NoMatch CAM Key data to be parsed
745 */
746static void ice_pg_nm_cam_key_init(struct ice_pg_nm_cam_key *key, u64 data)
747{
748 key->valid = FIELD_GET(ICE_PGNCK_VLD, data);
749 key->node_id = FIELD_GET(ICE_PGNCK_NID, data);
750 key->flag0 = FIELD_GET(ICE_PGNCK_F0, data);
751 key->flag1 = FIELD_GET(ICE_PGNCK_F1, data);
752 key->flag2 = FIELD_GET(ICE_PGNCK_F2, data);
753 key->flag3 = FIELD_GET(ICE_PGNCK_F3, data);
754
755 if (FIELD_GET(ICE_PGNCK_BH, data))
756 key->boost_idx = FIELD_GET(ICE_PGNCK_BI, data);
757 else
758 key->boost_idx = 0;
759
760 key->alu_reg = FIELD_GET(ICE_PGNCK_AR, data);
761}
762
763#define ICE_PGCK_VLD BIT_ULL(0)
764#define ICE_PGCK_NID GENMASK_ULL(11, 1)
765#define ICE_PGCK_F0 BIT_ULL(12)
766#define ICE_PGCK_F1 BIT_ULL(13)
767#define ICE_PGCK_F2 BIT_ULL(14)
768#define ICE_PGCK_F3 BIT_ULL(15)
769#define ICE_PGCK_BH BIT_ULL(16)
770#define ICE_PGCK_BI GENMASK_ULL(24, 17)
771#define ICE_PGCK_AR GENMASK_ULL(40, 25)
772#define ICE_PGCK_NPK_S 41 /* offset for the 2nd 64-bits field */
773#define ICE_PGCK_NPK_IDD (ICE_PGCK_NPK_S / BITS_PER_BYTE)
774#define ICE_PGCK_NPK_OFF (ICE_PGCK_NPK_S % BITS_PER_BYTE)
775#define ICE_PGCK_NPK GENMASK_ULL(72 - ICE_PGCK_NPK_S, \
776 41 - ICE_PGCK_NPK_S)
777
778/**
779 * ice_pg_cam_key_init - parse 73 bits of Parse Graph CAM Key
780 * @key: pointer to the Parse Graph CAM Key structure
781 * @data: Parse Graph CAM Key data to be parsed
782 */
783static void ice_pg_cam_key_init(struct ice_pg_cam_key *key, u8 *data)
784{
785 u64 d64 = *(u64 *)data;
786
787 key->valid = FIELD_GET(ICE_PGCK_VLD, d64);
788 key->node_id = FIELD_GET(ICE_PGCK_NID, d64);
789 key->flag0 = FIELD_GET(ICE_PGCK_F0, d64);
790 key->flag1 = FIELD_GET(ICE_PGCK_F1, d64);
791 key->flag2 = FIELD_GET(ICE_PGCK_F2, d64);
792 key->flag3 = FIELD_GET(ICE_PGCK_F3, d64);
793
794 if (FIELD_GET(ICE_PGCK_BH, d64))
795 key->boost_idx = FIELD_GET(ICE_PGCK_BI, d64);
796 else
797 key->boost_idx = 0;
798
799 key->alu_reg = FIELD_GET(ICE_PGCK_AR, d64);
800
801 d64 = *((u64 *)&data[ICE_PGCK_NPK_IDD]) >> ICE_PGCK_NPK_OFF;
802
803 key->next_proto = FIELD_GET(ICE_PGCK_NPK, d64);
804}
805
806#define ICE_PG_CAM_ACT_S 73
807#define ICE_PG_CAM_ACT_IDD (ICE_PG_CAM_ACT_S / BITS_PER_BYTE)
808#define ICE_PG_CAM_ACT_OFF (ICE_PG_CAM_ACT_S % BITS_PER_BYTE)
809
810/**
811 * ice_pg_cam_parse_item - parse 128 bits of Parse Graph CAM Entry
812 * @hw: pointer to the hardware structure
813 * @idx: index of Parse Graph CAM Entry
814 * @item: item of Parse Graph CAM Entry
815 * @data: Parse Graph CAM Entry data to be parsed
816 * @size: size of Parse Graph CAM Entry
817 */
818static void ice_pg_cam_parse_item(struct ice_hw *hw, u16 idx, void *item,
819 void *data, int __maybe_unused size)
820{
821 struct ice_pg_cam_item *ci = item;
822 u8 *buf = data;
823 u64 d64;
824
825 ci->idx = idx;
826
827 ice_pg_cam_key_init(&ci->key, buf);
828
829 d64 = *((u64 *)&buf[ICE_PG_CAM_ACT_IDD]) >> ICE_PG_CAM_ACT_OFF;
830 ice_pg_cam_action_init(&ci->action, d64);
831
832 if (hw->debug_mask & ICE_DBG_PARSER)
833 ice_pg_cam_dump(hw, ci);
834}
835
836#define ICE_PG_SP_CAM_KEY_S 56
837#define ICE_PG_SP_CAM_KEY_IDD (ICE_PG_SP_CAM_KEY_S / BITS_PER_BYTE)
838
839/**
840 * ice_pg_sp_cam_parse_item - parse 136 bits of Parse Graph Spill CAM Entry
841 * @hw: pointer to the hardware structure
842 * @idx: index of Parse Graph Spill CAM Entry
843 * @item: item of Parse Graph Spill CAM Entry
844 * @data: Parse Graph Spill CAM Entry data to be parsed
845 * @size: size of Parse Graph Spill CAM Entry
846 */
847static void ice_pg_sp_cam_parse_item(struct ice_hw *hw, u16 idx, void *item,
848 void *data, int __maybe_unused size)
849{
850 struct ice_pg_cam_item *ci = item;
851 u8 *buf = data;
852 u64 d64;
853
854 ci->idx = idx;
855
856 d64 = *(u64 *)buf;
857 ice_pg_cam_action_init(&ci->action, d64);
858
859 ice_pg_cam_key_init(&ci->key, &buf[ICE_PG_SP_CAM_KEY_IDD]);
860
861 if (hw->debug_mask & ICE_DBG_PARSER)
862 ice_pg_cam_dump(hw, ci);
863}
864
865#define ICE_PG_NM_CAM_ACT_S 41
866#define ICE_PG_NM_CAM_ACT_IDD (ICE_PG_NM_CAM_ACT_S / BITS_PER_BYTE)
867#define ICE_PG_NM_CAM_ACT_OFF (ICE_PG_NM_CAM_ACT_S % BITS_PER_BYTE)
868
869/**
870 * ice_pg_nm_cam_parse_item - parse 96 bits of Parse Graph NoMatch CAM Entry
871 * @hw: pointer to the hardware structure
872 * @idx: index of Parse Graph NoMatch CAM Entry
873 * @item: item of Parse Graph NoMatch CAM Entry
874 * @data: Parse Graph NoMatch CAM Entry data to be parsed
875 * @size: size of Parse Graph NoMatch CAM Entry
876 */
877static void ice_pg_nm_cam_parse_item(struct ice_hw *hw, u16 idx, void *item,
878 void *data, int __maybe_unused size)
879{
880 struct ice_pg_nm_cam_item *ci = item;
881 u8 *buf = data;
882 u64 d64;
883
884 ci->idx = idx;
885
886 d64 = *(u64 *)buf;
887 ice_pg_nm_cam_key_init(&ci->key, d64);
888
889 d64 = *((u64 *)&buf[ICE_PG_NM_CAM_ACT_IDD]) >> ICE_PG_NM_CAM_ACT_OFF;
890 ice_pg_cam_action_init(&ci->action, d64);
891
892 if (hw->debug_mask & ICE_DBG_PARSER)
893 ice_pg_nm_cam_dump(hw, ci);
894}
895
896#define ICE_PG_NM_SP_CAM_ACT_S 56
897#define ICE_PG_NM_SP_CAM_ACT_IDD (ICE_PG_NM_SP_CAM_ACT_S / BITS_PER_BYTE)
898#define ICE_PG_NM_SP_CAM_ACT_OFF (ICE_PG_NM_SP_CAM_ACT_S % BITS_PER_BYTE)
899
900/**
901 * ice_pg_nm_sp_cam_parse_item - parse 104 bits of Parse Graph NoMatch Spill
902 * CAM Entry
903 * @hw: pointer to the hardware structure
904 * @idx: index of Parse Graph NoMatch Spill CAM Entry
905 * @item: item of Parse Graph NoMatch Spill CAM Entry
906 * @data: Parse Graph NoMatch Spill CAM Entry data to be parsed
907 * @size: size of Parse Graph NoMatch Spill CAM Entry
908 */
909static void ice_pg_nm_sp_cam_parse_item(struct ice_hw *hw, u16 idx,
910 void *item, void *data,
911 int __maybe_unused size)
912{
913 struct ice_pg_nm_cam_item *ci = item;
914 u8 *buf = data;
915 u64 d64;
916
917 ci->idx = idx;
918
919 d64 = *(u64 *)buf;
920 ice_pg_cam_action_init(&ci->action, d64);
921
922 d64 = *((u64 *)&buf[ICE_PG_NM_SP_CAM_ACT_IDD]) >>
923 ICE_PG_NM_SP_CAM_ACT_OFF;
924 ice_pg_nm_cam_key_init(&ci->key, d64);
925
926 if (hw->debug_mask & ICE_DBG_PARSER)
927 ice_pg_nm_cam_dump(hw, ci);
928}
929
930/**
931 * ice_pg_cam_table_get - create a parse graph cam table
932 * @hw: pointer to the hardware structure
933 *
934 * Return: a pointer to the allocated Parse Graph CAM table.
935 */
936static struct ice_pg_cam_item *ice_pg_cam_table_get(struct ice_hw *hw)
937{
938 return ice_parser_create_table(hw, ICE_SID_RXPARSER_CAM,
939 sizeof(struct ice_pg_cam_item),
940 ICE_PG_CAM_TABLE_SIZE,
941 ice_pg_cam_parse_item, false);
942}
943
944/**
945 * ice_pg_sp_cam_table_get - create a parse graph spill cam table
946 * @hw: pointer to the hardware structure
947 *
948 * Return: a pointer to the allocated Parse Graph Spill CAM table.
949 */
950static struct ice_pg_cam_item *ice_pg_sp_cam_table_get(struct ice_hw *hw)
951{
952 return ice_parser_create_table(hw, ICE_SID_RXPARSER_PG_SPILL,
953 sizeof(struct ice_pg_cam_item),
954 ICE_PG_SP_CAM_TABLE_SIZE,
955 ice_pg_sp_cam_parse_item, false);
956}
957
958/**
959 * ice_pg_nm_cam_table_get - create a parse graph no match cam table
960 * @hw: pointer to the hardware structure
961 *
962 * Return: a pointer to the allocated Parse Graph No Match CAM table.
963 */
964static struct ice_pg_nm_cam_item *ice_pg_nm_cam_table_get(struct ice_hw *hw)
965{
966 return ice_parser_create_table(hw, ICE_SID_RXPARSER_NOMATCH_CAM,
967 sizeof(struct ice_pg_nm_cam_item),
968 ICE_PG_NM_CAM_TABLE_SIZE,
969 ice_pg_nm_cam_parse_item, false);
970}
971
972/**
973 * ice_pg_nm_sp_cam_table_get - create a parse graph no match spill cam table
974 * @hw: pointer to the hardware structure
975 *
976 * Return: a pointer to the allocated Parse Graph No Match Spill CAM table.
977 */
978static struct ice_pg_nm_cam_item *ice_pg_nm_sp_cam_table_get(struct ice_hw *hw)
979{
980 return ice_parser_create_table(hw, ICE_SID_RXPARSER_NOMATCH_SPILL,
981 sizeof(struct ice_pg_nm_cam_item),
982 ICE_PG_NM_SP_CAM_TABLE_SIZE,
983 ice_pg_nm_sp_cam_parse_item, false);
984}
985
986static bool __ice_pg_cam_match(struct ice_pg_cam_item *item,
987 struct ice_pg_cam_key *key)
988{
989 return (item->key.valid &&
990 !memcmp(&item->key.val, &key->val, sizeof(key->val)));
991}
992
993static bool __ice_pg_nm_cam_match(struct ice_pg_nm_cam_item *item,
994 struct ice_pg_cam_key *key)
995{
996 return (item->key.valid &&
997 !memcmp(&item->key.val, &key->val, sizeof(item->key.val)));
998}
999
1000/**
1001 * ice_pg_cam_match - search parse graph cam table by key
1002 * @table: parse graph cam table to search
1003 * @size: cam table size
1004 * @key: search key
1005 *
1006 * Return: a pointer to the matching PG CAM item or NULL.
1007 */
1008struct ice_pg_cam_item *ice_pg_cam_match(struct ice_pg_cam_item *table,
1009 int size, struct ice_pg_cam_key *key)
1010{
1011 int i;
1012
1013 for (i = 0; i < size; i++) {
1014 struct ice_pg_cam_item *item = &table[i];
1015
1016 if (__ice_pg_cam_match(item, key))
1017 return item;
1018 }
1019
1020 return NULL;
1021}
1022
1023/**
1024 * ice_pg_nm_cam_match - search parse graph no match cam table by key
1025 * @table: parse graph no match cam table to search
1026 * @size: cam table size
1027 * @key: search key
1028 *
1029 * Return: a pointer to the matching PG No Match CAM item or NULL.
1030 */
1031struct ice_pg_nm_cam_item *
1032ice_pg_nm_cam_match(struct ice_pg_nm_cam_item *table, int size,
1033 struct ice_pg_cam_key *key)
1034{
1035 int i;
1036
1037 for (i = 0; i < size; i++) {
1038 struct ice_pg_nm_cam_item *item = &table[i];
1039
1040 if (__ice_pg_nm_cam_match(item, key))
1041 return item;
1042 }
1043
1044 return NULL;
1045}
1046
1047/*** Ternary match ***/
1048/* Perform a ternary match on a 1-byte pattern (@pat) given @key and @key_inv
1049 * Rules (per bit):
1050 * Key == 0 and Key_inv == 0 : Never match (Don't care)
1051 * Key == 0 and Key_inv == 1 : Match on bit == 1
1052 * Key == 1 and Key_inv == 0 : Match on bit == 0
1053 * Key == 1 and Key_inv == 1 : Always match (Don't care)
1054 *
1055 * Return: true if all bits match, false otherwise.
1056 */
1057static bool ice_ternary_match_byte(u8 key, u8 key_inv, u8 pat)
1058{
1059 u8 bit_key, bit_key_inv, bit_pat;
1060 int i;
1061
1062 for (i = 0; i < BITS_PER_BYTE; i++) {
1063 bit_key = key & BIT(i);
1064 bit_key_inv = key_inv & BIT(i);
1065 bit_pat = pat & BIT(i);
1066
1067 if (bit_key != 0 && bit_key_inv != 0)
1068 continue;
1069
1070 if ((bit_key == 0 && bit_key_inv == 0) || bit_key == bit_pat)
1071 return false;
1072 }
1073
1074 return true;
1075}
1076
1077static bool ice_ternary_match(const u8 *key, const u8 *key_inv,
1078 const u8 *pat, int len)
1079{
1080 int i;
1081
1082 for (i = 0; i < len; i++)
1083 if (!ice_ternary_match_byte(key[i], key_inv[i], pat[i]))
1084 return false;
1085
1086 return true;
1087}
1088
1089/*** ICE_SID_RXPARSER_BOOST_TCAM and ICE_SID_LBL_RXPARSER_TMEM sections ***/
1090static void ice_bst_np_kb_dump(struct ice_hw *hw, struct ice_np_keybuilder *kb)
1091{
1092 struct device *dev = ice_hw_to_dev(hw);
1093
1094 dev_info(dev, "next proto key builder:\n");
1095 dev_info(dev, "\topc = %d\n", kb->opc);
1096 dev_info(dev, "\tstart_reg0 = %d\n", kb->start_reg0);
1097 dev_info(dev, "\tlen_reg1 = %d\n", kb->len_reg1);
1098}
1099
1100static void ice_bst_pg_kb_dump(struct ice_hw *hw, struct ice_pg_keybuilder *kb)
1101{
1102 struct device *dev = ice_hw_to_dev(hw);
1103
1104 dev_info(dev, "parse graph key builder:\n");
1105 dev_info(dev, "\tflag0_ena = %d\n", kb->flag0_ena);
1106 dev_info(dev, "\tflag1_ena = %d\n", kb->flag1_ena);
1107 dev_info(dev, "\tflag2_ena = %d\n", kb->flag2_ena);
1108 dev_info(dev, "\tflag3_ena = %d\n", kb->flag3_ena);
1109 dev_info(dev, "\tflag0_idx = %d\n", kb->flag0_idx);
1110 dev_info(dev, "\tflag1_idx = %d\n", kb->flag1_idx);
1111 dev_info(dev, "\tflag2_idx = %d\n", kb->flag2_idx);
1112 dev_info(dev, "\tflag3_idx = %d\n", kb->flag3_idx);
1113 dev_info(dev, "\talu_reg_idx = %d\n", kb->alu_reg_idx);
1114}
1115
1116static void ice_bst_alu_dump(struct ice_hw *hw, struct ice_alu *alu, int idx)
1117{
1118 struct device *dev = ice_hw_to_dev(hw);
1119
1120 dev_info(dev, "alu%d:\n", idx);
1121 dev_info(dev, "\topc = %d\n", alu->opc);
1122 dev_info(dev, "\tsrc_start = %d\n", alu->src_start);
1123 dev_info(dev, "\tsrc_len = %d\n", alu->src_len);
1124 dev_info(dev, "\tshift_xlate_sel = %d\n", alu->shift_xlate_sel);
1125 dev_info(dev, "\tshift_xlate_key = %d\n", alu->shift_xlate_key);
1126 dev_info(dev, "\tsrc_reg_id = %d\n", alu->src_reg_id);
1127 dev_info(dev, "\tdst_reg_id = %d\n", alu->dst_reg_id);
1128 dev_info(dev, "\tinc0 = %d\n", alu->inc0);
1129 dev_info(dev, "\tinc1 = %d\n", alu->inc1);
1130 dev_info(dev, "\tproto_offset_opc = %d\n", alu->proto_offset_opc);
1131 dev_info(dev, "\tproto_offset = %d\n", alu->proto_offset);
1132 dev_info(dev, "\tbranch_addr = %d\n", alu->branch_addr);
1133 dev_info(dev, "\timm = %d\n", alu->imm);
1134 dev_info(dev, "\tdst_start = %d\n", alu->dst_start);
1135 dev_info(dev, "\tdst_len = %d\n", alu->dst_len);
1136 dev_info(dev, "\tflags_extr_imm = %d\n", alu->flags_extr_imm);
1137 dev_info(dev, "\tflags_start_imm= %d\n", alu->flags_start_imm);
1138}
1139
1140/**
1141 * ice_bst_tcam_dump - dump a boost tcam info
1142 * @hw: pointer to the hardware structure
1143 * @item: boost tcam to dump
1144 */
1145static void ice_bst_tcam_dump(struct ice_hw *hw, struct ice_bst_tcam_item *item)
1146{
1147 struct device *dev = ice_hw_to_dev(hw);
1148 int i;
1149
1150 dev_info(dev, "addr = %d\n", item->addr);
1151
1152 dev_info(dev, "key : ");
1153 for (i = 0; i < ICE_BST_TCAM_KEY_SIZE; i++)
1154 dev_info(dev, "%02x ", item->key[i]);
1155
1156 dev_info(dev, "\n");
1157
1158 dev_info(dev, "key_inv: ");
1159 for (i = 0; i < ICE_BST_TCAM_KEY_SIZE; i++)
1160 dev_info(dev, "%02x ", item->key_inv[i]);
1161
1162 dev_info(dev, "\n");
1163
1164 dev_info(dev, "hit_idx_grp = %d\n", item->hit_idx_grp);
1165 dev_info(dev, "pg_prio = %d\n", item->pg_prio);
1166
1167 ice_bst_np_kb_dump(hw, &item->np_kb);
1168 ice_bst_pg_kb_dump(hw, &item->pg_kb);
1169
1170 ice_bst_alu_dump(hw, &item->alu0, ICE_ALU0_IDX);
1171 ice_bst_alu_dump(hw, &item->alu1, ICE_ALU1_IDX);
1172 ice_bst_alu_dump(hw, &item->alu2, ICE_ALU2_IDX);
1173}
1174
1175static void ice_lbl_dump(struct ice_hw *hw, struct ice_lbl_item *item)
1176{
1177 struct device *dev = ice_hw_to_dev(hw);
1178
1179 dev_info(dev, "index = %u\n", item->idx);
1180 dev_info(dev, "type = %u\n", item->type);
1181 dev_info(dev, "label = %s\n", item->label);
1182}
1183
1184#define ICE_BST_ALU_OPC GENMASK_ULL(5, 0)
1185#define ICE_BST_ALU_SS GENMASK_ULL(13, 6)
1186#define ICE_BST_ALU_SL GENMASK_ULL(18, 14)
1187#define ICE_BST_ALU_SXS BIT_ULL(19)
1188#define ICE_BST_ALU_SXK GENMASK_ULL(23, 20)
1189#define ICE_BST_ALU_SRID GENMASK_ULL(30, 24)
1190#define ICE_BST_ALU_DRID GENMASK_ULL(37, 31)
1191#define ICE_BST_ALU_INC0 BIT_ULL(38)
1192#define ICE_BST_ALU_INC1 BIT_ULL(39)
1193#define ICE_BST_ALU_POO GENMASK_ULL(41, 40)
1194#define ICE_BST_ALU_PO GENMASK_ULL(49, 42)
1195#define ICE_BST_ALU_BA_S 50 /* offset for the 2nd 64-bits field */
1196#define ICE_BST_ALU_BA GENMASK_ULL(57 - ICE_BST_ALU_BA_S, \
1197 50 - ICE_BST_ALU_BA_S)
1198#define ICE_BST_ALU_IMM GENMASK_ULL(73 - ICE_BST_ALU_BA_S, \
1199 58 - ICE_BST_ALU_BA_S)
1200#define ICE_BST_ALU_DFE BIT_ULL(74 - ICE_BST_ALU_BA_S)
1201#define ICE_BST_ALU_DS GENMASK_ULL(80 - ICE_BST_ALU_BA_S, \
1202 75 - ICE_BST_ALU_BA_S)
1203#define ICE_BST_ALU_DL GENMASK_ULL(86 - ICE_BST_ALU_BA_S, \
1204 81 - ICE_BST_ALU_BA_S)
1205#define ICE_BST_ALU_FEI BIT_ULL(87 - ICE_BST_ALU_BA_S)
1206#define ICE_BST_ALU_FSI GENMASK_ULL(95 - ICE_BST_ALU_BA_S, \
1207 88 - ICE_BST_ALU_BA_S)
1208
1209/**
1210 * ice_bst_alu_init - parse 96 bits of ALU entry
1211 * @alu: pointer to the ALU entry structure
1212 * @data: ALU entry data to be parsed
1213 * @off: offset of the ALU entry data
1214 */
1215static void ice_bst_alu_init(struct ice_alu *alu, u8 *data, u8 off)
1216{
1217 u64 d64;
1218 u8 idd;
1219
1220 d64 = *((u64 *)data) >> off;
1221
1222 alu->opc = FIELD_GET(ICE_BST_ALU_OPC, d64);
1223 alu->src_start = FIELD_GET(ICE_BST_ALU_SS, d64);
1224 alu->src_len = FIELD_GET(ICE_BST_ALU_SL, d64);
1225 alu->shift_xlate_sel = FIELD_GET(ICE_BST_ALU_SXS, d64);
1226 alu->shift_xlate_key = FIELD_GET(ICE_BST_ALU_SXK, d64);
1227 alu->src_reg_id = FIELD_GET(ICE_BST_ALU_SRID, d64);
1228 alu->dst_reg_id = FIELD_GET(ICE_BST_ALU_DRID, d64);
1229 alu->inc0 = FIELD_GET(ICE_BST_ALU_INC0, d64);
1230 alu->inc1 = FIELD_GET(ICE_BST_ALU_INC1, d64);
1231 alu->proto_offset_opc = FIELD_GET(ICE_BST_ALU_POO, d64);
1232 alu->proto_offset = FIELD_GET(ICE_BST_ALU_PO, d64);
1233
1234 idd = (ICE_BST_ALU_BA_S + off) / BITS_PER_BYTE;
1235 off = (ICE_BST_ALU_BA_S + off) % BITS_PER_BYTE;
1236 d64 = *((u64 *)(&data[idd])) >> off;
1237
1238 alu->branch_addr = FIELD_GET(ICE_BST_ALU_BA, d64);
1239 alu->imm = FIELD_GET(ICE_BST_ALU_IMM, d64);
1240 alu->dedicate_flags_ena = FIELD_GET(ICE_BST_ALU_DFE, d64);
1241 alu->dst_start = FIELD_GET(ICE_BST_ALU_DS, d64);
1242 alu->dst_len = FIELD_GET(ICE_BST_ALU_DL, d64);
1243 alu->flags_extr_imm = FIELD_GET(ICE_BST_ALU_FEI, d64);
1244 alu->flags_start_imm = FIELD_GET(ICE_BST_ALU_FSI, d64);
1245}
1246
1247#define ICE_BST_PGKB_F0_ENA BIT_ULL(0)
1248#define ICE_BST_PGKB_F0_IDX GENMASK_ULL(6, 1)
1249#define ICE_BST_PGKB_F1_ENA BIT_ULL(7)
1250#define ICE_BST_PGKB_F1_IDX GENMASK_ULL(13, 8)
1251#define ICE_BST_PGKB_F2_ENA BIT_ULL(14)
1252#define ICE_BST_PGKB_F2_IDX GENMASK_ULL(20, 15)
1253#define ICE_BST_PGKB_F3_ENA BIT_ULL(21)
1254#define ICE_BST_PGKB_F3_IDX GENMASK_ULL(27, 22)
1255#define ICE_BST_PGKB_AR_IDX GENMASK_ULL(34, 28)
1256
1257/**
1258 * ice_bst_pgkb_init - parse 35 bits of Parse Graph Key Build
1259 * @kb: pointer to the Parse Graph Key Build structure
1260 * @data: Parse Graph Key Build data to be parsed
1261 */
1262static void ice_bst_pgkb_init(struct ice_pg_keybuilder *kb, u64 data)
1263{
1264 kb->flag0_ena = FIELD_GET(ICE_BST_PGKB_F0_ENA, data);
1265 kb->flag0_idx = FIELD_GET(ICE_BST_PGKB_F0_IDX, data);
1266 kb->flag1_ena = FIELD_GET(ICE_BST_PGKB_F1_ENA, data);
1267 kb->flag1_idx = FIELD_GET(ICE_BST_PGKB_F1_IDX, data);
1268 kb->flag2_ena = FIELD_GET(ICE_BST_PGKB_F2_ENA, data);
1269 kb->flag2_idx = FIELD_GET(ICE_BST_PGKB_F2_IDX, data);
1270 kb->flag3_ena = FIELD_GET(ICE_BST_PGKB_F3_ENA, data);
1271 kb->flag3_idx = FIELD_GET(ICE_BST_PGKB_F3_IDX, data);
1272 kb->alu_reg_idx = FIELD_GET(ICE_BST_PGKB_AR_IDX, data);
1273}
1274
1275#define ICE_BST_NPKB_OPC GENMASK(1, 0)
1276#define ICE_BST_NPKB_S_R0 GENMASK(9, 2)
1277#define ICE_BST_NPKB_L_R1 GENMASK(17, 10)
1278
1279/**
1280 * ice_bst_npkb_init - parse 18 bits of Next Protocol Key Build
1281 * @kb: pointer to the Next Protocol Key Build structure
1282 * @data: Next Protocol Key Build data to be parsed
1283 */
1284static void ice_bst_npkb_init(struct ice_np_keybuilder *kb, u32 data)
1285{
1286 kb->opc = FIELD_GET(ICE_BST_NPKB_OPC, data);
1287 kb->start_reg0 = FIELD_GET(ICE_BST_NPKB_S_R0, data);
1288 kb->len_reg1 = FIELD_GET(ICE_BST_NPKB_L_R1, data);
1289}
1290
1291#define ICE_BT_KEY_S 32
1292#define ICE_BT_KEY_IDD (ICE_BT_KEY_S / BITS_PER_BYTE)
1293#define ICE_BT_KIV_S 192
1294#define ICE_BT_KIV_IDD (ICE_BT_KIV_S / BITS_PER_BYTE)
1295#define ICE_BT_HIG_S 352
1296#define ICE_BT_HIG_IDD (ICE_BT_HIG_S / BITS_PER_BYTE)
1297#define ICE_BT_PGP_S 360
1298#define ICE_BT_PGP_IDD (ICE_BT_PGP_S / BITS_PER_BYTE)
1299#define ICE_BT_PGP_M GENMASK(361 - ICE_BT_PGP_S, 360 - ICE_BT_PGP_S)
1300#define ICE_BT_NPKB_S 362
1301#define ICE_BT_NPKB_IDD (ICE_BT_NPKB_S / BITS_PER_BYTE)
1302#define ICE_BT_NPKB_OFF (ICE_BT_NPKB_S % BITS_PER_BYTE)
1303#define ICE_BT_PGKB_S 380
1304#define ICE_BT_PGKB_IDD (ICE_BT_PGKB_S / BITS_PER_BYTE)
1305#define ICE_BT_PGKB_OFF (ICE_BT_PGKB_S % BITS_PER_BYTE)
1306#define ICE_BT_ALU0_S 415
1307#define ICE_BT_ALU0_IDD (ICE_BT_ALU0_S / BITS_PER_BYTE)
1308#define ICE_BT_ALU0_OFF (ICE_BT_ALU0_S % BITS_PER_BYTE)
1309#define ICE_BT_ALU1_S 511
1310#define ICE_BT_ALU1_IDD (ICE_BT_ALU1_S / BITS_PER_BYTE)
1311#define ICE_BT_ALU1_OFF (ICE_BT_ALU1_S % BITS_PER_BYTE)
1312#define ICE_BT_ALU2_S 607
1313#define ICE_BT_ALU2_IDD (ICE_BT_ALU2_S / BITS_PER_BYTE)
1314#define ICE_BT_ALU2_OFF (ICE_BT_ALU2_S % BITS_PER_BYTE)
1315
1316/**
1317 * ice_bst_parse_item - parse 704 bits of Boost TCAM entry
1318 * @hw: pointer to the hardware structure
1319 * @idx: index of Boost TCAM entry
1320 * @item: item of Boost TCAM entry
1321 * @data: Boost TCAM entry data to be parsed
1322 * @size: size of Boost TCAM entry
1323 */
1324static void ice_bst_parse_item(struct ice_hw *hw, u16 idx, void *item,
1325 void *data, int __maybe_unused size)
1326{
1327 struct ice_bst_tcam_item *ti = item;
1328 u8 *buf = (u8 *)data;
1329 int i;
1330
1331 ti->addr = *(u16 *)buf;
1332
1333 for (i = 0; i < ICE_BST_TCAM_KEY_SIZE; i++) {
1334 ti->key[i] = buf[ICE_BT_KEY_IDD + i];
1335 ti->key_inv[i] = buf[ICE_BT_KIV_IDD + i];
1336 }
1337 ti->hit_idx_grp = buf[ICE_BT_HIG_IDD];
1338 ti->pg_prio = buf[ICE_BT_PGP_IDD] & ICE_BT_PGP_M;
1339
1340 ice_bst_npkb_init(&ti->np_kb,
1341 *((u32 *)(&buf[ICE_BT_NPKB_IDD])) >>
1342 ICE_BT_NPKB_OFF);
1343 ice_bst_pgkb_init(&ti->pg_kb,
1344 *((u64 *)(&buf[ICE_BT_PGKB_IDD])) >>
1345 ICE_BT_PGKB_OFF);
1346
1347 ice_bst_alu_init(&ti->alu0, &buf[ICE_BT_ALU0_IDD], ICE_BT_ALU0_OFF);
1348 ice_bst_alu_init(&ti->alu1, &buf[ICE_BT_ALU1_IDD], ICE_BT_ALU1_OFF);
1349 ice_bst_alu_init(&ti->alu2, &buf[ICE_BT_ALU2_IDD], ICE_BT_ALU2_OFF);
1350
1351 if (hw->debug_mask & ICE_DBG_PARSER)
1352 ice_bst_tcam_dump(hw, ti);
1353}
1354
1355/**
1356 * ice_bst_tcam_table_get - create a boost tcam table
1357 * @hw: pointer to the hardware structure
1358 *
1359 * Return: a pointer to the allocated Boost TCAM table.
1360 */
1361static struct ice_bst_tcam_item *ice_bst_tcam_table_get(struct ice_hw *hw)
1362{
1363 return ice_parser_create_table(hw, ICE_SID_RXPARSER_BOOST_TCAM,
1364 sizeof(struct ice_bst_tcam_item),
1365 ICE_BST_TCAM_TABLE_SIZE,
1366 ice_bst_parse_item, true);
1367}
1368
1369static void ice_parse_lbl_item(struct ice_hw *hw, u16 idx, void *item,
1370 void *data, int __maybe_unused size)
1371{
1372 struct ice_lbl_item *lbl_item = item;
1373 struct ice_lbl_item *lbl_data = data;
1374
1375 lbl_item->idx = lbl_data->idx;
1376 memcpy(lbl_item->label, lbl_data->label, sizeof(lbl_item->label));
1377
1378 if (strstarts(lbl_item->label, ICE_LBL_BST_DVM))
1379 lbl_item->type = ICE_LBL_BST_TYPE_DVM;
1380 else if (strstarts(lbl_item->label, ICE_LBL_BST_SVM))
1381 lbl_item->type = ICE_LBL_BST_TYPE_SVM;
1382 else if (strstarts(lbl_item->label, ICE_LBL_TNL_VXLAN))
1383 lbl_item->type = ICE_LBL_BST_TYPE_VXLAN;
1384 else if (strstarts(lbl_item->label, ICE_LBL_TNL_GENEVE))
1385 lbl_item->type = ICE_LBL_BST_TYPE_GENEVE;
1386 else if (strstarts(lbl_item->label, ICE_LBL_TNL_UDP_ECPRI))
1387 lbl_item->type = ICE_LBL_BST_TYPE_UDP_ECPRI;
1388
1389 if (hw->debug_mask & ICE_DBG_PARSER)
1390 ice_lbl_dump(hw, lbl_item);
1391}
1392
1393/**
1394 * ice_bst_lbl_table_get - create a boost label table
1395 * @hw: pointer to the hardware structure
1396 *
1397 * Return: a pointer to the allocated Boost label table.
1398 */
1399static struct ice_lbl_item *ice_bst_lbl_table_get(struct ice_hw *hw)
1400{
1401 return ice_parser_create_table(hw, ICE_SID_LBL_RXPARSER_TMEM,
1402 sizeof(struct ice_lbl_item),
1403 ICE_BST_TCAM_TABLE_SIZE,
1404 ice_parse_lbl_item, true);
1405}
1406
1407/**
1408 * ice_bst_tcam_match - match a pattern on the boost tcam table
1409 * @tcam_table: boost tcam table to search
1410 * @pat: pattern to match
1411 *
1412 * Return: a pointer to the matching Boost TCAM item or NULL.
1413 */
1414struct ice_bst_tcam_item *
1415ice_bst_tcam_match(struct ice_bst_tcam_item *tcam_table, u8 *pat)
1416{
1417 int i;
1418
1419 for (i = 0; i < ICE_BST_TCAM_TABLE_SIZE; i++) {
1420 struct ice_bst_tcam_item *item = &tcam_table[i];
1421
1422 if (item->hit_idx_grp == 0)
1423 continue;
1424 if (ice_ternary_match(item->key, item->key_inv, pat,
1425 ICE_BST_TCAM_KEY_SIZE))
1426 return item;
1427 }
1428
1429 return NULL;
1430}
1431
1432/*** ICE_SID_RXPARSER_MARKER_PTYPE section ***/
1433/**
1434 * ice_ptype_mk_tcam_dump - dump an ptype marker tcam info
1435 * @hw: pointer to the hardware structure
1436 * @item: ptype marker tcam to dump
1437 */
1438static void ice_ptype_mk_tcam_dump(struct ice_hw *hw,
1439 struct ice_ptype_mk_tcam_item *item)
1440{
1441 struct device *dev = ice_hw_to_dev(hw);
1442 int i;
1443
1444 dev_info(dev, "address = %d\n", item->address);
1445 dev_info(dev, "ptype = %d\n", item->ptype);
1446
1447 dev_info(dev, "key :");
1448 for (i = 0; i < ICE_PTYPE_MK_TCAM_KEY_SIZE; i++)
1449 dev_info(dev, "%02x ", item->key[i]);
1450
1451 dev_info(dev, "\n");
1452
1453 dev_info(dev, "key_inv:");
1454 for (i = 0; i < ICE_PTYPE_MK_TCAM_KEY_SIZE; i++)
1455 dev_info(dev, "%02x ", item->key_inv[i]);
1456
1457 dev_info(dev, "\n");
1458}
1459
1460static void ice_parse_ptype_mk_tcam_item(struct ice_hw *hw, u16 idx,
1461 void *item, void *data, int size)
1462{
1463 memcpy(item, data, size);
1464
1465 if (hw->debug_mask & ICE_DBG_PARSER)
1466 ice_ptype_mk_tcam_dump(hw,
1467 (struct ice_ptype_mk_tcam_item *)item);
1468}
1469
1470/**
1471 * ice_ptype_mk_tcam_table_get - create a ptype marker tcam table
1472 * @hw: pointer to the hardware structure
1473 *
1474 * Return: a pointer to the allocated Marker PType TCAM table.
1475 */
1476static
1477struct ice_ptype_mk_tcam_item *ice_ptype_mk_tcam_table_get(struct ice_hw *hw)
1478{
1479 return ice_parser_create_table(hw, ICE_SID_RXPARSER_MARKER_PTYPE,
1480 sizeof(struct ice_ptype_mk_tcam_item),
1481 ICE_PTYPE_MK_TCAM_TABLE_SIZE,
1482 ice_parse_ptype_mk_tcam_item, true);
1483}
1484
1485/**
1486 * ice_ptype_mk_tcam_match - match a pattern on a ptype marker tcam table
1487 * @table: ptype marker tcam table to search
1488 * @pat: pattern to match
1489 * @len: length of the pattern
1490 *
1491 * Return: a pointer to the matching Marker PType item or NULL.
1492 */
1493struct ice_ptype_mk_tcam_item *
1494ice_ptype_mk_tcam_match(struct ice_ptype_mk_tcam_item *table,
1495 u8 *pat, int len)
1496{
1497 int i;
1498
1499 for (i = 0; i < ICE_PTYPE_MK_TCAM_TABLE_SIZE; i++) {
1500 struct ice_ptype_mk_tcam_item *item = &table[i];
1501
1502 if (ice_ternary_match(item->key, item->key_inv, pat, len))
1503 return item;
1504 }
1505
1506 return NULL;
1507}
1508
1509/*** ICE_SID_RXPARSER_MARKER_GRP section ***/
1510/**
1511 * ice_mk_grp_dump - dump an marker group item info
1512 * @hw: pointer to the hardware structure
1513 * @item: marker group item to dump
1514 */
1515static void ice_mk_grp_dump(struct ice_hw *hw, struct ice_mk_grp_item *item)
1516{
1517 struct device *dev = ice_hw_to_dev(hw);
1518 int i;
1519
1520 dev_info(dev, "index = %d\n", item->idx);
1521
1522 dev_info(dev, "markers: ");
1523 for (i = 0; i < ICE_MK_COUNT_PER_GRP; i++)
1524 dev_info(dev, "%d ", item->markers[i]);
1525
1526 dev_info(dev, "\n");
1527}
1528
1529static void ice_mk_grp_parse_item(struct ice_hw *hw, u16 idx, void *item,
1530 void *data, int __maybe_unused size)
1531{
1532 struct ice_mk_grp_item *grp = item;
1533 u8 *buf = data;
1534 int i;
1535
1536 grp->idx = idx;
1537
1538 for (i = 0; i < ICE_MK_COUNT_PER_GRP; i++)
1539 grp->markers[i] = buf[i];
1540
1541 if (hw->debug_mask & ICE_DBG_PARSER)
1542 ice_mk_grp_dump(hw, grp);
1543}
1544
1545/**
1546 * ice_mk_grp_table_get - create a marker group table
1547 * @hw: pointer to the hardware structure
1548 *
1549 * Return: a pointer to the allocated Marker Group ID table.
1550 */
1551static struct ice_mk_grp_item *ice_mk_grp_table_get(struct ice_hw *hw)
1552{
1553 return ice_parser_create_table(hw, ICE_SID_RXPARSER_MARKER_GRP,
1554 sizeof(struct ice_mk_grp_item),
1555 ICE_MK_GRP_TABLE_SIZE,
1556 ice_mk_grp_parse_item, false);
1557}
1558
1559/*** ICE_SID_RXPARSER_PROTO_GRP section ***/
1560static void ice_proto_off_dump(struct ice_hw *hw,
1561 struct ice_proto_off *po, int idx)
1562{
1563 struct device *dev = ice_hw_to_dev(hw);
1564
1565 dev_info(dev, "proto %d\n", idx);
1566 dev_info(dev, "\tpolarity = %d\n", po->polarity);
1567 dev_info(dev, "\tproto_id = %d\n", po->proto_id);
1568 dev_info(dev, "\toffset = %d\n", po->offset);
1569}
1570
1571/**
1572 * ice_proto_grp_dump - dump a proto group item info
1573 * @hw: pointer to the hardware structure
1574 * @item: proto group item to dump
1575 */
1576static void ice_proto_grp_dump(struct ice_hw *hw,
1577 struct ice_proto_grp_item *item)
1578{
1579 int i;
1580
1581 dev_info(ice_hw_to_dev(hw), "index = %d\n", item->idx);
1582
1583 for (i = 0; i < ICE_PROTO_COUNT_PER_GRP; i++)
1584 ice_proto_off_dump(hw, &item->po[i], i);
1585}
1586
1587#define ICE_PO_POL BIT(0)
1588#define ICE_PO_PID GENMASK(8, 1)
1589#define ICE_PO_OFF GENMASK(21, 12)
1590
1591/**
1592 * ice_proto_off_parse - parse 22 bits of Protocol entry
1593 * @po: pointer to the Protocol entry structure
1594 * @data: Protocol entry data to be parsed
1595 */
1596static void ice_proto_off_parse(struct ice_proto_off *po, u32 data)
1597{
1598 po->polarity = FIELD_GET(ICE_PO_POL, data);
1599 po->proto_id = FIELD_GET(ICE_PO_PID, data);
1600 po->offset = FIELD_GET(ICE_PO_OFF, data);
1601}
1602
1603/**
1604 * ice_proto_grp_parse_item - parse 192 bits of Protocol Group Table entry
1605 * @hw: pointer to the hardware structure
1606 * @idx: index of Protocol Group Table entry
1607 * @item: item of Protocol Group Table entry
1608 * @data: Protocol Group Table entry data to be parsed
1609 * @size: size of Protocol Group Table entry
1610 */
1611static void ice_proto_grp_parse_item(struct ice_hw *hw, u16 idx, void *item,
1612 void *data, int __maybe_unused size)
1613{
1614 struct ice_proto_grp_item *grp = item;
1615 u8 *buf = (u8 *)data;
1616 u8 idd, off;
1617 u32 d32;
1618 int i;
1619
1620 grp->idx = idx;
1621
1622 for (i = 0; i < ICE_PROTO_COUNT_PER_GRP; i++) {
1623 idd = (ICE_PROTO_GRP_ITEM_SIZE * i) / BITS_PER_BYTE;
1624 off = (ICE_PROTO_GRP_ITEM_SIZE * i) % BITS_PER_BYTE;
1625 d32 = *((u32 *)&buf[idd]) >> off;
1626 ice_proto_off_parse(&grp->po[i], d32);
1627 }
1628
1629 if (hw->debug_mask & ICE_DBG_PARSER)
1630 ice_proto_grp_dump(hw, grp);
1631}
1632
1633/**
1634 * ice_proto_grp_table_get - create a proto group table
1635 * @hw: pointer to the hardware structure
1636 *
1637 * Return: a pointer to the allocated Protocol Group table.
1638 */
1639static struct ice_proto_grp_item *ice_proto_grp_table_get(struct ice_hw *hw)
1640{
1641 return ice_parser_create_table(hw, ICE_SID_RXPARSER_PROTO_GRP,
1642 sizeof(struct ice_proto_grp_item),
1643 ICE_PROTO_GRP_TABLE_SIZE,
1644 ice_proto_grp_parse_item, false);
1645}
1646
1647/*** ICE_SID_RXPARSER_FLAG_REDIR section ***/
1648/**
1649 * ice_flg_rd_dump - dump a flag redirect item info
1650 * @hw: pointer to the hardware structure
1651 * @item: flag redirect item to dump
1652 */
1653static void ice_flg_rd_dump(struct ice_hw *hw, struct ice_flg_rd_item *item)
1654{
1655 struct device *dev = ice_hw_to_dev(hw);
1656
1657 dev_info(dev, "index = %d\n", item->idx);
1658 dev_info(dev, "expose = %d\n", item->expose);
1659 dev_info(dev, "intr_flg_id = %d\n", item->intr_flg_id);
1660}
1661
1662#define ICE_FRT_EXPO BIT(0)
1663#define ICE_FRT_IFID GENMASK(6, 1)
1664
1665/**
1666 * ice_flg_rd_parse_item - parse 8 bits of Flag Redirect Table entry
1667 * @hw: pointer to the hardware structure
1668 * @idx: index of Flag Redirect Table entry
1669 * @item: item of Flag Redirect Table entry
1670 * @data: Flag Redirect Table entry data to be parsed
1671 * @size: size of Flag Redirect Table entry
1672 */
1673static void ice_flg_rd_parse_item(struct ice_hw *hw, u16 idx, void *item,
1674 void *data, int __maybe_unused size)
1675{
1676 struct ice_flg_rd_item *rdi = item;
1677 u8 d8 = *(u8 *)data;
1678
1679 rdi->idx = idx;
1680 rdi->expose = FIELD_GET(ICE_FRT_EXPO, d8);
1681 rdi->intr_flg_id = FIELD_GET(ICE_FRT_IFID, d8);
1682
1683 if (hw->debug_mask & ICE_DBG_PARSER)
1684 ice_flg_rd_dump(hw, rdi);
1685}
1686
1687/**
1688 * ice_flg_rd_table_get - create a flag redirect table
1689 * @hw: pointer to the hardware structure
1690 *
1691 * Return: a pointer to the allocated Flags Redirection table.
1692 */
1693static struct ice_flg_rd_item *ice_flg_rd_table_get(struct ice_hw *hw)
1694{
1695 return ice_parser_create_table(hw, ICE_SID_RXPARSER_FLAG_REDIR,
1696 sizeof(struct ice_flg_rd_item),
1697 ICE_FLG_RD_TABLE_SIZE,
1698 ice_flg_rd_parse_item, false);
1699}
1700
1701/**
1702 * ice_flg_redirect - redirect a parser flag to packet flag
1703 * @table: flag redirect table
1704 * @psr_flg: parser flag to redirect
1705 *
1706 * Return: flag or 0 if @psr_flag = 0.
1707 */
1708u64 ice_flg_redirect(struct ice_flg_rd_item *table, u64 psr_flg)
1709{
1710 u64 flg = 0;
1711 int i;
1712
1713 for (i = 0; i < ICE_FLG_RDT_SIZE; i++) {
1714 struct ice_flg_rd_item *item = &table[i];
1715
1716 if (!item->expose)
1717 continue;
1718
1719 if (psr_flg & BIT(item->intr_flg_id))
1720 flg |= BIT(i);
1721 }
1722
1723 return flg;
1724}
1725
1726/*** ICE_SID_XLT_KEY_BUILDER_SW, ICE_SID_XLT_KEY_BUILDER_ACL,
1727 * ICE_SID_XLT_KEY_BUILDER_FD and ICE_SID_XLT_KEY_BUILDER_RSS
1728 * sections ***/
1729static void ice_xlt_kb_entry_dump(struct ice_hw *hw,
1730 struct ice_xlt_kb_entry *entry, int idx)
1731{
1732 struct device *dev = ice_hw_to_dev(hw);
1733 int i;
1734
1735 dev_info(dev, "key builder entry %d\n", idx);
1736 dev_info(dev, "\txlt1_ad_sel = %d\n", entry->xlt1_ad_sel);
1737 dev_info(dev, "\txlt2_ad_sel = %d\n", entry->xlt2_ad_sel);
1738
1739 for (i = 0; i < ICE_XLT_KB_FLAG0_14_CNT; i++)
1740 dev_info(dev, "\tflg%d_sel = %d\n", i, entry->flg0_14_sel[i]);
1741
1742 dev_info(dev, "\txlt1_md_sel = %d\n", entry->xlt1_md_sel);
1743 dev_info(dev, "\txlt2_md_sel = %d\n", entry->xlt2_md_sel);
1744}
1745
1746/**
1747 * ice_xlt_kb_dump - dump a xlt key build info
1748 * @hw: pointer to the hardware structure
1749 * @kb: key build to dump
1750 */
1751static void ice_xlt_kb_dump(struct ice_hw *hw, struct ice_xlt_kb *kb)
1752{
1753 struct device *dev = ice_hw_to_dev(hw);
1754 int i;
1755
1756 dev_info(dev, "xlt1_pm = %d\n", kb->xlt1_pm);
1757 dev_info(dev, "xlt2_pm = %d\n", kb->xlt2_pm);
1758 dev_info(dev, "prof_id_pm = %d\n", kb->prof_id_pm);
1759 dev_info(dev, "flag15 lo = 0x%08x\n", (u32)kb->flag15);
1760 dev_info(dev, "flag15 hi = 0x%08x\n",
1761 (u32)(kb->flag15 >> (sizeof(u32) * BITS_PER_BYTE)));
1762
1763 for (i = 0; i < ICE_XLT_KB_TBL_CNT; i++)
1764 ice_xlt_kb_entry_dump(hw, &kb->entries[i], i);
1765}
1766
1767#define ICE_XLT_KB_X1AS_S 32 /* offset for the 1st 64-bits field */
1768#define ICE_XLT_KB_X1AS_IDD (ICE_XLT_KB_X1AS_S / BITS_PER_BYTE)
1769#define ICE_XLT_KB_X1AS_OFF (ICE_XLT_KB_X1AS_S % BITS_PER_BYTE)
1770#define ICE_XLT_KB_X1AS GENMASK_ULL(34 - ICE_XLT_KB_X1AS_S, \
1771 32 - ICE_XLT_KB_X1AS_S)
1772#define ICE_XLT_KB_X2AS GENMASK_ULL(37 - ICE_XLT_KB_X1AS_S, \
1773 35 - ICE_XLT_KB_X1AS_S)
1774#define ICE_XLT_KB_FL00 GENMASK_ULL(46 - ICE_XLT_KB_X1AS_S, \
1775 38 - ICE_XLT_KB_X1AS_S)
1776#define ICE_XLT_KB_FL01 GENMASK_ULL(55 - ICE_XLT_KB_X1AS_S, \
1777 47 - ICE_XLT_KB_X1AS_S)
1778#define ICE_XLT_KB_FL02 GENMASK_ULL(64 - ICE_XLT_KB_X1AS_S, \
1779 56 - ICE_XLT_KB_X1AS_S)
1780#define ICE_XLT_KB_FL03 GENMASK_ULL(73 - ICE_XLT_KB_X1AS_S, \
1781 65 - ICE_XLT_KB_X1AS_S)
1782#define ICE_XLT_KB_FL04 GENMASK_ULL(82 - ICE_XLT_KB_X1AS_S, \
1783 74 - ICE_XLT_KB_X1AS_S)
1784#define ICE_XLT_KB_FL05 GENMASK_ULL(91 - ICE_XLT_KB_X1AS_S, \
1785 83 - ICE_XLT_KB_X1AS_S)
1786#define ICE_XLT_KB_FL06_S 92 /* offset for the 2nd 64-bits field */
1787#define ICE_XLT_KB_FL06_IDD (ICE_XLT_KB_FL06_S / BITS_PER_BYTE)
1788#define ICE_XLT_KB_FL06_OFF (ICE_XLT_KB_FL06_S % BITS_PER_BYTE)
1789#define ICE_XLT_KB_FL06 GENMASK_ULL(100 - ICE_XLT_KB_FL06_S, \
1790 92 - ICE_XLT_KB_FL06_S)
1791#define ICE_XLT_KB_FL07 GENMASK_ULL(109 - ICE_XLT_KB_FL06_S, \
1792 101 - ICE_XLT_KB_FL06_S)
1793#define ICE_XLT_KB_FL08 GENMASK_ULL(118 - ICE_XLT_KB_FL06_S, \
1794 110 - ICE_XLT_KB_FL06_S)
1795#define ICE_XLT_KB_FL09 GENMASK_ULL(127 - ICE_XLT_KB_FL06_S, \
1796 119 - ICE_XLT_KB_FL06_S)
1797#define ICE_XLT_KB_FL10 GENMASK_ULL(136 - ICE_XLT_KB_FL06_S, \
1798 128 - ICE_XLT_KB_FL06_S)
1799#define ICE_XLT_KB_FL11 GENMASK_ULL(145 - ICE_XLT_KB_FL06_S, \
1800 137 - ICE_XLT_KB_FL06_S)
1801#define ICE_XLT_KB_FL12_S 146 /* offset for the 3rd 64-bits field */
1802#define ICE_XLT_KB_FL12_IDD (ICE_XLT_KB_FL12_S / BITS_PER_BYTE)
1803#define ICE_XLT_KB_FL12_OFF (ICE_XLT_KB_FL12_S % BITS_PER_BYTE)
1804#define ICE_XLT_KB_FL12 GENMASK_ULL(154 - ICE_XLT_KB_FL12_S, \
1805 146 - ICE_XLT_KB_FL12_S)
1806#define ICE_XLT_KB_FL13 GENMASK_ULL(163 - ICE_XLT_KB_FL12_S, \
1807 155 - ICE_XLT_KB_FL12_S)
1808#define ICE_XLT_KB_FL14 GENMASK_ULL(181 - ICE_XLT_KB_FL12_S, \
1809 164 - ICE_XLT_KB_FL12_S)
1810#define ICE_XLT_KB_X1MS GENMASK_ULL(186 - ICE_XLT_KB_FL12_S, \
1811 182 - ICE_XLT_KB_FL12_S)
1812#define ICE_XLT_KB_X2MS GENMASK_ULL(191 - ICE_XLT_KB_FL12_S, \
1813 187 - ICE_XLT_KB_FL12_S)
1814
1815/**
1816 * ice_kb_entry_init - parse 192 bits of XLT Key Builder entry
1817 * @entry: pointer to the XLT Key Builder entry structure
1818 * @data: XLT Key Builder entry data to be parsed
1819 */
1820static void ice_kb_entry_init(struct ice_xlt_kb_entry *entry, u8 *data)
1821{
1822 u8 i = 0;
1823 u64 d64;
1824
1825 d64 = *((u64 *)&data[ICE_XLT_KB_X1AS_IDD]) >> ICE_XLT_KB_X1AS_OFF;
1826
1827 entry->xlt1_ad_sel = FIELD_GET(ICE_XLT_KB_X1AS, d64);
1828 entry->xlt2_ad_sel = FIELD_GET(ICE_XLT_KB_X2AS, d64);
1829
1830 entry->flg0_14_sel[i++] = FIELD_GET(ICE_XLT_KB_FL00, d64);
1831 entry->flg0_14_sel[i++] = FIELD_GET(ICE_XLT_KB_FL01, d64);
1832 entry->flg0_14_sel[i++] = FIELD_GET(ICE_XLT_KB_FL02, d64);
1833 entry->flg0_14_sel[i++] = FIELD_GET(ICE_XLT_KB_FL03, d64);
1834 entry->flg0_14_sel[i++] = FIELD_GET(ICE_XLT_KB_FL04, d64);
1835 entry->flg0_14_sel[i++] = FIELD_GET(ICE_XLT_KB_FL05, d64);
1836
1837 d64 = *((u64 *)&data[ICE_XLT_KB_FL06_IDD]) >> ICE_XLT_KB_FL06_OFF;
1838
1839 entry->flg0_14_sel[i++] = FIELD_GET(ICE_XLT_KB_FL06, d64);
1840 entry->flg0_14_sel[i++] = FIELD_GET(ICE_XLT_KB_FL07, d64);
1841 entry->flg0_14_sel[i++] = FIELD_GET(ICE_XLT_KB_FL08, d64);
1842 entry->flg0_14_sel[i++] = FIELD_GET(ICE_XLT_KB_FL09, d64);
1843 entry->flg0_14_sel[i++] = FIELD_GET(ICE_XLT_KB_FL10, d64);
1844 entry->flg0_14_sel[i++] = FIELD_GET(ICE_XLT_KB_FL11, d64);
1845
1846 d64 = *((u64 *)&data[ICE_XLT_KB_FL12_IDD]) >> ICE_XLT_KB_FL12_OFF;
1847
1848 entry->flg0_14_sel[i++] = FIELD_GET(ICE_XLT_KB_FL12, d64);
1849 entry->flg0_14_sel[i++] = FIELD_GET(ICE_XLT_KB_FL13, d64);
1850 entry->flg0_14_sel[i] = FIELD_GET(ICE_XLT_KB_FL14, d64);
1851
1852 entry->xlt1_md_sel = FIELD_GET(ICE_XLT_KB_X1MS, d64);
1853 entry->xlt2_md_sel = FIELD_GET(ICE_XLT_KB_X2MS, d64);
1854}
1855
1856#define ICE_XLT_KB_X1PM_OFF 0
1857#define ICE_XLT_KB_X2PM_OFF 1
1858#define ICE_XLT_KB_PIPM_OFF 2
1859#define ICE_XLT_KB_FL15_OFF 4
1860#define ICE_XLT_KB_TBL_OFF 12
1861
1862/**
1863 * ice_parse_kb_data - parse 204 bits of XLT Key Build Table
1864 * @hw: pointer to the hardware structure
1865 * @kb: pointer to the XLT Key Build Table structure
1866 * @data: XLT Key Build Table data to be parsed
1867 */
1868static void ice_parse_kb_data(struct ice_hw *hw, struct ice_xlt_kb *kb,
1869 void *data)
1870{
1871 u8 *buf = data;
1872 int i;
1873
1874 kb->xlt1_pm = buf[ICE_XLT_KB_X1PM_OFF];
1875 kb->xlt2_pm = buf[ICE_XLT_KB_X2PM_OFF];
1876 kb->prof_id_pm = buf[ICE_XLT_KB_PIPM_OFF];
1877
1878 kb->flag15 = *(u64 *)&buf[ICE_XLT_KB_FL15_OFF];
1879 for (i = 0; i < ICE_XLT_KB_TBL_CNT; i++)
1880 ice_kb_entry_init(&kb->entries[i],
1881 &buf[ICE_XLT_KB_TBL_OFF +
1882 i * ICE_XLT_KB_TBL_ENTRY_SIZE]);
1883
1884 if (hw->debug_mask & ICE_DBG_PARSER)
1885 ice_xlt_kb_dump(hw, kb);
1886}
1887
1888static struct ice_xlt_kb *ice_xlt_kb_get(struct ice_hw *hw, u32 sect_type)
1889{
1890 struct ice_pkg_enum state = {};
1891 struct ice_seg *seg = hw->seg;
1892 struct ice_xlt_kb *kb;
1893 void *data;
1894
1895 if (!seg)
1896 return ERR_PTR(-EINVAL);
1897
1898 kb = kzalloc(sizeof(*kb), GFP_KERNEL);
1899 if (!kb)
1900 return ERR_PTR(-ENOMEM);
1901
1902 data = ice_pkg_enum_section(seg, &state, sect_type);
1903 if (!data) {
1904 ice_debug(hw, ICE_DBG_PARSER, "failed to find section type %d.\n",
1905 sect_type);
1906 kfree(kb);
1907 return ERR_PTR(-EINVAL);
1908 }
1909
1910 ice_parse_kb_data(hw, kb, data);
1911
1912 return kb;
1913}
1914
1915/**
1916 * ice_xlt_kb_get_sw - create switch xlt key build
1917 * @hw: pointer to the hardware structure
1918 *
1919 * Return: a pointer to the allocated Key Builder table for Switch.
1920 */
1921static struct ice_xlt_kb *ice_xlt_kb_get_sw(struct ice_hw *hw)
1922{
1923 return ice_xlt_kb_get(hw, ICE_SID_XLT_KEY_BUILDER_SW);
1924}
1925
1926/**
1927 * ice_xlt_kb_get_acl - create acl xlt key build
1928 * @hw: pointer to the hardware structure
1929 *
1930 * Return: a pointer to the allocated Key Builder table for ACL.
1931 */
1932static struct ice_xlt_kb *ice_xlt_kb_get_acl(struct ice_hw *hw)
1933{
1934 return ice_xlt_kb_get(hw, ICE_SID_XLT_KEY_BUILDER_ACL);
1935}
1936
1937/**
1938 * ice_xlt_kb_get_fd - create fdir xlt key build
1939 * @hw: pointer to the hardware structure
1940 *
1941 * Return: a pointer to the allocated Key Builder table for Flow Director.
1942 */
1943static struct ice_xlt_kb *ice_xlt_kb_get_fd(struct ice_hw *hw)
1944{
1945 return ice_xlt_kb_get(hw, ICE_SID_XLT_KEY_BUILDER_FD);
1946}
1947
1948/**
1949 * ice_xlt_kb_get_rss - create rss xlt key build
1950 * @hw: pointer to the hardware structure
1951 *
1952 * Return: a pointer to the allocated Key Builder table for RSS.
1953 */
1954static struct ice_xlt_kb *ice_xlt_kb_get_rss(struct ice_hw *hw)
1955{
1956 return ice_xlt_kb_get(hw, ICE_SID_XLT_KEY_BUILDER_RSS);
1957}
1958
1959#define ICE_XLT_KB_MASK GENMASK_ULL(5, 0)
1960
1961/**
1962 * ice_xlt_kb_flag_get - aggregate 64 bits packet flag into 16 bits xlt flag
1963 * @kb: xlt key build
1964 * @pkt_flag: 64 bits packet flag
1965 *
1966 * Return: XLT flag or 0 if @pkt_flag = 0.
1967 */
1968u16 ice_xlt_kb_flag_get(struct ice_xlt_kb *kb, u64 pkt_flag)
1969{
1970 struct ice_xlt_kb_entry *entry = &kb->entries[0];
1971 u16 flag = 0;
1972 int i;
1973
1974 /* check flag 15 */
1975 if (kb->flag15 & pkt_flag)
1976 flag = BIT(ICE_XLT_KB_FLAG0_14_CNT);
1977
1978 /* check flag 0 - 14 */
1979 for (i = 0; i < ICE_XLT_KB_FLAG0_14_CNT; i++) {
1980 /* only check first entry */
1981 u16 idx = entry->flg0_14_sel[i] & ICE_XLT_KB_MASK;
1982
1983 if (pkt_flag & BIT(idx))
1984 flag |= (u16)BIT(i);
1985 }
1986
1987 return flag;
1988}
1989
1990/*** Parser API ***/
1991/**
1992 * ice_parser_create - create a parser instance
1993 * @hw: pointer to the hardware structure
1994 *
1995 * Return: a pointer to the allocated parser instance or ERR_PTR
1996 * in case of error.
1997 */
1998struct ice_parser *ice_parser_create(struct ice_hw *hw)
1999{
2000 struct ice_parser *p;
2001 void *err;
2002
2003 p = kzalloc(sizeof(*p), GFP_KERNEL);
2004 if (!p)
2005 return ERR_PTR(-ENOMEM);
2006
2007 p->hw = hw;
2008 p->rt.psr = p;
2009
2010 p->imem_table = ice_imem_table_get(hw);
2011 if (IS_ERR(p->imem_table)) {
2012 err = p->imem_table;
2013 goto err;
2014 }
2015
2016 p->mi_table = ice_metainit_table_get(hw);
2017 if (IS_ERR(p->mi_table)) {
2018 err = p->mi_table;
2019 goto err;
2020 }
2021
2022 p->pg_cam_table = ice_pg_cam_table_get(hw);
2023 if (IS_ERR(p->pg_cam_table)) {
2024 err = p->pg_cam_table;
2025 goto err;
2026 }
2027
2028 p->pg_sp_cam_table = ice_pg_sp_cam_table_get(hw);
2029 if (IS_ERR(p->pg_sp_cam_table)) {
2030 err = p->pg_sp_cam_table;
2031 goto err;
2032 }
2033
2034 p->pg_nm_cam_table = ice_pg_nm_cam_table_get(hw);
2035 if (IS_ERR(p->pg_nm_cam_table)) {
2036 err = p->pg_nm_cam_table;
2037 goto err;
2038 }
2039
2040 p->pg_nm_sp_cam_table = ice_pg_nm_sp_cam_table_get(hw);
2041 if (IS_ERR(p->pg_nm_sp_cam_table)) {
2042 err = p->pg_nm_sp_cam_table;
2043 goto err;
2044 }
2045
2046 p->bst_tcam_table = ice_bst_tcam_table_get(hw);
2047 if (IS_ERR(p->bst_tcam_table)) {
2048 err = p->bst_tcam_table;
2049 goto err;
2050 }
2051
2052 p->bst_lbl_table = ice_bst_lbl_table_get(hw);
2053 if (IS_ERR(p->bst_lbl_table)) {
2054 err = p->bst_lbl_table;
2055 goto err;
2056 }
2057
2058 p->ptype_mk_tcam_table = ice_ptype_mk_tcam_table_get(hw);
2059 if (IS_ERR(p->ptype_mk_tcam_table)) {
2060 err = p->ptype_mk_tcam_table;
2061 goto err;
2062 }
2063
2064 p->mk_grp_table = ice_mk_grp_table_get(hw);
2065 if (IS_ERR(p->mk_grp_table)) {
2066 err = p->mk_grp_table;
2067 goto err;
2068 }
2069
2070 p->proto_grp_table = ice_proto_grp_table_get(hw);
2071 if (IS_ERR(p->proto_grp_table)) {
2072 err = p->proto_grp_table;
2073 goto err;
2074 }
2075
2076 p->flg_rd_table = ice_flg_rd_table_get(hw);
2077 if (IS_ERR(p->flg_rd_table)) {
2078 err = p->flg_rd_table;
2079 goto err;
2080 }
2081
2082 p->xlt_kb_sw = ice_xlt_kb_get_sw(hw);
2083 if (IS_ERR(p->xlt_kb_sw)) {
2084 err = p->xlt_kb_sw;
2085 goto err;
2086 }
2087
2088 p->xlt_kb_acl = ice_xlt_kb_get_acl(hw);
2089 if (IS_ERR(p->xlt_kb_acl)) {
2090 err = p->xlt_kb_acl;
2091 goto err;
2092 }
2093
2094 p->xlt_kb_fd = ice_xlt_kb_get_fd(hw);
2095 if (IS_ERR(p->xlt_kb_fd)) {
2096 err = p->xlt_kb_fd;
2097 goto err;
2098 }
2099
2100 p->xlt_kb_rss = ice_xlt_kb_get_rss(hw);
2101 if (IS_ERR(p->xlt_kb_rss)) {
2102 err = p->xlt_kb_rss;
2103 goto err;
2104 }
2105
2106 return p;
2107err:
2108 ice_parser_destroy(p);
2109 return err;
2110}
2111
2112/**
2113 * ice_parser_destroy - destroy a parser instance
2114 * @psr: pointer to a parser instance
2115 */
2116void ice_parser_destroy(struct ice_parser *psr)
2117{
2118 kfree(psr->imem_table);
2119 kfree(psr->mi_table);
2120 kfree(psr->pg_cam_table);
2121 kfree(psr->pg_sp_cam_table);
2122 kfree(psr->pg_nm_cam_table);
2123 kfree(psr->pg_nm_sp_cam_table);
2124 kfree(psr->bst_tcam_table);
2125 kfree(psr->bst_lbl_table);
2126 kfree(psr->ptype_mk_tcam_table);
2127 kfree(psr->mk_grp_table);
2128 kfree(psr->proto_grp_table);
2129 kfree(psr->flg_rd_table);
2130 kfree(psr->xlt_kb_sw);
2131 kfree(psr->xlt_kb_acl);
2132 kfree(psr->xlt_kb_fd);
2133 kfree(psr->xlt_kb_rss);
2134
2135 kfree(psr);
2136}
2137
2138/**
2139 * ice_parser_run - parse on a packet in binary and return the result
2140 * @psr: pointer to a parser instance
2141 * @pkt_buf: packet data
2142 * @pkt_len: packet length
2143 * @rslt: input/output parameter to save parser result.
2144 *
2145 * Return: 0 on success or errno.
2146 */
2147int ice_parser_run(struct ice_parser *psr, const u8 *pkt_buf,
2148 int pkt_len, struct ice_parser_result *rslt)
2149{
2150 ice_parser_rt_reset(&psr->rt);
2151 ice_parser_rt_pktbuf_set(&psr->rt, pkt_buf, pkt_len);
2152
2153 return ice_parser_rt_execute(&psr->rt, rslt);
2154}
2155
2156/**
2157 * ice_parser_result_dump - dump a parser result info
2158 * @hw: pointer to the hardware structure
2159 * @rslt: parser result info to dump
2160 */
2161void ice_parser_result_dump(struct ice_hw *hw, struct ice_parser_result *rslt)
2162{
2163 struct device *dev = ice_hw_to_dev(hw);
2164 int i;
2165
2166 dev_info(dev, "ptype = %d\n", rslt->ptype);
2167 for (i = 0; i < rslt->po_num; i++)
2168 dev_info(dev, "proto = %d, offset = %d\n",
2169 rslt->po[i].proto_id, rslt->po[i].offset);
2170
2171 dev_info(dev, "flags_psr = 0x%016llx\n", rslt->flags_psr);
2172 dev_info(dev, "flags_pkt = 0x%016llx\n", rslt->flags_pkt);
2173 dev_info(dev, "flags_sw = 0x%04x\n", rslt->flags_sw);
2174 dev_info(dev, "flags_fd = 0x%04x\n", rslt->flags_fd);
2175 dev_info(dev, "flags_rss = 0x%04x\n", rslt->flags_rss);
2176}
2177
2178#define ICE_BT_VLD_KEY 0xFF
2179#define ICE_BT_INV_KEY 0xFE
2180
2181static void ice_bst_dvm_set(struct ice_parser *psr, enum ice_lbl_type type,
2182 bool on)
2183{
2184 u16 i = 0;
2185
2186 while (true) {
2187 struct ice_bst_tcam_item *item;
2188 u8 key;
2189
2190 item = ice_bst_tcam_search(psr->bst_tcam_table,
2191 psr->bst_lbl_table,
2192 type, &i);
2193 if (!item)
2194 break;
2195
2196 key = on ? ICE_BT_VLD_KEY : ICE_BT_INV_KEY;
2197 item->key[ICE_BT_VM_OFF] = key;
2198 item->key_inv[ICE_BT_VM_OFF] = key;
2199 i++;
2200 }
2201}
2202
2203/**
2204 * ice_parser_dvm_set - configure double vlan mode for parser
2205 * @psr: pointer to a parser instance
2206 * @on: true to turn on; false to turn off
2207 */
2208void ice_parser_dvm_set(struct ice_parser *psr, bool on)
2209{
2210 ice_bst_dvm_set(psr, ICE_LBL_BST_TYPE_DVM, on);
2211 ice_bst_dvm_set(psr, ICE_LBL_BST_TYPE_SVM, !on);
2212}
2213
2214static int ice_tunnel_port_set(struct ice_parser *psr, enum ice_lbl_type type,
2215 u16 udp_port, bool on)
2216{
2217 u8 *buf = (u8 *)&udp_port;
2218 u16 i = 0;
2219
2220 while (true) {
2221 struct ice_bst_tcam_item *item;
2222
2223 item = ice_bst_tcam_search(psr->bst_tcam_table,
2224 psr->bst_lbl_table,
2225 type, &i);
2226 if (!item)
2227 break;
2228
2229 /* found empty slot to add */
2230 if (on && item->key[ICE_BT_TUN_PORT_OFF_H] == ICE_BT_INV_KEY &&
2231 item->key_inv[ICE_BT_TUN_PORT_OFF_H] == ICE_BT_INV_KEY) {
2232 item->key_inv[ICE_BT_TUN_PORT_OFF_L] =
2233 buf[ICE_UDP_PORT_OFF_L];
2234 item->key_inv[ICE_BT_TUN_PORT_OFF_H] =
2235 buf[ICE_UDP_PORT_OFF_H];
2236
2237 item->key[ICE_BT_TUN_PORT_OFF_L] =
2238 ICE_BT_VLD_KEY - buf[ICE_UDP_PORT_OFF_L];
2239 item->key[ICE_BT_TUN_PORT_OFF_H] =
2240 ICE_BT_VLD_KEY - buf[ICE_UDP_PORT_OFF_H];
2241
2242 return 0;
2243 /* found a matched slot to delete */
2244 } else if (!on &&
2245 (item->key_inv[ICE_BT_TUN_PORT_OFF_L] ==
2246 buf[ICE_UDP_PORT_OFF_L] ||
2247 item->key_inv[ICE_BT_TUN_PORT_OFF_H] ==
2248 buf[ICE_UDP_PORT_OFF_H])) {
2249 item->key_inv[ICE_BT_TUN_PORT_OFF_L] = ICE_BT_VLD_KEY;
2250 item->key_inv[ICE_BT_TUN_PORT_OFF_H] = ICE_BT_INV_KEY;
2251
2252 item->key[ICE_BT_TUN_PORT_OFF_L] = ICE_BT_VLD_KEY;
2253 item->key[ICE_BT_TUN_PORT_OFF_H] = ICE_BT_INV_KEY;
2254
2255 return 0;
2256 }
2257 i++;
2258 }
2259
2260 return -EINVAL;
2261}
2262
2263/**
2264 * ice_parser_vxlan_tunnel_set - configure vxlan tunnel for parser
2265 * @psr: pointer to a parser instance
2266 * @udp_port: vxlan tunnel port in UDP header
2267 * @on: true to turn on; false to turn off
2268 *
2269 * Return: 0 on success or errno on failure.
2270 */
2271int ice_parser_vxlan_tunnel_set(struct ice_parser *psr,
2272 u16 udp_port, bool on)
2273{
2274 return ice_tunnel_port_set(psr, ICE_LBL_BST_TYPE_VXLAN, udp_port, on);
2275}
2276
2277/**
2278 * ice_parser_geneve_tunnel_set - configure geneve tunnel for parser
2279 * @psr: pointer to a parser instance
2280 * @udp_port: geneve tunnel port in UDP header
2281 * @on: true to turn on; false to turn off
2282 *
2283 * Return: 0 on success or errno on failure.
2284 */
2285int ice_parser_geneve_tunnel_set(struct ice_parser *psr,
2286 u16 udp_port, bool on)
2287{
2288 return ice_tunnel_port_set(psr, ICE_LBL_BST_TYPE_GENEVE, udp_port, on);
2289}
2290
2291/**
2292 * ice_parser_ecpri_tunnel_set - configure ecpri tunnel for parser
2293 * @psr: pointer to a parser instance
2294 * @udp_port: ecpri tunnel port in UDP header
2295 * @on: true to turn on; false to turn off
2296 *
2297 * Return: 0 on success or errno on failure.
2298 */
2299int ice_parser_ecpri_tunnel_set(struct ice_parser *psr,
2300 u16 udp_port, bool on)
2301{
2302 return ice_tunnel_port_set(psr, ICE_LBL_BST_TYPE_UDP_ECPRI,
2303 udp_port, on);
2304}
2305
2306/**
2307 * ice_nearest_proto_id - find nearest protocol ID
2308 * @rslt: pointer to a parser result instance
2309 * @offset: a min value for the protocol offset
2310 * @proto_id: the protocol ID (output)
2311 * @proto_off: the protocol offset (output)
2312 *
2313 * From the protocols in @rslt, find the nearest protocol that has offset
2314 * larger than @offset.
2315 *
2316 * Return: if true, the protocol's ID and offset
2317 */
2318static bool ice_nearest_proto_id(struct ice_parser_result *rslt, u16 offset,
2319 u8 *proto_id, u16 *proto_off)
2320{
2321 u16 dist = U16_MAX;
2322 u8 proto = 0;
2323 int i;
2324
2325 for (i = 0; i < rslt->po_num; i++) {
2326 if (offset < rslt->po[i].offset)
2327 continue;
2328 if (offset - rslt->po[i].offset < dist) {
2329 proto = rslt->po[i].proto_id;
2330 dist = offset - rslt->po[i].offset;
2331 }
2332 }
2333
2334 if (dist % 2)
2335 return false;
2336
2337 *proto_id = proto;
2338 *proto_off = dist;
2339
2340 return true;
2341}
2342
2343/* default flag mask to cover GTP_EH_PDU, GTP_EH_PDU_LINK and TUN2
2344 * In future, the flag masks should learn from DDP
2345 */
2346#define ICE_KEYBUILD_FLAG_MASK_DEFAULT_SW 0x4002
2347#define ICE_KEYBUILD_FLAG_MASK_DEFAULT_ACL 0x0000
2348#define ICE_KEYBUILD_FLAG_MASK_DEFAULT_FD 0x6080
2349#define ICE_KEYBUILD_FLAG_MASK_DEFAULT_RSS 0x6010
2350
2351/**
2352 * ice_parser_profile_init - initialize a FXP profile based on parser result
2353 * @rslt: a instance of a parser result
2354 * @pkt_buf: packet data buffer
2355 * @msk_buf: packet mask buffer
2356 * @buf_len: packet length
2357 * @blk: FXP pipeline stage
2358 * @prof: input/output parameter to save the profile
2359 *
2360 * Return: 0 on success or errno on failure.
2361 */
2362int ice_parser_profile_init(struct ice_parser_result *rslt,
2363 const u8 *pkt_buf, const u8 *msk_buf,
2364 int buf_len, enum ice_block blk,
2365 struct ice_parser_profile *prof)
2366{
2367 u8 proto_id = U8_MAX;
2368 u16 proto_off = 0;
2369 u16 off;
2370
2371 memset(prof, 0, sizeof(*prof));
2372 set_bit(rslt->ptype, prof->ptypes);
2373 if (blk == ICE_BLK_SW) {
2374 prof->flags = rslt->flags_sw;
2375 prof->flags_msk = ICE_KEYBUILD_FLAG_MASK_DEFAULT_SW;
2376 } else if (blk == ICE_BLK_ACL) {
2377 prof->flags = rslt->flags_acl;
2378 prof->flags_msk = ICE_KEYBUILD_FLAG_MASK_DEFAULT_ACL;
2379 } else if (blk == ICE_BLK_FD) {
2380 prof->flags = rslt->flags_fd;
2381 prof->flags_msk = ICE_KEYBUILD_FLAG_MASK_DEFAULT_FD;
2382 } else if (blk == ICE_BLK_RSS) {
2383 prof->flags = rslt->flags_rss;
2384 prof->flags_msk = ICE_KEYBUILD_FLAG_MASK_DEFAULT_RSS;
2385 } else {
2386 return -EINVAL;
2387 }
2388
2389 for (off = 0; off < buf_len - 1; off++) {
2390 if (msk_buf[off] == 0 && msk_buf[off + 1] == 0)
2391 continue;
2392 if (!ice_nearest_proto_id(rslt, off, &proto_id, &proto_off))
2393 continue;
2394 if (prof->fv_num >= ICE_PARSER_FV_MAX)
2395 return -EINVAL;
2396
2397 prof->fv[prof->fv_num].proto_id = proto_id;
2398 prof->fv[prof->fv_num].offset = proto_off;
2399 prof->fv[prof->fv_num].spec = *(const u16 *)&pkt_buf[off];
2400 prof->fv[prof->fv_num].msk = *(const u16 *)&msk_buf[off];
2401 prof->fv_num++;
2402 }
2403
2404 return 0;
2405}
2406
2407/**
2408 * ice_parser_profile_dump - dump an FXP profile info
2409 * @hw: pointer to the hardware structure
2410 * @prof: profile info to dump
2411 */
2412void ice_parser_profile_dump(struct ice_hw *hw,
2413 struct ice_parser_profile *prof)
2414{
2415 struct device *dev = ice_hw_to_dev(hw);
2416 u16 i;
2417
2418 dev_info(dev, "ptypes:\n");
2419 for (i = 0; i < ICE_FLOW_PTYPE_MAX; i++)
2420 if (test_bit(i, prof->ptypes))
2421 dev_info(dev, "\t%u\n", i);
2422
2423 for (i = 0; i < prof->fv_num; i++)
2424 dev_info(dev, "proto = %u, offset = %2u, spec = 0x%04x, mask = 0x%04x\n",
2425 prof->fv[i].proto_id, prof->fv[i].offset,
2426 prof->fv[i].spec, prof->fv[i].msk);
2427
2428 dev_info(dev, "flags = 0x%04x\n", prof->flags);
2429 dev_info(dev, "flags_msk = 0x%04x\n", prof->flags_msk);
2430}