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/seq_file.h>
14 #include <linux/slab.h>
15 #include <linux/err.h>
17 #include <linux/stat.h>
18 #include <linux/sysfs.h>
19 #include <linux/etherdevice.h>
23 #define BITMASK(bits) (BIT(bits) - 1)
25 #define ALE_VERSION_MAJOR(rev, mask) (((rev) >> 8) & (mask))
26 #define ALE_VERSION_MINOR(rev) (rev & 0xff)
27 #define ALE_VERSION_1R3 0x0103
28 #define ALE_VERSION_1R4 0x0104
31 #define ALE_IDVER 0x00
32 #define ALE_STATUS 0x04
33 #define ALE_CONTROL 0x08
34 #define ALE_PRESCALE 0x10
35 #define ALE_AGING_TIMER 0x14
36 #define ALE_UNKNOWNVLAN 0x18
37 #define ALE_TABLE_CONTROL 0x20
38 #define ALE_TABLE 0x34
39 #define ALE_PORTCTL 0x40
41 /* ALE NetCP NU switch specific Registers */
42 #define ALE_UNKNOWNVLAN_MEMBER 0x90
43 #define ALE_UNKNOWNVLAN_UNREG_MCAST_FLOOD 0x94
44 #define ALE_UNKNOWNVLAN_REG_MCAST_FLOOD 0x98
45 #define ALE_UNKNOWNVLAN_FORCE_UNTAG_EGRESS 0x9C
46 #define ALE_VLAN_MASK_MUX(reg) (0xc0 + (0x4 * (reg)))
48 #define AM65_CPSW_ALE_THREAD_DEF_REG 0x134
51 #define ALE_AGING_TIMER_MASK GENMASK(23, 0)
54 * struct ale_entry_fld - The ALE tbl entry field description
55 * @start_bit: field start bit
56 * @num_bits: field bit length
59 struct ale_entry_fld {
66 CPSW_ALE_F_STATUS_REG = BIT(0), /* Status register present */
67 CPSW_ALE_F_HW_AUTOAGING = BIT(1), /* HW auto aging */
73 * struct ale_dev_id - The ALE version/SoC specific configuration
74 * @dev_id: ALE version/SoC id
75 * @features: features supported by ALE
76 * @tbl_entries: number of ALE entries
77 * @major_ver_mask: mask of ALE Major Version Value in ALE_IDVER reg.
78 * @nu_switch_ale: NU Switch ALE
79 * @vlan_entry_tbl: ALE vlan entry fields description tbl
81 struct cpsw_ale_dev_id {
87 const struct ale_entry_fld *vlan_entry_tbl;
90 #define ALE_TABLE_WRITE BIT(31)
92 #define ALE_TYPE_FREE 0
93 #define ALE_TYPE_ADDR 1
94 #define ALE_TYPE_VLAN 2
95 #define ALE_TYPE_VLAN_ADDR 3
97 #define ALE_UCAST_PERSISTANT 0
98 #define ALE_UCAST_UNTOUCHED 1
99 #define ALE_UCAST_OUI 2
100 #define ALE_UCAST_TOUCHED 3
102 #define ALE_TABLE_SIZE_MULTIPLIER 1024
103 #define ALE_STATUS_SIZE_MASK 0x1f
105 static inline int cpsw_ale_get_field(u32 *ale_entry, u32 start, u32 bits)
111 idx = 2 - idx; /* flip */
112 return (ale_entry[idx] >> start) & BITMASK(bits);
115 static inline void cpsw_ale_set_field(u32 *ale_entry, u32 start, u32 bits,
120 value &= BITMASK(bits);
123 idx = 2 - idx; /* flip */
124 ale_entry[idx] &= ~(BITMASK(bits) << start);
125 ale_entry[idx] |= (value << start);
128 #define DEFINE_ALE_FIELD(name, start, bits) \
129 static inline int cpsw_ale_get_##name(u32 *ale_entry) \
131 return cpsw_ale_get_field(ale_entry, start, bits); \
133 static inline void cpsw_ale_set_##name(u32 *ale_entry, u32 value) \
135 cpsw_ale_set_field(ale_entry, start, bits, value); \
138 #define DEFINE_ALE_FIELD1(name, start) \
139 static inline int cpsw_ale_get_##name(u32 *ale_entry, u32 bits) \
141 return cpsw_ale_get_field(ale_entry, start, bits); \
143 static inline void cpsw_ale_set_##name(u32 *ale_entry, u32 value, \
146 cpsw_ale_set_field(ale_entry, start, bits, value); \
150 ALE_ENT_VID_MEMBER_LIST = 0,
151 ALE_ENT_VID_UNREG_MCAST_MSK,
152 ALE_ENT_VID_REG_MCAST_MSK,
153 ALE_ENT_VID_FORCE_UNTAGGED_MSK,
154 ALE_ENT_VID_UNREG_MCAST_IDX,
155 ALE_ENT_VID_REG_MCAST_IDX,
159 #define ALE_FLD_ALLOWED BIT(0)
160 #define ALE_FLD_SIZE_PORT_MASK_BITS BIT(1)
161 #define ALE_FLD_SIZE_PORT_NUM_BITS BIT(2)
163 #define ALE_ENTRY_FLD(id, start, bits) \
165 .start_bit = start, \
167 .flags = ALE_FLD_ALLOWED, \
170 #define ALE_ENTRY_FLD_DYN_MSK_SIZE(id, start) \
172 .start_bit = start, \
174 .flags = ALE_FLD_ALLOWED | \
175 ALE_FLD_SIZE_PORT_MASK_BITS, \
178 /* dm814x, am3/am4/am5, k2hk */
179 static const struct ale_entry_fld vlan_entry_cpsw[ALE_ENT_VID_LAST] = {
180 ALE_ENTRY_FLD(ALE_ENT_VID_MEMBER_LIST, 0, 3),
181 ALE_ENTRY_FLD(ALE_ENT_VID_UNREG_MCAST_MSK, 8, 3),
182 ALE_ENTRY_FLD(ALE_ENT_VID_REG_MCAST_MSK, 16, 3),
183 ALE_ENTRY_FLD(ALE_ENT_VID_FORCE_UNTAGGED_MSK, 24, 3),
186 /* k2e/k2l, k3 am65/j721e cpsw2g */
187 static const struct ale_entry_fld vlan_entry_nu[ALE_ENT_VID_LAST] = {
188 ALE_ENTRY_FLD_DYN_MSK_SIZE(ALE_ENT_VID_MEMBER_LIST, 0),
189 ALE_ENTRY_FLD(ALE_ENT_VID_UNREG_MCAST_IDX, 20, 3),
190 ALE_ENTRY_FLD_DYN_MSK_SIZE(ALE_ENT_VID_FORCE_UNTAGGED_MSK, 24),
191 ALE_ENTRY_FLD(ALE_ENT_VID_REG_MCAST_IDX, 44, 3),
194 DEFINE_ALE_FIELD(entry_type, 60, 2)
195 DEFINE_ALE_FIELD(vlan_id, 48, 12)
196 DEFINE_ALE_FIELD(mcast_state, 62, 2)
197 DEFINE_ALE_FIELD1(port_mask, 66)
198 DEFINE_ALE_FIELD(super, 65, 1)
199 DEFINE_ALE_FIELD(ucast_type, 62, 2)
200 DEFINE_ALE_FIELD1(port_num, 66)
201 DEFINE_ALE_FIELD(blocked, 65, 1)
202 DEFINE_ALE_FIELD(secure, 64, 1)
203 DEFINE_ALE_FIELD(mcast, 40, 1)
205 #define NU_VLAN_UNREG_MCAST_IDX 1
207 static int cpsw_ale_entry_get_fld(struct cpsw_ale *ale,
209 const struct ale_entry_fld *entry_tbl,
212 const struct ale_entry_fld *entry_fld;
215 if (!ale || !ale_entry)
218 entry_fld = &entry_tbl[fld_id];
219 if (!(entry_fld->flags & ALE_FLD_ALLOWED)) {
220 dev_err(ale->params.dev, "get: wrong ale fld id %d\n", fld_id);
224 bits = entry_fld->num_bits;
225 if (entry_fld->flags & ALE_FLD_SIZE_PORT_MASK_BITS)
226 bits = ale->port_mask_bits;
228 return cpsw_ale_get_field(ale_entry, entry_fld->start_bit, bits);
231 static void cpsw_ale_entry_set_fld(struct cpsw_ale *ale,
233 const struct ale_entry_fld *entry_tbl,
237 const struct ale_entry_fld *entry_fld;
240 if (!ale || !ale_entry)
243 entry_fld = &entry_tbl[fld_id];
244 if (!(entry_fld->flags & ALE_FLD_ALLOWED)) {
245 dev_err(ale->params.dev, "set: wrong ale fld id %d\n", fld_id);
249 bits = entry_fld->num_bits;
250 if (entry_fld->flags & ALE_FLD_SIZE_PORT_MASK_BITS)
251 bits = ale->port_mask_bits;
253 cpsw_ale_set_field(ale_entry, entry_fld->start_bit, bits, value);
256 static int cpsw_ale_vlan_get_fld(struct cpsw_ale *ale,
260 return cpsw_ale_entry_get_fld(ale, ale_entry,
261 ale->vlan_entry_tbl, fld_id);
264 static void cpsw_ale_vlan_set_fld(struct cpsw_ale *ale,
269 cpsw_ale_entry_set_fld(ale, ale_entry,
270 ale->vlan_entry_tbl, fld_id, value);
273 /* The MAC address field in the ALE entry cannot be macroized as above */
274 static inline void cpsw_ale_get_addr(u32 *ale_entry, u8 *addr)
278 for (i = 0; i < 6; i++)
279 addr[i] = cpsw_ale_get_field(ale_entry, 40 - 8*i, 8);
282 static inline void cpsw_ale_set_addr(u32 *ale_entry, const u8 *addr)
286 for (i = 0; i < 6; i++)
287 cpsw_ale_set_field(ale_entry, 40 - 8*i, 8, addr[i]);
290 static int cpsw_ale_read(struct cpsw_ale *ale, int idx, u32 *ale_entry)
294 WARN_ON(idx > ale->params.ale_entries);
296 writel_relaxed(idx, ale->params.ale_regs + ALE_TABLE_CONTROL);
298 for (i = 0; i < ALE_ENTRY_WORDS; i++)
299 ale_entry[i] = readl_relaxed(ale->params.ale_regs +
305 static int cpsw_ale_write(struct cpsw_ale *ale, int idx, u32 *ale_entry)
309 WARN_ON(idx > ale->params.ale_entries);
311 for (i = 0; i < ALE_ENTRY_WORDS; i++)
312 writel_relaxed(ale_entry[i], ale->params.ale_regs +
315 writel_relaxed(idx | ALE_TABLE_WRITE, ale->params.ale_regs +
321 static int cpsw_ale_match_addr(struct cpsw_ale *ale, const u8 *addr, u16 vid)
323 u32 ale_entry[ALE_ENTRY_WORDS];
326 for (idx = 0; idx < ale->params.ale_entries; idx++) {
329 cpsw_ale_read(ale, idx, ale_entry);
330 type = cpsw_ale_get_entry_type(ale_entry);
331 if (type != ALE_TYPE_ADDR && type != ALE_TYPE_VLAN_ADDR)
333 if (cpsw_ale_get_vlan_id(ale_entry) != vid)
335 cpsw_ale_get_addr(ale_entry, entry_addr);
336 if (ether_addr_equal(entry_addr, addr))
342 static int cpsw_ale_match_vlan(struct cpsw_ale *ale, u16 vid)
344 u32 ale_entry[ALE_ENTRY_WORDS];
347 for (idx = 0; idx < ale->params.ale_entries; idx++) {
348 cpsw_ale_read(ale, idx, ale_entry);
349 type = cpsw_ale_get_entry_type(ale_entry);
350 if (type != ALE_TYPE_VLAN)
352 if (cpsw_ale_get_vlan_id(ale_entry) == vid)
358 static int cpsw_ale_match_free(struct cpsw_ale *ale)
360 u32 ale_entry[ALE_ENTRY_WORDS];
363 for (idx = 0; idx < ale->params.ale_entries; idx++) {
364 cpsw_ale_read(ale, idx, ale_entry);
365 type = cpsw_ale_get_entry_type(ale_entry);
366 if (type == ALE_TYPE_FREE)
372 static int cpsw_ale_find_ageable(struct cpsw_ale *ale)
374 u32 ale_entry[ALE_ENTRY_WORDS];
377 for (idx = 0; idx < ale->params.ale_entries; idx++) {
378 cpsw_ale_read(ale, idx, ale_entry);
379 type = cpsw_ale_get_entry_type(ale_entry);
380 if (type != ALE_TYPE_ADDR && type != ALE_TYPE_VLAN_ADDR)
382 if (cpsw_ale_get_mcast(ale_entry))
384 type = cpsw_ale_get_ucast_type(ale_entry);
385 if (type != ALE_UCAST_PERSISTANT &&
386 type != ALE_UCAST_OUI)
392 static void cpsw_ale_flush_mcast(struct cpsw_ale *ale, u32 *ale_entry,
397 mask = cpsw_ale_get_port_mask(ale_entry,
398 ale->port_mask_bits);
399 if ((mask & port_mask) == 0)
400 return; /* ports dont intersect, not interested */
403 /* free if only remaining port is host port */
405 cpsw_ale_set_port_mask(ale_entry, mask,
406 ale->port_mask_bits);
408 cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE);
411 int cpsw_ale_flush_multicast(struct cpsw_ale *ale, int port_mask, int vid)
413 u32 ale_entry[ALE_ENTRY_WORDS];
416 for (idx = 0; idx < ale->params.ale_entries; idx++) {
417 cpsw_ale_read(ale, idx, ale_entry);
418 ret = cpsw_ale_get_entry_type(ale_entry);
419 if (ret != ALE_TYPE_ADDR && ret != ALE_TYPE_VLAN_ADDR)
422 /* if vid passed is -1 then remove all multicast entry from
423 * the table irrespective of vlan id, if a valid vlan id is
424 * passed then remove only multicast added to that vlan id.
425 * if vlan id doesn't match then move on to next entry.
427 if (vid != -1 && cpsw_ale_get_vlan_id(ale_entry) != vid)
430 if (cpsw_ale_get_mcast(ale_entry)) {
433 if (cpsw_ale_get_super(ale_entry))
436 cpsw_ale_get_addr(ale_entry, addr);
437 if (!is_broadcast_ether_addr(addr))
438 cpsw_ale_flush_mcast(ale, ale_entry, port_mask);
441 cpsw_ale_write(ale, idx, ale_entry);
446 static inline void cpsw_ale_set_vlan_entry_type(u32 *ale_entry,
449 if (flags & ALE_VLAN) {
450 cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_VLAN_ADDR);
451 cpsw_ale_set_vlan_id(ale_entry, vid);
453 cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_ADDR);
457 int cpsw_ale_add_ucast(struct cpsw_ale *ale, const u8 *addr, int port,
460 u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0};
463 cpsw_ale_set_vlan_entry_type(ale_entry, flags, vid);
465 cpsw_ale_set_addr(ale_entry, addr);
466 cpsw_ale_set_ucast_type(ale_entry, ALE_UCAST_PERSISTANT);
467 cpsw_ale_set_secure(ale_entry, (flags & ALE_SECURE) ? 1 : 0);
468 cpsw_ale_set_blocked(ale_entry, (flags & ALE_BLOCKED) ? 1 : 0);
469 cpsw_ale_set_port_num(ale_entry, port, ale->port_num_bits);
471 idx = cpsw_ale_match_addr(ale, addr, (flags & ALE_VLAN) ? vid : 0);
473 idx = cpsw_ale_match_free(ale);
475 idx = cpsw_ale_find_ageable(ale);
479 cpsw_ale_write(ale, idx, ale_entry);
483 int cpsw_ale_del_ucast(struct cpsw_ale *ale, const u8 *addr, int port,
486 u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0};
489 idx = cpsw_ale_match_addr(ale, addr, (flags & ALE_VLAN) ? vid : 0);
493 cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE);
494 cpsw_ale_write(ale, idx, ale_entry);
498 int cpsw_ale_add_mcast(struct cpsw_ale *ale, const u8 *addr, int port_mask,
499 int flags, u16 vid, int mcast_state)
501 u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0};
504 idx = cpsw_ale_match_addr(ale, addr, (flags & ALE_VLAN) ? vid : 0);
506 cpsw_ale_read(ale, idx, ale_entry);
508 cpsw_ale_set_vlan_entry_type(ale_entry, flags, vid);
510 cpsw_ale_set_addr(ale_entry, addr);
511 cpsw_ale_set_super(ale_entry, (flags & ALE_SUPER) ? 1 : 0);
512 cpsw_ale_set_mcast_state(ale_entry, mcast_state);
514 mask = cpsw_ale_get_port_mask(ale_entry,
515 ale->port_mask_bits);
517 cpsw_ale_set_port_mask(ale_entry, port_mask,
518 ale->port_mask_bits);
521 idx = cpsw_ale_match_free(ale);
523 idx = cpsw_ale_find_ageable(ale);
527 cpsw_ale_write(ale, idx, ale_entry);
531 int cpsw_ale_del_mcast(struct cpsw_ale *ale, const u8 *addr, int port_mask,
534 u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0};
535 int mcast_members = 0;
538 idx = cpsw_ale_match_addr(ale, addr, (flags & ALE_VLAN) ? vid : 0);
542 cpsw_ale_read(ale, idx, ale_entry);
545 mcast_members = cpsw_ale_get_port_mask(ale_entry,
546 ale->port_mask_bits);
547 mcast_members &= ~port_mask;
551 cpsw_ale_set_port_mask(ale_entry, mcast_members,
552 ale->port_mask_bits);
554 cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE);
556 cpsw_ale_write(ale, idx, ale_entry);
560 /* ALE NetCP NU switch specific vlan functions */
561 static void cpsw_ale_set_vlan_mcast(struct cpsw_ale *ale, u32 *ale_entry,
562 int reg_mcast, int unreg_mcast)
566 /* Set VLAN registered multicast flood mask */
567 idx = cpsw_ale_vlan_get_fld(ale, ale_entry,
568 ALE_ENT_VID_REG_MCAST_IDX);
569 writel(reg_mcast, ale->params.ale_regs + ALE_VLAN_MASK_MUX(idx));
571 /* Set VLAN unregistered multicast flood mask */
572 idx = cpsw_ale_vlan_get_fld(ale, ale_entry,
573 ALE_ENT_VID_UNREG_MCAST_IDX);
574 writel(unreg_mcast, ale->params.ale_regs + ALE_VLAN_MASK_MUX(idx));
577 static void cpsw_ale_set_vlan_untag(struct cpsw_ale *ale, u32 *ale_entry,
578 u16 vid, int untag_mask)
580 cpsw_ale_vlan_set_fld(ale, ale_entry,
581 ALE_ENT_VID_FORCE_UNTAGGED_MSK,
583 if (untag_mask & ALE_PORT_HOST)
584 bitmap_set(ale->p0_untag_vid_mask, vid, 1);
586 bitmap_clear(ale->p0_untag_vid_mask, vid, 1);
589 int cpsw_ale_add_vlan(struct cpsw_ale *ale, u16 vid, int port_mask, int untag,
590 int reg_mcast, int unreg_mcast)
592 u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0};
595 idx = cpsw_ale_match_vlan(ale, vid);
597 cpsw_ale_read(ale, idx, ale_entry);
599 cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_VLAN);
600 cpsw_ale_set_vlan_id(ale_entry, vid);
601 cpsw_ale_set_vlan_untag(ale, ale_entry, vid, untag);
603 if (!ale->params.nu_switch_ale) {
604 cpsw_ale_vlan_set_fld(ale, ale_entry,
605 ALE_ENT_VID_REG_MCAST_MSK, reg_mcast);
606 cpsw_ale_vlan_set_fld(ale, ale_entry,
607 ALE_ENT_VID_UNREG_MCAST_MSK, unreg_mcast);
609 cpsw_ale_vlan_set_fld(ale, ale_entry,
610 ALE_ENT_VID_UNREG_MCAST_IDX,
611 NU_VLAN_UNREG_MCAST_IDX);
612 cpsw_ale_set_vlan_mcast(ale, ale_entry, reg_mcast, unreg_mcast);
615 cpsw_ale_vlan_set_fld(ale, ale_entry,
616 ALE_ENT_VID_MEMBER_LIST, port_mask);
619 idx = cpsw_ale_match_free(ale);
621 idx = cpsw_ale_find_ageable(ale);
625 cpsw_ale_write(ale, idx, ale_entry);
629 static void cpsw_ale_del_vlan_modify(struct cpsw_ale *ale, u32 *ale_entry,
630 u16 vid, int port_mask)
632 int reg_mcast, unreg_mcast;
635 members = cpsw_ale_vlan_get_fld(ale, ale_entry,
636 ALE_ENT_VID_MEMBER_LIST);
637 members &= ~port_mask;
639 cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE);
643 untag = cpsw_ale_vlan_get_fld(ale, ale_entry,
644 ALE_ENT_VID_FORCE_UNTAGGED_MSK);
645 reg_mcast = cpsw_ale_vlan_get_fld(ale, ale_entry,
646 ALE_ENT_VID_REG_MCAST_MSK);
647 unreg_mcast = cpsw_ale_vlan_get_fld(ale, ale_entry,
648 ALE_ENT_VID_UNREG_MCAST_MSK);
650 reg_mcast &= members;
651 unreg_mcast &= members;
653 cpsw_ale_set_vlan_untag(ale, ale_entry, vid, untag);
655 if (!ale->params.nu_switch_ale) {
656 cpsw_ale_vlan_set_fld(ale, ale_entry,
657 ALE_ENT_VID_REG_MCAST_MSK, reg_mcast);
658 cpsw_ale_vlan_set_fld(ale, ale_entry,
659 ALE_ENT_VID_UNREG_MCAST_MSK, unreg_mcast);
661 cpsw_ale_set_vlan_mcast(ale, ale_entry, reg_mcast,
664 cpsw_ale_vlan_set_fld(ale, ale_entry,
665 ALE_ENT_VID_MEMBER_LIST, members);
668 int cpsw_ale_del_vlan(struct cpsw_ale *ale, u16 vid, int port_mask)
670 u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0};
673 idx = cpsw_ale_match_vlan(ale, vid);
677 cpsw_ale_read(ale, idx, ale_entry);
680 cpsw_ale_del_vlan_modify(ale, ale_entry, vid, port_mask);
682 cpsw_ale_set_vlan_untag(ale, ale_entry, vid, 0);
683 cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE);
686 cpsw_ale_write(ale, idx, ale_entry);
691 int cpsw_ale_vlan_add_modify(struct cpsw_ale *ale, u16 vid, int port_mask,
692 int untag_mask, int reg_mask, int unreg_mask)
694 u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0};
695 int reg_mcast_members, unreg_mcast_members;
696 int vlan_members, untag_members;
699 idx = cpsw_ale_match_vlan(ale, vid);
701 cpsw_ale_read(ale, idx, ale_entry);
703 vlan_members = cpsw_ale_vlan_get_fld(ale, ale_entry,
704 ALE_ENT_VID_MEMBER_LIST);
705 reg_mcast_members = cpsw_ale_vlan_get_fld(ale, ale_entry,
706 ALE_ENT_VID_REG_MCAST_MSK);
707 unreg_mcast_members =
708 cpsw_ale_vlan_get_fld(ale, ale_entry,
709 ALE_ENT_VID_UNREG_MCAST_MSK);
710 untag_members = cpsw_ale_vlan_get_fld(ale, ale_entry,
711 ALE_ENT_VID_FORCE_UNTAGGED_MSK);
713 vlan_members |= port_mask;
714 untag_members = (untag_members & ~port_mask) | untag_mask;
715 reg_mcast_members = (reg_mcast_members & ~port_mask) | reg_mask;
716 unreg_mcast_members = (unreg_mcast_members & ~port_mask) | unreg_mask;
718 ret = cpsw_ale_add_vlan(ale, vid, vlan_members, untag_members,
719 reg_mcast_members, unreg_mcast_members);
721 dev_err(ale->params.dev, "Unable to add vlan\n");
724 dev_dbg(ale->params.dev, "port mask 0x%x untag 0x%x\n", vlan_members,
730 void cpsw_ale_set_unreg_mcast(struct cpsw_ale *ale, int unreg_mcast_mask,
733 u32 ale_entry[ALE_ENTRY_WORDS];
734 int unreg_members = 0;
737 for (idx = 0; idx < ale->params.ale_entries; idx++) {
738 cpsw_ale_read(ale, idx, ale_entry);
739 type = cpsw_ale_get_entry_type(ale_entry);
740 if (type != ALE_TYPE_VLAN)
744 cpsw_ale_vlan_get_fld(ale, ale_entry,
745 ALE_ENT_VID_UNREG_MCAST_MSK);
747 unreg_members |= unreg_mcast_mask;
749 unreg_members &= ~unreg_mcast_mask;
750 cpsw_ale_vlan_set_fld(ale, ale_entry,
751 ALE_ENT_VID_UNREG_MCAST_MSK,
753 cpsw_ale_write(ale, idx, ale_entry);
757 static void cpsw_ale_vlan_set_unreg_mcast(struct cpsw_ale *ale, u32 *ale_entry,
762 unreg_mcast = cpsw_ale_vlan_get_fld(ale, ale_entry,
763 ALE_ENT_VID_UNREG_MCAST_MSK);
765 unreg_mcast |= ALE_PORT_HOST;
767 unreg_mcast &= ~ALE_PORT_HOST;
769 cpsw_ale_vlan_set_fld(ale, ale_entry,
770 ALE_ENT_VID_UNREG_MCAST_MSK, unreg_mcast);
774 cpsw_ale_vlan_set_unreg_mcast_idx(struct cpsw_ale *ale, u32 *ale_entry,
780 idx = cpsw_ale_vlan_get_fld(ale, ale_entry,
781 ALE_ENT_VID_UNREG_MCAST_IDX);
783 unreg_mcast = readl(ale->params.ale_regs + ALE_VLAN_MASK_MUX(idx));
786 unreg_mcast |= ALE_PORT_HOST;
788 unreg_mcast &= ~ALE_PORT_HOST;
790 writel(unreg_mcast, ale->params.ale_regs + ALE_VLAN_MASK_MUX(idx));
793 void cpsw_ale_set_allmulti(struct cpsw_ale *ale, int allmulti, int port)
795 u32 ale_entry[ALE_ENTRY_WORDS];
798 for (idx = 0; idx < ale->params.ale_entries; idx++) {
801 cpsw_ale_read(ale, idx, ale_entry);
802 type = cpsw_ale_get_entry_type(ale_entry);
803 if (type != ALE_TYPE_VLAN)
806 vlan_members = cpsw_ale_vlan_get_fld(ale, ale_entry,
807 ALE_ENT_VID_MEMBER_LIST);
809 if (port != -1 && !(vlan_members & BIT(port)))
812 if (!ale->params.nu_switch_ale)
813 cpsw_ale_vlan_set_unreg_mcast(ale, ale_entry, allmulti);
815 cpsw_ale_vlan_set_unreg_mcast_idx(ale, ale_entry,
818 cpsw_ale_write(ale, idx, ale_entry);
822 struct ale_control_info {
824 int offset, port_offset;
825 int shift, port_shift;
829 static struct ale_control_info ale_controls[ALE_NUM_CONTROLS] = {
832 .offset = ALE_CONTROL,
840 .offset = ALE_CONTROL,
848 .offset = ALE_CONTROL,
854 [ALE_P0_UNI_FLOOD] = {
855 .name = "port0_unicast_flood",
856 .offset = ALE_CONTROL,
862 [ALE_VLAN_NOLEARN] = {
863 .name = "vlan_nolearn",
864 .offset = ALE_CONTROL,
870 [ALE_NO_PORT_VLAN] = {
871 .name = "no_port_vlan",
872 .offset = ALE_CONTROL,
880 .offset = ALE_CONTROL,
888 .offset = ALE_CONTROL,
894 [ALE_RATE_LIMIT_TX] = {
895 .name = "rate_limit_tx",
896 .offset = ALE_CONTROL,
903 .name = "vlan_aware",
904 .offset = ALE_CONTROL,
910 [ALE_AUTH_ENABLE] = {
911 .name = "auth_enable",
912 .offset = ALE_CONTROL,
919 .name = "rate_limit",
920 .offset = ALE_CONTROL,
927 .name = "port_state",
928 .offset = ALE_PORTCTL,
934 [ALE_PORT_DROP_UNTAGGED] = {
935 .name = "drop_untagged",
936 .offset = ALE_PORTCTL,
942 [ALE_PORT_DROP_UNKNOWN_VLAN] = {
943 .name = "drop_unknown",
944 .offset = ALE_PORTCTL,
950 [ALE_PORT_NOLEARN] = {
952 .offset = ALE_PORTCTL,
958 [ALE_PORT_NO_SA_UPDATE] = {
959 .name = "no_source_update",
960 .offset = ALE_PORTCTL,
966 [ALE_PORT_MACONLY] = {
967 .name = "mac_only_port_mode",
968 .offset = ALE_PORTCTL,
974 [ALE_PORT_MACONLY_CAF] = {
975 .name = "mac_only_port_caf",
976 .offset = ALE_PORTCTL,
982 [ALE_PORT_MCAST_LIMIT] = {
983 .name = "mcast_limit",
984 .offset = ALE_PORTCTL,
990 [ALE_PORT_BCAST_LIMIT] = {
991 .name = "bcast_limit",
992 .offset = ALE_PORTCTL,
998 [ALE_PORT_UNKNOWN_VLAN_MEMBER] = {
999 .name = "unknown_vlan_member",
1000 .offset = ALE_UNKNOWNVLAN,
1006 [ALE_PORT_UNKNOWN_MCAST_FLOOD] = {
1007 .name = "unknown_mcast_flood",
1008 .offset = ALE_UNKNOWNVLAN,
1014 [ALE_PORT_UNKNOWN_REG_MCAST_FLOOD] = {
1015 .name = "unknown_reg_flood",
1016 .offset = ALE_UNKNOWNVLAN,
1022 [ALE_PORT_UNTAGGED_EGRESS] = {
1023 .name = "untagged_egress",
1024 .offset = ALE_UNKNOWNVLAN,
1030 [ALE_DEFAULT_THREAD_ID] = {
1031 .name = "default_thread_id",
1032 .offset = AM65_CPSW_ALE_THREAD_DEF_REG,
1038 [ALE_DEFAULT_THREAD_ENABLE] = {
1039 .name = "default_thread_id_enable",
1040 .offset = AM65_CPSW_ALE_THREAD_DEF_REG,
1048 int cpsw_ale_control_set(struct cpsw_ale *ale, int port, int control,
1051 const struct ale_control_info *info;
1055 if (control < 0 || control >= ARRAY_SIZE(ale_controls))
1058 info = &ale_controls[control];
1059 if (info->port_offset == 0 && info->port_shift == 0)
1060 port = 0; /* global, port is a dont care */
1062 if (port < 0 || port >= ale->params.ale_ports)
1065 mask = BITMASK(info->bits);
1069 offset = info->offset + (port * info->port_offset);
1070 shift = info->shift + (port * info->port_shift);
1072 tmp = readl_relaxed(ale->params.ale_regs + offset);
1073 tmp = (tmp & ~(mask << shift)) | (value << shift);
1074 writel_relaxed(tmp, ale->params.ale_regs + offset);
1079 int cpsw_ale_control_get(struct cpsw_ale *ale, int port, int control)
1081 const struct ale_control_info *info;
1085 if (control < 0 || control >= ARRAY_SIZE(ale_controls))
1088 info = &ale_controls[control];
1089 if (info->port_offset == 0 && info->port_shift == 0)
1090 port = 0; /* global, port is a dont care */
1092 if (port < 0 || port >= ale->params.ale_ports)
1095 offset = info->offset + (port * info->port_offset);
1096 shift = info->shift + (port * info->port_shift);
1098 tmp = readl_relaxed(ale->params.ale_regs + offset) >> shift;
1099 return tmp & BITMASK(info->bits);
1102 static void cpsw_ale_timer(struct timer_list *t)
1104 struct cpsw_ale *ale = from_timer(ale, t, timer);
1106 cpsw_ale_control_set(ale, 0, ALE_AGEOUT, 1);
1109 ale->timer.expires = jiffies + ale->ageout;
1110 add_timer(&ale->timer);
1114 static void cpsw_ale_hw_aging_timer_start(struct cpsw_ale *ale)
1118 aging_timer = ale->params.bus_freq / 1000000;
1119 aging_timer *= ale->params.ale_ageout;
1121 if (aging_timer & ~ALE_AGING_TIMER_MASK) {
1122 aging_timer = ALE_AGING_TIMER_MASK;
1123 dev_warn(ale->params.dev,
1124 "ALE aging timer overflow, set to max\n");
1127 writel(aging_timer, ale->params.ale_regs + ALE_AGING_TIMER);
1130 static void cpsw_ale_hw_aging_timer_stop(struct cpsw_ale *ale)
1132 writel(0, ale->params.ale_regs + ALE_AGING_TIMER);
1135 static void cpsw_ale_aging_start(struct cpsw_ale *ale)
1137 if (!ale->params.ale_ageout)
1140 if (ale->features & CPSW_ALE_F_HW_AUTOAGING) {
1141 cpsw_ale_hw_aging_timer_start(ale);
1145 timer_setup(&ale->timer, cpsw_ale_timer, 0);
1146 ale->timer.expires = jiffies + ale->ageout;
1147 add_timer(&ale->timer);
1150 static void cpsw_ale_aging_stop(struct cpsw_ale *ale)
1152 if (!ale->params.ale_ageout)
1155 if (ale->features & CPSW_ALE_F_HW_AUTOAGING) {
1156 cpsw_ale_hw_aging_timer_stop(ale);
1160 del_timer_sync(&ale->timer);
1163 void cpsw_ale_start(struct cpsw_ale *ale)
1165 cpsw_ale_control_set(ale, 0, ALE_ENABLE, 1);
1166 cpsw_ale_control_set(ale, 0, ALE_CLEAR, 1);
1168 cpsw_ale_aging_start(ale);
1171 void cpsw_ale_stop(struct cpsw_ale *ale)
1173 cpsw_ale_aging_stop(ale);
1174 cpsw_ale_control_set(ale, 0, ALE_CLEAR, 1);
1175 cpsw_ale_control_set(ale, 0, ALE_ENABLE, 0);
1178 static const struct cpsw_ale_dev_id cpsw_ale_id_match[] = {
1180 /* am3/4/5, dra7. dm814x, 66ak2hk-gbe */
1182 .tbl_entries = 1024,
1183 .major_ver_mask = 0xff,
1184 .vlan_entry_tbl = vlan_entry_cpsw,
1188 .dev_id = "66ak2h-xgbe",
1189 .tbl_entries = 2048,
1190 .major_ver_mask = 0xff,
1191 .vlan_entry_tbl = vlan_entry_cpsw,
1194 .dev_id = "66ak2el",
1195 .features = CPSW_ALE_F_STATUS_REG,
1196 .major_ver_mask = 0x7,
1197 .nu_switch_ale = true,
1198 .vlan_entry_tbl = vlan_entry_nu,
1202 .features = CPSW_ALE_F_STATUS_REG,
1204 .major_ver_mask = 0x7,
1205 .nu_switch_ale = true,
1206 .vlan_entry_tbl = vlan_entry_nu,
1209 .dev_id = "am65x-cpsw2g",
1210 .features = CPSW_ALE_F_STATUS_REG | CPSW_ALE_F_HW_AUTOAGING,
1212 .major_ver_mask = 0x7,
1213 .nu_switch_ale = true,
1214 .vlan_entry_tbl = vlan_entry_nu,
1220 cpsw_ale_dev_id *cpsw_ale_match_id(const struct cpsw_ale_dev_id *id,
1226 while (id->dev_id) {
1227 if (strcmp(dev_id, id->dev_id) == 0)
1234 struct cpsw_ale *cpsw_ale_create(struct cpsw_ale_params *params)
1236 const struct cpsw_ale_dev_id *ale_dev_id;
1237 struct cpsw_ale *ale;
1238 u32 rev, ale_entries;
1240 ale_dev_id = cpsw_ale_match_id(cpsw_ale_id_match, params->dev_id);
1242 return ERR_PTR(-EINVAL);
1244 params->ale_entries = ale_dev_id->tbl_entries;
1245 params->major_ver_mask = ale_dev_id->major_ver_mask;
1246 params->nu_switch_ale = ale_dev_id->nu_switch_ale;
1248 ale = devm_kzalloc(params->dev, sizeof(*ale), GFP_KERNEL);
1250 return ERR_PTR(-ENOMEM);
1252 ale->p0_untag_vid_mask =
1253 devm_kmalloc_array(params->dev, BITS_TO_LONGS(VLAN_N_VID),
1254 sizeof(unsigned long),
1256 if (!ale->p0_untag_vid_mask)
1257 return ERR_PTR(-ENOMEM);
1259 ale->params = *params;
1260 ale->ageout = ale->params.ale_ageout * HZ;
1261 ale->features = ale_dev_id->features;
1262 ale->vlan_entry_tbl = ale_dev_id->vlan_entry_tbl;
1264 rev = readl_relaxed(ale->params.ale_regs + ALE_IDVER);
1266 (ALE_VERSION_MAJOR(rev, ale->params.major_ver_mask) << 8) |
1267 ALE_VERSION_MINOR(rev);
1268 dev_info(ale->params.dev, "initialized cpsw ale version %d.%d\n",
1269 ALE_VERSION_MAJOR(rev, ale->params.major_ver_mask),
1270 ALE_VERSION_MINOR(rev));
1272 if (ale->features & CPSW_ALE_F_STATUS_REG &&
1273 !ale->params.ale_entries) {
1275 readl_relaxed(ale->params.ale_regs + ALE_STATUS) &
1276 ALE_STATUS_SIZE_MASK;
1277 /* ALE available on newer NetCP switches has introduced
1278 * a register, ALE_STATUS, to indicate the size of ALE
1279 * table which shows the size as a multiple of 1024 entries.
1280 * For these, params.ale_entries will be set to zero. So
1281 * read the register and update the value of ale_entries.
1282 * return error if ale_entries is zero in ALE_STATUS.
1285 return ERR_PTR(-EINVAL);
1287 ale_entries *= ALE_TABLE_SIZE_MULTIPLIER;
1288 ale->params.ale_entries = ale_entries;
1290 dev_info(ale->params.dev,
1291 "ALE Table size %ld\n", ale->params.ale_entries);
1293 /* set default bits for existing h/w */
1294 ale->port_mask_bits = ale->params.ale_ports;
1295 ale->port_num_bits = order_base_2(ale->params.ale_ports);
1296 ale->vlan_field_bits = ale->params.ale_ports;
1298 /* Set defaults override for ALE on NetCP NU switch and for version
1301 if (ale->params.nu_switch_ale) {
1302 /* Separate registers for unknown vlan configuration.
1303 * Also there are N bits, where N is number of ale
1304 * ports and shift value should be 0
1306 ale_controls[ALE_PORT_UNKNOWN_VLAN_MEMBER].bits =
1307 ale->params.ale_ports;
1308 ale_controls[ALE_PORT_UNKNOWN_VLAN_MEMBER].offset =
1309 ALE_UNKNOWNVLAN_MEMBER;
1310 ale_controls[ALE_PORT_UNKNOWN_MCAST_FLOOD].bits =
1311 ale->params.ale_ports;
1312 ale_controls[ALE_PORT_UNKNOWN_MCAST_FLOOD].shift = 0;
1313 ale_controls[ALE_PORT_UNKNOWN_MCAST_FLOOD].offset =
1314 ALE_UNKNOWNVLAN_UNREG_MCAST_FLOOD;
1315 ale_controls[ALE_PORT_UNKNOWN_REG_MCAST_FLOOD].bits =
1316 ale->params.ale_ports;
1317 ale_controls[ALE_PORT_UNKNOWN_REG_MCAST_FLOOD].shift = 0;
1318 ale_controls[ALE_PORT_UNKNOWN_REG_MCAST_FLOOD].offset =
1319 ALE_UNKNOWNVLAN_REG_MCAST_FLOOD;
1320 ale_controls[ALE_PORT_UNTAGGED_EGRESS].bits =
1321 ale->params.ale_ports;
1322 ale_controls[ALE_PORT_UNTAGGED_EGRESS].shift = 0;
1323 ale_controls[ALE_PORT_UNTAGGED_EGRESS].offset =
1324 ALE_UNKNOWNVLAN_FORCE_UNTAG_EGRESS;
1327 cpsw_ale_control_set(ale, 0, ALE_CLEAR, 1);
1331 void cpsw_ale_dump(struct cpsw_ale *ale, u32 *data)
1335 for (i = 0; i < ale->params.ale_entries; i++) {
1336 cpsw_ale_read(ale, i, data);
1337 data += ALE_ENTRY_WORDS;
1341 u32 cpsw_ale_get_num_entries(struct cpsw_ale *ale)
1343 return ale ? ale->params.ale_entries : 0;