summaryrefslogtreecommitdiff
path: root/firmware/target/arm
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm')
-rw-r--r--firmware/target/arm/imx233/debug-imx233.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/firmware/target/arm/imx233/debug-imx233.c b/firmware/target/arm/imx233/debug-imx233.c
index 1069c9ceaa..4da6985cc9 100644
--- a/firmware/target/arm/imx233/debug-imx233.c
+++ b/firmware/target/arm/imx233/debug-imx233.c
@@ -483,10 +483,51 @@ bool dbg_hw_info_dcp(void)
483} 483}
484#endif 484#endif
485 485
486/** Nested IRQ check code */
487void INT_SOFTWARE(unsigned nr)
488{
489 imx233_icoll_force_irq(INT_SRC_SOFTWARE(nr), false);
490 HW_DIGCTL_SCRATCH0 = nr;
491 if(nr < 3)
492 {
493 imx233_icoll_force_irq(INT_SRC_SOFTWARE(nr + 1), true);
494 udelay(10);
495 if(HW_DIGCTL_SCRATCH0 == nr)
496 panicf("Nestes IRQ bug (%d)", nr);
497 }
498}
499
500void INT_SOFTWARE0(void) { INT_SOFTWARE(0); }
501void INT_SOFTWARE1(void) { INT_SOFTWARE(1); }
502void INT_SOFTWARE2(void) { INT_SOFTWARE(2); }
503void INT_SOFTWARE3(void) { INT_SOFTWARE(3); }
504
505static void check_nested_irq(void)
506{
507 /* Test protocol: setup SOFTWAREn IRQ as level n and apply:
508 * - enable SOFTWARE0 and soft IRQ'it
509 * - in SOFTWAREn, enable SOFTWARE(n+1) and soft IRQ'it, check it ran
510 */
511 for(int i = 0; i < 4; i++)
512 {
513 imx233_icoll_enable_interrupt(INT_SRC_SOFTWARE(i), true);
514 imx233_icoll_set_priority(INT_SRC_SOFTWARE(i), i);
515 }
516 HW_DIGCTL_SCRATCH0 = 0;
517 imx233_icoll_force_irq(INT_SRC_SOFTWARE(0), true);
518 udelay(100);
519 if(HW_DIGCTL_SCRATCH0 != 3)
520 panicf("Nested IRQ broken (%lu)", HW_DIGCTL_SCRATCH0);
521 for(int i = 0; i < 4; i++)
522 imx233_icoll_enable_interrupt(INT_SRC_SOFTWARE(i), false);
523}
524
486bool dbg_hw_info_icoll(void) 525bool dbg_hw_info_icoll(void)
487{ 526{
488 lcd_setfont(FONT_SYSFIXED); 527 lcd_setfont(FONT_SYSFIXED);
489 528
529 check_nested_irq();
530
490 int first_irq = 0; 531 int first_irq = 0;
491 int dbg_irqs_count = sizeof(dbg_irqs) / sizeof(dbg_irqs[0]); 532 int dbg_irqs_count = sizeof(dbg_irqs) / sizeof(dbg_irqs[0]);
492 int line_count = lcd_getheight() / font_get(lcd_getfont())->height; 533 int line_count = lcd_getheight() / font_get(lcd_getfont())->height;