diff options
author | Ben Widawsky <benjamin.widawsky@intel.com> | 2016-01-05 13:30:07 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2016-01-07 09:34:41 -0500 |
commit | 91a4103206e3386aa3ea53b25d23f52913353e3a (patch) | |
tree | cfbe814f4b7c03cdf725d93aef172971c7a98727 /drivers/gpu/drm/i915/intel_lrc.c | |
parent | f764a8b146547b643d40b90a304ff99389edf352 (diff) |
drm/i915: Extract CSB status read
This is a useful thing to have around as a function because the mechanism may
change in the future.
There is a net increase in LOC here, and it will continue to be the case on GEN8
and GEN9 - but future GENs may have an alternate mechanism for doing this.
Signed-off-by: Ben Widawsky <benjamin.widawsky@intel.com>
Reviewed-by: Michel Thierry <michel.thierry@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1452018609-10142-4-git-send-email-benjamin.widawsky@intel.com
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_lrc.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_lrc.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c index 14affaa2a0ba..23839ff04e27 100644 --- a/drivers/gpu/drm/i915/intel_lrc.c +++ b/drivers/gpu/drm/i915/intel_lrc.c | |||
@@ -496,6 +496,19 @@ static bool execlists_check_remove_request(struct intel_engine_cs *ring, | |||
496 | return false; | 496 | return false; |
497 | } | 497 | } |
498 | 498 | ||
499 | static void get_context_status(struct intel_engine_cs *ring, | ||
500 | u8 read_pointer, | ||
501 | u32 *status, u32 *context_id) | ||
502 | { | ||
503 | struct drm_i915_private *dev_priv = ring->dev->dev_private; | ||
504 | |||
505 | if (WARN_ON(read_pointer >= GEN8_CSB_ENTRIES)) | ||
506 | return; | ||
507 | |||
508 | *status = I915_READ(RING_CONTEXT_STATUS_BUF_LO(ring, read_pointer)); | ||
509 | *context_id = I915_READ(RING_CONTEXT_STATUS_BUF_HI(ring, read_pointer)); | ||
510 | } | ||
511 | |||
499 | /** | 512 | /** |
500 | * intel_lrc_irq_handler() - handle Context Switch interrupts | 513 | * intel_lrc_irq_handler() - handle Context Switch interrupts |
501 | * @ring: Engine Command Streamer to handle. | 514 | * @ring: Engine Command Streamer to handle. |
@@ -523,9 +536,9 @@ void intel_lrc_irq_handler(struct intel_engine_cs *ring) | |||
523 | spin_lock(&ring->execlist_lock); | 536 | spin_lock(&ring->execlist_lock); |
524 | 537 | ||
525 | while (read_pointer < write_pointer) { | 538 | while (read_pointer < write_pointer) { |
526 | read_pointer++; | 539 | |
527 | status = I915_READ(RING_CONTEXT_STATUS_BUF_LO(ring, read_pointer % GEN8_CSB_ENTRIES)); | 540 | get_context_status(ring, ++read_pointer % GEN8_CSB_ENTRIES, |
528 | status_id = I915_READ(RING_CONTEXT_STATUS_BUF_HI(ring, read_pointer % GEN8_CSB_ENTRIES)); | 541 | &status, &status_id); |
529 | 542 | ||
530 | if (status & GEN8_CTX_STATUS_IDLE_ACTIVE) | 543 | if (status & GEN8_CTX_STATUS_IDLE_ACTIVE) |
531 | continue; | 544 | continue; |