diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c index 599868d0f199..5991a0f6483d 100644 --- a/drivers/gpu/drm/virtio/virtgpu_object.c +++ b/drivers/gpu/drm/virtio/virtgpu_object.c @@ -23,6 +23,7 @@ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include #include #include diff --git a/drivers/gpu/drm/virtio/virtgpu_plane.c b/drivers/gpu/drm/virtio/virtgpu_plane.c index 619fbb36fac3..2524fe51ae2b 100644 --- a/drivers/gpu/drm/virtio/virtgpu_plane.c +++ b/drivers/gpu/drm/virtio/virtgpu_plane.c @@ -23,6 +23,8 @@ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include + #include #include #include @@ -264,6 +266,26 @@ static int virtio_gpu_plane_atomic_check(struct drm_plane *plane, if (IS_ERR(crtc_state)) return PTR_ERR(crtc_state); + /* Ensure lmem objects from i915_ag are attached to dGPU backing CRTC */ + if (vgdev->output_cap_mask & (1lu << drm_crtc_index(new_plane_state->crtc))) { + for (int i = 0; i < DRM_FORMAT_MAX_PLANES; ++i) { + struct drm_gem_object *obj = new_plane_state->fb->obj[i]; + if (!obj) + break; + + if (!obj->import_attach) + return -EINVAL; + + if (!(obj->import_attach->flags & DMABUF_ATTACH_FLAG_LMEM)) { + drm_dbg(vgdev->ddev, "cannot use non-i915_ag " + "buffer for crtc %u, driver name %s\n", + drm_crtc_index(new_plane_state->crtc), + obj->dev->driver->name); + return -EINVAL; + } + } + } + if(vgdev->has_scaling && (new_plane_state->fb->format->format != DRM_FORMAT_C8)) { min_scale = 1; max_scale = 0x30000-1; @@ -322,7 +344,6 @@ static void virtio_gpu_resource_flush(struct drm_plane *plane, struct virtio_gpu_object *bo; struct virtio_gpu_object_array *objs = NULL; struct virtio_gpu_fence *fence = NULL; - int i; vgfb = to_virtio_gpu_framebuffer(plane->state->fb); bo = gem_to_virtio_gpu_obj(vgfb->base.obj[0]); diff --git a/drivers/gpu/drm/virtio/virtgpu_prime.c b/drivers/gpu/drm/virtio/virtgpu_prime.c index 0fc5392e5fec..cbd2b831efce 100644 --- a/drivers/gpu/drm/virtio/virtgpu_prime.c +++ b/drivers/gpu/drm/virtio/virtgpu_prime.c @@ -180,8 +180,9 @@ struct drm_gem_object *virtgpu_gem_prime_import(struct drm_device *dev, } spin_unlock(&dma_buf->name_lock); - attach = ____dma_buf_dynamic_attach(dma_buf, attach_dev, NULL, NULL, - p2p); + attach = ____dma_buf_dynamic_attach(dma_buf, attach_dev, + DMA_BUF_DRIVER_TYPE_ID_VIRTIO_GPU, + 0, NULL, NULL, p2p); if (IS_ERR(attach)) return ERR_CAST(attach);