Enforce additional check on Frame Control Word validity and add stronger
alignment for decompression mode.

Signed-off-by: Hernan Vargas <hernan.var...@intel.com>
---
 drivers/baseband/acc100/rte_acc100_pmd.c | 48 ++++++++++++++++++++++--
 1 file changed, 45 insertions(+), 3 deletions(-)

diff --git a/drivers/baseband/acc100/rte_acc100_pmd.c 
b/drivers/baseband/acc100/rte_acc100_pmd.c
index 42a5f8751e..0e91205c49 100644
--- a/drivers/baseband/acc100/rte_acc100_pmd.c
+++ b/drivers/baseband/acc100/rte_acc100_pmd.c
@@ -1456,6 +1456,14 @@ acc100_fcw_ld_fill(struct rte_bbdev_dec_op *op, struct 
acc100_fcw_ld *fcw,
                                                op->ldpc_dec.tb_params.ea :
                                                op->ldpc_dec.tb_params.eb;
 
+       if (unlikely(check_bit(op->ldpc_dec.op_flags,
+                       RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE) &&
+                       (op->ldpc_dec.harq_combined_input.length == 0))) {
+               rte_bbdev_log(WARNING, "Null HARQ input size provided");
+               /* Disable HARQ input in that case to carry forward */
+               op->ldpc_dec.op_flags ^= RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE;
+       }
+
        fcw->hcin_en = check_bit(op->ldpc_dec.op_flags,
                        RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE);
        fcw->hcout_en = check_bit(op->ldpc_dec.op_flags,
@@ -1511,6 +1519,20 @@ acc100_fcw_ld_fill(struct rte_bbdev_dec_op *op, struct 
acc100_fcw_ld *fcw,
                fcw->hcin_offset = 0;
                fcw->hcin_size1 = 0;
        }
+       /* Enforce additional check on FCW validity */
+       uint32_t max_hc_in = RTE_ALIGN_CEIL(fcw->ncb - fcw->nfiller, 64);
+       if ((fcw->hcin_size0 > max_hc_in) ||
+                       (fcw->hcin_size1 + fcw->hcin_offset > max_hc_in) ||
+                       ((fcw->hcin_size0 > fcw->hcin_offset) &&
+                       (fcw->hcin_size1 != 0))) {
+               rte_bbdev_log(ERR, " Invalid FCW : HCIn %d %d %d, Ncb %d F %d",
+                               fcw->hcin_size0, fcw->hcin_size1,
+                               fcw->hcin_offset,
+                               fcw->ncb, fcw->nfiller);
+               /* Disable HARQ input in that case to carry forward */
+               op->ldpc_dec.op_flags ^= RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE;
+               fcw->hcin_en = 0;
+       }
 
        fcw->itmax = op->ldpc_dec.iter_max;
        fcw->itstop = check_bit(op->ldpc_dec.op_flags,
@@ -1539,10 +1561,19 @@ acc100_fcw_ld_fill(struct rte_bbdev_dec_op *op, struct 
acc100_fcw_ld *fcw,
                k0_p = (fcw->k0 > parity_offset) ?
                                fcw->k0 - op->ldpc_dec.n_filler : fcw->k0;
                ncb_p = fcw->ncb - op->ldpc_dec.n_filler;
-               l = k0_p + fcw->rm_e;
+               l = RTE_MIN(k0_p + fcw->rm_e, INT16_MAX);
                harq_out_length = (uint16_t) fcw->hcin_size0;
-               harq_out_length = RTE_MIN(RTE_MAX(harq_out_length, l), ncb_p);
-               harq_out_length = (harq_out_length + 0x3F) & 0xFFC0;
+               harq_out_length = RTE_MAX(harq_out_length, l);
+               /* Stronger alignment when in compression mode */
+               if (fcw->hcout_comp_mode > 0)
+                       harq_out_length = RTE_ALIGN_CEIL(harq_out_length, 256);
+               /* Cannot exceed the pruned Ncb circular buffer */
+               harq_out_length = RTE_MIN(harq_out_length, ncb_p);
+               /* Alignment on next 64B */
+               harq_out_length = RTE_ALIGN_CEIL(harq_out_length, 64);
+               /* Stronger alignment when in compression mode enforced again */
+               if (fcw->hcout_comp_mode > 0)
+                       harq_out_length = RTE_ALIGN_FLOOR(harq_out_length, 256);
                if ((k0_p > fcw->hcin_size0 + ACC100_HARQ_OFFSET_THRESHOLD) &&
                                harq_prun) {
                        fcw->hcout_size0 = (uint16_t) fcw->hcin_size0;
@@ -1553,6 +1584,13 @@ acc100_fcw_ld_fill(struct rte_bbdev_dec_op *op, struct 
acc100_fcw_ld *fcw,
                        fcw->hcout_size1 = 0;
                        fcw->hcout_offset = 0;
                }
+               if (fcw->hcout_size0 == 0) {
+                       rte_bbdev_log(ERR, " Invalid FCW : HCout %d",
+                               fcw->hcout_size0);
+                       op->ldpc_dec.op_flags ^= 
RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE;
+                       fcw->hcout_en = 0;
+               }
+
                harq_layout[harq_index].offset = fcw->hcout_offset;
                harq_layout[harq_index].size0 = fcw->hcout_size0;
        } else {
@@ -1594,6 +1632,10 @@ acc101_fcw_ld_fill(struct rte_bbdev_dec_op *op, struct 
acc100_fcw_ld *fcw,
                /* Disable HARQ input in that case to carry forward */
                op->ldpc_dec.op_flags ^= RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE;
        }
+       if (unlikely(fcw->rm_e == 0)) {
+               rte_bbdev_log(WARNING, "Null E input provided");
+               fcw->rm_e = 2;
+       }
 
        fcw->hcin_en = check_bit(op->ldpc_dec.op_flags,
                        RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE);
-- 
2.37.1

Reply via email to