Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/gpu/drm/radeon/r300_cmdbuf.c
15113 views
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 <[email protected]>
32
*/
33
34
#include "drmP.h"
35
#include "drm.h"
36
#include "drm_buffer.h"
37
#include "radeon_drm.h"
38
#include "radeon_drv.h"
39
#include "r300_reg.h"
40
41
#include <asm/unaligned.h>
42
43
#define R300_SIMULTANEOUS_CLIPRECTS 4
44
45
/* Values for R300_RE_CLIPRECT_CNTL depending on the number of cliprects
46
*/
47
static 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
*/
58
static 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
160
static u8 r300_reg_flags[0x10000 >> 2];
161
162
void 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
282
static __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
293
static __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
*/
348
static __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
*/
391
static __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
*/
438
static __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
465
static __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
532
static __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
577
static __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
651
static __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
*/
727
static __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
*/
794
static __inline__ 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
*/
850
static 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
860
static 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
901
static 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
*/
966
static 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
*/
1011
int 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->master->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->master, 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
1187