mirror of https://gitee.com/openkylin/linux.git
108 lines
2.9 KiB
C
108 lines
2.9 KiB
C
/*
|
|
* 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-2004 Silicon Graphics, Inc. All rights reserved.
|
|
*/
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/ctype.h>
|
|
#include <linux/string.h>
|
|
#include <linux/kernel.h>
|
|
#include <asm/sn/types.h>
|
|
#include <asm/sn/module.h>
|
|
#include <asm/sn/l1.h>
|
|
|
|
char brick_types[MAX_BRICK_TYPES + 1] = "cri.xdpn%#=vo^kjbf890123456789...";
|
|
/*
|
|
* Format a module id for printing.
|
|
*
|
|
* There are three possible formats:
|
|
*
|
|
* MODULE_FORMAT_BRIEF is the brief 6-character format, including
|
|
* the actual brick-type as recorded in the
|
|
* moduleid_t, eg. 002c15 for a C-brick, or
|
|
* 101#17 for a PX-brick.
|
|
*
|
|
* MODULE_FORMAT_LONG is the hwgraph format, eg. rack/002/bay/15
|
|
* of rack/101/bay/17 (note that the brick
|
|
* type does not appear in this format).
|
|
*
|
|
* MODULE_FORMAT_LCD is like MODULE_FORMAT_BRIEF, except that it
|
|
* ensures that the module id provided appears
|
|
* exactly as it would on the LCD display of
|
|
* the corresponding brick, eg. still 002c15
|
|
* for a C-brick, but 101p17 for a PX-brick.
|
|
*
|
|
* maule (9/13/04): Removed top-level check for (fmt == MODULE_FORMAT_LCD)
|
|
* making MODULE_FORMAT_LCD equivalent to MODULE_FORMAT_BRIEF. It was
|
|
* decided that all callers should assume the returned string should be what
|
|
* is displayed on the brick L1 LCD.
|
|
*/
|
|
void
|
|
format_module_id(char *buffer, moduleid_t m, int fmt)
|
|
{
|
|
int rack, position;
|
|
unsigned char brickchar;
|
|
|
|
rack = MODULE_GET_RACK(m);
|
|
brickchar = MODULE_GET_BTCHAR(m);
|
|
|
|
/* Be sure we use the same brick type character as displayed
|
|
* on the brick's LCD
|
|
*/
|
|
switch (brickchar)
|
|
{
|
|
case L1_BRICKTYPE_GA:
|
|
case L1_BRICKTYPE_OPUS_TIO:
|
|
brickchar = L1_BRICKTYPE_C;
|
|
break;
|
|
|
|
case L1_BRICKTYPE_PX:
|
|
case L1_BRICKTYPE_PE:
|
|
case L1_BRICKTYPE_PA:
|
|
case L1_BRICKTYPE_SA: /* we can move this to the "I's" later
|
|
* if that makes more sense
|
|
*/
|
|
brickchar = L1_BRICKTYPE_P;
|
|
break;
|
|
|
|
case L1_BRICKTYPE_IX:
|
|
case L1_BRICKTYPE_IA:
|
|
|
|
brickchar = L1_BRICKTYPE_I;
|
|
break;
|
|
}
|
|
|
|
position = MODULE_GET_BPOS(m);
|
|
|
|
if ((fmt == MODULE_FORMAT_BRIEF) || (fmt == MODULE_FORMAT_LCD)) {
|
|
/* Brief module number format, eg. 002c15 */
|
|
|
|
/* Decompress the rack number */
|
|
*buffer++ = '0' + RACK_GET_CLASS(rack);
|
|
*buffer++ = '0' + RACK_GET_GROUP(rack);
|
|
*buffer++ = '0' + RACK_GET_NUM(rack);
|
|
|
|
/* Add the brick type */
|
|
*buffer++ = brickchar;
|
|
}
|
|
else if (fmt == MODULE_FORMAT_LONG) {
|
|
/* Fuller hwgraph format, eg. rack/002/bay/15 */
|
|
|
|
strcpy(buffer, "rack" "/"); buffer += strlen(buffer);
|
|
|
|
*buffer++ = '0' + RACK_GET_CLASS(rack);
|
|
*buffer++ = '0' + RACK_GET_GROUP(rack);
|
|
*buffer++ = '0' + RACK_GET_NUM(rack);
|
|
|
|
strcpy(buffer, "/" "bay" "/"); buffer += strlen(buffer);
|
|
}
|
|
|
|
/* Add the bay position, using at least two digits */
|
|
if (position < 10)
|
|
*buffer++ = '0';
|
|
sprintf(buffer, "%d", position);
|
|
}
|