// Copyright 2018 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.sysmem;

using zx;

// Once a channel with this interface is established to a driver (typically in
// advance), this interface allows asynchronously sending the server end of an
// Allocator channel which will be served by the driver.
//
// For now, the only FIDL interface directly served via normal devhost FIDL
// dispatching code by the sysmem driver is this interface.  Other sysmem
// interfaces are served by separate dispatching code primarily because we want
// to be able to establish channels async by sending the server channel toward
// the driver without needing a round-trip open and without managing the channel
// as a file descriptor.
//
// A secondary current reason tracked by ZX-3091 is that the current devhost
// dispatching code doesn't permit async processing of requests, which we want
// for proper functionining of at least the BufferCollection interface since
// that interface has requests that don't complete until the devhost has
// constraints from other participants.
//
// Needs Layout = "Simple" because used with "FIDL Simple C Bindings".
[Discoverable, Layout = "Simple"]
protocol DriverConnector {
    // This one-way message sends in the server end of an Allocator channel.
    //
    // |allocator_request| will be served by the sysmem driver (or the channel
    // will close).
    Connect(request<Allocator> allocator_request);

    // Get information about the physical layout of protected memory, for use by sysmem-assistant.
    // TODO(MTWN-231): Connect directly between sysmem and the TEE driver and remove this.
    GetProtectedMemoryInfo() -> (zx.status status, uint64 base_address, uint64 size);
};
