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

using zx;

/// The number of variants of `SystemPowerState`.
const MAX_SYSTEM_POWER_STATES uint32 = 8;

/// Provides protocol for fetching relevant information during a system state transition.
@discoverable
closed protocol SystemStateTransition {
    /// Gets the termination state.
    strict GetTerminationSystemState() -> (struct {
        // TODO(ravoorir): When the system power states are properly defined,
        // remove the suspend flags. For now, treat each suspend flag as a system
        // power state.
        state @generated_name("SystemPowerState") strict enum : uint8 {
            FULLY_ON = 1;
            REBOOT = 2;
            REBOOT_BOOTLOADER = 3;
            REBOOT_RECOVERY = 4;
            POWEROFF = 5;
            MEXEC = 6;
            SUSPEND_RAM = 7;
            REBOOT_KERNEL_INITIATED = 8;
        };
    });

    /// When the system termination state is MEXEC, in the course of shutting
    /// down, driver_manager will perform an mexec itself after suspending all
    /// drivers. This method allows driver manager to fetch the kernel and
    /// data ZBIs to be passed to zx_system_mexec().
    ///
    /// This method only should only be invoked in the case MEXEC shutdown.
    ///
    /// It is expected that the ZBI items specified by
    /// `zx_system_mexec_payload_get()` have not yet been appended to the
    /// provided data ZBI.
    ///
    /// Returns
    /// * ZX_ERR_BAD_STATE: The termination system state is not set to MEXEC.
    strict GetMexecZbis() -> (resource struct {
        kernel_zbi zx.Handle:VMO;
        data_zbi zx.Handle:VMO;
    }) error zx.Status;
};
