1a2e67072SMax Filippov#include "macros.inc" 27d890b40SMax Filippov 3*9c988226SMax Filippov#define LSBIT(v) ((v) & -(v)) 4*9c988226SMax Filippov 5*9c988226SMax Filippov#define LEVEL_MASK(x) glue3(XCHAL_INTLEVEL, x, _MASK) 6*9c988226SMax Filippov#define LEVEL_SOFT_MASK(x) (LEVEL_MASK(x) & XCHAL_INTTYPE_MASK_SOFTWARE) 7*9c988226SMax Filippov 8*9c988226SMax Filippov#define L1_SOFT_MASK LEVEL_SOFT_MASK(1) 9*9c988226SMax Filippov#define L1_SOFT LSBIT(L1_SOFT_MASK) 10*9c988226SMax Filippov 11*9c988226SMax Filippov#if LEVEL_SOFT_MASK(2) 12*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_MASK LEVEL_SOFT_MASK(2) 13*9c988226SMax Filippov#elif LEVEL_SOFT_MASK(3) 14*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_MASK LEVEL_SOFT_MASK(3) 15*9c988226SMax Filippov#elif LEVEL_SOFT_MASK(4) 16*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_MASK LEVEL_SOFT_MASK(4) 17*9c988226SMax Filippov#elif LEVEL_SOFT_MASK(5) 18*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_MASK LEVEL_SOFT_MASK(5) 19*9c988226SMax Filippov#elif LEVEL_SOFT_MASK(6) 20*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_MASK LEVEL_SOFT_MASK(6) 21*9c988226SMax Filippov#else 22*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_MASK 0 23*9c988226SMax Filippov#endif 24*9c988226SMax Filippov 25*9c988226SMax Filippov#define HIGH_LEVEL_SOFT LSBIT(HIGH_LEVEL_SOFT_MASK) 26*9c988226SMax Filippov 27*9c988226SMax Filippov#if LEVEL_SOFT_MASK(2) 28*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_LEVEL 2 29*9c988226SMax Filippov#elif LEVEL_SOFT_MASK(3) 30*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_LEVEL 3 31*9c988226SMax Filippov#elif LEVEL_SOFT_MASK(4) 32*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_LEVEL 4 33*9c988226SMax Filippov#elif LEVEL_SOFT_MASK(5) 34*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_LEVEL 5 35*9c988226SMax Filippov#elif LEVEL_SOFT_MASK(6) 36*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_LEVEL 6 37*9c988226SMax Filippov#else 38*9c988226SMax Filippov#define HIGH_LEVEL_SOFT_LEVEL 0 39*9c988226SMax Filippov#endif 408b912ff0SMax Filippov 417d890b40SMax Filippovtest_suite interrupt 427d890b40SMax Filippov 43*9c988226SMax Filippov#if XCHAL_HAVE_INTERRUPTS 44*9c988226SMax Filippov 457d890b40SMax Filippov.macro clear_interrupts 467d890b40SMax Filippov movi a2, 0 477d890b40SMax Filippov wsr a2, intenable 48*9c988226SMax Filippov#if XCHAL_NUM_TIMERS 497d890b40SMax Filippov wsr a2, ccompare0 50*9c988226SMax Filippov#endif 51*9c988226SMax Filippov#if XCHAL_NUM_TIMERS > 1 527d890b40SMax Filippov wsr a2, ccompare1 53*9c988226SMax Filippov#endif 54*9c988226SMax Filippov#if XCHAL_NUM_TIMERS > 2 557d890b40SMax Filippov wsr a2, ccompare2 56*9c988226SMax Filippov#endif 577d890b40SMax Filippov esync 587d890b40SMax Filippov rsr a2, interrupt 597d890b40SMax Filippov wsr a2, intclear 607d890b40SMax Filippov 617d890b40SMax Filippov esync 627d890b40SMax Filippov rsr a2, interrupt 637d890b40SMax Filippov assert eqi, a2, 0 647d890b40SMax Filippov.endm 657d890b40SMax Filippov 667d890b40SMax Filippov.macro check_l1 677d890b40SMax Filippov rsr a2, ps 687d890b40SMax Filippov movi a3, 0x1f /* EXCM | INTMASK */ 697d890b40SMax Filippov and a2, a2, a3 707d890b40SMax Filippov assert eqi, a2, 0x10 /* only EXCM is set for level-1 interrupt */ 717d890b40SMax Filippov rsr a2, exccause 727d890b40SMax Filippov assert eqi, a2, 4 737d890b40SMax Filippov.endm 747d890b40SMax Filippov 757d890b40SMax Filippovtest rsil 767d890b40SMax Filippov clear_interrupts 777d890b40SMax Filippov 787d890b40SMax Filippov rsr a2, ps 797d890b40SMax Filippov rsil a3, 7 807d890b40SMax Filippov rsr a4, ps 817d890b40SMax Filippov assert eq, a2, a3 827d890b40SMax Filippov movi a2, 0xf 837d890b40SMax Filippov and a2, a4, a2 847d890b40SMax Filippov assert eqi, a2, 7 857d890b40SMax Filippov xor a3, a3, a4 867d890b40SMax Filippov movi a2, 0xfffffff0 877d890b40SMax Filippov and a2, a3, a2 887d890b40SMax Filippov assert eqi, a2, 0 897d890b40SMax Filippovtest_end 907d890b40SMax Filippov 91*9c988226SMax Filippov#if L1_SOFT 927d890b40SMax Filippovtest soft_disabled 937d890b40SMax Filippov set_vector kernel, 1f 947d890b40SMax Filippov clear_interrupts 957d890b40SMax Filippov 96*9c988226SMax Filippov movi a2, L1_SOFT 977d890b40SMax Filippov wsr a2, intset 987d890b40SMax Filippov esync 997d890b40SMax Filippov rsr a3, interrupt 1008b912ff0SMax Filippov movi a4, ~XCHAL_INTTYPE_MASK_TIMER 1018b912ff0SMax Filippov and a3, a3, a4 1027d890b40SMax Filippov assert eq, a2, a3 1037d890b40SMax Filippov wsr a2, intclear 1047d890b40SMax Filippov esync 1057d890b40SMax Filippov rsr a3, interrupt 1068b912ff0SMax Filippov and a3, a3, a4 1077d890b40SMax Filippov assert eqi, a3, 0 1087d890b40SMax Filippov j 2f 1097d890b40SMax Filippov1: 1107d890b40SMax Filippov test_fail 1117d890b40SMax Filippov2: 1127d890b40SMax Filippovtest_end 1137d890b40SMax Filippov 1147d890b40SMax Filippovtest soft_intenable 1157d890b40SMax Filippov set_vector kernel, 1f 1167d890b40SMax Filippov clear_interrupts 1177d890b40SMax Filippov 118*9c988226SMax Filippov movi a2, L1_SOFT 1197d890b40SMax Filippov wsr a2, intset 1207d890b40SMax Filippov esync 1217d890b40SMax Filippov rsr a3, interrupt 1228b912ff0SMax Filippov movi a4, ~XCHAL_INTTYPE_MASK_TIMER 1238b912ff0SMax Filippov and a3, a3, a4 1247d890b40SMax Filippov assert eq, a2, a3 1257d890b40SMax Filippov rsil a3, 0 1267d890b40SMax Filippov wsr a2, intenable 1277d890b40SMax Filippov esync 1287d890b40SMax Filippov test_fail 1297d890b40SMax Filippov1: 1307d890b40SMax Filippov check_l1 1317d890b40SMax Filippovtest_end 1327d890b40SMax Filippov 1337d890b40SMax Filippovtest soft_rsil 1347d890b40SMax Filippov set_vector kernel, 1f 1357d890b40SMax Filippov clear_interrupts 1367d890b40SMax Filippov 137*9c988226SMax Filippov movi a2, L1_SOFT 1387d890b40SMax Filippov wsr a2, intset 1397d890b40SMax Filippov esync 1407d890b40SMax Filippov rsr a3, interrupt 1418b912ff0SMax Filippov movi a4, ~XCHAL_INTTYPE_MASK_TIMER 1428b912ff0SMax Filippov and a3, a3, a4 1437d890b40SMax Filippov assert eq, a2, a3 1447d890b40SMax Filippov wsr a2, intenable 1457d890b40SMax Filippov rsil a3, 0 1467d890b40SMax Filippov esync 1477d890b40SMax Filippov test_fail 1487d890b40SMax Filippov1: 1497d890b40SMax Filippov check_l1 1507d890b40SMax Filippovtest_end 1517d890b40SMax Filippov 1527d890b40SMax Filippovtest soft_waiti 1537d890b40SMax Filippov set_vector kernel, 1f 1547d890b40SMax Filippov clear_interrupts 1557d890b40SMax Filippov 156*9c988226SMax Filippov movi a2, L1_SOFT 1577d890b40SMax Filippov wsr a2, intset 1587d890b40SMax Filippov esync 1597d890b40SMax Filippov rsr a3, interrupt 1608b912ff0SMax Filippov movi a4, ~XCHAL_INTTYPE_MASK_TIMER 1618b912ff0SMax Filippov and a3, a3, a4 1627d890b40SMax Filippov assert eq, a2, a3 1637d890b40SMax Filippov wsr a2, intenable 1647d890b40SMax Filippov waiti 0 1657d890b40SMax Filippov test_fail 1667d890b40SMax Filippov1: 1677d890b40SMax Filippov check_l1 1687d890b40SMax Filippovtest_end 1697d890b40SMax Filippov 1707d890b40SMax Filippovtest soft_user 1717d890b40SMax Filippov set_vector kernel, 1f 1727d890b40SMax Filippov set_vector user, 2f 1737d890b40SMax Filippov clear_interrupts 1747d890b40SMax Filippov 175*9c988226SMax Filippov movi a2, L1_SOFT 1767d890b40SMax Filippov wsr a2, intset 1777d890b40SMax Filippov esync 1787d890b40SMax Filippov rsr a3, interrupt 1798b912ff0SMax Filippov movi a4, ~XCHAL_INTTYPE_MASK_TIMER 1808b912ff0SMax Filippov and a3, a3, a4 1817d890b40SMax Filippov assert eq, a2, a3 1827d890b40SMax Filippov wsr a2, intenable 1837d890b40SMax Filippov 1847d890b40SMax Filippov rsr a2, ps 1857d890b40SMax Filippov movi a3, 0x20 1867d890b40SMax Filippov or a2, a2, a3 1877d890b40SMax Filippov wsr a2, ps 1887d890b40SMax Filippov waiti 0 1897d890b40SMax Filippov1: 1907d890b40SMax Filippov test_fail 1917d890b40SMax Filippov2: 1927d890b40SMax Filippov check_l1 1937d890b40SMax Filippovtest_end 1947d890b40SMax Filippov 195*9c988226SMax Filippov#if HIGH_LEVEL_SOFT 1967d890b40SMax Filippovtest soft_priority 1977d890b40SMax Filippov set_vector kernel, 1f 198*9c988226SMax Filippov set_vector glue(level, HIGH_LEVEL_SOFT_LEVEL), 2f 1997d890b40SMax Filippov clear_interrupts 2007d890b40SMax Filippov 201*9c988226SMax Filippov movi a2, L1_SOFT | HIGH_LEVEL_SOFT 2027d890b40SMax Filippov wsr a2, intenable 2037d890b40SMax Filippov rsil a3, 0 2047d890b40SMax Filippov esync 2057d890b40SMax Filippov wsr a2, intset 2067d890b40SMax Filippov esync 2077d890b40SMax Filippov1: 2087d890b40SMax Filippov test_fail 2097d890b40SMax Filippov2: 2107d890b40SMax Filippov rsr a2, ps 2117d890b40SMax Filippov movi a3, 0x1f /* EXCM | INTMASK */ 2127d890b40SMax Filippov and a2, a2, a3 213*9c988226SMax Filippov movi a3, 0x10 | HIGH_LEVEL_SOFT_LEVEL 2147d890b40SMax Filippov assert eq, a2, a3 /* EXCM and INTMASK are set 2157d890b40SMax Filippov for high-priority interrupt */ 2167d890b40SMax Filippovtest_end 217*9c988226SMax Filippov#endif 218*9c988226SMax Filippov#endif 2197d890b40SMax Filippov 220*9c988226SMax Filippov#if HIGH_LEVEL_SOFT 2217d890b40SMax Filippovtest eps_epc_rfi 222*9c988226SMax Filippov set_vector glue(level, HIGH_LEVEL_SOFT_LEVEL), 3f 2237d890b40SMax Filippov clear_interrupts 2247d890b40SMax Filippov reset_ps 2257d890b40SMax Filippov 226*9c988226SMax Filippov movi a2, L1_SOFT_MASK | HIGH_LEVEL_SOFT_MASK 2277d890b40SMax Filippov wsr a2, intenable 2287d890b40SMax Filippov rsil a3, 0 2297d890b40SMax Filippov rsr a3, ps 2307d890b40SMax Filippov esync 2317d890b40SMax Filippov wsr a2, intset 2327d890b40SMax Filippov1: 2337d890b40SMax Filippov esync 2347d890b40SMax Filippov2: 2357d890b40SMax Filippov test_fail 2367d890b40SMax Filippov3: 237*9c988226SMax Filippov rsr a2, glue(eps, HIGH_LEVEL_SOFT_LEVEL) 2387d890b40SMax Filippov assert eq, a2, a3 239*9c988226SMax Filippov rsr a2, glue(epc, HIGH_LEVEL_SOFT_LEVEL) 2407d890b40SMax Filippov movi a3, 1b 2417d890b40SMax Filippov assert ge, a2, a3 2427d890b40SMax Filippov movi a3, 2b 2437d890b40SMax Filippov assert ge, a3, a2 2447d890b40SMax Filippov movi a2, 4f 245*9c988226SMax Filippov wsr a2, glue(epc, HIGH_LEVEL_SOFT_LEVEL) 246*9c988226SMax Filippov movi a2, 0x40000 | HIGH_LEVEL_SOFT_LEVEL 247*9c988226SMax Filippov wsr a2, glue(eps, HIGH_LEVEL_SOFT_LEVEL) 248*9c988226SMax Filippov rfi HIGH_LEVEL_SOFT_LEVEL 2497d890b40SMax Filippov test_fail 2507d890b40SMax Filippov4: 2517d890b40SMax Filippov rsr a2, ps 252*9c988226SMax Filippov movi a3, 0x40000 | HIGH_LEVEL_SOFT_LEVEL 2537d890b40SMax Filippov assert eq, a2, a3 2547d890b40SMax Filippovtest_end 255*9c988226SMax Filippov#endif 256*9c988226SMax Filippov 257*9c988226SMax Filippov#endif 2587d890b40SMax Filippov 2597d890b40SMax Filippovtest_suite_end 260