Home | History | Annotate | Line # | Download | only in include
      1 /* $NetBSD: iplcb.h,v 1.3 2025/02/24 21:32:26 andvar 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;	/* Architecture 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