diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-05 19:02:01 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-05 19:02:01 -0400 |
| commit | fc1caf6eafb30ea185720e29f7f5eccca61ecd60 (patch) | |
| tree | 666dabc25a9b02e5c05f9eba32fa6b0d8027341a /drivers/gpu/drm/drm_irq.c | |
| parent | 9779714c8af09d57527f18d9aa2207dcc27a8687 (diff) | |
| parent | 96576a9e1a0cdb8a43d3af5846be0948f52b4460 (diff) | |
Merge branch 'drm-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6
* 'drm-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6: (204 commits)
agp: intel-agp: do not use PCI resources before pci_enable_device()
agp: efficeon-agp: do not use PCI resources before pci_enable_device()
drm: kill BKL from common code
drm/kms: Simplify setup of the initial I2C encoder config.
drm,io-mapping: Specify slot to use for atomic mappings
drm/radeon/kms: only expose underscan on avivo chips
drm/radeon: add new pci ids
drm: Cleanup after failing to create master->unique and dev->name
drm/radeon: tone down overchatty acpi debug messages.
drm/radeon/kms: enable underscan option for digital connectors
drm/radeon/kms: fix calculation of h/v scaling factors
drm/radeon/kms/igp: sideport is AMD only
drm/radeon/kms: handle the case of no active displays properly in the bandwidth code
drm: move ttm global code to core drm
drm/i915: Clear the Ironlake dithering flags when the pipe doesn't want it.
drm/radeon/kms: make sure HPD is set to NONE on analog-only connectors
drm/radeon/kms: make sure rio_mem is valid before unmapping it
drm/agp/i915: trim stolen space to 32M
drm/i915: Unset cursor if out-of-bounds upon mode change (v4)
drm/i915: Unreference object not handle on creation
...
Diffstat (limited to 'drivers/gpu/drm/drm_irq.c')
| -rw-r--r-- | drivers/gpu/drm/drm_irq.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index a263b7070fc..9d3a5030b6e 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
| @@ -34,6 +34,7 @@ | |||
| 34 | */ | 34 | */ |
| 35 | 35 | ||
| 36 | #include "drmP.h" | 36 | #include "drmP.h" |
| 37 | #include "drm_trace.h" | ||
| 37 | 38 | ||
| 38 | #include <linux/interrupt.h> /* For task queue support */ | 39 | #include <linux/interrupt.h> /* For task queue support */ |
| 39 | #include <linux/slab.h> | 40 | #include <linux/slab.h> |
| @@ -57,6 +58,9 @@ int drm_irq_by_busid(struct drm_device *dev, void *data, | |||
| 57 | { | 58 | { |
| 58 | struct drm_irq_busid *p = data; | 59 | struct drm_irq_busid *p = data; |
| 59 | 60 | ||
| 61 | if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) | ||
| 62 | return -EINVAL; | ||
| 63 | |||
| 60 | if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) | 64 | if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) |
| 61 | return -EINVAL; | 65 | return -EINVAL; |
| 62 | 66 | ||
| @@ -211,7 +215,7 @@ int drm_irq_install(struct drm_device *dev) | |||
| 211 | if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) | 215 | if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) |
| 212 | return -EINVAL; | 216 | return -EINVAL; |
| 213 | 217 | ||
| 214 | if (dev->pdev->irq == 0) | 218 | if (drm_dev_to_irq(dev) == 0) |
| 215 | return -EINVAL; | 219 | return -EINVAL; |
| 216 | 220 | ||
| 217 | mutex_lock(&dev->struct_mutex); | 221 | mutex_lock(&dev->struct_mutex); |
| @@ -229,7 +233,7 @@ int drm_irq_install(struct drm_device *dev) | |||
| 229 | dev->irq_enabled = 1; | 233 | dev->irq_enabled = 1; |
| 230 | mutex_unlock(&dev->struct_mutex); | 234 | mutex_unlock(&dev->struct_mutex); |
| 231 | 235 | ||
| 232 | DRM_DEBUG("irq=%d\n", dev->pdev->irq); | 236 | DRM_DEBUG("irq=%d\n", drm_dev_to_irq(dev)); |
| 233 | 237 | ||
| 234 | /* Before installing handler */ | 238 | /* Before installing handler */ |
| 235 | dev->driver->irq_preinstall(dev); | 239 | dev->driver->irq_preinstall(dev); |
| @@ -302,14 +306,14 @@ int drm_irq_uninstall(struct drm_device * dev) | |||
| 302 | if (!irq_enabled) | 306 | if (!irq_enabled) |
| 303 | return -EINVAL; | 307 | return -EINVAL; |
| 304 | 308 | ||
| 305 | DRM_DEBUG("irq=%d\n", dev->pdev->irq); | 309 | DRM_DEBUG("irq=%d\n", drm_dev_to_irq(dev)); |
| 306 | 310 | ||
| 307 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 311 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 308 | vga_client_register(dev->pdev, NULL, NULL, NULL); | 312 | vga_client_register(dev->pdev, NULL, NULL, NULL); |
| 309 | 313 | ||
| 310 | dev->driver->irq_uninstall(dev); | 314 | dev->driver->irq_uninstall(dev); |
| 311 | 315 | ||
| 312 | free_irq(dev->pdev->irq, dev); | 316 | free_irq(drm_dev_to_irq(dev), dev); |
| 313 | 317 | ||
| 314 | return 0; | 318 | return 0; |
| 315 | } | 319 | } |
| @@ -341,7 +345,7 @@ int drm_control(struct drm_device *dev, void *data, | |||
| 341 | if (drm_core_check_feature(dev, DRIVER_MODESET)) | 345 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
| 342 | return 0; | 346 | return 0; |
| 343 | if (dev->if_version < DRM_IF_VERSION(1, 2) && | 347 | if (dev->if_version < DRM_IF_VERSION(1, 2) && |
| 344 | ctl->irq != dev->pdev->irq) | 348 | ctl->irq != drm_dev_to_irq(dev)) |
| 345 | return -EINVAL; | 349 | return -EINVAL; |
| 346 | return drm_irq_install(dev); | 350 | return drm_irq_install(dev); |
| 347 | case DRM_UNINST_HANDLER: | 351 | case DRM_UNINST_HANDLER: |
| @@ -587,6 +591,7 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe, | |||
| 587 | return -ENOMEM; | 591 | return -ENOMEM; |
| 588 | 592 | ||
| 589 | e->pipe = pipe; | 593 | e->pipe = pipe; |
| 594 | e->base.pid = current->pid; | ||
| 590 | e->event.base.type = DRM_EVENT_VBLANK; | 595 | e->event.base.type = DRM_EVENT_VBLANK; |
| 591 | e->event.base.length = sizeof e->event; | 596 | e->event.base.length = sizeof e->event; |
| 592 | e->event.user_data = vblwait->request.signal; | 597 | e->event.user_data = vblwait->request.signal; |
| @@ -614,6 +619,9 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe, | |||
| 614 | DRM_DEBUG("event on vblank count %d, current %d, crtc %d\n", | 619 | DRM_DEBUG("event on vblank count %d, current %d, crtc %d\n", |
| 615 | vblwait->request.sequence, seq, pipe); | 620 | vblwait->request.sequence, seq, pipe); |
| 616 | 621 | ||
| 622 | trace_drm_vblank_event_queued(current->pid, pipe, | ||
| 623 | vblwait->request.sequence); | ||
| 624 | |||
| 617 | e->event.sequence = vblwait->request.sequence; | 625 | e->event.sequence = vblwait->request.sequence; |
| 618 | if ((seq - vblwait->request.sequence) <= (1 << 23)) { | 626 | if ((seq - vblwait->request.sequence) <= (1 << 23)) { |
| 619 | e->event.tv_sec = now.tv_sec; | 627 | e->event.tv_sec = now.tv_sec; |
| @@ -621,6 +629,8 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe, | |||
| 621 | drm_vblank_put(dev, e->pipe); | 629 | drm_vblank_put(dev, e->pipe); |
| 622 | list_add_tail(&e->base.link, &e->base.file_priv->event_list); | 630 | list_add_tail(&e->base.link, &e->base.file_priv->event_list); |
| 623 | wake_up_interruptible(&e->base.file_priv->event_wait); | 631 | wake_up_interruptible(&e->base.file_priv->event_wait); |
| 632 | trace_drm_vblank_event_delivered(current->pid, pipe, | ||
| 633 | vblwait->request.sequence); | ||
| 624 | } else { | 634 | } else { |
| 625 | list_add_tail(&e->base.link, &dev->vblank_event_list); | 635 | list_add_tail(&e->base.link, &dev->vblank_event_list); |
| 626 | } | 636 | } |
| @@ -651,7 +661,7 @@ int drm_wait_vblank(struct drm_device *dev, void *data, | |||
| 651 | int ret = 0; | 661 | int ret = 0; |
| 652 | unsigned int flags, seq, crtc; | 662 | unsigned int flags, seq, crtc; |
| 653 | 663 | ||
| 654 | if ((!dev->pdev->irq) || (!dev->irq_enabled)) | 664 | if ((!drm_dev_to_irq(dev)) || (!dev->irq_enabled)) |
| 655 | return -EINVAL; | 665 | return -EINVAL; |
| 656 | 666 | ||
| 657 | if (vblwait->request.type & _DRM_VBLANK_SIGNAL) | 667 | if (vblwait->request.type & _DRM_VBLANK_SIGNAL) |
| @@ -751,9 +761,13 @@ void drm_handle_vblank_events(struct drm_device *dev, int crtc) | |||
| 751 | drm_vblank_put(dev, e->pipe); | 761 | drm_vblank_put(dev, e->pipe); |
| 752 | list_move_tail(&e->base.link, &e->base.file_priv->event_list); | 762 | list_move_tail(&e->base.link, &e->base.file_priv->event_list); |
| 753 | wake_up_interruptible(&e->base.file_priv->event_wait); | 763 | wake_up_interruptible(&e->base.file_priv->event_wait); |
| 764 | trace_drm_vblank_event_delivered(e->base.pid, e->pipe, | ||
| 765 | e->event.sequence); | ||
| 754 | } | 766 | } |
| 755 | 767 | ||
| 756 | spin_unlock_irqrestore(&dev->event_lock, flags); | 768 | spin_unlock_irqrestore(&dev->event_lock, flags); |
| 769 | |||
| 770 | trace_drm_vblank_event(crtc, seq); | ||
| 757 | } | 771 | } |
| 758 | 772 | ||
| 759 | /** | 773 | /** |
