* [PATCH v2 0/7] Improvements to Qcom PCIe EP and EPF MHI drivers
@ 2023-07-17 6:54 Manivannan Sadhasivam
2023-07-17 6:54 ` [PATCH v2 1/7] PCI: qcom-ep: Pass alignment restriction to the EPF core Manivannan Sadhasivam
` (7 more replies)
0 siblings, 8 replies; 12+ messages in thread
From: Manivannan Sadhasivam @ 2023-07-17 6:54 UTC (permalink / raw)
To: lpieralisi, kw
Cc: kishon, bhelgaas, linux-pci, linux-kernel, linux-arm-msm,
Manivannan Sadhasivam
Hi,
This series adds eDMA (embedded DMA) support to the Qcom PCIe EP and EPF
MHI drivers for offloading the transfers between PCIe bus and the EP
memory. eDMA support makes use of the recently merged eDMA DMAEngine driver
and its integration with DWC PCIe EP core [1].
This series also adds Qcom SM8450 SoC support to EPF MHI driver that has
the eDMA support built-in.
- Mani
[1] https://lore.kernel.org/all/20230113171409.30470-1-Sergey.Semin@baikalelectronics.ru/
Changes in v2:
* Rebased on top of v6.5-rc1
Manivannan Sadhasivam (7):
PCI: qcom-ep: Pass alignment restriction to the EPF core
PCI: epf-mhi: Make use of the alignment restriction from EPF core
PCI: qcom-ep: Add eDMA support
PCI: epf-mhi: Add eDMA support
PCI: epf-mhi: Add support for SM8450
PCI: epf-mhi: Use iATU for small transfers
PCI: endpoint: Add kernel-doc for pci_epc_mem_init() API
drivers/pci/controller/dwc/pcie-qcom-ep.c | 5 +-
drivers/pci/endpoint/functions/pci-epf-mhi.c | 280 ++++++++++++++++++-
drivers/pci/endpoint/pci-epc-mem.c | 10 +
3 files changed, 281 insertions(+), 14 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 1/7] PCI: qcom-ep: Pass alignment restriction to the EPF core
2023-07-17 6:54 [PATCH v2 0/7] Improvements to Qcom PCIe EP and EPF MHI drivers Manivannan Sadhasivam
@ 2023-07-17 6:54 ` Manivannan Sadhasivam
2023-07-17 6:54 ` [PATCH v2 2/7] PCI: epf-mhi: Make use of the alignment restriction from " Manivannan Sadhasivam
` (6 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Manivannan Sadhasivam @ 2023-07-17 6:54 UTC (permalink / raw)
To: lpieralisi, kw
Cc: kishon, bhelgaas, linux-pci, linux-kernel, linux-arm-msm,
Manivannan Sadhasivam
Qcom PCIe EP controllers have 4K alignment restriction for the outbound
window address. Hence, pass this info to the EPF core so that the EPF
drivers can make use of this info.
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
---
drivers/pci/controller/dwc/pcie-qcom-ep.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/pci/controller/dwc/pcie-qcom-ep.c b/drivers/pci/controller/dwc/pcie-qcom-ep.c
index 0fe7f06f2102..736be5bee458 100644
--- a/drivers/pci/controller/dwc/pcie-qcom-ep.c
+++ b/drivers/pci/controller/dwc/pcie-qcom-ep.c
@@ -706,6 +706,7 @@ static const struct pci_epc_features qcom_pcie_epc_features = {
.core_init_notifier = true,
.msi_capable = true,
.msix_capable = false,
+ .align = SZ_4K,
};
static const struct pci_epc_features *
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 2/7] PCI: epf-mhi: Make use of the alignment restriction from EPF core
2023-07-17 6:54 [PATCH v2 0/7] Improvements to Qcom PCIe EP and EPF MHI drivers Manivannan Sadhasivam
2023-07-17 6:54 ` [PATCH v2 1/7] PCI: qcom-ep: Pass alignment restriction to the EPF core Manivannan Sadhasivam
@ 2023-07-17 6:54 ` Manivannan Sadhasivam
2023-08-25 22:50 ` Bjorn Helgaas
2023-07-17 6:54 ` [PATCH v2 3/7] PCI: qcom-ep: Add eDMA support Manivannan Sadhasivam
` (5 subsequent siblings)
7 siblings, 1 reply; 12+ messages in thread
From: Manivannan Sadhasivam @ 2023-07-17 6:54 UTC (permalink / raw)
To: lpieralisi, kw
Cc: kishon, bhelgaas, linux-pci, linux-kernel, linux-arm-msm,
Manivannan Sadhasivam
Instead of hardcoding the alignment restriction in the EPF_MHI driver, make
use of the info available from the EPF core that reflects the alignment
restriction of the endpoint controller.
For this purpose, let's introduce the get_align_offset() static function.
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
---
drivers/pci/endpoint/functions/pci-epf-mhi.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/drivers/pci/endpoint/functions/pci-epf-mhi.c b/drivers/pci/endpoint/functions/pci-epf-mhi.c
index 9c1f5a154fbd..bb7de6884824 100644
--- a/drivers/pci/endpoint/functions/pci-epf-mhi.c
+++ b/drivers/pci/endpoint/functions/pci-epf-mhi.c
@@ -102,6 +102,11 @@ struct pci_epf_mhi {
int irq;
};
+static size_t get_align_offset(struct pci_epc *epc, u64 addr)
+{
+ return addr % epc->mem->window.page_size;
+}
+
static int __pci_epf_mhi_alloc_map(struct mhi_ep_cntrl *mhi_cntrl, u64 pci_addr,
phys_addr_t *paddr, void __iomem **vaddr,
size_t offset, size_t size)
@@ -134,7 +139,7 @@ static int pci_epf_mhi_alloc_map(struct mhi_ep_cntrl *mhi_cntrl, u64 pci_addr,
{
struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
struct pci_epc *epc = epf_mhi->epf->epc;
- size_t offset = pci_addr & (epc->mem->window.page_size - 1);
+ size_t offset = get_align_offset(epc, pci_addr);
return __pci_epf_mhi_alloc_map(mhi_cntrl, pci_addr, paddr, vaddr,
offset, size);
@@ -161,7 +166,7 @@ static void pci_epf_mhi_unmap_free(struct mhi_ep_cntrl *mhi_cntrl, u64 pci_addr,
struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
struct pci_epf *epf = epf_mhi->epf;
struct pci_epc *epc = epf->epc;
- size_t offset = pci_addr & (epc->mem->window.page_size - 1);
+ size_t offset = get_align_offset(epc, pci_addr);
__pci_epf_mhi_unmap_free(mhi_cntrl, pci_addr, paddr, vaddr, offset,
size);
@@ -185,7 +190,8 @@ static int pci_epf_mhi_read_from_host(struct mhi_ep_cntrl *mhi_cntrl, u64 from,
void *to, size_t size)
{
struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
- size_t offset = from % SZ_4K;
+ struct pci_epc *epc = epf_mhi->epf->epc;
+ size_t offset = get_align_offset(epc, from);
void __iomem *tre_buf;
phys_addr_t tre_phys;
int ret;
@@ -213,7 +219,8 @@ static int pci_epf_mhi_write_to_host(struct mhi_ep_cntrl *mhi_cntrl,
void *from, u64 to, size_t size)
{
struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
- size_t offset = to % SZ_4K;
+ struct pci_epc *epc = epf_mhi->epf->epc;
+ size_t offset = get_align_offset(epc, to);
void __iomem *tre_buf;
phys_addr_t tre_phys;
int ret;
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 3/7] PCI: qcom-ep: Add eDMA support
2023-07-17 6:54 [PATCH v2 0/7] Improvements to Qcom PCIe EP and EPF MHI drivers Manivannan Sadhasivam
2023-07-17 6:54 ` [PATCH v2 1/7] PCI: qcom-ep: Pass alignment restriction to the EPF core Manivannan Sadhasivam
2023-07-17 6:54 ` [PATCH v2 2/7] PCI: epf-mhi: Make use of the alignment restriction from " Manivannan Sadhasivam
@ 2023-07-17 6:54 ` Manivannan Sadhasivam
2023-07-17 6:54 ` [PATCH v2 4/7] PCI: epf-mhi: " Manivannan Sadhasivam
` (4 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Manivannan Sadhasivam @ 2023-07-17 6:54 UTC (permalink / raw)
To: lpieralisi, kw
Cc: kishon, bhelgaas, linux-pci, linux-kernel, linux-arm-msm,
Manivannan Sadhasivam
Qualcomm PCIe Endpoint controllers have the in-built Embedded DMA (eDMA)
peripheral for offloading the data transfer between PCIe bus and memory.
Let's add the support for it by enabling the eDMA IRQ in the driver.
Rest of the functionality will be handled by the eDMA DMA Engine driver.
Since the eDMA on Qualcomm platforms only uses a single IRQ for all
channels, use 1 for edma.nr_irqs.
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
---
drivers/pci/controller/dwc/pcie-qcom-ep.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/pci/controller/dwc/pcie-qcom-ep.c b/drivers/pci/controller/dwc/pcie-qcom-ep.c
index 736be5bee458..1baec81183b6 100644
--- a/drivers/pci/controller/dwc/pcie-qcom-ep.c
+++ b/drivers/pci/controller/dwc/pcie-qcom-ep.c
@@ -74,6 +74,7 @@
#define PARF_INT_ALL_PLS_ERR BIT(15)
#define PARF_INT_ALL_PME_LEGACY BIT(16)
#define PARF_INT_ALL_PLS_PME BIT(17)
+#define PARF_INT_ALL_EDMA BIT(22)
/* PARF_BDF_TO_SID_CFG register fields */
#define PARF_BDF_TO_SID_BYPASS BIT(0)
@@ -395,7 +396,7 @@ static int qcom_pcie_perst_deassert(struct dw_pcie *pci)
writel_relaxed(0, pcie_ep->parf + PARF_INT_ALL_MASK);
val = PARF_INT_ALL_LINK_DOWN | PARF_INT_ALL_BME |
PARF_INT_ALL_PM_TURNOFF | PARF_INT_ALL_DSTATE_CHANGE |
- PARF_INT_ALL_LINK_UP;
+ PARF_INT_ALL_LINK_UP | PARF_INT_ALL_EDMA;
writel_relaxed(val, pcie_ep->parf + PARF_INT_ALL_MASK);
ret = dw_pcie_ep_init_complete(&pcie_ep->pci.ep);
@@ -744,6 +745,7 @@ static int qcom_pcie_ep_probe(struct platform_device *pdev)
pcie_ep->pci.dev = dev;
pcie_ep->pci.ops = &pci_ops;
pcie_ep->pci.ep.ops = &pci_ep_ops;
+ pcie_ep->pci.edma.nr_irqs = 1;
platform_set_drvdata(pdev, pcie_ep);
ret = qcom_pcie_ep_get_resources(pdev, pcie_ep);
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 4/7] PCI: epf-mhi: Add eDMA support
2023-07-17 6:54 [PATCH v2 0/7] Improvements to Qcom PCIe EP and EPF MHI drivers Manivannan Sadhasivam
` (2 preceding siblings ...)
2023-07-17 6:54 ` [PATCH v2 3/7] PCI: qcom-ep: Add eDMA support Manivannan Sadhasivam
@ 2023-07-17 6:54 ` Manivannan Sadhasivam
2023-07-17 6:54 ` [PATCH v2 5/7] PCI: epf-mhi: Add support for SM8450 Manivannan Sadhasivam
` (3 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Manivannan Sadhasivam @ 2023-07-17 6:54 UTC (permalink / raw)
To: lpieralisi, kw
Cc: kishon, bhelgaas, linux-pci, linux-kernel, linux-arm-msm,
Manivannan Sadhasivam
Add support for Embedded DMA (eDMA) available in the Designware PCIe IP to
transfer the MHI buffers between host and the endpoint. Use of eDMA helps
in achieving greater throughput as the transfers are offloaded from CPUs.
For differentiating the iATU and eDMA APIs, the pci_epf_mhi_{read/write}
APIs are renamed to pci_epf_mhi_iatu_{read/write} and separate eDMA
specific APIs pci_epf_mhi_edma_{read/write} are introduced.
Platforms that require eDMA support can pass the MHI_EPF_USE_DMA flag
through pci_epf_mhi_ep_info.
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
---
drivers/pci/endpoint/functions/pci-epf-mhi.c | 237 ++++++++++++++++++-
1 file changed, 231 insertions(+), 6 deletions(-)
diff --git a/drivers/pci/endpoint/functions/pci-epf-mhi.c b/drivers/pci/endpoint/functions/pci-epf-mhi.c
index bb7de6884824..abebe44d0061 100644
--- a/drivers/pci/endpoint/functions/pci-epf-mhi.c
+++ b/drivers/pci/endpoint/functions/pci-epf-mhi.c
@@ -6,8 +6,10 @@
* Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
*/
+#include <linux/dmaengine.h>
#include <linux/mhi_ep.h>
#include <linux/module.h>
+#include <linux/of_dma.h>
#include <linux/platform_device.h>
#include <linux/pci-epc.h>
#include <linux/pci-epf.h>
@@ -16,6 +18,9 @@
#define to_epf_mhi(cntrl) container_of(cntrl, struct pci_epf_mhi, cntrl)
+/* Platform specific flags */
+#define MHI_EPF_USE_DMA BIT(0)
+
struct pci_epf_mhi_ep_info {
const struct mhi_ep_cntrl_config *config;
struct pci_epf_header *epf_header;
@@ -23,6 +28,7 @@ struct pci_epf_mhi_ep_info {
u32 epf_flags;
u32 msi_count;
u32 mru;
+ u32 flags;
};
#define MHI_EP_CHANNEL_CONFIG(ch_num, ch_name, direction) \
@@ -98,6 +104,8 @@ struct pci_epf_mhi {
struct mutex lock;
void __iomem *mmio;
resource_size_t mmio_phys;
+ struct dma_chan *dma_chan_tx;
+ struct dma_chan *dma_chan_rx;
u32 mmio_size;
int irq;
};
@@ -186,8 +194,8 @@ static void pci_epf_mhi_raise_irq(struct mhi_ep_cntrl *mhi_cntrl, u32 vector)
vector + 1);
}
-static int pci_epf_mhi_read_from_host(struct mhi_ep_cntrl *mhi_cntrl, u64 from,
- void *to, size_t size)
+static int pci_epf_mhi_iatu_read(struct mhi_ep_cntrl *mhi_cntrl, u64 from,
+ void *to, size_t size)
{
struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
struct pci_epc *epc = epf_mhi->epf->epc;
@@ -215,8 +223,8 @@ static int pci_epf_mhi_read_from_host(struct mhi_ep_cntrl *mhi_cntrl, u64 from,
return 0;
}
-static int pci_epf_mhi_write_to_host(struct mhi_ep_cntrl *mhi_cntrl,
- void *from, u64 to, size_t size)
+static int pci_epf_mhi_iatu_write(struct mhi_ep_cntrl *mhi_cntrl,
+ void *from, u64 to, size_t size)
{
struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
struct pci_epc *epc = epf_mhi->epf->epc;
@@ -244,6 +252,200 @@ static int pci_epf_mhi_write_to_host(struct mhi_ep_cntrl *mhi_cntrl,
return 0;
}
+static void pci_epf_mhi_dma_callback(void *param)
+{
+ complete(param);
+}
+
+static int pci_epf_mhi_edma_read(struct mhi_ep_cntrl *mhi_cntrl, u64 from,
+ void *to, size_t size)
+{
+ struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
+ struct device *dma_dev = epf_mhi->epf->epc->dev.parent;
+ struct dma_chan *chan = epf_mhi->dma_chan_rx;
+ struct device *dev = &epf_mhi->epf->dev;
+ DECLARE_COMPLETION_ONSTACK(complete);
+ struct dma_async_tx_descriptor *desc;
+ struct dma_slave_config config = {};
+ dma_cookie_t cookie;
+ dma_addr_t dst_addr;
+ int ret;
+
+ mutex_lock(&epf_mhi->lock);
+
+ config.direction = DMA_DEV_TO_MEM;
+ config.src_addr = from;
+
+ ret = dmaengine_slave_config(chan, &config);
+ if (ret) {
+ dev_err(dev, "Failed to configure DMA channel\n");
+ goto err_unlock;
+ }
+
+ dst_addr = dma_map_single(dma_dev, to, size, DMA_FROM_DEVICE);
+ ret = dma_mapping_error(dma_dev, dst_addr);
+ if (ret) {
+ dev_err(dev, "Failed to map remote memory\n");
+ goto err_unlock;
+ }
+
+ desc = dmaengine_prep_slave_single(chan, dst_addr, size, DMA_DEV_TO_MEM,
+ DMA_CTRL_ACK | DMA_PREP_INTERRUPT);
+ if (!desc) {
+ dev_err(dev, "Failed to prepare DMA\n");
+ ret = -EIO;
+ goto err_unmap;
+ }
+
+ desc->callback = pci_epf_mhi_dma_callback;
+ desc->callback_param = &complete;
+
+ cookie = dmaengine_submit(desc);
+ ret = dma_submit_error(cookie);
+ if (ret) {
+ dev_err(dev, "Failed to do DMA submit\n");
+ goto err_unmap;
+ }
+
+ dma_async_issue_pending(chan);
+ ret = wait_for_completion_timeout(&complete, msecs_to_jiffies(1000));
+ if (!ret) {
+ dev_err(dev, "DMA transfer timeout\n");
+ dmaengine_terminate_sync(chan);
+ ret = -ETIMEDOUT;
+ }
+
+err_unmap:
+ dma_unmap_single(dma_dev, dst_addr, size, DMA_FROM_DEVICE);
+err_unlock:
+ mutex_unlock(&epf_mhi->lock);
+
+ return ret;
+}
+
+static int pci_epf_mhi_edma_write(struct mhi_ep_cntrl *mhi_cntrl, void *from,
+ u64 to, size_t size)
+{
+ struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
+ struct device *dma_dev = epf_mhi->epf->epc->dev.parent;
+ struct dma_chan *chan = epf_mhi->dma_chan_tx;
+ struct device *dev = &epf_mhi->epf->dev;
+ DECLARE_COMPLETION_ONSTACK(complete);
+ struct dma_async_tx_descriptor *desc;
+ struct dma_slave_config config = {};
+ dma_cookie_t cookie;
+ dma_addr_t src_addr;
+ int ret;
+
+ mutex_lock(&epf_mhi->lock);
+
+ config.direction = DMA_MEM_TO_DEV;
+ config.dst_addr = to;
+
+ ret = dmaengine_slave_config(chan, &config);
+ if (ret) {
+ dev_err(dev, "Failed to configure DMA channel\n");
+ goto err_unlock;
+ }
+
+ src_addr = dma_map_single(dma_dev, from, size, DMA_TO_DEVICE);
+ ret = dma_mapping_error(dma_dev, src_addr);
+ if (ret) {
+ dev_err(dev, "Failed to map remote memory\n");
+ goto err_unlock;
+ }
+
+ desc = dmaengine_prep_slave_single(chan, src_addr, size, DMA_MEM_TO_DEV,
+ DMA_CTRL_ACK | DMA_PREP_INTERRUPT);
+ if (!desc) {
+ dev_err(dev, "Failed to prepare DMA\n");
+ ret = -EIO;
+ goto err_unmap;
+ }
+
+ desc->callback = pci_epf_mhi_dma_callback;
+ desc->callback_param = &complete;
+
+ cookie = dmaengine_submit(desc);
+ ret = dma_submit_error(cookie);
+ if (ret) {
+ dev_err(dev, "Failed to do DMA submit\n");
+ goto err_unmap;
+ }
+
+ dma_async_issue_pending(chan);
+ ret = wait_for_completion_timeout(&complete, msecs_to_jiffies(1000));
+ if (!ret) {
+ dev_err(dev, "DMA transfer timeout\n");
+ dmaengine_terminate_sync(chan);
+ ret = -ETIMEDOUT;
+ }
+
+err_unmap:
+ dma_unmap_single(dma_dev, src_addr, size, DMA_FROM_DEVICE);
+err_unlock:
+ mutex_unlock(&epf_mhi->lock);
+
+ return ret;
+}
+
+struct epf_dma_filter {
+ struct device *dev;
+ u32 dma_mask;
+};
+
+static bool pci_epf_mhi_filter(struct dma_chan *chan, void *node)
+{
+ struct epf_dma_filter *filter = node;
+ struct dma_slave_caps caps;
+
+ memset(&caps, 0, sizeof(caps));
+ dma_get_slave_caps(chan, &caps);
+
+ return chan->device->dev == filter->dev && filter->dma_mask &
+ caps.directions;
+}
+
+static int pci_epf_mhi_dma_init(struct pci_epf_mhi *epf_mhi)
+{
+ struct device *dma_dev = epf_mhi->epf->epc->dev.parent;
+ struct device *dev = &epf_mhi->epf->dev;
+ struct epf_dma_filter filter;
+ dma_cap_mask_t mask;
+
+ dma_cap_zero(mask);
+ dma_cap_set(DMA_SLAVE, mask);
+
+ filter.dev = dma_dev;
+ filter.dma_mask = BIT(DMA_MEM_TO_DEV);
+ epf_mhi->dma_chan_tx = dma_request_channel(mask, pci_epf_mhi_filter,
+ &filter);
+ if (IS_ERR_OR_NULL(epf_mhi->dma_chan_tx)) {
+ dev_err(dev, "Failed to request tx channel\n");
+ return -ENODEV;
+ }
+
+ filter.dma_mask = BIT(DMA_DEV_TO_MEM);
+ epf_mhi->dma_chan_rx = dma_request_channel(mask, pci_epf_mhi_filter,
+ &filter);
+ if (IS_ERR_OR_NULL(epf_mhi->dma_chan_rx)) {
+ dev_err(dev, "Failed to request rx channel\n");
+ dma_release_channel(epf_mhi->dma_chan_tx);
+ epf_mhi->dma_chan_tx = NULL;
+ return -ENODEV;
+ }
+
+ return 0;
+}
+
+static void pci_epf_mhi_dma_deinit(struct pci_epf_mhi *epf_mhi)
+{
+ dma_release_channel(epf_mhi->dma_chan_tx);
+ dma_release_channel(epf_mhi->dma_chan_rx);
+ epf_mhi->dma_chan_tx = NULL;
+ epf_mhi->dma_chan_rx = NULL;
+}
+
static int pci_epf_mhi_core_init(struct pci_epf *epf)
{
struct pci_epf_mhi *epf_mhi = epf_get_drvdata(epf);
@@ -289,6 +491,14 @@ static int pci_epf_mhi_link_up(struct pci_epf *epf)
struct device *dev = &epf->dev;
int ret;
+ if (info->flags & MHI_EPF_USE_DMA) {
+ ret = pci_epf_mhi_dma_init(epf_mhi);
+ if (ret) {
+ dev_err(dev, "Failed to initialize DMA: %d\n", ret);
+ return ret;
+ }
+ }
+
mhi_cntrl->mmio = epf_mhi->mmio;
mhi_cntrl->irq = epf_mhi->irq;
mhi_cntrl->mru = info->mru;
@@ -298,13 +508,20 @@ static int pci_epf_mhi_link_up(struct pci_epf *epf)
mhi_cntrl->raise_irq = pci_epf_mhi_raise_irq;
mhi_cntrl->alloc_map = pci_epf_mhi_alloc_map;
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;
+ if (info->flags & MHI_EPF_USE_DMA) {
+ mhi_cntrl->read_from_host = pci_epf_mhi_edma_read;
+ mhi_cntrl->write_to_host = pci_epf_mhi_edma_write;
+ } else {
+ mhi_cntrl->read_from_host = pci_epf_mhi_iatu_read;
+ mhi_cntrl->write_to_host = pci_epf_mhi_iatu_write;
+ }
/* Register the MHI EP controller */
ret = mhi_ep_register_controller(mhi_cntrl, info->config);
if (ret) {
dev_err(dev, "Failed to register MHI EP controller: %d\n", ret);
+ if (info->flags & MHI_EPF_USE_DMA)
+ pci_epf_mhi_dma_deinit(epf_mhi);
return ret;
}
@@ -314,10 +531,13 @@ static int pci_epf_mhi_link_up(struct pci_epf *epf)
static int pci_epf_mhi_link_down(struct pci_epf *epf)
{
struct pci_epf_mhi *epf_mhi = epf_get_drvdata(epf);
+ const struct pci_epf_mhi_ep_info *info = epf_mhi->info;
struct mhi_ep_cntrl *mhi_cntrl = &epf_mhi->mhi_cntrl;
if (mhi_cntrl->mhi_dev) {
mhi_ep_power_down(mhi_cntrl);
+ if (info->flags & MHI_EPF_USE_DMA)
+ pci_epf_mhi_dma_deinit(epf_mhi);
mhi_ep_unregister_controller(mhi_cntrl);
}
@@ -327,6 +547,7 @@ static int pci_epf_mhi_link_down(struct pci_epf *epf)
static int pci_epf_mhi_bme(struct pci_epf *epf)
{
struct pci_epf_mhi *epf_mhi = epf_get_drvdata(epf);
+ const struct pci_epf_mhi_ep_info *info = epf_mhi->info;
struct mhi_ep_cntrl *mhi_cntrl = &epf_mhi->mhi_cntrl;
struct device *dev = &epf->dev;
int ret;
@@ -339,6 +560,8 @@ static int pci_epf_mhi_bme(struct pci_epf *epf)
ret = mhi_ep_power_up(mhi_cntrl);
if (ret) {
dev_err(dev, "Failed to power up MHI EP: %d\n", ret);
+ if (info->flags & MHI_EPF_USE_DMA)
+ pci_epf_mhi_dma_deinit(epf_mhi);
mhi_ep_unregister_controller(mhi_cntrl);
}
}
@@ -389,6 +612,8 @@ static void pci_epf_mhi_unbind(struct pci_epf *epf)
*/
if (mhi_cntrl->mhi_dev) {
mhi_ep_power_down(mhi_cntrl);
+ if (info->flags & MHI_EPF_USE_DMA)
+ pci_epf_mhi_dma_deinit(epf_mhi);
mhi_ep_unregister_controller(mhi_cntrl);
}
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 5/7] PCI: epf-mhi: Add support for SM8450
2023-07-17 6:54 [PATCH v2 0/7] Improvements to Qcom PCIe EP and EPF MHI drivers Manivannan Sadhasivam
` (3 preceding siblings ...)
2023-07-17 6:54 ` [PATCH v2 4/7] PCI: epf-mhi: " Manivannan Sadhasivam
@ 2023-07-17 6:54 ` Manivannan Sadhasivam
2023-07-17 6:54 ` [PATCH v2 6/7] PCI: epf-mhi: Use iATU for small transfers Manivannan Sadhasivam
` (2 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Manivannan Sadhasivam @ 2023-07-17 6:54 UTC (permalink / raw)
To: lpieralisi, kw
Cc: kishon, bhelgaas, linux-pci, linux-kernel, linux-arm-msm,
Manivannan Sadhasivam
Add support for Qualcomm Snapdragon SM8450 SoC to the EPF driver. SM8450
has the dedicated PID (0x0306) and supports eDMA. Currently, it has no
fixed PCI class, so it is being advertised as "PCI_CLASS_OTHERS".
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
---
drivers/pci/endpoint/functions/pci-epf-mhi.c | 22 +++++++++++++++++---
1 file changed, 19 insertions(+), 3 deletions(-)
diff --git a/drivers/pci/endpoint/functions/pci-epf-mhi.c b/drivers/pci/endpoint/functions/pci-epf-mhi.c
index abebe44d0061..dc6692e2c623 100644
--- a/drivers/pci/endpoint/functions/pci-epf-mhi.c
+++ b/drivers/pci/endpoint/functions/pci-epf-mhi.c
@@ -97,6 +97,23 @@ static const struct pci_epf_mhi_ep_info sdx55_info = {
.mru = 0x8000,
};
+static struct pci_epf_header sm8450_header = {
+ .vendorid = PCI_VENDOR_ID_QCOM,
+ .deviceid = 0x0306,
+ .baseclass_code = PCI_CLASS_OTHERS,
+ .interrupt_pin = PCI_INTERRUPT_INTA,
+};
+
+static const struct pci_epf_mhi_ep_info sm8450_info = {
+ .config = &mhi_v1_config,
+ .epf_header = &sm8450_header,
+ .bar_num = BAR_0,
+ .epf_flags = PCI_BASE_ADDRESS_MEM_TYPE_32,
+ .msi_count = 32,
+ .mru = 0x8000,
+ .flags = MHI_EPF_USE_DMA,
+};
+
struct pci_epf_mhi {
const struct pci_epf_mhi_ep_info *info;
struct mhi_ep_cntrl mhi_cntrl;
@@ -654,9 +671,8 @@ static int pci_epf_mhi_probe(struct pci_epf *epf,
}
static const struct pci_epf_device_id pci_epf_mhi_ids[] = {
- {
- .name = "sdx55", .driver_data = (kernel_ulong_t)&sdx55_info,
- },
+ { .name = "sdx55", .driver_data = (kernel_ulong_t)&sdx55_info },
+ { .name = "sm8450", .driver_data = (kernel_ulong_t)&sm8450_info },
{},
};
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 6/7] PCI: epf-mhi: Use iATU for small transfers
2023-07-17 6:54 [PATCH v2 0/7] Improvements to Qcom PCIe EP and EPF MHI drivers Manivannan Sadhasivam
` (4 preceding siblings ...)
2023-07-17 6:54 ` [PATCH v2 5/7] PCI: epf-mhi: Add support for SM8450 Manivannan Sadhasivam
@ 2023-07-17 6:54 ` Manivannan Sadhasivam
2023-07-17 6:54 ` [PATCH v2 7/7] PCI: endpoint: Add kernel-doc for pci_epc_mem_init() API Manivannan Sadhasivam
2023-08-25 18:28 ` [PATCH v2 0/7] Improvements to Qcom PCIe EP and EPF MHI drivers Krzysztof Wilczyński
7 siblings, 0 replies; 12+ messages in thread
From: Manivannan Sadhasivam @ 2023-07-17 6:54 UTC (permalink / raw)
To: lpieralisi, kw
Cc: kishon, bhelgaas, linux-pci, linux-kernel, linux-arm-msm,
Manivannan Sadhasivam
For transfers below 4K, let's use iATU since using eDMA for such small
transfers is not efficient. This is mainly due to the fact that setting
up a eDMA transfer and waiting for its completion adds some latency. This
latency is negligible for large transfers but not for the smaller ones.
With this hack, there is an increase in ~50Mbps throughput on both MHI UL
(Uplink) and DL (Downlink) channels.
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
---
drivers/pci/endpoint/functions/pci-epf-mhi.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/pci/endpoint/functions/pci-epf-mhi.c b/drivers/pci/endpoint/functions/pci-epf-mhi.c
index dc6692e2c623..a8feb03061aa 100644
--- a/drivers/pci/endpoint/functions/pci-epf-mhi.c
+++ b/drivers/pci/endpoint/functions/pci-epf-mhi.c
@@ -288,6 +288,9 @@ static int pci_epf_mhi_edma_read(struct mhi_ep_cntrl *mhi_cntrl, u64 from,
dma_addr_t dst_addr;
int ret;
+ if (size < SZ_4K)
+ return pci_epf_mhi_iatu_read(mhi_cntrl, from, to, size);
+
mutex_lock(&epf_mhi->lock);
config.direction = DMA_DEV_TO_MEM;
@@ -354,6 +357,9 @@ static int pci_epf_mhi_edma_write(struct mhi_ep_cntrl *mhi_cntrl, void *from,
dma_addr_t src_addr;
int ret;
+ if (size < SZ_4K)
+ return pci_epf_mhi_iatu_write(mhi_cntrl, from, to, size);
+
mutex_lock(&epf_mhi->lock);
config.direction = DMA_MEM_TO_DEV;
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 7/7] PCI: endpoint: Add kernel-doc for pci_epc_mem_init() API
2023-07-17 6:54 [PATCH v2 0/7] Improvements to Qcom PCIe EP and EPF MHI drivers Manivannan Sadhasivam
` (5 preceding siblings ...)
2023-07-17 6:54 ` [PATCH v2 6/7] PCI: epf-mhi: Use iATU for small transfers Manivannan Sadhasivam
@ 2023-07-17 6:54 ` Manivannan Sadhasivam
2023-07-17 7:04 ` Randy Dunlap
2023-08-25 18:28 ` [PATCH v2 0/7] Improvements to Qcom PCIe EP and EPF MHI drivers Krzysztof Wilczyński
7 siblings, 1 reply; 12+ messages in thread
From: Manivannan Sadhasivam @ 2023-07-17 6:54 UTC (permalink / raw)
To: lpieralisi, kw
Cc: kishon, bhelgaas, linux-pci, linux-kernel, linux-arm-msm,
Manivannan Sadhasivam
Add missing kernel-doc for pci_epc_mem_init() API.
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
---
drivers/pci/endpoint/pci-epc-mem.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/pci/endpoint/pci-epc-mem.c b/drivers/pci/endpoint/pci-epc-mem.c
index 7dcf6f480b82..a9c028f58da1 100644
--- a/drivers/pci/endpoint/pci-epc-mem.c
+++ b/drivers/pci/endpoint/pci-epc-mem.c
@@ -115,6 +115,16 @@ int pci_epc_multi_mem_init(struct pci_epc *epc,
}
EXPORT_SYMBOL_GPL(pci_epc_multi_mem_init);
+/**
+ * pci_epc_mem_init() - Initialize the pci_epc_mem structure
+ * @epc: the EPC device that invoked pci_epc_mem_init
+ * @base: Physical address of the window region
+ * @size: Total Size of the window region
+ * @page_size: Page size of the window region
+ *
+ * Invoke to initialize a single pci_epc_mem structure used by the
+ * endpoint functions to allocate memory for mapping the PCI host memory
+ */
int pci_epc_mem_init(struct pci_epc *epc, phys_addr_t base,
size_t size, size_t page_size)
{
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v2 7/7] PCI: endpoint: Add kernel-doc for pci_epc_mem_init() API
2023-07-17 6:54 ` [PATCH v2 7/7] PCI: endpoint: Add kernel-doc for pci_epc_mem_init() API Manivannan Sadhasivam
@ 2023-07-17 7:04 ` Randy Dunlap
0 siblings, 0 replies; 12+ messages in thread
From: Randy Dunlap @ 2023-07-17 7:04 UTC (permalink / raw)
To: Manivannan Sadhasivam, lpieralisi, kw
Cc: kishon, bhelgaas, linux-pci, linux-kernel, linux-arm-msm
On 7/16/23 23:54, Manivannan Sadhasivam wrote:
> Add missing kernel-doc for pci_epc_mem_init() API.
>
> Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Looks good. Thanks.
Reviewed-by: Randy Dunlap <rdunlap@infradead.org>
> ---
> drivers/pci/endpoint/pci-epc-mem.c | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/drivers/pci/endpoint/pci-epc-mem.c b/drivers/pci/endpoint/pci-epc-mem.c
> index 7dcf6f480b82..a9c028f58da1 100644
> --- a/drivers/pci/endpoint/pci-epc-mem.c
> +++ b/drivers/pci/endpoint/pci-epc-mem.c
> @@ -115,6 +115,16 @@ int pci_epc_multi_mem_init(struct pci_epc *epc,
> }
> EXPORT_SYMBOL_GPL(pci_epc_multi_mem_init);
>
> +/**
> + * pci_epc_mem_init() - Initialize the pci_epc_mem structure
> + * @epc: the EPC device that invoked pci_epc_mem_init
> + * @base: Physical address of the window region
> + * @size: Total Size of the window region
> + * @page_size: Page size of the window region
> + *
> + * Invoke to initialize a single pci_epc_mem structure used by the
> + * endpoint functions to allocate memory for mapping the PCI host memory
> + */
> int pci_epc_mem_init(struct pci_epc *epc, phys_addr_t base,
> size_t size, size_t page_size)
> {
--
~Randy
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 0/7] Improvements to Qcom PCIe EP and EPF MHI drivers
2023-07-17 6:54 [PATCH v2 0/7] Improvements to Qcom PCIe EP and EPF MHI drivers Manivannan Sadhasivam
` (6 preceding siblings ...)
2023-07-17 6:54 ` [PATCH v2 7/7] PCI: endpoint: Add kernel-doc for pci_epc_mem_init() API Manivannan Sadhasivam
@ 2023-08-25 18:28 ` Krzysztof Wilczyński
7 siblings, 0 replies; 12+ messages in thread
From: Krzysztof Wilczyński @ 2023-08-25 18:28 UTC (permalink / raw)
To: Manivannan Sadhasivam
Cc: Lorenzo Pieralisi, Kishon Vijay Abraham I, Bjorn Helgaas,
linux-pci, linux-kernel, linux-arm-msm
Hello,
> This series adds eDMA (embedded DMA) support to the Qcom PCIe EP and EPF
> MHI drivers for offloading the transfers between PCIe bus and the EP
> memory. eDMA support makes use of the recently merged eDMA DMAEngine driver
> and its integration with DWC PCIe EP core [1].
>
> This series also adds Qcom SM8450 SoC support to EPF MHI driver that has
> the eDMA support built-in.
Apologies, I accidentally responded to an older series:
https://lore.kernel.org/linux-pci/20230825175729.GB131548@rocinante
This series version was applied, of course.
Krzysztof
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 2/7] PCI: epf-mhi: Make use of the alignment restriction from EPF core
2023-07-17 6:54 ` [PATCH v2 2/7] PCI: epf-mhi: Make use of the alignment restriction from " Manivannan Sadhasivam
@ 2023-08-25 22:50 ` Bjorn Helgaas
2023-08-26 14:46 ` Manivannan Sadhasivam
0 siblings, 1 reply; 12+ messages in thread
From: Bjorn Helgaas @ 2023-08-25 22:50 UTC (permalink / raw)
To: Manivannan Sadhasivam
Cc: lpieralisi, kw, kishon, bhelgaas, linux-pci, linux-kernel,
linux-arm-msm
On Mon, Jul 17, 2023 at 12:24:54PM +0530, Manivannan Sadhasivam wrote:
> Instead of hardcoding the alignment restriction in the EPF_MHI driver, make
> use of the info available from the EPF core that reflects the alignment
> restriction of the endpoint controller.
>
> For this purpose, let's introduce the get_align_offset() static function.
I thought this might be related to the [1/7] patch since they both
mention an alignment restriction in the EPF core, but [1/7] sets
pci_epc_features.align and this patch doesn't reference .align, so
this must be a different alignment restriction?
I'm sure there's nothing wrong here, and this is already applied, so
no need to do anything unless .align *should* appear here.
> Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
> ---
> drivers/pci/endpoint/functions/pci-epf-mhi.c | 15 +++++++++++----
> 1 file changed, 11 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/pci/endpoint/functions/pci-epf-mhi.c b/drivers/pci/endpoint/functions/pci-epf-mhi.c
> index 9c1f5a154fbd..bb7de6884824 100644
> --- a/drivers/pci/endpoint/functions/pci-epf-mhi.c
> +++ b/drivers/pci/endpoint/functions/pci-epf-mhi.c
> @@ -102,6 +102,11 @@ struct pci_epf_mhi {
> int irq;
> };
>
> +static size_t get_align_offset(struct pci_epc *epc, u64 addr)
> +{
> + return addr % epc->mem->window.page_size;
> +}
> +
> static int __pci_epf_mhi_alloc_map(struct mhi_ep_cntrl *mhi_cntrl, u64 pci_addr,
> phys_addr_t *paddr, void __iomem **vaddr,
> size_t offset, size_t size)
> @@ -134,7 +139,7 @@ static int pci_epf_mhi_alloc_map(struct mhi_ep_cntrl *mhi_cntrl, u64 pci_addr,
> {
> struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
> struct pci_epc *epc = epf_mhi->epf->epc;
> - size_t offset = pci_addr & (epc->mem->window.page_size - 1);
> + size_t offset = get_align_offset(epc, pci_addr);
>
> return __pci_epf_mhi_alloc_map(mhi_cntrl, pci_addr, paddr, vaddr,
> offset, size);
> @@ -161,7 +166,7 @@ static void pci_epf_mhi_unmap_free(struct mhi_ep_cntrl *mhi_cntrl, u64 pci_addr,
> struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
> struct pci_epf *epf = epf_mhi->epf;
> struct pci_epc *epc = epf->epc;
> - size_t offset = pci_addr & (epc->mem->window.page_size - 1);
> + size_t offset = get_align_offset(epc, pci_addr);
>
> __pci_epf_mhi_unmap_free(mhi_cntrl, pci_addr, paddr, vaddr, offset,
> size);
> @@ -185,7 +190,8 @@ static int pci_epf_mhi_read_from_host(struct mhi_ep_cntrl *mhi_cntrl, u64 from,
> void *to, size_t size)
> {
> struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
> - size_t offset = from % SZ_4K;
> + struct pci_epc *epc = epf_mhi->epf->epc;
> + size_t offset = get_align_offset(epc, from);
> void __iomem *tre_buf;
> phys_addr_t tre_phys;
> int ret;
> @@ -213,7 +219,8 @@ static int pci_epf_mhi_write_to_host(struct mhi_ep_cntrl *mhi_cntrl,
> void *from, u64 to, size_t size)
> {
> struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
> - size_t offset = to % SZ_4K;
> + struct pci_epc *epc = epf_mhi->epf->epc;
> + size_t offset = get_align_offset(epc, to);
> void __iomem *tre_buf;
> phys_addr_t tre_phys;
> int ret;
> --
> 2.25.1
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 2/7] PCI: epf-mhi: Make use of the alignment restriction from EPF core
2023-08-25 22:50 ` Bjorn Helgaas
@ 2023-08-26 14:46 ` Manivannan Sadhasivam
0 siblings, 0 replies; 12+ messages in thread
From: Manivannan Sadhasivam @ 2023-08-26 14:46 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: lpieralisi, kw, kishon, bhelgaas, linux-pci, linux-kernel,
linux-arm-msm
On Fri, Aug 25, 2023 at 05:50:06PM -0500, Bjorn Helgaas wrote:
> On Mon, Jul 17, 2023 at 12:24:54PM +0530, Manivannan Sadhasivam wrote:
> > Instead of hardcoding the alignment restriction in the EPF_MHI driver, make
> > use of the info available from the EPF core that reflects the alignment
> > restriction of the endpoint controller.
> >
> > For this purpose, let's introduce the get_align_offset() static function.
>
> I thought this might be related to the [1/7] patch since they both
> mention an alignment restriction in the EPF core, but [1/7] sets
> pci_epc_features.align and this patch doesn't reference .align, so
> this must be a different alignment restriction?
>
> I'm sure there's nothing wrong here, and this is already applied, so
> no need to do anything unless .align *should* appear here.
>
You are absolutely right! The patch was intented to make use of "align" but
"page_size" was used as per old revision. Even though this patch works (because
both "page_size" and "align" were 4K in my setup), it should be fixed.
I will send a fix up patch now. Thanks for spotting.
- Mani
> > Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
> > ---
> > drivers/pci/endpoint/functions/pci-epf-mhi.c | 15 +++++++++++----
> > 1 file changed, 11 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/pci/endpoint/functions/pci-epf-mhi.c b/drivers/pci/endpoint/functions/pci-epf-mhi.c
> > index 9c1f5a154fbd..bb7de6884824 100644
> > --- a/drivers/pci/endpoint/functions/pci-epf-mhi.c
> > +++ b/drivers/pci/endpoint/functions/pci-epf-mhi.c
> > @@ -102,6 +102,11 @@ struct pci_epf_mhi {
> > int irq;
> > };
> >
> > +static size_t get_align_offset(struct pci_epc *epc, u64 addr)
> > +{
> > + return addr % epc->mem->window.page_size;
> > +}
> > +
> > static int __pci_epf_mhi_alloc_map(struct mhi_ep_cntrl *mhi_cntrl, u64 pci_addr,
> > phys_addr_t *paddr, void __iomem **vaddr,
> > size_t offset, size_t size)
> > @@ -134,7 +139,7 @@ static int pci_epf_mhi_alloc_map(struct mhi_ep_cntrl *mhi_cntrl, u64 pci_addr,
> > {
> > struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
> > struct pci_epc *epc = epf_mhi->epf->epc;
> > - size_t offset = pci_addr & (epc->mem->window.page_size - 1);
> > + size_t offset = get_align_offset(epc, pci_addr);
> >
> > return __pci_epf_mhi_alloc_map(mhi_cntrl, pci_addr, paddr, vaddr,
> > offset, size);
> > @@ -161,7 +166,7 @@ static void pci_epf_mhi_unmap_free(struct mhi_ep_cntrl *mhi_cntrl, u64 pci_addr,
> > struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
> > struct pci_epf *epf = epf_mhi->epf;
> > struct pci_epc *epc = epf->epc;
> > - size_t offset = pci_addr & (epc->mem->window.page_size - 1);
> > + size_t offset = get_align_offset(epc, pci_addr);
> >
> > __pci_epf_mhi_unmap_free(mhi_cntrl, pci_addr, paddr, vaddr, offset,
> > size);
> > @@ -185,7 +190,8 @@ static int pci_epf_mhi_read_from_host(struct mhi_ep_cntrl *mhi_cntrl, u64 from,
> > void *to, size_t size)
> > {
> > struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
> > - size_t offset = from % SZ_4K;
> > + struct pci_epc *epc = epf_mhi->epf->epc;
> > + size_t offset = get_align_offset(epc, from);
> > void __iomem *tre_buf;
> > phys_addr_t tre_phys;
> > int ret;
> > @@ -213,7 +219,8 @@ static int pci_epf_mhi_write_to_host(struct mhi_ep_cntrl *mhi_cntrl,
> > void *from, u64 to, size_t size)
> > {
> > struct pci_epf_mhi *epf_mhi = to_epf_mhi(mhi_cntrl);
> > - size_t offset = to % SZ_4K;
> > + struct pci_epc *epc = epf_mhi->epf->epc;
> > + size_t offset = get_align_offset(epc, to);
> > void __iomem *tre_buf;
> > phys_addr_t tre_phys;
> > int ret;
> > --
> > 2.25.1
> >
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2023-08-26 14:47 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-07-17 6:54 [PATCH v2 0/7] Improvements to Qcom PCIe EP and EPF MHI drivers Manivannan Sadhasivam
2023-07-17 6:54 ` [PATCH v2 1/7] PCI: qcom-ep: Pass alignment restriction to the EPF core Manivannan Sadhasivam
2023-07-17 6:54 ` [PATCH v2 2/7] PCI: epf-mhi: Make use of the alignment restriction from " Manivannan Sadhasivam
2023-08-25 22:50 ` Bjorn Helgaas
2023-08-26 14:46 ` Manivannan Sadhasivam
2023-07-17 6:54 ` [PATCH v2 3/7] PCI: qcom-ep: Add eDMA support Manivannan Sadhasivam
2023-07-17 6:54 ` [PATCH v2 4/7] PCI: epf-mhi: " Manivannan Sadhasivam
2023-07-17 6:54 ` [PATCH v2 5/7] PCI: epf-mhi: Add support for SM8450 Manivannan Sadhasivam
2023-07-17 6:54 ` [PATCH v2 6/7] PCI: epf-mhi: Use iATU for small transfers Manivannan Sadhasivam
2023-07-17 6:54 ` [PATCH v2 7/7] PCI: endpoint: Add kernel-doc for pci_epc_mem_init() API Manivannan Sadhasivam
2023-07-17 7:04 ` Randy Dunlap
2023-08-25 18:28 ` [PATCH v2 0/7] Improvements to Qcom PCIe EP and EPF MHI drivers Krzysztof Wilczyński
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).