/* 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/memops.h>
#include <ros/bitfield.h>
#include <stdint.h>

/* The request format for the #arch/perf device is as follow (all the integers
 * listed here are little endian):
 *
 * U8 CMD;
 * [CMD dependent payload]
 *
 * The following command are supported, with their own structure:
 *
 * PERFMON_CMD_COUNTER_OPEN request
 *   U8 CMD; (= PERFMON_CMD_COUNTER_OPEN)
 *   U64 EVENT_DESCRIPTOR;
 *   U64 EVENT_FLAGS;
 *   U64 EVENT_TRIGGER_COUNT;
 *   U64 EVENT_USER_DATA;
 *   U32 NUM_CPUMASK_BYTES;
 *   U8 CPUMASK_BYTES[NUM_CPUMASK_BYTES];
 * PERFMON_CMD_COUNTER_OPEN response
 *   U32 EVENT_DESCRIPTOR;
 *
 * PERFMON_CMD_COUNTER_STATUS request
 *   U8 CMD; (= PERFMON_CMD_COUNTER_STATUS)
 *   U32 EVENT_DESCRIPTOR;
 * PERFMON_CMD_COUNTER_STATUS response
 *   U32 NUM_VALUES; (always num_cores)
 *   U64 VALUES[NUM_VALUES]; (one value per core - zero if the counter was not
 *                            active in that core)
 *
 * PERFMON_CMD_COUNTER_CLOSE request
 *   U8 CMD; (= PERFMON_CMD_COUNTER_CLOSE)
 *   U32 EVENT_DESCRIPTOR;
 * PERFMON_CMD_COUNTER_CLOSE response
 *   NONE
 *
 * PERFMON_CMD_CPU_CAPS request
 *   U8 CMD; (= PERFMON_CMD_CPU_CAPS)
 * PERFMON_CMD_CPU_CAPS response
 *   U32 PERFMON_VERSION;
 *   U32 ARCH_EVENTS;
 *   U32 BITS_X_COUNTER;
 *   U32 COUNTERS_X_PROC;
 *   U32 BITS_X_FIX_COUNTER;
 *   U32 FIX_COUNTERS_X_PROC;
 */

#define PERFMON_CMD_COUNTER_OPEN 1
#define PERFMON_CMD_COUNTER_STATUS 2
#define PERFMON_CMD_COUNTER_CLOSE 3
#define PERFMON_CMD_CPU_CAPS 4

#define PERFMON_FIXED_EVENT (1 << 0)

#define PMEV_EVENT MKBITFIELD(0, 8)
#define PMEV_MASK MKBITFIELD(8, 8)
#define PMEV_USR MKBITFIELD(16, 1)
#define PMEV_OS MKBITFIELD(17, 1)
#define PMEV_EDGE MKBITFIELD(18, 1)
#define PMEV_PC MKBITFIELD(19, 1)
#define PMEV_INTEN MKBITFIELD(20, 1)
#define PMEV_ANYTH MKBITFIELD(21, 1)
#define PMEV_EN MKBITFIELD(22, 1)
#define PMEV_INVCMSK MKBITFIELD(23, 1)
#define PMEV_CMASK MKBITFIELD(24, 8)

#define PMEV_GET_EVENT(v) BF_GETFIELD(v, PMEV_EVENT)
#define PMEV_SET_EVENT(v, x) BF_SETFIELD(v, x, PMEV_EVENT)
#define PMEV_GET_MASK(v) BF_GETFIELD(v, PMEV_MASK)
#define PMEV_SET_MASK(v, x) BF_SETFIELD(v, x, PMEV_MASK)
#define PMEV_GET_USR(v) BF_GETFIELD(v, PMEV_USR)
#define PMEV_SET_USR(v, x) BF_SETFIELD(v, x, PMEV_USR)
#define PMEV_GET_OS(v) BF_GETFIELD(v, PMEV_OS)
#define PMEV_SET_OS(v, x) BF_SETFIELD(v, x, PMEV_OS)
#define PMEV_GET_EDGE(v) BF_GETFIELD(v, PMEV_EDGE)
#define PMEV_SET_EDGE(v, x) BF_SETFIELD(v, x, PMEV_EDGE)
#define PMEV_GET_PC(v) BF_GETFIELD(v, PMEV_PC)
#define PMEV_SET_PC(v, x) BF_SETFIELD(v, x, PMEV_PC)
#define PMEV_GET_INTEN(v) BF_GETFIELD(v, PMEV_INTEN)
#define PMEV_SET_INTEN(v, x) BF_SETFIELD(v, x, PMEV_INTEN)
#define PMEV_GET_ANYTH(v) BF_GETFIELD(v, PMEV_ANYTH)
#define PMEV_SET_ANYTH(v, x) BF_SETFIELD(v, x, PMEV_ANYTH)
#define PMEV_GET_EN(v) BF_GETFIELD(v, PMEV_EN)
#define PMEV_SET_EN(v, x) BF_SETFIELD(v, x, PMEV_EN)
#define PMEV_GET_INVCMSK(v) BF_GETFIELD(v, PMEV_INVCMSK)
#define PMEV_SET_INVCMSK(v, x) BF_SETFIELD(v, x, PMEV_INVCMSK)
#define PMEV_GET_CMASK(v) BF_GETFIELD(v, PMEV_CMASK)
#define PMEV_SET_CMASK(v, x) BF_SETFIELD(v, x, PMEV_CMASK)

struct perfmon_event {
	uint64_t event;
	uint64_t flags;
	uint64_t trigger_count;
	uint64_t user_data;
};

static inline void perfmon_init_event(struct perfmon_event *pev)
{
	ZERO_DATA(*pev);
}

static inline bool perfmon_is_fixed_event(const struct perfmon_event *pev)
{
	return (pev->flags & PERFMON_FIXED_EVENT) != 0;
}
