diff options
author | Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com> | 2016-12-02 03:23:50 -0500 |
---|---|---|
committer | Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com> | 2016-12-02 09:40:42 -0500 |
commit | 0d03926de530057a15fe1ef735cb7f88716833cd (patch) | |
tree | 1513d70d57c352fd1f8ad90f5dec98f9aeeb54f7 /drivers/gpu/drm/i915/intel_runtime_pm.c | |
parent | cc3f90f0633c5f08044ba898e3fbf942d2e26cb3 (diff) |
drm/i915/glk: Add power wells for Geminilake
Geminilake has power wells are similar to SKL, but with the misc IO well
being split into separate AUX IO wells.
Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1480667037-11215-3-git-send-email-ander.conselvan.de.oliveira@intel.com
Diffstat (limited to 'drivers/gpu/drm/i915/intel_runtime_pm.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_runtime_pm.c | 114 |
1 files changed, 111 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c index 66ab1c8afaf2..49043fcf694f 100644 --- a/drivers/gpu/drm/i915/intel_runtime_pm.c +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c | |||
@@ -453,6 +453,45 @@ static void hsw_set_power_well(struct drm_i915_private *dev_priv, | |||
453 | BIT(POWER_DOMAIN_AUX_C) | \ | 453 | BIT(POWER_DOMAIN_AUX_C) | \ |
454 | BIT(POWER_DOMAIN_INIT)) | 454 | BIT(POWER_DOMAIN_INIT)) |
455 | 455 | ||
456 | #define GLK_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \ | ||
457 | BIT(POWER_DOMAIN_TRANSCODER_A) | \ | ||
458 | BIT(POWER_DOMAIN_PIPE_B) | \ | ||
459 | BIT(POWER_DOMAIN_TRANSCODER_B) | \ | ||
460 | BIT(POWER_DOMAIN_PIPE_C) | \ | ||
461 | BIT(POWER_DOMAIN_TRANSCODER_C) | \ | ||
462 | BIT(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ | ||
463 | BIT(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ | ||
464 | BIT(POWER_DOMAIN_PORT_DDI_B_LANES) | \ | ||
465 | BIT(POWER_DOMAIN_PORT_DDI_C_LANES) | \ | ||
466 | BIT(POWER_DOMAIN_AUX_B) | \ | ||
467 | BIT(POWER_DOMAIN_AUX_C) | \ | ||
468 | BIT(POWER_DOMAIN_AUDIO) | \ | ||
469 | BIT(POWER_DOMAIN_VGA) | \ | ||
470 | BIT(POWER_DOMAIN_INIT)) | ||
471 | #define GLK_DISPLAY_DDI_A_POWER_DOMAINS ( \ | ||
472 | BIT(POWER_DOMAIN_PORT_DDI_A_LANES) | \ | ||
473 | BIT(POWER_DOMAIN_INIT)) | ||
474 | #define GLK_DISPLAY_DDI_B_POWER_DOMAINS ( \ | ||
475 | BIT(POWER_DOMAIN_PORT_DDI_B_LANES) | \ | ||
476 | BIT(POWER_DOMAIN_INIT)) | ||
477 | #define GLK_DISPLAY_DDI_C_POWER_DOMAINS ( \ | ||
478 | BIT(POWER_DOMAIN_PORT_DDI_C_LANES) | \ | ||
479 | BIT(POWER_DOMAIN_INIT)) | ||
480 | #define GLK_DISPLAY_AUX_A_POWER_DOMAINS ( \ | ||
481 | BIT(POWER_DOMAIN_AUX_A) | \ | ||
482 | BIT(POWER_DOMAIN_INIT)) | ||
483 | #define GLK_DISPLAY_AUX_B_POWER_DOMAINS ( \ | ||
484 | BIT(POWER_DOMAIN_AUX_B) | \ | ||
485 | BIT(POWER_DOMAIN_INIT)) | ||
486 | #define GLK_DISPLAY_AUX_C_POWER_DOMAINS ( \ | ||
487 | BIT(POWER_DOMAIN_AUX_C) | \ | ||
488 | BIT(POWER_DOMAIN_INIT)) | ||
489 | #define GLK_DISPLAY_DC_OFF_POWER_DOMAINS ( \ | ||
490 | GLK_DISPLAY_POWERWELL_2_POWER_DOMAINS | \ | ||
491 | BIT(POWER_DOMAIN_MODESET) | \ | ||
492 | BIT(POWER_DOMAIN_AUX_A) | \ | ||
493 | BIT(POWER_DOMAIN_INIT)) | ||
494 | |||
456 | static void assert_can_enable_dc9(struct drm_i915_private *dev_priv) | 495 | static void assert_can_enable_dc9(struct drm_i915_private *dev_priv) |
457 | { | 496 | { |
458 | WARN_ONCE((I915_READ(DC_STATE_EN) & DC_STATE_EN_DC9), | 497 | WARN_ONCE((I915_READ(DC_STATE_EN) & DC_STATE_EN_DC9), |
@@ -694,7 +733,7 @@ gen9_sanitize_power_well_requests(struct drm_i915_private *dev_priv, | |||
694 | } | 733 | } |
695 | 734 | ||
696 | static void skl_set_power_well(struct drm_i915_private *dev_priv, | 735 | static void skl_set_power_well(struct drm_i915_private *dev_priv, |
697 | struct i915_power_well *power_well, bool enable) | 736 | struct i915_power_well *power_well, bool enable) |
698 | { | 737 | { |
699 | uint32_t tmp, fuse_status; | 738 | uint32_t tmp, fuse_status; |
700 | uint32_t req_mask, state_mask; | 739 | uint32_t req_mask, state_mask; |
@@ -720,11 +759,14 @@ static void skl_set_power_well(struct drm_i915_private *dev_priv, | |||
720 | return; | 759 | return; |
721 | } | 760 | } |
722 | break; | 761 | break; |
723 | case SKL_DISP_PW_DDI_A_E: | 762 | case SKL_DISP_PW_MISC_IO: |
763 | case SKL_DISP_PW_DDI_A_E: /* GLK_DISP_PW_DDI_A */ | ||
724 | case SKL_DISP_PW_DDI_B: | 764 | case SKL_DISP_PW_DDI_B: |
725 | case SKL_DISP_PW_DDI_C: | 765 | case SKL_DISP_PW_DDI_C: |
726 | case SKL_DISP_PW_DDI_D: | 766 | case SKL_DISP_PW_DDI_D: |
727 | case SKL_DISP_PW_MISC_IO: | 767 | case GLK_DISP_PW_AUX_A: |
768 | case GLK_DISP_PW_AUX_B: | ||
769 | case GLK_DISP_PW_AUX_C: | ||
728 | break; | 770 | break; |
729 | default: | 771 | default: |
730 | WARN(1, "Unknown power well %lu\n", power_well->id); | 772 | WARN(1, "Unknown power well %lu\n", power_well->id); |
@@ -2150,6 +2192,70 @@ static struct i915_power_well bxt_power_wells[] = { | |||
2150 | }, | 2192 | }, |
2151 | }; | 2193 | }; |
2152 | 2194 | ||
2195 | static struct i915_power_well glk_power_wells[] = { | ||
2196 | { | ||
2197 | .name = "always-on", | ||
2198 | .always_on = 1, | ||
2199 | .domains = POWER_DOMAIN_MASK, | ||
2200 | .ops = &i9xx_always_on_power_well_ops, | ||
2201 | }, | ||
2202 | { | ||
2203 | .name = "power well 1", | ||
2204 | /* Handled by the DMC firmware */ | ||
2205 | .domains = 0, | ||
2206 | .ops = &skl_power_well_ops, | ||
2207 | .id = SKL_DISP_PW_1, | ||
2208 | }, | ||
2209 | { | ||
2210 | .name = "DC off", | ||
2211 | .domains = GLK_DISPLAY_DC_OFF_POWER_DOMAINS, | ||
2212 | .ops = &gen9_dc_off_power_well_ops, | ||
2213 | .id = SKL_DISP_PW_DC_OFF, | ||
2214 | }, | ||
2215 | { | ||
2216 | .name = "power well 2", | ||
2217 | .domains = GLK_DISPLAY_POWERWELL_2_POWER_DOMAINS, | ||
2218 | .ops = &skl_power_well_ops, | ||
2219 | .id = SKL_DISP_PW_2, | ||
2220 | }, | ||
2221 | { | ||
2222 | .name = "AUX A", | ||
2223 | .domains = GLK_DISPLAY_AUX_A_POWER_DOMAINS, | ||
2224 | .ops = &skl_power_well_ops, | ||
2225 | .id = GLK_DISP_PW_AUX_A, | ||
2226 | }, | ||
2227 | { | ||
2228 | .name = "AUX B", | ||
2229 | .domains = GLK_DISPLAY_AUX_B_POWER_DOMAINS, | ||
2230 | .ops = &skl_power_well_ops, | ||
2231 | .id = GLK_DISP_PW_AUX_B, | ||
2232 | }, | ||
2233 | { | ||
2234 | .name = "AUX C", | ||
2235 | .domains = GLK_DISPLAY_AUX_C_POWER_DOMAINS, | ||
2236 | .ops = &skl_power_well_ops, | ||
2237 | .id = GLK_DISP_PW_AUX_C, | ||
2238 | }, | ||
2239 | { | ||
2240 | .name = "DDI A power well", | ||
2241 | .domains = GLK_DISPLAY_DDI_A_POWER_DOMAINS, | ||
2242 | .ops = &skl_power_well_ops, | ||
2243 | .id = GLK_DISP_PW_DDI_A, | ||
2244 | }, | ||
2245 | { | ||
2246 | .name = "DDI B power well", | ||
2247 | .domains = GLK_DISPLAY_DDI_B_POWER_DOMAINS, | ||
2248 | .ops = &skl_power_well_ops, | ||
2249 | .id = SKL_DISP_PW_DDI_B, | ||
2250 | }, | ||
2251 | { | ||
2252 | .name = "DDI C power well", | ||
2253 | .domains = GLK_DISPLAY_DDI_C_POWER_DOMAINS, | ||
2254 | .ops = &skl_power_well_ops, | ||
2255 | .id = SKL_DISP_PW_DDI_C, | ||
2256 | }, | ||
2257 | }; | ||
2258 | |||
2153 | static int | 2259 | static int |
2154 | sanitize_disable_power_well_option(const struct drm_i915_private *dev_priv, | 2260 | sanitize_disable_power_well_option(const struct drm_i915_private *dev_priv, |
2155 | int disable_power_well) | 2261 | int disable_power_well) |
@@ -2246,6 +2352,8 @@ int intel_power_domains_init(struct drm_i915_private *dev_priv) | |||
2246 | set_power_wells(power_domains, skl_power_wells); | 2352 | set_power_wells(power_domains, skl_power_wells); |
2247 | } else if (IS_BROXTON(dev_priv)) { | 2353 | } else if (IS_BROXTON(dev_priv)) { |
2248 | set_power_wells(power_domains, bxt_power_wells); | 2354 | set_power_wells(power_domains, bxt_power_wells); |
2355 | } else if (IS_GEMINILAKE(dev_priv)) { | ||
2356 | set_power_wells(power_domains, glk_power_wells); | ||
2249 | } else if (IS_CHERRYVIEW(dev_priv)) { | 2357 | } else if (IS_CHERRYVIEW(dev_priv)) { |
2250 | set_power_wells(power_domains, chv_power_wells); | 2358 | set_power_wells(power_domains, chv_power_wells); |
2251 | } else if (IS_VALLEYVIEW(dev_priv)) { | 2359 | } else if (IS_VALLEYVIEW(dev_priv)) { |