blob: b99e738c500fb159c2065fbdb8349a991971faf7 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Simon Glass9b4221b2015-05-02 09:25:02 -06002/*
3 * Copyright (c) 2015 Google, Inc
4 * Written by Simon Glass <sjg@chromium.org>
Simon Glass9b4221b2015-05-02 09:25:02 -06005 */
6
Simon Glass9b4221b2015-05-02 09:25:02 -06007#include <errno.h>
Simon Glass495a5dc2019-11-14 12:57:30 -07008#include <time.h>
Simon Glassdbd79542020-05-10 11:40:11 -06009#include <linux/delay.h>
Simon Glass3baf5a72024-11-02 13:37:02 -060010#include <test/lib.h>
11#include <test/ut.h>
Simon Glass9b4221b2015-05-02 09:25:02 -060012
Simon Glass3baf5a72024-11-02 13:37:02 -060013static int test_get_timer(struct unit_test_state *uts)
Simon Glass9b4221b2015-05-02 09:25:02 -060014{
15 ulong base, start, next, diff;
16 int iter;
17
18 base = get_timer(0);
19 start = get_timer(0);
20 for (iter = 0; iter < 10; iter++) {
21 do {
22 next = get_timer(0);
23 } while (start == next);
24
Simon Glasse41d94d2024-11-02 13:37:03 -060025 ut_asserteq(start + 1, next);
Simon Glass9b4221b2015-05-02 09:25:02 -060026 start++;
27 }
28
29 /*
30 * Check that get_timer(base) matches our elapsed time, allowing that
31 * an extra millisecond may have passed.
32 */
33 diff = get_timer(base);
Simon Glasse41d94d2024-11-02 13:37:03 -060034 ut_assert(diff == iter || diff == iter + 1);
Simon Glass9b4221b2015-05-02 09:25:02 -060035
36 return 0;
37}
Simon Glass3baf5a72024-11-02 13:37:02 -060038LIB_TEST(test_get_timer, 0);
Simon Glass9b4221b2015-05-02 09:25:02 -060039
Simon Glass3baf5a72024-11-02 13:37:02 -060040static int test_timer_get_us(struct unit_test_state *uts)
Simon Glass9b4221b2015-05-02 09:25:02 -060041{
42 ulong prev, next, min = 1000000;
43 long delta;
44 int iter;
45
46 /* Find the minimum delta we can measure, in microseconds */
47 prev = timer_get_us();
48 for (iter = 0; iter < 100; ) {
49 next = timer_get_us();
50 if (next != prev) {
51 delta = next - prev;
Simon Glasse41d94d2024-11-02 13:37:03 -060052 ut_assert(delta >= 0);
53 if (delta) {
Simon Glass9b4221b2015-05-02 09:25:02 -060054 if (delta < min)
55 min = delta;
56 prev = next;
57 iter++;
58 }
59 }
60 }
61
Simon Glasse41d94d2024-11-02 13:37:03 -060062 ut_asserteq(1, min);
Simon Glass9b4221b2015-05-02 09:25:02 -060063
64 return 0;
65}
Simon Glass3baf5a72024-11-02 13:37:02 -060066LIB_TEST(test_timer_get_us, 0);
Simon Glass9b4221b2015-05-02 09:25:02 -060067
Simon Glass3baf5a72024-11-02 13:37:02 -060068static int test_time_comparison(struct unit_test_state *uts)
Simon Glass9b4221b2015-05-02 09:25:02 -060069{
70 ulong start_us, end_us, delta_us;
71 long error;
72 ulong start;
73
74 start = get_timer(0);
75 start_us = timer_get_us();
76 while (get_timer(start) < 1000)
77 ;
78 end_us = timer_get_us();
79 delta_us = end_us - start_us;
80 error = delta_us - 1000000;
81 printf("%s: Microsecond time for 1 second: %lu, error = %ld\n",
82 __func__, delta_us, error);
Simon Glasse41d94d2024-11-02 13:37:03 -060083 ut_assert(abs(error) <= 1000);
Simon Glass9b4221b2015-05-02 09:25:02 -060084
85 return 0;
86}
Simon Glass3baf5a72024-11-02 13:37:02 -060087LIB_TEST(test_time_comparison, 0);
Simon Glass9b4221b2015-05-02 09:25:02 -060088
Simon Glass3baf5a72024-11-02 13:37:02 -060089static int test_udelay(struct unit_test_state *uts)
Simon Glass9b4221b2015-05-02 09:25:02 -060090{
91 long error;
92 ulong start, delta;
93 int iter;
94
95 start = get_timer(0);
96 for (iter = 0; iter < 1000; iter++)
97 udelay(1000);
98 delta = get_timer(start);
99 error = delta - 1000;
100 printf("%s: Delay time for 1000 udelay(1000): %lu ms, error = %ld\n",
101 __func__, delta, error);
Simon Glasse41d94d2024-11-02 13:37:03 -0600102 ut_assert(abs(error) <= 100);
Simon Glass9b4221b2015-05-02 09:25:02 -0600103
104 return 0;
105}
Simon Glass3baf5a72024-11-02 13:37:02 -0600106LIB_TEST(test_udelay, 0);