Skip to content
  • Jani Nikula's avatar
    drm: add fallback override/firmware EDID modes workaround · 48eaeb76
    Jani Nikula authored
    We've moved the override and firmware EDID (simply "override EDID" from
    now on) handling to the low level drm_do_get_edid() function in order to
    transparently use the override throughout the stack. The idea is that
    you get the override EDID via the ->get_modes() hook.
    
    Unfortunately, there are scenarios where the DDC probe in drm_get_edid()
    called via ->get_modes() fails, although the preceding ->detect()
    succeeds.
    
    In the case reported by Paul Wise, the ->detect() hook,
    intel_crt_detect(), relies on hotplug detect, bypassing the DDC. In the
    case reported by Ilpo Järvinen, there is no ->detect() hook, which is
    interpreted as connected. The subsequent DDC probe reached via
    ->get_modes() fails, and we don't even look at the override EDID,
    resulting in no modes being added.
    
    Because drm_get_edid() is used via ->detect() all over the place, we
    can't trivially remove the DDC probe, as it leads to override EDID
    effectively meaning connector forcing. The goal is that connector
    forcing and override EDID remain orthogonal.
    
    Generally, the underlying problem here is the conflation of ->detect()
    and ->get_modes() via drm_get_edid(). The former should just detect, and
    the latter should just get the modes, typically via reading the EDID. As
    long as drm_get_edid() is used in ->detect(), it needs to retain the DDC
    probe. Or such users need to have a separate DDC probe step first.
    
    The EDID caching between ->detect() and ->get_modes() done by some
    drivers is a further complication that prevents us from making
    drm_do_get_edid() adapt to the two cases.
    
    Work around the regression by falling back to a separate attempt at
    getting the override EDID at drm_helper_probe_single_connector_modes()
    level. With a working DDC and override EDID, it'll never be called; the
    override EDID will come via ->get_modes(). There will still be a failing
    DDC probe attempt in the cases that require the fallback.
    
    v2:
    - Call drm_connector_update_edid_property (Paul)
    - Update commit message about EDID caching (Daniel)
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107583
    
    
    Reported-by: default avatarPaul Wise <pabs3@bonedaddy.net>
    Cc: Paul Wise <pabs3@bonedaddy.net>
    References: http://mid.mail-archive.com/alpine.DEB.2.20.1905262211270.24390@whs-18.cs.helsinki.fi
    
    
    Reported-by: default avatarIlpo Järvinen <ilpo.jarvinen@cs.helsinki.fi>
    Cc: Ilpo Järvinen <ilpo.jarvinen@cs.helsinki.fi>
    Suggested-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    References: 15f080f0 ("drm/edid: respect connector force for drm_get_edid ddc probe")
    Fixes: 53fd40a9 ("drm: handle override and firmware EDID at drm_do_get_edid() level")
    Cc: <stable@vger.kernel.org> # v4.15+ 56a2b7f2
    
     drm/edid: abstract override/firmware EDID retrieval
    Cc: <stable@vger.kernel.org> # v4.15+
    Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
    Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
    Cc: Harish Chegondi <harish.chegondi@intel.com>
    Tested-by: default avatarPaul Wise <pabs3@bonedaddy.net>
    Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20190610093054.28445-1-jani.nikula@intel.com
    48eaeb76