hc
2024-05-10 cde9070d9970eef1f7ec2360586c802a16230ad8
kernel/drivers/gpu/drm/gma500/framebuffer.c
....@@ -1,45 +1,33 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /**************************************************************************
23 * Copyright (c) 2007-2011, Intel Corporation.
34 * All Rights Reserved.
45 *
5
- * This program is free software; you can redistribute it and/or modify it
6
- * under the terms and conditions of the GNU General Public License,
7
- * version 2, as published by the Free Software Foundation.
8
- *
9
- * This program is distributed in the hope 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, write to the Free Software Foundation, Inc.,
16
- * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
17
- *
186 **************************************************************************/
197
20
-#include <linux/module.h>
21
-#include <linux/kernel.h>
22
-#include <linux/errno.h>
23
-#include <linux/string.h>
24
-#include <linux/pfn_t.h>
25
-#include <linux/mm.h>
26
-#include <linux/tty.h>
27
-#include <linux/slab.h>
28
-#include <linux/delay.h>
29
-#include <linux/init.h>
308 #include <linux/console.h>
9
+#include <linux/delay.h>
10
+#include <linux/errno.h>
11
+#include <linux/init.h>
12
+#include <linux/kernel.h>
13
+#include <linux/mm.h>
14
+#include <linux/module.h>
15
+#include <linux/pfn_t.h>
16
+#include <linux/slab.h>
17
+#include <linux/string.h>
18
+#include <linux/tty.h>
3119
32
-#include <drm/drmP.h>
3320 #include <drm/drm.h>
3421 #include <drm/drm_crtc.h>
3522 #include <drm/drm_fb_helper.h>
23
+#include <drm/drm_fourcc.h>
3624 #include <drm/drm_gem_framebuffer_helper.h>
3725
38
-#include "psb_drv.h"
39
-#include "psb_intel_reg.h"
40
-#include "psb_intel_drv.h"
4126 #include "framebuffer.h"
4227 #include "gtt.h"
28
+#include "psb_drv.h"
29
+#include "psb_intel_drv.h"
30
+#include "psb_intel_reg.h"
4331
4432 static const struct drm_framebuffer_funcs psb_fb_funcs = {
4533 .destroy = drm_gem_fb_destroy,
....@@ -52,8 +40,8 @@
5240 unsigned blue, unsigned transp,
5341 struct fb_info *info)
5442 {
55
- struct psb_fbdev *fbdev = info->par;
56
- struct drm_framebuffer *fb = fbdev->psb_fb_helper.fb;
43
+ struct drm_fb_helper *fb_helper = info->par;
44
+ struct drm_framebuffer *fb = fb_helper->fb;
5745 uint32_t v;
5846
5947 if (!fb)
....@@ -89,10 +77,10 @@
8977
9078 static int psbfb_pan(struct fb_var_screeninfo *var, struct fb_info *info)
9179 {
92
- struct psb_fbdev *fbdev = info->par;
93
- struct psb_framebuffer *psbfb = &fbdev->pfb;
94
- struct drm_device *dev = psbfb->base.dev;
95
- struct gtt_range *gtt = to_gtt_range(psbfb->base.obj[0]);
80
+ struct drm_fb_helper *fb_helper = info->par;
81
+ struct drm_framebuffer *fb = fb_helper->fb;
82
+ struct drm_device *dev = fb->dev;
83
+ struct gtt_range *gtt = to_gtt_range(fb->obj[0]);
9684
9785 /*
9886 * We have to poke our nose in here. The core fb code assumes
....@@ -111,10 +99,10 @@
11199 static vm_fault_t psbfb_vm_fault(struct vm_fault *vmf)
112100 {
113101 struct vm_area_struct *vma = vmf->vma;
114
- struct psb_framebuffer *psbfb = vma->vm_private_data;
115
- struct drm_device *dev = psbfb->base.dev;
102
+ struct drm_framebuffer *fb = vma->vm_private_data;
103
+ struct drm_device *dev = fb->dev;
116104 struct drm_psb_private *dev_priv = dev->dev_private;
117
- struct gtt_range *gtt = to_gtt_range(psbfb->base.obj[0]);
105
+ struct gtt_range *gtt = to_gtt_range(fb->obj[0]);
118106 int page_num;
119107 int i;
120108 unsigned long address;
....@@ -157,28 +145,26 @@
157145
158146 static int psbfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
159147 {
160
- struct psb_fbdev *fbdev = info->par;
161
- struct psb_framebuffer *psbfb = &fbdev->pfb;
148
+ struct drm_fb_helper *fb_helper = info->par;
149
+ struct drm_framebuffer *fb = fb_helper->fb;
162150
163151 if (vma->vm_pgoff != 0)
164152 return -EINVAL;
165153 if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
166154 return -EINVAL;
167155
168
- if (!psbfb->addr_space)
169
- psbfb->addr_space = vma->vm_file->f_mapping;
170156 /*
171157 * If this is a GEM object then info->screen_base is the virtual
172158 * kernel remapping of the object. FIXME: Review if this is
173159 * suitable for our mmap work
174160 */
175161 vma->vm_ops = &psbfb_vm_ops;
176
- vma->vm_private_data = (void *)psbfb;
162
+ vma->vm_private_data = (void *)fb;
177163 vma->vm_flags |= VM_IO | VM_MIXEDMAP | VM_DONTEXPAND | VM_DONTDUMP;
178164 return 0;
179165 }
180166
181
-static struct fb_ops psbfb_ops = {
167
+static const struct fb_ops psbfb_ops = {
182168 .owner = THIS_MODULE,
183169 DRM_FB_HELPER_DEFAULT_OPS,
184170 .fb_setcolreg = psbfb_setcolreg,
....@@ -189,7 +175,7 @@
189175 .fb_sync = psbfb_sync,
190176 };
191177
192
-static struct fb_ops psbfb_roll_ops = {
178
+static const struct fb_ops psbfb_roll_ops = {
193179 .owner = THIS_MODULE,
194180 DRM_FB_HELPER_DEFAULT_OPS,
195181 .fb_setcolreg = psbfb_setcolreg,
....@@ -200,7 +186,7 @@
200186 .fb_mmap = psbfb_mmap,
201187 };
202188
203
-static struct fb_ops psbfb_unaccel_ops = {
189
+static const struct fb_ops psbfb_unaccel_ops = {
204190 .owner = THIS_MODULE,
205191 DRM_FB_HELPER_DEFAULT_OPS,
206192 .fb_setcolreg = psbfb_setcolreg,
....@@ -221,9 +207,9 @@
221207 * 0 on success or an error code if we fail.
222208 */
223209 static int psb_framebuffer_init(struct drm_device *dev,
224
- struct psb_framebuffer *fb,
210
+ struct drm_framebuffer *fb,
225211 const struct drm_mode_fb_cmd2 *mode_cmd,
226
- struct gtt_range *gt)
212
+ struct drm_gem_object *obj)
227213 {
228214 const struct drm_format_info *info;
229215 int ret;
....@@ -232,16 +218,16 @@
232218 * Reject unknown formats, YUV formats, and formats with more than
233219 * 4 bytes per pixel.
234220 */
235
- info = drm_format_info(mode_cmd->pixel_format);
221
+ info = drm_get_format_info(dev, mode_cmd);
236222 if (!info || !info->depth || info->cpp[0] > 4)
237223 return -EINVAL;
238224
239225 if (mode_cmd->pitches[0] & 63)
240226 return -EINVAL;
241227
242
- drm_helper_mode_fill_fb_struct(dev, &fb->base, mode_cmd);
243
- fb->base.obj[0] = &gt->gem;
244
- ret = drm_framebuffer_init(dev, &fb->base, &psb_fb_funcs);
228
+ drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
229
+ fb->obj[0] = obj;
230
+ ret = drm_framebuffer_init(dev, fb, &psb_fb_funcs);
245231 if (ret) {
246232 dev_err(dev->dev, "framebuffer init failed: %d\n", ret);
247233 return ret;
....@@ -264,21 +250,21 @@
264250 static struct drm_framebuffer *psb_framebuffer_create
265251 (struct drm_device *dev,
266252 const struct drm_mode_fb_cmd2 *mode_cmd,
267
- struct gtt_range *gt)
253
+ struct drm_gem_object *obj)
268254 {
269
- struct psb_framebuffer *fb;
255
+ struct drm_framebuffer *fb;
270256 int ret;
271257
272258 fb = kzalloc(sizeof(*fb), GFP_KERNEL);
273259 if (!fb)
274260 return ERR_PTR(-ENOMEM);
275261
276
- ret = psb_framebuffer_init(dev, fb, mode_cmd, gt);
262
+ ret = psb_framebuffer_init(dev, fb, mode_cmd, obj);
277263 if (ret) {
278264 kfree(fb);
279265 return ERR_PTR(ret);
280266 }
281
- return &fb->base;
267
+ return fb;
282268 }
283269
284270 /**
....@@ -312,14 +298,13 @@
312298 *
313299 * Create a framebuffer to the specifications provided
314300 */
315
-static int psbfb_create(struct psb_fbdev *fbdev,
301
+static int psbfb_create(struct drm_fb_helper *fb_helper,
316302 struct drm_fb_helper_surface_size *sizes)
317303 {
318
- struct drm_device *dev = fbdev->psb_fb_helper.dev;
304
+ struct drm_device *dev = fb_helper->dev;
319305 struct drm_psb_private *dev_priv = dev->dev_private;
320306 struct fb_info *info;
321307 struct drm_framebuffer *fb;
322
- struct psb_framebuffer *psbfb = &fbdev->pfb;
323308 struct drm_mode_fb_cmd2 mode_cmd;
324309 int size;
325310 int ret;
....@@ -384,28 +369,22 @@
384369
385370 memset(dev_priv->vram_addr + backing->offset, 0, size);
386371
387
- info = drm_fb_helper_alloc_fbi(&fbdev->psb_fb_helper);
372
+ info = drm_fb_helper_alloc_fbi(fb_helper);
388373 if (IS_ERR(info)) {
389374 ret = PTR_ERR(info);
390375 goto out;
391376 }
392
- info->par = fbdev;
393377
394378 mode_cmd.pixel_format = drm_mode_legacy_fb_format(bpp, depth);
395379
396
- ret = psb_framebuffer_init(dev, psbfb, &mode_cmd, backing);
397
- if (ret)
380
+ fb = psb_framebuffer_create(dev, &mode_cmd, &backing->gem);
381
+ if (IS_ERR(fb)) {
382
+ ret = PTR_ERR(fb);
398383 goto out;
384
+ }
399385
400
- fb = &psbfb->base;
401
- psbfb->fbdev = info;
386
+ fb_helper->fb = fb;
402387
403
- fbdev->psb_fb_helper.fb = fb;
404
-
405
- drm_fb_helper_fill_fix(info, fb->pitches[0], fb->format->depth);
406
- strcpy(info->fix.id, "psbdrmfb");
407
-
408
- info->flags = FBINFO_DEFAULT;
409388 if (dev_priv->ops->accel_2d && pitch_lines > 8) /* 2D engine */
410389 info->fbops = &psbfb_ops;
411390 else if (gtt_roll) { /* GTT rolling seems best */
....@@ -428,16 +407,14 @@
428407 info->apertures->ranges[0].size = dev_priv->gtt.stolen_size;
429408 }
430409
431
- drm_fb_helper_fill_var(info, &fbdev->psb_fb_helper,
432
- sizes->fb_width, sizes->fb_height);
410
+ drm_fb_helper_fill_info(info, fb_helper, sizes);
433411
434412 info->fix.mmio_start = pci_resource_start(dev->pdev, 0);
435413 info->fix.mmio_len = pci_resource_len(dev->pdev, 0);
436414
437415 /* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */
438416
439
- dev_dbg(dev->dev, "allocated %dx%d fb\n",
440
- psbfb->base.width, psbfb->base.height);
417
+ dev_dbg(dev->dev, "allocated %dx%d fb\n", fb->width, fb->height);
441418
442419 return 0;
443420 out:
....@@ -457,8 +434,8 @@
457434 (struct drm_device *dev, struct drm_file *filp,
458435 const struct drm_mode_fb_cmd2 *cmd)
459436 {
460
- struct gtt_range *r;
461437 struct drm_gem_object *obj;
438
+ struct drm_framebuffer *fb;
462439
463440 /*
464441 * Find the GEM object and thus the gtt range object that is
....@@ -469,16 +446,17 @@
469446 return ERR_PTR(-ENOENT);
470447
471448 /* Let the core code do all the work */
472
- r = container_of(obj, struct gtt_range, gem);
473
- return psb_framebuffer_create(dev, cmd, r);
449
+ fb = psb_framebuffer_create(dev, cmd, obj);
450
+ if (IS_ERR(fb))
451
+ drm_gem_object_put(obj);
452
+
453
+ return fb;
474454 }
475455
476
-static int psbfb_probe(struct drm_fb_helper *helper,
456
+static int psbfb_probe(struct drm_fb_helper *fb_helper,
477457 struct drm_fb_helper_surface_size *sizes)
478458 {
479
- struct psb_fbdev *psb_fbdev =
480
- container_of(helper, struct psb_fbdev, psb_fb_helper);
481
- struct drm_device *dev = psb_fbdev->psb_fb_helper.dev;
459
+ struct drm_device *dev = fb_helper->dev;
482460 struct drm_psb_private *dev_priv = dev->dev_private;
483461 unsigned int fb_size;
484462 int bytespp;
....@@ -499,66 +477,64 @@
499477 sizes->surface_depth = 16;
500478 }
501479
502
- return psbfb_create(psb_fbdev, sizes);
480
+ return psbfb_create(fb_helper, sizes);
503481 }
504482
505483 static const struct drm_fb_helper_funcs psb_fb_helper_funcs = {
506484 .fb_probe = psbfb_probe,
507485 };
508486
509
-static int psb_fbdev_destroy(struct drm_device *dev, struct psb_fbdev *fbdev)
487
+static int psb_fbdev_destroy(struct drm_device *dev,
488
+ struct drm_fb_helper *fb_helper)
510489 {
511
- struct psb_framebuffer *psbfb = &fbdev->pfb;
490
+ struct drm_framebuffer *fb = fb_helper->fb;
512491
513
- drm_fb_helper_unregister_fbi(&fbdev->psb_fb_helper);
492
+ drm_fb_helper_unregister_fbi(fb_helper);
514493
515
- drm_fb_helper_fini(&fbdev->psb_fb_helper);
516
- drm_framebuffer_unregister_private(&psbfb->base);
517
- drm_framebuffer_cleanup(&psbfb->base);
494
+ drm_fb_helper_fini(fb_helper);
495
+ drm_framebuffer_unregister_private(fb);
496
+ drm_framebuffer_cleanup(fb);
518497
519
- if (psbfb->base.obj[0])
520
- drm_gem_object_put_unlocked(psbfb->base.obj[0]);
498
+ if (fb->obj[0])
499
+ drm_gem_object_put(fb->obj[0]);
500
+ kfree(fb);
501
+
521502 return 0;
522503 }
523504
524505 int psb_fbdev_init(struct drm_device *dev)
525506 {
526
- struct psb_fbdev *fbdev;
507
+ struct drm_fb_helper *fb_helper;
527508 struct drm_psb_private *dev_priv = dev->dev_private;
528509 int ret;
529510
530
- fbdev = kzalloc(sizeof(struct psb_fbdev), GFP_KERNEL);
531
- if (!fbdev) {
511
+ fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
512
+ if (!fb_helper) {
532513 dev_err(dev->dev, "no memory\n");
533514 return -ENOMEM;
534515 }
535516
536
- dev_priv->fbdev = fbdev;
517
+ dev_priv->fb_helper = fb_helper;
537518
538
- drm_fb_helper_prepare(dev, &fbdev->psb_fb_helper, &psb_fb_helper_funcs);
519
+ drm_fb_helper_prepare(dev, fb_helper, &psb_fb_helper_funcs);
539520
540
- ret = drm_fb_helper_init(dev, &fbdev->psb_fb_helper,
541
- INTELFB_CONN_LIMIT);
521
+ ret = drm_fb_helper_init(dev, fb_helper);
542522 if (ret)
543523 goto free;
544
-
545
- ret = drm_fb_helper_single_add_all_connectors(&fbdev->psb_fb_helper);
546
- if (ret)
547
- goto fini;
548524
549525 /* disable all the possible outputs/crtcs before entering KMS mode */
550526 drm_helper_disable_unused_functions(dev);
551527
552
- ret = drm_fb_helper_initial_config(&fbdev->psb_fb_helper, 32);
528
+ ret = drm_fb_helper_initial_config(fb_helper, 32);
553529 if (ret)
554530 goto fini;
555531
556532 return 0;
557533
558534 fini:
559
- drm_fb_helper_fini(&fbdev->psb_fb_helper);
535
+ drm_fb_helper_fini(fb_helper);
560536 free:
561
- kfree(fbdev);
537
+ kfree(fb_helper);
562538 return ret;
563539 }
564540
....@@ -566,12 +542,12 @@
566542 {
567543 struct drm_psb_private *dev_priv = dev->dev_private;
568544
569
- if (!dev_priv->fbdev)
545
+ if (!dev_priv->fb_helper)
570546 return;
571547
572
- psb_fbdev_destroy(dev, dev_priv->fbdev);
573
- kfree(dev_priv->fbdev);
574
- dev_priv->fbdev = NULL;
548
+ psb_fbdev_destroy(dev, dev_priv->fb_helper);
549
+ kfree(dev_priv->fb_helper);
550
+ dev_priv->fb_helper = NULL;
575551 }
576552
577553 static const struct drm_mode_config_funcs psb_mode_funcs = {
....@@ -606,31 +582,31 @@
606582 break;
607583 case INTEL_OUTPUT_SDVO:
608584 crtc_mask = dev_priv->ops->sdvo_mask;
609
- clone_mask = (1 << INTEL_OUTPUT_SDVO);
585
+ clone_mask = 0;
610586 break;
611587 case INTEL_OUTPUT_LVDS:
612
- crtc_mask = dev_priv->ops->lvds_mask;
613
- clone_mask = (1 << INTEL_OUTPUT_LVDS);
588
+ crtc_mask = dev_priv->ops->lvds_mask;
589
+ clone_mask = 0;
614590 break;
615591 case INTEL_OUTPUT_MIPI:
616592 crtc_mask = (1 << 0);
617
- clone_mask = (1 << INTEL_OUTPUT_MIPI);
593
+ clone_mask = 0;
618594 break;
619595 case INTEL_OUTPUT_MIPI2:
620596 crtc_mask = (1 << 2);
621
- clone_mask = (1 << INTEL_OUTPUT_MIPI2);
597
+ clone_mask = 0;
622598 break;
623599 case INTEL_OUTPUT_HDMI:
624
- crtc_mask = dev_priv->ops->hdmi_mask;
600
+ crtc_mask = dev_priv->ops->hdmi_mask;
625601 clone_mask = (1 << INTEL_OUTPUT_HDMI);
626602 break;
627603 case INTEL_OUTPUT_DISPLAYPORT:
628604 crtc_mask = (1 << 0) | (1 << 1);
629
- clone_mask = (1 << INTEL_OUTPUT_DISPLAYPORT);
605
+ clone_mask = 0;
630606 break;
631607 case INTEL_OUTPUT_EDP:
632608 crtc_mask = (1 << 1);
633
- clone_mask = (1 << INTEL_OUTPUT_EDP);
609
+ clone_mask = 0;
634610 }
635611 encoder->possible_crtcs = crtc_mask;
636612 encoder->possible_clones =