1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
20ae76531SDavid Feng /*
30ae76531SDavid Feng * (C) Copyright 2013
40ae76531SDavid Feng * David Feng <fenghua@phytium.com.cn>
50ae76531SDavid Feng */
60ae76531SDavid Feng
70ae76531SDavid Feng #include <common.h>
80ae76531SDavid Feng #include <linux/compiler.h>
964982915SAlexander Graf #include <efi_loader.h>
100ae76531SDavid Feng
11082693f4SPeng Fan DECLARE_GLOBAL_DATA_PTR;
120ae76531SDavid Feng
interrupt_init(void)130ae76531SDavid Feng int interrupt_init(void)
140ae76531SDavid Feng {
150ae76531SDavid Feng return 0;
160ae76531SDavid Feng }
170ae76531SDavid Feng
enable_interrupts(void)180ae76531SDavid Feng void enable_interrupts(void)
190ae76531SDavid Feng {
200ae76531SDavid Feng return;
210ae76531SDavid Feng }
220ae76531SDavid Feng
disable_interrupts(void)230ae76531SDavid Feng int disable_interrupts(void)
240ae76531SDavid Feng {
250ae76531SDavid Feng return 0;
260ae76531SDavid Feng }
270ae76531SDavid Feng
show_regs(struct pt_regs * regs)280ae76531SDavid Feng void show_regs(struct pt_regs *regs)
290ae76531SDavid Feng {
300ae76531SDavid Feng int i;
310ae76531SDavid Feng
32fa7b8eaeSKarl Beldan if (gd->flags & GD_FLG_RELOC)
33fa7b8eaeSKarl Beldan printf("elr: %016lx lr : %016lx (reloc)\n",
34fa7b8eaeSKarl Beldan regs->elr - gd->reloc_off,
35fa7b8eaeSKarl Beldan regs->regs[30] - gd->reloc_off);
36fa7b8eaeSKarl Beldan printf("elr: %016lx lr : %016lx\n", regs->elr, regs->regs[30]);
37fa7b8eaeSKarl Beldan
380ae76531SDavid Feng for (i = 0; i < 29; i += 2)
390ae76531SDavid Feng printf("x%-2d: %016lx x%-2d: %016lx\n",
400ae76531SDavid Feng i, regs->regs[i], i+1, regs->regs[i+1]);
410ae76531SDavid Feng printf("\n");
420ae76531SDavid Feng }
430ae76531SDavid Feng
440ae76531SDavid Feng /*
450ae76531SDavid Feng * do_bad_sync handles the impossible case in the Synchronous Abort vector.
460ae76531SDavid Feng */
do_bad_sync(struct pt_regs * pt_regs,unsigned int esr)470ae76531SDavid Feng void do_bad_sync(struct pt_regs *pt_regs, unsigned int esr)
480ae76531SDavid Feng {
4964982915SAlexander Graf efi_restore_gd();
500ae76531SDavid Feng printf("Bad mode in \"Synchronous Abort\" handler, esr 0x%08x\n", esr);
510ae76531SDavid Feng show_regs(pt_regs);
520ae76531SDavid Feng panic("Resetting CPU ...\n");
530ae76531SDavid Feng }
540ae76531SDavid Feng
550ae76531SDavid Feng /*
560ae76531SDavid Feng * do_bad_irq handles the impossible case in the Irq vector.
570ae76531SDavid Feng */
do_bad_irq(struct pt_regs * pt_regs,unsigned int esr)580ae76531SDavid Feng void do_bad_irq(struct pt_regs *pt_regs, unsigned int esr)
590ae76531SDavid Feng {
6064982915SAlexander Graf efi_restore_gd();
610ae76531SDavid Feng printf("Bad mode in \"Irq\" handler, esr 0x%08x\n", esr);
620ae76531SDavid Feng show_regs(pt_regs);
630ae76531SDavid Feng panic("Resetting CPU ...\n");
640ae76531SDavid Feng }
650ae76531SDavid Feng
660ae76531SDavid Feng /*
670ae76531SDavid Feng * do_bad_fiq handles the impossible case in the Fiq vector.
680ae76531SDavid Feng */
do_bad_fiq(struct pt_regs * pt_regs,unsigned int esr)690ae76531SDavid Feng void do_bad_fiq(struct pt_regs *pt_regs, unsigned int esr)
700ae76531SDavid Feng {
7164982915SAlexander Graf efi_restore_gd();
720ae76531SDavid Feng printf("Bad mode in \"Fiq\" handler, esr 0x%08x\n", esr);
730ae76531SDavid Feng show_regs(pt_regs);
740ae76531SDavid Feng panic("Resetting CPU ...\n");
750ae76531SDavid Feng }
760ae76531SDavid Feng
770ae76531SDavid Feng /*
780ae76531SDavid Feng * do_bad_error handles the impossible case in the Error vector.
790ae76531SDavid Feng */
do_bad_error(struct pt_regs * pt_regs,unsigned int esr)800ae76531SDavid Feng void do_bad_error(struct pt_regs *pt_regs, unsigned int esr)
810ae76531SDavid Feng {
8264982915SAlexander Graf efi_restore_gd();
830ae76531SDavid Feng printf("Bad mode in \"Error\" handler, esr 0x%08x\n", esr);
840ae76531SDavid Feng show_regs(pt_regs);
850ae76531SDavid Feng panic("Resetting CPU ...\n");
860ae76531SDavid Feng }
870ae76531SDavid Feng
880ae76531SDavid Feng /*
890ae76531SDavid Feng * do_sync handles the Synchronous Abort exception.
900ae76531SDavid Feng */
do_sync(struct pt_regs * pt_regs,unsigned int esr)910ae76531SDavid Feng void do_sync(struct pt_regs *pt_regs, unsigned int esr)
920ae76531SDavid Feng {
9364982915SAlexander Graf efi_restore_gd();
940ae76531SDavid Feng printf("\"Synchronous Abort\" handler, esr 0x%08x\n", esr);
950ae76531SDavid Feng show_regs(pt_regs);
960ae76531SDavid Feng panic("Resetting CPU ...\n");
970ae76531SDavid Feng }
980ae76531SDavid Feng
990ae76531SDavid Feng /*
1000ae76531SDavid Feng * do_irq handles the Irq exception.
1010ae76531SDavid Feng */
do_irq(struct pt_regs * pt_regs,unsigned int esr)1020ae76531SDavid Feng void do_irq(struct pt_regs *pt_regs, unsigned int esr)
1030ae76531SDavid Feng {
10464982915SAlexander Graf efi_restore_gd();
1050ae76531SDavid Feng printf("\"Irq\" handler, esr 0x%08x\n", esr);
1060ae76531SDavid Feng show_regs(pt_regs);
1070ae76531SDavid Feng panic("Resetting CPU ...\n");
1080ae76531SDavid Feng }
1090ae76531SDavid Feng
1100ae76531SDavid Feng /*
1110ae76531SDavid Feng * do_fiq handles the Fiq exception.
1120ae76531SDavid Feng */
do_fiq(struct pt_regs * pt_regs,unsigned int esr)1130ae76531SDavid Feng void do_fiq(struct pt_regs *pt_regs, unsigned int esr)
1140ae76531SDavid Feng {
11564982915SAlexander Graf efi_restore_gd();
1160ae76531SDavid Feng printf("\"Fiq\" handler, esr 0x%08x\n", esr);
1170ae76531SDavid Feng show_regs(pt_regs);
1180ae76531SDavid Feng panic("Resetting CPU ...\n");
1190ae76531SDavid Feng }
1200ae76531SDavid Feng
1210ae76531SDavid Feng /*
1220ae76531SDavid Feng * do_error handles the Error exception.
1230ae76531SDavid Feng * Errors are more likely to be processor specific,
1240ae76531SDavid Feng * it is defined with weak attribute and can be redefined
1250ae76531SDavid Feng * in processor specific code.
1260ae76531SDavid Feng */
do_error(struct pt_regs * pt_regs,unsigned int esr)1270ae76531SDavid Feng void __weak do_error(struct pt_regs *pt_regs, unsigned int esr)
1280ae76531SDavid Feng {
12964982915SAlexander Graf efi_restore_gd();
1300ae76531SDavid Feng printf("\"Error\" handler, esr 0x%08x\n", esr);
1310ae76531SDavid Feng show_regs(pt_regs);
1320ae76531SDavid Feng panic("Resetting CPU ...\n");
1330ae76531SDavid Feng }
134