1
2
3
4
5#ifndef _RTE_ACC100_PMD_H_
6#define _RTE_ACC100_PMD_H_
7
8#include "acc100_pf_enum.h"
9#include "acc100_vf_enum.h"
10#include "rte_acc100_cfg.h"
11
12
13#define rte_bbdev_log(level, fmt, ...) \
14 rte_log(RTE_LOG_ ## level, acc100_logtype, fmt "\n", \
15 ##__VA_ARGS__)
16
17#ifdef RTE_LIBRTE_BBDEV_DEBUG
18#define rte_bbdev_log_debug(fmt, ...) \
19 rte_bbdev_log(DEBUG, "acc100_pmd: " fmt, \
20 ##__VA_ARGS__)
21#else
22#define rte_bbdev_log_debug(fmt, ...)
23#endif
24
25
26#define ACC100PF_DRIVER_NAME intel_acc100_pf
27#define ACC100VF_DRIVER_NAME intel_acc100_vf
28
29
30#define RTE_ACC100_VENDOR_ID (0x8086)
31#define RTE_ACC100_PF_DEVICE_ID (0x0d5c)
32#define RTE_ACC100_VF_DEVICE_ID (0x0d5d)
33
34
35#ifndef RTE_ACC100_SINGLE_FEC
36#define RTE_ACC100_SINGLE_FEC 0
37#endif
38
39
40#define ACC100_DMA_DESC_TYPE 2
41#define ACC100_DMA_CODE_BLK_MODE 0
42#define ACC100_DMA_BLKID_FCW 1
43#define ACC100_DMA_BLKID_IN 2
44#define ACC100_DMA_BLKID_OUT_ENC 1
45#define ACC100_DMA_BLKID_OUT_HARD 1
46#define ACC100_DMA_BLKID_OUT_SOFT 2
47#define ACC100_DMA_BLKID_OUT_HARQ 3
48#define ACC100_DMA_BLKID_IN_HARQ 3
49
50
51#define ACC100_FCW_TD_VER 1
52#define ACC100_FCW_TD_EXT_COLD_REG_EN 1
53#define ACC100_FCW_TD_AUTOMAP 0x0f
54#define ACC100_FCW_TD_RVIDX_0 2
55#define ACC100_FCW_TD_RVIDX_1 26
56#define ACC100_FCW_TD_RVIDX_2 50
57#define ACC100_FCW_TD_RVIDX_3 74
58
59
60#define ACC100_REG_IRQ_EN_ALL 0x1FF83FF
61
62
63#define ACC100_SIZE_64MBYTE (64*1024*1024)
64
65#define ACC100_INFO_RING_NUM_ENTRIES 1024
66
67#define ACC100_HARQ_LAYOUT (64*1024*1024)
68
69#define ACC100_HARQ_OFFSET (32*1024)
70
71#define ACC100_INFO_RING_MASK (ACC100_INFO_RING_NUM_ENTRIES-1)
72
73#define ACC100_NUM_VFS 16
74#define ACC100_NUM_QGRPS 8
75#define ACC100_NUM_QGRPS_PER_WORD 8
76#define ACC100_NUM_AQS 16
77#define MAX_ENQ_BATCH_SIZE 255
78
79#define ACC100_BYTES_IN_WORD 4
80#define ACC100_MAX_E_MBUF 64000
81
82#define ACC100_GRP_ID_SHIFT 10
83#define ACC100_VF_ID_SHIFT 4
84#define ACC100_VF_OFFSET_QOS 16
85#define ACC100_TMPL_PRI_0 0x03020100
86#define ACC100_TMPL_PRI_1 0x07060504
87#define ACC100_TMPL_PRI_2 0x0b0a0908
88#define ACC100_TMPL_PRI_3 0x0f0e0d0c
89#define ACC100_QUEUE_ENABLE 0x80000000
90#define ACC100_WORDS_IN_ARAM_SIZE (128 * 1024 / 4)
91#define ACC100_FDONE 0x80000000
92#define ACC100_SDONE 0x40000000
93
94#define ACC100_NUM_TMPL 32
95
96#define ACC100_SIG_UL_5G 0
97#define ACC100_SIG_UL_5G_LAST 7
98#define ACC100_SIG_DL_5G 13
99#define ACC100_SIG_DL_5G_LAST 15
100#define ACC100_SIG_UL_4G 16
101#define ACC100_SIG_UL_4G_LAST 21
102#define ACC100_SIG_DL_4G 27
103#define ACC100_SIG_DL_4G_LAST 31
104#define ACC100_NUM_ACCS 5
105#define ACC100_ACCMAP_0 0
106#define ACC100_ACCMAP_1 2
107#define ACC100_ACCMAP_2 1
108#define ACC100_ACCMAP_3 3
109#define ACC100_ACCMAP_4 4
110#define ACC100_PF_VAL 2
111
112
113#define ACC100_SW_RING_MEM_ALLOC_ATTEMPTS 5
114#define ACC100_MAX_QUEUE_DEPTH 1024
115#define ACC100_DMA_MAX_NUM_POINTERS 14
116#define ACC100_DMA_MAX_NUM_POINTERS_IN 7
117#define ACC100_DMA_DESC_PADDING 8
118#define ACC100_FCW_PADDING 12
119#define ACC100_DESC_FCW_OFFSET 192
120#define ACC100_DESC_SIZE 256
121#define ACC100_DESC_OFFSET (ACC100_DESC_SIZE / 64)
122#define ACC100_FCW_TE_BLEN 32
123#define ACC100_FCW_TD_BLEN 24
124#define ACC100_FCW_LE_BLEN 32
125#define ACC100_FCW_LD_BLEN 36
126#define ACC100_5GUL_SIZE_0 16
127#define ACC100_5GUL_SIZE_1 40
128#define ACC100_5GUL_OFFSET_0 36
129
130#define ACC100_FCW_VER 2
131#define ACC100_MUX_5GDL_DESC 6
132#define ACC100_CMP_ENC_SIZE 20
133#define ACC100_CMP_DEC_SIZE 24
134#define ACC100_ENC_OFFSET (32)
135#define ACC100_DEC_OFFSET (80)
136#define ACC100_EXT_MEM
137#define ACC100_HARQ_OFFSET_THRESHOLD 1024
138
139
140#define ACC100_N_ZC_1 66
141#define ACC100_N_ZC_2 50
142#define ACC100_K0_1_1 17
143#define ACC100_K0_1_2 13
144#define ACC100_K0_2_1 33
145#define ACC100_K0_2_2 25
146#define ACC100_K0_3_1 56
147#define ACC100_K0_3_2 43
148
149
150#define ACC100_DDR_ECC_ENABLE
151#define ACC100_CFG_DMA_ERROR 0x3D7
152#define ACC100_CFG_AXI_CACHE 0x11
153#define ACC100_CFG_QMGR_HI_P 0x0F0F
154#define ACC100_CFG_PCI_AXI 0xC003
155#define ACC100_CFG_PCI_BRIDGE 0x40006033
156#define ACC100_ENGINE_OFFSET 0x1000
157#define ACC100_RESET_HI 0x20100
158#define ACC100_RESET_LO 0x20000
159#define ACC100_RESET_HARD 0x1FF
160#define ACC100_ENGINES_MAX 9
161#define ACC100_LONG_WAIT 1000
162#define ACC100_GPEX_AXIMAP_NUM 17
163
164
165struct acc100_dma_triplet {
166 uint64_t address;
167 uint32_t blen:20,
168 res0:4,
169 last:1,
170 dma_ext:1,
171 res1:2,
172 blkid:4;
173} __rte_packed;
174
175
176union acc100_dma_rsp_desc {
177 uint32_t val;
178 struct {
179 uint32_t crc_status:1,
180 synd_ok:1,
181 dma_err:1,
182 neg_stop:1,
183 fcw_err:1,
184 output_err:1,
185 input_err:1,
186 timestampEn:1,
187 iterCountFrac:8,
188 iter_cnt:8,
189 rsrvd3:6,
190 sdone:1,
191 fdone:1;
192 uint32_t add_info_0;
193 uint32_t add_info_1;
194 };
195};
196
197
198
199union acc100_enqueue_reg_fmt {
200 uint32_t val;
201 struct {
202 uint32_t num_elem:8,
203 addr_offset:3,
204 rsrvd:1,
205 req_elem_addr:20;
206 };
207};
208
209
210struct __rte_packed acc100_fcw_td {
211 uint8_t fcw_ver:4,
212 num_maps:4;
213 uint8_t filler:6,
214 rsrvd0:1,
215 bypass_sb_deint:1;
216 uint16_t k_pos;
217 uint16_t k_neg;
218 uint8_t c_neg;
219 uint8_t c;
220 uint32_t ea;
221 uint32_t eb;
222 uint8_t cab;
223 uint8_t k0_start_col;
224 uint8_t rsrvd1;
225 uint8_t code_block_mode:1,
226 turbo_crc_type:1,
227 rsrvd2:3,
228 bypass_teq:1,
229 soft_output_en:1,
230 ext_td_cold_reg_en:1;
231 union {
232 uint32_t ext_td_cold_reg;
233 struct {
234 uint32_t min_iter:4,
235 max_iter:4,
236 ext_scale:5,
237 rsrvd3:3,
238 early_stop_en:1,
239 sw_soft_out_dis:1,
240 sw_et_cont:1,
241 sw_soft_out_saturation:1,
242 half_iter_on:1,
243 raw_decoder_input_on:1,
244 rsrvd4:10;
245 };
246 };
247};
248
249
250struct __rte_packed acc100_fcw_ld {
251 uint32_t FCWversion:4,
252 qm:4,
253 nfiller:11,
254 BG:1,
255 Zc:9,
256 res0:1,
257 synd_precoder:1,
258 synd_post:1;
259 uint32_t ncb:16,
260 k0:16;
261 uint32_t rm_e:24,
262 hcin_en:1,
263 hcout_en:1,
264 crc_select:1,
265 bypass_dec:1,
266 bypass_intlv:1,
267 so_en:1,
268 so_bypass_rm:1,
269 so_bypass_intlv:1;
270 uint32_t hcin_offset:16,
271 hcin_size0:16;
272 uint32_t hcin_size1:16,
273 hcin_decomp_mode:3,
274 llr_pack_mode:1,
275 hcout_comp_mode:3,
276 res2:1,
277 dec_convllr:4,
278 hcout_convllr:4;
279 uint32_t itmax:7,
280 itstop:1,
281 so_it:7,
282 res3:1,
283 hcout_offset:16;
284 uint32_t hcout_size0:16,
285 hcout_size1:16;
286 uint32_t gain_i:8,
287 gain_h:8,
288 negstop_th:16;
289 uint32_t negstop_it:7,
290 negstop_en:1,
291 res4:24;
292};
293
294
295struct __rte_packed acc100_fcw_te {
296 uint16_t k_neg;
297 uint16_t k_pos;
298 uint8_t c_neg;
299 uint8_t c;
300 uint8_t filler;
301 uint8_t cab;
302 uint32_t ea:17,
303 rsrvd0:15;
304 uint32_t eb:17,
305 rsrvd1:15;
306 uint16_t ncb_neg;
307 uint16_t ncb_pos;
308 uint8_t rv_idx0:2,
309 rsrvd2:2,
310 rv_idx1:2,
311 rsrvd3:2;
312 uint8_t bypass_rv_idx0:1,
313 bypass_rv_idx1:1,
314 bypass_rm:1,
315 rsrvd4:5;
316 uint8_t rsrvd5:1,
317 rsrvd6:3,
318 code_block_crc:1,
319 rsrvd7:3;
320 uint8_t code_block_mode:1,
321 rsrvd8:7;
322 uint64_t rsrvd9;
323};
324
325
326struct __rte_packed acc100_fcw_le {
327 uint32_t FCWversion:4,
328 qm:4,
329 nfiller:11,
330 BG:1,
331 Zc:9,
332 res0:3;
333 uint32_t ncb:16,
334 k0:16;
335 uint32_t rm_e:24,
336 res1:2,
337 crc_select:1,
338 res2:1,
339 bypass_intlv:1,
340 res3:3;
341 uint32_t res4_a:12,
342 mcb_count:3,
343 res4_b:17;
344 uint32_t res5;
345 uint32_t res6;
346 uint32_t res7;
347 uint32_t res8;
348};
349
350
351struct __rte_packed acc100_dma_req_desc {
352 union {
353 struct{
354 uint32_t type:4,
355 rsrvd0:26,
356 sdone:1,
357 fdone:1;
358 uint32_t rsrvd1;
359 uint32_t rsrvd2;
360 uint32_t pass_param:8,
361 sdone_enable:1,
362 irq_enable:1,
363 timeStampEn:1,
364 res0:5,
365 numCBs:4,
366 res1:4,
367 m2dlen:4,
368 d2mlen:4;
369 };
370 struct{
371 uint32_t word0;
372 uint32_t word1;
373 uint32_t word2;
374 uint32_t word3;
375 };
376 };
377 struct acc100_dma_triplet data_ptrs[ACC100_DMA_MAX_NUM_POINTERS];
378
379
380 union {
381 void *op_addr;
382 uint64_t pad1;
383 };
384
385
386
387
388
389
390
391 union {
392 struct {
393 union {
394 struct acc100_fcw_ld fcw_ld;
395 struct acc100_fcw_td fcw_td;
396 struct acc100_fcw_le fcw_le;
397 struct acc100_fcw_te fcw_te;
398 uint32_t pad2[ACC100_FCW_PADDING];
399 };
400 uint32_t last_desc_in_batch :8,
401 cbs_in_tb:8,
402 pad4 : 16;
403 };
404 uint64_t pad3[ACC100_DMA_DESC_PADDING];
405 };
406};
407
408
409union acc100_dma_desc {
410 struct acc100_dma_req_desc req;
411 union acc100_dma_rsp_desc rsp;
412 uint64_t atom_hdr;
413};
414
415
416
417union acc100_harq_layout_data {
418 uint32_t val;
419 struct {
420 uint16_t offset;
421 uint16_t size0;
422 };
423} __rte_packed;
424
425
426
427union acc100_info_ring_data {
428 uint32_t val;
429 struct {
430 union {
431 uint16_t detailed_info;
432 struct {
433 uint16_t aq_id: 4;
434 uint16_t qg_id: 4;
435 uint16_t vf_id: 6;
436 uint16_t reserved: 2;
437 };
438 };
439 uint16_t int_nb: 7;
440 uint16_t msi_0: 1;
441 uint16_t vf2pf: 6;
442 uint16_t loop: 1;
443 uint16_t valid: 1;
444 };
445} __rte_packed;
446
447struct acc100_registry_addr {
448 unsigned int dma_ring_dl5g_hi;
449 unsigned int dma_ring_dl5g_lo;
450 unsigned int dma_ring_ul5g_hi;
451 unsigned int dma_ring_ul5g_lo;
452 unsigned int dma_ring_dl4g_hi;
453 unsigned int dma_ring_dl4g_lo;
454 unsigned int dma_ring_ul4g_hi;
455 unsigned int dma_ring_ul4g_lo;
456 unsigned int ring_size;
457 unsigned int info_ring_hi;
458 unsigned int info_ring_lo;
459 unsigned int info_ring_en;
460 unsigned int info_ring_ptr;
461 unsigned int tail_ptrs_dl5g_hi;
462 unsigned int tail_ptrs_dl5g_lo;
463 unsigned int tail_ptrs_ul5g_hi;
464 unsigned int tail_ptrs_ul5g_lo;
465 unsigned int tail_ptrs_dl4g_hi;
466 unsigned int tail_ptrs_dl4g_lo;
467 unsigned int tail_ptrs_ul4g_hi;
468 unsigned int tail_ptrs_ul4g_lo;
469 unsigned int depth_log0_offset;
470 unsigned int depth_log1_offset;
471 unsigned int qman_group_func;
472 unsigned int ddr_range;
473};
474
475
476static const struct acc100_registry_addr pf_reg_addr = {
477 .dma_ring_dl5g_hi = HWPfDmaFec5GdlDescBaseHiRegVf,
478 .dma_ring_dl5g_lo = HWPfDmaFec5GdlDescBaseLoRegVf,
479 .dma_ring_ul5g_hi = HWPfDmaFec5GulDescBaseHiRegVf,
480 .dma_ring_ul5g_lo = HWPfDmaFec5GulDescBaseLoRegVf,
481 .dma_ring_dl4g_hi = HWPfDmaFec4GdlDescBaseHiRegVf,
482 .dma_ring_dl4g_lo = HWPfDmaFec4GdlDescBaseLoRegVf,
483 .dma_ring_ul4g_hi = HWPfDmaFec4GulDescBaseHiRegVf,
484 .dma_ring_ul4g_lo = HWPfDmaFec4GulDescBaseLoRegVf,
485 .ring_size = HWPfQmgrRingSizeVf,
486 .info_ring_hi = HWPfHiInfoRingBaseHiRegPf,
487 .info_ring_lo = HWPfHiInfoRingBaseLoRegPf,
488 .info_ring_en = HWPfHiInfoRingIntWrEnRegPf,
489 .info_ring_ptr = HWPfHiInfoRingPointerRegPf,
490 .tail_ptrs_dl5g_hi = HWPfDmaFec5GdlRespPtrHiRegVf,
491 .tail_ptrs_dl5g_lo = HWPfDmaFec5GdlRespPtrLoRegVf,
492 .tail_ptrs_ul5g_hi = HWPfDmaFec5GulRespPtrHiRegVf,
493 .tail_ptrs_ul5g_lo = HWPfDmaFec5GulRespPtrLoRegVf,
494 .tail_ptrs_dl4g_hi = HWPfDmaFec4GdlRespPtrHiRegVf,
495 .tail_ptrs_dl4g_lo = HWPfDmaFec4GdlRespPtrLoRegVf,
496 .tail_ptrs_ul4g_hi = HWPfDmaFec4GulRespPtrHiRegVf,
497 .tail_ptrs_ul4g_lo = HWPfDmaFec4GulRespPtrLoRegVf,
498 .depth_log0_offset = HWPfQmgrGrpDepthLog20Vf,
499 .depth_log1_offset = HWPfQmgrGrpDepthLog21Vf,
500 .qman_group_func = HWPfQmgrGrpFunction0,
501 .ddr_range = HWPfDmaVfDdrBaseRw,
502};
503
504
505static const struct acc100_registry_addr vf_reg_addr = {
506 .dma_ring_dl5g_hi = HWVfDmaFec5GdlDescBaseHiRegVf,
507 .dma_ring_dl5g_lo = HWVfDmaFec5GdlDescBaseLoRegVf,
508 .dma_ring_ul5g_hi = HWVfDmaFec5GulDescBaseHiRegVf,
509 .dma_ring_ul5g_lo = HWVfDmaFec5GulDescBaseLoRegVf,
510 .dma_ring_dl4g_hi = HWVfDmaFec4GdlDescBaseHiRegVf,
511 .dma_ring_dl4g_lo = HWVfDmaFec4GdlDescBaseLoRegVf,
512 .dma_ring_ul4g_hi = HWVfDmaFec4GulDescBaseHiRegVf,
513 .dma_ring_ul4g_lo = HWVfDmaFec4GulDescBaseLoRegVf,
514 .ring_size = HWVfQmgrRingSizeVf,
515 .info_ring_hi = HWVfHiInfoRingBaseHiVf,
516 .info_ring_lo = HWVfHiInfoRingBaseLoVf,
517 .info_ring_en = HWVfHiInfoRingIntWrEnVf,
518 .info_ring_ptr = HWVfHiInfoRingPointerVf,
519 .tail_ptrs_dl5g_hi = HWVfDmaFec5GdlRespPtrHiRegVf,
520 .tail_ptrs_dl5g_lo = HWVfDmaFec5GdlRespPtrLoRegVf,
521 .tail_ptrs_ul5g_hi = HWVfDmaFec5GulRespPtrHiRegVf,
522 .tail_ptrs_ul5g_lo = HWVfDmaFec5GulRespPtrLoRegVf,
523 .tail_ptrs_dl4g_hi = HWVfDmaFec4GdlRespPtrHiRegVf,
524 .tail_ptrs_dl4g_lo = HWVfDmaFec4GdlRespPtrLoRegVf,
525 .tail_ptrs_ul4g_hi = HWVfDmaFec4GulRespPtrHiRegVf,
526 .tail_ptrs_ul4g_lo = HWVfDmaFec4GulRespPtrLoRegVf,
527 .depth_log0_offset = HWVfQmgrGrpDepthLog20Vf,
528 .depth_log1_offset = HWVfQmgrGrpDepthLog21Vf,
529 .qman_group_func = HWVfQmgrGrpFunction0Vf,
530 .ddr_range = HWVfDmaDdrBaseRangeRoVf,
531};
532
533
534struct __rte_cache_aligned acc100_queue {
535 union acc100_dma_desc *ring_addr;
536 rte_iova_t ring_addr_iova;
537 uint32_t sw_ring_head;
538 uint32_t sw_ring_tail;
539
540 uint32_t sw_ring_depth;
541
542 uint32_t sw_ring_wrap_mask;
543
544 void *mmio_reg_enqueue;
545 uint8_t vf_id;
546 uint8_t qgrp_id;
547 uint16_t aq_id;
548 uint16_t aq_depth;
549 uint32_t aq_enqueued;
550 uint32_t aq_dequeued;
551 uint32_t irq_enable;
552 struct rte_mempool *fcw_mempool;
553 enum rte_bbdev_op_type op_type;
554
555 uint8_t *lb_in;
556 uint8_t *lb_out;
557 rte_iova_t lb_in_addr_iova;
558 rte_iova_t lb_out_addr_iova;
559 struct acc100_device *d;
560};
561
562
563struct acc100_device {
564 void *mmio_base;
565 void *sw_rings_base;
566 void *sw_rings;
567 rte_iova_t sw_rings_iova;
568
569
570
571
572 union acc100_info_ring_data *info_ring;
573
574 union acc100_harq_layout_data *harq_layout;
575
576 uint16_t info_ring_head;
577
578
579
580 uint32_t sw_ring_size;
581 uint32_t ddr_size;
582 uint32_t *tail_ptrs;
583 rte_iova_t tail_ptr_iova;
584
585
586
587 uint32_t sw_ring_max_depth;
588 struct rte_acc100_conf acc100_conf;
589
590 uint16_t q_assigned_bit_map[ACC100_NUM_QGRPS];
591 bool pf_device;
592 bool configured;
593};
594
595
596
597
598
599struct acc100_deq_intr_details {
600 uint16_t queue_id;
601};
602
603#endif
604