blob: 258ea2dd5e20f78f3acea3c8947c41ed8b4a69cc [file] [log] [blame]
// Copyright 2024 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.
@available(added=HEAD)
library fuchsia.hardware.suspend;
using zx;
/// Maximum number of suspend states supported by the system.
const MAX_SUSPEND_STATES uint32 = 256;
type SuspendState = table {
/// The amount of time taken for the system to resume from this
/// suspend state.
1: resume_latency zx.Duration;
};
type WakeReason = table {
/// A list of platform defined integers, each of which corresponds to
/// a physical interrupt vector on the system. The simplest such mapping
/// would be to map each interrupt number to a wake vector.
1: wake_vectors vector<uint64>:MAX;
/// A list of platform defined integers, each of which corresponds to
/// a wake vector that is *not* backed by a hardware interrupt.
2: soft_wake_vectors vector<uint64>:MAX;
};
open protocol Suspender {
/// Returns a list of [`fuchsia.hardware.suspend/SuspendState`] supported.
/// by the system. The system must return at least 1 suspend state which
/// corresponds to the "suspend-to-idle" state but may return up to
/// [`fuchsia.hardware.suspend/MAX_SUSPEND_STATES`] states.
/// The suspend states must be ordered in order of decreasing
/// `resume_latency` (and thereby increasing power consumption).
/// A particular build of the system must always return the same set of
/// suspend states.
flexible GetSuspendStates() -> (table {
1: suspend_states vector<SuspendState>:MAX_SUSPEND_STATES;
}) error zx.Status;
/// Instruct the system to suspend.
/// This call may return a ZX_ERR_* if the system was unable to suspend.
/// If the call succeeds, it will not return until the system has resumed.
/// Being interrupted while suspending and resuming before fully suspending
/// is not an error however `suspend_duration` must be None if the suspend
/// was interrupted.
flexible Suspend(table {
/// This index corresponds to an entry in the vector returned by
/// GetSuspendStates. Returns ZX_ERR_OUT_OF_RANGE if `state_index` is
/// greater than the number of supported suspend states. Returns
/// ZX_ERR_INVALID_ARGS if this field is unset.
1: state_index uint64;
}) -> (table {
/// The `WakeReason` that caused the system to resume.
/// See `type WakeReason` above for more details about wake reasons.
1: reason WakeReason;
/// The amount of time the system spent suspended. If the system is
/// interrupted during suspend this field is unset.
2: suspend_duration zx.Duration;
/// The amount of time it took for the system to suspend and resume not
/// including the duration that the system was suspended.
3: suspend_overhead zx.Duration;
}) error zx.Status;
};
service SuspendService {
suspender client_end:Suspender;
};