]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.14-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 15 Sep 2015 22:27:34 +0000 (15:27 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 15 Sep 2015 22:27:34 +0000 (15:27 -0700)
added patches:
drm-qxl-validate-monitors-config-modes.patch

queue-3.14/drm-qxl-validate-monitors-config-modes.patch [new file with mode: 0644]
queue-3.14/series

diff --git a/queue-3.14/drm-qxl-validate-monitors-config-modes.patch b/queue-3.14/drm-qxl-validate-monitors-config-modes.patch
new file mode 100644 (file)
index 0000000..1518559
--- /dev/null
@@ -0,0 +1,147 @@
+From bd3e1c7c6de9f5f70d97cdb6c817151c0477c5e3 Mon Sep 17 00:00:00 2001
+From: Jonathon Jongsma <jjongsma@redhat.com>
+Date: Thu, 20 Aug 2015 14:04:32 -0500
+Subject: drm/qxl: validate monitors config modes
+
+From: Jonathon Jongsma <jjongsma@redhat.com>
+
+commit bd3e1c7c6de9f5f70d97cdb6c817151c0477c5e3 upstream.
+
+Due to some recent changes in
+drm_helper_probe_single_connector_modes_merge_bits(), old custom modes
+were not being pruned properly. In current kernels,
+drm_mode_validate_basic() is called to sanity-check each mode in the
+list. If the sanity-check passes, the mode's status gets set to to
+MODE_OK. In older kernels this check was not done, so old custom modes
+would still have a status of MODE_UNVERIFIED at this point, and would
+therefore be pruned later in the function.
+
+As a result of this new behavior, the list of modes for a device always
+includes every custom mode ever configured for the device, with the
+largest one listed first. Since desktop environments usually choose the
+first preferred mode when a hotplug event is emitted, this had the
+result of making it very difficult for the user to reduce the size of
+the display.
+
+The qxl driver did implement the mode_valid connector function, but it
+was empty. In order to restore the old behavior where old custom modes
+are pruned, we implement a proper mode_valid function for the qxl
+driver. This function now checks each mode against the last configured
+custom mode and the list of standard modes. If the mode doesn't match
+any of these, its status is set to MODE_BAD so that it will be pruned as
+expected.
+
+Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
+Signed-off-by: Dave Airlie <airlied@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/drm/qxl/qxl_display.c |   66 +++++++++++++++++++++++---------------
+ drivers/gpu/drm/qxl/qxl_drv.h     |    2 +
+ 2 files changed, 42 insertions(+), 26 deletions(-)
+
+--- a/drivers/gpu/drm/qxl/qxl_display.c
++++ b/drivers/gpu/drm/qxl/qxl_display.c
+@@ -136,9 +136,35 @@ static int qxl_add_monitors_config_modes
+       *pwidth = head->width;
+       *pheight = head->height;
+       drm_mode_probed_add(connector, mode);
++      /* remember the last custom size for mode validation */
++      qdev->monitors_config_width = mode->hdisplay;
++      qdev->monitors_config_height = mode->vdisplay;
+       return 1;
+ }
++static struct mode_size {
++      int w;
++      int h;
++} common_modes[] = {
++      { 640,  480},
++      { 720,  480},
++      { 800,  600},
++      { 848,  480},
++      {1024,  768},
++      {1152,  768},
++      {1280,  720},
++      {1280,  800},
++      {1280,  854},
++      {1280,  960},
++      {1280, 1024},
++      {1440,  900},
++      {1400, 1050},
++      {1680, 1050},
++      {1600, 1200},
++      {1920, 1080},
++      {1920, 1200}
++};
++
+ static int qxl_add_common_modes(struct drm_connector *connector,
+                                 unsigned pwidth,
+                                 unsigned pheight)
+@@ -146,29 +172,6 @@ static int qxl_add_common_modes(struct d
+       struct drm_device *dev = connector->dev;
+       struct drm_display_mode *mode = NULL;
+       int i;
+-      struct mode_size {
+-              int w;
+-              int h;
+-      } common_modes[] = {
+-              { 640,  480},
+-              { 720,  480},
+-              { 800,  600},
+-              { 848,  480},
+-              {1024,  768},
+-              {1152,  768},
+-              {1280,  720},
+-              {1280,  800},
+-              {1280,  854},
+-              {1280,  960},
+-              {1280, 1024},
+-              {1440,  900},
+-              {1400, 1050},
+-              {1680, 1050},
+-              {1600, 1200},
+-              {1920, 1080},
+-              {1920, 1200}
+-      };
+-
+       for (i = 0; i < ARRAY_SIZE(common_modes); i++) {
+               mode = drm_cvt_mode(dev, common_modes[i].w, common_modes[i].h,
+                                   60, false, false, false);
+@@ -753,11 +756,22 @@ static int qxl_conn_get_modes(struct drm
+ static int qxl_conn_mode_valid(struct drm_connector *connector,
+                              struct drm_display_mode *mode)
+ {
++      struct drm_device *ddev = connector->dev;
++      struct qxl_device *qdev = ddev->dev_private;
++      int i;
++
+       /* TODO: is this called for user defined modes? (xrandr --add-mode)
+        * TODO: check that the mode fits in the framebuffer */
+-      DRM_DEBUG("%s: %dx%d status=%d\n", mode->name, mode->hdisplay,
+-                mode->vdisplay, mode->status);
+-      return MODE_OK;
++
++      if(qdev->monitors_config_width == mode->hdisplay &&
++         qdev->monitors_config_height == mode->vdisplay)
++              return MODE_OK;
++
++      for (i = 0; i < ARRAY_SIZE(common_modes); i++) {
++              if (common_modes[i].w == mode->hdisplay && common_modes[i].h == mode->vdisplay)
++                      return MODE_OK;
++      }
++      return MODE_BAD;
+ }
+ static struct drm_encoder *qxl_best_encoder(struct drm_connector *connector)
+--- a/drivers/gpu/drm/qxl/qxl_drv.h
++++ b/drivers/gpu/drm/qxl/qxl_drv.h
+@@ -325,6 +325,8 @@ struct qxl_device {
+       struct work_struct fb_work;
+       struct drm_property *hotplug_mode_update_property;
++      int monitors_config_width;
++      int monitors_config_height;
+ };
+ /* forward declaration for QXL_INFO_IO */
index 5214fb8f7b707a2fcabc3d58c79a1d4e4b309715..14a79c37cf1f0ac6e5b75fe53f208689dc23a814 100644 (file)
@@ -1 +1,2 @@
 drm-radeon-don-t-link-train-displayport-on-hpd-until-we-get-the-dpcd.patch
+drm-qxl-validate-monitors-config-modes.patch