aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorAlex Deucher <alexdeucher@gmail.com>2010-05-20 12:43:52 -0400
committerDave Airlie <airlied@redhat.com>2010-08-01 20:00:03 -0400
commit7f813377203a60be01a3354664edc5d3c746100d (patch)
tree22261aa7bc82a6b2e6f183cbda66ff79e7277fe6 /drivers/gpu
parent97d663285322b3db05613d274b1eb3f9806f37ca (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.c57
-rw-r--r--drivers/gpu/drm/radeon/r600d.h6
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 */
988static inline int r600_check_texture_resource(struct radeon_cs_parser *p, u32 idx, 1023static 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