// Copyright 2018 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.scpi;

using zx;

const MAX_DVFS_OPPS uint32 = 16;

type ScpiOppEntry = struct {
    /// The operating point frequency in Hz.
    freq_hz uint32;
    /// The operating point voltage in microvolts.
    volt_uv uint32;
};

type ScpiOpp = struct {
    /// The device's operating points.
    opp array<ScpiOppEntry, MAX_DVFS_OPPS>;
    /// In microseconds.
    latency uint32;
    /// The number of operating points in opp.
    count uint32;
};

@transport("Banjo")
@banjo_layout("ddk-protocol")
protocol Scpi {
    GetSensor(struct {
        name string:MAX;
    }) -> (struct {
        s zx.status;
        sensor_id uint32;
    });
    GetSensorValue(struct {
        sensor_id uint32;
    }) -> (struct {
        s zx.status;
        sensor_value uint32;
    });
    GetDvfsInfo(struct {
        power_domain uint8;
    }) -> (struct {
        s zx.status;
        opps ScpiOpp;
    });
    GetDvfsIdx(struct {
        power_domain uint8;
    }) -> (struct {
        s zx.status;
        index uint16;
    });
    SetDvfsIdx(struct {
        power_domain uint8;
        index uint16;
    }) -> (struct {
        s zx.status;
    });
};
