baseband/turbo_sw: support large size code block

This is to support cases when the input data for
decoding a code block is larger than 64kB and would
not fit as a contiguous block of data into one
mbuf. In that case the length from the operation
supersedes the mbuf default structure.

Signed-off-by: Nicolas Chautru <nicolas.chautru@intel.com>
Acked-by: Dave Burley <dave.burley@accelercomm.com>
Acked-by: Akhil Goyal <akhil.goyal@nxp.com>
This commit is contained in:
Nicolas Chautru 2020-03-25 20:27:42 -07:00 committed by Akhil Goyal
parent e9381a822a
commit 31a7853d1e
4 changed files with 40 additions and 14 deletions

View File

@ -764,6 +764,7 @@ init_op_data_objs(struct rte_bbdev_op_data *bufs,
{
int ret;
unsigned int i, j;
bool large_input = false;
for (i = 0; i < n; ++i) {
char *data;
@ -774,24 +775,41 @@ init_op_data_objs(struct rte_bbdev_op_data *bufs,
op_type, n * ref_entries->nb_segments,
mbuf_pool->size);
TEST_ASSERT_SUCCESS(((seg->length + RTE_PKTMBUF_HEADROOM) >
(uint32_t)UINT16_MAX),
"Given data is bigger than allowed mbuf segment size");
if (seg->length > RTE_BBDEV_LDPC_E_MAX_MBUF) {
/*
* Special case when DPDK mbuf cannot handle
* the required input size
*/
printf("Warning: Larger input size than DPDK mbuf %d\n",
seg->length);
large_input = true;
}
bufs[i].data = m_head;
bufs[i].offset = 0;
bufs[i].length = 0;
if ((op_type == DATA_INPUT) || (op_type == DATA_HARQ_INPUT)) {
data = rte_pktmbuf_append(m_head, seg->length);
TEST_ASSERT_NOT_NULL(data,
if ((op_type == DATA_INPUT) && large_input) {
/* Allocate a fake overused mbuf */
data = rte_malloc(NULL, seg->length, 0);
memcpy(data, seg->addr, seg->length);
m_head->buf_addr = data;
m_head->buf_iova = rte_malloc_virt2iova(data);
m_head->data_off = 0;
m_head->data_len = seg->length;
} else {
data = rte_pktmbuf_append(m_head, seg->length);
TEST_ASSERT_NOT_NULL(data,
"Couldn't append %u bytes to mbuf from %d data type mbuf pool",
seg->length, op_type);
TEST_ASSERT(data == RTE_PTR_ALIGN(data, min_alignment),
TEST_ASSERT(data == RTE_PTR_ALIGN(
data, min_alignment),
"Data addr in mbuf (%p) is not aligned to device min alignment (%u)",
data, min_alignment);
rte_memcpy(data, seg->addr, seg->length);
rte_memcpy(data, seg->addr, seg->length);
}
bufs[i].length += seg->length;
for (j = 1; j < ref_entries->nb_segments; ++j) {

View File

@ -62,6 +62,10 @@ New Features
* Added support for matching on IPv4 Time To Live and IPv6 Hop Limit.
* **Updated the turbo_sw bbdev PMD.**
Supported large size code blocks which does not fit in one mbuf segment.
* **Added event mode to ipsec-secgw application.**
Updated ipsec-secgw application to add event based packet processing. The worker

View File

@ -1335,7 +1335,7 @@ process_dec_cb(struct turbo_sw_queue *q, struct rte_bbdev_dec_op *op,
static inline void
process_ldpc_dec_cb(struct turbo_sw_queue *q, struct rte_bbdev_dec_op *op,
uint8_t c, uint16_t out_length, uint16_t e,
uint8_t c, uint16_t out_length, uint32_t e,
struct rte_mbuf *m_in,
struct rte_mbuf *m_out_head, struct rte_mbuf *m_out,
struct rte_mbuf *m_harq_in,
@ -1617,8 +1617,8 @@ enqueue_ldpc_dec_one_op(struct turbo_sw_queue *q, struct rte_bbdev_dec_op *op,
struct rte_bbdev_stats *queue_stats)
{
uint8_t c, r = 0;
uint16_t e, out_length;
uint16_t crc24_overlap = 0;
uint32_t e;
uint16_t out_length, crc24_overlap = 0;
struct rte_bbdev_op_ldpc_dec *dec = &op->ldpc_dec;
struct rte_mbuf *m_in = dec->input.data;
struct rte_mbuf *m_harq_in = dec->harq_combined_input.data;
@ -1660,8 +1660,11 @@ enqueue_ldpc_dec_one_op(struct turbo_sw_queue *q, struct rte_bbdev_dec_op *op,
if (dec->code_block_mode == 0)
e = (r < dec->tb_params.cab) ?
dec->tb_params.ea : dec->tb_params.eb;
seg_total_left = rte_pktmbuf_data_len(m_in) - in_offset;
/* Special case handling when overusing mbuf */
if (e < RTE_BBDEV_LDPC_E_MAX_MBUF)
seg_total_left = rte_pktmbuf_data_len(m_in) - in_offset;
else
seg_total_left = e;
process_ldpc_dec_cb(q, op, c, out_length, e,
m_in, m_out_head, m_out,

View File

@ -35,7 +35,8 @@ extern "C" {
#define RTE_BBDEV_LDPC_MAX_CB_SIZE (8448)
/* Minimum size of Code Block */
#define RTE_BBDEV_LDPC_MIN_CB_SIZE (40)
/* Maximum E size we can manage with default mbuf */
#define RTE_BBDEV_LDPC_E_MAX_MBUF (64000)
/* Minimum size of Code Block (36.212, Table 5.1.3-3) */
#define RTE_BBDEV_TURBO_MIN_CB_SIZE (40)
/* Maximum size of circular buffer */