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

Lucas De Marchi lucas.demarchi at intel.com
Mon Sep 18 15:05:42 UTC 2023


On Mon, Sep 18, 2023 at 10:55:29AM +0200, Kamil Konieczny wrote:
>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);

oops, thanks for catching that. I will update on next version.

Lucas De Marchi

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


More information about the igt-dev mailing list