On Thu, 2009-11-12 at 14:59 -0500, Alex Deucher wrote:
> From af779d3c5a1111530db7f88d16969a49b9dcb1db Mon Sep 17 00:00:00 2001
> From: Alex Deucher <[email protected]>
> Date: Thu, 12 Nov 2009 14:55:14 -0500
> Subject: [PATCH] drm/radeon/kms: rework scaler handling
> 
> Keep requested scaler type in radeon_encoder
> and the actual scaler type used in radeon_crtc.
> This prevents us from enabling the scaler when it's
> not required (i.e., the requested mode is the native
> mode).  Also, always set the adjusted mode equal
> to the native mode for lvds.
> 
> Should fix:
> https://bugzilla.redhat.com/show_bug.cgi?id=522271
> 
> Signed-off-by: Alex Deucher <[email protected]>
Ack-by: Jerome Glisse <[email protected]>

> ---
>  drivers/gpu/drm/radeon/radeon_display.c         |   12 +++-
>  drivers/gpu/drm/radeon/radeon_encoders.c        |   39 ++++--------
>  drivers/gpu/drm/radeon/radeon_legacy_encoders.c |   71 
> ++++++-----------------
>  drivers/gpu/drm/radeon/radeon_mode.h            |    3 -
>  4 files changed, 40 insertions(+), 85 deletions(-)
> 
> diff --git a/drivers/gpu/drm/radeon/radeon_display.c
> b/drivers/gpu/drm/radeon/radeon_display.c
> index 8b117e8..5859109 100644
> --- a/drivers/gpu/drm/radeon/radeon_display.c
> +++ b/drivers/gpu/drm/radeon/radeon_display.c
> @@ -750,9 +750,17 @@ bool radeon_crtc_scaling_mode_fixup(struct drm_crtc 
> *crtc,
>               if (encoder->crtc != crtc)
>                       continue;
>               if (first) {
> -                     radeon_crtc->rmx_type = radeon_encoder->rmx_type;
> +                     /* set scaling */
> +                     if (radeon_encoder->rmx_type == RMX_OFF)
> +                             radeon_crtc->rmx_type = RMX_OFF;
> +                     else if (mode->hdisplay < 
> radeon_encoder->native_mode.hdisplay ||
> +                              mode->vdisplay < 
> radeon_encoder->native_mode.vdisplay)
> +                             radeon_crtc->rmx_type = 
> radeon_encoder->rmx_type;
> +                     else
> +                             radeon_crtc->rmx_type = RMX_OFF;
> +                     /* copy native mode */
>                       memcpy(&radeon_crtc->native_mode,
> -                             &radeon_encoder->native_mode,
> +                            &radeon_encoder->native_mode,
>                               sizeof(struct drm_display_mode));
>                       first = false;
>               } else {
> diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c
> b/drivers/gpu/drm/radeon/radeon_encoders.c
> index d42bc51..57a29f3 100644
> --- a/drivers/gpu/drm/radeon/radeon_encoders.c
> +++ b/drivers/gpu/drm/radeon/radeon_encoders.c
> @@ -163,29 +163,6 @@ radeon_get_connector_for_encoder(struct
> drm_encoder *encoder)
>       return NULL;
>  }
> 
> -/* used for both atom and legacy */
> -void radeon_rmx_mode_fixup(struct drm_encoder *encoder,
> -                        struct drm_display_mode *mode,
> -                        struct drm_display_mode *adjusted_mode)
> -{
> -     struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
> -     struct drm_device *dev = encoder->dev;
> -     struct radeon_device *rdev = dev->dev_private;
> -     struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
> -
> -     if (mode->hdisplay < native_mode->hdisplay ||
> -         mode->vdisplay < native_mode->vdisplay) {
> -             int mode_id = adjusted_mode->base.id;
> -             *adjusted_mode = *native_mode;
> -             if (!ASIC_IS_AVIVO(rdev)) {
> -                     adjusted_mode->hdisplay = mode->hdisplay;
> -                     adjusted_mode->vdisplay = mode->vdisplay;
> -             }
> -             adjusted_mode->base.id = mode_id;
> -     }
> -}
> -
> -
>  static bool radeon_atom_mode_fixup(struct drm_encoder *encoder,
>                                  struct drm_display_mode *mode,
>                                  struct drm_display_mode *adjusted_mode)
> @@ -198,14 +175,24 @@ static bool radeon_atom_mode_fixup(struct
> drm_encoder *encoder,
>       radeon_encoder_set_active_device(encoder);
>       drm_mode_set_crtcinfo(adjusted_mode, 0);
> 
> -     if (radeon_encoder->rmx_type != RMX_OFF)
> -             radeon_rmx_mode_fixup(encoder, mode, adjusted_mode);
> -
>       /* hw bug */
>       if ((mode->flags & DRM_MODE_FLAG_INTERLACE)
>           && (mode->crtc_vsync_start < (mode->crtc_vdisplay + 2)))
>               adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay 
> + 2;
> 
> +     /* get the native mode for LVDS */
> +     if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT)) {
> +             struct drm_display_mode *native_mode = 
> &radeon_encoder->native_mode;
> +             int mode_id = adjusted_mode->base.id;
> +             *adjusted_mode = *native_mode;
> +             if (!ASIC_IS_AVIVO(rdev)) {
> +                     adjusted_mode->hdisplay = mode->hdisplay;
> +                     adjusted_mode->vdisplay = mode->vdisplay;
> +             }
> +             adjusted_mode->base.id = mode_id;
> +     }
> +
> +     /* get the native mode for TV */
>       if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) {
>               struct radeon_encoder_atom_dac *tv_dac = 
> radeon_encoder->enc_priv;
>               if (tv_dac) {
> diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c
> b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c
> index a1d9d29..ae554bf 100644
> --- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c
> +++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c
> @@ -184,9 +184,9 @@ static void radeon_legacy_lvds_mode_set(struct
> drm_encoder *encoder,
>               radeon_combios_encoder_crtc_scratch_regs(encoder, 
> radeon_crtc->crtc_id);
>  }
> 
> -static bool radeon_legacy_lvds_mode_fixup(struct drm_encoder *encoder,
> -                                       struct drm_display_mode *mode,
> -                                       struct drm_display_mode 
> *adjusted_mode)
> +static bool radeon_legacy_mode_fixup(struct drm_encoder *encoder,
> +                                  struct drm_display_mode *mode,
> +                                  struct drm_display_mode *adjusted_mode)
>  {
>       struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
> 
> @@ -194,15 +194,22 @@ static bool radeon_legacy_lvds_mode_fixup(struct
> drm_encoder *encoder,
>       radeon_encoder_set_active_device(encoder);
>       drm_mode_set_crtcinfo(adjusted_mode, 0);
> 
> -     if (radeon_encoder->rmx_type != RMX_OFF)
> -             radeon_rmx_mode_fixup(encoder, mode, adjusted_mode);
> +     /* get the native mode for LVDS */
> +     if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT)) {
> +             struct drm_display_mode *native_mode = 
> &radeon_encoder->native_mode;
> +             int mode_id = adjusted_mode->base.id;
> +             *adjusted_mode = *native_mode;
> +             adjusted_mode->hdisplay = mode->hdisplay;
> +             adjusted_mode->vdisplay = mode->vdisplay;
> +             adjusted_mode->base.id = mode_id;
> +     }
> 
>       return true;
>  }
> 
>  static const struct drm_encoder_helper_funcs
> radeon_legacy_lvds_helper_funcs = {
>       .dpms = radeon_legacy_lvds_dpms,
> -     .mode_fixup = radeon_legacy_lvds_mode_fixup,
> +     .mode_fixup = radeon_legacy_mode_fixup,
>       .prepare = radeon_legacy_lvds_prepare,
>       .mode_set = radeon_legacy_lvds_mode_set,
>       .commit = radeon_legacy_lvds_commit,
> @@ -214,17 +221,6 @@ static const struct drm_encoder_funcs
> radeon_legacy_lvds_enc_funcs = {
>       .destroy = radeon_enc_destroy,
>  };
> 
> -static bool radeon_legacy_primary_dac_mode_fixup(struct drm_encoder *encoder,
> -                                              struct drm_display_mode *mode,
> -                                              struct drm_display_mode 
> *adjusted_mode)
> -{
> -     /* set the active encoder to connector routing */
> -     radeon_encoder_set_active_device(encoder);
> -     drm_mode_set_crtcinfo(adjusted_mode, 0);
> -
> -     return true;
> -}
> -
>  static void radeon_legacy_primary_dac_dpms(struct drm_encoder
> *encoder, int mode)
>  {
>       struct drm_device *dev = encoder->dev;
> @@ -410,7 +406,7 @@ static enum drm_connector_status
> radeon_legacy_primary_dac_detect(struct drm_enc
> 
>  static const struct drm_encoder_helper_funcs
> radeon_legacy_primary_dac_helper_funcs = {
>       .dpms = radeon_legacy_primary_dac_dpms,
> -     .mode_fixup = radeon_legacy_primary_dac_mode_fixup,
> +     .mode_fixup = radeon_legacy_mode_fixup,
>       .prepare = radeon_legacy_primary_dac_prepare,
>       .mode_set = radeon_legacy_primary_dac_mode_set,
>       .commit = radeon_legacy_primary_dac_commit,
> @@ -423,17 +419,6 @@ static const struct drm_encoder_funcs
> radeon_legacy_primary_dac_enc_funcs = {
>       .destroy = radeon_enc_destroy,
>  };
> 
> -static bool radeon_legacy_tmds_int_mode_fixup(struct drm_encoder *encoder,
> -                                           struct drm_display_mode *mode,
> -                                           struct drm_display_mode 
> *adjusted_mode)
> -{
> -     /* set the active encoder to connector routing */
> -     radeon_encoder_set_active_device(encoder);
> -     drm_mode_set_crtcinfo(adjusted_mode, 0);
> -
> -     return true;
> -}
> -
>  static void radeon_legacy_tmds_int_dpms(struct drm_encoder *encoder, int 
> mode)
>  {
>       struct drm_device *dev = encoder->dev;
> @@ -585,7 +570,7 @@ static void radeon_legacy_tmds_int_mode_set(struct
> drm_encoder *encoder,
> 
>  static const struct drm_encoder_helper_funcs
> radeon_legacy_tmds_int_helper_funcs = {
>       .dpms = radeon_legacy_tmds_int_dpms,
> -     .mode_fixup = radeon_legacy_tmds_int_mode_fixup,
> +     .mode_fixup = radeon_legacy_mode_fixup,
>       .prepare = radeon_legacy_tmds_int_prepare,
>       .mode_set = radeon_legacy_tmds_int_mode_set,
>       .commit = radeon_legacy_tmds_int_commit,
> @@ -597,17 +582,6 @@ static const struct drm_encoder_funcs
> radeon_legacy_tmds_int_enc_funcs = {
>       .destroy = radeon_enc_destroy,
>  };
> 
> -static bool radeon_legacy_tmds_ext_mode_fixup(struct drm_encoder *encoder,
> -                                           struct drm_display_mode *mode,
> -                                           struct drm_display_mode 
> *adjusted_mode)
> -{
> -     /* set the active encoder to connector routing */
> -     radeon_encoder_set_active_device(encoder);
> -     drm_mode_set_crtcinfo(adjusted_mode, 0);
> -
> -     return true;
> -}
> -
>  static void radeon_legacy_tmds_ext_dpms(struct drm_encoder *encoder, int 
> mode)
>  {
>       struct drm_device *dev = encoder->dev;
> @@ -742,7 +716,7 @@ static void radeon_ext_tmds_enc_destroy(struct
> drm_encoder *encoder)
> 
>  static const struct drm_encoder_helper_funcs
> radeon_legacy_tmds_ext_helper_funcs = {
>       .dpms = radeon_legacy_tmds_ext_dpms,
> -     .mode_fixup = radeon_legacy_tmds_ext_mode_fixup,
> +     .mode_fixup = radeon_legacy_mode_fixup,
>       .prepare = radeon_legacy_tmds_ext_prepare,
>       .mode_set = radeon_legacy_tmds_ext_mode_set,
>       .commit = radeon_legacy_tmds_ext_commit,
> @@ -754,17 +728,6 @@ static const struct drm_encoder_funcs
> radeon_legacy_tmds_ext_enc_funcs = {
>       .destroy = radeon_ext_tmds_enc_destroy,
>  };
> 
> -static bool radeon_legacy_tv_dac_mode_fixup(struct drm_encoder *encoder,
> -                                         struct drm_display_mode *mode,
> -                                         struct drm_display_mode 
> *adjusted_mode)
> -{
> -     /* set the active encoder to connector routing */
> -     radeon_encoder_set_active_device(encoder);
> -     drm_mode_set_crtcinfo(adjusted_mode, 0);
> -
> -     return true;
> -}
> -
>  static void radeon_legacy_tv_dac_dpms(struct drm_encoder *encoder, int mode)
>  {
>       struct drm_device *dev = encoder->dev;
> @@ -1281,7 +1244,7 @@ static enum drm_connector_status
> radeon_legacy_tv_dac_detect(struct drm_encoder
> 
>  static const struct drm_encoder_helper_funcs
> radeon_legacy_tv_dac_helper_funcs = {
>       .dpms = radeon_legacy_tv_dac_dpms,
> -     .mode_fixup = radeon_legacy_tv_dac_mode_fixup,
> +     .mode_fixup = radeon_legacy_mode_fixup,
>       .prepare = radeon_legacy_tv_dac_prepare,
>       .mode_set = radeon_legacy_tv_dac_mode_set,
>       .commit = radeon_legacy_tv_dac_commit,
> diff --git a/drivers/gpu/drm/radeon/radeon_mode.h
> b/drivers/gpu/drm/radeon/radeon_mode.h
> index 27ddc9b..d7a29ce 100644
> --- a/drivers/gpu/drm/radeon/radeon_mode.h
> +++ b/drivers/gpu/drm/radeon/radeon_mode.h
> @@ -473,9 +473,6 @@ void radeon_get_clock_info(struct drm_device *dev);
>  extern bool radeon_get_atom_connector_info_from_object_table(struct
> drm_device *dev);
>  extern bool 
> radeon_get_atom_connector_info_from_supported_devices_table(struct
> drm_device *dev);
> 
> -void radeon_rmx_mode_fixup(struct drm_encoder *encoder,
> -                        struct drm_display_mode *mode,
> -                        struct drm_display_mode *adjusted_mode);
>  void radeon_enc_destroy(struct drm_encoder *encoder);
>  void radeon_copy_fb(struct drm_device *dev, struct drm_gem_object *dst_obj);
>  void radeon_combios_asic_init(struct drm_device *dev);



------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
--
_______________________________________________
Dri-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to