xref: /openbmc/u-boot/drivers/net/mvpp2.c (revision 4c0411eb)
1 /*
2  * Driver for Marvell PPv2 network controller for Armada 375 SoC.
3  *
4  * Copyright (C) 2014 Marvell
5  *
6  * Marcin Wojtas <mw@semihalf.com>
7  *
8  * U-Boot version:
9  * Copyright (C) 2016-2017 Stefan Roese <sr@denx.de>
10  *
11  * This file is licensed under the terms of the GNU General Public
12  * License version 2. This program is licensed "as is" without any
13  * warranty of any kind, whether express or implied.
14  */
15 
16 #include <common.h>
17 #include <dm.h>
18 #include <dm/device-internal.h>
19 #include <dm/lists.h>
20 #include <net.h>
21 #include <netdev.h>
22 #include <config.h>
23 #include <malloc.h>
24 #include <asm/io.h>
25 #include <linux/errno.h>
26 #include <phy.h>
27 #include <miiphy.h>
28 #include <watchdog.h>
29 #include <asm/arch/cpu.h>
30 #include <asm/arch/soc.h>
31 #include <linux/compat.h>
32 #include <linux/mbus.h>
33 #include <asm-generic/gpio.h>
34 #include <fdt_support.h>
35 
36 DECLARE_GLOBAL_DATA_PTR;
37 
38 #define __verify_pcpu_ptr(ptr)						\
39 do {									\
40 	const void __percpu *__vpp_verify = (typeof((ptr) + 0))NULL;	\
41 	(void)__vpp_verify;						\
42 } while (0)
43 
44 #define VERIFY_PERCPU_PTR(__p)						\
45 ({									\
46 	__verify_pcpu_ptr(__p);						\
47 	(typeof(*(__p)) __kernel __force *)(__p);			\
48 })
49 
50 #define per_cpu_ptr(ptr, cpu)	({ (void)(cpu); VERIFY_PERCPU_PTR(ptr); })
51 #define smp_processor_id()	0
52 #define num_present_cpus()	1
53 #define for_each_present_cpu(cpu)			\
54 	for ((cpu) = 0; (cpu) < 1; (cpu)++)
55 
56 #define NET_SKB_PAD	max(32, MVPP2_CPU_D_CACHE_LINE_SIZE)
57 
58 #define CONFIG_NR_CPUS		1
59 
60 /* 2(HW hdr) 14(MAC hdr) 4(CRC) 32(extra for cache prefetch) */
61 #define WRAP			(2 + ETH_HLEN + 4 + 32)
62 #define MTU			1500
63 #define RX_BUFFER_SIZE		(ALIGN(MTU + WRAP, ARCH_DMA_MINALIGN))
64 
65 #define MVPP2_SMI_TIMEOUT			10000
66 
67 /* RX Fifo Registers */
68 #define MVPP2_RX_DATA_FIFO_SIZE_REG(port)	(0x00 + 4 * (port))
69 #define MVPP2_RX_ATTR_FIFO_SIZE_REG(port)	(0x20 + 4 * (port))
70 #define MVPP2_RX_MIN_PKT_SIZE_REG		0x60
71 #define MVPP2_RX_FIFO_INIT_REG			0x64
72 
73 /* RX DMA Top Registers */
74 #define MVPP2_RX_CTRL_REG(port)			(0x140 + 4 * (port))
75 #define     MVPP2_RX_LOW_LATENCY_PKT_SIZE(s)	(((s) & 0xfff) << 16)
76 #define     MVPP2_RX_USE_PSEUDO_FOR_CSUM_MASK	BIT(31)
77 #define MVPP2_POOL_BUF_SIZE_REG(pool)		(0x180 + 4 * (pool))
78 #define     MVPP2_POOL_BUF_SIZE_OFFSET		5
79 #define MVPP2_RXQ_CONFIG_REG(rxq)		(0x800 + 4 * (rxq))
80 #define     MVPP2_SNOOP_PKT_SIZE_MASK		0x1ff
81 #define     MVPP2_SNOOP_BUF_HDR_MASK		BIT(9)
82 #define     MVPP2_RXQ_POOL_SHORT_OFFS		20
83 #define     MVPP21_RXQ_POOL_SHORT_MASK		0x700000
84 #define     MVPP22_RXQ_POOL_SHORT_MASK		0xf00000
85 #define     MVPP2_RXQ_POOL_LONG_OFFS		24
86 #define     MVPP21_RXQ_POOL_LONG_MASK		0x7000000
87 #define     MVPP22_RXQ_POOL_LONG_MASK		0xf000000
88 #define     MVPP2_RXQ_PACKET_OFFSET_OFFS	28
89 #define     MVPP2_RXQ_PACKET_OFFSET_MASK	0x70000000
90 #define     MVPP2_RXQ_DISABLE_MASK		BIT(31)
91 
92 /* Parser Registers */
93 #define MVPP2_PRS_INIT_LOOKUP_REG		0x1000
94 #define     MVPP2_PRS_PORT_LU_MAX		0xf
95 #define     MVPP2_PRS_PORT_LU_MASK(port)	(0xff << ((port) * 4))
96 #define     MVPP2_PRS_PORT_LU_VAL(port, val)	((val) << ((port) * 4))
97 #define MVPP2_PRS_INIT_OFFS_REG(port)		(0x1004 + ((port) & 4))
98 #define     MVPP2_PRS_INIT_OFF_MASK(port)	(0x3f << (((port) % 4) * 8))
99 #define     MVPP2_PRS_INIT_OFF_VAL(port, val)	((val) << (((port) % 4) * 8))
100 #define MVPP2_PRS_MAX_LOOP_REG(port)		(0x100c + ((port) & 4))
101 #define     MVPP2_PRS_MAX_LOOP_MASK(port)	(0xff << (((port) % 4) * 8))
102 #define     MVPP2_PRS_MAX_LOOP_VAL(port, val)	((val) << (((port) % 4) * 8))
103 #define MVPP2_PRS_TCAM_IDX_REG			0x1100
104 #define MVPP2_PRS_TCAM_DATA_REG(idx)		(0x1104 + (idx) * 4)
105 #define     MVPP2_PRS_TCAM_INV_MASK		BIT(31)
106 #define MVPP2_PRS_SRAM_IDX_REG			0x1200
107 #define MVPP2_PRS_SRAM_DATA_REG(idx)		(0x1204 + (idx) * 4)
108 #define MVPP2_PRS_TCAM_CTRL_REG			0x1230
109 #define     MVPP2_PRS_TCAM_EN_MASK		BIT(0)
110 
111 /* Classifier Registers */
112 #define MVPP2_CLS_MODE_REG			0x1800
113 #define     MVPP2_CLS_MODE_ACTIVE_MASK		BIT(0)
114 #define MVPP2_CLS_PORT_WAY_REG			0x1810
115 #define     MVPP2_CLS_PORT_WAY_MASK(port)	(1 << (port))
116 #define MVPP2_CLS_LKP_INDEX_REG			0x1814
117 #define     MVPP2_CLS_LKP_INDEX_WAY_OFFS	6
118 #define MVPP2_CLS_LKP_TBL_REG			0x1818
119 #define     MVPP2_CLS_LKP_TBL_RXQ_MASK		0xff
120 #define     MVPP2_CLS_LKP_TBL_LOOKUP_EN_MASK	BIT(25)
121 #define MVPP2_CLS_FLOW_INDEX_REG		0x1820
122 #define MVPP2_CLS_FLOW_TBL0_REG			0x1824
123 #define MVPP2_CLS_FLOW_TBL1_REG			0x1828
124 #define MVPP2_CLS_FLOW_TBL2_REG			0x182c
125 #define MVPP2_CLS_OVERSIZE_RXQ_LOW_REG(port)	(0x1980 + ((port) * 4))
126 #define     MVPP2_CLS_OVERSIZE_RXQ_LOW_BITS	3
127 #define     MVPP2_CLS_OVERSIZE_RXQ_LOW_MASK	0x7
128 #define MVPP2_CLS_SWFWD_P2HQ_REG(port)		(0x19b0 + ((port) * 4))
129 #define MVPP2_CLS_SWFWD_PCTRL_REG		0x19d0
130 #define     MVPP2_CLS_SWFWD_PCTRL_MASK(port)	(1 << (port))
131 
132 /* Descriptor Manager Top Registers */
133 #define MVPP2_RXQ_NUM_REG			0x2040
134 #define MVPP2_RXQ_DESC_ADDR_REG			0x2044
135 #define     MVPP22_DESC_ADDR_OFFS		8
136 #define MVPP2_RXQ_DESC_SIZE_REG			0x2048
137 #define     MVPP2_RXQ_DESC_SIZE_MASK		0x3ff0
138 #define MVPP2_RXQ_STATUS_UPDATE_REG(rxq)	(0x3000 + 4 * (rxq))
139 #define     MVPP2_RXQ_NUM_PROCESSED_OFFSET	0
140 #define     MVPP2_RXQ_NUM_NEW_OFFSET		16
141 #define MVPP2_RXQ_STATUS_REG(rxq)		(0x3400 + 4 * (rxq))
142 #define     MVPP2_RXQ_OCCUPIED_MASK		0x3fff
143 #define     MVPP2_RXQ_NON_OCCUPIED_OFFSET	16
144 #define     MVPP2_RXQ_NON_OCCUPIED_MASK		0x3fff0000
145 #define MVPP2_RXQ_THRESH_REG			0x204c
146 #define     MVPP2_OCCUPIED_THRESH_OFFSET	0
147 #define     MVPP2_OCCUPIED_THRESH_MASK		0x3fff
148 #define MVPP2_RXQ_INDEX_REG			0x2050
149 #define MVPP2_TXQ_NUM_REG			0x2080
150 #define MVPP2_TXQ_DESC_ADDR_REG			0x2084
151 #define MVPP2_TXQ_DESC_SIZE_REG			0x2088
152 #define     MVPP2_TXQ_DESC_SIZE_MASK		0x3ff0
153 #define MVPP2_AGGR_TXQ_UPDATE_REG		0x2090
154 #define MVPP2_TXQ_THRESH_REG			0x2094
155 #define     MVPP2_TRANSMITTED_THRESH_OFFSET	16
156 #define     MVPP2_TRANSMITTED_THRESH_MASK	0x3fff0000
157 #define MVPP2_TXQ_INDEX_REG			0x2098
158 #define MVPP2_TXQ_PREF_BUF_REG			0x209c
159 #define     MVPP2_PREF_BUF_PTR(desc)		((desc) & 0xfff)
160 #define     MVPP2_PREF_BUF_SIZE_4		(BIT(12) | BIT(13))
161 #define     MVPP2_PREF_BUF_SIZE_16		(BIT(12) | BIT(14))
162 #define     MVPP2_PREF_BUF_THRESH(val)		((val) << 17)
163 #define     MVPP2_TXQ_DRAIN_EN_MASK		BIT(31)
164 #define MVPP2_TXQ_PENDING_REG			0x20a0
165 #define     MVPP2_TXQ_PENDING_MASK		0x3fff
166 #define MVPP2_TXQ_INT_STATUS_REG		0x20a4
167 #define MVPP2_TXQ_SENT_REG(txq)			(0x3c00 + 4 * (txq))
168 #define     MVPP2_TRANSMITTED_COUNT_OFFSET	16
169 #define     MVPP2_TRANSMITTED_COUNT_MASK	0x3fff0000
170 #define MVPP2_TXQ_RSVD_REQ_REG			0x20b0
171 #define     MVPP2_TXQ_RSVD_REQ_Q_OFFSET		16
172 #define MVPP2_TXQ_RSVD_RSLT_REG			0x20b4
173 #define     MVPP2_TXQ_RSVD_RSLT_MASK		0x3fff
174 #define MVPP2_TXQ_RSVD_CLR_REG			0x20b8
175 #define     MVPP2_TXQ_RSVD_CLR_OFFSET		16
176 #define MVPP2_AGGR_TXQ_DESC_ADDR_REG(cpu)	(0x2100 + 4 * (cpu))
177 #define     MVPP22_AGGR_TXQ_DESC_ADDR_OFFS	8
178 #define MVPP2_AGGR_TXQ_DESC_SIZE_REG(cpu)	(0x2140 + 4 * (cpu))
179 #define     MVPP2_AGGR_TXQ_DESC_SIZE_MASK	0x3ff0
180 #define MVPP2_AGGR_TXQ_STATUS_REG(cpu)		(0x2180 + 4 * (cpu))
181 #define     MVPP2_AGGR_TXQ_PENDING_MASK		0x3fff
182 #define MVPP2_AGGR_TXQ_INDEX_REG(cpu)		(0x21c0 + 4 * (cpu))
183 
184 /* MBUS bridge registers */
185 #define MVPP2_WIN_BASE(w)			(0x4000 + ((w) << 2))
186 #define MVPP2_WIN_SIZE(w)			(0x4020 + ((w) << 2))
187 #define MVPP2_WIN_REMAP(w)			(0x4040 + ((w) << 2))
188 #define MVPP2_BASE_ADDR_ENABLE			0x4060
189 
190 /* AXI Bridge Registers */
191 #define MVPP22_AXI_BM_WR_ATTR_REG		0x4100
192 #define MVPP22_AXI_BM_RD_ATTR_REG		0x4104
193 #define MVPP22_AXI_AGGRQ_DESCR_RD_ATTR_REG	0x4110
194 #define MVPP22_AXI_TXQ_DESCR_WR_ATTR_REG	0x4114
195 #define MVPP22_AXI_TXQ_DESCR_RD_ATTR_REG	0x4118
196 #define MVPP22_AXI_RXQ_DESCR_WR_ATTR_REG	0x411c
197 #define MVPP22_AXI_RX_DATA_WR_ATTR_REG		0x4120
198 #define MVPP22_AXI_TX_DATA_RD_ATTR_REG		0x4130
199 #define MVPP22_AXI_RD_NORMAL_CODE_REG		0x4150
200 #define MVPP22_AXI_RD_SNOOP_CODE_REG		0x4154
201 #define MVPP22_AXI_WR_NORMAL_CODE_REG		0x4160
202 #define MVPP22_AXI_WR_SNOOP_CODE_REG		0x4164
203 
204 /* Values for AXI Bridge registers */
205 #define MVPP22_AXI_ATTR_CACHE_OFFS		0
206 #define MVPP22_AXI_ATTR_DOMAIN_OFFS		12
207 
208 #define MVPP22_AXI_CODE_CACHE_OFFS		0
209 #define MVPP22_AXI_CODE_DOMAIN_OFFS		4
210 
211 #define MVPP22_AXI_CODE_CACHE_NON_CACHE		0x3
212 #define MVPP22_AXI_CODE_CACHE_WR_CACHE		0x7
213 #define MVPP22_AXI_CODE_CACHE_RD_CACHE		0xb
214 
215 #define MVPP22_AXI_CODE_DOMAIN_OUTER_DOM	2
216 #define MVPP22_AXI_CODE_DOMAIN_SYSTEM		3
217 
218 /* Interrupt Cause and Mask registers */
219 #define MVPP2_ISR_RX_THRESHOLD_REG(rxq)		(0x5200 + 4 * (rxq))
220 #define MVPP21_ISR_RXQ_GROUP_REG(rxq)		(0x5400 + 4 * (rxq))
221 
222 #define MVPP22_ISR_RXQ_GROUP_INDEX_REG          0x5400
223 #define MVPP22_ISR_RXQ_GROUP_INDEX_SUBGROUP_MASK 0xf
224 #define MVPP22_ISR_RXQ_GROUP_INDEX_GROUP_MASK   0x380
225 #define MVPP22_ISR_RXQ_GROUP_INDEX_GROUP_OFFSET 7
226 
227 #define MVPP22_ISR_RXQ_GROUP_INDEX_SUBGROUP_MASK 0xf
228 #define MVPP22_ISR_RXQ_GROUP_INDEX_GROUP_MASK   0x380
229 
230 #define MVPP22_ISR_RXQ_SUB_GROUP_CONFIG_REG     0x5404
231 #define MVPP22_ISR_RXQ_SUB_GROUP_STARTQ_MASK    0x1f
232 #define MVPP22_ISR_RXQ_SUB_GROUP_SIZE_MASK      0xf00
233 #define MVPP22_ISR_RXQ_SUB_GROUP_SIZE_OFFSET    8
234 
235 #define MVPP2_ISR_ENABLE_REG(port)		(0x5420 + 4 * (port))
236 #define     MVPP2_ISR_ENABLE_INTERRUPT(mask)	((mask) & 0xffff)
237 #define     MVPP2_ISR_DISABLE_INTERRUPT(mask)	(((mask) << 16) & 0xffff0000)
238 #define MVPP2_ISR_RX_TX_CAUSE_REG(port)		(0x5480 + 4 * (port))
239 #define     MVPP2_CAUSE_RXQ_OCCUP_DESC_ALL_MASK	0xffff
240 #define     MVPP2_CAUSE_TXQ_OCCUP_DESC_ALL_MASK	0xff0000
241 #define     MVPP2_CAUSE_RX_FIFO_OVERRUN_MASK	BIT(24)
242 #define     MVPP2_CAUSE_FCS_ERR_MASK		BIT(25)
243 #define     MVPP2_CAUSE_TX_FIFO_UNDERRUN_MASK	BIT(26)
244 #define     MVPP2_CAUSE_TX_EXCEPTION_SUM_MASK	BIT(29)
245 #define     MVPP2_CAUSE_RX_EXCEPTION_SUM_MASK	BIT(30)
246 #define     MVPP2_CAUSE_MISC_SUM_MASK		BIT(31)
247 #define MVPP2_ISR_RX_TX_MASK_REG(port)		(0x54a0 + 4 * (port))
248 #define MVPP2_ISR_PON_RX_TX_MASK_REG		0x54bc
249 #define     MVPP2_PON_CAUSE_RXQ_OCCUP_DESC_ALL_MASK	0xffff
250 #define     MVPP2_PON_CAUSE_TXP_OCCUP_DESC_ALL_MASK	0x3fc00000
251 #define     MVPP2_PON_CAUSE_MISC_SUM_MASK		BIT(31)
252 #define MVPP2_ISR_MISC_CAUSE_REG		0x55b0
253 
254 /* Buffer Manager registers */
255 #define MVPP2_BM_POOL_BASE_REG(pool)		(0x6000 + ((pool) * 4))
256 #define     MVPP2_BM_POOL_BASE_ADDR_MASK	0xfffff80
257 #define MVPP2_BM_POOL_SIZE_REG(pool)		(0x6040 + ((pool) * 4))
258 #define     MVPP2_BM_POOL_SIZE_MASK		0xfff0
259 #define MVPP2_BM_POOL_READ_PTR_REG(pool)	(0x6080 + ((pool) * 4))
260 #define     MVPP2_BM_POOL_GET_READ_PTR_MASK	0xfff0
261 #define MVPP2_BM_POOL_PTRS_NUM_REG(pool)	(0x60c0 + ((pool) * 4))
262 #define     MVPP2_BM_POOL_PTRS_NUM_MASK		0xfff0
263 #define MVPP2_BM_BPPI_READ_PTR_REG(pool)	(0x6100 + ((pool) * 4))
264 #define MVPP2_BM_BPPI_PTRS_NUM_REG(pool)	(0x6140 + ((pool) * 4))
265 #define     MVPP2_BM_BPPI_PTR_NUM_MASK		0x7ff
266 #define     MVPP2_BM_BPPI_PREFETCH_FULL_MASK	BIT(16)
267 #define MVPP2_BM_POOL_CTRL_REG(pool)		(0x6200 + ((pool) * 4))
268 #define     MVPP2_BM_START_MASK			BIT(0)
269 #define     MVPP2_BM_STOP_MASK			BIT(1)
270 #define     MVPP2_BM_STATE_MASK			BIT(4)
271 #define     MVPP2_BM_LOW_THRESH_OFFS		8
272 #define     MVPP2_BM_LOW_THRESH_MASK		0x7f00
273 #define     MVPP2_BM_LOW_THRESH_VALUE(val)	((val) << \
274 						MVPP2_BM_LOW_THRESH_OFFS)
275 #define     MVPP2_BM_HIGH_THRESH_OFFS		16
276 #define     MVPP2_BM_HIGH_THRESH_MASK		0x7f0000
277 #define     MVPP2_BM_HIGH_THRESH_VALUE(val)	((val) << \
278 						MVPP2_BM_HIGH_THRESH_OFFS)
279 #define MVPP2_BM_INTR_CAUSE_REG(pool)		(0x6240 + ((pool) * 4))
280 #define     MVPP2_BM_RELEASED_DELAY_MASK	BIT(0)
281 #define     MVPP2_BM_ALLOC_FAILED_MASK		BIT(1)
282 #define     MVPP2_BM_BPPE_EMPTY_MASK		BIT(2)
283 #define     MVPP2_BM_BPPE_FULL_MASK		BIT(3)
284 #define     MVPP2_BM_AVAILABLE_BP_LOW_MASK	BIT(4)
285 #define MVPP2_BM_INTR_MASK_REG(pool)		(0x6280 + ((pool) * 4))
286 #define MVPP2_BM_PHY_ALLOC_REG(pool)		(0x6400 + ((pool) * 4))
287 #define     MVPP2_BM_PHY_ALLOC_GRNTD_MASK	BIT(0)
288 #define MVPP2_BM_VIRT_ALLOC_REG			0x6440
289 #define MVPP2_BM_ADDR_HIGH_ALLOC		0x6444
290 #define     MVPP2_BM_ADDR_HIGH_PHYS_MASK	0xff
291 #define     MVPP2_BM_ADDR_HIGH_VIRT_MASK	0xff00
292 #define     MVPP2_BM_ADDR_HIGH_VIRT_SHIFT	8
293 #define MVPP2_BM_PHY_RLS_REG(pool)		(0x6480 + ((pool) * 4))
294 #define     MVPP2_BM_PHY_RLS_MC_BUFF_MASK	BIT(0)
295 #define     MVPP2_BM_PHY_RLS_PRIO_EN_MASK	BIT(1)
296 #define     MVPP2_BM_PHY_RLS_GRNTD_MASK		BIT(2)
297 #define MVPP2_BM_VIRT_RLS_REG			0x64c0
298 #define MVPP21_BM_MC_RLS_REG			0x64c4
299 #define     MVPP2_BM_MC_ID_MASK			0xfff
300 #define     MVPP2_BM_FORCE_RELEASE_MASK		BIT(12)
301 #define MVPP22_BM_ADDR_HIGH_RLS_REG		0x64c4
302 #define     MVPP22_BM_ADDR_HIGH_PHYS_RLS_MASK	0xff
303 #define	    MVPP22_BM_ADDR_HIGH_VIRT_RLS_MASK	0xff00
304 #define     MVPP22_BM_ADDR_HIGH_VIRT_RLS_SHIFT	8
305 #define MVPP22_BM_MC_RLS_REG			0x64d4
306 #define MVPP22_BM_POOL_BASE_HIGH_REG		0x6310
307 #define MVPP22_BM_POOL_BASE_HIGH_MASK		0xff
308 
309 /* TX Scheduler registers */
310 #define MVPP2_TXP_SCHED_PORT_INDEX_REG		0x8000
311 #define MVPP2_TXP_SCHED_Q_CMD_REG		0x8004
312 #define     MVPP2_TXP_SCHED_ENQ_MASK		0xff
313 #define     MVPP2_TXP_SCHED_DISQ_OFFSET		8
314 #define MVPP2_TXP_SCHED_CMD_1_REG		0x8010
315 #define MVPP2_TXP_SCHED_PERIOD_REG		0x8018
316 #define MVPP2_TXP_SCHED_MTU_REG			0x801c
317 #define     MVPP2_TXP_MTU_MAX			0x7FFFF
318 #define MVPP2_TXP_SCHED_REFILL_REG		0x8020
319 #define     MVPP2_TXP_REFILL_TOKENS_ALL_MASK	0x7ffff
320 #define     MVPP2_TXP_REFILL_PERIOD_ALL_MASK	0x3ff00000
321 #define     MVPP2_TXP_REFILL_PERIOD_MASK(v)	((v) << 20)
322 #define MVPP2_TXP_SCHED_TOKEN_SIZE_REG		0x8024
323 #define     MVPP2_TXP_TOKEN_SIZE_MAX		0xffffffff
324 #define MVPP2_TXQ_SCHED_REFILL_REG(q)		(0x8040 + ((q) << 2))
325 #define     MVPP2_TXQ_REFILL_TOKENS_ALL_MASK	0x7ffff
326 #define     MVPP2_TXQ_REFILL_PERIOD_ALL_MASK	0x3ff00000
327 #define     MVPP2_TXQ_REFILL_PERIOD_MASK(v)	((v) << 20)
328 #define MVPP2_TXQ_SCHED_TOKEN_SIZE_REG(q)	(0x8060 + ((q) << 2))
329 #define     MVPP2_TXQ_TOKEN_SIZE_MAX		0x7fffffff
330 #define MVPP2_TXQ_SCHED_TOKEN_CNTR_REG(q)	(0x8080 + ((q) << 2))
331 #define     MVPP2_TXQ_TOKEN_CNTR_MAX		0xffffffff
332 
333 /* TX general registers */
334 #define MVPP2_TX_SNOOP_REG			0x8800
335 #define MVPP2_TX_PORT_FLUSH_REG			0x8810
336 #define     MVPP2_TX_PORT_FLUSH_MASK(port)	(1 << (port))
337 
338 /* LMS registers */
339 #define MVPP2_SRC_ADDR_MIDDLE			0x24
340 #define MVPP2_SRC_ADDR_HIGH			0x28
341 #define MVPP2_PHY_AN_CFG0_REG			0x34
342 #define     MVPP2_PHY_AN_STOP_SMI0_MASK		BIT(7)
343 #define MVPP2_MNG_EXTENDED_GLOBAL_CTRL_REG	0x305c
344 #define     MVPP2_EXT_GLOBAL_CTRL_DEFAULT	0x27
345 
346 /* Per-port registers */
347 #define MVPP2_GMAC_CTRL_0_REG			0x0
348 #define      MVPP2_GMAC_PORT_EN_MASK		BIT(0)
349 #define      MVPP2_GMAC_PORT_TYPE_MASK		BIT(1)
350 #define      MVPP2_GMAC_MAX_RX_SIZE_OFFS	2
351 #define      MVPP2_GMAC_MAX_RX_SIZE_MASK	0x7ffc
352 #define      MVPP2_GMAC_MIB_CNTR_EN_MASK	BIT(15)
353 #define MVPP2_GMAC_CTRL_1_REG			0x4
354 #define      MVPP2_GMAC_PERIODIC_XON_EN_MASK	BIT(1)
355 #define      MVPP2_GMAC_GMII_LB_EN_MASK		BIT(5)
356 #define      MVPP2_GMAC_PCS_LB_EN_BIT		6
357 #define      MVPP2_GMAC_PCS_LB_EN_MASK		BIT(6)
358 #define      MVPP2_GMAC_SA_LOW_OFFS		7
359 #define MVPP2_GMAC_CTRL_2_REG			0x8
360 #define      MVPP2_GMAC_INBAND_AN_MASK		BIT(0)
361 #define      MVPP2_GMAC_SGMII_MODE_MASK		BIT(0)
362 #define      MVPP2_GMAC_PCS_ENABLE_MASK		BIT(3)
363 #define      MVPP2_GMAC_PORT_RGMII_MASK		BIT(4)
364 #define      MVPP2_GMAC_PORT_DIS_PADING_MASK	BIT(5)
365 #define      MVPP2_GMAC_PORT_RESET_MASK		BIT(6)
366 #define      MVPP2_GMAC_CLK_125_BYPS_EN_MASK	BIT(9)
367 #define MVPP2_GMAC_AUTONEG_CONFIG		0xc
368 #define      MVPP2_GMAC_FORCE_LINK_DOWN		BIT(0)
369 #define      MVPP2_GMAC_FORCE_LINK_PASS		BIT(1)
370 #define      MVPP2_GMAC_EN_PCS_AN		BIT(2)
371 #define      MVPP2_GMAC_AN_BYPASS_EN		BIT(3)
372 #define      MVPP2_GMAC_CONFIG_MII_SPEED	BIT(5)
373 #define      MVPP2_GMAC_CONFIG_GMII_SPEED	BIT(6)
374 #define      MVPP2_GMAC_AN_SPEED_EN		BIT(7)
375 #define      MVPP2_GMAC_FC_ADV_EN		BIT(9)
376 #define      MVPP2_GMAC_EN_FC_AN		BIT(11)
377 #define      MVPP2_GMAC_CONFIG_FULL_DUPLEX	BIT(12)
378 #define      MVPP2_GMAC_AN_DUPLEX_EN		BIT(13)
379 #define      MVPP2_GMAC_CHOOSE_SAMPLE_TX_CONFIG	BIT(15)
380 #define MVPP2_GMAC_PORT_FIFO_CFG_1_REG		0x1c
381 #define      MVPP2_GMAC_TX_FIFO_MIN_TH_OFFS	6
382 #define      MVPP2_GMAC_TX_FIFO_MIN_TH_ALL_MASK	0x1fc0
383 #define      MVPP2_GMAC_TX_FIFO_MIN_TH_MASK(v)	(((v) << 6) & \
384 					MVPP2_GMAC_TX_FIFO_MIN_TH_ALL_MASK)
385 #define MVPP2_GMAC_CTRL_4_REG			0x90
386 #define      MVPP2_GMAC_CTRL4_EXT_PIN_GMII_SEL_MASK	BIT(0)
387 #define      MVPP2_GMAC_CTRL4_DP_CLK_SEL_MASK	BIT(5)
388 #define      MVPP2_GMAC_CTRL4_SYNC_BYPASS_MASK	BIT(6)
389 #define      MVPP2_GMAC_CTRL4_QSGMII_BYPASS_ACTIVE_MASK	BIT(7)
390 
391 /*
392  * Per-port XGMAC registers. PPv2.2 only, only for GOP port 0,
393  * relative to port->base.
394  */
395 
396 /* Port Mac Control0 */
397 #define MVPP22_XLG_CTRL0_REG			0x100
398 #define      MVPP22_XLG_PORT_EN			BIT(0)
399 #define      MVPP22_XLG_MAC_RESETN		BIT(1)
400 #define      MVPP22_XLG_RX_FC_EN		BIT(7)
401 #define      MVPP22_XLG_MIBCNT_DIS		BIT(13)
402 /* Port Mac Control1 */
403 #define MVPP22_XLG_CTRL1_REG			0x104
404 #define      MVPP22_XLG_MAX_RX_SIZE_OFFS	0
405 #define      MVPP22_XLG_MAX_RX_SIZE_MASK	0x1fff
406 /* Port Interrupt Mask */
407 #define MVPP22_XLG_INTERRUPT_MASK_REG		0x118
408 #define      MVPP22_XLG_INTERRUPT_LINK_CHANGE	BIT(1)
409 /* Port Mac Control3 */
410 #define MVPP22_XLG_CTRL3_REG			0x11c
411 #define      MVPP22_XLG_CTRL3_MACMODESELECT_MASK	(7 << 13)
412 #define      MVPP22_XLG_CTRL3_MACMODESELECT_GMAC	(0 << 13)
413 #define      MVPP22_XLG_CTRL3_MACMODESELECT_10GMAC	(1 << 13)
414 /* Port Mac Control4 */
415 #define MVPP22_XLG_CTRL4_REG			0x184
416 #define      MVPP22_XLG_FORWARD_802_3X_FC_EN	BIT(5)
417 #define      MVPP22_XLG_FORWARD_PFC_EN		BIT(6)
418 #define      MVPP22_XLG_MODE_DMA_1G		BIT(12)
419 #define      MVPP22_XLG_EN_IDLE_CHECK_FOR_LINK	BIT(14)
420 
421 /* XPCS registers */
422 
423 /* Global Configuration 0 */
424 #define MVPP22_XPCS_GLOBAL_CFG_0_REG		0x0
425 #define      MVPP22_XPCS_PCSRESET		BIT(0)
426 #define      MVPP22_XPCS_PCSMODE_OFFS		3
427 #define      MVPP22_XPCS_PCSMODE_MASK		(0x3 << \
428 						 MVPP22_XPCS_PCSMODE_OFFS)
429 #define      MVPP22_XPCS_LANEACTIVE_OFFS	5
430 #define      MVPP22_XPCS_LANEACTIVE_MASK	(0x3 << \
431 						 MVPP22_XPCS_LANEACTIVE_OFFS)
432 
433 /* MPCS registers */
434 
435 #define PCS40G_COMMON_CONTROL			0x14
436 #define      FORWARD_ERROR_CORRECTION_MASK	BIT(10)
437 
438 #define PCS_CLOCK_RESET				0x14c
439 #define      TX_SD_CLK_RESET_MASK		BIT(0)
440 #define      RX_SD_CLK_RESET_MASK		BIT(1)
441 #define      MAC_CLK_RESET_MASK			BIT(2)
442 #define      CLK_DIVISION_RATIO_OFFS		4
443 #define      CLK_DIVISION_RATIO_MASK		(0x7 << CLK_DIVISION_RATIO_OFFS)
444 #define      CLK_DIV_PHASE_SET_MASK		BIT(11)
445 
446 /* System Soft Reset 1 */
447 #define GOP_SOFT_RESET_1_REG			0x108
448 #define     NETC_GOP_SOFT_RESET_OFFS		6
449 #define     NETC_GOP_SOFT_RESET_MASK		(0x1 << \
450 						 NETC_GOP_SOFT_RESET_OFFS)
451 
452 /* Ports Control 0 */
453 #define NETCOMP_PORTS_CONTROL_0_REG		0x110
454 #define     NETC_BUS_WIDTH_SELECT_OFFS		1
455 #define     NETC_BUS_WIDTH_SELECT_MASK		(0x1 << \
456 						 NETC_BUS_WIDTH_SELECT_OFFS)
457 #define     NETC_GIG_RX_DATA_SAMPLE_OFFS	29
458 #define     NETC_GIG_RX_DATA_SAMPLE_MASK	(0x1 << \
459 						 NETC_GIG_RX_DATA_SAMPLE_OFFS)
460 #define     NETC_CLK_DIV_PHASE_OFFS		31
461 #define     NETC_CLK_DIV_PHASE_MASK		(0x1 << NETC_CLK_DIV_PHASE_OFFS)
462 /* Ports Control 1 */
463 #define NETCOMP_PORTS_CONTROL_1_REG		0x114
464 #define     NETC_PORTS_ACTIVE_OFFSET(p)		(0 + p)
465 #define     NETC_PORTS_ACTIVE_MASK(p)		(0x1 << \
466 						 NETC_PORTS_ACTIVE_OFFSET(p))
467 #define     NETC_PORT_GIG_RF_RESET_OFFS(p)	(28 + p)
468 #define     NETC_PORT_GIG_RF_RESET_MASK(p)	(0x1 << \
469 						 NETC_PORT_GIG_RF_RESET_OFFS(p))
470 #define NETCOMP_CONTROL_0_REG			0x120
471 #define     NETC_GBE_PORT0_SGMII_MODE_OFFS	0
472 #define     NETC_GBE_PORT0_SGMII_MODE_MASK	(0x1 << \
473 						 NETC_GBE_PORT0_SGMII_MODE_OFFS)
474 #define     NETC_GBE_PORT1_SGMII_MODE_OFFS	1
475 #define     NETC_GBE_PORT1_SGMII_MODE_MASK	(0x1 << \
476 						 NETC_GBE_PORT1_SGMII_MODE_OFFS)
477 #define     NETC_GBE_PORT1_MII_MODE_OFFS	2
478 #define     NETC_GBE_PORT1_MII_MODE_MASK	(0x1 << \
479 						 NETC_GBE_PORT1_MII_MODE_OFFS)
480 
481 #define MVPP22_SMI_MISC_CFG_REG			(MVPP22_SMI + 0x04)
482 #define      MVPP22_SMI_POLLING_EN		BIT(10)
483 
484 #define MVPP22_SMI_PHY_ADDR_REG(port)		(MVPP22_SMI + 0x04 + \
485 						 (0x4 * (port)))
486 
487 #define MVPP2_CAUSE_TXQ_SENT_DESC_ALL_MASK	0xff
488 
489 /* Descriptor ring Macros */
490 #define MVPP2_QUEUE_NEXT_DESC(q, index) \
491 	(((index) < (q)->last_desc) ? ((index) + 1) : 0)
492 
493 /* SMI: 0xc0054 -> offset 0x54 to lms_base */
494 #define MVPP21_SMI				0x0054
495 /* PP2.2: SMI: 0x12a200 -> offset 0x1200 to iface_base */
496 #define MVPP22_SMI				0x1200
497 #define     MVPP2_PHY_REG_MASK			0x1f
498 /* SMI register fields */
499 #define     MVPP2_SMI_DATA_OFFS			0	/* Data */
500 #define     MVPP2_SMI_DATA_MASK			(0xffff << MVPP2_SMI_DATA_OFFS)
501 #define     MVPP2_SMI_DEV_ADDR_OFFS		16	/* PHY device address */
502 #define     MVPP2_SMI_REG_ADDR_OFFS		21	/* PHY device reg addr*/
503 #define     MVPP2_SMI_OPCODE_OFFS		26	/* Write/Read opcode */
504 #define     MVPP2_SMI_OPCODE_READ		(1 << MVPP2_SMI_OPCODE_OFFS)
505 #define     MVPP2_SMI_READ_VALID		(1 << 27)	/* Read Valid */
506 #define     MVPP2_SMI_BUSY			(1 << 28)	/* Busy */
507 
508 #define     MVPP2_PHY_ADDR_MASK			0x1f
509 #define     MVPP2_PHY_REG_MASK			0x1f
510 
511 /* Additional PPv2.2 offsets */
512 #define MVPP22_MPCS				0x007000
513 #define MVPP22_XPCS				0x007400
514 #define MVPP22_PORT_BASE			0x007e00
515 #define MVPP22_PORT_OFFSET			0x001000
516 #define MVPP22_RFU1				0x318000
517 
518 /* Maximum number of ports */
519 #define MVPP22_GOP_MAC_NUM			4
520 
521 /* Sets the field located at the specified in data */
522 #define MVPP2_RGMII_TX_FIFO_MIN_TH		0x41
523 #define MVPP2_SGMII_TX_FIFO_MIN_TH		0x5
524 #define MVPP2_SGMII2_5_TX_FIFO_MIN_TH		0xb
525 
526 /* Net Complex */
527 enum mv_netc_topology {
528 	MV_NETC_GE_MAC2_SGMII		=	BIT(0),
529 	MV_NETC_GE_MAC3_SGMII		=	BIT(1),
530 	MV_NETC_GE_MAC3_RGMII		=	BIT(2),
531 };
532 
533 enum mv_netc_phase {
534 	MV_NETC_FIRST_PHASE,
535 	MV_NETC_SECOND_PHASE,
536 };
537 
538 enum mv_netc_sgmii_xmi_mode {
539 	MV_NETC_GBE_SGMII,
540 	MV_NETC_GBE_XMII,
541 };
542 
543 enum mv_netc_mii_mode {
544 	MV_NETC_GBE_RGMII,
545 	MV_NETC_GBE_MII,
546 };
547 
548 enum mv_netc_lanes {
549 	MV_NETC_LANE_23,
550 	MV_NETC_LANE_45,
551 };
552 
553 /* Various constants */
554 
555 /* Coalescing */
556 #define MVPP2_TXDONE_COAL_PKTS_THRESH	15
557 #define MVPP2_TXDONE_HRTIMER_PERIOD_NS	1000000UL
558 #define MVPP2_RX_COAL_PKTS		32
559 #define MVPP2_RX_COAL_USEC		100
560 
561 /* The two bytes Marvell header. Either contains a special value used
562  * by Marvell switches when a specific hardware mode is enabled (not
563  * supported by this driver) or is filled automatically by zeroes on
564  * the RX side. Those two bytes being at the front of the Ethernet
565  * header, they allow to have the IP header aligned on a 4 bytes
566  * boundary automatically: the hardware skips those two bytes on its
567  * own.
568  */
569 #define MVPP2_MH_SIZE			2
570 #define MVPP2_ETH_TYPE_LEN		2
571 #define MVPP2_PPPOE_HDR_SIZE		8
572 #define MVPP2_VLAN_TAG_LEN		4
573 
574 /* Lbtd 802.3 type */
575 #define MVPP2_IP_LBDT_TYPE		0xfffa
576 
577 #define MVPP2_CPU_D_CACHE_LINE_SIZE	32
578 #define MVPP2_TX_CSUM_MAX_SIZE		9800
579 
580 /* Timeout constants */
581 #define MVPP2_TX_DISABLE_TIMEOUT_MSEC	1000
582 #define MVPP2_TX_PENDING_TIMEOUT_MSEC	1000
583 
584 #define MVPP2_TX_MTU_MAX		0x7ffff
585 
586 /* Maximum number of T-CONTs of PON port */
587 #define MVPP2_MAX_TCONT			16
588 
589 /* Maximum number of supported ports */
590 #define MVPP2_MAX_PORTS			4
591 
592 /* Maximum number of TXQs used by single port */
593 #define MVPP2_MAX_TXQ			8
594 
595 /* Default number of TXQs in use */
596 #define MVPP2_DEFAULT_TXQ		1
597 
598 /* Dfault number of RXQs in use */
599 #define MVPP2_DEFAULT_RXQ		1
600 #define CONFIG_MV_ETH_RXQ		8	/* increment by 8 */
601 
602 /* Max number of Rx descriptors */
603 #define MVPP2_MAX_RXD			16
604 
605 /* Max number of Tx descriptors */
606 #define MVPP2_MAX_TXD			16
607 
608 /* Amount of Tx descriptors that can be reserved at once by CPU */
609 #define MVPP2_CPU_DESC_CHUNK		16
610 
611 /* Max number of Tx descriptors in each aggregated queue */
612 #define MVPP2_AGGR_TXQ_SIZE		16
613 
614 /* Descriptor aligned size */
615 #define MVPP2_DESC_ALIGNED_SIZE		32
616 
617 /* Descriptor alignment mask */
618 #define MVPP2_TX_DESC_ALIGN		(MVPP2_DESC_ALIGNED_SIZE - 1)
619 
620 /* RX FIFO constants */
621 #define MVPP21_RX_FIFO_PORT_DATA_SIZE		0x2000
622 #define MVPP21_RX_FIFO_PORT_ATTR_SIZE		0x80
623 #define MVPP22_RX_FIFO_10GB_PORT_DATA_SIZE	0x8000
624 #define MVPP22_RX_FIFO_2_5GB_PORT_DATA_SIZE	0x2000
625 #define MVPP22_RX_FIFO_1GB_PORT_DATA_SIZE	0x1000
626 #define MVPP22_RX_FIFO_10GB_PORT_ATTR_SIZE	0x200
627 #define MVPP22_RX_FIFO_2_5GB_PORT_ATTR_SIZE	0x80
628 #define MVPP22_RX_FIFO_1GB_PORT_ATTR_SIZE	0x40
629 #define MVPP2_RX_FIFO_PORT_MIN_PKT		0x80
630 
631 /* TX general registers */
632 #define MVPP22_TX_FIFO_SIZE_REG(eth_tx_port)	(0x8860 + ((eth_tx_port) << 2))
633 #define MVPP22_TX_FIFO_SIZE_MASK		0xf
634 
635 /* TX FIFO constants */
636 #define MVPP2_TX_FIFO_DATA_SIZE_10KB		0xa
637 #define MVPP2_TX_FIFO_DATA_SIZE_3KB		0x3
638 
639 /* RX buffer constants */
640 #define MVPP2_SKB_SHINFO_SIZE \
641 	0
642 
643 #define MVPP2_RX_PKT_SIZE(mtu) \
644 	ALIGN((mtu) + MVPP2_MH_SIZE + MVPP2_VLAN_TAG_LEN + \
645 	      ETH_HLEN + ETH_FCS_LEN, MVPP2_CPU_D_CACHE_LINE_SIZE)
646 
647 #define MVPP2_RX_BUF_SIZE(pkt_size)	((pkt_size) + NET_SKB_PAD)
648 #define MVPP2_RX_TOTAL_SIZE(buf_size)	((buf_size) + MVPP2_SKB_SHINFO_SIZE)
649 #define MVPP2_RX_MAX_PKT_SIZE(total_size) \
650 	((total_size) - NET_SKB_PAD - MVPP2_SKB_SHINFO_SIZE)
651 
652 #define MVPP2_BIT_TO_BYTE(bit)		((bit) / 8)
653 
654 /* IPv6 max L3 address size */
655 #define MVPP2_MAX_L3_ADDR_SIZE		16
656 
657 /* Port flags */
658 #define MVPP2_F_LOOPBACK		BIT(0)
659 
660 /* Marvell tag types */
661 enum mvpp2_tag_type {
662 	MVPP2_TAG_TYPE_NONE = 0,
663 	MVPP2_TAG_TYPE_MH   = 1,
664 	MVPP2_TAG_TYPE_DSA  = 2,
665 	MVPP2_TAG_TYPE_EDSA = 3,
666 	MVPP2_TAG_TYPE_VLAN = 4,
667 	MVPP2_TAG_TYPE_LAST = 5
668 };
669 
670 /* Parser constants */
671 #define MVPP2_PRS_TCAM_SRAM_SIZE	256
672 #define MVPP2_PRS_TCAM_WORDS		6
673 #define MVPP2_PRS_SRAM_WORDS		4
674 #define MVPP2_PRS_FLOW_ID_SIZE		64
675 #define MVPP2_PRS_FLOW_ID_MASK		0x3f
676 #define MVPP2_PRS_TCAM_ENTRY_INVALID	1
677 #define MVPP2_PRS_TCAM_DSA_TAGGED_BIT	BIT(5)
678 #define MVPP2_PRS_IPV4_HEAD		0x40
679 #define MVPP2_PRS_IPV4_HEAD_MASK	0xf0
680 #define MVPP2_PRS_IPV4_MC		0xe0
681 #define MVPP2_PRS_IPV4_MC_MASK		0xf0
682 #define MVPP2_PRS_IPV4_BC_MASK		0xff
683 #define MVPP2_PRS_IPV4_IHL		0x5
684 #define MVPP2_PRS_IPV4_IHL_MASK		0xf
685 #define MVPP2_PRS_IPV6_MC		0xff
686 #define MVPP2_PRS_IPV6_MC_MASK		0xff
687 #define MVPP2_PRS_IPV6_HOP_MASK		0xff
688 #define MVPP2_PRS_TCAM_PROTO_MASK	0xff
689 #define MVPP2_PRS_TCAM_PROTO_MASK_L	0x3f
690 #define MVPP2_PRS_DBL_VLANS_MAX		100
691 
692 /* Tcam structure:
693  * - lookup ID - 4 bits
694  * - port ID - 1 byte
695  * - additional information - 1 byte
696  * - header data - 8 bytes
697  * The fields are represented by MVPP2_PRS_TCAM_DATA_REG(5)->(0).
698  */
699 #define MVPP2_PRS_AI_BITS			8
700 #define MVPP2_PRS_PORT_MASK			0xff
701 #define MVPP2_PRS_LU_MASK			0xf
702 #define MVPP2_PRS_TCAM_DATA_BYTE(offs)		\
703 				    (((offs) - ((offs) % 2)) * 2 + ((offs) % 2))
704 #define MVPP2_PRS_TCAM_DATA_BYTE_EN(offs)	\
705 					      (((offs) * 2) - ((offs) % 2)  + 2)
706 #define MVPP2_PRS_TCAM_AI_BYTE			16
707 #define MVPP2_PRS_TCAM_PORT_BYTE		17
708 #define MVPP2_PRS_TCAM_LU_BYTE			20
709 #define MVPP2_PRS_TCAM_EN_OFFS(offs)		((offs) + 2)
710 #define MVPP2_PRS_TCAM_INV_WORD			5
711 /* Tcam entries ID */
712 #define MVPP2_PE_DROP_ALL		0
713 #define MVPP2_PE_FIRST_FREE_TID		1
714 #define MVPP2_PE_LAST_FREE_TID		(MVPP2_PRS_TCAM_SRAM_SIZE - 31)
715 #define MVPP2_PE_IP6_EXT_PROTO_UN	(MVPP2_PRS_TCAM_SRAM_SIZE - 30)
716 #define MVPP2_PE_MAC_MC_IP6		(MVPP2_PRS_TCAM_SRAM_SIZE - 29)
717 #define MVPP2_PE_IP6_ADDR_UN		(MVPP2_PRS_TCAM_SRAM_SIZE - 28)
718 #define MVPP2_PE_IP4_ADDR_UN		(MVPP2_PRS_TCAM_SRAM_SIZE - 27)
719 #define MVPP2_PE_LAST_DEFAULT_FLOW	(MVPP2_PRS_TCAM_SRAM_SIZE - 26)
720 #define MVPP2_PE_FIRST_DEFAULT_FLOW	(MVPP2_PRS_TCAM_SRAM_SIZE - 19)
721 #define MVPP2_PE_EDSA_TAGGED		(MVPP2_PRS_TCAM_SRAM_SIZE - 18)
722 #define MVPP2_PE_EDSA_UNTAGGED		(MVPP2_PRS_TCAM_SRAM_SIZE - 17)
723 #define MVPP2_PE_DSA_TAGGED		(MVPP2_PRS_TCAM_SRAM_SIZE - 16)
724 #define MVPP2_PE_DSA_UNTAGGED		(MVPP2_PRS_TCAM_SRAM_SIZE - 15)
725 #define MVPP2_PE_ETYPE_EDSA_TAGGED	(MVPP2_PRS_TCAM_SRAM_SIZE - 14)
726 #define MVPP2_PE_ETYPE_EDSA_UNTAGGED	(MVPP2_PRS_TCAM_SRAM_SIZE - 13)
727 #define MVPP2_PE_ETYPE_DSA_TAGGED	(MVPP2_PRS_TCAM_SRAM_SIZE - 12)
728 #define MVPP2_PE_ETYPE_DSA_UNTAGGED	(MVPP2_PRS_TCAM_SRAM_SIZE - 11)
729 #define MVPP2_PE_MH_DEFAULT		(MVPP2_PRS_TCAM_SRAM_SIZE - 10)
730 #define MVPP2_PE_DSA_DEFAULT		(MVPP2_PRS_TCAM_SRAM_SIZE - 9)
731 #define MVPP2_PE_IP6_PROTO_UN		(MVPP2_PRS_TCAM_SRAM_SIZE - 8)
732 #define MVPP2_PE_IP4_PROTO_UN		(MVPP2_PRS_TCAM_SRAM_SIZE - 7)
733 #define MVPP2_PE_ETH_TYPE_UN		(MVPP2_PRS_TCAM_SRAM_SIZE - 6)
734 #define MVPP2_PE_VLAN_DBL		(MVPP2_PRS_TCAM_SRAM_SIZE - 5)
735 #define MVPP2_PE_VLAN_NONE		(MVPP2_PRS_TCAM_SRAM_SIZE - 4)
736 #define MVPP2_PE_MAC_MC_ALL		(MVPP2_PRS_TCAM_SRAM_SIZE - 3)
737 #define MVPP2_PE_MAC_PROMISCUOUS	(MVPP2_PRS_TCAM_SRAM_SIZE - 2)
738 #define MVPP2_PE_MAC_NON_PROMISCUOUS	(MVPP2_PRS_TCAM_SRAM_SIZE - 1)
739 
740 /* Sram structure
741  * The fields are represented by MVPP2_PRS_TCAM_DATA_REG(3)->(0).
742  */
743 #define MVPP2_PRS_SRAM_RI_OFFS			0
744 #define MVPP2_PRS_SRAM_RI_WORD			0
745 #define MVPP2_PRS_SRAM_RI_CTRL_OFFS		32
746 #define MVPP2_PRS_SRAM_RI_CTRL_WORD		1
747 #define MVPP2_PRS_SRAM_RI_CTRL_BITS		32
748 #define MVPP2_PRS_SRAM_SHIFT_OFFS		64
749 #define MVPP2_PRS_SRAM_SHIFT_SIGN_BIT		72
750 #define MVPP2_PRS_SRAM_UDF_OFFS			73
751 #define MVPP2_PRS_SRAM_UDF_BITS			8
752 #define MVPP2_PRS_SRAM_UDF_MASK			0xff
753 #define MVPP2_PRS_SRAM_UDF_SIGN_BIT		81
754 #define MVPP2_PRS_SRAM_UDF_TYPE_OFFS		82
755 #define MVPP2_PRS_SRAM_UDF_TYPE_MASK		0x7
756 #define MVPP2_PRS_SRAM_UDF_TYPE_L3		1
757 #define MVPP2_PRS_SRAM_UDF_TYPE_L4		4
758 #define MVPP2_PRS_SRAM_OP_SEL_SHIFT_OFFS	85
759 #define MVPP2_PRS_SRAM_OP_SEL_SHIFT_MASK	0x3
760 #define MVPP2_PRS_SRAM_OP_SEL_SHIFT_ADD		1
761 #define MVPP2_PRS_SRAM_OP_SEL_SHIFT_IP4_ADD	2
762 #define MVPP2_PRS_SRAM_OP_SEL_SHIFT_IP6_ADD	3
763 #define MVPP2_PRS_SRAM_OP_SEL_UDF_OFFS		87
764 #define MVPP2_PRS_SRAM_OP_SEL_UDF_BITS		2
765 #define MVPP2_PRS_SRAM_OP_SEL_UDF_MASK		0x3
766 #define MVPP2_PRS_SRAM_OP_SEL_UDF_ADD		0
767 #define MVPP2_PRS_SRAM_OP_SEL_UDF_IP4_ADD	2
768 #define MVPP2_PRS_SRAM_OP_SEL_UDF_IP6_ADD	3
769 #define MVPP2_PRS_SRAM_OP_SEL_BASE_OFFS		89
770 #define MVPP2_PRS_SRAM_AI_OFFS			90
771 #define MVPP2_PRS_SRAM_AI_CTRL_OFFS		98
772 #define MVPP2_PRS_SRAM_AI_CTRL_BITS		8
773 #define MVPP2_PRS_SRAM_AI_MASK			0xff
774 #define MVPP2_PRS_SRAM_NEXT_LU_OFFS		106
775 #define MVPP2_PRS_SRAM_NEXT_LU_MASK		0xf
776 #define MVPP2_PRS_SRAM_LU_DONE_BIT		110
777 #define MVPP2_PRS_SRAM_LU_GEN_BIT		111
778 
779 /* Sram result info bits assignment */
780 #define MVPP2_PRS_RI_MAC_ME_MASK		0x1
781 #define MVPP2_PRS_RI_DSA_MASK			0x2
782 #define MVPP2_PRS_RI_VLAN_MASK			(BIT(2) | BIT(3))
783 #define MVPP2_PRS_RI_VLAN_NONE			0x0
784 #define MVPP2_PRS_RI_VLAN_SINGLE		BIT(2)
785 #define MVPP2_PRS_RI_VLAN_DOUBLE		BIT(3)
786 #define MVPP2_PRS_RI_VLAN_TRIPLE		(BIT(2) | BIT(3))
787 #define MVPP2_PRS_RI_CPU_CODE_MASK		0x70
788 #define MVPP2_PRS_RI_CPU_CODE_RX_SPEC		BIT(4)
789 #define MVPP2_PRS_RI_L2_CAST_MASK		(BIT(9) | BIT(10))
790 #define MVPP2_PRS_RI_L2_UCAST			0x0
791 #define MVPP2_PRS_RI_L2_MCAST			BIT(9)
792 #define MVPP2_PRS_RI_L2_BCAST			BIT(10)
793 #define MVPP2_PRS_RI_PPPOE_MASK			0x800
794 #define MVPP2_PRS_RI_L3_PROTO_MASK		(BIT(12) | BIT(13) | BIT(14))
795 #define MVPP2_PRS_RI_L3_UN			0x0
796 #define MVPP2_PRS_RI_L3_IP4			BIT(12)
797 #define MVPP2_PRS_RI_L3_IP4_OPT			BIT(13)
798 #define MVPP2_PRS_RI_L3_IP4_OTHER		(BIT(12) | BIT(13))
799 #define MVPP2_PRS_RI_L3_IP6			BIT(14)
800 #define MVPP2_PRS_RI_L3_IP6_EXT			(BIT(12) | BIT(14))
801 #define MVPP2_PRS_RI_L3_ARP			(BIT(13) | BIT(14))
802 #define MVPP2_PRS_RI_L3_ADDR_MASK		(BIT(15) | BIT(16))
803 #define MVPP2_PRS_RI_L3_UCAST			0x0
804 #define MVPP2_PRS_RI_L3_MCAST			BIT(15)
805 #define MVPP2_PRS_RI_L3_BCAST			(BIT(15) | BIT(16))
806 #define MVPP2_PRS_RI_IP_FRAG_MASK		0x20000
807 #define MVPP2_PRS_RI_UDF3_MASK			0x300000
808 #define MVPP2_PRS_RI_UDF3_RX_SPECIAL		BIT(21)
809 #define MVPP2_PRS_RI_L4_PROTO_MASK		0x1c00000
810 #define MVPP2_PRS_RI_L4_TCP			BIT(22)
811 #define MVPP2_PRS_RI_L4_UDP			BIT(23)
812 #define MVPP2_PRS_RI_L4_OTHER			(BIT(22) | BIT(23))
813 #define MVPP2_PRS_RI_UDF7_MASK			0x60000000
814 #define MVPP2_PRS_RI_UDF7_IP6_LITE		BIT(29)
815 #define MVPP2_PRS_RI_DROP_MASK			0x80000000
816 
817 /* Sram additional info bits assignment */
818 #define MVPP2_PRS_IPV4_DIP_AI_BIT		BIT(0)
819 #define MVPP2_PRS_IPV6_NO_EXT_AI_BIT		BIT(0)
820 #define MVPP2_PRS_IPV6_EXT_AI_BIT		BIT(1)
821 #define MVPP2_PRS_IPV6_EXT_AH_AI_BIT		BIT(2)
822 #define MVPP2_PRS_IPV6_EXT_AH_LEN_AI_BIT	BIT(3)
823 #define MVPP2_PRS_IPV6_EXT_AH_L4_AI_BIT		BIT(4)
824 #define MVPP2_PRS_SINGLE_VLAN_AI		0
825 #define MVPP2_PRS_DBL_VLAN_AI_BIT		BIT(7)
826 
827 /* DSA/EDSA type */
828 #define MVPP2_PRS_TAGGED		true
829 #define MVPP2_PRS_UNTAGGED		false
830 #define MVPP2_PRS_EDSA			true
831 #define MVPP2_PRS_DSA			false
832 
833 /* MAC entries, shadow udf */
834 enum mvpp2_prs_udf {
835 	MVPP2_PRS_UDF_MAC_DEF,
836 	MVPP2_PRS_UDF_MAC_RANGE,
837 	MVPP2_PRS_UDF_L2_DEF,
838 	MVPP2_PRS_UDF_L2_DEF_COPY,
839 	MVPP2_PRS_UDF_L2_USER,
840 };
841 
842 /* Lookup ID */
843 enum mvpp2_prs_lookup {
844 	MVPP2_PRS_LU_MH,
845 	MVPP2_PRS_LU_MAC,
846 	MVPP2_PRS_LU_DSA,
847 	MVPP2_PRS_LU_VLAN,
848 	MVPP2_PRS_LU_L2,
849 	MVPP2_PRS_LU_PPPOE,
850 	MVPP2_PRS_LU_IP4,
851 	MVPP2_PRS_LU_IP6,
852 	MVPP2_PRS_LU_FLOWS,
853 	MVPP2_PRS_LU_LAST,
854 };
855 
856 /* L3 cast enum */
857 enum mvpp2_prs_l3_cast {
858 	MVPP2_PRS_L3_UNI_CAST,
859 	MVPP2_PRS_L3_MULTI_CAST,
860 	MVPP2_PRS_L3_BROAD_CAST
861 };
862 
863 /* Classifier constants */
864 #define MVPP2_CLS_FLOWS_TBL_SIZE	512
865 #define MVPP2_CLS_FLOWS_TBL_DATA_WORDS	3
866 #define MVPP2_CLS_LKP_TBL_SIZE		64
867 
868 /* BM constants */
869 #define MVPP2_BM_POOLS_NUM		1
870 #define MVPP2_BM_LONG_BUF_NUM		16
871 #define MVPP2_BM_SHORT_BUF_NUM		16
872 #define MVPP2_BM_POOL_SIZE_MAX		(16*1024 - MVPP2_BM_POOL_PTR_ALIGN/4)
873 #define MVPP2_BM_POOL_PTR_ALIGN		128
874 #define MVPP2_BM_SWF_LONG_POOL(port)	0
875 
876 /* BM cookie (32 bits) definition */
877 #define MVPP2_BM_COOKIE_POOL_OFFS	8
878 #define MVPP2_BM_COOKIE_CPU_OFFS	24
879 
880 /* BM short pool packet size
881  * These value assure that for SWF the total number
882  * of bytes allocated for each buffer will be 512
883  */
884 #define MVPP2_BM_SHORT_PKT_SIZE		MVPP2_RX_MAX_PKT_SIZE(512)
885 
886 enum mvpp2_bm_type {
887 	MVPP2_BM_FREE,
888 	MVPP2_BM_SWF_LONG,
889 	MVPP2_BM_SWF_SHORT
890 };
891 
892 /* Definitions */
893 
894 /* Shared Packet Processor resources */
895 struct mvpp2 {
896 	/* Shared registers' base addresses */
897 	void __iomem *base;
898 	void __iomem *lms_base;
899 	void __iomem *iface_base;
900 	void __iomem *mdio_base;
901 
902 	void __iomem *mpcs_base;
903 	void __iomem *xpcs_base;
904 	void __iomem *rfu1_base;
905 
906 	u32 netc_config;
907 
908 	/* List of pointers to port structures */
909 	struct mvpp2_port **port_list;
910 
911 	/* Aggregated TXQs */
912 	struct mvpp2_tx_queue *aggr_txqs;
913 
914 	/* BM pools */
915 	struct mvpp2_bm_pool *bm_pools;
916 
917 	/* PRS shadow table */
918 	struct mvpp2_prs_shadow *prs_shadow;
919 	/* PRS auxiliary table for double vlan entries control */
920 	bool *prs_double_vlans;
921 
922 	/* Tclk value */
923 	u32 tclk;
924 
925 	/* HW version */
926 	enum { MVPP21, MVPP22 } hw_version;
927 
928 	/* Maximum number of RXQs per port */
929 	unsigned int max_port_rxqs;
930 
931 	struct mii_dev *bus;
932 
933 	int probe_done;
934 	u8 num_ports;
935 };
936 
937 struct mvpp2_pcpu_stats {
938 	u64	rx_packets;
939 	u64	rx_bytes;
940 	u64	tx_packets;
941 	u64	tx_bytes;
942 };
943 
944 struct mvpp2_port {
945 	u8 id;
946 
947 	/* Index of the port from the "group of ports" complex point
948 	 * of view
949 	 */
950 	int gop_id;
951 
952 	int irq;
953 
954 	struct mvpp2 *priv;
955 
956 	/* Per-port registers' base address */
957 	void __iomem *base;
958 
959 	struct mvpp2_rx_queue **rxqs;
960 	struct mvpp2_tx_queue **txqs;
961 
962 	int pkt_size;
963 
964 	u32 pending_cause_rx;
965 
966 	/* Per-CPU port control */
967 	struct mvpp2_port_pcpu __percpu *pcpu;
968 
969 	/* Flags */
970 	unsigned long flags;
971 
972 	u16 tx_ring_size;
973 	u16 rx_ring_size;
974 	struct mvpp2_pcpu_stats __percpu *stats;
975 
976 	struct phy_device *phy_dev;
977 	phy_interface_t phy_interface;
978 	int phy_node;
979 	int phyaddr;
980 #ifdef CONFIG_DM_GPIO
981 	struct gpio_desc phy_reset_gpio;
982 	struct gpio_desc phy_tx_disable_gpio;
983 #endif
984 	int init;
985 	unsigned int link;
986 	unsigned int duplex;
987 	unsigned int speed;
988 
989 	unsigned int phy_speed;		/* SGMII 1Gbps vs 2.5Gbps */
990 
991 	struct mvpp2_bm_pool *pool_long;
992 	struct mvpp2_bm_pool *pool_short;
993 
994 	/* Index of first port's physical RXQ */
995 	u8 first_rxq;
996 
997 	u8 dev_addr[ETH_ALEN];
998 };
999 
1000 /* The mvpp2_tx_desc and mvpp2_rx_desc structures describe the
1001  * layout of the transmit and reception DMA descriptors, and their
1002  * layout is therefore defined by the hardware design
1003  */
1004 
1005 #define MVPP2_TXD_L3_OFF_SHIFT		0
1006 #define MVPP2_TXD_IP_HLEN_SHIFT		8
1007 #define MVPP2_TXD_L4_CSUM_FRAG		BIT(13)
1008 #define MVPP2_TXD_L4_CSUM_NOT		BIT(14)
1009 #define MVPP2_TXD_IP_CSUM_DISABLE	BIT(15)
1010 #define MVPP2_TXD_PADDING_DISABLE	BIT(23)
1011 #define MVPP2_TXD_L4_UDP		BIT(24)
1012 #define MVPP2_TXD_L3_IP6		BIT(26)
1013 #define MVPP2_TXD_L_DESC		BIT(28)
1014 #define MVPP2_TXD_F_DESC		BIT(29)
1015 
1016 #define MVPP2_RXD_ERR_SUMMARY		BIT(15)
1017 #define MVPP2_RXD_ERR_CODE_MASK		(BIT(13) | BIT(14))
1018 #define MVPP2_RXD_ERR_CRC		0x0
1019 #define MVPP2_RXD_ERR_OVERRUN		BIT(13)
1020 #define MVPP2_RXD_ERR_RESOURCE		(BIT(13) | BIT(14))
1021 #define MVPP2_RXD_BM_POOL_ID_OFFS	16
1022 #define MVPP2_RXD_BM_POOL_ID_MASK	(BIT(16) | BIT(17) | BIT(18))
1023 #define MVPP2_RXD_HWF_SYNC		BIT(21)
1024 #define MVPP2_RXD_L4_CSUM_OK		BIT(22)
1025 #define MVPP2_RXD_IP4_HEADER_ERR	BIT(24)
1026 #define MVPP2_RXD_L4_TCP		BIT(25)
1027 #define MVPP2_RXD_L4_UDP		BIT(26)
1028 #define MVPP2_RXD_L3_IP4		BIT(28)
1029 #define MVPP2_RXD_L3_IP6		BIT(30)
1030 #define MVPP2_RXD_BUF_HDR		BIT(31)
1031 
1032 /* HW TX descriptor for PPv2.1 */
1033 struct mvpp21_tx_desc {
1034 	u32 command;		/* Options used by HW for packet transmitting.*/
1035 	u8  packet_offset;	/* the offset from the buffer beginning	*/
1036 	u8  phys_txq;		/* destination queue ID			*/
1037 	u16 data_size;		/* data size of transmitted packet in bytes */
1038 	u32 buf_dma_addr;	/* physical addr of transmitted buffer	*/
1039 	u32 buf_cookie;		/* cookie for access to TX buffer in tx path */
1040 	u32 reserved1[3];	/* hw_cmd (for future use, BM, PON, PNC) */
1041 	u32 reserved2;		/* reserved (for future use)		*/
1042 };
1043 
1044 /* HW RX descriptor for PPv2.1 */
1045 struct mvpp21_rx_desc {
1046 	u32 status;		/* info about received packet		*/
1047 	u16 reserved1;		/* parser_info (for future use, PnC)	*/
1048 	u16 data_size;		/* size of received packet in bytes	*/
1049 	u32 buf_dma_addr;	/* physical address of the buffer	*/
1050 	u32 buf_cookie;		/* cookie for access to RX buffer in rx path */
1051 	u16 reserved2;		/* gem_port_id (for future use, PON)	*/
1052 	u16 reserved3;		/* csum_l4 (for future use, PnC)	*/
1053 	u8  reserved4;		/* bm_qset (for future use, BM)		*/
1054 	u8  reserved5;
1055 	u16 reserved6;		/* classify_info (for future use, PnC)	*/
1056 	u32 reserved7;		/* flow_id (for future use, PnC) */
1057 	u32 reserved8;
1058 };
1059 
1060 /* HW TX descriptor for PPv2.2 */
1061 struct mvpp22_tx_desc {
1062 	u32 command;
1063 	u8  packet_offset;
1064 	u8  phys_txq;
1065 	u16 data_size;
1066 	u64 reserved1;
1067 	u64 buf_dma_addr_ptp;
1068 	u64 buf_cookie_misc;
1069 };
1070 
1071 /* HW RX descriptor for PPv2.2 */
1072 struct mvpp22_rx_desc {
1073 	u32 status;
1074 	u16 reserved1;
1075 	u16 data_size;
1076 	u32 reserved2;
1077 	u32 reserved3;
1078 	u64 buf_dma_addr_key_hash;
1079 	u64 buf_cookie_misc;
1080 };
1081 
1082 /* Opaque type used by the driver to manipulate the HW TX and RX
1083  * descriptors
1084  */
1085 struct mvpp2_tx_desc {
1086 	union {
1087 		struct mvpp21_tx_desc pp21;
1088 		struct mvpp22_tx_desc pp22;
1089 	};
1090 };
1091 
1092 struct mvpp2_rx_desc {
1093 	union {
1094 		struct mvpp21_rx_desc pp21;
1095 		struct mvpp22_rx_desc pp22;
1096 	};
1097 };
1098 
1099 /* Per-CPU Tx queue control */
1100 struct mvpp2_txq_pcpu {
1101 	int cpu;
1102 
1103 	/* Number of Tx DMA descriptors in the descriptor ring */
1104 	int size;
1105 
1106 	/* Number of currently used Tx DMA descriptor in the
1107 	 * descriptor ring
1108 	 */
1109 	int count;
1110 
1111 	/* Number of Tx DMA descriptors reserved for each CPU */
1112 	int reserved_num;
1113 
1114 	/* Index of last TX DMA descriptor that was inserted */
1115 	int txq_put_index;
1116 
1117 	/* Index of the TX DMA descriptor to be cleaned up */
1118 	int txq_get_index;
1119 };
1120 
1121 struct mvpp2_tx_queue {
1122 	/* Physical number of this Tx queue */
1123 	u8 id;
1124 
1125 	/* Logical number of this Tx queue */
1126 	u8 log_id;
1127 
1128 	/* Number of Tx DMA descriptors in the descriptor ring */
1129 	int size;
1130 
1131 	/* Number of currently used Tx DMA descriptor in the descriptor ring */
1132 	int count;
1133 
1134 	/* Per-CPU control of physical Tx queues */
1135 	struct mvpp2_txq_pcpu __percpu *pcpu;
1136 
1137 	u32 done_pkts_coal;
1138 
1139 	/* Virtual address of thex Tx DMA descriptors array */
1140 	struct mvpp2_tx_desc *descs;
1141 
1142 	/* DMA address of the Tx DMA descriptors array */
1143 	dma_addr_t descs_dma;
1144 
1145 	/* Index of the last Tx DMA descriptor */
1146 	int last_desc;
1147 
1148 	/* Index of the next Tx DMA descriptor to process */
1149 	int next_desc_to_proc;
1150 };
1151 
1152 struct mvpp2_rx_queue {
1153 	/* RX queue number, in the range 0-31 for physical RXQs */
1154 	u8 id;
1155 
1156 	/* Num of rx descriptors in the rx descriptor ring */
1157 	int size;
1158 
1159 	u32 pkts_coal;
1160 	u32 time_coal;
1161 
1162 	/* Virtual address of the RX DMA descriptors array */
1163 	struct mvpp2_rx_desc *descs;
1164 
1165 	/* DMA address of the RX DMA descriptors array */
1166 	dma_addr_t descs_dma;
1167 
1168 	/* Index of the last RX DMA descriptor */
1169 	int last_desc;
1170 
1171 	/* Index of the next RX DMA descriptor to process */
1172 	int next_desc_to_proc;
1173 
1174 	/* ID of port to which physical RXQ is mapped */
1175 	int port;
1176 
1177 	/* Port's logic RXQ number to which physical RXQ is mapped */
1178 	int logic_rxq;
1179 };
1180 
1181 union mvpp2_prs_tcam_entry {
1182 	u32 word[MVPP2_PRS_TCAM_WORDS];
1183 	u8  byte[MVPP2_PRS_TCAM_WORDS * 4];
1184 };
1185 
1186 union mvpp2_prs_sram_entry {
1187 	u32 word[MVPP2_PRS_SRAM_WORDS];
1188 	u8  byte[MVPP2_PRS_SRAM_WORDS * 4];
1189 };
1190 
1191 struct mvpp2_prs_entry {
1192 	u32 index;
1193 	union mvpp2_prs_tcam_entry tcam;
1194 	union mvpp2_prs_sram_entry sram;
1195 };
1196 
1197 struct mvpp2_prs_shadow {
1198 	bool valid;
1199 	bool finish;
1200 
1201 	/* Lookup ID */
1202 	int lu;
1203 
1204 	/* User defined offset */
1205 	int udf;
1206 
1207 	/* Result info */
1208 	u32 ri;
1209 	u32 ri_mask;
1210 };
1211 
1212 struct mvpp2_cls_flow_entry {
1213 	u32 index;
1214 	u32 data[MVPP2_CLS_FLOWS_TBL_DATA_WORDS];
1215 };
1216 
1217 struct mvpp2_cls_lookup_entry {
1218 	u32 lkpid;
1219 	u32 way;
1220 	u32 data;
1221 };
1222 
1223 struct mvpp2_bm_pool {
1224 	/* Pool number in the range 0-7 */
1225 	int id;
1226 	enum mvpp2_bm_type type;
1227 
1228 	/* Buffer Pointers Pool External (BPPE) size */
1229 	int size;
1230 	/* Number of buffers for this pool */
1231 	int buf_num;
1232 	/* Pool buffer size */
1233 	int buf_size;
1234 	/* Packet size */
1235 	int pkt_size;
1236 
1237 	/* BPPE virtual base address */
1238 	unsigned long *virt_addr;
1239 	/* BPPE DMA base address */
1240 	dma_addr_t dma_addr;
1241 
1242 	/* Ports using BM pool */
1243 	u32 port_map;
1244 };
1245 
1246 /* Static declaractions */
1247 
1248 /* Number of RXQs used by single port */
1249 static int rxq_number = MVPP2_DEFAULT_RXQ;
1250 /* Number of TXQs used by single port */
1251 static int txq_number = MVPP2_DEFAULT_TXQ;
1252 
1253 static int base_id;
1254 
1255 #define MVPP2_DRIVER_NAME "mvpp2"
1256 #define MVPP2_DRIVER_VERSION "1.0"
1257 
1258 /*
1259  * U-Boot internal data, mostly uncached buffers for descriptors and data
1260  */
1261 struct buffer_location {
1262 	struct mvpp2_tx_desc *aggr_tx_descs;
1263 	struct mvpp2_tx_desc *tx_descs;
1264 	struct mvpp2_rx_desc *rx_descs;
1265 	unsigned long *bm_pool[MVPP2_BM_POOLS_NUM];
1266 	unsigned long *rx_buffer[MVPP2_BM_LONG_BUF_NUM];
1267 	int first_rxq;
1268 };
1269 
1270 /*
1271  * All 4 interfaces use the same global buffer, since only one interface
1272  * can be enabled at once
1273  */
1274 static struct buffer_location buffer_loc;
1275 
1276 /*
1277  * Page table entries are set to 1MB, or multiples of 1MB
1278  * (not < 1MB). driver uses less bd's so use 1MB bdspace.
1279  */
1280 #define BD_SPACE	(1 << 20)
1281 
1282 /* Utility/helper methods */
1283 
1284 static void mvpp2_write(struct mvpp2 *priv, u32 offset, u32 data)
1285 {
1286 	writel(data, priv->base + offset);
1287 }
1288 
1289 static u32 mvpp2_read(struct mvpp2 *priv, u32 offset)
1290 {
1291 	return readl(priv->base + offset);
1292 }
1293 
1294 static void mvpp2_txdesc_dma_addr_set(struct mvpp2_port *port,
1295 				      struct mvpp2_tx_desc *tx_desc,
1296 				      dma_addr_t dma_addr)
1297 {
1298 	if (port->priv->hw_version == MVPP21) {
1299 		tx_desc->pp21.buf_dma_addr = dma_addr;
1300 	} else {
1301 		u64 val = (u64)dma_addr;
1302 
1303 		tx_desc->pp22.buf_dma_addr_ptp &= ~GENMASK_ULL(40, 0);
1304 		tx_desc->pp22.buf_dma_addr_ptp |= val;
1305 	}
1306 }
1307 
1308 static void mvpp2_txdesc_size_set(struct mvpp2_port *port,
1309 				  struct mvpp2_tx_desc *tx_desc,
1310 				  size_t size)
1311 {
1312 	if (port->priv->hw_version == MVPP21)
1313 		tx_desc->pp21.data_size = size;
1314 	else
1315 		tx_desc->pp22.data_size = size;
1316 }
1317 
1318 static void mvpp2_txdesc_txq_set(struct mvpp2_port *port,
1319 				 struct mvpp2_tx_desc *tx_desc,
1320 				 unsigned int txq)
1321 {
1322 	if (port->priv->hw_version == MVPP21)
1323 		tx_desc->pp21.phys_txq = txq;
1324 	else
1325 		tx_desc->pp22.phys_txq = txq;
1326 }
1327 
1328 static void mvpp2_txdesc_cmd_set(struct mvpp2_port *port,
1329 				 struct mvpp2_tx_desc *tx_desc,
1330 				 unsigned int command)
1331 {
1332 	if (port->priv->hw_version == MVPP21)
1333 		tx_desc->pp21.command = command;
1334 	else
1335 		tx_desc->pp22.command = command;
1336 }
1337 
1338 static void mvpp2_txdesc_offset_set(struct mvpp2_port *port,
1339 				    struct mvpp2_tx_desc *tx_desc,
1340 				    unsigned int offset)
1341 {
1342 	if (port->priv->hw_version == MVPP21)
1343 		tx_desc->pp21.packet_offset = offset;
1344 	else
1345 		tx_desc->pp22.packet_offset = offset;
1346 }
1347 
1348 static dma_addr_t mvpp2_rxdesc_dma_addr_get(struct mvpp2_port *port,
1349 					    struct mvpp2_rx_desc *rx_desc)
1350 {
1351 	if (port->priv->hw_version == MVPP21)
1352 		return rx_desc->pp21.buf_dma_addr;
1353 	else
1354 		return rx_desc->pp22.buf_dma_addr_key_hash & GENMASK_ULL(40, 0);
1355 }
1356 
1357 static unsigned long mvpp2_rxdesc_cookie_get(struct mvpp2_port *port,
1358 					     struct mvpp2_rx_desc *rx_desc)
1359 {
1360 	if (port->priv->hw_version == MVPP21)
1361 		return rx_desc->pp21.buf_cookie;
1362 	else
1363 		return rx_desc->pp22.buf_cookie_misc & GENMASK_ULL(40, 0);
1364 }
1365 
1366 static size_t mvpp2_rxdesc_size_get(struct mvpp2_port *port,
1367 				    struct mvpp2_rx_desc *rx_desc)
1368 {
1369 	if (port->priv->hw_version == MVPP21)
1370 		return rx_desc->pp21.data_size;
1371 	else
1372 		return rx_desc->pp22.data_size;
1373 }
1374 
1375 static u32 mvpp2_rxdesc_status_get(struct mvpp2_port *port,
1376 				   struct mvpp2_rx_desc *rx_desc)
1377 {
1378 	if (port->priv->hw_version == MVPP21)
1379 		return rx_desc->pp21.status;
1380 	else
1381 		return rx_desc->pp22.status;
1382 }
1383 
1384 static void mvpp2_txq_inc_get(struct mvpp2_txq_pcpu *txq_pcpu)
1385 {
1386 	txq_pcpu->txq_get_index++;
1387 	if (txq_pcpu->txq_get_index == txq_pcpu->size)
1388 		txq_pcpu->txq_get_index = 0;
1389 }
1390 
1391 /* Get number of physical egress port */
1392 static inline int mvpp2_egress_port(struct mvpp2_port *port)
1393 {
1394 	return MVPP2_MAX_TCONT + port->id;
1395 }
1396 
1397 /* Get number of physical TXQ */
1398 static inline int mvpp2_txq_phys(int port, int txq)
1399 {
1400 	return (MVPP2_MAX_TCONT + port) * MVPP2_MAX_TXQ + txq;
1401 }
1402 
1403 /* Parser configuration routines */
1404 
1405 /* Update parser tcam and sram hw entries */
1406 static int mvpp2_prs_hw_write(struct mvpp2 *priv, struct mvpp2_prs_entry *pe)
1407 {
1408 	int i;
1409 
1410 	if (pe->index > MVPP2_PRS_TCAM_SRAM_SIZE - 1)
1411 		return -EINVAL;
1412 
1413 	/* Clear entry invalidation bit */
1414 	pe->tcam.word[MVPP2_PRS_TCAM_INV_WORD] &= ~MVPP2_PRS_TCAM_INV_MASK;
1415 
1416 	/* Write tcam index - indirect access */
1417 	mvpp2_write(priv, MVPP2_PRS_TCAM_IDX_REG, pe->index);
1418 	for (i = 0; i < MVPP2_PRS_TCAM_WORDS; i++)
1419 		mvpp2_write(priv, MVPP2_PRS_TCAM_DATA_REG(i), pe->tcam.word[i]);
1420 
1421 	/* Write sram index - indirect access */
1422 	mvpp2_write(priv, MVPP2_PRS_SRAM_IDX_REG, pe->index);
1423 	for (i = 0; i < MVPP2_PRS_SRAM_WORDS; i++)
1424 		mvpp2_write(priv, MVPP2_PRS_SRAM_DATA_REG(i), pe->sram.word[i]);
1425 
1426 	return 0;
1427 }
1428 
1429 /* Read tcam entry from hw */
1430 static int mvpp2_prs_hw_read(struct mvpp2 *priv, struct mvpp2_prs_entry *pe)
1431 {
1432 	int i;
1433 
1434 	if (pe->index > MVPP2_PRS_TCAM_SRAM_SIZE - 1)
1435 		return -EINVAL;
1436 
1437 	/* Write tcam index - indirect access */
1438 	mvpp2_write(priv, MVPP2_PRS_TCAM_IDX_REG, pe->index);
1439 
1440 	pe->tcam.word[MVPP2_PRS_TCAM_INV_WORD] = mvpp2_read(priv,
1441 			      MVPP2_PRS_TCAM_DATA_REG(MVPP2_PRS_TCAM_INV_WORD));
1442 	if (pe->tcam.word[MVPP2_PRS_TCAM_INV_WORD] & MVPP2_PRS_TCAM_INV_MASK)
1443 		return MVPP2_PRS_TCAM_ENTRY_INVALID;
1444 
1445 	for (i = 0; i < MVPP2_PRS_TCAM_WORDS; i++)
1446 		pe->tcam.word[i] = mvpp2_read(priv, MVPP2_PRS_TCAM_DATA_REG(i));
1447 
1448 	/* Write sram index - indirect access */
1449 	mvpp2_write(priv, MVPP2_PRS_SRAM_IDX_REG, pe->index);
1450 	for (i = 0; i < MVPP2_PRS_SRAM_WORDS; i++)
1451 		pe->sram.word[i] = mvpp2_read(priv, MVPP2_PRS_SRAM_DATA_REG(i));
1452 
1453 	return 0;
1454 }
1455 
1456 /* Invalidate tcam hw entry */
1457 static void mvpp2_prs_hw_inv(struct mvpp2 *priv, int index)
1458 {
1459 	/* Write index - indirect access */
1460 	mvpp2_write(priv, MVPP2_PRS_TCAM_IDX_REG, index);
1461 	mvpp2_write(priv, MVPP2_PRS_TCAM_DATA_REG(MVPP2_PRS_TCAM_INV_WORD),
1462 		    MVPP2_PRS_TCAM_INV_MASK);
1463 }
1464 
1465 /* Enable shadow table entry and set its lookup ID */
1466 static void mvpp2_prs_shadow_set(struct mvpp2 *priv, int index, int lu)
1467 {
1468 	priv->prs_shadow[index].valid = true;
1469 	priv->prs_shadow[index].lu = lu;
1470 }
1471 
1472 /* Update ri fields in shadow table entry */
1473 static void mvpp2_prs_shadow_ri_set(struct mvpp2 *priv, int index,
1474 				    unsigned int ri, unsigned int ri_mask)
1475 {
1476 	priv->prs_shadow[index].ri_mask = ri_mask;
1477 	priv->prs_shadow[index].ri = ri;
1478 }
1479 
1480 /* Update lookup field in tcam sw entry */
1481 static void mvpp2_prs_tcam_lu_set(struct mvpp2_prs_entry *pe, unsigned int lu)
1482 {
1483 	int enable_off = MVPP2_PRS_TCAM_EN_OFFS(MVPP2_PRS_TCAM_LU_BYTE);
1484 
1485 	pe->tcam.byte[MVPP2_PRS_TCAM_LU_BYTE] = lu;
1486 	pe->tcam.byte[enable_off] = MVPP2_PRS_LU_MASK;
1487 }
1488 
1489 /* Update mask for single port in tcam sw entry */
1490 static void mvpp2_prs_tcam_port_set(struct mvpp2_prs_entry *pe,
1491 				    unsigned int port, bool add)
1492 {
1493 	int enable_off = MVPP2_PRS_TCAM_EN_OFFS(MVPP2_PRS_TCAM_PORT_BYTE);
1494 
1495 	if (add)
1496 		pe->tcam.byte[enable_off] &= ~(1 << port);
1497 	else
1498 		pe->tcam.byte[enable_off] |= 1 << port;
1499 }
1500 
1501 /* Update port map in tcam sw entry */
1502 static void mvpp2_prs_tcam_port_map_set(struct mvpp2_prs_entry *pe,
1503 					unsigned int ports)
1504 {
1505 	unsigned char port_mask = MVPP2_PRS_PORT_MASK;
1506 	int enable_off = MVPP2_PRS_TCAM_EN_OFFS(MVPP2_PRS_TCAM_PORT_BYTE);
1507 
1508 	pe->tcam.byte[MVPP2_PRS_TCAM_PORT_BYTE] = 0;
1509 	pe->tcam.byte[enable_off] &= ~port_mask;
1510 	pe->tcam.byte[enable_off] |= ~ports & MVPP2_PRS_PORT_MASK;
1511 }
1512 
1513 /* Obtain port map from tcam sw entry */
1514 static unsigned int mvpp2_prs_tcam_port_map_get(struct mvpp2_prs_entry *pe)
1515 {
1516 	int enable_off = MVPP2_PRS_TCAM_EN_OFFS(MVPP2_PRS_TCAM_PORT_BYTE);
1517 
1518 	return ~(pe->tcam.byte[enable_off]) & MVPP2_PRS_PORT_MASK;
1519 }
1520 
1521 /* Set byte of data and its enable bits in tcam sw entry */
1522 static void mvpp2_prs_tcam_data_byte_set(struct mvpp2_prs_entry *pe,
1523 					 unsigned int offs, unsigned char byte,
1524 					 unsigned char enable)
1525 {
1526 	pe->tcam.byte[MVPP2_PRS_TCAM_DATA_BYTE(offs)] = byte;
1527 	pe->tcam.byte[MVPP2_PRS_TCAM_DATA_BYTE_EN(offs)] = enable;
1528 }
1529 
1530 /* Get byte of data and its enable bits from tcam sw entry */
1531 static void mvpp2_prs_tcam_data_byte_get(struct mvpp2_prs_entry *pe,
1532 					 unsigned int offs, unsigned char *byte,
1533 					 unsigned char *enable)
1534 {
1535 	*byte = pe->tcam.byte[MVPP2_PRS_TCAM_DATA_BYTE(offs)];
1536 	*enable = pe->tcam.byte[MVPP2_PRS_TCAM_DATA_BYTE_EN(offs)];
1537 }
1538 
1539 /* Set ethertype in tcam sw entry */
1540 static void mvpp2_prs_match_etype(struct mvpp2_prs_entry *pe, int offset,
1541 				  unsigned short ethertype)
1542 {
1543 	mvpp2_prs_tcam_data_byte_set(pe, offset + 0, ethertype >> 8, 0xff);
1544 	mvpp2_prs_tcam_data_byte_set(pe, offset + 1, ethertype & 0xff, 0xff);
1545 }
1546 
1547 /* Set bits in sram sw entry */
1548 static void mvpp2_prs_sram_bits_set(struct mvpp2_prs_entry *pe, int bit_num,
1549 				    int val)
1550 {
1551 	pe->sram.byte[MVPP2_BIT_TO_BYTE(bit_num)] |= (val << (bit_num % 8));
1552 }
1553 
1554 /* Clear bits in sram sw entry */
1555 static void mvpp2_prs_sram_bits_clear(struct mvpp2_prs_entry *pe, int bit_num,
1556 				      int val)
1557 {
1558 	pe->sram.byte[MVPP2_BIT_TO_BYTE(bit_num)] &= ~(val << (bit_num % 8));
1559 }
1560 
1561 /* Update ri bits in sram sw entry */
1562 static void mvpp2_prs_sram_ri_update(struct mvpp2_prs_entry *pe,
1563 				     unsigned int bits, unsigned int mask)
1564 {
1565 	unsigned int i;
1566 
1567 	for (i = 0; i < MVPP2_PRS_SRAM_RI_CTRL_BITS; i++) {
1568 		int ri_off = MVPP2_PRS_SRAM_RI_OFFS;
1569 
1570 		if (!(mask & BIT(i)))
1571 			continue;
1572 
1573 		if (bits & BIT(i))
1574 			mvpp2_prs_sram_bits_set(pe, ri_off + i, 1);
1575 		else
1576 			mvpp2_prs_sram_bits_clear(pe, ri_off + i, 1);
1577 
1578 		mvpp2_prs_sram_bits_set(pe, MVPP2_PRS_SRAM_RI_CTRL_OFFS + i, 1);
1579 	}
1580 }
1581 
1582 /* Update ai bits in sram sw entry */
1583 static void mvpp2_prs_sram_ai_update(struct mvpp2_prs_entry *pe,
1584 				     unsigned int bits, unsigned int mask)
1585 {
1586 	unsigned int i;
1587 	int ai_off = MVPP2_PRS_SRAM_AI_OFFS;
1588 
1589 	for (i = 0; i < MVPP2_PRS_SRAM_AI_CTRL_BITS; i++) {
1590 
1591 		if (!(mask & BIT(i)))
1592 			continue;
1593 
1594 		if (bits & BIT(i))
1595 			mvpp2_prs_sram_bits_set(pe, ai_off + i, 1);
1596 		else
1597 			mvpp2_prs_sram_bits_clear(pe, ai_off + i, 1);
1598 
1599 		mvpp2_prs_sram_bits_set(pe, MVPP2_PRS_SRAM_AI_CTRL_OFFS + i, 1);
1600 	}
1601 }
1602 
1603 /* Read ai bits from sram sw entry */
1604 static int mvpp2_prs_sram_ai_get(struct mvpp2_prs_entry *pe)
1605 {
1606 	u8 bits;
1607 	int ai_off = MVPP2_BIT_TO_BYTE(MVPP2_PRS_SRAM_AI_OFFS);
1608 	int ai_en_off = ai_off + 1;
1609 	int ai_shift = MVPP2_PRS_SRAM_AI_OFFS % 8;
1610 
1611 	bits = (pe->sram.byte[ai_off] >> ai_shift) |
1612 	       (pe->sram.byte[ai_en_off] << (8 - ai_shift));
1613 
1614 	return bits;
1615 }
1616 
1617 /* In sram sw entry set lookup ID field of the tcam key to be used in the next
1618  * lookup interation
1619  */
1620 static void mvpp2_prs_sram_next_lu_set(struct mvpp2_prs_entry *pe,
1621 				       unsigned int lu)
1622 {
1623 	int sram_next_off = MVPP2_PRS_SRAM_NEXT_LU_OFFS;
1624 
1625 	mvpp2_prs_sram_bits_clear(pe, sram_next_off,
1626 				  MVPP2_PRS_SRAM_NEXT_LU_MASK);
1627 	mvpp2_prs_sram_bits_set(pe, sram_next_off, lu);
1628 }
1629 
1630 /* In the sram sw entry set sign and value of the next lookup offset
1631  * and the offset value generated to the classifier
1632  */
1633 static void mvpp2_prs_sram_shift_set(struct mvpp2_prs_entry *pe, int shift,
1634 				     unsigned int op)
1635 {
1636 	/* Set sign */
1637 	if (shift < 0) {
1638 		mvpp2_prs_sram_bits_set(pe, MVPP2_PRS_SRAM_SHIFT_SIGN_BIT, 1);
1639 		shift = 0 - shift;
1640 	} else {
1641 		mvpp2_prs_sram_bits_clear(pe, MVPP2_PRS_SRAM_SHIFT_SIGN_BIT, 1);
1642 	}
1643 
1644 	/* Set value */
1645 	pe->sram.byte[MVPP2_BIT_TO_BYTE(MVPP2_PRS_SRAM_SHIFT_OFFS)] =
1646 							   (unsigned char)shift;
1647 
1648 	/* Reset and set operation */
1649 	mvpp2_prs_sram_bits_clear(pe, MVPP2_PRS_SRAM_OP_SEL_SHIFT_OFFS,
1650 				  MVPP2_PRS_SRAM_OP_SEL_SHIFT_MASK);
1651 	mvpp2_prs_sram_bits_set(pe, MVPP2_PRS_SRAM_OP_SEL_SHIFT_OFFS, op);
1652 
1653 	/* Set base offset as current */
1654 	mvpp2_prs_sram_bits_clear(pe, MVPP2_PRS_SRAM_OP_SEL_BASE_OFFS, 1);
1655 }
1656 
1657 /* In the sram sw entry set sign and value of the user defined offset
1658  * generated to the classifier
1659  */
1660 static void mvpp2_prs_sram_offset_set(struct mvpp2_prs_entry *pe,
1661 				      unsigned int type, int offset,
1662 				      unsigned int op)
1663 {
1664 	/* Set sign */
1665 	if (offset < 0) {
1666 		mvpp2_prs_sram_bits_set(pe, MVPP2_PRS_SRAM_UDF_SIGN_BIT, 1);
1667 		offset = 0 - offset;
1668 	} else {
1669 		mvpp2_prs_sram_bits_clear(pe, MVPP2_PRS_SRAM_UDF_SIGN_BIT, 1);
1670 	}
1671 
1672 	/* Set value */
1673 	mvpp2_prs_sram_bits_clear(pe, MVPP2_PRS_SRAM_UDF_OFFS,
1674 				  MVPP2_PRS_SRAM_UDF_MASK);
1675 	mvpp2_prs_sram_bits_set(pe, MVPP2_PRS_SRAM_UDF_OFFS, offset);
1676 	pe->sram.byte[MVPP2_BIT_TO_BYTE(MVPP2_PRS_SRAM_UDF_OFFS +
1677 					MVPP2_PRS_SRAM_UDF_BITS)] &=
1678 	      ~(MVPP2_PRS_SRAM_UDF_MASK >> (8 - (MVPP2_PRS_SRAM_UDF_OFFS % 8)));
1679 	pe->sram.byte[MVPP2_BIT_TO_BYTE(MVPP2_PRS_SRAM_UDF_OFFS +
1680 					MVPP2_PRS_SRAM_UDF_BITS)] |=
1681 				(offset >> (8 - (MVPP2_PRS_SRAM_UDF_OFFS % 8)));
1682 
1683 	/* Set offset type */
1684 	mvpp2_prs_sram_bits_clear(pe, MVPP2_PRS_SRAM_UDF_TYPE_OFFS,
1685 				  MVPP2_PRS_SRAM_UDF_TYPE_MASK);
1686 	mvpp2_prs_sram_bits_set(pe, MVPP2_PRS_SRAM_UDF_TYPE_OFFS, type);
1687 
1688 	/* Set offset operation */
1689 	mvpp2_prs_sram_bits_clear(pe, MVPP2_PRS_SRAM_OP_SEL_UDF_OFFS,
1690 				  MVPP2_PRS_SRAM_OP_SEL_UDF_MASK);
1691 	mvpp2_prs_sram_bits_set(pe, MVPP2_PRS_SRAM_OP_SEL_UDF_OFFS, op);
1692 
1693 	pe->sram.byte[MVPP2_BIT_TO_BYTE(MVPP2_PRS_SRAM_OP_SEL_UDF_OFFS +
1694 					MVPP2_PRS_SRAM_OP_SEL_UDF_BITS)] &=
1695 					     ~(MVPP2_PRS_SRAM_OP_SEL_UDF_MASK >>
1696 				    (8 - (MVPP2_PRS_SRAM_OP_SEL_UDF_OFFS % 8)));
1697 
1698 	pe->sram.byte[MVPP2_BIT_TO_BYTE(MVPP2_PRS_SRAM_OP_SEL_UDF_OFFS +
1699 					MVPP2_PRS_SRAM_OP_SEL_UDF_BITS)] |=
1700 			     (op >> (8 - (MVPP2_PRS_SRAM_OP_SEL_UDF_OFFS % 8)));
1701 
1702 	/* Set base offset as current */
1703 	mvpp2_prs_sram_bits_clear(pe, MVPP2_PRS_SRAM_OP_SEL_BASE_OFFS, 1);
1704 }
1705 
1706 /* Find parser flow entry */
1707 static struct mvpp2_prs_entry *mvpp2_prs_flow_find(struct mvpp2 *priv, int flow)
1708 {
1709 	struct mvpp2_prs_entry *pe;
1710 	int tid;
1711 
1712 	pe = kzalloc(sizeof(*pe), GFP_KERNEL);
1713 	if (!pe)
1714 		return NULL;
1715 	mvpp2_prs_tcam_lu_set(pe, MVPP2_PRS_LU_FLOWS);
1716 
1717 	/* Go through the all entires with MVPP2_PRS_LU_FLOWS */
1718 	for (tid = MVPP2_PRS_TCAM_SRAM_SIZE - 1; tid >= 0; tid--) {
1719 		u8 bits;
1720 
1721 		if (!priv->prs_shadow[tid].valid ||
1722 		    priv->prs_shadow[tid].lu != MVPP2_PRS_LU_FLOWS)
1723 			continue;
1724 
1725 		pe->index = tid;
1726 		mvpp2_prs_hw_read(priv, pe);
1727 		bits = mvpp2_prs_sram_ai_get(pe);
1728 
1729 		/* Sram store classification lookup ID in AI bits [5:0] */
1730 		if ((bits & MVPP2_PRS_FLOW_ID_MASK) == flow)
1731 			return pe;
1732 	}
1733 	kfree(pe);
1734 
1735 	return NULL;
1736 }
1737 
1738 /* Return first free tcam index, seeking from start to end */
1739 static int mvpp2_prs_tcam_first_free(struct mvpp2 *priv, unsigned char start,
1740 				     unsigned char end)
1741 {
1742 	int tid;
1743 
1744 	if (start > end)
1745 		swap(start, end);
1746 
1747 	if (end >= MVPP2_PRS_TCAM_SRAM_SIZE)
1748 		end = MVPP2_PRS_TCAM_SRAM_SIZE - 1;
1749 
1750 	for (tid = start; tid <= end; tid++) {
1751 		if (!priv->prs_shadow[tid].valid)
1752 			return tid;
1753 	}
1754 
1755 	return -EINVAL;
1756 }
1757 
1758 /* Enable/disable dropping all mac da's */
1759 static void mvpp2_prs_mac_drop_all_set(struct mvpp2 *priv, int port, bool add)
1760 {
1761 	struct mvpp2_prs_entry pe;
1762 
1763 	if (priv->prs_shadow[MVPP2_PE_DROP_ALL].valid) {
1764 		/* Entry exist - update port only */
1765 		pe.index = MVPP2_PE_DROP_ALL;
1766 		mvpp2_prs_hw_read(priv, &pe);
1767 	} else {
1768 		/* Entry doesn't exist - create new */
1769 		memset(&pe, 0, sizeof(struct mvpp2_prs_entry));
1770 		mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_MAC);
1771 		pe.index = MVPP2_PE_DROP_ALL;
1772 
1773 		/* Non-promiscuous mode for all ports - DROP unknown packets */
1774 		mvpp2_prs_sram_ri_update(&pe, MVPP2_PRS_RI_DROP_MASK,
1775 					 MVPP2_PRS_RI_DROP_MASK);
1776 
1777 		mvpp2_prs_sram_bits_set(&pe, MVPP2_PRS_SRAM_LU_GEN_BIT, 1);
1778 		mvpp2_prs_sram_next_lu_set(&pe, MVPP2_PRS_LU_FLOWS);
1779 
1780 		/* Update shadow table */
1781 		mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_MAC);
1782 
1783 		/* Mask all ports */
1784 		mvpp2_prs_tcam_port_map_set(&pe, 0);
1785 	}
1786 
1787 	/* Update port mask */
1788 	mvpp2_prs_tcam_port_set(&pe, port, add);
1789 
1790 	mvpp2_prs_hw_write(priv, &pe);
1791 }
1792 
1793 /* Set port to promiscuous mode */
1794 static void mvpp2_prs_mac_promisc_set(struct mvpp2 *priv, int port, bool add)
1795 {
1796 	struct mvpp2_prs_entry pe;
1797 
1798 	/* Promiscuous mode - Accept unknown packets */
1799 
1800 	if (priv->prs_shadow[MVPP2_PE_MAC_PROMISCUOUS].valid) {
1801 		/* Entry exist - update port only */
1802 		pe.index = MVPP2_PE_MAC_PROMISCUOUS;
1803 		mvpp2_prs_hw_read(priv, &pe);
1804 	} else {
1805 		/* Entry doesn't exist - create new */
1806 		memset(&pe, 0, sizeof(struct mvpp2_prs_entry));
1807 		mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_MAC);
1808 		pe.index = MVPP2_PE_MAC_PROMISCUOUS;
1809 
1810 		/* Continue - set next lookup */
1811 		mvpp2_prs_sram_next_lu_set(&pe, MVPP2_PRS_LU_DSA);
1812 
1813 		/* Set result info bits */
1814 		mvpp2_prs_sram_ri_update(&pe, MVPP2_PRS_RI_L2_UCAST,
1815 					 MVPP2_PRS_RI_L2_CAST_MASK);
1816 
1817 		/* Shift to ethertype */
1818 		mvpp2_prs_sram_shift_set(&pe, 2 * ETH_ALEN,
1819 					 MVPP2_PRS_SRAM_OP_SEL_SHIFT_ADD);
1820 
1821 		/* Mask all ports */
1822 		mvpp2_prs_tcam_port_map_set(&pe, 0);
1823 
1824 		/* Update shadow table */
1825 		mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_MAC);
1826 	}
1827 
1828 	/* Update port mask */
1829 	mvpp2_prs_tcam_port_set(&pe, port, add);
1830 
1831 	mvpp2_prs_hw_write(priv, &pe);
1832 }
1833 
1834 /* Accept multicast */
1835 static void mvpp2_prs_mac_multi_set(struct mvpp2 *priv, int port, int index,
1836 				    bool add)
1837 {
1838 	struct mvpp2_prs_entry pe;
1839 	unsigned char da_mc;
1840 
1841 	/* Ethernet multicast address first byte is
1842 	 * 0x01 for IPv4 and 0x33 for IPv6
1843 	 */
1844 	da_mc = (index == MVPP2_PE_MAC_MC_ALL) ? 0x01 : 0x33;
1845 
1846 	if (priv->prs_shadow[index].valid) {
1847 		/* Entry exist - update port only */
1848 		pe.index = index;
1849 		mvpp2_prs_hw_read(priv, &pe);
1850 	} else {
1851 		/* Entry doesn't exist - create new */
1852 		memset(&pe, 0, sizeof(struct mvpp2_prs_entry));
1853 		mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_MAC);
1854 		pe.index = index;
1855 
1856 		/* Continue - set next lookup */
1857 		mvpp2_prs_sram_next_lu_set(&pe, MVPP2_PRS_LU_DSA);
1858 
1859 		/* Set result info bits */
1860 		mvpp2_prs_sram_ri_update(&pe, MVPP2_PRS_RI_L2_MCAST,
1861 					 MVPP2_PRS_RI_L2_CAST_MASK);
1862 
1863 		/* Update tcam entry data first byte */
1864 		mvpp2_prs_tcam_data_byte_set(&pe, 0, da_mc, 0xff);
1865 
1866 		/* Shift to ethertype */
1867 		mvpp2_prs_sram_shift_set(&pe, 2 * ETH_ALEN,
1868 					 MVPP2_PRS_SRAM_OP_SEL_SHIFT_ADD);
1869 
1870 		/* Mask all ports */
1871 		mvpp2_prs_tcam_port_map_set(&pe, 0);
1872 
1873 		/* Update shadow table */
1874 		mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_MAC);
1875 	}
1876 
1877 	/* Update port mask */
1878 	mvpp2_prs_tcam_port_set(&pe, port, add);
1879 
1880 	mvpp2_prs_hw_write(priv, &pe);
1881 }
1882 
1883 /* Parser per-port initialization */
1884 static void mvpp2_prs_hw_port_init(struct mvpp2 *priv, int port, int lu_first,
1885 				   int lu_max, int offset)
1886 {
1887 	u32 val;
1888 
1889 	/* Set lookup ID */
1890 	val = mvpp2_read(priv, MVPP2_PRS_INIT_LOOKUP_REG);
1891 	val &= ~MVPP2_PRS_PORT_LU_MASK(port);
1892 	val |=  MVPP2_PRS_PORT_LU_VAL(port, lu_first);
1893 	mvpp2_write(priv, MVPP2_PRS_INIT_LOOKUP_REG, val);
1894 
1895 	/* Set maximum number of loops for packet received from port */
1896 	val = mvpp2_read(priv, MVPP2_PRS_MAX_LOOP_REG(port));
1897 	val &= ~MVPP2_PRS_MAX_LOOP_MASK(port);
1898 	val |= MVPP2_PRS_MAX_LOOP_VAL(port, lu_max);
1899 	mvpp2_write(priv, MVPP2_PRS_MAX_LOOP_REG(port), val);
1900 
1901 	/* Set initial offset for packet header extraction for the first
1902 	 * searching loop
1903 	 */
1904 	val = mvpp2_read(priv, MVPP2_PRS_INIT_OFFS_REG(port));
1905 	val &= ~MVPP2_PRS_INIT_OFF_MASK(port);
1906 	val |= MVPP2_PRS_INIT_OFF_VAL(port, offset);
1907 	mvpp2_write(priv, MVPP2_PRS_INIT_OFFS_REG(port), val);
1908 }
1909 
1910 /* Default flow entries initialization for all ports */
1911 static void mvpp2_prs_def_flow_init(struct mvpp2 *priv)
1912 {
1913 	struct mvpp2_prs_entry pe;
1914 	int port;
1915 
1916 	for (port = 0; port < MVPP2_MAX_PORTS; port++) {
1917 		memset(&pe, 0, sizeof(struct mvpp2_prs_entry));
1918 		mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_FLOWS);
1919 		pe.index = MVPP2_PE_FIRST_DEFAULT_FLOW - port;
1920 
1921 		/* Mask all ports */
1922 		mvpp2_prs_tcam_port_map_set(&pe, 0);
1923 
1924 		/* Set flow ID*/
1925 		mvpp2_prs_sram_ai_update(&pe, port, MVPP2_PRS_FLOW_ID_MASK);
1926 		mvpp2_prs_sram_bits_set(&pe, MVPP2_PRS_SRAM_LU_DONE_BIT, 1);
1927 
1928 		/* Update shadow table and hw entry */
1929 		mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_FLOWS);
1930 		mvpp2_prs_hw_write(priv, &pe);
1931 	}
1932 }
1933 
1934 /* Set default entry for Marvell Header field */
1935 static void mvpp2_prs_mh_init(struct mvpp2 *priv)
1936 {
1937 	struct mvpp2_prs_entry pe;
1938 
1939 	memset(&pe, 0, sizeof(struct mvpp2_prs_entry));
1940 
1941 	pe.index = MVPP2_PE_MH_DEFAULT;
1942 	mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_MH);
1943 	mvpp2_prs_sram_shift_set(&pe, MVPP2_MH_SIZE,
1944 				 MVPP2_PRS_SRAM_OP_SEL_SHIFT_ADD);
1945 	mvpp2_prs_sram_next_lu_set(&pe, MVPP2_PRS_LU_MAC);
1946 
1947 	/* Unmask all ports */
1948 	mvpp2_prs_tcam_port_map_set(&pe, MVPP2_PRS_PORT_MASK);
1949 
1950 	/* Update shadow table and hw entry */
1951 	mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_MH);
1952 	mvpp2_prs_hw_write(priv, &pe);
1953 }
1954 
1955 /* Set default entires (place holder) for promiscuous, non-promiscuous and
1956  * multicast MAC addresses
1957  */
1958 static void mvpp2_prs_mac_init(struct mvpp2 *priv)
1959 {
1960 	struct mvpp2_prs_entry pe;
1961 
1962 	memset(&pe, 0, sizeof(struct mvpp2_prs_entry));
1963 
1964 	/* Non-promiscuous mode for all ports - DROP unknown packets */
1965 	pe.index = MVPP2_PE_MAC_NON_PROMISCUOUS;
1966 	mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_MAC);
1967 
1968 	mvpp2_prs_sram_ri_update(&pe, MVPP2_PRS_RI_DROP_MASK,
1969 				 MVPP2_PRS_RI_DROP_MASK);
1970 	mvpp2_prs_sram_bits_set(&pe, MVPP2_PRS_SRAM_LU_GEN_BIT, 1);
1971 	mvpp2_prs_sram_next_lu_set(&pe, MVPP2_PRS_LU_FLOWS);
1972 
1973 	/* Unmask all ports */
1974 	mvpp2_prs_tcam_port_map_set(&pe, MVPP2_PRS_PORT_MASK);
1975 
1976 	/* Update shadow table and hw entry */
1977 	mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_MAC);
1978 	mvpp2_prs_hw_write(priv, &pe);
1979 
1980 	/* place holders only - no ports */
1981 	mvpp2_prs_mac_drop_all_set(priv, 0, false);
1982 	mvpp2_prs_mac_promisc_set(priv, 0, false);
1983 	mvpp2_prs_mac_multi_set(priv, MVPP2_PE_MAC_MC_ALL, 0, false);
1984 	mvpp2_prs_mac_multi_set(priv, MVPP2_PE_MAC_MC_IP6, 0, false);
1985 }
1986 
1987 /* Match basic ethertypes */
1988 static int mvpp2_prs_etype_init(struct mvpp2 *priv)
1989 {
1990 	struct mvpp2_prs_entry pe;
1991 	int tid;
1992 
1993 	/* Ethertype: PPPoE */
1994 	tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,
1995 					MVPP2_PE_LAST_FREE_TID);
1996 	if (tid < 0)
1997 		return tid;
1998 
1999 	memset(&pe, 0, sizeof(struct mvpp2_prs_entry));
2000 	mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_L2);
2001 	pe.index = tid;
2002 
2003 	mvpp2_prs_match_etype(&pe, 0, PROT_PPP_SES);
2004 
2005 	mvpp2_prs_sram_shift_set(&pe, MVPP2_PPPOE_HDR_SIZE,
2006 				 MVPP2_PRS_SRAM_OP_SEL_SHIFT_ADD);
2007 	mvpp2_prs_sram_next_lu_set(&pe, MVPP2_PRS_LU_PPPOE);
2008 	mvpp2_prs_sram_ri_update(&pe, MVPP2_PRS_RI_PPPOE_MASK,
2009 				 MVPP2_PRS_RI_PPPOE_MASK);
2010 
2011 	/* Update shadow table and hw entry */
2012 	mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_L2);
2013 	priv->prs_shadow[pe.index].udf = MVPP2_PRS_UDF_L2_DEF;
2014 	priv->prs_shadow[pe.index].finish = false;
2015 	mvpp2_prs_shadow_ri_set(priv, pe.index, MVPP2_PRS_RI_PPPOE_MASK,
2016 				MVPP2_PRS_RI_PPPOE_MASK);
2017 	mvpp2_prs_hw_write(priv, &pe);
2018 
2019 	/* Ethertype: ARP */
2020 	tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,
2021 					MVPP2_PE_LAST_FREE_TID);
2022 	if (tid < 0)
2023 		return tid;
2024 
2025 	memset(&pe, 0, sizeof(struct mvpp2_prs_entry));
2026 	mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_L2);
2027 	pe.index = tid;
2028 
2029 	mvpp2_prs_match_etype(&pe, 0, PROT_ARP);
2030 
2031 	/* Generate flow in the next iteration*/
2032 	mvpp2_prs_sram_next_lu_set(&pe, MVPP2_PRS_LU_FLOWS);
2033 	mvpp2_prs_sram_bits_set(&pe, MVPP2_PRS_SRAM_LU_GEN_BIT, 1);
2034 	mvpp2_prs_sram_ri_update(&pe, MVPP2_PRS_RI_L3_ARP,
2035 				 MVPP2_PRS_RI_L3_PROTO_MASK);
2036 	/* Set L3 offset */
2037 	mvpp2_prs_sram_offset_set(&pe, MVPP2_PRS_SRAM_UDF_TYPE_L3,
2038 				  MVPP2_ETH_TYPE_LEN,
2039 				  MVPP2_PRS_SRAM_OP_SEL_UDF_ADD);
2040 
2041 	/* Update shadow table and hw entry */
2042 	mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_L2);
2043 	priv->prs_shadow[pe.index].udf = MVPP2_PRS_UDF_L2_DEF;
2044 	priv->prs_shadow[pe.index].finish = true;
2045 	mvpp2_prs_shadow_ri_set(priv, pe.index, MVPP2_PRS_RI_L3_ARP,
2046 				MVPP2_PRS_RI_L3_PROTO_MASK);
2047 	mvpp2_prs_hw_write(priv, &pe);
2048 
2049 	/* Ethertype: LBTD */
2050 	tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,
2051 					MVPP2_PE_LAST_FREE_TID);
2052 	if (tid < 0)
2053 		return tid;
2054 
2055 	memset(&pe, 0, sizeof(struct mvpp2_prs_entry));
2056 	mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_L2);
2057 	pe.index = tid;
2058 
2059 	mvpp2_prs_match_etype(&pe, 0, MVPP2_IP_LBDT_TYPE);
2060 
2061 	/* Generate flow in the next iteration*/
2062 	mvpp2_prs_sram_next_lu_set(&pe, MVPP2_PRS_LU_FLOWS);
2063 	mvpp2_prs_sram_bits_set(&pe, MVPP2_PRS_SRAM_LU_GEN_BIT, 1);
2064 	mvpp2_prs_sram_ri_update(&pe, MVPP2_PRS_RI_CPU_CODE_RX_SPEC |
2065 				 MVPP2_PRS_RI_UDF3_RX_SPECIAL,
2066 				 MVPP2_PRS_RI_CPU_CODE_MASK |
2067 				 MVPP2_PRS_RI_UDF3_MASK);
2068 	/* Set L3 offset */
2069 	mvpp2_prs_sram_offset_set(&pe, MVPP2_PRS_SRAM_UDF_TYPE_L3,
2070 				  MVPP2_ETH_TYPE_LEN,
2071 				  MVPP2_PRS_SRAM_OP_SEL_UDF_ADD);
2072 
2073 	/* Update shadow table and hw entry */
2074 	mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_L2);
2075 	priv->prs_shadow[pe.index].udf = MVPP2_PRS_UDF_L2_DEF;
2076 	priv->prs_shadow[pe.index].finish = true;
2077 	mvpp2_prs_shadow_ri_set(priv, pe.index, MVPP2_PRS_RI_CPU_CODE_RX_SPEC |
2078 				MVPP2_PRS_RI_UDF3_RX_SPECIAL,
2079 				MVPP2_PRS_RI_CPU_CODE_MASK |
2080 				MVPP2_PRS_RI_UDF3_MASK);
2081 	mvpp2_prs_hw_write(priv, &pe);
2082 
2083 	/* Ethertype: IPv4 without options */
2084 	tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,
2085 					MVPP2_PE_LAST_FREE_TID);
2086 	if (tid < 0)
2087 		return tid;
2088 
2089 	memset(&pe, 0, sizeof(struct mvpp2_prs_entry));
2090 	mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_L2);
2091 	pe.index = tid;
2092 
2093 	mvpp2_prs_match_etype(&pe, 0, PROT_IP);
2094 	mvpp2_prs_tcam_data_byte_set(&pe, MVPP2_ETH_TYPE_LEN,
2095 				     MVPP2_PRS_IPV4_HEAD | MVPP2_PRS_IPV4_IHL,
2096 				     MVPP2_PRS_IPV4_HEAD_MASK |
2097 				     MVPP2_PRS_IPV4_IHL_MASK);
2098 
2099 	mvpp2_prs_sram_next_lu_set(&pe, MVPP2_PRS_LU_IP4);
2100 	mvpp2_prs_sram_ri_update(&pe, MVPP2_PRS_RI_L3_IP4,
2101 				 MVPP2_PRS_RI_L3_PROTO_MASK);
2102 	/* Skip eth_type + 4 bytes of IP header */
2103 	mvpp2_prs_sram_shift_set(&pe, MVPP2_ETH_TYPE_LEN + 4,
2104 				 MVPP2_PRS_SRAM_OP_SEL_SHIFT_ADD);
2105 	/* Set L3 offset */
2106 	mvpp2_prs_sram_offset_set(&pe, MVPP2_PRS_SRAM_UDF_TYPE_L3,
2107 				  MVPP2_ETH_TYPE_LEN,
2108 				  MVPP2_PRS_SRAM_OP_SEL_UDF_ADD);
2109 
2110 	/* Update shadow table and hw entry */
2111 	mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_L2);
2112 	priv->prs_shadow[pe.index].udf = MVPP2_PRS_UDF_L2_DEF;
2113 	priv->prs_shadow[pe.index].finish = false;
2114 	mvpp2_prs_shadow_ri_set(priv, pe.index, MVPP2_PRS_RI_L3_IP4,
2115 				MVPP2_PRS_RI_L3_PROTO_MASK);
2116 	mvpp2_prs_hw_write(priv, &pe);
2117 
2118 	/* Ethertype: IPv4 with options */
2119 	tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,
2120 					MVPP2_PE_LAST_FREE_TID);
2121 	if (tid < 0)
2122 		return tid;
2123 
2124 	pe.index = tid;
2125 
2126 	/* Clear tcam data before updating */
2127 	pe.tcam.byte[MVPP2_PRS_TCAM_DATA_BYTE(MVPP2_ETH_TYPE_LEN)] = 0x0;
2128 	pe.tcam.byte[MVPP2_PRS_TCAM_DATA_BYTE_EN(MVPP2_ETH_TYPE_LEN)] = 0x0;
2129 
2130 	mvpp2_prs_tcam_data_byte_set(&pe, MVPP2_ETH_TYPE_LEN,
2131 				     MVPP2_PRS_IPV4_HEAD,
2132 				     MVPP2_PRS_IPV4_HEAD_MASK);
2133 
2134 	/* Clear ri before updating */
2135 	pe.sram.word[MVPP2_PRS_SRAM_RI_WORD] = 0x0;
2136 	pe.sram.word[MVPP2_PRS_SRAM_RI_CTRL_WORD] = 0x0;
2137 	mvpp2_prs_sram_ri_update(&pe, MVPP2_PRS_RI_L3_IP4_OPT,
2138 				 MVPP2_PRS_RI_L3_PROTO_MASK);
2139 
2140 	/* Update shadow table and hw entry */
2141 	mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_L2);
2142 	priv->prs_shadow[pe.index].udf = MVPP2_PRS_UDF_L2_DEF;
2143 	priv->prs_shadow[pe.index].finish = false;
2144 	mvpp2_prs_shadow_ri_set(priv, pe.index, MVPP2_PRS_RI_L3_IP4_OPT,
2145 				MVPP2_PRS_RI_L3_PROTO_MASK);
2146 	mvpp2_prs_hw_write(priv, &pe);
2147 
2148 	/* Ethertype: IPv6 without options */
2149 	tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,
2150 					MVPP2_PE_LAST_FREE_TID);
2151 	if (tid < 0)
2152 		return tid;
2153 
2154 	memset(&pe, 0, sizeof(struct mvpp2_prs_entry));
2155 	mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_L2);
2156 	pe.index = tid;
2157 
2158 	mvpp2_prs_match_etype(&pe, 0, PROT_IPV6);
2159 
2160 	/* Skip DIP of IPV6 header */
2161 	mvpp2_prs_sram_shift_set(&pe, MVPP2_ETH_TYPE_LEN + 8 +
2162 				 MVPP2_MAX_L3_ADDR_SIZE,
2163 				 MVPP2_PRS_SRAM_OP_SEL_SHIFT_ADD);
2164 	mvpp2_prs_sram_next_lu_set(&pe, MVPP2_PRS_LU_IP6);
2165 	mvpp2_prs_sram_ri_update(&pe, MVPP2_PRS_RI_L3_IP6,
2166 				 MVPP2_PRS_RI_L3_PROTO_MASK);
2167 	/* Set L3 offset */
2168 	mvpp2_prs_sram_offset_set(&pe, MVPP2_PRS_SRAM_UDF_TYPE_L3,
2169 				  MVPP2_ETH_TYPE_LEN,
2170 				  MVPP2_PRS_SRAM_OP_SEL_UDF_ADD);
2171 
2172 	mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_L2);
2173 	priv->prs_shadow[pe.index].udf = MVPP2_PRS_UDF_L2_DEF;
2174 	priv->prs_shadow[pe.index].finish = false;
2175 	mvpp2_prs_shadow_ri_set(priv, pe.index, MVPP2_PRS_RI_L3_IP6,
2176 				MVPP2_PRS_RI_L3_PROTO_MASK);
2177 	mvpp2_prs_hw_write(priv, &pe);
2178 
2179 	/* Default entry for MVPP2_PRS_LU_L2 - Unknown ethtype */
2180 	memset(&pe, 0, sizeof(struct mvpp2_prs_entry));
2181 	mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_L2);
2182 	pe.index = MVPP2_PE_ETH_TYPE_UN;
2183 
2184 	/* Unmask all ports */
2185 	mvpp2_prs_tcam_port_map_set(&pe, MVPP2_PRS_PORT_MASK);
2186 
2187 	/* Generate flow in the next iteration*/
2188 	mvpp2_prs_sram_bits_set(&pe, MVPP2_PRS_SRAM_LU_GEN_BIT, 1);
2189 	mvpp2_prs_sram_next_lu_set(&pe, MVPP2_PRS_LU_FLOWS);
2190 	mvpp2_prs_sram_ri_update(&pe, MVPP2_PRS_RI_L3_UN,
2191 				 MVPP2_PRS_RI_L3_PROTO_MASK);
2192 	/* Set L3 offset even it's unknown L3 */
2193 	mvpp2_prs_sram_offset_set(&pe, MVPP2_PRS_SRAM_UDF_TYPE_L3,
2194 				  MVPP2_ETH_TYPE_LEN,
2195 				  MVPP2_PRS_SRAM_OP_SEL_UDF_ADD);
2196 
2197 	/* Update shadow table and hw entry */
2198 	mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_L2);
2199 	priv->prs_shadow[pe.index].udf = MVPP2_PRS_UDF_L2_DEF;
2200 	priv->prs_shadow[pe.index].finish = true;
2201 	mvpp2_prs_shadow_ri_set(priv, pe.index, MVPP2_PRS_RI_L3_UN,
2202 				MVPP2_PRS_RI_L3_PROTO_MASK);
2203 	mvpp2_prs_hw_write(priv, &pe);
2204 
2205 	return 0;
2206 }
2207 
2208 /* Parser default initialization */
2209 static int mvpp2_prs_default_init(struct udevice *dev,
2210 				  struct mvpp2 *priv)
2211 {
2212 	int err, index, i;
2213 
2214 	/* Enable tcam table */
2215 	mvpp2_write(priv, MVPP2_PRS_TCAM_CTRL_REG, MVPP2_PRS_TCAM_EN_MASK);
2216 
2217 	/* Clear all tcam and sram entries */
2218 	for (index = 0; index < MVPP2_PRS_TCAM_SRAM_SIZE; index++) {
2219 		mvpp2_write(priv, MVPP2_PRS_TCAM_IDX_REG, index);
2220 		for (i = 0; i < MVPP2_PRS_TCAM_WORDS; i++)
2221 			mvpp2_write(priv, MVPP2_PRS_TCAM_DATA_REG(i), 0);
2222 
2223 		mvpp2_write(priv, MVPP2_PRS_SRAM_IDX_REG, index);
2224 		for (i = 0; i < MVPP2_PRS_SRAM_WORDS; i++)
2225 			mvpp2_write(priv, MVPP2_PRS_SRAM_DATA_REG(i), 0);
2226 	}
2227 
2228 	/* Invalidate all tcam entries */
2229 	for (index = 0; index < MVPP2_PRS_TCAM_SRAM_SIZE; index++)
2230 		mvpp2_prs_hw_inv(priv, index);
2231 
2232 	priv->prs_shadow = devm_kcalloc(dev, MVPP2_PRS_TCAM_SRAM_SIZE,
2233 					sizeof(struct mvpp2_prs_shadow),
2234 					GFP_KERNEL);
2235 	if (!priv->prs_shadow)
2236 		return -ENOMEM;
2237 
2238 	/* Always start from lookup = 0 */
2239 	for (index = 0; index < MVPP2_MAX_PORTS; index++)
2240 		mvpp2_prs_hw_port_init(priv, index, MVPP2_PRS_LU_MH,
2241 				       MVPP2_PRS_PORT_LU_MAX, 0);
2242 
2243 	mvpp2_prs_def_flow_init(priv);
2244 
2245 	mvpp2_prs_mh_init(priv);
2246 
2247 	mvpp2_prs_mac_init(priv);
2248 
2249 	err = mvpp2_prs_etype_init(priv);
2250 	if (err)
2251 		return err;
2252 
2253 	return 0;
2254 }
2255 
2256 /* Compare MAC DA with tcam entry data */
2257 static bool mvpp2_prs_mac_range_equals(struct mvpp2_prs_entry *pe,
2258 				       const u8 *da, unsigned char *mask)
2259 {
2260 	unsigned char tcam_byte, tcam_mask;
2261 	int index;
2262 
2263 	for (index = 0; index < ETH_ALEN; index++) {
2264 		mvpp2_prs_tcam_data_byte_get(pe, index, &tcam_byte, &tcam_mask);
2265 		if (tcam_mask != mask[index])
2266 			return false;
2267 
2268 		if ((tcam_mask & tcam_byte) != (da[index] & mask[index]))
2269 			return false;
2270 	}
2271 
2272 	return true;
2273 }
2274 
2275 /* Find tcam entry with matched pair <MAC DA, port> */
2276 static struct mvpp2_prs_entry *
2277 mvpp2_prs_mac_da_range_find(struct mvpp2 *priv, int pmap, const u8 *da,
2278 			    unsigned char *mask, int udf_type)
2279 {
2280 	struct mvpp2_prs_entry *pe;
2281 	int tid;
2282 
2283 	pe = kzalloc(sizeof(*pe), GFP_KERNEL);
2284 	if (!pe)
2285 		return NULL;
2286 	mvpp2_prs_tcam_lu_set(pe, MVPP2_PRS_LU_MAC);
2287 
2288 	/* Go through the all entires with MVPP2_PRS_LU_MAC */
2289 	for (tid = MVPP2_PE_FIRST_FREE_TID;
2290 	     tid <= MVPP2_PE_LAST_FREE_TID; tid++) {
2291 		unsigned int entry_pmap;
2292 
2293 		if (!priv->prs_shadow[tid].valid ||
2294 		    (priv->prs_shadow[tid].lu != MVPP2_PRS_LU_MAC) ||
2295 		    (priv->prs_shadow[tid].udf != udf_type))
2296 			continue;
2297 
2298 		pe->index = tid;
2299 		mvpp2_prs_hw_read(priv, pe);
2300 		entry_pmap = mvpp2_prs_tcam_port_map_get(pe);
2301 
2302 		if (mvpp2_prs_mac_range_equals(pe, da, mask) &&
2303 		    entry_pmap == pmap)
2304 			return pe;
2305 	}
2306 	kfree(pe);
2307 
2308 	return NULL;
2309 }
2310 
2311 /* Update parser's mac da entry */
2312 static int mvpp2_prs_mac_da_accept(struct mvpp2 *priv, int port,
2313 				   const u8 *da, bool add)
2314 {
2315 	struct mvpp2_prs_entry *pe;
2316 	unsigned int pmap, len, ri;
2317 	unsigned char mask[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
2318 	int tid;
2319 
2320 	/* Scan TCAM and see if entry with this <MAC DA, port> already exist */
2321 	pe = mvpp2_prs_mac_da_range_find(priv, (1 << port), da, mask,
2322 					 MVPP2_PRS_UDF_MAC_DEF);
2323 
2324 	/* No such entry */
2325 	if (!pe) {
2326 		if (!add)
2327 			return 0;
2328 
2329 		/* Create new TCAM entry */
2330 		/* Find first range mac entry*/
2331 		for (tid = MVPP2_PE_FIRST_FREE_TID;
2332 		     tid <= MVPP2_PE_LAST_FREE_TID; tid++)
2333 			if (priv->prs_shadow[tid].valid &&
2334 			    (priv->prs_shadow[tid].lu == MVPP2_PRS_LU_MAC) &&
2335 			    (priv->prs_shadow[tid].udf ==
2336 						       MVPP2_PRS_UDF_MAC_RANGE))
2337 				break;
2338 
2339 		/* Go through the all entries from first to last */
2340 		tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,
2341 						tid - 1);
2342 		if (tid < 0)
2343 			return tid;
2344 
2345 		pe = kzalloc(sizeof(*pe), GFP_KERNEL);
2346 		if (!pe)
2347 			return -1;
2348 		mvpp2_prs_tcam_lu_set(pe, MVPP2_PRS_LU_MAC);
2349 		pe->index = tid;
2350 
2351 		/* Mask all ports */
2352 		mvpp2_prs_tcam_port_map_set(pe, 0);
2353 	}
2354 
2355 	/* Update port mask */
2356 	mvpp2_prs_tcam_port_set(pe, port, add);
2357 
2358 	/* Invalidate the entry if no ports are left enabled */
2359 	pmap = mvpp2_prs_tcam_port_map_get(pe);
2360 	if (pmap == 0) {
2361 		if (add) {
2362 			kfree(pe);
2363 			return -1;
2364 		}
2365 		mvpp2_prs_hw_inv(priv, pe->index);
2366 		priv->prs_shadow[pe->index].valid = false;
2367 		kfree(pe);
2368 		return 0;
2369 	}
2370 
2371 	/* Continue - set next lookup */
2372 	mvpp2_prs_sram_next_lu_set(pe, MVPP2_PRS_LU_DSA);
2373 
2374 	/* Set match on DA */
2375 	len = ETH_ALEN;
2376 	while (len--)
2377 		mvpp2_prs_tcam_data_byte_set(pe, len, da[len], 0xff);
2378 
2379 	/* Set result info bits */
2380 	ri = MVPP2_PRS_RI_L2_UCAST | MVPP2_PRS_RI_MAC_ME_MASK;
2381 
2382 	mvpp2_prs_sram_ri_update(pe, ri, MVPP2_PRS_RI_L2_CAST_MASK |
2383 				 MVPP2_PRS_RI_MAC_ME_MASK);
2384 	mvpp2_prs_shadow_ri_set(priv, pe->index, ri, MVPP2_PRS_RI_L2_CAST_MASK |
2385 				MVPP2_PRS_RI_MAC_ME_MASK);
2386 
2387 	/* Shift to ethertype */
2388 	mvpp2_prs_sram_shift_set(pe, 2 * ETH_ALEN,
2389 				 MVPP2_PRS_SRAM_OP_SEL_SHIFT_ADD);
2390 
2391 	/* Update shadow table and hw entry */
2392 	priv->prs_shadow[pe->index].udf = MVPP2_PRS_UDF_MAC_DEF;
2393 	mvpp2_prs_shadow_set(priv, pe->index, MVPP2_PRS_LU_MAC);
2394 	mvpp2_prs_hw_write(priv, pe);
2395 
2396 	kfree(pe);
2397 
2398 	return 0;
2399 }
2400 
2401 static int mvpp2_prs_update_mac_da(struct mvpp2_port *port, const u8 *da)
2402 {
2403 	int err;
2404 
2405 	/* Remove old parser entry */
2406 	err = mvpp2_prs_mac_da_accept(port->priv, port->id, port->dev_addr,
2407 				      false);
2408 	if (err)
2409 		return err;
2410 
2411 	/* Add new parser entry */
2412 	err = mvpp2_prs_mac_da_accept(port->priv, port->id, da, true);
2413 	if (err)
2414 		return err;
2415 
2416 	/* Set addr in the device */
2417 	memcpy(port->dev_addr, da, ETH_ALEN);
2418 
2419 	return 0;
2420 }
2421 
2422 /* Set prs flow for the port */
2423 static int mvpp2_prs_def_flow(struct mvpp2_port *port)
2424 {
2425 	struct mvpp2_prs_entry *pe;
2426 	int tid;
2427 
2428 	pe = mvpp2_prs_flow_find(port->priv, port->id);
2429 
2430 	/* Such entry not exist */
2431 	if (!pe) {
2432 		/* Go through the all entires from last to first */
2433 		tid = mvpp2_prs_tcam_first_free(port->priv,
2434 						MVPP2_PE_LAST_FREE_TID,
2435 					       MVPP2_PE_FIRST_FREE_TID);
2436 		if (tid < 0)
2437 			return tid;
2438 
2439 		pe = kzalloc(sizeof(*pe), GFP_KERNEL);
2440 		if (!pe)
2441 			return -ENOMEM;
2442 
2443 		mvpp2_prs_tcam_lu_set(pe, MVPP2_PRS_LU_FLOWS);
2444 		pe->index = tid;
2445 
2446 		/* Set flow ID*/
2447 		mvpp2_prs_sram_ai_update(pe, port->id, MVPP2_PRS_FLOW_ID_MASK);
2448 		mvpp2_prs_sram_bits_set(pe, MVPP2_PRS_SRAM_LU_DONE_BIT, 1);
2449 
2450 		/* Update shadow table */
2451 		mvpp2_prs_shadow_set(port->priv, pe->index, MVPP2_PRS_LU_FLOWS);
2452 	}
2453 
2454 	mvpp2_prs_tcam_port_map_set(pe, (1 << port->id));
2455 	mvpp2_prs_hw_write(port->priv, pe);
2456 	kfree(pe);
2457 
2458 	return 0;
2459 }
2460 
2461 /* Classifier configuration routines */
2462 
2463 /* Update classification flow table registers */
2464 static void mvpp2_cls_flow_write(struct mvpp2 *priv,
2465 				 struct mvpp2_cls_flow_entry *fe)
2466 {
2467 	mvpp2_write(priv, MVPP2_CLS_FLOW_INDEX_REG, fe->index);
2468 	mvpp2_write(priv, MVPP2_CLS_FLOW_TBL0_REG,  fe->data[0]);
2469 	mvpp2_write(priv, MVPP2_CLS_FLOW_TBL1_REG,  fe->data[1]);
2470 	mvpp2_write(priv, MVPP2_CLS_FLOW_TBL2_REG,  fe->data[2]);
2471 }
2472 
2473 /* Update classification lookup table register */
2474 static void mvpp2_cls_lookup_write(struct mvpp2 *priv,
2475 				   struct mvpp2_cls_lookup_entry *le)
2476 {
2477 	u32 val;
2478 
2479 	val = (le->way << MVPP2_CLS_LKP_INDEX_WAY_OFFS) | le->lkpid;
2480 	mvpp2_write(priv, MVPP2_CLS_LKP_INDEX_REG, val);
2481 	mvpp2_write(priv, MVPP2_CLS_LKP_TBL_REG, le->data);
2482 }
2483 
2484 /* Classifier default initialization */
2485 static void mvpp2_cls_init(struct mvpp2 *priv)
2486 {
2487 	struct mvpp2_cls_lookup_entry le;
2488 	struct mvpp2_cls_flow_entry fe;
2489 	int index;
2490 
2491 	/* Enable classifier */
2492 	mvpp2_write(priv, MVPP2_CLS_MODE_REG, MVPP2_CLS_MODE_ACTIVE_MASK);
2493 
2494 	/* Clear classifier flow table */
2495 	memset(&fe.data, 0, MVPP2_CLS_FLOWS_TBL_DATA_WORDS);
2496 	for (index = 0; index < MVPP2_CLS_FLOWS_TBL_SIZE; index++) {
2497 		fe.index = index;
2498 		mvpp2_cls_flow_write(priv, &fe);
2499 	}
2500 
2501 	/* Clear classifier lookup table */
2502 	le.data = 0;
2503 	for (index = 0; index < MVPP2_CLS_LKP_TBL_SIZE; index++) {
2504 		le.lkpid = index;
2505 		le.way = 0;
2506 		mvpp2_cls_lookup_write(priv, &le);
2507 
2508 		le.way = 1;
2509 		mvpp2_cls_lookup_write(priv, &le);
2510 	}
2511 }
2512 
2513 static void mvpp2_cls_port_config(struct mvpp2_port *port)
2514 {
2515 	struct mvpp2_cls_lookup_entry le;
2516 	u32 val;
2517 
2518 	/* Set way for the port */
2519 	val = mvpp2_read(port->priv, MVPP2_CLS_PORT_WAY_REG);
2520 	val &= ~MVPP2_CLS_PORT_WAY_MASK(port->id);
2521 	mvpp2_write(port->priv, MVPP2_CLS_PORT_WAY_REG, val);
2522 
2523 	/* Pick the entry to be accessed in lookup ID decoding table
2524 	 * according to the way and lkpid.
2525 	 */
2526 	le.lkpid = port->id;
2527 	le.way = 0;
2528 	le.data = 0;
2529 
2530 	/* Set initial CPU queue for receiving packets */
2531 	le.data &= ~MVPP2_CLS_LKP_TBL_RXQ_MASK;
2532 	le.data |= port->first_rxq;
2533 
2534 	/* Disable classification engines */
2535 	le.data &= ~MVPP2_CLS_LKP_TBL_LOOKUP_EN_MASK;
2536 
2537 	/* Update lookup ID table entry */
2538 	mvpp2_cls_lookup_write(port->priv, &le);
2539 }
2540 
2541 /* Set CPU queue number for oversize packets */
2542 static void mvpp2_cls_oversize_rxq_set(struct mvpp2_port *port)
2543 {
2544 	u32 val;
2545 
2546 	mvpp2_write(port->priv, MVPP2_CLS_OVERSIZE_RXQ_LOW_REG(port->id),
2547 		    port->first_rxq & MVPP2_CLS_OVERSIZE_RXQ_LOW_MASK);
2548 
2549 	mvpp2_write(port->priv, MVPP2_CLS_SWFWD_P2HQ_REG(port->id),
2550 		    (port->first_rxq >> MVPP2_CLS_OVERSIZE_RXQ_LOW_BITS));
2551 
2552 	val = mvpp2_read(port->priv, MVPP2_CLS_SWFWD_PCTRL_REG);
2553 	val |= MVPP2_CLS_SWFWD_PCTRL_MASK(port->id);
2554 	mvpp2_write(port->priv, MVPP2_CLS_SWFWD_PCTRL_REG, val);
2555 }
2556 
2557 /* Buffer Manager configuration routines */
2558 
2559 /* Create pool */
2560 static int mvpp2_bm_pool_create(struct udevice *dev,
2561 				struct mvpp2 *priv,
2562 				struct mvpp2_bm_pool *bm_pool, int size)
2563 {
2564 	u32 val;
2565 
2566 	/* Number of buffer pointers must be a multiple of 16, as per
2567 	 * hardware constraints
2568 	 */
2569 	if (!IS_ALIGNED(size, 16))
2570 		return -EINVAL;
2571 
2572 	bm_pool->virt_addr = buffer_loc.bm_pool[bm_pool->id];
2573 	bm_pool->dma_addr = (dma_addr_t)buffer_loc.bm_pool[bm_pool->id];
2574 	if (!bm_pool->virt_addr)
2575 		return -ENOMEM;
2576 
2577 	if (!IS_ALIGNED((unsigned long)bm_pool->virt_addr,
2578 			MVPP2_BM_POOL_PTR_ALIGN)) {
2579 		dev_err(&pdev->dev, "BM pool %d is not %d bytes aligned\n",
2580 			bm_pool->id, MVPP2_BM_POOL_PTR_ALIGN);
2581 		return -ENOMEM;
2582 	}
2583 
2584 	mvpp2_write(priv, MVPP2_BM_POOL_BASE_REG(bm_pool->id),
2585 		    lower_32_bits(bm_pool->dma_addr));
2586 	if (priv->hw_version == MVPP22)
2587 		mvpp2_write(priv, MVPP22_BM_POOL_BASE_HIGH_REG,
2588 			    (upper_32_bits(bm_pool->dma_addr) &
2589 			    MVPP22_BM_POOL_BASE_HIGH_MASK));
2590 	mvpp2_write(priv, MVPP2_BM_POOL_SIZE_REG(bm_pool->id), size);
2591 
2592 	val = mvpp2_read(priv, MVPP2_BM_POOL_CTRL_REG(bm_pool->id));
2593 	val |= MVPP2_BM_START_MASK;
2594 	mvpp2_write(priv, MVPP2_BM_POOL_CTRL_REG(bm_pool->id), val);
2595 
2596 	bm_pool->type = MVPP2_BM_FREE;
2597 	bm_pool->size = size;
2598 	bm_pool->pkt_size = 0;
2599 	bm_pool->buf_num = 0;
2600 
2601 	return 0;
2602 }
2603 
2604 /* Set pool buffer size */
2605 static void mvpp2_bm_pool_bufsize_set(struct mvpp2 *priv,
2606 				      struct mvpp2_bm_pool *bm_pool,
2607 				      int buf_size)
2608 {
2609 	u32 val;
2610 
2611 	bm_pool->buf_size = buf_size;
2612 
2613 	val = ALIGN(buf_size, 1 << MVPP2_POOL_BUF_SIZE_OFFSET);
2614 	mvpp2_write(priv, MVPP2_POOL_BUF_SIZE_REG(bm_pool->id), val);
2615 }
2616 
2617 /* Free all buffers from the pool */
2618 static void mvpp2_bm_bufs_free(struct udevice *dev, struct mvpp2 *priv,
2619 			       struct mvpp2_bm_pool *bm_pool)
2620 {
2621 	int i;
2622 
2623 	for (i = 0; i < bm_pool->buf_num; i++) {
2624 		/* Allocate buffer back from the buffer manager */
2625 		mvpp2_read(priv, MVPP2_BM_PHY_ALLOC_REG(bm_pool->id));
2626 	}
2627 
2628 	bm_pool->buf_num = 0;
2629 }
2630 
2631 /* Cleanup pool */
2632 static int mvpp2_bm_pool_destroy(struct udevice *dev,
2633 				 struct mvpp2 *priv,
2634 				 struct mvpp2_bm_pool *bm_pool)
2635 {
2636 	u32 val;
2637 
2638 	mvpp2_bm_bufs_free(dev, priv, bm_pool);
2639 	if (bm_pool->buf_num) {
2640 		dev_err(dev, "cannot free all buffers in pool %d\n", bm_pool->id);
2641 		return 0;
2642 	}
2643 
2644 	val = mvpp2_read(priv, MVPP2_BM_POOL_CTRL_REG(bm_pool->id));
2645 	val |= MVPP2_BM_STOP_MASK;
2646 	mvpp2_write(priv, MVPP2_BM_POOL_CTRL_REG(bm_pool->id), val);
2647 
2648 	return 0;
2649 }
2650 
2651 static int mvpp2_bm_pools_init(struct udevice *dev,
2652 			       struct mvpp2 *priv)
2653 {
2654 	int i, err, size;
2655 	struct mvpp2_bm_pool *bm_pool;
2656 
2657 	/* Create all pools with maximum size */
2658 	size = MVPP2_BM_POOL_SIZE_MAX;
2659 	for (i = 0; i < MVPP2_BM_POOLS_NUM; i++) {
2660 		bm_pool = &priv->bm_pools[i];
2661 		bm_pool->id = i;
2662 		err = mvpp2_bm_pool_create(dev, priv, bm_pool, size);
2663 		if (err)
2664 			goto err_unroll_pools;
2665 		mvpp2_bm_pool_bufsize_set(priv, bm_pool, RX_BUFFER_SIZE);
2666 	}
2667 	return 0;
2668 
2669 err_unroll_pools:
2670 	dev_err(&pdev->dev, "failed to create BM pool %d, size %d\n", i, size);
2671 	for (i = i - 1; i >= 0; i--)
2672 		mvpp2_bm_pool_destroy(dev, priv, &priv->bm_pools[i]);
2673 	return err;
2674 }
2675 
2676 static int mvpp2_bm_init(struct udevice *dev, struct mvpp2 *priv)
2677 {
2678 	int i, err;
2679 
2680 	for (i = 0; i < MVPP2_BM_POOLS_NUM; i++) {
2681 		/* Mask BM all interrupts */
2682 		mvpp2_write(priv, MVPP2_BM_INTR_MASK_REG(i), 0);
2683 		/* Clear BM cause register */
2684 		mvpp2_write(priv, MVPP2_BM_INTR_CAUSE_REG(i), 0);
2685 	}
2686 
2687 	/* Allocate and initialize BM pools */
2688 	priv->bm_pools = devm_kcalloc(dev, MVPP2_BM_POOLS_NUM,
2689 				     sizeof(struct mvpp2_bm_pool), GFP_KERNEL);
2690 	if (!priv->bm_pools)
2691 		return -ENOMEM;
2692 
2693 	err = mvpp2_bm_pools_init(dev, priv);
2694 	if (err < 0)
2695 		return err;
2696 	return 0;
2697 }
2698 
2699 /* Attach long pool to rxq */
2700 static void mvpp2_rxq_long_pool_set(struct mvpp2_port *port,
2701 				    int lrxq, int long_pool)
2702 {
2703 	u32 val, mask;
2704 	int prxq;
2705 
2706 	/* Get queue physical ID */
2707 	prxq = port->rxqs[lrxq]->id;
2708 
2709 	if (port->priv->hw_version == MVPP21)
2710 		mask = MVPP21_RXQ_POOL_LONG_MASK;
2711 	else
2712 		mask = MVPP22_RXQ_POOL_LONG_MASK;
2713 
2714 	val = mvpp2_read(port->priv, MVPP2_RXQ_CONFIG_REG(prxq));
2715 	val &= ~mask;
2716 	val |= (long_pool << MVPP2_RXQ_POOL_LONG_OFFS) & mask;
2717 	mvpp2_write(port->priv, MVPP2_RXQ_CONFIG_REG(prxq), val);
2718 }
2719 
2720 /* Set pool number in a BM cookie */
2721 static inline u32 mvpp2_bm_cookie_pool_set(u32 cookie, int pool)
2722 {
2723 	u32 bm;
2724 
2725 	bm = cookie & ~(0xFF << MVPP2_BM_COOKIE_POOL_OFFS);
2726 	bm |= ((pool & 0xFF) << MVPP2_BM_COOKIE_POOL_OFFS);
2727 
2728 	return bm;
2729 }
2730 
2731 /* Get pool number from a BM cookie */
2732 static inline int mvpp2_bm_cookie_pool_get(unsigned long cookie)
2733 {
2734 	return (cookie >> MVPP2_BM_COOKIE_POOL_OFFS) & 0xFF;
2735 }
2736 
2737 /* Release buffer to BM */
2738 static inline void mvpp2_bm_pool_put(struct mvpp2_port *port, int pool,
2739 				     dma_addr_t buf_dma_addr,
2740 				     unsigned long buf_phys_addr)
2741 {
2742 	if (port->priv->hw_version == MVPP22) {
2743 		u32 val = 0;
2744 
2745 		if (sizeof(dma_addr_t) == 8)
2746 			val |= upper_32_bits(buf_dma_addr) &
2747 				MVPP22_BM_ADDR_HIGH_PHYS_RLS_MASK;
2748 
2749 		if (sizeof(phys_addr_t) == 8)
2750 			val |= (upper_32_bits(buf_phys_addr)
2751 				<< MVPP22_BM_ADDR_HIGH_VIRT_RLS_SHIFT) &
2752 				MVPP22_BM_ADDR_HIGH_VIRT_RLS_MASK;
2753 
2754 		mvpp2_write(port->priv, MVPP22_BM_ADDR_HIGH_RLS_REG, val);
2755 	}
2756 
2757 	/* MVPP2_BM_VIRT_RLS_REG is not interpreted by HW, and simply
2758 	 * returned in the "cookie" field of the RX
2759 	 * descriptor. Instead of storing the virtual address, we
2760 	 * store the physical address
2761 	 */
2762 	mvpp2_write(port->priv, MVPP2_BM_VIRT_RLS_REG, buf_phys_addr);
2763 	mvpp2_write(port->priv, MVPP2_BM_PHY_RLS_REG(pool), buf_dma_addr);
2764 }
2765 
2766 /* Refill BM pool */
2767 static void mvpp2_pool_refill(struct mvpp2_port *port, u32 bm,
2768 			      dma_addr_t dma_addr,
2769 			      phys_addr_t phys_addr)
2770 {
2771 	int pool = mvpp2_bm_cookie_pool_get(bm);
2772 
2773 	mvpp2_bm_pool_put(port, pool, dma_addr, phys_addr);
2774 }
2775 
2776 /* Allocate buffers for the pool */
2777 static int mvpp2_bm_bufs_add(struct mvpp2_port *port,
2778 			     struct mvpp2_bm_pool *bm_pool, int buf_num)
2779 {
2780 	int i;
2781 
2782 	if (buf_num < 0 ||
2783 	    (buf_num + bm_pool->buf_num > bm_pool->size)) {
2784 		netdev_err(port->dev,
2785 			   "cannot allocate %d buffers for pool %d\n",
2786 			   buf_num, bm_pool->id);
2787 		return 0;
2788 	}
2789 
2790 	for (i = 0; i < buf_num; i++) {
2791 		mvpp2_bm_pool_put(port, bm_pool->id,
2792 				  (dma_addr_t)buffer_loc.rx_buffer[i],
2793 				  (unsigned long)buffer_loc.rx_buffer[i]);
2794 
2795 	}
2796 
2797 	/* Update BM driver with number of buffers added to pool */
2798 	bm_pool->buf_num += i;
2799 
2800 	return i;
2801 }
2802 
2803 /* Notify the driver that BM pool is being used as specific type and return the
2804  * pool pointer on success
2805  */
2806 static struct mvpp2_bm_pool *
2807 mvpp2_bm_pool_use(struct mvpp2_port *port, int pool, enum mvpp2_bm_type type,
2808 		  int pkt_size)
2809 {
2810 	struct mvpp2_bm_pool *new_pool = &port->priv->bm_pools[pool];
2811 	int num;
2812 
2813 	if (new_pool->type != MVPP2_BM_FREE && new_pool->type != type) {
2814 		netdev_err(port->dev, "mixing pool types is forbidden\n");
2815 		return NULL;
2816 	}
2817 
2818 	if (new_pool->type == MVPP2_BM_FREE)
2819 		new_pool->type = type;
2820 
2821 	/* Allocate buffers in case BM pool is used as long pool, but packet
2822 	 * size doesn't match MTU or BM pool hasn't being used yet
2823 	 */
2824 	if (((type == MVPP2_BM_SWF_LONG) && (pkt_size > new_pool->pkt_size)) ||
2825 	    (new_pool->pkt_size == 0)) {
2826 		int pkts_num;
2827 
2828 		/* Set default buffer number or free all the buffers in case
2829 		 * the pool is not empty
2830 		 */
2831 		pkts_num = new_pool->buf_num;
2832 		if (pkts_num == 0)
2833 			pkts_num = type == MVPP2_BM_SWF_LONG ?
2834 				   MVPP2_BM_LONG_BUF_NUM :
2835 				   MVPP2_BM_SHORT_BUF_NUM;
2836 		else
2837 			mvpp2_bm_bufs_free(NULL,
2838 					   port->priv, new_pool);
2839 
2840 		new_pool->pkt_size = pkt_size;
2841 
2842 		/* Allocate buffers for this pool */
2843 		num = mvpp2_bm_bufs_add(port, new_pool, pkts_num);
2844 		if (num != pkts_num) {
2845 			dev_err(dev, "pool %d: %d of %d allocated\n",
2846 				new_pool->id, num, pkts_num);
2847 			return NULL;
2848 		}
2849 	}
2850 
2851 	return new_pool;
2852 }
2853 
2854 /* Initialize pools for swf */
2855 static int mvpp2_swf_bm_pool_init(struct mvpp2_port *port)
2856 {
2857 	int rxq;
2858 
2859 	if (!port->pool_long) {
2860 		port->pool_long =
2861 		       mvpp2_bm_pool_use(port, MVPP2_BM_SWF_LONG_POOL(port->id),
2862 					 MVPP2_BM_SWF_LONG,
2863 					 port->pkt_size);
2864 		if (!port->pool_long)
2865 			return -ENOMEM;
2866 
2867 		port->pool_long->port_map |= (1 << port->id);
2868 
2869 		for (rxq = 0; rxq < rxq_number; rxq++)
2870 			mvpp2_rxq_long_pool_set(port, rxq, port->pool_long->id);
2871 	}
2872 
2873 	return 0;
2874 }
2875 
2876 /* Port configuration routines */
2877 
2878 static void mvpp2_port_mii_set(struct mvpp2_port *port)
2879 {
2880 	u32 val;
2881 
2882 	val = readl(port->base + MVPP2_GMAC_CTRL_2_REG);
2883 
2884 	switch (port->phy_interface) {
2885 	case PHY_INTERFACE_MODE_SGMII:
2886 		val |= MVPP2_GMAC_INBAND_AN_MASK;
2887 		break;
2888 	case PHY_INTERFACE_MODE_RGMII:
2889 	case PHY_INTERFACE_MODE_RGMII_ID:
2890 		val |= MVPP2_GMAC_PORT_RGMII_MASK;
2891 	default:
2892 		val &= ~MVPP2_GMAC_PCS_ENABLE_MASK;
2893 	}
2894 
2895 	writel(val, port->base + MVPP2_GMAC_CTRL_2_REG);
2896 }
2897 
2898 static void mvpp2_port_fc_adv_enable(struct mvpp2_port *port)
2899 {
2900 	u32 val;
2901 
2902 	val = readl(port->base + MVPP2_GMAC_AUTONEG_CONFIG);
2903 	val |= MVPP2_GMAC_FC_ADV_EN;
2904 	writel(val, port->base + MVPP2_GMAC_AUTONEG_CONFIG);
2905 }
2906 
2907 static void mvpp2_port_enable(struct mvpp2_port *port)
2908 {
2909 	u32 val;
2910 
2911 	val = readl(port->base + MVPP2_GMAC_CTRL_0_REG);
2912 	val |= MVPP2_GMAC_PORT_EN_MASK;
2913 	val |= MVPP2_GMAC_MIB_CNTR_EN_MASK;
2914 	writel(val, port->base + MVPP2_GMAC_CTRL_0_REG);
2915 }
2916 
2917 static void mvpp2_port_disable(struct mvpp2_port *port)
2918 {
2919 	u32 val;
2920 
2921 	val = readl(port->base + MVPP2_GMAC_CTRL_0_REG);
2922 	val &= ~(MVPP2_GMAC_PORT_EN_MASK);
2923 	writel(val, port->base + MVPP2_GMAC_CTRL_0_REG);
2924 }
2925 
2926 /* Set IEEE 802.3x Flow Control Xon Packet Transmission Mode */
2927 static void mvpp2_port_periodic_xon_disable(struct mvpp2_port *port)
2928 {
2929 	u32 val;
2930 
2931 	val = readl(port->base + MVPP2_GMAC_CTRL_1_REG) &
2932 		    ~MVPP2_GMAC_PERIODIC_XON_EN_MASK;
2933 	writel(val, port->base + MVPP2_GMAC_CTRL_1_REG);
2934 }
2935 
2936 /* Configure loopback port */
2937 static void mvpp2_port_loopback_set(struct mvpp2_port *port)
2938 {
2939 	u32 val;
2940 
2941 	val = readl(port->base + MVPP2_GMAC_CTRL_1_REG);
2942 
2943 	if (port->speed == 1000)
2944 		val |= MVPP2_GMAC_GMII_LB_EN_MASK;
2945 	else
2946 		val &= ~MVPP2_GMAC_GMII_LB_EN_MASK;
2947 
2948 	if (port->phy_interface == PHY_INTERFACE_MODE_SGMII)
2949 		val |= MVPP2_GMAC_PCS_LB_EN_MASK;
2950 	else
2951 		val &= ~MVPP2_GMAC_PCS_LB_EN_MASK;
2952 
2953 	writel(val, port->base + MVPP2_GMAC_CTRL_1_REG);
2954 }
2955 
2956 static void mvpp2_port_reset(struct mvpp2_port *port)
2957 {
2958 	u32 val;
2959 
2960 	val = readl(port->base + MVPP2_GMAC_CTRL_2_REG) &
2961 		    ~MVPP2_GMAC_PORT_RESET_MASK;
2962 	writel(val, port->base + MVPP2_GMAC_CTRL_2_REG);
2963 
2964 	while (readl(port->base + MVPP2_GMAC_CTRL_2_REG) &
2965 	       MVPP2_GMAC_PORT_RESET_MASK)
2966 		continue;
2967 }
2968 
2969 /* Change maximum receive size of the port */
2970 static inline void mvpp2_gmac_max_rx_size_set(struct mvpp2_port *port)
2971 {
2972 	u32 val;
2973 
2974 	val = readl(port->base + MVPP2_GMAC_CTRL_0_REG);
2975 	val &= ~MVPP2_GMAC_MAX_RX_SIZE_MASK;
2976 	val |= (((port->pkt_size - MVPP2_MH_SIZE) / 2) <<
2977 		    MVPP2_GMAC_MAX_RX_SIZE_OFFS);
2978 	writel(val, port->base + MVPP2_GMAC_CTRL_0_REG);
2979 }
2980 
2981 /* PPv2.2 GoP/GMAC config */
2982 
2983 /* Set the MAC to reset or exit from reset */
2984 static int gop_gmac_reset(struct mvpp2_port *port, int reset)
2985 {
2986 	u32 val;
2987 
2988 	/* read - modify - write */
2989 	val = readl(port->base + MVPP2_GMAC_CTRL_2_REG);
2990 	if (reset)
2991 		val |= MVPP2_GMAC_PORT_RESET_MASK;
2992 	else
2993 		val &= ~MVPP2_GMAC_PORT_RESET_MASK;
2994 	writel(val, port->base + MVPP2_GMAC_CTRL_2_REG);
2995 
2996 	return 0;
2997 }
2998 
2999 /*
3000  * gop_gpcs_mode_cfg
3001  *
3002  * Configure port to working with Gig PCS or don't.
3003  */
3004 static int gop_gpcs_mode_cfg(struct mvpp2_port *port, int en)
3005 {
3006 	u32 val;
3007 
3008 	val = readl(port->base + MVPP2_GMAC_CTRL_2_REG);
3009 	if (en)
3010 		val |= MVPP2_GMAC_PCS_ENABLE_MASK;
3011 	else
3012 		val &= ~MVPP2_GMAC_PCS_ENABLE_MASK;
3013 	/* enable / disable PCS on this port */
3014 	writel(val, port->base + MVPP2_GMAC_CTRL_2_REG);
3015 
3016 	return 0;
3017 }
3018 
3019 static int gop_bypass_clk_cfg(struct mvpp2_port *port, int en)
3020 {
3021 	u32 val;
3022 
3023 	val = readl(port->base + MVPP2_GMAC_CTRL_2_REG);
3024 	if (en)
3025 		val |= MVPP2_GMAC_CLK_125_BYPS_EN_MASK;
3026 	else
3027 		val &= ~MVPP2_GMAC_CLK_125_BYPS_EN_MASK;
3028 	/* enable / disable PCS on this port */
3029 	writel(val, port->base + MVPP2_GMAC_CTRL_2_REG);
3030 
3031 	return 0;
3032 }
3033 
3034 static void gop_gmac_sgmii2_5_cfg(struct mvpp2_port *port)
3035 {
3036 	u32 val, thresh;
3037 
3038 	/*
3039 	 * Configure minimal level of the Tx FIFO before the lower part
3040 	 * starts to read a packet
3041 	 */
3042 	thresh = MVPP2_SGMII2_5_TX_FIFO_MIN_TH;
3043 	val = readl(port->base + MVPP2_GMAC_PORT_FIFO_CFG_1_REG);
3044 	val &= ~MVPP2_GMAC_TX_FIFO_MIN_TH_ALL_MASK;
3045 	val |= MVPP2_GMAC_TX_FIFO_MIN_TH_MASK(thresh);
3046 	writel(val, port->base + MVPP2_GMAC_PORT_FIFO_CFG_1_REG);
3047 
3048 	/* Disable bypass of sync module */
3049 	val = readl(port->base + MVPP2_GMAC_CTRL_4_REG);
3050 	val |= MVPP2_GMAC_CTRL4_SYNC_BYPASS_MASK;
3051 	/* configure DP clock select according to mode */
3052 	val |= MVPP2_GMAC_CTRL4_DP_CLK_SEL_MASK;
3053 	/* configure QSGMII bypass according to mode */
3054 	val |= MVPP2_GMAC_CTRL4_QSGMII_BYPASS_ACTIVE_MASK;
3055 	writel(val, port->base + MVPP2_GMAC_CTRL_4_REG);
3056 
3057 	val = readl(port->base + MVPP2_GMAC_CTRL_0_REG);
3058 	/*
3059 	 * Configure GIG MAC to 1000Base-X mode connected to a fiber
3060 	 * transceiver
3061 	 */
3062 	val |= MVPP2_GMAC_PORT_TYPE_MASK;
3063 	writel(val, port->base + MVPP2_GMAC_CTRL_0_REG);
3064 
3065 	/* configure AN 0x9268 */
3066 	val = MVPP2_GMAC_EN_PCS_AN |
3067 		MVPP2_GMAC_AN_BYPASS_EN |
3068 		MVPP2_GMAC_CONFIG_MII_SPEED  |
3069 		MVPP2_GMAC_CONFIG_GMII_SPEED     |
3070 		MVPP2_GMAC_FC_ADV_EN    |
3071 		MVPP2_GMAC_CONFIG_FULL_DUPLEX |
3072 		MVPP2_GMAC_CHOOSE_SAMPLE_TX_CONFIG;
3073 	writel(val, port->base + MVPP2_GMAC_AUTONEG_CONFIG);
3074 }
3075 
3076 static void gop_gmac_sgmii_cfg(struct mvpp2_port *port)
3077 {
3078 	u32 val, thresh;
3079 
3080 	/*
3081 	 * Configure minimal level of the Tx FIFO before the lower part
3082 	 * starts to read a packet
3083 	 */
3084 	thresh = MVPP2_SGMII_TX_FIFO_MIN_TH;
3085 	val = readl(port->base + MVPP2_GMAC_PORT_FIFO_CFG_1_REG);
3086 	val &= ~MVPP2_GMAC_TX_FIFO_MIN_TH_ALL_MASK;
3087 	val |= MVPP2_GMAC_TX_FIFO_MIN_TH_MASK(thresh);
3088 	writel(val, port->base + MVPP2_GMAC_PORT_FIFO_CFG_1_REG);
3089 
3090 	/* Disable bypass of sync module */
3091 	val = readl(port->base + MVPP2_GMAC_CTRL_4_REG);
3092 	val |= MVPP2_GMAC_CTRL4_SYNC_BYPASS_MASK;
3093 	/* configure DP clock select according to mode */
3094 	val &= ~MVPP2_GMAC_CTRL4_DP_CLK_SEL_MASK;
3095 	/* configure QSGMII bypass according to mode */
3096 	val |= MVPP2_GMAC_CTRL4_QSGMII_BYPASS_ACTIVE_MASK;
3097 	writel(val, port->base + MVPP2_GMAC_CTRL_4_REG);
3098 
3099 	val = readl(port->base + MVPP2_GMAC_CTRL_0_REG);
3100 	/* configure GIG MAC to SGMII mode */
3101 	val &= ~MVPP2_GMAC_PORT_TYPE_MASK;
3102 	writel(val, port->base + MVPP2_GMAC_CTRL_0_REG);
3103 
3104 	/* configure AN */
3105 	val = MVPP2_GMAC_EN_PCS_AN |
3106 		MVPP2_GMAC_AN_BYPASS_EN |
3107 		MVPP2_GMAC_AN_SPEED_EN  |
3108 		MVPP2_GMAC_EN_FC_AN     |
3109 		MVPP2_GMAC_AN_DUPLEX_EN |
3110 		MVPP2_GMAC_CHOOSE_SAMPLE_TX_CONFIG;
3111 	writel(val, port->base + MVPP2_GMAC_AUTONEG_CONFIG);
3112 }
3113 
3114 static void gop_gmac_rgmii_cfg(struct mvpp2_port *port)
3115 {
3116 	u32 val, thresh;
3117 
3118 	/*
3119 	 * Configure minimal level of the Tx FIFO before the lower part
3120 	 * starts to read a packet
3121 	 */
3122 	thresh = MVPP2_RGMII_TX_FIFO_MIN_TH;
3123 	val = readl(port->base + MVPP2_GMAC_PORT_FIFO_CFG_1_REG);
3124 	val &= ~MVPP2_GMAC_TX_FIFO_MIN_TH_ALL_MASK;
3125 	val |= MVPP2_GMAC_TX_FIFO_MIN_TH_MASK(thresh);
3126 	writel(val, port->base + MVPP2_GMAC_PORT_FIFO_CFG_1_REG);
3127 
3128 	/* Disable bypass of sync module */
3129 	val = readl(port->base + MVPP2_GMAC_CTRL_4_REG);
3130 	val |= MVPP2_GMAC_CTRL4_SYNC_BYPASS_MASK;
3131 	/* configure DP clock select according to mode */
3132 	val &= ~MVPP2_GMAC_CTRL4_DP_CLK_SEL_MASK;
3133 	val |= MVPP2_GMAC_CTRL4_QSGMII_BYPASS_ACTIVE_MASK;
3134 	val |= MVPP2_GMAC_CTRL4_EXT_PIN_GMII_SEL_MASK;
3135 	writel(val, port->base + MVPP2_GMAC_CTRL_4_REG);
3136 
3137 	val = readl(port->base + MVPP2_GMAC_CTRL_0_REG);
3138 	/* configure GIG MAC to SGMII mode */
3139 	val &= ~MVPP2_GMAC_PORT_TYPE_MASK;
3140 	writel(val, port->base + MVPP2_GMAC_CTRL_0_REG);
3141 
3142 	/* configure AN 0xb8e8 */
3143 	val = MVPP2_GMAC_AN_BYPASS_EN |
3144 		MVPP2_GMAC_AN_SPEED_EN   |
3145 		MVPP2_GMAC_EN_FC_AN      |
3146 		MVPP2_GMAC_AN_DUPLEX_EN  |
3147 		MVPP2_GMAC_CHOOSE_SAMPLE_TX_CONFIG;
3148 	writel(val, port->base + MVPP2_GMAC_AUTONEG_CONFIG);
3149 }
3150 
3151 /* Set the internal mux's to the required MAC in the GOP */
3152 static int gop_gmac_mode_cfg(struct mvpp2_port *port)
3153 {
3154 	u32 val;
3155 
3156 	/* Set TX FIFO thresholds */
3157 	switch (port->phy_interface) {
3158 	case PHY_INTERFACE_MODE_SGMII:
3159 		if (port->phy_speed == 2500)
3160 			gop_gmac_sgmii2_5_cfg(port);
3161 		else
3162 			gop_gmac_sgmii_cfg(port);
3163 		break;
3164 
3165 	case PHY_INTERFACE_MODE_RGMII:
3166 	case PHY_INTERFACE_MODE_RGMII_ID:
3167 		gop_gmac_rgmii_cfg(port);
3168 		break;
3169 
3170 	default:
3171 		return -1;
3172 	}
3173 
3174 	/* Jumbo frame support - 0x1400*2= 0x2800 bytes */
3175 	val = readl(port->base + MVPP2_GMAC_CTRL_0_REG);
3176 	val &= ~MVPP2_GMAC_MAX_RX_SIZE_MASK;
3177 	val |= 0x1400 << MVPP2_GMAC_MAX_RX_SIZE_OFFS;
3178 	writel(val, port->base + MVPP2_GMAC_CTRL_0_REG);
3179 
3180 	/* PeriodicXonEn disable */
3181 	val = readl(port->base + MVPP2_GMAC_CTRL_1_REG);
3182 	val &= ~MVPP2_GMAC_PERIODIC_XON_EN_MASK;
3183 	writel(val, port->base + MVPP2_GMAC_CTRL_1_REG);
3184 
3185 	return 0;
3186 }
3187 
3188 static void gop_xlg_2_gig_mac_cfg(struct mvpp2_port *port)
3189 {
3190 	u32 val;
3191 
3192 	/* relevant only for MAC0 (XLG0 and GMAC0) */
3193 	if (port->gop_id > 0)
3194 		return;
3195 
3196 	/* configure 1Gig MAC mode */
3197 	val = readl(port->base + MVPP22_XLG_CTRL3_REG);
3198 	val &= ~MVPP22_XLG_CTRL3_MACMODESELECT_MASK;
3199 	val |= MVPP22_XLG_CTRL3_MACMODESELECT_GMAC;
3200 	writel(val, port->base + MVPP22_XLG_CTRL3_REG);
3201 }
3202 
3203 static int gop_gpcs_reset(struct mvpp2_port *port, int reset)
3204 {
3205 	u32 val;
3206 
3207 	val = readl(port->base + MVPP2_GMAC_CTRL_2_REG);
3208 	if (reset)
3209 		val &= ~MVPP2_GMAC_SGMII_MODE_MASK;
3210 	else
3211 		val |= MVPP2_GMAC_SGMII_MODE_MASK;
3212 	writel(val, port->base + MVPP2_GMAC_CTRL_2_REG);
3213 
3214 	return 0;
3215 }
3216 
3217 /* Set the internal mux's to the required PCS in the PI */
3218 static int gop_xpcs_mode(struct mvpp2_port *port, int num_of_lanes)
3219 {
3220 	u32 val;
3221 	int lane;
3222 
3223 	switch (num_of_lanes) {
3224 	case 1:
3225 		lane = 0;
3226 		break;
3227 	case 2:
3228 		lane = 1;
3229 		break;
3230 	case 4:
3231 		lane = 2;
3232 		break;
3233 	default:
3234 		return -1;
3235 	}
3236 
3237 	/* configure XG MAC mode */
3238 	val = readl(port->priv->xpcs_base + MVPP22_XPCS_GLOBAL_CFG_0_REG);
3239 	val &= ~MVPP22_XPCS_PCSMODE_MASK;
3240 	val &= ~MVPP22_XPCS_LANEACTIVE_MASK;
3241 	val |= (2 * lane) << MVPP22_XPCS_LANEACTIVE_OFFS;
3242 	writel(val, port->priv->xpcs_base + MVPP22_XPCS_GLOBAL_CFG_0_REG);
3243 
3244 	return 0;
3245 }
3246 
3247 static int gop_mpcs_mode(struct mvpp2_port *port)
3248 {
3249 	u32 val;
3250 
3251 	/* configure PCS40G COMMON CONTROL */
3252 	val = readl(port->priv->mpcs_base + PCS40G_COMMON_CONTROL);
3253 	val &= ~FORWARD_ERROR_CORRECTION_MASK;
3254 	writel(val, port->priv->mpcs_base + PCS40G_COMMON_CONTROL);
3255 
3256 	/* configure PCS CLOCK RESET */
3257 	val = readl(port->priv->mpcs_base + PCS_CLOCK_RESET);
3258 	val &= ~CLK_DIVISION_RATIO_MASK;
3259 	val |= 1 << CLK_DIVISION_RATIO_OFFS;
3260 	writel(val, port->priv->mpcs_base + PCS_CLOCK_RESET);
3261 
3262 	val &= ~CLK_DIV_PHASE_SET_MASK;
3263 	val |= MAC_CLK_RESET_MASK;
3264 	val |= RX_SD_CLK_RESET_MASK;
3265 	val |= TX_SD_CLK_RESET_MASK;
3266 	writel(val, port->priv->mpcs_base + PCS_CLOCK_RESET);
3267 
3268 	return 0;
3269 }
3270 
3271 /* Set the internal mux's to the required MAC in the GOP */
3272 static int gop_xlg_mac_mode_cfg(struct mvpp2_port *port, int num_of_act_lanes)
3273 {
3274 	u32 val;
3275 
3276 	/* configure 10G MAC mode */
3277 	val = readl(port->base + MVPP22_XLG_CTRL0_REG);
3278 	val |= MVPP22_XLG_RX_FC_EN;
3279 	writel(val, port->base + MVPP22_XLG_CTRL0_REG);
3280 
3281 	val = readl(port->base + MVPP22_XLG_CTRL3_REG);
3282 	val &= ~MVPP22_XLG_CTRL3_MACMODESELECT_MASK;
3283 	val |= MVPP22_XLG_CTRL3_MACMODESELECT_10GMAC;
3284 	writel(val, port->base + MVPP22_XLG_CTRL3_REG);
3285 
3286 	/* read - modify - write */
3287 	val = readl(port->base + MVPP22_XLG_CTRL4_REG);
3288 	val &= ~MVPP22_XLG_MODE_DMA_1G;
3289 	val |= MVPP22_XLG_FORWARD_PFC_EN;
3290 	val |= MVPP22_XLG_FORWARD_802_3X_FC_EN;
3291 	val &= ~MVPP22_XLG_EN_IDLE_CHECK_FOR_LINK;
3292 	writel(val, port->base + MVPP22_XLG_CTRL4_REG);
3293 
3294 	/* Jumbo frame support: 0x1400 * 2 = 0x2800 bytes */
3295 	val = readl(port->base + MVPP22_XLG_CTRL1_REG);
3296 	val &= ~MVPP22_XLG_MAX_RX_SIZE_MASK;
3297 	val |= 0x1400 << MVPP22_XLG_MAX_RX_SIZE_OFFS;
3298 	writel(val, port->base + MVPP22_XLG_CTRL1_REG);
3299 
3300 	/* unmask link change interrupt */
3301 	val = readl(port->base + MVPP22_XLG_INTERRUPT_MASK_REG);
3302 	val |= MVPP22_XLG_INTERRUPT_LINK_CHANGE;
3303 	val |= 1; /* unmask summary bit */
3304 	writel(val, port->base + MVPP22_XLG_INTERRUPT_MASK_REG);
3305 
3306 	return 0;
3307 }
3308 
3309 /* Set PCS to reset or exit from reset */
3310 static int gop_xpcs_reset(struct mvpp2_port *port, int reset)
3311 {
3312 	u32 val;
3313 
3314 	/* read - modify - write */
3315 	val = readl(port->priv->xpcs_base + MVPP22_XPCS_GLOBAL_CFG_0_REG);
3316 	if (reset)
3317 		val &= ~MVPP22_XPCS_PCSRESET;
3318 	else
3319 		val |= MVPP22_XPCS_PCSRESET;
3320 	writel(val, port->priv->xpcs_base + MVPP22_XPCS_GLOBAL_CFG_0_REG);
3321 
3322 	return 0;
3323 }
3324 
3325 /* Set the MAC to reset or exit from reset */
3326 static int gop_xlg_mac_reset(struct mvpp2_port *port, int reset)
3327 {
3328 	u32 val;
3329 
3330 	/* read - modify - write */
3331 	val = readl(port->base + MVPP22_XLG_CTRL0_REG);
3332 	if (reset)
3333 		val &= ~MVPP22_XLG_MAC_RESETN;
3334 	else
3335 		val |= MVPP22_XLG_MAC_RESETN;
3336 	writel(val, port->base + MVPP22_XLG_CTRL0_REG);
3337 
3338 	return 0;
3339 }
3340 
3341 /*
3342  * gop_port_init
3343  *
3344  * Init physical port. Configures the port mode and all it's elements
3345  * accordingly.
3346  * Does not verify that the selected mode/port number is valid at the
3347  * core level.
3348  */
3349 static int gop_port_init(struct mvpp2_port *port)
3350 {
3351 	int mac_num = port->gop_id;
3352 	int num_of_act_lanes;
3353 
3354 	if (mac_num >= MVPP22_GOP_MAC_NUM) {
3355 		netdev_err(NULL, "%s: illegal port number %d", __func__,
3356 			   mac_num);
3357 		return -1;
3358 	}
3359 
3360 	switch (port->phy_interface) {
3361 	case PHY_INTERFACE_MODE_RGMII:
3362 	case PHY_INTERFACE_MODE_RGMII_ID:
3363 		gop_gmac_reset(port, 1);
3364 
3365 		/* configure PCS */
3366 		gop_gpcs_mode_cfg(port, 0);
3367 		gop_bypass_clk_cfg(port, 1);
3368 
3369 		/* configure MAC */
3370 		gop_gmac_mode_cfg(port);
3371 		/* pcs unreset */
3372 		gop_gpcs_reset(port, 0);
3373 
3374 		/* mac unreset */
3375 		gop_gmac_reset(port, 0);
3376 		break;
3377 
3378 	case PHY_INTERFACE_MODE_SGMII:
3379 		/* configure PCS */
3380 		gop_gpcs_mode_cfg(port, 1);
3381 
3382 		/* configure MAC */
3383 		gop_gmac_mode_cfg(port);
3384 		/* select proper Mac mode */
3385 		gop_xlg_2_gig_mac_cfg(port);
3386 
3387 		/* pcs unreset */
3388 		gop_gpcs_reset(port, 0);
3389 		/* mac unreset */
3390 		gop_gmac_reset(port, 0);
3391 		break;
3392 
3393 	case PHY_INTERFACE_MODE_SFI:
3394 		num_of_act_lanes = 2;
3395 		mac_num = 0;
3396 		/* configure PCS */
3397 		gop_xpcs_mode(port, num_of_act_lanes);
3398 		gop_mpcs_mode(port);
3399 		/* configure MAC */
3400 		gop_xlg_mac_mode_cfg(port, num_of_act_lanes);
3401 
3402 		/* pcs unreset */
3403 		gop_xpcs_reset(port, 0);
3404 
3405 		/* mac unreset */
3406 		gop_xlg_mac_reset(port, 0);
3407 		break;
3408 
3409 	default:
3410 		netdev_err(NULL, "%s: Requested port mode (%d) not supported\n",
3411 			   __func__, port->phy_interface);
3412 		return -1;
3413 	}
3414 
3415 	return 0;
3416 }
3417 
3418 static void gop_xlg_mac_port_enable(struct mvpp2_port *port, int enable)
3419 {
3420 	u32 val;
3421 
3422 	val = readl(port->base + MVPP22_XLG_CTRL0_REG);
3423 	if (enable) {
3424 		/* Enable port and MIB counters update */
3425 		val |= MVPP22_XLG_PORT_EN;
3426 		val &= ~MVPP22_XLG_MIBCNT_DIS;
3427 	} else {
3428 		/* Disable port */
3429 		val &= ~MVPP22_XLG_PORT_EN;
3430 	}
3431 	writel(val, port->base + MVPP22_XLG_CTRL0_REG);
3432 }
3433 
3434 static void gop_port_enable(struct mvpp2_port *port, int enable)
3435 {
3436 	switch (port->phy_interface) {
3437 	case PHY_INTERFACE_MODE_RGMII:
3438 	case PHY_INTERFACE_MODE_RGMII_ID:
3439 	case PHY_INTERFACE_MODE_SGMII:
3440 		if (enable)
3441 			mvpp2_port_enable(port);
3442 		else
3443 			mvpp2_port_disable(port);
3444 		break;
3445 
3446 	case PHY_INTERFACE_MODE_SFI:
3447 		gop_xlg_mac_port_enable(port, enable);
3448 
3449 		break;
3450 	default:
3451 		netdev_err(NULL, "%s: Wrong port mode (%d)\n", __func__,
3452 			   port->phy_interface);
3453 		return;
3454 	}
3455 }
3456 
3457 /* RFU1 functions */
3458 static inline u32 gop_rfu1_read(struct mvpp2 *priv, u32 offset)
3459 {
3460 	return readl(priv->rfu1_base + offset);
3461 }
3462 
3463 static inline void gop_rfu1_write(struct mvpp2 *priv, u32 offset, u32 data)
3464 {
3465 	writel(data, priv->rfu1_base + offset);
3466 }
3467 
3468 static u32 mvpp2_netc_cfg_create(int gop_id, phy_interface_t phy_type)
3469 {
3470 	u32 val = 0;
3471 
3472 	if (gop_id == 2) {
3473 		if (phy_type == PHY_INTERFACE_MODE_SGMII)
3474 			val |= MV_NETC_GE_MAC2_SGMII;
3475 	}
3476 
3477 	if (gop_id == 3) {
3478 		if (phy_type == PHY_INTERFACE_MODE_SGMII)
3479 			val |= MV_NETC_GE_MAC3_SGMII;
3480 		else if (phy_type == PHY_INTERFACE_MODE_RGMII ||
3481 			 phy_type == PHY_INTERFACE_MODE_RGMII_ID)
3482 			val |= MV_NETC_GE_MAC3_RGMII;
3483 	}
3484 
3485 	return val;
3486 }
3487 
3488 static void gop_netc_active_port(struct mvpp2 *priv, int gop_id, u32 val)
3489 {
3490 	u32 reg;
3491 
3492 	reg = gop_rfu1_read(priv, NETCOMP_PORTS_CONTROL_1_REG);
3493 	reg &= ~(NETC_PORTS_ACTIVE_MASK(gop_id));
3494 
3495 	val <<= NETC_PORTS_ACTIVE_OFFSET(gop_id);
3496 	val &= NETC_PORTS_ACTIVE_MASK(gop_id);
3497 
3498 	reg |= val;
3499 
3500 	gop_rfu1_write(priv, NETCOMP_PORTS_CONTROL_1_REG, reg);
3501 }
3502 
3503 static void gop_netc_mii_mode(struct mvpp2 *priv, int gop_id, u32 val)
3504 {
3505 	u32 reg;
3506 
3507 	reg = gop_rfu1_read(priv, NETCOMP_CONTROL_0_REG);
3508 	reg &= ~NETC_GBE_PORT1_MII_MODE_MASK;
3509 
3510 	val <<= NETC_GBE_PORT1_MII_MODE_OFFS;
3511 	val &= NETC_GBE_PORT1_MII_MODE_MASK;
3512 
3513 	reg |= val;
3514 
3515 	gop_rfu1_write(priv, NETCOMP_CONTROL_0_REG, reg);
3516 }
3517 
3518 static void gop_netc_gop_reset(struct mvpp2 *priv, u32 val)
3519 {
3520 	u32 reg;
3521 
3522 	reg = gop_rfu1_read(priv, GOP_SOFT_RESET_1_REG);
3523 	reg &= ~NETC_GOP_SOFT_RESET_MASK;
3524 
3525 	val <<= NETC_GOP_SOFT_RESET_OFFS;
3526 	val &= NETC_GOP_SOFT_RESET_MASK;
3527 
3528 	reg |= val;
3529 
3530 	gop_rfu1_write(priv, GOP_SOFT_RESET_1_REG, reg);
3531 }
3532 
3533 static void gop_netc_gop_clock_logic_set(struct mvpp2 *priv, u32 val)
3534 {
3535 	u32 reg;
3536 
3537 	reg = gop_rfu1_read(priv, NETCOMP_PORTS_CONTROL_0_REG);
3538 	reg &= ~NETC_CLK_DIV_PHASE_MASK;
3539 
3540 	val <<= NETC_CLK_DIV_PHASE_OFFS;
3541 	val &= NETC_CLK_DIV_PHASE_MASK;
3542 
3543 	reg |= val;
3544 
3545 	gop_rfu1_write(priv, NETCOMP_PORTS_CONTROL_0_REG, reg);
3546 }
3547 
3548 static void gop_netc_port_rf_reset(struct mvpp2 *priv, int gop_id, u32 val)
3549 {
3550 	u32 reg;
3551 
3552 	reg = gop_rfu1_read(priv, NETCOMP_PORTS_CONTROL_1_REG);
3553 	reg &= ~(NETC_PORT_GIG_RF_RESET_MASK(gop_id));
3554 
3555 	val <<= NETC_PORT_GIG_RF_RESET_OFFS(gop_id);
3556 	val &= NETC_PORT_GIG_RF_RESET_MASK(gop_id);
3557 
3558 	reg |= val;
3559 
3560 	gop_rfu1_write(priv, NETCOMP_PORTS_CONTROL_1_REG, reg);
3561 }
3562 
3563 static void gop_netc_gbe_sgmii_mode_select(struct mvpp2 *priv, int gop_id,
3564 					   u32 val)
3565 {
3566 	u32 reg, mask, offset;
3567 
3568 	if (gop_id == 2) {
3569 		mask = NETC_GBE_PORT0_SGMII_MODE_MASK;
3570 		offset = NETC_GBE_PORT0_SGMII_MODE_OFFS;
3571 	} else {
3572 		mask = NETC_GBE_PORT1_SGMII_MODE_MASK;
3573 		offset = NETC_GBE_PORT1_SGMII_MODE_OFFS;
3574 	}
3575 	reg = gop_rfu1_read(priv, NETCOMP_CONTROL_0_REG);
3576 	reg &= ~mask;
3577 
3578 	val <<= offset;
3579 	val &= mask;
3580 
3581 	reg |= val;
3582 
3583 	gop_rfu1_write(priv, NETCOMP_CONTROL_0_REG, reg);
3584 }
3585 
3586 static void gop_netc_bus_width_select(struct mvpp2 *priv, u32 val)
3587 {
3588 	u32 reg;
3589 
3590 	reg = gop_rfu1_read(priv, NETCOMP_PORTS_CONTROL_0_REG);
3591 	reg &= ~NETC_BUS_WIDTH_SELECT_MASK;
3592 
3593 	val <<= NETC_BUS_WIDTH_SELECT_OFFS;
3594 	val &= NETC_BUS_WIDTH_SELECT_MASK;
3595 
3596 	reg |= val;
3597 
3598 	gop_rfu1_write(priv, NETCOMP_PORTS_CONTROL_0_REG, reg);
3599 }
3600 
3601 static void gop_netc_sample_stages_timing(struct mvpp2 *priv, u32 val)
3602 {
3603 	u32 reg;
3604 
3605 	reg = gop_rfu1_read(priv, NETCOMP_PORTS_CONTROL_0_REG);
3606 	reg &= ~NETC_GIG_RX_DATA_SAMPLE_MASK;
3607 
3608 	val <<= NETC_GIG_RX_DATA_SAMPLE_OFFS;
3609 	val &= NETC_GIG_RX_DATA_SAMPLE_MASK;
3610 
3611 	reg |= val;
3612 
3613 	gop_rfu1_write(priv, NETCOMP_PORTS_CONTROL_0_REG, reg);
3614 }
3615 
3616 static void gop_netc_mac_to_xgmii(struct mvpp2 *priv, int gop_id,
3617 				  enum mv_netc_phase phase)
3618 {
3619 	switch (phase) {
3620 	case MV_NETC_FIRST_PHASE:
3621 		/* Set Bus Width to HB mode = 1 */
3622 		gop_netc_bus_width_select(priv, 1);
3623 		/* Select RGMII mode */
3624 		gop_netc_gbe_sgmii_mode_select(priv, gop_id, MV_NETC_GBE_XMII);
3625 		break;
3626 
3627 	case MV_NETC_SECOND_PHASE:
3628 		/* De-assert the relevant port HB reset */
3629 		gop_netc_port_rf_reset(priv, gop_id, 1);
3630 		break;
3631 	}
3632 }
3633 
3634 static void gop_netc_mac_to_sgmii(struct mvpp2 *priv, int gop_id,
3635 				  enum mv_netc_phase phase)
3636 {
3637 	switch (phase) {
3638 	case MV_NETC_FIRST_PHASE:
3639 		/* Set Bus Width to HB mode = 1 */
3640 		gop_netc_bus_width_select(priv, 1);
3641 		/* Select SGMII mode */
3642 		if (gop_id >= 1) {
3643 			gop_netc_gbe_sgmii_mode_select(priv, gop_id,
3644 						       MV_NETC_GBE_SGMII);
3645 		}
3646 
3647 		/* Configure the sample stages */
3648 		gop_netc_sample_stages_timing(priv, 0);
3649 		/* Configure the ComPhy Selector */
3650 		/* gop_netc_com_phy_selector_config(netComplex); */
3651 		break;
3652 
3653 	case MV_NETC_SECOND_PHASE:
3654 		/* De-assert the relevant port HB reset */
3655 		gop_netc_port_rf_reset(priv, gop_id, 1);
3656 		break;
3657 	}
3658 }
3659 
3660 static int gop_netc_init(struct mvpp2 *priv, enum mv_netc_phase phase)
3661 {
3662 	u32 c = priv->netc_config;
3663 
3664 	if (c & MV_NETC_GE_MAC2_SGMII)
3665 		gop_netc_mac_to_sgmii(priv, 2, phase);
3666 	else
3667 		gop_netc_mac_to_xgmii(priv, 2, phase);
3668 
3669 	if (c & MV_NETC_GE_MAC3_SGMII) {
3670 		gop_netc_mac_to_sgmii(priv, 3, phase);
3671 	} else {
3672 		gop_netc_mac_to_xgmii(priv, 3, phase);
3673 		if (c & MV_NETC_GE_MAC3_RGMII)
3674 			gop_netc_mii_mode(priv, 3, MV_NETC_GBE_RGMII);
3675 		else
3676 			gop_netc_mii_mode(priv, 3, MV_NETC_GBE_MII);
3677 	}
3678 
3679 	/* Activate gop ports 0, 2, 3 */
3680 	gop_netc_active_port(priv, 0, 1);
3681 	gop_netc_active_port(priv, 2, 1);
3682 	gop_netc_active_port(priv, 3, 1);
3683 
3684 	if (phase == MV_NETC_SECOND_PHASE) {
3685 		/* Enable the GOP internal clock logic */
3686 		gop_netc_gop_clock_logic_set(priv, 1);
3687 		/* De-assert GOP unit reset */
3688 		gop_netc_gop_reset(priv, 1);
3689 	}
3690 
3691 	return 0;
3692 }
3693 
3694 /* Set defaults to the MVPP2 port */
3695 static void mvpp2_defaults_set(struct mvpp2_port *port)
3696 {
3697 	int tx_port_num, val, queue, ptxq, lrxq;
3698 
3699 	if (port->priv->hw_version == MVPP21) {
3700 		/* Configure port to loopback if needed */
3701 		if (port->flags & MVPP2_F_LOOPBACK)
3702 			mvpp2_port_loopback_set(port);
3703 
3704 		/* Update TX FIFO MIN Threshold */
3705 		val = readl(port->base + MVPP2_GMAC_PORT_FIFO_CFG_1_REG);
3706 		val &= ~MVPP2_GMAC_TX_FIFO_MIN_TH_ALL_MASK;
3707 		/* Min. TX threshold must be less than minimal packet length */
3708 		val |= MVPP2_GMAC_TX_FIFO_MIN_TH_MASK(64 - 4 - 2);
3709 		writel(val, port->base + MVPP2_GMAC_PORT_FIFO_CFG_1_REG);
3710 	}
3711 
3712 	/* Disable Legacy WRR, Disable EJP, Release from reset */
3713 	tx_port_num = mvpp2_egress_port(port);
3714 	mvpp2_write(port->priv, MVPP2_TXP_SCHED_PORT_INDEX_REG,
3715 		    tx_port_num);
3716 	mvpp2_write(port->priv, MVPP2_TXP_SCHED_CMD_1_REG, 0);
3717 
3718 	/* Close bandwidth for all queues */
3719 	for (queue = 0; queue < MVPP2_MAX_TXQ; queue++) {
3720 		ptxq = mvpp2_txq_phys(port->id, queue);
3721 		mvpp2_write(port->priv,
3722 			    MVPP2_TXQ_SCHED_TOKEN_CNTR_REG(ptxq), 0);
3723 	}
3724 
3725 	/* Set refill period to 1 usec, refill tokens
3726 	 * and bucket size to maximum
3727 	 */
3728 	mvpp2_write(port->priv, MVPP2_TXP_SCHED_PERIOD_REG, 0xc8);
3729 	val = mvpp2_read(port->priv, MVPP2_TXP_SCHED_REFILL_REG);
3730 	val &= ~MVPP2_TXP_REFILL_PERIOD_ALL_MASK;
3731 	val |= MVPP2_TXP_REFILL_PERIOD_MASK(1);
3732 	val |= MVPP2_TXP_REFILL_TOKENS_ALL_MASK;
3733 	mvpp2_write(port->priv, MVPP2_TXP_SCHED_REFILL_REG, val);
3734 	val = MVPP2_TXP_TOKEN_SIZE_MAX;
3735 	mvpp2_write(port->priv, MVPP2_TXP_SCHED_TOKEN_SIZE_REG, val);
3736 
3737 	/* Set MaximumLowLatencyPacketSize value to 256 */
3738 	mvpp2_write(port->priv, MVPP2_RX_CTRL_REG(port->id),
3739 		    MVPP2_RX_USE_PSEUDO_FOR_CSUM_MASK |
3740 		    MVPP2_RX_LOW_LATENCY_PKT_SIZE(256));
3741 
3742 	/* Enable Rx cache snoop */
3743 	for (lrxq = 0; lrxq < rxq_number; lrxq++) {
3744 		queue = port->rxqs[lrxq]->id;
3745 		val = mvpp2_read(port->priv, MVPP2_RXQ_CONFIG_REG(queue));
3746 		val |= MVPP2_SNOOP_PKT_SIZE_MASK |
3747 			   MVPP2_SNOOP_BUF_HDR_MASK;
3748 		mvpp2_write(port->priv, MVPP2_RXQ_CONFIG_REG(queue), val);
3749 	}
3750 }
3751 
3752 /* Enable/disable receiving packets */
3753 static void mvpp2_ingress_enable(struct mvpp2_port *port)
3754 {
3755 	u32 val;
3756 	int lrxq, queue;
3757 
3758 	for (lrxq = 0; lrxq < rxq_number; lrxq++) {
3759 		queue = port->rxqs[lrxq]->id;
3760 		val = mvpp2_read(port->priv, MVPP2_RXQ_CONFIG_REG(queue));
3761 		val &= ~MVPP2_RXQ_DISABLE_MASK;
3762 		mvpp2_write(port->priv, MVPP2_RXQ_CONFIG_REG(queue), val);
3763 	}
3764 }
3765 
3766 static void mvpp2_ingress_disable(struct mvpp2_port *port)
3767 {
3768 	u32 val;
3769 	int lrxq, queue;
3770 
3771 	for (lrxq = 0; lrxq < rxq_number; lrxq++) {
3772 		queue = port->rxqs[lrxq]->id;
3773 		val = mvpp2_read(port->priv, MVPP2_RXQ_CONFIG_REG(queue));
3774 		val |= MVPP2_RXQ_DISABLE_MASK;
3775 		mvpp2_write(port->priv, MVPP2_RXQ_CONFIG_REG(queue), val);
3776 	}
3777 }
3778 
3779 /* Enable transmit via physical egress queue
3780  * - HW starts take descriptors from DRAM
3781  */
3782 static void mvpp2_egress_enable(struct mvpp2_port *port)
3783 {
3784 	u32 qmap;
3785 	int queue;
3786 	int tx_port_num = mvpp2_egress_port(port);
3787 
3788 	/* Enable all initialized TXs. */
3789 	qmap = 0;
3790 	for (queue = 0; queue < txq_number; queue++) {
3791 		struct mvpp2_tx_queue *txq = port->txqs[queue];
3792 
3793 		if (txq->descs != NULL)
3794 			qmap |= (1 << queue);
3795 	}
3796 
3797 	mvpp2_write(port->priv, MVPP2_TXP_SCHED_PORT_INDEX_REG, tx_port_num);
3798 	mvpp2_write(port->priv, MVPP2_TXP_SCHED_Q_CMD_REG, qmap);
3799 }
3800 
3801 /* Disable transmit via physical egress queue
3802  * - HW doesn't take descriptors from DRAM
3803  */
3804 static void mvpp2_egress_disable(struct mvpp2_port *port)
3805 {
3806 	u32 reg_data;
3807 	int delay;
3808 	int tx_port_num = mvpp2_egress_port(port);
3809 
3810 	/* Issue stop command for active channels only */
3811 	mvpp2_write(port->priv, MVPP2_TXP_SCHED_PORT_INDEX_REG, tx_port_num);
3812 	reg_data = (mvpp2_read(port->priv, MVPP2_TXP_SCHED_Q_CMD_REG)) &
3813 		    MVPP2_TXP_SCHED_ENQ_MASK;
3814 	if (reg_data != 0)
3815 		mvpp2_write(port->priv, MVPP2_TXP_SCHED_Q_CMD_REG,
3816 			    (reg_data << MVPP2_TXP_SCHED_DISQ_OFFSET));
3817 
3818 	/* Wait for all Tx activity to terminate. */
3819 	delay = 0;
3820 	do {
3821 		if (delay >= MVPP2_TX_DISABLE_TIMEOUT_MSEC) {
3822 			netdev_warn(port->dev,
3823 				    "Tx stop timed out, status=0x%08x\n",
3824 				    reg_data);
3825 			break;
3826 		}
3827 		mdelay(1);
3828 		delay++;
3829 
3830 		/* Check port TX Command register that all
3831 		 * Tx queues are stopped
3832 		 */
3833 		reg_data = mvpp2_read(port->priv, MVPP2_TXP_SCHED_Q_CMD_REG);
3834 	} while (reg_data & MVPP2_TXP_SCHED_ENQ_MASK);
3835 }
3836 
3837 /* Rx descriptors helper methods */
3838 
3839 /* Get number of Rx descriptors occupied by received packets */
3840 static inline int
3841 mvpp2_rxq_received(struct mvpp2_port *port, int rxq_id)
3842 {
3843 	u32 val = mvpp2_read(port->priv, MVPP2_RXQ_STATUS_REG(rxq_id));
3844 
3845 	return val & MVPP2_RXQ_OCCUPIED_MASK;
3846 }
3847 
3848 /* Update Rx queue status with the number of occupied and available
3849  * Rx descriptor slots.
3850  */
3851 static inline void
3852 mvpp2_rxq_status_update(struct mvpp2_port *port, int rxq_id,
3853 			int used_count, int free_count)
3854 {
3855 	/* Decrement the number of used descriptors and increment count
3856 	 * increment the number of free descriptors.
3857 	 */
3858 	u32 val = used_count | (free_count << MVPP2_RXQ_NUM_NEW_OFFSET);
3859 
3860 	mvpp2_write(port->priv, MVPP2_RXQ_STATUS_UPDATE_REG(rxq_id), val);
3861 }
3862 
3863 /* Get pointer to next RX descriptor to be processed by SW */
3864 static inline struct mvpp2_rx_desc *
3865 mvpp2_rxq_next_desc_get(struct mvpp2_rx_queue *rxq)
3866 {
3867 	int rx_desc = rxq->next_desc_to_proc;
3868 
3869 	rxq->next_desc_to_proc = MVPP2_QUEUE_NEXT_DESC(rxq, rx_desc);
3870 	prefetch(rxq->descs + rxq->next_desc_to_proc);
3871 	return rxq->descs + rx_desc;
3872 }
3873 
3874 /* Set rx queue offset */
3875 static void mvpp2_rxq_offset_set(struct mvpp2_port *port,
3876 				 int prxq, int offset)
3877 {
3878 	u32 val;
3879 
3880 	/* Convert offset from bytes to units of 32 bytes */
3881 	offset = offset >> 5;
3882 
3883 	val = mvpp2_read(port->priv, MVPP2_RXQ_CONFIG_REG(prxq));
3884 	val &= ~MVPP2_RXQ_PACKET_OFFSET_MASK;
3885 
3886 	/* Offset is in */
3887 	val |= ((offset << MVPP2_RXQ_PACKET_OFFSET_OFFS) &
3888 		    MVPP2_RXQ_PACKET_OFFSET_MASK);
3889 
3890 	mvpp2_write(port->priv, MVPP2_RXQ_CONFIG_REG(prxq), val);
3891 }
3892 
3893 /* Obtain BM cookie information from descriptor */
3894 static u32 mvpp2_bm_cookie_build(struct mvpp2_port *port,
3895 				 struct mvpp2_rx_desc *rx_desc)
3896 {
3897 	int cpu = smp_processor_id();
3898 	int pool;
3899 
3900 	pool = (mvpp2_rxdesc_status_get(port, rx_desc) &
3901 		MVPP2_RXD_BM_POOL_ID_MASK) >>
3902 		MVPP2_RXD_BM_POOL_ID_OFFS;
3903 
3904 	return ((pool & 0xFF) << MVPP2_BM_COOKIE_POOL_OFFS) |
3905 	       ((cpu & 0xFF) << MVPP2_BM_COOKIE_CPU_OFFS);
3906 }
3907 
3908 /* Tx descriptors helper methods */
3909 
3910 /* Get number of Tx descriptors waiting to be transmitted by HW */
3911 static int mvpp2_txq_pend_desc_num_get(struct mvpp2_port *port,
3912 				       struct mvpp2_tx_queue *txq)
3913 {
3914 	u32 val;
3915 
3916 	mvpp2_write(port->priv, MVPP2_TXQ_NUM_REG, txq->id);
3917 	val = mvpp2_read(port->priv, MVPP2_TXQ_PENDING_REG);
3918 
3919 	return val & MVPP2_TXQ_PENDING_MASK;
3920 }
3921 
3922 /* Get pointer to next Tx descriptor to be processed (send) by HW */
3923 static struct mvpp2_tx_desc *
3924 mvpp2_txq_next_desc_get(struct mvpp2_tx_queue *txq)
3925 {
3926 	int tx_desc = txq->next_desc_to_proc;
3927 
3928 	txq->next_desc_to_proc = MVPP2_QUEUE_NEXT_DESC(txq, tx_desc);
3929 	return txq->descs + tx_desc;
3930 }
3931 
3932 /* Update HW with number of aggregated Tx descriptors to be sent */
3933 static void mvpp2_aggr_txq_pend_desc_add(struct mvpp2_port *port, int pending)
3934 {
3935 	/* aggregated access - relevant TXQ number is written in TX desc */
3936 	mvpp2_write(port->priv, MVPP2_AGGR_TXQ_UPDATE_REG, pending);
3937 }
3938 
3939 /* Get number of sent descriptors and decrement counter.
3940  * The number of sent descriptors is returned.
3941  * Per-CPU access
3942  */
3943 static inline int mvpp2_txq_sent_desc_proc(struct mvpp2_port *port,
3944 					   struct mvpp2_tx_queue *txq)
3945 {
3946 	u32 val;
3947 
3948 	/* Reading status reg resets transmitted descriptor counter */
3949 	val = mvpp2_read(port->priv, MVPP2_TXQ_SENT_REG(txq->id));
3950 
3951 	return (val & MVPP2_TRANSMITTED_COUNT_MASK) >>
3952 		MVPP2_TRANSMITTED_COUNT_OFFSET;
3953 }
3954 
3955 static void mvpp2_txq_sent_counter_clear(void *arg)
3956 {
3957 	struct mvpp2_port *port = arg;
3958 	int queue;
3959 
3960 	for (queue = 0; queue < txq_number; queue++) {
3961 		int id = port->txqs[queue]->id;
3962 
3963 		mvpp2_read(port->priv, MVPP2_TXQ_SENT_REG(id));
3964 	}
3965 }
3966 
3967 /* Set max sizes for Tx queues */
3968 static void mvpp2_txp_max_tx_size_set(struct mvpp2_port *port)
3969 {
3970 	u32	val, size, mtu;
3971 	int	txq, tx_port_num;
3972 
3973 	mtu = port->pkt_size * 8;
3974 	if (mtu > MVPP2_TXP_MTU_MAX)
3975 		mtu = MVPP2_TXP_MTU_MAX;
3976 
3977 	/* WA for wrong Token bucket update: Set MTU value = 3*real MTU value */
3978 	mtu = 3 * mtu;
3979 
3980 	/* Indirect access to registers */
3981 	tx_port_num = mvpp2_egress_port(port);
3982 	mvpp2_write(port->priv, MVPP2_TXP_SCHED_PORT_INDEX_REG, tx_port_num);
3983 
3984 	/* Set MTU */
3985 	val = mvpp2_read(port->priv, MVPP2_TXP_SCHED_MTU_REG);
3986 	val &= ~MVPP2_TXP_MTU_MAX;
3987 	val |= mtu;
3988 	mvpp2_write(port->priv, MVPP2_TXP_SCHED_MTU_REG, val);
3989 
3990 	/* TXP token size and all TXQs token size must be larger that MTU */
3991 	val = mvpp2_read(port->priv, MVPP2_TXP_SCHED_TOKEN_SIZE_REG);
3992 	size = val & MVPP2_TXP_TOKEN_SIZE_MAX;
3993 	if (size < mtu) {
3994 		size = mtu;
3995 		val &= ~MVPP2_TXP_TOKEN_SIZE_MAX;
3996 		val |= size;
3997 		mvpp2_write(port->priv, MVPP2_TXP_SCHED_TOKEN_SIZE_REG, val);
3998 	}
3999 
4000 	for (txq = 0; txq < txq_number; txq++) {
4001 		val = mvpp2_read(port->priv,
4002 				 MVPP2_TXQ_SCHED_TOKEN_SIZE_REG(txq));
4003 		size = val & MVPP2_TXQ_TOKEN_SIZE_MAX;
4004 
4005 		if (size < mtu) {
4006 			size = mtu;
4007 			val &= ~MVPP2_TXQ_TOKEN_SIZE_MAX;
4008 			val |= size;
4009 			mvpp2_write(port->priv,
4010 				    MVPP2_TXQ_SCHED_TOKEN_SIZE_REG(txq),
4011 				    val);
4012 		}
4013 	}
4014 }
4015 
4016 /* Free Tx queue skbuffs */
4017 static void mvpp2_txq_bufs_free(struct mvpp2_port *port,
4018 				struct mvpp2_tx_queue *txq,
4019 				struct mvpp2_txq_pcpu *txq_pcpu, int num)
4020 {
4021 	int i;
4022 
4023 	for (i = 0; i < num; i++)
4024 		mvpp2_txq_inc_get(txq_pcpu);
4025 }
4026 
4027 static inline struct mvpp2_rx_queue *mvpp2_get_rx_queue(struct mvpp2_port *port,
4028 							u32 cause)
4029 {
4030 	int queue = fls(cause) - 1;
4031 
4032 	return port->rxqs[queue];
4033 }
4034 
4035 static inline struct mvpp2_tx_queue *mvpp2_get_tx_queue(struct mvpp2_port *port,
4036 							u32 cause)
4037 {
4038 	int queue = fls(cause) - 1;
4039 
4040 	return port->txqs[queue];
4041 }
4042 
4043 /* Rx/Tx queue initialization/cleanup methods */
4044 
4045 /* Allocate and initialize descriptors for aggr TXQ */
4046 static int mvpp2_aggr_txq_init(struct udevice *dev,
4047 			       struct mvpp2_tx_queue *aggr_txq,
4048 			       int desc_num, int cpu,
4049 			       struct mvpp2 *priv)
4050 {
4051 	u32 txq_dma;
4052 
4053 	/* Allocate memory for TX descriptors */
4054 	aggr_txq->descs = buffer_loc.aggr_tx_descs;
4055 	aggr_txq->descs_dma = (dma_addr_t)buffer_loc.aggr_tx_descs;
4056 	if (!aggr_txq->descs)
4057 		return -ENOMEM;
4058 
4059 	/* Make sure descriptor address is cache line size aligned  */
4060 	BUG_ON(aggr_txq->descs !=
4061 	       PTR_ALIGN(aggr_txq->descs, MVPP2_CPU_D_CACHE_LINE_SIZE));
4062 
4063 	aggr_txq->last_desc = aggr_txq->size - 1;
4064 
4065 	/* Aggr TXQ no reset WA */
4066 	aggr_txq->next_desc_to_proc = mvpp2_read(priv,
4067 						 MVPP2_AGGR_TXQ_INDEX_REG(cpu));
4068 
4069 	/* Set Tx descriptors queue starting address indirect
4070 	 * access
4071 	 */
4072 	if (priv->hw_version == MVPP21)
4073 		txq_dma = aggr_txq->descs_dma;
4074 	else
4075 		txq_dma = aggr_txq->descs_dma >>
4076 			MVPP22_AGGR_TXQ_DESC_ADDR_OFFS;
4077 
4078 	mvpp2_write(priv, MVPP2_AGGR_TXQ_DESC_ADDR_REG(cpu), txq_dma);
4079 	mvpp2_write(priv, MVPP2_AGGR_TXQ_DESC_SIZE_REG(cpu), desc_num);
4080 
4081 	return 0;
4082 }
4083 
4084 /* Create a specified Rx queue */
4085 static int mvpp2_rxq_init(struct mvpp2_port *port,
4086 			  struct mvpp2_rx_queue *rxq)
4087 
4088 {
4089 	u32 rxq_dma;
4090 
4091 	rxq->size = port->rx_ring_size;
4092 
4093 	/* Allocate memory for RX descriptors */
4094 	rxq->descs = buffer_loc.rx_descs;
4095 	rxq->descs_dma = (dma_addr_t)buffer_loc.rx_descs;
4096 	if (!rxq->descs)
4097 		return -ENOMEM;
4098 
4099 	BUG_ON(rxq->descs !=
4100 	       PTR_ALIGN(rxq->descs, MVPP2_CPU_D_CACHE_LINE_SIZE));
4101 
4102 	rxq->last_desc = rxq->size - 1;
4103 
4104 	/* Zero occupied and non-occupied counters - direct access */
4105 	mvpp2_write(port->priv, MVPP2_RXQ_STATUS_REG(rxq->id), 0);
4106 
4107 	/* Set Rx descriptors queue starting address - indirect access */
4108 	mvpp2_write(port->priv, MVPP2_RXQ_NUM_REG, rxq->id);
4109 	if (port->priv->hw_version == MVPP21)
4110 		rxq_dma = rxq->descs_dma;
4111 	else
4112 		rxq_dma = rxq->descs_dma >> MVPP22_DESC_ADDR_OFFS;
4113 	mvpp2_write(port->priv, MVPP2_RXQ_DESC_ADDR_REG, rxq_dma);
4114 	mvpp2_write(port->priv, MVPP2_RXQ_DESC_SIZE_REG, rxq->size);
4115 	mvpp2_write(port->priv, MVPP2_RXQ_INDEX_REG, 0);
4116 
4117 	/* Set Offset */
4118 	mvpp2_rxq_offset_set(port, rxq->id, NET_SKB_PAD);
4119 
4120 	/* Add number of descriptors ready for receiving packets */
4121 	mvpp2_rxq_status_update(port, rxq->id, 0, rxq->size);
4122 
4123 	return 0;
4124 }
4125 
4126 /* Push packets received by the RXQ to BM pool */
4127 static void mvpp2_rxq_drop_pkts(struct mvpp2_port *port,
4128 				struct mvpp2_rx_queue *rxq)
4129 {
4130 	int rx_received, i;
4131 
4132 	rx_received = mvpp2_rxq_received(port, rxq->id);
4133 	if (!rx_received)
4134 		return;
4135 
4136 	for (i = 0; i < rx_received; i++) {
4137 		struct mvpp2_rx_desc *rx_desc = mvpp2_rxq_next_desc_get(rxq);
4138 		u32 bm = mvpp2_bm_cookie_build(port, rx_desc);
4139 
4140 		mvpp2_pool_refill(port, bm,
4141 				  mvpp2_rxdesc_dma_addr_get(port, rx_desc),
4142 				  mvpp2_rxdesc_cookie_get(port, rx_desc));
4143 	}
4144 	mvpp2_rxq_status_update(port, rxq->id, rx_received, rx_received);
4145 }
4146 
4147 /* Cleanup Rx queue */
4148 static void mvpp2_rxq_deinit(struct mvpp2_port *port,
4149 			     struct mvpp2_rx_queue *rxq)
4150 {
4151 	mvpp2_rxq_drop_pkts(port, rxq);
4152 
4153 	rxq->descs             = NULL;
4154 	rxq->last_desc         = 0;
4155 	rxq->next_desc_to_proc = 0;
4156 	rxq->descs_dma         = 0;
4157 
4158 	/* Clear Rx descriptors queue starting address and size;
4159 	 * free descriptor number
4160 	 */
4161 	mvpp2_write(port->priv, MVPP2_RXQ_STATUS_REG(rxq->id), 0);
4162 	mvpp2_write(port->priv, MVPP2_RXQ_NUM_REG, rxq->id);
4163 	mvpp2_write(port->priv, MVPP2_RXQ_DESC_ADDR_REG, 0);
4164 	mvpp2_write(port->priv, MVPP2_RXQ_DESC_SIZE_REG, 0);
4165 }
4166 
4167 /* Create and initialize a Tx queue */
4168 static int mvpp2_txq_init(struct mvpp2_port *port,
4169 			  struct mvpp2_tx_queue *txq)
4170 {
4171 	u32 val;
4172 	int cpu, desc, desc_per_txq, tx_port_num;
4173 	struct mvpp2_txq_pcpu *txq_pcpu;
4174 
4175 	txq->size = port->tx_ring_size;
4176 
4177 	/* Allocate memory for Tx descriptors */
4178 	txq->descs = buffer_loc.tx_descs;
4179 	txq->descs_dma = (dma_addr_t)buffer_loc.tx_descs;
4180 	if (!txq->descs)
4181 		return -ENOMEM;
4182 
4183 	/* Make sure descriptor address is cache line size aligned  */
4184 	BUG_ON(txq->descs !=
4185 	       PTR_ALIGN(txq->descs, MVPP2_CPU_D_CACHE_LINE_SIZE));
4186 
4187 	txq->last_desc = txq->size - 1;
4188 
4189 	/* Set Tx descriptors queue starting address - indirect access */
4190 	mvpp2_write(port->priv, MVPP2_TXQ_NUM_REG, txq->id);
4191 	mvpp2_write(port->priv, MVPP2_TXQ_DESC_ADDR_REG, txq->descs_dma);
4192 	mvpp2_write(port->priv, MVPP2_TXQ_DESC_SIZE_REG, txq->size &
4193 					     MVPP2_TXQ_DESC_SIZE_MASK);
4194 	mvpp2_write(port->priv, MVPP2_TXQ_INDEX_REG, 0);
4195 	mvpp2_write(port->priv, MVPP2_TXQ_RSVD_CLR_REG,
4196 		    txq->id << MVPP2_TXQ_RSVD_CLR_OFFSET);
4197 	val = mvpp2_read(port->priv, MVPP2_TXQ_PENDING_REG);
4198 	val &= ~MVPP2_TXQ_PENDING_MASK;
4199 	mvpp2_write(port->priv, MVPP2_TXQ_PENDING_REG, val);
4200 
4201 	/* Calculate base address in prefetch buffer. We reserve 16 descriptors
4202 	 * for each existing TXQ.
4203 	 * TCONTS for PON port must be continuous from 0 to MVPP2_MAX_TCONT
4204 	 * GBE ports assumed to be continious from 0 to MVPP2_MAX_PORTS
4205 	 */
4206 	desc_per_txq = 16;
4207 	desc = (port->id * MVPP2_MAX_TXQ * desc_per_txq) +
4208 	       (txq->log_id * desc_per_txq);
4209 
4210 	mvpp2_write(port->priv, MVPP2_TXQ_PREF_BUF_REG,
4211 		    MVPP2_PREF_BUF_PTR(desc) | MVPP2_PREF_BUF_SIZE_16 |
4212 		    MVPP2_PREF_BUF_THRESH(desc_per_txq / 2));
4213 
4214 	/* WRR / EJP configuration - indirect access */
4215 	tx_port_num = mvpp2_egress_port(port);
4216 	mvpp2_write(port->priv, MVPP2_TXP_SCHED_PORT_INDEX_REG, tx_port_num);
4217 
4218 	val = mvpp2_read(port->priv, MVPP2_TXQ_SCHED_REFILL_REG(txq->log_id));
4219 	val &= ~MVPP2_TXQ_REFILL_PERIOD_ALL_MASK;
4220 	val |= MVPP2_TXQ_REFILL_PERIOD_MASK(1);
4221 	val |= MVPP2_TXQ_REFILL_TOKENS_ALL_MASK;
4222 	mvpp2_write(port->priv, MVPP2_TXQ_SCHED_REFILL_REG(txq->log_id), val);
4223 
4224 	val = MVPP2_TXQ_TOKEN_SIZE_MAX;
4225 	mvpp2_write(port->priv, MVPP2_TXQ_SCHED_TOKEN_SIZE_REG(txq->log_id),
4226 		    val);
4227 
4228 	for_each_present_cpu(cpu) {
4229 		txq_pcpu = per_cpu_ptr(txq->pcpu, cpu);
4230 		txq_pcpu->size = txq->size;
4231 	}
4232 
4233 	return 0;
4234 }
4235 
4236 /* Free allocated TXQ resources */
4237 static void mvpp2_txq_deinit(struct mvpp2_port *port,
4238 			     struct mvpp2_tx_queue *txq)
4239 {
4240 	txq->descs             = NULL;
4241 	txq->last_desc         = 0;
4242 	txq->next_desc_to_proc = 0;
4243 	txq->descs_dma         = 0;
4244 
4245 	/* Set minimum bandwidth for disabled TXQs */
4246 	mvpp2_write(port->priv, MVPP2_TXQ_SCHED_TOKEN_CNTR_REG(txq->id), 0);
4247 
4248 	/* Set Tx descriptors queue starting address and size */
4249 	mvpp2_write(port->priv, MVPP2_TXQ_NUM_REG, txq->id);
4250 	mvpp2_write(port->priv, MVPP2_TXQ_DESC_ADDR_REG, 0);
4251 	mvpp2_write(port->priv, MVPP2_TXQ_DESC_SIZE_REG, 0);
4252 }
4253 
4254 /* Cleanup Tx ports */
4255 static void mvpp2_txq_clean(struct mvpp2_port *port, struct mvpp2_tx_queue *txq)
4256 {
4257 	struct mvpp2_txq_pcpu *txq_pcpu;
4258 	int delay, pending, cpu;
4259 	u32 val;
4260 
4261 	mvpp2_write(port->priv, MVPP2_TXQ_NUM_REG, txq->id);
4262 	val = mvpp2_read(port->priv, MVPP2_TXQ_PREF_BUF_REG);
4263 	val |= MVPP2_TXQ_DRAIN_EN_MASK;
4264 	mvpp2_write(port->priv, MVPP2_TXQ_PREF_BUF_REG, val);
4265 
4266 	/* The napi queue has been stopped so wait for all packets
4267 	 * to be transmitted.
4268 	 */
4269 	delay = 0;
4270 	do {
4271 		if (delay >= MVPP2_TX_PENDING_TIMEOUT_MSEC) {
4272 			netdev_warn(port->dev,
4273 				    "port %d: cleaning queue %d timed out\n",
4274 				    port->id, txq->log_id);
4275 			break;
4276 		}
4277 		mdelay(1);
4278 		delay++;
4279 
4280 		pending = mvpp2_txq_pend_desc_num_get(port, txq);
4281 	} while (pending);
4282 
4283 	val &= ~MVPP2_TXQ_DRAIN_EN_MASK;
4284 	mvpp2_write(port->priv, MVPP2_TXQ_PREF_BUF_REG, val);
4285 
4286 	for_each_present_cpu(cpu) {
4287 		txq_pcpu = per_cpu_ptr(txq->pcpu, cpu);
4288 
4289 		/* Release all packets */
4290 		mvpp2_txq_bufs_free(port, txq, txq_pcpu, txq_pcpu->count);
4291 
4292 		/* Reset queue */
4293 		txq_pcpu->count = 0;
4294 		txq_pcpu->txq_put_index = 0;
4295 		txq_pcpu->txq_get_index = 0;
4296 	}
4297 }
4298 
4299 /* Cleanup all Tx queues */
4300 static void mvpp2_cleanup_txqs(struct mvpp2_port *port)
4301 {
4302 	struct mvpp2_tx_queue *txq;
4303 	int queue;
4304 	u32 val;
4305 
4306 	val = mvpp2_read(port->priv, MVPP2_TX_PORT_FLUSH_REG);
4307 
4308 	/* Reset Tx ports and delete Tx queues */
4309 	val |= MVPP2_TX_PORT_FLUSH_MASK(port->id);
4310 	mvpp2_write(port->priv, MVPP2_TX_PORT_FLUSH_REG, val);
4311 
4312 	for (queue = 0; queue < txq_number; queue++) {
4313 		txq = port->txqs[queue];
4314 		mvpp2_txq_clean(port, txq);
4315 		mvpp2_txq_deinit(port, txq);
4316 	}
4317 
4318 	mvpp2_txq_sent_counter_clear(port);
4319 
4320 	val &= ~MVPP2_TX_PORT_FLUSH_MASK(port->id);
4321 	mvpp2_write(port->priv, MVPP2_TX_PORT_FLUSH_REG, val);
4322 }
4323 
4324 /* Cleanup all Rx queues */
4325 static void mvpp2_cleanup_rxqs(struct mvpp2_port *port)
4326 {
4327 	int queue;
4328 
4329 	for (queue = 0; queue < rxq_number; queue++)
4330 		mvpp2_rxq_deinit(port, port->rxqs[queue]);
4331 }
4332 
4333 /* Init all Rx queues for port */
4334 static int mvpp2_setup_rxqs(struct mvpp2_port *port)
4335 {
4336 	int queue, err;
4337 
4338 	for (queue = 0; queue < rxq_number; queue++) {
4339 		err = mvpp2_rxq_init(port, port->rxqs[queue]);
4340 		if (err)
4341 			goto err_cleanup;
4342 	}
4343 	return 0;
4344 
4345 err_cleanup:
4346 	mvpp2_cleanup_rxqs(port);
4347 	return err;
4348 }
4349 
4350 /* Init all tx queues for port */
4351 static int mvpp2_setup_txqs(struct mvpp2_port *port)
4352 {
4353 	struct mvpp2_tx_queue *txq;
4354 	int queue, err;
4355 
4356 	for (queue = 0; queue < txq_number; queue++) {
4357 		txq = port->txqs[queue];
4358 		err = mvpp2_txq_init(port, txq);
4359 		if (err)
4360 			goto err_cleanup;
4361 	}
4362 
4363 	mvpp2_txq_sent_counter_clear(port);
4364 	return 0;
4365 
4366 err_cleanup:
4367 	mvpp2_cleanup_txqs(port);
4368 	return err;
4369 }
4370 
4371 /* Adjust link */
4372 static void mvpp2_link_event(struct mvpp2_port *port)
4373 {
4374 	struct phy_device *phydev = port->phy_dev;
4375 	int status_change = 0;
4376 	u32 val;
4377 
4378 	if (phydev->link) {
4379 		if ((port->speed != phydev->speed) ||
4380 		    (port->duplex != phydev->duplex)) {
4381 			u32 val;
4382 
4383 			val = readl(port->base + MVPP2_GMAC_AUTONEG_CONFIG);
4384 			val &= ~(MVPP2_GMAC_CONFIG_MII_SPEED |
4385 				 MVPP2_GMAC_CONFIG_GMII_SPEED |
4386 				 MVPP2_GMAC_CONFIG_FULL_DUPLEX |
4387 				 MVPP2_GMAC_AN_SPEED_EN |
4388 				 MVPP2_GMAC_AN_DUPLEX_EN);
4389 
4390 			if (phydev->duplex)
4391 				val |= MVPP2_GMAC_CONFIG_FULL_DUPLEX;
4392 
4393 			if (phydev->speed == SPEED_1000)
4394 				val |= MVPP2_GMAC_CONFIG_GMII_SPEED;
4395 			else if (phydev->speed == SPEED_100)
4396 				val |= MVPP2_GMAC_CONFIG_MII_SPEED;
4397 
4398 			writel(val, port->base + MVPP2_GMAC_AUTONEG_CONFIG);
4399 
4400 			port->duplex = phydev->duplex;
4401 			port->speed  = phydev->speed;
4402 		}
4403 	}
4404 
4405 	if (phydev->link != port->link) {
4406 		if (!phydev->link) {
4407 			port->duplex = -1;
4408 			port->speed = 0;
4409 		}
4410 
4411 		port->link = phydev->link;
4412 		status_change = 1;
4413 	}
4414 
4415 	if (status_change) {
4416 		if (phydev->link) {
4417 			val = readl(port->base + MVPP2_GMAC_AUTONEG_CONFIG);
4418 			val |= (MVPP2_GMAC_FORCE_LINK_PASS |
4419 				MVPP2_GMAC_FORCE_LINK_DOWN);
4420 			writel(val, port->base + MVPP2_GMAC_AUTONEG_CONFIG);
4421 			mvpp2_egress_enable(port);
4422 			mvpp2_ingress_enable(port);
4423 		} else {
4424 			mvpp2_ingress_disable(port);
4425 			mvpp2_egress_disable(port);
4426 		}
4427 	}
4428 }
4429 
4430 /* Main RX/TX processing routines */
4431 
4432 /* Display more error info */
4433 static void mvpp2_rx_error(struct mvpp2_port *port,
4434 			   struct mvpp2_rx_desc *rx_desc)
4435 {
4436 	u32 status = mvpp2_rxdesc_status_get(port, rx_desc);
4437 	size_t sz = mvpp2_rxdesc_size_get(port, rx_desc);
4438 
4439 	switch (status & MVPP2_RXD_ERR_CODE_MASK) {
4440 	case MVPP2_RXD_ERR_CRC:
4441 		netdev_err(port->dev, "bad rx status %08x (crc error), size=%zu\n",
4442 			   status, sz);
4443 		break;
4444 	case MVPP2_RXD_ERR_OVERRUN:
4445 		netdev_err(port->dev, "bad rx status %08x (overrun error), size=%zu\n",
4446 			   status, sz);
4447 		break;
4448 	case MVPP2_RXD_ERR_RESOURCE:
4449 		netdev_err(port->dev, "bad rx status %08x (resource error), size=%zu\n",
4450 			   status, sz);
4451 		break;
4452 	}
4453 }
4454 
4455 /* Reuse skb if possible, or allocate a new skb and add it to BM pool */
4456 static int mvpp2_rx_refill(struct mvpp2_port *port,
4457 			   struct mvpp2_bm_pool *bm_pool,
4458 			   u32 bm, dma_addr_t dma_addr)
4459 {
4460 	mvpp2_pool_refill(port, bm, dma_addr, (unsigned long)dma_addr);
4461 	return 0;
4462 }
4463 
4464 /* Set hw internals when starting port */
4465 static void mvpp2_start_dev(struct mvpp2_port *port)
4466 {
4467 	switch (port->phy_interface) {
4468 	case PHY_INTERFACE_MODE_RGMII:
4469 	case PHY_INTERFACE_MODE_RGMII_ID:
4470 	case PHY_INTERFACE_MODE_SGMII:
4471 		mvpp2_gmac_max_rx_size_set(port);
4472 	default:
4473 		break;
4474 	}
4475 
4476 	mvpp2_txp_max_tx_size_set(port);
4477 
4478 	if (port->priv->hw_version == MVPP21)
4479 		mvpp2_port_enable(port);
4480 	else
4481 		gop_port_enable(port, 1);
4482 }
4483 
4484 /* Set hw internals when stopping port */
4485 static void mvpp2_stop_dev(struct mvpp2_port *port)
4486 {
4487 	/* Stop new packets from arriving to RXQs */
4488 	mvpp2_ingress_disable(port);
4489 
4490 	mvpp2_egress_disable(port);
4491 
4492 	if (port->priv->hw_version == MVPP21)
4493 		mvpp2_port_disable(port);
4494 	else
4495 		gop_port_enable(port, 0);
4496 }
4497 
4498 static int mvpp2_phy_connect(struct udevice *dev, struct mvpp2_port *port)
4499 {
4500 	struct phy_device *phy_dev;
4501 
4502 	if (!port->init || port->link == 0) {
4503 		phy_dev = phy_connect(port->priv->bus, port->phyaddr, dev,
4504 				      port->phy_interface);
4505 		port->phy_dev = phy_dev;
4506 		if (!phy_dev) {
4507 			netdev_err(port->dev, "cannot connect to phy\n");
4508 			return -ENODEV;
4509 		}
4510 		phy_dev->supported &= PHY_GBIT_FEATURES;
4511 		phy_dev->advertising = phy_dev->supported;
4512 
4513 		port->phy_dev = phy_dev;
4514 		port->link    = 0;
4515 		port->duplex  = 0;
4516 		port->speed   = 0;
4517 
4518 		phy_config(phy_dev);
4519 		phy_startup(phy_dev);
4520 		if (!phy_dev->link) {
4521 			printf("%s: No link\n", phy_dev->dev->name);
4522 			return -1;
4523 		}
4524 
4525 		port->init = 1;
4526 	} else {
4527 		mvpp2_egress_enable(port);
4528 		mvpp2_ingress_enable(port);
4529 	}
4530 
4531 	return 0;
4532 }
4533 
4534 static int mvpp2_open(struct udevice *dev, struct mvpp2_port *port)
4535 {
4536 	unsigned char mac_bcast[ETH_ALEN] = {
4537 			0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
4538 	int err;
4539 
4540 	err = mvpp2_prs_mac_da_accept(port->priv, port->id, mac_bcast, true);
4541 	if (err) {
4542 		netdev_err(dev, "mvpp2_prs_mac_da_accept BC failed\n");
4543 		return err;
4544 	}
4545 	err = mvpp2_prs_mac_da_accept(port->priv, port->id,
4546 				      port->dev_addr, true);
4547 	if (err) {
4548 		netdev_err(dev, "mvpp2_prs_mac_da_accept MC failed\n");
4549 		return err;
4550 	}
4551 	err = mvpp2_prs_def_flow(port);
4552 	if (err) {
4553 		netdev_err(dev, "mvpp2_prs_def_flow failed\n");
4554 		return err;
4555 	}
4556 
4557 	/* Allocate the Rx/Tx queues */
4558 	err = mvpp2_setup_rxqs(port);
4559 	if (err) {
4560 		netdev_err(port->dev, "cannot allocate Rx queues\n");
4561 		return err;
4562 	}
4563 
4564 	err = mvpp2_setup_txqs(port);
4565 	if (err) {
4566 		netdev_err(port->dev, "cannot allocate Tx queues\n");
4567 		return err;
4568 	}
4569 
4570 	if (port->phy_node) {
4571 		err = mvpp2_phy_connect(dev, port);
4572 		if (err < 0)
4573 			return err;
4574 
4575 		mvpp2_link_event(port);
4576 	} else {
4577 		mvpp2_egress_enable(port);
4578 		mvpp2_ingress_enable(port);
4579 	}
4580 
4581 	mvpp2_start_dev(port);
4582 
4583 	return 0;
4584 }
4585 
4586 /* No Device ops here in U-Boot */
4587 
4588 /* Driver initialization */
4589 
4590 static void mvpp2_port_power_up(struct mvpp2_port *port)
4591 {
4592 	struct mvpp2 *priv = port->priv;
4593 
4594 	/* On PPv2.2 the GoP / interface configuration has already been done */
4595 	if (priv->hw_version == MVPP21)
4596 		mvpp2_port_mii_set(port);
4597 	mvpp2_port_periodic_xon_disable(port);
4598 	if (priv->hw_version == MVPP21)
4599 		mvpp2_port_fc_adv_enable(port);
4600 	mvpp2_port_reset(port);
4601 }
4602 
4603 /* Initialize port HW */
4604 static int mvpp2_port_init(struct udevice *dev, struct mvpp2_port *port)
4605 {
4606 	struct mvpp2 *priv = port->priv;
4607 	struct mvpp2_txq_pcpu *txq_pcpu;
4608 	int queue, cpu, err;
4609 
4610 	if (port->first_rxq + rxq_number >
4611 	    MVPP2_MAX_PORTS * priv->max_port_rxqs)
4612 		return -EINVAL;
4613 
4614 	/* Disable port */
4615 	mvpp2_egress_disable(port);
4616 	if (priv->hw_version == MVPP21)
4617 		mvpp2_port_disable(port);
4618 	else
4619 		gop_port_enable(port, 0);
4620 
4621 	port->txqs = devm_kcalloc(dev, txq_number, sizeof(*port->txqs),
4622 				  GFP_KERNEL);
4623 	if (!port->txqs)
4624 		return -ENOMEM;
4625 
4626 	/* Associate physical Tx queues to this port and initialize.
4627 	 * The mapping is predefined.
4628 	 */
4629 	for (queue = 0; queue < txq_number; queue++) {
4630 		int queue_phy_id = mvpp2_txq_phys(port->id, queue);
4631 		struct mvpp2_tx_queue *txq;
4632 
4633 		txq = devm_kzalloc(dev, sizeof(*txq), GFP_KERNEL);
4634 		if (!txq)
4635 			return -ENOMEM;
4636 
4637 		txq->pcpu = devm_kzalloc(dev, sizeof(struct mvpp2_txq_pcpu),
4638 					 GFP_KERNEL);
4639 		if (!txq->pcpu)
4640 			return -ENOMEM;
4641 
4642 		txq->id = queue_phy_id;
4643 		txq->log_id = queue;
4644 		txq->done_pkts_coal = MVPP2_TXDONE_COAL_PKTS_THRESH;
4645 		for_each_present_cpu(cpu) {
4646 			txq_pcpu = per_cpu_ptr(txq->pcpu, cpu);
4647 			txq_pcpu->cpu = cpu;
4648 		}
4649 
4650 		port->txqs[queue] = txq;
4651 	}
4652 
4653 	port->rxqs = devm_kcalloc(dev, rxq_number, sizeof(*port->rxqs),
4654 				  GFP_KERNEL);
4655 	if (!port->rxqs)
4656 		return -ENOMEM;
4657 
4658 	/* Allocate and initialize Rx queue for this port */
4659 	for (queue = 0; queue < rxq_number; queue++) {
4660 		struct mvpp2_rx_queue *rxq;
4661 
4662 		/* Map physical Rx queue to port's logical Rx queue */
4663 		rxq = devm_kzalloc(dev, sizeof(*rxq), GFP_KERNEL);
4664 		if (!rxq)
4665 			return -ENOMEM;
4666 		/* Map this Rx queue to a physical queue */
4667 		rxq->id = port->first_rxq + queue;
4668 		rxq->port = port->id;
4669 		rxq->logic_rxq = queue;
4670 
4671 		port->rxqs[queue] = rxq;
4672 	}
4673 
4674 
4675 	/* Create Rx descriptor rings */
4676 	for (queue = 0; queue < rxq_number; queue++) {
4677 		struct mvpp2_rx_queue *rxq = port->rxqs[queue];
4678 
4679 		rxq->size = port->rx_ring_size;
4680 		rxq->pkts_coal = MVPP2_RX_COAL_PKTS;
4681 		rxq->time_coal = MVPP2_RX_COAL_USEC;
4682 	}
4683 
4684 	mvpp2_ingress_disable(port);
4685 
4686 	/* Port default configuration */
4687 	mvpp2_defaults_set(port);
4688 
4689 	/* Port's classifier configuration */
4690 	mvpp2_cls_oversize_rxq_set(port);
4691 	mvpp2_cls_port_config(port);
4692 
4693 	/* Provide an initial Rx packet size */
4694 	port->pkt_size = MVPP2_RX_PKT_SIZE(PKTSIZE_ALIGN);
4695 
4696 	/* Initialize pools for swf */
4697 	err = mvpp2_swf_bm_pool_init(port);
4698 	if (err)
4699 		return err;
4700 
4701 	return 0;
4702 }
4703 
4704 static int phy_info_parse(struct udevice *dev, struct mvpp2_port *port)
4705 {
4706 	int port_node = dev_of_offset(dev);
4707 	const char *phy_mode_str;
4708 	int phy_node, mdio_off, cp_node;
4709 	u32 id;
4710 	u32 phyaddr = 0;
4711 	int phy_mode = -1;
4712 	phys_addr_t mdio_addr;
4713 
4714 	phy_node = fdtdec_lookup_phandle(gd->fdt_blob, port_node, "phy");
4715 
4716 	if (phy_node > 0) {
4717 		phyaddr = fdtdec_get_int(gd->fdt_blob, phy_node, "reg", 0);
4718 		if (phyaddr < 0) {
4719 			dev_err(&pdev->dev, "could not find phy address\n");
4720 			return -1;
4721 		}
4722 		mdio_off = fdt_parent_offset(gd->fdt_blob, phy_node);
4723 
4724 		/* TODO: This WA for mdio issue. U-boot 2017 don't have
4725 		 * mdio driver and on MACHIATOBin board ports from CP1
4726 		 * connected to mdio on CP0.
4727 		 * WA is to get mdio address from phy handler parent
4728 		 * base address. WA should be removed after
4729 		 * mdio driver implementation.
4730 		 */
4731 		mdio_addr = fdtdec_get_uint(gd->fdt_blob,
4732 					    mdio_off, "reg", 0);
4733 
4734 		cp_node = fdt_parent_offset(gd->fdt_blob, mdio_off);
4735 		mdio_addr |= fdt_get_base_address((void *)gd->fdt_blob,
4736 						  cp_node);
4737 
4738 		port->priv->mdio_base = (void *)mdio_addr;
4739 
4740 		if (port->priv->mdio_base < 0) {
4741 			dev_err(&pdev->dev, "could not find mdio base address\n");
4742 			return -1;
4743 		}
4744 	} else {
4745 		phy_node = 0;
4746 	}
4747 
4748 	phy_mode_str = fdt_getprop(gd->fdt_blob, port_node, "phy-mode", NULL);
4749 	if (phy_mode_str)
4750 		phy_mode = phy_get_interface_by_name(phy_mode_str);
4751 	if (phy_mode == -1) {
4752 		dev_err(&pdev->dev, "incorrect phy mode\n");
4753 		return -EINVAL;
4754 	}
4755 
4756 	id = fdtdec_get_int(gd->fdt_blob, port_node, "port-id", -1);
4757 	if (id == -1) {
4758 		dev_err(&pdev->dev, "missing port-id value\n");
4759 		return -EINVAL;
4760 	}
4761 
4762 #ifdef CONFIG_DM_GPIO
4763 	gpio_request_by_name(dev, "phy-reset-gpios", 0,
4764 			     &port->phy_reset_gpio, GPIOD_IS_OUT);
4765 	gpio_request_by_name(dev, "marvell,sfp-tx-disable-gpio", 0,
4766 			     &port->phy_tx_disable_gpio, GPIOD_IS_OUT);
4767 #endif
4768 
4769 	/*
4770 	 * ToDo:
4771 	 * Not sure if this DT property "phy-speed" will get accepted, so
4772 	 * this might change later
4773 	 */
4774 	/* Get phy-speed for SGMII 2.5Gbps vs 1Gbps setup */
4775 	port->phy_speed = fdtdec_get_int(gd->fdt_blob, port_node,
4776 					 "phy-speed", 1000);
4777 
4778 	port->id = id;
4779 	if (port->priv->hw_version == MVPP21)
4780 		port->first_rxq = port->id * rxq_number;
4781 	else
4782 		port->first_rxq = port->id * port->priv->max_port_rxqs;
4783 	port->phy_node = phy_node;
4784 	port->phy_interface = phy_mode;
4785 	port->phyaddr = phyaddr;
4786 
4787 	return 0;
4788 }
4789 
4790 #ifdef CONFIG_DM_GPIO
4791 /* Port GPIO initialization */
4792 static void mvpp2_gpio_init(struct mvpp2_port *port)
4793 {
4794 	if (dm_gpio_is_valid(&port->phy_reset_gpio)) {
4795 		dm_gpio_set_value(&port->phy_reset_gpio, 1);
4796 		mdelay(10);
4797 		dm_gpio_set_value(&port->phy_reset_gpio, 0);
4798 	}
4799 
4800 	if (dm_gpio_is_valid(&port->phy_tx_disable_gpio))
4801 		dm_gpio_set_value(&port->phy_tx_disable_gpio, 0);
4802 }
4803 #endif
4804 
4805 /* Ports initialization */
4806 static int mvpp2_port_probe(struct udevice *dev,
4807 			    struct mvpp2_port *port,
4808 			    int port_node,
4809 			    struct mvpp2 *priv)
4810 {
4811 	int err;
4812 
4813 	port->tx_ring_size = MVPP2_MAX_TXD;
4814 	port->rx_ring_size = MVPP2_MAX_RXD;
4815 
4816 	err = mvpp2_port_init(dev, port);
4817 	if (err < 0) {
4818 		dev_err(&pdev->dev, "failed to init port %d\n", port->id);
4819 		return err;
4820 	}
4821 	mvpp2_port_power_up(port);
4822 
4823 #ifdef CONFIG_DM_GPIO
4824 	mvpp2_gpio_init(port);
4825 #endif
4826 
4827 	priv->port_list[port->id] = port;
4828 	priv->num_ports++;
4829 	return 0;
4830 }
4831 
4832 /* Initialize decoding windows */
4833 static void mvpp2_conf_mbus_windows(const struct mbus_dram_target_info *dram,
4834 				    struct mvpp2 *priv)
4835 {
4836 	u32 win_enable;
4837 	int i;
4838 
4839 	for (i = 0; i < 6; i++) {
4840 		mvpp2_write(priv, MVPP2_WIN_BASE(i), 0);
4841 		mvpp2_write(priv, MVPP2_WIN_SIZE(i), 0);
4842 
4843 		if (i < 4)
4844 			mvpp2_write(priv, MVPP2_WIN_REMAP(i), 0);
4845 	}
4846 
4847 	win_enable = 0;
4848 
4849 	for (i = 0; i < dram->num_cs; i++) {
4850 		const struct mbus_dram_window *cs = dram->cs + i;
4851 
4852 		mvpp2_write(priv, MVPP2_WIN_BASE(i),
4853 			    (cs->base & 0xffff0000) | (cs->mbus_attr << 8) |
4854 			    dram->mbus_dram_target_id);
4855 
4856 		mvpp2_write(priv, MVPP2_WIN_SIZE(i),
4857 			    (cs->size - 1) & 0xffff0000);
4858 
4859 		win_enable |= (1 << i);
4860 	}
4861 
4862 	mvpp2_write(priv, MVPP2_BASE_ADDR_ENABLE, win_enable);
4863 }
4864 
4865 /* Initialize Rx FIFO's */
4866 static void mvpp2_rx_fifo_init(struct mvpp2 *priv)
4867 {
4868 	int port;
4869 
4870 	for (port = 0; port < MVPP2_MAX_PORTS; port++) {
4871 		if (priv->hw_version == MVPP22) {
4872 			if (port == 0) {
4873 				mvpp2_write(priv,
4874 					    MVPP2_RX_DATA_FIFO_SIZE_REG(port),
4875 					    MVPP22_RX_FIFO_10GB_PORT_DATA_SIZE);
4876 				mvpp2_write(priv,
4877 					    MVPP2_RX_ATTR_FIFO_SIZE_REG(port),
4878 					    MVPP22_RX_FIFO_10GB_PORT_ATTR_SIZE);
4879 			} else if (port == 1) {
4880 				mvpp2_write(priv,
4881 					    MVPP2_RX_DATA_FIFO_SIZE_REG(port),
4882 					    MVPP22_RX_FIFO_2_5GB_PORT_DATA_SIZE);
4883 				mvpp2_write(priv,
4884 					    MVPP2_RX_ATTR_FIFO_SIZE_REG(port),
4885 					    MVPP22_RX_FIFO_2_5GB_PORT_ATTR_SIZE);
4886 			} else {
4887 				mvpp2_write(priv,
4888 					    MVPP2_RX_DATA_FIFO_SIZE_REG(port),
4889 					    MVPP22_RX_FIFO_1GB_PORT_DATA_SIZE);
4890 				mvpp2_write(priv,
4891 					    MVPP2_RX_ATTR_FIFO_SIZE_REG(port),
4892 					    MVPP22_RX_FIFO_1GB_PORT_ATTR_SIZE);
4893 			}
4894 		} else {
4895 			mvpp2_write(priv, MVPP2_RX_DATA_FIFO_SIZE_REG(port),
4896 				    MVPP21_RX_FIFO_PORT_DATA_SIZE);
4897 			mvpp2_write(priv, MVPP2_RX_ATTR_FIFO_SIZE_REG(port),
4898 				    MVPP21_RX_FIFO_PORT_ATTR_SIZE);
4899 		}
4900 	}
4901 
4902 	mvpp2_write(priv, MVPP2_RX_MIN_PKT_SIZE_REG,
4903 		    MVPP2_RX_FIFO_PORT_MIN_PKT);
4904 	mvpp2_write(priv, MVPP2_RX_FIFO_INIT_REG, 0x1);
4905 }
4906 
4907 /* Initialize Tx FIFO's */
4908 static void mvpp2_tx_fifo_init(struct mvpp2 *priv)
4909 {
4910 	int port, val;
4911 
4912 	for (port = 0; port < MVPP2_MAX_PORTS; port++) {
4913 		/* Port 0 supports 10KB TX FIFO */
4914 		if (port == 0) {
4915 			val = MVPP2_TX_FIFO_DATA_SIZE_10KB &
4916 				MVPP22_TX_FIFO_SIZE_MASK;
4917 		} else {
4918 			val = MVPP2_TX_FIFO_DATA_SIZE_3KB &
4919 				MVPP22_TX_FIFO_SIZE_MASK;
4920 		}
4921 		mvpp2_write(priv, MVPP22_TX_FIFO_SIZE_REG(port), val);
4922 	}
4923 }
4924 
4925 static void mvpp2_axi_init(struct mvpp2 *priv)
4926 {
4927 	u32 val, rdval, wrval;
4928 
4929 	mvpp2_write(priv, MVPP22_BM_ADDR_HIGH_RLS_REG, 0x0);
4930 
4931 	/* AXI Bridge Configuration */
4932 
4933 	rdval = MVPP22_AXI_CODE_CACHE_RD_CACHE
4934 		<< MVPP22_AXI_ATTR_CACHE_OFFS;
4935 	rdval |= MVPP22_AXI_CODE_DOMAIN_OUTER_DOM
4936 		<< MVPP22_AXI_ATTR_DOMAIN_OFFS;
4937 
4938 	wrval = MVPP22_AXI_CODE_CACHE_WR_CACHE
4939 		<< MVPP22_AXI_ATTR_CACHE_OFFS;
4940 	wrval |= MVPP22_AXI_CODE_DOMAIN_OUTER_DOM
4941 		<< MVPP22_AXI_ATTR_DOMAIN_OFFS;
4942 
4943 	/* BM */
4944 	mvpp2_write(priv, MVPP22_AXI_BM_WR_ATTR_REG, wrval);
4945 	mvpp2_write(priv, MVPP22_AXI_BM_RD_ATTR_REG, rdval);
4946 
4947 	/* Descriptors */
4948 	mvpp2_write(priv, MVPP22_AXI_AGGRQ_DESCR_RD_ATTR_REG, rdval);
4949 	mvpp2_write(priv, MVPP22_AXI_TXQ_DESCR_WR_ATTR_REG, wrval);
4950 	mvpp2_write(priv, MVPP22_AXI_TXQ_DESCR_RD_ATTR_REG, rdval);
4951 	mvpp2_write(priv, MVPP22_AXI_RXQ_DESCR_WR_ATTR_REG, wrval);
4952 
4953 	/* Buffer Data */
4954 	mvpp2_write(priv, MVPP22_AXI_TX_DATA_RD_ATTR_REG, rdval);
4955 	mvpp2_write(priv, MVPP22_AXI_RX_DATA_WR_ATTR_REG, wrval);
4956 
4957 	val = MVPP22_AXI_CODE_CACHE_NON_CACHE
4958 		<< MVPP22_AXI_CODE_CACHE_OFFS;
4959 	val |= MVPP22_AXI_CODE_DOMAIN_SYSTEM
4960 		<< MVPP22_AXI_CODE_DOMAIN_OFFS;
4961 	mvpp2_write(priv, MVPP22_AXI_RD_NORMAL_CODE_REG, val);
4962 	mvpp2_write(priv, MVPP22_AXI_WR_NORMAL_CODE_REG, val);
4963 
4964 	val = MVPP22_AXI_CODE_CACHE_RD_CACHE
4965 		<< MVPP22_AXI_CODE_CACHE_OFFS;
4966 	val |= MVPP22_AXI_CODE_DOMAIN_OUTER_DOM
4967 		<< MVPP22_AXI_CODE_DOMAIN_OFFS;
4968 
4969 	mvpp2_write(priv, MVPP22_AXI_RD_SNOOP_CODE_REG, val);
4970 
4971 	val = MVPP22_AXI_CODE_CACHE_WR_CACHE
4972 		<< MVPP22_AXI_CODE_CACHE_OFFS;
4973 	val |= MVPP22_AXI_CODE_DOMAIN_OUTER_DOM
4974 		<< MVPP22_AXI_CODE_DOMAIN_OFFS;
4975 
4976 	mvpp2_write(priv, MVPP22_AXI_WR_SNOOP_CODE_REG, val);
4977 }
4978 
4979 /* Initialize network controller common part HW */
4980 static int mvpp2_init(struct udevice *dev, struct mvpp2 *priv)
4981 {
4982 	const struct mbus_dram_target_info *dram_target_info;
4983 	int err, i;
4984 	u32 val;
4985 
4986 	/* Checks for hardware constraints (U-Boot uses only one rxq) */
4987 	if ((rxq_number > priv->max_port_rxqs) ||
4988 	    (txq_number > MVPP2_MAX_TXQ)) {
4989 		dev_err(&pdev->dev, "invalid queue size parameter\n");
4990 		return -EINVAL;
4991 	}
4992 
4993 	if (priv->hw_version == MVPP22)
4994 		mvpp2_axi_init(priv);
4995 	else {
4996 		/* MBUS windows configuration */
4997 		dram_target_info = mvebu_mbus_dram_info();
4998 		if (dram_target_info)
4999 			mvpp2_conf_mbus_windows(dram_target_info, priv);
5000 	}
5001 
5002 	if (priv->hw_version == MVPP21) {
5003 		/* Disable HW PHY polling */
5004 		val = readl(priv->lms_base + MVPP2_PHY_AN_CFG0_REG);
5005 		val |= MVPP2_PHY_AN_STOP_SMI0_MASK;
5006 		writel(val, priv->lms_base + MVPP2_PHY_AN_CFG0_REG);
5007 	} else {
5008 		/* Enable HW PHY polling */
5009 		val = readl(priv->iface_base + MVPP22_SMI_MISC_CFG_REG);
5010 		val |= MVPP22_SMI_POLLING_EN;
5011 		writel(val, priv->iface_base + MVPP22_SMI_MISC_CFG_REG);
5012 	}
5013 
5014 	/* Allocate and initialize aggregated TXQs */
5015 	priv->aggr_txqs = devm_kcalloc(dev, num_present_cpus(),
5016 				       sizeof(struct mvpp2_tx_queue),
5017 				       GFP_KERNEL);
5018 	if (!priv->aggr_txqs)
5019 		return -ENOMEM;
5020 
5021 	for_each_present_cpu(i) {
5022 		priv->aggr_txqs[i].id = i;
5023 		priv->aggr_txqs[i].size = MVPP2_AGGR_TXQ_SIZE;
5024 		err = mvpp2_aggr_txq_init(dev, &priv->aggr_txqs[i],
5025 					  MVPP2_AGGR_TXQ_SIZE, i, priv);
5026 		if (err < 0)
5027 			return err;
5028 	}
5029 
5030 	/* Rx Fifo Init */
5031 	mvpp2_rx_fifo_init(priv);
5032 
5033 	/* Tx Fifo Init */
5034 	if (priv->hw_version == MVPP22)
5035 		mvpp2_tx_fifo_init(priv);
5036 
5037 	if (priv->hw_version == MVPP21)
5038 		writel(MVPP2_EXT_GLOBAL_CTRL_DEFAULT,
5039 		       priv->lms_base + MVPP2_MNG_EXTENDED_GLOBAL_CTRL_REG);
5040 
5041 	/* Allow cache snoop when transmiting packets */
5042 	mvpp2_write(priv, MVPP2_TX_SNOOP_REG, 0x1);
5043 
5044 	/* Buffer Manager initialization */
5045 	err = mvpp2_bm_init(dev, priv);
5046 	if (err < 0)
5047 		return err;
5048 
5049 	/* Parser default initialization */
5050 	err = mvpp2_prs_default_init(dev, priv);
5051 	if (err < 0)
5052 		return err;
5053 
5054 	/* Classifier default initialization */
5055 	mvpp2_cls_init(priv);
5056 
5057 	return 0;
5058 }
5059 
5060 /* SMI / MDIO functions */
5061 
5062 static int smi_wait_ready(struct mvpp2 *priv)
5063 {
5064 	u32 timeout = MVPP2_SMI_TIMEOUT;
5065 	u32 smi_reg;
5066 
5067 	/* wait till the SMI is not busy */
5068 	do {
5069 		/* read smi register */
5070 		smi_reg = readl(priv->mdio_base);
5071 		if (timeout-- == 0) {
5072 			printf("Error: SMI busy timeout\n");
5073 			return -EFAULT;
5074 		}
5075 	} while (smi_reg & MVPP2_SMI_BUSY);
5076 
5077 	return 0;
5078 }
5079 
5080 /*
5081  * mpp2_mdio_read - miiphy_read callback function.
5082  *
5083  * Returns 16bit phy register value, or 0xffff on error
5084  */
5085 static int mpp2_mdio_read(struct mii_dev *bus, int addr, int devad, int reg)
5086 {
5087 	struct mvpp2 *priv = bus->priv;
5088 	u32 smi_reg;
5089 	u32 timeout;
5090 
5091 	/* check parameters */
5092 	if (addr > MVPP2_PHY_ADDR_MASK) {
5093 		printf("Error: Invalid PHY address %d\n", addr);
5094 		return -EFAULT;
5095 	}
5096 
5097 	if (reg > MVPP2_PHY_REG_MASK) {
5098 		printf("Err: Invalid register offset %d\n", reg);
5099 		return -EFAULT;
5100 	}
5101 
5102 	/* wait till the SMI is not busy */
5103 	if (smi_wait_ready(priv) < 0)
5104 		return -EFAULT;
5105 
5106 	/* fill the phy address and regiser offset and read opcode */
5107 	smi_reg = (addr << MVPP2_SMI_DEV_ADDR_OFFS)
5108 		| (reg << MVPP2_SMI_REG_ADDR_OFFS)
5109 		| MVPP2_SMI_OPCODE_READ;
5110 
5111 	/* write the smi register */
5112 	writel(smi_reg, priv->mdio_base);
5113 
5114 	/* wait till read value is ready */
5115 	timeout = MVPP2_SMI_TIMEOUT;
5116 
5117 	do {
5118 		/* read smi register */
5119 		smi_reg = readl(priv->mdio_base);
5120 		if (timeout-- == 0) {
5121 			printf("Err: SMI read ready timeout\n");
5122 			return -EFAULT;
5123 		}
5124 	} while (!(smi_reg & MVPP2_SMI_READ_VALID));
5125 
5126 	/* Wait for the data to update in the SMI register */
5127 	for (timeout = 0; timeout < MVPP2_SMI_TIMEOUT; timeout++)
5128 		;
5129 
5130 	return readl(priv->mdio_base) & MVPP2_SMI_DATA_MASK;
5131 }
5132 
5133 /*
5134  * mpp2_mdio_write - miiphy_write callback function.
5135  *
5136  * Returns 0 if write succeed, -EINVAL on bad parameters
5137  * -ETIME on timeout
5138  */
5139 static int mpp2_mdio_write(struct mii_dev *bus, int addr, int devad, int reg,
5140 			   u16 value)
5141 {
5142 	struct mvpp2 *priv = bus->priv;
5143 	u32 smi_reg;
5144 
5145 	/* check parameters */
5146 	if (addr > MVPP2_PHY_ADDR_MASK) {
5147 		printf("Error: Invalid PHY address %d\n", addr);
5148 		return -EFAULT;
5149 	}
5150 
5151 	if (reg > MVPP2_PHY_REG_MASK) {
5152 		printf("Err: Invalid register offset %d\n", reg);
5153 		return -EFAULT;
5154 	}
5155 
5156 	/* wait till the SMI is not busy */
5157 	if (smi_wait_ready(priv) < 0)
5158 		return -EFAULT;
5159 
5160 	/* fill the phy addr and reg offset and write opcode and data */
5161 	smi_reg = value << MVPP2_SMI_DATA_OFFS;
5162 	smi_reg |= (addr << MVPP2_SMI_DEV_ADDR_OFFS)
5163 		| (reg << MVPP2_SMI_REG_ADDR_OFFS);
5164 	smi_reg &= ~MVPP2_SMI_OPCODE_READ;
5165 
5166 	/* write the smi register */
5167 	writel(smi_reg, priv->mdio_base);
5168 
5169 	return 0;
5170 }
5171 
5172 static int mvpp2_recv(struct udevice *dev, int flags, uchar **packetp)
5173 {
5174 	struct mvpp2_port *port = dev_get_priv(dev);
5175 	struct mvpp2_rx_desc *rx_desc;
5176 	struct mvpp2_bm_pool *bm_pool;
5177 	dma_addr_t dma_addr;
5178 	u32 bm, rx_status;
5179 	int pool, rx_bytes, err;
5180 	int rx_received;
5181 	struct mvpp2_rx_queue *rxq;
5182 	u8 *data;
5183 
5184 	/* Process RX packets */
5185 	rxq = port->rxqs[0];
5186 
5187 	/* Get number of received packets and clamp the to-do */
5188 	rx_received = mvpp2_rxq_received(port, rxq->id);
5189 
5190 	/* Return if no packets are received */
5191 	if (!rx_received)
5192 		return 0;
5193 
5194 	rx_desc = mvpp2_rxq_next_desc_get(rxq);
5195 	rx_status = mvpp2_rxdesc_status_get(port, rx_desc);
5196 	rx_bytes = mvpp2_rxdesc_size_get(port, rx_desc);
5197 	rx_bytes -= MVPP2_MH_SIZE;
5198 	dma_addr = mvpp2_rxdesc_dma_addr_get(port, rx_desc);
5199 
5200 	bm = mvpp2_bm_cookie_build(port, rx_desc);
5201 	pool = mvpp2_bm_cookie_pool_get(bm);
5202 	bm_pool = &port->priv->bm_pools[pool];
5203 
5204 	/* In case of an error, release the requested buffer pointer
5205 	 * to the Buffer Manager. This request process is controlled
5206 	 * by the hardware, and the information about the buffer is
5207 	 * comprised by the RX descriptor.
5208 	 */
5209 	if (rx_status & MVPP2_RXD_ERR_SUMMARY) {
5210 		mvpp2_rx_error(port, rx_desc);
5211 		/* Return the buffer to the pool */
5212 		mvpp2_pool_refill(port, bm, dma_addr, dma_addr);
5213 		return 0;
5214 	}
5215 
5216 	err = mvpp2_rx_refill(port, bm_pool, bm, dma_addr);
5217 	if (err) {
5218 		netdev_err(port->dev, "failed to refill BM pools\n");
5219 		return 0;
5220 	}
5221 
5222 	/* Update Rx queue management counters */
5223 	mb();
5224 	mvpp2_rxq_status_update(port, rxq->id, 1, 1);
5225 
5226 	/* give packet to stack - skip on first n bytes */
5227 	data = (u8 *)dma_addr + 2 + 32;
5228 
5229 	if (rx_bytes <= 0)
5230 		return 0;
5231 
5232 	/*
5233 	 * No cache invalidation needed here, since the rx_buffer's are
5234 	 * located in a uncached memory region
5235 	 */
5236 	*packetp = data;
5237 
5238 	return rx_bytes;
5239 }
5240 
5241 static int mvpp2_send(struct udevice *dev, void *packet, int length)
5242 {
5243 	struct mvpp2_port *port = dev_get_priv(dev);
5244 	struct mvpp2_tx_queue *txq, *aggr_txq;
5245 	struct mvpp2_tx_desc *tx_desc;
5246 	int tx_done;
5247 	int timeout;
5248 
5249 	txq = port->txqs[0];
5250 	aggr_txq = &port->priv->aggr_txqs[smp_processor_id()];
5251 
5252 	/* Get a descriptor for the first part of the packet */
5253 	tx_desc = mvpp2_txq_next_desc_get(aggr_txq);
5254 	mvpp2_txdesc_txq_set(port, tx_desc, txq->id);
5255 	mvpp2_txdesc_size_set(port, tx_desc, length);
5256 	mvpp2_txdesc_offset_set(port, tx_desc,
5257 				(dma_addr_t)packet & MVPP2_TX_DESC_ALIGN);
5258 	mvpp2_txdesc_dma_addr_set(port, tx_desc,
5259 				  (dma_addr_t)packet & ~MVPP2_TX_DESC_ALIGN);
5260 	/* First and Last descriptor */
5261 	mvpp2_txdesc_cmd_set(port, tx_desc,
5262 			     MVPP2_TXD_L4_CSUM_NOT | MVPP2_TXD_IP_CSUM_DISABLE
5263 			     | MVPP2_TXD_F_DESC | MVPP2_TXD_L_DESC);
5264 
5265 	/* Flush tx data */
5266 	flush_dcache_range((unsigned long)packet,
5267 			   (unsigned long)packet + ALIGN(length, PKTALIGN));
5268 
5269 	/* Enable transmit */
5270 	mb();
5271 	mvpp2_aggr_txq_pend_desc_add(port, 1);
5272 
5273 	mvpp2_write(port->priv, MVPP2_TXQ_NUM_REG, txq->id);
5274 
5275 	timeout = 0;
5276 	do {
5277 		if (timeout++ > 10000) {
5278 			printf("timeout: packet not sent from aggregated to phys TXQ\n");
5279 			return 0;
5280 		}
5281 		tx_done = mvpp2_txq_pend_desc_num_get(port, txq);
5282 	} while (tx_done);
5283 
5284 	timeout = 0;
5285 	do {
5286 		if (timeout++ > 10000) {
5287 			printf("timeout: packet not sent\n");
5288 			return 0;
5289 		}
5290 		tx_done = mvpp2_txq_sent_desc_proc(port, txq);
5291 	} while (!tx_done);
5292 
5293 	return 0;
5294 }
5295 
5296 static int mvpp2_start(struct udevice *dev)
5297 {
5298 	struct eth_pdata *pdata = dev_get_platdata(dev);
5299 	struct mvpp2_port *port = dev_get_priv(dev);
5300 
5301 	/* Load current MAC address */
5302 	memcpy(port->dev_addr, pdata->enetaddr, ETH_ALEN);
5303 
5304 	/* Reconfigure parser accept the original MAC address */
5305 	mvpp2_prs_update_mac_da(port, port->dev_addr);
5306 
5307 	switch (port->phy_interface) {
5308 	case PHY_INTERFACE_MODE_RGMII:
5309 	case PHY_INTERFACE_MODE_RGMII_ID:
5310 	case PHY_INTERFACE_MODE_SGMII:
5311 		mvpp2_port_power_up(port);
5312 	default:
5313 		break;
5314 	}
5315 
5316 	mvpp2_open(dev, port);
5317 
5318 	return 0;
5319 }
5320 
5321 static void mvpp2_stop(struct udevice *dev)
5322 {
5323 	struct mvpp2_port *port = dev_get_priv(dev);
5324 
5325 	mvpp2_stop_dev(port);
5326 	mvpp2_cleanup_rxqs(port);
5327 	mvpp2_cleanup_txqs(port);
5328 }
5329 
5330 static int mvpp22_smi_phy_addr_cfg(struct mvpp2_port *port)
5331 {
5332 	writel(port->phyaddr, port->priv->iface_base +
5333 	       MVPP22_SMI_PHY_ADDR_REG(port->gop_id));
5334 
5335 	return 0;
5336 }
5337 
5338 static int mvpp2_base_probe(struct udevice *dev)
5339 {
5340 	struct mvpp2 *priv = dev_get_priv(dev);
5341 	struct mii_dev *bus;
5342 	void *bd_space;
5343 	u32 size = 0;
5344 	int i;
5345 
5346 	/* Save hw-version */
5347 	priv->hw_version = dev_get_driver_data(dev);
5348 
5349 	/*
5350 	 * U-Boot special buffer handling:
5351 	 *
5352 	 * Allocate buffer area for descs and rx_buffers. This is only
5353 	 * done once for all interfaces. As only one interface can
5354 	 * be active. Make this area DMA-safe by disabling the D-cache
5355 	 */
5356 
5357 	/* Align buffer area for descs and rx_buffers to 1MiB */
5358 	bd_space = memalign(1 << MMU_SECTION_SHIFT, BD_SPACE);
5359 	mmu_set_region_dcache_behaviour((unsigned long)bd_space,
5360 					BD_SPACE, DCACHE_OFF);
5361 
5362 	buffer_loc.aggr_tx_descs = (struct mvpp2_tx_desc *)bd_space;
5363 	size += MVPP2_AGGR_TXQ_SIZE * MVPP2_DESC_ALIGNED_SIZE;
5364 
5365 	buffer_loc.tx_descs =
5366 		(struct mvpp2_tx_desc *)((unsigned long)bd_space + size);
5367 	size += MVPP2_MAX_TXD * MVPP2_DESC_ALIGNED_SIZE;
5368 
5369 	buffer_loc.rx_descs =
5370 		(struct mvpp2_rx_desc *)((unsigned long)bd_space + size);
5371 	size += MVPP2_MAX_RXD * MVPP2_DESC_ALIGNED_SIZE;
5372 
5373 	for (i = 0; i < MVPP2_BM_POOLS_NUM; i++) {
5374 		buffer_loc.bm_pool[i] =
5375 			(unsigned long *)((unsigned long)bd_space + size);
5376 		if (priv->hw_version == MVPP21)
5377 			size += MVPP2_BM_POOL_SIZE_MAX * 2 * sizeof(u32);
5378 		else
5379 			size += MVPP2_BM_POOL_SIZE_MAX * 2 * sizeof(u64);
5380 	}
5381 
5382 	for (i = 0; i < MVPP2_BM_LONG_BUF_NUM; i++) {
5383 		buffer_loc.rx_buffer[i] =
5384 			(unsigned long *)((unsigned long)bd_space + size);
5385 		size += RX_BUFFER_SIZE;
5386 	}
5387 
5388 	/* Clear the complete area so that all descriptors are cleared */
5389 	memset(bd_space, 0, size);
5390 
5391 	/* Save base addresses for later use */
5392 	priv->base = (void *)devfdt_get_addr_index(dev, 0);
5393 	if (IS_ERR(priv->base))
5394 		return PTR_ERR(priv->base);
5395 
5396 	if (priv->hw_version == MVPP21) {
5397 		priv->lms_base = (void *)devfdt_get_addr_index(dev, 1);
5398 		if (IS_ERR(priv->lms_base))
5399 			return PTR_ERR(priv->lms_base);
5400 
5401 		priv->mdio_base = priv->lms_base + MVPP21_SMI;
5402 	} else {
5403 		priv->iface_base = (void *)devfdt_get_addr_index(dev, 1);
5404 		if (IS_ERR(priv->iface_base))
5405 			return PTR_ERR(priv->iface_base);
5406 
5407 		priv->mdio_base = priv->iface_base + MVPP22_SMI;
5408 
5409 		/* Store common base addresses for all ports */
5410 		priv->mpcs_base = priv->iface_base + MVPP22_MPCS;
5411 		priv->xpcs_base = priv->iface_base + MVPP22_XPCS;
5412 		priv->rfu1_base = priv->iface_base + MVPP22_RFU1;
5413 	}
5414 
5415 	if (priv->hw_version == MVPP21)
5416 		priv->max_port_rxqs = 8;
5417 	else
5418 		priv->max_port_rxqs = 32;
5419 
5420 	/* Finally create and register the MDIO bus driver */
5421 	bus = mdio_alloc();
5422 	if (!bus) {
5423 		printf("Failed to allocate MDIO bus\n");
5424 		return -ENOMEM;
5425 	}
5426 
5427 	bus->read = mpp2_mdio_read;
5428 	bus->write = mpp2_mdio_write;
5429 	snprintf(bus->name, sizeof(bus->name), dev->name);
5430 	bus->priv = (void *)priv;
5431 	priv->bus = bus;
5432 
5433 	return mdio_register(bus);
5434 }
5435 
5436 static int mvpp2_probe(struct udevice *dev)
5437 {
5438 	struct mvpp2_port *port = dev_get_priv(dev);
5439 	struct mvpp2 *priv = dev_get_priv(dev->parent);
5440 	int err;
5441 
5442 	/* Only call the probe function for the parent once */
5443 	if (!priv->probe_done)
5444 		err = mvpp2_base_probe(dev->parent);
5445 
5446 	port->priv = dev_get_priv(dev->parent);
5447 
5448 	err = phy_info_parse(dev, port);
5449 	if (err)
5450 		return err;
5451 
5452 	/*
5453 	 * We need the port specific io base addresses at this stage, since
5454 	 * gop_port_init() accesses these registers
5455 	 */
5456 	if (priv->hw_version == MVPP21) {
5457 		int priv_common_regs_num = 2;
5458 
5459 		port->base = (void __iomem *)devfdt_get_addr_index(
5460 			dev->parent, priv_common_regs_num + port->id);
5461 		if (IS_ERR(port->base))
5462 			return PTR_ERR(port->base);
5463 	} else {
5464 		port->gop_id = fdtdec_get_int(gd->fdt_blob, dev_of_offset(dev),
5465 					      "gop-port-id", -1);
5466 		if (port->id == -1) {
5467 			dev_err(&pdev->dev, "missing gop-port-id value\n");
5468 			return -EINVAL;
5469 		}
5470 
5471 		port->base = priv->iface_base + MVPP22_PORT_BASE +
5472 			port->gop_id * MVPP22_PORT_OFFSET;
5473 
5474 		/* Set phy address of the port */
5475 		if(port->phy_node)
5476 			mvpp22_smi_phy_addr_cfg(port);
5477 
5478 		/* GoP Init */
5479 		gop_port_init(port);
5480 	}
5481 
5482 	if (!priv->probe_done) {
5483 		/* Initialize network controller */
5484 		err = mvpp2_init(dev, priv);
5485 		if (err < 0) {
5486 			dev_err(&pdev->dev, "failed to initialize controller\n");
5487 			return err;
5488 		}
5489 		priv->num_ports = 0;
5490 		priv->probe_done = 1;
5491 	}
5492 
5493 	err = mvpp2_port_probe(dev, port, dev_of_offset(dev), priv);
5494 	if (err)
5495 		return err;
5496 
5497 	if (priv->hw_version == MVPP22) {
5498 		priv->netc_config |= mvpp2_netc_cfg_create(port->gop_id,
5499 							   port->phy_interface);
5500 
5501 		/* Netcomplex configurations for all ports */
5502 		gop_netc_init(priv, MV_NETC_FIRST_PHASE);
5503 		gop_netc_init(priv, MV_NETC_SECOND_PHASE);
5504 	}
5505 
5506 	return 0;
5507 }
5508 
5509 /*
5510  * Empty BM pool and stop its activity before the OS is started
5511  */
5512 static int mvpp2_remove(struct udevice *dev)
5513 {
5514 	struct mvpp2_port *port = dev_get_priv(dev);
5515 	struct mvpp2 *priv = port->priv;
5516 	int i;
5517 
5518 	priv->num_ports--;
5519 
5520 	if (priv->num_ports)
5521 		return 0;
5522 
5523 	for (i = 0; i < MVPP2_BM_POOLS_NUM; i++)
5524 		mvpp2_bm_pool_destroy(dev, priv, &priv->bm_pools[i]);
5525 
5526 	return 0;
5527 }
5528 
5529 static const struct eth_ops mvpp2_ops = {
5530 	.start		= mvpp2_start,
5531 	.send		= mvpp2_send,
5532 	.recv		= mvpp2_recv,
5533 	.stop		= mvpp2_stop,
5534 };
5535 
5536 static struct driver mvpp2_driver = {
5537 	.name	= "mvpp2",
5538 	.id	= UCLASS_ETH,
5539 	.probe	= mvpp2_probe,
5540 	.remove = mvpp2_remove,
5541 	.ops	= &mvpp2_ops,
5542 	.priv_auto_alloc_size = sizeof(struct mvpp2_port),
5543 	.platdata_auto_alloc_size = sizeof(struct eth_pdata),
5544 	.flags	= DM_FLAG_ACTIVE_DMA,
5545 };
5546 
5547 /*
5548  * Use a MISC device to bind the n instances (child nodes) of the
5549  * network base controller in UCLASS_ETH.
5550  */
5551 static int mvpp2_base_bind(struct udevice *parent)
5552 {
5553 	const void *blob = gd->fdt_blob;
5554 	int node = dev_of_offset(parent);
5555 	struct uclass_driver *drv;
5556 	struct udevice *dev;
5557 	struct eth_pdata *plat;
5558 	char *name;
5559 	int subnode;
5560 	u32 id;
5561 	int base_id_add;
5562 
5563 	/* Lookup eth driver */
5564 	drv = lists_uclass_lookup(UCLASS_ETH);
5565 	if (!drv) {
5566 		puts("Cannot find eth driver\n");
5567 		return -ENOENT;
5568 	}
5569 
5570 	base_id_add = base_id;
5571 
5572 	fdt_for_each_subnode(subnode, blob, node) {
5573 		/* Increment base_id for all subnodes, also the disabled ones */
5574 		base_id++;
5575 
5576 		/* Skip disabled ports */
5577 		if (!fdtdec_get_is_enabled(blob, subnode))
5578 			continue;
5579 
5580 		plat = calloc(1, sizeof(*plat));
5581 		if (!plat)
5582 			return -ENOMEM;
5583 
5584 		id = fdtdec_get_int(blob, subnode, "port-id", -1);
5585 		id += base_id_add;
5586 
5587 		name = calloc(1, 16);
5588 		if (!name) {
5589 			free(plat);
5590 			return -ENOMEM;
5591 		}
5592 		sprintf(name, "mvpp2-%d", id);
5593 
5594 		/* Create child device UCLASS_ETH and bind it */
5595 		device_bind(parent, &mvpp2_driver, name, plat, subnode, &dev);
5596 		dev_set_of_offset(dev, subnode);
5597 	}
5598 
5599 	return 0;
5600 }
5601 
5602 static const struct udevice_id mvpp2_ids[] = {
5603 	{
5604 		.compatible = "marvell,armada-375-pp2",
5605 		.data = MVPP21,
5606 	},
5607 	{
5608 		.compatible = "marvell,armada-7k-pp22",
5609 		.data = MVPP22,
5610 	},
5611 	{ }
5612 };
5613 
5614 U_BOOT_DRIVER(mvpp2_base) = {
5615 	.name	= "mvpp2_base",
5616 	.id	= UCLASS_MISC,
5617 	.of_match = mvpp2_ids,
5618 	.bind	= mvpp2_base_bind,
5619 	.priv_auto_alloc_size = sizeof(struct mvpp2),
5620 };
5621