2 * Copyright (C) 2015 Red Hat, Inc.
5 * Permission is hereby granted, free of charge, to any person obtaining
6 * a copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sublicense, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
13 * The above copyright notice and this permission notice (including the
14 * next paragraph) shall be included in all copies or substantial
15 * portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 #include "virtgpu_drv.h"
27 #include <drm/drm_plane_helper.h>
28 #include <drm/drm_atomic_helper.h>
30 static const uint32_t virtio_gpu_formats
[] = {
41 static void virtio_gpu_plane_destroy(struct drm_plane
*plane
)
46 static const struct drm_plane_funcs virtio_gpu_plane_funcs
= {
47 .update_plane
= drm_atomic_helper_update_plane
,
48 .disable_plane
= drm_atomic_helper_disable_plane
,
49 .destroy
= virtio_gpu_plane_destroy
,
50 .reset
= drm_atomic_helper_plane_reset
,
51 .atomic_duplicate_state
= drm_atomic_helper_plane_duplicate_state
,
52 .atomic_destroy_state
= drm_atomic_helper_plane_destroy_state
,
55 static int virtio_gpu_plane_atomic_check(struct drm_plane
*plane
,
56 struct drm_plane_state
*state
)
61 static void virtio_gpu_plane_atomic_update(struct drm_plane
*plane
,
62 struct drm_plane_state
*old_state
)
64 struct drm_device
*dev
= plane
->dev
;
65 struct virtio_gpu_device
*vgdev
= dev
->dev_private
;
66 struct virtio_gpu_output
*output
= drm_crtc_to_virtio_gpu_output(plane
->crtc
);
67 struct virtio_gpu_framebuffer
*vgfb
;
68 struct virtio_gpu_object
*bo
;
72 vgfb
= to_virtio_gpu_framebuffer(plane
->fb
);
73 bo
= gem_to_virtio_gpu_obj(vgfb
->obj
);
74 handle
= bo
->hw_res_handle
;
79 DRM_DEBUG("handle 0x%x, crtc %dx%d+%d+%d\n", handle
,
80 plane
->state
->crtc_w
, plane
->state
->crtc_h
,
81 plane
->state
->crtc_x
, plane
->state
->crtc_y
);
82 virtio_gpu_cmd_set_scanout(vgdev
, output
->index
, handle
,
86 plane
->state
->crtc_y
);
90 static const struct drm_plane_helper_funcs virtio_gpu_plane_helper_funcs
= {
91 .atomic_check
= virtio_gpu_plane_atomic_check
,
92 .atomic_update
= virtio_gpu_plane_atomic_update
,
95 struct drm_plane
*virtio_gpu_plane_init(struct virtio_gpu_device
*vgdev
,
98 struct drm_device
*dev
= vgdev
->ddev
;
99 struct drm_plane
*plane
;
102 plane
= kzalloc(sizeof(*plane
), GFP_KERNEL
);
104 return ERR_PTR(-ENOMEM
);
106 ret
= drm_universal_plane_init(dev
, plane
, 1 << index
,
107 &virtio_gpu_plane_funcs
,
109 ARRAY_SIZE(virtio_gpu_formats
),
110 DRM_PLANE_TYPE_PRIMARY
);
114 drm_plane_helper_add(plane
, &virtio_gpu_plane_helper_funcs
);