[PATCH 3/3] bus: mhi: ep: Use batched read for ring caching
Sumit Kumar <[email protected]> Fri, 13 Mar 2026 12:19:27 +0530
| Newsgroups | dev.linux.lists.mhi,dev.linux.lists.iommu,org.kernel.vger.dmaengine,org.kernel.vger.linux-arm-msm,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pci |
|---|---|
| Message-ID | <[email protected]> |
Simplify ring caching logic by using the new read_batch() callback for all ring read operations, replacing the previous approach that used separate read_sync() calls. Signed-off-by: Sumit Kumar <[email protected]> --- drivers/bus/mhi/ep/ring.c | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/drivers/bus/mhi/ep/ring.c b/drivers/bus/mhi/ep/ring.c index 26357ee68dee984d70ae5bf39f8f09f2cbcafe30..03c60c579e12c3bad100c7e1b6a75ae0e5646281 100644 --- a/drivers/bus/mhi/ep/ring.c +++ b/drivers/bus/mhi/ep/ring.c @@ -30,7 +30,7 @@ static int __mhi_ep_cache_ring(struct mhi_ep_ring *ring, size_t end) { struct mhi_ep_cntrl *mhi_cntrl = ring->mhi_cntrl; struct device *dev = &mhi_cntrl->mhi_dev->dev; - struct mhi_ep_buf_info buf_info = {}; + struct mhi_ep_buf_info buf_info[2] = {}; size_t start; int ret; @@ -44,35 +44,38 @@ static int __mhi_ep_cache_ring(struct mhi_ep_ring *ring, size_t end) start = ring->wr_offset; if (start < end) { - buf_info.size = (end - start) * sizeof(struct mhi_ring_element); - buf_info.host_addr = ring->rbase + (start * sizeof(struct mhi_ring_element)); - buf_info.dev_addr = &ring->ring_cache[start]; + /* No wraparound */ + buf_info[0].size = (end - start) * sizeof(struct mhi_ring_element); + buf_info[0].host_addr = ring->rbase + (start * sizeof(struct mhi_ring_element)); + buf_info[0].dev_addr = &ring->ring_cache[start]; - ret = mhi_cntrl->read_sync(mhi_cntrl, &buf_info); + ret = mhi_cntrl->read_batch(mhi_cntrl, buf_info, 1); if (ret < 0) return ret; + + dev_dbg(dev, "Cached ring: start %zu end %zu size %zu\n", start, end, + buf_info[0].size); } else { - buf_info.size = (ring->ring_size - start) * sizeof(struct mhi_ring_element); - buf_info.host_addr = ring->rbase + (start * sizeof(struct mhi_ring_element)); - buf_info.dev_addr = &ring->ring_cache[start]; + /* Wraparound */ + + /* Buffer 0: Tail portion (start → ring_size) */ + buf_info[0].size = (ring->ring_size - start) * sizeof(struct mhi_ring_element); + buf_info[0].host_addr = ring->rbase + (start * sizeof(struct mhi_ring_element)); + buf_info[0].dev_addr = &ring->ring_cache[start]; - ret = mhi_cntrl->read_sync(mhi_cntrl, &buf_info); + /* Buffer 1: Head portion (0 → end) */ + buf_info[1].size = end * sizeof(struct mhi_ring_element); + buf_info[1].host_addr = ring->rbase; + buf_info[1].dev_addr = &ring->ring_cache[0]; + + ret = mhi_cntrl->read_batch(mhi_cntrl, buf_info, 2); if (ret < 0) return ret; - if (end) { - buf_info.host_addr = ring->rbase; - buf_info.dev_addr = &ring->ring_cache[0]; - buf_info.size = end * sizeof(struct mhi_ring_element); - - ret = mhi_cntrl->read_sync(mhi_cntrl, &buf_info); - if (ret < 0) - return ret; - } + dev_dbg(dev, "Cached ring (batched): start %zu end %zu tail_size %zu head_size %zu\n", + start, end, buf_info[0].size, buf_info[1].size); } - dev_dbg(dev, "Cached ring: start %zu end %zu size %zu\n", start, end, buf_info.size); - return 0; } -- 2.34.1