]> bbs.cooldavid.org Git - net-next-2.6.git/blob - drivers/staging/dream/smd/smd_rpcrouter.h
86ab997b1b79dec274970cdc7ba317a693b881d1
[net-next-2.6.git] / drivers / staging / dream / smd / smd_rpcrouter.h
1 /** arch/arm/mach-msm/smd_rpcrouter.h
2  *
3  * Copyright (C) 2007 Google, Inc.
4  * Copyright (c) 2007-2008 QUALCOMM Incorporated.
5  * Author: San Mehat <san@android.com>
6  *
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.
10  *
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.
15  *
16  */
17
18 #ifndef _ARCH_ARM_MACH_MSM_SMD_RPCROUTER_H
19 #define _ARCH_ARM_MACH_MSM_SMD_RPCROUTER_H
20
21 #include <linux/types.h>
22 #include <linux/list.h>
23 #include <linux/cdev.h>
24 #include <linux/platform_device.h>
25
26 #include <mach/msm_smd.h>
27 #include <mach/msm_rpcrouter.h>
28
29 /* definitions for the R2R wire protcol */
30
31 #define RPCROUTER_VERSION                       1
32 #define RPCROUTER_PROCESSORS_MAX                4
33 #define RPCROUTER_MSGSIZE_MAX                   512
34
35 #define RPCROUTER_CLIENT_BCAST_ID               0xffffffff
36 #define RPCROUTER_ROUTER_ADDRESS                0xfffffffe
37
38 #define RPCROUTER_PID_LOCAL                     1
39 #define RPCROUTER_PID_REMOTE                    0
40
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
49
50 #define RPCROUTER_DEFAULT_RX_QUOTA      5
51
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;
66 };
67
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;
77 };
78
79 /* internals */
80
81 #define RPCROUTER_MAX_REMOTE_SERVERS            100
82
83 struct rr_fragment {
84         unsigned char data[RPCROUTER_MSGSIZE_MAX];
85         uint32_t length;
86         struct rr_fragment *next;
87 };
88
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;
96 };
97
98 #define PACMARK_LAST(n) ((n) & 0x80000000)
99 #define PACMARK_MID(n)  (((n) >> 16) & 0xFF)
100 #define PACMARK_LEN(n)  ((n) & 0xFFFF)
101
102 static inline uint32_t PACMARK(uint32_t len, uint32_t mid, uint32_t first,
103                                uint32_t last)
104 {
105         return (len & 0xFFFF) |
106           ((mid & 0xFF) << 16) |
107           ((!!first) << 30) |
108           ((!!last) << 31);
109 }
110
111 struct rr_server {
112         struct list_head list;
113
114         uint32_t pid;
115         uint32_t cid;
116         uint32_t prog;
117         uint32_t vers;
118
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];
124 };
125
126 struct rr_remote_endpoint {
127         uint32_t pid;
128         uint32_t cid;
129
130         int tx_quota_cntr;
131         spinlock_t quota_lock;
132         wait_queue_head_t quota_wait;
133
134         struct list_head list;
135 };
136
137 struct msm_rpc_endpoint {
138         struct list_head list;
139
140         /* incomplete packets waiting for assembly */
141         struct list_head incomplete;
142
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;
148
149         /* endpoint address */
150         uint32_t pid;
151         uint32_t cid;
152
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
156          */
157         uint32_t dst_pid;
158         uint32_t dst_cid;
159         uint32_t dst_prog; /* be32 */
160         uint32_t dst_vers; /* be32 */
161
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.
166          */
167         uint32_t reply_pid;
168         uint32_t reply_cid;
169         uint32_t reply_xid; /* be32 */
170         uint32_t next_pm;   /* Pacmark sequence */
171
172         /* device node if this endpoint is accessed via userspace */
173         dev_t dev;
174 };
175
176 /* shared between smd_rpcrouter*.c */
177
178 int __msm_rpc_read(struct msm_rpc_endpoint *ept,
179                    struct rr_fragment **frag,
180                    unsigned len, long timeout);
181
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);
184
185 int msm_rpcrouter_create_server_cdev(struct rr_server *server);
186 int msm_rpcrouter_create_server_pdev(struct rr_server *server);
187
188 int msm_rpcrouter_init_devices(void);
189 void msm_rpcrouter_exit_devices(void);
190
191 extern dev_t msm_rpcrouter_devno;
192 extern struct class *msm_rpcrouter_class;
193 #endif