aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>2022-05-24 14:05:37 +0530
committerDmitry Baryshkov <dmitry.baryshkov@linaro.org>2022-10-17 11:06:09 +0300
commit3f54b2fd70e39cbd4837b61105e2e9d79a26968b (patch)
treee3639e351dcfbb879839c46ccfd22da4fee622b3
parent9a06e46224e124612a50e4525a0c1724c7007e75 (diff)
bus: mhi: ep: Introduce transfer_{to/from}_host APIs
In preparation for adding DMA support, let's introduce separate APIs for copying the MHI buffers between the host and endpoint. The MHI controller drivers can use the DMA operations on these APIs if supported and use iATU for rest of the read/write operations using {read_from/write_to}_host APIs. Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
-rw-r--r--drivers/bus/mhi/ep/main.c8
-rw-r--r--drivers/pci/endpoint/functions/pci-epf-mhi.c2
-rw-r--r--include/linux/mhi_ep.h11
3 files changed, 15 insertions, 6 deletions
diff --git a/drivers/bus/mhi/ep/main.c b/drivers/bus/mhi/ep/main.c
index 55209d42a995..9611aff97300 100644
--- a/drivers/bus/mhi/ep/main.c
+++ b/drivers/bus/mhi/ep/main.c
@@ -316,8 +316,8 @@ static int mhi_ep_read_channel(struct mhi_ep_cntrl *mhi_cntrl,
read_addr = mhi_chan->tre_loc + read_offset;
write_addr = result->buf_addr + write_offset;
- dev_dbg(dev, "Reading %zd bytes from channel (%u)\n", tr_len, ring->ch_id);
- ret = mhi_cntrl->read_from_host(mhi_cntrl, read_addr, write_addr, tr_len);
+ dev_dbg(dev, "Transferring %zd bytes from channel (%u)\n", tr_len, ring->ch_id);
+ ret = mhi_cntrl->transfer_from_host(mhi_cntrl, read_addr, write_addr, tr_len);
if (ret < 0) {
dev_err(&mhi_chan->mhi_dev->dev, "Error reading from channel\n");
return ret;
@@ -477,8 +477,8 @@ int mhi_ep_queue_skb(struct mhi_ep_device *mhi_dev, struct sk_buff *skb)
read_addr = skb->data + read_offset;
write_addr = MHI_TRE_DATA_GET_PTR(el);
- dev_dbg(dev, "Writing %zd bytes to channel (%u)\n", tr_len, ring->ch_id);
- ret = mhi_cntrl->write_to_host(mhi_cntrl, read_addr, write_addr, tr_len);
+ dev_dbg(dev, "Transferring %zd bytes to channel (%u)\n", tr_len, ring->ch_id);
+ ret = mhi_cntrl->transfer_to_host(mhi_cntrl, read_addr, write_addr, tr_len);
if (ret < 0) {
dev_err(dev, "Error writing to the channel\n");
goto err_exit;
diff --git a/drivers/pci/endpoint/functions/pci-epf-mhi.c b/drivers/pci/endpoint/functions/pci-epf-mhi.c
index 811e0b7a20c1..37b3d03df80e 100644
--- a/drivers/pci/endpoint/functions/pci-epf-mhi.c
+++ b/drivers/pci/endpoint/functions/pci-epf-mhi.c
@@ -296,6 +296,8 @@ static int pci_epf_mhi_notifier(struct notifier_block *nb, unsigned long val, vo
mhi_cntrl->unmap_free = pci_epf_mhi_unmap_free;
mhi_cntrl->read_from_host = pci_epf_mhi_read_from_host;
mhi_cntrl->write_to_host = pci_epf_mhi_write_to_host;
+ mhi_cntrl->transfer_from_host = pci_epf_mhi_read_from_host;
+ mhi_cntrl->transfer_to_host = pci_epf_mhi_write_to_host;
/* Register the MHI EP controller */
ret = mhi_ep_register_controller(mhi_cntrl, info->config);
diff --git a/include/linux/mhi_ep.h b/include/linux/mhi_ep.h
index 478aece17046..fee63913deae 100644
--- a/include/linux/mhi_ep.h
+++ b/include/linux/mhi_ep.h
@@ -134,8 +134,15 @@ struct mhi_ep_cntrl {
void __iomem **virt, size_t size);
void (*unmap_free)(struct mhi_ep_cntrl *mhi_cntrl, u64 pci_addr, phys_addr_t phys,
void __iomem *virt, size_t size);
- int (*read_from_host)(struct mhi_ep_cntrl *mhi_cntrl, u64 from, void *to, size_t size);
- int (*write_to_host)(struct mhi_ep_cntrl *mhi_cntrl, void *from, u64 to, size_t size);
+
+ int (*read_from_host)(struct mhi_ep_cntrl *mhi_cntrl, u64 from, void *to,
+ size_t size);
+ int (*write_to_host)(struct mhi_ep_cntrl *mhi_cntrl, void *from, u64 to,
+ size_t size);
+ int (*transfer_from_host)(struct mhi_ep_cntrl *mhi_cntrl, u64 from, void *to,
+ size_t size);
+ int (*transfer_to_host)(struct mhi_ep_cntrl *mhi_cntrl, void *from, u64 to,
+ size_t size);
enum mhi_state mhi_state;