xref: /netbsd/sys/arch/rs6000/include/iplcb.h (revision b2f3a04f)
1 /* $NetBSD: iplcb.h,v 1.2 2015/07/11 10:32:46 kamil Exp $ */
2 
3 /* Structure for the IPL Control Block on RS/6000 machines */
4 
5 #ifndef _IPLCB_H_
6 #define _IPLCB_H_
7 
8 #define MAX_BUCS 32
9 
10 struct ipl_directory {
11 	char		iplcb_id[8];	/* ascii string id */
12 	uint32_t	gpr_save_off;	/* offset to gpr_save area */
13 	uint32_t	cb_bitmap_size;	/* size of bitmap and CB */
14 	uint32_t	bitmap_off;	/* offset to bitmap */
15 	uint32_t	bitmap_size;	/* size of bitmap */
16 	uint32_t	iplinfo_off;
17 	uint32_t	iplinfo_size;
18 	uint32_t	iocc_post_off;
19 	uint32_t	iocc_post_size;
20 	uint32_t	nio_post_off;
21 	uint32_t	nio_post_size;
22 	uint32_t	sjl_post_off;
23 	uint32_t	sjl_post_size;
24 	uint32_t	scsi_post_off;
25 	uint32_t	scsi_post_size;
26 	uint32_t	eth_post_off;
27 	uint32_t	eth_post_size;
28 	uint32_t	tok_post_off;
29 	uint32_t	tok_post_size;
30 	uint32_t	ser_post_off;
31 	uint32_t	ser_post_size;
32 	uint32_t	par_post_off;
33 	uint32_t	par_post_size;
34 	uint32_t	rsc_post_off;
35 	uint32_t	rsc_post_size;
36 	uint32_t	lega_post_off;
37 	uint32_t	lega_post_size;
38 	uint32_t	kbd_post_off;
39 	uint32_t	kbd_post_size;
40 	uint32_t	ram_post_off;
41 	uint32_t	ram_post_size;
42 	uint32_t	sga_post_off;
43 	uint32_t	sga_post_size;
44 	uint32_t	fm2_post_off;
45 	uint32_t	fm2_post_size;
46 	uint32_t	net_boot_result_off;
47 	uint32_t	net_boot_result_size;
48 	uint32_t	csc_result_off;
49 	uint32_t	csc_result_size;
50 	uint32_t	menu_result_off;
51 	uint32_t	menu_result_size;
52 	uint32_t	cons_result_off;
53 	uint32_t	cons_result_size;
54 	uint32_t	diag_result_off;
55 	uint32_t	diag_result_size;
56 	uint32_t	rom_scan_off;		/* pres of ROMSCAN adaptor */
57 	uint32_t	rom_scan_size;
58 	uint32_t	sky_post_off;
59 	uint32_t	sky_post_size;
60 	uint32_t	global_off;
61 	uint32_t	global_size;
62 	uint32_t	mouse_off;
63 	uint32_t	mouse_size;
64 	uint32_t	vrs_off;
65 	uint32_t	vrs_size;
66 	uint32_t	taur_post_off;
67 	uint32_t	taur_post_size;
68 	uint32_t	ent_post_off;
69 	uint32_t	ent_post_size;
70 	uint32_t	vrs40_off;
71 	uint32_t	vrs40_size;
72 	uint32_t	gpr_save_area1[64];
73 	uint32_t	sysinfo_offset;
74 	uint32_t	sysinfo_size;
75 	uint32_t	bucinfo_off;
76 	uint32_t	bucinfo_size;
77 	uint32_t	procinfo_off;
78 	uint32_t	procinfo_size;
79 	uint32_t	fm2_ioinfo_off;
80 	uint32_t	fm2_ioinfo_size;
81 	uint32_t	proc_post_off;
82 	uint32_t	proc_post_size;
83 	uint32_t	sysvpd_off;
84 	uint32_t	sysvpd_size;
85 	uint32_t	memdata_off;
86 	uint32_t	memdata_size;
87 	uint32_t	l2data_off;
88 	uint32_t	l2data_size;
89 	uint32_t	fddi_post_off;
90 	uint32_t	fddi_post_size;
91 	uint32_t	golden_vpd_off;
92 	uint32_t	golden_vpd_size;
93 	uint32_t	nvram_cache_off;
94 	uint32_t	nvram_cache_size;
95 	uint32_t	user_struct_off;
96 	uint32_t	user_struct_size;
97 	uint32_t	residual_off;
98 	uint32_t	residual_size;
99 };
100 
101 struct ipl_cb {
102 	uint32_t		gpr_save[32];
103 	struct ipl_directory	dir;
104 };
105 
106 struct sys_info {
107 	int		nrof_procs;
108 	int		coherency_size;	/* size of coherence block */
109 	int		resv_size;	/* size of reservation granule */
110 	u_char		*arb_ctrl_addr;	/* real addr of arbiter control reg */
111 	u_char		*phys_id_addr;	/* real addr of phys id reg */
112 	int		nrof_bsrr;	/* nrof 4 byte bos slot reset regs */
113 	u_char		*bssr_addr;	/* real addr of bssr */
114 	int		tod_type;	/* time of day type */
115 	u_char		*todr_addr;	/* real address of todr regs */
116 	u_char		*rsr_addr;	/* real address of reset status reg */
117 	u_char		*pksr_addr;	/* RA of power/keylock status reg */
118 	u_char		*prcr_addr;	/* RA of power/reset control reg */
119 	u_char		*sssr_addr;	/* RA of system specific regs */
120 	u_char		*sir_addr;	/* RA of system intr regs */
121 	u_char		*scr_addr;	/* RA of standard conf reg */
122 	u_char		*dscr_addr;	/* RA of dev spec. config reg */
123 	int		nvram_size;	/* in bytes */
124 	u_char		*nvram_addr;	/* RA of nvram */
125 	u_char		*vpd_rom_addr;	/* RA of VPD ROM space */
126 	int		ipl_rom_size;	/* in bytes */
127 	u_char		*ipl_rom_addr;	/* RA of IPL ROM space */
128 	u_char		*g_mfrr_addr;	/* RA of global mffr reg if != 0 */
129 	u_char		*g_tb_addr;	/* RA of global timebase if != 0 */
130 	int		g_tb_type;	/* global timebase type */
131 	int		g_tb_mult;	/* global timebase multiplier */
132 	int		sp_errorlog_off;/* offset from BA of NVRAM to
133 					 * service processor error log tbl */
134 	u_char		*pcccr_addr;	/* RA of connectivity config reg */
135 	u_char		*spocr_addr;	/* RA of software power off ctrl reg */
136 	u_char		*pfeivr_addr;	/* RA of EPOW ext intr reg */
137 	/* Available Processor Mask interface */
138 	int		access_id_waddr;/* type of access to loc_waddr */
139 	u_char		*loc_waddr;	/* RA of APM space write */
140 	int		access_id_raddr;/* type of access to loc_raddr */
141 	u_char		*loc_raddr;	/* RA of APM space read */
142 	int		architecture;	/* Architecutre of this box:
143 					 * RS6K = 1 = rs/6000 old mca
144 					 * RSPC = 2 = PReP */
145 	int		implementation;
146 		/* Implementation of this box:
147 		 * RS6K_UP_MCA = 1 = POWER1, POWER2, RSC, PPC single proc
148 		 * RS6K_SMP_MCA = 2 = PPC SMP
149 		 * RSCP_UP_PCI = 3 = PPC/PReP single proc
150 		 */
151 	char		pkg_desc[16];	/* NULL term ASCII string: */
152 		/* "rs6k" POWER1, POWER2, RSC, PPC single proc
153 		 * "rs6ksmp" PPC SMP
154 		 * "rspc" PReP
155 		 */
156 };
157 
158 typedef struct buid_data {
159 	int		buid_value;	/* assigned BUID value.
160 		* values only have meaning if nrof_buids != 0.
161 		* assigned in order until nrof_buids is satisfied, unused
162 		* ones will be -1
163 		*/
164 	u_char		*buid_sptr;	/* pointer to buid's post structure */
165 } buid_data_t;
166 
167 struct buc_info {
168 	uint32_t	nrof_structs;	/* nrof bucs present */
169 	uint32_t	index;		/* 0 <= index <= num_of_structs - 1 */
170 	uint32_t	struct_size;	/* in bytes */
171 	int		bsrr_off;	/* bus slot reset reg offset */
172 	uint32_t	bsrr_mask;	/* bssr mask */
173 	int		bscr_val;	/* config register value to enable */
174 	int		cfg_status;	/* 0 buc not configured
175 					 * 1 buc configd via config regs
176 					 * 2 configd via hardware defaults
177 					 * -1 config failed */
178 	int		dev_type;	/* 1 buc is executable memory
179 					 * 2 buc is a processor
180 					 * 3 buc is an io type */
181 	int		nrof_buids;	/* nrof buids needed by buc <=4 */
182 	buid_data_t	buid_data[4];
183 	int		mem_alloc1;	/* 1st mem alloc required in MB */
184 	u_char 		*mem_addr1;	/* RA of mem_alloc1 area */
185 	int		mem_alloc2;	/* 2nd mem alloc required */
186 	u_char		*mem_addr2;	/* RA of mem_alloc2 area */
187 	int		vpd_rom_width;	/* width of vpd interface in bytes */
188 	int		cfg_addr_incr;	/* config addr increment in bytes */
189 	int		device_id_reg;	/* std. config reg contents */
190 	uint32_t	aux_info_off;	/* iplcb offset to the device specific
191 					 * array for this buc. ie, if this is
192 					 * a proc, offset is the
193 					 * processor_info struct.
194 					 */
195 	uint32_t	feature_rom_code; /* romscan post flag */
196 	uint32_t	IOCC_flag;	/* 0 not IOCC 1 = IOCC */
197 	char		location[4];	/* location of the BUC */
198 };
199 
200 struct proc_info {
201 	uint32_t	nrof_structs;
202 	uint32_t	index;
203 	uint32_t	struct_size;
204 	uint32_t	per_buc_info_off; /* iplcb offset to buc_info for me */
205 	u_char		*proc_int_area;
206 		/* Base Addr of this proc's intr presentation layer regs
207 		 * BA+0 (CPPR||XISR without side effects)
208 		 * BA+4 (CPPR||XISR with side effects)
209 		 * BA+8 (DSIER)
210 		 * BA+12 (MFRR)
211 		 * BA+xx (Additional Optional MFRR's)
212 		 */
213 	uint32_t	proc_int_area_size; /* size/4 == nrof intr pres regs */
214 	int		proc_present;	/* 0 no, -1 dead, 1 running, 2 loop
215 					 * 3 reset state */
216 	uint32_t	test_run;	/* which tests were run on proc */
217 	uint32_t	test_stat;	/* test status */
218 	int		link;		/* 0 = loop until nonzero !=0 branch to
219 					 * link addr */
220 	u_char		*lind_addr;	/* see above */
221 	union {
222 		uint32_t 	p_id;	/* unique proc id */
223 		struct {
224 			uint16_t	p_nodeid; /* phys NUMA nodeid */
225 			uint16_t	p_cpuid;  /* phys cpu id */
226 		} s0;
227 	} u0;
228 	int 		architecture;	/* proc arch */
229 	int		implementation;	/* proc type */
230 	int		version;	/* proc version */
231 	int		width;		/* proc data word size */
232 	int		cache_attrib;	/* bit 0 = cache not, cache is present
233 					 * bit 1 = separate cache/combined */
234 	int		coherency_size;	/* size of coherence block */
235 	int		resv_size;	/* size of reservation granule */
236 	int		icache_block;	/* L1 icache block size */
237 	int		dcache_block;	/* L1 dcache block size */
238 	int		icache_size;	/* L1 icache size */
239 	int		dcache_size;	/* L1 dcache size */
240 	int		icache_line;	/* L1 icache line size */
241 	int		dcache_line;	/* L1 dcache line size */
242 	int		icache_asc;	/* L1 icache associativity */
243 	int		dcache_asc;	/* L1 dcache associativity */
244 	int		L2_cache_size;	/* L2 cache size */
245 	int		L2_cach_asc;	/* L2 cache associativity */
246 	int		tlb_attrib;	/* tlb buffer attribute bitfield
247 					 * 0  present/not present
248 					 * 1  separate/combined i/d
249 					 * 4  proc supports tlbia */
250 	int		itlb_size;	/* entries */
251 	int		dtlb_size;
252 	int		itlb_asc;
253 	int		dtlb_asc;
254 	int		slb_attrib;	/* segment lookaside buffer bitfield
255 					 * 0 slb not/present
256 					 * 1 separate/combined i/d */
257 	int		islb_size;	/* entries */
258 	int		dslb_size;
259 	int		islb_asc;
260 	int		dslb_asc;
261 	int		priv_lck_cnt;	/* spin lock count */
262 	int		rtc_type;	/* RTC type */
263 	int		rtcXint;	/* nanosec per timebase tick int mult*/
264 	int		rtcXfrac;	/* same, but fraction multiplier */
265 	int		bus_freq;	/* bus clock in Hz */
266 	int		tb_freq;	/* time base clockfreq */
267 	char		proc_desc[16];	/* processor name ASCII string */
268 };
269 
270 /* One SIMM is a nibble wide and will have the value of:
271  * 0x0 == good or 0xf == bad
272  */
273 struct simm_def {
274 	u_char		simm_7and8;
275 	u_char		simm_3and4;
276 	u_char		simm_5and6;
277 	u_char		simm_1and2;
278 };
279 
280 /*
281  * The IPL Info structure is mostly good for telling us the cache sizes and
282  * model codes.  The whole thing is unreasonably large and verbose.
283  */
284 
285 struct ipl_info {
286 	/* IPL controller and device interface routine */
287 	u_char		*iplcnd_ptr;		/* ROM Reserved */
288 	uint32_t	iplcnd_size;
289 	/* NVRAM expansion code */
290 	u_char		*nvram_exp_ptr; 	/* ROM Reserved */
291 	uint32_t	nvram_exp_size;
292 	/* IPL ROM stack high addr */
293 	u_char		*ipl_ros_stack_ptr;	/* ROM Reserved */
294 	uint32_t	ipl_ros_stack_size;
295 	/* IPL Record */
296 	u_char		*ipl_rec_ptr;		/* ROM Reserved */
297 	uint32_t	ipl_rec_size;
298 	/* Lowest addr needed by IPL ROM */
299 	u_char		*ros_workarea_lwm;	/* ROM Reserved */
300 	/* IPL ROM entry table. t=0, SR15 */
301 	u_char		*ros_entry_tbl_ptr;	/* ROM Reserved */
302 	uint32_t	ros_entry_tbl_size;
303 	/* Memory bit maps nrof bytes per bit.  16K/bit */
304 	uint32_t	bit_map_bytes_per_bit;	/* ROM Reserved */
305 	/* Highest addressable real address byte + 1. */
306 	uint32_t	ram_size;		/* ROM Reserved */
307 	/*
308 	 * Model Field:
309 	 * 0xWWXXYYZZ
310 	 * WW == 0x00. hardware is SGR ss32 or ss64. (ss is speed in MHz)
311 	 * 	icache is 8k.
312 	 *	XX == reserved
313 	 *	YY == reserved
314 	 *	ZZ == model code:
315 	 *		bits 0,1 (low order) == style
316 	 *			00=Tower 01=Desktop 10=Rack 11=Reserved
317 	 *		bits 2,3 == relative speed
318 	 *			00=slow 01=Medium 10=High 11=Fast
319 	 *		bit 4 == number of combo chips
320 	 *			0 = 2 chips. 1 = 1 chip.
321 	 *		bit 5 == Number of DCU's.
322 	 *			0 = 4 DCU's cache is 64k.
323 	 *			1 = 2 DCU's cache is 32K.
324 	 *		bits 6,7 = Reserved
325 	 * WW != 0x00:
326 	 * WW == 0x01. Hardware is SGR ss32 or ss64 RS1. (POWER)
327 	 * WW == 0x02. RSC (RISC Single Chip)
328 	 * WW == 0x04. POWER2/RS2
329 	 * WW == 0x08. PowerPC
330 	 *	XX == Package type
331 	 *		bits 0,1 (low order) == style
332 	 *			00=Tower 01=Desktop 10=Rack 11=Entry Server
333 	 *		bit 2 - AIX Hardware verification test supp (rspc)
334 	 *		bit 3 - AIX Hardware error log analysis supp (rspc)
335 	 *		bit 4-7 reserved
336 	 *	YY == Reserved
337 	 *	ZZ == Model code. (useless)
338 	 *	Icache K size is obtained from entry icache.
339 	 *	Dcache K size is obtained from entry dcache.
340 	 */
341 	uint32_t 	model;
342 	/* Power status and keylock register decode.  IO Addr 0x4000E4.
343 	 * 32bit reg:
344 	 * Power Status		bits 0-9
345 	 * Reserved		bits 10-27
346 	 * Keylock decode	bits 28-31: (X == don't care)
347 	 *	28 29 30 31
348 	 *	 1  1  X  X	Workstation
349 	 * 	 0  1  X  X	Supermini
350 	 *	 0  0  X  X	Expansion
351 	 *	 X  X  1  1	Normal mode
352 	 *	 X  X  1  0	Service mode
353 	 *	 X  X  0  1	Secure mode
354 	 */
355 	uint32_t	powkey_reg;		/* ROM Reserved */
356 	/* Set to zero during power on, inc'd with each warm IPL */
357 	int32_t		soft_reboot_count;
358 	/* Set and used by IPL controller, all are ROM Reserved */
359 	int32_t		nvram_section1_valid;	/* 0 if CRC bad */
360 	int32_t		nvram_exp_valid;	/* 0 if CRC bad */
361 	u_char		prevboot_dev[36];	/* last normal mode ipl */
362 	char		reserved[28];
363 	/* Pointer to the IPLCB in memory */
364 	u_char		*iplcb_ptr;		/* ROM Reserved */
365 	/* Pointer to compressed BIOS code */
366 	u_char		*bios_ptr;		/* ROM Reserved */
367 	uint32_t	bios_size;
368 	uint32_t	cre[16];	/* Storage Configuration Registers. */
369 	uint32_t	bscr[16];	/* Bit steering registers */
370 	/* Unimplemented and ROM Reserved */
371 	struct {
372 		uint32_t	synd;
373 		uint32_t	addr;
374 		uint32_t	status;
375 	} single_bit_error[16];
376 	uint32_t	reserved_array[5*16];
377 	/* Memory extent test indicators */
378 	u_char		extent_test_ind[16];	/* 0 = untested, 1 = tested */
379 	/* Memory bit steering register settig conflict indicator */
380 	u_char		bit_steer_conflict[16];	/* 1 = conflict */
381 	/* Set by IPL controller, ROM Reserved */
382 	uint32_t	ipl_ledval;	/* IPL LED value */
383 	uint32_t	ipl_device;	/* ??? */
384 	char		unused[18];
385 
386 	/* Copied from IPL Rom VPD area */
387 	char		vpd_planar_partno[8];
388 	char		vpd_planar_ecno[8];
389 	char		vpd_proc_serialno[8];
390 	char		vpd_ipl_ros_partno[8];
391 	char		vpd_ipl_ros_version[14];
392 	char		ipl_ros_copyright[49];
393 	char		ipl_ros_timestamp[10];
394 
395 	/* Copied from NVRAM */
396 	union {
397 		uint32_t	chip_signature;
398 		struct chip_sig {
399 			u_char	cop_bus_addr;
400 			u_char	obsolete_u_num;
401 			u_char	dd_num;
402 			u_char	partno;
403 		} chip_sig;
404 	} floating_point, fixed_point, instruction_cache_unit,
405 	  storage_control_unit, combo_1, combo_2, data_control_unit_0,
406 	  data_control_unit_1, data_control_unit_2, data_control_unit_3;
407 
408 	/* Memory SIMM error information.
409 	 * 8 cards (A-H) 8 simms per card (1-8).
410 	 * Two cache line sizes.  if 128 use memory_card_1n data,
411 	 * otherwise use memory_card_9n or memory_card_Tn.
412 	 */
413 	union {
414 		char		memcd_errinfo[32];
415 		uint32_t	slots_of_simm[8];
416 		struct {	/* cache line size 128 */
417 			struct simm_def	memory_card_1H;
418 			struct simm_def	memory_card_1F;
419 			struct simm_def	memory_card_1G;
420 			struct simm_def	memory_card_1E;
421 			struct simm_def	memory_card_1D;
422 			struct simm_def	memory_card_1B;
423 			struct simm_def	memory_card_1C;
424 			struct simm_def	memory_card_1A;
425 		} simm_stuff_1;
426 		struct {	/* cache line size 64 */
427 			struct simm_def memory_card_9H;
428 			struct simm_def memory_card_9D;
429 			struct simm_def memory_card_9F;
430 			struct simm_def memory_card_9B;
431 			struct simm_def memory_card_9G;
432 			struct simm_def memory_card_9C;
433 			struct simm_def memory_card_9E;
434 			struct simm_def memory_card_9A;
435 		} simm_stuff_9;
436 		struct {	/* cache line size 64 */
437 			struct simm_def memory_card_TB;
438 			struct simm_def memory_card_TC;
439 		} simm_stuff_T;
440 	} simm_info;
441 
442 	/* MESR error info at IPL ROM memory config time.
443 	 * Two cache line sizes, similar to above.
444 	 *   find one of the following values in the word variable:
445 	 *	0x00000000 no MESR error occurred when configuring this extent
446 	 *	0xe0400000 timeout. no memcard is in the slot.
447 	 *	otherwise, an error occurred, so the card exists but will not
448 	 *	be used.
449 	 */
450 	union {
451 		char	extent_errinfo[64];
452 		struct {  /* cacheline 128 */
453 			uint32_t	ext_0_slot_HandD;
454 			uint32_t	ext_1_slot_HandD;
455 			uint32_t	ext_2_slot_HandD;
456 			uint32_t	ext_3_slot_HandD;
457 			uint32_t	ext_4_slot_FandB;
458 			uint32_t	ext_5_slot_FandB;
459 			uint32_t	ext_6_slot_FandB;
460 			uint32_t	ext_7_slot_FandB;
461 			uint32_t	ext_8_slot_GandC;
462 			uint32_t	ext_9_slot_GandC;
463 			uint32_t	ext_10_slot_GandC;
464 			uint32_t	ext_11_slot_GandC;
465 			uint32_t	ext_12_slot_EandA;
466 			uint32_t	ext_13_slot_EandA;
467 			uint32_t	ext_14_slot_EandA;
468 			uint32_t	ext_15_slot_EandA;
469 		} MESR_err_1;
470 		struct { /* cacheline of 64 */
471 			uint32_t	ext_0_slot_H;
472 			uint32_t	ext_1_slot_H;
473 			uint32_t	ext_2_slot_D;
474 			uint32_t	ext_3_slot_D;
475 			uint32_t	ext_4_slot_F;
476 			uint32_t	ext_5_slot_F;
477 			uint32_t	ext_6_slot_B;
478 			uint32_t	ext_7_slot_B;
479 			uint32_t	ext_8_slot_G;
480 			uint32_t	ext_9_slot_G;
481 			uint32_t	ext_10_slot_C;
482 			uint32_t	ext_11_slot_C;
483 			uint32_t	ext_12_slot_E;
484 			uint32_t	ext_13_slot_E;
485 			uint32_t	ext_14_slot_A;
486 			uint32_t	ext_15_slot_A;
487 		} MESR_err_9;
488 	} config_err_info;
489 	char		unused_errinfo[64];
490 
491 	/*
492 	 * Memory card VPD data area
493 	 * cacheline sizes like above.
494 	 *	0xffffffff = card is present, no VPD
495 	 *	0x22222222 = card present with errors
496 	 *	0x11111111 = no card
497 	 *	otherwise it's good.
498 	 */
499 	union {
500 		char	memcd_vpd[128];
501 		struct {  /* cacheline 128 */
502 			char	ext_0_HandD[20];
503 			char	ext_4_FandB[20];
504 			char	ext_8_GandC[20];
505 			char	ext_12_EandA[20];
506 		} memory_vpd_1;
507 		struct { /* cacheline 64 */
508 			char	ext_0_slot_H[10];
509 			char	dmy_0[2];
510 			char	ext_2_slot_D[10];
511 			char	dmy_2[2];
512 			char	ext_4_slot_F[10];
513 			char	dmy_4[2];
514 			char	ext_6_slot_B[10];
515 			char	dmy_6[2];
516 			char	ext_8_slot_G[10];
517 			char	dmy_8[2];
518 			char	ext_10_slot_C[10];
519 			char	dmy_10[2];
520 			char	ext_12_slot_E[10];
521 			char	dmy_12[2];
522 			char	ext_14_slot_A[10];
523 			char	dmy_14[2];
524 		} memory_vpd_9;
525 	} memcd_vpd;
526 
527 	int32_t		cache_line_size;
528 	/* Component reset register test results for BUID 20.
529 	 * Anything other than 0x00AA55FF is horked.
530 	 */
531 	int32_t		CRR_results;
532 	/* IO planar level register
533 	 * 0x1YYXXXXX = family 2
534 	 * 0x8YYXXXXX = table/desktop    YY is engineering level, X reserved
535 	 * -1 == not present
536 	 * Values in MSB has following meaning:
537 	 *	0x80 = table/desktop
538 	 *	0x40 = reserved
539 	 *	0x20 = reserved
540 	 *	0x10 = rack planar
541 	 *	0x08 = standard IO
542 	 *	0x04 = power connector not connected
543 	 *	0x02, 0x01 reserved
544 	 */
545 	int32_t		io_planar_level_reg; /* BUID 20 */
546 	int32_t		io_planar_level_reg_21;
547 	int32_t		io_planar_level_reg_22;
548 	int32_t		io_planar_level_reg_23;
549 
550 	/* Component register test results for the other BUID's */
551 	int32_t		CRR_results_21;
552 	int32_t		CRR_results_22;
553 	int32_t		CRR_results_23;
554 
555 	/* CRR results for BUID 20 */
556 	int32_t		CRR_results_20_0;	/* should contain 0x00000000 */
557 	int32_t		CRR_results_20_a;	/* should contain 0xaaaaaaaa */
558 	int32_t		CRR_results_20_5;	/* should contain 0x55555555 */
559 	int32_t		CRR_results_20_f;	/* should contain 0xffffffff */
560 	int32_t		CRR_results_21_0;	/* should contain 0x00000000 */
561 	int32_t		CRR_results_21_a;	/* should contain 0xaaaaaaaa */
562 	int32_t		CRR_results_21_5;	/* should contain 0x55555555 */
563 	int32_t		CRR_results_21_f;	/* should contain 0xffffffff */
564 	int32_t		CRR_results_22_0;	/* should contain 0x00000000 */
565 	int32_t		CRR_results_22_a;	/* should contain 0xaaaaaaaa */
566 	int32_t		CRR_results_22_5;	/* should contain 0x55555555 */
567 	int32_t		CRR_results_22_f;	/* should contain 0xffffffff */
568 	int32_t		CRR_results_23_0;	/* should contain 0x00000000 */
569 	int32_t		CRR_results_23_a;	/* should contain 0xaaaaaaaa */
570 	int32_t		CRR_results_23_5;	/* should contain 0x55555555 */
571 	int32_t		CRR_results_23_f;	/* should contain 0xffffffff */
572 
573 	/* IO interrupt test results for BUID 21 */
574 	int32_t		io_intr_results_21;
575 	/* pointer to IPL rom code in mem */
576 	u_char		*rom_ram_addr;		/* ROM Reserved */
577 	uint32_t	rom_ram_size;
578 	/* Storage control config register, ROM Reserved */
579 	uint32_t	sccr_toggle_one_meg;
580 	/* read from OCS NVRAM area */
581 	uint32_t	aix_model_code; /* 4 bytes from 0xA0003d0 */
582 	/* The following entries are read from the OCS NVRAM area
583 	 * ---------: dcache size = 0x0040     icache size = 0x0008
584 	 * ---------: dcache size = 0x0020     icache size = 0x0008
585 	 * ---------: dcache size = 0x0008     icache size = 0x0008
586 	 * ---------: dcache size = 0x0040     icache size = 0x0020
587 	 * ---------: dcache size = 0x0020     icache size = 0x0008
588 	 */
589 	int32_t		dcache_size; /* 4 bytes from NVRAM 0xA0003d4 */
590 	int32_t		icache_size; /* 4 bytes from NVRAM address 0xA0003d8 */
591 	char		vpd_model_id[8];
592 
593 	/* saves the ptr to lowest addr needed by IPL rom */
594 	u_char		*low_boundary_save;	/* ROM Reserved */
595 	/* Pointer to romscan entry point and data area. ROM Reserved */
596 	u_char		*romscan_code_ptr; /* runtime entry point of rom scan */
597 	u_char		*rom_boot_data_area; /* runtime user ram ( >= 4K)*/
598 };
599 
600 
601 
602 
603 #endif /* _IPLCB_H_ */
604