]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net/mlx5: Add software system image GUID infrastructure
authorMark Bloch <mbloch@nvidia.com>
Thu, 23 Oct 2025 09:16:57 +0000 (12:16 +0300)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 28 Oct 2025 10:11:27 +0000 (11:11 +0100)
Replace direct hardware system image GUID usage with a new software
system image GUID function that supports variable-length identifiers.

Key changes:
- Add mlx5_query_nic_sw_system_image_guid() function with length parameter.
- Update all callsites to use the new function and buffer/length approach.
- Modify mapping contexts to use byte arrays instead of u64 keys.
- Update devcom matching to support variable-length keys.
- Change mlx5_same_hw_devs() to use buffer comparison instead of u64.

This refactoring prepares the infrastructure for balance ID support,
which requires extending the system image GUID with additional data.
The change maintains backward compatibility while enabling future
enhancements.

Signed-off-by: Mark Bloch <mbloch@nvidia.com>
Reviewed-by: Shay Drori <shayd@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/1761211020-925651-3-git-send-email-tariqt@nvidia.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
14 files changed:
drivers/net/ethernet/mellanox/mlx5/core/dev.c
drivers/net/ethernet/mellanox/mlx5/core/en/devlink.c
drivers/net/ethernet/mellanox/mlx5/core/en/mapping.c
drivers/net/ethernet/mellanox/mlx5/core/en/mapping.h
drivers/net/ethernet/mellanox/mlx5/core/en/tc/int_port.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c
drivers/net/ethernet/mellanox/mlx5/core/lib/devcom.h
drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
drivers/net/ethernet/mellanox/mlx5/core/vport.c
include/linux/mlx5/driver.h

index 891bbbbfbbf1a4dadae7d9e7d0942c1fec0ac738..64c04f52990fe07735c21b3025557b10579ba15e 100644 (file)
@@ -564,10 +564,14 @@ int mlx5_rescan_drivers_locked(struct mlx5_core_dev *dev)
 
 bool mlx5_same_hw_devs(struct mlx5_core_dev *dev, struct mlx5_core_dev *peer_dev)
 {
-       u64 fsystem_guid, psystem_guid;
+       u8 fsystem_guid[MLX5_SW_IMAGE_GUID_MAX_BYTES];
+       u8 psystem_guid[MLX5_SW_IMAGE_GUID_MAX_BYTES];
+       u8 flen;
+       u8 plen;
 
-       fsystem_guid = mlx5_query_nic_system_image_guid(dev);
-       psystem_guid = mlx5_query_nic_system_image_guid(peer_dev);
+       mlx5_query_nic_sw_system_image_guid(dev, fsystem_guid, &flen);
+       mlx5_query_nic_sw_system_image_guid(peer_dev, psystem_guid, &plen);
 
-       return (fsystem_guid && psystem_guid && fsystem_guid == psystem_guid);
+       return plen && flen && flen == plen &&
+               !memcmp(fsystem_guid, psystem_guid, flen);
 }
index 0b1ac6e5c8900d1b58370d258f5ca56e39a61b21..8818f65d1fbc4cdf3d2e4a9f91e8eefef04621d9 100644 (file)
@@ -40,11 +40,8 @@ void mlx5e_destroy_devlink(struct mlx5e_dev *mlx5e_dev)
 static void
 mlx5e_devlink_get_port_parent_id(struct mlx5_core_dev *dev, struct netdev_phys_item_id *ppid)
 {
-       u64 parent_id;
-
-       parent_id = mlx5_query_nic_system_image_guid(dev);
-       ppid->id_len = sizeof(parent_id);
-       memcpy(ppid->id, &parent_id, sizeof(parent_id));
+       BUILD_BUG_ON(MLX5_SW_IMAGE_GUID_MAX_BYTES > MAX_PHYS_ITEM_ID_LEN);
+       mlx5_query_nic_sw_system_image_guid(dev, ppid->id, &ppid->id_len);
 }
 
 int mlx5e_devlink_port_register(struct mlx5e_dev *mlx5e_dev,
index 4e72ca8070e2438d4ef5042bc237a26514a7ebc5..1de18c7e96ec9ee7b2ad91959b6703a1970934f1 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/xarray.h>
 #include <linux/hashtable.h>
 #include <linux/refcount.h>
+#include <linux/mlx5/driver.h>
 
 #include "mapping.h"
 
@@ -24,7 +25,8 @@ struct mapping_ctx {
        struct delayed_work dwork;
        struct list_head pending_list;
        spinlock_t pending_list_lock; /* Guards pending list */
-       u64 id;
+       u8 id[MLX5_SW_IMAGE_GUID_MAX_BYTES];
+       u8 id_len;
        u8 type;
        struct list_head list;
        refcount_t refcount;
@@ -220,13 +222,15 @@ mapping_create(size_t data_size, u32 max_id, bool delayed_removal)
 }
 
 struct mapping_ctx *
-mapping_create_for_id(u64 id, u8 type, size_t data_size, u32 max_id, bool delayed_removal)
+mapping_create_for_id(u8 *id, u8 id_len, u8 type, size_t data_size, u32 max_id,
+                     bool delayed_removal)
 {
        struct mapping_ctx *ctx;
 
        mutex_lock(&shared_ctx_lock);
        list_for_each_entry(ctx, &shared_ctx_list, list) {
-               if (ctx->id == id && ctx->type == type) {
+               if (ctx->type == type && ctx->id_len == id_len &&
+                   !memcmp(id, ctx->id, id_len)) {
                        if (refcount_inc_not_zero(&ctx->refcount))
                                goto unlock;
                        break;
@@ -237,7 +241,8 @@ mapping_create_for_id(u64 id, u8 type, size_t data_size, u32 max_id, bool delaye
        if (IS_ERR(ctx))
                goto unlock;
 
-       ctx->id = id;
+       memcpy(ctx->id, id, id_len);
+       ctx->id_len = id_len;
        ctx->type = type;
        list_add(&ctx->list, &shared_ctx_list);
 
index 4e2119f0f4c119ee7a670c5723d97ff7b863dc68..e86a103d58b9cd5a119fe371596a7e0c7fab3cdd 100644 (file)
@@ -27,6 +27,7 @@ void mapping_destroy(struct mapping_ctx *ctx);
 /* adds mapping with an id or get an existing mapping with the same id
  */
 struct mapping_ctx *
-mapping_create_for_id(u64 id, u8 type, size_t data_size, u32 max_id, bool delayed_removal);
+mapping_create_for_id(u8 *id, u8 id_len, u8 type, size_t data_size, u32 max_id,
+                     bool delayed_removal);
 
 #endif /* __MLX5_MAPPING_H__ */
index 896f718483c30ca65f4ee1263203a3bd4ef63842..991f47050643d752a4c344f584df1cfafd604ce0 100644 (file)
@@ -307,7 +307,8 @@ mlx5e_tc_int_port_init(struct mlx5e_priv *priv)
 {
        struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
        struct mlx5e_tc_int_port_priv *int_port_priv;
-       u64 mapping_id;
+       u8 mapping_id[MLX5_SW_IMAGE_GUID_MAX_BYTES];
+       u8 id_len;
 
        if (!mlx5e_tc_int_port_supported(esw))
                return NULL;
@@ -316,9 +317,10 @@ mlx5e_tc_int_port_init(struct mlx5e_priv *priv)
        if (!int_port_priv)
                return NULL;
 
-       mapping_id = mlx5_query_nic_system_image_guid(priv->mdev);
+       mlx5_query_nic_sw_system_image_guid(priv->mdev, mapping_id, &id_len);
 
-       int_port_priv->metadata_mapping = mapping_create_for_id(mapping_id, MAPPING_TYPE_INT_PORT,
+       int_port_priv->metadata_mapping = mapping_create_for_id(mapping_id, id_len,
+                                                               MAPPING_TYPE_INT_PORT,
                                                                sizeof(u32) * 2,
                                                                (1 << ESW_VPORT_BITS) - 1, true);
        if (IS_ERR(int_port_priv->metadata_mapping)) {
index 870d12364f99e1d07daf171ebf71b9c7bbced82d..fc0e57403d2549bb2217f1816613ab9f7d6d67c6 100644 (file)
@@ -2287,9 +2287,10 @@ mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains,
                enum mlx5_flow_namespace_type ns_type,
                struct mlx5e_post_act *post_act)
 {
+       u8 mapping_id[MLX5_SW_IMAGE_GUID_MAX_BYTES];
        struct mlx5_tc_ct_priv *ct_priv;
        struct mlx5_core_dev *dev;
-       u64 mapping_id;
+       u8 id_len;
        int err;
 
        dev = priv->mdev;
@@ -2301,16 +2302,18 @@ mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains,
        if (!ct_priv)
                goto err_alloc;
 
-       mapping_id = mlx5_query_nic_system_image_guid(dev);
+       mlx5_query_nic_sw_system_image_guid(dev, mapping_id, &id_len);
 
-       ct_priv->zone_mapping = mapping_create_for_id(mapping_id, MAPPING_TYPE_ZONE,
+       ct_priv->zone_mapping = mapping_create_for_id(mapping_id, id_len,
+                                                     MAPPING_TYPE_ZONE,
                                                      sizeof(u16), 0, true);
        if (IS_ERR(ct_priv->zone_mapping)) {
                err = PTR_ERR(ct_priv->zone_mapping);
                goto err_mapping_zone;
        }
 
-       ct_priv->labels_mapping = mapping_create_for_id(mapping_id, MAPPING_TYPE_LABELS,
+       ct_priv->labels_mapping = mapping_create_for_id(mapping_id, id_len,
+                                                       MAPPING_TYPE_LABELS,
                                                        sizeof(u32) * 4, 0, true);
        if (IS_ERR(ct_priv->labels_mapping)) {
                err = PTR_ERR(ct_priv->labels_mapping);
index 54ccfb4e6c4e2f6c14c2c007e7f18738742f315c..a8773b2342c2af90be95eeb9805fee63063874f9 100644 (file)
@@ -5233,10 +5233,11 @@ static void mlx5e_tc_nic_destroy_miss_table(struct mlx5e_priv *priv)
 int mlx5e_tc_nic_init(struct mlx5e_priv *priv)
 {
        struct mlx5e_tc_table *tc = mlx5e_fs_get_tc(priv->fs);
+       u8 mapping_id[MLX5_SW_IMAGE_GUID_MAX_BYTES];
        struct mlx5_core_dev *dev = priv->mdev;
        struct mapping_ctx *chains_mapping;
        struct mlx5_chains_attr attr = {};
-       u64 mapping_id;
+       u8 id_len;
        int err;
 
        mlx5e_mod_hdr_tbl_init(&tc->mod_hdr);
@@ -5252,11 +5253,13 @@ int mlx5e_tc_nic_init(struct mlx5e_priv *priv)
        lockdep_set_class(&tc->ht.mutex, &tc_ht_lock_key);
        lockdep_init_map(&tc->ht.run_work.lockdep_map, "tc_ht_wq_key", &tc_ht_wq_key, 0);
 
-       mapping_id = mlx5_query_nic_system_image_guid(dev);
+       mlx5_query_nic_sw_system_image_guid(dev, mapping_id, &id_len);
 
-       chains_mapping = mapping_create_for_id(mapping_id, MAPPING_TYPE_CHAIN,
+       chains_mapping = mapping_create_for_id(mapping_id, id_len,
+                                              MAPPING_TYPE_CHAIN,
                                               sizeof(struct mlx5_mapped_obj),
-                                              MLX5E_TC_TABLE_CHAIN_TAG_MASK, true);
+                                              MLX5E_TC_TABLE_CHAIN_TAG_MASK,
+                                              true);
 
        if (IS_ERR(chains_mapping)) {
                err = PTR_ERR(chains_mapping);
@@ -5387,14 +5390,15 @@ void mlx5e_tc_ht_cleanup(struct rhashtable *tc_ht)
 int mlx5e_tc_esw_init(struct mlx5_rep_uplink_priv *uplink_priv)
 {
        const size_t sz_enc_opts = sizeof(struct tunnel_match_enc_opts);
+       u8 mapping_id[MLX5_SW_IMAGE_GUID_MAX_BYTES];
        struct mlx5_devcom_match_attr attr = {};
        struct netdev_phys_item_id ppid;
        struct mlx5e_rep_priv *rpriv;
        struct mapping_ctx *mapping;
        struct mlx5_eswitch *esw;
        struct mlx5e_priv *priv;
-       u64 mapping_id;
        int err = 0;
+       u8 id_len;
 
        rpriv = container_of(uplink_priv, struct mlx5e_rep_priv, uplink_priv);
        priv = netdev_priv(rpriv->netdev);
@@ -5412,9 +5416,9 @@ int mlx5e_tc_esw_init(struct mlx5_rep_uplink_priv *uplink_priv)
 
        uplink_priv->tc_psample = mlx5e_tc_sample_init(esw, uplink_priv->post_act);
 
-       mapping_id = mlx5_query_nic_system_image_guid(esw->dev);
+       mlx5_query_nic_sw_system_image_guid(esw->dev, mapping_id, &id_len);
 
-       mapping = mapping_create_for_id(mapping_id, MAPPING_TYPE_TUNNEL,
+       mapping = mapping_create_for_id(mapping_id, id_len, MAPPING_TYPE_TUNNEL,
                                        sizeof(struct tunnel_match_key),
                                        TUNNEL_INFO_BITS_MASK, true);
 
@@ -5427,8 +5431,10 @@ int mlx5e_tc_esw_init(struct mlx5_rep_uplink_priv *uplink_priv)
        /* Two last values are reserved for stack devices slow path table mark
         * and bridge ingress push mark.
         */
-       mapping = mapping_create_for_id(mapping_id, MAPPING_TYPE_TUNNEL_ENC_OPTS,
-                                       sz_enc_opts, ENC_OPTS_BITS_MASK - 2, true);
+       mapping = mapping_create_for_id(mapping_id, id_len,
+                                       MAPPING_TYPE_TUNNEL_ENC_OPTS,
+                                       sz_enc_opts, ENC_OPTS_BITS_MASK - 2,
+                                       true);
        if (IS_ERR(mapping)) {
                err = PTR_ERR(mapping);
                goto err_enc_opts_mapping;
@@ -5449,7 +5455,7 @@ int mlx5e_tc_esw_init(struct mlx5_rep_uplink_priv *uplink_priv)
 
        err = netif_get_port_parent_id(priv->netdev, &ppid, false);
        if (!err) {
-               memcpy(&attr.key.val, &ppid.id, sizeof(attr.key.val));
+               memcpy(&attr.key.buf, &ppid.id, ppid.id_len);
                attr.flags = MLX5_DEVCOM_MATCH_FLAGS_NS;
                attr.net = mlx5_core_net(esw->dev);
                mlx5_esw_offloads_devcom_init(esw, &attr);
index cf88a106d80d71c2f394d2e9392d7f9a559f0313..89a58dee50b3a1207148ed31d4df79b7b15b6e78 100644 (file)
@@ -7,11 +7,7 @@
 static void
 mlx5_esw_get_port_parent_id(struct mlx5_core_dev *dev, struct netdev_phys_item_id *ppid)
 {
-       u64 parent_id;
-
-       parent_id = mlx5_query_nic_system_image_guid(dev);
-       ppid->id_len = sizeof(parent_id);
-       memcpy(ppid->id, &parent_id, sizeof(parent_id));
+       mlx5_query_nic_sw_system_image_guid(dev, ppid->id, &ppid->id_len);
 }
 
 static bool mlx5_esw_devlink_port_supported(struct mlx5_eswitch *esw, u16 vport_num)
index 34749814f19b86d2901e4e14c9ea43e2400582d1..9735a75732cf5bbb3b0c1161774f0711b193426a 100644 (file)
@@ -3557,10 +3557,11 @@ bool mlx5_esw_offloads_controller_valid(const struct mlx5_eswitch *esw, u32 cont
 
 int esw_offloads_enable(struct mlx5_eswitch *esw)
 {
+       u8 mapping_id[MLX5_SW_IMAGE_GUID_MAX_BYTES];
        struct mapping_ctx *reg_c0_obj_pool;
        struct mlx5_vport *vport;
        unsigned long i;
-       u64 mapping_id;
+       u8 id_len;
        int err;
 
        mutex_init(&esw->offloads.termtbl_mutex);
@@ -3582,9 +3583,10 @@ int esw_offloads_enable(struct mlx5_eswitch *esw)
        if (err)
                goto err_vport_metadata;
 
-       mapping_id = mlx5_query_nic_system_image_guid(esw->dev);
+       mlx5_query_nic_sw_system_image_guid(esw->dev, mapping_id, &id_len);
 
-       reg_c0_obj_pool = mapping_create_for_id(mapping_id, MAPPING_TYPE_CHAIN,
+       reg_c0_obj_pool = mapping_create_for_id(mapping_id, id_len,
+                                               MAPPING_TYPE_CHAIN,
                                                sizeof(struct mlx5_mapped_obj),
                                                ESW_REG_C0_USER_DATA_METADATA_MASK,
                                                true);
index 3db0387bf6dcb727a65df9d0253f242554af06db..1ac933cd8f02b1066e752951aad4bfd25ea6674f 100644 (file)
@@ -1418,10 +1418,12 @@ static void mlx5_lag_unregister_hca_devcom_comp(struct mlx5_core_dev *dev)
 static int mlx5_lag_register_hca_devcom_comp(struct mlx5_core_dev *dev)
 {
        struct mlx5_devcom_match_attr attr = {
-               .key.val = mlx5_query_nic_system_image_guid(dev),
                .flags = MLX5_DEVCOM_MATCH_FLAGS_NS,
                .net = mlx5_core_net(dev),
        };
+       u8 len __always_unused;
+
+       mlx5_query_nic_sw_system_image_guid(dev, attr.key.buf, &len);
 
        /* This component is use to sync adding core_dev to lag_dev and to sync
         * changes of mlx5_adev_devices between LAG layer and other layers.
index 609c85f4791734831d3e890c4e205c2d9ca26d58..91e5ae529d5c6b2e1387b4b7ab515f99f20cdf16 100644 (file)
@@ -10,8 +10,10 @@ enum mlx5_devom_match_flags {
        MLX5_DEVCOM_MATCH_FLAGS_NS = BIT(0),
 };
 
+#define MLX5_DEVCOM_MATCH_KEY_MAX 32
 union mlx5_devcom_match_key {
        u64 val;
+       u8 buf[MLX5_DEVCOM_MATCH_KEY_MAX];
 };
 
 struct mlx5_devcom_match_attr {
index 082259b56816ce768e05d00a889752a585d2c88b..acef7d0ffa0978544144e7dd4e0534c84e8bbbae 100644 (file)
@@ -444,6 +444,8 @@ int mlx5_init_one_light(struct mlx5_core_dev *dev);
 void mlx5_uninit_one_light(struct mlx5_core_dev *dev);
 void mlx5_unload_one_light(struct mlx5_core_dev *dev);
 
+void mlx5_query_nic_sw_system_image_guid(struct mlx5_core_dev *mdev, u8 *buf,
+                                        u8 *len);
 int mlx5_vport_set_other_func_cap(struct mlx5_core_dev *dev, const void *hca_cap, u16 vport,
                                  u16 opmod);
 #define mlx5_vport_get_other_func_general_cap(dev, vport, out)         \
index 2ed2e530b07d0f97bbfa7a4a3e66cae24799706e..4224e275086549de9f8a867dd20dce4876b66ffe 100644 (file)
@@ -1190,6 +1190,21 @@ u64 mlx5_query_nic_system_image_guid(struct mlx5_core_dev *mdev)
 }
 EXPORT_SYMBOL_GPL(mlx5_query_nic_system_image_guid);
 
+void mlx5_query_nic_sw_system_image_guid(struct mlx5_core_dev *mdev, u8 *buf,
+                                        u8 *len)
+{
+       u64 fw_system_image_guid;
+
+       *len = 0;
+
+       fw_system_image_guid = mlx5_query_nic_system_image_guid(mdev);
+       if (!fw_system_image_guid)
+               return;
+
+       memcpy(buf, &fw_system_image_guid, sizeof(fw_system_image_guid));
+       *len += sizeof(fw_system_image_guid);
+}
+
 static bool mlx5_vport_use_vhca_id_as_func_id(struct mlx5_core_dev *dev,
                                              u16 vport_num, u16 *vhca_id)
 {
index 5405ca1038f9ea175ea5bc028e801bb8d7de9311..dcf262aa9ea6b6ee4e40eb1c41421b8c3ca788c2 100644 (file)
@@ -1379,4 +1379,7 @@ static inline struct net *mlx5_core_net(struct mlx5_core_dev *dev)
 {
        return devlink_net(priv_to_devlink(dev));
 }
+
+#define MLX5_SW_IMAGE_GUID_MAX_BYTES 8
+
 #endif /* MLX5_DRIVER_H */