All of lore.kernel.org
 help / color / mirror / Atom feed
From: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
To: Bhaumik Bhatt <bbhatt@codeaurora.org>
Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org,
	hemantk@codeaurora.org, jhugo@codeaurora.org
Subject: Re: [PATCH v7 1/8] bus: mhi: core: Refactor mhi queue APIs
Date: Sat, 9 May 2020 11:16:44 +0530	[thread overview]
Message-ID: <20200509054644.GA5845@Mani-XPS-13-9360> (raw)
In-Reply-To: <1588991208-26928-2-git-send-email-bbhatt@codeaurora.org>

On Fri, May 08, 2020 at 07:26:41PM -0700, Bhaumik Bhatt wrote:
> From: Hemant Kumar <hemantk@codeaurora.org>
> 
> Move all the common code to generate TRE from mhi_queue_buf,
> mhi_queue_dma and mhi_queue_skb to mhi_gen_tre. This helps
> to centralize the TRE generation code which makes any future
> bug fixing easier to manage in these APIs.
> 
> Suggested-by: Jeffrey Hugo <jhugo@codeaurora.org>
> Signed-off-by: Hemant Kumar <hemantk@codeaurora.org>
> Signed-off-by: Bhaumik Bhatt <bbhatt@codeaurora.org>
> Reviewed-by: Jeffrey Hugo <jhugo@codeaurora.org>

Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>

Thanks,
Mani

> ---
>  drivers/bus/mhi/core/internal.h |   3 +-
>  drivers/bus/mhi/core/main.c     | 107 +++++++++++++++++-----------------------
>  2 files changed, 47 insertions(+), 63 deletions(-)
> 
> diff --git a/drivers/bus/mhi/core/internal.h b/drivers/bus/mhi/core/internal.h
> index 095d95b..40c47f9 100644
> --- a/drivers/bus/mhi/core/internal.h
> +++ b/drivers/bus/mhi/core/internal.h
> @@ -670,8 +670,7 @@ int mhi_process_ctrl_ev_ring(struct mhi_controller *mhi_cntrl,
>  irqreturn_t mhi_intvec_handler(int irq_number, void *dev);
>  
>  int mhi_gen_tre(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,
> -		void *buf, void *cb, size_t buf_len, enum mhi_flags flags);
> -
> +		struct mhi_buf_info *info, enum mhi_flags flags);
>  int mhi_map_single_no_bb(struct mhi_controller *mhi_cntrl,
>  			 struct mhi_buf_info *buf_info);
>  int mhi_map_single_use_bb(struct mhi_controller *mhi_cntrl,
> diff --git a/drivers/bus/mhi/core/main.c b/drivers/bus/mhi/core/main.c
> index c26eed0..605640c 100644
> --- a/drivers/bus/mhi/core/main.c
> +++ b/drivers/bus/mhi/core/main.c
> @@ -919,9 +919,7 @@ int mhi_queue_skb(struct mhi_device *mhi_dev, enum dma_data_direction dir,
>  	struct mhi_chan *mhi_chan = (dir == DMA_TO_DEVICE) ? mhi_dev->ul_chan :
>  							     mhi_dev->dl_chan;
>  	struct mhi_ring *tre_ring = &mhi_chan->tre_ring;
> -	struct mhi_ring *buf_ring = &mhi_chan->buf_ring;
> -	struct mhi_buf_info *buf_info;
> -	struct mhi_tre *mhi_tre;
> +	struct mhi_buf_info buf_info = { };
>  	int ret;
>  
>  	/* If MHI host pre-allocates buffers then client drivers cannot queue */
> @@ -946,27 +944,15 @@ int mhi_queue_skb(struct mhi_device *mhi_dev, enum dma_data_direction dir,
>  	/* Toggle wake to exit out of M2 */
>  	mhi_cntrl->wake_toggle(mhi_cntrl);
>  
> -	/* Generate the TRE */
> -	buf_info = buf_ring->wp;
> -
> -	buf_info->v_addr = skb->data;
> -	buf_info->cb_buf = skb;
> -	buf_info->wp = tre_ring->wp;
> -	buf_info->dir = mhi_chan->dir;
> -	buf_info->len = len;
> -	ret = mhi_cntrl->map_single(mhi_cntrl, buf_info);
> -	if (ret)
> -		goto map_error;
> -
> -	mhi_tre = tre_ring->wp;
> -
> -	mhi_tre->ptr = MHI_TRE_DATA_PTR(buf_info->p_addr);
> -	mhi_tre->dword[0] = MHI_TRE_DATA_DWORD0(buf_info->len);
> -	mhi_tre->dword[1] = MHI_TRE_DATA_DWORD1(1, 1, 0, 0);
> +	buf_info.v_addr = skb->data;
> +	buf_info.cb_buf = skb;
> +	buf_info.len = len;
>  
> -	/* increment WP */
> -	mhi_add_ring_element(mhi_cntrl, tre_ring);
> -	mhi_add_ring_element(mhi_cntrl, buf_ring);
> +	ret = mhi_gen_tre(mhi_cntrl, mhi_chan, &buf_info, mflags);
> +	if (unlikely(ret)) {
> +		read_unlock_bh(&mhi_cntrl->pm_lock);
> +		return ret;
> +	}
>  
>  	if (mhi_chan->dir == DMA_TO_DEVICE)
>  		atomic_inc(&mhi_cntrl->pending_pkts);
> @@ -980,11 +966,6 @@ int mhi_queue_skb(struct mhi_device *mhi_dev, enum dma_data_direction dir,
>  	read_unlock_bh(&mhi_cntrl->pm_lock);
>  
>  	return 0;
> -
> -map_error:
> -	read_unlock_bh(&mhi_cntrl->pm_lock);
> -
> -	return ret;
>  }
>  EXPORT_SYMBOL_GPL(mhi_queue_skb);
>  
> @@ -996,9 +977,8 @@ int mhi_queue_dma(struct mhi_device *mhi_dev, enum dma_data_direction dir,
>  							     mhi_dev->dl_chan;
>  	struct device *dev = &mhi_cntrl->mhi_dev->dev;
>  	struct mhi_ring *tre_ring = &mhi_chan->tre_ring;
> -	struct mhi_ring *buf_ring = &mhi_chan->buf_ring;
> -	struct mhi_buf_info *buf_info;
> -	struct mhi_tre *mhi_tre;
> +	struct mhi_buf_info buf_info = { };
> +	int ret;
>  
>  	/* If MHI host pre-allocates buffers then client drivers cannot queue */
>  	if (mhi_chan->pre_alloc)
> @@ -1025,25 +1005,16 @@ int mhi_queue_dma(struct mhi_device *mhi_dev, enum dma_data_direction dir,
>  	/* Toggle wake to exit out of M2 */
>  	mhi_cntrl->wake_toggle(mhi_cntrl);
>  
> -	/* Generate the TRE */
> -	buf_info = buf_ring->wp;
> -	WARN_ON(buf_info->used);
> -	buf_info->p_addr = mhi_buf->dma_addr;
> -	buf_info->pre_mapped = true;
> -	buf_info->cb_buf = mhi_buf;
> -	buf_info->wp = tre_ring->wp;
> -	buf_info->dir = mhi_chan->dir;
> -	buf_info->len = len;
> -
> -	mhi_tre = tre_ring->wp;
> -
> -	mhi_tre->ptr = MHI_TRE_DATA_PTR(buf_info->p_addr);
> -	mhi_tre->dword[0] = MHI_TRE_DATA_DWORD0(buf_info->len);
> -	mhi_tre->dword[1] = MHI_TRE_DATA_DWORD1(1, 1, 0, 0);
> +	buf_info.p_addr = mhi_buf->dma_addr;
> +	buf_info.cb_buf = mhi_buf;
> +	buf_info.pre_mapped = true;
> +	buf_info.len = len;
>  
> -	/* increment WP */
> -	mhi_add_ring_element(mhi_cntrl, tre_ring);
> -	mhi_add_ring_element(mhi_cntrl, buf_ring);
> +	ret = mhi_gen_tre(mhi_cntrl, mhi_chan, &buf_info, mflags);
> +	if (unlikely(ret)) {
> +		read_unlock_bh(&mhi_cntrl->pm_lock);
> +		return ret;
> +	}
>  
>  	if (mhi_chan->dir == DMA_TO_DEVICE)
>  		atomic_inc(&mhi_cntrl->pending_pkts);
> @@ -1061,7 +1032,7 @@ int mhi_queue_dma(struct mhi_device *mhi_dev, enum dma_data_direction dir,
>  EXPORT_SYMBOL_GPL(mhi_queue_dma);
>  
>  int mhi_gen_tre(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,
> -		void *buf, void *cb, size_t buf_len, enum mhi_flags flags)
> +			struct mhi_buf_info *info, enum mhi_flags flags)
>  {
>  	struct mhi_ring *buf_ring, *tre_ring;
>  	struct mhi_tre *mhi_tre;
> @@ -1073,15 +1044,22 @@ int mhi_gen_tre(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,
>  	tre_ring = &mhi_chan->tre_ring;
>  
>  	buf_info = buf_ring->wp;
> -	buf_info->v_addr = buf;
> -	buf_info->cb_buf = cb;
> +	WARN_ON(buf_info->used);
> +	buf_info->pre_mapped = info->pre_mapped;
> +	if (info->pre_mapped)
> +		buf_info->p_addr = info->p_addr;
> +	else
> +		buf_info->v_addr = info->v_addr;
> +	buf_info->cb_buf = info->cb_buf;
>  	buf_info->wp = tre_ring->wp;
>  	buf_info->dir = mhi_chan->dir;
> -	buf_info->len = buf_len;
> +	buf_info->len = info->len;
>  
> -	ret = mhi_cntrl->map_single(mhi_cntrl, buf_info);
> -	if (ret)
> -		return ret;
> +	if (!info->pre_mapped) {
> +		ret = mhi_cntrl->map_single(mhi_cntrl, buf_info);
> +		if (ret)
> +			return ret;
> +	}
>  
>  	eob = !!(flags & MHI_EOB);
>  	eot = !!(flags & MHI_EOT);
> @@ -1090,7 +1068,7 @@ int mhi_gen_tre(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,
>  
>  	mhi_tre = tre_ring->wp;
>  	mhi_tre->ptr = MHI_TRE_DATA_PTR(buf_info->p_addr);
> -	mhi_tre->dword[0] = MHI_TRE_DATA_DWORD0(buf_len);
> +	mhi_tre->dword[0] = MHI_TRE_DATA_DWORD0(info->len);
>  	mhi_tre->dword[1] = MHI_TRE_DATA_DWORD1(bei, eot, eob, chain);
>  
>  	/* increment WP */
> @@ -1107,6 +1085,7 @@ int mhi_queue_buf(struct mhi_device *mhi_dev, enum dma_data_direction dir,
>  	struct mhi_chan *mhi_chan = (dir == DMA_TO_DEVICE) ? mhi_dev->ul_chan :
>  							     mhi_dev->dl_chan;
>  	struct mhi_ring *tre_ring;
> +	struct mhi_buf_info buf_info = { };
>  	unsigned long flags;
>  	int ret;
>  
> @@ -1122,7 +1101,11 @@ int mhi_queue_buf(struct mhi_device *mhi_dev, enum dma_data_direction dir,
>  	if (mhi_is_ring_full(mhi_cntrl, tre_ring))
>  		return -ENOMEM;
>  
> -	ret = mhi_gen_tre(mhi_cntrl, mhi_chan, buf, buf, len, mflags);
> +	buf_info.v_addr = buf;
> +	buf_info.cb_buf = buf;
> +	buf_info.len = len;
> +
> +	ret = mhi_gen_tre(mhi_cntrl, mhi_chan, &buf_info, mflags);
>  	if (unlikely(ret))
>  		return ret;
>  
> @@ -1323,7 +1306,7 @@ int mhi_prepare_channel(struct mhi_controller *mhi_cntrl,
>  
>  		while (nr_el--) {
>  			void *buf;
> -
> +			struct mhi_buf_info info = { };
>  			buf = kmalloc(len, GFP_KERNEL);
>  			if (!buf) {
>  				ret = -ENOMEM;
> @@ -1331,8 +1314,10 @@ int mhi_prepare_channel(struct mhi_controller *mhi_cntrl,
>  			}
>  
>  			/* Prepare transfer descriptors */
> -			ret = mhi_gen_tre(mhi_cntrl, mhi_chan, buf, buf,
> -					  len, MHI_EOT);
> +			info.v_addr = buf;
> +			info.cb_buf = buf;
> +			info.len = len;
> +			ret = mhi_gen_tre(mhi_cntrl, mhi_chan, &info, MHI_EOT);
>  			if (ret) {
>  				kfree(buf);
>  				goto error_pre_alloc;
> -- 
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
> a Linux Foundation Collaborative Project

  reply	other threads:[~2020-05-09  5:46 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-09  2:26 [PATCH v7 0/8] Bug fixes and improved logging in MHI Bhaumik Bhatt
2020-05-09  2:26 ` [PATCH v7 1/8] bus: mhi: core: Refactor mhi queue APIs Bhaumik Bhatt
2020-05-09  5:46   ` Manivannan Sadhasivam [this message]
2020-05-09  2:26 ` [PATCH v7 2/8] bus: mhi: core: Cache intmod from mhi event to mhi channel Bhaumik Bhatt
2020-05-09  5:47   ` Manivannan Sadhasivam
2020-05-09  2:26 ` [PATCH v7 3/8] bus: mhi: core: Add range check for channel id received in event ring Bhaumik Bhatt
2020-05-09  5:48   ` Manivannan Sadhasivam
2020-05-09  2:26 ` [PATCH v7 4/8] bus: mhi: core: Read transfer length from an event properly Bhaumik Bhatt
2020-05-09  5:49   ` Manivannan Sadhasivam
2020-05-09  2:26 ` [PATCH v7 5/8] bus: mhi: core: Handle firmware load using state worker Bhaumik Bhatt
2020-05-09  5:49   ` Manivannan Sadhasivam
2020-05-09  2:26 ` [PATCH v7 6/8] bus: mhi: core: Return appropriate error codes for AMSS load failure Bhaumik Bhatt
2020-05-09  5:50   ` Manivannan Sadhasivam
2020-05-09  2:26 ` [PATCH v7 7/8] bus: mhi: core: Improve debug logs for loading firmware Bhaumik Bhatt
2020-05-09  5:50   ` Manivannan Sadhasivam
2020-05-09  2:26 ` [PATCH v7 8/8] bus: mhi: core: Ensure non-zero session or sequence ID values are used Bhaumik Bhatt
2020-05-09  5:51   ` Manivannan Sadhasivam
2020-05-09  8:32 ` [PATCH v7 0/8] Bug fixes and improved logging in MHI Manivannan Sadhasivam

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200509054644.GA5845@Mani-XPS-13-9360 \
    --to=manivannan.sadhasivam@linaro.org \
    --cc=bbhatt@codeaurora.org \
    --cc=hemantk@codeaurora.org \
    --cc=jhugo@codeaurora.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.