mtd: sf: Make sf_mtd.c more robust
[platform/kernel/u-boot.git] / arch / riscv / lib / interrupts.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (c) 2016-17 Microsemi Corporation.
4  * Padmarao Begari, Microsemi Corporation <padmarao.begari@microsemi.com>
5  *
6  * Copyright (C) 2017 Andes Technology Corporation
7  * Rick Chen, Andes Technology Corporation <rick@andestech.com>
8  */
9
10 #include <common.h>
11 #include <asm/ptrace.h>
12 #include <asm/system.h>
13 #include <asm/encoding.h>
14
15 static void _exit_trap(int code, uint epc, struct pt_regs *regs);
16
17 int interrupt_init(void)
18 {
19         return 0;
20 }
21
22 /*
23  * enable interrupts
24  */
25 void enable_interrupts(void)
26 {
27 }
28
29 /*
30  * disable interrupts
31  */
32 int disable_interrupts(void)
33 {
34         return 0;
35 }
36
37 uint handle_trap(uint mcause, uint epc, struct pt_regs *regs)
38 {
39         uint is_int;
40
41         is_int = (mcause & MCAUSE_INT);
42         if ((is_int) && ((mcause & MCAUSE_CAUSE)  == IRQ_M_EXT))
43                 external_interrupt(0);  /* handle_m_ext_interrupt */
44         else if ((is_int) && ((mcause & MCAUSE_CAUSE)  == IRQ_M_TIMER))
45                 timer_interrupt(0);     /* handle_m_timer_interrupt */
46         else
47                 _exit_trap(mcause, epc, regs);
48
49         return epc;
50 }
51
52 /*
53  *Entry Point for PLIC Interrupt Handler
54  */
55 __attribute__((weak)) void external_interrupt(struct pt_regs *regs)
56 {
57 }
58
59 __attribute__((weak)) void timer_interrupt(struct pt_regs *regs)
60 {
61 }
62
63 static void _exit_trap(int code, uint epc, struct pt_regs *regs)
64 {
65         static const char * const exception_code[] = {
66                 "Instruction address misaligned",
67                 "Instruction access fault",
68                 "Illegal instruction",
69                 "Breakpoint",
70                 "Load address misaligned"
71         };
72
73         printf("exception code: %d , %s , epc %08x , ra %08lx\n",
74                 code, exception_code[code], epc, regs->ra);
75 }