forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/gpu/drm/nouveau/nouveau_fbcon.c
....@@ -37,10 +37,10 @@
3737 #include <linux/vga_switcheroo.h>
3838 #include <linux/console.h>
3939
40
-#include <drm/drmP.h>
4140 #include <drm/drm_crtc.h>
4241 #include <drm/drm_crtc_helper.h>
4342 #include <drm/drm_fb_helper.h>
43
+#include <drm/drm_fourcc.h>
4444 #include <drm/drm_atomic.h>
4545
4646 #include "nouveau_drv.h"
....@@ -205,7 +205,7 @@
205205 return 0;
206206 }
207207
208
-static struct fb_ops nouveau_fbcon_ops = {
208
+static const struct fb_ops nouveau_fbcon_ops = {
209209 .owner = THIS_MODULE,
210210 DRM_FB_HELPER_DEFAULT_OPS,
211211 .fb_open = nouveau_fbcon_open,
....@@ -216,7 +216,7 @@
216216 .fb_sync = nouveau_fbcon_sync,
217217 };
218218
219
-static struct fb_ops nouveau_fbcon_sw_ops = {
219
+static const struct fb_ops nouveau_fbcon_sw_ops = {
220220 .owner = THIS_MODULE,
221221 DRM_FB_HELPER_DEFAULT_OPS,
222222 .fb_open = nouveau_fbcon_open,
....@@ -256,13 +256,13 @@
256256 fbcon->helper.fbdev->flags |= FBINFO_HWACCEL_DISABLED;
257257 console_unlock();
258258 nouveau_channel_idle(drm->channel);
259
- nvif_object_fini(&fbcon->twod);
260
- nvif_object_fini(&fbcon->blit);
261
- nvif_object_fini(&fbcon->gdi);
262
- nvif_object_fini(&fbcon->patt);
263
- nvif_object_fini(&fbcon->rop);
264
- nvif_object_fini(&fbcon->clip);
265
- nvif_object_fini(&fbcon->surf2d);
259
+ nvif_object_dtor(&fbcon->twod);
260
+ nvif_object_dtor(&fbcon->blit);
261
+ nvif_object_dtor(&fbcon->gdi);
262
+ nvif_object_dtor(&fbcon->patt);
263
+ nvif_object_dtor(&fbcon->rop);
264
+ nvif_object_dtor(&fbcon->clip);
265
+ nvif_object_dtor(&fbcon->surf2d);
266266 }
267267 }
268268
....@@ -314,7 +314,7 @@
314314 struct nouveau_drm *drm = nouveau_drm(dev);
315315 struct nvif_device *device = &drm->client.device;
316316 struct fb_info *info;
317
- struct nouveau_framebuffer *fb;
317
+ struct drm_framebuffer *fb;
318318 struct nouveau_channel *chan;
319319 struct nouveau_bo *nvbo;
320320 struct drm_mode_fb_cmd2 mode_cmd = {};
....@@ -337,11 +337,11 @@
337337 goto out;
338338 }
339339
340
- ret = nouveau_framebuffer_new(dev, &mode_cmd, nvbo, &fb);
340
+ ret = nouveau_framebuffer_new(dev, &mode_cmd, &nvbo->bo.base, &fb);
341341 if (ret)
342342 goto out_unref;
343343
344
- ret = nouveau_bo_pin(nvbo, TTM_PL_FLAG_VRAM, false);
344
+ ret = nouveau_bo_pin(nvbo, NOUVEAU_GEM_DOMAIN_VRAM, false);
345345 if (ret) {
346346 NV_ERROR(drm, "failed to pin fb: %d\n", ret);
347347 goto out_unref;
....@@ -355,7 +355,7 @@
355355
356356 chan = nouveau_nofbaccel ? NULL : drm->channel;
357357 if (chan && device->info.family >= NV_DEVICE_INFO_V0_TESLA) {
358
- ret = nouveau_vma_new(nvbo, &drm->client.vmm, &fb->vma);
358
+ ret = nouveau_vma_new(nvbo, chan->vmm, &fbcon->vma);
359359 if (ret) {
360360 NV_ERROR(drm, "failed to map fb into chan: %d\n", ret);
361361 chan = NULL;
....@@ -367,32 +367,24 @@
367367 ret = PTR_ERR(info);
368368 goto out_unlock;
369369 }
370
- info->skip_vt_switch = 1;
371
-
372
- info->par = fbcon;
373370
374371 /* setup helper */
375
- fbcon->helper.fb = &fb->base;
372
+ fbcon->helper.fb = fb;
376373
377
- strcpy(info->fix.id, "nouveaufb");
378374 if (!chan)
379
- info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_DISABLED;
375
+ info->flags = FBINFO_HWACCEL_DISABLED;
380376 else
381
- info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_COPYAREA |
377
+ info->flags = FBINFO_HWACCEL_COPYAREA |
382378 FBINFO_HWACCEL_FILLRECT |
383379 FBINFO_HWACCEL_IMAGEBLIT;
384
- info->flags |= FBINFO_CAN_FORCE_OUTPUT;
385380 info->fbops = &nouveau_fbcon_sw_ops;
386
- info->fix.smem_start = fb->nvbo->bo.mem.bus.base +
387
- fb->nvbo->bo.mem.bus.offset;
388
- info->fix.smem_len = fb->nvbo->bo.mem.num_pages << PAGE_SHIFT;
381
+ info->fix.smem_start = nvbo->bo.mem.bus.offset;
382
+ info->fix.smem_len = nvbo->bo.mem.num_pages << PAGE_SHIFT;
389383
390
- info->screen_base = nvbo_kmap_obj_iovirtual(fb->nvbo);
391
- info->screen_size = fb->nvbo->bo.mem.num_pages << PAGE_SHIFT;
384
+ info->screen_base = nvbo_kmap_obj_iovirtual(nvbo);
385
+ info->screen_size = nvbo->bo.mem.num_pages << PAGE_SHIFT;
392386
393
- drm_fb_helper_fill_fix(info, fb->base.pitches[0],
394
- fb->base.format->depth);
395
- drm_fb_helper_fill_var(info, &fbcon->helper, sizes->fb_width, sizes->fb_height);
387
+ drm_fb_helper_fill_info(info, &fbcon->helper, sizes);
396388
397389 /* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */
398390
....@@ -402,19 +394,19 @@
402394
403395 /* To allow resizeing without swapping buffers */
404396 NV_INFO(drm, "allocated %dx%d fb: 0x%llx, bo %p\n",
405
- fb->base.width, fb->base.height, fb->nvbo->bo.offset, nvbo);
397
+ fb->width, fb->height, nvbo->offset, nvbo);
406398
407399 vga_switcheroo_client_fb_set(dev->pdev, info);
408400 return 0;
409401
410402 out_unlock:
411403 if (chan)
412
- nouveau_vma_del(&fb->vma);
413
- nouveau_bo_unmap(fb->nvbo);
404
+ nouveau_vma_del(&fbcon->vma);
405
+ nouveau_bo_unmap(nvbo);
414406 out_unpin:
415
- nouveau_bo_unpin(fb->nvbo);
407
+ nouveau_bo_unpin(nvbo);
416408 out_unref:
417
- nouveau_bo_ref(NULL, &fb->nvbo);
409
+ nouveau_bo_ref(NULL, &nvbo);
418410 out:
419411 return ret;
420412 }
....@@ -422,16 +414,18 @@
422414 static int
423415 nouveau_fbcon_destroy(struct drm_device *dev, struct nouveau_fbdev *fbcon)
424416 {
425
- struct nouveau_framebuffer *nouveau_fb = nouveau_framebuffer(fbcon->helper.fb);
417
+ struct drm_framebuffer *fb = fbcon->helper.fb;
418
+ struct nouveau_bo *nvbo;
426419
427420 drm_fb_helper_unregister_fbi(&fbcon->helper);
428421 drm_fb_helper_fini(&fbcon->helper);
429422
430
- if (nouveau_fb && nouveau_fb->nvbo) {
431
- nouveau_vma_del(&nouveau_fb->vma);
432
- nouveau_bo_unmap(nouveau_fb->nvbo);
433
- nouveau_bo_unpin(nouveau_fb->nvbo);
434
- drm_framebuffer_put(&nouveau_fb->base);
423
+ if (fb && fb->obj[0]) {
424
+ nvbo = nouveau_gem_object(fb->obj[0]);
425
+ nouveau_vma_del(&fbcon->vma);
426
+ nouveau_bo_unmap(nvbo);
427
+ nouveau_bo_unpin(nvbo);
428
+ drm_framebuffer_put(fb);
435429 }
436430
437431 return 0;
....@@ -470,7 +464,7 @@
470464 if (state == FBINFO_STATE_RUNNING) {
471465 nouveau_fbcon_hotplug_resume(drm->fbcon);
472466 pm_runtime_mark_last_busy(drm->dev->dev);
473
- pm_runtime_put_sync(drm->dev->dev);
467
+ pm_runtime_put_autosuspend(drm->dev->dev);
474468 }
475469 }
476470
....@@ -567,13 +561,9 @@
567561
568562 drm_fb_helper_prepare(dev, &fbcon->helper, &nouveau_fbcon_helper_funcs);
569563
570
- ret = drm_fb_helper_init(dev, &fbcon->helper, 4);
564
+ ret = drm_fb_helper_init(dev, &fbcon->helper);
571565 if (ret)
572566 goto free;
573
-
574
- ret = drm_fb_helper_single_add_all_connectors(&fbcon->helper);
575
- if (ret)
576
- goto fini;
577567
578568 if (preferred_bpp != 8 && preferred_bpp != 16 && preferred_bpp != 32) {
579569 if (drm->client.device.info.ram_size <= 32 * 1024 * 1024)