// Copyright 2022 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.driver.compat;

using zx;

type Metadata = resource struct {
    type uint32;
    data zx.Handle:VMO;
};

/// This API communicates with the DFv1 parent device.
closed protocol Device {
    /// Get this device's topological path that it is exporting in /dev.
    strict GetTopologicalPath() -> (struct {
        path string:MAX;
    });

    /// Get all of the metadata associated with this device.
    strict GetMetadata() -> (resource struct {
        metadata vector<Metadata>:MAX;
    }) error zx.Status;

    /// Connect to a banjo protocol that this device is exposing.
    /// The caller needs to send a copy of their process koid so the callee can verify
    /// that both drivers are in the same process.
    strict GetBanjoProtocol(struct {
        proto_id uint32;
        process_koid zx.Koid;
    }) -> (struct {
        ops uint64;
        context uint64;
    }) error zx.Status;
};

/// This represents a service that the compatibility driver will offer to
/// its children, so that DFv1 drivers can communicate with each other.
/// This is a service because a driver will create one instance per device
/// the driver creates. Each child of the driver gets a single instance of
/// this service.
service Service {
    device client_end:Device;
};
