xref: /rk3399_rockchip-uboot/arch/arm/lib/interrupts_64.c (revision 0ae7653128c80a4f2920cbe9b124792c2fd9d9e0)
1*0ae76531SDavid Feng /*
2*0ae76531SDavid Feng  * (C) Copyright 2013
3*0ae76531SDavid Feng  * David Feng <fenghua@phytium.com.cn>
4*0ae76531SDavid Feng  *
5*0ae76531SDavid Feng  * SPDX-License-Identifier:	GPL-2.0+
6*0ae76531SDavid Feng  */
7*0ae76531SDavid Feng 
8*0ae76531SDavid Feng #include <common.h>
9*0ae76531SDavid Feng #include <linux/compiler.h>
10*0ae76531SDavid Feng 
11*0ae76531SDavid Feng 
12*0ae76531SDavid Feng int interrupt_init(void)
13*0ae76531SDavid Feng {
14*0ae76531SDavid Feng 	return 0;
15*0ae76531SDavid Feng }
16*0ae76531SDavid Feng 
17*0ae76531SDavid Feng void enable_interrupts(void)
18*0ae76531SDavid Feng {
19*0ae76531SDavid Feng 	return;
20*0ae76531SDavid Feng }
21*0ae76531SDavid Feng 
22*0ae76531SDavid Feng int disable_interrupts(void)
23*0ae76531SDavid Feng {
24*0ae76531SDavid Feng 	return 0;
25*0ae76531SDavid Feng }
26*0ae76531SDavid Feng 
27*0ae76531SDavid Feng void show_regs(struct pt_regs *regs)
28*0ae76531SDavid Feng {
29*0ae76531SDavid Feng 	int i;
30*0ae76531SDavid Feng 
31*0ae76531SDavid Feng 	printf("ELR:     %lx\n", regs->elr);
32*0ae76531SDavid Feng 	printf("LR:      %lx\n", regs->regs[30]);
33*0ae76531SDavid Feng 	for (i = 0; i < 29; i += 2)
34*0ae76531SDavid Feng 		printf("x%-2d: %016lx x%-2d: %016lx\n",
35*0ae76531SDavid Feng 		       i, regs->regs[i], i+1, regs->regs[i+1]);
36*0ae76531SDavid Feng 	printf("\n");
37*0ae76531SDavid Feng }
38*0ae76531SDavid Feng 
39*0ae76531SDavid Feng /*
40*0ae76531SDavid Feng  * do_bad_sync handles the impossible case in the Synchronous Abort vector.
41*0ae76531SDavid Feng  */
42*0ae76531SDavid Feng void do_bad_sync(struct pt_regs *pt_regs, unsigned int esr)
43*0ae76531SDavid Feng {
44*0ae76531SDavid Feng 	printf("Bad mode in \"Synchronous Abort\" handler, esr 0x%08x\n", esr);
45*0ae76531SDavid Feng 	show_regs(pt_regs);
46*0ae76531SDavid Feng 	panic("Resetting CPU ...\n");
47*0ae76531SDavid Feng }
48*0ae76531SDavid Feng 
49*0ae76531SDavid Feng /*
50*0ae76531SDavid Feng  * do_bad_irq handles the impossible case in the Irq vector.
51*0ae76531SDavid Feng  */
52*0ae76531SDavid Feng void do_bad_irq(struct pt_regs *pt_regs, unsigned int esr)
53*0ae76531SDavid Feng {
54*0ae76531SDavid Feng 	printf("Bad mode in \"Irq\" handler, esr 0x%08x\n", esr);
55*0ae76531SDavid Feng 	show_regs(pt_regs);
56*0ae76531SDavid Feng 	panic("Resetting CPU ...\n");
57*0ae76531SDavid Feng }
58*0ae76531SDavid Feng 
59*0ae76531SDavid Feng /*
60*0ae76531SDavid Feng  * do_bad_fiq handles the impossible case in the Fiq vector.
61*0ae76531SDavid Feng  */
62*0ae76531SDavid Feng void do_bad_fiq(struct pt_regs *pt_regs, unsigned int esr)
63*0ae76531SDavid Feng {
64*0ae76531SDavid Feng 	printf("Bad mode in \"Fiq\" handler, esr 0x%08x\n", esr);
65*0ae76531SDavid Feng 	show_regs(pt_regs);
66*0ae76531SDavid Feng 	panic("Resetting CPU ...\n");
67*0ae76531SDavid Feng }
68*0ae76531SDavid Feng 
69*0ae76531SDavid Feng /*
70*0ae76531SDavid Feng  * do_bad_error handles the impossible case in the Error vector.
71*0ae76531SDavid Feng  */
72*0ae76531SDavid Feng void do_bad_error(struct pt_regs *pt_regs, unsigned int esr)
73*0ae76531SDavid Feng {
74*0ae76531SDavid Feng 	printf("Bad mode in \"Error\" handler, esr 0x%08x\n", esr);
75*0ae76531SDavid Feng 	show_regs(pt_regs);
76*0ae76531SDavid Feng 	panic("Resetting CPU ...\n");
77*0ae76531SDavid Feng }
78*0ae76531SDavid Feng 
79*0ae76531SDavid Feng /*
80*0ae76531SDavid Feng  * do_sync handles the Synchronous Abort exception.
81*0ae76531SDavid Feng  */
82*0ae76531SDavid Feng void do_sync(struct pt_regs *pt_regs, unsigned int esr)
83*0ae76531SDavid Feng {
84*0ae76531SDavid Feng 	printf("\"Synchronous Abort\" handler, esr 0x%08x\n", esr);
85*0ae76531SDavid Feng 	show_regs(pt_regs);
86*0ae76531SDavid Feng 	panic("Resetting CPU ...\n");
87*0ae76531SDavid Feng }
88*0ae76531SDavid Feng 
89*0ae76531SDavid Feng /*
90*0ae76531SDavid Feng  * do_irq handles the Irq exception.
91*0ae76531SDavid Feng  */
92*0ae76531SDavid Feng void do_irq(struct pt_regs *pt_regs, unsigned int esr)
93*0ae76531SDavid Feng {
94*0ae76531SDavid Feng 	printf("\"Irq\" handler, esr 0x%08x\n", esr);
95*0ae76531SDavid Feng 	show_regs(pt_regs);
96*0ae76531SDavid Feng 	panic("Resetting CPU ...\n");
97*0ae76531SDavid Feng }
98*0ae76531SDavid Feng 
99*0ae76531SDavid Feng /*
100*0ae76531SDavid Feng  * do_fiq handles the Fiq exception.
101*0ae76531SDavid Feng  */
102*0ae76531SDavid Feng void do_fiq(struct pt_regs *pt_regs, unsigned int esr)
103*0ae76531SDavid Feng {
104*0ae76531SDavid Feng 	printf("\"Fiq\" handler, esr 0x%08x\n", esr);
105*0ae76531SDavid Feng 	show_regs(pt_regs);
106*0ae76531SDavid Feng 	panic("Resetting CPU ...\n");
107*0ae76531SDavid Feng }
108*0ae76531SDavid Feng 
109*0ae76531SDavid Feng /*
110*0ae76531SDavid Feng  * do_error handles the Error exception.
111*0ae76531SDavid Feng  * Errors are more likely to be processor specific,
112*0ae76531SDavid Feng  * it is defined with weak attribute and can be redefined
113*0ae76531SDavid Feng  * in processor specific code.
114*0ae76531SDavid Feng  */
115*0ae76531SDavid Feng void __weak do_error(struct pt_regs *pt_regs, unsigned int esr)
116*0ae76531SDavid Feng {
117*0ae76531SDavid Feng 	printf("\"Error\" handler, esr 0x%08x\n", esr);
118*0ae76531SDavid Feng 	show_regs(pt_regs);
119*0ae76531SDavid Feng 	panic("Resetting CPU ...\n");
120*0ae76531SDavid Feng }
121