1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#include <linux/async.h>
28#include <linux/module.h>
29#include <linux/kernel.h>
30#include <linux/console.h>
31#include <linux/errno.h>
32#include <linux/string.h>
33#include <linux/mm.h>
34#include <linux/tty.h>
35#include <linux/sysrq.h>
36#include <linux/delay.h>
37#include <linux/fb.h>
38#include <linux/init.h>
39#include <linux/vga_switcheroo.h>
40
41#include <drm/drmP.h>
42#include <drm/drm_crtc.h>
43#include <drm/drm_fb_helper.h>
44#include "intel_drv.h"
45#include <drm/i915_drm.h>
46#include "i915_drv.h"
47
48static int intel_fbdev_set_par(struct fb_info *info)
49{
50 struct drm_fb_helper *fb_helper = info->par;
51 struct intel_fbdev *ifbdev =
52 container_of(fb_helper, struct intel_fbdev, helper);
53 int ret;
54
55 ret = drm_fb_helper_set_par(info);
56
57 if (ret == 0) {
58
59
60
61
62
63
64
65 mutex_lock(&fb_helper->dev->struct_mutex);
66 ret = i915_gem_object_set_to_gtt_domain(ifbdev->fb->obj,
67 true);
68 mutex_unlock(&fb_helper->dev->struct_mutex);
69 }
70
71 return ret;
72}
73
74static struct fb_ops intelfb_ops = {
75 .owner = THIS_MODULE,
76 .fb_check_var = drm_fb_helper_check_var,
77 .fb_set_par = intel_fbdev_set_par,
78 .fb_fillrect = cfb_fillrect,
79 .fb_copyarea = cfb_copyarea,
80 .fb_imageblit = cfb_imageblit,
81 .fb_pan_display = drm_fb_helper_pan_display,
82 .fb_blank = drm_fb_helper_blank,
83 .fb_setcmap = drm_fb_helper_setcmap,
84 .fb_debug_enter = drm_fb_helper_debug_enter,
85 .fb_debug_leave = drm_fb_helper_debug_leave,
86};
87
88static int intelfb_alloc(struct drm_fb_helper *helper,
89 struct drm_fb_helper_surface_size *sizes)
90{
91 struct intel_fbdev *ifbdev =
92 container_of(helper, struct intel_fbdev, helper);
93 struct drm_framebuffer *fb;
94 struct drm_device *dev = helper->dev;
95 struct drm_mode_fb_cmd2 mode_cmd = {};
96 struct drm_i915_gem_object *obj;
97 int size, ret;
98
99
100 if (sizes->surface_bpp == 24)
101 sizes->surface_bpp = 32;
102
103 mode_cmd.width = sizes->surface_width;
104 mode_cmd.height = sizes->surface_height;
105
106 mode_cmd.pitches[0] = ALIGN(mode_cmd.width *
107 DIV_ROUND_UP(sizes->surface_bpp, 8), 64);
108 mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp,
109 sizes->surface_depth);
110
111 size = mode_cmd.pitches[0] * mode_cmd.height;
112 size = PAGE_ALIGN(size);
113 obj = i915_gem_object_create_stolen(dev, size);
114 if (obj == NULL)
115 obj = i915_gem_alloc_object(dev, size);
116 if (!obj) {
117 DRM_ERROR("failed to allocate framebuffer\n");
118 ret = -ENOMEM;
119 goto out;
120 }
121
122 fb = __intel_framebuffer_create(dev, &mode_cmd, obj);
123 if (IS_ERR(fb)) {
124 ret = PTR_ERR(fb);
125 goto out_unref;
126 }
127
128
129 ret = intel_pin_and_fence_fb_obj(NULL, fb, NULL);
130 if (ret) {
131 DRM_ERROR("failed to pin obj: %d\n", ret);
132 goto out_fb;
133 }
134
135 ifbdev->fb = to_intel_framebuffer(fb);
136
137 return 0;
138
139out_fb:
140 drm_framebuffer_remove(fb);
141out_unref:
142 drm_gem_object_unreference(&obj->base);
143out:
144 return ret;
145}
146
147static int intelfb_create(struct drm_fb_helper *helper,
148 struct drm_fb_helper_surface_size *sizes)
149{
150 struct intel_fbdev *ifbdev =
151 container_of(helper, struct intel_fbdev, helper);
152 struct intel_framebuffer *intel_fb = ifbdev->fb;
153 struct drm_device *dev = helper->dev;
154 struct drm_i915_private *dev_priv = dev->dev_private;
155 struct fb_info *info;
156 struct drm_framebuffer *fb;
157 struct drm_i915_gem_object *obj;
158 int size, ret;
159 bool prealloc = false;
160
161 mutex_lock(&dev->struct_mutex);
162
163 if (intel_fb &&
164 (sizes->fb_width > intel_fb->base.width ||
165 sizes->fb_height > intel_fb->base.height)) {
166 DRM_DEBUG_KMS("BIOS fb too small (%dx%d), we require (%dx%d),"
167 " releasing it\n",
168 intel_fb->base.width, intel_fb->base.height,
169 sizes->fb_width, sizes->fb_height);
170 drm_framebuffer_unreference(&intel_fb->base);
171 intel_fb = ifbdev->fb = NULL;
172 }
173 if (!intel_fb || WARN_ON(!intel_fb->obj)) {
174 DRM_DEBUG_KMS("no BIOS fb, allocating a new one\n");
175 ret = intelfb_alloc(helper, sizes);
176 if (ret)
177 goto out_unlock;
178 intel_fb = ifbdev->fb;
179 } else {
180 DRM_DEBUG_KMS("re-using BIOS fb\n");
181 prealloc = true;
182 sizes->fb_width = intel_fb->base.width;
183 sizes->fb_height = intel_fb->base.height;
184 }
185
186 obj = intel_fb->obj;
187 size = obj->base.size;
188
189 info = framebuffer_alloc(0, &dev->pdev->dev);
190 if (!info) {
191 ret = -ENOMEM;
192 goto out_unpin;
193 }
194
195 info->par = helper;
196
197 fb = &ifbdev->fb->base;
198
199 ifbdev->helper.fb = fb;
200 ifbdev->helper.fbdev = info;
201
202 strcpy(info->fix.id, "inteldrmfb");
203
204 info->flags = FBINFO_DEFAULT | FBINFO_CAN_FORCE_OUTPUT;
205 info->fbops = &intelfb_ops;
206
207 ret = fb_alloc_cmap(&info->cmap, 256, 0);
208 if (ret) {
209 ret = -ENOMEM;
210 goto out_unpin;
211 }
212
213 info->apertures = alloc_apertures(1);
214 if (!info->apertures) {
215 ret = -ENOMEM;
216 goto out_unpin;
217 }
218 info->apertures->ranges[0].base = dev->mode_config.fb_base;
219 info->apertures->ranges[0].size = dev_priv->gtt.mappable_end;
220
221 info->fix.smem_start = dev->mode_config.fb_base + i915_gem_obj_ggtt_offset(obj);
222 info->fix.smem_len = size;
223
224 info->screen_base =
225 ioremap_wc(dev_priv->gtt.mappable_base + i915_gem_obj_ggtt_offset(obj),
226 size);
227 if (!info->screen_base) {
228 ret = -ENOSPC;
229 goto out_unpin;
230 }
231 info->screen_size = size;
232
233
234 info->skip_vt_switch = true;
235
236 drm_fb_helper_fill_fix(info, fb->pitches[0], fb->depth);
237 drm_fb_helper_fill_var(info, &ifbdev->helper, sizes->fb_width, sizes->fb_height);
238
239
240
241
242
243 if (ifbdev->fb->obj->stolen && !prealloc)
244 memset_io(info->screen_base, 0, info->screen_size);
245
246
247
248 DRM_DEBUG_KMS("allocated %dx%d fb: 0x%08lx, bo %p\n",
249 fb->width, fb->height,
250 i915_gem_obj_ggtt_offset(obj), obj);
251
252 mutex_unlock(&dev->struct_mutex);
253 vga_switcheroo_client_fb_set(dev->pdev, info);
254 return 0;
255
256out_unpin:
257 i915_gem_object_ggtt_unpin(obj);
258 drm_gem_object_unreference(&obj->base);
259out_unlock:
260 mutex_unlock(&dev->struct_mutex);
261 return ret;
262}
263
264
265static void intel_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
266 u16 blue, int regno)
267{
268 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
269
270 intel_crtc->lut_r[regno] = red >> 8;
271 intel_crtc->lut_g[regno] = green >> 8;
272 intel_crtc->lut_b[regno] = blue >> 8;
273}
274
275static void intel_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green,
276 u16 *blue, int regno)
277{
278 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
279
280 *red = intel_crtc->lut_r[regno] << 8;
281 *green = intel_crtc->lut_g[regno] << 8;
282 *blue = intel_crtc->lut_b[regno] << 8;
283}
284
285static struct drm_fb_helper_crtc *
286intel_fb_helper_crtc(struct drm_fb_helper *fb_helper, struct drm_crtc *crtc)
287{
288 int i;
289
290 for (i = 0; i < fb_helper->crtc_count; i++)
291 if (fb_helper->crtc_info[i].mode_set.crtc == crtc)
292 return &fb_helper->crtc_info[i];
293
294 return NULL;
295}
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324static bool intel_fb_initial_config(struct drm_fb_helper *fb_helper,
325 struct drm_fb_helper_crtc **crtcs,
326 struct drm_display_mode **modes,
327 struct drm_fb_offset *offsets,
328 bool *enabled, int width, int height)
329{
330 struct drm_device *dev = fb_helper->dev;
331 int i, j;
332 bool *save_enabled;
333 bool fallback = true;
334 int num_connectors_enabled = 0;
335 int num_connectors_detected = 0;
336 uint64_t conn_configured = 0, mask;
337 int pass = 0;
338
339 save_enabled = kcalloc(dev->mode_config.num_connector, sizeof(bool),
340 GFP_KERNEL);
341 if (!save_enabled)
342 return false;
343
344 memcpy(save_enabled, enabled, dev->mode_config.num_connector);
345 mask = (1 << fb_helper->connector_count) - 1;
346retry:
347 for (i = 0; i < fb_helper->connector_count; i++) {
348 struct drm_fb_helper_connector *fb_conn;
349 struct drm_connector *connector;
350 struct drm_encoder *encoder;
351 struct drm_fb_helper_crtc *new_crtc;
352
353 fb_conn = fb_helper->connector_info[i];
354 connector = fb_conn->connector;
355
356 if (conn_configured & (1 << i))
357 continue;
358
359 if (pass == 0 && !connector->has_tile)
360 continue;
361
362 if (connector->status == connector_status_connected)
363 num_connectors_detected++;
364
365 if (!enabled[i]) {
366 DRM_DEBUG_KMS("connector %s not enabled, skipping\n",
367 connector->name);
368 conn_configured |= (1 << i);
369 continue;
370 }
371
372 if (connector->force == DRM_FORCE_OFF) {
373 DRM_DEBUG_KMS("connector %s is disabled by user, skipping\n",
374 connector->name);
375 enabled[i] = false;
376 continue;
377 }
378
379 encoder = connector->encoder;
380 if (!encoder || WARN_ON(!encoder->crtc)) {
381 if (connector->force > DRM_FORCE_OFF)
382 goto bail;
383
384 DRM_DEBUG_KMS("connector %s has no encoder or crtc, skipping\n",
385 connector->name);
386 enabled[i] = false;
387 conn_configured |= (1 << i);
388 continue;
389 }
390
391 num_connectors_enabled++;
392
393 new_crtc = intel_fb_helper_crtc(fb_helper, encoder->crtc);
394
395
396
397
398
399
400 for (j = 0; j < fb_helper->connector_count; j++) {
401 if (crtcs[j] == new_crtc) {
402 DRM_DEBUG_KMS("fallback: cloned configuration\n");
403 goto bail;
404 }
405 }
406
407 DRM_DEBUG_KMS("looking for cmdline mode on connector %s\n",
408 connector->name);
409
410
411 modes[i] = drm_pick_cmdline_mode(fb_conn, width, height);
412
413
414 if (!modes[i]) {
415 DRM_DEBUG_KMS("looking for preferred mode on connector %s %d\n",
416 connector->name, connector->has_tile);
417 modes[i] = drm_has_preferred_mode(fb_conn, width,
418 height);
419 }
420
421
422 if (!modes[i] && !list_empty(&connector->modes)) {
423 DRM_DEBUG_KMS("using first mode listed on connector %s\n",
424 connector->name);
425 modes[i] = list_first_entry(&connector->modes,
426 struct drm_display_mode,
427 head);
428 }
429
430
431 if (!modes[i]) {
432
433
434
435
436
437
438
439
440
441
442
443 DRM_DEBUG_KMS("looking for current mode on connector %s\n",
444 connector->name);
445 intel_mode_from_pipe_config(&encoder->crtc->hwmode,
446 &to_intel_crtc(encoder->crtc)->config);
447 modes[i] = &encoder->crtc->hwmode;
448 }
449 crtcs[i] = new_crtc;
450
451 DRM_DEBUG_KMS("connector %s on pipe %c [CRTC:%d]: %dx%d%s\n",
452 connector->name,
453 pipe_name(to_intel_crtc(encoder->crtc)->pipe),
454 encoder->crtc->base.id,
455 modes[i]->hdisplay, modes[i]->vdisplay,
456 modes[i]->flags & DRM_MODE_FLAG_INTERLACE ? "i" :"");
457
458 fallback = false;
459 conn_configured |= (1 << i);
460 }
461
462 if ((conn_configured & mask) != mask) {
463 pass++;
464 goto retry;
465 }
466
467
468
469
470
471
472 if (num_connectors_enabled != num_connectors_detected &&
473 num_connectors_enabled < INTEL_INFO(dev)->num_pipes) {
474 DRM_DEBUG_KMS("fallback: Not all outputs enabled\n");
475 DRM_DEBUG_KMS("Enabled: %i, detected: %i\n", num_connectors_enabled,
476 num_connectors_detected);
477 fallback = true;
478 }
479
480 if (fallback) {
481bail:
482 DRM_DEBUG_KMS("Not using firmware configuration\n");
483 memcpy(enabled, save_enabled, dev->mode_config.num_connector);
484 kfree(save_enabled);
485 return false;
486 }
487
488 kfree(save_enabled);
489 return true;
490}
491
492static const struct drm_fb_helper_funcs intel_fb_helper_funcs = {
493 .initial_config = intel_fb_initial_config,
494 .gamma_set = intel_crtc_fb_gamma_set,
495 .gamma_get = intel_crtc_fb_gamma_get,
496 .fb_probe = intelfb_create,
497};
498
499static void intel_fbdev_destroy(struct drm_device *dev,
500 struct intel_fbdev *ifbdev)
501{
502 if (ifbdev->helper.fbdev) {
503 struct fb_info *info = ifbdev->helper.fbdev;
504
505 unregister_framebuffer(info);
506 iounmap(info->screen_base);
507 if (info->cmap.len)
508 fb_dealloc_cmap(&info->cmap);
509
510 framebuffer_release(info);
511 }
512
513 drm_fb_helper_fini(&ifbdev->helper);
514
515 drm_framebuffer_unregister_private(&ifbdev->fb->base);
516 drm_framebuffer_remove(&ifbdev->fb->base);
517}
518
519
520
521
522
523
524
525
526
527
528static bool intel_fbdev_init_bios(struct drm_device *dev,
529 struct intel_fbdev *ifbdev)
530{
531 struct intel_framebuffer *fb = NULL;
532 struct drm_crtc *crtc;
533 struct intel_crtc *intel_crtc;
534 struct intel_plane_config *plane_config = NULL;
535 unsigned int max_size = 0;
536
537 if (!i915.fastboot)
538 return false;
539
540
541 for_each_crtc(dev, crtc) {
542 intel_crtc = to_intel_crtc(crtc);
543
544 if (!intel_crtc->active || !crtc->primary->fb) {
545 DRM_DEBUG_KMS("pipe %c not active or no fb, skipping\n",
546 pipe_name(intel_crtc->pipe));
547 continue;
548 }
549
550 if (intel_crtc->plane_config.size > max_size) {
551 DRM_DEBUG_KMS("found possible fb from plane %c\n",
552 pipe_name(intel_crtc->pipe));
553 plane_config = &intel_crtc->plane_config;
554 fb = to_intel_framebuffer(crtc->primary->fb);
555 max_size = plane_config->size;
556 }
557 }
558
559 if (!fb) {
560 DRM_DEBUG_KMS("no active fbs found, not using BIOS config\n");
561 goto out;
562 }
563
564
565 for_each_crtc(dev, crtc) {
566 unsigned int cur_size;
567
568 intel_crtc = to_intel_crtc(crtc);
569
570 if (!intel_crtc->active) {
571 DRM_DEBUG_KMS("pipe %c not active, skipping\n",
572 pipe_name(intel_crtc->pipe));
573 continue;
574 }
575
576 DRM_DEBUG_KMS("checking plane %c for BIOS fb\n",
577 pipe_name(intel_crtc->pipe));
578
579
580
581
582
583
584 cur_size = intel_crtc->config.adjusted_mode.crtc_hdisplay;
585 cur_size = cur_size * fb->base.bits_per_pixel / 8;
586 if (fb->base.pitches[0] < cur_size) {
587 DRM_DEBUG_KMS("fb not wide enough for plane %c (%d vs %d)\n",
588 pipe_name(intel_crtc->pipe),
589 cur_size, fb->base.pitches[0]);
590 plane_config = NULL;
591 fb = NULL;
592 break;
593 }
594
595 cur_size = intel_crtc->config.adjusted_mode.crtc_vdisplay;
596 cur_size = ALIGN(cur_size, plane_config->tiled ? (IS_GEN2(dev) ? 16 : 8) : 1);
597 cur_size *= fb->base.pitches[0];
598 DRM_DEBUG_KMS("pipe %c area: %dx%d, bpp: %d, size: %d\n",
599 pipe_name(intel_crtc->pipe),
600 intel_crtc->config.adjusted_mode.crtc_hdisplay,
601 intel_crtc->config.adjusted_mode.crtc_vdisplay,
602 fb->base.bits_per_pixel,
603 cur_size);
604
605 if (cur_size > max_size) {
606 DRM_DEBUG_KMS("fb not big enough for plane %c (%d vs %d)\n",
607 pipe_name(intel_crtc->pipe),
608 cur_size, max_size);
609 plane_config = NULL;
610 fb = NULL;
611 break;
612 }
613
614 DRM_DEBUG_KMS("fb big enough for plane %c (%d >= %d)\n",
615 pipe_name(intel_crtc->pipe),
616 max_size, cur_size);
617 }
618
619 if (!fb) {
620 DRM_DEBUG_KMS("BIOS fb not suitable for all pipes, not using\n");
621 goto out;
622 }
623
624 ifbdev->preferred_bpp = fb->base.bits_per_pixel;
625 ifbdev->fb = fb;
626
627 drm_framebuffer_reference(&ifbdev->fb->base);
628
629
630 for_each_crtc(dev, crtc) {
631 intel_crtc = to_intel_crtc(crtc);
632
633 if (!intel_crtc->active)
634 continue;
635
636 WARN(!crtc->primary->fb,
637 "re-used BIOS config but lost an fb on crtc %d\n",
638 crtc->base.id);
639 }
640
641
642 DRM_DEBUG_KMS("using BIOS fb for initial console\n");
643 return true;
644
645out:
646
647 return false;
648}
649
650static void intel_fbdev_suspend_worker(struct work_struct *work)
651{
652 intel_fbdev_set_suspend(container_of(work,
653 struct drm_i915_private,
654 fbdev_suspend_work)->dev,
655 FBINFO_STATE_RUNNING,
656 true);
657}
658
659int intel_fbdev_init(struct drm_device *dev)
660{
661 struct intel_fbdev *ifbdev;
662 struct drm_i915_private *dev_priv = dev->dev_private;
663 int ret;
664
665 if (WARN_ON(INTEL_INFO(dev)->num_pipes == 0))
666 return -ENODEV;
667
668 ifbdev = kzalloc(sizeof(struct intel_fbdev), GFP_KERNEL);
669 if (ifbdev == NULL)
670 return -ENOMEM;
671
672 drm_fb_helper_prepare(dev, &ifbdev->helper, &intel_fb_helper_funcs);
673
674 if (!intel_fbdev_init_bios(dev, ifbdev))
675 ifbdev->preferred_bpp = 32;
676
677 ret = drm_fb_helper_init(dev, &ifbdev->helper,
678 INTEL_INFO(dev)->num_pipes, 4);
679 if (ret) {
680 kfree(ifbdev);
681 return ret;
682 }
683
684 dev_priv->fbdev = ifbdev;
685 INIT_WORK(&dev_priv->fbdev_suspend_work, intel_fbdev_suspend_worker);
686
687 drm_fb_helper_single_add_all_connectors(&ifbdev->helper);
688
689 return 0;
690}
691
692void intel_fbdev_initial_config(void *data, async_cookie_t cookie)
693{
694 struct drm_i915_private *dev_priv = data;
695 struct intel_fbdev *ifbdev = dev_priv->fbdev;
696
697
698 drm_fb_helper_initial_config(&ifbdev->helper, ifbdev->preferred_bpp);
699}
700
701void intel_fbdev_fini(struct drm_device *dev)
702{
703 struct drm_i915_private *dev_priv = dev->dev_private;
704 if (!dev_priv->fbdev)
705 return;
706
707 flush_work(&dev_priv->fbdev_suspend_work);
708
709 async_synchronize_full();
710 intel_fbdev_destroy(dev, dev_priv->fbdev);
711 kfree(dev_priv->fbdev);
712 dev_priv->fbdev = NULL;
713}
714
715void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous)
716{
717 struct drm_i915_private *dev_priv = dev->dev_private;
718 struct intel_fbdev *ifbdev = dev_priv->fbdev;
719 struct fb_info *info;
720
721 if (!ifbdev)
722 return;
723
724 info = ifbdev->helper.fbdev;
725
726 if (synchronous) {
727
728
729
730
731
732
733
734 if (state != FBINFO_STATE_RUNNING)
735 flush_work(&dev_priv->fbdev_suspend_work);
736 console_lock();
737 } else {
738
739
740
741
742
743 WARN_ON(state != FBINFO_STATE_RUNNING);
744 if (!console_trylock()) {
745
746
747
748 schedule_work(&dev_priv->fbdev_suspend_work);
749 return;
750 }
751 }
752
753
754
755
756
757 if (state == FBINFO_STATE_RUNNING && ifbdev->fb->obj->stolen)
758 memset_io(info->screen_base, 0, info->screen_size);
759
760 fb_set_suspend(info, state);
761 console_unlock();
762}
763
764void intel_fbdev_output_poll_changed(struct drm_device *dev)
765{
766 struct drm_i915_private *dev_priv = dev->dev_private;
767 if (dev_priv->fbdev)
768 drm_fb_helper_hotplug_event(&dev_priv->fbdev->helper);
769}
770
771void intel_fbdev_restore_mode(struct drm_device *dev)
772{
773 int ret;
774 struct drm_i915_private *dev_priv = dev->dev_private;
775
776 if (!dev_priv->fbdev)
777 return;
778
779 ret = drm_fb_helper_restore_fbdev_mode_unlocked(&dev_priv->fbdev->helper);
780 if (ret)
781 DRM_DEBUG("failed to restore crtc mode\n");
782}
783