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
17char 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 */
43void
44format_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