|
@@ -160,9 +160,35 @@ static int qxl_add_monitors_config_modes(struct drm_connector *connector,
|
|
|
*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)
|
|
@@ -170,29 +196,6 @@ static int qxl_add_common_modes(struct drm_connector *connector,
|
|
|
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);
|
|
@@ -823,11 +826,22 @@ static int qxl_conn_get_modes(struct drm_connector *connector)
|
|
|
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)
|