// 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.
@available(added=HEAD)
library fuchsia.hardware.fastboot;

using zx;

/// USB Fastboot implementation protocol. Fastboot is a single-channel and fully synchronous
/// protocol for communication between host and device.
closed protocol FastbootImpl {
    /// Sends fastboot data via USB fastboot device.
    ///
    /// This FIDL protocol blocks until all USB requests needed to send the data are completed. It
    /// can only serve one request at a time.
    ///
    /// Returns ZX_ERR_UNAVAILABLE if another call is made while a previous one is being processed,
    /// or the FIDL is called too early during boot when the driver has not become ready.
    strict Send(resource struct {
        data zx.Handle:VMO;
    }) -> () error zx.Status;

    /// Receives at least `requested` bytes of data from the USB fastboot device.
    ///
    /// Upon success, a vmo is allocated and returned by the driver which contains the data and the
    /// actual received data size (via vmo::get_prop_content_size()). Because USB transmission is
    /// in the unit of packet (512bytes), the actual received size can be at most 512 bytes more
    /// than the requested size.
    ///
    /// If `requested` is 0, the driver returns as soon as a USB packet with data is received. This
    /// should be the value used when expecting fastboot command which is guaranteed to be within a
    /// single USB packet (a fastboot command is no more than 64 bytes as per protocol). When
    /// expecting larger amount of data during image download, it should be set to a larger value
    /// to avoid the overhead of calling this FIDL too many times, as it can be very expensive
    /// comparing to actual data transfer.
    ///
    /// This FIDL protocol is blocking and can only serve one request at a time (Send() is not
    /// affected. Receive() and Send() are individually synchronous).
    ///
    /// Returns ZX_ERR_UNAVAILABLE if another call is made while a previous one is being processed,
    /// or the FIDL is called too early during boot when the driver has not become ready.
    strict Receive(struct {
        requested uint64;
    }) -> (resource struct {
        data zx.Handle:VMO;
    }) error zx.Status;
};

// Added to allow service connection to replace devfs
service Service {
    fastboot client_end:FastbootImpl;
};
