blob: b0b706f0697330bfcb0a4dbf60397ea308424424 [file] [log] [blame]
// 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 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;
// Number of bytes per cycle.
uint64 bytes_per_cycle;
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;
/// 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() -> (uint32 value) error zx.status;
};