On Mon, Mar 01, 2021 at 10:31:27AM +0100, Thomas Zimmermann wrote:
USB devices cannot perform DMA and hence have no dma_mask set in their device structure. Therefore importing dmabuf into a USB-based driver fails, which breaks joining and mirroring of display in X11.
For USB devices, pick the associated USB controller as attachment device. This allows the DRM import helpers to perform the DMA setup. If the DMA controller does not support DMA transfers, we're out of luck and cannot import. Our current USB-based DRM drivers don't use DMA, so the actual DMA device is not important.
Drivers should use DRM_GEM_SHMEM_DROVER_OPS_USB to initialize their instance of struct drm_driver.
Tested by joining/mirroring displays of udl and radeon un der Gnome/X11.
v6:
- implement workaround in DRM drivers and hold reference to DMA device while USB device is in use
- remove dev_is_usb() (Greg)
- collapse USB helper into usb_intf_get_dma_device() (Alan)
- integrate Daniel's TODO statement (Daniel)
- fix typos (Greg)
v5:
- provide a helper for USB interfaces (Alan)
- add FIXME item to documentation and TODO list (Daniel)
v4:
- implement workaround with USB helper functions (Greg)
- use struct usb_device->bus->sysdev as DMA device (Takashi)
v3:
- drop gem_create_object
- use DMA mask of USB controller, if any (Daniel, Christian, Noralf)
v2:
- move fix to importer side (Christian, Daniel)
- update SHMEM and CMA helpers for new PRIME callbacks
Signed-off-by: Thomas Zimmermann tzimmermann@suse.de Fixes: 6eb0233ec2d0 ("usb: don't inherity DMA properties for USB devices") Tested-by: Pavel Machek pavel@ucw.cz Acked-by: Christian König christian.koenig@amd.com Acked-by: Daniel Vetter daniel.vetter@ffwll.ch Cc: Christoph Hellwig hch@lst.de Cc: Greg Kroah-Hartman gregkh@linuxfoundation.org Cc: stable@vger.kernel.org # v5.10+ Signed-off-by: Thomas Zimmermann tzimmermann@suse.de
Reviewed-by: Greg Kroah-Hartman gregkh@linuxfoundation.org