// 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.hardware.goldfish.pipe;

using zx;

/// Codes for supported pipe commands.
type PipeCmdCode = strict enum : int32 {
    OPEN = 1;
    CLOSE = 2;
    POLL = 3;
    WRITE = 4;
    WAKE_ON_WRITE = 5;
    READ = 6;
    WAKE_ON_READ = 7;
    CALL = 11;
};

/// Pipe device wake flags.
type PipeWakeFlag = strict enum : int32 {
    CLOSED = 1;
    READ = 2;
    WRITE = 4;
};

/// Pipe command errors. 0 is success.
type PipeError = strict enum : int32 {
    INVAL = -1;
    AGAIN = -2;
    NOMEM = -3;
    IO = -4;
};

/// This interface can be used to establish a goldfish pipe connection. The
/// client is responsible for managing the command structure associated with
/// the pipe and should issue a 'close' command before destroying a previously
/// opened pipe. Failure to do so may result in host side resources that are
/// not cleaned up properly.
@discoverable
protocol GoldfishPipe {
    /// Create a new pipe connection. The |id| identifies the pipe and must be
    /// used for all subsequent commands. The memory that will be used as
    /// command structure is returned in |vmo|.
    Create() -> (resource struct {
        id int32;
        vmo zx.handle:VMO;
    }) error zx.status;

    /// Destroy a previously created pipe connection.
    Destroy(struct {
        id int32;
    }) -> ();

    /// Set event used to signal device state. Discards existing event
    /// after having transferred device state to the new event, if event
    /// exists.
    ///
    /// Return error states from `zx_object_wait_one` and `zx_object_signal`
    /// if existing events on `pipe_event` cannot be transferred to the call.
    /// Otherwise returns `ZX_OK`.
    SetEvent(resource struct {
        id int32;
        pipe_event zx.handle:EVENT;
    }) -> (struct {}) error zx.status;

    /// Open pipe connection. This must be called before any other
    /// commands are issued and will cause the physical address of the
    /// command structure to be a associated with the pipe. The command
    /// structure must contain {.cmd = OPEN, .id = id} at the time this
    /// request is issued.
    Open(struct {
        id int32;
    }) -> ();

    /// Execute pipe command stored in associated command structure.
    Exec(struct {
        id int32;
    }) -> ();

    /// Get BTI that can be used create IO buffers for read/write commands.
    GetBti() -> (resource struct {
        bti zx.handle:BTI;
    }) error zx.status;

    /// Create a sysmem connection - used to implement fuchsia.hardware.sysmem.
    ConnectSysmem(resource struct {
        connection zx.handle:CHANNEL;
    }) -> (struct {}) error zx.status;

    /// Register a sysmem heap.
    RegisterSysmemHeap(resource struct {
        heap uint64;
        connection zx.handle:CHANNEL;
    }) -> (struct {}) error zx.status;
};
