Commit d305e061 authored by Ville Syrjälä's avatar Ville Syrjälä

drm/i915: Track minimum acceptable cdclk instead of "minimum dotclock"

Make the min_pixclk thing less confusing by changing it to track
the minimum acceptable cdclk frequency instead. This means moving
the application of the guardbands to a slightly higher level from
the low level platform specific calc_cdclk() functions.

The immediate benefit is elimination of the confusing 2x factors
on GLK/CNL+ in the audio workarounds (which stems from the fact
that the pipes produce two pixels per clock).

v2: Keep cdclk higher on CNL to workaround missing DDI clock voltage handling
v3: Squash with the CNL cdclk limits patch (DK)
v4: s/intel_min_cdclk/intel_pixel_rate_to_cdclk/ (DK)

Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: default avatarDhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20170830185703.8189-1-ville.syrjala@linux.intel.com
parent 5fcf34b1
...@@ -569,6 +569,15 @@ struct i915_hotplug { ...@@ -569,6 +569,15 @@ struct i915_hotplug {
(__i)++) \ (__i)++) \
for_each_if (plane_state) for_each_if (plane_state)
#define for_each_new_intel_crtc_in_state(__state, crtc, new_crtc_state, __i) \
for ((__i) = 0; \
(__i) < (__state)->base.dev->mode_config.num_crtc && \
((crtc) = to_intel_crtc((__state)->base.crtcs[__i].ptr), \
(new_crtc_state) = to_intel_crtc_state((__state)->base.crtcs[__i].new_state), 1); \
(__i)++) \
for_each_if (crtc)
struct drm_i915_private; struct drm_i915_private;
struct i915_mm_struct; struct i915_mm_struct;
struct i915_mmu_object; struct i915_mmu_object;
...@@ -2335,7 +2344,8 @@ struct drm_i915_private { ...@@ -2335,7 +2344,8 @@ struct drm_i915_private {
struct mutex dpll_lock; struct mutex dpll_lock;
unsigned int active_crtcs; unsigned int active_crtcs;
unsigned int min_pixclk[I915_MAX_PIPES]; /* minimum acceptable cdclk for each pipe */
int min_cdclk[I915_MAX_PIPES];
int dpio_phy_iosf_port[I915_NUM_PHYS_VLV]; int dpio_phy_iosf_port[I915_NUM_PHYS_VLV];
......
This diff is collapsed.
...@@ -6038,7 +6038,7 @@ static void intel_crtc_disable_noatomic(struct drm_crtc *crtc, ...@@ -6038,7 +6038,7 @@ static void intel_crtc_disable_noatomic(struct drm_crtc *crtc,
intel_crtc->enabled_power_domains = 0; intel_crtc->enabled_power_domains = 0;
dev_priv->active_crtcs &= ~(1 << intel_crtc->pipe); dev_priv->active_crtcs &= ~(1 << intel_crtc->pipe);
dev_priv->min_pixclk[intel_crtc->pipe] = 0; dev_priv->min_cdclk[intel_crtc->pipe] = 0;
} }
/* /*
...@@ -12631,8 +12631,8 @@ static int intel_atomic_commit(struct drm_device *dev, ...@@ -12631,8 +12631,8 @@ static int intel_atomic_commit(struct drm_device *dev,
intel_atomic_track_fbs(state); intel_atomic_track_fbs(state);
if (intel_state->modeset) { if (intel_state->modeset) {
memcpy(dev_priv->min_pixclk, intel_state->min_pixclk, memcpy(dev_priv->min_cdclk, intel_state->min_cdclk,
sizeof(intel_state->min_pixclk)); sizeof(intel_state->min_cdclk));
dev_priv->active_crtcs = intel_state->active_crtcs; dev_priv->active_crtcs = intel_state->active_crtcs;
dev_priv->cdclk.logical = intel_state->cdclk.logical; dev_priv->cdclk.logical = intel_state->cdclk.logical;
dev_priv->cdclk.actual = intel_state->cdclk.actual; dev_priv->cdclk.actual = intel_state->cdclk.actual;
...@@ -15097,7 +15097,7 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev) ...@@ -15097,7 +15097,7 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
for_each_intel_crtc(dev, crtc) { for_each_intel_crtc(dev, crtc) {
struct intel_crtc_state *crtc_state = struct intel_crtc_state *crtc_state =
to_intel_crtc_state(crtc->base.state); to_intel_crtc_state(crtc->base.state);
int pixclk = 0; int min_cdclk = 0;
memset(&crtc->base.mode, 0, sizeof(crtc->base.mode)); memset(&crtc->base.mode, 0, sizeof(crtc->base.mode));
if (crtc_state->base.active) { if (crtc_state->base.active) {
...@@ -15118,22 +15118,15 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev) ...@@ -15118,22 +15118,15 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
intel_crtc_compute_pixel_rate(crtc_state); intel_crtc_compute_pixel_rate(crtc_state);
if (INTEL_GEN(dev_priv) >= 9 || IS_BROADWELL(dev_priv) || if (dev_priv->display.modeset_calc_cdclk)
IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) min_cdclk = intel_crtc_compute_min_cdclk(crtc_state);
pixclk = crtc_state->pixel_rate;
else
WARN_ON(dev_priv->display.modeset_calc_cdclk);
/* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */
if (IS_BROADWELL(dev_priv) && crtc_state->ips_enabled)
pixclk = DIV_ROUND_UP(pixclk * 100, 95);
drm_calc_timestamping_constants(&crtc->base, drm_calc_timestamping_constants(&crtc->base,
&crtc_state->base.adjusted_mode); &crtc_state->base.adjusted_mode);
update_scanline_offset(crtc); update_scanline_offset(crtc);
} }
dev_priv->min_pixclk[crtc->pipe] = pixclk; dev_priv->min_cdclk[crtc->pipe] = min_cdclk;
intel_pipe_config_sanity_check(dev_priv, crtc_state); intel_pipe_config_sanity_check(dev_priv, crtc_state);
} }
......
...@@ -384,7 +384,8 @@ struct intel_atomic_state { ...@@ -384,7 +384,8 @@ struct intel_atomic_state {
unsigned int active_pipe_changes; unsigned int active_pipe_changes;
unsigned int active_crtcs; unsigned int active_crtcs;
unsigned int min_pixclk[I915_MAX_PIPES]; /* minimum acceptable cdclk for each pipe */
int min_cdclk[I915_MAX_PIPES];
struct intel_shared_dpll_state shared_dpll[I915_NUM_PLLS]; struct intel_shared_dpll_state shared_dpll[I915_NUM_PLLS];
...@@ -1290,6 +1291,7 @@ void intel_audio_init(struct drm_i915_private *dev_priv); ...@@ -1290,6 +1291,7 @@ void intel_audio_init(struct drm_i915_private *dev_priv);
void intel_audio_deinit(struct drm_i915_private *dev_priv); void intel_audio_deinit(struct drm_i915_private *dev_priv);
/* intel_cdclk.c */ /* intel_cdclk.c */
int intel_crtc_compute_min_cdclk(const struct intel_crtc_state *crtc_state);
void skl_init_cdclk(struct drm_i915_private *dev_priv); void skl_init_cdclk(struct drm_i915_private *dev_priv);
void skl_uninit_cdclk(struct drm_i915_private *dev_priv); void skl_uninit_cdclk(struct drm_i915_private *dev_priv);
void cnl_init_cdclk(struct drm_i915_private *dev_priv); void cnl_init_cdclk(struct drm_i915_private *dev_priv);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment