• Daniel Vetter's avatar
    drm/i915: stage modeset output changes · 9a935856
    Daniel Vetter authored
    This is the core of the new modeset logic.
    
    The current code which is based upon the crtc helper code first
    updates all the link of the new display pipeline and then calls the
    lower-level set_mode function to execute the required callbacks to get
    there. The issue with this approach is that for disabling we need to
    know the _current_ display pipe state, not the new one.
    
    Hence we need to stage the new state of the display pipe and only
    update it once we have disabled the current configuration and before we
    start to update the hw registers with the new configuration.
    
    This patch here just prepares the ground by switching the new output
    state computation to these staging pointers. To make it clearer,
    rename the old update_output_state function to stage_output_state.
    
    A few peculiarities:
    - We're also calling the set_mode function at various places to update
      properties. Hence after a successfule modeset we need to stage the
      current configuration (for otherwise we might fall back again). This
      happens automatically because as part of the (successful) modeset we
      need to copy the staged state to the real one. But for the hw
      readout code we need to make sure that this happens, too.
    - Teach the new staged output state computation code the required
      smarts to handle the disabling of outputs. The current code handles
      this in a special case, but to better handle global modeset changes
      covering more than one crtc, we want to do this all in the same
      low-level modeset code.
    - The actual modeset code is still a bit ugly and wants to know the new
      crtc->enabled state a bit early. Follow-on patches will clean that
      up, for now we have to apply the staged output configuration early,
      outside of the set_mode functions.
    - Improve/add comments in stage_output_state.
    
    Essentially all that is left to do now is move the disabling code into
    set_mode and then move the staged state update code also into
    set_mode, at the right place between disabling things and calling the
    mode_set callbacks for the new configuration.
    
    v2: Disabling a crtc works by passing in a NULL mode or fb, userspace
    doesn't hand in the list of connectors. We therefore need to detect
    this case manually and tear down all the output links.
    
    v3: Properly update the output staging pointers after having read out
    the hw state.
    
    v4: Simplify the code, add more DRM_DEBUG_KMS output and check a few
    assumptions with WARN_ON. Essentially all things that I've noticed
    while debugging issues in other places of the code.
    
    v4: Correctly disable the old set of connectors when enabling an
    already enabled crtc on a new set of crtc. Reported by Paulo Zanoni.
    Reviewed-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    9a935856
intel_display.c 217 KB