summaryrefslogtreecommitdiff
path: root/usr/src/uts/sun4u/starfire/sys/pda.h
blob: 0725f453470552a701016b50668c0ed03fe7e0e5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 1998-2003 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SYS_PDA_H
#define	_SYS_PDA_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifdef	__cplusplus
extern "C" {
#endif

#include <sys/types.h>

/*
 * Contains definitions used for PDA (Post Descriptor Array) [post2obp]
 * support.
 *
 * XXX - These data structures is defined in SSP-land in:
 *	 src/post/export/xf_postif.h.  It is not anticipated
 *	 that any future changes will be made to this data
 *	 structure so we'll allow this hack on this go around.
 */

#define	MAX_ABUSES		4	/* Address buses */
#define	MAX_DBUSES		2	/* Data buses */

#define	MAX_SYSBDS		16	/* no more than 16 system boards */
#define	MAX_PROCMODS		4	/* Per system board */
#define	MAX_PC			3	/* Per system board */
#define	MAX_XDB			4	/* Per system board */
#define	MAX_CIC			4	/* Per system board */
#define	MAX_MGROUPS		4	/* Per MC and system board */
#define	MAX_IOCS		2	/* Per system board */
#define	MAX_SLOTS_PER_IOC	4	/* Per ioc */

typedef struct {
	ushort_t	bda_board;		/* BDAN 0|Anyred|mem|Board */
	ushort_t	bda_proc;		/* BDAN Processor 3:0	*/
	ushort_t	bda_pc;			/* BDAN PC asic 2:0	*/
	ushort_t	bda_xdb;		/* BDAN XDB asic 3:0	*/
	ushort_t	bda_cic;		/* BDAN CIC asic 3:0	*/
	ushort_t	bda_ldpath;		/* BDAN 0|0| ldpath [dbus] */
	ushort_t	bda_ioc;		/* BDAN 0|0| ioc 1:0	*/
	ushort_t	bda_ios[MAX_IOCS];	/* BDAN Scard 3:0	*/
	ushort_t	bda_mgroup;		/* BDAN memory group 3:0 */
} board_desc_t;

typedef struct {
	ushort_t	bada_proc [MAX_PROCMODS];  /* Extra status on procs */
	uchar_t		bada_iom_type;		/* I/O module type. */
	uchar_t		bada_fill[3];
	ushort_t	bada_ioc[MAX_IOCS];	/* Extra status on iocs	*/
} board_auxdesc_t;

/*
 * The three lsb of bada_proc holds the ecache size of that proc
 * module, as (log-base-2 - 19), so 1/2 MB is 0, 1 MB is 1, ...
 * 32 MB is 6. 7 is a bogus value.
 */
#define	BADA_PROC_GET_ECL2M19(bada_proc)	((bada_proc) & 0x7)

typedef struct {
	uint32_t	bmda_adr;		/* MC ADR */
	uint32_t	bmda_gab_bank_sel;	/* MC gab bank sel reg */
	ushort_t	bmda_bank_setup;	/* MC gab bank setup reg */
	ushort_t	bmda_filler;
	int32_t		bmda_badpage[MAX_MGROUPS];
						/*
						 * One bad page offset per
						 * mgroup is allowed. No
						 * bad page if < 0.
						 */
} board_mdesc_t;

/*
 * BDA nibble status definitions:
 * These are ordered in terms of preserving interesting information
 * in POST displays where all configurations are displayed in a
 * single value. The highest value for a resource over all
 * configurations is shown.
 * Of course, this is just for help to engineers/technicians in
 * understanding what happened; for the most part, everything
 * except "GOOD" is just different flavors of "BAD".
 * Note the special macro SET_BDA_NBL_CRUNCH below which requires
 * that BDAN_CRUNCH be 0.
 */
#define	BDAN_CRUNCH	0x0		/* Unusable by implication */
#define	BDAN_UNDEFINED	0x1		/* Architecturally Missing */
#define	BDAN_MISS	0x2		/* Missing */
#define	BDAN_FAIL	0x3		/* Tested and failed */
#define	BDAN_BLACK	0x4		/* Blacklisted */
#define	BDAN_RED	0x5		/* Redlisted */
#define	BDAN_EXCLUDED	0x6		/* Board is not in this domain */
#define	BDAN_UNCONFIG	0x7		/* Good, but not in config. */
#define	BDAN_GOOD	0x8		/* Like it says. */
#define	BDAN_MASK	0xF


/* Macros for accessing BDA nibbles */
#define	BDA_NBL(shrt, nibix) \
		(((shrt) >> ((nibix) << 2)) & BDAN_MASK)
#define	SET_BDA_NBL(shrt, nibix, val) \
{ \
	shrt &= ~(BDAN_MASK << ((nibix) << 2)); \
	shrt |= (val) << ((nibix) << 2); \
}

/*
 * This exists to keep lint from complaining about statements with
 * null efect when we OR in a constant 0 in SET_BDA_NBL. It's a pain,
 * but it does save the code optimizer some work. ;-{
 */
#define	SET_BDA_NBL_CRUNCH(shrt, nibix) \
		(shrt &= ~(BDAN_MASK << ((nibix) << 2)))

/* Definitions for nibbles in the bda_board element: */
#define	BDA_GEN_NBL	0	/* Overall state of the board */
#define	BDA_MC_NBL	1	/* State of the memory. */
/*
 * BDAN_RED if anything red on board, or board is BDAN_EXCLUDED;
 * otherwise BDAN_GOOD
 */
#define	BDA_ANYRED_NBL	2
/*
 * Macro BDA_PAGESHIFT hides Solaris page size to Starfire POST, as POST
 * assumes Solaris basic page size as 8K.
 * Note: Only BDA_PAGESHIFT is used, BDA_PAGESIZE is added for readability.
 */
#define	BDA_PAGESHIFT	13
#define	BDA_PAGESIZE	(1<<BDA_PAGESHIFT)

typedef struct {			/* Memory Total Descriptor */
	int32_t	Memt_NumPages;		/* 8 KB each */
	int32_t	Memt_NumChunks;
} MemoryTotal_t;

typedef struct {				/* Chunk Descriptor */
	uint32_t	Memc_StartAddress;	/* In 8 KB pages */
	int32_t		Memc_Size;		/* In 8 KB pages */
} MemChunk_t;


#define	P2OBP_MAGIC	"XFPOST_2OBP"
#define	VAR_ARRAY_LEN	1

typedef struct {
	char		p2o_magic[12];		/* magic cookie = P2OBP_MAGIC */
	int32_t		p2o_struct_version;	/* equal to P2OBP_VERSION */
	uint32_t	p2o_csum;		/* sum(uint[]) */
	uint32_t	p2o_post_time;		/* creation time */
	uint32_t	p2o_post_pid;		/* pid of sequencer on SSP */
	uint32_t	p2o_post_level;		/* level at which hpost ran */
	short		p2o_abus_mask;		/* [3:0] = Valid PA buses */
						/* [5:4] = bus shuffle mode */
	short		p2o_dbus_mask;		/* Valid physdata buses */
	uint32_t	p2o_intercon_freq;	/* hz */
	uint32_t	p2o_procssor_freq;	/* hz */
	int32_t		p2o_post_private;
	uint32_t	p2o_flags;		/* See P2OFLAG_XXX */
	uchar_t		p2o_procint_intx_freq_ratio;	/* 0 if not known */
	uchar_t		p2o_fill_byte[3];
	uint_t		p2o_filler[6];		/* for expansion */
	board_desc_t	p2o_bdinfo[MAX_SYSBDS];
	board_mdesc_t	p2o_bdminfo[MAX_SYSBDS];
	board_auxdesc_t	p2o_auxinfo[MAX_SYSBDS];
	MemoryTotal_t	p2o_memtotal;
	/*
	 * Array of descriptors of existing memory.
	 * Number of descriptors is given in memtotal.NumChunks.
	 */
	MemChunk_t	p2o_mchunks[VAR_ARRAY_LEN];
} post2obp_info_t;

#ifdef _KERNEL
/*
 * Following definitions in support of DR.
 */
typedef void		*pda_handle_t;

extern pda_handle_t	pda_open();
extern void		pda_close(pda_handle_t ph);
extern int		pda_board_present(pda_handle_t ph, int boardnum);
extern void		*pda_get_board_info(pda_handle_t ph, int boardnum);
extern uint_t		pda_get_mem_size(pda_handle_t ph, int boardnum);
extern void		pda_mem_add_span(pda_handle_t ph,
						uint64_t basepa,
						uint64_t nbytes);
extern void		pda_mem_del_span(pda_handle_t ph,
						uint64_t basepa,
						uint64_t nbytes);
extern void		pda_mem_sync(pda_handle_t ph, int board, int unit);
extern void		pda_get_busmask(pda_handle_t ph,
						short *amask, short *dmask);
extern int		pda_is_valid(pda_handle_t ph);

#endif /* _KERNEL */

#ifdef	__cplusplus
}
#endif

#endif /* _SYS_PDA_H */