summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2015-09-28 22:06:01 +1000
committerDamien Zammit <damien@zamaudio.com>2015-09-28 22:06:01 +1000
commitd4afb299b7a8b4ebbca25a1e3a597a6536bdb1d5 (patch)
tree1fba9709b761db37f1686a419381477115a4dfdb
parent8cf285971f75cc1613fbe0805c2468c279624c5a (diff)
Modified interrupt setup
Signed-off-by: Damien Zammit <damien@zamaudio.com>
-rw-r--r--firmware/crt0ram-smu.S664
-rw-r--r--firmware/servicereq.c3
-rw-r--r--firmware/smu.c25
3 files changed, 352 insertions, 340 deletions
diff --git a/firmware/crt0ram-smu.S b/firmware/crt0ram-smu.S
index e03fa38..959e8de 100644
--- a/firmware/crt0ram-smu.S
+++ b/firmware/crt0ram-smu.S
@@ -1,332 +1,332 @@
-/*
- * LatticeMico32 C startup code.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * Modified for AMD SMU by Damien Zammit
- *
- */
-
-/* From include/sys/signal.h */
-#define SIGINT 2 /* interrupt */
-#define SIGTRAP 5 /* trace trap */
-#define SIGFPE 8 /* arithmetic exception */
-#define SIGSEGV 11 /* segmentation violation */
-
-#define SYSEXIT 1
-
-/* Exception handlers - Must be 32 bytes long. */
- .section .boot, "ax", @progbits
-
- .global _start
-_start:
-
- .global _reset_handler
- .type _reset_handler, @function
-_reset_handler:
- xor r0, r0, r0
- wcsr IE, r0
- wcsr IM, r0
- mvhi r1, hi(_reset_handler)
- ori r1, r1, lo(_reset_handler)
- wcsr EBA, r1
- calli _crt0
- nop
- .size _reset_handler, .-_reset_handler
-
- .global _breakpoint_handler
- .type _breakpoint_handler, @function
-_breakpoint_handler:
- rcsr r7, DEBA
- addi r7, r7, 32
- b r7
- nop
- nop
- nop
- nop
- nop
- .size _breakpoint_handler, .-_breakpoint_handler
-
- .global _instruction_bus_error_handler
- .type _instruction_bus_error_handler, @function
-_instruction_bus_error_handler:
- rcsr r7, DEBA
- addi r7, r7, 64
- b r7
- nop
- nop
- nop
- nop
- nop
- .size _instruction_bus_error_handler, .-_instruction_bus_error_handler
-
- .global _watchpoint_handler
- .type _watchpoint_handler, @function
-_watchpoint_handler:
- rcsr r7, DEBA
- addi r7, r7, 96
- b r7
- nop
- nop
- nop
- nop
- nop
- .size _watchpoint_handler, .-_watchpoint_handler
-
- .global _data_bus_error_handler
- .type _data_bus_error_handler, @function
-_data_bus_error_handler:
- rcsr r7, DEBA
- addi r7, r7, 128
- b r7
- nop
- nop
- nop
- nop
- nop
- .size _data_bus_error_handler, .-_data_bus_error_handler
-
- .global _divide_by_zero_handler
- .type _divide_by_zero_handler, @function
-_divide_by_zero_handler:
- rcsr r7, DEBA
- addi r7, r7, 160
- b r7
- nop
- nop
- nop
- nop
- nop
- .size _divide_by_zero_handler, .-_divide_by_zero_handler
-
- .global _interrupt_handler
- .type _interrupt_handler, @function
-_interrupt_handler:
- sw (sp+0), ra
- calli _save_all
- mvi r1, SIGINT
- mvhi r1, hi(MicoISRHandler)
- ori r1, r1, lo(MicoISRHandler)
- call r1
- bi _restore_all_and_return
- nop
- .size _interrupt_handler, .-_interrupt_handler
-
- .global _system_call_handler
- .type _system_call_handler, @function
-_system_call_handler:
- rcsr r7, DEBA
- addi r7, r7, 224
- b r7
- nop
- nop
- nop
- nop
- nop
- .size _system_call_handler, .-_system_call_handler
-
- .global _crt0
- .type _crt0, @function
-_crt0:
- /* Clear r0 */
- xor r0, r0, r0
- /* Setup stack and global pointer */
- mvhi sp, hi(_fstack)
- ori sp, sp, lo(_fstack)
- mvhi gp, hi(_gp)
- ori gp, gp, lo(_gp)
-
- /* Relocate text */
- mvhi r1, hi(_ftext)
- ori r1, r1, lo(_ftext)
- mvhi r2, hi(_ftext_rom)
- ori r2, r2, lo(_ftext_rom)
- be r1, r2, .L_done_text_relocation
- mvhi r3, (_etext)
- ori r3, r3, (_etext)
- calli _relocate_text
-.L_done_text_relocation:
-
- /* Relocate read-only data */
- mvhi r1, hi(_frodata)
- ori r1, r1, lo(_frodata)
- mvhi r2, hi(_frodata_rom)
- ori r2, r2, lo(_frodata_rom)
- be r1, r2, .L_done_rodata_relocation
- mvhi r3, hi(_erodata)
- ori r3, r3, lo(_erodata)
- be r1, r3, .L_done_rodata_relocation
- sub r3, r3, r1
- mvhi r4, hi(memcpy)
- ori r4, r4, lo(memcpy)
- call r4
-.L_done_rodata_relocation:
-
- /* Relocate data */
- mvhi r1, hi(_fdata)
- ori r1, r1, lo(_fdata)
- mvhi r2, hi(_fdata_rom)
- ori r2, r2, lo(_fdata_rom)
- be r1, r2, .L_done_data_relocation
- mvhi r3, hi(_edata)
- ori r3, r3, lo(_edata)
- be r1, r3, .L_done_data_relocation
- sub r3, r3, r1
- mvhi r4, hi(memcpy)
- ori r4, r4, lo(memcpy)
- call r4
-.L_done_data_relocation:
-
- /* Clear BSS */
- mvhi r1, hi(_fbss)
- ori r1, r1, lo(_fbss)
- mvhi r3, hi(_ebss)
- ori r3, r3, lo(_ebss)
- .size _crt0, .-_crt0
-
- .global .ClearBSS
- .type .ClearBSS, @function
-.ClearBSS:
- be r1, r3, .CallConstructor
- sw (r1+0), r0
- addi r1, r1, 4
- bi .ClearBSS
- .size .ClearBSS, .-.ClearBSS
-
- .global .CallConstructor
- .type .CallConstructor, @function
-.CallConstructor:
- /* Call C++ constructors */
- calli _init
- /* Call main program */
- mvi r1, 0
- mvi r2, 0
- mvi r3, 0
- calli main
- /* Call exit, which doesn't return, to perform any clean up */
- calli _fini
- calli _exit
- /* Save all registers onto the stack */
- .size .CallConstructor, .-.CallConstructor
-
- .global _relocate_text
- .type _relocate_text, @function
-_relocate_text:
- lb r4, (r2+0)
- addi r2, r2, 1
- sb (r1+0), r4
- addi r1, r1, 1
- bne r1, r3, _relocate_text
- ret
- .size _relocate_text, .-_relocate_text
-
- .global _save_all
- .type _save_all, @function
-_save_all:
- addi sp, sp, -128
- sw (sp+4), r1
- sw (sp+8), r2
- sw (sp+12), r3
- sw (sp+16), r4
- sw (sp+20), r5
- sw (sp+24), r6
- sw (sp+28), r7
- sw (sp+32), r8
- sw (sp+36), r9
- sw (sp+40), r10
- sw (sp+44), r11
- sw (sp+48), r12
- sw (sp+52), r13
- sw (sp+56), r14
- sw (sp+60), r15
- sw (sp+64), r16
- sw (sp+68), r17
- sw (sp+72), r18
- sw (sp+76), r19
- sw (sp+80), r20
- sw (sp+84), r21
- sw (sp+88), r22
- sw (sp+92), r23
- sw (sp+96), r24
- sw (sp+100), r25
- sw (sp+104), r26
- sw (sp+108), r27
- sw (sp+120), ea
- sw (sp+124), ba
- /* ra and sp need special handling, as they have been modified */
- lw r1, (sp+128)
- sw (sp+116), r1
- mv r1, sp
- addi r1, r1, 128
- sw (sp+112), r1
- xor r1, r1, r1
- wcsr ie, r1
- ret
- .size _save_all, .-_save_all
-
- .global _restore_all_and_return
- .type _restore_all_and_return, @function
- /* Restore all registers and return from exception */
-_restore_all_and_return:
- addi r1, r0, 2
- wcsr ie, r1
- lw r1, (sp+4)
- lw r2, (sp+8)
- lw r3, (sp+12)
- lw r4, (sp+16)
- lw r5, (sp+20)
- lw r6, (sp+24)
- lw r7, (sp+28)
- lw r8, (sp+32)
- lw r9, (sp+36)
- lw r10, (sp+40)
- lw r11, (sp+44)
- lw r12, (sp+48)
- lw r13, (sp+52)
- lw r14, (sp+56)
- lw r15, (sp+60)
- lw r16, (sp+64)
- lw r17, (sp+68)
- lw r18, (sp+72)
- lw r19, (sp+76)
- lw r20, (sp+80)
- lw r21, (sp+84)
- lw r22, (sp+88)
- lw r23, (sp+92)
- lw r24, (sp+96)
- lw r25, (sp+100)
- lw r26, (sp+104)
- lw r27, (sp+108)
- lw ra, (sp+116)
- lw ea, (sp+120)
- lw ba, (sp+124)
- /* Stack pointer must be restored last, in case it has been updated */
- lw sp, (sp+112)
- nop
- eret
- .size _restore_all_and_return, .-_restore_all_and_return
-
- .global _exit
-_exit:
- mvi r8, SYSEXIT
- scall
- .size _exit, .-_exit
+/*
+ * LatticeMico32 C startup code.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Modified for AMD SMU by Damien Zammit
+ *
+ */
+
+/* From include/sys/signal.h */
+#define SIGINT 2 /* interrupt */
+#define SIGTRAP 5 /* trace trap */
+#define SIGFPE 8 /* arithmetic exception */
+#define SIGSEGV 11 /* segmentation violation */
+
+#define SYSEXIT 1
+
+/* Exception handlers - Must be 32 bytes long. */
+ .section .boot, "ax", @progbits
+
+ .global _start
+_start:
+
+ .global _reset_handler
+ .type _reset_handler, @function
+_reset_handler:
+ xor r0, r0, r0
+ xor r0, r0, r0
+ wcsr IE, r0
+ mvhi r1, hi(_reset_handler)
+ ori r1, r1, lo(_reset_handler)
+ wcsr EBA, r1
+ wcsr DEBA, r1
+ calli _crt0
+ .size _reset_handler, .-_reset_handler
+
+ .global _breakpoint_handler
+ .type _breakpoint_handler, @function
+_breakpoint_handler:
+ rcsr r7, DEBA
+ addi r7, r7, 32
+ b r7
+ nop
+ nop
+ nop
+ nop
+ nop
+ .size _breakpoint_handler, .-_breakpoint_handler
+
+ .global _instruction_bus_error_handler
+ .type _instruction_bus_error_handler, @function
+_instruction_bus_error_handler:
+ rcsr r7, DEBA
+ addi r7, r7, 64
+ b r7
+ nop
+ nop
+ nop
+ nop
+ nop
+ .size _instruction_bus_error_handler, .-_instruction_bus_error_handler
+
+ .global _watchpoint_handler
+ .type _watchpoint_handler, @function
+_watchpoint_handler:
+ rcsr r7, DEBA
+ addi r7, r7, 96
+ b r7
+ nop
+ nop
+ nop
+ nop
+ nop
+ .size _watchpoint_handler, .-_watchpoint_handler
+
+ .global _data_bus_error_handler
+ .type _data_bus_error_handler, @function
+_data_bus_error_handler:
+ rcsr r7, DEBA
+ addi r7, r7, 128
+ b r7
+ nop
+ nop
+ nop
+ nop
+ nop
+ .size _data_bus_error_handler, .-_data_bus_error_handler
+
+ .global _divide_by_zero_handler
+ .type _divide_by_zero_handler, @function
+_divide_by_zero_handler:
+ rcsr r7, DEBA
+ addi r7, r7, 160
+ b r7
+ nop
+ nop
+ nop
+ nop
+ nop
+ .size _divide_by_zero_handler, .-_divide_by_zero_handler
+
+ .global _interrupt_handler
+ .type _interrupt_handler, @function
+_interrupt_handler:
+ sw (sp+0), ra
+ calli _save_all
+ mvi r1, SIGINT
+ mvhi r1, hi(MicoISRHandler)
+ ori r1, r1, lo(MicoISRHandler)
+ call r1
+ bi _restore_all_and_return
+ nop
+ .size _interrupt_handler, .-_interrupt_handler
+
+ .global _system_call_handler
+ .type _system_call_handler, @function
+_system_call_handler:
+ rcsr r7, DEBA
+ addi r7, r7, 224
+ b r7
+ nop
+ nop
+ nop
+ nop
+ nop
+ .size _system_call_handler, .-_system_call_handler
+
+ .global _crt0
+ .type _crt0, @function
+_crt0:
+ /* Clear r0 */
+ xor r0, r0, r0
+ /* Setup stack and global pointer */
+ mvhi sp, hi(_fstack)
+ ori sp, sp, lo(_fstack)
+ mvhi gp, hi(_gp)
+ ori gp, gp, lo(_gp)
+
+ /* Relocate text */
+ mvhi r1, hi(_ftext)
+ ori r1, r1, lo(_ftext)
+ mvhi r2, hi(_ftext_rom)
+ ori r2, r2, lo(_ftext_rom)
+ be r1, r2, .L_done_text_relocation
+ mvhi r3, (_etext)
+ ori r3, r3, (_etext)
+ calli _relocate_text
+.L_done_text_relocation:
+
+ /* Relocate read-only data */
+ mvhi r1, hi(_frodata)
+ ori r1, r1, lo(_frodata)
+ mvhi r2, hi(_frodata_rom)
+ ori r2, r2, lo(_frodata_rom)
+ be r1, r2, .L_done_rodata_relocation
+ mvhi r3, hi(_erodata)
+ ori r3, r3, lo(_erodata)
+ be r1, r3, .L_done_rodata_relocation
+ sub r3, r3, r1
+ mvhi r4, hi(memcpy)
+ ori r4, r4, lo(memcpy)
+ call r4
+.L_done_rodata_relocation:
+
+ /* Relocate data */
+ mvhi r1, hi(_fdata)
+ ori r1, r1, lo(_fdata)
+ mvhi r2, hi(_fdata_rom)
+ ori r2, r2, lo(_fdata_rom)
+ be r1, r2, .L_done_data_relocation
+ mvhi r3, hi(_edata)
+ ori r3, r3, lo(_edata)
+ be r1, r3, .L_done_data_relocation
+ sub r3, r3, r1
+ mvhi r4, hi(memcpy)
+ ori r4, r4, lo(memcpy)
+ call r4
+.L_done_data_relocation:
+
+ /* Clear BSS */
+ mvhi r1, hi(_fbss)
+ ori r1, r1, lo(_fbss)
+ mvhi r3, hi(_ebss)
+ ori r3, r3, lo(_ebss)
+ .size _crt0, .-_crt0
+
+ .global .ClearBSS
+ .type .ClearBSS, @function
+.ClearBSS:
+ be r1, r3, .CallConstructor
+ sw (r1+0), r0
+ addi r1, r1, 4
+ bi .ClearBSS
+ .size .ClearBSS, .-.ClearBSS
+
+ .global .CallConstructor
+ .type .CallConstructor, @function
+.CallConstructor:
+ /* Call C++ constructors */
+ calli _init
+ /* Call main program */
+ mvi r1, 0
+ mvi r2, 0
+ mvi r3, 0
+ calli main
+ /* Call exit, which doesn't return, to perform any clean up */
+ calli _fini
+ calli _exit
+ /* Save all registers onto the stack */
+ .size .CallConstructor, .-.CallConstructor
+
+ .global _relocate_text
+ .type _relocate_text, @function
+_relocate_text:
+ lb r4, (r2+0)
+ addi r2, r2, 1
+ sb (r1+0), r4
+ addi r1, r1, 1
+ bne r1, r3, _relocate_text
+ ret
+ .size _relocate_text, .-_relocate_text
+
+ .global _save_all
+ .type _save_all, @function
+_save_all:
+ addi sp, sp, -128
+ sw (sp+4), r1
+ sw (sp+8), r2
+ sw (sp+12), r3
+ sw (sp+16), r4
+ sw (sp+20), r5
+ sw (sp+24), r6
+ sw (sp+28), r7
+ sw (sp+32), r8
+ sw (sp+36), r9
+ sw (sp+40), r10
+ sw (sp+44), r11
+ sw (sp+48), r12
+ sw (sp+52), r13
+ sw (sp+56), r14
+ sw (sp+60), r15
+ sw (sp+64), r16
+ sw (sp+68), r17
+ sw (sp+72), r18
+ sw (sp+76), r19
+ sw (sp+80), r20
+ sw (sp+84), r21
+ sw (sp+88), r22
+ sw (sp+92), r23
+ sw (sp+96), r24
+ sw (sp+100), r25
+ sw (sp+104), r26
+ sw (sp+108), r27
+ sw (sp+120), ea
+ sw (sp+124), ba
+ /* ra and sp need special handling, as they have been modified */
+ lw r1, (sp+128)
+ sw (sp+116), r1
+ mv r1, sp
+ addi r1, r1, 128
+ sw (sp+112), r1
+ xor r1, r1, r1
+ wcsr ie, r1
+ ret
+ .size _save_all, .-_save_all
+
+ .global _restore_all_and_return
+ .type _restore_all_and_return, @function
+ /* Restore all registers and return from exception */
+_restore_all_and_return:
+ addi r1, r0, 2
+ wcsr ie, r1
+ lw r1, (sp+4)
+ lw r2, (sp+8)
+ lw r3, (sp+12)
+ lw r4, (sp+16)
+ lw r5, (sp+20)
+ lw r6, (sp+24)
+ lw r7, (sp+28)
+ lw r8, (sp+32)
+ lw r9, (sp+36)
+ lw r10, (sp+40)
+ lw r11, (sp+44)
+ lw r12, (sp+48)
+ lw r13, (sp+52)
+ lw r14, (sp+56)
+ lw r15, (sp+60)
+ lw r16, (sp+64)
+ lw r17, (sp+68)
+ lw r18, (sp+72)
+ lw r19, (sp+76)
+ lw r20, (sp+80)
+ lw r21, (sp+84)
+ lw r22, (sp+88)
+ lw r23, (sp+92)
+ lw r24, (sp+96)
+ lw r25, (sp+100)
+ lw r26, (sp+104)
+ lw r27, (sp+108)
+ lw ra, (sp+116)
+ lw ea, (sp+120)
+ lw ba, (sp+124)
+ /* Stack pointer must be restored last, in case it has been updated */
+ lw sp, (sp+112)
+ nop
+ eret
+ .size _restore_all_and_return, .-_restore_all_and_return
+
+ .global _exit
+_exit:
+ mvi r8, SYSEXIT
+ scall
+ .size _exit, .-_exit
diff --git a/firmware/servicereq.c b/firmware/servicereq.c
index 949146d..5f9ece3 100644
--- a/firmware/servicereq.c
+++ b/firmware/servicereq.c
@@ -5560,6 +5560,8 @@ void smu_service_request(unsigned int level, void* dummy)
static u32 bapm = 0;
int requestid;
+ write32(0xe0003004, 1);
+
requestid = read32(0xe0003000);
requestid &= 0x1fffe;
requestid >>= 1;
@@ -5653,6 +5655,7 @@ void smu_service_request(unsigned int level, void* dummy)
break;
}
write32(0xe0003004, 3);
+ write32(0xe0003000, 1);
}
void MicoISRHandler(void)
diff --git a/firmware/smu.c b/firmware/smu.c
index b29c7fb..62bd479 100644
--- a/firmware/smu.c
+++ b/firmware/smu.c
@@ -21,25 +21,34 @@ void main(void)
{
int ie;
int mask, im;
- int irq = 2;
- mask = 0x1 << irq;
+ int irq;
+
/* disable interrupts */
asm volatile ("rcsr %0,ie":"=r"(ie));
ie &= (~0x1);
asm volatile ("wcsr ie, %0"::"r"(ie));
- ISREntryTable[irq].Callback = &smu_service_request;
- ISREntryTable[irq].Context = 0;
+ for (irq = 0; irq < 32; irq++) {
+ mask = 0x1 << irq;
+
+ ISREntryTable[irq].Callback = &smu_service_request;
+ ISREntryTable[irq].Context = 0;
- /* enable interrupt handler 2 */
- asm volatile ("rcsr %0, im":"=r"(im));
- im |= mask;
- asm volatile ("wcsr im, %0"::"r"(im));
+ /* enable interrupt handler */
+ asm volatile ("rcsr %0, im":"=r"(im));
+ im |= mask;
+ asm volatile ("wcsr im, %0"::"r"(im));
+ }
/* enable interrupts */
ie |= 0x1;
asm volatile ("wcsr ie, %0"::"r"(ie));
+
+ /* tell x86 that interrupts are ready */
+ write32(0x1f380, 1);
+
+ write32(0x80000008, 1);
while (1) {
mdelay(10);