1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
4 * Author:Mark Yao <mark.yao@rock-chips.com>
7 #include <linux/kernel.h>
10 #include <drm/drm_atomic.h>
11 #include <drm/drm_damage_helper.h>
12 #include <drm/drm_fb_helper.h>
13 #include <drm/drm_fourcc.h>
14 #include <drm/drm_gem_framebuffer_helper.h>
15 #include <drm/drm_probe_helper.h>
17 #include "rockchip_drm_drv.h"
18 #include "rockchip_drm_fb.h"
19 #include "rockchip_drm_gem.h"
21 static const struct drm_framebuffer_funcs rockchip_drm_fb_funcs
= {
22 .destroy
= drm_gem_fb_destroy
,
23 .create_handle
= drm_gem_fb_create_handle
,
24 .dirty
= drm_atomic_helper_dirtyfb
,
27 static struct drm_framebuffer
*
28 rockchip_fb_alloc(struct drm_device
*dev
, const struct drm_mode_fb_cmd2
*mode_cmd
,
29 struct drm_gem_object
**obj
, unsigned int num_planes
)
31 struct drm_framebuffer
*fb
;
35 fb
= kzalloc(sizeof(*fb
), GFP_KERNEL
);
37 return ERR_PTR(-ENOMEM
);
39 drm_helper_mode_fill_fb_struct(dev
, fb
, mode_cmd
);
41 for (i
= 0; i
< num_planes
; i
++)
44 ret
= drm_framebuffer_init(dev
, fb
, &rockchip_drm_fb_funcs
);
46 DRM_DEV_ERROR(dev
->dev
,
47 "Failed to initialize framebuffer: %d\n",
56 static const struct drm_mode_config_helper_funcs rockchip_mode_config_helpers
= {
57 .atomic_commit_tail
= drm_atomic_helper_commit_tail_rpm
,
60 static const struct drm_mode_config_funcs rockchip_drm_mode_config_funcs
= {
61 .fb_create
= drm_gem_fb_create_with_dirty
,
62 .output_poll_changed
= drm_fb_helper_output_poll_changed
,
63 .atomic_check
= drm_atomic_helper_check
,
64 .atomic_commit
= drm_atomic_helper_commit
,
67 struct drm_framebuffer
*
68 rockchip_drm_framebuffer_init(struct drm_device
*dev
,
69 const struct drm_mode_fb_cmd2
*mode_cmd
,
70 struct drm_gem_object
*obj
)
72 struct drm_framebuffer
*fb
;
74 fb
= rockchip_fb_alloc(dev
, mode_cmd
, &obj
, 1);
81 void rockchip_drm_mode_config_init(struct drm_device
*dev
)
83 dev
->mode_config
.min_width
= 0;
84 dev
->mode_config
.min_height
= 0;
87 * set max width and height as default value(4096x4096).
88 * this value would be used to check framebuffer size limitation
89 * at drm_mode_addfb().
91 dev
->mode_config
.max_width
= 4096;
92 dev
->mode_config
.max_height
= 4096;
94 dev
->mode_config
.funcs
= &rockchip_drm_mode_config_funcs
;
95 dev
->mode_config
.helper_private
= &rockchip_mode_config_helpers
;