// 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 MAX_COUNT_CHANNELS uint32 = 8;

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

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

type BandwidthInfo = struct {
    // Time when the measurement started.
    timestamp zx.time;
    // Bus frequency in hertz (Hz) when the measurement started.
    frequency uint64;
    // Number of bytes per cycle.
    bytes_per_cycle uint64;
    channels array<GrantedCyclesResult, MAX_COUNT_CHANNELS>;
    total GrantedCyclesResult;
};

/// 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(struct {
        config BandwidthMeasurementConfig;
    }) -> (struct {
        info BandwidthInfo;
    }) error zx.status;

    /// Retrieve the DDR Windowing tool results
    /// The windowing tool runs in the bootloader and stores results in a sticky register.
    ///
    /// The return on success is the register value
    ///
    /// The return on failure is ZX_ERR_NOT_SUPPORTED if the hardware does not support
    /// reading the sticky register.
    GetDdrWindowingResults() -> (struct {
        value uint32;
    }) error zx.status;
};
