drm/i915/cdclk: Fix voltage_level programming edge case
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 2 Apr 2024 15:50:04 +0000 (18:50 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 4 Apr 2024 13:25:39 +0000 (16:25 +0300)
commit34d127e2bdef73a923aa0dcd95cbc3257ad5af52
tree8874f63ce309e4a50a886fe0e75f840efd0504b2
parent3aecee90ac12a351905f12dda7643d5b0676d6ca
drm/i915/cdclk: Fix voltage_level programming edge case

Currently we only consider the relationship of the
old and new CDCLK frequencies when determining whether
to do the repgramming from intel_set_cdclk_pre_plane_update()
or intel_set_cdclk_post_plane_update().

It is technically possible to have a situation where the
CDCLK frequency is decreasing, but the voltage_level is
increasing due a DDI port. In this case we should bump
the voltage level already in intel_set_cdclk_pre_plane_update()
(so that the voltage_level will have been increased by the
time the port gets enabled), while leaving the CDCLK frequency
unchanged (as active planes/etc. may still depend on it).
We can then reduce the CDCLK frequency to its final value
from intel_set_cdclk_post_plane_update().

In order to handle that correctly we shall construct a
suitable amalgam of the old and new cdclk states in
intel_set_cdclk_pre_plane_update().

And we can simply call intel_set_cdclk() unconditionally
in both places as it will not do anything if nothing actually
changes vs. the current hw state.

v2: Handle cdclk_state->disable_pipes
v3: Only synchronize the cd2x update against the pipe's vblank
    when the cdclk frequency is changing during the current
    commit phase (Gustavo)

Cc: stable@vger.kernel.org
Cc: Gustavo Sousa <gustavo.sousa@intel.com>
Reviewed-by: Uma Shankar <uma.shankar@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240402155016.13733-3-ville.syrjala@linux.intel.com
drivers/gpu/drm/i915/display/intel_cdclk.c