/* $Id: xbow.h,v 1.1.1.1 2003/06/23 22:18:40 jharrell Exp $ * * 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 Silicon Graphics, Inc. * Copyright (C) 2000 by Colin Ngam */ #ifndef _ASM_SN_SN_XTALK_XBOW_H #define _ASM_SN_SN_XTALK_XBOW_H /* * xbow.h - header file for crossbow chip and xbow section of xbridge */ #include #include #include #ifdef LANGUAGE_C #include #endif #define XBOW_DRV_PREFIX "xbow_" /* The crossbow chip supports 8 8/16 bits I/O ports, numbered 0x8 through 0xf. * It also implements the widget 0 address space and register set. */ #define XBOW_PORT_0 0x0 #define XBOW_PORT_8 0x8 #define XBOW_PORT_9 0x9 #define XBOW_PORT_A 0xa #define XBOW_PORT_B 0xb #define XBOW_PORT_C 0xc #define XBOW_PORT_D 0xd #define XBOW_PORT_E 0xe #define XBOW_PORT_F 0xf #define MAX_XBOW_PORTS 8 /* number of ports on xbow chip */ #define BASE_XBOW_PORT XBOW_PORT_8 /* Lowest external port */ #define MAX_PORT_NUM 0x10 /* maximum port number + 1 */ #define XBOW_WIDGET_ID 0 /* xbow is itself widget 0 */ #define XBOW_CREDIT 4 #define MAX_XBOW_NAME 16 #if LANGUAGE_C typedef uint32_t xbowreg_t; #define XBOWCONST (xbowreg_t) /* Generic xbow register, given base and offset */ #define XBOW_REG_PTR(base, offset) ((volatile xbowreg_t*) \ ((__psunsigned_t)(base) + (__psunsigned_t)(offset))) /* Register set for each xbow link */ typedef volatile struct xb_linkregs_s { #ifdef LITTLE_ENDIAN /* * we access these through synergy unswizzled space, so the address * gets twiddled (i.e. references to 0x4 actually go to 0x0 and vv.) * That's why we put the register first and filler second. */ xbowreg_t link_ibf; xbowreg_t filler0; /* filler for proper alignment */ xbowreg_t link_control; xbowreg_t filler1; xbowreg_t link_status; xbowreg_t filler2; xbowreg_t link_arb_upper; xbowreg_t filler3; xbowreg_t link_arb_lower; xbowreg_t filler4; xbowreg_t link_status_clr; xbowreg_t filler5; xbowreg_t link_reset; xbowreg_t filler6; xbowreg_t link_aux_status; xbowreg_t filler7; #else xbowreg_t filler0; /* filler for proper alignment */ xbowreg_t link_ibf; xbowreg_t filler1; xbowreg_t link_control; xbowreg_t filler2; xbowreg_t link_status; xbowreg_t filler3; xbowreg_t link_arb_upper; xbowreg_t filler4; xbowreg_t link_arb_lower; xbowreg_t filler5; xbowreg_t link_status_clr; xbowreg_t filler6; xbowreg_t link_reset; xbowreg_t filler7; xbowreg_t link_aux_status; #endif /* LITTLE_ENDIAN */ } xb_linkregs_t; typedef volatile struct xbow_s { /* standard widget configuration 0x000000-0x000057 */ widget_cfg_t xb_widget; /* 0x000000 */ /* helper fieldnames for accessing bridge widget */ #define xb_wid_id xb_widget.w_id #define xb_wid_stat xb_widget.w_status #define xb_wid_err_upper xb_widget.w_err_upper_addr #define xb_wid_err_lower xb_widget.w_err_lower_addr #define xb_wid_control xb_widget.w_control #define xb_wid_req_timeout xb_widget.w_req_timeout #define xb_wid_int_upper xb_widget.w_intdest_upper_addr #define xb_wid_int_lower xb_widget.w_intdest_lower_addr #define xb_wid_err_cmdword xb_widget.w_err_cmd_word #define xb_wid_llp xb_widget.w_llp_cfg #define xb_wid_stat_clr xb_widget.w_tflush #ifdef LITTLE_ENDIAN /* * we access these through synergy unswizzled space, so the address * gets twiddled (i.e. references to 0x4 actually go to 0x0 and vv.) * That's why we put the register first and filler second. */ /* xbow-specific widget configuration 0x000058-0x0000FF */ xbowreg_t xb_wid_arb_reload; /* 0x00005C */ xbowreg_t _pad_000058; xbowreg_t xb_perf_ctr_a; /* 0x000064 */ xbowreg_t _pad_000060; xbowreg_t xb_perf_ctr_b; /* 0x00006c */ xbowreg_t _pad_000068; xbowreg_t xb_nic; /* 0x000074 */ xbowreg_t _pad_000070; /* Xbridge only */ xbowreg_t xb_w0_rst_fnc; /* 0x00007C */ xbowreg_t _pad_000078; xbowreg_t xb_l8_rst_fnc; /* 0x000084 */ xbowreg_t _pad_000080; xbowreg_t xb_l9_rst_fnc; /* 0x00008c */ xbowreg_t _pad_000088; xbowreg_t xb_la_rst_fnc; /* 0x000094 */ xbowreg_t _pad_000090; xbowreg_t xb_lb_rst_fnc; /* 0x00009c */ xbowreg_t _pad_000098; xbowreg_t xb_lc_rst_fnc; /* 0x0000a4 */ xbowreg_t _pad_0000a0; xbowreg_t xb_ld_rst_fnc; /* 0x0000ac */ xbowreg_t _pad_0000a8; xbowreg_t xb_le_rst_fnc; /* 0x0000b4 */ xbowreg_t _pad_0000b0; xbowreg_t xb_lf_rst_fnc; /* 0x0000bc */ xbowreg_t _pad_0000b8; xbowreg_t xb_lock; /* 0x0000c4 */ xbowreg_t _pad_0000c0; xbowreg_t xb_lock_clr; /* 0x0000cc */ xbowreg_t _pad_0000c8; /* end of Xbridge only */ xbowreg_t _pad_0000d0[12]; #else /* xbow-specific widget configuration 0x000058-0x0000FF */ xbowreg_t _pad_000058; xbowreg_t xb_wid_arb_reload; /* 0x00005C */ xbowreg_t _pad_000060; xbowreg_t xb_perf_ctr_a; /* 0x000064 */ xbowreg_t _pad_000068; xbowreg_t xb_perf_ctr_b; /* 0x00006c */ xbowreg_t _pad_000070; xbowreg_t xb_nic; /* 0x000074 */ /* Xbridge only */ xbowreg_t _pad_000078; xbowreg_t xb_w0_rst_fnc; /* 0x00007C */ xbowreg_t _pad_000080; xbowreg_t xb_l8_rst_fnc; /* 0x000084 */ xbowreg_t _pad_000088; xbowreg_t xb_l9_rst_fnc; /* 0x00008c */ xbowreg_t _pad_000090; xbowreg_t xb_la_rst_fnc; /* 0x000094 */ xbowreg_t _pad_000098; xbowreg_t xb_lb_rst_fnc; /* 0x00009c */ xbowreg_t _pad_0000a0; xbowreg_t xb_lc_rst_fnc; /* 0x0000a4 */ xbowreg_t _pad_0000a8; xbowreg_t xb_ld_rst_fnc; /* 0x0000ac */ xbowreg_t _pad_0000b0; xbowreg_t xb_le_rst_fnc; /* 0x0000b4 */ xbowreg_t _pad_0000b8; xbowreg_t xb_lf_rst_fnc; /* 0x0000bc */ xbowreg_t _pad_0000c0; xbowreg_t xb_lock; /* 0x0000c4 */ xbowreg_t _pad_0000c8; xbowreg_t xb_lock_clr; /* 0x0000cc */ /* end of Xbridge only */ xbowreg_t _pad_0000d0[12]; #endif /* LITTLE_ENDIAN */ /* Link Specific Registers, port 8..15 0x000100-0x000300 */ xb_linkregs_t xb_link_raw[MAX_XBOW_PORTS]; #define xb_link(p) xb_link_raw[(p) & (MAX_XBOW_PORTS - 1)] } xbow_t; /* Configuration structure which describes each xbow link */ typedef struct xbow_cfg_s { int xb_port; /* port number (0-15) */ int xb_flags; /* port software flags */ short xb_shift; /* shift for arb reg (mask is 0xff) */ short xb_ul; /* upper or lower arb reg */ int xb_pad; /* use this later (pad to ptr align) */ xb_linkregs_t *xb_linkregs; /* pointer to link registers */ widget_cfg_t *xb_widget; /* pointer to widget registers */ char xb_name[MAX_XBOW_NAME]; /* port name */ xbowreg_t xb_sh_arb_upper; /* shadow upper arb register */ xbowreg_t xb_sh_arb_lower; /* shadow lower arb register */ } xbow_cfg_t; #define XB_FLAGS_EXISTS 0x1 /* device exists */ #define XB_FLAGS_MASTER 0x2 #define XB_FLAGS_SLAVE 0x0 #define XB_FLAGS_GBR 0x4 #define XB_FLAGS_16BIT 0x8 #define XB_FLAGS_8BIT 0x0 /* get xbow config information for port p */ #define XB_CONFIG(p) xbow_cfg[xb_ports[p]] /* is widget port number valid? (based on version 7.0 of xbow spec) */ #define XBOW_WIDGET_IS_VALID(wid) ((wid) >= XBOW_PORT_8 && (wid) <= XBOW_PORT_F) /* whether to use upper or lower arbitration register, given source widget id */ #define XBOW_ARB_IS_UPPER(wid) ((wid) >= XBOW_PORT_8 && (wid) <= XBOW_PORT_B) #define XBOW_ARB_IS_LOWER(wid) ((wid) >= XBOW_PORT_C && (wid) <= XBOW_PORT_F) /* offset of arbitration register, given source widget id */ #define XBOW_ARB_OFF(wid) (XBOW_ARB_IS_UPPER(wid) ? 0x1c : 0x24) #endif /* LANGUAGE_C */ #define XBOW_WID_ID WIDGET_ID #define XBOW_WID_STAT WIDGET_STATUS #define XBOW_WID_ERR_UPPER WIDGET_ERR_UPPER_ADDR #define XBOW_WID_ERR_LOWER WIDGET_ERR_LOWER_ADDR #define XBOW_WID_CONTROL WIDGET_CONTROL #define XBOW_WID_REQ_TO WIDGET_REQ_TIMEOUT #define XBOW_WID_INT_UPPER WIDGET_INTDEST_UPPER_ADDR #define XBOW_WID_INT_LOWER WIDGET_INTDEST_LOWER_ADDR #define XBOW_WID_ERR_CMDWORD WIDGET_ERR_CMD_WORD #define XBOW_WID_LLP WIDGET_LLP_CFG #define XBOW_WID_STAT_CLR WIDGET_TFLUSH #define XBOW_WID_ARB_RELOAD 0x5c #define XBOW_WID_PERF_CTR_A 0x64 #define XBOW_WID_PERF_CTR_B 0x6c #define XBOW_WID_NIC 0x74 /* Xbridge only */ #define XBOW_W0_RST_FNC 0x00007C #define XBOW_L8_RST_FNC 0x000084 #define XBOW_L9_RST_FNC 0x00008c #define XBOW_LA_RST_FNC 0x000094 #define XBOW_LB_RST_FNC 0x00009c #define XBOW_LC_RST_FNC 0x0000a4 #define XBOW_LD_RST_FNC 0x0000ac #define XBOW_LE_RST_FNC 0x0000b4 #define XBOW_LF_RST_FNC 0x0000bc #define XBOW_RESET_FENCE(x) ((x) > 7 && (x) < 16) ? \ (XBOW_W0_RST_FNC + ((x) - 7) * 8) : \ ((x) == 0) ? XBOW_W0_RST_FNC : 0 #define XBOW_LOCK 0x0000c4 #define XBOW_LOCK_CLR 0x0000cc /* End of Xbridge only */ /* used only in ide, but defined here within the reserved portion */ /* of the widget0 address space (before 0xf4) */ #define XBOW_WID_UNDEF 0xe4 /* pointer to link arbitration register, given xbow base, dst and src widget id */ #define XBOW_PRIO_ARBREG_PTR(base, dst_wid, src_wid) \ XBOW_REG_PTR(XBOW_PRIO_LINKREGS_PTR(base, dst_wid), XBOW_ARB_OFF(src_wid)) /* pointer to link registers base, given xbow base and destination widget id */ #define XBOW_PRIO_LINKREGS_PTR(base, dst_wid) (xb_linkregs_t*) \ XBOW_REG_PTR(base, XB_LINK_REG_BASE(dst_wid)) /* xbow link register set base, legal value for x is 0x8..0xf */ #define XB_LINK_BASE 0x100 #define XB_LINK_OFFSET 0x40 #define XB_LINK_REG_BASE(x) (XB_LINK_BASE + ((x) & (MAX_XBOW_PORTS - 1)) * XB_LINK_OFFSET) #define XB_LINK_IBUF_FLUSH(x) (XB_LINK_REG_BASE(x) + 0x4) #define XB_LINK_CTRL(x) (XB_LINK_REG_BASE(x) + 0xc) #define XB_LINK_STATUS(x) (XB_LINK_REG_BASE(x) + 0x14) #define XB_LINK_ARB_UPPER(x) (XB_LINK_REG_BASE(x) + 0x1c) #define XB_LINK_ARB_LOWER(x) (XB_LINK_REG_BASE(x) + 0x24) #define XB_LINK_STATUS_CLR(x) (XB_LINK_REG_BASE(x) + 0x2c) #define XB_LINK_RESET(x) (XB_LINK_REG_BASE(x) + 0x34) #define XB_LINK_AUX_STATUS(x) (XB_LINK_REG_BASE(x) + 0x3c) /* link_control(x) */ #define XB_CTRL_LINKALIVE_IE 0x80000000 /* link comes alive */ /* reserved: 0x40000000 */ #define XB_CTRL_PERF_CTR_MODE_MSK 0x30000000 /* perf counter mode */ #define XB_CTRL_IBUF_LEVEL_MSK 0x0e000000 /* input packet buffer level */ #define XB_CTRL_8BIT_MODE 0x01000000 /* force link into 8 bit mode */ #define XB_CTRL_BAD_LLP_PKT 0x00800000 /* force bad LLP packet */ #define XB_CTRL_WIDGET_CR_MSK 0x007c0000 /* LLP widget credit mask */ #define XB_CTRL_WIDGET_CR_SHFT 18 /* LLP widget credit shift */ #define XB_CTRL_ILLEGAL_DST_IE 0x00020000 /* illegal destination */ #define XB_CTRL_OALLOC_IBUF_IE 0x00010000 /* overallocated input buffer */ /* reserved: 0x0000fe00 */ #define XB_CTRL_BNDWDTH_ALLOC_IE 0x00000100 /* bandwidth alloc */ #define XB_CTRL_RCV_CNT_OFLOW_IE 0x00000080 /* rcv retry overflow */ #define XB_CTRL_XMT_CNT_OFLOW_IE 0x00000040 /* xmt retry overflow */ #define XB_CTRL_XMT_MAX_RTRY_IE 0x00000020 /* max transmit retry */ #define XB_CTRL_RCV_IE 0x00000010 /* receive */ #define XB_CTRL_XMT_RTRY_IE 0x00000008 /* transmit retry */ /* reserved: 0x00000004 */ #define XB_CTRL_MAXREQ_TOUT_IE 0x00000002 /* maximum request timeout */ #define XB_CTRL_SRC_TOUT_IE 0x00000001 /* source timeout */ /* link_status(x) */ #define XB_STAT_LINKALIVE XB_CTRL_LINKALIVE_IE /* reserved: 0x7ff80000 */ #define XB_STAT_MULTI_ERR 0x00040000 /* multi error */ #define XB_STAT_ILLEGAL_DST_ERR XB_CTRL_ILLEGAL_DST_IE #define XB_STAT_OALLOC_IBUF_ERR XB_CTRL_OALLOC_IBUF_IE #define XB_STAT_BNDWDTH_ALLOC_ID_MSK 0x0000ff00 /* port bitmask */ #define XB_STAT_RCV_CNT_OFLOW_ERR XB_CTRL_RCV_CNT_OFLOW_IE #define XB_STAT_XMT_CNT_OFLOW_ERR XB_CTRL_XMT_CNT_OFLOW_IE #define XB_STAT_XMT_MAX_RTRY_ERR XB_CTRL_XMT_MAX_RTRY_IE #define XB_STAT_RCV_ERR XB_CTRL_RCV_IE #define XB_STAT_XMT_RTRY_ERR XB_CTRL_XMT_RTRY_IE /* reserved: 0x00000004 */ #define XB_STAT_MAXREQ_TOUT_ERR XB_CTRL_MAXREQ_TOUT_IE #define XB_STAT_SRC_TOUT_ERR XB_CTRL_SRC_TOUT_IE /* link_aux_status(x) */ #define XB_AUX_STAT_RCV_CNT 0xff000000 #define XB_AUX_STAT_XMT_CNT 0x00ff0000 #define XB_AUX_STAT_TOUT_DST 0x0000ff00 #define XB_AUX_LINKFAIL_RST_BAD 0x00000040 #define XB_AUX_STAT_PRESENT 0x00000020 #define XB_AUX_STAT_PORT_WIDTH 0x00000010 /* reserved: 0x0000000f */ /* * link_arb_upper/link_arb_lower(x), (reg) should be the link_arb_upper * register if (x) is 0x8..0xb, link_arb_lower if (x) is 0xc..0xf */ #define XB_ARB_GBR_MSK 0x1f #define XB_ARB_RR_MSK 0x7 #define XB_ARB_GBR_SHFT(x) (((x) & 0x3) * 8) #define XB_ARB_RR_SHFT(x) (((x) & 0x3) * 8 + 5) #define XB_ARB_GBR_CNT(reg,x) ((reg) >> XB_ARB_GBR_SHFT(x) & XB_ARB_GBR_MSK) #define XB_ARB_RR_CNT(reg,x) ((reg) >> XB_ARB_RR_SHFT(x) & XB_ARB_RR_MSK) /* XBOW_WID_STAT */ #define XB_WID_STAT_LINK_INTR_SHFT (24) #define XB_WID_STAT_LINK_INTR_MASK (0xFF << XB_WID_STAT_LINK_INTR_SHFT) #define XB_WID_STAT_LINK_INTR(x) (0x1 << (((x)&7) + XB_WID_STAT_LINK_INTR_SHFT)) #define XB_WID_STAT_WIDGET0_INTR 0x00800000 #define XB_WID_STAT_SRCID_MASK 0x000003c0 /* Xbridge only */ #define XB_WID_STAT_REG_ACC_ERR 0x00000020 #define XB_WID_STAT_RECV_TOUT 0x00000010 /* Xbridge only */ #define XB_WID_STAT_ARB_TOUT 0x00000008 /* Xbridge only */ #define XB_WID_STAT_XTALK_ERR 0x00000004 #define XB_WID_STAT_DST_TOUT 0x00000002 /* Xbridge only */ #define XB_WID_STAT_MULTI_ERR 0x00000001 #define XB_WID_STAT_SRCID_SHFT 6 /* XBOW_WID_CONTROL */ #define XB_WID_CTRL_REG_ACC_IE XB_WID_STAT_REG_ACC_ERR #define XB_WID_CTRL_RECV_TOUT XB_WID_STAT_RECV_TOUT #define XB_WID_CTRL_ARB_TOUT XB_WID_STAT_ARB_TOUT #define XB_WID_CTRL_XTALK_IE XB_WID_STAT_XTALK_ERR /* XBOW_WID_INT_UPPER */ /* defined in xwidget.h for WIDGET_INTDEST_UPPER_ADDR */ /* XBOW WIDGET part number, in the ID register */ #define XBOW_WIDGET_PART_NUM 0x0 /* crossbow */ #define XXBOW_WIDGET_PART_NUM 0xd000 /* Xbridge */ #define XBOW_WIDGET_MFGR_NUM 0x0 #define XXBOW_WIDGET_MFGR_NUM 0x0 #define XBOW_REV_1_0 0x1 /* xbow rev 1.0 is "1" */ #define XBOW_REV_1_1 0x2 /* xbow rev 1.1 is "2" */ #define XBOW_REV_1_2 0x3 /* xbow rev 1.2 is "3" */ #define XBOW_REV_1_3 0x4 /* xbow rev 1.3 is "4" */ #define XBOW_REV_2_0 0x5 /* xbow rev 2.0 is "5" */ #define XXBOW_PART_REV_1_0 (XXBOW_WIDGET_PART_NUM << 4 | 0x1 ) #define XXBOW_PART_REV_2_0 (XXBOW_WIDGET_PART_NUM << 4 | 0x2 ) /* XBOW_WID_ARB_RELOAD */ #define XBOW_WID_ARB_RELOAD_INT 0x3f /* GBR reload interval */ #define nasid_has_xbridge(nasid) \ (XWIDGET_PART_NUM(XWIDGET_ID_READ(nasid, 0)) == XXBOW_WIDGET_PART_NUM) #ifdef _LANGUAGE_C /* * XBOW Widget 0 Register formats. * Format for many of these registers are similar to the standard * widget register format described as part of xtalk specification * Standard widget register field format description is available in * xwidget.h * Following structures define the format for xbow widget 0 registers */ /* * Xbow Widget 0 Command error word */ #ifdef LITTLE_ENDIAN typedef union xbw0_cmdword_u { xbowreg_t cmdword; struct { uint32_t rsvd:8, /* Reserved */ barr:1, /* Barrier operation */ error:1, /* Error Occured */ vbpm:1, /* Virtual Backplane message */ gbr:1, /* GBR enable ? */ ds:2, /* Data size */ ct:1, /* Is it a coherent transaction */ tnum:5, /* Transaction Number */ pactyp:4, /* Packet type: */ srcid:4, /* Source ID number */ destid:4; /* Desination ID number */ } xbw0_cmdfield; } xbw0_cmdword_t; #else typedef union xbw0_cmdword_u { xbowreg_t cmdword; struct { uint32_t destid:4, /* Desination ID number */ srcid:4, /* Source ID number */ pactyp:4, /* Packet type: */ tnum:5, /* Transaction Number */ ct:1, /* Is it a coherent transaction */ ds:2, /* Data size */ gbr:1, /* GBR enable ? */ vbpm:1, /* Virtual Backplane message */ error:1, /* Error Occured */ barr:1, /* Barrier operation */ rsvd:8; /* Reserved */ } xbw0_cmdfield; } xbw0_cmdword_t; #endif #define xbcmd_destid xbw0_cmdfield.destid #define xbcmd_srcid xbw0_cmdfield.srcid #define xbcmd_pactyp xbw0_cmdfield.pactyp #define xbcmd_tnum xbw0_cmdfield.tnum #define xbcmd_ct xbw0_cmdfield.ct #define xbcmd_ds xbw0_cmdfield.ds #define xbcmd_gbr xbw0_cmdfield.gbr #define xbcmd_vbpm xbw0_cmdfield.vbpm #define xbcmd_error xbw0_cmdfield.error #define xbcmd_barr xbw0_cmdfield.barr /* * Values for field PACTYP in xbow error command word */ #define XBCMDTYP_READREQ 0 /* Read Request packet */ #define XBCMDTYP_READRESP 1 /* Read Response packet */ #define XBCMDTYP_WRREQ_RESP 2 /* Write Request with response */ #define XBCMDTYP_WRRESP 3 /* Write Response */ #define XBCMDTYP_WRREQ_NORESP 4 /* Write request with No Response */ #define XBCMDTYP_FETCHOP 6 /* Fetch & Op packet */ #define XBCMDTYP_STOREOP 8 /* Store & Op packet */ #define XBCMDTYP_SPLPKT_REQ 0xE /* Special packet request */ #define XBCMDTYP_SPLPKT_RESP 0xF /* Special packet response */ /* * Values for field ds (datasize) in xbow error command word */ #define XBCMDSZ_DOUBLEWORD 0 #define XBCMDSZ_QUARTRCACHE 1 #define XBCMDSZ_FULLCACHE 2 /* * Xbow widget 0 Status register format. */ #ifdef LITTLE_ENDIAN typedef union xbw0_status_u { xbowreg_t statusword; struct { uint32_t mult_err:1, /* Multiple error occurred */ connect_tout:1, /* Connection timeout */ xtalk_err:1, /* Xtalk pkt with error bit */ /* End of Xbridge only */ w0_arb_tout, /* arbiter timeout err */ w0_recv_tout, /* receive timeout err */ /* Xbridge only */ regacc_err:1, /* Reg Access error */ src_id:4, /* source id. Xbridge only */ resvd1:13, wid0intr:1; /* Widget 0 err intr */ } xbw0_stfield; } xbw0_status_t; #else typedef union xbw0_status_u { xbowreg_t statusword; struct { uint32_t linkXintr:8, /* link(x) error intr */ wid0intr:1, /* Widget 0 err intr */ resvd1:13, src_id:4, /* source id. Xbridge only */ regacc_err:1, /* Reg Access error */ /* Xbridge only */ w0_recv_tout, /* receive timeout err */ w0_arb_tout, /* arbiter timeout err */ /* End of Xbridge only */ xtalk_err:1, /* Xtalk pkt with error bit */ connect_tout:1, /* Connection timeout */ mult_err:1; /* Multiple error occurred */ } xbw0_stfield; } xbw0_status_t; #endif #define xbst_linkXintr xbw0_stfield.linkXintr #define xbst_w0intr xbw0_stfield.wid0intr #define xbst_regacc_err xbw0_stfield.regacc_err #define xbst_xtalk_err xbw0_stfield.xtalk_err #define xbst_connect_tout xbw0_stfield.connect_tout #define xbst_mult_err xbw0_stfield.mult_err #define xbst_src_id xbw0_stfield.src_id /* Xbridge only */ #define xbst_w0_recv_tout xbw0_stfield.w0_recv_tout /* Xbridge only */ #define xbst_w0_arb_tout xbw0_stfield.w0_arb_tout /* Xbridge only */ /* * Xbow widget 0 Control register format */ #ifdef LITTLE_ENDIAN typedef union xbw0_ctrl_u { xbowreg_t ctrlword; struct { uint32_t resvd3:1, conntout_intr:1, xtalkerr_intr:1, w0_arg_tout_intr:1, /* Xbridge only */ w0_recv_tout_intr:1, /* Xbridge only */ accerr_intr:1, enable_w0_tout_cntr:1, /* Xbridge only */ enable_watchdog:1, /* Xbridge only */ resvd1:24; } xbw0_ctrlfield; } xbw0_ctrl_t; #else typedef union xbw0_ctrl_u { xbowreg_t ctrlword; struct { uint32_t resvd1:24, enable_watchdog:1, /* Xbridge only */ enable_w0_tout_cntr:1, /* Xbridge only */ accerr_intr:1, w0_recv_tout_intr:1, /* Xbridge only */ w0_arg_tout_intr:1, /* Xbridge only */ xtalkerr_intr:1, conntout_intr:1, resvd3:1; } xbw0_ctrlfield; } xbw0_ctrl_t; #endif #ifdef LITTLE_ENDIAN typedef union xbow_linkctrl_u { xbowreg_t xbl_ctrlword; struct { uint32_t srcto_intr:1, maxto_intr:1, rsvd3:1, trx_retry_intr:1, rcv_err_intr:1, trx_max_retry_intr:1, trxov_intr:1, rcvov_intr:1, bwalloc_intr:1, rsvd2:7, obuf_intr:1, idest_intr:1, llp_credit:5, force_badllp:1, send_bm8:1, inbuf_level:3, perf_mode:2, rsvd1:1, alive_intr:1; } xb_linkcontrol; } xbow_linkctrl_t; #else typedef union xbow_linkctrl_u { xbowreg_t xbl_ctrlword; struct { uint32_t alive_intr:1, rsvd1:1, perf_mode:2, inbuf_level:3, send_bm8:1, force_badllp:1, llp_credit:5, idest_intr:1, obuf_intr:1, rsvd2:7, bwalloc_intr:1, rcvov_intr:1, trxov_intr:1, trx_max_retry_intr:1, rcv_err_intr:1, trx_retry_intr:1, rsvd3:1, maxto_intr:1, srcto_intr:1; } xb_linkcontrol; } xbow_linkctrl_t; #endif #define xbctl_accerr_intr (xbw0_ctrlfield.accerr_intr) #define xbctl_xtalkerr_intr (xbw0_ctrlfield.xtalkerr_intr) #define xbctl_cnntout_intr (xbw0_ctrlfield.conntout_intr) #define XBW0_CTRL_ACCERR_INTR (1 << 5) #define XBW0_CTRL_XTERR_INTR (1 << 2) #define XBW0_CTRL_CONNTOUT_INTR (1 << 1) /* * Xbow Link specific Registers structure definitions. */ #ifdef LITTLE_ENDIAN typedef union xbow_linkX_status_u { xbowreg_t linkstatus; struct { uint32_t pkt_toutsrc:1, pkt_toutconn:1, /* max_req_tout in Xbridge */ pkt_toutdest:1, /* reserved in Xbridge */ llp_xmitretry:1, llp_rcverror:1, llp_maxtxretry:1, llp_txovflow:1, llp_rxovflow:1, bw_errport:8, /* BW allocation error port */ ioe:1, /* Input overallocation error */ illdest:1, merror:1, resvd1:12, alive:1; } xb_linkstatus; } xbwX_stat_t; #else typedef union xbow_linkX_status_u { xbowreg_t linkstatus; struct { uint32_t alive:1, resvd1:12, merror:1, illdest:1, ioe:1, /* Input overallocation error */ bw_errport:8, /* BW allocation error port */ llp_rxovflow:1, llp_txovflow:1, llp_maxtxretry:1, llp_rcverror:1, llp_xmitretry:1, pkt_toutdest:1, /* reserved in Xbridge */ pkt_toutconn:1, /* max_req_tout in Xbridge */ pkt_toutsrc:1; } xb_linkstatus; } xbwX_stat_t; #endif #define link_alive xb_linkstatus.alive #define link_multierror xb_linkstatus.merror #define link_illegal_dest xb_linkstatus.illdest #define link_ioe xb_linkstatus.ioe #define link_max_req_tout xb_linkstatus.pkt_toutconn /* Xbridge */ #define link_pkt_toutconn xb_linkstatus.pkt_toutconn /* Xbow */ #define link_pkt_toutdest xb_linkstatus.pkt_toutdest #define link_pkt_toutsrc xb_linkstatus.pkt_toutsrc #ifdef LITTLE_ENDIAN typedef union xbow_aux_linkX_status_u { xbowreg_t aux_linkstatus; struct { uint32_t rsvd2:4, bit_mode_8:1, wid_present:1, fail_mode:1, rsvd1:1, to_src_loc:8, tx_retry_cnt:8, rx_err_cnt:8; } xb_aux_linkstatus; } xbow_aux_link_status_t; #else typedef union xbow_aux_linkX_status_u { xbowreg_t aux_linkstatus; struct { uint32_t rx_err_cnt:8, tx_retry_cnt:8, to_src_loc:8, rsvd1:1, fail_mode:1, wid_present:1, bit_mode_8:1, rsvd2:4; } xb_aux_linkstatus; } xbow_aux_link_status_t; #endif #ifdef LITTLE_ENDIAN typedef union xbow_perf_count_u { xbowreg_t xb_counter_val; struct { uint32_t count:20, link_select:3, rsvd:9; } xb_perf; } xbow_perfcount_t; #else typedef union xbow_perf_count_u { xbowreg_t xb_counter_val; struct { uint32_t rsvd:9, link_select:3, count:20; } xb_perf; } xbow_perfcount_t; #endif #define XBOW_COUNTER_MASK 0xFFFFF extern int xbow_widget_present(xbow_t * xbow, int port); extern xwidget_intr_preset_f xbow_intr_preset; extern xswitch_reset_link_f xbow_reset_link; void xbow_mlreset(xbow_t *); /* ======================================================================== */ #ifdef MACROFIELD_LINE /* * This table forms a relation between the byte offset macros normally * used for ASM coding and the calculated byte offsets of the fields * in the C structure. * * See xbow_check.c xbow_html.c for further details. */ #ifndef MACROFIELD_LINE_BITFIELD #define MACROFIELD_LINE_BITFIELD(m) /* ignored */ #endif struct macrofield_s xbow_macrofield[] = { MACROFIELD_LINE(XBOW_WID_ID, xb_wid_id) MACROFIELD_LINE(XBOW_WID_STAT, xb_wid_stat) MACROFIELD_LINE_BITFIELD(XB_WID_STAT_LINK_INTR(0xF)) MACROFIELD_LINE_BITFIELD(XB_WID_STAT_LINK_INTR(0xE)) MACROFIELD_LINE_BITFIELD(XB_WID_STAT_LINK_INTR(0xD)) MACROFIELD_LINE_BITFIELD(XB_WID_STAT_LINK_INTR(0xC)) MACROFIELD_LINE_BITFIELD(XB_WID_STAT_LINK_INTR(0xB)) MACROFIELD_LINE_BITFIELD(XB_WID_STAT_LINK_INTR(0xA)) MACROFIELD_LINE_BITFIELD(XB_WID_STAT_LINK_INTR(0x9)) MACROFIELD_LINE_BITFIELD(XB_WID_STAT_LINK_INTR(0x8)) MACROFIELD_LINE_BITFIELD(XB_WID_STAT_WIDGET0_INTR) MACROFIELD_LINE_BITFIELD(XB_WID_STAT_REG_ACC_ERR) MACROFIELD_LINE_BITFIELD(XB_WID_STAT_XTALK_ERR) MACROFIELD_LINE_BITFIELD(XB_WID_STAT_MULTI_ERR) MACROFIELD_LINE(XBOW_WID_ERR_UPPER, xb_wid_err_upper) MACROFIELD_LINE(XBOW_WID_ERR_LOWER, xb_wid_err_lower) MACROFIELD_LINE(XBOW_WID_CONTROL, xb_wid_control) MACROFIELD_LINE_BITFIELD(XB_WID_CTRL_REG_ACC_IE) MACROFIELD_LINE_BITFIELD(XB_WID_CTRL_XTALK_IE) MACROFIELD_LINE(XBOW_WID_REQ_TO, xb_wid_req_timeout) MACROFIELD_LINE(XBOW_WID_INT_UPPER, xb_wid_int_upper) MACROFIELD_LINE(XBOW_WID_INT_LOWER, xb_wid_int_lower) MACROFIELD_LINE(XBOW_WID_ERR_CMDWORD, xb_wid_err_cmdword) MACROFIELD_LINE(XBOW_WID_LLP, xb_wid_llp) MACROFIELD_LINE(XBOW_WID_STAT_CLR, xb_wid_stat_clr) MACROFIELD_LINE(XBOW_WID_ARB_RELOAD, xb_wid_arb_reload) MACROFIELD_LINE(XBOW_WID_PERF_CTR_A, xb_perf_ctr_a) MACROFIELD_LINE(XBOW_WID_PERF_CTR_B, xb_perf_ctr_b) MACROFIELD_LINE(XBOW_WID_NIC, xb_nic) MACROFIELD_LINE(XB_LINK_REG_BASE(8), xb_link(8)) MACROFIELD_LINE(XB_LINK_IBUF_FLUSH(8), xb_link(8).link_ibf) MACROFIELD_LINE(XB_LINK_CTRL(8), xb_link(8).link_control) MACROFIELD_LINE_BITFIELD(XB_CTRL_LINKALIVE_IE) MACROFIELD_LINE_BITFIELD(XB_CTRL_PERF_CTR_MODE_MSK) MACROFIELD_LINE_BITFIELD(XB_CTRL_IBUF_LEVEL_MSK) MACROFIELD_LINE_BITFIELD(XB_CTRL_8BIT_MODE) MACROFIELD_LINE_BITFIELD(XB_CTRL_BAD_LLP_PKT) MACROFIELD_LINE_BITFIELD(XB_CTRL_WIDGET_CR_MSK) MACROFIELD_LINE_BITFIELD(XB_CTRL_ILLEGAL_DST_IE) MACROFIELD_LINE_BITFIELD(XB_CTRL_OALLOC_IBUF_IE) MACROFIELD_LINE_BITFIELD(XB_CTRL_BNDWDTH_ALLOC_IE) MACROFIELD_LINE_BITFIELD(XB_CTRL_RCV_CNT_OFLOW_IE) MACROFIELD_LINE_BITFIELD(XB_CTRL_XMT_CNT_OFLOW_IE) MACROFIELD_LINE_BITFIELD(XB_CTRL_XMT_MAX_RTRY_IE) MACROFIELD_LINE_BITFIELD(XB_CTRL_RCV_IE) MACROFIELD_LINE_BITFIELD(XB_CTRL_XMT_RTRY_IE) MACROFIELD_LINE_BITFIELD(XB_CTRL_MAXREQ_TOUT_IE) MACROFIELD_LINE_BITFIELD(XB_CTRL_SRC_TOUT_IE) MACROFIELD_LINE(XB_LINK_STATUS(8), xb_link(8).link_status) MACROFIELD_LINE_BITFIELD(XB_STAT_LINKALIVE) MACROFIELD_LINE_BITFIELD(XB_STAT_MULTI_ERR) MACROFIELD_LINE_BITFIELD(XB_STAT_ILLEGAL_DST_ERR) MACROFIELD_LINE_BITFIELD(XB_STAT_OALLOC_IBUF_ERR) MACROFIELD_LINE_BITFIELD(XB_STAT_BNDWDTH_ALLOC_ID_MSK) MACROFIELD_LINE_BITFIELD(XB_STAT_RCV_CNT_OFLOW_ERR) MACROFIELD_LINE_BITFIELD(XB_STAT_XMT_CNT_OFLOW_ERR) MACROFIELD_LINE_BITFIELD(XB_STAT_XMT_MAX_RTRY_ERR) MACROFIELD_LINE_BITFIELD(XB_STAT_RCV_ERR) MACROFIELD_LINE_BITFIELD(XB_STAT_XMT_RTRY_ERR) MACROFIELD_LINE_BITFIELD(XB_STAT_MAXREQ_TOUT_ERR) MACROFIELD_LINE_BITFIELD(XB_STAT_SRC_TOUT_ERR) MACROFIELD_LINE(XB_LINK_ARB_UPPER(8), xb_link(8).link_arb_upper) MACROFIELD_LINE_BITFIELD(XB_ARB_RR_MSK << XB_ARB_RR_SHFT(0xb)) MACROFIELD_LINE_BITFIELD(XB_ARB_GBR_MSK << XB_ARB_GBR_SHFT(0xb)) MACROFIELD_LINE_BITFIELD(XB_ARB_RR_MSK << XB_ARB_RR_SHFT(0xa)) MACROFIELD_LINE_BITFIELD(XB_ARB_GBR_MSK << XB_ARB_GBR_SHFT(0xa)) MACROFIELD_LINE_BITFIELD(XB_ARB_RR_MSK << XB_ARB_RR_SHFT(0x9)) MACROFIELD_LINE_BITFIELD(XB_ARB_GBR_MSK << XB_ARB_GBR_SHFT(0x9)) MACROFIELD_LINE_BITFIELD(XB_ARB_RR_MSK << XB_ARB_RR_SHFT(0x8)) MACROFIELD_LINE_BITFIELD(XB_ARB_GBR_MSK << XB_ARB_GBR_SHFT(0x8)) MACROFIELD_LINE(XB_LINK_ARB_LOWER(8), xb_link(8).link_arb_lower) MACROFIELD_LINE_BITFIELD(XB_ARB_RR_MSK << XB_ARB_RR_SHFT(0xf)) MACROFIELD_LINE_BITFIELD(XB_ARB_GBR_MSK << XB_ARB_GBR_SHFT(0xf)) MACROFIELD_LINE_BITFIELD(XB_ARB_RR_MSK << XB_ARB_RR_SHFT(0xe)) MACROFIELD_LINE_BITFIELD(XB_ARB_GBR_MSK << XB_ARB_GBR_SHFT(0xe)) MACROFIELD_LINE_BITFIELD(XB_ARB_RR_MSK << XB_ARB_RR_SHFT(0xd)) MACROFIELD_LINE_BITFIELD(XB_ARB_GBR_MSK << XB_ARB_GBR_SHFT(0xd)) MACROFIELD_LINE_BITFIELD(XB_ARB_RR_MSK << XB_ARB_RR_SHFT(0xc)) MACROFIELD_LINE_BITFIELD(XB_ARB_GBR_MSK << XB_ARB_GBR_SHFT(0xc)) MACROFIELD_LINE(XB_LINK_STATUS_CLR(8), xb_link(8).link_status_clr) MACROFIELD_LINE(XB_LINK_RESET(8), xb_link(8).link_reset) MACROFIELD_LINE(XB_LINK_AUX_STATUS(8), xb_link(8).link_aux_status) MACROFIELD_LINE_BITFIELD(XB_AUX_STAT_RCV_CNT) MACROFIELD_LINE_BITFIELD(XB_AUX_STAT_XMT_CNT) MACROFIELD_LINE_BITFIELD(XB_AUX_LINKFAIL_RST_BAD) MACROFIELD_LINE_BITFIELD(XB_AUX_STAT_PRESENT) MACROFIELD_LINE_BITFIELD(XB_AUX_STAT_PORT_WIDTH) MACROFIELD_LINE_BITFIELD(XB_AUX_STAT_TOUT_DST) MACROFIELD_LINE(XB_LINK_REG_BASE(0x8), xb_link(0x8)) MACROFIELD_LINE(XB_LINK_REG_BASE(0x9), xb_link(0x9)) MACROFIELD_LINE(XB_LINK_REG_BASE(0xA), xb_link(0xA)) MACROFIELD_LINE(XB_LINK_REG_BASE(0xB), xb_link(0xB)) MACROFIELD_LINE(XB_LINK_REG_BASE(0xC), xb_link(0xC)) MACROFIELD_LINE(XB_LINK_REG_BASE(0xD), xb_link(0xD)) MACROFIELD_LINE(XB_LINK_REG_BASE(0xE), xb_link(0xE)) MACROFIELD_LINE(XB_LINK_REG_BASE(0xF), xb_link(0xF)) }; /* xbow_macrofield[] */ #endif /* MACROFIELD_LINE */ #endif /* _LANGUAGE_C */ #endif /* _ASM_SN_SN_XTALK_XBOW_H */