Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9d34e5db authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Enable irq to trace batch buffer completion.



If we trigger a tracepoint for batch buffer submission, it is a reasonable
assumption that we wish to also trace the batch buffer completion. So in
order to capture the completion events, we need to enable irqs... However,
we cannot rely on the completion event to disable the irq later, so we
defer the irq disable to the retire request.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
parent 8f0dc5bf
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -1468,6 +1468,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
	spin_lock_init(&dev_priv->user_irq_lock);
	spin_lock_init(&dev_priv->user_irq_lock);
	spin_lock_init(&dev_priv->error_lock);
	spin_lock_init(&dev_priv->error_lock);
	dev_priv->user_irq_refcount = 0;
	dev_priv->user_irq_refcount = 0;
	dev_priv->trace_irq_seqno = 0;


	ret = drm_vblank_init(dev, I915_NUM_PIPE);
	ret = drm_vblank_init(dev, I915_NUM_PIPE);


+2 −0
Original line number Original line Diff line number Diff line
@@ -202,6 +202,7 @@ typedef struct drm_i915_private {
	spinlock_t user_irq_lock;
	spinlock_t user_irq_lock;
	/** Refcount for i915_user_irq_get() versus i915_user_irq_put(). */
	/** Refcount for i915_user_irq_get() versus i915_user_irq_put(). */
	int user_irq_refcount;
	int user_irq_refcount;
	u32 trace_irq_seqno;
	/** Cached value of IMR to avoid reads in updating the bitfield */
	/** Cached value of IMR to avoid reads in updating the bitfield */
	u32 irq_mask_reg;
	u32 irq_mask_reg;
	u32 pipestat[2];
	u32 pipestat[2];
@@ -665,6 +666,7 @@ extern int i915_irq_emit(struct drm_device *dev, void *data,
extern int i915_irq_wait(struct drm_device *dev, void *data,
extern int i915_irq_wait(struct drm_device *dev, void *data,
			 struct drm_file *file_priv);
			 struct drm_file *file_priv);
void i915_user_irq_get(struct drm_device *dev);
void i915_user_irq_get(struct drm_device *dev);
void i915_trace_irq_get(struct drm_device *dev, u32 seqno);
void i915_user_irq_put(struct drm_device *dev);
void i915_user_irq_put(struct drm_device *dev);
extern void i915_enable_interrupt (struct drm_device *dev);
extern void i915_enable_interrupt (struct drm_device *dev);


+7 −1
Original line number Original line Diff line number Diff line
@@ -1770,7 +1770,7 @@ i915_gem_retire_requests(struct drm_device *dev)
	drm_i915_private_t *dev_priv = dev->dev_private;
	drm_i915_private_t *dev_priv = dev->dev_private;
	uint32_t seqno;
	uint32_t seqno;


	if (!dev_priv->hw_status_page)
	if (!dev_priv->hw_status_page || list_empty(&dev_priv->mm.request_list))
		return;
		return;


	seqno = i915_get_gem_seqno(dev);
	seqno = i915_get_gem_seqno(dev);
@@ -1794,6 +1794,12 @@ i915_gem_retire_requests(struct drm_device *dev)
		} else
		} else
			break;
			break;
	}
	}

	if (unlikely (dev_priv->trace_irq_seqno &&
		      i915_seqno_passed(dev_priv->trace_irq_seqno, seqno))) {
		i915_user_irq_put(dev);
		dev_priv->trace_irq_seqno = 0;
	}
}
}


void
void
+10 −0
Original line number Original line Diff line number Diff line
@@ -725,6 +725,16 @@ void i915_user_irq_put(struct drm_device *dev)
	spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags);
	spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags);
}
}


void i915_trace_irq_get(struct drm_device *dev, u32 seqno)
{
	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;

	if (dev_priv->trace_irq_seqno == 0)
		i915_user_irq_get(dev);

	dev_priv->trace_irq_seqno = seqno;
}

static int i915_wait_irq(struct drm_device * dev, int irq_nr)
static int i915_wait_irq(struct drm_device * dev, int irq_nr)
{
{
	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
+1 −0
Original line number Original line Diff line number Diff line
@@ -165,6 +165,7 @@ TRACE_EVENT(i915_gem_request_submit,
	    TP_fast_assign(
	    TP_fast_assign(
			   __entry->dev = dev->primary->index;
			   __entry->dev = dev->primary->index;
			   __entry->seqno = seqno;
			   __entry->seqno = seqno;
			   i915_trace_irq_get(dev, seqno);
			   ),
			   ),


	    TP_printk("dev=%u, seqno=%u", __entry->dev, __entry->seqno)
	    TP_printk("dev=%u, seqno=%u", __entry->dev, __entry->seqno)