Commit 65718c4d authored by David S. Miller's avatar David S. Miller

Merge branch 'lan966x-es0-vcap'

Horatiu Vultur says:

====================
net: lan966x: Add support for ES0 VCAP

Provide the Egress Stage 0 (ES0) VCAP (Versatile Content-Aware
Processor) support for the lan966x platform.

The ES0 VCAP has only 1 lookup which is accessible with a TC chain
id 10000000.

Currently only one action is support which is vlan pop. Also it is
possible to link the IS1 to ES0 using 'goto chain 10000000'.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 81ac2722 85f05000
...@@ -101,6 +101,9 @@ ...@@ -101,6 +101,9 @@
#define LAN966X_VCAP_CID_IS2_L1 VCAP_CID_INGRESS_STAGE2_L1 /* IS2 lookup 1 */ #define LAN966X_VCAP_CID_IS2_L1 VCAP_CID_INGRESS_STAGE2_L1 /* IS2 lookup 1 */
#define LAN966X_VCAP_CID_IS2_MAX (VCAP_CID_INGRESS_STAGE2_L2 - 1) /* IS2 Max */ #define LAN966X_VCAP_CID_IS2_MAX (VCAP_CID_INGRESS_STAGE2_L2 - 1) /* IS2 Max */
#define LAN966X_VCAP_CID_ES0_L0 VCAP_CID_EGRESS_L0 /* ES0 lookup 0 */
#define LAN966X_VCAP_CID_ES0_MAX (VCAP_CID_EGRESS_L1 - 1) /* ES0 Max */
/* MAC table entry types. /* MAC table entry types.
* ENTRYTYPE_NORMAL is subject to aging. * ENTRYTYPE_NORMAL is subject to aging.
* ENTRYTYPE_LOCKED is not subject to aging. * ENTRYTYPE_LOCKED is not subject to aging.
......
...@@ -1471,12 +1471,27 @@ enum lan966x_target { ...@@ -1471,12 +1471,27 @@ enum lan966x_target {
/* REW:PORT:PORT_CFG */ /* REW:PORT:PORT_CFG */
#define REW_PORT_CFG(g) __REG(TARGET_REW, 0, 1, 0, g, 10, 128, 8, 0, 1, 4) #define REW_PORT_CFG(g) __REG(TARGET_REW, 0, 1, 0, g, 10, 128, 8, 0, 1, 4)
#define REW_PORT_CFG_ES0_EN BIT(4)
#define REW_PORT_CFG_ES0_EN_SET(x)\
FIELD_PREP(REW_PORT_CFG_ES0_EN, x)
#define REW_PORT_CFG_ES0_EN_GET(x)\
FIELD_GET(REW_PORT_CFG_ES0_EN, x)
#define REW_PORT_CFG_NO_REWRITE BIT(0) #define REW_PORT_CFG_NO_REWRITE BIT(0)
#define REW_PORT_CFG_NO_REWRITE_SET(x)\ #define REW_PORT_CFG_NO_REWRITE_SET(x)\
FIELD_PREP(REW_PORT_CFG_NO_REWRITE, x) FIELD_PREP(REW_PORT_CFG_NO_REWRITE, x)
#define REW_PORT_CFG_NO_REWRITE_GET(x)\ #define REW_PORT_CFG_NO_REWRITE_GET(x)\
FIELD_GET(REW_PORT_CFG_NO_REWRITE, x) FIELD_GET(REW_PORT_CFG_NO_REWRITE, x)
/* REW:COMMON:STAT_CFG */
#define REW_STAT_CFG __REG(TARGET_REW, 0, 1, 3072, 0, 1, 528, 520, 0, 1, 4)
#define REW_STAT_CFG_STAT_MODE GENMASK(1, 0)
#define REW_STAT_CFG_STAT_MODE_SET(x)\
FIELD_PREP(REW_STAT_CFG_STAT_MODE, x)
#define REW_STAT_CFG_STAT_MODE_GET(x)\
FIELD_GET(REW_STAT_CFG_STAT_MODE, x)
/* SYS:SYSTEM:RESET_CFG */ /* SYS:SYSTEM:RESET_CFG */
#define SYS_RESET_CFG __REG(TARGET_SYS, 0, 1, 4128, 0, 1, 168, 0, 0, 1, 4) #define SYS_RESET_CFG __REG(TARGET_SYS, 0, 1, 4128, 0, 1, 168, 0, 0, 1, 4)
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
#include "vcap_api_client.h" #include "vcap_api_client.h"
#include "vcap_tc.h" #include "vcap_tc.h"
#define LAN966X_FORCE_UNTAGED 3
static bool lan966x_tc_is_known_etype(struct vcap_tc_flower_parse_usage *st, static bool lan966x_tc_is_known_etype(struct vcap_tc_flower_parse_usage *st,
u16 etype) u16 etype)
{ {
...@@ -29,6 +31,8 @@ static bool lan966x_tc_is_known_etype(struct vcap_tc_flower_parse_usage *st, ...@@ -29,6 +31,8 @@ static bool lan966x_tc_is_known_etype(struct vcap_tc_flower_parse_usage *st,
return true; return true;
} }
break; break;
case VCAP_TYPE_ES0:
return true;
default: default:
NL_SET_ERR_MSG_MOD(st->fco->common.extack, NL_SET_ERR_MSG_MOD(st->fco->common.extack,
"VCAP type not supported"); "VCAP type not supported");
...@@ -318,6 +322,9 @@ static int lan966x_tc_set_actionset(struct vcap_admin *admin, ...@@ -318,6 +322,9 @@ static int lan966x_tc_set_actionset(struct vcap_admin *admin,
case VCAP_TYPE_IS2: case VCAP_TYPE_IS2:
aset = VCAP_AFS_BASE_TYPE; aset = VCAP_AFS_BASE_TYPE;
break; break;
case VCAP_TYPE_ES0:
aset = VCAP_AFS_VID;
break;
default: default:
return -EINVAL; return -EINVAL;
} }
...@@ -353,6 +360,10 @@ static int lan966x_tc_add_rule_link_target(struct vcap_admin *admin, ...@@ -353,6 +360,10 @@ static int lan966x_tc_add_rule_link_target(struct vcap_admin *admin,
/* Add IS2 specific PAG key (for chaining rules from IS1) */ /* Add IS2 specific PAG key (for chaining rules from IS1) */
return vcap_rule_add_key_u32(vrule, VCAP_KF_LOOKUP_PAG, return vcap_rule_add_key_u32(vrule, VCAP_KF_LOOKUP_PAG,
link_val, ~0); link_val, ~0);
case VCAP_TYPE_ES0:
/* Add ES0 specific ISDX key (for chaining rules from IS1) */
return vcap_rule_add_key_u32(vrule, VCAP_KF_ISDX_CLS,
link_val, ~0);
default: default:
break; break;
} }
...@@ -389,6 +400,18 @@ static int lan966x_tc_add_rule_link(struct vcap_control *vctrl, ...@@ -389,6 +400,18 @@ static int lan966x_tc_add_rule_link(struct vcap_control *vctrl,
0xff); 0xff);
if (err) if (err)
return err; return err;
} else if (admin->vtype == VCAP_TYPE_IS1 &&
to_admin->vtype == VCAP_TYPE_ES0) {
/* This works for IS1->ES0 */
err = vcap_rule_add_action_u32(vrule, VCAP_AF_ISDX_ADD_VAL,
diff);
if (err)
return err;
err = vcap_rule_add_action_bit(vrule, VCAP_AF_ISDX_REPLACE_ENA,
VCAP_BIT_1);
if (err)
return err;
} else { } else {
NL_SET_ERR_MSG_MOD(f->common.extack, NL_SET_ERR_MSG_MOD(f->common.extack,
"Unsupported chain destination"); "Unsupported chain destination");
...@@ -398,6 +421,23 @@ static int lan966x_tc_add_rule_link(struct vcap_control *vctrl, ...@@ -398,6 +421,23 @@ static int lan966x_tc_add_rule_link(struct vcap_control *vctrl,
return err; return err;
} }
static int lan966x_tc_add_rule_counter(struct vcap_admin *admin,
struct vcap_rule *vrule)
{
int err = 0;
switch (admin->vtype) {
case VCAP_TYPE_ES0:
err = vcap_rule_mod_action_u32(vrule, VCAP_AF_ESDX,
vrule->id);
break;
default:
break;
}
return err;
}
static int lan966x_tc_flower_add(struct lan966x_port *port, static int lan966x_tc_flower_add(struct lan966x_port *port,
struct flow_cls_offload *f, struct flow_cls_offload *f,
struct vcap_admin *admin, struct vcap_admin *admin,
...@@ -465,6 +505,21 @@ static int lan966x_tc_flower_add(struct lan966x_port *port, ...@@ -465,6 +505,21 @@ static int lan966x_tc_flower_add(struct lan966x_port *port,
if (err) if (err)
goto out; goto out;
break;
case FLOW_ACTION_VLAN_POP:
if (admin->vtype != VCAP_TYPE_ES0) {
NL_SET_ERR_MSG_MOD(f->common.extack,
"Cannot use vlan pop on non es0");
err = -EOPNOTSUPP;
goto out;
}
/* Force untag */
err = vcap_rule_add_action_u32(vrule, VCAP_AF_PUSH_OUTER_TAG,
LAN966X_FORCE_UNTAGED);
if (err)
goto out;
break; break;
default: default:
NL_SET_ERR_MSG_MOD(f->common.extack, NL_SET_ERR_MSG_MOD(f->common.extack,
...@@ -474,6 +529,12 @@ static int lan966x_tc_flower_add(struct lan966x_port *port, ...@@ -474,6 +529,12 @@ static int lan966x_tc_flower_add(struct lan966x_port *port,
} }
} }
err = lan966x_tc_add_rule_counter(admin, vrule);
if (err) {
vcap_set_tc_exterr(f, vrule);
goto out;
}
err = vcap_val_rule(vrule, l3_proto); err = vcap_val_rule(vrule, l3_proto);
if (err) { if (err) {
vcap_set_tc_exterr(f, vrule); vcap_set_tc_exterr(f, vrule);
......
...@@ -2121,6 +2121,69 @@ static const struct vcap_field is2_smac_sip6_keyfield[] = { ...@@ -2121,6 +2121,69 @@ static const struct vcap_field is2_smac_sip6_keyfield[] = {
}, },
}; };
static const struct vcap_field es0_vid_keyfield[] = {
[VCAP_KF_IF_EGR_PORT_NO] = {
.type = VCAP_FIELD_U32,
.offset = 0,
.width = 4,
},
[VCAP_KF_IF_IGR_PORT] = {
.type = VCAP_FIELD_U32,
.offset = 4,
.width = 4,
},
[VCAP_KF_ISDX_GT0_IS] = {
.type = VCAP_FIELD_BIT,
.offset = 8,
.width = 1,
},
[VCAP_KF_ISDX_CLS] = {
.type = VCAP_FIELD_U32,
.offset = 9,
.width = 8,
},
[VCAP_KF_L2_MC_IS] = {
.type = VCAP_FIELD_BIT,
.offset = 17,
.width = 1,
},
[VCAP_KF_L2_BC_IS] = {
.type = VCAP_FIELD_BIT,
.offset = 18,
.width = 1,
},
[VCAP_KF_8021Q_VID_CLS] = {
.type = VCAP_FIELD_U32,
.offset = 19,
.width = 12,
},
[VCAP_KF_8021Q_DEI_CLS] = {
.type = VCAP_FIELD_BIT,
.offset = 31,
.width = 1,
},
[VCAP_KF_8021Q_PCP_CLS] = {
.type = VCAP_FIELD_U32,
.offset = 32,
.width = 3,
},
[VCAP_KF_L3_DPL_CLS] = {
.type = VCAP_FIELD_BIT,
.offset = 35,
.width = 1,
},
[VCAP_KF_RTP_ID] = {
.type = VCAP_FIELD_U32,
.offset = 36,
.width = 10,
},
[VCAP_KF_PDU_TYPE] = {
.type = VCAP_FIELD_U32,
.offset = 46,
.width = 4,
},
};
/* keyfield_set */ /* keyfield_set */
static const struct vcap_set is1_keyfield_set[] = { static const struct vcap_set is1_keyfield_set[] = {
[VCAP_KFS_NORMAL] = { [VCAP_KFS_NORMAL] = {
...@@ -2228,6 +2291,14 @@ static const struct vcap_set is2_keyfield_set[] = { ...@@ -2228,6 +2291,14 @@ static const struct vcap_set is2_keyfield_set[] = {
}, },
}; };
static const struct vcap_set es0_keyfield_set[] = {
[VCAP_KFS_VID] = {
.type_id = -1,
.sw_per_item = 1,
.sw_cnt = 1,
},
};
/* keyfield_set map */ /* keyfield_set map */
static const struct vcap_field *is1_keyfield_set_map[] = { static const struct vcap_field *is1_keyfield_set_map[] = {
[VCAP_KFS_NORMAL] = is1_normal_keyfield, [VCAP_KFS_NORMAL] = is1_normal_keyfield,
...@@ -2255,6 +2326,10 @@ static const struct vcap_field *is2_keyfield_set_map[] = { ...@@ -2255,6 +2326,10 @@ static const struct vcap_field *is2_keyfield_set_map[] = {
[VCAP_KFS_SMAC_SIP6] = is2_smac_sip6_keyfield, [VCAP_KFS_SMAC_SIP6] = is2_smac_sip6_keyfield,
}; };
static const struct vcap_field *es0_keyfield_set_map[] = {
[VCAP_KFS_VID] = es0_vid_keyfield,
};
/* keyfield_set map sizes */ /* keyfield_set map sizes */
static int is1_keyfield_set_map_size[] = { static int is1_keyfield_set_map_size[] = {
[VCAP_KFS_NORMAL] = ARRAY_SIZE(is1_normal_keyfield), [VCAP_KFS_NORMAL] = ARRAY_SIZE(is1_normal_keyfield),
...@@ -2282,6 +2357,10 @@ static int is2_keyfield_set_map_size[] = { ...@@ -2282,6 +2357,10 @@ static int is2_keyfield_set_map_size[] = {
[VCAP_KFS_SMAC_SIP6] = ARRAY_SIZE(is2_smac_sip6_keyfield), [VCAP_KFS_SMAC_SIP6] = ARRAY_SIZE(is2_smac_sip6_keyfield),
}; };
static int es0_keyfield_set_map_size[] = {
[VCAP_KFS_VID] = ARRAY_SIZE(es0_vid_keyfield),
};
/* actionfields */ /* actionfields */
static const struct vcap_field is1_s1_actionfield[] = { static const struct vcap_field is1_s1_actionfield[] = {
[VCAP_AF_TYPE] = { [VCAP_AF_TYPE] = {
...@@ -2522,6 +2601,94 @@ static const struct vcap_field is2_smac_sip_actionfield[] = { ...@@ -2522,6 +2601,94 @@ static const struct vcap_field is2_smac_sip_actionfield[] = {
}, },
}; };
static const struct vcap_field es0_vid_actionfield[] = {
[VCAP_AF_PUSH_OUTER_TAG] = {
.type = VCAP_FIELD_U32,
.offset = 0,
.width = 2,
},
[VCAP_AF_PUSH_INNER_TAG] = {
.type = VCAP_FIELD_BIT,
.offset = 2,
.width = 1,
},
[VCAP_AF_TAG_A_TPID_SEL] = {
.type = VCAP_FIELD_U32,
.offset = 3,
.width = 2,
},
[VCAP_AF_TAG_A_VID_SEL] = {
.type = VCAP_FIELD_BIT,
.offset = 5,
.width = 1,
},
[VCAP_AF_TAG_A_PCP_SEL] = {
.type = VCAP_FIELD_U32,
.offset = 6,
.width = 2,
},
[VCAP_AF_TAG_A_DEI_SEL] = {
.type = VCAP_FIELD_U32,
.offset = 8,
.width = 2,
},
[VCAP_AF_TAG_B_TPID_SEL] = {
.type = VCAP_FIELD_U32,
.offset = 10,
.width = 2,
},
[VCAP_AF_TAG_B_VID_SEL] = {
.type = VCAP_FIELD_BIT,
.offset = 12,
.width = 1,
},
[VCAP_AF_TAG_B_PCP_SEL] = {
.type = VCAP_FIELD_U32,
.offset = 13,
.width = 2,
},
[VCAP_AF_TAG_B_DEI_SEL] = {
.type = VCAP_FIELD_U32,
.offset = 15,
.width = 2,
},
[VCAP_AF_VID_A_VAL] = {
.type = VCAP_FIELD_U32,
.offset = 17,
.width = 12,
},
[VCAP_AF_PCP_A_VAL] = {
.type = VCAP_FIELD_U32,
.offset = 29,
.width = 3,
},
[VCAP_AF_DEI_A_VAL] = {
.type = VCAP_FIELD_BIT,
.offset = 32,
.width = 1,
},
[VCAP_AF_VID_B_VAL] = {
.type = VCAP_FIELD_U32,
.offset = 33,
.width = 12,
},
[VCAP_AF_PCP_B_VAL] = {
.type = VCAP_FIELD_U32,
.offset = 45,
.width = 3,
},
[VCAP_AF_DEI_B_VAL] = {
.type = VCAP_FIELD_BIT,
.offset = 48,
.width = 1,
},
[VCAP_AF_ESDX] = {
.type = VCAP_FIELD_U32,
.offset = 49,
.width = 8,
},
};
/* actionfield_set */ /* actionfield_set */
static const struct vcap_set is1_actionfield_set[] = { static const struct vcap_set is1_actionfield_set[] = {
[VCAP_AFS_S1] = { [VCAP_AFS_S1] = {
...@@ -2544,6 +2711,14 @@ static const struct vcap_set is2_actionfield_set[] = { ...@@ -2544,6 +2711,14 @@ static const struct vcap_set is2_actionfield_set[] = {
}, },
}; };
static const struct vcap_set es0_actionfield_set[] = {
[VCAP_AFS_VID] = {
.type_id = -1,
.sw_per_item = 1,
.sw_cnt = 1,
},
};
/* actionfield_set map */ /* actionfield_set map */
static const struct vcap_field *is1_actionfield_set_map[] = { static const struct vcap_field *is1_actionfield_set_map[] = {
[VCAP_AFS_S1] = is1_s1_actionfield, [VCAP_AFS_S1] = is1_s1_actionfield,
...@@ -2554,6 +2729,10 @@ static const struct vcap_field *is2_actionfield_set_map[] = { ...@@ -2554,6 +2729,10 @@ static const struct vcap_field *is2_actionfield_set_map[] = {
[VCAP_AFS_SMAC_SIP] = is2_smac_sip_actionfield, [VCAP_AFS_SMAC_SIP] = is2_smac_sip_actionfield,
}; };
static const struct vcap_field *es0_actionfield_set_map[] = {
[VCAP_AFS_VID] = es0_vid_actionfield,
};
/* actionfield_set map size */ /* actionfield_set map size */
static int is1_actionfield_set_map_size[] = { static int is1_actionfield_set_map_size[] = {
[VCAP_AFS_S1] = ARRAY_SIZE(is1_s1_actionfield), [VCAP_AFS_S1] = ARRAY_SIZE(is1_s1_actionfield),
...@@ -2564,6 +2743,10 @@ static int is2_actionfield_set_map_size[] = { ...@@ -2564,6 +2743,10 @@ static int is2_actionfield_set_map_size[] = {
[VCAP_AFS_SMAC_SIP] = ARRAY_SIZE(is2_smac_sip_actionfield), [VCAP_AFS_SMAC_SIP] = ARRAY_SIZE(is2_smac_sip_actionfield),
}; };
static int es0_actionfield_set_map_size[] = {
[VCAP_AFS_VID] = ARRAY_SIZE(es0_vid_actionfield),
};
/* Type Groups */ /* Type Groups */
static const struct vcap_typegroup is1_x4_keyfield_set_typegroups[] = { static const struct vcap_typegroup is1_x4_keyfield_set_typegroups[] = {
{ {
...@@ -2659,6 +2842,10 @@ static const struct vcap_typegroup is2_x1_keyfield_set_typegroups[] = { ...@@ -2659,6 +2842,10 @@ static const struct vcap_typegroup is2_x1_keyfield_set_typegroups[] = {
{} {}
}; };
static const struct vcap_typegroup es0_x1_keyfield_set_typegroups[] = {
{}
};
static const struct vcap_typegroup *is1_keyfield_set_typegroups[] = { static const struct vcap_typegroup *is1_keyfield_set_typegroups[] = {
[4] = is1_x4_keyfield_set_typegroups, [4] = is1_x4_keyfield_set_typegroups,
[2] = is1_x2_keyfield_set_typegroups, [2] = is1_x2_keyfield_set_typegroups,
...@@ -2673,6 +2860,11 @@ static const struct vcap_typegroup *is2_keyfield_set_typegroups[] = { ...@@ -2673,6 +2860,11 @@ static const struct vcap_typegroup *is2_keyfield_set_typegroups[] = {
[5] = NULL, [5] = NULL,
}; };
static const struct vcap_typegroup *es0_keyfield_set_typegroups[] = {
[1] = es0_x1_keyfield_set_typegroups,
[2] = NULL,
};
static const struct vcap_typegroup is1_x1_actionfield_set_typegroups[] = { static const struct vcap_typegroup is1_x1_actionfield_set_typegroups[] = {
{} {}
}; };
...@@ -2700,6 +2892,10 @@ static const struct vcap_typegroup is2_x1_actionfield_set_typegroups[] = { ...@@ -2700,6 +2892,10 @@ static const struct vcap_typegroup is2_x1_actionfield_set_typegroups[] = {
{} {}
}; };
static const struct vcap_typegroup es0_x1_actionfield_set_typegroups[] = {
{}
};
static const struct vcap_typegroup *is1_actionfield_set_typegroups[] = { static const struct vcap_typegroup *is1_actionfield_set_typegroups[] = {
[1] = is1_x1_actionfield_set_typegroups, [1] = is1_x1_actionfield_set_typegroups,
[5] = NULL, [5] = NULL,
...@@ -2711,6 +2907,11 @@ static const struct vcap_typegroup *is2_actionfield_set_typegroups[] = { ...@@ -2711,6 +2907,11 @@ static const struct vcap_typegroup *is2_actionfield_set_typegroups[] = {
[5] = NULL, [5] = NULL,
}; };
static const struct vcap_typegroup *es0_actionfield_set_typegroups[] = {
[1] = es0_x1_actionfield_set_typegroups,
[2] = NULL,
};
/* Keyfieldset names */ /* Keyfieldset names */
static const char * const vcap_keyfield_set_names[] = { static const char * const vcap_keyfield_set_names[] = {
[VCAP_KFS_NO_VALUE] = "(None)", [VCAP_KFS_NO_VALUE] = "(None)",
...@@ -2743,6 +2944,7 @@ static const char * const vcap_keyfield_set_names[] = { ...@@ -2743,6 +2944,7 @@ static const char * const vcap_keyfield_set_names[] = {
[VCAP_KFS_RT] = "VCAP_KFS_RT", [VCAP_KFS_RT] = "VCAP_KFS_RT",
[VCAP_KFS_SMAC_SIP4] = "VCAP_KFS_SMAC_SIP4", [VCAP_KFS_SMAC_SIP4] = "VCAP_KFS_SMAC_SIP4",
[VCAP_KFS_SMAC_SIP6] = "VCAP_KFS_SMAC_SIP6", [VCAP_KFS_SMAC_SIP6] = "VCAP_KFS_SMAC_SIP6",
[VCAP_KFS_VID] = "VCAP_KFS_VID",
}; };
/* Actionfieldset names */ /* Actionfieldset names */
...@@ -2751,9 +2953,11 @@ static const char * const vcap_actionfield_set_names[] = { ...@@ -2751,9 +2953,11 @@ static const char * const vcap_actionfield_set_names[] = {
[VCAP_AFS_BASE_TYPE] = "VCAP_AFS_BASE_TYPE", [VCAP_AFS_BASE_TYPE] = "VCAP_AFS_BASE_TYPE",
[VCAP_AFS_CLASSIFICATION] = "VCAP_AFS_CLASSIFICATION", [VCAP_AFS_CLASSIFICATION] = "VCAP_AFS_CLASSIFICATION",
[VCAP_AFS_CLASS_REDUCED] = "VCAP_AFS_CLASS_REDUCED", [VCAP_AFS_CLASS_REDUCED] = "VCAP_AFS_CLASS_REDUCED",
[VCAP_AFS_ES0] = "VCAP_AFS_ES0",
[VCAP_AFS_FULL] = "VCAP_AFS_FULL", [VCAP_AFS_FULL] = "VCAP_AFS_FULL",
[VCAP_AFS_S1] = "VCAP_AFS_S1", [VCAP_AFS_S1] = "VCAP_AFS_S1",
[VCAP_AFS_SMAC_SIP] = "VCAP_AFS_SMAC_SIP", [VCAP_AFS_SMAC_SIP] = "VCAP_AFS_SMAC_SIP",
[VCAP_AFS_VID] = "VCAP_AFS_VID",
}; };
/* Keyfield names */ /* Keyfield names */
...@@ -2774,6 +2978,7 @@ static const char * const vcap_keyfield_names[] = { ...@@ -2774,6 +2978,7 @@ static const char * const vcap_keyfield_names[] = {
[VCAP_KF_8021Q_PCP1] = "8021Q_PCP1", [VCAP_KF_8021Q_PCP1] = "8021Q_PCP1",
[VCAP_KF_8021Q_PCP2] = "8021Q_PCP2", [VCAP_KF_8021Q_PCP2] = "8021Q_PCP2",
[VCAP_KF_8021Q_PCP_CLS] = "8021Q_PCP_CLS", [VCAP_KF_8021Q_PCP_CLS] = "8021Q_PCP_CLS",
[VCAP_KF_8021Q_TPID] = "8021Q_TPID",
[VCAP_KF_8021Q_TPID0] = "8021Q_TPID0", [VCAP_KF_8021Q_TPID0] = "8021Q_TPID0",
[VCAP_KF_8021Q_TPID1] = "8021Q_TPID1", [VCAP_KF_8021Q_TPID1] = "8021Q_TPID1",
[VCAP_KF_8021Q_TPID2] = "8021Q_TPID2", [VCAP_KF_8021Q_TPID2] = "8021Q_TPID2",
...@@ -2799,6 +3004,7 @@ static const char * const vcap_keyfield_names[] = { ...@@ -2799,6 +3004,7 @@ static const char * const vcap_keyfield_names[] = {
[VCAP_KF_HOST_MATCH] = "HOST_MATCH", [VCAP_KF_HOST_MATCH] = "HOST_MATCH",
[VCAP_KF_IF_EGR_PORT_MASK] = "IF_EGR_PORT_MASK", [VCAP_KF_IF_EGR_PORT_MASK] = "IF_EGR_PORT_MASK",
[VCAP_KF_IF_EGR_PORT_MASK_RNG] = "IF_EGR_PORT_MASK_RNG", [VCAP_KF_IF_EGR_PORT_MASK_RNG] = "IF_EGR_PORT_MASK_RNG",
[VCAP_KF_IF_EGR_PORT_NO] = "IF_EGR_PORT_NO",
[VCAP_KF_IF_IGR_PORT] = "IF_IGR_PORT", [VCAP_KF_IF_IGR_PORT] = "IF_IGR_PORT",
[VCAP_KF_IF_IGR_PORT_MASK] = "IF_IGR_PORT_MASK", [VCAP_KF_IF_IGR_PORT_MASK] = "IF_IGR_PORT_MASK",
[VCAP_KF_IF_IGR_PORT_MASK_L3] = "IF_IGR_PORT_MASK_L3", [VCAP_KF_IF_IGR_PORT_MASK_L3] = "IF_IGR_PORT_MASK_L3",
...@@ -2873,7 +3079,9 @@ static const char * const vcap_keyfield_names[] = { ...@@ -2873,7 +3079,9 @@ static const char * const vcap_keyfield_names[] = {
[VCAP_KF_OAM_OPCODE] = "OAM_OPCODE", [VCAP_KF_OAM_OPCODE] = "OAM_OPCODE",
[VCAP_KF_OAM_VER] = "OAM_VER", [VCAP_KF_OAM_VER] = "OAM_VER",
[VCAP_KF_OAM_Y1731_IS] = "OAM_Y1731_IS", [VCAP_KF_OAM_Y1731_IS] = "OAM_Y1731_IS",
[VCAP_KF_PDU_TYPE] = "PDU_TYPE",
[VCAP_KF_PROT_ACTIVE] = "PROT_ACTIVE", [VCAP_KF_PROT_ACTIVE] = "PROT_ACTIVE",
[VCAP_KF_RTP_ID] = "RTP_ID",
[VCAP_KF_RT_FRMID] = "RT_FRMID", [VCAP_KF_RT_FRMID] = "RT_FRMID",
[VCAP_KF_RT_TYPE] = "RT_TYPE", [VCAP_KF_RT_TYPE] = "RT_TYPE",
[VCAP_KF_RT_VLAN_IDX] = "RT_VLAN_IDX", [VCAP_KF_RT_VLAN_IDX] = "RT_VLAN_IDX",
...@@ -2891,18 +3099,25 @@ static const char * const vcap_actionfield_names[] = { ...@@ -2891,18 +3099,25 @@ static const char * const vcap_actionfield_names[] = {
[VCAP_AF_COPY_PORT_NUM] = "COPY_PORT_NUM", [VCAP_AF_COPY_PORT_NUM] = "COPY_PORT_NUM",
[VCAP_AF_COPY_QUEUE_NUM] = "COPY_QUEUE_NUM", [VCAP_AF_COPY_QUEUE_NUM] = "COPY_QUEUE_NUM",
[VCAP_AF_CPU_COPY_ENA] = "CPU_COPY_ENA", [VCAP_AF_CPU_COPY_ENA] = "CPU_COPY_ENA",
[VCAP_AF_CPU_QU] = "CPU_QU",
[VCAP_AF_CPU_QUEUE_NUM] = "CPU_QUEUE_NUM", [VCAP_AF_CPU_QUEUE_NUM] = "CPU_QUEUE_NUM",
[VCAP_AF_CUSTOM_ACE_TYPE_ENA] = "CUSTOM_ACE_TYPE_ENA", [VCAP_AF_CUSTOM_ACE_TYPE_ENA] = "CUSTOM_ACE_TYPE_ENA",
[VCAP_AF_DEI_A_VAL] = "DEI_A_VAL",
[VCAP_AF_DEI_B_VAL] = "DEI_B_VAL",
[VCAP_AF_DEI_C_VAL] = "DEI_C_VAL",
[VCAP_AF_DEI_ENA] = "DEI_ENA", [VCAP_AF_DEI_ENA] = "DEI_ENA",
[VCAP_AF_DEI_VAL] = "DEI_VAL", [VCAP_AF_DEI_VAL] = "DEI_VAL",
[VCAP_AF_DLR_SEL] = "DLR_SEL", [VCAP_AF_DLR_SEL] = "DLR_SEL",
[VCAP_AF_DP_ENA] = "DP_ENA", [VCAP_AF_DP_ENA] = "DP_ENA",
[VCAP_AF_DP_VAL] = "DP_VAL", [VCAP_AF_DP_VAL] = "DP_VAL",
[VCAP_AF_DSCP_ENA] = "DSCP_ENA", [VCAP_AF_DSCP_ENA] = "DSCP_ENA",
[VCAP_AF_DSCP_SEL] = "DSCP_SEL",
[VCAP_AF_DSCP_VAL] = "DSCP_VAL", [VCAP_AF_DSCP_VAL] = "DSCP_VAL",
[VCAP_AF_ES2_REW_CMD] = "ES2_REW_CMD", [VCAP_AF_ES2_REW_CMD] = "ES2_REW_CMD",
[VCAP_AF_ESDX] = "ESDX",
[VCAP_AF_FWD_KILL_ENA] = "FWD_KILL_ENA", [VCAP_AF_FWD_KILL_ENA] = "FWD_KILL_ENA",
[VCAP_AF_FWD_MODE] = "FWD_MODE", [VCAP_AF_FWD_MODE] = "FWD_MODE",
[VCAP_AF_FWD_SEL] = "FWD_SEL",
[VCAP_AF_HIT_ME_ONCE] = "HIT_ME_ONCE", [VCAP_AF_HIT_ME_ONCE] = "HIT_ME_ONCE",
[VCAP_AF_HOST_MATCH] = "HOST_MATCH", [VCAP_AF_HOST_MATCH] = "HOST_MATCH",
[VCAP_AF_IGNORE_PIPELINE_CTRL] = "IGNORE_PIPELINE_CTRL", [VCAP_AF_IGNORE_PIPELINE_CTRL] = "IGNORE_PIPELINE_CTRL",
...@@ -2912,6 +3127,7 @@ static const char * const vcap_actionfield_names[] = { ...@@ -2912,6 +3127,7 @@ static const char * const vcap_actionfield_names[] = {
[VCAP_AF_ISDX_ENA] = "ISDX_ENA", [VCAP_AF_ISDX_ENA] = "ISDX_ENA",
[VCAP_AF_ISDX_REPLACE_ENA] = "ISDX_REPLACE_ENA", [VCAP_AF_ISDX_REPLACE_ENA] = "ISDX_REPLACE_ENA",
[VCAP_AF_ISDX_VAL] = "ISDX_VAL", [VCAP_AF_ISDX_VAL] = "ISDX_VAL",
[VCAP_AF_LOOP_ENA] = "LOOP_ENA",
[VCAP_AF_LRN_DIS] = "LRN_DIS", [VCAP_AF_LRN_DIS] = "LRN_DIS",
[VCAP_AF_MAP_IDX] = "MAP_IDX", [VCAP_AF_MAP_IDX] = "MAP_IDX",
[VCAP_AF_MAP_KEY] = "MAP_KEY", [VCAP_AF_MAP_KEY] = "MAP_KEY",
...@@ -2928,15 +3144,23 @@ static const char * const vcap_actionfield_names[] = { ...@@ -2928,15 +3144,23 @@ static const char * const vcap_actionfield_names[] = {
[VCAP_AF_OAM_SEL] = "OAM_SEL", [VCAP_AF_OAM_SEL] = "OAM_SEL",
[VCAP_AF_PAG_OVERRIDE_MASK] = "PAG_OVERRIDE_MASK", [VCAP_AF_PAG_OVERRIDE_MASK] = "PAG_OVERRIDE_MASK",
[VCAP_AF_PAG_VAL] = "PAG_VAL", [VCAP_AF_PAG_VAL] = "PAG_VAL",
[VCAP_AF_PCP_A_VAL] = "PCP_A_VAL",
[VCAP_AF_PCP_B_VAL] = "PCP_B_VAL",
[VCAP_AF_PCP_C_VAL] = "PCP_C_VAL",
[VCAP_AF_PCP_ENA] = "PCP_ENA", [VCAP_AF_PCP_ENA] = "PCP_ENA",
[VCAP_AF_PCP_VAL] = "PCP_VAL", [VCAP_AF_PCP_VAL] = "PCP_VAL",
[VCAP_AF_PIPELINE_ACT] = "PIPELINE_ACT",
[VCAP_AF_PIPELINE_FORCE_ENA] = "PIPELINE_FORCE_ENA", [VCAP_AF_PIPELINE_FORCE_ENA] = "PIPELINE_FORCE_ENA",
[VCAP_AF_PIPELINE_PT] = "PIPELINE_PT", [VCAP_AF_PIPELINE_PT] = "PIPELINE_PT",
[VCAP_AF_POLICE_ENA] = "POLICE_ENA", [VCAP_AF_POLICE_ENA] = "POLICE_ENA",
[VCAP_AF_POLICE_IDX] = "POLICE_IDX", [VCAP_AF_POLICE_IDX] = "POLICE_IDX",
[VCAP_AF_POLICE_REMARK] = "POLICE_REMARK", [VCAP_AF_POLICE_REMARK] = "POLICE_REMARK",
[VCAP_AF_POLICE_VCAP_ONLY] = "POLICE_VCAP_ONLY", [VCAP_AF_POLICE_VCAP_ONLY] = "POLICE_VCAP_ONLY",
[VCAP_AF_POP_VAL] = "POP_VAL",
[VCAP_AF_PORT_MASK] = "PORT_MASK", [VCAP_AF_PORT_MASK] = "PORT_MASK",
[VCAP_AF_PUSH_CUSTOMER_TAG] = "PUSH_CUSTOMER_TAG",
[VCAP_AF_PUSH_INNER_TAG] = "PUSH_INNER_TAG",
[VCAP_AF_PUSH_OUTER_TAG] = "PUSH_OUTER_TAG",
[VCAP_AF_QOS_ENA] = "QOS_ENA", [VCAP_AF_QOS_ENA] = "QOS_ENA",
[VCAP_AF_QOS_VAL] = "QOS_VAL", [VCAP_AF_QOS_VAL] = "QOS_VAL",
[VCAP_AF_REW_OP] = "REW_OP", [VCAP_AF_REW_OP] = "REW_OP",
...@@ -2945,7 +3169,24 @@ static const char * const vcap_actionfield_names[] = { ...@@ -2945,7 +3169,24 @@ static const char * const vcap_actionfield_names[] = {
[VCAP_AF_SFID_VAL] = "SFID_VAL", [VCAP_AF_SFID_VAL] = "SFID_VAL",
[VCAP_AF_SGID_ENA] = "SGID_ENA", [VCAP_AF_SGID_ENA] = "SGID_ENA",
[VCAP_AF_SGID_VAL] = "SGID_VAL", [VCAP_AF_SGID_VAL] = "SGID_VAL",
[VCAP_AF_SWAP_MACS_ENA] = "SWAP_MACS_ENA",
[VCAP_AF_TAG_A_DEI_SEL] = "TAG_A_DEI_SEL",
[VCAP_AF_TAG_A_PCP_SEL] = "TAG_A_PCP_SEL",
[VCAP_AF_TAG_A_TPID_SEL] = "TAG_A_TPID_SEL",
[VCAP_AF_TAG_A_VID_SEL] = "TAG_A_VID_SEL",
[VCAP_AF_TAG_B_DEI_SEL] = "TAG_B_DEI_SEL",
[VCAP_AF_TAG_B_PCP_SEL] = "TAG_B_PCP_SEL",
[VCAP_AF_TAG_B_TPID_SEL] = "TAG_B_TPID_SEL",
[VCAP_AF_TAG_B_VID_SEL] = "TAG_B_VID_SEL",
[VCAP_AF_TAG_C_DEI_SEL] = "TAG_C_DEI_SEL",
[VCAP_AF_TAG_C_PCP_SEL] = "TAG_C_PCP_SEL",
[VCAP_AF_TAG_C_TPID_SEL] = "TAG_C_TPID_SEL",
[VCAP_AF_TAG_C_VID_SEL] = "TAG_C_VID_SEL",
[VCAP_AF_TYPE] = "TYPE", [VCAP_AF_TYPE] = "TYPE",
[VCAP_AF_UNTAG_VID_ENA] = "UNTAG_VID_ENA",
[VCAP_AF_VID_A_VAL] = "VID_A_VAL",
[VCAP_AF_VID_B_VAL] = "VID_B_VAL",
[VCAP_AF_VID_C_VAL] = "VID_C_VAL",
[VCAP_AF_VID_REPLACE_ENA] = "VID_REPLACE_ENA", [VCAP_AF_VID_REPLACE_ENA] = "VID_REPLACE_ENA",
[VCAP_AF_VID_VAL] = "VID_VAL", [VCAP_AF_VID_VAL] = "VID_VAL",
[VCAP_AF_VLAN_POP_CNT] = "VLAN_POP_CNT", [VCAP_AF_VLAN_POP_CNT] = "VLAN_POP_CNT",
...@@ -2996,11 +3237,32 @@ const struct vcap_info lan966x_vcaps[] = { ...@@ -2996,11 +3237,32 @@ const struct vcap_info lan966x_vcaps[] = {
.keyfield_set_typegroups = is2_keyfield_set_typegroups, .keyfield_set_typegroups = is2_keyfield_set_typegroups,
.actionfield_set_typegroups = is2_actionfield_set_typegroups, .actionfield_set_typegroups = is2_actionfield_set_typegroups,
}, },
[VCAP_TYPE_ES0] = {
.name = "es0",
.rows = 256,
.sw_count = 1,
.sw_width = 96,
.sticky_width = 1,
.act_width = 65,
.default_cnt = 8,
.require_cnt_dis = 0,
.version = 1,
.keyfield_set = es0_keyfield_set,
.keyfield_set_size = ARRAY_SIZE(es0_keyfield_set),
.actionfield_set = es0_actionfield_set,
.actionfield_set_size = ARRAY_SIZE(es0_actionfield_set),
.keyfield_set_map = es0_keyfield_set_map,
.keyfield_set_map_size = es0_keyfield_set_map_size,
.actionfield_set_map = es0_actionfield_set_map,
.actionfield_set_map_size = es0_actionfield_set_map_size,
.keyfield_set_typegroups = es0_keyfield_set_typegroups,
.actionfield_set_typegroups = es0_actionfield_set_typegroups,
},
}; };
const struct vcap_statistics lan966x_vcap_stats = { const struct vcap_statistics lan966x_vcap_stats = {
.name = "lan966x", .name = "lan966x",
.count = 2, .count = 3,
.keyfield_set_names = vcap_keyfield_set_names, .keyfield_set_names = vcap_keyfield_set_names,
.actionfield_set_names = vcap_actionfield_set_names, .actionfield_set_names = vcap_actionfield_set_names,
.keyfield_names = vcap_keyfield_names, .keyfield_names = vcap_keyfield_names,
......
...@@ -190,6 +190,26 @@ static void lan966x_vcap_is2_port_keys(struct lan966x_port *port, ...@@ -190,6 +190,26 @@ static void lan966x_vcap_is2_port_keys(struct lan966x_port *port,
out->prf(out->dst, "\n"); out->prf(out->dst, "\n");
} }
static void lan966x_vcap_es0_port_keys(struct lan966x_port *port,
struct vcap_admin *admin,
struct vcap_output_print *out)
{
struct lan966x *lan966x = port->lan966x;
u32 val;
out->prf(out->dst, " port[%d] (%s): ", port->chip_port,
netdev_name(port->dev));
val = lan_rd(lan966x, REW_PORT_CFG(port->chip_port));
out->prf(out->dst, "\n state: ");
if (REW_PORT_CFG_ES0_EN_GET(val))
out->prf(out->dst, "on");
else
out->prf(out->dst, "off");
out->prf(out->dst, "\n");
}
int lan966x_vcap_port_info(struct net_device *dev, int lan966x_vcap_port_info(struct net_device *dev,
struct vcap_admin *admin, struct vcap_admin *admin,
struct vcap_output_print *out) struct vcap_output_print *out)
...@@ -210,6 +230,9 @@ int lan966x_vcap_port_info(struct net_device *dev, ...@@ -210,6 +230,9 @@ int lan966x_vcap_port_info(struct net_device *dev,
case VCAP_TYPE_IS1: case VCAP_TYPE_IS1:
lan966x_vcap_is1_port_keys(port, admin, out); lan966x_vcap_is1_port_keys(port, admin, out);
break; break;
case VCAP_TYPE_ES0:
lan966x_vcap_es0_port_keys(port, admin, out);
break;
default: default:
out->prf(out->dst, " no info\n"); out->prf(out->dst, " no info\n");
break; break;
......
...@@ -10,6 +10,12 @@ ...@@ -10,6 +10,12 @@
#define LAN966X_IS1_LOOKUPS 3 #define LAN966X_IS1_LOOKUPS 3
#define LAN966X_IS2_LOOKUPS 2 #define LAN966X_IS2_LOOKUPS 2
#define LAN966X_ES0_LOOKUPS 1
#define LAN966X_STAT_ESDX_GRN_BYTES 0x300
#define LAN966X_STAT_ESDX_GRN_PKTS 0x301
#define LAN966X_STAT_ESDX_YEL_BYTES 0x302
#define LAN966X_STAT_ESDX_YEL_PKTS 0x303
static struct lan966x_vcap_inst { static struct lan966x_vcap_inst {
enum vcap_type vtype; /* type of vcap */ enum vcap_type vtype; /* type of vcap */
...@@ -20,6 +26,14 @@ static struct lan966x_vcap_inst { ...@@ -20,6 +26,14 @@ static struct lan966x_vcap_inst {
int count; /* number of available addresses */ int count; /* number of available addresses */
bool ingress; /* is vcap in the ingress path */ bool ingress; /* is vcap in the ingress path */
} lan966x_vcap_inst_cfg[] = { } lan966x_vcap_inst_cfg[] = {
{
.vtype = VCAP_TYPE_ES0,
.tgt_inst = 0,
.lookups = LAN966X_ES0_LOOKUPS,
.first_cid = LAN966X_VCAP_CID_ES0_L0,
.last_cid = LAN966X_VCAP_CID_ES0_MAX,
.count = 64,
},
{ {
.vtype = VCAP_TYPE_IS1, /* IS1-0 */ .vtype = VCAP_TYPE_IS1, /* IS1-0 */
.tgt_inst = 1, .tgt_inst = 1,
...@@ -279,6 +293,8 @@ lan966x_vcap_validate_keyset(struct net_device *dev, ...@@ -279,6 +293,8 @@ lan966x_vcap_validate_keyset(struct net_device *dev,
err = lan966x_vcap_is2_get_port_keysets(dev, lookup, &keysetlist, err = lan966x_vcap_is2_get_port_keysets(dev, lookup, &keysetlist,
l3_proto); l3_proto);
break; break;
case VCAP_TYPE_ES0:
return kslist->keysets[0];
default: default:
pr_err("vcap type: %s not supported\n", pr_err("vcap type: %s not supported\n",
lan966x_vcaps[admin->vtype].name); lan966x_vcaps[admin->vtype].name);
...@@ -338,6 +354,14 @@ static void lan966x_vcap_is2_add_default_fields(struct lan966x_port *port, ...@@ -338,6 +354,14 @@ static void lan966x_vcap_is2_add_default_fields(struct lan966x_port *port,
VCAP_BIT_0); VCAP_BIT_0);
} }
static void lan966x_vcap_es0_add_default_fields(struct lan966x_port *port,
struct vcap_admin *admin,
struct vcap_rule *rule)
{
vcap_rule_add_key_u32(rule, VCAP_KF_IF_EGR_PORT_NO,
port->chip_port, GENMASK(4, 0));
}
static void lan966x_vcap_add_default_fields(struct net_device *dev, static void lan966x_vcap_add_default_fields(struct net_device *dev,
struct vcap_admin *admin, struct vcap_admin *admin,
struct vcap_rule *rule) struct vcap_rule *rule)
...@@ -351,6 +375,9 @@ static void lan966x_vcap_add_default_fields(struct net_device *dev, ...@@ -351,6 +375,9 @@ static void lan966x_vcap_add_default_fields(struct net_device *dev,
case VCAP_TYPE_IS2: case VCAP_TYPE_IS2:
lan966x_vcap_is2_add_default_fields(port, admin, rule); lan966x_vcap_is2_add_default_fields(port, admin, rule);
break; break;
case VCAP_TYPE_ES0:
lan966x_vcap_es0_add_default_fields(port, admin, rule);
break;
default: default:
pr_err("vcap type: %s not supported\n", pr_err("vcap type: %s not supported\n",
lan966x_vcaps[admin->vtype].name); lan966x_vcaps[admin->vtype].name);
...@@ -366,6 +393,40 @@ static void lan966x_vcap_cache_erase(struct vcap_admin *admin) ...@@ -366,6 +393,40 @@ static void lan966x_vcap_cache_erase(struct vcap_admin *admin)
memset(&admin->cache.counter, 0, sizeof(admin->cache.counter)); memset(&admin->cache.counter, 0, sizeof(admin->cache.counter));
} }
/* The ESDX counter is only used/incremented if the frame has been classified
* with an ISDX > 0 (e.g by a rule in IS0). This is not mentioned in the
* datasheet.
*/
static void lan966x_es0_read_esdx_counter(struct lan966x *lan966x,
struct vcap_admin *admin, u32 id)
{
u32 counter;
id = id & 0xff; /* counter limit */
mutex_lock(&lan966x->stats_lock);
lan_wr(SYS_STAT_CFG_STAT_VIEW_SET(id), lan966x, SYS_STAT_CFG);
counter = lan_rd(lan966x, SYS_CNT(LAN966X_STAT_ESDX_GRN_PKTS)) +
lan_rd(lan966x, SYS_CNT(LAN966X_STAT_ESDX_YEL_PKTS));
mutex_unlock(&lan966x->stats_lock);
if (counter)
admin->cache.counter = counter;
}
static void lan966x_es0_write_esdx_counter(struct lan966x *lan966x,
struct vcap_admin *admin, u32 id)
{
id = id & 0xff; /* counter limit */
mutex_lock(&lan966x->stats_lock);
lan_wr(SYS_STAT_CFG_STAT_VIEW_SET(id), lan966x, SYS_STAT_CFG);
lan_wr(0, lan966x, SYS_CNT(LAN966X_STAT_ESDX_GRN_BYTES));
lan_wr(admin->cache.counter, lan966x,
SYS_CNT(LAN966X_STAT_ESDX_GRN_PKTS));
lan_wr(0, lan966x, SYS_CNT(LAN966X_STAT_ESDX_YEL_BYTES));
lan_wr(0, lan966x, SYS_CNT(LAN966X_STAT_ESDX_YEL_PKTS));
mutex_unlock(&lan966x->stats_lock);
}
static void lan966x_vcap_cache_write(struct net_device *dev, static void lan966x_vcap_cache_write(struct net_device *dev,
struct vcap_admin *admin, struct vcap_admin *admin,
enum vcap_selection sel, enum vcap_selection sel,
...@@ -398,6 +459,9 @@ static void lan966x_vcap_cache_write(struct net_device *dev, ...@@ -398,6 +459,9 @@ static void lan966x_vcap_cache_write(struct net_device *dev,
admin->cache.sticky = admin->cache.counter > 0; admin->cache.sticky = admin->cache.counter > 0;
lan_wr(admin->cache.counter, lan966x, lan_wr(admin->cache.counter, lan966x,
VCAP_CNT_DAT(admin->tgt_inst, 0)); VCAP_CNT_DAT(admin->tgt_inst, 0));
if (admin->vtype == VCAP_TYPE_ES0)
lan966x_es0_write_esdx_counter(lan966x, admin, start);
break; break;
default: default:
break; break;
...@@ -437,6 +501,9 @@ static void lan966x_vcap_cache_read(struct net_device *dev, ...@@ -437,6 +501,9 @@ static void lan966x_vcap_cache_read(struct net_device *dev,
admin->cache.counter = admin->cache.counter =
lan_rd(lan966x, VCAP_CNT_DAT(instance, 0)); lan_rd(lan966x, VCAP_CNT_DAT(instance, 0));
admin->cache.sticky = admin->cache.counter > 0; admin->cache.sticky = admin->cache.counter > 0;
if (admin->vtype == VCAP_TYPE_ES0)
lan966x_es0_read_esdx_counter(lan966x, admin, start);
} }
} }
...@@ -625,6 +692,12 @@ static void lan966x_vcap_port_key_deselection(struct lan966x *lan966x, ...@@ -625,6 +692,12 @@ static void lan966x_vcap_port_key_deselection(struct lan966x *lan966x,
lan_wr(0, lan966x, ANA_VCAP_S2_CFG(p)); lan_wr(0, lan966x, ANA_VCAP_S2_CFG(p));
break; break;
case VCAP_TYPE_ES0:
for (int p = 0; p < lan966x->num_phys_ports; ++p)
lan_rmw(REW_PORT_CFG_ES0_EN_SET(false),
REW_PORT_CFG_ES0_EN, lan966x,
REW_PORT_CFG(p));
break;
default: default:
pr_err("vcap type: %s not supported\n", pr_err("vcap type: %s not supported\n",
lan966x_vcaps[admin->vtype].name); lan966x_vcaps[admin->vtype].name);
...@@ -674,9 +747,18 @@ int lan966x_vcap_init(struct lan966x *lan966x) ...@@ -674,9 +747,18 @@ int lan966x_vcap_init(struct lan966x *lan966x)
lan_rmw(ANA_VCAP_CFG_S1_ENA_SET(true), lan_rmw(ANA_VCAP_CFG_S1_ENA_SET(true),
ANA_VCAP_CFG_S1_ENA, lan966x, ANA_VCAP_CFG_S1_ENA, lan966x,
ANA_VCAP_CFG(lan966x->ports[p]->chip_port)); ANA_VCAP_CFG(lan966x->ports[p]->chip_port));
lan_rmw(REW_PORT_CFG_ES0_EN_SET(true),
REW_PORT_CFG_ES0_EN, lan966x,
REW_PORT_CFG(lan966x->ports[p]->chip_port));
} }
} }
/* Statistics: Use ESDX from ES0 if hit, otherwise no counting */
lan_rmw(REW_STAT_CFG_STAT_MODE_SET(1),
REW_STAT_CFG_STAT_MODE, lan966x,
REW_STAT_CFG);
lan966x->vcap_ctrl = ctrl; lan966x->vcap_ctrl = ctrl;
return 0; return 0;
......
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
* Microchip VCAP API * Microchip VCAP API
*/ */
/* This file is autogenerated by cml-utils 2023-02-16 11:41:14 +0100. /* This file is autogenerated by cml-utils 2023-03-13 10:16:42 +0100.
* Commit ID: be85f176b3a151fa748dcaf97c8824a5c2e065f3 * Commit ID: 259f0efd6d6d91bfbf62858de153cc757b6bffa3 (dirty)
*/ */
#ifndef __VCAP_AG_API__ #ifndef __VCAP_AG_API__
...@@ -51,6 +51,7 @@ enum vcap_keyfield_set { ...@@ -51,6 +51,7 @@ enum vcap_keyfield_set {
VCAP_KFS_RT, /* lan966x is1 X1 */ VCAP_KFS_RT, /* lan966x is1 X1 */
VCAP_KFS_SMAC_SIP4, /* lan966x is2 X1 */ VCAP_KFS_SMAC_SIP4, /* lan966x is2 X1 */
VCAP_KFS_SMAC_SIP6, /* lan966x is2 X2 */ VCAP_KFS_SMAC_SIP6, /* lan966x is2 X2 */
VCAP_KFS_VID, /* lan966x es0 X1 */
}; };
/* List of keyfields with description /* List of keyfields with description
...@@ -79,7 +80,7 @@ enum vcap_keyfield_set { ...@@ -79,7 +80,7 @@ enum vcap_keyfield_set {
* Second DEI in multiple vlan tags (inner tag) * Second DEI in multiple vlan tags (inner tag)
* VCAP_KF_8021Q_DEI2: W1, sparx5: is0 * VCAP_KF_8021Q_DEI2: W1, sparx5: is0
* Third DEI in multiple vlan tags (not always available) * Third DEI in multiple vlan tags (not always available)
* VCAP_KF_8021Q_DEI_CLS: W1, sparx5: is2/es2, lan966x: is2 * VCAP_KF_8021Q_DEI_CLS: W1, sparx5: is2/es2, lan966x: is2/es0
* Classified DEI * Classified DEI
* VCAP_KF_8021Q_PCP0: W3, sparx5: is0, lan966x: is1 * VCAP_KF_8021Q_PCP0: W3, sparx5: is0, lan966x: is1
* First PCP in multiple vlan tags (outer tag or default port tag) * First PCP in multiple vlan tags (outer tag or default port tag)
...@@ -87,7 +88,7 @@ enum vcap_keyfield_set { ...@@ -87,7 +88,7 @@ enum vcap_keyfield_set {
* Second PCP in multiple vlan tags (inner tag) * Second PCP in multiple vlan tags (inner tag)
* VCAP_KF_8021Q_PCP2: W3, sparx5: is0 * VCAP_KF_8021Q_PCP2: W3, sparx5: is0
* Third PCP in multiple vlan tags (not always available) * Third PCP in multiple vlan tags (not always available)
* VCAP_KF_8021Q_PCP_CLS: W3, sparx5: is2/es2, lan966x: is2 * VCAP_KF_8021Q_PCP_CLS: W3, sparx5: is2/es2, lan966x: is2/es0
* Classified PCP * Classified PCP
* VCAP_KF_8021Q_TPID: W3, sparx5: es0 * VCAP_KF_8021Q_TPID: W3, sparx5: es0
* TPID for outer tag: 0: Customer TPID 1: Service TPID (88A8 or programmable) * TPID for outer tag: 0: Customer TPID 1: Service TPID (88A8 or programmable)
...@@ -104,7 +105,7 @@ enum vcap_keyfield_set { ...@@ -104,7 +105,7 @@ enum vcap_keyfield_set {
* VCAP_KF_8021Q_VID2: W12, sparx5: is0 * VCAP_KF_8021Q_VID2: W12, sparx5: is0
* Third VID in multiple vlan tags (not always available) * Third VID in multiple vlan tags (not always available)
* VCAP_KF_8021Q_VID_CLS: sparx5 is2 W13, sparx5 es0 W13, sparx5 es2 W13, * VCAP_KF_8021Q_VID_CLS: sparx5 is2 W13, sparx5 es0 W13, sparx5 es2 W13,
* lan966x is2 W12 * lan966x is2 W12, lan966x es0 W12
* Classified VID * Classified VID
* VCAP_KF_8021Q_VLAN_DBL_TAGGED_IS: W1, lan966x: is1 * VCAP_KF_8021Q_VLAN_DBL_TAGGED_IS: W1, lan966x: is1
* Set if frame has two or more Q-tags. Independent of port VLAN awareness * Set if frame has two or more Q-tags. Independent of port VLAN awareness
...@@ -146,10 +147,10 @@ enum vcap_keyfield_set { ...@@ -146,10 +147,10 @@ enum vcap_keyfield_set {
* VCAP_KF_IF_EGR_PORT_MASK_RNG: W3, sparx5: es2 * VCAP_KF_IF_EGR_PORT_MASK_RNG: W3, sparx5: es2
* Select which 32 port group is available in IF_EGR_PORT (or virtual ports or * Select which 32 port group is available in IF_EGR_PORT (or virtual ports or
* CPU queue) * CPU queue)
* VCAP_KF_IF_EGR_PORT_NO: W7, sparx5: es0 * VCAP_KF_IF_EGR_PORT_NO: sparx5 es0 W7, lan966x es0 W4
* Egress port number * Egress port number
* VCAP_KF_IF_IGR_PORT: sparx5 is0 W7, sparx5 es2 W9, lan966x is1 W3, lan966x * VCAP_KF_IF_IGR_PORT: sparx5 is0 W7, sparx5 es2 W9, lan966x is1 W3, lan966x
* is2 W4 * is2 W4, lan966x es0 W4
* Sparx5: Logical ingress port number retrieved from * Sparx5: Logical ingress port number retrieved from
* ANA_CL::PORT_ID_CFG.LPORT_NUM or ERLEG, LAN966x: ingress port nunmber * ANA_CL::PORT_ID_CFG.LPORT_NUM or ERLEG, LAN966x: ingress port nunmber
* VCAP_KF_IF_IGR_PORT_MASK: sparx5 is0 W65, sparx5 is2 W32, sparx5 is2 W65, * VCAP_KF_IF_IGR_PORT_MASK: sparx5 is0 W65, sparx5 is2 W32, sparx5 is2 W65,
...@@ -178,11 +179,12 @@ enum vcap_keyfield_set { ...@@ -178,11 +179,12 @@ enum vcap_keyfield_set {
* Payload after IPv6 header * Payload after IPv6 header
* VCAP_KF_IP_SNAP_IS: W1, sparx5: is0, lan966x: is1 * VCAP_KF_IP_SNAP_IS: W1, sparx5: is0, lan966x: is1
* Set if frame is IPv4, IPv6, or SNAP frame * Set if frame is IPv4, IPv6, or SNAP frame
* VCAP_KF_ISDX_CLS: W12, sparx5: is2/es0/es2 * VCAP_KF_ISDX_CLS: sparx5 is2 W12, sparx5 es0 W12, sparx5 es2 W12, lan966x es0
* W8
* Classified ISDX * Classified ISDX
* VCAP_KF_ISDX_GT0_IS: W1, sparx5: is2/es0/es2, lan966x: is2 * VCAP_KF_ISDX_GT0_IS: W1, sparx5: is2/es0/es2, lan966x: is2/es0
* Set if classified ISDX > 0 * Set if classified ISDX > 0
* VCAP_KF_L2_BC_IS: W1, sparx5: is0/is2/es2, lan966x: is1/is2 * VCAP_KF_L2_BC_IS: W1, sparx5: is0/is2/es2, lan966x: is1/is2/es0
* Set if frame's destination MAC address is the broadcast address * Set if frame's destination MAC address is the broadcast address
* (FF-FF-FF-FF-FF-FF). * (FF-FF-FF-FF-FF-FF).
* VCAP_KF_L2_DMAC: W48, sparx5: is0/is2/es2, lan966x: is1/is2 * VCAP_KF_L2_DMAC: W48, sparx5: is0/is2/es2, lan966x: is1/is2
...@@ -195,7 +197,7 @@ enum vcap_keyfield_set { ...@@ -195,7 +197,7 @@ enum vcap_keyfield_set {
* LLC header and data after up to two VLAN tags and the type/length field * LLC header and data after up to two VLAN tags and the type/length field
* VCAP_KF_L2_MAC: W48, lan966x: is1 * VCAP_KF_L2_MAC: W48, lan966x: is1
* MAC address (FIRST=1: SMAC, FIRST=0: DMAC) * MAC address (FIRST=1: SMAC, FIRST=0: DMAC)
* VCAP_KF_L2_MC_IS: W1, sparx5: is0/is2/es2, lan966x: is1/is2 * VCAP_KF_L2_MC_IS: W1, sparx5: is0/is2/es2, lan966x: is1/is2/es0
* Set if frame's destination MAC address is a multicast address (bit 40 = 1). * Set if frame's destination MAC address is a multicast address (bit 40 = 1).
* VCAP_KF_L2_PAYLOAD0: W16, lan966x: is2 * VCAP_KF_L2_PAYLOAD0: W16, lan966x: is2
* Payload bytes 0-1 after the frame's EtherType * Payload bytes 0-1 after the frame's EtherType
...@@ -213,7 +215,7 @@ enum vcap_keyfield_set { ...@@ -213,7 +215,7 @@ enum vcap_keyfield_set {
* SNAP header after LLC header (AA-AA-03) * SNAP header after LLC header (AA-AA-03)
* VCAP_KF_L3_DIP_EQ_SIP_IS: W1, sparx5: is2/es2, lan966x: is2 * VCAP_KF_L3_DIP_EQ_SIP_IS: W1, sparx5: is2/es2, lan966x: is2
* Set if Src IP matches Dst IP address * Set if Src IP matches Dst IP address
* VCAP_KF_L3_DPL_CLS: W1, sparx5: es0/es2 * VCAP_KF_L3_DPL_CLS: W1, sparx5: es0/es2, lan966x: es0
* The frames drop precedence level * The frames drop precedence level
* VCAP_KF_L3_DSCP: W6, sparx5: is0, lan966x: is1 * VCAP_KF_L3_DSCP: W6, sparx5: is0, lan966x: is1
* Frame's DSCP value * Frame's DSCP value
...@@ -330,8 +332,12 @@ enum vcap_keyfield_set { ...@@ -330,8 +332,12 @@ enum vcap_keyfield_set {
* Frame's OAM version * Frame's OAM version
* VCAP_KF_OAM_Y1731_IS: W1, sparx5: is2/es2, lan966x: is2 * VCAP_KF_OAM_Y1731_IS: W1, sparx5: is2/es2, lan966x: is2
* Set if frame's EtherType = 0x8902 * Set if frame's EtherType = 0x8902
* VCAP_KF_PDU_TYPE: W4, lan966x: es0
* PDU type value (none, OAM CCM, MRP, DLR, RTE, IPv4, IPv6, OAM non-CCM)
* VCAP_KF_PROT_ACTIVE: W1, sparx5: es0/es2 * VCAP_KF_PROT_ACTIVE: W1, sparx5: es0/es2
* Protection is active * Protection is active
* VCAP_KF_RTP_ID: W10, lan966x: es0
* Classified RTP_ID
* VCAP_KF_RT_FRMID: W32, lan966x: is1 * VCAP_KF_RT_FRMID: W32, lan966x: is1
* Profinet or OPC-UA FrameId * Profinet or OPC-UA FrameId
* VCAP_KF_RT_TYPE: W2, lan966x: is1 * VCAP_KF_RT_TYPE: W2, lan966x: is1
...@@ -470,7 +476,9 @@ enum vcap_key_field { ...@@ -470,7 +476,9 @@ enum vcap_key_field {
VCAP_KF_OAM_OPCODE, VCAP_KF_OAM_OPCODE,
VCAP_KF_OAM_VER, VCAP_KF_OAM_VER,
VCAP_KF_OAM_Y1731_IS, VCAP_KF_OAM_Y1731_IS,
VCAP_KF_PDU_TYPE,
VCAP_KF_PROT_ACTIVE, VCAP_KF_PROT_ACTIVE,
VCAP_KF_RTP_ID,
VCAP_KF_RT_FRMID, VCAP_KF_RT_FRMID,
VCAP_KF_RT_TYPE, VCAP_KF_RT_TYPE,
VCAP_KF_RT_VLAN_IDX, VCAP_KF_RT_VLAN_IDX,
...@@ -489,6 +497,7 @@ enum vcap_actionfield_set { ...@@ -489,6 +497,7 @@ enum vcap_actionfield_set {
VCAP_AFS_FULL, /* sparx5 is0 X3 */ VCAP_AFS_FULL, /* sparx5 is0 X3 */
VCAP_AFS_S1, /* lan966x is1 X1 */ VCAP_AFS_S1, /* lan966x is1 X1 */
VCAP_AFS_SMAC_SIP, /* lan966x is2 X1 */ VCAP_AFS_SMAC_SIP, /* lan966x is2 X1 */
VCAP_AFS_VID, /* lan966x es0 X1 */
}; };
/* List of actionfields with description /* List of actionfields with description
...@@ -523,9 +532,9 @@ enum vcap_actionfield_set { ...@@ -523,9 +532,9 @@ enum vcap_actionfield_set {
* while bits 1:0 control first lookup. Encoding per lookup: 0: Disabled. 1: * while bits 1:0 control first lookup. Encoding per lookup: 0: Disabled. 1:
* Extract 40 bytes after position corresponding to the location of the IPv4 * Extract 40 bytes after position corresponding to the location of the IPv4
* header and use as key. 2: Extract 40 bytes after SMAC and use as key * header and use as key. 2: Extract 40 bytes after SMAC and use as key
* VCAP_AF_DEI_A_VAL: W1, sparx5: es0 * VCAP_AF_DEI_A_VAL: W1, sparx5: es0, lan966x: es0
* DEI used in ES0 tag A. See TAG_A_DEI_SEL. * DEI used in ES0 tag A. See TAG_A_DEI_SEL.
* VCAP_AF_DEI_B_VAL: W1, sparx5: es0 * VCAP_AF_DEI_B_VAL: W1, sparx5: es0, lan966x: es0
* DEI used in ES0 tag B. See TAG_B_DEI_SEL. * DEI used in ES0 tag B. See TAG_B_DEI_SEL.
* VCAP_AF_DEI_C_VAL: W1, sparx5: es0 * VCAP_AF_DEI_C_VAL: W1, sparx5: es0
* DEI used in ES0 tag C. See TAG_C_DEI_SEL. * DEI used in ES0 tag C. See TAG_C_DEI_SEL.
...@@ -556,7 +565,7 @@ enum vcap_actionfield_set { ...@@ -556,7 +565,7 @@ enum vcap_actionfield_set {
* VCAP_AF_ES2_REW_CMD: W3, sparx5: es2 * VCAP_AF_ES2_REW_CMD: W3, sparx5: es2
* Command forwarded to REW: 0: No action. 1: SWAP MAC addresses. 2: Do L2CP * Command forwarded to REW: 0: No action. 1: SWAP MAC addresses. 2: Do L2CP
* DMAC translation when entering or leaving a tunnel. * DMAC translation when entering or leaving a tunnel.
* VCAP_AF_ESDX: W13, sparx5: es0 * VCAP_AF_ESDX: sparx5 es0 W13, lan966x es0 W8
* Egress counter index. Used to index egress counter set as defined in * Egress counter index. Used to index egress counter set as defined in
* REW::STAT_CFG. * REW::STAT_CFG.
* VCAP_AF_FWD_KILL_ENA: W1, lan966x: is2 * VCAP_AF_FWD_KILL_ENA: W1, lan966x: is2
...@@ -652,9 +661,9 @@ enum vcap_actionfield_set { ...@@ -652,9 +661,9 @@ enum vcap_actionfield_set {
* (input) AND ~PAG_OVERRIDE_MASK) OR (PAG_VAL AND PAG_OVERRIDE_MASK) * (input) AND ~PAG_OVERRIDE_MASK) OR (PAG_VAL AND PAG_OVERRIDE_MASK)
* VCAP_AF_PAG_VAL: W8, sparx5: is0, lan966x: is1 * VCAP_AF_PAG_VAL: W8, sparx5: is0, lan966x: is1
* See PAG_OVERRIDE_MASK. * See PAG_OVERRIDE_MASK.
* VCAP_AF_PCP_A_VAL: W3, sparx5: es0 * VCAP_AF_PCP_A_VAL: W3, sparx5: es0, lan966x: es0
* PCP used in ES0 tag A. See TAG_A_PCP_SEL. * PCP used in ES0 tag A. See TAG_A_PCP_SEL.
* VCAP_AF_PCP_B_VAL: W3, sparx5: es0 * VCAP_AF_PCP_B_VAL: W3, sparx5: es0, lan966x: es0
* PCP used in ES0 tag B. See TAG_B_PCP_SEL. * PCP used in ES0 tag B. See TAG_B_PCP_SEL.
* VCAP_AF_PCP_C_VAL: W3, sparx5: es0 * VCAP_AF_PCP_C_VAL: W3, sparx5: es0
* PCP used in ES0 tag C. See TAG_C_PCP_SEL. * PCP used in ES0 tag C. See TAG_C_PCP_SEL.
...@@ -691,10 +700,10 @@ enum vcap_actionfield_set { ...@@ -691,10 +700,10 @@ enum vcap_actionfield_set {
* Selects tag C mode: 0: Do not push tag C. 1: Push tag C if * Selects tag C mode: 0: Do not push tag C. 1: Push tag C if
* IFH.VSTAX.TAG.WAS_TAGGED = 1. 2: Push tag C if IFH.VSTAX.TAG.WAS_TAGGED = 0. * IFH.VSTAX.TAG.WAS_TAGGED = 1. 2: Push tag C if IFH.VSTAX.TAG.WAS_TAGGED = 0.
* 3: Push tag C if UNTAG_VID_ENA = 0 or (C-TAG.VID ! = VID_C_VAL). * 3: Push tag C if UNTAG_VID_ENA = 0 or (C-TAG.VID ! = VID_C_VAL).
* VCAP_AF_PUSH_INNER_TAG: W1, sparx5: es0 * VCAP_AF_PUSH_INNER_TAG: W1, sparx5: es0, lan966x: es0
* Controls inner tagging. 0: Do not push ES0 tag B as inner tag. 1: Push ES0 * Controls inner tagging. 0: Do not push ES0 tag B as inner tag. 1: Push ES0
* tag B as inner tag. * tag B as inner tag.
* VCAP_AF_PUSH_OUTER_TAG: W2, sparx5: es0 * VCAP_AF_PUSH_OUTER_TAG: W2, sparx5: es0, lan966x: es0
* Controls outer tagging. 0: No ES0 tag A: Port tag is allowed if enabled on * Controls outer tagging. 0: No ES0 tag A: Port tag is allowed if enabled on
* port. 1: ES0 tag A: Push ES0 tag A. No port tag. 2: Force port tag: Always * port. 1: ES0 tag A: Push ES0 tag A. No port tag. 2: Force port tag: Always
* push port tag. No ES0 tag A. 3: Force untag: Never push port tag or ES0 tag * push port tag. No ES0 tag A. 3: Force untag: Never push port tag or ES0 tag
...@@ -720,29 +729,29 @@ enum vcap_actionfield_set { ...@@ -720,29 +729,29 @@ enum vcap_actionfield_set {
* VCAP_AF_SWAP_MACS_ENA: W1, sparx5: es0 * VCAP_AF_SWAP_MACS_ENA: W1, sparx5: es0
* This setting is only active when FWD_SEL = 1 or FWD_SEL = 2 and PIPELINE_ACT * This setting is only active when FWD_SEL = 1 or FWD_SEL = 2 and PIPELINE_ACT
* = LBK_ASM. 0: No action. 1: Swap MACs and clear bit 40 in new SMAC. * = LBK_ASM. 0: No action. 1: Swap MACs and clear bit 40 in new SMAC.
* VCAP_AF_TAG_A_DEI_SEL: W3, sparx5: es0 * VCAP_AF_TAG_A_DEI_SEL: sparx5 es0 W3, lan966x es0 W2
* Selects PCP for ES0 tag A. 0: Classified DEI. 1: DEI_A_VAL. 2: DP and QoS * Selects PCP for ES0 tag A. 0: Classified DEI. 1: DEI_A_VAL. 2: DP and QoS
* mapped to PCP (per port table). 3: DP. * mapped to PCP (per port table). 3: DP.
* VCAP_AF_TAG_A_PCP_SEL: W3, sparx5: es0 * VCAP_AF_TAG_A_PCP_SEL: sparx5 es0 W3, lan966x es0 W2
* Selects PCP for ES0 tag A. 0: Classified PCP. 1: PCP_A_VAL. 2: DP and QoS * Selects PCP for ES0 tag A. 0: Classified PCP. 1: PCP_A_VAL. 2: DP and QoS
* mapped to PCP (per port table). 3: QoS class. * mapped to PCP (per port table). 3: QoS class.
* VCAP_AF_TAG_A_TPID_SEL: W3, sparx5: es0 * VCAP_AF_TAG_A_TPID_SEL: sparx5 es0 W3, lan966x es0 W2
* Selects TPID for ES0 tag A: 0: 0x8100. 1: 0x88A8. 2: Custom * Selects TPID for ES0 tag A: 0: 0x8100. 1: 0x88A8. 2: Custom
* (REW:PORT:PORT_VLAN_CFG.PORT_TPID). 3: If IFH.TAG_TYPE = 0 then 0x8100 else * (REW:PORT:PORT_VLAN_CFG.PORT_TPID). 3: If IFH.TAG_TYPE = 0 then 0x8100 else
* custom. * custom.
* VCAP_AF_TAG_A_VID_SEL: W2, sparx5: es0 * VCAP_AF_TAG_A_VID_SEL: sparx5 es0 W2, lan966x es0 W1
* Selects VID for ES0 tag A. 0: Classified VID + VID_A_VAL. 1: VID_A_VAL. * Selects VID for ES0 tag A. 0: Classified VID + VID_A_VAL. 1: VID_A_VAL.
* VCAP_AF_TAG_B_DEI_SEL: W3, sparx5: es0 * VCAP_AF_TAG_B_DEI_SEL: sparx5 es0 W3, lan966x es0 W2
* Selects PCP for ES0 tag B. 0: Classified DEI. 1: DEI_B_VAL. 2: DP and QoS * Selects PCP for ES0 tag B. 0: Classified DEI. 1: DEI_B_VAL. 2: DP and QoS
* mapped to PCP (per port table). 3: DP. * mapped to PCP (per port table). 3: DP.
* VCAP_AF_TAG_B_PCP_SEL: W3, sparx5: es0 * VCAP_AF_TAG_B_PCP_SEL: sparx5 es0 W3, lan966x es0 W2
* Selects PCP for ES0 tag B. 0: Classified PCP. 1: PCP_B_VAL. 2: DP and QoS * Selects PCP for ES0 tag B. 0: Classified PCP. 1: PCP_B_VAL. 2: DP and QoS
* mapped to PCP (per port table). 3: QoS class. * mapped to PCP (per port table). 3: QoS class.
* VCAP_AF_TAG_B_TPID_SEL: W3, sparx5: es0 * VCAP_AF_TAG_B_TPID_SEL: sparx5 es0 W3, lan966x es0 W2
* Selects TPID for ES0 tag B. 0: 0x8100. 1: 0x88A8. 2: Custom * Selects TPID for ES0 tag B. 0: 0x8100. 1: 0x88A8. 2: Custom
* (REW:PORT:PORT_VLAN_CFG.PORT_TPID). 3: If IFH.TAG_TYPE = 0 then 0x8100 else * (REW:PORT:PORT_VLAN_CFG.PORT_TPID). 3: If IFH.TAG_TYPE = 0 then 0x8100 else
* custom. * custom.
* VCAP_AF_TAG_B_VID_SEL: W2, sparx5: es0 * VCAP_AF_TAG_B_VID_SEL: sparx5 es0 W2, lan966x es0 W1
* Selects VID for ES0 tag B. 0: Classified VID + VID_B_VAL. 1: VID_B_VAL. * Selects VID for ES0 tag B. 0: Classified VID + VID_B_VAL. 1: VID_B_VAL.
* VCAP_AF_TAG_C_DEI_SEL: W3, sparx5: es0 * VCAP_AF_TAG_C_DEI_SEL: W3, sparx5: es0
* Selects DEI source for ES0 tag C. 0: Classified DEI. 1: DEI_C_VAL. 2: * Selects DEI source for ES0 tag C. 0: Classified DEI. 1: DEI_C_VAL. 2:
...@@ -770,9 +779,9 @@ enum vcap_actionfield_set { ...@@ -770,9 +779,9 @@ enum vcap_actionfield_set {
* VCAP_AF_UNTAG_VID_ENA: W1, sparx5: es0 * VCAP_AF_UNTAG_VID_ENA: W1, sparx5: es0
* Controls insertion of tag C. Untag or insert mode can be selected. See * Controls insertion of tag C. Untag or insert mode can be selected. See
* PUSH_CUSTOMER_TAG. * PUSH_CUSTOMER_TAG.
* VCAP_AF_VID_A_VAL: W12, sparx5: es0 * VCAP_AF_VID_A_VAL: W12, sparx5: es0, lan966x: es0
* VID used in ES0 tag A. See TAG_A_VID_SEL. * VID used in ES0 tag A. See TAG_A_VID_SEL.
* VCAP_AF_VID_B_VAL: W12, sparx5: es0 * VCAP_AF_VID_B_VAL: W12, sparx5: es0, lan966x: es0
* VID used in ES0 tag B. See TAG_B_VID_SEL. * VID used in ES0 tag B. See TAG_B_VID_SEL.
* VCAP_AF_VID_C_VAL: W12, sparx5: es0 * VCAP_AF_VID_C_VAL: W12, sparx5: es0
* VID used in ES0 tag C. See TAG_C_VID_SEL. * VID used in ES0 tag C. See TAG_C_VID_SEL.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment