/* Copyright (c) 2015 Google Inc
 * Davide Libenzi <dlibenzi@google.com>
 * See LICENSE for details.
 */

#pragma once

#include <sys/types.h>
#include <ros/common.h>
#include <ros/arch/perfmon.h>
#include <arch/x86.h>
#include <atomic.h>
#include <core_set.h>
#include <stdint.h>
#include <kthread.h>

#define MAX_VAR_COUNTERS 32
#define MAX_FIX_COUNTERS 16
#define MAX_PERFMON_COUNTERS (MAX_VAR_COUNTERS + MAX_FIX_COUNTERS)
#define INVALID_COUNTER INT32_MIN

struct hw_trapframe;

typedef int32_t counter_t;

struct perfmon_cpu_caps {
	uint32_t perfmon_version;
	uint32_t proc_arch_events;
	uint32_t bits_x_counter;
	uint32_t counters_x_proc;
	uint32_t bits_x_fix_counter;
	uint32_t fix_counters_x_proc;
};

struct perfmon_alloc {
	struct perfmon_event ev;
	counter_t cores_counters[0];
};

struct perfmon_session {
	qlock_t qlock;
	struct perfmon_alloc *allocs[MAX_PERFMON_COUNTERS];
};

struct perfmon_status {
	struct perfmon_event ev;
	uint64_t cores_values[0];
};

bool perfmon_supported(void);
void perfmon_global_init(void);
void perfmon_pcpu_init(void);
void perfmon_interrupt(struct hw_trapframe *hw_tf, void *data);
void perfmon_get_cpu_caps(struct perfmon_cpu_caps *pcc);
int perfmon_open_event(const struct core_set *cset, struct perfmon_session *ps,
					   const struct perfmon_event *pev);
void perfmon_close_event(struct perfmon_session *ps, int ped);
struct perfmon_status *perfmon_get_event_status(struct perfmon_session *ps,
												int ped);
void perfmon_free_event_status(struct perfmon_status *pef);
struct perfmon_session *perfmon_create_session(void);
void perfmon_close_session(struct perfmon_session *ps);

static inline uint64_t read_pmc(uint32_t index)
{
	uint32_t edx, eax;

	asm volatile("rdpmc" : "=d"(edx), "=a"(eax) : "c"(index));
	return ((uint64_t) edx << 32) | eax;
}
