@@ -945,7 +945,21 @@ i915_gem_check_execbuffer(struct drm_i915_gem_execbuffer2 *exec)
945
945
if (exec -> flags & __I915_EXEC_UNKNOWN_FLAGS )
946
946
return false;
947
947
948
- return ((exec -> batch_start_offset | exec -> batch_len ) & 0x7 ) == 0 ;
948
+ /* Kernel clipping was a DRI1 misfeature */
949
+ if (exec -> num_cliprects || exec -> cliprects_ptr )
950
+ return false;
951
+
952
+ if (exec -> DR4 == 0xffffffff ) {
953
+ DRM_DEBUG ("UXA submitting garbage DR4, fixing up\n" );
954
+ exec -> DR4 = 0 ;
955
+ }
956
+ if (exec -> DR1 || exec -> DR4 )
957
+ return false;
958
+
959
+ if ((exec -> batch_start_offset | exec -> batch_len ) & 0x7 )
960
+ return false;
961
+
962
+ return true;
949
963
}
950
964
951
965
static int
@@ -1109,47 +1123,6 @@ i915_reset_gen7_sol_offsets(struct drm_device *dev,
1109
1123
return 0 ;
1110
1124
}
1111
1125
1112
- static int
1113
- i915_emit_box (struct drm_i915_gem_request * req ,
1114
- struct drm_clip_rect * box ,
1115
- int DR1 , int DR4 )
1116
- {
1117
- struct intel_engine_cs * ring = req -> ring ;
1118
- int ret ;
1119
-
1120
- if (box -> y2 <= box -> y1 || box -> x2 <= box -> x1 ||
1121
- box -> y2 <= 0 || box -> x2 <= 0 ) {
1122
- DRM_ERROR ("Bad box %d,%d..%d,%d\n" ,
1123
- box -> x1 , box -> y1 , box -> x2 , box -> y2 );
1124
- return - EINVAL ;
1125
- }
1126
-
1127
- if (INTEL_INFO (ring -> dev )-> gen >= 4 ) {
1128
- ret = intel_ring_begin (req , 4 );
1129
- if (ret )
1130
- return ret ;
1131
-
1132
- intel_ring_emit (ring , GFX_OP_DRAWRECT_INFO_I965 );
1133
- intel_ring_emit (ring , (box -> x1 & 0xffff ) | box -> y1 << 16 );
1134
- intel_ring_emit (ring , ((box -> x2 - 1 ) & 0xffff ) | (box -> y2 - 1 ) << 16 );
1135
- intel_ring_emit (ring , DR4 );
1136
- } else {
1137
- ret = intel_ring_begin (req , 6 );
1138
- if (ret )
1139
- return ret ;
1140
-
1141
- intel_ring_emit (ring , GFX_OP_DRAWRECT_INFO );
1142
- intel_ring_emit (ring , DR1 );
1143
- intel_ring_emit (ring , (box -> x1 & 0xffff ) | box -> y1 << 16 );
1144
- intel_ring_emit (ring , ((box -> x2 - 1 ) & 0xffff ) | (box -> y2 - 1 ) << 16 );
1145
- intel_ring_emit (ring , DR4 );
1146
- intel_ring_emit (ring , 0 );
1147
- }
1148
- intel_ring_advance (ring );
1149
-
1150
- return 0 ;
1151
- }
1152
-
1153
1126
static struct drm_i915_gem_object *
1154
1127
i915_gem_execbuffer_parse (struct intel_engine_cs * ring ,
1155
1128
struct drm_i915_gem_exec_object2 * shadow_exec_entry ,
@@ -1208,65 +1181,21 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params,
1208
1181
struct drm_i915_gem_execbuffer2 * args ,
1209
1182
struct list_head * vmas )
1210
1183
{
1211
- struct drm_clip_rect * cliprects = NULL ;
1212
1184
struct drm_device * dev = params -> dev ;
1213
1185
struct intel_engine_cs * ring = params -> ring ;
1214
1186
struct drm_i915_private * dev_priv = dev -> dev_private ;
1215
1187
u64 exec_start , exec_len ;
1216
1188
int instp_mode ;
1217
1189
u32 instp_mask ;
1218
- int i , ret = 0 ;
1219
-
1220
- if (args -> num_cliprects != 0 ) {
1221
- if (ring != & dev_priv -> ring [RCS ]) {
1222
- DRM_DEBUG ("clip rectangles are only valid with the render ring\n" );
1223
- return - EINVAL ;
1224
- }
1225
-
1226
- if (INTEL_INFO (dev )-> gen >= 5 ) {
1227
- DRM_DEBUG ("clip rectangles are only valid on pre-gen5\n" );
1228
- return - EINVAL ;
1229
- }
1230
-
1231
- if (args -> num_cliprects > UINT_MAX / sizeof (* cliprects )) {
1232
- DRM_DEBUG ("execbuf with %u cliprects\n" ,
1233
- args -> num_cliprects );
1234
- return - EINVAL ;
1235
- }
1236
-
1237
- cliprects = kcalloc (args -> num_cliprects ,
1238
- sizeof (* cliprects ),
1239
- GFP_KERNEL );
1240
- if (cliprects == NULL ) {
1241
- ret = - ENOMEM ;
1242
- goto error ;
1243
- }
1244
-
1245
- if (copy_from_user (cliprects ,
1246
- to_user_ptr (args -> cliprects_ptr ),
1247
- sizeof (* cliprects )* args -> num_cliprects )) {
1248
- ret = - EFAULT ;
1249
- goto error ;
1250
- }
1251
- } else {
1252
- if (args -> DR4 == 0xffffffff ) {
1253
- DRM_DEBUG ("UXA submitting garbage DR4, fixing up\n" );
1254
- args -> DR4 = 0 ;
1255
- }
1256
-
1257
- if (args -> DR1 || args -> DR4 || args -> cliprects_ptr ) {
1258
- DRM_DEBUG ("0 cliprects but dirt in cliprects fields\n" );
1259
- return - EINVAL ;
1260
- }
1261
- }
1190
+ int ret ;
1262
1191
1263
1192
ret = i915_gem_execbuffer_move_to_gpu (params -> request , vmas );
1264
1193
if (ret )
1265
- goto error ;
1194
+ return ret ;
1266
1195
1267
1196
ret = i915_switch_context (params -> request );
1268
1197
if (ret )
1269
- goto error ;
1198
+ return ret ;
1270
1199
1271
1200
WARN (params -> ctx -> ppgtt && params -> ctx -> ppgtt -> pd_dirty_rings & (1 <<ring -> id ),
1272
1201
"%s didn't clear reload\n" , ring -> name );
@@ -1279,22 +1208,19 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params,
1279
1208
case I915_EXEC_CONSTANTS_REL_SURFACE :
1280
1209
if (instp_mode != 0 && ring != & dev_priv -> ring [RCS ]) {
1281
1210
DRM_DEBUG ("non-0 rel constants mode on non-RCS\n" );
1282
- ret = - EINVAL ;
1283
- goto error ;
1211
+ return - EINVAL ;
1284
1212
}
1285
1213
1286
1214
if (instp_mode != dev_priv -> relative_constants_mode ) {
1287
1215
if (INTEL_INFO (dev )-> gen < 4 ) {
1288
1216
DRM_DEBUG ("no rel constants on pre-gen4\n" );
1289
- ret = - EINVAL ;
1290
- goto error ;
1217
+ return - EINVAL ;
1291
1218
}
1292
1219
1293
1220
if (INTEL_INFO (dev )-> gen > 5 &&
1294
1221
instp_mode == I915_EXEC_CONSTANTS_REL_SURFACE ) {
1295
1222
DRM_DEBUG ("rel surface constants mode invalid on gen5+\n" );
1296
- ret = - EINVAL ;
1297
- goto error ;
1223
+ return - EINVAL ;
1298
1224
}
1299
1225
1300
1226
/* The HW changed the meaning on this bit on gen6 */
@@ -1304,15 +1230,14 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params,
1304
1230
break ;
1305
1231
default :
1306
1232
DRM_DEBUG ("execbuf with unknown constants: %d\n" , instp_mode );
1307
- ret = - EINVAL ;
1308
- goto error ;
1233
+ return - EINVAL ;
1309
1234
}
1310
1235
1311
1236
if (ring == & dev_priv -> ring [RCS ] &&
1312
- instp_mode != dev_priv -> relative_constants_mode ) {
1237
+ instp_mode != dev_priv -> relative_constants_mode ) {
1313
1238
ret = intel_ring_begin (params -> request , 4 );
1314
1239
if (ret )
1315
- goto error ;
1240
+ return ret ;
1316
1241
1317
1242
intel_ring_emit (ring , MI_NOOP );
1318
1243
intel_ring_emit (ring , MI_LOAD_REGISTER_IMM (1 ));
@@ -1326,42 +1251,25 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params,
1326
1251
if (args -> flags & I915_EXEC_GEN7_SOL_RESET ) {
1327
1252
ret = i915_reset_gen7_sol_offsets (dev , params -> request );
1328
1253
if (ret )
1329
- goto error ;
1254
+ return ret ;
1330
1255
}
1331
1256
1332
1257
exec_len = args -> batch_len ;
1333
1258
exec_start = params -> batch_obj_vm_offset +
1334
1259
params -> args_batch_start_offset ;
1335
1260
1336
- if (cliprects ) {
1337
- for (i = 0 ; i < args -> num_cliprects ; i ++ ) {
1338
- ret = i915_emit_box (params -> request , & cliprects [i ],
1339
- args -> DR1 , args -> DR4 );
1340
- if (ret )
1341
- goto error ;
1342
-
1343
- ret = ring -> dispatch_execbuffer (params -> request ,
1344
- exec_start , exec_len ,
1345
- params -> dispatch_flags );
1346
- if (ret )
1347
- goto error ;
1348
- }
1349
- } else {
1350
- ret = ring -> dispatch_execbuffer (params -> request ,
1351
- exec_start , exec_len ,
1352
- params -> dispatch_flags );
1353
- if (ret )
1354
- return ret ;
1355
- }
1261
+ ret = ring -> dispatch_execbuffer (params -> request ,
1262
+ exec_start , exec_len ,
1263
+ params -> dispatch_flags );
1264
+ if (ret )
1265
+ return ret ;
1356
1266
1357
1267
trace_i915_gem_ring_dispatch (params -> request , params -> dispatch_flags );
1358
1268
1359
1269
i915_gem_execbuffer_move_to_active (vmas , params -> request );
1360
1270
i915_gem_execbuffer_retire_commands (params );
1361
1271
1362
- error :
1363
- kfree (cliprects );
1364
- return ret ;
1272
+ return 0 ;
1365
1273
}
1366
1274
1367
1275
/**
0 commit comments