1/* r300_cmdbuf.c -- Command buffer emission for R300 -*- linux-c -*-
2 *
3 * Copyright (C) The Weather Channel, Inc.  2002.
4 * Copyright (C) 2004 Nicolai Haehnle.
5 * All Rights Reserved.
6 *
7 * The Weather Channel (TM) funded Tungsten Graphics to develop the
8 * initial release of the Radeon 8500 driver under the XFree86 license.
9 * This notice must be preserved.
10 *
11 * Permission is hereby granted, free of charge, to any person obtaining a
12 * copy of this software and associated documentation files (the "Software"),
13 * to deal in the Software without restriction, including without limitation
14 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15 * and/or sell copies of the Software, and to permit persons to whom the
16 * Software is furnished to do so, subject to the following conditions:
17 *
18 * The above copyright notice and this permission notice (including the next
19 * paragraph) shall be included in all copies or substantial portions of the
20 * Software.
21 *
22 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
25 * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
26 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
27 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28 * DEALINGS IN THE SOFTWARE.
29 *
30 * Authors:
31 *    Nicolai Haehnle <prefect_@gmx.net>
32 */
33
34#include <sys/cdefs.h>
35__FBSDID("$FreeBSD$");
36
37#include <dev/drm2/drmP.h>
38#include <dev/drm2/drm_buffer.h>
39#include <dev/drm2/radeon/radeon_drm.h>
40#include "radeon_drv.h"
41#include "r300_reg.h"
42
43#define R300_SIMULTANEOUS_CLIPRECTS		4
44
45/* Values for R300_RE_CLIPRECT_CNTL depending on the number of cliprects
46 */
47static const int r300_cliprect_cntl[4] = {
48	0xAAAA,
49	0xEEEE,
50	0xFEFE,
51	0xFFFE
52};
53
54/**
55 * Emit up to R300_SIMULTANEOUS_CLIPRECTS cliprects from the given command
56 * buffer, starting with index n.
57 */
58static int r300_emit_cliprects(drm_radeon_private_t *dev_priv,
59			       drm_radeon_kcmd_buffer_t *cmdbuf, int n)
60{
61	struct drm_clip_rect box;
62	int nr;
63	int i;
64	RING_LOCALS;
65
66	nr = cmdbuf->nbox - n;
67	if (nr > R300_SIMULTANEOUS_CLIPRECTS)
68		nr = R300_SIMULTANEOUS_CLIPRECTS;
69
70	DRM_DEBUG("%i cliprects\n", nr);
71
72	if (nr) {
73		BEGIN_RING(6 + nr * 2);
74		OUT_RING(CP_PACKET0(R300_RE_CLIPRECT_TL_0, nr * 2 - 1));
75
76		for (i = 0; i < nr; ++i) {
77			if (DRM_COPY_FROM_USER_UNCHECKED
78			    (&box, &cmdbuf->boxes[n + i], sizeof(box))) {
79				DRM_ERROR("copy cliprect faulted\n");
80				return -EFAULT;
81			}
82
83			box.x2--; /* Hardware expects inclusive bottom-right corner */
84			box.y2--;
85
86			if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV515) {
87				box.x1 = (box.x1) &
88					R300_CLIPRECT_MASK;
89				box.y1 = (box.y1) &
90					R300_CLIPRECT_MASK;
91				box.x2 = (box.x2) &
92					R300_CLIPRECT_MASK;
93				box.y2 = (box.y2) &
94					R300_CLIPRECT_MASK;
95			} else {
96				box.x1 = (box.x1 + R300_CLIPRECT_OFFSET) &
97					R300_CLIPRECT_MASK;
98				box.y1 = (box.y1 + R300_CLIPRECT_OFFSET) &
99					R300_CLIPRECT_MASK;
100				box.x2 = (box.x2 + R300_CLIPRECT_OFFSET) &
101					R300_CLIPRECT_MASK;
102				box.y2 = (box.y2 + R300_CLIPRECT_OFFSET) &
103					R300_CLIPRECT_MASK;
104			}
105
106			OUT_RING((box.x1 << R300_CLIPRECT_X_SHIFT) |
107				 (box.y1 << R300_CLIPRECT_Y_SHIFT));
108			OUT_RING((box.x2 << R300_CLIPRECT_X_SHIFT) |
109				 (box.y2 << R300_CLIPRECT_Y_SHIFT));
110
111		}
112
113		OUT_RING_REG(R300_RE_CLIPRECT_CNTL, r300_cliprect_cntl[nr - 1]);
114
115		/* TODO/SECURITY: Force scissors to a safe value, otherwise the
116		 * client might be able to trample over memory.
117		 * The impact should be very limited, but I'd rather be safe than
118		 * sorry.
119		 */
120		OUT_RING(CP_PACKET0(R300_RE_SCISSORS_TL, 1));
121		OUT_RING(0);
122		OUT_RING(R300_SCISSORS_X_MASK | R300_SCISSORS_Y_MASK);
123		ADVANCE_RING();
124	} else {
125		/* Why we allow zero cliprect rendering:
126		 * There are some commands in a command buffer that must be submitted
127		 * even when there are no cliprects, e.g. DMA buffer discard
128		 * or state setting (though state setting could be avoided by
129		 * simulating a loss of context).
130		 *
131		 * Now since the cmdbuf interface is so chaotic right now (and is
132		 * bound to remain that way for a bit until things settle down),
133		 * it is basically impossible to filter out the commands that are
134		 * necessary and those that aren't.
135		 *
136		 * So I choose the safe way and don't do any filtering at all;
137		 * instead, I simply set up the engine so that all rendering
138		 * can't produce any fragments.
139		 */
140		BEGIN_RING(2);
141		OUT_RING_REG(R300_RE_CLIPRECT_CNTL, 0);
142		ADVANCE_RING();
143	}
144
145	/* flus cache and wait idle clean after cliprect change */
146	BEGIN_RING(2);
147	OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
148	OUT_RING(R300_RB3D_DC_FLUSH);
149	ADVANCE_RING();
150	BEGIN_RING(2);
151	OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0));
152	OUT_RING(RADEON_WAIT_3D_IDLECLEAN);
153	ADVANCE_RING();
154	/* set flush flag */
155	dev_priv->track_flush |= RADEON_FLUSH_EMITED;
156
157	return 0;
158}
159
160static u8 r300_reg_flags[0x10000 >> 2];
161
162void r300_init_reg_flags(struct drm_device *dev)
163{
164	int i;
165	drm_radeon_private_t *dev_priv = dev->dev_private;
166
167	memset(r300_reg_flags, 0, 0x10000 >> 2);
168#define ADD_RANGE_MARK(reg, count,mark) \
169		for(i=((reg)>>2);i<((reg)>>2)+(count);i++)\
170			r300_reg_flags[i]|=(mark);
171
172#define MARK_SAFE		1
173#define MARK_CHECK_OFFSET	2
174
175#define ADD_RANGE(reg, count)	ADD_RANGE_MARK(reg, count, MARK_SAFE)
176
177	/* these match cmducs() command in r300_driver/r300/r300_cmdbuf.c */
178	ADD_RANGE(R300_SE_VPORT_XSCALE, 6);
179	ADD_RANGE(R300_VAP_CNTL, 1);
180	ADD_RANGE(R300_SE_VTE_CNTL, 2);
181	ADD_RANGE(0x2134, 2);
182	ADD_RANGE(R300_VAP_CNTL_STATUS, 1);
183	ADD_RANGE(R300_VAP_INPUT_CNTL_0, 2);
184	ADD_RANGE(0x21DC, 1);
185	ADD_RANGE(R300_VAP_UNKNOWN_221C, 1);
186	ADD_RANGE(R300_VAP_CLIP_X_0, 4);
187	ADD_RANGE(R300_VAP_PVS_STATE_FLUSH_REG, 1);
188	ADD_RANGE(R300_VAP_UNKNOWN_2288, 1);
189	ADD_RANGE(R300_VAP_OUTPUT_VTX_FMT_0, 2);
190	ADD_RANGE(R300_VAP_PVS_CNTL_1, 3);
191	ADD_RANGE(R300_GB_ENABLE, 1);
192	ADD_RANGE(R300_GB_MSPOS0, 5);
193	ADD_RANGE(R300_TX_INVALTAGS, 1);
194	ADD_RANGE(R300_TX_ENABLE, 1);
195	ADD_RANGE(0x4200, 4);
196	ADD_RANGE(0x4214, 1);
197	ADD_RANGE(R300_RE_POINTSIZE, 1);
198	ADD_RANGE(0x4230, 3);
199	ADD_RANGE(R300_RE_LINE_CNT, 1);
200	ADD_RANGE(R300_RE_UNK4238, 1);
201	ADD_RANGE(0x4260, 3);
202	ADD_RANGE(R300_RE_SHADE, 4);
203	ADD_RANGE(R300_RE_POLYGON_MODE, 5);
204	ADD_RANGE(R300_RE_ZBIAS_CNTL, 1);
205	ADD_RANGE(R300_RE_ZBIAS_T_FACTOR, 4);
206	ADD_RANGE(R300_RE_OCCLUSION_CNTL, 1);
207	ADD_RANGE(R300_RE_CULL_CNTL, 1);
208	ADD_RANGE(0x42C0, 2);
209	ADD_RANGE(R300_RS_CNTL_0, 2);
210
211	ADD_RANGE(R300_SU_REG_DEST, 1);
212	if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV530)
213		ADD_RANGE(RV530_FG_ZBREG_DEST, 1);
214
215	ADD_RANGE(R300_SC_HYPERZ, 2);
216	ADD_RANGE(0x43E8, 1);
217
218	ADD_RANGE(0x46A4, 5);
219
220	ADD_RANGE(R300_RE_FOG_STATE, 1);
221	ADD_RANGE(R300_FOG_COLOR_R, 3);
222	ADD_RANGE(R300_PP_ALPHA_TEST, 2);
223	ADD_RANGE(0x4BD8, 1);
224	ADD_RANGE(R300_PFS_PARAM_0_X, 64);
225	ADD_RANGE(0x4E00, 1);
226	ADD_RANGE(R300_RB3D_CBLEND, 2);
227	ADD_RANGE(R300_RB3D_COLORMASK, 1);
228	ADD_RANGE(R300_RB3D_BLEND_COLOR, 3);
229	ADD_RANGE_MARK(R300_RB3D_COLOROFFSET0, 1, MARK_CHECK_OFFSET);	/* check offset */
230	ADD_RANGE(R300_RB3D_COLORPITCH0, 1);
231	ADD_RANGE(0x4E50, 9);
232	ADD_RANGE(0x4E88, 1);
233	ADD_RANGE(0x4EA0, 2);
234	ADD_RANGE(R300_ZB_CNTL, 3);
235	ADD_RANGE(R300_ZB_FORMAT, 4);
236	ADD_RANGE_MARK(R300_ZB_DEPTHOFFSET, 1, MARK_CHECK_OFFSET);	/* check offset */
237	ADD_RANGE(R300_ZB_DEPTHPITCH, 1);
238	ADD_RANGE(R300_ZB_DEPTHCLEARVALUE, 1);
239	ADD_RANGE(R300_ZB_ZMASK_OFFSET, 13);
240	ADD_RANGE(R300_ZB_ZPASS_DATA, 2); /* ZB_ZPASS_DATA, ZB_ZPASS_ADDR */
241
242	ADD_RANGE(R300_TX_FILTER_0, 16);
243	ADD_RANGE(R300_TX_FILTER1_0, 16);
244	ADD_RANGE(R300_TX_SIZE_0, 16);
245	ADD_RANGE(R300_TX_FORMAT_0, 16);
246	ADD_RANGE(R300_TX_PITCH_0, 16);
247	/* Texture offset is dangerous and needs more checking */
248	ADD_RANGE_MARK(R300_TX_OFFSET_0, 16, MARK_CHECK_OFFSET);
249	ADD_RANGE(R300_TX_CHROMA_KEY_0, 16);
250	ADD_RANGE(R300_TX_BORDER_COLOR_0, 16);
251
252	/* Sporadic registers used as primitives are emitted */
253	ADD_RANGE(R300_ZB_ZCACHE_CTLSTAT, 1);
254	ADD_RANGE(R300_RB3D_DSTCACHE_CTLSTAT, 1);
255	ADD_RANGE(R300_VAP_INPUT_ROUTE_0_0, 8);
256	ADD_RANGE(R300_VAP_INPUT_ROUTE_1_0, 8);
257
258	if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV515) {
259		ADD_RANGE(R500_VAP_INDEX_OFFSET, 1);
260		ADD_RANGE(R500_US_CONFIG, 2);
261		ADD_RANGE(R500_US_CODE_ADDR, 3);
262		ADD_RANGE(R500_US_FC_CTRL, 1);
263		ADD_RANGE(R500_RS_IP_0, 16);
264		ADD_RANGE(R500_RS_INST_0, 16);
265		ADD_RANGE(R500_RB3D_COLOR_CLEAR_VALUE_AR, 2);
266		ADD_RANGE(R500_RB3D_CONSTANT_COLOR_AR, 2);
267		ADD_RANGE(R500_ZB_FIFO_SIZE, 2);
268	} else {
269		ADD_RANGE(R300_PFS_CNTL_0, 3);
270		ADD_RANGE(R300_PFS_NODE_0, 4);
271		ADD_RANGE(R300_PFS_TEXI_0, 64);
272		ADD_RANGE(R300_PFS_INSTR0_0, 64);
273		ADD_RANGE(R300_PFS_INSTR1_0, 64);
274		ADD_RANGE(R300_PFS_INSTR2_0, 64);
275		ADD_RANGE(R300_PFS_INSTR3_0, 64);
276		ADD_RANGE(R300_RS_INTERP_0, 8);
277		ADD_RANGE(R300_RS_ROUTE_0, 8);
278
279	}
280}
281
282static __inline__ int r300_check_range(unsigned reg, int count)
283{
284	int i;
285	if (reg & ~0xffff)
286		return -1;
287	for (i = (reg >> 2); i < (reg >> 2) + count; i++)
288		if (r300_reg_flags[i] != MARK_SAFE)
289			return 1;
290	return 0;
291}
292
293static __inline__ int r300_emit_carefully_checked_packet0(drm_radeon_private_t *
294							  dev_priv,
295							  drm_radeon_kcmd_buffer_t
296							  * cmdbuf,
297							  drm_r300_cmd_header_t
298							  header)
299{
300	int reg;
301	int sz;
302	int i;
303	u32 *value;
304	RING_LOCALS;
305
306	sz = header.packet0.count;
307	reg = (header.packet0.reghi << 8) | header.packet0.reglo;
308
309	if ((sz > 64) || (sz < 0)) {
310		DRM_ERROR("Cannot emit more than 64 values at a time (reg=%04x sz=%d)\n",
311			 reg, sz);
312		return -EINVAL;
313	}
314
315	for (i = 0; i < sz; i++) {
316		switch (r300_reg_flags[(reg >> 2) + i]) {
317		case MARK_SAFE:
318			break;
319		case MARK_CHECK_OFFSET:
320			value = drm_buffer_pointer_to_dword(cmdbuf->buffer, i);
321			if (!radeon_check_offset(dev_priv, *value)) {
322				DRM_ERROR("Offset failed range check (reg=%04x sz=%d)\n",
323					 reg, sz);
324				return -EINVAL;
325			}
326			break;
327		default:
328			DRM_ERROR("Register %04x failed check as flag=%02x\n",
329				reg + i * 4, r300_reg_flags[(reg >> 2) + i]);
330			return -EINVAL;
331		}
332	}
333
334	BEGIN_RING(1 + sz);
335	OUT_RING(CP_PACKET0(reg, sz - 1));
336	OUT_RING_DRM_BUFFER(cmdbuf->buffer, sz);
337	ADVANCE_RING();
338
339	return 0;
340}
341
342/**
343 * Emits a packet0 setting arbitrary registers.
344 * Called by r300_do_cp_cmdbuf.
345 *
346 * Note that checks are performed on contents and addresses of the registers
347 */
348static __inline__ int r300_emit_packet0(drm_radeon_private_t *dev_priv,
349					drm_radeon_kcmd_buffer_t *cmdbuf,
350					drm_r300_cmd_header_t header)
351{
352	int reg;
353	int sz;
354	RING_LOCALS;
355
356	sz = header.packet0.count;
357	reg = (header.packet0.reghi << 8) | header.packet0.reglo;
358
359	if (!sz)
360		return 0;
361
362	if (sz * 4 > drm_buffer_unprocessed(cmdbuf->buffer))
363		return -EINVAL;
364
365	if (reg + sz * 4 >= 0x10000) {
366		DRM_ERROR("No such registers in hardware reg=%04x sz=%d\n", reg,
367			  sz);
368		return -EINVAL;
369	}
370
371	if (r300_check_range(reg, sz)) {
372		/* go and check everything */
373		return r300_emit_carefully_checked_packet0(dev_priv, cmdbuf,
374							   header);
375	}
376	/* the rest of the data is safe to emit, whatever the values the user passed */
377
378	BEGIN_RING(1 + sz);
379	OUT_RING(CP_PACKET0(reg, sz - 1));
380	OUT_RING_DRM_BUFFER(cmdbuf->buffer, sz);
381	ADVANCE_RING();
382
383	return 0;
384}
385
386/**
387 * Uploads user-supplied vertex program instructions or parameters onto
388 * the graphics card.
389 * Called by r300_do_cp_cmdbuf.
390 */
391static __inline__ int r300_emit_vpu(drm_radeon_private_t *dev_priv,
392				    drm_radeon_kcmd_buffer_t *cmdbuf,
393				    drm_r300_cmd_header_t header)
394{
395	int sz;
396	int addr;
397	RING_LOCALS;
398
399	sz = header.vpu.count;
400	addr = (header.vpu.adrhi << 8) | header.vpu.adrlo;
401
402	if (!sz)
403		return 0;
404	if (sz * 16 > drm_buffer_unprocessed(cmdbuf->buffer))
405		return -EINVAL;
406
407	/* VAP is very sensitive so we purge cache before we program it
408	 * and we also flush its state before & after */
409	BEGIN_RING(6);
410	OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
411	OUT_RING(R300_RB3D_DC_FLUSH);
412	OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0));
413	OUT_RING(RADEON_WAIT_3D_IDLECLEAN);
414	OUT_RING(CP_PACKET0(R300_VAP_PVS_STATE_FLUSH_REG, 0));
415	OUT_RING(0);
416	ADVANCE_RING();
417	/* set flush flag */
418	dev_priv->track_flush |= RADEON_FLUSH_EMITED;
419
420	BEGIN_RING(3 + sz * 4);
421	OUT_RING_REG(R300_VAP_PVS_UPLOAD_ADDRESS, addr);
422	OUT_RING(CP_PACKET0_TABLE(R300_VAP_PVS_UPLOAD_DATA, sz * 4 - 1));
423	OUT_RING_DRM_BUFFER(cmdbuf->buffer, sz * 4);
424	ADVANCE_RING();
425
426	BEGIN_RING(2);
427	OUT_RING(CP_PACKET0(R300_VAP_PVS_STATE_FLUSH_REG, 0));
428	OUT_RING(0);
429	ADVANCE_RING();
430
431	return 0;
432}
433
434/**
435 * Emit a clear packet from userspace.
436 * Called by r300_emit_packet3.
437 */
438static __inline__ int r300_emit_clear(drm_radeon_private_t *dev_priv,
439				      drm_radeon_kcmd_buffer_t *cmdbuf)
440{
441	RING_LOCALS;
442
443	if (8 * 4 > drm_buffer_unprocessed(cmdbuf->buffer))
444		return -EINVAL;
445
446	BEGIN_RING(10);
447	OUT_RING(CP_PACKET3(R200_3D_DRAW_IMMD_2, 8));
448	OUT_RING(R300_PRIM_TYPE_POINT | R300_PRIM_WALK_RING |
449		 (1 << R300_PRIM_NUM_VERTICES_SHIFT));
450	OUT_RING_DRM_BUFFER(cmdbuf->buffer, 8);
451	ADVANCE_RING();
452
453	BEGIN_RING(4);
454	OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
455	OUT_RING(R300_RB3D_DC_FLUSH);
456	OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0));
457	OUT_RING(RADEON_WAIT_3D_IDLECLEAN);
458	ADVANCE_RING();
459	/* set flush flag */
460	dev_priv->track_flush |= RADEON_FLUSH_EMITED;
461
462	return 0;
463}
464
465static __inline__ int r300_emit_3d_load_vbpntr(drm_radeon_private_t *dev_priv,
466					       drm_radeon_kcmd_buffer_t *cmdbuf,
467					       u32 header)
468{
469	int count, i, k;
470#define MAX_ARRAY_PACKET  64
471	u32 *data;
472	u32 narrays;
473	RING_LOCALS;
474
475	count = (header & RADEON_CP_PACKET_COUNT_MASK) >> 16;
476
477	if ((count + 1) > MAX_ARRAY_PACKET) {
478		DRM_ERROR("Too large payload in 3D_LOAD_VBPNTR (count=%d)\n",
479			  count);
480		return -EINVAL;
481	}
482	/* carefully check packet contents */
483
484	/* We have already read the header so advance the buffer. */
485	drm_buffer_advance(cmdbuf->buffer, 4);
486
487	narrays = *(u32 *)drm_buffer_pointer_to_dword(cmdbuf->buffer, 0);
488	k = 0;
489	i = 1;
490	while ((k < narrays) && (i < (count + 1))) {
491		i++;		/* skip attribute field */
492		data = drm_buffer_pointer_to_dword(cmdbuf->buffer, i);
493		if (!radeon_check_offset(dev_priv, *data)) {
494			DRM_ERROR
495			    ("Offset failed range check (k=%d i=%d) while processing 3D_LOAD_VBPNTR packet.\n",
496			     k, i);
497			return -EINVAL;
498		}
499		k++;
500		i++;
501		if (k == narrays)
502			break;
503		/* have one more to process, they come in pairs */
504		data = drm_buffer_pointer_to_dword(cmdbuf->buffer, i);
505		if (!radeon_check_offset(dev_priv, *data)) {
506			DRM_ERROR
507			    ("Offset failed range check (k=%d i=%d) while processing 3D_LOAD_VBPNTR packet.\n",
508			     k, i);
509			return -EINVAL;
510		}
511		k++;
512		i++;
513	}
514	/* do the counts match what we expect ? */
515	if ((k != narrays) || (i != (count + 1))) {
516		DRM_ERROR
517		    ("Malformed 3D_LOAD_VBPNTR packet (k=%d i=%d narrays=%d count+1=%d).\n",
518		     k, i, narrays, count + 1);
519		return -EINVAL;
520	}
521
522	/* all clear, output packet */
523
524	BEGIN_RING(count + 2);
525	OUT_RING(header);
526	OUT_RING_DRM_BUFFER(cmdbuf->buffer, count + 1);
527	ADVANCE_RING();
528
529	return 0;
530}
531
532static __inline__ int r300_emit_bitblt_multi(drm_radeon_private_t *dev_priv,
533					     drm_radeon_kcmd_buffer_t *cmdbuf)
534{
535	u32 *cmd = drm_buffer_pointer_to_dword(cmdbuf->buffer, 0);
536	int count, ret;
537	RING_LOCALS;
538
539
540	count = (*cmd & RADEON_CP_PACKET_COUNT_MASK) >> 16;
541
542	if (*cmd & 0x8000) {
543		u32 offset;
544		u32 *cmd1 = drm_buffer_pointer_to_dword(cmdbuf->buffer, 1);
545		if (*cmd1 & (RADEON_GMC_SRC_PITCH_OFFSET_CNTL
546			      | RADEON_GMC_DST_PITCH_OFFSET_CNTL)) {
547
548			u32 *cmd2 = drm_buffer_pointer_to_dword(cmdbuf->buffer, 2);
549			offset = *cmd2 << 10;
550			ret = !radeon_check_offset(dev_priv, offset);
551			if (ret) {
552				DRM_ERROR("Invalid bitblt first offset is %08X\n", offset);
553				return -EINVAL;
554			}
555		}
556
557		if ((*cmd1 & RADEON_GMC_SRC_PITCH_OFFSET_CNTL) &&
558		    (*cmd1 & RADEON_GMC_DST_PITCH_OFFSET_CNTL)) {
559			u32 *cmd3 = drm_buffer_pointer_to_dword(cmdbuf->buffer, 3);
560			offset = *cmd3 << 10;
561			ret = !radeon_check_offset(dev_priv, offset);
562			if (ret) {
563				DRM_ERROR("Invalid bitblt second offset is %08X\n", offset);
564				return -EINVAL;
565			}
566
567		}
568	}
569
570	BEGIN_RING(count+2);
571	OUT_RING_DRM_BUFFER(cmdbuf->buffer, count + 2);
572	ADVANCE_RING();
573
574	return 0;
575}
576
577static __inline__ int r300_emit_draw_indx_2(drm_radeon_private_t *dev_priv,
578					    drm_radeon_kcmd_buffer_t *cmdbuf)
579{
580	u32 *cmd = drm_buffer_pointer_to_dword(cmdbuf->buffer, 0);
581	u32 *cmd1 = drm_buffer_pointer_to_dword(cmdbuf->buffer, 1);
582	int count;
583	int expected_count;
584	RING_LOCALS;
585
586	count = (*cmd & RADEON_CP_PACKET_COUNT_MASK) >> 16;
587
588	expected_count = *cmd1 >> 16;
589	if (!(*cmd1 & R300_VAP_VF_CNTL__INDEX_SIZE_32bit))
590		expected_count = (expected_count+1)/2;
591
592	if (count && count != expected_count) {
593		DRM_ERROR("3D_DRAW_INDX_2: packet size %i, expected %i\n",
594			count, expected_count);
595		return -EINVAL;
596	}
597
598	BEGIN_RING(count+2);
599	OUT_RING_DRM_BUFFER(cmdbuf->buffer, count + 2);
600	ADVANCE_RING();
601
602	if (!count) {
603		drm_r300_cmd_header_t stack_header, *header;
604		u32 *cmd1, *cmd2, *cmd3;
605
606		if (drm_buffer_unprocessed(cmdbuf->buffer)
607				< 4*4 + sizeof(stack_header)) {
608			DRM_ERROR("3D_DRAW_INDX_2: expect subsequent INDX_BUFFER, but stream is too short.\n");
609			return -EINVAL;
610		}
611
612		header = drm_buffer_read_object(cmdbuf->buffer,
613				sizeof(stack_header), &stack_header);
614
615		cmd = drm_buffer_pointer_to_dword(cmdbuf->buffer, 0);
616		cmd1 = drm_buffer_pointer_to_dword(cmdbuf->buffer, 1);
617		cmd2 = drm_buffer_pointer_to_dword(cmdbuf->buffer, 2);
618		cmd3 = drm_buffer_pointer_to_dword(cmdbuf->buffer, 3);
619
620		if (header->header.cmd_type != R300_CMD_PACKET3 ||
621		    header->packet3.packet != R300_CMD_PACKET3_RAW ||
622		    *cmd != CP_PACKET3(RADEON_CP_INDX_BUFFER, 2)) {
623			DRM_ERROR("3D_DRAW_INDX_2: expect subsequent INDX_BUFFER.\n");
624			return -EINVAL;
625		}
626
627		if ((*cmd1 & 0x8000ffff) != 0x80000810) {
628			DRM_ERROR("Invalid indx_buffer reg address %08X\n",
629					*cmd1);
630			return -EINVAL;
631		}
632		if (!radeon_check_offset(dev_priv, *cmd2)) {
633			DRM_ERROR("Invalid indx_buffer offset is %08X\n",
634					*cmd2);
635			return -EINVAL;
636		}
637		if (*cmd3 != expected_count) {
638			DRM_ERROR("INDX_BUFFER: buffer size %i, expected %i\n",
639				*cmd3, expected_count);
640			return -EINVAL;
641		}
642
643		BEGIN_RING(4);
644		OUT_RING_DRM_BUFFER(cmdbuf->buffer, 4);
645		ADVANCE_RING();
646	}
647
648	return 0;
649}
650
651static __inline__ int r300_emit_raw_packet3(drm_radeon_private_t *dev_priv,
652					    drm_radeon_kcmd_buffer_t *cmdbuf)
653{
654	u32 *header;
655	int count;
656	RING_LOCALS;
657
658	if (4 > drm_buffer_unprocessed(cmdbuf->buffer))
659		return -EINVAL;
660
661	/* Fixme !! This simply emits a packet without much checking.
662	   We need to be smarter. */
663
664	/* obtain first word - actual packet3 header */
665	header = drm_buffer_pointer_to_dword(cmdbuf->buffer, 0);
666
667	/* Is it packet 3 ? */
668	if ((*header >> 30) != 0x3) {
669		DRM_ERROR("Not a packet3 header (0x%08x)\n", *header);
670		return -EINVAL;
671	}
672
673	count = (*header >> 16) & 0x3fff;
674
675	/* Check again now that we know how much data to expect */
676	if ((count + 2) * 4 > drm_buffer_unprocessed(cmdbuf->buffer)) {
677		DRM_ERROR
678		    ("Expected packet3 of length %d but have only %d bytes left\n",
679		     (count + 2) * 4, drm_buffer_unprocessed(cmdbuf->buffer));
680		return -EINVAL;
681	}
682
683	/* Is it a packet type we know about ? */
684	switch (*header & 0xff00) {
685	case RADEON_3D_LOAD_VBPNTR:	/* load vertex array pointers */
686		return r300_emit_3d_load_vbpntr(dev_priv, cmdbuf, *header);
687
688	case RADEON_CNTL_BITBLT_MULTI:
689		return r300_emit_bitblt_multi(dev_priv, cmdbuf);
690
691	case RADEON_CP_INDX_BUFFER:
692		DRM_ERROR("packet3 INDX_BUFFER without preceding 3D_DRAW_INDX_2 is illegal.\n");
693		return -EINVAL;
694	case RADEON_CP_3D_DRAW_IMMD_2:
695		/* triggers drawing using in-packet vertex data */
696	case RADEON_CP_3D_DRAW_VBUF_2:
697		/* triggers drawing of vertex buffers setup elsewhere */
698		dev_priv->track_flush &= ~(RADEON_FLUSH_EMITED |
699					   RADEON_PURGE_EMITED);
700		break;
701	case RADEON_CP_3D_DRAW_INDX_2:
702		/* triggers drawing using indices to vertex buffer */
703		/* whenever we send vertex we clear flush & purge */
704		dev_priv->track_flush &= ~(RADEON_FLUSH_EMITED |
705					   RADEON_PURGE_EMITED);
706		return r300_emit_draw_indx_2(dev_priv, cmdbuf);
707	case RADEON_WAIT_FOR_IDLE:
708	case RADEON_CP_NOP:
709		/* these packets are safe */
710		break;
711	default:
712		DRM_ERROR("Unknown packet3 header (0x%08x)\n", *header);
713		return -EINVAL;
714	}
715
716	BEGIN_RING(count + 2);
717	OUT_RING_DRM_BUFFER(cmdbuf->buffer, count + 2);
718	ADVANCE_RING();
719
720	return 0;
721}
722
723/**
724 * Emit a rendering packet3 from userspace.
725 * Called by r300_do_cp_cmdbuf.
726 */
727static __inline__ int r300_emit_packet3(drm_radeon_private_t *dev_priv,
728					drm_radeon_kcmd_buffer_t *cmdbuf,
729					drm_r300_cmd_header_t header)
730{
731	int n;
732	int ret;
733	int orig_iter = cmdbuf->buffer->iterator;
734
735	/* This is a do-while-loop so that we run the interior at least once,
736	 * even if cmdbuf->nbox is 0. Compare r300_emit_cliprects for rationale.
737	 */
738	n = 0;
739	do {
740		if (cmdbuf->nbox > R300_SIMULTANEOUS_CLIPRECTS) {
741			ret = r300_emit_cliprects(dev_priv, cmdbuf, n);
742			if (ret)
743				return ret;
744
745			cmdbuf->buffer->iterator = orig_iter;
746		}
747
748		switch (header.packet3.packet) {
749		case R300_CMD_PACKET3_CLEAR:
750			DRM_DEBUG("R300_CMD_PACKET3_CLEAR\n");
751			ret = r300_emit_clear(dev_priv, cmdbuf);
752			if (ret) {
753				DRM_ERROR("r300_emit_clear failed\n");
754				return ret;
755			}
756			break;
757
758		case R300_CMD_PACKET3_RAW:
759			DRM_DEBUG("R300_CMD_PACKET3_RAW\n");
760			ret = r300_emit_raw_packet3(dev_priv, cmdbuf);
761			if (ret) {
762				DRM_ERROR("r300_emit_raw_packet3 failed\n");
763				return ret;
764			}
765			break;
766
767		default:
768			DRM_ERROR("bad packet3 type %i at byte %d\n",
769				  header.packet3.packet,
770				  cmdbuf->buffer->iterator - (int)sizeof(header));
771			return -EINVAL;
772		}
773
774		n += R300_SIMULTANEOUS_CLIPRECTS;
775	} while (n < cmdbuf->nbox);
776
777	return 0;
778}
779
780/* Some of the R300 chips seem to be extremely touchy about the two registers
781 * that are configured in r300_pacify.
782 * Among the worst offenders seems to be the R300 ND (0x4E44): When userspace
783 * sends a command buffer that contains only state setting commands and a
784 * vertex program/parameter upload sequence, this will eventually lead to a
785 * lockup, unless the sequence is bracketed by calls to r300_pacify.
786 * So we should take great care to *always* call r300_pacify before
787 * *anything* 3D related, and again afterwards. This is what the
788 * call bracket in r300_do_cp_cmdbuf is for.
789 */
790
791/**
792 * Emit the sequence to pacify R300.
793 */
794static void r300_pacify(drm_radeon_private_t *dev_priv)
795{
796	uint32_t cache_z, cache_3d, cache_2d;
797	RING_LOCALS;
798
799	cache_z = R300_ZC_FLUSH;
800	cache_2d = R300_RB2D_DC_FLUSH;
801	cache_3d = R300_RB3D_DC_FLUSH;
802	if (!(dev_priv->track_flush & RADEON_PURGE_EMITED)) {
803		/* we can purge, primitive where draw since last purge */
804		cache_z |= R300_ZC_FREE;
805		cache_2d |= R300_RB2D_DC_FREE;
806		cache_3d |= R300_RB3D_DC_FREE;
807	}
808
809	/* flush & purge zbuffer */
810	BEGIN_RING(2);
811	OUT_RING(CP_PACKET0(R300_ZB_ZCACHE_CTLSTAT, 0));
812	OUT_RING(cache_z);
813	ADVANCE_RING();
814	/* flush & purge 3d */
815	BEGIN_RING(2);
816	OUT_RING(CP_PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0));
817	OUT_RING(cache_3d);
818	ADVANCE_RING();
819	/* flush & purge texture */
820	BEGIN_RING(2);
821	OUT_RING(CP_PACKET0(R300_TX_INVALTAGS, 0));
822	OUT_RING(0);
823	ADVANCE_RING();
824	/* FIXME: is this one really needed ? */
825	BEGIN_RING(2);
826	OUT_RING(CP_PACKET0(R300_RB3D_AARESOLVE_CTL, 0));
827	OUT_RING(0);
828	ADVANCE_RING();
829	BEGIN_RING(2);
830	OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0));
831	OUT_RING(RADEON_WAIT_3D_IDLECLEAN);
832	ADVANCE_RING();
833	/* flush & purge 2d through E2 as RB2D will trigger lockup */
834	BEGIN_RING(4);
835	OUT_RING(CP_PACKET0(R300_DSTCACHE_CTLSTAT, 0));
836	OUT_RING(cache_2d);
837	OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0));
838	OUT_RING(RADEON_WAIT_2D_IDLECLEAN |
839		 RADEON_WAIT_HOST_IDLECLEAN);
840	ADVANCE_RING();
841	/* set flush & purge flags */
842	dev_priv->track_flush |= RADEON_FLUSH_EMITED | RADEON_PURGE_EMITED;
843}
844
845/**
846 * Called by r300_do_cp_cmdbuf to update the internal buffer age and state.
847 * The actual age emit is done by r300_do_cp_cmdbuf, which is why you must
848 * be careful about how this function is called.
849 */
850static void r300_discard_buffer(struct drm_device *dev, struct drm_master *master, struct drm_buf *buf)
851{
852	drm_radeon_buf_priv_t *buf_priv = buf->dev_private;
853	struct drm_radeon_master_private *master_priv = master->driver_priv;
854
855	buf_priv->age = ++master_priv->sarea_priv->last_dispatch;
856	buf->pending = 1;
857	buf->used = 0;
858}
859
860static void r300_cmd_wait(drm_radeon_private_t * dev_priv,
861			  drm_r300_cmd_header_t header)
862{
863	u32 wait_until;
864	RING_LOCALS;
865
866	if (!header.wait.flags)
867		return;
868
869	wait_until = 0;
870
871	switch(header.wait.flags) {
872	case R300_WAIT_2D:
873		wait_until = RADEON_WAIT_2D_IDLE;
874		break;
875	case R300_WAIT_3D:
876		wait_until = RADEON_WAIT_3D_IDLE;
877		break;
878	case R300_NEW_WAIT_2D_3D:
879		wait_until = RADEON_WAIT_2D_IDLE|RADEON_WAIT_3D_IDLE;
880		break;
881	case R300_NEW_WAIT_2D_2D_CLEAN:
882		wait_until = RADEON_WAIT_2D_IDLE|RADEON_WAIT_2D_IDLECLEAN;
883		break;
884	case R300_NEW_WAIT_3D_3D_CLEAN:
885		wait_until = RADEON_WAIT_3D_IDLE|RADEON_WAIT_3D_IDLECLEAN;
886		break;
887	case R300_NEW_WAIT_2D_2D_CLEAN_3D_3D_CLEAN:
888		wait_until = RADEON_WAIT_2D_IDLE|RADEON_WAIT_2D_IDLECLEAN;
889		wait_until |= RADEON_WAIT_3D_IDLE|RADEON_WAIT_3D_IDLECLEAN;
890		break;
891	default:
892		return;
893	}
894
895	BEGIN_RING(2);
896	OUT_RING(CP_PACKET0(RADEON_WAIT_UNTIL, 0));
897	OUT_RING(wait_until);
898	ADVANCE_RING();
899}
900
901static int r300_scratch(drm_radeon_private_t *dev_priv,
902			drm_radeon_kcmd_buffer_t *cmdbuf,
903			drm_r300_cmd_header_t header)
904{
905	u32 *ref_age_base;
906	u32 i, *buf_idx, h_pending;
907	u64 *ptr_addr;
908	u64 stack_ptr_addr;
909	RING_LOCALS;
910
911	if (drm_buffer_unprocessed(cmdbuf->buffer) <
912	    (sizeof(u64) + header.scratch.n_bufs * sizeof(*buf_idx))) {
913		return -EINVAL;
914	}
915
916	if (header.scratch.reg >= 5) {
917		return -EINVAL;
918	}
919
920	dev_priv->scratch_ages[header.scratch.reg]++;
921
922	ptr_addr = drm_buffer_read_object(cmdbuf->buffer,
923			sizeof(stack_ptr_addr), &stack_ptr_addr);
924	ref_age_base = (u32 *)(unsigned long)get_unaligned(ptr_addr);
925
926	for (i=0; i < header.scratch.n_bufs; i++) {
927		buf_idx = drm_buffer_pointer_to_dword(cmdbuf->buffer, 0);
928		*buf_idx *= 2; /* 8 bytes per buf */
929
930		if (DRM_COPY_TO_USER(ref_age_base + *buf_idx,
931				&dev_priv->scratch_ages[header.scratch.reg],
932				sizeof(u32)))
933			return -EINVAL;
934
935		if (DRM_COPY_FROM_USER(&h_pending,
936				ref_age_base + *buf_idx + 1,
937				sizeof(u32)))
938			return -EINVAL;
939
940		if (h_pending == 0)
941			return -EINVAL;
942
943		h_pending--;
944
945		if (DRM_COPY_TO_USER(ref_age_base + *buf_idx + 1,
946					&h_pending,
947					sizeof(u32)))
948			return -EINVAL;
949
950		drm_buffer_advance(cmdbuf->buffer, sizeof(*buf_idx));
951	}
952
953	BEGIN_RING(2);
954	OUT_RING( CP_PACKET0( RADEON_SCRATCH_REG0 + header.scratch.reg * 4, 0 ) );
955	OUT_RING( dev_priv->scratch_ages[header.scratch.reg] );
956	ADVANCE_RING();
957
958	return 0;
959}
960
961/**
962 * Uploads user-supplied vertex program instructions or parameters onto
963 * the graphics card.
964 * Called by r300_do_cp_cmdbuf.
965 */
966static inline int r300_emit_r500fp(drm_radeon_private_t *dev_priv,
967				       drm_radeon_kcmd_buffer_t *cmdbuf,
968				       drm_r300_cmd_header_t header)
969{
970	int sz;
971	int addr;
972	int type;
973	int isclamp;
974	int stride;
975	RING_LOCALS;
976
977	sz = header.r500fp.count;
978	/* address is 9 bits 0 - 8, bit 1 of flags is part of address */
979	addr = ((header.r500fp.adrhi_flags & 1) << 8) | header.r500fp.adrlo;
980
981	type = !!(header.r500fp.adrhi_flags & R500FP_CONSTANT_TYPE);
982	isclamp = !!(header.r500fp.adrhi_flags & R500FP_CONSTANT_CLAMP);
983
984	addr |= (type << 16);
985	addr |= (isclamp << 17);
986
987	stride = type ? 4 : 6;
988
989	DRM_DEBUG("r500fp %d %d type: %d\n", sz, addr, type);
990	if (!sz)
991		return 0;
992	if (sz * stride * 4 > drm_buffer_unprocessed(cmdbuf->buffer))
993		return -EINVAL;
994
995	BEGIN_RING(3 + sz * stride);
996	OUT_RING_REG(R500_GA_US_VECTOR_INDEX, addr);
997	OUT_RING(CP_PACKET0_TABLE(R500_GA_US_VECTOR_DATA, sz * stride - 1));
998	OUT_RING_DRM_BUFFER(cmdbuf->buffer, sz * stride);
999
1000	ADVANCE_RING();
1001
1002	return 0;
1003}
1004
1005
1006/**
1007 * Parses and validates a user-supplied command buffer and emits appropriate
1008 * commands on the DMA ring buffer.
1009 * Called by the ioctl handler function radeon_cp_cmdbuf.
1010 */
1011int r300_do_cp_cmdbuf(struct drm_device *dev,
1012		      struct drm_file *file_priv,
1013		      drm_radeon_kcmd_buffer_t *cmdbuf)
1014{
1015	drm_radeon_private_t *dev_priv = dev->dev_private;
1016	struct drm_radeon_master_private *master_priv = file_priv->masterp->driver_priv;
1017	struct drm_device_dma *dma = dev->dma;
1018	struct drm_buf *buf = NULL;
1019	int emit_dispatch_age = 0;
1020	int ret = 0;
1021
1022	DRM_DEBUG("\n");
1023
1024	/* pacify */
1025	r300_pacify(dev_priv);
1026
1027	if (cmdbuf->nbox <= R300_SIMULTANEOUS_CLIPRECTS) {
1028		ret = r300_emit_cliprects(dev_priv, cmdbuf, 0);
1029		if (ret)
1030			goto cleanup;
1031	}
1032
1033	while (drm_buffer_unprocessed(cmdbuf->buffer)
1034			>= sizeof(drm_r300_cmd_header_t)) {
1035		int idx;
1036		drm_r300_cmd_header_t *header, stack_header;
1037
1038		header = drm_buffer_read_object(cmdbuf->buffer,
1039				sizeof(stack_header), &stack_header);
1040
1041		switch (header->header.cmd_type) {
1042		case R300_CMD_PACKET0:
1043			DRM_DEBUG("R300_CMD_PACKET0\n");
1044			ret = r300_emit_packet0(dev_priv, cmdbuf, *header);
1045			if (ret) {
1046				DRM_ERROR("r300_emit_packet0 failed\n");
1047				goto cleanup;
1048			}
1049			break;
1050
1051		case R300_CMD_VPU:
1052			DRM_DEBUG("R300_CMD_VPU\n");
1053			ret = r300_emit_vpu(dev_priv, cmdbuf, *header);
1054			if (ret) {
1055				DRM_ERROR("r300_emit_vpu failed\n");
1056				goto cleanup;
1057			}
1058			break;
1059
1060		case R300_CMD_PACKET3:
1061			DRM_DEBUG("R300_CMD_PACKET3\n");
1062			ret = r300_emit_packet3(dev_priv, cmdbuf, *header);
1063			if (ret) {
1064				DRM_ERROR("r300_emit_packet3 failed\n");
1065				goto cleanup;
1066			}
1067			break;
1068
1069		case R300_CMD_END3D:
1070			DRM_DEBUG("R300_CMD_END3D\n");
1071			/* TODO:
1072			   Ideally userspace driver should not need to issue this call,
1073			   i.e. the drm driver should issue it automatically and prevent
1074			   lockups.
1075
1076			   In practice, we do not understand why this call is needed and what
1077			   it does (except for some vague guesses that it has to do with cache
1078			   coherence) and so the user space driver does it.
1079
1080			   Once we are sure which uses prevent lockups the code could be moved
1081			   into the kernel and the userspace driver will not
1082			   need to use this command.
1083
1084			   Note that issuing this command does not hurt anything
1085			   except, possibly, performance */
1086			r300_pacify(dev_priv);
1087			break;
1088
1089		case R300_CMD_CP_DELAY:
1090			/* simple enough, we can do it here */
1091			DRM_DEBUG("R300_CMD_CP_DELAY\n");
1092			{
1093				int i;
1094				RING_LOCALS;
1095
1096				BEGIN_RING(header->delay.count);
1097				for (i = 0; i < header->delay.count; i++)
1098					OUT_RING(RADEON_CP_PACKET2);
1099				ADVANCE_RING();
1100			}
1101			break;
1102
1103		case R300_CMD_DMA_DISCARD:
1104			DRM_DEBUG("RADEON_CMD_DMA_DISCARD\n");
1105			idx = header->dma.buf_idx;
1106			if (idx < 0 || idx >= dma->buf_count) {
1107				DRM_ERROR("buffer index %d (of %d max)\n",
1108					  idx, dma->buf_count - 1);
1109				ret = -EINVAL;
1110				goto cleanup;
1111			}
1112
1113			buf = dma->buflist[idx];
1114			if (buf->file_priv != file_priv || buf->pending) {
1115				DRM_ERROR("bad buffer %p %p %d\n",
1116					  buf->file_priv, file_priv,
1117					  buf->pending);
1118				ret = -EINVAL;
1119				goto cleanup;
1120			}
1121
1122			emit_dispatch_age = 1;
1123			r300_discard_buffer(dev, file_priv->masterp, buf);
1124			break;
1125
1126		case R300_CMD_WAIT:
1127			DRM_DEBUG("R300_CMD_WAIT\n");
1128			r300_cmd_wait(dev_priv, *header);
1129			break;
1130
1131		case R300_CMD_SCRATCH:
1132			DRM_DEBUG("R300_CMD_SCRATCH\n");
1133			ret = r300_scratch(dev_priv, cmdbuf, *header);
1134			if (ret) {
1135				DRM_ERROR("r300_scratch failed\n");
1136				goto cleanup;
1137			}
1138			break;
1139
1140		case R300_CMD_R500FP:
1141			if ((dev_priv->flags & RADEON_FAMILY_MASK) < CHIP_RV515) {
1142				DRM_ERROR("Calling r500 command on r300 card\n");
1143				ret = -EINVAL;
1144				goto cleanup;
1145			}
1146			DRM_DEBUG("R300_CMD_R500FP\n");
1147			ret = r300_emit_r500fp(dev_priv, cmdbuf, *header);
1148			if (ret) {
1149				DRM_ERROR("r300_emit_r500fp failed\n");
1150				goto cleanup;
1151			}
1152			break;
1153		default:
1154			DRM_ERROR("bad cmd_type %i at byte %d\n",
1155				  header->header.cmd_type,
1156				  cmdbuf->buffer->iterator - (int)sizeof(*header));
1157			ret = -EINVAL;
1158			goto cleanup;
1159		}
1160	}
1161
1162	DRM_DEBUG("END\n");
1163
1164      cleanup:
1165	r300_pacify(dev_priv);
1166
1167	/* We emit the vertex buffer age here, outside the pacifier "brackets"
1168	 * for two reasons:
1169	 *  (1) This may coalesce multiple age emissions into a single one and
1170	 *  (2) more importantly, some chips lock up hard when scratch registers
1171	 *      are written inside the pacifier bracket.
1172	 */
1173	if (emit_dispatch_age) {
1174		RING_LOCALS;
1175
1176		/* Emit the vertex buffer age */
1177		BEGIN_RING(2);
1178		RADEON_DISPATCH_AGE(master_priv->sarea_priv->last_dispatch);
1179		ADVANCE_RING();
1180	}
1181
1182	COMMIT_RING();
1183
1184	return ret;
1185}
1186