diff options
Diffstat (limited to 'arch/ia64/sn/kernel/klconflib.c')
-rw-r--r-- | arch/ia64/sn/kernel/klconflib.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/arch/ia64/sn/kernel/klconflib.c b/arch/ia64/sn/kernel/klconflib.c new file mode 100644 index 000000000000..0f11a3299cd2 --- /dev/null +++ b/arch/ia64/sn/kernel/klconflib.c | |||
@@ -0,0 +1,108 @@ | |||
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) 1992 - 1997, 2000-2004 Silicon Graphics, Inc. All rights reserved. | ||
7 | */ | ||
8 | |||
9 | #include <linux/types.h> | ||
10 | #include <linux/ctype.h> | ||
11 | #include <linux/string.h> | ||
12 | #include <linux/kernel.h> | ||
13 | #include <asm/sn/types.h> | ||
14 | #include <asm/sn/module.h> | ||
15 | #include <asm/sn/l1.h> | ||
16 | |||
17 | char brick_types[MAX_BRICK_TYPES + 1] = "cri.xdpn%#=vo^kjbf890123456789..."; | ||
18 | /* | ||
19 | * Format a module id for printing. | ||
20 | * | ||
21 | * There are three possible formats: | ||
22 | * | ||
23 | * MODULE_FORMAT_BRIEF is the brief 6-character format, including | ||
24 | * the actual brick-type as recorded in the | ||
25 | * moduleid_t, eg. 002c15 for a C-brick, or | ||
26 | * 101#17 for a PX-brick. | ||
27 | * | ||
28 | * MODULE_FORMAT_LONG is the hwgraph format, eg. rack/002/bay/15 | ||
29 | * of rack/101/bay/17 (note that the brick | ||
30 | * type does not appear in this format). | ||
31 | * | ||
32 | * MODULE_FORMAT_LCD is like MODULE_FORMAT_BRIEF, except that it | ||
33 | * ensures that the module id provided appears | ||
34 | * exactly as it would on the LCD display of | ||
35 | * the corresponding brick, eg. still 002c15 | ||
36 | * for a C-brick, but 101p17 for a PX-brick. | ||
37 | * | ||
38 | * maule (9/13/04): Removed top-level check for (fmt == MODULE_FORMAT_LCD) | ||
39 | * making MODULE_FORMAT_LCD equivalent to MODULE_FORMAT_BRIEF. It was | ||
40 | * decided that all callers should assume the returned string should be what | ||
41 | * is displayed on the brick L1 LCD. | ||
42 | */ | ||
43 | void | ||
44 | format_module_id(char *buffer, moduleid_t m, int fmt) | ||
45 | { | ||
46 | int rack, position; | ||
47 | unsigned char brickchar; | ||
48 | |||
49 | rack = MODULE_GET_RACK(m); | ||
50 | brickchar = MODULE_GET_BTCHAR(m); | ||
51 | |||
52 | /* Be sure we use the same brick type character as displayed | ||
53 | * on the brick's LCD | ||
54 | */ | ||
55 | switch (brickchar) | ||
56 | { | ||
57 | case L1_BRICKTYPE_GA: | ||
58 | case L1_BRICKTYPE_OPUS_TIO: | ||
59 | brickchar = L1_BRICKTYPE_C; | ||
60 | break; | ||
61 | |||
62 | case L1_BRICKTYPE_PX: | ||
63 | case L1_BRICKTYPE_PE: | ||
64 | case L1_BRICKTYPE_PA: | ||
65 | case L1_BRICKTYPE_SA: /* we can move this to the "I's" later | ||
66 | * if that makes more sense | ||
67 | */ | ||
68 | brickchar = L1_BRICKTYPE_P; | ||
69 | break; | ||
70 | |||
71 | case L1_BRICKTYPE_IX: | ||
72 | case L1_BRICKTYPE_IA: | ||
73 | |||
74 | brickchar = L1_BRICKTYPE_I; | ||
75 | break; | ||
76 | } | ||
77 | |||
78 | position = MODULE_GET_BPOS(m); | ||
79 | |||
80 | if ((fmt == MODULE_FORMAT_BRIEF) || (fmt == MODULE_FORMAT_LCD)) { | ||
81 | /* Brief module number format, eg. 002c15 */ | ||
82 | |||
83 | /* Decompress the rack number */ | ||
84 | *buffer++ = '0' + RACK_GET_CLASS(rack); | ||
85 | *buffer++ = '0' + RACK_GET_GROUP(rack); | ||
86 | *buffer++ = '0' + RACK_GET_NUM(rack); | ||
87 | |||
88 | /* Add the brick type */ | ||
89 | *buffer++ = brickchar; | ||
90 | } | ||
91 | else if (fmt == MODULE_FORMAT_LONG) { | ||
92 | /* Fuller hwgraph format, eg. rack/002/bay/15 */ | ||
93 | |||
94 | strcpy(buffer, "rack" "/"); buffer += strlen(buffer); | ||
95 | |||
96 | *buffer++ = '0' + RACK_GET_CLASS(rack); | ||
97 | *buffer++ = '0' + RACK_GET_GROUP(rack); | ||
98 | *buffer++ = '0' + RACK_GET_NUM(rack); | ||
99 | |||
100 | strcpy(buffer, "/" "bay" "/"); buffer += strlen(buffer); | ||
101 | } | ||
102 | |||
103 | /* Add the bay position, using at least two digits */ | ||
104 | if (position < 10) | ||
105 | *buffer++ = '0'; | ||
106 | sprintf(buffer, "%d", position); | ||
107 | |||
108 | } | ||