[phantom] Add support for NetXen Phantom NICs
[people/dverkamp/gpxe.git] / src / drivers / net / phantom / nxhal_nic_interface.h
1 /*
2  * Data types and structure for HAL - NIC interface.
3  *
4  */
5
6 #ifndef _NXHAL_NIC_INTERFACE_H_
7 #define _NXHAL_NIC_INTERFACE_H_
8
9 /*****************************************************************************
10  *        Simple Types
11  *****************************************************************************/
12
13 typedef U32     nx_reg_addr_t;
14
15 /*****************************************************************************
16  *        Root crb-based firmware commands
17  *****************************************************************************/
18
19 /* CRB Root Command
20
21    A single set of crbs is used across all physical/virtual
22    functions for capability queries, initialization, and
23    context creation/destruction. 
24
25    There are 4 CRBS:
26        Command/Response CRB
27        Argument1 CRB
28        Argument2 CRB
29        Argument3 CRB
30        Signature CRB 
31
32        The cmd/rsp crb is always intiated by the host via
33        a command code and always responded by the card with
34        a response code. The cmd and rsp codes are disjoint.
35        The sequence of use is always CMD, RSP, CLEAR CMD.
36
37        The arguments are for passing in command specific
38        and response specific parameters/data. 
39
40        The signature is composed of a magic value, the
41        pci function id, and a command sequence id:
42           [7:0]  = pci function
43          [15:8]  = version
44          [31:16] = magic of 0xcafe
45
46        The pci function allows the card to take correct
47        action for the given particular commands. 
48        The firmware will attempt to detect
49        an errant driver that has died while holding  
50        the root crb hardware lock. Such an error condition
51        shows up as the cmd/rsp crb stuck in a non-clear state.
52
53    Interface Sequence:
54      Host always makes requests and firmware always responds.
55      Note that data field is always set prior to command field.
56
57      [READ]             CMD/RSP CRB      ARGUMENT FIELD
58      Host grab lock
59      Host  ->           CMD              optional parameter
60      FW   <-  (Good)    RSP-OK           DATA
61      FW   <-  (Fail)    RSP-FAIL         optional failure code
62      Host ->            CLEAR
63      Host release lock
64
65      [WRITE]            CMD/RSP CRB      ARGUMENT FIELD
66      Host grab lock
67      Host  ->           CMD              DATA
68      FW   <-  (Good)    RSP-OK           optional write status
69      FW   <-  (Write)   RSP-FAIL         optional failure code
70      Host ->            CLEAR
71      Host release lock
72
73 */
74
75
76 /*****************************************************************************
77  *        CMD/RSP
78  *****************************************************************************/
79
80 #define NX_CDRP_SIGNATURE_TO_PCIFN(sign)    ((sign) & 0xff)
81 #define NX_CDRP_SIGNATURE_TO_VERSION(sign)  (((sign)>>8) & 0xff)
82 #define NX_CDRP_SIGNATURE_TO_MAGIC(sign)    (((sign)>>16) & 0xffff)
83 #define NX_CDRP_SIGNATURE_VALID(sign)       \
84         ( NX_CDRP_SIGNATURE_TO_MAGIC(sign) == 0xcafe && \
85           NX_CDRP_SIGNATURE_TO_PCIFN(sign) < 8)
86 #define NX_CDRP_SIGNATURE_MAKE(pcifn,version) \
87         ( ((pcifn) & 0xff) |                  \
88           (((version) & 0xff) << 8) |         \
89           (0xcafe << 16) )
90
91 #define NX_CDRP_CLEAR                       0x00000000
92 #define NX_CDRP_CMD_BIT                     0x80000000
93
94 /* All responses must have the NX_CDRP_CMD_BIT cleared
95  * in the crb NX_CDRP_CRB_OFFSET. */
96 #define NX_CDRP_FORM_RSP(rsp)              (rsp)
97 #define NX_CDRP_IS_RSP(rsp)                (((rsp) & NX_CDRP_CMD_BIT) == 0)
98
99 #define NX_CDRP_RSP_OK                      0x00000001
100 #define NX_CDRP_RSP_FAIL                    0x00000002
101 #define NX_CDRP_RSP_TIMEOUT                 0x00000003
102
103 /* All commands must have the NX_CDRP_CMD_BIT set in
104  * the crb NX_CDRP_CRB_OFFSET.
105  * The macros below do not have it explicitly set to
106  * allow their use in lookup tables */
107 #define NX_CDRP_FORM_CMD(cmd)               (NX_CDRP_CMD_BIT | (cmd))
108 #define NX_CDRP_IS_CMD(cmd)                 (((cmd) & NX_CDRP_CMD_BIT) != 0)
109
110 /* [CMD] Capability Vector [RSP] Capability Vector */
111 #define NX_CDRP_CMD_SUBMIT_CAPABILITIES     0x00000001
112
113 /* [CMD] - [RSP] Query Value */
114 #define NX_CDRP_CMD_READ_MAX_RDS_PER_CTX    0x00000002
115
116 /* [CMD] - [RSP] Query Value */
117 #define NX_CDRP_CMD_READ_MAX_SDS_PER_CTX    0x00000003
118
119 /* [CMD] - [RSP] Query Value */
120 #define NX_CDRP_CMD_READ_MAX_RULES_PER_CTX  0x00000004
121
122 /* [CMD] - [RSP] Query Value */
123 #define NX_CDRP_CMD_READ_MAX_RX_CTX         0x00000005
124
125 /* [CMD] - [RSP] Query Value */
126 #define NX_CDRP_CMD_READ_MAX_TX_CTX         0x00000006
127
128 /* [CMD] Rx Config DMA Addr [RSP] rcode */
129 #define NX_CDRP_CMD_CREATE_RX_CTX           0x00000007
130
131 /* [CMD] Rx Context Handle, Reset Kind [RSP] rcode */
132 #define NX_CDRP_CMD_DESTROY_RX_CTX          0x00000008
133
134 /* [CMD] Tx Config DMA Addr [RSP] rcode */
135 #define NX_CDRP_CMD_CREATE_TX_CTX           0x00000009
136
137 /* [CMD] Tx Context Handle, Reset Kind [RSP] rcode */
138 #define NX_CDRP_CMD_DESTROY_TX_CTX          0x0000000a
139
140 /* [CMD] Stat setup dma addr - [RSP] Handle, rcode */
141 #define NX_CDRP_CMD_SETUP_STATISTICS        0x0000000e
142
143 /* [CMD] Handle - [RSP] rcode */
144 #define NX_CDRP_CMD_GET_STATISTICS          0x0000000f
145
146 /* [CMD] Handle - [RSP] rcode */
147 #define NX_CDRP_CMD_DELETE_STATISTICS       0x00000010
148
149 #define NX_CDRP_CMD_MAX                     0x00000011
150
151 /*****************************************************************************
152  *        Capabilities
153  *****************************************************************************/
154
155 #define NX_CAP_BIT(class, bit)              (1 << bit)
156
157 /* Class 0 (i.e. ARGS 1)
158  */
159 #define NX_CAP0_LEGACY_CONTEXT              NX_CAP_BIT(0, 0)
160 #define NX_CAP0_MULTI_CONTEXT               NX_CAP_BIT(0, 1)
161 #define NX_CAP0_LEGACY_MN                   NX_CAP_BIT(0, 2)
162 #define NX_CAP0_LEGACY_MS                   NX_CAP_BIT(0, 3)
163 #define NX_CAP0_CUT_THROUGH                 NX_CAP_BIT(0, 4)
164 #define NX_CAP0_LRO                         NX_CAP_BIT(0, 5)
165 #define NX_CAP0_LSO                         NX_CAP_BIT(0, 6)
166
167 /* Class 1 (i.e. ARGS 2)
168  */
169 #define NX_CAP1_NIC                         NX_CAP_BIT(1, 0)
170 #define NX_CAP1_PXE                         NX_CAP_BIT(1, 1)
171 #define NX_CAP1_CHIMNEY                     NX_CAP_BIT(1, 2)
172 #define NX_CAP1_LSA                         NX_CAP_BIT(1, 3)
173 #define NX_CAP1_RDMA                        NX_CAP_BIT(1, 4)
174 #define NX_CAP1_ISCSI                       NX_CAP_BIT(1, 5)
175 #define NX_CAP1_FCOE                        NX_CAP_BIT(1, 6)
176
177 /* Class 2 (i.e. ARGS 3)
178  */
179
180 /*****************************************************************************
181  *        Rules
182  *****************************************************************************/
183
184 typedef U32 nx_rx_rule_type_t;
185
186 #define NX_RX_RULETYPE_DEFAULT              0
187 #define NX_RX_RULETYPE_MAC                  1
188 #define NX_RX_RULETYPE_MAC_VLAN             2
189 #define NX_RX_RULETYPE_MAC_RSS              3
190 #define NX_RX_RULETYPE_MAC_VLAN_RSS         4
191 #define NX_RX_RULETYPE_MAX                  5
192
193 typedef U32 nx_rx_rule_cmd_t;
194
195 #define NX_RX_RULECMD_ADD                   0
196 #define NX_RX_RULECMD_REMOVE                1
197 #define NX_RX_RULECMD_MAX                   2
198
199 typedef struct nx_rx_rule_arg_s {
200         union {
201                 struct {
202                         char mac[6];
203                 } m;
204                 struct {
205                         char mac[6];
206                         char vlan;
207                 } mv;
208                 struct {
209                         char mac[6];
210                 } mr;
211                 struct {
212                         char mac[6];
213                         char vlan;
214                 } mvr;
215         };
216         /* will be union of all the different args for rules */
217         U64 data;
218 } nx_rx_rule_arg_t;
219
220 typedef struct nx_rx_rule_s {
221         U32 id;
222         U32 active;
223         nx_rx_rule_arg_t arg;
224         nx_rx_rule_type_t type;
225 } nx_rx_rule_t;
226
227 /* MSG - REQUIRES TX CONTEXT */
228
229 /* The rules can be added/deleted from both the
230  *  host and card sides so rq/rsp are similar. 
231  */
232 typedef struct nx_hostmsg_rx_rule_s {
233         nx_rx_rule_cmd_t cmd;
234         nx_rx_rule_t rule;
235 } nx_hostmsg_rx_rule_t;
236
237 typedef struct nx_cardmsg_rx_rule_s {
238         nx_rcode_t rcode;
239         nx_rx_rule_cmd_t cmd;
240         nx_rx_rule_t rule;
241 } nx_cardmsg_rx_rule_t;
242
243
244 /*****************************************************************************
245  *        Common to Rx/Tx contexts
246  *****************************************************************************/
247
248 /*
249  * Context states
250  */
251
252 typedef U32 nx_host_ctx_state_t;
253
254 #define NX_HOST_CTX_STATE_FREED             0   /* Invalid state */
255 #define NX_HOST_CTX_STATE_ALLOCATED         1   /* Not committed */
256 /* The following states imply FW is aware of context */
257 #define NX_HOST_CTX_STATE_ACTIVE            2
258 #define NX_HOST_CTX_STATE_DISABLED          3
259 #define NX_HOST_CTX_STATE_QUIESCED          4
260 #define NX_HOST_CTX_STATE_MAX               5
261
262 /*
263  * Interrupt mask crb use must be set identically on the Tx 
264  * and Rx context configs across a pci function 
265  */
266
267 /* Rx and Tx have unique interrupt/crb */
268 #define NX_HOST_INT_CRB_MODE_UNIQUE         0
269 /* Rx and Tx share a common interrupt/crb */
270 #define NX_HOST_INT_CRB_MODE_SHARED         1   /* <= LEGACY */
271 /* Rx does not use a crb */
272 #define NX_HOST_INT_CRB_MODE_NORX           2
273 /* Tx does not use a crb */
274 #define NX_HOST_INT_CRB_MODE_NOTX           3
275 /* Neither Rx nor Tx use a crb */
276 #define NX_HOST_INT_CRB_MODE_NORXTX         4
277
278 /*
279  * Destroy Rx/Tx
280  */
281
282 #define NX_DESTROY_CTX_RESET                0
283 #define NX_DESTROY_CTX_D3_RESET             1
284 #define NX_DESTROY_CTX_MAX                  2
285
286
287 /*****************************************************************************
288  *        Tx
289  *****************************************************************************/
290
291 /*
292  * Components of the host-request for Tx context creation.
293  * CRB - DOES NOT REQUIRE Rx/TX CONTEXT 
294  */
295
296 typedef struct nx_hostrq_cds_ring_s {
297         U64 host_phys_addr;     /* Ring base addr */
298         U32 ring_size;          /* Ring entries */
299         U32 rsvd;               /* Padding */
300 } nx_hostrq_cds_ring_t;
301
302 typedef struct nx_hostrq_tx_ctx_s {
303         U64 host_rsp_dma_addr;  /* Response dma'd here */
304         U64 cmd_cons_dma_addr;  /*  */
305         U64 dummy_dma_addr;     /*  */
306         U32 capabilities[4];    /* Flag bit vector */
307         U32 host_int_crb_mode;  /* Interrupt crb usage */
308         U32 rsvd1;              /* Padding */
309         U16 rsvd2;              /* Padding */
310         U16 interrupt_ctl;
311         U16 msi_index;
312         U16 rsvd3;              /* Padding */
313         nx_hostrq_cds_ring_t cds_ring;  /* Desc of cds ring */
314         U8  reserved[128];      /* future expansion */
315 } nx_hostrq_tx_ctx_t;
316
317 typedef struct nx_cardrsp_cds_ring_s {
318         U32 host_producer_crb;  /* Crb to use */
319         U32 interrupt_crb;      /* Crb to use */
320 } nx_cardrsp_cds_ring_t;
321
322 typedef struct nx_cardrsp_tx_ctx_s {
323         U32 host_ctx_state;     /* Starting state */
324         U16 context_id;         /* Handle for context */
325         U8  phys_port;          /* Physical id of port */
326         U8  virt_port;          /* Virtual/Logical id of port */
327         nx_cardrsp_cds_ring_t cds_ring; /* Card cds settings */
328         U8  reserved[128];      /* future expansion */
329 } nx_cardrsp_tx_ctx_t;
330
331 #define SIZEOF_HOSTRQ_TX(HOSTRQ_TX)                     \
332                 ( sizeof(HOSTRQ_TX))
333
334 #define SIZEOF_CARDRSP_TX(CARDRSP_TX)                   \
335                 ( sizeof(CARDRSP_TX)) 
336
337 /*****************************************************************************
338  *        Rx
339  *****************************************************************************/
340
341 /*
342  * RDS ring mapping to producer crbs
343  */
344
345 /* Each ring has a unique crb */
346 #define NX_HOST_RDS_CRB_MODE_UNIQUE    0        /* <= LEGACY */
347
348 /* All configured RDS Rings share common crb:
349      1 Ring  - same as unique
350      2 Rings - 16, 16
351      3 Rings - 10, 10, 10 */
352 #define NX_HOST_RDS_CRB_MODE_SHARED    1
353
354 /* Bit usage is specified per-ring using the
355    ring's size. Sum of bit lengths must be <= 32. 
356    Packing is [Ring N] ... [Ring 1][Ring 0] */
357 #define NX_HOST_RDS_CRB_MODE_CUSTOM    2
358 #define NX_HOST_RDS_CRB_MODE_MAX       3
359
360
361 /*
362  * RDS Ting Types 
363  */
364
365 #define NX_RDS_RING_TYPE_NORMAL       0
366 #define NX_RDS_RING_TYPE_JUMBO        1
367 #define NX_RDS_RING_TYPE_LRO          2
368 #define NX_RDS_RING_TYPE_MAX          3
369
370 /*
371  * Components of the host-request for Rx context creation.
372  * CRB - DOES NOT REQUIRE Rx/TX CONTEXT 
373  */
374
375 typedef struct nx_hostrq_sds_ring_s {
376         U64 host_phys_addr;     /* Ring base addr */
377         U32 ring_size;          /* Ring entries */
378         U16 msi_index;
379         U16 rsvd;               /* Padding */
380 } nx_hostrq_sds_ring_t;
381
382 typedef struct nx_hostrq_rds_ring_s {
383         U64 host_phys_addr;     /* Ring base addr */
384         U64 buff_size;          /* Packet buffer size */
385         U32 ring_size;          /* Ring entries */
386         U32 ring_kind;          /* Class of ring */
387 } nx_hostrq_rds_ring_t;
388
389 typedef struct nx_hostrq_rx_ctx_s {
390         U64 host_rsp_dma_addr;  /* Response dma'd here */
391         U32 capabilities[4];    /* Flag bit vector */
392         U32 host_int_crb_mode;  /* Interrupt crb usage */
393         U32 host_rds_crb_mode;  /* RDS crb usage */
394         /* These ring offsets are relative to data[0] below */
395         U32 rds_ring_offset;    /* Offset to RDS config */
396         U32 sds_ring_offset;    /* Offset to SDS config */
397         U16 num_rds_rings;      /* Count of RDS rings */
398         U16 num_sds_rings;      /* Count of SDS rings */
399         U16 rsvd1;              /* Padding */
400         U16 rsvd2;              /* Padding */
401         U8  reserved[128];      /* reserve space for future expansion*/
402         /* MUST BE 64-bit aligned.
403            The following is packed:
404            - N hostrq_rds_rings
405            - N hostrq_sds_rings */
406         char data[0];
407 } nx_hostrq_rx_ctx_t;
408
409 typedef struct nx_cardrsp_rds_ring_s {
410         U32 host_producer_crb;  /* Crb to use */
411         U32 rsvd1;              /* Padding */
412 } nx_cardrsp_rds_ring_t;
413
414 typedef struct nx_cardrsp_sds_ring_s {
415         U32 host_consumer_crb;  /* Crb to use */
416         U32 interrupt_crb;      /* Crb to use */
417 } nx_cardrsp_sds_ring_t;
418
419 typedef struct nx_cardrsp_rx_ctx_s {
420         /* These ring offsets are relative to data[0] below */
421         U32 rds_ring_offset;    /* Offset to RDS config */
422         U32 sds_ring_offset;    /* Offset to SDS config */
423         U32 host_ctx_state;     /* Starting State */
424         U32 num_fn_per_port;    /* How many PCI fn share the port */
425         U16 num_rds_rings;      /* Count of RDS rings */
426         U16 num_sds_rings;      /* Count of SDS rings */
427         U16 context_id;         /* Handle for context */
428         U8  phys_port;          /* Physical id of port */
429         U8  virt_port;          /* Virtual/Logical id of port */
430         U8  reserved[128];      /* save space for future expansion */
431         /*  MUST BE 64-bit aligned.
432            The following is packed:
433            - N cardrsp_rds_rings
434            - N cardrs_sds_rings */
435         char data[0];
436 } nx_cardrsp_rx_ctx_t;
437
438 #define SIZEOF_HOSTRQ_RX(HOSTRQ_RX, rds_rings, sds_rings)       \
439         ( sizeof(HOSTRQ_RX) +                                   \
440         (rds_rings)*(sizeof (nx_hostrq_rds_ring_t)) +           \
441         (sds_rings)*(sizeof (nx_hostrq_sds_ring_t)) )
442
443 #define SIZEOF_CARDRSP_RX(CARDRSP_RX, rds_rings, sds_rings)     \
444         ( sizeof(CARDRSP_RX) +                                  \
445         (rds_rings)*(sizeof (nx_cardrsp_rds_ring_t)) +          \
446         (sds_rings)*(sizeof (nx_cardrsp_sds_ring_t)) )
447
448
449 /*****************************************************************************
450  *        Statistics
451  *****************************************************************************/
452
453 /*
454  * The model of statistics update to use 
455  */
456
457 #define NX_STATISTICS_MODE_INVALID       0
458
459 /* Permanent setup; Updates are only sent on explicit request 
460    (NX_CDRP_CMD_GET_STATISTICS) */
461 #define NX_STATISTICS_MODE_PULL          1
462
463 /* Permanent setup; Updates are sent automatically and on 
464    explicit request (NX_CDRP_CMD_GET_STATISTICS) */
465 #define NX_STATISTICS_MODE_PUSH          2
466
467 /* One time stat update. */
468 #define NX_STATISTICS_MODE_SINGLE_SHOT   3
469
470 #define NX_STATISTICS_MODE_MAX           4
471
472 /*
473  * What set of stats 
474  */
475 #define NX_STATISTICS_TYPE_INVALID       0
476 #define NX_STATISTICS_TYPE_NIC_RX_CORE   1
477 #define NX_STATISTICS_TYPE_NIC_TX_CORE   2
478 #define NX_STATISTICS_TYPE_NIC_RX_ALL    3
479 #define NX_STATISTICS_TYPE_NIC_TX_ALL    4
480 #define NX_STATISTICS_TYPE_MAX           5
481
482
483 /*
484  * Request to setup statistics gathering.
485  * CRB - DOES NOT REQUIRE Rx/TX CONTEXT 
486  */
487
488 typedef struct nx_hostrq_stat_setup_s {
489         U64 host_stat_buffer;   /* Where to dma stats */
490         U32 host_stat_size;     /* Size of stat buffer */
491         U16 context_id;         /* Which context */
492         U16 stat_type;          /* What class of stats */
493         U16 stat_mode;          /* When to update */
494         U16 stat_interval;      /* Frequency of update */
495 } nx_hostrq_stat_setup_t;
496
497
498
499 #endif /* _NXHAL_NIC_INTERFACE_H_ */