]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/axgbe/xgbe-drv.c
MFV r367082:
[FreeBSD/FreeBSD.git] / sys / dev / axgbe / xgbe-drv.c
1 /*
2  * AMD 10Gb Ethernet driver
3  *
4  * Copyright (c) 2014-2016,2020 Advanced Micro Devices, Inc.
5  *
6  * This file is available to you under your choice of the following two
7  * licenses:
8  *
9  * License 1: GPLv2
10  *
11  * This file is free software; you may copy, redistribute and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation, either version 2 of the License, or (at
14  * your option) any later version.
15  *
16  * This file is distributed in the hope that it will be useful, but
17  * WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19  * General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23  *
24  * This file incorporates work covered by the following copyright and
25  * permission notice:
26  *     The Synopsys DWC ETHER XGMAC Software Driver and documentation
27  *     (hereinafter "Software") is an unsupported proprietary work of Synopsys,
28  *     Inc. unless otherwise expressly agreed to in writing between Synopsys
29  *     and you.
30  *
31  *     The Software IS NOT an item of Licensed Software or Licensed Product
32  *     under any End User Software License Agreement or Agreement for Licensed
33  *     Product with Synopsys or any supplement thereto.  Permission is hereby
34  *     granted, free of charge, to any person obtaining a copy of this software
35  *     annotated with this license and the Software, to deal in the Software
36  *     without restriction, including without limitation the rights to use,
37  *     copy, modify, merge, publish, distribute, sublicense, and/or sell copies
38  *     of the Software, and to permit persons to whom the Software is furnished
39  *     to do so, subject to the following conditions:
40  *
41  *     The above copyright notice and this permission notice shall be included
42  *     in all copies or substantial portions of the Software.
43  *
44  *     THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS"
45  *     BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
46  *     TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
47  *     PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS
48  *     BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
49  *     CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
50  *     SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
51  *     INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
52  *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
53  *     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
54  *     THE POSSIBILITY OF SUCH DAMAGE.
55  *
56  *
57  * License 2: Modified BSD
58  *
59  * Redistribution and use in source and binary forms, with or without
60  * modification, are permitted provided that the following conditions are met:
61  *     * Redistributions of source code must retain the above copyright
62  *       notice, this list of conditions and the following disclaimer.
63  *     * Redistributions in binary form must reproduce the above copyright
64  *       notice, this list of conditions and the following disclaimer in the
65  *       documentation and/or other materials provided with the distribution.
66  *     * Neither the name of Advanced Micro Devices, Inc. nor the
67  *       names of its contributors may be used to endorse or promote products
68  *       derived from this software without specific prior written permission.
69  *
70  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
71  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
72  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
73  * ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
74  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
75  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
76  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
77  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
78  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
79  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
80  *
81  * This file incorporates work covered by the following copyright and
82  * permission notice:
83  *     The Synopsys DWC ETHER XGMAC Software Driver and documentation
84  *     (hereinafter "Software") is an unsupported proprietary work of Synopsys,
85  *     Inc. unless otherwise expressly agreed to in writing between Synopsys
86  *     and you.
87  *
88  *     The Software IS NOT an item of Licensed Software or Licensed Product
89  *     under any End User Software License Agreement or Agreement for Licensed
90  *     Product with Synopsys or any supplement thereto.  Permission is hereby
91  *     granted, free of charge, to any person obtaining a copy of this software
92  *     annotated with this license and the Software, to deal in the Software
93  *     without restriction, including without limitation the rights to use,
94  *     copy, modify, merge, publish, distribute, sublicense, and/or sell copies
95  *     of the Software, and to permit persons to whom the Software is furnished
96  *     to do so, subject to the following conditions:
97  *
98  *     The above copyright notice and this permission notice shall be included
99  *     in all copies or substantial portions of the Software.
100  *
101  *     THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS"
102  *     BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
103  *     TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
104  *     PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS
105  *     BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
106  *     CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
107  *     SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
108  *     INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
109  *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
110  *     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
111  *     THE POSSIBILITY OF SUCH DAMAGE.
112  */
113
114 #include <sys/cdefs.h>
115 __FBSDID("$FreeBSD$");
116
117 #include "xgbe.h"
118 #include "xgbe-common.h"
119
120 int
121 xgbe_calc_rx_buf_size(struct ifnet *netdev, unsigned int mtu)
122 {
123         unsigned int rx_buf_size;
124
125         if (mtu > XGMAC_JUMBO_PACKET_MTU)
126                 return (-EINVAL);
127
128         rx_buf_size = mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
129         rx_buf_size = min(max(rx_buf_size, XGBE_RX_MIN_BUF_SIZE), PAGE_SIZE);
130         rx_buf_size = (rx_buf_size + XGBE_RX_BUF_ALIGN - 1) & 
131             ~(XGBE_RX_BUF_ALIGN - 1);
132
133         return (rx_buf_size);
134 }
135
136 void
137 xgbe_get_all_hw_features(struct xgbe_prv_data *pdata)
138 {
139         unsigned int mac_hfr0, mac_hfr1, mac_hfr2;
140         struct xgbe_hw_features *hw_feat = &pdata->hw_feat;
141
142         DBGPR("-->xgbe_get_all_hw_features\n");
143
144         mac_hfr0 = XGMAC_IOREAD(pdata, MAC_HWF0R);
145         mac_hfr1 = XGMAC_IOREAD(pdata, MAC_HWF1R);
146         mac_hfr2 = XGMAC_IOREAD(pdata, MAC_HWF2R);
147
148         memset(hw_feat, 0, sizeof(*hw_feat));
149
150         hw_feat->version = XGMAC_IOREAD(pdata, MAC_VR);
151
152         /* Hardware feature register 0 */
153         hw_feat->gmii   = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, GMIISEL);
154         hw_feat->vlhash = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, VLHASH);
155         hw_feat->sma    = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, SMASEL);
156         hw_feat->rwk    = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, RWKSEL);
157         hw_feat->mgk    = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, MGKSEL);
158         hw_feat->mmc    = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, MMCSEL);
159         hw_feat->aoe    = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, ARPOFFSEL);
160         hw_feat->ts     = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, TSSEL);
161         hw_feat->eee    = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, EEESEL);
162         hw_feat->tx_coe = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, TXCOESEL);
163         hw_feat->rx_coe = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, RXCOESEL);
164         hw_feat->addn_mac = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R,
165                                               ADDMACADRSEL);
166         hw_feat->ts_src = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, TSSTSSEL);
167         hw_feat->sa_vlan_ins = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, SAVLANINS);
168         hw_feat->vxn    = XGMAC_GET_BITS(mac_hfr0, MAC_HWF0R, VXN);
169
170         /* Hardware feature register 1 */
171         hw_feat->rx_fifo_size   = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R,
172                                                 RXFIFOSIZE);
173         hw_feat->tx_fifo_size   = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R,
174                                                 TXFIFOSIZE);
175         hw_feat->adv_ts_hi      = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, ADVTHWORD);
176         hw_feat->dma_width      = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, ADDR64);
177         hw_feat->dcb            = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, DCBEN);
178         hw_feat->sph            = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, SPHEN);
179         hw_feat->tso            = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, TSOEN);
180         hw_feat->dma_debug      = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, DBGMEMA);
181         hw_feat->rss            = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, RSSEN);
182         hw_feat->tc_cnt         = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, NUMTC);
183         hw_feat->hash_table_size = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R,
184                                                   HASHTBLSZ);
185         hw_feat->l3l4_filter_num = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R,
186                                                   L3L4FNUM);
187
188         /* Hardware feature register 2 */
189         hw_feat->rx_q_cnt     = XGMAC_GET_BITS(mac_hfr2, MAC_HWF2R, RXQCNT);
190         hw_feat->tx_q_cnt     = XGMAC_GET_BITS(mac_hfr2, MAC_HWF2R, TXQCNT);
191         hw_feat->rx_ch_cnt    = XGMAC_GET_BITS(mac_hfr2, MAC_HWF2R, RXCHCNT);
192         hw_feat->tx_ch_cnt    = XGMAC_GET_BITS(mac_hfr2, MAC_HWF2R, TXCHCNT);
193         hw_feat->pps_out_num  = XGMAC_GET_BITS(mac_hfr2, MAC_HWF2R, PPSOUTNUM);
194         hw_feat->aux_snap_num = XGMAC_GET_BITS(mac_hfr2, MAC_HWF2R, AUXSNAPNUM);
195
196         /* Translate the Hash Table size into actual number */
197         switch (hw_feat->hash_table_size) {
198         case 0:
199                 break;
200         case 1:
201                 hw_feat->hash_table_size = 64;
202                 break;
203         case 2:
204                 hw_feat->hash_table_size = 128;
205                 break;
206         case 3:
207                 hw_feat->hash_table_size = 256;
208                 break;
209         }
210
211         /* Translate the address width setting into actual number */
212         switch (hw_feat->dma_width) {
213         case 0:
214                 hw_feat->dma_width = 32;
215                 break;
216         case 1:
217                 hw_feat->dma_width = 40;
218                 break;
219         case 2:
220                 hw_feat->dma_width = 48;
221                 break;
222         default:
223                 hw_feat->dma_width = 32;
224         }
225
226         /* The Queue, Channel and TC counts are zero based so increment them
227          * to get the actual number
228          */
229         hw_feat->rx_q_cnt++;
230         hw_feat->tx_q_cnt++;
231         hw_feat->rx_ch_cnt++;
232         hw_feat->tx_ch_cnt++;
233         hw_feat->tc_cnt++;
234
235         /* Translate the fifo sizes into actual numbers */
236         hw_feat->rx_fifo_size = 1 << (hw_feat->rx_fifo_size + 7);
237         hw_feat->tx_fifo_size = 1 << (hw_feat->tx_fifo_size + 7);
238         DBGPR("%s: Tx fifo 0x%x Rx fifo 0x%x\n", __func__,
239             hw_feat->tx_fifo_size, hw_feat->rx_fifo_size);
240
241         DBGPR("Hardware features:\n");
242
243         /* Hardware feature register 0 */
244         DBGPR("  1GbE support              : %s\n",
245             hw_feat->gmii ? "yes" : "no");
246         DBGPR("  VLAN hash filter          : %s\n",
247             hw_feat->vlhash ? "yes" : "no");
248         DBGPR("  MDIO interface            : %s\n",
249             hw_feat->sma ? "yes" : "no");
250         DBGPR("  Wake-up packet support    : %s\n",
251             hw_feat->rwk ? "yes" : "no");
252         DBGPR("  Magic packet support      : %s\n",
253             hw_feat->mgk ? "yes" : "no");
254         DBGPR("  Management counters       : %s\n",
255             hw_feat->mmc ? "yes" : "no");
256         DBGPR("  ARP offload               : %s\n",
257             hw_feat->aoe ? "yes" : "no");
258         DBGPR("  IEEE 1588-2008 Timestamp  : %s\n",
259             hw_feat->ts ? "yes" : "no");
260         DBGPR("  Energy Efficient Ethernet : %s\n",
261             hw_feat->eee ? "yes" : "no");
262         DBGPR("  TX checksum offload       : %s\n",
263             hw_feat->tx_coe ? "yes" : "no");
264         DBGPR("  RX checksum offload       : %s\n",
265             hw_feat->rx_coe ? "yes" : "no");
266         DBGPR("  Additional MAC addresses  : %u\n",
267             hw_feat->addn_mac);
268         DBGPR("  Timestamp source          : %s\n",
269             (hw_feat->ts_src == 1) ? "internal" :
270             (hw_feat->ts_src == 2) ? "external" :
271             (hw_feat->ts_src == 3) ? "internal/external" : "n/a");
272         DBGPR("  SA/VLAN insertion         : %s\n",
273             hw_feat->sa_vlan_ins ? "yes" : "no");
274
275         /* Hardware feature register 1 */
276         DBGPR("  RX fifo size              : %u\n",
277             hw_feat->rx_fifo_size);
278         DBGPR("  TX fifo size              : %u\n",
279             hw_feat->tx_fifo_size);
280         DBGPR("  IEEE 1588 high word       : %s\n",
281             hw_feat->adv_ts_hi ? "yes" : "no");
282         DBGPR("  DMA width                 : %u\n",
283             hw_feat->dma_width);
284         DBGPR("  Data Center Bridging      : %s\n",
285             hw_feat->dcb ? "yes" : "no");
286         DBGPR("  Split header              : %s\n",
287             hw_feat->sph ? "yes" : "no");
288         DBGPR("  TCP Segmentation Offload  : %s\n",
289             hw_feat->tso ? "yes" : "no");
290         DBGPR("  Debug memory interface    : %s\n",
291             hw_feat->dma_debug ? "yes" : "no");
292         DBGPR("  Receive Side Scaling      : %s\n",
293             hw_feat->rss ? "yes" : "no");
294         DBGPR("  Traffic Class count       : %u\n",
295             hw_feat->tc_cnt);
296         DBGPR("  Hash table size           : %u\n",
297             hw_feat->hash_table_size);
298         DBGPR("  L3/L4 Filters             : %u\n",
299             hw_feat->l3l4_filter_num);
300
301         /* Hardware feature register 2 */
302         DBGPR("  RX queue count            : %u\n",
303             hw_feat->rx_q_cnt);
304         DBGPR("  TX queue count            : %u\n",
305             hw_feat->tx_q_cnt);
306         DBGPR("  RX DMA channel count      : %u\n",
307             hw_feat->rx_ch_cnt);
308         DBGPR("  TX DMA channel count      : %u\n",
309             hw_feat->rx_ch_cnt);
310         DBGPR("  PPS outputs               : %u\n",
311             hw_feat->pps_out_num);
312         DBGPR("  Auxiliary snapshot inputs : %u\n",
313             hw_feat->aux_snap_num);
314         
315         DBGPR("<--xgbe_get_all_hw_features\n");
316 }
317
318 void
319 xgbe_init_tx_coalesce(struct xgbe_prv_data *pdata)
320 {
321         struct xgbe_hw_if *hw_if = &pdata->hw_if;
322
323         DBGPR("-->xgbe_init_tx_coalesce\n");
324
325         pdata->tx_usecs = XGMAC_INIT_DMA_TX_USECS;
326         pdata->tx_frames = XGMAC_INIT_DMA_TX_FRAMES;
327
328         hw_if->config_tx_coalesce(pdata);
329
330         DBGPR("<--xgbe_init_tx_coalesce\n");
331 }
332
333 void
334 xgbe_init_rx_coalesce(struct xgbe_prv_data *pdata)
335 {
336         struct xgbe_hw_if *hw_if = &pdata->hw_if;
337
338         DBGPR("-->xgbe_init_rx_coalesce\n");
339
340         pdata->rx_riwt = hw_if->usec_to_riwt(pdata, XGMAC_INIT_DMA_RX_USECS);
341         pdata->rx_usecs = XGMAC_INIT_DMA_RX_USECS;
342         pdata->rx_frames = XGMAC_INIT_DMA_RX_FRAMES;
343
344         hw_if->config_rx_coalesce(pdata);
345
346         DBGPR("<--xgbe_init_rx_coalesce\n");
347 }