diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2018-09-21 09:47:03 -0400 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2018-09-25 08:49:49 -0400 |
commit | 42fd9e6c29b39481fd4ef31715c6f0c427966f20 (patch) | |
tree | 8f697ec360f12ce1925c3b790be4576f39ca1631 | |
parent | 86351de023dd3607b1b519f58c11154b217ec031 (diff) |
drm/virtio: fix DRM_FORMAT_* handling
Use DRM_FORMAT_HOST_XRGB8888, so we are using the correct format code
on bigendian machines. Also set the quirk_addfb_prefer_host_byte_order
mode_config bit so drm_mode_addfb() asks for the correct format code.
Both DRM_FORMAT_* and VIRTIO_GPU_FORMAT_* are defined to be little
endian, so using a different mapping on bigendian machines is wrong.
It's there because of broken drm_mode_addfb() behavior. So with
drm_mode_addfb() being fixed we can fix this too.
While wading through the code I've noticed we have a little issue in
virtio: We attach a format to the bo when it is created
(DRM_IOCTL_MODE_CREATE_DUMB), not when we map it as framebuffer
(DRM_IOCTL_MODE_ADDFB). Easy way out: Support a single format only.
Pick DRM_FORMAT_HOST_XRGB8888, it is the only one actually used in
practice. Drop unused mappings in virtio_gpu_translate_format().
With this patch applied both ADDFB and ADDFB2 ioctls work correctly in
the virtio-gpu.ko driver on big endian machines. Without the patch only
ADDFB (which still seems to be used by the majority of userspace) works
correctly.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20180921134704.12826-6-kraxel@redhat.com
-rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_display.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_fb.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_gem.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_plane.c | 54 |
4 files changed, 13 insertions, 55 deletions
diff --git a/drivers/gpu/drm/virtio/virtgpu_display.c b/drivers/gpu/drm/virtio/virtgpu_display.c index 0379d6897659..8f8fed471e34 100644 --- a/drivers/gpu/drm/virtio/virtgpu_display.c +++ b/drivers/gpu/drm/virtio/virtgpu_display.c | |||
@@ -307,6 +307,10 @@ virtio_gpu_user_framebuffer_create(struct drm_device *dev, | |||
307 | struct virtio_gpu_framebuffer *virtio_gpu_fb; | 307 | struct virtio_gpu_framebuffer *virtio_gpu_fb; |
308 | int ret; | 308 | int ret; |
309 | 309 | ||
310 | if (mode_cmd->pixel_format != DRM_FORMAT_HOST_XRGB8888 && | ||
311 | mode_cmd->pixel_format != DRM_FORMAT_HOST_ARGB8888) | ||
312 | return ERR_PTR(-ENOENT); | ||
313 | |||
310 | /* lookup object associated with res handle */ | 314 | /* lookup object associated with res handle */ |
311 | obj = drm_gem_object_lookup(file_priv, mode_cmd->handles[0]); | 315 | obj = drm_gem_object_lookup(file_priv, mode_cmd->handles[0]); |
312 | if (!obj) | 316 | if (!obj) |
@@ -355,6 +359,7 @@ int virtio_gpu_modeset_init(struct virtio_gpu_device *vgdev) | |||
355 | int i; | 359 | int i; |
356 | 360 | ||
357 | drm_mode_config_init(vgdev->ddev); | 361 | drm_mode_config_init(vgdev->ddev); |
362 | vgdev->ddev->mode_config.quirk_addfb_prefer_host_byte_order = true; | ||
358 | vgdev->ddev->mode_config.funcs = &virtio_gpu_mode_funcs; | 363 | vgdev->ddev->mode_config.funcs = &virtio_gpu_mode_funcs; |
359 | vgdev->ddev->mode_config.helper_private = &virtio_mode_config_helpers; | 364 | vgdev->ddev->mode_config.helper_private = &virtio_mode_config_helpers; |
360 | 365 | ||
diff --git a/drivers/gpu/drm/virtio/virtgpu_fb.c b/drivers/gpu/drm/virtio/virtgpu_fb.c index 3364b0970dd2..e1e41efabec1 100644 --- a/drivers/gpu/drm/virtio/virtgpu_fb.c +++ b/drivers/gpu/drm/virtio/virtgpu_fb.c | |||
@@ -226,7 +226,7 @@ static int virtio_gpufb_create(struct drm_fb_helper *helper, | |||
226 | mode_cmd.width = sizes->surface_width; | 226 | mode_cmd.width = sizes->surface_width; |
227 | mode_cmd.height = sizes->surface_height; | 227 | mode_cmd.height = sizes->surface_height; |
228 | mode_cmd.pitches[0] = mode_cmd.width * 4; | 228 | mode_cmd.pitches[0] = mode_cmd.width * 4; |
229 | mode_cmd.pixel_format = drm_mode_legacy_fb_format(32, 24); | 229 | mode_cmd.pixel_format = DRM_FORMAT_HOST_XRGB8888; |
230 | 230 | ||
231 | format = virtio_gpu_translate_format(mode_cmd.pixel_format); | 231 | format = virtio_gpu_translate_format(mode_cmd.pixel_format); |
232 | if (format == 0) | 232 | if (format == 0) |
diff --git a/drivers/gpu/drm/virtio/virtgpu_gem.c b/drivers/gpu/drm/virtio/virtgpu_gem.c index 0f2768eacaee..82c817f37cf7 100644 --- a/drivers/gpu/drm/virtio/virtgpu_gem.c +++ b/drivers/gpu/drm/virtio/virtgpu_gem.c | |||
@@ -90,7 +90,10 @@ int virtio_gpu_mode_dumb_create(struct drm_file *file_priv, | |||
90 | uint32_t resid; | 90 | uint32_t resid; |
91 | uint32_t format; | 91 | uint32_t format; |
92 | 92 | ||
93 | pitch = args->width * ((args->bpp + 1) / 8); | 93 | if (args->bpp != 32) |
94 | return -EINVAL; | ||
95 | |||
96 | pitch = args->width * 4; | ||
94 | args->size = pitch * args->height; | 97 | args->size = pitch * args->height; |
95 | args->size = ALIGN(args->size, PAGE_SIZE); | 98 | args->size = ALIGN(args->size, PAGE_SIZE); |
96 | 99 | ||
@@ -99,7 +102,7 @@ int virtio_gpu_mode_dumb_create(struct drm_file *file_priv, | |||
99 | if (ret) | 102 | if (ret) |
100 | goto fail; | 103 | goto fail; |
101 | 104 | ||
102 | format = virtio_gpu_translate_format(DRM_FORMAT_XRGB8888); | 105 | format = virtio_gpu_translate_format(DRM_FORMAT_HOST_XRGB8888); |
103 | virtio_gpu_resource_id_get(vgdev, &resid); | 106 | virtio_gpu_resource_id_get(vgdev, &resid); |
104 | virtio_gpu_cmd_create_resource(vgdev, resid, format, | 107 | virtio_gpu_cmd_create_resource(vgdev, resid, format, |
105 | args->width, args->height); | 108 | args->width, args->height); |
diff --git a/drivers/gpu/drm/virtio/virtgpu_plane.c b/drivers/gpu/drm/virtio/virtgpu_plane.c index 682a977d68c1..a9f4ae7d4483 100644 --- a/drivers/gpu/drm/virtio/virtgpu_plane.c +++ b/drivers/gpu/drm/virtio/virtgpu_plane.c | |||
@@ -28,22 +28,11 @@ | |||
28 | #include <drm/drm_atomic_helper.h> | 28 | #include <drm/drm_atomic_helper.h> |
29 | 29 | ||
30 | static const uint32_t virtio_gpu_formats[] = { | 30 | static const uint32_t virtio_gpu_formats[] = { |
31 | DRM_FORMAT_XRGB8888, | 31 | DRM_FORMAT_HOST_XRGB8888, |
32 | DRM_FORMAT_ARGB8888, | ||
33 | DRM_FORMAT_BGRX8888, | ||
34 | DRM_FORMAT_BGRA8888, | ||
35 | DRM_FORMAT_RGBX8888, | ||
36 | DRM_FORMAT_RGBA8888, | ||
37 | DRM_FORMAT_XBGR8888, | ||
38 | DRM_FORMAT_ABGR8888, | ||
39 | }; | 32 | }; |
40 | 33 | ||
41 | static const uint32_t virtio_gpu_cursor_formats[] = { | 34 | static const uint32_t virtio_gpu_cursor_formats[] = { |
42 | #ifdef __BIG_ENDIAN | 35 | DRM_FORMAT_HOST_ARGB8888, |
43 | DRM_FORMAT_BGRA8888, | ||
44 | #else | ||
45 | DRM_FORMAT_ARGB8888, | ||
46 | #endif | ||
47 | }; | 36 | }; |
48 | 37 | ||
49 | uint32_t virtio_gpu_translate_format(uint32_t drm_fourcc) | 38 | uint32_t virtio_gpu_translate_format(uint32_t drm_fourcc) |
@@ -51,32 +40,6 @@ uint32_t virtio_gpu_translate_format(uint32_t drm_fourcc) | |||
51 | uint32_t format; | 40 | uint32_t format; |
52 | 41 | ||
53 | switch (drm_fourcc) { | 42 | switch (drm_fourcc) { |
54 | #ifdef __BIG_ENDIAN | ||
55 | case DRM_FORMAT_XRGB8888: | ||
56 | format = VIRTIO_GPU_FORMAT_X8R8G8B8_UNORM; | ||
57 | break; | ||
58 | case DRM_FORMAT_ARGB8888: | ||
59 | format = VIRTIO_GPU_FORMAT_A8R8G8B8_UNORM; | ||
60 | break; | ||
61 | case DRM_FORMAT_BGRX8888: | ||
62 | format = VIRTIO_GPU_FORMAT_B8G8R8X8_UNORM; | ||
63 | break; | ||
64 | case DRM_FORMAT_BGRA8888: | ||
65 | format = VIRTIO_GPU_FORMAT_B8G8R8A8_UNORM; | ||
66 | break; | ||
67 | case DRM_FORMAT_RGBX8888: | ||
68 | format = VIRTIO_GPU_FORMAT_R8G8B8X8_UNORM; | ||
69 | break; | ||
70 | case DRM_FORMAT_RGBA8888: | ||
71 | format = VIRTIO_GPU_FORMAT_R8G8B8A8_UNORM; | ||
72 | break; | ||
73 | case DRM_FORMAT_XBGR8888: | ||
74 | format = VIRTIO_GPU_FORMAT_X8B8G8R8_UNORM; | ||
75 | break; | ||
76 | case DRM_FORMAT_ABGR8888: | ||
77 | format = VIRTIO_GPU_FORMAT_A8B8G8R8_UNORM; | ||
78 | break; | ||
79 | #else | ||
80 | case DRM_FORMAT_XRGB8888: | 43 | case DRM_FORMAT_XRGB8888: |
81 | format = VIRTIO_GPU_FORMAT_B8G8R8X8_UNORM; | 44 | format = VIRTIO_GPU_FORMAT_B8G8R8X8_UNORM; |
82 | break; | 45 | break; |
@@ -89,19 +52,6 @@ uint32_t virtio_gpu_translate_format(uint32_t drm_fourcc) | |||
89 | case DRM_FORMAT_BGRA8888: | 52 | case DRM_FORMAT_BGRA8888: |
90 | format = VIRTIO_GPU_FORMAT_A8R8G8B8_UNORM; | 53 | format = VIRTIO_GPU_FORMAT_A8R8G8B8_UNORM; |
91 | break; | 54 | break; |
92 | case DRM_FORMAT_RGBX8888: | ||
93 | format = VIRTIO_GPU_FORMAT_X8B8G8R8_UNORM; | ||
94 | break; | ||
95 | case DRM_FORMAT_RGBA8888: | ||
96 | format = VIRTIO_GPU_FORMAT_A8B8G8R8_UNORM; | ||
97 | break; | ||
98 | case DRM_FORMAT_XBGR8888: | ||
99 | format = VIRTIO_GPU_FORMAT_R8G8B8X8_UNORM; | ||
100 | break; | ||
101 | case DRM_FORMAT_ABGR8888: | ||
102 | format = VIRTIO_GPU_FORMAT_R8G8B8A8_UNORM; | ||
103 | break; | ||
104 | #endif | ||
105 | default: | 55 | default: |
106 | /* | 56 | /* |
107 | * This should not happen, we handle everything listed | 57 | * This should not happen, we handle everything listed |