Pass array of pages of the scanout buffer [1] to shmem BO, allowing drm_panic to work even if the BO is not vmapped.
[1] https://lore.kernel.org/all/20250407140138.162383-3-jfale...@redhat.com/ Signed-off-by: Jocelyn Falempe <jfale...@redhat.com> Signed-off-by: Ryosuke Yasuoka <ryasu...@redhat.com> --- drivers/gpu/drm/virtio/virtgpu_plane.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/virtio/virtgpu_plane.c b/drivers/gpu/drm/virtio/virtgpu_plane.c index a6f5a78f436a..2ff57d559c86 100644 --- a/drivers/gpu/drm/virtio/virtgpu_plane.c +++ b/drivers/gpu/drm/virtio/virtgpu_plane.c @@ -500,11 +500,19 @@ static int virtio_drm_get_scanout_buffer(struct drm_plane *plane, bo = gem_to_virtio_gpu_obj(plane->state->fb->obj[0]); - /* Only support mapped shmem bo */ - if (virtio_gpu_is_vram(bo) || bo->base.base.import_attach || !bo->base.vaddr) + if (virtio_gpu_is_vram(bo) || bo->base.base.import_attach) return -ENODEV; - iosys_map_set_vaddr(&sb->map[0], bo->base.vaddr); + if (bo->base.vaddr) + iosys_map_set_vaddr(&sb->map[0], bo->base.vaddr); + else { + struct drm_gem_shmem_object *shmem = &bo->base; + + if (!shmem->pages) + return -ENODEV; + /* map scanout buffer later */ + sb->pages = shmem->pages; + } sb->format = plane->state->fb->format; sb->height = plane->state->fb->height; base-commit: e7bb7d44c3b97aea1f0e354c6499900154ac67f2 -- 2.49.0