[igt-dev] [PATCH i-g-t 12/14] tools/intel_display_poller: Add VRR push support

Navare, Manasi manasi.d.navare at intel.com
Tue Mar 2 00:14:08 UTC 2021


On Mon, Mar 01, 2021 at 12:37:45PM -0800, Manasi Navare wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> 
> Add a new command line knob to specify the scanline on which we
> should send the VRR push. This allows many of the test modes
> to probe the hardware behaviour in the presence of VRR pushes.
> 
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>

Reviewed-by: Manasi Navare <manasi.d.navare at intel.com>

Manasi

> ---
>  tools/intel_display_poller.c | 134 +++++++++++++++++++++++++++++------
>  1 file changed, 112 insertions(+), 22 deletions(-)
> 
> diff --git a/tools/intel_display_poller.c b/tools/intel_display_poller.c
> index 3b3375ec..37383dc8 100644
> --- a/tools/intel_display_poller.c
> +++ b/tools/intel_display_poller.c
> @@ -159,6 +159,29 @@ static uint32_t dspsurf_reg(uint32_t devid, int pipe, bool async)
>  		return PIPE_REG(plane, DSPASURF);
>  }
>  
> +static int pipe_to_transcoder(uint32_t devid, int pipe)
> +{
> +	int gen = intel_gen(devid);
> +
> +	if (IS_HASWELL(devid) || IS_BROADWELL(devid) ||
> +	    gen == 9 || gen == 10 || gen == 11) {
> +		/* FIXME not 100% robust */
> +		if (read_reg(PIPE_REG(pipe, PIPEACONF)) & PIPEACONF_ENABLE)
> +			return pipe;
> +		else
> +			return 0xf; /* EDP */
> +	} else {
> +		return pipe;
> +	}
> +}
> +
> +static uint32_t trans_reg(uint32_t devid, int pipe, uint32_t reg)
> +{
> +	int trans = pipe_to_transcoder(devid, pipe);
> +
> +	return PIPE_REG(trans, reg);
> +}
> +
>  static void enable_async_flip(uint32_t devid, int pipe, bool enable)
>  {
>  	int plane = pipe_to_plane(devid, pipe);
> @@ -175,6 +198,26 @@ static void enable_async_flip(uint32_t devid, int pipe, bool enable)
>  	write_reg(PIPE_REG(plane, DSPACNTR), tmp);
>  }
>  
> +static void push_vrr(uint32_t devid, int pipe, int vrr_push_scanline)
> +{
> +	uint32_t dsl = PIPE_REG(pipe, PIPEA_DSL);
> +	uint32_t push = trans_reg(devid, pipe, TRANS_PUSH_A);
> +
> +	if (vrr_push_scanline < 0)
> +		return;
> +
> +	if (read_reg(push) & 0x40000000)
> +		return;
> +
> +	while (!quit) {
> +		uint32_t dsl1 = read_reg(dsl) & ~0x80000000;
> +		if (dsl1 == vrr_push_scanline)
> +			break;
> +	}
> +
> +	write_reg(push, 0xc0000000);
> +}
> +
>  static int wait_scanline(int pipe, int target_scanline, bool *field)
>  {
>  	uint32_t dsl_reg = PIPE_REG(pipe, PIPEA_DSL);
> @@ -545,7 +588,8 @@ static void poll_dsl_iir_gen3(int pipe, int bit,
>  }
>  
>  static void poll_dsl_deiir(uint32_t devid, int pipe, int bit,
> -			   uint32_t *min, uint32_t *max, const int count)
> +			   uint32_t *min, uint32_t *max, const int count,
> +			   int vrr_push_scanline)
>  {
>  	uint32_t dsl, dsl1, dsl2, iir1, iir2, imr_save, ier_save;
>  	bool field1, field2;
> @@ -574,6 +618,8 @@ static void poll_dsl_deiir(uint32_t devid, int pipe, int bit,
>  	write_reg(iir, bit);
>  
>  	while (!quit) {
> +		push_vrr(devid, pipe, vrr_push_scanline);
> +
>  		while (!quit) {
>  			dsl1 = read_reg(dsl);
>  			iir1 = read_reg(iir);
> @@ -608,7 +654,9 @@ static void poll_dsl_deiir(uint32_t devid, int pipe, int bit,
>  	write_reg(ier, ier_save);
>  }
>  
> -static void poll_dsl_framecount_g4x(int pipe, uint32_t *min, uint32_t *max, const int count)
> +static void poll_dsl_framecount_g4x(uint32_t devid, int pipe,
> +				    uint32_t *min, uint32_t *max, const int count,
> +				    int vrr_push_scanline)
>  {
>  	uint32_t dsl, dsl1, dsl2, frm, frm1, frm2;
>  	bool field1, field2;
> @@ -618,6 +666,8 @@ static void poll_dsl_framecount_g4x(int pipe, uint32_t *min, uint32_t *max, cons
>  	dsl = PIPE_REG(pipe, PIPEA_DSL);
>  
>  	while (!quit) {
> +		push_vrr(devid, pipe, vrr_push_scanline);
> +
>  		while (!quit) {
>  			dsl1 = read_reg(dsl);
>  			frm1 = read_reg(frm);
> @@ -645,7 +695,8 @@ static void poll_dsl_framecount_g4x(int pipe, uint32_t *min, uint32_t *max, cons
>  }
>  
>  static void poll_dsl_flipcount_g4x(uint32_t devid, int pipe,
> -				   uint32_t *min, uint32_t *max, const int count)
> +				   uint32_t *min, uint32_t *max, const int count,
> +				   int vrr_push_scanline)
>  {
>  	uint32_t dsl, dsl1, dsl2, flp, flp1, flp2, surf;
>  	bool field1, field2;
> @@ -676,6 +727,7 @@ static void poll_dsl_flipcount_g4x(uint32_t devid, int pipe,
>  			return;
>  
>  		write_reg(surf, read_reg(surf));
> +		push_vrr(devid, pipe, vrr_push_scanline);
>  
>  		while (!quit) {
>  			dsl1 = read_reg(dsl);
> @@ -738,7 +790,8 @@ static void poll_dsl_framecount_gen3(int pipe, uint32_t *min, uint32_t *max, con
>  
>  
>  static void poll_dsl_frametimestamp(uint32_t devid, int pipe,
> -				    uint32_t *min, uint32_t *max, const int count)
> +				    uint32_t *min, uint32_t *max, const int count,
> +				    int vrr_push_scanline)
>  {
>  	uint32_t dsl, dsl1, dsl2, frm, frm1, frm2;
>  	bool field1, field2;
> @@ -748,6 +801,8 @@ static void poll_dsl_frametimestamp(uint32_t devid, int pipe,
>  	dsl = PIPE_REG(pipe, PIPEA_DSL);
>  
>  	while (!quit) {
> +		push_vrr(devid, pipe, vrr_push_scanline);
> +
>  		while (!quit) {
>  			dsl1 = read_reg(dsl);
>  			frm1 = read_reg(frm);
> @@ -785,7 +840,8 @@ static uint32_t timestamp_reg(uint32_t devid)
>  }
>  
>  static void poll_dsl_timestamp(uint32_t devid, int pipe, int target_scanline,
> -			       uint32_t *min, uint32_t *max, const int count)
> +			       uint32_t *min, uint32_t *max, const int count,
> +			       int vrr_push_scanline)
>  {
>  	uint32_t dsl1, frm, frm1, ts, ts1;
>  	bool field1;
> @@ -795,6 +851,8 @@ static void poll_dsl_timestamp(uint32_t devid, int pipe, int target_scanline,
>  	frm = PIPE_REG(pipe, PIPEAFRMTMSMTP);
>  
>  	while (!quit) {
> +		push_vrr(devid, pipe, vrr_push_scanline);
> +
>  		dsl1 = wait_scanline(pipe, target_scanline, &field1);
>  
>  		frm1 = read_reg(frm);
> @@ -811,7 +869,8 @@ static void poll_dsl_timestamp(uint32_t devid, int pipe, int target_scanline,
>  }
>  
>  static void poll_dsl_pan(uint32_t devid, int pipe, int target_scanline, int target_fuzz,
> -			 uint32_t *min, uint32_t *max, const int count)
> +			 uint32_t *min, uint32_t *max, const int count,
> +			 int vrr_push_scanline)
>  {
>  	uint32_t dsl1 = 0, dsl2 = 0;
>  	bool field1 = false, field2 = false;
> @@ -826,6 +885,7 @@ static void poll_dsl_pan(uint32_t devid, int pipe, int target_scanline, int targ
>  		dsl1 = wait_scanline(pipe, target_scanline, &field1);
>  
>  		write_reg(surf, saved+256);
> +		push_vrr(devid, pipe, vrr_push_scanline);
>  
>  		dsl2 = wait_scanline(pipe, target_scanline + target_fuzz, &field2);
>  
> @@ -845,7 +905,8 @@ static void poll_dsl_pan(uint32_t devid, int pipe, int target_scanline, int targ
>  }
>  
>  static void poll_dsl_flip(uint32_t devid, int pipe, int target_scanline, int target_fuzz,
> -			  uint32_t *min, uint32_t *max, const int count, bool async)
> +			  uint32_t *min, uint32_t *max, const int count, bool async,
> +			  int vrr_push_scanline)
>  {
>  	uint32_t dsl1 = 0, dsl2 = 0;
>  	bool field1 = false, field2 = false;
> @@ -862,6 +923,7 @@ static void poll_dsl_flip(uint32_t devid, int pipe, int target_scanline, int tar
>  		dsl1 = wait_scanline(pipe, target_scanline, &field1);
>  
>  		write_reg(surf, saved+256*1024);
> +		push_vrr(devid, pipe, vrr_push_scanline);
>  
>  		dsl2 = wait_scanline(pipe, target_scanline + target_fuzz, &field2);
>  
> @@ -944,7 +1006,8 @@ static void poll_dsl_flipdone_pipestat(uint32_t devid, int pipe, int target_scan
>  }
>  
>  static void poll_dsl_flipdone_deiir(uint32_t devid, int pipe, int target_scanline, int target_fuzz,
> -				    uint32_t *min, uint32_t *max, const int count, bool async)
> +				    uint32_t *min, uint32_t *max, const int count, bool async,
> +				    int vrr_push_scanline)
>  {
>  	uint32_t dsl, dsl1 = 0, dsl2 = 0;
>  	uint32_t iir, iir2, ier, imr;
> @@ -997,6 +1060,7 @@ static void poll_dsl_flipdone_deiir(uint32_t devid, int pipe, int target_scanlin
>  		else
>  			next = saved;
>  		write_reg(surf, next);
> +		push_vrr(devid, pipe, vrr_push_scanline);
>  
>  		while (!quit) {
>  			iir2 = read_reg(iir);
> @@ -1028,7 +1092,8 @@ static void poll_dsl_flipdone_deiir(uint32_t devid, int pipe, int target_scanlin
>  }
>  
>  static void poll_dsl_surflive(uint32_t devid, int pipe,
> -			      uint32_t *min, uint32_t *max, const int count, bool async)
> +			      uint32_t *min, uint32_t *max, const int count, bool async,
> +			      int vrr_push_scanline)
>  {
>  	uint32_t dsl, dsl1 = 0, dsl2 = 0, surf, surf1, surf2, surflive, surfl1 = 0, surfl2, saved, tmp;
>  	bool field1 = false, field2 = false;
> @@ -1047,6 +1112,7 @@ static void poll_dsl_surflive(uint32_t devid, int pipe,
>  
>  	while (!quit) {
>  		write_reg(surf, surf2);
> +		push_vrr(devid, pipe, vrr_push_scanline);
>  
>  		while (!quit) {
>  			dsl1 = read_reg(dsl);
> @@ -1083,7 +1149,9 @@ static void poll_dsl_surflive(uint32_t devid, int pipe,
>  	write_reg(surf, saved);
>  }
>  
> -static void poll_dsl_wrap(int pipe, uint32_t *min, uint32_t *max, const int count)
> +static void poll_dsl_wrap(uint32_t devid, int pipe,
> +			  uint32_t *min, uint32_t *max, const int count,
> +			  int vrr_push_scanline)
>  {
>  	uint32_t dsl, dsl1, dsl2;
>  	bool field1, field2;
> @@ -1092,6 +1160,8 @@ static void poll_dsl_wrap(int pipe, uint32_t *min, uint32_t *max, const int coun
>  	dsl = PIPE_REG(pipe, PIPEA_DSL);
>  
>  	while (!quit) {
> +		push_vrr(devid, pipe, vrr_push_scanline);
> +
>  		while (!quit) {
>  			dsl1 = read_reg(dsl);
>  			dsl2 = read_reg(dsl);
> @@ -1211,7 +1281,8 @@ static void __attribute__((noreturn)) usage(const char *name)
>  		" -l,--line <target scanline/pixel>\n"
>  		" -f,--fuzz <target fuzz>\n"
>  		" -x,--pixel\n"
> -		" -a,--async\n",
> +		" -a,--async\n"
> +		" -v,--vrr-push <push scanline>\n",
>  		name);
>  	exit(1);
>  }
> @@ -1223,6 +1294,7 @@ int main(int argc, char *argv[])
>  	int pipe = 0, bit = 0, target_scanline = 0, target_fuzz = 1;
>  	bool test_pixelcount = false;
>  	bool test_async_flip = false;
> +	int vrr_push_scanline = -1;
>  	uint32_t devid;
>  	uint32_t min[2*128] = {};
>  	uint32_t max[2*128] = {};
> @@ -1239,10 +1311,11 @@ int main(int argc, char *argv[])
>  			{ .name = "fuzz", .has_arg = required_argument, },
>  			{ .name = "pixel", .has_arg = no_argument, },
>  			{ .name = "async", .has_arg = no_argument, },
> +			{ .name = "vrr-push", .has_arg = required_argument, },
>  			{ },
>  		};
>  
> -		int opt = getopt_long(argc, argv, "t:p:b:l:f:xa", long_options, NULL);
> +		int opt = getopt_long(argc, argv, "t:p:b:l:f:xav:", long_options, NULL);
>  		if (opt == -1)
>  			break;
>  
> @@ -1311,6 +1384,11 @@ int main(int argc, char *argv[])
>  		case 'a':
>  			test_async_flip = true;
>  			break;
> +		case 'v':
> +			vrr_push_scanline = atoi(optarg);
> +			if (vrr_push_scanline < 0)
> +				usage(argv[0]);
> +			break;
>  		}
>  	}
>  
> @@ -1330,6 +1408,9 @@ int main(int argc, char *argv[])
>  		if (test_async_flip)
>  			usage(argv[0]);
>  
> +		if (vrr_push_scanline >= 0)
> +			usage(argv[0]);
> +
>  		switch (test) {
>  		case TEST_IIR:
>  			test = TEST_IIR_GEN2;
> @@ -1350,6 +1431,9 @@ int main(int argc, char *argv[])
>  		if (test_async_flip)
>  			usage(argv[0]);
>  
> +		if (vrr_push_scanline >= 0)
> +			usage(argv[0]);
> +
>  		switch (test) {
>  		case TEST_IIR:
>  			test = TEST_IIR_GEN3;
> @@ -1383,6 +1467,9 @@ int main(int argc, char *argv[])
>  		if (test_pixelcount)
>  			usage(argv[0]);
>  
> +		if (vrr_push_scanline >= 0)
> +			usage(argv[0]);
> +
>  		switch (test) {
>  		case TEST_IIR:
>  			test = TEST_IIR_GEN3;
> @@ -1427,6 +1514,9 @@ int main(int argc, char *argv[])
>  		if (test_pixelcount)
>  			usage(argv[0]);
>  
> +		if (vrr_push_scanline >= 0 && intel_gen(devid) < 11)
> +			usage(argv[0]);
> +
>  		switch (test) {
>  		case TEST_IIR:
>  			test = TEST_DEIIR;
> @@ -1488,7 +1578,7 @@ int main(int argc, char *argv[])
>  		break;
>  	case TEST_DEIIR:
>  		assert(!test_pixelcount);
> -		poll_dsl_deiir(devid, pipe, bit, min, max, count);
> +		poll_dsl_deiir(devid, pipe, bit, min, max, count, vrr_push_scanline);
>  		break;
>  	case TEST_FRAMECOUNT_GEN3:
>  		if (test_pixelcount)
> @@ -1498,19 +1588,19 @@ int main(int argc, char *argv[])
>  		break;
>  	case TEST_FRAMECOUNT_G4X:
>  		assert(!test_pixelcount);
> -		poll_dsl_framecount_g4x(pipe, min, max, count);
> +		poll_dsl_framecount_g4x(devid, pipe, min, max, count, vrr_push_scanline);
>  		break;
>  	case TEST_FRAMETIMESTAMP:
>  		assert(!test_pixelcount);
> -		poll_dsl_frametimestamp(devid, pipe, min, max, count);
> +		poll_dsl_frametimestamp(devid, pipe, min, max, count, vrr_push_scanline);
>  		break;
>  	case TEST_TIMESTAMP:
>  		assert(!test_pixelcount);
> -		poll_dsl_timestamp(devid, pipe, target_scanline, min, max, count);
> +		poll_dsl_timestamp(devid, pipe, target_scanline, min, max, count, vrr_push_scanline);
>  		break;
>  	case TEST_FLIPCOUNT:
>  		assert(!test_pixelcount);
> -		poll_dsl_flipcount_g4x(devid, pipe, min, max, count);
> +		poll_dsl_flipcount_g4x(devid, pipe, min, max, count, vrr_push_scanline);
>  		break;
>  	case TEST_PAN:
>  		if (test_pixelcount)
> @@ -1518,7 +1608,7 @@ int main(int argc, char *argv[])
>  				       min, max, count);
>  		else
>  			poll_dsl_pan(devid, pipe, target_scanline, target_fuzz,
> -				     min, max, count);
> +				     min, max, count, vrr_push_scanline);
>  		break;
>  	case TEST_FLIP:
>  		if (test_pixelcount)
> @@ -1526,7 +1616,7 @@ int main(int argc, char *argv[])
>  					min, max, count);
>  		else
>  			poll_dsl_flip(devid, pipe, target_scanline, target_fuzz,
> -				      min, max, count, test_async_flip);
> +				      min, max, count, test_async_flip, vrr_push_scanline);
>  		break;
>  	case TEST_FLIPDONE_PIPESTAT:
>  		poll_dsl_flipdone_pipestat(devid, pipe, target_scanline, target_fuzz,
> @@ -1534,16 +1624,16 @@ int main(int argc, char *argv[])
>  		break;
>  	case TEST_FLIPDONE_DEIIR:
>  		poll_dsl_flipdone_deiir(devid, pipe, target_scanline, target_fuzz,
> -					min, max, count, test_async_flip);
> +					min, max, count, test_async_flip, vrr_push_scanline);
>  		break;
>  	case TEST_SURFLIVE:
> -		poll_dsl_surflive(devid, pipe, min, max, count, test_async_flip);
> +		poll_dsl_surflive(devid, pipe, min, max, count, test_async_flip, vrr_push_scanline);
>  		break;
>  	case TEST_WRAP:
>  		if (test_pixelcount)
>  			poll_pixel_wrap(pipe, min, max, count);
>  		else
> -			poll_dsl_wrap(pipe, min, max, count);
> +			poll_dsl_wrap(devid, pipe, min, max, count, vrr_push_scanline);
>  		break;
>  	case TEST_FIELD:
>  		poll_dsl_field(pipe, min, max, count);
> -- 
> 2.19.1
> 
> _______________________________________________
> igt-dev mailing list
> igt-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/igt-dev


More information about the igt-dev mailing list