From nobody Wed Apr 8 04:41:20 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.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 690293A542C for ; Tue, 10 Mar 2026 15:44:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773157501; cv=none; b=RuKX4wcZpclkra6EcYhRKFZSx/uIKpCHY7BAIWVUgXoyYNMO2wNQiMLGL7YwsGWDCvUARz3goJAeOLAj5fhvR/bAtLMkqG93l9yFWGmUZS8zfirbq4LN+kqKPeZwGjPlNQ7nXGwsJNhPvs+AQy4oaQF0L8/0mag88AG4jfJ/Aqo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773157501; c=relaxed/simple; bh=elhTKwJOdnH8ShS2ww0C9I/XZ+2m164JUZdN202a2VI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Dn1oxeSLI+bZ532p0TmE7QY7efLFYNFrs8t09N9LwF5liA2/m+6EjXYb06HvyROQIVFgyEpy0LI93hluQOa0NImc1suy4fxCiMJfAXGKvhFHHnqhT10MCwVsKwC6PeAIxEXwxlPFBiX/BK6A66PRljWhcFOvy1NIkrsMUCygo0k= 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=gVAbF12O; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=F2xV0JS/; arc=none smtp.client-ip=205.220.168.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="gVAbF12O"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="F2xV0JS/" Received: from pps.filterd (m0279864.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 62ACam1x790143 for ; Tue, 10 Mar 2026 15:44:58 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= KN20Si9oKhQSEQiwsnBiXWUeYCUJsC5pN0vFqnC/K4I=; b=gVAbF12OUhHS7c/R uqCr7/dhqU2UW+QqLngu0W0ZTlEYZJ7ES5xJffCjn3OrGpcz7lkb0gOAj0Ie/NV+ QdlcmojHhxXMOna2d3Nxeh847KAe1v1QE9XK5YDFVxrmtiPXpIruds2zAczlIZVc uido0z4zoV7XeiQ0BAIlWC4eTy7uFcjVUMF5KVxcClJQG9Q3lhe2Skt046LYH/Nv ctj508B4nIAjReoPdTeTRlyFPgM4s9ZEEuSkSsjEwQ4Abs27T/TXEyUVCMpIF+g6 V5PYE/dml0eJMlEJEhWXXT8Ec7UqNy87rZ9Wr32s79vcKxPiO1XLb5Z+qk1BhsxR ECOUJg== Received: from mail-qk1-f199.google.com (mail-qk1-f199.google.com [209.85.222.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ct1ekvkne-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 10 Mar 2026 15:44:57 +0000 (GMT) Received: by mail-qk1-f199.google.com with SMTP id af79cd13be357-8cd781c0d90so1653549885a.1 for ; Tue, 10 Mar 2026 08:44:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1773157497; x=1773762297; 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=KN20Si9oKhQSEQiwsnBiXWUeYCUJsC5pN0vFqnC/K4I=; b=F2xV0JS/pntSg5KuY5li5lT+F0ynCWAk/g7aDTfprcjlgdW2AlmOOv6fwisQ1o5eQz kYGL/KAHMEZo8qHgIWuBb20GM3JN6HhxnAISKHI6GSMYRhvNQVduLHnrcE8BnHVnLONx 5LSr5hSWBhPilqdSXDBk3UYY+g4sQD8BinjTQSu56xzCz/RGYbaXA1Jxoc7IqLEKaqki I0lUVt/d5+ELTQH+zeKrCcTV4Akw80ZoYEt9xC+W3H+S26qyNFX0iea8WoBse3Bb98uw AI5i/UssRUj7KRXHqyndKYeNMLbaM0h+YIw/jIqB5cLz9u/5HP35aA1o/R1Dd8L3ZJBs TAwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773157497; x=1773762297; 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=KN20Si9oKhQSEQiwsnBiXWUeYCUJsC5pN0vFqnC/K4I=; b=DpwI/8x/FMI6yV+BjyC/SELttDVUTaTreTltenST0WCnaVJHzEDDMW4YB4UCp5eSPz Z05OaTIV914lw9LYf35duKGjQYIU/0gS7+Jit6rtGI0rq3ZUgMjTXFj6CVNZ//SRNFtN vyvIAfuaN7mhIsfM7YAS9MBcvsqC1hlaowocQCc0ETn8WA4MEpD6oS2jcpllibU0fhRK a7oinDrCPVeviokSh8sbTBq4267JXx1aZTge94KoBkX45m0cd9tKaDXbFiucEHNtzvx9 xYnkRbvhuYtl59pOR0exCL/vZnIRuClOns55dLXm6xXrkoB0ZzjgtJ5yaQTEkfu6nHQN BaAw== X-Forwarded-Encrypted: i=1; AJvYcCWPwrcSI5s/HCt1BEFDC4b3spVZ9Ydkedh6f6H/mHns8oEZwx1/bD1X98qP18LkYGgm4P1VgUnkNMPOy6A=@vger.kernel.org X-Gm-Message-State: AOJu0YzH5u+OQ864SRvuMnykJ1fjh1A84k5ldulVyUVyv5F9cKD+cjVh Wq4rWoAd8KgvEIkR831cPwRLx1RMfRu3DBXNk/zUvwvli8+HPbsXuLXzAOMw/wxosCwVjatm2sY JeJny6rgSzfSezr2xGnD+vpxe47sfpEHSFaczuzEg45yExoFgBFIpfIBuZXFAoIwJQEg= X-Gm-Gg: ATEYQzwuemEAOkdn5FREg3EiQbYA2i6KXnJIh2e5zPqIpFRRnC+JCwoYUedPguTEZKo 5oqLrBFnHUqw8rZhoufiam5OAknr4hehiEnuuofqyN/KV6uGguTR15fKOBbQjt/aBnmAARjQY5O gNN9ukMAcSXX5zxKMEK7rh5QQdPmaCFLKxdmwRcmW32y7GGeN4URqEEeF+WYsqiI26NyQ3E3hh2 lxPmuodpwA9OhDTdp+nk8T6clvlOegvUzhLSfIdZwkpNsCNVbzCxblqVpe2EHTK9mUlxE6riRVU 5z3FocnPu2IxmQPr44mKFdZRpwMi6EVoxF0WVjL7EzMkh/yxjAcMTkvzUxcLAqBPKWvSK1K9xPr uiC0R1XTiV7pnEjN4Nm8zsJPUx2BxMb1JZu2TcPYbwDFJS+YAOm6Q X-Received: by 2002:a05:620a:890b:b0:8cd:9584:6340 with SMTP id af79cd13be357-8cd95847345mr17426285a.43.1773157496061; Tue, 10 Mar 2026 08:44:56 -0700 (PDT) X-Received: by 2002:a05:620a:890b:b0:8cd:9584:6340 with SMTP id af79cd13be357-8cd95847345mr17419585a.43.1773157494902; Tue, 10 Mar 2026 08:44:54 -0700 (PDT) Received: from brgl-qcom.local ([2a01:cb1d:dc:7e00:47e6:5a62:7ef7:9a28]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439dad8d968sm35991600f8f.6.2026.03.10.08.44.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Mar 2026 08:44:54 -0700 (PDT) From: Bartosz Golaszewski Date: Tue, 10 Mar 2026 16:44:19 +0100 Subject: [PATCH v12 05/12] dmaengine: qcom: bam_dma: add support for BAM locking 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: <20260310-qcom-qce-cmd-descr-v12-5-398f37f26ef0@oss.qualcomm.com> References: <20260310-qcom-qce-cmd-descr-v12-0-398f37f26ef0@oss.qualcomm.com> In-Reply-To: <20260310-qcom-qce-cmd-descr-v12-0-398f37f26ef0@oss.qualcomm.com> To: Vinod Koul , Jonathan Corbet , Thara Gopinath , Herbert Xu , "David S. Miller" , Udit Tiwari , Daniel Perez-Zoghbi , Md Sadre Alam , Dmitry Baryshkov , Peter Ujfalusi , Michal Simek , Frank Li Cc: dmaengine@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-crypto@vger.kernel.org, linux-arm-kernel@lists.infradead.org, brgl@kernel.org, Bartosz Golaszewski , Bartosz Golaszewski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=9496; i=bartosz.golaszewski@oss.qualcomm.com; h=from:subject:message-id; bh=elhTKwJOdnH8ShS2ww0C9I/XZ+2m164JUZdN202a2VI=; b=owEBbQKS/ZANAwAKAQWdLsv/NoTDAcsmYgBpsDxk9TY6tPxiPsXw43Ve+PSIj4tq2H5V4JJJb yw1r7r9dzWJAjMEAAEKAB0WIQSR5RMt5bVGHXuiZfwFnS7L/zaEwwUCabA8ZAAKCRAFnS7L/zaE w4x0EACxKbLwWH0BU1Begt8G28jzTGiJxEdXChvYM2Vr4aOS+ELPeSH22pJI6xxN46I8AvnwT9e xkONLqCR3ucI/p3eI6zeAbogxfPibrQKr2wlfGSOz6U6ILPwz4A+1KHOFlSQZBwSr+yxIehYeJL RNgWeQWMNMl/sbDf3QPr7sfyzAU8N1csgNyQLY3OeceiuJJvIqcrtqa15I9RXRg3j2fE7t0Qhn4 8DtbpfMnAS1/uIyNKGSV2Vy4I81xyJQ+G03K8OsSe7cb6blFiupG/eX7I8iVmkvFIDQPtcalYPV WAww8lwySoQThKBHS7xChrEfqnTIuGtdUPYWtogcH/VSn+CI7OIT0ntZHC4OazxBctlh0aDt8wU tx7vFhWXCbefEFUeUtUlC9+vDkD34YvqPcnODKsDPn2B5akFGemLqVoqpZ6IzsUPlVO59Rqc61w O9VBSCXHVJmyAaNIsO2+/QO/cxHdGwEBkqrb4nyUKGKaoy2VUwlxHFAtS+rs/5s0WP/JnyXdYQh WgyNnW+UkJiAuVBJp9EpfTkhb3Jwa9JQoRMlxpnvepO2GLf5R5Esx6UAMWoeqz0EQFD8MREMMVL eD9bZWyqkS97qe+1SHhhfczOHegXdXi7uMIa1m4PPQzZ4GLD099CqVo7qLwT7kpHVDvtibkN4ZK 7gaNLWok5bCpXJQ== X-Developer-Key: i=bartosz.golaszewski@oss.qualcomm.com; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 X-Proofpoint-GUID: s0o4_f88GZvarykVax9Y_aCDryRszRU9 X-Proofpoint-ORIG-GUID: s0o4_f88GZvarykVax9Y_aCDryRszRU9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzEwMDEzNyBTYWx0ZWRfX8/KFYNe7nAFy yclxsbzT02S3kqkq2uk8elB7Pl04tpxBOPBOKGlLFqEi1kT9lO2PNDglFEZaZdALX1V9UjhTvBt 46ievKDk0oK8wjkDO1uu5nRCa+rGszsCmUS6hwI1mRqdVSVqfXTFSJmKc7RyALFRVW7wTqcOKpG /2cSSBsTODVntobw+05j2mVj7wvQYtQHqHHhce22PrEFNg1Ha7z6+kZST7Zje7jCVVUA8ZwJr+g m3EOVVbjKT1JmT6dy6MV9xbTjh5U+sNjbgzwjrD28ynFvIhqd78mmezhY5KaNAvbjvxdam+TofH loIg3uYs6DAFuZ8451GroSvtax6KraSTCSBZhz4O9VMsTI4eBoYkFJKU9zwyi/jUpa+6+8GQbZ+ yACIpdQr0NJzlH+HO7XqIRCBYtiD6I9TfsJZ54juLeHtNmk6CJTe+GXkCuiqdcZnnqen43XQItL hFPDkut3CKPLT8hehJw== X-Authority-Analysis: v=2.4 cv=eIEeTXp1 c=1 sm=1 tr=0 ts=69b03c79 cx=c_pps a=HLyN3IcIa5EE8TELMZ618Q==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=DJpcGTmdVt4CTyJn9g5Z:22 a=EUspDBNiAAAA:8 a=qJbEDo8Lr3yLsC1F8HwA:9 a=QEXdDO2ut3YA:10 a=bTQJ7kPSJx9SKPbeHEYW:22 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-10_03,2026-03-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 bulkscore=0 lowpriorityscore=0 adultscore=0 suspectscore=0 spamscore=0 priorityscore=1501 malwarescore=0 clxscore=1015 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2602130000 definitions=main-2603100137 Add support for BAM pipe locking. To that end: when starting DMA on an RX channel - prepend the existing queue of issued descriptors with an additional "dummy" command descriptor with the LOCK bit set. Once the transaction is done (no more issued descriptors), issue one more dummy descriptor with the UNLOCK bit. We *must* wait until the transaction is signalled as done because we must not perform any writes into config registers while the engine is busy. The dummy writes must be issued into a scratchpad register of the client so provide a mechanism to communicate the right address via descriptor metadata. Signed-off-by: Bartosz Golaszewski --- drivers/dma/qcom/bam_dma.c | 175 +++++++++++++++++++++++++++++++++++= +++- include/linux/dma/qcom_bam_dma.h | 4 + 2 files changed, 176 insertions(+), 3 deletions(-) diff --git a/drivers/dma/qcom/bam_dma.c b/drivers/dma/qcom/bam_dma.c index 83491e7c2f17d8c9d12a1a055baea7e3a0a75a53..627c85a2df4dcdbac247d831a4a= ef047c2189456 100644 --- a/drivers/dma/qcom/bam_dma.c +++ b/drivers/dma/qcom/bam_dma.c @@ -28,11 +28,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -60,6 +62,8 @@ struct bam_desc_hw { #define DESC_FLAG_EOB BIT(13) #define DESC_FLAG_NWD BIT(12) #define DESC_FLAG_CMD BIT(11) +#define DESC_FLAG_LOCK BIT(10) +#define DESC_FLAG_UNLOCK BIT(9) =20 struct bam_async_desc { struct virt_dma_desc vd; @@ -391,6 +395,14 @@ struct bam_chan { struct list_head desc_list; =20 struct list_head node; + + /* BAM locking infrastructure */ + bool locked; + phys_addr_t scratchpad_addr; + struct scatterlist lock_sg; + struct scatterlist unlock_sg; + struct bam_cmd_element lock_ce; + struct bam_cmd_element unlock_ce; }; =20 static inline struct bam_chan *to_bam_chan(struct dma_chan *common) @@ -652,6 +664,27 @@ static int bam_slave_config(struct dma_chan *chan, return 0; } =20 +static int bam_metadata_attach(struct dma_async_tx_descriptor *desc, void = *data, size_t len) +{ + struct bam_chan *bchan =3D to_bam_chan(desc->chan); + const struct bam_device_data *bdata =3D bchan->bdev->dev_data; + struct bam_desc_metadata *metadata =3D data; + + if (!data) + return -EINVAL; + + if (!bdata->pipe_lock_supported) + return -EOPNOTSUPP; + + bchan->scratchpad_addr =3D metadata->scratchpad_addr; + + return 0; +} + +static const struct dma_descriptor_metadata_ops bam_metadata_ops =3D { + .attach =3D bam_metadata_attach, +}; + /** * bam_prep_slave_sg - Prep slave sg transaction * @@ -668,6 +701,7 @@ static struct dma_async_tx_descriptor *bam_prep_slave_s= g(struct dma_chan *chan, void *context) { struct bam_chan *bchan =3D to_bam_chan(chan); + struct dma_async_tx_descriptor *tx_desc; struct bam_device *bdev =3D bchan->bdev; struct bam_async_desc *async_desc; struct scatterlist *sg; @@ -723,7 +757,12 @@ static struct dma_async_tx_descriptor *bam_prep_slave_= sg(struct dma_chan *chan, } while (remainder > 0); } =20 - return vchan_tx_prep(&bchan->vc, &async_desc->vd, flags); + tx_desc =3D vchan_tx_prep(&bchan->vc, &async_desc->vd, flags); + if (!tx_desc) + return NULL; + + tx_desc->metadata_ops =3D &bam_metadata_ops; + return tx_desc; } =20 /** @@ -1012,6 +1051,112 @@ static void bam_apply_new_config(struct bam_chan *b= chan, bchan->reconfigure =3D 0; } =20 +static struct bam_async_desc * +bam_make_lock_desc(struct bam_chan *bchan, struct scatterlist *sg, + struct bam_cmd_element *ce, unsigned long flag) +{ + struct dma_chan *chan =3D &bchan->vc.chan; + struct bam_async_desc *async_desc; + struct bam_desc_hw *desc; + struct virt_dma_desc *vd; + struct virt_dma_chan *vc; + unsigned int mapped; + dma_cookie_t cookie; + int ret; + + sg_init_table(sg, 1); + + async_desc =3D kzalloc_flex(*async_desc, desc, 1, GFP_NOWAIT); + if (!async_desc) { + dev_err(bchan->bdev->dev, "failed to allocate the BAM lock descriptor\n"= ); + return NULL; + } + + async_desc->num_desc =3D 1; + async_desc->curr_desc =3D async_desc->desc; + async_desc->dir =3D DMA_MEM_TO_DEV; + + desc =3D async_desc->desc; + + bam_prep_ce_le32(ce, bchan->scratchpad_addr, BAM_WRITE_COMMAND, 0); + sg_set_buf(sg, ce, sizeof(*ce)); + + mapped =3D dma_map_sg_attrs(chan->slave, sg, 1, DMA_TO_DEVICE, DMA_PREP_C= MD); + if (!mapped) { + kfree(async_desc); + return NULL; + } + + desc->flags |=3D cpu_to_le16(DESC_FLAG_CMD | flag); + desc->addr =3D sg_dma_address(sg); + desc->size =3D sizeof(struct bam_cmd_element); + + vc =3D &bchan->vc; + vd =3D &async_desc->vd; + + dma_async_tx_descriptor_init(&vd->tx, &vc->chan); + vd->tx.flags =3D DMA_PREP_CMD; + vd->tx.desc_free =3D vchan_tx_desc_free; + vd->tx_result.result =3D DMA_TRANS_NOERROR; + vd->tx_result.residue =3D 0; + + cookie =3D dma_cookie_assign(&vd->tx); + ret =3D dma_submit_error(cookie); + if (ret) + return NULL; + + return async_desc; +} + +static int bam_do_setup_pipe_lock(struct bam_chan *bchan, bool lock) +{ + struct bam_device *bdev =3D bchan->bdev; + const struct bam_device_data *bdata =3D bdev->dev_data; + struct bam_async_desc *lock_desc; + struct bam_cmd_element *ce; + struct scatterlist *sgl; + unsigned long flag; + + lockdep_assert_held(&bchan->vc.lock); + + if (!bdata->pipe_lock_supported || !bchan->scratchpad_addr || + bchan->slave.direction !=3D DMA_MEM_TO_DEV) + return 0; + + if (lock) { + sgl =3D &bchan->lock_sg; + ce =3D &bchan->lock_ce; + flag =3D DESC_FLAG_LOCK; + } else { + sgl =3D &bchan->unlock_sg; + ce =3D &bchan->unlock_ce; + flag =3D DESC_FLAG_UNLOCK; + } + + lock_desc =3D bam_make_lock_desc(bchan, sgl, ce, flag); + if (!lock_desc) + return -ENOMEM; + + if (lock) + list_add(&lock_desc->vd.node, &bchan->vc.desc_issued); + else + list_add_tail(&lock_desc->vd.node, &bchan->vc.desc_issued); + + bchan->locked =3D lock; + + return 0; +} + +static int bam_setup_pipe_lock(struct bam_chan *bchan) +{ + return bam_do_setup_pipe_lock(bchan, true); +} + +static int bam_setup_pipe_unlock(struct bam_chan *bchan) +{ + return bam_do_setup_pipe_lock(bchan, false); +} + /** * bam_start_dma - start next transaction * @bchan: bam dma channel @@ -1121,6 +1266,7 @@ static void bam_dma_work(struct work_struct *work) struct bam_device *bdev =3D from_work(bdev, work, work); struct bam_chan *bchan; unsigned int i; + int ret; =20 /* go through the channels and kick off transactions */ for (i =3D 0; i < bdev->num_channels; i++) { @@ -1128,6 +1274,13 @@ static void bam_dma_work(struct work_struct *work) =20 guard(spinlock_irqsave)(&bchan->vc.lock); =20 + if (list_empty(&bchan->vc.desc_issued) && bchan->locked) { + ret =3D bam_setup_pipe_unlock(bchan); + if (ret) + dev_err(bchan->vc.chan.slave, + "Failed to set up the pipe unlock descriptor\n"); + } + if (!list_empty(&bchan->vc.desc_issued) && !IS_BUSY(bchan)) bam_start_dma(bchan); } @@ -1142,9 +1295,17 @@ static void bam_dma_work(struct work_struct *work) static void bam_issue_pending(struct dma_chan *chan) { struct bam_chan *bchan =3D to_bam_chan(chan); + int ret; =20 guard(spinlock_irqsave)(&bchan->vc.lock); =20 + if (!bchan->locked) { + ret =3D bam_setup_pipe_lock(bchan); + if (ret) + dev_err(bchan->vc.chan.slave, + "Failed to set up the pipe lock descriptor\n"); + } + /* if work pending and idle, start a transaction */ if (vchan_issue_pending(&bchan->vc) && !IS_BUSY(bchan)) bam_start_dma(bchan); @@ -1157,8 +1318,15 @@ static void bam_issue_pending(struct dma_chan *chan) */ static void bam_dma_free_desc(struct virt_dma_desc *vd) { - struct bam_async_desc *async_desc =3D container_of(vd, - struct bam_async_desc, vd); + struct bam_async_desc *async_desc =3D container_of(vd, struct bam_async_d= esc, vd); + struct bam_desc_hw *desc =3D async_desc->desc; + struct dma_chan *chan =3D vd->tx.chan; + struct bam_chan *bchan =3D to_bam_chan(chan); + + if (le16_to_cpu(desc->flags) & DESC_FLAG_LOCK) + dma_unmap_sg(chan->slave, &bchan->lock_sg, 1, DMA_TO_DEVICE); + else if (le16_to_cpu(desc->flags) & DESC_FLAG_UNLOCK) + dma_unmap_sg(chan->slave, &bchan->unlock_sg, 1, DMA_TO_DEVICE); =20 kfree(async_desc); } @@ -1350,6 +1518,7 @@ static int bam_dma_probe(struct platform_device *pdev) bdev->common.device_terminate_all =3D bam_dma_terminate_all; bdev->common.device_issue_pending =3D bam_issue_pending; bdev->common.device_tx_status =3D bam_tx_status; + bdev->common.desc_metadata_modes =3D DESC_METADATA_CLIENT; bdev->common.dev =3D bdev->dev; =20 ret =3D dma_async_device_register(&bdev->common); diff --git a/include/linux/dma/qcom_bam_dma.h b/include/linux/dma/qcom_bam_= dma.h index 68fc0e643b1b97fe4520d5878daa322b81f4f559..f85e0c72407b5e1a733750ac87b= baba6af6e8c78 100644 --- a/include/linux/dma/qcom_bam_dma.h +++ b/include/linux/dma/qcom_bam_dma.h @@ -34,6 +34,10 @@ enum bam_command_type { BAM_READ_COMMAND, }; =20 +struct bam_desc_metadata { + phys_addr_t scratchpad_addr; +}; + /* * prep_bam_ce_le32 - Wrapper function to prepare a single BAM command * element with the data already in le32 format. --=20 2.47.3