2 * Copyright 2008 Advanced Micro Devices, Inc.
3 * Copyright 2008 Red Hat Inc.
4 * Copyright 2009 Jerome Glisse.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
24 * Authors: Dave Airlie
28 #include <linux/seq_file.h>
31 #include "radeon_reg.h"
33 #include "radeon_drm.h"
34 #include "radeon_share.h"
36 #include "r300_reg_safe.h"
38 /* r300,r350,rv350,rv370,rv380 depends on : */
39 void r100_hdp_reset(struct radeon_device
*rdev
);
40 int r100_cp_reset(struct radeon_device
*rdev
);
41 int r100_rb2d_reset(struct radeon_device
*rdev
);
42 int r100_cp_init(struct radeon_device
*rdev
, unsigned ring_size
);
43 int r100_pci_gart_enable(struct radeon_device
*rdev
);
44 void r100_pci_gart_disable(struct radeon_device
*rdev
);
45 void r100_mc_setup(struct radeon_device
*rdev
);
46 void r100_mc_disable_clients(struct radeon_device
*rdev
);
47 int r100_gui_wait_for_idle(struct radeon_device
*rdev
);
48 int r100_cs_packet_parse(struct radeon_cs_parser
*p
,
49 struct radeon_cs_packet
*pkt
,
51 int r100_cs_packet_parse_vline(struct radeon_cs_parser
*p
);
52 int r100_cs_packet_next_reloc(struct radeon_cs_parser
*p
,
53 struct radeon_cs_reloc
**cs_reloc
);
54 int r100_cs_parse_packet0(struct radeon_cs_parser
*p
,
55 struct radeon_cs_packet
*pkt
,
56 const unsigned *auth
, unsigned n
,
57 radeon_packet0_check_t check
);
58 void r100_cs_dump_packet(struct radeon_cs_parser
*p
,
59 struct radeon_cs_packet
*pkt
);
60 int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser
*p
,
61 struct radeon_cs_packet
*pkt
,
62 struct radeon_object
*robj
);
64 /* This files gather functions specifics to:
65 * r300,r350,rv350,rv370,rv380
67 * Some of these functions might be used by newer ASICs.
69 void r300_gpu_init(struct radeon_device
*rdev
);
70 int r300_mc_wait_for_idle(struct radeon_device
*rdev
);
71 int rv370_debugfs_pcie_gart_info_init(struct radeon_device
*rdev
);
75 * rv370,rv380 PCIE GART
77 void rv370_pcie_gart_tlb_flush(struct radeon_device
*rdev
)
82 /* Workaround HW bug do flush 2 times */
83 for (i
= 0; i
< 2; i
++) {
84 tmp
= RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL
);
85 WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL
, tmp
| RADEON_PCIE_TX_GART_INVALIDATE_TLB
);
86 (void)RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL
);
87 WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL
, tmp
);
92 int rv370_pcie_gart_enable(struct radeon_device
*rdev
)
98 /* Initialize common gart structure */
99 r
= radeon_gart_init(rdev
);
103 r
= rv370_debugfs_pcie_gart_info_init(rdev
);
105 DRM_ERROR("Failed to register debugfs file for PCIE gart !\n");
107 rdev
->gart
.table_size
= rdev
->gart
.num_gpu_pages
* 4;
108 r
= radeon_gart_table_vram_alloc(rdev
);
112 /* discard memory request outside of configured range */
113 tmp
= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD
;
114 WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL
, tmp
);
115 WREG32_PCIE(RADEON_PCIE_TX_GART_START_LO
, rdev
->mc
.gtt_location
);
116 tmp
= rdev
->mc
.gtt_location
+ rdev
->mc
.gtt_size
- 4096;
117 WREG32_PCIE(RADEON_PCIE_TX_GART_END_LO
, tmp
);
118 WREG32_PCIE(RADEON_PCIE_TX_GART_START_HI
, 0);
119 WREG32_PCIE(RADEON_PCIE_TX_GART_END_HI
, 0);
120 table_addr
= rdev
->gart
.table_addr
;
121 WREG32_PCIE(RADEON_PCIE_TX_GART_BASE
, table_addr
);
122 /* FIXME: setup default page */
123 WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_LO
, rdev
->mc
.vram_location
);
124 WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_HI
, 0);
126 WREG32_PCIE(0x18, 0);
127 tmp
= RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL
);
128 tmp
|= RADEON_PCIE_TX_GART_EN
;
129 tmp
|= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD
;
130 WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL
, tmp
);
131 rv370_pcie_gart_tlb_flush(rdev
);
132 DRM_INFO("PCIE GART of %uM enabled (table at 0x%08X).\n",
133 rdev
->mc
.gtt_size
>> 20, table_addr
);
134 rdev
->gart
.ready
= true;
138 void rv370_pcie_gart_disable(struct radeon_device
*rdev
)
142 tmp
= RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL
);
143 tmp
|= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD
;
144 WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL
, tmp
& ~RADEON_PCIE_TX_GART_EN
);
145 if (rdev
->gart
.table
.vram
.robj
) {
146 radeon_object_kunmap(rdev
->gart
.table
.vram
.robj
);
147 radeon_object_unpin(rdev
->gart
.table
.vram
.robj
);
151 int rv370_pcie_gart_set_page(struct radeon_device
*rdev
, int i
, uint64_t addr
)
153 void __iomem
*ptr
= (void *)rdev
->gart
.table
.vram
.ptr
;
155 if (i
< 0 || i
> rdev
->gart
.num_gpu_pages
) {
158 addr
= (lower_32_bits(addr
) >> 8) |
159 ((upper_32_bits(addr
) & 0xff) << 24) |
161 /* on x86 we want this to be CPU endian, on powerpc
162 * on powerpc without HW swappers, it'll get swapped on way
163 * into VRAM - so no need for cpu_to_le32 on VRAM tables */
164 writel(addr
, ((void __iomem
*)ptr
) + (i
* 4));
168 int r300_gart_enable(struct radeon_device
*rdev
)
171 if (rdev
->flags
& RADEON_IS_AGP
) {
172 if (rdev
->family
> CHIP_RV350
) {
173 rv370_pcie_gart_disable(rdev
);
175 r100_pci_gart_disable(rdev
);
180 if (rdev
->flags
& RADEON_IS_PCIE
) {
181 rdev
->asic
->gart_disable
= &rv370_pcie_gart_disable
;
182 rdev
->asic
->gart_tlb_flush
= &rv370_pcie_gart_tlb_flush
;
183 rdev
->asic
->gart_set_page
= &rv370_pcie_gart_set_page
;
184 return rv370_pcie_gart_enable(rdev
);
186 return r100_pci_gart_enable(rdev
);
193 int r300_mc_init(struct radeon_device
*rdev
)
197 if (r100_debugfs_rbbm_init(rdev
)) {
198 DRM_ERROR("Failed to register debugfs file for RBBM !\n");
202 r100_pci_gart_disable(rdev
);
203 if (rdev
->flags
& RADEON_IS_PCIE
) {
204 rv370_pcie_gart_disable(rdev
);
207 /* Setup GPU memory space */
208 rdev
->mc
.vram_location
= 0xFFFFFFFFUL
;
209 rdev
->mc
.gtt_location
= 0xFFFFFFFFUL
;
210 if (rdev
->flags
& RADEON_IS_AGP
) {
211 r
= radeon_agp_init(rdev
);
213 printk(KERN_WARNING
"[drm] Disabling AGP\n");
214 rdev
->flags
&= ~RADEON_IS_AGP
;
215 rdev
->mc
.gtt_size
= radeon_gart_size
* 1024 * 1024;
217 rdev
->mc
.gtt_location
= rdev
->mc
.agp_base
;
220 r
= radeon_mc_setup(rdev
);
225 /* Program GPU memory space */
226 r100_mc_disable_clients(rdev
);
227 if (r300_mc_wait_for_idle(rdev
)) {
228 printk(KERN_WARNING
"Failed to wait MC idle while "
229 "programming pipes. Bad things might happen.\n");
235 void r300_mc_fini(struct radeon_device
*rdev
)
237 if (rdev
->flags
& RADEON_IS_PCIE
) {
238 rv370_pcie_gart_disable(rdev
);
239 radeon_gart_table_vram_free(rdev
);
241 r100_pci_gart_disable(rdev
);
242 radeon_gart_table_ram_free(rdev
);
244 radeon_gart_fini(rdev
);
251 void r300_fence_ring_emit(struct radeon_device
*rdev
,
252 struct radeon_fence
*fence
)
254 /* Who ever call radeon_fence_emit should call ring_lock and ask
255 * for enough space (today caller are ib schedule and buffer move) */
256 /* Write SC register so SC & US assert idle */
257 radeon_ring_write(rdev
, PACKET0(0x43E0, 0));
258 radeon_ring_write(rdev
, 0);
259 radeon_ring_write(rdev
, PACKET0(0x43E4, 0));
260 radeon_ring_write(rdev
, 0);
262 radeon_ring_write(rdev
, PACKET0(0x4E4C, 0));
263 radeon_ring_write(rdev
, (2 << 0));
264 radeon_ring_write(rdev
, PACKET0(0x4F18, 0));
265 radeon_ring_write(rdev
, (1 << 0));
266 /* Wait until IDLE & CLEAN */
267 radeon_ring_write(rdev
, PACKET0(0x1720, 0));
268 radeon_ring_write(rdev
, (1 << 17) | (1 << 16) | (1 << 9));
269 /* Emit fence sequence & fire IRQ */
270 radeon_ring_write(rdev
, PACKET0(rdev
->fence_drv
.scratch_reg
, 0));
271 radeon_ring_write(rdev
, fence
->seq
);
272 radeon_ring_write(rdev
, PACKET0(RADEON_GEN_INT_STATUS
, 0));
273 radeon_ring_write(rdev
, RADEON_SW_INT_FIRE
);
278 * Global GPU functions
280 int r300_copy_dma(struct radeon_device
*rdev
,
284 struct radeon_fence
*fence
)
291 /* radeon pitch is /64 */
292 size
= num_pages
<< PAGE_SHIFT
;
293 num_loops
= DIV_ROUND_UP(size
, 0x1FFFFF);
294 r
= radeon_ring_lock(rdev
, num_loops
* 4 + 64);
296 DRM_ERROR("radeon: moving bo (%d).\n", r
);
299 /* Must wait for 2D idle & clean before DMA or hangs might happen */
300 radeon_ring_write(rdev
, PACKET0(RADEON_WAIT_UNTIL
, 0 ));
301 radeon_ring_write(rdev
, (1 << 16));
302 for (i
= 0; i
< num_loops
; i
++) {
304 if (cur_size
> 0x1FFFFF) {
308 radeon_ring_write(rdev
, PACKET0(0x720, 2));
309 radeon_ring_write(rdev
, src_offset
);
310 radeon_ring_write(rdev
, dst_offset
);
311 radeon_ring_write(rdev
, cur_size
| (1 << 31) | (1 << 30));
312 src_offset
+= cur_size
;
313 dst_offset
+= cur_size
;
315 radeon_ring_write(rdev
, PACKET0(RADEON_WAIT_UNTIL
, 0));
316 radeon_ring_write(rdev
, RADEON_WAIT_DMA_GUI_IDLE
);
318 r
= radeon_fence_emit(rdev
, fence
);
320 radeon_ring_unlock_commit(rdev
);
324 void r300_ring_start(struct radeon_device
*rdev
)
326 unsigned gb_tile_config
;
329 /* Sub pixel 1/12 so we can have 4K rendering according to doc */
330 gb_tile_config
= (R300_ENABLE_TILING
| R300_TILE_SIZE_16
);
331 switch(rdev
->num_gb_pipes
) {
333 gb_tile_config
|= R300_PIPE_COUNT_R300
;
336 gb_tile_config
|= R300_PIPE_COUNT_R420_3P
;
339 gb_tile_config
|= R300_PIPE_COUNT_R420
;
343 gb_tile_config
|= R300_PIPE_COUNT_RV350
;
347 r
= radeon_ring_lock(rdev
, 64);
351 radeon_ring_write(rdev
, PACKET0(RADEON_ISYNC_CNTL
, 0));
352 radeon_ring_write(rdev
,
353 RADEON_ISYNC_ANY2D_IDLE3D
|
354 RADEON_ISYNC_ANY3D_IDLE2D
|
355 RADEON_ISYNC_WAIT_IDLEGUI
|
356 RADEON_ISYNC_CPSCRATCH_IDLEGUI
);
357 radeon_ring_write(rdev
, PACKET0(R300_GB_TILE_CONFIG
, 0));
358 radeon_ring_write(rdev
, gb_tile_config
);
359 radeon_ring_write(rdev
, PACKET0(RADEON_WAIT_UNTIL
, 0));
360 radeon_ring_write(rdev
,
361 RADEON_WAIT_2D_IDLECLEAN
|
362 RADEON_WAIT_3D_IDLECLEAN
);
363 radeon_ring_write(rdev
, PACKET0(0x170C, 0));
364 radeon_ring_write(rdev
, 1 << 31);
365 radeon_ring_write(rdev
, PACKET0(R300_GB_SELECT
, 0));
366 radeon_ring_write(rdev
, 0);
367 radeon_ring_write(rdev
, PACKET0(R300_GB_ENABLE
, 0));
368 radeon_ring_write(rdev
, 0);
369 radeon_ring_write(rdev
, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT
, 0));
370 radeon_ring_write(rdev
, R300_RB3D_DC_FLUSH
| R300_RB3D_DC_FREE
);
371 radeon_ring_write(rdev
, PACKET0(R300_RB3D_ZCACHE_CTLSTAT
, 0));
372 radeon_ring_write(rdev
, R300_ZC_FLUSH
| R300_ZC_FREE
);
373 radeon_ring_write(rdev
, PACKET0(RADEON_WAIT_UNTIL
, 0));
374 radeon_ring_write(rdev
,
375 RADEON_WAIT_2D_IDLECLEAN
|
376 RADEON_WAIT_3D_IDLECLEAN
);
377 radeon_ring_write(rdev
, PACKET0(R300_GB_AA_CONFIG
, 0));
378 radeon_ring_write(rdev
, 0);
379 radeon_ring_write(rdev
, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT
, 0));
380 radeon_ring_write(rdev
, R300_RB3D_DC_FLUSH
| R300_RB3D_DC_FREE
);
381 radeon_ring_write(rdev
, PACKET0(R300_RB3D_ZCACHE_CTLSTAT
, 0));
382 radeon_ring_write(rdev
, R300_ZC_FLUSH
| R300_ZC_FREE
);
383 radeon_ring_write(rdev
, PACKET0(R300_GB_MSPOS0
, 0));
384 radeon_ring_write(rdev
,
385 ((6 << R300_MS_X0_SHIFT
) |
386 (6 << R300_MS_Y0_SHIFT
) |
387 (6 << R300_MS_X1_SHIFT
) |
388 (6 << R300_MS_Y1_SHIFT
) |
389 (6 << R300_MS_X2_SHIFT
) |
390 (6 << R300_MS_Y2_SHIFT
) |
391 (6 << R300_MSBD0_Y_SHIFT
) |
392 (6 << R300_MSBD0_X_SHIFT
)));
393 radeon_ring_write(rdev
, PACKET0(R300_GB_MSPOS1
, 0));
394 radeon_ring_write(rdev
,
395 ((6 << R300_MS_X3_SHIFT
) |
396 (6 << R300_MS_Y3_SHIFT
) |
397 (6 << R300_MS_X4_SHIFT
) |
398 (6 << R300_MS_Y4_SHIFT
) |
399 (6 << R300_MS_X5_SHIFT
) |
400 (6 << R300_MS_Y5_SHIFT
) |
401 (6 << R300_MSBD1_SHIFT
)));
402 radeon_ring_write(rdev
, PACKET0(R300_GA_ENHANCE
, 0));
403 radeon_ring_write(rdev
, R300_GA_DEADLOCK_CNTL
| R300_GA_FASTSYNC_CNTL
);
404 radeon_ring_write(rdev
, PACKET0(R300_GA_POLY_MODE
, 0));
405 radeon_ring_write(rdev
,
406 R300_FRONT_PTYPE_TRIANGE
| R300_BACK_PTYPE_TRIANGE
);
407 radeon_ring_write(rdev
, PACKET0(R300_GA_ROUND_MODE
, 0));
408 radeon_ring_write(rdev
,
409 R300_GEOMETRY_ROUND_NEAREST
|
410 R300_COLOR_ROUND_NEAREST
);
411 radeon_ring_unlock_commit(rdev
);
414 void r300_errata(struct radeon_device
*rdev
)
416 rdev
->pll_errata
= 0;
418 if (rdev
->family
== CHIP_R300
&&
419 (RREG32(RADEON_CONFIG_CNTL
) & RADEON_CFG_ATI_REV_ID_MASK
) == RADEON_CFG_ATI_REV_A11
) {
420 rdev
->pll_errata
|= CHIP_ERRATA_R300_CG
;
424 int r300_mc_wait_for_idle(struct radeon_device
*rdev
)
429 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
431 tmp
= RREG32(0x0150);
432 if (tmp
& (1 << 4)) {
440 void r300_gpu_init(struct radeon_device
*rdev
)
442 uint32_t gb_tile_config
, tmp
;
444 r100_hdp_reset(rdev
);
445 /* FIXME: rv380 one pipes ? */
446 if ((rdev
->family
== CHIP_R300
) || (rdev
->family
== CHIP_R350
)) {
448 rdev
->num_gb_pipes
= 2;
450 /* rv350,rv370,rv380 */
451 rdev
->num_gb_pipes
= 1;
453 gb_tile_config
= (R300_ENABLE_TILING
| R300_TILE_SIZE_16
);
454 switch (rdev
->num_gb_pipes
) {
456 gb_tile_config
|= R300_PIPE_COUNT_R300
;
459 gb_tile_config
|= R300_PIPE_COUNT_R420_3P
;
462 gb_tile_config
|= R300_PIPE_COUNT_R420
;
466 gb_tile_config
|= R300_PIPE_COUNT_RV350
;
469 WREG32(R300_GB_TILE_CONFIG
, gb_tile_config
);
471 if (r100_gui_wait_for_idle(rdev
)) {
472 printk(KERN_WARNING
"Failed to wait GUI idle while "
473 "programming pipes. Bad things might happen.\n");
476 tmp
= RREG32(0x170C);
477 WREG32(0x170C, tmp
| (1 << 31));
479 WREG32(R300_RB2D_DSTCACHE_MODE
,
480 R300_DC_AUTOFLUSH_ENABLE
|
481 R300_DC_DC_DISABLE_IGNORE_PE
);
483 if (r100_gui_wait_for_idle(rdev
)) {
484 printk(KERN_WARNING
"Failed to wait GUI idle while "
485 "programming pipes. Bad things might happen.\n");
487 if (r300_mc_wait_for_idle(rdev
)) {
488 printk(KERN_WARNING
"Failed to wait MC idle while "
489 "programming pipes. Bad things might happen.\n");
491 DRM_INFO("radeon: %d pipes initialized.\n", rdev
->num_gb_pipes
);
494 int r300_ga_reset(struct radeon_device
*rdev
)
500 reinit_cp
= rdev
->cp
.ready
;
501 rdev
->cp
.ready
= false;
502 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
503 WREG32(RADEON_CP_CSQ_MODE
, 0);
504 WREG32(RADEON_CP_CSQ_CNTL
, 0);
505 WREG32(RADEON_RBBM_SOFT_RESET
, 0x32005);
506 (void)RREG32(RADEON_RBBM_SOFT_RESET
);
508 WREG32(RADEON_RBBM_SOFT_RESET
, 0);
509 /* Wait to prevent race in RBBM_STATUS */
511 tmp
= RREG32(RADEON_RBBM_STATUS
);
512 if (tmp
& ((1 << 20) | (1 << 26))) {
513 DRM_ERROR("VAP & CP still busy (RBBM_STATUS=0x%08X)", tmp
);
514 /* GA still busy soft reset it */
515 WREG32(0x429C, 0x200);
516 WREG32(R300_VAP_PVS_STATE_FLUSH_REG
, 0);
521 /* Wait to prevent race in RBBM_STATUS */
523 tmp
= RREG32(RADEON_RBBM_STATUS
);
524 if (!(tmp
& ((1 << 20) | (1 << 26)))) {
528 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
529 tmp
= RREG32(RADEON_RBBM_STATUS
);
530 if (!(tmp
& ((1 << 20) | (1 << 26)))) {
531 DRM_INFO("GA reset succeed (RBBM_STATUS=0x%08X)\n",
534 return r100_cp_init(rdev
, rdev
->cp
.ring_size
);
540 tmp
= RREG32(RADEON_RBBM_STATUS
);
541 DRM_ERROR("Failed to reset GA ! (RBBM_STATUS=0x%08X)\n", tmp
);
545 int r300_gpu_reset(struct radeon_device
*rdev
)
549 /* reset order likely matter */
550 status
= RREG32(RADEON_RBBM_STATUS
);
552 r100_hdp_reset(rdev
);
554 if (status
& ((1 << 17) | (1 << 18) | (1 << 27))) {
555 r100_rb2d_reset(rdev
);
558 if (status
& ((1 << 20) | (1 << 26))) {
562 status
= RREG32(RADEON_RBBM_STATUS
);
563 if (status
& (1 << 16)) {
566 /* Check if GPU is idle */
567 status
= RREG32(RADEON_RBBM_STATUS
);
568 if (status
& (1 << 31)) {
569 DRM_ERROR("Failed to reset GPU (RBBM_STATUS=0x%08X)\n", status
);
572 DRM_INFO("GPU reset succeed (RBBM_STATUS=0x%08X)\n", status
);
578 * r300,r350,rv350,rv380 VRAM info
580 void r300_vram_info(struct radeon_device
*rdev
)
584 /* DDR for all card after R300 & IGP */
585 rdev
->mc
.vram_is_ddr
= true;
586 tmp
= RREG32(RADEON_MEM_CNTL
);
587 if (tmp
& R300_MEM_NUM_CHANNELS_MASK
) {
588 rdev
->mc
.vram_width
= 128;
590 rdev
->mc
.vram_width
= 64;
593 r100_vram_init_sizes(rdev
);
601 void rv370_set_pcie_lanes(struct radeon_device
*rdev
, int lanes
)
603 uint32_t link_width_cntl
, mask
;
605 if (rdev
->flags
& RADEON_IS_IGP
)
608 if (!(rdev
->flags
& RADEON_IS_PCIE
))
611 /* FIXME wait for idle */
615 mask
= RADEON_PCIE_LC_LINK_WIDTH_X0
;
618 mask
= RADEON_PCIE_LC_LINK_WIDTH_X1
;
621 mask
= RADEON_PCIE_LC_LINK_WIDTH_X2
;
624 mask
= RADEON_PCIE_LC_LINK_WIDTH_X4
;
627 mask
= RADEON_PCIE_LC_LINK_WIDTH_X8
;
630 mask
= RADEON_PCIE_LC_LINK_WIDTH_X12
;
634 mask
= RADEON_PCIE_LC_LINK_WIDTH_X16
;
638 link_width_cntl
= RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL
);
640 if ((link_width_cntl
& RADEON_PCIE_LC_LINK_WIDTH_RD_MASK
) ==
641 (mask
<< RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT
))
644 link_width_cntl
&= ~(RADEON_PCIE_LC_LINK_WIDTH_MASK
|
645 RADEON_PCIE_LC_RECONFIG_NOW
|
646 RADEON_PCIE_LC_RECONFIG_LATER
|
647 RADEON_PCIE_LC_SHORT_RECONFIG_EN
);
648 link_width_cntl
|= mask
;
649 WREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL
, link_width_cntl
);
650 WREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL
, (link_width_cntl
|
651 RADEON_PCIE_LC_RECONFIG_NOW
));
653 /* wait for lane set to complete */
654 link_width_cntl
= RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL
);
655 while (link_width_cntl
== 0xffffffff)
656 link_width_cntl
= RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL
);
664 #if defined(CONFIG_DEBUG_FS)
665 static int rv370_debugfs_pcie_gart_info(struct seq_file
*m
, void *data
)
667 struct drm_info_node
*node
= (struct drm_info_node
*) m
->private;
668 struct drm_device
*dev
= node
->minor
->dev
;
669 struct radeon_device
*rdev
= dev
->dev_private
;
672 tmp
= RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL
);
673 seq_printf(m
, "PCIE_TX_GART_CNTL 0x%08x\n", tmp
);
674 tmp
= RREG32_PCIE(RADEON_PCIE_TX_GART_BASE
);
675 seq_printf(m
, "PCIE_TX_GART_BASE 0x%08x\n", tmp
);
676 tmp
= RREG32_PCIE(RADEON_PCIE_TX_GART_START_LO
);
677 seq_printf(m
, "PCIE_TX_GART_START_LO 0x%08x\n", tmp
);
678 tmp
= RREG32_PCIE(RADEON_PCIE_TX_GART_START_HI
);
679 seq_printf(m
, "PCIE_TX_GART_START_HI 0x%08x\n", tmp
);
680 tmp
= RREG32_PCIE(RADEON_PCIE_TX_GART_END_LO
);
681 seq_printf(m
, "PCIE_TX_GART_END_LO 0x%08x\n", tmp
);
682 tmp
= RREG32_PCIE(RADEON_PCIE_TX_GART_END_HI
);
683 seq_printf(m
, "PCIE_TX_GART_END_HI 0x%08x\n", tmp
);
684 tmp
= RREG32_PCIE(RADEON_PCIE_TX_GART_ERROR
);
685 seq_printf(m
, "PCIE_TX_GART_ERROR 0x%08x\n", tmp
);
689 static struct drm_info_list rv370_pcie_gart_info_list
[] = {
690 {"rv370_pcie_gart_info", rv370_debugfs_pcie_gart_info
, 0, NULL
},
694 int rv370_debugfs_pcie_gart_info_init(struct radeon_device
*rdev
)
696 #if defined(CONFIG_DEBUG_FS)
697 return radeon_debugfs_add_files(rdev
, rv370_pcie_gart_info_list
, 1);
707 struct r300_cs_track_cb
{
708 struct radeon_object
*robj
;
714 struct r300_cs_track_array
{
715 struct radeon_object
*robj
;
719 struct r300_cs_track_texture
{
720 struct radeon_object
*robj
;
726 unsigned tex_coord_type
;
736 struct r300_cs_track
{
740 unsigned vap_vf_cntl
;
741 unsigned immd_dwords
;
744 struct r300_cs_track_array arrays
[11];
745 struct r300_cs_track_cb cb
[4];
746 struct r300_cs_track_cb zb
;
747 struct r300_cs_track_texture textures
[16];
751 static inline void r300_cs_track_texture_print(struct r300_cs_track_texture
*t
)
753 DRM_ERROR("pitch %d\n", t
->pitch
);
754 DRM_ERROR("width %d\n", t
->width
);
755 DRM_ERROR("height %d\n", t
->height
);
756 DRM_ERROR("num levels %d\n", t
->num_levels
);
757 DRM_ERROR("depth %d\n", t
->txdepth
);
758 DRM_ERROR("bpp %d\n", t
->cpp
);
759 DRM_ERROR("coordinate type %d\n", t
->tex_coord_type
);
760 DRM_ERROR("width round to power of 2 %d\n", t
->roundup_w
);
761 DRM_ERROR("height round to power of 2 %d\n", t
->roundup_h
);
764 static inline int r300_cs_track_texture_check(struct radeon_device
*rdev
,
765 struct r300_cs_track
*track
)
767 struct radeon_object
*robj
;
771 for (u
= 0; u
< 16; u
++) {
772 if (!track
->textures
[u
].enabled
)
774 robj
= track
->textures
[u
].robj
;
776 DRM_ERROR("No texture bound to unit %u\n", u
);
780 for (i
= 0; i
<= track
->textures
[u
].num_levels
; i
++) {
781 if (track
->textures
[u
].use_pitch
) {
782 w
= track
->textures
[u
].pitch
/ (1 << i
);
784 w
= track
->textures
[u
].width
/ (1 << i
);
785 if (rdev
->family
>= CHIP_RV515
)
786 w
|= track
->textures
[u
].width_11
;
787 if (track
->textures
[u
].roundup_w
)
788 w
= roundup_pow_of_two(w
);
790 h
= track
->textures
[u
].height
/ (1 << i
);
791 if (rdev
->family
>= CHIP_RV515
)
792 h
|= track
->textures
[u
].height_11
;
793 if (track
->textures
[u
].roundup_h
)
794 h
= roundup_pow_of_two(h
);
797 size
*= track
->textures
[u
].cpp
;
798 switch (track
->textures
[u
].tex_coord_type
) {
802 size
*= (1 << track
->textures
[u
].txdepth
);
808 DRM_ERROR("Invalid texture coordinate type %u for unit "
809 "%u\n", track
->textures
[u
].tex_coord_type
, u
);
812 if (size
> radeon_object_size(robj
)) {
813 DRM_ERROR("Texture of unit %u needs %lu bytes but is "
814 "%lu\n", u
, size
, radeon_object_size(robj
));
815 r300_cs_track_texture_print(&track
->textures
[u
]);
822 int r300_cs_track_check(struct radeon_device
*rdev
, struct r300_cs_track
*track
)
829 for (i
= 0; i
< track
->num_cb
; i
++) {
830 if (track
->cb
[i
].robj
== NULL
) {
831 DRM_ERROR("[drm] No buffer for color buffer %d !\n", i
);
834 size
= track
->cb
[i
].pitch
* track
->cb
[i
].cpp
* track
->maxy
;
835 size
+= track
->cb
[i
].offset
;
836 if (size
> radeon_object_size(track
->cb
[i
].robj
)) {
837 DRM_ERROR("[drm] Buffer too small for color buffer %d "
838 "(need %lu have %lu) !\n", i
, size
,
839 radeon_object_size(track
->cb
[i
].robj
));
840 DRM_ERROR("[drm] color buffer %d (%u %u %u %u)\n",
841 i
, track
->cb
[i
].pitch
, track
->cb
[i
].cpp
,
842 track
->cb
[i
].offset
, track
->maxy
);
846 if (track
->z_enabled
) {
847 if (track
->zb
.robj
== NULL
) {
848 DRM_ERROR("[drm] No buffer for z buffer !\n");
851 size
= track
->zb
.pitch
* track
->zb
.cpp
* track
->maxy
;
852 size
+= track
->zb
.offset
;
853 if (size
> radeon_object_size(track
->zb
.robj
)) {
854 DRM_ERROR("[drm] Buffer too small for z buffer "
855 "(need %lu have %lu) !\n", size
,
856 radeon_object_size(track
->zb
.robj
));
860 prim_walk
= (track
->vap_vf_cntl
>> 4) & 0x3;
861 nverts
= (track
->vap_vf_cntl
>> 16) & 0xFFFF;
864 for (i
= 0; i
< track
->num_arrays
; i
++) {
865 size
= track
->arrays
[i
].esize
* track
->max_indx
* 4;
866 if (track
->arrays
[i
].robj
== NULL
) {
867 DRM_ERROR("(PW %u) Vertex array %u no buffer "
868 "bound\n", prim_walk
, i
);
871 if (size
> radeon_object_size(track
->arrays
[i
].robj
)) {
872 DRM_ERROR("(PW %u) Vertex array %u need %lu dwords "
873 "have %lu dwords\n", prim_walk
, i
,
875 radeon_object_size(track
->arrays
[i
].robj
) >> 2);
876 DRM_ERROR("Max indices %u\n", track
->max_indx
);
882 for (i
= 0; i
< track
->num_arrays
; i
++) {
883 size
= track
->arrays
[i
].esize
* (nverts
- 1) * 4;
884 if (track
->arrays
[i
].robj
== NULL
) {
885 DRM_ERROR("(PW %u) Vertex array %u no buffer "
886 "bound\n", prim_walk
, i
);
889 if (size
> radeon_object_size(track
->arrays
[i
].robj
)) {
890 DRM_ERROR("(PW %u) Vertex array %u need %lu dwords "
891 "have %lu dwords\n", prim_walk
, i
, size
>> 2,
892 radeon_object_size(track
->arrays
[i
].robj
) >> 2);
898 size
= track
->vtx_size
* nverts
;
899 if (size
!= track
->immd_dwords
) {
900 DRM_ERROR("IMMD draw %u dwors but needs %lu dwords\n",
901 track
->immd_dwords
, size
);
902 DRM_ERROR("VAP_VF_CNTL.NUM_VERTICES %u, VTX_SIZE %u\n",
903 nverts
, track
->vtx_size
);
908 DRM_ERROR("[drm] Invalid primitive walk %d for VAP_VF_CNTL\n",
912 return r300_cs_track_texture_check(rdev
, track
);
915 static inline void r300_cs_track_clear(struct r300_cs_track
*track
)
921 for (i
= 0; i
< track
->num_cb
; i
++) {
922 track
->cb
[i
].robj
= NULL
;
923 track
->cb
[i
].pitch
= 8192;
924 track
->cb
[i
].cpp
= 16;
925 track
->cb
[i
].offset
= 0;
927 track
->z_enabled
= true;
928 track
->zb
.robj
= NULL
;
929 track
->zb
.pitch
= 8192;
931 track
->zb
.offset
= 0;
932 track
->vtx_size
= 0x7F;
933 track
->immd_dwords
= 0xFFFFFFFFUL
;
934 track
->num_arrays
= 11;
935 track
->max_indx
= 0x00FFFFFFUL
;
936 for (i
= 0; i
< track
->num_arrays
; i
++) {
937 track
->arrays
[i
].robj
= NULL
;
938 track
->arrays
[i
].esize
= 0x7F;
940 for (i
= 0; i
< 16; i
++) {
941 track
->textures
[i
].pitch
= 16536;
942 track
->textures
[i
].width
= 16536;
943 track
->textures
[i
].height
= 16536;
944 track
->textures
[i
].width_11
= 1 << 11;
945 track
->textures
[i
].height_11
= 1 << 11;
946 track
->textures
[i
].num_levels
= 12;
947 track
->textures
[i
].txdepth
= 16;
948 track
->textures
[i
].cpp
= 64;
949 track
->textures
[i
].tex_coord_type
= 1;
950 track
->textures
[i
].robj
= NULL
;
951 /* CS IB emission code makes sure texture unit are disabled */
952 track
->textures
[i
].enabled
= false;
953 track
->textures
[i
].roundup_w
= true;
954 track
->textures
[i
].roundup_h
= true;
958 static int r300_packet0_check(struct radeon_cs_parser
*p
,
959 struct radeon_cs_packet
*pkt
,
960 unsigned idx
, unsigned reg
)
962 struct radeon_cs_chunk
*ib_chunk
;
963 struct radeon_cs_reloc
*reloc
;
964 struct r300_cs_track
*track
;
965 volatile uint32_t *ib
;
966 uint32_t tmp
, tile_flags
= 0;
971 ib_chunk
= &p
->chunks
[p
->chunk_ib_idx
];
972 track
= (struct r300_cs_track
*)p
->track
;
974 case AVIVO_D1MODE_VLINE_START_END
:
975 case RADEON_CRTC_GUI_TRIG_VLINE
:
976 r
= r100_cs_packet_parse_vline(p
);
978 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
980 r100_cs_dump_packet(p
, pkt
);
984 case RADEON_DST_PITCH_OFFSET
:
985 case RADEON_SRC_PITCH_OFFSET
:
986 r
= r100_cs_packet_next_reloc(p
, &reloc
);
988 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
990 r100_cs_dump_packet(p
, pkt
);
993 tmp
= ib_chunk
->kdata
[idx
] & 0x003fffff;
994 tmp
+= (((u32
)reloc
->lobj
.gpu_offset
) >> 10);
996 if (reloc
->lobj
.tiling_flags
& RADEON_TILING_MACRO
)
997 tile_flags
|= RADEON_DST_TILE_MACRO
;
998 if (reloc
->lobj
.tiling_flags
& RADEON_TILING_MICRO
) {
999 if (reg
== RADEON_SRC_PITCH_OFFSET
) {
1000 DRM_ERROR("Cannot src blit from microtiled surface\n");
1001 r100_cs_dump_packet(p
, pkt
);
1004 tile_flags
|= RADEON_DST_TILE_MICRO
;
1007 ib
[idx
] = (ib_chunk
->kdata
[idx
] & 0x3fc00000) | tmp
;
1009 case R300_RB3D_COLOROFFSET0
:
1010 case R300_RB3D_COLOROFFSET1
:
1011 case R300_RB3D_COLOROFFSET2
:
1012 case R300_RB3D_COLOROFFSET3
:
1013 i
= (reg
- R300_RB3D_COLOROFFSET0
) >> 2;
1014 r
= r100_cs_packet_next_reloc(p
, &reloc
);
1016 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1018 r100_cs_dump_packet(p
, pkt
);
1021 track
->cb
[i
].robj
= reloc
->robj
;
1022 track
->cb
[i
].offset
= ib_chunk
->kdata
[idx
];
1023 ib
[idx
] = ib_chunk
->kdata
[idx
] + ((u32
)reloc
->lobj
.gpu_offset
);
1025 case R300_ZB_DEPTHOFFSET
:
1026 r
= r100_cs_packet_next_reloc(p
, &reloc
);
1028 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1030 r100_cs_dump_packet(p
, pkt
);
1033 track
->zb
.robj
= reloc
->robj
;
1034 track
->zb
.offset
= ib_chunk
->kdata
[idx
];
1035 ib
[idx
] = ib_chunk
->kdata
[idx
] + ((u32
)reloc
->lobj
.gpu_offset
);
1037 case R300_TX_OFFSET_0
:
1038 case R300_TX_OFFSET_0
+4:
1039 case R300_TX_OFFSET_0
+8:
1040 case R300_TX_OFFSET_0
+12:
1041 case R300_TX_OFFSET_0
+16:
1042 case R300_TX_OFFSET_0
+20:
1043 case R300_TX_OFFSET_0
+24:
1044 case R300_TX_OFFSET_0
+28:
1045 case R300_TX_OFFSET_0
+32:
1046 case R300_TX_OFFSET_0
+36:
1047 case R300_TX_OFFSET_0
+40:
1048 case R300_TX_OFFSET_0
+44:
1049 case R300_TX_OFFSET_0
+48:
1050 case R300_TX_OFFSET_0
+52:
1051 case R300_TX_OFFSET_0
+56:
1052 case R300_TX_OFFSET_0
+60:
1053 i
= (reg
- R300_TX_OFFSET_0
) >> 2;
1054 r
= r100_cs_packet_next_reloc(p
, &reloc
);
1056 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1058 r100_cs_dump_packet(p
, pkt
);
1061 ib
[idx
] = ib_chunk
->kdata
[idx
] + ((u32
)reloc
->lobj
.gpu_offset
);
1062 track
->textures
[i
].robj
= reloc
->robj
;
1064 /* Tracked registers */
1067 track
->vap_vf_cntl
= ib_chunk
->kdata
[idx
];
1071 track
->vtx_size
= ib_chunk
->kdata
[idx
] & 0x7F;
1074 /* VAP_VF_MAX_VTX_INDX */
1075 track
->max_indx
= ib_chunk
->kdata
[idx
] & 0x00FFFFFFUL
;
1079 track
->maxy
= ((ib_chunk
->kdata
[idx
] >> 13) & 0x1FFF) + 1;
1080 if (p
->rdev
->family
< CHIP_RV515
) {
1081 track
->maxy
-= 1440;
1086 track
->num_cb
= ((ib_chunk
->kdata
[idx
] >> 5) & 0x3) + 1;
1092 /* RB3D_COLORPITCH0 */
1093 /* RB3D_COLORPITCH1 */
1094 /* RB3D_COLORPITCH2 */
1095 /* RB3D_COLORPITCH3 */
1096 r
= r100_cs_packet_next_reloc(p
, &reloc
);
1098 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1100 r100_cs_dump_packet(p
, pkt
);
1104 if (reloc
->lobj
.tiling_flags
& RADEON_TILING_MACRO
)
1105 tile_flags
|= R300_COLOR_TILE_ENABLE
;
1106 if (reloc
->lobj
.tiling_flags
& RADEON_TILING_MICRO
)
1107 tile_flags
|= R300_COLOR_MICROTILE_ENABLE
;
1109 tmp
= ib_chunk
->kdata
[idx
] & ~(0x7 << 16);
1113 i
= (reg
- 0x4E38) >> 2;
1114 track
->cb
[i
].pitch
= ib_chunk
->kdata
[idx
] & 0x3FFE;
1115 switch (((ib_chunk
->kdata
[idx
] >> 21) & 0xF)) {
1119 track
->cb
[i
].cpp
= 1;
1125 track
->cb
[i
].cpp
= 2;
1128 track
->cb
[i
].cpp
= 4;
1131 track
->cb
[i
].cpp
= 8;
1134 track
->cb
[i
].cpp
= 16;
1137 DRM_ERROR("Invalid color buffer format (%d) !\n",
1138 ((ib_chunk
->kdata
[idx
] >> 21) & 0xF));
1144 if (ib_chunk
->kdata
[idx
] & 2) {
1145 track
->z_enabled
= true;
1147 track
->z_enabled
= false;
1152 switch ((ib_chunk
->kdata
[idx
] & 0xF)) {
1161 DRM_ERROR("Invalid z buffer format (%d) !\n",
1162 (ib_chunk
->kdata
[idx
] & 0xF));
1168 r
= r100_cs_packet_next_reloc(p
, &reloc
);
1170 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1172 r100_cs_dump_packet(p
, pkt
);
1176 if (reloc
->lobj
.tiling_flags
& RADEON_TILING_MACRO
)
1177 tile_flags
|= R300_DEPTHMACROTILE_ENABLE
;
1178 if (reloc
->lobj
.tiling_flags
& RADEON_TILING_MICRO
)
1179 tile_flags
|= R300_DEPTHMICROTILE_TILED
;;
1181 tmp
= ib_chunk
->kdata
[idx
] & ~(0x7 << 16);
1185 track
->zb
.pitch
= ib_chunk
->kdata
[idx
] & 0x3FFC;
1188 for (i
= 0; i
< 16; i
++) {
1191 enabled
= !!(ib_chunk
->kdata
[idx
] & (1 << i
));
1192 track
->textures
[i
].enabled
= enabled
;
1211 /* TX_FORMAT1_[0-15] */
1212 i
= (reg
- 0x44C0) >> 2;
1213 tmp
= (ib_chunk
->kdata
[idx
] >> 25) & 0x3;
1214 track
->textures
[i
].tex_coord_type
= tmp
;
1215 switch ((ib_chunk
->kdata
[idx
] & 0x1F)) {
1222 track
->textures
[i
].cpp
= 1;
1233 track
->textures
[i
].cpp
= 2;
1244 track
->textures
[i
].cpp
= 4;
1249 track
->textures
[i
].cpp
= 8;
1252 track
->textures
[i
].cpp
= 16;
1255 DRM_ERROR("Invalid texture format %u\n",
1256 (ib_chunk
->kdata
[idx
] & 0x1F));
1277 /* TX_FILTER0_[0-15] */
1278 i
= (reg
- 0x4400) >> 2;
1279 tmp
= ib_chunk
->kdata
[idx
] & 0x7;;
1280 if (tmp
== 2 || tmp
== 4 || tmp
== 6) {
1281 track
->textures
[i
].roundup_w
= false;
1283 tmp
= (ib_chunk
->kdata
[idx
] >> 3) & 0x7;;
1284 if (tmp
== 2 || tmp
== 4 || tmp
== 6) {
1285 track
->textures
[i
].roundup_h
= false;
1304 /* TX_FORMAT2_[0-15] */
1305 i
= (reg
- 0x4500) >> 2;
1306 tmp
= ib_chunk
->kdata
[idx
] & 0x3FFF;
1307 track
->textures
[i
].pitch
= tmp
+ 1;
1308 if (p
->rdev
->family
>= CHIP_RV515
) {
1309 tmp
= ((ib_chunk
->kdata
[idx
] >> 15) & 1) << 11;
1310 track
->textures
[i
].width_11
= tmp
;
1311 tmp
= ((ib_chunk
->kdata
[idx
] >> 16) & 1) << 11;
1312 track
->textures
[i
].height_11
= tmp
;
1331 /* TX_FORMAT0_[0-15] */
1332 i
= (reg
- 0x4480) >> 2;
1333 tmp
= ib_chunk
->kdata
[idx
] & 0x7FF;
1334 track
->textures
[i
].width
= tmp
+ 1;
1335 tmp
= (ib_chunk
->kdata
[idx
] >> 11) & 0x7FF;
1336 track
->textures
[i
].height
= tmp
+ 1;
1337 tmp
= (ib_chunk
->kdata
[idx
] >> 26) & 0xF;
1338 track
->textures
[i
].num_levels
= tmp
;
1339 tmp
= ib_chunk
->kdata
[idx
] & (1 << 31);
1340 track
->textures
[i
].use_pitch
= !!tmp
;
1341 tmp
= (ib_chunk
->kdata
[idx
] >> 22) & 0xF;
1342 track
->textures
[i
].txdepth
= tmp
;
1344 case R300_ZB_ZPASS_ADDR
:
1345 r
= r100_cs_packet_next_reloc(p
, &reloc
);
1347 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1349 r100_cs_dump_packet(p
, pkt
);
1352 ib
[idx
] = ib_chunk
->kdata
[idx
] + ((u32
)reloc
->lobj
.gpu_offset
);
1355 /* valid register only on RV530 */
1356 if (p
->rdev
->family
== CHIP_RV530
)
1358 /* fallthrough do not move */
1360 printk(KERN_ERR
"Forbidden register 0x%04X in cs at %d\n",
1367 static int r300_packet3_check(struct radeon_cs_parser
*p
,
1368 struct radeon_cs_packet
*pkt
)
1370 struct radeon_cs_chunk
*ib_chunk
;
1371 struct radeon_cs_reloc
*reloc
;
1372 struct r300_cs_track
*track
;
1373 volatile uint32_t *ib
;
1379 ib_chunk
= &p
->chunks
[p
->chunk_ib_idx
];
1381 track
= (struct r300_cs_track
*)p
->track
;
1382 switch(pkt
->opcode
) {
1383 case PACKET3_3D_LOAD_VBPNTR
:
1384 c
= ib_chunk
->kdata
[idx
++] & 0x1F;
1385 track
->num_arrays
= c
;
1386 for (i
= 0; i
< (c
- 1); i
+=2, idx
+=3) {
1387 r
= r100_cs_packet_next_reloc(p
, &reloc
);
1389 DRM_ERROR("No reloc for packet3 %d\n",
1391 r100_cs_dump_packet(p
, pkt
);
1394 ib
[idx
+1] = ib_chunk
->kdata
[idx
+1] + ((u32
)reloc
->lobj
.gpu_offset
);
1395 track
->arrays
[i
+ 0].robj
= reloc
->robj
;
1396 track
->arrays
[i
+ 0].esize
= ib_chunk
->kdata
[idx
] >> 8;
1397 track
->arrays
[i
+ 0].esize
&= 0x7F;
1398 r
= r100_cs_packet_next_reloc(p
, &reloc
);
1400 DRM_ERROR("No reloc for packet3 %d\n",
1402 r100_cs_dump_packet(p
, pkt
);
1405 ib
[idx
+2] = ib_chunk
->kdata
[idx
+2] + ((u32
)reloc
->lobj
.gpu_offset
);
1406 track
->arrays
[i
+ 1].robj
= reloc
->robj
;
1407 track
->arrays
[i
+ 1].esize
= ib_chunk
->kdata
[idx
] >> 24;
1408 track
->arrays
[i
+ 1].esize
&= 0x7F;
1411 r
= r100_cs_packet_next_reloc(p
, &reloc
);
1413 DRM_ERROR("No reloc for packet3 %d\n",
1415 r100_cs_dump_packet(p
, pkt
);
1418 ib
[idx
+1] = ib_chunk
->kdata
[idx
+1] + ((u32
)reloc
->lobj
.gpu_offset
);
1419 track
->arrays
[i
+ 0].robj
= reloc
->robj
;
1420 track
->arrays
[i
+ 0].esize
= ib_chunk
->kdata
[idx
] >> 8;
1421 track
->arrays
[i
+ 0].esize
&= 0x7F;
1424 case PACKET3_INDX_BUFFER
:
1425 r
= r100_cs_packet_next_reloc(p
, &reloc
);
1427 DRM_ERROR("No reloc for packet3 %d\n", pkt
->opcode
);
1428 r100_cs_dump_packet(p
, pkt
);
1431 ib
[idx
+1] = ib_chunk
->kdata
[idx
+1] + ((u32
)reloc
->lobj
.gpu_offset
);
1432 r
= r100_cs_track_check_pkt3_indx_buffer(p
, pkt
, reloc
->robj
);
1438 case PACKET3_3D_DRAW_IMMD
:
1439 /* Number of dwords is vtx_size * (num_vertices - 1)
1440 * PRIM_WALK must be equal to 3 vertex data in embedded
1442 if (((ib_chunk
->kdata
[idx
+1] >> 4) & 0x3) != 3) {
1443 DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n");
1446 track
->vap_vf_cntl
= ib_chunk
->kdata
[idx
+1];
1447 track
->immd_dwords
= pkt
->count
- 1;
1448 r
= r300_cs_track_check(p
->rdev
, track
);
1453 case PACKET3_3D_DRAW_IMMD_2
:
1454 /* Number of dwords is vtx_size * (num_vertices - 1)
1455 * PRIM_WALK must be equal to 3 vertex data in embedded
1457 if (((ib_chunk
->kdata
[idx
] >> 4) & 0x3) != 3) {
1458 DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n");
1461 track
->vap_vf_cntl
= ib_chunk
->kdata
[idx
];
1462 track
->immd_dwords
= pkt
->count
;
1463 r
= r300_cs_track_check(p
->rdev
, track
);
1468 case PACKET3_3D_DRAW_VBUF
:
1469 track
->vap_vf_cntl
= ib_chunk
->kdata
[idx
+ 1];
1470 r
= r300_cs_track_check(p
->rdev
, track
);
1475 case PACKET3_3D_DRAW_VBUF_2
:
1476 track
->vap_vf_cntl
= ib_chunk
->kdata
[idx
];
1477 r
= r300_cs_track_check(p
->rdev
, track
);
1482 case PACKET3_3D_DRAW_INDX
:
1483 track
->vap_vf_cntl
= ib_chunk
->kdata
[idx
+ 1];
1484 r
= r300_cs_track_check(p
->rdev
, track
);
1489 case PACKET3_3D_DRAW_INDX_2
:
1490 track
->vap_vf_cntl
= ib_chunk
->kdata
[idx
];
1491 r
= r300_cs_track_check(p
->rdev
, track
);
1499 DRM_ERROR("Packet3 opcode %x not supported\n", pkt
->opcode
);
1505 int r300_cs_parse(struct radeon_cs_parser
*p
)
1507 struct radeon_cs_packet pkt
;
1508 struct r300_cs_track track
;
1511 r300_cs_track_clear(&track
);
1514 r
= r100_cs_packet_parse(p
, &pkt
, p
->idx
);
1518 p
->idx
+= pkt
.count
+ 2;
1521 r
= r100_cs_parse_packet0(p
, &pkt
,
1522 p
->rdev
->config
.r300
.reg_safe_bm
,
1523 p
->rdev
->config
.r300
.reg_safe_bm_size
,
1524 &r300_packet0_check
);
1529 r
= r300_packet3_check(p
, &pkt
);
1532 DRM_ERROR("Unknown packet type %d !\n", pkt
.type
);
1538 } while (p
->idx
< p
->chunks
[p
->chunk_ib_idx
].length_dw
);
1542 int r300_init(struct radeon_device
*rdev
)
1544 rdev
->config
.r300
.reg_safe_bm
= r300_reg_safe_bm
;
1545 rdev
->config
.r300
.reg_safe_bm_size
= ARRAY_SIZE(r300_reg_safe_bm
);