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