On Mon, Aug 17, 2026 at 10:17:46AM +0530, Ekansh Gupta wrote: > Allow user-space to import DMA-BUF file descriptors from other > subsystems (GPU, camera, video) into the QDA driver via the standard > DRM PRIME interface. > > qda_prime.c > Implements qda_gem_prime_import(), which is set as the driver's > .gem_prime_import callback. On import it: > 1. Short-circuits self-import: if the dma_buf was exported by this > device and is not itself an import, the existing GEM object is > returned with an incremented reference count. > 2. Attaches to the dma_buf and maps it with DMA_BIDIRECTIONAL via > dma_buf_map_attachment_unlocked(), obtaining an sg_table whose > DMA addresses are IOMMU virtual addresses in the CB device's > address space. > 3. Calls qda_memory_manager_alloc() to record the mapping and encode > the SID in the upper bits of the DMA address, matching the > convention used for natively allocated buffers. > > qda_prime_fd_to_handle() wraps drm_gem_prime_fd_to_handle() under > qdev->import_lock, storing the calling file_priv in
Why do you need a separate lock? > qdev->current_import_file_priv so that qda_gem_prime_import() can > retrieve it (the .gem_prime_import callback does not receive > file_priv directly, but the context bank to attach to is per-process). > > qda_gem.c > qda_gem_free_object() is extended to handle the imported-buffer > teardown path: unmap the sg_table, detach from the dma_buf, and > release the dma_buf reference. > qda_gem_mmap_obj() rejects mmap requests on imported objects, which > must be mapped through the exporter instead. > > qda_memory_manager.c > The DSP is given a single base address per buffer, so only buffers > that are mapped as one contiguous range can be described to it. Is there no IOMMU in front of the DSP? Can we remap the buffer to a linear are inside the DSP map? > qda_memory_manager_map_imported() therefore walks the imported > buffer's scatterlist and rejects any buffer whose entries are not > contiguous; contiguous imports (for example from the CMA DMA-buf > heap) are accepted. Whether an exporter or IOMMU coalesces a buffer > into a single range is not guaranteed, so this is verified rather > than assumed. > qda_memory_manager_free() skips the DMA free path for imported > buffers since the memory is owned by the exporter. > > Assisted-by: Claude:claude-sonnet-5 > Signed-off-by: Ekansh Gupta <[email protected]> > --- > Changes in v2: > - Do not assume the exporter or IOMMU maps an imported buffer as a > single contiguous range; walk the scatterlist and cleanly reject > non-contiguous imports instead (Christian König) > - Document that only contiguous imports (e.g. CMA DMA-buf heap) are > supported > - Return -EBUSY rather than -ENODEV when no context bank is available > --- > drivers/accel/qda/Makefile | 1 + > } > > +static int qda_memory_manager_map_imported(struct qda_gem_obj *gem_obj, > + struct qda_iommu_device *iommu_dev) > +{ > + dma_addr_t dma_addr, expected_addr = 0; > + struct scatterlist *sg, *s; > + int i; > + > + sg = gem_obj->sgt->sgl; > + > + /* > + * Verify that the imported DMA-BUF is contiguous. While some platforms Which "some platforms"? > + * or IOMMUs might map buffers as a single range, we must not silently > + * assume this is always the case. We loop through the scatterlist > + * entries and reject any that are non-contiguous. > + */ -- With best wishes Dmitry
