xref: /freebsd/sys/dev/ixgbe/ixgbe_dcb.h (revision 1b80ac6fa64eaa575b99521cbd71a3780bf5139b)
1fd75b91dSJack F Vogel /******************************************************************************
27282444bSPedro F. Giffuni   SPDX-License-Identifier: BSD-3-Clause
3fd75b91dSJack F Vogel 
48455e365SKevin Bowling   Copyright (c) 2001-2020, Intel Corporation
5fd75b91dSJack F Vogel   All rights reserved.
6fd75b91dSJack F Vogel 
7fd75b91dSJack F Vogel   Redistribution and use in source and binary forms, with or without
8fd75b91dSJack F Vogel   modification, are permitted provided that the following conditions are met:
9fd75b91dSJack F Vogel 
10fd75b91dSJack F Vogel    1. Redistributions of source code must retain the above copyright notice,
11fd75b91dSJack F Vogel       this list of conditions and the following disclaimer.
12fd75b91dSJack F Vogel 
13fd75b91dSJack F Vogel    2. Redistributions in binary form must reproduce the above copyright
14fd75b91dSJack F Vogel       notice, this list of conditions and the following disclaimer in the
15fd75b91dSJack F Vogel       documentation and/or other materials provided with the distribution.
16fd75b91dSJack F Vogel 
17fd75b91dSJack F Vogel    3. Neither the name of the Intel Corporation nor the names of its
18fd75b91dSJack F Vogel       contributors may be used to endorse or promote products derived from
19fd75b91dSJack F Vogel       this software without specific prior written permission.
20fd75b91dSJack F Vogel 
21fd75b91dSJack F Vogel   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22fd75b91dSJack F Vogel   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23fd75b91dSJack F Vogel   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24fd75b91dSJack F Vogel   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
25fd75b91dSJack F Vogel   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26fd75b91dSJack F Vogel   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27fd75b91dSJack F Vogel   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28fd75b91dSJack F Vogel   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29fd75b91dSJack F Vogel   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30fd75b91dSJack F Vogel   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31fd75b91dSJack F Vogel   POSSIBILITY OF SUCH DAMAGE.
32fd75b91dSJack F Vogel 
33fd75b91dSJack F Vogel ******************************************************************************/
34fd75b91dSJack F Vogel 
35fd75b91dSJack F Vogel #ifndef _IXGBE_DCB_H_
36fd75b91dSJack F Vogel #define _IXGBE_DCB_H_
37fd75b91dSJack F Vogel 
38fd75b91dSJack F Vogel #include "ixgbe_type.h"
39fd75b91dSJack F Vogel 
40fd75b91dSJack F Vogel /* DCB defines */
41fd75b91dSJack F Vogel /* DCB credit calculation defines */
42fd75b91dSJack F Vogel #define IXGBE_DCB_CREDIT_QUANTUM	64
43*1b80ac6fSRadoslaw Tyl #define IXGBE_DCB_MAX_CREDIT_REFILL	511   /* 0x1FF * 64B = 32704B */
44fd75b91dSJack F Vogel #define IXGBE_DCB_MAX_TSO_SIZE		(32 * 1024) /* Max TSO pkt size in DCB*/
45*1b80ac6fSRadoslaw Tyl #define IXGBE_DCB_MAX_CREDIT		4095 /* Maximum credit supported: 256KB * 1024 / 64B */
46fd75b91dSJack F Vogel 
47fd75b91dSJack F Vogel /* 513 for 32KB TSO packet */
48fd75b91dSJack F Vogel #define IXGBE_DCB_MIN_TSO_CREDIT	\
49fd75b91dSJack F Vogel 	((IXGBE_DCB_MAX_TSO_SIZE / IXGBE_DCB_CREDIT_QUANTUM) + 1)
50fd75b91dSJack F Vogel 
51fd75b91dSJack F Vogel /* DCB configuration defines */
52fd75b91dSJack F Vogel #define IXGBE_DCB_MAX_USER_PRIORITY	8
53fd75b91dSJack F Vogel #define IXGBE_DCB_MAX_BW_GROUP		8
54fd75b91dSJack F Vogel #define IXGBE_DCB_BW_PERCENT		100
55fd75b91dSJack F Vogel 
56fd75b91dSJack F Vogel #define IXGBE_DCB_TX_CONFIG		0
57fd75b91dSJack F Vogel #define IXGBE_DCB_RX_CONFIG		1
58fd75b91dSJack F Vogel 
59fd75b91dSJack F Vogel /* DCB capability defines */
60fd75b91dSJack F Vogel #define IXGBE_DCB_PG_SUPPORT	0x00000001
61fd75b91dSJack F Vogel #define IXGBE_DCB_PFC_SUPPORT	0x00000002
62fd75b91dSJack F Vogel #define IXGBE_DCB_BCN_SUPPORT	0x00000004
63fd75b91dSJack F Vogel #define IXGBE_DCB_UP2TC_SUPPORT	0x00000008
64fd75b91dSJack F Vogel #define IXGBE_DCB_GSP_SUPPORT	0x00000010
65fd75b91dSJack F Vogel 
66fd75b91dSJack F Vogel struct ixgbe_dcb_support {
67fd75b91dSJack F Vogel 	u32 capabilities; /* DCB capabilities */
68fd75b91dSJack F Vogel 
69fd75b91dSJack F Vogel 	/* Each bit represents a number of TCs configurable in the hw.
70fd75b91dSJack F Vogel 	 * If 8 traffic classes can be configured, the value is 0x80. */
71fd75b91dSJack F Vogel 	u8 traffic_classes;
72fd75b91dSJack F Vogel 	u8 pfc_traffic_classes;
73fd75b91dSJack F Vogel };
74fd75b91dSJack F Vogel 
75fd75b91dSJack F Vogel enum ixgbe_dcb_tsa {
76fd75b91dSJack F Vogel 	ixgbe_dcb_tsa_ets = 0,
77fd75b91dSJack F Vogel 	ixgbe_dcb_tsa_group_strict_cee,
78fd75b91dSJack F Vogel 	ixgbe_dcb_tsa_strict
79fd75b91dSJack F Vogel };
80fd75b91dSJack F Vogel 
81fd75b91dSJack F Vogel /* Traffic class bandwidth allocation per direction */
82fd75b91dSJack F Vogel struct ixgbe_dcb_tc_path {
83fd75b91dSJack F Vogel 	u8 bwg_id; /* Bandwidth Group (BWG) ID */
84fd75b91dSJack F Vogel 	u8 bwg_percent; /* % of BWG's bandwidth */
85fd75b91dSJack F Vogel 	u8 link_percent; /* % of link bandwidth */
86fd75b91dSJack F Vogel 	u8 up_to_tc_bitmap; /* User Priority to Traffic Class mapping */
87fd75b91dSJack F Vogel 	u16 data_credits_refill; /* Credit refill amount in 64B granularity */
88fd75b91dSJack F Vogel 	u16 data_credits_max; /* Max credits for a configured packet buffer
89fd75b91dSJack F Vogel 			       * in 64B granularity.*/
90fd75b91dSJack F Vogel 	enum ixgbe_dcb_tsa tsa; /* Link or Group Strict Priority */
91fd75b91dSJack F Vogel };
92fd75b91dSJack F Vogel 
93fd75b91dSJack F Vogel enum ixgbe_dcb_pfc {
94fd75b91dSJack F Vogel 	ixgbe_dcb_pfc_disabled = 0,
95fd75b91dSJack F Vogel 	ixgbe_dcb_pfc_enabled,
96fd75b91dSJack F Vogel 	ixgbe_dcb_pfc_enabled_txonly,
97fd75b91dSJack F Vogel 	ixgbe_dcb_pfc_enabled_rxonly
98fd75b91dSJack F Vogel };
99fd75b91dSJack F Vogel 
100fd75b91dSJack F Vogel /* Traffic class configuration */
101fd75b91dSJack F Vogel struct ixgbe_dcb_tc_config {
102fd75b91dSJack F Vogel 	struct ixgbe_dcb_tc_path path[2]; /* One each for Tx/Rx */
103fd75b91dSJack F Vogel 	enum ixgbe_dcb_pfc pfc; /* Class based flow control setting */
104fd75b91dSJack F Vogel 
105fd75b91dSJack F Vogel 	u16 desc_credits_max; /* For Tx Descriptor arbitration */
106fd75b91dSJack F Vogel 	u8 tc; /* Traffic class (TC) */
107fd75b91dSJack F Vogel };
108fd75b91dSJack F Vogel 
109fd75b91dSJack F Vogel enum ixgbe_dcb_pba {
110fd75b91dSJack F Vogel 	/* PBA[0-7] each use 64KB FIFO */
111fd75b91dSJack F Vogel 	ixgbe_dcb_pba_equal = PBA_STRATEGY_EQUAL,
112fd75b91dSJack F Vogel 	/* PBA[0-3] each use 80KB, PBA[4-7] each use 48KB */
113fd75b91dSJack F Vogel 	ixgbe_dcb_pba_80_48 = PBA_STRATEGY_WEIGHTED
114fd75b91dSJack F Vogel };
115fd75b91dSJack F Vogel 
116fd75b91dSJack F Vogel struct ixgbe_dcb_num_tcs {
117fd75b91dSJack F Vogel 	u8 pg_tcs;
118fd75b91dSJack F Vogel 	u8 pfc_tcs;
119fd75b91dSJack F Vogel };
120fd75b91dSJack F Vogel 
121fd75b91dSJack F Vogel struct ixgbe_dcb_config {
122fd75b91dSJack F Vogel 	struct ixgbe_dcb_tc_config tc_config[IXGBE_DCB_MAX_TRAFFIC_CLASS];
123fd75b91dSJack F Vogel 	struct ixgbe_dcb_support support;
124fd75b91dSJack F Vogel 	struct ixgbe_dcb_num_tcs num_tcs;
125fd75b91dSJack F Vogel 	u8 bw_percentage[2][IXGBE_DCB_MAX_BW_GROUP]; /* One each for Tx/Rx */
126fd75b91dSJack F Vogel 	bool pfc_mode_enable;
127fd75b91dSJack F Vogel 	bool round_robin_enable;
128fd75b91dSJack F Vogel 
129fd75b91dSJack F Vogel 	enum ixgbe_dcb_pba rx_pba_cfg;
130fd75b91dSJack F Vogel 
131fd75b91dSJack F Vogel 	u32 dcb_cfg_version; /* Not used...OS-specific? */
132fd75b91dSJack F Vogel 	u32 link_speed; /* For bandwidth allocation validation purpose */
133fd75b91dSJack F Vogel 	bool vt_mode;
134fd75b91dSJack F Vogel };
135fd75b91dSJack F Vogel 
136fd75b91dSJack F Vogel /* DCB driver APIs */
137fd75b91dSJack F Vogel 
138fd75b91dSJack F Vogel /* DCB rule checking */
139fd75b91dSJack F Vogel s32 ixgbe_dcb_check_config_cee(struct ixgbe_dcb_config *);
140fd75b91dSJack F Vogel 
141fd75b91dSJack F Vogel /* DCB credits calculation */
142fd75b91dSJack F Vogel s32 ixgbe_dcb_calculate_tc_credits(u8 *, u16 *, u16 *, int);
143fd75b91dSJack F Vogel s32 ixgbe_dcb_calculate_tc_credits_cee(struct ixgbe_hw *,
144fd75b91dSJack F Vogel 				       struct ixgbe_dcb_config *, u32, u8);
145fd75b91dSJack F Vogel 
146fd75b91dSJack F Vogel /* DCB PFC */
147fd75b91dSJack F Vogel s32 ixgbe_dcb_config_pfc(struct ixgbe_hw *, u8, u8 *);
148fd75b91dSJack F Vogel s32 ixgbe_dcb_config_pfc_cee(struct ixgbe_hw *, struct ixgbe_dcb_config *);
149fd75b91dSJack F Vogel 
150fd75b91dSJack F Vogel /* DCB stats */
151fd75b91dSJack F Vogel s32 ixgbe_dcb_config_tc_stats(struct ixgbe_hw *);
152fd75b91dSJack F Vogel s32 ixgbe_dcb_get_tc_stats(struct ixgbe_hw *, struct ixgbe_hw_stats *, u8);
153fd75b91dSJack F Vogel s32 ixgbe_dcb_get_pfc_stats(struct ixgbe_hw *, struct ixgbe_hw_stats *, u8);
154fd75b91dSJack F Vogel 
155fd75b91dSJack F Vogel /* DCB config arbiters */
156fd75b91dSJack F Vogel s32 ixgbe_dcb_config_tx_desc_arbiter_cee(struct ixgbe_hw *,
157fd75b91dSJack F Vogel 					 struct ixgbe_dcb_config *);
158fd75b91dSJack F Vogel s32 ixgbe_dcb_config_tx_data_arbiter_cee(struct ixgbe_hw *,
159fd75b91dSJack F Vogel 					 struct ixgbe_dcb_config *);
160fd75b91dSJack F Vogel s32 ixgbe_dcb_config_rx_arbiter_cee(struct ixgbe_hw *,
161fd75b91dSJack F Vogel 				    struct ixgbe_dcb_config *);
162fd75b91dSJack F Vogel 
163fd75b91dSJack F Vogel /* DCB unpack routines */
164fd75b91dSJack F Vogel void ixgbe_dcb_unpack_pfc_cee(struct ixgbe_dcb_config *, u8 *, u8 *);
165fd75b91dSJack F Vogel void ixgbe_dcb_unpack_refill_cee(struct ixgbe_dcb_config *, int, u16 *);
166fd75b91dSJack F Vogel void ixgbe_dcb_unpack_max_cee(struct ixgbe_dcb_config *, u16 *);
167fd75b91dSJack F Vogel void ixgbe_dcb_unpack_bwgid_cee(struct ixgbe_dcb_config *, int, u8 *);
168fd75b91dSJack F Vogel void ixgbe_dcb_unpack_tsa_cee(struct ixgbe_dcb_config *, int, u8 *);
169fd75b91dSJack F Vogel void ixgbe_dcb_unpack_map_cee(struct ixgbe_dcb_config *, int, u8 *);
170fd75b91dSJack F Vogel u8 ixgbe_dcb_get_tc_from_up(struct ixgbe_dcb_config *, int, u8);
171fd75b91dSJack F Vogel 
172fd75b91dSJack F Vogel /* DCB initialization */
173fd75b91dSJack F Vogel s32 ixgbe_dcb_hw_config(struct ixgbe_hw *, u16 *, u16 *, u8 *, u8 *, u8 *);
174fd75b91dSJack F Vogel s32 ixgbe_dcb_hw_config_cee(struct ixgbe_hw *, struct ixgbe_dcb_config *);
175fd75b91dSJack F Vogel #endif /* _IXGBE_DCB_H_ */
176