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:
parent
e9381a822a
commit
31a7853d1e
@ -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) {
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user