[igt-dev] [PATCH i-g-t 1/2] lib/kms: Add for_each_pipe_clamped

Petri Latvala petri.latvala at intel.com
Tue Mar 23 11:42:27 UTC 2021


On Tue, Mar 23, 2021 at 04:23:05PM +0530, venkata.sai.patnana at intel.com wrote:
> From: Patnana Venkata Sai <venkata.sai.patnana at intel.com>
> 
> for_each_pipe and for_each_pipe_static cannot be used for limiting pipe iteration.
> This api will provide limits the pipe iteration
> 
> v2: Handle fused pipes (Petri)
>     Add a variable pipe count (Bhanu)
> v3: change api name as suggested (Petri)
> 
> Cc: Uma Shankar <uma.shankar at intel.com>
> Cc: Juha-Pekka Heikkilä <juha-pekka.heikkila at intel.com>
> Cc: Modem Bhanuprakash <bhanuprakash.modem at intel.com>
> Cc: Karthik B S <karthik.b.s at intel.com>
> Cc: Petri Latvala <petri.latvala at intel.com>
> Signed-off-by: Patnana Venkata Sai <venkata.sai.patnana at intel.com>
> ---
>  lib/igt_kms.h | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/lib/igt_kms.h b/lib/igt_kms.h
> index 09b10b3e04..7dbf14483c 100644
> --- a/lib/igt_kms.h
> +++ b/lib/igt_kms.h
> @@ -534,6 +534,18 @@ static inline bool igt_output_is_connected(igt_output_t *output)
>  	for_each_pipe_static(pipe) \
>  		for_each_if((display)->pipes[(pipe)].enabled)
>  
> +/**
> + * for_each_pipe_clamped:
> + * @display: a pointer to an #igt_display_t structure
> + * @pipe: The pipe to iterate.
> + * @pipe_count: Number of pipes to be iterate
> + *
> + * This for loop iterates based on pipe_count and supported by IGT libraries,
> + */
> +#define for_each_pipe_clamped(display, pipe, pipe_count) \
> +	for_each_pipe_static(pipe) \
> +                for_each_if((display)->pipes[(pipe)].enabled) \
> +			for_each_if(pipe_count-- > 0)

This is awkward to use. It requires an lvalue as the third parameter,
and doesn't restore it after the loop is done. Patch 2/2 completely
breaks testing when running multiple subtests at a time.

You need something like

#define for_each_pipe_clamped(display, pipe, count) \
  for (int igt_tokencat(__tmpint,__LINE__) = 0, pipe = 0; \
      igt_tokencat(__tmpint,__LINE__) < (count) && (pipe) < IGT_MAX_PIPES; \
      (pipe) ++) \
      for_each_if((display)->pipes[(pipe)].enabled) \
        for_each_if(igt_tokencat(__tmpint,__LINE__) ++)


(Above code completely untested)

-- 
Petri Latvala




>  /**
>   * for_each_pipe_with_valid_output:
>   * @display: a pointer to an #igt_display_t structure
> -- 
> 2.25.1
> 


More information about the igt-dev mailing list