forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/gpu/drm/tegra/fb.c
....@@ -1,20 +1,20 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright (C) 2012-2013 Avionic Design GmbH
34 * Copyright (C) 2012 NVIDIA CORPORATION. All rights reserved.
45 *
56 * Based on the KMS/FB CMA helpers
6
- * Copyright (C) 2012 Analog Device Inc.
7
- *
8
- * This program is free software; you can redistribute it and/or modify
9
- * it under the terms of the GNU General Public License version 2 as
10
- * published by the Free Software Foundation.
7
+ * Copyright (C) 2012 Analog Devices Inc.
118 */
129
1310 #include <linux/console.h>
1411
12
+#include <drm/drm_fourcc.h>
13
+#include <drm/drm_gem_framebuffer_helper.h>
14
+#include <drm/drm_modeset_helper.h>
15
+
1516 #include "drm.h"
1617 #include "gem.h"
17
-#include <drm/drm_gem_framebuffer_helper.h>
1818
1919 #ifdef CONFIG_DRM_FBDEV_EMULATION
2020 static inline struct tegra_fbdev *to_tegra_fbdev(struct drm_fb_helper *helper)
....@@ -130,18 +130,16 @@
130130 struct drm_file *file,
131131 const struct drm_mode_fb_cmd2 *cmd)
132132 {
133
- unsigned int hsub, vsub, i;
133
+ const struct drm_format_info *info = drm_get_format_info(drm, cmd);
134134 struct tegra_bo *planes[4];
135135 struct drm_gem_object *gem;
136136 struct drm_framebuffer *fb;
137
+ unsigned int i;
137138 int err;
138139
139
- hsub = drm_format_horz_chroma_subsampling(cmd->pixel_format);
140
- vsub = drm_format_vert_chroma_subsampling(cmd->pixel_format);
141
-
142
- for (i = 0; i < drm_format_num_planes(cmd->pixel_format); i++) {
143
- unsigned int width = cmd->width / (i ? hsub : 1);
144
- unsigned int height = cmd->height / (i ? vsub : 1);
140
+ for (i = 0; i < info->num_planes; i++) {
141
+ unsigned int width = cmd->width / (i ? info->hsub : 1);
142
+ unsigned int height = cmd->height / (i ? info->vsub : 1);
145143 unsigned int size, bpp;
146144
147145 gem = drm_gem_object_lookup(file, cmd->handles[i]);
....@@ -150,7 +148,7 @@
150148 goto unreference;
151149 }
152150
153
- bpp = drm_format_plane_cpp(cmd->pixel_format, i);
151
+ bpp = info->cpp[i];
154152
155153 size = (height - 1) * cmd->pitches[i] +
156154 width * bpp + cmd->offsets[i];
....@@ -173,7 +171,7 @@
173171
174172 unreference:
175173 while (i--)
176
- drm_gem_object_put_unlocked(&planes[i]->gem);
174
+ drm_gem_object_put(&planes[i]->gem);
177175
178176 return ERR_PTR(err);
179177 }
....@@ -194,7 +192,7 @@
194192 return __tegra_gem_mmap(&bo->gem, vma);
195193 }
196194
197
-static struct fb_ops tegra_fb_ops = {
195
+static const struct fb_ops tegra_fb_ops = {
198196 .owner = THIS_MODULE,
199197 DRM_FB_HELPER_DEFAULT_OPS,
200198 .fb_fillrect = drm_fb_helper_sys_fillrect,
....@@ -237,7 +235,7 @@
237235 info = drm_fb_helper_alloc_fbi(helper);
238236 if (IS_ERR(info)) {
239237 dev_err(drm->dev, "failed to allocate framebuffer info\n");
240
- drm_gem_object_put_unlocked(&bo->gem);
238
+ drm_gem_object_put(&bo->gem);
241239 return PTR_ERR(info);
242240 }
243241
....@@ -246,7 +244,7 @@
246244 err = PTR_ERR(fbdev->fb);
247245 dev_err(drm->dev, "failed to allocate DRM framebuffer: %d\n",
248246 err);
249
- drm_gem_object_put_unlocked(&bo->gem);
247
+ drm_gem_object_put(&bo->gem);
250248 return PTR_ERR(fbdev->fb);
251249 }
252250
....@@ -254,12 +252,9 @@
254252 helper->fb = fb;
255253 helper->fbdev = info;
256254
257
- info->par = helper;
258
- info->flags = FBINFO_FLAG_DEFAULT;
259255 info->fbops = &tegra_fb_ops;
260256
261
- drm_fb_helper_fill_fix(info, fb->pitches[0], fb->format->depth);
262
- drm_fb_helper_fill_var(info, helper, fb->width, fb->height);
257
+ drm_fb_helper_fill_info(info, helper, sizes);
263258
264259 offset = info->var.xoffset * bytes_per_pixel +
265260 info->var.yoffset * fb->pitches[0];
....@@ -274,10 +269,10 @@
274269 }
275270 }
276271
277
- drm->mode_config.fb_base = (resource_size_t)bo->paddr;
272
+ drm->mode_config.fb_base = (resource_size_t)bo->iova;
278273 info->screen_base = (void __iomem *)bo->vaddr + offset;
279274 info->screen_size = size;
280
- info->fix.smem_start = (unsigned long)(bo->paddr + offset);
275
+ info->fix.smem_start = (unsigned long)(bo->iova + offset);
281276 info->fix.smem_len = size;
282277
283278 return 0;
....@@ -319,17 +314,11 @@
319314 struct drm_device *drm = fbdev->base.dev;
320315 int err;
321316
322
- err = drm_fb_helper_init(drm, &fbdev->base, max_connectors);
317
+ err = drm_fb_helper_init(drm, &fbdev->base);
323318 if (err < 0) {
324319 dev_err(drm->dev, "failed to initialize DRM FB helper: %d\n",
325320 err);
326321 return err;
327
- }
328
-
329
- err = drm_fb_helper_single_add_all_connectors(&fbdev->base);
330
- if (err < 0) {
331
- dev_err(drm->dev, "failed to add connectors: %d\n", err);
332
- goto fini;
333322 }
334323
335324 err = drm_fb_helper_initial_config(&fbdev->base, preferred_bpp);
....@@ -356,7 +345,7 @@
356345 /* Undo the special mapping we made in fbdev probe. */
357346 if (bo && bo->pages) {
358347 vunmap(bo->vaddr);
359
- bo->vaddr = 0;
348
+ bo->vaddr = NULL;
360349 }
361350
362351 drm_framebuffer_remove(fbdev->fb);
....@@ -410,27 +399,5 @@
410399 struct tegra_drm *tegra = drm->dev_private;
411400
412401 tegra_fbdev_exit(tegra->fbdev);
413
-#endif
414
-}
415
-
416
-void tegra_drm_fb_suspend(struct drm_device *drm)
417
-{
418
-#ifdef CONFIG_DRM_FBDEV_EMULATION
419
- struct tegra_drm *tegra = drm->dev_private;
420
-
421
- console_lock();
422
- drm_fb_helper_set_suspend(&tegra->fbdev->base, 1);
423
- console_unlock();
424
-#endif
425
-}
426
-
427
-void tegra_drm_fb_resume(struct drm_device *drm)
428
-{
429
-#ifdef CONFIG_DRM_FBDEV_EMULATION
430
- struct tegra_drm *tegra = drm->dev_private;
431
-
432
- console_lock();
433
- drm_fb_helper_set_suspend(&tegra->fbdev->base, 0);
434
- console_unlock();
435402 #endif
436403 }