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

#ifndef GARNET_LIB_CPUPERF_CONTROLLER_H_
#define GARNET_LIB_CPUPERF_CONTROLLER_H_

#include <cstdint>
#include <memory>

#include <lib/fxl/files/unique_fd.h>
#include <lib/zircon-internal/device/cpu-trace/cpu-perf.h>

#include "garnet/lib/cpuperf/device_reader.h"

namespace cpuperf {

class Controller {
 public:
  enum class Mode {
    // Collect profile-based samples.
    kSample,
    // Collect simple counts of events.
    kTally,
  };

  // The buffer size used by each cpu to record its data.
  // The protocol restricts buffer sizes in bytes to a uint32.
  // 2 gigabytes per cpu is plenty for now.
  static constexpr uint32_t kMaxBufferSizeInMb = 2 * 1024;

  // Return true if cpuperf is supported on this device.
  static bool IsSupported();

  // Fetch the properties of this device.
  static bool GetProperties(cpuperf_properties_t* props);

  static bool Create(uint32_t buffer_size_in_mb,
                     const cpuperf_config_t& config,
                     std::unique_ptr<Controller>* out_controller);

  ~Controller();

  bool Start();
  // It is ok to call this while stopped.
  void Stop();

  bool started() const { return started_; }

  Mode mode() const { return mode_; }

  uint32_t num_traces() const { return num_traces_; }

  std::unique_ptr<DeviceReader> GetReader();

 private:
  static bool Alloc(int fd, uint32_t num_traces, uint32_t buffer_size,
                    const cpuperf_config_t& config);
  Controller(fxl::UniqueFD fd, Mode mode, uint32_t num_traces,
             uint32_t buffer_size, const cpuperf_config_t& config);
  bool Stage();
  void Free();
  void Reset();

  fxl::UniqueFD fd_;
  const Mode mode_;
  // The number of traces we will collect (== #cpus for now).
  uint32_t num_traces_;
  // This is the actual buffer size we use, in bytes.
  const uint32_t buffer_size_;
  const cpuperf_config_t config_;
  bool started_ = false;
};

}  // namespace cpuperf

#endif  // GARNET_LIB_CPUPERF_CONTROLLER_H_
