[igt-dev] [PATCH i-g-t 14/14] lib/intel_blt: Support xe2 in ctrl-surf-copy command

Kamil Konieczny kamil.konieczny at linux.intel.com
Mon Sep 18 08:55:29 UTC 2023


Hi Lucas,

On 2023-09-15 at 06:23:46 -0700, Lucas De Marchi wrote:
> Xe2 ctrl-surf-copy command varies significantly from gen12. Create a new
> struct and function to fill the data, sharing the rest of the logic in
> emit_blt_ctrl_surf_copy().
> 
> Signed-off-by: Lucas De Marchi <lucas.demarchi at intel.com>
> ---
>  lib/intel_blt.c | 128 ++++++++++++++++++++++++++++++++++++++++--------
>  1 file changed, 107 insertions(+), 21 deletions(-)
> 
> diff --git a/lib/intel_blt.c b/lib/intel_blt.c
> index 508c2de46..60362531f 100644
> --- a/lib/intel_blt.c
> +++ b/lib/intel_blt.c
> @@ -962,6 +962,65 @@ struct gen12_ctrl_surf_copy_data {
>  	} dw04;
>  };
>  
> +struct xe2_ctrl_surf_copy_data {
> +	struct {
> +		uint32_t length:			BITRANGE(0, 7);
> +		uint32_t rsvd0:				BITRANGE(8, 8);
> +		uint32_t size_of_ctrl_copy:		BITRANGE(9, 18);
> +		uint32_t rsvd1:				BITRANGE(19, 19);
> +		uint32_t dst_access_type:		BITRANGE(20, 20);
> +		uint32_t src_access_type:		BITRANGE(21, 21);
> +		uint32_t opcode:			BITRANGE(22, 28);
> +		uint32_t client:			BITRANGE(29, 31);
> +	} dw00;
> +
> +	struct {
> +		uint32_t src_address_lo;
> +	} dw01;
> +
> +	struct {
> +		uint32_t src_address_hi:		BITRANGE(0, 24);
> +		uint32_t pad:				BITRANGE(25, 27);
> +		uint32_t src_mocs:			BITRANGE(28, 31);
> +	} dw02;
> +
> +	struct {
> +		uint32_t dst_address_lo;
> +	} dw03;
> +
> +	struct {
> +		uint32_t dst_address_hi:		BITRANGE(0, 24);
> +		uint32_t pad:				BITRANGE(25, 27);
> +		uint32_t dst_mocs:			BITRANGE(28, 31);
> +	} dw04;
> +};
> +
> +union ctrl_surf_copy_data {
> +	struct gen12_ctrl_surf_copy_data gen12;
> +	struct xe2_ctrl_surf_copy_data xe2;
> +};
> +
> +static void xe2_dump_bb_surf_ctrl_cmd(const struct xe2_ctrl_surf_copy_data *data)
> +{
> +	uint32_t *cmd = (uint32_t *) data;
> +
> +	igt_info("details:\n");
> +	igt_info(" dw00: [%08x] <client: 0x%x, opcode: 0x%x, "
> +		 "src/dst access type: <%d, %d>, size of ctrl copy: %u, length: %d>\n",
> +		 cmd[0],
> +		 data->dw00.client, data->dw00.opcode,
> +		 data->dw00.src_access_type, data->dw00.dst_access_type,
> +		 data->dw00.size_of_ctrl_copy, data->dw00.length);
> +	igt_info(" dw01: [%08x] src offset lo (0x%x)\n",
> +		 cmd[1], data->dw01.src_address_lo);
> +	igt_info(" dw02: [%08x] src offset hi (0x%x), src mocs idx: %u\n",
> +		 cmd[2], data->dw02.src_address_hi, data->dw02.src_mocs);
> +	igt_info(" dw03: [%08x] dst offset lo (0x%x)\n",
> +		 cmd[3], data->dw03.dst_address_lo);
> +	igt_info(" dw04: [%08x] dst offset hi (0x%x), src mocs idx: %u\n",
> +		 cmd[4], data->dw04.dst_address_hi, data->dw04.dst_mocs);
> +}
> +
>  static void dump_bb_surf_ctrl_cmd(const struct gen12_ctrl_surf_copy_data *data)
>  {
>  	uint32_t *cmd = (uint32_t *) data;
> @@ -1020,7 +1079,9 @@ uint64_t emit_blt_ctrl_surf_copy(int fd,
>  				 uint64_t bb_pos,
>  				 bool emit_bbe)
>  {
> -	struct gen12_ctrl_surf_copy_data data = {};
> +	unsigned int ip_ver = intel_graphics_ver(intel_get_drm_devid(fd));
> +	union ctrl_surf_copy_data data = { };
> +	size_t data_sz;
>  	uint64_t dst_offset, src_offset, bb_offset, alignment;
>  	uint32_t bbe = MI_BATCH_BUFFER_END;
>  	uint32_t *bb;
> @@ -1029,33 +1090,55 @@ uint64_t emit_blt_ctrl_surf_copy(int fd,
>  	igt_assert_f(surf, "ctrl-surf-copy requires data to do ctrl-surf-copy blit\n");
>  
>  	alignment = max_t(uint64_t, get_default_alignment(fd, surf->driver), 1ull << 16);
> -
> -	data.dw00.client = 0x2;
> -	data.dw00.opcode = 0x48;
> -	data.dw00.src_access_type = surf->src.access_type;
> -	data.dw00.dst_access_type = surf->dst.access_type;
> -
> -	/* Ensure dst has size capable to keep src ccs aux */
> -	data.dw00.size_of_ctrl_copy = __ccs_size(surf) / CCS_RATIO - 1;
> -	data.dw00.length = 0x3;
> -
>  	src_offset = get_offset(ahnd, surf->src.handle, surf->src.size, alignment);
>  	dst_offset = get_offset(ahnd, surf->dst.handle, surf->dst.size, alignment);
>  	bb_offset = get_offset(ahnd, surf->bb.handle, surf->bb.size, alignment);
>  
> -	data.dw01.src_address_lo = src_offset;
> -	data.dw02.src_address_hi = src_offset >> 32;
> -	data.dw02.src_mocs = surf->src.mocs;
> +	if (ip_ver >= IP_VER(20, 0)) {
> +		data.xe2.dw00.client = 0x2;
> +		data.xe2.dw00.opcode = 0x48;
> +		data.xe2.dw00.src_access_type = surf->src.access_type;
> +		data.xe2.dw00.dst_access_type = surf->dst.access_type;
> +
> +		/* Ensure dst has size capable to keep src ccs aux */
> +		data.xe2.dw00.size_of_ctrl_copy = __ccs_size(surf) / CCS_RATIO - 1;
> +		data.xe2.dw00.length = 0x3;
> +
> +		data.xe2.dw01.src_address_lo = src_offset;
> +		data.xe2.dw02.src_address_hi = src_offset >> 32;
> +		data.xe2.dw02.src_mocs = surf->src.mocs;
> +
> +		data.xe2.dw03.dst_address_lo = dst_offset;
> +		data.xe2.dw04.dst_address_hi = dst_offset >> 32;
> +		data.xe2.dw04.dst_mocs = surf->dst.mocs;
> +
> +		data_sz = sizeof(data.xe2);
> +	} else {
> +		data.gen12.dw00.client = 0x2;
> +		data.gen12.dw00.opcode = 0x48;
> +		data.gen12.dw00.src_access_type = surf->src.access_type;
> +		data.gen12.dw00.dst_access_type = surf->dst.access_type;
> +
> +		/* Ensure dst has size capable to keep src ccs aux */
> +		data.gen12.dw00.size_of_ctrl_copy = __ccs_size(surf) / CCS_RATIO - 1;
> +		data.gen12.dw00.length = 0x3;
> +
> +		data.gen12.dw01.src_address_lo = src_offset;
> +		data.gen12.dw02.src_address_hi = src_offset >> 32;
> +		data.gen12.dw02.src_mocs = surf->src.mocs;
> +
> +		data.gen12.dw03.dst_address_lo = dst_offset;
> +		data.gen12.dw04.dst_address_hi = dst_offset >> 32;
> +		data.gen12.dw04.dst_mocs = surf->dst.mocs;
>  
> -	data.dw03.dst_address_lo = dst_offset;
> -	data.dw04.dst_address_hi = dst_offset >> 32;
> -	data.dw04.dst_mocs = surf->dst.mocs;
> +		data_sz = sizeof(data.gen12);
> +	}
>  
>  	bb = bo_map(fd, surf->bb.handle, surf->bb.size, surf->driver);
>  
> -	igt_assert(bb_pos + sizeof(data) < surf->bb.size);
> -	memcpy(bb + bb_pos, &data, sizeof(data));
> -	bb_pos += sizeof(data);
> +	igt_assert(bb_pos + data_sz < surf->bb.size);
> +	memcpy(bb + bb_pos, &data, data_sz);
> +	bb_pos += data_sz;
>  
>  	if (emit_bbe) {
>  		igt_assert(bb_pos + sizeof(uint32_t) < surf->bb.size);
> @@ -1069,7 +1152,10 @@ uint64_t emit_blt_ctrl_surf_copy(int fd,
>  			 ", bb offset: %" PRIx64 "\n",
>  			 src_offset, dst_offset, bb_offset);
>  
> -		dump_bb_surf_ctrl_cmd(&data);
> +		if (ip_ver >= IP_VER(20, 0))
---------------------------- ^^^^^
> +			dump_bb_surf_ctrl_cmd(&data.gen12);
> +		else
> +			xe2_dump_bb_surf_ctrl_cmd(&data.xe2);
----------- ^^^
This should be switched:

		if (ip_ver >= IP_VER(20, 0))
			xe2_dump_bb_surf_ctrl_cmd(&data.xe2);
		else
			dump_bb_surf_ctrl_cmd(&data.gen12);

Regards,
Kamil

>  	}
>  
>  	munmap(bb, surf->bb.size);
> -- 
> 2.40.1
> 


More information about the igt-dev mailing list