aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-ia64/sn/module.h
blob: 9e3b73818a3ea531f8dc09934e580847a8df7916 (plain)
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
/*
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * Copyright (C) 1992 - 1997, 2000-2002 Silicon Graphics, Inc. All rights reserved.
 */
#ifndef _ASM_IA64_SN_MODULE_H
#define _ASM_IA64_SN_MODULE_H

#ifdef	__cplusplus
extern "C" {
#endif


#include <linux/config.h>
#include <asm/sn/systeminfo.h>
#include <asm/sn/klconfig.h>
#include <asm/sn/ksys/elsc.h>

#define MODULE_MAX			128
#define MODULE_MAX_NODES		2
#define MODULE_HIST_CNT			16
#define MAX_MODULE_LEN			16

/* Well-known module IDs */
#define MODULE_UNKNOWN		(-2) /* initial value of klconfig brd_module */
/* #define INVALID_MODULE	(-1) ** generic invalid moduleid_t (arch.h) */
#define MODULE_NOT_SET		0    /* module ID not set in sys ctlrs. */

/* parameter for format_module_id() */
#define MODULE_FORMAT_BRIEF	1
#define MODULE_FORMAT_LONG	2


#ifdef CONFIG_IA64_SGI_SN2

/*
 *	Module id format
 *
 *	31-16	Rack ID (encoded class, group, number - 16-bit unsigned int)
 *	 15-8	Brick type (8-bit ascii character)
 *	  7-0	Bay (brick position in rack (0-63) - 8-bit unsigned int)
 *
 */

/*
 * Macros for getting the brick type
 */
#define MODULE_BTYPE_MASK	0xff00
#define MODULE_BTYPE_SHFT	8
#define MODULE_GET_BTYPE(_m)	(((_m) & MODULE_BTYPE_MASK) >> MODULE_BTYPE_SHFT)
#define MODULE_BT_TO_CHAR(_b)	((char)(_b))
#define MODULE_GET_BTCHAR(_m)	(MODULE_BT_TO_CHAR(MODULE_GET_BTYPE(_m)))

/*
 * Macros for getting the rack ID.
 */
#define MODULE_RACK_MASK	0xffff0000
#define MODULE_RACK_SHFT	16
#define MODULE_GET_RACK(_m)	(((_m) & MODULE_RACK_MASK) >> MODULE_RACK_SHFT)

/*
 * Macros for getting the brick position
 */
#define MODULE_BPOS_MASK	0x00ff
#define MODULE_BPOS_SHFT	0
#define MODULE_GET_BPOS(_m)	(((_m) & MODULE_BPOS_MASK) >> MODULE_BPOS_SHFT)

/*
 * Macros for constructing moduleid_t's
 */
#define RBT_TO_MODULE(_r, _b, _t) ((_r) << MODULE_RACK_SHFT | \
				   (_b) << MODULE_BPOS_SHFT | \
				   (_t) << MODULE_BTYPE_SHFT)

/*
 * Macros for encoding and decoding rack IDs
 * A rack number consists of three parts:
 *   class (0==CPU/mixed, 1==I/O), group, number
 *
 * Rack number is stored just as it is displayed on the screen:
 * a 3-decimal-digit number.
 */
#define RACK_CLASS_DVDR		100
#define RACK_GROUP_DVDR		10
#define RACK_NUM_DVDR		1

#define RACK_CREATE_RACKID(_c, _g, _n)	((_c) * RACK_CLASS_DVDR +	\
	(_g) * RACK_GROUP_DVDR + (_n) * RACK_NUM_DVDR)

#define RACK_GET_CLASS(_r)              ((_r) / RACK_CLASS_DVDR)
#define RACK_GET_GROUP(_r)              (((_r) - RACK_GET_CLASS(_r) *   \
            RACK_CLASS_DVDR) / RACK_GROUP_DVDR)
#define RACK_GET_NUM(_r)                (((_r) - RACK_GET_CLASS(_r) *   \
            RACK_CLASS_DVDR - RACK_GET_GROUP(_r) *      \
            RACK_GROUP_DVDR) / RACK_NUM_DVDR)

/*
 * Macros for encoding and decoding rack IDs
 * A rack number consists of three parts:
 *   class	1 bit, 0==CPU/mixed, 1==I/O
 *   group	2 bits for CPU/mixed, 3 bits for I/O
 *   number	3 bits for CPU/mixed, 2 bits for I/O (1 based)
 */
#define RACK_GROUP_BITS(_r)	(RACK_GET_CLASS(_r) ? 3 : 2)
#define RACK_NUM_BITS(_r)	(RACK_GET_CLASS(_r) ? 2 : 3)

#define RACK_CLASS_MASK(_r)	0x20
#define RACK_CLASS_SHFT(_r)	5
#define RACK_ADD_CLASS(_r, _c)	\
	((_r) |= (_c) << RACK_CLASS_SHFT(_r) & RACK_CLASS_MASK(_r))

#define RACK_GROUP_SHFT(_r)	RACK_NUM_BITS(_r)
#define RACK_GROUP_MASK(_r)	\
	( (((unsigned)1<<RACK_GROUP_BITS(_r)) - 1) << RACK_GROUP_SHFT(_r) )
#define RACK_ADD_GROUP(_r, _g)	\
	((_r) |= (_g) << RACK_GROUP_SHFT(_r) & RACK_GROUP_MASK(_r))

#define RACK_NUM_SHFT(_r)	0
#define RACK_NUM_MASK(_r)	\
	( (((unsigned)1<<RACK_NUM_BITS(_r)) - 1) << RACK_NUM_SHFT(_r) )
#define RACK_ADD_NUM(_r, _n)	\
	((_r) |= ((_n) - 1) << RACK_NUM_SHFT(_r) & RACK_NUM_MASK(_r))


/*
 * Brick type definitions
 */
#define MAX_BRICK_TYPES         256 /* brick type is stored as uchar */

extern char brick_types[];

#define MODULE_CBRICK           0
#define MODULE_RBRICK           1
#define MODULE_IBRICK           2
#define MODULE_KBRICK           3
#define MODULE_XBRICK           4
#define MODULE_DBRICK           5
#define MODULE_PBRICK           6
#define MODULE_NBRICK           7
#define MODULE_PEBRICK          8
#define MODULE_PXBRICK          9

/*
 * Moduleid_t comparison macros
 */
/* Don't compare the brick type:  only the position is significant */
#define MODULE_CMP(_m1, _m2)    (((_m1)&(MODULE_RACK_MASK|MODULE_BPOS_MASK)) -\
                                 ((_m2)&(MODULE_RACK_MASK|MODULE_BPOS_MASK)))
#define MODULE_MATCH(_m1, _m2)  (MODULE_CMP((_m1),(_m2)) == 0)


#else
#if defined(CONFIG_IA64_SGI_SN1) || defined(CONFIG_IA64_GENERIC)

/*
 *	Module id format
 *
 *	  15-12 Brick type (enumerated)
 *	   11-6	Rack ID	(encoded class, group, number)
 *	    5-0 Brick position in rack (0-63)
 */
/*
 * Macros for getting the brick type
 */
#define MODULE_BTYPE_MASK	0xf000
#define MODULE_BTYPE_SHFT	12
#define MODULE_GET_BTYPE(_m)	(((_m) & MODULE_BTYPE_MASK) >> MODULE_BTYPE_SHFT)
#define MODULE_BT_TO_CHAR(_b)	(brick_types[(_b)])
#define MODULE_GET_BTCHAR(_m)	(MODULE_BT_TO_CHAR(MODULE_GET_BTYPE(_m)))

/*
 * Macros for getting the rack ID.
 */
#define MODULE_RACK_MASK	0x0fc0
#define MODULE_RACK_SHFT	6
#define MODULE_GET_RACK(_m)	(((_m) & MODULE_RACK_MASK) >> MODULE_RACK_SHFT)

/*
 * Macros for getting the brick position
 */
#define MODULE_BPOS_MASK	0x003f
#define MODULE_BPOS_SHFT	0
#define MODULE_GET_BPOS(_m)	(((_m) & MODULE_BPOS_MASK) >> MODULE_BPOS_SHFT)

/*
 * Macros for constructing moduleid_t's
 */
#define RBT_TO_MODULE(_r, _b, _t) ((_r) << MODULE_RACK_SHFT | \
				   (_b) << MODULE_BPOS_SHFT | \
				   (_t) << MODULE_BTYPE_SHFT)

/*
 * Macros for encoding and decoding rack IDs
 * A rack number consists of three parts:
 *   class	1 bit, 0==CPU/mixed, 1==I/O
 *   group	2 bits for CPU/mixed, 3 bits for I/O
 *   number	3 bits for CPU/mixed, 2 bits for I/O (1 based)
 */
#define RACK_GROUP_BITS(_r)	(RACK_GET_CLASS(_r) ? 3 : 2)
#define RACK_NUM_BITS(_r)	(RACK_GET_CLASS(_r) ? 2 : 3)

#define RACK_CLASS_MASK(_r)	0x20
#define RACK_CLASS_SHFT(_r)	5
#define RACK_GET_CLASS(_r)	\
	(((_r) & RACK_CLASS_MASK(_r)) >> RACK_CLASS_SHFT(_r))
#define RACK_ADD_CLASS(_r, _c)	\
	((_r) |= (_c) << RACK_CLASS_SHFT(_r) & RACK_CLASS_MASK(_r))

#define RACK_GROUP_SHFT(_r)	RACK_NUM_BITS(_r)
#define RACK_GROUP_MASK(_r)	\
	( (((unsigned)1<<RACK_GROUP_BITS(_r)) - 1) << RACK_GROUP_SHFT(_r) )
#define RACK_GET_GROUP(_r)	\
	(((_r) & RACK_GROUP_MASK(_r)) >> RACK_GROUP_SHFT(_r))
#define RACK_ADD_GROUP(_r, _g)	\
	((_r) |= (_g) << RACK_GROUP_SHFT(_r) & RACK_GROUP_MASK(_r))

#define RACK_NUM_SHFT(_r)	0
#define RACK_NUM_MASK(_r)	\
	( (((unsigned)1<<RACK_NUM_BITS(_r)) - 1) << RACK_NUM_SHFT(_r) )
#define RACK_GET_NUM(_r)	\
	( (((_r) & RACK_NUM_MASK(_r)) >> RACK_NUM_SHFT(_r)) + 1 )
#define RACK_ADD_NUM(_r, _n)	\
	((_r) |= ((_n) - 1) << RACK_NUM_SHFT(_r) & RACK_NUM_MASK(_r))

/*
 * Brick type definitions
 */
#define MAX_BRICK_TYPES		16 /* 1 << (MODULE_RACK_SHFT - MODULE_BTYPE_SHFT */

extern char brick_types[];

#define MODULE_CBRICK		0
#define MODULE_RBRICK		1
#define MODULE_IBRICK		2
#define MODULE_KBRICK		3
#define MODULE_XBRICK		4
#define MODULE_DBRICK		5
#define MODULE_PBRICK		6
#define MODULE_NBRICK           7
#define MODULE_PEBRICK          8
#define MODULE_PXBRICK          9

/*
 * Moduleid_t comparison macros
 */
/* Don't compare the brick type:  only the position is significant */
#define MODULE_CMP(_m1, _m2)	(((_m1)&(MODULE_RACK_MASK|MODULE_BPOS_MASK)) -\
				 ((_m2)&(MODULE_RACK_MASK|MODULE_BPOS_MASK)))
#define MODULE_MATCH(_m1, _m2)	(MODULE_CMP((_m1),(_m2)) == 0)

#else

/*
 * Some code that uses this macro will not be conditionally compiled.
 */
#define MODULE_GET_BTCHAR(_m)	('?')
#define MODULE_CMP(_m1, _m2)	((_m1) - (_m2))
#define MODULE_MATCH(_m1, _m2)	(MODULE_CMP((_m1),(_m2)) == 0)

#endif /* SN1 */
#endif /* SN2 */

typedef struct module_s module_t;

struct module_s {
    moduleid_t		id;		/* Module ID of this module        */

    spinlock_t		lock;		/* Lock for this structure	   */

    /* List of nodes in this module */
    cnodeid_t		nodes[MODULE_MAX_NODES];
#ifdef CONFIG_IA64_SGI_SN2
    geoid_t		geoid[MODULE_MAX_NODES];
    struct {
		char	moduleid[8];
    } io[MODULE_MAX_NODES];
#endif
    int			nodecnt;	/* Number of nodes in array        */

    /* Fields for Module System Controller */
    int			mesgpend;	/* Message pending                 */
    int			shutdown;	/* Shutdown in progress            */
    struct semaphore	thdcnt;		/* Threads finished counter        */

#ifdef CONFIG_IA64_SGI_SN1
    elsc_t		elsc;
    spinlock_t		elsclock;
#endif
    time_t		intrhist[MODULE_HIST_CNT];
    int			histptr;

    int			hbt_active;	/* MSC heartbeat monitor active    */
    uint64_t		hbt_last;	/* RTC when last heartbeat sent    */

    /* Module serial number info */
    union {
	char		snum_str[MAX_SERIAL_NUM_SIZE];	 /* used by CONFIG_SGI_IP27    */
	uint64_t	snum_int;			 /* used by speedo */
    } snum;
    int			snum_valid;

    int			disable_alert;
    int			count_down;

    /* System serial number info (used by SN1) */
    char		sys_snum[MAX_SERIAL_NUM_SIZE];
    int			sys_snum_valid;
};

/* module.c */
extern module_t	       *modules[MODULE_MAX];	/* Indexed by cmoduleid_t   */
extern int		nummodules;

extern module_t	       *module_lookup(moduleid_t id);

#if defined(CONFIG_IA64_SGI_SN1)
extern elsc_t	       *get_elsc(void);
#endif

extern int		get_kmod_info(cmoduleid_t cmod,
				      module_info_t *mod_info);
extern int		get_kmod_sys_snum(cmoduleid_t cmod,
					  char *snum);

extern void		format_module_id(char *buffer, moduleid_t m, int fmt);
extern int		parse_module_id(char *buffer);

#ifdef	__cplusplus
}
#endif

#endif /* _ASM_IA64_SN_MODULE_H */