1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * (C) Copyright 2018 Rockchip Electronics Co., Ltd
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun #include <asm/io.h>
8*4882a593Smuzhiyun #include <common.h>
9*4882a593Smuzhiyun #include <irq-generic.h>
10*4882a593Smuzhiyun #include <rk_timer_irq.h>
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun /*
13*4882a593Smuzhiyun * Currently, we support a timer timeout to generate a IRQ to dump cpu context.
14*4882a593Smuzhiyun */
15*4882a593Smuzhiyun #define ROCKCHIP_DEBUGGER_TIMEOUT 5 /* seconds */
16*4882a593Smuzhiyun
rockchip_debugger_isr(int irq,void * data)17*4882a593Smuzhiyun static void rockchip_debugger_isr(int irq, void *data)
18*4882a593Smuzhiyun {
19*4882a593Smuzhiyun writel(TIMER_CLR_INT, TIMER_BASE + TIMER_INTSTATUS);
20*4882a593Smuzhiyun }
21*4882a593Smuzhiyun
rockchip_debugger_init(void)22*4882a593Smuzhiyun int rockchip_debugger_init(void)
23*4882a593Smuzhiyun {
24*4882a593Smuzhiyun uint32_t load_count0, load_count1;
25*4882a593Smuzhiyun uint64_t delay_c = ROCKCHIP_DEBUGGER_TIMEOUT * COUNTER_FREQUENCY;
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun if (!delay_c)
28*4882a593Smuzhiyun return 0;
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun printf("Enable rockchip debugger\n");
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun /* Disable first */
33*4882a593Smuzhiyun writel(0, TIMER_BASE + TIMER_CTRL);
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun /* Config */
36*4882a593Smuzhiyun load_count0 = (uint32_t)(delay_c);
37*4882a593Smuzhiyun load_count1 = (uint32_t)(delay_c >> 32);
38*4882a593Smuzhiyun writel(load_count0, TIMER_BASE + TIMER_LOAD_COUNT0);
39*4882a593Smuzhiyun writel(load_count1, TIMER_BASE + TIMER_LOAD_COUNT1);
40*4882a593Smuzhiyun writel(TIMER_CLR_INT, TIMER_BASE + TIMER_INTSTATUS);
41*4882a593Smuzhiyun writel(TIMER_EN | TIMER_INT_EN, TIMER_BASE + TIMER_CTRL);
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun /* Request irq */
44*4882a593Smuzhiyun irq_install_handler(TIMER_IRQ, rockchip_debugger_isr, NULL);
45*4882a593Smuzhiyun irq_handler_enable(TIMER_IRQ);
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun return 0;
48*4882a593Smuzhiyun }
49