These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / gpu / drm / i915 / intel_fbdev.c
1 /*
2  * Copyright © 2007 David Airlie
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  *
23  * Authors:
24  *     David Airlie
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
48 static 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                 mutex_lock(&fb_helper->dev->struct_mutex);
59                 intel_fb_obj_invalidate(ifbdev->fb->obj, ORIGIN_GTT);
60                 mutex_unlock(&fb_helper->dev->struct_mutex);
61         }
62
63         return ret;
64 }
65
66 static int intel_fbdev_blank(int blank, struct fb_info *info)
67 {
68         struct drm_fb_helper *fb_helper = info->par;
69         struct intel_fbdev *ifbdev =
70                 container_of(fb_helper, struct intel_fbdev, helper);
71         int ret;
72
73         ret = drm_fb_helper_blank(blank, info);
74
75         if (ret == 0) {
76                 mutex_lock(&fb_helper->dev->struct_mutex);
77                 intel_fb_obj_invalidate(ifbdev->fb->obj, ORIGIN_GTT);
78                 mutex_unlock(&fb_helper->dev->struct_mutex);
79         }
80
81         return ret;
82 }
83
84 static int intel_fbdev_pan_display(struct fb_var_screeninfo *var,
85                                    struct fb_info *info)
86 {
87         struct drm_fb_helper *fb_helper = info->par;
88         struct intel_fbdev *ifbdev =
89                 container_of(fb_helper, struct intel_fbdev, helper);
90
91         int ret;
92         ret = drm_fb_helper_pan_display(var, info);
93
94         if (ret == 0) {
95                 mutex_lock(&fb_helper->dev->struct_mutex);
96                 intel_fb_obj_invalidate(ifbdev->fb->obj, ORIGIN_GTT);
97                 mutex_unlock(&fb_helper->dev->struct_mutex);
98         }
99
100         return ret;
101 }
102
103 static struct fb_ops intelfb_ops = {
104         .owner = THIS_MODULE,
105         .fb_check_var = drm_fb_helper_check_var,
106         .fb_set_par = intel_fbdev_set_par,
107         .fb_fillrect = drm_fb_helper_cfb_fillrect,
108         .fb_copyarea = drm_fb_helper_cfb_copyarea,
109         .fb_imageblit = drm_fb_helper_cfb_imageblit,
110         .fb_pan_display = intel_fbdev_pan_display,
111         .fb_blank = intel_fbdev_blank,
112         .fb_setcmap = drm_fb_helper_setcmap,
113         .fb_debug_enter = drm_fb_helper_debug_enter,
114         .fb_debug_leave = drm_fb_helper_debug_leave,
115 };
116
117 static int intelfb_alloc(struct drm_fb_helper *helper,
118                          struct drm_fb_helper_surface_size *sizes)
119 {
120         struct intel_fbdev *ifbdev =
121                 container_of(helper, struct intel_fbdev, helper);
122         struct drm_framebuffer *fb;
123         struct drm_device *dev = helper->dev;
124         struct drm_i915_private *dev_priv = to_i915(dev);
125         struct drm_mode_fb_cmd2 mode_cmd = {};
126         struct drm_i915_gem_object *obj = NULL;
127         int size, ret;
128
129         /* we don't do packed 24bpp */
130         if (sizes->surface_bpp == 24)
131                 sizes->surface_bpp = 32;
132
133         mode_cmd.width = sizes->surface_width;
134         mode_cmd.height = sizes->surface_height;
135
136         mode_cmd.pitches[0] = ALIGN(mode_cmd.width *
137                                     DIV_ROUND_UP(sizes->surface_bpp, 8), 64);
138         mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp,
139                                                           sizes->surface_depth);
140
141         size = mode_cmd.pitches[0] * mode_cmd.height;
142         size = PAGE_ALIGN(size);
143
144         /* If the FB is too big, just don't use it since fbdev is not very
145          * important and we should probably use that space with FBC or other
146          * features. */
147         if (size * 2 < dev_priv->gtt.stolen_usable_size)
148                 obj = i915_gem_object_create_stolen(dev, size);
149         if (obj == NULL)
150                 obj = i915_gem_alloc_object(dev, size);
151         if (!obj) {
152                 DRM_ERROR("failed to allocate framebuffer\n");
153                 ret = -ENOMEM;
154                 goto out;
155         }
156
157         fb = __intel_framebuffer_create(dev, &mode_cmd, obj);
158         if (IS_ERR(fb)) {
159                 ret = PTR_ERR(fb);
160                 goto out_unref;
161         }
162
163         /* Flush everything out, we'll be doing GTT only from now on */
164         ret = intel_pin_and_fence_fb_obj(NULL, fb, NULL, NULL, NULL);
165         if (ret) {
166                 DRM_ERROR("failed to pin obj: %d\n", ret);
167                 goto out_fb;
168         }
169
170         ifbdev->fb = to_intel_framebuffer(fb);
171
172         return 0;
173
174 out_fb:
175         drm_framebuffer_remove(fb);
176 out_unref:
177         drm_gem_object_unreference(&obj->base);
178 out:
179         return ret;
180 }
181
182 static int intelfb_create(struct drm_fb_helper *helper,
183                           struct drm_fb_helper_surface_size *sizes)
184 {
185         struct intel_fbdev *ifbdev =
186                 container_of(helper, struct intel_fbdev, helper);
187         struct intel_framebuffer *intel_fb = ifbdev->fb;
188         struct drm_device *dev = helper->dev;
189         struct drm_i915_private *dev_priv = dev->dev_private;
190         struct fb_info *info;
191         struct drm_framebuffer *fb;
192         struct drm_i915_gem_object *obj;
193         int size, ret;
194         bool prealloc = false;
195
196         mutex_lock(&dev->struct_mutex);
197
198         if (intel_fb &&
199             (sizes->fb_width > intel_fb->base.width ||
200              sizes->fb_height > intel_fb->base.height)) {
201                 DRM_DEBUG_KMS("BIOS fb too small (%dx%d), we require (%dx%d),"
202                               " releasing it\n",
203                               intel_fb->base.width, intel_fb->base.height,
204                               sizes->fb_width, sizes->fb_height);
205                 drm_framebuffer_unreference(&intel_fb->base);
206                 intel_fb = ifbdev->fb = NULL;
207         }
208         if (!intel_fb || WARN_ON(!intel_fb->obj)) {
209                 DRM_DEBUG_KMS("no BIOS fb, allocating a new one\n");
210                 ret = intelfb_alloc(helper, sizes);
211                 if (ret)
212                         goto out_unlock;
213                 intel_fb = ifbdev->fb;
214         } else {
215                 DRM_DEBUG_KMS("re-using BIOS fb\n");
216                 prealloc = true;
217                 sizes->fb_width = intel_fb->base.width;
218                 sizes->fb_height = intel_fb->base.height;
219         }
220
221         obj = intel_fb->obj;
222         size = obj->base.size;
223
224         info = drm_fb_helper_alloc_fbi(helper);
225         if (IS_ERR(info)) {
226                 ret = PTR_ERR(info);
227                 goto out_unpin;
228         }
229
230         info->par = helper;
231
232         fb = &ifbdev->fb->base;
233
234         ifbdev->helper.fb = fb;
235
236         strcpy(info->fix.id, "inteldrmfb");
237
238         info->flags = FBINFO_DEFAULT | FBINFO_CAN_FORCE_OUTPUT;
239         info->fbops = &intelfb_ops;
240
241         /* setup aperture base/size for vesafb takeover */
242         info->apertures->ranges[0].base = dev->mode_config.fb_base;
243         info->apertures->ranges[0].size = dev_priv->gtt.mappable_end;
244
245         info->fix.smem_start = dev->mode_config.fb_base + i915_gem_obj_ggtt_offset(obj);
246         info->fix.smem_len = size;
247
248         info->screen_base =
249                 ioremap_wc(dev_priv->gtt.mappable_base + i915_gem_obj_ggtt_offset(obj),
250                            size);
251         if (!info->screen_base) {
252                 ret = -ENOSPC;
253                 goto out_destroy_fbi;
254         }
255         info->screen_size = size;
256
257         /* This driver doesn't need a VT switch to restore the mode on resume */
258         info->skip_vt_switch = true;
259
260         drm_fb_helper_fill_fix(info, fb->pitches[0], fb->depth);
261         drm_fb_helper_fill_var(info, &ifbdev->helper, sizes->fb_width, sizes->fb_height);
262
263         /* If the object is shmemfs backed, it will have given us zeroed pages.
264          * If the object is stolen however, it will be full of whatever
265          * garbage was left in there.
266          */
267         if (ifbdev->fb->obj->stolen && !prealloc)
268                 memset_io(info->screen_base, 0, info->screen_size);
269
270         /* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */
271
272         DRM_DEBUG_KMS("allocated %dx%d fb: 0x%08llx, bo %p\n",
273                       fb->width, fb->height,
274                       i915_gem_obj_ggtt_offset(obj), obj);
275
276         mutex_unlock(&dev->struct_mutex);
277         vga_switcheroo_client_fb_set(dev->pdev, info);
278         return 0;
279
280 out_destroy_fbi:
281         drm_fb_helper_release_fbi(helper);
282 out_unpin:
283         i915_gem_object_ggtt_unpin(obj);
284         drm_gem_object_unreference(&obj->base);
285 out_unlock:
286         mutex_unlock(&dev->struct_mutex);
287         return ret;
288 }
289
290 /** Sets the color ramps on behalf of RandR */
291 static void intel_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
292                                     u16 blue, int regno)
293 {
294         struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
295
296         intel_crtc->lut_r[regno] = red >> 8;
297         intel_crtc->lut_g[regno] = green >> 8;
298         intel_crtc->lut_b[regno] = blue >> 8;
299 }
300
301 static void intel_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green,
302                                     u16 *blue, int regno)
303 {
304         struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
305
306         *red = intel_crtc->lut_r[regno] << 8;
307         *green = intel_crtc->lut_g[regno] << 8;
308         *blue = intel_crtc->lut_b[regno] << 8;
309 }
310
311 static struct drm_fb_helper_crtc *
312 intel_fb_helper_crtc(struct drm_fb_helper *fb_helper, struct drm_crtc *crtc)
313 {
314         int i;
315
316         for (i = 0; i < fb_helper->crtc_count; i++)
317                 if (fb_helper->crtc_info[i].mode_set.crtc == crtc)
318                         return &fb_helper->crtc_info[i];
319
320         return NULL;
321 }
322
323 /*
324  * Try to read the BIOS display configuration and use it for the initial
325  * fb configuration.
326  *
327  * The BIOS or boot loader will generally create an initial display
328  * configuration for us that includes some set of active pipes and displays.
329  * This routine tries to figure out which pipes and connectors are active
330  * and stuffs them into the crtcs and modes array given to us by the
331  * drm_fb_helper code.
332  *
333  * The overall sequence is:
334  *   intel_fbdev_init - from driver load
335  *     intel_fbdev_init_bios - initialize the intel_fbdev using BIOS data
336  *     drm_fb_helper_init - build fb helper structs
337  *     drm_fb_helper_single_add_all_connectors - more fb helper structs
338  *   intel_fbdev_initial_config - apply the config
339  *     drm_fb_helper_initial_config - call ->probe then register_framebuffer()
340  *         drm_setup_crtcs - build crtc config for fbdev
341  *           intel_fb_initial_config - find active connectors etc
342  *         drm_fb_helper_single_fb_probe - set up fbdev
343  *           intelfb_create - re-use or alloc fb, build out fbdev structs
344  *
345  * Note that we don't make special consideration whether we could actually
346  * switch to the selected modes without a full modeset. E.g. when the display
347  * is in VGA mode we need to recalculate watermarks and set a new high-res
348  * framebuffer anyway.
349  */
350 static bool intel_fb_initial_config(struct drm_fb_helper *fb_helper,
351                                     struct drm_fb_helper_crtc **crtcs,
352                                     struct drm_display_mode **modes,
353                                     struct drm_fb_offset *offsets,
354                                     bool *enabled, int width, int height)
355 {
356         struct drm_device *dev = fb_helper->dev;
357         int i, j;
358         bool *save_enabled;
359         bool fallback = true;
360         int num_connectors_enabled = 0;
361         int num_connectors_detected = 0;
362         uint64_t conn_configured = 0, mask;
363         int pass = 0;
364
365         save_enabled = kcalloc(dev->mode_config.num_connector, sizeof(bool),
366                                GFP_KERNEL);
367         if (!save_enabled)
368                 return false;
369
370         memcpy(save_enabled, enabled, dev->mode_config.num_connector);
371         mask = (1 << fb_helper->connector_count) - 1;
372 retry:
373         for (i = 0; i < fb_helper->connector_count; i++) {
374                 struct drm_fb_helper_connector *fb_conn;
375                 struct drm_connector *connector;
376                 struct drm_encoder *encoder;
377                 struct drm_fb_helper_crtc *new_crtc;
378
379                 fb_conn = fb_helper->connector_info[i];
380                 connector = fb_conn->connector;
381
382                 if (conn_configured & (1 << i))
383                         continue;
384
385                 if (pass == 0 && !connector->has_tile)
386                         continue;
387
388                 if (connector->status == connector_status_connected)
389                         num_connectors_detected++;
390
391                 if (!enabled[i]) {
392                         DRM_DEBUG_KMS("connector %s not enabled, skipping\n",
393                                       connector->name);
394                         conn_configured |= (1 << i);
395                         continue;
396                 }
397
398                 if (connector->force == DRM_FORCE_OFF) {
399                         DRM_DEBUG_KMS("connector %s is disabled by user, skipping\n",
400                                       connector->name);
401                         enabled[i] = false;
402                         continue;
403                 }
404
405                 encoder = connector->encoder;
406                 if (!encoder || WARN_ON(!encoder->crtc)) {
407                         if (connector->force > DRM_FORCE_OFF)
408                                 goto bail;
409
410                         DRM_DEBUG_KMS("connector %s has no encoder or crtc, skipping\n",
411                                       connector->name);
412                         enabled[i] = false;
413                         conn_configured |= (1 << i);
414                         continue;
415                 }
416
417                 num_connectors_enabled++;
418
419                 new_crtc = intel_fb_helper_crtc(fb_helper, encoder->crtc);
420
421                 /*
422                  * Make sure we're not trying to drive multiple connectors
423                  * with a single CRTC, since our cloning support may not
424                  * match the BIOS.
425                  */
426                 for (j = 0; j < fb_helper->connector_count; j++) {
427                         if (crtcs[j] == new_crtc) {
428                                 DRM_DEBUG_KMS("fallback: cloned configuration\n");
429                                 goto bail;
430                         }
431                 }
432
433                 DRM_DEBUG_KMS("looking for cmdline mode on connector %s\n",
434                               connector->name);
435
436                 /* go for command line mode first */
437                 modes[i] = drm_pick_cmdline_mode(fb_conn, width, height);
438
439                 /* try for preferred next */
440                 if (!modes[i]) {
441                         DRM_DEBUG_KMS("looking for preferred mode on connector %s %d\n",
442                                       connector->name, connector->has_tile);
443                         modes[i] = drm_has_preferred_mode(fb_conn, width,
444                                                           height);
445                 }
446
447                 /* No preferred mode marked by the EDID? Are there any modes? */
448                 if (!modes[i] && !list_empty(&connector->modes)) {
449                         DRM_DEBUG_KMS("using first mode listed on connector %s\n",
450                                       connector->name);
451                         modes[i] = list_first_entry(&connector->modes,
452                                                     struct drm_display_mode,
453                                                     head);
454                 }
455
456                 /* last resort: use current mode */
457                 if (!modes[i]) {
458                         /*
459                          * IMPORTANT: We want to use the adjusted mode (i.e.
460                          * after the panel fitter upscaling) as the initial
461                          * config, not the input mode, which is what crtc->mode
462                          * usually contains. But since our current
463                          * code puts a mode derived from the post-pfit timings
464                          * into crtc->mode this works out correctly.
465                          */
466                         DRM_DEBUG_KMS("looking for current mode on connector %s\n",
467                                       connector->name);
468                         modes[i] = &encoder->crtc->mode;
469                 }
470                 crtcs[i] = new_crtc;
471
472                 DRM_DEBUG_KMS("connector %s on pipe %c [CRTC:%d]: %dx%d%s\n",
473                               connector->name,
474                               pipe_name(to_intel_crtc(encoder->crtc)->pipe),
475                               encoder->crtc->base.id,
476                               modes[i]->hdisplay, modes[i]->vdisplay,
477                               modes[i]->flags & DRM_MODE_FLAG_INTERLACE ? "i" :"");
478
479                 fallback = false;
480                 conn_configured |= (1 << i);
481         }
482
483         if ((conn_configured & mask) != mask) {
484                 pass++;
485                 goto retry;
486         }
487
488         /*
489          * If the BIOS didn't enable everything it could, fall back to have the
490          * same user experiencing of lighting up as much as possible like the
491          * fbdev helper library.
492          */
493         if (num_connectors_enabled != num_connectors_detected &&
494             num_connectors_enabled < INTEL_INFO(dev)->num_pipes) {
495                 DRM_DEBUG_KMS("fallback: Not all outputs enabled\n");
496                 DRM_DEBUG_KMS("Enabled: %i, detected: %i\n", num_connectors_enabled,
497                               num_connectors_detected);
498                 fallback = true;
499         }
500
501         if (fallback) {
502 bail:
503                 DRM_DEBUG_KMS("Not using firmware configuration\n");
504                 memcpy(enabled, save_enabled, dev->mode_config.num_connector);
505                 kfree(save_enabled);
506                 return false;
507         }
508
509         kfree(save_enabled);
510         return true;
511 }
512
513 static const struct drm_fb_helper_funcs intel_fb_helper_funcs = {
514         .initial_config = intel_fb_initial_config,
515         .gamma_set = intel_crtc_fb_gamma_set,
516         .gamma_get = intel_crtc_fb_gamma_get,
517         .fb_probe = intelfb_create,
518 };
519
520 static void intel_fbdev_destroy(struct drm_device *dev,
521                                 struct intel_fbdev *ifbdev)
522 {
523
524         drm_fb_helper_unregister_fbi(&ifbdev->helper);
525         drm_fb_helper_release_fbi(&ifbdev->helper);
526
527         drm_fb_helper_fini(&ifbdev->helper);
528
529         drm_framebuffer_unregister_private(&ifbdev->fb->base);
530         drm_framebuffer_remove(&ifbdev->fb->base);
531 }
532
533 /*
534  * Build an intel_fbdev struct using a BIOS allocated framebuffer, if possible.
535  * The core display code will have read out the current plane configuration,
536  * so we use that to figure out if there's an object for us to use as the
537  * fb, and if so, we re-use it for the fbdev configuration.
538  *
539  * Note we only support a single fb shared across pipes for boot (mostly for
540  * fbcon), so we just find the biggest and use that.
541  */
542 static bool intel_fbdev_init_bios(struct drm_device *dev,
543                                  struct intel_fbdev *ifbdev)
544 {
545         struct intel_framebuffer *fb = NULL;
546         struct drm_crtc *crtc;
547         struct intel_crtc *intel_crtc;
548         unsigned int max_size = 0;
549
550         /* Find the largest fb */
551         for_each_crtc(dev, crtc) {
552                 struct drm_i915_gem_object *obj =
553                         intel_fb_obj(crtc->primary->state->fb);
554                 intel_crtc = to_intel_crtc(crtc);
555
556                 if (!crtc->state->active || !obj) {
557                         DRM_DEBUG_KMS("pipe %c not active or no fb, skipping\n",
558                                       pipe_name(intel_crtc->pipe));
559                         continue;
560                 }
561
562                 if (obj->base.size > max_size) {
563                         DRM_DEBUG_KMS("found possible fb from plane %c\n",
564                                       pipe_name(intel_crtc->pipe));
565                         fb = to_intel_framebuffer(crtc->primary->state->fb);
566                         max_size = obj->base.size;
567                 }
568         }
569
570         if (!fb) {
571                 DRM_DEBUG_KMS("no active fbs found, not using BIOS config\n");
572                 goto out;
573         }
574
575         /* Now make sure all the pipes will fit into it */
576         for_each_crtc(dev, crtc) {
577                 unsigned int cur_size;
578
579                 intel_crtc = to_intel_crtc(crtc);
580
581                 if (!crtc->state->active) {
582                         DRM_DEBUG_KMS("pipe %c not active, skipping\n",
583                                       pipe_name(intel_crtc->pipe));
584                         continue;
585                 }
586
587                 DRM_DEBUG_KMS("checking plane %c for BIOS fb\n",
588                               pipe_name(intel_crtc->pipe));
589
590                 /*
591                  * See if the plane fb we found above will fit on this
592                  * pipe.  Note we need to use the selected fb's pitch and bpp
593                  * rather than the current pipe's, since they differ.
594                  */
595                 cur_size = intel_crtc->config->base.adjusted_mode.crtc_hdisplay;
596                 cur_size = cur_size * fb->base.bits_per_pixel / 8;
597                 if (fb->base.pitches[0] < cur_size) {
598                         DRM_DEBUG_KMS("fb not wide enough for plane %c (%d vs %d)\n",
599                                       pipe_name(intel_crtc->pipe),
600                                       cur_size, fb->base.pitches[0]);
601                         fb = NULL;
602                         break;
603                 }
604
605                 cur_size = intel_crtc->config->base.adjusted_mode.crtc_vdisplay;
606                 cur_size = intel_fb_align_height(dev, cur_size,
607                                                  fb->base.pixel_format,
608                                                  fb->base.modifier[0]);
609                 cur_size *= fb->base.pitches[0];
610                 DRM_DEBUG_KMS("pipe %c area: %dx%d, bpp: %d, size: %d\n",
611                               pipe_name(intel_crtc->pipe),
612                               intel_crtc->config->base.adjusted_mode.crtc_hdisplay,
613                               intel_crtc->config->base.adjusted_mode.crtc_vdisplay,
614                               fb->base.bits_per_pixel,
615                               cur_size);
616
617                 if (cur_size > max_size) {
618                         DRM_DEBUG_KMS("fb not big enough for plane %c (%d vs %d)\n",
619                                       pipe_name(intel_crtc->pipe),
620                                       cur_size, max_size);
621                         fb = NULL;
622                         break;
623                 }
624
625                 DRM_DEBUG_KMS("fb big enough for plane %c (%d >= %d)\n",
626                               pipe_name(intel_crtc->pipe),
627                               max_size, cur_size);
628         }
629
630         if (!fb) {
631                 DRM_DEBUG_KMS("BIOS fb not suitable for all pipes, not using\n");
632                 goto out;
633         }
634
635         ifbdev->preferred_bpp = fb->base.bits_per_pixel;
636         ifbdev->fb = fb;
637
638         drm_framebuffer_reference(&ifbdev->fb->base);
639
640         /* Final pass to check if any active pipes don't have fbs */
641         for_each_crtc(dev, crtc) {
642                 intel_crtc = to_intel_crtc(crtc);
643
644                 if (!crtc->state->active)
645                         continue;
646
647                 WARN(!crtc->primary->fb,
648                      "re-used BIOS config but lost an fb on crtc %d\n",
649                      crtc->base.id);
650         }
651
652
653         DRM_DEBUG_KMS("using BIOS fb for initial console\n");
654         return true;
655
656 out:
657
658         return false;
659 }
660
661 static void intel_fbdev_suspend_worker(struct work_struct *work)
662 {
663         intel_fbdev_set_suspend(container_of(work,
664                                              struct drm_i915_private,
665                                              fbdev_suspend_work)->dev,
666                                 FBINFO_STATE_RUNNING,
667                                 true);
668 }
669
670 int intel_fbdev_init(struct drm_device *dev)
671 {
672         struct intel_fbdev *ifbdev;
673         struct drm_i915_private *dev_priv = dev->dev_private;
674         int ret;
675
676         if (WARN_ON(INTEL_INFO(dev)->num_pipes == 0))
677                 return -ENODEV;
678
679         ifbdev = kzalloc(sizeof(struct intel_fbdev), GFP_KERNEL);
680         if (ifbdev == NULL)
681                 return -ENOMEM;
682
683         drm_fb_helper_prepare(dev, &ifbdev->helper, &intel_fb_helper_funcs);
684
685         if (!intel_fbdev_init_bios(dev, ifbdev))
686                 ifbdev->preferred_bpp = 32;
687
688         ret = drm_fb_helper_init(dev, &ifbdev->helper,
689                                  INTEL_INFO(dev)->num_pipes, 4);
690         if (ret) {
691                 kfree(ifbdev);
692                 return ret;
693         }
694
695         ifbdev->helper.atomic = true;
696
697         dev_priv->fbdev = ifbdev;
698         INIT_WORK(&dev_priv->fbdev_suspend_work, intel_fbdev_suspend_worker);
699
700         drm_fb_helper_single_add_all_connectors(&ifbdev->helper);
701
702         return 0;
703 }
704
705 void intel_fbdev_initial_config(void *data, async_cookie_t cookie)
706 {
707         struct drm_i915_private *dev_priv = data;
708         struct intel_fbdev *ifbdev = dev_priv->fbdev;
709
710         /* Due to peculiar init order wrt to hpd handling this is separate. */
711         drm_fb_helper_initial_config(&ifbdev->helper, ifbdev->preferred_bpp);
712 }
713
714 void intel_fbdev_fini(struct drm_device *dev)
715 {
716         struct drm_i915_private *dev_priv = dev->dev_private;
717         if (!dev_priv->fbdev)
718                 return;
719
720         flush_work(&dev_priv->fbdev_suspend_work);
721
722         async_synchronize_full();
723         intel_fbdev_destroy(dev, dev_priv->fbdev);
724         kfree(dev_priv->fbdev);
725         dev_priv->fbdev = NULL;
726 }
727
728 void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous)
729 {
730         struct drm_i915_private *dev_priv = dev->dev_private;
731         struct intel_fbdev *ifbdev = dev_priv->fbdev;
732         struct fb_info *info;
733
734         if (!ifbdev)
735                 return;
736
737         info = ifbdev->helper.fbdev;
738
739         if (synchronous) {
740                 /* Flush any pending work to turn the console on, and then
741                  * wait to turn it off. It must be synchronous as we are
742                  * about to suspend or unload the driver.
743                  *
744                  * Note that from within the work-handler, we cannot flush
745                  * ourselves, so only flush outstanding work upon suspend!
746                  */
747                 if (state != FBINFO_STATE_RUNNING)
748                         flush_work(&dev_priv->fbdev_suspend_work);
749                 console_lock();
750         } else {
751                 /*
752                  * The console lock can be pretty contented on resume due
753                  * to all the printk activity.  Try to keep it out of the hot
754                  * path of resume if possible.
755                  */
756                 WARN_ON(state != FBINFO_STATE_RUNNING);
757                 if (!console_trylock()) {
758                         /* Don't block our own workqueue as this can
759                          * be run in parallel with other i915.ko tasks.
760                          */
761                         schedule_work(&dev_priv->fbdev_suspend_work);
762                         return;
763                 }
764         }
765
766         /* On resume from hibernation: If the object is shmemfs backed, it has
767          * been restored from swap. If the object is stolen however, it will be
768          * full of whatever garbage was left in there.
769          */
770         if (state == FBINFO_STATE_RUNNING && ifbdev->fb->obj->stolen)
771                 memset_io(info->screen_base, 0, info->screen_size);
772
773         drm_fb_helper_set_suspend(&ifbdev->helper, state);
774         console_unlock();
775 }
776
777 void intel_fbdev_output_poll_changed(struct drm_device *dev)
778 {
779         struct drm_i915_private *dev_priv = dev->dev_private;
780         if (dev_priv->fbdev)
781                 drm_fb_helper_hotplug_event(&dev_priv->fbdev->helper);
782 }
783
784 void intel_fbdev_restore_mode(struct drm_device *dev)
785 {
786         int ret;
787         struct drm_i915_private *dev_priv = dev->dev_private;
788         struct intel_fbdev *ifbdev = dev_priv->fbdev;
789         struct drm_fb_helper *fb_helper;
790
791         if (!ifbdev)
792                 return;
793
794         fb_helper = &ifbdev->helper;
795
796         ret = drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper);
797         if (ret) {
798                 DRM_DEBUG("failed to restore crtc mode\n");
799         } else {
800                 mutex_lock(&fb_helper->dev->struct_mutex);
801                 intel_fb_obj_invalidate(ifbdev->fb->obj, ORIGIN_GTT);
802                 mutex_unlock(&fb_helper->dev->struct_mutex);
803         }
804 }