Skip to content

Commit

Permalink
mlxsw: spectrum_fid: Add an op to get PGT allocation size
Browse files Browse the repository at this point in the history
In the CFF flood mode, the PGT allocation size of RFID family will not
depend on number of FIDs, but rather number of ports and LAGs. Therefore
introduce a FID family operation to calculate the PGT allocation size.

The way that size is calculated in the CFF mode depends on calling fallible
functions. Thus express the op as returning an int, with the size returned
via a pointer argument.

Signed-off-by: Petr Machata <[email protected]>
Reviewed-by: Amit Cohen <[email protected]>
Reviewed-by: Ido Schimmel <[email protected]>
Link: https://lore.kernel.org/r/1174651b7160fcedbef50010ae4b68201112fe6f.1701183892.git.petrm@nvidia.com
Signed-off-by: Jakub Kicinski <[email protected]>
  • Loading branch information
pmachata authored and kuba-moo committed Nov 30, 2023
1 parent 80638da commit 1686b8d
Showing 1 changed file with 18 additions and 5 deletions.
23 changes: 18 additions & 5 deletions drivers/net/ethernet/mellanox/mlxsw/spectrum_fid.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,8 @@ struct mlxsw_sp_fid_ops {
const struct mlxsw_sp_rif *rif);
int (*flood_table_init)(struct mlxsw_sp_fid_family *fid_family,
const struct mlxsw_sp_flood_table *flood_table);
int (*pgt_size)(const struct mlxsw_sp_fid_family *fid_family,
u16 *p_pgt_size);
};

struct mlxsw_sp_fid_family {
Expand Down Expand Up @@ -322,12 +324,14 @@ mlxsw_sp_fid_family_num_fids(const struct mlxsw_sp_fid_family *fid_family)
return fid_family->end_index - fid_family->start_index + 1;
}

static u16
mlxsw_sp_fid_family_pgt_size(const struct mlxsw_sp_fid_family *fid_family)
static int
mlxsw_sp_fid_8021d_pgt_size(const struct mlxsw_sp_fid_family *fid_family,
u16 *p_pgt_size)
{
u16 num_fids = mlxsw_sp_fid_family_num_fids(fid_family);

return num_fids * fid_family->nr_flood_tables;
*p_pgt_size = num_fids * fid_family->nr_flood_tables;
return 0;
}

static u16
Expand Down Expand Up @@ -1124,6 +1128,7 @@ static const struct mlxsw_sp_fid_ops mlxsw_sp_fid_8021d_ops_ctl = {
.fdb_clear_offload = mlxsw_sp_fid_8021d_fdb_clear_offload,
.vid_to_fid_rif_update = mlxsw_sp_fid_8021d_vid_to_fid_rif_update,
.flood_table_init = mlxsw_sp_fid_flood_table_init_ctl,
.pgt_size = mlxsw_sp_fid_8021d_pgt_size,
};

#define MLXSW_SP_FID_8021Q_MAX (VLAN_N_VID - 2)
Expand Down Expand Up @@ -1466,6 +1471,7 @@ static const struct mlxsw_sp_fid_ops mlxsw_sp_fid_8021q_ops_ctl = {
.fdb_clear_offload = mlxsw_sp_fid_8021q_fdb_clear_offload,
.vid_to_fid_rif_update = mlxsw_sp_fid_8021q_vid_to_fid_rif_update,
.flood_table_init = mlxsw_sp_fid_flood_table_init_ctl,
.pgt_size = mlxsw_sp_fid_8021d_pgt_size,
};

/* There are 4K-2 802.1Q FIDs */
Expand Down Expand Up @@ -1717,7 +1723,10 @@ mlxsw_sp_fid_flood_tables_init(struct mlxsw_sp_fid_family *fid_family)
int err;
int i;

pgt_size = mlxsw_sp_fid_family_pgt_size(fid_family);
err = fid_family->ops->pgt_size(fid_family, &pgt_size);
if (err)
return err;

err = mlxsw_sp_pgt_mid_alloc_range(mlxsw_sp, &fid_family->pgt_base,
pgt_size);
if (err)
Expand Down Expand Up @@ -1747,8 +1756,12 @@ mlxsw_sp_fid_flood_tables_fini(struct mlxsw_sp_fid_family *fid_family)
{
struct mlxsw_sp *mlxsw_sp = fid_family->mlxsw_sp;
u16 pgt_size;
int err;

err = fid_family->ops->pgt_size(fid_family, &pgt_size);
if (WARN_ON_ONCE(err))
return;

pgt_size = mlxsw_sp_fid_family_pgt_size(fid_family);
mlxsw_sp_pgt_mid_free_range(mlxsw_sp, fid_family->pgt_base, pgt_size);
}

Expand Down

0 comments on commit 1686b8d

Please sign in to comment.