xref: /rk3399_rockchip-uboot/arch/arm/lib/interrupts_64.c (revision fa40f8a0c4e1a304a22cb297b4faf59a4627a774)
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>
1064982915SAlexander Graf #include <efi_loader.h>
110ae76531SDavid Feng 
12*fa40f8a0SJoseph Chen #ifndef CONFIG_IRQ
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 }
27*fa40f8a0SJoseph Chen #endif
280ae76531SDavid Feng 
290ae76531SDavid Feng void show_regs(struct pt_regs *regs)
300ae76531SDavid Feng {
310ae76531SDavid Feng 	int i;
320ae76531SDavid Feng 
330ae76531SDavid Feng 	printf("ELR:     %lx\n", regs->elr);
340ae76531SDavid Feng 	printf("LR:      %lx\n", regs->regs[30]);
350ae76531SDavid Feng 	for (i = 0; i < 29; i += 2)
360ae76531SDavid Feng 		printf("x%-2d: %016lx x%-2d: %016lx\n",
370ae76531SDavid Feng 		       i, regs->regs[i], i+1, regs->regs[i+1]);
380ae76531SDavid Feng 	printf("\n");
390ae76531SDavid Feng }
400ae76531SDavid Feng 
410ae76531SDavid Feng /*
420ae76531SDavid Feng  * do_bad_sync handles the impossible case in the Synchronous Abort vector.
430ae76531SDavid Feng  */
440ae76531SDavid Feng void do_bad_sync(struct pt_regs *pt_regs, unsigned int esr)
450ae76531SDavid Feng {
4664982915SAlexander Graf 	efi_restore_gd();
470ae76531SDavid Feng 	printf("Bad mode in \"Synchronous Abort\" handler, esr 0x%08x\n", esr);
480ae76531SDavid Feng 	show_regs(pt_regs);
490ae76531SDavid Feng 	panic("Resetting CPU ...\n");
500ae76531SDavid Feng }
510ae76531SDavid Feng 
520ae76531SDavid Feng /*
530ae76531SDavid Feng  * do_bad_irq handles the impossible case in the Irq vector.
540ae76531SDavid Feng  */
550ae76531SDavid Feng void do_bad_irq(struct pt_regs *pt_regs, unsigned int esr)
560ae76531SDavid Feng {
5764982915SAlexander Graf 	efi_restore_gd();
580ae76531SDavid Feng 	printf("Bad mode in \"Irq\" handler, esr 0x%08x\n", esr);
590ae76531SDavid Feng 	show_regs(pt_regs);
600ae76531SDavid Feng 	panic("Resetting CPU ...\n");
610ae76531SDavid Feng }
620ae76531SDavid Feng 
630ae76531SDavid Feng /*
640ae76531SDavid Feng  * do_bad_fiq handles the impossible case in the Fiq vector.
650ae76531SDavid Feng  */
660ae76531SDavid Feng void do_bad_fiq(struct pt_regs *pt_regs, unsigned int esr)
670ae76531SDavid Feng {
6864982915SAlexander Graf 	efi_restore_gd();
690ae76531SDavid Feng 	printf("Bad mode in \"Fiq\" handler, esr 0x%08x\n", esr);
700ae76531SDavid Feng 	show_regs(pt_regs);
710ae76531SDavid Feng 	panic("Resetting CPU ...\n");
720ae76531SDavid Feng }
730ae76531SDavid Feng 
740ae76531SDavid Feng /*
750ae76531SDavid Feng  * do_bad_error handles the impossible case in the Error vector.
760ae76531SDavid Feng  */
770ae76531SDavid Feng void do_bad_error(struct pt_regs *pt_regs, unsigned int esr)
780ae76531SDavid Feng {
7964982915SAlexander Graf 	efi_restore_gd();
800ae76531SDavid Feng 	printf("Bad mode in \"Error\" handler, esr 0x%08x\n", esr);
810ae76531SDavid Feng 	show_regs(pt_regs);
820ae76531SDavid Feng 	panic("Resetting CPU ...\n");
830ae76531SDavid Feng }
840ae76531SDavid Feng 
850ae76531SDavid Feng /*
860ae76531SDavid Feng  * do_sync handles the Synchronous Abort exception.
870ae76531SDavid Feng  */
880ae76531SDavid Feng void do_sync(struct pt_regs *pt_regs, unsigned int esr)
890ae76531SDavid Feng {
9064982915SAlexander Graf 	efi_restore_gd();
910ae76531SDavid Feng 	printf("\"Synchronous Abort\" handler, esr 0x%08x\n", esr);
920ae76531SDavid Feng 	show_regs(pt_regs);
930ae76531SDavid Feng 	panic("Resetting CPU ...\n");
940ae76531SDavid Feng }
950ae76531SDavid Feng 
96*fa40f8a0SJoseph Chen #ifndef CONFIG_IRQ
970ae76531SDavid Feng /*
980ae76531SDavid Feng  * do_irq handles the Irq exception.
990ae76531SDavid Feng  */
1000ae76531SDavid Feng void do_irq(struct pt_regs *pt_regs, unsigned int esr)
1010ae76531SDavid Feng {
10264982915SAlexander Graf 	efi_restore_gd();
1030ae76531SDavid Feng 	printf("\"Irq\" handler, esr 0x%08x\n", esr);
1040ae76531SDavid Feng 	show_regs(pt_regs);
1050ae76531SDavid Feng 	panic("Resetting CPU ...\n");
1060ae76531SDavid Feng }
107*fa40f8a0SJoseph Chen #endif
1080ae76531SDavid Feng 
1090ae76531SDavid Feng /*
1100ae76531SDavid Feng  * do_fiq handles the Fiq exception.
1110ae76531SDavid Feng  */
1120ae76531SDavid Feng void do_fiq(struct pt_regs *pt_regs, unsigned int esr)
1130ae76531SDavid Feng {
11464982915SAlexander Graf 	efi_restore_gd();
1150ae76531SDavid Feng 	printf("\"Fiq\" handler, esr 0x%08x\n", esr);
1160ae76531SDavid Feng 	show_regs(pt_regs);
1170ae76531SDavid Feng 	panic("Resetting CPU ...\n");
1180ae76531SDavid Feng }
1190ae76531SDavid Feng 
1200ae76531SDavid Feng /*
1210ae76531SDavid Feng  * do_error handles the Error exception.
1220ae76531SDavid Feng  * Errors are more likely to be processor specific,
1230ae76531SDavid Feng  * it is defined with weak attribute and can be redefined
1240ae76531SDavid Feng  * in processor specific code.
1250ae76531SDavid Feng  */
1260ae76531SDavid Feng void __weak do_error(struct pt_regs *pt_regs, unsigned int esr)
1270ae76531SDavid Feng {
12864982915SAlexander Graf 	efi_restore_gd();
1290ae76531SDavid Feng 	printf("\"Error\" handler, esr 0x%08x\n", esr);
1300ae76531SDavid Feng 	show_regs(pt_regs);
1310ae76531SDavid Feng 	panic("Resetting CPU ...\n");
1320ae76531SDavid Feng }
133