|  | // 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; | 
|  | }; |