コード例 #1
0
ファイル: hifi_lpp.c プロジェクト: herryfan/kernel-huawei-h60
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;
}
コード例 #2
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;
}