Merge tag 'u-boot-amlogic-20181207' of git://git.denx.de/u-boot-amlogic
[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(ulong code, ulong 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 ulong handle_trap(ulong cause, ulong epc, struct pt_regs *regs)
38 {
39         ulong is_irq, irq;
40
41         is_irq = (cause & MCAUSE_INT);
42         irq = (cause & ~MCAUSE_INT);
43
44         if (is_irq) {
45                 switch (irq) {
46                 case IRQ_M_EXT:
47                 case IRQ_S_EXT:
48                         external_interrupt(0);  /* handle external interrupt */
49                         break;
50                 case IRQ_M_TIMER:
51                 case IRQ_S_TIMER:
52                         timer_interrupt(0);     /* handle timer interrupt */
53                         break;
54                 default:
55                         _exit_trap(cause, epc, regs);
56                         break;
57                 };
58         } else {
59                 _exit_trap(cause, epc, regs);
60         }
61
62         return epc;
63 }
64
65 /*
66  *Entry Point for PLIC Interrupt Handler
67  */
68 __attribute__((weak)) void external_interrupt(struct pt_regs *regs)
69 {
70 }
71
72 __attribute__((weak)) void timer_interrupt(struct pt_regs *regs)
73 {
74 }
75
76 static void _exit_trap(ulong code, ulong epc, struct pt_regs *regs)
77 {
78         static const char * const exception_code[] = {
79                 "Instruction address misaligned",
80                 "Instruction access fault",
81                 "Illegal instruction",
82                 "Breakpoint",
83                 "Load address misaligned",
84                 "Load access fault",
85                 "Store/AMO address misaligned",
86                 "Store/AMO access fault",
87                 "Environment call from U-mode",
88                 "Environment call from S-mode",
89                 "Reserved",
90                 "Environment call from M-mode",
91                 "Instruction page fault",
92                 "Load page fault",
93                 "Reserved",
94                 "Store/AMO page fault",
95         };
96
97         if (code < ARRAY_SIZE(exception_code)) {
98                 printf("exception code: %ld , %s , epc %lx , ra %lx\n",
99                        code, exception_code[code], epc, regs->ra);
100         } else {
101                 printf("Reserved\n");
102         }
103
104         hang();
105 }