static void mt_aee_show_timer_info(void) { int cpu; for_each_possible_cpu(cpu) { aee_wdt_printf("[TimerISR#%d]last s:%llu e:%llu ns\n", cpu, per_cpu(local_timer_ts, cpu), per_cpu(local_timer_te, cpu)); } }
static void wdt_fiq(void *arg, void *regs, void *svc_sp) { unsigned int wdt_mode_val; struct wd_api*wd_api = NULL; get_wd_api(&wd_api); wdt_mode_val = DRV_Reg32(MTK_WDT_STATUS); DRV_WriteReg32(MTK_WDT_NONRST_REG, wdt_mode_val); #ifdef CONFIG_MTK_WD_KICKER aee_wdt_printf("\n kick=0x%08x,check=0x%08x \n",wd_api->wd_get_kick_bit(),wd_api->wd_get_check_bit()); #endif aee_wdt_fiq_info(arg, regs, svc_sp); }
/* for MTK fiq debug log mechanism*/ static void mt_aee_show_current_irq_counts(void) { int irq, cpu, count; unsigned long long t_cur, t_diff; t_cur = sched_clock(); /* spin_lock_irqsave(&mt_irq_count_lock, flags); */ aee_wdt_printf("\nIRQ Status\n"); for (cpu = 0; cpu < num_possible_cpus(); cpu++) { t_diff = t_cur - per_cpu(save_irq_count_time, cpu); aee_wdt_printf("Dur:%lld us,(now:%lld,last:%lld)\n", usec_high(t_diff), usec_high(t_cur), usec_high(per_cpu(save_irq_count_time, cpu))); aee_wdt_printf("CPU%d state:%s\n", cpu, cpu_online(cpu) ? "online" : "offline"); for (irq = 0; irq < nr_irqs && irq < MAX_NR_IRQS; irq++) { count = kstat_irqs_cpu(irq, cpu); if (count != 0) aee_wdt_printf(" %d:%s +%d(%d)\n", irq, isr_name(irq), count - per_cpu(irq_count_mon, cpu).irqs[irq], count); } } #ifdef CONFIG_SMP for (cpu = 0; cpu < num_possible_cpus(); cpu++) { aee_wdt_printf("CPU#%d:\n", cpu); for (irq = 0; irq < NR_IPI; irq++) { count = __get_irq_stat(cpu, ipi_irqs[irq]); if (count != 0) aee_wdt_printf(" %d:IPI +%d(%d)\n", irq, count - per_cpu(ipi_count_mon, cpu).ipis[irq], count); } } #endif /* spin_unlock_irqrestore(&mt_irq_count_lock, flags); */ }
void mt_aee_dump_sched_traces(void) { struct sched_block_event *b_isr, *b_sq, *b_tk, *b_hrt, *b_sft; struct sched_stop_event *e_irq, *e_pmpt; int cpu; for_each_possible_cpu(cpu) { get_sched_block_events(b_isr, b_sq, b_tk, b_hrt, b_sft); get_sched_stop_events(e_pmpt, e_irq); aee_wdt_printf("CPU%d\n", cpu); b_isr->cur_event == 0 ? aee_wdt_printf("[ISR]last#%d,dur:%lld s:%lld\n\n", (int)b_isr->last_event, usec_high(b_isr->last_te - b_isr->last_ts), usec_high(b_isr-> last_ts)) : aee_wdt_printf ("[In ISR]Current irq#:%d, Start:%lld (elapsed: %lld), last irq#:%d, s:%lld, e:%lld\n\n", (int)b_isr->cur_event, usec_high(b_isr->cur_ts), usec_high(sched_clock() - b_isr->cur_ts), (int)b_isr->last_event, usec_high(b_isr->last_ts), usec_high(b_isr->last_te)); if (b_sq->cur_event == 0) aee_wdt_printf("[Softirq]last#%d,dur:%lld s:%lld\n\n", (int)b_sq->last_event, usec_high(b_sq->last_te - b_sq->last_ts), usec_high(b_sq->last_ts)); else { aee_wdt_printf("[In Softirq]Current softirq#:%d, Start:%lld(elapsed: %lld),", (int)b_sq->cur_event, usec_high(b_sq->cur_ts), usec_high(sched_clock() - b_sq->cur_ts)); aee_wdt_printf(" last softirq#:%d(dur:%lld), s:%lld, e:%lld\n\n", (int)b_sq->last_event, usec_high(b_sq->last_te - b_sq->last_ts), usec_high(b_sq->last_ts), usec_high(b_sq->last_te)); } if (b_tk->cur_event == 0) aee_wdt_printf("[Tasklet]%d/SoftIRQ\n %pS dur:%lld s:%lld\n\n", (int)b_tk->last_count, (void *)b_tk->last_event, usec_high(b_tk->last_te - b_tk->last_ts), usec_high(b_tk->last_ts)); else { aee_wdt_printf( "[In Tasklet]\n Occurs: cur:%d, last:%d\n Current:%pS, Start:%lld(elapsed: %lld),", (int)b_tk->cur_count, (int)b_tk->last_count, (void *)b_tk->cur_event, usec_high(b_tk->cur_ts), usec_high(sched_clock() - b_tk->cur_ts)); aee_wdt_printf(" last#:%pS(dur:%lld), last_start:%lld, last_end:%lld\n\n", (void *)b_tk->last_event, usec_high(b_tk->last_te - b_tk->last_ts), usec_high(b_tk->last_ts), usec_high(b_tk->last_te)); } if (b_hrt->cur_event == 0) aee_wdt_printf("[HRTimer]%d/ISR\n %pS dur:%lld s:%lld\n\n", (int)b_hrt->last_count, (void *)b_hrt->last_event, usec_high(b_hrt->last_te - b_hrt->last_ts), usec_high(b_hrt->last_ts)); else { aee_wdt_printf ("[In HRTimer]\n Occurs: cur:%d, last:%d\n Current:%pS, Start:%lld(elapsed: %lld),", (int)b_tk->cur_count, (int)b_tk->last_count, (void *)b_hrt->cur_event, usec_high(b_hrt->cur_ts), usec_high(sched_clock() - b_hrt->cur_ts)); aee_wdt_printf(" last#:%pS(dur:%lld), last_start:%lld, last_end:%lld\n\n", (void *)b_hrt->last_event, usec_high(b_hrt->last_te - b_hrt->last_ts), usec_high(b_hrt->last_ts), usec_high(b_hrt->last_te)); } if (b_sft->cur_event == 0) aee_wdt_printf("[SoftTimer]%d/SoftIRQ\n %pS dur:%lld s:%lld\n\n", (int)b_sft->last_count, (void *)b_sft->last_event, usec_high(b_sft->last_te - b_sft->last_ts), usec_high(b_sft->last_ts)); else { aee_wdt_printf ("[In SoftTimer]\n Occurs: cur:%d, last:%d\n Current:%pS, Start:%lld(elapsed: %lld),", (int)b_sft->cur_count, (int)b_sft->last_count, (void *)b_sft->cur_event, usec_high(b_sft->cur_ts), usec_high(sched_clock() - b_sft->cur_ts)); aee_wdt_printf(" last#:%pS(dur:%lld), last_start:%lld, last_end:%lld\n\n", (void *)b_sft->last_event, usec_high(b_sft->last_te - b_sft->last_ts), usec_high(b_sft->last_ts), usec_high(b_sft->last_te)); } /**** Dump Stop Events ****/ /* * e_irq->cur_ts == 0? aee_wdt_printf("[IRQ disable] last duration:%llu ns (s: %llu, e: %llu)\n\n", e_irq->last_te - e_irq->last_ts, e_irq->last_ts, e_irq->last_te): aee_wdt_printf("[IRQ disable] cur_ts:%llu(elapsed:%llu ns), " "last duration:%llu ns(s: %llu, e: %llu)\n\n", e_irq->cur_ts, sched_clock() - e_irq->cur_ts, e_irq->last_te - e_irq->last_ts," " e_irq->last_ts, e_irq->last_te); e_pmpt->cur_ts == 0? aee_wdt_printf("[Preempt disable] last duration:%llu ns(s: %llu, e: %llu)\n\n", e_pmpt->last_te - e_pmpt->last_ts, e_pmpt->last_ts, e_pmpt->last_te): aee_wdt_printf("[Preempt disable] cur_ts:%llu(elapsed:%llu ns), " "last duration:%llu ns(s: %llu, e: %llu)\n\n", e_pmpt->cur_ts, sched_clock() - e_pmpt->cur_ts, e_pmpt->last_te - e_pmpt->last_ts," " e_pmpt->last_ts, e_pmpt->last_te); */ } mt_aee_show_current_irq_counts(); mt_aee_show_timer_info(); }