1*1eca58aaSPeter Maydell /* 2*1eca58aaSPeter Maydell * QTest testcase for the SSE timer device 3*1eca58aaSPeter Maydell * 4*1eca58aaSPeter Maydell * Copyright (c) 2021 Linaro Limited 5*1eca58aaSPeter Maydell * 6*1eca58aaSPeter Maydell * This program is free software; you can redistribute it and/or modify it 7*1eca58aaSPeter Maydell * under the terms of the GNU General Public License as published by the 8*1eca58aaSPeter Maydell * Free Software Foundation; either version 2 of the License, or 9*1eca58aaSPeter Maydell * (at your option) any later version. 10*1eca58aaSPeter Maydell * 11*1eca58aaSPeter Maydell * This program is distributed in the hope that it will be useful, but WITHOUT 12*1eca58aaSPeter Maydell * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13*1eca58aaSPeter Maydell * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14*1eca58aaSPeter Maydell * for more details. 15*1eca58aaSPeter Maydell */ 16*1eca58aaSPeter Maydell 17*1eca58aaSPeter Maydell #include "qemu/osdep.h" 18*1eca58aaSPeter Maydell #include "libqtest-single.h" 19*1eca58aaSPeter Maydell 20*1eca58aaSPeter Maydell /* 21*1eca58aaSPeter Maydell * SSE-123/SSE-300 timer in the mps3-an547 board, where it is driven 22*1eca58aaSPeter Maydell * at 32MHz, so 31.25ns per tick. 23*1eca58aaSPeter Maydell */ 24*1eca58aaSPeter Maydell #define TIMER_BASE 0x48000000 25*1eca58aaSPeter Maydell 26*1eca58aaSPeter Maydell /* PERIPHNSPPC0 register in the SSE-300 Secure Access Configuration block */ 27*1eca58aaSPeter Maydell #define PERIPHNSPPC0 (0x50080000 + 0x70) 28*1eca58aaSPeter Maydell 29*1eca58aaSPeter Maydell /* Base of the System Counter control frame */ 30*1eca58aaSPeter Maydell #define COUNTER_BASE 0x58100000 31*1eca58aaSPeter Maydell 32*1eca58aaSPeter Maydell /* SSE counter register offsets in the control frame */ 33*1eca58aaSPeter Maydell #define CNTCR 0 34*1eca58aaSPeter Maydell #define CNTSR 0x4 35*1eca58aaSPeter Maydell #define CNTCV_LO 0x8 36*1eca58aaSPeter Maydell #define CNTCV_HI 0xc 37*1eca58aaSPeter Maydell #define CNTSCR 0x10 38*1eca58aaSPeter Maydell 39*1eca58aaSPeter Maydell /* SSE timer register offsets */ 40*1eca58aaSPeter Maydell #define CNTPCT_LO 0 41*1eca58aaSPeter Maydell #define CNTPCT_HI 4 42*1eca58aaSPeter Maydell #define CNTFRQ 0x10 43*1eca58aaSPeter Maydell #define CNTP_CVAL_LO 0x20 44*1eca58aaSPeter Maydell #define CNTP_CVAL_HI 0x24 45*1eca58aaSPeter Maydell #define CNTP_TVAL 0x28 46*1eca58aaSPeter Maydell #define CNTP_CTL 0x2c 47*1eca58aaSPeter Maydell #define CNTP_AIVAL_LO 0x40 48*1eca58aaSPeter Maydell #define CNTP_AIVAL_HI 0x44 49*1eca58aaSPeter Maydell #define CNTP_AIVAL_RELOAD 0x48 50*1eca58aaSPeter Maydell #define CNTP_AIVAL_CTL 0x4c 51*1eca58aaSPeter Maydell 52*1eca58aaSPeter Maydell /* 4 ticks in nanoseconds (so we can work in integers) */ 53*1eca58aaSPeter Maydell #define FOUR_TICKS 125 54*1eca58aaSPeter Maydell 55*1eca58aaSPeter Maydell static void clock_step_ticks(uint64_t ticks) 56*1eca58aaSPeter Maydell { 57*1eca58aaSPeter Maydell /* 58*1eca58aaSPeter Maydell * Advance the qtest clock by however many nanoseconds we 59*1eca58aaSPeter Maydell * need to move the timer forward the specified number of ticks. 60*1eca58aaSPeter Maydell * ticks must be a multiple of 4, so we get a whole number of ns. 61*1eca58aaSPeter Maydell */ 62*1eca58aaSPeter Maydell assert(!(ticks & 3)); 63*1eca58aaSPeter Maydell clock_step(FOUR_TICKS * (ticks >> 2)); 64*1eca58aaSPeter Maydell } 65*1eca58aaSPeter Maydell 66*1eca58aaSPeter Maydell static void reset_counter_and_timer(void) 67*1eca58aaSPeter Maydell { 68*1eca58aaSPeter Maydell /* 69*1eca58aaSPeter Maydell * Reset the system counter and the timer between tests. This 70*1eca58aaSPeter Maydell * isn't a full reset, but it's sufficient for what the tests check. 71*1eca58aaSPeter Maydell */ 72*1eca58aaSPeter Maydell writel(COUNTER_BASE + CNTCR, 0); 73*1eca58aaSPeter Maydell writel(TIMER_BASE + CNTP_CTL, 0); 74*1eca58aaSPeter Maydell writel(TIMER_BASE + CNTP_AIVAL_CTL, 0); 75*1eca58aaSPeter Maydell writel(COUNTER_BASE + CNTCV_LO, 0); 76*1eca58aaSPeter Maydell writel(COUNTER_BASE + CNTCV_HI, 0); 77*1eca58aaSPeter Maydell } 78*1eca58aaSPeter Maydell 79*1eca58aaSPeter Maydell static void test_counter(void) 80*1eca58aaSPeter Maydell { 81*1eca58aaSPeter Maydell /* Basic counter functionality test */ 82*1eca58aaSPeter Maydell 83*1eca58aaSPeter Maydell reset_counter_and_timer(); 84*1eca58aaSPeter Maydell /* The counter should start disabled: check that it doesn't move */ 85*1eca58aaSPeter Maydell clock_step_ticks(100); 86*1eca58aaSPeter Maydell g_assert_cmpuint(readl(COUNTER_BASE + CNTCV_LO), ==, 0); 87*1eca58aaSPeter Maydell g_assert_cmpuint(readl(COUNTER_BASE + CNTCV_HI), ==, 0); 88*1eca58aaSPeter Maydell /* Now enable it and check that it does count */ 89*1eca58aaSPeter Maydell writel(COUNTER_BASE + CNTCR, 1); 90*1eca58aaSPeter Maydell clock_step_ticks(100); 91*1eca58aaSPeter Maydell g_assert_cmpuint(readl(COUNTER_BASE + CNTCV_LO), ==, 100); 92*1eca58aaSPeter Maydell g_assert_cmpuint(readl(COUNTER_BASE + CNTCV_HI), ==, 0); 93*1eca58aaSPeter Maydell /* Check the counter scaling functionality */ 94*1eca58aaSPeter Maydell writel(COUNTER_BASE + CNTCR, 0); 95*1eca58aaSPeter Maydell writel(COUNTER_BASE + CNTSCR, 0x00100000); /* 1/16th normal speed */ 96*1eca58aaSPeter Maydell writel(COUNTER_BASE + CNTCR, 5); /* EN, SCEN */ 97*1eca58aaSPeter Maydell clock_step_ticks(160); 98*1eca58aaSPeter Maydell g_assert_cmpuint(readl(COUNTER_BASE + CNTCV_LO), ==, 110); 99*1eca58aaSPeter Maydell g_assert_cmpuint(readl(COUNTER_BASE + CNTCV_HI), ==, 0); 100*1eca58aaSPeter Maydell } 101*1eca58aaSPeter Maydell 102*1eca58aaSPeter Maydell int main(int argc, char **argv) 103*1eca58aaSPeter Maydell { 104*1eca58aaSPeter Maydell int r; 105*1eca58aaSPeter Maydell 106*1eca58aaSPeter Maydell g_test_init(&argc, &argv, NULL); 107*1eca58aaSPeter Maydell 108*1eca58aaSPeter Maydell qtest_start("-machine mps3-an547"); 109*1eca58aaSPeter Maydell 110*1eca58aaSPeter Maydell qtest_add_func("/sse-timer/counter", test_counter); 111*1eca58aaSPeter Maydell 112*1eca58aaSPeter Maydell r = g_test_run(); 113*1eca58aaSPeter Maydell 114*1eca58aaSPeter Maydell qtest_end(); 115*1eca58aaSPeter Maydell 116*1eca58aaSPeter Maydell return r; 117*1eca58aaSPeter Maydell } 118