Subversion Repositories Kolibri OS

Rev

Rev 2342 | Rev 2351 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2342 Rev 2344
1
/*
1
/*
2
 * Copyright © 2008-2010 Intel Corporation
2
 * Copyright © 2008-2010 Intel Corporation
3
 *
3
 *
4
 * Permission is hereby granted, free of charge, to any person obtaining a
4
 * Permission is hereby granted, free of charge, to any person obtaining a
5
 * copy of this software and associated documentation files (the "Software"),
5
 * copy of this software and associated documentation files (the "Software"),
6
 * to deal in the Software without restriction, including without limitation
6
 * to deal in the Software without restriction, including without limitation
7
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
7
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
 * and/or sell copies of the Software, and to permit persons to whom the
8
 * and/or sell copies of the Software, and to permit persons to whom the
9
 * Software is furnished to do so, subject to the following conditions:
9
 * Software is furnished to do so, subject to the following conditions:
10
 *
10
 *
11
 * The above copyright notice and this permission notice (including the next
11
 * The above copyright notice and this permission notice (including the next
12
 * paragraph) shall be included in all copies or substantial portions of the
12
 * paragraph) shall be included in all copies or substantial portions of the
13
 * Software.
13
 * Software.
14
 *
14
 *
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21
 * IN THE SOFTWARE.
21
 * IN THE SOFTWARE.
22
 *
22
 *
23
 * Authors:
23
 * Authors:
24
 *    Eric Anholt 
24
 *    Eric Anholt 
25
 *    Zou Nan hai 
25
 *    Zou Nan hai 
26
 *    Xiang Hai hao
26
 *    Xiang Hai hao
27
 *
27
 *
28
 */
28
 */
29
#define iowrite32(v, addr)      writel((v), (addr))
29
#define iowrite32(v, addr)      writel((v), (addr))
30
#define ioread32(addr)          readl(addr)
30
#define ioread32(addr)          readl(addr)
31
 
31
 
32
#include "drmP.h"
32
#include "drmP.h"
33
#include "drm.h"
33
#include "drm.h"
34
#include "i915_drv.h"
34
#include "i915_drv.h"
35
#include "i915_drm.h"
35
#include "i915_drm.h"
36
//#include "i915_trace.h"
36
//#include "i915_trace.h"
37
#include "intel_drv.h"
37
#include "intel_drv.h"
38
 
38
 
39
/*
39
/*
40
 * 965+ support PIPE_CONTROL commands, which provide finer grained control
40
 * 965+ support PIPE_CONTROL commands, which provide finer grained control
41
 * over cache flushing.
41
 * over cache flushing.
42
 */
42
 */
43
struct pipe_control {
43
struct pipe_control {
44
	struct drm_i915_gem_object *obj;
44
	struct drm_i915_gem_object *obj;
45
	volatile u32 *cpu_page;
45
	volatile u32 *cpu_page;
46
	u32 gtt_offset;
46
	u32 gtt_offset;
47
};
47
};
48
 
48
 
49
static inline int ring_space(struct intel_ring_buffer *ring)
49
static inline int ring_space(struct intel_ring_buffer *ring)
50
{
50
{
51
	int space = (ring->head & HEAD_ADDR) - (ring->tail + 8);
51
	int space = (ring->head & HEAD_ADDR) - (ring->tail + 8);
52
	if (space < 0)
52
	if (space < 0)
53
		space += ring->size;
53
		space += ring->size;
54
	return space;
54
	return space;
55
}
55
}
56
 
56
 
57
static u32 i915_gem_get_seqno(struct drm_device *dev)
57
static u32 i915_gem_get_seqno(struct drm_device *dev)
58
{
58
{
59
	drm_i915_private_t *dev_priv = dev->dev_private;
59
	drm_i915_private_t *dev_priv = dev->dev_private;
60
	u32 seqno;
60
	u32 seqno;
61
 
61
 
62
	seqno = dev_priv->next_seqno;
62
	seqno = dev_priv->next_seqno;
63
 
63
 
64
	/* reserve 0 for non-seqno */
64
	/* reserve 0 for non-seqno */
65
	if (++dev_priv->next_seqno == 0)
65
	if (++dev_priv->next_seqno == 0)
66
		dev_priv->next_seqno = 1;
66
		dev_priv->next_seqno = 1;
67
 
67
 
68
	return seqno;
68
	return seqno;
69
}
69
}
70
 
70
 
71
static int
71
static int
72
render_ring_flush(struct intel_ring_buffer *ring,
72
render_ring_flush(struct intel_ring_buffer *ring,
73
		  u32	invalidate_domains,
73
		  u32	invalidate_domains,
74
		  u32	flush_domains)
74
		  u32	flush_domains)
75
{
75
{
76
	struct drm_device *dev = ring->dev;
76
	struct drm_device *dev = ring->dev;
77
	u32 cmd;
77
	u32 cmd;
78
	int ret;
78
	int ret;
79
 
79
 
80
	/*
80
	/*
81
	 * read/write caches:
81
	 * read/write caches:
82
	 *
82
	 *
83
	 * I915_GEM_DOMAIN_RENDER is always invalidated, but is
83
	 * I915_GEM_DOMAIN_RENDER is always invalidated, but is
84
	 * only flushed if MI_NO_WRITE_FLUSH is unset.  On 965, it is
84
	 * only flushed if MI_NO_WRITE_FLUSH is unset.  On 965, it is
85
	 * also flushed at 2d versus 3d pipeline switches.
85
	 * also flushed at 2d versus 3d pipeline switches.
86
	 *
86
	 *
87
	 * read-only caches:
87
	 * read-only caches:
88
	 *
88
	 *
89
	 * I915_GEM_DOMAIN_SAMPLER is flushed on pre-965 if
89
	 * I915_GEM_DOMAIN_SAMPLER is flushed on pre-965 if
90
	 * MI_READ_FLUSH is set, and is always flushed on 965.
90
	 * MI_READ_FLUSH is set, and is always flushed on 965.
91
	 *
91
	 *
92
	 * I915_GEM_DOMAIN_COMMAND may not exist?
92
	 * I915_GEM_DOMAIN_COMMAND may not exist?
93
	 *
93
	 *
94
	 * I915_GEM_DOMAIN_INSTRUCTION, which exists on 965, is
94
	 * I915_GEM_DOMAIN_INSTRUCTION, which exists on 965, is
95
	 * invalidated when MI_EXE_FLUSH is set.
95
	 * invalidated when MI_EXE_FLUSH is set.
96
	 *
96
	 *
97
	 * I915_GEM_DOMAIN_VERTEX, which exists on 965, is
97
	 * I915_GEM_DOMAIN_VERTEX, which exists on 965, is
98
	 * invalidated with every MI_FLUSH.
98
	 * invalidated with every MI_FLUSH.
99
	 *
99
	 *
100
	 * TLBs:
100
	 * TLBs:
101
	 *
101
	 *
102
	 * On 965, TLBs associated with I915_GEM_DOMAIN_COMMAND
102
	 * On 965, TLBs associated with I915_GEM_DOMAIN_COMMAND
103
	 * and I915_GEM_DOMAIN_CPU in are invalidated at PTE write and
103
	 * and I915_GEM_DOMAIN_CPU in are invalidated at PTE write and
104
	 * I915_GEM_DOMAIN_RENDER and I915_GEM_DOMAIN_SAMPLER
104
	 * I915_GEM_DOMAIN_RENDER and I915_GEM_DOMAIN_SAMPLER
105
	 * are flushed at any MI_FLUSH.
105
	 * are flushed at any MI_FLUSH.
106
	 */
106
	 */
107
 
107
 
108
	cmd = MI_FLUSH | MI_NO_WRITE_FLUSH;
108
	cmd = MI_FLUSH | MI_NO_WRITE_FLUSH;
109
	if ((invalidate_domains|flush_domains) &
109
	if ((invalidate_domains|flush_domains) &
110
	    I915_GEM_DOMAIN_RENDER)
110
	    I915_GEM_DOMAIN_RENDER)
111
		cmd &= ~MI_NO_WRITE_FLUSH;
111
		cmd &= ~MI_NO_WRITE_FLUSH;
112
	if (INTEL_INFO(dev)->gen < 4) {
112
	if (INTEL_INFO(dev)->gen < 4) {
113
		/*
113
		/*
114
		 * On the 965, the sampler cache always gets flushed
114
		 * On the 965, the sampler cache always gets flushed
115
		 * and this bit is reserved.
115
		 * and this bit is reserved.
116
		 */
116
		 */
117
		if (invalidate_domains & I915_GEM_DOMAIN_SAMPLER)
117
		if (invalidate_domains & I915_GEM_DOMAIN_SAMPLER)
118
			cmd |= MI_READ_FLUSH;
118
			cmd |= MI_READ_FLUSH;
119
	}
119
	}
120
	if (invalidate_domains & I915_GEM_DOMAIN_INSTRUCTION)
120
	if (invalidate_domains & I915_GEM_DOMAIN_INSTRUCTION)
121
		cmd |= MI_EXE_FLUSH;
121
		cmd |= MI_EXE_FLUSH;
122
 
122
 
123
	if (invalidate_domains & I915_GEM_DOMAIN_COMMAND &&
123
	if (invalidate_domains & I915_GEM_DOMAIN_COMMAND &&
124
	    (IS_G4X(dev) || IS_GEN5(dev)))
124
	    (IS_G4X(dev) || IS_GEN5(dev)))
125
		cmd |= MI_INVALIDATE_ISP;
125
		cmd |= MI_INVALIDATE_ISP;
126
 
126
 
127
	ret = intel_ring_begin(ring, 2);
127
	ret = intel_ring_begin(ring, 2);
128
	if (ret)
128
	if (ret)
129
		return ret;
129
		return ret;
130
 
130
 
131
	intel_ring_emit(ring, cmd);
131
	intel_ring_emit(ring, cmd);
132
	intel_ring_emit(ring, MI_NOOP);
132
	intel_ring_emit(ring, MI_NOOP);
133
	intel_ring_advance(ring);
133
	intel_ring_advance(ring);
134
 
134
 
135
	return 0;
135
	return 0;
136
}
136
}
137
 
137
 
138
/**
138
/**
139
 * Emits a PIPE_CONTROL with a non-zero post-sync operation, for
139
 * Emits a PIPE_CONTROL with a non-zero post-sync operation, for
140
 * implementing two workarounds on gen6.  From section 1.4.7.1
140
 * implementing two workarounds on gen6.  From section 1.4.7.1
141
 * "PIPE_CONTROL" of the Sandy Bridge PRM volume 2 part 1:
141
 * "PIPE_CONTROL" of the Sandy Bridge PRM volume 2 part 1:
142
 *
142
 *
143
 * [DevSNB-C+{W/A}] Before any depth stall flush (including those
143
 * [DevSNB-C+{W/A}] Before any depth stall flush (including those
144
 * produced by non-pipelined state commands), software needs to first
144
 * produced by non-pipelined state commands), software needs to first
145
 * send a PIPE_CONTROL with no bits set except Post-Sync Operation !=
145
 * send a PIPE_CONTROL with no bits set except Post-Sync Operation !=
146
 * 0.
146
 * 0.
147
 *
147
 *
148
 * [Dev-SNB{W/A}]: Before a PIPE_CONTROL with Write Cache Flush Enable
148
 * [Dev-SNB{W/A}]: Before a PIPE_CONTROL with Write Cache Flush Enable
149
 * =1, a PIPE_CONTROL with any non-zero post-sync-op is required.
149
 * =1, a PIPE_CONTROL with any non-zero post-sync-op is required.
150
 *
150
 *
151
 * And the workaround for these two requires this workaround first:
151
 * And the workaround for these two requires this workaround first:
152
 *
152
 *
153
 * [Dev-SNB{W/A}]: Pipe-control with CS-stall bit set must be sent
153
 * [Dev-SNB{W/A}]: Pipe-control with CS-stall bit set must be sent
154
 * BEFORE the pipe-control with a post-sync op and no write-cache
154
 * BEFORE the pipe-control with a post-sync op and no write-cache
155
 * flushes.
155
 * flushes.
156
 *
156
 *
157
 * And this last workaround is tricky because of the requirements on
157
 * And this last workaround is tricky because of the requirements on
158
 * that bit.  From section 1.4.7.2.3 "Stall" of the Sandy Bridge PRM
158
 * that bit.  From section 1.4.7.2.3 "Stall" of the Sandy Bridge PRM
159
 * volume 2 part 1:
159
 * volume 2 part 1:
160
 *
160
 *
161
 *     "1 of the following must also be set:
161
 *     "1 of the following must also be set:
162
 *      - Render Target Cache Flush Enable ([12] of DW1)
162
 *      - Render Target Cache Flush Enable ([12] of DW1)
163
 *      - Depth Cache Flush Enable ([0] of DW1)
163
 *      - Depth Cache Flush Enable ([0] of DW1)
164
 *      - Stall at Pixel Scoreboard ([1] of DW1)
164
 *      - Stall at Pixel Scoreboard ([1] of DW1)
165
 *      - Depth Stall ([13] of DW1)
165
 *      - Depth Stall ([13] of DW1)
166
 *      - Post-Sync Operation ([13] of DW1)
166
 *      - Post-Sync Operation ([13] of DW1)
167
 *      - Notify Enable ([8] of DW1)"
167
 *      - Notify Enable ([8] of DW1)"
168
 *
168
 *
169
 * The cache flushes require the workaround flush that triggered this
169
 * The cache flushes require the workaround flush that triggered this
170
 * one, so we can't use it.  Depth stall would trigger the same.
170
 * one, so we can't use it.  Depth stall would trigger the same.
171
 * Post-sync nonzero is what triggered this second workaround, so we
171
 * Post-sync nonzero is what triggered this second workaround, so we
172
 * can't use that one either.  Notify enable is IRQs, which aren't
172
 * can't use that one either.  Notify enable is IRQs, which aren't
173
 * really our business.  That leaves only stall at scoreboard.
173
 * really our business.  That leaves only stall at scoreboard.
174
 */
174
 */
175
static int
175
static int
176
intel_emit_post_sync_nonzero_flush(struct intel_ring_buffer *ring)
176
intel_emit_post_sync_nonzero_flush(struct intel_ring_buffer *ring)
177
{
177
{
178
	struct pipe_control *pc = ring->private;
178
	struct pipe_control *pc = ring->private;
179
	u32 scratch_addr = pc->gtt_offset + 128;
179
	u32 scratch_addr = pc->gtt_offset + 128;
180
	int ret;
180
	int ret;
181
 
181
 
182
 
182
 
183
	ret = intel_ring_begin(ring, 6);
183
	ret = intel_ring_begin(ring, 6);
184
	if (ret)
184
	if (ret)
185
		return ret;
185
		return ret;
186
 
186
 
187
	intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(5));
187
	intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(5));
188
	intel_ring_emit(ring, PIPE_CONTROL_CS_STALL |
188
	intel_ring_emit(ring, PIPE_CONTROL_CS_STALL |
189
			PIPE_CONTROL_STALL_AT_SCOREBOARD);
189
			PIPE_CONTROL_STALL_AT_SCOREBOARD);
190
	intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT); /* address */
190
	intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT); /* address */
191
	intel_ring_emit(ring, 0); /* low dword */
191
	intel_ring_emit(ring, 0); /* low dword */
192
	intel_ring_emit(ring, 0); /* high dword */
192
	intel_ring_emit(ring, 0); /* high dword */
193
	intel_ring_emit(ring, MI_NOOP);
193
	intel_ring_emit(ring, MI_NOOP);
194
	intel_ring_advance(ring);
194
	intel_ring_advance(ring);
195
 
195
 
196
	ret = intel_ring_begin(ring, 6);
196
	ret = intel_ring_begin(ring, 6);
197
	if (ret)
197
	if (ret)
198
		return ret;
198
		return ret;
199
 
199
 
200
	intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(5));
200
	intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(5));
201
	intel_ring_emit(ring, PIPE_CONTROL_QW_WRITE);
201
	intel_ring_emit(ring, PIPE_CONTROL_QW_WRITE);
202
	intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT); /* address */
202
	intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT); /* address */
203
	intel_ring_emit(ring, 0);
203
	intel_ring_emit(ring, 0);
204
	intel_ring_emit(ring, 0);
204
	intel_ring_emit(ring, 0);
205
	intel_ring_emit(ring, MI_NOOP);
205
	intel_ring_emit(ring, MI_NOOP);
206
	intel_ring_advance(ring);
206
	intel_ring_advance(ring);
207
 
207
 
208
	return 0;
208
	return 0;
209
}
209
}
210
 
210
 
211
static int
211
static int
212
gen6_render_ring_flush(struct intel_ring_buffer *ring,
212
gen6_render_ring_flush(struct intel_ring_buffer *ring,
213
                         u32 invalidate_domains, u32 flush_domains)
213
                         u32 invalidate_domains, u32 flush_domains)
214
{
214
{
215
	u32 flags = 0;
215
	u32 flags = 0;
216
	struct pipe_control *pc = ring->private;
216
	struct pipe_control *pc = ring->private;
217
	u32 scratch_addr = pc->gtt_offset + 128;
217
	u32 scratch_addr = pc->gtt_offset + 128;
218
	int ret;
218
	int ret;
219
 
219
 
220
	/* Force SNB workarounds for PIPE_CONTROL flushes */
220
	/* Force SNB workarounds for PIPE_CONTROL flushes */
221
	intel_emit_post_sync_nonzero_flush(ring);
221
	intel_emit_post_sync_nonzero_flush(ring);
222
 
222
 
223
	/* Just flush everything.  Experiments have shown that reducing the
223
	/* Just flush everything.  Experiments have shown that reducing the
224
	 * number of bits based on the write domains has little performance
224
	 * number of bits based on the write domains has little performance
225
	 * impact.
225
	 * impact.
226
	 */
226
	 */
227
	flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
227
	flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
228
	flags |= PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE;
228
	flags |= PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE;
229
	flags |= PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE;
229
	flags |= PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE;
230
	flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH;
230
	flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH;
231
	flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE;
231
	flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE;
232
	flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE;
232
	flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE;
233
	flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE;
233
	flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE;
234
 
234
 
235
	ret = intel_ring_begin(ring, 6);
235
	ret = intel_ring_begin(ring, 6);
236
	if (ret)
236
	if (ret)
237
		return ret;
237
		return ret;
238
 
238
 
239
	intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(5));
239
	intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(5));
240
	intel_ring_emit(ring, flags);
240
	intel_ring_emit(ring, flags);
241
	intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT);
241
	intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT);
242
	intel_ring_emit(ring, 0); /* lower dword */
242
	intel_ring_emit(ring, 0); /* lower dword */
243
	intel_ring_emit(ring, 0); /* uppwer dword */
243
	intel_ring_emit(ring, 0); /* uppwer dword */
244
	intel_ring_emit(ring, MI_NOOP);
244
	intel_ring_emit(ring, MI_NOOP);
245
	intel_ring_advance(ring);
245
	intel_ring_advance(ring);
246
 
246
 
247
	return 0;
247
	return 0;
248
}
248
}
249
 
249
 
250
static void ring_write_tail(struct intel_ring_buffer *ring,
250
static void ring_write_tail(struct intel_ring_buffer *ring,
251
			    u32 value)
251
			    u32 value)
252
{
252
{
253
	drm_i915_private_t *dev_priv = ring->dev->dev_private;
253
	drm_i915_private_t *dev_priv = ring->dev->dev_private;
254
	I915_WRITE_TAIL(ring, value);
254
	I915_WRITE_TAIL(ring, value);
255
}
255
}
256
 
256
 
257
u32 intel_ring_get_active_head(struct intel_ring_buffer *ring)
257
u32 intel_ring_get_active_head(struct intel_ring_buffer *ring)
258
{
258
{
259
	drm_i915_private_t *dev_priv = ring->dev->dev_private;
259
	drm_i915_private_t *dev_priv = ring->dev->dev_private;
260
	u32 acthd_reg = INTEL_INFO(ring->dev)->gen >= 4 ?
260
	u32 acthd_reg = INTEL_INFO(ring->dev)->gen >= 4 ?
261
			RING_ACTHD(ring->mmio_base) : ACTHD;
261
			RING_ACTHD(ring->mmio_base) : ACTHD;
262
 
262
 
263
	return I915_READ(acthd_reg);
263
	return I915_READ(acthd_reg);
264
}
264
}
265
 
265
 
266
static int init_ring_common(struct intel_ring_buffer *ring)
266
static int init_ring_common(struct intel_ring_buffer *ring)
267
{
267
{
268
	drm_i915_private_t *dev_priv = ring->dev->dev_private;
268
	drm_i915_private_t *dev_priv = ring->dev->dev_private;
269
	struct drm_i915_gem_object *obj = ring->obj;
269
	struct drm_i915_gem_object *obj = ring->obj;
270
	u32 head;
270
	u32 head;
271
 
271
 
272
	/* Stop the ring if it's running. */
272
	/* Stop the ring if it's running. */
273
	I915_WRITE_CTL(ring, 0);
273
	I915_WRITE_CTL(ring, 0);
274
	I915_WRITE_HEAD(ring, 0);
274
	I915_WRITE_HEAD(ring, 0);
275
	ring->write_tail(ring, 0);
275
	ring->write_tail(ring, 0);
276
 
276
 
277
	/* Initialize the ring. */
277
	/* Initialize the ring. */
278
	I915_WRITE_START(ring, obj->gtt_offset);
278
	I915_WRITE_START(ring, obj->gtt_offset);
279
	head = I915_READ_HEAD(ring) & HEAD_ADDR;
279
	head = I915_READ_HEAD(ring) & HEAD_ADDR;
280
 
280
 
281
	/* G45 ring initialization fails to reset head to zero */
281
	/* G45 ring initialization fails to reset head to zero */
282
	if (head != 0) {
282
	if (head != 0) {
283
		DRM_DEBUG_KMS("%s head not reset to zero "
283
		DRM_DEBUG_KMS("%s head not reset to zero "
284
			      "ctl %08x head %08x tail %08x start %08x\n",
284
			      "ctl %08x head %08x tail %08x start %08x\n",
285
			      ring->name,
285
			      ring->name,
286
			      I915_READ_CTL(ring),
286
			      I915_READ_CTL(ring),
287
			      I915_READ_HEAD(ring),
287
			      I915_READ_HEAD(ring),
288
			      I915_READ_TAIL(ring),
288
			      I915_READ_TAIL(ring),
289
			      I915_READ_START(ring));
289
			      I915_READ_START(ring));
290
 
290
 
291
		I915_WRITE_HEAD(ring, 0);
291
		I915_WRITE_HEAD(ring, 0);
292
 
292
 
293
		if (I915_READ_HEAD(ring) & HEAD_ADDR) {
293
		if (I915_READ_HEAD(ring) & HEAD_ADDR) {
294
			DRM_ERROR("failed to set %s head to zero "
294
			DRM_ERROR("failed to set %s head to zero "
295
				  "ctl %08x head %08x tail %08x start %08x\n",
295
				  "ctl %08x head %08x tail %08x start %08x\n",
296
				  ring->name,
296
				  ring->name,
297
				  I915_READ_CTL(ring),
297
				  I915_READ_CTL(ring),
298
				  I915_READ_HEAD(ring),
298
				  I915_READ_HEAD(ring),
299
				  I915_READ_TAIL(ring),
299
				  I915_READ_TAIL(ring),
300
				  I915_READ_START(ring));
300
				  I915_READ_START(ring));
301
		}
301
		}
302
	}
302
	}
303
 
303
 
304
	I915_WRITE_CTL(ring,
304
	I915_WRITE_CTL(ring,
305
			((ring->size - PAGE_SIZE) & RING_NR_PAGES)
305
			((ring->size - PAGE_SIZE) & RING_NR_PAGES)
306
			| RING_REPORT_64K | RING_VALID);
306
			| RING_REPORT_64K | RING_VALID);
307
 
307
 
308
	/* If the head is still not zero, the ring is dead */
308
	/* If the head is still not zero, the ring is dead */
309
	if ((I915_READ_CTL(ring) & RING_VALID) == 0 ||
309
	if ((I915_READ_CTL(ring) & RING_VALID) == 0 ||
310
	    I915_READ_START(ring) != obj->gtt_offset ||
310
	    I915_READ_START(ring) != obj->gtt_offset ||
311
	    (I915_READ_HEAD(ring) & HEAD_ADDR) != 0) {
311
	    (I915_READ_HEAD(ring) & HEAD_ADDR) != 0) {
312
		DRM_ERROR("%s initialization failed "
312
		DRM_ERROR("%s initialization failed "
313
				"ctl %08x head %08x tail %08x start %08x\n",
313
				"ctl %08x head %08x tail %08x start %08x\n",
314
				ring->name,
314
				ring->name,
315
				I915_READ_CTL(ring),
315
				I915_READ_CTL(ring),
316
				I915_READ_HEAD(ring),
316
				I915_READ_HEAD(ring),
317
				I915_READ_TAIL(ring),
317
				I915_READ_TAIL(ring),
318
				I915_READ_START(ring));
318
				I915_READ_START(ring));
319
		return -EIO;
319
		return -EIO;
320
	}
320
	}
321
 
321
 
322
    ring->head = I915_READ_HEAD(ring);
322
    ring->head = I915_READ_HEAD(ring);
323
    ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR;
323
    ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR;
324
    ring->space = ring_space(ring);
324
    ring->space = ring_space(ring);
325
 
325
 
326
 
326
 
327
	return 0;
327
	return 0;
328
}
328
}
329
 
329
 
330
static int
330
static int
331
init_pipe_control(struct intel_ring_buffer *ring)
331
init_pipe_control(struct intel_ring_buffer *ring)
332
{
332
{
333
	struct pipe_control *pc;
333
	struct pipe_control *pc;
334
	struct drm_i915_gem_object *obj;
334
	struct drm_i915_gem_object *obj;
335
	int ret;
335
	int ret;
336
 
336
 
337
	if (ring->private)
337
	if (ring->private)
338
		return 0;
338
		return 0;
339
 
339
 
340
	pc = kmalloc(sizeof(*pc), GFP_KERNEL);
340
	pc = kmalloc(sizeof(*pc), GFP_KERNEL);
341
	if (!pc)
341
	if (!pc)
342
		return -ENOMEM;
342
		return -ENOMEM;
343
 
343
 
344
	obj = i915_gem_alloc_object(ring->dev, 4096);
344
	obj = i915_gem_alloc_object(ring->dev, 4096);
345
	if (obj == NULL) {
345
	if (obj == NULL) {
346
		DRM_ERROR("Failed to allocate seqno page\n");
346
		DRM_ERROR("Failed to allocate seqno page\n");
347
		ret = -ENOMEM;
347
		ret = -ENOMEM;
348
		goto err;
348
		goto err;
349
	}
349
	}
350
 
350
 
351
//   i915_gem_object_set_cache_level(obj, I915_CACHE_LLC);
351
//   i915_gem_object_set_cache_level(obj, I915_CACHE_LLC);
352
 
352
 
353
	ret = i915_gem_object_pin(obj, 4096, true);
353
	ret = i915_gem_object_pin(obj, 4096, true);
354
	if (ret)
354
	if (ret)
355
		goto err_unref;
355
		goto err_unref;
356
 
356
 
357
	pc->gtt_offset = obj->gtt_offset;
357
	pc->gtt_offset = obj->gtt_offset;
358
    pc->cpu_page =  (void*)MapIoMem(obj->pages[0], 4096, PG_SW);
358
    pc->cpu_page =  (void*)MapIoMem(obj->pages[0], 4096, PG_SW);
359
	if (pc->cpu_page == NULL)
359
	if (pc->cpu_page == NULL)
360
		goto err_unpin;
360
		goto err_unpin;
361
 
361
 
362
	pc->obj = obj;
362
	pc->obj = obj;
363
	ring->private = pc;
363
	ring->private = pc;
364
	return 0;
364
	return 0;
365
 
365
 
366
err_unpin:
366
err_unpin:
367
//   i915_gem_object_unpin(obj);
367
	i915_gem_object_unpin(obj);
368
err_unref:
368
err_unref:
369
//   drm_gem_object_unreference(&obj->base);
369
	drm_gem_object_unreference(&obj->base);
370
err:
370
err:
371
	kfree(pc);
371
	kfree(pc);
372
	return ret;
372
	return ret;
373
}
373
}
374
 
374
 
375
static void
375
static void
376
cleanup_pipe_control(struct intel_ring_buffer *ring)
376
cleanup_pipe_control(struct intel_ring_buffer *ring)
377
{
377
{
378
	struct pipe_control *pc = ring->private;
378
	struct pipe_control *pc = ring->private;
379
	struct drm_i915_gem_object *obj;
379
	struct drm_i915_gem_object *obj;
380
 
380
 
381
	if (!ring->private)
381
	if (!ring->private)
382
		return;
382
		return;
383
 
383
 
384
	obj = pc->obj;
384
	obj = pc->obj;
385
//	kunmap(obj->pages[0]);
385
//	kunmap(obj->pages[0]);
386
//	i915_gem_object_unpin(obj);
386
	i915_gem_object_unpin(obj);
387
//	drm_gem_object_unreference(&obj->base);
387
	drm_gem_object_unreference(&obj->base);
388
 
388
 
389
	kfree(pc);
389
	kfree(pc);
390
	ring->private = NULL;
390
	ring->private = NULL;
391
}
391
}
392
 
392
 
393
static int init_render_ring(struct intel_ring_buffer *ring)
393
static int init_render_ring(struct intel_ring_buffer *ring)
394
{
394
{
395
	struct drm_device *dev = ring->dev;
395
	struct drm_device *dev = ring->dev;
396
	struct drm_i915_private *dev_priv = dev->dev_private;
396
	struct drm_i915_private *dev_priv = dev->dev_private;
397
	int ret = init_ring_common(ring);
397
	int ret = init_ring_common(ring);
398
 
398
 
399
	if (INTEL_INFO(dev)->gen > 3) {
399
	if (INTEL_INFO(dev)->gen > 3) {
400
		int mode = VS_TIMER_DISPATCH << 16 | VS_TIMER_DISPATCH;
400
		int mode = VS_TIMER_DISPATCH << 16 | VS_TIMER_DISPATCH;
401
		if (IS_GEN6(dev) || IS_GEN7(dev))
401
		if (IS_GEN6(dev) || IS_GEN7(dev))
402
			mode |= MI_FLUSH_ENABLE << 16 | MI_FLUSH_ENABLE;
402
			mode |= MI_FLUSH_ENABLE << 16 | MI_FLUSH_ENABLE;
403
		I915_WRITE(MI_MODE, mode);
403
		I915_WRITE(MI_MODE, mode);
404
		if (IS_GEN7(dev))
404
		if (IS_GEN7(dev))
405
			I915_WRITE(GFX_MODE_GEN7,
405
			I915_WRITE(GFX_MODE_GEN7,
406
				   GFX_MODE_DISABLE(GFX_TLB_INVALIDATE_ALWAYS) |
406
				   GFX_MODE_DISABLE(GFX_TLB_INVALIDATE_ALWAYS) |
407
				   GFX_MODE_ENABLE(GFX_REPLAY_MODE));
407
				   GFX_MODE_ENABLE(GFX_REPLAY_MODE));
408
	}
408
	}
409
 
409
 
410
	if (INTEL_INFO(dev)->gen >= 5) {
410
	if (INTEL_INFO(dev)->gen >= 5) {
411
		ret = init_pipe_control(ring);
411
		ret = init_pipe_control(ring);
412
		if (ret)
412
		if (ret)
413
			return ret;
413
			return ret;
414
	}
414
	}
415
 
415
 
416
	if (INTEL_INFO(dev)->gen >= 6) {
416
	if (INTEL_INFO(dev)->gen >= 6) {
417
		I915_WRITE(INSTPM,
417
		I915_WRITE(INSTPM,
418
			   INSTPM_FORCE_ORDERING << 16 | INSTPM_FORCE_ORDERING);
418
			   INSTPM_FORCE_ORDERING << 16 | INSTPM_FORCE_ORDERING);
419
	}
419
	}
420
 
420
 
421
	return ret;
421
	return ret;
422
}
422
}
423
 
423
 
424
static void render_ring_cleanup(struct intel_ring_buffer *ring)
424
static void render_ring_cleanup(struct intel_ring_buffer *ring)
425
{
425
{
426
	if (!ring->private)
426
	if (!ring->private)
427
		return;
427
		return;
428
 
428
 
429
	cleanup_pipe_control(ring);
429
	cleanup_pipe_control(ring);
430
}
430
}
431
 
431
 
432
static void
432
static void
433
update_mboxes(struct intel_ring_buffer *ring,
433
update_mboxes(struct intel_ring_buffer *ring,
434
	    u32 seqno,
434
	    u32 seqno,
435
	    u32 mmio_offset)
435
	    u32 mmio_offset)
436
{
436
{
437
	intel_ring_emit(ring, MI_SEMAPHORE_MBOX |
437
	intel_ring_emit(ring, MI_SEMAPHORE_MBOX |
438
			      MI_SEMAPHORE_GLOBAL_GTT |
438
			      MI_SEMAPHORE_GLOBAL_GTT |
439
			MI_SEMAPHORE_REGISTER |
439
			MI_SEMAPHORE_REGISTER |
440
			MI_SEMAPHORE_UPDATE);
440
			MI_SEMAPHORE_UPDATE);
441
	intel_ring_emit(ring, seqno);
441
	intel_ring_emit(ring, seqno);
442
	intel_ring_emit(ring, mmio_offset);
442
	intel_ring_emit(ring, mmio_offset);
443
}
443
}
444
 
444
 
445
/**
445
/**
446
 * gen6_add_request - Update the semaphore mailbox registers
446
 * gen6_add_request - Update the semaphore mailbox registers
447
 *
447
 *
448
 * @ring - ring that is adding a request
448
 * @ring - ring that is adding a request
449
 * @seqno - return seqno stuck into the ring
449
 * @seqno - return seqno stuck into the ring
450
 *
450
 *
451
 * Update the mailbox registers in the *other* rings with the current seqno.
451
 * Update the mailbox registers in the *other* rings with the current seqno.
452
 * This acts like a signal in the canonical semaphore.
452
 * This acts like a signal in the canonical semaphore.
453
 */
453
 */
454
static int
454
static int
455
gen6_add_request(struct intel_ring_buffer *ring,
455
gen6_add_request(struct intel_ring_buffer *ring,
456
		 u32 *seqno)
456
		 u32 *seqno)
457
{
457
{
458
	u32 mbox1_reg;
458
	u32 mbox1_reg;
459
	u32 mbox2_reg;
459
	u32 mbox2_reg;
460
	int ret;
460
	int ret;
461
 
461
 
462
	ret = intel_ring_begin(ring, 10);
462
	ret = intel_ring_begin(ring, 10);
463
	if (ret)
463
	if (ret)
464
		return ret;
464
		return ret;
465
 
465
 
466
	mbox1_reg = ring->signal_mbox[0];
466
	mbox1_reg = ring->signal_mbox[0];
467
	mbox2_reg = ring->signal_mbox[1];
467
	mbox2_reg = ring->signal_mbox[1];
468
 
468
 
469
	*seqno = i915_gem_get_seqno(ring->dev);
469
	*seqno = i915_gem_get_seqno(ring->dev);
470
 
470
 
471
	update_mboxes(ring, *seqno, mbox1_reg);
471
	update_mboxes(ring, *seqno, mbox1_reg);
472
	update_mboxes(ring, *seqno, mbox2_reg);
472
	update_mboxes(ring, *seqno, mbox2_reg);
473
	intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
473
	intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
474
	intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
474
	intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
475
	intel_ring_emit(ring, *seqno);
475
	intel_ring_emit(ring, *seqno);
476
	intel_ring_emit(ring, MI_USER_INTERRUPT);
476
	intel_ring_emit(ring, MI_USER_INTERRUPT);
477
	intel_ring_advance(ring);
477
	intel_ring_advance(ring);
478
 
478
 
479
	return 0;
479
	return 0;
480
}
480
}
481
 
481
 
482
/**
482
/**
483
 * intel_ring_sync - sync the waiter to the signaller on seqno
483
 * intel_ring_sync - sync the waiter to the signaller on seqno
484
 *
484
 *
485
 * @waiter - ring that is waiting
485
 * @waiter - ring that is waiting
486
 * @signaller - ring which has, or will signal
486
 * @signaller - ring which has, or will signal
487
 * @seqno - seqno which the waiter will block on
487
 * @seqno - seqno which the waiter will block on
488
 */
488
 */
489
static int
489
static int
490
intel_ring_sync(struct intel_ring_buffer *waiter,
490
intel_ring_sync(struct intel_ring_buffer *waiter,
491
		struct intel_ring_buffer *signaller,
491
		struct intel_ring_buffer *signaller,
492
		int ring,
492
		int ring,
493
		u32 seqno)
493
		u32 seqno)
494
{
494
{
495
	int ret;
495
	int ret;
496
	u32 dw1 = MI_SEMAPHORE_MBOX |
496
	u32 dw1 = MI_SEMAPHORE_MBOX |
497
		  MI_SEMAPHORE_COMPARE |
497
		  MI_SEMAPHORE_COMPARE |
498
		  MI_SEMAPHORE_REGISTER;
498
		  MI_SEMAPHORE_REGISTER;
499
 
499
 
500
	ret = intel_ring_begin(waiter, 4);
500
	ret = intel_ring_begin(waiter, 4);
501
	if (ret)
501
	if (ret)
502
		return ret;
502
		return ret;
503
 
503
 
504
	intel_ring_emit(waiter, dw1 | signaller->semaphore_register[ring]);
504
	intel_ring_emit(waiter, dw1 | signaller->semaphore_register[ring]);
505
	intel_ring_emit(waiter, seqno);
505
	intel_ring_emit(waiter, seqno);
506
	intel_ring_emit(waiter, 0);
506
	intel_ring_emit(waiter, 0);
507
	intel_ring_emit(waiter, MI_NOOP);
507
	intel_ring_emit(waiter, MI_NOOP);
508
	intel_ring_advance(waiter);
508
	intel_ring_advance(waiter);
509
 
509
 
510
	return 0;
510
	return 0;
511
}
511
}
512
 
512
 
513
/* VCS->RCS (RVSYNC) or BCS->RCS (RBSYNC) */
513
/* VCS->RCS (RVSYNC) or BCS->RCS (RBSYNC) */
514
int
514
int
515
render_ring_sync_to(struct intel_ring_buffer *waiter,
515
render_ring_sync_to(struct intel_ring_buffer *waiter,
516
		    struct intel_ring_buffer *signaller,
516
		    struct intel_ring_buffer *signaller,
517
		    u32 seqno)
517
		    u32 seqno)
518
{
518
{
519
//   WARN_ON(signaller->semaphore_register[RCS] == MI_SEMAPHORE_SYNC_INVALID);
519
//   WARN_ON(signaller->semaphore_register[RCS] == MI_SEMAPHORE_SYNC_INVALID);
520
	return intel_ring_sync(waiter,
520
	return intel_ring_sync(waiter,
521
			       signaller,
521
			       signaller,
522
			       RCS,
522
			       RCS,
523
			       seqno);
523
			       seqno);
524
}
524
}
525
 
525
 
526
/* RCS->VCS (VRSYNC) or BCS->VCS (VBSYNC) */
526
/* RCS->VCS (VRSYNC) or BCS->VCS (VBSYNC) */
527
int
527
int
528
gen6_bsd_ring_sync_to(struct intel_ring_buffer *waiter,
528
gen6_bsd_ring_sync_to(struct intel_ring_buffer *waiter,
529
		      struct intel_ring_buffer *signaller,
529
		      struct intel_ring_buffer *signaller,
530
		      u32 seqno)
530
		      u32 seqno)
531
{
531
{
532
//   WARN_ON(signaller->semaphore_register[VCS] == MI_SEMAPHORE_SYNC_INVALID);
532
//   WARN_ON(signaller->semaphore_register[VCS] == MI_SEMAPHORE_SYNC_INVALID);
533
	return intel_ring_sync(waiter,
533
	return intel_ring_sync(waiter,
534
			       signaller,
534
			       signaller,
535
			       VCS,
535
			       VCS,
536
			       seqno);
536
			       seqno);
537
}
537
}
538
 
538
 
539
/* RCS->BCS (BRSYNC) or VCS->BCS (BVSYNC) */
539
/* RCS->BCS (BRSYNC) or VCS->BCS (BVSYNC) */
540
int
540
int
541
gen6_blt_ring_sync_to(struct intel_ring_buffer *waiter,
541
gen6_blt_ring_sync_to(struct intel_ring_buffer *waiter,
542
		      struct intel_ring_buffer *signaller,
542
		      struct intel_ring_buffer *signaller,
543
		      u32 seqno)
543
		      u32 seqno)
544
{
544
{
545
//   WARN_ON(signaller->semaphore_register[BCS] == MI_SEMAPHORE_SYNC_INVALID);
545
//   WARN_ON(signaller->semaphore_register[BCS] == MI_SEMAPHORE_SYNC_INVALID);
546
	return intel_ring_sync(waiter,
546
	return intel_ring_sync(waiter,
547
			       signaller,
547
			       signaller,
548
			       BCS,
548
			       BCS,
549
			       seqno);
549
			       seqno);
550
}
550
}
551
 
551
 
552
 
552
 
553
 
553
 
554
#define PIPE_CONTROL_FLUSH(ring__, addr__)					\
554
#define PIPE_CONTROL_FLUSH(ring__, addr__)					\
555
do {									\
555
do {									\
556
	intel_ring_emit(ring__, GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE |		\
556
	intel_ring_emit(ring__, GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE |		\
557
		 PIPE_CONTROL_DEPTH_STALL);				\
557
		 PIPE_CONTROL_DEPTH_STALL);				\
558
	intel_ring_emit(ring__, (addr__) | PIPE_CONTROL_GLOBAL_GTT);			\
558
	intel_ring_emit(ring__, (addr__) | PIPE_CONTROL_GLOBAL_GTT);			\
559
	intel_ring_emit(ring__, 0);							\
559
	intel_ring_emit(ring__, 0);							\
560
	intel_ring_emit(ring__, 0);							\
560
	intel_ring_emit(ring__, 0);							\
561
} while (0)
561
} while (0)
562
 
562
 
563
static int
563
static int
564
pc_render_add_request(struct intel_ring_buffer *ring,
564
pc_render_add_request(struct intel_ring_buffer *ring,
565
		      u32 *result)
565
		      u32 *result)
566
{
566
{
567
	struct drm_device *dev = ring->dev;
567
	struct drm_device *dev = ring->dev;
568
	u32 seqno = i915_gem_get_seqno(dev);
568
	u32 seqno = i915_gem_get_seqno(dev);
569
	struct pipe_control *pc = ring->private;
569
	struct pipe_control *pc = ring->private;
570
	u32 scratch_addr = pc->gtt_offset + 128;
570
	u32 scratch_addr = pc->gtt_offset + 128;
571
	int ret;
571
	int ret;
572
 
572
 
573
	/* For Ironlake, MI_USER_INTERRUPT was deprecated and apparently
573
	/* For Ironlake, MI_USER_INTERRUPT was deprecated and apparently
574
	 * incoherent with writes to memory, i.e. completely fubar,
574
	 * incoherent with writes to memory, i.e. completely fubar,
575
	 * so we need to use PIPE_NOTIFY instead.
575
	 * so we need to use PIPE_NOTIFY instead.
576
	 *
576
	 *
577
	 * However, we also need to workaround the qword write
577
	 * However, we also need to workaround the qword write
578
	 * incoherence by flushing the 6 PIPE_NOTIFY buffers out to
578
	 * incoherence by flushing the 6 PIPE_NOTIFY buffers out to
579
	 * memory before requesting an interrupt.
579
	 * memory before requesting an interrupt.
580
	 */
580
	 */
581
	ret = intel_ring_begin(ring, 32);
581
	ret = intel_ring_begin(ring, 32);
582
	if (ret)
582
	if (ret)
583
		return ret;
583
		return ret;
584
 
584
 
585
	intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE |
585
	intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE |
586
			PIPE_CONTROL_WRITE_FLUSH |
586
			PIPE_CONTROL_WRITE_FLUSH |
587
			PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE);
587
			PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE);
588
	intel_ring_emit(ring, pc->gtt_offset | PIPE_CONTROL_GLOBAL_GTT);
588
	intel_ring_emit(ring, pc->gtt_offset | PIPE_CONTROL_GLOBAL_GTT);
589
	intel_ring_emit(ring, seqno);
589
	intel_ring_emit(ring, seqno);
590
	intel_ring_emit(ring, 0);
590
	intel_ring_emit(ring, 0);
591
	PIPE_CONTROL_FLUSH(ring, scratch_addr);
591
	PIPE_CONTROL_FLUSH(ring, scratch_addr);
592
	scratch_addr += 128; /* write to separate cachelines */
592
	scratch_addr += 128; /* write to separate cachelines */
593
	PIPE_CONTROL_FLUSH(ring, scratch_addr);
593
	PIPE_CONTROL_FLUSH(ring, scratch_addr);
594
	scratch_addr += 128;
594
	scratch_addr += 128;
595
	PIPE_CONTROL_FLUSH(ring, scratch_addr);
595
	PIPE_CONTROL_FLUSH(ring, scratch_addr);
596
	scratch_addr += 128;
596
	scratch_addr += 128;
597
	PIPE_CONTROL_FLUSH(ring, scratch_addr);
597
	PIPE_CONTROL_FLUSH(ring, scratch_addr);
598
	scratch_addr += 128;
598
	scratch_addr += 128;
599
	PIPE_CONTROL_FLUSH(ring, scratch_addr);
599
	PIPE_CONTROL_FLUSH(ring, scratch_addr);
600
	scratch_addr += 128;
600
	scratch_addr += 128;
601
	PIPE_CONTROL_FLUSH(ring, scratch_addr);
601
	PIPE_CONTROL_FLUSH(ring, scratch_addr);
602
	intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE |
602
	intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE |
603
			PIPE_CONTROL_WRITE_FLUSH |
603
			PIPE_CONTROL_WRITE_FLUSH |
604
			PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE |
604
			PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE |
605
			PIPE_CONTROL_NOTIFY);
605
			PIPE_CONTROL_NOTIFY);
606
	intel_ring_emit(ring, pc->gtt_offset | PIPE_CONTROL_GLOBAL_GTT);
606
	intel_ring_emit(ring, pc->gtt_offset | PIPE_CONTROL_GLOBAL_GTT);
607
	intel_ring_emit(ring, seqno);
607
	intel_ring_emit(ring, seqno);
608
	intel_ring_emit(ring, 0);
608
	intel_ring_emit(ring, 0);
609
	intel_ring_advance(ring);
609
	intel_ring_advance(ring);
610
 
610
 
611
	*result = seqno;
611
	*result = seqno;
612
	return 0;
612
	return 0;
613
}
613
}
614
 
614
 
615
static int
615
static int
616
render_ring_add_request(struct intel_ring_buffer *ring,
616
render_ring_add_request(struct intel_ring_buffer *ring,
617
			u32 *result)
617
			u32 *result)
618
{
618
{
619
	struct drm_device *dev = ring->dev;
619
	struct drm_device *dev = ring->dev;
620
	u32 seqno = i915_gem_get_seqno(dev);
620
	u32 seqno = i915_gem_get_seqno(dev);
621
	int ret;
621
	int ret;
622
 
622
 
623
	ret = intel_ring_begin(ring, 4);
623
	ret = intel_ring_begin(ring, 4);
624
	if (ret)
624
	if (ret)
625
		return ret;
625
		return ret;
626
 
626
 
627
	intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
627
	intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
628
	intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
628
	intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
629
	intel_ring_emit(ring, seqno);
629
	intel_ring_emit(ring, seqno);
630
	intel_ring_emit(ring, MI_USER_INTERRUPT);
630
	intel_ring_emit(ring, MI_USER_INTERRUPT);
631
	intel_ring_advance(ring);
631
	intel_ring_advance(ring);
632
 
632
 
633
	*result = seqno;
633
	*result = seqno;
634
	return 0;
634
	return 0;
635
}
635
}
636
 
636
 
637
static u32
637
static u32
638
gen6_ring_get_seqno(struct intel_ring_buffer *ring)
638
gen6_ring_get_seqno(struct intel_ring_buffer *ring)
639
{
639
{
640
	struct drm_device *dev = ring->dev;
640
	struct drm_device *dev = ring->dev;
641
 
641
 
642
	/* Workaround to force correct ordering between irq and seqno writes on
642
	/* Workaround to force correct ordering between irq and seqno writes on
643
	 * ivb (and maybe also on snb) by reading from a CS register (like
643
	 * ivb (and maybe also on snb) by reading from a CS register (like
644
	 * ACTHD) before reading the status page. */
644
	 * ACTHD) before reading the status page. */
645
	if (IS_GEN7(dev))
645
	if (IS_GEN7(dev))
646
		intel_ring_get_active_head(ring);
646
		intel_ring_get_active_head(ring);
647
	return intel_read_status_page(ring, I915_GEM_HWS_INDEX);
647
	return intel_read_status_page(ring, I915_GEM_HWS_INDEX);
648
}
648
}
649
 
649
 
650
static u32
650
static u32
651
ring_get_seqno(struct intel_ring_buffer *ring)
651
ring_get_seqno(struct intel_ring_buffer *ring)
652
{
652
{
653
	return intel_read_status_page(ring, I915_GEM_HWS_INDEX);
653
	return intel_read_status_page(ring, I915_GEM_HWS_INDEX);
654
}
654
}
655
 
655
 
656
static u32
656
static u32
657
pc_render_get_seqno(struct intel_ring_buffer *ring)
657
pc_render_get_seqno(struct intel_ring_buffer *ring)
658
{
658
{
659
	struct pipe_control *pc = ring->private;
659
	struct pipe_control *pc = ring->private;
660
	return pc->cpu_page[0];
660
	return pc->cpu_page[0];
661
}
661
}
662
 
662
 
663
static void
663
static void
664
ironlake_enable_irq(drm_i915_private_t *dev_priv, u32 mask)
664
ironlake_enable_irq(drm_i915_private_t *dev_priv, u32 mask)
665
{
665
{
666
	dev_priv->gt_irq_mask &= ~mask;
666
	dev_priv->gt_irq_mask &= ~mask;
667
	I915_WRITE(GTIMR, dev_priv->gt_irq_mask);
667
	I915_WRITE(GTIMR, dev_priv->gt_irq_mask);
668
	POSTING_READ(GTIMR);
668
	POSTING_READ(GTIMR);
669
}
669
}
670
 
670
 
671
static void
671
static void
672
ironlake_disable_irq(drm_i915_private_t *dev_priv, u32 mask)
672
ironlake_disable_irq(drm_i915_private_t *dev_priv, u32 mask)
673
{
673
{
674
	dev_priv->gt_irq_mask |= mask;
674
	dev_priv->gt_irq_mask |= mask;
675
	I915_WRITE(GTIMR, dev_priv->gt_irq_mask);
675
	I915_WRITE(GTIMR, dev_priv->gt_irq_mask);
676
	POSTING_READ(GTIMR);
676
	POSTING_READ(GTIMR);
677
}
677
}
678
 
678
 
679
static void
679
static void
680
i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask)
680
i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask)
681
{
681
{
682
	dev_priv->irq_mask &= ~mask;
682
	dev_priv->irq_mask &= ~mask;
683
	I915_WRITE(IMR, dev_priv->irq_mask);
683
	I915_WRITE(IMR, dev_priv->irq_mask);
684
	POSTING_READ(IMR);
684
	POSTING_READ(IMR);
685
}
685
}
686
 
686
 
687
static void
687
static void
688
i915_disable_irq(drm_i915_private_t *dev_priv, u32 mask)
688
i915_disable_irq(drm_i915_private_t *dev_priv, u32 mask)
689
{
689
{
690
	dev_priv->irq_mask |= mask;
690
	dev_priv->irq_mask |= mask;
691
	I915_WRITE(IMR, dev_priv->irq_mask);
691
	I915_WRITE(IMR, dev_priv->irq_mask);
692
	POSTING_READ(IMR);
692
	POSTING_READ(IMR);
693
}
693
}
694
 
694
 
695
static bool
695
static bool
696
render_ring_get_irq(struct intel_ring_buffer *ring)
696
render_ring_get_irq(struct intel_ring_buffer *ring)
697
{
697
{
698
	struct drm_device *dev = ring->dev;
698
	struct drm_device *dev = ring->dev;
699
	drm_i915_private_t *dev_priv = dev->dev_private;
699
	drm_i915_private_t *dev_priv = dev->dev_private;
700
 
700
 
701
	if (!dev->irq_enabled)
701
	if (!dev->irq_enabled)
702
		return false;
702
		return false;
703
 
703
 
704
	spin_lock(&ring->irq_lock);
704
	spin_lock(&ring->irq_lock);
705
	if (ring->irq_refcount++ == 0) {
705
	if (ring->irq_refcount++ == 0) {
706
		if (HAS_PCH_SPLIT(dev))
706
		if (HAS_PCH_SPLIT(dev))
707
			ironlake_enable_irq(dev_priv,
707
			ironlake_enable_irq(dev_priv,
708
					    GT_PIPE_NOTIFY | GT_USER_INTERRUPT);
708
					    GT_PIPE_NOTIFY | GT_USER_INTERRUPT);
709
		else
709
		else
710
			i915_enable_irq(dev_priv, I915_USER_INTERRUPT);
710
			i915_enable_irq(dev_priv, I915_USER_INTERRUPT);
711
	}
711
	}
712
	spin_unlock(&ring->irq_lock);
712
	spin_unlock(&ring->irq_lock);
713
 
713
 
714
	return true;
714
	return true;
715
}
715
}
716
 
716
 
717
static void
717
static void
718
render_ring_put_irq(struct intel_ring_buffer *ring)
718
render_ring_put_irq(struct intel_ring_buffer *ring)
719
{
719
{
720
	struct drm_device *dev = ring->dev;
720
	struct drm_device *dev = ring->dev;
721
	drm_i915_private_t *dev_priv = dev->dev_private;
721
	drm_i915_private_t *dev_priv = dev->dev_private;
722
 
722
 
723
	spin_lock(&ring->irq_lock);
723
	spin_lock(&ring->irq_lock);
724
	if (--ring->irq_refcount == 0) {
724
	if (--ring->irq_refcount == 0) {
725
		if (HAS_PCH_SPLIT(dev))
725
		if (HAS_PCH_SPLIT(dev))
726
			ironlake_disable_irq(dev_priv,
726
			ironlake_disable_irq(dev_priv,
727
					     GT_USER_INTERRUPT |
727
					     GT_USER_INTERRUPT |
728
					     GT_PIPE_NOTIFY);
728
					     GT_PIPE_NOTIFY);
729
		else
729
		else
730
			i915_disable_irq(dev_priv, I915_USER_INTERRUPT);
730
			i915_disable_irq(dev_priv, I915_USER_INTERRUPT);
731
	}
731
	}
732
	spin_unlock(&ring->irq_lock);
732
	spin_unlock(&ring->irq_lock);
733
}
733
}
734
 
734
 
735
void intel_ring_setup_status_page(struct intel_ring_buffer *ring)
735
void intel_ring_setup_status_page(struct intel_ring_buffer *ring)
736
{
736
{
737
	struct drm_device *dev = ring->dev;
737
	struct drm_device *dev = ring->dev;
738
	drm_i915_private_t *dev_priv = ring->dev->dev_private;
738
	drm_i915_private_t *dev_priv = ring->dev->dev_private;
739
	u32 mmio = 0;
739
	u32 mmio = 0;
740
 
740
 
741
	/* The ring status page addresses are no longer next to the rest of
741
	/* The ring status page addresses are no longer next to the rest of
742
	 * the ring registers as of gen7.
742
	 * the ring registers as of gen7.
743
	 */
743
	 */
744
	if (IS_GEN7(dev)) {
744
	if (IS_GEN7(dev)) {
745
		switch (ring->id) {
745
		switch (ring->id) {
746
		case RING_RENDER:
746
		case RING_RENDER:
747
			mmio = RENDER_HWS_PGA_GEN7;
747
			mmio = RENDER_HWS_PGA_GEN7;
748
			break;
748
			break;
749
		case RING_BLT:
749
		case RING_BLT:
750
			mmio = BLT_HWS_PGA_GEN7;
750
			mmio = BLT_HWS_PGA_GEN7;
751
			break;
751
			break;
752
		case RING_BSD:
752
		case RING_BSD:
753
			mmio = BSD_HWS_PGA_GEN7;
753
			mmio = BSD_HWS_PGA_GEN7;
754
			break;
754
			break;
755
		}
755
		}
756
	} else if (IS_GEN6(ring->dev)) {
756
	} else if (IS_GEN6(ring->dev)) {
757
		mmio = RING_HWS_PGA_GEN6(ring->mmio_base);
757
		mmio = RING_HWS_PGA_GEN6(ring->mmio_base);
758
	} else {
758
	} else {
759
		mmio = RING_HWS_PGA(ring->mmio_base);
759
		mmio = RING_HWS_PGA(ring->mmio_base);
760
	}
760
	}
761
 
761
 
762
	I915_WRITE(mmio, (u32)ring->status_page.gfx_addr);
762
	I915_WRITE(mmio, (u32)ring->status_page.gfx_addr);
763
	POSTING_READ(mmio);
763
	POSTING_READ(mmio);
764
}
764
}
765
 
765
 
766
static int
766
static int
767
bsd_ring_flush(struct intel_ring_buffer *ring,
767
bsd_ring_flush(struct intel_ring_buffer *ring,
768
	       u32     invalidate_domains,
768
	       u32     invalidate_domains,
769
	       u32     flush_domains)
769
	       u32     flush_domains)
770
{
770
{
771
	int ret;
771
	int ret;
772
 
772
 
773
	ret = intel_ring_begin(ring, 2);
773
	ret = intel_ring_begin(ring, 2);
774
	if (ret)
774
	if (ret)
775
		return ret;
775
		return ret;
776
 
776
 
777
	intel_ring_emit(ring, MI_FLUSH);
777
	intel_ring_emit(ring, MI_FLUSH);
778
	intel_ring_emit(ring, MI_NOOP);
778
	intel_ring_emit(ring, MI_NOOP);
779
	intel_ring_advance(ring);
779
	intel_ring_advance(ring);
780
	return 0;
780
	return 0;
781
}
781
}
782
 
782
 
783
static int
783
static int
784
ring_add_request(struct intel_ring_buffer *ring,
784
ring_add_request(struct intel_ring_buffer *ring,
785
		 u32 *result)
785
		 u32 *result)
786
{
786
{
787
	u32 seqno;
787
	u32 seqno;
788
	int ret;
788
	int ret;
789
 
789
 
790
	ret = intel_ring_begin(ring, 4);
790
	ret = intel_ring_begin(ring, 4);
791
	if (ret)
791
	if (ret)
792
		return ret;
792
		return ret;
793
 
793
 
794
	seqno = i915_gem_get_seqno(ring->dev);
794
	seqno = i915_gem_get_seqno(ring->dev);
795
 
795
 
796
	intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
796
	intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
797
	intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
797
	intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
798
	intel_ring_emit(ring, seqno);
798
	intel_ring_emit(ring, seqno);
799
	intel_ring_emit(ring, MI_USER_INTERRUPT);
799
	intel_ring_emit(ring, MI_USER_INTERRUPT);
800
	intel_ring_advance(ring);
800
	intel_ring_advance(ring);
801
 
801
 
802
	*result = seqno;
802
	*result = seqno;
803
	return 0;
803
	return 0;
804
}
804
}
805
 
805
 
806
static bool
806
static bool
807
gen6_ring_get_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
807
gen6_ring_get_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
808
{
808
{
809
	struct drm_device *dev = ring->dev;
809
	struct drm_device *dev = ring->dev;
810
	drm_i915_private_t *dev_priv = dev->dev_private;
810
	drm_i915_private_t *dev_priv = dev->dev_private;
811
 
811
 
812
	if (!dev->irq_enabled)
812
	if (!dev->irq_enabled)
813
	       return false;
813
	       return false;
814
 
814
 
815
	/* It looks like we need to prevent the gt from suspending while waiting
815
	/* It looks like we need to prevent the gt from suspending while waiting
816
	 * for an notifiy irq, otherwise irqs seem to get lost on at least the
816
	 * for an notifiy irq, otherwise irqs seem to get lost on at least the
817
	 * blt/bsd rings on ivb. */
817
	 * blt/bsd rings on ivb. */
818
	if (IS_GEN7(dev))
818
	if (IS_GEN7(dev))
819
		gen6_gt_force_wake_get(dev_priv);
819
		gen6_gt_force_wake_get(dev_priv);
820
 
820
 
821
	spin_lock(&ring->irq_lock);
821
	spin_lock(&ring->irq_lock);
822
	if (ring->irq_refcount++ == 0) {
822
	if (ring->irq_refcount++ == 0) {
823
		ring->irq_mask &= ~rflag;
823
		ring->irq_mask &= ~rflag;
824
		I915_WRITE_IMR(ring, ring->irq_mask);
824
		I915_WRITE_IMR(ring, ring->irq_mask);
825
		ironlake_enable_irq(dev_priv, gflag);
825
		ironlake_enable_irq(dev_priv, gflag);
826
	}
826
	}
827
	spin_unlock(&ring->irq_lock);
827
	spin_unlock(&ring->irq_lock);
828
 
828
 
829
	return true;
829
	return true;
830
}
830
}
831
 
831
 
832
static void
832
static void
833
gen6_ring_put_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
833
gen6_ring_put_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
834
{
834
{
835
	struct drm_device *dev = ring->dev;
835
	struct drm_device *dev = ring->dev;
836
	drm_i915_private_t *dev_priv = dev->dev_private;
836
	drm_i915_private_t *dev_priv = dev->dev_private;
837
 
837
 
838
	spin_lock(&ring->irq_lock);
838
	spin_lock(&ring->irq_lock);
839
	if (--ring->irq_refcount == 0) {
839
	if (--ring->irq_refcount == 0) {
840
		ring->irq_mask |= rflag;
840
		ring->irq_mask |= rflag;
841
		I915_WRITE_IMR(ring, ring->irq_mask);
841
		I915_WRITE_IMR(ring, ring->irq_mask);
842
		ironlake_disable_irq(dev_priv, gflag);
842
		ironlake_disable_irq(dev_priv, gflag);
843
	}
843
	}
844
	spin_unlock(&ring->irq_lock);
844
	spin_unlock(&ring->irq_lock);
845
 
845
 
846
	if (IS_GEN7(dev))
846
	if (IS_GEN7(dev))
847
		gen6_gt_force_wake_put(dev_priv);
847
		gen6_gt_force_wake_put(dev_priv);
848
}
848
}
849
 
849
 
850
static bool
850
static bool
851
bsd_ring_get_irq(struct intel_ring_buffer *ring)
851
bsd_ring_get_irq(struct intel_ring_buffer *ring)
852
{
852
{
853
	struct drm_device *dev = ring->dev;
853
	struct drm_device *dev = ring->dev;
854
	drm_i915_private_t *dev_priv = dev->dev_private;
854
	drm_i915_private_t *dev_priv = dev->dev_private;
855
 
855
 
856
	if (!dev->irq_enabled)
856
	if (!dev->irq_enabled)
857
		return false;
857
		return false;
858
 
858
 
859
	spin_lock(&ring->irq_lock);
859
	spin_lock(&ring->irq_lock);
860
	if (ring->irq_refcount++ == 0) {
860
	if (ring->irq_refcount++ == 0) {
861
		if (IS_G4X(dev))
861
		if (IS_G4X(dev))
862
			i915_enable_irq(dev_priv, I915_BSD_USER_INTERRUPT);
862
			i915_enable_irq(dev_priv, I915_BSD_USER_INTERRUPT);
863
		else
863
		else
864
			ironlake_enable_irq(dev_priv, GT_BSD_USER_INTERRUPT);
864
			ironlake_enable_irq(dev_priv, GT_BSD_USER_INTERRUPT);
865
	}
865
	}
866
	spin_unlock(&ring->irq_lock);
866
	spin_unlock(&ring->irq_lock);
867
 
867
 
868
	return true;
868
	return true;
869
}
869
}
870
static void
870
static void
871
bsd_ring_put_irq(struct intel_ring_buffer *ring)
871
bsd_ring_put_irq(struct intel_ring_buffer *ring)
872
{
872
{
873
	struct drm_device *dev = ring->dev;
873
	struct drm_device *dev = ring->dev;
874
	drm_i915_private_t *dev_priv = dev->dev_private;
874
	drm_i915_private_t *dev_priv = dev->dev_private;
875
 
875
 
876
	spin_lock(&ring->irq_lock);
876
	spin_lock(&ring->irq_lock);
877
	if (--ring->irq_refcount == 0) {
877
	if (--ring->irq_refcount == 0) {
878
		if (IS_G4X(dev))
878
		if (IS_G4X(dev))
879
			i915_disable_irq(dev_priv, I915_BSD_USER_INTERRUPT);
879
			i915_disable_irq(dev_priv, I915_BSD_USER_INTERRUPT);
880
		else
880
		else
881
			ironlake_disable_irq(dev_priv, GT_BSD_USER_INTERRUPT);
881
			ironlake_disable_irq(dev_priv, GT_BSD_USER_INTERRUPT);
882
	}
882
	}
883
	spin_unlock(&ring->irq_lock);
883
	spin_unlock(&ring->irq_lock);
884
}
884
}
885
 
885
 
886
static int
886
static int
887
ring_dispatch_execbuffer(struct intel_ring_buffer *ring, u32 offset, u32 length)
887
ring_dispatch_execbuffer(struct intel_ring_buffer *ring, u32 offset, u32 length)
888
{
888
{
889
	int ret;
889
	int ret;
890
 
890
 
891
	ret = intel_ring_begin(ring, 2);
891
	ret = intel_ring_begin(ring, 2);
892
	if (ret)
892
	if (ret)
893
		return ret;
893
		return ret;
894
 
894
 
895
	intel_ring_emit(ring,
895
	intel_ring_emit(ring,
896
			MI_BATCH_BUFFER_START | (2 << 6) |
896
			MI_BATCH_BUFFER_START | (2 << 6) |
897
			MI_BATCH_NON_SECURE_I965);
897
			MI_BATCH_NON_SECURE_I965);
898
	intel_ring_emit(ring, offset);
898
	intel_ring_emit(ring, offset);
899
	intel_ring_advance(ring);
899
	intel_ring_advance(ring);
900
 
900
 
901
	return 0;
901
	return 0;
902
}
902
}
903
 
903
 
904
static int
904
static int
905
render_ring_dispatch_execbuffer(struct intel_ring_buffer *ring,
905
render_ring_dispatch_execbuffer(struct intel_ring_buffer *ring,
906
				u32 offset, u32 len)
906
				u32 offset, u32 len)
907
{
907
{
908
	struct drm_device *dev = ring->dev;
908
	struct drm_device *dev = ring->dev;
909
	int ret;
909
	int ret;
910
 
910
 
911
	if (IS_I830(dev) || IS_845G(dev)) {
911
	if (IS_I830(dev) || IS_845G(dev)) {
912
		ret = intel_ring_begin(ring, 4);
912
		ret = intel_ring_begin(ring, 4);
913
		if (ret)
913
		if (ret)
914
			return ret;
914
			return ret;
915
 
915
 
916
		intel_ring_emit(ring, MI_BATCH_BUFFER);
916
		intel_ring_emit(ring, MI_BATCH_BUFFER);
917
		intel_ring_emit(ring, offset | MI_BATCH_NON_SECURE);
917
		intel_ring_emit(ring, offset | MI_BATCH_NON_SECURE);
918
		intel_ring_emit(ring, offset + len - 8);
918
		intel_ring_emit(ring, offset + len - 8);
919
		intel_ring_emit(ring, 0);
919
		intel_ring_emit(ring, 0);
920
	} else {
920
	} else {
921
		ret = intel_ring_begin(ring, 2);
921
		ret = intel_ring_begin(ring, 2);
922
		if (ret)
922
		if (ret)
923
			return ret;
923
			return ret;
924
 
924
 
925
		if (INTEL_INFO(dev)->gen >= 4) {
925
		if (INTEL_INFO(dev)->gen >= 4) {
926
			intel_ring_emit(ring,
926
			intel_ring_emit(ring,
927
					MI_BATCH_BUFFER_START | (2 << 6) |
927
					MI_BATCH_BUFFER_START | (2 << 6) |
928
					MI_BATCH_NON_SECURE_I965);
928
					MI_BATCH_NON_SECURE_I965);
929
			intel_ring_emit(ring, offset);
929
			intel_ring_emit(ring, offset);
930
		} else {
930
		} else {
931
			intel_ring_emit(ring,
931
			intel_ring_emit(ring,
932
					MI_BATCH_BUFFER_START | (2 << 6));
932
					MI_BATCH_BUFFER_START | (2 << 6));
933
			intel_ring_emit(ring, offset | MI_BATCH_NON_SECURE);
933
			intel_ring_emit(ring, offset | MI_BATCH_NON_SECURE);
934
		}
934
		}
935
	}
935
	}
936
	intel_ring_advance(ring);
936
	intel_ring_advance(ring);
937
 
937
 
938
	return 0;
938
	return 0;
939
}
939
}
940
 
940
 
941
static void cleanup_status_page(struct intel_ring_buffer *ring)
941
static void cleanup_status_page(struct intel_ring_buffer *ring)
942
{
942
{
943
	drm_i915_private_t *dev_priv = ring->dev->dev_private;
943
	drm_i915_private_t *dev_priv = ring->dev->dev_private;
944
	struct drm_i915_gem_object *obj;
944
	struct drm_i915_gem_object *obj;
945
 
945
 
946
	obj = ring->status_page.obj;
946
	obj = ring->status_page.obj;
947
	if (obj == NULL)
947
	if (obj == NULL)
948
		return;
948
		return;
949
 
949
 
950
	kunmap(obj->pages[0]);
950
	kunmap(obj->pages[0]);
951
//   i915_gem_object_unpin(obj);
951
    i915_gem_object_unpin(obj);
952
//   drm_gem_object_unreference(&obj->base);
952
	drm_gem_object_unreference(&obj->base);
953
	ring->status_page.obj = NULL;
953
	ring->status_page.obj = NULL;
954
 
954
 
955
	memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
955
	memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
956
}
956
}
957
 
957
 
958
static int init_status_page(struct intel_ring_buffer *ring)
958
static int init_status_page(struct intel_ring_buffer *ring)
959
{
959
{
960
	struct drm_device *dev = ring->dev;
960
	struct drm_device *dev = ring->dev;
961
	drm_i915_private_t *dev_priv = dev->dev_private;
961
	drm_i915_private_t *dev_priv = dev->dev_private;
962
	struct drm_i915_gem_object *obj;
962
	struct drm_i915_gem_object *obj;
963
	int ret;
963
	int ret;
964
 
964
 
965
	obj = i915_gem_alloc_object(dev, 4096);
965
	obj = i915_gem_alloc_object(dev, 4096);
966
	if (obj == NULL) {
966
	if (obj == NULL) {
967
		DRM_ERROR("Failed to allocate status page\n");
967
		DRM_ERROR("Failed to allocate status page\n");
968
		ret = -ENOMEM;
968
		ret = -ENOMEM;
969
		goto err;
969
		goto err;
970
	}
970
	}
971
 
971
 
972
//    i915_gem_object_set_cache_level(obj, I915_CACHE_LLC);
972
//    i915_gem_object_set_cache_level(obj, I915_CACHE_LLC);
973
 
973
 
974
	ret = i915_gem_object_pin(obj, 4096, true);
974
	ret = i915_gem_object_pin(obj, 4096, true);
975
	if (ret != 0) {
975
	if (ret != 0) {
976
		goto err_unref;
976
		goto err_unref;
977
	}
977
	}
978
 
978
 
979
	ring->status_page.gfx_addr = obj->gtt_offset;
979
	ring->status_page.gfx_addr = obj->gtt_offset;
980
    ring->status_page.page_addr = MapIoMem(obj->pages[0], 4096, PG_SW);
980
    ring->status_page.page_addr = MapIoMem(obj->pages[0], 4096, PG_SW);
981
	if (ring->status_page.page_addr == NULL) {
981
	if (ring->status_page.page_addr == NULL) {
982
		memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
982
		memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
983
		goto err_unpin;
983
		goto err_unpin;
984
	}
984
	}
985
	ring->status_page.obj = obj;
985
	ring->status_page.obj = obj;
986
	memset(ring->status_page.page_addr, 0, PAGE_SIZE);
986
	memset(ring->status_page.page_addr, 0, PAGE_SIZE);
987
 
987
 
988
	intel_ring_setup_status_page(ring);
988
	intel_ring_setup_status_page(ring);
989
	DRM_DEBUG_DRIVER("%s hws offset: 0x%08x\n",
989
	DRM_DEBUG_DRIVER("%s hws offset: 0x%08x\n",
990
			ring->name, ring->status_page.gfx_addr);
990
			ring->name, ring->status_page.gfx_addr);
991
 
991
 
992
	return 0;
992
	return 0;
993
 
993
 
994
err_unpin:
994
err_unpin:
995
 //  i915_gem_object_unpin(obj);
995
	i915_gem_object_unpin(obj);
996
err_unref:
996
err_unref:
997
 //  drm_gem_object_unreference(&obj->base);
997
	drm_gem_object_unreference(&obj->base);
998
err:
998
err:
999
	return ret;
999
	return ret;
1000
}
1000
}
1001
 
1001
 
1002
int intel_init_ring_buffer(struct drm_device *dev,
1002
int intel_init_ring_buffer(struct drm_device *dev,
1003
			   struct intel_ring_buffer *ring)
1003
			   struct intel_ring_buffer *ring)
1004
{
1004
{
1005
	struct drm_i915_gem_object *obj;
1005
	struct drm_i915_gem_object *obj;
1006
	int ret;
1006
	int ret;
1007
 
1007
 
1008
	ring->dev = dev;
1008
	ring->dev = dev;
1009
	INIT_LIST_HEAD(&ring->active_list);
1009
	INIT_LIST_HEAD(&ring->active_list);
1010
	INIT_LIST_HEAD(&ring->request_list);
1010
	INIT_LIST_HEAD(&ring->request_list);
1011
	INIT_LIST_HEAD(&ring->gpu_write_list);
1011
	INIT_LIST_HEAD(&ring->gpu_write_list);
1012
 
1012
 
1013
//   init_waitqueue_head(&ring->irq_queue);
1013
//   init_waitqueue_head(&ring->irq_queue);
1014
    spin_lock_init(&ring->irq_lock);
1014
    spin_lock_init(&ring->irq_lock);
1015
    ring->irq_mask = ~0;
1015
    ring->irq_mask = ~0;
1016
 
1016
 
1017
	if (I915_NEED_GFX_HWS(dev)) {
1017
	if (I915_NEED_GFX_HWS(dev)) {
1018
       ret = init_status_page(ring);
1018
       ret = init_status_page(ring);
1019
       if (ret)
1019
       if (ret)
1020
           return ret;
1020
           return ret;
1021
	}
1021
	}
1022
 
1022
 
1023
    obj = i915_gem_alloc_object(dev, ring->size);
1023
    obj = i915_gem_alloc_object(dev, ring->size);
1024
	if (obj == NULL) {
1024
	if (obj == NULL) {
1025
		DRM_ERROR("Failed to allocate ringbuffer\n");
1025
		DRM_ERROR("Failed to allocate ringbuffer\n");
1026
		ret = -ENOMEM;
1026
		ret = -ENOMEM;
1027
		goto err_hws;
1027
		goto err_hws;
1028
	}
1028
	}
1029
 
1029
 
1030
	ring->obj = obj;
1030
	ring->obj = obj;
1031
 
1031
 
1032
    ret = i915_gem_object_pin(obj, PAGE_SIZE, true);
1032
    ret = i915_gem_object_pin(obj, PAGE_SIZE, true);
1033
	if (ret)
1033
	if (ret)
1034
		goto err_unref;
1034
		goto err_unref;
1035
 
1035
 
1036
	ring->map.size = ring->size;
1036
	ring->map.size = ring->size;
1037
    ring->map.offset = get_bus_addr() + obj->gtt_offset;
1037
    ring->map.offset = get_bus_addr() + obj->gtt_offset;
1038
	ring->map.type = 0;
1038
	ring->map.type = 0;
1039
	ring->map.flags = 0;
1039
	ring->map.flags = 0;
1040
	ring->map.mtrr = 0;
1040
	ring->map.mtrr = 0;
1041
 
1041
 
1042
//   drm_core_ioremap_wc(&ring->map, dev);
1042
//   drm_core_ioremap_wc(&ring->map, dev);
1043
 
1043
 
1044
    ring->map.handle = ioremap(ring->map.offset, ring->map.size);
1044
    ring->map.handle = ioremap(ring->map.offset, ring->map.size);
1045
 
1045
 
1046
	if (ring->map.handle == NULL) {
1046
	if (ring->map.handle == NULL) {
1047
		DRM_ERROR("Failed to map ringbuffer.\n");
1047
		DRM_ERROR("Failed to map ringbuffer.\n");
1048
		ret = -EINVAL;
1048
		ret = -EINVAL;
1049
		goto err_unpin;
1049
		goto err_unpin;
1050
	}
1050
	}
1051
 
1051
 
1052
	ring->virtual_start = ring->map.handle;
1052
	ring->virtual_start = ring->map.handle;
1053
	ret = ring->init(ring);
1053
	ret = ring->init(ring);
1054
	if (ret)
1054
	if (ret)
1055
		goto err_unmap;
1055
		goto err_unmap;
1056
 
1056
 
1057
	/* Workaround an erratum on the i830 which causes a hang if
1057
	/* Workaround an erratum on the i830 which causes a hang if
1058
	 * the TAIL pointer points to within the last 2 cachelines
1058
	 * the TAIL pointer points to within the last 2 cachelines
1059
	 * of the buffer.
1059
	 * of the buffer.
1060
	 */
1060
	 */
1061
	ring->effective_size = ring->size;
1061
	ring->effective_size = ring->size;
1062
	if (IS_I830(ring->dev))
1062
	if (IS_I830(ring->dev))
1063
		ring->effective_size -= 128;
1063
		ring->effective_size -= 128;
1064
 
1064
 
1065
	return 0;
1065
	return 0;
1066
 
1066
 
1067
err_unmap:
1067
err_unmap:
1068
//   drm_core_ioremapfree(&ring->map, dev);
-
 
1069
    FreeKernelSpace(ring->virtual_start);
1068
    FreeKernelSpace(ring->virtual_start);
1070
err_unpin:
1069
err_unpin:
1071
//   i915_gem_object_unpin(obj);
1070
	i915_gem_object_unpin(obj);
1072
err_unref:
1071
err_unref:
1073
//   drm_gem_object_unreference(&obj->base);
1072
	drm_gem_object_unreference(&obj->base);
1074
	ring->obj = NULL;
1073
	ring->obj = NULL;
1075
err_hws:
1074
err_hws:
1076
//   cleanup_status_page(ring);
1075
//   cleanup_status_page(ring);
1077
	return ret;
1076
	return ret;
1078
}
1077
}
1079
 
1078
 
1080
void intel_cleanup_ring_buffer(struct intel_ring_buffer *ring)
1079
void intel_cleanup_ring_buffer(struct intel_ring_buffer *ring)
1081
{
1080
{
1082
	struct drm_i915_private *dev_priv;
1081
	struct drm_i915_private *dev_priv;
1083
	int ret;
1082
	int ret;
1084
 
1083
 
1085
	if (ring->obj == NULL)
1084
	if (ring->obj == NULL)
1086
		return;
1085
		return;
1087
 
1086
 
1088
	/* Disable the ring buffer. The ring must be idle at this point */
1087
	/* Disable the ring buffer. The ring must be idle at this point */
1089
	dev_priv = ring->dev->dev_private;
1088
	dev_priv = ring->dev->dev_private;
1090
	ret = intel_wait_ring_idle(ring);
1089
	ret = intel_wait_ring_idle(ring);
1091
	if (ret)
1090
	if (ret)
1092
		DRM_ERROR("failed to quiesce %s whilst cleaning up: %d\n",
1091
		DRM_ERROR("failed to quiesce %s whilst cleaning up: %d\n",
1093
			  ring->name, ret);
1092
			  ring->name, ret);
1094
 
1093
 
1095
	I915_WRITE_CTL(ring, 0);
1094
	I915_WRITE_CTL(ring, 0);
1096
 
1095
 
1097
//   drm_core_ioremapfree(&ring->map, ring->dev);
1096
//   drm_core_ioremapfree(&ring->map, ring->dev);
1098
 
1097
 
1099
//   i915_gem_object_unpin(ring->obj);
1098
    i915_gem_object_unpin(ring->obj);
1100
//   drm_gem_object_unreference(&ring->obj->base);
1099
	drm_gem_object_unreference(&ring->obj->base);
1101
	ring->obj = NULL;
1100
	ring->obj = NULL;
1102
 
1101
 
1103
	if (ring->cleanup)
1102
	if (ring->cleanup)
1104
		ring->cleanup(ring);
1103
		ring->cleanup(ring);
1105
 
1104
 
1106
//   cleanup_status_page(ring);
1105
//   cleanup_status_page(ring);
1107
}
1106
}
1108
 
1107
 
1109
static int intel_wrap_ring_buffer(struct intel_ring_buffer *ring)
1108
static int intel_wrap_ring_buffer(struct intel_ring_buffer *ring)
1110
{
1109
{
1111
	unsigned int *virt;
1110
	unsigned int *virt;
1112
	int rem = ring->size - ring->tail;
1111
	int rem = ring->size - ring->tail;
1113
 
1112
 
1114
    ENTER();
1113
    ENTER();
1115
 
1114
 
1116
	if (ring->space < rem) {
1115
	if (ring->space < rem) {
1117
		int ret = intel_wait_ring_buffer(ring, rem);
1116
		int ret = intel_wait_ring_buffer(ring, rem);
1118
		if (ret)
1117
		if (ret)
1119
			return ret;
1118
			return ret;
1120
	}
1119
	}
1121
 
1120
 
1122
	virt = (unsigned int *)(ring->virtual_start + ring->tail);
1121
	virt = (unsigned int *)(ring->virtual_start + ring->tail);
1123
	rem /= 8;
1122
	rem /= 8;
1124
	while (rem--) {
1123
	while (rem--) {
1125
		*virt++ = MI_NOOP;
1124
		*virt++ = MI_NOOP;
1126
		*virt++ = MI_NOOP;
1125
		*virt++ = MI_NOOP;
1127
	}
1126
	}
1128
 
1127
 
1129
	ring->tail = 0;
1128
	ring->tail = 0;
1130
	ring->space = ring_space(ring);
1129
	ring->space = ring_space(ring);
1131
 
1130
 
1132
    LEAVE();
1131
    LEAVE();
1133
	return 0;
1132
	return 0;
1134
}
1133
}
1135
 
1134
 
1136
int intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n)
1135
int intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n)
1137
{
1136
{
1138
	struct drm_device *dev = ring->dev;
1137
	struct drm_device *dev = ring->dev;
1139
	struct drm_i915_private *dev_priv = dev->dev_private;
1138
	struct drm_i915_private *dev_priv = dev->dev_private;
1140
	unsigned long end;
1139
	unsigned long end;
1141
	u32 head;
1140
	u32 head;
1142
 
1141
 
1143
    ENTER();
1142
    ENTER();
1144
 
1143
 
1145
	/* If the reported head position has wrapped or hasn't advanced,
1144
	/* If the reported head position has wrapped or hasn't advanced,
1146
	 * fallback to the slow and accurate path.
1145
	 * fallback to the slow and accurate path.
1147
	 */
1146
	 */
1148
	head = intel_read_status_page(ring, 4);
1147
	head = intel_read_status_page(ring, 4);
1149
	if (head > ring->head) {
1148
	if (head > ring->head) {
1150
		ring->head = head;
1149
		ring->head = head;
1151
		ring->space = ring_space(ring);
1150
		ring->space = ring_space(ring);
1152
		if (ring->space >= n)
1151
		if (ring->space >= n)
1153
        {
1152
        {
1154
            LEAVE();
1153
            LEAVE();
1155
			return 0;
1154
			return 0;
1156
        };
1155
        };
1157
	}
1156
	}
1158
 
-
 
-
 
1157
 
1159
//   trace_i915_ring_wait_begin(ring);
1158
 
1160
	end = jiffies + 3 * HZ;
1159
	end = jiffies + 3 * HZ;
1161
	do {
1160
	do {
1162
		ring->head = I915_READ_HEAD(ring);
1161
		ring->head = I915_READ_HEAD(ring);
1163
		ring->space = ring_space(ring);
1162
		ring->space = ring_space(ring);
1164
		if (ring->space >= n) {
1163
		if (ring->space >= n) {
1165
//           trace_i915_ring_wait_end(ring);
1164
//           trace_i915_ring_wait_end(ring);
1166
            LEAVE();
1165
            LEAVE();
1167
			return 0;
1166
			return 0;
1168
		}
1167
		}
1169
 
1168
 
1170
		msleep(1);
1169
		msleep(1);
1171
		if (atomic_read(&dev_priv->mm.wedged))
1170
		if (atomic_read(&dev_priv->mm.wedged))
1172
        {
1171
        {
1173
            LEAVE();
1172
            LEAVE();
1174
			return -EAGAIN;
1173
			return -EAGAIN;
1175
        };
1174
        };
1176
	} while (!time_after(jiffies, end));
1175
	} while (!time_after(jiffies, end));
1177
//   trace_i915_ring_wait_end(ring);
-
 
1178
    LEAVE();
1176
    LEAVE();
1179
 
1177
 
1180
	return -EBUSY;
1178
	return -EBUSY;
1181
}
1179
}
1182
 
1180
 
1183
int intel_ring_begin(struct intel_ring_buffer *ring,
1181
int intel_ring_begin(struct intel_ring_buffer *ring,
1184
		     int num_dwords)
1182
		     int num_dwords)
1185
{
1183
{
1186
	struct drm_i915_private *dev_priv = ring->dev->dev_private;
1184
	struct drm_i915_private *dev_priv = ring->dev->dev_private;
1187
	int n = 4*num_dwords;
1185
	int n = 4*num_dwords;
1188
	int ret;
1186
	int ret;
1189
 
1187
 
1190
//   if (unlikely(atomic_read(&dev_priv->mm.wedged)))
1188
//   if (unlikely(atomic_read(&dev_priv->mm.wedged)))
1191
//       return -EIO;
1189
//       return -EIO;
1192
 
1190
 
1193
	if (unlikely(ring->tail + n > ring->effective_size)) {
1191
	if (unlikely(ring->tail + n > ring->effective_size)) {
1194
		ret = intel_wrap_ring_buffer(ring);
1192
		ret = intel_wrap_ring_buffer(ring);
1195
		if (unlikely(ret))
1193
		if (unlikely(ret))
1196
			return ret;
1194
			return ret;
1197
	}
1195
	}
1198
 
1196
 
1199
	if (unlikely(ring->space < n)) {
1197
	if (unlikely(ring->space < n)) {
1200
		ret = intel_wait_ring_buffer(ring, n);
1198
		ret = intel_wait_ring_buffer(ring, n);
1201
		if (unlikely(ret))
1199
		if (unlikely(ret))
1202
			return ret;
1200
			return ret;
1203
	}
1201
	}
1204
 
1202
 
1205
	ring->space -= n;
1203
	ring->space -= n;
1206
	return 0;
1204
	return 0;
1207
}
1205
}
1208
 
1206
 
1209
void intel_ring_advance(struct intel_ring_buffer *ring)
1207
void intel_ring_advance(struct intel_ring_buffer *ring)
1210
{
1208
{
1211
	ring->tail &= ring->size - 1;
1209
	ring->tail &= ring->size - 1;
1212
	ring->write_tail(ring, ring->tail);
1210
	ring->write_tail(ring, ring->tail);
1213
}
1211
}
1214
 
1212
 
1215
static const struct intel_ring_buffer render_ring = {
1213
static const struct intel_ring_buffer render_ring = {
1216
	.name			= "render ring",
1214
	.name			= "render ring",
1217
	.id			= RING_RENDER,
1215
	.id			= RING_RENDER,
1218
	.mmio_base		= RENDER_RING_BASE,
1216
	.mmio_base		= RENDER_RING_BASE,
1219
	.size			= 32 * PAGE_SIZE,
1217
	.size			= 32 * PAGE_SIZE,
1220
	.init			= init_render_ring,
1218
	.init			= init_render_ring,
1221
    .write_tail     = ring_write_tail,
1219
    .write_tail     = ring_write_tail,
1222
    .flush          = render_ring_flush,
1220
    .flush          = render_ring_flush,
1223
    .add_request        = render_ring_add_request,
1221
    .add_request        = render_ring_add_request,
1224
    .get_seqno      = ring_get_seqno,
1222
    .get_seqno      = ring_get_seqno,
1225
	.irq_get		= render_ring_get_irq,
1223
	.irq_get		= render_ring_get_irq,
1226
	.irq_put		= render_ring_put_irq,
1224
	.irq_put		= render_ring_put_irq,
1227
   .dispatch_execbuffer    = render_ring_dispatch_execbuffer,
1225
   .dispatch_execbuffer    = render_ring_dispatch_execbuffer,
1228
//       .cleanup            = render_ring_cleanup,
1226
//       .cleanup            = render_ring_cleanup,
1229
	.sync_to		= render_ring_sync_to,
1227
	.sync_to		= render_ring_sync_to,
1230
	.semaphore_register	= {MI_SEMAPHORE_SYNC_INVALID,
1228
	.semaphore_register	= {MI_SEMAPHORE_SYNC_INVALID,
1231
				   MI_SEMAPHORE_SYNC_RV,
1229
				   MI_SEMAPHORE_SYNC_RV,
1232
				   MI_SEMAPHORE_SYNC_RB},
1230
				   MI_SEMAPHORE_SYNC_RB},
1233
	.signal_mbox		= {GEN6_VRSYNC, GEN6_BRSYNC},
1231
	.signal_mbox		= {GEN6_VRSYNC, GEN6_BRSYNC},
1234
};
1232
};
1235
 
1233
 
1236
/* ring buffer for bit-stream decoder */
1234
/* ring buffer for bit-stream decoder */
1237
 
1235
 
1238
static const struct intel_ring_buffer bsd_ring = {
1236
static const struct intel_ring_buffer bsd_ring = {
1239
	.name                   = "bsd ring",
1237
	.name                   = "bsd ring",
1240
	.id			= RING_BSD,
1238
	.id			= RING_BSD,
1241
	.mmio_base		= BSD_RING_BASE,
1239
	.mmio_base		= BSD_RING_BASE,
1242
	.size			= 32 * PAGE_SIZE,
1240
	.size			= 32 * PAGE_SIZE,
1243
	.init			= init_ring_common,
1241
	.init			= init_ring_common,
1244
	.write_tail		= ring_write_tail,
1242
	.write_tail		= ring_write_tail,
1245
    .flush          = bsd_ring_flush,
1243
    .flush          = bsd_ring_flush,
1246
    .add_request        = ring_add_request,
1244
    .add_request        = ring_add_request,
1247
    .get_seqno      = ring_get_seqno,
1245
    .get_seqno      = ring_get_seqno,
1248
	.irq_get		= bsd_ring_get_irq,
1246
	.irq_get		= bsd_ring_get_irq,
1249
	.irq_put		= bsd_ring_put_irq,
1247
	.irq_put		= bsd_ring_put_irq,
1250
   .dispatch_execbuffer    = ring_dispatch_execbuffer,
1248
   .dispatch_execbuffer    = ring_dispatch_execbuffer,
1251
};
1249
};
1252
 
1250
 
1253
 
1251
 
1254
static void gen6_bsd_ring_write_tail(struct intel_ring_buffer *ring,
1252
static void gen6_bsd_ring_write_tail(struct intel_ring_buffer *ring,
1255
				     u32 value)
1253
				     u32 value)
1256
{
1254
{
1257
       drm_i915_private_t *dev_priv = ring->dev->dev_private;
1255
       drm_i915_private_t *dev_priv = ring->dev->dev_private;
1258
 
1256
 
1259
       /* Every tail move must follow the sequence below */
1257
       /* Every tail move must follow the sequence below */
1260
       I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL,
1258
       I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL,
1261
	       GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK |
1259
	       GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK |
1262
	       GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_DISABLE);
1260
	       GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_DISABLE);
1263
       I915_WRITE(GEN6_BSD_RNCID, 0x0);
1261
       I915_WRITE(GEN6_BSD_RNCID, 0x0);
1264
 
1262
 
1265
       if (wait_for((I915_READ(GEN6_BSD_SLEEP_PSMI_CONTROL) &
1263
       if (wait_for((I915_READ(GEN6_BSD_SLEEP_PSMI_CONTROL) &
1266
                               GEN6_BSD_SLEEP_PSMI_CONTROL_IDLE_INDICATOR) == 0,
1264
                               GEN6_BSD_SLEEP_PSMI_CONTROL_IDLE_INDICATOR) == 0,
1267
                       50))
1265
                       50))
1268
               DRM_ERROR("timed out waiting for IDLE Indicator\n");
1266
               DRM_ERROR("timed out waiting for IDLE Indicator\n");
1269
 
1267
 
1270
       I915_WRITE_TAIL(ring, value);
1268
       I915_WRITE_TAIL(ring, value);
1271
       I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL,
1269
       I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL,
1272
	       GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK |
1270
	       GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK |
1273
	       GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_ENABLE);
1271
	       GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_ENABLE);
1274
}
1272
}
1275
 
1273
 
1276
static int gen6_ring_flush(struct intel_ring_buffer *ring,
1274
static int gen6_ring_flush(struct intel_ring_buffer *ring,
1277
			   u32 invalidate, u32 flush)
1275
			   u32 invalidate, u32 flush)
1278
{
1276
{
1279
	uint32_t cmd;
1277
	uint32_t cmd;
1280
	int ret;
1278
	int ret;
1281
 
1279
 
1282
	ret = intel_ring_begin(ring, 4);
1280
	ret = intel_ring_begin(ring, 4);
1283
	if (ret)
1281
	if (ret)
1284
		return ret;
1282
		return ret;
1285
 
1283
 
1286
	cmd = MI_FLUSH_DW;
1284
	cmd = MI_FLUSH_DW;
1287
	if (invalidate & I915_GEM_GPU_DOMAINS)
1285
	if (invalidate & I915_GEM_GPU_DOMAINS)
1288
		cmd |= MI_INVALIDATE_TLB | MI_INVALIDATE_BSD;
1286
		cmd |= MI_INVALIDATE_TLB | MI_INVALIDATE_BSD;
1289
	intel_ring_emit(ring, cmd);
1287
	intel_ring_emit(ring, cmd);
1290
	intel_ring_emit(ring, 0);
1288
	intel_ring_emit(ring, 0);
1291
	intel_ring_emit(ring, 0);
1289
	intel_ring_emit(ring, 0);
1292
	intel_ring_emit(ring, MI_NOOP);
1290
	intel_ring_emit(ring, MI_NOOP);
1293
	intel_ring_advance(ring);
1291
	intel_ring_advance(ring);
1294
	return 0;
1292
	return 0;
1295
}
1293
}
1296
 
1294
 
1297
static int
1295
static int
1298
gen6_ring_dispatch_execbuffer(struct intel_ring_buffer *ring,
1296
gen6_ring_dispatch_execbuffer(struct intel_ring_buffer *ring,
1299
			      u32 offset, u32 len)
1297
			      u32 offset, u32 len)
1300
{
1298
{
1301
       int ret;
1299
       int ret;
1302
 
1300
 
1303
       ret = intel_ring_begin(ring, 2);
1301
       ret = intel_ring_begin(ring, 2);
1304
       if (ret)
1302
       if (ret)
1305
	       return ret;
1303
	       return ret;
1306
 
1304
 
1307
       intel_ring_emit(ring, MI_BATCH_BUFFER_START | MI_BATCH_NON_SECURE_I965);
1305
       intel_ring_emit(ring, MI_BATCH_BUFFER_START | MI_BATCH_NON_SECURE_I965);
1308
       /* bit0-7 is the length on GEN6+ */
1306
       /* bit0-7 is the length on GEN6+ */
1309
       intel_ring_emit(ring, offset);
1307
       intel_ring_emit(ring, offset);
1310
       intel_ring_advance(ring);
1308
       intel_ring_advance(ring);
1311
 
1309
 
1312
       return 0;
1310
       return 0;
1313
}
1311
}
1314
 
1312
 
1315
static bool
1313
static bool
1316
gen6_render_ring_get_irq(struct intel_ring_buffer *ring)
1314
gen6_render_ring_get_irq(struct intel_ring_buffer *ring)
1317
{
1315
{
1318
	return gen6_ring_get_irq(ring,
1316
	return gen6_ring_get_irq(ring,
1319
				 GT_USER_INTERRUPT,
1317
				 GT_USER_INTERRUPT,
1320
				 GEN6_RENDER_USER_INTERRUPT);
1318
				 GEN6_RENDER_USER_INTERRUPT);
1321
}
1319
}
1322
 
1320
 
1323
static void
1321
static void
1324
gen6_render_ring_put_irq(struct intel_ring_buffer *ring)
1322
gen6_render_ring_put_irq(struct intel_ring_buffer *ring)
1325
{
1323
{
1326
	return gen6_ring_put_irq(ring,
1324
	return gen6_ring_put_irq(ring,
1327
				 GT_USER_INTERRUPT,
1325
				 GT_USER_INTERRUPT,
1328
				 GEN6_RENDER_USER_INTERRUPT);
1326
				 GEN6_RENDER_USER_INTERRUPT);
1329
}
1327
}
1330
 
1328
 
1331
static bool
1329
static bool
1332
gen6_bsd_ring_get_irq(struct intel_ring_buffer *ring)
1330
gen6_bsd_ring_get_irq(struct intel_ring_buffer *ring)
1333
{
1331
{
1334
	return gen6_ring_get_irq(ring,
1332
	return gen6_ring_get_irq(ring,
1335
				 GT_GEN6_BSD_USER_INTERRUPT,
1333
				 GT_GEN6_BSD_USER_INTERRUPT,
1336
				 GEN6_BSD_USER_INTERRUPT);
1334
				 GEN6_BSD_USER_INTERRUPT);
1337
}
1335
}
1338
 
1336
 
1339
static void
1337
static void
1340
gen6_bsd_ring_put_irq(struct intel_ring_buffer *ring)
1338
gen6_bsd_ring_put_irq(struct intel_ring_buffer *ring)
1341
{
1339
{
1342
	return gen6_ring_put_irq(ring,
1340
	return gen6_ring_put_irq(ring,
1343
				 GT_GEN6_BSD_USER_INTERRUPT,
1341
				 GT_GEN6_BSD_USER_INTERRUPT,
1344
				 GEN6_BSD_USER_INTERRUPT);
1342
				 GEN6_BSD_USER_INTERRUPT);
1345
}
1343
}
1346
 
1344
 
1347
/* ring buffer for Video Codec for Gen6+ */
1345
/* ring buffer for Video Codec for Gen6+ */
1348
static const struct intel_ring_buffer gen6_bsd_ring = {
1346
static const struct intel_ring_buffer gen6_bsd_ring = {
1349
	.name			= "gen6 bsd ring",
1347
	.name			= "gen6 bsd ring",
1350
	.id			= RING_BSD,
1348
	.id			= RING_BSD,
1351
	.mmio_base		= GEN6_BSD_RING_BASE,
1349
	.mmio_base		= GEN6_BSD_RING_BASE,
1352
	.size			= 32 * PAGE_SIZE,
1350
	.size			= 32 * PAGE_SIZE,
1353
	.init			= init_ring_common,
1351
	.init			= init_ring_common,
1354
	.write_tail		= gen6_bsd_ring_write_tail,
1352
	.write_tail		= gen6_bsd_ring_write_tail,
1355
    .flush          = gen6_ring_flush,
1353
    .flush          = gen6_ring_flush,
1356
    .add_request        = gen6_add_request,
1354
    .add_request        = gen6_add_request,
1357
	.get_seqno		= gen6_ring_get_seqno,
1355
	.get_seqno		= gen6_ring_get_seqno,
1358
	.irq_get		= gen6_bsd_ring_get_irq,
1356
	.irq_get		= gen6_bsd_ring_get_irq,
1359
	.irq_put		= gen6_bsd_ring_put_irq,
1357
	.irq_put		= gen6_bsd_ring_put_irq,
1360
   .dispatch_execbuffer    = gen6_ring_dispatch_execbuffer,
1358
   .dispatch_execbuffer    = gen6_ring_dispatch_execbuffer,
1361
	.sync_to		= gen6_bsd_ring_sync_to,
1359
	.sync_to		= gen6_bsd_ring_sync_to,
1362
	.semaphore_register	= {MI_SEMAPHORE_SYNC_VR,
1360
	.semaphore_register	= {MI_SEMAPHORE_SYNC_VR,
1363
				   MI_SEMAPHORE_SYNC_INVALID,
1361
				   MI_SEMAPHORE_SYNC_INVALID,
1364
				   MI_SEMAPHORE_SYNC_VB},
1362
				   MI_SEMAPHORE_SYNC_VB},
1365
	.signal_mbox		= {GEN6_RVSYNC, GEN6_BVSYNC},
1363
	.signal_mbox		= {GEN6_RVSYNC, GEN6_BVSYNC},
1366
};
1364
};
1367
 
1365
 
1368
/* Blitter support (SandyBridge+) */
1366
/* Blitter support (SandyBridge+) */
1369
 
1367
 
1370
static bool
1368
static bool
1371
blt_ring_get_irq(struct intel_ring_buffer *ring)
1369
blt_ring_get_irq(struct intel_ring_buffer *ring)
1372
{
1370
{
1373
	return gen6_ring_get_irq(ring,
1371
	return gen6_ring_get_irq(ring,
1374
				 GT_BLT_USER_INTERRUPT,
1372
				 GT_BLT_USER_INTERRUPT,
1375
				 GEN6_BLITTER_USER_INTERRUPT);
1373
				 GEN6_BLITTER_USER_INTERRUPT);
1376
}
1374
}
1377
 
1375
 
1378
static void
1376
static void
1379
blt_ring_put_irq(struct intel_ring_buffer *ring)
1377
blt_ring_put_irq(struct intel_ring_buffer *ring)
1380
{
1378
{
1381
	gen6_ring_put_irq(ring,
1379
	gen6_ring_put_irq(ring,
1382
			  GT_BLT_USER_INTERRUPT,
1380
			  GT_BLT_USER_INTERRUPT,
1383
			  GEN6_BLITTER_USER_INTERRUPT);
1381
			  GEN6_BLITTER_USER_INTERRUPT);
1384
}
1382
}
1385
 
1383
 
1386
 
1384
 
1387
/* Workaround for some stepping of SNB,
1385
/* Workaround for some stepping of SNB,
1388
 * each time when BLT engine ring tail moved,
1386
 * each time when BLT engine ring tail moved,
1389
 * the first command in the ring to be parsed
1387
 * the first command in the ring to be parsed
1390
 * should be MI_BATCH_BUFFER_START
1388
 * should be MI_BATCH_BUFFER_START
1391
 */
1389
 */
1392
#define NEED_BLT_WORKAROUND(dev) \
1390
#define NEED_BLT_WORKAROUND(dev) \
1393
	(IS_GEN6(dev) && (dev->pdev->revision < 8))
1391
	(IS_GEN6(dev) && (dev->pdev->revision < 8))
1394
 
1392
 
1395
static inline struct drm_i915_gem_object *
1393
static inline struct drm_i915_gem_object *
1396
to_blt_workaround(struct intel_ring_buffer *ring)
1394
to_blt_workaround(struct intel_ring_buffer *ring)
1397
{
1395
{
1398
	return ring->private;
1396
	return ring->private;
1399
}
1397
}
1400
 
1398
 
1401
static int blt_ring_init(struct intel_ring_buffer *ring)
1399
static int blt_ring_init(struct intel_ring_buffer *ring)
1402
{
1400
{
1403
	if (NEED_BLT_WORKAROUND(ring->dev)) {
1401
	if (NEED_BLT_WORKAROUND(ring->dev)) {
1404
		struct drm_i915_gem_object *obj;
1402
		struct drm_i915_gem_object *obj;
1405
		u32 *ptr;
1403
		u32 *ptr;
1406
		int ret;
1404
		int ret;
1407
 
1405
 
1408
		obj = i915_gem_alloc_object(ring->dev, 4096);
1406
		obj = i915_gem_alloc_object(ring->dev, 4096);
1409
		if (obj == NULL)
1407
		if (obj == NULL)
1410
			return -ENOMEM;
1408
			return -ENOMEM;
1411
 
1409
 
1412
		ret = i915_gem_object_pin(obj, 4096, true);
1410
		ret = i915_gem_object_pin(obj, 4096, true);
1413
		if (ret) {
1411
		if (ret) {
1414
//           drm_gem_object_unreference(&obj->base);
1412
			drm_gem_object_unreference(&obj->base);
1415
			return ret;
1413
			return ret;
1416
		}
1414
		}
1417
 
1415
 
-
 
1416
        ptr = MapIoMem(obj->pages[0], 4096, PG_SW);
-
 
1417
        obj->mapped = ptr;
1418
        ptr = ioremap(obj->pages[0], 4096);
1418
 
1419
		*ptr++ = MI_BATCH_BUFFER_END;
1419
		*ptr++ = MI_BATCH_BUFFER_END;
1420
		*ptr++ = MI_NOOP;
-
 
1421
//        iounmap(obj->pages[0]);
1420
		*ptr++ = MI_NOOP;
1422
 
1421
 
1423
		ret = i915_gem_object_set_to_gtt_domain(obj, false);
1422
		ret = i915_gem_object_set_to_gtt_domain(obj, false);
1424
		if (ret) {
1423
		if (ret) {
1425
//           i915_gem_object_unpin(obj);
1424
           i915_gem_object_unpin(obj);
1426
//           drm_gem_object_unreference(&obj->base);
1425
			drm_gem_object_unreference(&obj->base);
-
 
1426
        	FreeKernelSpace(ptr);
-
 
1427
        	obj->mapped = NULL;
1427
			return ret;
1428
			return ret;
1428
		}
1429
		}
-
 
1430
        FreeKernelSpace(ptr);
-
 
1431
        obj->mapped = NULL;
1429
 
1432
 
1430
		ring->private = obj;
1433
		ring->private = obj;
1431
	}
1434
	}
1432
 
1435
 
1433
	return init_ring_common(ring);
1436
	return init_ring_common(ring);
1434
}
1437
}
1435
 
1438
 
1436
static int blt_ring_begin(struct intel_ring_buffer *ring,
1439
static int blt_ring_begin(struct intel_ring_buffer *ring,
1437
			  int num_dwords)
1440
			  int num_dwords)
1438
{
1441
{
1439
	if (ring->private) {
1442
	if (ring->private) {
1440
		int ret = intel_ring_begin(ring, num_dwords+2);
1443
		int ret = intel_ring_begin(ring, num_dwords+2);
1441
		if (ret)
1444
		if (ret)
1442
			return ret;
1445
			return ret;
1443
 
1446
 
1444
		intel_ring_emit(ring, MI_BATCH_BUFFER_START);
1447
		intel_ring_emit(ring, MI_BATCH_BUFFER_START);
1445
		intel_ring_emit(ring, to_blt_workaround(ring)->gtt_offset);
1448
		intel_ring_emit(ring, to_blt_workaround(ring)->gtt_offset);
1446
 
1449
 
1447
		return 0;
1450
		return 0;
1448
	} else
1451
	} else
1449
		return intel_ring_begin(ring, 4);
1452
		return intel_ring_begin(ring, 4);
1450
}
1453
}
1451
 
1454
 
1452
static int blt_ring_flush(struct intel_ring_buffer *ring,
1455
static int blt_ring_flush(struct intel_ring_buffer *ring,
1453
			  u32 invalidate, u32 flush)
1456
			  u32 invalidate, u32 flush)
1454
{
1457
{
1455
	uint32_t cmd;
1458
	uint32_t cmd;
1456
	int ret;
1459
	int ret;
1457
 
1460
 
1458
	ret = blt_ring_begin(ring, 4);
1461
	ret = blt_ring_begin(ring, 4);
1459
	if (ret)
1462
	if (ret)
1460
		return ret;
1463
		return ret;
1461
 
1464
 
1462
	cmd = MI_FLUSH_DW;
1465
	cmd = MI_FLUSH_DW;
1463
	if (invalidate & I915_GEM_DOMAIN_RENDER)
1466
	if (invalidate & I915_GEM_DOMAIN_RENDER)
1464
		cmd |= MI_INVALIDATE_TLB;
1467
		cmd |= MI_INVALIDATE_TLB;
1465
	intel_ring_emit(ring, cmd);
1468
	intel_ring_emit(ring, cmd);
1466
	intel_ring_emit(ring, 0);
1469
	intel_ring_emit(ring, 0);
1467
	intel_ring_emit(ring, 0);
1470
	intel_ring_emit(ring, 0);
1468
	intel_ring_emit(ring, MI_NOOP);
1471
	intel_ring_emit(ring, MI_NOOP);
1469
	intel_ring_advance(ring);
1472
	intel_ring_advance(ring);
1470
	return 0;
1473
	return 0;
1471
}
1474
}
1472
 
1475
 
1473
static void blt_ring_cleanup(struct intel_ring_buffer *ring)
1476
static void blt_ring_cleanup(struct intel_ring_buffer *ring)
1474
{
1477
{
1475
	if (!ring->private)
1478
	if (!ring->private)
1476
		return;
1479
		return;
1477
 
1480
 
1478
	i915_gem_object_unpin(ring->private);
1481
	i915_gem_object_unpin(ring->private);
1479
	drm_gem_object_unreference(ring->private);
1482
	drm_gem_object_unreference(ring->private);
1480
	ring->private = NULL;
1483
	ring->private = NULL;
1481
}
1484
}
1482
 
1485
 
1483
static const struct intel_ring_buffer gen6_blt_ring = {
1486
static const struct intel_ring_buffer gen6_blt_ring = {
1484
       .name			= "blt ring",
1487
       .name			= "blt ring",
1485
       .id			= RING_BLT,
1488
       .id			= RING_BLT,
1486
       .mmio_base		= BLT_RING_BASE,
1489
       .mmio_base		= BLT_RING_BASE,
1487
       .size			= 32 * PAGE_SIZE,
1490
       .size			= 32 * PAGE_SIZE,
1488
       .init			= blt_ring_init,
1491
       .init			= blt_ring_init,
1489
       .write_tail		= ring_write_tail,
1492
       .write_tail		= ring_write_tail,
1490
       .flush          = blt_ring_flush,
1493
       .flush          = blt_ring_flush,
1491
       .add_request        = gen6_add_request,
1494
       .add_request        = gen6_add_request,
1492
	.get_seqno		= gen6_ring_get_seqno,
1495
	.get_seqno		= gen6_ring_get_seqno,
1493
	.irq_get		= blt_ring_get_irq,
1496
	.irq_get		= blt_ring_get_irq,
1494
	.irq_put		= blt_ring_put_irq,
1497
	.irq_put		= blt_ring_put_irq,
1495
       .dispatch_execbuffer    = gen6_ring_dispatch_execbuffer,
1498
       .dispatch_execbuffer    = gen6_ring_dispatch_execbuffer,
1496
//       .cleanup            = blt_ring_cleanup,
1499
//       .cleanup            = blt_ring_cleanup,
1497
	.sync_to		= gen6_blt_ring_sync_to,
1500
	.sync_to		= gen6_blt_ring_sync_to,
1498
	.semaphore_register	= {MI_SEMAPHORE_SYNC_BR,
1501
	.semaphore_register	= {MI_SEMAPHORE_SYNC_BR,
1499
				   MI_SEMAPHORE_SYNC_BV,
1502
				   MI_SEMAPHORE_SYNC_BV,
1500
				   MI_SEMAPHORE_SYNC_INVALID},
1503
				   MI_SEMAPHORE_SYNC_INVALID},
1501
	.signal_mbox		= {GEN6_RBSYNC, GEN6_VBSYNC},
1504
	.signal_mbox		= {GEN6_RBSYNC, GEN6_VBSYNC},
1502
};
1505
};
1503
 
1506
 
1504
int intel_init_render_ring_buffer(struct drm_device *dev)
1507
int intel_init_render_ring_buffer(struct drm_device *dev)
1505
{
1508
{
1506
	drm_i915_private_t *dev_priv = dev->dev_private;
1509
	drm_i915_private_t *dev_priv = dev->dev_private;
1507
	struct intel_ring_buffer *ring = &dev_priv->ring[RCS];
1510
	struct intel_ring_buffer *ring = &dev_priv->ring[RCS];
1508
 
1511
 
1509
	*ring = render_ring;
1512
	*ring = render_ring;
1510
	if (INTEL_INFO(dev)->gen >= 6) {
1513
	if (INTEL_INFO(dev)->gen >= 6) {
1511
       ring->add_request = gen6_add_request;
1514
       ring->add_request = gen6_add_request;
1512
		ring->flush = gen6_render_ring_flush;
1515
		ring->flush = gen6_render_ring_flush;
1513
		ring->irq_get = gen6_render_ring_get_irq;
1516
		ring->irq_get = gen6_render_ring_get_irq;
1514
		ring->irq_put = gen6_render_ring_put_irq;
1517
		ring->irq_put = gen6_render_ring_put_irq;
1515
		ring->get_seqno = gen6_ring_get_seqno;
1518
		ring->get_seqno = gen6_ring_get_seqno;
1516
	} else if (IS_GEN5(dev)) {
1519
	} else if (IS_GEN5(dev)) {
1517
       ring->add_request = pc_render_add_request;
1520
       ring->add_request = pc_render_add_request;
1518
		ring->get_seqno = pc_render_get_seqno;
1521
		ring->get_seqno = pc_render_get_seqno;
1519
	}
1522
	}
1520
 
1523
 
1521
	if (!I915_NEED_GFX_HWS(dev)) {
1524
	if (!I915_NEED_GFX_HWS(dev)) {
1522
		ring->status_page.page_addr = dev_priv->status_page_dmah->vaddr;
1525
		ring->status_page.page_addr = dev_priv->status_page_dmah->vaddr;
1523
		memset(ring->status_page.page_addr, 0, PAGE_SIZE);
1526
		memset(ring->status_page.page_addr, 0, PAGE_SIZE);
1524
	}
1527
	}
1525
 
1528
 
1526
	return intel_init_ring_buffer(dev, ring);
1529
	return intel_init_ring_buffer(dev, ring);
1527
}
1530
}
1528
 
1531
 
1529
 
1532
 
1530
int intel_init_bsd_ring_buffer(struct drm_device *dev)
1533
int intel_init_bsd_ring_buffer(struct drm_device *dev)
1531
{
1534
{
1532
	drm_i915_private_t *dev_priv = dev->dev_private;
1535
	drm_i915_private_t *dev_priv = dev->dev_private;
1533
	struct intel_ring_buffer *ring = &dev_priv->ring[VCS];
1536
	struct intel_ring_buffer *ring = &dev_priv->ring[VCS];
1534
 
1537
 
1535
	if (IS_GEN6(dev) || IS_GEN7(dev))
1538
	if (IS_GEN6(dev) || IS_GEN7(dev))
1536
		*ring = gen6_bsd_ring;
1539
		*ring = gen6_bsd_ring;
1537
	else
1540
	else
1538
		*ring = bsd_ring;
1541
		*ring = bsd_ring;
1539
 
1542
 
1540
	return intel_init_ring_buffer(dev, ring);
1543
	return intel_init_ring_buffer(dev, ring);
1541
}
1544
}
1542
 
1545
 
1543
int intel_init_blt_ring_buffer(struct drm_device *dev)
1546
int intel_init_blt_ring_buffer(struct drm_device *dev)
1544
{
1547
{
1545
	drm_i915_private_t *dev_priv = dev->dev_private;
1548
	drm_i915_private_t *dev_priv = dev->dev_private;
1546
	struct intel_ring_buffer *ring = &dev_priv->ring[BCS];
1549
	struct intel_ring_buffer *ring = &dev_priv->ring[BCS];
1547
 
1550
 
1548
	*ring = gen6_blt_ring;
1551
	*ring = gen6_blt_ring;
1549
 
1552
 
1550
	return intel_init_ring_buffer(dev, ring);
1553
	return intel_init_ring_buffer(dev, ring);
1551
}
1554
}