1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2020 Intel Corporation
7 #include <rte_common.h>
10 #include <rte_malloc.h>
11 #include <rte_mempool.h>
12 #include <rte_errno.h>
14 #include <rte_bus_pci.h>
15 #include <rte_byteorder.h>
16 #ifdef RTE_BBDEV_OFFLOAD_COST
17 #include <rte_cycles.h>
20 #include <rte_bbdev.h>
21 #include <rte_bbdev_pmd.h>
23 #include "fpga_5gnr_fec.h"
24 #include "rte_pmd_fpga_5gnr_fec.h"
26 /* 5GNR SW PMD logging ID */
27 static int fpga_5gnr_fec_logtype;
29 #ifdef RTE_LIBRTE_BBDEV_DEBUG
31 /* Read Ring Control Register of FPGA 5GNR FEC device */
33 print_ring_reg_debug_info(void *mmio_base, uint32_t offset)
36 "FPGA MMIO base address @ %p | Ring Control Register @ offset = 0x%08"
37 PRIx32, mmio_base, offset);
39 "RING_BASE_ADDR = 0x%016"PRIx64,
40 fpga_reg_read_64(mmio_base, offset));
42 "RING_HEAD_ADDR = 0x%016"PRIx64,
43 fpga_reg_read_64(mmio_base, offset +
44 FPGA_5GNR_FEC_RING_HEAD_ADDR));
46 "RING_SIZE = 0x%04"PRIx16,
47 fpga_reg_read_16(mmio_base, offset +
48 FPGA_5GNR_FEC_RING_SIZE));
50 "RING_MISC = 0x%02"PRIx8,
51 fpga_reg_read_8(mmio_base, offset +
52 FPGA_5GNR_FEC_RING_MISC));
54 "RING_ENABLE = 0x%02"PRIx8,
55 fpga_reg_read_8(mmio_base, offset +
56 FPGA_5GNR_FEC_RING_ENABLE));
58 "RING_FLUSH_QUEUE_EN = 0x%02"PRIx8,
59 fpga_reg_read_8(mmio_base, offset +
60 FPGA_5GNR_FEC_RING_FLUSH_QUEUE_EN));
62 "RING_SHADOW_TAIL = 0x%04"PRIx16,
63 fpga_reg_read_16(mmio_base, offset +
64 FPGA_5GNR_FEC_RING_SHADOW_TAIL));
66 "RING_HEAD_POINT = 0x%04"PRIx16,
67 fpga_reg_read_16(mmio_base, offset +
68 FPGA_5GNR_FEC_RING_HEAD_POINT));
71 /* Read Static Register of FPGA 5GNR FEC device */
73 print_static_reg_debug_info(void *mmio_base)
75 uint16_t config = fpga_reg_read_16(mmio_base,
76 FPGA_5GNR_FEC_CONFIGURATION);
77 uint8_t qmap_done = fpga_reg_read_8(mmio_base,
78 FPGA_5GNR_FEC_QUEUE_PF_VF_MAP_DONE);
79 uint16_t lb_factor = fpga_reg_read_16(mmio_base,
80 FPGA_5GNR_FEC_LOAD_BALANCE_FACTOR);
81 uint16_t ring_desc_len = fpga_reg_read_16(mmio_base,
82 FPGA_5GNR_FEC_RING_DESC_LEN);
83 uint16_t flr_time_out = fpga_reg_read_16(mmio_base,
84 FPGA_5GNR_FEC_FLR_TIME_OUT);
86 rte_bbdev_log_debug("UL.DL Weights = %u.%u",
87 ((uint8_t)config), ((uint8_t)(config >> 8)));
88 rte_bbdev_log_debug("UL.DL Load Balance = %u.%u",
89 ((uint8_t)lb_factor), ((uint8_t)(lb_factor >> 8)));
90 rte_bbdev_log_debug("Queue-PF/VF Mapping Table = %s",
91 (qmap_done > 0) ? "READY" : "NOT-READY");
92 rte_bbdev_log_debug("Ring Descriptor Size = %u bytes",
93 ring_desc_len*FPGA_RING_DESC_LEN_UNIT_BYTES);
94 rte_bbdev_log_debug("FLR Timeout = %f usec",
95 (float)flr_time_out*FPGA_FLR_TIMEOUT_UNIT);
98 /* Print decode DMA Descriptor of FPGA 5GNR Decoder device */
100 print_dma_dec_desc_debug_info(union fpga_dma_desc *desc)
102 rte_bbdev_log_debug("DMA response desc %p\n"
103 "\t-- done(%"PRIu32") | iter(%"PRIu32") | et_pass(%"PRIu32")"
104 " | crcb_pass (%"PRIu32") | error(%"PRIu32")\n"
105 "\t-- qm_idx(%"PRIu32") | max_iter(%"PRIu32") | "
106 "bg_idx (%"PRIu32") | harqin_en(%"PRIu32") | zc(%"PRIu32")\n"
107 "\t-- hbstroe_offset(%"PRIu32") | num_null (%"PRIu32") "
108 "| irq_en(%"PRIu32")\n"
109 "\t-- ncb(%"PRIu32") | desc_idx (%"PRIu32") | "
110 "drop_crc24b(%"PRIu32") | RV (%"PRIu32")\n"
111 "\t-- crc24b_ind(%"PRIu32") | et_dis (%"PRIu32")\n"
112 "\t-- harq_input_length(%"PRIu32") | rm_e(%"PRIu32")\n"
113 "\t-- cbs_in_op(%"PRIu32") | in_add (0x%08"PRIx32"%08"PRIx32")"
114 "| out_add (0x%08"PRIx32"%08"PRIx32")",
116 (uint32_t)desc->dec_req.done,
117 (uint32_t)desc->dec_req.iter,
118 (uint32_t)desc->dec_req.et_pass,
119 (uint32_t)desc->dec_req.crcb_pass,
120 (uint32_t)desc->dec_req.error,
121 (uint32_t)desc->dec_req.qm_idx,
122 (uint32_t)desc->dec_req.max_iter,
123 (uint32_t)desc->dec_req.bg_idx,
124 (uint32_t)desc->dec_req.harqin_en,
125 (uint32_t)desc->dec_req.zc,
126 (uint32_t)desc->dec_req.hbstroe_offset,
127 (uint32_t)desc->dec_req.num_null,
128 (uint32_t)desc->dec_req.irq_en,
129 (uint32_t)desc->dec_req.ncb,
130 (uint32_t)desc->dec_req.desc_idx,
131 (uint32_t)desc->dec_req.drop_crc24b,
132 (uint32_t)desc->dec_req.rv,
133 (uint32_t)desc->dec_req.crc24b_ind,
134 (uint32_t)desc->dec_req.et_dis,
135 (uint32_t)desc->dec_req.harq_input_length,
136 (uint32_t)desc->dec_req.rm_e,
137 (uint32_t)desc->dec_req.cbs_in_op,
138 (uint32_t)desc->dec_req.in_addr_hi,
139 (uint32_t)desc->dec_req.in_addr_lw,
140 (uint32_t)desc->dec_req.out_addr_hi,
141 (uint32_t)desc->dec_req.out_addr_lw);
142 uint32_t *word = (uint32_t *) desc;
143 rte_bbdev_log_debug("%08"PRIx32"\n%08"PRIx32"\n%08"PRIx32"\n%08"PRIx32"\n"
144 "%08"PRIx32"\n%08"PRIx32"\n%08"PRIx32"\n%08"PRIx32"\n",
145 word[0], word[1], word[2], word[3],
146 word[4], word[5], word[6], word[7]);
149 /* Print decode DMA Descriptor of FPGA 5GNR encoder device */
151 print_dma_enc_desc_debug_info(union fpga_dma_desc *desc)
153 rte_bbdev_log_debug("DMA response desc %p\n"
154 "%"PRIu32" %"PRIu32"\n"
155 "K' %"PRIu32" E %"PRIu32" desc %"PRIu32" Z %"PRIu32"\n"
156 "BG %"PRIu32" Qm %"PRIu32" CRC %"PRIu32" IRQ %"PRIu32"\n"
157 "k0 %"PRIu32" Ncb %"PRIu32" F %"PRIu32"\n",
159 (uint32_t)desc->enc_req.done,
160 (uint32_t)desc->enc_req.error,
162 (uint32_t)desc->enc_req.k_,
163 (uint32_t)desc->enc_req.rm_e,
164 (uint32_t)desc->enc_req.desc_idx,
165 (uint32_t)desc->enc_req.zc,
167 (uint32_t)desc->enc_req.bg_idx,
168 (uint32_t)desc->enc_req.qm_idx,
169 (uint32_t)desc->enc_req.crc_en,
170 (uint32_t)desc->enc_req.irq_en,
172 (uint32_t)desc->enc_req.k0,
173 (uint32_t)desc->enc_req.ncb,
174 (uint32_t)desc->enc_req.num_null);
175 uint32_t *word = (uint32_t *) desc;
176 rte_bbdev_log_debug("%08"PRIx32"\n%08"PRIx32"\n%08"PRIx32"\n%08"PRIx32"\n"
177 "%08"PRIx32"\n%08"PRIx32"\n%08"PRIx32"\n%08"PRIx32"\n",
178 word[0], word[1], word[2], word[3],
179 word[4], word[5], word[6], word[7]);
185 fpga_setup_queues(struct rte_bbdev *dev, uint16_t num_queues, int socket_id)
187 /* Number of queues bound to a PF/VF */
188 uint32_t hw_q_num = 0;
189 uint32_t ring_size, payload, address, q_id, offset;
190 rte_iova_t phys_addr;
191 struct fpga_ring_ctrl_reg ring_reg;
192 struct fpga_5gnr_fec_device *fpga_dev = dev->data->dev_private;
194 address = FPGA_5GNR_FEC_QUEUE_PF_VF_MAP_DONE;
195 if (!(fpga_reg_read_32(fpga_dev->mmio_base, address) & 0x1)) {
197 "Queue-PF/VF mapping is not set! Was PF configured for device (%s) ?",
202 /* Clear queue registers structure */
203 memset(&ring_reg, 0, sizeof(struct fpga_ring_ctrl_reg));
206 * If a queue is valid and mapped to a calling PF/VF the read value is
207 * replaced with a queue ID and if it's not then
208 * FPGA_INVALID_HW_QUEUE_ID is returned.
210 for (q_id = 0; q_id < FPGA_TOTAL_NUM_QUEUES; ++q_id) {
211 uint32_t hw_q_id = fpga_reg_read_32(fpga_dev->mmio_base,
212 FPGA_5GNR_FEC_QUEUE_MAP + (q_id << 2));
214 rte_bbdev_log_debug("%s: queue ID: %u, registry queue ID: %u",
215 dev->device->name, q_id, hw_q_id);
217 if (hw_q_id != FPGA_INVALID_HW_QUEUE_ID) {
218 fpga_dev->q_bound_bit_map |= (1ULL << q_id);
219 /* Clear queue register of found queue */
220 offset = FPGA_5GNR_FEC_RING_CTRL_REGS +
221 (sizeof(struct fpga_ring_ctrl_reg) * q_id);
222 fpga_ring_reg_write(fpga_dev->mmio_base,
229 "No HW queues assigned to this device. Probably this is a VF configured for PF mode. Check device configuration!");
233 if (num_queues > hw_q_num) {
235 "Not enough queues for device %s! Requested: %u, available: %u",
236 dev->device->name, num_queues, hw_q_num);
240 ring_size = FPGA_RING_MAX_SIZE * sizeof(struct fpga_dma_dec_desc);
242 /* Enforce 32 byte alignment */
243 RTE_BUILD_BUG_ON((RTE_CACHE_LINE_SIZE % 32) != 0);
245 /* Allocate memory for SW descriptor rings */
246 fpga_dev->sw_rings = rte_zmalloc_socket(dev->device->driver->name,
247 num_queues * ring_size, RTE_CACHE_LINE_SIZE,
249 if (fpga_dev->sw_rings == NULL) {
251 "Failed to allocate memory for %s:%u sw_rings",
252 dev->device->driver->name, dev->data->dev_id);
256 fpga_dev->sw_rings_phys = rte_malloc_virt2iova(fpga_dev->sw_rings);
257 fpga_dev->sw_ring_size = ring_size;
258 fpga_dev->sw_ring_max_depth = FPGA_RING_MAX_SIZE;
260 /* Allocate memory for ring flush status */
261 fpga_dev->flush_queue_status = rte_zmalloc_socket(NULL,
262 sizeof(uint64_t), RTE_CACHE_LINE_SIZE, socket_id);
263 if (fpga_dev->flush_queue_status == NULL) {
265 "Failed to allocate memory for %s:%u flush_queue_status",
266 dev->device->driver->name, dev->data->dev_id);
270 /* Set the flush status address registers */
271 phys_addr = rte_malloc_virt2iova(fpga_dev->flush_queue_status);
273 address = FPGA_5GNR_FEC_VFQ_FLUSH_STATUS_LW;
274 payload = (uint32_t)(phys_addr);
275 fpga_reg_write_32(fpga_dev->mmio_base, address, payload);
277 address = FPGA_5GNR_FEC_VFQ_FLUSH_STATUS_HI;
278 payload = (uint32_t)(phys_addr >> 32);
279 fpga_reg_write_32(fpga_dev->mmio_base, address, payload);
285 fpga_dev_close(struct rte_bbdev *dev)
287 struct fpga_5gnr_fec_device *fpga_dev = dev->data->dev_private;
289 rte_free(fpga_dev->sw_rings);
290 rte_free(fpga_dev->flush_queue_status);
296 fpga_dev_info_get(struct rte_bbdev *dev,
297 struct rte_bbdev_driver_info *dev_info)
299 struct fpga_5gnr_fec_device *d = dev->data->dev_private;
302 static const struct rte_bbdev_op_cap bbdev_capabilities[] = {
304 .type = RTE_BBDEV_OP_LDPC_ENC,
307 RTE_BBDEV_LDPC_RATE_MATCH |
308 RTE_BBDEV_LDPC_ENC_INTERRUPTS |
309 RTE_BBDEV_LDPC_CRC_24B_ATTACH,
311 RTE_BBDEV_LDPC_MAX_CODE_BLOCKS,
313 RTE_BBDEV_LDPC_MAX_CODE_BLOCKS,
317 .type = RTE_BBDEV_OP_LDPC_DEC,
320 RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK |
321 RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP |
322 RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE |
323 RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE |
324 RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE |
325 RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE |
326 RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE |
327 RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK |
328 RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_FILLERS,
332 RTE_BBDEV_LDPC_MAX_CODE_BLOCKS,
333 .num_buffers_hard_out =
334 RTE_BBDEV_LDPC_MAX_CODE_BLOCKS,
335 .num_buffers_soft_out = 0,
338 RTE_BBDEV_END_OF_CAPABILITIES_LIST()
341 /* Check the HARQ DDR size available */
342 uint8_t timeout_counter = 0;
343 uint32_t harq_buf_ready = fpga_reg_read_32(d->mmio_base,
344 FPGA_5GNR_FEC_HARQ_BUF_SIZE_RDY_REGS);
345 while (harq_buf_ready != 1) {
346 usleep(FPGA_TIMEOUT_CHECK_INTERVAL);
348 harq_buf_ready = fpga_reg_read_32(d->mmio_base,
349 FPGA_5GNR_FEC_HARQ_BUF_SIZE_RDY_REGS);
350 if (timeout_counter > FPGA_HARQ_RDY_TIMEOUT) {
351 rte_bbdev_log(ERR, "HARQ Buffer not ready %d",
356 uint32_t harq_buf_size = fpga_reg_read_32(d->mmio_base,
357 FPGA_5GNR_FEC_HARQ_BUF_SIZE_REGS);
359 static struct rte_bbdev_queue_conf default_queue_conf;
360 default_queue_conf.socket = dev->data->socket_id;
361 default_queue_conf.queue_size = FPGA_RING_MAX_SIZE;
363 dev_info->driver_name = dev->device->driver->name;
364 dev_info->queue_size_lim = FPGA_RING_MAX_SIZE;
365 dev_info->hardware_accelerated = true;
366 dev_info->min_alignment = 64;
367 dev_info->harq_buffer_size = (harq_buf_size >> 10) + 1;
368 dev_info->default_queue_conf = default_queue_conf;
369 dev_info->capabilities = bbdev_capabilities;
370 dev_info->cpu_flag_reqs = NULL;
372 /* Calculates number of queues assigned to device */
373 dev_info->max_num_queues = 0;
374 for (q_id = 0; q_id < FPGA_TOTAL_NUM_QUEUES; ++q_id) {
375 uint32_t hw_q_id = fpga_reg_read_32(d->mmio_base,
376 FPGA_5GNR_FEC_QUEUE_MAP + (q_id << 2));
377 if (hw_q_id != FPGA_INVALID_HW_QUEUE_ID)
378 dev_info->max_num_queues++;
383 * Find index of queue bound to current PF/VF which is unassigned. Return -1
384 * when there is no available queue
387 fpga_find_free_queue_idx(struct rte_bbdev *dev,
388 const struct rte_bbdev_queue_conf *conf)
390 struct fpga_5gnr_fec_device *d = dev->data->dev_private;
393 uint8_t range = FPGA_TOTAL_NUM_QUEUES >> 1;
395 if (conf->op_type == RTE_BBDEV_OP_LDPC_ENC) {
396 i = FPGA_NUM_DL_QUEUES;
397 range = FPGA_TOTAL_NUM_QUEUES;
400 for (; i < range; ++i) {
402 /* Check if index of queue is bound to current PF/VF */
403 if (d->q_bound_bit_map & q_idx)
404 /* Check if found queue was not already assigned */
405 if (!(d->q_assigned_bit_map & q_idx)) {
406 d->q_assigned_bit_map |= q_idx;
411 rte_bbdev_log(INFO, "Failed to find free queue on %s", dev->data->name);
417 fpga_queue_setup(struct rte_bbdev *dev, uint16_t queue_id,
418 const struct rte_bbdev_queue_conf *conf)
420 uint32_t address, ring_offset;
421 struct fpga_5gnr_fec_device *d = dev->data->dev_private;
422 struct fpga_queue *q;
425 /* Check if there is a free queue to assign */
426 q_idx = fpga_find_free_queue_idx(dev, conf);
430 /* Allocate the queue data structure. */
431 q = rte_zmalloc_socket(dev->device->driver->name, sizeof(*q),
432 RTE_CACHE_LINE_SIZE, conf->socket);
434 /* Mark queue as un-assigned */
435 d->q_assigned_bit_map &= (0xFFFFFFFF - (1ULL << q_idx));
436 rte_bbdev_log(ERR, "Failed to allocate queue memory");
443 /* Set ring_base_addr */
444 q->ring_addr = RTE_PTR_ADD(d->sw_rings, (d->sw_ring_size * queue_id));
445 q->ring_ctrl_reg.ring_base_addr = d->sw_rings_phys +
446 (d->sw_ring_size * queue_id);
448 /* Allocate memory for Completion Head variable*/
449 q->ring_head_addr = rte_zmalloc_socket(dev->device->driver->name,
450 sizeof(uint64_t), RTE_CACHE_LINE_SIZE, conf->socket);
451 if (q->ring_head_addr == NULL) {
452 /* Mark queue as un-assigned */
453 d->q_assigned_bit_map &= (0xFFFFFFFF - (1ULL << q_idx));
456 "Failed to allocate memory for %s:%u completion_head",
457 dev->device->driver->name, dev->data->dev_id);
460 /* Set ring_head_addr */
461 q->ring_ctrl_reg.ring_head_addr =
462 rte_malloc_virt2iova(q->ring_head_addr);
464 /* Clear shadow_completion_head */
465 q->shadow_completion_head = 0;
468 if (conf->queue_size > FPGA_RING_MAX_SIZE) {
469 /* Mark queue as un-assigned */
470 d->q_assigned_bit_map &= (0xFFFFFFFF - (1ULL << q_idx));
471 rte_free(q->ring_head_addr);
474 "Size of queue is too big %d (MAX: %d ) for %s:%u",
475 conf->queue_size, FPGA_RING_MAX_SIZE,
476 dev->device->driver->name, dev->data->dev_id);
479 q->ring_ctrl_reg.ring_size = conf->queue_size;
481 /* Set Miscellaneous FPGA register*/
482 /* Max iteration number for TTI mitigation - todo */
483 q->ring_ctrl_reg.max_ul_dec = 0;
484 /* Enable max iteration number for TTI - todo */
485 q->ring_ctrl_reg.max_ul_dec_en = 0;
487 /* Enable the ring */
488 q->ring_ctrl_reg.enable = 1;
490 /* Set FPGA head_point and tail registers */
491 q->ring_ctrl_reg.head_point = q->tail = 0;
493 /* Set FPGA shadow_tail register */
494 q->ring_ctrl_reg.shadow_tail = q->tail;
496 /* Calculates the ring offset for found queue */
497 ring_offset = FPGA_5GNR_FEC_RING_CTRL_REGS +
498 (sizeof(struct fpga_ring_ctrl_reg) * q_idx);
500 /* Set FPGA Ring Control Registers */
501 fpga_ring_reg_write(d->mmio_base, ring_offset, q->ring_ctrl_reg);
503 /* Store MMIO register of shadow_tail */
504 address = ring_offset + FPGA_5GNR_FEC_RING_SHADOW_TAIL;
505 q->shadow_tail_addr = RTE_PTR_ADD(d->mmio_base, address);
507 q->head_free_desc = q->tail;
510 q->sw_ring_wrap_mask = conf->queue_size - 1;
512 rte_bbdev_log_debug("Setup dev%u q%u: queue_idx=%u",
513 dev->data->dev_id, queue_id, q->q_idx);
515 dev->data->queues[queue_id].queue_private = q;
517 rte_bbdev_log_debug("BBDEV queue[%d] set up for FPGA queue[%d]",
520 #ifdef RTE_LIBRTE_BBDEV_DEBUG
521 /* Read FPGA Ring Control Registers after configuration*/
522 print_ring_reg_debug_info(d->mmio_base, ring_offset);
528 fpga_queue_release(struct rte_bbdev *dev, uint16_t queue_id)
530 struct fpga_5gnr_fec_device *d = dev->data->dev_private;
531 struct fpga_queue *q = dev->data->queues[queue_id].queue_private;
532 struct fpga_ring_ctrl_reg ring_reg;
535 rte_bbdev_log_debug("FPGA Queue[%d] released", queue_id);
538 memset(&ring_reg, 0, sizeof(struct fpga_ring_ctrl_reg));
539 offset = FPGA_5GNR_FEC_RING_CTRL_REGS +
540 (sizeof(struct fpga_ring_ctrl_reg) * q->q_idx);
542 fpga_reg_write_8(d->mmio_base,
543 offset + FPGA_5GNR_FEC_RING_ENABLE, 0x00);
544 /* Clear queue registers */
545 fpga_ring_reg_write(d->mmio_base, offset, ring_reg);
547 /* Mark the Queue as un-assigned */
548 d->q_assigned_bit_map &= (0xFFFFFFFF - (1ULL << q->q_idx));
549 rte_free(q->ring_head_addr);
551 dev->data->queues[queue_id].queue_private = NULL;
557 /* Function starts a device queue. */
559 fpga_queue_start(struct rte_bbdev *dev, uint16_t queue_id)
561 struct fpga_5gnr_fec_device *d = dev->data->dev_private;
562 #ifdef RTE_LIBRTE_BBDEV_DEBUG
564 rte_bbdev_log(ERR, "Invalid device pointer");
568 struct fpga_queue *q = dev->data->queues[queue_id].queue_private;
569 uint32_t offset = FPGA_5GNR_FEC_RING_CTRL_REGS +
570 (sizeof(struct fpga_ring_ctrl_reg) * q->q_idx);
571 uint8_t enable = 0x01;
572 uint16_t zero = 0x0000;
574 /* Clear queue head and tail variables */
575 q->tail = q->head_free_desc = 0;
577 /* Clear FPGA head_point and tail registers */
578 fpga_reg_write_16(d->mmio_base, offset + FPGA_5GNR_FEC_RING_HEAD_POINT,
580 fpga_reg_write_16(d->mmio_base, offset + FPGA_5GNR_FEC_RING_SHADOW_TAIL,
584 fpga_reg_write_8(d->mmio_base, offset + FPGA_5GNR_FEC_RING_ENABLE,
587 rte_bbdev_log_debug("FPGA Queue[%d] started", queue_id);
591 /* Function stops a device queue. */
593 fpga_queue_stop(struct rte_bbdev *dev, uint16_t queue_id)
595 struct fpga_5gnr_fec_device *d = dev->data->dev_private;
596 #ifdef RTE_LIBRTE_BBDEV_DEBUG
598 rte_bbdev_log(ERR, "Invalid device pointer");
602 struct fpga_queue *q = dev->data->queues[queue_id].queue_private;
603 uint32_t offset = FPGA_5GNR_FEC_RING_CTRL_REGS +
604 (sizeof(struct fpga_ring_ctrl_reg) * q->q_idx);
605 uint8_t payload = 0x01;
607 uint8_t timeout = FPGA_QUEUE_FLUSH_TIMEOUT_US /
608 FPGA_TIMEOUT_CHECK_INTERVAL;
610 /* Set flush_queue_en bit to trigger queue flushing */
611 fpga_reg_write_8(d->mmio_base,
612 offset + FPGA_5GNR_FEC_RING_FLUSH_QUEUE_EN, payload);
614 /** Check if queue flush is completed.
615 * FPGA will update the completion flag after queue flushing is
616 * completed. If completion flag is not updated within 1ms it is
617 * considered as a failure.
619 while (!(*((volatile uint8_t *)d->flush_queue_status + q->q_idx)
621 if (counter > timeout) {
622 rte_bbdev_log(ERR, "FPGA Queue Flush failed for queue %d",
626 usleep(FPGA_TIMEOUT_CHECK_INTERVAL);
632 fpga_reg_write_8(d->mmio_base, offset + FPGA_5GNR_FEC_RING_ENABLE,
635 rte_bbdev_log_debug("FPGA Queue[%d] stopped", queue_id);
639 static const struct rte_bbdev_ops fpga_ops = {
640 .setup_queues = fpga_setup_queues,
641 .close = fpga_dev_close,
642 .info_get = fpga_dev_info_get,
643 .queue_setup = fpga_queue_setup,
644 .queue_stop = fpga_queue_stop,
645 .queue_start = fpga_queue_start,
646 .queue_release = fpga_queue_release,
650 fpga_dma_enqueue(struct fpga_queue *q, uint16_t num_desc,
651 struct rte_bbdev_stats *queue_stats)
653 #ifdef RTE_BBDEV_OFFLOAD_COST
654 uint64_t start_time = 0;
655 queue_stats->acc_offload_cycles = 0;
657 RTE_SET_USED(queue_stats);
660 /* Update tail and shadow_tail register */
661 q->tail = (q->tail + num_desc) & q->sw_ring_wrap_mask;
665 #ifdef RTE_BBDEV_OFFLOAD_COST
666 /* Start time measurement for enqueue function offload. */
667 start_time = rte_rdtsc_precise();
669 mmio_write_16(q->shadow_tail_addr, q->tail);
671 #ifdef RTE_BBDEV_OFFLOAD_COST
673 queue_stats->acc_offload_cycles += rte_rdtsc_precise() - start_time;
677 /* Read flag value 0/1/ from bitmap */
679 check_bit(uint32_t bitmap, uint32_t bitmask)
681 return bitmap & bitmask;
684 /* Print an error if a descriptor error has occurred.
685 * Return 0 on success, 1 on failure
688 check_desc_error(uint32_t error_code) {
689 switch (error_code) {
690 case DESC_ERR_NO_ERR:
692 case DESC_ERR_K_P_OUT_OF_RANGE:
693 rte_bbdev_log(ERR, "Encode block size K' is out of range");
695 case DESC_ERR_Z_C_NOT_LEGAL:
696 rte_bbdev_log(ERR, "Zc is illegal");
698 case DESC_ERR_DESC_OFFSET_ERR:
700 "Queue offset does not meet the expectation in the FPGA"
703 case DESC_ERR_DESC_READ_FAIL:
704 rte_bbdev_log(ERR, "Unsuccessful completion for descriptor read");
706 case DESC_ERR_DESC_READ_TIMEOUT:
707 rte_bbdev_log(ERR, "Descriptor read time-out");
709 case DESC_ERR_DESC_READ_TLP_POISONED:
710 rte_bbdev_log(ERR, "Descriptor read TLP poisoned");
712 case DESC_ERR_CB_READ_FAIL:
713 rte_bbdev_log(ERR, "Unsuccessful completion for code block");
715 case DESC_ERR_CB_READ_TIMEOUT:
716 rte_bbdev_log(ERR, "Code block read time-out");
718 case DESC_ERR_CB_READ_TLP_POISONED:
719 rte_bbdev_log(ERR, "Code block read TLP poisoned");
721 case DESC_ERR_HBSTORE_ERR:
722 rte_bbdev_log(ERR, "Hbstroe exceeds HARQ buffer size.");
725 rte_bbdev_log(ERR, "Descriptor error unknown error code %u",
732 /* Compute value of k0.
733 * Based on 3GPP 38.212 Table 5.4.2.1-2
734 * Starting position of different redundancy versions, k0
736 static inline uint16_t
737 get_k0(uint16_t n_cb, uint16_t z_c, uint8_t bg, uint8_t rv_index)
741 uint16_t n = (bg == 1 ? N_ZC_1 : N_ZC_2) * z_c;
744 return (bg == 1 ? K0_1_1 : K0_1_2) * z_c;
745 else if (rv_index == 2)
746 return (bg == 1 ? K0_2_1 : K0_2_2) * z_c;
748 return (bg == 1 ? K0_3_1 : K0_3_2) * z_c;
750 /* LBRM case - includes a division by N */
752 return (((bg == 1 ? K0_1_1 : K0_1_2) * n_cb)
754 else if (rv_index == 2)
755 return (((bg == 1 ? K0_2_1 : K0_2_2) * n_cb)
758 return (((bg == 1 ? K0_3_1 : K0_3_2) * n_cb)
763 * Set DMA descriptor for encode operation (1 Code Block)
766 * Pointer to a single encode operation.
768 * Pointer to DMA descriptor.
770 * Pointer to pointer to input data which will be decoded.
772 * E value (length of output in bits).
774 * Ncb value (size of the soft buffer).
776 * Length of output buffer
778 * Input offset in rte_mbuf structure. It is used for calculating the point
779 * where data is starting.
781 * Output offset in rte_mbuf structure. It is used for calculating the point
782 * where hard output data will be stored.
784 * Number of CBs contained in one operation.
787 fpga_dma_desc_te_fill(struct rte_bbdev_enc_op *op,
788 struct fpga_dma_enc_desc *desc, struct rte_mbuf *input,
789 struct rte_mbuf *output, uint16_t k_, uint16_t e,
790 uint32_t in_offset, uint32_t out_offset, uint16_t desc_offset,
798 desc->desc_idx = desc_offset;
799 desc->zc = op->ldpc_enc.z_c;
800 desc->bg_idx = op->ldpc_enc.basegraph - 1;
801 desc->qm_idx = op->ldpc_enc.q_m / 2;
802 desc->crc_en = check_bit(op->ldpc_enc.op_flags,
803 RTE_BBDEV_LDPC_CRC_24B_ATTACH);
805 desc->k0 = get_k0(op->ldpc_enc.n_cb, op->ldpc_enc.z_c,
806 op->ldpc_enc.basegraph, op->ldpc_enc.rv_index);
807 desc->ncb = op->ldpc_enc.n_cb;
808 desc->num_null = op->ldpc_enc.n_filler;
809 /* Set inbound data buffer address */
810 desc->in_addr_hi = (uint32_t)(
811 rte_pktmbuf_mtophys_offset(input, in_offset) >> 32);
812 desc->in_addr_lw = (uint32_t)(
813 rte_pktmbuf_mtophys_offset(input, in_offset));
815 desc->out_addr_hi = (uint32_t)(
816 rte_pktmbuf_mtophys_offset(output, out_offset) >> 32);
817 desc->out_addr_lw = (uint32_t)(
818 rte_pktmbuf_mtophys_offset(output, out_offset));
819 /* Save software context needed for dequeue */
821 /* Set total number of CBs in an op */
822 desc->cbs_in_op = cbs_in_op;
827 * Set DMA descriptor for decode operation (1 Code Block)
830 * Pointer to a single encode operation.
832 * Pointer to DMA descriptor.
834 * Pointer to pointer to input data which will be decoded.
836 * Input offset in rte_mbuf structure. It is used for calculating the point
837 * where data is starting.
839 * Output offset in rte_mbuf structure. It is used for calculating the point
840 * where hard output data will be stored.
842 * Number of CBs contained in one operation.
845 fpga_dma_desc_ld_fill(struct rte_bbdev_dec_op *op,
846 struct fpga_dma_dec_desc *desc,
847 struct rte_mbuf *input, struct rte_mbuf *output,
848 uint16_t harq_in_length,
849 uint32_t in_offset, uint32_t out_offset,
850 uint32_t harq_offset,
851 uint16_t desc_offset,
857 /* Set inbound data buffer address */
858 desc->in_addr_hi = (uint32_t)(
859 rte_pktmbuf_mtophys_offset(input, in_offset) >> 32);
860 desc->in_addr_lw = (uint32_t)(
861 rte_pktmbuf_mtophys_offset(input, in_offset));
862 desc->rm_e = op->ldpc_dec.cb_params.e;
863 desc->harq_input_length = harq_in_length;
864 desc->et_dis = !check_bit(op->ldpc_dec.op_flags,
865 RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE);
866 desc->rv = op->ldpc_dec.rv_index;
867 desc->crc24b_ind = check_bit(op->ldpc_dec.op_flags,
868 RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK);
869 desc->drop_crc24b = check_bit(op->ldpc_dec.op_flags,
870 RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP);
871 desc->desc_idx = desc_offset;
872 desc->ncb = op->ldpc_dec.n_cb;
873 desc->num_null = op->ldpc_dec.n_filler;
874 desc->hbstroe_offset = harq_offset >> 10;
875 desc->zc = op->ldpc_dec.z_c;
876 desc->harqin_en = check_bit(op->ldpc_dec.op_flags,
877 RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE);
878 desc->bg_idx = op->ldpc_dec.basegraph - 1;
879 desc->max_iter = op->ldpc_dec.iter_max;
880 desc->qm_idx = op->ldpc_dec.q_m / 2;
881 desc->out_addr_hi = (uint32_t)(
882 rte_pktmbuf_mtophys_offset(output, out_offset) >> 32);
883 desc->out_addr_lw = (uint32_t)(
884 rte_pktmbuf_mtophys_offset(output, out_offset));
885 /* Save software context needed for dequeue */
887 /* Set total number of CBs in an op */
888 desc->cbs_in_op = cbs_in_op;
893 #ifdef RTE_LIBRTE_BBDEV_DEBUG
894 /* Validates LDPC encoder parameters */
896 validate_enc_op(struct rte_bbdev_enc_op *op __rte_unused)
898 struct rte_bbdev_op_ldpc_enc *ldpc_enc = &op->ldpc_enc;
899 struct rte_bbdev_op_enc_ldpc_cb_params *cb = NULL;
900 struct rte_bbdev_op_enc_ldpc_tb_params *tb = NULL;
903 if (ldpc_enc->input.length >
904 RTE_BBDEV_LDPC_MAX_CB_SIZE >> 3) {
905 rte_bbdev_log(ERR, "CB size (%u) is too big, max: %d",
906 ldpc_enc->input.length,
907 RTE_BBDEV_LDPC_MAX_CB_SIZE);
911 if (op->mempool == NULL) {
912 rte_bbdev_log(ERR, "Invalid mempool pointer");
915 if (ldpc_enc->input.data == NULL) {
916 rte_bbdev_log(ERR, "Invalid input pointer");
919 if (ldpc_enc->output.data == NULL) {
920 rte_bbdev_log(ERR, "Invalid output pointer");
923 if ((ldpc_enc->basegraph > 2) || (ldpc_enc->basegraph == 0)) {
925 "basegraph (%u) is out of range 1 <= value <= 2",
926 ldpc_enc->basegraph);
929 if (ldpc_enc->code_block_mode > 1) {
931 "code_block_mode (%u) is out of range 0:Tb 1:CB",
932 ldpc_enc->code_block_mode);
936 if (ldpc_enc->code_block_mode == 0) {
937 tb = &ldpc_enc->tb_params;
940 "c (%u) is out of range 1 <= value <= %u",
941 tb->c, RTE_BBDEV_LDPC_MAX_CODE_BLOCKS);
944 if (tb->cab > tb->c) {
946 "cab (%u) is greater than c (%u)",
950 if ((tb->ea < RTE_BBDEV_LDPC_MIN_CB_SIZE)
951 && tb->r < tb->cab) {
953 "ea (%u) is less than %u or it is not even",
954 tb->ea, RTE_BBDEV_LDPC_MIN_CB_SIZE);
957 if ((tb->eb < RTE_BBDEV_LDPC_MIN_CB_SIZE)
958 && tb->c > tb->cab) {
960 "eb (%u) is less than %u",
961 tb->eb, RTE_BBDEV_LDPC_MIN_CB_SIZE);
964 if (tb->r > (tb->c - 1)) {
966 "r (%u) is greater than c - 1 (%u)",
971 cb = &ldpc_enc->cb_params;
972 if (cb->e < RTE_BBDEV_LDPC_MIN_CB_SIZE) {
974 "e (%u) is less than %u or it is not even",
975 cb->e, RTE_BBDEV_LDPC_MIN_CB_SIZE);
984 mbuf_append(struct rte_mbuf *m_head, struct rte_mbuf *m, uint16_t len)
986 if (unlikely(len > rte_pktmbuf_tailroom(m)))
989 char *tail = (char *)m->buf_addr + m->data_off + m->data_len;
990 m->data_len = (uint16_t)(m->data_len + len);
991 m_head->pkt_len = (m_head->pkt_len + len);
995 #ifdef RTE_LIBRTE_BBDEV_DEBUG
996 /* Validates LDPC decoder parameters */
998 validate_dec_op(struct rte_bbdev_dec_op *op __rte_unused)
1000 struct rte_bbdev_op_ldpc_dec *ldpc_dec = &op->ldpc_dec;
1001 struct rte_bbdev_op_dec_ldpc_cb_params *cb = NULL;
1002 struct rte_bbdev_op_dec_ldpc_tb_params *tb = NULL;
1004 if (op->mempool == NULL) {
1005 rte_bbdev_log(ERR, "Invalid mempool pointer");
1008 if (ldpc_dec->rv_index > 3) {
1010 "rv_index (%u) is out of range 0 <= value <= 3",
1011 ldpc_dec->rv_index);
1015 if (ldpc_dec->iter_max == 0) {
1017 "iter_max (%u) is equal to 0",
1018 ldpc_dec->iter_max);
1022 if (ldpc_dec->code_block_mode > 1) {
1024 "code_block_mode (%u) is out of range 0 <= value <= 1",
1025 ldpc_dec->code_block_mode);
1029 if (ldpc_dec->code_block_mode == 0) {
1030 tb = &ldpc_dec->tb_params;
1033 "c (%u) is out of range 1 <= value <= %u",
1034 tb->c, RTE_BBDEV_LDPC_MAX_CODE_BLOCKS);
1037 if (tb->cab > tb->c) {
1039 "cab (%u) is greater than c (%u)",
1044 cb = &ldpc_dec->cb_params;
1045 if (cb->e < RTE_BBDEV_LDPC_MIN_CB_SIZE) {
1047 "e (%u) is out of range %u <= value <= %u",
1048 cb->e, RTE_BBDEV_LDPC_MIN_CB_SIZE,
1049 RTE_BBDEV_LDPC_MAX_CB_SIZE);
1059 fpga_harq_write_loopback(struct fpga_5gnr_fec_device *fpga_dev,
1060 struct rte_mbuf *harq_input, uint16_t harq_in_length,
1061 uint32_t harq_in_offset, uint32_t harq_out_offset)
1063 uint32_t out_offset = harq_out_offset;
1064 uint32_t in_offset = harq_in_offset;
1065 uint32_t left_length = harq_in_length;
1066 uint32_t reg_32, increment = 0;
1067 uint64_t *input = NULL;
1068 uint32_t last_transaction = left_length
1069 % FPGA_5GNR_FEC_DDR_WR_DATA_LEN_IN_BYTES;
1072 if (last_transaction > 0)
1073 left_length -= last_transaction;
1076 * Get HARQ buffer size for each VF/PF: When 0x00, there is no
1077 * available DDR space for the corresponding VF/PF.
1079 reg_32 = fpga_reg_read_32(fpga_dev->mmio_base,
1080 FPGA_5GNR_FEC_HARQ_BUF_SIZE_REGS);
1081 if (reg_32 < harq_in_length) {
1082 left_length = reg_32;
1083 rte_bbdev_log(ERR, "HARQ in length > HARQ buffer size\n");
1086 input = (uint64_t *)rte_pktmbuf_mtod_offset(harq_input,
1087 uint8_t *, in_offset);
1089 while (left_length > 0) {
1090 if (fpga_reg_read_8(fpga_dev->mmio_base,
1091 FPGA_5GNR_FEC_DDR4_ADDR_RDY_REGS) == 1) {
1092 fpga_reg_write_32(fpga_dev->mmio_base,
1093 FPGA_5GNR_FEC_DDR4_WR_ADDR_REGS,
1095 fpga_reg_write_64(fpga_dev->mmio_base,
1096 FPGA_5GNR_FEC_DDR4_WR_DATA_REGS,
1098 left_length -= FPGA_5GNR_FEC_DDR_WR_DATA_LEN_IN_BYTES;
1099 out_offset += FPGA_5GNR_FEC_DDR_WR_DATA_LEN_IN_BYTES;
1101 fpga_reg_write_8(fpga_dev->mmio_base,
1102 FPGA_5GNR_FEC_DDR4_WR_DONE_REGS, 1);
1105 while (last_transaction > 0) {
1106 if (fpga_reg_read_8(fpga_dev->mmio_base,
1107 FPGA_5GNR_FEC_DDR4_ADDR_RDY_REGS) == 1) {
1108 fpga_reg_write_32(fpga_dev->mmio_base,
1109 FPGA_5GNR_FEC_DDR4_WR_ADDR_REGS,
1111 last_word = input[increment];
1112 last_word &= (uint64_t)(1 << (last_transaction * 4))
1114 fpga_reg_write_64(fpga_dev->mmio_base,
1115 FPGA_5GNR_FEC_DDR4_WR_DATA_REGS,
1117 fpga_reg_write_8(fpga_dev->mmio_base,
1118 FPGA_5GNR_FEC_DDR4_WR_DONE_REGS, 1);
1119 last_transaction = 0;
1126 fpga_harq_read_loopback(struct fpga_5gnr_fec_device *fpga_dev,
1127 struct rte_mbuf *harq_output, uint16_t harq_in_length,
1128 uint32_t harq_in_offset, uint32_t harq_out_offset)
1130 uint32_t left_length, in_offset = harq_in_offset;
1132 uint32_t increment = 0;
1133 uint64_t *input = NULL;
1134 uint32_t last_transaction = harq_in_length
1135 % FPGA_5GNR_FEC_DDR_WR_DATA_LEN_IN_BYTES;
1137 if (last_transaction > 0)
1138 harq_in_length += (8 - last_transaction);
1140 reg = fpga_reg_read_32(fpga_dev->mmio_base,
1141 FPGA_5GNR_FEC_HARQ_BUF_SIZE_REGS);
1142 if (reg < harq_in_length) {
1143 harq_in_length = reg;
1144 rte_bbdev_log(ERR, "HARQ in length > HARQ buffer size\n");
1147 if (!mbuf_append(harq_output, harq_output, harq_in_length)) {
1148 rte_bbdev_log(ERR, "HARQ output buffer warning %d %d\n",
1149 harq_output->buf_len -
1150 rte_pktmbuf_headroom(harq_output),
1152 harq_in_length = harq_output->buf_len -
1153 rte_pktmbuf_headroom(harq_output);
1154 if (!mbuf_append(harq_output, harq_output, harq_in_length)) {
1155 rte_bbdev_log(ERR, "HARQ output buffer issue %d %d\n",
1156 harq_output->buf_len, harq_in_length);
1160 left_length = harq_in_length;
1162 input = (uint64_t *)rte_pktmbuf_mtod_offset(harq_output,
1163 uint8_t *, harq_out_offset);
1165 while (left_length > 0) {
1166 fpga_reg_write_32(fpga_dev->mmio_base,
1167 FPGA_5GNR_FEC_DDR4_RD_ADDR_REGS, in_offset);
1168 fpga_reg_write_8(fpga_dev->mmio_base,
1169 FPGA_5GNR_FEC_DDR4_RD_DONE_REGS, 1);
1170 reg = fpga_reg_read_8(fpga_dev->mmio_base,
1171 FPGA_5GNR_FEC_DDR4_RD_RDY_REGS);
1173 reg = fpga_reg_read_8(fpga_dev->mmio_base,
1174 FPGA_5GNR_FEC_DDR4_RD_RDY_REGS);
1175 if (reg == FPGA_DDR_OVERFLOW) {
1177 "Read address is overflow!\n");
1181 input[increment] = fpga_reg_read_64(fpga_dev->mmio_base,
1182 FPGA_5GNR_FEC_DDR4_RD_DATA_REGS);
1183 left_length -= FPGA_5GNR_FEC_DDR_RD_DATA_LEN_IN_BYTES;
1184 in_offset += FPGA_5GNR_FEC_DDR_WR_DATA_LEN_IN_BYTES;
1186 fpga_reg_write_8(fpga_dev->mmio_base,
1187 FPGA_5GNR_FEC_DDR4_RD_DONE_REGS, 0);
1193 enqueue_ldpc_enc_one_op_cb(struct fpga_queue *q, struct rte_bbdev_enc_op *op,
1194 uint16_t desc_offset)
1196 union fpga_dma_desc *desc;
1198 uint8_t c, crc24_bits = 0;
1199 struct rte_bbdev_op_ldpc_enc *enc = &op->ldpc_enc;
1200 uint16_t in_offset = enc->input.offset;
1201 uint16_t out_offset = enc->output.offset;
1202 struct rte_mbuf *m_in = enc->input.data;
1203 struct rte_mbuf *m_out = enc->output.data;
1204 struct rte_mbuf *m_out_head = enc->output.data;
1205 uint32_t in_length, out_length, e;
1206 uint16_t total_left = enc->input.length;
1207 uint16_t ring_offset;
1210 #ifdef RTE_LIBRTE_BBDEV_DEBUG
1211 /* Validate op structure */
1213 if (validate_enc_op(op) == -1) {
1214 rte_bbdev_log(ERR, "LDPC encoder validation failed");
1219 /* Clear op status */
1222 if (m_in == NULL || m_out == NULL) {
1223 rte_bbdev_log(ERR, "Invalid mbuf pointer");
1224 op->status = 1 << RTE_BBDEV_DATA_ERROR;
1228 if (enc->op_flags & RTE_BBDEV_LDPC_CRC_24B_ATTACH)
1231 if (enc->code_block_mode == 0) {
1232 /* For Transport Block mode */
1234 c = enc->tb_params.c;
1235 e = enc->tb_params.ea;
1236 } else { /* For Code Block mode */
1238 e = enc->cb_params.e;
1241 /* Update total_left */
1242 K = (enc->basegraph == 1 ? 22 : 10) * enc->z_c;
1243 k_ = K - enc->n_filler;
1244 in_length = (k_ - crc24_bits) >> 3;
1245 out_length = (e + 7) >> 3;
1247 total_left = rte_pktmbuf_data_len(m_in) - in_offset;
1249 /* Update offsets */
1250 if (total_left != in_length) {
1251 op->status |= 1 << RTE_BBDEV_DATA_ERROR;
1253 "Mismatch between mbuf length and included CBs sizes %d",
1257 mbuf_append(m_out_head, m_out, out_length);
1259 /* Offset into the ring */
1260 ring_offset = ((q->tail + desc_offset) & q->sw_ring_wrap_mask);
1261 /* Setup DMA Descriptor */
1262 desc = q->ring_addr + ring_offset;
1264 ret = fpga_dma_desc_te_fill(op, &desc->enc_req, m_in, m_out,
1265 k_, e, in_offset, out_offset, ring_offset, c);
1266 if (unlikely(ret < 0))
1269 /* Update lengths */
1270 total_left -= in_length;
1271 op->ldpc_enc.output.length += out_length;
1273 if (total_left > 0) {
1275 "Mismatch between mbuf length and included CB sizes: mbuf len %u, cb len %u",
1276 total_left, in_length);
1280 #ifdef RTE_LIBRTE_BBDEV_DEBUG
1281 print_dma_enc_desc_debug_info(desc);
1287 enqueue_ldpc_dec_one_op_cb(struct fpga_queue *q, struct rte_bbdev_dec_op *op,
1288 uint16_t desc_offset)
1290 union fpga_dma_desc *desc;
1292 uint16_t ring_offset;
1294 uint16_t e, in_length, out_length, k0, l, seg_total_left, sys_cols;
1295 uint16_t K, parity_offset, harq_in_length = 0, harq_out_length = 0;
1296 uint16_t crc24_overlap = 0;
1297 struct rte_bbdev_op_ldpc_dec *dec = &op->ldpc_dec;
1298 struct rte_mbuf *m_in = dec->input.data;
1299 struct rte_mbuf *m_out = dec->hard_output.data;
1300 struct rte_mbuf *m_out_head = dec->hard_output.data;
1301 uint16_t in_offset = dec->input.offset;
1302 uint16_t out_offset = dec->hard_output.offset;
1303 uint32_t harq_offset = 0;
1305 #ifdef RTE_LIBRTE_BBDEV_DEBUG
1306 /* Validate op structure */
1307 if (validate_dec_op(op) == -1) {
1308 rte_bbdev_log(ERR, "LDPC decoder validation failed");
1313 /* Clear op status */
1316 /* Setup DMA Descriptor */
1317 ring_offset = ((q->tail + desc_offset) & q->sw_ring_wrap_mask);
1318 desc = q->ring_addr + ring_offset;
1320 if (check_bit(dec->op_flags,
1321 RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)) {
1322 struct rte_mbuf *harq_in = dec->harq_combined_input.data;
1323 struct rte_mbuf *harq_out = dec->harq_combined_output.data;
1324 harq_in_length = dec->harq_combined_input.length;
1325 uint32_t harq_in_offset = dec->harq_combined_input.offset;
1326 uint32_t harq_out_offset = dec->harq_combined_output.offset;
1328 if (check_bit(dec->op_flags,
1329 RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE
1331 ret = fpga_harq_write_loopback(q->d, harq_in,
1332 harq_in_length, harq_in_offset,
1334 } else if (check_bit(dec->op_flags,
1335 RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE
1337 ret = fpga_harq_read_loopback(q->d, harq_out,
1338 harq_in_length, harq_in_offset,
1340 dec->harq_combined_output.length = harq_in_length;
1342 rte_bbdev_log(ERR, "OP flag Err!");
1345 /* Set descriptor for dequeue */
1346 desc->dec_req.done = 1;
1347 desc->dec_req.error = 0;
1348 desc->dec_req.op_addr = op;
1349 desc->dec_req.cbs_in_op = 1;
1350 /* Mark this dummy descriptor to be dropped by HW */
1351 desc->dec_req.desc_idx = (ring_offset + 1)
1352 & q->sw_ring_wrap_mask;
1353 return ret; /* Error or number of CB */
1356 if (m_in == NULL || m_out == NULL) {
1357 rte_bbdev_log(ERR, "Invalid mbuf pointer");
1358 op->status = 1 << RTE_BBDEV_DATA_ERROR;
1363 e = dec->cb_params.e;
1365 if (check_bit(dec->op_flags, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP))
1368 sys_cols = (dec->basegraph == 1) ? 22 : 10;
1369 K = sys_cols * dec->z_c;
1370 parity_offset = K - 2 * dec->z_c;
1372 out_length = ((K - crc24_overlap - dec->n_filler) >> 3);
1374 seg_total_left = dec->input.length;
1376 if (check_bit(dec->op_flags, RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE)) {
1377 harq_in_length = RTE_MIN(dec->harq_combined_input.length,
1378 (uint32_t)dec->n_cb);
1381 if (check_bit(dec->op_flags, RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE)) {
1382 k0 = get_k0(dec->n_cb, dec->z_c,
1383 dec->basegraph, dec->rv_index);
1384 if (k0 > parity_offset)
1387 l = k0 + e + dec->n_filler;
1388 harq_out_length = RTE_MIN(RTE_MAX(harq_in_length, l),
1389 dec->n_cb - dec->n_filler);
1390 dec->harq_combined_output.length = harq_out_length;
1393 mbuf_append(m_out_head, m_out, out_length);
1394 if (check_bit(dec->op_flags, RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE))
1395 harq_offset = dec->harq_combined_input.offset;
1396 else if (check_bit(dec->op_flags, RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE))
1397 harq_offset = dec->harq_combined_output.offset;
1399 if ((harq_offset & 0x3FF) > 0) {
1400 rte_bbdev_log(ERR, "Invalid HARQ offset %d", harq_offset);
1401 op->status = 1 << RTE_BBDEV_DATA_ERROR;
1405 ret = fpga_dma_desc_ld_fill(op, &desc->dec_req, m_in, m_out,
1406 harq_in_length, in_offset, out_offset, harq_offset,
1408 if (unlikely(ret < 0))
1410 /* Update lengths */
1411 seg_total_left -= in_length;
1412 op->ldpc_dec.hard_output.length += out_length;
1413 if (seg_total_left > 0) {
1415 "Mismatch between mbuf length and included CB sizes: mbuf len %u, cb len %u",
1416 seg_total_left, in_length);
1420 #ifdef RTE_LIBRTE_BBDEV_DEBUG
1421 print_dma_dec_desc_debug_info(desc);
1428 fpga_enqueue_ldpc_enc(struct rte_bbdev_queue_data *q_data,
1429 struct rte_bbdev_enc_op **ops, uint16_t num)
1431 uint16_t i, total_enqueued_cbs = 0;
1434 struct fpga_queue *q = q_data->queue_private;
1435 union fpga_dma_desc *desc;
1437 /* Check if queue is not full */
1438 if (unlikely(((q->tail + 1) & q->sw_ring_wrap_mask) ==
1442 /* Calculates available space */
1443 avail = (q->head_free_desc > q->tail) ?
1444 q->head_free_desc - q->tail - 1 :
1445 q->ring_ctrl_reg.ring_size + q->head_free_desc - q->tail - 1;
1447 for (i = 0; i < num; ++i) {
1449 /* Check if there is available space for further
1452 if (unlikely(avail - 1 < 0))
1455 enqueued_cbs = enqueue_ldpc_enc_one_op_cb(q, ops[i],
1456 total_enqueued_cbs);
1458 if (enqueued_cbs < 0)
1461 total_enqueued_cbs += enqueued_cbs;
1463 rte_bbdev_log_debug("enqueuing enc ops [%d/%d] | head %d | tail %d",
1464 total_enqueued_cbs, num,
1465 q->head_free_desc, q->tail);
1468 /* Set interrupt bit for last CB in enqueued ops. FPGA issues interrupt
1469 * only when all previous CBs were already processed.
1471 desc = q->ring_addr + ((q->tail + total_enqueued_cbs - 1)
1472 & q->sw_ring_wrap_mask);
1473 desc->enc_req.irq_en = q->irq_enable;
1475 fpga_dma_enqueue(q, total_enqueued_cbs, &q_data->queue_stats);
1478 q_data->queue_stats.enqueued_count += i;
1479 q_data->queue_stats.enqueue_err_count += num - i;
1485 fpga_enqueue_ldpc_dec(struct rte_bbdev_queue_data *q_data,
1486 struct rte_bbdev_dec_op **ops, uint16_t num)
1488 uint16_t i, total_enqueued_cbs = 0;
1491 struct fpga_queue *q = q_data->queue_private;
1492 union fpga_dma_desc *desc;
1494 /* Check if queue is not full */
1495 if (unlikely(((q->tail + 1) & q->sw_ring_wrap_mask) ==
1499 /* Calculates available space */
1500 avail = (q->head_free_desc > q->tail) ?
1501 q->head_free_desc - q->tail - 1 :
1502 q->ring_ctrl_reg.ring_size + q->head_free_desc - q->tail - 1;
1504 for (i = 0; i < num; ++i) {
1506 /* Check if there is available space for further
1509 if (unlikely(avail - 1 < 0))
1512 enqueued_cbs = enqueue_ldpc_dec_one_op_cb(q, ops[i],
1513 total_enqueued_cbs);
1515 if (enqueued_cbs < 0)
1518 total_enqueued_cbs += enqueued_cbs;
1520 rte_bbdev_log_debug("enqueuing dec ops [%d/%d] | head %d | tail %d",
1521 total_enqueued_cbs, num,
1522 q->head_free_desc, q->tail);
1526 q_data->queue_stats.enqueued_count += i;
1527 q_data->queue_stats.enqueue_err_count += num - i;
1529 /* Set interrupt bit for last CB in enqueued ops. FPGA issues interrupt
1530 * only when all previous CBs were already processed.
1532 desc = q->ring_addr + ((q->tail + total_enqueued_cbs - 1)
1533 & q->sw_ring_wrap_mask);
1534 desc->enc_req.irq_en = q->irq_enable;
1535 fpga_dma_enqueue(q, total_enqueued_cbs, &q_data->queue_stats);
1541 dequeue_ldpc_enc_one_op_cb(struct fpga_queue *q,
1542 struct rte_bbdev_enc_op **op,
1543 uint16_t desc_offset)
1545 union fpga_dma_desc *desc;
1547 /* Set current desc */
1548 desc = q->ring_addr + ((q->head_free_desc + desc_offset)
1549 & q->sw_ring_wrap_mask);
1552 if (desc->enc_req.done == 0)
1555 /* make sure the response is read atomically */
1558 rte_bbdev_log_debug("DMA response desc %p", desc);
1560 #ifdef RTE_LIBRTE_BBDEV_DEBUG
1561 print_dma_enc_desc_debug_info(desc);
1564 *op = desc->enc_req.op_addr;
1565 /* Check the descriptor error field, return 1 on error */
1566 desc_error = check_desc_error(desc->enc_req.error);
1567 (*op)->status = desc_error << RTE_BBDEV_DATA_ERROR;
1574 dequeue_ldpc_dec_one_op_cb(struct fpga_queue *q, struct rte_bbdev_dec_op **op,
1575 uint16_t desc_offset)
1577 union fpga_dma_desc *desc;
1579 /* Set descriptor */
1580 desc = q->ring_addr + ((q->head_free_desc + desc_offset)
1581 & q->sw_ring_wrap_mask);
1583 /* Verify done bit is set */
1584 if (desc->dec_req.done == 0)
1587 /* make sure the response is read atomically */
1590 #ifdef RTE_LIBRTE_BBDEV_DEBUG
1591 print_dma_dec_desc_debug_info(desc);
1594 *op = desc->dec_req.op_addr;
1596 if (check_bit((*op)->ldpc_dec.op_flags,
1597 RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)) {
1602 /* FPGA reports iterations based on round-up minus 1 */
1603 (*op)->ldpc_dec.iter_count = desc->dec_req.iter + 1;
1604 /* CRC Check criteria */
1605 if (desc->dec_req.crc24b_ind && !(desc->dec_req.crcb_pass))
1606 (*op)->status = 1 << RTE_BBDEV_CRC_ERROR;
1607 /* et_pass = 0 when decoder fails */
1608 (*op)->status |= !(desc->dec_req.et_pass) << RTE_BBDEV_SYNDROME_ERROR;
1609 /* Check the descriptor error field, return 1 on error */
1610 desc_error = check_desc_error(desc->dec_req.error);
1611 (*op)->status |= desc_error << RTE_BBDEV_DATA_ERROR;
1616 fpga_dequeue_ldpc_enc(struct rte_bbdev_queue_data *q_data,
1617 struct rte_bbdev_enc_op **ops, uint16_t num)
1619 struct fpga_queue *q = q_data->queue_private;
1620 uint32_t avail = (q->tail - q->head_free_desc) & q->sw_ring_wrap_mask;
1622 uint16_t dequeued_cbs = 0;
1625 for (i = 0; (i < num) && (dequeued_cbs < avail); ++i) {
1626 ret = dequeue_ldpc_enc_one_op_cb(q, &ops[i], dequeued_cbs);
1631 dequeued_cbs += ret;
1633 rte_bbdev_log_debug("dequeuing enc ops [%d/%d] | head %d | tail %d",
1634 dequeued_cbs, num, q->head_free_desc, q->tail);
1638 q->head_free_desc = (q->head_free_desc + dequeued_cbs) &
1639 q->sw_ring_wrap_mask;
1642 q_data->queue_stats.dequeued_count += i;
1648 fpga_dequeue_ldpc_dec(struct rte_bbdev_queue_data *q_data,
1649 struct rte_bbdev_dec_op **ops, uint16_t num)
1651 struct fpga_queue *q = q_data->queue_private;
1652 uint32_t avail = (q->tail - q->head_free_desc) & q->sw_ring_wrap_mask;
1654 uint16_t dequeued_cbs = 0;
1657 for (i = 0; (i < num) && (dequeued_cbs < avail); ++i) {
1658 ret = dequeue_ldpc_dec_one_op_cb(q, &ops[i], dequeued_cbs);
1663 dequeued_cbs += ret;
1665 rte_bbdev_log_debug("dequeuing dec ops [%d/%d] | head %d | tail %d",
1666 dequeued_cbs, num, q->head_free_desc, q->tail);
1670 q->head_free_desc = (q->head_free_desc + dequeued_cbs) &
1671 q->sw_ring_wrap_mask;
1674 q_data->queue_stats.dequeued_count += i;
1680 /* Initialization Function */
1682 fpga_5gnr_fec_init(struct rte_bbdev *dev, struct rte_pci_driver *drv)
1684 struct rte_pci_device *pci_dev = RTE_DEV_TO_PCI(dev->device);
1686 dev->dev_ops = &fpga_ops;
1687 dev->enqueue_ldpc_enc_ops = fpga_enqueue_ldpc_enc;
1688 dev->enqueue_ldpc_dec_ops = fpga_enqueue_ldpc_dec;
1689 dev->dequeue_ldpc_enc_ops = fpga_dequeue_ldpc_enc;
1690 dev->dequeue_ldpc_dec_ops = fpga_dequeue_ldpc_dec;
1692 ((struct fpga_5gnr_fec_device *) dev->data->dev_private)->pf_device =
1693 !strcmp(drv->driver.name,
1694 RTE_STR(FPGA_5GNR_FEC_PF_DRIVER_NAME));
1695 ((struct fpga_5gnr_fec_device *) dev->data->dev_private)->mmio_base =
1696 pci_dev->mem_resource[0].addr;
1698 rte_bbdev_log_debug(
1699 "Init device %s [%s] @ virtaddr %p phyaddr %#"PRIx64,
1700 dev->device->driver->name, dev->data->name,
1701 (void *)pci_dev->mem_resource[0].addr,
1702 pci_dev->mem_resource[0].phys_addr);
1706 fpga_5gnr_fec_probe(struct rte_pci_driver *pci_drv,
1707 struct rte_pci_device *pci_dev)
1709 struct rte_bbdev *bbdev = NULL;
1710 char dev_name[RTE_BBDEV_NAME_MAX_LEN];
1712 if (pci_dev == NULL) {
1713 rte_bbdev_log(ERR, "NULL PCI device");
1717 rte_pci_device_name(&pci_dev->addr, dev_name, sizeof(dev_name));
1719 /* Allocate memory to be used privately by drivers */
1720 bbdev = rte_bbdev_allocate(pci_dev->device.name);
1724 /* allocate device private memory */
1725 bbdev->data->dev_private = rte_zmalloc_socket(dev_name,
1726 sizeof(struct fpga_5gnr_fec_device),
1727 RTE_CACHE_LINE_SIZE,
1728 pci_dev->device.numa_node);
1730 if (bbdev->data->dev_private == NULL) {
1732 "Allocate of %zu bytes for device \"%s\" failed",
1733 sizeof(struct fpga_5gnr_fec_device), dev_name);
1734 rte_bbdev_release(bbdev);
1738 /* Fill HW specific part of device structure */
1739 bbdev->device = &pci_dev->device;
1740 bbdev->intr_handle = &pci_dev->intr_handle;
1741 bbdev->data->socket_id = pci_dev->device.numa_node;
1743 /* Invoke FEC FPGA device initialization function */
1744 fpga_5gnr_fec_init(bbdev, pci_drv);
1746 rte_bbdev_log_debug("bbdev id = %u [%s]",
1747 bbdev->data->dev_id, dev_name);
1749 struct fpga_5gnr_fec_device *d = bbdev->data->dev_private;
1750 uint32_t version_id = fpga_reg_read_32(d->mmio_base,
1751 FPGA_5GNR_FEC_VERSION_ID);
1752 rte_bbdev_log(INFO, "FEC FPGA RTL v%u.%u",
1753 ((uint16_t)(version_id >> 16)), ((uint16_t)version_id));
1755 #ifdef RTE_LIBRTE_BBDEV_DEBUG
1756 if (!strcmp(bbdev->device->driver->name,
1757 RTE_STR(FPGA_5GNR_FEC_PF_DRIVER_NAME)))
1758 print_static_reg_debug_info(d->mmio_base);
1764 fpga_5gnr_fec_remove(struct rte_pci_device *pci_dev)
1766 struct rte_bbdev *bbdev;
1770 if (pci_dev == NULL)
1774 bbdev = rte_bbdev_get_named_dev(pci_dev->device.name);
1775 if (bbdev == NULL) {
1777 "Couldn't find HW dev \"%s\" to uninitialise it",
1778 pci_dev->device.name);
1781 dev_id = bbdev->data->dev_id;
1783 /* free device private memory before close */
1784 rte_free(bbdev->data->dev_private);
1787 ret = rte_bbdev_close(dev_id);
1790 "Device %i failed to close during uninit: %i",
1793 /* release bbdev from library */
1794 ret = rte_bbdev_release(bbdev);
1796 rte_bbdev_log(ERR, "Device %i failed to uninit: %i", dev_id,
1799 rte_bbdev_log_debug("Destroyed bbdev = %u", dev_id);
1805 set_default_fpga_conf(struct fpga_5gnr_fec_conf *def_conf)
1807 /* clear default configuration before initialization */
1808 memset(def_conf, 0, sizeof(struct fpga_5gnr_fec_conf));
1809 /* Set pf mode to true */
1810 def_conf->pf_mode_en = true;
1812 /* Set ratio between UL and DL to 1:1 (unit of weight is 3 CBs) */
1813 def_conf->ul_bandwidth = 3;
1814 def_conf->dl_bandwidth = 3;
1816 /* Set Load Balance Factor to 64 */
1817 def_conf->dl_load_balance = 64;
1818 def_conf->ul_load_balance = 64;
1821 /* Initial configuration of FPGA 5GNR FEC device */
1823 fpga_5gnr_fec_configure(const char *dev_name,
1824 const struct fpga_5gnr_fec_conf *conf)
1826 uint32_t payload_32, address;
1827 uint16_t payload_16;
1829 uint16_t q_id, vf_id, total_q_id, total_ul_q_id, total_dl_q_id;
1830 struct rte_bbdev *bbdev = rte_bbdev_get_named_dev(dev_name);
1831 struct fpga_5gnr_fec_conf def_conf;
1833 if (bbdev == NULL) {
1835 "Invalid dev_name (%s), or device is not yet initialised",
1840 struct fpga_5gnr_fec_device *d = bbdev->data->dev_private;
1844 "FPGA Configuration was not provided. Default configuration will be loaded.");
1845 set_default_fpga_conf(&def_conf);
1850 * Configure UL:DL ratio.
1854 payload_16 = (conf->dl_bandwidth << 8) | conf->ul_bandwidth;
1855 address = FPGA_5GNR_FEC_CONFIGURATION;
1856 fpga_reg_write_16(d->mmio_base, address, payload_16);
1858 /* Clear all queues registers */
1859 payload_32 = FPGA_INVALID_HW_QUEUE_ID;
1860 for (q_id = 0; q_id < FPGA_TOTAL_NUM_QUEUES; ++q_id) {
1861 address = (q_id << 2) + FPGA_5GNR_FEC_QUEUE_MAP;
1862 fpga_reg_write_32(d->mmio_base, address, payload_32);
1866 * If PF mode is enabled allocate all queues for PF only.
1868 * For VF mode each VF can have different number of UL and DL queues.
1869 * Total number of queues to configure cannot exceed FPGA
1870 * capabilities - 64 queues - 32 queues for UL and 32 queues for DL.
1871 * Queues mapping is done according to configuration:
1877 * | conf->vf_dl_queues_number[0] - 1 | 0 |
1878 * | conf->vf_dl_queues_number[0] | 1 |
1880 * | conf->vf_dl_queues_number[1] - 1 | 1 |
1882 * | conf->vf_dl_queues_number[7] - 1 | 7 |
1888 * | conf->vf_ul_queues_number[0] - 1 | 0 |
1889 * | conf->vf_ul_queues_number[0] | 1 |
1891 * | conf->vf_ul_queues_number[1] - 1 | 1 |
1893 * | conf->vf_ul_queues_number[7] - 1 | 7 |
1895 * Example of configuration:
1896 * conf->vf_ul_queues_number[0] = 4; -> 4 UL queues for VF0
1897 * conf->vf_dl_queues_number[0] = 4; -> 4 DL queues for VF0
1898 * conf->vf_ul_queues_number[1] = 2; -> 2 UL queues for VF1
1899 * conf->vf_dl_queues_number[1] = 2; -> 2 DL queues for VF1
1919 if (conf->pf_mode_en) {
1921 for (q_id = 0; q_id < FPGA_TOTAL_NUM_QUEUES; ++q_id) {
1922 address = (q_id << 2) + FPGA_5GNR_FEC_QUEUE_MAP;
1923 fpga_reg_write_32(d->mmio_base, address, payload_32);
1926 /* Calculate total number of UL and DL queues to configure */
1927 total_ul_q_id = total_dl_q_id = 0;
1928 for (vf_id = 0; vf_id < FPGA_5GNR_FEC_NUM_VFS; ++vf_id) {
1929 total_ul_q_id += conf->vf_ul_queues_number[vf_id];
1930 total_dl_q_id += conf->vf_dl_queues_number[vf_id];
1932 total_q_id = total_dl_q_id + total_ul_q_id;
1934 * Check if total number of queues to configure does not exceed
1935 * FPGA capabilities (64 queues - 32 UL and 32 DL queues)
1937 if ((total_ul_q_id > FPGA_NUM_UL_QUEUES) ||
1938 (total_dl_q_id > FPGA_NUM_DL_QUEUES) ||
1939 (total_q_id > FPGA_TOTAL_NUM_QUEUES)) {
1941 "FPGA Configuration failed. Too many queues to configure: UL_Q %u, DL_Q %u, FPGA_Q %u",
1942 total_ul_q_id, total_dl_q_id,
1943 FPGA_TOTAL_NUM_QUEUES);
1947 for (vf_id = 0; vf_id < FPGA_5GNR_FEC_NUM_VFS; ++vf_id) {
1948 for (q_id = 0; q_id < conf->vf_ul_queues_number[vf_id];
1949 ++q_id, ++total_ul_q_id) {
1950 address = (total_ul_q_id << 2) +
1951 FPGA_5GNR_FEC_QUEUE_MAP;
1952 payload_32 = ((0x80 + vf_id) << 16) | 0x1;
1953 fpga_reg_write_32(d->mmio_base, address,
1958 for (vf_id = 0; vf_id < FPGA_5GNR_FEC_NUM_VFS; ++vf_id) {
1959 for (q_id = 0; q_id < conf->vf_dl_queues_number[vf_id];
1960 ++q_id, ++total_dl_q_id) {
1961 address = ((total_dl_q_id + FPGA_NUM_UL_QUEUES)
1962 << 2) + FPGA_5GNR_FEC_QUEUE_MAP;
1963 payload_32 = ((0x80 + vf_id) << 16) | 0x1;
1964 fpga_reg_write_32(d->mmio_base, address,
1970 /* Setting Load Balance Factor */
1971 payload_16 = (conf->dl_load_balance << 8) | (conf->ul_load_balance);
1972 address = FPGA_5GNR_FEC_LOAD_BALANCE_FACTOR;
1973 fpga_reg_write_16(d->mmio_base, address, payload_16);
1975 /* Setting length of ring descriptor entry */
1976 payload_16 = FPGA_RING_DESC_ENTRY_LENGTH;
1977 address = FPGA_5GNR_FEC_RING_DESC_LEN;
1978 fpga_reg_write_16(d->mmio_base, address, payload_16);
1980 /* Setting FLR timeout value */
1981 payload_16 = conf->flr_time_out;
1982 address = FPGA_5GNR_FEC_FLR_TIME_OUT;
1983 fpga_reg_write_16(d->mmio_base, address, payload_16);
1985 /* Queue PF/VF mapping table is ready */
1987 address = FPGA_5GNR_FEC_QUEUE_PF_VF_MAP_DONE;
1988 fpga_reg_write_8(d->mmio_base, address, payload_8);
1990 rte_bbdev_log_debug("PF FPGA 5GNR FEC configuration complete for %s",
1993 #ifdef RTE_LIBRTE_BBDEV_DEBUG
1994 print_static_reg_debug_info(d->mmio_base);
1999 /* FPGA 5GNR FEC PCI PF address map */
2000 static struct rte_pci_id pci_id_fpga_5gnr_fec_pf_map[] = {
2002 RTE_PCI_DEVICE(FPGA_5GNR_FEC_VENDOR_ID,
2003 FPGA_5GNR_FEC_PF_DEVICE_ID)
2008 static struct rte_pci_driver fpga_5gnr_fec_pci_pf_driver = {
2009 .probe = fpga_5gnr_fec_probe,
2010 .remove = fpga_5gnr_fec_remove,
2011 .id_table = pci_id_fpga_5gnr_fec_pf_map,
2012 .drv_flags = RTE_PCI_DRV_NEED_MAPPING
2015 /* FPGA 5GNR FEC PCI VF address map */
2016 static struct rte_pci_id pci_id_fpga_5gnr_fec_vf_map[] = {
2018 RTE_PCI_DEVICE(FPGA_5GNR_FEC_VENDOR_ID,
2019 FPGA_5GNR_FEC_VF_DEVICE_ID)
2024 static struct rte_pci_driver fpga_5gnr_fec_pci_vf_driver = {
2025 .probe = fpga_5gnr_fec_probe,
2026 .remove = fpga_5gnr_fec_remove,
2027 .id_table = pci_id_fpga_5gnr_fec_vf_map,
2028 .drv_flags = RTE_PCI_DRV_NEED_MAPPING
2032 RTE_PMD_REGISTER_PCI(FPGA_5GNR_FEC_PF_DRIVER_NAME, fpga_5gnr_fec_pci_pf_driver);
2033 RTE_PMD_REGISTER_PCI_TABLE(FPGA_5GNR_FEC_PF_DRIVER_NAME,
2034 pci_id_fpga_5gnr_fec_pf_map);
2035 RTE_PMD_REGISTER_PCI(FPGA_5GNR_FEC_VF_DRIVER_NAME, fpga_5gnr_fec_pci_vf_driver);
2036 RTE_PMD_REGISTER_PCI_TABLE(FPGA_5GNR_FEC_VF_DRIVER_NAME,
2037 pci_id_fpga_5gnr_fec_vf_map);
2039 RTE_INIT(fpga_5gnr_fec_init_log)
2041 fpga_5gnr_fec_logtype = rte_log_register("pmd.bb.fpga_5gnr_fec");
2042 if (fpga_5gnr_fec_logtype >= 0)
2043 #ifdef RTE_LIBRTE_BBDEV_DEBUG
2044 rte_log_set_level(fpga_5gnr_fec_logtype, RTE_LOG_DEBUG);
2046 rte_log_set_level(fpga_5gnr_fec_logtype, RTE_LOG_NOTICE);