diff options
author | Maarten Lankhorst <maarten.lankhorst@linux.intel.com> | 2016-02-10 07:49:37 -0500 |
---|---|---|
committer | Maarten Lankhorst <maarten.lankhorst@linux.intel.com> | 2016-02-25 03:00:42 -0500 |
commit | 33c8df89351709ea79f2d384179b76df475b43ff (patch) | |
tree | e1d9e57dd63926220c8288f144956dd054463cc8 /drivers/gpu/drm/i915/intel_display.c | |
parent | 74bff5f92740a9dab61c695b1726f1c7c312e724 (diff) |
drm/i915: Unify power domain handling.
Right now there's separate power domain handling for update_pipe and
modesets. Unify this and only grab POWER_DOMAIN_MODESET once.
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1455108583-29227-3-git-send-email-maarten.lankhorst@linux.intel.com
Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 69 |
1 files changed, 24 insertions, 45 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 9d82d88235de..9a18613a41e8 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -5366,32 +5366,6 @@ static void modeset_put_power_domains(struct drm_i915_private *dev_priv, | |||
5366 | intel_display_power_put(dev_priv, domain); | 5366 | intel_display_power_put(dev_priv, domain); |
5367 | } | 5367 | } |
5368 | 5368 | ||
5369 | static void modeset_update_crtc_power_domains(struct drm_atomic_state *state) | ||
5370 | { | ||
5371 | struct intel_atomic_state *intel_state = to_intel_atomic_state(state); | ||
5372 | struct drm_device *dev = state->dev; | ||
5373 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
5374 | unsigned long put_domains[I915_MAX_PIPES] = {}; | ||
5375 | struct drm_crtc_state *crtc_state; | ||
5376 | struct drm_crtc *crtc; | ||
5377 | int i; | ||
5378 | |||
5379 | for_each_crtc_in_state(state, crtc, crtc_state, i) { | ||
5380 | if (needs_modeset(crtc->state)) | ||
5381 | put_domains[to_intel_crtc(crtc)->pipe] = | ||
5382 | modeset_get_crtc_power_domains(crtc, | ||
5383 | to_intel_crtc_state(crtc->state)); | ||
5384 | } | ||
5385 | |||
5386 | if (dev_priv->display.modeset_commit_cdclk && | ||
5387 | intel_state->dev_cdclk != dev_priv->cdclk_freq) | ||
5388 | dev_priv->display.modeset_commit_cdclk(state); | ||
5389 | |||
5390 | for (i = 0; i < I915_MAX_PIPES; i++) | ||
5391 | if (put_domains[i]) | ||
5392 | modeset_put_power_domains(dev_priv, put_domains[i]); | ||
5393 | } | ||
5394 | |||
5395 | static int intel_compute_max_dotclk(struct drm_i915_private *dev_priv) | 5369 | static int intel_compute_max_dotclk(struct drm_i915_private *dev_priv) |
5396 | { | 5370 | { |
5397 | int max_cdclk_freq = dev_priv->max_cdclk_freq; | 5371 | int max_cdclk_freq = dev_priv->max_cdclk_freq; |
@@ -13462,6 +13436,7 @@ static int intel_atomic_commit(struct drm_device *dev, | |||
13462 | struct drm_crtc *crtc; | 13436 | struct drm_crtc *crtc; |
13463 | int ret = 0, i; | 13437 | int ret = 0, i; |
13464 | bool hw_check = intel_state->modeset; | 13438 | bool hw_check = intel_state->modeset; |
13439 | unsigned long put_domains[I915_MAX_PIPES] = {}; | ||
13465 | 13440 | ||
13466 | ret = intel_atomic_prepare_commit(dev, state, async); | 13441 | ret = intel_atomic_prepare_commit(dev, state, async); |
13467 | if (ret) { | 13442 | if (ret) { |
@@ -13477,11 +13452,22 @@ static int intel_atomic_commit(struct drm_device *dev, | |||
13477 | sizeof(intel_state->min_pixclk)); | 13452 | sizeof(intel_state->min_pixclk)); |
13478 | dev_priv->active_crtcs = intel_state->active_crtcs; | 13453 | dev_priv->active_crtcs = intel_state->active_crtcs; |
13479 | dev_priv->atomic_cdclk_freq = intel_state->cdclk; | 13454 | dev_priv->atomic_cdclk_freq = intel_state->cdclk; |
13455 | |||
13456 | intel_display_power_get(dev_priv, POWER_DOMAIN_MODESET); | ||
13480 | } | 13457 | } |
13481 | 13458 | ||
13482 | for_each_crtc_in_state(state, crtc, crtc_state, i) { | 13459 | for_each_crtc_in_state(state, crtc, crtc_state, i) { |
13483 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 13460 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
13484 | 13461 | ||
13462 | if (needs_modeset(crtc->state) || | ||
13463 | to_intel_crtc_state(crtc->state)->update_pipe) { | ||
13464 | hw_check = true; | ||
13465 | |||
13466 | put_domains[to_intel_crtc(crtc)->pipe] = | ||
13467 | modeset_get_crtc_power_domains(crtc, | ||
13468 | to_intel_crtc_state(crtc->state)); | ||
13469 | } | ||
13470 | |||
13485 | if (!needs_modeset(crtc->state)) | 13471 | if (!needs_modeset(crtc->state)) |
13486 | continue; | 13472 | continue; |
13487 | 13473 | ||
@@ -13514,7 +13500,10 @@ static int intel_atomic_commit(struct drm_device *dev, | |||
13514 | intel_shared_dpll_commit(state); | 13500 | intel_shared_dpll_commit(state); |
13515 | 13501 | ||
13516 | drm_atomic_helper_update_legacy_modeset_state(state->dev, state); | 13502 | drm_atomic_helper_update_legacy_modeset_state(state->dev, state); |
13517 | modeset_update_crtc_power_domains(state); | 13503 | |
13504 | if (dev_priv->display.modeset_commit_cdclk && | ||
13505 | intel_state->dev_cdclk != dev_priv->cdclk_freq) | ||
13506 | dev_priv->display.modeset_commit_cdclk(state); | ||
13518 | } | 13507 | } |
13519 | 13508 | ||
13520 | /* Now enable the clocks, plane, pipe, and connectors that we set up. */ | 13509 | /* Now enable the clocks, plane, pipe, and connectors that we set up. */ |
@@ -13523,24 +13512,12 @@ static int intel_atomic_commit(struct drm_device *dev, | |||
13523 | bool modeset = needs_modeset(crtc->state); | 13512 | bool modeset = needs_modeset(crtc->state); |
13524 | bool update_pipe = !modeset && | 13513 | bool update_pipe = !modeset && |
13525 | to_intel_crtc_state(crtc->state)->update_pipe; | 13514 | to_intel_crtc_state(crtc->state)->update_pipe; |
13526 | unsigned long put_domains = 0; | ||
13527 | |||
13528 | if (modeset) | ||
13529 | intel_display_power_get(dev_priv, POWER_DOMAIN_MODESET); | ||
13530 | 13515 | ||
13531 | if (modeset && crtc->state->active) { | 13516 | if (modeset && crtc->state->active) { |
13532 | update_scanline_offset(to_intel_crtc(crtc)); | 13517 | update_scanline_offset(to_intel_crtc(crtc)); |
13533 | dev_priv->display.crtc_enable(crtc); | 13518 | dev_priv->display.crtc_enable(crtc); |
13534 | } | 13519 | } |
13535 | 13520 | ||
13536 | if (update_pipe) { | ||
13537 | put_domains = modeset_get_crtc_power_domains(crtc, | ||
13538 | to_intel_crtc_state(crtc->state)); | ||
13539 | |||
13540 | /* make sure intel_modeset_check_state runs */ | ||
13541 | hw_check = true; | ||
13542 | } | ||
13543 | |||
13544 | if (!modeset) | 13521 | if (!modeset) |
13545 | intel_pre_plane_update(to_intel_crtc_state(crtc_state)); | 13522 | intel_pre_plane_update(to_intel_crtc_state(crtc_state)); |
13546 | 13523 | ||
@@ -13551,19 +13528,21 @@ static int intel_atomic_commit(struct drm_device *dev, | |||
13551 | (crtc->state->planes_changed || update_pipe)) | 13528 | (crtc->state->planes_changed || update_pipe)) |
13552 | drm_atomic_helper_commit_planes_on_crtc(crtc_state); | 13529 | drm_atomic_helper_commit_planes_on_crtc(crtc_state); |
13553 | 13530 | ||
13554 | if (put_domains) | ||
13555 | modeset_put_power_domains(dev_priv, put_domains); | ||
13556 | |||
13557 | intel_post_plane_update(intel_crtc); | 13531 | intel_post_plane_update(intel_crtc); |
13558 | |||
13559 | if (modeset) | ||
13560 | intel_display_power_put(dev_priv, POWER_DOMAIN_MODESET); | ||
13561 | } | 13532 | } |
13562 | 13533 | ||
13563 | /* FIXME: add subpixel order */ | 13534 | /* FIXME: add subpixel order */ |
13564 | 13535 | ||
13565 | drm_atomic_helper_wait_for_vblanks(dev, state); | 13536 | drm_atomic_helper_wait_for_vblanks(dev, state); |
13566 | 13537 | ||
13538 | for_each_crtc_in_state(state, crtc, crtc_state, i) { | ||
13539 | if (put_domains[i]) | ||
13540 | modeset_put_power_domains(dev_priv, put_domains[i]); | ||
13541 | } | ||
13542 | |||
13543 | if (intel_state->modeset) | ||
13544 | intel_display_power_put(dev_priv, POWER_DOMAIN_MODESET); | ||
13545 | |||
13567 | mutex_lock(&dev->struct_mutex); | 13546 | mutex_lock(&dev->struct_mutex); |
13568 | drm_atomic_helper_cleanup_planes(dev, state); | 13547 | drm_atomic_helper_cleanup_planes(dev, state); |
13569 | mutex_unlock(&dev->struct_mutex); | 13548 | mutex_unlock(&dev->struct_mutex); |