146 lines
6.1 KiB
ArmAsm
146 lines
6.1 KiB
ArmAsm
|
/*
|
||
|
* arch/arm/commond/entry-macro-iomd.S
|
||
|
*
|
||
|
* Low-level IRQ helper macros for IOC/IOMD based platforms
|
||
|
*
|
||
|
* This file is licensed under the terms of the GNU General Public
|
||
|
* License version 2. This program is licensed "as is" without any
|
||
|
* warranty of any kind, whether express or implied.
|
||
|
*/
|
||
|
|
||
|
/* IOC / IOMD based hardware */
|
||
|
#include <asm/hardware/iomd.h>
|
||
|
|
||
|
.equ ioc_base_high, IOC_BASE & 0xff000000
|
||
|
.equ ioc_base_low, IOC_BASE & 0x00ff0000
|
||
|
.macro disable_fiq
|
||
|
mov r12, #ioc_base_high
|
||
|
.if ioc_base_low
|
||
|
orr r12, r12, #ioc_base_low
|
||
|
.endif
|
||
|
strb r12, [r12, #0x38] @ Disable FIQ register
|
||
|
.endm
|
||
|
|
||
|
.macro get_irqnr_and_base, irqnr, irqstat, base, tmp
|
||
|
mov r4, #ioc_base_high @ point at IOC
|
||
|
.if ioc_base_low
|
||
|
orr r4, r4, #ioc_base_low
|
||
|
.endif
|
||
|
ldrb \irqstat, [r4, #IOMD_IRQREQB] @ get high priority first
|
||
|
ldr \base, =irq_prio_h
|
||
|
teq \irqstat, #0
|
||
|
#ifdef IOMD_BASE
|
||
|
ldreqb \irqstat, [r4, #IOMD_DMAREQ] @ get dma
|
||
|
addeq \base, \base, #256 @ irq_prio_h table size
|
||
|
teqeq \irqstat, #0
|
||
|
bne 2406f
|
||
|
#endif
|
||
|
ldreqb \irqstat, [r4, #IOMD_IRQREQA] @ get low priority
|
||
|
addeq \base, \base, #256 @ irq_prio_d table size
|
||
|
teqeq \irqstat, #0
|
||
|
#ifdef IOMD_IRQREQC
|
||
|
ldreqb \irqstat, [r4, #IOMD_IRQREQC]
|
||
|
addeq \base, \base, #256 @ irq_prio_l table size
|
||
|
teqeq \irqstat, #0
|
||
|
#endif
|
||
|
#ifdef IOMD_IRQREQD
|
||
|
ldreqb \irqstat, [r4, #IOMD_IRQREQD]
|
||
|
addeq \base, \base, #256 @ irq_prio_lc table size
|
||
|
teqeq \irqstat, #0
|
||
|
#endif
|
||
|
2406: ldrneb \irqnr, [\base, \irqstat] @ get IRQ number
|
||
|
.endm
|
||
|
|
||
|
/*
|
||
|
* Interrupt table (incorporates priority). Please note that we
|
||
|
* rely on the order of these tables (see above code).
|
||
|
*/
|
||
|
.align 5
|
||
|
irq_prio_h: .byte 0, 8, 9, 8,10,10,10,10,11,11,11,11,10,10,10,10
|
||
|
.byte 12, 8, 9, 8,10,10,10,10,11,11,11,11,10,10,10,10
|
||
|
.byte 13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
|
||
|
.byte 13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
|
||
|
.byte 14,14,14,14,10,10,10,10,11,11,11,11,10,10,10,10
|
||
|
.byte 14,14,14,14,10,10,10,10,11,11,11,11,10,10,10,10
|
||
|
.byte 13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
|
||
|
.byte 13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
|
||
|
.byte 15,15,15,15,10,10,10,10,11,11,11,11,10,10,10,10
|
||
|
.byte 15,15,15,15,10,10,10,10,11,11,11,11,10,10,10,10
|
||
|
.byte 13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
|
||
|
.byte 13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
|
||
|
.byte 15,15,15,15,10,10,10,10,11,11,11,11,10,10,10,10
|
||
|
.byte 15,15,15,15,10,10,10,10,11,11,11,11,10,10,10,10
|
||
|
.byte 13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
|
||
|
.byte 13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
|
||
|
#ifdef IOMD_BASE
|
||
|
irq_prio_d: .byte 0,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||
|
.byte 20,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||
|
.byte 21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||
|
.byte 21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||
|
.byte 22,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||
|
.byte 22,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||
|
.byte 21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||
|
.byte 21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||
|
.byte 23,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||
|
.byte 23,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||
|
.byte 21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||
|
.byte 21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||
|
.byte 22,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||
|
.byte 22,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||
|
.byte 21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||
|
.byte 21,16,17,16,18,16,17,16,19,16,17,16,18,16,17,16
|
||
|
#endif
|
||
|
irq_prio_l: .byte 0, 0, 1, 0, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3
|
||
|
.byte 4, 0, 1, 0, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3
|
||
|
.byte 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
|
||
|
.byte 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
|
||
|
.byte 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3
|
||
|
.byte 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3
|
||
|
.byte 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
|
||
|
.byte 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
|
||
|
.byte 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
|
||
|
.byte 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
|
||
|
.byte 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
|
||
|
.byte 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
|
||
|
.byte 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
|
||
|
.byte 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
|
||
|
.byte 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
|
||
|
.byte 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
|
||
|
#ifdef IOMD_IRQREQC
|
||
|
irq_prio_lc: .byte 24,24,25,24,26,26,26,26,27,27,27,27,27,27,27,27
|
||
|
.byte 28,24,25,24,26,26,26,26,27,27,27,27,27,27,27,27
|
||
|
.byte 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29
|
||
|
.byte 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29
|
||
|
.byte 30,30,30,30,30,30,30,30,27,27,27,27,27,27,27,27
|
||
|
.byte 30,30,30,30,30,30,30,30,27,27,27,27,27,27,27,27
|
||
|
.byte 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29
|
||
|
.byte 29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29
|
||
|
.byte 31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31
|
||
|
.byte 31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31
|
||
|
.byte 31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31
|
||
|
.byte 31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31
|
||
|
.byte 31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31
|
||
|
.byte 31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31
|
||
|
.byte 31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31
|
||
|
.byte 31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31
|
||
|
#endif
|
||
|
#ifdef IOMD_IRQREQD
|
||
|
irq_prio_ld: .byte 40,40,41,40,42,42,42,42,43,43,43,43,43,43,43,43
|
||
|
.byte 44,40,41,40,42,42,42,42,43,43,43,43,43,43,43,43
|
||
|
.byte 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45
|
||
|
.byte 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45
|
||
|
.byte 46,46,46,46,46,46,46,46,43,43,43,43,43,43,43,43
|
||
|
.byte 46,46,46,46,46,46,46,46,43,43,43,43,43,43,43,43
|
||
|
.byte 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45
|
||
|
.byte 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45
|
||
|
.byte 47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47
|
||
|
.byte 47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47
|
||
|
.byte 47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47
|
||
|
.byte 47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47
|
||
|
.byte 47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47
|
||
|
.byte 47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47
|
||
|
.byte 47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47
|
||
|
.byte 47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47
|
||
|
#endif
|
||
|
|