1
0
Fork 0
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:
Michael Sevakis 2007-08-01 20:26:04 +00:00
parent ffb3dfd241
commit e1c52e7fbe

View file

@ -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: