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

struct SystemPowerctlArg {
    // TODO(scottmg): More unnamed unions.
    //union {
    //  struct {
    //    uint8_t target_s_state; // Value between 1 and 5 indicating which S-state
    //    uint8_t sleep_type_a;   // Value from ACPI VM (SLP_TYPa)
    //    uint8_t sleep_type_b;   // Value from ACPI VM (SLP_TYPb)
    //  } acpi_transition_s_state;
    //  struct {
    //    uint32_t power_limit; // PL1 value in milliwatts
    //    uint32_t time_window; // PL1 time window in microseconds
    //    uint8_t clamp;        // PL1 clamping enable
    //    uint8_t enable;       // PL1 enable
    //  } x86_power_limit;
    //};
};

[Transport = "Syscall"]
protocol system {
    [const, vdsocall]
    system_get_dcache_line_size() -> (uint32 size);

    /// Get number of logical processors on the system.
    [const, vdsocall]
    system_get_num_cpus() -> (uint32 count);

    /// Get version string for system.
    [const, vdsocall]
    system_get_version_string() -> (string_view version);

    /// Get amount of physical memory on the system.
    [vdsocall]
    system_get_physmem() -> (uint64 physmem);

    // TODO(scottmg): "features" has a features attribute. I'm not sure if/how it's used.
    /// Get supported hardware capabilities.
    [vdsocall]
    system_get_features(uint32 kind) -> (status status, uint32 features);

    /// Retrieve a handle to a system event.
    /// Rights: None.
    system_get_event(handle:JOB root_job, uint32 kind) -> (status status, handle:EVENT event);

    /// Soft reboot the system with a new kernel and bootimage.
    /// Rights: resource must have resource kind ZX_RSRC_KIND_ROOT.
    /// Rights: kernel_vmo must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_READ.
    /// Rights: bootimage_vmo must be of type ZX_OBJ_TYPE_VMO and have ZX_RIGHT_READ.
    system_mexec(handle:RESOURCE resource, handle:VMO kernel_vmo, handle:VMO bootimage_vmo)
        -> (status status);

    /// Return a ZBI containing ZBI entries necessary to boot this system.
    /// Rights: resource must have resource kind ZX_RSRC_KIND_ROOT.
    system_mexec_payload_get(handle:RESOURCE resource) -> (status status, vector_void buffer);

    /// Rights: resource must have resource kind ZX_RSRC_KIND_ROOT.
    system_powerctl(handle:RESOURCE resource, uint32 cmd, SystemPowerctlArg arg)
        -> (status status);
};
