Commit 1b7744e7 authored by Chris Wilson's avatar Chris Wilson

drm/i915: Use HWS for seqno tracking everywhere

By using the same address for storing the HWS on every platform, we can
remove the platform specific vfuncs and reduce the get-seqno routine to
a single read of a cached memory location.

v2: Fix semaphore_passed() to look at the signaling engine (not the
waiter's)
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1467390209-3576-8-git-send-email-chris@chris-wilson.co.uk
parent f69a02c9
...@@ -662,7 +662,7 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data) ...@@ -662,7 +662,7 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data)
engine->name, engine->name,
i915_gem_request_get_seqno(work->flip_queued_req), i915_gem_request_get_seqno(work->flip_queued_req),
dev_priv->next_seqno, dev_priv->next_seqno,
engine->get_seqno(engine), intel_engine_get_seqno(engine),
i915_gem_request_completed(work->flip_queued_req)); i915_gem_request_completed(work->flip_queued_req));
} else } else
seq_printf(m, "Flip not associated with any ring\n"); seq_printf(m, "Flip not associated with any ring\n");
...@@ -792,7 +792,7 @@ static void i915_ring_seqno_info(struct seq_file *m, ...@@ -792,7 +792,7 @@ static void i915_ring_seqno_info(struct seq_file *m,
struct rb_node *rb; struct rb_node *rb;
seq_printf(m, "Current sequence (%s): %x\n", seq_printf(m, "Current sequence (%s): %x\n",
engine->name, engine->get_seqno(engine)); engine->name, intel_engine_get_seqno(engine));
seq_printf(m, "Current user interrupts (%s): %x\n", seq_printf(m, "Current user interrupts (%s): %x\n",
engine->name, READ_ONCE(engine->user_interrupts)); engine->name, READ_ONCE(engine->user_interrupts));
...@@ -1420,7 +1420,7 @@ static int i915_hangcheck_info(struct seq_file *m, void *unused) ...@@ -1420,7 +1420,7 @@ static int i915_hangcheck_info(struct seq_file *m, void *unused)
for_each_engine_id(engine, dev_priv, id) { for_each_engine_id(engine, dev_priv, id) {
acthd[id] = intel_ring_get_active_head(engine); acthd[id] = intel_ring_get_active_head(engine);
seqno[id] = engine->get_seqno(engine); seqno[id] = intel_engine_get_seqno(engine);
} }
i915_get_extra_instdone(dev_priv, instdone); i915_get_extra_instdone(dev_priv, instdone);
......
...@@ -3289,13 +3289,13 @@ i915_seqno_passed(uint32_t seq1, uint32_t seq2) ...@@ -3289,13 +3289,13 @@ i915_seqno_passed(uint32_t seq1, uint32_t seq2)
static inline bool i915_gem_request_started(const struct drm_i915_gem_request *req) static inline bool i915_gem_request_started(const struct drm_i915_gem_request *req)
{ {
return i915_seqno_passed(req->engine->get_seqno(req->engine), return i915_seqno_passed(intel_engine_get_seqno(req->engine),
req->previous_seqno); req->previous_seqno);
} }
static inline bool i915_gem_request_completed(const struct drm_i915_gem_request *req) static inline bool i915_gem_request_completed(const struct drm_i915_gem_request *req)
{ {
return i915_seqno_passed(req->engine->get_seqno(req->engine), return i915_seqno_passed(intel_engine_get_seqno(req->engine),
req->seqno); req->seqno);
} }
......
...@@ -984,7 +984,7 @@ static void i915_record_ring_state(struct drm_i915_private *dev_priv, ...@@ -984,7 +984,7 @@ static void i915_record_ring_state(struct drm_i915_private *dev_priv,
ering->waiting = intel_engine_has_waiter(engine); ering->waiting = intel_engine_has_waiter(engine);
ering->instpm = I915_READ(RING_INSTPM(engine->mmio_base)); ering->instpm = I915_READ(RING_INSTPM(engine->mmio_base));
ering->acthd = intel_ring_get_active_head(engine); ering->acthd = intel_ring_get_active_head(engine);
ering->seqno = engine->get_seqno(engine); ering->seqno = intel_engine_get_seqno(engine);
ering->last_seqno = engine->last_submitted_seqno; ering->last_seqno = engine->last_submitted_seqno;
ering->start = I915_READ_START(engine); ering->start = I915_READ_START(engine);
ering->head = I915_READ_HEAD(engine); ering->head = I915_READ_HEAD(engine);
......
...@@ -2952,7 +2952,7 @@ static int semaphore_passed(struct intel_engine_cs *engine) ...@@ -2952,7 +2952,7 @@ static int semaphore_passed(struct intel_engine_cs *engine)
if (signaller->hangcheck.deadlock >= I915_NUM_ENGINES) if (signaller->hangcheck.deadlock >= I915_NUM_ENGINES)
return -1; return -1;
if (i915_seqno_passed(signaller->get_seqno(signaller), seqno)) if (i915_seqno_passed(intel_engine_get_seqno(signaller), seqno))
return 1; return 1;
/* cursory check for an unkickable deadlock */ /* cursory check for an unkickable deadlock */
...@@ -3140,7 +3140,7 @@ static void i915_hangcheck_elapsed(struct work_struct *work) ...@@ -3140,7 +3140,7 @@ static void i915_hangcheck_elapsed(struct work_struct *work)
engine->irq_seqno_barrier(engine); engine->irq_seqno_barrier(engine);
acthd = intel_ring_get_active_head(engine); acthd = intel_ring_get_active_head(engine);
seqno = engine->get_seqno(engine); seqno = intel_engine_get_seqno(engine);
/* Reset stuck interrupts between batch advances */ /* Reset stuck interrupts between batch advances */
user_interrupts = 0; user_interrupts = 0;
......
...@@ -558,7 +558,7 @@ TRACE_EVENT(i915_gem_request_notify, ...@@ -558,7 +558,7 @@ TRACE_EVENT(i915_gem_request_notify,
TP_fast_assign( TP_fast_assign(
__entry->dev = engine->i915->dev->primary->index; __entry->dev = engine->i915->dev->primary->index;
__entry->ring = engine->id; __entry->ring = engine->id;
__entry->seqno = engine->get_seqno(engine); __entry->seqno = intel_engine_get_seqno(engine);
), ),
TP_printk("dev=%u, ring=%u, seqno=%u", TP_printk("dev=%u, ring=%u, seqno=%u",
......
...@@ -146,7 +146,7 @@ static bool __intel_engine_add_wait(struct intel_engine_cs *engine, ...@@ -146,7 +146,7 @@ static bool __intel_engine_add_wait(struct intel_engine_cs *engine,
first = true; first = true;
parent = NULL; parent = NULL;
completed = NULL; completed = NULL;
seqno = engine->get_seqno(engine); seqno = intel_engine_get_seqno(engine);
/* If the request completed before we managed to grab the spinlock, /* If the request completed before we managed to grab the spinlock,
* return now before adding ourselves to the rbtree. We let the * return now before adding ourselves to the rbtree. We let the
...@@ -296,7 +296,7 @@ void intel_engine_remove_wait(struct intel_engine_cs *engine, ...@@ -296,7 +296,7 @@ void intel_engine_remove_wait(struct intel_engine_cs *engine,
* the first_waiter. This is undesirable if that * the first_waiter. This is undesirable if that
* waiter is a high priority task. * waiter is a high priority task.
*/ */
u32 seqno = engine->get_seqno(engine); u32 seqno = intel_engine_get_seqno(engine);
while (i915_seqno_passed(seqno, to_wait(next)->seqno)) { while (i915_seqno_passed(seqno, to_wait(next)->seqno)) {
struct rb_node *n = rb_next(next); struct rb_node *n = rb_next(next);
......
...@@ -1783,16 +1783,6 @@ static int gen8_emit_flush_render(struct drm_i915_gem_request *request, ...@@ -1783,16 +1783,6 @@ static int gen8_emit_flush_render(struct drm_i915_gem_request *request,
return 0; return 0;
} }
static u32 gen8_get_seqno(struct intel_engine_cs *engine)
{
return intel_read_status_page(engine, I915_GEM_HWS_INDEX);
}
static void gen8_set_seqno(struct intel_engine_cs *engine, u32 seqno)
{
intel_write_status_page(engine, I915_GEM_HWS_INDEX, seqno);
}
static void bxt_a_seqno_barrier(struct intel_engine_cs *engine) static void bxt_a_seqno_barrier(struct intel_engine_cs *engine)
{ {
/* /*
...@@ -1808,14 +1798,6 @@ static void bxt_a_seqno_barrier(struct intel_engine_cs *engine) ...@@ -1808,14 +1798,6 @@ static void bxt_a_seqno_barrier(struct intel_engine_cs *engine)
intel_flush_status_page(engine, I915_GEM_HWS_INDEX); intel_flush_status_page(engine, I915_GEM_HWS_INDEX);
} }
static void bxt_a_set_seqno(struct intel_engine_cs *engine, u32 seqno)
{
intel_write_status_page(engine, I915_GEM_HWS_INDEX, seqno);
/* See bxt_a_get_seqno() explaining the reason for the clflush. */
intel_flush_status_page(engine, I915_GEM_HWS_INDEX);
}
/* /*
* Reserve space for 2 NOOPs at the end of each request to be * Reserve space for 2 NOOPs at the end of each request to be
* used as a workaround for not being allowed to do lite * used as a workaround for not being allowed to do lite
...@@ -1841,7 +1823,7 @@ static int gen8_emit_request(struct drm_i915_gem_request *request) ...@@ -1841,7 +1823,7 @@ static int gen8_emit_request(struct drm_i915_gem_request *request)
intel_hws_seqno_address(request->engine) | intel_hws_seqno_address(request->engine) |
MI_FLUSH_DW_USE_GTT); MI_FLUSH_DW_USE_GTT);
intel_logical_ring_emit(ringbuf, 0); intel_logical_ring_emit(ringbuf, 0);
intel_logical_ring_emit(ringbuf, i915_gem_request_get_seqno(request)); intel_logical_ring_emit(ringbuf, request->seqno);
intel_logical_ring_emit(ringbuf, MI_USER_INTERRUPT); intel_logical_ring_emit(ringbuf, MI_USER_INTERRUPT);
intel_logical_ring_emit(ringbuf, MI_NOOP); intel_logical_ring_emit(ringbuf, MI_NOOP);
return intel_logical_ring_advance_and_submit(request); return intel_logical_ring_advance_and_submit(request);
...@@ -1987,12 +1969,8 @@ logical_ring_default_vfuncs(struct intel_engine_cs *engine) ...@@ -1987,12 +1969,8 @@ logical_ring_default_vfuncs(struct intel_engine_cs *engine)
engine->irq_get = gen8_logical_ring_get_irq; engine->irq_get = gen8_logical_ring_get_irq;
engine->irq_put = gen8_logical_ring_put_irq; engine->irq_put = gen8_logical_ring_put_irq;
engine->emit_bb_start = gen8_emit_bb_start; engine->emit_bb_start = gen8_emit_bb_start;
engine->get_seqno = gen8_get_seqno; if (IS_BXT_REVID(engine->i915, 0, BXT_REVID_A1))
engine->set_seqno = gen8_set_seqno;
if (IS_BXT_REVID(engine->i915, 0, BXT_REVID_A1)) {
engine->irq_seqno_barrier = bxt_a_seqno_barrier; engine->irq_seqno_barrier = bxt_a_seqno_barrier;
engine->set_seqno = bxt_a_set_seqno;
}
} }
static inline void static inline void
......
...@@ -1367,19 +1367,17 @@ static int gen8_rcs_signal(struct drm_i915_gem_request *signaller_req, ...@@ -1367,19 +1367,17 @@ static int gen8_rcs_signal(struct drm_i915_gem_request *signaller_req,
return ret; return ret;
for_each_engine_id(waiter, dev_priv, id) { for_each_engine_id(waiter, dev_priv, id) {
u32 seqno;
u64 gtt_offset = signaller->semaphore.signal_ggtt[id]; u64 gtt_offset = signaller->semaphore.signal_ggtt[id];
if (gtt_offset == MI_SEMAPHORE_SYNC_INVALID) if (gtt_offset == MI_SEMAPHORE_SYNC_INVALID)
continue; continue;
seqno = i915_gem_request_get_seqno(signaller_req);
intel_ring_emit(signaller, GFX_OP_PIPE_CONTROL(6)); intel_ring_emit(signaller, GFX_OP_PIPE_CONTROL(6));
intel_ring_emit(signaller, PIPE_CONTROL_GLOBAL_GTT_IVB | intel_ring_emit(signaller, PIPE_CONTROL_GLOBAL_GTT_IVB |
PIPE_CONTROL_QW_WRITE | PIPE_CONTROL_QW_WRITE |
PIPE_CONTROL_CS_STALL); PIPE_CONTROL_CS_STALL);
intel_ring_emit(signaller, lower_32_bits(gtt_offset)); intel_ring_emit(signaller, lower_32_bits(gtt_offset));
intel_ring_emit(signaller, upper_32_bits(gtt_offset)); intel_ring_emit(signaller, upper_32_bits(gtt_offset));
intel_ring_emit(signaller, seqno); intel_ring_emit(signaller, signaller_req->seqno);
intel_ring_emit(signaller, 0); intel_ring_emit(signaller, 0);
intel_ring_emit(signaller, MI_SEMAPHORE_SIGNAL | intel_ring_emit(signaller, MI_SEMAPHORE_SIGNAL |
MI_SEMAPHORE_TARGET(waiter->hw_id)); MI_SEMAPHORE_TARGET(waiter->hw_id));
...@@ -1408,18 +1406,16 @@ static int gen8_xcs_signal(struct drm_i915_gem_request *signaller_req, ...@@ -1408,18 +1406,16 @@ static int gen8_xcs_signal(struct drm_i915_gem_request *signaller_req,
return ret; return ret;
for_each_engine_id(waiter, dev_priv, id) { for_each_engine_id(waiter, dev_priv, id) {
u32 seqno;
u64 gtt_offset = signaller->semaphore.signal_ggtt[id]; u64 gtt_offset = signaller->semaphore.signal_ggtt[id];
if (gtt_offset == MI_SEMAPHORE_SYNC_INVALID) if (gtt_offset == MI_SEMAPHORE_SYNC_INVALID)
continue; continue;
seqno = i915_gem_request_get_seqno(signaller_req);
intel_ring_emit(signaller, (MI_FLUSH_DW + 1) | intel_ring_emit(signaller, (MI_FLUSH_DW + 1) |
MI_FLUSH_DW_OP_STOREDW); MI_FLUSH_DW_OP_STOREDW);
intel_ring_emit(signaller, lower_32_bits(gtt_offset) | intel_ring_emit(signaller, lower_32_bits(gtt_offset) |
MI_FLUSH_DW_USE_GTT); MI_FLUSH_DW_USE_GTT);
intel_ring_emit(signaller, upper_32_bits(gtt_offset)); intel_ring_emit(signaller, upper_32_bits(gtt_offset));
intel_ring_emit(signaller, seqno); intel_ring_emit(signaller, signaller_req->seqno);
intel_ring_emit(signaller, MI_SEMAPHORE_SIGNAL | intel_ring_emit(signaller, MI_SEMAPHORE_SIGNAL |
MI_SEMAPHORE_TARGET(waiter->hw_id)); MI_SEMAPHORE_TARGET(waiter->hw_id));
intel_ring_emit(signaller, 0); intel_ring_emit(signaller, 0);
...@@ -1450,11 +1446,9 @@ static int gen6_signal(struct drm_i915_gem_request *signaller_req, ...@@ -1450,11 +1446,9 @@ static int gen6_signal(struct drm_i915_gem_request *signaller_req,
i915_reg_t mbox_reg = signaller->semaphore.mbox.signal[id]; i915_reg_t mbox_reg = signaller->semaphore.mbox.signal[id];
if (i915_mmio_reg_valid(mbox_reg)) { if (i915_mmio_reg_valid(mbox_reg)) {
u32 seqno = i915_gem_request_get_seqno(signaller_req);
intel_ring_emit(signaller, MI_LOAD_REGISTER_IMM(1)); intel_ring_emit(signaller, MI_LOAD_REGISTER_IMM(1));
intel_ring_emit_reg(signaller, mbox_reg); intel_ring_emit_reg(signaller, mbox_reg);
intel_ring_emit(signaller, seqno); intel_ring_emit(signaller, signaller_req->seqno);
} }
} }
...@@ -1490,7 +1484,7 @@ gen6_add_request(struct drm_i915_gem_request *req) ...@@ -1490,7 +1484,7 @@ gen6_add_request(struct drm_i915_gem_request *req)
intel_ring_emit(engine, MI_STORE_DWORD_INDEX); intel_ring_emit(engine, MI_STORE_DWORD_INDEX);
intel_ring_emit(engine, intel_ring_emit(engine,
I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT); I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
intel_ring_emit(engine, i915_gem_request_get_seqno(req)); intel_ring_emit(engine, req->seqno);
intel_ring_emit(engine, MI_USER_INTERRUPT); intel_ring_emit(engine, MI_USER_INTERRUPT);
__intel_ring_advance(engine); __intel_ring_advance(engine);
...@@ -1628,7 +1622,9 @@ static int ...@@ -1628,7 +1622,9 @@ static int
pc_render_add_request(struct drm_i915_gem_request *req) pc_render_add_request(struct drm_i915_gem_request *req)
{ {
struct intel_engine_cs *engine = req->engine; struct intel_engine_cs *engine = req->engine;
u32 scratch_addr = engine->scratch.gtt_offset + 2 * CACHELINE_BYTES; u32 addr = engine->status_page.gfx_addr +
(I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
u32 scratch_addr = addr;
int ret; int ret;
/* For Ironlake, MI_USER_INTERRUPT was deprecated and apparently /* For Ironlake, MI_USER_INTERRUPT was deprecated and apparently
...@@ -1644,12 +1640,12 @@ pc_render_add_request(struct drm_i915_gem_request *req) ...@@ -1644,12 +1640,12 @@ pc_render_add_request(struct drm_i915_gem_request *req)
return ret; return ret;
intel_ring_emit(engine, intel_ring_emit(engine,
GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE | GFX_OP_PIPE_CONTROL(4) |
PIPE_CONTROL_QW_WRITE |
PIPE_CONTROL_WRITE_FLUSH | PIPE_CONTROL_WRITE_FLUSH |
PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE); PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE);
intel_ring_emit(engine, intel_ring_emit(engine, addr | PIPE_CONTROL_GLOBAL_GTT);
engine->scratch.gtt_offset | PIPE_CONTROL_GLOBAL_GTT); intel_ring_emit(engine, req->seqno);
intel_ring_emit(engine, i915_gem_request_get_seqno(req));
intel_ring_emit(engine, 0); intel_ring_emit(engine, 0);
PIPE_CONTROL_FLUSH(engine, scratch_addr); PIPE_CONTROL_FLUSH(engine, scratch_addr);
scratch_addr += 2 * CACHELINE_BYTES; /* write to separate cachelines */ scratch_addr += 2 * CACHELINE_BYTES; /* write to separate cachelines */
...@@ -1668,9 +1664,8 @@ pc_render_add_request(struct drm_i915_gem_request *req) ...@@ -1668,9 +1664,8 @@ pc_render_add_request(struct drm_i915_gem_request *req)
PIPE_CONTROL_WRITE_FLUSH | PIPE_CONTROL_WRITE_FLUSH |
PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE | PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE |
PIPE_CONTROL_NOTIFY); PIPE_CONTROL_NOTIFY);
intel_ring_emit(engine, intel_ring_emit(engine, addr | PIPE_CONTROL_GLOBAL_GTT);
engine->scratch.gtt_offset | PIPE_CONTROL_GLOBAL_GTT); intel_ring_emit(engine, req->seqno);
intel_ring_emit(engine, i915_gem_request_get_seqno(req));
intel_ring_emit(engine, 0); intel_ring_emit(engine, 0);
__intel_ring_advance(engine); __intel_ring_advance(engine);
...@@ -1702,30 +1697,6 @@ gen6_seqno_barrier(struct intel_engine_cs *engine) ...@@ -1702,30 +1697,6 @@ gen6_seqno_barrier(struct intel_engine_cs *engine)
spin_unlock_irq(&dev_priv->uncore.lock); spin_unlock_irq(&dev_priv->uncore.lock);
} }
static u32
ring_get_seqno(struct intel_engine_cs *engine)
{
return intel_read_status_page(engine, I915_GEM_HWS_INDEX);
}
static void
ring_set_seqno(struct intel_engine_cs *engine, u32 seqno)
{
intel_write_status_page(engine, I915_GEM_HWS_INDEX, seqno);
}
static u32
pc_render_get_seqno(struct intel_engine_cs *engine)
{
return engine->scratch.cpu_page[0];
}
static void
pc_render_set_seqno(struct intel_engine_cs *engine, u32 seqno)
{
engine->scratch.cpu_page[0] = seqno;
}
static bool static bool
gen5_ring_get_irq(struct intel_engine_cs *engine) gen5_ring_get_irq(struct intel_engine_cs *engine)
{ {
...@@ -1856,7 +1827,7 @@ i9xx_add_request(struct drm_i915_gem_request *req) ...@@ -1856,7 +1827,7 @@ i9xx_add_request(struct drm_i915_gem_request *req)
intel_ring_emit(engine, MI_STORE_DWORD_INDEX); intel_ring_emit(engine, MI_STORE_DWORD_INDEX);
intel_ring_emit(engine, intel_ring_emit(engine,
I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT); I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
intel_ring_emit(engine, i915_gem_request_get_seqno(req)); intel_ring_emit(engine, req->seqno);
intel_ring_emit(engine, MI_USER_INTERRUPT); intel_ring_emit(engine, MI_USER_INTERRUPT);
__intel_ring_advance(engine); __intel_ring_advance(engine);
...@@ -2675,7 +2646,9 @@ void intel_ring_init_seqno(struct intel_engine_cs *engine, u32 seqno) ...@@ -2675,7 +2646,9 @@ void intel_ring_init_seqno(struct intel_engine_cs *engine, u32 seqno)
memset(engine->semaphore.sync_seqno, 0, memset(engine->semaphore.sync_seqno, 0,
sizeof(engine->semaphore.sync_seqno)); sizeof(engine->semaphore.sync_seqno));
engine->set_seqno(engine, seqno); intel_write_status_page(engine, I915_GEM_HWS_INDEX, seqno);
if (engine->irq_seqno_barrier)
engine->irq_seqno_barrier(engine);
engine->last_submitted_seqno = seqno; engine->last_submitted_seqno = seqno;
engine->hangcheck.seqno = seqno; engine->hangcheck.seqno = seqno;
...@@ -3021,8 +2994,6 @@ static void intel_ring_default_vfuncs(struct drm_i915_private *dev_priv, ...@@ -3021,8 +2994,6 @@ static void intel_ring_default_vfuncs(struct drm_i915_private *dev_priv,
{ {
engine->init_hw = init_ring_common; engine->init_hw = init_ring_common;
engine->write_tail = ring_write_tail; engine->write_tail = ring_write_tail;
engine->get_seqno = ring_get_seqno;
engine->set_seqno = ring_set_seqno;
engine->add_request = i9xx_add_request; engine->add_request = i9xx_add_request;
if (INTEL_GEN(dev_priv) >= 6) if (INTEL_GEN(dev_priv) >= 6)
...@@ -3074,8 +3045,6 @@ int intel_init_render_ring_buffer(struct drm_device *dev) ...@@ -3074,8 +3045,6 @@ int intel_init_render_ring_buffer(struct drm_device *dev)
} else if (IS_GEN5(dev_priv)) { } else if (IS_GEN5(dev_priv)) {
engine->add_request = pc_render_add_request; engine->add_request = pc_render_add_request;
engine->flush = gen4_render_ring_flush; engine->flush = gen4_render_ring_flush;
engine->get_seqno = pc_render_get_seqno;
engine->set_seqno = pc_render_set_seqno;
engine->irq_enable_mask = GT_RENDER_USER_INTERRUPT | engine->irq_enable_mask = GT_RENDER_USER_INTERRUPT |
GT_RENDER_PIPECTL_NOTIFY_INTERRUPT; GT_RENDER_PIPECTL_NOTIFY_INTERRUPT;
} else { } else {
......
...@@ -207,9 +207,6 @@ struct intel_engine_cs { ...@@ -207,9 +207,6 @@ struct intel_engine_cs {
* monotonic, even if not coherent. * monotonic, even if not coherent.
*/ */
void (*irq_seqno_barrier)(struct intel_engine_cs *ring); void (*irq_seqno_barrier)(struct intel_engine_cs *ring);
u32 (*get_seqno)(struct intel_engine_cs *ring);
void (*set_seqno)(struct intel_engine_cs *ring,
u32 seqno);
int (*dispatch_execbuffer)(struct drm_i915_gem_request *req, int (*dispatch_execbuffer)(struct drm_i915_gem_request *req,
u64 offset, u32 length, u64 offset, u32 length,
unsigned dispatch_flags); unsigned dispatch_flags);
...@@ -485,6 +482,10 @@ int intel_init_blt_ring_buffer(struct drm_device *dev); ...@@ -485,6 +482,10 @@ int intel_init_blt_ring_buffer(struct drm_device *dev);
int intel_init_vebox_ring_buffer(struct drm_device *dev); int intel_init_vebox_ring_buffer(struct drm_device *dev);
u64 intel_ring_get_active_head(struct intel_engine_cs *engine); u64 intel_ring_get_active_head(struct intel_engine_cs *engine);
static inline u32 intel_engine_get_seqno(struct intel_engine_cs *engine)
{
return intel_read_status_page(engine, I915_GEM_HWS_INDEX);
}
int init_workarounds_ring(struct intel_engine_cs *engine); int init_workarounds_ring(struct intel_engine_cs *engine);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment