xref: /openbmc/linux/drivers/net/ethernet/intel/ice/ice.h (revision 940b61af02f497fcd911b9e2d75c6b8cf76b92fd)
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>
14837f08fdSAnirudh Venkataramanan #include <linux/pci.h>
15*940b61afSAnirudh Venkataramanan #include <linux/workqueue.h>
16837f08fdSAnirudh Venkataramanan #include <linux/aer.h>
17*940b61afSAnirudh Venkataramanan #include <linux/interrupt.h>
18*940b61afSAnirudh Venkataramanan #include <linux/timer.h>
197ec59eeaSAnirudh Venkataramanan #include <linux/delay.h>
20837f08fdSAnirudh Venkataramanan #include <linux/bitmap.h>
21*940b61afSAnirudh Venkataramanan #include <linux/if_bridge.h>
22837f08fdSAnirudh Venkataramanan #include "ice_devids.h"
23837f08fdSAnirudh Venkataramanan #include "ice_type.h"
24*940b61afSAnirudh Venkataramanan #include "ice_txrx.h"
259c20346bSAnirudh Venkataramanan #include "ice_switch.h"
26f31e4b6fSAnirudh Venkataramanan #include "ice_common.h"
279c20346bSAnirudh Venkataramanan #include "ice_sched.h"
28837f08fdSAnirudh Venkataramanan 
29837f08fdSAnirudh Venkataramanan #define ICE_BAR0		0
30*940b61afSAnirudh Venkataramanan #define ICE_INT_NAME_STR_LEN	(IFNAMSIZ + 16)
31f31e4b6fSAnirudh Venkataramanan #define ICE_AQ_LEN		64
32*940b61afSAnirudh Venkataramanan #define ICE_MIN_MSIX		2
33*940b61afSAnirudh Venkataramanan #define ICE_MAX_VSI_ALLOC	130
34*940b61afSAnirudh Venkataramanan #define ICE_MAX_TXQS		2048
35*940b61afSAnirudh Venkataramanan #define ICE_MAX_RXQS		2048
36*940b61afSAnirudh Venkataramanan #define ICE_RES_VALID_BIT	0x8000
37*940b61afSAnirudh Venkataramanan #define ICE_RES_MISC_VEC_ID	(ICE_RES_VALID_BIT - 1)
38837f08fdSAnirudh Venkataramanan 
39837f08fdSAnirudh Venkataramanan #define ICE_DFLT_NETIF_M (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK)
40837f08fdSAnirudh Venkataramanan 
41*940b61afSAnirudh Venkataramanan struct ice_res_tracker {
42*940b61afSAnirudh Venkataramanan 	u16 num_entries;
43*940b61afSAnirudh Venkataramanan 	u16 search_hint;
44*940b61afSAnirudh Venkataramanan 	u16 list[1];
45*940b61afSAnirudh Venkataramanan };
46*940b61afSAnirudh Venkataramanan 
47*940b61afSAnirudh Venkataramanan struct ice_sw {
48*940b61afSAnirudh Venkataramanan 	struct ice_pf *pf;
49*940b61afSAnirudh Venkataramanan 	u16 sw_id;		/* switch ID for this switch */
50*940b61afSAnirudh Venkataramanan 	u16 bridge_mode;	/* VEB/VEPA/Port Virtualizer */
51*940b61afSAnirudh Venkataramanan };
52*940b61afSAnirudh Venkataramanan 
53837f08fdSAnirudh Venkataramanan enum ice_state {
54837f08fdSAnirudh Venkataramanan 	__ICE_DOWN,
55*940b61afSAnirudh Venkataramanan 	__ICE_PFR_REQ,			/* set by driver and peers */
56*940b61afSAnirudh Venkataramanan 	__ICE_ADMINQ_EVENT_PENDING,
57*940b61afSAnirudh Venkataramanan 	__ICE_SERVICE_SCHED,
58837f08fdSAnirudh Venkataramanan 	__ICE_STATE_NBITS		/* must be last */
59837f08fdSAnirudh Venkataramanan };
60837f08fdSAnirudh Venkataramanan 
61*940b61afSAnirudh Venkataramanan /* struct that defines a VSI, associated with a dev */
62*940b61afSAnirudh Venkataramanan struct ice_vsi {
63*940b61afSAnirudh Venkataramanan 	struct net_device *netdev;
64*940b61afSAnirudh Venkataramanan 	struct ice_port_info *port_info; /* back pointer to port_info */
65*940b61afSAnirudh Venkataramanan 	u16 vsi_num;			 /* HW (absolute) index of this VSI */
66*940b61afSAnirudh Venkataramanan } ____cacheline_internodealigned_in_smp;
67*940b61afSAnirudh Venkataramanan 
68*940b61afSAnirudh Venkataramanan enum ice_pf_flags {
69*940b61afSAnirudh Venkataramanan 	ICE_FLAG_MSIX_ENA,
70*940b61afSAnirudh Venkataramanan 	ICE_FLAG_FLTR_SYNC,
71*940b61afSAnirudh Venkataramanan 	ICE_FLAG_RSS_ENA,
72*940b61afSAnirudh Venkataramanan 	ICE_PF_FLAGS_NBITS		/* must be last */
73*940b61afSAnirudh Venkataramanan };
74*940b61afSAnirudh Venkataramanan 
75837f08fdSAnirudh Venkataramanan struct ice_pf {
76837f08fdSAnirudh Venkataramanan 	struct pci_dev *pdev;
77*940b61afSAnirudh Venkataramanan 	struct msix_entry *msix_entries;
78*940b61afSAnirudh Venkataramanan 	struct ice_res_tracker *irq_tracker;
79*940b61afSAnirudh Venkataramanan 	struct ice_vsi **vsi;		/* VSIs created by the driver */
80*940b61afSAnirudh Venkataramanan 	struct ice_sw *first_sw;	/* first switch created by firmware */
81837f08fdSAnirudh Venkataramanan 	DECLARE_BITMAP(state, __ICE_STATE_NBITS);
82*940b61afSAnirudh Venkataramanan 	DECLARE_BITMAP(avail_txqs, ICE_MAX_TXQS);
83*940b61afSAnirudh Venkataramanan 	DECLARE_BITMAP(avail_rxqs, ICE_MAX_RXQS);
84*940b61afSAnirudh Venkataramanan 	DECLARE_BITMAP(flags, ICE_PF_FLAGS_NBITS);
85*940b61afSAnirudh Venkataramanan 	unsigned long serv_tmr_period;
86*940b61afSAnirudh Venkataramanan 	unsigned long serv_tmr_prev;
87*940b61afSAnirudh Venkataramanan 	struct timer_list serv_tmr;
88*940b61afSAnirudh Venkataramanan 	struct work_struct serv_task;
89*940b61afSAnirudh Venkataramanan 	struct mutex avail_q_mutex;	/* protects access to avail_[rx|tx]qs */
90*940b61afSAnirudh Venkataramanan 	struct mutex sw_mutex;		/* lock for protecting VSI alloc flow */
91837f08fdSAnirudh Venkataramanan 	u32 msg_enable;
92*940b61afSAnirudh Venkataramanan 	u32 oicr_idx;		/* Other interrupt cause vector index */
93*940b61afSAnirudh Venkataramanan 	u32 num_lan_msix;	/* Total MSIX vectors for base driver */
94*940b61afSAnirudh Venkataramanan 	u32 num_avail_msix;	/* remaining MSIX vectors left unclaimed */
95*940b61afSAnirudh Venkataramanan 	u16 num_lan_tx;		/* num lan tx queues setup */
96*940b61afSAnirudh Venkataramanan 	u16 num_lan_rx;		/* num lan rx queues setup */
97*940b61afSAnirudh Venkataramanan 	u16 q_left_tx;		/* remaining num tx queues left unclaimed */
98*940b61afSAnirudh Venkataramanan 	u16 q_left_rx;		/* remaining num rx queues left unclaimed */
99*940b61afSAnirudh Venkataramanan 	u16 next_vsi;		/* Next free slot in pf->vsi[] - 0-based! */
100*940b61afSAnirudh Venkataramanan 	u16 num_alloc_vsi;
101*940b61afSAnirudh Venkataramanan 
102837f08fdSAnirudh Venkataramanan 	struct ice_hw hw;
103*940b61afSAnirudh Venkataramanan 	char int_name[ICE_INT_NAME_STR_LEN];
104837f08fdSAnirudh Venkataramanan };
105*940b61afSAnirudh Venkataramanan 
106*940b61afSAnirudh Venkataramanan /**
107*940b61afSAnirudh Venkataramanan  * ice_irq_dynamic_ena - Enable default interrupt generation settings
108*940b61afSAnirudh Venkataramanan  * @hw: pointer to hw struct
109*940b61afSAnirudh Venkataramanan  */
110*940b61afSAnirudh Venkataramanan static inline void ice_irq_dynamic_ena(struct ice_hw *hw)
111*940b61afSAnirudh Venkataramanan {
112*940b61afSAnirudh Venkataramanan 	u32 vector = ((struct ice_pf *)hw->back)->oicr_idx;
113*940b61afSAnirudh Venkataramanan 	int itr = ICE_ITR_NONE;
114*940b61afSAnirudh Venkataramanan 	u32 val;
115*940b61afSAnirudh Venkataramanan 
116*940b61afSAnirudh Venkataramanan 	/* clear the PBA here, as this function is meant to clean out all
117*940b61afSAnirudh Venkataramanan 	 * previous interrupts and enable the interrupt
118*940b61afSAnirudh Venkataramanan 	 */
119*940b61afSAnirudh Venkataramanan 	val = GLINT_DYN_CTL_INTENA_M | GLINT_DYN_CTL_CLEARPBA_M |
120*940b61afSAnirudh Venkataramanan 	      (itr << GLINT_DYN_CTL_ITR_INDX_S);
121*940b61afSAnirudh Venkataramanan 
122*940b61afSAnirudh Venkataramanan 	wr32(hw, GLINT_DYN_CTL(vector), val);
123*940b61afSAnirudh Venkataramanan }
124837f08fdSAnirudh Venkataramanan #endif /* _ICE_H_ */
125