linux/arch/ia64/sn/kernel/klconflib.c
<<
>>
Prefs
   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