diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_cmd_parser.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_cmd_parser.c | 67 | 
1 files changed, 33 insertions, 34 deletions
| diff --git a/drivers/gpu/drm/i915/i915_cmd_parser.c b/drivers/gpu/drm/i915/i915_cmd_parser.c index e88970256e8e..93265951fdbb 100644 --- a/drivers/gpu/drm/i915/i915_cmd_parser.c +++ b/drivers/gpu/drm/i915/i915_cmd_parser.c @@ -1452,43 +1452,42 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine,  	 * space. Parsing should be faster in some cases this way.  	 */  	batch_end = cmd + batch_length / sizeof(*batch_end); -	do { -		u32 length; - -		if (*cmd == MI_BATCH_BUFFER_END) -			break; - -		desc = find_cmd(engine, *cmd, desc, &default_desc); -		if (!desc) { -			DRM_DEBUG("CMD: Unrecognized command: 0x%08X\n", *cmd); -			ret = -EINVAL; -			break; -		} +	while (*cmd != MI_BATCH_BUFFER_END) { +		u32 length = 1; + +		if (*cmd != MI_NOOP) { /* MI_NOOP == 0 */ +			desc = find_cmd(engine, *cmd, desc, &default_desc); +			if (!desc) { +				DRM_DEBUG("CMD: Unrecognized command: 0x%08X\n", *cmd); +				ret = -EINVAL; +				break; +			} -		if (desc->flags & CMD_DESC_FIXED) -			length = desc->length.fixed; -		else -			length = (*cmd & desc->length.mask) + LENGTH_BIAS; +			if (desc->flags & CMD_DESC_FIXED) +				length = desc->length.fixed; +			else +				length = (*cmd & desc->length.mask) + LENGTH_BIAS; -		if ((batch_end - cmd) < length) { -			DRM_DEBUG("CMD: Command length exceeds batch length: 0x%08X length=%u batchlen=%td\n", -				  *cmd, -				  length, -				  batch_end - cmd); -			ret = -EINVAL; -			break; -		} +			if ((batch_end - cmd) < length) { +				DRM_DEBUG("CMD: Command length exceeds batch length: 0x%08X length=%u batchlen=%td\n", +					  *cmd, +					  length, +					  batch_end - cmd); +				ret = -EINVAL; +				break; +			} -		if (!check_cmd(engine, desc, cmd, length)) { -			ret = -EACCES; -			break; -		} +			if (!check_cmd(engine, desc, cmd, length)) { +				ret = -EACCES; +				break; +			} -		if (cmd_desc_is(desc, MI_BATCH_BUFFER_START)) { -			ret = check_bbstart(cmd, offset, length, batch_length, -					    batch_addr, shadow_addr, -					    jump_whitelist); -			break; +			if (cmd_desc_is(desc, MI_BATCH_BUFFER_START)) { +				ret = check_bbstart(cmd, offset, length, batch_length, +						    batch_addr, shadow_addr, +						    jump_whitelist); +				break; +			}  		}  		if (!IS_ERR_OR_NULL(jump_whitelist)) @@ -1501,7 +1500,7 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine,  			ret = -EINVAL;  			break;  		} -	} while (1); +	}  	if (trampoline) {  		/* | 
