blob: fcecd2fcfbaa667365fa6f399d2e0349c8743da9 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <stdint.h>
namespace perfmon {
// There's only a few fixed events, so handle them directly.
enum FixedEventId {
#define DEF_FIXED_EVENT(symbol, event_name, id, regnum, flags, readable_name, description) \
symbol ## _ID = PERFMON_MAKE_EVENT_ID(PERFMON_GROUP_FIXED, id),
#include <lib/zircon-internal/device/cpu-trace/intel-pm-events.inc>
};
// Verify each fixed counter regnum < IPM_MAX_FIXED_COUNTERS.
#define DEF_FIXED_EVENT(symbol, event_name, id, regnum, flags, readable_name, description) \
&& (regnum) < IPM_MAX_FIXED_COUNTERS
static_assert(1
#include <lib/zircon-internal/device/cpu-trace/intel-pm-events.inc>
, "");
enum MiscEventId {
#define DEF_MISC_SKL_EVENT(symbol, event_name, id, offset, size, flags, readable_name, description) \
symbol ## _ID = PERFMON_MAKE_EVENT_ID(PERFMON_GROUP_MISC, id),
#include <lib/zircon-internal/device/cpu-trace/skylake-misc-events.inc>
};
// Misc event ids needn't be consecutive.
// Build a lookup table we can use to track duplicates.
enum MiscEventNumber {
#define DEF_MISC_SKL_EVENT(symbol, event_name, id, offset, size, flags, readable_name, description) \
symbol ## _NUMBER,
#include <lib/zircon-internal/device/cpu-trace/skylake-misc-events.inc>
IPM_NUM_MISC_EVENTS
};
struct StagingState {
// Maximum number of each event we can handle.
unsigned max_num_fixed;
unsigned max_num_programmable;
unsigned max_num_misc;
// The number of events in use.
unsigned num_fixed;
unsigned num_programmable;
unsigned num_misc;
// The maximum value the counter can have before overflowing.
uint64_t max_fixed_value;
uint64_t max_programmable_value;
// For catching duplicates of the fixed counters.
bool have_fixed[IPM_MAX_FIXED_COUNTERS];
// For catching duplicates of the misc events, 1 bit per event.
uint64_t have_misc[(IPM_NUM_MISC_EVENTS + 63) / 64];
bool have_timebase0_user;
};
} // namespace perfmon