Commit 2d856f94 authored by Gerd Hoffmann's avatar Gerd Hoffmann

qxl: fix qxl_conn_get_modes

Call qxl_add_monitors_config_modes() unconditionally.  Do all sanity
checks in that function.

Fix sanity checks.  monitors_config is the current monitor
configuration, whereas client_monitors_config is the configuration
requested by the spice client.  So when filling the mode list, based on
the spice client request, we need to look at
client_monitors_config->count not monitors_config->count.
Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
Reviewed-by: default avatarGabriel Krisman Bertazi <krisman@collabora.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/1488363154-6889-5-git-send-email-kraxel@redhat.com
parent c50fad8f
...@@ -202,9 +202,17 @@ static int qxl_add_monitors_config_modes(struct drm_connector *connector, ...@@ -202,9 +202,17 @@ static int qxl_add_monitors_config_modes(struct drm_connector *connector,
struct drm_display_mode *mode = NULL; struct drm_display_mode *mode = NULL;
struct qxl_head *head; struct qxl_head *head;
if (!qdev->monitors_config)
return 0;
if (h >= qdev->monitors_config->max_allowed)
return 0;
if (!qdev->client_monitors_config) if (!qdev->client_monitors_config)
return 0; return 0;
if (h >= qdev->client_monitors_config->count)
return 0;
head = &qdev->client_monitors_config->heads[h]; head = &qdev->client_monitors_config->heads[h];
DRM_DEBUG_KMS("head %d is %dx%d\n", h, head->width, head->height);
mode = drm_cvt_mode(dev, head->width, head->height, 60, false, false, mode = drm_cvt_mode(dev, head->width, head->height, 60, false, false,
false); false);
...@@ -911,19 +919,13 @@ static void qxl_enc_mode_set(struct drm_encoder *encoder, ...@@ -911,19 +919,13 @@ static void qxl_enc_mode_set(struct drm_encoder *encoder,
static int qxl_conn_get_modes(struct drm_connector *connector) static int qxl_conn_get_modes(struct drm_connector *connector)
{ {
int ret = 0;
struct qxl_device *qdev = connector->dev->dev_private;
unsigned pwidth = 1024; unsigned pwidth = 1024;
unsigned pheight = 768; unsigned pheight = 768;
int ret = 0;
DRM_DEBUG_KMS("monitors_config=%p\n", qdev->monitors_config); ret = qxl_add_monitors_config_modes(connector, &pwidth, &pheight);
/* TODO: what should we do here? only show the configured modes for the if (ret < 0)
* device, or allow the full list, or both? */ return ret;
if (qdev->monitors_config && qdev->monitors_config->count) {
ret = qxl_add_monitors_config_modes(connector, &pwidth, &pheight);
if (ret < 0)
return ret;
}
ret += qxl_add_common_modes(connector, pwidth, pheight); ret += qxl_add_common_modes(connector, pwidth, pheight);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment