static int hifi_dump_dsp_thread(void *p) { #define HIFI_TIME_STAMP_1S 32768 #define HIFI_DUMPLOG_TIMESPAN (10 * HIFI_TIME_STAMP_1S) unsigned int exception_no = 0; unsigned int time_now = 0; unsigned int time_diff = 0; IN_FUNCTION; while (!kthread_should_stop()) { if (down_interruptible(&k3log_dsp_sema) != 0) { loge("hifi_dump_dsp_thread wake up err\n"); } time_now = (unsigned int)readl(g_misc_data.dsp_time_stamp); time_diff = time_now - g_misc_data.pre_dump_timestamp; g_misc_data.pre_dump_timestamp = time_now; exception_no = *(g_misc_data.dsp_exception_no); logi("errno:%x pre_errno:%x is_first:%d is_force:%d time_diff:%d ms\n", exception_no, g_misc_data.pre_exception_no, g_misc_data.first_dump_log, g_misc_data.force_dump_log, (time_diff * 1000) / HIFI_TIME_STAMP_1S); if (exception_no < 40 && (exception_no != g_misc_data.pre_exception_no || time_diff > HIFI_DUMPLOG_TIMESPAN)) { hifi_dump_dsp(PANIC_LOG); hifi_dump_dsp(PANIC_BIN); g_misc_data.pre_exception_no = exception_no; } else if (g_misc_data.first_dump_log || g_misc_data.force_dump_log || time_diff > HIFI_DUMPLOG_TIMESPAN){ hifi_dump_dsp(NORMAL_LOG); hifi_dump_dsp(NORMAL_BIN); g_misc_data.first_dump_log = false; } g_misc_data.force_dump_log = false; } OUT_FUNCTION; return 0; }
static int hifi_dump_dsp_thread(void *p) { #define HIFI_TIME_STAMP_1S 32768 #define HIFI_DUMPLOG_TIMESPAN (10 * HIFI_TIME_STAMP_1S) unsigned int exception_no = 0; unsigned int time_now = 0; unsigned int time_diff = 0; unsigned int* hifi_info_addr = NULL; unsigned int hifi_stack_addr = 0; int i; IN_FUNCTION; while (!kthread_should_stop()) { if (down_interruptible(&hifi_log_sema) != 0) { loge("hifi_dump_dsp_thread wake up err.\n"); } time_now = (unsigned int)readl(g_om_data.dsp_time_stamp); time_diff = time_now - g_om_data.pre_dump_timestamp; g_om_data.pre_dump_timestamp = time_now; hifi_info_addr = (unsigned char*)ioremap_wc(DRV_DSP_STACK_TO_MEM, DRV_DSP_STACK_TO_MEM_SIZE); if (NULL == hifi_info_addr) { loge("dsp log ioremap_wc hifi_info_addr fail.\n"); continue; } exception_no = *(unsigned int*)(hifi_info_addr + 3); hifi_stack_addr = *(unsigned int*)(hifi_info_addr + 4); logi("errno:%x pre_errno:%x is_first:%d is_force:%d time_diff:%d ms.\n", exception_no, g_om_data.pre_exception_no, g_om_data.first_dump_log, g_om_data.force_dump_log, (time_diff * 1000) / HIFI_TIME_STAMP_1S); if (exception_no < 40 && (exception_no != g_om_data.pre_exception_no)) { logi("panic addr:0x%x, cur_pc:0x%x, pre_pc:0x%x, cause:0x%x\n", *(unsigned int*)(hifi_info_addr), *(unsigned int*)(hifi_info_addr+1), *(unsigned int*)(hifi_info_addr+2), *(unsigned int*)(hifi_info_addr+3)); for( i = 0; i < (DRV_DSP_STACK_TO_MEM_SIZE/2)/sizeof(int)/4; i+=4){ logi("0x%x: 0x%08x 0x%08x 0x%08x 0x%08x\n", (hifi_stack_addr+i*4), *(hifi_info_addr+i),*(hifi_info_addr+1+i),*(hifi_info_addr+2+i),*(hifi_info_addr+i+3)); } hifi_dump_dsp(PANIC_LOG); hifi_dump_dsp(PANIC_BIN); g_om_data.pre_exception_no = exception_no; } else if (g_om_data.first_dump_log || g_om_data.force_dump_log || time_diff > HIFI_DUMPLOG_TIMESPAN){ hifi_dump_dsp(NORMAL_LOG); hifi_dump_dsp(NORMAL_BIN); g_om_data.first_dump_log = false; } iounmap(hifi_info_addr); hifi_info_addr = NULL; if (hifi_is_power_on()) { logi("hifi is power on, now dump ocram and tcm \n"); hifi_dump_dsp(OCRAM_BIN); hifi_dump_dsp(TCM_BIN); } } OUT_FUNCTION; return 0; }