xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/cavium/liquidio/octeon_config.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /**********************************************************************
2*4882a593Smuzhiyun  * Author: Cavium, Inc.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Contact: support@cavium.com
5*4882a593Smuzhiyun  *          Please include "LiquidIO" in the subject.
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Copyright (c) 2003-2016 Cavium, Inc.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * This file is free software; you can redistribute it and/or modify
10*4882a593Smuzhiyun  * it under the terms of the GNU General Public License, Version 2, as
11*4882a593Smuzhiyun  * published by the Free Software Foundation.
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  * This file is distributed in the hope that it will be useful, but
14*4882a593Smuzhiyun  * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
15*4882a593Smuzhiyun  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
16*4882a593Smuzhiyun  * NONINFRINGEMENT.  See the GNU General Public License for more details.
17*4882a593Smuzhiyun  ***********************************************************************/
18*4882a593Smuzhiyun /*! \file  octeon_config.h
19*4882a593Smuzhiyun  *  \brief Host Driver: Configuration data structures for the host driver.
20*4882a593Smuzhiyun  */
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #ifndef __OCTEON_CONFIG_H__
23*4882a593Smuzhiyun #define __OCTEON_CONFIG_H__
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun /*--------------------------CONFIG VALUES------------------------*/
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun /* The following macros affect the way the driver data structures
28*4882a593Smuzhiyun  * are generated for Octeon devices.
29*4882a593Smuzhiyun  * They can be modified.
30*4882a593Smuzhiyun  */
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun /* Maximum octeon devices defined as MAX_OCTEON_NICIF to support
33*4882a593Smuzhiyun  * multiple(<= MAX_OCTEON_NICIF) Miniports
34*4882a593Smuzhiyun  */
35*4882a593Smuzhiyun #define   MAX_OCTEON_NICIF             128
36*4882a593Smuzhiyun #define   MAX_OCTEON_DEVICES           MAX_OCTEON_NICIF
37*4882a593Smuzhiyun #define   MAX_OCTEON_LINKS	       MAX_OCTEON_NICIF
38*4882a593Smuzhiyun #define   MAX_OCTEON_MULTICAST_ADDR    32
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun #define   MAX_OCTEON_FILL_COUNT        8
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun /* CN6xxx IQ configuration macros */
43*4882a593Smuzhiyun #define   CN6XXX_MAX_INPUT_QUEUES      32
44*4882a593Smuzhiyun #define   CN6XXX_MAX_IQ_DESCRIPTORS    2048
45*4882a593Smuzhiyun #define   CN6XXX_DB_MIN                1
46*4882a593Smuzhiyun #define   CN6XXX_DB_MAX                8
47*4882a593Smuzhiyun #define   CN6XXX_DB_TIMEOUT            1
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun /* CN6xxx OQ configuration macros */
50*4882a593Smuzhiyun #define   CN6XXX_MAX_OUTPUT_QUEUES     32
51*4882a593Smuzhiyun #define   CN6XXX_MAX_OQ_DESCRIPTORS    2048
52*4882a593Smuzhiyun #define   CN6XXX_OQ_BUF_SIZE           1664
53*4882a593Smuzhiyun #define   CN6XXX_OQ_PKTSPER_INTR       ((CN6XXX_MAX_OQ_DESCRIPTORS < 512) ? \
54*4882a593Smuzhiyun 					(CN6XXX_MAX_OQ_DESCRIPTORS / 4) : 128)
55*4882a593Smuzhiyun #define   CN6XXX_OQ_REFIL_THRESHOLD    ((CN6XXX_MAX_OQ_DESCRIPTORS < 512) ? \
56*4882a593Smuzhiyun 					(CN6XXX_MAX_OQ_DESCRIPTORS / 4) : 128)
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun #define   CN6XXX_OQ_INTR_PKT           64
59*4882a593Smuzhiyun #define   CN6XXX_OQ_INTR_TIME          100
60*4882a593Smuzhiyun #define   DEFAULT_NUM_NIC_PORTS_66XX   2
61*4882a593Smuzhiyun #define   DEFAULT_NUM_NIC_PORTS_68XX   4
62*4882a593Smuzhiyun #define   DEFAULT_NUM_NIC_PORTS_68XX_210NV  2
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun /* CN23xx  IQ configuration macros */
65*4882a593Smuzhiyun #define   CN23XX_MAX_VFS_PER_PF_PASS_1_0 8
66*4882a593Smuzhiyun #define   CN23XX_MAX_VFS_PER_PF_PASS_1_1 31
67*4882a593Smuzhiyun #define   CN23XX_MAX_VFS_PER_PF          63
68*4882a593Smuzhiyun #define   CN23XX_MAX_RINGS_PER_VF        8
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun #define   CN23XX_MAX_RINGS_PER_PF_PASS_1_0 12
71*4882a593Smuzhiyun #define   CN23XX_MAX_RINGS_PER_PF_PASS_1_1 32
72*4882a593Smuzhiyun #define   CN23XX_MAX_RINGS_PER_PF          64
73*4882a593Smuzhiyun #define   CN23XX_MAX_RINGS_PER_VF          8
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun #define   CN23XX_MAX_INPUT_QUEUES	CN23XX_MAX_RINGS_PER_PF
76*4882a593Smuzhiyun #define   CN23XX_MAX_IQ_DESCRIPTORS	2048
77*4882a593Smuzhiyun #define   CN23XX_DEFAULT_IQ_DESCRIPTORS	512
78*4882a593Smuzhiyun #define   CN23XX_MIN_IQ_DESCRIPTORS	128
79*4882a593Smuzhiyun #define   CN23XX_DB_MIN                 1
80*4882a593Smuzhiyun #define   CN23XX_DB_MAX                 8
81*4882a593Smuzhiyun #define   CN23XX_DB_TIMEOUT             1
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun #define   CN23XX_MAX_OUTPUT_QUEUES	CN23XX_MAX_RINGS_PER_PF
84*4882a593Smuzhiyun #define   CN23XX_MAX_OQ_DESCRIPTORS	2048
85*4882a593Smuzhiyun #define   CN23XX_DEFAULT_OQ_DESCRIPTORS	512
86*4882a593Smuzhiyun #define   CN23XX_MIN_OQ_DESCRIPTORS	128
87*4882a593Smuzhiyun #define   CN23XX_OQ_BUF_SIZE		1664
88*4882a593Smuzhiyun #define   CN23XX_OQ_PKTSPER_INTR	128
89*4882a593Smuzhiyun /*#define CAVIUM_ONLY_CN23XX_RX_PERF*/
90*4882a593Smuzhiyun #define   CN23XX_OQ_REFIL_THRESHOLD	16
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun #define   CN23XX_OQ_INTR_PKT		64
93*4882a593Smuzhiyun #define   CN23XX_OQ_INTR_TIME		100
94*4882a593Smuzhiyun #define   DEFAULT_NUM_NIC_PORTS_23XX	1
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun #define   CN23XX_CFG_IO_QUEUES		CN23XX_MAX_RINGS_PER_PF
97*4882a593Smuzhiyun /* PEMs count */
98*4882a593Smuzhiyun #define   CN23XX_MAX_MACS		4
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun #define   CN23XX_DEF_IQ_INTR_THRESHOLD	32
101*4882a593Smuzhiyun #define   CN23XX_DEF_IQ_INTR_BYTE_THRESHOLD   (64 * 1024)
102*4882a593Smuzhiyun /* common OCTEON configuration macros */
103*4882a593Smuzhiyun #define   CN6XXX_CFG_IO_QUEUES         32
104*4882a593Smuzhiyun #define   OCTEON_32BYTE_INSTR          32
105*4882a593Smuzhiyun #define   OCTEON_64BYTE_INSTR          64
106*4882a593Smuzhiyun #define   OCTEON_MAX_BASE_IOQ          4
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun #define   OCTEON_DMA_INTR_PKT          64
109*4882a593Smuzhiyun #define   OCTEON_DMA_INTR_TIME         1000
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun #define MAX_TXQS_PER_INTF  8
112*4882a593Smuzhiyun #define MAX_RXQS_PER_INTF  8
113*4882a593Smuzhiyun #define DEF_TXQS_PER_INTF  4
114*4882a593Smuzhiyun #define DEF_RXQS_PER_INTF  4
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun #define INVALID_IOQ_NO          0xff
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun #define   DEFAULT_POW_GRP       0
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun /* Macros to get octeon config params */
121*4882a593Smuzhiyun #define CFG_GET_IQ_CFG(cfg)                      ((cfg)->iq)
122*4882a593Smuzhiyun #define CFG_GET_IQ_MAX_Q(cfg)                    ((cfg)->iq.max_iqs)
123*4882a593Smuzhiyun #define CFG_GET_IQ_PENDING_LIST_SIZE(cfg)        ((cfg)->iq.pending_list_size)
124*4882a593Smuzhiyun #define CFG_GET_IQ_INSTR_TYPE(cfg)               ((cfg)->iq.instr_type)
125*4882a593Smuzhiyun #define CFG_GET_IQ_DB_MIN(cfg)                   ((cfg)->iq.db_min)
126*4882a593Smuzhiyun #define CFG_GET_IQ_DB_TIMEOUT(cfg)               ((cfg)->iq.db_timeout)
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun #define CFG_GET_IQ_INTR_PKT(cfg)                 ((cfg)->iq.iq_intr_pkt)
129*4882a593Smuzhiyun #define CFG_SET_IQ_INTR_PKT(cfg, val)            (cfg)->iq.iq_intr_pkt = val
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun #define CFG_GET_OQ_MAX_Q(cfg)                    ((cfg)->oq.max_oqs)
132*4882a593Smuzhiyun #define CFG_GET_OQ_PKTS_PER_INTR(cfg)            ((cfg)->oq.pkts_per_intr)
133*4882a593Smuzhiyun #define CFG_GET_OQ_REFILL_THRESHOLD(cfg)         ((cfg)->oq.refill_threshold)
134*4882a593Smuzhiyun #define CFG_GET_OQ_INTR_PKT(cfg)                 ((cfg)->oq.oq_intr_pkt)
135*4882a593Smuzhiyun #define CFG_GET_OQ_INTR_TIME(cfg)                ((cfg)->oq.oq_intr_time)
136*4882a593Smuzhiyun #define CFG_SET_OQ_INTR_PKT(cfg, val)            (cfg)->oq.oq_intr_pkt = val
137*4882a593Smuzhiyun #define CFG_SET_OQ_INTR_TIME(cfg, val)           (cfg)->oq.oq_intr_time = val
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun #define CFG_GET_DMA_INTR_PKT(cfg)                ((cfg)->dma.dma_intr_pkt)
140*4882a593Smuzhiyun #define CFG_GET_DMA_INTR_TIME(cfg)               ((cfg)->dma.dma_intr_time)
141*4882a593Smuzhiyun #define CFG_GET_NUM_NIC_PORTS(cfg)               ((cfg)->num_nic_ports)
142*4882a593Smuzhiyun #define CFG_GET_NUM_DEF_TX_DESCS(cfg)            ((cfg)->num_def_tx_descs)
143*4882a593Smuzhiyun #define CFG_GET_NUM_DEF_RX_DESCS(cfg)            ((cfg)->num_def_rx_descs)
144*4882a593Smuzhiyun #define CFG_GET_DEF_RX_BUF_SIZE(cfg)             ((cfg)->def_rx_buf_size)
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun #define CFG_GET_MAX_TXQS_NIC_IF(cfg, idx) \
147*4882a593Smuzhiyun 				((cfg)->nic_if_cfg[idx].max_txqs)
148*4882a593Smuzhiyun #define CFG_GET_NUM_TXQS_NIC_IF(cfg, idx) \
149*4882a593Smuzhiyun 				((cfg)->nic_if_cfg[idx].num_txqs)
150*4882a593Smuzhiyun #define CFG_GET_MAX_RXQS_NIC_IF(cfg, idx) \
151*4882a593Smuzhiyun 				((cfg)->nic_if_cfg[idx].max_rxqs)
152*4882a593Smuzhiyun #define CFG_GET_NUM_RXQS_NIC_IF(cfg, idx) \
153*4882a593Smuzhiyun 				((cfg)->nic_if_cfg[idx].num_rxqs)
154*4882a593Smuzhiyun #define CFG_GET_NUM_RX_DESCS_NIC_IF(cfg, idx) \
155*4882a593Smuzhiyun 				((cfg)->nic_if_cfg[idx].num_rx_descs)
156*4882a593Smuzhiyun #define CFG_GET_NUM_TX_DESCS_NIC_IF(cfg, idx) \
157*4882a593Smuzhiyun 				((cfg)->nic_if_cfg[idx].num_tx_descs)
158*4882a593Smuzhiyun #define CFG_GET_NUM_RX_BUF_SIZE_NIC_IF(cfg, idx) \
159*4882a593Smuzhiyun 				((cfg)->nic_if_cfg[idx].rx_buf_size)
160*4882a593Smuzhiyun #define CFG_GET_BASE_QUE_NIC_IF(cfg, idx) \
161*4882a593Smuzhiyun 				((cfg)->nic_if_cfg[idx].base_queue)
162*4882a593Smuzhiyun #define CFG_GET_GMXID_NIC_IF(cfg, idx) \
163*4882a593Smuzhiyun 				((cfg)->nic_if_cfg[idx].gmx_port_id)
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun #define CFG_GET_CTRL_Q_GRP(cfg)                  ((cfg)->misc.ctrlq_grp)
166*4882a593Smuzhiyun #define CFG_GET_HOST_LINK_QUERY_INTERVAL(cfg) \
167*4882a593Smuzhiyun 				((cfg)->misc.host_link_query_interval)
168*4882a593Smuzhiyun #define CFG_GET_OCT_LINK_QUERY_INTERVAL(cfg) \
169*4882a593Smuzhiyun 				((cfg)->misc.oct_link_query_interval)
170*4882a593Smuzhiyun #define CFG_GET_IS_SLI_BP_ON(cfg)                ((cfg)->misc.enable_sli_oq_bp)
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun #define CFG_SET_NUM_RX_DESCS_NIC_IF(cfg, idx, value) \
173*4882a593Smuzhiyun 				((cfg)->nic_if_cfg[idx].num_rx_descs = value)
174*4882a593Smuzhiyun #define CFG_SET_NUM_TX_DESCS_NIC_IF(cfg, idx, value) \
175*4882a593Smuzhiyun 				((cfg)->nic_if_cfg[idx].num_tx_descs = value)
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun /* Max IOQs per OCTEON Link */
178*4882a593Smuzhiyun #define MAX_IOQS_PER_NICIF              64
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun enum lio_card_type {
181*4882a593Smuzhiyun 	LIO_210SV = 0, /* Two port, 66xx */
182*4882a593Smuzhiyun 	LIO_210NV,     /* Two port, 68xx */
183*4882a593Smuzhiyun 	LIO_410NV,     /* Four port, 68xx */
184*4882a593Smuzhiyun 	LIO_23XX       /* 23xx */
185*4882a593Smuzhiyun };
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun #define LIO_210SV_NAME "210sv"
188*4882a593Smuzhiyun #define LIO_210NV_NAME "210nv"
189*4882a593Smuzhiyun #define LIO_410NV_NAME "410nv"
190*4882a593Smuzhiyun #define LIO_23XX_NAME  "23xx"
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun /** Structure to define the configuration attributes for each Input queue.
193*4882a593Smuzhiyun  *  Applicable to all Octeon processors
194*4882a593Smuzhiyun  **/
195*4882a593Smuzhiyun struct octeon_iq_config {
196*4882a593Smuzhiyun #ifdef __BIG_ENDIAN_BITFIELD
197*4882a593Smuzhiyun 	u64 reserved:16;
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	/** Tx interrupt packets. Applicable to 23xx only */
200*4882a593Smuzhiyun 	u64 iq_intr_pkt:16;
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun 	/** Minimum ticks to wait before checking for pending instructions. */
203*4882a593Smuzhiyun 	u64 db_timeout:16;
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun 	/** Minimum number of commands pending to be posted to Octeon
206*4882a593Smuzhiyun 	 *  before driver hits the Input queue doorbell.
207*4882a593Smuzhiyun 	 */
208*4882a593Smuzhiyun 	u64 db_min:8;
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	/** Command size - 32 or 64 bytes */
211*4882a593Smuzhiyun 	u64 instr_type:32;
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun 	/** Pending list size (usually set to the sum of the size of all Input
214*4882a593Smuzhiyun 	 *  queues)
215*4882a593Smuzhiyun 	 */
216*4882a593Smuzhiyun 	u64 pending_list_size:32;
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 	/* Max number of IQs available */
219*4882a593Smuzhiyun 	u64 max_iqs:8;
220*4882a593Smuzhiyun #else
221*4882a593Smuzhiyun 	/* Max number of IQs available */
222*4882a593Smuzhiyun 	u64 max_iqs:8;
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 	/** Pending list size (usually set to the sum of the size of all Input
225*4882a593Smuzhiyun 	 *  queues)
226*4882a593Smuzhiyun 	 */
227*4882a593Smuzhiyun 	u64 pending_list_size:32;
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun 	/** Command size - 32 or 64 bytes */
230*4882a593Smuzhiyun 	u64 instr_type:32;
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 	/** Minimum number of commands pending to be posted to Octeon
233*4882a593Smuzhiyun 	 *  before driver hits the Input queue doorbell.
234*4882a593Smuzhiyun 	 */
235*4882a593Smuzhiyun 	u64 db_min:8;
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	/** Minimum ticks to wait before checking for pending instructions. */
238*4882a593Smuzhiyun 	u64 db_timeout:16;
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun 	/** Tx interrupt packets. Applicable to 23xx only */
241*4882a593Smuzhiyun 	u64 iq_intr_pkt:16;
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun 	u64 reserved:16;
244*4882a593Smuzhiyun #endif
245*4882a593Smuzhiyun };
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun /** Structure to define the configuration attributes for each Output queue.
248*4882a593Smuzhiyun  *  Applicable to all Octeon processors
249*4882a593Smuzhiyun  **/
250*4882a593Smuzhiyun struct octeon_oq_config {
251*4882a593Smuzhiyun #ifdef __BIG_ENDIAN_BITFIELD
252*4882a593Smuzhiyun 	u64 reserved:16;
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun 	u64 pkts_per_intr:16;
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	/** Interrupt Coalescing (Time Interval). Octeon will interrupt the
257*4882a593Smuzhiyun 	 *  host if atleast one packet was sent in the time interval specified
258*4882a593Smuzhiyun 	 *  by this field. The driver uses time interval interrupt coalescing
259*4882a593Smuzhiyun 	 *  by default. The time is specified in microseconds.
260*4882a593Smuzhiyun 	 */
261*4882a593Smuzhiyun 	u64 oq_intr_time:16;
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 	/** Interrupt Coalescing (Packet Count). Octeon will interrupt the host
264*4882a593Smuzhiyun 	 *  only if it sent as many packets as specified by this field.
265*4882a593Smuzhiyun 	 *  The driver
266*4882a593Smuzhiyun 	 *  usually does not use packet count interrupt coalescing.
267*4882a593Smuzhiyun 	 */
268*4882a593Smuzhiyun 	u64 oq_intr_pkt:16;
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun 	/** The number of buffers that were consumed during packet processing by
271*4882a593Smuzhiyun 	 *   the driver on this Output queue before the driver attempts to
272*4882a593Smuzhiyun 	 *   replenish
273*4882a593Smuzhiyun 	 *   the descriptor ring with new buffers.
274*4882a593Smuzhiyun 	 */
275*4882a593Smuzhiyun 	u64 refill_threshold:16;
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun 	/* Max number of OQs available */
278*4882a593Smuzhiyun 	u64 max_oqs:8;
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun #else
281*4882a593Smuzhiyun 	/* Max number of OQs available */
282*4882a593Smuzhiyun 	u64 max_oqs:8;
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun 	/** The number of buffers that were consumed during packet processing by
285*4882a593Smuzhiyun 	 *   the driver on this Output queue before the driver attempts to
286*4882a593Smuzhiyun 	 *   replenish
287*4882a593Smuzhiyun 	 *   the descriptor ring with new buffers.
288*4882a593Smuzhiyun 	 */
289*4882a593Smuzhiyun 	u64 refill_threshold:16;
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun 	/** Interrupt Coalescing (Packet Count). Octeon will interrupt the host
292*4882a593Smuzhiyun 	 *  only if it sent as many packets as specified by this field.
293*4882a593Smuzhiyun 	 *  The driver
294*4882a593Smuzhiyun 	 *  usually does not use packet count interrupt coalescing.
295*4882a593Smuzhiyun 	 */
296*4882a593Smuzhiyun 	u64 oq_intr_pkt:16;
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 	/** Interrupt Coalescing (Time Interval). Octeon will interrupt the
299*4882a593Smuzhiyun 	 *  host if atleast one packet was sent in the time interval specified
300*4882a593Smuzhiyun 	 *  by this field. The driver uses time interval interrupt coalescing
301*4882a593Smuzhiyun 	 *  by default.  The time is specified in microseconds.
302*4882a593Smuzhiyun 	 */
303*4882a593Smuzhiyun 	u64 oq_intr_time:16;
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun 	u64 pkts_per_intr:16;
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun 	u64 reserved:16;
308*4882a593Smuzhiyun #endif
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun };
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun /** This structure conatins the NIC link configuration attributes,
313*4882a593Smuzhiyun  *  common for all the OCTEON Modles.
314*4882a593Smuzhiyun  */
315*4882a593Smuzhiyun struct octeon_nic_if_config {
316*4882a593Smuzhiyun #ifdef __BIG_ENDIAN_BITFIELD
317*4882a593Smuzhiyun 	u64 reserved:56;
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun 	u64 base_queue:16;
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun 	u64 gmx_port_id:8;
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun 	/* SKB size, We need not change buf size even for Jumbo frames.
324*4882a593Smuzhiyun 	 * Octeon can send jumbo frames in 4 consecutive descriptors,
325*4882a593Smuzhiyun 	 */
326*4882a593Smuzhiyun 	u64 rx_buf_size:16;
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun 	/* Num of desc for tx rings */
329*4882a593Smuzhiyun 	u64 num_tx_descs:16;
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun 	/* Num of desc for rx rings */
332*4882a593Smuzhiyun 	u64 num_rx_descs:16;
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun 	/* Actual configured value. Range could be: 1...max_rxqs */
335*4882a593Smuzhiyun 	u64 num_rxqs:16;
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun 	/* Max Rxqs: Half for each of the two ports :max_oq/2  */
338*4882a593Smuzhiyun 	u64 max_rxqs:16;
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun 	/* Actual configured value. Range could be: 1...max_txqs */
341*4882a593Smuzhiyun 	u64 num_txqs:16;
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun 	/* Max Txqs: Half for each of the two ports :max_iq/2 */
344*4882a593Smuzhiyun 	u64 max_txqs:16;
345*4882a593Smuzhiyun #else
346*4882a593Smuzhiyun 	/* Max Txqs: Half for each of the two ports :max_iq/2 */
347*4882a593Smuzhiyun 	u64 max_txqs:16;
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun 	/* Actual configured value. Range could be: 1...max_txqs */
350*4882a593Smuzhiyun 	u64 num_txqs:16;
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun 	/* Max Rxqs: Half for each of the two ports :max_oq/2  */
353*4882a593Smuzhiyun 	u64 max_rxqs:16;
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun 	/* Actual configured value. Range could be: 1...max_rxqs */
356*4882a593Smuzhiyun 	u64 num_rxqs:16;
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun 	/* Num of desc for rx rings */
359*4882a593Smuzhiyun 	u64 num_rx_descs:16;
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun 	/* Num of desc for tx rings */
362*4882a593Smuzhiyun 	u64 num_tx_descs:16;
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun 	/* SKB size, We need not change buf size even for Jumbo frames.
365*4882a593Smuzhiyun 	 * Octeon can send jumbo frames in 4 consecutive descriptors,
366*4882a593Smuzhiyun 	 */
367*4882a593Smuzhiyun 	u64 rx_buf_size:16;
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun 	u64 gmx_port_id:8;
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun 	u64 base_queue:16;
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun 	u64 reserved:56;
374*4882a593Smuzhiyun #endif
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun };
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun /** Structure to define the configuration attributes for meta data.
379*4882a593Smuzhiyun  *  Applicable to all Octeon processors.
380*4882a593Smuzhiyun  */
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun struct octeon_misc_config {
383*4882a593Smuzhiyun #ifdef __BIG_ENDIAN_BITFIELD
384*4882a593Smuzhiyun 	/** Host link status polling period */
385*4882a593Smuzhiyun 	u64 host_link_query_interval:32;
386*4882a593Smuzhiyun 	/** Oct link status polling period */
387*4882a593Smuzhiyun 	u64 oct_link_query_interval:32;
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun 	u64 enable_sli_oq_bp:1;
390*4882a593Smuzhiyun 	/** Control IQ Group */
391*4882a593Smuzhiyun 	u64 ctrlq_grp:4;
392*4882a593Smuzhiyun #else
393*4882a593Smuzhiyun 	/** Control IQ Group */
394*4882a593Smuzhiyun 	u64 ctrlq_grp:4;
395*4882a593Smuzhiyun 	/** BP for SLI OQ */
396*4882a593Smuzhiyun 	u64 enable_sli_oq_bp:1;
397*4882a593Smuzhiyun 	/** Host link status polling period */
398*4882a593Smuzhiyun 	u64 oct_link_query_interval:32;
399*4882a593Smuzhiyun 	/** Oct link status polling period */
400*4882a593Smuzhiyun 	u64 host_link_query_interval:32;
401*4882a593Smuzhiyun #endif
402*4882a593Smuzhiyun };
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun /** Structure to define the configuration for all OCTEON processors. */
405*4882a593Smuzhiyun struct octeon_config {
406*4882a593Smuzhiyun 	u16 card_type;
407*4882a593Smuzhiyun 	char *card_name;
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun 	/** Input Queue attributes. */
410*4882a593Smuzhiyun 	struct octeon_iq_config iq;
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun 	/** Output Queue attributes. */
413*4882a593Smuzhiyun 	struct octeon_oq_config oq;
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun 	/** NIC Port Configuration */
416*4882a593Smuzhiyun 	struct octeon_nic_if_config nic_if_cfg[MAX_OCTEON_NICIF];
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun 	/** Miscellaneous attributes */
419*4882a593Smuzhiyun 	struct octeon_misc_config misc;
420*4882a593Smuzhiyun 
421*4882a593Smuzhiyun 	int num_nic_ports;
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun 	int num_def_tx_descs;
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun 	/* Num of desc for rx rings */
426*4882a593Smuzhiyun 	int num_def_rx_descs;
427*4882a593Smuzhiyun 
428*4882a593Smuzhiyun 	int def_rx_buf_size;
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun };
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun /* The following config values are fixed and should not be modified. */
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun #define  BAR1_INDEX_DYNAMIC_MAP          2
435*4882a593Smuzhiyun #define  BAR1_INDEX_STATIC_MAP          15
436*4882a593Smuzhiyun #define  OCTEON_BAR1_ENTRY_SIZE         (4 * 1024 * 1024)
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun #define  MAX_BAR1_IOREMAP_SIZE  (16 * OCTEON_BAR1_ENTRY_SIZE)
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun /* Response lists - 1 ordered, 1 unordered-blocking, 1 unordered-nonblocking
441*4882a593Smuzhiyun  *                  1 process done list, 1 zombie lists(timeouted sc list)
442*4882a593Smuzhiyun  * NoResponse Lists are now maintained with each IQ. (Dec' 2007).
443*4882a593Smuzhiyun  */
444*4882a593Smuzhiyun #define MAX_RESPONSE_LISTS           6
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun /* Opcode hash bits. The opcode is hashed on the lower 6-bits to lookup the
447*4882a593Smuzhiyun  * dispatch table.
448*4882a593Smuzhiyun  */
449*4882a593Smuzhiyun #define OPCODE_MASK_BITS             6
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun /* Mask for the 6-bit lookup hash */
452*4882a593Smuzhiyun #define OCTEON_OPCODE_MASK           0x3f
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun /* Size of the dispatch table. The 6-bit hash can index into 2^6 entries */
455*4882a593Smuzhiyun #define DISPATCH_LIST_SIZE                      BIT(OPCODE_MASK_BITS)
456*4882a593Smuzhiyun 
457*4882a593Smuzhiyun /* Maximum number of Octeon Instruction (command) queues */
458*4882a593Smuzhiyun #define MAX_OCTEON_INSTR_QUEUES(oct)		\
459*4882a593Smuzhiyun 		(OCTEON_CN23XX_PF(oct) ? CN23XX_MAX_INPUT_QUEUES : \
460*4882a593Smuzhiyun 					CN6XXX_MAX_INPUT_QUEUES)
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun /* Maximum number of Octeon Instruction (command) queues */
463*4882a593Smuzhiyun #define MAX_OCTEON_OUTPUT_QUEUES(oct)		\
464*4882a593Smuzhiyun 		(OCTEON_CN23XX_PF(oct) ? CN23XX_MAX_OUTPUT_QUEUES : \
465*4882a593Smuzhiyun 					CN6XXX_MAX_OUTPUT_QUEUES)
466*4882a593Smuzhiyun 
467*4882a593Smuzhiyun #define MAX_POSSIBLE_OCTEON_INSTR_QUEUES	CN23XX_MAX_INPUT_QUEUES
468*4882a593Smuzhiyun #define MAX_POSSIBLE_OCTEON_OUTPUT_QUEUES	CN23XX_MAX_OUTPUT_QUEUES
469*4882a593Smuzhiyun 
470*4882a593Smuzhiyun #define MAX_POSSIBLE_VFS			64
471*4882a593Smuzhiyun 
472*4882a593Smuzhiyun #endif /* __OCTEON_CONFIG_H__  */
473