diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-05-11 13:01:31 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-05-21 14:13:35 -0400 |
commit | adca473021dc8cb2397929918038f76b56a4595d (patch) | |
tree | 35128b6084d80f40e6b51e324fba5d1a305aac30 /drivers/gpu/drm/i915 | |
parent | f15b4ca2ccbc0a4661c35a744d254e1e32dd1e15 (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.c | 75 |
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) | |||
2336 | static int i965_irq_postinstall(struct drm_device *dev) | 2334 | static 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) |