@@ -3963,46 +3963,11 @@ found:
return pll;
}
-/**
- * intel_shared_dpll_start_config - start a new PLL staged config
- * @dev_priv: DRM device
- * @clear_pipes: mask of pipes that will have their PLLs freed
- *
- * Starts a new PLL staged config, copying the current config but
- * releasing the references of pipes specified in clear_pipes.
- */
-static int intel_shared_dpll_start_config(struct drm_i915_private *dev_priv,
- struct intel_atomic_state *state,
- unsigned clear_pipes)
-{
- struct intel_shared_dpll_config *pll_config;
- enum intel_dpll_id i;
-
- /* FIXME: convert this to a simple memdup */
-
- for (i = 0; i < dev_priv->num_shared_dpll; i++) {
- pll_config = &dev_priv->display_state->shared_dpll[i];
-
- memcpy(&state->shared_dpll[i], pll_config,
- sizeof *pll_config);
- state->shared_dpll[i].crtc_mask &= ~clear_pipes;
- }
-
- return 0;
-}
-
-static void intel_shared_dpll_commit(struct drm_i915_private *dev_priv,
- struct intel_atomic_state *state)
+static struct intel_atomic_state *
+intel_atomic_state_duplicate(struct drm_i915_private *dev_priv)
{
- struct intel_shared_dpll_config *pll_config;
- enum intel_dpll_id i;
-
- /* FIXME: convert this to a poiner swap */
-
- for (i = 0; i < dev_priv->num_shared_dpll; i++) {
- pll_config = &dev_priv->display_state->shared_dpll[i];
- *pll_config = state->shared_dpll[i];
- }
+ return kmemdup(dev_priv->display_state,
+ sizeof *dev_priv->display_state, GFP_KERNEL);
}
static void cpt_verify_modeset(struct drm_device *dev, int pipe)
@@ -10405,14 +10370,15 @@ static bool intel_crtc_in_use(struct drm_crtc *crtc)
static void
intel_modeset_update_state(struct drm_device *dev, unsigned prepare_pipes,
- struct intel_atomic_state *state)
+ struct intel_atomic_state **state)
{
struct drm_i915_private *dev_priv = dev->dev_private;
struct intel_encoder *intel_encoder;
struct intel_crtc *intel_crtc;
struct drm_connector *connector;
- intel_shared_dpll_commit(dev_priv, state);
+ /* Commit PLL and other global state */
+ swap(dev_priv->display_state, *state);
for_each_intel_encoder(dev, intel_encoder) {
if (!intel_encoder->base.crtc)
@@ -11020,13 +10986,13 @@ static int __intel_set_mode_setup_plls(struct drm_device *dev,
unsigned clear_pipes = modeset_pipes | disable_pipes;
struct intel_crtc *intel_crtc;
int ret = 0;
+ int i;
if (!dev_priv->display.crtc_compute_clock)
return 0;
- ret = intel_shared_dpll_start_config(dev_priv, state, clear_pipes);
- if (ret)
- return ret;
+ for (i = 0; i < dev_priv->num_shared_dpll; i++)
+ state->shared_dpll[i].crtc_mask &= ~clear_pipes;
for_each_intel_crtc_masked(dev, modeset_pipes, intel_crtc) {
struct intel_crtc_state *crtc_state = intel_crtc->new_config;
@@ -11077,7 +11043,7 @@ static int __intel_set_mode(struct drm_crtc *crtc,
prepare_pipes &= ~disable_pipes;
}
- state = kzalloc(sizeof *state, GFP_KERNEL);
+ state = intel_atomic_state_duplicate(dev_priv);
if (!state) {
ret = -ENOMEM;
goto done;
@@ -11120,7 +11086,7 @@ static int __intel_set_mode(struct drm_crtc *crtc,
/* Only after disabling all output pipelines that will be changed can we
* update the the output configuration. */
- intel_modeset_update_state(dev, prepare_pipes, state);
+ intel_modeset_update_state(dev, prepare_pipes, &state);
modeset_update_crtc_power_domains(dev);
This deletes some code and is closer to what the logic will look like with atomic mode setting. Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com> --- drivers/gpu/drm/i915/intel_display.c | 58 ++++++++---------------------------- 1 file changed, 12 insertions(+), 46 deletions(-)