1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#ifndef _AP_BUS_H_
28#define _AP_BUS_H_
29
30#include <linux/device.h>
31#include <linux/mod_devicetable.h>
32#include <linux/types.h>
33
34#define AP_DEVICES 64
35#define AP_DOMAINS 16
36#define AP_MAX_RESET 90
37#define AP_RESET_TIMEOUT (HZ/2)
38#define AP_CONFIG_TIME 30
39#define AP_POLL_TIME 1
40
41extern int ap_domain_index;
42
43
44
45
46
47typedef unsigned int ap_qid_t;
48
49#define AP_MKQID(_device,_queue) (((_device) & 63) << 8 | ((_queue) & 15))
50#define AP_QID_DEVICE(_qid) (((_qid) >> 8) & 63)
51#define AP_QID_QUEUE(_qid) ((_qid) & 15)
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67struct ap_queue_status {
68 unsigned int queue_empty : 1;
69 unsigned int replies_waiting : 1;
70 unsigned int queue_full : 1;
71 unsigned int pad1 : 4;
72 unsigned int int_enabled : 1;
73 unsigned int response_code : 8;
74 unsigned int pad2 : 16;
75};
76
77#define AP_RESPONSE_NORMAL 0x00
78#define AP_RESPONSE_Q_NOT_AVAIL 0x01
79#define AP_RESPONSE_RESET_IN_PROGRESS 0x02
80#define AP_RESPONSE_DECONFIGURED 0x03
81#define AP_RESPONSE_CHECKSTOPPED 0x04
82#define AP_RESPONSE_BUSY 0x05
83#define AP_RESPONSE_INVALID_ADDRESS 0x06
84#define AP_RESPONSE_OTHERWISE_CHANGED 0x07
85#define AP_RESPONSE_Q_FULL 0x10
86#define AP_RESPONSE_NO_PENDING_REPLY 0x10
87#define AP_RESPONSE_INDEX_TOO_BIG 0x11
88#define AP_RESPONSE_NO_FIRST_PART 0x13
89#define AP_RESPONSE_MESSAGE_TOO_BIG 0x15
90
91
92
93
94#define AP_DEVICE_TYPE_PCICC 3
95#define AP_DEVICE_TYPE_PCICA 4
96#define AP_DEVICE_TYPE_PCIXCC 5
97#define AP_DEVICE_TYPE_CEX2A 6
98#define AP_DEVICE_TYPE_CEX2C 7
99#define AP_DEVICE_TYPE_CEX2A2 8
100#define AP_DEVICE_TYPE_CEX2C2 9
101
102
103
104
105#define AP_RESET_IGNORE 0
106#define AP_RESET_ARMED 1
107#define AP_RESET_DO 2
108
109struct ap_device;
110struct ap_message;
111
112struct ap_driver {
113 struct device_driver driver;
114 struct ap_device_id *ids;
115
116 int (*probe)(struct ap_device *);
117 void (*remove)(struct ap_device *);
118
119 void (*receive)(struct ap_device *, struct ap_message *,
120 struct ap_message *);
121 int request_timeout;
122};
123
124#define to_ap_drv(x) container_of((x), struct ap_driver, driver)
125
126int ap_driver_register(struct ap_driver *, struct module *, char *);
127void ap_driver_unregister(struct ap_driver *);
128
129struct ap_device {
130 struct device device;
131 struct ap_driver *drv;
132 spinlock_t lock;
133 struct list_head list;
134
135 ap_qid_t qid;
136 int queue_depth;
137 int device_type;
138 int unregistered;
139 struct timer_list timeout;
140 int reset;
141
142 int queue_count;
143
144 struct list_head pendingq;
145 int pendingq_count;
146 struct list_head requestq;
147 int requestq_count;
148 int total_request_count;
149
150 struct ap_message *reply;
151
152 void *private;
153};
154
155#define to_ap_dev(x) container_of((x), struct ap_device, device)
156
157struct ap_message {
158 struct list_head list;
159 unsigned long long psmid;
160 void *message;
161 size_t length;
162
163 void *private;
164};
165
166#define AP_DEVICE(dt) \
167 .dev_type=(dt), \
168 .match_flags=AP_DEVICE_ID_MATCH_DEVICE_TYPE,
169
170
171
172
173
174
175int ap_send(ap_qid_t, unsigned long long, void *, size_t);
176int ap_recv(ap_qid_t, unsigned long long *, void *, size_t);
177
178void ap_queue_message(struct ap_device *ap_dev, struct ap_message *ap_msg);
179void ap_cancel_message(struct ap_device *ap_dev, struct ap_message *ap_msg);
180void ap_flush_queue(struct ap_device *ap_dev);
181
182int ap_module_init(void);
183void ap_module_exit(void);
184
185#endif
186