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