From 63614e76b898f35a38c4455e472fae4257b61d5a Mon Sep 17 00:00:00 2001 From: Govindaraj Rajagopal Date: Fri, 9 Jul 2021 15:59:10 +0530 Subject: [PATCH] video: driver: add support to bugon for requested types Added change to enable bugon at handle_system_error for error types requested via debugfs property. Fatal: adb shell "echo 0x1 > /d/msm_vidc/enable_bugon" NoC: adb shell "echo 0x2 > /d/msm_vidc/enable_bugon" WD Timeout: adb shell "echo 0x4 > /d/msm_vidc/enable_bugon". Change-Id: Iecc1b076c7ca53acee837d68e1a7446dbaef6e94 Signed-off-by: Govindaraj Rajagopal --- driver/vidc/inc/msm_vidc_debug.h | 15 +++++++++++++++ driver/vidc/src/msm_vidc_debug.c | 5 +++++ driver/vidc/src/venus_hfi_response.c | 17 ++++++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/driver/vidc/inc/msm_vidc_debug.h b/driver/vidc/inc/msm_vidc_debug.h index d20116d252..2f5aa14812 100644 --- a/driver/vidc/inc/msm_vidc_debug.h +++ b/driver/vidc/inc/msm_vidc_debug.h @@ -35,6 +35,7 @@ extern bool msm_vidc_lossless_encode; extern bool msm_vidc_syscache_disable; extern int msm_vidc_clock_voting; extern bool msm_vidc_fw_dump; +extern unsigned int msm_vidc_enable_bugon; /* To enable messages OR these values and * echo the result to debugfs file. @@ -120,6 +121,14 @@ enum vidc_msg_prio { } \ } while (0) +#define MSM_VIDC_FATAL(value) \ + do { \ + if (value) { \ + d_vpr_e("bug on\n"); \ + BUG_ON(value); \ + } \ + } while (0) + enum msm_vidc_debugfs_event { MSM_VIDC_DEBUGFS_EVENT_ETB, MSM_VIDC_DEBUGFS_EVENT_EBD, @@ -127,6 +136,12 @@ enum msm_vidc_debugfs_event { MSM_VIDC_DEBUGFS_EVENT_FBD, }; +enum msm_vidc_bug_on_error { + MSM_VIDC_BUG_ON_FATAL = BIT(0), + MSM_VIDC_BUG_ON_NOC = BIT(1), + MSM_VIDC_BUG_ON_WD_TIMEOUT = BIT(2), +}; + struct dentry *msm_vidc_debugfs_init_drv(void); struct dentry *msm_vidc_debugfs_init_core(void *core); struct dentry *msm_vidc_debugfs_init_inst(void *inst, diff --git a/driver/vidc/src/msm_vidc_debug.c b/driver/vidc/src/msm_vidc_debug.c index df2c3ed954..51108c23a2 100644 --- a/driver/vidc/src/msm_vidc_debug.c +++ b/driver/vidc/src/msm_vidc_debug.c @@ -86,6 +86,9 @@ int msm_vidc_clock_voting = !1; bool msm_vidc_fw_dump = !true; EXPORT_SYMBOL(msm_vidc_fw_dump); +unsigned int msm_vidc_enable_bugon = !1; +EXPORT_SYMBOL(msm_vidc_enable_bugon); + #define MAX_DBG_BUF_SIZE 4096 struct core_inst_pair { @@ -249,6 +252,8 @@ struct dentry* msm_vidc_debugfs_init_drv() &msm_vidc_lossless_encode); debugfs_create_bool("msm_vidc_fw_dump", 0644, dir, &msm_vidc_fw_dump); + debugfs_create_u32("enable_bugon", 0644, dir, + &msm_vidc_enable_bugon); return dir; diff --git a/driver/vidc/src/venus_hfi_response.c b/driver/vidc/src/venus_hfi_response.c index 4205c28c21..0a9f821084 100644 --- a/driver/vidc/src/venus_hfi_response.c +++ b/driver/vidc/src/venus_hfi_response.c @@ -436,10 +436,25 @@ void fw_coredump(struct msm_vidc_core *core) int handle_system_error(struct msm_vidc_core *core, struct hfi_packet *pkt) { - d_vpr_e("%s: system error received\n", __func__); + bool bug_on = false; + d_vpr_e("%s: system error received\n", __func__); print_sfr_message(core); venus_hfi_noc_error_info(core); + + /* enable force bugon for requested type */ + if (pkt->type == HFI_SYS_ERROR_FATAL) + bug_on = !!(msm_vidc_enable_bugon & MSM_VIDC_BUG_ON_FATAL); + else if (pkt->type == HFI_SYS_ERROR_NOC) + bug_on = !!(msm_vidc_enable_bugon & MSM_VIDC_BUG_ON_NOC); + else if (pkt->type == HFI_SYS_ERROR_WD_TIMEOUT) + bug_on = !!(msm_vidc_enable_bugon & MSM_VIDC_BUG_ON_WD_TIMEOUT); + + if (bug_on) { + d_vpr_e("%s: force bugon for type %#x\n", __func__, pkt->type); + MSM_VIDC_FATAL(true); + } + msm_vidc_core_deinit(core, true); return 0;