From nobody Tue Apr 7 14:39:56 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4A4B2345721 for ; Fri, 13 Mar 2026 06:49:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773384582; cv=none; b=GlXox3UUrU23wrMoSE+AVPt1ircW4rS5HgRS2shAyYe031B7eX1sM9o0H+8UtdGqE2+4y10V6eZBSvKPzl1/TJIz8hTlfvTwHzzUssva0aHirLUvMq7+8CXR4FRZScOuOsGzhfd8sZ8bmQvohmsyhKhW+SPvrnJ9hUrxZLBfLqQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773384582; c=relaxed/simple; bh=faXKEtQyA2DTIzeO2K5IHN8H57kiNXjaxWsjCCelmCg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Y9G56w0+x+KyNKyR5L7A1Ih3rb/RDb54WBTRGpHeZNgcwyfce7bEnw2ndU6emT48gj1tLhbzqqFO7XlQL1gqRQb89Uf4Pv/xK2Sq1TFOcwTY1Mh8xDDIfdWT40PxuSdeP/f6i2X8uZhNaEiwbocuA3FgeCpKHAQ9Bos8Cnk+RqU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=ORo/TkM4; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=kZZowGQ9; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="ORo/TkM4"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="kZZowGQ9" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 62D5tepp3844060 for ; Fri, 13 Mar 2026 06:49:40 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= s5un1i+j/A+PfM8ZiDy+fOOTdwY75I+GuvNvd3FITUY=; b=ORo/TkM4tzI9nn5v 9W2AXPdJ4lpj5mr17kqVoUZirEWO2jJhKdpLjT1M3hd/ZXnYm6+dtznbc+3t5NTm RX3bKGT2XDGMeGZw/iobyKB5NQh5Dh+L5QOnQJgH/DBXyiqFNFWCOKJX3Y8rpJwA NiXcz/rK2xkrW4bwZh7m/AKm8DvBmAzT3okjvkP1rzf94C8cAV6+4J8qBZLMPrPq aMUiZHEsgRspYy3RqkU6TkQ7wRTok7mtdoHw7YhtHp4+rz2Ne5f4ehMbDQRIEO2V EIBHWs4n1pV0FmXMl9RDWvwlJM+oFquXJMTlvp6XQBYPFqX/ZhWila6c2AFan/Ok wOAFCg== Received: from mail-pg1-f200.google.com (mail-pg1-f200.google.com [209.85.215.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4cuh54vst6-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 13 Mar 2026 06:49:40 +0000 (GMT) Received: by mail-pg1-f200.google.com with SMTP id 41be03b00d2f7-c73b1376f98so7574226a12.0 for ; Thu, 12 Mar 2026 23:49:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1773384579; x=1773989379; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=s5un1i+j/A+PfM8ZiDy+fOOTdwY75I+GuvNvd3FITUY=; b=kZZowGQ9HUALrg77NFrYjllw+HCKJR/bK1yr8AhNEQ0fFSFvszb3oDGSfiEZGrtBeW 8hjdFo8kFsX4GDjrc+nZ/JcjGDSVdx6O6R3PQAwR5ozVYz+xSgkgWGHcJE8OiXzg03MN Oioyd5gUmdXoI99lWGRGz4BNPGEei+zJCt6KO50bO3gtVccvOt1pCTcaRVJ8Iwx9AMdB PRnSPOpdMYE2U3HExgUn6BIYDx/2iSLLQ/XwhgbaxZt5CipGxYTr4UhbDfq0BWpdR3KF DPgAQrh/7mAFdafKie/wWXazSY1IeimMW12Em9j49JNHMzgES0OmzMfdbkF1lCpayWU3 5beQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773384579; x=1773989379; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=s5un1i+j/A+PfM8ZiDy+fOOTdwY75I+GuvNvd3FITUY=; b=ppbuuNzEN5q+VWjklXR6IAZiZw72xSx/LcelKh/0Ngb1ePk6sonbgDwOk1KTDkG6x2 4uBdkA2b37PUcqwbVrzdGEpcRs/PuY59xfrZVJZpWvQT/GY3p3YAfj0evFAtPdiNBJFs BEwJPA+JsPxcagmbo5BYpLkVppPuVwlDkT1D6RFUcyqS+Q1YpAWjC1cvnWJeAVcA3t16 Om94RPEp3fgWRdAD1gOV3854WX7IZPUONTRezdJtFZLQSPtV/dcK59+yfTig1to00wTq zq2gLH3FoUMYBg7GyXsEnXHhibZnvD/7Q/xkWn8/93Pgb89g2yaV8xysF92favfBRoLr MHSw== X-Forwarded-Encrypted: i=1; AJvYcCVOPAIjia77S+OOMr7Xwe22P+kDuetWOMDs+/M2adeeycafUBMx6SEa+5wwSu1NSi+jSoy7aymeQYcRuxU=@vger.kernel.org X-Gm-Message-State: AOJu0Yx5nNMYI7nmK9KQfsb+FYagXPbz58sgmh9eWafD5tJqXOay21I9 2ynY2km9SzZLvyAohjbEvZ5vzCFOrARVvAW1N4G84/6FxVSDI8zG0PsEq5mgHMiHG7uZ+McDcVf JDLSQ+szT2sBnTHX5+kZ5dXcDqB2W5jYFZipFiDGCBMZIntz+V/Ozn6m5KWdgY9B4nXM= X-Gm-Gg: ATEYQzx9w027tZ9wfESBLo/oiyfPYtjCjtkhW2SAZ3YBrLeepZZdHZOt1hTHwX4Ivy5 TEvX46IzNwuHA+1dnWeNpSIF8SCLOUbtpuUxR5RikNQstrvfaxRmHkRC9pVYgCurhyoh9eiroq8 WX5jUoH4ppVUH6px/BIEdX2TvzvvGKLzVR/jaYP5SWyVpeDjoPcVyDGoBMnv3JROqXldQQBsGwR TI3qqSplOUGd6TuGooZbzjeZbNtnxKS4G9A3StMCMpVn6cbGTZYJY9NOC24g+shGlV10Ji7xsSb F6K0OB04+8axN9RU/JpChmSX7rWwIpfJlAYns/REIiLF2+bClCBGagMoqh4hNsSwxVyCP0ahDlr Uaj6vqmexOuee7/cxHAO9oC/YksQLGodbrG5WZKCIOZSiJSk= X-Received: by 2002:a05:6a21:a02:b0:398:690c:d027 with SMTP id adf61e73a8af0-398eca8d63amr1820471637.20.1773384579129; Thu, 12 Mar 2026 23:49:39 -0700 (PDT) X-Received: by 2002:a05:6a21:a02:b0:398:690c:d027 with SMTP id adf61e73a8af0-398eca8d63amr1820427637.20.1773384578453; Thu, 12 Mar 2026 23:49:38 -0700 (PDT) Received: from hu-sumk-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c73eb97b41dsm936160a12.5.2026.03.12.23.49.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 23:49:38 -0700 (PDT) From: Sumit Kumar Date: Fri, 13 Mar 2026 12:19:25 +0530 Subject: [PATCH 1/3] dmaengine: Add multi-buffer support in single DMA transfer Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260313-dma_multi_sg-v1-1-8fabb0d1a759@oss.qualcomm.com> References: <20260313-dma_multi_sg-v1-0-8fabb0d1a759@oss.qualcomm.com> In-Reply-To: <20260313-dma_multi_sg-v1-0-8fabb0d1a759@oss.qualcomm.com> To: Krishna Chaitanya Chundru , Veerabhadrarao Badiganti , Subramanian Ananthanarayanan , Akhil Vinod , Manivannan Sadhasivam , Vinod Koul , Marek Szyprowski , Robin Murphy , =?utf-8?q?Krzysztof_Wilczy=C5=84ski?= , Kishon Vijay Abraham I , Bjorn Helgaas Cc: dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, iommu@lists.linux.dev, linux-pci@vger.kernel.org, mhi@lists.linux.dev, linux-arm-msm@vger.kernel.org, Sumit Kumar X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1773384567; l=9280; i=sumit.kumar@oss.qualcomm.com; s=20250409; h=from:subject:message-id; bh=faXKEtQyA2DTIzeO2K5IHN8H57kiNXjaxWsjCCelmCg=; b=0FmZZc/JAoE1+Mfa2hsGxVfxnhTB+AVaGJQyW+ZM+3JrDVVfrBNthZHWxcgnHjHuvN0gj/K95 fSvQY9POy+7D0vKMz+GlCBIbKjdamtZXNFy8fvYEfHIftDQYdK/lYja X-Developer-Key: i=sumit.kumar@oss.qualcomm.com; a=ed25519; pk=3cys6srXqLACgA68n7n7KjDeM9JiMK1w6VxzMxr0dnM= X-Proofpoint-GUID: 8vpIwCnTu9Icaay9bstAu19yhmur4mvF X-Authority-Analysis: v=2.4 cv=BNG+bVQG c=1 sm=1 tr=0 ts=69b3b384 cx=c_pps a=oF/VQ+ItUULfLr/lQ2/icg==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=3WHJM1ZQz_JShphwDgj5:22 a=EUspDBNiAAAA:8 a=WV2dQidlXXH6c0LHWD8A:9 a=QEXdDO2ut3YA:10 a=3WC7DwWrALyhR5TkjVHa:22 X-Proofpoint-ORIG-GUID: 8vpIwCnTu9Icaay9bstAu19yhmur4mvF X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzEzMDA1MiBTYWx0ZWRfX54CWOyrxM5Hm v3oH+UHE2O26kY4AjVM2LgLViSJpZwNQaj/DHMfcqQcVGIpTg1lGZyQSr4QnhcnxkEqz9pE4Fhq py+B2wl6Er5/k2ysQ9mNrtDDJeIZMO1A14ZzGolhxXpElkKlrT9wY8QOQWOKLdORGpQjm0phu9O BjC26CmWGQG1NoT6nvoFgNBz7eVInIQLyt2FlwRYBNz2gxv6AReNf8vNQRk8J7fvNTMlDkKAdle XS5MJrrieH6fDzWTnWS31sPIaO2IL0JLBOvCkD3HNp4u2uPAyQu/KD0ThGy4gSurFIziv11Yl5S WC3aTgWhpjnh7Lc8mhUh/mlslIbkSW09fxc1gSnUN9et9LkesBj916mSYHyC2hgzvE4US1CAqBf 7aoS7JZeLvggHaeIhl2yKgivT8IBOdDewpCpZEAM8W1lmFkEBn5SvwwDoWTAcSHV0x5UGWHa+L3 Utqh0e66Gp16SnZMcLg== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-03-13_01,2026-03-12_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 clxscore=1015 bulkscore=0 lowpriorityscore=0 malwarescore=0 priorityscore=1501 impostorscore=0 adultscore=0 phishscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2603130052 Add dmaengine_prep_batch_sg API for batching multiple independent buffers in a single DMA transaction. Each scatter-gather entry specifies both source and destination addresses. This allows multiple non-contiguous memory regions to be transferred in a single DMA transaction instead of separate operations, significantly reducing submission overhead and interrupt overhead. Extends struct scatterlist with optional dma_dst_address field and implements support in dw-edma driver. Signed-off-by: Sumit Kumar --- drivers/dma/dw-edma/Kconfig | 1 + drivers/dma/dw-edma/dw-edma-core.c | 40 ++++++++++++++++++++++++++++++++++= ---- drivers/dma/dw-edma/dw-edma-core.h | 3 ++- include/linux/dmaengine.h | 29 ++++++++++++++++++++++++++- include/linux/scatterlist.h | 7 +++++++ kernel/dma/Kconfig | 3 +++ 6 files changed, 77 insertions(+), 6 deletions(-) diff --git a/drivers/dma/dw-edma/Kconfig b/drivers/dma/dw-edma/Kconfig index 2b6f2679508d93b94b7efecd4e36d5902f7b4c99..0472a6554ff38d4cf172a90b6bf= 0bdaa9e7f4b95 100644 --- a/drivers/dma/dw-edma/Kconfig +++ b/drivers/dma/dw-edma/Kconfig @@ -5,6 +5,7 @@ config DW_EDMA depends on PCI && PCI_MSI select DMA_ENGINE select DMA_VIRTUAL_CHANNELS + select NEED_SG_DMA_DST_ADDR help Support the Synopsys DesignWare eDMA controller, normally implemented on endpoints SoCs. diff --git a/drivers/dma/dw-edma/dw-edma-core.c b/drivers/dma/dw-edma/dw-ed= ma-core.c index 8e5f7defa6b678eefe0f312ebc59f654677c744f..04314cfd82edbed6ed3665eb4c8= e6b428339c207 100644 --- a/drivers/dma/dw-edma/dw-edma-core.c +++ b/drivers/dma/dw-edma/dw-edma-core.c @@ -411,6 +411,9 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer) return NULL; if (!xfer->xfer.il->src_inc || !xfer->xfer.il->dst_inc) return NULL; + } else if (xfer->type =3D=3D EDMA_XFER_DUAL_ADDR_SG) { + if (xfer->xfer.sg.len < 1) + return NULL; } else { return NULL; } @@ -438,7 +441,7 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer) =20 if (xfer->type =3D=3D EDMA_XFER_CYCLIC) { cnt =3D xfer->xfer.cyclic.cnt; - } else if (xfer->type =3D=3D EDMA_XFER_SCATTER_GATHER) { + } else if (xfer->type =3D=3D EDMA_XFER_SCATTER_GATHER || xfer->type =3D= =3D EDMA_XFER_DUAL_ADDR_SG) { cnt =3D xfer->xfer.sg.len; sg =3D xfer->xfer.sg.sgl; } else if (xfer->type =3D=3D EDMA_XFER_INTERLEAVED) { @@ -447,7 +450,8 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer) } =20 for (i =3D 0; i < cnt; i++) { - if (xfer->type =3D=3D EDMA_XFER_SCATTER_GATHER && !sg) + if ((xfer->type =3D=3D EDMA_XFER_SCATTER_GATHER || + xfer->type =3D=3D EDMA_XFER_DUAL_ADDR_SG) && !sg) break; =20 if (chunk->bursts_alloc =3D=3D chan->ll_max) { @@ -462,7 +466,8 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer) =20 if (xfer->type =3D=3D EDMA_XFER_CYCLIC) burst->sz =3D xfer->xfer.cyclic.len; - else if (xfer->type =3D=3D EDMA_XFER_SCATTER_GATHER) + else if (xfer->type =3D=3D EDMA_XFER_SCATTER_GATHER || + xfer->type =3D=3D EDMA_XFER_DUAL_ADDR_SG) burst->sz =3D sg_dma_len(sg); else if (xfer->type =3D=3D EDMA_XFER_INTERLEAVED) burst->sz =3D xfer->xfer.il->sgl[i % fsz].size; @@ -486,6 +491,9 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer) */ } else if (xfer->type =3D=3D EDMA_XFER_INTERLEAVED) { burst->dar =3D dst_addr; + } else if (xfer->type =3D=3D EDMA_XFER_DUAL_ADDR_SG) { + burst->sar =3D dw_edma_get_pci_address(chan, sg_dma_address(sg)); + burst->dar =3D sg_dma_dst_address(sg); } } else { burst->dar =3D dst_addr; @@ -503,10 +511,14 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer) */ } else if (xfer->type =3D=3D EDMA_XFER_INTERLEAVED) { burst->sar =3D src_addr; + } else if (xfer->type =3D=3D EDMA_XFER_DUAL_ADDR_SG) { + burst->sar =3D sg_dma_address(sg); + burst->dar =3D dw_edma_get_pci_address(chan, sg_dma_dst_address(sg)); } } =20 - if (xfer->type =3D=3D EDMA_XFER_SCATTER_GATHER) { + if (xfer->type =3D=3D EDMA_XFER_SCATTER_GATHER || + xfer->type =3D=3D EDMA_XFER_DUAL_ADDR_SG) { sg =3D sg_next(sg); } else if (xfer->type =3D=3D EDMA_XFER_INTERLEAVED) { struct dma_interleaved_template *il =3D xfer->xfer.il; @@ -603,6 +615,25 @@ static void dw_hdma_set_callback_result(struct virt_dm= a_desc *vd, res->residue =3D residue; } =20 +static struct dma_async_tx_descriptor * +dw_edma_device_prep_batch_sg_dma(struct dma_chan *dchan, + struct scatterlist *sg, + unsigned int nents, + enum dma_transfer_direction direction, + unsigned long flags) +{ + struct dw_edma_transfer xfer; + + xfer.dchan =3D dchan; + xfer.direction =3D direction; + xfer.xfer.sg.sgl =3D sg; + xfer.xfer.sg.len =3D nents; + xfer.flags =3D flags; + xfer.type =3D EDMA_XFER_DUAL_ADDR_SG; + + return dw_edma_device_transfer(&xfer); +} + static void dw_edma_done_interrupt(struct dw_edma_chan *chan) { struct dw_edma_desc *desc; @@ -818,6 +849,7 @@ static int dw_edma_channel_setup(struct dw_edma *dw, u3= 2 wr_alloc, u32 rd_alloc) dma->device_prep_slave_sg =3D dw_edma_device_prep_slave_sg; dma->device_prep_dma_cyclic =3D dw_edma_device_prep_dma_cyclic; dma->device_prep_interleaved_dma =3D dw_edma_device_prep_interleaved_dma; + dma->device_prep_batch_sg_dma =3D dw_edma_device_prep_batch_sg_dma; =20 dma_set_max_seg_size(dma->dev, U32_MAX); =20 diff --git a/drivers/dma/dw-edma/dw-edma-core.h b/drivers/dma/dw-edma/dw-ed= ma-core.h index 71894b9e0b1539c636171738963e80a0a5ef43a4..1a266dc58315edb3d5fd9eddb19= fc350f1ed9a1b 100644 --- a/drivers/dma/dw-edma/dw-edma-core.h +++ b/drivers/dma/dw-edma/dw-edma-core.h @@ -36,7 +36,8 @@ enum dw_edma_status { enum dw_edma_xfer_type { EDMA_XFER_SCATTER_GATHER =3D 0, EDMA_XFER_CYCLIC, - EDMA_XFER_INTERLEAVED + EDMA_XFER_INTERLEAVED, + EDMA_XFER_DUAL_ADDR_SG, }; =20 struct dw_edma_chan; diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h index 99efe2b9b4ea9844ca6161208362ef18ef111d96..fdba75b5c40f805904a6697fce3= 062303fea762a 100644 --- a/include/linux/dmaengine.h +++ b/include/linux/dmaengine.h @@ -939,7 +939,11 @@ struct dma_device { size_t period_len, enum dma_transfer_direction direction, unsigned long flags); struct dma_async_tx_descriptor *(*device_prep_interleaved_dma)( - struct dma_chan *chan, struct dma_interleaved_template *xt, + struct dma_chan *chan, struct dma_interleaved_template *xt, + unsigned long flags); + struct dma_async_tx_descriptor *(*device_prep_batch_sg_dma) + (struct dma_chan *chan, struct scatterlist *sg, unsigned int nents, + enum dma_transfer_direction direction, unsigned long flags); =20 void (*device_caps)(struct dma_chan *chan, struct dma_slave_caps *caps); @@ -1060,6 +1064,29 @@ static inline struct dma_async_tx_descriptor *dmaeng= ine_prep_interleaved_dma( return chan->device->device_prep_interleaved_dma(chan, xt, flags); } =20 +/** + * dmaengine_prep_batch_sg_dma() - Prepare single DMA transfer for multipl= e independent buffers. + * @chan: DMA channel + * @sg: Scatter-gather list with both source (dma_address) and destination= (dma_dst_address) + * @nents: Number of entries in the list + * @direction: Transfer direction (DMA_MEM_TO_MEM, DMA_DEV_TO_MEM, DMA_MEM= _TO_DEV) + * @flags: DMA engine flags + * + * Each SG entry contains both source (sg_dma_address) and destination (sg= _dma_dst_address). + * This allows multiple independent transfers in a single DMA transaction. + * Requires CONFIG_NEED_SG_DMA_DST_ADDR to be enabled. + */ +static inline struct dma_async_tx_descriptor *dmaengine_prep_batch_sg_dma + (struct dma_chan *chan, struct scatterlist *sg, unsigned int nents, + enum dma_transfer_direction direction, unsigned long flags) +{ + if (!chan || !chan->device || !chan->device->device_prep_batch_sg_dma || + !sg || !nents) + return NULL; + + return chan->device->device_prep_batch_sg_dma(chan, sg, nents, direction,= flags); +} + /** * dmaengine_prep_dma_memset() - Prepare a DMA memset descriptor. * @chan: The channel to be used for this descriptor diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h index 29f6ceb98d74b118d08b6a3d4eb7f62dcde0495d..20b65ffcd5e2a65ec5026a29344= caf6baa09700b 100644 --- a/include/linux/scatterlist.h +++ b/include/linux/scatterlist.h @@ -19,6 +19,9 @@ struct scatterlist { #ifdef CONFIG_NEED_SG_DMA_FLAGS unsigned int dma_flags; #endif +#ifdef CONFIG_NEED_SG_DMA_DST_ADDR + dma_addr_t dma_dst_address; +#endif }; =20 /* @@ -36,6 +39,10 @@ struct scatterlist { #define sg_dma_len(sg) ((sg)->length) #endif =20 +#ifdef CONFIG_NEED_SG_DMA_DST_ADDR +#define sg_dma_dst_address(sg) ((sg)->dma_dst_address) +#endif + struct sg_table { struct scatterlist *sgl; /* the list */ unsigned int nents; /* number of mapped entries */ diff --git a/kernel/dma/Kconfig b/kernel/dma/Kconfig index 31cfdb6b4bc3e33c239111955d97b3ec160baafa..3539b5b1efe27be7ccbfebb358d= bb9cad2868f11 100644 --- a/kernel/dma/Kconfig +++ b/kernel/dma/Kconfig @@ -32,6 +32,9 @@ config NEED_SG_DMA_LENGTH config NEED_DMA_MAP_STATE bool =20 +config NEED_SG_DMA_DST_ADDR + bool + config ARCH_DMA_ADDR_T_64BIT def_bool 64BIT || PHYS_ADDR_T_64BIT =20 --=20 2.34.1