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