summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bloomfield <jon.bloomfield@intel.com>2018-09-27 13:23:17 -0400
committerJon Bloomfield <jon.bloomfield@intel.com>2019-11-05 14:37:54 -0500
commit0546a29cd884fb8184731c79ab008927ca8859d0 (patch)
tree43bfcd52bc33f7ce95a871075acc4447e8f7e7ad
parent0f2f39758341df70202ae1c42d5a1e4ee392b6d3 (diff)
drm/i915/cmdparser: Use explicit goto for error paths
In the next patch we will be adding a second valid termination condition which will require a small amount of refactoring to share logic with the BB_END case. Refactor all error conditions to jump to a dedicated exit path, with 'break' reserved only for a successful parse. Cc: Tony Luck <tony.luck@intel.com> Cc: Dave Airlie <airlied@redhat.com> Cc: Takashi Iwai <tiwai@suse.de> Cc: Tyler Hicks <tyhicks@canonical.com> Signed-off-by: Jon Bloomfield <jon.bloomfield@intel.com> Reviewed-by: Chris Wilson <chris.p.wilson@intel.com>
-rw-r--r--drivers/gpu/drm/i915/i915_cmd_parser.c25
1 files changed, 13 insertions, 12 deletions
diff --git a/drivers/gpu/drm/i915/i915_cmd_parser.c b/drivers/gpu/drm/i915/i915_cmd_parser.c
index 6794034c8ced..dc5bcbc3ba6e 100644
--- a/drivers/gpu/drm/i915/i915_cmd_parser.c
+++ b/drivers/gpu/drm/i915/i915_cmd_parser.c
@@ -1338,21 +1338,15 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine,
1338 do { 1338 do {
1339 u32 length; 1339 u32 length;
1340 1340
1341 if (*cmd == MI_BATCH_BUFFER_END) { 1341 if (*cmd == MI_BATCH_BUFFER_END)
1342 if (needs_clflush_after) {
1343 void *ptr = page_mask_bits(shadow_batch_obj->mm.mapping);
1344 drm_clflush_virt_range(ptr,
1345 (void *)(cmd + 1) - ptr);
1346 }
1347 break; 1342 break;
1348 }
1349 1343
1350 desc = find_cmd(engine, *cmd, desc, &default_desc); 1344 desc = find_cmd(engine, *cmd, desc, &default_desc);
1351 if (!desc) { 1345 if (!desc) {
1352 DRM_DEBUG_DRIVER("CMD: Unrecognized command: 0x%08X\n", 1346 DRM_DEBUG_DRIVER("CMD: Unrecognized command: 0x%08X\n",
1353 *cmd); 1347 *cmd);
1354 ret = -EINVAL; 1348 ret = -EINVAL;
1355 break; 1349 goto err;
1356 } 1350 }
1357 1351
1358 /* 1352 /*
@@ -1362,7 +1356,7 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine,
1362 */ 1356 */
1363 if (desc->cmd.value == MI_BATCH_BUFFER_START) { 1357 if (desc->cmd.value == MI_BATCH_BUFFER_START) {
1364 ret = -EACCES; 1358 ret = -EACCES;
1365 break; 1359 goto err;
1366 } 1360 }
1367 1361
1368 if (desc->flags & CMD_DESC_FIXED) 1362 if (desc->flags & CMD_DESC_FIXED)
@@ -1376,22 +1370,29 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine,
1376 length, 1370 length,
1377 batch_end - cmd); 1371 batch_end - cmd);
1378 ret = -EINVAL; 1372 ret = -EINVAL;
1379 break; 1373 goto err;
1380 } 1374 }
1381 1375
1382 if (!check_cmd(engine, desc, cmd, length)) { 1376 if (!check_cmd(engine, desc, cmd, length)) {
1383 ret = -EACCES; 1377 ret = -EACCES;
1384 break; 1378 goto err;
1385 } 1379 }
1386 1380
1387 cmd += length; 1381 cmd += length;
1388 if (cmd >= batch_end) { 1382 if (cmd >= batch_end) {
1389 DRM_DEBUG_DRIVER("CMD: Got to the end of the buffer w/o a BBE cmd!\n"); 1383 DRM_DEBUG_DRIVER("CMD: Got to the end of the buffer w/o a BBE cmd!\n");
1390 ret = -EINVAL; 1384 ret = -EINVAL;
1391 break; 1385 goto err;
1392 } 1386 }
1393 } while (1); 1387 } while (1);
1394 1388
1389 if (needs_clflush_after) {
1390 void *ptr = page_mask_bits(shadow_batch_obj->mm.mapping);
1391
1392 drm_clflush_virt_range(ptr, (void *)(cmd + 1) - ptr);
1393 }
1394
1395err:
1395 i915_gem_object_unpin_map(shadow_batch_obj); 1396 i915_gem_object_unpin_map(shadow_batch_obj);
1396 return ret; 1397 return ret;
1397} 1398}