[v8,8/8] app/bbdev: handle endianness of test data

Message ID 20211006113112.11163-9-nipun.gupta@nxp.com (mailing list archive)
State Superseded, archived
Delegated to: akhil goyal
Headers
Series baseband: add NXP LA12xx driver |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/iol-broadcom-Functional success Functional Testing PASS
ci/iol-aarch64-compile-testing success Testing PASS
ci/iol-broadcom-Performance success Performance Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-intel-Functional success Functional Testing PASS
ci/github-robot: build fail github build: failed
ci/Intel-compilation fail Compilation issues
ci/intel-Testing success Testing PASS
ci/iol-spell-check-testing success Testing PASS
ci/iol-x86_64-compile-testing success Testing PASS
ci/iol-x86_64-unit-testing success Testing PASS
ci/iol-mellanox-Performance success Performance Testing PASS

Commit Message

Nipun Gupta Oct. 6, 2021, 11:31 a.m. UTC
  From: Nipun Gupta <nipun.gupta@nxp.com>

With data input, output and harq also supported in big
endian format, this patch updates the testbbdev application
to handle the endianness conversion as directed by the
the driver being used.

If the driver supports big endian data processing, conversion
from little endian to big is handled by the testbbdev application.

Signed-off-by: Nipun Gupta <nipun.gupta@nxp.com>
---
 app/test-bbdev/test_bbdev_perf.c | 43 ++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)
  

Comments

Chautru, Nicolas Oct. 6, 2021, 8:24 p.m. UTC | #1
> -----Original Message-----
> From: nipun.gupta@nxp.com <nipun.gupta@nxp.com>
> Sent: Wednesday, October 6, 2021 4:31 AM
> To: dev@dpdk.org; gakhil@marvell.com; Chautru, Nicolas
> <nicolas.chautru@intel.com>
> Cc: david.marchand@redhat.com; hemant.agrawal@nxp.com; Nipun Gupta
> <nipun.gupta@nxp.com>
> Subject: [PATCH v8 8/8] app/bbdev: handle endianness of test data
> 
> From: Nipun Gupta <nipun.gupta@nxp.com>
> 
> With data input, output and harq also supported in big endian format, this
> patch updates the testbbdev application to handle the endianness
> conversion as directed by the the driver being used.
> 
> If the driver supports big endian data processing, conversion from little
> endian to big is handled by the testbbdev application.
> 
> Signed-off-by: Nipun Gupta <nipun.gupta@nxp.com>
> ---
>  app/test-bbdev/test_bbdev_perf.c | 43
> ++++++++++++++++++++++++++++++++
>  1 file changed, 43 insertions(+)
> 
> diff --git a/app/test-bbdev/test_bbdev_perf.c b/app/test-
> bbdev/test_bbdev_perf.c
> index 469597b8b3..597c443596 100644
> --- a/app/test-bbdev/test_bbdev_perf.c
> +++ b/app/test-bbdev/test_bbdev_perf.c
> @@ -227,6 +227,45 @@ clear_soft_out_cap(uint32_t *op_flags)
>  	*op_flags &= ~RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT;
>  }
> 
> +/* This API is to convert all the test vector op data entries
> + * to big endian format. It is used when the device supports
> + * the input in the big endian format.
> + */
> +static inline void
> +convert_op_data_to_be(void)
> +{
> +	struct op_data_entries *op;
> +	enum op_data_type type;
> +	uint8_t nb_segs, *rem_data, temp;
> +	uint32_t *data, len;
> +	int complete, rem, i, j;
> +
> +	for (type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) {
> +		nb_segs = test_vector.entries[DATA_INPUT].nb_segments;

Is there a typo here? Shouldn't it be instead:
nb_segs = test_vector.entries[type].nb_segments;

Also as part of that same commit, please put a comment in the doc that the bbdev-test is adjusting the byte endianness based on the PMD capability and confirming that all vectors input/ouput data are assuming LE by default.  ./doc/guides/tool/testbbdev.rst


> +		op = &test_vector.entries[type];
> +
> +		/* Invert byte endianness for all the segments */
> +		for (i = 0; i < nb_segs; ++i) {
> +			len = op->segments[i].length;
> +			data = op->segments[i].addr;
> +
> +			/* Swap complete u32 bytes */
> +			complete = len / 4;
> +			for (j = 0; j < complete; j++)
> +				data[j] = rte_bswap32(data[j]);
> +
> +			/* Swap any remaining bytes */
> +			rem = len % 4;
> +			rem_data = (uint8_t *)&data[j];
> +			for (j = 0; j < rem/2; j++) {
> +				temp = rem_data[j];
> +				rem_data[j] = rem_data[rem - j - 1];
> +				rem_data[rem - j - 1] = temp;
> +			}
> +		}
> +	}
> +}
> +
>  static int
>  check_dev_cap(const struct rte_bbdev_info *dev_info)  { @@ -234,6 +273,7
> @@ check_dev_cap(const struct rte_bbdev_info *dev_info)
>  	unsigned int nb_inputs, nb_soft_outputs, nb_hard_outputs,
>  		nb_harq_inputs, nb_harq_outputs;
>  	const struct rte_bbdev_op_cap *op_cap = dev_info-
> >drv.capabilities;
> +	uint8_t dev_be_input = dev_info->drv.support_be_data;
> 
>  	nb_inputs = test_vector.entries[DATA_INPUT].nb_segments;
>  	nb_soft_outputs =
> test_vector.entries[DATA_SOFT_OUTPUT].nb_segments;
> @@ -245,6 +285,9 @@ check_dev_cap(const struct rte_bbdev_info
> *dev_info)
>  		if (op_cap->type != test_vector.op_type)
>  			continue;
> 
> +		if (dev_be_input)
> +			convert_op_data_to_be();
> +
>  		if (op_cap->type == RTE_BBDEV_OP_TURBO_DEC) {
>  			const struct rte_bbdev_op_cap_turbo_dec *cap =
>  					&op_cap->cap.turbo_dec;
> --
> 2.17.1
  

Patch

diff --git a/app/test-bbdev/test_bbdev_perf.c b/app/test-bbdev/test_bbdev_perf.c
index 469597b8b3..597c443596 100644
--- a/app/test-bbdev/test_bbdev_perf.c
+++ b/app/test-bbdev/test_bbdev_perf.c
@@ -227,6 +227,45 @@  clear_soft_out_cap(uint32_t *op_flags)
 	*op_flags &= ~RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT;
 }
 
+/* This API is to convert all the test vector op data entries
+ * to big endian format. It is used when the device supports
+ * the input in the big endian format.
+ */
+static inline void
+convert_op_data_to_be(void)
+{
+	struct op_data_entries *op;
+	enum op_data_type type;
+	uint8_t nb_segs, *rem_data, temp;
+	uint32_t *data, len;
+	int complete, rem, i, j;
+
+	for (type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) {
+		nb_segs = test_vector.entries[DATA_INPUT].nb_segments;
+		op = &test_vector.entries[type];
+
+		/* Invert byte endianness for all the segments */
+		for (i = 0; i < nb_segs; ++i) {
+			len = op->segments[i].length;
+			data = op->segments[i].addr;
+
+			/* Swap complete u32 bytes */
+			complete = len / 4;
+			for (j = 0; j < complete; j++)
+				data[j] = rte_bswap32(data[j]);
+
+			/* Swap any remaining bytes */
+			rem = len % 4;
+			rem_data = (uint8_t *)&data[j];
+			for (j = 0; j < rem/2; j++) {
+				temp = rem_data[j];
+				rem_data[j] = rem_data[rem - j - 1];
+				rem_data[rem - j - 1] = temp;
+			}
+		}
+	}
+}
+
 static int
 check_dev_cap(const struct rte_bbdev_info *dev_info)
 {
@@ -234,6 +273,7 @@  check_dev_cap(const struct rte_bbdev_info *dev_info)
 	unsigned int nb_inputs, nb_soft_outputs, nb_hard_outputs,
 		nb_harq_inputs, nb_harq_outputs;
 	const struct rte_bbdev_op_cap *op_cap = dev_info->drv.capabilities;
+	uint8_t dev_be_input = dev_info->drv.support_be_data;
 
 	nb_inputs = test_vector.entries[DATA_INPUT].nb_segments;
 	nb_soft_outputs = test_vector.entries[DATA_SOFT_OUTPUT].nb_segments;
@@ -245,6 +285,9 @@  check_dev_cap(const struct rte_bbdev_info *dev_info)
 		if (op_cap->type != test_vector.op_type)
 			continue;
 
+		if (dev_be_input)
+			convert_op_data_to_be();
+
 		if (op_cap->type == RTE_BBDEV_OP_TURBO_DEC) {
 			const struct rte_bbdev_op_cap_turbo_dec *cap =
 					&op_cap->cap.turbo_dec;