xref: /rk3399_rockchip-uboot/arch/arm/lib/interrupts_64.c (revision 5e076729c1804b0d68509e0bf0f38c7dbf3679cd)
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*5e076729SPeng Fan DECLARE_GLOBAL_DATA_PTR;
13f4fc5f8dSKever Yang #if defined(CONFIG_SPL_BUILD) || !defined(CONFIG_IRQ)
14*5e076729SPeng Fan 
150ae76531SDavid Feng int interrupt_init(void)
160ae76531SDavid Feng {
170ae76531SDavid Feng 	return 0;
180ae76531SDavid Feng }
190ae76531SDavid Feng 
200ae76531SDavid Feng void enable_interrupts(void)
210ae76531SDavid Feng {
220ae76531SDavid Feng 	return;
230ae76531SDavid Feng }
240ae76531SDavid Feng 
250ae76531SDavid Feng int disable_interrupts(void)
260ae76531SDavid Feng {
270ae76531SDavid Feng 	return 0;
280ae76531SDavid Feng }
29fa40f8a0SJoseph Chen #endif
300ae76531SDavid Feng 
310ae76531SDavid Feng void show_regs(struct pt_regs *regs)
320ae76531SDavid Feng {
330ae76531SDavid Feng 	int i;
340ae76531SDavid Feng 
35*5e076729SPeng Fan 	if (gd->flags & GD_FLG_RELOC) {
36*5e076729SPeng Fan 		printf("ELR:     %lx\n", regs->elr - gd->reloc_off);
37*5e076729SPeng Fan 		printf("LR:      %lx\n", regs->regs[30] - gd->reloc_off);
38*5e076729SPeng Fan 	} else {
390ae76531SDavid Feng 		printf("ELR:     %lx\n", regs->elr);
400ae76531SDavid Feng 		printf("LR:      %lx\n", regs->regs[30]);
41*5e076729SPeng Fan 	}
420ae76531SDavid Feng 	for (i = 0; i < 29; i += 2)
430ae76531SDavid Feng 		printf("x%-2d: %016lx x%-2d: %016lx\n",
440ae76531SDavid Feng 		       i, regs->regs[i], i+1, regs->regs[i+1]);
450ae76531SDavid Feng 	printf("\n");
460ae76531SDavid Feng }
470ae76531SDavid Feng 
480ae76531SDavid Feng /*
490ae76531SDavid Feng  * do_bad_sync handles the impossible case in the Synchronous Abort vector.
500ae76531SDavid Feng  */
510ae76531SDavid Feng void do_bad_sync(struct pt_regs *pt_regs, unsigned int esr)
520ae76531SDavid Feng {
5364982915SAlexander Graf 	efi_restore_gd();
540ae76531SDavid Feng 	printf("Bad mode in \"Synchronous Abort\" handler, esr 0x%08x\n", esr);
550ae76531SDavid Feng 	show_regs(pt_regs);
560ae76531SDavid Feng 	panic("Resetting CPU ...\n");
570ae76531SDavid Feng }
580ae76531SDavid Feng 
590ae76531SDavid Feng /*
600ae76531SDavid Feng  * do_bad_irq handles the impossible case in the Irq vector.
610ae76531SDavid Feng  */
620ae76531SDavid Feng void do_bad_irq(struct pt_regs *pt_regs, unsigned int esr)
630ae76531SDavid Feng {
6464982915SAlexander Graf 	efi_restore_gd();
650ae76531SDavid Feng 	printf("Bad mode in \"Irq\" handler, esr 0x%08x\n", esr);
660ae76531SDavid Feng 	show_regs(pt_regs);
670ae76531SDavid Feng 	panic("Resetting CPU ...\n");
680ae76531SDavid Feng }
690ae76531SDavid Feng 
700ae76531SDavid Feng /*
710ae76531SDavid Feng  * do_bad_fiq handles the impossible case in the Fiq vector.
720ae76531SDavid Feng  */
730ae76531SDavid Feng void do_bad_fiq(struct pt_regs *pt_regs, unsigned int esr)
740ae76531SDavid Feng {
7564982915SAlexander Graf 	efi_restore_gd();
760ae76531SDavid Feng 	printf("Bad mode in \"Fiq\" handler, esr 0x%08x\n", esr);
770ae76531SDavid Feng 	show_regs(pt_regs);
780ae76531SDavid Feng 	panic("Resetting CPU ...\n");
790ae76531SDavid Feng }
800ae76531SDavid Feng 
810ae76531SDavid Feng /*
820ae76531SDavid Feng  * do_bad_error handles the impossible case in the Error vector.
830ae76531SDavid Feng  */
840ae76531SDavid Feng void do_bad_error(struct pt_regs *pt_regs, unsigned int esr)
850ae76531SDavid Feng {
8664982915SAlexander Graf 	efi_restore_gd();
870ae76531SDavid Feng 	printf("Bad mode in \"Error\" handler, esr 0x%08x\n", esr);
880ae76531SDavid Feng 	show_regs(pt_regs);
890ae76531SDavid Feng 	panic("Resetting CPU ...\n");
900ae76531SDavid Feng }
910ae76531SDavid Feng 
920ae76531SDavid Feng /*
930ae76531SDavid Feng  * do_sync handles the Synchronous Abort exception.
940ae76531SDavid Feng  */
950ae76531SDavid Feng void do_sync(struct pt_regs *pt_regs, unsigned int esr)
960ae76531SDavid Feng {
9764982915SAlexander Graf 	efi_restore_gd();
980ae76531SDavid Feng 	printf("\"Synchronous Abort\" handler, esr 0x%08x\n", esr);
990ae76531SDavid Feng 	show_regs(pt_regs);
1000ae76531SDavid Feng 	panic("Resetting CPU ...\n");
1010ae76531SDavid Feng }
1020ae76531SDavid Feng 
103f4fc5f8dSKever Yang #if defined(CONFIG_SPL_BUILD) || !defined(CONFIG_IRQ)
1040ae76531SDavid Feng /*
1050ae76531SDavid Feng  * do_irq handles the Irq exception.
1060ae76531SDavid Feng  */
1070ae76531SDavid Feng void do_irq(struct pt_regs *pt_regs, unsigned int esr)
1080ae76531SDavid Feng {
10964982915SAlexander Graf 	efi_restore_gd();
1100ae76531SDavid Feng 	printf("\"Irq\" handler, esr 0x%08x\n", esr);
1110ae76531SDavid Feng 	show_regs(pt_regs);
1120ae76531SDavid Feng 	panic("Resetting CPU ...\n");
1130ae76531SDavid Feng }
114fa40f8a0SJoseph Chen #endif
1150ae76531SDavid Feng 
1160ae76531SDavid Feng /*
1170ae76531SDavid Feng  * do_fiq handles the Fiq exception.
1180ae76531SDavid Feng  */
1190ae76531SDavid Feng void do_fiq(struct pt_regs *pt_regs, unsigned int esr)
1200ae76531SDavid Feng {
12164982915SAlexander Graf 	efi_restore_gd();
1220ae76531SDavid Feng 	printf("\"Fiq\" handler, esr 0x%08x\n", esr);
1230ae76531SDavid Feng 	show_regs(pt_regs);
1240ae76531SDavid Feng 	panic("Resetting CPU ...\n");
1250ae76531SDavid Feng }
1260ae76531SDavid Feng 
1270ae76531SDavid Feng /*
1280ae76531SDavid Feng  * do_error handles the Error exception.
1290ae76531SDavid Feng  * Errors are more likely to be processor specific,
1300ae76531SDavid Feng  * it is defined with weak attribute and can be redefined
1310ae76531SDavid Feng  * in processor specific code.
1320ae76531SDavid Feng  */
1330ae76531SDavid Feng void __weak do_error(struct pt_regs *pt_regs, unsigned int esr)
1340ae76531SDavid Feng {
13564982915SAlexander Graf 	efi_restore_gd();
1360ae76531SDavid Feng 	printf("\"Error\" handler, esr 0x%08x\n", esr);
1370ae76531SDavid Feng 	show_regs(pt_regs);
1380ae76531SDavid Feng 	panic("Resetting CPU ...\n");
1390ae76531SDavid Feng }
140