[PATCH i-g-t v3 08/11] tests/xe_copy_basic: add subtest to verify mem-copy in pages

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Fri May 30 06:10:22 UTC 2025


On Tue, May 27, 2025 at 09:23:58PM +0200, Francois Dugast wrote:
> On Fri, May 23, 2025 at 10:01:23AM +0200, Zbigniew Kempczyński wrote:
> > Mem-copy in linear mode supports copying in 256B pages. Verify is
> > it properly handled in intel_blt.
> > 
> > Cc: Francois Dugast <francois.dugast at intel.com>
> > Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
> > ---
> >  tests/intel/xe_copy_basic.c | 56 ++++++++++++++++++++++++++++++++++---
> >  1 file changed, 52 insertions(+), 4 deletions(-)
> > 
> > diff --git a/tests/intel/xe_copy_basic.c b/tests/intel/xe_copy_basic.c
> > index bed3e39426..404fe7f50a 100644
> > --- a/tests/intel/xe_copy_basic.c
> > +++ b/tests/intel/xe_copy_basic.c
> > @@ -48,6 +48,20 @@ struct rect {
> >   * @0xfffe: 0xfffe
> >   * @0x8fffe: 0x8fffe
> >   */
> > +
> > +/**
> > + *
> > + * SUBTEST: mem-page-copy-%s
> > + * Description: Test validates MEM_COPY command, it takes various
>                                                                      ^
> Is something missing here? The line wrap is odd and after this series the
> test description ends up being exactly the same for mem-copy-linear-%s,
> mem-page-copy-%s and mem-matrix-copy-%s.

Right, copy-paste issue, check in the next revision if you have nothing
against new description. Assuming no - r-b applied.

--
Zbigniew

> 
> With that fixed:
> 
>     Reviewed-by: Francois Dugast <francois.dugast at intel.com>
> 
> > + *              parameters needed for the filling batch buffer for MEM_COPY command
> > + *              with size %arg[1].
> > + * Test category: functionality test
> > + *
> > + * arg[1]:
> > + * @1: 1
> > + * @17: 17
> > + */
> > +
> >  static void
> >  mem_copy(int fd, uint32_t src_handle, uint32_t dst_handle, const intel_ctx_t *ctx,
> >  	 enum blt_memop_type type, enum blt_memop_mode mode,
> > @@ -62,23 +76,45 @@ mem_copy(int fd, uint32_t src_handle, uint32_t dst_handle, const intel_ctx_t *ct
> >  	uint8_t src_mocs = intel_get_uc_mocs_index(fd);
> >  	uint8_t dst_mocs = src_mocs;
> >  	uint32_t bb;
> > -	int result;
> > +	uint8_t *psrc, *pdst;
> > +	int result, i;
> >  
> >  	bb = xe_bo_create(fd, 0, bb_size, region, 0);
> >  
> > -	blt_mem_copy_init(fd, &mem, MODE_BYTE, TYPE_LINEAR);
> > +	blt_mem_copy_init(fd, &mem, mode, type);
> >  	blt_set_mem_object(&mem.src, src_handle, size, width, width, height,
> >  			   region, src_mocs, DEFAULT_PAT_INDEX, COMPRESSION_DISABLED);
> >  	blt_set_mem_object(&mem.dst, dst_handle, size, width, width, height,
> >  			   region, dst_mocs, DEFAULT_PAT_INDEX, COMPRESSION_DISABLED);
> >  	mem.src.ptr = xe_bo_map(fd, src_handle, size);
> >  	mem.dst.ptr = xe_bo_map(fd, dst_handle, size);
> > +	psrc = (uint8_t *) mem.src.ptr;
> > +	pdst = (uint8_t *) mem.dst.ptr;
> > +
> > +	srand(time(NULL));
> > +
> > +	/* Randomize whole src */
> > +	for (i = 0; i < size; i++)
> > +		psrc[i] = rand();
> >  
> >  	blt_set_batch(&mem.bb, bb, bb_size, region);
> >  	igt_assert(mem.src.width == mem.dst.width);
> >  
> >  	blt_mem_copy(fd, ctx, NULL, ahnd, &mem);
> > -	result = memcmp(mem.src.ptr, mem.dst.ptr, mem.src.size);
> > +
> > +	if (type == TYPE_LINEAR && mode == MODE_BYTE) {
> > +		result = memcmp(psrc, pdst, width);
> > +
> > +		/* Rest of dst must contain 0 */
> > +		for (i = width; i < size; i++) {
> > +			if (pdst[i] != 0) {
> > +				result = -1;
> > +				break;
> > +			}
> > +		}
> > +	} else {
> > +		result = memcmp(psrc, pdst, pitch << 8);
> > +	}
> >  
> >  	intel_allocator_bind(ahnd, 0, 0);
> >  	munmap(mem.src.ptr, size);
> > @@ -86,7 +122,7 @@ mem_copy(int fd, uint32_t src_handle, uint32_t dst_handle, const intel_ctx_t *ct
> >  	gem_close(fd, bb);
> >  	put_ahnd(ahnd);
> >  
> > -	igt_assert_f(!result, "source and destination differ\n");
> > +	igt_assert_f(!result, "destination doesn't contain valid data\n");
> >  }
> >  
> >  /**
> > @@ -176,6 +212,8 @@ igt_main
> >  				 { 0, 0x3fff, 1 },
> >  				 { 0, 0xfffe, 1 },
> >  				 { 0, 0x8fffe, 1 } };
> > +	struct rect page[] = { { 0, 1, 1, MODE_PAGE },
> > +			       { 0, 17, 1, MODE_PAGE }};
> >  
> >  	igt_fixture {
> >  		fd = drm_open_driver(DRIVER_XE);
> > @@ -195,6 +233,16 @@ igt_main
> >  		}
> >  	}
> >  
> > +	for (int i = 0; i < ARRAY_SIZE(page); i++) {
> > +		igt_subtest_f("mem-page-copy-%u", page[i].width) {
> > +			igt_require(blt_has_mem_copy(fd));
> > +			for_each_variation_r(regions, 1, set) {
> > +				region = igt_collection_get_value(regions, 0);
> > +				copy_test(fd, &page[i], MEM_COPY, region);
> > +			}
> > +		}
> > +	}
> > +
> >  	for (int i = 0; i < ARRAY_SIZE(linear); i++) {
> >  		igt_subtest_f("mem-set-linear-0x%x", linear[i].width) {
> >  			igt_require(blt_has_mem_set(fd));
> > -- 
> > 2.43.0
> > 


More information about the igt-dev mailing list