// 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.
@available(added=HEAD)
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;
};
