#include "intel_display_device.h"
 #include "intel_display_params.h"
 #include "intel_display_snapshot.h"
+#include "intel_dmc.h"
 #include "intel_overlay.h"
 
 struct intel_display_snapshot {
        struct intel_display_runtime_info runtime_info;
        struct intel_display_params params;
        struct intel_overlay_snapshot *overlay;
+       struct intel_dmc_snapshot *dmc;
 };
 
 struct intel_display_snapshot *intel_display_snapshot_capture(struct intel_display *display)
        intel_display_params_copy(&snapshot->params);
 
        snapshot->overlay = intel_overlay_snapshot_capture(display);
+       snapshot->dmc = intel_dmc_snapshot_capture(display);
 
        return snapshot;
 }
        intel_display_params_dump(&snapshot->params, display->drm->driver->name, p);
 
        intel_overlay_snapshot_print(snapshot->overlay, p);
+       intel_dmc_snapshot_print(snapshot->dmc, p);
 }
 
 void intel_display_snapshot_free(struct intel_display_snapshot *snapshot)
        intel_display_params_free(&snapshot->params);
 
        kfree(snapshot->overlay);
+       kfree(snapshot->dmc);
        kfree(snapshot);
 }
 
        }
 }
 
-void intel_dmc_print_error_state(struct drm_printer *p,
-                                struct intel_display *display)
+struct intel_dmc_snapshot {
+       bool initialized;
+       bool loaded;
+       u32 version;
+};
+
+struct intel_dmc_snapshot *intel_dmc_snapshot_capture(struct intel_display *display)
 {
        struct intel_dmc *dmc = display_to_dmc(display);
+       struct intel_dmc_snapshot *snapshot;
 
        if (!HAS_DMC(display))
-               return;
+               return NULL;
 
-       drm_printf(p, "DMC initialized: %s\n", str_yes_no(dmc));
-       drm_printf(p, "DMC loaded: %s\n",
-                  str_yes_no(intel_dmc_has_payload(display)));
+       snapshot = kzalloc(sizeof(*snapshot), GFP_ATOMIC);
+       if (!snapshot)
+               return NULL;
+
+       snapshot->initialized = dmc;
+       snapshot->loaded = intel_dmc_has_payload(display);
        if (dmc)
+               snapshot->version = dmc->version;
+
+       return snapshot;
+}
+
+void intel_dmc_snapshot_print(const struct intel_dmc_snapshot *snapshot, struct drm_printer *p)
+{
+       if (!snapshot)
+               return;
+
+       drm_printf(p, "DMC initialized: %s\n", str_yes_no(snapshot->initialized));
+       drm_printf(p, "DMC loaded: %s\n", str_yes_no(snapshot->loaded));
+       if (snapshot->initialized)
                drm_printf(p, "DMC fw version: %d.%d\n",
-                          DMC_VERSION_MAJOR(dmc->version),
-                          DMC_VERSION_MINOR(dmc->version));
+                          DMC_VERSION_MAJOR(snapshot->version),
+                          DMC_VERSION_MINOR(snapshot->version));
 }
 
 static int intel_dmc_debugfs_status_show(struct seq_file *m, void *unused)
 
 enum pipe;
 struct drm_printer;
 struct intel_display;
+struct intel_dmc_snapshot;
 
 void intel_dmc_init(struct intel_display *display);
 void intel_dmc_load_program(struct intel_display *display);
 void intel_dmc_resume(struct intel_display *display);
 bool intel_dmc_has_payload(struct intel_display *display);
 void intel_dmc_debugfs_register(struct intel_display *display);
-void intel_dmc_print_error_state(struct drm_printer *p,
-                                struct intel_display *display);
+
+struct intel_dmc_snapshot *intel_dmc_snapshot_capture(struct intel_display *display);
+void intel_dmc_snapshot_print(const struct intel_dmc_snapshot *snapshot, struct drm_printer *p);
 
 void assert_dmc_loaded(struct intel_display *display);
 
 
 #include <drm/drm_print.h>
 
 #include "display/intel_display_snapshot.h"
-#include "display/intel_dmc.h"
 
 #include "gem/i915_gem_context.h"
 #include "gem/i915_gem_lmem.h"
 
        err_printf(m, "IOMMU enabled?: %d\n", error->iommu);
 
-       intel_dmc_print_error_state(&p, &m->i915->display);
-
        err_printf(m, "RPM wakelock: %s\n", str_yes_no(error->wakelock));
        err_printf(m, "PM suspended: %s\n", str_yes_no(error->suspended));