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

library fuchsia.hardware.ram.metrics;

using zx;

const uint32 MAX_COUNT_CHANNELS = 8;

/// Configures bus hardware to make one measurement.
struct BandwidthMeasurementConfig {
    /// How many bus cycles to perform the measurement over.
    uint64 cycles_to_measure;
    /// Contains which ports to aggregate for each channel.
    array<uint64>:MAX_COUNT_CHANNELS channels;
};

/// Contains the actual buys cycles granted to each channel. Not all hardware
/// supports all 3 counters. If a counter is not supported the value
///  returned is zero.
struct GrantedCyclesResult {
    uint64 read_cycles;
    uint64 write_cycles;
    uint64 readwrite_cycles;
};

struct BandwidthInfo {
    // Time when the measurement started.
    zx.time timestamp;
    // Bus frequency in hertz (Hz) when the measurement started.
    uint64 frequency;
    array<GrantedCyclesResult>:MAX_COUNT_CHANNELS channels;
    GrantedCyclesResult total;
};

/// Interface to obtain memory bandwidth usage measurements from hardware
/// cycle counters. The interface supports up to 6 hardware counters
/// (called channels) which aggregate up to 64 unique buses (called ports).
///
/// An example of a possible configuration:
/// channel[0] <- A53x4 + M3x1
/// channel[1] <- gpu
/// channel[2] <- vpu + h264_decoder + hdmi
/// channel[3] <- image_isp + h264_encoder
///
/// The number of channels and which bit patterns to use for each port
/// are hardware specific.
///
protocol Device {
    /// Trigger one measurement. This can be called again before the reply
    /// arrives but it won't be serviced until previous requests are completed.
    ///
    /// The return on success is the measurement.
    ///
    /// The return on failure are as follows:
    /// ZX_ERR_INVALID_ARGS : The BandwidthMeasurementConfig values are incorrect.
    /// ZX_ERR_NOT_SUPPORTED : The BandwidthMeasurementConfig values are not supported
    /// by the hardware.
    /// ZX_ERR_SHOULD_WAIT : Too many requests pending. A future request might succeed.
    /// Other errors indicate internal failure.
    MeasureBandwidth(BandwidthMeasurementConfig config) -> (BandwidthInfo info) error zx.status;
};
