1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
|
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
/*
* rtase is the Linux device driver released for Realtek Automotive Switch
* controllers with PCI-Express interface.
*
* Copyright(c) 2024 Realtek Semiconductor Corp.
*/
#ifndef RTASE_H
#define RTASE_H
#define RTASE_HW_VER_MASK 0x7C800000
#define RTASE_HW_VER_906X_7XA 0x00800000
#define RTASE_HW_VER_906X_7XC 0x04000000
#define RTASE_HW_VER_907XD_V1 0x04800000
#define RTASE_RX_DMA_BURST_256 4
#define RTASE_TX_DMA_BURST_UNLIMITED 7
#define RTASE_RX_BUF_SIZE (PAGE_SIZE - \
SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))
#define RTASE_MAX_JUMBO_SIZE (RTASE_RX_BUF_SIZE - VLAN_ETH_HLEN - ETH_FCS_LEN)
/* 3 means InterFrameGap = the shortest one */
#define RTASE_INTERFRAMEGAP 0x03
#define RTASE_REGS_SIZE 256
#define RTASE_PCI_REGS_SIZE 0x100
#define RTASE_MULTICAST_FILTER_MASK GENMASK(30, 26)
#define RTASE_VLAN_FILTER_ENTRY_NUM 32
#define RTASE_NUM_TX_QUEUE 8
#define RTASE_NUM_RX_QUEUE 4
#define RTASE_TXQ_CTRL 1
#define RTASE_FUNC_TXQ_NUM 1
#define RTASE_FUNC_RXQ_NUM 1
#define RTASE_INTERRUPT_NUM 1
#define RTASE_MITI_TIME_COUNT_MASK GENMASK(3, 0)
#define RTASE_MITI_TIME_UNIT_MASK GENMASK(7, 4)
#define RTASE_MITI_DEFAULT_TIME 128
#define RTASE_MITI_MAX_TIME 491520
#define RTASE_MITI_PKT_NUM_COUNT_MASK GENMASK(11, 8)
#define RTASE_MITI_PKT_NUM_UNIT_MASK GENMASK(13, 12)
#define RTASE_MITI_DEFAULT_PKT_NUM 64
#define RTASE_MITI_MAX_PKT_NUM_IDX 3
#define RTASE_MITI_MAX_PKT_NUM_UNIT 16
#define RTASE_MITI_MAX_PKT_NUM 240
#define RTASE_MITI_COUNT_BIT_NUM 4
#define RTASE_NUM_MSIX 4
#define RTASE_DWORD_MOD 16
/*****************************************************************************/
enum rtase_registers {
RTASE_MAC0 = 0x0000,
RTASE_MAC4 = 0x0004,
RTASE_MAR0 = 0x0008,
RTASE_MAR1 = 0x000C,
RTASE_DTCCR0 = 0x0010,
RTASE_DTCCR4 = 0x0014,
#define RTASE_COUNTER_RESET BIT(0)
#define RTASE_COUNTER_DUMP BIT(3)
RTASE_FCR = 0x0018,
#define RTASE_FCR_RXQ_MASK GENMASK(5, 4)
RTASE_LBK_CTRL = 0x001A,
#define RTASE_LBK_ATLD BIT(1)
#define RTASE_LBK_CLR BIT(0)
RTASE_TX_DESC_ADDR0 = 0x0020,
RTASE_TX_DESC_ADDR4 = 0x0024,
RTASE_TX_DESC_COMMAND = 0x0028,
#define RTASE_TX_DESC_CMD_CS BIT(15)
#define RTASE_TX_DESC_CMD_WE BIT(14)
RTASE_BOOT_CTL = 0x6004,
RTASE_CLKSW_SET = 0x6018,
RTASE_CHIP_CMD = 0x0037,
#define RTASE_STOP_REQ BIT(7)
#define RTASE_STOP_REQ_DONE BIT(6)
#define RTASE_RE BIT(3)
#define RTASE_TE BIT(2)
RTASE_IMR0 = 0x0038,
RTASE_ISR0 = 0x003C,
#define RTASE_TOK7 BIT(30)
#define RTASE_TOK6 BIT(28)
#define RTASE_TOK5 BIT(26)
#define RTASE_TOK4 BIT(24)
#define RTASE_FOVW BIT(6)
#define RTASE_RDU BIT(4)
#define RTASE_TOK BIT(2)
#define RTASE_ROK BIT(0)
RTASE_IMR1 = 0x0800,
RTASE_ISR1 = 0x0802,
#define RTASE_Q_TOK BIT(4)
#define RTASE_Q_RDU BIT(1)
#define RTASE_Q_ROK BIT(0)
RTASE_EPHY_ISR = 0x6014,
RTASE_EPHY_IMR = 0x6016,
RTASE_TX_CONFIG_0 = 0x0040,
#define RTASE_TX_INTER_FRAME_GAP_MASK GENMASK(25, 24)
/* DMA burst value (0-7) is shift this many bits */
#define RTASE_TX_DMA_MASK GENMASK(10, 8)
RTASE_RX_CONFIG_0 = 0x0044,
#define RTASE_RX_SINGLE_FETCH BIT(14)
#define RTASE_RX_SINGLE_TAG BIT(13)
#define RTASE_RX_MX_DMA_MASK GENMASK(10, 8)
#define RTASE_ACPT_FLOW BIT(7)
#define RTASE_ACCEPT_ERR BIT(5)
#define RTASE_ACCEPT_RUNT BIT(4)
#define RTASE_ACCEPT_BROADCAST BIT(3)
#define RTASE_ACCEPT_MULTICAST BIT(2)
#define RTASE_ACCEPT_MYPHYS BIT(1)
#define RTASE_ACCEPT_ALLPHYS BIT(0)
#define RTASE_ACCEPT_MASK (RTASE_ACPT_FLOW | RTASE_ACCEPT_ERR | \
RTASE_ACCEPT_RUNT | RTASE_ACCEPT_BROADCAST | \
RTASE_ACCEPT_MULTICAST | RTASE_ACCEPT_MYPHYS | \
RTASE_ACCEPT_ALLPHYS)
RTASE_RX_CONFIG_1 = 0x0046,
#define RTASE_RX_MAX_FETCH_DESC_MASK GENMASK(15, 11)
#define RTASE_RX_NEW_DESC_FORMAT_EN BIT(8)
#define RTASE_OUTER_VLAN_DETAG_EN BIT(7)
#define RTASE_INNER_VLAN_DETAG_EN BIT(6)
#define RTASE_PCIE_NEW_FLOW BIT(2)
#define RTASE_PCIE_RELOAD_EN BIT(0)
RTASE_EEM = 0x0050,
#define RTASE_EEM_UNLOCK 0xC0
RTASE_TDFNR = 0x0057,
RTASE_TPPOLL = 0x0090,
RTASE_PDR = 0x00B0,
RTASE_FIFOR = 0x00D3,
#define RTASE_TX_FIFO_EMPTY BIT(5)
#define RTASE_RX_FIFO_EMPTY BIT(4)
RTASE_RMS = 0x00DA,
RTASE_CPLUS_CMD = 0x00E0,
#define RTASE_FORCE_RXFLOW_EN BIT(11)
#define RTASE_FORCE_TXFLOW_EN BIT(10)
#define RTASE_RX_CHKSUM BIT(5)
RTASE_Q0_RX_DESC_ADDR0 = 0x00E4,
RTASE_Q0_RX_DESC_ADDR4 = 0x00E8,
RTASE_Q1_RX_DESC_ADDR0 = 0x4000,
RTASE_Q1_RX_DESC_ADDR4 = 0x4004,
RTASE_MTPS = 0x00EC,
#define RTASE_TAG_NUM_SEL_MASK GENMASK(10, 8)
RTASE_MISC = 0x00F2,
#define RTASE_RX_DV_GATE_EN BIT(3)
RTASE_TFUN_CTRL = 0x0400,
#define RTASE_TX_NEW_DESC_FORMAT_EN BIT(0)
RTASE_TX_CONFIG_1 = 0x203E,
#define RTASE_TC_MODE_MASK GENMASK(11, 10)
RTASE_TOKSEL = 0x2046,
RTASE_RFIFONFULL = 0x4406,
RTASE_INT_MITI_TX = 0x0A00,
RTASE_INT_MITI_RX = 0x0A80,
RTASE_VLAN_ENTRY_0 = 0xAC80,
};
enum rtase_desc_status_bit {
RTASE_DESC_OWN = BIT(31), /* Descriptor is owned by NIC */
RTASE_RING_END = BIT(30), /* End of descriptor ring */
};
enum rtase_sw_flag_content {
RTASE_SWF_MSI_ENABLED = BIT(1),
RTASE_SWF_MSIX_ENABLED = BIT(2),
};
#define RSVD_MASK 0x3FFFC000
struct rtase_tx_desc {
__le32 opts1;
__le32 opts2;
__le64 addr;
__le32 opts3;
__le32 reserved1;
__le32 reserved2;
__le32 reserved3;
} __packed;
/*------ offset 0 of tx descriptor ------*/
#define RTASE_TX_FIRST_FRAG BIT(29) /* Tx First segment of a packet */
#define RTASE_TX_LAST_FRAG BIT(28) /* Tx Final segment of a packet */
#define RTASE_GIANT_SEND_V4 BIT(26) /* TCP Giant Send Offload V4 (GSOv4) */
#define RTASE_GIANT_SEND_V6 BIT(25) /* TCP Giant Send Offload V6 (GSOv6) */
#define RTASE_TX_VLAN_TAG BIT(17) /* Add VLAN tag */
/*------ offset 4 of tx descriptor ------*/
#define RTASE_TX_UDPCS_C BIT(31) /* Calculate UDP/IP checksum */
#define RTASE_TX_TCPCS_C BIT(30) /* Calculate TCP/IP checksum */
#define RTASE_TX_IPCS_C BIT(29) /* Calculate IP checksum */
#define RTASE_TX_IPV6F_C BIT(28) /* Indicate it is an IPv6 packet */
union rtase_rx_desc {
struct {
__le64 header_buf_addr;
__le32 reserved1;
__le32 opts_header_len;
__le64 addr;
__le32 reserved2;
__le32 opts1;
} __packed desc_cmd;
struct {
__le32 reserved1;
__le32 reserved2;
__le32 rss;
__le32 opts4;
__le32 reserved3;
__le32 opts3;
__le32 opts2;
__le32 opts1;
} __packed desc_status;
} __packed;
/*------ offset 28 of rx descriptor ------*/
#define RTASE_RX_FIRST_FRAG BIT(25) /* Rx First segment of a packet */
#define RTASE_RX_LAST_FRAG BIT(24) /* Rx Final segment of a packet */
#define RTASE_RX_RES BIT(20)
#define RTASE_RX_RUNT BIT(19)
#define RTASE_RX_RWT BIT(18)
#define RTASE_RX_CRC BIT(16)
#define RTASE_RX_V6F BIT(31)
#define RTASE_RX_V4F BIT(30)
#define RTASE_RX_UDPT BIT(29)
#define RTASE_RX_TCPT BIT(28)
#define RTASE_RX_IPF BIT(26) /* IP checksum failed */
#define RTASE_RX_UDPF BIT(25) /* UDP/IP checksum failed */
#define RTASE_RX_TCPF BIT(24) /* TCP/IP checksum failed */
#define RTASE_RX_VLAN_TAG BIT(16) /* VLAN tag available */
#define RTASE_NUM_DESC 1024
#define RTASE_TX_BUDGET_DEFAULT 256
#define RTASE_TX_RING_DESC_SIZE (RTASE_NUM_DESC * sizeof(struct rtase_tx_desc))
#define RTASE_RX_RING_DESC_SIZE (RTASE_NUM_DESC * sizeof(union rtase_rx_desc))
#define RTASE_TX_STOP_THRS (MAX_SKB_FRAGS + 1)
#define RTASE_TX_START_THRS (2 * RTASE_TX_STOP_THRS)
#define RTASE_VLAN_TAG_MASK GENMASK(15, 0)
#define RTASE_RX_PKT_SIZE_MASK GENMASK(13, 0)
#define RTASE_IVEC_NAME_SIZE (IFNAMSIZ + 10)
struct rtase_int_vector {
struct rtase_private *tp;
unsigned int irq;
char name[RTASE_IVEC_NAME_SIZE];
u16 index;
u16 imr_addr;
u16 isr_addr;
u32 imr;
struct list_head ring_list;
struct napi_struct napi;
int (*poll)(struct napi_struct *napi, int budget);
};
struct rtase_ring {
struct rtase_int_vector *ivec;
void *desc;
dma_addr_t phy_addr;
u32 cur_idx;
u32 dirty_idx;
u16 index;
struct sk_buff *skbuff[RTASE_NUM_DESC];
void *data_buf[RTASE_NUM_DESC];
union {
u32 len[RTASE_NUM_DESC];
dma_addr_t data_phy_addr[RTASE_NUM_DESC];
} mis;
struct list_head ring_entry;
int (*ring_handler)(struct rtase_ring *ring, int budget);
u64 alloc_fail;
};
struct rtase_stats {
u64 tx_dropped;
u64 rx_dropped;
u64 multicast;
u64 rx_errors;
u64 rx_length_errors;
u64 rx_crc_errors;
};
struct rtase_private {
void __iomem *mmio_addr;
u32 sw_flag;
struct pci_dev *pdev;
struct net_device *dev;
u32 rx_buf_sz;
struct page_pool *page_pool;
struct rtase_ring tx_ring[RTASE_NUM_TX_QUEUE];
struct rtase_ring rx_ring[RTASE_NUM_RX_QUEUE];
struct rtase_counters *tally_vaddr;
dma_addr_t tally_paddr;
u32 vlan_filter_ctrl;
u16 vlan_filter_vid[RTASE_VLAN_FILTER_ENTRY_NUM];
struct msix_entry msix_entry[RTASE_NUM_MSIX];
struct rtase_int_vector int_vector[RTASE_NUM_MSIX];
struct rtase_stats stats;
u16 tx_queue_ctrl;
u16 func_tx_queue_num;
u16 func_rx_queue_num;
u16 int_nums;
u16 tx_int_mit;
u16 rx_int_mit;
u32 hw_ver;
};
#define RTASE_LSO_64K 64000
#define RTASE_NIC_MAX_PHYS_BUF_COUNT_LSO2 (16 * 4)
#define RTASE_TCPHO_MASK GENMASK(24, 18)
#define RTASE_MSS_MASK GENMASK(28, 18)
#endif /* RTASE_H */
|