189217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner/* Copyright (C) 2011 The Android Open Source Project
289217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner**
389217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner** This software is licensed under the terms of the GNU General Public
489217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner** License version 2, as published by the Free Software Foundation, and
589217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner** may be copied, distributed, and modified under those terms.
689217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner**
789217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner** This program is distributed in the hope that it will be useful,
889217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner** but WITHOUT ANY WARRANTY; without even the implied warranty of
989217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1089217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner** GNU General Public License for more details.
1189217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner*/
1289217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner#ifndef _HW_GOLDFISH_PIPE_H
1389217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner#define _HW_GOLDFISH_PIPE_H
1489217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner
1589217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner#include <stdint.h>
16d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#include "hw/hw.h"
1789217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner
18d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner/* TECHNICAL NOTE:
19d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *
20d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner * A goldfish pipe is a very fast communication channel between the guest
21d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner * system and the emulator program.
22d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *
23d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner * To open a new pipe to the emulator, a guest client will do the following:
24d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *
25d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *     fd = open("/dev/qemu_pipe", O_RDWR);
26d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *     char  invite[64];
27d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *     snprintf(invite, sizeof invite, "%s", pipeName);
28d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *     ret = write(fd, invite, strlen(invite));
29d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *
30d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *     if (ret < 0) {
31d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *         // something bad happened, see errno
32d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *     }
33d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *
34d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *     now read()/write() to communicate with <pipeName> service in the
35d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *     emulator.
36d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *
37d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner * This header provides the interface used by pipe services in the emulator
38d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner * to receive new client connection and deal with them.
39d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *
40d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *
41d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner * 1/ Call goldfish_pipe_add_type() to register a new pipe service by name.
42d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *    This must provide a pointer to a series of functions that will be called
43d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *    during normal pipe operations.
44d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *
45d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner * 2/ When a client connects to the service, the 'init' callback will be called
46d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *    to create a new service-specific client identifier (which must returned
47d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *    by the function).
48d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *
49d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner * 3/ Call goldfish_pipe_close() to force the closure of a given pipe.
50d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *
51d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner * 4/ Call goldfish_pipe_signal() to signal a change of state to the pipe.
52d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *
5389217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner */
5489217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner
5589217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner/* Buffer descriptor for sendBuffers() and recvBuffers() callbacks */
5689217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turnertypedef struct GoldfishPipeBuffer {
5789217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner    uint8_t*  data;
5889217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner    size_t    size;
5989217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner} GoldfishPipeBuffer;
6089217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner
6189217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner/* Pipe handler funcs */
6289217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turnertypedef struct {
63d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner    /* Create new client connection, 'hwpipe' must be passed to other
64d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner     * goldfish_pipe_xxx functions, while the returned value will be passed
65d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner     * to other callbacks (e.g. close). 'pipeOpaque' is the value passed
66d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner     * to goldfish_pipe_add_type() when registering a given pipe service.
67d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner     */
68d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner    void*        (*init)( void* hwpipe, void* pipeOpaque, const char* args );
69d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner
70d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner    /* Called when the guest kernel has finally closed a pipe connection.
71d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner     * This is the only place where you can release/free the client connection.
72d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner     * You should never invoke this callback directly. Call goldfish_pipe_close()
73d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner     * instead.
74d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner     */
75d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner    void         (*close)( void* pipe );
76d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner
77d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner    /* Called when the guest is write()-ing to the pipe. Should return the
78d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner     * number of bytes transfered, 0 for EOF status, or a negative error
79d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner     * value otherwise, including PIPE_ERROR_AGAIN to indicate that the
80d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner     * emulator is not ready to receive data yet.
81d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner     */
82d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner    int          (*sendBuffers)( void* pipe, const GoldfishPipeBuffer*  buffers, int numBuffers );
83d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner
84d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner    /* Same as sendBuffers when the guest is read()-ing from the pipe. */
85d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner    int          (*recvBuffers)( void* pipe, GoldfishPipeBuffer* buffers, int numBuffers );
86d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner
87d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner    /* Called when guest wants to poll the read/write status for the pipe.
88fd16505ce923202f0abe74bfe7c3ba110d325ebeVladimir Chtchetkine     * Should return a combination of PIPE_POLL_XXX flags.
89d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner     */
90d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner    unsigned     (*poll)( void* pipe );
91d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner
92d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner    /* Called to signal that the guest wants to be woken when the set of
93d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner     * PIPE_WAKE_XXX bit-flags in 'flags' occur. When the condition occurs,
94d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner     * then the pipe implementation shall call goldfish_pipe_wake().
95d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner     */
9689217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner    void         (*wakeOn)( void* opaque, int flags );
973e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner
983e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner    /* Called to save the pipe's state to a QEMUFile, i.e. when saving
993e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner     * snapshots. This can be NULL to indicate that no state can be saved.
1003e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner     * In this case, when the pipe is loaded, the emulator will automatically
1013e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner     * force-close so the next operation the guest performs on it will return
1023e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner     * a PIPE_ERROR_IO error code.
1033e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner     */
1043e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner    void         (*save)( void* pipe, QEMUFile* file );
1053e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner
1063e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner    /* Called to load the sate of a pipe from a QEMUFile. This will always
1073e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner     * correspond to the state of the pipe as saved by a previous call to
1083e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner     * the 'save' method. Can be NULL to indicate that the pipe state cannot
1093e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner     * be loaded. In this case, the emulator will automatically force-close
1103e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner     * it.
1113e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner     *
1123e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner     * In case of success, this returns 0, and the new pipe object is returned
1133e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner     * in '*ppipe'. In case of errno code is returned to indicate a failure.
1143e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner     * 'hwpipe' and 'pipeOpaque' are the same arguments than those passed
1153e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner     * to 'init'.
1163e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner     */
1173e92c2d49cb0e8752ce8c9a3c879c84ac3299061David 'Digit' Turner    void*        (*load)( void* hwpipe, void* pipeOpaque, const char* args, QEMUFile* file);
118d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner} GoldfishPipeFuncs;
11989217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner
12089217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner/* Register a new pipe handler type. 'pipeOpaque' is passed directly
12189217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner * to 'init() when a new pipe is connected to.
12289217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner */
123d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turnerextern void  goldfish_pipe_add_type(const char*               pipeName,
124d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner                                     void*                     pipeOpaque,
125d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner                                     const GoldfishPipeFuncs*  pipeFuncs );
126d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner
127d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner/* This tells the guest system that we want to close the pipe and that
128d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner * further attempts to read or write to it will fail. This will not
129d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner * necessarily call the 'close' callback immediately though.
130d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *
131d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner * This will also wake-up any blocked guest threads waiting for i/o.
132d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner */
133d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turnerextern void goldfish_pipe_close( void* hwpipe );
134d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner
135d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner/* Signal that the pipe can be woken up. 'flags' must be a combination of
136d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner * PIPE_WAKE_READ and PIPE_WAKE_WRITE.
137d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner */
138d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turnerextern void goldfish_pipe_wake( void* hwpipe, unsigned flags );
139d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner
140d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner/* The following definitions must match those under:
141d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *
142d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *    $KERNEL/drivers/misc/qemupipe/qemu_pipe.c
143d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *
144d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner * Where $KERNEL points to the android-goldfish-2.6.xx branch on:
145d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *
146d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner *     android.git.kernel.org/kernel/qemu.git.
147d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner */
148d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner
149d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner/* pipe device registers */
150d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_REG_COMMAND            0x00  /* write: value = command */
151d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_REG_STATUS             0x04  /* read */
152d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_REG_CHANNEL            0x08  /* read/write: channel id */
153d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_REG_SIZE               0x0c  /* read/write: buffer size */
154d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_REG_ADDRESS            0x10  /* write: physical address */
155d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_REG_WAKES              0x14  /* read: wake flags */
156e8bca780fc70318f38cab5bc38e5abdee60375daJiang, Yunhong/* read/write: parameter buffer address */
157e8bca780fc70318f38cab5bc38e5abdee60375daJiang, Yunhong#define PIPE_REG_PARAMS_ADDR_LOW     0x18
158e8bca780fc70318f38cab5bc38e5abdee60375daJiang, Yunhong#define PIPE_REG_PARAMS_ADDR_HIGH    0x1c
159e8bca780fc70318f38cab5bc38e5abdee60375daJiang, Yunhong/* write: access with paremeter buffer */
160e8bca780fc70318f38cab5bc38e5abdee60375daJiang, Yunhong#define PIPE_REG_ACCESS_PARAMS       0x20
161d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner
162d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner/* list of commands for PIPE_REG_COMMAND */
163d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_CMD_OPEN               1  /* open new channel */
164d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_CMD_CLOSE              2  /* close channel (from guest) */
165d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_CMD_POLL               3  /* poll read/write status */
166d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner
167d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner/* List of bitflags returned in status of CMD_POLL command */
168d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_POLL_IN   (1 << 0)
169d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_POLL_OUT  (1 << 1)
170d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_POLL_HUP  (1 << 2)
171d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner
172d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner/* The following commands are related to write operations */
173d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_CMD_WRITE_BUFFER       4  /* send a user buffer to the emulator */
174d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_CMD_WAKE_ON_WRITE      5  /* tell the emulator to wake us when writing is possible */
175d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner
176d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner/* The following commands are related to read operations, they must be
177d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner * listed in the same order than the corresponding write ones, since we
178d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner * will use (CMD_READ_BUFFER - CMD_WRITE_BUFFER) as a special offset
179d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner * in qemu_pipe_read_write() below.
180d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner */
181d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_CMD_READ_BUFFER        6  /* receive a page-contained buffer from the emulator */
182d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_CMD_WAKE_ON_READ       7  /* tell the emulator to wake us when reading is possible */
183d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner
184d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner/* Possible status values used to signal errors - see qemu_pipe_error_convert */
185d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_ERROR_INVAL       -1
186d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_ERROR_AGAIN       -2
187d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_ERROR_NOMEM       -3
188d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_ERROR_IO          -4
189d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner
190d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner/* Bit-flags used to signal events from the emulator */
191d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_WAKE_CLOSED       (1 << 0)  /* emulator closed pipe */
192d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_WAKE_READ         (1 << 1)  /* pipe can now be read from */
193d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner#define PIPE_WAKE_WRITE        (1 << 2)  /* pipe can now be written to */
194d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turner
195d4d688e926097faba7fd3717d1c0d3f296bdb526David 'Digit' Turnervoid pipe_dev_init(void);
19689217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner
197e8bca780fc70318f38cab5bc38e5abdee60375daJiang, Yunhongstruct access_params{
198e8bca780fc70318f38cab5bc38e5abdee60375daJiang, Yunhong    uint32_t channel;
199e8bca780fc70318f38cab5bc38e5abdee60375daJiang, Yunhong    uint32_t size;
200e8bca780fc70318f38cab5bc38e5abdee60375daJiang, Yunhong    uint32_t address;
201e8bca780fc70318f38cab5bc38e5abdee60375daJiang, Yunhong    uint32_t cmd;
202e8bca780fc70318f38cab5bc38e5abdee60375daJiang, Yunhong    uint32_t result;
203e8bca780fc70318f38cab5bc38e5abdee60375daJiang, Yunhong    /* reserved for future extension */
204e8bca780fc70318f38cab5bc38e5abdee60375daJiang, Yunhong    uint32_t flags;
205e8bca780fc70318f38cab5bc38e5abdee60375daJiang, Yunhong};
206e8bca780fc70318f38cab5bc38e5abdee60375daJiang, Yunhong
20789217f57a256796b67b4d3f319e0f18f6225666aDavid 'Digit' Turner#endif /* _HW_GOLDFISH_PIPE_H */
208