On Wed, Jun 03, 2026 at 11:09:31AM +0530, Ekansh Gupta wrote:
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(-) @@ -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) {
return ret;qda_cb_unpopulate(qdev);Unwinding registration?
did I miss something here? The intention to free up the CB devices in case the device registration fails.>
Don't you need to unwind anything else?
- }
drm_info(&qdev->drm_dev, "QDA RPMsg probe complete for %s\n", qdev->dsp_name); return 0;
-- 2.34.1