aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2016-08-18 12:17:10 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2016-08-18 17:36:58 -0400
commit7756e454077197df57c51cc2f7ae844ec6ce9fba (patch)
tree9935d79d923f2a43da8f454c375852abc0aa034c
parentcd3127d684f027f7c85aec57e284dcecd033dccf (diff)
drm/i915/cmdparser: Make initialisation failure non-fatal
If the developer adds a register in the wrong order, we BUG during boot. That makes development and testing very difficult. Let's be a bit more friendly and disable the command parser with a big warning if the tables are invalid. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Matthew Auld <matthew.auld@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20160818161718.27187-31-chris@chris-wilson.co.uk
-rw-r--r--drivers/gpu/drm/i915/i915_cmd_parser.c27
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h2
-rw-r--r--drivers/gpu/drm/i915/intel_engine_cs.c6
3 files changed, 19 insertions, 16 deletions
diff --git a/drivers/gpu/drm/i915/i915_cmd_parser.c b/drivers/gpu/drm/i915/i915_cmd_parser.c
index e586e15e172f..808d97646e70 100644
--- a/drivers/gpu/drm/i915/i915_cmd_parser.c
+++ b/drivers/gpu/drm/i915/i915_cmd_parser.c
@@ -746,17 +746,15 @@ static void fini_hash_table(struct intel_engine_cs *engine)
746 * Optionally initializes fields related to batch buffer command parsing in the 746 * Optionally initializes fields related to batch buffer command parsing in the
747 * struct intel_engine_cs based on whether the platform requires software 747 * struct intel_engine_cs based on whether the platform requires software
748 * command parsing. 748 * command parsing.
749 *
750 * Return: non-zero if initialization fails
751 */ 749 */
752int intel_engine_init_cmd_parser(struct intel_engine_cs *engine) 750void intel_engine_init_cmd_parser(struct intel_engine_cs *engine)
753{ 751{
754 const struct drm_i915_cmd_table *cmd_tables; 752 const struct drm_i915_cmd_table *cmd_tables;
755 int cmd_table_count; 753 int cmd_table_count;
756 int ret; 754 int ret;
757 755
758 if (!IS_GEN7(engine->i915)) 756 if (!IS_GEN7(engine->i915))
759 return 0; 757 return;
760 758
761 switch (engine->id) { 759 switch (engine->id) {
762 case RCS: 760 case RCS:
@@ -811,24 +809,27 @@ int intel_engine_init_cmd_parser(struct intel_engine_cs *engine)
811 break; 809 break;
812 default: 810 default:
813 MISSING_CASE(engine->id); 811 MISSING_CASE(engine->id);
814 BUG(); 812 return;
815 } 813 }
816 814
817 BUG_ON(!validate_cmds_sorted(engine, cmd_tables, cmd_table_count)); 815 if (!validate_cmds_sorted(engine, cmd_tables, cmd_table_count)) {
818 BUG_ON(!validate_regs_sorted(engine)); 816 DRM_ERROR("%s: command descriptions are not sorted\n",
819 817 engine->name);
820 WARN_ON(!hash_empty(engine->cmd_hash)); 818 return;
819 }
820 if (!validate_regs_sorted(engine)) {
821 DRM_ERROR("%s: registers are not sorted\n", engine->name);
822 return;
823 }
821 824
822 ret = init_hash_table(engine, cmd_tables, cmd_table_count); 825 ret = init_hash_table(engine, cmd_tables, cmd_table_count);
823 if (ret) { 826 if (ret) {
824 DRM_ERROR("CMD: cmd_parser_init failed!\n"); 827 DRM_ERROR("%s: initialised failed!\n", engine->name);
825 fini_hash_table(engine); 828 fini_hash_table(engine);
826 return ret; 829 return;
827 } 830 }
828 831
829 engine->needs_cmd_parser = true; 832 engine->needs_cmd_parser = true;
830
831 return 0;
832} 833}
833 834
834/** 835/**
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 9386523464ea..299949d54dca 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -3541,7 +3541,7 @@ const char *i915_cache_level_str(struct drm_i915_private *i915, int type);
3541 3541
3542/* i915_cmd_parser.c */ 3542/* i915_cmd_parser.c */
3543int i915_cmd_parser_get_version(struct drm_i915_private *dev_priv); 3543int i915_cmd_parser_get_version(struct drm_i915_private *dev_priv);
3544int intel_engine_init_cmd_parser(struct intel_engine_cs *engine); 3544void intel_engine_init_cmd_parser(struct intel_engine_cs *engine);
3545void intel_engine_cleanup_cmd_parser(struct intel_engine_cs *engine); 3545void intel_engine_cleanup_cmd_parser(struct intel_engine_cs *engine);
3546bool intel_engine_needs_cmd_parser(struct intel_engine_cs *engine); 3546bool intel_engine_needs_cmd_parser(struct intel_engine_cs *engine);
3547int intel_engine_cmd_parser(struct intel_engine_cs *engine, 3547int intel_engine_cmd_parser(struct intel_engine_cs *engine,
diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c
index 8a27bb9f6bc1..2e96a86105c2 100644
--- a/drivers/gpu/drm/i915/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/intel_engine_cs.c
@@ -239,6 +239,8 @@ void intel_engine_setup_common(struct intel_engine_cs *engine)
239 intel_engine_init_requests(engine); 239 intel_engine_init_requests(engine);
240 intel_engine_init_hangcheck(engine); 240 intel_engine_init_hangcheck(engine);
241 i915_gem_batch_pool_init(engine, &engine->batch_pool); 241 i915_gem_batch_pool_init(engine, &engine->batch_pool);
242
243 intel_engine_init_cmd_parser(engine);
242} 244}
243 245
244int intel_engine_create_scratch(struct intel_engine_cs *engine, int size) 246int intel_engine_create_scratch(struct intel_engine_cs *engine, int size)
@@ -301,7 +303,7 @@ int intel_engine_init_common(struct intel_engine_cs *engine)
301 if (ret) 303 if (ret)
302 return ret; 304 return ret;
303 305
304 return intel_engine_init_cmd_parser(engine); 306 return 0;
305} 307}
306 308
307/** 309/**
@@ -315,7 +317,7 @@ void intel_engine_cleanup_common(struct intel_engine_cs *engine)
315{ 317{
316 intel_engine_cleanup_scratch(engine); 318 intel_engine_cleanup_scratch(engine);
317 319
318 intel_engine_cleanup_cmd_parser(engine);
319 intel_engine_fini_breadcrumbs(engine); 320 intel_engine_fini_breadcrumbs(engine);
321 intel_engine_cleanup_cmd_parser(engine);
320 i915_gem_batch_pool_fini(&engine->batch_pool); 322 i915_gem_batch_pool_fini(&engine->batch_pool);
321} 323}