The calculation of the semaphore sync register index is obfuscated
by some pointer calculation to get at the ring id (RCS, VCS and BCS).
Now we already have a ring->id field, but that contains a flag value
usefull for ORing together multiple rings - that's what the flushing
code as the user of this field needs.

So change the meaning of ring->id to be the real id, add a tiny
helper for those that actually want a flag and use ring->id in the
semaphore index calculations.

Also extract the inverse function intel_sync_index_to_ring_id and
move it right next to intel_ring_sync_index.

v2: Simplify RING_SYNC macro as suggested by Chris Wilson.

Signed-off-by: Daniel Vetter <[email protected]>
---
 drivers/gpu/drm/i915/i915_debugfs.c        |   10 +++---
 drivers/gpu/drm/i915/i915_gem_execbuffer.c |    4 +-
 drivers/gpu/drm/i915/i915_reg.h            |    3 +-
 drivers/gpu/drm/i915/intel_ringbuffer.c    |   30 +++++++----------
 drivers/gpu/drm/i915/intel_ringbuffer.h    |   48 +++++++++++++++++++--------
 5 files changed, 54 insertions(+), 41 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index 3c395a5..b4f3ecb 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -647,8 +647,8 @@ static int i915_ringbuffer_info(struct seq_file *m, void 
*data)
        seq_printf(m, "  Active :  %08x\n", intel_ring_get_active_head(ring));
        seq_printf(m, "  NOPID :   %08x\n", I915_READ_NOPID(ring));
        if (IS_GEN6(dev)) {
-               seq_printf(m, "  Sync 0 :   %08x\n", I915_READ_SYNC_0(ring));
-               seq_printf(m, "  Sync 1 :   %08x\n", I915_READ_SYNC_1(ring));
+               seq_printf(m, "  Sync 0 :   %08x\n", I915_READ_SYNC(ring, 0));
+               seq_printf(m, "  Sync 1 :   %08x\n", I915_READ_SYNC(ring, 1));
        }
        seq_printf(m, "  Control : %08x\n", I915_READ_CTL(ring));
        seq_printf(m, "  Start :   %08x\n", I915_READ_START(ring));
@@ -659,9 +659,9 @@ static int i915_ringbuffer_info(struct seq_file *m, void 
*data)
 static const char *ring_str(int ring)
 {
        switch (ring) {
-       case RING_RENDER: return " render";
-       case RING_BSD: return " bsd";
-       case RING_BLT: return " blt";
+       case RCS: return " render";
+       case VCS: return " bsd";
+       case BCS: return " blt";
        default: return "";
        }
 }
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c 
b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index 4934cf8..f2e1af7 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -202,9 +202,9 @@ i915_gem_object_set_to_gpu_domain(struct 
drm_i915_gem_object *obj,
        cd->invalidate_domains |= invalidate_domains;
        cd->flush_domains |= flush_domains;
        if (flush_domains & I915_GEM_GPU_DOMAINS)
-               cd->flush_rings |= obj->ring->id;
+               cd->flush_rings |= intel_ring_flag(obj->ring);
        if (invalidate_domains & I915_GEM_GPU_DOMAINS)
-               cd->flush_rings |= ring->id;
+               cd->flush_rings |= intel_ring_flag(ring);
 }
 
 struct eb_objects {
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 542453f..f1cc55a 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -294,8 +294,7 @@
 #define RING_HEAD(base)                ((base)+0x34)
 #define RING_START(base)       ((base)+0x38)
 #define RING_CTL(base)         ((base)+0x3c)
-#define RING_SYNC_0(base)      ((base)+0x40)
-#define RING_SYNC_1(base)      ((base)+0x44)
+#define RING_SYNC(base, idx)   ((base)+0x40 + 4*(idx))
 #define RING_MAX_IDLE(base)    ((base)+0x54)
 #define RING_HWS_PGA(base)     ((base)+0x80)
 #define RING_HWS_PGA_GEN6(base)        ((base)+0x2080)
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c 
b/drivers/gpu/drm/i915/intel_ringbuffer.c
index c30626e..9be0f11 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -319,24 +319,18 @@ update_semaphore(struct intel_ring_buffer *ring, int i, 
u32 seqno)
 {
        struct drm_device *dev = ring->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       int id;
+       struct intel_ring_buffer *other;
+       u32 reg;
 
-       /*
-        * cs -> 1 = vcs, 0 = bcs
-        * vcs -> 1 = bcs, 0 = cs,
-        * bcs -> 1 = cs, 0 = vcs.
-        */
-       id = ring - dev_priv->ring;
-       id += 2 - i;
-       id %= 3;
+       other = &dev_priv->ring[intel_sync_index_to_ring_id(ring, i)];
+       reg = RING_SYNC(other->mmio_base, i);
 
        intel_ring_emit(ring,
                        MI_SEMAPHORE_MBOX |
                        MI_SEMAPHORE_REGISTER |
                        MI_SEMAPHORE_UPDATE);
        intel_ring_emit(ring, seqno);
-       intel_ring_emit(ring,
-                       RING_SYNC_0(dev_priv->ring[id].mmio_base) + 4*i);
+       intel_ring_emit(ring, reg);
 }
 
 static int
@@ -565,13 +559,13 @@ void intel_ring_setup_status_page(struct 
intel_ring_buffer *ring)
         */
        if (IS_GEN7(dev)) {
                switch (ring->id) {
-               case RING_RENDER:
+               case RCS:
                        mmio = RENDER_HWS_PGA_GEN7;
                        break;
-               case RING_BLT:
+               case BCS:
                        mmio = BLT_HWS_PGA_GEN7;
                        break;
-               case RING_BSD:
+               case VCS:
                        mmio = BSD_HWS_PGA_GEN7;
                        break;
                }
@@ -1015,7 +1009,7 @@ void intel_ring_advance(struct intel_ring_buffer *ring)
 
 static const struct intel_ring_buffer render_ring = {
        .name                   = "render ring",
-       .id                     = RING_RENDER,
+       .id                     = RCS,
        .mmio_base              = RENDER_RING_BASE,
        .size                   = 32 * PAGE_SIZE,
        .init                   = init_render_ring,
@@ -1033,7 +1027,7 @@ static const struct intel_ring_buffer render_ring = {
 
 static const struct intel_ring_buffer bsd_ring = {
        .name                   = "bsd ring",
-       .id                     = RING_BSD,
+       .id                     = VCS,
        .mmio_base              = BSD_RING_BASE,
        .size                   = 32 * PAGE_SIZE,
        .init                   = init_ring_common,
@@ -1143,7 +1137,7 @@ gen6_bsd_ring_put_irq(struct intel_ring_buffer *ring)
 /* ring buffer for Video Codec for Gen6+ */
 static const struct intel_ring_buffer gen6_bsd_ring = {
        .name                   = "gen6 bsd ring",
-       .id                     = RING_BSD,
+       .id                     = VCS,
        .mmio_base              = GEN6_BSD_RING_BASE,
        .size                   = 32 * PAGE_SIZE,
        .init                   = init_ring_common,
@@ -1273,7 +1267,7 @@ static void blt_ring_cleanup(struct intel_ring_buffer 
*ring)
 
 static const struct intel_ring_buffer gen6_blt_ring = {
        .name                   = "blt ring",
-       .id                     = RING_BLT,
+       .id                     = BCS,
        .mmio_base              = BLT_RING_BASE,
        .size                   = 32 * PAGE_SIZE,
        .init                   = blt_ring_init,
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h 
b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 39ac2b6..0029978 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -1,13 +1,6 @@
 #ifndef _INTEL_RINGBUFFER_H_
 #define _INTEL_RINGBUFFER_H_
 
-enum {
-    RCS = 0x0,
-    VCS,
-    BCS,
-    I915_NUM_RINGS,
-};
-
 struct  intel_hw_status_page {
        u32     __iomem *page_addr;
        unsigned int    gfx_addr;
@@ -30,16 +23,19 @@ struct  intel_hw_status_page {
 #define I915_WRITE_IMR(ring, val) I915_WRITE(RING_IMR((ring)->mmio_base), val)
 
 #define I915_READ_NOPID(ring) I915_READ(RING_NOPID((ring)->mmio_base))
-#define I915_READ_SYNC_0(ring) I915_READ(RING_SYNC_0((ring)->mmio_base))
-#define I915_READ_SYNC_1(ring) I915_READ(RING_SYNC_1((ring)->mmio_base))
+#define I915_READ_SYNC(ring, idx) I915_READ(RING_SYNC((ring)->mmio_base, 
(idx)))
 
 struct  intel_ring_buffer {
        const char      *name;
-       enum intel_ring_id {
-               RING_RENDER = 0x1,
-               RING_BSD = 0x2,
-               RING_BLT = 0x4,
+       enum {
+           RCS = 0x0,
+           VCS,
+           BCS,
        } id;
+#define I915_NUM_RINGS (BCS+1)
+#define RING_RENDER (1<<RCS)
+#define RING_BSD (1<<VCS)
+#define RING_BLT (1<<BLT)
        u32             mmio_base;
        void            __iomem *virtual_start;
        struct          drm_device *dev;
@@ -114,6 +110,12 @@ struct  intel_ring_buffer {
        void *private;
 };
 
+static inline unsigned
+intel_ring_flag(struct intel_ring_buffer *ring)
+{
+       return (1 << ring->id);
+}
+
 static inline u32
 intel_ring_sync_index(struct intel_ring_buffer *ring,
                      struct intel_ring_buffer *other)
@@ -126,13 +128,31 @@ intel_ring_sync_index(struct intel_ring_buffer *ring,
         * bcs -> 0 = cs, 1 = vcs.
         */
 
-       idx = (other - ring) - 1;
+       idx = (other->id - ring->id) - 1;
        if (idx < 0)
                idx += I915_NUM_RINGS;
 
        return idx;
 }
 
+static inline int
+intel_sync_index_to_ring_id(struct intel_ring_buffer *ring,
+                        int other)
+{
+       int id;
+
+       /*
+        * cs -> 1 = vcs, 0 = bcs
+        * vcs -> 1 = bcs, 0 = cs,
+        * bcs -> 1 = cs, 0 = vcs.
+        */
+       id = ring->id;
+       id += 2 - other;
+       id %= 3;
+
+       return id;
+}
+
 static inline u32
 intel_read_status_page(struct intel_ring_buffer *ring,
                       int reg)
-- 
1.7.6

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to