aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_display.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2014-08-04 03:57:34 -0400
committerDave Airlie <airlied@redhat.com>2014-08-04 03:57:34 -0400
commitc759606c96dc052373d4c36ea383595da46b04e9 (patch)
tree583a4234d43c57e03b85315353adf304970645fc /drivers/gpu/drm/i915/intel_display.c
parent2ee39452fa2fff1e8edb954ccb7e0daee9646557 (diff)
parent4dac3edfe68e5e1b3c2216b84ba160572420fa40 (diff)
Merge tag 'drm-intel-next-2014-07-25-merged' of git://anongit.freedesktop.org/drm-intel into drm-next
Final feature pull for 3.17. drm-intel-next-2014-07-25: - Ditch UMS support (well just the config option for now) - Prep work for future platforms (Sonika Jindal, Damien) - runtime pm/soix fixes (Paulo, Jesse) - psr tracking improvements, locking fixes, now enabled by default! - rps fixes for chv (Deepak, Ville) - drm core patches for rotation support (Ville, Sagar Kamble) - the i915 parts unfortunately didn't make it yet - userptr fixes (Chris) - minimum backlight brightness (Jani), acked long ago by Matthew Garret on irc - I've forgotten about this patch :( QA is a bit unhappy about the DP MST stuff since it broke hpd testing a bit, but otherwise looks sane. I've backmerged drm-next to resolve conflicts with the mst stuff, which means the new tag itself doesn't contain the overview as usual. * tag 'drm-intel-next-2014-07-25-merged' of git://anongit.freedesktop.org/drm-intel: (75 commits) drm/i915/userptr: Keep spin_lock/unlock in the same block drm/i915: Allow overlapping userptr objects drm/i915: Ditch UMS config option drm/i915: respect the VBT minimum backlight brightness drm/i915: extract backlight minimum brightness from VBT drm/i915: Replace HAS_PCH_SPLIT which incorrectly lets some platforms in drm/i915: Returning from increase/decrease of pllclock when invalid drm/i915: Setting legacy palette correctly for different platforms drm/i915: Avoid incorrect returning for some platforms drm/i915: Writing proper check for reading of pipe status reg drm/i915: Returning the right VGA control reg for platforms drm/i915: Allowing changing of wm latencies for valid platforms drm/i915: Adding HAS_GMCH_DISPLAY macro drm/i915: Fix possible overflow when recording semaphore states. drm/i915: Do not unmap object unless no other VMAs reference it drm/i915: remove plane/cursor/pipe assertions from intel_crtc_disable drm/i915: Reorder ctx unref on ppgtt cleanup drm/i915/error: Check the potential ctx obj's vm drm/i915: Fix printing proper min/min/rpe values in debugfs drm/i915: BDW can also detect unclaimed registers ...
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c78
1 files changed, 39 insertions, 39 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 7b542b477a4e..0f861301a94e 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -3855,7 +3855,7 @@ static void intel_crtc_load_lut(struct drm_crtc *crtc)
3855 } 3855 }
3856 3856
3857 /* use legacy palette for Ironlake */ 3857 /* use legacy palette for Ironlake */
3858 if (HAS_PCH_SPLIT(dev)) 3858 if (!HAS_GMCH_DISPLAY(dev))
3859 palreg = LGC_PALETTE(pipe); 3859 palreg = LGC_PALETTE(pipe);
3860 3860
3861 /* Workaround : Do not read or write the pipe palette/gamma data while 3861 /* Workaround : Do not read or write the pipe palette/gamma data while
@@ -4894,35 +4894,21 @@ static void intel_crtc_update_sarea(struct drm_crtc *crtc,
4894 } 4894 }
4895} 4895}
4896 4896
4897/** 4897/* Master function to enable/disable CRTC and corresponding power wells */
4898 * Sets the power management mode of the pipe and plane. 4898void intel_crtc_control(struct drm_crtc *crtc, bool enable)
4899 */
4900void intel_crtc_update_dpms(struct drm_crtc *crtc)
4901{ 4899{
4902 struct drm_device *dev = crtc->dev; 4900 struct drm_device *dev = crtc->dev;
4903 struct drm_i915_private *dev_priv = dev->dev_private; 4901 struct drm_i915_private *dev_priv = dev->dev_private;
4904 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 4902 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
4905 struct intel_encoder *intel_encoder;
4906 enum intel_display_power_domain domain; 4903 enum intel_display_power_domain domain;
4907 unsigned long domains; 4904 unsigned long domains;
4908 bool enable = false;
4909
4910 for_each_encoder_on_crtc(dev, crtc, intel_encoder)
4911 enable |= intel_encoder->connectors_active;
4912 4905
4913 if (enable) { 4906 if (enable) {
4914 if (!intel_crtc->active) { 4907 if (!intel_crtc->active) {
4915 /* 4908 domains = get_crtc_power_domains(crtc);
4916 * FIXME: DDI plls and relevant code isn't converted 4909 for_each_power_domain(domain, domains)
4917 * yet, so do runtime PM for DPMS only for all other 4910 intel_display_power_get(dev_priv, domain);
4918 * platforms for now. 4911 intel_crtc->enabled_power_domains = domains;
4919 */
4920 if (!HAS_DDI(dev)) {
4921 domains = get_crtc_power_domains(crtc);
4922 for_each_power_domain(domain, domains)
4923 intel_display_power_get(dev_priv, domain);
4924 intel_crtc->enabled_power_domains = domains;
4925 }
4926 4912
4927 dev_priv->display.crtc_enable(crtc); 4913 dev_priv->display.crtc_enable(crtc);
4928 } 4914 }
@@ -4930,14 +4916,27 @@ void intel_crtc_update_dpms(struct drm_crtc *crtc)
4930 if (intel_crtc->active) { 4916 if (intel_crtc->active) {
4931 dev_priv->display.crtc_disable(crtc); 4917 dev_priv->display.crtc_disable(crtc);
4932 4918
4933 if (!HAS_DDI(dev)) { 4919 domains = intel_crtc->enabled_power_domains;
4934 domains = intel_crtc->enabled_power_domains; 4920 for_each_power_domain(domain, domains)
4935 for_each_power_domain(domain, domains) 4921 intel_display_power_put(dev_priv, domain);
4936 intel_display_power_put(dev_priv, domain); 4922 intel_crtc->enabled_power_domains = 0;
4937 intel_crtc->enabled_power_domains = 0;
4938 }
4939 } 4923 }
4940 } 4924 }
4925}
4926
4927/**
4928 * Sets the power management mode of the pipe and plane.
4929 */
4930void intel_crtc_update_dpms(struct drm_crtc *crtc)
4931{
4932 struct drm_device *dev = crtc->dev;
4933 struct intel_encoder *intel_encoder;
4934 bool enable = false;
4935
4936 for_each_encoder_on_crtc(dev, crtc, intel_encoder)
4937 enable |= intel_encoder->connectors_active;
4938
4939 intel_crtc_control(crtc, enable);
4941 4940
4942 intel_crtc_update_sarea(crtc, enable); 4941 intel_crtc_update_sarea(crtc, enable);
4943} 4942}
@@ -4957,10 +4956,6 @@ static void intel_crtc_disable(struct drm_crtc *crtc)
4957 intel_crtc_update_sarea(crtc, false); 4956 intel_crtc_update_sarea(crtc, false);
4958 dev_priv->display.off(crtc); 4957 dev_priv->display.off(crtc);
4959 4958
4960 assert_plane_disabled(dev->dev_private, to_intel_crtc(crtc)->plane);
4961 assert_cursor_disabled(dev_priv, pipe);
4962 assert_pipe_disabled(dev->dev_private, pipe);
4963
4964 if (crtc->primary->fb) { 4959 if (crtc->primary->fb) {
4965 mutex_lock(&dev->struct_mutex); 4960 mutex_lock(&dev->struct_mutex);
4966 intel_unpin_fb_obj(old_obj); 4961 intel_unpin_fb_obj(old_obj);
@@ -7360,8 +7355,9 @@ static void assert_can_disable_lcpll(struct drm_i915_private *dev_priv)
7360 WARN(I915_READ(PCH_PP_STATUS) & PP_ON, "Panel power on\n"); 7355 WARN(I915_READ(PCH_PP_STATUS) & PP_ON, "Panel power on\n");
7361 WARN(I915_READ(BLC_PWM_CPU_CTL2) & BLM_PWM_ENABLE, 7356 WARN(I915_READ(BLC_PWM_CPU_CTL2) & BLM_PWM_ENABLE,
7362 "CPU PWM1 enabled\n"); 7357 "CPU PWM1 enabled\n");
7363 WARN(I915_READ(HSW_BLC_PWM2_CTL) & BLM_PWM_ENABLE, 7358 if (IS_HASWELL(dev))
7364 "CPU PWM2 enabled\n"); 7359 WARN(I915_READ(HSW_BLC_PWM2_CTL) & BLM_PWM_ENABLE,
7360 "CPU PWM2 enabled\n");
7365 WARN(I915_READ(BLC_PWM_PCH_CTL1) & BLM_PCH_PWM_ENABLE, 7361 WARN(I915_READ(BLC_PWM_PCH_CTL1) & BLM_PCH_PWM_ENABLE,
7366 "PCH PWM1 enabled\n"); 7362 "PCH PWM1 enabled\n");
7367 WARN(I915_READ(UTIL_PIN_CTL) & UTIL_PIN_ENABLE, 7363 WARN(I915_READ(UTIL_PIN_CTL) & UTIL_PIN_ENABLE,
@@ -7374,7 +7370,7 @@ static void assert_can_disable_lcpll(struct drm_i915_private *dev_priv)
7374 * gen-specific and since we only disable LCPLL after we fully disable 7370 * gen-specific and since we only disable LCPLL after we fully disable
7375 * the interrupts, the check below should be enough. 7371 * the interrupts, the check below should be enough.
7376 */ 7372 */
7377 WARN(!dev_priv->pm.irqs_disabled, "IRQs enabled\n"); 7373 WARN(intel_irqs_enabled(dev_priv), "IRQs enabled\n");
7378} 7374}
7379 7375
7380static uint32_t hsw_read_dcomp(struct drm_i915_private *dev_priv) 7376static uint32_t hsw_read_dcomp(struct drm_i915_private *dev_priv)
@@ -8817,7 +8813,7 @@ static void intel_increase_pllclock(struct drm_device *dev,
8817 int dpll_reg = DPLL(pipe); 8813 int dpll_reg = DPLL(pipe);
8818 int dpll; 8814 int dpll;
8819 8815
8820 if (HAS_PCH_SPLIT(dev)) 8816 if (!HAS_GMCH_DISPLAY(dev))
8821 return; 8817 return;
8822 8818
8823 if (!dev_priv->lvds_downclock_avail) 8819 if (!dev_priv->lvds_downclock_avail)
@@ -8845,7 +8841,7 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc)
8845 struct drm_i915_private *dev_priv = dev->dev_private; 8841 struct drm_i915_private *dev_priv = dev->dev_private;
8846 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 8842 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
8847 8843
8848 if (HAS_PCH_SPLIT(dev)) 8844 if (!HAS_GMCH_DISPLAY(dev))
8849 return; 8845 return;
8850 8846
8851 if (!dev_priv->lvds_downclock_avail) 8847 if (!dev_priv->lvds_downclock_avail)
@@ -8976,7 +8972,7 @@ void intel_fb_obj_invalidate(struct drm_i915_gem_object *obj,
8976 8972
8977 intel_mark_fb_busy(dev, obj->frontbuffer_bits, ring); 8973 intel_mark_fb_busy(dev, obj->frontbuffer_bits, ring);
8978 8974
8979 intel_edp_psr_exit(dev); 8975 intel_edp_psr_invalidate(dev, obj->frontbuffer_bits);
8980} 8976}
8981 8977
8982/** 8978/**
@@ -9002,7 +8998,7 @@ void intel_frontbuffer_flush(struct drm_device *dev,
9002 8998
9003 intel_mark_fb_busy(dev, frontbuffer_bits, NULL); 8999 intel_mark_fb_busy(dev, frontbuffer_bits, NULL);
9004 9000
9005 intel_edp_psr_exit(dev); 9001 intel_edp_psr_flush(dev, frontbuffer_bits);
9006} 9002}
9007 9003
9008/** 9004/**
@@ -12825,6 +12821,8 @@ static void intel_sanitize_encoder(struct intel_encoder *encoder)
12825 encoder->base.base.id, 12821 encoder->base.base.id,
12826 encoder->base.name); 12822 encoder->base.name);
12827 encoder->disable(encoder); 12823 encoder->disable(encoder);
12824 if (encoder->post_disable)
12825 encoder->post_disable(encoder);
12828 } 12826 }
12829 encoder->base.crtc = NULL; 12827 encoder->base.crtc = NULL;
12830 encoder->connectors_active = false; 12828 encoder->connectors_active = false;
@@ -13093,6 +13091,8 @@ void intel_modeset_cleanup(struct drm_device *dev)
13093 */ 13091 */
13094 drm_irq_uninstall(dev); 13092 drm_irq_uninstall(dev);
13095 cancel_work_sync(&dev_priv->hotplug_work); 13093 cancel_work_sync(&dev_priv->hotplug_work);
13094 dev_priv->pm._irqs_disabled = true;
13095
13096 /* 13096 /*
13097 * Due to the hpd irq storm handling the hotplug work can re-arm the 13097 * Due to the hpd irq storm handling the hotplug work can re-arm the
13098 * poll handlers. Hence disable polling after hpd handling is shut down. 13098 * poll handlers. Hence disable polling after hpd handling is shut down.
@@ -13270,7 +13270,7 @@ intel_display_capture_error_state(struct drm_device *dev)
13270 13270
13271 error->pipe[i].source = I915_READ(PIPESRC(i)); 13271 error->pipe[i].source = I915_READ(PIPESRC(i));
13272 13272
13273 if (!HAS_PCH_SPLIT(dev)) 13273 if (HAS_GMCH_DISPLAY(dev))
13274 error->pipe[i].stat = I915_READ(PIPESTAT(i)); 13274 error->pipe[i].stat = I915_READ(PIPESTAT(i));
13275 } 13275 }
13276 13276