1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef _AP_BUS_H_
14#define _AP_BUS_H_
15
16#include <linux/device.h>
17#include <linux/types.h>
18#include <linux/hashtable.h>
19#include <asm/isc.h>
20#include <asm/ap.h>
21
22#define AP_DEVICES 256
23#define AP_DOMAINS 256
24#define AP_IOCTLS 256
25#define AP_RESET_TIMEOUT (HZ*0.7)
26#define AP_CONFIG_TIME 30
27#define AP_POLL_TIME 1
28#define AP_DEFAULT_MAX_MSG_SIZE (12 * 1024)
29#define AP_TAPQ_ML_FIELD_CHUNK_SIZE (4096)
30
31extern int ap_domain_index;
32extern atomic_t ap_max_msg_size;
33
34extern DECLARE_HASHTABLE(ap_queues, 8);
35extern spinlock_t ap_queues_lock;
36
37static inline int ap_test_bit(unsigned int *ptr, unsigned int nr)
38{
39 return (*ptr & (0x80000000u >> nr)) != 0;
40}
41
42#define AP_RESPONSE_NORMAL 0x00
43#define AP_RESPONSE_Q_NOT_AVAIL 0x01
44#define AP_RESPONSE_RESET_IN_PROGRESS 0x02
45#define AP_RESPONSE_DECONFIGURED 0x03
46#define AP_RESPONSE_CHECKSTOPPED 0x04
47#define AP_RESPONSE_BUSY 0x05
48#define AP_RESPONSE_INVALID_ADDRESS 0x06
49#define AP_RESPONSE_OTHERWISE_CHANGED 0x07
50#define AP_RESPONSE_Q_FULL 0x10
51#define AP_RESPONSE_NO_PENDING_REPLY 0x10
52#define AP_RESPONSE_INDEX_TOO_BIG 0x11
53#define AP_RESPONSE_NO_FIRST_PART 0x13
54#define AP_RESPONSE_MESSAGE_TOO_BIG 0x15
55#define AP_RESPONSE_REQ_FAC_NOT_INST 0x16
56#define AP_RESPONSE_INVALID_DOMAIN 0x42
57
58
59
60
61#define AP_DEVICE_TYPE_PCICC 3
62#define AP_DEVICE_TYPE_PCICA 4
63#define AP_DEVICE_TYPE_PCIXCC 5
64#define AP_DEVICE_TYPE_CEX2A 6
65#define AP_DEVICE_TYPE_CEX2C 7
66#define AP_DEVICE_TYPE_CEX3A 8
67#define AP_DEVICE_TYPE_CEX3C 9
68#define AP_DEVICE_TYPE_CEX4 10
69#define AP_DEVICE_TYPE_CEX5 11
70#define AP_DEVICE_TYPE_CEX6 12
71#define AP_DEVICE_TYPE_CEX7 13
72
73
74
75
76#define AP_FUNC_MEX4K 1
77#define AP_FUNC_CRT4K 2
78#define AP_FUNC_COPRO 3
79#define AP_FUNC_ACCEL 4
80#define AP_FUNC_EP11 5
81#define AP_FUNC_APXA 6
82
83
84
85
86#define AP_INTR_DISABLED 0
87#define AP_INTR_ENABLED 1
88
89
90
91
92enum ap_sm_state {
93 AP_SM_STATE_RESET_START = 0,
94 AP_SM_STATE_RESET_WAIT,
95 AP_SM_STATE_SETIRQ_WAIT,
96 AP_SM_STATE_IDLE,
97 AP_SM_STATE_WORKING,
98 AP_SM_STATE_QUEUE_FULL,
99 NR_AP_SM_STATES
100};
101
102
103
104
105enum ap_sm_event {
106 AP_SM_EVENT_POLL,
107 AP_SM_EVENT_TIMEOUT,
108 NR_AP_SM_EVENTS
109};
110
111
112
113
114enum ap_sm_wait {
115 AP_SM_WAIT_AGAIN,
116 AP_SM_WAIT_TIMEOUT,
117 AP_SM_WAIT_INTERRUPT,
118 AP_SM_WAIT_NONE,
119 NR_AP_SM_WAIT
120};
121
122
123
124
125enum ap_dev_state {
126 AP_DEV_STATE_UNINITIATED = 0,
127 AP_DEV_STATE_OPERATING,
128 AP_DEV_STATE_SHUTDOWN,
129 AP_DEV_STATE_ERROR,
130 NR_AP_DEV_STATES
131};
132
133struct ap_device;
134struct ap_message;
135
136
137
138
139
140
141
142#define AP_DRIVER_FLAG_DEFAULT 0x0001
143
144struct ap_driver {
145 struct device_driver driver;
146 struct ap_device_id *ids;
147 unsigned int flags;
148
149 int (*probe)(struct ap_device *);
150 void (*remove)(struct ap_device *);
151};
152
153#define to_ap_drv(x) container_of((x), struct ap_driver, driver)
154
155int ap_driver_register(struct ap_driver *, struct module *, char *);
156void ap_driver_unregister(struct ap_driver *);
157
158struct ap_device {
159 struct device device;
160 struct ap_driver *drv;
161 int device_type;
162};
163
164#define to_ap_dev(x) container_of((x), struct ap_device, device)
165
166struct ap_card {
167 struct ap_device ap_dev;
168 void *private;
169 int raw_hwtype;
170 unsigned int functions;
171 int queue_depth;
172 int id;
173 unsigned int maxmsgsize;
174 bool config;
175 atomic64_t total_request_count;
176};
177
178#define to_ap_card(x) container_of((x), struct ap_card, ap_dev.device)
179
180struct ap_queue {
181 struct ap_device ap_dev;
182 struct hlist_node hnode;
183 struct ap_card *card;
184 spinlock_t lock;
185 void *private;
186 enum ap_dev_state dev_state;
187 bool config;
188 ap_qid_t qid;
189 int interrupt;
190 int queue_count;
191 int pendingq_count;
192 int requestq_count;
193 u64 total_request_count;
194 int request_timeout;
195 struct timer_list timeout;
196 struct list_head pendingq;
197 struct list_head requestq;
198 struct ap_message *reply;
199 enum ap_sm_state sm_state;
200 int last_err_rc;
201};
202
203#define to_ap_queue(x) container_of((x), struct ap_queue, ap_dev.device)
204
205typedef enum ap_sm_wait (ap_func_t)(struct ap_queue *queue);
206
207
208struct ap_fi {
209 union {
210 u16 cmd;
211 struct {
212 u8 flags;
213 u8 action;
214 };
215 };
216};
217
218
219enum ap_fi_actions {
220 AP_FI_ACTION_CCA_AGENT_FF = 0x01,
221 AP_FI_ACTION_CCA_DOM_INVAL = 0x02,
222 AP_FI_ACTION_NQAP_QID_INVAL = 0x03,
223};
224
225
226enum ap_fi_flags {
227 AP_FI_FLAG_NO_RETRY = 0x01,
228 AP_FI_FLAG_TOGGLE_SPECIAL = 0x02,
229};
230
231struct ap_message {
232 struct list_head list;
233 unsigned long long psmid;
234 void *msg;
235 unsigned int len;
236 unsigned int bufsize;
237 u16 flags;
238 struct ap_fi fi;
239 int rc;
240 void *private;
241
242 void (*receive)(struct ap_queue *, struct ap_message *,
243 struct ap_message *);
244};
245
246#define AP_MSG_FLAG_SPECIAL 1
247
248
249
250
251
252
253static inline void ap_init_message(struct ap_message *ap_msg)
254{
255 memset(ap_msg, 0, sizeof(*ap_msg));
256}
257
258
259
260
261
262
263static inline void ap_release_message(struct ap_message *ap_msg)
264{
265 kfree_sensitive(ap_msg->msg);
266 kfree_sensitive(ap_msg->private);
267}
268
269
270
271
272
273
274int ap_send(ap_qid_t, unsigned long long, void *, size_t);
275int ap_recv(ap_qid_t, unsigned long long *, void *, size_t);
276
277enum ap_sm_wait ap_sm_event(struct ap_queue *aq, enum ap_sm_event event);
278enum ap_sm_wait ap_sm_event_loop(struct ap_queue *aq, enum ap_sm_event event);
279
280int ap_queue_message(struct ap_queue *aq, struct ap_message *ap_msg);
281void ap_cancel_message(struct ap_queue *aq, struct ap_message *ap_msg);
282void ap_flush_queue(struct ap_queue *aq);
283
284void *ap_airq_ptr(void);
285void ap_wait(enum ap_sm_wait wait);
286void ap_request_timeout(struct timer_list *t);
287void ap_bus_force_rescan(void);
288
289int ap_test_config_usage_domain(unsigned int domain);
290int ap_test_config_ctrl_domain(unsigned int domain);
291
292void ap_queue_init_reply(struct ap_queue *aq, struct ap_message *ap_msg);
293struct ap_queue *ap_queue_create(ap_qid_t qid, int device_type);
294void ap_queue_prepare_remove(struct ap_queue *aq);
295void ap_queue_remove(struct ap_queue *aq);
296void ap_queue_init_state(struct ap_queue *aq);
297
298struct ap_card *ap_card_create(int id, int queue_depth, int raw_type,
299 int comp_type, unsigned int functions, int ml);
300
301struct ap_perms {
302 unsigned long ioctlm[BITS_TO_LONGS(AP_IOCTLS)];
303 unsigned long apm[BITS_TO_LONGS(AP_DEVICES)];
304 unsigned long aqm[BITS_TO_LONGS(AP_DOMAINS)];
305};
306extern struct ap_perms ap_perms;
307extern struct mutex ap_perms_mutex;
308
309
310
311
312
313
314
315
316
317struct ap_queue *ap_get_qdev(ap_qid_t qid);
318
319
320
321
322
323
324
325
326int ap_owned_by_def_drv(int card, int queue);
327
328
329
330
331
332
333
334
335
336
337
338
339int ap_apqn_in_matrix_owned_by_def_drv(unsigned long *apm,
340 unsigned long *aqm);
341
342
343
344
345
346
347
348
349
350
351
352
353
354int ap_parse_mask_str(const char *str,
355 unsigned long *bitmap, int bits,
356 struct mutex *lock);
357
358
359
360
361
362
363
364
365
366
367
368int ap_wait_init_apqn_bindings_complete(unsigned long timeout);
369
370void ap_send_config_uevent(struct ap_device *ap_dev, bool cfg);
371void ap_send_online_uevent(struct ap_device *ap_dev, int online);
372
373#endif
374