4a91e3ed3313f1a3cc4040e97e30bd4636e96fb9
[people/pcmattman/gpxe.git] / src / drivers / infiniband / linda.h
1 #ifndef _LINDA_H
2 #define _LINDA_H
3
4 /**
5  * @file
6  *
7  * QLogic Linda Infiniband HCA
8  *
9  */
10
11 #define BITOPS_LITTLE_ENDIAN
12 #include <gpxe/bitops.h>
13 #include "qib_7220_regs.h"
14
15 struct ib_device;
16
17 /** A Linda GPIO register */
18 struct QIB_7220_GPIO_pb {
19         pseudo_bit_t GPIO[16];
20         pseudo_bit_t Reserved[48];
21 };
22 struct QIB_7220_GPIO {
23         PSEUDO_BIT_STRUCT ( struct QIB_7220_GPIO_pb );
24 };
25
26 /** A Linda general scalar register */
27 struct QIB_7220_scalar_pb {
28         pseudo_bit_t Value[64];
29 };
30 struct QIB_7220_scalar {
31         PSEUDO_BIT_STRUCT ( struct QIB_7220_scalar_pb );
32 };
33
34 /** Linda send per-buffer control word */
35 struct QIB_7220_SendPbc_pb {
36         pseudo_bit_t LengthP1_toibc[11];
37         pseudo_bit_t Reserved1[4];
38         pseudo_bit_t LengthP1_trigger[11];
39         pseudo_bit_t Reserved2[3];
40         pseudo_bit_t TestEbp[1];
41         pseudo_bit_t Test[1];
42         pseudo_bit_t Intr[1];
43         pseudo_bit_t Reserved3[31];
44         pseudo_bit_t VL15[1];
45 };
46 struct QIB_7220_SendPbc {
47         PSEUDO_BIT_STRUCT ( struct QIB_7220_SendPbc_pb );
48 };
49
50 /** Linda send buffer availability */
51 struct QIB_7220_SendBufAvail_pb {
52         pseudo_bit_t InUseCheck[144][2];
53         pseudo_bit_t Reserved[32];
54 };
55 struct QIB_7220_SendBufAvail {
56         PSEUDO_BIT_STRUCT ( struct QIB_7220_SendBufAvail_pb );
57 };
58
59 /** DMA alignment for send buffer availability */
60 #define LINDA_SENDBUFAVAIL_ALIGN 64
61
62 /** A Linda eager receive descriptor */
63 struct QIB_7220_RcvEgr_pb {
64         pseudo_bit_t Addr[37];
65         pseudo_bit_t BufSize[3];
66         pseudo_bit_t Reserved[24];
67 };
68 struct QIB_7220_RcvEgr {
69         PSEUDO_BIT_STRUCT ( struct QIB_7220_RcvEgr_pb );
70 };
71
72 /** Linda receive header flags */
73 struct QIB_7220_RcvHdrFlags_pb {
74         pseudo_bit_t PktLen[11];
75         pseudo_bit_t RcvType[3];
76         pseudo_bit_t SoftB[1];
77         pseudo_bit_t SoftA[1];
78         pseudo_bit_t EgrIndex[12];
79         pseudo_bit_t Reserved1[3];
80         pseudo_bit_t UseEgrBfr[1];
81         pseudo_bit_t RcvSeq[4];
82         pseudo_bit_t HdrqOffset[11];
83         pseudo_bit_t Reserved2[8];
84         pseudo_bit_t IBErr[1];
85         pseudo_bit_t MKErr[1];
86         pseudo_bit_t TIDErr[1];
87         pseudo_bit_t KHdrErr[1];
88         pseudo_bit_t MTUErr[1];
89         pseudo_bit_t LenErr[1];
90         pseudo_bit_t ParityErr[1];
91         pseudo_bit_t VCRCErr[1];
92         pseudo_bit_t ICRCErr[1];
93 };
94 struct QIB_7220_RcvHdrFlags {
95         PSEUDO_BIT_STRUCT ( struct QIB_7220_RcvHdrFlags_pb );
96 };
97
98 /** Linda memory BAR size */
99 #define LINDA_BAR0_SIZE 0x400000
100
101 /** Linda I2C SCL line GPIO number */
102 #define LINDA_GPIO_SCL 0
103
104 /** Linda I2C SDA line GPIO number */
105 #define LINDA_GPIO_SDA 1
106
107 /** GUID offset within EEPROM */
108 #define LINDA_EEPROM_GUID_OFFSET 3
109
110 /** GUID size within EEPROM */
111 #define LINDA_EEPROM_GUID_SIZE 8
112
113 /** Board serial number offset within EEPROM */
114 #define LINDA_EEPROM_SERIAL_OFFSET 12
115
116 /** Board serial number size within EEPROM */
117 #define LINDA_EEPROM_SERIAL_SIZE 12
118
119 /** Maximum number of send buffers used
120  *
121  * This is a policy decision.  Must be less than or equal to the total
122  * number of send buffers supported by the hardware (128).
123  */
124 #define LINDA_MAX_SEND_BUFS 32
125
126 /** Linda send buffer size */
127 #define LINDA_SEND_BUF_SIZE 4096
128
129 /** Number of contexts (including kernel context)
130  *
131  * This is a policy decision.  Must be 5, 9 or 17.
132  */
133 #define LINDA_NUM_CONTEXTS 5
134
135 /** PortCfg values for different numbers of contexts */
136 enum linda_portcfg {
137         LINDA_PORTCFG_5CTX = 0,
138         LINDA_PORTCFG_9CTX = 1,
139         LINDA_PORTCFG_17CTX = 2,
140 };
141
142 /** PortCfg values for different numbers of contexts */
143 #define LINDA_EAGER_ARRAY_SIZE_5CTX_0 2048
144 #define LINDA_EAGER_ARRAY_SIZE_5CTX_OTHER 4096
145 #define LINDA_EAGER_ARRAY_SIZE_9CTX_0 2048
146 #define LINDA_EAGER_ARRAY_SIZE_9CTX_OTHER 2048
147 #define LINDA_EAGER_ARRAY_SIZE_17CTX_0 2048
148 #define LINDA_EAGER_ARRAY_SIZE_17CTX_OTHER 1024
149
150 /** Eager buffer required alignment */
151 #define LINDA_EAGER_BUFFER_ALIGN 2048
152
153 /** Eager buffer size encodings */
154 enum linda_eager_buffer_size {
155         LINDA_EAGER_BUFFER_NONE = 0,
156         LINDA_EAGER_BUFFER_2K = 1,
157         LINDA_EAGER_BUFFER_4K = 2,
158         LINDA_EAGER_BUFFER_8K = 3,
159         LINDA_EAGER_BUFFER_16K = 4,
160         LINDA_EAGER_BUFFER_32K = 5,
161         LINDA_EAGER_BUFFER_64K = 6,
162 };
163
164 /** Number of RX headers per context
165  *
166  * This is a policy decision.
167  */
168 #define LINDA_RECV_HEADER_COUNT 8
169
170 /** Maximum size of each RX header
171  *
172  * This is a policy decision.  Must be divisible by 4.
173  */
174 #define LINDA_RECV_HEADER_SIZE 96
175
176 /** Total size of an RX header ring */
177 #define LINDA_RECV_HEADERS_SIZE \
178         ( LINDA_RECV_HEADER_SIZE * LINDA_RECV_HEADER_COUNT )
179
180 /** RX header alignment */
181 #define LINDA_RECV_HEADERS_ALIGN 64
182
183 /** RX payload size
184  *
185  * This is a policy decision.  Must be a valid eager buffer size.
186  */
187 #define LINDA_RECV_PAYLOAD_SIZE 2048
188
189 /** QPN used for Infinipath Packets
190  *
191  * This is a policy decision.  Must have bit 0 clear.  Must not be a
192  * QPN that we will use.
193  */
194 #define LINDA_QP_IDETH 0xdead0
195
196 /** Maximum time for wait for external parallel bus request, in us */
197 #define LINDA_EPB_REQUEST_MAX_WAIT_US 500
198
199 /** Maximum time for wait for external parallel bus transaction, in us */
200 #define LINDA_EPB_XACT_MAX_WAIT_US 500
201
202 /** Linda external parallel bus chip selects */
203 #define LINDA_EPB_CS_SERDES 1
204 #define LINDA_EPB_CS_UC 2
205
206 /** Linda external parallel bus read/write operations */
207 #define LINDA_EPB_WRITE 0
208 #define LINDA_EPB_READ 1
209
210 /** Linda external parallel bus register addresses */
211 #define LINDA_EPB_ADDRESS( _channel, _element, _reg ) \
212         ( (_element) | ( (_channel) << 4 ) | ( (_reg) << 9 ) )
213 #define LINDA_EPB_ADDRESS_CHANNEL( _address )   ( ( (_address) >> 4 ) & 0x1f )
214 #define LINDA_EPB_ADDRESS_ELEMENT( _address )   ( ( (_address) >> 0 ) & 0x0f )
215 #define LINDA_EPB_ADDRESS_REG( _address )       ( ( (_address) >> 9 ) & 0x3f )
216
217 /** Linda external parallel bus locations
218  *
219  * The location is used by the driver to encode both the chip select
220  * and the EPB address.
221  */
222 #define LINDA_EPB_LOC( _cs, _channel, _element, _reg) \
223         ( ( (_cs) << 16 ) | LINDA_EPB_ADDRESS ( _channel, _element, _reg ) )
224 #define LINDA_EPB_LOC_ADDRESS( _loc )   ( (_loc) & 0xffff )
225 #define LINDA_EPB_LOC_CS( _loc )        ( (_loc) >> 16 )
226
227 /** Linda external parallel bus microcontroller register addresses */
228 #define LINDA_EPB_UC_CHANNEL 6
229 #define LINDA_EPB_UC_LOC( _reg ) \
230         LINDA_EPB_LOC ( LINDA_EPB_CS_UC, LINDA_EPB_UC_CHANNEL, 0, (_reg) )
231 #define LINDA_EPB_UC_CTL        LINDA_EPB_UC_LOC ( 0 )
232 #define LINDA_EPB_UC_CTL_WRITE  1
233 #define LINDA_EPB_UC_CTL_READ   2
234 #define LINDA_EPB_UC_ADDR_LO    LINDA_EPB_UC_LOC ( 2 )
235 #define LINDA_EPB_UC_ADDR_HI    LINDA_EPB_UC_LOC ( 3 )
236 #define LINDA_EPB_UC_DATA       LINDA_EPB_UC_LOC ( 4 )
237 #define LINDA_EPB_UC_CHUNK_SIZE 64
238
239 extern uint8_t linda_ib_fw[8192];
240
241 /** Maximum time to wait for "trim done" signal, in ms */
242 #define LINDA_TRIM_DONE_MAX_WAIT_MS 1000
243
244 /** Linda link states */
245 enum linda_link_state {
246         LINDA_LINK_STATE_DOWN = 0,
247         LINDA_LINK_STATE_INIT = 1,
248         LINDA_LINK_STATE_ARM = 2,
249         LINDA_LINK_STATE_ACTIVE = 3,
250         LINDA_LINK_STATE_ACT_DEFER = 4,
251 };
252
253 #endif /* _LINDA_H */