hc
2023-11-22 f743a7adbd6e230d66a6206fa115b59fec2d88eb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
/*
 * 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-2006 Silicon Graphics, Inc. All Rights
 * Reserved.
 */
#ifndef _ASM_IA64_SN_XTALK_XBOW_H
#define _ASM_IA64_SN_XTALK_XBOW_H
 
#define XBOW_PORT_8    0x8
#define XBOW_PORT_C    0xc
#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    XBOW_CREDIT    4
 
#define MAX_XBOW_NAME     16
 
/* Register set for each xbow link */
typedef volatile struct xb_linkregs_s {
/*
 * 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.
 */
   u32 link_ibf;
   u32 filler0;    /* filler for proper alignment */
   u32 link_control;
   u32 filler1;
   u32 link_status;
   u32 filler2;
   u32 link_arb_upper;
   u32 filler3;
   u32 link_arb_lower;
   u32 filler4;
   u32 link_status_clr;
   u32 filler5;
   u32 link_reset;
   u32 filler6;
   u32 link_aux_status;
   u32 filler7;
} xb_linkregs_t;
 
typedef volatile struct xbow_s {
   /* standard widget configuration 0x000000-0x000057 */
   struct widget_cfg 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
 
/*
 * 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 */
   u32 xb_wid_arb_reload; /* 0x00005C */
   u32 _pad_000058;
   u32 xb_perf_ctr_a;    /* 0x000064 */
   u32 _pad_000060;
   u32 xb_perf_ctr_b;    /* 0x00006c */
   u32 _pad_000068;
   u32 xb_nic;        /* 0x000074 */
   u32 _pad_000070;
 
   /* Xbridge only */
   u32 xb_w0_rst_fnc;    /* 0x00007C */
   u32 _pad_000078;
   u32 xb_l8_rst_fnc;    /* 0x000084 */
   u32 _pad_000080;
   u32 xb_l9_rst_fnc;    /* 0x00008c */
   u32 _pad_000088;
   u32 xb_la_rst_fnc;    /* 0x000094 */
   u32 _pad_000090;
   u32 xb_lb_rst_fnc;    /* 0x00009c */
   u32 _pad_000098;
   u32 xb_lc_rst_fnc;    /* 0x0000a4 */
   u32 _pad_0000a0;
   u32 xb_ld_rst_fnc;    /* 0x0000ac */
   u32 _pad_0000a8;
   u32 xb_le_rst_fnc;    /* 0x0000b4 */
   u32 _pad_0000b0;
   u32 xb_lf_rst_fnc;    /* 0x0000bc */
   u32 _pad_0000b8;
   u32 xb_lock;        /* 0x0000c4 */
   u32 _pad_0000c0;
   u32 xb_lock_clr;    /* 0x0000cc */
   u32 _pad_0000c8;
   /* end of Xbridge only */
   u32 _pad_0000d0[12];
 
   /* Link Specific Registers, port 8..15   0x000100-0x000300 */
   xb_linkregs_t xb_link_raw[MAX_XBOW_PORTS];
} xbow_t;
 
#define xb_link(p) xb_link_raw[(p) & (MAX_XBOW_PORTS - 1)]
 
#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
 
/* 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)
 
#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
 
/* 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 PXBOW_WIDGET_PART_NUM   0xd100        /* PIC */
 
#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 IS_XBRIDGE_XBOW(wid) \
   (XWIDGET_PART_NUM(wid) == XXBOW_WIDGET_PART_NUM && \
   XWIDGET_MFG_NUM(wid) == XXBOW_WIDGET_MFGR_NUM)
 
#define IS_PIC_XBOW(wid) \
   (XWIDGET_PART_NUM(wid) == PXBOW_WIDGET_PART_NUM && \
   XWIDGET_MFG_NUM(wid) == XXBOW_WIDGET_MFGR_NUM)
 
#define XBOW_WAR_ENABLED(pv, widid) ((1 << XWIDGET_REV_NUM(widid)) & pv)
 
#endif /* _ASM_IA64_SN_XTALK_XBOW_H */