diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2016-08-18 12:17:10 -0400 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2016-08-18 17:36:58 -0400 |
commit | 7756e454077197df57c51cc2f7ae844ec6ce9fba (patch) | |
tree | 9935d79d923f2a43da8f454c375852abc0aa034c | |
parent | cd3127d684f027f7c85aec57e284dcecd033dccf (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.c | 27 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_engine_cs.c | 6 |
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 | */ |
752 | int intel_engine_init_cmd_parser(struct intel_engine_cs *engine) | 750 | void 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 */ |
3543 | int i915_cmd_parser_get_version(struct drm_i915_private *dev_priv); | 3543 | int i915_cmd_parser_get_version(struct drm_i915_private *dev_priv); |
3544 | int intel_engine_init_cmd_parser(struct intel_engine_cs *engine); | 3544 | void intel_engine_init_cmd_parser(struct intel_engine_cs *engine); |
3545 | void intel_engine_cleanup_cmd_parser(struct intel_engine_cs *engine); | 3545 | void intel_engine_cleanup_cmd_parser(struct intel_engine_cs *engine); |
3546 | bool intel_engine_needs_cmd_parser(struct intel_engine_cs *engine); | 3546 | bool intel_engine_needs_cmd_parser(struct intel_engine_cs *engine); |
3547 | int intel_engine_cmd_parser(struct intel_engine_cs *engine, | 3547 | int 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 | ||
244 | int intel_engine_create_scratch(struct intel_engine_cs *engine, int size) | 246 | int 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 | } |