[dpdk-dev] [PATCH] BBDEV: add LDPC op parameters and flags to support CBGT

Aidan Goddard aidan.goddard at accelercomm.com
Thu Nov 5 14:57:17 CET 2020


This commit adds support to BBDEV for LDPC Code Block Group Transmission
(CBGT) as defined in 3GPP TS 38.214. The following changes facilitate this:
- add RTE_BBDEV_LDPC_[ENC/DEC]_CBGT feature flag
- add CBGT input parameters to LDPC encode transport block op structure
- add CBGT input and output parameters to LDPC decode transport block op structure
- add support for reading these parameters from test vector files
- add sanity tests for RTE_BBDEV_LDPC_[ENC/DEC]_CBGT flag in test vector read
- update user guide with the flags and parameters

CBGT parameters are only required when the RTE_BBDEV_LDPC_[ENC/DEC]_CBGT
op flag is specified.

Reported-by: Rob Maunder <rob.maunder at accelercomm.com>
Signed-off-by: Aidan Goddard <aidan.goddard at accelercomm.com>
Acked-by: Dave Burley <dave.burley at accelercomm.com>
---
 app/test-bbdev/test_bbdev_vector.c | 46 +++++++++++++++++++---
 app/test-bbdev/test_bbdev_vector.h |  3 ++
 doc/guides/prog_guide/bbdev.rst    | 29 ++++++++++++++
 lib/librte_bbdev/rte_bbdev_op.h    | 80 +++++++++++++++++++++++++++++++++++++-
 4 files changed, 151 insertions(+), 7 deletions(-)

diff --git a/app/test-bbdev/test_bbdev_vector.c b/app/test-bbdev/test_bbdev_vector.c
index 50d1da0..e5808b2 100644
--- a/app/test-bbdev/test_bbdev_vector.c
+++ b/app/test-bbdev/test_bbdev_vector.c
@@ -200,6 +200,8 @@
 	else if (!strcmp(token,
 			"RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK"))
 		*op_flag_value = RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK;
+	else if (!strcmp(token, "RTE_BBDEV_LDPC_DEC_CBGT"))
+		*op_flag_value = RTE_BBDEV_LDPC_DEC_CBGT;
 	else {
 		printf("The given value is not a LDPC decoder flag\n");
 		return -1;
@@ -248,8 +250,10 @@
 		*op_flag_value = RTE_BBDEV_LDPC_ENC_INTERRUPTS;
 	else if (!strcmp(token, "RTE_BBDEV_LDPC_ENC_SCATTER_GATHER"))
 		*op_flag_value = RTE_BBDEV_LDPC_ENC_SCATTER_GATHER;
+	else if (!strcmp(token, "RTE_BBDEV_LDPC_ENC_CBGT"))
+		*op_flag_value = RTE_BBDEV_LDPC_ENC_CBGT;
 	else {
-		printf("The given value is not a turbo encoder flag\n");
+		printf("The given value is not a LDPC encoder flag\n");
 		return -1;
 	}
 
@@ -718,6 +722,14 @@
 		vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE;
 		ldpc_enc->code_block_mode = (uint8_t) strtoul(token, &err, 0);
 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
+	} else if (!strcmp(key_token, "max_cbg")) {
+		vector->mask |= TEST_BBDEV_VF_MAX_CBG_PER_TB;
+		ldpc_enc->tb_params.max_cbg = (uint8_t) strtoul(token, &err, 0);
+		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
+	} else if (!strcmp(key_token, "cbgti")) {
+		vector->mask |= TEST_BBDEV_VF_CBGTI;
+		ldpc_enc->tb_params.cbgti = (uint8_t) strtoul(token, &err, 0);
+		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
 	} else if (!strcmp(key_token, "op_flags")) {
 		vector->mask |= TEST_BBDEV_VF_OP_FLAGS;
 		ret = parse_turbo_flags(token, &op_flags, vector->op_type);
@@ -828,6 +840,18 @@
 		vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE;
 		ldpc_dec->code_block_mode = (uint8_t) strtoul(token, &err, 0);
 		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
+	} else if (!strcmp(key_token, "max_cbg")) {
+		vector->mask |= TEST_BBDEV_VF_MAX_CBG_PER_TB;
+		ldpc_dec->tb_params.max_cbg = (uint8_t) strtoul(token, &err, 0);
+		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
+	} else if (!strcmp(key_token, "cbgti")) {
+		vector->mask |= TEST_BBDEV_VF_CBGTI;
+		ldpc_dec->tb_params.cbgti = (uint8_t) strtoul(token, &err, 0);
+		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
+	} else if (!strcmp(key_token, "cbgfi")) {
+		vector->mask |= TEST_BBDEV_VF_CBGFI;
+		ldpc_dec->tb_params.cbgfi = (uint8_t) strtoul(token, &err, 0);
+		ret = ((err == NULL) || (*err != '\0')) ? -1 : 0;
 	} else if (!strcmp(key_token, "op_flags")) {
 		vector->mask |= TEST_BBDEV_VF_OP_FLAGS;
 		ret = parse_turbo_flags(token, &op_flags, vector->op_type);
@@ -1162,6 +1186,12 @@
 		if (!(mask & TEST_BBDEV_VF_R))
 			printf(
 				"WARNING: r was not specified in vector file and will be set to 0\n");
+		if (!(mask & TEST_BBDEV_VF_MAX_CBG_PER_TB) && (ldpc_dec->op_flags &
+				RTE_BBDEV_LDPC_DEC_CBGT)) {
+			printf(
+				"WARNING: max_cbg was not specified in vector file and will be set to 1\n");
+			ldpc_dec->tb_params.max_cbg = 1;
+		}
 	} else {
 		if (!(mask & TEST_BBDEV_VF_E))
 			printf(
@@ -1298,12 +1328,18 @@
 	if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) {
 		printf(
 			"WARNING: code_block_mode was not specified in vector file and will be set to 1\n");
-		vector->turbo_enc.code_block_mode = 1;
+		vector->ldpc_enc.code_block_mode = 1;
 	}
-	if (vector->turbo_enc.code_block_mode == 0) {
+	if (vector->ldpc_enc.code_block_mode == 0) {
+		if (!(mask & TEST_BBDEV_VF_MAX_CBG_PER_TB) && (vector->ldpc_enc.op_flags &
+				RTE_BBDEV_LDPC_ENC_CBGT)) {
+			printf(
+				"WARNING: max_cbg was not specified in vector file and will be set to 1\n");
+			vector->ldpc_enc.tb_params.max_cbg = 1;
+		}
 	} else {
-		if (!(mask & TEST_BBDEV_VF_E) && (vector->turbo_enc.op_flags &
-				RTE_BBDEV_TURBO_RATE_MATCH))
+		if (!(mask & TEST_BBDEV_VF_E) && (vector->ldpc_enc.op_flags &
+				RTE_BBDEV_LDPC_RATE_MATCH))
 			printf(
 				"WARNING: e was not specified in vector file and will be set to 0\n");
 		if (!(mask & TEST_BBDEV_VF_NCB))
diff --git a/app/test-bbdev/test_bbdev_vector.h b/app/test-bbdev/test_bbdev_vector.h
index 4e5dbf5..69f5b9c 100644
--- a/app/test-bbdev/test_bbdev_vector.h
+++ b/app/test-bbdev/test_bbdev_vector.h
@@ -35,6 +35,9 @@ enum {
 	TEST_BBDEV_VF_CODE_BLOCK_MODE = (1ULL << 23),
 	TEST_BBDEV_VF_OP_FLAGS = (1ULL << 24),
 	TEST_BBDEV_VF_EXPECTED_STATUS = (1ULL << 25),
+	TEST_BBDEV_VF_MAX_CBG_PER_TB = (1ULL << 26),
+	TEST_BBDEV_VF_CBGTI = (1ULL << 27),
+	TEST_BBDEV_VF_CBGFI = (1ULL << 28),
 };
 
 enum op_data_type {
diff --git a/doc/guides/prog_guide/bbdev.rst b/doc/guides/prog_guide/bbdev.rst
index 6b2bd54..6f448da 100644
--- a/doc/guides/prog_guide/bbdev.rst
+++ b/doc/guides/prog_guide/bbdev.rst
@@ -747,6 +747,9 @@ given below.
 |RTE_BBDEV_LDPC_ENC_CONCATENATION                                    |
 | Set if a device supports concatenation of non byte aligned output  |
 +--------------------------------------------------------------------+
+|RTE_BBDEV_LDPC_ENC_CBGT                                             |
+| Set if a device supports CB group transmission                     |
++--------------------------------------------------------------------+
 
 The structure passed for each LDPC encode operation is given below,
 with the operation flags forming a bitmask in the ``op_flags`` field.
@@ -815,6 +818,10 @@ The LDPC encode parameters are set out in the table below.
 +----------------+------------+-------------------------------------------------------+
 |                |eb          |Eb, length of the RM output sequence in bits, r >= cab |
 +----------------+------------+-------------------------------------------------------+
+|                |max_cbg     |maximum number of CB groups per TB: 1-8                |
++----------------+------------+-------------------------------------------------------+
+|                |cbgti       |CB group transmission information bitfield             |
++----------------+------------+-------------------------------------------------------+
 
 The mbuf input ``input`` is mandatory for all BBDEV PMDs and is the
 incoming code block or transport block data.
@@ -869,6 +876,11 @@ Figure :numref:`figure_turbo_tb_encode` above
 showing the Turbo encoding of CBs using BBDEV interface in TB-mode
 is also valid for LDPC encode.
 
+In TB-mode, If the ``RTE_BBDEV_LDPC_ENC_CBGT`` flag is specified the
+``max_cbg`` and ``cbgti`` parameters are used for CB group transmission. If
+the ``RTE_BBDEV_LDPC_ENC_CBGT`` flag is not specified, these parameters
+are ignored.
+
 BBDEV LDPC Decode Operation
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
@@ -942,6 +954,9 @@ given below.
 |RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK                        |
 | Set if a device supports loopback access to HARQ internal memory   |
 +--------------------------------------------------------------------+
+|RTE_BBDEV_LDPC_DEC_CBGT                                             |
+| Set if a device supports CB group transmission                     |
++--------------------------------------------------------------------+
 
 The structure passed for each LDPC decode operation is given below,
 with the operation flags forming a bitmask in the ``op_flags`` field.
@@ -1027,6 +1042,14 @@ The LDPC decode parameters are set out in the table below.
 +----------------+------------+-------------------------------------------------------+
 |                |eb          |Eb, length of the RM output sequence in bits  r >= cab |
 +----------------+------------+-------------------------------------------------------+
+|                |max_cbg     |maximum number of CB groups per TB: 1-8                |
++----------------+------------+-------------------------------------------------------+
+|                |cbgti       |CB group transmission information bitfield             |
++----------------+------------+-------------------------------------------------------+
+|                |cbgfi       |CB group Flushing out Information (CBGFI)              |
++----------------+------------+-------------------------------------------------------+
+|                |cbg_crc_err |CB group CRC failure bitfield (output)                 |
++----------------+------------+-------------------------------------------------------+
 
 The mbuf input ``input`` encoded CB data is mandatory for all BBDEV PMDs
 and is the Virtual Circular Buffer data stream with null padding.
@@ -1084,6 +1107,12 @@ Figure :numref:`figure_turbo_tb_decode` above
 showing the Turbo decoding of CBs using BBDEV interface in TB-mode
 is also valid for LDPC decode.
 
+In TB-mode, If the ``RTE_BBDEV_LDPC_DEC_CBGT`` flag is specified the
+``max_cbg`` and ``cbgti`` parameters are used for CB group transmission. The
+``cbg_crc_err`` output parameter is a bitfield used to indicate crc failures
+in the respective CB groups. If the ``RTE_BBDEV_LDPC_DEC_CBGT`` flag is not
+specified, these parameters are ignored.
+
 
 Sample code
 -----------
diff --git a/lib/librte_bbdev/rte_bbdev_op.h b/lib/librte_bbdev/rte_bbdev_op.h
index f726d73..1fd44f2 100644
--- a/lib/librte_bbdev/rte_bbdev_op.h
+++ b/lib/librte_bbdev/rte_bbdev_op.h
@@ -186,7 +186,9 @@ enum rte_bbdev_op_ldpcdec_flag_bitmasks {
 	 *  for HARQ memory. If not set, it is assumed the filler bits are not
 	 *  in HARQ memory and handled directly by the LDPC decoder.
 	 */
-	RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_FILLERS = (1ULL << 18)
+	RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_FILLERS = (1ULL << 18),
+	/** Set if a device supports CB group transmission. */
+	RTE_BBDEV_LDPC_DEC_CBGT = (1ULL << 19)
 };
 
 /** Flags for LDPC encoder operation and capability structure */
@@ -206,7 +208,9 @@ enum rte_bbdev_op_ldpcenc_flag_bitmasks {
 	/** Set if a device supports scatter-gather functionality. */
 	RTE_BBDEV_LDPC_ENC_SCATTER_GATHER = (1ULL << 6),
 	/** Set if a device supports concatenation of non byte aligned output */
-	RTE_BBDEV_LDPC_ENC_CONCATENATION = (1ULL << 7)
+	RTE_BBDEV_LDPC_ENC_CONCATENATION = (1ULL << 7),
+	/** Set if a device supports CB group transmission. */
+	RTE_BBDEV_LDPC_ENC_CBGT = (1ULL << 8)
 };
 
 /** Data input and output buffer for BBDEV operations */
@@ -334,6 +338,56 @@ struct rte_bbdev_op_dec_ldpc_tb_params {
 	uint8_t r;
 	/** The number of CBs that use Ea before switching to Eb, [0:63] */
 	uint8_t cab;
+	/** If the RTE_BBDEV_LDPC_DEC_CBGT capability is not asserted, then
+	 *  the value of max_cbg is ignored. Otherwise, a max_cbg value of
+	 *  0 or 1 indicates that codeBlockGroupTransmission is disabled,
+	 *  as defined in 3GPP TS 38.214.
+	 *
+	 *  A max_cbg value of 2, 4, 6, or 8 sets the value of
+	 *  maxCodeBlockGroupsPerTransportBlock and indicates that
+	 *  codeBlockGroupTransmission is enabled, as defined in 3GPP TS 38.214.
+	 */
+	uint8_t max_cbg;
+	/** If codeBlockGroupTransmission is disabled, then the value of cbgti
+	 *  is ignored. Otherwise, cbgti represents the Code Block Group
+	 *  Transmission Information (CBGTI), as defined in 3GPP TS 38.214.
+	 *  In this case, the M = min(C, max_cbg) number of Most Significant
+	 *  Bits (MSBs) of the uint8_t cbgti have an in-order one-to-one mapping
+	 *  with the M code block groups (CBGs) of the transport block, with the
+	 *  MSB mapped to CBG#0, as detailed in 3GPP TS 38.214.
+	 *
+	 *  Here, C is the total number of code blocks in the full transport block,
+	 *  as defined in 3GPP TS 38.212.
+	 */
+	uint8_t cbgti;
+	/** If codeBlockGroupTransmission is disabled, then the value of cbgfi
+	 * should be ignored. Otherwise, cbgfi represents the Code Block Group
+	 * Flushing out Information (CBGFI), as defined in 3GPP TS 38.214. In this
+	 * case, if the LSB of the uint8_t cbgfi is set to 0, this indicates that
+	 * the earlier received instances of the same CBGs being decoded may be
+	 * corrupted and that the corresponding contents of the HARQ memory should
+	 * be flushed and not combined with the present CBGs being decoded. If the
+	 * LSB of the uint8_t cbgfi is set to 1, this indicates that that the earlier
+	 * received instances of the same CBGs being decoded should be combined with
+	 * the present CBGs being being decoded.
+	 */
+	uint8_t cbgfi;
+
+	/** If codeBlockGroupTransmission is disabled or if
+	 *  RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK is not asserted, then the value of
+	 *  cbg_crc_err should be ignored. Otherwise, cbg_crc_err reports whether
+	 *  any CRC24B failures have been encountered in each of the code block
+	 *  groups (CBGs). In this case, the M = min(C, max_cbg) number of Most
+	 *  Significant Bits (MSBs) of the uint8_t cbg_crc_error have an in-order
+	 *  one-to-one mapping with the M CBGs of the transport block, with the MSB
+	 *  mapped to CBG#0, as detailed in 3GPP TS 38.214. An asserted bit
+	 *  indicates that a CRC24B failure was encountered among the code blocks
+	 *  of the corresponding CBG.
+	 *
+	 *  Here, C is the total number of code blocks in the full transport block,
+	 *  as defined in 3GPP TS 38.212.
+	 */
+	uint8_t cbg_crc_err;
 };
 
 /** Operation structure for Turbo decode.
@@ -584,6 +638,28 @@ struct rte_bbdev_op_enc_ldpc_tb_params {
 	uint8_t r;
 	/** The number of CBs that use Ea before switching to Eb, [0:63] */
 	uint8_t cab;
+	/** If the RTE_BBDEV_LDPC_ENC_CBGT capability is not asserted, then
+	 *  the value of max_cbg is ignored. Otherwise, a max_cbg value of
+	 *  0 or 1 indicates that codeBlockGroupTransmission is disabled,
+	 *  as defined in 3GPP TS 38.214.
+	 *
+	 *  A max_cbg value of 2, 4, 6, or 8 sets the value of
+	 *  maxCodeBlockGroupsPerTransportBlock and indicates that
+	 *  codeBlockGroupTransmission is enabled, as defined in 3GPP TS 38.214.
+	 */
+	uint8_t max_cbg;
+	/** If codeBlockGroupTransmission is disabled, then the value of cbgti
+	 *  is ignored. Otherwise, cbgti represents the Code Block Group
+	 *  Transmission Information (CBGTI), as defined in 3GPP TS 38.214.
+	 *  In this case, the M = min(C, max_cbg) number of Most Significant
+	 *  Bits (MSBs) of the uint8_t cbgti have an in-order one-to-one mapping
+	 *  with the M code block groups (CBGs) of the transport block, with the
+	 *  MSB mapped to CBG#0, as detailed in 3GPP TS 38.214.
+	 *
+	 *  Here, C is the total number of code blocks in the full transport block,
+	 *  as defined in 3GPP TS 38.212.
+	 */
+	uint8_t cbgti;
 };
 
 /** Operation structure for Turbo encode.
-- 
1.8.3.1


More information about the dev mailing list