aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2014-12-04 20:11:57 -0500
committerDave Airlie <airlied@redhat.com>2014-12-04 20:11:57 -0500
commit7608867d0c4d9da30e9efe6a53ff4ee1e6c4990b (patch)
tree9b33bf7fa0539a883fca14d5105ef6407646c382
parent047b35f27bcbca485f06a60340de8d552be2b4e5 (diff)
parent00f0b3781028605910cb4662a0f8a4849b445fc2 (diff)
Merge tag 'drm-intel-next-fixes-2014-12-04' of git://anongit.freedesktop.org/drm-intel into drm-next
Fixes for 3.20. I did stick the gen3/4 reset work from Ville in because we have an awful lot of gen4 mesa hangs, and with this reset should also work on vintage i965g/gm (we already have reset for g4x/gen4.5). So should help to appease users suffering from these hangs. Otherwise all over. This is the last 3.20 pull from me, from here on Jani will take over. By Ville Syrjälä (8) and others * tag 'drm-intel-next-fixes-2014-12-04' of git://anongit.freedesktop.org/drm-intel: drm/i915: Reject modeset when the same digital port is used more than once drm/i915: mask RPS IRQs properly when disabling RPS drm/i915: Tune down spurious CRC interrupt warning drm/i915: Fix context object leak for legacy contexts drm/i915/skl: Update in Gen9 multi-engine forcewake range drm/i915/eDP: When enabling panel VDD cancel pending disable worker drm/i915: Handle runtime pm in the CRC setup code drm/i915: Disable crtcs gracefully before GPU reset on gen3/4 drm/i915: Grab modeset locks for GPU rest on pre-ctg drm/i915: Implement GPU reset for g33 drm/i915: Implement GPU reset for 915/945 drm/i915: Restore the display config after a GPU reset on gen4 drm/i915: Fix gen4 GPU reset drm/i915: Stop gathering error states for CS error interrupts drm/i915: Disallow pin ioctl completely for kms drivers drm/i915: Only warn the first time we attempt to mmio whilst suspended drm/i915/chv: Enable AVI, SPD and HDMI infoframes for CHV. drm/i915: Don't clobber crtc->new_config when nothing changes
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c5
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c15
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c59
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h3
-rw-r--r--drivers/gpu/drm/i915/intel_display.c151
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c1
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h3
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c7
-rw-r--r--drivers/gpu/drm/i915/intel_uncore.c79
9 files changed, 230 insertions, 93 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index d4a0dddbfefb..779a275eb1fd 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -3338,6 +3338,11 @@ static int pipe_crc_set_source(struct drm_device *dev, enum pipe pipe,
3338 if (pipe_crc->source && source) 3338 if (pipe_crc->source && source)
3339 return -EINVAL; 3339 return -EINVAL;
3340 3340
3341 if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PIPE(pipe))) {
3342 DRM_DEBUG_KMS("Trying to capture CRC while pipe is off\n");
3343 return -EIO;
3344 }
3345
3341 if (IS_GEN2(dev)) 3346 if (IS_GEN2(dev))
3342 ret = i8xx_pipe_crc_ctl_reg(&source, &val); 3347 ret = i8xx_pipe_crc_ctl_reg(&source, &val);
3343 else if (INTEL_INFO(dev)->gen < 5) 3348 else if (INTEL_INFO(dev)->gen < 5)
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index fd17ccabd8a4..d2ba315f4c92 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2574,11 +2574,13 @@ static void i915_gem_free_request(struct drm_i915_gem_request *request)
2574 list_del(&request->list); 2574 list_del(&request->list);
2575 i915_gem_request_remove_from_client(request); 2575 i915_gem_request_remove_from_client(request);
2576 2576
2577 if (i915.enable_execlists && ctx) { 2577 if (ctx) {
2578 struct intel_engine_cs *ring = request->ring; 2578 if (i915.enable_execlists) {
2579 struct intel_engine_cs *ring = request->ring;
2579 2580
2580 if (ctx != ring->default_context) 2581 if (ctx != ring->default_context)
2581 intel_lr_context_unpin(ring, ctx); 2582 intel_lr_context_unpin(ring, ctx);
2583 }
2582 i915_gem_context_unreference(ctx); 2584 i915_gem_context_unreference(ctx);
2583 } 2585 }
2584 kfree(request); 2586 kfree(request);
@@ -4263,7 +4265,7 @@ i915_gem_pin_ioctl(struct drm_device *dev, void *data,
4263 struct drm_i915_gem_object *obj; 4265 struct drm_i915_gem_object *obj;
4264 int ret; 4266 int ret;
4265 4267
4266 if (INTEL_INFO(dev)->gen >= 6) 4268 if (drm_core_check_feature(dev, DRIVER_MODESET))
4267 return -ENODEV; 4269 return -ENODEV;
4268 4270
4269 ret = i915_mutex_lock_interruptible(dev); 4271 ret = i915_mutex_lock_interruptible(dev);
@@ -4319,6 +4321,9 @@ i915_gem_unpin_ioctl(struct drm_device *dev, void *data,
4319 struct drm_i915_gem_object *obj; 4321 struct drm_i915_gem_object *obj;
4320 int ret; 4322 int ret;
4321 4323
4324 if (drm_core_check_feature(dev, DRIVER_MODESET))
4325 return -ENODEV;
4326
4322 ret = i915_mutex_lock_interruptible(dev); 4327 ret = i915_mutex_lock_interruptible(dev);
4323 if (ret) 4328 if (ret)
4324 return ret; 4329 return ret;
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 5908580d7c15..981834b0f9b6 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -231,9 +231,6 @@ static void snb_update_pm_irq(struct drm_i915_private *dev_priv,
231 231
232 assert_spin_locked(&dev_priv->irq_lock); 232 assert_spin_locked(&dev_priv->irq_lock);
233 233
234 if (WARN_ON(!intel_irqs_enabled(dev_priv)))
235 return;
236
237 new_val = dev_priv->pm_irq_mask; 234 new_val = dev_priv->pm_irq_mask;
238 new_val &= ~interrupt_mask; 235 new_val &= ~interrupt_mask;
239 new_val |= (~enabled_irq_mask & interrupt_mask); 236 new_val |= (~enabled_irq_mask & interrupt_mask);
@@ -247,14 +244,26 @@ static void snb_update_pm_irq(struct drm_i915_private *dev_priv,
247 244
248void gen6_enable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask) 245void gen6_enable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask)
249{ 246{
247 if (WARN_ON(!intel_irqs_enabled(dev_priv)))
248 return;
249
250 snb_update_pm_irq(dev_priv, mask, mask); 250 snb_update_pm_irq(dev_priv, mask, mask);
251} 251}
252 252
253void gen6_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask) 253static void __gen6_disable_pm_irq(struct drm_i915_private *dev_priv,
254 uint32_t mask)
254{ 255{
255 snb_update_pm_irq(dev_priv, mask, 0); 256 snb_update_pm_irq(dev_priv, mask, 0);
256} 257}
257 258
259void gen6_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask)
260{
261 if (WARN_ON(!intel_irqs_enabled(dev_priv)))
262 return;
263
264 __gen6_disable_pm_irq(dev_priv, mask);
265}
266
258void gen6_reset_rps_interrupts(struct drm_device *dev) 267void gen6_reset_rps_interrupts(struct drm_device *dev)
259{ 268{
260 struct drm_i915_private *dev_priv = dev->dev_private; 269 struct drm_i915_private *dev_priv = dev->dev_private;
@@ -289,16 +298,20 @@ void gen6_disable_rps_interrupts(struct drm_device *dev)
289 298
290 cancel_work_sync(&dev_priv->rps.work); 299 cancel_work_sync(&dev_priv->rps.work);
291 300
301 spin_lock_irq(&dev_priv->irq_lock);
302
292 I915_WRITE(GEN6_PMINTRMSK, INTEL_INFO(dev_priv)->gen >= 8 ? 303 I915_WRITE(GEN6_PMINTRMSK, INTEL_INFO(dev_priv)->gen >= 8 ?
293 ~GEN8_PMINTR_REDIRECT_TO_NON_DISP : ~0); 304 ~GEN8_PMINTR_REDIRECT_TO_NON_DISP : ~0);
305
306 __gen6_disable_pm_irq(dev_priv, dev_priv->pm_rps_events);
294 I915_WRITE(gen6_pm_ier(dev_priv), I915_READ(gen6_pm_ier(dev_priv)) & 307 I915_WRITE(gen6_pm_ier(dev_priv), I915_READ(gen6_pm_ier(dev_priv)) &
295 ~dev_priv->pm_rps_events); 308 ~dev_priv->pm_rps_events);
309 I915_WRITE(gen6_pm_iir(dev_priv), dev_priv->pm_rps_events);
310 I915_WRITE(gen6_pm_iir(dev_priv), dev_priv->pm_rps_events);
296 311
297 spin_lock_irq(&dev_priv->irq_lock);
298 dev_priv->rps.pm_iir = 0; 312 dev_priv->rps.pm_iir = 0;
299 spin_unlock_irq(&dev_priv->irq_lock);
300 313
301 I915_WRITE(gen6_pm_iir(dev_priv), dev_priv->pm_rps_events); 314 spin_unlock_irq(&dev_priv->irq_lock);
302} 315}
303 316
304/** 317/**
@@ -1339,10 +1352,8 @@ static void snb_gt_irq_handler(struct drm_device *dev,
1339 1352
1340 if (gt_iir & (GT_BLT_CS_ERROR_INTERRUPT | 1353 if (gt_iir & (GT_BLT_CS_ERROR_INTERRUPT |
1341 GT_BSD_CS_ERROR_INTERRUPT | 1354 GT_BSD_CS_ERROR_INTERRUPT |
1342 GT_RENDER_CS_MASTER_ERROR_INTERRUPT)) { 1355 GT_RENDER_CS_MASTER_ERROR_INTERRUPT))
1343 i915_handle_error(dev, false, "GT error interrupt 0x%08x", 1356 DRM_DEBUG("Command parser error, gt_iir 0x%08x\n", gt_iir);
1344 gt_iir);
1345 }
1346 1357
1347 if (gt_iir & GT_PARITY_ERROR(dev)) 1358 if (gt_iir & GT_PARITY_ERROR(dev))
1348 ivybridge_parity_error_irq_handler(dev, gt_iir); 1359 ivybridge_parity_error_irq_handler(dev, gt_iir);
@@ -1623,7 +1634,7 @@ static void display_pipe_crc_irq_handler(struct drm_device *dev, enum pipe pipe,
1623 1634
1624 if (!pipe_crc->entries) { 1635 if (!pipe_crc->entries) {
1625 spin_unlock(&pipe_crc->lock); 1636 spin_unlock(&pipe_crc->lock);
1626 DRM_ERROR("spurious interrupt\n"); 1637 DRM_DEBUG_KMS("spurious interrupt\n");
1627 return; 1638 return;
1628 } 1639 }
1629 1640
@@ -1731,11 +1742,8 @@ static void gen6_rps_irq_handler(struct drm_i915_private *dev_priv, u32 pm_iir)
1731 if (pm_iir & PM_VEBOX_USER_INTERRUPT) 1742 if (pm_iir & PM_VEBOX_USER_INTERRUPT)
1732 notify_ring(dev_priv->dev, &dev_priv->ring[VECS]); 1743 notify_ring(dev_priv->dev, &dev_priv->ring[VECS]);
1733 1744
1734 if (pm_iir & PM_VEBOX_CS_ERROR_INTERRUPT) { 1745 if (pm_iir & PM_VEBOX_CS_ERROR_INTERRUPT)
1735 i915_handle_error(dev_priv->dev, false, 1746 DRM_DEBUG("Command parser error, pm_iir 0x%08x\n", pm_iir);
1736 "VEBOX CS error interrupt 0x%08x",
1737 pm_iir);
1738 }
1739 } 1747 }
1740} 1748}
1741 1749
@@ -2428,6 +2436,9 @@ static void i915_error_work_func(struct work_struct *work)
2428 * simulated reset via debugs, so get an RPM reference. 2436 * simulated reset via debugs, so get an RPM reference.
2429 */ 2437 */
2430 intel_runtime_pm_get(dev_priv); 2438 intel_runtime_pm_get(dev_priv);
2439
2440 intel_prepare_reset(dev);
2441
2431 /* 2442 /*
2432 * All state reset _must_ be completed before we update the 2443 * All state reset _must_ be completed before we update the
2433 * reset counter, for otherwise waiters might miss the reset 2444 * reset counter, for otherwise waiters might miss the reset
@@ -2436,7 +2447,7 @@ static void i915_error_work_func(struct work_struct *work)
2436 */ 2447 */
2437 ret = i915_reset(dev); 2448 ret = i915_reset(dev);
2438 2449
2439 intel_display_handle_reset(dev); 2450 intel_finish_reset(dev);
2440 2451
2441 intel_runtime_pm_put(dev_priv); 2452 intel_runtime_pm_put(dev_priv);
2442 2453
@@ -3746,9 +3757,7 @@ static irqreturn_t i8xx_irq_handler(int irq, void *arg)
3746 */ 3757 */
3747 spin_lock(&dev_priv->irq_lock); 3758 spin_lock(&dev_priv->irq_lock);
3748 if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) 3759 if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT)
3749 i915_handle_error(dev, false, 3760 DRM_DEBUG("Command parser error, iir 0x%08x\n", iir);
3750 "Command parser error, iir 0x%08x",
3751 iir);
3752 3761
3753 for_each_pipe(dev_priv, pipe) { 3762 for_each_pipe(dev_priv, pipe) {
3754 int reg = PIPESTAT(pipe); 3763 int reg = PIPESTAT(pipe);
@@ -3929,9 +3938,7 @@ static irqreturn_t i915_irq_handler(int irq, void *arg)
3929 */ 3938 */
3930 spin_lock(&dev_priv->irq_lock); 3939 spin_lock(&dev_priv->irq_lock);
3931 if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) 3940 if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT)
3932 i915_handle_error(dev, false, 3941 DRM_DEBUG("Command parser error, iir 0x%08x\n", iir);
3933 "Command parser error, iir 0x%08x",
3934 iir);
3935 3942
3936 for_each_pipe(dev_priv, pipe) { 3943 for_each_pipe(dev_priv, pipe) {
3937 int reg = PIPESTAT(pipe); 3944 int reg = PIPESTAT(pipe);
@@ -4154,9 +4161,7 @@ static irqreturn_t i965_irq_handler(int irq, void *arg)
4154 */ 4161 */
4155 spin_lock(&dev_priv->irq_lock); 4162 spin_lock(&dev_priv->irq_lock);
4156 if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) 4163 if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT)
4157 i915_handle_error(dev, false, 4164 DRM_DEBUG("Command parser error, iir 0x%08x\n", iir);
4158 "Command parser error, iir 0x%08x",
4159 iir);
4160 4165
4161 for_each_pipe(dev_priv, pipe) { 4166 for_each_pipe(dev_priv, pipe) {
4162 int reg = PIPESTAT(pipe); 4167 int reg = PIPESTAT(pipe);
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 3102907a96a7..544675895c8d 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -78,11 +78,12 @@
78 78
79 79
80/* Graphics reset regs */ 80/* Graphics reset regs */
81#define I965_GDRST 0xc0 /* PCI config register */ 81#define I915_GDRST 0xc0 /* PCI config register */
82#define GRDOM_FULL (0<<2) 82#define GRDOM_FULL (0<<2)
83#define GRDOM_RENDER (1<<2) 83#define GRDOM_RENDER (1<<2)
84#define GRDOM_MEDIA (3<<2) 84#define GRDOM_MEDIA (3<<2)
85#define GRDOM_MASK (3<<2) 85#define GRDOM_MASK (3<<2)
86#define GRDOM_RESET_STATUS (1<<1)
86#define GRDOM_RESET_ENABLE (1<<0) 87#define GRDOM_RESET_ENABLE (1<<0)
87 88
88#define ILK_GDSR 0x2ca4 /* MCHBAR offset */ 89#define ILK_GDSR 0x2ca4 /* MCHBAR offset */
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 853697fc4d4b..6289babd03b0 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2765,25 +2765,10 @@ intel_pipe_set_base_atomic(struct drm_crtc *crtc, struct drm_framebuffer *fb,
2765 return 0; 2765 return 0;
2766} 2766}
2767 2767
2768void intel_display_handle_reset(struct drm_device *dev) 2768static void intel_complete_page_flips(struct drm_device *dev)
2769{ 2769{
2770 struct drm_i915_private *dev_priv = dev->dev_private;
2771 struct drm_crtc *crtc; 2770 struct drm_crtc *crtc;
2772 2771
2773 /*
2774 * Flips in the rings have been nuked by the reset,
2775 * so complete all pending flips so that user space
2776 * will get its events and not get stuck.
2777 *
2778 * Also update the base address of all primary
2779 * planes to the the last fb to make sure we're
2780 * showing the correct fb after a reset.
2781 *
2782 * Need to make two loops over the crtcs so that we
2783 * don't try to grab a crtc mutex before the
2784 * pending_flip_queue really got woken up.
2785 */
2786
2787 for_each_crtc(dev, crtc) { 2772 for_each_crtc(dev, crtc) {
2788 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 2773 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2789 enum plane plane = intel_crtc->plane; 2774 enum plane plane = intel_crtc->plane;
@@ -2791,6 +2776,12 @@ void intel_display_handle_reset(struct drm_device *dev)
2791 intel_prepare_page_flip(dev, plane); 2776 intel_prepare_page_flip(dev, plane);
2792 intel_finish_page_flip_plane(dev, plane); 2777 intel_finish_page_flip_plane(dev, plane);
2793 } 2778 }
2779}
2780
2781static void intel_update_primary_planes(struct drm_device *dev)
2782{
2783 struct drm_i915_private *dev_priv = dev->dev_private;
2784 struct drm_crtc *crtc;
2794 2785
2795 for_each_crtc(dev, crtc) { 2786 for_each_crtc(dev, crtc) {
2796 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 2787 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
@@ -2810,6 +2801,79 @@ void intel_display_handle_reset(struct drm_device *dev)
2810 } 2801 }
2811} 2802}
2812 2803
2804void intel_prepare_reset(struct drm_device *dev)
2805{
2806 struct drm_i915_private *dev_priv = to_i915(dev);
2807 struct intel_crtc *crtc;
2808
2809 /* no reset support for gen2 */
2810 if (IS_GEN2(dev))
2811 return;
2812
2813 /* reset doesn't touch the display */
2814 if (INTEL_INFO(dev)->gen >= 5 || IS_G4X(dev))
2815 return;
2816
2817 drm_modeset_lock_all(dev);
2818
2819 /*
2820 * Disabling the crtcs gracefully seems nicer. Also the
2821 * g33 docs say we should at least disable all the planes.
2822 */
2823 for_each_intel_crtc(dev, crtc) {
2824 if (crtc->active)
2825 dev_priv->display.crtc_disable(&crtc->base);
2826 }
2827}
2828
2829void intel_finish_reset(struct drm_device *dev)
2830{
2831 struct drm_i915_private *dev_priv = to_i915(dev);
2832
2833 /*
2834 * Flips in the rings will be nuked by the reset,
2835 * so complete all pending flips so that user space
2836 * will get its events and not get stuck.
2837 */
2838 intel_complete_page_flips(dev);
2839
2840 /* no reset support for gen2 */
2841 if (IS_GEN2(dev))
2842 return;
2843
2844 /* reset doesn't touch the display */
2845 if (INTEL_INFO(dev)->gen >= 5 || IS_G4X(dev)) {
2846 /*
2847 * Flips in the rings have been nuked by the reset,
2848 * so update the base address of all primary
2849 * planes to the the last fb to make sure we're
2850 * showing the correct fb after a reset.
2851 */
2852 intel_update_primary_planes(dev);
2853 return;
2854 }
2855
2856 /*
2857 * The display has been reset as well,
2858 * so need a full re-initialization.
2859 */
2860 intel_runtime_pm_disable_interrupts(dev_priv);
2861 intel_runtime_pm_enable_interrupts(dev_priv);
2862
2863 intel_modeset_init_hw(dev);
2864
2865 spin_lock_irq(&dev_priv->irq_lock);
2866 if (dev_priv->display.hpd_irq_setup)
2867 dev_priv->display.hpd_irq_setup(dev);
2868 spin_unlock_irq(&dev_priv->irq_lock);
2869
2870 intel_modeset_setup_hw_state(dev, true);
2871
2872 intel_hpd_init(dev_priv);
2873
2874 drm_modeset_unlock_all(dev);
2875}
2876
2813static int 2877static int
2814intel_finish_fb(struct drm_framebuffer *old_fb) 2878intel_finish_fb(struct drm_framebuffer *old_fb)
2815{ 2879{
@@ -10089,6 +10153,48 @@ static bool check_encoder_cloning(struct intel_crtc *crtc)
10089 return true; 10153 return true;
10090} 10154}
10091 10155
10156static bool check_digital_port_conflicts(struct drm_device *dev)
10157{
10158 struct intel_connector *connector;
10159 unsigned int used_ports = 0;
10160
10161 /*
10162 * Walk the connector list instead of the encoder
10163 * list to detect the problem on ddi platforms
10164 * where there's just one encoder per digital port.
10165 */
10166 list_for_each_entry(connector,
10167 &dev->mode_config.connector_list, base.head) {
10168 struct intel_encoder *encoder = connector->new_encoder;
10169
10170 if (!encoder)
10171 continue;
10172
10173 WARN_ON(!encoder->new_crtc);
10174
10175 switch (encoder->type) {
10176 unsigned int port_mask;
10177 case INTEL_OUTPUT_UNKNOWN:
10178 if (WARN_ON(!HAS_DDI(dev)))
10179 break;
10180 case INTEL_OUTPUT_DISPLAYPORT:
10181 case INTEL_OUTPUT_HDMI:
10182 case INTEL_OUTPUT_EDP:
10183 port_mask = 1 << enc_to_dig_port(&encoder->base)->port;
10184
10185 /* the same port mustn't appear more than once */
10186 if (used_ports & port_mask)
10187 return false;
10188
10189 used_ports |= port_mask;
10190 default:
10191 break;
10192 }
10193 }
10194
10195 return true;
10196}
10197
10092static struct intel_crtc_config * 10198static struct intel_crtc_config *
10093intel_modeset_pipe_config(struct drm_crtc *crtc, 10199intel_modeset_pipe_config(struct drm_crtc *crtc,
10094 struct drm_framebuffer *fb, 10200 struct drm_framebuffer *fb,
@@ -10105,6 +10211,11 @@ intel_modeset_pipe_config(struct drm_crtc *crtc,
10105 return ERR_PTR(-EINVAL); 10211 return ERR_PTR(-EINVAL);
10106 } 10212 }
10107 10213
10214 if (!check_digital_port_conflicts(dev)) {
10215 DRM_DEBUG_KMS("rejecting conflicting digital port configuration\n");
10216 return ERR_PTR(-EINVAL);
10217 }
10218
10108 pipe_config = kzalloc(sizeof(*pipe_config), GFP_KERNEL); 10219 pipe_config = kzalloc(sizeof(*pipe_config), GFP_KERNEL);
10109 if (!pipe_config) 10220 if (!pipe_config)
10110 return ERR_PTR(-ENOMEM); 10221 return ERR_PTR(-ENOMEM);
@@ -10907,7 +11018,6 @@ intel_modeset_compute_config(struct drm_crtc *crtc,
10907 } 11018 }
10908 intel_dump_pipe_config(to_intel_crtc(crtc), pipe_config, 11019 intel_dump_pipe_config(to_intel_crtc(crtc), pipe_config,
10909 "[modeset]"); 11020 "[modeset]");
10910 to_intel_crtc(crtc)->new_config = pipe_config;
10911 11021
10912out: 11022out:
10913 return pipe_config; 11023 return pipe_config;
@@ -10933,6 +11043,9 @@ static int __intel_set_mode(struct drm_crtc *crtc,
10933 11043
10934 *saved_mode = crtc->mode; 11044 *saved_mode = crtc->mode;
10935 11045
11046 if (modeset_pipes)
11047 to_intel_crtc(crtc)->new_config = pipe_config;
11048
10936 /* 11049 /*
10937 * See if the config requires any additional preparation, e.g. 11050 * See if the config requires any additional preparation, e.g.
10938 * to adjust global state with pipes off. We need to do this 11051 * to adjust global state with pipes off. We need to do this
@@ -11466,12 +11579,12 @@ static int intel_crtc_set_config(struct drm_mode_set *set)
11466 ret = PTR_ERR(pipe_config); 11579 ret = PTR_ERR(pipe_config);
11467 goto fail; 11580 goto fail;
11468 } else if (pipe_config) { 11581 } else if (pipe_config) {
11469 if (to_intel_crtc(set->crtc)->new_config->has_audio != 11582 if (pipe_config->has_audio !=
11470 to_intel_crtc(set->crtc)->config.has_audio) 11583 to_intel_crtc(set->crtc)->config.has_audio)
11471 config->mode_changed = true; 11584 config->mode_changed = true;
11472 11585
11473 /* Force mode sets for any infoframe stuff */ 11586 /* Force mode sets for any infoframe stuff */
11474 if (to_intel_crtc(set->crtc)->new_config->has_infoframe || 11587 if (pipe_config->has_infoframe ||
11475 to_intel_crtc(set->crtc)->config.has_infoframe) 11588 to_intel_crtc(set->crtc)->config.has_infoframe)
11476 config->mode_changed = true; 11589 config->mode_changed = true;
11477 } 11590 }
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index d2529ec280c8..5cecc20efa71 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1503,6 +1503,7 @@ static bool edp_panel_vdd_on(struct intel_dp *intel_dp)
1503 if (!is_edp(intel_dp)) 1503 if (!is_edp(intel_dp))
1504 return false; 1504 return false;
1505 1505
1506 cancel_delayed_work(&intel_dp->panel_vdd_work);
1506 intel_dp->want_panel_vdd = true; 1507 intel_dp->want_panel_vdd = true;
1507 1508
1508 if (edp_have_panel_vdd(intel_dp)) 1509 if (edp_have_panel_vdd(intel_dp))
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index f0a46ecf3f3a..25fdbb16d4e0 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -958,7 +958,8 @@ unsigned long intel_gen4_compute_page_offset(int *x, int *y,
958 unsigned int tiling_mode, 958 unsigned int tiling_mode,
959 unsigned int bpp, 959 unsigned int bpp,
960 unsigned int pitch); 960 unsigned int pitch);
961void intel_display_handle_reset(struct drm_device *dev); 961void intel_prepare_reset(struct drm_device *dev);
962void intel_finish_reset(struct drm_device *dev);
962void hsw_enable_pc8(struct drm_i915_private *dev_priv); 963void hsw_enable_pc8(struct drm_i915_private *dev_priv);
963void hsw_disable_pc8(struct drm_i915_private *dev_priv); 964void hsw_disable_pc8(struct drm_i915_private *dev_priv);
964void intel_dp_get_m_n(struct intel_crtc *crtc, 965void intel_dp_get_m_n(struct intel_crtc *crtc,
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index ec873338e84d..3abc2000fce9 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -1461,10 +1461,13 @@ static void chv_hdmi_post_disable(struct intel_encoder *encoder)
1461static void chv_hdmi_pre_enable(struct intel_encoder *encoder) 1461static void chv_hdmi_pre_enable(struct intel_encoder *encoder)
1462{ 1462{
1463 struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); 1463 struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1464 struct intel_hdmi *intel_hdmi = &dport->hdmi;
1464 struct drm_device *dev = encoder->base.dev; 1465 struct drm_device *dev = encoder->base.dev;
1465 struct drm_i915_private *dev_priv = dev->dev_private; 1466 struct drm_i915_private *dev_priv = dev->dev_private;
1466 struct intel_crtc *intel_crtc = 1467 struct intel_crtc *intel_crtc =
1467 to_intel_crtc(encoder->base.crtc); 1468 to_intel_crtc(encoder->base.crtc);
1469 struct drm_display_mode *adjusted_mode =
1470 &intel_crtc->config.adjusted_mode;
1468 enum dpio_channel ch = vlv_dport_to_channel(dport); 1471 enum dpio_channel ch = vlv_dport_to_channel(dport);
1469 int pipe = intel_crtc->pipe; 1472 int pipe = intel_crtc->pipe;
1470 int data, i; 1473 int data, i;
@@ -1589,6 +1592,10 @@ static void chv_hdmi_pre_enable(struct intel_encoder *encoder)
1589 1592
1590 mutex_unlock(&dev_priv->dpio_lock); 1593 mutex_unlock(&dev_priv->dpio_lock);
1591 1594
1595 intel_hdmi->set_infoframes(&encoder->base,
1596 intel_crtc->config.has_hdmi_sink,
1597 adjusted_mode);
1598
1592 intel_enable_hdmi(encoder); 1599 intel_enable_hdmi(encoder);
1593 1600
1594 vlv_wait_port_ready(dev_priv, dport); 1601 vlv_wait_port_ready(dev_priv, dport);
diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
index 1a3e485a4f97..46de8d75b4bf 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -43,8 +43,8 @@
43static void 43static void
44assert_device_not_suspended(struct drm_i915_private *dev_priv) 44assert_device_not_suspended(struct drm_i915_private *dev_priv)
45{ 45{
46 WARN(HAS_RUNTIME_PM(dev_priv->dev) && dev_priv->pm.suspended, 46 WARN_ONCE(HAS_RUNTIME_PM(dev_priv->dev) && dev_priv->pm.suspended,
47 "Device suspended\n"); 47 "Device suspended\n");
48} 48}
49 49
50static void __gen6_gt_wait_for_thread_c0(struct drm_i915_private *dev_priv) 50static void __gen6_gt_wait_for_thread_c0(struct drm_i915_private *dev_priv)
@@ -671,18 +671,22 @@ void assert_force_wake_inactive(struct drm_i915_private *dev_priv)
671 REG_RANGE((reg), 0x22000, 0x24000)) 671 REG_RANGE((reg), 0x22000, 0x24000))
672 672
673#define FORCEWAKE_GEN9_UNCORE_RANGE_OFFSET(reg) \ 673#define FORCEWAKE_GEN9_UNCORE_RANGE_OFFSET(reg) \
674 REG_RANGE((reg), 0xC00, 0x2000) 674 REG_RANGE((reg), 0xB00, 0x2000)
675 675
676#define FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(reg) \ 676#define FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(reg) \
677 (REG_RANGE((reg), 0x2000, 0x4000) || \ 677 (REG_RANGE((reg), 0x2000, 0x2700) || \
678 REG_RANGE((reg), 0x3000, 0x4000) || \
678 REG_RANGE((reg), 0x5200, 0x8000) || \ 679 REG_RANGE((reg), 0x5200, 0x8000) || \
680 REG_RANGE((reg), 0x8140, 0x8160) || \
679 REG_RANGE((reg), 0x8300, 0x8500) || \ 681 REG_RANGE((reg), 0x8300, 0x8500) || \
680 REG_RANGE((reg), 0x8C00, 0x8D00) || \ 682 REG_RANGE((reg), 0x8C00, 0x8D00) || \
681 REG_RANGE((reg), 0xB000, 0xB480) || \ 683 REG_RANGE((reg), 0xB000, 0xB480) || \
682 REG_RANGE((reg), 0xE000, 0xE800)) 684 REG_RANGE((reg), 0xE000, 0xE900) || \
685 REG_RANGE((reg), 0x24400, 0x24800))
683 686
684#define FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(reg) \ 687#define FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(reg) \
685 (REG_RANGE((reg), 0x8800, 0x8A00) || \ 688 (REG_RANGE((reg), 0x8130, 0x8140) || \
689 REG_RANGE((reg), 0x8800, 0x8A00) || \
686 REG_RANGE((reg), 0xD000, 0xD800) || \ 690 REG_RANGE((reg), 0xD000, 0xD800) || \
687 REG_RANGE((reg), 0x12000, 0x14000) || \ 691 REG_RANGE((reg), 0x12000, 0x14000) || \
688 REG_RANGE((reg), 0x1A000, 0x1EA00) || \ 692 REG_RANGE((reg), 0x1A000, 0x1EA00) || \
@@ -1345,41 +1349,34 @@ int i915_get_reset_stats_ioctl(struct drm_device *dev,
1345 return 0; 1349 return 0;
1346} 1350}
1347 1351
1348static int i965_reset_complete(struct drm_device *dev) 1352static int i915_reset_complete(struct drm_device *dev)
1349{ 1353{
1350 u8 gdrst; 1354 u8 gdrst;
1351 pci_read_config_byte(dev->pdev, I965_GDRST, &gdrst); 1355 pci_read_config_byte(dev->pdev, I915_GDRST, &gdrst);
1352 return (gdrst & GRDOM_RESET_ENABLE) == 0; 1356 return (gdrst & GRDOM_RESET_STATUS) == 0;
1353} 1357}
1354 1358
1355static int i965_do_reset(struct drm_device *dev) 1359static int i915_do_reset(struct drm_device *dev)
1356{ 1360{
1357 int ret; 1361 /* assert reset for at least 20 usec */
1358 1362 pci_write_config_byte(dev->pdev, I915_GDRST, GRDOM_RESET_ENABLE);
1359 /* FIXME: i965g/gm need a display save/restore for gpu reset. */ 1363 udelay(20);
1360 return -ENODEV; 1364 pci_write_config_byte(dev->pdev, I915_GDRST, 0);
1361 1365
1362 /* 1366 return wait_for(i915_reset_complete(dev), 500);
1363 * Set the domains we want to reset (GRDOM/bits 2 and 3) as 1367}
1364 * well as the reset bit (GR/bit 0). Setting the GR bit
1365 * triggers the reset; when done, the hardware will clear it.
1366 */
1367 pci_write_config_byte(dev->pdev, I965_GDRST,
1368 GRDOM_RENDER | GRDOM_RESET_ENABLE);
1369 ret = wait_for(i965_reset_complete(dev), 500);
1370 if (ret)
1371 return ret;
1372
1373 pci_write_config_byte(dev->pdev, I965_GDRST,
1374 GRDOM_MEDIA | GRDOM_RESET_ENABLE);
1375
1376 ret = wait_for(i965_reset_complete(dev), 500);
1377 if (ret)
1378 return ret;
1379 1368
1380 pci_write_config_byte(dev->pdev, I965_GDRST, 0); 1369static int g4x_reset_complete(struct drm_device *dev)
1370{
1371 u8 gdrst;
1372 pci_read_config_byte(dev->pdev, I915_GDRST, &gdrst);
1373 return (gdrst & GRDOM_RESET_ENABLE) == 0;
1374}
1381 1375
1382 return 0; 1376static int g33_do_reset(struct drm_device *dev)
1377{
1378 pci_write_config_byte(dev->pdev, I915_GDRST, GRDOM_RESET_ENABLE);
1379 return wait_for(g4x_reset_complete(dev), 500);
1383} 1380}
1384 1381
1385static int g4x_do_reset(struct drm_device *dev) 1382static int g4x_do_reset(struct drm_device *dev)
@@ -1387,9 +1384,9 @@ static int g4x_do_reset(struct drm_device *dev)
1387 struct drm_i915_private *dev_priv = dev->dev_private; 1384 struct drm_i915_private *dev_priv = dev->dev_private;
1388 int ret; 1385 int ret;
1389 1386
1390 pci_write_config_byte(dev->pdev, I965_GDRST, 1387 pci_write_config_byte(dev->pdev, I915_GDRST,
1391 GRDOM_RENDER | GRDOM_RESET_ENABLE); 1388 GRDOM_RENDER | GRDOM_RESET_ENABLE);
1392 ret = wait_for(i965_reset_complete(dev), 500); 1389 ret = wait_for(g4x_reset_complete(dev), 500);
1393 if (ret) 1390 if (ret)
1394 return ret; 1391 return ret;
1395 1392
@@ -1397,9 +1394,9 @@ static int g4x_do_reset(struct drm_device *dev)
1397 I915_WRITE(VDECCLK_GATE_D, I915_READ(VDECCLK_GATE_D) | VCP_UNIT_CLOCK_GATE_DISABLE); 1394 I915_WRITE(VDECCLK_GATE_D, I915_READ(VDECCLK_GATE_D) | VCP_UNIT_CLOCK_GATE_DISABLE);
1398 POSTING_READ(VDECCLK_GATE_D); 1395 POSTING_READ(VDECCLK_GATE_D);
1399 1396
1400 pci_write_config_byte(dev->pdev, I965_GDRST, 1397 pci_write_config_byte(dev->pdev, I915_GDRST,
1401 GRDOM_MEDIA | GRDOM_RESET_ENABLE); 1398 GRDOM_MEDIA | GRDOM_RESET_ENABLE);
1402 ret = wait_for(i965_reset_complete(dev), 500); 1399 ret = wait_for(g4x_reset_complete(dev), 500);
1403 if (ret) 1400 if (ret)
1404 return ret; 1401 return ret;
1405 1402
@@ -1407,7 +1404,7 @@ static int g4x_do_reset(struct drm_device *dev)
1407 I915_WRITE(VDECCLK_GATE_D, I915_READ(VDECCLK_GATE_D) & ~VCP_UNIT_CLOCK_GATE_DISABLE); 1404 I915_WRITE(VDECCLK_GATE_D, I915_READ(VDECCLK_GATE_D) & ~VCP_UNIT_CLOCK_GATE_DISABLE);
1408 POSTING_READ(VDECCLK_GATE_D); 1405 POSTING_READ(VDECCLK_GATE_D);
1409 1406
1410 pci_write_config_byte(dev->pdev, I965_GDRST, 0); 1407 pci_write_config_byte(dev->pdev, I915_GDRST, 0);
1411 1408
1412 return 0; 1409 return 0;
1413} 1410}
@@ -1465,8 +1462,10 @@ int intel_gpu_reset(struct drm_device *dev)
1465 return ironlake_do_reset(dev); 1462 return ironlake_do_reset(dev);
1466 else if (IS_G4X(dev)) 1463 else if (IS_G4X(dev))
1467 return g4x_do_reset(dev); 1464 return g4x_do_reset(dev);
1468 else if (IS_GEN4(dev)) 1465 else if (IS_G33(dev))
1469 return i965_do_reset(dev); 1466 return g33_do_reset(dev);
1467 else if (INTEL_INFO(dev)->gen >= 3)
1468 return i915_do_reset(dev);
1470 else 1469 else
1471 return -ENODEV; 1470 return -ENODEV;
1472} 1471}