#include "macros.inc" #define CCOUNT_SHIFT 4 #define WAIT_LOOPS 20 #define level1 kernel #define INTERRUPT_LEVEL(n) glue3(XCHAL_INT, n, _LEVEL) .macro make_ccount_delta target, delta rsr \delta, ccount rsr \target, ccount sub \delta, \target, \delta slli \delta, \delta, CCOUNT_SHIFT add \target, \target, \delta .endm test_suite timer #if XCHAL_HAVE_CCOUNT test ccount rsr a3, ccount rsr a4, ccount assert ne, a3, a4 test_end test ccount_write rsr a3, ccount rsr a4, ccount sub a4, a4, a3 movi a2, 0x12345678 wsr a2, ccount esync rsr a3, ccount sub a3, a3, a2 slli a4, a4, 2 assert ltu, a3, a4 test_end #if XCHAL_NUM_TIMERS test ccount_update_deadline movi a2, 0 wsr a2, intenable rsr a2, interrupt wsr a2, intclear movi a2, 0 #if XCHAL_NUM_TIMERS > 1 wsr a2, ccompare1 #endif #if XCHAL_NUM_TIMERS > 2 wsr a2, ccompare2 #endif movi a2, 0x12345678 wsr a2, ccompare0 rsr a3, interrupt assert eqi, a3, 0 movi a2, 0x12345677 wsr a2, ccount esync nop rsr a2, interrupt movi a3, 1 << XCHAL_TIMER0_INTERRUPT assert eq, a2, a3 test_end test ccompare movi a2, 0 wsr a2, intenable rsr a2, interrupt wsr a2, intclear movi a2, 0 #if XCHAL_NUM_TIMERS > 1 wsr a2, ccompare1 #endif #if XCHAL_NUM_TIMERS > 2 wsr a2, ccompare2 #endif make_ccount_delta a2, a15 wsr a2, ccompare0 1: rsr a3, interrupt rsr a4, ccount rsr a5, interrupt sub a4, a4, a2 bgez a4, 2f assert eqi, a3, 0 j 1b 2: assert nei, a5, 0 test_end #if INTERRUPT_LEVEL(XCHAL_TIMER0_INTERRUPT) == 1 test ccompare0_interrupt set_vector kernel, 2f movi a2, 0 wsr a2, intenable rsr a2, interrupt wsr a2, intclear movi a2, 0 #if XCHAL_NUM_TIMERS > 1 wsr a2, ccompare1 #endif #if XCHAL_NUM_TIMERS > 2 wsr a2, ccompare2 #endif movi a3, WAIT_LOOPS make_ccount_delta a2, a15 wsr a2, ccompare0 rsync rsr a2, interrupt assert eqi, a2, 0 movi a2, 1 << XCHAL_TIMER0_INTERRUPT wsr a2, intenable rsil a2, 0 loop a3, 1f nop 1: test_fail 2: rsr a2, exccause assert eqi, a2, 4 /* LEVEL1_INTERRUPT_CAUSE */ test_end #endif #if XCHAL_NUM_TIMERS > 1 test ccompare1_interrupt set_vector glue(level, INTERRUPT_LEVEL(XCHAL_TIMER1_INTERRUPT)), 2f movi a2, 0 wsr a2, intenable rsr a2, interrupt wsr a2, intclear movi a2, 0 wsr a2, ccompare0 #if XCHAL_NUM_TIMERS > 2 wsr a2, ccompare2 #endif movi a3, WAIT_LOOPS make_ccount_delta a2, a15 wsr a2, ccompare1 rsync rsr a2, interrupt assert eqi, a2, 0 movi a2, 1 << XCHAL_TIMER1_INTERRUPT wsr a2, intenable rsil a2, INTERRUPT_LEVEL(XCHAL_TIMER1_INTERRUPT) - 1 loop a3, 1f nop 1: test_fail 2: test_end #endif #if XCHAL_NUM_TIMERS > 2 test ccompare2_interrupt set_vector glue(level, INTERRUPT_LEVEL(XCHAL_TIMER2_INTERRUPT)), 2f movi a2, 0 wsr a2, intenable rsr a2, interrupt wsr a2, intclear movi a2, 0 wsr a2, ccompare0 wsr a2, ccompare1 movi a3, WAIT_LOOPS make_ccount_delta a2, a15 wsr a2, ccompare2 rsync rsr a2, interrupt assert eqi, a2, 0 movi a2, 1 << XCHAL_TIMER2_INTERRUPT wsr a2, intenable rsil a2, INTERRUPT_LEVEL(XCHAL_TIMER2_INTERRUPT) - 1 loop a3, 1f nop 1: test_fail 2: test_end #endif test ccompare_interrupt_masked set_vector kernel, 2f movi a2, 0 wsr a2, intenable rsr a2, interrupt wsr a2, intclear movi a2, 0 #if XCHAL_NUM_TIMERS > 2 wsr a2, ccompare2 #endif movi a3, 2 * WAIT_LOOPS make_ccount_delta a2, a15 #if XCHAL_NUM_TIMERS > 1 wsr a2, ccompare1 #endif add a2, a2, a15 wsr a2, ccompare0 rsync rsr a2, interrupt assert eqi, a2, 0 movi a2, 1 << XCHAL_TIMER0_INTERRUPT wsr a2, intenable rsil a2, 0 loop a3, 1f nop 1: test_fail 2: rsr a2, exccause assert eqi, a2, 4 /* LEVEL1_INTERRUPT_CAUSE */ test_end test ccompare_interrupt_masked_waiti set_vector kernel, 2f movi a2, 0 wsr a2, intenable rsr a2, interrupt wsr a2, intclear movi a2, 0 #if XCHAL_NUM_TIMERS > 2 wsr a2, ccompare2 #endif movi a3, 2 * WAIT_LOOPS make_ccount_delta a2, a15 #if XCHAL_NUM_TIMERS > 1 wsr a2, ccompare1 #endif add a2, a2, a15 wsr a2, ccompare0 rsync rsr a2, interrupt assert eqi, a2, 0 movi a2, 1 << XCHAL_TIMER0_INTERRUPT wsr a2, intenable waiti 0 test_fail 2: rsr a2, exccause assert eqi, a2, 4 /* LEVEL1_INTERRUPT_CAUSE */ test_end #endif #endif test_suite_end