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 rdev
->num_z_pipes
= 1;
454 gb_tile_config
= (R300_ENABLE_TILING
| R300_TILE_SIZE_16
);
455 switch (rdev
->num_gb_pipes
) {
457 gb_tile_config
|= R300_PIPE_COUNT_R300
;
460 gb_tile_config
|= R300_PIPE_COUNT_R420_3P
;
463 gb_tile_config
|= R300_PIPE_COUNT_R420
;
467 gb_tile_config
|= R300_PIPE_COUNT_RV350
;
470 WREG32(R300_GB_TILE_CONFIG
, gb_tile_config
);
472 if (r100_gui_wait_for_idle(rdev
)) {
473 printk(KERN_WARNING
"Failed to wait GUI idle while "
474 "programming pipes. Bad things might happen.\n");
477 tmp
= RREG32(0x170C);
478 WREG32(0x170C, tmp
| (1 << 31));
480 WREG32(R300_RB2D_DSTCACHE_MODE
,
481 R300_DC_AUTOFLUSH_ENABLE
|
482 R300_DC_DC_DISABLE_IGNORE_PE
);
484 if (r100_gui_wait_for_idle(rdev
)) {
485 printk(KERN_WARNING
"Failed to wait GUI idle while "
486 "programming pipes. Bad things might happen.\n");
488 if (r300_mc_wait_for_idle(rdev
)) {
489 printk(KERN_WARNING
"Failed to wait MC idle while "
490 "programming pipes. Bad things might happen.\n");
492 DRM_INFO("radeon: %d quad pipes, %d Z pipes initialized.\n",
493 rdev
->num_gb_pipes
, rdev
->num_z_pipes
);
496 int r300_ga_reset(struct radeon_device
*rdev
)
502 reinit_cp
= rdev
->cp
.ready
;
503 rdev
->cp
.ready
= false;
504 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
505 WREG32(RADEON_CP_CSQ_MODE
, 0);
506 WREG32(RADEON_CP_CSQ_CNTL
, 0);
507 WREG32(RADEON_RBBM_SOFT_RESET
, 0x32005);
508 (void)RREG32(RADEON_RBBM_SOFT_RESET
);
510 WREG32(RADEON_RBBM_SOFT_RESET
, 0);
511 /* Wait to prevent race in RBBM_STATUS */
513 tmp
= RREG32(RADEON_RBBM_STATUS
);
514 if (tmp
& ((1 << 20) | (1 << 26))) {
515 DRM_ERROR("VAP & CP still busy (RBBM_STATUS=0x%08X)", tmp
);
516 /* GA still busy soft reset it */
517 WREG32(0x429C, 0x200);
518 WREG32(R300_VAP_PVS_STATE_FLUSH_REG
, 0);
523 /* Wait to prevent race in RBBM_STATUS */
525 tmp
= RREG32(RADEON_RBBM_STATUS
);
526 if (!(tmp
& ((1 << 20) | (1 << 26)))) {
530 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
531 tmp
= RREG32(RADEON_RBBM_STATUS
);
532 if (!(tmp
& ((1 << 20) | (1 << 26)))) {
533 DRM_INFO("GA reset succeed (RBBM_STATUS=0x%08X)\n",
536 return r100_cp_init(rdev
, rdev
->cp
.ring_size
);
542 tmp
= RREG32(RADEON_RBBM_STATUS
);
543 DRM_ERROR("Failed to reset GA ! (RBBM_STATUS=0x%08X)\n", tmp
);
547 int r300_gpu_reset(struct radeon_device
*rdev
)
551 /* reset order likely matter */
552 status
= RREG32(RADEON_RBBM_STATUS
);
554 r100_hdp_reset(rdev
);
556 if (status
& ((1 << 17) | (1 << 18) | (1 << 27))) {
557 r100_rb2d_reset(rdev
);
560 if (status
& ((1 << 20) | (1 << 26))) {
564 status
= RREG32(RADEON_RBBM_STATUS
);
565 if (status
& (1 << 16)) {
568 /* Check if GPU is idle */
569 status
= RREG32(RADEON_RBBM_STATUS
);
570 if (status
& (1 << 31)) {
571 DRM_ERROR("Failed to reset GPU (RBBM_STATUS=0x%08X)\n", status
);
574 DRM_INFO("GPU reset succeed (RBBM_STATUS=0x%08X)\n", status
);
580 * r300,r350,rv350,rv380 VRAM info
582 void r300_vram_info(struct radeon_device
*rdev
)
586 /* DDR for all card after R300 & IGP */
587 rdev
->mc
.vram_is_ddr
= true;
588 tmp
= RREG32(RADEON_MEM_CNTL
);
589 if (tmp
& R300_MEM_NUM_CHANNELS_MASK
) {
590 rdev
->mc
.vram_width
= 128;
592 rdev
->mc
.vram_width
= 64;
595 r100_vram_init_sizes(rdev
);
603 void rv370_set_pcie_lanes(struct radeon_device
*rdev
, int lanes
)
605 uint32_t link_width_cntl
, mask
;
607 if (rdev
->flags
& RADEON_IS_IGP
)
610 if (!(rdev
->flags
& RADEON_IS_PCIE
))
613 /* FIXME wait for idle */
617 mask
= RADEON_PCIE_LC_LINK_WIDTH_X0
;
620 mask
= RADEON_PCIE_LC_LINK_WIDTH_X1
;
623 mask
= RADEON_PCIE_LC_LINK_WIDTH_X2
;
626 mask
= RADEON_PCIE_LC_LINK_WIDTH_X4
;
629 mask
= RADEON_PCIE_LC_LINK_WIDTH_X8
;
632 mask
= RADEON_PCIE_LC_LINK_WIDTH_X12
;
636 mask
= RADEON_PCIE_LC_LINK_WIDTH_X16
;
640 link_width_cntl
= RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL
);
642 if ((link_width_cntl
& RADEON_PCIE_LC_LINK_WIDTH_RD_MASK
) ==
643 (mask
<< RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT
))
646 link_width_cntl
&= ~(RADEON_PCIE_LC_LINK_WIDTH_MASK
|
647 RADEON_PCIE_LC_RECONFIG_NOW
|
648 RADEON_PCIE_LC_RECONFIG_LATER
|
649 RADEON_PCIE_LC_SHORT_RECONFIG_EN
);
650 link_width_cntl
|= mask
;
651 WREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL
, link_width_cntl
);
652 WREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL
, (link_width_cntl
|
653 RADEON_PCIE_LC_RECONFIG_NOW
));
655 /* wait for lane set to complete */
656 link_width_cntl
= RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL
);
657 while (link_width_cntl
== 0xffffffff)
658 link_width_cntl
= RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL
);
666 #if defined(CONFIG_DEBUG_FS)
667 static int rv370_debugfs_pcie_gart_info(struct seq_file
*m
, void *data
)
669 struct drm_info_node
*node
= (struct drm_info_node
*) m
->private;
670 struct drm_device
*dev
= node
->minor
->dev
;
671 struct radeon_device
*rdev
= dev
->dev_private
;
674 tmp
= RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL
);
675 seq_printf(m
, "PCIE_TX_GART_CNTL 0x%08x\n", tmp
);
676 tmp
= RREG32_PCIE(RADEON_PCIE_TX_GART_BASE
);
677 seq_printf(m
, "PCIE_TX_GART_BASE 0x%08x\n", tmp
);
678 tmp
= RREG32_PCIE(RADEON_PCIE_TX_GART_START_LO
);
679 seq_printf(m
, "PCIE_TX_GART_START_LO 0x%08x\n", tmp
);
680 tmp
= RREG32_PCIE(RADEON_PCIE_TX_GART_START_HI
);
681 seq_printf(m
, "PCIE_TX_GART_START_HI 0x%08x\n", tmp
);
682 tmp
= RREG32_PCIE(RADEON_PCIE_TX_GART_END_LO
);
683 seq_printf(m
, "PCIE_TX_GART_END_LO 0x%08x\n", tmp
);
684 tmp
= RREG32_PCIE(RADEON_PCIE_TX_GART_END_HI
);
685 seq_printf(m
, "PCIE_TX_GART_END_HI 0x%08x\n", tmp
);
686 tmp
= RREG32_PCIE(RADEON_PCIE_TX_GART_ERROR
);
687 seq_printf(m
, "PCIE_TX_GART_ERROR 0x%08x\n", tmp
);
691 static struct drm_info_list rv370_pcie_gart_info_list
[] = {
692 {"rv370_pcie_gart_info", rv370_debugfs_pcie_gart_info
, 0, NULL
},
696 int rv370_debugfs_pcie_gart_info_init(struct radeon_device
*rdev
)
698 #if defined(CONFIG_DEBUG_FS)
699 return radeon_debugfs_add_files(rdev
, rv370_pcie_gart_info_list
, 1);
709 struct r300_cs_track_cb
{
710 struct radeon_object
*robj
;
716 struct r300_cs_track_array
{
717 struct radeon_object
*robj
;
721 struct r300_cs_track_texture
{
722 struct radeon_object
*robj
;
728 unsigned tex_coord_type
;
738 struct r300_cs_track
{
742 unsigned vap_vf_cntl
;
743 unsigned immd_dwords
;
746 struct r300_cs_track_array arrays
[11];
747 struct r300_cs_track_cb cb
[4];
748 struct r300_cs_track_cb zb
;
749 struct r300_cs_track_texture textures
[16];
753 static inline void r300_cs_track_texture_print(struct r300_cs_track_texture
*t
)
755 DRM_ERROR("pitch %d\n", t
->pitch
);
756 DRM_ERROR("width %d\n", t
->width
);
757 DRM_ERROR("height %d\n", t
->height
);
758 DRM_ERROR("num levels %d\n", t
->num_levels
);
759 DRM_ERROR("depth %d\n", t
->txdepth
);
760 DRM_ERROR("bpp %d\n", t
->cpp
);
761 DRM_ERROR("coordinate type %d\n", t
->tex_coord_type
);
762 DRM_ERROR("width round to power of 2 %d\n", t
->roundup_w
);
763 DRM_ERROR("height round to power of 2 %d\n", t
->roundup_h
);
766 static inline int r300_cs_track_texture_check(struct radeon_device
*rdev
,
767 struct r300_cs_track
*track
)
769 struct radeon_object
*robj
;
773 for (u
= 0; u
< 16; u
++) {
774 if (!track
->textures
[u
].enabled
)
776 robj
= track
->textures
[u
].robj
;
778 DRM_ERROR("No texture bound to unit %u\n", u
);
782 for (i
= 0; i
<= track
->textures
[u
].num_levels
; i
++) {
783 if (track
->textures
[u
].use_pitch
) {
784 w
= track
->textures
[u
].pitch
/ (1 << i
);
786 w
= track
->textures
[u
].width
/ (1 << i
);
787 if (rdev
->family
>= CHIP_RV515
)
788 w
|= track
->textures
[u
].width_11
;
789 if (track
->textures
[u
].roundup_w
)
790 w
= roundup_pow_of_two(w
);
792 h
= track
->textures
[u
].height
/ (1 << i
);
793 if (rdev
->family
>= CHIP_RV515
)
794 h
|= track
->textures
[u
].height_11
;
795 if (track
->textures
[u
].roundup_h
)
796 h
= roundup_pow_of_two(h
);
799 size
*= track
->textures
[u
].cpp
;
800 switch (track
->textures
[u
].tex_coord_type
) {
804 size
*= (1 << track
->textures
[u
].txdepth
);
810 DRM_ERROR("Invalid texture coordinate type %u for unit "
811 "%u\n", track
->textures
[u
].tex_coord_type
, u
);
814 if (size
> radeon_object_size(robj
)) {
815 DRM_ERROR("Texture of unit %u needs %lu bytes but is "
816 "%lu\n", u
, size
, radeon_object_size(robj
));
817 r300_cs_track_texture_print(&track
->textures
[u
]);
824 int r300_cs_track_check(struct radeon_device
*rdev
, struct r300_cs_track
*track
)
831 for (i
= 0; i
< track
->num_cb
; i
++) {
832 if (track
->cb
[i
].robj
== NULL
) {
833 DRM_ERROR("[drm] No buffer for color buffer %d !\n", i
);
836 size
= track
->cb
[i
].pitch
* track
->cb
[i
].cpp
* track
->maxy
;
837 size
+= track
->cb
[i
].offset
;
838 if (size
> radeon_object_size(track
->cb
[i
].robj
)) {
839 DRM_ERROR("[drm] Buffer too small for color buffer %d "
840 "(need %lu have %lu) !\n", i
, size
,
841 radeon_object_size(track
->cb
[i
].robj
));
842 DRM_ERROR("[drm] color buffer %d (%u %u %u %u)\n",
843 i
, track
->cb
[i
].pitch
, track
->cb
[i
].cpp
,
844 track
->cb
[i
].offset
, track
->maxy
);
848 if (track
->z_enabled
) {
849 if (track
->zb
.robj
== NULL
) {
850 DRM_ERROR("[drm] No buffer for z buffer !\n");
853 size
= track
->zb
.pitch
* track
->zb
.cpp
* track
->maxy
;
854 size
+= track
->zb
.offset
;
855 if (size
> radeon_object_size(track
->zb
.robj
)) {
856 DRM_ERROR("[drm] Buffer too small for z buffer "
857 "(need %lu have %lu) !\n", size
,
858 radeon_object_size(track
->zb
.robj
));
862 prim_walk
= (track
->vap_vf_cntl
>> 4) & 0x3;
863 nverts
= (track
->vap_vf_cntl
>> 16) & 0xFFFF;
866 for (i
= 0; i
< track
->num_arrays
; i
++) {
867 size
= track
->arrays
[i
].esize
* track
->max_indx
* 4;
868 if (track
->arrays
[i
].robj
== NULL
) {
869 DRM_ERROR("(PW %u) Vertex array %u no buffer "
870 "bound\n", prim_walk
, i
);
873 if (size
> radeon_object_size(track
->arrays
[i
].robj
)) {
874 DRM_ERROR("(PW %u) Vertex array %u need %lu dwords "
875 "have %lu dwords\n", prim_walk
, i
,
877 radeon_object_size(track
->arrays
[i
].robj
) >> 2);
878 DRM_ERROR("Max indices %u\n", track
->max_indx
);
884 for (i
= 0; i
< track
->num_arrays
; i
++) {
885 size
= track
->arrays
[i
].esize
* (nverts
- 1) * 4;
886 if (track
->arrays
[i
].robj
== NULL
) {
887 DRM_ERROR("(PW %u) Vertex array %u no buffer "
888 "bound\n", prim_walk
, i
);
891 if (size
> radeon_object_size(track
->arrays
[i
].robj
)) {
892 DRM_ERROR("(PW %u) Vertex array %u need %lu dwords "
893 "have %lu dwords\n", prim_walk
, i
, size
>> 2,
894 radeon_object_size(track
->arrays
[i
].robj
) >> 2);
900 size
= track
->vtx_size
* nverts
;
901 if (size
!= track
->immd_dwords
) {
902 DRM_ERROR("IMMD draw %u dwors but needs %lu dwords\n",
903 track
->immd_dwords
, size
);
904 DRM_ERROR("VAP_VF_CNTL.NUM_VERTICES %u, VTX_SIZE %u\n",
905 nverts
, track
->vtx_size
);
910 DRM_ERROR("[drm] Invalid primitive walk %d for VAP_VF_CNTL\n",
914 return r300_cs_track_texture_check(rdev
, track
);
917 static inline void r300_cs_track_clear(struct r300_cs_track
*track
)
923 for (i
= 0; i
< track
->num_cb
; i
++) {
924 track
->cb
[i
].robj
= NULL
;
925 track
->cb
[i
].pitch
= 8192;
926 track
->cb
[i
].cpp
= 16;
927 track
->cb
[i
].offset
= 0;
929 track
->z_enabled
= true;
930 track
->zb
.robj
= NULL
;
931 track
->zb
.pitch
= 8192;
933 track
->zb
.offset
= 0;
934 track
->vtx_size
= 0x7F;
935 track
->immd_dwords
= 0xFFFFFFFFUL
;
936 track
->num_arrays
= 11;
937 track
->max_indx
= 0x00FFFFFFUL
;
938 for (i
= 0; i
< track
->num_arrays
; i
++) {
939 track
->arrays
[i
].robj
= NULL
;
940 track
->arrays
[i
].esize
= 0x7F;
942 for (i
= 0; i
< 16; i
++) {
943 track
->textures
[i
].pitch
= 16536;
944 track
->textures
[i
].width
= 16536;
945 track
->textures
[i
].height
= 16536;
946 track
->textures
[i
].width_11
= 1 << 11;
947 track
->textures
[i
].height_11
= 1 << 11;
948 track
->textures
[i
].num_levels
= 12;
949 track
->textures
[i
].txdepth
= 16;
950 track
->textures
[i
].cpp
= 64;
951 track
->textures
[i
].tex_coord_type
= 1;
952 track
->textures
[i
].robj
= NULL
;
953 /* CS IB emission code makes sure texture unit are disabled */
954 track
->textures
[i
].enabled
= false;
955 track
->textures
[i
].roundup_w
= true;
956 track
->textures
[i
].roundup_h
= true;
960 static int r300_packet0_check(struct radeon_cs_parser
*p
,
961 struct radeon_cs_packet
*pkt
,
962 unsigned idx
, unsigned reg
)
964 struct radeon_cs_chunk
*ib_chunk
;
965 struct radeon_cs_reloc
*reloc
;
966 struct r300_cs_track
*track
;
967 volatile uint32_t *ib
;
968 uint32_t tmp
, tile_flags
= 0;
973 ib_chunk
= &p
->chunks
[p
->chunk_ib_idx
];
974 track
= (struct r300_cs_track
*)p
->track
;
976 case AVIVO_D1MODE_VLINE_START_END
:
977 case RADEON_CRTC_GUI_TRIG_VLINE
:
978 r
= r100_cs_packet_parse_vline(p
);
980 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
982 r100_cs_dump_packet(p
, pkt
);
986 case RADEON_DST_PITCH_OFFSET
:
987 case RADEON_SRC_PITCH_OFFSET
:
988 r
= r100_cs_packet_next_reloc(p
, &reloc
);
990 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
992 r100_cs_dump_packet(p
, pkt
);
995 tmp
= ib_chunk
->kdata
[idx
] & 0x003fffff;
996 tmp
+= (((u32
)reloc
->lobj
.gpu_offset
) >> 10);
998 if (reloc
->lobj
.tiling_flags
& RADEON_TILING_MACRO
)
999 tile_flags
|= RADEON_DST_TILE_MACRO
;
1000 if (reloc
->lobj
.tiling_flags
& RADEON_TILING_MICRO
) {
1001 if (reg
== RADEON_SRC_PITCH_OFFSET
) {
1002 DRM_ERROR("Cannot src blit from microtiled surface\n");
1003 r100_cs_dump_packet(p
, pkt
);
1006 tile_flags
|= RADEON_DST_TILE_MICRO
;
1009 ib
[idx
] = (ib_chunk
->kdata
[idx
] & 0x3fc00000) | tmp
;
1011 case R300_RB3D_COLOROFFSET0
:
1012 case R300_RB3D_COLOROFFSET1
:
1013 case R300_RB3D_COLOROFFSET2
:
1014 case R300_RB3D_COLOROFFSET3
:
1015 i
= (reg
- R300_RB3D_COLOROFFSET0
) >> 2;
1016 r
= r100_cs_packet_next_reloc(p
, &reloc
);
1018 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1020 r100_cs_dump_packet(p
, pkt
);
1023 track
->cb
[i
].robj
= reloc
->robj
;
1024 track
->cb
[i
].offset
= ib_chunk
->kdata
[idx
];
1025 ib
[idx
] = ib_chunk
->kdata
[idx
] + ((u32
)reloc
->lobj
.gpu_offset
);
1027 case R300_ZB_DEPTHOFFSET
:
1028 r
= r100_cs_packet_next_reloc(p
, &reloc
);
1030 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1032 r100_cs_dump_packet(p
, pkt
);
1035 track
->zb
.robj
= reloc
->robj
;
1036 track
->zb
.offset
= ib_chunk
->kdata
[idx
];
1037 ib
[idx
] = ib_chunk
->kdata
[idx
] + ((u32
)reloc
->lobj
.gpu_offset
);
1039 case R300_TX_OFFSET_0
:
1040 case R300_TX_OFFSET_0
+4:
1041 case R300_TX_OFFSET_0
+8:
1042 case R300_TX_OFFSET_0
+12:
1043 case R300_TX_OFFSET_0
+16:
1044 case R300_TX_OFFSET_0
+20:
1045 case R300_TX_OFFSET_0
+24:
1046 case R300_TX_OFFSET_0
+28:
1047 case R300_TX_OFFSET_0
+32:
1048 case R300_TX_OFFSET_0
+36:
1049 case R300_TX_OFFSET_0
+40:
1050 case R300_TX_OFFSET_0
+44:
1051 case R300_TX_OFFSET_0
+48:
1052 case R300_TX_OFFSET_0
+52:
1053 case R300_TX_OFFSET_0
+56:
1054 case R300_TX_OFFSET_0
+60:
1055 i
= (reg
- R300_TX_OFFSET_0
) >> 2;
1056 r
= r100_cs_packet_next_reloc(p
, &reloc
);
1058 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1060 r100_cs_dump_packet(p
, pkt
);
1063 ib
[idx
] = ib_chunk
->kdata
[idx
] + ((u32
)reloc
->lobj
.gpu_offset
);
1064 track
->textures
[i
].robj
= reloc
->robj
;
1066 /* Tracked registers */
1069 track
->vap_vf_cntl
= ib_chunk
->kdata
[idx
];
1073 track
->vtx_size
= ib_chunk
->kdata
[idx
] & 0x7F;
1076 /* VAP_VF_MAX_VTX_INDX */
1077 track
->max_indx
= ib_chunk
->kdata
[idx
] & 0x00FFFFFFUL
;
1081 track
->maxy
= ((ib_chunk
->kdata
[idx
] >> 13) & 0x1FFF) + 1;
1082 if (p
->rdev
->family
< CHIP_RV515
) {
1083 track
->maxy
-= 1440;
1088 track
->num_cb
= ((ib_chunk
->kdata
[idx
] >> 5) & 0x3) + 1;
1094 /* RB3D_COLORPITCH0 */
1095 /* RB3D_COLORPITCH1 */
1096 /* RB3D_COLORPITCH2 */
1097 /* RB3D_COLORPITCH3 */
1098 r
= r100_cs_packet_next_reloc(p
, &reloc
);
1100 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1102 r100_cs_dump_packet(p
, pkt
);
1106 if (reloc
->lobj
.tiling_flags
& RADEON_TILING_MACRO
)
1107 tile_flags
|= R300_COLOR_TILE_ENABLE
;
1108 if (reloc
->lobj
.tiling_flags
& RADEON_TILING_MICRO
)
1109 tile_flags
|= R300_COLOR_MICROTILE_ENABLE
;
1111 tmp
= ib_chunk
->kdata
[idx
] & ~(0x7 << 16);
1115 i
= (reg
- 0x4E38) >> 2;
1116 track
->cb
[i
].pitch
= ib_chunk
->kdata
[idx
] & 0x3FFE;
1117 switch (((ib_chunk
->kdata
[idx
] >> 21) & 0xF)) {
1121 track
->cb
[i
].cpp
= 1;
1127 track
->cb
[i
].cpp
= 2;
1130 track
->cb
[i
].cpp
= 4;
1133 track
->cb
[i
].cpp
= 8;
1136 track
->cb
[i
].cpp
= 16;
1139 DRM_ERROR("Invalid color buffer format (%d) !\n",
1140 ((ib_chunk
->kdata
[idx
] >> 21) & 0xF));
1146 if (ib_chunk
->kdata
[idx
] & 2) {
1147 track
->z_enabled
= true;
1149 track
->z_enabled
= false;
1154 switch ((ib_chunk
->kdata
[idx
] & 0xF)) {
1163 DRM_ERROR("Invalid z buffer format (%d) !\n",
1164 (ib_chunk
->kdata
[idx
] & 0xF));
1170 r
= r100_cs_packet_next_reloc(p
, &reloc
);
1172 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1174 r100_cs_dump_packet(p
, pkt
);
1178 if (reloc
->lobj
.tiling_flags
& RADEON_TILING_MACRO
)
1179 tile_flags
|= R300_DEPTHMACROTILE_ENABLE
;
1180 if (reloc
->lobj
.tiling_flags
& RADEON_TILING_MICRO
)
1181 tile_flags
|= R300_DEPTHMICROTILE_TILED
;;
1183 tmp
= ib_chunk
->kdata
[idx
] & ~(0x7 << 16);
1187 track
->zb
.pitch
= ib_chunk
->kdata
[idx
] & 0x3FFC;
1190 for (i
= 0; i
< 16; i
++) {
1193 enabled
= !!(ib_chunk
->kdata
[idx
] & (1 << i
));
1194 track
->textures
[i
].enabled
= enabled
;
1213 /* TX_FORMAT1_[0-15] */
1214 i
= (reg
- 0x44C0) >> 2;
1215 tmp
= (ib_chunk
->kdata
[idx
] >> 25) & 0x3;
1216 track
->textures
[i
].tex_coord_type
= tmp
;
1217 switch ((ib_chunk
->kdata
[idx
] & 0x1F)) {
1224 track
->textures
[i
].cpp
= 1;
1235 track
->textures
[i
].cpp
= 2;
1246 track
->textures
[i
].cpp
= 4;
1251 track
->textures
[i
].cpp
= 8;
1254 track
->textures
[i
].cpp
= 16;
1257 DRM_ERROR("Invalid texture format %u\n",
1258 (ib_chunk
->kdata
[idx
] & 0x1F));
1279 /* TX_FILTER0_[0-15] */
1280 i
= (reg
- 0x4400) >> 2;
1281 tmp
= ib_chunk
->kdata
[idx
] & 0x7;;
1282 if (tmp
== 2 || tmp
== 4 || tmp
== 6) {
1283 track
->textures
[i
].roundup_w
= false;
1285 tmp
= (ib_chunk
->kdata
[idx
] >> 3) & 0x7;;
1286 if (tmp
== 2 || tmp
== 4 || tmp
== 6) {
1287 track
->textures
[i
].roundup_h
= false;
1306 /* TX_FORMAT2_[0-15] */
1307 i
= (reg
- 0x4500) >> 2;
1308 tmp
= ib_chunk
->kdata
[idx
] & 0x3FFF;
1309 track
->textures
[i
].pitch
= tmp
+ 1;
1310 if (p
->rdev
->family
>= CHIP_RV515
) {
1311 tmp
= ((ib_chunk
->kdata
[idx
] >> 15) & 1) << 11;
1312 track
->textures
[i
].width_11
= tmp
;
1313 tmp
= ((ib_chunk
->kdata
[idx
] >> 16) & 1) << 11;
1314 track
->textures
[i
].height_11
= tmp
;
1333 /* TX_FORMAT0_[0-15] */
1334 i
= (reg
- 0x4480) >> 2;
1335 tmp
= ib_chunk
->kdata
[idx
] & 0x7FF;
1336 track
->textures
[i
].width
= tmp
+ 1;
1337 tmp
= (ib_chunk
->kdata
[idx
] >> 11) & 0x7FF;
1338 track
->textures
[i
].height
= tmp
+ 1;
1339 tmp
= (ib_chunk
->kdata
[idx
] >> 26) & 0xF;
1340 track
->textures
[i
].num_levels
= tmp
;
1341 tmp
= ib_chunk
->kdata
[idx
] & (1 << 31);
1342 track
->textures
[i
].use_pitch
= !!tmp
;
1343 tmp
= (ib_chunk
->kdata
[idx
] >> 22) & 0xF;
1344 track
->textures
[i
].txdepth
= tmp
;
1346 case R300_ZB_ZPASS_ADDR
:
1347 r
= r100_cs_packet_next_reloc(p
, &reloc
);
1349 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1351 r100_cs_dump_packet(p
, pkt
);
1354 ib
[idx
] = ib_chunk
->kdata
[idx
] + ((u32
)reloc
->lobj
.gpu_offset
);
1357 /* valid register only on RV530 */
1358 if (p
->rdev
->family
== CHIP_RV530
)
1360 /* fallthrough do not move */
1362 printk(KERN_ERR
"Forbidden register 0x%04X in cs at %d\n",
1369 static int r300_packet3_check(struct radeon_cs_parser
*p
,
1370 struct radeon_cs_packet
*pkt
)
1372 struct radeon_cs_chunk
*ib_chunk
;
1373 struct radeon_cs_reloc
*reloc
;
1374 struct r300_cs_track
*track
;
1375 volatile uint32_t *ib
;
1381 ib_chunk
= &p
->chunks
[p
->chunk_ib_idx
];
1383 track
= (struct r300_cs_track
*)p
->track
;
1384 switch(pkt
->opcode
) {
1385 case PACKET3_3D_LOAD_VBPNTR
:
1386 c
= ib_chunk
->kdata
[idx
++] & 0x1F;
1387 track
->num_arrays
= c
;
1388 for (i
= 0; i
< (c
- 1); i
+=2, idx
+=3) {
1389 r
= r100_cs_packet_next_reloc(p
, &reloc
);
1391 DRM_ERROR("No reloc for packet3 %d\n",
1393 r100_cs_dump_packet(p
, pkt
);
1396 ib
[idx
+1] = ib_chunk
->kdata
[idx
+1] + ((u32
)reloc
->lobj
.gpu_offset
);
1397 track
->arrays
[i
+ 0].robj
= reloc
->robj
;
1398 track
->arrays
[i
+ 0].esize
= ib_chunk
->kdata
[idx
] >> 8;
1399 track
->arrays
[i
+ 0].esize
&= 0x7F;
1400 r
= r100_cs_packet_next_reloc(p
, &reloc
);
1402 DRM_ERROR("No reloc for packet3 %d\n",
1404 r100_cs_dump_packet(p
, pkt
);
1407 ib
[idx
+2] = ib_chunk
->kdata
[idx
+2] + ((u32
)reloc
->lobj
.gpu_offset
);
1408 track
->arrays
[i
+ 1].robj
= reloc
->robj
;
1409 track
->arrays
[i
+ 1].esize
= ib_chunk
->kdata
[idx
] >> 24;
1410 track
->arrays
[i
+ 1].esize
&= 0x7F;
1413 r
= r100_cs_packet_next_reloc(p
, &reloc
);
1415 DRM_ERROR("No reloc for packet3 %d\n",
1417 r100_cs_dump_packet(p
, pkt
);
1420 ib
[idx
+1] = ib_chunk
->kdata
[idx
+1] + ((u32
)reloc
->lobj
.gpu_offset
);
1421 track
->arrays
[i
+ 0].robj
= reloc
->robj
;
1422 track
->arrays
[i
+ 0].esize
= ib_chunk
->kdata
[idx
] >> 8;
1423 track
->arrays
[i
+ 0].esize
&= 0x7F;
1426 case PACKET3_INDX_BUFFER
:
1427 r
= r100_cs_packet_next_reloc(p
, &reloc
);
1429 DRM_ERROR("No reloc for packet3 %d\n", pkt
->opcode
);
1430 r100_cs_dump_packet(p
, pkt
);
1433 ib
[idx
+1] = ib_chunk
->kdata
[idx
+1] + ((u32
)reloc
->lobj
.gpu_offset
);
1434 r
= r100_cs_track_check_pkt3_indx_buffer(p
, pkt
, reloc
->robj
);
1440 case PACKET3_3D_DRAW_IMMD
:
1441 /* Number of dwords is vtx_size * (num_vertices - 1)
1442 * PRIM_WALK must be equal to 3 vertex data in embedded
1444 if (((ib_chunk
->kdata
[idx
+1] >> 4) & 0x3) != 3) {
1445 DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n");
1448 track
->vap_vf_cntl
= ib_chunk
->kdata
[idx
+1];
1449 track
->immd_dwords
= pkt
->count
- 1;
1450 r
= r300_cs_track_check(p
->rdev
, track
);
1455 case PACKET3_3D_DRAW_IMMD_2
:
1456 /* Number of dwords is vtx_size * (num_vertices - 1)
1457 * PRIM_WALK must be equal to 3 vertex data in embedded
1459 if (((ib_chunk
->kdata
[idx
] >> 4) & 0x3) != 3) {
1460 DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n");
1463 track
->vap_vf_cntl
= ib_chunk
->kdata
[idx
];
1464 track
->immd_dwords
= pkt
->count
;
1465 r
= r300_cs_track_check(p
->rdev
, track
);
1470 case PACKET3_3D_DRAW_VBUF
:
1471 track
->vap_vf_cntl
= ib_chunk
->kdata
[idx
+ 1];
1472 r
= r300_cs_track_check(p
->rdev
, track
);
1477 case PACKET3_3D_DRAW_VBUF_2
:
1478 track
->vap_vf_cntl
= ib_chunk
->kdata
[idx
];
1479 r
= r300_cs_track_check(p
->rdev
, track
);
1484 case PACKET3_3D_DRAW_INDX
:
1485 track
->vap_vf_cntl
= ib_chunk
->kdata
[idx
+ 1];
1486 r
= r300_cs_track_check(p
->rdev
, track
);
1491 case PACKET3_3D_DRAW_INDX_2
:
1492 track
->vap_vf_cntl
= ib_chunk
->kdata
[idx
];
1493 r
= r300_cs_track_check(p
->rdev
, track
);
1501 DRM_ERROR("Packet3 opcode %x not supported\n", pkt
->opcode
);
1507 int r300_cs_parse(struct radeon_cs_parser
*p
)
1509 struct radeon_cs_packet pkt
;
1510 struct r300_cs_track track
;
1513 r300_cs_track_clear(&track
);
1516 r
= r100_cs_packet_parse(p
, &pkt
, p
->idx
);
1520 p
->idx
+= pkt
.count
+ 2;
1523 r
= r100_cs_parse_packet0(p
, &pkt
,
1524 p
->rdev
->config
.r300
.reg_safe_bm
,
1525 p
->rdev
->config
.r300
.reg_safe_bm_size
,
1526 &r300_packet0_check
);
1531 r
= r300_packet3_check(p
, &pkt
);
1534 DRM_ERROR("Unknown packet type %d !\n", pkt
.type
);
1540 } while (p
->idx
< p
->chunks
[p
->chunk_ib_idx
].length_dw
);
1544 int r300_init(struct radeon_device
*rdev
)
1546 rdev
->config
.r300
.reg_safe_bm
= r300_reg_safe_bm
;
1547 rdev
->config
.r300
.reg_safe_bm_size
= ARRAY_SIZE(r300_reg_safe_bm
);