[v4,11/23] common/cnxk: representee notification callback

Message ID 20240227191550.137687-12-hkalra@marvell.com (mailing list archive)
State Changes Requested, archived
Delegated to: Jerin Jacob
Headers
Series net/cnxk: support for port representors |

Checks

Context Check Description
ci/checkpatch warning coding style issues

Commit Message

Harman Kalra Feb. 27, 2024, 7:15 p.m. UTC
  Setting up a callback which gets invoked every time a representee
comes up or goes down. Later this callback gets handled by network
counterpart.

Signed-off-by: Harman Kalra <hkalra@marvell.com>
---
 drivers/common/cnxk/roc_dev.c      | 70 ++++++++++++++++++++++++++++++
 drivers/common/cnxk/roc_dev_priv.h |  3 ++
 drivers/common/cnxk/roc_eswitch.c  | 23 ++++++++++
 drivers/common/cnxk/roc_eswitch.h  | 31 +++++++++++++
 drivers/common/cnxk/roc_mbox.c     |  2 +
 drivers/common/cnxk/roc_mbox.h     | 19 +++++++-
 drivers/common/cnxk/version.map    |  2 +
 7 files changed, 149 insertions(+), 1 deletion(-)
  

Patch

diff --git a/drivers/common/cnxk/roc_dev.c b/drivers/common/cnxk/roc_dev.c
index 084343c3b4..75fc94e64a 100644
--- a/drivers/common/cnxk/roc_dev.c
+++ b/drivers/common/cnxk/roc_dev.c
@@ -537,6 +537,75 @@  pf_vf_mbox_send_up_msg(struct dev *dev, void *rec_msg)
 	}
 }
 
+static int
+mbox_up_handler_rep_repte_notify(struct dev *dev, struct rep_repte_req *req, struct msg_rsp *rsp)
+{
+	struct roc_eswitch_repte_notify_msg *notify_msg;
+	int rc = 0;
+
+	plt_base_dbg("pf:%d/vf:%d msg id 0x%x (%s) from: pf:%d/vf:%d", dev_get_pf(dev->pf_func),
+		     dev_get_vf(dev->pf_func), req->hdr.id, mbox_id2name(req->hdr.id),
+		     dev_get_pf(req->hdr.pcifunc), dev_get_vf(req->hdr.pcifunc));
+
+	plt_base_dbg("repte pcifunc %x, enable %d", req->repte_pcifunc, req->enable);
+	if (dev->ops && dev->ops->repte_notify) {
+		notify_msg = plt_zmalloc(sizeof(struct roc_eswitch_repte_notify_msg), 0);
+		if (!notify_msg) {
+			plt_err("Failed to allocate memory");
+			rc = -ENOMEM;
+			goto fail;
+		}
+		notify_msg->type = ROC_ESWITCH_REPTE_STATE;
+		notify_msg->state.hw_func = req->repte_pcifunc;
+		notify_msg->state.enable = req->enable;
+
+		rc = dev->ops->repte_notify(dev->roc_nix, (void *)notify_msg);
+		if (rc < 0)
+			plt_err("Failed to sent new representee %x notification to %s",
+				req->repte_pcifunc, (req->enable == true) ? "enable" : "disable");
+
+		plt_free(notify_msg);
+	}
+fail:
+	rsp->hdr.rc = rc;
+	return rc;
+}
+
+static int
+mbox_up_handler_rep_set_mtu(struct dev *dev, struct rep_mtu *req, struct msg_rsp *rsp)
+{
+	struct roc_eswitch_repte_notify_msg *notify_msg;
+	int rc = 0;
+
+	plt_base_dbg("pf:%d/vf:%d msg id 0x%x (%s) from: pf:%d/vf:%d", dev_get_pf(dev->pf_func),
+		     dev_get_vf(dev->pf_func), req->hdr.id, mbox_id2name(req->hdr.id),
+		     dev_get_pf(req->hdr.pcifunc), dev_get_vf(req->hdr.pcifunc));
+
+	plt_base_dbg("rep pcifunc %x, rep id %d mtu %d", req->rep_pcifunc, req->rep_id, req->mtu);
+	if (dev->ops && dev->ops->repte_notify) {
+		notify_msg = plt_zmalloc(sizeof(struct roc_eswitch_repte_notify_msg), 0);
+		if (!notify_msg) {
+			plt_err("Failed to allocate memory");
+			rc = -ENOMEM;
+			goto fail;
+		}
+		notify_msg->type = ROC_ESWITCH_REPTE_MTU;
+		notify_msg->mtu.hw_func = req->rep_pcifunc;
+		notify_msg->mtu.rep_id = req->rep_id;
+		notify_msg->mtu.mtu = req->mtu;
+
+		rc = dev->ops->repte_notify(dev->roc_nix, (void *)notify_msg);
+		if (rc < 0)
+			plt_err("Failed to send new mtu notification for representee %x ",
+				req->rep_pcifunc);
+
+		plt_free(notify_msg);
+	}
+fail:
+	rsp->hdr.rc = rc;
+	return rc;
+}
+
 static int
 mbox_up_handler_mcs_intr_notify(struct dev *dev, struct mcs_intr_info *info, struct msg_rsp *rsp)
 {
@@ -711,6 +780,7 @@  mbox_process_msgs_up(struct dev *dev, struct mbox_msghdr *req)
 	}
 		MBOX_UP_CGX_MESSAGES
 		MBOX_UP_MCS_MESSAGES
+		MBOX_UP_REP_MESSAGES
 #undef M
 	}
 
diff --git a/drivers/common/cnxk/roc_dev_priv.h b/drivers/common/cnxk/roc_dev_priv.h
index 5b2c5096f8..50e12cbf17 100644
--- a/drivers/common/cnxk/roc_dev_priv.h
+++ b/drivers/common/cnxk/roc_dev_priv.h
@@ -36,12 +36,15 @@  typedef void (*q_err_cb_t)(void *roc_nix, void *data);
 /* Link status get callback */
 typedef void (*link_status_get_t)(void *roc_nix,
 				  struct cgx_link_user_info *link);
+/* Representee notification callback */
+typedef int (*repte_notify_t)(void *roc_nix, void *notify_msg);
 
 struct dev_ops {
 	link_info_t link_status_update;
 	ptp_info_t ptp_info_update;
 	link_status_get_t link_status_get;
 	q_err_cb_t q_err_cb;
+	repte_notify_t repte_notify;
 };
 
 #define dev_is_vf(dev) ((dev)->hwcap & DEV_HWCAP_F_VF)
diff --git a/drivers/common/cnxk/roc_eswitch.c b/drivers/common/cnxk/roc_eswitch.c
index 020a891a32..14819bad75 100644
--- a/drivers/common/cnxk/roc_eswitch.c
+++ b/drivers/common/cnxk/roc_eswitch.c
@@ -319,3 +319,26 @@  roc_eswitch_nix_vlan_tpid_set(struct roc_nix *roc_nix, uint32_t type, uint16_t t
 
 	return rc;
 }
+
+int
+roc_eswitch_nix_process_repte_notify_cb_register(struct roc_nix *roc_nix,
+						 process_repte_notify_t proc_repte_nt)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+
+	if (proc_repte_nt == NULL)
+		return NIX_ERR_PARAM;
+
+	dev->ops->repte_notify = (repte_notify_t)proc_repte_nt;
+	return 0;
+}
+
+void
+roc_eswitch_nix_process_repte_notify_cb_unregister(struct roc_nix *roc_nix)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+
+	dev->ops->repte_notify = NULL;
+}
diff --git a/drivers/common/cnxk/roc_eswitch.h b/drivers/common/cnxk/roc_eswitch.h
index 34b75d10ac..e0df0038d4 100644
--- a/drivers/common/cnxk/roc_eswitch.h
+++ b/drivers/common/cnxk/roc_eswitch.h
@@ -8,6 +8,34 @@ 
 #define ROC_ESWITCH_VLAN_TPID 0x8100
 #define ROC_ESWITCH_LBK_CHAN  63
 
+typedef enum roc_eswitch_repte_notify_msg_type {
+	ROC_ESWITCH_REPTE_STATE = 0,
+	ROC_ESWITCH_REPTE_MTU,
+} roc_eswitch_repte_notify_msg_type_t;
+
+struct roc_eswitch_repte_state {
+	bool enable;
+	uint16_t hw_func;
+};
+
+struct roc_eswitch_repte_mtu {
+	uint16_t mtu;
+	uint16_t rep_id;
+	uint16_t hw_func;
+};
+
+struct roc_eswitch_repte_notify_msg {
+	roc_eswitch_repte_notify_msg_type_t type;
+	union {
+		struct roc_eswitch_repte_state state;
+		struct roc_eswitch_repte_mtu mtu;
+	};
+};
+
+/* Process representee notification callback */
+typedef int (*process_repte_notify_t)(void *roc_nix,
+				      struct roc_eswitch_repte_notify_msg *notify_msg);
+
 /* NPC */
 int __roc_api roc_eswitch_npc_mcam_rx_rule(struct roc_npc *roc_npc, struct roc_npc_flow *flow,
 					   uint16_t pcifunc, uint16_t vlan_tci,
@@ -23,4 +51,7 @@  int __roc_api roc_eswitch_npc_rss_action_configure(struct roc_npc *roc_npc,
 /* NIX */
 int __roc_api roc_eswitch_nix_vlan_tpid_set(struct roc_nix *nix, uint32_t type, uint16_t tpid,
 					    bool is_vf);
+int __roc_api roc_eswitch_nix_process_repte_notify_cb_register(struct roc_nix *roc_nix,
+						    process_repte_notify_t proc_repte_nt);
+void __roc_api roc_eswitch_nix_process_repte_notify_cb_unregister(struct roc_nix *roc_nix);
 #endif /* __ROC_ESWITCH_H__ */
diff --git a/drivers/common/cnxk/roc_mbox.c b/drivers/common/cnxk/roc_mbox.c
index 7b734fcd24..10cdbc4d13 100644
--- a/drivers/common/cnxk/roc_mbox.c
+++ b/drivers/common/cnxk/roc_mbox.c
@@ -499,6 +499,7 @@  mbox_id2name(uint16_t id)
 		return #_name;
 		MBOX_MESSAGES
 		MBOX_UP_CGX_MESSAGES
+		MBOX_UP_REP_MESSAGES
 #undef M
 	}
 }
@@ -514,6 +515,7 @@  mbox_id2size(uint16_t id)
 		return sizeof(struct _req_type);
 		MBOX_MESSAGES
 		MBOX_UP_CGX_MESSAGES
+		MBOX_UP_REP_MESSAGES
 #undef M
 	}
 }
diff --git a/drivers/common/cnxk/roc_mbox.h b/drivers/common/cnxk/roc_mbox.h
index 6df8176f5f..ea09dcc2cf 100644
--- a/drivers/common/cnxk/roc_mbox.h
+++ b/drivers/common/cnxk/roc_mbox.h
@@ -357,9 +357,13 @@  struct mbox_msghdr {
 
 #define MBOX_UP_MCS_MESSAGES M(MCS_INTR_NOTIFY, 0xE00, mcs_intr_notify, mcs_intr_info, msg_rsp)
 
+#define MBOX_UP_REP_MESSAGES						       \
+M(REP_REPTE_NOTIFY, 0xEF1, rep_repte_notify, rep_repte_req, msg_rsp)           \
+M(REP_SET_MTU, 0xEF2, rep_set_mtu, rep_mtu, msg_rsp)
+
 enum {
 #define M(_name, _id, _1, _2, _3) MBOX_MSG_##_name = _id,
-	MBOX_MESSAGES MBOX_UP_CGX_MESSAGES MBOX_UP_MCS_MESSAGES
+	MBOX_MESSAGES MBOX_UP_CGX_MESSAGES MBOX_UP_MCS_MESSAGES MBOX_UP_REP_MESSAGES
 #undef M
 };
 
@@ -2799,4 +2803,17 @@  struct nix_spi_to_sa_delete_req {
 	uint16_t __io hash_index;
 	uint8_t __io way;
 };
+
+struct rep_repte_req {
+	struct mbox_msghdr hdr;
+	uint16_t __io repte_pcifunc;
+	bool __io enable;
+};
+
+struct rep_mtu {
+	struct mbox_msghdr hdr;
+	uint16_t __io rep_pcifunc;
+	uint16_t __io rep_id;
+	uint16_t __io mtu;
+};
 #endif /* __ROC_MBOX_H__ */
diff --git a/drivers/common/cnxk/version.map b/drivers/common/cnxk/version.map
index 2ee54c52d7..ebf615f26e 100644
--- a/drivers/common/cnxk/version.map
+++ b/drivers/common/cnxk/version.map
@@ -91,6 +91,8 @@  INTERNAL {
 	roc_dpi_disable;
 	roc_dpi_enable;
 	roc_error_msg_get;
+	roc_eswitch_nix_process_repte_notify_cb_register;
+	roc_eswitch_nix_process_repte_notify_cb_unregister;
 	roc_eswitch_nix_vlan_tpid_set;
 	roc_eswitch_npc_mcam_delete_rule;
 	roc_eswitch_npc_mcam_rx_rule;