Re: [PATCH v40 4/7] firmware: imx: device context dedicated to priv

Frank Li <[email protected]>
Newsgroups dev.linux.lists.imx,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-doc,org.kernel.vger.linux-kernel
Message-ID <aoh1FQFxUciEl1PL@lizhi-Precision-Tower-5810>
On Sat, Aug 22, 2026 at 12:06:11AM +0530, [email protected] wrote:
> From: Pankaj Gupta <[email protected]>
>
> Add priv_dev_ctx to prepare enabling misc-device context based send-receive
> path, to communicate with FW.
>
> No functionality change.
>
> Signed-off-by: Pankaj Gupta <[email protected]>
> Reviewed-by: Frank Li <[email protected]>
> Signed-off-by: Frank Li <[email protected]>
> ---
>  drivers/firmware/imx/ele_base_msg.c | 15 +++++-----
>  drivers/firmware/imx/ele_common.c   | 55 +++++++++++++++++++++----------------
>  drivers/firmware/imx/ele_common.h   |  8 +++---
>  drivers/firmware/imx/se_ctrl.c      | 41 +++++++++++++++++++++++++++
>  drivers/firmware/imx/se_ctrl.h      |  9 ++++++
>  5 files changed, 94 insertions(+), 34 deletions(-)
>
> diff --git a/drivers/firmware/imx/ele_base_msg.c b/drivers/firmware/imx/ele_base_msg.c
> index 724f6e913ce7..b70e3ef88a16 100644
> --- a/drivers/firmware/imx/ele_base_msg.c
> +++ b/drivers/firmware/imx/ele_base_msg.c
> @@ -71,8 +71,9 @@ int ele_get_info(struct se_if_priv *priv, struct ele_dev_info *s_info)
>  	tx_msg->data[0] = upper_32_bits(get_info_addr);
>  	tx_msg->data[1] = lower_32_bits(get_info_addr);
>  	tx_msg->data[2] = sizeof(*s_info);
> -	ret = ele_msg_send_rcv(priv, tx_msg, ELE_GET_INFO_REQ_MSG_SZ, rx_msg,
> -			       ELE_GET_INFO_RSP_MSG_SZ);
> +
> +	ret = ele_msg_send_rcv(priv->priv_dev_ctx, tx_msg, ELE_GET_INFO_REQ_MSG_SZ,
> +			       rx_msg, ELE_GET_INFO_RSP_MSG_SZ);
>  	if (ret < 0) {
>  		ele_get_info_cleanup(priv, get_info_data, get_info_addr, get_info_len);
>  		return ret;
> @@ -117,8 +118,8 @@ int ele_ping(struct se_if_priv *priv)
>  	se_fill_cmd_msg_hdr(priv, (struct se_msg_hdr *)&tx_msg->header,
>  			    ELE_PING_REQ, ELE_PING_REQ_SZ, true);
>
> -	ret = ele_msg_send_rcv(priv, tx_msg, ELE_PING_REQ_SZ, rx_msg,
> -			       ELE_PING_RSP_SZ);
> +	ret = ele_msg_send_rcv(priv->priv_dev_ctx, tx_msg, ELE_PING_REQ_SZ,
> +			       rx_msg, ELE_PING_RSP_SZ);
>  	if (ret < 0)
>  		return ret;
>
> @@ -165,7 +166,7 @@ int ele_service_swap(struct se_if_priv *priv,
>  	if (ret)
>  		return -EINVAL;
>
> -	ret = ele_msg_send_rcv(priv, tx_msg, ELE_SERVICE_SWAP_REQ_MSG_SZ,
> +	ret = ele_msg_send_rcv(priv->priv_dev_ctx, tx_msg, ELE_SERVICE_SWAP_REQ_MSG_SZ,
>  			       rx_msg, ELE_SERVICE_SWAP_RSP_MSG_SZ);
>  	if (ret < 0)
>  		return ret;
> @@ -213,7 +214,7 @@ int ele_fw_authenticate(struct se_if_priv *priv, dma_addr_t contnr_addr,
>  	tx_msg->data[1] = 0;
>  	tx_msg->data[2] = lower_32_bits(img_addr);
>
> -	ret = ele_msg_send_rcv(priv, tx_msg, ELE_FW_AUTH_REQ_SZ, rx_msg,
> +	ret = ele_msg_send_rcv(priv->priv_dev_ctx, tx_msg, ELE_FW_AUTH_REQ_SZ, rx_msg,
>  			       ELE_FW_AUTH_RSP_MSG_SZ);
>  	if (ret < 0)
>  		return ret;
> @@ -251,7 +252,7 @@ int ele_debug_dump(struct se_if_priv *priv)
>  	do {
>  		memset(rx_msg, 0x0, ELE_DEBUG_DUMP_RSP_SZ);
>
> -		ret = ele_msg_send_rcv(priv, tx_msg, ELE_DEBUG_DUMP_REQ_SZ,
> +		ret = ele_msg_send_rcv(priv->priv_dev_ctx, tx_msg, ELE_DEBUG_DUMP_REQ_SZ,
>  				       rx_msg, ELE_DEBUG_DUMP_RSP_SZ);
>  		if (ret < 0)
>  			return ret;
> diff --git a/drivers/firmware/imx/ele_common.c b/drivers/firmware/imx/ele_common.c
> index 04ee5112d346..b662063c3b1c 100644
> --- a/drivers/firmware/imx/ele_common.c
> +++ b/drivers/firmware/imx/ele_common.c
> @@ -46,8 +46,9 @@ int se_update_msg_chksum(u32 *msg, u32 msg_len)
>  	return 0;
>  }
>
> -int ele_msg_rcv(struct se_if_priv *priv, struct se_clbk_handle *se_clbk_hdl)
> +int ele_msg_rcv(struct se_if_device_ctx *dev_ctx, struct se_clbk_handle *se_clbk_hdl)
>  {
> +	struct se_if_priv *priv = dev_ctx->priv;
>  	bool is_rsp_wait_with_timeout = false;
>  	bool wait_uninterruptible = false;
>  	unsigned long remaining_jiffies;
> @@ -134,7 +135,7 @@ int ele_msg_rcv(struct se_if_priv *priv, struct se_clbk_handle *se_clbk_hdl)
>  	return ret;
>  }
>
> -int ele_msg_send(struct se_if_priv *priv,
> +int ele_msg_send(struct se_if_device_ctx *dev_ctx,
>  		 void *tx_msg,
>  		 int tx_msg_sz)
>  {
> @@ -146,9 +147,9 @@ int ele_msg_send(struct se_if_priv *priv,
>  	 * carried in the message.
>  	 */
>  	if (header->size << 2 != tx_msg_sz) {
> -		dev_err(priv->dev,
> -			"User buf hdr: 0x%x, sz mismatced with input-sz (%d != %d).",
> -			*(u32 *)header, header->size << 2, tx_msg_sz);
> +		dev_err(dev_ctx->priv->dev,
> +			"%s: User buf hdr: 0x%x, sz mismatched with input-sz (%d != %d).",
> +			dev_ctx->devname, *(u32 *)header, header->size << 2, tx_msg_sz);
>  		return -EINVAL;
>  	}
>
> @@ -158,9 +159,10 @@ int ele_msg_send(struct se_if_priv *priv,
>  	 * caller-provided tx_msg pointer after mbox_send_message() returns, so
>  	 * the caller-owned buffer may be released after a successful send.
>  	 */
> -	err = mbox_send_message(priv->tx_chan, tx_msg);
> +	err = mbox_send_message(dev_ctx->priv->tx_chan, tx_msg);
>  	if (err < 0) {
> -		dev_err(priv->dev, "Error: mbox_send_message failure.\n");
> +		dev_err(dev_ctx->priv->dev,
> +			"%s: Error: mbox_send_message failure.", dev_ctx->devname);
>  		return err;
>  	}
>
> @@ -172,38 +174,41 @@ static void ele_msg_send_rcv_cleanup(struct se_if_priv *priv)
>  	unsigned long flags;
>
>  	spin_lock_irqsave(&priv->waiting_rsp_clbk_hdl.clbk_rx_lock, flags);
> +	priv->waiting_rsp_clbk_hdl.dev_ctx = NULL;
>  	priv->waiting_rsp_clbk_hdl.rx_msg = NULL;
>  	priv->waiting_rsp_clbk_hdl.rx_msg_sz = 0;
>  	spin_unlock_irqrestore(&priv->waiting_rsp_clbk_hdl.clbk_rx_lock, flags);
>  }
>
> -/* API used for send/receive blocking call. */
> -int ele_msg_send_rcv(struct se_if_priv *priv, void *tx_msg, int tx_msg_sz,
> -		     void *rx_msg, int exp_rx_msg_sz)
> +/* API used for send/receive blocking calls. */
> +int ele_msg_send_rcv(struct se_if_device_ctx *dev_ctx, void *tx_msg,
> +		     int tx_msg_sz, void *rx_msg, int exp_rx_msg_sz)
>  {
> +	struct se_if_priv *priv = dev_ctx->priv;
>  	unsigned long flags;
>  	int err;
>
>  	guard(mutex)(&priv->se_if_cmd_lock);
>
>  	if (atomic_read(&priv->fw_busy)) {
> -		dev_dbg(priv->dev, "ELE became unresponsive.\n");
> +		dev_dbg(priv->dev, "%s: ELE became unresponsive.\n", dev_ctx->devname);
>  		return -EBUSY;
>  	}
>  	reinit_completion(&priv->waiting_rsp_clbk_hdl.done);
>  	/* Publish rx_msg/rx_msg_sz under the lock read by se_if_rx_callback(). */
>  	spin_lock_irqsave(&priv->waiting_rsp_clbk_hdl.clbk_rx_lock, flags);
> +	priv->waiting_rsp_clbk_hdl.dev_ctx = dev_ctx;
>  	priv->waiting_rsp_clbk_hdl.rx_msg_sz = exp_rx_msg_sz;
>  	priv->waiting_rsp_clbk_hdl.rx_msg = rx_msg;
>  	spin_unlock_irqrestore(&priv->waiting_rsp_clbk_hdl.clbk_rx_lock, flags);
>
> -	err = ele_msg_send(priv, tx_msg, tx_msg_sz);
> +	err = ele_msg_send(dev_ctx, tx_msg, tx_msg_sz);
>  	if (err < 0) {
>  		ele_msg_send_rcv_cleanup(priv);
>  		return err;
>  	}
>
> -	err = ele_msg_rcv(priv, &priv->waiting_rsp_clbk_hdl);
> +	err = ele_msg_rcv(dev_ctx, &priv->waiting_rsp_clbk_hdl);
>
>  	if (priv->waiting_rsp_clbk_hdl.signal_rcvd) {
>  		/*
> @@ -214,7 +219,8 @@ int ele_msg_send_rcv(struct se_if_priv *priv, void *tx_msg, int tx_msg_sz,
>  		if (err > 0)
>  			err = -ERESTARTSYS;
>  		priv->waiting_rsp_clbk_hdl.signal_rcvd = false;
> -		dev_dbg(priv->dev, "Err[0x%x]:Interrupted by signal.", err);
> +		dev_dbg(priv->dev, "%s: Err[0x%x]:Interrupted by signal.",
> +			dev_ctx->devname, err);
>  	}
>
>  	ele_msg_send_rcv_cleanup(priv);
> @@ -243,6 +249,7 @@ void se_if_rx_callback(struct mbox_client *mbox_cl, void *msg)
>  {
>  	struct se_clbk_handle *se_clbk_hdl;
>  	struct device *dev = mbox_cl->dev;
> +	const char *devname = NULL;
>  	struct se_msg_hdr *header;
>  	bool sz_mismatch = false;
>  	struct se_if_priv *priv;
> @@ -266,7 +273,7 @@ void se_if_rx_callback(struct mbox_client *mbox_cl, void *msg)
>  	if (header->tag == priv->if_defs->cmd_tag) {
>  		se_clbk_hdl = &priv->cmd_receiver_clbk_hdl;
>  		spin_lock_irqsave(&se_clbk_hdl->clbk_rx_lock, flags);
> -		if (!se_clbk_hdl->rx_msg) {
> +		if (!se_clbk_hdl->dev_ctx || !se_clbk_hdl->rx_msg) {
>  			spin_unlock_irqrestore(&se_clbk_hdl->clbk_rx_lock, flags);
>  			dev_warn(dev, "No command receiver registered for message: %.8x\n",
>  				 *((u32 *)header));
> @@ -280,8 +287,8 @@ void se_if_rx_callback(struct mbox_client *mbox_cl, void *msg)
>  		 * SE_IOCTL_ENABLE_CMD_RCV and is not subject to the timeout/circuit-
>  		 * breaker handling used for rsp_tag messages.
>  		 */
> -		dev_dbg(dev, "Selecting cmd receiver: for mesg header:0x%x.",
> -			*(u32 *)header);
> +		dev_dbg(dev, "Selecting cmd receiver:%s for mesg header:0x%x.",
> +			se_clbk_hdl->dev_ctx->devname,  *(u32 *)header);
>
>  		/*
>  		 * Pre-allocated buffer of MAX_NVM_MSG_LEN
> @@ -296,13 +303,14 @@ void se_if_rx_callback(struct mbox_client *mbox_cl, void *msg)
>  		 * Clamp the copy length to the pre-allocated receiver buffer (MAX_NVM_MSG_LEN).
>  		 */
>  		se_clbk_hdl->rx_msg_sz = min_t(u32, rx_msg_sz, MAX_NVM_MSG_LEN);
> +		devname = se_clbk_hdl->dev_ctx->devname;
>  		memcpy(se_clbk_hdl->rx_msg, msg, se_clbk_hdl->rx_msg_sz);
>  		complete(&se_clbk_hdl->done);
>  		spin_unlock_irqrestore(&se_clbk_hdl->clbk_rx_lock, flags);
>  		if (sz_mismatch)
>  			dev_err(dev,
> -				"CMD-RCVER NVM: hdr(0x%x) with different sz(%d != %d).\n",
> -				*(u32 *)header,
> +				"%s: CMD-RCVER NVM: hdr(0x%x) with different sz(%d != %d).\n",
> +				devname, *(u32 *)header,
>  				(header->size << 2), rx_msg_sz);
>  	} else if (header->tag == priv->if_defs->rsp_tag) {
>  		bool exception_for_sz_mismatch = check_hdr_exception_for_sz(priv, header);
> @@ -324,8 +332,8 @@ void se_if_rx_callback(struct mbox_client *mbox_cl, void *msg)
>  			return;
>  		}
>  		exp_rx_msg_sz = se_clbk_hdl->rx_msg_sz;
> -		dev_dbg(dev, "Selecting resp waiter: for mesg header:0x%x.",
> -			*(u32 *)header);
> +		dev_dbg(dev, "Selecting resp waiter:%s for mesg header:0x%x.",
> +			se_clbk_hdl->dev_ctx->devname, *(u32 *)header);
>
>  		/*
>  		 * For rsp_tag traffic, the sender provides the expected response
> @@ -337,14 +345,15 @@ void se_if_rx_callback(struct mbox_client *mbox_cl, void *msg)
>  			sz_mismatch = true;
>
>  		se_clbk_hdl->rx_msg_sz = min(rx_msg_sz, exp_rx_msg_sz);
> +		devname = se_clbk_hdl->dev_ctx->devname;
>  		memcpy(se_clbk_hdl->rx_msg, msg, se_clbk_hdl->rx_msg_sz);
>  		complete(&se_clbk_hdl->done);
>  		spin_unlock_irqrestore(&se_clbk_hdl->clbk_rx_lock, flags);
>
>  		if (sz_mismatch)
>  			dev_err(dev,
> -				"Rsp to CMD: hdr(0x%x) with different sz(%d != %d).\n",
> -				*(u32 *)header,
> +				"%s: Rsp to CMD: hdr(0x%x) with different sz(%d != %d).\n",
> +				devname, *(u32 *)header,
>  				(header->size << 2), exp_rx_msg_sz);
>  	} else {
>  		dev_err(dev, "Failed to select a device for message: %.8x\n",
> diff --git a/drivers/firmware/imx/ele_common.h b/drivers/firmware/imx/ele_common.h
> index 7bf2febefc45..07e6b6a1bafa 100644
> --- a/drivers/firmware/imx/ele_common.h
> +++ b/drivers/firmware/imx/ele_common.h
> @@ -16,12 +16,12 @@
>
>  int se_update_msg_chksum(u32 *msg, u32 msg_len);
>
> -int ele_msg_rcv(struct se_if_priv *priv, struct se_clbk_handle *se_clbk_hdl);
> +int ele_msg_rcv(struct se_if_device_ctx *dev_ctx, struct se_clbk_handle *se_clbk_hdl);
>
> -int ele_msg_send(struct se_if_priv *priv, void *tx_msg, int tx_msg_sz);
> +int ele_msg_send(struct se_if_device_ctx *dev_ctx, void *tx_msg, int tx_msg_sz);
>
> -int ele_msg_send_rcv(struct se_if_priv *priv, void *tx_msg, int tx_msg_sz,
> -		     void *rx_msg, int exp_rx_msg_sz);
> +int ele_msg_send_rcv(struct se_if_device_ctx *dev_ctx, void *tx_msg,
> +		     int tx_msg_sz, void *rx_msg, int exp_rx_msg_sz);
>
>  void se_if_rx_callback(struct mbox_client *mbox_cl, void *msg);
>
> diff --git a/drivers/firmware/imx/se_ctrl.c b/drivers/firmware/imx/se_ctrl.c
> index df3d1da28a75..2ee0f70c38cd 100644
> --- a/drivers/firmware/imx/se_ctrl.c
> +++ b/drivers/firmware/imx/se_ctrl.c
> @@ -284,6 +284,36 @@ static int get_se_soc_info(struct se_if_priv *priv, const struct se_soc_info *se
>  	return 0;
>  }
>
> +static int init_misc_device_context(struct se_if_priv *priv, int ch_id,
> +				    struct se_if_device_ctx **new_dev_ctx)
> +{
> +	const char *err_str = "Failed to allocate memory";
> +	struct se_if_device_ctx *dev_ctx;
> +	int ret = -ENOMEM;
> +
> +	dev_ctx = kzalloc_obj(*dev_ctx, GFP_KERNEL);
> +
> +	if (!dev_ctx)
> +		return ret;

		return -ENOMEM;

> +
> +	dev_ctx->devname = kasprintf(GFP_KERNEL, "%s0_ch%d",
> +				     get_se_if_name(priv->if_defs->se_if_type),
> +				     ch_id);
> +	if (!dev_ctx->devname)
> +		goto exit;
> +
> +	dev_ctx->priv = priv;
> +	*new_dev_ctx = dev_ctx;
> +
> +	return 0;
> +exit:
> +	*new_dev_ctx = NULL;
> +
> +	kfree(dev_ctx->devname);
> +	kfree(dev_ctx);
> +	return dev_err_probe(priv->dev, ret, "%s", err_str);

Needn't var err_str and generally, needn't print msg for -ENOMEM

	return -ENOMEM;


> +}
> +
>  static int se_if_request_channel(struct device *dev, struct mbox_chan **chan,
>  				 struct mbox_client *cl, const char *name)
>  {
> @@ -328,6 +358,11 @@ static void se_if_probe_cleanup(void *plat_dev)
>
>  	dev_set_drvdata(dev, NULL);
>
> +	if (priv->priv_dev_ctx) {
> +		kfree(priv->priv_dev_ctx->devname);
> +		kfree(priv->priv_dev_ctx);
> +	}
> +
>  	kfree(priv);
>  }
>
> @@ -425,6 +460,12 @@ static int se_if_probe(struct platform_device *pdev)
>  		load_fw->imem_mgmt = true;
>  	}
>
> +	ret = init_misc_device_context(priv, 0, &priv->priv_dev_ctx);
> +	if (ret)
> +		return dev_err_probe(dev, ret,
> +				     "Failed[0x%x] to create device contexts.",
> +				     ret);

Needn't print error code, dev_err_probe() already print for you.

		dev_err_probe(dev, ret, "Failed to ...\n"):

and need "\n" for all error message, please double other.

Frank
> +
>  	if (if_node->if_defs.se_if_type == SE_TYPE_ID_HSM) {
>  		ret = get_se_soc_info(priv, se_info);
>  		if (ret)
> diff --git a/drivers/firmware/imx/se_ctrl.h b/drivers/firmware/imx/se_ctrl.h
> index 54b2a262a2c3..dd4a1ea7e35a 100644
> --- a/drivers/firmware/imx/se_ctrl.h
> +++ b/drivers/firmware/imx/se_ctrl.h
> @@ -20,6 +20,7 @@
>  #define MESSAGING_VERSION_7		0x7
>
>  struct se_clbk_handle {
> +	struct se_if_device_ctx *dev_ctx;
>  	struct completion done;
>  	bool signal_rcvd;
>  	u32 rx_msg_sz;
> @@ -44,6 +45,12 @@ struct se_imem_buf {
>  	u32 state;
>  };
>
> +/* Private struct for each char device instance. */
> +struct se_if_device_ctx {
> +	struct se_if_priv *priv;
> +	const char *devname;
> +};
> +
>  /* Header of the messages exchange with the EdgeLock Enclave */
>  struct se_msg_hdr {
>  	u8 ver;
> @@ -106,6 +113,8 @@ struct se_if_priv {
>  	struct se_fw_load_info load_fw;
>
>  	atomic_t fw_busy;
> +
> +	struct se_if_device_ctx *priv_dev_ctx;
>  };
>
>  char *get_se_if_name(u8 se_if_id);
>
> --
> 2.43.0
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.