From: Dmitry Osipenko <dmitry.osipenko@collabora.com> To: "David Airlie" <airlied@linux.ie>, "Gerd Hoffmann" <kraxel@redhat.com>, "Gurchetan Singh" <gurchetansingh@chromium.org>, "Chia-I Wu" <olvaffe@gmail.com>, "Daniel Vetter" <daniel@ffwll.ch>, "Daniel Almeida" <daniel.almeida@collabora.com>, "Gert Wollny" <gert.wollny@collabora.com>, "Gustavo Padovan" <gustavo.padovan@collabora.com>, "Daniel Stone" <daniel@fooishbar.org>, "Tomeu Vizoso" <tomeu.vizoso@collabora.com>, "Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>, "Maxime Ripard" <mripard@kernel.org>, "Thomas Zimmermann" <tzimmermann@suse.de>, "Rob Herring" <robh@kernel.org>, "Steven Price" <steven.price@arm.com>, "Alyssa Rosenzweig" <alyssa.rosenzweig@collabora.com>, "Rob Clark" <robdclark@gmail.com>, "Emil Velikov" <emil.l.velikov@gmail.com>, "Robin Murphy" <robin.murphy@arm.com>, "Qiang Yu" <yuq825@gmail.com>, "Sumit Semwal" <sumit.semwal@linaro.org>, "Christian König" <christian.koenig@amd.com>, "Pan, Xinhui" <Xinhui.Pan@amd.com>, "Thierry Reding" <thierry.reding@gmail.com>, "Tomasz Figa" <tfiga@chromium.org>, "Marek Szyprowski" <m.szyprowski@samsung.com>, "Mauro Carvalho Chehab" <mchehab@kernel.org>, "Alex Deucher" <alexander.deucher@amd.com>, "Jani Nikula" <jani.nikula@linux.intel.com>, "Joonas Lahtinen" <joonas.lahtinen@linux.intel.com>, "Rodrigo Vivi" <rodrigo.vivi@intel.com>, "Tvrtko Ursulin" <tvrtko.ursulin@linux.intel.com> Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org, Dmitry Osipenko <digetx@gmail.com>, Dmitry Osipenko <dmitry.osipenko@collabora.com>, linux-tegra@vger.kernel.org, linux-media@vger.kernel.org, linaro-mm-sig@lists.linaro.org, amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, kernel@collabora.com Subject: [PATCH v6 13/22] drm/virtio: Improve DMA API usage for shmem BOs Date: Fri, 27 May 2022 02:50:31 +0300 [thread overview] Message-ID: <20220526235040.678984-14-dmitry.osipenko@collabora.com> (raw) In-Reply-To: <20220526235040.678984-1-dmitry.osipenko@collabora.com> DRM API requires the DRM's driver to be backed with the device that can be used for generic DMA operations. The VirtIO-GPU device can't perform DMA operations if it uses PCI transport because PCI device driver creates a virtual VirtIO-GPU device that isn't associated with the PCI. Use PCI's GPU device for the DRM's device instead of the VirtIO-GPU device and drop DMA-related hacks from the VirtIO-GPU driver. Signed-off-by: Dmitry Osipenko <dmitry.osipenko@collabora.com> --- drivers/gpu/drm/virtio/virtgpu_drv.c | 51 ++++++---------------- drivers/gpu/drm/virtio/virtgpu_drv.h | 5 +-- drivers/gpu/drm/virtio/virtgpu_kms.c | 7 ++-- drivers/gpu/drm/virtio/virtgpu_object.c | 56 +++++-------------------- drivers/gpu/drm/virtio/virtgpu_vq.c | 13 +++--- 5 files changed, 32 insertions(+), 100 deletions(-) diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.c b/drivers/gpu/drm/virtio/virtgpu_drv.c index 5f25a8d15464..0141b7df97ec 100644 --- a/drivers/gpu/drm/virtio/virtgpu_drv.c +++ b/drivers/gpu/drm/virtio/virtgpu_drv.c @@ -46,12 +46,11 @@ static int virtio_gpu_modeset = -1; MODULE_PARM_DESC(modeset, "Disable/Enable modesetting"); module_param_named(modeset, virtio_gpu_modeset, int, 0400); -static int virtio_gpu_pci_quirk(struct drm_device *dev, struct virtio_device *vdev) +static int virtio_gpu_pci_quirk(struct drm_device *dev) { - struct pci_dev *pdev = to_pci_dev(vdev->dev.parent); + struct pci_dev *pdev = to_pci_dev(dev->dev); const char *pname = dev_name(&pdev->dev); bool vga = (pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA; - char unique[20]; int ret; DRM_INFO("pci: %s detected at %s\n", @@ -63,39 +62,7 @@ static int virtio_gpu_pci_quirk(struct drm_device *dev, struct virtio_device *vd return ret; } - /* - * Normally the drm_dev_set_unique() call is done by core DRM. - * The following comment covers, why virtio cannot rely on it. - * - * Unlike the other virtual GPU drivers, virtio abstracts the - * underlying bus type by using struct virtio_device. - * - * Hence the dev_is_pci() check, used in core DRM, will fail - * and the unique returned will be the virtio_device "virtio0", - * while a "pci:..." one is required. - * - * A few other ideas were considered: - * - Extend the dev_is_pci() check [in drm_set_busid] to - * consider virtio. - * Seems like a bigger hack than what we have already. - * - * - Point drm_device::dev to the parent of the virtio_device - * Semantic changes: - * * Using the wrong device for i2c, framebuffer_alloc and - * prime import. - * Visual changes: - * * Helpers such as DRM_DEV_ERROR, dev_info, drm_printer, - * will print the wrong information. - * - * We could address the latter issues, by introducing - * drm_device::bus_dev, ... which would be used solely for this. - * - * So for the moment keep things as-is, with a bulky comment - * for the next person who feels like removing this - * drm_dev_set_unique() quirk. - */ - snprintf(unique, sizeof(unique), "pci:%s", pname); - return drm_dev_set_unique(dev, unique); + return 0; } static int virtio_gpu_probe(struct virtio_device *vdev) @@ -109,18 +76,24 @@ static int virtio_gpu_probe(struct virtio_device *vdev) if (virtio_gpu_modeset == 0) return -EINVAL; - dev = drm_dev_alloc(&driver, &vdev->dev); + /* + * The virtio-gpu device is a virtual device that doesn't have DMA + * ops assigned to it, nor DMA mask set and etc. Its parent device + * is actual GPU device we want to use it for the DRM's device in + * order to benefit from using generic DRM APIs. + */ + dev = drm_dev_alloc(&driver, vdev->dev.parent); if (IS_ERR(dev)) return PTR_ERR(dev); vdev->priv = dev; if (!strcmp(vdev->dev.parent->bus->name, "pci")) { - ret = virtio_gpu_pci_quirk(dev, vdev); + ret = virtio_gpu_pci_quirk(dev); if (ret) goto err_free; } - ret = virtio_gpu_init(dev); + ret = virtio_gpu_init(vdev, dev); if (ret) goto err_free; diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h index 0a194aaad419..b2d93cb12ebf 100644 --- a/drivers/gpu/drm/virtio/virtgpu_drv.h +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h @@ -100,8 +100,6 @@ struct virtio_gpu_object { struct virtio_gpu_object_shmem { struct virtio_gpu_object base; - struct sg_table *pages; - uint32_t mapped; }; struct virtio_gpu_object_vram { @@ -214,7 +212,6 @@ struct virtio_gpu_drv_cap_cache { }; struct virtio_gpu_device { - struct device *dev; struct drm_device *ddev; struct virtio_device *vdev; @@ -282,7 +279,7 @@ extern struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS]; void virtio_gpu_create_context(struct drm_device *dev, struct drm_file *file); /* virtgpu_kms.c */ -int virtio_gpu_init(struct drm_device *dev); +int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev); void virtio_gpu_deinit(struct drm_device *dev); void virtio_gpu_release(struct drm_device *dev); int virtio_gpu_driver_open(struct drm_device *dev, struct drm_file *file); diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c index 3313b92db531..0d1e3eb61bee 100644 --- a/drivers/gpu/drm/virtio/virtgpu_kms.c +++ b/drivers/gpu/drm/virtio/virtgpu_kms.c @@ -110,7 +110,7 @@ static void virtio_gpu_get_capsets(struct virtio_gpu_device *vgdev, vgdev->num_capsets = num_capsets; } -int virtio_gpu_init(struct drm_device *dev) +int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev) { static vq_callback_t *callbacks[] = { virtio_gpu_ctrl_ack, virtio_gpu_cursor_ack @@ -123,7 +123,7 @@ int virtio_gpu_init(struct drm_device *dev) u32 num_scanouts, num_capsets; int ret = 0; - if (!virtio_has_feature(dev_to_virtio(dev->dev), VIRTIO_F_VERSION_1)) + if (!virtio_has_feature(vdev, VIRTIO_F_VERSION_1)) return -ENODEV; vgdev = kzalloc(sizeof(struct virtio_gpu_device), GFP_KERNEL); @@ -132,8 +132,7 @@ int virtio_gpu_init(struct drm_device *dev) vgdev->ddev = dev; dev->dev_private = vgdev; - vgdev->vdev = dev_to_virtio(dev->dev); - vgdev->dev = dev->dev; + vgdev->vdev = vdev; spin_lock_init(&vgdev->display_info_lock); spin_lock_init(&vgdev->resource_export_lock); diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c index 18f70ef6b4d0..8d7728181de0 100644 --- a/drivers/gpu/drm/virtio/virtgpu_object.c +++ b/drivers/gpu/drm/virtio/virtgpu_object.c @@ -67,21 +67,6 @@ void virtio_gpu_cleanup_object(struct virtio_gpu_object *bo) virtio_gpu_resource_id_put(vgdev, bo->hw_res_handle); if (virtio_gpu_is_shmem(bo)) { - struct virtio_gpu_object_shmem *shmem = to_virtio_gpu_shmem(bo); - - if (shmem->pages) { - if (shmem->mapped) { - dma_unmap_sgtable(vgdev->vdev->dev.parent, - shmem->pages, DMA_TO_DEVICE, 0); - shmem->mapped = 0; - } - - sg_free_table(shmem->pages); - kfree(shmem->pages); - shmem->pages = NULL; - drm_gem_shmem_unpin(&bo->base); - } - drm_gem_shmem_free(&bo->base); } else if (virtio_gpu_is_vram(bo)) { struct virtio_gpu_object_vram *vram = to_virtio_gpu_vram(bo); @@ -153,37 +138,18 @@ static int virtio_gpu_object_shmem_init(struct virtio_gpu_device *vgdev, unsigned int *nents) { bool use_dma_api = !virtio_has_dma_quirk(vgdev->vdev); - struct virtio_gpu_object_shmem *shmem = to_virtio_gpu_shmem(bo); struct scatterlist *sg; - int si, ret; + struct sg_table *pages; + int si; - ret = drm_gem_shmem_pin(&bo->base); - if (ret < 0) - return -EINVAL; - - /* - * virtio_gpu uses drm_gem_shmem_get_sg_table instead of - * drm_gem_shmem_get_pages_sgt because virtio has it's own set of - * dma-ops. This is discouraged for other drivers, but should be fine - * since virtio_gpu doesn't support dma-buf import from other devices. - */ - shmem->pages = drm_gem_shmem_get_sg_table(&bo->base); - ret = PTR_ERR_OR_ZERO(shmem->pages); - if (ret) { - drm_gem_shmem_unpin(&bo->base); - shmem->pages = NULL; - return ret; - } + pages = drm_gem_shmem_get_pages_sgt(&bo->base); + if (IS_ERR(pages)) + return PTR_ERR(pages); - if (use_dma_api) { - ret = dma_map_sgtable(vgdev->vdev->dev.parent, - shmem->pages, DMA_TO_DEVICE, 0); - if (ret) - return ret; - *nents = shmem->mapped = shmem->pages->nents; - } else { - *nents = shmem->pages->orig_nents; - } + if (use_dma_api) + *nents = pages->nents; + else + *nents = pages->orig_nents; *ents = kvmalloc_array(*nents, sizeof(struct virtio_gpu_mem_entry), @@ -194,13 +160,13 @@ static int virtio_gpu_object_shmem_init(struct virtio_gpu_device *vgdev, } if (use_dma_api) { - for_each_sgtable_dma_sg(shmem->pages, sg, si) { + for_each_sgtable_dma_sg(pages, sg, si) { (*ents)[si].addr = cpu_to_le64(sg_dma_address(sg)); (*ents)[si].length = cpu_to_le32(sg_dma_len(sg)); (*ents)[si].padding = 0; } } else { - for_each_sgtable_sg(shmem->pages, sg, si) { + for_each_sgtable_sg(pages, sg, si) { (*ents)[si].addr = cpu_to_le64(sg_phys(sg)); (*ents)[si].length = cpu_to_le32(sg->length); (*ents)[si].padding = 0; diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c index 2edf31806b74..06566e44307d 100644 --- a/drivers/gpu/drm/virtio/virtgpu_vq.c +++ b/drivers/gpu/drm/virtio/virtgpu_vq.c @@ -593,11 +593,10 @@ void virtio_gpu_cmd_transfer_to_host_2d(struct virtio_gpu_device *vgdev, struct virtio_gpu_transfer_to_host_2d *cmd_p; struct virtio_gpu_vbuffer *vbuf; bool use_dma_api = !virtio_has_dma_quirk(vgdev->vdev); - struct virtio_gpu_object_shmem *shmem = to_virtio_gpu_shmem(bo); if (virtio_gpu_is_shmem(bo) && use_dma_api) - dma_sync_sgtable_for_device(vgdev->vdev->dev.parent, - shmem->pages, DMA_TO_DEVICE); + dma_sync_sgtable_for_device(&vgdev->vdev->dev, + bo->base.sgt, DMA_TO_DEVICE); cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); memset(cmd_p, 0, sizeof(*cmd_p)); @@ -1017,11 +1016,9 @@ void virtio_gpu_cmd_transfer_to_host_3d(struct virtio_gpu_device *vgdev, struct virtio_gpu_vbuffer *vbuf; bool use_dma_api = !virtio_has_dma_quirk(vgdev->vdev); - if (virtio_gpu_is_shmem(bo) && use_dma_api) { - struct virtio_gpu_object_shmem *shmem = to_virtio_gpu_shmem(bo); - dma_sync_sgtable_for_device(vgdev->vdev->dev.parent, - shmem->pages, DMA_TO_DEVICE); - } + if (virtio_gpu_is_shmem(bo) && use_dma_api) + dma_sync_sgtable_for_device(&vgdev->vdev->dev, + bo->base.sgt, DMA_TO_DEVICE); cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); memset(cmd_p, 0, sizeof(*cmd_p)); -- 2.35.3
WARNING: multiple messages have this Message-ID (diff)
From: Dmitry Osipenko <dmitry.osipenko@collabora.com> To: "David Airlie" <airlied@linux.ie>, "Gerd Hoffmann" <kraxel@redhat.com>, "Gurchetan Singh" <gurchetansingh@chromium.org>, "Chia-I Wu" <olvaffe@gmail.com>, "Daniel Vetter" <daniel@ffwll.ch>, "Daniel Almeida" <daniel.almeida@collabora.com>, "Gert Wollny" <gert.wollny@collabora.com>, "Gustavo Padovan" <gustavo.padovan@collabora.com>, "Daniel Stone" <daniel@fooishbar.org>, "Tomeu Vizoso" <tomeu.vizoso@collabora.com>, "Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>, "Maxime Ripard" <mripard@kernel.org>, "Thomas Zimmermann" <tzimmermann@suse.de>, "Rob Herring" <robh@kernel.org>, "Steven Price" <steven.price@arm.com>, "Alyssa Rosenzweig" <alyssa.rosenzweig@collabora.com>, "Rob Clark" <robdclark@gmail.com>, "Emil Velikov" <emil.l.velikov@gmail.com>, "Robin Murphy" <robin.murphy@arm.com>, "Qiang Yu" <yuq825@gmail.com>, "Sumit Semwal" <sumit.semwal@linaro.org>, "Christian König" <christian.koenig@amd.com>, "Pan, Xinhui" <Xinhui.Pan@amd.com>, "Thierry Reding" <thierry.reding@gmail.com>, "Tomasz Figa" <tfiga@chromium.org>, "Marek Szyprowski" <m.szyprowski@samsung.com>, "Mauro Carvalho Chehab" <mchehab@kernel.org>, "Alex Deucher" <alexander.deucher@amd.com>, "Jani Nikula" <jani.nikula@linux.intel.com>, "Joonas Lahtinen" <joonas.lahtinen@linux.intel.com>, "Rodrigo Vivi" <rodrigo.vivi@intel.com>, "Tvrtko Ursulin" <tvrtko.ursulin@linux.intel.com> Cc: intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, virtualization@lists.linux-foundation.org, linaro-mm-sig@lists.linaro.org, amd-gfx@lists.freedesktop.org, Dmitry Osipenko <dmitry.osipenko@collabora.com>, linux-tegra@vger.kernel.org, Dmitry Osipenko <digetx@gmail.com>, kernel@collabora.com, linux-media@vger.kernel.org Subject: [PATCH v6 13/22] drm/virtio: Improve DMA API usage for shmem BOs Date: Fri, 27 May 2022 02:50:31 +0300 [thread overview] Message-ID: <20220526235040.678984-14-dmitry.osipenko@collabora.com> (raw) In-Reply-To: <20220526235040.678984-1-dmitry.osipenko@collabora.com> DRM API requires the DRM's driver to be backed with the device that can be used for generic DMA operations. The VirtIO-GPU device can't perform DMA operations if it uses PCI transport because PCI device driver creates a virtual VirtIO-GPU device that isn't associated with the PCI. Use PCI's GPU device for the DRM's device instead of the VirtIO-GPU device and drop DMA-related hacks from the VirtIO-GPU driver. Signed-off-by: Dmitry Osipenko <dmitry.osipenko@collabora.com> --- drivers/gpu/drm/virtio/virtgpu_drv.c | 51 ++++++---------------- drivers/gpu/drm/virtio/virtgpu_drv.h | 5 +-- drivers/gpu/drm/virtio/virtgpu_kms.c | 7 ++-- drivers/gpu/drm/virtio/virtgpu_object.c | 56 +++++-------------------- drivers/gpu/drm/virtio/virtgpu_vq.c | 13 +++--- 5 files changed, 32 insertions(+), 100 deletions(-) diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.c b/drivers/gpu/drm/virtio/virtgpu_drv.c index 5f25a8d15464..0141b7df97ec 100644 --- a/drivers/gpu/drm/virtio/virtgpu_drv.c +++ b/drivers/gpu/drm/virtio/virtgpu_drv.c @@ -46,12 +46,11 @@ static int virtio_gpu_modeset = -1; MODULE_PARM_DESC(modeset, "Disable/Enable modesetting"); module_param_named(modeset, virtio_gpu_modeset, int, 0400); -static int virtio_gpu_pci_quirk(struct drm_device *dev, struct virtio_device *vdev) +static int virtio_gpu_pci_quirk(struct drm_device *dev) { - struct pci_dev *pdev = to_pci_dev(vdev->dev.parent); + struct pci_dev *pdev = to_pci_dev(dev->dev); const char *pname = dev_name(&pdev->dev); bool vga = (pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA; - char unique[20]; int ret; DRM_INFO("pci: %s detected at %s\n", @@ -63,39 +62,7 @@ static int virtio_gpu_pci_quirk(struct drm_device *dev, struct virtio_device *vd return ret; } - /* - * Normally the drm_dev_set_unique() call is done by core DRM. - * The following comment covers, why virtio cannot rely on it. - * - * Unlike the other virtual GPU drivers, virtio abstracts the - * underlying bus type by using struct virtio_device. - * - * Hence the dev_is_pci() check, used in core DRM, will fail - * and the unique returned will be the virtio_device "virtio0", - * while a "pci:..." one is required. - * - * A few other ideas were considered: - * - Extend the dev_is_pci() check [in drm_set_busid] to - * consider virtio. - * Seems like a bigger hack than what we have already. - * - * - Point drm_device::dev to the parent of the virtio_device - * Semantic changes: - * * Using the wrong device for i2c, framebuffer_alloc and - * prime import. - * Visual changes: - * * Helpers such as DRM_DEV_ERROR, dev_info, drm_printer, - * will print the wrong information. - * - * We could address the latter issues, by introducing - * drm_device::bus_dev, ... which would be used solely for this. - * - * So for the moment keep things as-is, with a bulky comment - * for the next person who feels like removing this - * drm_dev_set_unique() quirk. - */ - snprintf(unique, sizeof(unique), "pci:%s", pname); - return drm_dev_set_unique(dev, unique); + return 0; } static int virtio_gpu_probe(struct virtio_device *vdev) @@ -109,18 +76,24 @@ static int virtio_gpu_probe(struct virtio_device *vdev) if (virtio_gpu_modeset == 0) return -EINVAL; - dev = drm_dev_alloc(&driver, &vdev->dev); + /* + * The virtio-gpu device is a virtual device that doesn't have DMA + * ops assigned to it, nor DMA mask set and etc. Its parent device + * is actual GPU device we want to use it for the DRM's device in + * order to benefit from using generic DRM APIs. + */ + dev = drm_dev_alloc(&driver, vdev->dev.parent); if (IS_ERR(dev)) return PTR_ERR(dev); vdev->priv = dev; if (!strcmp(vdev->dev.parent->bus->name, "pci")) { - ret = virtio_gpu_pci_quirk(dev, vdev); + ret = virtio_gpu_pci_quirk(dev); if (ret) goto err_free; } - ret = virtio_gpu_init(dev); + ret = virtio_gpu_init(vdev, dev); if (ret) goto err_free; diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h index 0a194aaad419..b2d93cb12ebf 100644 --- a/drivers/gpu/drm/virtio/virtgpu_drv.h +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h @@ -100,8 +100,6 @@ struct virtio_gpu_object { struct virtio_gpu_object_shmem { struct virtio_gpu_object base; - struct sg_table *pages; - uint32_t mapped; }; struct virtio_gpu_object_vram { @@ -214,7 +212,6 @@ struct virtio_gpu_drv_cap_cache { }; struct virtio_gpu_device { - struct device *dev; struct drm_device *ddev; struct virtio_device *vdev; @@ -282,7 +279,7 @@ extern struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS]; void virtio_gpu_create_context(struct drm_device *dev, struct drm_file *file); /* virtgpu_kms.c */ -int virtio_gpu_init(struct drm_device *dev); +int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev); void virtio_gpu_deinit(struct drm_device *dev); void virtio_gpu_release(struct drm_device *dev); int virtio_gpu_driver_open(struct drm_device *dev, struct drm_file *file); diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c index 3313b92db531..0d1e3eb61bee 100644 --- a/drivers/gpu/drm/virtio/virtgpu_kms.c +++ b/drivers/gpu/drm/virtio/virtgpu_kms.c @@ -110,7 +110,7 @@ static void virtio_gpu_get_capsets(struct virtio_gpu_device *vgdev, vgdev->num_capsets = num_capsets; } -int virtio_gpu_init(struct drm_device *dev) +int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev) { static vq_callback_t *callbacks[] = { virtio_gpu_ctrl_ack, virtio_gpu_cursor_ack @@ -123,7 +123,7 @@ int virtio_gpu_init(struct drm_device *dev) u32 num_scanouts, num_capsets; int ret = 0; - if (!virtio_has_feature(dev_to_virtio(dev->dev), VIRTIO_F_VERSION_1)) + if (!virtio_has_feature(vdev, VIRTIO_F_VERSION_1)) return -ENODEV; vgdev = kzalloc(sizeof(struct virtio_gpu_device), GFP_KERNEL); @@ -132,8 +132,7 @@ int virtio_gpu_init(struct drm_device *dev) vgdev->ddev = dev; dev->dev_private = vgdev; - vgdev->vdev = dev_to_virtio(dev->dev); - vgdev->dev = dev->dev; + vgdev->vdev = vdev; spin_lock_init(&vgdev->display_info_lock); spin_lock_init(&vgdev->resource_export_lock); diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c index 18f70ef6b4d0..8d7728181de0 100644 --- a/drivers/gpu/drm/virtio/virtgpu_object.c +++ b/drivers/gpu/drm/virtio/virtgpu_object.c @@ -67,21 +67,6 @@ void virtio_gpu_cleanup_object(struct virtio_gpu_object *bo) virtio_gpu_resource_id_put(vgdev, bo->hw_res_handle); if (virtio_gpu_is_shmem(bo)) { - struct virtio_gpu_object_shmem *shmem = to_virtio_gpu_shmem(bo); - - if (shmem->pages) { - if (shmem->mapped) { - dma_unmap_sgtable(vgdev->vdev->dev.parent, - shmem->pages, DMA_TO_DEVICE, 0); - shmem->mapped = 0; - } - - sg_free_table(shmem->pages); - kfree(shmem->pages); - shmem->pages = NULL; - drm_gem_shmem_unpin(&bo->base); - } - drm_gem_shmem_free(&bo->base); } else if (virtio_gpu_is_vram(bo)) { struct virtio_gpu_object_vram *vram = to_virtio_gpu_vram(bo); @@ -153,37 +138,18 @@ static int virtio_gpu_object_shmem_init(struct virtio_gpu_device *vgdev, unsigned int *nents) { bool use_dma_api = !virtio_has_dma_quirk(vgdev->vdev); - struct virtio_gpu_object_shmem *shmem = to_virtio_gpu_shmem(bo); struct scatterlist *sg; - int si, ret; + struct sg_table *pages; + int si; - ret = drm_gem_shmem_pin(&bo->base); - if (ret < 0) - return -EINVAL; - - /* - * virtio_gpu uses drm_gem_shmem_get_sg_table instead of - * drm_gem_shmem_get_pages_sgt because virtio has it's own set of - * dma-ops. This is discouraged for other drivers, but should be fine - * since virtio_gpu doesn't support dma-buf import from other devices. - */ - shmem->pages = drm_gem_shmem_get_sg_table(&bo->base); - ret = PTR_ERR_OR_ZERO(shmem->pages); - if (ret) { - drm_gem_shmem_unpin(&bo->base); - shmem->pages = NULL; - return ret; - } + pages = drm_gem_shmem_get_pages_sgt(&bo->base); + if (IS_ERR(pages)) + return PTR_ERR(pages); - if (use_dma_api) { - ret = dma_map_sgtable(vgdev->vdev->dev.parent, - shmem->pages, DMA_TO_DEVICE, 0); - if (ret) - return ret; - *nents = shmem->mapped = shmem->pages->nents; - } else { - *nents = shmem->pages->orig_nents; - } + if (use_dma_api) + *nents = pages->nents; + else + *nents = pages->orig_nents; *ents = kvmalloc_array(*nents, sizeof(struct virtio_gpu_mem_entry), @@ -194,13 +160,13 @@ static int virtio_gpu_object_shmem_init(struct virtio_gpu_device *vgdev, } if (use_dma_api) { - for_each_sgtable_dma_sg(shmem->pages, sg, si) { + for_each_sgtable_dma_sg(pages, sg, si) { (*ents)[si].addr = cpu_to_le64(sg_dma_address(sg)); (*ents)[si].length = cpu_to_le32(sg_dma_len(sg)); (*ents)[si].padding = 0; } } else { - for_each_sgtable_sg(shmem->pages, sg, si) { + for_each_sgtable_sg(pages, sg, si) { (*ents)[si].addr = cpu_to_le64(sg_phys(sg)); (*ents)[si].length = cpu_to_le32(sg->length); (*ents)[si].padding = 0; diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c index 2edf31806b74..06566e44307d 100644 --- a/drivers/gpu/drm/virtio/virtgpu_vq.c +++ b/drivers/gpu/drm/virtio/virtgpu_vq.c @@ -593,11 +593,10 @@ void virtio_gpu_cmd_transfer_to_host_2d(struct virtio_gpu_device *vgdev, struct virtio_gpu_transfer_to_host_2d *cmd_p; struct virtio_gpu_vbuffer *vbuf; bool use_dma_api = !virtio_has_dma_quirk(vgdev->vdev); - struct virtio_gpu_object_shmem *shmem = to_virtio_gpu_shmem(bo); if (virtio_gpu_is_shmem(bo) && use_dma_api) - dma_sync_sgtable_for_device(vgdev->vdev->dev.parent, - shmem->pages, DMA_TO_DEVICE); + dma_sync_sgtable_for_device(&vgdev->vdev->dev, + bo->base.sgt, DMA_TO_DEVICE); cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); memset(cmd_p, 0, sizeof(*cmd_p)); @@ -1017,11 +1016,9 @@ void virtio_gpu_cmd_transfer_to_host_3d(struct virtio_gpu_device *vgdev, struct virtio_gpu_vbuffer *vbuf; bool use_dma_api = !virtio_has_dma_quirk(vgdev->vdev); - if (virtio_gpu_is_shmem(bo) && use_dma_api) { - struct virtio_gpu_object_shmem *shmem = to_virtio_gpu_shmem(bo); - dma_sync_sgtable_for_device(vgdev->vdev->dev.parent, - shmem->pages, DMA_TO_DEVICE); - } + if (virtio_gpu_is_shmem(bo) && use_dma_api) + dma_sync_sgtable_for_device(&vgdev->vdev->dev, + bo->base.sgt, DMA_TO_DEVICE); cmd_p = virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); memset(cmd_p, 0, sizeof(*cmd_p)); -- 2.35.3
next prev parent reply other threads:[~2022-05-26 23:55 UTC|newest] Thread overview: 204+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-05-26 23:50 [PATCH v6 00/22] Add generic memory shrinker to VirtIO-GPU and Panfrost DRM drivers Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-05-26 23:50 ` [PATCH v6 01/22] drm/gem: Properly annotate WW context on drm_gem_lock_reservations() error Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-06-28 20:12 ` Thomas Hellström (Intel) 2022-06-28 20:12 ` Thomas Hellström (Intel) 2022-06-28 20:12 ` [Intel-gfx] " Thomas Hellström (Intel) 2022-06-29 8:23 ` Dmitry Osipenko 2022-06-29 8:23 ` [Intel-gfx] " Dmitry Osipenko 2022-06-29 8:23 ` Dmitry Osipenko 2022-05-26 23:50 ` [PATCH v6 02/22] drm/gem: Move mapping of imported dma-bufs to drm_gem_mmap_obj() Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-06-29 6:40 ` Thomas Hellström (Intel) 2022-06-29 6:40 ` [Intel-gfx] " Thomas Hellström (Intel) 2022-06-29 6:40 ` Thomas Hellström (Intel) 2022-06-29 8:22 ` Dmitry Osipenko 2022-06-29 8:22 ` [Intel-gfx] " Dmitry Osipenko 2022-06-29 8:22 ` Dmitry Osipenko 2022-06-29 8:22 ` Dmitry Osipenko 2022-06-29 8:43 ` Thomas Hellström (Intel) 2022-06-29 8:43 ` Thomas Hellström (Intel) 2022-06-29 8:43 ` [Intel-gfx] " Thomas Hellström (Intel) 2022-06-29 8:43 ` Thomas Hellström (Intel) 2022-06-29 23:06 ` Dmitry Osipenko 2022-06-29 23:06 ` [Intel-gfx] " Dmitry Osipenko 2022-06-29 23:06 ` Dmitry Osipenko 2022-06-29 23:06 ` Dmitry Osipenko 2022-07-04 12:33 ` [Linaro-mm-sig] " Christian König 2022-07-04 12:33 ` [Intel-gfx] " Christian König 2022-07-04 12:33 ` Christian König 2022-07-04 12:33 ` Christian König 2022-07-04 12:33 ` Christian König via Virtualization 2022-07-04 22:44 ` Dmitry Osipenko 2022-07-04 22:44 ` [Intel-gfx] " Dmitry Osipenko 2022-07-04 22:44 ` Dmitry Osipenko 2022-07-04 22:44 ` Dmitry Osipenko 2022-05-26 23:50 ` [PATCH v6 03/22] drm/panfrost: Put mapping instead of shmem obj on panfrost_mmu_map_fault_addr() error Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-05-26 23:50 ` [PATCH v6 04/22] drm/panfrost: Fix shrinker list corruption by madvise IOCTL Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-05-27 15:56 ` Alyssa Rosenzweig 2022-05-27 15:56 ` [Intel-gfx] " Alyssa Rosenzweig 2022-05-27 15:56 ` Alyssa Rosenzweig 2022-05-27 15:56 ` Alyssa Rosenzweig 2022-05-30 9:41 ` Steven Price 2022-05-30 9:41 ` [Intel-gfx] " Steven Price 2022-05-30 9:41 ` Steven Price 2022-05-26 23:50 ` [PATCH v6 05/22] drm/virtio: Correct drm_gem_shmem_get_sg_table() error handling Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-05-26 23:50 ` [PATCH v6 06/22] drm/virtio: Check whether transferred 2D BO is shmem Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-05-26 23:50 ` [PATCH v6 07/22] drm/virtio: Unlock reservations on virtio_gpu_object_shmem_init() error Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-05-26 23:50 ` [PATCH v6 08/22] drm/virtio: Unlock reservations on dma_resv_reserve_fences() error Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-06-29 6:43 ` Thomas Hellström (Intel) 2022-06-29 6:43 ` [Intel-gfx] " Thomas Hellström (Intel) 2022-06-29 6:43 ` Thomas Hellström (Intel) 2022-05-26 23:50 ` [PATCH v6 09/22] drm/virtio: Use appropriate atomic state in virtio_gpu_plane_cleanup_fb() Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-05-26 23:50 ` [PATCH v6 10/22] drm/shmem-helper: Add missing vunmap on error Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-05-26 23:50 ` [PATCH v6 11/22] drm/shmem-helper: Correct doc-comment of drm_gem_shmem_get_sg_table() Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-05-26 23:50 ` [PATCH v6 12/22] drm/virtio: Simplify error handling of virtio_gpu_object_create() Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko [this message] 2022-05-26 23:50 ` [PATCH v6 13/22] drm/virtio: Improve DMA API usage for shmem BOs Dmitry Osipenko 2022-05-26 23:50 ` [PATCH v6 14/22] dma-buf: Introduce new locking convention Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-05-27 2:37 ` kernel test robot 2022-05-27 12:44 ` Dmitry Osipenko 2022-05-27 12:44 ` Dmitry Osipenko 2022-05-30 6:50 ` Christian König via Virtualization 2022-05-30 6:50 ` [Intel-gfx] " Christian König 2022-05-30 6:50 ` Christian König 2022-05-30 6:50 ` Christian König 2022-05-30 13:26 ` Dmitry Osipenko 2022-05-30 13:26 ` Dmitry Osipenko 2022-05-30 13:41 ` Christian König via Virtualization 2022-05-30 13:41 ` Christian König 2022-05-30 13:41 ` [Intel-gfx] " Christian König 2022-05-30 13:41 ` Christian König 2022-05-30 13:57 ` Dmitry Osipenko 2022-05-30 13:57 ` Dmitry Osipenko 2022-06-28 21:26 ` Thomas Hellström (Intel) 2022-06-28 21:26 ` Thomas Hellström (Intel) 2022-06-28 21:26 ` [Intel-gfx] " Thomas Hellström (Intel) 2022-07-01 10:43 ` Dmitry Osipenko 2022-07-01 10:43 ` [Intel-gfx] " Dmitry Osipenko 2022-07-01 10:43 ` Dmitry Osipenko 2022-07-04 22:38 ` Dmitry Osipenko 2022-07-04 22:38 ` [Intel-gfx] " Dmitry Osipenko 2022-07-04 22:38 ` Dmitry Osipenko 2022-07-04 22:38 ` Dmitry Osipenko 2022-07-05 10:52 ` Dmitry Osipenko 2022-07-05 10:52 ` [Intel-gfx] " Dmitry Osipenko 2022-07-05 10:52 ` Dmitry Osipenko 2022-07-05 10:52 ` Dmitry Osipenko 2022-05-26 23:50 ` [PATCH v6 15/22] drm/shmem-helper: Don't use vmap_use_count for dma-bufs Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-05-26 23:50 ` [PATCH v6 16/22] drm/shmem-helper: Use reservation lock Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-05-26 23:50 ` [PATCH v6 17/22] drm/shmem-helper: Add generic memory shrinker Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-06-05 16:47 ` Daniel Vetter 2022-06-05 16:47 ` Daniel Vetter 2022-06-05 16:47 ` [Intel-gfx] " Daniel Vetter 2022-06-05 16:47 ` Daniel Vetter 2022-06-05 16:47 ` Daniel Vetter 2022-06-05 18:32 ` [Intel-gfx] " Rob Clark 2022-06-05 18:32 ` Rob Clark 2022-06-05 18:32 ` Rob Clark 2022-06-05 18:32 ` Rob Clark 2022-06-05 18:32 ` Rob Clark 2022-06-05 18:45 ` Daniel Vetter 2022-06-05 18:45 ` Daniel Vetter 2022-06-05 18:45 ` [Intel-gfx] " Daniel Vetter 2022-06-05 18:45 ` Daniel Vetter 2022-06-05 18:45 ` Daniel Vetter 2022-06-06 10:57 ` Christian König 2022-06-06 10:57 ` Christian König 2022-06-06 10:57 ` Christian König 2022-06-06 10:57 ` Christian König 2022-06-07 15:33 ` Dmitry Osipenko 2022-06-07 15:33 ` Dmitry Osipenko 2022-06-07 15:33 ` Dmitry Osipenko 2022-06-19 17:53 ` Rob Clark 2022-06-19 17:53 ` Rob Clark 2022-06-19 17:53 ` [Intel-gfx] " Rob Clark 2022-06-19 17:53 ` Rob Clark 2022-06-19 17:53 ` Rob Clark 2022-06-20 14:08 ` Dmitry Osipenko 2022-06-20 14:08 ` Dmitry Osipenko 2022-06-20 14:08 ` Dmitry Osipenko 2022-06-20 15:18 ` Rob Clark 2022-06-20 15:18 ` Rob Clark 2022-06-20 15:18 ` Rob Clark 2022-06-20 15:18 ` [Intel-gfx] " Rob Clark 2022-06-20 15:18 ` Rob Clark 2022-06-24 20:23 ` Daniel Vetter 2022-06-24 20:23 ` Daniel Vetter 2022-06-24 20:23 ` [Intel-gfx] " Daniel Vetter 2022-06-24 20:23 ` Daniel Vetter 2022-06-24 20:23 ` Daniel Vetter 2022-06-24 20:21 ` Daniel Vetter 2022-06-24 20:21 ` Daniel Vetter 2022-06-24 20:21 ` [Intel-gfx] " Daniel Vetter 2022-06-24 20:21 ` Daniel Vetter 2022-06-24 20:21 ` Daniel Vetter 2022-06-20 15:37 ` Rob Clark 2022-06-20 15:37 ` Rob Clark 2022-06-20 15:37 ` Rob Clark 2022-06-20 15:37 ` Rob Clark 2022-06-20 15:37 ` [Intel-gfx] " Rob Clark 2022-06-21 16:39 ` Dmitry Osipenko 2022-06-21 16:39 ` Dmitry Osipenko 2022-06-21 16:39 ` [Intel-gfx] " Dmitry Osipenko 2022-06-21 16:39 ` Dmitry Osipenko 2022-05-26 23:50 ` [PATCH v6 18/22] drm/gem: Add drm_gem_pin_unlocked() Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-05-26 23:50 ` [PATCH v6 19/22] drm/virtio: Support memory shrinking Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-05-26 23:50 ` [PATCH v6 20/22] drm/virtio: Use dev_is_pci() Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-05-26 23:50 ` [PATCH v6 21/22] drm/virtio: Return proper error codes instead of -1 Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-05-26 23:50 ` [PATCH v6 22/22] drm/panfrost: Switch to generic memory shrinker Dmitry Osipenko 2022-05-26 23:50 ` Dmitry Osipenko 2022-05-27 11:48 ` Alyssa Rosenzweig 2022-05-27 11:48 ` [Intel-gfx] " Alyssa Rosenzweig 2022-05-27 11:48 ` Alyssa Rosenzweig 2022-05-27 11:48 ` Alyssa Rosenzweig 2022-06-10 14:40 ` [PATCH v6 00/22] Add generic memory shrinker to VirtIO-GPU and Panfrost DRM drivers Dmitry Osipenko 2022-06-10 14:40 ` Dmitry Osipenko 2022-06-10 14:40 ` Dmitry Osipenko 2022-06-28 12:31 ` Robin Murphy 2022-06-28 12:31 ` Robin Murphy 2022-06-28 12:31 ` Robin Murphy 2022-06-28 12:50 ` Dmitry Osipenko 2022-06-28 12:50 ` [Intel-gfx] " Dmitry Osipenko 2022-06-28 12:50 ` Dmitry Osipenko 2022-06-28 16:48 ` Rob Clark 2022-06-28 16:48 ` Rob Clark 2022-06-28 16:48 ` Rob Clark 2022-06-28 16:48 ` [Intel-gfx] " Rob Clark 2022-06-28 16:48 ` Rob Clark 2022-06-28 23:11 ` Dmitry Osipenko 2022-06-28 23:11 ` [Intel-gfx] " Dmitry Osipenko 2022-06-28 23:11 ` Dmitry Osipenko 2022-06-28 23:11 ` Dmitry Osipenko 2022-06-28 12:51 ` Dmitry Osipenko 2022-06-28 12:51 ` [Intel-gfx] " Dmitry Osipenko 2022-06-28 12:51 ` Dmitry Osipenko 2022-06-28 13:11 ` Dmitry Osipenko 2022-06-28 13:11 ` [Intel-gfx] " Dmitry Osipenko 2022-06-28 13:11 ` Dmitry Osipenko 2022-05-27 12:21 [PATCH v6 14/22] dma-buf: Introduce new locking convention kernel test robot 2022-05-30 7:05 ` Dan Carpenter 2022-05-27 14:03 [PATCH v6 17/22] drm/shmem-helper: Add generic memory shrinker kernel test robot 2022-05-30 7:09 ` [kbuild] " Dan Carpenter 2022-05-30 7:09 ` Dan Carpenter 2022-05-30 13:27 ` Dmitry Osipenko 2022-05-30 13:27 ` Dmitry Osipenko
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=20220526235040.678984-14-dmitry.osipenko@collabora.com \ --to=dmitry.osipenko@collabora.com \ --cc=Xinhui.Pan@amd.com \ --cc=airlied@linux.ie \ --cc=alexander.deucher@amd.com \ --cc=alyssa.rosenzweig@collabora.com \ --cc=amd-gfx@lists.freedesktop.org \ --cc=christian.koenig@amd.com \ --cc=daniel.almeida@collabora.com \ --cc=daniel@ffwll.ch \ --cc=daniel@fooishbar.org \ --cc=digetx@gmail.com \ --cc=dri-devel@lists.freedesktop.org \ --cc=emil.l.velikov@gmail.com \ --cc=gert.wollny@collabora.com \ --cc=gurchetansingh@chromium.org \ --cc=gustavo.padovan@collabora.com \ --cc=intel-gfx@lists.freedesktop.org \ --cc=jani.nikula@linux.intel.com \ --cc=joonas.lahtinen@linux.intel.com \ --cc=kernel@collabora.com \ --cc=kraxel@redhat.com \ --cc=linaro-mm-sig@lists.linaro.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-media@vger.kernel.org \ --cc=linux-tegra@vger.kernel.org \ --cc=m.szyprowski@samsung.com \ --cc=maarten.lankhorst@linux.intel.com \ --cc=mchehab@kernel.org \ --cc=mripard@kernel.org \ --cc=olvaffe@gmail.com \ --cc=robdclark@gmail.com \ --cc=robh@kernel.org \ --cc=robin.murphy@arm.com \ --cc=rodrigo.vivi@intel.com \ --cc=steven.price@arm.com \ --cc=sumit.semwal@linaro.org \ --cc=tfiga@chromium.org \ --cc=thierry.reding@gmail.com \ --cc=tomeu.vizoso@collabora.com \ --cc=tvrtko.ursulin@linux.intel.com \ --cc=tzimmermann@suse.de \ --cc=virtualization@lists.linux-foundation.org \ --cc=yuq825@gmail.com \ /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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.