diff options
author | Damien Lespiau <damien.lespiau@intel.com> | 2013-09-25 11:45:26 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-10-01 01:45:30 -0400 |
commit | 4eed4a0a4ac31830b4c328739cabb69721584bfc (patch) | |
tree | ada8317d197cc9147cde403eade738a8a170f7a4 /drivers/gpu/drm/drm_edid.c | |
parent | a3ff6d5609145b06f602a5bc8e8bdbf66b96370b (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.c | 40 |
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 | } |
3422 | EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode); | 3422 | EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode); |
3423 | 3423 | ||
3424 | static enum hdmi_3d_structure | ||
3425 | s3d_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 | } |