[Accel-config] [PATCH 7/8] add scan chain

"Guo, Lingyan" <[email protected]> Fri, 27 Oct 2023 11:06:54 +0800
Newsgroups dev.linux.lists.accel-config
Message-ID <[email protected]>
From: lingyan <[email protected]>

change:
  enable decompress + scan chaining path

Signed-off-by: lingyan <[email protected]>
---
 test/iaa.c      | 20 +++++++++++++++++++-
 test/iaa_prep.c |  2 ++
 test/iaa_test.c |  7 +++++++
 3 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/test/iaa.c b/test/iaa.c
index a313906..09584ce 100644
--- a/test/iaa.c
+++ b/test/iaa.c
@@ -327,6 +327,13 @@ static int init_scan(struct task *tsk, int tflags,
 	memcpy(tsk->src2, (void *)&iaa_filter_aecs, IAA_FILTER_AECS_SIZE);
 	tsk->iaa_src2_xfer_size = IAA_FILTER_AECS_SIZE;
 
+	if (tsk->is_shadow_compress) {
+		tsk->shadown_src2 = aligned_alloc(32, IAA_COMPRESS_SRC2_SIZE);
+		if (!tsk->shadown_src2)
+			return -ENOMEM;
+		memset_pattern(tsk->shadown_src2, 0, IAA_COMPRESS_SRC2_SIZE);
+	}
+
 	tsk->dst1 = aligned_alloc(ADDR_ALIGNMENT, IAA_GENERAL_MAX_DEST_SIZE);
 	if (!tsk->dst1)
 		return -ENOMEM;
@@ -1501,6 +1508,11 @@ int iaa_scan_multi_task_nodes(struct acctest_context *ctx, int chaining)
 	int ret = ACCTEST_STATUS_OK;
 
 	while (tsk_node) {
+		if (chaining) {
+			memcpy(tsk_node->tsk->src1, tsk_node->tsk->dst1,
+			       tsk_node->tsk->comp->iax_output_size);
+			tsk_node->tsk->xfer_size = tsk_node->tsk->comp->iax_output_size;
+		}
 		tsk_node->tsk->opcode = IAX_OPCODE_SCAN;
 
 		tsk_node->tsk->dflags = (IDXD_OP_FLAG_CRAV | IDXD_OP_FLAG_RCR);
@@ -1508,7 +1520,13 @@ int iaa_scan_multi_task_nodes(struct acctest_context *ctx, int chaining)
 			tsk_node->tsk->dflags |= IDXD_OP_FLAG_BOF;
 
 		tsk_node->tsk->dflags |= IDXD_OP_FLAG_RD_SRC2_AECS;
-
+		if (chaining) {
+			tsk_node->tsk->iaa_decompr_flags = (IDXD_DECOMPRESS_FLAG_SELECT_EOB_BFINAL |
+				IDXD_DECOMPRESS_FLAG_CHECK_EOB |
+				IDXD_DECOMPRESS_FLAG_STOP_ON_EOB |
+				IDXD_DECOMPRESS_FLAG_FLUSH_OUTPUT |
+				IDXD_DECOMPRESS_FLAG_EN_DECOMPRESS);
+		}
 		iaa_prep_scan(tsk_node->tsk, chaining);
 		tsk_node = tsk_node->next;
 	}
diff --git a/test/iaa_prep.c b/test/iaa_prep.c
index 966ea68..ca539dd 100644
--- a/test/iaa_prep.c
+++ b/test/iaa_prep.c
@@ -142,6 +142,8 @@ void iaa_prep_scan(struct task *tsk, int chaining)
 
 	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
 				 (uint64_t)(tsk->src1), tsk->xfer_size, tsk->dflags);
+	if (chaining)
+		tsk->desc->iax_decompr_flags = tsk->iaa_decompr_flags;
 	tsk->desc->completion_addr = (uint64_t)(tsk->comp);
 	tsk->desc->iax_max_dst_size = tsk->iaa_max_dst_size;
 	tsk->desc->iax_src2_addr = (uint64_t)(tsk->src2);
diff --git a/test/iaa_test.c b/test/iaa_test.c
index 3590cc3..a6cd0f6 100644
--- a/test/iaa_test.c
+++ b/test/iaa_test.c
@@ -351,6 +351,8 @@ static int test_filter(struct acctest_context *ctx, size_t buf_size, int tflags,
 		/* allocate memory to src and dest buffers and fill in the desc for all the nodes*/
 		tsk_node = ctx->multi_task_node;
 		while (tsk_node) {
+			if (chaining)
+				tsk_node->tsk->is_shadow_compress = 1;
 			tsk_node->tsk->iaa_filter_flags = (uint32_t)extra_flags_2;
 			tsk_node->tsk->iaa_num_inputs = (uint32_t)extra_flags_3;
 
@@ -363,6 +365,11 @@ static int test_filter(struct acctest_context *ctx, size_t buf_size, int tflags,
 
 		switch (opcode) {
 		case IAX_OPCODE_SCAN:
+			if (chaining) {
+				rc = iaa_prehook_compress_multi_task_nodes(ctx);
+				if (rc != ACCTEST_STATUS_OK)
+					return rc;
+			}
 			rc = iaa_scan_multi_task_nodes(ctx, chaining);
 			if (rc != ACCTEST_STATUS_OK)
 				return rc;
-- 
2.34.1