From nobody Thu Apr 9 15:03:45 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 47CD942EEB8 for ; Mon, 2 Mar 2026 15:58:02 +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=1772467083; cv=none; b=u1rOl2PEH3Jkca9T22QT1Hjxt+ETu5UOqAHOUUnPAXs56f5ciYIj/8BnnTMlM6WDxAiuhOCBq2gjZr+7zXEL2vu7pheYHUxbSRAjLBBTkQ35VG0P/L08I3G2k1SKUkariuAhPdj5SUFxEhtcjGxCAOYuPPIuHSc8p8tpK+J3yc8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772467083; c=relaxed/simple; bh=UUgEXylEiIfyENE0peCNzYmE4sxUi2nWK9Ajpi5BrrE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=D5jOt+5CUVGaglXefaz0oOCg4B/Vfpw9UFvwBtqJF6TIdAXFpdHnKohZFsDqMygNg/OG08DJHXp5xrcPyQCSzAOUQSrE1CmV7GMxQ0sewQ+31zvsCNuAiFtXTtv7xJTkY2MLEWwuGIvTxuIyDVr+11U8g5/ChfptH7C/Kn1IkgM= 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=ii+o15pJ; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=SKnRMiiW; 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="ii+o15pJ"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="SKnRMiiW" 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 622EX4Wc662340 for ; Mon, 2 Mar 2026 15:58:01 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= UPKupKC1xgRq8szLkSXUnMuGW4ZDJHNFE164RxCwkP4=; b=ii+o15pJA0ObdYt3 nGfXs1wAil3n4EBCqhUko6dV5l0WXWS9DsGA+IP3l7zkNx9RRI4+6J5OH2RzJV6i qQYP5hNh0i3xWwtSnUwHV5uO4K3igZc30yF1/JKM8P4jJrlZVgUBwfFJ5J8Z+jOG TlX1Ao3gc/YS5XnSKhcDon5svWi1KeUpUKCMYhznFYgBjm6RS3FnkSqfuDd1CFpt nCfjNHDwx80Kj4qul4aSPTkB0Xe3vron3l7GiaBppDPBzOJF37qLuQMgS9ffsWZT pPnm2JXAu29qSr8ftw1n8jGyHwjyps58l7jUQI32hTxQaxLFxCHCw+KZTz9e/9RK HQQLrg== Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4cn6r2sprv-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 02 Mar 2026 15:58:01 +0000 (GMT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-8cb3ad1b81aso5895785085a.2 for ; Mon, 02 Mar 2026 07:58:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1772467080; x=1773071880; 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=UPKupKC1xgRq8szLkSXUnMuGW4ZDJHNFE164RxCwkP4=; b=SKnRMiiWsxCWEcfJ50/MVtCJjc32xgPLJ/o5zqSxInOP85giWoSBkkHcm0tVKh/s9u sC4+ZgeuhRyhadZOvCXg24LuwpfQR04FC0I9ezMs19KZI/6q7Az4n3lNgrP/sU8KEAOi wVRNn85lxKAWeCKQJ7rcUvyAkbet6YOIyvWKFi61j+DRnCSceYosRN9vh50VqL8VAzyU shezr4GcaqjKtFveiDfZFP7IZltODvvFtL3JDCEap7Izk4RMQdTwLiBE2TCNSJVkpwhp 4ikZ0tSo/70/rXUzHv+CEEg1oiLKdC6zvmz+Ca43FnPKlHvfUyGUSAYolCW9pAPSeIN9 KFOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772467080; x=1773071880; 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=UPKupKC1xgRq8szLkSXUnMuGW4ZDJHNFE164RxCwkP4=; b=NBfPtOf7n0EaB33EvfHRp/A21MDQfXJnH+VR1Rbj7+qjt3kTGCEytsxdKZOwnEMMdE dlJHMcnAU4kf3mtOvP/60qk3QsA1u/TBF/QI0bryyVcu4ZWQaO0TGGRWUnil35R6vcm2 FQoHClBFqmIjGDS4P6F/FAIsUK75o4d4TkUv2jbFDgdtmoxvsUAmmxIttGfDwyeCIcL1 9LDNb9F0xl9xZlZEgCI6K93m4WSbyzWY5p+zCuuiOYtruA4/vyULR+ppSdD3iXmo03eo LZU6YG4NrG+oYbjHcEJXr3kjgQ3GYkr7CnZLdSePKr7zxoc/RP61Dx26pbARPDKob/Y6 fDaA== X-Forwarded-Encrypted: i=1; AJvYcCWd8Fg2BriuegswCa0RhjXs9JmvkWs0EPMOormB/di0gppj73oYd90jWr4bvcz6XUsFx3H9wUGoRr2nNX0=@vger.kernel.org X-Gm-Message-State: AOJu0Yxj6nZ/rIAz1y7kUS4Os9g/ruGdavb03vT223izc6nVPA99gGAt 3HvwDdOcy/zIIVGGD5uZdK+1dz/ZoocG6fkVu6rlcu/v/8dQFaJ+DDjINf/Y6zx+3RXAgqKm3ix MapUnSLOnqX+IaQaibJbw5EjdAqK//zsmr3HzFdsvMYRfX9P6baYakbA3BvYqw/7iGYU= X-Gm-Gg: ATEYQzxEZopARFPs3zfJPPW9a/vuxQWYzZuztQdz7/WWnmVr8TlYfZGBTyzPKExiQNU yBlHQLF2kZDb5BwEHkajc5T3KRF+5S8CKk13OdlIJ6vHmOkkxujQ/9f4g2B+UTHVcCIJMuNe/gp Pb6oGkwGttbY5f+mhC55h7QGNyJ8wqr8eVJrMCDvJR8ZawAKvyNwkN3buQ7sJZjaGdxWlF7h4CB xLPNlOlic2udJ9EojGoa1MQNr4+08+kUg/eDlgMDUqrJhuMd8TJGsmkchBvSEn1Xs4f0PGLTQMv jAWvDhvhtm/6vIiHMI2U2I0TsXbXFJXy/noS17Ytgonq8tueOGTte5xCeQ3xssiTTYXZWKzyvOR vK145xbMJeMZuUi5w97AaAfgAjcH7x6wh3YiMk116XJQFTCfI+spq X-Received: by 2002:a05:620a:7118:b0:8cb:4059:a90d with SMTP id af79cd13be357-8cbc8e50bf3mr1568262785a.38.1772467080454; Mon, 02 Mar 2026 07:58:00 -0800 (PST) X-Received: by 2002:a05:620a:7118:b0:8cb:4059:a90d with SMTP id af79cd13be357-8cbc8e50bf3mr1568258085a.38.1772467079863; Mon, 02 Mar 2026 07:57:59 -0800 (PST) Received: from brgl-qcom.local ([2a01:cb1d:dc:7e00:87af:7e67:1864:389d]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439b41831easm11282438f8f.12.2026.03.02.07.57.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 07:57:59 -0800 (PST) From: Bartosz Golaszewski Date: Mon, 02 Mar 2026 16:57:25 +0100 Subject: [PATCH RFC v11 12/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: <20260302-qcom-qce-cmd-descr-v11-12-4bf1f5db4802@oss.qualcomm.com> References: <20260302-qcom-qce-cmd-descr-v11-0-4bf1f5db4802@oss.qualcomm.com> In-Reply-To: <20260302-qcom-qce-cmd-descr-v11-0-4bf1f5db4802@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=4900; i=bartosz.golaszewski@oss.qualcomm.com; h=from:subject:message-id; bh=UUgEXylEiIfyENE0peCNzYmE4sxUi2nWK9Ajpi5BrrE=; b=owEBbQKS/ZANAwAKAQWdLsv/NoTDAcsmYgBppbNuYzNnk2eJGRt4JyOLFUae7n6EGdPMeWxfu miC6fIYmfiJAjMEAAEKAB0WIQSR5RMt5bVGHXuiZfwFnS7L/zaEwwUCaaWzbgAKCRAFnS7L/zaE w7F6D/0ah6PwxRWwRZZZ5QK1V24RCKtmj7bJS9c2b+P7QDdfyd9Axw1tX6IBQOeiU/H6d76yCCc FKwRTrSdvxnIMCjgyz+F9zyo98CqyeY729UpSZso4Aix+B3ur0stcv4j3I/Sjw5S2L7jXkUfFXd dDwOq52o2hvUnwp/Rs1xWulqb6yKgesa46m0fCw2PCA8PcKYckNMUiITaITT2Rz9Hvtr9PqAbf7 oU1lOAi3+mCzJBcVQ/GJSyl3lSAmTeYeRv7JdoEJEnVedQ9LXTGJwmVvjBNt5QGOWov0YJT4mxI qWAXfRZ6/qbB7taKE0xR/pujgrZlThSqp2kiIIn58N8VdUFbPHVwU68FRP7gScBFenmwgmev7t3 0YwNvoniDq3zLervKJu1fxgZcUkjN5RHdNhldom0bhU/KF+/OH1ubzRLLppW0Dx6djvopjCWSy7 WxJZL9fkwwucP7wBiJfZju3J3UvkjLVe2K8ebI1w0PVGGo0cnYq+vQkd/x+bR6LPkq9gwPKv0J+ +qwk8haYIqtaArSVdx0Cj+j+t+qMwcb9yWvcxzD2DoVlgA7G6LaSBJF3fWpHh2ZPETwmPW+udNF MfvjZ4/g57Z3zSwVWsn9D0xGM8YHTmTSP4nZQlfFdXF0qGcET+J+dzK/onXhMMod+UneCCi3R6y E+lmkkjCDmtGdcQ== X-Developer-Key: i=bartosz.golaszewski@oss.qualcomm.com; a=openpgp; fpr=169DEB6C0BC3C46013D2C79F11A72EA01471D772 X-Proofpoint-GUID: Z4_BzOBBO9ToUUSJkZZBpNQ4VNtRYboP X-Proofpoint-ORIG-GUID: Z4_BzOBBO9ToUUSJkZZBpNQ4VNtRYboP X-Authority-Analysis: v=2.4 cv=Hpp72kTS c=1 sm=1 tr=0 ts=69a5b389 cx=c_pps a=50t2pK5VMbmlHzFWWp8p/g==: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=KZCnMsYHACgmd2lUPBsA:9 a=QEXdDO2ut3YA:10 a=IoWCM6iH3mJn3m4BftBB:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzAyMDEzMyBTYWx0ZWRfX770NitEn/gPI QZ1NAGQvLtvSReLe8MZvawISyz+e0DESgYAaICeJ1gUmUF0EWMX1Cor2RVV8skwJiJjClds268k 9Hy0hRespWTn2L8XOmRQn9ziTF4zgTc3VVra7IIhm6t7vwNjBKvuzy+5P/5hXpLqv2qDmdTmbib GxMBiZh6l2MlbqJgKCIVCPH5AfFFo4kgr/6EEZjs/BXP1IC9Nw7cKdn6upXq0+i0oefRrWTpUjS R/Jq7cuQ3+kpKjBrIaii5G73SHlRlTy6PZYP7MlmyCc5LfwSD7fy5G3p4t3qRUcU0Yg6ema389k xI98+DhxyfwqoNeyIcVvNGtawdFZFTnroUic/I021yTqaPD7eXaTbfDNc395uU1m04Bh0tqd6Yr oKn4n7CWALeUeIhREObsm/KbVRuUb1cQdLrEkgcwZa7+w+R2CzVDThntSq7Pt3hV036zrh5YjiK 3XgCmOGWKopuj/WZaDA== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-03-02_03,2026-03-02_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 suspectscore=0 impostorscore=0 phishscore=0 priorityscore=1501 adultscore=0 bulkscore=0 malwarescore=0 clxscore=1015 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2602130000 definitions=main-2603020133 Add support for BAM pipe locking. To that end: when starting the DMA on an RX channel - wrap the already issued descriptors with additional command descriptors performing dummy writes to the base register supplied by the client via dmaengine_slave_config() (if any) alongside the lock/unlock HW flags. Signed-off-by: Bartosz Golaszewski --- drivers/dma/qcom/bam_dma.c | 100 +++++++++++++++++++++++++++++++++++++++++= +++- 1 file changed, 99 insertions(+), 1 deletion(-) diff --git a/drivers/dma/qcom/bam_dma.c b/drivers/dma/qcom/bam_dma.c index 83491e7c2f17d8c9d12a1a055baea7e3a0a75a53..b149cbe9613f0bdc8e26cae4f0c= c6922997480d5 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,12 @@ struct bam_chan { struct list_head desc_list; =20 struct list_head node; + + /* BAM locking infrastructure */ + 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) @@ -1012,14 +1022,92 @@ 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 int 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; + + 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->slave.dst_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_setup_pipe_lock(struct bam_chan *bchan) +{ + struct bam_async_desc *lock_desc, *unlock_desc; + + lock_desc =3D bam_make_lock_desc(bchan, &bchan->lock_sg, + &bchan->lock_ce, DESC_FLAG_LOCK); + if (!lock_desc) + return -ENOMEM; + + unlock_desc =3D bam_make_lock_desc(bchan, &bchan->unlock_sg, + &bchan->unlock_ce, DESC_FLAG_UNLOCK); + if (!unlock_desc) { + kfree(lock_desc); + return -ENOMEM; + } + + list_add(&lock_desc->vd.node, &bchan->vc.desc_issued); + list_add_tail(&unlock_desc->vd.node, &bchan->vc.desc_issued); + + return 0; +} + /** * bam_start_dma - start next transaction * @bchan: bam dma channel */ static void bam_start_dma(struct bam_chan *bchan) { - struct virt_dma_desc *vd =3D vchan_next_desc(&bchan->vc); + struct virt_dma_desc *vd; struct bam_device *bdev =3D bchan->bdev; + const struct bam_device_data *bdata =3D bdev->dev_data; struct bam_async_desc *async_desc =3D NULL; struct bam_desc_hw *desc; struct bam_desc_hw *fifo =3D PTR_ALIGN(bchan->fifo_virt, @@ -1030,6 +1118,16 @@ static void bam_start_dma(struct bam_chan *bchan) =20 lockdep_assert_held(&bchan->vc.lock); =20 + if (bdata->pipe_lock_supported && bchan->slave.dst_addr && + bchan->slave.direction =3D=3D DMA_MEM_TO_DEV) { + ret =3D bam_setup_pipe_lock(bchan); + if (ret) { + dev_err(bdev->dev, "Failed to set up the BAM lock\n"); + return; + } + } + + vd =3D vchan_next_desc(&bchan->vc); if (!vd) return; =20 --=20 2.47.3