aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2018-09-21 09:47:03 -0400
committerGerd Hoffmann <kraxel@redhat.com>2018-09-25 08:49:49 -0400
commit42fd9e6c29b39481fd4ef31715c6f0c427966f20 (patch)
tree8f697ec360f12ce1925c3b790be4576f39ca1631
parent86351de023dd3607b1b519f58c11154b217ec031 (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.c5
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_fb.c2
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_gem.c7
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_plane.c54
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
30static const uint32_t virtio_gpu_formats[] = { 30static 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
41static const uint32_t virtio_gpu_cursor_formats[] = { 34static 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
49uint32_t virtio_gpu_translate_format(uint32_t drm_fourcc) 38uint32_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