3 /* Structure for the IPL Control Block on RS/6000 machines */
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 */
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
;
66 uint32_t taur_post_off
;
67 uint32_t taur_post_size
;
68 uint32_t ent_post_off
;
69 uint32_t ent_post_size
;
72 uint32_t gpr_save_area1
[64];
73 uint32_t sysinfo_offset
;
74 uint32_t sysinfo_size
;
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
;
86 uint32_t memdata_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
;
102 uint32_t gpr_save
[32];
103 struct ipl_directory dir
;
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
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
151 char pkg_desc
[16]; /* NULL term ASCII string: */
152 /* "rs6k" POWER1, POWER2, RSC, PPC single proc
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
164 u_char
*buid_sptr
; /* pointer to buid's post structure */
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.
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 */
201 uint32_t nrof_structs
;
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)
211 * BA+xx (Additional Optional MFRR's)
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
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
220 u_char
*lind_addr
; /* see above */
222 uint32_t p_id
; /* unique proc id */
224 uint16_t p_nodeid
; /* phys NUMA nodeid */
225 uint16_t p_cpuid
; /* phys cpu id */
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 */
254 int slb_attrib
; /* segment lookaside buffer bitfield
256 * 1 separate/combined i/d */
257 int islb_size
; /* entries */
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 */
270 /* One SIMM is a nibble wide and will have the value of:
271 * 0x0 == good or 0xf == bad
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.
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
;
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 */
310 * WW == 0x00. hardware is SGR ss32 or ss64. (ss is speed in MHz)
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
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
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)
337 * ZZ == Model code. (useless)
338 * Icache K size is obtained from entry icache.
339 * Dcache K size is obtained from entry dcache.
342 /* Power status and keylock register decode. IO Addr 0x4000E4.
344 * Power Status bits 0-9
345 * Reserved bits 10-27
346 * Keylock decode bits 28-31: (X == don't care)
348 * 1 1 X X Workstation
351 * X X 1 1 Normal mode
352 * X X 1 0 Service mode
353 * X X 0 1 Secure mode
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 */
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 */
368 uint32_t cre
[16]; /* Storage Configuration Registers. */
369 uint32_t bscr
[16]; /* Bit steering registers */
370 /* Unimplemented and ROM Reserved */
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
; /* ??? */
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];
395 /* Copied from NVRAM */
397 uint32_t chip_signature
;
400 u_char obsolete_u_num
;
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
;
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.
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
;
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
;
436 struct { /* cache line size 64 */
437 struct simm_def memory_card_TB
;
438 struct simm_def memory_card_TC
;
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
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
;
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
;
489 char unused_errinfo
[64];
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.
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];
507 struct { /* cacheline 64 */
508 char ext_0_slot_H
[10];
510 char ext_2_slot_D
[10];
512 char ext_4_slot_F
[10];
514 char ext_6_slot_B
[10];
516 char ext_8_slot_G
[10];
518 char ext_10_slot_C
[10];
520 char ext_12_slot_E
[10];
522 char ext_14_slot_A
[10];
527 int32_t cache_line_size
;
528 /* Component reset register test results for BUID 20.
529 * Anything other than 0x00AA55FF is horked.
532 /* IO planar level register
533 * 0x1YYXXXXX = family 2
534 * 0x8YYXXXXX = table/desktop YY is engineering level, X reserved
536 * Values in MSB has following meaning:
537 * 0x80 = table/desktop
542 * 0x04 = power connector not connected
543 * 0x02, 0x01 reserved
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
;
550 /* Component regsiter 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
;
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 */
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
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];
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)*/
603 #endif /* _IPLCB_H_ */