mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-05 18:39:59 +00:00
drm/i915: use new macros to access the ring tail register
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
parent
333e9fe94d
commit
870e86ddc2
2 changed files with 22 additions and 50 deletions
|
@ -126,17 +126,12 @@ static unsigned int render_ring_get_head(struct drm_device *dev,
|
||||||
return I915_READ(PRB0_HEAD) & HEAD_ADDR;
|
return I915_READ(PRB0_HEAD) & HEAD_ADDR;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int render_ring_get_tail(struct drm_device *dev,
|
static void ring_set_tail(struct drm_device *dev,
|
||||||
struct intel_ring_buffer *ring)
|
struct intel_ring_buffer *ring,
|
||||||
|
u32 value)
|
||||||
{
|
{
|
||||||
drm_i915_private_t *dev_priv = dev->dev_private;
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||||
return I915_READ(PRB0_TAIL) & TAIL_ADDR;
|
I915_WRITE_TAIL(ring, ring->tail);
|
||||||
}
|
|
||||||
|
|
||||||
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,
|
static unsigned int render_ring_get_active_head(struct drm_device *dev,
|
||||||
|
@ -159,7 +154,7 @@ static int init_ring_common(struct drm_device *dev,
|
||||||
/* Stop the ring if it's running. */
|
/* Stop the ring if it's running. */
|
||||||
I915_WRITE(ring->regs.ctl, 0);
|
I915_WRITE(ring->regs.ctl, 0);
|
||||||
I915_WRITE(ring->regs.head, 0);
|
I915_WRITE(ring->regs.head, 0);
|
||||||
ring->set_tail(dev, 0);
|
ring->set_tail(dev, ring, 0);
|
||||||
|
|
||||||
/* Initialize the ring. */
|
/* Initialize the ring. */
|
||||||
I915_WRITE(ring->regs.start, obj_priv->gtt_offset);
|
I915_WRITE(ring->regs.start, obj_priv->gtt_offset);
|
||||||
|
@ -172,7 +167,7 @@ static int init_ring_common(struct drm_device *dev,
|
||||||
ring->name,
|
ring->name,
|
||||||
I915_READ(ring->regs.ctl),
|
I915_READ(ring->regs.ctl),
|
||||||
I915_READ(ring->regs.head),
|
I915_READ(ring->regs.head),
|
||||||
I915_READ(ring->regs.tail),
|
I915_READ_TAIL(ring),
|
||||||
I915_READ(ring->regs.start));
|
I915_READ(ring->regs.start));
|
||||||
|
|
||||||
I915_WRITE(ring->regs.head, 0);
|
I915_WRITE(ring->regs.head, 0);
|
||||||
|
@ -182,7 +177,7 @@ static int init_ring_common(struct drm_device *dev,
|
||||||
ring->name,
|
ring->name,
|
||||||
I915_READ(ring->regs.ctl),
|
I915_READ(ring->regs.ctl),
|
||||||
I915_READ(ring->regs.head),
|
I915_READ(ring->regs.head),
|
||||||
I915_READ(ring->regs.tail),
|
I915_READ_TAIL(ring),
|
||||||
I915_READ(ring->regs.start));
|
I915_READ(ring->regs.start));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,7 +193,7 @@ static int init_ring_common(struct drm_device *dev,
|
||||||
ring->name,
|
ring->name,
|
||||||
I915_READ(ring->regs.ctl),
|
I915_READ(ring->regs.ctl),
|
||||||
I915_READ(ring->regs.head),
|
I915_READ(ring->regs.head),
|
||||||
I915_READ(ring->regs.tail),
|
I915_READ_TAIL(ring),
|
||||||
I915_READ(ring->regs.start));
|
I915_READ(ring->regs.start));
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
@ -207,7 +202,7 @@ static int init_ring_common(struct drm_device *dev,
|
||||||
i915_kernel_lost_context(dev);
|
i915_kernel_lost_context(dev);
|
||||||
else {
|
else {
|
||||||
ring->head = ring->get_head(dev, ring);
|
ring->head = ring->get_head(dev, ring);
|
||||||
ring->tail = ring->get_tail(dev, ring);
|
ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR;
|
||||||
ring->space = ring->head - (ring->tail + 8);
|
ring->space = ring->head - (ring->tail + 8);
|
||||||
if (ring->space < 0)
|
if (ring->space < 0)
|
||||||
ring->space += ring->size;
|
ring->space += ring->size;
|
||||||
|
@ -393,19 +388,6 @@ static inline unsigned int bsd_ring_get_head(struct drm_device *dev,
|
||||||
return I915_READ(BSD_RING_HEAD) & HEAD_ADDR;
|
return I915_READ(BSD_RING_HEAD) & HEAD_ADDR;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned int bsd_ring_get_tail(struct drm_device *dev,
|
|
||||||
struct intel_ring_buffer *ring)
|
|
||||||
{
|
|
||||||
drm_i915_private_t *dev_priv = dev->dev_private;
|
|
||||||
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,
|
static inline unsigned int bsd_ring_get_active_head(struct drm_device *dev,
|
||||||
struct intel_ring_buffer *ring)
|
struct intel_ring_buffer *ring)
|
||||||
{
|
{
|
||||||
|
@ -620,6 +602,7 @@ static int init_status_page(struct drm_device *dev,
|
||||||
int intel_init_ring_buffer(struct drm_device *dev,
|
int intel_init_ring_buffer(struct drm_device *dev,
|
||||||
struct intel_ring_buffer *ring)
|
struct intel_ring_buffer *ring)
|
||||||
{
|
{
|
||||||
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
struct drm_i915_gem_object *obj_priv;
|
struct drm_i915_gem_object *obj_priv;
|
||||||
struct drm_gem_object *obj;
|
struct drm_gem_object *obj;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -668,7 +651,7 @@ int intel_init_ring_buffer(struct drm_device *dev,
|
||||||
i915_kernel_lost_context(dev);
|
i915_kernel_lost_context(dev);
|
||||||
else {
|
else {
|
||||||
ring->head = ring->get_head(dev, ring);
|
ring->head = ring->get_head(dev, ring);
|
||||||
ring->tail = ring->get_tail(dev, ring);
|
ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR;
|
||||||
ring->space = ring->head - (ring->tail + 8);
|
ring->space = ring->head - (ring->tail + 8);
|
||||||
if (ring->space < 0)
|
if (ring->space < 0)
|
||||||
ring->space += ring->size;
|
ring->space += ring->size;
|
||||||
|
@ -774,7 +757,7 @@ void intel_ring_advance(struct drm_device *dev,
|
||||||
struct intel_ring_buffer *ring)
|
struct intel_ring_buffer *ring)
|
||||||
{
|
{
|
||||||
ring->tail &= ring->size - 1;
|
ring->tail &= ring->size - 1;
|
||||||
ring->set_tail(dev, ring->tail);
|
ring->set_tail(dev, ring, ring->tail);
|
||||||
}
|
}
|
||||||
|
|
||||||
void intel_fill_struct(struct drm_device *dev,
|
void intel_fill_struct(struct drm_device *dev,
|
||||||
|
@ -798,7 +781,6 @@ static const struct intel_ring_buffer render_ring = {
|
||||||
.regs = {
|
.regs = {
|
||||||
.ctl = PRB0_CTL,
|
.ctl = PRB0_CTL,
|
||||||
.head = PRB0_HEAD,
|
.head = PRB0_HEAD,
|
||||||
.tail = PRB0_TAIL,
|
|
||||||
.start = PRB0_START
|
.start = PRB0_START
|
||||||
},
|
},
|
||||||
.mmio_base = RENDER_RING_BASE,
|
.mmio_base = RENDER_RING_BASE,
|
||||||
|
@ -816,8 +798,7 @@ static const struct intel_ring_buffer render_ring = {
|
||||||
.setup_status_page = render_setup_status_page,
|
.setup_status_page = render_setup_status_page,
|
||||||
.init = init_render_ring,
|
.init = init_render_ring,
|
||||||
.get_head = render_ring_get_head,
|
.get_head = render_ring_get_head,
|
||||||
.get_tail = render_ring_get_tail,
|
.set_tail = ring_set_tail,
|
||||||
.set_tail = render_ring_set_tail,
|
|
||||||
.get_active_head = render_ring_get_active_head,
|
.get_active_head = render_ring_get_active_head,
|
||||||
.flush = render_ring_flush,
|
.flush = render_ring_flush,
|
||||||
.add_request = render_ring_add_request,
|
.add_request = render_ring_add_request,
|
||||||
|
@ -837,7 +818,6 @@ static const struct intel_ring_buffer bsd_ring = {
|
||||||
.regs = {
|
.regs = {
|
||||||
.ctl = BSD_RING_CTL,
|
.ctl = BSD_RING_CTL,
|
||||||
.head = BSD_RING_HEAD,
|
.head = BSD_RING_HEAD,
|
||||||
.tail = BSD_RING_TAIL,
|
|
||||||
.start = BSD_RING_START
|
.start = BSD_RING_START
|
||||||
},
|
},
|
||||||
.mmio_base = BSD_RING_BASE,
|
.mmio_base = BSD_RING_BASE,
|
||||||
|
@ -855,8 +835,7 @@ static const struct intel_ring_buffer bsd_ring = {
|
||||||
.setup_status_page = bsd_setup_status_page,
|
.setup_status_page = bsd_setup_status_page,
|
||||||
.init = init_bsd_ring,
|
.init = init_bsd_ring,
|
||||||
.get_head = bsd_ring_get_head,
|
.get_head = bsd_ring_get_head,
|
||||||
.get_tail = bsd_ring_get_tail,
|
.set_tail = ring_set_tail,
|
||||||
.set_tail = bsd_ring_set_tail,
|
|
||||||
.get_active_head = bsd_ring_get_active_head,
|
.get_active_head = bsd_ring_get_active_head,
|
||||||
.flush = bsd_ring_flush,
|
.flush = bsd_ring_flush,
|
||||||
.add_request = bsd_ring_add_request,
|
.add_request = bsd_ring_add_request,
|
||||||
|
@ -884,15 +863,9 @@ static inline unsigned int gen6_bsd_ring_get_head(struct drm_device *dev,
|
||||||
return I915_READ(GEN6_BSD_RING_HEAD) & HEAD_ADDR;
|
return I915_READ(GEN6_BSD_RING_HEAD) & HEAD_ADDR;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned int gen6_bsd_ring_get_tail(struct drm_device *dev,
|
|
||||||
struct intel_ring_buffer *ring)
|
|
||||||
{
|
|
||||||
drm_i915_private_t *dev_priv = dev->dev_private;
|
|
||||||
return I915_READ(GEN6_BSD_RING_TAIL) & TAIL_ADDR;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void gen6_bsd_ring_set_tail(struct drm_device *dev,
|
static inline void gen6_bsd_ring_set_tail(struct drm_device *dev,
|
||||||
u32 value)
|
struct intel_ring_buffer *ring,
|
||||||
|
u32 value)
|
||||||
{
|
{
|
||||||
drm_i915_private_t *dev_priv = dev->dev_private;
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||||
|
|
||||||
|
@ -907,7 +880,7 @@ static inline void gen6_bsd_ring_set_tail(struct drm_device *dev,
|
||||||
50))
|
50))
|
||||||
DRM_ERROR("timed out waiting for IDLE Indicator\n");
|
DRM_ERROR("timed out waiting for IDLE Indicator\n");
|
||||||
|
|
||||||
I915_WRITE(GEN6_BSD_RING_TAIL, value);
|
I915_WRITE_TAIL(ring, value);
|
||||||
I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL,
|
I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL,
|
||||||
GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK |
|
GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK |
|
||||||
GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_ENABLE);
|
GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_ENABLE);
|
||||||
|
@ -956,7 +929,6 @@ static const struct intel_ring_buffer gen6_bsd_ring = {
|
||||||
.regs = {
|
.regs = {
|
||||||
.ctl = GEN6_BSD_RING_CTL,
|
.ctl = GEN6_BSD_RING_CTL,
|
||||||
.head = GEN6_BSD_RING_HEAD,
|
.head = GEN6_BSD_RING_HEAD,
|
||||||
.tail = GEN6_BSD_RING_TAIL,
|
|
||||||
.start = GEN6_BSD_RING_START
|
.start = GEN6_BSD_RING_START
|
||||||
},
|
},
|
||||||
.mmio_base = GEN6_BSD_RING_BASE,
|
.mmio_base = GEN6_BSD_RING_BASE,
|
||||||
|
@ -974,7 +946,6 @@ static const struct intel_ring_buffer gen6_bsd_ring = {
|
||||||
.setup_status_page = gen6_bsd_setup_status_page,
|
.setup_status_page = gen6_bsd_setup_status_page,
|
||||||
.init = init_bsd_ring,
|
.init = init_bsd_ring,
|
||||||
.get_head = gen6_bsd_ring_get_head,
|
.get_head = gen6_bsd_ring_get_head,
|
||||||
.get_tail = gen6_bsd_ring_get_tail,
|
|
||||||
.set_tail = gen6_bsd_ring_set_tail,
|
.set_tail = gen6_bsd_ring_set_tail,
|
||||||
.get_active_head = gen6_bsd_ring_get_active_head,
|
.get_active_head = gen6_bsd_ring_get_active_head,
|
||||||
.flush = gen6_bsd_ring_flush,
|
.flush = gen6_bsd_ring_flush,
|
||||||
|
|
|
@ -7,6 +7,9 @@ struct intel_hw_status_page {
|
||||||
struct drm_gem_object *obj;
|
struct drm_gem_object *obj;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define I915_READ_TAIL(ring) I915_READ(RING_TAIL(ring->mmio_base))
|
||||||
|
#define I915_WRITE_TAIL(ring, val) I915_WRITE(RING_TAIL(ring->mmio_base), val)
|
||||||
|
|
||||||
struct drm_i915_gem_execbuffer2;
|
struct drm_i915_gem_execbuffer2;
|
||||||
struct intel_ring_buffer {
|
struct intel_ring_buffer {
|
||||||
const char *name;
|
const char *name;
|
||||||
|
@ -17,7 +20,6 @@ struct intel_ring_buffer {
|
||||||
struct ring_regs {
|
struct ring_regs {
|
||||||
u32 ctl;
|
u32 ctl;
|
||||||
u32 head;
|
u32 head;
|
||||||
u32 tail;
|
|
||||||
u32 start;
|
u32 start;
|
||||||
} regs;
|
} regs;
|
||||||
u32 mmio_base;
|
u32 mmio_base;
|
||||||
|
@ -47,10 +49,9 @@ struct intel_ring_buffer {
|
||||||
|
|
||||||
unsigned int (*get_head)(struct drm_device *dev,
|
unsigned int (*get_head)(struct drm_device *dev,
|
||||||
struct intel_ring_buffer *ring);
|
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,
|
void (*set_tail)(struct drm_device *dev,
|
||||||
u32 value);
|
struct intel_ring_buffer *ring,
|
||||||
|
u32 value);
|
||||||
unsigned int (*get_active_head)(struct drm_device *dev,
|
unsigned int (*get_active_head)(struct drm_device *dev,
|
||||||
struct intel_ring_buffer *ring);
|
struct intel_ring_buffer *ring);
|
||||||
void (*flush)(struct drm_device *dev,
|
void (*flush)(struct drm_device *dev,
|
||||||
|
|
Loading…
Reference in a new issue