[PATCH v5 8/9] drm: Add aspect ratio parsing in DRM layer

Nautiyal, Ankit K ankit.k.nautiyal at intel.com
Mon Feb 26 15:48:57 UTC 2018



On 2/23/2018 8:24 PM, Ville Syrjälä wrote:
> On Thu, Feb 15, 2018 at 05:51:01PM +0530, Nautiyal, Ankit K wrote:
>> From: "Sharma, Shashank" <shashank.sharma at intel.com>
>>
>> Current DRM layer functions don't parse aspect ratio information
>> while converting a user mode->kernel mode or vice versa. This
>> causes modeset to pick mode with wrong aspect ratio, eventually
>> causing failures in HDMI compliance test cases, due to wrong VIC.
>>
>> This patch adds aspect ratio information in DRM's mode conversion
>> and mode comparision functions, to make sure kernel picks mode
>> with right aspect ratio (as per the VIC).
>>
>> Background:
>> This patch was once reviewed and merged, and later reverted due to
>> lack of DRM cap protection. This is a re-spin of this patch, this
>> time with DRM cap protection, to avoid aspect ratio information, when
>> the client doesn't request for it.
>>
>> Review link: https://pw-emeril.freedesktop.org/patch/104068/
>> Background discussion: https://patchwork.kernel.org/patch/9379057/
>>
>> Signed-off-by: Shashank Sharma <shashank.sharma at intel.com>
>> Signed-off-by: Lin, Jia <lin.a.jia at intel.com>
>> Signed-off-by: Akashdeep Sharma <akashdeep.sharma at intel.com>
>> Reviewed-by: Jim Bride <jim.bride at linux.intel.com> (V2)
>> Reviewed-by: Jose Abreu <Jose.Abreu at synopsys.com> (V4)
>>
>> Cc: Ville Syrjala <ville.syrjala at linux.intel.com>
>> Cc: Jim Bride <jim.bride at linux.intel.com>
>> Cc: Jose Abreu <Jose.Abreu at synopsys.com>
>> Cc: Ankit Nautiyal <ankit.k.nautiyal at intel.com>
>>
>> V3: modified the aspect-ratio check in drm_mode_equal as per new flags
>>      provided by Ville. https://patchwork.freedesktop.org/patch/188043/
>> V4: rebase
>> V5: rebase
>> ---
>>   drivers/gpu/drm/drm_modes.c | 33 ++++++++++++++++++++++++++++++++-
>>   1 file changed, 32 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
>> index ca4c5cc..25140b9 100644
>> --- a/drivers/gpu/drm/drm_modes.c
>> +++ b/drivers/gpu/drm/drm_modes.c
>> @@ -1050,7 +1050,8 @@ bool drm_mode_equal(const struct drm_display_mode *mode1,
>>   			      DRM_MODE_MATCH_TIMINGS |
>>   			      DRM_MODE_MATCH_CLOCK |
>>   			      DRM_MODE_MATCH_FLAGS |
>> -			      DRM_MODE_MATCH_3D_FLAGS);
>> +			      DRM_MODE_MATCH_3D_FLAGS|
>> +			      DRM_MODE_MATCH_ASPECT_RATIO);
> Hmm. I wonder if all the users are expecting this. Based on a cursory
> examination drm_fb_helper might want to ignore the aspect ratio since
> it's just looking to clone the same mode on multiple outputs. The other
> cases don't look to me like they should suffer badly from this.

Agreed.
Need to add a function drm_mode_equal_no_aspect_ratio() in drm_modes.c 
which will compare
every field, other than the aspect-ratio.
Next, in the drm_target_cloned( ), where same modes are to be cloned on 
multiple outputs, instead
of drm_mode_equal( ), drm_mode_equal_no_aspect_ratio( ) must be called.

Is this approach correct?

>
>>   }
>>   EXPORT_SYMBOL(drm_mode_equal);
>>   
>> @@ -1649,6 +1650,21 @@ void drm_mode_convert_to_umode(struct drm_mode_modeinfo *out,
>>   	out->vrefresh = in->vrefresh;
>>   	out->flags = in->flags;
>>   	out->type = in->type;
>> +	out->flags &= ~DRM_MODE_FLAG_PIC_AR_MASK;
> This looks redundant. The internal mode should not have the aspect ratio
> flags set. Or are we changing that?

Yes right, the aspect-ratio flags are never set in the internal-mode flags.
This line can be dropped.

>
>> +
>> +	switch (in->picture_aspect_ratio) {
>> +	case HDMI_PICTURE_ASPECT_4_3:
>> +		out->flags |= DRM_MODE_FLAG_PIC_AR_4_3;
>> +		break;
>> +	case HDMI_PICTURE_ASPECT_16_9:
>> +		out->flags |= DRM_MODE_FLAG_PIC_AR_16_9;
>> +		break;
>> +	case HDMI_PICTURE_ASPECT_RESERVED:
>> +	default:
>> +		out->flags |= DRM_MODE_FLAG_PIC_AR_NONE;
>> +		break;
>> +	}
>> +
>>   	strncpy(out->name, in->name, DRM_DISPLAY_MODE_LEN);
>>   	out->name[DRM_DISPLAY_MODE_LEN-1] = 0;
>>   }
>> @@ -1693,6 +1709,21 @@ int drm_mode_convert_umode(struct drm_device *dev,
>>   	strncpy(out->name, in->name, DRM_DISPLAY_MODE_LEN);
>>   	out->name[DRM_DISPLAY_MODE_LEN-1] = 0;
>>   
>> +	/* Clearing picture aspect ratio bits from out flags */
> What the code is doing is obvious so this comment is redundant.
> The non-obvious part (ie. the "why?") is what the comment
> should contain.

Thanks for pointing that out, will take care of this in future patches.

Regards,
Ankit

>
>> +	out->flags &= ~DRM_MODE_FLAG_PIC_AR_MASK;
>> +
>> +	switch (in->flags & DRM_MODE_FLAG_PIC_AR_MASK) {
>> +	case DRM_MODE_FLAG_PIC_AR_4_3:
>> +		out->picture_aspect_ratio |= HDMI_PICTURE_ASPECT_4_3;
>> +		break;
>> +	case DRM_MODE_FLAG_PIC_AR_16_9:
>> +		out->picture_aspect_ratio |= HDMI_PICTURE_ASPECT_16_9;
>> +		break;
>> +	default:
>> +		out->picture_aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
>> +		break;
>> +	}
>> +
>>   	out->status = drm_mode_validate_driver(dev, out);
>>   	if (out->status != MODE_OK)
>>   		goto out;
>> -- 
>> 2.7.4

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20180226/a38bb14a/attachment.html>


More information about the dri-devel mailing list