diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_dma.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_trace.h | 1 |
5 files changed, 21 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 45d507ebd3ff..92aeb918e0c0 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -1468,6 +1468,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1468 | spin_lock_init(&dev_priv->user_irq_lock); | 1468 | spin_lock_init(&dev_priv->user_irq_lock); |
| 1469 | spin_lock_init(&dev_priv->error_lock); | 1469 | spin_lock_init(&dev_priv->error_lock); |
| 1470 | dev_priv->user_irq_refcount = 0; | 1470 | dev_priv->user_irq_refcount = 0; |
| 1471 | dev_priv->trace_irq_seqno = 0; | ||
| 1471 | 1472 | ||
| 1472 | ret = drm_vblank_init(dev, I915_NUM_PIPE); | 1473 | ret = drm_vblank_init(dev, I915_NUM_PIPE); |
| 1473 | 1474 | ||
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index b24b2d145b75..6035d3dae851 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -202,6 +202,7 @@ typedef struct drm_i915_private { | |||
| 202 | spinlock_t user_irq_lock; | 202 | spinlock_t user_irq_lock; |
| 203 | /** Refcount for i915_user_irq_get() versus i915_user_irq_put(). */ | 203 | /** Refcount for i915_user_irq_get() versus i915_user_irq_put(). */ |
| 204 | int user_irq_refcount; | 204 | int user_irq_refcount; |
| 205 | u32 trace_irq_seqno; | ||
| 205 | /** Cached value of IMR to avoid reads in updating the bitfield */ | 206 | /** Cached value of IMR to avoid reads in updating the bitfield */ |
| 206 | u32 irq_mask_reg; | 207 | u32 irq_mask_reg; |
| 207 | u32 pipestat[2]; | 208 | u32 pipestat[2]; |
| @@ -665,6 +666,7 @@ extern int i915_irq_emit(struct drm_device *dev, void *data, | |||
| 665 | extern int i915_irq_wait(struct drm_device *dev, void *data, | 666 | extern int i915_irq_wait(struct drm_device *dev, void *data, |
| 666 | struct drm_file *file_priv); | 667 | struct drm_file *file_priv); |
| 667 | void i915_user_irq_get(struct drm_device *dev); | 668 | void i915_user_irq_get(struct drm_device *dev); |
| 669 | void i915_trace_irq_get(struct drm_device *dev, u32 seqno); | ||
| 668 | void i915_user_irq_put(struct drm_device *dev); | 670 | void i915_user_irq_put(struct drm_device *dev); |
| 669 | extern void i915_enable_interrupt (struct drm_device *dev); | 671 | extern void i915_enable_interrupt (struct drm_device *dev); |
| 670 | 672 | ||
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index b5f9df230d09..abfc27b0c2ea 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -1770,7 +1770,7 @@ i915_gem_retire_requests(struct drm_device *dev) | |||
| 1770 | drm_i915_private_t *dev_priv = dev->dev_private; | 1770 | drm_i915_private_t *dev_priv = dev->dev_private; |
| 1771 | uint32_t seqno; | 1771 | uint32_t seqno; |
| 1772 | 1772 | ||
| 1773 | if (!dev_priv->hw_status_page) | 1773 | if (!dev_priv->hw_status_page || list_empty(&dev_priv->mm.request_list)) |
| 1774 | return; | 1774 | return; |
| 1775 | 1775 | ||
| 1776 | seqno = i915_get_gem_seqno(dev); | 1776 | seqno = i915_get_gem_seqno(dev); |
| @@ -1794,6 +1794,12 @@ i915_gem_retire_requests(struct drm_device *dev) | |||
| 1794 | } else | 1794 | } else |
| 1795 | break; | 1795 | break; |
| 1796 | } | 1796 | } |
| 1797 | |||
| 1798 | if (unlikely (dev_priv->trace_irq_seqno && | ||
| 1799 | i915_seqno_passed(dev_priv->trace_irq_seqno, seqno))) { | ||
| 1800 | i915_user_irq_put(dev); | ||
| 1801 | dev_priv->trace_irq_seqno = 0; | ||
| 1802 | } | ||
| 1797 | } | 1803 | } |
| 1798 | 1804 | ||
| 1799 | void | 1805 | void |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 4dfeec7cdd42..c3ceffa46ea0 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -725,6 +725,16 @@ void i915_user_irq_put(struct drm_device *dev) | |||
| 725 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); | 725 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); |
| 726 | } | 726 | } |
| 727 | 727 | ||
| 728 | void i915_trace_irq_get(struct drm_device *dev, u32 seqno) | ||
| 729 | { | ||
| 730 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | ||
| 731 | |||
| 732 | if (dev_priv->trace_irq_seqno == 0) | ||
| 733 | i915_user_irq_get(dev); | ||
| 734 | |||
| 735 | dev_priv->trace_irq_seqno = seqno; | ||
| 736 | } | ||
| 737 | |||
| 728 | static int i915_wait_irq(struct drm_device * dev, int irq_nr) | 738 | static int i915_wait_irq(struct drm_device * dev, int irq_nr) |
| 729 | { | 739 | { |
| 730 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 740 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
diff --git a/drivers/gpu/drm/i915/i915_trace.h b/drivers/gpu/drm/i915/i915_trace.h index 908b3c4d8cf7..01840d9bc38f 100644 --- a/drivers/gpu/drm/i915/i915_trace.h +++ b/drivers/gpu/drm/i915/i915_trace.h | |||
| @@ -165,6 +165,7 @@ TRACE_EVENT(i915_gem_request_submit, | |||
| 165 | TP_fast_assign( | 165 | TP_fast_assign( |
| 166 | __entry->dev = dev->primary->index; | 166 | __entry->dev = dev->primary->index; |
| 167 | __entry->seqno = seqno; | 167 | __entry->seqno = seqno; |
| 168 | i915_trace_irq_get(dev, seqno); | ||
| 168 | ), | 169 | ), |
| 169 | 170 | ||
| 170 | TP_printk("dev=%u, seqno=%u", __entry->dev, __entry->seqno) | 171 | TP_printk("dev=%u, seqno=%u", __entry->dev, __entry->seqno) |
