The buffer pool table contains buffer pool configuration and operational
information. Each entry corresponds to a buffer pool. The Entry ID value
represents the buffer pool ID to access.

The buffer pool table is a static bounded index table, buffer pools are
always present and enabled. It only supports Update and Query operations,
This patch only adds ntmp_bpt_update_entry() helper to support updating
the specified entry of the buffer pool table. Query action to the table
will be added in the future.

Signed-off-by: Wei Fang <[email protected]>
---
 drivers/net/ethernet/freescale/enetc/ntmp.c   | 39 +++++++++++++++++++
 .../ethernet/freescale/enetc/ntmp_private.h   |  6 +++
 include/linux/fsl/ntmp.h                      | 32 +++++++++++++++
 3 files changed, 77 insertions(+)

diff --git a/drivers/net/ethernet/freescale/enetc/ntmp.c 
b/drivers/net/ethernet/freescale/enetc/ntmp.c
index e8c94157ceb1..ef38ebe94da8 100644
--- a/drivers/net/ethernet/freescale/enetc/ntmp.c
+++ b/drivers/net/ethernet/freescale/enetc/ntmp.c
@@ -22,11 +22,15 @@
 #define NTMP_RSST_ID                   3
 #define NTMP_FDBT_ID                   15
 #define NTMP_VFT_ID                    18
+#define NTMP_BPT_ID                    41
 
 /* Generic Update Actions for most tables */
 #define NTMP_GEN_UA_CFGEU              BIT(0)
 #define NTMP_GEN_UA_STSEU              BIT(1)
 
+/* Specific Update Actions for some tables */
+#define BPT_UA_BPSEU                   BIT(1)
+
 /* Query Action: 0: Full query, 1: Only query entry ID */
 #define NTMP_QA_ENTRY_ID               1
 
@@ -234,6 +238,8 @@ static const char *ntmp_table_name(int tbl_id)
                return "FDB Table";
        case NTMP_VFT_ID:
                return "VLAN Filter Table";
+       case NTMP_BPT_ID:
+               return "Buffer Pool Table";
        default:
                return "Unknown Table";
        }
@@ -702,5 +708,38 @@ int ntmp_vft_add_entry(struct ntmp_user *user, u16 vid,
 }
 EXPORT_SYMBOL_GPL(ntmp_vft_add_entry);
 
+int ntmp_bpt_update_entry(struct ntmp_user *user, u32 entry_id,
+                         const struct bpt_cfge_data *cfge)
+{
+       struct ntmp_dma_buf data = {
+               .dev = user->dev,
+               .size = sizeof(struct bpt_req_update),
+       };
+       struct bpt_req_update *req;
+       union netc_cbd cbd;
+       int err;
+
+       err = ntmp_alloc_data_mem(&data, (void **)&req);
+       if (err)
+               return err;
+
+       ntmp_fill_crd_eid(&req->rbe, user->tbl.bpt_ver, 0,
+                         NTMP_GEN_UA_CFGEU | BPT_UA_BPSEU, entry_id);
+       req->cfge = *cfge;
+       ntmp_fill_request_hdr(&cbd, data.dma, NTMP_LEN(data.size, 0),
+                             NTMP_BPT_ID, NTMP_CMD_UPDATE, NTMP_AM_ENTRY_ID);
+
+       err = netc_xmit_ntmp_cmd(user, &cbd);
+       if (err)
+               dev_err(user->dev,
+                       "Failed to update %s entry 0x%x, err: %pe\n",
+                       ntmp_table_name(NTMP_BPT_ID), entry_id, ERR_PTR(err));
+
+       ntmp_free_data_mem(&data);
+
+       return err;
+}
+EXPORT_SYMBOL_GPL(ntmp_bpt_update_entry);
+
 MODULE_DESCRIPTION("NXP NETC Library");
 MODULE_LICENSE("Dual BSD/GPL");
diff --git a/drivers/net/ethernet/freescale/enetc/ntmp_private.h 
b/drivers/net/ethernet/freescale/enetc/ntmp_private.h
index 8f94572eaf0d..c5f6dca7b660 100644
--- a/drivers/net/ethernet/freescale/enetc/ntmp_private.h
+++ b/drivers/net/ethernet/freescale/enetc/ntmp_private.h
@@ -179,4 +179,10 @@ struct vft_req_ua {
        struct vft_cfge_data cfge;
 };
 
+/* Buffer Pool Table Request Data Buffer Format of Update action */
+struct bpt_req_update {
+       struct ntmp_req_by_eid rbe;
+       struct bpt_cfge_data cfge;
+};
+
 #endif
diff --git a/include/linux/fsl/ntmp.h b/include/linux/fsl/ntmp.h
index 6fb2c8c525de..925a455935b0 100644
--- a/include/linux/fsl/ntmp.h
+++ b/include/linux/fsl/ntmp.h
@@ -33,6 +33,7 @@ struct netc_tbl_vers {
        u8 rsst_ver;
        u8 fdbt_ver;
        u8 vft_ver;
+       u8 bpt_ver;
 };
 
 struct netc_cbdr {
@@ -116,6 +117,29 @@ struct vft_cfge_data {
        __le32 et_eid;
 };
 
+struct bpt_bpse_data {
+       __le32 amount_used;
+       __le32 amount_used_hwm;
+       u8 bpd_fc_state;
+#define BPT_FC_STATE           BIT(0)
+#define BPT_BPD                        BIT(1)
+} __packed;
+
+struct bpt_cfge_data {
+       u8 fccfg_sbpen;
+#define BPT_SBP_EN             BIT(0)
+#define BPT_FC_CFG             GENMASK(2, 1)
+#define BPT_FC_CFG_EN_BPFC     1
+       u8 pfc_vector;
+       __le16 max_thresh;
+       __le16 fc_on_thresh;
+       __le16 fc_off_thresh;
+       __le16 sbp_thresh;
+       __le16 resv;
+       __le32 sbp_eid;
+       __le32 fc_ports;
+};
+
 #if IS_ENABLED(CONFIG_NXP_NETC_LIB)
 int ntmp_init_cbdr(struct netc_cbdr *cbdr, struct device *dev,
                   const struct netc_cbdr_regs *regs);
@@ -142,6 +166,8 @@ int ntmp_fdbt_search_port_entry(struct ntmp_user *user, int 
port,
                                struct fdbt_entry_data *entry);
 int ntmp_vft_add_entry(struct ntmp_user *user, u16 vid,
                       const struct vft_cfge_data *cfge);
+int ntmp_bpt_update_entry(struct ntmp_user *user, u32 entry_id,
+                         const struct bpt_cfge_data *cfge);
 #else
 static inline int ntmp_init_cbdr(struct netc_cbdr *cbdr, struct device *dev,
                                 const struct netc_cbdr_regs *regs)
@@ -213,6 +239,12 @@ static inline int ntmp_vft_add_entry(struct ntmp_user 
*user, u16 vid,
        return 0;
 }
 
+static inline int ntmp_bpt_update_entry(struct ntmp_user *user, u32 entry_id,
+                                       const struct bpt_cfge_data *cfge)
+{
+       return 0;
+}
+
 #endif
 
 #endif
-- 
2.34.1


Reply via email to