summaryrefslogtreecommitdiffstats
path: root/src/drivers/net/marvell/aqc1xx.h
blob: c3e34e1e79a44e2eed4d674a066739a3b1cc649c (plain) (blame)
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
/** @file
 *
 * Marvell AQtion family network card driver definitions.
 *
 * Copyright(C) 2017-2021 Marvell
 *
 * SPDX-License-Identifier: BSD-2-Clause
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  1. Redistributions of source code must retain the above copyright notice,
 *     this list of conditions and the following disclaimer.
 *  2. Redistributions in binary form must reproduce the above copyright notice,
 *     this list of conditions and the following disclaimer in the documentation
 *     and/or other materials provided with the distribution.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS
 *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 *  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 *   PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR HOLDER OR
 *   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 *   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 *   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 *   OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 *   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 *   OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 *   EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */
#ifndef _ATLANTIC_H
#define _ATLANTIC_H

FILE_LICENCE ( BSD2 );

#include <stdint.h>
#include <ipxe/if_ether.h>
#include <ipxe/nvs.h>

#define ATL_BAR_SIZE   0x10000
#define ATL2_BAR_SIZE   0x40000
#define ATL_RING_SIZE  64
#define ATL_RING_ALIGN 128
#define ATL_RX_MAX_LEN 2048

#define ATL_IRQ_TX   0x00000001U
#define ATL_IRQ_RX   0x00000002U

/*IRQ Status Register*/
#define ATL_IRQ_STAT_REG 0x00002000U

/* Interrupt Vector Allocation Register */
#define ATL_IRQ_CTRL			 0x00002300U
#define ATL_IRQ_CTRL_COR_EN	  0x00000080U /*IRQ clear on read */
#define ATL_IRQ_CTRL_REG_RST_DIS 0x20000000U /*Register reset disable */

/*TX/RX Interruprt Mapping*/
#define ATL_IRQ_MAP_REG1		0x00002100U /*IRQ mapping register */

#define ATL_IRQ_MAP_REG1_RX0_EN 0x00008000U /*IRQ RX0 enable*/
#define ATL_IRQ_MAP_REG1_RX0	0x00000100U /*IRQ RX0*/

#define ATL_IRQ_MAP_REG1_TX0_EN 0x80000000U /*IRQ TX0 enable*/
#define ATL_IRQ_MAP_REG1_TX0	0x00000000U /*IRQ TX0*/

/*TX interrupt ctrl reg*/
#define ATL_TX_IRQ_CTRL	   0x00007B40U
#define ATL_TX_IRQ_CTRL_WB_EN 0x00000002U

/*RX interrupt ctrl reg*/
#define ATL_RX_IRQ_CTRL	   0x00005A30U
#define ATL_RX_IRQ_CTRL_WB_EN 0x00000004U

#define ATL_GLB_CTRL  0x00000000U

#define ATL_PCI_CTRL		 0x00001000U
#define ATL_PCI_CTRL_RST_DIS 0x20000000U

#define ATL_RX_CTRL		 0x00005000U
#define ATL_RX_CTRL_RST_DIS 0x20000000U /*RPB reset disable */
#define ATL_TX_CTRL		 0x00007000U
#define ATL_TX_CTRL_RST_DIS 0x20000000U /*TPB reset disable */

/*RX data path control registers*/
#define ATL_RPF2_CTRL	0x00005040U
#define ATL_RPF2_CTRL_EN 0x000F0000U /* RPF2 enable*/
#define ATL2_RPF_NEW_EN_ADR_EN	  0x00000001U /*enable*/
#define ATL2_RPF_NEW_EN_ADR 0x5104

#define ATL_RPF_CTRL1		0x00005100U
#define ATL_RPF_CTRL1_BRC_EN	 0x00000001U /*Allow broadcast receive*/
#define ATL_RPF_CTRL1_L2_PROMISC 0x00000008U /*L2 promiscious*/
#define ATL_RPF_CTRL1_ACTION	 0x00001000U /*Action to host*/
#define ATL_RPF_CTRL1_BRC_TSH	0x00010000U /*Brc threshold 256 units per sec*/

#define ATL_RPF_CTRL2		0x00005280U
#define ATL_RPF_CTRL2_VLAN_PROMISC 0x00000002U /*VLAN promisc*/

#define ATL_RPB_CTRL_DIS      0x0
#define ATL_RPB_CTRL		 0x00005700U
#define ATL_RPB_CTRL_EN	  0x00000001U /*RPB Enable*/
#define ATL_RPB_CTRL_FC	  0x00000010U /*RPB Enable*/
#define ATL_RPB_CTRL_TC_MODE 0x00000100U /*RPB Traffic Class Mode*/

#define ATL_RPB0_CTRL1	  0x00005710U
#define ATL_RPB0_CTRL1_SIZE 0x00000140U /*RPB size (in unit 1KB) \*/

#define ATL_RPB0_CTRL2		0x00005714U

/*Buffer Low Threshold (70% of RPB size in unit 32B)*/
#define ATL_RPB0_CTRL2_LOW_TSH  0x00000C00U
/*Buffer High Threshold(30% of RPB size in unit 32B)*/
#define ATL_RPB0_CTRL2_HIGH_TSH 0x1C000000U
#define ATL_RPB0_CTRL2_FC_EN	0x80000000U /*Flow control Enable*/

#define ATL_RX_DMA_DESC_BUF_SIZE 0x00005b18U
#define ATL_RX_DMA_DESC_ADDR 0x00005b00U

/*TX data path  control registers*/
#define ATL_TPO2_CTRL 0x00007040U
#define ATL_TPO2_EN   0x00010000U /*TPO2 Enable*/

#define ATL_TPB_CTRL_DIS      0x0
#define ATL_TPB_CTRL		 0x00007900U
#define ATL_TPB_CTRL_EN	  0x00000001U /*TPB enable*/
#define ATL_TPB_CTRL_PAD_EN  0x00000004U /*Tx pad insert enable*/
#define ATL_TPB_CTRL_TC_MODE 0x00000100U /*Tx traffic Class Mode*/

#define ATL_TPB0_CTRL1	  0x00007910U
#define ATL_TPB0_CTRL1_SIZE 0x000000A0U /*TPB Size (in unit 1KB)*/

#define ATL_TPB0_CTRL2		  0x00007914U
/*Buffer Low  Threshold(30% of RPB size in unit 32B)*/
#define ATL_TPB0_CTRL2_LOW_TSH  0x00000600U
/*Buffer High  Threshold(30% of RPB size in unit 32B)*/
#define ATL_TPB0_CTRL2_HIGH_TSH 0x0E000000U

#define ATL_TX_DMA_DESC_ADDR 0x00007c00U

/*Rings control registers*/
#define ATL_RING_TX_CTRL	0x00007c08U
#define ATL_RING_TX_CTRL_EN 0x80000000U /*Tx descriptor Enable*/

#define ATL_RING_RX_CTRL	0x00005b08U
#define ATL_RING_RX_CTRL_EN 0x80000000U /*Rx descriptor Enable*/

#define ATL_RING_TAIL	 0x00007c10U
#define ATL_RING_TAIL_PTR 0x00005b10U

/*IRQ control registers*/
#define ATL_ITR_MSKS_DIS      0x0
#define ATL_ITR_MSKS	 0x00002060U
#define ATL_ITR_MSKS_LSW 0x0000000CU
#define ATL_ITR_MSKC	 0x00002070U
#define ATL_ITR_MSKC_LSW 0x0000000CU

/*Link advertising*/
#define ATL_LINK_ADV		   0x00000368U
#define ATL_SHUT_LINK      0x0
#define ATL_LINK_ADV_AUTONEG   0xF20U

#define ATL_LINK_ST	 0x00000370U

/*Semaphores*/
#define ATL_SEM_RAM 0x000003a8U
#define ATL_SEM_RAM_RESET 0X1

/*Mailbox*/
#define ATL_MBOX_ADDR  0x00000360U
#define ATL_MBOX_CTRL1 0x00000200U
#define ATL_MBOX_CTRL1_START_MBOX_OPT 0x8000

#define ATL_MBOX_CTRL3 0x00000208U
#define ATL_MBOX_CTRL5 0x0000020cU

#define ATL_FLAG_A1 0x1
#define ATL_FLAG_A2 0x2

/*write register*/
#define ATL_WRITE_REG(VAL, REG)	writel(VAL, nic->regs + (REG))
#define ATL_READ_REG(REG)	readl(nic->regs + (REG)) /*read register*/

struct atl_desc_tx {
	uint64_t address;
	uint32_t status;
	uint32_t flag;
} __attribute__((packed));

#define ATL_DESC_TX_DX_TYPE_VALUE 0x1

#define  ATL_DESC_TX_DX_EOP_VALUE  0x1
#define  ATL_DESC_TX_EOP_MASK     0x00200000
#define  ATL_DESC_TX_EOP_OFFSET   21

#define ATL_DESC_TX_CMD_MASK    0x3FC00000UL
#define ATL_DESC_TX_CMD_OFFSET  22
#define ATL_DESC_TX_CMD_VALUE   0x22

#define ATL_DESC_TX_BUF_LEN_MASK   0x000FFFF0
#define ATL_DESC_TX_BUF_LEN_OFFSET 5

#define ATL_DESC_TX_PAY_LEN_MASK   0xFFFFC000
#define ATL_DESC_TX_PAY_LEN_OFFSET 14

struct atl_desc_tx_wb {
	uint64_t rsvd1;
	uint32_t status;
	uint32_t rsvd4;
} __attribute__((packed));

#define ATL_TX_DESC_STATUS_DD  0x00100000UL

struct atl_desc_rx {
	uint64_t data_addr;
	uint64_t hdr_addr;

} __attribute__((packed));

struct atl_desc_rx_wb {
	uint64_t rsvd2;
	uint16_t status;
	uint16_t pkt_len;
	uint32_t rsvd4;
} __attribute__((packed));

#define ATL_RX_DESC_STATUS_DD  0x0001UL
#define ATL_RX_DESC_STATUS_EOP 0x0002UL
struct atl_ring {
	unsigned int sw_tail;
	unsigned int sw_head;
	void *ring;
	/** Descriptor ring DMA mapping */
	struct dma_mapping map;
	unsigned int length;
};

struct atl_nic;

struct atl_hw_ops {
	int (*reset) (struct atl_nic *nic);
	int (*start) (struct atl_nic *nic);
	int (*stop) (struct atl_nic *nic);
	int (*get_link) (struct atl_nic *nic);
	int (*get_mac) (struct atl_nic *, uint8_t *mac);
};

/** An aQuanita network card */
struct atl_nic {
	/** Registers */
	void *regs;
	/** Port number (for multi-port devices) */
	unsigned int port;
	/** DMA device */
	struct dma_device *dma;
	/** Flags */
	unsigned int flags;
	struct atl_ring tx_ring;
	struct atl_ring rx_ring;
	struct io_buffer *iobufs[ATL_RING_SIZE];
	uint32_t link_state;
	uint32_t mbox_addr;
	struct atl_hw_ops *hw_ops;
};

struct atl_hw_stats {
	uint32_t version;
	uint32_t tid;
};

#endif /* _AQUANTIA_H */