/* $NetBSD: iplcb.h,v 1.3 2025/02/24 21:32:26 andvar Exp $ */

/* Structure for the IPL Control Block on RS/6000 machines */

#ifndef _IPLCB_H_
#define _IPLCB_H_

#define MAX_BUCS 32

struct ipl_directory {
       char            iplcb_id[8];    /* ascii string id */
       uint32_t        gpr_save_off;   /* offset to gpr_save area */
       uint32_t        cb_bitmap_size; /* size of bitmap and CB */
       uint32_t        bitmap_off;     /* offset to bitmap */
       uint32_t        bitmap_size;    /* size of bitmap */
       uint32_t        iplinfo_off;
       uint32_t        iplinfo_size;
       uint32_t        iocc_post_off;
       uint32_t        iocc_post_size;
       uint32_t        nio_post_off;
       uint32_t        nio_post_size;
       uint32_t        sjl_post_off;
       uint32_t        sjl_post_size;
       uint32_t        scsi_post_off;
       uint32_t        scsi_post_size;
       uint32_t        eth_post_off;
       uint32_t        eth_post_size;
       uint32_t        tok_post_off;
       uint32_t        tok_post_size;
       uint32_t        ser_post_off;
       uint32_t        ser_post_size;
       uint32_t        par_post_off;
       uint32_t        par_post_size;
       uint32_t        rsc_post_off;
       uint32_t        rsc_post_size;
       uint32_t        lega_post_off;
       uint32_t        lega_post_size;
       uint32_t        kbd_post_off;
       uint32_t        kbd_post_size;
       uint32_t        ram_post_off;
       uint32_t        ram_post_size;
       uint32_t        sga_post_off;
       uint32_t        sga_post_size;
       uint32_t        fm2_post_off;
       uint32_t        fm2_post_size;
       uint32_t        net_boot_result_off;
       uint32_t        net_boot_result_size;
       uint32_t        csc_result_off;
       uint32_t        csc_result_size;
       uint32_t        menu_result_off;
       uint32_t        menu_result_size;
       uint32_t        cons_result_off;
       uint32_t        cons_result_size;
       uint32_t        diag_result_off;
       uint32_t        diag_result_size;
       uint32_t        rom_scan_off;           /* pres of ROMSCAN adaptor */
       uint32_t        rom_scan_size;
       uint32_t        sky_post_off;
       uint32_t        sky_post_size;
       uint32_t        global_off;
       uint32_t        global_size;
       uint32_t        mouse_off;
       uint32_t        mouse_size;
       uint32_t        vrs_off;
       uint32_t        vrs_size;
       uint32_t        taur_post_off;
       uint32_t        taur_post_size;
       uint32_t        ent_post_off;
       uint32_t        ent_post_size;
       uint32_t        vrs40_off;
       uint32_t        vrs40_size;
       uint32_t        gpr_save_area1[64];
       uint32_t        sysinfo_offset;
       uint32_t        sysinfo_size;
       uint32_t        bucinfo_off;
       uint32_t        bucinfo_size;
       uint32_t        procinfo_off;
       uint32_t        procinfo_size;
       uint32_t        fm2_ioinfo_off;
       uint32_t        fm2_ioinfo_size;
       uint32_t        proc_post_off;
       uint32_t        proc_post_size;
       uint32_t        sysvpd_off;
       uint32_t        sysvpd_size;
       uint32_t        memdata_off;
       uint32_t        memdata_size;
       uint32_t        l2data_off;
       uint32_t        l2data_size;
       uint32_t        fddi_post_off;
       uint32_t        fddi_post_size;
       uint32_t        golden_vpd_off;
       uint32_t        golden_vpd_size;
       uint32_t        nvram_cache_off;
       uint32_t        nvram_cache_size;
       uint32_t        user_struct_off;
       uint32_t        user_struct_size;
       uint32_t        residual_off;
       uint32_t        residual_size;
};

struct ipl_cb {
       uint32_t                gpr_save[32];
       struct ipl_directory    dir;
};

struct sys_info {
       int             nrof_procs;
       int             coherency_size; /* size of coherence block */
       int             resv_size;      /* size of reservation granule */
       u_char          *arb_ctrl_addr; /* real addr of arbiter control reg */
       u_char          *phys_id_addr;  /* real addr of phys id reg */
       int             nrof_bsrr;      /* nrof 4 byte bos slot reset regs */
       u_char          *bssr_addr;     /* real addr of bssr */
       int             tod_type;       /* time of day type */
       u_char          *todr_addr;     /* real address of todr regs */
       u_char          *rsr_addr;      /* real address of reset status reg */
       u_char          *pksr_addr;     /* RA of power/keylock status reg */
       u_char          *prcr_addr;     /* RA of power/reset control reg */
       u_char          *sssr_addr;     /* RA of system specific regs */
       u_char          *sir_addr;      /* RA of system intr regs */
       u_char          *scr_addr;      /* RA of standard conf reg */
       u_char          *dscr_addr;     /* RA of dev spec. config reg */
       int             nvram_size;     /* in bytes */
       u_char          *nvram_addr;    /* RA of nvram */
       u_char          *vpd_rom_addr;  /* RA of VPD ROM space */
       int             ipl_rom_size;   /* in bytes */
       u_char          *ipl_rom_addr;  /* RA of IPL ROM space */
       u_char          *g_mfrr_addr;   /* RA of global mffr reg if != 0 */
       u_char          *g_tb_addr;     /* RA of global timebase if != 0 */
       int             g_tb_type;      /* global timebase type */
       int             g_tb_mult;      /* global timebase multiplier */
       int             sp_errorlog_off;/* offset from BA of NVRAM to
                                        * service processor error log tbl */
       u_char          *pcccr_addr;    /* RA of connectivity config reg */
       u_char          *spocr_addr;    /* RA of software power off ctrl reg */
       u_char          *pfeivr_addr;   /* RA of EPOW ext intr reg */
       /* Available Processor Mask interface */
       int             access_id_waddr;/* type of access to loc_waddr */
       u_char          *loc_waddr;     /* RA of APM space write */
       int             access_id_raddr;/* type of access to loc_raddr */
       u_char          *loc_raddr;     /* RA of APM space read */
       int             architecture;   /* Architecture of this box:
                                        * RS6K = 1 = rs/6000 old mca
                                        * RSPC = 2 = PReP */
       int             implementation;
               /* Implementation of this box:
                * RS6K_UP_MCA = 1 = POWER1, POWER2, RSC, PPC single proc
                * RS6K_SMP_MCA = 2 = PPC SMP
                * RSCP_UP_PCI = 3 = PPC/PReP single proc
                */
       char            pkg_desc[16];   /* NULL term ASCII string: */
               /* "rs6k" POWER1, POWER2, RSC, PPC single proc
                * "rs6ksmp" PPC SMP
                * "rspc" PReP
                */
};

typedef struct buid_data {
       int             buid_value;     /* assigned BUID value.
               * values only have meaning if nrof_buids != 0.
               * assigned in order until nrof_buids is satisfied, unused
               * ones will be -1
               */
       u_char          *buid_sptr;     /* pointer to buid's post structure */
} buid_data_t;

struct buc_info {
       uint32_t        nrof_structs;   /* nrof bucs present */
       uint32_t        index;          /* 0 <= index <= num_of_structs - 1 */
       uint32_t        struct_size;    /* in bytes */
       int             bsrr_off;       /* bus slot reset reg offset */
       uint32_t        bsrr_mask;      /* bssr mask */
       int             bscr_val;       /* config register value to enable */
       int             cfg_status;     /* 0 buc not configured
                                        * 1 buc configd via config regs
                                        * 2 configd via hardware defaults
                                        * -1 config failed */
       int             dev_type;       /* 1 buc is executable memory
                                        * 2 buc is a processor
                                        * 3 buc is an io type */
       int             nrof_buids;     /* nrof buids needed by buc <=4 */
       buid_data_t     buid_data[4];
       int             mem_alloc1;     /* 1st mem alloc required in MB */
       u_char          *mem_addr1;     /* RA of mem_alloc1 area */
       int             mem_alloc2;     /* 2nd mem alloc required */
       u_char          *mem_addr2;     /* RA of mem_alloc2 area */
       int             vpd_rom_width;  /* width of vpd interface in bytes */
       int             cfg_addr_incr;  /* config addr increment in bytes */
       int             device_id_reg;  /* std. config reg contents */
       uint32_t        aux_info_off;   /* iplcb offset to the device specific
                                        * array for this buc. ie, if this is
                                        * a proc, offset is the
                                        * processor_info struct.
                                        */
       uint32_t        feature_rom_code; /* romscan post flag */
       uint32_t        IOCC_flag;      /* 0 not IOCC 1 = IOCC */
       char            location[4];    /* location of the BUC */
};

struct proc_info {
       uint32_t        nrof_structs;
       uint32_t        index;
       uint32_t        struct_size;
       uint32_t        per_buc_info_off; /* iplcb offset to buc_info for me */
       u_char          *proc_int_area;
               /* Base Addr of this proc's intr presentation layer regs
                * BA+0 (CPPR||XISR without side effects)
                * BA+4 (CPPR||XISR with side effects)
                * BA+8 (DSIER)
                * BA+12 (MFRR)
                * BA+xx (Additional Optional MFRR's)
                */
       uint32_t        proc_int_area_size; /* size/4 == nrof intr pres regs */
       int             proc_present;   /* 0 no, -1 dead, 1 running, 2 loop
                                        * 3 reset state */
       uint32_t        test_run;       /* which tests were run on proc */
       uint32_t        test_stat;      /* test status */
       int             link;           /* 0 = loop until nonzero !=0 branch to
                                        * link addr */
       u_char          *lind_addr;     /* see above */
       union {
               uint32_t        p_id;   /* unique proc id */
               struct {
                       uint16_t        p_nodeid; /* phys NUMA nodeid */
                       uint16_t        p_cpuid;  /* phys cpu id */
               } s0;
       } u0;
       int             architecture;   /* proc arch */
       int             implementation; /* proc type */
       int             version;        /* proc version */
       int             width;          /* proc data word size */
       int             cache_attrib;   /* bit 0 = cache not, cache is present
                                        * bit 1 = separate cache/combined */
       int             coherency_size; /* size of coherence block */
       int             resv_size;      /* size of reservation granule */
       int             icache_block;   /* L1 icache block size */
       int             dcache_block;   /* L1 dcache block size */
       int             icache_size;    /* L1 icache size */
       int             dcache_size;    /* L1 dcache size */
       int             icache_line;    /* L1 icache line size */
       int             dcache_line;    /* L1 dcache line size */
       int             icache_asc;     /* L1 icache associativity */
       int             dcache_asc;     /* L1 dcache associativity */
       int             L2_cache_size;  /* L2 cache size */
       int             L2_cach_asc;    /* L2 cache associativity */
       int             tlb_attrib;     /* tlb buffer attribute bitfield
                                        * 0  present/not present
                                        * 1  separate/combined i/d
                                        * 4  proc supports tlbia */
       int             itlb_size;      /* entries */
       int             dtlb_size;
       int             itlb_asc;
       int             dtlb_asc;
       int             slb_attrib;     /* segment lookaside buffer bitfield
                                        * 0 slb not/present
                                        * 1 separate/combined i/d */
       int             islb_size;      /* entries */
       int             dslb_size;
       int             islb_asc;
       int             dslb_asc;
       int             priv_lck_cnt;   /* spin lock count */
       int             rtc_type;       /* RTC type */
       int             rtcXint;        /* nanosec per timebase tick int mult*/
       int             rtcXfrac;       /* same, but fraction multiplier */
       int             bus_freq;       /* bus clock in Hz */
       int             tb_freq;        /* time base clockfreq */
       char            proc_desc[16];  /* processor name ASCII string */
};

/* One SIMM is a nibble wide and will have the value of:
* 0x0 == good or 0xf == bad
*/
struct simm_def {
       u_char          simm_7and8;
       u_char          simm_3and4;
       u_char          simm_5and6;
       u_char          simm_1and2;
};

/*
* The IPL Info structure is mostly good for telling us the cache sizes and
* model codes.  The whole thing is unreasonably large and verbose.
*/

struct ipl_info {
       /* IPL controller and device interface routine */
       u_char          *iplcnd_ptr;            /* ROM Reserved */
       uint32_t        iplcnd_size;
       /* NVRAM expansion code */
       u_char          *nvram_exp_ptr;         /* ROM Reserved */
       uint32_t        nvram_exp_size;
       /* IPL ROM stack high addr */
       u_char          *ipl_ros_stack_ptr;     /* ROM Reserved */
       uint32_t        ipl_ros_stack_size;
       /* IPL Record */
       u_char          *ipl_rec_ptr;           /* ROM Reserved */
       uint32_t        ipl_rec_size;
       /* Lowest addr needed by IPL ROM */
       u_char          *ros_workarea_lwm;      /* ROM Reserved */
       /* IPL ROM entry table. t=0, SR15 */
       u_char          *ros_entry_tbl_ptr;     /* ROM Reserved */
       uint32_t        ros_entry_tbl_size;
       /* Memory bit maps nrof bytes per bit.  16K/bit */
       uint32_t        bit_map_bytes_per_bit;  /* ROM Reserved */
       /* Highest addressable real address byte + 1. */
       uint32_t        ram_size;               /* ROM Reserved */
       /*
        * Model Field:
        * 0xWWXXYYZZ
        * WW == 0x00. hardware is SGR ss32 or ss64. (ss is speed in MHz)
        *      icache is 8k.
        *      XX == reserved
        *      YY == reserved
        *      ZZ == model code:
        *              bits 0,1 (low order) == style
        *                      00=Tower 01=Desktop 10=Rack 11=Reserved
        *              bits 2,3 == relative speed
        *                      00=slow 01=Medium 10=High 11=Fast
        *              bit 4 == number of combo chips
        *                      0 = 2 chips. 1 = 1 chip.
        *              bit 5 == Number of DCU's.
        *                      0 = 4 DCU's cache is 64k.
        *                      1 = 2 DCU's cache is 32K.
        *              bits 6,7 = Reserved
        * WW != 0x00:
        * WW == 0x01. Hardware is SGR ss32 or ss64 RS1. (POWER)
        * WW == 0x02. RSC (RISC Single Chip)
        * WW == 0x04. POWER2/RS2
        * WW == 0x08. PowerPC
        *      XX == Package type
        *              bits 0,1 (low order) == style
        *                      00=Tower 01=Desktop 10=Rack 11=Entry Server
        *              bit 2 - AIX Hardware verification test supp (rspc)
        *              bit 3 - AIX Hardware error log analysis supp (rspc)
        *              bit 4-7 reserved
        *      YY == Reserved
        *      ZZ == Model code. (useless)
        *      Icache K size is obtained from entry icache.
        *      Dcache K size is obtained from entry dcache.
        */
       uint32_t        model;
       /* Power status and keylock register decode.  IO Addr 0x4000E4.
        * 32bit reg:
        * Power Status         bits 0-9
        * Reserved             bits 10-27
        * Keylock decode       bits 28-31: (X == don't care)
        *      28 29 30 31
        *       1  1  X  X     Workstation
        *       0  1  X  X     Supermini
        *       0  0  X  X     Expansion
        *       X  X  1  1     Normal mode
        *       X  X  1  0     Service mode
        *       X  X  0  1     Secure mode
        */
       uint32_t        powkey_reg;             /* ROM Reserved */
       /* Set to zero during power on, inc'd with each warm IPL */
       int32_t         soft_reboot_count;
       /* Set and used by IPL controller, all are ROM Reserved */
       int32_t         nvram_section1_valid;   /* 0 if CRC bad */
       int32_t         nvram_exp_valid;        /* 0 if CRC bad */
       u_char          prevboot_dev[36];       /* last normal mode ipl */
       char            reserved[28];
       /* Pointer to the IPLCB in memory */
       u_char          *iplcb_ptr;             /* ROM Reserved */
       /* Pointer to compressed BIOS code */
       u_char          *bios_ptr;              /* ROM Reserved */
       uint32_t        bios_size;
       uint32_t        cre[16];        /* Storage Configuration Registers. */
       uint32_t        bscr[16];       /* Bit steering registers */
       /* Unimplemented and ROM Reserved */
       struct {
               uint32_t        synd;
               uint32_t        addr;
               uint32_t        status;
       } single_bit_error[16];
       uint32_t        reserved_array[5*16];
       /* Memory extent test indicators */
       u_char          extent_test_ind[16];    /* 0 = untested, 1 = tested */
       /* Memory bit steering register settig conflict indicator */
       u_char          bit_steer_conflict[16]; /* 1 = conflict */
       /* Set by IPL controller, ROM Reserved */
       uint32_t        ipl_ledval;     /* IPL LED value */
       uint32_t        ipl_device;     /* ??? */
       char            unused[18];

       /* Copied from IPL Rom VPD area */
       char            vpd_planar_partno[8];
       char            vpd_planar_ecno[8];
       char            vpd_proc_serialno[8];
       char            vpd_ipl_ros_partno[8];
       char            vpd_ipl_ros_version[14];
       char            ipl_ros_copyright[49];
       char            ipl_ros_timestamp[10];

       /* Copied from NVRAM */
       union {
               uint32_t        chip_signature;
               struct chip_sig {
                       u_char  cop_bus_addr;
                       u_char  obsolete_u_num;
                       u_char  dd_num;
                       u_char  partno;
               } chip_sig;
       } floating_point, fixed_point, instruction_cache_unit,
         storage_control_unit, combo_1, combo_2, data_control_unit_0,
         data_control_unit_1, data_control_unit_2, data_control_unit_3;

       /* Memory SIMM error information.
        * 8 cards (A-H) 8 simms per card (1-8).
        * Two cache line sizes.  if 128 use memory_card_1n data,
        * otherwise use memory_card_9n or memory_card_Tn.
        */
       union {
               char            memcd_errinfo[32];
               uint32_t        slots_of_simm[8];
               struct {        /* cache line size 128 */
                       struct simm_def memory_card_1H;
                       struct simm_def memory_card_1F;
                       struct simm_def memory_card_1G;
                       struct simm_def memory_card_1E;
                       struct simm_def memory_card_1D;
                       struct simm_def memory_card_1B;
                       struct simm_def memory_card_1C;
                       struct simm_def memory_card_1A;
               } simm_stuff_1;
               struct {        /* cache line size 64 */
                       struct simm_def memory_card_9H;
                       struct simm_def memory_card_9D;
                       struct simm_def memory_card_9F;
                       struct simm_def memory_card_9B;
                       struct simm_def memory_card_9G;
                       struct simm_def memory_card_9C;
                       struct simm_def memory_card_9E;
                       struct simm_def memory_card_9A;
               } simm_stuff_9;
               struct {        /* cache line size 64 */
                       struct simm_def memory_card_TB;
                       struct simm_def memory_card_TC;
               } simm_stuff_T;
       } simm_info;

       /* MESR error info at IPL ROM memory config time.
        * Two cache line sizes, similar to above.
        *   find one of the following values in the word variable:
        *      0x00000000 no MESR error occurred when configuring this extent
        *      0xe0400000 timeout. no memcard is in the slot.
        *      otherwise, an error occurred, so the card exists but will not
        *      be used.
        */
       union {
               char    extent_errinfo[64];
               struct {  /* cacheline 128 */
                       uint32_t        ext_0_slot_HandD;
                       uint32_t        ext_1_slot_HandD;
                       uint32_t        ext_2_slot_HandD;
                       uint32_t        ext_3_slot_HandD;
                       uint32_t        ext_4_slot_FandB;
                       uint32_t        ext_5_slot_FandB;
                       uint32_t        ext_6_slot_FandB;
                       uint32_t        ext_7_slot_FandB;
                       uint32_t        ext_8_slot_GandC;
                       uint32_t        ext_9_slot_GandC;
                       uint32_t        ext_10_slot_GandC;
                       uint32_t        ext_11_slot_GandC;
                       uint32_t        ext_12_slot_EandA;
                       uint32_t        ext_13_slot_EandA;
                       uint32_t        ext_14_slot_EandA;
                       uint32_t        ext_15_slot_EandA;
               } MESR_err_1;
               struct { /* cacheline of 64 */
                       uint32_t        ext_0_slot_H;
                       uint32_t        ext_1_slot_H;
                       uint32_t        ext_2_slot_D;
                       uint32_t        ext_3_slot_D;
                       uint32_t        ext_4_slot_F;
                       uint32_t        ext_5_slot_F;
                       uint32_t        ext_6_slot_B;
                       uint32_t        ext_7_slot_B;
                       uint32_t        ext_8_slot_G;
                       uint32_t        ext_9_slot_G;
                       uint32_t        ext_10_slot_C;
                       uint32_t        ext_11_slot_C;
                       uint32_t        ext_12_slot_E;
                       uint32_t        ext_13_slot_E;
                       uint32_t        ext_14_slot_A;
                       uint32_t        ext_15_slot_A;
               } MESR_err_9;
       } config_err_info;
       char            unused_errinfo[64];

       /*
        * Memory card VPD data area
        * cacheline sizes like above.
        *      0xffffffff = card is present, no VPD
        *      0x22222222 = card present with errors
        *      0x11111111 = no card
        *      otherwise it's good.
        */
       union {
               char    memcd_vpd[128];
               struct {  /* cacheline 128 */
                       char    ext_0_HandD[20];
                       char    ext_4_FandB[20];
                       char    ext_8_GandC[20];
                       char    ext_12_EandA[20];
               } memory_vpd_1;
               struct { /* cacheline 64 */
                       char    ext_0_slot_H[10];
                       char    dmy_0[2];
                       char    ext_2_slot_D[10];
                       char    dmy_2[2];
                       char    ext_4_slot_F[10];
                       char    dmy_4[2];
                       char    ext_6_slot_B[10];
                       char    dmy_6[2];
                       char    ext_8_slot_G[10];
                       char    dmy_8[2];
                       char    ext_10_slot_C[10];
                       char    dmy_10[2];
                       char    ext_12_slot_E[10];
                       char    dmy_12[2];
                       char    ext_14_slot_A[10];
                       char    dmy_14[2];
               } memory_vpd_9;
       } memcd_vpd;

       int32_t         cache_line_size;
       /* Component reset register test results for BUID 20.
        * Anything other than 0x00AA55FF is horked.
        */
       int32_t         CRR_results;
       /* IO planar level register
        * 0x1YYXXXXX = family 2
        * 0x8YYXXXXX = table/desktop    YY is engineering level, X reserved
        * -1 == not present
        * Values in MSB has following meaning:
        *      0x80 = table/desktop
        *      0x40 = reserved
        *      0x20 = reserved
        *      0x10 = rack planar
        *      0x08 = standard IO
        *      0x04 = power connector not connected
        *      0x02, 0x01 reserved
        */
       int32_t         io_planar_level_reg; /* BUID 20 */
       int32_t         io_planar_level_reg_21;
       int32_t         io_planar_level_reg_22;
       int32_t         io_planar_level_reg_23;

       /* Component register test results for the other BUID's */
       int32_t         CRR_results_21;
       int32_t         CRR_results_22;
       int32_t         CRR_results_23;

       /* CRR results for BUID 20 */
       int32_t         CRR_results_20_0;       /* should contain 0x00000000 */
       int32_t         CRR_results_20_a;       /* should contain 0xaaaaaaaa */
       int32_t         CRR_results_20_5;       /* should contain 0x55555555 */
       int32_t         CRR_results_20_f;       /* should contain 0xffffffff */
       int32_t         CRR_results_21_0;       /* should contain 0x00000000 */
       int32_t         CRR_results_21_a;       /* should contain 0xaaaaaaaa */
       int32_t         CRR_results_21_5;       /* should contain 0x55555555 */
       int32_t         CRR_results_21_f;       /* should contain 0xffffffff */
       int32_t         CRR_results_22_0;       /* should contain 0x00000000 */
       int32_t         CRR_results_22_a;       /* should contain 0xaaaaaaaa */
       int32_t         CRR_results_22_5;       /* should contain 0x55555555 */
       int32_t         CRR_results_22_f;       /* should contain 0xffffffff */
       int32_t         CRR_results_23_0;       /* should contain 0x00000000 */
       int32_t         CRR_results_23_a;       /* should contain 0xaaaaaaaa */
       int32_t         CRR_results_23_5;       /* should contain 0x55555555 */
       int32_t         CRR_results_23_f;       /* should contain 0xffffffff */

       /* IO interrupt test results for BUID 21 */
       int32_t         io_intr_results_21;
       /* pointer to IPL rom code in mem */
       u_char          *rom_ram_addr;          /* ROM Reserved */
       uint32_t        rom_ram_size;
       /* Storage control config register, ROM Reserved */
       uint32_t        sccr_toggle_one_meg;
       /* read from OCS NVRAM area */
       uint32_t        aix_model_code; /* 4 bytes from 0xA0003d0 */
       /* The following entries are read from the OCS NVRAM area
        * ---------: dcache size = 0x0040     icache size = 0x0008
        * ---------: dcache size = 0x0020     icache size = 0x0008
        * ---------: dcache size = 0x0008     icache size = 0x0008
        * ---------: dcache size = 0x0040     icache size = 0x0020
        * ---------: dcache size = 0x0020     icache size = 0x0008
        */
       int32_t         dcache_size; /* 4 bytes from NVRAM 0xA0003d4 */
       int32_t         icache_size; /* 4 bytes from NVRAM address 0xA0003d8 */
       char            vpd_model_id[8];

       /* saves the ptr to lowest addr needed by IPL rom */
       u_char          *low_boundary_save;     /* ROM Reserved */
       /* Pointer to romscan entry point and data area. ROM Reserved */
       u_char          *romscan_code_ptr; /* runtime entry point of rom scan */
       u_char          *rom_boot_data_area; /* runtime user ram ( >= 4K)*/
};




#endif /* _IPLCB_H_ */