1 // SPDX-License-Identifier: GPL-2.0
3 * Texas Instruments N-Port Ethernet Switch Address Lookup Engine
5 * Copyright (C) 2012 Texas Instruments
8 #include <linux/bitmap.h>
9 #include <linux/if_vlan.h>
10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/platform_device.h>
13 #include <linux/regmap.h>
14 #include <linux/seq_file.h>
15 #include <linux/slab.h>
16 #include <linux/err.h>
18 #include <linux/stat.h>
19 #include <linux/sysfs.h>
20 #include <linux/etherdevice.h>
24 #define BITMASK(bits) (BIT(bits) - 1)
26 #define ALE_VERSION_MAJOR(rev, mask) (((rev) >> 8) & (mask))
27 #define ALE_VERSION_MINOR(rev) (rev & 0xff)
28 #define ALE_VERSION_1R3 0x0103
29 #define ALE_VERSION_1R4 0x0104
32 #define ALE_IDVER 0x00
33 #define ALE_STATUS 0x04
34 #define ALE_CONTROL 0x08
35 #define ALE_PRESCALE 0x10
36 #define ALE_AGING_TIMER 0x14
37 #define ALE_UNKNOWNVLAN 0x18
38 #define ALE_TABLE_CONTROL 0x20
39 #define ALE_TABLE 0x34
40 #define ALE_PORTCTL 0x40
42 /* ALE NetCP NU switch specific Registers */
43 #define ALE_UNKNOWNVLAN_MEMBER 0x90
44 #define ALE_UNKNOWNVLAN_UNREG_MCAST_FLOOD 0x94
45 #define ALE_UNKNOWNVLAN_REG_MCAST_FLOOD 0x98
46 #define ALE_UNKNOWNVLAN_FORCE_UNTAG_EGRESS 0x9C
47 #define ALE_VLAN_MASK_MUX(reg) (0xc0 + (0x4 * (reg)))
49 #define ALE_POLICER_PORT_OUI 0x100
50 #define ALE_POLICER_DA_SA 0x104
51 #define ALE_POLICER_VLAN 0x108
52 #define ALE_POLICER_ETHERTYPE_IPSA 0x10c
53 #define ALE_POLICER_IPDA 0x110
54 #define ALE_POLICER_PIR 0x118
55 #define ALE_POLICER_CIR 0x11c
56 #define ALE_POLICER_TBL_CTL 0x120
57 #define ALE_POLICER_CTL 0x124
58 #define ALE_POLICER_TEST_CTL 0x128
59 #define ALE_POLICER_HIT_STATUS 0x12c
60 #define ALE_THREAD_DEF 0x134
61 #define ALE_THREAD_CTL 0x138
62 #define ALE_THREAD_VAL 0x13c
64 #define ALE_POLICER_TBL_WRITE_ENABLE BIT(31)
65 #define ALE_POLICER_TBL_INDEX_MASK GENMASK(4, 0)
67 #define AM65_CPSW_ALE_THREAD_DEF_REG 0x134
70 #define ALE_AGING_TIMER_MASK GENMASK(23, 0)
72 #define ALE_RATE_LIMIT_MIN_PPS 1000
75 * struct ale_entry_fld - The ALE tbl entry field description
76 * @start_bit: field start bit
77 * @num_bits: field bit length
80 struct ale_entry_fld
{
87 CPSW_ALE_F_STATUS_REG
= BIT(0), /* Status register present */
88 CPSW_ALE_F_HW_AUTOAGING
= BIT(1), /* HW auto aging */
94 * struct cpsw_ale_dev_id - The ALE version/SoC specific configuration
95 * @dev_id: ALE version/SoC id
96 * @features: features supported by ALE
97 * @tbl_entries: number of ALE entries
98 * @reg_fields: pointer to array of register field configuration
99 * @num_fields: number of fields in the reg_fields array
100 * @nu_switch_ale: NU Switch ALE
101 * @vlan_entry_tbl: ALE vlan entry fields description tbl
103 struct cpsw_ale_dev_id
{
107 const struct reg_field
*reg_fields
;
110 const struct ale_entry_fld
*vlan_entry_tbl
;
113 #define ALE_TABLE_WRITE BIT(31)
115 #define ALE_TYPE_FREE 0
116 #define ALE_TYPE_ADDR 1
117 #define ALE_TYPE_VLAN 2
118 #define ALE_TYPE_VLAN_ADDR 3
120 #define ALE_UCAST_PERSISTANT 0
121 #define ALE_UCAST_UNTOUCHED 1
122 #define ALE_UCAST_OUI 2
123 #define ALE_UCAST_TOUCHED 3
125 #define ALE_TABLE_SIZE_MULTIPLIER 1024
126 #define ALE_POLICER_SIZE_MULTIPLIER 8
128 static inline int cpsw_ale_get_field(u32
*ale_entry
, u32 start
, u32 bits
)
134 idx2
= (start
+ bits
- 1) / 32;
135 /* Check if bits to be fetched exceed a word */
137 idx2
= 2 - idx2
; /* flip */
138 hi_val
= ale_entry
[idx2
] << ((idx2
* 32) - start
);
141 idx
= 2 - idx
; /* flip */
142 return (hi_val
+ (ale_entry
[idx
] >> start
)) & BITMASK(bits
);
145 static inline void cpsw_ale_set_field(u32
*ale_entry
, u32 start
, u32 bits
,
150 value
&= BITMASK(bits
);
152 idx2
= (start
+ bits
- 1) / 32;
153 /* Check if bits to be set exceed a word */
155 idx2
= 2 - idx2
; /* flip */
156 ale_entry
[idx2
] &= ~(BITMASK(bits
+ start
- (idx2
* 32)));
157 ale_entry
[idx2
] |= (value
>> ((idx2
* 32) - start
));
160 idx
= 2 - idx
; /* flip */
161 ale_entry
[idx
] &= ~(BITMASK(bits
) << start
);
162 ale_entry
[idx
] |= (value
<< start
);
165 #define DEFINE_ALE_FIELD_GET(name, start, bits) \
166 static inline int cpsw_ale_get_##name(u32 *ale_entry) \
168 return cpsw_ale_get_field(ale_entry, start, bits); \
171 #define DEFINE_ALE_FIELD_SET(name, start, bits) \
172 static inline void cpsw_ale_set_##name(u32 *ale_entry, u32 value) \
174 cpsw_ale_set_field(ale_entry, start, bits, value); \
177 #define DEFINE_ALE_FIELD(name, start, bits) \
178 DEFINE_ALE_FIELD_GET(name, start, bits) \
179 DEFINE_ALE_FIELD_SET(name, start, bits)
181 #define DEFINE_ALE_FIELD1_GET(name, start) \
182 static inline int cpsw_ale_get_##name(u32 *ale_entry, u32 bits) \
184 return cpsw_ale_get_field(ale_entry, start, bits); \
187 #define DEFINE_ALE_FIELD1_SET(name, start) \
188 static inline void cpsw_ale_set_##name(u32 *ale_entry, u32 value, \
191 cpsw_ale_set_field(ale_entry, start, bits, value); \
194 #define DEFINE_ALE_FIELD1(name, start) \
195 DEFINE_ALE_FIELD1_GET(name, start) \
196 DEFINE_ALE_FIELD1_SET(name, start)
199 ALE_ENT_VID_MEMBER_LIST
= 0,
200 ALE_ENT_VID_UNREG_MCAST_MSK
,
201 ALE_ENT_VID_REG_MCAST_MSK
,
202 ALE_ENT_VID_FORCE_UNTAGGED_MSK
,
203 ALE_ENT_VID_UNREG_MCAST_IDX
,
204 ALE_ENT_VID_REG_MCAST_IDX
,
208 #define ALE_FLD_ALLOWED BIT(0)
209 #define ALE_FLD_SIZE_PORT_MASK_BITS BIT(1)
210 #define ALE_FLD_SIZE_PORT_NUM_BITS BIT(2)
212 #define ALE_ENTRY_FLD(id, start, bits) \
214 .start_bit = start, \
216 .flags = ALE_FLD_ALLOWED, \
219 #define ALE_ENTRY_FLD_DYN_MSK_SIZE(id, start) \
221 .start_bit = start, \
223 .flags = ALE_FLD_ALLOWED | \
224 ALE_FLD_SIZE_PORT_MASK_BITS, \
227 /* dm814x, am3/am4/am5, k2hk */
228 static const struct ale_entry_fld vlan_entry_cpsw
[ALE_ENT_VID_LAST
] = {
229 ALE_ENTRY_FLD(ALE_ENT_VID_MEMBER_LIST
, 0, 3),
230 ALE_ENTRY_FLD(ALE_ENT_VID_UNREG_MCAST_MSK
, 8, 3),
231 ALE_ENTRY_FLD(ALE_ENT_VID_REG_MCAST_MSK
, 16, 3),
232 ALE_ENTRY_FLD(ALE_ENT_VID_FORCE_UNTAGGED_MSK
, 24, 3),
235 /* k2e/k2l, k3 am65/j721e cpsw2g */
236 static const struct ale_entry_fld vlan_entry_nu
[ALE_ENT_VID_LAST
] = {
237 ALE_ENTRY_FLD_DYN_MSK_SIZE(ALE_ENT_VID_MEMBER_LIST
, 0),
238 ALE_ENTRY_FLD(ALE_ENT_VID_UNREG_MCAST_IDX
, 20, 3),
239 ALE_ENTRY_FLD_DYN_MSK_SIZE(ALE_ENT_VID_FORCE_UNTAGGED_MSK
, 24),
240 ALE_ENTRY_FLD(ALE_ENT_VID_REG_MCAST_IDX
, 44, 3),
243 /* K3 j721e/j7200 cpsw9g/5g, am64x cpsw3g */
244 static const struct ale_entry_fld vlan_entry_k3_cpswxg
[] = {
245 ALE_ENTRY_FLD_DYN_MSK_SIZE(ALE_ENT_VID_MEMBER_LIST
, 0),
246 ALE_ENTRY_FLD_DYN_MSK_SIZE(ALE_ENT_VID_UNREG_MCAST_MSK
, 12),
247 ALE_ENTRY_FLD_DYN_MSK_SIZE(ALE_ENT_VID_FORCE_UNTAGGED_MSK
, 24),
248 ALE_ENTRY_FLD_DYN_MSK_SIZE(ALE_ENT_VID_REG_MCAST_MSK
, 36),
251 DEFINE_ALE_FIELD(entry_type
, 60, 2)
252 DEFINE_ALE_FIELD(vlan_id
, 48, 12)
253 DEFINE_ALE_FIELD_SET(mcast_state
, 62, 2)
254 DEFINE_ALE_FIELD1(port_mask
, 66)
255 DEFINE_ALE_FIELD(super
, 65, 1)
256 DEFINE_ALE_FIELD(ucast_type
, 62, 2)
257 DEFINE_ALE_FIELD1_SET(port_num
, 66)
258 DEFINE_ALE_FIELD_SET(blocked
, 65, 1)
259 DEFINE_ALE_FIELD_SET(secure
, 64, 1)
260 DEFINE_ALE_FIELD_GET(mcast
, 40, 1)
262 #define NU_VLAN_UNREG_MCAST_IDX 1
264 static int cpsw_ale_entry_get_fld(struct cpsw_ale
*ale
,
266 const struct ale_entry_fld
*entry_tbl
,
269 const struct ale_entry_fld
*entry_fld
;
272 if (!ale
|| !ale_entry
)
275 entry_fld
= &entry_tbl
[fld_id
];
276 if (!(entry_fld
->flags
& ALE_FLD_ALLOWED
)) {
277 dev_err(ale
->params
.dev
, "get: wrong ale fld id %d\n", fld_id
);
281 bits
= entry_fld
->num_bits
;
282 if (entry_fld
->flags
& ALE_FLD_SIZE_PORT_MASK_BITS
)
283 bits
= ale
->port_mask_bits
;
285 return cpsw_ale_get_field(ale_entry
, entry_fld
->start_bit
, bits
);
288 static void cpsw_ale_entry_set_fld(struct cpsw_ale
*ale
,
290 const struct ale_entry_fld
*entry_tbl
,
294 const struct ale_entry_fld
*entry_fld
;
297 if (!ale
|| !ale_entry
)
300 entry_fld
= &entry_tbl
[fld_id
];
301 if (!(entry_fld
->flags
& ALE_FLD_ALLOWED
)) {
302 dev_err(ale
->params
.dev
, "set: wrong ale fld id %d\n", fld_id
);
306 bits
= entry_fld
->num_bits
;
307 if (entry_fld
->flags
& ALE_FLD_SIZE_PORT_MASK_BITS
)
308 bits
= ale
->port_mask_bits
;
310 cpsw_ale_set_field(ale_entry
, entry_fld
->start_bit
, bits
, value
);
313 static int cpsw_ale_vlan_get_fld(struct cpsw_ale
*ale
,
317 return cpsw_ale_entry_get_fld(ale
, ale_entry
,
318 ale
->vlan_entry_tbl
, fld_id
);
321 static void cpsw_ale_vlan_set_fld(struct cpsw_ale
*ale
,
326 cpsw_ale_entry_set_fld(ale
, ale_entry
,
327 ale
->vlan_entry_tbl
, fld_id
, value
);
330 /* The MAC address field in the ALE entry cannot be macroized as above */
331 static inline void cpsw_ale_get_addr(u32
*ale_entry
, u8
*addr
)
335 for (i
= 0; i
< 6; i
++)
336 addr
[i
] = cpsw_ale_get_field(ale_entry
, 40 - 8*i
, 8);
339 static inline void cpsw_ale_set_addr(u32
*ale_entry
, const u8
*addr
)
343 for (i
= 0; i
< 6; i
++)
344 cpsw_ale_set_field(ale_entry
, 40 - 8*i
, 8, addr
[i
]);
347 static int cpsw_ale_read(struct cpsw_ale
*ale
, int idx
, u32
*ale_entry
)
351 WARN_ON(idx
> ale
->params
.ale_entries
);
353 writel_relaxed(idx
, ale
->params
.ale_regs
+ ALE_TABLE_CONTROL
);
355 for (i
= 0; i
< ALE_ENTRY_WORDS
; i
++)
356 ale_entry
[i
] = readl_relaxed(ale
->params
.ale_regs
+
362 static int cpsw_ale_write(struct cpsw_ale
*ale
, int idx
, u32
*ale_entry
)
366 WARN_ON(idx
> ale
->params
.ale_entries
);
368 for (i
= 0; i
< ALE_ENTRY_WORDS
; i
++)
369 writel_relaxed(ale_entry
[i
], ale
->params
.ale_regs
+
372 writel_relaxed(idx
| ALE_TABLE_WRITE
, ale
->params
.ale_regs
+
378 static int cpsw_ale_match_addr(struct cpsw_ale
*ale
, const u8
*addr
, u16 vid
)
380 u32 ale_entry
[ALE_ENTRY_WORDS
];
383 for (idx
= 0; idx
< ale
->params
.ale_entries
; idx
++) {
386 cpsw_ale_read(ale
, idx
, ale_entry
);
387 type
= cpsw_ale_get_entry_type(ale_entry
);
388 if (type
!= ALE_TYPE_ADDR
&& type
!= ALE_TYPE_VLAN_ADDR
)
390 if (cpsw_ale_get_vlan_id(ale_entry
) != vid
)
392 cpsw_ale_get_addr(ale_entry
, entry_addr
);
393 if (ether_addr_equal(entry_addr
, addr
))
399 static int cpsw_ale_match_vlan(struct cpsw_ale
*ale
, u16 vid
)
401 u32 ale_entry
[ALE_ENTRY_WORDS
];
404 for (idx
= 0; idx
< ale
->params
.ale_entries
; idx
++) {
405 cpsw_ale_read(ale
, idx
, ale_entry
);
406 type
= cpsw_ale_get_entry_type(ale_entry
);
407 if (type
!= ALE_TYPE_VLAN
)
409 if (cpsw_ale_get_vlan_id(ale_entry
) == vid
)
415 static int cpsw_ale_match_free(struct cpsw_ale
*ale
)
417 u32 ale_entry
[ALE_ENTRY_WORDS
];
420 for (idx
= 0; idx
< ale
->params
.ale_entries
; idx
++) {
421 cpsw_ale_read(ale
, idx
, ale_entry
);
422 type
= cpsw_ale_get_entry_type(ale_entry
);
423 if (type
== ALE_TYPE_FREE
)
429 static int cpsw_ale_find_ageable(struct cpsw_ale
*ale
)
431 u32 ale_entry
[ALE_ENTRY_WORDS
];
434 for (idx
= 0; idx
< ale
->params
.ale_entries
; idx
++) {
435 cpsw_ale_read(ale
, idx
, ale_entry
);
436 type
= cpsw_ale_get_entry_type(ale_entry
);
437 if (type
!= ALE_TYPE_ADDR
&& type
!= ALE_TYPE_VLAN_ADDR
)
439 if (cpsw_ale_get_mcast(ale_entry
))
441 type
= cpsw_ale_get_ucast_type(ale_entry
);
442 if (type
!= ALE_UCAST_PERSISTANT
&&
443 type
!= ALE_UCAST_OUI
)
449 static void cpsw_ale_flush_mcast(struct cpsw_ale
*ale
, u32
*ale_entry
,
454 mask
= cpsw_ale_get_port_mask(ale_entry
,
455 ale
->port_mask_bits
);
456 if ((mask
& port_mask
) == 0)
457 return; /* ports dont intersect, not interested */
460 /* free if only remaining port is host port */
462 cpsw_ale_set_port_mask(ale_entry
, mask
,
463 ale
->port_mask_bits
);
465 cpsw_ale_set_entry_type(ale_entry
, ALE_TYPE_FREE
);
468 int cpsw_ale_flush_multicast(struct cpsw_ale
*ale
, int port_mask
, int vid
)
470 u32 ale_entry
[ALE_ENTRY_WORDS
];
473 for (idx
= 0; idx
< ale
->params
.ale_entries
; idx
++) {
474 cpsw_ale_read(ale
, idx
, ale_entry
);
475 ret
= cpsw_ale_get_entry_type(ale_entry
);
476 if (ret
!= ALE_TYPE_ADDR
&& ret
!= ALE_TYPE_VLAN_ADDR
)
479 /* if vid passed is -1 then remove all multicast entry from
480 * the table irrespective of vlan id, if a valid vlan id is
481 * passed then remove only multicast added to that vlan id.
482 * if vlan id doesn't match then move on to next entry.
484 if (vid
!= -1 && cpsw_ale_get_vlan_id(ale_entry
) != vid
)
487 if (cpsw_ale_get_mcast(ale_entry
)) {
490 if (cpsw_ale_get_super(ale_entry
))
493 cpsw_ale_get_addr(ale_entry
, addr
);
494 if (!is_broadcast_ether_addr(addr
))
495 cpsw_ale_flush_mcast(ale
, ale_entry
, port_mask
);
498 cpsw_ale_write(ale
, idx
, ale_entry
);
503 static inline void cpsw_ale_set_vlan_entry_type(u32
*ale_entry
,
506 if (flags
& ALE_VLAN
) {
507 cpsw_ale_set_entry_type(ale_entry
, ALE_TYPE_VLAN_ADDR
);
508 cpsw_ale_set_vlan_id(ale_entry
, vid
);
510 cpsw_ale_set_entry_type(ale_entry
, ALE_TYPE_ADDR
);
514 int cpsw_ale_add_ucast(struct cpsw_ale
*ale
, const u8
*addr
, int port
,
517 u32 ale_entry
[ALE_ENTRY_WORDS
] = {0, 0, 0};
520 cpsw_ale_set_vlan_entry_type(ale_entry
, flags
, vid
);
522 cpsw_ale_set_addr(ale_entry
, addr
);
523 cpsw_ale_set_ucast_type(ale_entry
, ALE_UCAST_PERSISTANT
);
524 cpsw_ale_set_secure(ale_entry
, (flags
& ALE_SECURE
) ? 1 : 0);
525 cpsw_ale_set_blocked(ale_entry
, (flags
& ALE_BLOCKED
) ? 1 : 0);
526 cpsw_ale_set_port_num(ale_entry
, port
, ale
->port_num_bits
);
528 idx
= cpsw_ale_match_addr(ale
, addr
, (flags
& ALE_VLAN
) ? vid
: 0);
530 idx
= cpsw_ale_match_free(ale
);
532 idx
= cpsw_ale_find_ageable(ale
);
536 cpsw_ale_write(ale
, idx
, ale_entry
);
540 int cpsw_ale_del_ucast(struct cpsw_ale
*ale
, const u8
*addr
, int port
,
543 u32 ale_entry
[ALE_ENTRY_WORDS
] = {0, 0, 0};
546 idx
= cpsw_ale_match_addr(ale
, addr
, (flags
& ALE_VLAN
) ? vid
: 0);
550 cpsw_ale_set_entry_type(ale_entry
, ALE_TYPE_FREE
);
551 cpsw_ale_write(ale
, idx
, ale_entry
);
555 int cpsw_ale_add_mcast(struct cpsw_ale
*ale
, const u8
*addr
, int port_mask
,
556 int flags
, u16 vid
, int mcast_state
)
558 u32 ale_entry
[ALE_ENTRY_WORDS
] = {0, 0, 0};
561 idx
= cpsw_ale_match_addr(ale
, addr
, (flags
& ALE_VLAN
) ? vid
: 0);
563 cpsw_ale_read(ale
, idx
, ale_entry
);
565 cpsw_ale_set_vlan_entry_type(ale_entry
, flags
, vid
);
567 cpsw_ale_set_addr(ale_entry
, addr
);
568 cpsw_ale_set_super(ale_entry
, (flags
& ALE_SUPER
) ? 1 : 0);
569 cpsw_ale_set_mcast_state(ale_entry
, mcast_state
);
571 mask
= cpsw_ale_get_port_mask(ale_entry
,
572 ale
->port_mask_bits
);
574 cpsw_ale_set_port_mask(ale_entry
, port_mask
,
575 ale
->port_mask_bits
);
578 idx
= cpsw_ale_match_free(ale
);
580 idx
= cpsw_ale_find_ageable(ale
);
584 cpsw_ale_write(ale
, idx
, ale_entry
);
588 int cpsw_ale_del_mcast(struct cpsw_ale
*ale
, const u8
*addr
, int port_mask
,
591 u32 ale_entry
[ALE_ENTRY_WORDS
] = {0, 0, 0};
592 int mcast_members
= 0;
595 idx
= cpsw_ale_match_addr(ale
, addr
, (flags
& ALE_VLAN
) ? vid
: 0);
599 cpsw_ale_read(ale
, idx
, ale_entry
);
602 mcast_members
= cpsw_ale_get_port_mask(ale_entry
,
603 ale
->port_mask_bits
);
604 mcast_members
&= ~port_mask
;
608 cpsw_ale_set_port_mask(ale_entry
, mcast_members
,
609 ale
->port_mask_bits
);
611 cpsw_ale_set_entry_type(ale_entry
, ALE_TYPE_FREE
);
613 cpsw_ale_write(ale
, idx
, ale_entry
);
617 /* ALE NetCP NU switch specific vlan functions */
618 static void cpsw_ale_set_vlan_mcast(struct cpsw_ale
*ale
, u32
*ale_entry
,
619 int reg_mcast
, int unreg_mcast
)
623 /* Set VLAN registered multicast flood mask */
624 idx
= cpsw_ale_vlan_get_fld(ale
, ale_entry
,
625 ALE_ENT_VID_REG_MCAST_IDX
);
626 writel(reg_mcast
, ale
->params
.ale_regs
+ ALE_VLAN_MASK_MUX(idx
));
628 /* Set VLAN unregistered multicast flood mask */
629 idx
= cpsw_ale_vlan_get_fld(ale
, ale_entry
,
630 ALE_ENT_VID_UNREG_MCAST_IDX
);
631 writel(unreg_mcast
, ale
->params
.ale_regs
+ ALE_VLAN_MASK_MUX(idx
));
634 static void cpsw_ale_set_vlan_untag(struct cpsw_ale
*ale
, u32
*ale_entry
,
635 u16 vid
, int untag_mask
)
637 cpsw_ale_vlan_set_fld(ale
, ale_entry
,
638 ALE_ENT_VID_FORCE_UNTAGGED_MSK
,
640 if (untag_mask
& ALE_PORT_HOST
)
641 bitmap_set(ale
->p0_untag_vid_mask
, vid
, 1);
643 bitmap_clear(ale
->p0_untag_vid_mask
, vid
, 1);
646 int cpsw_ale_add_vlan(struct cpsw_ale
*ale
, u16 vid
, int port_mask
, int untag
,
647 int reg_mcast
, int unreg_mcast
)
649 u32 ale_entry
[ALE_ENTRY_WORDS
] = {0, 0, 0};
652 idx
= cpsw_ale_match_vlan(ale
, vid
);
654 cpsw_ale_read(ale
, idx
, ale_entry
);
656 cpsw_ale_set_entry_type(ale_entry
, ALE_TYPE_VLAN
);
657 cpsw_ale_set_vlan_id(ale_entry
, vid
);
658 cpsw_ale_set_vlan_untag(ale
, ale_entry
, vid
, untag
);
660 if (!ale
->params
.nu_switch_ale
) {
661 cpsw_ale_vlan_set_fld(ale
, ale_entry
,
662 ALE_ENT_VID_REG_MCAST_MSK
, reg_mcast
);
663 cpsw_ale_vlan_set_fld(ale
, ale_entry
,
664 ALE_ENT_VID_UNREG_MCAST_MSK
, unreg_mcast
);
666 cpsw_ale_vlan_set_fld(ale
, ale_entry
,
667 ALE_ENT_VID_UNREG_MCAST_IDX
,
668 NU_VLAN_UNREG_MCAST_IDX
);
669 cpsw_ale_set_vlan_mcast(ale
, ale_entry
, reg_mcast
, unreg_mcast
);
672 cpsw_ale_vlan_set_fld(ale
, ale_entry
,
673 ALE_ENT_VID_MEMBER_LIST
, port_mask
);
676 idx
= cpsw_ale_match_free(ale
);
678 idx
= cpsw_ale_find_ageable(ale
);
682 cpsw_ale_write(ale
, idx
, ale_entry
);
686 static void cpsw_ale_vlan_del_modify_int(struct cpsw_ale
*ale
, u32
*ale_entry
,
687 u16 vid
, int port_mask
)
689 int reg_mcast
, unreg_mcast
;
692 members
= cpsw_ale_vlan_get_fld(ale
, ale_entry
,
693 ALE_ENT_VID_MEMBER_LIST
);
694 members
&= ~port_mask
;
696 cpsw_ale_set_vlan_untag(ale
, ale_entry
, vid
, 0);
697 cpsw_ale_set_entry_type(ale_entry
, ALE_TYPE_FREE
);
701 untag
= cpsw_ale_vlan_get_fld(ale
, ale_entry
,
702 ALE_ENT_VID_FORCE_UNTAGGED_MSK
);
703 reg_mcast
= cpsw_ale_vlan_get_fld(ale
, ale_entry
,
704 ALE_ENT_VID_REG_MCAST_MSK
);
705 unreg_mcast
= cpsw_ale_vlan_get_fld(ale
, ale_entry
,
706 ALE_ENT_VID_UNREG_MCAST_MSK
);
708 reg_mcast
&= members
;
709 unreg_mcast
&= members
;
711 cpsw_ale_set_vlan_untag(ale
, ale_entry
, vid
, untag
);
713 if (!ale
->params
.nu_switch_ale
) {
714 cpsw_ale_vlan_set_fld(ale
, ale_entry
,
715 ALE_ENT_VID_REG_MCAST_MSK
, reg_mcast
);
716 cpsw_ale_vlan_set_fld(ale
, ale_entry
,
717 ALE_ENT_VID_UNREG_MCAST_MSK
, unreg_mcast
);
719 cpsw_ale_set_vlan_mcast(ale
, ale_entry
, reg_mcast
,
722 cpsw_ale_vlan_set_fld(ale
, ale_entry
,
723 ALE_ENT_VID_MEMBER_LIST
, members
);
726 int cpsw_ale_vlan_del_modify(struct cpsw_ale
*ale
, u16 vid
, int port_mask
)
728 u32 ale_entry
[ALE_ENTRY_WORDS
] = {0, 0, 0};
731 idx
= cpsw_ale_match_vlan(ale
, vid
);
735 cpsw_ale_read(ale
, idx
, ale_entry
);
737 cpsw_ale_vlan_del_modify_int(ale
, ale_entry
, vid
, port_mask
);
738 cpsw_ale_write(ale
, idx
, ale_entry
);
743 int cpsw_ale_del_vlan(struct cpsw_ale
*ale
, u16 vid
, int port_mask
)
745 u32 ale_entry
[ALE_ENTRY_WORDS
] = {0, 0, 0};
748 idx
= cpsw_ale_match_vlan(ale
, vid
);
752 cpsw_ale_read(ale
, idx
, ale_entry
);
754 /* if !port_mask - force remove VLAN (legacy).
755 * Check if there are other VLAN members ports
756 * if no - remove VLAN.
757 * if yes it means same VLAN was added to >1 port in multi port mode, so
758 * remove port_mask ports from VLAN ALE entry excluding Host port.
760 members
= cpsw_ale_vlan_get_fld(ale
, ale_entry
, ALE_ENT_VID_MEMBER_LIST
);
761 members
&= ~port_mask
;
763 if (!port_mask
|| !members
) {
764 /* last port or force remove - remove VLAN */
765 cpsw_ale_set_vlan_untag(ale
, ale_entry
, vid
, 0);
766 cpsw_ale_set_entry_type(ale_entry
, ALE_TYPE_FREE
);
768 port_mask
&= ~ALE_PORT_HOST
;
769 cpsw_ale_vlan_del_modify_int(ale
, ale_entry
, vid
, port_mask
);
772 cpsw_ale_write(ale
, idx
, ale_entry
);
777 int cpsw_ale_vlan_add_modify(struct cpsw_ale
*ale
, u16 vid
, int port_mask
,
778 int untag_mask
, int reg_mask
, int unreg_mask
)
780 u32 ale_entry
[ALE_ENTRY_WORDS
] = {0, 0, 0};
781 int reg_mcast_members
, unreg_mcast_members
;
782 int vlan_members
, untag_members
;
785 idx
= cpsw_ale_match_vlan(ale
, vid
);
787 cpsw_ale_read(ale
, idx
, ale_entry
);
789 vlan_members
= cpsw_ale_vlan_get_fld(ale
, ale_entry
,
790 ALE_ENT_VID_MEMBER_LIST
);
791 reg_mcast_members
= cpsw_ale_vlan_get_fld(ale
, ale_entry
,
792 ALE_ENT_VID_REG_MCAST_MSK
);
793 unreg_mcast_members
=
794 cpsw_ale_vlan_get_fld(ale
, ale_entry
,
795 ALE_ENT_VID_UNREG_MCAST_MSK
);
796 untag_members
= cpsw_ale_vlan_get_fld(ale
, ale_entry
,
797 ALE_ENT_VID_FORCE_UNTAGGED_MSK
);
799 vlan_members
|= port_mask
;
800 untag_members
= (untag_members
& ~port_mask
) | untag_mask
;
801 reg_mcast_members
= (reg_mcast_members
& ~port_mask
) | reg_mask
;
802 unreg_mcast_members
= (unreg_mcast_members
& ~port_mask
) | unreg_mask
;
804 ret
= cpsw_ale_add_vlan(ale
, vid
, vlan_members
, untag_members
,
805 reg_mcast_members
, unreg_mcast_members
);
807 dev_err(ale
->params
.dev
, "Unable to add vlan\n");
810 dev_dbg(ale
->params
.dev
, "port mask 0x%x untag 0x%x\n", vlan_members
,
816 void cpsw_ale_set_unreg_mcast(struct cpsw_ale
*ale
, int unreg_mcast_mask
,
819 u32 ale_entry
[ALE_ENTRY_WORDS
];
820 int unreg_members
= 0;
823 for (idx
= 0; idx
< ale
->params
.ale_entries
; idx
++) {
824 cpsw_ale_read(ale
, idx
, ale_entry
);
825 type
= cpsw_ale_get_entry_type(ale_entry
);
826 if (type
!= ALE_TYPE_VLAN
)
830 cpsw_ale_vlan_get_fld(ale
, ale_entry
,
831 ALE_ENT_VID_UNREG_MCAST_MSK
);
833 unreg_members
|= unreg_mcast_mask
;
835 unreg_members
&= ~unreg_mcast_mask
;
836 cpsw_ale_vlan_set_fld(ale
, ale_entry
,
837 ALE_ENT_VID_UNREG_MCAST_MSK
,
839 cpsw_ale_write(ale
, idx
, ale_entry
);
843 static void cpsw_ale_vlan_set_unreg_mcast(struct cpsw_ale
*ale
, u32
*ale_entry
,
848 unreg_mcast
= cpsw_ale_vlan_get_fld(ale
, ale_entry
,
849 ALE_ENT_VID_UNREG_MCAST_MSK
);
851 unreg_mcast
|= ALE_PORT_HOST
;
853 unreg_mcast
&= ~ALE_PORT_HOST
;
855 cpsw_ale_vlan_set_fld(ale
, ale_entry
,
856 ALE_ENT_VID_UNREG_MCAST_MSK
, unreg_mcast
);
860 cpsw_ale_vlan_set_unreg_mcast_idx(struct cpsw_ale
*ale
, u32
*ale_entry
,
866 idx
= cpsw_ale_vlan_get_fld(ale
, ale_entry
,
867 ALE_ENT_VID_UNREG_MCAST_IDX
);
869 unreg_mcast
= readl(ale
->params
.ale_regs
+ ALE_VLAN_MASK_MUX(idx
));
872 unreg_mcast
|= ALE_PORT_HOST
;
874 unreg_mcast
&= ~ALE_PORT_HOST
;
876 writel(unreg_mcast
, ale
->params
.ale_regs
+ ALE_VLAN_MASK_MUX(idx
));
879 void cpsw_ale_set_allmulti(struct cpsw_ale
*ale
, int allmulti
, int port
)
881 u32 ale_entry
[ALE_ENTRY_WORDS
];
884 for (idx
= 0; idx
< ale
->params
.ale_entries
; idx
++) {
887 cpsw_ale_read(ale
, idx
, ale_entry
);
888 type
= cpsw_ale_get_entry_type(ale_entry
);
889 if (type
!= ALE_TYPE_VLAN
)
892 vlan_members
= cpsw_ale_vlan_get_fld(ale
, ale_entry
,
893 ALE_ENT_VID_MEMBER_LIST
);
895 if (port
!= -1 && !(vlan_members
& BIT(port
)))
898 if (!ale
->params
.nu_switch_ale
)
899 cpsw_ale_vlan_set_unreg_mcast(ale
, ale_entry
, allmulti
);
901 cpsw_ale_vlan_set_unreg_mcast_idx(ale
, ale_entry
,
904 cpsw_ale_write(ale
, idx
, ale_entry
);
908 struct ale_control_info
{
910 int offset
, port_offset
;
911 int shift
, port_shift
;
915 static struct ale_control_info ale_controls
[ALE_NUM_CONTROLS
] = {
918 .offset
= ALE_CONTROL
,
926 .offset
= ALE_CONTROL
,
934 .offset
= ALE_CONTROL
,
940 [ALE_P0_UNI_FLOOD
] = {
941 .name
= "port0_unicast_flood",
942 .offset
= ALE_CONTROL
,
948 [ALE_VLAN_NOLEARN
] = {
949 .name
= "vlan_nolearn",
950 .offset
= ALE_CONTROL
,
956 [ALE_NO_PORT_VLAN
] = {
957 .name
= "no_port_vlan",
958 .offset
= ALE_CONTROL
,
966 .offset
= ALE_CONTROL
,
974 .offset
= ALE_CONTROL
,
980 [ALE_RATE_LIMIT_TX
] = {
981 .name
= "rate_limit_tx",
982 .offset
= ALE_CONTROL
,
989 .name
= "vlan_aware",
990 .offset
= ALE_CONTROL
,
996 [ALE_AUTH_ENABLE
] = {
997 .name
= "auth_enable",
998 .offset
= ALE_CONTROL
,
1004 [ALE_RATE_LIMIT
] = {
1005 .name
= "rate_limit",
1006 .offset
= ALE_CONTROL
,
1012 [ALE_PORT_STATE
] = {
1013 .name
= "port_state",
1014 .offset
= ALE_PORTCTL
,
1020 [ALE_PORT_DROP_UNTAGGED
] = {
1021 .name
= "drop_untagged",
1022 .offset
= ALE_PORTCTL
,
1028 [ALE_PORT_DROP_UNKNOWN_VLAN
] = {
1029 .name
= "drop_unknown",
1030 .offset
= ALE_PORTCTL
,
1036 [ALE_PORT_NOLEARN
] = {
1038 .offset
= ALE_PORTCTL
,
1044 [ALE_PORT_NO_SA_UPDATE
] = {
1045 .name
= "no_source_update",
1046 .offset
= ALE_PORTCTL
,
1052 [ALE_PORT_MACONLY
] = {
1053 .name
= "mac_only_port_mode",
1054 .offset
= ALE_PORTCTL
,
1060 [ALE_PORT_MACONLY_CAF
] = {
1061 .name
= "mac_only_port_caf",
1062 .offset
= ALE_PORTCTL
,
1068 [ALE_PORT_MCAST_LIMIT
] = {
1069 .name
= "mcast_limit",
1070 .offset
= ALE_PORTCTL
,
1076 [ALE_PORT_BCAST_LIMIT
] = {
1077 .name
= "bcast_limit",
1078 .offset
= ALE_PORTCTL
,
1084 [ALE_PORT_UNKNOWN_VLAN_MEMBER
] = {
1085 .name
= "unknown_vlan_member",
1086 .offset
= ALE_UNKNOWNVLAN
,
1092 [ALE_PORT_UNKNOWN_MCAST_FLOOD
] = {
1093 .name
= "unknown_mcast_flood",
1094 .offset
= ALE_UNKNOWNVLAN
,
1100 [ALE_PORT_UNKNOWN_REG_MCAST_FLOOD
] = {
1101 .name
= "unknown_reg_flood",
1102 .offset
= ALE_UNKNOWNVLAN
,
1108 [ALE_PORT_UNTAGGED_EGRESS
] = {
1109 .name
= "untagged_egress",
1110 .offset
= ALE_UNKNOWNVLAN
,
1116 [ALE_DEFAULT_THREAD_ID
] = {
1117 .name
= "default_thread_id",
1118 .offset
= AM65_CPSW_ALE_THREAD_DEF_REG
,
1124 [ALE_DEFAULT_THREAD_ENABLE
] = {
1125 .name
= "default_thread_id_enable",
1126 .offset
= AM65_CPSW_ALE_THREAD_DEF_REG
,
1134 int cpsw_ale_control_set(struct cpsw_ale
*ale
, int port
, int control
,
1137 const struct ale_control_info
*info
;
1141 if (control
< 0 || control
>= ARRAY_SIZE(ale_controls
))
1144 info
= &ale_controls
[control
];
1145 if (info
->port_offset
== 0 && info
->port_shift
== 0)
1146 port
= 0; /* global, port is a dont care */
1148 if (port
< 0 || port
>= ale
->params
.ale_ports
)
1151 mask
= BITMASK(info
->bits
);
1155 offset
= info
->offset
+ (port
* info
->port_offset
);
1156 shift
= info
->shift
+ (port
* info
->port_shift
);
1158 tmp
= readl_relaxed(ale
->params
.ale_regs
+ offset
);
1159 tmp
= (tmp
& ~(mask
<< shift
)) | (value
<< shift
);
1160 writel_relaxed(tmp
, ale
->params
.ale_regs
+ offset
);
1165 int cpsw_ale_control_get(struct cpsw_ale
*ale
, int port
, int control
)
1167 const struct ale_control_info
*info
;
1171 if (control
< 0 || control
>= ARRAY_SIZE(ale_controls
))
1174 info
= &ale_controls
[control
];
1175 if (info
->port_offset
== 0 && info
->port_shift
== 0)
1176 port
= 0; /* global, port is a dont care */
1178 if (port
< 0 || port
>= ale
->params
.ale_ports
)
1181 offset
= info
->offset
+ (port
* info
->port_offset
);
1182 shift
= info
->shift
+ (port
* info
->port_shift
);
1184 tmp
= readl_relaxed(ale
->params
.ale_regs
+ offset
) >> shift
;
1185 return tmp
& BITMASK(info
->bits
);
1188 int cpsw_ale_rx_ratelimit_mc(struct cpsw_ale
*ale
, int port
, unsigned int ratelimit_pps
)
1191 int val
= ratelimit_pps
/ ALE_RATE_LIMIT_MIN_PPS
;
1192 u32 remainder
= ratelimit_pps
% ALE_RATE_LIMIT_MIN_PPS
;
1194 if (ratelimit_pps
&& !val
) {
1195 dev_err(ale
->params
.dev
, "ALE MC port:%d ratelimit min value 1000pps\n", port
);
1200 dev_info(ale
->params
.dev
, "ALE port:%d MC ratelimit set to %dpps (requested %d)\n",
1201 port
, ratelimit_pps
- remainder
, ratelimit_pps
);
1203 cpsw_ale_control_set(ale
, port
, ALE_PORT_MCAST_LIMIT
, val
);
1205 dev_dbg(ale
->params
.dev
, "ALE port:%d MC ratelimit set %d\n",
1206 port
, val
* ALE_RATE_LIMIT_MIN_PPS
);
1210 int cpsw_ale_rx_ratelimit_bc(struct cpsw_ale
*ale
, int port
, unsigned int ratelimit_pps
)
1213 int val
= ratelimit_pps
/ ALE_RATE_LIMIT_MIN_PPS
;
1214 u32 remainder
= ratelimit_pps
% ALE_RATE_LIMIT_MIN_PPS
;
1216 if (ratelimit_pps
&& !val
) {
1217 dev_err(ale
->params
.dev
, "ALE port:%d BC ratelimit min value 1000pps\n", port
);
1222 dev_info(ale
->params
.dev
, "ALE port:%d BC ratelimit set to %dpps (requested %d)\n",
1223 port
, ratelimit_pps
- remainder
, ratelimit_pps
);
1225 cpsw_ale_control_set(ale
, port
, ALE_PORT_BCAST_LIMIT
, val
);
1227 dev_dbg(ale
->params
.dev
, "ALE port:%d BC ratelimit set %d\n",
1228 port
, val
* ALE_RATE_LIMIT_MIN_PPS
);
1232 static void cpsw_ale_timer(struct timer_list
*t
)
1234 struct cpsw_ale
*ale
= from_timer(ale
, t
, timer
);
1236 cpsw_ale_control_set(ale
, 0, ALE_AGEOUT
, 1);
1239 ale
->timer
.expires
= jiffies
+ ale
->ageout
;
1240 add_timer(&ale
->timer
);
1244 static void cpsw_ale_hw_aging_timer_start(struct cpsw_ale
*ale
)
1248 aging_timer
= ale
->params
.bus_freq
/ 1000000;
1249 aging_timer
*= ale
->params
.ale_ageout
;
1251 if (aging_timer
& ~ALE_AGING_TIMER_MASK
) {
1252 aging_timer
= ALE_AGING_TIMER_MASK
;
1253 dev_warn(ale
->params
.dev
,
1254 "ALE aging timer overflow, set to max\n");
1257 writel(aging_timer
, ale
->params
.ale_regs
+ ALE_AGING_TIMER
);
1260 static void cpsw_ale_hw_aging_timer_stop(struct cpsw_ale
*ale
)
1262 writel(0, ale
->params
.ale_regs
+ ALE_AGING_TIMER
);
1265 static void cpsw_ale_aging_start(struct cpsw_ale
*ale
)
1267 if (!ale
->params
.ale_ageout
)
1270 if (ale
->features
& CPSW_ALE_F_HW_AUTOAGING
) {
1271 cpsw_ale_hw_aging_timer_start(ale
);
1275 timer_setup(&ale
->timer
, cpsw_ale_timer
, 0);
1276 ale
->timer
.expires
= jiffies
+ ale
->ageout
;
1277 add_timer(&ale
->timer
);
1280 static void cpsw_ale_aging_stop(struct cpsw_ale
*ale
)
1282 if (!ale
->params
.ale_ageout
)
1285 if (ale
->features
& CPSW_ALE_F_HW_AUTOAGING
) {
1286 cpsw_ale_hw_aging_timer_stop(ale
);
1290 del_timer_sync(&ale
->timer
);
1293 void cpsw_ale_start(struct cpsw_ale
*ale
)
1295 unsigned long ale_prescale
;
1297 /* configure Broadcast and Multicast Rate Limit
1298 * number_of_packets = (Fclk / ALE_PRESCALE) * port.BCAST/MCAST_LIMIT
1299 * ALE_PRESCALE width is 19bit and min value 0x10
1300 * port.BCAST/MCAST_LIMIT is 8bit
1302 * For multi port configuration support the ALE_PRESCALE is configured to 1ms interval,
1303 * which allows to configure port.BCAST/MCAST_LIMIT per port and achieve:
1304 * min number_of_packets = 1000 when port.BCAST/MCAST_LIMIT = 1
1305 * max number_of_packets = 1000 * 255 = 255000 when port.BCAST/MCAST_LIMIT = 0xFF
1307 ale_prescale
= ale
->params
.bus_freq
/ ALE_RATE_LIMIT_MIN_PPS
;
1308 writel((u32
)ale_prescale
, ale
->params
.ale_regs
+ ALE_PRESCALE
);
1310 /* Allow MC/BC rate limiting globally.
1311 * The actual Rate Limit cfg enabled per-port by port.BCAST/MCAST_LIMIT
1313 cpsw_ale_control_set(ale
, 0, ALE_RATE_LIMIT
, 1);
1315 cpsw_ale_control_set(ale
, 0, ALE_ENABLE
, 1);
1316 cpsw_ale_control_set(ale
, 0, ALE_CLEAR
, 1);
1318 cpsw_ale_aging_start(ale
);
1321 void cpsw_ale_stop(struct cpsw_ale
*ale
)
1323 cpsw_ale_aging_stop(ale
);
1324 cpsw_ale_control_set(ale
, 0, ALE_CLEAR
, 1);
1325 cpsw_ale_control_set(ale
, 0, ALE_ENABLE
, 0);
1328 static const struct reg_field ale_fields_cpsw
[] = {
1329 /* CPSW_ALE_IDVER_REG */
1330 [MINOR_VER
] = REG_FIELD(ALE_IDVER
, 0, 7),
1331 [MAJOR_VER
] = REG_FIELD(ALE_IDVER
, 8, 15),
1334 static const struct reg_field ale_fields_cpsw_nu
[] = {
1335 /* CPSW_ALE_IDVER_REG */
1336 [MINOR_VER
] = REG_FIELD(ALE_IDVER
, 0, 7),
1337 [MAJOR_VER
] = REG_FIELD(ALE_IDVER
, 8, 10),
1338 /* CPSW_ALE_STATUS_REG */
1339 [ALE_ENTRIES
] = REG_FIELD(ALE_STATUS
, 0, 7),
1340 [ALE_POLICERS
] = REG_FIELD(ALE_STATUS
, 8, 15),
1341 /* CPSW_ALE_POLICER_PORT_OUI_REG */
1342 [POL_PORT_MEN
] = REG_FIELD(ALE_POLICER_PORT_OUI
, 31, 31),
1343 [POL_TRUNK_ID
] = REG_FIELD(ALE_POLICER_PORT_OUI
, 30, 30),
1344 [POL_PORT_NUM
] = REG_FIELD(ALE_POLICER_PORT_OUI
, 25, 25),
1345 [POL_PRI_MEN
] = REG_FIELD(ALE_POLICER_PORT_OUI
, 19, 19),
1346 [POL_PRI_VAL
] = REG_FIELD(ALE_POLICER_PORT_OUI
, 16, 18),
1347 [POL_OUI_MEN
] = REG_FIELD(ALE_POLICER_PORT_OUI
, 15, 15),
1348 [POL_OUI_INDEX
] = REG_FIELD(ALE_POLICER_PORT_OUI
, 0, 5),
1350 /* CPSW_ALE_POLICER_DA_SA_REG */
1351 [POL_DST_MEN
] = REG_FIELD(ALE_POLICER_DA_SA
, 31, 31),
1352 [POL_DST_INDEX
] = REG_FIELD(ALE_POLICER_DA_SA
, 16, 21),
1353 [POL_SRC_MEN
] = REG_FIELD(ALE_POLICER_DA_SA
, 15, 15),
1354 [POL_SRC_INDEX
] = REG_FIELD(ALE_POLICER_DA_SA
, 0, 5),
1356 /* CPSW_ALE_POLICER_VLAN_REG */
1357 [POL_OVLAN_MEN
] = REG_FIELD(ALE_POLICER_VLAN
, 31, 31),
1358 [POL_OVLAN_INDEX
] = REG_FIELD(ALE_POLICER_VLAN
, 16, 21),
1359 [POL_IVLAN_MEN
] = REG_FIELD(ALE_POLICER_VLAN
, 15, 15),
1360 [POL_IVLAN_INDEX
] = REG_FIELD(ALE_POLICER_VLAN
, 0, 5),
1362 /* CPSW_ALE_POLICER_ETHERTYPE_IPSA_REG */
1363 [POL_ETHERTYPE_MEN
] = REG_FIELD(ALE_POLICER_ETHERTYPE_IPSA
, 31, 31),
1364 [POL_ETHERTYPE_INDEX
] = REG_FIELD(ALE_POLICER_ETHERTYPE_IPSA
, 16, 21),
1365 [POL_IPSRC_MEN
] = REG_FIELD(ALE_POLICER_ETHERTYPE_IPSA
, 15, 15),
1366 [POL_IPSRC_INDEX
] = REG_FIELD(ALE_POLICER_ETHERTYPE_IPSA
, 0, 5),
1368 /* CPSW_ALE_POLICER_IPDA_REG */
1369 [POL_IPDST_MEN
] = REG_FIELD(ALE_POLICER_IPDA
, 31, 31),
1370 [POL_IPDST_INDEX
] = REG_FIELD(ALE_POLICER_IPDA
, 16, 21),
1372 /* CPSW_ALE_POLICER_TBL_CTL_REG */
1374 * REG_FIELDS not defined for this as fields cannot be correctly
1375 * used independently
1378 /* CPSW_ALE_POLICER_CTL_REG */
1379 [POL_EN
] = REG_FIELD(ALE_POLICER_CTL
, 31, 31),
1380 [POL_RED_DROP_EN
] = REG_FIELD(ALE_POLICER_CTL
, 29, 29),
1381 [POL_YELLOW_DROP_EN
] = REG_FIELD(ALE_POLICER_CTL
, 28, 28),
1382 [POL_YELLOW_THRESH
] = REG_FIELD(ALE_POLICER_CTL
, 24, 26),
1383 [POL_POL_MATCH_MODE
] = REG_FIELD(ALE_POLICER_CTL
, 22, 23),
1384 [POL_PRIORITY_THREAD_EN
] = REG_FIELD(ALE_POLICER_CTL
, 21, 21),
1385 [POL_MAC_ONLY_DEF_DIS
] = REG_FIELD(ALE_POLICER_CTL
, 20, 20),
1387 /* CPSW_ALE_POLICER_TEST_CTL_REG */
1388 [POL_TEST_CLR
] = REG_FIELD(ALE_POLICER_TEST_CTL
, 31, 31),
1389 [POL_TEST_CLR_RED
] = REG_FIELD(ALE_POLICER_TEST_CTL
, 30, 30),
1390 [POL_TEST_CLR_YELLOW
] = REG_FIELD(ALE_POLICER_TEST_CTL
, 29, 29),
1391 [POL_TEST_CLR_SELECTED
] = REG_FIELD(ALE_POLICER_TEST_CTL
, 28, 28),
1392 [POL_TEST_ENTRY
] = REG_FIELD(ALE_POLICER_TEST_CTL
, 0, 4),
1394 /* CPSW_ALE_POLICER_HIT_STATUS_REG */
1395 [POL_STATUS_HIT
] = REG_FIELD(ALE_POLICER_HIT_STATUS
, 31, 31),
1396 [POL_STATUS_HIT_RED
] = REG_FIELD(ALE_POLICER_HIT_STATUS
, 30, 30),
1397 [POL_STATUS_HIT_YELLOW
] = REG_FIELD(ALE_POLICER_HIT_STATUS
, 29, 29),
1399 /* CPSW_ALE_THREAD_DEF_REG */
1400 [ALE_DEFAULT_THREAD_EN
] = REG_FIELD(ALE_THREAD_DEF
, 15, 15),
1401 [ALE_DEFAULT_THREAD_VAL
] = REG_FIELD(ALE_THREAD_DEF
, 0, 5),
1403 /* CPSW_ALE_THREAD_CTL_REG */
1404 [ALE_THREAD_CLASS_INDEX
] = REG_FIELD(ALE_THREAD_CTL
, 0, 4),
1406 /* CPSW_ALE_THREAD_VAL_REG */
1407 [ALE_THREAD_ENABLE
] = REG_FIELD(ALE_THREAD_VAL
, 15, 15),
1408 [ALE_THREAD_VALUE
] = REG_FIELD(ALE_THREAD_VAL
, 0, 5),
1411 static const struct cpsw_ale_dev_id cpsw_ale_id_match
[] = {
1413 /* am3/4/5, dra7. dm814x, 66ak2hk-gbe */
1415 .tbl_entries
= 1024,
1416 .reg_fields
= ale_fields_cpsw
,
1417 .num_fields
= ARRAY_SIZE(ale_fields_cpsw
),
1418 .vlan_entry_tbl
= vlan_entry_cpsw
,
1422 .dev_id
= "66ak2h-xgbe",
1423 .tbl_entries
= 2048,
1424 .reg_fields
= ale_fields_cpsw
,
1425 .num_fields
= ARRAY_SIZE(ale_fields_cpsw
),
1426 .vlan_entry_tbl
= vlan_entry_cpsw
,
1429 .dev_id
= "66ak2el",
1430 .features
= CPSW_ALE_F_STATUS_REG
,
1431 .reg_fields
= ale_fields_cpsw_nu
,
1432 .num_fields
= ARRAY_SIZE(ale_fields_cpsw_nu
),
1433 .nu_switch_ale
= true,
1434 .vlan_entry_tbl
= vlan_entry_nu
,
1438 .features
= CPSW_ALE_F_STATUS_REG
,
1440 .reg_fields
= ale_fields_cpsw_nu
,
1441 .num_fields
= ARRAY_SIZE(ale_fields_cpsw_nu
),
1442 .nu_switch_ale
= true,
1443 .vlan_entry_tbl
= vlan_entry_nu
,
1446 .dev_id
= "am65x-cpsw2g",
1447 .features
= CPSW_ALE_F_STATUS_REG
| CPSW_ALE_F_HW_AUTOAGING
,
1449 .reg_fields
= ale_fields_cpsw_nu
,
1450 .num_fields
= ARRAY_SIZE(ale_fields_cpsw_nu
),
1451 .nu_switch_ale
= true,
1452 .vlan_entry_tbl
= vlan_entry_nu
,
1455 .dev_id
= "j721e-cpswxg",
1456 .features
= CPSW_ALE_F_STATUS_REG
| CPSW_ALE_F_HW_AUTOAGING
,
1457 .reg_fields
= ale_fields_cpsw_nu
,
1458 .num_fields
= ARRAY_SIZE(ale_fields_cpsw_nu
),
1459 .vlan_entry_tbl
= vlan_entry_k3_cpswxg
,
1462 .dev_id
= "am64-cpswxg",
1463 .features
= CPSW_ALE_F_STATUS_REG
| CPSW_ALE_F_HW_AUTOAGING
,
1464 .reg_fields
= ale_fields_cpsw_nu
,
1465 .num_fields
= ARRAY_SIZE(ale_fields_cpsw_nu
),
1466 .vlan_entry_tbl
= vlan_entry_k3_cpswxg
,
1473 cpsw_ale_dev_id
*cpsw_ale_match_id(const struct cpsw_ale_dev_id
*id
,
1479 while (id
->dev_id
) {
1480 if (strcmp(dev_id
, id
->dev_id
) == 0)
1487 static const struct regmap_config ale_regmap_cfg
= {
1494 static int cpsw_ale_regfield_init(struct cpsw_ale
*ale
)
1496 const struct reg_field
*reg_fields
= ale
->params
.reg_fields
;
1497 struct device
*dev
= ale
->params
.dev
;
1498 struct regmap
*regmap
= ale
->regmap
;
1501 for (i
= 0; i
< ale
->params
.num_fields
; i
++) {
1502 ale
->fields
[i
] = devm_regmap_field_alloc(dev
, regmap
,
1504 if (IS_ERR(ale
->fields
[i
])) {
1505 dev_err(dev
, "Unable to allocate regmap field %d\n", i
);
1506 return PTR_ERR(ale
->fields
[i
]);
1513 struct cpsw_ale
*cpsw_ale_create(struct cpsw_ale_params
*params
)
1515 u32 ale_entries
, rev_major
, rev_minor
, policers
;
1516 const struct cpsw_ale_dev_id
*ale_dev_id
;
1517 struct cpsw_ale
*ale
;
1520 ale_dev_id
= cpsw_ale_match_id(cpsw_ale_id_match
, params
->dev_id
);
1522 return ERR_PTR(-EINVAL
);
1524 params
->ale_entries
= ale_dev_id
->tbl_entries
;
1525 params
->nu_switch_ale
= ale_dev_id
->nu_switch_ale
;
1526 params
->reg_fields
= ale_dev_id
->reg_fields
;
1527 params
->num_fields
= ale_dev_id
->num_fields
;
1529 ale
= devm_kzalloc(params
->dev
, sizeof(*ale
), GFP_KERNEL
);
1531 return ERR_PTR(-ENOMEM
);
1532 ale
->regmap
= devm_regmap_init_mmio(params
->dev
, params
->ale_regs
,
1534 if (IS_ERR(ale
->regmap
)) {
1535 dev_err(params
->dev
, "Couldn't create CPSW ALE regmap\n");
1536 return ERR_PTR(-ENOMEM
);
1539 ale
->params
= *params
;
1540 ret
= cpsw_ale_regfield_init(ale
);
1542 return ERR_PTR(ret
);
1544 ale
->p0_untag_vid_mask
= devm_bitmap_zalloc(params
->dev
, VLAN_N_VID
,
1546 if (!ale
->p0_untag_vid_mask
)
1547 return ERR_PTR(-ENOMEM
);
1549 ale
->ageout
= ale
->params
.ale_ageout
* HZ
;
1550 ale
->features
= ale_dev_id
->features
;
1551 ale
->vlan_entry_tbl
= ale_dev_id
->vlan_entry_tbl
;
1553 regmap_field_read(ale
->fields
[MINOR_VER
], &rev_minor
);
1554 regmap_field_read(ale
->fields
[MAJOR_VER
], &rev_major
);
1555 ale
->version
= rev_major
<< 8 | rev_minor
;
1556 dev_info(ale
->params
.dev
, "initialized cpsw ale version %d.%d\n",
1557 rev_major
, rev_minor
);
1559 if (ale
->features
& CPSW_ALE_F_STATUS_REG
&&
1560 !ale
->params
.ale_entries
) {
1561 regmap_field_read(ale
->fields
[ALE_ENTRIES
], &ale_entries
);
1562 /* ALE available on newer NetCP switches has introduced
1563 * a register, ALE_STATUS, to indicate the size of ALE
1564 * table which shows the size as a multiple of 1024 entries.
1565 * For these, params.ale_entries will be set to zero. So
1566 * read the register and update the value of ale_entries.
1567 * return error if ale_entries is zero in ALE_STATUS.
1570 return ERR_PTR(-EINVAL
);
1572 ale_entries
*= ALE_TABLE_SIZE_MULTIPLIER
;
1573 ale
->params
.ale_entries
= ale_entries
;
1576 if (ale
->features
& CPSW_ALE_F_STATUS_REG
&&
1577 !ale
->params
.num_policers
) {
1578 regmap_field_read(ale
->fields
[ALE_POLICERS
], &policers
);
1580 return ERR_PTR(-EINVAL
);
1582 policers
*= ALE_POLICER_SIZE_MULTIPLIER
;
1583 ale
->params
.num_policers
= policers
;
1586 dev_info(ale
->params
.dev
,
1587 "ALE Table size %ld, Policers %ld\n", ale
->params
.ale_entries
,
1588 ale
->params
.num_policers
);
1590 /* set default bits for existing h/w */
1591 ale
->port_mask_bits
= ale
->params
.ale_ports
;
1592 ale
->port_num_bits
= order_base_2(ale
->params
.ale_ports
);
1593 ale
->vlan_field_bits
= ale
->params
.ale_ports
;
1595 /* Set defaults override for ALE on NetCP NU switch and for version
1598 if (ale
->params
.nu_switch_ale
) {
1599 /* Separate registers for unknown vlan configuration.
1600 * Also there are N bits, where N is number of ale
1601 * ports and shift value should be 0
1603 ale_controls
[ALE_PORT_UNKNOWN_VLAN_MEMBER
].bits
=
1604 ale
->params
.ale_ports
;
1605 ale_controls
[ALE_PORT_UNKNOWN_VLAN_MEMBER
].offset
=
1606 ALE_UNKNOWNVLAN_MEMBER
;
1607 ale_controls
[ALE_PORT_UNKNOWN_MCAST_FLOOD
].bits
=
1608 ale
->params
.ale_ports
;
1609 ale_controls
[ALE_PORT_UNKNOWN_MCAST_FLOOD
].shift
= 0;
1610 ale_controls
[ALE_PORT_UNKNOWN_MCAST_FLOOD
].offset
=
1611 ALE_UNKNOWNVLAN_UNREG_MCAST_FLOOD
;
1612 ale_controls
[ALE_PORT_UNKNOWN_REG_MCAST_FLOOD
].bits
=
1613 ale
->params
.ale_ports
;
1614 ale_controls
[ALE_PORT_UNKNOWN_REG_MCAST_FLOOD
].shift
= 0;
1615 ale_controls
[ALE_PORT_UNKNOWN_REG_MCAST_FLOOD
].offset
=
1616 ALE_UNKNOWNVLAN_REG_MCAST_FLOOD
;
1617 ale_controls
[ALE_PORT_UNTAGGED_EGRESS
].bits
=
1618 ale
->params
.ale_ports
;
1619 ale_controls
[ALE_PORT_UNTAGGED_EGRESS
].shift
= 0;
1620 ale_controls
[ALE_PORT_UNTAGGED_EGRESS
].offset
=
1621 ALE_UNKNOWNVLAN_FORCE_UNTAG_EGRESS
;
1624 cpsw_ale_control_set(ale
, 0, ALE_CLEAR
, 1);
1628 void cpsw_ale_dump(struct cpsw_ale
*ale
, u32
*data
)
1632 for (i
= 0; i
< ale
->params
.ale_entries
; i
++) {
1633 cpsw_ale_read(ale
, i
, data
);
1634 data
+= ALE_ENTRY_WORDS
;
1638 void cpsw_ale_restore(struct cpsw_ale
*ale
, u32
*data
)
1642 for (i
= 0; i
< ale
->params
.ale_entries
; i
++) {
1643 cpsw_ale_write(ale
, i
, data
);
1644 data
+= ALE_ENTRY_WORDS
;
1648 u32
cpsw_ale_get_num_entries(struct cpsw_ale
*ale
)
1650 return ale
? ale
->params
.ale_entries
: 0;
1653 /* Reads the specified policer index into ALE POLICER registers */
1654 static void cpsw_ale_policer_read_idx(struct cpsw_ale
*ale
, u32 idx
)
1656 idx
&= ALE_POLICER_TBL_INDEX_MASK
;
1657 writel_relaxed(idx
, ale
->params
.ale_regs
+ ALE_POLICER_TBL_CTL
);
1660 /* Writes the ALE POLICER registers into the specified policer index */
1661 static void cpsw_ale_policer_write_idx(struct cpsw_ale
*ale
, u32 idx
)
1663 idx
&= ALE_POLICER_TBL_INDEX_MASK
;
1664 idx
|= ALE_POLICER_TBL_WRITE_ENABLE
;
1665 writel_relaxed(idx
, ale
->params
.ale_regs
+ ALE_POLICER_TBL_CTL
);
1668 /* enables/disables the custom thread value for the specified policer index */
1669 static void cpsw_ale_policer_thread_idx_enable(struct cpsw_ale
*ale
, u32 idx
,
1670 u32 thread_id
, bool enable
)
1672 regmap_field_write(ale
->fields
[ALE_THREAD_CLASS_INDEX
], idx
);
1673 regmap_field_write(ale
->fields
[ALE_THREAD_VALUE
], thread_id
);
1674 regmap_field_write(ale
->fields
[ALE_THREAD_ENABLE
], enable
? 1 : 0);
1677 /* Disable all policer entries and thread mappings */
1678 static void cpsw_ale_policer_reset(struct cpsw_ale
*ale
)
1682 for (i
= 0; i
< ale
->params
.num_policers
; i
++) {
1683 cpsw_ale_policer_read_idx(ale
, i
);
1684 regmap_field_write(ale
->fields
[POL_PORT_MEN
], 0);
1685 regmap_field_write(ale
->fields
[POL_PRI_MEN
], 0);
1686 regmap_field_write(ale
->fields
[POL_OUI_MEN
], 0);
1687 regmap_field_write(ale
->fields
[POL_DST_MEN
], 0);
1688 regmap_field_write(ale
->fields
[POL_SRC_MEN
], 0);
1689 regmap_field_write(ale
->fields
[POL_OVLAN_MEN
], 0);
1690 regmap_field_write(ale
->fields
[POL_IVLAN_MEN
], 0);
1691 regmap_field_write(ale
->fields
[POL_ETHERTYPE_MEN
], 0);
1692 regmap_field_write(ale
->fields
[POL_IPSRC_MEN
], 0);
1693 regmap_field_write(ale
->fields
[POL_IPDST_MEN
], 0);
1694 regmap_field_write(ale
->fields
[POL_EN
], 0);
1695 regmap_field_write(ale
->fields
[POL_RED_DROP_EN
], 0);
1696 regmap_field_write(ale
->fields
[POL_YELLOW_DROP_EN
], 0);
1697 regmap_field_write(ale
->fields
[POL_PRIORITY_THREAD_EN
], 0);
1699 cpsw_ale_policer_thread_idx_enable(ale
, i
, 0, 0);
1703 /* Default classifier is to map 8 user priorities to N receive channels */
1704 void cpsw_ale_classifier_setup_default(struct cpsw_ale
*ale
, int num_rx_ch
)
1709 * IEEE802.1Q-2014, Standard for Local and metropolitan area networks
1710 * Table I-2 - Traffic type acronyms
1711 * Table I-3 - Defining traffic types
1712 * Section I.4 Traffic types and priority values, states:
1713 * "0 is thus used both for default priority and for Best Effort, and
1714 * Background is associated with a priority value of 1. This means
1715 * that the value 1 effectively communicates a lower priority than 0."
1717 * In the table below, Priority Code Point (PCP) 0 is assigned
1718 * to a higher priority thread than PCP 1 wherever possible.
1719 * The table maps which thread the PCP traffic needs to be
1720 * sent to for a given number of threads (RX channels). Upper threads
1721 * have higher priority.
1722 * e.g. if number of threads is 8 then user priority 0 will map to
1723 * pri_thread_map[8-1][0] i.e. thread 1
1726 int pri_thread_map
[8][8] = { /* BK,BE,EE,CA,VI,VO,IC,NC */
1727 { 0, 0, 0, 0, 0, 0, 0, 0, },
1728 { 0, 0, 0, 0, 1, 1, 1, 1, },
1729 { 0, 0, 0, 0, 1, 1, 2, 2, },
1730 { 0, 0, 1, 1, 2, 2, 3, 3, },
1731 { 0, 0, 1, 1, 2, 2, 3, 4, },
1732 { 1, 0, 2, 2, 3, 3, 4, 5, },
1733 { 1, 0, 2, 3, 4, 4, 5, 6, },
1734 { 1, 0, 2, 3, 4, 5, 6, 7 } };
1736 cpsw_ale_policer_reset(ale
);
1738 /* use first 8 classifiers to map 8 (DSCP/PCP) priorities to channels */
1739 for (pri
= 0; pri
< 8; pri
++) {
1742 /* Classifier 'idx' match on priority 'pri' */
1743 cpsw_ale_policer_read_idx(ale
, idx
);
1744 regmap_field_write(ale
->fields
[POL_PRI_VAL
], pri
);
1745 regmap_field_write(ale
->fields
[POL_PRI_MEN
], 1);
1746 cpsw_ale_policer_write_idx(ale
, idx
);
1748 /* Map Classifier 'idx' to thread provided by the map */
1749 cpsw_ale_policer_thread_idx_enable(ale
, idx
,
1750 pri_thread_map
[num_rx_ch
- 1][pri
],