// 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.

// This file contains internal definitions common to all arches.
// These definitions are used for communication between the cpu-trace
// device driver and the kernel only.

#ifndef LIB_ZIRCON_INTERNAL_DEVICE_CPU_TRACE_COMMON_PM_H_
#define LIB_ZIRCON_INTERNAL_DEVICE_CPU_TRACE_COMMON_PM_H_

#include <stdint.h>
#include <zircon/types.h>

namespace perfmon {

// H/W properties used by common code.
struct PmuCommonProperties {
  // The H/W Performance Monitor version.
  uint16_t pm_version;

  // The maximum number of fixed events that can be simultaneously
  // supported, and their maximum width.
  uint16_t max_num_fixed_events;
  uint16_t max_fixed_counter_width;

  // The maximum number of programmable events that can be simultaneously
  // supported, and their maximum width.
  uint16_t max_num_programmable_events;
  uint16_t max_programmable_counter_width;

  // The maximum number of misc events that can be simultaneously
  // supported, and their maximum width.
  uint16_t max_num_misc_events;
  uint16_t max_misc_counter_width;
};

// Internal abstraction of event ids.
using PmuEventId = uint16_t;

// Values for the event flags field.
constexpr uint32_t kPmuConfigFlagMask = 0x1f;

// Collect os data.
constexpr uint32_t kPmuConfigFlagOs = 1 << 0;

// Collect userspace data.
constexpr uint32_t kPmuConfigFlagUser = 1 << 1;

// Collect aspace+pc values.
constexpr uint32_t kPmuConfigFlagPc = 1 << 2;

// If set then use the timebase event to drive data collection: data for this
// event is collected when data for the timebase event is collected, and the
// record emitted for this event is either a |kRecordTypeCount| or
// |kRecordTypeValue| record (depending on what the event is).
constexpr uint32_t kPmuConfigFlagUsesTimebase = 1 << 3;

// Collect the available set of last branches.
// Branch data is emitted as |kRecordTypeLastBranch| records.
// This is only available when the underlying system supports it.
// TODO(dje): Provide knob to specify how many branches.
constexpr uint32_t kPmuConfigFlagLastBranch = 1 << 4;

}  // namespace perfmon

// This is for passing buffer specs to the kernel.
typedef struct {
  zx_handle_t vmo;
} zx_pmu_buffer_t;

#endif  // LIB_ZIRCON_INTERNAL_DEVICE_CPU_TRACE_COMMON_PM_H_
