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