aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlija Hadzic <ihadzic@research.bell-labs.com>2011-10-12 23:29:37 -0400
committerDave Airlie <airlied@redhat.com>2011-10-18 05:06:23 -0400
commit3a38612e329ffe5183122a9523eacae33e7cbb07 (patch)
tree2bd06564275c38ce283453dcbd0c741035aa22fa
parent6018faf58da5be0f0307b7bd2af113b9a60b7a7e (diff)
drm/radeon/kms: demystify r600 blit code
some 3d register bits look like magic in r600 blit functions use predefined constants to make it more intuitive what they are Signed-off-by: Ilija Hadzic <ihadzic@research.bell-labs.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--drivers/gpu/drm/radeon/r600_blit_kms.c30
-rw-r--r--drivers/gpu/drm/radeon/r600d.h22
2 files changed, 39 insertions, 13 deletions
diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c b/drivers/gpu/drm/radeon/r600_blit_kms.c
index 3940be619af7..d4e215f15062 100644
--- a/drivers/gpu/drm/radeon/r600_blit_kms.c
+++ b/drivers/gpu/drm/radeon/r600_blit_kms.c
@@ -58,7 +58,9 @@ set_render_target(struct radeon_device *rdev, int format,
58 if (h < 8) 58 if (h < 8)
59 h = 8; 59 h = 8;
60 60
61 cb_color_info = ((format << 2) | (1 << 27) | (1 << 8)); 61 cb_color_info = CB_FORMAT(format) |
62 CB_SOURCE_FORMAT(CB_SF_EXPORT_NORM) |
63 CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
62 pitch = (w / 8) - 1; 64 pitch = (w / 8) - 1;
63 slice = ((w * h) / 64) - 1; 65 slice = ((w * h) / 64) - 1;
64 66
@@ -168,9 +170,10 @@ set_vtx_resource(struct radeon_device *rdev, u64 gpu_addr)
168{ 170{
169 u32 sq_vtx_constant_word2; 171 u32 sq_vtx_constant_word2;
170 172
171 sq_vtx_constant_word2 = ((upper_32_bits(gpu_addr) & 0xff) | (16 << 8)); 173 sq_vtx_constant_word2 = SQ_VTXC_BASE_ADDR_HI(upper_32_bits(gpu_addr) & 0xff) |
174 SQ_VTXC_STRIDE(16);
172#ifdef __BIG_ENDIAN 175#ifdef __BIG_ENDIAN
173 sq_vtx_constant_word2 |= (2 << 30); 176 sq_vtx_constant_word2 |= SQ_VTXC_ENDIAN_SWAP(SQ_ENDIAN_8IN32);
174#endif 177#endif
175 178
176 radeon_ring_write(rdev, PACKET3(PACKET3_SET_RESOURCE, 7)); 179 radeon_ring_write(rdev, PACKET3(PACKET3_SET_RESOURCE, 7));
@@ -206,18 +209,19 @@ set_tex_resource(struct radeon_device *rdev,
206 if (h < 1) 209 if (h < 1)
207 h = 1; 210 h = 1;
208 211
209 sq_tex_resource_word0 = (1 << 0) | (1 << 3); 212 sq_tex_resource_word0 = S_038000_DIM(V_038000_SQ_TEX_DIM_2D) |
210 sq_tex_resource_word0 |= ((((pitch >> 3) - 1) << 8) | 213 S_038000_TILE_MODE(V_038000_ARRAY_1D_TILED_THIN1);
211 ((w - 1) << 19)); 214 sq_tex_resource_word0 |= S_038000_PITCH((pitch >> 3) - 1) |
215 S_038000_TEX_WIDTH(w - 1);
212 216
213 sq_tex_resource_word1 = (format << 26); 217 sq_tex_resource_word1 = S_038004_DATA_FORMAT(format);
214 sq_tex_resource_word1 |= ((h - 1) << 0); 218 sq_tex_resource_word1 |= S_038004_TEX_HEIGHT(h - 1);
215 219
216 sq_tex_resource_word4 = ((1 << 14) | 220 sq_tex_resource_word4 = S_038010_REQUEST_SIZE(1) |
217 (0 << 16) | 221 S_038010_DST_SEL_X(SQ_SEL_X) |
218 (1 << 19) | 222 S_038010_DST_SEL_Y(SQ_SEL_Y) |
219 (2 << 22) | 223 S_038010_DST_SEL_Z(SQ_SEL_Z) |
220 (3 << 25)); 224 S_038010_DST_SEL_W(SQ_SEL_W);
221 225
222 radeon_ring_write(rdev, PACKET3(PACKET3_SET_RESOURCE, 7)); 226 radeon_ring_write(rdev, PACKET3(PACKET3_SET_RESOURCE, 7));
223 radeon_ring_write(rdev, 0); 227 radeon_ring_write(rdev, 0);
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h
index 0245ae6c204e..bfe1b5d92afe 100644
--- a/drivers/gpu/drm/radeon/r600d.h
+++ b/drivers/gpu/drm/radeon/r600d.h
@@ -79,6 +79,11 @@
79#define CB_COLOR0_SIZE 0x28060 79#define CB_COLOR0_SIZE 0x28060
80#define CB_COLOR0_VIEW 0x28080 80#define CB_COLOR0_VIEW 0x28080
81#define CB_COLOR0_INFO 0x280a0 81#define CB_COLOR0_INFO 0x280a0
82# define CB_FORMAT(x) ((x) << 2)
83# define CB_ARRAY_MODE(x) ((x) << 8)
84# define CB_SOURCE_FORMAT(x) ((x) << 27)
85# define CB_SF_EXPORT_FULL 0
86# define CB_SF_EXPORT_NORM 1
82#define CB_COLOR0_TILE 0x280c0 87#define CB_COLOR0_TILE 0x280c0
83#define CB_COLOR0_FRAG 0x280e0 88#define CB_COLOR0_FRAG 0x280e0
84#define CB_COLOR0_MASK 0x28100 89#define CB_COLOR0_MASK 0x28100
@@ -417,6 +422,17 @@
417#define SQ_PGM_START_VS 0x28858 422#define SQ_PGM_START_VS 0x28858
418#define SQ_PGM_RESOURCES_VS 0x28868 423#define SQ_PGM_RESOURCES_VS 0x28868
419#define SQ_PGM_CF_OFFSET_VS 0x288d0 424#define SQ_PGM_CF_OFFSET_VS 0x288d0
425
426#define SQ_VTX_CONSTANT_WORD0_0 0x30000
427#define SQ_VTX_CONSTANT_WORD1_0 0x30004
428#define SQ_VTX_CONSTANT_WORD2_0 0x30008
429# define SQ_VTXC_BASE_ADDR_HI(x) ((x) << 0)
430# define SQ_VTXC_STRIDE(x) ((x) << 8)
431# define SQ_VTXC_ENDIAN_SWAP(x) ((x) << 30)
432# define SQ_ENDIAN_NONE 0
433# define SQ_ENDIAN_8IN16 1
434# define SQ_ENDIAN_8IN32 2
435#define SQ_VTX_CONSTANT_WORD3_0 0x3000c
420#define SQ_VTX_CONSTANT_WORD6_0 0x38018 436#define SQ_VTX_CONSTANT_WORD6_0 0x38018
421#define S__SQ_VTX_CONSTANT_TYPE(x) (((x) & 3) << 30) 437#define S__SQ_VTX_CONSTANT_TYPE(x) (((x) & 3) << 30)
422#define G__SQ_VTX_CONSTANT_TYPE(x) (((x) >> 30) & 3) 438#define G__SQ_VTX_CONSTANT_TYPE(x) (((x) >> 30) & 3)
@@ -1352,6 +1368,12 @@
1352#define S_038010_DST_SEL_W(x) (((x) & 0x7) << 25) 1368#define S_038010_DST_SEL_W(x) (((x) & 0x7) << 25)
1353#define G_038010_DST_SEL_W(x) (((x) >> 25) & 0x7) 1369#define G_038010_DST_SEL_W(x) (((x) >> 25) & 0x7)
1354#define C_038010_DST_SEL_W 0xF1FFFFFF 1370#define C_038010_DST_SEL_W 0xF1FFFFFF
1371# define SQ_SEL_X 0
1372# define SQ_SEL_Y 1
1373# define SQ_SEL_Z 2
1374# define SQ_SEL_W 3
1375# define SQ_SEL_0 4
1376# define SQ_SEL_1 5
1355#define S_038010_BASE_LEVEL(x) (((x) & 0xF) << 28) 1377#define S_038010_BASE_LEVEL(x) (((x) & 0xF) << 28)
1356#define G_038010_BASE_LEVEL(x) (((x) >> 28) & 0xF) 1378#define G_038010_BASE_LEVEL(x) (((x) >> 28) & 0xF)
1357#define C_038010_BASE_LEVEL 0x0FFFFFFF 1379#define C_038010_BASE_LEVEL 0x0FFFFFFF