History

drm/i915: Move ring_begin to signal()

Add_request has always contained both the semaphore mailbox updates as well as the breadcrumb writes. Since the semaphore signal is the one which actually knows about the number of dwords it needs to emit to the ring, we move the ring_begin to that function. This allows us to remove the hideously shared #define On a related not, gen8 will use a different number of dwords for semaphores, but not for add request. v2: Make number of dwords an explicit part of signalling (via function argument). (Chris) v3: very slight comment change

Ben Widawsky committed 12 years ago

Commit 024a43e1 parent 78325f22 files · +25 −18Browse files

Unified · Split

2 files
  1. drivers/gpu/drm/i915/intel_ringbuffer.c +22 −17
  2. drivers/gpu/drm/i915/intel_ringbuffer.h +3 −1
drivers/gpu/drm/i915/intel_ringbuffer.c+22−17
@@ -663,18 +663,28 @@ static void render_ring_cleanup(struct intel_ring_buffer *ring) · 662 unmodified lines
663663 ring->scratch.obj = NULL;
664664 }
665665
666−static void gen6_signal(struct intel_ring_buffer *signaller)
666+static int gen6_signal(struct intel_ring_buffer *signaller,
667+ unsigned int num_dwords)
667668 {
668− struct drm_i915_private *dev_priv = signaller->dev->dev_private;
669+ struct drm_device *dev = signaller->dev;
670+ struct drm_i915_private *dev_priv = dev->dev_private;
669671 struct intel_ring_buffer *useless;
670− int i;
672+ int i, ret;
671673
672−/* NB: In order to be able to do semaphore MBOX updates for varying number
673− * of rings, it's easiest if we round up each individual update to a
674− * multiple of 2 (since ring updates must always be a multiple of 2)
675− * even though the actual update only requires 3 dwords.
676− */
674+ /* NB: In order to be able to do semaphore MBOX updates for varying
675+ * number of rings, it's easiest if we round up each individual update
676+ * to a multiple of 2 (since ring updates must always be a multiple of
677+ * 2) even though the actual update only requires 3 dwords.
678+ */
677679 #define MBOX_UPDATE_DWORDS 4
680+ if (i915_semaphore_is_enabled(dev))
681+ num_dwords += ((I915_NUM_RINGS-1) * MBOX_UPDATE_DWORDS);
682+
683+ ret = intel_ring_begin(signaller, num_dwords);
684+ if (ret)
685+ return ret;
686+#undef MBOX_UPDATE_DWORDS
687+
678688 for_each_ring(useless, dev_priv, i) {
679689 u32 mbox_reg = signaller->semaphore.mbox.signal[i];
680690 if (mbox_reg != GEN6_NOSYNC) {
@@ -689,6 +699,8 @@ static void gen6_signal(struct intel_ring_buffer *signaller) · 8 unmodified lines
689699 intel_ring_emit(signaller, MI_NOOP);
690700 }
691701 }
702+
703+ return 0;
692704 }
693705
694706 /**
@@ -703,19 +715,12 @@ static void gen6_signal(struct intel_ring_buffer *signaller) · 8 unmodified lines
703715 static int
704716 gen6_add_request(struct intel_ring_buffer *ring)
705717 {
706− struct drm_device *dev = ring->dev;
707− int ret, num_dwords = 4;
708−
709− if (i915_semaphore_is_enabled(dev))
710− num_dwords += ((I915_NUM_RINGS-1) * MBOX_UPDATE_DWORDS);
711−#undef MBOX_UPDATE_DWORDS
718+ int ret;
712719
713− ret = intel_ring_begin(ring, num_dwords);
720+ ret = ring->semaphore.signal(ring, 4);
714721 if (ret)
715722 return ret;
716723
717− ring->semaphore.signal(ring);
718−
719724 intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
720725 intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
721726 intel_ring_emit(ring, ring->outstanding_lazy_seqno);
drivers/gpu/drm/i915/intel_ringbuffer.h+3−1
@@ -132,7 +132,9 @@ struct intel_ring_buffer { · 131 unmodified lines
132132 int (*sync_to)(struct intel_ring_buffer *ring,
133133 struct intel_ring_buffer *to,
134134 u32 seqno);
135− void (*signal)(struct intel_ring_buffer *signaller);
135+ int (*signal)(struct intel_ring_buffer *signaller,
136+ /* num_dwords needed by caller */
137+ unsigned int num_dwords);
136138 } semaphore;
137139
138140 /**

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t