1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2020 Intel Corporation
5 #ifndef _RTE_ACC100_PMD_H_
6 #define _RTE_ACC100_PMD_H_
8 #include "acc100_pf_enum.h"
9 #include "acc100_vf_enum.h"
11 /* Helper macro for logging */
12 #define rte_bbdev_log(level, fmt, ...) \
13 rte_log(RTE_LOG_ ## level, acc100_logtype, fmt "\n", \
16 #ifdef RTE_LIBRTE_BBDEV_DEBUG
17 #define rte_bbdev_log_debug(fmt, ...) \
18 rte_bbdev_log(DEBUG, "acc100_pmd: " fmt, \
21 #define rte_bbdev_log_debug(fmt, ...)
24 /* ACC100 PF and VF driver names */
25 #define ACC100PF_DRIVER_NAME intel_acc100_pf
26 #define ACC100VF_DRIVER_NAME intel_acc100_vf
28 /* ACC100 PCI vendor & device IDs */
29 #define RTE_ACC100_VENDOR_ID (0x8086)
30 #define RTE_ACC100_PF_DEVICE_ID (0x0d5c)
31 #define RTE_ACC100_VF_DEVICE_ID (0x0d5d)
33 /* Define as 1 to use only a single FEC engine */
34 #ifndef RTE_ACC100_SINGLE_FEC
35 #define RTE_ACC100_SINGLE_FEC 0
38 /* Values used in filling in descriptors */
39 #define ACC100_DMA_DESC_TYPE 2
40 #define ACC100_DMA_CODE_BLK_MODE 0
41 #define ACC100_DMA_BLKID_FCW 1
42 #define ACC100_DMA_BLKID_IN 2
43 #define ACC100_DMA_BLKID_OUT_ENC 1
44 #define ACC100_DMA_BLKID_OUT_HARD 1
45 #define ACC100_DMA_BLKID_OUT_SOFT 2
46 #define ACC100_DMA_BLKID_OUT_HARQ 3
47 #define ACC100_DMA_BLKID_IN_HARQ 3
49 /* Values used in filling in decode FCWs */
50 #define ACC100_FCW_TD_VER 1
51 #define ACC100_FCW_TD_EXT_COLD_REG_EN 1
52 #define ACC100_FCW_TD_AUTOMAP 0x0f
53 #define ACC100_FCW_TD_RVIDX_0 2
54 #define ACC100_FCW_TD_RVIDX_1 26
55 #define ACC100_FCW_TD_RVIDX_2 50
56 #define ACC100_FCW_TD_RVIDX_3 74
58 /* Values used in writing to the registers */
59 #define ACC100_REG_IRQ_EN_ALL 0x1FF83FF /* Enable all interrupts */
61 /* ACC100 Specific Dimensioning */
62 #define ACC100_SIZE_64MBYTE (64*1024*1024)
63 /* Number of elements in an Info Ring */
64 #define ACC100_INFO_RING_NUM_ENTRIES 1024
65 /* Number of elements in HARQ layout memory */
66 #define ACC100_HARQ_LAYOUT (64*1024*1024)
67 /* Assume offset for HARQ in memory */
68 #define ACC100_HARQ_OFFSET (32*1024)
69 /* Mask used to calculate an index in an Info Ring array (not a byte offset) */
70 #define ACC100_INFO_RING_MASK (ACC100_INFO_RING_NUM_ENTRIES-1)
71 /* Number of Virtual Functions ACC100 supports */
72 #define ACC100_NUM_VFS 16
73 #define ACC100_NUM_QGRPS 8
74 #define ACC100_NUM_QGRPS_PER_WORD 8
75 #define ACC100_NUM_AQS 16
76 #define MAX_ENQ_BATCH_SIZE 255
77 /* All ACC100 Registers alignment are 32bits = 4B */
78 #define ACC100_BYTES_IN_WORD 4
79 #define ACC100_MAX_E_MBUF 64000
81 #define ACC100_GRP_ID_SHIFT 10 /* Queue Index Hierarchy */
82 #define ACC100_VF_ID_SHIFT 4 /* Queue Index Hierarchy */
83 #define ACC100_VF_OFFSET_QOS 16 /* offset in Memory specific to QoS Mon */
84 #define ACC100_TMPL_PRI_0 0x03020100
85 #define ACC100_TMPL_PRI_1 0x07060504
86 #define ACC100_TMPL_PRI_2 0x0b0a0908
87 #define ACC100_TMPL_PRI_3 0x0f0e0d0c
88 #define ACC100_QUEUE_ENABLE 0x80000000 /* Bit to mark Queue as Enabled */
89 #define ACC100_WORDS_IN_ARAM_SIZE (128 * 1024 / 4)
91 #define ACC100_NUM_TMPL 32
92 /* Mapping of signals for the available engines */
93 #define ACC100_SIG_UL_5G 0
94 #define ACC100_SIG_UL_5G_LAST 7
95 #define ACC100_SIG_DL_5G 13
96 #define ACC100_SIG_DL_5G_LAST 15
97 #define ACC100_SIG_UL_4G 16
98 #define ACC100_SIG_UL_4G_LAST 21
99 #define ACC100_SIG_DL_4G 27
100 #define ACC100_SIG_DL_4G_LAST 31
102 /* max number of iterations to allocate memory block for all rings */
103 #define ACC100_SW_RING_MEM_ALLOC_ATTEMPTS 5
104 #define ACC100_MAX_QUEUE_DEPTH 1024
105 #define ACC100_DMA_MAX_NUM_POINTERS 14
106 #define ACC100_DMA_DESC_PADDING 8
107 #define ACC100_FCW_PADDING 12
108 #define ACC100_DESC_FCW_OFFSET 192
109 #define ACC100_DESC_SIZE 256
110 #define ACC100_DESC_OFFSET (ACC100_DESC_SIZE / 64)
111 #define ACC100_FCW_TE_BLEN 32
112 #define ACC100_FCW_TD_BLEN 24
113 #define ACC100_FCW_LE_BLEN 32
114 #define ACC100_FCW_LD_BLEN 36
116 #define ACC100_FCW_VER 2
117 #define ACC100_MUX_5GDL_DESC 6
118 #define ACC100_CMP_ENC_SIZE 20
119 #define ACC100_CMP_DEC_SIZE 24
120 #define ACC100_ENC_OFFSET (32)
121 #define ACC100_DEC_OFFSET (80)
122 #define ACC100_EXT_MEM /* Default option with memory external to CPU */
123 #define ACC100_HARQ_OFFSET_THRESHOLD 1024
125 /* Constants from K0 computation from 3GPP 38.212 Table 5.4.2.1-2 */
126 #define ACC100_N_ZC_1 66 /* N = 66 Zc for BG 1 */
127 #define ACC100_N_ZC_2 50 /* N = 50 Zc for BG 2 */
128 #define ACC100_K0_1_1 17 /* K0 fraction numerator for rv 1 and BG 1 */
129 #define ACC100_K0_1_2 13 /* K0 fraction numerator for rv 1 and BG 2 */
130 #define ACC100_K0_2_1 33 /* K0 fraction numerator for rv 2 and BG 1 */
131 #define ACC100_K0_2_2 25 /* K0 fraction numerator for rv 2 and BG 2 */
132 #define ACC100_K0_3_1 56 /* K0 fraction numerator for rv 3 and BG 1 */
133 #define ACC100_K0_3_2 43 /* K0 fraction numerator for rv 3 and BG 2 */
135 /* ACC100 Configuration */
136 #define ACC100_DDR_ECC_ENABLE
137 #define ACC100_CFG_DMA_ERROR 0x3D7
138 #define ACC100_CFG_AXI_CACHE 0x11
139 #define ACC100_CFG_QMGR_HI_P 0x0F0F
140 #define ACC100_CFG_PCI_AXI 0xC003
141 #define ACC100_CFG_PCI_BRIDGE 0x40006033
142 #define ACC100_ENGINE_OFFSET 0x1000
143 #define ACC100_RESET_HI 0x20100
144 #define ACC100_RESET_LO 0x20000
145 #define ACC100_RESET_HARD 0x1FF
146 #define ACC100_ENGINES_MAX 9
147 #define ACC100_LONG_WAIT 1000
149 /* ACC100 DMA Descriptor triplet */
150 struct acc100_dma_triplet {
160 /* ACC100 DMA Response Descriptor */
161 union acc100_dma_rsp_desc {
164 uint32_t crc_status:1,
183 /* ACC100 Queue Manager Enqueue PCI Register */
184 union acc100_enqueue_reg_fmt {
194 /* FEC 4G Uplink Frame Control Word */
195 struct __rte_packed acc100_fcw_td {
197 num_maps:4; /* Unused */
198 uint8_t filler:6, /* Unused */
202 uint16_t k_neg; /* Unused */
203 uint8_t c_neg; /* Unused */
204 uint8_t c; /* Unused */
205 uint32_t ea; /* Unused */
206 uint32_t eb; /* Unused */
207 uint8_t cab; /* Unused */
208 uint8_t k0_start_col; /* Unused */
210 uint8_t code_block_mode:1, /* Unused */
213 bypass_teq:1, /* Unused */
214 soft_output_en:1, /* Unused */
215 ext_td_cold_reg_en:1;
216 union { /* External Cold register */
217 uint32_t ext_td_cold_reg;
219 uint32_t min_iter:4, /* Unused */
221 ext_scale:5, /* Unused */
223 early_stop_en:1, /* Unused */
224 sw_soft_out_dis:1, /* Unused */
225 sw_et_cont:1, /* Unused */
226 sw_soft_out_saturation:1, /* Unused */
227 half_iter_on:1, /* Unused */
228 raw_decoder_input_on:1, /* Unused */
234 /* FEC 5GNR Uplink Frame Control Word */
235 struct __rte_packed acc100_fcw_ld {
236 uint32_t FCWversion:4,
255 uint32_t hcin_offset:16,
257 uint32_t hcin_size1:16,
269 uint32_t hcout_size0:16,
274 uint32_t negstop_it:7,
279 /* FEC 4G Downlink Frame Control Word */
280 struct __rte_packed acc100_fcw_te {
297 uint8_t bypass_rv_idx0:1,
305 uint8_t code_block_mode:1,
310 /* FEC 5GNR Downlink Frame Control Word */
311 struct __rte_packed acc100_fcw_le {
312 uint32_t FCWversion:4,
335 /* ACC100 DMA Request Descriptor */
336 struct __rte_packed acc100_dma_req_desc {
345 uint32_t pass_param:8,
362 struct acc100_dma_triplet data_ptrs[ACC100_DMA_MAX_NUM_POINTERS];
364 /* Virtual addresses used to retrieve SW context info */
367 uint64_t pad1; /* pad to 64 bits */
370 * Stores additional information needed for driver processing:
371 * - last_desc_in_batch - flag used to mark last descriptor (CB)
373 * - cbs_in_tb - stores information about total number of Code Blocks
374 * in currently processed Transport Block
379 struct acc100_fcw_ld fcw_ld;
380 struct acc100_fcw_td fcw_td;
381 struct acc100_fcw_le fcw_le;
382 struct acc100_fcw_te fcw_te;
383 uint32_t pad2[ACC100_FCW_PADDING];
385 uint32_t last_desc_in_batch :8,
389 uint64_t pad3[ACC100_DMA_DESC_PADDING]; /* pad to 64 bits */
393 /* ACC100 DMA Descriptor */
394 union acc100_dma_desc {
395 struct acc100_dma_req_desc req;
396 union acc100_dma_rsp_desc rsp;
400 /* Union describing Info Ring entry */
401 union acc100_harq_layout_data {
410 /* Union describing Info Ring entry */
411 union acc100_info_ring_data {
415 uint16_t detailed_info;
420 uint16_t reserved: 2;
431 struct acc100_registry_addr {
432 unsigned int dma_ring_dl5g_hi;
433 unsigned int dma_ring_dl5g_lo;
434 unsigned int dma_ring_ul5g_hi;
435 unsigned int dma_ring_ul5g_lo;
436 unsigned int dma_ring_dl4g_hi;
437 unsigned int dma_ring_dl4g_lo;
438 unsigned int dma_ring_ul4g_hi;
439 unsigned int dma_ring_ul4g_lo;
440 unsigned int ring_size;
441 unsigned int info_ring_hi;
442 unsigned int info_ring_lo;
443 unsigned int info_ring_en;
444 unsigned int info_ring_ptr;
445 unsigned int tail_ptrs_dl5g_hi;
446 unsigned int tail_ptrs_dl5g_lo;
447 unsigned int tail_ptrs_ul5g_hi;
448 unsigned int tail_ptrs_ul5g_lo;
449 unsigned int tail_ptrs_dl4g_hi;
450 unsigned int tail_ptrs_dl4g_lo;
451 unsigned int tail_ptrs_ul4g_hi;
452 unsigned int tail_ptrs_ul4g_lo;
453 unsigned int depth_log0_offset;
454 unsigned int depth_log1_offset;
455 unsigned int qman_group_func;
456 unsigned int ddr_range;
459 /* Structure holding registry addresses for PF */
460 static const struct acc100_registry_addr pf_reg_addr = {
461 .dma_ring_dl5g_hi = HWPfDmaFec5GdlDescBaseHiRegVf,
462 .dma_ring_dl5g_lo = HWPfDmaFec5GdlDescBaseLoRegVf,
463 .dma_ring_ul5g_hi = HWPfDmaFec5GulDescBaseHiRegVf,
464 .dma_ring_ul5g_lo = HWPfDmaFec5GulDescBaseLoRegVf,
465 .dma_ring_dl4g_hi = HWPfDmaFec4GdlDescBaseHiRegVf,
466 .dma_ring_dl4g_lo = HWPfDmaFec4GdlDescBaseLoRegVf,
467 .dma_ring_ul4g_hi = HWPfDmaFec4GulDescBaseHiRegVf,
468 .dma_ring_ul4g_lo = HWPfDmaFec4GulDescBaseLoRegVf,
469 .ring_size = HWPfQmgrRingSizeVf,
470 .info_ring_hi = HWPfHiInfoRingBaseHiRegPf,
471 .info_ring_lo = HWPfHiInfoRingBaseLoRegPf,
472 .info_ring_en = HWPfHiInfoRingIntWrEnRegPf,
473 .info_ring_ptr = HWPfHiInfoRingPointerRegPf,
474 .tail_ptrs_dl5g_hi = HWPfDmaFec5GdlRespPtrHiRegVf,
475 .tail_ptrs_dl5g_lo = HWPfDmaFec5GdlRespPtrLoRegVf,
476 .tail_ptrs_ul5g_hi = HWPfDmaFec5GulRespPtrHiRegVf,
477 .tail_ptrs_ul5g_lo = HWPfDmaFec5GulRespPtrLoRegVf,
478 .tail_ptrs_dl4g_hi = HWPfDmaFec4GdlRespPtrHiRegVf,
479 .tail_ptrs_dl4g_lo = HWPfDmaFec4GdlRespPtrLoRegVf,
480 .tail_ptrs_ul4g_hi = HWPfDmaFec4GulRespPtrHiRegVf,
481 .tail_ptrs_ul4g_lo = HWPfDmaFec4GulRespPtrLoRegVf,
482 .depth_log0_offset = HWPfQmgrGrpDepthLog20Vf,
483 .depth_log1_offset = HWPfQmgrGrpDepthLog21Vf,
484 .qman_group_func = HWPfQmgrGrpFunction0,
485 .ddr_range = HWPfDmaVfDdrBaseRw,
488 /* Structure holding registry addresses for VF */
489 static const struct acc100_registry_addr vf_reg_addr = {
490 .dma_ring_dl5g_hi = HWVfDmaFec5GdlDescBaseHiRegVf,
491 .dma_ring_dl5g_lo = HWVfDmaFec5GdlDescBaseLoRegVf,
492 .dma_ring_ul5g_hi = HWVfDmaFec5GulDescBaseHiRegVf,
493 .dma_ring_ul5g_lo = HWVfDmaFec5GulDescBaseLoRegVf,
494 .dma_ring_dl4g_hi = HWVfDmaFec4GdlDescBaseHiRegVf,
495 .dma_ring_dl4g_lo = HWVfDmaFec4GdlDescBaseLoRegVf,
496 .dma_ring_ul4g_hi = HWVfDmaFec4GulDescBaseHiRegVf,
497 .dma_ring_ul4g_lo = HWVfDmaFec4GulDescBaseLoRegVf,
498 .ring_size = HWVfQmgrRingSizeVf,
499 .info_ring_hi = HWVfHiInfoRingBaseHiVf,
500 .info_ring_lo = HWVfHiInfoRingBaseLoVf,
501 .info_ring_en = HWVfHiInfoRingIntWrEnVf,
502 .info_ring_ptr = HWVfHiInfoRingPointerVf,
503 .tail_ptrs_dl5g_hi = HWVfDmaFec5GdlRespPtrHiRegVf,
504 .tail_ptrs_dl5g_lo = HWVfDmaFec5GdlRespPtrLoRegVf,
505 .tail_ptrs_ul5g_hi = HWVfDmaFec5GulRespPtrHiRegVf,
506 .tail_ptrs_ul5g_lo = HWVfDmaFec5GulRespPtrLoRegVf,
507 .tail_ptrs_dl4g_hi = HWVfDmaFec4GdlRespPtrHiRegVf,
508 .tail_ptrs_dl4g_lo = HWVfDmaFec4GdlRespPtrLoRegVf,
509 .tail_ptrs_ul4g_hi = HWVfDmaFec4GulRespPtrHiRegVf,
510 .tail_ptrs_ul4g_lo = HWVfDmaFec4GulRespPtrLoRegVf,
511 .depth_log0_offset = HWVfQmgrGrpDepthLog20Vf,
512 .depth_log1_offset = HWVfQmgrGrpDepthLog21Vf,
513 .qman_group_func = HWVfQmgrGrpFunction0Vf,
514 .ddr_range = HWVfDmaDdrBaseRangeRoVf,
517 /* Private data structure for each ACC100 device */
518 struct acc100_device {
519 void *mmio_base; /**< Base address of MMIO registers (BAR0) */
520 bool pf_device; /**< True if this is a PF ACC100 device */
521 bool configured; /**< True if this ACC100 device is configured */
524 #endif /* _RTE_ACC100_PMD_H_ */