Subversion Repositories Kolibri OS

Rev

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) {