1
0
Fork 0
forked from len0rd/rockbox

imx233: add code to debug menu to check nested IRQ actually work

Change-Id: I6b51e89222efa868c03944fc37bcc9f382853be1
This commit is contained in:
Amaury Pouly 2014-02-02 04:29:22 +01:00
parent f7efa925fd
commit 91a8cd1ae9

View file

@ -483,10 +483,51 @@ bool dbg_hw_info_dcp(void)
} }
#endif #endif
/** Nested IRQ check code */
void INT_SOFTWARE(unsigned nr)
{
imx233_icoll_force_irq(INT_SRC_SOFTWARE(nr), false);
HW_DIGCTL_SCRATCH0 = nr;
if(nr < 3)
{
imx233_icoll_force_irq(INT_SRC_SOFTWARE(nr + 1), true);
udelay(10);
if(HW_DIGCTL_SCRATCH0 == nr)
panicf("Nestes IRQ bug (%d)", nr);
}
}
void INT_SOFTWARE0(void) { INT_SOFTWARE(0); }
void INT_SOFTWARE1(void) { INT_SOFTWARE(1); }
void INT_SOFTWARE2(void) { INT_SOFTWARE(2); }
void INT_SOFTWARE3(void) { INT_SOFTWARE(3); }
static void check_nested_irq(void)
{
/* Test protocol: setup SOFTWAREn IRQ as level n and apply:
* - enable SOFTWARE0 and soft IRQ'it
* - in SOFTWAREn, enable SOFTWARE(n+1) and soft IRQ'it, check it ran
*/
for(int i = 0; i < 4; i++)
{
imx233_icoll_enable_interrupt(INT_SRC_SOFTWARE(i), true);
imx233_icoll_set_priority(INT_SRC_SOFTWARE(i), i);
}
HW_DIGCTL_SCRATCH0 = 0;
imx233_icoll_force_irq(INT_SRC_SOFTWARE(0), true);
udelay(100);
if(HW_DIGCTL_SCRATCH0 != 3)
panicf("Nested IRQ broken (%lu)", HW_DIGCTL_SCRATCH0);
for(int i = 0; i < 4; i++)
imx233_icoll_enable_interrupt(INT_SRC_SOFTWARE(i), false);
}
bool dbg_hw_info_icoll(void) bool dbg_hw_info_icoll(void)
{ {
lcd_setfont(FONT_SYSFIXED); lcd_setfont(FONT_SYSFIXED);
check_nested_irq();
int first_irq = 0; int first_irq = 0;
int dbg_irqs_count = sizeof(dbg_irqs) / sizeof(dbg_irqs[0]); int dbg_irqs_count = sizeof(dbg_irqs) / sizeof(dbg_irqs[0]);
int line_count = lcd_getheight() / font_get(lcd_getfont())->height; int line_count = lcd_getheight() / font_get(lcd_getfont())->height;