diff options
author | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
---|---|---|
committer | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
commit | ada47b5fe13d89735805b566185f4885f5a3f750 (patch) | |
tree | 644b88f8a71896307d71438e9b3af49126ffb22b /drivers/gpu/drm/radeon/r200.c | |
parent | 43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff) | |
parent | 3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff) |
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'drivers/gpu/drm/radeon/r200.c')
-rw-r--r-- | drivers/gpu/drm/radeon/r200.c | 64 |
1 files changed, 60 insertions, 4 deletions
diff --git a/drivers/gpu/drm/radeon/r200.c b/drivers/gpu/drm/radeon/r200.c index eb740fc3549f..85617c311212 100644 --- a/drivers/gpu/drm/radeon/r200.c +++ b/drivers/gpu/drm/radeon/r200.c | |||
@@ -30,7 +30,9 @@ | |||
30 | #include "radeon_drm.h" | 30 | #include "radeon_drm.h" |
31 | #include "radeon_reg.h" | 31 | #include "radeon_reg.h" |
32 | #include "radeon.h" | 32 | #include "radeon.h" |
33 | #include "radeon_asic.h" | ||
33 | 34 | ||
35 | #include "r100d.h" | ||
34 | #include "r200_reg_safe.h" | 36 | #include "r200_reg_safe.h" |
35 | 37 | ||
36 | #include "r100_track.h" | 38 | #include "r100_track.h" |
@@ -79,6 +81,51 @@ static int r200_get_vtx_size_0(uint32_t vtx_fmt_0) | |||
79 | return vtx_size; | 81 | return vtx_size; |
80 | } | 82 | } |
81 | 83 | ||
84 | int r200_copy_dma(struct radeon_device *rdev, | ||
85 | uint64_t src_offset, | ||
86 | uint64_t dst_offset, | ||
87 | unsigned num_pages, | ||
88 | struct radeon_fence *fence) | ||
89 | { | ||
90 | uint32_t size; | ||
91 | uint32_t cur_size; | ||
92 | int i, num_loops; | ||
93 | int r = 0; | ||
94 | |||
95 | /* radeon pitch is /64 */ | ||
96 | size = num_pages << PAGE_SHIFT; | ||
97 | num_loops = DIV_ROUND_UP(size, 0x1FFFFF); | ||
98 | r = radeon_ring_lock(rdev, num_loops * 4 + 64); | ||
99 | if (r) { | ||
100 | DRM_ERROR("radeon: moving bo (%d).\n", r); | ||
101 | return r; | ||
102 | } | ||
103 | /* Must wait for 2D idle & clean before DMA or hangs might happen */ | ||
104 | radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); | ||
105 | radeon_ring_write(rdev, (1 << 16)); | ||
106 | for (i = 0; i < num_loops; i++) { | ||
107 | cur_size = size; | ||
108 | if (cur_size > 0x1FFFFF) { | ||
109 | cur_size = 0x1FFFFF; | ||
110 | } | ||
111 | size -= cur_size; | ||
112 | radeon_ring_write(rdev, PACKET0(0x720, 2)); | ||
113 | radeon_ring_write(rdev, src_offset); | ||
114 | radeon_ring_write(rdev, dst_offset); | ||
115 | radeon_ring_write(rdev, cur_size | (1 << 31) | (1 << 30)); | ||
116 | src_offset += cur_size; | ||
117 | dst_offset += cur_size; | ||
118 | } | ||
119 | radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); | ||
120 | radeon_ring_write(rdev, RADEON_WAIT_DMA_GUI_IDLE); | ||
121 | if (fence) { | ||
122 | r = radeon_fence_emit(rdev, fence); | ||
123 | } | ||
124 | radeon_ring_unlock_commit(rdev); | ||
125 | return r; | ||
126 | } | ||
127 | |||
128 | |||
82 | static int r200_get_vtx_size_1(uint32_t vtx_fmt_1) | 129 | static int r200_get_vtx_size_1(uint32_t vtx_fmt_1) |
83 | { | 130 | { |
84 | int vtx_size, i, tex_size; | 131 | int vtx_size, i, tex_size; |
@@ -371,13 +418,16 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
371 | case 5: | 418 | case 5: |
372 | case 6: | 419 | case 6: |
373 | case 7: | 420 | case 7: |
421 | /* 1D/2D */ | ||
374 | track->textures[i].tex_coord_type = 0; | 422 | track->textures[i].tex_coord_type = 0; |
375 | break; | 423 | break; |
376 | case 1: | 424 | case 1: |
377 | track->textures[i].tex_coord_type = 1; | 425 | /* CUBE */ |
426 | track->textures[i].tex_coord_type = 2; | ||
378 | break; | 427 | break; |
379 | case 2: | 428 | case 2: |
380 | track->textures[i].tex_coord_type = 2; | 429 | /* 3D */ |
430 | track->textures[i].tex_coord_type = 1; | ||
381 | break; | 431 | break; |
382 | } | 432 | } |
383 | break; | 433 | break; |
@@ -401,7 +451,6 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
401 | case R200_TXFORMAT_Y8: | 451 | case R200_TXFORMAT_Y8: |
402 | track->textures[i].cpp = 1; | 452 | track->textures[i].cpp = 1; |
403 | break; | 453 | break; |
404 | case R200_TXFORMAT_DXT1: | ||
405 | case R200_TXFORMAT_AI88: | 454 | case R200_TXFORMAT_AI88: |
406 | case R200_TXFORMAT_ARGB1555: | 455 | case R200_TXFORMAT_ARGB1555: |
407 | case R200_TXFORMAT_RGB565: | 456 | case R200_TXFORMAT_RGB565: |
@@ -418,9 +467,16 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
418 | case R200_TXFORMAT_ABGR8888: | 467 | case R200_TXFORMAT_ABGR8888: |
419 | case R200_TXFORMAT_BGR111110: | 468 | case R200_TXFORMAT_BGR111110: |
420 | case R200_TXFORMAT_LDVDU8888: | 469 | case R200_TXFORMAT_LDVDU8888: |
470 | track->textures[i].cpp = 4; | ||
471 | break; | ||
472 | case R200_TXFORMAT_DXT1: | ||
473 | track->textures[i].cpp = 1; | ||
474 | track->textures[i].compress_format = R100_TRACK_COMP_DXT1; | ||
475 | break; | ||
421 | case R200_TXFORMAT_DXT23: | 476 | case R200_TXFORMAT_DXT23: |
422 | case R200_TXFORMAT_DXT45: | 477 | case R200_TXFORMAT_DXT45: |
423 | track->textures[i].cpp = 4; | 478 | track->textures[i].cpp = 1; |
479 | track->textures[i].compress_format = R100_TRACK_COMP_DXT1; | ||
424 | break; | 480 | break; |
425 | } | 481 | } |
426 | track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf); | 482 | track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf); |