None of the intel connectors can use all types of scaling modes,
so only try the ones that are possible.

Signed-off-by: Maarten Lankhorst <[email protected]>
---
 drivers/gpu/drm/i915/intel_dp.c    | 35 ++++++++++----------------------
 drivers/gpu/drm/i915/intel_drv.h   |  3 ++-
 drivers/gpu/drm/i915/intel_dsi.c   | 41 +++++++++++---------------------------
 drivers/gpu/drm/i915/intel_dvo.c   |  2 +-
 drivers/gpu/drm/i915/intel_lvds.c  | 20 +++++++------------
 drivers/gpu/drm/i915/intel_panel.c | 12 +++++++++--
 6 files changed, 42 insertions(+), 71 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 6686ac98c4ee..8adeea606b08 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -4885,18 +4885,7 @@ intel_dp_set_property(struct drm_connector *connector,
                goto done;
        }
 
-       if (is_edp(intel_dp) &&
-           property == connector->dev->mode_config.scaling_mode_property) {
-               if (val == DRM_MODE_SCALE_NONE) {
-                       DRM_DEBUG_KMS("no scaling not supported\n");
-                       return -EINVAL;
-               }
-               if (HAS_GMCH_DISPLAY(dev_priv) &&
-                   val == DRM_MODE_SCALE_CENTER) {
-                       DRM_DEBUG_KMS("centering not supported\n");
-                       return -EINVAL;
-               }
-
+       if (property == connector->scaling_mode_property) {
                if (intel_connector->panel.fitting_mode == val) {
                        /* the eDP scaling property is not changed */
                        return 0;
@@ -5180,21 +5169,9 @@ bool intel_dp_is_edp(struct drm_i915_private *dev_priv, 
enum port port)
 static void
 intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector 
*connector)
 {
-       struct intel_connector *intel_connector = to_intel_connector(connector);
-
        intel_attach_force_audio_property(connector);
        intel_attach_broadcast_rgb_property(connector);
        intel_dp->color_range_auto = true;
-
-       if (is_edp(intel_dp)) {
-               drm_mode_create_scaling_mode_property(connector->dev);
-               drm_object_attach_property(
-                       &connector->base,
-                       connector->dev->mode_config.scaling_mode_property,
-                       DRM_MODE_SCALE_ASPECT);
-               intel_connector->panel.fitting_mode = DRM_MODE_SCALE_ASPECT;
-               connector->state->scaling_mode = DRM_MODE_SCALE_ASPECT;
-       }
 }
 
 static void intel_dp_init_panel_power_timestamps(struct intel_dp *intel_dp)
@@ -5836,6 +5813,7 @@ static bool intel_edp_init_connector(struct intel_dp 
*intel_dp,
        struct drm_display_mode *scan;
        struct edid *edid;
        enum pipe pipe = INVALID_PIPE;
+       u32 allowed_scalers;
 
        if (!is_edp(intel_dp))
                return true;
@@ -5929,7 +5907,14 @@ static bool intel_edp_init_connector(struct intel_dp 
*intel_dp,
                              pipe_name(pipe));
        }
 
-       intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode);
+       allowed_scalers = BIT(DRM_MODE_SCALE_ASPECT) | 
BIT(DRM_MODE_SCALE_FULLSCREEN);
+       if (!HAS_GMCH_DISPLAY(dev_priv))
+               allowed_scalers |= BIT(DRM_MODE_SCALE_CENTER);
+
+       intel_connector->panel.fitting_mode = DRM_MODE_SCALE_ASPECT;
+       connector->state->scaling_mode = DRM_MODE_SCALE_ASPECT;
+
+       intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode, 
allowed_scalers);
        intel_connector->panel.backlight.power = intel_edp_backlight_power;
        intel_panel_setup_backlight(connector, pipe);
 
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 54f3ff840812..f44dd29f4f79 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1676,7 +1676,8 @@ void intel_overlay_reset(struct drm_i915_private 
*dev_priv);
 /* intel_panel.c */
 int intel_panel_init(struct intel_panel *panel,
                     struct drm_display_mode *fixed_mode,
-                    struct drm_display_mode *downclock_mode);
+                    struct drm_display_mode *downclock_mode,
+                    unsigned allowed_fitting_mode_mask);
 void intel_panel_fini(struct intel_panel *panel);
 void intel_fixed_panel_mode(const struct drm_display_mode *fixed_mode,
                            struct drm_display_mode *adjusted_mode);
diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
index 35adbcc2e3f3..21c293078cd8 100644
--- a/drivers/gpu/drm/i915/intel_dsi.c
+++ b/drivers/gpu/drm/i915/intel_dsi.c
@@ -1592,7 +1592,6 @@ static int intel_dsi_set_property(struct drm_connector 
*connector,
                                  struct drm_property *property,
                                  uint64_t val)
 {
-       struct drm_device *dev = connector->dev;
        struct intel_connector *intel_connector = to_intel_connector(connector);
        struct drm_crtc *crtc;
        int ret;
@@ -1601,17 +1600,7 @@ static int intel_dsi_set_property(struct drm_connector 
*connector,
        if (ret)
                return ret;
 
-       if (property == dev->mode_config.scaling_mode_property) {
-               if (val == DRM_MODE_SCALE_NONE) {
-                       DRM_DEBUG_KMS("no scaling not supported\n");
-                       return -EINVAL;
-               }
-               if (HAS_GMCH_DISPLAY(to_i915(dev)) &&
-                   val == DRM_MODE_SCALE_CENTER) {
-                       DRM_DEBUG_KMS("centering not supported\n");
-                       return -EINVAL;
-               }
-
+       if (property == connector->scaling_mode_property) {
                if (intel_connector->panel.fitting_mode == val)
                        return 0;
 
@@ -1673,20 +1662,6 @@ static const struct drm_connector_funcs 
intel_dsi_connector_funcs = {
        .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
 };
 
-static void intel_dsi_add_properties(struct intel_connector *connector)
-{
-       struct drm_device *dev = connector->base.dev;
-
-       if (connector->panel.fixed_mode) {
-               drm_mode_create_scaling_mode_property(dev);
-               drm_object_attach_property(&connector->base.base,
-                                          
dev->mode_config.scaling_mode_property,
-                                          DRM_MODE_SCALE_ASPECT);
-               connector->panel.fitting_mode = DRM_MODE_SCALE_ASPECT;
-               connector->base.state->scaling_mode = DRM_MODE_SCALE_ASPECT;
-       }
-}
-
 void intel_dsi_init(struct drm_i915_private *dev_priv)
 {
        struct drm_device *dev = &dev_priv->drm;
@@ -1697,6 +1672,7 @@ void intel_dsi_init(struct drm_i915_private *dev_priv)
        struct drm_connector *connector;
        struct drm_display_mode *scan, *fixed_mode = NULL;
        enum port port;
+       u32 allowed_scalers = 0;
 
        DRM_DEBUG_KMS("\n");
 
@@ -1855,10 +1831,17 @@ void intel_dsi_init(struct drm_i915_private *dev_priv)
        connector->display_info.width_mm = fixed_mode->width_mm;
        connector->display_info.height_mm = fixed_mode->height_mm;
 
-       intel_panel_init(&intel_connector->panel, fixed_mode, NULL);
-       intel_panel_setup_backlight(connector, INVALID_PIPE);
+       if (fixed_mode) {
+               allowed_scalers = BIT(DRM_MODE_SCALE_ASPECT) | 
BIT(DRM_MODE_SCALE_FULLSCREEN);
+               if (!HAS_GMCH_DISPLAY(dev_priv))
+                       allowed_scalers |= BIT(DRM_MODE_SCALE_CENTER);
 
-       intel_dsi_add_properties(intel_connector);
+               intel_connector->panel.fitting_mode = DRM_MODE_SCALE_ASPECT;
+               connector->state->scaling_mode = DRM_MODE_SCALE_ASPECT;
+       }
+
+       intel_panel_init(&intel_connector->panel, fixed_mode, NULL, fixed_mode 
? allowed_scalers : 0);
+       intel_panel_setup_backlight(connector, INVALID_PIPE);
 
        return;
 
diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c
index c1544a53095d..0b723157c38b 100644
--- a/drivers/gpu/drm/i915/intel_dvo.c
+++ b/drivers/gpu/drm/i915/intel_dvo.c
@@ -554,7 +554,7 @@ void intel_dvo_init(struct drm_i915_private *dev_priv)
                         */
                        intel_panel_init(&intel_connector->panel,
                                         intel_dvo_get_current_mode(connector),
-                                        NULL);
+                                        NULL, 0);
                        intel_dvo->panel_wants_dither = true;
                }
 
diff --git a/drivers/gpu/drm/i915/intel_lvds.c 
b/drivers/gpu/drm/i915/intel_lvds.c
index 5d9c1de0702b..f4f270b81c8c 100644
--- a/drivers/gpu/drm/i915/intel_lvds.c
+++ b/drivers/gpu/drm/i915/intel_lvds.c
@@ -603,16 +603,10 @@ static int intel_lvds_set_property(struct drm_connector 
*connector,
                                   uint64_t value)
 {
        struct intel_connector *intel_connector = to_intel_connector(connector);
-       struct drm_device *dev = connector->dev;
 
-       if (property == dev->mode_config.scaling_mode_property) {
+       if (property == connector->scaling_mode_property) {
                struct drm_crtc *crtc;
 
-               if (value == DRM_MODE_SCALE_NONE) {
-                       DRM_DEBUG_KMS("no scaling not supported\n");
-                       return -EINVAL;
-               }
-
                if (intel_connector->panel.fitting_mode == value) {
                        /* the LVDS scaling property is not changed */
                        return 0;
@@ -989,6 +983,7 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
        u32 lvds;
        int pipe;
        u8 pin;
+       u32 allowed_scalers = 0;
 
        if (!intel_lvds_supported(dev_priv))
                return;
@@ -1083,11 +1078,10 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
 
        lvds_encoder->reg = lvds_reg;
 
-       /* create the scaling mode property */
-       drm_mode_create_scaling_mode_property(dev);
-       drm_object_attach_property(&connector->base,
-                                     dev->mode_config.scaling_mode_property,
-                                     DRM_MODE_SCALE_ASPECT);
+       /* set the scaling mode property, will be inited by intel_panel_init */
+       allowed_scalers |= BIT(DRM_MODE_SCALE_ASPECT);
+       allowed_scalers |= BIT(DRM_MODE_SCALE_FULLSCREEN);
+       allowed_scalers |= BIT(DRM_MODE_SCALE_CENTER);
        connector->state->scaling_mode = DRM_MODE_SCALE_ASPECT;
        intel_connector->panel.fitting_mode = DRM_MODE_SCALE_ASPECT;
 
@@ -1183,7 +1177,7 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
 out:
        mutex_unlock(&dev->mode_config.mutex);
 
-       intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode);
+       intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode, 
allowed_scalers);
        intel_panel_setup_backlight(connector, INVALID_PIPE);
 
        lvds_encoder->is_dual_link = compute_is_dual_link_lvds(lvds_encoder);
diff --git a/drivers/gpu/drm/i915/intel_panel.c 
b/drivers/gpu/drm/i915/intel_panel.c
index cb50c527401f..61dd665933f0 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -1801,14 +1801,22 @@ intel_panel_init_backlight_funcs(struct intel_panel 
*panel)
 
 int intel_panel_init(struct intel_panel *panel,
                     struct drm_display_mode *fixed_mode,
-                    struct drm_display_mode *downclock_mode)
+                    struct drm_display_mode *downclock_mode,
+                    unsigned allowed_fitting_mode_mask)
 {
+       struct intel_connector *intel_connector =
+               container_of(panel, struct intel_connector, panel);
+       int ret = 0;
+
        intel_panel_init_backlight_funcs(panel);
 
        panel->fixed_mode = fixed_mode;
        panel->downclock_mode = downclock_mode;
+       if (allowed_fitting_mode_mask)
+               ret = drm_mode_connector_attach_custom_scaling_mode_property(
+                         &intel_connector->base, allowed_fitting_mode_mask, 0);
 
-       return 0;
+       return ret;
 }
 
 void intel_panel_fini(struct intel_panel *panel)
-- 
2.7.4

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to