Commit 0092a1e3 authored by Loic Poulain's avatar Loic Poulain Committed by Greg Kroah-Hartman

bus: mhi: Add inbound buffers allocation flag

Currently, the MHI controller driver defines which channels should
have their inbound buffers allocated and queued. But ideally, this is
something that should be decided by the MHI device driver instead,
which actually deals with that buffers.

Add a flag parameter to mhi_prepare_for_transfer allowing to specify
if buffers have to be allocated and queued by the MHI stack.

Keep auto_queue flag for now, but should be removed at some point.

Link: https://lore.kernel.org/r/1624566520-20406-1-git-send-email-loic.poulain@linaro.orgTested-by: default avatarBhaumik Bhatt <bbhatt@codeaurora.org>
Reviewed-by: default avatarBhaumik Bhatt <bbhatt@codeaurora.org>
Reviewed-by: default avatarHemant Kumar <hemantk@codeaurora.org>
Reviewed-by: default avatarManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Acked-by: default avatarJakub Kicinski <kuba@kernel.org>
Signed-off-by: default avatarLoic Poulain <loic.poulain@linaro.org>
Signed-off-by: default avatarManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Link: https://lore.kernel.org/r/20210802051255.5771-2-manivannan.sadhasivam@linaro.orgSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent fec29bf0
...@@ -682,7 +682,7 @@ void mhi_rddm_prepare(struct mhi_controller *mhi_cntrl, ...@@ -682,7 +682,7 @@ void mhi_rddm_prepare(struct mhi_controller *mhi_cntrl,
struct image_info *img_info); struct image_info *img_info);
void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl); void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl);
int mhi_prepare_channel(struct mhi_controller *mhi_cntrl, int mhi_prepare_channel(struct mhi_controller *mhi_cntrl,
struct mhi_chan *mhi_chan); struct mhi_chan *mhi_chan, unsigned int flags);
int mhi_init_chan_ctxt(struct mhi_controller *mhi_cntrl, int mhi_init_chan_ctxt(struct mhi_controller *mhi_cntrl,
struct mhi_chan *mhi_chan); struct mhi_chan *mhi_chan);
void mhi_deinit_chan_ctxt(struct mhi_controller *mhi_cntrl, void mhi_deinit_chan_ctxt(struct mhi_controller *mhi_cntrl,
......
...@@ -1430,7 +1430,7 @@ static void mhi_unprepare_channel(struct mhi_controller *mhi_cntrl, ...@@ -1430,7 +1430,7 @@ static void mhi_unprepare_channel(struct mhi_controller *mhi_cntrl,
} }
int mhi_prepare_channel(struct mhi_controller *mhi_cntrl, int mhi_prepare_channel(struct mhi_controller *mhi_cntrl,
struct mhi_chan *mhi_chan) struct mhi_chan *mhi_chan, unsigned int flags)
{ {
int ret = 0; int ret = 0;
struct device *dev = &mhi_chan->mhi_dev->dev; struct device *dev = &mhi_chan->mhi_dev->dev;
...@@ -1455,6 +1455,9 @@ int mhi_prepare_channel(struct mhi_controller *mhi_cntrl, ...@@ -1455,6 +1455,9 @@ int mhi_prepare_channel(struct mhi_controller *mhi_cntrl,
if (ret) if (ret)
goto error_pm_state; goto error_pm_state;
if (mhi_chan->dir == DMA_FROM_DEVICE)
mhi_chan->pre_alloc = !!(flags & MHI_CH_INBOUND_ALLOC_BUFS);
/* Pre-allocate buffer for xfer ring */ /* Pre-allocate buffer for xfer ring */
if (mhi_chan->pre_alloc) { if (mhi_chan->pre_alloc) {
int nr_el = get_nr_avail_ring_elements(mhi_cntrl, int nr_el = get_nr_avail_ring_elements(mhi_cntrl,
...@@ -1610,7 +1613,7 @@ void mhi_reset_chan(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan) ...@@ -1610,7 +1613,7 @@ void mhi_reset_chan(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan)
} }
/* Move channel to start state */ /* Move channel to start state */
int mhi_prepare_for_transfer(struct mhi_device *mhi_dev) int mhi_prepare_for_transfer(struct mhi_device *mhi_dev, unsigned int flags)
{ {
int ret, dir; int ret, dir;
struct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl; struct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;
...@@ -1621,7 +1624,7 @@ int mhi_prepare_for_transfer(struct mhi_device *mhi_dev) ...@@ -1621,7 +1624,7 @@ int mhi_prepare_for_transfer(struct mhi_device *mhi_dev)
if (!mhi_chan) if (!mhi_chan)
continue; continue;
ret = mhi_prepare_channel(mhi_cntrl, mhi_chan); ret = mhi_prepare_channel(mhi_cntrl, mhi_chan, flags);
if (ret) if (ret)
goto error_open_chan; goto error_open_chan;
} }
......
...@@ -335,7 +335,7 @@ static int mhi_net_newlink(void *ctxt, struct net_device *ndev, u32 if_id, ...@@ -335,7 +335,7 @@ static int mhi_net_newlink(void *ctxt, struct net_device *ndev, u32 if_id,
u64_stats_init(&mhi_netdev->stats.tx_syncp); u64_stats_init(&mhi_netdev->stats.tx_syncp);
/* Start MHI channels */ /* Start MHI channels */
err = mhi_prepare_for_transfer(mhi_dev); err = mhi_prepare_for_transfer(mhi_dev, 0);
if (err) if (err)
goto out_err; goto out_err;
......
...@@ -110,7 +110,7 @@ static int mhi_wwan_ctrl_start(struct wwan_port *port) ...@@ -110,7 +110,7 @@ static int mhi_wwan_ctrl_start(struct wwan_port *port)
int ret; int ret;
/* Start mhi device's channel(s) */ /* Start mhi device's channel(s) */
ret = mhi_prepare_for_transfer(mhiwwan->mhi_dev); ret = mhi_prepare_for_transfer(mhiwwan->mhi_dev, 0);
if (ret) if (ret)
return ret; return ret;
......
...@@ -719,8 +719,13 @@ void mhi_device_put(struct mhi_device *mhi_dev); ...@@ -719,8 +719,13 @@ void mhi_device_put(struct mhi_device *mhi_dev);
* host and device execution environments match and * host and device execution environments match and
* channels are in a DISABLED state. * channels are in a DISABLED state.
* @mhi_dev: Device associated with the channels * @mhi_dev: Device associated with the channels
* @flags: MHI channel flags
*/ */
int mhi_prepare_for_transfer(struct mhi_device *mhi_dev); int mhi_prepare_for_transfer(struct mhi_device *mhi_dev,
unsigned int flags);
/* Automatically allocate and queue inbound buffers */
#define MHI_CH_INBOUND_ALLOC_BUFS BIT(0)
/** /**
* mhi_unprepare_from_transfer - Reset UL and DL channels for data transfer. * mhi_unprepare_from_transfer - Reset UL and DL channels for data transfer.
......
...@@ -79,7 +79,7 @@ static int qcom_mhi_qrtr_probe(struct mhi_device *mhi_dev, ...@@ -79,7 +79,7 @@ static int qcom_mhi_qrtr_probe(struct mhi_device *mhi_dev,
int rc; int rc;
/* start channels */ /* start channels */
rc = mhi_prepare_for_transfer(mhi_dev); rc = mhi_prepare_for_transfer(mhi_dev, MHI_CH_INBOUND_ALLOC_BUFS);
if (rc) if (rc)
return rc; return rc;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment