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