This turns the black magic into brown magic. It's arguable whether or not this is more readable than the existing code. It does add a nice assertion, fewer lines of actual code, and some nice comments - as well as sticking to semantics now used in the ringbuffer code.
Cc: Daniel Vetter <[email protected]> Signed-off-by: Ben Widawsky <[email protected]> --- drivers/gpu/drm/i915/intel_ringbuffer.h | 26 ++++++++++++-------------- 1 files changed, 12 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h index 61790c8..e4516e4 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.h +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h @@ -119,23 +119,21 @@ intel_ring_flag(struct intel_ring_buffer *ring) return (1 << ring->id); } +/* intel_ring_sync_index - return the index (0-n, where n is total rings - 1) + * of the ring we're synchronizing to. + * + * @signaller - ring which last updated the mailbox + * @waiter - ring waiting on seqno in mailbox + */ static inline u32 -intel_ring_sync_index(struct intel_ring_buffer *ring, - struct intel_ring_buffer *other) +intel_ring_sync_index(struct intel_ring_buffer *signaller, + struct intel_ring_buffer *waiter) { - int idx; - - /* - * cs -> 0 = vcs, 1 = bcs - * vcs -> 0 = bcs, 1 = cs, - * bcs -> 0 = cs, 1 = vcs. + /* This bit of magic is based on the fact that there are 3 rings, and + * the value of bit 17 is a unique way to identify the mailbox */ - - idx = (other->id - ring->id) - 1; - if (idx < 0) - idx += I915_NUM_RINGS; - - return idx; + BUG_ON(signaller->semaphore_register[waiter->id] >> 17 > 1); + return (signaller->semaphore_register[waiter->id] >> 17); } static inline u32 -- 1.7.6.1 _______________________________________________ Intel-gfx mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/intel-gfx
