[igt-dev] [PATCH i-g-t 2/2] tests/i915/gem_ccs: Add suspend-resume subtest

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Mon Mar 21 06:18:45 UTC 2022


On Fri, Mar 18, 2022 at 11:29:53AM +0100, Kamil Konieczny wrote:
> Hi,
> 
> Dnia 2022-03-18 at 08:30:18 +0100, Zbigniew Kempczyński napisał(a):
> > From: Apoorva Singh <apoorva1.singh at intel.com>
> > 
> > Verify flatccs data won't be corrupted when device will be put
> > to S0 (s2idle) state.
> > 
> > Signed-off-by: Apoorva Singh <apoorva1.singh at intel.com>
> > Cc: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
> > ---
> >  tests/i915/gem_ccs.c | 45 +++++++++++++++++++++++++++++++++++++++-----
> >  1 file changed, 40 insertions(+), 5 deletions(-)
> > 
> > diff --git a/tests/i915/gem_ccs.c b/tests/i915/gem_ccs.c
> > index 7e104f6ad8..eaa8e043b0 100644
> > --- a/tests/i915/gem_ccs.c
> > +++ b/tests/i915/gem_ccs.c
> > @@ -4,6 +4,7 @@
> >   */
> >  
> >  #include <errno.h>
> > +#include <glib.h>
> >  #include <sys/ioctl.h>
> >  #include <sys/time.h>
> >  #include <malloc.h>
> > @@ -40,6 +41,7 @@ struct test_config {
> >  	bool inplace;
> >  	bool surfcopy;
> >  	bool new_ctx;
> > +	bool suspend_resume;
> >  };
> >  
> >  static void set_object(struct blt_copy_object *obj,
> > @@ -162,22 +164,24 @@ static void surf_copy(int i915,
> >  		      const struct blt_copy_object *src,
> >  		      const struct blt_copy_object *mid,
> >  		      const struct blt_copy_object *dst,
> > -		      int run_id)
> > +		      int run_id, bool suspend_resume)
> >  {
> >  	struct blt_copy_data blt = {};
> >  	struct blt_block_copy_data_ext ext = {};
> >  	struct blt_ctrl_surf_copy_data surf = {};
> > -	uint32_t bb, ccs, *ccsmap;
> > -	uint64_t bb_size = 4096;
> 
> Please keep it here so number of changes will be lower.
> 
> > -	uint64_t ccssize = mid->size / CCS_RATIO;
> > +	uint32_t bb, ccs, ccs2, *ccsmap, *ccsmap2;
> > +	uint64_t bb_size, ccssize = mid->size / CCS_RATIO;
> 
> No need to move bb_size here.
> 
> >  	uint32_t *ccscopy;
> >  	uint8_t uc_mocs = intel_get_uc_mocs(i915);
> >  	int result;
> > +	char *orig, *orig2, *new, *new2;
> 
> These are used only in suspend_resume block, so move it there.

Ack, makes sense.

> 
> >  
> >  	igt_assert(mid->compression);
> >  	ccscopy = (uint32_t *) malloc(ccssize);
> > +	bb_size = 4096;
> 
> May be removed (if you keep it above).

My intent was to point the reader that bb_size can alter by the driver
regarding created buffer size. For smem there's 4k, but for lmem can
vary. gem_create_from_pool() is new call, so I try to build some
patterns to avoid mismatch between sizes and allocator calls. 

> 
> >  	bb = gem_create_from_pool(i915, &bb_size, REGION_SMEM);
> >  	ccs = gem_create(i915, ccssize);
> > +	ccs2 = gem_create(i915, ccssize);
> >  
> >  	surf.i915 = i915;
> >  	surf.print_bb = param.print_bb;
> > @@ -193,6 +197,27 @@ static void surf_copy(int i915,
> >  					   PROT_READ | PROT_WRITE);
> >  	memcpy(ccscopy, ccsmap, ccssize);
> >  
> > +	if (suspend_resume) {
> > +		orig = g_compute_checksum_for_data(G_CHECKSUM_SHA1, (void *)ccsmap, surf.dst.size);
> > +		orig2 = g_compute_checksum_for_data(G_CHECKSUM_SHA1, (void *)mid->ptr, mid->size);
> > +
> > +		igt_system_suspend_autoresume(SUSPEND_STATE_FREEZE, SUSPEND_TEST_NONE);
> > +
> > +		set_surf_object(&surf.dst, ccs2, REGION_SMEM, ccssize,
> > +				0, DIRECT_ACCESS);
> > +		blt_ctrl_surf_copy(i915, ctx, e, ahnd, &surf);
> > +		gem_sync(i915, surf.dst.handle);
> > +
> > +		ccsmap2 = gem_mmap__device_coherent(i915, ccs2, 0, surf.dst.size,
> > +						    PROT_READ | PROT_WRITE);
> > +		new = g_compute_checksum_for_data(G_CHECKSUM_SHA1, (void *)ccsmap2, surf.dst.size);
> > +		new2 = g_compute_checksum_for_data(G_CHECKSUM_SHA1, (void *)mid->ptr, mid->size);
> > +
> > +		igt_assert(!strcmp(orig, new));
> > +		igt_assert(!strcmp(orig2, new2));
> 
> May you rename new and new2 into something meaningfull ? Like
> newsum_ccs, newsum_ctrl ? It can help if assert triggers.
> Checksums are pointers allocated by g_compute_checksum so they
> need to be free after use.

Ok, will do.

> 
> > +		munmap(ccsmap2, ccssize);
> 
> Move this before two asserts.

Ack.

> 
> > +	}
> > +
> >  	/* corrupt ccs */
> >  	for (int i = 0; i < surf.dst.size / sizeof(uint32_t); i++)
> >  		ccsmap[i] = i;
> > @@ -209,6 +234,7 @@ static void surf_copy(int i915,
> >  	set_blt_object(&blt.dst, dst);
> >  	set_object_ext(&ext.src, mid->compression_type, mid->x2, mid->y2, SURFACE_TYPE_2D);
> >  	set_object_ext(&ext.dst, 0, dst->x2, dst->y2, SURFACE_TYPE_2D);
> > +	bb_size = 4096;
> 
> Looks strange here, remove this.

I'm not sure what bb_size is before gem_create_from_pool() - it may be altered by
previous call (not for smem but lmem likely).

> 
> >  	bb = gem_create_from_pool(i915, &bb_size, REGION_SMEM);
> >  	set_batch(&blt.bb, bb, bb_size, REGION_SMEM);
> >  	blt_block_copy(i915, ctx, e, ahnd, &blt, &ext);
> > @@ -311,7 +337,8 @@ static void block_copy(int i915,
> >  							 ALLOC_STRATEGY_LOW_TO_HIGH, 0);
> >  		}
> >  
> > -		surf_copy(i915, surf_ctx, &surf_e, surf_ahnd, src, mid, dst, run_id);
> > +		surf_copy(i915, surf_ctx, &surf_e, ahnd, src, mid, dst, run_id,
> 
> This should be in first patch ?

Hmm, likely not. First (new ctx) changes to use &surf_e. For suspend-resume there's
new option which is additional arg for surf_copy.

Thanks for the review, new series will be sent soon.

--
Zbigniew

> 
> Regards,
> Kamil
> 
> > +			  config->suspend_resume);
> >  
> >  		if (surf_ctx != ctx) {
> >  			intel_ctx_destroy(i915, surf_ctx);
> > @@ -508,6 +535,14 @@ igt_main_args("bf:pst:W:H:", NULL, help_str, opt_handler, NULL)
> >  		block_copy_test(i915, &config, ctx, set);
> >  	}
> >  
> > +	igt_subtest_with_dynamic("suspend-resume") {
> > +		struct test_config config = { .compression = true,
> > +					      .surfcopy = true,
> > +					      .suspend_resume = true };
> > +
> > +		block_copy_test(i915, &config, ctx, set);
> > +	}
> > +
> >  	igt_fixture {
> >  		igt_disallow_hang(i915, hang);
> >  		close(i915);
> > -- 
> > 2.32.0
> > 
> 


More information about the igt-dev mailing list