1 /* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file "COPYING" in the main directory of this archive 4 * for more details. 5 * 6 * Copyright (C) 1992-1997,2000-2006 Silicon Graphics, Inc. All Rights 7 * Reserved. 8 */ 9 #ifndef _ASM_IA64_SN_XTALK_XBOW_H 10 #define _ASM_IA64_SN_XTALK_XBOW_H 11 12 #define XBOW_PORT_8 0x8 13 #define XBOW_PORT_C 0xc 14 #define XBOW_PORT_F 0xf 15 16 #define MAX_XBOW_PORTS 8 /* number of ports on xbow chip */ 17 #define BASE_XBOW_PORT XBOW_PORT_8 /* Lowest external port */ 18 19 #define XBOW_CREDIT 4 20 21 #define MAX_XBOW_NAME 16 22 23 /* Register set for each xbow link */ 24 typedef volatile struct xb_linkregs_s { 25 /* 26 * we access these through synergy unswizzled space, so the address 27 * gets twiddled (i.e. references to 0x4 actually go to 0x0 and vv.) 28 * That's why we put the register first and filler second. 29 */ 30 u32 link_ibf; 31 u32 filler0; /* filler for proper alignment */ 32 u32 link_control; 33 u32 filler1; 34 u32 link_status; 35 u32 filler2; 36 u32 link_arb_upper; 37 u32 filler3; 38 u32 link_arb_lower; 39 u32 filler4; 40 u32 link_status_clr; 41 u32 filler5; 42 u32 link_reset; 43 u32 filler6; 44 u32 link_aux_status; 45 u32 filler7; 46 } xb_linkregs_t; 47 48 typedef volatile struct xbow_s { 49 /* standard widget configuration 0x000000-0x000057 */ 50 struct widget_cfg xb_widget; /* 0x000000 */ 51 52 /* helper fieldnames for accessing bridge widget */ 53 54 #define xb_wid_id xb_widget.w_id 55 #define xb_wid_stat xb_widget.w_status 56 #define xb_wid_err_upper xb_widget.w_err_upper_addr 57 #define xb_wid_err_lower xb_widget.w_err_lower_addr 58 #define xb_wid_control xb_widget.w_control 59 #define xb_wid_req_timeout xb_widget.w_req_timeout 60 #define xb_wid_int_upper xb_widget.w_intdest_upper_addr 61 #define xb_wid_int_lower xb_widget.w_intdest_lower_addr 62 #define xb_wid_err_cmdword xb_widget.w_err_cmd_word 63 #define xb_wid_llp xb_widget.w_llp_cfg 64 #define xb_wid_stat_clr xb_widget.w_tflush 65 66 /* 67 * we access these through synergy unswizzled space, so the address 68 * gets twiddled (i.e. references to 0x4 actually go to 0x0 and vv.) 69 * That's why we put the register first and filler second. 70 */ 71 /* xbow-specific widget configuration 0x000058-0x0000FF */ 72 u32 xb_wid_arb_reload; /* 0x00005C */ 73 u32 _pad_000058; 74 u32 xb_perf_ctr_a; /* 0x000064 */ 75 u32 _pad_000060; 76 u32 xb_perf_ctr_b; /* 0x00006c */ 77 u32 _pad_000068; 78 u32 xb_nic; /* 0x000074 */ 79 u32 _pad_000070; 80 81 /* Xbridge only */ 82 u32 xb_w0_rst_fnc; /* 0x00007C */ 83 u32 _pad_000078; 84 u32 xb_l8_rst_fnc; /* 0x000084 */ 85 u32 _pad_000080; 86 u32 xb_l9_rst_fnc; /* 0x00008c */ 87 u32 _pad_000088; 88 u32 xb_la_rst_fnc; /* 0x000094 */ 89 u32 _pad_000090; 90 u32 xb_lb_rst_fnc; /* 0x00009c */ 91 u32 _pad_000098; 92 u32 xb_lc_rst_fnc; /* 0x0000a4 */ 93 u32 _pad_0000a0; 94 u32 xb_ld_rst_fnc; /* 0x0000ac */ 95 u32 _pad_0000a8; 96 u32 xb_le_rst_fnc; /* 0x0000b4 */ 97 u32 _pad_0000b0; 98 u32 xb_lf_rst_fnc; /* 0x0000bc */ 99 u32 _pad_0000b8; 100 u32 xb_lock; /* 0x0000c4 */ 101 u32 _pad_0000c0; 102 u32 xb_lock_clr; /* 0x0000cc */ 103 u32 _pad_0000c8; 104 /* end of Xbridge only */ 105 u32 _pad_0000d0[12]; 106 107 /* Link Specific Registers, port 8..15 0x000100-0x000300 */ 108 xb_linkregs_t xb_link_raw[MAX_XBOW_PORTS]; 109 } xbow_t; 110 111 #define xb_link(p) xb_link_raw[(p) & (MAX_XBOW_PORTS - 1)] 112 113 #define XB_FLAGS_EXISTS 0x1 /* device exists */ 114 #define XB_FLAGS_MASTER 0x2 115 #define XB_FLAGS_SLAVE 0x0 116 #define XB_FLAGS_GBR 0x4 117 #define XB_FLAGS_16BIT 0x8 118 #define XB_FLAGS_8BIT 0x0 119 120 /* is widget port number valid? (based on version 7.0 of xbow spec) */ 121 #define XBOW_WIDGET_IS_VALID(wid) ((wid) >= XBOW_PORT_8 && (wid) <= XBOW_PORT_F) 122 123 /* whether to use upper or lower arbitration register, given source widget id */ 124 #define XBOW_ARB_IS_UPPER(wid) ((wid) >= XBOW_PORT_8 && (wid) <= XBOW_PORT_B) 125 #define XBOW_ARB_IS_LOWER(wid) ((wid) >= XBOW_PORT_C && (wid) <= XBOW_PORT_F) 126 127 /* offset of arbitration register, given source widget id */ 128 #define XBOW_ARB_OFF(wid) (XBOW_ARB_IS_UPPER(wid) ? 0x1c : 0x24) 129 130 #define XBOW_WID_ID WIDGET_ID 131 #define XBOW_WID_STAT WIDGET_STATUS 132 #define XBOW_WID_ERR_UPPER WIDGET_ERR_UPPER_ADDR 133 #define XBOW_WID_ERR_LOWER WIDGET_ERR_LOWER_ADDR 134 #define XBOW_WID_CONTROL WIDGET_CONTROL 135 #define XBOW_WID_REQ_TO WIDGET_REQ_TIMEOUT 136 #define XBOW_WID_INT_UPPER WIDGET_INTDEST_UPPER_ADDR 137 #define XBOW_WID_INT_LOWER WIDGET_INTDEST_LOWER_ADDR 138 #define XBOW_WID_ERR_CMDWORD WIDGET_ERR_CMD_WORD 139 #define XBOW_WID_LLP WIDGET_LLP_CFG 140 #define XBOW_WID_STAT_CLR WIDGET_TFLUSH 141 #define XBOW_WID_ARB_RELOAD 0x5c 142 #define XBOW_WID_PERF_CTR_A 0x64 143 #define XBOW_WID_PERF_CTR_B 0x6c 144 #define XBOW_WID_NIC 0x74 145 146 /* Xbridge only */ 147 #define XBOW_W0_RST_FNC 0x00007C 148 #define XBOW_L8_RST_FNC 0x000084 149 #define XBOW_L9_RST_FNC 0x00008c 150 #define XBOW_LA_RST_FNC 0x000094 151 #define XBOW_LB_RST_FNC 0x00009c 152 #define XBOW_LC_RST_FNC 0x0000a4 153 #define XBOW_LD_RST_FNC 0x0000ac 154 #define XBOW_LE_RST_FNC 0x0000b4 155 #define XBOW_LF_RST_FNC 0x0000bc 156 #define XBOW_RESET_FENCE(x) ((x) > 7 && (x) < 16) ? \ 157 (XBOW_W0_RST_FNC + ((x) - 7) * 8) : \ 158 ((x) == 0) ? XBOW_W0_RST_FNC : 0 159 #define XBOW_LOCK 0x0000c4 160 #define XBOW_LOCK_CLR 0x0000cc 161 /* End of Xbridge only */ 162 163 /* used only in ide, but defined here within the reserved portion */ 164 /* of the widget0 address space (before 0xf4) */ 165 #define XBOW_WID_UNDEF 0xe4 166 167 /* xbow link register set base, legal value for x is 0x8..0xf */ 168 #define XB_LINK_BASE 0x100 169 #define XB_LINK_OFFSET 0x40 170 #define XB_LINK_REG_BASE(x) (XB_LINK_BASE + ((x) & (MAX_XBOW_PORTS - 1)) * XB_LINK_OFFSET) 171 172 #define XB_LINK_IBUF_FLUSH(x) (XB_LINK_REG_BASE(x) + 0x4) 173 #define XB_LINK_CTRL(x) (XB_LINK_REG_BASE(x) + 0xc) 174 #define XB_LINK_STATUS(x) (XB_LINK_REG_BASE(x) + 0x14) 175 #define XB_LINK_ARB_UPPER(x) (XB_LINK_REG_BASE(x) + 0x1c) 176 #define XB_LINK_ARB_LOWER(x) (XB_LINK_REG_BASE(x) + 0x24) 177 #define XB_LINK_STATUS_CLR(x) (XB_LINK_REG_BASE(x) + 0x2c) 178 #define XB_LINK_RESET(x) (XB_LINK_REG_BASE(x) + 0x34) 179 #define XB_LINK_AUX_STATUS(x) (XB_LINK_REG_BASE(x) + 0x3c) 180 181 /* link_control(x) */ 182 #define XB_CTRL_LINKALIVE_IE 0x80000000 /* link comes alive */ 183 /* reserved: 0x40000000 */ 184 #define XB_CTRL_PERF_CTR_MODE_MSK 0x30000000 /* perf counter mode */ 185 #define XB_CTRL_IBUF_LEVEL_MSK 0x0e000000 /* input packet buffer 186 level */ 187 #define XB_CTRL_8BIT_MODE 0x01000000 /* force link into 8 188 bit mode */ 189 #define XB_CTRL_BAD_LLP_PKT 0x00800000 /* force bad LLP 190 packet */ 191 #define XB_CTRL_WIDGET_CR_MSK 0x007c0000 /* LLP widget credit 192 mask */ 193 #define XB_CTRL_WIDGET_CR_SHFT 18 /* LLP widget credit 194 shift */ 195 #define XB_CTRL_ILLEGAL_DST_IE 0x00020000 /* illegal destination 196 */ 197 #define XB_CTRL_OALLOC_IBUF_IE 0x00010000 /* overallocated input 198 buffer */ 199 /* reserved: 0x0000fe00 */ 200 #define XB_CTRL_BNDWDTH_ALLOC_IE 0x00000100 /* bandwidth alloc */ 201 #define XB_CTRL_RCV_CNT_OFLOW_IE 0x00000080 /* rcv retry overflow */ 202 #define XB_CTRL_XMT_CNT_OFLOW_IE 0x00000040 /* xmt retry overflow */ 203 #define XB_CTRL_XMT_MAX_RTRY_IE 0x00000020 /* max transmit retry */ 204 #define XB_CTRL_RCV_IE 0x00000010 /* receive */ 205 #define XB_CTRL_XMT_RTRY_IE 0x00000008 /* transmit retry */ 206 /* reserved: 0x00000004 */ 207 #define XB_CTRL_MAXREQ_TOUT_IE 0x00000002 /* maximum request 208 timeout */ 209 #define XB_CTRL_SRC_TOUT_IE 0x00000001 /* source timeout */ 210 211 /* link_status(x) */ 212 #define XB_STAT_LINKALIVE XB_CTRL_LINKALIVE_IE 213 /* reserved: 0x7ff80000 */ 214 #define XB_STAT_MULTI_ERR 0x00040000 /* multi error */ 215 #define XB_STAT_ILLEGAL_DST_ERR XB_CTRL_ILLEGAL_DST_IE 216 #define XB_STAT_OALLOC_IBUF_ERR XB_CTRL_OALLOC_IBUF_IE 217 #define XB_STAT_BNDWDTH_ALLOC_ID_MSK 0x0000ff00 /* port bitmask */ 218 #define XB_STAT_RCV_CNT_OFLOW_ERR XB_CTRL_RCV_CNT_OFLOW_IE 219 #define XB_STAT_XMT_CNT_OFLOW_ERR XB_CTRL_XMT_CNT_OFLOW_IE 220 #define XB_STAT_XMT_MAX_RTRY_ERR XB_CTRL_XMT_MAX_RTRY_IE 221 #define XB_STAT_RCV_ERR XB_CTRL_RCV_IE 222 #define XB_STAT_XMT_RTRY_ERR XB_CTRL_XMT_RTRY_IE 223 /* reserved: 0x00000004 */ 224 #define XB_STAT_MAXREQ_TOUT_ERR XB_CTRL_MAXREQ_TOUT_IE 225 #define XB_STAT_SRC_TOUT_ERR XB_CTRL_SRC_TOUT_IE 226 227 /* link_aux_status(x) */ 228 #define XB_AUX_STAT_RCV_CNT 0xff000000 229 #define XB_AUX_STAT_XMT_CNT 0x00ff0000 230 #define XB_AUX_STAT_TOUT_DST 0x0000ff00 231 #define XB_AUX_LINKFAIL_RST_BAD 0x00000040 232 #define XB_AUX_STAT_PRESENT 0x00000020 233 #define XB_AUX_STAT_PORT_WIDTH 0x00000010 234 /* reserved: 0x0000000f */ 235 236 /* 237 * link_arb_upper/link_arb_lower(x), (reg) should be the link_arb_upper 238 * register if (x) is 0x8..0xb, link_arb_lower if (x) is 0xc..0xf 239 */ 240 #define XB_ARB_GBR_MSK 0x1f 241 #define XB_ARB_RR_MSK 0x7 242 #define XB_ARB_GBR_SHFT(x) (((x) & 0x3) * 8) 243 #define XB_ARB_RR_SHFT(x) (((x) & 0x3) * 8 + 5) 244 #define XB_ARB_GBR_CNT(reg,x) ((reg) >> XB_ARB_GBR_SHFT(x) & XB_ARB_GBR_MSK) 245 #define XB_ARB_RR_CNT(reg,x) ((reg) >> XB_ARB_RR_SHFT(x) & XB_ARB_RR_MSK) 246 247 /* XBOW_WID_STAT */ 248 #define XB_WID_STAT_LINK_INTR_SHFT (24) 249 #define XB_WID_STAT_LINK_INTR_MASK (0xFF << XB_WID_STAT_LINK_INTR_SHFT) 250 #define XB_WID_STAT_LINK_INTR(x) \ 251 (0x1 << (((x)&7) + XB_WID_STAT_LINK_INTR_SHFT)) 252 #define XB_WID_STAT_WIDGET0_INTR 0x00800000 253 #define XB_WID_STAT_SRCID_MASK 0x000003c0 /* Xbridge only */ 254 #define XB_WID_STAT_REG_ACC_ERR 0x00000020 255 #define XB_WID_STAT_RECV_TOUT 0x00000010 /* Xbridge only */ 256 #define XB_WID_STAT_ARB_TOUT 0x00000008 /* Xbridge only */ 257 #define XB_WID_STAT_XTALK_ERR 0x00000004 258 #define XB_WID_STAT_DST_TOUT 0x00000002 /* Xbridge only */ 259 #define XB_WID_STAT_MULTI_ERR 0x00000001 260 261 #define XB_WID_STAT_SRCID_SHFT 6 262 263 /* XBOW_WID_CONTROL */ 264 #define XB_WID_CTRL_REG_ACC_IE XB_WID_STAT_REG_ACC_ERR 265 #define XB_WID_CTRL_RECV_TOUT XB_WID_STAT_RECV_TOUT 266 #define XB_WID_CTRL_ARB_TOUT XB_WID_STAT_ARB_TOUT 267 #define XB_WID_CTRL_XTALK_IE XB_WID_STAT_XTALK_ERR 268 269 /* XBOW_WID_INT_UPPER */ 270 /* defined in xwidget.h for WIDGET_INTDEST_UPPER_ADDR */ 271 272 /* XBOW WIDGET part number, in the ID register */ 273 #define XBOW_WIDGET_PART_NUM 0x0 /* crossbow */ 274 #define XXBOW_WIDGET_PART_NUM 0xd000 /* Xbridge */ 275 #define XBOW_WIDGET_MFGR_NUM 0x0 276 #define XXBOW_WIDGET_MFGR_NUM 0x0 277 #define PXBOW_WIDGET_PART_NUM 0xd100 /* PIC */ 278 279 #define XBOW_REV_1_0 0x1 /* xbow rev 1.0 is "1" */ 280 #define XBOW_REV_1_1 0x2 /* xbow rev 1.1 is "2" */ 281 #define XBOW_REV_1_2 0x3 /* xbow rev 1.2 is "3" */ 282 #define XBOW_REV_1_3 0x4 /* xbow rev 1.3 is "4" */ 283 #define XBOW_REV_2_0 0x5 /* xbow rev 2.0 is "5" */ 284 285 #define XXBOW_PART_REV_1_0 (XXBOW_WIDGET_PART_NUM << 4 | 0x1 ) 286 #define XXBOW_PART_REV_2_0 (XXBOW_WIDGET_PART_NUM << 4 | 0x2 ) 287 288 /* XBOW_WID_ARB_RELOAD */ 289 #define XBOW_WID_ARB_RELOAD_INT 0x3f /* GBR reload interval */ 290 291 #define IS_XBRIDGE_XBOW(wid) \ 292 (XWIDGET_PART_NUM(wid) == XXBOW_WIDGET_PART_NUM && \ 293 XWIDGET_MFG_NUM(wid) == XXBOW_WIDGET_MFGR_NUM) 294 295 #define IS_PIC_XBOW(wid) \ 296 (XWIDGET_PART_NUM(wid) == PXBOW_WIDGET_PART_NUM && \ 297 XWIDGET_MFG_NUM(wid) == XXBOW_WIDGET_MFGR_NUM) 298 299 #define XBOW_WAR_ENABLED(pv, widid) ((1 << XWIDGET_REV_NUM(widid)) & pv) 300 301 #endif /* _ASM_IA64_SN_XTALK_XBOW_H */ 302