diff options
author | Alex Deucher <alexdeucher@gmail.com> | 2010-05-20 12:43:52 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2010-08-01 20:00:03 -0400 |
commit | 7f813377203a60be01a3354664edc5d3c746100d (patch) | |
tree | 22261aa7bc82a6b2e6f183cbda66ff79e7277fe6 /drivers/gpu | |
parent | 97d663285322b3db05613d274b1eb3f9806f37ca (diff) |
drm/radeon/kms: add tiling support to the cs checker for r6xx/r7xx
Check for relocs for DB_DEPTH_INFO, CB_COLOR*_INFO, and texture
resources.
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/radeon/r600_cs.c | 57 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600d.h | 6 |
2 files changed, 57 insertions, 6 deletions
diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c index c39c1bc13016..5cab1b413b6c 100644 --- a/drivers/gpu/drm/radeon/r600_cs.c +++ b/drivers/gpu/drm/radeon/r600_cs.c | |||
@@ -725,7 +725,25 @@ static inline int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx | |||
725 | track->db_depth_control = radeon_get_ib_value(p, idx); | 725 | track->db_depth_control = radeon_get_ib_value(p, idx); |
726 | break; | 726 | break; |
727 | case R_028010_DB_DEPTH_INFO: | 727 | case R_028010_DB_DEPTH_INFO: |
728 | track->db_depth_info = radeon_get_ib_value(p, idx); | 728 | if (r600_cs_packet_next_is_pkt3_nop(p)) { |
729 | r = r600_cs_packet_next_reloc(p, &reloc); | ||
730 | if (r) { | ||
731 | dev_warn(p->dev, "bad SET_CONTEXT_REG " | ||
732 | "0x%04X\n", reg); | ||
733 | return -EINVAL; | ||
734 | } | ||
735 | track->db_depth_info = radeon_get_ib_value(p, idx); | ||
736 | ib[idx] &= C_028010_ARRAY_MODE; | ||
737 | track->db_depth_info &= C_028010_ARRAY_MODE; | ||
738 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) { | ||
739 | ib[idx] |= S_028010_ARRAY_MODE(V_028010_ARRAY_2D_TILED_THIN1); | ||
740 | track->db_depth_info |= S_028010_ARRAY_MODE(V_028010_ARRAY_2D_TILED_THIN1); | ||
741 | } else { | ||
742 | ib[idx] |= S_028010_ARRAY_MODE(V_028010_ARRAY_1D_TILED_THIN1); | ||
743 | track->db_depth_info |= S_028010_ARRAY_MODE(V_028010_ARRAY_1D_TILED_THIN1); | ||
744 | } | ||
745 | } else | ||
746 | track->db_depth_info = radeon_get_ib_value(p, idx); | ||
729 | break; | 747 | break; |
730 | case R_028004_DB_DEPTH_VIEW: | 748 | case R_028004_DB_DEPTH_VIEW: |
731 | track->db_depth_view = radeon_get_ib_value(p, idx); | 749 | track->db_depth_view = radeon_get_ib_value(p, idx); |
@@ -758,8 +776,25 @@ static inline int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx | |||
758 | case R_0280B4_CB_COLOR5_INFO: | 776 | case R_0280B4_CB_COLOR5_INFO: |
759 | case R_0280B8_CB_COLOR6_INFO: | 777 | case R_0280B8_CB_COLOR6_INFO: |
760 | case R_0280BC_CB_COLOR7_INFO: | 778 | case R_0280BC_CB_COLOR7_INFO: |
761 | tmp = (reg - R_0280A0_CB_COLOR0_INFO) / 4; | 779 | if (r600_cs_packet_next_is_pkt3_nop(p)) { |
762 | track->cb_color_info[tmp] = radeon_get_ib_value(p, idx); | 780 | r = r600_cs_packet_next_reloc(p, &reloc); |
781 | if (r) { | ||
782 | dev_err(p->dev, "bad SET_CONTEXT_REG 0x%04X\n", reg); | ||
783 | return -EINVAL; | ||
784 | } | ||
785 | tmp = (reg - R_0280A0_CB_COLOR0_INFO) / 4; | ||
786 | track->cb_color_info[tmp] = radeon_get_ib_value(p, idx); | ||
787 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) { | ||
788 | ib[idx] |= S_0280A0_ARRAY_MODE(V_0280A0_ARRAY_2D_TILED_THIN1); | ||
789 | track->cb_color_info[tmp] |= S_0280A0_ARRAY_MODE(V_0280A0_ARRAY_2D_TILED_THIN1); | ||
790 | } else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) { | ||
791 | ib[idx] |= S_0280A0_ARRAY_MODE(V_0280A0_ARRAY_1D_TILED_THIN1); | ||
792 | track->cb_color_info[tmp] |= S_0280A0_ARRAY_MODE(V_0280A0_ARRAY_1D_TILED_THIN1); | ||
793 | } | ||
794 | } else { | ||
795 | tmp = (reg - R_0280A0_CB_COLOR0_INFO) / 4; | ||
796 | track->cb_color_info[tmp] = radeon_get_ib_value(p, idx); | ||
797 | } | ||
763 | break; | 798 | break; |
764 | case R_028060_CB_COLOR0_SIZE: | 799 | case R_028060_CB_COLOR0_SIZE: |
765 | case R_028064_CB_COLOR1_SIZE: | 800 | case R_028064_CB_COLOR1_SIZE: |
@@ -986,8 +1021,9 @@ static void r600_texture_size(unsigned nfaces, unsigned blevel, unsigned nlevels | |||
986 | * the texture and mipmap bo object are big enough to cover this resource. | 1021 | * the texture and mipmap bo object are big enough to cover this resource. |
987 | */ | 1022 | */ |
988 | static inline int r600_check_texture_resource(struct radeon_cs_parser *p, u32 idx, | 1023 | static inline int r600_check_texture_resource(struct radeon_cs_parser *p, u32 idx, |
989 | struct radeon_bo *texture, | 1024 | struct radeon_bo *texture, |
990 | struct radeon_bo *mipmap) | 1025 | struct radeon_bo *mipmap, |
1026 | u32 tiling_flags) | ||
991 | { | 1027 | { |
992 | u32 nfaces, nlevels, blevel, w0, h0, d0, bpe = 0; | 1028 | u32 nfaces, nlevels, blevel, w0, h0, d0, bpe = 0; |
993 | u32 word0, word1, l0_size, mipmap_size; | 1029 | u32 word0, word1, l0_size, mipmap_size; |
@@ -995,7 +1031,12 @@ static inline int r600_check_texture_resource(struct radeon_cs_parser *p, u32 i | |||
995 | /* on legacy kernel we don't perform advanced check */ | 1031 | /* on legacy kernel we don't perform advanced check */ |
996 | if (p->rdev == NULL) | 1032 | if (p->rdev == NULL) |
997 | return 0; | 1033 | return 0; |
1034 | |||
998 | word0 = radeon_get_ib_value(p, idx + 0); | 1035 | word0 = radeon_get_ib_value(p, idx + 0); |
1036 | if (tiling_flags & RADEON_TILING_MACRO) | ||
1037 | word0 |= S_038000_TILE_MODE(V_038000_ARRAY_2D_TILED_THIN1); | ||
1038 | else if (tiling_flags & RADEON_TILING_MICRO) | ||
1039 | word0 |= S_038000_TILE_MODE(V_038000_ARRAY_1D_TILED_THIN1); | ||
999 | word1 = radeon_get_ib_value(p, idx + 1); | 1040 | word1 = radeon_get_ib_value(p, idx + 1); |
1000 | w0 = G_038000_TEX_WIDTH(word0) + 1; | 1041 | w0 = G_038000_TEX_WIDTH(word0) + 1; |
1001 | h0 = G_038004_TEX_HEIGHT(word1) + 1; | 1042 | h0 = G_038004_TEX_HEIGHT(word1) + 1; |
@@ -1240,6 +1281,10 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
1240 | return -EINVAL; | 1281 | return -EINVAL; |
1241 | } | 1282 | } |
1242 | ib[idx+1+(i*7)+2] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); | 1283 | ib[idx+1+(i*7)+2] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); |
1284 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) | ||
1285 | ib[idx+1+(i*7)+0] |= S_038000_TILE_MODE(V_038000_ARRAY_2D_TILED_THIN1); | ||
1286 | else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) | ||
1287 | ib[idx+1+(i*7)+0] |= S_038000_TILE_MODE(V_038000_ARRAY_1D_TILED_THIN1); | ||
1243 | texture = reloc->robj; | 1288 | texture = reloc->robj; |
1244 | /* tex mip base */ | 1289 | /* tex mip base */ |
1245 | r = r600_cs_packet_next_reloc(p, &reloc); | 1290 | r = r600_cs_packet_next_reloc(p, &reloc); |
@@ -1250,7 +1295,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
1250 | ib[idx+1+(i*7)+3] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); | 1295 | ib[idx+1+(i*7)+3] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); |
1251 | mipmap = reloc->robj; | 1296 | mipmap = reloc->robj; |
1252 | r = r600_check_texture_resource(p, idx+(i*7)+1, | 1297 | r = r600_check_texture_resource(p, idx+(i*7)+1, |
1253 | texture, mipmap); | 1298 | texture, mipmap, reloc->lobj.tiling_flags); |
1254 | if (r) | 1299 | if (r) |
1255 | return r; | 1300 | return r; |
1256 | break; | 1301 | break; |
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index 23205f032872..b7318ac4f84a 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h | |||
@@ -1159,6 +1159,10 @@ | |||
1159 | #define S_038000_TILE_MODE(x) (((x) & 0xF) << 3) | 1159 | #define S_038000_TILE_MODE(x) (((x) & 0xF) << 3) |
1160 | #define G_038000_TILE_MODE(x) (((x) >> 3) & 0xF) | 1160 | #define G_038000_TILE_MODE(x) (((x) >> 3) & 0xF) |
1161 | #define C_038000_TILE_MODE 0xFFFFFF87 | 1161 | #define C_038000_TILE_MODE 0xFFFFFF87 |
1162 | #define V_038000_ARRAY_LINEAR_GENERAL 0x00000000 | ||
1163 | #define V_038000_ARRAY_LINEAR_ALIGNED 0x00000001 | ||
1164 | #define V_038000_ARRAY_1D_TILED_THIN1 0x00000002 | ||
1165 | #define V_038000_ARRAY_2D_TILED_THIN1 0x00000004 | ||
1162 | #define S_038000_TILE_TYPE(x) (((x) & 0x1) << 7) | 1166 | #define S_038000_TILE_TYPE(x) (((x) & 0x1) << 7) |
1163 | #define G_038000_TILE_TYPE(x) (((x) >> 7) & 0x1) | 1167 | #define G_038000_TILE_TYPE(x) (((x) >> 7) & 0x1) |
1164 | #define C_038000_TILE_TYPE 0xFFFFFF7F | 1168 | #define C_038000_TILE_TYPE 0xFFFFFF7F |
@@ -1362,6 +1366,8 @@ | |||
1362 | #define S_028010_ARRAY_MODE(x) (((x) & 0xF) << 15) | 1366 | #define S_028010_ARRAY_MODE(x) (((x) & 0xF) << 15) |
1363 | #define G_028010_ARRAY_MODE(x) (((x) >> 15) & 0xF) | 1367 | #define G_028010_ARRAY_MODE(x) (((x) >> 15) & 0xF) |
1364 | #define C_028010_ARRAY_MODE 0xFFF87FFF | 1368 | #define C_028010_ARRAY_MODE 0xFFF87FFF |
1369 | #define V_028010_ARRAY_1D_TILED_THIN1 0x00000002 | ||
1370 | #define V_028010_ARRAY_2D_TILED_THIN1 0x00000004 | ||
1365 | #define S_028010_TILE_SURFACE_ENABLE(x) (((x) & 0x1) << 25) | 1371 | #define S_028010_TILE_SURFACE_ENABLE(x) (((x) & 0x1) << 25) |
1366 | #define G_028010_TILE_SURFACE_ENABLE(x) (((x) >> 25) & 0x1) | 1372 | #define G_028010_TILE_SURFACE_ENABLE(x) (((x) >> 25) & 0x1) |
1367 | #define C_028010_TILE_SURFACE_ENABLE 0xFDFFFFFF | 1373 | #define C_028010_TILE_SURFACE_ENABLE 0xFDFFFFFF |