[PATCH net-next 2/9] net: microchip: vcap: add lpm vcap to autogen vcap api
Jens Emil Schulz Østergaard
jensemil.schulzostergaard at microchip.com
Fri Jun 12 05:37:11 PDT 2026
Add autogenerated VCAP rule encoding metadata, and VCAP parameters for
the LPM VCAP used for L3 routing.
Reviewed-by: Daniel Machon <daniel.machon at microchip.com>
Reviewed-by: Steen Hegelund <Steen.Hegelund at microchip.com>
Signed-off-by: Jens Emil Schulz Østergaard <jensemil.schulzostergaard at microchip.com>
---
.../microchip/sparx5/lan969x/lan969x_vcap_ag_api.c | 373 ++++++++++++++++++++-
.../ethernet/microchip/sparx5/sparx5_vcap_ag_api.c | 373 ++++++++++++++++++++-
.../ethernet/microchip/sparx5/sparx5_vcap_ag_api.h | 6 +-
drivers/net/ethernet/microchip/vcap/vcap_ag_api.h | 94 +++++-
.../net/ethernet/microchip/vcap/vcap_model_kunit.c | 6 +-
5 files changed, 832 insertions(+), 20 deletions(-)
diff --git a/drivers/net/ethernet/microchip/sparx5/lan969x/lan969x_vcap_ag_api.c b/drivers/net/ethernet/microchip/sparx5/lan969x/lan969x_vcap_ag_api.c
index 7acc5bcf337a..e623b1dbe9cb 100644
--- a/drivers/net/ethernet/microchip/sparx5/lan969x/lan969x_vcap_ag_api.c
+++ b/drivers/net/ethernet/microchip/sparx5/lan969x/lan969x_vcap_ag_api.c
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: BSD-3-Clause
-/* Copyright (C) 2024 Microchip Technology Inc. and its subsidiaries.
+/* Copyright (C) 2026 Microchip Technology Inc. and its subsidiaries.
* Microchip VCAP API
*/
-/* This file is autogenerated by cml-utils 2024-10-07 11:10:56 +0200.
- * Commit ID: b5ddc8e244eb2481a9524f1ddc630a8b41e7c391
+/* This file is autogenerated by cml-utils 2026-04-28 13:55:50 +0200.
+ * Commit ID: cd2494df16a1d3b14f650f720f6a8126b88b553a
*/
#include <linux/types.h>
@@ -1380,6 +1380,83 @@ static const struct vcap_field es0_isdx_keyfield[] = {
},
};
+static const struct vcap_field lpm_sgl_ip4_keyfield[] = {
+ [VCAP_KF_DST_FLAG] = {
+ .type = VCAP_FIELD_BIT,
+ .offset = 0,
+ .width = 1,
+ },
+ [VCAP_KF_AFFIX] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 1,
+ .width = 10,
+ },
+ [VCAP_KF_IP4_XIP] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 11,
+ .width = 32,
+ },
+};
+
+static const struct vcap_field lpm_dbl_ip4_keyfield[] = {
+ [VCAP_KF_TYPE] = {
+ .type = VCAP_FIELD_BIT,
+ .offset = 0,
+ .width = 1,
+ },
+ [VCAP_KF_AFFIX] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 1,
+ .width = 10,
+ },
+ [VCAP_KF_IP4_SIP] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 11,
+ .width = 32,
+ },
+ [VCAP_KF_IP4_DIP] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 43,
+ .width = 32,
+ },
+};
+
+static const struct vcap_field lpm_sgl_ip6_keyfield[] = {
+ [VCAP_KF_DST_FLAG] = {
+ .type = VCAP_FIELD_BIT,
+ .offset = 0,
+ .width = 1,
+ },
+ [VCAP_KF_AFFIX] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 1,
+ .width = 10,
+ },
+ [VCAP_KF_IP6_XIP] = {
+ .type = VCAP_FIELD_U128,
+ .offset = 11,
+ .width = 128,
+ },
+};
+
+static const struct vcap_field lpm_dbl_ip6_keyfield[] = {
+ [VCAP_KF_AFFIX] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 0,
+ .width = 10,
+ },
+ [VCAP_KF_IP6_SIP] = {
+ .type = VCAP_FIELD_U128,
+ .offset = 10,
+ .width = 128,
+ },
+ [VCAP_KF_IP6_DIP] = {
+ .type = VCAP_FIELD_U128,
+ .offset = 138,
+ .width = 128,
+ },
+};
+
static const struct vcap_field es2_mac_etype_keyfield[] = {
[VCAP_KF_TYPE] = {
.type = VCAP_FIELD_U32,
@@ -2338,6 +2415,29 @@ static const struct vcap_set es0_keyfield_set[] = {
},
};
+static const struct vcap_set lpm_keyfield_set[] = {
+ [VCAP_KFS_SGL_IP4] = {
+ .type_id = -1,
+ .sw_per_item = 1,
+ .sw_cnt = 12,
+ },
+ [VCAP_KFS_DBL_IP4] = {
+ .type_id = 0,
+ .sw_per_item = 2,
+ .sw_cnt = 6,
+ },
+ [VCAP_KFS_SGL_IP6] = {
+ .type_id = -1,
+ .sw_per_item = 3,
+ .sw_cnt = 4,
+ },
+ [VCAP_KFS_DBL_IP6] = {
+ .type_id = -1,
+ .sw_per_item = 6,
+ .sw_cnt = 2,
+ },
+};
+
static const struct vcap_set es2_keyfield_set[] = {
[VCAP_KFS_MAC_ETYPE] = {
.type_id = 0,
@@ -2390,6 +2490,13 @@ static const struct vcap_field *es0_keyfield_set_map[] = {
[VCAP_KFS_ISDX] = es0_isdx_keyfield,
};
+static const struct vcap_field *lpm_keyfield_set_map[] = {
+ [VCAP_KFS_SGL_IP4] = lpm_sgl_ip4_keyfield,
+ [VCAP_KFS_DBL_IP4] = lpm_dbl_ip4_keyfield,
+ [VCAP_KFS_SGL_IP6] = lpm_sgl_ip6_keyfield,
+ [VCAP_KFS_DBL_IP6] = lpm_dbl_ip6_keyfield,
+};
+
static const struct vcap_field *es2_keyfield_set_map[] = {
[VCAP_KFS_MAC_ETYPE] = es2_mac_etype_keyfield,
[VCAP_KFS_ARP] = es2_arp_keyfield,
@@ -2418,6 +2525,13 @@ static int es0_keyfield_set_map_size[] = {
[VCAP_KFS_ISDX] = ARRAY_SIZE(es0_isdx_keyfield),
};
+static int lpm_keyfield_set_map_size[] = {
+ [VCAP_KFS_SGL_IP4] = ARRAY_SIZE(lpm_sgl_ip4_keyfield),
+ [VCAP_KFS_DBL_IP4] = ARRAY_SIZE(lpm_dbl_ip4_keyfield),
+ [VCAP_KFS_SGL_IP6] = ARRAY_SIZE(lpm_sgl_ip6_keyfield),
+ [VCAP_KFS_DBL_IP6] = ARRAY_SIZE(lpm_dbl_ip6_keyfield),
+};
+
static int es2_keyfield_set_map_size[] = {
[VCAP_KFS_MAC_ETYPE] = ARRAY_SIZE(es2_mac_etype_keyfield),
[VCAP_KFS_ARP] = ARRAY_SIZE(es2_arp_keyfield),
@@ -2993,6 +3107,92 @@ static const struct vcap_field es0_es0_actionfield[] = {
},
};
+static const struct vcap_field lpm_arp_ptr_actionfield[] = {
+ [VCAP_AF_TYPE] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 0,
+ .width = 2,
+ },
+ [VCAP_AF_ARP_PTR] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 2,
+ .width = 10,
+ },
+ [VCAP_AF_ARP_PTR_REMAP_ENA] = {
+ .type = VCAP_FIELD_BIT,
+ .offset = 12,
+ .width = 1,
+ },
+ [VCAP_AF_ECMP_CNT] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 13,
+ .width = 4,
+ },
+ [VCAP_AF_RGID] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 17,
+ .width = 3,
+ },
+};
+
+static const struct vcap_field lpm_arp_entry_actionfield[] = {
+ [VCAP_AF_TYPE] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 0,
+ .width = 2,
+ },
+ [VCAP_AF_MAC_MSB] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 2,
+ .width = 16,
+ },
+ [VCAP_AF_MAC_LSB] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 18,
+ .width = 32,
+ },
+ [VCAP_AF_ARP_VMID] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 50,
+ .width = 7,
+ },
+ [VCAP_AF_ZERO_DMAC_CPU_QU] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 57,
+ .width = 3,
+ },
+ [VCAP_AF_SIP_RPF_ENA] = {
+ .type = VCAP_FIELD_BIT,
+ .offset = 60,
+ .width = 1,
+ },
+ [VCAP_AF_SECUR_MATCH_VMID_ENA] = {
+ .type = VCAP_FIELD_BIT,
+ .offset = 61,
+ .width = 1,
+ },
+ [VCAP_AF_SECUR_MATCH_MAC_ENA] = {
+ .type = VCAP_FIELD_BIT,
+ .offset = 62,
+ .width = 1,
+ },
+ [VCAP_AF_ARP_ENA] = {
+ .type = VCAP_FIELD_BIT,
+ .offset = 63,
+ .width = 1,
+ },
+ [VCAP_AF_ENCAP_ID] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 64,
+ .width = 8,
+ },
+ [VCAP_AF_RSDX] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 72,
+ .width = 10,
+ },
+};
+
static const struct vcap_field es2_base_type_actionfield[] = {
[VCAP_AF_HIT_ME_ONCE] = {
.type = VCAP_FIELD_BIT,
@@ -3101,6 +3301,19 @@ static const struct vcap_set es0_actionfield_set[] = {
},
};
+static const struct vcap_set lpm_actionfield_set[] = {
+ [VCAP_AFS_ARP_PTR] = {
+ .type_id = 0,
+ .sw_per_item = 1,
+ .sw_cnt = 12,
+ },
+ [VCAP_AFS_ARP_ENTRY] = {
+ .type_id = 2,
+ .sw_per_item = 1,
+ .sw_cnt = 12,
+ },
+};
+
static const struct vcap_set es2_actionfield_set[] = {
[VCAP_AFS_BASE_TYPE] = {
.type_id = -1,
@@ -3124,6 +3337,11 @@ static const struct vcap_field *es0_actionfield_set_map[] = {
[VCAP_AFS_ES0] = es0_es0_actionfield,
};
+static const struct vcap_field *lpm_actionfield_set_map[] = {
+ [VCAP_AFS_ARP_PTR] = lpm_arp_ptr_actionfield,
+ [VCAP_AFS_ARP_ENTRY] = lpm_arp_entry_actionfield,
+};
+
static const struct vcap_field *es2_actionfield_set_map[] = {
[VCAP_AFS_BASE_TYPE] = es2_base_type_actionfield,
};
@@ -3143,6 +3361,11 @@ static int es0_actionfield_set_map_size[] = {
[VCAP_AFS_ES0] = ARRAY_SIZE(es0_es0_actionfield),
};
+static int lpm_actionfield_set_map_size[] = {
+ [VCAP_AFS_ARP_PTR] = ARRAY_SIZE(lpm_arp_ptr_actionfield),
+ [VCAP_AFS_ARP_ENTRY] = ARRAY_SIZE(lpm_arp_entry_actionfield),
+};
+
static int es2_actionfield_set_map_size[] = {
[VCAP_AFS_BASE_TYPE] = ARRAY_SIZE(es2_base_type_actionfield),
};
@@ -3308,6 +3531,82 @@ static const struct vcap_typegroup es0_x1_keyfield_set_typegroups[] = {
{}
};
+static const struct vcap_typegroup lpm_x6_keyfield_set_typegroups[] = {
+ {
+ .offset = 0,
+ .width = 4,
+ .value = 8,
+ },
+ {
+ .offset = 52,
+ .width = 1,
+ .value = 0,
+ },
+ {
+ .offset = 104,
+ .width = 2,
+ .value = 0,
+ },
+ {
+ .offset = 156,
+ .width = 3,
+ .value = 0,
+ },
+ {
+ .offset = 208,
+ .width = 2,
+ .value = 0,
+ },
+ {
+ .offset = 260,
+ .width = 1,
+ .value = 0,
+ },
+ {}
+};
+
+static const struct vcap_typegroup lpm_x3_keyfield_set_typegroups[] = {
+ {
+ .offset = 0,
+ .width = 3,
+ .value = 4,
+ },
+ {
+ .offset = 52,
+ .width = 2,
+ .value = 0,
+ },
+ {
+ .offset = 104,
+ .width = 2,
+ .value = 0,
+ },
+ {}
+};
+
+static const struct vcap_typegroup lpm_x2_keyfield_set_typegroups[] = {
+ {
+ .offset = 0,
+ .width = 2,
+ .value = 2,
+ },
+ {
+ .offset = 52,
+ .width = 1,
+ .value = 0,
+ },
+ {}
+};
+
+static const struct vcap_typegroup lpm_x1_keyfield_set_typegroups[] = {
+ {
+ .offset = 0,
+ .width = 1,
+ .value = 1,
+ },
+ {}
+};
+
static const struct vcap_typegroup es2_x12_keyfield_set_typegroups[] = {
{
.offset = 0,
@@ -3376,6 +3675,14 @@ static const struct vcap_typegroup *es0_keyfield_set_typegroups[] = {
[2] = NULL,
};
+static const struct vcap_typegroup *lpm_keyfield_set_typegroups[] = {
+ [6] = lpm_x6_keyfield_set_typegroups,
+ [3] = lpm_x3_keyfield_set_typegroups,
+ [2] = lpm_x2_keyfield_set_typegroups,
+ [1] = lpm_x1_keyfield_set_typegroups,
+ [13] = NULL,
+};
+
static const struct vcap_typegroup *es2_keyfield_set_typegroups[] = {
[12] = es2_x12_keyfield_set_typegroups,
[6] = es2_x6_keyfield_set_typegroups,
@@ -3453,6 +3760,10 @@ static const struct vcap_typegroup es0_x1_actionfield_set_typegroups[] = {
{}
};
+static const struct vcap_typegroup lpm_x1_actionfield_set_typegroups[] = {
+ {}
+};
+
static const struct vcap_typegroup es2_x3_actionfield_set_typegroups[] = {
{
.offset = 0,
@@ -3494,6 +3805,11 @@ static const struct vcap_typegroup *es0_actionfield_set_typegroups[] = {
[2] = NULL,
};
+static const struct vcap_typegroup *lpm_actionfield_set_typegroups[] = {
+ [1] = lpm_x1_actionfield_set_typegroups,
+ [13] = NULL,
+};
+
static const struct vcap_typegroup *es2_actionfield_set_typegroups[] = {
[3] = es2_x3_actionfield_set_typegroups,
[1] = es2_x1_actionfield_set_typegroups,
@@ -3504,6 +3820,8 @@ static const struct vcap_typegroup *es2_actionfield_set_typegroups[] = {
static const char * const vcap_keyfield_set_names[] = {
[VCAP_KFS_NO_VALUE] = "(None)",
[VCAP_KFS_ARP] = "VCAP_KFS_ARP",
+ [VCAP_KFS_DBL_IP4] = "VCAP_KFS_DBL_IP4",
+ [VCAP_KFS_DBL_IP6] = "VCAP_KFS_DBL_IP6",
[VCAP_KFS_ETAG] = "VCAP_KFS_ETAG",
[VCAP_KFS_IP4_OTHER] = "VCAP_KFS_IP4_OTHER",
[VCAP_KFS_IP4_TCP_UDP] = "VCAP_KFS_IP4_TCP_UDP",
@@ -3522,6 +3840,8 @@ static const char * const vcap_keyfield_set_names[] = {
[VCAP_KFS_NORMAL_7TUPLE] = "VCAP_KFS_NORMAL_7TUPLE",
[VCAP_KFS_OAM] = "VCAP_KFS_OAM",
[VCAP_KFS_PURE_5TUPLE_IP4] = "VCAP_KFS_PURE_5TUPLE_IP4",
+ [VCAP_KFS_SGL_IP4] = "VCAP_KFS_SGL_IP4",
+ [VCAP_KFS_SGL_IP6] = "VCAP_KFS_SGL_IP6",
[VCAP_KFS_SMAC_SIP4] = "VCAP_KFS_SMAC_SIP4",
[VCAP_KFS_SMAC_SIP6] = "VCAP_KFS_SMAC_SIP6",
};
@@ -3529,6 +3849,8 @@ static const char * const vcap_keyfield_set_names[] = {
/* Actionfieldset names */
static const char * const vcap_actionfield_set_names[] = {
[VCAP_AFS_NO_VALUE] = "(None)",
+ [VCAP_AFS_ARP_ENTRY] = "VCAP_AFS_ARP_ENTRY",
+ [VCAP_AFS_ARP_PTR] = "VCAP_AFS_ARP_PTR",
[VCAP_AFS_BASE_TYPE] = "VCAP_AFS_BASE_TYPE",
[VCAP_AFS_CLASSIFICATION] = "VCAP_AFS_CLASSIFICATION",
[VCAP_AFS_CLASS_REDUCED] = "VCAP_AFS_CLASS_REDUCED",
@@ -3565,6 +3887,7 @@ static const char * const vcap_keyfield_names[] = {
[VCAP_KF_8021Q_VLAN_TAGGED_IS] = "8021Q_VLAN_TAGGED_IS",
[VCAP_KF_8021Q_VLAN_TAGS] = "8021Q_VLAN_TAGS",
[VCAP_KF_ACL_GRP_ID] = "ACL_GRP_ID",
+ [VCAP_KF_AFFIX] = "AFFIX",
[VCAP_KF_ARP_ADDR_SPACE_OK_IS] = "ARP_ADDR_SPACE_OK_IS",
[VCAP_KF_ARP_LEN_OK_IS] = "ARP_LEN_OK_IS",
[VCAP_KF_ARP_OPCODE] = "ARP_OPCODE",
@@ -3573,6 +3896,7 @@ static const char * const vcap_keyfield_names[] = {
[VCAP_KF_ARP_SENDER_MATCH_IS] = "ARP_SENDER_MATCH_IS",
[VCAP_KF_ARP_TGT_MATCH_IS] = "ARP_TGT_MATCH_IS",
[VCAP_KF_COSID_CLS] = "COSID_CLS",
+ [VCAP_KF_DST_FLAG] = "DST_FLAG",
[VCAP_KF_ES0_ISDX_KEY_ENA] = "ES0_ISDX_KEY_ENA",
[VCAP_KF_ETYPE] = "ETYPE",
[VCAP_KF_ETYPE_LEN_IS] = "ETYPE_LEN_IS",
@@ -3586,7 +3910,13 @@ static const char * const vcap_keyfield_names[] = {
[VCAP_KF_IF_IGR_PORT_MASK_RNG] = "IF_IGR_PORT_MASK_RNG",
[VCAP_KF_IF_IGR_PORT_MASK_SEL] = "IF_IGR_PORT_MASK_SEL",
[VCAP_KF_IF_IGR_PORT_SEL] = "IF_IGR_PORT_SEL",
+ [VCAP_KF_IP4_DIP] = "IP4_DIP",
[VCAP_KF_IP4_IS] = "IP4_IS",
+ [VCAP_KF_IP4_SIP] = "IP4_SIP",
+ [VCAP_KF_IP4_XIP] = "IP4_XIP",
+ [VCAP_KF_IP6_DIP] = "IP6_DIP",
+ [VCAP_KF_IP6_SIP] = "IP6_SIP",
+ [VCAP_KF_IP6_XIP] = "IP6_XIP",
[VCAP_KF_IP_MC_IS] = "IP_MC_IS",
[VCAP_KF_IP_PAYLOAD_5TUPLE] = "IP_PAYLOAD_5TUPLE",
[VCAP_KF_IP_SNAP_IS] = "IP_SNAP_IS",
@@ -3659,6 +3989,10 @@ static const char * const vcap_keyfield_names[] = {
static const char * const vcap_actionfield_names[] = {
[VCAP_AF_NO_VALUE] = "(None)",
[VCAP_AF_ACL_ID] = "ACL_ID",
+ [VCAP_AF_ARP_ENA] = "ARP_ENA",
+ [VCAP_AF_ARP_PTR] = "ARP_PTR",
+ [VCAP_AF_ARP_PTR_REMAP_ENA] = "ARP_PTR_REMAP_ENA",
+ [VCAP_AF_ARP_VMID] = "ARP_VMID",
[VCAP_AF_CLS_VID_SEL] = "CLS_VID_SEL",
[VCAP_AF_CNT_ID] = "CNT_ID",
[VCAP_AF_COPY_PORT_NUM] = "COPY_PORT_NUM",
@@ -3676,6 +4010,8 @@ static const char * const vcap_actionfield_names[] = {
[VCAP_AF_DSCP_ENA] = "DSCP_ENA",
[VCAP_AF_DSCP_SEL] = "DSCP_SEL",
[VCAP_AF_DSCP_VAL] = "DSCP_VAL",
+ [VCAP_AF_ECMP_CNT] = "ECMP_CNT",
+ [VCAP_AF_ENCAP_ID] = "ENCAP_ID",
[VCAP_AF_ES2_REW_CMD] = "ES2_REW_CMD",
[VCAP_AF_ESDX] = "ESDX",
[VCAP_AF_FWD_KILL_ENA] = "FWD_KILL_ENA",
@@ -3690,6 +4026,8 @@ static const char * const vcap_actionfield_names[] = {
[VCAP_AF_ISDX_VAL] = "ISDX_VAL",
[VCAP_AF_LOOP_ENA] = "LOOP_ENA",
[VCAP_AF_LRN_DIS] = "LRN_DIS",
+ [VCAP_AF_MAC_LSB] = "MAC_LSB",
+ [VCAP_AF_MAC_MSB] = "MAC_MSB",
[VCAP_AF_MAP_IDX] = "MAP_IDX",
[VCAP_AF_MAP_KEY] = "MAP_KEY",
[VCAP_AF_MAP_LOOKUP_SEL] = "MAP_LOOKUP_SEL",
@@ -3723,7 +4061,12 @@ static const char * const vcap_actionfield_names[] = {
[VCAP_AF_QOS_ENA] = "QOS_ENA",
[VCAP_AF_QOS_VAL] = "QOS_VAL",
[VCAP_AF_REW_OP] = "REW_OP",
+ [VCAP_AF_RGID] = "RGID",
+ [VCAP_AF_RSDX] = "RSDX",
[VCAP_AF_RT_DIS] = "RT_DIS",
+ [VCAP_AF_SECUR_MATCH_MAC_ENA] = "SECUR_MATCH_MAC_ENA",
+ [VCAP_AF_SECUR_MATCH_VMID_ENA] = "SECUR_MATCH_VMID_ENA",
+ [VCAP_AF_SIP_RPF_ENA] = "SIP_RPF_ENA",
[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",
@@ -3743,6 +4086,7 @@ static const char * const vcap_actionfield_names[] = {
[VCAP_AF_VID_B_VAL] = "VID_B_VAL",
[VCAP_AF_VID_C_VAL] = "VID_C_VAL",
[VCAP_AF_VID_VAL] = "VID_VAL",
+ [VCAP_AF_ZERO_DMAC_CPU_QU] = "ZERO_DMAC_CPU_QU",
};
/* VCAPs */
@@ -3810,6 +4154,27 @@ const struct vcap_info lan969x_vcaps[] = {
.keyfield_set_typegroups = es0_keyfield_set_typegroups,
.actionfield_set_typegroups = es0_actionfield_set_typegroups,
},
+ [VCAP_TYPE_LPM] = {
+ .name = "lpm",
+ .rows = 512,
+ .sw_count = 12,
+ .sw_width = 52,
+ .sticky_width = 1,
+ .act_width = 83,
+ .default_cnt = 0,
+ .require_cnt_dis = 0,
+ .version = 1,
+ .keyfield_set = lpm_keyfield_set,
+ .keyfield_set_size = ARRAY_SIZE(lpm_keyfield_set),
+ .actionfield_set = lpm_actionfield_set,
+ .actionfield_set_size = ARRAY_SIZE(lpm_actionfield_set),
+ .keyfield_set_map = lpm_keyfield_set_map,
+ .keyfield_set_map_size = lpm_keyfield_set_map_size,
+ .actionfield_set_map = lpm_actionfield_set_map,
+ .actionfield_set_map_size = lpm_actionfield_set_map_size,
+ .keyfield_set_typegroups = lpm_keyfield_set_typegroups,
+ .actionfield_set_typegroups = lpm_actionfield_set_typegroups,
+ },
[VCAP_TYPE_ES2] = {
.name = "es2",
.rows = 256,
@@ -3835,7 +4200,7 @@ const struct vcap_info lan969x_vcaps[] = {
const struct vcap_statistics lan969x_vcap_stats = {
.name = "lan969x",
- .count = 4,
+ .count = 5,
.keyfield_set_names = vcap_keyfield_set_names,
.actionfield_set_names = vcap_actionfield_set_names,
.keyfield_names = vcap_keyfield_names,
diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_vcap_ag_api.c b/drivers/net/ethernet/microchip/sparx5/sparx5_vcap_ag_api.c
index 556d6ea0acd1..7bc8b29757b1 100644
--- a/drivers/net/ethernet/microchip/sparx5/sparx5_vcap_ag_api.c
+++ b/drivers/net/ethernet/microchip/sparx5/sparx5_vcap_ag_api.c
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: BSD-3-Clause
-/* Copyright (C) 2023 Microchip Technology Inc. and its subsidiaries.
+/* Copyright (C) 2026 Microchip Technology Inc. and its subsidiaries.
* Microchip VCAP API
*/
-/* This file is autogenerated by cml-utils 2023-02-10 11:15:56 +0100.
- * Commit ID: c30fb4bf0281cd4a7133bdab6682f9e43c872ada
+/* This file is autogenerated by cml-utils 2026-04-28 13:55:50 +0200.
+ * Commit ID: cd2494df16a1d3b14f650f720f6a8126b88b553a
*/
#include <linux/types.h>
@@ -1381,6 +1381,83 @@ static const struct vcap_field es0_isdx_keyfield[] = {
},
};
+static const struct vcap_field lpm_sgl_ip4_keyfield[] = {
+ [VCAP_KF_DST_FLAG] = {
+ .type = VCAP_FIELD_BIT,
+ .offset = 0,
+ .width = 1,
+ },
+ [VCAP_KF_AFFIX] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 1,
+ .width = 10,
+ },
+ [VCAP_KF_IP4_XIP] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 11,
+ .width = 32,
+ },
+};
+
+static const struct vcap_field lpm_dbl_ip4_keyfield[] = {
+ [VCAP_KF_TYPE] = {
+ .type = VCAP_FIELD_BIT,
+ .offset = 0,
+ .width = 1,
+ },
+ [VCAP_KF_AFFIX] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 1,
+ .width = 10,
+ },
+ [VCAP_KF_IP4_SIP] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 11,
+ .width = 32,
+ },
+ [VCAP_KF_IP4_DIP] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 43,
+ .width = 32,
+ },
+};
+
+static const struct vcap_field lpm_sgl_ip6_keyfield[] = {
+ [VCAP_KF_DST_FLAG] = {
+ .type = VCAP_FIELD_BIT,
+ .offset = 0,
+ .width = 1,
+ },
+ [VCAP_KF_AFFIX] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 1,
+ .width = 10,
+ },
+ [VCAP_KF_IP6_XIP] = {
+ .type = VCAP_FIELD_U128,
+ .offset = 11,
+ .width = 128,
+ },
+};
+
+static const struct vcap_field lpm_dbl_ip6_keyfield[] = {
+ [VCAP_KF_AFFIX] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 0,
+ .width = 10,
+ },
+ [VCAP_KF_IP6_SIP] = {
+ .type = VCAP_FIELD_U128,
+ .offset = 10,
+ .width = 128,
+ },
+ [VCAP_KF_IP6_DIP] = {
+ .type = VCAP_FIELD_U128,
+ .offset = 138,
+ .width = 128,
+ },
+};
+
static const struct vcap_field es2_mac_etype_keyfield[] = {
[VCAP_KF_TYPE] = {
.type = VCAP_FIELD_U32,
@@ -2339,6 +2416,29 @@ static const struct vcap_set es0_keyfield_set[] = {
},
};
+static const struct vcap_set lpm_keyfield_set[] = {
+ [VCAP_KFS_SGL_IP4] = {
+ .type_id = -1,
+ .sw_per_item = 1,
+ .sw_cnt = 12,
+ },
+ [VCAP_KFS_DBL_IP4] = {
+ .type_id = 0,
+ .sw_per_item = 2,
+ .sw_cnt = 6,
+ },
+ [VCAP_KFS_SGL_IP6] = {
+ .type_id = -1,
+ .sw_per_item = 3,
+ .sw_cnt = 4,
+ },
+ [VCAP_KFS_DBL_IP6] = {
+ .type_id = -1,
+ .sw_per_item = 6,
+ .sw_cnt = 2,
+ },
+};
+
static const struct vcap_set es2_keyfield_set[] = {
[VCAP_KFS_MAC_ETYPE] = {
.type_id = 0,
@@ -2391,6 +2491,13 @@ static const struct vcap_field *es0_keyfield_set_map[] = {
[VCAP_KFS_ISDX] = es0_isdx_keyfield,
};
+static const struct vcap_field *lpm_keyfield_set_map[] = {
+ [VCAP_KFS_SGL_IP4] = lpm_sgl_ip4_keyfield,
+ [VCAP_KFS_DBL_IP4] = lpm_dbl_ip4_keyfield,
+ [VCAP_KFS_SGL_IP6] = lpm_sgl_ip6_keyfield,
+ [VCAP_KFS_DBL_IP6] = lpm_dbl_ip6_keyfield,
+};
+
static const struct vcap_field *es2_keyfield_set_map[] = {
[VCAP_KFS_MAC_ETYPE] = es2_mac_etype_keyfield,
[VCAP_KFS_ARP] = es2_arp_keyfield,
@@ -2419,6 +2526,13 @@ static int es0_keyfield_set_map_size[] = {
[VCAP_KFS_ISDX] = ARRAY_SIZE(es0_isdx_keyfield),
};
+static int lpm_keyfield_set_map_size[] = {
+ [VCAP_KFS_SGL_IP4] = ARRAY_SIZE(lpm_sgl_ip4_keyfield),
+ [VCAP_KFS_DBL_IP4] = ARRAY_SIZE(lpm_dbl_ip4_keyfield),
+ [VCAP_KFS_SGL_IP6] = ARRAY_SIZE(lpm_sgl_ip6_keyfield),
+ [VCAP_KFS_DBL_IP6] = ARRAY_SIZE(lpm_dbl_ip6_keyfield),
+};
+
static int es2_keyfield_set_map_size[] = {
[VCAP_KFS_MAC_ETYPE] = ARRAY_SIZE(es2_mac_etype_keyfield),
[VCAP_KFS_ARP] = ARRAY_SIZE(es2_arp_keyfield),
@@ -2994,6 +3108,92 @@ static const struct vcap_field es0_es0_actionfield[] = {
},
};
+static const struct vcap_field lpm_arp_ptr_actionfield[] = {
+ [VCAP_AF_TYPE] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 0,
+ .width = 2,
+ },
+ [VCAP_AF_ARP_PTR] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 2,
+ .width = 11,
+ },
+ [VCAP_AF_ARP_PTR_REMAP_ENA] = {
+ .type = VCAP_FIELD_BIT,
+ .offset = 13,
+ .width = 1,
+ },
+ [VCAP_AF_ECMP_CNT] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 14,
+ .width = 4,
+ },
+ [VCAP_AF_RGID] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 18,
+ .width = 3,
+ },
+};
+
+static const struct vcap_field lpm_arp_entry_actionfield[] = {
+ [VCAP_AF_TYPE] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 0,
+ .width = 2,
+ },
+ [VCAP_AF_MAC_MSB] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 2,
+ .width = 16,
+ },
+ [VCAP_AF_MAC_LSB] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 18,
+ .width = 32,
+ },
+ [VCAP_AF_ARP_VMID] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 50,
+ .width = 9,
+ },
+ [VCAP_AF_ZERO_DMAC_CPU_QU] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 59,
+ .width = 3,
+ },
+ [VCAP_AF_SIP_RPF_ENA] = {
+ .type = VCAP_FIELD_BIT,
+ .offset = 62,
+ .width = 1,
+ },
+ [VCAP_AF_SECUR_MATCH_VMID_ENA] = {
+ .type = VCAP_FIELD_BIT,
+ .offset = 63,
+ .width = 1,
+ },
+ [VCAP_AF_SECUR_MATCH_MAC_ENA] = {
+ .type = VCAP_FIELD_BIT,
+ .offset = 64,
+ .width = 1,
+ },
+ [VCAP_AF_ARP_ENA] = {
+ .type = VCAP_FIELD_BIT,
+ .offset = 65,
+ .width = 1,
+ },
+ [VCAP_AF_ENCAP_ID] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 66,
+ .width = 10,
+ },
+ [VCAP_AF_RSDX] = {
+ .type = VCAP_FIELD_U32,
+ .offset = 76,
+ .width = 12,
+ },
+};
+
static const struct vcap_field es2_base_type_actionfield[] = {
[VCAP_AF_HIT_ME_ONCE] = {
.type = VCAP_FIELD_BIT,
@@ -3102,6 +3302,19 @@ static const struct vcap_set es0_actionfield_set[] = {
},
};
+static const struct vcap_set lpm_actionfield_set[] = {
+ [VCAP_AFS_ARP_PTR] = {
+ .type_id = 0,
+ .sw_per_item = 1,
+ .sw_cnt = 12,
+ },
+ [VCAP_AFS_ARP_ENTRY] = {
+ .type_id = 2,
+ .sw_per_item = 1,
+ .sw_cnt = 12,
+ },
+};
+
static const struct vcap_set es2_actionfield_set[] = {
[VCAP_AFS_BASE_TYPE] = {
.type_id = -1,
@@ -3125,6 +3338,11 @@ static const struct vcap_field *es0_actionfield_set_map[] = {
[VCAP_AFS_ES0] = es0_es0_actionfield,
};
+static const struct vcap_field *lpm_actionfield_set_map[] = {
+ [VCAP_AFS_ARP_PTR] = lpm_arp_ptr_actionfield,
+ [VCAP_AFS_ARP_ENTRY] = lpm_arp_entry_actionfield,
+};
+
static const struct vcap_field *es2_actionfield_set_map[] = {
[VCAP_AFS_BASE_TYPE] = es2_base_type_actionfield,
};
@@ -3144,6 +3362,11 @@ static int es0_actionfield_set_map_size[] = {
[VCAP_AFS_ES0] = ARRAY_SIZE(es0_es0_actionfield),
};
+static int lpm_actionfield_set_map_size[] = {
+ [VCAP_AFS_ARP_PTR] = ARRAY_SIZE(lpm_arp_ptr_actionfield),
+ [VCAP_AFS_ARP_ENTRY] = ARRAY_SIZE(lpm_arp_entry_actionfield),
+};
+
static int es2_actionfield_set_map_size[] = {
[VCAP_AFS_BASE_TYPE] = ARRAY_SIZE(es2_base_type_actionfield),
};
@@ -3334,6 +3557,82 @@ static const struct vcap_typegroup es0_x1_keyfield_set_typegroups[] = {
{}
};
+static const struct vcap_typegroup lpm_x6_keyfield_set_typegroups[] = {
+ {
+ .offset = 0,
+ .width = 4,
+ .value = 8,
+ },
+ {
+ .offset = 52,
+ .width = 1,
+ .value = 0,
+ },
+ {
+ .offset = 104,
+ .width = 2,
+ .value = 0,
+ },
+ {
+ .offset = 156,
+ .width = 3,
+ .value = 0,
+ },
+ {
+ .offset = 208,
+ .width = 2,
+ .value = 0,
+ },
+ {
+ .offset = 260,
+ .width = 1,
+ .value = 0,
+ },
+ {}
+};
+
+static const struct vcap_typegroup lpm_x3_keyfield_set_typegroups[] = {
+ {
+ .offset = 0,
+ .width = 3,
+ .value = 4,
+ },
+ {
+ .offset = 52,
+ .width = 2,
+ .value = 0,
+ },
+ {
+ .offset = 104,
+ .width = 2,
+ .value = 0,
+ },
+ {}
+};
+
+static const struct vcap_typegroup lpm_x2_keyfield_set_typegroups[] = {
+ {
+ .offset = 0,
+ .width = 2,
+ .value = 2,
+ },
+ {
+ .offset = 52,
+ .width = 1,
+ .value = 0,
+ },
+ {}
+};
+
+static const struct vcap_typegroup lpm_x1_keyfield_set_typegroups[] = {
+ {
+ .offset = 0,
+ .width = 1,
+ .value = 1,
+ },
+ {}
+};
+
static const struct vcap_typegroup es2_x12_keyfield_set_typegroups[] = {
{
.offset = 0,
@@ -3407,6 +3706,14 @@ static const struct vcap_typegroup *es0_keyfield_set_typegroups[] = {
[2] = NULL,
};
+static const struct vcap_typegroup *lpm_keyfield_set_typegroups[] = {
+ [6] = lpm_x6_keyfield_set_typegroups,
+ [3] = lpm_x3_keyfield_set_typegroups,
+ [2] = lpm_x2_keyfield_set_typegroups,
+ [1] = lpm_x1_keyfield_set_typegroups,
+ [13] = NULL,
+};
+
static const struct vcap_typegroup *es2_keyfield_set_typegroups[] = {
[12] = es2_x12_keyfield_set_typegroups,
[6] = es2_x6_keyfield_set_typegroups,
@@ -3484,6 +3791,10 @@ static const struct vcap_typegroup es0_x1_actionfield_set_typegroups[] = {
{}
};
+static const struct vcap_typegroup lpm_x1_actionfield_set_typegroups[] = {
+ {}
+};
+
static const struct vcap_typegroup es2_x3_actionfield_set_typegroups[] = {
{
.offset = 0,
@@ -3525,6 +3836,11 @@ static const struct vcap_typegroup *es0_actionfield_set_typegroups[] = {
[2] = NULL,
};
+static const struct vcap_typegroup *lpm_actionfield_set_typegroups[] = {
+ [1] = lpm_x1_actionfield_set_typegroups,
+ [13] = NULL,
+};
+
static const struct vcap_typegroup *es2_actionfield_set_typegroups[] = {
[3] = es2_x3_actionfield_set_typegroups,
[1] = es2_x1_actionfield_set_typegroups,
@@ -3535,6 +3851,8 @@ static const struct vcap_typegroup *es2_actionfield_set_typegroups[] = {
static const char * const vcap_keyfield_set_names[] = {
[VCAP_KFS_NO_VALUE] = "(None)",
[VCAP_KFS_ARP] = "VCAP_KFS_ARP",
+ [VCAP_KFS_DBL_IP4] = "VCAP_KFS_DBL_IP4",
+ [VCAP_KFS_DBL_IP6] = "VCAP_KFS_DBL_IP6",
[VCAP_KFS_ETAG] = "VCAP_KFS_ETAG",
[VCAP_KFS_IP4_OTHER] = "VCAP_KFS_IP4_OTHER",
[VCAP_KFS_IP4_TCP_UDP] = "VCAP_KFS_IP4_TCP_UDP",
@@ -3553,6 +3871,8 @@ static const char * const vcap_keyfield_set_names[] = {
[VCAP_KFS_NORMAL_7TUPLE] = "VCAP_KFS_NORMAL_7TUPLE",
[VCAP_KFS_OAM] = "VCAP_KFS_OAM",
[VCAP_KFS_PURE_5TUPLE_IP4] = "VCAP_KFS_PURE_5TUPLE_IP4",
+ [VCAP_KFS_SGL_IP4] = "VCAP_KFS_SGL_IP4",
+ [VCAP_KFS_SGL_IP6] = "VCAP_KFS_SGL_IP6",
[VCAP_KFS_SMAC_SIP4] = "VCAP_KFS_SMAC_SIP4",
[VCAP_KFS_SMAC_SIP6] = "VCAP_KFS_SMAC_SIP6",
};
@@ -3560,6 +3880,8 @@ static const char * const vcap_keyfield_set_names[] = {
/* Actionfieldset names */
static const char * const vcap_actionfield_set_names[] = {
[VCAP_AFS_NO_VALUE] = "(None)",
+ [VCAP_AFS_ARP_ENTRY] = "VCAP_AFS_ARP_ENTRY",
+ [VCAP_AFS_ARP_PTR] = "VCAP_AFS_ARP_PTR",
[VCAP_AFS_BASE_TYPE] = "VCAP_AFS_BASE_TYPE",
[VCAP_AFS_CLASSIFICATION] = "VCAP_AFS_CLASSIFICATION",
[VCAP_AFS_CLASS_REDUCED] = "VCAP_AFS_CLASS_REDUCED",
@@ -3596,6 +3918,7 @@ static const char * const vcap_keyfield_names[] = {
[VCAP_KF_8021Q_VLAN_TAGGED_IS] = "8021Q_VLAN_TAGGED_IS",
[VCAP_KF_8021Q_VLAN_TAGS] = "8021Q_VLAN_TAGS",
[VCAP_KF_ACL_GRP_ID] = "ACL_GRP_ID",
+ [VCAP_KF_AFFIX] = "AFFIX",
[VCAP_KF_ARP_ADDR_SPACE_OK_IS] = "ARP_ADDR_SPACE_OK_IS",
[VCAP_KF_ARP_LEN_OK_IS] = "ARP_LEN_OK_IS",
[VCAP_KF_ARP_OPCODE] = "ARP_OPCODE",
@@ -3604,6 +3927,7 @@ static const char * const vcap_keyfield_names[] = {
[VCAP_KF_ARP_SENDER_MATCH_IS] = "ARP_SENDER_MATCH_IS",
[VCAP_KF_ARP_TGT_MATCH_IS] = "ARP_TGT_MATCH_IS",
[VCAP_KF_COSID_CLS] = "COSID_CLS",
+ [VCAP_KF_DST_FLAG] = "DST_FLAG",
[VCAP_KF_ES0_ISDX_KEY_ENA] = "ES0_ISDX_KEY_ENA",
[VCAP_KF_ETYPE] = "ETYPE",
[VCAP_KF_ETYPE_LEN_IS] = "ETYPE_LEN_IS",
@@ -3617,7 +3941,13 @@ static const char * const vcap_keyfield_names[] = {
[VCAP_KF_IF_IGR_PORT_MASK_RNG] = "IF_IGR_PORT_MASK_RNG",
[VCAP_KF_IF_IGR_PORT_MASK_SEL] = "IF_IGR_PORT_MASK_SEL",
[VCAP_KF_IF_IGR_PORT_SEL] = "IF_IGR_PORT_SEL",
+ [VCAP_KF_IP4_DIP] = "IP4_DIP",
[VCAP_KF_IP4_IS] = "IP4_IS",
+ [VCAP_KF_IP4_SIP] = "IP4_SIP",
+ [VCAP_KF_IP4_XIP] = "IP4_XIP",
+ [VCAP_KF_IP6_DIP] = "IP6_DIP",
+ [VCAP_KF_IP6_SIP] = "IP6_SIP",
+ [VCAP_KF_IP6_XIP] = "IP6_XIP",
[VCAP_KF_IP_MC_IS] = "IP_MC_IS",
[VCAP_KF_IP_PAYLOAD_5TUPLE] = "IP_PAYLOAD_5TUPLE",
[VCAP_KF_IP_SNAP_IS] = "IP_SNAP_IS",
@@ -3690,6 +4020,10 @@ static const char * const vcap_keyfield_names[] = {
static const char * const vcap_actionfield_names[] = {
[VCAP_AF_NO_VALUE] = "(None)",
[VCAP_AF_ACL_ID] = "ACL_ID",
+ [VCAP_AF_ARP_ENA] = "ARP_ENA",
+ [VCAP_AF_ARP_PTR] = "ARP_PTR",
+ [VCAP_AF_ARP_PTR_REMAP_ENA] = "ARP_PTR_REMAP_ENA",
+ [VCAP_AF_ARP_VMID] = "ARP_VMID",
[VCAP_AF_CLS_VID_SEL] = "CLS_VID_SEL",
[VCAP_AF_CNT_ID] = "CNT_ID",
[VCAP_AF_COPY_PORT_NUM] = "COPY_PORT_NUM",
@@ -3707,6 +4041,8 @@ static const char * const vcap_actionfield_names[] = {
[VCAP_AF_DSCP_ENA] = "DSCP_ENA",
[VCAP_AF_DSCP_SEL] = "DSCP_SEL",
[VCAP_AF_DSCP_VAL] = "DSCP_VAL",
+ [VCAP_AF_ECMP_CNT] = "ECMP_CNT",
+ [VCAP_AF_ENCAP_ID] = "ENCAP_ID",
[VCAP_AF_ES2_REW_CMD] = "ES2_REW_CMD",
[VCAP_AF_ESDX] = "ESDX",
[VCAP_AF_FWD_KILL_ENA] = "FWD_KILL_ENA",
@@ -3721,6 +4057,8 @@ static const char * const vcap_actionfield_names[] = {
[VCAP_AF_ISDX_VAL] = "ISDX_VAL",
[VCAP_AF_LOOP_ENA] = "LOOP_ENA",
[VCAP_AF_LRN_DIS] = "LRN_DIS",
+ [VCAP_AF_MAC_LSB] = "MAC_LSB",
+ [VCAP_AF_MAC_MSB] = "MAC_MSB",
[VCAP_AF_MAP_IDX] = "MAP_IDX",
[VCAP_AF_MAP_KEY] = "MAP_KEY",
[VCAP_AF_MAP_LOOKUP_SEL] = "MAP_LOOKUP_SEL",
@@ -3754,7 +4092,12 @@ static const char * const vcap_actionfield_names[] = {
[VCAP_AF_QOS_ENA] = "QOS_ENA",
[VCAP_AF_QOS_VAL] = "QOS_VAL",
[VCAP_AF_REW_OP] = "REW_OP",
+ [VCAP_AF_RGID] = "RGID",
+ [VCAP_AF_RSDX] = "RSDX",
[VCAP_AF_RT_DIS] = "RT_DIS",
+ [VCAP_AF_SECUR_MATCH_MAC_ENA] = "SECUR_MATCH_MAC_ENA",
+ [VCAP_AF_SECUR_MATCH_VMID_ENA] = "SECUR_MATCH_VMID_ENA",
+ [VCAP_AF_SIP_RPF_ENA] = "SIP_RPF_ENA",
[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",
@@ -3774,6 +4117,7 @@ static const char * const vcap_actionfield_names[] = {
[VCAP_AF_VID_B_VAL] = "VID_B_VAL",
[VCAP_AF_VID_C_VAL] = "VID_C_VAL",
[VCAP_AF_VID_VAL] = "VID_VAL",
+ [VCAP_AF_ZERO_DMAC_CPU_QU] = "ZERO_DMAC_CPU_QU",
};
/* VCAPs */
@@ -3841,6 +4185,27 @@ const struct vcap_info sparx5_vcaps[] = {
.keyfield_set_typegroups = es0_keyfield_set_typegroups,
.actionfield_set_typegroups = es0_actionfield_set_typegroups,
},
+ [VCAP_TYPE_LPM] = {
+ .name = "lpm",
+ .rows = 512,
+ .sw_count = 12,
+ .sw_width = 52,
+ .sticky_width = 1,
+ .act_width = 89,
+ .default_cnt = 0,
+ .require_cnt_dis = 0,
+ .version = 1,
+ .keyfield_set = lpm_keyfield_set,
+ .keyfield_set_size = ARRAY_SIZE(lpm_keyfield_set),
+ .actionfield_set = lpm_actionfield_set,
+ .actionfield_set_size = ARRAY_SIZE(lpm_actionfield_set),
+ .keyfield_set_map = lpm_keyfield_set_map,
+ .keyfield_set_map_size = lpm_keyfield_set_map_size,
+ .actionfield_set_map = lpm_actionfield_set_map,
+ .actionfield_set_map_size = lpm_actionfield_set_map_size,
+ .keyfield_set_typegroups = lpm_keyfield_set_typegroups,
+ .actionfield_set_typegroups = lpm_actionfield_set_typegroups,
+ },
[VCAP_TYPE_ES2] = {
.name = "es2",
.rows = 1024,
@@ -3866,7 +4231,7 @@ const struct vcap_info sparx5_vcaps[] = {
const struct vcap_statistics sparx5_vcap_stats = {
.name = "sparx5",
- .count = 4,
+ .count = 5,
.keyfield_set_names = vcap_keyfield_set_names,
.actionfield_set_names = vcap_actionfield_set_names,
.keyfield_names = vcap_keyfield_names,
diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_vcap_ag_api.h b/drivers/net/ethernet/microchip/sparx5/sparx5_vcap_ag_api.h
index e68f5639a40a..22bb416f433d 100644
--- a/drivers/net/ethernet/microchip/sparx5/sparx5_vcap_ag_api.h
+++ b/drivers/net/ethernet/microchip/sparx5/sparx5_vcap_ag_api.h
@@ -1,10 +1,10 @@
/* SPDX-License-Identifier: BSD-3-Clause */
-/* Copyright (C) 2022 Microchip Technology Inc. and its subsidiaries.
+/* Copyright (C) 2026 Microchip Technology Inc. and its subsidiaries.
* Microchip VCAP API
*/
-/* This file is autogenerated by cml-utils 2022-10-13 10:04:41 +0200.
- * Commit ID: fd7cafd175899f0672c73afb3a30fc872500ae86
+/* This file is autogenerated by cml-utils 2026-04-28 13:55:50 +0200.
+ * Commit ID: cd2494df16a1d3b14f650f720f6a8126b88b553a
*/
#ifndef __SPARX5_VCAP_AG_API_H__
diff --git a/drivers/net/ethernet/microchip/vcap/vcap_ag_api.h b/drivers/net/ethernet/microchip/vcap/vcap_ag_api.h
index 4735fad05708..487d56440936 100644
--- a/drivers/net/ethernet/microchip/vcap/vcap_ag_api.h
+++ b/drivers/net/ethernet/microchip/vcap/vcap_ag_api.h
@@ -1,10 +1,10 @@
/* SPDX-License-Identifier: BSD-3-Clause */
-/* Copyright (C) 2023 Microchip Technology Inc. and its subsidiaries.
+/* Copyright (C) 2026 Microchip Technology Inc. and its subsidiaries.
* Microchip VCAP API
*/
-/* This file is autogenerated by cml-utils 2023-03-13 10:16:42 +0100.
- * Commit ID: 259f0efd6d6d91bfbf62858de153cc757b6bffa3 (dirty)
+/* This file is autogenerated by cml-utils 2026-04-28 13:55:50 +0200.
+ * Commit ID: cd2494df16a1d3b14f650f720f6a8126b88b553a
*/
#ifndef __VCAP_AG_API__
@@ -16,6 +16,7 @@ enum vcap_type {
VCAP_TYPE_IS0,
VCAP_TYPE_IS1,
VCAP_TYPE_IS2,
+ VCAP_TYPE_LPM,
VCAP_TYPE_MAX
};
@@ -26,6 +27,8 @@ enum vcap_keyfield_set {
VCAP_KFS_5TUPLE_IP6, /* lan966x is1 X4 */
VCAP_KFS_7TUPLE, /* lan966x is1 X4 */
VCAP_KFS_ARP, /* sparx5 is2 X6, sparx5 es2 X6, lan966x is2 X2 */
+ VCAP_KFS_DBL_IP4, /* sparx5 lpm X2 */
+ VCAP_KFS_DBL_IP6, /* sparx5 lpm X6 */
VCAP_KFS_DBL_VID, /* lan966x is1 X1 */
VCAP_KFS_DMAC_VID, /* lan966x is1 X1 */
VCAP_KFS_ETAG, /* sparx5 is0 X2 */
@@ -49,6 +52,8 @@ enum vcap_keyfield_set {
VCAP_KFS_OAM, /* lan966x is2 X2 */
VCAP_KFS_PURE_5TUPLE_IP4, /* sparx5 is0 X3 */
VCAP_KFS_RT, /* lan966x is1 X1 */
+ VCAP_KFS_SGL_IP4, /* sparx5 lpm X1 */
+ VCAP_KFS_SGL_IP6, /* sparx5 lpm X3 */
VCAP_KFS_SMAC_SIP4, /* lan966x is2 X1 */
VCAP_KFS_SMAC_SIP6, /* lan966x is2 X2 */
VCAP_KFS_VID, /* lan966x es0 X1 */
@@ -117,6 +122,10 @@ enum vcap_keyfield_set {
* tagged, 7: Triple tagged
* VCAP_KF_ACL_GRP_ID: W8, sparx5: es2
* Used in interface map table
+ * VCAP_KF_AFFIX: W10, sparx5: lpm
+ * LPM affix. Defaults to 0. Using the LPM affix, the VCAP LPM can be split into
+ * multiple logically separate routing tables, e.g. to support features such as
+ * VRF-lite.
* VCAP_KF_ARP_ADDR_SPACE_OK_IS: W1, sparx5: is2/es2, lan966x: is2
* Set if hardware address is Ethernet
* VCAP_KF_ARP_LEN_OK_IS: W1, sparx5: is2/es2, lan966x: is2
@@ -133,6 +142,9 @@ enum vcap_keyfield_set {
* Target Hardware Address = SMAC (RARP)
* VCAP_KF_COSID_CLS: W3, sparx5: es0/es2
* Class of service
+ * VCAP_KF_DST_FLAG: W1, sparx5: lpm
+ * 0: IP4_XIP/IP6_XIP is only to be used for SIP matching, 1: IP4_XIP/IP6_XIP is
+ * only to be used for DIP matching
* VCAP_KF_ES0_ISDX_KEY_ENA: W1, sparx5: es2
* The value taken from the IFH .FWD.ES0_ISDX_KEY_ENA
* VCAP_KF_ETYPE: W16, sparx5: is0/is2/es2, lan966x: is1/is2
@@ -167,8 +179,22 @@ enum vcap_keyfield_set {
* Mapping: 0: DEFAULT 1: LOOPBACK 2: MASQUERADE 3: CPU_VD
* VCAP_KF_IF_IGR_PORT_SEL: W1, sparx5: es2
* Selector for IF_IGR_PORT: physical port number or ERLEG
+ * VCAP_KF_IP4_DIP: W32, sparx5: lpm
+ * IPv4 destination address. Used for IPv4 MC routing.
* VCAP_KF_IP4_IS: W1, sparx5: is0/is2/es2, lan966x: is1/is2
* Set if frame has EtherType = 0x800 and IP version = 4
+ * VCAP_KF_IP4_SIP: W32, sparx5: lpm
+ * IPv4 source address. Used for IPv4 MC routing.
+ * VCAP_KF_IP4_XIP: W32, sparx5: lpm
+ * IPv4 address. Used for IPv4 UC routing as well as IPv4 Source/Destination
+ * Guard.
+ * VCAP_KF_IP6_DIP: W128, sparx5: lpm
+ * IPv6 destination address. Used for IPv6 MC routing.
+ * VCAP_KF_IP6_SIP: W128, sparx5: lpm
+ * IPv6 source address. Used for IPv6 MC routing.
+ * VCAP_KF_IP6_XIP: W128, sparx5: lpm
+ * IPv6 address. Used for IPv6 UC routing as well as IPv6 Source/Destination
+ * Guard.
* VCAP_KF_IP_MC_IS: W1, sparx5: is0, lan966x: is1
* Set if frame is IPv4 frame and frame's destination MAC address is an IPv4
* multicast address (0x01005E0 /25). Set if frame is IPv6 frame and frame's
@@ -352,8 +378,8 @@ enum vcap_keyfield_set {
* Set if frame is IPv4/IPv6 TCP or UDP frame (IP protocol/next header equals 6
* or 17)
* VCAP_KF_TYPE: sparx5 is0 W2, sparx5 is0 W1, sparx5 is2 W4, sparx5 is2 W2,
- * sparx5 es0 W1, sparx5 es2 W3, lan966x is1 W1, lan966x is1 W2, lan966x is2 W4,
- * lan966x is2 W2
+ * sparx5 es0 W1, sparx5 lpm W1, sparx5 es2 W3, lan966x is1 W1, lan966x is1 W2,
+ * lan966x is2 W4, lan966x is2 W2
* Keyset type id - set by the API
*/
@@ -387,6 +413,7 @@ enum vcap_key_field {
VCAP_KF_8021Q_VLAN_TAGGED_IS,
VCAP_KF_8021Q_VLAN_TAGS,
VCAP_KF_ACL_GRP_ID,
+ VCAP_KF_AFFIX,
VCAP_KF_ARP_ADDR_SPACE_OK_IS,
VCAP_KF_ARP_LEN_OK_IS,
VCAP_KF_ARP_OPCODE,
@@ -395,6 +422,7 @@ enum vcap_key_field {
VCAP_KF_ARP_SENDER_MATCH_IS,
VCAP_KF_ARP_TGT_MATCH_IS,
VCAP_KF_COSID_CLS,
+ VCAP_KF_DST_FLAG,
VCAP_KF_ES0_ISDX_KEY_ENA,
VCAP_KF_ETYPE,
VCAP_KF_ETYPE_LEN_IS,
@@ -408,7 +436,13 @@ enum vcap_key_field {
VCAP_KF_IF_IGR_PORT_MASK_RNG,
VCAP_KF_IF_IGR_PORT_MASK_SEL,
VCAP_KF_IF_IGR_PORT_SEL,
+ VCAP_KF_IP4_DIP,
VCAP_KF_IP4_IS,
+ VCAP_KF_IP4_SIP,
+ VCAP_KF_IP4_XIP,
+ VCAP_KF_IP6_DIP,
+ VCAP_KF_IP6_SIP,
+ VCAP_KF_IP6_XIP,
VCAP_KF_IP_MC_IS,
VCAP_KF_IP_PAYLOAD_5TUPLE,
VCAP_KF_IP_PAYLOAD_S1_IP6,
@@ -490,6 +524,8 @@ enum vcap_key_field {
/* Actionset names with origin information */
enum vcap_actionfield_set {
VCAP_AFS_NO_VALUE, /* initial value */
+ VCAP_AFS_ARP_ENTRY, /* sparx5 lpm X1 */
+ VCAP_AFS_ARP_PTR, /* sparx5 lpm X1 */
VCAP_AFS_BASE_TYPE, /* sparx5 is2 X3, sparx5 es2 X3, lan966x is2 X2 */
VCAP_AFS_CLASSIFICATION, /* sparx5 is0 X2 */
VCAP_AFS_CLASS_REDUCED, /* sparx5 is0 X1 */
@@ -506,6 +542,15 @@ enum vcap_actionfield_set {
* Logical ID for the entry. This ID is extracted together with the frame in the
* CPU extraction header. Only applicable to actions with CPU_COPY_ENA or
* HIT_ME_ONCE set.
+ * VCAP_AF_ARP_ENA: W1, sparx5: lpm
+ * Enable entry for address resolution usage.
+ * VCAP_AF_ARP_PTR: W11, sparx5: lpm
+ * Pointer to entry in ARP Table.
+ * VCAP_AF_ARP_PTR_REMAP_ENA: W1, sparx5: lpm
+ * If this bit is set, ARP_PTR is used to point to an entry in the ARP pointer
+ * remap table.
+ * VCAP_AF_ARP_VMID: W9, sparx5: lpm
+ * Routing lookup. Egress router leg (EVMID).
* VCAP_AF_CLS_VID_SEL: W3, sparx5: is0
* Controls the classified VID: 0: VID_NONE: No action. 1: VID_ADD: New VID =
* old VID + VID_VAL. 2: VID_REPLACE: New VID = VID_VAL. 3: VID_FIRST_TAG: New
@@ -562,6 +607,11 @@ enum vcap_actionfield_set {
* 7: Mapped using mapping table 3, otherwise use mapping table 2
* VCAP_AF_DSCP_VAL: W6, sparx5: is0/es0, lan966x: is1
* See DSCP_ENA.
+ * VCAP_AF_ECMP_CNT: W4, sparx5: lpm
+ * Number of equal cost, multiple paths routes to DIP.
+ * VCAP_AF_ENCAP_ID: W10, sparx5: lpm
+ * Index into REW:ENCAP_IP4 when encapsulating IP packet in IPv4. Disabled when
+ * set to 0.
* VCAP_AF_ES2_REW_CMD: W3, sparx5: es2
* Command forwarded to REW: 0: No action. 1: SWAP MAC addresses. 2: Do L2CP
* DMAC translation when entering or leaving a tunnel.
@@ -610,6 +660,12 @@ enum vcap_actionfield_set {
* 0: Forward based on PIPELINE_PT and FWD_SEL
* VCAP_AF_LRN_DIS: W1, sparx5: is2, lan966x: is2
* Setting this bit to 1 disables learning of frames hitting this action.
+ * VCAP_AF_MAC_LSB: W32, sparx5: lpm
+ * 32 least significant bits of MAC address. Used for ARP entry and/or
+ * (SMAC,SIP)/(DMAC,DIP) check.
+ * VCAP_AF_MAC_MSB: W16, sparx5: lpm
+ * 16 most significant bits of MAC address. Used for ARP entry and/or
+ * (SMAC,SIP)/(DMAC,DIP) check.
* VCAP_AF_MAP_IDX: W9, sparx5: is0
* Index for QoS mapping table lookup
* VCAP_AF_MAP_KEY: W3, sparx5: is0
@@ -715,9 +771,17 @@ enum vcap_actionfield_set {
* See QOS_ENA.
* VCAP_AF_REW_OP: W16, lan966x: is2
* Rewriter operation command.
+ * VCAP_AF_RGID: W3, sparx5: lpm
+ * Route Group ID. Used for SIP RPF check.
+ * VCAP_AF_RSDX: W12, sparx5: lpm
+ * Router Leg Service Index for ARP table entry.
* VCAP_AF_RT_DIS: W1, sparx5: is2
* If set, routing is disallowed. Only applies when IS_INNER_ACL is 0. See also
* IGR_ACL_ENA, EGR_ACL_ENA, and RLEG_STAT_IDX.
+ * VCAP_AF_SECUR_MATCH_MAC_ENA: W1, sparx5: lpm
+ * Enable Security MAC check.
+ * VCAP_AF_SECUR_MATCH_VMID_ENA: W1, sparx5: lpm
+ * Enable Security VMID check.
* VCAP_AF_SFID_ENA: W1, lan966x: is1
* If set, SFID_VAL is used to lookup ANA::SFID.
* VCAP_AF_SFID_VAL: W8, lan966x: is1
@@ -726,6 +790,8 @@ enum vcap_actionfield_set {
* If set, SGID_VAL is used to lookup ANA::SGID.
* VCAP_AF_SGID_VAL: W8, lan966x: is1
* Stream gate identifier.
+ * VCAP_AF_SIP_RPF_ENA: W1, sparx5: lpm
+ * Enable use for SIP RPF check.
* VCAP_AF_SWAP_MACS_ENA: W1, sparx5: es0
* 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.
@@ -774,7 +840,7 @@ enum vcap_actionfield_set {
* VCAP_AF_TAG_C_VID_SEL: W2, sparx5: es0
* Selects VID for ES0 tag C. The resulting VID is termed C-TAG.VID. 0:
* Classified VID. 1: VID_C_VAL. 2: IFH.ENCAP.GVID. 3: Reserved.
- * VCAP_AF_TYPE: W1, sparx5: is0, lan966x: is1
+ * VCAP_AF_TYPE: sparx5 is0 W1, sparx5 lpm W2, lan966x is1 W1
* Actionset type id - Set by the API
* VCAP_AF_UNTAG_VID_ENA: W1, sparx5: es0
* Controls insertion of tag C. Untag or insert mode can be selected. See
@@ -798,12 +864,18 @@ enum vcap_actionfield_set {
* If set, use VLAN_POP_CNT as the number of VLAN tags to pop from the incoming
* frame. This number is used by the Rewriter. Otherwise, VLAN_POP_CNT from
* ANA:PORT:VLAN_CFG.VLAN_POP_CNT is used
+ * VCAP_AF_ZERO_DMAC_CPU_QU: W3, sparx5: lpm
+ * CPU queue used for CPU redirect if MAC address in ARP entry is all-zeros.
*/
/* Actionfield names */
enum vcap_action_field {
VCAP_AF_NO_VALUE, /* initial value */
VCAP_AF_ACL_ID,
+ VCAP_AF_ARP_ENA,
+ VCAP_AF_ARP_PTR,
+ VCAP_AF_ARP_PTR_REMAP_ENA,
+ VCAP_AF_ARP_VMID,
VCAP_AF_CLS_VID_SEL,
VCAP_AF_CNT_ID,
VCAP_AF_COPY_PORT_NUM,
@@ -823,6 +895,8 @@ enum vcap_action_field {
VCAP_AF_DSCP_ENA,
VCAP_AF_DSCP_SEL,
VCAP_AF_DSCP_VAL,
+ VCAP_AF_ECMP_CNT,
+ VCAP_AF_ENCAP_ID,
VCAP_AF_ES2_REW_CMD,
VCAP_AF_ESDX,
VCAP_AF_FWD_KILL_ENA,
@@ -839,6 +913,8 @@ enum vcap_action_field {
VCAP_AF_ISDX_VAL,
VCAP_AF_LOOP_ENA,
VCAP_AF_LRN_DIS,
+ VCAP_AF_MAC_LSB,
+ VCAP_AF_MAC_MSB,
VCAP_AF_MAP_IDX,
VCAP_AF_MAP_KEY,
VCAP_AF_MAP_LOOKUP_SEL,
@@ -874,11 +950,16 @@ enum vcap_action_field {
VCAP_AF_QOS_ENA,
VCAP_AF_QOS_VAL,
VCAP_AF_REW_OP,
+ VCAP_AF_RGID,
+ VCAP_AF_RSDX,
VCAP_AF_RT_DIS,
+ VCAP_AF_SECUR_MATCH_MAC_ENA,
+ VCAP_AF_SECUR_MATCH_VMID_ENA,
VCAP_AF_SFID_ENA,
VCAP_AF_SFID_VAL,
VCAP_AF_SGID_ENA,
VCAP_AF_SGID_VAL,
+ VCAP_AF_SIP_RPF_ENA,
VCAP_AF_SWAP_MACS_ENA,
VCAP_AF_TAG_A_DEI_SEL,
VCAP_AF_TAG_A_PCP_SEL,
@@ -901,6 +982,7 @@ enum vcap_action_field {
VCAP_AF_VID_VAL,
VCAP_AF_VLAN_POP_CNT,
VCAP_AF_VLAN_POP_CNT_ENA,
+ VCAP_AF_ZERO_DMAC_CPU_QU,
};
#endif /* __VCAP_AG_API__ */
diff --git a/drivers/net/ethernet/microchip/vcap/vcap_model_kunit.c b/drivers/net/ethernet/microchip/vcap/vcap_model_kunit.c
index 5dbfc0d0c369..75819b49e110 100644
--- a/drivers/net/ethernet/microchip/vcap/vcap_model_kunit.c
+++ b/drivers/net/ethernet/microchip/vcap/vcap_model_kunit.c
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: BSD-3-Clause
-/* Copyright (C) 2023 Microchip Technology Inc. and its subsidiaries.
+/* Copyright (C) 2026 Microchip Technology Inc. and its subsidiaries.
* Microchip VCAP test model interface for kunit testing
*/
-/* This file is autogenerated by cml-utils 2023-02-10 11:16:00 +0100.
- * Commit ID: c30fb4bf0281cd4a7133bdab6682f9e43c872ada
+/* This file is autogenerated by cml-utils 2026-04-28 13:55:50 +0200.
+ * Commit ID: cd2494df16a1d3b14f650f720f6a8126b88b553a
*/
#include <linux/types.h>
--
2.52.0
More information about the linux-arm-kernel
mailing list