diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_cmd_parser.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_cmd_parser.c | 19 | 
1 files changed, 13 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/i915_cmd_parser.c b/drivers/gpu/drm/i915/i915_cmd_parser.c index ced9a96d7c34..5f86f5b2caf6 100644 --- a/drivers/gpu/drm/i915/i915_cmd_parser.c +++ b/drivers/gpu/drm/i915/i915_cmd_parser.c @@ -940,7 +940,7 @@ static void fini_hash_table(struct intel_engine_cs *engine)   * struct intel_engine_cs based on whether the platform requires software   * command parsing.   */ -void intel_engine_init_cmd_parser(struct intel_engine_cs *engine) +int intel_engine_init_cmd_parser(struct intel_engine_cs *engine)  {  	const struct drm_i915_cmd_table *cmd_tables;  	int cmd_table_count; @@ -948,7 +948,7 @@ void intel_engine_init_cmd_parser(struct intel_engine_cs *engine)  	if (!IS_GEN(engine->i915, 7) && !(IS_GEN(engine->i915, 9) &&  					  engine->class == COPY_ENGINE_CLASS)) -		return; +		return 0;  	switch (engine->class) {  	case RENDER_CLASS: @@ -1013,19 +1013,19 @@ void intel_engine_init_cmd_parser(struct intel_engine_cs *engine)  		break;  	default:  		MISSING_CASE(engine->class); -		return; +		goto out;  	}  	if (!validate_cmds_sorted(engine, cmd_tables, cmd_table_count)) {  		drm_err(&engine->i915->drm,  			"%s: command descriptions are not sorted\n",  			engine->name); -		return; +		goto out;  	}  	if (!validate_regs_sorted(engine)) {  		drm_err(&engine->i915->drm,  			"%s: registers are not sorted\n", engine->name); -		return; +		goto out;  	}  	ret = init_hash_table(engine, cmd_tables, cmd_table_count); @@ -1033,10 +1033,17 @@ void intel_engine_init_cmd_parser(struct intel_engine_cs *engine)  		drm_err(&engine->i915->drm,  			"%s: initialised failed!\n", engine->name);  		fini_hash_table(engine); -		return; +		goto out;  	}  	engine->flags |= I915_ENGINE_USING_CMD_PARSER; + +out: +	if (intel_engine_requires_cmd_parser(engine) && +	    !intel_engine_using_cmd_parser(engine)) +		return -EINVAL; + +	return 0;  }  /**  |