2 * Copyright (C) 2011 Samsung Electronics Co.Ltd
3 * Authors: Joonyoung Shim <jy0922.shim@samsung.com>
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version.
14 #include "exynos_drm.h"
15 #include "exynos_drm_crtc.h"
16 #include "exynos_drm_drv.h"
17 #include "exynos_drm_encoder.h"
20 struct drm_plane base
;
21 struct exynos_drm_overlay overlay
;
26 exynos_update_plane(struct drm_plane
*plane
, struct drm_crtc
*crtc
,
27 struct drm_framebuffer
*fb
, int crtc_x
, int crtc_y
,
28 unsigned int crtc_w
, unsigned int crtc_h
,
29 uint32_t src_x
, uint32_t src_y
,
30 uint32_t src_w
, uint32_t src_h
)
32 struct exynos_plane
*exynos_plane
=
33 container_of(plane
, struct exynos_plane
, base
);
34 struct exynos_drm_overlay
*overlay
= &exynos_plane
->overlay
;
35 struct exynos_drm_crtc_pos pos
;
36 unsigned int x
= src_x
>> 16;
37 unsigned int y
= src_y
>> 16;
40 DRM_DEBUG_KMS("[%d] %s\n", __LINE__
, __func__
);
42 memset(&pos
, 0, sizeof(struct exynos_drm_crtc_pos
));
51 /* TODO: scale feature */
52 ret
= exynos_drm_overlay_update(overlay
, fb
, &crtc
->mode
, &pos
);
56 exynos_drm_fn_encoder(crtc
, overlay
,
57 exynos_drm_encoder_crtc_mode_set
);
58 exynos_drm_fn_encoder(crtc
, &overlay
->zpos
,
59 exynos_drm_encoder_crtc_plane_commit
);
61 exynos_plane
->enabled
= true;
66 static int exynos_disable_plane(struct drm_plane
*plane
)
68 struct exynos_plane
*exynos_plane
=
69 container_of(plane
, struct exynos_plane
, base
);
70 struct exynos_drm_overlay
*overlay
= &exynos_plane
->overlay
;
72 DRM_DEBUG_KMS("[%d] %s\n", __LINE__
, __func__
);
74 if (!exynos_plane
->enabled
)
77 exynos_drm_fn_encoder(plane
->crtc
, &overlay
->zpos
,
78 exynos_drm_encoder_crtc_disable
);
80 exynos_plane
->enabled
= false;
81 exynos_plane
->overlay
.zpos
= DEFAULT_ZPOS
;
86 static void exynos_plane_destroy(struct drm_plane
*plane
)
88 struct exynos_plane
*exynos_plane
=
89 container_of(plane
, struct exynos_plane
, base
);
91 DRM_DEBUG_KMS("[%d] %s\n", __LINE__
, __func__
);
93 exynos_disable_plane(plane
);
94 drm_plane_cleanup(plane
);
98 static struct drm_plane_funcs exynos_plane_funcs
= {
99 .update_plane
= exynos_update_plane
,
100 .disable_plane
= exynos_disable_plane
,
101 .destroy
= exynos_plane_destroy
,
104 int exynos_plane_init(struct drm_device
*dev
, unsigned int nr
)
106 struct exynos_plane
*exynos_plane
;
107 uint32_t possible_crtcs
;
109 exynos_plane
= kzalloc(sizeof(struct exynos_plane
), GFP_KERNEL
);
113 /* all CRTCs are available */
114 possible_crtcs
= (1 << MAX_CRTC
) - 1;
116 exynos_plane
->overlay
.zpos
= DEFAULT_ZPOS
;
119 return drm_plane_init(dev
, &exynos_plane
->base
, possible_crtcs
,
120 &exynos_plane_funcs
, NULL
, 0, false);
123 int exynos_plane_set_zpos_ioctl(struct drm_device
*dev
, void *data
,
124 struct drm_file
*file_priv
)
126 struct drm_exynos_plane_set_zpos
*zpos_req
= data
;
127 struct drm_mode_object
*obj
;
128 struct drm_plane
*plane
;
129 struct exynos_plane
*exynos_plane
;
132 DRM_DEBUG_KMS("[%d] %s\n", __LINE__
, __func__
);
134 if (!drm_core_check_feature(dev
, DRIVER_MODESET
))
137 if (zpos_req
->zpos
< 0 || zpos_req
->zpos
>= MAX_PLANE
) {
138 if (zpos_req
->zpos
!= DEFAULT_ZPOS
) {
139 DRM_ERROR("zpos not within limits\n");
144 mutex_lock(&dev
->mode_config
.mutex
);
146 obj
= drm_mode_object_find(dev
, zpos_req
->plane_id
,
147 DRM_MODE_OBJECT_PLANE
);
149 DRM_DEBUG_KMS("Unknown plane ID %d\n",
155 plane
= obj_to_plane(obj
);
156 exynos_plane
= container_of(plane
, struct exynos_plane
, base
);
158 exynos_plane
->overlay
.zpos
= zpos_req
->zpos
;
161 mutex_unlock(&dev
->mode_config
.mutex
);