forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-31 f9004dbfff8a3fbbd7e2a88c8a4327c7f2f8e5b2
kernel/drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_keys.h
....@@ -33,6 +33,8 @@
3333 MLXSW_AFK_ELEMENT_IP_TTL_,
3434 MLXSW_AFK_ELEMENT_IP_ECN,
3535 MLXSW_AFK_ELEMENT_IP_DSCP,
36
+ MLXSW_AFK_ELEMENT_VIRT_ROUTER_8_10,
37
+ MLXSW_AFK_ELEMENT_VIRT_ROUTER_0_7,
3638 MLXSW_AFK_ELEMENT_MAX,
3739 };
3840
....@@ -67,47 +69,22 @@
6769 MLXSW_AFK_ELEMENT_INFO(MLXSW_AFK_ELEMENT_TYPE_BUF, \
6870 _element, _offset, 0, _size)
6971
70
-/* For the purpose of the driver, define an internal storage scratchpad
71
- * that will be used to store key/mask values. For each defined element type
72
- * define an internal storage geometry.
73
- */
74
-static const struct mlxsw_afk_element_info mlxsw_afk_element_infos[] = {
75
- MLXSW_AFK_ELEMENT_INFO_U32(SRC_SYS_PORT, 0x00, 16, 8),
76
- MLXSW_AFK_ELEMENT_INFO_BUF(DMAC_32_47, 0x04, 2),
77
- MLXSW_AFK_ELEMENT_INFO_BUF(DMAC_0_31, 0x06, 4),
78
- MLXSW_AFK_ELEMENT_INFO_BUF(SMAC_32_47, 0x0A, 2),
79
- MLXSW_AFK_ELEMENT_INFO_BUF(SMAC_0_31, 0x0C, 4),
80
- MLXSW_AFK_ELEMENT_INFO_U32(ETHERTYPE, 0x00, 0, 16),
81
- MLXSW_AFK_ELEMENT_INFO_U32(IP_PROTO, 0x10, 0, 8),
82
- MLXSW_AFK_ELEMENT_INFO_U32(VID, 0x10, 8, 12),
83
- MLXSW_AFK_ELEMENT_INFO_U32(PCP, 0x10, 20, 3),
84
- MLXSW_AFK_ELEMENT_INFO_U32(TCP_FLAGS, 0x10, 23, 9),
85
- MLXSW_AFK_ELEMENT_INFO_U32(DST_L4_PORT, 0x14, 0, 16),
86
- MLXSW_AFK_ELEMENT_INFO_U32(SRC_L4_PORT, 0x14, 16, 16),
87
- MLXSW_AFK_ELEMENT_INFO_U32(IP_TTL_, 0x18, 0, 8),
88
- MLXSW_AFK_ELEMENT_INFO_U32(IP_ECN, 0x18, 9, 2),
89
- MLXSW_AFK_ELEMENT_INFO_U32(IP_DSCP, 0x18, 11, 6),
90
- MLXSW_AFK_ELEMENT_INFO_BUF(SRC_IP_96_127, 0x20, 4),
91
- MLXSW_AFK_ELEMENT_INFO_BUF(SRC_IP_64_95, 0x24, 4),
92
- MLXSW_AFK_ELEMENT_INFO_BUF(SRC_IP_32_63, 0x28, 4),
93
- MLXSW_AFK_ELEMENT_INFO_BUF(SRC_IP_0_31, 0x2C, 4),
94
- MLXSW_AFK_ELEMENT_INFO_BUF(DST_IP_96_127, 0x30, 4),
95
- MLXSW_AFK_ELEMENT_INFO_BUF(DST_IP_64_95, 0x34, 4),
96
- MLXSW_AFK_ELEMENT_INFO_BUF(DST_IP_32_63, 0x38, 4),
97
- MLXSW_AFK_ELEMENT_INFO_BUF(DST_IP_0_31, 0x3C, 4),
98
-};
99
-
10072 #define MLXSW_AFK_ELEMENT_STORAGE_SIZE 0x40
10173
10274 struct mlxsw_afk_element_inst { /* element instance in actual block */
103
- const struct mlxsw_afk_element_info *info;
75
+ enum mlxsw_afk_element element;
10476 enum mlxsw_afk_element_type type;
10577 struct mlxsw_item item; /* element geometry in block */
78
+ int u32_key_diff; /* in case value needs to be adjusted before write
79
+ * this diff is here to handle that
80
+ */
81
+ bool avoid_size_check;
10682 };
10783
108
-#define MLXSW_AFK_ELEMENT_INST(_type, _element, _offset, _shift, _size) \
84
+#define MLXSW_AFK_ELEMENT_INST(_type, _element, _offset, \
85
+ _shift, _size, _u32_key_diff, _avoid_size_check) \
10986 { \
110
- .info = &mlxsw_afk_element_infos[MLXSW_AFK_ELEMENT_##_element], \
87
+ .element = MLXSW_AFK_ELEMENT_##_element, \
11188 .type = _type, \
11289 .item = { \
11390 .offset = _offset, \
....@@ -115,15 +92,24 @@
11592 .size = {.bits = _size}, \
11693 .name = #_element, \
11794 }, \
95
+ .u32_key_diff = _u32_key_diff, \
96
+ .avoid_size_check = _avoid_size_check, \
11897 }
11998
12099 #define MLXSW_AFK_ELEMENT_INST_U32(_element, _offset, _shift, _size) \
121100 MLXSW_AFK_ELEMENT_INST(MLXSW_AFK_ELEMENT_TYPE_U32, \
122
- _element, _offset, _shift, _size)
101
+ _element, _offset, _shift, _size, 0, false)
102
+
103
+#define MLXSW_AFK_ELEMENT_INST_EXT_U32(_element, _offset, \
104
+ _shift, _size, _key_diff, \
105
+ _avoid_size_check) \
106
+ MLXSW_AFK_ELEMENT_INST(MLXSW_AFK_ELEMENT_TYPE_U32, \
107
+ _element, _offset, _shift, _size, \
108
+ _key_diff, _avoid_size_check)
123109
124110 #define MLXSW_AFK_ELEMENT_INST_BUF(_element, _offset, _size) \
125111 MLXSW_AFK_ELEMENT_INST(MLXSW_AFK_ELEMENT_TYPE_BUF, \
126
- _element, _offset, 0, _size)
112
+ _element, _offset, 0, _size, 0, false)
127113
128114 struct mlxsw_afk_block {
129115 u16 encoding; /* block ID */
....@@ -188,7 +174,8 @@
188174 struct mlxsw_afk_ops {
189175 const struct mlxsw_afk_block *blocks;
190176 unsigned int blocks_count;
191
- void (*encode_block)(char *block, int block_index, char *output);
177
+ void (*encode_block)(char *output, int block_index, char *block);
178
+ void (*clear_block)(char *output, int block_index);
192179 };
193180
194181 struct mlxsw_afk *mlxsw_afk_create(unsigned int max_blocks,
....@@ -228,6 +215,8 @@
228215 void mlxsw_afk_encode(struct mlxsw_afk *mlxsw_afk,
229216 struct mlxsw_afk_key_info *key_info,
230217 struct mlxsw_afk_element_values *values,
231
- char *key, char *mask, int block_start, int block_end);
218
+ char *key, char *mask);
219
+void mlxsw_afk_clear(struct mlxsw_afk *mlxsw_afk, char *key,
220
+ int block_start, int block_end);
232221
233222 #endif