aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_ringbuffer.h
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2010-12-04 06:30:53 -0500
committerChris Wilson <chris@chris-wilson.co.uk>2010-12-04 19:37:38 -0500
commit1ec14ad3132702694f2e1a90b30641cf111183b9 (patch)
tree98ca9ae91f14ff5d8feed306941ea2c46479e71a /drivers/gpu/drm/i915/intel_ringbuffer.h
parent340479aac697bc73e225c122a9753d4964eeda3f (diff)
drm/i915: Implement GPU semaphores for inter-ring synchronisation on SNB
The bulk of the change is to convert the growing list of rings into an array so that the relationship between the rings and the semaphore sync registers can be easily computed. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ringbuffer.h')
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.h41
1 files changed, 37 insertions, 4 deletions
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 8e3526777926..6a3822bc6af2 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -1,6 +1,13 @@
1#ifndef _INTEL_RINGBUFFER_H_ 1#ifndef _INTEL_RINGBUFFER_H_
2#define _INTEL_RINGBUFFER_H_ 2#define _INTEL_RINGBUFFER_H_
3 3
4enum {
5 RCS = 0x0,
6 VCS,
7 BCS,
8 I915_NUM_RINGS,
9};
10
4struct intel_hw_status_page { 11struct intel_hw_status_page {
5 u32 __iomem *page_addr; 12 u32 __iomem *page_addr;
6 unsigned int gfx_addr; 13 unsigned int gfx_addr;
@@ -21,7 +28,10 @@ struct intel_hw_status_page {
21#define I915_READ_CTL(ring) I915_RING_READ(RING_CTL(ring->mmio_base)) 28#define I915_READ_CTL(ring) I915_RING_READ(RING_CTL(ring->mmio_base))
22#define I915_WRITE_CTL(ring, val) I915_WRITE(RING_CTL(ring->mmio_base), val) 29#define I915_WRITE_CTL(ring, val) I915_WRITE(RING_CTL(ring->mmio_base), val)
23 30
24struct drm_i915_gem_execbuffer2; 31#define I915_READ_NOPID(ring) I915_RING_READ(RING_NOPID(ring->mmio_base))
32#define I915_READ_SYNC_0(ring) I915_RING_READ(RING_SYNC_0(ring->mmio_base))
33#define I915_READ_SYNC_1(ring) I915_RING_READ(RING_SYNC_1(ring->mmio_base))
34
25struct intel_ring_buffer { 35struct intel_ring_buffer {
26 const char *name; 36 const char *name;
27 enum intel_ring_id { 37 enum intel_ring_id {
@@ -42,9 +52,10 @@ struct intel_ring_buffer {
42 52
43 u32 irq_seqno; /* last seq seem at irq time */ 53 u32 irq_seqno; /* last seq seem at irq time */
44 u32 waiting_seqno; 54 u32 waiting_seqno;
45 int user_irq_refcount; 55 u32 sync_seqno[I915_NUM_RINGS-1];
46 void (*user_irq_get)(struct intel_ring_buffer *ring); 56 u32 irq_refcount;
47 void (*user_irq_put)(struct intel_ring_buffer *ring); 57 void (*irq_get)(struct intel_ring_buffer *ring);
58 void (*irq_put)(struct intel_ring_buffer *ring);
48 59
49 int (*init)(struct intel_ring_buffer *ring); 60 int (*init)(struct intel_ring_buffer *ring);
50 61
@@ -99,6 +110,25 @@ struct intel_ring_buffer {
99}; 110};
100 111
101static inline u32 112static inline u32
113intel_ring_sync_index(struct intel_ring_buffer *ring,
114 struct intel_ring_buffer *other)
115{
116 int idx;
117
118 /*
119 * cs -> 0 = vcs, 1 = bcs
120 * vcs -> 0 = bcs, 1 = cs,
121 * bcs -> 0 = cs, 1 = vcs.
122 */
123
124 idx = (other - ring) - 1;
125 if (idx < 0)
126 idx += I915_NUM_RINGS;
127
128 return idx;
129}
130
131static inline u32
102intel_read_status_page(struct intel_ring_buffer *ring, 132intel_read_status_page(struct intel_ring_buffer *ring,
103 int reg) 133 int reg)
104{ 134{
@@ -119,6 +149,9 @@ static inline void intel_ring_emit(struct intel_ring_buffer *ring,
119void intel_ring_advance(struct intel_ring_buffer *ring); 149void intel_ring_advance(struct intel_ring_buffer *ring);
120 150
121u32 intel_ring_get_seqno(struct intel_ring_buffer *ring); 151u32 intel_ring_get_seqno(struct intel_ring_buffer *ring);
152int intel_ring_sync(struct intel_ring_buffer *ring,
153 struct intel_ring_buffer *to,
154 u32 seqno);
122 155
123int intel_init_render_ring_buffer(struct drm_device *dev); 156int intel_init_render_ring_buffer(struct drm_device *dev);
124int intel_init_bsd_ring_buffer(struct drm_device *dev); 157int intel_init_bsd_ring_buffer(struct drm_device *dev);