• Keith Packard's avatar
    drm: Update edid-derived drm_display_info fields at edid property set [v2] · 4b4df570
    Keith Packard authored
    There are a set of values in the drm_display_info structure for each
    connector which hold information derived from EDID. These are computed
    in drm_add_display_info. Before this patch, that was only called in
    drm_add_edid_modes. This meant that they were only set when EDID was
    present and never reset when EDID was not, as happened when the
    display was disconnected.
    
    One of these fields, non_desktop, is used from
    drm_mode_connector_update_edid_property, the function responsible for
    assigning the new edid value to the application-visible property.
    
    Various drivers call these two functions (drm_add_edid_modes and
    drm_mode_connector_update_edid_property) in different orders. This
    means that even when EDID is present, the drm_display_info fields may
    not have been computed at the time that
    drm_mode_connector_update_edid_property used the non_desktop value to
    set the non_desktop property.
    
    I've added a public function (drm_reset_display_info) that resets the
    drm_display_info field values to default values and then made the
    drm_add_display_info function public. These two functions are now
    called directly from drm_mode_connector_update_edid_property so that
    the drm_display_info fields are always computed from the current EDID
    information before being used in that function.
    
    This means that the drm_display_info values are often computed twice,
    once when the EDID property it set and a second time when EDID is used
    to compute modes for the device. The alternative would be to uniformly
    ensure that the values were computed once before being used, which
    would require that all drivers reliably invoke the two paths in the
    same order. The computation is inexpensive enough that it seems more
    maintainable in the long term to simply compute them in both paths.
    
    The API to drm_add_display_info has been changed so that it no longer
    takes the set of edid-based quirks as a parameter. Rather, it now
    computes those quirks itself and returns them for further use by
    drm_add_edid_modes.
    
    This patch also includes a number of 'const' additions caused by
    drm_mode_connector_update_edid_property taking a 'const struct edid *'
    parameter and wanting to pass that along to drm_add_display_info.
    
    v2: after review by Daniel Vetter <daniel.vetter@ffwll.ch>
    
    	Removed EXPORT_SYMBOL_GPL for drm_reset_display_info and
    	drm_add_display_info.
    
    	Added FIXME in drm_mode_connector_update_edid_property about
    	potentially merging that with drm_add_edid_modes to avoid
    	the need for two driver calls.
    Signed-off-by: default avatarKeith Packard <keithp@keithp.com>
    Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    Link: https://patchwork.freedesktop.org/patch/msgid/20171213084427.31199-1-keithp@keithp.com
    (danvet: cherry picked from commit 12a889bf4bca ("drm: rework delayed
    connector cleanup in connector_iter") from drm-misc-next since
    functional conflict with changes in -next and we need to make sure
    both have the right version and nothing gets lost.)
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    4b4df570
drm_edid.h 15.3 KB