forked from len0rd/rockbox
PP50xx: Allow FIQ during IRQ to always be able to service FIFOs. I've got a diff handy for quick revert if there's a problem.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14123 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
ffb3dfd241
commit
e1c52e7fbe
1 changed files with 44 additions and 37 deletions
|
@ -32,26 +32,29 @@ start:
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#if CONFIG_CPU == PP5002
|
#if CONFIG_CPU == PP5002
|
||||||
.equ PROC_ID, 0xc4000000
|
.equ PROC_ID, 0xc4000000
|
||||||
.equ COP_CTRL, 0xcf004058
|
.equ CPU_ICLR, 0xcf001028
|
||||||
|
.equ COP_ICLR, 0xcf001038
|
||||||
|
.equ COP_CTRL, 0xcf004058
|
||||||
.equ COP_STATUS, 0xcf004050
|
.equ COP_STATUS, 0xcf004050
|
||||||
.equ IIS_CONFIG, 0xc0002500
|
.equ IIS_CONFIG, 0xc0002500
|
||||||
.equ SLEEP, 0xca
|
.equ SLEEP, 0x000000ca
|
||||||
.equ WAKE, 0xce
|
.equ WAKE, 0x000000ce
|
||||||
.equ SLEEPING, 0x4000
|
.equ SLEEPING, 0x00004000
|
||||||
#else
|
#else
|
||||||
.equ PROC_ID, 0x60000000
|
.equ PROC_ID, 0x60000000
|
||||||
.equ COP_CTRL, 0x60007004
|
.equ CPU_ICLR, 0x60004028
|
||||||
|
.equ COP_ICLR, 0x60004038
|
||||||
|
.equ COP_CTRL, 0x60007004
|
||||||
.equ COP_STATUS, 0x60007004
|
.equ COP_STATUS, 0x60007004
|
||||||
.equ IIS_CONFIG, 0x70002800
|
.equ IIS_CONFIG, 0x70002800
|
||||||
.equ SLEEP, 0x80000000
|
.equ SLEEP, 0x80000000
|
||||||
.equ WAKE, 0x0
|
.equ WAKE, 0x00000000
|
||||||
.equ SLEEPING, 0x80000000
|
.equ SLEEPING, 0x80000000
|
||||||
.equ CACHE_CTRL, 0x6000c000
|
.equ CACHE_CTRL, 0x6000c000
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
msr cpsr_c, #0xd3 /* enter supervisor mode, disable IRQ */
|
msr cpsr_c, #0xd3 /* enter supervisor mode, disable IRQ/FIQ */
|
||||||
|
|
||||||
b pad_skip
|
b pad_skip
|
||||||
|
|
||||||
.space 60*4 /* (more than enough) space for exception vectors and mi4 magic */
|
.space 60*4 /* (more than enough) space for exception vectors and mi4 magic */
|
||||||
|
@ -110,25 +113,28 @@ remap_end:
|
||||||
|
|
||||||
/* Find out which processor we are */
|
/* Find out which processor we are */
|
||||||
ldr r0, =PROC_ID
|
ldr r0, =PROC_ID
|
||||||
ldr r0, [r0]
|
ldrb r0, [r0]
|
||||||
and r0, r0, #0xff
|
|
||||||
cmp r0, #0x55
|
cmp r0, #0x55
|
||||||
beq cpu_init
|
|
||||||
|
/* Mask all interrupt sources before setting up modes */
|
||||||
|
ldreq r0, =CPU_ICLR
|
||||||
|
ldrne r0, =COP_ICLR
|
||||||
|
mvn r1, #1
|
||||||
|
str r1, [r0]
|
||||||
|
|
||||||
/* put us (co-processor) to sleep */
|
/* put us (co-processor) to sleep */
|
||||||
ldr r4, =COP_CTRL
|
ldrne r4, =COP_CTRL
|
||||||
mov r3, #SLEEP
|
movne r3, #SLEEP
|
||||||
str r3, [r4]
|
strne r3, [r4]
|
||||||
|
|
||||||
ldr pc, =cop_init
|
|
||||||
|
|
||||||
|
ldrne pc, =cop_init
|
||||||
|
|
||||||
cpu_init:
|
cpu_init:
|
||||||
/* Wait for COP to be sleeping */
|
/* Wait for COP to be sleeping */
|
||||||
ldr r4, =COP_STATUS
|
ldr r4, =COP_STATUS
|
||||||
1:
|
1:
|
||||||
ldr r3, [r4]
|
ldr r3, [r4]
|
||||||
ands r3, r3, #SLEEPING
|
tst r3, #SLEEPING
|
||||||
beq 1b
|
beq 1b
|
||||||
|
|
||||||
/* Copy exception handler code to address 0 */
|
/* Copy exception handler code to address 0 */
|
||||||
|
@ -180,10 +186,10 @@ cpu_init:
|
||||||
bhi 1b
|
bhi 1b
|
||||||
|
|
||||||
/* Set up stack for IRQ mode */
|
/* Set up stack for IRQ mode */
|
||||||
msr cpsr_c, #0xd2
|
msr cpsr_c, #0x92 /* IRQ disabled, FIQ enabled */
|
||||||
ldr sp, =irq_stack
|
ldr sp, =irq_stack
|
||||||
/* Set up stack for FIQ mode */
|
/* Set up stack for FIQ mode */
|
||||||
msr cpsr_c, #0xd1
|
msr cpsr_c, #0xd1 /* IRQ/FIQ disabled */
|
||||||
ldr sp, =fiq_stack
|
ldr sp, =fiq_stack
|
||||||
/* We'll load the banked FIQ mode registers with useful values here.
|
/* We'll load the banked FIQ mode registers with useful values here.
|
||||||
These values will be used in the FIQ handler in pcm_playback.c */
|
These values will be used in the FIQ handler in pcm_playback.c */
|
||||||
|
@ -192,9 +198,9 @@ cpu_init:
|
||||||
ldr r11, =p
|
ldr r11, =p
|
||||||
|
|
||||||
/* Let abort and undefined modes use IRQ stack */
|
/* Let abort and undefined modes use IRQ stack */
|
||||||
msr cpsr_c, #0xd7
|
msr cpsr_c, #0xd7 /* IRQ/FIQ disabled */
|
||||||
ldr sp, =irq_stack
|
ldr sp, =irq_stack
|
||||||
msr cpsr_c, #0xdb
|
msr cpsr_c, #0xdb /* IRQ/FIQ disabled */
|
||||||
ldr sp, =irq_stack
|
ldr sp, =irq_stack
|
||||||
/* Switch to supervisor mode */
|
/* Switch to supervisor mode */
|
||||||
msr cpsr_c, #0xd3
|
msr cpsr_c, #0xd3
|
||||||
|
@ -228,16 +234,16 @@ cop_init:
|
||||||
bhi 2b
|
bhi 2b
|
||||||
|
|
||||||
/* Set up stack for IRQ mode */
|
/* Set up stack for IRQ mode */
|
||||||
msr cpsr_c, #0xd2
|
msr cpsr_c, #0x92 /* IRQ disabled, FIQ enabled */
|
||||||
ldr sp, =cop_irq_stack
|
ldr sp, =cop_irq_stack
|
||||||
/* Set up stack for FIQ mode */
|
/* Set up stack for FIQ mode */
|
||||||
msr cpsr_c, #0xd1
|
msr cpsr_c, #0xd1 /* IRQ/FIQ disabled */
|
||||||
ldr sp, =fiq_stack
|
ldr sp, =cop_fiq_stack
|
||||||
|
|
||||||
/* Let abort and undefined modes use IRQ stack */
|
/* Let abort and undefined modes use IRQ stack */
|
||||||
msr cpsr_c, #0xd7
|
msr cpsr_c, #0xd7 /* IRQ/FIQ disabled */
|
||||||
ldr sp, =cop_irq_stack
|
ldr sp, =cop_irq_stack
|
||||||
msr cpsr_c, #0xdb
|
msr cpsr_c, #0xdb /* IRQ/FIQ disabled */
|
||||||
ldr sp, =cop_irq_stack
|
ldr sp, =cop_irq_stack
|
||||||
|
|
||||||
ldr sp, =cop_stackend
|
ldr sp, =cop_stackend
|
||||||
|
@ -266,13 +272,12 @@ vectors:
|
||||||
.word data_abort_handler
|
.word data_abort_handler
|
||||||
.word reserved_handler
|
.word reserved_handler
|
||||||
.word irq_handler
|
.word irq_handler
|
||||||
.word fiq_handler
|
.word 0 /* fiq handler set in pcm driver */
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
|
||||||
#ifndef STUB
|
#ifndef STUB
|
||||||
.global irq
|
.global irq
|
||||||
.global fiq
|
|
||||||
.global UIE
|
.global UIE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -298,11 +303,6 @@ prefetch_abort_handler:
|
||||||
mov r1, #1
|
mov r1, #1
|
||||||
b UIE
|
b UIE
|
||||||
|
|
||||||
fiq_handler:
|
|
||||||
@ Branch straight to FIQ handler in pcm_playback.c. This also handles the
|
|
||||||
@ the correct return sequence.
|
|
||||||
ldr pc, =fiq
|
|
||||||
|
|
||||||
data_abort_handler:
|
data_abort_handler:
|
||||||
sub r0, lr, #8
|
sub r0, lr, #8
|
||||||
mov r1, #2
|
mov r1, #2
|
||||||
|
@ -332,3 +332,10 @@ cop_irq_stack:
|
||||||
/* 256 words of FIQ stack */
|
/* 256 words of FIQ stack */
|
||||||
.space 256*4
|
.space 256*4
|
||||||
fiq_stack:
|
fiq_stack:
|
||||||
|
|
||||||
|
/* We'll need this soon - just reserve the symbol */
|
||||||
|
#if 0
|
||||||
|
/* 256 words of COP FIQ stack */
|
||||||
|
.space 256*4
|
||||||
|
#endif
|
||||||
|
cop_fiq_stack:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue