diff options
Diffstat (limited to 'firmware/target/arm/imx31/avic-imx31.h')
-rw-r--r-- | firmware/target/arm/imx31/avic-imx31.h | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/firmware/target/arm/imx31/avic-imx31.h b/firmware/target/arm/imx31/avic-imx31.h index a049713600..ba8f91cc1a 100644 --- a/firmware/target/arm/imx31/avic-imx31.h +++ b/firmware/target/arm/imx31/avic-imx31.h | |||
@@ -172,7 +172,11 @@ struct avic_map | |||
172 | }; | 172 | }; |
173 | }; | 173 | }; |
174 | 174 | ||
175 | /* #define IRQ priorities for different modules (0-15) */ | ||
175 | #define INT_PRIO_DEFAULT 7 | 176 | #define INT_PRIO_DEFAULT 7 |
177 | #define INT_PRIO_DVFS (INT_PRIO_DEFAULT+1) | ||
178 | #define INT_PRIO_DPTC (INT_PRIO_DEFAULT+1) | ||
179 | #define INT_PRIO_SDMA (INT_PRIO_DEFAULT+2) | ||
176 | 180 | ||
177 | enum INT_TYPE | 181 | enum INT_TYPE |
178 | { | 182 | { |
@@ -210,4 +214,37 @@ void avic_set_int_priority(enum IMX31_INT_LIST ints, | |||
210 | void avic_disable_int(enum IMX31_INT_LIST ints); | 214 | void avic_disable_int(enum IMX31_INT_LIST ints); |
211 | void avic_set_int_type(enum IMX31_INT_LIST ints, enum INT_TYPE intstype); | 215 | void avic_set_int_type(enum IMX31_INT_LIST ints, enum INT_TYPE intstype); |
212 | 216 | ||
217 | #define AVIC_NIL_DISABLE 0xf | ||
218 | #define AVIC_NIL_ENABLE 0x1f | ||
219 | void avic_set_ni_level(unsigned int level); | ||
220 | |||
221 | /* Call a service routine while allowing preemption by interrupts of higher | ||
222 | * priority. r4-r7 must be preserved for epilogue code to restore context. */ | ||
223 | #define AVIC_NESTED_NI_CALL_PROLOGUE() \ | ||
224 | ({ asm volatile ( \ | ||
225 | "sub lr, lr, #4 \n" /* prepare return address */ \ | ||
226 | "stmfd sp!, { r0-r7, r12, lr } \n" /* preserve return context */ \ | ||
227 | "mov r0, #0x68000000 \n" /* AVIC_BASE_ADDR */ \ | ||
228 | "mrs r4, spsr \n" /* save SPSR_irq */ \ | ||
229 | "ldr r5, [r0, #0x04] \n" /* save NIMASK */ \ | ||
230 | "ldr r1, [r0, #0x40] \n" /* load NIVECSR */ \ | ||
231 | "mov r2, sp \n" /* remember IRQ stack to use in call */ \ | ||
232 | "str r1, [r0, #0x04] \n" /* copy NIVECSR to NIMASK */ \ | ||
233 | "cps #0x13 \n" /* switch to SVC mode (+ unmask IRQ) */ \ | ||
234 | "mov r6, sp \n" /* save SP_svc */ \ | ||
235 | "mov r7, lr \n" /* save LR_svc */ \ | ||
236 | "mov sp, r2 \n" /* switch to SP_irq */ \ | ||
237 | ); }) | ||
238 | |||
239 | #define AVIC_NESTED_NI_CALL_EPILOGUE() \ | ||
240 | ({ asm volatile ( \ | ||
241 | "mov sp, r6 \n" /* restore SP_svc */ \ | ||
242 | "mov lr, r7 \n" /* restore LR_svc */ \ | ||
243 | "cps #0x12 \n" /* return to IRQ mode (+ mask IRQ) */ \ | ||
244 | "mov r0, #0x68000000 \n" /* AVIC BASE ADDR */ \ | ||
245 | "msr spsr_cxsf, r4 \n" /* restore SPSR_irq */ \ | ||
246 | "str r5, [r0, #0x04] \n" /* restore NIMASK */ \ | ||
247 | "ldmfd sp!, { r0-r7, r12, pc }^ \n" /* reload context and return */ \ | ||
248 | ); }) | ||
249 | |||
213 | #endif /* AVIC_IMX31_H */ | 250 | #endif /* AVIC_IMX31_H */ |