aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_ringbuffer.h
diff options
context:
space:
mode:
authorPaul Mundt <lethal@linux-sh.org>2011-01-12 00:37:42 -0500
committerPaul Mundt <lethal@linux-sh.org>2011-01-12 00:37:42 -0500
commit83eb95b852902f952ba594447a796ad8146b9462 (patch)
tree33c199aeeae58b69ad8d6d2a33c2d96ba2b98ddf /drivers/gpu/drm/i915/intel_ringbuffer.h
parentefb3e34b6176d30c4fe8635fa8e1beb6280cc2cd (diff)
parent9bbe7b984096ac45586da2adf26c14069ecb79b2 (diff)
Merge branch 'sh/sdio' into sh-latest
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ringbuffer.h')
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.h136
1 files changed, 76 insertions, 60 deletions
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index d2cd0f1efeed..8e2e357ad6ee 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -1,22 +1,37 @@
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 void *page_addr; 12 u32 __iomem *page_addr;
6 unsigned int gfx_addr; 13 unsigned int gfx_addr;
7 struct drm_gem_object *obj; 14 struct drm_i915_gem_object *obj;
8}; 15};
9 16
10#define I915_READ_TAIL(ring) I915_READ(RING_TAIL(ring->mmio_base)) 17#define I915_RING_READ(reg) i915_safe_read(dev_priv, reg)
18
19#define I915_READ_TAIL(ring) I915_RING_READ(RING_TAIL(ring->mmio_base))
11#define I915_WRITE_TAIL(ring, val) I915_WRITE(RING_TAIL(ring->mmio_base), val) 20#define I915_WRITE_TAIL(ring, val) I915_WRITE(RING_TAIL(ring->mmio_base), val)
12#define I915_READ_START(ring) I915_READ(RING_START(ring->mmio_base)) 21
22#define I915_READ_START(ring) I915_RING_READ(RING_START(ring->mmio_base))
13#define I915_WRITE_START(ring, val) I915_WRITE(RING_START(ring->mmio_base), val) 23#define I915_WRITE_START(ring, val) I915_WRITE(RING_START(ring->mmio_base), val)
14#define I915_READ_HEAD(ring) I915_READ(RING_HEAD(ring->mmio_base)) 24
25#define I915_READ_HEAD(ring) I915_RING_READ(RING_HEAD(ring->mmio_base))
15#define I915_WRITE_HEAD(ring, val) I915_WRITE(RING_HEAD(ring->mmio_base), val) 26#define I915_WRITE_HEAD(ring, val) I915_WRITE(RING_HEAD(ring->mmio_base), val)
16#define I915_READ_CTL(ring) I915_READ(RING_CTL(ring->mmio_base)) 27
28#define I915_READ_CTL(ring) I915_RING_READ(RING_CTL(ring->mmio_base))
17#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)
18 30
19struct 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
20struct intel_ring_buffer { 35struct intel_ring_buffer {
21 const char *name; 36 const char *name;
22 enum intel_ring_id { 37 enum intel_ring_id {
@@ -25,45 +40,36 @@ struct intel_ring_buffer {
25 RING_BLT = 0x4, 40 RING_BLT = 0x4,
26 } id; 41 } id;
27 u32 mmio_base; 42 u32 mmio_base;
28 unsigned long size;
29 void *virtual_start; 43 void *virtual_start;
30 struct drm_device *dev; 44 struct drm_device *dev;
31 struct drm_gem_object *gem_object; 45 struct drm_i915_gem_object *obj;
32 46
33 u32 actual_head; 47 u32 actual_head;
34 u32 head; 48 u32 head;
35 u32 tail; 49 u32 tail;
36 int space; 50 int space;
51 int size;
37 struct intel_hw_status_page status_page; 52 struct intel_hw_status_page status_page;
38 53
39 u32 irq_gem_seqno; /* last seq seem at irq time */ 54 u32 irq_seqno; /* last seq seem at irq time */
40 u32 waiting_gem_seqno; 55 u32 waiting_seqno;
41 int user_irq_refcount; 56 u32 sync_seqno[I915_NUM_RINGS-1];
42 void (*user_irq_get)(struct drm_device *dev, 57 atomic_t irq_refcount;
43 struct intel_ring_buffer *ring); 58 bool __must_check (*irq_get)(struct intel_ring_buffer *ring);
44 void (*user_irq_put)(struct drm_device *dev, 59 void (*irq_put)(struct intel_ring_buffer *ring);
45 struct intel_ring_buffer *ring);
46 60
47 int (*init)(struct drm_device *dev, 61 int (*init)(struct intel_ring_buffer *ring);
48 struct intel_ring_buffer *ring);
49 62
50 void (*write_tail)(struct drm_device *dev, 63 void (*write_tail)(struct intel_ring_buffer *ring,
51 struct intel_ring_buffer *ring,
52 u32 value); 64 u32 value);
53 void (*flush)(struct drm_device *dev, 65 void (*flush)(struct intel_ring_buffer *ring,
54 struct intel_ring_buffer *ring, 66 u32 invalidate_domains,
55 u32 invalidate_domains, 67 u32 flush_domains);
56 u32 flush_domains); 68 int (*add_request)(struct intel_ring_buffer *ring,
57 u32 (*add_request)(struct drm_device *dev, 69 u32 *seqno);
58 struct intel_ring_buffer *ring, 70 u32 (*get_seqno)(struct intel_ring_buffer *ring);
59 u32 flush_domains); 71 int (*dispatch_execbuffer)(struct intel_ring_buffer *ring,
60 u32 (*get_seqno)(struct drm_device *dev, 72 u32 offset, u32 length);
61 struct intel_ring_buffer *ring);
62 int (*dispatch_gem_execbuffer)(struct drm_device *dev,
63 struct intel_ring_buffer *ring,
64 struct drm_i915_gem_execbuffer2 *exec,
65 struct drm_clip_rect *cliprects,
66 uint64_t exec_offset);
67 void (*cleanup)(struct intel_ring_buffer *ring); 73 void (*cleanup)(struct intel_ring_buffer *ring);
68 74
69 /** 75 /**
@@ -96,7 +102,7 @@ struct intel_ring_buffer {
96 /** 102 /**
97 * Do we have some not yet emitted requests outstanding? 103 * Do we have some not yet emitted requests outstanding?
98 */ 104 */
99 bool outstanding_lazy_request; 105 u32 outstanding_lazy_request;
100 106
101 wait_queue_head_t irq_queue; 107 wait_queue_head_t irq_queue;
102 drm_local_map_t map; 108 drm_local_map_t map;
@@ -105,44 +111,54 @@ struct intel_ring_buffer {
105}; 111};
106 112
107static inline u32 113static inline u32
114intel_ring_sync_index(struct intel_ring_buffer *ring,
115 struct intel_ring_buffer *other)
116{
117 int idx;
118
119 /*
120 * cs -> 0 = vcs, 1 = bcs
121 * vcs -> 0 = bcs, 1 = cs,
122 * bcs -> 0 = cs, 1 = vcs.
123 */
124
125 idx = (other - ring) - 1;
126 if (idx < 0)
127 idx += I915_NUM_RINGS;
128
129 return idx;
130}
131
132static inline u32
108intel_read_status_page(struct intel_ring_buffer *ring, 133intel_read_status_page(struct intel_ring_buffer *ring,
109 int reg) 134 int reg)
110{ 135{
111 u32 *regs = ring->status_page.page_addr; 136 return ioread32(ring->status_page.page_addr + reg);
112 return regs[reg];
113} 137}
114 138
115int intel_init_ring_buffer(struct drm_device *dev, 139void intel_cleanup_ring_buffer(struct intel_ring_buffer *ring);
116 struct intel_ring_buffer *ring); 140int __must_check intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n);
117void intel_cleanup_ring_buffer(struct drm_device *dev, 141int __must_check intel_ring_begin(struct intel_ring_buffer *ring, int n);
118 struct intel_ring_buffer *ring); 142
119int intel_wait_ring_buffer(struct drm_device *dev, 143static inline void intel_ring_emit(struct intel_ring_buffer *ring,
120 struct intel_ring_buffer *ring, int n); 144 u32 data)
121void intel_ring_begin(struct drm_device *dev,
122 struct intel_ring_buffer *ring, int n);
123
124static inline void intel_ring_emit(struct drm_device *dev,
125 struct intel_ring_buffer *ring,
126 unsigned int data)
127{ 145{
128 unsigned int *virt = ring->virtual_start + ring->tail; 146 iowrite32(data, ring->virtual_start + ring->tail);
129 *virt = data;
130 ring->tail += 4; 147 ring->tail += 4;
131} 148}
132 149
133void intel_ring_advance(struct drm_device *dev, 150void intel_ring_advance(struct intel_ring_buffer *ring);
134 struct intel_ring_buffer *ring);
135 151
136u32 intel_ring_get_seqno(struct drm_device *dev, 152u32 intel_ring_get_seqno(struct intel_ring_buffer *ring);
137 struct intel_ring_buffer *ring); 153int intel_ring_sync(struct intel_ring_buffer *ring,
154 struct intel_ring_buffer *to,
155 u32 seqno);
138 156
139int intel_init_render_ring_buffer(struct drm_device *dev); 157int intel_init_render_ring_buffer(struct drm_device *dev);
140int intel_init_bsd_ring_buffer(struct drm_device *dev); 158int intel_init_bsd_ring_buffer(struct drm_device *dev);
141int intel_init_blt_ring_buffer(struct drm_device *dev); 159int intel_init_blt_ring_buffer(struct drm_device *dev);
142 160
143u32 intel_ring_get_active_head(struct drm_device *dev, 161u32 intel_ring_get_active_head(struct intel_ring_buffer *ring);
144 struct intel_ring_buffer *ring); 162void intel_ring_setup_status_page(struct intel_ring_buffer *ring);
145void intel_ring_setup_status_page(struct drm_device *dev,
146 struct intel_ring_buffer *ring);
147 163
148#endif /* _INTEL_RINGBUFFER_H_ */ 164#endif /* _INTEL_RINGBUFFER_H_ */