ivpu_coredump.c 987 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2020-2024 Intel Corporation
  4. */
  5. #include <linux/devcoredump.h>
  6. #include <linux/firmware.h>
  7. #include "ivpu_coredump.h"
  8. #include "ivpu_fw.h"
  9. #include "ivpu_gem.h"
  10. #include "vpu_boot_api.h"
  11. #define CRASH_DUMP_HEADER "Intel NPU crash dump"
  12. #define CRASH_DUMP_HEADERS_SIZE SZ_4K
  13. void ivpu_dev_coredump(struct ivpu_device *vdev)
  14. {
  15. struct drm_print_iterator pi = {};
  16. struct drm_printer p;
  17. size_t coredump_size;
  18. char *coredump;
  19. coredump_size = CRASH_DUMP_HEADERS_SIZE + FW_VERSION_HEADER_SIZE +
  20. ivpu_bo_size(vdev->fw->mem_log_crit) + ivpu_bo_size(vdev->fw->mem_log_verb);
  21. coredump = vmalloc(coredump_size);
  22. if (!coredump)
  23. return;
  24. pi.data = coredump;
  25. pi.remain = coredump_size;
  26. p = drm_coredump_printer(&pi);
  27. drm_printf(&p, "%s\n", CRASH_DUMP_HEADER);
  28. drm_printf(&p, "FW version: %s\n", vdev->fw->version);
  29. ivpu_fw_log_print(vdev, false, &p);
  30. dev_coredumpv(vdev->drm.dev, coredump, pi.offset, GFP_KERNEL);
  31. }