aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_runtime_pm.c
diff options
context:
space:
mode:
authorSuketu Shah <suketu.j.shah@intel.com>2015-04-16 04:52:10 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-05-08 07:03:13 -0400
commit5aefb2398afad6998d51f90294e02b37b3f19a40 (patch)
tree3d88bd2580ffd5f4562f4c2e447930ad7698da53 /drivers/gpu/drm/i915/intel_runtime_pm.c
parent6b457d31ea0465fcadcf6d5044f5f71398954727 (diff)
drm/i915/skl: Assert the requirements to enter or exit DC5.
Warn if the conditions to enter or exit DC5 are not satisfied such as support for runtime PM, state of power well, CSR loading etc. v2: Removed camelcase in functions and variables. v3: Do some minimal check to assert if CSR program is not loaded. v4: 1] Used an appropriate function lookup_power_well() to identify power well, instead of using a magic number which can change in future. 2] Split the conditions further in assert_can_enable_DC5() and added more checks. 3] Removed all WARNs from assert_can_disable_DC5 as they were unnecessary and added two new ones. 4] Changed variable names as updated in earlier patches. v5: 1] Change lookup_power_well function to take an int power well id. 2] Define a new intel_display_power_well_is_enabled helper function to check whether a particular power well is enabled. 3] Use CSR-related mutex in assert_csr_loaded function. v6: Remove use of dc5_enabled variable as it's no longer needed. v7: 1] Rebase to latest. 2] Move all DC5-related functions from intel_display.c to intel_runtime_pm.c. v8: After adding dmc ver 1.0 support rebased on top of nightly. (Animesh) v9: Modified below changes based on review comments from Imre. - Moved intel_display_power_well_is_enabled() to intel_runtime_pm.c. - Removed mutex lock from assert_csr_loaded(). (Animesh) Issue: VIZ-2819 Signed-off-by: A.Sunil Kamath <sunil.kamath@intel.com> Signed-off-by: Suketu Shah <suketu.j.shah@intel.com> Signed-off-by: Damien Lespiau <damien.lespiau@intel.com> Signed-off-by: Animesh Manna <animesh.manna@intel.com> Reviewed-by: Imre Deak <imre.deak@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_runtime_pm.c')
-rw-r--r--drivers/gpu/drm/i915/intel_runtime_pm.c51
1 files changed, 46 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
index 839010a57a2b..2f7f0ab363fb 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -64,6 +64,9 @@
64 i--) \ 64 i--) \
65 if ((power_well)->domains & (domain_mask)) 65 if ((power_well)->domains & (domain_mask))
66 66
67bool intel_display_power_well_is_enabled(struct drm_i915_private *dev_priv,
68 int power_well_id);
69
67/* 70/*
68 * We should only use the power well if we explicitly asked the hardware to 71 * We should only use the power well if we explicitly asked the hardware to
69 * enable it, so check if it's enabled and also check if we've requested it to 72 * enable it, so check if it's enabled and also check if we've requested it to
@@ -433,12 +436,39 @@ static void gen9_set_dc_state_debugmask_memory_up(
433 } 436 }
434} 437}
435 438
436static void gen9_enable_dc5(struct drm_i915_private *dev_priv) 439static void assert_can_enable_dc5(struct drm_i915_private *dev_priv)
437{ 440{
438 struct drm_device *dev = dev_priv->dev; 441 struct drm_device *dev = dev_priv->dev;
442 bool pg2_enabled = intel_display_power_well_is_enabled(dev_priv,
443 SKL_DISP_PW_2);
444
445 WARN(!IS_SKYLAKE(dev), "Platform doesn't support DC5.\n");
446 WARN(!HAS_RUNTIME_PM(dev), "Runtime PM not enabled.\n");
447 WARN(pg2_enabled, "PG2 not disabled to enable DC5.\n");
448
449 WARN((I915_READ(DC_STATE_EN) & DC_STATE_EN_UPTO_DC5),
450 "DC5 already programmed to be enabled.\n");
451 WARN(dev_priv->pm.suspended,
452 "DC5 cannot be enabled, if platform is runtime-suspended.\n");
453
454 assert_csr_loaded(dev_priv);
455}
456
457static void assert_can_disable_dc5(struct drm_i915_private *dev_priv)
458{
459 bool pg2_enabled = intel_display_power_well_is_enabled(dev_priv,
460 SKL_DISP_PW_2);
461
462 WARN(!pg2_enabled, "PG2 not enabled to disable DC5.\n");
463 WARN(dev_priv->pm.suspended,
464 "Disabling of DC5 while platform is runtime-suspended should never happen.\n");
465}
466
467static void gen9_enable_dc5(struct drm_i915_private *dev_priv)
468{
439 uint32_t val; 469 uint32_t val;
440 470
441 WARN_ON(!IS_GEN9(dev)); 471 assert_can_enable_dc5(dev_priv);
442 472
443 DRM_DEBUG_KMS("Enabling DC5\n"); 473 DRM_DEBUG_KMS("Enabling DC5\n");
444 474
@@ -453,10 +483,9 @@ static void gen9_enable_dc5(struct drm_i915_private *dev_priv)
453 483
454static void gen9_disable_dc5(struct drm_i915_private *dev_priv) 484static void gen9_disable_dc5(struct drm_i915_private *dev_priv)
455{ 485{
456 struct drm_device *dev = dev_priv->dev;
457 uint32_t val; 486 uint32_t val;
458 487
459 WARN_ON(!IS_GEN9(dev)); 488 assert_can_disable_dc5(dev_priv);
460 489
461 DRM_DEBUG_KMS("Disabling DC5\n"); 490 DRM_DEBUG_KMS("Disabling DC5\n");
462 491
@@ -1416,7 +1445,7 @@ static struct i915_power_well chv_power_wells[] = {
1416}; 1445};
1417 1446
1418static struct i915_power_well *lookup_power_well(struct drm_i915_private *dev_priv, 1447static struct i915_power_well *lookup_power_well(struct drm_i915_private *dev_priv,
1419 enum punit_power_well power_well_id) 1448 int power_well_id)
1420{ 1449{
1421 struct i915_power_domains *power_domains = &dev_priv->power_domains; 1450 struct i915_power_domains *power_domains = &dev_priv->power_domains;
1422 struct i915_power_well *power_well; 1451 struct i915_power_well *power_well;
@@ -1430,6 +1459,18 @@ static struct i915_power_well *lookup_power_well(struct drm_i915_private *dev_pr
1430 return NULL; 1459 return NULL;
1431} 1460}
1432 1461
1462bool intel_display_power_well_is_enabled(struct drm_i915_private *dev_priv,
1463 int power_well_id)
1464{
1465 struct i915_power_well *power_well;
1466 bool ret;
1467
1468 power_well = lookup_power_well(dev_priv, power_well_id);
1469 ret = power_well->ops->is_enabled(dev_priv, power_well);
1470
1471 return ret;
1472}
1473
1433static struct i915_power_well skl_power_wells[] = { 1474static struct i915_power_well skl_power_wells[] = {
1434 { 1475 {
1435 .name = "always-on", 1476 .name = "always-on",