1 // SPDX-License-Identifier: GPL-2.0+
2
3 #include "vkms_drv.h"
4 #include <drm/drm_plane_helper.h>
5 #include <drm/drm_atomic_helper.h>
6
7 static const struct drm_plane_funcs vkms_plane_funcs = {
8 .update_plane = drm_atomic_helper_update_plane,
9 .disable_plane = drm_atomic_helper_disable_plane,
10 .destroy = drm_plane_cleanup,
11 .reset = drm_atomic_helper_plane_reset,
12 .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
13 .atomic_destroy_state = drm_atomic_helper_plane_destroy_state,
14 };
15
vkms_primary_plane_update(struct drm_plane * plane,struct drm_plane_state * old_state)16 static void vkms_primary_plane_update(struct drm_plane *plane,
17 struct drm_plane_state *old_state)
18 {
19 }
20
21 static const struct drm_plane_helper_funcs vkms_primary_helper_funcs = {
22 .atomic_update = vkms_primary_plane_update,
23 };
24
vkms_plane_init(struct vkms_device * vkmsdev)25 struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev)
26 {
27 struct drm_device *dev = &vkmsdev->drm;
28 struct drm_plane *plane;
29 const u32 *formats;
30 int ret, nformats;
31
32 plane = kzalloc(sizeof(*plane), GFP_KERNEL);
33 if (!plane)
34 return ERR_PTR(-ENOMEM);
35
36 formats = vkms_formats;
37 nformats = ARRAY_SIZE(vkms_formats);
38
39 ret = drm_universal_plane_init(dev, plane, 0,
40 &vkms_plane_funcs,
41 formats, nformats,
42 NULL, DRM_PLANE_TYPE_PRIMARY, NULL);
43 if (ret) {
44 kfree(plane);
45 return ERR_PTR(ret);
46 }
47
48 drm_plane_helper_add(plane, &vkms_primary_helper_funcs);
49
50 return plane;
51 }
52