hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/gpu/drm/msm/msm_fb.c
....@@ -1,23 +1,15 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright (C) 2013 Red Hat
34 * Author: Rob Clark <robdclark@gmail.com>
4
- *
5
- * This program is free software; you can redistribute it and/or modify it
6
- * under the terms of the GNU General Public License version 2 as published by
7
- * the Free Software Foundation.
8
- *
9
- * This program is distributed in the hope that it will be useful, but WITHOUT
10
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
- * more details.
13
- *
14
- * You should have received a copy of the GNU General Public License along with
15
- * this program. If not, see <http://www.gnu.org/licenses/>.
165 */
176
187 #include <drm/drm_crtc.h>
19
-#include <drm/drm_crtc_helper.h>
8
+#include <drm/drm_damage_helper.h>
9
+#include <drm/drm_file.h>
10
+#include <drm/drm_fourcc.h>
2011 #include <drm/drm_gem_framebuffer_helper.h>
12
+#include <drm/drm_probe_helper.h>
2113
2214 #include "msm_drv.h"
2315 #include "msm_kms.h"
....@@ -35,6 +27,7 @@
3527 static const struct drm_framebuffer_funcs msm_framebuffer_funcs = {
3628 .create_handle = drm_gem_fb_create_handle,
3729 .destroy = drm_gem_fb_destroy,
30
+ .dirty = drm_atomic_helper_dirtyfb,
3831 };
3932
4033 #ifdef CONFIG_DEBUG_FS
....@@ -66,7 +59,7 @@
6659 uint64_t iova;
6760
6861 for (i = 0; i < n; i++) {
69
- ret = msm_gem_get_iova(fb->obj[i], aspace, &iova);
62
+ ret = msm_gem_get_and_pin_iova(fb->obj[i], aspace, &iova);
7063 DBG("FB[%u]: iova[%d]: %08llx (%d)", fb->base.id, i, iova, ret);
7164 if (ret)
7265 return ret;
....@@ -81,7 +74,7 @@
8174 int i, n = fb->format->num_planes;
8275
8376 for (i = 0; i < n; i++)
84
- msm_gem_put_iova(fb->obj[i], aspace);
77
+ msm_gem_unpin_iova(fb->obj[i], aspace);
8578 }
8679
8780 uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb,
....@@ -106,9 +99,11 @@
10699 struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
107100 struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd)
108101 {
102
+ const struct drm_format_info *info = drm_get_format_info(dev,
103
+ mode_cmd);
109104 struct drm_gem_object *bos[4] = {0};
110105 struct drm_framebuffer *fb;
111
- int ret, i, n = drm_format_num_planes(mode_cmd->pixel_format);
106
+ int ret, i, n = info->num_planes;
112107
113108 for (i = 0; i < n; i++) {
114109 bos[i] = drm_gem_object_lookup(file, mode_cmd->handles[i]);
....@@ -128,33 +123,31 @@
128123
129124 out_unref:
130125 for (i = 0; i < n; i++)
131
- drm_gem_object_put_unlocked(bos[i]);
126
+ drm_gem_object_put(bos[i]);
132127 return ERR_PTR(ret);
133128 }
134129
135130 static struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
136131 const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
137132 {
133
+ const struct drm_format_info *info = drm_get_format_info(dev,
134
+ mode_cmd);
138135 struct msm_drm_private *priv = dev->dev_private;
139136 struct msm_kms *kms = priv->kms;
140137 struct msm_framebuffer *msm_fb = NULL;
141138 struct drm_framebuffer *fb;
142139 const struct msm_format *format;
143140 int ret, i, n;
144
- unsigned int hsub, vsub;
145141
146142 DBG("create framebuffer: dev=%p, mode_cmd=%p (%dx%d@%4.4s)",
147143 dev, mode_cmd, mode_cmd->width, mode_cmd->height,
148144 (char *)&mode_cmd->pixel_format);
149145
150
- n = drm_format_num_planes(mode_cmd->pixel_format);
151
- hsub = drm_format_horz_chroma_subsampling(mode_cmd->pixel_format);
152
- vsub = drm_format_vert_chroma_subsampling(mode_cmd->pixel_format);
153
-
146
+ n = info->num_planes;
154147 format = kms->funcs->get_format(kms, mode_cmd->pixel_format,
155148 mode_cmd->modifier[0]);
156149 if (!format) {
157
- dev_err(dev->dev, "unsupported pixel format: %4.4s\n",
150
+ DRM_DEV_ERROR(dev->dev, "unsupported pixel format: %4.4s\n",
158151 (char *)&mode_cmd->pixel_format);
159152 ret = -EINVAL;
160153 goto fail;
....@@ -176,12 +169,12 @@
176169 }
177170
178171 for (i = 0; i < n; i++) {
179
- unsigned int width = mode_cmd->width / (i ? hsub : 1);
180
- unsigned int height = mode_cmd->height / (i ? vsub : 1);
172
+ unsigned int width = mode_cmd->width / (i ? info->hsub : 1);
173
+ unsigned int height = mode_cmd->height / (i ? info->vsub : 1);
181174 unsigned int min_size;
182175
183176 min_size = (height - 1) * mode_cmd->pitches[i]
184
- + width * drm_format_plane_cpp(mode_cmd->pixel_format, i)
177
+ + width * info->cpp[i]
185178 + mode_cmd->offsets[i];
186179
187180 if (bos[i]->size < min_size) {
....@@ -196,7 +189,7 @@
196189
197190 ret = drm_framebuffer_init(dev, fb, &msm_framebuffer_funcs);
198191 if (ret) {
199
- dev_err(dev->dev, "framebuffer init failed: %d\n", ret);
192
+ DRM_DEV_ERROR(dev->dev, "framebuffer init failed: %d\n", ret);
200193 goto fail;
201194 }
202195
....@@ -233,17 +226,19 @@
233226 bo = msm_gem_new(dev, size, MSM_BO_SCANOUT | MSM_BO_WC);
234227 }
235228 if (IS_ERR(bo)) {
236
- dev_err(dev->dev, "failed to allocate buffer object\n");
229
+ DRM_DEV_ERROR(dev->dev, "failed to allocate buffer object\n");
237230 return ERR_CAST(bo);
238231 }
239232
233
+ msm_gem_object_set_name(bo, "stolenfb");
234
+
240235 fb = msm_framebuffer_init(dev, &mode_cmd, &bo);
241236 if (IS_ERR(fb)) {
242
- dev_err(dev->dev, "failed to allocate fb\n");
237
+ DRM_DEV_ERROR(dev->dev, "failed to allocate fb\n");
243238 /* note: if fb creation failed, we can't rely on fb destroy
244239 * to unref the bo:
245240 */
246
- drm_gem_object_put_unlocked(bo);
241
+ drm_gem_object_put(bo);
247242 return ERR_CAST(fb);
248243 }
249244