/* $Id$ * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (C) 1992 - 1997, 2000-2001 Silicon Graphics, Inc. All rights reserved. */ /************************************************************************ * * * WARNING!!! WARNING!!! WARNING!!! WARNING!!! WARNING!!! * * * * This file is created by an automated script. Any (minimal) changes * * made manually to this file should be made with care. * * * * MAKE ALL ADDITIONS TO THE END OF THIS FILE * * * ************************************************************************/ #ifndef _ASM_IA64_SN_SN1_HUBLB_H #define _ASM_IA64_SN_SN1_HUBLB_H #define LB_REV_ID 0x00600000 /* * Bedrock Revision * and ID */ #define LB_CPU_PERMISSION 0x00604000 /* * CPU PIO access * permission bits */ #define LB_CPU_PERM_OVRRD 0x00604008 /* * CPU PIO access * permission bit * override */ #define LB_IO_PERMISSION 0x00604010 /* * IO PIO access * permission bits */ #define LB_SOFT_RESET 0x00604018 /* * Soft reset the * Bedrock chip */ #define LB_REGION_PRESENT 0x00604020 /* * Regions Present for * Invalidates */ #define LB_NODES_ABSENT 0x00604028 /* * Nodes Absent for * Invalidates */ #define LB_MICROLAN_CTL 0x00604030 /* * Microlan Control * (NIC) */ #define LB_ERROR_BITS 0x00604040 /* * Local Block error * bits */ #define LB_ERROR_MASK_CLR 0x00604048 /* * Bit mask write to * clear error bits */ #define LB_ERROR_HDR1 0x00604050 /* * Source, Suppl and * Cmd fields */ #define LB_ERROR_HDR2 0x00604058 /* * Address field from * first error */ #define LB_ERROR_DATA 0x00604060 /* * Data flit (if any) * from first error */ #define LB_DEBUG_SELECT 0x00604100 /* * Choice of debug * signals from chip */ #define LB_DEBUG_PINS 0x00604108 /* * Value on the chip's * debug pins */ #define LB_RT_LOCAL_CTRL 0x00604200 /* * Local generation of * real-time clock */ #define LB_RT_FILTER_CTRL 0x00604208 /* * Control of * filtering of global * clock */ #define LB_SCRATCH_REG0 0x00608000 /* Scratch Register 0 */ #define LB_SCRATCH_REG1 0x00608008 /* Scratch Register 1 */ #define LB_SCRATCH_REG2 0x00608010 /* Scratch Register 2 */ #define LB_SCRATCH_REG3 0x00608018 /* Scratch Register 3 */ #define LB_SCRATCH_REG4 0x00608020 /* Scratch Register 4 */ #define LB_SCRATCH_REG0_WZ 0x00608040 /* * Scratch Register 0 * (WZ alias) */ #define LB_SCRATCH_REG1_WZ 0x00608048 /* * Scratch Register 1 * (WZ alias) */ #define LB_SCRATCH_REG2_WZ 0x00608050 /* * Scratch Register 2 * (WZ alias) */ #define LB_SCRATCH_REG3_RZ 0x00608058 /* * Scratch Register 3 * (RZ alias) */ #define LB_SCRATCH_REG4_RZ 0x00608060 /* * Scratch Register 4 * (RZ alias) */ #define LB_VECTOR_PARMS 0x0060C000 /* * Vector PIO * parameters */ #define LB_VECTOR_ROUTE 0x0060C008 /* * Vector PIO Vector * Route */ #define LB_VECTOR_DATA 0x0060C010 /* * Vector PIO Write * Data */ #define LB_VECTOR_STATUS 0x0060C020 /* * Vector PIO Return * Status */ #define LB_VECTOR_RETURN 0x0060C028 /* * Vector PIO Return * Route */ #define LB_VECTOR_READ_DATA 0x0060C030 /* * Vector PIO Read * Data */ #define LB_VECTOR_STATUS_CLEAR 0x0060C038 /* * Clear Vector PIO * Return Status */ #ifndef __ASSEMBLY__ /************************************************************************ * * * Description: This register contains information that allows * * exploratory software to probe for chip type. This is also the * * register that sets this node's ID and the size of each region * * (which affects the maximum possible system size). IBM assigns the * * values for the REVISION, PART_NUMBER and MANUFACTURER fields, in * * accordance with the IEEE 1149.1 standard; SGI is not at liberty to * * unilaterally change the values of these fields. * * . * * * ************************************************************************/ #ifdef LITTLE_ENDIAN typedef union lb_rev_id_u { bdrkreg_t lb_rev_id_regval; struct { bdrkreg_t ri_reserved_2 : 1; bdrkreg_t ri_manufacturer : 11; bdrkreg_t ri_part_number : 16; bdrkreg_t ri_revision : 4; bdrkreg_t ri_node_id : 8; bdrkreg_t ri_reserved_1 : 6; bdrkreg_t ri_region_size : 2; bdrkreg_t ri_reserved : 16; } lb_rev_id_fld_s; } lb_rev_id_u_t; #else typedef union lb_rev_id_u { bdrkreg_t lb_rev_id_regval; struct { bdrkreg_t ri_reserved : 16; bdrkreg_t ri_region_size : 2; bdrkreg_t ri_reserved_1 : 6; bdrkreg_t ri_node_id : 8; bdrkreg_t ri_revision : 4; bdrkreg_t ri_part_number : 16; bdrkreg_t ri_manufacturer : 11; bdrkreg_t ri_reserved_2 : 1; } lb_rev_id_fld_s; } lb_rev_id_u_t; #endif /************************************************************************ * * * This register contains the PI-access-rights bit-vector for the * * LB, NI, XB and MD portions of the Bedrock local register space. If * * a bit in the bit-vector is set, the region corresponding to that * * bit has read/write permission on the LB, NI, XB and MD local * * registers. If the bit is clear, that region has no write access to * * the local registers and no read access if the read will cause any * * state change. If a write or a read with side effects is attempted * * by a PI in a region for which access is restricted, the LB will * * not perform the operation and will send back a reply which * * indicates an error. * * * ************************************************************************/ typedef union lb_cpu_permission_u { bdrkreg_t lb_cpu_permission_regval; struct { bdrkreg_t cp_cpu_access : 64; } lb_cpu_permission_fld_s; } lb_cpu_permission_u_t; /************************************************************************ * * * A write to this register of the 64-bit value "SGIrules" will * * cause the bit in the LB_CPU_PROTECT register corresponding to the * * region of the requester to be set. * * * ************************************************************************/ typedef union lb_cpu_perm_ovrrd_u { bdrkreg_t lb_cpu_perm_ovrrd_regval; struct { bdrkreg_t cpo_cpu_perm_ovr : 64; } lb_cpu_perm_ovrrd_fld_s; } lb_cpu_perm_ovrrd_u_t; /************************************************************************ * * * This register contains the II-access-rights bit-vector for the * * LB, NI, XB and MD portions of the Bedrock local register space. If * * a bit in the bit-vector is set, the region corresponding to that * * bit has read/write permission on the LB, NI, XB and MD local * * registers. If the bit is clear, then that region has no write * * access to the local registers and no read access if the read * * results in any state change. If a write or a read with side * * effects is attempted by an II in a region for which access is * * restricted, the LB will not perform the operation and will send * * back a reply which indicates an error. * * * ************************************************************************/ typedef union lb_io_permission_u { bdrkreg_t lb_io_permission_regval; struct { bdrkreg_t ip_io_permission : 64; } lb_io_permission_fld_s; } lb_io_permission_u_t; /************************************************************************ * * * A write to this bit resets the Bedrock chip with a soft reset. * * * ************************************************************************/ #ifdef LITTLE_ENDIAN typedef union lb_soft_reset_u { bdrkreg_t lb_soft_reset_regval; struct { bdrkreg_t sr_soft_reset : 1; bdrkreg_t sr_reserved : 63; } lb_soft_reset_fld_s; } lb_soft_reset_u_t; #else typedef union lb_soft_reset_u { bdrkreg_t lb_soft_reset_regval; struct { bdrkreg_t sr_reserved : 63; bdrkreg_t sr_soft_reset : 1; } lb_soft_reset_fld_s; } lb_soft_reset_u_t; #endif /************************************************************************ * * * This register indicates which regions are present and capable of * * receiving an invalidate (INVAL) request. The LB samples this * * register at the start of processing each LINVAL. When an LINVAL * * indicates that a particular PI unit might hold a shared copy of a * * cache block but this PI is in a region which is not present (i.e., * * its bit in LB_REGION_PRESENT is clear), then the LB sends an IVACK * * reply packet on behalf of this PI. The REGION_SIZE field in the * * LB_REV_ID register determines the number of nodes per region (and * * hence, the number of PI units which share a common bit in the * * LB_REGION_PRESENT register). * * * ************************************************************************/ typedef union lb_region_present_u { bdrkreg_t lb_region_present_regval; struct { bdrkreg_t rp_present_bits : 64; } lb_region_present_fld_s; } lb_region_present_u_t; /************************************************************************ * * * Description: This register indicates which nodes are absent and * * not capable of receiving an invalidate (INVAL) request. The LB * * samples this register at the start of processing each LINVAL. When * * an LINVAL indicates that a particular PI unit might hold a shared * * copy of a cache block but this PI unit's node is not present * * (i.e., its node ID is listed in the LB_NODES_ABSENT register), * * then the LB sends an IVACK reply packet on behalf of this PI. * * * * * ************************************************************************/ #ifdef LITTLE_ENDIAN typedef union lb_nodes_absent_u { bdrkreg_t lb_nodes_absent_regval; struct { bdrkreg_t na_node_0 : 8; bdrkreg_t na_reserved_3 : 7; bdrkreg_t na_node_0_valid : 1; bdrkreg_t na_node_1 : 8; bdrkreg_t na_reserved_2 : 7; bdrkreg_t na_node_1_valid : 1; bdrkreg_t na_node_2 : 8; bdrkreg_t na_reserved_1 : 7; bdrkreg_t na_node_2_valid : 1; bdrkreg_t na_node_3 : 8; bdrkreg_t na_reserved : 7; bdrkreg_t na_node_3_valid : 1; } lb_nodes_absent_fld_s; } lb_nodes_absent_u_t; #else typedef union lb_nodes_absent_u { bdrkreg_t lb_nodes_absent_regval; struct { bdrkreg_t na_node_3_valid : 1; bdrkreg_t na_reserved : 7; bdrkreg_t na_node_3 : 8; bdrkreg_t na_node_2_valid : 1; bdrkreg_t na_reserved_1 : 7; bdrkreg_t na_node_2 : 8; bdrkreg_t na_node_1_valid : 1; bdrkreg_t na_reserved_2 : 7; bdrkreg_t na_node_1 : 8; bdrkreg_t na_node_0_valid : 1; bdrkreg_t na_reserved_3 : 7; bdrkreg_t na_node_0 : 8; } lb_nodes_absent_fld_s; } lb_nodes_absent_u_t; #endif /************************************************************************ * * * This register provides access to the Number-In-a-Can add-only * * serial PROM that is used to store node board serial number and * * configuration information. (Refer to NIC datasheet Dallas 1990A * * that is viewable at * * URL::http://www.dalsemi.com/DocControl/PDFs/pdfindex.html). Data * * comes from this interface LSB first. * * * ************************************************************************/ #ifdef LITTLE_ENDIAN typedef union lb_microlan_ctl_u { bdrkreg_t lb_microlan_ctl_regval; struct { bdrkreg_t mc_rd_data : 1; bdrkreg_t mc_done : 1; bdrkreg_t mc_sample : 8; bdrkreg_t mc_pulse : 10; bdrkreg_t mc_clkdiv_phi0 : 7; bdrkreg_t mc_clkdiv_phi1 : 7; bdrkreg_t mc_reserved : 30; } lb_microlan_ctl_fld_s; } lb_microlan_ctl_u_t; #else typedef union lb_microlan_ctl_u { bdrkreg_t lb_microlan_ctl_regval; struct { bdrkreg_t mc_reserved : 30; bdrkreg_t mc_clkdiv_phi1 : 7; bdrkreg_t mc_clkdiv_phi0 : 7; bdrkreg_t mc_pulse : 10; bdrkreg_t mc_sample : 8; bdrkreg_t mc_done : 1; bdrkreg_t mc_rd_data : 1; } lb_microlan_ctl_fld_s; } lb_microlan_ctl_u_t; #endif /************************************************************************ * * * Description: This register contains the LB error status bits. * * Whenever a particular type of error occurs, the LB sets its bit in * * this register so that software will be aware that such an event * * has happened. Reads from this register are non-destructive and the * * contents of this register remain intact across reset operations. * * Whenever any of these bits is set, the LB will assert its * * interrupt request output signals that go to the PI units. * * Software can simulate the occurrence of an error by first writing * * appropriate values into the LB_ERROR_HDR1, LB_ERROR_HDR2 and * * LB_ERROR_DATA registers, and then writing to the LB_ERROR_BITS * * register to set the error bits in a particular way. Setting one or * * more error bits will cause the LB to interrupt a processor and * * invoke error-handling software. * * * ************************************************************************/ #ifdef LITTLE_ENDIAN typedef union lb_error_bits_u { bdrkreg_t lb_error_bits_regval; struct { bdrkreg_t eb_rq_bad_cmd : 1; bdrkreg_t eb_rp_bad_cmd : 1; bdrkreg_t eb_rq_short : 1; bdrkreg_t eb_rp_short : 1; bdrkreg_t eb_rq_long : 1; bdrkreg_t eb_rp_long : 1; bdrkreg_t eb_rq_bad_data : 1; bdrkreg_t eb_rp_bad_data : 1; bdrkreg_t eb_rq_bad_addr : 1; bdrkreg_t eb_rq_bad_linval : 1; bdrkreg_t eb_gclk_drop : 1; bdrkreg_t eb_reserved : 53; } lb_error_bits_fld_s; } lb_error_bits_u_t; #else typedef union lb_error_bits_u { bdrkreg_t lb_error_bits_regval; struct { bdrkreg_t eb_reserved : 53; bdrkreg_t eb_gclk_drop : 1; bdrkreg_t eb_rq_bad_linval : 1; bdrkreg_t eb_rq_bad_addr : 1; bdrkreg_t eb_rp_bad_data : 1; bdrkreg_t eb_rq_bad_data : 1; bdrkreg_t eb_rp_long : 1; bdrkreg_t eb_rq_long : 1; bdrkreg_t eb_rp_short : 1; bdrkreg_t eb_rq_short : 1; bdrkreg_t eb_rp_bad_cmd : 1; bdrkreg_t eb_rq_bad_cmd : 1; } lb_error_bits_fld_s; } lb_error_bits_u_t; #endif /************************************************************************ * * * This register lets software clear some of the bits in the * * LB_ERROR_BITS register without affecting other bits. Essentially, * * it provides bit mask functionality. When software writes to the * * LB_ERROR_MASK_CLR register, the bits which are set in the data * * value indicate which bits are to be cleared in LB_ERROR_BITS. If a * * bit is clear in the data value written to the LB_ERROR_MASK_CLR * * register, then its corresponding bit in the LB_ERROR_BITS register * * is not affected. Hence, software can atomically clear any subset * * of the error bits in the LB_ERROR_BITS register. * * * ************************************************************************/ #ifdef LITTLE_ENDIAN typedef union lb_error_mask_clr_u { bdrkreg_t lb_error_mask_clr_regval; struct { bdrkreg_t emc_clr_rq_bad_cmd : 1; bdrkreg_t emc_clr_rp_bad_cmd : 1; bdrkreg_t emc_clr_rq_short : 1; bdrkreg_t emc_clr_rp_short : 1; bdrkreg_t emc_clr_rq_long : 1; bdrkreg_t emc_clr_rp_long : 1; bdrkreg_t emc_clr_rq_bad_data : 1; bdrkreg_t emc_clr_rp_bad_data : 1; bdrkreg_t emc_clr_rq_bad_addr : 1; bdrkreg_t emc_clr_rq_bad_linval : 1; bdrkreg_t emc_clr_gclk_drop : 1; bdrkreg_t emc_reserved : 53; } lb_error_mask_clr_fld_s; } lb_error_mask_clr_u_t; #else typedef union lb_error_mask_clr_u { bdrkreg_t lb_error_mask_clr_regval; struct { bdrkreg_t emc_reserved : 53; bdrkreg_t emc_clr_gclk_drop : 1; bdrkreg_t emc_clr_rq_bad_linval : 1; bdrkreg_t emc_clr_rq_bad_addr : 1; bdrkreg_t emc_clr_rp_bad_data : 1; bdrkreg_t emc_clr_rq_bad_data : 1; bdrkreg_t emc_clr_rp_long : 1; bdrkreg_t emc_clr_rq_long : 1; bdrkreg_t emc_clr_rp_short : 1; bdrkreg_t emc_clr_rq_short : 1; bdrkreg_t emc_clr_rp_bad_cmd : 1; bdrkreg_t emc_clr_rq_bad_cmd : 1; } lb_error_mask_clr_fld_s; } lb_error_mask_clr_u_t; #endif /************************************************************************ * * * If the LB detects an error when VALID==0 in the LB_ERROR_HDR1 * * register, then it saves the contents of the offending packet's * * header flit in the LB_ERROR_HDR1 and LB_ERROR_HDR2 registers, sets * * the VALID bit in LB_ERROR_HDR1 and clears the OVERRUN bit in * * LB_ERROR_HDR1 (and it will also set the corresponding bit in the * * LB_ERROR_BITS register). The ERR_TYPE field indicates specifically * * what kind of error occurred. Its encoding corresponds to the bit * * positions in the LB_ERROR_BITS register (e.g., ERR_TYPE==5 * * indicates a RP_LONG error). If an error (of any type except * * GCLK_DROP) subsequently happens while VALID==1, then the LB sets * * the OVERRUN bit in LB_ERROR_HDR1. This register is not relevant * * when a GCLK_DROP error occurs; the LB does not even attempt to * * change the ERR_TYPE, VALID or OVERRUN field when a GCLK_DROP error * * happens. * * * ************************************************************************/ #ifdef LITTLE_ENDIAN typedef union lb_error_hdr1_u { bdrkreg_t lb_error_hdr1_regval; struct { bdrkreg_t eh_command : 7; bdrkreg_t eh_reserved_5 : 1; bdrkreg_t eh_suppl : 11; bdrkreg_t eh_reserved_4 : 1; bdrkreg_t eh_source : 11; bdrkreg_t eh_reserved_3 : 1; bdrkreg_t eh_err_type : 4; bdrkreg_t eh_reserved_2 : 4; bdrkreg_t eh_overrun : 1; bdrkreg_t eh_reserved_1 : 3; bdrkreg_t eh_valid : 1; bdrkreg_t eh_reserved : 19; } lb_error_hdr1_fld_s; } lb_error_hdr1_u_t; #else typedef union lb_error_hdr1_u { bdrkreg_t lb_error_hdr1_regval; struct { bdrkreg_t eh_reserved : 19; bdrkreg_t eh_valid : 1; bdrkreg_t eh_reserved_1 : 3; bdrkreg_t eh_overrun : 1; bdrkreg_t eh_reserved_2 : 4; bdrkreg_t eh_err_type : 4; bdrkreg_t eh_reserved_3 : 1; bdrkreg_t eh_source : 11; bdrkreg_t eh_reserved_4 : 1; bdrkreg_t eh_suppl : 11; bdrkreg_t eh_reserved_5 : 1; bdrkreg_t eh_command : 7; } lb_error_hdr1_fld_s; } lb_error_hdr1_u_t; #endif /************************************************************************ * * * Contents of the Address field from header flit of first packet * * that causes an error. This register is not relevant when a * * GCLK_DROP error occurs. * * * ************************************************************************/ #ifdef LITTLE_ENDIAN typedef union lb_error_hdr2_u { bdrkreg_t lb_error_hdr2_regval; struct { bdrkreg_t eh_address : 38; bdrkreg_t eh_reserved : 26; } lb_error_hdr2_fld_s; } lb_error_hdr2_u_t; #else typedef union lb_error_hdr2_u { bdrkreg_t lb_error_hdr2_regval; struct { bdrkreg_t eh_reserved : 26; bdrkreg_t eh_address : 38; } lb_error_hdr2_fld_s; } lb_error_hdr2_u_t; #endif /************************************************************************ * * * Description: This register accompanies the LB_ERROR_HDR1 and * * LB_ERROR_HDR2 registers. The LB updates the value in this * * register when an incoming packet with a data flit causes an error * * while VALID==0 in the LB_ERROR_HDR1 register. This register * * retains the contents of the data flit from the incoming packet * * that caused the error. This register is relevant for the following * * types of errors: * *
* * In the case of RQ_BAD_LINVAL, the register retains the 64-bit data * * value that followed the header flit. In the case of RQ_BAD_ADDR * * or RQ_BAD_DATA, the register retains the incoming packet's 64-bit * * data value (i.e., 2nd flit in the packet for a normal PIO write or * * an LINVAL, 3rd flit for a vector PIO read or write). In the case * * of RP_BAD_DATA, the register retains the 64-bit data value in the * * 3rd flit of the packet. When a RP_LONG or RQ_LONG error occurs, * * the LB loads the LB_ERROR_DATA register with the contents of the * * expected data flit (i.e., the 3rd flit in the packet for a vector * * PIO request or reply, the 2nd flit for other packets), if any. The * * contents of the LB_ERROR_DATA register are undefined after a * * RP_SHORT, RQ_SHORT, RP_BAD_CMD or RQ_BAD_CMD error. The contents * * of the LB_ERROR_DATA register are also undefined after an incoming * * normal PIO read request which encounters a RQ_LONG error. * * * ************************************************************************/ typedef union lb_error_data_u { bdrkreg_t lb_error_data_regval; struct { bdrkreg_t ed_data : 64; } lb_error_data_fld_s; } lb_error_data_u_t; /************************************************************************ * * * This register enables software to control what internal Bedrock * * signals are visible on the chip's debug pins. The LB provides the * * 6-bit value in this register to Bedrock's DEBUG unit. The JTAG * * unit provides a similar 6-bit selection input to the DEBUG unit, * * along with another signal that tells the DEBUG unit whether to use * * the selection signal from the LB or the JTAG unit. For a * * description of the menu of choices for debug signals, refer to the * * documentation for the DEBUG unit. * * * ************************************************************************/ #ifdef LITTLE_ENDIAN typedef union lb_debug_select_u { bdrkreg_t lb_debug_select_regval; struct { bdrkreg_t ds_debug_sel : 6; bdrkreg_t ds_reserved : 58; } lb_debug_select_fld_s; } lb_debug_select_u_t; #else typedef union lb_debug_select_u { bdrkreg_t lb_debug_select_regval; struct { bdrkreg_t ds_reserved : 58; bdrkreg_t ds_debug_sel : 6; } lb_debug_select_fld_s; } lb_debug_select_u_t; #endif /************************************************************************ * * * A PIO read from this register returns the 32-bit value that is * * currently on the Bedrock chip's debug pins. This register allows * * software to observe debug pin output values which do not change * * frequently (i.e., they remain constant over a period of many * * cycles). * * * ************************************************************************/ #ifdef LITTLE_ENDIAN typedef union lb_debug_pins_u { bdrkreg_t lb_debug_pins_regval; struct { bdrkreg_t dp_debug_pins : 32; bdrkreg_t dp_reserved : 32; } lb_debug_pins_fld_s; } lb_debug_pins_u_t; #else typedef union lb_debug_pins_u { bdrkreg_t lb_debug_pins_regval; struct { bdrkreg_t dp_reserved : 32; bdrkreg_t dp_debug_pins : 32; } lb_debug_pins_fld_s; } lb_debug_pins_u_t; #endif /************************************************************************ * * * The LB unit provides the PI0 and PI1 units with a real-time clock * * signal. The LB can generate this signal itself, based on the * * Bedrock chip's system clock which the LB receives as an input. * * Alternatively, the LB can filter a global clock signal which it * * receives as an input and provide the filtered version to PI0 and * * PI1. The user can program the LB_RT_LOCAL_CTRL register to choose * * the source of the real-time clock. If the user chooses to generate * * the real-time clock internally within the LB, then the user can * * specify the period for the real-time clock signal. * * * ************************************************************************/ #ifdef LITTLE_ENDIAN typedef union lb_rt_local_ctrl_u { bdrkreg_t lb_rt_local_ctrl_regval; struct { bdrkreg_t rlc_gclk_enable : 1; bdrkreg_t rlc_reserved_4 : 3; bdrkreg_t rlc_max_count : 10; bdrkreg_t rlc_reserved_3 : 2; bdrkreg_t rlc_gclk_counter : 10; bdrkreg_t rlc_reserved_2 : 2; bdrkreg_t rlc_gclk : 1; bdrkreg_t rlc_reserved_1 : 3; bdrkreg_t rlc_use_internal : 1; bdrkreg_t rlc_reserved : 31; } lb_rt_local_ctrl_fld_s; } lb_rt_local_ctrl_u_t; #else typedef union lb_rt_local_ctrl_u { bdrkreg_t lb_rt_local_ctrl_regval; struct { bdrkreg_t rlc_reserved : 31; bdrkreg_t rlc_use_internal : 1; bdrkreg_t rlc_reserved_1 : 3; bdrkreg_t rlc_gclk : 1; bdrkreg_t rlc_reserved_2 : 2; bdrkreg_t rlc_gclk_counter : 10; bdrkreg_t rlc_reserved_3 : 2; bdrkreg_t rlc_max_count : 10; bdrkreg_t rlc_reserved_4 : 3; bdrkreg_t rlc_gclk_enable : 1; } lb_rt_local_ctrl_fld_s; } lb_rt_local_ctrl_u_t; #endif /************************************************************************ * * * When the value of the USE_INTERNAL field in the LB_RT_LOCAL_CTRL * * register is 0, the LB filters an incoming global clock signal and * * provides the result to PI0 and PI1 for their real-time clock * * inputs. The LB can perform either simple filtering or complex * * filtering, depending on the value of the MASK_ENABLE bit. For the * * simple filtering option, the LB merely removes glitches from the * * incoming global clock; if the global clock goes high (or low) for * * only a single cycle, the LB considers it to be a glitch and does * * not pass it through to PI0 and PI1. For the complex filtering * * option, the LB expects positive edges on the incoming global clock * * to be spaced at fairly regular intervals and it looks for them at * * these times; the LB keeps track of unexpected or missing positive * * edges, and it generates an edge itself whenever the incoming * * global clock apparently misses an edge. For each filtering option, * * the real-time clock which the LB provides to PI0 and PI1 is not * * necessarily a square wave; when a positive edge happens, the * * real-time clock stays high for (2*MAX_COUNT+1-OFFSET)/2 cycles of * * the LB's system clock, and then is low until the next positive * * edge. * * * ************************************************************************/ #ifdef LITTLE_ENDIAN typedef union lb_rt_filter_ctrl_u { bdrkreg_t lb_rt_filter_ctrl_regval; struct { bdrkreg_t rfc_offset : 5; bdrkreg_t rfc_reserved_4 : 3; bdrkreg_t rfc_mask_counter : 12; bdrkreg_t rfc_mask_enable : 1; bdrkreg_t rfc_reserved_3 : 3; bdrkreg_t rfc_dropout_counter : 10; bdrkreg_t rfc_reserved_2 : 2; bdrkreg_t rfc_dropout_thresh : 10; bdrkreg_t rfc_reserved_1 : 2; bdrkreg_t rfc_error_counter : 10; bdrkreg_t rfc_reserved : 6; } lb_rt_filter_ctrl_fld_s; } lb_rt_filter_ctrl_u_t; #else typedef union lb_rt_filter_ctrl_u { bdrkreg_t lb_rt_filter_ctrl_regval; struct { bdrkreg_t rfc_reserved : 6; bdrkreg_t rfc_error_counter : 10; bdrkreg_t rfc_reserved_1 : 2; bdrkreg_t rfc_dropout_thresh : 10; bdrkreg_t rfc_reserved_2 : 2; bdrkreg_t rfc_dropout_counter : 10; bdrkreg_t rfc_reserved_3 : 3; bdrkreg_t rfc_mask_enable : 1; bdrkreg_t rfc_mask_counter : 12; bdrkreg_t rfc_reserved_4 : 3; bdrkreg_t rfc_offset : 5; } lb_rt_filter_ctrl_fld_s; } lb_rt_filter_ctrl_u_t; #endif /************************************************************************ * * * This register is a scratch register that is reset to 0x0. At the * * normal address, the register is a simple storage location. At the * * Write-If-Zero address, the register accepts a new value from a * * write operation only if the current value is zero. * * * ************************************************************************/ typedef union lb_scratch_reg0_u { bdrkreg_t lb_scratch_reg0_regval; struct { bdrkreg_t sr_scratch_bits : 64; } lb_scratch_reg0_fld_s; } lb_scratch_reg0_u_t; /************************************************************************ * * * These registers are scratch registers that are not reset. At a * * register's normal address, it is a simple storage location. At a * * register's Write-If-Zero address, it accepts a new value from a * * write operation only if the current value is zero. * * * ************************************************************************/ typedef union lb_scratch_reg1_u { bdrkreg_t lb_scratch_reg1_regval; struct { bdrkreg_t sr_scratch_bits : 64; } lb_scratch_reg1_fld_s; } lb_scratch_reg1_u_t; /************************************************************************ * * * These registers are scratch registers that are not reset. At a * * register's normal address, it is a simple storage location. At a * * register's Write-If-Zero address, it accepts a new value from a * * write operation only if the current value is zero. * * * ************************************************************************/ typedef union lb_scratch_reg2_u { bdrkreg_t lb_scratch_reg2_regval; struct { bdrkreg_t sr_scratch_bits : 64; } lb_scratch_reg2_fld_s; } lb_scratch_reg2_u_t; /************************************************************************ * * * These one-bit registers are scratch registers. At a register's * * normal address, it is a simple storage location. At a register's * * Read-Set-If-Zero address, it returns the original contents and * * sets the bit if the original value is zero. * * * ************************************************************************/ #ifdef LITTLE_ENDIAN typedef union lb_scratch_reg3_u { bdrkreg_t lb_scratch_reg3_regval; struct { bdrkreg_t sr_scratch_bit : 1; bdrkreg_t sr_reserved : 63; } lb_scratch_reg3_fld_s; } lb_scratch_reg3_u_t; #else typedef union lb_scratch_reg3_u { bdrkreg_t lb_scratch_reg3_regval; struct { bdrkreg_t sr_reserved : 63; bdrkreg_t sr_scratch_bit : 1; } lb_scratch_reg3_fld_s; } lb_scratch_reg3_u_t; #endif /************************************************************************ * * * These one-bit registers are scratch registers. At a register's * * normal address, it is a simple storage location. At a register's * * Read-Set-If-Zero address, it returns the original contents and * * sets the bit if the original value is zero. * * * ************************************************************************/ #ifdef LITTLE_ENDIAN typedef union lb_scratch_reg4_u { bdrkreg_t lb_scratch_reg4_regval; struct { bdrkreg_t sr_scratch_bit : 1; bdrkreg_t sr_reserved : 63; } lb_scratch_reg4_fld_s; } lb_scratch_reg4_u_t; #else typedef union lb_scratch_reg4_u { bdrkreg_t lb_scratch_reg4_regval; struct { bdrkreg_t sr_reserved : 63; bdrkreg_t sr_scratch_bit : 1; } lb_scratch_reg4_fld_s; } lb_scratch_reg4_u_t; #endif /************************************************************************ * * * This register is a scratch register that is reset to 0x0. At the * * normal address, the register is a simple storage location. At the * * Write-If-Zero address, the register accepts a new value from a * * write operation only if the current value is zero. * * * ************************************************************************/ typedef union lb_scratch_reg0_wz_u { bdrkreg_t lb_scratch_reg0_wz_regval; struct { bdrkreg_t srw_scratch_bits : 64; } lb_scratch_reg0_wz_fld_s; } lb_scratch_reg0_wz_u_t; /************************************************************************ * * * These registers are scratch registers that are not reset. At a * * register's normal address, it is a simple storage location. At a * * register's Write-If-Zero address, it accepts a new value from a * * write operation only if the current value is zero. * * * ************************************************************************/ typedef union lb_scratch_reg1_wz_u { bdrkreg_t lb_scratch_reg1_wz_regval; struct { bdrkreg_t srw_scratch_bits : 64; } lb_scratch_reg1_wz_fld_s; } lb_scratch_reg1_wz_u_t; /************************************************************************ * * * These registers are scratch registers that are not reset. At a * * register's normal address, it is a simple storage location. At a * * register's Write-If-Zero address, it accepts a new value from a * * write operation only if the current value is zero. * * * ************************************************************************/ typedef union lb_scratch_reg2_wz_u { bdrkreg_t lb_scratch_reg2_wz_regval; struct { bdrkreg_t srw_scratch_bits : 64; } lb_scratch_reg2_wz_fld_s; } lb_scratch_reg2_wz_u_t; /************************************************************************ * * * These one-bit registers are scratch registers. At a register's * * normal address, it is a simple storage location. At a register's * * Read-Set-If-Zero address, it returns the original contents and * * sets the bit if the original value is zero. * * * ************************************************************************/ #ifdef LITTLE_ENDIAN typedef union lb_scratch_reg3_rz_u { bdrkreg_t lb_scratch_reg3_rz_regval; struct { bdrkreg_t srr_scratch_bit : 1; bdrkreg_t srr_reserved : 63; } lb_scratch_reg3_rz_fld_s; } lb_scratch_reg3_rz_u_t; #else typedef union lb_scratch_reg3_rz_u { bdrkreg_t lb_scratch_reg3_rz_regval; struct { bdrkreg_t srr_reserved : 63; bdrkreg_t srr_scratch_bit : 1; } lb_scratch_reg3_rz_fld_s; } lb_scratch_reg3_rz_u_t; #endif /************************************************************************ * * * These one-bit registers are scratch registers. At a register's * * normal address, it is a simple storage location. At a register's * * Read-Set-If-Zero address, it returns the original contents and * * sets the bit if the original value is zero. * * * ************************************************************************/ #ifdef LITTLE_ENDIAN typedef union lb_scratch_reg4_rz_u { bdrkreg_t lb_scratch_reg4_rz_regval; struct { bdrkreg_t srr_scratch_bit : 1; bdrkreg_t srr_reserved : 63; } lb_scratch_reg4_rz_fld_s; } lb_scratch_reg4_rz_u_t; #else typedef union lb_scratch_reg4_rz_u { bdrkreg_t lb_scratch_reg4_rz_regval; struct { bdrkreg_t srr_reserved : 63; bdrkreg_t srr_scratch_bit : 1; } lb_scratch_reg4_rz_fld_s; } lb_scratch_reg4_rz_u_t; #endif /************************************************************************ * * * Description: This register contains vector PIO parameters. A * * write to this register triggers the LB to send out a vector PIO * * request packet. Immediately after servicing a write request to the * * LB_VECTOR_PARMS register, the LB sends back a reply (i.e., the LB * * doesn't wait for the vector PIO operation to finish first). Three * * LB registers provide the contents for an outgoing vector PIO * * request packet. Software should wait until the BUSY bit in * * LB_VECTOR_PARMS is clear and then initialize all three of these * * registers before initiating a vector PIO operation. The three * * vector PIO registers are: * * LB_VECTOR_ROUTE * * LB_VECTOR_DATA * * LB_VECTOR_PARMS (should be written last) * * * ************************************************************************/ #ifdef LITTLE_ENDIAN typedef union lb_vector_parms_u { bdrkreg_t lb_vector_parms_regval; struct { bdrkreg_t vp_type : 1; bdrkreg_t vp_reserved_2 : 2; bdrkreg_t vp_address : 21; bdrkreg_t vp_reserved_1 : 8; bdrkreg_t vp_write_id : 8; bdrkreg_t vp_pio_id : 11; bdrkreg_t vp_reserved : 12; bdrkreg_t vp_busy : 1; } lb_vector_parms_fld_s; } lb_vector_parms_u_t; #else typedef union lb_vector_parms_u { bdrkreg_t lb_vector_parms_regval; struct { bdrkreg_t vp_busy : 1; bdrkreg_t vp_reserved : 12; bdrkreg_t vp_pio_id : 11; bdrkreg_t vp_write_id : 8; bdrkreg_t vp_reserved_1 : 8; bdrkreg_t vp_address : 21; bdrkreg_t vp_reserved_2 : 2; bdrkreg_t vp_type : 1; } lb_vector_parms_fld_s; } lb_vector_parms_u_t; #endif /************************************************************************ * * * This register contains the vector PIO route. This is one of the 3 * * vector PIO control registers. * * * ************************************************************************/ typedef union lb_vector_route_u { bdrkreg_t lb_vector_route_regval; struct { bdrkreg_t vr_vector : 64; } lb_vector_route_fld_s; } lb_vector_route_u_t; /************************************************************************ * * * This register contains the vector PIO write data. This is one of * * the 3 vector PIO control registers. The contents of this register * * also provide the data value to be sent in outgoing vector PIO read * * requests and vector PIO write replies. * * * ************************************************************************/ typedef union lb_vector_data_u { bdrkreg_t lb_vector_data_regval; struct { bdrkreg_t vd_write_data : 64; } lb_vector_data_fld_s; } lb_vector_data_u_t; /************************************************************************ * * * Description: This register contains the vector PIO return status. * * Software should clear this register before launching a vector PIO * * request from the LB. The LB will not modify this register's value * * if an incoming reply packet encounters any kind of error. If an * * incoming reply packet does not encounter an error but the * * STATUS_VALID bit is already set, then the LB sets the OVERRUN bit * * and leaves the other fields unchanged. The LB updates the values * * of the SOURCE, PIO_ID, WRITE_ID, ADDRESS and TYPE fields only if * * an incoming vector PIO reply packet does not encounter an error * * and the STATUS_VALID bit is clear; at the same time, the LB sets * * the STATUS_VALID bit and will also update the LB_VECTOR_RETURN and * * LB_VECTOR_READ_DATA registers. * * * * * ************************************************************************/ #ifdef LITTLE_ENDIAN typedef union lb_vector_status_u { bdrkreg_t lb_vector_status_regval; struct { bdrkreg_t vs_type : 3; bdrkreg_t vs_address : 21; bdrkreg_t vs_reserved : 8; bdrkreg_t vs_write_id : 8; bdrkreg_t vs_pio_id : 11; bdrkreg_t vs_source : 11; bdrkreg_t vs_overrun : 1; bdrkreg_t vs_status_valid : 1; } lb_vector_status_fld_s; } lb_vector_status_u_t; #else typedef union lb_vector_status_u { bdrkreg_t lb_vector_status_regval; struct { bdrkreg_t vs_status_valid : 1; bdrkreg_t vs_overrun : 1; bdrkreg_t vs_source : 11; bdrkreg_t vs_pio_id : 11; bdrkreg_t vs_write_id : 8; bdrkreg_t vs_reserved : 8; bdrkreg_t vs_address : 21; bdrkreg_t vs_type : 3; } lb_vector_status_fld_s; } lb_vector_status_u_t; #endif /************************************************************************ * * * This register contains the return vector PIO route. The LB will * * not modify this register's value if an incoming reply packet * * encounters any kind of error. The LB also will not modify this * * register's value if the STATUS_VALID bit in the LB_VECTOR_STATUS * * register is set when it receives an incoming vector PIO reply. The * * LB stores an incoming vector PIO reply packet's vector route flit * * in this register only if the packet does not encounter an error * * and the STATUS_VALID bit is clear. * * * ************************************************************************/ typedef union lb_vector_return_u { bdrkreg_t lb_vector_return_regval; struct { bdrkreg_t vr_return_vector : 64; } lb_vector_return_fld_s; } lb_vector_return_u_t; /************************************************************************ * * * This register contains the vector PIO read data, if any. The LB * * will not modify this register's value if an incoming reply packet * * encounters any kind of error. The LB also will not modify this * * register's value if the STATUS_VALID bit in the LB_VECTOR_STATUS * * register is set when it receives an incoming vector PIO reply. The * * LB stores an incoming vector PIO reply packet's data flit in this * * register only if the packet does not encounter an error and the * * STATUS_VALID bit is clear. * * * ************************************************************************/ typedef union lb_vector_read_data_u { bdrkreg_t lb_vector_read_data_regval; struct { bdrkreg_t vrd_read_data : 64; } lb_vector_read_data_fld_s; } lb_vector_read_data_u_t; /************************************************************************ * * * Description: This register contains the vector PIO return status. * * Software should clear this register before launching a vector PIO * * request from the LB. The LB will not modify this register's value * * if an incoming reply packet encounters any kind of error. If an * * incoming reply packet does not encounter an error but the * * STATUS_VALID bit is already set, then the LB sets the OVERRUN bit * * and leaves the other fields unchanged. The LB updates the values * * of the SOURCE, PIO_ID, WRITE_ID, ADDRESS and TYPE fields only if * * an incoming vector PIO reply packet does not encounter an error * * and the STATUS_VALID bit is clear; at the same time, the LB sets * * the STATUS_VALID bit and will also update the LB_VECTOR_RETURN and * * LB_VECTOR_READ_DATA registers. * * * * * ************************************************************************/ #ifdef LITTLE_ENDIAN typedef union lb_vector_status_clear_u { bdrkreg_t lb_vector_status_clear_regval; struct { bdrkreg_t vsc_type : 3; bdrkreg_t vsc_address : 21; bdrkreg_t vsc_reserved : 8; bdrkreg_t vsc_write_id : 8; bdrkreg_t vsc_pio_id : 11; bdrkreg_t vsc_source : 11; bdrkreg_t vsc_overrun : 1; bdrkreg_t vsc_status_valid : 1; } lb_vector_status_clear_fld_s; } lb_vector_status_clear_u_t; #else typedef union lb_vector_status_clear_u { bdrkreg_t lb_vector_status_clear_regval; struct { bdrkreg_t vsc_status_valid : 1; bdrkreg_t vsc_overrun : 1; bdrkreg_t vsc_source : 11; bdrkreg_t vsc_pio_id : 11; bdrkreg_t vsc_write_id : 8; bdrkreg_t vsc_reserved : 8; bdrkreg_t vsc_address : 21; bdrkreg_t vsc_type : 3; } lb_vector_status_clear_fld_s; } lb_vector_status_clear_u_t; #endif #endif /* __ASSEMBLY__ */ /************************************************************************ * * * MAKE ALL ADDITIONS AFTER THIS LINE * * * ************************************************************************/ #endif /* _ASM_IA64_SN_SN1_HUBLB_H */