Skip to content

Commit bade034

Browse files
kwachowsjlawryno
authored andcommitted
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: Karol Wachowski <[email protected]> Reviewed-by: Jacek Lawrynowicz <[email protected]> Reviewed-by: Jeffrey Hugo <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] Signed-off-by: Jacek Lawrynowicz <[email protected]>
1 parent 990b1e3 commit bade034

File tree

7 files changed

+74
-14
lines changed

7 files changed

+74
-14
lines changed

drivers/accel/ivpu/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ config DRM_ACCEL_IVPU
88
select FW_LOADER
99
select DRM_GEM_SHMEM_HELPER
1010
select GENERIC_ALLOCATOR
11+
select WANT_DEV_COREDUMP
1112
help
1213
Choose this option if you have a system with an 14th generation
1314
Intel CPU (Meteor Lake) or newer. Intel NPU (formerly called Intel VPU)

drivers/accel/ivpu/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,6 @@ intel_vpu-y := \
1919
ivpu_sysfs.o
2020

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

2324
obj-$(CONFIG_DRM_ACCEL_IVPU) += intel_vpu.o

drivers/accel/ivpu/ivpu_coredump.c

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

drivers/accel/ivpu/ivpu_coredump.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/* SPDX-License-Identifier: GPL-2.0-only */
2+
/*
3+
* Copyright (C) 2020-2024 Intel Corporation
4+
*/
5+
6+
#ifndef __IVPU_COREDUMP_H__
7+
#define __IVPU_COREDUMP_H__
8+
9+
#include <drm/drm_print.h>
10+
11+
#include "ivpu_drv.h"
12+
#include "ivpu_fw_log.h"
13+
14+
#ifdef CONFIG_DEV_COREDUMP
15+
void ivpu_dev_coredump(struct ivpu_device *vdev);
16+
#else
17+
static inline void ivpu_dev_coredump(struct ivpu_device *vdev)
18+
{
19+
struct drm_printer p = drm_info_printer(vdev->drm.dev);
20+
21+
ivpu_fw_log_print(vdev, false, &p);
22+
}
23+
#endif
24+
25+
#endif /* __IVPU_COREDUMP_H__ */

drivers/accel/ivpu/ivpu_drv.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
#include <drm/drm_ioctl.h>
1515
#include <drm/drm_prime.h>
1616

17-
#include "vpu_boot_api.h"
17+
#include "ivpu_coredump.h"
1818
#include "ivpu_debugfs.h"
1919
#include "ivpu_drv.h"
2020
#include "ivpu_fw.h"
@@ -29,6 +29,7 @@
2929
#include "ivpu_ms.h"
3030
#include "ivpu_pm.h"
3131
#include "ivpu_sysfs.h"
32+
#include "vpu_boot_api.h"
3233

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

drivers/accel/ivpu/ivpu_fw_log.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88

99
#include <linux/types.h>
1010

11-
#include <drm/drm_print.h>
12-
1311
#include "ivpu_drv.h"
1412

1513
#define IVPU_FW_LOG_DEFAULT 0
@@ -29,11 +27,5 @@ void ivpu_fw_log_print(struct ivpu_device *vdev, bool only_new_msgs, struct drm_
2927
void ivpu_fw_log_mark_read(struct ivpu_device *vdev);
3028
void ivpu_fw_log_reset(struct ivpu_device *vdev);
3129

32-
static inline void ivpu_fw_log_dump(struct ivpu_device *vdev)
33-
{
34-
struct drm_printer p = drm_info_printer(vdev->drm.dev);
35-
36-
ivpu_fw_log_print(vdev, false, &p);
37-
}
3830

3931
#endif /* __IVPU_FW_LOG_H__ */

drivers/accel/ivpu/ivpu_pm.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,18 @@
99
#include <linux/pm_runtime.h>
1010
#include <linux/reboot.h>
1111

12-
#include "vpu_boot_api.h"
12+
#include "ivpu_coredump.h"
1313
#include "ivpu_drv.h"
14-
#include "ivpu_hw.h"
1514
#include "ivpu_fw.h"
1615
#include "ivpu_fw_log.h"
16+
#include "ivpu_hw.h"
1717
#include "ivpu_ipc.h"
1818
#include "ivpu_job.h"
1919
#include "ivpu_jsm_msg.h"
2020
#include "ivpu_mmu.h"
2121
#include "ivpu_ms.h"
2222
#include "ivpu_pm.h"
23+
#include "vpu_boot_api.h"
2324

2425
static bool ivpu_disable_recovery;
2526
module_param_named_unsafe(disable_recovery, ivpu_disable_recovery, bool, 0644);
@@ -124,7 +125,7 @@ static void ivpu_pm_recovery_work(struct work_struct *work)
124125
if (ret)
125126
ivpu_err(vdev, "Failed to resume NPU: %d\n", ret);
126127

127-
ivpu_fw_log_dump(vdev);
128+
ivpu_dev_coredump(vdev);
128129

129130
atomic_inc(&vdev->pm->reset_counter);
130131
atomic_set(&vdev->pm->reset_pending, 1);
@@ -263,7 +264,7 @@ int ivpu_pm_runtime_suspend_cb(struct device *dev)
263264
if (!is_idle || ret_d0i3) {
264265
ivpu_err(vdev, "Forcing cold boot due to previous errors\n");
265266
atomic_inc(&vdev->pm->reset_counter);
266-
ivpu_fw_log_dump(vdev);
267+
ivpu_dev_coredump(vdev);
267268
ivpu_pm_prepare_cold_boot(vdev);
268269
} else {
269270
ivpu_pm_prepare_warm_boot(vdev);

0 commit comments

Comments
 (0)