blob: 184b0cf6ed722025b82598d8f53aea84f1072a9d [file]
/*
* Copyright 2017, Data61
* Commonwealth Scientific and Industrial Research Organisation (CSIRO)
* ABN 41 687 119 230.
*
* This software may be distributed and modified according to the terms of
* the BSD 2-Clause license. Note that NO WARRANTY is provided.
* See "LICENSE_BSD2.txt" for details.
*
* @TAG(DATA61_BSD)
*/
#include <autoconf.h>
#include <platsupport/gen_config.h>
#include <platsupport/arch/tsc.h>
#include <platsupport/delay.h>
#include <stdint.h>
#include <stdio.h>
#define DEFAULT_CPUFREQ 1500000000UL
static unsigned long cpufreq_hint = DEFAULT_CPUFREQ;
#define CYCLES_PER_US(cpufreq) (cpufreq / 1000000)
static void
ps_do_cycle_delay(uint64_t cycles)
{
uint64_t end = rdtsc_pure() + cycles;
while (1) {
if (end <= rdtsc_pure()) {
break;
}
}
}
void
ps_udelay(unsigned long us)
{
ps_do_cycle_delay((uint64_t)us * CYCLES_PER_US(cpufreq_hint));
}
void
ps_cpufreq_hint(unsigned long hz)
{
if (hz == 0) {
ZF_LOGW("%s:%d - Invalid CPU frequency for delay loop, use the default\n",
__FILE__, __LINE__);
hz = DEFAULT_CPUFREQ;
}
cpufreq_hint = hz;
}