@@ -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;
}
}
@@ -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);
@@ -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;
}
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@intel.com> --- .../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(-)