From: Aidan Goddard <aidan.goddard@accelercomm.com>
To: akhil.goyal@nxp.com
Cc: nicolas.chautru@intel.com, dev@dpdk.org,
Aidan Goddard <aidan.goddard@accelercomm.com>
Subject: [dpdk-dev] [PATCH v3] BBDEV: add LDPC op parameters and flags to support CBGT
Date: Thu, 5 Nov 2020 14:25:44 +0000 [thread overview]
Message-ID: <1604586344-25634-1-git-send-email-aidan.goddard@accelercomm.com> (raw)
In-Reply-To: <1604584637-21906-1-git-send-email-aidan.goddard@accelercomm.com>
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
- add support for reading these parameters from test vector files
- add sanity tests for RTE_BBDEV_LDPC_[ENC/DEC]_CBGT flag in test vector
- 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@accelercomm.com>
Signed-off-by: Aidan Goddard <aidan.goddard@accelercomm.com>
Acked-by: Dave Burley <dave.burley@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..0ff4039 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..f3d00dc 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 the earlier
+ * received instances of the same CBGs being decoded should be combined with
+ * the present CBGs 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
next prev parent reply other threads:[~2020-11-05 14:25 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-05 13:57 [dpdk-dev] [PATCH] " Aidan Goddard
2020-11-05 14:25 ` Aidan Goddard [this message]
2020-11-12 21:13 ` [dpdk-dev] [PATCH v3] " Akhil Goyal
2020-11-13 23:19 ` Chautru, Nicolas
2021-01-11 19:22 ` Akhil Goyal
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1604586344-25634-1-git-send-email-aidan.goddard@accelercomm.com \
--to=aidan.goddard@accelercomm.com \
--cc=akhil.goyal@nxp.com \
--cc=dev@dpdk.org \
--cc=nicolas.chautru@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).