]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/mgb/if_mgb.h
Add support for Fintek F81803 SuperIO chip
[FreeBSD/FreeBSD.git] / sys / dev / mgb / if_mgb.h
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2019 The FreeBSD Foundation, Inc.
5  *
6  * This driver was written by Gerald ND Aryeetey <gndaryee@uwaterloo.ca>
7  * under sponsorship from the FreeBSD Foundation.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24  * OR SERVICES; LOSS OF USE DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28  * SUCH DAMAGE.
29  *
30  * $FreeBSD$
31  */
32 #ifndef _IF_MGB_H_
33 #define _IF_MGB_H_
34
35 #define MGB_MICROCHIP_VENDOR_ID         0x1055
36 #define MGB_LAN7430_DEVICE_ID           0x7430
37 #define MGB_LAN7431_DEVICE_ID           0x7431
38
39 #define MGB_TIMEOUT                     (500)
40
41 /** Control/Status Registers **/
42 #define MGB_BAR                         0 /* PCI Base Address */
43
44 /** Reset **/
45 #define MGB_HW_CFG                      0x10 /** H/W Configuration Register **/
46 #define MGB_LITE_RESET                  0x2
47
48 /** MAC **/
49 #define MGB_MAC_CR                      0x0100 /** MAC Crontrol Register **/
50 #define MGB_MAC_ADD_ENBL                0x1000 /* Automatic Duplex Detection */
51 #define MGB_MAC_ASD_ENBL                0x0800 /* Automatic Speed Detection */
52
53 #define MGB_MAC_ADDR_BASE_L             0x11C /** MAC address lower 4 bytes (read) register **/
54 #define MGB_MAC_ADDR_BASE_H             0x118 /** MAC address upper 2 bytes (read) register **/
55
56 #define MGB_MAC_TX                      0x0104
57 #define MGB_MAC_RX                      0x0108
58 #define MGB_MAC_ENBL                    (1 << 0)
59 #define MGB_MAC_DSBL                    (1 << 1)
60
61 /** MAC Statistics **/
62 #define MGB_MAC_STAT_RX_FCS_ERR_CNT     0x1200
63 #define MGB_MAC_STAT_RX_ALIGN_ERR_CNT   0x1204
64 #define MGB_MAC_STAT_RX_FRAG_ERR_CNT    0x1208
65 #define MGB_MAC_STAT_RX_JABBER_ERR_CNT  0x120C
66 #define MGB_MAC_STAT_RX_UNDER_ERR_CNT   0x1210
67 #define MGB_MAC_STAT_RX_OVER_ERR_CNT    0x1214
68 #define MGB_MAC_STAT_RX_DROPPED_CNT     0x1218
69 #define MGB_MAC_STAT_RX_BROADCAST_CNT1  0x1220
70 #define MGB_MAC_STAT_RX_BROADCAST_CNT   0x122C
71 #define MGB_MAC_STAT_RX_FRAME_CNT       0x1254
72 #define MGB_MAC_STAT_RX_DROPPED_CNT     0x1218
73 #define MGB_MAC_STAT_RX_BROADCAST_CNT1  0x1220
74 #define MGB_MAC_STAT_RX_BROADCAST_CNT   0x122C
75 #define MGB_MAC_STAT_RX_FRAME_CNT       0x1254
76 /* etc. */
77
78 /** Receive Filtering Engine **/
79 #define MGB_RFE_CTL                     0x508
80 #define MGB_RFE_ALLOW_BROADCAST         (1 << 10)
81 #define MGB_RFE_ALLOW_MULTICAST         (1 << 9)
82 #define MGB_RFE_ALLOW_UNICAST           (1 << 8)
83 #define MGB_RFE_ALLOW_PERFECT_FILTER    (1 << 1)
84
85 /** PHY Reset (via power management control) **/
86 #define MGB_PMT_CTL                     0x14 /** Power Management Control Register **/
87 #define MGB_PHY_RESET                   0x10
88 #define MGB_PHY_READY                   0x80
89
90 /** FIFO Controller **/
91 #define MGB_FCT_TX_CTL                  0xC4
92 #define MGB_FCT_RX_CTL                  0xAC
93 #define MGB_FCT_ENBL(_channel)          (1 << (28 + (_channel)))
94 #define MGB_FCT_DSBL(_channel)          (1 << (24 + (_channel)))
95 #define MGB_FCT_RESET(_channel)         (1 << (20 + (_channel)))
96
97 /** DMA Controller **/
98 #define MGB_DMAC_CMD                    0xC0C
99 #define MGB_DMAC_RESET                  (1 << 31)
100 #define MGB_DMAC_TX_START               16
101 #define MGB_DMAC_RX_START               0
102 #define MGB_DMAC_CMD_VAL(s, o, ch)      (1 << ((s) + (o) + (ch)))
103 #define MGB_DMAC_CMD_RESET(_s, _ch)     MGB_DMAC_CMD_VAL(_s, 8, _ch)
104 #define MGB_DMAC_CMD_START(_s, _ch)     MGB_DMAC_CMD_VAL(_s, 4, _ch)
105 #define MGB_DMAC_CMD_STOP( _s, _ch)     MGB_DMAC_CMD_VAL(_s, 0, _ch)
106 #define MGB_DMAC_STATE(_start, _stop)   \
107         (((_start) ? 2 : 0) | ((_stop) ? 1 : 0))
108 #define MGB_DMAC_STATE_INITIAL          MGB_DMAC_STATE(0, 0)
109 #define MGB_DMAC_STATE_STARTED          MGB_DMAC_STATE(1, 0)
110 #define MGB_DMAC_STATE_STOP_PENDING     MGB_DMAC_STATE(1, 1)
111 #define MGB_DMAC_STATE_STOPPED          MGB_DMAC_STATE(0, 1)
112 #define MGB_DMAC_CMD_STATE(sc, _s, _ch)                         \
113         (MGB_DMAC_STATE(                                        \
114             CSR_READ_REG(sc, MGB_DMAC_CMD) & MGB_DMAC_CMD_START(_s, _ch),       \
115             CSR_READ_REG(sc, MGB_DMAC_CMD) & MGB_DMAC_CMD_STOP(_s, _ch)))
116 #define MGB_DMAC_STATE_IS_INITIAL(sc, _s, _ch)                  \
117         (MGB_DMAC_CMD_STATE(sc, _s, _ch) == MGB_DMAC_STATE_INITIAL)
118
119 #define MGB_DMAC_INTR_STS               0xC10
120 #define MGB_DMAC_INTR_ENBL_SET          0xC14
121 #define MGB_DMAC_INTR_ENBL_CLR          0xC18
122 #define MGB_DMAC_TX_INTR_ENBL(_ch)      (1 << (_ch))
123 #define MGB_DMAC_RX_INTR_ENBL(_ch)      (1 << (16 + (_ch)))
124
125 /** DMA Rings **/
126 /**
127  * Page size is 256 bytes
128  *
129  * Ring size, however, these could be tunable (for RX & TX)
130  * to be a multiple of 4 (max is 65532)
131  *
132  **/
133 /* In linux driver these numbers are 50 and 65 for tx and rx .... */
134 #define MGB_DMA_RING_SIZE               16 /* in programming guide, this number is 100 */
135 #define MGB_DMA_MAXSEGS                 32
136 #define MGB_DMA_REG(reg, _channel)      ((reg) | ((_channel) << 6))
137 #define MGB_DMA_RING_LIST_SIZE          \
138         (sizeof(struct mgb_ring_desc) * MGB_DMA_RING_SIZE)
139 #define MGB_DMA_RING_INFO_SIZE          \
140         (sizeof(uint32_t) + MGB_DMA_RING_LIST_SIZE)
141
142 #define MGB_DMA_TX_CONFIG0(_channel)    MGB_DMA_REG(0x0D40, _channel)
143 #define MGB_DMA_TX_CONFIG1(_channel)    MGB_DMA_REG(0x0D44, _channel)
144 #define MGB_DMA_TX_BASE_H(_channel)     MGB_DMA_REG(0x0D48, _channel)
145 #define MGB_DMA_TX_BASE_L(_channel)     MGB_DMA_REG(0x0D4C, _channel)
146 #define MGB_DMA_TX_HEAD_WB_H(_channel)  MGB_DMA_REG(0x0D50, _channel) /* head Writeback */
147 #define MGB_DMA_TX_HEAD_WB_L(_channel)  MGB_DMA_REG(0x0D54, _channel)
148 #define MGB_DMA_TX_HEAD(_channel)       MGB_DMA_REG(0x0D58, _channel)
149 #define MGB_DMA_TX_TAIL(_channel)       MGB_DMA_REG(0x0D5C, _channel)
150
151 #define MGB_DMA_RX_CONFIG0(_channel)    MGB_DMA_REG(0x0C40, _channel)
152 #define MGB_DMA_RX_CONFIG1(_channel)    MGB_DMA_REG(0x0C44, _channel)
153 #define MGB_DMA_RX_BASE_H(_channel)     MGB_DMA_REG(0x0C48, _channel)
154 #define MGB_DMA_RX_BASE_L(_channel)     MGB_DMA_REG(0x0C4C, _channel)
155 #define MGB_DMA_RX_HEAD_WB_H(_channel)  MGB_DMA_REG(0x0C50, _channel) /* head Writeback */
156 #define MGB_DMA_RX_HEAD_WB_L(_channel)  MGB_DMA_REG(0x0C54, _channel)
157 #define MGB_DMA_RX_HEAD(_channel)       MGB_DMA_REG(0x0C58, _channel)
158 #define MGB_DMA_RX_TAIL(_channel)       MGB_DMA_REG(0x0C5C, _channel)
159
160 #define MGB_DMA_RING_LEN_MASK           0xFFFF
161 #define MGB_DMA_IOC_ENBL                0x10000000
162 #define MGB_DMA_HEAD_WB_LS_ENBL         0x20000000
163 #define MGB_DMA_HEAD_WB_ENBL            (1 << 5)
164 #define MGB_DMA_RING_PAD_MASK           0x03000000
165 #define MGB_DMA_RING_PAD_0              0x00000000
166 #define MGB_DMA_RING_PAD_2              0x02000000
167
168 #define MGB_DESC_CTL_OWN                (1 << 15)
169 #define MGB_DESC_CTL_FCS                (1 << 17)
170 #define MGB_DESC_CTL_IOC                (1 << 26)
171 #define MGB_TX_DESC_CTL_LS              (1 << 28)
172 #define MGB_TX_DESC_CTL_FS              (1 << 29)
173 #define MGB_RX_DESC_CTL_LS              (1 << 30)
174 #define MGB_RX_DESC_CTL_FS              (1 << 31)
175 #define MGB_DESC_CTL_BUFLEN_MASK        (0x0000FFFF)
176 #define MGB_DESC_STS_BUFLEN_MASK        (0x00003FFF)
177 #define MGB_DESC_FRAME_LEN_MASK         (0x3FFF0000)
178 #define MGB_DESC_GET_FRAME_LEN(_desc)   \
179         (((_desc)->ctl & MGB_DESC_FRAME_LEN_MASK) >> 16)
180
181 #define MGB_NEXT_RING_IDX(_idx)         (((_idx) == MGB_DMA_RING_SIZE - 1) ? 0 : ((_idx) + 1))
182 #define MGB_PREV_RING_IDX(_idx)         (((_idx) == 0) ? (MGB_DMA_RING_SIZE - 1) : ((_idx) - 1))
183 #define MGB_RING_SPACE(_sc)             \
184         ((((_sc)->tx_ring_data.last_head - (_sc)->tx_ring_data.last_tail - 1) \
185          + MGB_DMA_RING_SIZE ) % MGB_DMA_RING_SIZE )
186
187 /** PHY **/
188 #define MGB_MII_ACCESS                  0x120
189 #define MGB_MII_DATA                    0x124
190 #define MGB_MII_PHY_ADDR_MASK           0x1F
191 #define MGB_MII_PHY_ADDR_SHIFT          11
192 #define MGB_MII_REG_ADDR_MASK           0x1F
193 #define MGB_MII_REG_ADDR_SHIFT          6
194 #define MGB_MII_READ                    0x0
195 #define MGB_MII_WRITE                   0x2
196 #define MGB_MII_BUSY                    0x1
197
198 /** Interrupt registers **/
199 #define MGB_INTR_STS                    0x780
200 #define MGB_INTR_SET                    0x784 /* This triggers a particular interrupt */
201 #define MGB_INTR_ENBL_SET               0x788
202 #define MGB_INTR_STS_ANY                (0x1)
203 #define MGB_INTR_STS_RX(_channel)       (1 << (24 + (_channel)))
204 #define MGB_INTR_STS_RX_ANY             (0xF << 24)
205 #define MGB_INTR_STS_TX(_channel)       (1 << (16 + (_channel)))
206 #define MGB_INTR_STS_TX_ANY             (0xF << 16)
207 #define MGB_INTR_STS_TEST               (1 << 9)
208 #define MGB_INTR_ENBL_CLR               0x78C
209
210 #define MGB_INTR_VEC_ENBL_SET           0x794
211 #define MGB_INTR_VEC_ENBL_CLR           0x798
212 #define MGB_INTR_VEC_ENBL_AUTO_CLR      0x79C
213 #define MGB_INTR_VEC_RX_MAP             0x7A0
214 #define MGB_INTR_VEC_TX_MAP             0x7A4
215 #define MGB_INTR_VEC_OTHER_MAP          0x7A8
216 #define MGB_INTR_VEC_MAP(_vsts, _ch)    ((_vsts) << ((_ch) << 2))
217 #define MGB_INTR_VEC_STS(_v)            (1 << (_v))
218 #define MGB_INTR_RX_VEC_STS(_qid)       MGB_INTR_VEC_STS((_qid) + 1)
219
220 #define MGB_STS_OK                      ( 0 )
221 #define MGB_STS_TIMEOUT                 (-1 )
222
223 #define CSR_READ_BYTE(sc, reg)          \
224         bus_read_1((sc)->regs, reg)
225
226 #define CSR_WRITE_BYTE(sc, reg, val)    \
227         bus_write_1((sc)->regs, reg, val)
228
229 #define CSR_UPDATE_BYTE(sc, reg, val)   \
230         CSR_WRITE_BYTE(sc, reg, CSR_READ_BYTE(sc, reg) | (val))
231
232 #define CSR_READ_REG(sc, reg)           \
233         bus_read_4((sc)->regs, reg)
234
235 #define CSR_WRITE_REG(sc, reg, val)     \
236         bus_write_4((sc)->regs, reg, val)
237
238 #define CSR_CLEAR_REG(sc, reg, bits)    \
239         CSR_WRITE_REG(sc, reg, CSR_READ_REG(sc, reg) & ~(bits))
240
241 #define CSR_UPDATE_REG(sc, reg, val)    \
242         CSR_WRITE_REG(sc, reg, CSR_READ_REG(sc, reg) | (val))
243
244 #define CSR_READ_2_BYTES(sc, reg)       \
245         bus_read_2((sc)->regs, reg)
246
247 #define CSR_READ_REG_BYTES(sc, reg, dest, cnt)  \
248         bus_read_region_1((sc)->regs, reg, dest, cnt)
249
250 #define CSR_TRANSLATE_ADDR_LOW32(addr)          ((uint64_t) (addr) & 0xFFFFFFFF)
251 #define CSR_TRANSLATE_ADDR_HIGH32(addr)         ((uint64_t) (addr) >> 32)
252
253 struct mgb_irq {
254         struct resource                 *res;
255         void                            *handler;
256 };
257
258 enum mgb_dmac_cmd { DMAC_RESET, DMAC_START, DMAC_STOP };
259 enum mgb_fct_cmd { FCT_RESET, FCT_ENABLE, FCT_DISABLE };
260
261 struct mgb_ring_desc_addr {
262         uint32_t                                low;
263         uint32_t                                high;
264 } __packed;
265
266 /* TODO: With descriptor bit information
267  * this could be done without masks etc.
268  * (using bitwise structs like vmx,
269  * would have to separate rx/tx ring desc
270  * definitions)
271  */
272 struct mgb_ring_desc {
273         uint32_t                                ctl; /* data0 */
274         struct mgb_ring_desc_addr               addr; /* data(1|2) */
275         uint32_t                                sts; /* data3 */
276 } __packed;
277
278 #if 0
279 struct mgb_ring_info {
280         uint32_t                                head_wb;
281         struct mgb_ring_desc                    *ring;
282 }
283 #endif
284 #define MGB_HEAD_WB_PTR(_ring_info_ptr)         \
285         ((uint32_t *)(_ring_info_ptr))
286
287 #define MGB_RING_PTR(_ring_info_ptr)            \
288         ((struct mgb_ring_desc *)(MGB_HEAD_WB_PTR(_ring_info_ptr) + 1))
289
290 struct mgb_ring_data {
291         uint32_t                        *head_wb;
292         struct mgb_ring_desc            *ring;
293
294         bus_addr_t                       head_wb_bus_addr;
295         bus_addr_t                       ring_bus_addr;
296
297         uint32_t                         last_head;
298         uint32_t                         last_tail;
299 };
300
301 struct mgb_softc {
302         if_ctx_t                         ctx;
303         device_t                         dev;
304
305         struct resource                 *regs;
306
307         struct resource                 *pba;
308         struct if_irq                    admin_irq;
309         struct if_irq                    rx_irq;
310
311         bool                             isr_test_flag;
312
313         device_t                         miibus;
314         int                              link_state;
315         int                              baudrate;
316
317         int                              if_flags;
318         int                              ethaddr;
319         int                              flags;
320
321         struct mtx                       mtx;
322         struct callout                   watchdog;
323         int                              timer;
324
325         bus_dma_tag_t                    dma_parent_tag;
326         struct mgb_ring_data             rx_ring_data;
327         struct mgb_ring_data             tx_ring_data;
328
329 };
330
331 #endif /* _IF_MGB_H_ */