geo.h 3.5 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5
/*
 * 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.
 *
6
 * Copyright (C) 1992 - 1997, 2000-2005 Silicon Graphics, Inc. All rights reserved.
L
Linus Torvalds 已提交
7 8 9 10 11 12 13 14 15 16 17 18 19 20
 */

#ifndef _ASM_IA64_SN_GEO_H
#define _ASM_IA64_SN_GEO_H

/* The geoid_t implementation below is based loosely on the pcfg_t
   implementation in sys/SN/promcfg.h. */

/* Type declaractions */

/* Size of a geoid_t structure (must be before decl. of geoid_u) */
#define GEOID_SIZE	8	/* Would 16 be better?  The size can
				   be different on different platforms. */

21 22
#define MAX_SLOTS	0xf	/* slots per module */
#define MAX_SLABS	0xf	/* slabs per slot */
L
Linus Torvalds 已提交
23 24 25 26

typedef unsigned char	geo_type_t;

/* Fields common to all substructures */
27
typedef struct geo_common_s {
L
Linus Torvalds 已提交
28 29
    moduleid_t	module;		/* The module (box) this h/w lives in */
    geo_type_t	type;		/* What type of h/w is named by this geoid_t */
30 31 32
    slabid_t	slab:4;		/* slab (ASIC), 0 .. 15 within slot */
    slotid_t	slot:4;		/* slot (Blade), 0 .. 15 within module */
} geo_common_t;
L
Linus Torvalds 已提交
33 34 35

/* Additional fields for particular types of hardware */
typedef struct geo_node_s {
36
    geo_common_t	common;		/* No additional fields needed */
L
Linus Torvalds 已提交
37 38 39
} geo_node_t;

typedef struct geo_rtr_s {
40
    geo_common_t	common;		/* No additional fields needed */
L
Linus Torvalds 已提交
41 42 43
} geo_rtr_t;

typedef struct geo_iocntl_s {
44
    geo_common_t	common;		/* No additional fields needed */
L
Linus Torvalds 已提交
45 46 47
} geo_iocntl_t;

typedef struct geo_pcicard_s {
48
    geo_iocntl_t	common;
L
Linus Torvalds 已提交
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
    char		bus;	/* Bus/widget number */
    char		slot;	/* PCI slot number */
} geo_pcicard_t;

/* Subcomponents of a node */
typedef struct geo_cpu_s {
    geo_node_t	node;
    char	slice;		/* Which CPU on the node */
} geo_cpu_t;

typedef struct geo_mem_s {
    geo_node_t	node;
    char	membus;		/* The memory bus on the node */
    char	memslot;	/* The memory slot on the bus */
} geo_mem_t;


typedef union geoid_u {
67 68
    geo_common_t	common;
    geo_node_t		node;
L
Linus Torvalds 已提交
69 70
    geo_iocntl_t	iocntl;
    geo_pcicard_t	pcicard;
71 72 73 74
    geo_rtr_t		rtr;
    geo_cpu_t		cpu;
    geo_mem_t		mem;
    char		padsize[GEOID_SIZE];
L
Linus Torvalds 已提交
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
} geoid_t;


/* Preprocessor macros */

#define GEO_MAX_LEN	48	/* max. formatted length, plus some pad:
				   module/001c07/slab/5/node/memory/2/slot/4 */

/* Values for geo_type_t */
#define GEO_TYPE_INVALID	0
#define GEO_TYPE_MODULE		1
#define GEO_TYPE_NODE		2
#define GEO_TYPE_RTR		3
#define GEO_TYPE_IOCNTL		4
#define GEO_TYPE_IOCARD		5
#define GEO_TYPE_CPU		6
#define GEO_TYPE_MEM		7
#define GEO_TYPE_MAX		(GEO_TYPE_MEM+1)

/* Parameter for hwcfg_format_geoid_compt() */
#define GEO_COMPT_MODULE	1
#define GEO_COMPT_SLAB		2
#define GEO_COMPT_IOBUS		3
#define GEO_COMPT_IOSLOT	4
#define GEO_COMPT_CPU		5
#define GEO_COMPT_MEMBUS	6
#define GEO_COMPT_MEMSLOT	7

#define GEO_INVALID_STR		"<invalid>"

#define INVALID_NASID           ((nasid_t)-1)
#define INVALID_CNODEID         ((cnodeid_t)-1)
#define INVALID_PNODEID         ((pnodeid_t)-1)
#define INVALID_SLAB            (slabid_t)-1
109
#define INVALID_SLOT            (slotid_t)-1
L
Linus Torvalds 已提交
110 111 112 113
#define INVALID_MODULE          ((moduleid_t)-1)

static inline slabid_t geo_slab(geoid_t g)
{
114 115 116 117 118 119 120 121
	return (g.common.type == GEO_TYPE_INVALID) ?
		INVALID_SLAB : g.common.slab;
}

static inline slotid_t geo_slot(geoid_t g)
{
	return (g.common.type == GEO_TYPE_INVALID) ?
		INVALID_SLOT : g.common.slot;
L
Linus Torvalds 已提交
122 123 124 125
}

static inline moduleid_t geo_module(geoid_t g)
{
126 127
	return (g.common.type == GEO_TYPE_INVALID) ?
		INVALID_MODULE : g.common.module;
L
Linus Torvalds 已提交
128 129 130 131 132
}

extern geoid_t cnodeid_get_geoid(cnodeid_t cnode);

#endif /* _ASM_IA64_SN_GEO_H */