1*0d6140beSAndroid Build Coastguard Worker /* 2*0d6140beSAndroid Build Coastguard Worker * This file is part of the flashrom project. 3*0d6140beSAndroid Build Coastguard Worker * 4*0d6140beSAndroid Build Coastguard Worker * Copyright 2024 Google LLC 5*0d6140beSAndroid Build Coastguard Worker * 6*0d6140beSAndroid Build Coastguard Worker * This program is free software; you can redistribute it and/or modify 7*0d6140beSAndroid Build Coastguard Worker * it under the terms of the GNU General Public License as published by 8*0d6140beSAndroid Build Coastguard Worker * the Free Software Foundation; version 2 of the License. 9*0d6140beSAndroid Build Coastguard Worker * 10*0d6140beSAndroid Build Coastguard Worker * This program is distributed in the hope that it will be useful, 11*0d6140beSAndroid Build Coastguard Worker * but WITHOUT ANY WARRANTY; without even the implied warranty of 12*0d6140beSAndroid Build Coastguard Worker * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13*0d6140beSAndroid Build Coastguard Worker * GNU General Public License for more details. 14*0d6140beSAndroid Build Coastguard Worker */ 15*0d6140beSAndroid Build Coastguard Worker #include <include/test.h> 16*0d6140beSAndroid Build Coastguard Worker #include <stdint.h> 17*0d6140beSAndroid Build Coastguard Worker #include <sys/time.h> 18*0d6140beSAndroid Build Coastguard Worker #include <time.h> 19*0d6140beSAndroid Build Coastguard Worker 20*0d6140beSAndroid Build Coastguard Worker #include "programmer.h" 21*0d6140beSAndroid Build Coastguard Worker #include "tests.h" 22*0d6140beSAndroid Build Coastguard Worker now_us(void)23*0d6140beSAndroid Build Coastguard Workerstatic uint64_t now_us(void) { 24*0d6140beSAndroid Build Coastguard Worker #if HAVE_CLOCK_GETTIME == 1 25*0d6140beSAndroid Build Coastguard Worker struct timespec ts; 26*0d6140beSAndroid Build Coastguard Worker 27*0d6140beSAndroid Build Coastguard Worker clock_gettime(CLOCK_MONOTONIC, &ts); 28*0d6140beSAndroid Build Coastguard Worker return (ts.tv_nsec / 1000) + (ts.tv_sec * 1000000); 29*0d6140beSAndroid Build Coastguard Worker #else 30*0d6140beSAndroid Build Coastguard Worker struct timeval tv; 31*0d6140beSAndroid Build Coastguard Worker 32*0d6140beSAndroid Build Coastguard Worker gettimeofday(&tv, NULL); 33*0d6140beSAndroid Build Coastguard Worker return tv.tv_usec + (tv.tv_sec * 1000000); 34*0d6140beSAndroid Build Coastguard Worker #endif 35*0d6140beSAndroid Build Coastguard Worker } 36*0d6140beSAndroid Build Coastguard Worker 37*0d6140beSAndroid Build Coastguard Worker static const int64_t min_sleep = CONFIG_DELAY_MINIMUM_SLEEP_US; 38*0d6140beSAndroid Build Coastguard Worker 39*0d6140beSAndroid Build Coastguard Worker /* 40*0d6140beSAndroid Build Coastguard Worker * A short delay should delay for at least as long as requested, 41*0d6140beSAndroid Build Coastguard Worker * and more than 10x as long would be worrisome. 42*0d6140beSAndroid Build Coastguard Worker * 43*0d6140beSAndroid Build Coastguard Worker * This test could fail spuriously on a heavily-loaded system, or if we need 44*0d6140beSAndroid Build Coastguard Worker * to use gettimeofday() and a time change (such as DST) occurs during the 45*0d6140beSAndroid Build Coastguard Worker * test. 46*0d6140beSAndroid Build Coastguard Worker */ udelay_test_short(void ** state)47*0d6140beSAndroid Build Coastguard Workervoid udelay_test_short(void **state) { 48*0d6140beSAndroid Build Coastguard Worker /* 49*0d6140beSAndroid Build Coastguard Worker * Delay for 100 microseconds, or short enough that we won't sleep. 50*0d6140beSAndroid Build Coastguard Worker * It's not useful to test the sleep path because we assume the OS won't 51*0d6140beSAndroid Build Coastguard Worker * sleep for less time than we ask. 52*0d6140beSAndroid Build Coastguard Worker */ 53*0d6140beSAndroid Build Coastguard Worker int64_t delay_us = 100; 54*0d6140beSAndroid Build Coastguard Worker if (delay_us >= min_sleep) 55*0d6140beSAndroid Build Coastguard Worker delay_us = min_sleep - 1; 56*0d6140beSAndroid Build Coastguard Worker /* No point in running this test if delay always sleeps. */ 57*0d6140beSAndroid Build Coastguard Worker if (delay_us <= 0) 58*0d6140beSAndroid Build Coastguard Worker skip(); 59*0d6140beSAndroid Build Coastguard Worker 60*0d6140beSAndroid Build Coastguard Worker uint64_t start = now_us(); 61*0d6140beSAndroid Build Coastguard Worker default_delay(delay_us); 62*0d6140beSAndroid Build Coastguard Worker uint64_t elapsed = now_us() - start; 63*0d6140beSAndroid Build Coastguard Worker 64*0d6140beSAndroid Build Coastguard Worker assert_in_range(elapsed, delay_us, 10 * delay_us); 65*0d6140beSAndroid Build Coastguard Worker } 66