Rev 3298 | Rev 3746 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3298 | Rev 3480 | ||
---|---|---|---|
Line 43... | Line 43... | ||
43 | #define DRM_WAKEUP( queue ) wake_up( queue ) |
43 | #define DRM_WAKEUP( queue ) wake_up( queue ) |
44 | #define DRM_INIT_WAITQUEUE( queue ) init_waitqueue_head( queue ) |
44 | #define DRM_INIT_WAITQUEUE( queue ) init_waitqueue_head( queue ) |
Line 45... | Line 45... | ||
45 | 45 | ||
Line 46... | Line -... | ||
46 | #define MAX_NOPID ((u32)~0) |
- | |
47 | - | ||
48 | /** |
- | |
49 | * Interrupts that are always left unmasked. |
- | |
50 | * |
- | |
51 | * Since pipe events are edge-triggered from the PIPESTAT register to IIR, |
- | |
52 | * we leave them always unmasked in IMR and then control enabling them through |
- | |
53 | * PIPESTAT alone. |
- | |
54 | */ |
- | |
55 | #define I915_INTERRUPT_ENABLE_FIX \ |
- | |
56 | (I915_ASLE_INTERRUPT | \ |
- | |
57 | I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | \ |
- | |
58 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT | \ |
- | |
59 | I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT | \ |
- | |
60 | I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT | \ |
- | |
61 | I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) |
- | |
62 | - | ||
63 | /** Interrupts that we mask and unmask at runtime. */ |
- | |
64 | #define I915_INTERRUPT_ENABLE_VAR (I915_USER_INTERRUPT | I915_BSD_USER_INTERRUPT) |
- | |
65 | - | ||
Line 66... | Line -... | ||
66 | #define I915_PIPE_VBLANK_STATUS (PIPE_START_VBLANK_INTERRUPT_STATUS |\ |
- | |
67 | PIPE_VBLANK_INTERRUPT_STATUS) |
- | |
68 | - | ||
69 | #define I915_PIPE_VBLANK_ENABLE (PIPE_START_VBLANK_INTERRUPT_ENABLE |\ |
- | |
70 | PIPE_VBLANK_INTERRUPT_ENABLE) |
- | |
Line 71... | Line 46... | ||
71 | 46 | #define MAX_NOPID ((u32)~0) |
|
72 | #define DRM_I915_VBLANK_PIPE_ALL (DRM_I915_VBLANK_PIPE_A | \ |
47 | |
73 | DRM_I915_VBLANK_PIPE_B) |
48 | |
74 | 49 | ||
Line 213... | Line 188... | ||
213 | } |
188 | } |
Line 214... | Line 189... | ||
214 | 189 | ||
215 | return I915_READ(reg); |
190 | return I915_READ(reg); |
Line -... | Line 191... | ||
- | 191 | } |
|
- | 192 | ||
- | 193 | /* |
|
- | 194 | * Handle hotplug events outside the interrupt handler proper. |
|
- | 195 | */ |
|
- | 196 | static void i915_hotplug_work_func(struct work_struct *work) |
|
- | 197 | { |
|
- | 198 | drm_i915_private_t *dev_priv = container_of(work, drm_i915_private_t, |
|
- | 199 | hotplug_work); |
|
- | 200 | struct drm_device *dev = dev_priv->dev; |
|
- | 201 | struct drm_mode_config *mode_config = &dev->mode_config; |
|
- | 202 | struct intel_encoder *encoder; |
|
- | 203 | ||
- | 204 | /* HPD irq before everything is fully set up. */ |
|
- | 205 | if (!dev_priv->enable_hotplug_processing) |
|
- | 206 | return; |
|
- | 207 | ||
- | 208 | mutex_lock(&mode_config->mutex); |
|
- | 209 | DRM_DEBUG_KMS("running encoder hotplug functions\n"); |
|
- | 210 | ||
- | 211 | list_for_each_entry(encoder, &mode_config->encoder_list, base.head) |
|
- | 212 | if (encoder->hot_plug) |
|
- | 213 | encoder->hot_plug(encoder); |
|
- | 214 | ||
- | 215 | mutex_unlock(&mode_config->mutex); |
|
- | 216 | ||
- | 217 | /* Just fire off a uevent and let userspace tell us what to do */ |
|
Line 216... | Line 218... | ||
216 | } |
218 | drm_helper_hpd_irq_event(dev); |
217 | 219 | } |
|
218 | 220 | ||
219 | static void notify_ring(struct drm_device *dev, |
221 | static void notify_ring(struct drm_device *dev, |
Line 400... | Line 402... | ||
400 | spin_unlock_irqrestore(&dev_priv->rps.lock, flags); |
402 | spin_unlock_irqrestore(&dev_priv->rps.lock, flags); |
Line 401... | Line 403... | ||
401 | 403 | ||
402 | // queue_work(dev_priv->wq, &dev_priv->rps.work); |
404 | // queue_work(dev_priv->wq, &dev_priv->rps.work); |
Line -... | Line 405... | ||
- | 405 | } |
|
- | 406 | ||
- | 407 | static void gmbus_irq_handler(struct drm_device *dev) |
|
- | 408 | { |
|
- | 409 | struct drm_i915_private *dev_priv = (drm_i915_private_t *) dev->dev_private; |
|
- | 410 | ||
- | 411 | wake_up_all(&dev_priv->gmbus_wait_queue); |
|
- | 412 | } |
|
- | 413 | ||
- | 414 | static void dp_aux_irq_handler(struct drm_device *dev) |
|
- | 415 | { |
|
- | 416 | struct drm_i915_private *dev_priv = (drm_i915_private_t *) dev->dev_private; |
|
- | 417 | ||
- | 418 | wake_up_all(&dev_priv->gmbus_wait_queue); |
|
403 | } |
419 | } |
404 | 420 | ||
405 | static irqreturn_t valleyview_irq_handler(int irq, void *arg) |
421 | static irqreturn_t valleyview_irq_handler(int irq, void *arg) |
406 | { |
422 | { |
407 | struct drm_device *dev = (struct drm_device *) arg; |
423 | struct drm_device *dev = (struct drm_device *) arg; |
408 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
424 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
409 | u32 iir, gt_iir, pm_iir; |
425 | u32 iir, gt_iir, pm_iir; |
410 | irqreturn_t ret = IRQ_NONE; |
426 | irqreturn_t ret = IRQ_NONE; |
411 | unsigned long irqflags; |
427 | unsigned long irqflags; |
412 | int pipe; |
- | |
Line 413... | Line 428... | ||
413 | u32 pipe_stats[I915_MAX_PIPES]; |
428 | int pipe; |
Line 414... | Line 429... | ||
414 | bool blc_event; |
429 | u32 pipe_stats[I915_MAX_PIPES]; |
415 | 430 | ||
Line 460... | Line 475... | ||
460 | if (iir & I915_DISPLAY_PORT_INTERRUPT) { |
475 | if (iir & I915_DISPLAY_PORT_INTERRUPT) { |
461 | u32 hotplug_status = I915_READ(PORT_HOTPLUG_STAT); |
476 | u32 hotplug_status = I915_READ(PORT_HOTPLUG_STAT); |
Line 462... | Line 477... | ||
462 | 477 | ||
463 | DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n", |
478 | DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n", |
464 | hotplug_status); |
479 | hotplug_status); |
465 | // if (hotplug_status & dev_priv->hotplug_supported_mask) |
480 | if (hotplug_status & dev_priv->hotplug_supported_mask) |
466 | // queue_work(dev_priv->wq, |
481 | queue_work(dev_priv->wq, |
Line 467... | Line 482... | ||
467 | // &dev_priv->hotplug_work); |
482 | &dev_priv->hotplug_work); |
468 | 483 | ||
469 | I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status); |
484 | I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status); |
Line 470... | Line 485... | ||
470 | I915_READ(PORT_HOTPLUG_STAT); |
485 | I915_READ(PORT_HOTPLUG_STAT); |
471 | } |
486 | } |
Line 472... | Line 487... | ||
472 | 487 | ||
473 | if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS) |
488 | if (pipe_stats[0] & PIPE_GMBUS_INTERRUPT_STATUS) |
Line 474... | Line 489... | ||
474 | blc_event = true; |
489 | gmbus_irq_handler(dev); |
475 | 490 | ||
476 | if (pm_iir & GEN6_PM_DEFERRED_EVENTS) |
491 | // if (pm_iir & GEN6_PM_DEFERRED_EVENTS) |
477 | gen6_queue_rps_work(dev_priv, pm_iir); |
492 | // gen6_queue_rps_work(dev_priv, pm_iir); |
Line 488... | Line 503... | ||
488 | static void ibx_irq_handler(struct drm_device *dev, u32 pch_iir) |
503 | static void ibx_irq_handler(struct drm_device *dev, u32 pch_iir) |
489 | { |
504 | { |
490 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
505 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
491 | int pipe; |
506 | int pipe; |
Line 492... | Line 507... | ||
492 | 507 | ||
- | 508 | if (pch_iir & SDE_HOTPLUG_MASK) |
|
Line 493... | Line 509... | ||
493 | printf("%s\n", __FUNCTION__); |
509 | queue_work(dev_priv->wq, &dev_priv->hotplug_work); |
494 | 510 | ||
495 | if (pch_iir & SDE_AUDIO_POWER_MASK) |
511 | if (pch_iir & SDE_AUDIO_POWER_MASK) |
496 | DRM_DEBUG_DRIVER("PCH audio power change on port %d\n", |
512 | DRM_DEBUG_DRIVER("PCH audio power change on port %d\n", |
Line -... | Line 513... | ||
- | 513 | (pch_iir & SDE_AUDIO_POWER_MASK) >> |
|
- | 514 | SDE_AUDIO_POWER_SHIFT); |
|
- | 515 | ||
497 | (pch_iir & SDE_AUDIO_POWER_MASK) >> |
516 | if (pch_iir & SDE_AUX_MASK) |
498 | SDE_AUDIO_POWER_SHIFT); |
517 | dp_aux_irq_handler(dev); |
Line 499... | Line 518... | ||
499 | 518 | ||
500 | if (pch_iir & SDE_GMBUS) |
519 | if (pch_iir & SDE_GMBUS) |
Line 501... | Line 520... | ||
501 | DRM_DEBUG_DRIVER("PCH GMBUS interrupt\n"); |
520 | gmbus_irq_handler(dev); |
Line 530... | Line 549... | ||
530 | static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir) |
549 | static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir) |
531 | { |
550 | { |
532 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
551 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
533 | int pipe; |
552 | int pipe; |
Line -... | Line 553... | ||
- | 553 | ||
- | 554 | if (pch_iir & SDE_HOTPLUG_MASK_CPT) |
|
- | 555 | queue_work(dev_priv->wq, &dev_priv->hotplug_work); |
|
534 | 556 | ||
535 | if (pch_iir & SDE_AUDIO_POWER_MASK_CPT) |
557 | if (pch_iir & SDE_AUDIO_POWER_MASK_CPT) |
536 | DRM_DEBUG_DRIVER("PCH audio power change on port %d\n", |
558 | DRM_DEBUG_DRIVER("PCH audio power change on port %d\n", |
537 | (pch_iir & SDE_AUDIO_POWER_MASK_CPT) >> |
559 | (pch_iir & SDE_AUDIO_POWER_MASK_CPT) >> |
Line 538... | Line 560... | ||
538 | SDE_AUDIO_POWER_SHIFT_CPT); |
560 | SDE_AUDIO_POWER_SHIFT_CPT); |
539 | 561 | ||
Line 540... | Line 562... | ||
540 | if (pch_iir & SDE_AUX_MASK_CPT) |
562 | if (pch_iir & SDE_AUX_MASK_CPT) |
541 | DRM_DEBUG_DRIVER("AUX channel interrupt\n"); |
563 | dp_aux_irq_handler(dev); |
Line 542... | Line 564... | ||
542 | 564 | ||
543 | if (pch_iir & SDE_GMBUS_CPT) |
565 | if (pch_iir & SDE_GMBUS_CPT) |
Line 544... | Line 566... | ||
544 | DRM_DEBUG_DRIVER("PCH GMBUS interrupt\n"); |
566 | gmbus_irq_handler(dev); |
Line 558... | Line 580... | ||
558 | 580 | ||
559 | static irqreturn_t ivybridge_irq_handler(int irq, void *arg) |
581 | static irqreturn_t ivybridge_irq_handler(int irq, void *arg) |
560 | { |
582 | { |
561 | struct drm_device *dev = (struct drm_device *) arg; |
583 | struct drm_device *dev = (struct drm_device *) arg; |
562 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
584 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
563 | u32 de_iir, gt_iir, de_ier, pm_iir; |
585 | u32 de_iir, gt_iir, de_ier, pm_iir, sde_ier; |
564 | irqreturn_t ret = IRQ_NONE; |
586 | irqreturn_t ret = IRQ_NONE; |
Line 565... | Line 587... | ||
565 | int i; |
587 | int i; |
Line 566... | Line 588... | ||
566 | 588 | ||
567 | atomic_inc(&dev_priv->irq_received); |
589 | atomic_inc(&dev_priv->irq_received); |
568 | 590 | ||
Line -... | Line 591... | ||
- | 591 | /* disable master interrupt before clearing iir */ |
|
- | 592 | de_ier = I915_READ(DEIER); |
|
- | 593 | I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL); |
|
- | 594 | ||
- | 595 | /* Disable south interrupts. We'll only write to SDEIIR once, so further |
|
- | 596 | * interrupts will will be stored on its back queue, and then we'll be |
|
- | 597 | * able to process them after we restore SDEIER (as soon as we restore |
|
- | 598 | * it, we'll get an interrupt if SDEIIR still has something to process |
|
- | 599 | * due to its back queue). */ |
|
569 | /* disable master interrupt before clearing iir */ |
600 | sde_ier = I915_READ(SDEIER); |
570 | de_ier = I915_READ(DEIER); |
601 | I915_WRITE(SDEIER, 0); |
571 | I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL); |
602 | POSTING_READ(SDEIER); |
572 | 603 | ||
573 | gt_iir = I915_READ(GTIIR); |
604 | gt_iir = I915_READ(GTIIR); |
574 | if (gt_iir) { |
605 | if (gt_iir) { |
Line 575... | Line 606... | ||
575 | snb_gt_irq_handler(dev, dev_priv, gt_iir); |
606 | snb_gt_irq_handler(dev, dev_priv, gt_iir); |
576 | I915_WRITE(GTIIR, gt_iir); |
607 | I915_WRITE(GTIIR, gt_iir); |
- | 608 | ret = IRQ_HANDLED; |
|
- | 609 | } |
|
577 | ret = IRQ_HANDLED; |
610 | |
578 | } |
611 | de_iir = I915_READ(DEIIR); |
579 | 612 | if (de_iir) { |
|
Line 580... | Line 613... | ||
580 | de_iir = I915_READ(DEIIR); |
613 | if (de_iir & DE_AUX_CHANNEL_A_IVB) |
Line 594... | Line 627... | ||
594 | #endif |
627 | #endif |
595 | /* check event from PCH */ |
628 | /* check event from PCH */ |
596 | if (de_iir & DE_PCH_EVENT_IVB) { |
629 | if (de_iir & DE_PCH_EVENT_IVB) { |
597 | u32 pch_iir = I915_READ(SDEIIR); |
630 | u32 pch_iir = I915_READ(SDEIIR); |
Line 598... | Line -... | ||
598 | - | ||
599 | // if (pch_iir & SDE_HOTPLUG_MASK_CPT) |
- | |
600 | // queue_work(dev_priv->wq, &dev_priv->hotplug_work); |
631 | |
Line 601... | Line 632... | ||
601 | cpt_irq_handler(dev, pch_iir); |
632 | cpt_irq_handler(dev, pch_iir); |
602 | 633 | ||
603 | /* clear PCH hotplug event before clear CPU irq */ |
634 | /* clear PCH hotplug event before clear CPU irq */ |
Line 616... | Line 647... | ||
616 | ret = IRQ_HANDLED; |
647 | ret = IRQ_HANDLED; |
617 | } |
648 | } |
Line 618... | Line 649... | ||
618 | 649 | ||
619 | I915_WRITE(DEIER, de_ier); |
650 | I915_WRITE(DEIER, de_ier); |
- | 651 | POSTING_READ(DEIER); |
|
- | 652 | I915_WRITE(SDEIER, sde_ier); |
|
Line 620... | Line 653... | ||
620 | POSTING_READ(DEIER); |
653 | POSTING_READ(SDEIER); |
621 | 654 | ||
Line 622... | Line 655... | ||
622 | return ret; |
655 | return ret; |
Line 635... | Line 668... | ||
635 | static irqreturn_t ironlake_irq_handler(int irq, void *arg) |
668 | static irqreturn_t ironlake_irq_handler(int irq, void *arg) |
636 | { |
669 | { |
637 | struct drm_device *dev = (struct drm_device *) arg; |
670 | struct drm_device *dev = (struct drm_device *) arg; |
638 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
671 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
639 | int ret = IRQ_NONE; |
672 | int ret = IRQ_NONE; |
640 | u32 de_iir, gt_iir, de_ier, pch_iir, pm_iir; |
673 | u32 de_iir, gt_iir, de_ier, pm_iir, sde_ier; |
Line 641... | Line 674... | ||
641 | 674 | ||
Line 642... | Line 675... | ||
642 | atomic_inc(&dev_priv->irq_received); |
675 | atomic_inc(&dev_priv->irq_received); |
643 | 676 | ||
644 | /* disable master interrupt before clearing iir */ |
677 | /* disable master interrupt before clearing iir */ |
645 | de_ier = I915_READ(DEIER); |
678 | de_ier = I915_READ(DEIER); |
Line -... | Line 679... | ||
- | 679 | I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL); |
|
- | 680 | POSTING_READ(DEIER); |
|
- | 681 | ||
- | 682 | /* Disable south interrupts. We'll only write to SDEIIR once, so further |
|
- | 683 | * interrupts will will be stored on its back queue, and then we'll be |
|
- | 684 | * able to process them after we restore SDEIER (as soon as we restore |
|
- | 685 | * it, we'll get an interrupt if SDEIIR still has something to process |
|
- | 686 | * due to its back queue). */ |
|
- | 687 | sde_ier = I915_READ(SDEIER); |
|
646 | I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL); |
688 | I915_WRITE(SDEIER, 0); |
647 | POSTING_READ(DEIER); |
689 | POSTING_READ(SDEIER); |
648 | - | ||
649 | de_iir = I915_READ(DEIIR); |
690 | |
Line 650... | Line 691... | ||
650 | gt_iir = I915_READ(GTIIR); |
691 | de_iir = I915_READ(DEIIR); |
651 | pch_iir = I915_READ(SDEIIR); |
- | |
652 | pm_iir = I915_READ(GEN6_PMIIR); |
692 | gt_iir = I915_READ(GTIIR); |
Line 653... | Line 693... | ||
653 | 693 | pm_iir = I915_READ(GEN6_PMIIR); |
|
Line 654... | Line 694... | ||
654 | if (de_iir == 0 && gt_iir == 0 && pch_iir == 0 && |
694 | |
655 | (!IS_GEN6(dev) || pm_iir == 0)) |
695 | if (de_iir == 0 && gt_iir == 0 && (!IS_GEN6(dev) || pm_iir == 0)) |
656 | goto done; |
696 | goto done; |
657 | 697 | ||
- | 698 | ret = IRQ_HANDLED; |
|
- | 699 | ||
- | 700 | if (IS_GEN5(dev)) |
|
- | 701 | ilk_gt_irq_handler(dev, dev_priv, gt_iir); |
|
658 | ret = IRQ_HANDLED; |
702 | else |
659 | 703 | snb_gt_irq_handler(dev, dev_priv, gt_iir); |
|
660 | if (IS_GEN5(dev)) |
704 | |
Line 661... | Line 705... | ||
661 | ilk_gt_irq_handler(dev, dev_priv, gt_iir); |
705 | if (de_iir & DE_AUX_CHANNEL_A) |
Line 682... | Line 726... | ||
682 | } |
726 | } |
683 | #endif |
727 | #endif |
Line 684... | Line 728... | ||
684 | 728 | ||
685 | /* check event from PCH */ |
729 | /* check event from PCH */ |
686 | if (de_iir & DE_PCH_EVENT) { |
730 | if (de_iir & DE_PCH_EVENT) { |
687 | // if (pch_iir & hotplug_mask) |
- | |
- | 731 | u32 pch_iir = I915_READ(SDEIIR); |
|
688 | // queue_work(dev_priv->wq, &dev_priv->hotplug_work); |
732 | |
689 | if (HAS_PCH_CPT(dev)) |
733 | if (HAS_PCH_CPT(dev)) |
690 | cpt_irq_handler(dev, pch_iir); |
734 | cpt_irq_handler(dev, pch_iir); |
691 | else |
735 | else |
- | 736 | ibx_irq_handler(dev, pch_iir); |
|
- | 737 | ||
- | 738 | /* should clear PCH hotplug event before clear CPU irq */ |
|
692 | ibx_irq_handler(dev, pch_iir); |
739 | I915_WRITE(SDEIIR, pch_iir); |
693 | } |
740 | } |
694 | #if 0 |
741 | #if 0 |
695 | if (IS_GEN5(dev) && de_iir & DE_PCU_EVENT) |
742 | if (IS_GEN5(dev) && de_iir & DE_PCU_EVENT) |
Line 696... | Line 743... | ||
696 | ironlake_handle_rps_change(dev); |
743 | ironlake_handle_rps_change(dev); |
697 | 744 | ||
698 | if (IS_GEN6(dev) && pm_iir & GEN6_PM_DEFERRED_EVENTS) |
745 | if (IS_GEN6(dev) && pm_iir & GEN6_PM_DEFERRED_EVENTS) |
699 | gen6_queue_rps_work(dev_priv, pm_iir); |
- | |
700 | #endif |
- | |
701 | /* should clear PCH hotplug event before clear CPU irq */ |
746 | gen6_queue_rps_work(dev_priv, pm_iir); |
702 | I915_WRITE(SDEIIR, pch_iir); |
747 | #endif |
703 | I915_WRITE(GTIIR, gt_iir); |
748 | I915_WRITE(GTIIR, gt_iir); |
Line 704... | Line 749... | ||
704 | I915_WRITE(DEIIR, de_iir); |
749 | I915_WRITE(DEIIR, de_iir); |
705 | I915_WRITE(GEN6_PMIIR, pm_iir); |
750 | I915_WRITE(GEN6_PMIIR, pm_iir); |
706 | 751 | ||
- | 752 | done: |
|
- | 753 | I915_WRITE(DEIER, de_ier); |
|
Line 707... | Line 754... | ||
707 | done: |
754 | POSTING_READ(DEIER); |
708 | I915_WRITE(DEIER, de_ier); |
755 | I915_WRITE(SDEIER, sde_ier); |
Line 731... | Line 778... | ||
731 | case 6: |
778 | case 6: |
732 | instdone[0] = I915_READ(INSTDONE_I965); |
779 | instdone[0] = I915_READ(INSTDONE_I965); |
733 | instdone[1] = I915_READ(INSTDONE1); |
780 | instdone[1] = I915_READ(INSTDONE1); |
734 | break; |
781 | break; |
735 | default: |
782 | default: |
736 | WARN(1, "Unsupported platform\n"); |
783 | WARN_ONCE(1, "Unsupported platform\n"); |
737 | case 7: |
784 | case 7: |
738 | instdone[0] = I915_READ(GEN7_INSTDONE_1); |
785 | instdone[0] = I915_READ(GEN7_INSTDONE_1); |
739 | instdone[1] = I915_READ(GEN7_SC_INSTDONE); |
786 | instdone[1] = I915_READ(GEN7_SC_INSTDONE); |
740 | instdone[2] = I915_READ(GEN7_SAMPLER_INSTDONE); |
787 | instdone[2] = I915_READ(GEN7_SAMPLER_INSTDONE); |
741 | instdone[3] = I915_READ(GEN7_ROW_INSTDONE); |
788 | instdone[3] = I915_READ(GEN7_ROW_INSTDONE); |
Line 769... | Line 816... | ||
769 | d = kmalloc(PAGE_SIZE, GFP_ATOMIC); |
816 | d = kmalloc(PAGE_SIZE, GFP_ATOMIC); |
770 | if (d == NULL) |
817 | if (d == NULL) |
771 | goto unwind; |
818 | goto unwind; |
Line 772... | Line 819... | ||
772 | 819 | ||
773 | local_irq_save(flags); |
820 | local_irq_save(flags); |
774 | if (reloc_offset < dev_priv->mm.gtt_mappable_end && |
821 | if (reloc_offset < dev_priv->gtt.mappable_end && |
775 | src->has_global_gtt_mapping) { |
822 | src->has_global_gtt_mapping) { |
Line 776... | Line 823... | ||
776 | void __iomem *s; |
823 | void __iomem *s; |
777 | 824 | ||
778 | /* Simply ignore tiling or any overlapping fence. |
825 | /* Simply ignore tiling or any overlapping fence. |
779 | * It's part of the error state, and this hopefully |
826 | * It's part of the error state, and this hopefully |
Line 780... | Line 827... | ||
780 | * captures what the GPU read. |
827 | * captures what the GPU read. |
781 | */ |
828 | */ |
782 | 829 | ||
783 | s = io_mapping_map_atomic_wc(dev_priv->mm.gtt_mapping, |
830 | s = io_mapping_map_atomic_wc(dev_priv->gtt.mappable, |
- | 831 | reloc_offset); |
|
- | 832 | memcpy_fromio(d, s, PAGE_SIZE); |
|
- | 833 | io_mapping_unmap_atomic(s); |
|
- | 834 | } else if (src->stolen) { |
|
- | 835 | unsigned long offset; |
|
- | 836 | ||
- | 837 | offset = dev_priv->mm.stolen_base; |
|
- | 838 | offset += src->stolen->start; |
|
784 | reloc_offset); |
839 | offset += i << PAGE_SHIFT; |
785 | memcpy_fromio(d, s, PAGE_SIZE); |
840 | |
786 | io_mapping_unmap_atomic(s); |
841 | memcpy_fromio(d, (void __iomem *) offset, PAGE_SIZE); |
Line 787... | Line 842... | ||
787 | } else { |
842 | } else { |
Line 928... | Line 983... | ||
928 | case 2: |
983 | case 2: |
929 | for (i = 0; i < 8; i++) |
984 | for (i = 0; i < 8; i++) |
930 | error->fence[i] = I915_READ(FENCE_REG_830_0 + (i * 4)); |
985 | error->fence[i] = I915_READ(FENCE_REG_830_0 + (i * 4)); |
931 | break; |
986 | break; |
Line -... | Line 987... | ||
- | 987 | ||
- | 988 | default: |
|
932 | 989 | BUG(); |
|
933 | } |
990 | } |
Line 934... | Line 991... | ||
934 | } |
991 | } |
935 | 992 | ||
Line 941... | Line 998... | ||
941 | u32 seqno; |
998 | u32 seqno; |
Line 942... | Line 999... | ||
942 | 999 | ||
943 | if (!ring->get_seqno) |
1000 | if (!ring->get_seqno) |
Line -... | Line 1001... | ||
- | 1001 | return NULL; |
|
- | 1002 | ||
- | 1003 | if (HAS_BROKEN_CS_TLB(dev_priv->dev)) { |
|
- | 1004 | u32 acthd = I915_READ(ACTHD); |
|
- | 1005 | ||
- | 1006 | if (WARN_ON(ring->id != RCS)) |
|
- | 1007 | return NULL; |
|
- | 1008 | ||
- | 1009 | obj = ring->private; |
|
- | 1010 | if (acthd >= obj->gtt_offset && |
|
- | 1011 | acthd < obj->gtt_offset + obj->base.size) |
|
- | 1012 | return i915_error_object_create(dev_priv, obj); |
|
944 | return NULL; |
1013 | } |
945 | 1014 | ||
946 | seqno = ring->get_seqno(ring, false); |
1015 | seqno = ring->get_seqno(ring, false); |
947 | list_for_each_entry(obj, &dev_priv->mm.active_list, mm_list) { |
1016 | list_for_each_entry(obj, &dev_priv->mm.active_list, mm_list) { |
Line 1064... | Line 1133... | ||
1064 | struct drm_i915_gem_object *obj; |
1133 | struct drm_i915_gem_object *obj; |
1065 | struct drm_i915_error_state *error; |
1134 | struct drm_i915_error_state *error; |
1066 | unsigned long flags; |
1135 | unsigned long flags; |
1067 | int i, pipe; |
1136 | int i, pipe; |
Line 1068... | Line 1137... | ||
1068 | 1137 | ||
1069 | spin_lock_irqsave(&dev_priv->error_lock, flags); |
1138 | spin_lock_irqsave(&dev_priv->gpu_error.lock, flags); |
1070 | error = dev_priv->first_error; |
1139 | error = dev_priv->gpu_error.first_error; |
1071 | spin_unlock_irqrestore(&dev_priv->error_lock, flags); |
1140 | spin_unlock_irqrestore(&dev_priv->gpu_error.lock, flags); |
1072 | if (error) |
1141 | if (error) |
Line 1073... | Line 1142... | ||
1073 | return; |
1142 | return; |
1074 | 1143 | ||
1075 | /* Account for pipe specific data like PIPE*STAT */ |
1144 | /* Account for pipe specific data like PIPE*STAT */ |
1076 | error = kzalloc(sizeof(*error), GFP_ATOMIC); |
1145 | error = kzalloc(sizeof(*error), GFP_ATOMIC); |
1077 | if (!error) { |
1146 | if (!error) { |
1078 | DRM_DEBUG_DRIVER("out of memory, not capturing error state\n"); |
1147 | DRM_DEBUG_DRIVER("out of memory, not capturing error state\n"); |
Line 1079... | Line 1148... | ||
1079 | return; |
1148 | return; |
- | 1149 | } |
|
1080 | } |
1150 | |
Line 1081... | Line 1151... | ||
1081 | 1151 | DRM_INFO("capturing error event; look for more information in" |
|
1082 | DRM_INFO("capturing error event; look for more information in /debug/dri/%d/i915_error_state\n", |
1152 | "/sys/kernel/debug/dri/%d/i915_error_state\n", |
1083 | dev->primary->index); |
1153 | dev->primary->index); |
Line 1160... | Line 1230... | ||
1160 | do_gettimeofday(&error->time); |
1230 | do_gettimeofday(&error->time); |
Line 1161... | Line 1231... | ||
1161 | 1231 | ||
1162 | error->overlay = intel_overlay_capture_error_state(dev); |
1232 | error->overlay = intel_overlay_capture_error_state(dev); |
Line 1163... | Line 1233... | ||
1163 | error->display = intel_display_capture_error_state(dev); |
1233 | error->display = intel_display_capture_error_state(dev); |
1164 | 1234 | ||
1165 | spin_lock_irqsave(&dev_priv->error_lock, flags); |
1235 | spin_lock_irqsave(&dev_priv->gpu_error.lock, flags); |
1166 | if (dev_priv->first_error == NULL) { |
1236 | if (dev_priv->gpu_error.first_error == NULL) { |
1167 | dev_priv->first_error = error; |
1237 | dev_priv->gpu_error.first_error = error; |
1168 | error = NULL; |
1238 | error = NULL; |
Line 1169... | Line 1239... | ||
1169 | } |
1239 | } |
1170 | spin_unlock_irqrestore(&dev_priv->error_lock, flags); |
1240 | spin_unlock_irqrestore(&dev_priv->gpu_error.lock, flags); |
1171 | 1241 | ||
Line 1177... | Line 1247... | ||
1177 | { |
1247 | { |
1178 | struct drm_i915_private *dev_priv = dev->dev_private; |
1248 | struct drm_i915_private *dev_priv = dev->dev_private; |
1179 | struct drm_i915_error_state *error; |
1249 | struct drm_i915_error_state *error; |
1180 | unsigned long flags; |
1250 | unsigned long flags; |
Line 1181... | Line 1251... | ||
1181 | 1251 | ||
1182 | spin_lock_irqsave(&dev_priv->error_lock, flags); |
1252 | spin_lock_irqsave(&dev_priv->gpu_error.lock, flags); |
1183 | error = dev_priv->first_error; |
1253 | error = dev_priv->gpu_error.first_error; |
1184 | dev_priv->first_error = NULL; |
1254 | dev_priv->gpu_error.first_error = NULL; |
Line 1185... | Line 1255... | ||
1185 | spin_unlock_irqrestore(&dev_priv->error_lock, flags); |
1255 | spin_unlock_irqrestore(&dev_priv->gpu_error.lock, flags); |
1186 | 1256 | ||
1187 | if (error) |
1257 | if (error) |
1188 | kref_put(&error->ref, i915_error_state_free); |
1258 | kref_put(&error->ref, i915_error_state_free); |
Line 1301... | Line 1371... | ||
1301 | 1371 | ||
1302 | i915_capture_error_state(dev); |
1372 | i915_capture_error_state(dev); |
Line 1303... | Line 1373... | ||
1303 | i915_report_and_clear_eir(dev); |
1373 | i915_report_and_clear_eir(dev); |
1304 | 1374 | ||
1305 | if (wedged) { |
1375 | if (wedged) { |
Line 1306... | Line 1376... | ||
1306 | // INIT_COMPLETION(dev_priv->error_completion); |
1376 | atomic_set_mask(I915_RESET_IN_PROGRESS_FLAG, |
1307 | atomic_set(&dev_priv->mm.wedged, 1); |
1377 | &dev_priv->gpu_error.reset_counter); |
- | 1378 | ||
1308 | 1379 | /* |
|
1309 | /* |
1380 | * Wakeup waiting processes so that the reset work item |
1310 | * Wakeup waiting processes so they don't hang |
1381 | * doesn't deadlock trying to grab various locks. |
1311 | */ |
1382 | */ |
Line 1577... | Line 1648... | ||
1577 | * duration to 2ms (which is the minimum in the Display Port spec) |
1648 | * duration to 2ms (which is the minimum in the Display Port spec) |
1578 | * |
1649 | * |
1579 | * This register is the same on all known PCH chips. |
1650 | * This register is the same on all known PCH chips. |
1580 | */ |
1651 | */ |
Line 1581... | Line 1652... | ||
1581 | 1652 | ||
1582 | static void ironlake_enable_pch_hotplug(struct drm_device *dev) |
1653 | static void ibx_enable_hotplug(struct drm_device *dev) |
1583 | { |
1654 | { |
1584 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
1655 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
Line 1585... | Line 1656... | ||
1585 | u32 hotplug; |
1656 | u32 hotplug; |
Line 1590... | Line 1661... | ||
1590 | hotplug |= PORTC_HOTPLUG_ENABLE | PORTC_PULSE_DURATION_2ms; |
1661 | hotplug |= PORTC_HOTPLUG_ENABLE | PORTC_PULSE_DURATION_2ms; |
1591 | hotplug |= PORTB_HOTPLUG_ENABLE | PORTB_PULSE_DURATION_2ms; |
1662 | hotplug |= PORTB_HOTPLUG_ENABLE | PORTB_PULSE_DURATION_2ms; |
1592 | I915_WRITE(PCH_PORT_HOTPLUG, hotplug); |
1663 | I915_WRITE(PCH_PORT_HOTPLUG, hotplug); |
1593 | } |
1664 | } |
Line -... | Line 1665... | ||
- | 1665 | ||
- | 1666 | static void ibx_irq_postinstall(struct drm_device *dev) |
|
- | 1667 | { |
|
- | 1668 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
|
- | 1669 | u32 mask; |
|
- | 1670 | ||
- | 1671 | if (HAS_PCH_IBX(dev)) |
|
- | 1672 | mask = SDE_HOTPLUG_MASK | |
|
- | 1673 | SDE_GMBUS | |
|
- | 1674 | SDE_AUX_MASK; |
|
- | 1675 | else |
|
- | 1676 | mask = SDE_HOTPLUG_MASK_CPT | |
|
- | 1677 | SDE_GMBUS_CPT | |
|
- | 1678 | SDE_AUX_MASK_CPT; |
|
- | 1679 | ||
- | 1680 | I915_WRITE(SDEIIR, I915_READ(SDEIIR)); |
|
- | 1681 | I915_WRITE(SDEIMR, ~mask); |
|
- | 1682 | I915_WRITE(SDEIER, mask); |
|
- | 1683 | POSTING_READ(SDEIER); |
|
- | 1684 | ||
- | 1685 | ibx_enable_hotplug(dev); |
|
- | 1686 | } |
|
1594 | 1687 | ||
1595 | static int ironlake_irq_postinstall(struct drm_device *dev) |
1688 | static int ironlake_irq_postinstall(struct drm_device *dev) |
1596 | { |
1689 | { |
1597 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
1690 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
1598 | /* enable kind of interrupts always enabled */ |
1691 | /* enable kind of interrupts always enabled */ |
1599 | u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT | |
1692 | u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT | |
- | 1693 | DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE | |
|
1600 | DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE; |
1694 | DE_AUX_CHANNEL_A; |
1601 | u32 render_irqs; |
- | |
Line 1602... | Line 1695... | ||
1602 | u32 hotplug_mask; |
1695 | u32 render_irqs; |
Line 1603... | Line 1696... | ||
1603 | 1696 | ||
1604 | dev_priv->irq_mask = ~display_mask; |
1697 | dev_priv->irq_mask = ~display_mask; |
Line 1625... | Line 1718... | ||
1625 | GT_PIPE_NOTIFY | |
1718 | GT_PIPE_NOTIFY | |
1626 | GT_BSD_USER_INTERRUPT; |
1719 | GT_BSD_USER_INTERRUPT; |
1627 | I915_WRITE(GTIER, render_irqs); |
1720 | I915_WRITE(GTIER, render_irqs); |
1628 | POSTING_READ(GTIER); |
1721 | POSTING_READ(GTIER); |
Line 1629... | Line 1722... | ||
1629 | 1722 | ||
1630 | if (HAS_PCH_CPT(dev)) { |
- | |
1631 | hotplug_mask = (SDE_CRT_HOTPLUG_CPT | |
- | |
1632 | SDE_PORTB_HOTPLUG_CPT | |
- | |
1633 | SDE_PORTC_HOTPLUG_CPT | |
- | |
1634 | SDE_PORTD_HOTPLUG_CPT); |
- | |
1635 | } else { |
- | |
1636 | hotplug_mask = (SDE_CRT_HOTPLUG | |
- | |
1637 | SDE_PORTB_HOTPLUG | |
- | |
1638 | SDE_PORTC_HOTPLUG | |
- | |
1639 | SDE_PORTD_HOTPLUG | |
- | |
1640 | SDE_AUX_MASK); |
- | |
1641 | } |
- | |
1642 | - | ||
1643 | dev_priv->pch_irq_mask = ~hotplug_mask; |
- | |
1644 | - | ||
1645 | I915_WRITE(SDEIIR, I915_READ(SDEIIR)); |
- | |
1646 | I915_WRITE(SDEIMR, dev_priv->pch_irq_mask); |
- | |
1647 | I915_WRITE(SDEIER, hotplug_mask); |
- | |
1648 | POSTING_READ(SDEIER); |
- | |
1649 | - | ||
Line 1650... | Line 1723... | ||
1650 | // ironlake_enable_pch_hotplug(dev); |
1723 | ibx_irq_postinstall(dev); |
1651 | 1724 | ||
1652 | if (IS_IRONLAKE_M(dev)) { |
1725 | if (IS_IRONLAKE_M(dev)) { |
1653 | /* Clear & enable PCU event interrupts */ |
1726 | /* Clear & enable PCU event interrupts */ |
1654 | I915_WRITE(DEIIR, DE_PCU_EVENT); |
1727 | I915_WRITE(DEIIR, DE_PCU_EVENT); |
1655 | I915_WRITE(DEIER, I915_READ(DEIER) | DE_PCU_EVENT); |
1728 | I915_WRITE(DEIER, I915_READ(DEIER) | DE_PCU_EVENT); |
Line 1656... | Line 1729... | ||
1656 | // ironlake_enable_display_irq(dev_priv, DE_PCU_EVENT); |
1729 | ironlake_enable_display_irq(dev_priv, DE_PCU_EVENT); |
1657 | } |
1730 | } |
Line 1665... | Line 1738... | ||
1665 | /* enable kind of interrupts always enabled */ |
1738 | /* enable kind of interrupts always enabled */ |
1666 | u32 display_mask = |
1739 | u32 display_mask = |
1667 | DE_MASTER_IRQ_CONTROL | DE_GSE_IVB | DE_PCH_EVENT_IVB | |
1740 | DE_MASTER_IRQ_CONTROL | DE_GSE_IVB | DE_PCH_EVENT_IVB | |
1668 | DE_PLANEC_FLIP_DONE_IVB | |
1741 | DE_PLANEC_FLIP_DONE_IVB | |
1669 | DE_PLANEB_FLIP_DONE_IVB | |
1742 | DE_PLANEB_FLIP_DONE_IVB | |
1670 | DE_PLANEA_FLIP_DONE_IVB; |
1743 | DE_PLANEA_FLIP_DONE_IVB | |
- | 1744 | DE_AUX_CHANNEL_A_IVB; |
|
1671 | u32 render_irqs; |
1745 | u32 render_irqs; |
1672 | u32 hotplug_mask; |
- | |
Line 1673... | Line 1746... | ||
1673 | 1746 | ||
Line 1674... | Line 1747... | ||
1674 | dev_priv->irq_mask = ~display_mask; |
1747 | dev_priv->irq_mask = ~display_mask; |
1675 | 1748 | ||
Line 1691... | Line 1764... | ||
1691 | render_irqs = GT_USER_INTERRUPT | GEN6_BSD_USER_INTERRUPT | |
1764 | render_irqs = GT_USER_INTERRUPT | GEN6_BSD_USER_INTERRUPT | |
1692 | GEN6_BLITTER_USER_INTERRUPT | GT_GEN7_L3_PARITY_ERROR_INTERRUPT; |
1765 | GEN6_BLITTER_USER_INTERRUPT | GT_GEN7_L3_PARITY_ERROR_INTERRUPT; |
1693 | I915_WRITE(GTIER, render_irqs); |
1766 | I915_WRITE(GTIER, render_irqs); |
1694 | POSTING_READ(GTIER); |
1767 | POSTING_READ(GTIER); |
Line 1695... | Line -... | ||
1695 | - | ||
1696 | hotplug_mask = (SDE_CRT_HOTPLUG_CPT | |
- | |
1697 | SDE_PORTB_HOTPLUG_CPT | |
- | |
1698 | SDE_PORTC_HOTPLUG_CPT | |
- | |
1699 | SDE_PORTD_HOTPLUG_CPT); |
- | |
1700 | dev_priv->pch_irq_mask = ~hotplug_mask; |
- | |
1701 | - | ||
1702 | I915_WRITE(SDEIIR, I915_READ(SDEIIR)); |
- | |
1703 | I915_WRITE(SDEIMR, dev_priv->pch_irq_mask); |
- | |
1704 | I915_WRITE(SDEIER, hotplug_mask); |
- | |
1705 | POSTING_READ(SDEIER); |
- | |
1706 | 1768 | ||
Line 1707... | Line 1769... | ||
1707 | // ironlake_enable_pch_hotplug(dev); |
1769 | ibx_irq_postinstall(dev); |
1708 | 1770 | ||
Line 1709... | Line 1771... | ||
1709 | return 0; |
1771 | return 0; |
1710 | } |
1772 | } |
1711 | 1773 | ||
1712 | static int valleyview_irq_postinstall(struct drm_device *dev) |
1774 | static int valleyview_irq_postinstall(struct drm_device *dev) |
1713 | { |
- | |
1714 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
1775 | { |
1715 | u32 enable_mask; |
1776 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
1716 | u32 hotplug_en = I915_READ(PORT_HOTPLUG_EN); |
1777 | u32 enable_mask; |
Line 1717... | Line 1778... | ||
1717 | u32 pipestat_enable = PLANE_FLIP_DONE_INT_EN_VLV; |
1778 | u32 pipestat_enable = PLANE_FLIP_DONE_INT_EN_VLV; |
Line 1740... | Line 1801... | ||
1740 | // pci_read_config_word(dev->pdev, 0x98, &msid); |
1801 | // pci_read_config_word(dev->pdev, 0x98, &msid); |
1741 | // msid &= 0xff; /* mask out delivery bits */ |
1802 | // msid &= 0xff; /* mask out delivery bits */ |
1742 | // msid |= (1<<14); |
1803 | // msid |= (1<<14); |
1743 | // pci_write_config_word(dev_priv->dev->pdev, 0x98, msid); |
1804 | // pci_write_config_word(dev_priv->dev->pdev, 0x98, msid); |
Line -... | Line 1805... | ||
- | 1805 | ||
- | 1806 | I915_WRITE(PORT_HOTPLUG_EN, 0); |
|
- | 1807 | POSTING_READ(PORT_HOTPLUG_EN); |
|
1744 | 1808 | ||
1745 | I915_WRITE(VLV_IMR, dev_priv->irq_mask); |
1809 | I915_WRITE(VLV_IMR, dev_priv->irq_mask); |
1746 | I915_WRITE(VLV_IER, enable_mask); |
1810 | I915_WRITE(VLV_IER, enable_mask); |
1747 | I915_WRITE(VLV_IIR, 0xffffffff); |
1811 | I915_WRITE(VLV_IIR, 0xffffffff); |
1748 | I915_WRITE(PIPESTAT(0), 0xffff); |
1812 | I915_WRITE(PIPESTAT(0), 0xffff); |
1749 | I915_WRITE(PIPESTAT(1), 0xffff); |
1813 | I915_WRITE(PIPESTAT(1), 0xffff); |
Line 1750... | Line 1814... | ||
1750 | POSTING_READ(VLV_IER); |
1814 | POSTING_READ(VLV_IER); |
- | 1815 | ||
1751 | 1816 | i915_enable_pipestat(dev_priv, 0, pipestat_enable); |
|
Line 1752... | Line 1817... | ||
1752 | i915_enable_pipestat(dev_priv, 0, pipestat_enable); |
1817 | i915_enable_pipestat(dev_priv, 0, PIPE_GMBUS_EVENT_ENABLE); |
1753 | i915_enable_pipestat(dev_priv, 1, pipestat_enable); |
1818 | i915_enable_pipestat(dev_priv, 1, pipestat_enable); |
Line 1768... | Line 1833... | ||
1768 | I915_WRITE(DPINVGTT, DPINVGTT_STATUS_MASK); |
1833 | I915_WRITE(DPINVGTT, DPINVGTT_STATUS_MASK); |
1769 | I915_WRITE(DPINVGTT, DPINVGTT_EN_MASK); |
1834 | I915_WRITE(DPINVGTT, DPINVGTT_EN_MASK); |
1770 | #endif |
1835 | #endif |
Line 1771... | Line 1836... | ||
1771 | 1836 | ||
- | 1837 | I915_WRITE(VLV_MASTER_IER, MASTER_INTERRUPT_ENABLE); |
|
- | 1838 | ||
- | 1839 | return 0; |
|
- | 1840 | } |
|
1772 | I915_WRITE(VLV_MASTER_IER, MASTER_INTERRUPT_ENABLE); |
1841 | |
- | 1842 | static void valleyview_hpd_irq_setup(struct drm_device *dev) |
|
- | 1843 | { |
|
- | 1844 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
|
- | 1845 | u32 hotplug_en = I915_READ(PORT_HOTPLUG_EN); |
|
1773 | #if 0 /* FIXME: check register definitions; some have moved */ |
1846 | |
1774 | /* Note HDMI and DP share bits */ |
1847 | /* Note HDMI and DP share bits */ |
1775 | if (dev_priv->hotplug_supported_mask & HDMIB_HOTPLUG_INT_STATUS) |
1848 | if (dev_priv->hotplug_supported_mask & PORTB_HOTPLUG_INT_STATUS) |
1776 | hotplug_en |= HDMIB_HOTPLUG_INT_EN; |
1849 | hotplug_en |= PORTB_HOTPLUG_INT_EN; |
1777 | if (dev_priv->hotplug_supported_mask & HDMIC_HOTPLUG_INT_STATUS) |
1850 | if (dev_priv->hotplug_supported_mask & PORTC_HOTPLUG_INT_STATUS) |
1778 | hotplug_en |= HDMIC_HOTPLUG_INT_EN; |
1851 | hotplug_en |= PORTC_HOTPLUG_INT_EN; |
1779 | if (dev_priv->hotplug_supported_mask & HDMID_HOTPLUG_INT_STATUS) |
1852 | if (dev_priv->hotplug_supported_mask & PORTD_HOTPLUG_INT_STATUS) |
1780 | hotplug_en |= HDMID_HOTPLUG_INT_EN; |
1853 | hotplug_en |= PORTD_HOTPLUG_INT_EN; |
1781 | if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS_I915) |
1854 | if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS_I915) |
1782 | hotplug_en |= SDVOC_HOTPLUG_INT_EN; |
1855 | hotplug_en |= SDVOC_HOTPLUG_INT_EN; |
1783 | if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS_I915) |
1856 | if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS_I915) |
1784 | hotplug_en |= SDVOB_HOTPLUG_INT_EN; |
1857 | hotplug_en |= SDVOB_HOTPLUG_INT_EN; |
1785 | if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS) { |
1858 | if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS) { |
1786 | hotplug_en |= CRT_HOTPLUG_INT_EN; |
1859 | hotplug_en |= CRT_HOTPLUG_INT_EN; |
1787 | hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50; |
1860 | hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50; |
1788 | } |
- | |
Line 1789... | Line 1861... | ||
1789 | #endif |
1861 | } |
1790 | - | ||
1791 | I915_WRITE(PORT_HOTPLUG_EN, hotplug_en); |
- | |
1792 | 1862 | ||
Line 1793... | Line 1863... | ||
1793 | return 0; |
1863 | I915_WRITE(PORT_HOTPLUG_EN, hotplug_en); |
1794 | } |
1864 | } |
1795 | 1865 | ||
Line 2020... | Line 2090... | ||
2020 | I915_ASLE_INTERRUPT | |
2090 | I915_ASLE_INTERRUPT | |
2021 | I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | |
2091 | I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | |
2022 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT | |
2092 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT | |
2023 | I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT | |
2093 | I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT | |
2024 | I915_USER_INTERRUPT; |
2094 | I915_USER_INTERRUPT; |
2025 | #if 0 |
2095 | |
2026 | if (I915_HAS_HOTPLUG(dev)) { |
2096 | if (I915_HAS_HOTPLUG(dev)) { |
- | 2097 | I915_WRITE(PORT_HOTPLUG_EN, 0); |
|
- | 2098 | POSTING_READ(PORT_HOTPLUG_EN); |
|
- | 2099 | ||
2027 | /* Enable in IER... */ |
2100 | /* Enable in IER... */ |
2028 | enable_mask |= I915_DISPLAY_PORT_INTERRUPT; |
2101 | enable_mask |= I915_DISPLAY_PORT_INTERRUPT; |
2029 | /* and unmask in IMR */ |
2102 | /* and unmask in IMR */ |
2030 | dev_priv->irq_mask &= ~I915_DISPLAY_PORT_INTERRUPT; |
2103 | dev_priv->irq_mask &= ~I915_DISPLAY_PORT_INTERRUPT; |
2031 | } |
2104 | } |
2032 | #endif |
- | |
Line 2033... | Line 2105... | ||
2033 | 2105 | ||
2034 | I915_WRITE(IMR, dev_priv->irq_mask); |
2106 | I915_WRITE(IMR, dev_priv->irq_mask); |
2035 | I915_WRITE(IER, enable_mask); |
2107 | I915_WRITE(IER, enable_mask); |
Line -... | Line 2108... | ||
- | 2108 | POSTING_READ(IER); |
|
- | 2109 | ||
- | 2110 | // intel_opregion_enable_asle(dev); |
|
- | 2111 | ||
- | 2112 | return 0; |
|
- | 2113 | } |
|
- | 2114 | ||
- | 2115 | static void i915_hpd_irq_setup(struct drm_device *dev) |
|
- | 2116 | { |
|
- | 2117 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
|
2036 | POSTING_READ(IER); |
2118 | u32 hotplug_en; |
2037 | 2119 | ||
2038 | if (I915_HAS_HOTPLUG(dev)) { |
2120 | if (I915_HAS_HOTPLUG(dev)) { |
2039 | u32 hotplug_en = I915_READ(PORT_HOTPLUG_EN); |
2121 | hotplug_en = I915_READ(PORT_HOTPLUG_EN); |
2040 | #if 0 |
2122 | |
2041 | if (dev_priv->hotplug_supported_mask & HDMIB_HOTPLUG_INT_STATUS) |
2123 | if (dev_priv->hotplug_supported_mask & PORTB_HOTPLUG_INT_STATUS) |
2042 | hotplug_en |= HDMIB_HOTPLUG_INT_EN; |
2124 | hotplug_en |= PORTB_HOTPLUG_INT_EN; |
2043 | if (dev_priv->hotplug_supported_mask & HDMIC_HOTPLUG_INT_STATUS) |
2125 | if (dev_priv->hotplug_supported_mask & PORTC_HOTPLUG_INT_STATUS) |
2044 | hotplug_en |= HDMIC_HOTPLUG_INT_EN; |
2126 | hotplug_en |= PORTC_HOTPLUG_INT_EN; |
2045 | if (dev_priv->hotplug_supported_mask & HDMID_HOTPLUG_INT_STATUS) |
2127 | if (dev_priv->hotplug_supported_mask & PORTD_HOTPLUG_INT_STATUS) |
2046 | hotplug_en |= HDMID_HOTPLUG_INT_EN; |
2128 | hotplug_en |= PORTD_HOTPLUG_INT_EN; |
2047 | if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS_I915) |
2129 | if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS_I915) |
2048 | hotplug_en |= SDVOC_HOTPLUG_INT_EN; |
2130 | hotplug_en |= SDVOC_HOTPLUG_INT_EN; |
2049 | if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS_I915) |
2131 | if (dev_priv->hotplug_supported_mask & SDVOB_HOTPLUG_INT_STATUS_I915) |
2050 | hotplug_en |= SDVOB_HOTPLUG_INT_EN; |
2132 | hotplug_en |= SDVOB_HOTPLUG_INT_EN; |
2051 | if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS) { |
2133 | if (dev_priv->hotplug_supported_mask & CRT_HOTPLUG_INT_STATUS) { |
2052 | hotplug_en |= CRT_HOTPLUG_INT_EN; |
2134 | hotplug_en |= CRT_HOTPLUG_INT_EN; |
2053 | hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50; |
2135 | hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50; |
2054 | } |
2136 | } |
Line 2055... | Line 2137... | ||
2055 | #endif |
2137 | |
2056 | /* Ignore TV since it's buggy */ |
2138 | /* Ignore TV since it's buggy */ |
2057 | - | ||
2058 | I915_WRITE(PORT_HOTPLUG_EN, hotplug_en); |
- | |
2059 | } |
- | |
2060 | - | ||
2061 | // intel_opregion_enable_asle(dev); |
2139 | |
Line 2062... | Line 2140... | ||
2062 | 2140 | I915_WRITE(PORT_HOTPLUG_EN, hotplug_en); |
|
2063 | return 0; |
2141 | } |
2064 | } |
2142 | } |
Line 2117... | Line 2195... | ||
2117 | (iir & I915_DISPLAY_PORT_INTERRUPT)) { |
2195 | (iir & I915_DISPLAY_PORT_INTERRUPT)) { |
2118 | u32 hotplug_status = I915_READ(PORT_HOTPLUG_STAT); |
2196 | u32 hotplug_status = I915_READ(PORT_HOTPLUG_STAT); |
Line 2119... | Line 2197... | ||
2119 | 2197 | ||
2120 | DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n", |
2198 | DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n", |
2121 | hotplug_status); |
2199 | hotplug_status); |
2122 | // if (hotplug_status & dev_priv->hotplug_supported_mask) |
2200 | if (hotplug_status & dev_priv->hotplug_supported_mask) |
2123 | // queue_work(dev_priv->wq, |
2201 | queue_work(dev_priv->wq, |
Line 2124... | Line 2202... | ||
2124 | // &dev_priv->hotplug_work); |
2202 | &dev_priv->hotplug_work); |
2125 | 2203 | ||
2126 | I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status); |
2204 | I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status); |
Line 2218... | Line 2296... | ||
2218 | } |
2296 | } |
Line 2219... | Line 2297... | ||
2219 | 2297 | ||
2220 | static int i965_irq_postinstall(struct drm_device *dev) |
2298 | static int i965_irq_postinstall(struct drm_device *dev) |
2221 | { |
2299 | { |
2222 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
- | |
2223 | u32 hotplug_en; |
2300 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
2224 | u32 enable_mask; |
2301 | u32 enable_mask; |
Line 2225... | Line 2302... | ||
2225 | u32 error_mask; |
2302 | u32 error_mask; |
2226 | 2303 | ||
Line 2239... | Line 2316... | ||
2239 | if (IS_G4X(dev)) |
2316 | if (IS_G4X(dev)) |
2240 | enable_mask |= I915_BSD_USER_INTERRUPT; |
2317 | enable_mask |= I915_BSD_USER_INTERRUPT; |
Line 2241... | Line 2318... | ||
2241 | 2318 | ||
2242 | dev_priv->pipestat[0] = 0; |
2319 | dev_priv->pipestat[0] = 0; |
- | 2320 | dev_priv->pipestat[1] = 0; |
|
Line 2243... | Line 2321... | ||
2243 | dev_priv->pipestat[1] = 0; |
2321 | i915_enable_pipestat(dev_priv, 0, PIPE_GMBUS_EVENT_ENABLE); |
2244 | 2322 | ||
2245 | /* |
2323 | /* |
2246 | * Enable some error detection, note the instruction error mask |
2324 | * Enable some error detection, note the instruction error mask |
Line 2259... | Line 2337... | ||
2259 | 2337 | ||
2260 | I915_WRITE(IMR, dev_priv->irq_mask); |
2338 | I915_WRITE(IMR, dev_priv->irq_mask); |
2261 | I915_WRITE(IER, enable_mask); |
2339 | I915_WRITE(IER, enable_mask); |
Line -... | Line 2340... | ||
- | 2340 | POSTING_READ(IER); |
|
- | 2341 | ||
- | 2342 | I915_WRITE(PORT_HOTPLUG_EN, 0); |
|
- | 2343 | POSTING_READ(PORT_HOTPLUG_EN); |
|
- | 2344 | ||
- | 2345 | // intel_opregion_enable_asle(dev); |
|
- | 2346 | ||
- | 2347 | return 0; |
|
- | 2348 | } |
|
- | 2349 | ||
- | 2350 | static void i965_hpd_irq_setup(struct drm_device *dev) |
|
- | 2351 | { |
|
- | 2352 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
|
2262 | POSTING_READ(IER); |
2353 | u32 hotplug_en; |
2263 | 2354 | ||
2264 | /* Note HDMI and DP share hotplug bits */ |
- | |
2265 | hotplug_en = 0; |
2355 | /* Note HDMI and DP share hotplug bits */ |
2266 | #if 0 |
2356 | hotplug_en = 0; |
2267 | if (dev_priv->hotplug_supported_mask & HDMIB_HOTPLUG_INT_STATUS) |
2357 | if (dev_priv->hotplug_supported_mask & PORTB_HOTPLUG_INT_STATUS) |
2268 | hotplug_en |= HDMIB_HOTPLUG_INT_EN; |
2358 | hotplug_en |= PORTB_HOTPLUG_INT_EN; |
2269 | if (dev_priv->hotplug_supported_mask & HDMIC_HOTPLUG_INT_STATUS) |
2359 | if (dev_priv->hotplug_supported_mask & PORTC_HOTPLUG_INT_STATUS) |
2270 | hotplug_en |= HDMIC_HOTPLUG_INT_EN; |
2360 | hotplug_en |= PORTC_HOTPLUG_INT_EN; |
2271 | if (dev_priv->hotplug_supported_mask & HDMID_HOTPLUG_INT_STATUS) |
2361 | if (dev_priv->hotplug_supported_mask & PORTD_HOTPLUG_INT_STATUS) |
2272 | hotplug_en |= HDMID_HOTPLUG_INT_EN; |
2362 | hotplug_en |= PORTD_HOTPLUG_INT_EN; |
2273 | if (IS_G4X(dev)) { |
2363 | if (IS_G4X(dev)) { |
2274 | if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS_G4X) |
2364 | if (dev_priv->hotplug_supported_mask & SDVOC_HOTPLUG_INT_STATUS_G4X) |
2275 | hotplug_en |= SDVOC_HOTPLUG_INT_EN; |
2365 | hotplug_en |= SDVOC_HOTPLUG_INT_EN; |
Line 2290... | Line 2380... | ||
2290 | */ |
2380 | */ |
2291 | if (IS_G4X(dev)) |
2381 | if (IS_G4X(dev)) |
2292 | hotplug_en |= CRT_HOTPLUG_ACTIVATION_PERIOD_64; |
2382 | hotplug_en |= CRT_HOTPLUG_ACTIVATION_PERIOD_64; |
2293 | hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50; |
2383 | hotplug_en |= CRT_HOTPLUG_VOLTAGE_COMPARE_50; |
2294 | } |
2384 | } |
2295 | #endif |
2385 | |
2296 | /* Ignore TV since it's buggy */ |
2386 | /* Ignore TV since it's buggy */ |
Line 2297... | Line 2387... | ||
2297 | 2387 | ||
2298 | I915_WRITE(PORT_HOTPLUG_EN, hotplug_en); |
- | |
2299 | - | ||
2300 | // intel_opregion_enable_asle(dev); |
- | |
2301 | - | ||
2302 | return 0; |
2388 | I915_WRITE(PORT_HOTPLUG_EN, hotplug_en); |
Line 2303... | Line 2389... | ||
2303 | } |
2389 | } |
2304 | 2390 | ||
2305 | static irqreturn_t i965_irq_handler(int irq, void *arg) |
2391 | static irqreturn_t i965_irq_handler(int irq, void *arg) |
Line 2356... | Line 2442... | ||
2356 | if (iir & I915_DISPLAY_PORT_INTERRUPT) { |
2442 | if (iir & I915_DISPLAY_PORT_INTERRUPT) { |
2357 | u32 hotplug_status = I915_READ(PORT_HOTPLUG_STAT); |
2443 | u32 hotplug_status = I915_READ(PORT_HOTPLUG_STAT); |
Line 2358... | Line 2444... | ||
2358 | 2444 | ||
2359 | DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n", |
2445 | DRM_DEBUG_DRIVER("hotplug event received, stat 0x%08x\n", |
2360 | hotplug_status); |
2446 | hotplug_status); |
2361 | // if (hotplug_status & dev_priv->hotplug_supported_mask) |
2447 | if (hotplug_status & dev_priv->hotplug_supported_mask) |
2362 | // queue_work(dev_priv->wq, |
2448 | queue_work(dev_priv->wq, |
Line 2363... | Line 2449... | ||
2363 | // &dev_priv->hotplug_work); |
2449 | &dev_priv->hotplug_work); |
2364 | 2450 | ||
2365 | I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status); |
2451 | I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status); |
Line 2393... | Line 2479... | ||
2393 | 2479 | ||
2394 | 2480 | ||
Line -... | Line 2481... | ||
- | 2481 | // if (blc_event || (iir & I915_ASLE_INTERRUPT)) |
|
- | 2482 | // intel_opregion_asle_intr(dev); |
|
- | 2483 | ||
2395 | // if (blc_event || (iir & I915_ASLE_INTERRUPT)) |
2484 | if (pipe_stats[0] & PIPE_GMBUS_INTERRUPT_STATUS) |
2396 | // intel_opregion_asle_intr(dev); |
2485 | gmbus_irq_handler(dev); |
2397 | 2486 | ||
2398 | /* With MSI, interrupts are only generated when iir |
2487 | /* With MSI, interrupts are only generated when iir |
2399 | * transitions from zero to nonzero. If another bit got |
2488 | * transitions from zero to nonzero. If another bit got |
Line 2443... | Line 2532... | ||
2443 | 2532 | ||
2444 | void intel_irq_init(struct drm_device *dev) |
2533 | void intel_irq_init(struct drm_device *dev) |
2445 | { |
2534 | { |
Line -... | Line 2535... | ||
- | 2535 | struct drm_i915_private *dev_priv = dev->dev_private; |
|
- | 2536 | ||
- | 2537 | INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func); |
|
- | 2538 | ||
- | 2539 | // pm_qos_add_request(&dev_priv->pm_qos, PM_QOS_CPU_DMA_LATENCY, PM_QOS_DEFAULT_VALUE); |
|
- | 2540 | ||
2446 | struct drm_i915_private *dev_priv = dev->dev_private; |
2541 | |
2447 | 2542 | ||
2448 | if (IS_VALLEYVIEW(dev)) { |
2543 | if (IS_VALLEYVIEW(dev)) { |
2449 | dev->driver->irq_handler = valleyview_irq_handler; |
2544 | dev->driver->irq_handler = valleyview_irq_handler; |
- | 2545 | dev->driver->irq_preinstall = valleyview_irq_preinstall; |
|
2450 | dev->driver->irq_preinstall = valleyview_irq_preinstall; |
2546 | dev->driver->irq_postinstall = valleyview_irq_postinstall; |
2451 | dev->driver->irq_postinstall = valleyview_irq_postinstall; |
2547 | dev_priv->display.hpd_irq_setup = valleyview_hpd_irq_setup; |
2452 | } else if (IS_IVYBRIDGE(dev)) { |
2548 | } else if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) { |
2453 | /* Share pre & uninstall handlers with ILK/SNB */ |
2549 | /* Share pre & uninstall handlers with ILK/SNB */ |
2454 | dev->driver->irq_handler = ivybridge_irq_handler; |
2550 | dev->driver->irq_handler = ivybridge_irq_handler; |
2455 | dev->driver->irq_preinstall = ironlake_irq_preinstall; |
- | |
2456 | dev->driver->irq_postinstall = ivybridge_irq_postinstall; |
- | |
2457 | } else if (IS_HASWELL(dev)) { |
- | |
2458 | /* Share interrupts handling with IVB */ |
- | |
2459 | dev->driver->irq_handler = ivybridge_irq_handler; |
- | |
2460 | dev->driver->irq_preinstall = ironlake_irq_preinstall; |
2551 | dev->driver->irq_preinstall = ironlake_irq_preinstall; |
2461 | dev->driver->irq_postinstall = ivybridge_irq_postinstall; |
2552 | dev->driver->irq_postinstall = ivybridge_irq_postinstall; |
2462 | } else if (HAS_PCH_SPLIT(dev)) { |
2553 | } else if (HAS_PCH_SPLIT(dev)) { |
2463 | dev->driver->irq_handler = ironlake_irq_handler; |
2554 | dev->driver->irq_handler = ironlake_irq_handler; |
2464 | dev->driver->irq_preinstall = ironlake_irq_preinstall; |
2555 | dev->driver->irq_preinstall = ironlake_irq_preinstall; |
2465 | dev->driver->irq_postinstall = ironlake_irq_postinstall; |
2556 | dev->driver->irq_postinstall = ironlake_irq_postinstall; |
2466 | } else { |
2557 | } else { |
2467 | if (INTEL_INFO(dev)->gen == 2) { |
2558 | if (INTEL_INFO(dev)->gen == 2) { |
2468 | } else if (INTEL_INFO(dev)->gen == 3) { |
2559 | } else if (INTEL_INFO(dev)->gen == 3) { |
2469 | dev->driver->irq_preinstall = i915_irq_preinstall; |
2560 | dev->driver->irq_preinstall = i915_irq_preinstall; |
- | 2561 | dev->driver->irq_postinstall = i915_irq_postinstall; |
|
2470 | dev->driver->irq_postinstall = i915_irq_postinstall; |
2562 | dev->driver->irq_handler = i915_irq_handler; |
2471 | dev->driver->irq_handler = i915_irq_handler; |
2563 | dev_priv->display.hpd_irq_setup = i915_hpd_irq_setup; |
2472 | } else { |
2564 | } else { |
2473 | dev->driver->irq_preinstall = i965_irq_preinstall; |
2565 | dev->driver->irq_preinstall = i965_irq_preinstall; |
- | 2566 | dev->driver->irq_postinstall = i965_irq_postinstall; |
|
- | 2567 | dev->driver->irq_handler = i965_irq_handler; |
|
2474 | dev->driver->irq_postinstall = i965_irq_postinstall; |
2568 | dev_priv->display.hpd_irq_setup = i965_hpd_irq_setup; |
2475 | dev->driver->irq_handler = i965_irq_handler; |
2569 | } |
Line -... | Line 2570... | ||
- | 2570 | } |
|
- | 2571 | } |
|
2476 | } |
2572 | |
- | 2573 | void intel_hpd_init(struct drm_device *dev) |
|
- | 2574 | { |
|
- | 2575 | struct drm_i915_private *dev_priv = dev->dev_private; |
|
2477 | } |
2576 | |
Line -... | Line 2577... | ||
- | 2577 | if (dev_priv->display.hpd_irq_setup) |
|
2478 | 2578 | dev_priv->display.hpd_irq_setup(dev); |
|
2479 | // printf("device %p driver %p handler %p\n", dev, dev->driver, dev->driver->irq_handler) ; |
2579 | } |
Line 2480... | Line 2580... | ||
2480 | } |
2580 |