// Copyright 2023 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.spiimpl;

using fuchsia.hardware.sharedmemory;
using fuchsia.mem;
using zx;

/// Low-level protocol for spi drivers.
@discoverable
@transport("Driver")
closed protocol SpiImpl {
    /// Returns the number of chip select lines available or provided by the driver instance.
    /// To be used as a limit on the acceptable values for the `chip_select' field in the Exchange()
    /// and ExchangeVmo() methods.
    strict GetChipSelectCount() -> (struct {
        count uint32;
    });

    /// Half-duplex transmit data to a SPI device; always transmits the entire buffer on success.
    strict TransmitVector(struct {
        chip_select uint32;
        data vector<uint8>:MAX;
    }) -> () error zx.Status;

    /// Half-duplex receive data from a SPI device; always reads the full size requested.
    strict ReceiveVector(struct {
        chip_select uint32;
        size uint32;
    }) -> (struct {
        data vector<uint8>:MAX;
    }) error zx.Status;

    /// Full-duplex SPI transaction. Received data will exactly equal the length of the transmit
    /// buffer.
    strict ExchangeVector(struct {
        chip_select uint32;
        txdata vector<uint8>:MAX;
    }) -> (struct {
        rxdata vector<uint8>:MAX;
    }) error zx.Status;

    /// Lock the bus.
    strict LockBus(struct {
        chip_select uint32;
    }) -> () error zx.Status;

    /// Unlock the bus.
    strict UnlockBus(struct {
        chip_select uint32;
    }) -> () error zx.Status;

    /// rights is a bit field containing SpiVmoRight values, and determines the read/write
    /// permissions used by the implementation when pinning or mapping the VMO.
    strict RegisterVmo(resource struct {
        chip_select uint32;
        vmo_id uint32;
        vmo fuchsia.mem.Range;
        rights fuchsia.hardware.sharedmemory.SharedVmoRight;
    }) -> () error zx.Status;

    strict UnregisterVmo(struct {
        chip_select uint32;
        vmo_id uint32;
    }) -> (resource struct {
        vmo zx.Handle:VMO;
    }) error zx.Status;

    /// Release all VMOs registered to this chip_select. Called by the core driver after the client
    /// has disconnected and the VMOs are no longer needed.
    strict ReleaseRegisteredVmos(struct {
        chip_select uint32;
    });

    strict TransmitVmo(struct {
        chip_select uint32;
        buffer fuchsia.hardware.sharedmemory.SharedVmoBuffer;
    }) -> () error zx.Status;

    strict ReceiveVmo(struct {
        chip_select uint32;
        buffer fuchsia.hardware.sharedmemory.SharedVmoBuffer;
    }) -> () error zx.Status;

    strict ExchangeVmo(struct {
        chip_select uint32;
        tx_buffer fuchsia.hardware.sharedmemory.SharedVmoBuffer;
        rx_buffer fuchsia.hardware.sharedmemory.SharedVmoBuffer;
    }) -> () error zx.Status;
};

service Service {
    device client_end:SpiImpl;
};
