xe_guc_ct_snapshot_print(snapshot, p);
xe_guc_ct_snapshot_free(snapshot);
}
-
-#ifdef XE_GUC_CT_SELFTEST
-/*
- * Disable G2H processing in IRQ handler to force xe_guc_ct_send to enter flow
- * control if enough sent, 8k sends is enough. Verify forward process, verify
- * credits expected values on exit.
- */
-void xe_guc_ct_selftest(struct xe_guc_ct *ct, struct drm_printer *p)
-{
- struct guc_ctb *g2h = &ct->ctbs.g2h;
- u32 action[] = { XE_GUC_ACTION_SCHED_ENGINE_MODE_SET, 0, 0, 1, };
- u32 bad_action[] = { XE_GUC_ACTION_SCHED_CONTEXT_MODE_SET, 0, 0, };
- int ret;
- int i;
-
- ct->suppress_irq_handler = true;
- drm_puts(p, "Starting GuC CT selftest\n");
-
- for (i = 0; i < 8192; ++i) {
- ret = xe_guc_ct_send(ct, action, ARRAY_SIZE(action), 4, 1);
- if (ret) {
- drm_printf(p, "Aborted pass %d, ret %d\n", i, ret);
- xe_guc_ct_print(ct, p, true);
- break;
- }
- }
-
- ct->suppress_irq_handler = false;
- if (!ret) {
- xe_guc_ct_irq_handler(ct);
- msleep(200);
- if (g2h->info.space !=
- CIRC_SPACE(0, 0, g2h->info.size) - g2h->info.resv_space) {
- drm_printf(p, "Mismatch on space %d, %d\n",
- g2h->info.space,
- CIRC_SPACE(0, 0, g2h->info.size) -
- g2h->info.resv_space);
- ret = -EIO;
- }
- if (ct->g2h_outstanding) {
- drm_printf(p, "Outstanding G2H, %d\n",
- ct->g2h_outstanding);
- ret = -EIO;
- }
- }
-
- /* Check failure path for blocking CTs too */
- xe_guc_ct_send_block(ct, bad_action, ARRAY_SIZE(bad_action));
- if (g2h->info.space !=
- CIRC_SPACE(0, 0, g2h->info.size) - g2h->info.resv_space) {
- drm_printf(p, "Mismatch on space %d, %d\n",
- g2h->info.space,
- CIRC_SPACE(0, 0, g2h->info.size) -
- g2h->info.resv_space);
- ret = -EIO;
- }
- if (ct->g2h_outstanding) {
- drm_printf(p, "Outstanding G2H, %d\n",
- ct->g2h_outstanding);
- ret = -EIO;
- }
-
- drm_printf(p, "GuC CT selftest done - %s\n", ret ? "FAIL" : "PASS");
-}
-#endif
static inline void xe_guc_ct_irq_handler(struct xe_guc_ct *ct)
{
wake_up_all(&ct->wq);
-#ifdef XE_GUC_CT_SELFTEST
- if (!ct->suppress_irq_handler && ct->enabled)
- queue_work(system_unbound_wq, &ct->g2h_worker);
-#else
if (ct->enabled)
queue_work(system_unbound_wq, &ct->g2h_worker);
-#endif
xe_guc_ct_fast_path(ct);
}
return xe_guc_ct_send_recv_no_fail(ct, action, len, NULL);
}
-#ifdef XE_GUC_CT_SELFTEST
-void xe_guc_ct_selftest(struct xe_guc_ct *ct, struct drm_printer *p);
-#endif
-
#endif
return 0;
}
-#ifdef XE_GUC_CT_SELFTEST
-static int guc_ct_selftest(struct seq_file *m, void *data)
-{
- struct xe_guc *guc = node_to_guc(m->private);
- struct xe_device *xe = guc_to_xe(guc);
- struct drm_printer p = drm_seq_file_printer(m);
-
- xe_device_mem_access_get(xe);
- xe_guc_ct_selftest(&guc->ct, &p);
- xe_device_mem_access_put(xe);
-
- return 0;
-}
-#endif
-
static const struct drm_info_list debugfs_list[] = {
{"guc_info", guc_info, 0},
{"guc_log", guc_log, 0},
-#ifdef XE_GUC_CT_SELFTEST
- {"guc_ct_selftest", guc_ct_selftest, 0},
-#endif
};
void xe_guc_debugfs_register(struct xe_guc *guc, struct dentry *parent)