xref: /rk3399_rockchip-uboot/arch/arm/lib/interrupts_64.c (revision 649829157e9c034fd5eda0de87a39afa248bd4b2)
10ae76531SDavid Feng /*
20ae76531SDavid Feng  * (C) Copyright 2013
30ae76531SDavid Feng  * David Feng <fenghua@phytium.com.cn>
40ae76531SDavid Feng  *
50ae76531SDavid Feng  * SPDX-License-Identifier:	GPL-2.0+
60ae76531SDavid Feng  */
70ae76531SDavid Feng 
80ae76531SDavid Feng #include <common.h>
90ae76531SDavid Feng #include <linux/compiler.h>
10*64982915SAlexander Graf #include <efi_loader.h>
110ae76531SDavid Feng 
120ae76531SDavid Feng 
130ae76531SDavid Feng int interrupt_init(void)
140ae76531SDavid Feng {
150ae76531SDavid Feng 	return 0;
160ae76531SDavid Feng }
170ae76531SDavid Feng 
180ae76531SDavid Feng void enable_interrupts(void)
190ae76531SDavid Feng {
200ae76531SDavid Feng 	return;
210ae76531SDavid Feng }
220ae76531SDavid Feng 
230ae76531SDavid Feng int disable_interrupts(void)
240ae76531SDavid Feng {
250ae76531SDavid Feng 	return 0;
260ae76531SDavid Feng }
270ae76531SDavid Feng 
280ae76531SDavid Feng void show_regs(struct pt_regs *regs)
290ae76531SDavid Feng {
300ae76531SDavid Feng 	int i;
310ae76531SDavid Feng 
320ae76531SDavid Feng 	printf("ELR:     %lx\n", regs->elr);
330ae76531SDavid Feng 	printf("LR:      %lx\n", regs->regs[30]);
340ae76531SDavid Feng 	for (i = 0; i < 29; i += 2)
350ae76531SDavid Feng 		printf("x%-2d: %016lx x%-2d: %016lx\n",
360ae76531SDavid Feng 		       i, regs->regs[i], i+1, regs->regs[i+1]);
370ae76531SDavid Feng 	printf("\n");
380ae76531SDavid Feng }
390ae76531SDavid Feng 
400ae76531SDavid Feng /*
410ae76531SDavid Feng  * do_bad_sync handles the impossible case in the Synchronous Abort vector.
420ae76531SDavid Feng  */
430ae76531SDavid Feng void do_bad_sync(struct pt_regs *pt_regs, unsigned int esr)
440ae76531SDavid Feng {
45*64982915SAlexander Graf 	efi_restore_gd();
460ae76531SDavid Feng 	printf("Bad mode in \"Synchronous Abort\" handler, esr 0x%08x\n", esr);
470ae76531SDavid Feng 	show_regs(pt_regs);
480ae76531SDavid Feng 	panic("Resetting CPU ...\n");
490ae76531SDavid Feng }
500ae76531SDavid Feng 
510ae76531SDavid Feng /*
520ae76531SDavid Feng  * do_bad_irq handles the impossible case in the Irq vector.
530ae76531SDavid Feng  */
540ae76531SDavid Feng void do_bad_irq(struct pt_regs *pt_regs, unsigned int esr)
550ae76531SDavid Feng {
56*64982915SAlexander Graf 	efi_restore_gd();
570ae76531SDavid Feng 	printf("Bad mode in \"Irq\" handler, esr 0x%08x\n", esr);
580ae76531SDavid Feng 	show_regs(pt_regs);
590ae76531SDavid Feng 	panic("Resetting CPU ...\n");
600ae76531SDavid Feng }
610ae76531SDavid Feng 
620ae76531SDavid Feng /*
630ae76531SDavid Feng  * do_bad_fiq handles the impossible case in the Fiq vector.
640ae76531SDavid Feng  */
650ae76531SDavid Feng void do_bad_fiq(struct pt_regs *pt_regs, unsigned int esr)
660ae76531SDavid Feng {
67*64982915SAlexander Graf 	efi_restore_gd();
680ae76531SDavid Feng 	printf("Bad mode in \"Fiq\" handler, esr 0x%08x\n", esr);
690ae76531SDavid Feng 	show_regs(pt_regs);
700ae76531SDavid Feng 	panic("Resetting CPU ...\n");
710ae76531SDavid Feng }
720ae76531SDavid Feng 
730ae76531SDavid Feng /*
740ae76531SDavid Feng  * do_bad_error handles the impossible case in the Error vector.
750ae76531SDavid Feng  */
760ae76531SDavid Feng void do_bad_error(struct pt_regs *pt_regs, unsigned int esr)
770ae76531SDavid Feng {
78*64982915SAlexander Graf 	efi_restore_gd();
790ae76531SDavid Feng 	printf("Bad mode in \"Error\" handler, esr 0x%08x\n", esr);
800ae76531SDavid Feng 	show_regs(pt_regs);
810ae76531SDavid Feng 	panic("Resetting CPU ...\n");
820ae76531SDavid Feng }
830ae76531SDavid Feng 
840ae76531SDavid Feng /*
850ae76531SDavid Feng  * do_sync handles the Synchronous Abort exception.
860ae76531SDavid Feng  */
870ae76531SDavid Feng void do_sync(struct pt_regs *pt_regs, unsigned int esr)
880ae76531SDavid Feng {
89*64982915SAlexander Graf 	efi_restore_gd();
900ae76531SDavid Feng 	printf("\"Synchronous Abort\" handler, esr 0x%08x\n", esr);
910ae76531SDavid Feng 	show_regs(pt_regs);
920ae76531SDavid Feng 	panic("Resetting CPU ...\n");
930ae76531SDavid Feng }
940ae76531SDavid Feng 
950ae76531SDavid Feng /*
960ae76531SDavid Feng  * do_irq handles the Irq exception.
970ae76531SDavid Feng  */
980ae76531SDavid Feng void do_irq(struct pt_regs *pt_regs, unsigned int esr)
990ae76531SDavid Feng {
100*64982915SAlexander Graf 	efi_restore_gd();
1010ae76531SDavid Feng 	printf("\"Irq\" handler, esr 0x%08x\n", esr);
1020ae76531SDavid Feng 	show_regs(pt_regs);
1030ae76531SDavid Feng 	panic("Resetting CPU ...\n");
1040ae76531SDavid Feng }
1050ae76531SDavid Feng 
1060ae76531SDavid Feng /*
1070ae76531SDavid Feng  * do_fiq handles the Fiq exception.
1080ae76531SDavid Feng  */
1090ae76531SDavid Feng void do_fiq(struct pt_regs *pt_regs, unsigned int esr)
1100ae76531SDavid Feng {
111*64982915SAlexander Graf 	efi_restore_gd();
1120ae76531SDavid Feng 	printf("\"Fiq\" handler, esr 0x%08x\n", esr);
1130ae76531SDavid Feng 	show_regs(pt_regs);
1140ae76531SDavid Feng 	panic("Resetting CPU ...\n");
1150ae76531SDavid Feng }
1160ae76531SDavid Feng 
1170ae76531SDavid Feng /*
1180ae76531SDavid Feng  * do_error handles the Error exception.
1190ae76531SDavid Feng  * Errors are more likely to be processor specific,
1200ae76531SDavid Feng  * it is defined with weak attribute and can be redefined
1210ae76531SDavid Feng  * in processor specific code.
1220ae76531SDavid Feng  */
1230ae76531SDavid Feng void __weak do_error(struct pt_regs *pt_regs, unsigned int esr)
1240ae76531SDavid Feng {
125*64982915SAlexander Graf 	efi_restore_gd();
1260ae76531SDavid Feng 	printf("\"Error\" handler, esr 0x%08x\n", esr);
1270ae76531SDavid Feng 	show_regs(pt_regs);
1280ae76531SDavid Feng 	panic("Resetting CPU ...\n");
1290ae76531SDavid Feng }
130