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-2005 Silicon Graphics, Inc. All rights reserved.
7  */
8 
9 #ifndef _ASM_IA64_SN_GEO_H
10 #define _ASM_IA64_SN_GEO_H
11 
12 /* The geoid_t implementation below is based loosely on the pcfg_t
13    implementation in sys/SN/promcfg.h. */
14 
15 /* Type declaractions */
16 
17 /* Size of a geoid_t structure (must be before decl. of geoid_u) */
18 #define GEOID_SIZE	8	/* Would 16 be better?  The size can
19 				   be different on different platforms. */
20 
21 #define MAX_SLOTS	0xf	/* slots per module */
22 #define MAX_SLABS	0xf	/* slabs per slot */
23 
24 typedef unsigned char	geo_type_t;
25 
26 /* Fields common to all substructures */
27 typedef struct geo_common_s {
28     moduleid_t	module;		/* The module (box) this h/w lives in */
29     geo_type_t	type;		/* What type of h/w is named by this geoid_t */
30     slabid_t	slab:4;		/* slab (ASIC), 0 .. 15 within slot */
31     slotid_t	slot:4;		/* slot (Blade), 0 .. 15 within module */
32 } geo_common_t;
33 
34 /* Additional fields for particular types of hardware */
35 typedef struct geo_node_s {
36     geo_common_t	common;		/* No additional fields needed */
37 } geo_node_t;
38 
39 typedef struct geo_rtr_s {
40     geo_common_t	common;		/* No additional fields needed */
41 } geo_rtr_t;
42 
43 typedef struct geo_iocntl_s {
44     geo_common_t	common;		/* No additional fields needed */
45 } geo_iocntl_t;
46 
47 typedef struct geo_pcicard_s {
48     geo_iocntl_t	common;
49     char		bus;	/* Bus/widget number */
50     char		slot;	/* PCI slot number */
51 } geo_pcicard_t;
52 
53 /* Subcomponents of a node */
54 typedef struct geo_cpu_s {
55     geo_node_t	node;
56     char	slice;		/* Which CPU on the node */
57 } geo_cpu_t;
58 
59 typedef struct geo_mem_s {
60     geo_node_t	node;
61     char	membus;		/* The memory bus on the node */
62     char	memslot;	/* The memory slot on the bus */
63 } geo_mem_t;
64 
65 
66 typedef union geoid_u {
67     geo_common_t	common;
68     geo_node_t		node;
69     geo_iocntl_t	iocntl;
70     geo_pcicard_t	pcicard;
71     geo_rtr_t		rtr;
72     geo_cpu_t		cpu;
73     geo_mem_t		mem;
74     char		padsize[GEOID_SIZE];
75 } geoid_t;
76 
77 
78 /* Preprocessor macros */
79 
80 #define GEO_MAX_LEN	48	/* max. formatted length, plus some pad:
81 				   module/001c07/slab/5/node/memory/2/slot/4 */
82 
83 /* Values for geo_type_t */
84 #define GEO_TYPE_INVALID	0
85 #define GEO_TYPE_MODULE		1
86 #define GEO_TYPE_NODE		2
87 #define GEO_TYPE_RTR		3
88 #define GEO_TYPE_IOCNTL		4
89 #define GEO_TYPE_IOCARD		5
90 #define GEO_TYPE_CPU		6
91 #define GEO_TYPE_MEM		7
92 #define GEO_TYPE_MAX		(GEO_TYPE_MEM+1)
93 
94 /* Parameter for hwcfg_format_geoid_compt() */
95 #define GEO_COMPT_MODULE	1
96 #define GEO_COMPT_SLAB		2
97 #define GEO_COMPT_IOBUS		3
98 #define GEO_COMPT_IOSLOT	4
99 #define GEO_COMPT_CPU		5
100 #define GEO_COMPT_MEMBUS	6
101 #define GEO_COMPT_MEMSLOT	7
102 
103 #define GEO_INVALID_STR		"<invalid>"
104 
105 #define INVALID_NASID           ((nasid_t)-1)
106 #define INVALID_CNODEID         ((cnodeid_t)-1)
107 #define INVALID_PNODEID         ((pnodeid_t)-1)
108 #define INVALID_SLAB            (slabid_t)-1
109 #define INVALID_SLOT            (slotid_t)-1
110 #define INVALID_MODULE          ((moduleid_t)-1)
111 
geo_slab(geoid_t g)112 static inline slabid_t geo_slab(geoid_t g)
113 {
114 	return (g.common.type == GEO_TYPE_INVALID) ?
115 		INVALID_SLAB : g.common.slab;
116 }
117 
geo_slot(geoid_t g)118 static inline slotid_t geo_slot(geoid_t g)
119 {
120 	return (g.common.type == GEO_TYPE_INVALID) ?
121 		INVALID_SLOT : g.common.slot;
122 }
123 
geo_module(geoid_t g)124 static inline moduleid_t geo_module(geoid_t g)
125 {
126 	return (g.common.type == GEO_TYPE_INVALID) ?
127 		INVALID_MODULE : g.common.module;
128 }
129 
130 extern geoid_t cnodeid_get_geoid(cnodeid_t cnode);
131 
132 #endif /* _ASM_IA64_SN_GEO_H */
133