| // Copyright 2021 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.sharedmemory; |
| using fuchsia.mem; |
| |
| using zx; |
| |
| type SharedVmoRight = flexible bits : uint32 { |
| /// The protocol implementation can read from this VMO (used for transmit requests). |
| READ = 0x1; |
| /// The protocol implementation can write to this VMO (used for receive requests). |
| WRITE = 0x2; |
| }; |
| |
| type SharedVmoBuffer = struct { |
| vmo_id uint32; |
| offset uint64; |
| size uint64; |
| }; |
| |
| /// This is a generic protocol for sharing VMOs that drivers may compose. |
| protocol SharedVmoRegister { |
| /// Registers a VMO and transfers ownership to the driver. |
| /// vmo_id: The ID chosen by the client that will be used in operations on this VMO. |
| /// vmo: The handle, offset, and size of this VMO. IO operations on this VMO will be relative to |
| /// the offset and size specified here. |
| /// rights: A bit field of SharedVmoRight values indicating how this VMO may be used. Callers |
| /// should assume that the driver will map and/or pin the VMO using these rights. |
| RegisterVmo(resource struct { |
| vmo_id uint32; |
| vmo fuchsia.mem.Range; |
| rights SharedVmoRight; |
| }) -> (struct {}) error zx.status; |
| |
| /// Unmaps and/or unpins the VMO and returns the handle to the caller. |
| UnregisterVmo(struct { |
| vmo_id uint32; |
| }) -> (resource struct { |
| vmo zx.handle:VMO; |
| }) error zx.status; |
| }; |
| |
| /// This is a generic protocol for driver IO using shared VMOs. Drivers may compose this protocol |
| /// and choose which methods to implement based on the uses of the hardware. This protocol is only |
| /// intended for simple use cases. |
| protocol SharedVmoIo { |
| /// Sends the data in buffer to the device. |
| Transmit(struct { |
| buffer SharedVmoBuffer; |
| }) -> (struct {}) error zx.status; |
| |
| /// Receives data from the device into buffer. |
| Receive(struct { |
| buffer SharedVmoBuffer; |
| }) -> (struct {}) error zx.status; |
| |
| /// Simultaneously transmits and receives data. The size fields of tx_buffer and rx_buffer must |
| /// be the same. |
| Exchange(struct { |
| tx_buffer SharedVmoBuffer; |
| rx_buffer SharedVmoBuffer; |
| }) -> (struct {}) error zx.status; |
| }; |