*/
 MLXSW_ITEM32(reg, sbpr, pool, 0x00, 0, 4);
 
+/* reg_sbpr_infi_size
+ * Size is infinite.
+ * Access: RW
+ */
+MLXSW_ITEM32(reg, sbpr, infi_size, 0x04, 31, 1);
+
 /* reg_sbpr_size
  * Pool size in buffer cells.
+ * Reserved when infi_size = 1.
  * Access: RW
  */
 MLXSW_ITEM32(reg, sbpr, size, 0x04, 0, 24);
 
 static inline void mlxsw_reg_sbpr_pack(char *payload, u8 pool,
                                       enum mlxsw_reg_sbxx_dir dir,
-                                      enum mlxsw_reg_sbpr_mode mode, u32 size)
+                                      enum mlxsw_reg_sbpr_mode mode, u32 size,
+                                      bool infi_size)
 {
        MLXSW_REG_ZERO(sbpr, payload);
        mlxsw_reg_sbpr_pool_set(payload, pool);
        mlxsw_reg_sbpr_dir_set(payload, dir);
        mlxsw_reg_sbpr_mode_set(payload, mode);
        mlxsw_reg_sbpr_size_set(payload, size);
+       mlxsw_reg_sbpr_infi_size_set(payload, infi_size);
 }
 
 /* SBCM - Shared Buffer Class Management Register
 
        struct mlxsw_cp_sb_occ occ;
 };
 
+#define MLXSW_SP_SB_INFI -1U
+
 struct mlxsw_sp_sb_pm {
        u32 min_buff;
        u32 max_buff;
 }
 
 static int mlxsw_sp_sb_pr_write(struct mlxsw_sp *mlxsw_sp, u16 pool_index,
-                               enum mlxsw_reg_sbpr_mode mode, u32 size)
+                               enum mlxsw_reg_sbpr_mode mode,
+                               u32 size, bool infi_size)
 {
        const struct mlxsw_sp_sb_pool_des *des =
                &mlxsw_sp_sb_pool_dess[pool_index];
        struct mlxsw_sp_sb_pr *pr;
        int err;
 
-       mlxsw_reg_sbpr_pack(sbpr_pl, des->pool, des->dir, mode, size);
+       mlxsw_reg_sbpr_pack(sbpr_pl, des->pool, des->dir, mode,
+                           size, infi_size);
        err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sbpr), sbpr_pl);
        if (err)
                return err;
 
+       if (infi_size)
+               size = mlxsw_sp_bytes_cells(mlxsw_sp, mlxsw_sp->sb->sb_size);
        pr = mlxsw_sp_sb_pr_get(mlxsw_sp, pool_index);
        pr->mode = mode;
        pr->size = size;
        int err;
 
        for (i = 0; i < prs_len; i++) {
-               u32 size = mlxsw_sp_bytes_cells(mlxsw_sp, prs[i].size);
-
-               err = mlxsw_sp_sb_pr_write(mlxsw_sp, i, prs[i].mode, size);
+               u32 size = prs[i].size;
+               u32 size_cells;
+
+               if (size == MLXSW_SP_SB_INFI) {
+                       err = mlxsw_sp_sb_pr_write(mlxsw_sp, i, prs[i].mode,
+                                                  0, true);
+               } else {
+                       size_cells = mlxsw_sp_bytes_cells(mlxsw_sp, size);
+                       err = mlxsw_sp_sb_pr_write(mlxsw_sp, i, prs[i].mode,
+                                                  size_cells, false);
+               }
                if (err)
                        return err;
        }
                return -EINVAL;
 
        mode = (enum mlxsw_reg_sbpr_mode) threshold_type;
-       return mlxsw_sp_sb_pr_write(mlxsw_sp, pool_index, mode, pool_size);
+       return mlxsw_sp_sb_pr_write(mlxsw_sp, pool_index, mode,
+                                   pool_size, false);
 }
 
 #define MLXSW_SP_SB_THRESHOLD_TO_ALPHA_OFFSET (-2) /* 3->1, 16->14 */