Merge branch 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6/linux-2.6-openrd.git] / drivers / staging / dream / smd / smd_rpcrouter.h
blob86ab997b1b79dec274970cdc7ba317a693b881d1
1 /** arch/arm/mach-msm/smd_rpcrouter.h
3 * Copyright (C) 2007 Google, Inc.
4 * Copyright (c) 2007-2008 QUALCOMM Incorporated.
5 * Author: San Mehat <san@android.com>
7 * This software is licensed under the terms of the GNU General Public
8 * License version 2, as published by the Free Software Foundation, and
9 * may be copied, distributed, and modified under those terms.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
18 #ifndef _ARCH_ARM_MACH_MSM_SMD_RPCROUTER_H
19 #define _ARCH_ARM_MACH_MSM_SMD_RPCROUTER_H
21 #include <linux/types.h>
22 #include <linux/list.h>
23 #include <linux/cdev.h>
24 #include <linux/platform_device.h>
26 #include <mach/msm_smd.h>
27 #include <mach/msm_rpcrouter.h>
29 /* definitions for the R2R wire protcol */
31 #define RPCROUTER_VERSION 1
32 #define RPCROUTER_PROCESSORS_MAX 4
33 #define RPCROUTER_MSGSIZE_MAX 512
35 #define RPCROUTER_CLIENT_BCAST_ID 0xffffffff
36 #define RPCROUTER_ROUTER_ADDRESS 0xfffffffe
38 #define RPCROUTER_PID_LOCAL 1
39 #define RPCROUTER_PID_REMOTE 0
41 #define RPCROUTER_CTRL_CMD_DATA 1
42 #define RPCROUTER_CTRL_CMD_HELLO 2
43 #define RPCROUTER_CTRL_CMD_BYE 3
44 #define RPCROUTER_CTRL_CMD_NEW_SERVER 4
45 #define RPCROUTER_CTRL_CMD_REMOVE_SERVER 5
46 #define RPCROUTER_CTRL_CMD_REMOVE_CLIENT 6
47 #define RPCROUTER_CTRL_CMD_RESUME_TX 7
48 #define RPCROUTER_CTRL_CMD_EXIT 8
50 #define RPCROUTER_DEFAULT_RX_QUOTA 5
52 union rr_control_msg {
53 uint32_t cmd;
54 struct {
55 uint32_t cmd;
56 uint32_t prog;
57 uint32_t vers;
58 uint32_t pid;
59 uint32_t cid;
60 } srv;
61 struct {
62 uint32_t cmd;
63 uint32_t pid;
64 uint32_t cid;
65 } cli;
68 struct rr_header {
69 uint32_t version;
70 uint32_t type;
71 uint32_t src_pid;
72 uint32_t src_cid;
73 uint32_t confirm_rx;
74 uint32_t size;
75 uint32_t dst_pid;
76 uint32_t dst_cid;
79 /* internals */
81 #define RPCROUTER_MAX_REMOTE_SERVERS 100
83 struct rr_fragment {
84 unsigned char data[RPCROUTER_MSGSIZE_MAX];
85 uint32_t length;
86 struct rr_fragment *next;
89 struct rr_packet {
90 struct list_head list;
91 struct rr_fragment *first;
92 struct rr_fragment *last;
93 struct rr_header hdr;
94 uint32_t mid;
95 uint32_t length;
98 #define PACMARK_LAST(n) ((n) & 0x80000000)
99 #define PACMARK_MID(n) (((n) >> 16) & 0xFF)
100 #define PACMARK_LEN(n) ((n) & 0xFFFF)
102 static inline uint32_t PACMARK(uint32_t len, uint32_t mid, uint32_t first,
103 uint32_t last)
105 return (len & 0xFFFF) |
106 ((mid & 0xFF) << 16) |
107 ((!!first) << 30) |
108 ((!!last) << 31);
111 struct rr_server {
112 struct list_head list;
114 uint32_t pid;
115 uint32_t cid;
116 uint32_t prog;
117 uint32_t vers;
119 dev_t device_number;
120 struct cdev cdev;
121 struct device *device;
122 struct rpcsvr_platform_device p_device;
123 char pdev_name[32];
126 struct rr_remote_endpoint {
127 uint32_t pid;
128 uint32_t cid;
130 int tx_quota_cntr;
131 spinlock_t quota_lock;
132 wait_queue_head_t quota_wait;
134 struct list_head list;
137 struct msm_rpc_endpoint {
138 struct list_head list;
140 /* incomplete packets waiting for assembly */
141 struct list_head incomplete;
143 /* complete packets waiting to be read */
144 struct list_head read_q;
145 spinlock_t read_q_lock;
146 wait_queue_head_t wait_q;
147 unsigned flags;
149 /* endpoint address */
150 uint32_t pid;
151 uint32_t cid;
153 /* bound remote address
154 * if not connected (dst_pid == 0xffffffff) RPC_CALL writes fail
155 * RPC_CALLs must be to the prog/vers below or they will fail
157 uint32_t dst_pid;
158 uint32_t dst_cid;
159 uint32_t dst_prog; /* be32 */
160 uint32_t dst_vers; /* be32 */
162 /* reply remote address
163 * if reply_pid == 0xffffffff, none available
164 * RPC_REPLY writes may only go to the pid/cid/xid of the
165 * last RPC_CALL we received.
167 uint32_t reply_pid;
168 uint32_t reply_cid;
169 uint32_t reply_xid; /* be32 */
170 uint32_t next_pm; /* Pacmark sequence */
172 /* device node if this endpoint is accessed via userspace */
173 dev_t dev;
176 /* shared between smd_rpcrouter*.c */
178 int __msm_rpc_read(struct msm_rpc_endpoint *ept,
179 struct rr_fragment **frag,
180 unsigned len, long timeout);
182 struct msm_rpc_endpoint *msm_rpcrouter_create_local_endpoint(dev_t dev);
183 int msm_rpcrouter_destroy_local_endpoint(struct msm_rpc_endpoint *ept);
185 int msm_rpcrouter_create_server_cdev(struct rr_server *server);
186 int msm_rpcrouter_create_server_pdev(struct rr_server *server);
188 int msm_rpcrouter_init_devices(void);
189 void msm_rpcrouter_exit_devices(void);
191 extern dev_t msm_rpcrouter_devno;
192 extern struct class *msm_rpcrouter_class;
193 #endif