Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | // SPDX-License-Identifier: GPL-2.0+ /* * Copyright (c) 2015 Google, Inc * Written by Simon Glass <sjg@chromium.org> */ #include <common.h> #include <command.h> #include <errno.h> #include <time.h> #include <linux/delay.h> static int test_get_timer(void) { ulong base, start, next, diff; int iter; base = get_timer(0); start = get_timer(0); for (iter = 0; iter < 10; iter++) { do { next = get_timer(0); } while (start == next); if (start + 1 != next) { printf("%s: iter=%d, start=%lu, next=%lu, expected a difference of 1\n", __func__, iter, start, next); return -EINVAL; } start++; } /* * Check that get_timer(base) matches our elapsed time, allowing that * an extra millisecond may have passed. */ diff = get_timer(base); if (diff != iter && diff != iter + 1) { printf("%s: expected get_timer(base) to match elapsed time: diff=%lu, expected=%d\n", __func__, diff, iter); return -EINVAL; } return 0; } static int test_timer_get_us(void) { ulong prev, next, min = 1000000; long delta; int iter; /* Find the minimum delta we can measure, in microseconds */ prev = timer_get_us(); for (iter = 0; iter < 100; ) { next = timer_get_us(); if (next != prev) { delta = next - prev; if (delta < 0) { printf("%s: timer_get_us() went backwards from %lu to %lu\n", __func__, prev, next); return -EINVAL; } else if (delta != 0) { if (delta < min) min = delta; prev = next; iter++; } } } if (min != 1) { printf("%s: Minimum microsecond delta should be 1 but is %lu\n", __func__, min); return -EINVAL; } return 0; } static int test_time_comparison(void) { ulong start_us, end_us, delta_us; long error; ulong start; start = get_timer(0); start_us = timer_get_us(); while (get_timer(start) < 1000) ; end_us = timer_get_us(); delta_us = end_us - start_us; error = delta_us - 1000000; printf("%s: Microsecond time for 1 second: %lu, error = %ld\n", __func__, delta_us, error); if (abs(error) > 1000) return -EINVAL; return 0; } static int test_udelay(void) { long error; ulong start, delta; int iter; start = get_timer(0); for (iter = 0; iter < 1000; iter++) udelay(1000); delta = get_timer(start); error = delta - 1000; printf("%s: Delay time for 1000 udelay(1000): %lu ms, error = %ld\n", __func__, delta, error); if (abs(error) > 100) return -EINVAL; return 0; } int do_ut_time(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { int ret = 0; ret |= test_get_timer(); ret |= test_timer_get_us(); ret |= test_time_comparison(); ret |= test_udelay(); printf("Test %s\n", ret ? "failed" : "passed"); return ret ? CMD_RET_FAILURE : CMD_RET_SUCCESS; } |