]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
mlxsw: spectrum_acl: Add region association callback
authorIdo Schimmel <idosch@mellanox.com>
Wed, 18 Jul 2018 08:14:43 +0000 (11:14 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 18 Jul 2018 17:13:14 +0000 (02:13 +0900)
In Spectrum-2, ACL regions that use 8 or 12 key blocks require several
consecutive hardware regions.

In order to allow defragmentation, the device stores a mapping from a
logical region ID to an hardware region ID, which is similar to the page
table that is used to translate virtual addresses to physical addresses.

Add the region association callback to the region create sequence and
implement it as a NOP in Spectrum which does not require it.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum.h
drivers/net/ethernet/mellanox/mlxsw/spectrum1_acl_tcam.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c

index dee9c18227278a009e4ee5ddd80020e7e7b03eb1..f51831e337577918bdf5b6f18be8fad3a1595017 100644 (file)
@@ -624,6 +624,8 @@ struct mlxsw_sp_acl_tcam_ops {
        int (*region_init)(struct mlxsw_sp *mlxsw_sp, void *region_priv,
                           struct mlxsw_sp_acl_tcam_region *region);
        void (*region_fini)(struct mlxsw_sp *mlxsw_sp, void *region_priv);
+       int (*region_associate)(struct mlxsw_sp *mlxsw_sp,
+                               struct mlxsw_sp_acl_tcam_region *region);
        size_t chunk_priv_size;
        void (*chunk_init)(void *region_priv, void *chunk_priv,
                           unsigned int priority);
index 04f0c9cfae244378f53988d699232c52aa768121..d339ec43d79cbdd2561eb81aaaf03aaa204288f7 100644 (file)
@@ -151,6 +151,13 @@ mlxsw_sp1_acl_tcam_region_fini(struct mlxsw_sp *mlxsw_sp, void *region_priv)
        mlxsw_sp_acl_ctcam_region_fini(&region->cregion);
 }
 
+static int
+mlxsw_sp1_acl_tcam_region_associate(struct mlxsw_sp *mlxsw_sp,
+                                   struct mlxsw_sp_acl_tcam_region *region)
+{
+       return 0;
+}
+
 static void mlxsw_sp1_acl_tcam_chunk_init(void *region_priv, void *chunk_priv,
                                          unsigned int priority)
 {
@@ -235,6 +242,7 @@ const struct mlxsw_sp_acl_tcam_ops mlxsw_sp1_acl_tcam_ops = {
        .region_priv_size       = sizeof(struct mlxsw_sp1_acl_tcam_region),
        .region_init            = mlxsw_sp1_acl_tcam_region_init,
        .region_fini            = mlxsw_sp1_acl_tcam_region_fini,
+       .region_associate       = mlxsw_sp1_acl_tcam_region_associate,
        .chunk_priv_size        = sizeof(struct mlxsw_sp1_acl_tcam_chunk),
        .chunk_init             = mlxsw_sp1_acl_tcam_chunk_init,
        .chunk_fini             = mlxsw_sp1_acl_tcam_chunk_fini,
index 53fe51a8d720891389a4e9493bafab8a98b139b8..e06d7d9e5b7f4276cb12dac68df8245e758cca68 100644 (file)
@@ -547,6 +547,10 @@ mlxsw_sp_acl_tcam_region_create(struct mlxsw_sp *mlxsw_sp,
        if (err)
                goto err_region_id_get;
 
+       err = ops->region_associate(mlxsw_sp, region);
+       if (err)
+               goto err_tcam_region_associate;
+
        region->key_type = ops->key_type;
        err = mlxsw_sp_acl_tcam_region_alloc(mlxsw_sp, region);
        if (err)
@@ -567,6 +571,7 @@ err_tcam_region_init:
 err_tcam_region_enable:
        mlxsw_sp_acl_tcam_region_free(mlxsw_sp, region);
 err_tcam_region_alloc:
+err_tcam_region_associate:
        mlxsw_sp_acl_tcam_region_id_put(tcam, region->id);
 err_region_id_get:
        mlxsw_afk_key_info_put(region->key_info);