aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_edid.c
diff options
context:
space:
mode:
authorDamien Lespiau <damien.lespiau@intel.com>2013-09-25 11:45:26 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-10-01 01:45:30 -0400
commit4eed4a0a4ac31830b4c328739cabb69721584bfc (patch)
treeada8317d197cc9147cde403eade738a8a170f7a4 /drivers/gpu/drm/drm_edid.c
parenta3ff6d5609145b06f602a5bc8e8bdbf66b96370b (diff)
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>
Diffstat (limited to 'drivers/gpu/drm/drm_edid.c')
-rw-r--r--drivers/gpu/drm/drm_edid.c40
1 files changed, 38 insertions, 2 deletions
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 73660075de31..0bae76d40f28 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3421,6 +3421,33 @@ drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
3421} 3421}
3422EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode); 3422EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode);
3423 3423
3424static enum hdmi_3d_structure
3425s3d_structure_from_display_mode(const struct drm_display_mode *mode)
3426{
3427 u32 layout = mode->flags & DRM_MODE_FLAG_3D_MASK;
3428
3429 switch (layout) {
3430 case DRM_MODE_FLAG_3D_FRAME_PACKING:
3431 return HDMI_3D_STRUCTURE_FRAME_PACKING;
3432 case DRM_MODE_FLAG_3D_FIELD_ALTERNATIVE:
3433 return HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE;
3434 case DRM_MODE_FLAG_3D_LINE_ALTERNATIVE:
3435 return HDMI_3D_STRUCTURE_LINE_ALTERNATIVE;
3436 case DRM_MODE_FLAG_3D_SIDE_BY_SIDE_FULL:
3437 return HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL;
3438 case DRM_MODE_FLAG_3D_L_DEPTH:
3439 return HDMI_3D_STRUCTURE_L_DEPTH;
3440 case DRM_MODE_FLAG_3D_L_DEPTH_GFX_GFX_DEPTH:
3441 return HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH;
3442 case DRM_MODE_FLAG_3D_TOP_AND_BOTTOM:
3443 return HDMI_3D_STRUCTURE_TOP_AND_BOTTOM;
3444 case DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF:
3445 return HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF;
3446 default:
3447 return HDMI_3D_STRUCTURE_INVALID;
3448 }
3449}
3450
3424/** 3451/**
3425 * drm_hdmi_vendor_infoframe_from_display_mode() - fill an HDMI infoframe with 3452 * drm_hdmi_vendor_infoframe_from_display_mode() - fill an HDMI infoframe with
3426 * data from a DRM display mode 3453 * data from a DRM display mode
@@ -3438,20 +3465,29 @@ drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame,
3438 const struct drm_display_mode *mode) 3465 const struct drm_display_mode *mode)
3439{ 3466{
3440 int err; 3467 int err;
3468 u32 s3d_flags;
3441 u8 vic; 3469 u8 vic;
3442 3470
3443 if (!frame || !mode) 3471 if (!frame || !mode)
3444 return -EINVAL; 3472 return -EINVAL;
3445 3473
3446 vic = drm_match_hdmi_mode(mode); 3474 vic = drm_match_hdmi_mode(mode);
3447 if (!vic) 3475 s3d_flags = mode->flags & DRM_MODE_FLAG_3D_MASK;
3476
3477 if (!vic && !s3d_flags)
3478 return -EINVAL;
3479
3480 if (vic && s3d_flags)
3448 return -EINVAL; 3481 return -EINVAL;
3449 3482
3450 err = hdmi_vendor_infoframe_init(frame); 3483 err = hdmi_vendor_infoframe_init(frame);
3451 if (err < 0) 3484 if (err < 0)
3452 return err; 3485 return err;
3453 3486
3454 frame->vic = vic; 3487 if (vic)
3488 frame->vic = vic;
3489 else
3490 frame->s3d_struct = s3d_structure_from_display_mode(mode);
3455 3491
3456 return 0; 3492 return 0;
3457} 3493}