// Copyright 2019 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.device;

using zx;

/// Maxmium length for a device name
const uint64 MAX_DEVICE_NAME_LEN = 32;
/// Maximum length of a device path
const uint64 MAX_DEVICE_PATH_LEN = 1024;
/// Maxmium length for a driver name
const uint64 MAX_DRIVER_NAME_LEN = 32;
/// Maximum length for a driver path
const uint64 MAX_DRIVER_PATH_LEN = 1024;
/// Maximum device power states. In future this should account
/// for performant states.
const uint32 MAX_DEVICE_POWER_STATES = 5;
const uint32 MIN_DEVICE_POWER_STATES = 2; // D0 & D3COLD

/// Signal that will be active on a device event handle if the device's read() method
/// will return data.
const uint32 DEVICE_SIGNAL_READABLE = 0x01000000; // ZX_USER_SIGNAL_0
/// Signal that will be active on a device event handle if the device has some out-of-band
/// mechanism that needs attention.
/// This is primarily used by the PTY support.
const uint32 DEVICE_SIGNAL_OOB = 0x02000000; // ZX_USER_SIGNAL_1
/// Signal that will be active on a device event handle if the device's write() method
/// will accept data.
const uint32 DEVICE_SIGNAL_WRITABLE = 0x04000000; // ZX_USER_SIGNAL_2
/// Signal that will be active on a device event handle if the device has encountered an error.
/// This is primarily used by the PTY support.
const uint32 DEVICE_SIGNAL_ERROR = 0x08000000; // ZX_USER_SIGNAL_3
/// Signal that will be active on a device event handle if the device has been disconnected.
/// This is primarily used by the PTY support.
const uint32 DEVICE_SIGNAL_HANGUP = 0x10000000; // ZX_USER_SIGNAL_4


enum DevicePowerState : uint8 {
  /// Mandatory Working state. Device is fully functional, can take I/O,
  /// issue interrrupts. This state is mandatory for all devices
  /// The device enters into this state by default, when powered on.
  DEVICE_POWER_STATE_D0 = 0;
  /// [OPTIONAL] Device is not working when in this state. It cannot process
  /// I/O nor issue interrupts, unless it is armed for some special interrupts
  /// that can wake up the system/device. When in this state, the restore time
  /// of getting back to working state is less than other low-power states
  /// Power savings in this state are lesser than other low power states.
  /// Device may retain some hardware context and full initialization
  /// may not be needed when resuming from this state.
  DEVICE_POWER_STATE_D1 = 1;
  /// [OPTIONAL] Device is not working when in this state. It cannot process
  /// I/O nor issue interrupts, unless it is armed for some special interrupts
  /// that can wake up the system/device. When in this state, the restore time
  /// of getting back to working state is more than DEVICE_POWER_STATE_D1 and
  /// less than restore time of getting back from DEVICE_POWER_STATE_D3HOT,
  /// DEVICE_POWER_STATE_D3COLD. Power savings in this state are lesser
  /// than DEVICE_POWER_STATE_D3COLD, DEVICE_POWER_STATE_D3HOT.
  /// Device may retain some hardware context and full initialization
  /// may not be needed when resuming from this state.
  DEVICE_POWER_STATE_D2 = 2;
  /// [OPTIONAL] Device is not working when in this state. It cannot process
  /// I/O nor issue interrupts, unless it is armed for some special interrupts
  /// that can wake up the system/device. When in this state, the restore time
  /// of getting back to working state is more than DEVICE_POWER_STATE_D1,
  /// DEVICE_POWER_STATE_D3HOT and less than restore time of getting back from
  /// DEVICE_POWER_STATE_D3COLD. Power savings in this state are lesser
  /// than DEVICE_POWER_STATE_D3COLD. Device has no context and full initialization
  /// by the device driver when resuming from this state.
  /// Although the device is completely off, it is still powered on and is enumerable.
  DEVICE_POWER_STATE_D3HOT = 3;
  /// [MANDATORY] Device is not working when in this state. It cannot process
  /// I/O nor issue interrupts, unless it is armed for some special interrupts
  /// that can wake up the system/device. When in this state, the restore time
  /// of getting back to working state is more than all other low power states.
  /// Power savings are more compared to all other low-power states.
  /// Device has no context and full initialization by the device driver when
  /// resuming from this state. In this state, the power to this device is turned off.
  /// Device may be powered by other auxiliary supplies to support wake capability.
  DEVICE_POWER_STATE_D3COLD = 4;
};

//TODO(ravoorir): This should be table when the Controller protocol moves off of
//simple layout.
struct DevicePowerStateInfo {
  DevicePowerState state_id;

  /// Is this state supported?
  bool is_supported;

  /// Restore time for coming out of this state to working D0 state.
  int64 restore_latency;

  /// Is this device wakeup_capable?
  bool wakeup_capable;

  /// Deepest system system sleep state that the device can wake the system from.
  int32 system_wake_state;
};

/// Interface for manipulating a device in a devhost
[Layout = "Simple"]
protocol Controller {
    /// Attempt to bind the requested driver to this device
    Bind(string:MAX_DRIVER_PATH_LEN driver) -> (zx.status status);
    /// Disconnect this device and allow its parent to be bound again.
    /// This may not complete before it returns.
    ScheduleUnbind() -> (zx.status status);

    /// Return the name of the driver managing this the device
    GetDriverName() -> (zx.status status, string:MAX_DRIVER_NAME_LEN? name);
    /// Return the name of the device
    GetDeviceName() -> (string:MAX_DEVICE_NAME_LEN name);

    /// Return the topological path for this device
    GetTopologicalPath() -> (zx.status status, string:MAX_DEVICE_PATH_LEN? path);

    /// Get an event for monitoring device conditions (see `DEVICE_SIGNAL_*` constants)
    GetEventHandle() -> (zx.status status, handle<event>? event);

    /// Return the current logging flags for this device's driver
    GetDriverLogFlags() -> (zx.status status, uint32 flags);
    /// Set the logging flags for this device's driver.
    /// Each set bit in `clear_flags` will be cleared in the log flags state.
    /// Each set bit in `set_flags` will then be set in the log flags state.
    SetDriverLogFlags(uint32 clear_flags, uint32 set_flags) -> (zx.status status);

    /// Debug command: execute the device's suspend hook
    DebugSuspend() -> (zx.status status);
    /// Debug command: execute the device's resume hook
    DebugResume() -> (zx.status status);

    /// Runs compatibility tests for the driver that binds to this device.
    /// The |hook_wait_time| is the time that the driver expects to take for
    /// each device hook in nanoseconds.
    /// Returns whether the driver passed the compatibility check.
    RunCompatibilityTests(int64 hook_wait_time) -> (uint32 status);

    /// Gets the device power capabilities. Used by the system wide power manager
    /// to manage power for this device.
    GetDevicePowerCaps() -> (array<DevicePowerStateInfo>:MAX_DEVICE_POWER_STATES dpstates) error zx.status;

    /// Transition this device from a working to a sleep state or from a sleep state to a deeper sleep
    /// state. TODO(ravoorir): At the moment, this will call the suspend hook only on this device.
    /// In a future change, this api will result in suspend hook being called on all the children and
    /// descendants before transitioning this device.
    /// On success, the out_state is same as requested_state.
    /// On failure, the out_state is the state the device can go into at this point, depending
    /// on the configuration of its children. For example, a device cannot go into the
    /// requested_state, if the requested_state does not support a descendant's wake configuration.
    Suspend(DevicePowerState requested_state) -> (zx.status status, DevicePowerState out_state);
    /// Transition this device from a sleep state to a working state.
    /// TODO(ravoorir): At the moment, this will call the resume hook only on this device.
    /// In a future change, this api will result in resume hook being called on all the children
    /// after the current device is transitioned.
    /// On success, the out_state has the actual state of the device. The out_state could be
    /// different from the requested_state, if the device could not resume to the requested
    /// performant state, but the device could resume to a working state.
    //  Just because the device is not able to transition to a particular performant state,
    //  we do not want to suspend the device back.
    Resume(DevicePowerState requested_state) -> (DevicePowerState out_state) error zx.status;
};
