Commit bade0340 authored by Karol Wachowski's avatar Karol Wachowski Committed by Jacek Lawrynowicz
Browse files

accel/ivpu: Add coredump support



Use coredump (if available) to collect FW logs in case of a FW crash.
This makes dmesg more readable and allows to collect more log data.

Signed-off-by: default avatarKarol Wachowski <karol.wachowski@intel.com>
Reviewed-by: default avatarJacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Reviewed-by: default avatarJeffrey Hugo <quic_jhugo@quicinc.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240930195322.461209-8-jacek.lawrynowicz@linux.intel.com


Signed-off-by: default avatarJacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
parent 990b1e3d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@ config DRM_ACCEL_IVPU
	select FW_LOADER
	select DRM_GEM_SHMEM_HELPER
	select GENERIC_ALLOCATOR
	select WANT_DEV_COREDUMP
	help
	  Choose this option if you have a system with an 14th generation
	  Intel CPU (Meteor Lake) or newer. Intel NPU (formerly called Intel VPU)
+1 −0
Original line number Diff line number Diff line
@@ -19,5 +19,6 @@ intel_vpu-y := \
	ivpu_sysfs.o

intel_vpu-$(CONFIG_DEBUG_FS) += ivpu_debugfs.o
intel_vpu-$(CONFIG_DEV_COREDUMP) += ivpu_coredump.o

obj-$(CONFIG_DRM_ACCEL_IVPU) += intel_vpu.o
+39 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (C) 2020-2024 Intel Corporation
 */

#include <linux/devcoredump.h>
#include <linux/firmware.h>

#include "ivpu_coredump.h"
#include "ivpu_fw.h"
#include "ivpu_gem.h"
#include "vpu_boot_api.h"

#define CRASH_DUMP_HEADER "Intel NPU crash dump"
#define CRASH_DUMP_HEADERS_SIZE SZ_4K

void ivpu_dev_coredump(struct ivpu_device *vdev)
{
	struct drm_print_iterator pi = {};
	struct drm_printer p;
	size_t coredump_size;
	char *coredump;

	coredump_size = CRASH_DUMP_HEADERS_SIZE + FW_VERSION_HEADER_SIZE +
			ivpu_bo_size(vdev->fw->mem_log_crit) + ivpu_bo_size(vdev->fw->mem_log_verb);
	coredump = vmalloc(coredump_size);
	if (!coredump)
		return;

	pi.data = coredump;
	pi.remain = coredump_size;
	p = drm_coredump_printer(&pi);

	drm_printf(&p, "%s\n", CRASH_DUMP_HEADER);
	drm_printf(&p, "FW version: %s\n", vdev->fw->version);
	ivpu_fw_log_print(vdev, false, &p);

	dev_coredumpv(vdev->drm.dev, coredump, pi.offset, GFP_KERNEL);
}
+25 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (C) 2020-2024 Intel Corporation
 */

#ifndef __IVPU_COREDUMP_H__
#define __IVPU_COREDUMP_H__

#include <drm/drm_print.h>

#include "ivpu_drv.h"
#include "ivpu_fw_log.h"

#ifdef CONFIG_DEV_COREDUMP
void ivpu_dev_coredump(struct ivpu_device *vdev);
#else
static inline void ivpu_dev_coredump(struct ivpu_device *vdev)
{
	struct drm_printer p = drm_info_printer(vdev->drm.dev);

	ivpu_fw_log_print(vdev, false, &p);
}
#endif

#endif /* __IVPU_COREDUMP_H__ */
+3 −2
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@
#include <drm/drm_ioctl.h>
#include <drm/drm_prime.h>

#include "vpu_boot_api.h"
#include "ivpu_coredump.h"
#include "ivpu_debugfs.h"
#include "ivpu_drv.h"
#include "ivpu_fw.h"
@@ -29,6 +29,7 @@
#include "ivpu_ms.h"
#include "ivpu_pm.h"
#include "ivpu_sysfs.h"
#include "vpu_boot_api.h"

#ifndef DRIVER_VERSION_STR
#define DRIVER_VERSION_STR __stringify(DRM_IVPU_DRIVER_MAJOR) "." \
@@ -382,7 +383,7 @@ int ivpu_boot(struct ivpu_device *vdev)
		ivpu_err(vdev, "Failed to boot the firmware: %d\n", ret);
		ivpu_hw_diagnose_failure(vdev);
		ivpu_mmu_evtq_dump(vdev);
		ivpu_fw_log_dump(vdev);
		ivpu_dev_coredump(vdev);
		return ret;
	}

Loading