drm: Set the relevant infoframe field when scanning out a 3D mode
When scanning out a 3D mode on HDMI, we need to send an HDMI infoframe with the corresponding layout to the sink. v2: Make s3d_structure_from_display_mode() less subtle (Ville Syrjälä) Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Damien Lespiau <damien.lespiau@intel.com> Acked-by: Dave Airlie <airlied@gmail.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
a3ff6d5609
commit
4eed4a0a4a
1 changed files with 38 additions and 2 deletions
|
@ -3421,6 +3421,33 @@ drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode);
|
EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode);
|
||||||
|
|
||||||
|
static enum hdmi_3d_structure
|
||||||
|
s3d_structure_from_display_mode(const struct drm_display_mode *mode)
|
||||||
|
{
|
||||||
|
u32 layout = mode->flags & DRM_MODE_FLAG_3D_MASK;
|
||||||
|
|
||||||
|
switch (layout) {
|
||||||
|
case DRM_MODE_FLAG_3D_FRAME_PACKING:
|
||||||
|
return HDMI_3D_STRUCTURE_FRAME_PACKING;
|
||||||
|
case DRM_MODE_FLAG_3D_FIELD_ALTERNATIVE:
|
||||||
|
return HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE;
|
||||||
|
case DRM_MODE_FLAG_3D_LINE_ALTERNATIVE:
|
||||||
|
return HDMI_3D_STRUCTURE_LINE_ALTERNATIVE;
|
||||||
|
case DRM_MODE_FLAG_3D_SIDE_BY_SIDE_FULL:
|
||||||
|
return HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL;
|
||||||
|
case DRM_MODE_FLAG_3D_L_DEPTH:
|
||||||
|
return HDMI_3D_STRUCTURE_L_DEPTH;
|
||||||
|
case DRM_MODE_FLAG_3D_L_DEPTH_GFX_GFX_DEPTH:
|
||||||
|
return HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH;
|
||||||
|
case DRM_MODE_FLAG_3D_TOP_AND_BOTTOM:
|
||||||
|
return HDMI_3D_STRUCTURE_TOP_AND_BOTTOM;
|
||||||
|
case DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF:
|
||||||
|
return HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF;
|
||||||
|
default:
|
||||||
|
return HDMI_3D_STRUCTURE_INVALID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* drm_hdmi_vendor_infoframe_from_display_mode() - fill an HDMI infoframe with
|
* drm_hdmi_vendor_infoframe_from_display_mode() - fill an HDMI infoframe with
|
||||||
* data from a DRM display mode
|
* data from a DRM display mode
|
||||||
|
@ -3438,20 +3465,29 @@ drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame,
|
||||||
const struct drm_display_mode *mode)
|
const struct drm_display_mode *mode)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
u32 s3d_flags;
|
||||||
u8 vic;
|
u8 vic;
|
||||||
|
|
||||||
if (!frame || !mode)
|
if (!frame || !mode)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
vic = drm_match_hdmi_mode(mode);
|
vic = drm_match_hdmi_mode(mode);
|
||||||
if (!vic)
|
s3d_flags = mode->flags & DRM_MODE_FLAG_3D_MASK;
|
||||||
|
|
||||||
|
if (!vic && !s3d_flags)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (vic && s3d_flags)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
err = hdmi_vendor_infoframe_init(frame);
|
err = hdmi_vendor_infoframe_init(frame);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
if (vic)
|
||||||
frame->vic = vic;
|
frame->vic = vic;
|
||||||
|
else
|
||||||
|
frame->s3d_struct = s3d_structure_from_display_mode(mode);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue