From: Ekansh Gupta <ekansh.gupta@oss.qualcomm.com>
To: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Cc: "Oded Gabbay" <ogabbay@kernel.org>,
"Jonathan Corbet" <corbet@lwn.net>,
"Shuah Khan" <skhan@linuxfoundation.org>,
"Joerg Roedel" <joro@8bytes.org>, "Will Deacon" <will@kernel.org>,
"Robin Murphy" <robin.murphy@arm.com>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Sumit Semwal" <sumit.semwal@linaro.org>,
"Christian König" <christian.koenig@amd.com>,
"Bharath Kumar" <quic_bkumar@quicinc.com>,
"Chenna Kesava Raju" <quic_chennak@quicinc.com>,
srini@kernel.org, andersson@kernel.org, konradybcio@kernel.org,
robin.clark@oss.qualcomm.com, linux-kernel@vger.kernel.org,
dri-devel@lists.freedesktop.org, linux-doc@vger.kernel.org,
linux-arm-msm@vger.kernel.org, iommu@lists.linux.dev,
linux-media@vger.kernel.org, linaro-mm-sig@lists.linaro.org
Subject: Re: [PATCH 06/15] accel/qda: Create compute context bank devices on QDA compute bus
Date: Wed, 3 Jun 2026 11:09:31 +0530 [thread overview]
Message-ID: <37ae68ba-6639-4bd2-9483-5aa0156fd772@oss.qualcomm.com> (raw)
In-Reply-To: <f527lflctqyqjrotd2qerlx4oikg6st6u2seqsjw6u5krkqrab@uhw33gnkp5c7>
On 20-05-2026 19:53, Dmitry Baryshkov wrote:
> On Tue, May 19, 2026 at 11:45:56AM +0530, Ekansh Gupta via B4 Relay wrote:
>> From: Ekansh Gupta <ekansh.gupta@oss.qualcomm.com>
>>
>> Introduce the CB (compute context bank) device management layer for the
>> QDA driver. Each DSP domain node in the device tree may contain child
>> nodes with compatible "qcom,fastrpc-compute-cb", each representing one
>> IOMMU context bank. The driver enumerates those child nodes during
>> RPMsg probe and creates a corresponding device on the qda-compute-cb
>> bus for each one.
>>
>> The CB devices are created via create_qda_cb_device(), which registers
>> them on the qda-compute-cb bus so that the IOMMU subsystem assigns each
>> device its own IOMMU domain, enabling per-session address space
>> isolation for DSP buffer mapping.
>>
>> The new qda_cb.c file provides two functions:
>>
>> qda_create_cb_device()
>> Reads the "reg" property from the DT child node to obtain the
>> stream ID, constructs a unique device name of the form
>> "qda-cb-<dsp>-<sid>", and registers the device on the compute bus.
>> A qda_cb_dev entry is allocated and appended to qdev->cb_devs so
>> that the list can be walked during teardown.
>>
>> qda_destroy_cb_device()
>> Removes the device from its IOMMU group before calling
>> device_unregister(), ensuring the IOMMU domain is released cleanly.
>>
>> CB devices are populated before the DRM device is registered and
>> destroyed before it is unplugged, so no DRM operation can race with
>> CB teardown. On probe failure after population, qda_cb_unpopulate()
>> is called to clean up any CBs that were successfully created before
>> the error.
>>
>> Assisted-by: Claude:claude-4-6-sonnet
>> Signed-off-by: Ekansh Gupta <ekansh.gupta@oss.qualcomm.com>
>> ---
>> drivers/accel/qda/Makefile | 1 +
>> drivers/accel/qda/qda_cb.c | 99 +++++++++++++++++++++++++++++++++++++++++++
>> drivers/accel/qda/qda_cb.h | 32 ++++++++++++++
>> drivers/accel/qda/qda_drv.c | 1 +
>> drivers/accel/qda/qda_drv.h | 3 ++
>> drivers/accel/qda/qda_rpmsg.c | 12 +++++-
>> 6 files changed, 147 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/accel/qda/Makefile b/drivers/accel/qda/Makefile
>> index 424176f652a5..143c9e4e789e 100644
>> --- a/drivers/accel/qda/Makefile
>> +++ b/drivers/accel/qda/Makefile
>> @@ -6,6 +6,7 @@
>> obj-$(CONFIG_DRM_ACCEL_QDA) := qda.o
>>
>> qda-y := \
>> + qda_cb.o \
>> qda_drv.o \
>> qda_rpmsg.o
>>
>> diff --git a/drivers/accel/qda/qda_cb.c b/drivers/accel/qda/qda_cb.c
>> new file mode 100644
>> index 000000000000..77caf8438c67
>> --- /dev/null
>> +++ b/drivers/accel/qda/qda_cb.c
>> @@ -0,0 +1,99 @@
>> +// SPDX-License-Identifier: GPL-2.0-only
>> +// Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
>> +#include <linux/dma-mapping.h>
>> +#include <linux/device.h>
>> +#include <linux/of.h>
>> +#include <linux/iommu.h>
>> +#include <linux/qda_compute_bus.h>
>> +#include <linux/slab.h>
>> +#include <drm/drm_print.h>
>> +#include "qda_drv.h"
>> +#include "qda_cb.h"
>> +
>> +int qda_create_cb_device(struct qda_dev *qdev, struct device_node *cb_node)
>> +{
>> + struct device *cb_dev;
>> + u32 sid = 0;
>> + char name[64];
>> + struct qda_cb_dev *entry;
>> +
>> + drm_dbg_driver(&qdev->drm_dev, "Creating CB device for node: %s\n", cb_node->name);
>> +
>> + of_property_read_u32(cb_node, "reg", &sid);
>> +
>> + snprintf(name, sizeof(name), "qda-cb-%s-%u", qdev->dsp_name, sid);
>> +
>> + cb_dev = create_qda_cb_device(qdev->dev, name, DMA_BIT_MASK(32), cb_node);
>
> Wrong prefix. Pass the name format and the params to this function. Use
> kasprintf in it.
ack>
>> + if (IS_ERR(cb_dev)) {
>> + drm_err(&qdev->drm_dev, "Failed to create CB device for SID %u: %ld\n",
>> + sid, PTR_ERR(cb_dev));
>> + return PTR_ERR(cb_dev);
>> + }
>> +
>> + entry = kzalloc_obj(*entry);
>> + if (!entry) {
>> + device_unregister(cb_dev);
>> + return -ENOMEM;
>> + }
>> +
>> + entry->dev = cb_dev;
>> + list_add_tail(&entry->node, &qdev->cb_devs);
>> +
>> + drm_dbg_driver(&qdev->drm_dev, "Successfully created CB device for SID %u\n", sid);
>> + return 0;
>> +}
>> +
>> +void qda_cb_unpopulate(struct qda_dev *qdev)
>> +{
>> + struct qda_cb_dev *entry, *tmp;
>> +
>> + list_for_each_entry_safe(entry, tmp, &qdev->cb_devs, node) {
>> + list_del(&entry->node);
>> + qda_destroy_cb_device(entry->dev);
>> + kfree(entry);
>> + }
>> +}
>> +
>> +int qda_cb_populate(struct qda_dev *qdev, struct device_node *parent_node)
>> +{
>> + struct device_node *child;
>> + int count = 0, success = 0;
>> +
>> + for_each_child_of_node(parent_node, child) {
>> + if (of_device_is_compatible(child, "qcom,fastrpc-compute-cb")) {
>> + count++;
>> + if (qda_create_cb_device(qdev, child) == 0) {
>> + success++;
>> + dev_dbg(qdev->dev, "Created CB device for node: %s\n",
>> + child->name);
>
> Stop counting successes.
>
>> + } else {
>> + dev_err(qdev->dev, "Failed to create CB device for: %s\n",
>> + child->name);
>
> Unwind, return error.
>
ack>> + }
>> + }
>> + }
>> + if (count == 0)
>> + return 0;
>> + return success > 0 ? 0 : -ENODEV;
>> +}
>> +
>> +void qda_destroy_cb_device(struct device *cb_dev)
>> +{
>> + struct iommu_group *group;
>> +
>> + if (!cb_dev) {
>
> How can it be?
I'll remove this.>
>> + pr_debug("qda: NULL CB device passed to destroy\n");
>> + return;
>> + }
>> +
>> + dev_dbg(cb_dev, "Destroying CB device %s\n", dev_name(cb_dev));
>> +
>> + group = iommu_group_get(cb_dev);
>> + if (group) {
>> + dev_dbg(cb_dev, "Removing %s from IOMMU group\n", dev_name(cb_dev));
>
> Be uniform. It's either drm_dbg_foo() or dev_dbg() all over the place.
> Don't mix them.
ack>
>> + iommu_group_remove_device(cb_dev);
>> + iommu_group_put(group);
>> + }
>> +
>> + device_unregister(cb_dev);
>> +}
>> @@ -59,9 +61,17 @@ static int qda_rpmsg_probe(struct rpmsg_device *rpdev)
>> }
>> qdev->dsp_name = label;
>>
>> + ret = qda_cb_populate(qdev, rpdev->dev.of_node);
>> + if (ret) {
>> + dev_err(qdev->dev, "Failed to populate child devices: %d\n", ret);
>> + return ret;
>> + }
>> +
>> ret = qda_register_device(qdev);
>> - if (ret)
>> + if (ret) {
>> + qda_cb_unpopulate(qdev);
>> return ret;
>
> Unwinding registration?
did I miss something here? The intention to free up the CB devices in
case the device registration fails.>
>> + }
>>
>> drm_info(&qdev->drm_dev, "QDA RPMsg probe complete for %s\n", qdev->dsp_name);
>> return 0;
>>
>> --
>> 2.34.1
>>
>>
>
next prev parent reply other threads:[~2026-06-03 5:39 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-19 6:15 [PATCH 00/15] accel/qda: Qualcomm DSP Accelerator driver Ekansh Gupta via B4 Relay
2026-05-19 6:15 ` [PATCH 01/15] MAINTAINERS: Add entry for Qualcomm DSP Accelerator (QDA) driver Ekansh Gupta via B4 Relay
2026-05-19 6:15 ` [PATCH 02/15] accel/qda: Add QDA driver documentation Ekansh Gupta via B4 Relay
2026-05-20 14:12 ` Dmitry Baryshkov
2026-05-20 15:47 ` Tomeu Vizoso
2026-06-03 5:22 ` Ekansh Gupta
2026-06-03 8:54 ` Tomeu Vizoso
2026-06-03 5:19 ` Ekansh Gupta
2026-05-19 6:15 ` [PATCH 03/15] accel/qda: Add initial QDA DRM accelerator driver Ekansh Gupta via B4 Relay
2026-05-20 14:18 ` Dmitry Baryshkov
2026-06-03 5:26 ` Ekansh Gupta
2026-05-19 6:15 ` [PATCH 04/15] accel/qda: Add compute bus for QDA context banks Ekansh Gupta via B4 Relay
2026-05-20 14:19 ` Dmitry Baryshkov
2026-06-03 5:28 ` Ekansh Gupta
2026-06-03 13:25 ` Dmitry Baryshkov
2026-05-19 6:15 ` [PATCH 05/15] iommu: Add QDA compute context bank bus to iommu_buses Ekansh Gupta via B4 Relay
2026-05-20 14:19 ` Dmitry Baryshkov
2026-05-19 6:15 ` [PATCH 06/15] accel/qda: Create compute context bank devices on QDA compute bus Ekansh Gupta via B4 Relay
2026-05-20 14:23 ` Dmitry Baryshkov
2026-06-03 5:39 ` Ekansh Gupta [this message]
2026-06-03 13:26 ` Dmitry Baryshkov
2026-05-19 6:15 ` [PATCH 07/15] accel/qda: Add memory manager for CB devices Ekansh Gupta via B4 Relay
2026-05-20 14:26 ` Dmitry Baryshkov
2026-06-03 5:44 ` Ekansh Gupta
2026-05-20 14:27 ` Dmitry Baryshkov
2026-06-03 5:46 ` Ekansh Gupta
2026-05-19 6:15 ` [PATCH 08/15] accel/qda: Add QUERY IOCTL and QDA UAPI header Ekansh Gupta via B4 Relay
2026-05-20 14:29 ` Dmitry Baryshkov
2026-06-03 5:51 ` Ekansh Gupta
2026-06-03 13:43 ` Dmitry Baryshkov
2026-05-19 6:15 ` [PATCH 09/15] accel/qda: Add DMA-backed GEM objects and memory manager integration Ekansh Gupta via B4 Relay
2026-05-19 12:14 ` Markus Elfring
2026-05-19 12:28 ` Matthew Wilcox
2026-05-19 12:32 ` Markus Elfring
2026-05-19 6:16 ` [PATCH 10/15] accel/qda: Add GEM_CREATE and GEM_MMAP_OFFSET IOCTLs Ekansh Gupta via B4 Relay
2026-05-19 6:16 ` [PATCH 11/15] accel/qda: Add PRIME DMA-BUF import support Ekansh Gupta via B4 Relay
2026-05-19 6:55 ` Christian König
2026-06-03 6:11 ` Ekansh Gupta
2026-06-03 13:40 ` Christian König
2026-06-08 5:14 ` Ekansh Gupta
2026-05-19 6:16 ` [PATCH 12/15] accel/qda: Add FastRPC invocation support Ekansh Gupta via B4 Relay
2026-05-20 13:56 ` Dmitry Baryshkov
2026-06-04 5:09 ` Ekansh Gupta
2026-06-07 21:14 ` Dmitry Baryshkov
2026-06-10 9:38 ` Ekansh Gupta
2026-06-12 8:21 ` Dmitry Baryshkov
2026-05-19 6:16 ` [PATCH 13/15] accel/qda: Add DSP process creation and release Ekansh Gupta via B4 Relay
2026-05-20 14:00 ` Dmitry Baryshkov
2026-06-04 5:17 ` Ekansh Gupta
2026-06-07 21:16 ` Dmitry Baryshkov
2026-05-19 6:16 ` [PATCH 14/15] accel/qda: Add remote memory mapping to DSP address space Ekansh Gupta via B4 Relay
2026-05-19 6:16 ` [PATCH 15/15] accel/qda: Add remote memory unmap from " Ekansh Gupta via B4 Relay
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=37ae68ba-6639-4bd2-9483-5aa0156fd772@oss.qualcomm.com \
--to=ekansh.gupta@oss.qualcomm.com \
--cc=airlied@gmail.com \
--cc=andersson@kernel.org \
--cc=christian.koenig@amd.com \
--cc=corbet@lwn.net \
--cc=dmitry.baryshkov@oss.qualcomm.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=iommu@lists.linux.dev \
--cc=joro@8bytes.org \
--cc=konradybcio@kernel.org \
--cc=linaro-mm-sig@lists.linaro.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=ogabbay@kernel.org \
--cc=quic_bkumar@quicinc.com \
--cc=quic_chennak@quicinc.com \
--cc=robin.clark@oss.qualcomm.com \
--cc=robin.murphy@arm.com \
--cc=simona@ffwll.ch \
--cc=skhan@linuxfoundation.org \
--cc=srini@kernel.org \
--cc=sumit.semwal@linaro.org \
--cc=tzimmermann@suse.de \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox