@@ -286,20 +286,116 @@ static inline void *return_to(void *interrupted)
286286 * This may be unused depending on number of interrupt levels
287287 * supported by the SoC.
288288 */
289- #define DEF_INT_C_HANDLER (l ) \
290- __unused void *xtensa_int##l##_c(void *interrupted_stack) \
291- { \
292- uint32_t irqs, intenable, m; \
293- usage_stop(); \
294- __asm__ volatile("rsr.interrupt %0" : "=r"(irqs)); \
289+
290+ #if XCHAL_NUM_INTERRUPTS <= 32
291+ #define DEF_INT_C_HANDLER (l ) \
292+ __unused void *xtensa_int##l##_c(void *interrupted_stack) \
293+ { \
294+ uint32_t irqs, intenable, m; \
295+ usage_stop(); \
296+ __asm__ volatile("rsr.interrupt %0" : "=r"(irqs)); \
295297 __asm__ volatile("rsr.intenable %0" : "=r"(intenable)); \
296- irqs &= intenable; \
297- while ((m = _xtensa_handle_one_int##l(irqs))) { \
298- irqs ^= m; \
298+ irqs &= intenable; \
299+ while ((m = _xtensa_handle_one_int##l(0, irqs))) { \
300+ irqs ^= m; \
299301 __asm__ volatile("wsr.intclear %0" : : "r"(m)); \
300- } \
301- return return_to(interrupted_stack); \
302+ } \
303+ return return_to(interrupted_stack); \
304+ }
305+ #endif /* XCHAL_NUM_INTERRUPTS <= 32 */
306+
307+ #if XCHAL_NUM_INTERRUPTS > 32 && XCHAL_NUM_INTERRUPTS <= 64
308+ #define DEF_INT_C_HANDLER (l ) \
309+ __unused void *xtensa_int##l##_c(void *interrupted_stack) \
310+ { \
311+ uint32_t irqs, intenable, m; \
312+ usage_stop(); \
313+ __asm__ volatile("rsr.interrupt %0" : "=r"(irqs)); \
314+ __asm__ volatile("rsr.intenable %0" : "=r"(intenable)); \
315+ irqs &= intenable; \
316+ while ((m = _xtensa_handle_one_int##l(0, irqs))) { \
317+ irqs ^= m; \
318+ __asm__ volatile("wsr.intclear %0" : : "r"(m)); \
319+ } \
320+ __asm__ volatile("rsr.interrupt1 %0" : "=r"(irqs)); \
321+ __asm__ volatile("rsr.intenable1 %0" : "=r"(intenable)); \
322+ irqs &= intenable; \
323+ while ((m = _xtensa_handle_one_int##l(1, irqs))) { \
324+ irqs ^= m; \
325+ __asm__ volatile("wsr.intclear1 %0" : : "r"(m)); \
326+ } \
327+ return return_to(interrupted_stack); \
328+ }
329+ #endif /* XCHAL_NUM_INTERRUPTS > 32 && XCHAL_NUM_INTERRUPTS <= 64 */
330+
331+ #if XCHAL_NUM_INTERRUPTS > 64 && XCHAL_NUM_INTERRUPTS <= 96
332+ #define DEF_INT_C_HANDLER (l ) \
333+ __unused void *xtensa_int##l##_c(void *interrupted_stack) \
334+ { \
335+ uint32_t irqs, intenable, m; \
336+ usage_stop(); \
337+ __asm__ volatile("rsr.interrupt %0" : "=r"(irqs)); \
338+ __asm__ volatile("rsr.intenable %0" : "=r"(intenable)); \
339+ irqs &= intenable; \
340+ while ((m = _xtensa_handle_one_int##l(0, irqs))) { \
341+ irqs ^= m; \
342+ __asm__ volatile("wsr.intclear %0" : : "r"(m)); \
343+ } \
344+ __asm__ volatile("rsr.interrupt1 %0" : "=r"(irqs)); \
345+ __asm__ volatile("rsr.intenable1 %0" : "=r"(intenable)); \
346+ irqs &= intenable; \
347+ while ((m = _xtensa_handle_one_int##l(1, irqs))) { \
348+ irqs ^= m; \
349+ __asm__ volatile("wsr.intclear1 %0" : : "r"(m)); \
350+ } \
351+ __asm__ volatile("rsr.interrupt2 %0" : "=r"(irqs)); \
352+ __asm__ volatile("rsr.intenable2 %0" : "=r"(intenable)); \
353+ irqs &= intenable; \
354+ while ((m = _xtensa_handle_one_int##l(2, irqs))) { \
355+ irqs ^= m; \
356+ __asm__ volatile("wsr.intclear2 %0" : : "r"(m)); \
357+ } \
358+ return return_to(interrupted_stack); \
359+ }
360+ #endif /* XCHAL_NUM_INTERRUPTS > 64 && XCHAL_NUM_INTERRUPTS <= 96 */
361+
362+ #if XCHAL_NUM_INTERRUPTS > 96
363+ #define DEF_INT_C_HANDLER (l ) \
364+ __unused void *xtensa_int##l##_c(void *interrupted_stack) \
365+ { \
366+ uint32_t irqs, intenable, m; \
367+ usage_stop(); \
368+ __asm__ volatile("rsr.interrupt %0" : "=r"(irqs)); \
369+ __asm__ volatile("rsr.intenable %0" : "=r"(intenable)); \
370+ irqs &= intenable; \
371+ while ((m = _xtensa_handle_one_int##l(0, irqs))) { \
372+ irqs ^= m; \
373+ __asm__ volatile("wsr.intclear %0" : : "r"(m)); \
374+ } \
375+ __asm__ volatile("rsr.interrupt1 %0" : "=r"(irqs)); \
376+ __asm__ volatile("rsr.intenable1 %0" : "=r"(intenable)); \
377+ irqs &= intenable; \
378+ while ((m = _xtensa_handle_one_int##l(1, irqs))) { \
379+ irqs ^= m; \
380+ __asm__ volatile("wsr.intclear1 %0" : : "r"(m)); \
381+ } \
382+ __asm__ volatile("rsr.interrupt2 %0" : "=r"(irqs)); \
383+ __asm__ volatile("rsr.intenable2 %0" : "=r"(intenable)); \
384+ irqs &= intenable; \
385+ while ((m = _xtensa_handle_one_int##l(2, irqs))) { \
386+ irqs ^= m; \
387+ __asm__ volatile("wsr.intclear2 %0" : : "r"(m)); \
388+ } \
389+ __asm__ volatile("rsr.interrupt3 %0" : "=r"(irqs)); \
390+ __asm__ volatile("rsr.intenable3 %0" : "=r"(intenable)); \
391+ irqs &= intenable; \
392+ while ((m = _xtensa_handle_one_int##l(3, irqs))) { \
393+ irqs ^= m; \
394+ __asm__ volatile("wsr.intclear3 %0" : : "r"(m)); \
395+ } \
396+ return return_to(interrupted_stack); \
302397}
398+ #endif /* XCHAL_NUM_INTERRUPTS > 96 */
303399
304400#if XCHAL_HAVE_NMI
305401#define MAX_INTR_LEVEL XCHAL_NMILEVEL
0 commit comments