Re: [PATCH 07/15] accel/qda: Add memory manager for CB devices
From: Dmitry Baryshkov
Date: Wed May 20 2026 - 10:37:24 EST
On Tue, May 19, 2026 at 11:45:57AM +0530, Ekansh Gupta via B4 Relay wrote:
> From: Ekansh Gupta <ekansh.gupta@xxxxxxxxxxxxxxxx>
>
> Introduce the QDA memory manager (qda_memory_manager) to track and
> manage the IOMMU devices that back each compute context bank (CB).
>
> Each CB device registered on the qda-compute-cb bus is assigned a
> unique ID via an XArray and wrapped in a qda_iommu_device descriptor
> that records the device pointer and its stream ID. This registry
> allows the driver to look up the correct IOMMU domain for a given
> session when mapping DSP buffers.
>
> The memory manager is initialised in qda_init_device() before CB
> devices are populated and torn down in qda_deinit_device() after they
> are destroyed, ensuring no dangling references remain in the XArray.
>
> qda_cb.c is extended with qda_cb_setup_device(), which is called
> immediately after a CB device is registered on the bus. It allocates
> a qda_iommu_device, registers it with the memory manager, and stores
> it as the CB device's driver data so that qda_destroy_cb_device() can
> retrieve and unregister it during teardown.
>
> Assisted-by: Claude:claude-4-6-sonnet
> Signed-off-by: Ekansh Gupta <ekansh.gupta@xxxxxxxxxxxxxxxx>
> ---
> drivers/accel/qda/Makefile | 1 +
> drivers/accel/qda/qda_cb.c | 47 ++++++++++++++
> drivers/accel/qda/qda_drv.c | 34 ++++++++++
> drivers/accel/qda/qda_drv.h | 5 ++
> drivers/accel/qda/qda_memory_manager.c | 111 +++++++++++++++++++++++++++++++++
> drivers/accel/qda/qda_memory_manager.h | 49 +++++++++++++++
> drivers/accel/qda/qda_rpmsg.c | 7 +++
> 7 files changed, 254 insertions(+)
>
> @@ -61,14 +62,20 @@ static int qda_rpmsg_probe(struct rpmsg_device *rpdev)
> }
> qdev->dsp_name = label;
>
> + ret = qda_init_device(qdev);
> + if (ret)
> + return ret;
> +
> ret = qda_cb_populate(qdev, rpdev->dev.of_node);
> if (ret) {
> dev_err(qdev->dev, "Failed to populate child devices: %d\n", ret);
> + qda_deinit_device(qdev);
> return ret;
> }
>
> ret = qda_register_device(qdev);
> if (ret) {
> + qda_deinit_device(qdev);
> qda_cb_unpopulate(qdev);
No, this is not how you unwind in the error case in the kernel. Follow
the established patterns.
> return ret;
> }
>
> --
> 2.34.1
>
>
--
With best wishes
Dmitry