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