diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ringbuffer.h')
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.h | 136 |
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 | ||
4 | enum { | ||
5 | RCS = 0x0, | ||
6 | VCS, | ||
7 | BCS, | ||
8 | I915_NUM_RINGS, | ||
9 | }; | ||
10 | |||
4 | struct intel_hw_status_page { | 11 | struct 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 | ||
19 | struct 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 | |||
20 | struct intel_ring_buffer { | 35 | struct 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 | ||
107 | static inline u32 | 113 | static inline u32 |
114 | intel_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 | |||
132 | static inline u32 | ||
108 | intel_read_status_page(struct intel_ring_buffer *ring, | 133 | intel_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 | ||
115 | int intel_init_ring_buffer(struct drm_device *dev, | 139 | void intel_cleanup_ring_buffer(struct intel_ring_buffer *ring); |
116 | struct intel_ring_buffer *ring); | 140 | int __must_check intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n); |
117 | void intel_cleanup_ring_buffer(struct drm_device *dev, | 141 | int __must_check intel_ring_begin(struct intel_ring_buffer *ring, int n); |
118 | struct intel_ring_buffer *ring); | 142 | |
119 | int intel_wait_ring_buffer(struct drm_device *dev, | 143 | static inline void intel_ring_emit(struct intel_ring_buffer *ring, |
120 | struct intel_ring_buffer *ring, int n); | 144 | u32 data) |
121 | void intel_ring_begin(struct drm_device *dev, | ||
122 | struct intel_ring_buffer *ring, int n); | ||
123 | |||
124 | static 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 | ||
133 | void intel_ring_advance(struct drm_device *dev, | 150 | void intel_ring_advance(struct intel_ring_buffer *ring); |
134 | struct intel_ring_buffer *ring); | ||
135 | 151 | ||
136 | u32 intel_ring_get_seqno(struct drm_device *dev, | 152 | u32 intel_ring_get_seqno(struct intel_ring_buffer *ring); |
137 | struct intel_ring_buffer *ring); | 153 | int intel_ring_sync(struct intel_ring_buffer *ring, |
154 | struct intel_ring_buffer *to, | ||
155 | u32 seqno); | ||
138 | 156 | ||
139 | int intel_init_render_ring_buffer(struct drm_device *dev); | 157 | int intel_init_render_ring_buffer(struct drm_device *dev); |
140 | int intel_init_bsd_ring_buffer(struct drm_device *dev); | 158 | int intel_init_bsd_ring_buffer(struct drm_device *dev); |
141 | int intel_init_blt_ring_buffer(struct drm_device *dev); | 159 | int intel_init_blt_ring_buffer(struct drm_device *dev); |
142 | 160 | ||
143 | u32 intel_ring_get_active_head(struct drm_device *dev, | 161 | u32 intel_ring_get_active_head(struct intel_ring_buffer *ring); |
144 | struct intel_ring_buffer *ring); | 162 | void intel_ring_setup_status_page(struct intel_ring_buffer *ring); |
145 | void 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_ */ |