This is prepared for video codec ring buffer on Sandybridge. It is
needed to read/write more than one register to move the tail pointer of
the video codec ring on Sandybridge.

Signed-off-by: Xiang, Haihao <haihao.xi...@intel.com>
Reviewed-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/intel_ringbuffer.c |   22 +++++++++++++++++-----
 drivers/gpu/drm/i915/intel_ringbuffer.h |    2 ++
 2 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c 
b/drivers/gpu/drm/i915/intel_ringbuffer.c
index a9d4f5b..0a65182 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -134,6 +134,12 @@ static unsigned int render_ring_get_tail(struct drm_device 
*dev,
        return I915_READ(PRB0_TAIL) & TAIL_ADDR;
 }
 
+static inline void render_ring_set_tail(struct drm_device *dev, u32 value)
+{
+       drm_i915_private_t *dev_priv = dev->dev_private;
+       I915_WRITE(PRB0_TAIL, value);
+}
+
 static unsigned int render_ring_get_active_head(struct drm_device *dev,
                struct intel_ring_buffer *ring)
 {
@@ -146,8 +152,7 @@ static unsigned int render_ring_get_active_head(struct 
drm_device *dev,
 static void render_ring_advance_ring(struct drm_device *dev,
                struct intel_ring_buffer *ring)
 {
-       drm_i915_private_t *dev_priv = dev->dev_private;
-       I915_WRITE(PRB0_TAIL, ring->tail);
+       render_ring_set_tail(dev, ring->tail);
 }
 
 static int init_ring_common(struct drm_device *dev,
@@ -161,7 +166,7 @@ static int init_ring_common(struct drm_device *dev,
        /* Stop the ring if it's running. */
        I915_WRITE(ring->regs.ctl, 0);
        I915_WRITE(ring->regs.head, 0);
-       I915_WRITE(ring->regs.tail, 0);
+       ring->set_tail(dev, 0);
 
        /* Initialize the ring. */
        I915_WRITE(ring->regs.start, obj_priv->gtt_offset);
@@ -404,6 +409,12 @@ static inline unsigned int bsd_ring_get_tail(struct 
drm_device *dev,
        return I915_READ(BSD_RING_TAIL) & TAIL_ADDR;
 }
 
+static inline void bsd_ring_set_tail(struct drm_device *dev, u32 value)
+{
+       drm_i915_private_t *dev_priv = dev->dev_private;
+       I915_WRITE(BSD_RING_TAIL, value);
+}
+
 static inline unsigned int bsd_ring_get_active_head(struct drm_device *dev,
                struct intel_ring_buffer *ring)
 {
@@ -414,8 +425,7 @@ static inline unsigned int bsd_ring_get_active_head(struct 
drm_device *dev,
 static inline void bsd_ring_advance_ring(struct drm_device *dev,
                struct intel_ring_buffer *ring)
 {
-       drm_i915_private_t *dev_priv = dev->dev_private;
-       I915_WRITE(BSD_RING_TAIL, ring->tail);
+       bsd_ring_set_tail(dev, ring->tail);
 }
 
 static int init_bsd_ring(struct drm_device *dev,
@@ -820,6 +830,7 @@ static struct intel_ring_buffer render_ring = {
        .init                   = init_render_ring,
        .get_head               = render_ring_get_head,
        .get_tail               = render_ring_get_tail,
+       .set_tail               = render_ring_set_tail,
        .get_active_head        = render_ring_get_active_head,
        .advance_ring           = render_ring_advance_ring,
        .flush                  = render_ring_flush,
@@ -857,6 +868,7 @@ static struct intel_ring_buffer bsd_ring = {
        .init                   = init_bsd_ring,
        .get_head               = bsd_ring_get_head,
        .get_tail               = bsd_ring_get_tail,
+       .set_tail               = bsd_ring_set_tail,
        .get_active_head        = bsd_ring_get_active_head,
        .advance_ring           = bsd_ring_advance_ring,
        .flush                  = bsd_ring_flush,
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h 
b/drivers/gpu/drm/i915/intel_ringbuffer.h
index df7acc5..f89e528 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -44,6 +44,8 @@ struct  intel_ring_buffer {
                        struct intel_ring_buffer *ring);
        unsigned int    (*get_tail)(struct drm_device *dev,
                        struct intel_ring_buffer *ring);
+       void            (*set_tail)(struct drm_device *dev,
+                       u32 value);
        unsigned int    (*get_active_head)(struct drm_device *dev,
                        struct intel_ring_buffer *ring);
        void            (*advance_ring)(struct drm_device *dev,
-- 
1.7.0.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to