| // Copyright 2019 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.goldfish; |
| |
| using zx; |
| |
| /// Signal that will be active on event handle if the Read() method |
| /// will return data. |
| const SIGNAL_READABLE uint32 = 0x01000000; // ZX_USER_SIGNAL_0 |
| |
| /// Signal that will be active on event handle if the Write() method |
| /// will accept data. |
| const SIGNAL_WRITABLE uint32 = 0x02000000; // ZX_USER_SIGNAL_1 |
| |
| /// Signal that will be active on event handle if the device has been |
| /// disconnected. |
| const SIGNAL_HANGUP uint32 = 0x04000000; // ZX_USER_SIGNAL_2 |
| |
| /// Interface for the Goldfish pipe driver. |
| protocol PipeDevice { |
| /// Open pipe. A protocol request `pipe_request` provides an interface |
| /// to the pipe. Multiple pipes can be opened for a single device. |
| /// Closing the device connection will also close all pipe connections. |
| /// TODO(fxbug.dev/6547): Unify `device` and `pipe`. |
| OpenPipe(resource struct { |
| pipe_request server_end:Pipe; |
| }); |
| }; |
| |
| protocol Pipe { |
| /// Request new IO buffer size. Can fail if out of memory. Discards |
| /// contents of existing buffer on success. Leaves existing buffer |
| /// intact on failure. |
| SetBufferSize(struct { |
| size uint64; |
| }) -> (struct { |
| res zx.status; |
| }); |
| |
| /// Set event used to signal device state. Discards existing event |
| /// after having transferred device state to the new event. |
| SetEvent(resource struct { |
| event zx.handle:EVENT; |
| }); |
| |
| /// Acquire VMO for IO buffer. Can be called multiple times. Each call |
| /// returns a new handle to the VMO. |
| GetBuffer() -> (resource struct { |
| res zx.status; |
| vmo zx.handle:<VMO, optional>; |
| }); |
| |
| /// Attempt to read up to count bytes into IO buffer at specified offset. |
| /// Returns `ZX_ERR_SHOULD_WAIT` if pipe device is not readable. |
| Read(struct { |
| count uint64; |
| offset uint64; |
| }) -> (struct { |
| res zx.status; |
| actual uint64; |
| }); |
| |
| /// Writes up to count bytes from the IO buffer at specified offset. |
| /// Returns `ZX_ERR_SHOULD_WAIT` if pipe device is not writable. |
| Write(struct { |
| count uint64; |
| offset uint64; |
| }) -> (struct { |
| res zx.status; |
| actual uint64; |
| }); |
| |
| /// Writes `count` bytes from the IO buffer at specified write |
| /// `offset`. Returns `ZX_ERR_SHOULD_WAIT` if pipe device is not writable. |
| /// |
| /// If it writes to device successfully, it subsequently reads `read_count` |
| /// bytes into the IO buffer at specified `read_offset`. Returns |
| /// `ZX_ERR_SHOULD_WAIT` if pipe device is not readable. |
| /// |
| /// Return value `actual` is the total bytes read from and written to |
| /// the IO buffer. |
| /// |
| /// The name "DoCall" (instead of "Call") is to avoid collision with LLCPP |
| /// generated code "class Call" (generated per protocol). We don't want |
| /// this method attempting to compile as if it were a constructor. |
| DoCall(struct { |
| count uint64; |
| offset uint64; |
| read_count uint64; |
| read_offset uint64; |
| }) -> (struct { |
| res zx.status; |
| actual uint64; |
| }); |
| }; |