diff options
author | Dave Airlie <airlied@redhat.com> | 2014-08-04 03:57:34 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2014-08-04 03:57:34 -0400 |
commit | c759606c96dc052373d4c36ea383595da46b04e9 (patch) | |
tree | 583a4234d43c57e03b85315353adf304970645fc /drivers/gpu/drm/i915/intel_display.c | |
parent | 2ee39452fa2fff1e8edb954ccb7e0daee9646557 (diff) | |
parent | 4dac3edfe68e5e1b3c2216b84ba160572420fa40 (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.c | 78 |
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. | 4898 | void intel_crtc_control(struct drm_crtc *crtc, bool enable) |
4899 | */ | ||
4900 | void 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 | */ | ||
4930 | void 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 | ||
7380 | static uint32_t hsw_read_dcomp(struct drm_i915_private *dev_priv) | 7376 | static 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 | ||