From 8eae362b5077bd324bb92729ed2df33b7cad5bb1 Mon Sep 17 00:00:00 2001 From: Daniel Vetter Date: Thu, 28 Jun 2012 16:03:46 +0200 Subject: [PATCH] revert the moar modes patches from Ajax $ git revert -n 47819ba234d41465 $ git revert -n f89ec8a456dde7f18a13de77b4d79e6b05ca7c84 $ git revert -n c09dedb7a50e23f0166e0bbae61c75c7ec23cf7f $ git revert -n fc48f169dd2e461e687a63c3a69ade57b4ece59e $ git revert -n b309bd37a1357bd4391dace247cceb9d9121d20a $ git revert -n cb21aafe121b1c3ad4c77cc5c22320163f16ba42 $ git revert -n cd4cd3ded8efc49de6f5056dfb0d60e69b388b71 $ git revert -n 9a225c9ce2b03ed70c13fc49ee8ee332cefe4e3a $ git revert -n f6e252bac45cab5edc30c2ede971def51e272c9b $ git revert -n f8b46a05e6ced02e75cd782c015a57e67d5c644d $ git revert -n 33c7531df850869a7b623d4dfcfcb7e2ab873844 --- drivers/gpu/drm/drm_edid.c | 192 ++++++++------------------------------- drivers/gpu/drm/drm_fb_helper.c | 2 +- include/drm/drm_crtc.h | 5 +- 3 files changed, 39 insertions(+), 160 deletions(-) diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 5873e48..728b993 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -30,7 +30,7 @@ #include #include #include -#include +#include #include "drmP.h" #include "drm_edid.h" #include "drm_edid_modes.h" @@ -149,28 +149,21 @@ int drm_edid_header_is_valid(const u8 *raw_edid) } EXPORT_SYMBOL(drm_edid_header_is_valid); -static int edid_fixup __read_mostly = 6; -module_param_named(edid_fixup, edid_fixup, int, 0400); -MODULE_PARM_DESC(edid_fixup, - "Minimum number of valid EDID header bytes (0-8, default 6)"); /* * Sanity check the EDID block (base or extension). Return 0 if the block * doesn't check out, or 1 if it's valid. */ -bool drm_edid_block_valid(u8 *raw_edid, int block) +bool drm_edid_block_valid(u8 *raw_edid) { int i; u8 csum = 0; struct edid *edid = (struct edid *)raw_edid; - if (edid_fixup > 8 || edid_fixup < 0) - edid_fixup = 6; - - if (block == 0) { + if (raw_edid[0] == 0x00) { int score = drm_edid_header_is_valid(raw_edid); if (score == 8) ; - else if (score >= edid_fixup) { + else if (score >= 6) { DRM_DEBUG("Fixing EDID header, your hardware may be failing\n"); memcpy(raw_edid, edid_header, sizeof(edid_header)); } else { @@ -231,7 +224,7 @@ bool drm_edid_is_valid(struct edid *edid) return false; for (i = 0; i <= edid->extensions; i++) - if (!drm_edid_block_valid(raw + i * EDID_LENGTH, i)) + if (!drm_edid_block_valid(raw + i * EDID_LENGTH)) return false; return true; @@ -311,7 +304,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) for (i = 0; i < 4; i++) { if (drm_do_probe_ddc_edid(adapter, block, 0, EDID_LENGTH)) goto out; - if (drm_edid_block_valid(block, 0)) + if (drm_edid_block_valid(block)) break; if (i == 0 && drm_edid_is_zero(block, EDID_LENGTH)) { connector->null_edid_counter++; @@ -336,7 +329,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) block + (valid_extensions + 1) * EDID_LENGTH, j, EDID_LENGTH)) goto out; - if (drm_edid_block_valid(block + (valid_extensions + 1) * EDID_LENGTH, j)) { + if (drm_edid_block_valid(block + (valid_extensions + 1) * EDID_LENGTH)) { valid_extensions++; break; } @@ -498,47 +491,23 @@ static void edid_fixup_preferred(struct drm_connector *connector, preferred_mode->type |= DRM_MODE_TYPE_PREFERRED; } -static bool -mode_is_rb(const struct drm_display_mode *mode) -{ - return (mode->htotal - mode->hdisplay == 160) && - (mode->hsync_end - mode->hdisplay == 80) && - (mode->hsync_end - mode->hsync_start == 32) && - (mode->vsync_start - mode->vdisplay == 3); -} - -/* - * drm_mode_find_dmt - Create a copy of a mode if present in DMT - * @dev: Device to duplicate against - * @hsize: Mode width - * @vsize: Mode height - * @fresh: Mode refresh rate - * @rb: Mode reduced-blanking-ness - * - * Walk the DMT mode list looking for a match for the given parameters. - * Return a newly allocated copy of the mode, or NULL if not found. - */ struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, - int hsize, int vsize, int fresh, - bool rb) + int hsize, int vsize, int fresh) { + struct drm_display_mode *mode = NULL; int i; for (i = 0; i < drm_num_dmt_modes; i++) { const struct drm_display_mode *ptr = &drm_dmt_modes[i]; - if (hsize != ptr->hdisplay) - continue; - if (vsize != ptr->vdisplay) - continue; - if (fresh != drm_mode_vrefresh(ptr)) - continue; - if (rb != mode_is_rb(ptr)) - continue; - - return drm_mode_duplicate(dev, ptr); + if (hsize == ptr->hdisplay && + vsize == ptr->vdisplay && + fresh == drm_mode_vrefresh(ptr)) { + /* get the expected default mode */ + mode = drm_mode_duplicate(dev, ptr); + break; + } } - - return NULL; + return mode; } EXPORT_SYMBOL(drm_mode_find_dmt); @@ -767,17 +736,10 @@ drm_mode_std(struct drm_connector *connector, struct edid *edid, } /* check whether it can be found in default mode table */ - if (drm_monitor_supports_rb(edid)) { - mode = drm_mode_find_dmt(dev, hsize, vsize, vrefresh_rate, - true); - if (mode) - return mode; - } - mode = drm_mode_find_dmt(dev, hsize, vsize, vrefresh_rate, false); + mode = drm_mode_find_dmt(dev, hsize, vsize, vrefresh_rate); if (mode) return mode; - /* okay, generate it */ switch (timing_level) { case LEVEL_DMT: break; @@ -791,8 +753,6 @@ drm_mode_std(struct drm_connector *connector, struct edid *edid, * secondary GTF curve. Please don't do that. */ mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0); - if (!mode) - return NULL; if (drm_mode_hsync(mode) > drm_gtf2_hbreak(edid)) { drm_mode_destroy(dev, mode); mode = drm_gtf_mode_complex(dev, hsize, vsize, @@ -963,6 +923,15 @@ set_size: } static bool +mode_is_rb(const struct drm_display_mode *mode) +{ + return (mode->htotal - mode->hdisplay == 160) && + (mode->hsync_end - mode->hdisplay == 80) && + (mode->hsync_end - mode->hsync_start == 32) && + (mode->vsync_start - mode->vdisplay == 3); +} + +static bool mode_in_hsync_range(const struct drm_display_mode *mode, struct edid *edid, u8 *t) { @@ -1039,8 +1008,12 @@ mode_in_range(const struct drm_display_mode *mode, struct edid *edid, return true; } +/* + * XXX If drm_dmt_modes ever regrows the CVT-R modes (and it will) this will + * need to account for them. + */ static int -drm_dmt_modes_for_range(struct drm_connector *connector, struct edid *edid, +drm_gtf_modes_for_range(struct drm_connector *connector, struct edid *edid, struct detailed_timing *timing) { int i, modes = 0; @@ -1060,110 +1033,17 @@ drm_dmt_modes_for_range(struct drm_connector *connector, struct edid *edid, return modes; } -/* fix up 1366x768 mode from 1368x768; - * GFT/CVT can't express 1366 width which isn't dividable by 8 - */ -static void fixup_mode_1366x768(struct drm_display_mode *mode) -{ - if (mode->hdisplay == 1368 && mode->vdisplay == 768) { - mode->hdisplay = 1366; - mode->hsync_start--; - mode->hsync_end--; - drm_mode_set_name(mode); - } -} - -static int -drm_gtf_modes_for_range(struct drm_connector *connector, struct edid *edid, - struct detailed_timing *timing) -{ - int i, modes = 0; - struct drm_display_mode *newmode; - struct drm_device *dev = connector->dev; - - for (i = 0; i < num_extra_modes; i++) { - const struct minimode *m = &extra_modes[i]; - newmode = drm_gtf_mode(dev, m->w, m->h, m->r, 0, 0); - if (!newmode) - return modes; - - fixup_mode_1366x768(newmode); - if (!mode_in_range(newmode, edid, timing)) { - drm_mode_destroy(dev, newmode); - continue; - } - - drm_mode_probed_add(connector, newmode); - modes++; - } - - return modes; -} - -static int -drm_cvt_modes_for_range(struct drm_connector *connector, struct edid *edid, - struct detailed_timing *timing) -{ - int i, modes = 0; - struct drm_display_mode *newmode; - struct drm_device *dev = connector->dev; - bool rb = drm_monitor_supports_rb(edid); - - for (i = 0; i < num_extra_modes; i++) { - const struct minimode *m = &extra_modes[i]; - newmode = drm_cvt_mode(dev, m->w, m->h, m->r, rb, 0, 0); - if (!newmode) - return modes; - - fixup_mode_1366x768(newmode); - if (!mode_in_range(newmode, edid, timing)) { - drm_mode_destroy(dev, newmode); - continue; - } - - drm_mode_probed_add(connector, newmode); - modes++; - } - - return modes; -} - static void do_inferred_modes(struct detailed_timing *timing, void *c) { struct detailed_mode_closure *closure = c; struct detailed_non_pixel *data = &timing->data.other_data; - struct detailed_data_monitor_range *range = &data->data.range; - - if (data->type != EDID_DETAIL_MONITOR_RANGE) - return; - - closure->modes += drm_dmt_modes_for_range(closure->connector, - closure->edid, - timing); - - if (!version_greater(closure->edid, 1, 1)) - return; /* GTF not defined yet */ + int gtf = (closure->edid->features & DRM_EDID_FEATURE_DEFAULT_GTF); - switch (range->flags) { - case 0x02: /* secondary gtf, XXX could do more */ - case 0x00: /* default gtf */ + if (gtf && data->type == EDID_DETAIL_MONITOR_RANGE) closure->modes += drm_gtf_modes_for_range(closure->connector, closure->edid, timing); - break; - case 0x04: /* cvt, only in 1.4+ */ - if (!version_greater(closure->edid, 1, 3)) - break; - - closure->modes += drm_cvt_modes_for_range(closure->connector, - closure->edid, - timing); - break; - case 0x01: /* just the ranges, no formula */ - default: - break; - } } static int @@ -1196,8 +1076,8 @@ drm_est3_modes(struct drm_connector *connector, struct detailed_timing *timing) mode = drm_mode_find_dmt(connector->dev, est3_modes[m].w, est3_modes[m].h, - est3_modes[m].r, - est3_modes[m].rb); + est3_modes[m].r + /*, est3_modes[m].rb */); if (mode) { drm_mode_probed_add(connector, mode); modes++; diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 5683b7f..f0b81d7 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c @@ -1083,7 +1083,7 @@ static bool drm_target_cloned(struct drm_fb_helper *fb_helper, /* try and find a 1024x768 mode on each connector */ can_clone = true; - dmt_mode = drm_mode_find_dmt(fb_helper->dev, 1024, 768, 60, false); + dmt_mode = drm_mode_find_dmt(fb_helper->dev, 1024, 768, 60); for (i = 0; i < fb_helper->connector_count; i++) { diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index bac55c2..ba6a31f 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -1038,11 +1038,10 @@ extern int drm_add_modes_noedid(struct drm_connector *connector, int hdisplay, int vdisplay); extern int drm_edid_header_is_valid(const u8 *raw_edid); -extern bool drm_edid_block_valid(u8 *raw_edid, int block); +extern bool drm_edid_block_valid(u8 *raw_edid); extern bool drm_edid_is_valid(struct edid *edid); struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, - int hsize, int vsize, int fresh, - bool rb); + int hsize, int vsize, int fresh); extern int drm_mode_create_dumb_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); -- 1.7.10