xref: /linux/drivers/net/dsa/mv88e6xxx/tcam.h (revision 0fc8f6200d2313278fbf4539bbab74677c685531)
1*639f1dcfSCedric Jehasse /* SPDX-License-Identifier: GPL-2.0-or-later */
2*639f1dcfSCedric Jehasse 
3*639f1dcfSCedric Jehasse /*
4*639f1dcfSCedric Jehasse  * Copyright (c) 2026 Luminex Network Intelligence
5*639f1dcfSCedric Jehasse  */
6*639f1dcfSCedric Jehasse #ifndef _MV88E6XXX_TCAM_H_
7*639f1dcfSCedric Jehasse #define _MV88E6XXX_TCAM_H_
8*639f1dcfSCedric Jehasse 
9*639f1dcfSCedric Jehasse #define PAGE0_MATCH_SIZE 22
10*639f1dcfSCedric Jehasse #define PAGE1_MATCH_SIZE 26
11*639f1dcfSCedric Jehasse 
12*639f1dcfSCedric Jehasse #define DPV_MODE_NOP		0x0
13*639f1dcfSCedric Jehasse #define DPV_MODE_AND		0x1
14*639f1dcfSCedric Jehasse #define DPV_MODE_OR		0x2
15*639f1dcfSCedric Jehasse #define DPV_MODE_REPLACE	0x3
16*639f1dcfSCedric Jehasse 
17*639f1dcfSCedric Jehasse int mv88e6xxx_tcam_entry_add(struct mv88e6xxx_chip *chip,
18*639f1dcfSCedric Jehasse 			     struct mv88e6xxx_tcam_entry *entry);
19*639f1dcfSCedric Jehasse int mv88e6xxx_tcam_entry_del(struct mv88e6xxx_chip *chip,
20*639f1dcfSCedric Jehasse 			     struct mv88e6xxx_tcam_entry *entry);
21*639f1dcfSCedric Jehasse struct mv88e6xxx_tcam_entry *
22*639f1dcfSCedric Jehasse mv88e6xxx_tcam_entry_find(struct mv88e6xxx_chip *chip, unsigned long cookie);
23*639f1dcfSCedric Jehasse #define mv88e6xxx_tcam_match_set(key, _offset, data, mask) \
24*639f1dcfSCedric Jehasse 	do { \
25*639f1dcfSCedric Jehasse 		typeof(_offset) (offset) = (_offset); \
26*639f1dcfSCedric Jehasse 		BUILD_BUG_ON((offset) + sizeof((data)) > TCAM_MATCH_SIZE); \
27*639f1dcfSCedric Jehasse 		__mv88e6xxx_tcam_match_set(key, offset, sizeof(data), \
28*639f1dcfSCedric Jehasse 					   (u8 *)&(data), (u8 *)&(mask)); \
29*639f1dcfSCedric Jehasse 	} while (0)
30*639f1dcfSCedric Jehasse 
31*639f1dcfSCedric Jehasse static inline void __mv88e6xxx_tcam_match_set(struct mv88e6xxx_tcam_key *key,
32*639f1dcfSCedric Jehasse 					      unsigned int offset, size_t size,
33*639f1dcfSCedric Jehasse 					      u8 *data, u8 *mask)
34*639f1dcfSCedric Jehasse {
35*639f1dcfSCedric Jehasse 	memcpy(&key->frame_data[offset], data, size);
36*639f1dcfSCedric Jehasse 	memcpy(&key->frame_mask[offset], mask, size);
37*639f1dcfSCedric Jehasse }
38*639f1dcfSCedric Jehasse 
39*639f1dcfSCedric Jehasse extern const struct mv88e6xxx_tcam_ops mv88e6390_tcam_ops;
40*639f1dcfSCedric Jehasse extern const struct mv88e6xxx_tcam_ops mv88e6393_tcam_ops;
41*639f1dcfSCedric Jehasse #endif
42