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

using zx;

/// Interface for the Goldfish address space driver.
type AddressSpaceChildDriverType = strict enum : uint32 {
    /// The `DEFAULT` child driver type is for graphics.
    DEFAULT = 0;
};

/// State
/// The driver consists of three main pieces of state:
///
/// 1. A PCI BAR that clients can suballocate into. This is used for mapping
/// coherent memory from the hardware, such as for Vulkan HOST_COHERENT
/// memory, or for any other buffer owned by the hardware such as video
/// codec buffers. This also includes a mapping where each connection of the
/// driver is associated with one or more mappings.
///
/// The next two pieces of state are for child driver connections.
///
/// 2. A set of context handles, one per driver connection that the client
/// establishes. This is used to support higher-level/VMM-defined (child)
/// drivers. Each such driver is considered a "child" driver of goldfish
/// address space.
///
/// 3. A set of command pages, one per connection. This is used as a shared
/// device/host memory to support the "Ping" command. The "Ping" command is used
/// to run the child driver logic, driven by the app. There is a protocol to
/// permanently associate a particular goldfish address space driver connection
/// with a particular type of child driver, discussed next.
@discoverable
protocol AddressSpaceDevice {
    OpenChildDriver(resource struct {
        type AddressSpaceChildDriverType;
        req server_end:AddressSpaceChildDriver;
    });
};

/// Child driver protocol
///
/// By default, creating connection to the driver does not associate any child
/// driver with the connection.
///
/// The client opens a child driver via OpenChildDriver, giving the type of the
/// driver as an argument along with a request for the connection.  The type of
/// the driver is a number and the number/drivertype mapping is
/// determined/maintained in:
/// https://android.googlesource.com/platform/external/qemu/+/refs/heads/emu-master-dev/android/android-emu/android/emulation/AddressSpaceService.h
///
/// In Fuchsia, we currently only support the DEFAULT type, which is used for
/// graphics.
///
/// After opening the child driver, the client and hardware communicate via a
/// child driver-specific protocol, with notifications driven by `Ping()`, each
/// of which writes and reads messages to the hardware that follow this
/// `AddressSpaceChildDriverPingMessage` struct.
/// Each child driver type will have its own semantics for each field.
/// It's common for child drivers to refer to offset/size plus a metadata field.
/// We also provide extra data fields for other use cases in particular child
/// drivers.
type AddressSpaceChildDriverPingMessage = struct {
    offset uint64;
    size uint64;
    metadata uint64;
    data0 uint64;
    data1 uint64;
    data2 uint32;
    data3 uint32;
};

protocol AddressSpaceChildDriver {
    /// Allocates goldfish address space of given size.
    AllocateBlock(struct {
        size uint64;
    }) -> (resource struct {
        res zx.status;
        paddr uint64;
        vmo zx.handle:<VMO, optional>;
    });
    /// Free goldfish address space associated with given ID.
    DeallocateBlock(struct {
        paddr uint64;
    }) -> (struct {
        res zx.status;
    });

    /// Claim a region at `[offset, offset + size)` that is a subregion of a
    /// larger region managed by hardware.  It is possible to share the same
    /// regions across different connections, but within a connection, we
    /// require the claimed regions to be disjoint. Otherwise,
    /// `ZX_ERROR_INVALID_ARGS1` is returned.
    ClaimSharedBlock(struct {
        offset uint64;
        size uint64;
    }) -> (resource struct {
        res zx.status;
        vmo zx.handle:<VMO, optional>;
    });

    /// Unclaim a hardware-shared region. This must correspond to an existing 
    /// claimed region in the current connection. Otherwise,
    /// `ZX_ERROR_INVALID_ARGS` is returned.
    UnclaimSharedBlock(struct {
        offset uint64;
    }) -> (struct {
        res zx.status;
    });

    /// Ping (General notification for child drivers)
    Ping(struct {
        ping AddressSpaceChildDriverPingMessage;
    }) -> (struct {
        res zx.status;
        ping AddressSpaceChildDriverPingMessage;
    });
};
