--- drivers/gpu/drm/drm_crtc.c | 2 +- drivers/gpu/drm/drm_edid.c | 14 +++++++------- drivers/gpu/drm/drm_edid_load.c | 3 ++- drivers/gpu/drm/drm_fb_helper.c | 4 +++- include/drm/drm_crtc.h | 2 ++ 5 files changed, 15 insertions(+), 10 deletions(-) Index: linux-4.4.115-rt130/drivers/gpu/drm/drm_crtc.c =================================================================== --- linux-4.4.115-rt130.orig/drivers/gpu/drm/drm_crtc.c +++ linux-4.4.115-rt130/drivers/gpu/drm/drm_crtc.c @@ -2021,7 +2021,7 @@ int drm_mode_getconnector(struct drm_dev if (connector->encoder_ids[i] != 0) encoders_count++; - if (out_resp->count_modes == 0) { + if (out_resp->count_modes == 0 && !connector->edid_firmware_loaded) { connector->funcs->fill_modes(connector, dev->mode_config.max_width, dev->mode_config.max_height); Index: linux-4.4.115-rt130/drivers/gpu/drm/drm_edid.c =================================================================== --- linux-4.4.115-rt130.orig/drivers/gpu/drm/drm_edid.c +++ linux-4.4.115-rt130/drivers/gpu/drm/drm_edid.c @@ -1392,14 +1392,14 @@ EXPORT_SYMBOL(drm_probe_ddc); struct edid *drm_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) { - struct edid *edid; + struct edid *edid = NULL; - if (!drm_probe_ddc(adapter)) - return NULL; - - edid = drm_do_get_edid(connector, drm_do_probe_ddc_edid, adapter); - if (edid) - drm_get_displayid(connector, edid); + if (!connector->edid_firmware_loaded && drm_probe_ddc(adapter)) { + edid = drm_do_get_edid(connector, drm_do_probe_ddc_edid, + adapter); + if (edid) + drm_get_displayid(connector, edid); + } return edid; } EXPORT_SYMBOL(drm_get_edid); Index: linux-4.4.115-rt130/drivers/gpu/drm/drm_edid_load.c =================================================================== --- linux-4.4.115-rt130.orig/drivers/gpu/drm/drm_edid_load.c +++ linux-4.4.115-rt130/drivers/gpu/drm/drm_edid_load.c @@ -315,8 +315,9 @@ int drm_load_edid_firmware(struct drm_co drm_mode_connector_update_edid_property(connector, edid); ret = drm_add_edid_modes(connector, edid); + if (ret) + connector->edid_firmware_loaded = true; drm_edid_to_eld(connector, edid); kfree(edid); - return ret; } Index: linux-4.4.115-rt130/drivers/gpu/drm/drm_fb_helper.c =================================================================== --- linux-4.4.115-rt130.orig/drivers/gpu/drm/drm_fb_helper.c +++ linux-4.4.115-rt130/drivers/gpu/drm/drm_fb_helper.c @@ -1603,7 +1603,9 @@ static int drm_fb_helper_probe_connector for (i = 0; i < fb_helper->connector_count; i++) { connector = fb_helper->connector_info[i]->connector; - count += connector->funcs->fill_modes(connector, maxX, maxY); + if (!connector->edid_firmware_loaded) + count += connector->funcs->fill_modes(connector, maxX, + maxY); } return count; Index: linux-4.4.115-rt130/include/drm/drm_crtc.h =================================================================== --- linux-4.4.115-rt130.orig/include/drm/drm_crtc.h +++ linux-4.4.115-rt130/include/drm/drm_crtc.h @@ -645,6 +645,7 @@ struct drm_encoder { * @null_edid_counter: track sinks that give us all zeros for the EDID * @bad_edid_counter: track sinks that give us an EDID with invalid checksum * @edid_corrupt: indicates whether the last read EDID was corrupt + * @edid_firmware_loaded: EDID firmware was loaded successfully, do not probe * @debugfs_entry: debugfs directory for this connector * @state: current atomic state for this connector * @has_tile: is this connector connected to a tiled monitor @@ -716,6 +717,7 @@ struct drm_connector { int audio_latency[2]; int null_edid_counter; /* needed to workaround some HW bugs where we get all 0s */ unsigned bad_edid_counter; + bool edid_firmware_loaded; /* Flag for raw EDID header corruption - used in Displayport * compliance testing - * Displayport Link CTS Core 1.2 rev1.1 4.2.2.6