/*
 * Copyright (c) 2021 Arm Limited. All rights reserved.
 * SPDX-License-Identifier: Apache-2.0
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifdef __cplusplus
extern "C" {
#endif

#include "timer_native.h"

#include "log_macros.h"

#include <time.h>
#include <string.h>

#define MILLISECONDS_IN_SECOND      1000
#define MICROSECONDS_IN_SECOND      1000000
#define NANOSECONDS_IN_MILLISECOND  1000000
#define NANOSECONDS_IN_MICROSECOND  1000

void platform_reset_counters() { /* Nothing to do */ }

pmu_counters platform_get_counters(void)
{
    struct timespec current_time;
    pmu_counters platform_counters = {
        .num_counters = 0,
        .initialised = true
    };
    clock_gettime(1, &current_time);
    uint64_t microseconds = (current_time.tv_sec * MICROSECONDS_IN_SECOND) +
                            (current_time.tv_nsec / NANOSECONDS_IN_MICROSECOND);

#if NUM_PMU_COUNTERS > 0
    platform_counters.counters[0].value = microseconds;
    platform_counters.counters[0].name = "Duration";
    platform_counters.counters[0].unit = "microseconds";
    ++platform_counters.num_counters;
#endif /* NUM_PMU_COUNTERS > 0 */

    return platform_counters;
}

#ifdef __cplusplus
}
#endif
