xref: /openbmc/linux/drivers/net/ethernet/intel/ice/ice.h (revision 3a858ba392c3b19986c40a4c170ddc37b144115f)
1837f08fdSAnirudh Venkataramanan /* SPDX-License-Identifier: GPL-2.0 */
2837f08fdSAnirudh Venkataramanan /* Copyright (c) 2018, Intel Corporation. */
3837f08fdSAnirudh Venkataramanan 
4837f08fdSAnirudh Venkataramanan #ifndef _ICE_H_
5837f08fdSAnirudh Venkataramanan #define _ICE_H_
6837f08fdSAnirudh Venkataramanan 
7837f08fdSAnirudh Venkataramanan #include <linux/types.h>
8837f08fdSAnirudh Venkataramanan #include <linux/errno.h>
9837f08fdSAnirudh Venkataramanan #include <linux/kernel.h>
10837f08fdSAnirudh Venkataramanan #include <linux/module.h>
11837f08fdSAnirudh Venkataramanan #include <linux/netdevice.h>
12837f08fdSAnirudh Venkataramanan #include <linux/compiler.h>
13dc49c772SAnirudh Venkataramanan #include <linux/etherdevice.h>
14*3a858ba3SAnirudh Venkataramanan #include <linux/cpumask.h>
15*3a858ba3SAnirudh Venkataramanan #include <linux/if_vlan.h>
16837f08fdSAnirudh Venkataramanan #include <linux/pci.h>
17940b61afSAnirudh Venkataramanan #include <linux/workqueue.h>
18837f08fdSAnirudh Venkataramanan #include <linux/aer.h>
19940b61afSAnirudh Venkataramanan #include <linux/interrupt.h>
20940b61afSAnirudh Venkataramanan #include <linux/timer.h>
217ec59eeaSAnirudh Venkataramanan #include <linux/delay.h>
22837f08fdSAnirudh Venkataramanan #include <linux/bitmap.h>
23*3a858ba3SAnirudh Venkataramanan #include <linux/log2.h>
24940b61afSAnirudh Venkataramanan #include <linux/if_bridge.h>
25837f08fdSAnirudh Venkataramanan #include "ice_devids.h"
26837f08fdSAnirudh Venkataramanan #include "ice_type.h"
27940b61afSAnirudh Venkataramanan #include "ice_txrx.h"
289c20346bSAnirudh Venkataramanan #include "ice_switch.h"
29f31e4b6fSAnirudh Venkataramanan #include "ice_common.h"
309c20346bSAnirudh Venkataramanan #include "ice_sched.h"
31837f08fdSAnirudh Venkataramanan 
32837f08fdSAnirudh Venkataramanan #define ICE_BAR0		0
33*3a858ba3SAnirudh Venkataramanan #define ICE_DFLT_NUM_DESC	128
34*3a858ba3SAnirudh Venkataramanan #define ICE_REQ_DESC_MULTIPLE	32
35940b61afSAnirudh Venkataramanan #define ICE_INT_NAME_STR_LEN	(IFNAMSIZ + 16)
36f31e4b6fSAnirudh Venkataramanan #define ICE_AQ_LEN		64
37940b61afSAnirudh Venkataramanan #define ICE_MIN_MSIX		2
38*3a858ba3SAnirudh Venkataramanan #define ICE_NO_VSI		0xffff
39940b61afSAnirudh Venkataramanan #define ICE_MAX_VSI_ALLOC	130
40940b61afSAnirudh Venkataramanan #define ICE_MAX_TXQS		2048
41940b61afSAnirudh Venkataramanan #define ICE_MAX_RXQS		2048
42*3a858ba3SAnirudh Venkataramanan #define ICE_VSI_MAP_CONTIG	0
43*3a858ba3SAnirudh Venkataramanan #define ICE_VSI_MAP_SCATTER	1
44*3a858ba3SAnirudh Venkataramanan #define ICE_MAX_SCATTER_TXQS	16
45*3a858ba3SAnirudh Venkataramanan #define ICE_MAX_SCATTER_RXQS	16
46940b61afSAnirudh Venkataramanan #define ICE_RES_VALID_BIT	0x8000
47940b61afSAnirudh Venkataramanan #define ICE_RES_MISC_VEC_ID	(ICE_RES_VALID_BIT - 1)
48*3a858ba3SAnirudh Venkataramanan #define ICE_INVAL_Q_INDEX	0xffff
49837f08fdSAnirudh Venkataramanan 
50837f08fdSAnirudh Venkataramanan #define ICE_DFLT_NETIF_M (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK)
51837f08fdSAnirudh Venkataramanan 
52*3a858ba3SAnirudh Venkataramanan #define ICE_MAX_MTU	(ICE_AQ_SET_MAC_FRAME_SIZE_MAX - \
53*3a858ba3SAnirudh Venkataramanan 			 ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN)
54*3a858ba3SAnirudh Venkataramanan 
55*3a858ba3SAnirudh Venkataramanan #define ICE_UP_TABLE_TRANSLATE(val, i) \
56*3a858ba3SAnirudh Venkataramanan 		(((val) << ICE_AQ_VSI_UP_TABLE_UP##i##_S) & \
57*3a858ba3SAnirudh Venkataramanan 		  ICE_AQ_VSI_UP_TABLE_UP##i##_M)
58*3a858ba3SAnirudh Venkataramanan 
59*3a858ba3SAnirudh Venkataramanan struct ice_tc_info {
60*3a858ba3SAnirudh Venkataramanan 	u16 qoffset;
61*3a858ba3SAnirudh Venkataramanan 	u16 qcount;
62*3a858ba3SAnirudh Venkataramanan };
63*3a858ba3SAnirudh Venkataramanan 
64*3a858ba3SAnirudh Venkataramanan struct ice_tc_cfg {
65*3a858ba3SAnirudh Venkataramanan 	u8 numtc; /* Total number of enabled TCs */
66*3a858ba3SAnirudh Venkataramanan 	u8 ena_tc; /* TX map */
67*3a858ba3SAnirudh Venkataramanan 	struct ice_tc_info tc_info[ICE_MAX_TRAFFIC_CLASS];
68*3a858ba3SAnirudh Venkataramanan };
69*3a858ba3SAnirudh Venkataramanan 
70940b61afSAnirudh Venkataramanan struct ice_res_tracker {
71940b61afSAnirudh Venkataramanan 	u16 num_entries;
72940b61afSAnirudh Venkataramanan 	u16 search_hint;
73940b61afSAnirudh Venkataramanan 	u16 list[1];
74940b61afSAnirudh Venkataramanan };
75940b61afSAnirudh Venkataramanan 
76940b61afSAnirudh Venkataramanan struct ice_sw {
77940b61afSAnirudh Venkataramanan 	struct ice_pf *pf;
78940b61afSAnirudh Venkataramanan 	u16 sw_id;		/* switch ID for this switch */
79940b61afSAnirudh Venkataramanan 	u16 bridge_mode;	/* VEB/VEPA/Port Virtualizer */
80940b61afSAnirudh Venkataramanan };
81940b61afSAnirudh Venkataramanan 
82837f08fdSAnirudh Venkataramanan enum ice_state {
83837f08fdSAnirudh Venkataramanan 	__ICE_DOWN,
84940b61afSAnirudh Venkataramanan 	__ICE_PFR_REQ,			/* set by driver and peers */
85940b61afSAnirudh Venkataramanan 	__ICE_ADMINQ_EVENT_PENDING,
86940b61afSAnirudh Venkataramanan 	__ICE_SERVICE_SCHED,
87837f08fdSAnirudh Venkataramanan 	__ICE_STATE_NBITS		/* must be last */
88837f08fdSAnirudh Venkataramanan };
89837f08fdSAnirudh Venkataramanan 
90940b61afSAnirudh Venkataramanan /* struct that defines a VSI, associated with a dev */
91940b61afSAnirudh Venkataramanan struct ice_vsi {
92940b61afSAnirudh Venkataramanan 	struct net_device *netdev;
93*3a858ba3SAnirudh Venkataramanan 	struct ice_sw *vsw;		 /* switch this VSI is on */
94*3a858ba3SAnirudh Venkataramanan 	struct ice_pf *back;		 /* back pointer to PF */
95940b61afSAnirudh Venkataramanan 	struct ice_port_info *port_info; /* back pointer to port_info */
96*3a858ba3SAnirudh Venkataramanan 	struct ice_ring **rx_rings;	 /* rx ring array */
97*3a858ba3SAnirudh Venkataramanan 	struct ice_ring **tx_rings;	 /* tx ring array */
98*3a858ba3SAnirudh Venkataramanan 	struct ice_q_vector **q_vectors; /* q_vector array */
99*3a858ba3SAnirudh Venkataramanan 	DECLARE_BITMAP(state, __ICE_STATE_NBITS);
100*3a858ba3SAnirudh Venkataramanan 	int num_q_vectors;
101*3a858ba3SAnirudh Venkataramanan 	int base_vector;
102*3a858ba3SAnirudh Venkataramanan 	enum ice_vsi_type type;
103940b61afSAnirudh Venkataramanan 	u16 vsi_num;			 /* HW (absolute) index of this VSI */
104*3a858ba3SAnirudh Venkataramanan 	u16 idx;			 /* software index in pf->vsi[] */
105*3a858ba3SAnirudh Venkataramanan 
106*3a858ba3SAnirudh Venkataramanan 	/* Interrupt thresholds */
107*3a858ba3SAnirudh Venkataramanan 	u16 work_lmt;
108*3a858ba3SAnirudh Venkataramanan 
109*3a858ba3SAnirudh Venkataramanan 	struct ice_aqc_vsi_props info;	 /* VSI properties */
110*3a858ba3SAnirudh Venkataramanan 
111*3a858ba3SAnirudh Venkataramanan 	/* queue information */
112*3a858ba3SAnirudh Venkataramanan 	u8 tx_mapping_mode;		 /* ICE_MAP_MODE_[CONTIG|SCATTER] */
113*3a858ba3SAnirudh Venkataramanan 	u8 rx_mapping_mode;		 /* ICE_MAP_MODE_[CONTIG|SCATTER] */
114*3a858ba3SAnirudh Venkataramanan 	u16 txq_map[ICE_MAX_TXQS];	 /* index in pf->avail_txqs */
115*3a858ba3SAnirudh Venkataramanan 	u16 rxq_map[ICE_MAX_RXQS];	 /* index in pf->avail_rxqs */
116*3a858ba3SAnirudh Venkataramanan 	u16 alloc_txq;			 /* Allocated Tx queues */
117*3a858ba3SAnirudh Venkataramanan 	u16 num_txq;			 /* Used Tx queues */
118*3a858ba3SAnirudh Venkataramanan 	u16 alloc_rxq;			 /* Allocated Rx queues */
119*3a858ba3SAnirudh Venkataramanan 	u16 num_rxq;			 /* Used Rx queues */
120*3a858ba3SAnirudh Venkataramanan 	u16 num_desc;
121*3a858ba3SAnirudh Venkataramanan 	struct ice_tc_cfg tc_cfg;
122*3a858ba3SAnirudh Venkataramanan } ____cacheline_internodealigned_in_smp;
123*3a858ba3SAnirudh Venkataramanan 
124*3a858ba3SAnirudh Venkataramanan /* struct that defines an interrupt vector */
125*3a858ba3SAnirudh Venkataramanan struct ice_q_vector {
126*3a858ba3SAnirudh Venkataramanan 	struct ice_vsi *vsi;
127*3a858ba3SAnirudh Venkataramanan 	cpumask_t affinity_mask;
128*3a858ba3SAnirudh Venkataramanan 	struct napi_struct napi;
129*3a858ba3SAnirudh Venkataramanan 	struct ice_ring_container rx;
130*3a858ba3SAnirudh Venkataramanan 	struct ice_ring_container tx;
131*3a858ba3SAnirudh Venkataramanan 	u16 v_idx;			/* index in the vsi->q_vector array. */
132*3a858ba3SAnirudh Venkataramanan 	u8 num_ring_tx;			/* total number of tx rings in vector */
133*3a858ba3SAnirudh Venkataramanan 	u8 num_ring_rx;			/* total number of rx rings in vector */
134940b61afSAnirudh Venkataramanan } ____cacheline_internodealigned_in_smp;
135940b61afSAnirudh Venkataramanan 
136940b61afSAnirudh Venkataramanan enum ice_pf_flags {
137940b61afSAnirudh Venkataramanan 	ICE_FLAG_MSIX_ENA,
138940b61afSAnirudh Venkataramanan 	ICE_FLAG_FLTR_SYNC,
139940b61afSAnirudh Venkataramanan 	ICE_FLAG_RSS_ENA,
140940b61afSAnirudh Venkataramanan 	ICE_PF_FLAGS_NBITS		/* must be last */
141940b61afSAnirudh Venkataramanan };
142940b61afSAnirudh Venkataramanan 
143837f08fdSAnirudh Venkataramanan struct ice_pf {
144837f08fdSAnirudh Venkataramanan 	struct pci_dev *pdev;
145940b61afSAnirudh Venkataramanan 	struct msix_entry *msix_entries;
146940b61afSAnirudh Venkataramanan 	struct ice_res_tracker *irq_tracker;
147940b61afSAnirudh Venkataramanan 	struct ice_vsi **vsi;		/* VSIs created by the driver */
148940b61afSAnirudh Venkataramanan 	struct ice_sw *first_sw;	/* first switch created by firmware */
149837f08fdSAnirudh Venkataramanan 	DECLARE_BITMAP(state, __ICE_STATE_NBITS);
150940b61afSAnirudh Venkataramanan 	DECLARE_BITMAP(avail_txqs, ICE_MAX_TXQS);
151940b61afSAnirudh Venkataramanan 	DECLARE_BITMAP(avail_rxqs, ICE_MAX_RXQS);
152940b61afSAnirudh Venkataramanan 	DECLARE_BITMAP(flags, ICE_PF_FLAGS_NBITS);
153940b61afSAnirudh Venkataramanan 	unsigned long serv_tmr_period;
154940b61afSAnirudh Venkataramanan 	unsigned long serv_tmr_prev;
155940b61afSAnirudh Venkataramanan 	struct timer_list serv_tmr;
156940b61afSAnirudh Venkataramanan 	struct work_struct serv_task;
157940b61afSAnirudh Venkataramanan 	struct mutex avail_q_mutex;	/* protects access to avail_[rx|tx]qs */
158940b61afSAnirudh Venkataramanan 	struct mutex sw_mutex;		/* lock for protecting VSI alloc flow */
159837f08fdSAnirudh Venkataramanan 	u32 msg_enable;
160940b61afSAnirudh Venkataramanan 	u32 oicr_idx;		/* Other interrupt cause vector index */
161940b61afSAnirudh Venkataramanan 	u32 num_lan_msix;	/* Total MSIX vectors for base driver */
162940b61afSAnirudh Venkataramanan 	u32 num_avail_msix;	/* remaining MSIX vectors left unclaimed */
163940b61afSAnirudh Venkataramanan 	u16 num_lan_tx;		/* num lan tx queues setup */
164940b61afSAnirudh Venkataramanan 	u16 num_lan_rx;		/* num lan rx queues setup */
165940b61afSAnirudh Venkataramanan 	u16 q_left_tx;		/* remaining num tx queues left unclaimed */
166940b61afSAnirudh Venkataramanan 	u16 q_left_rx;		/* remaining num rx queues left unclaimed */
167940b61afSAnirudh Venkataramanan 	u16 next_vsi;		/* Next free slot in pf->vsi[] - 0-based! */
168940b61afSAnirudh Venkataramanan 	u16 num_alloc_vsi;
169940b61afSAnirudh Venkataramanan 
170837f08fdSAnirudh Venkataramanan 	struct ice_hw hw;
171940b61afSAnirudh Venkataramanan 	char int_name[ICE_INT_NAME_STR_LEN];
172837f08fdSAnirudh Venkataramanan };
173940b61afSAnirudh Venkataramanan 
174*3a858ba3SAnirudh Venkataramanan struct ice_netdev_priv {
175*3a858ba3SAnirudh Venkataramanan 	struct ice_vsi *vsi;
176*3a858ba3SAnirudh Venkataramanan };
177*3a858ba3SAnirudh Venkataramanan 
178940b61afSAnirudh Venkataramanan /**
179940b61afSAnirudh Venkataramanan  * ice_irq_dynamic_ena - Enable default interrupt generation settings
180940b61afSAnirudh Venkataramanan  * @hw: pointer to hw struct
181940b61afSAnirudh Venkataramanan  */
182940b61afSAnirudh Venkataramanan static inline void ice_irq_dynamic_ena(struct ice_hw *hw)
183940b61afSAnirudh Venkataramanan {
184940b61afSAnirudh Venkataramanan 	u32 vector = ((struct ice_pf *)hw->back)->oicr_idx;
185940b61afSAnirudh Venkataramanan 	int itr = ICE_ITR_NONE;
186940b61afSAnirudh Venkataramanan 	u32 val;
187940b61afSAnirudh Venkataramanan 
188940b61afSAnirudh Venkataramanan 	/* clear the PBA here, as this function is meant to clean out all
189940b61afSAnirudh Venkataramanan 	 * previous interrupts and enable the interrupt
190940b61afSAnirudh Venkataramanan 	 */
191940b61afSAnirudh Venkataramanan 	val = GLINT_DYN_CTL_INTENA_M | GLINT_DYN_CTL_CLEARPBA_M |
192940b61afSAnirudh Venkataramanan 	      (itr << GLINT_DYN_CTL_ITR_INDX_S);
193940b61afSAnirudh Venkataramanan 
194940b61afSAnirudh Venkataramanan 	wr32(hw, GLINT_DYN_CTL(vector), val);
195940b61afSAnirudh Venkataramanan }
196837f08fdSAnirudh Venkataramanan #endif /* _ICE_H_ */
197