The new interfaces aren't pretty, but it clarifies the separation between intel_guc_capture.c and i915_gpu_error.c. The former should not modify stuff internal to the latter. Signed-off-by: Jani Nikula <jani.nikula@xxxxxxxxx> --- .../gpu/drm/i915/gt/uc/intel_guc_capture.c | 63 ++++++++----------- .../gpu/drm/i915/gt/uc/intel_guc_capture.h | 20 ++++-- drivers/gpu/drm/i915/i915_gpu_error.c | 24 +++++-- 3 files changed, 57 insertions(+), 50 deletions(-) diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_capture.c b/drivers/gpu/drm/i915/gt/uc/intel_guc_capture.c index 331cec07c125..cdbe7b5c997f 100644 --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_capture.c +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_capture.c @@ -1415,7 +1415,8 @@ guc_capture_reg_to_str(const struct intel_guc *guc, u32 owner, u32 type, } while (0) int intel_guc_capture_print_engine_node(struct drm_i915_error_state_buf *ebuf, - const struct intel_engine_coredump *ee) + struct __guc_capture_parsed_output *node, + struct intel_guc *guc) { const char *grptype[GUC_STATE_CAPTURE_GROUP_TYPE_MAX] = { "full-capture", @@ -1426,31 +1427,14 @@ int intel_guc_capture_print_engine_node(struct drm_i915_error_state_buf *ebuf, "Engine-Class", "Engine-Instance" }; - struct intel_guc_state_capture *cap; - struct __guc_capture_parsed_output *node; struct intel_engine_cs *eng; struct guc_mmio_reg *regs; - struct intel_guc *guc; const char *str; int numregs, i, j; u32 is_ext; - if (!ebuf || !ee) + if (!ebuf) return -EINVAL; - cap = ee->guc_capture; - if (!cap || !ee->engine) - return -ENODEV; - - guc = &ee->engine->gt->uc.guc; - - i915_error_printf(ebuf, "global --- GuC Error Capture on %s command stream:\n", - ee->engine->name); - - node = ee->guc_capture_node; - if (!node) { - i915_error_printf(ebuf, " No matching ee-node\n"); - return 0; - } i915_error_printf(ebuf, "Coverage: %s\n", grptype[node->is_partial]); @@ -1502,7 +1486,8 @@ int intel_guc_capture_print_engine_node(struct drm_i915_error_state_buf *ebuf, #endif //CONFIG_DRM_I915_CAPTURE_ERROR -static void guc_capture_find_ecode(struct intel_engine_coredump *ee) +static void guc_capture_find_ecode(struct __guc_capture_parsed_output *guc_capture_node, + u32 *ipehr, u32 *instdone) { struct gcap_reg_list_info *reginfo; struct guc_mmio_reg *regs; @@ -1510,27 +1495,26 @@ static void guc_capture_find_ecode(struct intel_engine_coredump *ee) i915_reg_t reg_instdone = RING_INSTDONE(0); int i; - if (!ee->guc_capture_node) + if (!guc_capture_node) return; - reginfo = ee->guc_capture_node->reginfo + GUC_CAPTURE_LIST_TYPE_ENGINE_INSTANCE; + reginfo = guc_capture_node->reginfo + GUC_CAPTURE_LIST_TYPE_ENGINE_INSTANCE; regs = reginfo->regs; for (i = 0; i < reginfo->num_regs; i++) { if (regs[i].offset == reg_ipehr.reg) - ee->ipehr = regs[i].value; + *ipehr = regs[i].value; else if (regs[i].offset == reg_instdone.reg) - ee->instdone.instdone = regs[i].value; + *instdone = regs[i].value; } } -void intel_guc_capture_free_node(struct intel_engine_coredump *ee) +void intel_guc_capture_free_node(struct intel_guc_state_capture *guc_capture, + struct __guc_capture_parsed_output *guc_capture_node) { - if (!ee || !ee->guc_capture_node) + if (!guc_capture_node) return; - guc_capture_add_node_to_cachelist(ee->guc_capture, ee->guc_capture_node); - ee->guc_capture = NULL; - ee->guc_capture_node = NULL; + guc_capture_add_node_to_cachelist(guc_capture, guc_capture_node); } bool intel_guc_capture_is_matching_engine(struct intel_gt *gt, @@ -1564,20 +1548,23 @@ bool intel_guc_capture_is_matching_engine(struct intel_gt *gt, } void intel_guc_capture_get_matching_node(struct intel_gt *gt, - struct intel_engine_coredump *ee, - struct intel_context *ce) + struct intel_context *ce, + unsigned int guc_id, + struct intel_guc_state_capture **guc_capture, + struct __guc_capture_parsed_output **guc_capture_node, + u32 *ipehr, u32 *instdone) { struct __guc_capture_parsed_output *n, *ntmp; struct intel_guc *guc; - if (!gt || !ee || !ce) + if (!gt || !ce) return; guc = >->uc.guc; if (!guc->capture) return; - GEM_BUG_ON(ee->guc_capture_node); + GEM_BUG_ON(*guc_capture_node); /* * Look for a matching GuC reported error capture node from @@ -1585,14 +1572,14 @@ void intel_guc_capture_get_matching_node(struct intel_gt *gt, * identification. */ list_for_each_entry_safe(n, ntmp, &guc->capture->outlist, link) { - if (n->eng_inst == GUC_ID_TO_ENGINE_INSTANCE(ee->engine->guc_id) && - n->eng_class == GUC_ID_TO_ENGINE_CLASS(ee->engine->guc_id) && + if (n->eng_inst == GUC_ID_TO_ENGINE_INSTANCE(guc_id) && + n->eng_class == GUC_ID_TO_ENGINE_CLASS(guc_id) && n->guc_id == ce->guc_id.id && (n->lrca & CTX_GTT_ADDRESS_MASK) == (ce->lrc.lrca & CTX_GTT_ADDRESS_MASK)) { list_del(&n->link); - ee->guc_capture_node = n; - ee->guc_capture = guc->capture; - guc_capture_find_ecode(ee); + *guc_capture_node = n; + *guc_capture = guc->capture; + guc_capture_find_ecode(n, ipehr, instdone); return; } } diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_capture.h b/drivers/gpu/drm/i915/gt/uc/intel_guc_capture.h index 302256d45431..b5862a2672f3 100644 --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_capture.h +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_capture.h @@ -8,19 +8,27 @@ #include <linux/types.h> +struct __guc_capture_parsed_output; struct drm_i915_error_state_buf; struct guc_gt_system_info; +struct intel_context; struct intel_engine_coredump; struct intel_engine_cs; -struct intel_context; struct intel_gt; struct intel_guc; +struct intel_guc_state_capture; -void intel_guc_capture_free_node(struct intel_engine_coredump *ee); -int intel_guc_capture_print_engine_node(struct drm_i915_error_state_buf *m, - const struct intel_engine_coredump *ee); -void intel_guc_capture_get_matching_node(struct intel_gt *gt, struct intel_engine_coredump *ee, - struct intel_context *ce); +void intel_guc_capture_free_node(struct intel_guc_state_capture *guc_capture, + struct __guc_capture_parsed_output *guc_capture_node); +int intel_guc_capture_print_engine_node(struct drm_i915_error_state_buf *ebuf, + struct __guc_capture_parsed_output *node, + struct intel_guc *guc); +void intel_guc_capture_get_matching_node(struct intel_gt *gt, + struct intel_context *ce, + unsigned int guc_id, + struct intel_guc_state_capture **guc_capture, + struct __guc_capture_parsed_output **guc_capture_node, + u32 *ipehr, u32 *instdone); bool intel_guc_capture_is_matching_engine(struct intel_gt *gt, struct intel_context *ce, struct intel_engine_cs *engine); void intel_guc_capture_process(struct intel_guc *guc); diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index 837542c94b00..e73b53b384a5 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c @@ -815,11 +815,16 @@ static void err_print_gt_engines(struct drm_i915_error_state_buf *m, const struct i915_vma_coredump *vma; if (gt->uc && gt->uc->guc.is_guc_capture) { - if (ee->guc_capture_node) - intel_guc_capture_print_engine_node(m, ee); - else + if (ee->guc_capture && ee->guc_capture_node && ee->engine) { + i915_error_printf(m, "global --- GuC Error Capture on %s command stream:\n", + ee->engine->name); + + intel_guc_capture_print_engine_node(m, ee->guc_capture_node, + &ee->engine->gt->uc.guc); + } else { err_printf(m, " Missing GuC capture node for %s\n", ee->engine->name); + } } else { error_print_engine(m, ee); } @@ -1053,7 +1058,8 @@ static void cleanup_gt(struct intel_gt_coredump *gt) gt->engine = ee->next; i915_vma_coredump_free(ee->vma); - intel_guc_capture_free_node(ee); + intel_guc_capture_free_node(ee->guc_capture, + ee->guc_capture_node); kfree(ee); } @@ -1669,7 +1675,12 @@ capture_engine(struct intel_engine_cs *engine, intel_engine_coredump_add_vma(ee, capture, compress); if (dump_flags & CORE_DUMP_FLAG_IS_GUC_CAPTURE) - intel_guc_capture_get_matching_node(engine->gt, ee, ce); + intel_guc_capture_get_matching_node(engine->gt, ce, + ee->engine->guc_id, + &ee->guc_capture, + &ee->guc_capture_node, + &ee->ipehr, + &ee->instdone.instdone); } else { kfree(ee); ee = NULL; @@ -1702,7 +1713,8 @@ gt_record_engines(struct intel_gt_coredump *gt, gt->simulated |= ee->simulated; if (ee->simulated) { if (dump_flags & CORE_DUMP_FLAG_IS_GUC_CAPTURE) - intel_guc_capture_free_node(ee); + intel_guc_capture_free_node(ee->guc_capture, + ee->guc_capture_node); kfree(ee); continue; } -- 2.39.2