mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
accel/ivpu: Add FW state dump on TDR
Send JSM state dump message at the beginning of TDR handler. This allows FW to collect debug info in the FW log before the state of the NPU is lost allowing to analyze the cause of a TDR. Wait a predefined timeout (10 ms) so the FW has a chance to write debug logs. We cannot wait for JSM response at this point because IRQs are already disabled before TDR handler is invoked. Signed-off-by: Tomasz Rusinowicz <tomasz.rusinowicz@intel.com> Reviewed-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20240930195322.461209-9-jacek.lawrynowicz@linux.intel.com Signed-off-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
This commit is contained in:
parent
bade034052
commit
5e162f872d
7 changed files with 43 additions and 0 deletions
|
@ -152,6 +152,7 @@ struct ivpu_device {
|
|||
int tdr;
|
||||
int autosuspend;
|
||||
int d0i3_entry_msg;
|
||||
int state_dump_msg;
|
||||
} timeout;
|
||||
};
|
||||
|
||||
|
|
|
@ -89,12 +89,14 @@ static void timeouts_init(struct ivpu_device *vdev)
|
|||
vdev->timeout.tdr = 2000000;
|
||||
vdev->timeout.autosuspend = -1;
|
||||
vdev->timeout.d0i3_entry_msg = 500;
|
||||
vdev->timeout.state_dump_msg = 10;
|
||||
} else if (ivpu_is_simics(vdev)) {
|
||||
vdev->timeout.boot = 50;
|
||||
vdev->timeout.jsm = 500;
|
||||
vdev->timeout.tdr = 10000;
|
||||
vdev->timeout.autosuspend = -1;
|
||||
vdev->timeout.d0i3_entry_msg = 100;
|
||||
vdev->timeout.state_dump_msg = 10;
|
||||
} else {
|
||||
vdev->timeout.boot = 1000;
|
||||
vdev->timeout.jsm = 500;
|
||||
|
@ -104,6 +106,7 @@ static void timeouts_init(struct ivpu_device *vdev)
|
|||
else
|
||||
vdev->timeout.autosuspend = 100;
|
||||
vdev->timeout.d0i3_entry_msg = 5;
|
||||
vdev->timeout.state_dump_msg = 10;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -364,6 +364,32 @@ int ivpu_ipc_send_receive(struct ivpu_device *vdev, struct vpu_jsm_msg *req,
|
|||
return ret;
|
||||
}
|
||||
|
||||
int ivpu_ipc_send_and_wait(struct ivpu_device *vdev, struct vpu_jsm_msg *req,
|
||||
u32 channel, unsigned long timeout_ms)
|
||||
{
|
||||
struct ivpu_ipc_consumer cons;
|
||||
int ret;
|
||||
|
||||
ret = ivpu_rpm_get(vdev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ivpu_ipc_consumer_add(vdev, &cons, channel, NULL);
|
||||
|
||||
ret = ivpu_ipc_send(vdev, &cons, req);
|
||||
if (ret) {
|
||||
ivpu_warn_ratelimited(vdev, "IPC send failed: %d\n", ret);
|
||||
goto consumer_del;
|
||||
}
|
||||
|
||||
msleep(timeout_ms);
|
||||
|
||||
consumer_del:
|
||||
ivpu_ipc_consumer_del(vdev, &cons);
|
||||
ivpu_rpm_put(vdev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool
|
||||
ivpu_ipc_match_consumer(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons,
|
||||
struct ivpu_ipc_hdr *ipc_hdr, struct vpu_jsm_msg *jsm_msg)
|
||||
|
|
|
@ -108,5 +108,7 @@ int ivpu_ipc_send_receive_active(struct ivpu_device *vdev, struct vpu_jsm_msg *r
|
|||
int ivpu_ipc_send_receive(struct ivpu_device *vdev, struct vpu_jsm_msg *req,
|
||||
enum vpu_ipc_msg_type expected_resp, struct vpu_jsm_msg *resp,
|
||||
u32 channel, unsigned long timeout_ms);
|
||||
int ivpu_ipc_send_and_wait(struct ivpu_device *vdev, struct vpu_jsm_msg *req,
|
||||
u32 channel, unsigned long timeout_ms);
|
||||
|
||||
#endif /* __IVPU_IPC_H__ */
|
||||
|
|
|
@ -559,3 +559,11 @@ int ivpu_jsm_dct_disable(struct ivpu_device *vdev)
|
|||
&resp, VPU_IPC_CHAN_ASYNC_CMD,
|
||||
vdev->timeout.jsm);
|
||||
}
|
||||
|
||||
int ivpu_jsm_state_dump(struct ivpu_device *vdev)
|
||||
{
|
||||
struct vpu_jsm_msg req = { .type = VPU_JSM_MSG_STATE_DUMP };
|
||||
|
||||
return ivpu_ipc_send_and_wait(vdev, &req, VPU_IPC_CHAN_ASYNC_CMD,
|
||||
vdev->timeout.state_dump_msg);
|
||||
}
|
||||
|
|
|
@ -43,4 +43,6 @@ int ivpu_jsm_metric_streamer_info(struct ivpu_device *vdev, u64 metric_group_mas
|
|||
u64 buffer_size, u32 *sample_size, u64 *info_size);
|
||||
int ivpu_jsm_dct_enable(struct ivpu_device *vdev, u32 active_us, u32 inactive_us);
|
||||
int ivpu_jsm_dct_disable(struct ivpu_device *vdev);
|
||||
int ivpu_jsm_state_dump(struct ivpu_device *vdev);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -125,6 +125,7 @@ static void ivpu_pm_recovery_work(struct work_struct *work)
|
|||
if (ret)
|
||||
ivpu_err(vdev, "Failed to resume NPU: %d\n", ret);
|
||||
|
||||
ivpu_jsm_state_dump(vdev);
|
||||
ivpu_dev_coredump(vdev);
|
||||
|
||||
atomic_inc(&vdev->pm->reset_counter);
|
||||
|
|
Loading…
Add table
Reference in a new issue