xbow.h 11 KB

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