@@ -34,6 +34,7 @@
#define APPL_MODE_UDP 0 /**< UDP mode */
#define APPL_MODE_PING 1 /**< ping mode */
#define APPL_MODE_RCV 2 /**< receive mode */
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
/** print appl mode */
#define PRINT_APPL_MODE(x) printf("%s(%i)\n", #x, (x))
@@ -638,6 +639,7 @@ int main(int argc, char *argv[])
odp_pktio_t *pktio;
odp_instance_t instance;
odph_odpthread_params_t thr_params;
+ odp_timer_capability_t timer_capa;
/* Init ODP before calling anything else */
if (odp_init_global(&instance, NULL, NULL)) {
@@ -718,7 +720,11 @@ int main(int argc, char *argv[])
odp_pool_print(pool);
/* Create timer pool */
- tparams.res_ns = 1 * ODP_TIME_MSEC_IN_NS;
+ if (odp_timer_capability(ODP_CLOCK_CPU, &timer_capa)) {
+ EXAMPLE_ERR("Error: get timer capacity failed.\n");
+ exit(EXIT_FAILURE);
+ }
+ tparams.res_ns = MAX(1 * ODP_TIME_MSEC_IN_NS, timer_capa.res_ns);
tparams.min_tmo = 0;
tparams.max_tmo = 10000 * ODP_TIME_SEC_IN_NS;
tparams.num_timers = num_workers; /* One timer per worker */
@@ -18,6 +18,8 @@
/* ODP main header */
#include <odp_api.h>
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
+
int main(int argc ODP_UNUSED, char *argv[] ODP_UNUSED)
{
odp_instance_t instance;
@@ -35,6 +37,7 @@ int main(int argc ODP_UNUSED, char *argv[] ODP_UNUSED)
uint64_t tick;
odp_timeout_t tmo;
int ret = 0;
+ odp_timer_capability_t timer_capa;
/*
* Init ODP app
@@ -61,7 +64,11 @@ int main(int argc ODP_UNUSED, char *argv[] ODP_UNUSED)
/*
* Create pool of timeouts
*/
- tparams.res_ns = 10 * ODP_TIME_MSEC_IN_NS;
+ if (odp_timer_capability(ODP_CLOCK_CPU, &timer_capa)) {
+ ret += 1;
+ goto err_tp;
+ }
+ tparams.res_ns = MAX(10 * ODP_TIME_MSEC_IN_NS, timer_capa.res_ns);
tparams.min_tmo = 10 * ODP_TIME_MSEC_IN_NS;
tparams.max_tmo = 1 * ODP_TIME_SEC_IN_NS;
tparams.num_timers = 1; /* One timer per worker */
@@ -23,6 +23,7 @@
#define MAX_WORKERS 32 /**< Max worker threads */
#define NUM_TMOS 10000 /**< Number of timers */
#define WAIT_NUM 10 /**< Max tries to rx last tmo per worker */
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
/** Test arguments */
@@ -259,6 +260,7 @@ static void parse_args(int argc, char *argv[], test_args_t *args)
{
int opt;
int long_index;
+ odp_timer_capability_t timer_capa;
static const struct option longopts[] = {
{"count", required_argument, NULL, 'c'},
@@ -277,8 +279,11 @@ static void parse_args(int argc, char *argv[], test_args_t *args)
odph_parse_options(argc, argv, shortopts, longopts);
/* defaults */
+ odp_timer_capability(ODP_CLOCK_CPU, &timer_capa);
+
args->cpu_count = 0; /* all CPU's */
- args->resolution_us = 10000;
+ args->resolution_us = MAX(10000,
+ timer_capa.res_ns / ODP_TIME_USEC_IN_NS);
args->min_us = 0;
args->max_us = 10000000;
args->period_us = 1000000;
@@ -20,6 +20,8 @@
#include "test_debug.h"
#include "timer.h"
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
+
/** @private Timeout range in milliseconds (ms) */
#define RANGE_MS 2000
@@ -140,6 +142,7 @@ void timer_test_odp_timer_cancel(void)
odp_timeout_t tmo;
odp_timer_set_t rc;
uint64_t tick;
+ odp_timer_capability_t timer_capa;
odp_pool_param_init(¶ms);
params.type = ODP_POOL_TIMEOUT;
@@ -150,7 +153,10 @@ void timer_test_odp_timer_cancel(void)
if (pool == ODP_POOL_INVALID)
CU_FAIL_FATAL("Timeout pool create failed");
- tparam.res_ns = 100 * ODP_TIME_MSEC_IN_NS;
+ if (odp_timer_capability(ODP_CLOCK_CPU, &timer_capa))
+ CU_FAIL_FATAL("Get timer capability failed")
+
+ tparam.res_ns = MAX(100 * ODP_TIME_MSEC_IN_NS, timer_capa.res_ns);
tparam.min_tmo = 1 * ODP_TIME_SEC_IN_NS;
tparam.max_tmo = 10 * ODP_TIME_SEC_IN_NS;
tparam.num_timers = 1;
@@ -480,6 +486,7 @@ void timer_test_odp_timer_all(void)
uint64_t ns;
uint64_t t2;
pthrd_arg thrdarg;
+ odp_timer_capability_t timer_capa;
/* Reserve at least one core for running other processes so the timer
* test hopefully can run undisturbed and thus get better timing
@@ -505,12 +512,15 @@ void timer_test_odp_timer_all(void)
#define NAME "timer_pool"
#define RES (10 * ODP_TIME_MSEC_IN_NS / 3)
-#define MIN (10 * ODP_TIME_MSEC_IN_NS / 3)
-#define MAX (1000000 * ODP_TIME_MSEC_IN_NS)
+#define MIN_TMO (10 * ODP_TIME_MSEC_IN_NS / 3)
+#define MAX_TMO (1000000 * ODP_TIME_MSEC_IN_NS)
/* Create a timer pool */
- tparam.res_ns = RES;
- tparam.min_tmo = MIN;
- tparam.max_tmo = MAX;
+ if (odp_timer_capability(ODP_CLOCK_CPU, &timer_capa))
+ CU_FAIL("Error: get timer capacity failed.\n");
+
+ tparam.res_ns = MAX(RES, timer_capa.res_ns);
+ tparam.min_tmo = MIN_TMO;
+ tparam.max_tmo = MAX_TMO;
tparam.num_timers = num_workers * NTIMERS;
tparam.priv = 0;
tparam.clk_src = ODP_CLOCK_CPU;
@@ -524,9 +534,9 @@ void timer_test_odp_timer_all(void)
if (odp_timer_pool_info(tp, &tpinfo) != 0)
CU_FAIL("odp_timer_pool_info");
CU_ASSERT(strcmp(tpinfo.name, NAME) == 0);
- CU_ASSERT(tpinfo.param.res_ns == RES);
- CU_ASSERT(tpinfo.param.min_tmo == MIN);
- CU_ASSERT(tpinfo.param.max_tmo == MAX);
+ CU_ASSERT(tpinfo.param.res_ns == MAX(RES, timer_capa.res_ns));
+ CU_ASSERT(tpinfo.param.min_tmo == MIN_TMO);
+ CU_ASSERT(tpinfo.param.max_tmo == MAX_TMO);
CU_ASSERT(strcmp(tpinfo.name, NAME) == 0);
LOG_DBG("Timer pool handle: %" PRIu64 "\n", odp_timer_pool_to_u64(tp));
Use odp_timer_capability() to determine the max timer resolution Signed-off-by: Kevin Wang <kevin.wang@linaro.org> --- example/generator/odp_generator.c | 8 +++++++- example/timer/odp_timer_simple.c | 9 ++++++++- example/timer/odp_timer_test.c | 7 ++++++- test/common_plat/validation/api/timer/timer.c | 28 ++++++++++++++++++--------- 4 files changed, 40 insertions(+), 12 deletions(-) -- 1.9.1