• Ville Syrjälä's avatar
    drm/i915: Avoid div-by-zero when pixel_multiplier is zero · 2b85886a
    Ville Syrjälä authored
    On certain platforms pixel_multiplier is read out in
    .get_pipe_config(), but it also gets used to calculate the
    pixel clock in intel_sdvo_get_config(). If the pipe is disable
    but some SDVO outputs are active, we may end up dividing by zero
    in intel_sdvo_get_config().
    
    To avoid the problem simply check for zero pixel_multiplier and skip
    the division. Another attempt at fixing this involved populating
    pixel_multiplier to 1 even for disabled pipes, but that triggered a
    WARN because SDVO_CMD_GET_CLOCK_RATE_MULT command failed and thus
    encoder_pixel_multiplier was left at zero and didn't match
    pipe_config->pixel_multiplier.
    
    The "divide by pixel_multiplier" operation got introduced here:
     commit 18442d08
     Author: Ville Syrjälä <ville.syrjala@linux.intel.com>
     Date:   Fri Sep 13 16:00:08 2013 +0300
    
        drm/i915: Fix port_clock and adjusted_mode.clock readout all over
    
    and it has caused a regression on certain machines since they would
    hit the div-by-zero during resume.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=76520
    Cc: <stable@vger.kernel.org> # 3.13+
    Tested-by: default avatarTim Richardson <tim@tim-richardson.net>
    Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
    Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
    2b85886a
intel_sdvo.c 92 KB