[Accel-config] Re: [PATCH v1] accel-config/test: Align accfg/idxd.h with that in Kernel

Dave Jiang <dave.jiang at intel.com> Fri, 05 Aug 2022 09:24:12 -0700
Newsgroups dev.linux.lists.accel-config
Message-ID <[email protected]>
--===============0598958079360460614==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable


On 8/5/2022 9:09 AM, Zhang, Li4 wrote:
> Duplicate Kernel idxd.h to accfg/idxd.h, create idxd_test.h for
> reserving the extra defines used by DSA/IAA test code.

The changes in iax_test.h, what are the reasons they can't go into =

kernel idxd.h? They seem to be hardware descriptor changes right? I'm =

not seeing any software specific bits. Can you please create one or more =

patches for usptream to make the changes on the kernel side. And then =

lets settle accel-config changes.

Also, for idxd.h, I'm seeing a lot of DSA 2 definitions. Those can't go =

public until DSA 2 spec is public. I also see some bits like ioctls =

defines that are not invalid due to rejection of OTC arch team on =

inter-domain design, so those need to be dropped.

Fenghua, can you take a look at the dsa2 branch of accel-config and help =

drop the inter-domain enablings please?


>
> Signed-off-by: Li Zhang <li4.zhang(a)intel.com>
> ---
>   accfg/idxd.h      | 295 ++++++++++++++++++++++++++----------
>   test/accel_test.h |   5 +-
>   test/dsa.c        |  89 ++++++-----
>   test/dsa_prep.c   | 378 +++++++++++++++++++++++++++-------------------
>   test/iaa.c        |  66 ++++----
>   test/iaa_prep.c   |  94 +++++++-----
>   test/iaa_test.c   |  16 +-
>   test/idxd_test.h  | 118 +++++++++++++++
>   8 files changed, 714 insertions(+), 347 deletions(-)
>   create mode 100644 test/idxd_test.h
>
> diff --git a/accfg/idxd.h b/accfg/idxd.h
> index b460aa3..f9e2fe0 100644
> --- a/accfg/idxd.h
> +++ b/accfg/idxd.h
> @@ -1,10 +1,10 @@
> -/* SPDX-License-Identifier: LGPL-2.1 */
> -/*   Copyright(c) 2019 Intel Corporation. All rights reserved. */
> -
> +/* SPDX-License-Identifier: LGPL-2.1 WITH Linux-syscall-note */
> +/* Copyright(c) 2019 Intel Corporation. All rights rsvd. */
>   #ifndef _USR_IDXD_H_
>   #define _USR_IDXD_H_
>   =

> -#include <stdint.h>
> +#include <linux/types.h>
> +#include <linux/ioctl.h>
>   =

>   /* Driver command error status */
>   enum idxd_scmd_stat {
> @@ -26,7 +26,7 @@ enum idxd_scmd_stat {
>   	IDXD_SCMD_WQ_NO_SIZE =3D 0x800e0000,
>   	IDXD_SCMD_WQ_NO_PRIV =3D 0x800f0000,
>   	IDXD_SCMD_WQ_IRQ_ERR =3D 0x80100000,
> -	IDXD_SCMD_WQ_NO_DRV_NAME =3D 0x80200000,
> +	IDXD_SCMD_DEV_EVL_ERR =3D 0x80100000,
>   };
>   =

>   #define IDXD_SCMD_SOFTERR_MASK	0x80000000
> @@ -51,16 +51,11 @@ enum idxd_scmd_stat {
>   =

>   /* IAX */
>   #define IDXD_OP_FLAG_RD_SRC2_AECS	0x010000
> -#define IDXD_OP_FLAG_WR_SRC2_CMPL	0x040000
> -
> -#define IDXD_COMPRESS_FLAG_EOB_BFINAL 0x000c
> -#define IDXD_COMPRESS_FLAG_FLUSH_OUTPUT 0x0002
> -
> -#define IDXD_DECOMPRESS_FLAG_SELECT_EOB_BFINAL 0x0010
> -#define IDXD_DECOMPRESS_FLAG_CHECK_EOB 0x0008
> -#define IDXD_DECOMPRESS_FLAG_STOP_ON_EOB 0x0004
> -#define IDXD_DECOMPRESS_FLAG_FLUSH_OUTPUT 0x0002
> -#define IDXD_DECOMPRESS_FLAG_EN_DECOMPRESS 0x0001
> +#define IDXD_OP_FLAG_RD_SRC2_2ND	0x020000
> +#define IDXD_OP_FLAG_WR_SRC2_AECS_COMP	0x040000
> +#define IDXD_OP_FLAG_WR_SRC2_AECS_OVFL	0x080000
> +#define IDXD_OP_FLAG_SRC2_STS		0x100000
> +#define IDXD_OP_FLAG_CRC_RFC3720	0x200000
>   =

>   /* Opcode */
>   enum dsa_opcode {
> @@ -81,6 +76,17 @@ enum dsa_opcode {
>   	DSA_OPCODE_DIF_STRP,
>   	DSA_OPCODE_DIF_UPDT,
>   	DSA_OPCODE_CFLUSH =3D 0x20,
> +	DSA_OPCODE_UPDATE_WIN,
> +	DSA_OPCODE_RS_IPASID_MEMCOPY =3D 0x23,
> +	DSA_OPCODE_RS_IPASID_FILL,
> +	DSA_OPCODE_RS_IPASID_COMPARE,
> +	DSA_OPCODE_RS_IPASID_COMPVAL,
> +	DSA_OPCODE_RS_IPASID_CFLUSH,
> +	DSA_OPCODE_URS_IPASID_MEMCOPY =3D 0x33,
> +	DSA_OPCODE_URS_IPASID_FILL,
> +	DSA_OPCODE_URS_IPASID_COMPARE,
> +	DSA_OPCODE_URS_IPASID_COMPVAL,
> +	DSA_OPCODE_URS_IPASID_CFLUSH,
>   };
>   =

>   enum iax_opcode {
> @@ -89,13 +95,13 @@ enum iax_opcode {
>   	IAX_OPCODE_MEMMOVE,
>   	IAX_OPCODE_DECOMPRESS =3D 0x42,
>   	IAX_OPCODE_COMPRESS,
> -	IAX_OPCODE_CRC64 =3D 0x44,
> -	IAX_OPCODE_ZDECOMPRESS32 =3D 0x48,
> -	IAX_OPCODE_ZDECOMPRESS16,
> -	IAX_OPCODE_ZCOMPRESS32 =3D 0x4c,
> -	IAX_OPCODE_ZCOMPRESS16,
> +	IAX_OPCODE_CRC64,
> +	IAX_OPCODE_ZERO_DECOMP_32 =3D 0x48,
> +	IAX_OPCODE_ZERO_DECOMP_16,
> +	IAX_OPCODE_ZERO_COMP_32 =3D 0x4c,
> +	IAX_OPCODE_ZERO_COMP_16,
>   	IAX_OPCODE_SCAN =3D 0x50,
> -	IAX_OPCODE_SET_MEMBERSHIP,
> +	IAX_OPCODE_SET_MEMBER,
>   	IAX_OPCODE_EXTRACT,
>   	IAX_OPCODE_SELECT,
>   	IAX_OPCODE_RLE_BURST,
> @@ -134,12 +140,15 @@ enum dsa_completion_status {
>   	DSA_COMP_HW_ERR1,
>   	DSA_COMP_HW_ERR_DRB,
>   	DSA_COMP_TRANSLATION_FAIL,
> +	DSA_COMP_DRAIN_EVL =3D 0x26,
> +	DSA_COMP_BATCH_EVL_ERR,
>   };
>   =

>   enum iax_completion_status {
>   	IAX_COMP_NONE =3D 0,
>   	IAX_COMP_SUCCESS,
>   	IAX_COMP_PAGE_FAULT_IR =3D 0x04,
> +	IAX_COMP_ANALYTICS_ERROR =3D 0x0a,
>   	IAX_COMP_OUTBUF_OVERFLOW,
>   	IAX_COMP_BAD_OPCODE =3D 0x10,
>   	IAX_COMP_INVALID_FLAGS,
> @@ -160,13 +169,17 @@ enum iax_completion_status {
>   	IAX_COMP_WATCHDOG,
>   	IAX_COMP_INVALID_COMP_FLAG =3D 0x30,
>   	IAX_COMP_INVALID_FILTER_FLAG,
> -	IAX_COMP_INVALID_NUM_ELEMS =3D 0x33,
> +	IAX_COMP_INVALID_INPUT_SIZE,
> +	IAX_COMP_INVALID_NUM_ELEMS,
> +	IAX_COMP_INVALID_SRC1_WIDTH,
> +	IAX_COMP_INVALID_INVERT_OUT,
>   };
>   =

>   #define DSA_COMP_STATUS_MASK		0x7f
>   #define DSA_COMP_STATUS_WRITE		0x80
> +#define DSA_COMP_STATUS(status)		((status) & DSA_COMP_STATUS_MASK)
>   =

> -struct hw_desc {
> +struct dsa_hw_desc {
>   	uint32_t	pasid:20;
>   	uint32_t	rsvd:11;
>   	uint32_t	priv:1;
> @@ -178,24 +191,21 @@ struct hw_desc {
>   		uint64_t	rdback_addr;
>   		uint64_t	pattern;
>   		uint64_t	desc_list_addr;
> +		uint64_t	win_base_addr;
>   	};
>   	union {
>   		uint64_t	dst_addr;
>   		uint64_t	rdback_addr2;
>   		uint64_t	src2_addr;
>   		uint64_t	comp_pattern;
> +		uint64_t	win_size;
>   	};
>   	union {
>   		uint32_t	xfer_size;
>   		uint32_t	desc_count;
>   	};
>   	uint16_t	int_handle;
> -	union {
> -		uint16_t	rsvd1;
> -		uint16_t        iax_compr_flags;
> -		uint16_t        iax_decompr_flags;
> -		uint16_t        iax_crc64_flags;
> -	};
> +	uint16_t	rsvd1;
>   	union {
>   		uint8_t		expected_res;
>   		/* create delta record */
> @@ -246,41 +256,135 @@ struct hw_desc {
>   			uint16_t	dest_app_tag_mask;
>   			uint16_t	dest_app_tag_seed;
>   		};
> -		/* IAX common */
> +
> +		/* restricted ops with interpasid */
> +		struct {
> +			uint8_t rest_ip_res1[20];
> +			union {
> +				uint16_t src_pasid_hndl;
> +				uint8_t rest_ip_res2[2];
> +				uint16_t src1_pasid_hndl;
> +			};
> +			union {
> +				uint16_t dest_pasid_hndl;
> +				uint16_t src2_pasid_hndl;
> +				uint8_t rest_ip_res3[2];
> +			};
> +		};
> +
> +		/* unrestricted ops with interpasid */
>   		struct {
> -			uint64_t        iax_src2_addr;
> -			uint32_t        iax_max_dst_size;
> -			uint32_t        iax_src2_xfer_size;
> -			uint32_t	iax_filter_flags;
> -			uint32_t	iax_num_inputs;
> +			uint8_t unrest_ip_res1[8];
> +			union {
> +				/* Generic */
> +				struct {
> +					uint32_t addr1_pasid:20;
> +					uint32_t unrest_ip_res2:11;
> +					uint32_t addr1_priv:1;
> +				};
> +				/* Memcopy, Compare Pattern */
> +				struct {
> +					uint32_t src_pasid:20;
> +					uint32_t unrest_ip_res3:11;
> +					uint32_t unrest_src_priv:1;
> +				};
> +				/* Fill, Cache Flush */
> +				struct {
> +					uint32_t unrest_ip_res4: 32;
> +				};
> +				/* Compare */
> +				struct {
> +					uint32_t src1_pasid:20;
> +					uint32_t unrest_ip_res5:11;
> +					uint32_t unrest_src1_priv:1;
> +				};
> +			};
> +			union {
> +				/* Generic */
> +				struct {
> +					uint32_t addr2_pasid:20;
> +					uint32_t unrest_ip_res6:11;
> +					uint32_t addr2_priv:1;
> +				};
> +				/* Memcopy, Fill */
> +				struct {
> +					uint32_t dest_pasid:20;
> +					uint32_t unrest_ip_res7:11;
> +					uint32_t unrest_dest_priv:1;
> +				};
> +				/* Compare */
> +				struct {
> +					uint32_t src2_pasid:20;
> +					uint32_t unrest_ip_res8:11;
> +					uint32_t unrest_src2_priv:1;
> +				};
> +				/* Compare Pattern */
> +				struct {
> +					uint32_t unrest_ip_res9: 32;
> +				};
> +			};
> +			uint64_t unrest_ip_res10:48;
> +			uint16_t ipt_handle;
>   		};
> -		/* CRC64 */
> +
> +		/* Update window */
>   		struct {
> -			uint64_t        iax_crc64_rsvd;
> -			uint64_t        iax_crc64_rsvd2;
> -			uint64_t        iax_crc64_poly;
> +			uint8_t update_win_resv2[21];
> +			uint8_t idpt_win_flags;
> +			uint16_t idpt_win_handle;
>   		};
>   =

>   		uint8_t		op_specific[24];
>   	};
>   } __attribute__((packed));
>   =

> -struct raw_desc {
> +struct iax_hw_desc {
> +	uint32_t        pasid:20;
> +	uint32_t        rsvd:11;
> +	uint32_t        priv:1;
> +	uint32_t        flags:24;
> +	uint32_t        opcode:8;
> +	uint64_t        completion_addr;
> +	uint64_t        src1_addr;
> +	uint64_t        dst_addr;
> +	uint32_t        src1_size;
> +	uint16_t        int_handle;
> +	union {
> +		uint16_t        compr_flags;
> +		uint16_t        decompr_flags;
> +	};
> +	uint64_t        src2_addr;
> +	uint32_t        max_dst_size;
> +	uint32_t        src2_size;
> +	uint32_t	filter_flags;
> +	uint32_t	num_inputs;
> +} __attribute__((packed));
> +
> +struct dsa_raw_desc {
>   	uint64_t	field[8];
>   } __attribute__((packed));
>   =

> +#define DSA_COMP_FI_FA_MASKED_MASK	0x1
> +#define DSA_COMP_FI_FA_MASKED_SHIFT	0x0
> +#define DSA_COMP_FI_OP_ID_MASK		0x7
> +#define DSA_COMP_FI_OP_ID_SHIFT		0x1
> +
>   /*
>    * The status field will be modified by hardware, therefore it should be
> - * __volatile__ and prevent the compiler from optimize the read.
> + * volatile and prevent the compiler from optimize the read.
>    */
> -struct completion_record {
> -	__volatile__ uint8_t	status;
> +struct dsa_completion_record {
> +	volatile uint8_t	status;
>   	union {
>   		uint8_t		result;
>   		uint8_t		dif_status;
>   	};
> -	uint16_t		rsvd;
> -	uint32_t		bytes_completed;
> +	uint8_t			fault_info;
> +	uint8_t			rsvd;
> +	union {
> +		uint32_t		bytes_completed;
> +		uint32_t		descs_completed;
> +	};
>   	uint64_t		fault_addr;
>   	union {
>   		/* common record */
> @@ -317,46 +421,77 @@ struct completion_record {
>   			uint16_t	dif_upd_dest_app_tag;
>   		};
>   =

> -		/* IAX common */
> -		struct {
> -			uint32_t	iax_invalid_flags;
> -			uint32_t	iax_rsvd;
> -			uint32_t	iax_output_size;
> -			uint8_t		iax_output_bits;
> -			uint8_t		iax_rsvd2;
> -			uint16_t	iax_xor_chksum;
> -			uint32_t	iax_crc;
> -			union {
> -				uint32_t	iax_min;
> -				uint32_t	iax_first;
> -			};
> -			union {
> -				uint32_t	iax_max;
> -				uint32_t	iax_last;
> -			};
> -			union {
> -				uint32_t	iax_sum;
> -				uint32_t	iax_population_cnt;
> -			};
> -		};
> +		uint8_t		op_specific[16];
> +	};
> +} __attribute__((packed));
>   =

> -		/* CRC64 */
> -		struct {
> -			uint32_t	crc64_invalid_flags;
> -			uint32_t	crc64_rsvd;
> -			uint64_t	crc64_rsvd2;
> -			uint64_t	crc64_rsvd3;
> -			uint64_t	crc64_result;
> -		};
> +struct dsa_raw_completion_record {
> +	uint64_t	field[4];
> +} __attribute__((packed));
>   =

> -		/* To be compatible with IAX, alloc 64 bytes*/
> -		uint8_t		op_specific[48];
> -	};
> +struct iax_completion_record {
> +	volatile uint8_t        status;
> +	uint8_t                 error_code;
> +	uint8_t			fault_info;
> +	uint8_t			rsvd;
> +	uint32_t                bytes_completed;
> +	uint64_t                fault_addr;
> +	uint32_t                invalid_flags;
> +	uint32_t                rsvd2;
> +	uint32_t                output_size;
> +	uint8_t                 output_bits;
> +	uint8_t                 rsvd3;
> +	uint16_t                xor_csum;
> +	uint32_t                crc;
> +	uint32_t                min;
> +	uint32_t                max;
> +	uint32_t                sum;
> +	uint64_t                rsvd4[2];
>   } __attribute__((packed));
>   =

> -struct raw_completion_record {
> -	/* To be compatible with IAX, alloc 64 bytes*/
> +struct iax_raw_completion_record {
>   	uint64_t	field[8];
>   } __attribute__((packed));
>   =

> +#define IDXD_TYPE	('d')
> +#define IDXD_IOC_BASE	100
> +#define IDXD_WIN_BASE	200
> +
> +enum idxd_win_type {
> +	IDXD_WIN_TYPE_SA_SS =3D 0,
> +	IDXD_WIN_TYPE_SA_MS,
> +};
> +
> +/* IDXD window flags */
> +#define IDXD_WIN_FLAGS_PROT_READ	0x0001
> +#define IDXD_WIN_FLAGS_PROT_WRITE	0x0002
> +#define IDXD_WIN_FLAGS_WIN_CHECK	0x0004
> +#define IDXD_WIN_FLAGS_OFFSET_MODE	0x0008
> +
> +#define IDXD_WIN_FLAGS_MASK		(IDXD_WIN_FLAGS_PROT_READ | IDXD_WIN_FLAGS_=
PROT_WRITE |\
> +					 IDXD_WIN_FLAGS_WIN_CHECK | IDXD_WIN_FLAGS_OFFSET_MODE)
> +
> +struct idxd_win_param {
> +	uint64_t base;		/* Window base */
> +	uint64_t size;		/* Window size */
> +	uint32_t type;		/* Window type, see enum idxd_win_type */
> +	uint16_t flags;		/* See IDXD windows flags */
> +	uint16_t handle;		/* Window handle returned by driver */
> +} __attribute__((packed));
> +
> +struct idxd_win_attach {
> +	uint32_t fd;		/* Window file descriptor returned by IDXD_WIN_CREATE */
> +	uint16_t handle;	/* Window handle returned by driver */
> +} __attribute__((packed));
> +
> +struct idxd_win_fault {
> +	uint64_t offset;	/* Window offset of faulting address */
> +	uint64_t len;		/* Faulting range */
> +	uint32_t write_fault;	/* Fault generated on write */
> +} __attribute__((packed));
> +
> +#define IDXD_WIN_CREATE		_IOWR(IDXD_TYPE, IDXD_IOC_BASE + 1, struct idxd=
_win_param)
> +#define IDXD_WIN_ATTACH		_IOR(IDXD_TYPE, IDXD_IOC_BASE + 2, struct idxd_=
win_attach)
> +#define IDXD_WIN_FAULT           _IOR(IDXD_TYPE, IDXD_WIN_BASE + 1, stru=
ct idxd_win_fault)
> +
>   #endif
> diff --git a/test/accel_test.h b/test/accel_test.h
> index 9ea16ec..b80c82c 100644
> --- a/test/accel_test.h
> +++ b/test/accel_test.h
> @@ -4,6 +4,7 @@
>   #define __ACCEL_TEST_H__
>   #include <accfg/libaccel_config.h>
>   #include <accfg/idxd.h>
> +#include "idxd_test.h"
>   #include "accfg_test.h"
>   =

>   #define SHARED 1
> @@ -187,7 +188,7 @@ static inline void dbg(const char *msg, ...)
>   /* Dump hardware descriptor to log */
>   static inline void dump_desc(struct hw_desc *hw)
>   {
> -	struct raw_desc *rhw =3D (void *)hw;
> +	struct dsa_raw_desc *rhw =3D (void *)hw;
>   	int i;
>   =

>   	dbg("desc addr: %p\n", hw);
> @@ -200,7 +201,7 @@ static inline void dump_desc(struct hw_desc *hw)
>   static inline void dump_compl_rec(struct completion_record *compl, int =
compl_size)
>   {
>   	int i;
> -	struct raw_completion_record *rcompl =3D (void *)compl;
> +	struct iax_raw_completion_record *rcompl =3D (void *)compl;
>   	int num_qword =3D compl_size / sizeof(uint64_t);
>   =

>   	dbg("completion record addr: %p\n", compl);
> diff --git a/test/dsa.c b/test/dsa.c
> index 3d982d0..e42b49f 100644
> --- a/test/dsa.c
> +++ b/test/dsa.c
> @@ -14,6 +14,7 @@
>   #include <linux/vfio.h>
>   #include <accfg/libaccel_config.h>
>   #include <accfg/idxd.h>
> +#include "idxd_test.h"
>   #include "accel_test.h"
>   #include "dsa.h"
>   #include "dsa_crc32.h"
> @@ -1534,19 +1535,21 @@ int task_result_verify_memfill(struct task *tsk, =
int mismatch_expected)
>   =

>   int task_result_verify_compare(struct task *tsk, int mismatch_expected)
>   {
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +
>   	if (!mismatch_expected) {
> -		if (tsk->comp->result) {
> +		if (compl->result) {
>   			err("compval failed at %#x\n",
> -			    tsk->comp->bytes_completed);
> +			    compl->bytes_completed);
>   			return -ENXIO;
>   		}
>   		return ACCTEST_STATUS_OK;
>   	}
>   =

>   	/* mismatch_expected */
> -	if (tsk->comp->result) {
> +	if (compl->result) {
>   		info("expected mismatch at index %#x\n",
> -		     tsk->comp->bytes_completed);
> +		     compl->bytes_completed);
>   		return ACCTEST_STATUS_OK;
>   	}
>   =

> @@ -1556,19 +1559,21 @@ int task_result_verify_compare(struct task *tsk, =
int mismatch_expected)
>   =

>   int task_result_verify_compval(struct task *tsk, int mismatch_expected)
>   {
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +
>   	if (!mismatch_expected) {
> -		if (tsk->comp->result) {
> +		if (compl->result) {
>   			err("compval failed at %#x\n",
> -			    tsk->comp->bytes_completed);
> +			    compl->bytes_completed);
>   			return -ENXIO;
>   		}
>   		return ACCTEST_STATUS_OK;
>   	}
>   =

>   	/* mismatch_expected */
> -	if (tsk->comp->result) {
> +	if (compl->result) {
>   		info("expected mismatch at index %#x\n",
> -		     tsk->comp->bytes_completed);
> +		     compl->bytes_completed);
>   		return ACCTEST_STATUS_OK;
>   	}
>   =

> @@ -1601,11 +1606,13 @@ int task_result_verify_dualcast(struct task *tsk,=
 int mismatch_expected)
>   int task_result_verify_ap_delta(struct task *tsk, int mismatch_expected)
>   {
>   	int rc;
> -	int data_size =3D (tsk->comp->status =3D=3D DSA_COMP_SUCCESS) ?
> -			 tsk->desc->xfer_size : tsk->comp->bytes_completed;
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
> +	int data_size =3D (compl->status =3D=3D DSA_COMP_SUCCESS) ?
> +			 hw->xfer_size : compl->bytes_completed;
>   =

> -	rc =3D memcmp((unsigned char *)tsk->desc->dst_addr,
> -		    (unsigned char *)tsk->desc->src2_addr, data_size);
> +	rc =3D memcmp((unsigned char *)hw->dst_addr,
> +		    (unsigned char *)hw->src2_addr, data_size);
>   	if (rc) {
>   		err("apply delta mismatch, memcmp rc %d\n", rc);
>   		return -ENXIO;
> @@ -1679,23 +1686,25 @@ int task_result_verify_crcgen(struct task *tsk, i=
nt mismatch_expected)
>   {
>   	unsigned int expected_crc =3D 0x0;
>   	unsigned int seed =3D 0;
> -	int data_size =3D (tsk->comp->status =3D=3D DSA_COMP_SUCCESS) ?
> -			 tsk->desc->xfer_size : tsk->comp->bytes_completed;
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
> +	int data_size =3D (compl->status =3D=3D DSA_COMP_SUCCESS) ?
> +			 hw->xfer_size : compl->bytes_completed;
>   =

>   	if (tsk->dflags & READ_CRC_SEED)
>   		seed =3D *tsk->crc_seed_addr;
>   	else
>   		seed =3D tsk->crc_seed;
> -	expected_crc =3D dsa_calculate_crc32((void *)tsk->desc->src_addr,
> +	expected_crc =3D dsa_calculate_crc32((void *)hw->src_addr,
>   					   data_size, seed, tsk->dflags);
>   	printf("expected crc =3D %x\n", expected_crc);
>   =

>   	if (!mismatch_expected) {
> -		if (tsk->comp->crc_val !=3D expected_crc) {
> +		if (compl->crc_val !=3D expected_crc) {
>   			printf("\033[0;31m");
>   			printf("error occurred");
>   			err("Generated Crc %#x is different than expected Crc %#x\n",
> -			    tsk->comp->crc_val, expected_crc);
> +			    compl->crc_val, expected_crc);
>   			printf("\033[0m");
>   			return -ENXIO;
>   		}
> @@ -1703,9 +1712,9 @@ int task_result_verify_crcgen(struct task *tsk, int=
 mismatch_expected)
>   	}
>   =

>   	/* mismatch_expected */
> -	if (tsk->comp->crc_val !=3D expected_crc) {
> +	if (compl->crc_val !=3D expected_crc) {
>   		info("expected mismatch in crcgen %#x\n",
> -		     tsk->comp->crc_val);
> +		     compl->crc_val);
>   		return ACCTEST_STATUS_OK;
>   	}
>   	return ACCTEST_STATUS_OK;
> @@ -1716,17 +1725,19 @@ int task_result_verify_crc_copy(struct task *tsk,=
 int mismatch_expected)
>   	int rc;
>   	unsigned int seed =3D 0;
>   	unsigned int expected_crc =3D 0x0;
> -	int data_size =3D (tsk->comp->status =3D=3D DSA_COMP_SUCCESS) ?
> -			 tsk->desc->xfer_size : tsk->comp->bytes_completed;
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
> +	int data_size =3D (compl->status =3D=3D DSA_COMP_SUCCESS) ?
> +			 hw->xfer_size : compl->bytes_completed;
>   =

>   	if (tsk->dflags & READ_CRC_SEED)
>   		seed =3D *tsk->crc_seed_addr;
>   	else
>   		seed =3D tsk->crc_seed;
> -	expected_crc =3D dsa_calculate_crc32((void *)tsk->desc->src_addr,
> +	expected_crc =3D dsa_calculate_crc32((void *)hw->src_addr,
>   					   data_size, seed, tsk->dflags);
> -	rc =3D memcmp((unsigned char *)tsk->desc->src_addr,
> -		    (unsigned char *)tsk->desc->dst_addr, data_size);
> +	rc =3D memcmp((unsigned char *)hw->src_addr,
> +		    (unsigned char *)hw->dst_addr, data_size);
>   	printf("rc memcmp =3D %x and expected crc =3D %x\n", rc, expected_crc);
>   =

>   	if (rc) {
> @@ -1736,11 +1747,11 @@ int task_result_verify_crc_copy(struct task *tsk,=
 int mismatch_expected)
>   		printf("\033[0m");
>   		return -ENXIO;
>   	}
> -	if (tsk->comp->crc_val !=3D expected_crc) {
> +	if (compl->crc_val !=3D expected_crc) {
>   		printf("\033[0;31m");
>   		printf("error occurred");
>   		err("Generated Crc %#x is different than expected Crc %#x\n",
> -		    tsk->comp->crc_val, expected_crc);
> +		    compl->crc_val, expected_crc);
>   		printf("\033[0m");
>   		return -ENXIO;
>   	}
> @@ -1770,7 +1781,7 @@ uint16_t dsa_calculate_crc_t10dif(unsigned char *bu=
ffer, size_t len, int flags)
>   static int task_result_verify_dif_page_fault(struct task *tsk, unsigned=
 long xfer_size,
>   					     int mismatch_expected)
>   {
> -	struct hw_desc *hw =3D tsk->desc;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
>   	int rc =3D 0;
>   	unsigned char *src1 =3D (unsigned char *)hw->src_addr;
>   	unsigned char *dst1 =3D (unsigned char *)hw->dst_addr;
> @@ -1821,17 +1832,18 @@ int task_result_verify_dif(struct task *tsk, unsi=
gned long xfer_size, int mismat
>   	unsigned long buf_size =3D dif_blk_arr[tsk->blk_idx_flg];
>   	unsigned char *src1 =3D (unsigned char *)tsk->src1;
>   	unsigned char *dst1 =3D (unsigned char *)tsk->dst1;
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
>   =

> -	if (tsk->comp->status =3D=3D DSA_COMP_PAGE_FAULT_NOBOF ||
> -	    tsk->comp->status =3D=3D DSA_COMP_PAGE_FAULT_IR ||
> -	    tsk->comp->status =3D=3D 0x83) {
> -		rc =3D task_result_verify_dif_page_fault(tsk, tsk->comp->bytes_complet=
ed, 0);
> +	if (compl->status =3D=3D DSA_COMP_PAGE_FAULT_NOBOF ||
> +	    compl->status =3D=3D DSA_COMP_PAGE_FAULT_IR ||
> +	    compl->status =3D=3D 0x83) {
> +		rc =3D task_result_verify_dif_page_fault(tsk, compl->bytes_completed, =
0);
>   		info("Partial DIF Src and Dest Checking Done\n");
>   		if (!rc)
>   			return ACCTEST_STATUS_OK;
>   	}
>   =

> -	if (tsk->comp->status =3D=3D 0x16)
> +	if (compl->status =3D=3D 0x16)
>   		return ACCTEST_STATUS_OK;
>   =

>   	info("Checking Src & Dst buffers\n");
> @@ -1860,7 +1872,7 @@ int task_result_verify_dif(struct task *tsk, unsign=
ed long xfer_size, int mismat
>   =

>   static int task_result_verify_dif_tags_page_fault(struct task *tsk, uns=
igned long xfer_size)
>   {
> -	struct hw_desc *hw =3D tsk->desc;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
>   	unsigned long blks;
>   	unsigned long buf_size;
>   	unsigned char *dst1 =3D (uint8_t *)hw->dst_addr;
> @@ -1980,12 +1992,13 @@ int task_result_verify_dif_tags(struct task *tsk,=
 unsigned long xfer_size)
>   	unsigned char tmp_buf;
>   	unsigned char dst_tag;
>   	unsigned long i;
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
>   =

> -	info("compsts: %x\n", tsk->comp->status);
> -	if (tsk->comp->status =3D=3D 0x83 ||
> -	    tsk->comp->status =3D=3D DSA_COMP_PAGE_FAULT_NOBOF ||
> -	    tsk->comp->status =3D=3D DSA_COMP_PAGE_FAULT_IR) {
> -		rc =3D task_result_verify_dif_tags_page_fault(tsk, tsk->comp->bytes_co=
mpleted);
> +	info("compsts: %x\n", compl->status);
> +	if (compl->status =3D=3D 0x83 ||
> +	    compl->status =3D=3D DSA_COMP_PAGE_FAULT_NOBOF ||
> +	    compl->status =3D=3D DSA_COMP_PAGE_FAULT_IR) {
> +		rc =3D task_result_verify_dif_tags_page_fault(tsk, compl->bytes_comple=
ted);
>   		info("Partial DIF Tags Checking Done\n");
>   		if (!rc)
>   			return ACCTEST_STATUS_OK;
> diff --git a/test/dsa_prep.c b/test/dsa_prep.c
> index 3bccda3..a34e464 100644
> --- a/test/dsa_prep.c
> +++ b/test/dsa_prep.c
> @@ -6,6 +6,7 @@
>   #include <stdlib.h>
>   #include <unistd.h>
>   #include <accfg/idxd.h>
> +#include "idxd_test.h"
>   #include "accel_test.h"
>   #include "dsa.h"
>   =

> @@ -16,7 +17,7 @@ void dsa_prep_noop(struct task *tsk)
>   	info("preparing descriptor for noop\n");
>   =

>   	tsk->dflags =3D IDXD_OP_FLAG_CRAV | IDXD_OP_FLAG_RCR;
> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
> +	acctest_prep_desc_common((struct hw_desc *)tsk->desc, tsk->opcode, (uin=
t64_t)(tsk->dst1),
>   				 (uint64_t)(tsk->src1), 0, tsk->dflags);
>   	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
>   	tsk->comp->status =3D 0;
> @@ -29,7 +30,7 @@ void dsa_prep_drain(struct task *tsk)
>   	if (tsk->opcode =3D=3D DSA_OPCODE_MEMMOVE)
>   		tsk->opcode =3D DSA_OPCODE_DRAIN;
>   =

> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
> +	acctest_prep_desc_common((struct hw_desc *)tsk->desc, tsk->opcode, (uin=
t64_t)(tsk->dst1),
>   				 (uint64_t)(tsk->src1), 0, tsk->dflags);
>   	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
>   	tsk->comp->status =3D 0;
> @@ -42,7 +43,7 @@ void dsa_prep_memcpy(struct task *tsk)
>   	if (tsk->opcode =3D=3D DSA_OPCODE_DRAIN)
>   		tsk->opcode =3D DSA_OPCODE_MEMMOVE;
>   =

> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
> +	acctest_prep_desc_common((struct hw_desc *)tsk->desc, tsk->opcode, (uin=
t64_t)(tsk->dst1),
>   				 (uint64_t)(tsk->src1), tsk->xfer_size, tsk->dflags);
>   	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
>   	tsk->comp->status =3D 0;
> @@ -50,8 +51,8 @@ void dsa_prep_memcpy(struct task *tsk)
>   =

>   void dsa_reprep_memcpy(struct acctest_context *ctx, struct task *tsk)
>   {
> -	struct completion_record *compl =3D tsk->comp;
> -	struct hw_desc *hw =3D tsk->desc;
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
>   =

>   	info("PF addr %#lx dir %d bc %#x\n",
>   	     compl->fault_addr, compl->result,
> @@ -68,7 +69,7 @@ void dsa_reprep_memcpy(struct acctest_context *ctx, str=
uct task *tsk)
>   =

>   	compl->status =3D 0;
>   =

> -	acctest_desc_submit(ctx, hw);
> +	acctest_desc_submit(ctx, (struct hw_desc *)hw);
>   }
>   =

>   void dsa_prep_batch_noop(struct batch_task *btsk)
> @@ -79,7 +80,7 @@ void dsa_prep_batch_noop(struct batch_task *btsk)
>   =

>   	for (i =3D 0; i < btsk->task_num; i++) {
>   		sub_task =3D &btsk->sub_tasks[i];
> -		acctest_prep_desc_common(sub_task->desc, sub_task->opcode,
> +		acctest_prep_desc_common((struct hw_desc *)sub_task->desc, sub_task->o=
pcode,
>   					 (uint64_t)(sub_task->dst1),
>   					 (uint64_t)(sub_task->src1),
>   					 0, dflags);
> @@ -96,7 +97,7 @@ void dsa_prep_batch_memcpy(struct batch_task *btsk)
>   =

>   	for (i =3D 0; i < btsk->task_num; i++) {
>   		sub_task =3D &btsk->sub_tasks[i];
> -		acctest_prep_desc_common(sub_task->desc, sub_task->opcode,
> +		acctest_prep_desc_common((struct hw_desc *)sub_task->desc, sub_task->o=
pcode,
>   					 (uint64_t)(sub_task->dst1),
>   					 (uint64_t)(sub_task->src1),
>   					 sub_task->xfer_size, sub_task->dflags);
> @@ -110,7 +111,7 @@ void dsa_prep_memfill(struct task *tsk)
>   	info("preparing descriptor for memfill\n");
>   =

>   	/* src_addr is the location of pattern for memfill descriptor */
> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
> +	acctest_prep_desc_common((struct hw_desc *)tsk->desc, tsk->opcode, (uin=
t64_t)(tsk->dst1),
>   				 tsk->pattern, tsk->xfer_size, tsk->dflags);
>   	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
>   	tsk->comp->status =3D 0;
> @@ -118,8 +119,8 @@ void dsa_prep_memfill(struct task *tsk)
>   =

>   void dsa_reprep_memfill(struct acctest_context *ctx, struct task *tsk)
>   {
> -	struct completion_record *compl =3D tsk->comp;
> -	struct hw_desc *hw =3D tsk->desc;
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
>   =

>   	info("PF addr %#lx dir %d bc %#x\n",
>   	     compl->fault_addr, compl->result,
> @@ -133,7 +134,7 @@ void dsa_reprep_memfill(struct acctest_context *ctx, =
struct task *tsk)
>   =

>   	compl->status =3D 0;
>   =

> -	acctest_desc_submit(ctx, hw);
> +	acctest_desc_submit(ctx, (struct hw_desc *)hw);
>   }
>   =

>   void dsa_prep_batch_memfill(struct batch_task *btsk)
> @@ -143,7 +144,7 @@ void dsa_prep_batch_memfill(struct batch_task *btsk)
>   =

>   	for (i =3D 0; i < btsk->task_num; i++) {
>   		sub_task =3D &btsk->sub_tasks[i];
> -		acctest_prep_desc_common(sub_task->desc, sub_task->opcode,
> +		acctest_prep_desc_common((struct hw_desc *)sub_task->desc, sub_task->o=
pcode,
>   					 (uint64_t)(sub_task->dst1),
>   					 sub_task->pattern,
>   					 sub_task->xfer_size,
> @@ -157,7 +158,7 @@ void dsa_prep_compare(struct task *tsk)
>   {
>   	info("preparing descriptor for compare\n");
>   =

> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->src1),
> +	acctest_prep_desc_common((struct hw_desc *)tsk->desc, tsk->opcode, (uin=
t64_t)(tsk->src1),
>   				 (uint64_t)(tsk->src2), tsk->xfer_size, tsk->dflags);
>   	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
>   	tsk->comp->status =3D 0;
> @@ -165,8 +166,8 @@ void dsa_prep_compare(struct task *tsk)
>   =

>   void dsa_reprep_compare(struct acctest_context *ctx, struct task *tsk)
>   {
> -	struct completion_record *compl =3D tsk->comp;
> -	struct hw_desc *hw =3D tsk->desc;
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
>   =

>   	info("PF addr %#lx dir %d bc %#x\n",
>   	     compl->fault_addr, compl->result,
> @@ -181,7 +182,7 @@ void dsa_reprep_compare(struct acctest_context *ctx, =
struct task *tsk)
>   =

>   	compl->status =3D 0;
>   =

> -	acctest_desc_submit(ctx, hw);
> +	acctest_desc_submit(ctx, (struct hw_desc *)hw);
>   }
>   =

>   void dsa_prep_batch_compare(struct batch_task *btsk)
> @@ -191,7 +192,7 @@ void dsa_prep_batch_compare(struct batch_task *btsk)
>   =

>   	for (i =3D 0; i < btsk->task_num; i++) {
>   		sub_task =3D &btsk->sub_tasks[i];
> -		acctest_prep_desc_common(sub_task->desc, sub_task->opcode,
> +		acctest_prep_desc_common((struct hw_desc *)sub_task->desc, sub_task->o=
pcode,
>   					 (uint64_t)(sub_task->src1),
>   					 (uint64_t)(sub_task->src2),
>   					 sub_task->xfer_size,
> @@ -205,7 +206,7 @@ void dsa_prep_compval(struct task *tsk)
>   {
>   	info("preparing descriptor for compval\n");
>   =

> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, tsk->pattern,
> +	acctest_prep_desc_common((struct hw_desc *)tsk->desc, tsk->opcode, tsk-=
>pattern,
>   				 (uint64_t)(tsk->src1), tsk->xfer_size, tsk->dflags);
>   	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
>   	tsk->comp->status =3D 0;
> @@ -213,8 +214,8 @@ void dsa_prep_compval(struct task *tsk)
>   =

>   void dsa_reprep_compval(struct acctest_context *ctx, struct task *tsk)
>   {
> -	struct completion_record *compl =3D tsk->comp;
> -	struct hw_desc *hw =3D tsk->desc;
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
>   =

>   	info("PF addr %#lx dir %d bc %#x\n",
>   	     compl->fault_addr, compl->result,
> @@ -228,7 +229,7 @@ void dsa_reprep_compval(struct acctest_context *ctx, =
struct task *tsk)
>   =

>   	compl->status =3D 0;
>   =

> -	acctest_desc_submit(ctx, hw);
> +	acctest_desc_submit(ctx, (struct hw_desc *)hw);
>   }
>   =

>   void dsa_prep_batch_compval(struct batch_task *btsk)
> @@ -238,7 +239,7 @@ void dsa_prep_batch_compval(struct batch_task *btsk)
>   =

>   	for (i =3D 0; i < btsk->task_num; i++) {
>   		sub_task =3D &btsk->sub_tasks[i];
> -		acctest_prep_desc_common(sub_task->desc, sub_task->opcode,
> +		acctest_prep_desc_common((struct hw_desc *)sub_task->desc, sub_task->o=
pcode,
>   					 sub_task->pattern,
>   					 (uint64_t)(sub_task->src1),
>   					 sub_task->xfer_size,
> @@ -250,19 +251,22 @@ void dsa_prep_batch_compval(struct batch_task *btsk)
>   =

>   void dsa_prep_dualcast(struct task *tsk)
>   {
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
> +
>   	info("preparing descriptor for dualcast\n");
>   =

> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
> +	acctest_prep_desc_common((struct hw_desc *)hw, tsk->opcode, (uint64_t)(=
tsk->dst1),
>   				 (uint64_t)(tsk->src1), tsk->xfer_size, tsk->dflags);
> -	tsk->desc->dest2 =3D (uint64_t)(tsk->dst2);
> -	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
> -	tsk->comp->status =3D 0;
> +	hw->dest2 =3D (uint64_t)(tsk->dst2);
> +	hw->completion_addr =3D (uint64_t)(compl);
> +	compl->status =3D 0;
>   }
>   =

>   void dsa_reprep_dualcast(struct acctest_context *ctx, struct task *tsk)
>   {
> -	struct completion_record *compl =3D tsk->comp;
> -	struct hw_desc *hw =3D tsk->desc;
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
>   =

>   	info("PF addr %#lx dir %d bc %#x\n",
>   	     compl->fault_addr, compl->result,
> @@ -278,24 +282,28 @@ void dsa_reprep_dualcast(struct acctest_context *ct=
x, struct task *tsk)
>   =

>   	compl->status =3D 0;
>   =

> -	acctest_desc_submit(ctx, hw);
> +	acctest_desc_submit(ctx, (struct hw_desc *)hw);
>   }
>   =

>   void dsa_prep_batch_dualcast(struct batch_task *btsk)
>   {
>   	int i;
>   	struct task *sub_task;
> +	struct dsa_completion_record *compl;
> +	struct dsa_hw_desc *hw;
>   =

>   	for (i =3D 0; i < btsk->task_num; i++) {
>   		sub_task =3D &btsk->sub_tasks[i];
> -		acctest_prep_desc_common(sub_task->desc, sub_task->opcode,
> +		compl =3D (struct dsa_completion_record *)sub_task->comp;
> +		hw =3D (struct dsa_hw_desc *)sub_task->desc;
> +		acctest_prep_desc_common((struct hw_desc *)hw, sub_task->opcode,
>   					 (uint64_t)(sub_task->dst1),
>   					 (uint64_t)(sub_task->src1),
>   					 sub_task->xfer_size,
>   					 sub_task->dflags);
> -		sub_task->desc->dest2 =3D (uint64_t)(sub_task->dst2);
> -		sub_task->desc->completion_addr =3D (uint64_t)(sub_task->comp);
> -		sub_task->comp->status =3D 0;
> +		hw->dest2 =3D (uint64_t)(sub_task->dst2);
> +		hw->completion_addr =3D (uint64_t)(compl);
> +		compl->status =3D 0;
>   	}
>   }
>   =

> @@ -303,43 +311,50 @@ void dsa_prep_batch_cr_delta(struct batch_task *bts=
k)
>   {
>   	int i;
>   	struct task *sub_task;
> +	struct dsa_completion_record *compl;
> +	struct dsa_hw_desc *hw;
>   =

>   	for (i =3D 0; i < btsk->task_num; i++) {
>   		sub_task =3D &btsk->sub_tasks[i];
> +		compl =3D (struct dsa_completion_record *)sub_task->comp;
> +		hw =3D (struct dsa_hw_desc *)sub_task->desc;
>   		if (sub_task->opcode =3D=3D DSA_OPCODE_AP_DELTA)
>   			sub_task->opcode =3D DSA_OPCODE_CR_DELTA;
> -		acctest_prep_desc_common(sub_task->desc, sub_task->opcode,
> +		acctest_prep_desc_common((struct hw_desc *)hw, sub_task->opcode,
>   					 (uint64_t)(sub_task->src2),
>   					 (uint64_t)(sub_task->src1),
>   					 sub_task->xfer_size,
>   					 sub_task->dflags);
> -		sub_task->desc->completion_addr =3D (uint64_t)(sub_task->comp);
> -		sub_task->desc->delta_addr =3D (uint64_t)sub_task->delta1;
> -		sub_task->desc->max_delta_size =3D 2 * sub_task->xfer_size;
> -		sub_task->comp->status =3D 0;
> +		hw->completion_addr =3D (uint64_t)(compl);
> +		hw->delta_addr =3D (uint64_t)sub_task->delta1;
> +		hw->max_delta_size =3D 2 * sub_task->xfer_size;
> +		compl->status =3D 0;
>   	}
>   }
>   =

>   void dsa_prep_cr_delta(struct task *tsk)
>   {
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
> +
>   	info("preparing descriptor for cr delta\n");
>   =

>   	if (tsk->opcode =3D=3D DSA_OPCODE_AP_DELTA)
>   		tsk->opcode =3D DSA_OPCODE_CR_DELTA;
> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->src2),
> +	acctest_prep_desc_common((struct hw_desc *)hw, tsk->opcode, (uint64_t)(=
tsk->src2),
>   				 (uint64_t)(tsk->src1), tsk->xfer_size, tsk->dflags);
> -	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
> -	tsk->desc->max_delta_size =3D 2 * tsk->xfer_size;//need to made configu=
rable
> -	tsk->desc->delta_addr =3D (uint64_t)tsk->delta1;
> -	if (tsk->desc->max_delta_size < MIN_DELTA_RECORD_SIZE)
> -		tsk->desc->max_delta_size =3D MIN_DELTA_RECORD_SIZE;
> -	tsk->comp->status =3D 0;
> +	hw->completion_addr =3D (uint64_t)(compl);
> +	hw->max_delta_size =3D 2 * tsk->xfer_size;//need to made configurable
> +	hw->delta_addr =3D (uint64_t)tsk->delta1;
> +	if (hw->max_delta_size < MIN_DELTA_RECORD_SIZE)
> +		hw->max_delta_size =3D MIN_DELTA_RECORD_SIZE;
> +	compl->status =3D 0;
>   }
>   =

>   void dsa_reprep_cr_delta(struct acctest_context *ctx, struct task *tsk)
>   {
> -	struct completion_record *compl =3D tsk->comp;
> -	struct hw_desc *hw =3D tsk->desc;
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
>   =

>   	info("PF addr %#lx dir %d bc %#x\n",
>   	     compl->fault_addr, compl->result,
> @@ -354,28 +369,31 @@ void dsa_reprep_cr_delta(struct acctest_context *ct=
x, struct task *tsk)
>   =

>   	compl->status =3D 0;
>   =

> -	acctest_desc_submit(ctx, hw);
> +	acctest_desc_submit(ctx, (struct hw_desc *)hw);
>   }
>   =

>   void dsa_prep_ap_delta(struct task *tsk)
>   {
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
> +
>   	info("preparing descriptor for ap delta\n");
>   =

>   	if (tsk->opcode =3D=3D DSA_OPCODE_CR_DELTA)
>   		tsk->opcode =3D DSA_OPCODE_AP_DELTA;
> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
> +	acctest_prep_desc_common((struct hw_desc *)hw, tsk->opcode, (uint64_t)(=
tsk->dst1),
>   				 (uint64_t)(tsk->delta1), tsk->xfer_size, tsk->dflags);
> -	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
> -	tsk->desc->delta_addr =3D 0;
> -	tsk->desc->delta_rec_size =3D tsk->comp->delta_rec_size;
> -	tsk->desc->max_delta_size =3D 0;
> -	tsk->comp->status =3D 0;
> +	hw->completion_addr =3D (uint64_t)(compl);
> +	hw->delta_addr =3D 0;
> +	hw->delta_rec_size =3D compl->delta_rec_size;
> +	hw->max_delta_size =3D 0;
> +	compl->status =3D 0;
>   }
>   =

>   void dsa_reprep_ap_delta(struct acctest_context *ctx, struct task *tsk)
>   {
> -	struct completion_record *compl =3D tsk->comp;
> -	struct hw_desc *hw =3D tsk->desc;
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
>   =

>   	info("PF addr %#lx dir %d bc %#x\n",
>   	     compl->fault_addr, compl->result,
> @@ -390,47 +408,54 @@ void dsa_reprep_ap_delta(struct acctest_context *ct=
x, struct task *tsk)
>   =

>   	compl->status =3D 0;
>   =

> -	acctest_desc_submit(ctx, hw);
> +	acctest_desc_submit(ctx, (struct hw_desc *)hw);
>   }
>   =

>   void dsa_prep_batch_ap_delta(struct batch_task *btsk)
>   {
>   	int i;
>   	struct task *sub_task;
> +	struct dsa_completion_record *compl;
> +	struct dsa_hw_desc *hw;
>   =

>   	for (i =3D 0; i < btsk->task_num; i++) {
>   		sub_task =3D &btsk->sub_tasks[i];
> +		compl =3D (struct dsa_completion_record *)sub_task->comp;
> +		hw =3D (struct dsa_hw_desc *)sub_task->desc;
>   		if (sub_task->opcode =3D=3D DSA_OPCODE_CR_DELTA)
>   			sub_task->opcode =3D DSA_OPCODE_AP_DELTA;
> -		acctest_prep_desc_common(sub_task->desc, sub_task->opcode,
> +		acctest_prep_desc_common((struct hw_desc *)hw, sub_task->opcode,
>   					 (uint64_t)(sub_task->dst1),
>   					 (uint64_t)(sub_task->delta1),
>   					 sub_task->xfer_size,
>   					 sub_task->dflags);
> -		sub_task->desc->completion_addr =3D (uint64_t)(sub_task->comp);
> -		sub_task->desc->delta_addr =3D 0;
> -		sub_task->desc->delta_rec_size =3D sub_task->comp->delta_rec_size;
> -		sub_task->desc->max_delta_size =3D 0;
> -		sub_task->comp->status =3D 0;
> +		hw->completion_addr =3D (uint64_t)(compl);
> +		hw->delta_addr =3D 0;
> +		hw->delta_rec_size =3D compl->delta_rec_size;
> +		hw->max_delta_size =3D 0;
> +		compl->status =3D 0;
>   	}
>   }
>   =

>   void dsa_prep_crcgen(struct task *tsk)
>   {
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
> +
>   	info("preparing descriptor for crcgen\n");
>   =

> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
> +	acctest_prep_desc_common((struct hw_desc *)hw, tsk->opcode, (uint64_t)(=
tsk->dst1),
>   				 (uint64_t)(tsk->src1), tsk->xfer_size, tsk->dflags);
> -	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
> -	tsk->comp->status =3D 0;
> -	tsk->desc->crc_seed =3D tsk->crc_seed;
> -	tsk->desc->seed_addr =3D (uint64_t)tsk->crc_seed_addr;
> +	hw->completion_addr =3D (uint64_t)(compl);
> +	compl->status =3D 0;
> +	hw->crc_seed =3D tsk->crc_seed;
> +	hw->seed_addr =3D (uint64_t)tsk->crc_seed_addr;
>   }
>   =

>   void dsa_reprep_crcgen(struct acctest_context *ctx, struct task *tsk)
>   {
> -	struct completion_record *compl =3D tsk->comp;
> -	struct hw_desc *hw =3D tsk->desc;
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
>   =

>   	info("PF addr %#lx dir %d bc %#x\n",
>   	     compl->fault_addr, compl->result,
> @@ -444,43 +469,50 @@ void dsa_reprep_crcgen(struct acctest_context *ctx,=
 struct task *tsk)
>   =

>   	compl->status =3D 0;
>   =

> -	acctest_desc_submit(ctx, hw);
> +	acctest_desc_submit(ctx, (struct hw_desc *)hw);
>   }
>   =

>   void dsa_prep_batch_crcgen(struct batch_task *btsk)
>   {
>   	int i;
>   	struct task *sub_task;
> +	struct dsa_completion_record *compl;
> +	struct dsa_hw_desc *hw;
>   =

>   	for (i =3D 0; i < btsk->task_num; i++) {
>   		sub_task =3D &btsk->sub_tasks[i];
> -		acctest_prep_desc_common(sub_task->desc, sub_task->opcode,
> +		compl =3D (struct dsa_completion_record *)sub_task->comp;
> +		hw =3D (struct dsa_hw_desc *)sub_task->desc;
> +		acctest_prep_desc_common((struct hw_desc *)hw, sub_task->opcode,
>   					 (uint64_t)(sub_task->dst1),
>   					 (uint64_t)(sub_task->src1),
>   					 sub_task->xfer_size,
>   					 sub_task->dflags);
> -		sub_task->desc->completion_addr =3D (uint64_t)(sub_task->comp);
> -		sub_task->comp->status =3D 0;
> -		sub_task->desc->crc_seed =3D sub_task->crc_seed;
> +		hw->completion_addr =3D (uint64_t)(compl);
> +		compl->status =3D 0;
> +		hw->crc_seed =3D sub_task->crc_seed;
>   	}
>   }
>   =

>   void dsa_prep_crc_copy(struct task *tsk)
>   {
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
> +
>   	info("preparing descriptor for crc copy\n");
>   =

> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
> +	acctest_prep_desc_common((struct hw_desc *)hw, tsk->opcode, (uint64_t)(=
tsk->dst1),
>   				 (uint64_t)(tsk->src1), tsk->xfer_size, tsk->dflags);
> -	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
> -	tsk->comp->status =3D 0;
> -	tsk->desc->crc_seed =3D tsk->crc_seed;
> -	tsk->desc->seed_addr =3D (uint64_t)tsk->crc_seed_addr;
> +	hw->completion_addr =3D (uint64_t)(compl);
> +	compl->status =3D 0;
> +	hw->crc_seed =3D tsk->crc_seed;
> +	hw->seed_addr =3D (uint64_t)tsk->crc_seed_addr;
>   }
>   =

>   void dsa_reprep_crc_copy(struct acctest_context *ctx, struct task *tsk)
>   {
> -	struct completion_record *compl =3D tsk->comp;
> -	struct hw_desc *hw =3D tsk->desc;
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
>   =

>   	info("PF addr %#lx dir %d bc %#x\n",
>   	     compl->fault_addr, compl->result,
> @@ -495,87 +527,103 @@ void dsa_reprep_crc_copy(struct acctest_context *c=
tx, struct task *tsk)
>   =

>   	compl->status =3D 0;
>   =

> -	acctest_desc_submit(ctx, hw);
> +	acctest_desc_submit(ctx, (struct hw_desc *)hw);
>   }
>   =

>   void dsa_prep_batch_crc_copy(struct batch_task *btsk)
>   {
>   	int i;
>   	struct task *sub_task;
> +	struct dsa_completion_record *compl;
> +	struct dsa_hw_desc *hw;
>   =

>   	for (i =3D 0; i < btsk->task_num; i++) {
>   		sub_task =3D &btsk->sub_tasks[i];
> -		acctest_prep_desc_common(sub_task->desc, sub_task->opcode,
> +		compl =3D (struct dsa_completion_record *)sub_task->comp;
> +		hw =3D (struct dsa_hw_desc *)sub_task->desc;
> +		acctest_prep_desc_common((struct hw_desc *)hw, sub_task->opcode,
>   					 (uint64_t)(sub_task->dst1),
>   					 (uint64_t)(sub_task->src1),
>   					 sub_task->xfer_size,
>   					 sub_task->dflags);
> -		sub_task->desc->completion_addr =3D (uint64_t)(sub_task->comp);
> -		sub_task->comp->status =3D 0;
> -		sub_task->desc->crc_seed =3D sub_task->crc_seed;
> +		hw->completion_addr =3D (uint64_t)(compl);
> +		compl->status =3D 0;
> +		hw->crc_seed =3D sub_task->crc_seed;
>   	}
>   }
>   =

>   void dsa_prep_dif_check(struct task *tsk)
>   {
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
> +
>   	info("preparing descriptor for dif check\n");
>   =

> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
> +	acctest_prep_desc_common((struct hw_desc *)hw, tsk->opcode, (uint64_t)(=
tsk->dst1),
>   				 (uint64_t)(tsk->src1), tsk->xfer_size, tsk->dflags);
> -	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
> -	tsk->comp->status =3D 0;
> -	tsk->desc->chk_app_tag_seed =3D tsk->apptag;
> -	tsk->desc->chk_ref_tag_seed =3D tsk->reftag;
> -	tsk->desc->dif_chk_flags =3D tsk->blk_idx_flg;
> +	hw->completion_addr =3D (uint64_t)(compl);
> +	compl->status =3D 0;
> +	hw->chk_app_tag_seed =3D tsk->apptag;
> +	hw->chk_ref_tag_seed =3D tsk->reftag;
> +	hw->dif_chk_flags =3D tsk->blk_idx_flg;
>   }
>   =

>   void dsa_prep_dif_insert(struct task *tsk)
>   {
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
> +
>   	info("preparing descriptor for dif insert\n");
>   =

> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
> +	acctest_prep_desc_common((struct hw_desc *)hw, tsk->opcode, (uint64_t)(=
tsk->dst1),
>   				 (uint64_t)(tsk->src1), tsk->xfer_size, tsk->dflags);
> -	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
> -	tsk->comp->status =3D 0;
> -	tsk->desc->ins_app_tag_seed =3D tsk->apptag;
> -	tsk->desc->ins_ref_tag_seed =3D tsk->reftag;
> -	tsk->desc->dif_ins_flags =3D tsk->blk_idx_flg;
> +	hw->completion_addr =3D (uint64_t)(compl);
> +	compl->status =3D 0;
> +	hw->ins_app_tag_seed =3D tsk->apptag;
> +	hw->ins_ref_tag_seed =3D tsk->reftag;
> +	hw->dif_ins_flags =3D tsk->blk_idx_flg;
>   }
>   =

>   void dsa_prep_dif_strip(struct task *tsk)
>   {
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
> +
>   	info("preparing descriptor for dif strip\n");
>   =

> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
> +	acctest_prep_desc_common((struct hw_desc *)hw, tsk->opcode, (uint64_t)(=
tsk->dst1),
>   				 (uint64_t)(tsk->src1), tsk->xfer_size, tsk->dflags);
> -	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
> -	tsk->comp->status =3D 0;
> -	tsk->desc->chk_app_tag_seed =3D tsk->apptag;
> -	tsk->desc->chk_ref_tag_seed =3D tsk->reftag;
> -	tsk->desc->dif_chk_flags =3D tsk->blk_idx_flg;
> +	hw->completion_addr =3D (uint64_t)(compl);
> +	compl->status =3D 0;
> +	hw->chk_app_tag_seed =3D tsk->apptag;
> +	hw->chk_ref_tag_seed =3D tsk->reftag;
> +	hw->dif_chk_flags =3D tsk->blk_idx_flg;
>   }
>   =

>   void dsa_prep_dif_update(struct task *tsk)
>   {
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
> +
>   	info("preparing descriptor for dif update\n");
>   =

> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
> +	acctest_prep_desc_common((struct hw_desc *)hw, tsk->opcode, (uint64_t)(=
tsk->dst1),
>   				 (uint64_t)(tsk->src1), tsk->xfer_size, tsk->dflags);
> -	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
> -	tsk->comp->status =3D 0;
> -	tsk->desc->src_app_tag_seed =3D tsk->apptag;
> -	tsk->desc->src_ref_tag_seed =3D tsk->reftag;
> -	tsk->desc->dest_ref_tag_seed =3D tsk->reftag;
> -	tsk->desc->dest_app_tag_seed =3D tsk->apptag;
> -	tsk->desc->src_upd_flags =3D 0x80;
> -	tsk->desc->upd_dest_flags =3D 0x80;
> -	tsk->desc->dif_upd_flags =3D tsk->blk_idx_flg;
> +	hw->completion_addr =3D (uint64_t)(compl);
> +	compl->status =3D 0;
> +	hw->src_app_tag_seed =3D tsk->apptag;
> +	hw->src_ref_tag_seed =3D tsk->reftag;
> +	hw->dest_ref_tag_seed =3D tsk->reftag;
> +	hw->dest_app_tag_seed =3D tsk->apptag;
> +	hw->src_upd_flags =3D 0x80;
> +	hw->upd_dest_flags =3D 0x80;
> +	hw->dif_upd_flags =3D tsk->blk_idx_flg;
>   }
>   =

>   void dsa_reprep_dif(struct acctest_context *ctx, struct task *tsk)
>   {
> -	struct completion_record *compl =3D tsk->comp;
> -	struct hw_desc *hw =3D tsk->desc;
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
>   	unsigned long blks_completed =3D 0;
>   =

>   	info("PF addr %#lx dir %d bc %#x\n",
> @@ -620,25 +668,29 @@ void dsa_reprep_dif(struct acctest_context *ctx, st=
ruct task *tsk)
>   =

>   	compl->status =3D 0;
>   =

> -	acctest_desc_submit(ctx, hw);
> +	acctest_desc_submit(ctx, (struct hw_desc *)hw);
>   }
>   =

>   void dsa_prep_batch_dif_check(struct batch_task *btsk)
>   {
>   	int i;
>   	struct task *sub_task;
> +	struct dsa_completion_record *compl;
> +	struct dsa_hw_desc *hw;
>   =

>   	for (i =3D 0; i < btsk->task_num; i++) {
>   		sub_task =3D &btsk->sub_tasks[i];
> +		compl =3D (struct dsa_completion_record *)sub_task->comp;
> +		hw =3D (struct dsa_hw_desc *)sub_task->desc;
>   		sub_task->xfer_size =3D btsk->sub_tasks[i].xfer_size;
> -		sub_task->desc->dif_chk_flags =3D btsk->sub_tasks[i].blk_idx_flg;
> -		acctest_prep_desc_common(sub_task->desc, sub_task->opcode,
> +		hw->dif_chk_flags =3D btsk->sub_tasks[i].blk_idx_flg;
> +		acctest_prep_desc_common((struct hw_desc *)hw, sub_task->opcode,
>   					 (uint64_t)(sub_task->dst1), (uint64_t)(sub_task->src1),
>   					 sub_task->xfer_size, sub_task->dflags);
> -		sub_task->desc->completion_addr =3D (uint64_t)(sub_task->comp);
> -		sub_task->comp->status =3D 0;
> -		sub_task->desc->chk_app_tag_seed =3D sub_task->apptag;
> -		sub_task->desc->chk_ref_tag_seed =3D sub_task->reftag;
> +		hw->completion_addr =3D (uint64_t)(compl);
> +		compl->status =3D 0;
> +		hw->chk_app_tag_seed =3D sub_task->apptag;
> +		hw->chk_ref_tag_seed =3D sub_task->reftag;
>   	}
>   }
>   =

> @@ -646,18 +698,22 @@ void dsa_prep_batch_dif_insert(struct batch_task *b=
tsk)
>   {
>   	int i;
>   	struct task *sub_task;
> +	struct dsa_completion_record *compl;
> +	struct dsa_hw_desc *hw;
>   =

>   	for (i =3D 0; i < btsk->task_num; i++) {
>   		sub_task =3D &btsk->sub_tasks[i];
> +		compl =3D (struct dsa_completion_record *)sub_task->comp;
> +		hw =3D (struct dsa_hw_desc *)sub_task->desc;
>   		sub_task->xfer_size =3D btsk->sub_tasks[i].xfer_size;
> -		sub_task->desc->dif_chk_flags =3D btsk->sub_tasks[i].blk_idx_flg;
> -		acctest_prep_desc_common(sub_task->desc, sub_task->opcode,
> +		hw->dif_chk_flags =3D btsk->sub_tasks[i].blk_idx_flg;
> +		acctest_prep_desc_common((struct hw_desc *)hw, sub_task->opcode,
>   					 (uint64_t)(sub_task->dst1), (uint64_t)(sub_task->src1),
>   					 sub_task->xfer_size, sub_task->dflags);
> -		sub_task->desc->completion_addr =3D (uint64_t)(sub_task->comp);
> -		sub_task->comp->status =3D 0;
> -		sub_task->desc->ins_app_tag_seed =3D sub_task->apptag;
> -		sub_task->desc->ins_ref_tag_seed =3D sub_task->reftag;
> +		hw->completion_addr =3D (uint64_t)(compl);
> +		compl->status =3D 0;
> +		hw->ins_app_tag_seed =3D sub_task->apptag;
> +		hw->ins_ref_tag_seed =3D sub_task->reftag;
>   	}
>   }
>   =

> @@ -665,18 +721,22 @@ void dsa_prep_batch_dif_strip(struct batch_task *bt=
sk)
>   {
>   	int i;
>   	struct task *sub_task;
> +	struct dsa_completion_record *compl;
> +	struct dsa_hw_desc *hw;
>   =

>   	for (i =3D 0; i < btsk->task_num; i++) {
>   		sub_task =3D &btsk->sub_tasks[i];
> +		compl =3D (struct dsa_completion_record *)sub_task->comp;
> +		hw =3D (struct dsa_hw_desc *)sub_task->desc;
>   		sub_task->xfer_size =3D btsk->sub_tasks[i].xfer_size;
> -		sub_task->desc->dif_chk_flags =3D btsk->sub_tasks[i].blk_idx_flg;
> -		acctest_prep_desc_common(sub_task->desc, sub_task->opcode,
> +		hw->dif_chk_flags =3D btsk->sub_tasks[i].blk_idx_flg;
> +		acctest_prep_desc_common((struct hw_desc *)hw, sub_task->opcode,
>   					 (uint64_t)(sub_task->dst1), (uint64_t)(sub_task->src1),
>   					 sub_task->xfer_size, sub_task->dflags);
> -		sub_task->desc->completion_addr =3D (uint64_t)(sub_task->comp);
> -		sub_task->comp->status =3D 0;
> -		sub_task->desc->chk_app_tag_seed =3D sub_task->apptag;
> -		sub_task->desc->chk_ref_tag_seed =3D sub_task->reftag;
> +		hw->completion_addr =3D (uint64_t)(compl);
> +		compl->status =3D 0;
> +		hw->chk_app_tag_seed =3D sub_task->apptag;
> +		hw->chk_ref_tag_seed =3D sub_task->reftag;
>   	}
>   }
>   =

> @@ -684,22 +744,26 @@ void dsa_prep_batch_dif_update(struct batch_task *b=
tsk)
>   {
>   	int i;
>   	struct task *sub_task;
> +	struct dsa_completion_record *compl;
> +	struct dsa_hw_desc *hw;
>   =

>   	for (i =3D 0; i < btsk->task_num; i++) {
>   		sub_task =3D &btsk->sub_tasks[i];
> +		compl =3D (struct dsa_completion_record *)sub_task->comp;
> +		hw =3D (struct dsa_hw_desc *)sub_task->desc;
>   		sub_task->xfer_size =3D btsk->sub_tasks[i].xfer_size;
> -		sub_task->desc->dif_chk_flags =3D btsk->sub_tasks[i].blk_idx_flg;
> -		acctest_prep_desc_common(sub_task->desc, sub_task->opcode,
> +		hw->dif_chk_flags =3D btsk->sub_tasks[i].blk_idx_flg;
> +		acctest_prep_desc_common((struct hw_desc *)hw, sub_task->opcode,
>   					 (uint64_t)(sub_task->dst1), (uint64_t)(sub_task->src1),
>   					 sub_task->xfer_size, sub_task->dflags);
> -		sub_task->desc->completion_addr =3D (uint64_t)(sub_task->comp);
> -		sub_task->comp->status =3D 0;
> -		sub_task->desc->src_app_tag_seed =3D sub_task->apptag;
> -		sub_task->desc->src_ref_tag_seed =3D sub_task->reftag;
> -		sub_task->desc->dest_ref_tag_seed =3D sub_task->reftag;
> -		sub_task->desc->dest_app_tag_seed =3D sub_task->apptag;
> -		sub_task->desc->src_upd_flags =3D 0x80;
> -		sub_task->desc->upd_dest_flags =3D 0x80;
> +		hw->completion_addr =3D (uint64_t)(compl);
> +		compl->status =3D 0;
> +		hw->src_app_tag_seed =3D sub_task->apptag;
> +		hw->src_ref_tag_seed =3D sub_task->reftag;
> +		hw->dest_ref_tag_seed =3D sub_task->reftag;
> +		hw->dest_app_tag_seed =3D sub_task->apptag;
> +		hw->src_upd_flags =3D 0x80;
> +		hw->upd_dest_flags =3D 0x80;
>   	}
>   }
>   =

> @@ -707,7 +771,7 @@ void dsa_prep_cflush(struct task *tsk)
>   {
>   	info("preparing descriptor for cflush\n");
>   =

> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
> +	acctest_prep_desc_common((struct hw_desc *)tsk->desc, tsk->opcode, (uin=
t64_t)(tsk->dst1),
>   				 (uint64_t)(tsk->src1), tsk->xfer_size, tsk->dflags);
>   	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
>   	tsk->comp->status =3D 0;
> @@ -715,8 +779,8 @@ void dsa_prep_cflush(struct task *tsk)
>   =

>   void dsa_reprep_cflush(struct acctest_context *ctx, struct task *tsk)
>   {
> -	struct completion_record *compl =3D tsk->comp;
> -	struct hw_desc *hw =3D tsk->desc;
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)tsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)tsk->desc;
>   =

>   	info("PF addr %#lx dir %d bc %#x\n",
>   	     compl->fault_addr, compl->result,
> @@ -730,7 +794,7 @@ void dsa_reprep_cflush(struct acctest_context *ctx, s=
truct task *tsk)
>   =

>   	compl->status =3D 0;
>   =

> -	acctest_desc_submit(ctx, hw);
> +	acctest_desc_submit(ctx, (struct hw_desc *)hw);
>   }
>   =

>   void dsa_prep_batch_cflush(struct batch_task *btsk)
> @@ -740,7 +804,7 @@ void dsa_prep_batch_cflush(struct batch_task *btsk)
>   =

>   	for (i =3D 0; i < btsk->task_num; i++) {
>   		sub_task =3D &btsk->sub_tasks[i];
> -		acctest_prep_desc_common(sub_task->desc, sub_task->opcode,
> +		acctest_prep_desc_common((struct hw_desc *)sub_task->desc, sub_task->o=
pcode,
>   					 (uint64_t)(sub_task->dst1),
>   					 (uint64_t)(sub_task->src1),
>   					 sub_task->xfer_size, sub_task->dflags);
> @@ -752,17 +816,19 @@ void dsa_prep_batch_cflush(struct batch_task *btsk)
>   void dsa_prep_batch(struct batch_task *btsk, unsigned long desc_flags)
>   {
>   	struct task *ctsk =3D btsk->core_task;
> +	struct dsa_completion_record *compl =3D (struct dsa_completion_record *=
)ctsk->comp;
> +	struct dsa_hw_desc *hw =3D (struct dsa_hw_desc *)ctsk->desc;
>   =

>   	info("preparing batch descriptor\n");
>   =

>   	/* BOF bit is reserved for batch descriptor, turn it off */
>   	desc_flags &=3D ~IDXD_OP_FLAG_BOF;
>   =

> -	acctest_prep_desc_common(ctsk->desc, DSA_OPCODE_BATCH,
> +	acctest_prep_desc_common((struct hw_desc *)hw, DSA_OPCODE_BATCH,
>   				 0, (uint64_t)(btsk->sub_descs),
>   				 btsk->task_num, desc_flags);
> -	ctsk->desc->completion_addr =3D (uint64_t)(ctsk->comp);
> -	ctsk->desc->desc_count =3D (uint32_t)(btsk->task_num);
> +	hw->completion_addr =3D (uint64_t)(compl);
> +	hw->desc_count =3D (uint32_t)(btsk->task_num);
>   =

> -	ctsk->comp->status =3D 0;
> +	compl->status =3D 0;
>   }
> diff --git a/test/iaa.c b/test/iaa.c
> index ad6c521..e22f952 100644
> --- a/test/iaa.c
> +++ b/test/iaa.c
> @@ -14,6 +14,7 @@
>   #include <linux/vfio.h>
>   #include <accfg/libaccel_config.h>
>   #include <accfg/idxd.h>
> +#include "idxd_test.h"
>   #include "accel_test.h"
>   #include "iaa.h"
>   #include "algorithms/iaa_crc64.h"
> @@ -226,16 +227,16 @@ int init_task(struct task *tsk, int tflags, int opc=
ode, unsigned long src1_xfer_
>   	case IAX_OPCODE_CRC64: /* intentionally empty */
>   		rc =3D init_crc64(tsk, tflags, opcode, src1_xfer_size);
>   		break;
> -	case IAX_OPCODE_ZCOMPRESS16:
> +	case IAX_OPCODE_ZERO_COMP_16:
>   		rc =3D init_zcompress16(tsk, tflags, opcode, src1_xfer_size);
>   		break;
> -	case IAX_OPCODE_ZDECOMPRESS16:
> +	case IAX_OPCODE_ZERO_DECOMP_16:
>   		rc =3D init_zdecompress16(tsk, tflags, opcode, src1_xfer_size);
>   		break;
> -	case IAX_OPCODE_ZCOMPRESS32:
> +	case IAX_OPCODE_ZERO_COMP_32:
>   		rc =3D init_zcompress32(tsk, tflags, opcode, src1_xfer_size);
>   		break;
> -	case IAX_OPCODE_ZDECOMPRESS32:
> +	case IAX_OPCODE_ZERO_DECOMP_32:
>   		rc =3D init_zdecompress32(tsk, tflags, opcode, src1_xfer_size);
>   		break;
>   	case IAX_OPCODE_COMPRESS:
> @@ -560,7 +561,8 @@ int iaa_compress_multi_task_nodes(struct acctest_cont=
ext *ctx)
>   		if ((tsk_node->tsk->test_flags & TEST_FLAGS_BOF) && ctx->bof)
>   			tsk_node->tsk->dflags |=3D IDXD_OP_FLAG_BOF;
>   =

> -		tsk_node->tsk->dflags |=3D (IDXD_OP_FLAG_WR_SRC2_CMPL | IDXD_OP_FLAG_R=
D_SRC2_AECS);
> +		tsk_node->tsk->dflags |=3D (IDXD_OP_FLAG_WR_SRC2_AECS_COMP |
> +					  IDXD_OP_FLAG_RD_SRC2_AECS);
>   		tsk_node->tsk->iaa_src2_xfer_size =3D IAA_COMPRESS_AECS_SIZE;
>   =

>   		memcpy(tsk_node->tsk->src2, (void *)iaa_compress_aecs, IAA_COMPRESS_A=
ECS_SIZE);
> @@ -618,7 +620,8 @@ int iaa_decompress_multi_task_nodes(struct acctest_co=
ntext *ctx)
>   		if ((tsk_node->tsk->test_flags & TEST_FLAGS_BOF) && ctx->bof)
>   			tsk_node->tsk->dflags |=3D IDXD_OP_FLAG_BOF;
>   =

> -		tsk_node->tsk->dflags |=3D (IDXD_OP_FLAG_WR_SRC2_CMPL | IDXD_OP_FLAG_R=
D_SRC2_AECS);
> +		tsk_node->tsk->dflags |=3D (IDXD_OP_FLAG_WR_SRC2_AECS_COMP |
> +					  IDXD_OP_FLAG_RD_SRC2_AECS);
>   		tsk_node->tsk->iaa_src2_xfer_size =3D IAA_COMPRESS_AECS_SIZE;
>   =

>   		memcpy(tsk_node->tsk->src2, (void *)iaa_compress_aecs, IAA_COMPRESS_A=
ECS_SIZE);
> @@ -655,18 +658,20 @@ int iaa_decompress_multi_task_nodes(struct acctest_=
context *ctx)
>   	// Decompress
>   	tsk_node =3D ctx->multi_task_node;
>   	while (tsk_node) {
> +		struct iax_test_completion_record *comp =3D
> +			(struct iax_test_completion_record *)tsk_node->tsk->comp;
>   		memset_pattern(tsk_node->tsk->src1, 0, tsk_node->tsk->xfer_size);
>   		memcpy(tsk_node->tsk->src1, tsk_node->tsk->dst1,
> -		       tsk_node->tsk->comp->iax_output_size);
> +		       comp->output_size);
>   =

>   		tsk_node->tsk->opcode =3D IAX_OPCODE_DECOMPRESS;
> -		tsk_node->tsk->xfer_size =3D tsk_node->tsk->comp->iax_output_size;
> +		tsk_node->tsk->xfer_size =3D comp->output_size;
>   =

>   		tsk_node->tsk->dflags |=3D (IDXD_OP_FLAG_CRAV | IDXD_OP_FLAG_RCR);
>   		if ((tsk_node->tsk->test_flags & TEST_FLAGS_BOF) && ctx->bof)
>   			tsk_node->tsk->dflags |=3D IDXD_OP_FLAG_BOF;
>   =

> -		tsk_node->tsk->dflags &=3D ~(IDXD_OP_FLAG_WR_SRC2_CMPL |
> +		tsk_node->tsk->dflags &=3D ~(IDXD_OP_FLAG_WR_SRC2_AECS_COMP |
>   					   IDXD_OP_FLAG_RD_SRC2_AECS);
>   		tsk_node->tsk->iaa_src2_xfer_size =3D 0;
>   		tsk_node->tsk->src2 =3D 0;
> @@ -715,16 +720,16 @@ int iaa_task_result_verify(struct task *tsk, int mi=
smatch_expected)
>   	case IAX_OPCODE_CRC64:
>   		ret =3D task_result_verify_crc64(tsk, mismatch_expected);
>   		break;
> -	case IAX_OPCODE_ZCOMPRESS16:
> +	case IAX_OPCODE_ZERO_COMP_16:
>   		ret =3D task_result_verify_zcompress16(tsk, mismatch_expected);
>   		break;
> -	case IAX_OPCODE_ZDECOMPRESS16:
> +	case IAX_OPCODE_ZERO_DECOMP_16:
>   		ret =3D task_result_verify_zdecompress16(tsk, mismatch_expected);
>   		break;
> -	case IAX_OPCODE_ZCOMPRESS32:
> +	case IAX_OPCODE_ZERO_COMP_32:
>   		ret =3D task_result_verify_zcompress32(tsk, mismatch_expected);
>   		break;
> -	case IAX_OPCODE_ZDECOMPRESS32:
> +	case IAX_OPCODE_ZERO_DECOMP_32:
>   		ret =3D task_result_verify_zdecompress32(tsk, mismatch_expected);
>   		break;
>   	case IAX_OPCODE_COMPRESS:
> @@ -759,6 +764,7 @@ int task_result_verify_crc64(struct task *tsk, int mi=
smatch_expected)
>   {
>   	int rc;
>   	uint64_t crc;
> +	struct iax_test_completion_record *comp =3D (struct iax_test_completion=
_record *)tsk->comp;
>   =

>   	if (mismatch_expected)
>   		warn("invalid arg mismatch_expected for %d\n", tsk->opcode);
> @@ -774,13 +780,13 @@ int task_result_verify_crc64(struct task *tsk, int =
mismatch_expected)
>   		return -EINVAL;
>   	}
>   =

> -	rc =3D memcmp((void *)(&tsk->comp->crc64_result), (void *)(&crc), sizeo=
f(uint64_t));
> +	rc =3D memcmp((void *)(&comp->crc64_result), (void *)(&crc), sizeof(uin=
t64_t));
>   =

>   	if (!mismatch_expected) {
>   		if (rc) {
>   			err("crc64 mismatch, memcmp rc %d\n", rc);
>   			err("expected crc=3D0x%llX, actual crc=3D0x%llX\n",
> -			    crc, tsk->comp->crc64_result);
> +			    crc, comp->crc64_result);
>   			return -ENXIO;
>   		}
>   		return ACCTEST_STATUS_OK;
> @@ -788,7 +794,7 @@ int task_result_verify_crc64(struct task *tsk, int mi=
smatch_expected)
>   =

>   	/* mismatch_expected */
>   	if (rc) {
> -		info("expected mismatch in crc 0x%llX\n", tsk->comp->crc64_result);
> +		info("expected mismatch in crc 0x%llX\n", comp->crc64_result);
>   		return ACCTEST_STATUS_OK;
>   	}
>   =

> @@ -800,6 +806,7 @@ int task_result_verify_zcompress16(struct task *tsk, =
int mismatch_expected)
>   	int i;
>   	int rc;
>   	int expected_len;
> +	struct iax_test_completion_record *comp =3D (struct iax_test_completion=
_record *)tsk->comp;
>   =

>   	if (mismatch_expected)
>   		warn("invalid arg mismatch_expected for %d\n", tsk->opcode);
> @@ -808,9 +815,9 @@ int task_result_verify_zcompress16(struct task *tsk, =
int mismatch_expected)
>   	rc =3D memcmp(tsk->dst1, tsk->output, expected_len);
>   =

>   	if (!mismatch_expected) {
> -		if (expected_len - tsk->comp->iax_output_size) {
> +		if (expected_len - comp->output_size) {
>   			err("zcompress16 mismatch, exp len %d, act len %d\n",
> -			    expected_len, tsk->comp->iax_output_size);
> +			    expected_len, comp->output_size);
>   =

>   			return -ENXIO;
>   		}
> @@ -841,6 +848,7 @@ int task_result_verify_zdecompress16(struct task *tsk=
, int mismatch_expected)
>   	int i;
>   	int rc;
>   	int expected_len;
> +	struct iax_test_completion_record *comp =3D (struct iax_test_completion=
_record *)tsk->comp;
>   =

>   	if (mismatch_expected)
>   		warn("invalid arg mismatch_expected for %d\n", tsk->opcode);
> @@ -849,9 +857,9 @@ int task_result_verify_zdecompress16(struct task *tsk=
, int mismatch_expected)
>   	rc =3D memcmp(tsk->dst1, tsk->output, expected_len);
>   =

>   	if (!mismatch_expected) {
> -		if (expected_len - tsk->comp->iax_output_size) {
> +		if (expected_len - comp->output_size) {
>   			err("zdecompress16 mismatch, exp len %d, act len %d\n",
> -			    expected_len, tsk->comp->iax_output_size);
> +			    expected_len, comp->output_size);
>   =

>   			return -ENXIO;
>   		}
> @@ -882,6 +890,7 @@ int task_result_verify_zcompress32(struct task *tsk, =
int mismatch_expected)
>   	int i;
>   	int rc;
>   	int expected_len;
> +	struct iax_test_completion_record *comp =3D (struct iax_test_completion=
_record *)tsk->comp;
>   =

>   	if (mismatch_expected)
>   		warn("invalid arg mismatch_expected for %d\n", tsk->opcode);
> @@ -890,9 +899,9 @@ int task_result_verify_zcompress32(struct task *tsk, =
int mismatch_expected)
>   	rc =3D memcmp(tsk->dst1, tsk->output, expected_len);
>   =

>   	if (!mismatch_expected) {
> -		if (expected_len - tsk->comp->iax_output_size) {
> +		if (expected_len - comp->output_size) {
>   			err("zcompress32 mismatch, exp len %d, act len %d\n",
> -			    expected_len, tsk->comp->iax_output_size);
> +			    expected_len, comp->output_size);
>   =

>   			return -ENXIO;
>   		}
> @@ -923,6 +932,7 @@ int task_result_verify_zdecompress32(struct task *tsk=
, int mismatch_expected)
>   	int i;
>   	int rc;
>   	int expected_len;
> +	struct iax_test_completion_record *comp =3D (struct iax_test_completion=
_record *)tsk->comp;
>   =

>   	if (mismatch_expected)
>   		warn("invalid arg mismatch_expected for %d\n", tsk->opcode);
> @@ -931,9 +941,9 @@ int task_result_verify_zdecompress32(struct task *tsk=
, int mismatch_expected)
>   	rc =3D memcmp(tsk->dst1, tsk->output, expected_len);
>   =

>   	if (!mismatch_expected) {
> -		if (expected_len - tsk->comp->iax_output_size) {
> +		if (expected_len - comp->output_size) {
>   			err("zdecompress32 mismatch, exp len %d, act len %d\n",
> -			    expected_len, tsk->comp->iax_output_size);
> +			    expected_len, comp->output_size);
>   =

>   			return -ENXIO;
>   		}
> @@ -964,11 +974,12 @@ int task_result_verify_compress(struct task *tsk, i=
nt mismatch_expected)
>   	int i =3D 0;
>   	int rc;
>   	int expected_len;
> +	struct iax_test_completion_record *comp =3D (struct iax_test_completion=
_record *)tsk->comp;
>   =

>   	if (mismatch_expected)
>   		warn("invalid arg mismatch_expected for %d\n", tsk->opcode);
>   =

> -	rc =3D iaa_do_decompress(tsk->output, tsk->dst1, tsk->comp->iax_output_=
size, &expected_len);
> +	rc =3D iaa_do_decompress(tsk->output, tsk->dst1, comp->output_size, &ex=
pected_len);
>   	if (rc)
>   		return -ENXIO;
>   	rc =3D memcmp(tsk->src1, tsk->output, expected_len);
> @@ -1006,6 +1017,7 @@ int task_result_verify_decompress(struct task *tsk,=
 int mismatch_expected)
>   {
>   	int i =3D 0;
>   	int rc;
> +	struct iax_test_completion_record *comp =3D (struct iax_test_completion=
_record *)tsk->comp;
>   =

>   	if (mismatch_expected)
>   		warn("invalid arg mismatch_expected for %d\n", tsk->opcode);
> @@ -1013,9 +1025,9 @@ int task_result_verify_decompress(struct task *tsk,=
 int mismatch_expected)
>   	rc =3D memcmp(tsk->input, tsk->dst1, tsk->input_size);
>   =

>   	if (!mismatch_expected) {
> -		if (tsk->input_size - tsk->comp->iax_output_size) {
> +		if (tsk->input_size - comp->output_size) {
>   			err("Decompress mismatch, exp len %d, act len %d\n",
> -			    tsk->input_size, tsk->comp->iax_output_size);
> +			    tsk->input_size, comp->output_size);
>   =

>   			return -ENXIO;
>   		}
> diff --git a/test/iaa_prep.c b/test/iaa_prep.c
> index 948bd23..522e6ed 100644
> --- a/test/iaa_prep.c
> +++ b/test/iaa_prep.c
> @@ -6,6 +6,7 @@
>   #include <stdlib.h>
>   #include <unistd.h>
>   #include <accfg/idxd.h>
> +#include "idxd_test.h"
>   #include "accel_test.h"
>   #include "iaa.h"
>   =

> @@ -14,7 +15,7 @@ void iaa_prep_noop(struct task *tsk)
>   	info("preparing descriptor for noop\n");
>   =

>   	tsk->dflags =3D IDXD_OP_FLAG_CRAV | IDXD_OP_FLAG_RCR;
> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, 0,
> +	acctest_prep_desc_common((struct hw_desc *)tsk->desc, tsk->opcode, 0,
>   				 (uint64_t)(tsk->src1), 0, tsk->dflags);
>   	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
>   	tsk->comp->status =3D 0;
> @@ -22,84 +23,105 @@ void iaa_prep_noop(struct task *tsk)
>   =

>   void iaa_prep_crc64(struct task *tsk)
>   {
> +	struct iax_test_completion_record *comp =3D (struct iax_test_completion=
_record *)tsk->comp;
> +	struct iax_test_hw_desc *hw =3D (struct iax_test_hw_desc *)tsk->desc;
> +
>   	info("preparing descriptor for crc64\n");
>   =

> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, 0,
> +	acctest_prep_desc_common((struct hw_desc *)hw, tsk->opcode, 0,
>   				 (uint64_t)(tsk->src1), tsk->xfer_size, tsk->dflags);
> -	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
> -	tsk->desc->iax_crc64_flags =3D tsk->iaa_crc64_flags;
> -	tsk->desc->iax_crc64_poly =3D tsk->iaa_crc64_poly;
> -	tsk->comp->status =3D 0;
> +	hw->completion_addr =3D (uint64_t)(comp);
> +	hw->crc64_flags =3D tsk->iaa_crc64_flags;
> +	hw->crc64_poly =3D tsk->iaa_crc64_poly;
> +	comp->status =3D 0;
>   }
>   =

>   void iaa_prep_zcompress16(struct task *tsk)
>   {
> +	struct iax_test_completion_record *comp =3D (struct iax_test_completion=
_record *)tsk->comp;
> +	struct iax_test_hw_desc *hw =3D (struct iax_test_hw_desc *)tsk->desc;
> +
>   	info("preparing descriptor for zcompress16\n");
>   =

> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
> +	acctest_prep_desc_common((struct hw_desc *)hw, tsk->opcode, (uint64_t)(=
tsk->dst1),
>   				 (uint64_t)(tsk->src1), tsk->xfer_size, tsk->dflags);
> -	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
> -	tsk->desc->iax_max_dst_size =3D tsk->iaa_max_dst_size;
> -	tsk->comp->status =3D 0;
> +	hw->completion_addr =3D (uint64_t)(comp);
> +	hw->max_dst_size =3D tsk->iaa_max_dst_size;
> +	comp->status =3D 0;
>   }
>   =

>   void iaa_prep_zdecompress16(struct task *tsk)
>   {
> +	struct iax_test_completion_record *comp =3D (struct iax_test_completion=
_record *)tsk->comp;
> +	struct iax_test_hw_desc *hw =3D (struct iax_test_hw_desc *)tsk->desc;
> +
>   	info("preparing descriptor for zdecompress16\n");
>   =

> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
> +	acctest_prep_desc_common((struct hw_desc *)hw, tsk->opcode, (uint64_t)(=
tsk->dst1),
>   				 (uint64_t)(tsk->src1), tsk->xfer_size, tsk->dflags);
> -	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
> -	tsk->desc->iax_max_dst_size =3D tsk->iaa_max_dst_size;
> -	tsk->comp->status =3D 0;
> +	hw->completion_addr =3D (uint64_t)(comp);
> +	hw->max_dst_size =3D tsk->iaa_max_dst_size;
> +	comp->status =3D 0;
>   }
>   =

>   void iaa_prep_zcompress32(struct task *tsk)
>   {
> +	struct iax_test_completion_record *comp =3D (struct iax_test_completion=
_record *)tsk->comp;
> +	struct iax_test_hw_desc *hw =3D (struct iax_test_hw_desc *)tsk->desc;
> +
>   	info("preparing descriptor for zcompress32\n");
>   =

> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
> +	acctest_prep_desc_common((struct hw_desc *)hw, tsk->opcode, (uint64_t)(=
tsk->dst1),
>   				 (uint64_t)(tsk->src1), tsk->xfer_size, tsk->dflags);
> -	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
> -	tsk->desc->iax_max_dst_size =3D tsk->iaa_max_dst_size;
> -	tsk->comp->status =3D 0;
> +	hw->completion_addr =3D (uint64_t)(comp);
> +	hw->max_dst_size =3D tsk->iaa_max_dst_size;
> +	comp->status =3D 0;
>   }
>   =

>   void iaa_prep_zdecompress32(struct task *tsk)
>   {
> +	struct iax_test_completion_record *comp =3D (struct iax_test_completion=
_record *)tsk->comp;
> +	struct iax_test_hw_desc *hw =3D (struct iax_test_hw_desc *)tsk->desc;
> +
>   	info("preparing descriptor for zdecompress32\n");
>   =

> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
> +	acctest_prep_desc_common((struct hw_desc *)hw, tsk->opcode, (uint64_t)(=
tsk->dst1),
>   				 (uint64_t)(tsk->src1), tsk->xfer_size, tsk->dflags);
> -	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
> -	tsk->desc->iax_max_dst_size =3D tsk->iaa_max_dst_size;
> -	tsk->comp->status =3D 0;
> +	hw->completion_addr =3D (uint64_t)(comp);
> +	hw->max_dst_size =3D tsk->iaa_max_dst_size;
> +	comp->status =3D 0;
>   }
>   =

>   void iaa_prep_compress(struct task *tsk)
>   {
> +	struct iax_test_completion_record *comp =3D (struct iax_test_completion=
_record *)tsk->comp;
> +	struct iax_test_hw_desc *hw =3D (struct iax_test_hw_desc *)tsk->desc;
> +
>   	info("preparing descriptor for compress\n");
>   =

> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
> +	acctest_prep_desc_common((struct hw_desc *)hw, tsk->opcode, (uint64_t)(=
tsk->dst1),
>   				 (uint64_t)(tsk->src1), tsk->xfer_size, tsk->dflags);
> -	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
> -	tsk->desc->iax_compr_flags =3D tsk->iaa_compr_flags;
> -	tsk->desc->iax_src2_addr =3D (uint64_t)(tsk->src2);
> -	tsk->desc->iax_src2_xfer_size =3D tsk->iaa_src2_xfer_size;
> -	tsk->desc->iax_max_dst_size =3D tsk->iaa_max_dst_size;
> -	tsk->comp->status =3D 0;
> +	hw->completion_addr =3D (uint64_t)(comp);
> +	hw->compr_flags =3D tsk->iaa_compr_flags;
> +	hw->src2_addr =3D (uint64_t)(tsk->src2);
> +	hw->src2_size =3D tsk->iaa_src2_xfer_size;
> +	hw->max_dst_size =3D tsk->iaa_max_dst_size;
> +	comp->status =3D 0;
>   }
>   =

>   void iaa_prep_decompress(struct task *tsk)
>   {
> +	struct iax_test_completion_record *comp =3D (struct iax_test_completion=
_record *)tsk->comp;
> +	struct iax_test_hw_desc *hw =3D (struct iax_test_hw_desc *)tsk->desc;
> +
>   	info("preparing descriptor for decompress\n");
>   =

> -	acctest_prep_desc_common(tsk->desc, tsk->opcode, (uint64_t)(tsk->dst1),
> +	acctest_prep_desc_common((struct hw_desc *)hw, tsk->opcode, (uint64_t)(=
tsk->dst1),
>   				 (uint64_t)(tsk->src1), tsk->xfer_size, tsk->dflags);
> -	tsk->desc->completion_addr =3D (uint64_t)(tsk->comp);
> -	tsk->desc->iax_decompr_flags =3D tsk->iaa_decompr_flags;
> -	tsk->desc->iax_src2_addr =3D (uint64_t)(tsk->src2);
> -	tsk->desc->iax_src2_xfer_size =3D tsk->iaa_src2_xfer_size;
> -	tsk->desc->iax_max_dst_size =3D tsk->iaa_max_dst_size;
> -	tsk->comp->status =3D 0;
> +	hw->completion_addr =3D (uint64_t)(comp);
> +	hw->decompr_flags =3D tsk->iaa_decompr_flags;
> +	hw->src2_addr =3D (uint64_t)(tsk->src2);
> +	hw->src2_size =3D tsk->iaa_src2_xfer_size;
> +	hw->max_dst_size =3D tsk->iaa_max_dst_size;
> +	comp->status =3D 0;
>   }
> diff --git a/test/iaa_test.c b/test/iaa_test.c
> index 5939a4b..1e95897 100644
> --- a/test/iaa_test.c
> +++ b/test/iaa_test.c
> @@ -169,7 +169,7 @@ static int test_zcompress(struct acctest_context *ctx=
, size_t buf_size,
>   		}
>   =

>   		switch (opcode) {
> -		case IAX_OPCODE_ZCOMPRESS16:
> +		case IAX_OPCODE_ZERO_COMP_16:
>   			rc =3D iaa_zcompress16_multi_task_nodes(ctx);
>   			if (rc !=3D ACCTEST_STATUS_OK)
>   				return rc;
> @@ -179,7 +179,7 @@ static int test_zcompress(struct acctest_context *ctx=
, size_t buf_size,
>   			if (rc !=3D ACCTEST_STATUS_OK)
>   				return rc;
>   			break;
> -		case IAX_OPCODE_ZDECOMPRESS16:
> +		case IAX_OPCODE_ZERO_DECOMP_16:
>   			rc =3D iaa_zdecompress16_multi_task_nodes(ctx);
>   			if (rc !=3D ACCTEST_STATUS_OK)
>   				return rc;
> @@ -189,7 +189,7 @@ static int test_zcompress(struct acctest_context *ctx=
, size_t buf_size,
>   			if (rc !=3D ACCTEST_STATUS_OK)
>   				return rc;
>   			break;
> -		case IAX_OPCODE_ZCOMPRESS32:
> +		case IAX_OPCODE_ZERO_COMP_32:
>   			rc =3D iaa_zcompress32_multi_task_nodes(ctx);
>   			if (rc !=3D ACCTEST_STATUS_OK)
>   				return rc;
> @@ -199,7 +199,7 @@ static int test_zcompress(struct acctest_context *ctx=
, size_t buf_size,
>   			if (rc !=3D ACCTEST_STATUS_OK)
>   				return rc;
>   			break;
> -		case IAX_OPCODE_ZDECOMPRESS32:
> +		case IAX_OPCODE_ZERO_DECOMP_32:
>   			rc =3D iaa_zdecompress32_multi_task_nodes(ctx);
>   			if (rc !=3D ACCTEST_STATUS_OK)
>   				return rc;
> @@ -375,10 +375,10 @@ int main(int argc, char *argv[])
>   			goto error;
>   		break;
>   =

> -	case IAX_OPCODE_ZCOMPRESS16:
> -	case IAX_OPCODE_ZDECOMPRESS16:
> -	case IAX_OPCODE_ZCOMPRESS32:
> -	case IAX_OPCODE_ZDECOMPRESS32:
> +	case IAX_OPCODE_ZERO_COMP_16:
> +	case IAX_OPCODE_ZERO_DECOMP_16:
> +	case IAX_OPCODE_ZERO_COMP_32:
> +	case IAX_OPCODE_ZERO_DECOMP_32:
>   		rc =3D test_zcompress(iaa, buf_size, tflags, opcode, num_desc);
>   		if (rc !=3D ACCTEST_STATUS_OK)
>   			goto error;
> diff --git a/test/idxd_test.h b/test/idxd_test.h
> new file mode 100644
> index 0000000..61451bf
> --- /dev/null
> +++ b/test/idxd_test.h
> @@ -0,0 +1,118 @@
> +/* SPDX-License-Identifier: LGPL-2.1 */
> +/*   Copyright(c) 2019 Intel Corporation. All rights reserved. */
> +
> +#ifndef _USR_IDXD_TEST_H_
> +#define _USR_IDXD_TEST_H_
> +
> +#include <stdint.h>
> +#include <accfg/idxd.h>
> +
> +#define IDXD_COMPRESS_FLAG_EOB_BFINAL 0x000c
> +#define IDXD_COMPRESS_FLAG_FLUSH_OUTPUT 0x0002
> +
> +#define IDXD_DECOMPRESS_FLAG_SELECT_EOB_BFINAL 0x0010
> +#define IDXD_DECOMPRESS_FLAG_CHECK_EOB 0x0008
> +#define IDXD_DECOMPRESS_FLAG_STOP_ON_EOB 0x0004
> +#define IDXD_DECOMPRESS_FLAG_FLUSH_OUTPUT 0x0002
> +#define IDXD_DECOMPRESS_FLAG_EN_DECOMPRESS 0x0001
> +
> +struct iax_test_hw_desc {
> +	uint32_t	pasid:20;
> +	uint32_t	rsvd:11;
> +	uint32_t	priv:1;
> +	uint32_t	flags:24;
> +	uint32_t	opcode:8;
> +	uint64_t	completion_addr;
> +	uint64_t	src1_addr;
> +	uint64_t	dst_addr;
> +	uint32_t	src1_size;
> +	uint16_t	int_handle;
> +	union {
> +		uint16_t	compr_flags;
> +		uint16_t	decompr_flags;
> +		uint16_t	crc64_flags;
> +	};
> +	union {
> +		/* IAX common */
> +		struct {
> +			uint64_t	src2_addr;
> +			uint32_t	max_dst_size;
> +			uint32_t	src2_size;
> +			uint32_t	filter_flags;
> +			uint32_t	num_inputs;
> +		};
> +		/* CRC64 */
> +		struct {
> +			uint64_t	crc64_rsvd;
> +			uint64_t	crc64_rsvd2;
> +			uint64_t	crc64_poly;
> +		};
> +
> +		uint8_t		op_specific[24];
> +	};
> +} __attribute__((packed));
> +
> +struct iax_test_completion_record {
> +	volatile uint8_t	status;
> +	uint8_t			error_code;
> +	uint8_t			fault_info;
> +	uint8_t			rsvd;
> +	uint32_t		bytes_completed;
> +	uint64_t		fault_addr;
> +	union {
> +		/* IAX common */
> +		struct {
> +			uint32_t	invalid_flags;
> +			uint32_t	rsvd2;
> +			uint32_t	output_size;
> +			uint8_t		output_bits;
> +			uint8_t		rsvd3;
> +			uint16_t	xor_csum;
> +			uint32_t	crc;
> +			union {
> +				uint32_t	min;
> +				uint32_t	first;
> +			};
> +			union {
> +				uint32_t	max;
> +				uint32_t	last;
> +			};
> +			union {
> +				uint32_t	sum;
> +				uint32_t	population_cnt;
> +			};
> +		};
> +
> +		/* CRC64 */
> +		struct {
> +			uint32_t	crc64_invalid_flags;
> +			uint32_t	crc64_rsvd;
> +			uint64_t	crc64_rsvd2;
> +			uint64_t	crc64_rsvd3;
> +			uint64_t	crc64_result;
> +		};
> +
> +		uint8_t		op_specific[48];
> +	};
> +} __attribute__((packed));
> +
> +struct hw_desc {
> +	uint32_t	pasid:20;
> +	uint32_t	rsvd:11;
> +	uint32_t	priv:1;
> +	uint32_t	flags:24;
> +	uint32_t	opcode:8;
> +	uint64_t	completion_addr;
> +	uint64_t	src_addr;
> +	uint64_t	dst_addr;
> +	uint32_t	xfer_size;
> +	uint16_t	int_handle;
> +	uint8_t		field[26];
> +} __attribute__((packed));
> +
> +struct completion_record {
> +	volatile uint8_t	status;
> +	uint8_t			field[63];
> +} __attribute__((packed));
> +
> +#endif
--===============0598958079360460614==--