Rev 3192 | Rev 5078 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3192 | Rev 3764 | ||
---|---|---|---|
Line 65... | Line 65... | ||
65 | /* This files gather functions specifics to: |
65 | /* This files gather functions specifics to: |
66 | * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 |
66 | * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 |
67 | * and others in some cases. |
67 | * and others in some cases. |
68 | */ |
68 | */ |
Line -... | Line 69... | ||
- | 69 | ||
- | 70 | static bool r100_is_in_vblank(struct radeon_device *rdev, int crtc) |
|
- | 71 | { |
|
- | 72 | if (crtc == 0) { |
|
- | 73 | if (RREG32(RADEON_CRTC_STATUS) & RADEON_CRTC_VBLANK_CUR) |
|
- | 74 | return true; |
|
- | 75 | else |
|
- | 76 | return false; |
|
- | 77 | } else { |
|
- | 78 | if (RREG32(RADEON_CRTC2_STATUS) & RADEON_CRTC2_VBLANK_CUR) |
|
- | 79 | return true; |
|
- | 80 | else |
|
- | 81 | return false; |
|
- | 82 | } |
|
- | 83 | } |
|
- | 84 | ||
- | 85 | static bool r100_is_counter_moving(struct radeon_device *rdev, int crtc) |
|
- | 86 | { |
|
- | 87 | u32 vline1, vline2; |
|
- | 88 | ||
- | 89 | if (crtc == 0) { |
|
- | 90 | vline1 = (RREG32(RADEON_CRTC_VLINE_CRNT_VLINE) >> 16) & RADEON_CRTC_V_TOTAL; |
|
- | 91 | vline2 = (RREG32(RADEON_CRTC_VLINE_CRNT_VLINE) >> 16) & RADEON_CRTC_V_TOTAL; |
|
- | 92 | } else { |
|
- | 93 | vline1 = (RREG32(RADEON_CRTC2_VLINE_CRNT_VLINE) >> 16) & RADEON_CRTC_V_TOTAL; |
|
- | 94 | vline2 = (RREG32(RADEON_CRTC2_VLINE_CRNT_VLINE) >> 16) & RADEON_CRTC_V_TOTAL; |
|
- | 95 | } |
|
- | 96 | if (vline1 != vline2) |
|
- | 97 | return true; |
|
- | 98 | else |
|
- | 99 | return false; |
|
- | 100 | } |
|
69 | 101 | ||
70 | /** |
102 | /** |
71 | * r100_wait_for_vblank - vblank wait asic callback. |
103 | * r100_wait_for_vblank - vblank wait asic callback. |
72 | * |
104 | * |
73 | * @rdev: radeon_device pointer |
105 | * @rdev: radeon_device pointer |
74 | * @crtc: crtc to wait for vblank on |
106 | * @crtc: crtc to wait for vblank on |
75 | * |
107 | * |
76 | * Wait for vblank on the requested crtc (r1xx-r4xx). |
108 | * Wait for vblank on the requested crtc (r1xx-r4xx). |
77 | */ |
109 | */ |
78 | void r100_wait_for_vblank(struct radeon_device *rdev, int crtc) |
110 | void r100_wait_for_vblank(struct radeon_device *rdev, int crtc) |
79 | { |
111 | { |
Line 80... | Line 112... | ||
80 | int i; |
112 | unsigned i = 0; |
81 | 113 | ||
Line 82... | Line 114... | ||
82 | if (crtc >= rdev->num_crtc) |
114 | if (crtc >= rdev->num_crtc) |
83 | return; |
115 | return; |
84 | 116 | ||
- | 117 | if (crtc == 0) { |
|
85 | if (crtc == 0) { |
118 | if (!(RREG32(RADEON_CRTC_GEN_CNTL) & RADEON_CRTC_EN)) |
86 | if (RREG32(RADEON_CRTC_GEN_CNTL) & RADEON_CRTC_EN) { |
119 | return; |
87 | for (i = 0; i < rdev->usec_timeout; i++) { |
- | |
88 | if (!(RREG32(RADEON_CRTC_STATUS) & RADEON_CRTC_VBLANK_CUR)) |
120 | } else { |
- | 121 | if (!(RREG32(RADEON_CRTC2_GEN_CNTL) & RADEON_CRTC2_EN)) |
|
- | 122 | return; |
|
- | 123 | } |
|
- | 124 | ||
89 | break; |
125 | /* depending on when we hit vblank, we may be close to active; if so, |
- | 126 | * wait for another frame. |
|
90 | udelay(1); |
127 | */ |
91 | } |
128 | while (r100_is_in_vblank(rdev, crtc)) { |
92 | for (i = 0; i < rdev->usec_timeout; i++) { |
- | |
93 | if (RREG32(RADEON_CRTC_STATUS) & RADEON_CRTC_VBLANK_CUR) |
129 | if (i++ % 100 == 0) { |
94 | break; |
130 | if (!r100_is_counter_moving(rdev, crtc)) |
95 | udelay(1); |
131 | break; |
96 | } |
- | |
97 | } |
132 | } |
98 | } else { |
- | |
99 | if (RREG32(RADEON_CRTC2_GEN_CNTL) & RADEON_CRTC2_EN) { |
- | |
100 | for (i = 0; i < rdev->usec_timeout; i++) { |
133 | } |
101 | if (!(RREG32(RADEON_CRTC2_STATUS) & RADEON_CRTC2_VBLANK_CUR)) |
- | |
102 | break; |
134 | |
103 | udelay(1); |
- | |
104 | } |
135 | while (!r100_is_in_vblank(rdev, crtc)) { |
105 | for (i = 0; i < rdev->usec_timeout; i++) { |
- | |
106 | if (RREG32(RADEON_CRTC2_STATUS) & RADEON_CRTC2_VBLANK_CUR) |
- | |
107 | break; |
136 | if (i++ % 100 == 0) { |
108 | udelay(1); |
137 | if (!r100_is_counter_moving(rdev, crtc)) |
109 | } |
138 | break; |
110 | } |
139 | } |
111 | } |
140 | } |
Line 855... | Line 884... | ||
855 | u32 tile_flags = 0; |
884 | u32 tile_flags = 0; |
856 | u32 tmp; |
885 | u32 tmp; |
857 | struct radeon_cs_reloc *reloc; |
886 | struct radeon_cs_reloc *reloc; |
858 | u32 value; |
887 | u32 value; |
Line 859... | Line 888... | ||
859 | 888 | ||
860 | r = r100_cs_packet_next_reloc(p, &reloc); |
889 | r = radeon_cs_packet_next_reloc(p, &reloc, 0); |
861 | if (r) { |
890 | if (r) { |
862 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
891 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
863 | idx, reg); |
892 | idx, reg); |
864 | r100_cs_dump_packet(p, pkt); |
893 | radeon_cs_dump_packet(p, pkt); |
865 | return r; |
894 | return r; |
Line 866... | Line 895... | ||
866 | } |
895 | } |
867 | 896 | ||
Line 873... | Line 902... | ||
873 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
902 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
874 | tile_flags |= RADEON_DST_TILE_MACRO; |
903 | tile_flags |= RADEON_DST_TILE_MACRO; |
875 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) { |
904 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) { |
876 | if (reg == RADEON_SRC_PITCH_OFFSET) { |
905 | if (reg == RADEON_SRC_PITCH_OFFSET) { |
877 | DRM_ERROR("Cannot src blit from microtiled surface\n"); |
906 | DRM_ERROR("Cannot src blit from microtiled surface\n"); |
878 | r100_cs_dump_packet(p, pkt); |
907 | radeon_cs_dump_packet(p, pkt); |
879 | return -EINVAL; |
908 | return -EINVAL; |
880 | } |
909 | } |
881 | tile_flags |= RADEON_DST_TILE_MICRO; |
910 | tile_flags |= RADEON_DST_TILE_MICRO; |
882 | } |
911 | } |
Line 903... | Line 932... | ||
903 | track = (struct r100_cs_track *)p->track; |
932 | track = (struct r100_cs_track *)p->track; |
904 | c = radeon_get_ib_value(p, idx++) & 0x1F; |
933 | c = radeon_get_ib_value(p, idx++) & 0x1F; |
905 | if (c > 16) { |
934 | if (c > 16) { |
906 | DRM_ERROR("Only 16 vertex buffers are allowed %d\n", |
935 | DRM_ERROR("Only 16 vertex buffers are allowed %d\n", |
907 | pkt->opcode); |
936 | pkt->opcode); |
908 | r100_cs_dump_packet(p, pkt); |
937 | radeon_cs_dump_packet(p, pkt); |
909 | return -EINVAL; |
938 | return -EINVAL; |
910 | } |
939 | } |
911 | track->num_arrays = c; |
940 | track->num_arrays = c; |
912 | for (i = 0; i < (c - 1); i+=2, idx+=3) { |
941 | for (i = 0; i < (c - 1); i+=2, idx+=3) { |
913 | r = r100_cs_packet_next_reloc(p, &reloc); |
942 | r = radeon_cs_packet_next_reloc(p, &reloc, 0); |
914 | if (r) { |
943 | if (r) { |
915 | DRM_ERROR("No reloc for packet3 %d\n", |
944 | DRM_ERROR("No reloc for packet3 %d\n", |
916 | pkt->opcode); |
945 | pkt->opcode); |
917 | r100_cs_dump_packet(p, pkt); |
946 | radeon_cs_dump_packet(p, pkt); |
918 | return r; |
947 | return r; |
919 | } |
948 | } |
920 | idx_value = radeon_get_ib_value(p, idx); |
949 | idx_value = radeon_get_ib_value(p, idx); |
921 | ib[idx+1] = radeon_get_ib_value(p, idx + 1) + ((u32)reloc->lobj.gpu_offset); |
950 | ib[idx+1] = radeon_get_ib_value(p, idx + 1) + ((u32)reloc->lobj.gpu_offset); |
Line 922... | Line 951... | ||
922 | 951 | ||
923 | track->arrays[i + 0].esize = idx_value >> 8; |
952 | track->arrays[i + 0].esize = idx_value >> 8; |
924 | track->arrays[i + 0].robj = reloc->robj; |
953 | track->arrays[i + 0].robj = reloc->robj; |
925 | track->arrays[i + 0].esize &= 0x7F; |
954 | track->arrays[i + 0].esize &= 0x7F; |
926 | r = r100_cs_packet_next_reloc(p, &reloc); |
955 | r = radeon_cs_packet_next_reloc(p, &reloc, 0); |
927 | if (r) { |
956 | if (r) { |
928 | DRM_ERROR("No reloc for packet3 %d\n", |
957 | DRM_ERROR("No reloc for packet3 %d\n", |
929 | pkt->opcode); |
958 | pkt->opcode); |
930 | r100_cs_dump_packet(p, pkt); |
959 | radeon_cs_dump_packet(p, pkt); |
931 | return r; |
960 | return r; |
932 | } |
961 | } |
933 | ib[idx+2] = radeon_get_ib_value(p, idx + 2) + ((u32)reloc->lobj.gpu_offset); |
962 | ib[idx+2] = radeon_get_ib_value(p, idx + 2) + ((u32)reloc->lobj.gpu_offset); |
934 | track->arrays[i + 1].robj = reloc->robj; |
963 | track->arrays[i + 1].robj = reloc->robj; |
935 | track->arrays[i + 1].esize = idx_value >> 24; |
964 | track->arrays[i + 1].esize = idx_value >> 24; |
936 | track->arrays[i + 1].esize &= 0x7F; |
965 | track->arrays[i + 1].esize &= 0x7F; |
937 | } |
966 | } |
938 | if (c & 1) { |
967 | if (c & 1) { |
939 | r = r100_cs_packet_next_reloc(p, &reloc); |
968 | r = radeon_cs_packet_next_reloc(p, &reloc, 0); |
940 | if (r) { |
969 | if (r) { |
941 | DRM_ERROR("No reloc for packet3 %d\n", |
970 | DRM_ERROR("No reloc for packet3 %d\n", |
942 | pkt->opcode); |
971 | pkt->opcode); |
943 | r100_cs_dump_packet(p, pkt); |
972 | radeon_cs_dump_packet(p, pkt); |
944 | return r; |
973 | return r; |
945 | } |
974 | } |
946 | idx_value = radeon_get_ib_value(p, idx); |
975 | idx_value = radeon_get_ib_value(p, idx); |
947 | ib[idx+1] = radeon_get_ib_value(p, idx + 1) + ((u32)reloc->lobj.gpu_offset); |
976 | ib[idx+1] = radeon_get_ib_value(p, idx + 1) + ((u32)reloc->lobj.gpu_offset); |
Line 1084... | Line 1113... | ||
1084 | volatile uint32_t *ib; |
1113 | volatile uint32_t *ib; |
Line 1085... | Line 1114... | ||
1085 | 1114 | ||
Line 1086... | Line 1115... | ||
1086 | ib = p->ib.ptr; |
1115 | ib = p->ib.ptr; |
1087 | 1116 | ||
1088 | /* parse the wait until */ |
1117 | /* parse the wait until */ |
1089 | r = r100_cs_packet_parse(p, &waitreloc, p->idx); |
1118 | r = radeon_cs_packet_parse(p, &waitreloc, p->idx); |
Line 1090... | Line 1119... | ||
1090 | if (r) |
1119 | if (r) |
1091 | return r; |
1120 | return r; |
Line 1101... | Line 1130... | ||
1101 | DRM_ERROR("vline wait had illegal wait until\n"); |
1130 | DRM_ERROR("vline wait had illegal wait until\n"); |
1102 | return -EINVAL; |
1131 | return -EINVAL; |
1103 | } |
1132 | } |
Line 1104... | Line 1133... | ||
1104 | 1133 | ||
1105 | /* jump over the NOP */ |
1134 | /* jump over the NOP */ |
1106 | r = r100_cs_packet_parse(p, &p3reloc, p->idx + waitreloc.count + 2); |
1135 | r = radeon_cs_packet_parse(p, &p3reloc, p->idx + waitreloc.count + 2); |
1107 | if (r) |
1136 | if (r) |
Line 1108... | Line 1137... | ||
1108 | return r; |
1137 | return r; |
1109 | 1138 | ||
1110 | h_idx = p->idx - 2; |
1139 | h_idx = p->idx - 2; |
Line 1111... | Line 1140... | ||
1111 | p->idx += waitreloc.count + 2; |
1140 | p->idx += waitreloc.count + 2; |
1112 | p->idx += p3reloc.count + 2; |
1141 | p->idx += p3reloc.count + 2; |
1113 | 1142 | ||
1114 | header = radeon_get_ib_value(p, h_idx); |
1143 | header = radeon_get_ib_value(p, h_idx); |
1115 | crtc_id = radeon_get_ib_value(p, h_idx + 5); |
1144 | crtc_id = radeon_get_ib_value(p, h_idx + 5); |
1116 | reg = CP_PACKET0_GET_REG(header); |
1145 | reg = R100_CP_PACKET0_GET_REG(header); |
1117 | obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC); |
1146 | obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC); |
1118 | if (!obj) { |
1147 | if (!obj) { |
Line 1146... | Line 1175... | ||
1146 | } |
1175 | } |
Line 1147... | Line 1176... | ||
1147 | 1176 | ||
1148 | return 0; |
1177 | return 0; |
Line 1149... | Line -... | ||
1149 | } |
- | |
1150 | - | ||
1151 | /** |
- | |
1152 | * r100_cs_packet_next_reloc() - parse next packet which should be reloc packet3 |
- | |
1153 | * @parser: parser structure holding parsing context. |
- | |
1154 | * @data: pointer to relocation data |
- | |
1155 | * @offset_start: starting offset |
- | |
1156 | * @offset_mask: offset mask (to align start offset on) |
- | |
1157 | * @reloc: reloc informations |
- | |
1158 | * |
- | |
1159 | * Check next packet is relocation packet3, do bo validation and compute |
- | |
1160 | * GPU offset using the provided start. |
- | |
1161 | **/ |
- | |
1162 | int r100_cs_packet_next_reloc(struct radeon_cs_parser *p, |
- | |
1163 | struct radeon_cs_reloc **cs_reloc) |
- | |
1164 | { |
- | |
1165 | struct radeon_cs_chunk *relocs_chunk; |
- | |
1166 | struct radeon_cs_packet p3reloc; |
- | |
1167 | unsigned idx; |
- | |
1168 | int r; |
- | |
1169 | - | ||
1170 | if (p->chunk_relocs_idx == -1) { |
- | |
1171 | DRM_ERROR("No relocation chunk !\n"); |
- | |
1172 | return -EINVAL; |
- | |
1173 | } |
- | |
1174 | *cs_reloc = NULL; |
- | |
1175 | relocs_chunk = &p->chunks[p->chunk_relocs_idx]; |
- | |
1176 | r = r100_cs_packet_parse(p, &p3reloc, p->idx); |
- | |
1177 | if (r) { |
- | |
1178 | return r; |
- | |
1179 | } |
- | |
1180 | p->idx += p3reloc.count + 2; |
- | |
1181 | if (p3reloc.type != PACKET_TYPE3 || p3reloc.opcode != PACKET3_NOP) { |
- | |
1182 | DRM_ERROR("No packet3 for relocation for packet at %d.\n", |
- | |
1183 | p3reloc.idx); |
- | |
1184 | r100_cs_dump_packet(p, &p3reloc); |
- | |
1185 | return -EINVAL; |
- | |
1186 | } |
- | |
1187 | idx = radeon_get_ib_value(p, p3reloc.idx + 1); |
- | |
1188 | if (idx >= relocs_chunk->length_dw) { |
- | |
1189 | DRM_ERROR("Relocs at %d after relocations chunk end %d !\n", |
- | |
1190 | idx, relocs_chunk->length_dw); |
- | |
1191 | r100_cs_dump_packet(p, &p3reloc); |
- | |
1192 | return -EINVAL; |
- | |
1193 | } |
- | |
1194 | /* FIXME: we assume reloc size is 4 dwords */ |
- | |
1195 | *cs_reloc = p->relocs_ptr[(idx / 4)]; |
- | |
1196 | return 0; |
- | |
1197 | } |
1178 | } |
1198 | 1179 | ||
1199 | static int r100_get_vtx_size(uint32_t vtx_fmt) |
1180 | static int r100_get_vtx_size(uint32_t vtx_fmt) |
1200 | { |
1181 | { |
1201 | int vtx_size; |
1182 | int vtx_size; |
Line 1271... | Line 1252... | ||
1271 | case RADEON_CRTC_GUI_TRIG_VLINE: |
1252 | case RADEON_CRTC_GUI_TRIG_VLINE: |
1272 | r = r100_cs_packet_parse_vline(p); |
1253 | r = r100_cs_packet_parse_vline(p); |
1273 | if (r) { |
1254 | if (r) { |
1274 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1255 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1275 | idx, reg); |
1256 | idx, reg); |
1276 | r100_cs_dump_packet(p, pkt); |
1257 | radeon_cs_dump_packet(p, pkt); |
1277 | return r; |
1258 | return r; |
1278 | } |
1259 | } |
1279 | break; |
1260 | break; |
1280 | /* FIXME: only allow PACKET3 blit? easier to check for out of |
1261 | /* FIXME: only allow PACKET3 blit? easier to check for out of |
1281 | * range access */ |
1262 | * range access */ |
Line 1284... | Line 1265... | ||
1284 | r = r100_reloc_pitch_offset(p, pkt, idx, reg); |
1265 | r = r100_reloc_pitch_offset(p, pkt, idx, reg); |
1285 | if (r) |
1266 | if (r) |
1286 | return r; |
1267 | return r; |
1287 | break; |
1268 | break; |
1288 | case RADEON_RB3D_DEPTHOFFSET: |
1269 | case RADEON_RB3D_DEPTHOFFSET: |
1289 | r = r100_cs_packet_next_reloc(p, &reloc); |
1270 | r = radeon_cs_packet_next_reloc(p, &reloc, 0); |
1290 | if (r) { |
1271 | if (r) { |
1291 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1272 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1292 | idx, reg); |
1273 | idx, reg); |
1293 | r100_cs_dump_packet(p, pkt); |
1274 | radeon_cs_dump_packet(p, pkt); |
1294 | return r; |
1275 | return r; |
1295 | } |
1276 | } |
1296 | track->zb.robj = reloc->robj; |
1277 | track->zb.robj = reloc->robj; |
1297 | track->zb.offset = idx_value; |
1278 | track->zb.offset = idx_value; |
1298 | track->zb_dirty = true; |
1279 | track->zb_dirty = true; |
1299 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1280 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1300 | break; |
1281 | break; |
1301 | case RADEON_RB3D_COLOROFFSET: |
1282 | case RADEON_RB3D_COLOROFFSET: |
1302 | r = r100_cs_packet_next_reloc(p, &reloc); |
1283 | r = radeon_cs_packet_next_reloc(p, &reloc, 0); |
1303 | if (r) { |
1284 | if (r) { |
1304 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1285 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1305 | idx, reg); |
1286 | idx, reg); |
1306 | r100_cs_dump_packet(p, pkt); |
1287 | radeon_cs_dump_packet(p, pkt); |
1307 | return r; |
1288 | return r; |
1308 | } |
1289 | } |
1309 | track->cb[0].robj = reloc->robj; |
1290 | track->cb[0].robj = reloc->robj; |
1310 | track->cb[0].offset = idx_value; |
1291 | track->cb[0].offset = idx_value; |
1311 | track->cb_dirty = true; |
1292 | track->cb_dirty = true; |
Line 1313... | Line 1294... | ||
1313 | break; |
1294 | break; |
1314 | case RADEON_PP_TXOFFSET_0: |
1295 | case RADEON_PP_TXOFFSET_0: |
1315 | case RADEON_PP_TXOFFSET_1: |
1296 | case RADEON_PP_TXOFFSET_1: |
1316 | case RADEON_PP_TXOFFSET_2: |
1297 | case RADEON_PP_TXOFFSET_2: |
1317 | i = (reg - RADEON_PP_TXOFFSET_0) / 24; |
1298 | i = (reg - RADEON_PP_TXOFFSET_0) / 24; |
1318 | r = r100_cs_packet_next_reloc(p, &reloc); |
1299 | r = radeon_cs_packet_next_reloc(p, &reloc, 0); |
1319 | if (r) { |
1300 | if (r) { |
1320 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1301 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1321 | idx, reg); |
1302 | idx, reg); |
1322 | r100_cs_dump_packet(p, pkt); |
1303 | radeon_cs_dump_packet(p, pkt); |
1323 | return r; |
1304 | return r; |
1324 | } |
1305 | } |
1325 | if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) { |
1306 | if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) { |
1326 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
1307 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
1327 | tile_flags |= RADEON_TXO_MACRO_TILE; |
1308 | tile_flags |= RADEON_TXO_MACRO_TILE; |
Line 1340... | Line 1321... | ||
1340 | case RADEON_PP_CUBIC_OFFSET_T0_1: |
1321 | case RADEON_PP_CUBIC_OFFSET_T0_1: |
1341 | case RADEON_PP_CUBIC_OFFSET_T0_2: |
1322 | case RADEON_PP_CUBIC_OFFSET_T0_2: |
1342 | case RADEON_PP_CUBIC_OFFSET_T0_3: |
1323 | case RADEON_PP_CUBIC_OFFSET_T0_3: |
1343 | case RADEON_PP_CUBIC_OFFSET_T0_4: |
1324 | case RADEON_PP_CUBIC_OFFSET_T0_4: |
1344 | i = (reg - RADEON_PP_CUBIC_OFFSET_T0_0) / 4; |
1325 | i = (reg - RADEON_PP_CUBIC_OFFSET_T0_0) / 4; |
1345 | r = r100_cs_packet_next_reloc(p, &reloc); |
1326 | r = radeon_cs_packet_next_reloc(p, &reloc, 0); |
1346 | if (r) { |
1327 | if (r) { |
1347 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1328 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1348 | idx, reg); |
1329 | idx, reg); |
1349 | r100_cs_dump_packet(p, pkt); |
1330 | radeon_cs_dump_packet(p, pkt); |
1350 | return r; |
1331 | return r; |
1351 | } |
1332 | } |
1352 | track->textures[0].cube_info[i].offset = idx_value; |
1333 | track->textures[0].cube_info[i].offset = idx_value; |
1353 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1334 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1354 | track->textures[0].cube_info[i].robj = reloc->robj; |
1335 | track->textures[0].cube_info[i].robj = reloc->robj; |
Line 1358... | Line 1339... | ||
1358 | case RADEON_PP_CUBIC_OFFSET_T1_1: |
1339 | case RADEON_PP_CUBIC_OFFSET_T1_1: |
1359 | case RADEON_PP_CUBIC_OFFSET_T1_2: |
1340 | case RADEON_PP_CUBIC_OFFSET_T1_2: |
1360 | case RADEON_PP_CUBIC_OFFSET_T1_3: |
1341 | case RADEON_PP_CUBIC_OFFSET_T1_3: |
1361 | case RADEON_PP_CUBIC_OFFSET_T1_4: |
1342 | case RADEON_PP_CUBIC_OFFSET_T1_4: |
1362 | i = (reg - RADEON_PP_CUBIC_OFFSET_T1_0) / 4; |
1343 | i = (reg - RADEON_PP_CUBIC_OFFSET_T1_0) / 4; |
1363 | r = r100_cs_packet_next_reloc(p, &reloc); |
1344 | r = radeon_cs_packet_next_reloc(p, &reloc, 0); |
1364 | if (r) { |
1345 | if (r) { |
1365 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1346 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1366 | idx, reg); |
1347 | idx, reg); |
1367 | r100_cs_dump_packet(p, pkt); |
1348 | radeon_cs_dump_packet(p, pkt); |
1368 | return r; |
1349 | return r; |
1369 | } |
1350 | } |
1370 | track->textures[1].cube_info[i].offset = idx_value; |
1351 | track->textures[1].cube_info[i].offset = idx_value; |
1371 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1352 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1372 | track->textures[1].cube_info[i].robj = reloc->robj; |
1353 | track->textures[1].cube_info[i].robj = reloc->robj; |
Line 1376... | Line 1357... | ||
1376 | case RADEON_PP_CUBIC_OFFSET_T2_1: |
1357 | case RADEON_PP_CUBIC_OFFSET_T2_1: |
1377 | case RADEON_PP_CUBIC_OFFSET_T2_2: |
1358 | case RADEON_PP_CUBIC_OFFSET_T2_2: |
1378 | case RADEON_PP_CUBIC_OFFSET_T2_3: |
1359 | case RADEON_PP_CUBIC_OFFSET_T2_3: |
1379 | case RADEON_PP_CUBIC_OFFSET_T2_4: |
1360 | case RADEON_PP_CUBIC_OFFSET_T2_4: |
1380 | i = (reg - RADEON_PP_CUBIC_OFFSET_T2_0) / 4; |
1361 | i = (reg - RADEON_PP_CUBIC_OFFSET_T2_0) / 4; |
1381 | r = r100_cs_packet_next_reloc(p, &reloc); |
1362 | r = radeon_cs_packet_next_reloc(p, &reloc, 0); |
1382 | if (r) { |
1363 | if (r) { |
1383 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1364 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1384 | idx, reg); |
1365 | idx, reg); |
1385 | r100_cs_dump_packet(p, pkt); |
1366 | radeon_cs_dump_packet(p, pkt); |
1386 | return r; |
1367 | return r; |
1387 | } |
1368 | } |
1388 | track->textures[2].cube_info[i].offset = idx_value; |
1369 | track->textures[2].cube_info[i].offset = idx_value; |
1389 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1370 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1390 | track->textures[2].cube_info[i].robj = reloc->robj; |
1371 | track->textures[2].cube_info[i].robj = reloc->robj; |
Line 1394... | Line 1375... | ||
1394 | track->maxy = ((idx_value >> 16) & 0x7FF); |
1375 | track->maxy = ((idx_value >> 16) & 0x7FF); |
1395 | track->cb_dirty = true; |
1376 | track->cb_dirty = true; |
1396 | track->zb_dirty = true; |
1377 | track->zb_dirty = true; |
1397 | break; |
1378 | break; |
1398 | case RADEON_RB3D_COLORPITCH: |
1379 | case RADEON_RB3D_COLORPITCH: |
1399 | r = r100_cs_packet_next_reloc(p, &reloc); |
1380 | r = radeon_cs_packet_next_reloc(p, &reloc, 0); |
1400 | if (r) { |
1381 | if (r) { |
1401 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1382 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1402 | idx, reg); |
1383 | idx, reg); |
1403 | r100_cs_dump_packet(p, pkt); |
1384 | radeon_cs_dump_packet(p, pkt); |
1404 | return r; |
1385 | return r; |
1405 | } |
1386 | } |
1406 | if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) { |
1387 | if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) { |
1407 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
1388 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
1408 | tile_flags |= RADEON_COLOR_TILE_ENABLE; |
1389 | tile_flags |= RADEON_COLOR_TILE_ENABLE; |
Line 1465... | Line 1446... | ||
1465 | break; |
1446 | break; |
1466 | } |
1447 | } |
1467 | track->zb_dirty = true; |
1448 | track->zb_dirty = true; |
1468 | break; |
1449 | break; |
1469 | case RADEON_RB3D_ZPASS_ADDR: |
1450 | case RADEON_RB3D_ZPASS_ADDR: |
1470 | r = r100_cs_packet_next_reloc(p, &reloc); |
1451 | r = radeon_cs_packet_next_reloc(p, &reloc, 0); |
1471 | if (r) { |
1452 | if (r) { |
1472 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1453 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1473 | idx, reg); |
1454 | idx, reg); |
1474 | r100_cs_dump_packet(p, pkt); |
1455 | radeon_cs_dump_packet(p, pkt); |
1475 | return r; |
1456 | return r; |
1476 | } |
1457 | } |
1477 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1458 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1478 | break; |
1459 | break; |
1479 | case RADEON_PP_CNTL: |
1460 | case RADEON_PP_CNTL: |
Line 1626... | Line 1607... | ||
1626 | r = r100_packet3_load_vbpntr(p, pkt, idx); |
1607 | r = r100_packet3_load_vbpntr(p, pkt, idx); |
1627 | if (r) |
1608 | if (r) |
1628 | return r; |
1609 | return r; |
1629 | break; |
1610 | break; |
1630 | case PACKET3_INDX_BUFFER: |
1611 | case PACKET3_INDX_BUFFER: |
1631 | r = r100_cs_packet_next_reloc(p, &reloc); |
1612 | r = radeon_cs_packet_next_reloc(p, &reloc, 0); |
1632 | if (r) { |
1613 | if (r) { |
1633 | DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode); |
1614 | DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode); |
1634 | r100_cs_dump_packet(p, pkt); |
1615 | radeon_cs_dump_packet(p, pkt); |
1635 | return r; |
1616 | return r; |
1636 | } |
1617 | } |
1637 | ib[idx+1] = radeon_get_ib_value(p, idx+1) + ((u32)reloc->lobj.gpu_offset); |
1618 | ib[idx+1] = radeon_get_ib_value(p, idx+1) + ((u32)reloc->lobj.gpu_offset); |
1638 | r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj); |
1619 | r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj); |
1639 | if (r) { |
1620 | if (r) { |
1640 | return r; |
1621 | return r; |
1641 | } |
1622 | } |
1642 | break; |
1623 | break; |
1643 | case 0x23: |
1624 | case 0x23: |
1644 | /* 3D_RNDR_GEN_INDX_PRIM on r100/r200 */ |
1625 | /* 3D_RNDR_GEN_INDX_PRIM on r100/r200 */ |
1645 | r = r100_cs_packet_next_reloc(p, &reloc); |
1626 | r = radeon_cs_packet_next_reloc(p, &reloc, 0); |
1646 | if (r) { |
1627 | if (r) { |
1647 | DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode); |
1628 | DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode); |
1648 | r100_cs_dump_packet(p, pkt); |
1629 | radeon_cs_dump_packet(p, pkt); |
1649 | return r; |
1630 | return r; |
1650 | } |
1631 | } |
1651 | ib[idx] = radeon_get_ib_value(p, idx) + ((u32)reloc->lobj.gpu_offset); |
1632 | ib[idx] = radeon_get_ib_value(p, idx) + ((u32)reloc->lobj.gpu_offset); |
1652 | track->num_arrays = 1; |
1633 | track->num_arrays = 1; |
1653 | track->vtx_size = r100_get_vtx_size(radeon_get_ib_value(p, idx + 2)); |
1634 | track->vtx_size = r100_get_vtx_size(radeon_get_ib_value(p, idx + 2)); |
Line 1740... | Line 1721... | ||
1740 | if (!track) |
1721 | if (!track) |
1741 | return -ENOMEM; |
1722 | return -ENOMEM; |
1742 | r100_cs_track_clear(p->rdev, track); |
1723 | r100_cs_track_clear(p->rdev, track); |
1743 | p->track = track; |
1724 | p->track = track; |
1744 | do { |
1725 | do { |
1745 | r = r100_cs_packet_parse(p, &pkt, p->idx); |
1726 | r = radeon_cs_packet_parse(p, &pkt, p->idx); |
1746 | if (r) { |
1727 | if (r) { |
1747 | return r; |
1728 | return r; |
1748 | } |
1729 | } |
1749 | p->idx += pkt.count + 2; |
1730 | p->idx += pkt.count + 2; |
1750 | switch (pkt.type) { |
1731 | switch (pkt.type) { |
1751 | case PACKET_TYPE0: |
1732 | case RADEON_PACKET_TYPE0: |
1752 | if (p->rdev->family >= CHIP_R200) |
1733 | if (p->rdev->family >= CHIP_R200) |
1753 | r = r100_cs_parse_packet0(p, &pkt, |
1734 | r = r100_cs_parse_packet0(p, &pkt, |
1754 | p->rdev->config.r100.reg_safe_bm, |
1735 | p->rdev->config.r100.reg_safe_bm, |
1755 | p->rdev->config.r100.reg_safe_bm_size, |
1736 | p->rdev->config.r100.reg_safe_bm_size, |
1756 | &r200_packet0_check); |
1737 | &r200_packet0_check); |
Line 1758... | Line 1739... | ||
1758 | r = r100_cs_parse_packet0(p, &pkt, |
1739 | r = r100_cs_parse_packet0(p, &pkt, |
1759 | p->rdev->config.r100.reg_safe_bm, |
1740 | p->rdev->config.r100.reg_safe_bm, |
1760 | p->rdev->config.r100.reg_safe_bm_size, |
1741 | p->rdev->config.r100.reg_safe_bm_size, |
1761 | &r100_packet0_check); |
1742 | &r100_packet0_check); |
1762 | break; |
1743 | break; |
1763 | case PACKET_TYPE2: |
1744 | case RADEON_PACKET_TYPE2: |
1764 | break; |
1745 | break; |
1765 | case PACKET_TYPE3: |
1746 | case RADEON_PACKET_TYPE3: |
1766 | r = r100_packet3_check(p, &pkt); |
1747 | r = r100_packet3_check(p, &pkt); |
1767 | break; |
1748 | break; |
1768 | default: |
1749 | default: |
1769 | DRM_ERROR("Unknown packet type %d !\n", |
1750 | DRM_ERROR("Unknown packet type %d !\n", |
1770 | pkt.type); |
1751 | pkt.type); |
1771 | return -EINVAL; |
1752 | return -EINVAL; |
1772 | } |
1753 | } |
1773 | if (r) { |
1754 | if (r) |
1774 | return r; |
1755 | return r; |
1775 | } |
- | |
1776 | } while (p->idx < p->chunks[p->chunk_ib_idx].length_dw); |
1756 | } while (p->idx < p->chunks[p->chunk_ib_idx].length_dw); |
1777 | return 0; |
1757 | return 0; |
1778 | } |
1758 | } |
Line 1779... | Line 1759... | ||
1779 | 1759 | ||
Line 3591... | Line 3571... | ||
3591 | dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r); |
3571 | dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r); |
3592 | return r; |
3572 | return r; |
3593 | } |
3573 | } |
Line 3594... | Line 3574... | ||
3594 | 3574 | ||
- | 3575 | /* Enable IRQ */ |
|
- | 3576 | if (!rdev->irq.installed) { |
|
- | 3577 | r = radeon_irq_kms_init(rdev); |
|
- | 3578 | if (r) |
|
- | 3579 | return r; |
|
- | 3580 | } |
|
3595 | /* Enable IRQ */ |
3581 | |
3596 | r100_irq_set(rdev); |
3582 | r100_irq_set(rdev); |
3597 | rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
3583 | rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
3598 | /* 1M ring buffer */ |
3584 | /* 1M ring buffer */ |
3599 | r = r100_cp_init(rdev, 1024 * 1024); |
3585 | r = r100_cp_init(rdev, 1024 * 1024); |
Line 3689... | Line 3675... | ||
3689 | r100_mc_init(rdev); |
3675 | r100_mc_init(rdev); |
3690 | /* Fence driver */ |
3676 | /* Fence driver */ |
3691 | r = radeon_fence_driver_init(rdev); |
3677 | r = radeon_fence_driver_init(rdev); |
3692 | if (r) |
3678 | if (r) |
3693 | return r; |
3679 | return r; |
3694 | r = radeon_irq_kms_init(rdev); |
- | |
3695 | if (r) |
- | |
3696 | return r; |
- | |
3697 | /* Memory manager */ |
3680 | /* Memory manager */ |
3698 | r = radeon_bo_init(rdev); |
3681 | r = radeon_bo_init(rdev); |
3699 | if (r) |
3682 | if (r) |
3700 | return r; |
3683 | return r; |
3701 | if (rdev->flags & RADEON_IS_PCI) { |
3684 | if (rdev->flags & RADEON_IS_PCI) { |