Message ID | 20191004141914.20600-3-ville.syrjala@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/4] drm/edid: Make drm_get_cea_aspect_ratio() static | expand |
>-----Original Message----- >From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville Syrjala >Sent: Friday, October 4, 2019 7:49 PM >To: dri-devel@lists.freedesktop.org >Cc: intel-gfx@lists.freedesktop.org; Wayne Lin <waynelin@amd.com> >Subject: [Intel-gfx] [PATCH 3/4] drm/edid: Fix HDMI VIC handling > >From: Ville Syrjälä <ville.syrjala@linux.intel.com> > >Extract drm_mode_hdmi_vic() to correctly calculate the final HDMI VIC for us. >Currently this is being done a bit differently between the AVI and HDMI infoframes. >Let's get both to agree on this. > >We need to allow the case where a mode is both 3D and has a HDMI VIC. Currently >we'll just refuse to generate the HDMI infoframe when we really should be setting >HDMI VIC to 0 and instead enabling 3D stereo signalling. > >If the sink doesn't even support the HDMI infoframe we should not be picking the >HDMI VIC in favor of the CEA VIC, because then we'll end up not sending either VIC in >the end. Looks good to me. Reviewed-by: Uma Shankar <uma.shankar@intel.com> >Cc: Wayne Lin <waynelin@amd.com> >Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> >--- > drivers/gpu/drm/drm_edid.c | 37 +++++++++++++++++++++---------------- > 1 file changed, 21 insertions(+), 16 deletions(-) > >diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index >495b7fb4d9ef..c7f9f7ca75a2 100644 >--- a/drivers/gpu/drm/drm_edid.c >+++ b/drivers/gpu/drm/drm_edid.c >@@ -5160,11 +5160,25 @@ drm_hdmi_infoframe_set_hdr_metadata(struct >hdmi_drm_infoframe *frame, } >EXPORT_SYMBOL(drm_hdmi_infoframe_set_hdr_metadata); > >+static u8 drm_mode_hdmi_vic(struct drm_connector *connector, >+ const struct drm_display_mode *mode) { >+ bool has_hdmi_infoframe = connector ? >+ connector->display_info.has_hdmi_infoframe : false; >+ >+ if (!has_hdmi_infoframe) >+ return 0; >+ >+ /* No HDMI VIC when signalling 3D video format */ >+ if (mode->flags & DRM_MODE_FLAG_3D_MASK) >+ return 0; >+ >+ return drm_match_hdmi_mode(mode); >+} >+ > static u8 drm_mode_cea_vic(struct drm_connector *connector, > const struct drm_display_mode *mode) { >- u8 vendor_if_vic = drm_match_hdmi_mode(mode); >- bool is_s3d = mode->flags & DRM_MODE_FLAG_3D_MASK; > u8 vic; > > /* >@@ -5173,7 +5187,7 @@ static u8 drm_mode_cea_vic(struct drm_connector >*connector, > * VIC in AVI infoframes. Lets check if this mode is present in > * HDMI 1.4b 4K modes > */ >- if (drm_valid_hdmi_vic(vendor_if_vic) && !is_s3d) >+ if (drm_mode_hdmi_vic(connector, mode)) > return 0; > > vic = drm_match_cea_mode(mode); >@@ -5433,8 +5447,6 @@ drm_hdmi_vendor_infoframe_from_display_mode(struct >hdmi_vendor_infoframe *frame, > bool has_hdmi_infoframe = connector ? > connector->display_info.has_hdmi_infoframe : false; > int err; >- u32 s3d_flags; >- u8 vic; > > if (!frame || !mode) > return -EINVAL; >@@ -5442,8 +5454,9 @@ drm_hdmi_vendor_infoframe_from_display_mode(struct >hdmi_vendor_infoframe *frame, > if (!has_hdmi_infoframe) > return -EINVAL; > >- vic = drm_match_hdmi_mode(mode); >- s3d_flags = mode->flags & DRM_MODE_FLAG_3D_MASK; >+ err = hdmi_vendor_infoframe_init(frame); >+ if (err < 0) >+ return err; > > /* > * Even if it's not absolutely necessary to send the infoframe @@ -5454,15 >+5467,7 @@ drm_hdmi_vendor_infoframe_from_display_mode(struct >hdmi_vendor_infoframe *frame, > * mode if the source simply stops sending the infoframe when > * it wants to switch from 3D to 2D. > */ >- >- if (vic && s3d_flags) >- return -EINVAL; >- >- err = hdmi_vendor_infoframe_init(frame); >- if (err < 0) >- return err; >- >- frame->vic = vic; >+ frame->vic = drm_mode_hdmi_vic(connector, mode); > frame->s3d_struct = s3d_structure_from_display_mode(mode); > > return 0; >-- >2.21.0 > >_______________________________________________ >Intel-gfx mailing list >Intel-gfx@lists.freedesktop.org >https://lists.freedesktop.org/mailman/listinfo/intel-gfx
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 495b7fb4d9ef..c7f9f7ca75a2 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -5160,11 +5160,25 @@ drm_hdmi_infoframe_set_hdr_metadata(struct hdmi_drm_infoframe *frame, } EXPORT_SYMBOL(drm_hdmi_infoframe_set_hdr_metadata); +static u8 drm_mode_hdmi_vic(struct drm_connector *connector, + const struct drm_display_mode *mode) +{ + bool has_hdmi_infoframe = connector ? + connector->display_info.has_hdmi_infoframe : false; + + if (!has_hdmi_infoframe) + return 0; + + /* No HDMI VIC when signalling 3D video format */ + if (mode->flags & DRM_MODE_FLAG_3D_MASK) + return 0; + + return drm_match_hdmi_mode(mode); +} + static u8 drm_mode_cea_vic(struct drm_connector *connector, const struct drm_display_mode *mode) { - u8 vendor_if_vic = drm_match_hdmi_mode(mode); - bool is_s3d = mode->flags & DRM_MODE_FLAG_3D_MASK; u8 vic; /* @@ -5173,7 +5187,7 @@ static u8 drm_mode_cea_vic(struct drm_connector *connector, * VIC in AVI infoframes. Lets check if this mode is present in * HDMI 1.4b 4K modes */ - if (drm_valid_hdmi_vic(vendor_if_vic) && !is_s3d) + if (drm_mode_hdmi_vic(connector, mode)) return 0; vic = drm_match_cea_mode(mode); @@ -5433,8 +5447,6 @@ drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame, bool has_hdmi_infoframe = connector ? connector->display_info.has_hdmi_infoframe : false; int err; - u32 s3d_flags; - u8 vic; if (!frame || !mode) return -EINVAL; @@ -5442,8 +5454,9 @@ drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame, if (!has_hdmi_infoframe) return -EINVAL; - vic = drm_match_hdmi_mode(mode); - s3d_flags = mode->flags & DRM_MODE_FLAG_3D_MASK; + err = hdmi_vendor_infoframe_init(frame); + if (err < 0) + return err; /* * Even if it's not absolutely necessary to send the infoframe @@ -5454,15 +5467,7 @@ drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame, * mode if the source simply stops sending the infoframe when * it wants to switch from 3D to 2D. */ - - if (vic && s3d_flags) - return -EINVAL; - - err = hdmi_vendor_infoframe_init(frame); - if (err < 0) - return err; - - frame->vic = vic; + frame->vic = drm_mode_hdmi_vic(connector, mode); frame->s3d_struct = s3d_structure_from_display_mode(mode); return 0;