sgi-xp: define xpSalError reason code
[cascardo/linux.git] / drivers / misc / sgi-xp / xp.h
1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file "COPYING" in the main directory of this archive
4  * for more details.
5  *
6  * Copyright (C) 2004-2008 Silicon Graphics, Inc. All rights reserved.
7  */
8
9 /*
10  * External Cross Partition (XP) structures and defines.
11  */
12
13 #ifndef _DRIVERS_MISC_SGIXP_XP_H
14 #define _DRIVERS_MISC_SGIXP_XP_H
15
16 #include <linux/cache.h>
17 #include <linux/hardirq.h>
18 #include <linux/mutex.h>
19 #include <asm/sn/types.h>
20 #include <asm/sn/bte.h>
21
22 #ifdef USE_DBUG_ON
23 #define DBUG_ON(condition)      BUG_ON(condition)
24 #else
25 #define DBUG_ON(condition)
26 #endif
27
28 #ifndef is_shub1
29 #define is_shub1()      0
30 #endif
31
32 #ifndef is_shub2
33 #define is_shub2()      0
34 #endif
35
36 #ifndef is_shub
37 #define is_shub()       (is_shub1() || is_shub2())
38 #endif
39
40 #ifndef is_uv
41 #define is_uv()         0
42 #endif
43
44 /*
45  * Define the maximum number of logically defined partitions the system
46  * can support. It is constrained by the maximum number of hardware
47  * partitionable regions. The term 'region' in this context refers to the
48  * minimum number of nodes that can comprise an access protection grouping.
49  * The access protection is in regards to memory, IPI and IOI.
50  *
51  * The maximum number of hardware partitionable regions is equal to the
52  * maximum number of nodes in the entire system divided by the minimum number
53  * of nodes that comprise an access protection grouping.
54  */
55 #define XP_MAX_PARTITIONS       64
56
57 /*
58  * Define the number of u64s required to represent all the C-brick nasids
59  * as a bitmap.  The cross-partition kernel modules deal only with
60  * C-brick nasids, thus the need for bitmaps which don't account for
61  * odd-numbered (non C-brick) nasids.
62  */
63 #define XP_MAX_PHYSNODE_ID      (MAX_NUMALINK_NODES / 2)
64 #define XP_NASID_MASK_BYTES     ((XP_MAX_PHYSNODE_ID + 7) / 8)
65 #define XP_NASID_MASK_WORDS     ((XP_MAX_PHYSNODE_ID + 63) / 64)
66
67 /*
68  * Wrapper for bte_copy() that should it return a failure status will retry
69  * the bte_copy() once in the hope that the failure was due to a temporary
70  * aberration (i.e., the link going down temporarily).
71  *
72  *      src - physical address of the source of the transfer.
73  *      vdst - virtual address of the destination of the transfer.
74  *      len - number of bytes to transfer from source to destination.
75  *      mode - see bte_copy() for definition.
76  *      notification - see bte_copy() for definition.
77  *
78  * Note: xp_bte_copy() should never be called while holding a spinlock.
79  */
80 static inline bte_result_t
81 xp_bte_copy(u64 src, u64 vdst, u64 len, u64 mode, void *notification)
82 {
83         bte_result_t ret;
84         u64 pdst = ia64_tpa(vdst);
85
86         /*
87          * Ensure that the physically mapped memory is contiguous.
88          *
89          * We do this by ensuring that the memory is from region 7 only.
90          * If the need should arise to use memory from one of the other
91          * regions, then modify the BUG_ON() statement to ensure that the
92          * memory from that region is always physically contiguous.
93          */
94         BUG_ON(REGION_NUMBER(vdst) != RGN_KERNEL);
95
96         ret = bte_copy(src, pdst, len, mode, notification);
97         if ((ret != BTE_SUCCESS) && BTE_ERROR_RETRY(ret)) {
98                 if (!in_interrupt())
99                         cond_resched();
100
101                 ret = bte_copy(src, pdst, len, mode, notification);
102         }
103
104         return ret;
105 }
106
107 /*
108  * XPC establishes channel connections between the local partition and any
109  * other partition that is currently up. Over these channels, kernel-level
110  * `users' can communicate with their counterparts on the other partitions.
111  *
112  * The maxinum number of channels is limited to eight. For performance reasons,
113  * the internal cross partition structures require sixteen bytes per channel,
114  * and eight allows all of this interface-shared info to fit in one cache line.
115  *
116  * XPC_NCHANNELS reflects the total number of channels currently defined.
117  * If the need for additional channels arises, one can simply increase
118  * XPC_NCHANNELS accordingly. If the day should come where that number
119  * exceeds the MAXIMUM number of channels allowed (eight), then one will need
120  * to make changes to the XPC code to allow for this.
121  */
122 #define XPC_MEM_CHANNEL         0       /* memory channel number */
123 #define XPC_NET_CHANNEL         1       /* network channel number */
124
125 #define XPC_NCHANNELS           2       /* #of defined channels */
126 #define XPC_MAX_NCHANNELS       8       /* max #of channels allowed */
127
128 #if XPC_NCHANNELS > XPC_MAX_NCHANNELS
129 #error  XPC_NCHANNELS exceeds MAXIMUM allowed.
130 #endif
131
132 /*
133  * The format of an XPC message is as follows:
134  *
135  *      +-------+--------------------------------+
136  *      | flags |////////////////////////////////|
137  *      +-------+--------------------------------+
138  *      |             message #                  |
139  *      +----------------------------------------+
140  *      |     payload (user-defined message)     |
141  *      |                                        |
142  *                      :
143  *      |                                        |
144  *      +----------------------------------------+
145  *
146  * The size of the payload is defined by the user via xpc_connect(). A user-
147  * defined message resides in the payload area.
148  *
149  * The user should have no dealings with the message header, but only the
150  * message's payload. When a message entry is allocated (via xpc_allocate())
151  * a pointer to the payload area is returned and not the actual beginning of
152  * the XPC message. The user then constructs a message in the payload area
153  * and passes that pointer as an argument on xpc_send() or xpc_send_notify().
154  *
155  * The size of a message entry (within a message queue) must be a cacheline
156  * sized multiple in order to facilitate the BTE transfer of messages from one
157  * message queue to another. A macro, XPC_MSG_SIZE(), is provided for the user
158  * that wants to fit as many msg entries as possible in a given memory size
159  * (e.g. a memory page).
160  */
161 struct xpc_msg {
162         u8 flags;               /* FOR XPC INTERNAL USE ONLY */
163         u8 reserved[7];         /* FOR XPC INTERNAL USE ONLY */
164         s64 number;             /* FOR XPC INTERNAL USE ONLY */
165
166         u64 payload;            /* user defined portion of message */
167 };
168
169 #define XPC_MSG_PAYLOAD_OFFSET  (u64) (&((struct xpc_msg *)0)->payload)
170 #define XPC_MSG_SIZE(_payload_size) \
171                 L1_CACHE_ALIGN(XPC_MSG_PAYLOAD_OFFSET + (_payload_size))
172
173 /*
174  * Define the return values and values passed to user's callout functions.
175  * (It is important to add new value codes at the end just preceding
176  * xpUnknownReason, which must have the highest numerical value.)
177  */
178 enum xp_retval {
179         xpSuccess = 0,
180
181         xpNotConnected,         /*  1: channel is not connected */
182         xpConnected,            /*  2: channel connected (opened) */
183         xpRETIRED1,             /*  3: (formerly xpDisconnected) */
184
185         xpMsgReceived,          /*  4: message received */
186         xpMsgDelivered,         /*  5: message delivered and acknowledged */
187
188         xpRETIRED2,             /*  6: (formerly xpTransferFailed) */
189
190         xpNoWait,               /*  7: operation would require wait */
191         xpRetry,                /*  8: retry operation */
192         xpTimeout,              /*  9: timeout in xpc_allocate_msg_wait() */
193         xpInterrupted,          /* 10: interrupted wait */
194
195         xpUnequalMsgSizes,      /* 11: message size disparity between sides */
196         xpInvalidAddress,       /* 12: invalid address */
197
198         xpNoMemory,             /* 13: no memory available for XPC structures */
199         xpLackOfResources,      /* 14: insufficient resources for operation */
200         xpUnregistered,         /* 15: channel is not registered */
201         xpAlreadyRegistered,    /* 16: channel is already registered */
202
203         xpPartitionDown,        /* 17: remote partition is down */
204         xpNotLoaded,            /* 18: XPC module is not loaded */
205         xpUnloading,            /* 19: this side is unloading XPC module */
206
207         xpBadMagic,             /* 20: XPC MAGIC string not found */
208
209         xpReactivating,         /* 21: remote partition was reactivated */
210
211         xpUnregistering,        /* 22: this side is unregistering channel */
212         xpOtherUnregistering,   /* 23: other side is unregistering channel */
213
214         xpCloneKThread,         /* 24: cloning kernel thread */
215         xpCloneKThreadFailed,   /* 25: cloning kernel thread failed */
216
217         xpNoHeartbeat,          /* 26: remote partition has no heartbeat */
218
219         xpPioReadError,         /* 27: PIO read error */
220         xpPhysAddrRegFailed,    /* 28: registration of phys addr range failed */
221
222         xpRETIRED3,             /* 29: (formerly xpBteDirectoryError) */
223         xpRETIRED4,             /* 30: (formerly xpBtePoisonError) */
224         xpRETIRED5,             /* 31: (formerly xpBteWriteError) */
225         xpRETIRED6,             /* 32: (formerly xpBteAccessError) */
226         xpRETIRED7,             /* 33: (formerly xpBtePWriteError) */
227         xpRETIRED8,             /* 34: (formerly xpBtePReadError) */
228         xpRETIRED9,             /* 35: (formerly xpBteTimeOutError) */
229         xpRETIRED10,            /* 36: (formerly xpBteXtalkError) */
230         xpRETIRED11,            /* 37: (formerly xpBteNotAvailable) */
231         xpRETIRED12,            /* 38: (formerly xpBteUnmappedError) */
232
233         xpBadVersion,           /* 39: bad version number */
234         xpVarsNotSet,           /* 40: the XPC variables are not set up */
235         xpNoRsvdPageAddr,       /* 41: unable to get rsvd page's phys addr */
236         xpInvalidPartid,        /* 42: invalid partition ID */
237         xpLocalPartid,          /* 43: local partition ID */
238
239         xpOtherGoingDown,       /* 44: other side going down, reason unknown */
240         xpSystemGoingDown,      /* 45: system is going down, reason unknown */
241         xpSystemHalt,           /* 46: system is being halted */
242         xpSystemReboot,         /* 47: system is being rebooted */
243         xpSystemPoweroff,       /* 48: system is being powered off */
244
245         xpDisconnecting,        /* 49: channel disconnecting (closing) */
246
247         xpOpenCloseError,       /* 50: channel open/close protocol error */
248
249         xpDisconnected,         /* 51: channel disconnected (closed) */
250
251         xpBteCopyError,         /* 52: bte_copy() returned error */
252         xpSalError,             /* 53: sn SAL error */
253
254         xpUnknownReason         /* 54: unknown reason - must be last in enum */
255 };
256
257 /*
258  * Define the callout function type used by XPC to update the user on
259  * connection activity and state changes via the user function registered
260  * by xpc_connect().
261  *
262  * Arguments:
263  *
264  *      reason - reason code.
265  *      partid - partition ID associated with condition.
266  *      ch_number - channel # associated with condition.
267  *      data - pointer to optional data.
268  *      key - pointer to optional user-defined value provided as the "key"
269  *            argument to xpc_connect().
270  *
271  * A reason code of xpConnected indicates that a connection has been
272  * established to the specified partition on the specified channel. The data
273  * argument indicates the max number of entries allowed in the message queue.
274  *
275  * A reason code of xpMsgReceived indicates that a XPC message arrived from
276  * the specified partition on the specified channel. The data argument
277  * specifies the address of the message's payload. The user must call
278  * xpc_received() when finished with the payload.
279  *
280  * All other reason codes indicate failure. The data argmument is NULL.
281  * When a failure reason code is received, one can assume that the channel
282  * is not connected.
283  */
284 typedef void (*xpc_channel_func) (enum xp_retval reason, short partid,
285                                   int ch_number, void *data, void *key);
286
287 /*
288  * Define the callout function type used by XPC to notify the user of
289  * messages received and delivered via the user function registered by
290  * xpc_send_notify().
291  *
292  * Arguments:
293  *
294  *      reason - reason code.
295  *      partid - partition ID associated with condition.
296  *      ch_number - channel # associated with condition.
297  *      key - pointer to optional user-defined value provided as the "key"
298  *            argument to xpc_send_notify().
299  *
300  * A reason code of xpMsgDelivered indicates that the message was delivered
301  * to the intended recipient and that they have acknowledged its receipt by
302  * calling xpc_received().
303  *
304  * All other reason codes indicate failure.
305  */
306 typedef void (*xpc_notify_func) (enum xp_retval reason, short partid,
307                                  int ch_number, void *key);
308
309 /*
310  * The following is a registration entry. There is a global array of these,
311  * one per channel. It is used to record the connection registration made
312  * by the users of XPC. As long as a registration entry exists, for any
313  * partition that comes up, XPC will attempt to establish a connection on
314  * that channel. Notification that a connection has been made will occur via
315  * the xpc_channel_func function.
316  *
317  * The 'func' field points to the function to call when aynchronous
318  * notification is required for such events as: a connection established/lost,
319  * or an incoming message received, or an error condition encountered. A
320  * non-NULL 'func' field indicates that there is an active registration for
321  * the channel.
322  */
323 struct xpc_registration {
324         struct mutex mutex;
325         xpc_channel_func func;  /* function to call */
326         void *key;              /* pointer to user's key */
327         u16 nentries;           /* #of msg entries in local msg queue */
328         u16 msg_size;           /* message queue's message size */
329         u32 assigned_limit;     /* limit on #of assigned kthreads */
330         u32 idle_limit;         /* limit on #of idle kthreads */
331 } ____cacheline_aligned;
332
333 #define XPC_CHANNEL_REGISTERED(_c)      (xpc_registrations[_c].func != NULL)
334
335 /* the following are valid xpc_allocate() flags */
336 #define XPC_WAIT        0       /* wait flag */
337 #define XPC_NOWAIT      1       /* no wait flag */
338
339 struct xpc_interface {
340         void (*connect) (int);
341         void (*disconnect) (int);
342         enum xp_retval (*allocate) (short, int, u32, void **);
343         enum xp_retval (*send) (short, int, void *);
344         enum xp_retval (*send_notify) (short, int, void *,
345                                         xpc_notify_func, void *);
346         void (*received) (short, int, void *);
347         enum xp_retval (*partid_to_nasids) (short, void *);
348 };
349
350 extern struct xpc_interface xpc_interface;
351
352 extern void xpc_set_interface(void (*)(int),
353                               void (*)(int),
354                               enum xp_retval (*)(short, int, u32, void **),
355                               enum xp_retval (*)(short, int, void *),
356                               enum xp_retval (*)(short, int, void *,
357                                                   xpc_notify_func, void *),
358                               void (*)(short, int, void *),
359                               enum xp_retval (*)(short, void *));
360 extern void xpc_clear_interface(void);
361
362 extern enum xp_retval xpc_connect(int, xpc_channel_func, void *, u16,
363                                    u16, u32, u32);
364 extern void xpc_disconnect(int);
365
366 static inline enum xp_retval
367 xpc_allocate(short partid, int ch_number, u32 flags, void **payload)
368 {
369         return xpc_interface.allocate(partid, ch_number, flags, payload);
370 }
371
372 static inline enum xp_retval
373 xpc_send(short partid, int ch_number, void *payload)
374 {
375         return xpc_interface.send(partid, ch_number, payload);
376 }
377
378 static inline enum xp_retval
379 xpc_send_notify(short partid, int ch_number, void *payload,
380                 xpc_notify_func func, void *key)
381 {
382         return xpc_interface.send_notify(partid, ch_number, payload, func, key);
383 }
384
385 static inline void
386 xpc_received(short partid, int ch_number, void *payload)
387 {
388         return xpc_interface.received(partid, ch_number, payload);
389 }
390
391 static inline enum xp_retval
392 xpc_partid_to_nasids(short partid, void *nasids)
393 {
394         return xpc_interface.partid_to_nasids(partid, nasids);
395 }
396
397 extern u64 xp_nofault_PIOR_target;
398 extern int xp_nofault_PIOR(void *);
399 extern int xp_error_PIOR(void);
400
401 #endif /* _DRIVERS_MISC_SGIXP_XP_H */