rockchip: rk3399: Add Nanopi M4 2GB board support
[platform/kernel/u-boot.git] / arch / arm / lib / interrupts_64.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * (C) Copyright 2013
4  * David Feng <fenghua@phytium.com.cn>
5  */
6
7 #include <common.h>
8 #include <irq_func.h>
9 #include <linux/compiler.h>
10 #include <efi_loader.h>
11
12 DECLARE_GLOBAL_DATA_PTR;
13
14 int interrupt_init(void)
15 {
16         return 0;
17 }
18
19 void enable_interrupts(void)
20 {
21         return;
22 }
23
24 int disable_interrupts(void)
25 {
26         return 0;
27 }
28
29 static void show_efi_loaded_images(struct pt_regs *regs)
30 {
31         efi_print_image_infos((void *)regs->elr);
32 }
33
34 static void dump_instr(struct pt_regs *regs)
35 {
36         u32 *addr = (u32 *)(regs->elr & ~3UL);
37         int i;
38
39         printf("Code: ");
40         for (i = -4; i < 1; i++)
41                 printf(i == 0 ? "(%08x) " : "%08x ", addr[i]);
42         printf("\n");
43 }
44
45 void show_regs(struct pt_regs *regs)
46 {
47         int i;
48
49         if (gd->flags & GD_FLG_RELOC)
50                 printf("elr: %016lx lr : %016lx (reloc)\n",
51                        regs->elr - gd->reloc_off,
52                        regs->regs[30] - gd->reloc_off);
53         printf("elr: %016lx lr : %016lx\n", regs->elr, regs->regs[30]);
54
55         for (i = 0; i < 29; i += 2)
56                 printf("x%-2d: %016lx x%-2d: %016lx\n",
57                        i, regs->regs[i], i+1, regs->regs[i+1]);
58         printf("\n");
59         dump_instr(regs);
60 }
61
62 /*
63  * do_bad_sync handles the impossible case in the Synchronous Abort vector.
64  */
65 void do_bad_sync(struct pt_regs *pt_regs, unsigned int esr)
66 {
67         efi_restore_gd();
68         printf("Bad mode in \"Synchronous Abort\" handler, esr 0x%08x\n", esr);
69         show_regs(pt_regs);
70         show_efi_loaded_images(pt_regs);
71         panic("Resetting CPU ...\n");
72 }
73
74 /*
75  * do_bad_irq handles the impossible case in the Irq vector.
76  */
77 void do_bad_irq(struct pt_regs *pt_regs, unsigned int esr)
78 {
79         efi_restore_gd();
80         printf("Bad mode in \"Irq\" handler, esr 0x%08x\n", esr);
81         show_regs(pt_regs);
82         show_efi_loaded_images(pt_regs);
83         panic("Resetting CPU ...\n");
84 }
85
86 /*
87  * do_bad_fiq handles the impossible case in the Fiq vector.
88  */
89 void do_bad_fiq(struct pt_regs *pt_regs, unsigned int esr)
90 {
91         efi_restore_gd();
92         printf("Bad mode in \"Fiq\" handler, esr 0x%08x\n", esr);
93         show_regs(pt_regs);
94         show_efi_loaded_images(pt_regs);
95         panic("Resetting CPU ...\n");
96 }
97
98 /*
99  * do_bad_error handles the impossible case in the Error vector.
100  */
101 void do_bad_error(struct pt_regs *pt_regs, unsigned int esr)
102 {
103         efi_restore_gd();
104         printf("Bad mode in \"Error\" handler, esr 0x%08x\n", esr);
105         show_regs(pt_regs);
106         show_efi_loaded_images(pt_regs);
107         panic("Resetting CPU ...\n");
108 }
109
110 /*
111  * do_sync handles the Synchronous Abort exception.
112  */
113 void do_sync(struct pt_regs *pt_regs, unsigned int esr)
114 {
115         efi_restore_gd();
116         printf("\"Synchronous Abort\" handler, esr 0x%08x\n", esr);
117         show_regs(pt_regs);
118         show_efi_loaded_images(pt_regs);
119         panic("Resetting CPU ...\n");
120 }
121
122 /*
123  * do_irq handles the Irq exception.
124  */
125 void do_irq(struct pt_regs *pt_regs, unsigned int esr)
126 {
127         efi_restore_gd();
128         printf("\"Irq\" handler, esr 0x%08x\n", esr);
129         show_regs(pt_regs);
130         show_efi_loaded_images(pt_regs);
131         panic("Resetting CPU ...\n");
132 }
133
134 /*
135  * do_fiq handles the Fiq exception.
136  */
137 void do_fiq(struct pt_regs *pt_regs, unsigned int esr)
138 {
139         efi_restore_gd();
140         printf("\"Fiq\" handler, esr 0x%08x\n", esr);
141         show_regs(pt_regs);
142         show_efi_loaded_images(pt_regs);
143         panic("Resetting CPU ...\n");
144 }
145
146 /*
147  * do_error handles the Error exception.
148  * Errors are more likely to be processor specific,
149  * it is defined with weak attribute and can be redefined
150  * in processor specific code.
151  */
152 void __weak do_error(struct pt_regs *pt_regs, unsigned int esr)
153 {
154         efi_restore_gd();
155         printf("\"Error\" handler, esr 0x%08x\n", esr);
156         show_regs(pt_regs);
157         show_efi_loaded_images(pt_regs);
158         panic("Resetting CPU ...\n");
159 }