• Lyude Paul's avatar
    drm/nouveau: Fix nouveau_connector_ddc_detect() · d5986a1c
    Lyude Paul authored
    It looks like that when we moved over to using
    drm_connector_for_each_possible_encoder() in nouveau, that one rather
    important part of this function got dropped by accident:
    
    	/*          Right   v   here */
    	for (i = 0; nv_encoder = NULL, i < DRM_CONNECTOR_MAX_ENCODER; i++) {
    		int id = connector->encoder_ids[i];
    		if (id == 0)
    			break;
    
    Since it's rather difficult to notice: the conditional in this loop is
    actually:
    
    	nv_encoder = NULL, i < DRM_CONNECTOR_MAX_ENCODER
    
    Meaning that all early breaks result in nv_encoder keeping it's value,
    otherwise nv_encoder = NULL. Ugh.
    
    Since this got dropped, nouveau_connector_ddc_detect() now returns an
    encoder for every single connector, regardless of whether or not it's
    detected:
    
        [ 1780.056185] nouveau 0000:01:00.0: DRM: DDC responded, but no EDID for DP-2
    
    So: fix this to ensure we only return an encoder if we actually found
    one, and clean up the rest of the function while we're at it since it's
    nearly impossible to read properly.
    
    Changes since v1:
    - Don't skip ddc probing for LVDS if we can't switch DDC through
      vga-switcheroo, just do the DDC probing without calling
      vga_switcheroo_lock_ddc() - skeggsb
    Signed-off-by: default avatarLyude Paul <lyude@redhat.com>
    Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
    Fixes: ddba766d ("drm/nouveau: Use drm_connector_for_each_possible_encoder()")
    Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
    Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
    d5986a1c
nouveau_connector.c 41.2 KB