aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/r200.c
diff options
context:
space:
mode:
authorAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
committerAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
commitada47b5fe13d89735805b566185f4885f5a3f750 (patch)
tree644b88f8a71896307d71438e9b3af49126ffb22b /drivers/gpu/drm/radeon/r200.c
parent43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff)
parent3280f21d43ee541f97f8cda5792150d2dbec20d5 (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.c64
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
84int 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
82static int r200_get_vtx_size_1(uint32_t vtx_fmt_1) 129static 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);