|  | /* | 
|  | * 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-2005 Silicon Graphics, Inc. All rights reserved. | 
|  | */ | 
|  |  | 
|  | #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. */ | 
|  |  | 
|  | #define MAX_SLOTS	0xf	/* slots per module */ | 
|  | #define MAX_SLABS	0xf	/* slabs per slot */ | 
|  |  | 
|  | typedef unsigned char	geo_type_t; | 
|  |  | 
|  | /* Fields common to all substructures */ | 
|  | typedef struct geo_common_s { | 
|  | 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 */ | 
|  | slabid_t	slab:4;		/* slab (ASIC), 0 .. 15 within slot */ | 
|  | slotid_t	slot:4;		/* slot (Blade), 0 .. 15 within module */ | 
|  | } geo_common_t; | 
|  |  | 
|  | /* Additional fields for particular types of hardware */ | 
|  | typedef struct geo_node_s { | 
|  | geo_common_t	common;		/* No additional fields needed */ | 
|  | } geo_node_t; | 
|  |  | 
|  | typedef struct geo_rtr_s { | 
|  | geo_common_t	common;		/* No additional fields needed */ | 
|  | } geo_rtr_t; | 
|  |  | 
|  | typedef struct geo_iocntl_s { | 
|  | geo_common_t	common;		/* No additional fields needed */ | 
|  | } geo_iocntl_t; | 
|  |  | 
|  | typedef struct geo_pcicard_s { | 
|  | geo_iocntl_t	common; | 
|  | 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 { | 
|  | geo_common_t	common; | 
|  | geo_node_t		node; | 
|  | geo_iocntl_t	iocntl; | 
|  | geo_pcicard_t	pcicard; | 
|  | geo_rtr_t		rtr; | 
|  | geo_cpu_t		cpu; | 
|  | geo_mem_t		mem; | 
|  | char		padsize[GEOID_SIZE]; | 
|  | } 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 | 
|  | #define INVALID_SLOT            (slotid_t)-1 | 
|  | #define INVALID_MODULE          ((moduleid_t)-1) | 
|  |  | 
|  | static inline slabid_t geo_slab(geoid_t g) | 
|  | { | 
|  | 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; | 
|  | } | 
|  |  | 
|  | static inline moduleid_t geo_module(geoid_t g) | 
|  | { | 
|  | return (g.common.type == GEO_TYPE_INVALID) ? | 
|  | INVALID_MODULE : g.common.module; | 
|  | } | 
|  |  | 
|  | extern geoid_t cnodeid_get_geoid(cnodeid_t cnode); | 
|  |  | 
|  | #endif /* _ASM_IA64_SN_GEO_H */ |