On 02/12/2019 18:12, Ville Syrjälä wrote:
> On Mon, Dec 02, 2019 at 03:27:51AM -0800, Devarsh Thakkar wrote:
>> Add function to derive floating value of vertical
>> refresh rate from drm mode using pixel clock,
>> horizontal total size and vertical total size.
>>
>> Use this function to find suitable mode having vrefresh
>> value which is matching with user provided vrefresh value.
>>
>> If user doesn't provide any vrefresh value in args then
>> update vertical refresh rate value in pipe args using this
>> function.
>>
>> Also use this function for printing floating vrefresh while
>> dumping all available modes.
>>
>> This will give more accurate picture to user for available modes
>> differentiated by floating vertical refresh rate and help user
>> select more appropriate mode using suitable refresh rate value.
>>
>> V3: Change name of function used to derive refresh rate.
>> V2: 1) Don't use inline function for deriving refresh rate from mode.
>>     2) If requested mode not found, print refresh rate only
>>        if user had provided it in args.
>>
>> Signed-off-by: Devarsh Thakkar <[email protected]>
>> ---
>>  tests/modetest/modetest.c | 40 +++++++++++++++++++++++++++-------------
>>  1 file changed, 27 insertions(+), 13 deletions(-)
>>
>> diff --git a/tests/modetest/modetest.c b/tests/modetest/modetest.c
>> index b4edfcb..19ce20f 100644
>> --- a/tests/modetest/modetest.c
>> +++ b/tests/modetest/modetest.c
>> @@ -133,6 +133,12 @@ static inline int64_t U642I64(uint64_t val)
>>      return (int64_t)*((int64_t *)&val);
>>  }
>>  
>> +static float mode_vrefresh(drmModeModeInfo *mode)
>> +{
>> +    return  mode->clock * 1000.00
>> +                    / (mode->htotal * mode->vtotal);
>> +}
>> +
>>  #define bit_name_fn(res)                                    \
>>  const char * res##_str(int type) {                          \
>>      unsigned int i;                                         \
>> @@ -210,9 +216,9 @@ static void dump_encoders(struct device *dev)
>>  
>>  static void dump_mode(drmModeModeInfo *mode)
>>  {
>> -    printf("  %s %d %d %d %d %d %d %d %d %d %d",
>> +    printf("  %s %.2f %d %d %d %d %d %d %d %d %d",
>>             mode->name,
>> -           mode->vrefresh,
>> +           mode_vrefresh(mode),
>>             mode->hdisplay,
>>             mode->hsync_start,
>>             mode->hsync_end,
>> @@ -823,12 +829,11 @@ struct plane_arg {
>>  
>>  static drmModeModeInfo *
>>  connector_find_mode(struct device *dev, uint32_t con_id, const char 
>> *mode_str,
>> -    const float vrefresh)
>> +    float *vrefresh)
> 
> This change still looks pointless.

Without this, you cannot set 1000/1001 CEA alternate clock modes, so, no this 
is not pointless.

This is actual something I always wanted to implement !

Reviewed-by: Neil Armstrong <[email protected]>

> 
>>  {
>>      drmModeConnector *connector;
>>      drmModeModeInfo *mode;
>>      int i;
>> -    float mode_vrefresh;
>>  
>>      connector = get_connector_by_id(dev, con_id);
>>      if (!connector || !connector->count_modes)
>> @@ -837,16 +842,19 @@ connector_find_mode(struct device *dev, uint32_t 
>> con_id, const char *mode_str,
>>      for (i = 0; i < connector->count_modes; i++) {
>>              mode = &connector->modes[i];
>>              if (!strcmp(mode->name, mode_str)) {
>> -                    /* If the vertical refresh frequency is not specified 
>> then return the
>> -                     * first mode that match with the name. Else, return 
>> the mode that match
>> -                     * the name and the specified vertical refresh 
>> frequency.
>> +                    /* If the vertical refresh frequency is not specified
>> +                     * then return the first mode that match with the name
>> +                     * and update corresponding vrefresh in pipe_arg.
>> +                     * Else, return the mode that match the name and
>> +                     * the specified vertical refresh frequency.
>>                       */
>> -                    mode_vrefresh = mode->clock * 1000.00
>> -                                    / (mode->htotal * mode->vtotal);
>> -                    if (vrefresh == 0)
>> +                    if (*vrefresh == 0) {
>> +                            *vrefresh = mode_vrefresh(mode);
>>                              return mode;
>> -                    else if (fabs(mode_vrefresh - vrefresh) < 0.005)
>> +                    } else if (fabs(mode_vrefresh(mode)
>> +                               - *vrefresh) < 0.005) {
>>                              return mode;
>> +                    }
>>              }
>>      }
>>  
>> @@ -909,9 +917,15 @@ static int pipe_find_crtc_and_mode(struct device *dev, 
>> struct pipe_arg *pipe)
>>  
>>      for (i = 0; i < (int)pipe->num_cons; i++) {
>>              mode = connector_find_mode(dev, pipe->con_ids[i],
>> -                                       pipe->mode_str, pipe->vrefresh);
>> +                                       pipe->mode_str, &pipe->vrefresh);
>>              if (mode == NULL) {
>> -                    fprintf(stderr,
>> +                    if (pipe->vrefresh)
>> +                            fprintf(stderr,
>> +                            "failed to find mode "
>> +                            "\"%s-%.2fHz\" for connector %s\n",
>> +                            pipe->mode_str, pipe->vrefresh, pipe->cons[i]);
>> +                    else
>> +                            fprintf(stderr,
>>                              "failed to find mode \"%s\" for connector %s\n",
>>                              pipe->mode_str, pipe->cons[i]);
>>                      return -EINVAL;
>> -- 
>> 2.7.4
> 

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to