• Jani Nikula's avatar
    drm/edid: add separate drm_edid_connector_add_modes() · c533b516
    Jani Nikula authored
    The original goal with drm_edid_connector_update() was to have a single
    call for updating the connector and adding probed modes, in this order,
    but that turned out to be problematic. Drivers that need to update the
    connector in the .detect() callback would end up updating the probed
    modes as well. Turns out the callback may be called so many times that
    the probed mode list fills up without bounds, and this is amplified by
    add_alternate_cea_modes() duplicating the CEA modes on every call,
    actually running out of memory on some machines.
    
    Kudos to Imre Deak <imre.deak@intel.com> for explaining this to me.
    
    Go back to having separate drm_edid_connector_update() and
    drm_edid_connector_add_modes() calls. The former may be called from
    .detect(), .force(), or .get_modes(), but the latter only from
    .get_modes().
    
    Unlike drm_add_edid_modes(), have drm_edid_connector_add_modes() update
    the probed modes from the EDID property instead of the passed in
    EDID. This is mainly to enforce two things:
    
    1) drm_edid_connector_update() must be called before
       drm_edid_connector_add_modes().
    
       Display info and quirks are needed for parsing the modes, and we
       don't want to call update_display_info() again to ensure the info is
       available, like drm_add_edid_modes() does.
    
    2) The same EDID is used for both updating the connector and adding the
       probed modes.
    
    Fortunately, the change is easy, because no driver has actually adopted
    drm_edid_connector_update(). Not even i915, and that's mainly because of
    the problem described above.
    
    Cc: Imre Deak <imre.deak@intel.com>
    Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
    Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
    Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/e86fff1579f14ebf6334692526c8f6831cd02cac.1674144945.git.jani.nikula@intel.com
    c533b516
drm_edid.c 222 KB