Message ID | 1416330769-3749-1-git-send-email-matthew.d.roper@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, Nov 18, 2014 at 09:12:49AM -0800, Matt Roper wrote: > From: Gustavo Padovan <gustavo.padovan@collabora.co.uk> > > We need to get hdisplay and vdisplay in a few places so create a > helper to make our job easier. > > v2 (by Matt): Use new stereo doubling function (suggested by Ville) > > v3 (by Matt): > - Add missing kerneldoc (Daniel) > - Use drm_mode_copy() (Jani) > > Cc: dri-devel@lists.freedesktop.org > Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk> > Signed-off-by: Matt Roper <matthew.d.roper@intel.com> > --- > drivers/gpu/drm/drm_crtc.c | 32 ++++++++++++++++++++++---------- > drivers/gpu/drm/i915/intel_display.c | 6 +++--- > include/drm/drm_crtc.h | 2 ++ > 3 files changed, 27 insertions(+), 13 deletions(-) > > diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c > index 56737e7..be1a485 100644 > --- a/drivers/gpu/drm/drm_crtc.c > +++ b/drivers/gpu/drm/drm_crtc.c > @@ -2494,6 +2494,27 @@ int drm_mode_set_config_internal(struct drm_mode_set *set) > EXPORT_SYMBOL(drm_mode_set_config_internal); > > /** > + * drm_crtc_get_hv_timing - Fetches hdisplay/vdisplay for given mode > + * @mode: mode to query > + * @hdisplay: hdisplay value to fill in > + * @vdisplay: vdisplay value to fill in > + * > + * The vdisplay value will be doubled if the specified mode is a stereo mode of > + * the appropriate layout. > + */ > +void drm_crtc_get_hv_timing(const struct drm_display_mode *mode, > + int *hdisplay, int *vdisplay) > +{ > + struct drm_display_mode adjusted; > + > + drm_mode_copy(&adjusted, mode); > + drm_mode_stereo_double(&adjusted); Hmm. The mode may not have the crtc_ timings populated at all here, so drm_mode_stereo_double() might just double some zeroes/garbage. I don't recall anymore if I had some clever idea how to do this. I was hoping we can avoid duplicating the stereo doubling logic in more than once place, but maybe it's just easier to admit defeat? I guess the options are: 1) duplciate some stereo doubling logic 2) populate the required crtc_ timings here as well 3) keep using drm_mode_set_crtcinfo() but remove the offending stuff from the copied mode so that it doesn't interfere with the results 4) add more flags to drm_mode_set_crtcinfo() that prevent the offending stuff from affecting the results > + *hdisplay = adjusted.crtc_hdisplay; > + *vdisplay = adjusted.crtc_vdisplay; > +} > +EXPORT_SYMBOL(drm_crtc_get_hv_timing); > + > +/** > * drm_crtc_check_viewport - Checks that a framebuffer is big enough for the > * CRTC viewport > * @crtc: CRTC that framebuffer will be displayed on > @@ -2510,16 +2531,7 @@ int drm_crtc_check_viewport(const struct drm_crtc *crtc, > { > int hdisplay, vdisplay; > > - hdisplay = mode->hdisplay; > - vdisplay = mode->vdisplay; > - > - if (drm_mode_is_stereo(mode)) { > - struct drm_display_mode adjusted = *mode; > - > - drm_mode_set_crtcinfo(&adjusted, CRTC_STEREO_DOUBLE); > - hdisplay = adjusted.crtc_hdisplay; > - vdisplay = adjusted.crtc_vdisplay; > - } > + drm_crtc_get_hv_timing(mode, &hdisplay, &vdisplay); > > if (crtc->invert_dimensions) > swap(hdisplay, vdisplay); > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c > index 320bf4c..a967623 100644 > --- a/drivers/gpu/drm/i915/intel_display.c > +++ b/drivers/gpu/drm/i915/intel_display.c > @@ -10158,9 +10158,9 @@ intel_modeset_pipe_config(struct drm_crtc *crtc, > * computation to clearly distinguish it from the adjusted mode, which > * can be changed by the connectors in the below retry loop. > */ > - drm_mode_set_crtcinfo(&pipe_config->requested_mode, CRTC_STEREO_DOUBLE); > - pipe_config->pipe_src_w = pipe_config->requested_mode.crtc_hdisplay; > - pipe_config->pipe_src_h = pipe_config->requested_mode.crtc_vdisplay; > + drm_crtc_get_hv_timing(&pipe_config->requested_mode, > + &pipe_config->pipe_src_w, > + &pipe_config->pipe_src_h); > > encoder_retry: > /* Ensure the port clock defaults are reset when retrying. */ > diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h > index 7b28ab0..23236f6 100644 > --- a/include/drm/drm_crtc.h > +++ b/include/drm/drm_crtc.h > @@ -1138,6 +1138,8 @@ extern int drm_plane_init(struct drm_device *dev, > extern void drm_plane_cleanup(struct drm_plane *plane); > extern unsigned int drm_plane_index(struct drm_plane *plane); > extern void drm_plane_force_disable(struct drm_plane *plane); > +extern void drm_crtc_get_hv_timing(const struct drm_display_mode *mode, > + int *hdisplay, int *vdisplay); > extern int drm_crtc_check_viewport(const struct drm_crtc *crtc, > int x, int y, > const struct drm_display_mode *mode, > -- > 1.8.5.1 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 56737e7..be1a485 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c @@ -2494,6 +2494,27 @@ int drm_mode_set_config_internal(struct drm_mode_set *set) EXPORT_SYMBOL(drm_mode_set_config_internal); /** + * drm_crtc_get_hv_timing - Fetches hdisplay/vdisplay for given mode + * @mode: mode to query + * @hdisplay: hdisplay value to fill in + * @vdisplay: vdisplay value to fill in + * + * The vdisplay value will be doubled if the specified mode is a stereo mode of + * the appropriate layout. + */ +void drm_crtc_get_hv_timing(const struct drm_display_mode *mode, + int *hdisplay, int *vdisplay) +{ + struct drm_display_mode adjusted; + + drm_mode_copy(&adjusted, mode); + drm_mode_stereo_double(&adjusted); + *hdisplay = adjusted.crtc_hdisplay; + *vdisplay = adjusted.crtc_vdisplay; +} +EXPORT_SYMBOL(drm_crtc_get_hv_timing); + +/** * drm_crtc_check_viewport - Checks that a framebuffer is big enough for the * CRTC viewport * @crtc: CRTC that framebuffer will be displayed on @@ -2510,16 +2531,7 @@ int drm_crtc_check_viewport(const struct drm_crtc *crtc, { int hdisplay, vdisplay; - hdisplay = mode->hdisplay; - vdisplay = mode->vdisplay; - - if (drm_mode_is_stereo(mode)) { - struct drm_display_mode adjusted = *mode; - - drm_mode_set_crtcinfo(&adjusted, CRTC_STEREO_DOUBLE); - hdisplay = adjusted.crtc_hdisplay; - vdisplay = adjusted.crtc_vdisplay; - } + drm_crtc_get_hv_timing(mode, &hdisplay, &vdisplay); if (crtc->invert_dimensions) swap(hdisplay, vdisplay); diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 320bf4c..a967623 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -10158,9 +10158,9 @@ intel_modeset_pipe_config(struct drm_crtc *crtc, * computation to clearly distinguish it from the adjusted mode, which * can be changed by the connectors in the below retry loop. */ - drm_mode_set_crtcinfo(&pipe_config->requested_mode, CRTC_STEREO_DOUBLE); - pipe_config->pipe_src_w = pipe_config->requested_mode.crtc_hdisplay; - pipe_config->pipe_src_h = pipe_config->requested_mode.crtc_vdisplay; + drm_crtc_get_hv_timing(&pipe_config->requested_mode, + &pipe_config->pipe_src_w, + &pipe_config->pipe_src_h); encoder_retry: /* Ensure the port clock defaults are reset when retrying. */ diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 7b28ab0..23236f6 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -1138,6 +1138,8 @@ extern int drm_plane_init(struct drm_device *dev, extern void drm_plane_cleanup(struct drm_plane *plane); extern unsigned int drm_plane_index(struct drm_plane *plane); extern void drm_plane_force_disable(struct drm_plane *plane); +extern void drm_crtc_get_hv_timing(const struct drm_display_mode *mode, + int *hdisplay, int *vdisplay); extern int drm_crtc_check_viewport(const struct drm_crtc *crtc, int x, int y, const struct drm_display_mode *mode,