|
@@ -3669,10 +3669,6 @@ static void intel_update_pipe_config(struct intel_crtc *crtc,
|
|
|
/* drm_atomic_helper_update_legacy_modeset_state might not be called. */
|
|
|
crtc->base.mode = crtc->base.state->mode;
|
|
|
|
|
|
- DRM_DEBUG_KMS("Updating pipe size %ix%i -> %ix%i\n",
|
|
|
- old_crtc_state->pipe_src_w, old_crtc_state->pipe_src_h,
|
|
|
- pipe_config->pipe_src_w, pipe_config->pipe_src_h);
|
|
|
-
|
|
|
/*
|
|
|
* Update pipe size and adjust fitter if needed: the reason for this is
|
|
|
* that in compute_mode_changes we check the native mode (not the pfit
|
|
@@ -4796,23 +4792,17 @@ static void skylake_pfit_enable(struct intel_crtc *crtc)
|
|
|
struct intel_crtc_scaler_state *scaler_state =
|
|
|
&crtc->config->scaler_state;
|
|
|
|
|
|
- DRM_DEBUG_KMS("for crtc_state = %p\n", crtc->config);
|
|
|
-
|
|
|
if (crtc->config->pch_pfit.enabled) {
|
|
|
int id;
|
|
|
|
|
|
- if (WARN_ON(crtc->config->scaler_state.scaler_id < 0)) {
|
|
|
- DRM_ERROR("Requesting pfit without getting a scaler first\n");
|
|
|
+ if (WARN_ON(crtc->config->scaler_state.scaler_id < 0))
|
|
|
return;
|
|
|
- }
|
|
|
|
|
|
id = scaler_state->scaler_id;
|
|
|
I915_WRITE(SKL_PS_CTRL(pipe, id), PS_SCALER_EN |
|
|
|
PS_FILTER_MEDIUM | scaler_state->scalers[id].mode);
|
|
|
I915_WRITE(SKL_PS_WIN_POS(pipe, id), crtc->config->pch_pfit.pos);
|
|
|
I915_WRITE(SKL_PS_WIN_SZ(pipe, id), crtc->config->pch_pfit.size);
|
|
|
-
|
|
|
- DRM_DEBUG_KMS("for crtc_state = %p scaler_id = %d\n", crtc->config, id);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -14379,6 +14369,24 @@ static void skl_update_crtcs(struct drm_atomic_state *state,
|
|
|
} while (progress);
|
|
|
}
|
|
|
|
|
|
+static void intel_atomic_helper_free_state(struct drm_i915_private *dev_priv)
|
|
|
+{
|
|
|
+ struct intel_atomic_state *state, *next;
|
|
|
+ struct llist_node *freed;
|
|
|
+
|
|
|
+ freed = llist_del_all(&dev_priv->atomic_helper.free_list);
|
|
|
+ llist_for_each_entry_safe(state, next, freed, freed)
|
|
|
+ drm_atomic_state_put(&state->base);
|
|
|
+}
|
|
|
+
|
|
|
+static void intel_atomic_helper_free_state_worker(struct work_struct *work)
|
|
|
+{
|
|
|
+ struct drm_i915_private *dev_priv =
|
|
|
+ container_of(work, typeof(*dev_priv), atomic_helper.free_work);
|
|
|
+
|
|
|
+ intel_atomic_helper_free_state(dev_priv);
|
|
|
+}
|
|
|
+
|
|
|
static void intel_atomic_commit_tail(struct drm_atomic_state *state)
|
|
|
{
|
|
|
struct drm_device *dev = state->dev;
|
|
@@ -14545,6 +14553,8 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state)
|
|
|
* can happen also when the device is completely off.
|
|
|
*/
|
|
|
intel_uncore_arm_unclaimed_mmio_detection(dev_priv);
|
|
|
+
|
|
|
+ intel_atomic_helper_free_state(dev_priv);
|
|
|
}
|
|
|
|
|
|
static void intel_atomic_commit_work(struct work_struct *work)
|
|
@@ -14946,17 +14956,19 @@ static void intel_begin_crtc_commit(struct drm_crtc *crtc,
|
|
|
to_intel_atomic_state(old_crtc_state->state);
|
|
|
bool modeset = needs_modeset(crtc->state);
|
|
|
|
|
|
+ if (!modeset &&
|
|
|
+ (intel_cstate->base.color_mgmt_changed ||
|
|
|
+ intel_cstate->update_pipe)) {
|
|
|
+ intel_color_set_csc(crtc->state);
|
|
|
+ intel_color_load_luts(crtc->state);
|
|
|
+ }
|
|
|
+
|
|
|
/* Perform vblank evasion around commit operation */
|
|
|
intel_pipe_update_start(intel_crtc);
|
|
|
|
|
|
if (modeset)
|
|
|
goto out;
|
|
|
|
|
|
- if (crtc->state->color_mgmt_changed || to_intel_crtc_state(crtc->state)->update_pipe) {
|
|
|
- intel_color_set_csc(crtc->state);
|
|
|
- intel_color_load_luts(crtc->state);
|
|
|
- }
|
|
|
-
|
|
|
if (intel_cstate->update_pipe)
|
|
|
intel_update_pipe_config(intel_crtc, old_intel_cstate);
|
|
|
else if (INTEL_GEN(dev_priv) >= 9)
|
|
@@ -16599,18 +16611,6 @@ fail:
|
|
|
drm_modeset_acquire_fini(&ctx);
|
|
|
}
|
|
|
|
|
|
-static void intel_atomic_helper_free_state(struct work_struct *work)
|
|
|
-{
|
|
|
- struct drm_i915_private *dev_priv =
|
|
|
- container_of(work, typeof(*dev_priv), atomic_helper.free_work);
|
|
|
- struct intel_atomic_state *state, *next;
|
|
|
- struct llist_node *freed;
|
|
|
-
|
|
|
- freed = llist_del_all(&dev_priv->atomic_helper.free_list);
|
|
|
- llist_for_each_entry_safe(state, next, freed, freed)
|
|
|
- drm_atomic_state_put(&state->base);
|
|
|
-}
|
|
|
-
|
|
|
int intel_modeset_init(struct drm_device *dev)
|
|
|
{
|
|
|
struct drm_i915_private *dev_priv = to_i915(dev);
|
|
@@ -16631,7 +16631,7 @@ int intel_modeset_init(struct drm_device *dev)
|
|
|
dev->mode_config.funcs = &intel_mode_funcs;
|
|
|
|
|
|
INIT_WORK(&dev_priv->atomic_helper.free_work,
|
|
|
- intel_atomic_helper_free_state);
|
|
|
+ intel_atomic_helper_free_state_worker);
|
|
|
|
|
|
intel_init_quirks(dev);
|
|
|
|