aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-05-11 13:01:31 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-05-21 14:13:35 -0400
commitadca473021dc8cb2397929918038f76b56a4595d (patch)
tree35128b6084d80f40e6b51e324fba5d1a305aac30 /drivers/gpu/drm/i915
parentf15b4ca2ccbc0a4661c35a744d254e1e32dd1e15 (diff)
drm/i915: All members of gen4 have hotplug, so unconditionally enable its irq
Also as we set the HOTPLUG_EN to 0 during pre-install, we can simply set it during post-install, and nor do we wish to enable unwanted hotplug events. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915')
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c75
1 files changed, 31 insertions, 44 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index cc4a63307611..e31515aded8c 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -2320,10 +2320,8 @@ static void i965_irq_preinstall(struct drm_device * dev)
2320 2320
2321 atomic_set(&dev_priv->irq_received, 0); 2321 atomic_set(&dev_priv->irq_received, 0);
2322 2322
2323 if (I915_HAS_HOTPLUG(dev)) { 2323 I915_WRITE(PORT_HOTPLUG_EN, 0);
2324 I915_WRITE(PORT_HOTPLUG_EN, 0); 2324 I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
2325 I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
2326 }
2327 2325
2328 I915_WRITE(HWSTAM, 0xeffe); 2326 I915_WRITE(HWSTAM, 0xeffe);
2329 for_each_pipe(pipe) 2327 for_each_pipe(pipe)
@@ -2336,11 +2334,13 @@ static void i965_irq_preinstall(struct drm_device * dev)
2336static int i965_irq_postinstall(struct drm_device *dev) 2334static int i965_irq_postinstall(struct drm_device *dev)
2337{ 2335{
2338 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 2336 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
2337 u32 hotplug_en;
2339 u32 enable_mask; 2338 u32 enable_mask;
2340 u32 error_mask; 2339 u32 error_mask;
2341 2340
2342 /* Unmask the interrupts that we always want on. */ 2341 /* Unmask the interrupts that we always want on. */
2343 dev_priv->irq_mask = ~(I915_ASLE_INTERRUPT | 2342 dev_priv->irq_mask = ~(I915_ASLE_INTERRUPT |
2343 I915_DISPLAY_PORT_INTERRUPT |
2344 I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | 2344 I915_DISPLAY_PIPE_A_EVENT_INTERRUPT |
2345 I915_DISPLAY_PIPE_B_EVENT_INTERRUPT | 2345 I915_DISPLAY_PIPE_B_EVENT_INTERRUPT |
2346 I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT | 2346 I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT |
@@ -2356,13 +2356,6 @@ static int i965_irq_postinstall(struct drm_device *dev)
2356 dev_priv->pipestat[0] = 0; 2356 dev_priv->pipestat[0] = 0;
2357 dev_priv->pipestat[1] = 0; 2357 dev_priv->pipestat[1] = 0;
2358 2358
2359 if (I915_HAS_HOTPLUG(dev)) {
2360 /* Enable in IER... */
2361 enable_mask |= I915_DISPLAY_PORT_INTERRUPT;
2362 /* and unmask in IMR */
2363 dev_priv->irq_mask &= ~I915_DISPLAY_PORT_INTERRUPT;
2364 }
2365
2366 /* 2359 /*
2367 * Enable some error detection, note the instruction error mask 2360 * Enable some error detection, note the instruction error mask
2368 * bit is reserved, so we leave it masked. 2361 * bit is reserved, so we leave it masked.
@@ -2382,36 +2375,33 @@ static int i965_irq_postinstall(struct drm_device *dev)
2382 I915_WRITE(IER, enable_mask); 2375 I915_WRITE(IER, enable_mask);
2383 POSTING_READ(IER); 2376 POSTING_READ(IER);
2384 2377
2385 if (I915_HAS_HOTPLUG(dev)) { 2378 /* Note HDMI and DP share hotplug bits */
2386 u32 hotplug_en = I915_READ(PORT_HOTPLUG_EN); 2379 hotplug_en = 0;
2387 2380 if (dev_priv->hotplug_supported_mask & HDMIB_HOTPLUG_INT_STATUS)
2388 /* Note HDMI and DP share bits */ 2381 hotplug_en |= HDMIB_HOTPLUG_INT_EN;
2389 if (dev_priv->hotplug_supported_mask & HDMIB_HOTPLUG_INT_STATUS) 2382 if (dev_priv->hotplug_supported_mask & HDMIC_HOTPLUG_INT_STATUS)
2390 hotplug_en |= HDMIB_HOTPLUG_INT_EN; 2383 hotplug_en |= HDMIC_HOTPLUG_INT_EN;
2391 if (dev_priv->hotplug_supported_mask & HDMIC_HOTPLUG_INT_STATUS) 2384 if (dev_priv->hotplug_supported_mask & HDMID_HOTPLUG_INT_STATUS)
2392 hotplug_en |= HDMIC_HOTPLUG_INT_EN; 2385 hotplug_en |= HDMID_HOTPLUG_INT_EN;
2393 if (dev_priv->hotplug_supported_mask & HDMID_HOTPLUG_INT_STATUS) 2386 if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS)
2394 hotplug_en |= HDMID_HOTPLUG_INT_EN; 2387 hotplug_en |= SDVOC_HOTPLUG_INT_EN;
2395 if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS) 2388 if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS)
2396 hotplug_en |= SDVOC_HOTPLUG_INT_EN; 2389 hotplug_en |= SDVOB_HOTPLUG_INT_EN;
2397 if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS) 2390 if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS) {
2398 hotplug_en |= SDVOB_HOTPLUG_INT_EN; 2391 hotplug_en |= CRT_HOTPLUG_INT_EN;
2399 if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS) {
2400 hotplug_en |= CRT_HOTPLUG_INT_EN;
2401 2392
2402 /* Programming the CRT detection parameters tends 2393 /* Programming the CRT detection parameters tends
2403 to generate a spurious hotplug event about three 2394 to generate a spurious hotplug event about three
2404 seconds later. So just do it once. 2395 seconds later. So just do it once.
2405 */ 2396 */
2406 if (IS_G4X(dev)) 2397 if (IS_G4X(dev))
2407 hotplug_en |= CRT_HOTPLUG_ACTIVATION_PERIOD_64; 2398 hotplug_en |= CRT_HOTPLUG_ACTIVATION_PERIOD_64;
2408 hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50; 2399 hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50;
2409 } 2400 }
2410 2401
2411 /* Ignore TV since it's buggy */ 2402 /* Ignore TV since it's buggy */
2412 2403
2413 I915_WRITE(PORT_HOTPLUG_EN, hotplug_en); 2404 I915_WRITE(PORT_HOTPLUG_EN, hotplug_en);
2414 }
2415 2405
2416 intel_opregion_enable_asle(dev); 2406 intel_opregion_enable_asle(dev);
2417 2407
@@ -2469,8 +2459,7 @@ static irqreturn_t i965_irq_handler(DRM_IRQ_ARGS)
2469 ret = IRQ_HANDLED; 2459 ret = IRQ_HANDLED;
2470 2460
2471 /* Consume port. Then clear IIR or we'll miss events */ 2461 /* Consume port. Then clear IIR or we'll miss events */
2472 if ((I915_HAS_HOTPLUG(dev)) && 2462 if (iir & I915_DISPLAY_PORT_INTERRUPT) {
2473 (iir & I915_DISPLAY_PORT_INTERRUPT)) {
2474 u32 hotplug_status = I915_READ(PORT_HOTPLUG_STAT); 2463 u32 hotplug_status = I915_READ(PORT_HOTPLUG_STAT);
2475 2464
2476 DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n", 2465 DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n",
@@ -2543,10 +2532,8 @@ static void i965_irq_uninstall(struct drm_device * dev)
2543 if (!dev_priv) 2532 if (!dev_priv)
2544 return; 2533 return;
2545 2534
2546 if (I915_HAS_HOTPLUG(dev)) { 2535 I915_WRITE(PORT_HOTPLUG_EN, 0);
2547 I915_WRITE(PORT_HOTPLUG_EN, 0); 2536 I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
2548 I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
2549 }
2550 2537
2551 I915_WRITE(HWSTAM, 0xffffffff); 2538 I915_WRITE(HWSTAM, 0xffffffff);
2552 for_each_pipe(pipe) 2539 for_each_pipe(pipe)