GNU Linux-libre 4.19.295-gnu1
[releases.git] / drivers / gpu / drm / vkms / vkms_plane.c
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
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
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 }