Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v4.8 854 lines 24 kB view raw
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 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 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 66static 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 84static 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 103static 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 117static 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 i915_ggtt *ggtt = &dev_priv->ggtt; 126 struct drm_mode_fb_cmd2 mode_cmd = {}; 127 struct drm_i915_gem_object *obj = NULL; 128 int size, ret; 129 130 /* we don't do packed 24bpp */ 131 if (sizes->surface_bpp == 24) 132 sizes->surface_bpp = 32; 133 134 mode_cmd.width = sizes->surface_width; 135 mode_cmd.height = sizes->surface_height; 136 137 mode_cmd.pitches[0] = ALIGN(mode_cmd.width * 138 DIV_ROUND_UP(sizes->surface_bpp, 8), 64); 139 mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp, 140 sizes->surface_depth); 141 142 mutex_lock(&dev->struct_mutex); 143 144 size = mode_cmd.pitches[0] * mode_cmd.height; 145 size = PAGE_ALIGN(size); 146 147 /* If the FB is too big, just don't use it since fbdev is not very 148 * important and we should probably use that space with FBC or other 149 * features. */ 150 if (size * 2 < ggtt->stolen_usable_size) 151 obj = i915_gem_object_create_stolen(dev, size); 152 if (obj == NULL) 153 obj = i915_gem_object_create(dev, size); 154 if (IS_ERR(obj)) { 155 DRM_ERROR("failed to allocate framebuffer\n"); 156 ret = PTR_ERR(obj); 157 goto out; 158 } 159 160 fb = __intel_framebuffer_create(dev, &mode_cmd, obj); 161 if (IS_ERR(fb)) { 162 drm_gem_object_unreference(&obj->base); 163 ret = PTR_ERR(fb); 164 goto out; 165 } 166 167 mutex_unlock(&dev->struct_mutex); 168 169 ifbdev->fb = to_intel_framebuffer(fb); 170 171 return 0; 172 173out: 174 mutex_unlock(&dev->struct_mutex); 175 return ret; 176} 177 178static int intelfb_create(struct drm_fb_helper *helper, 179 struct drm_fb_helper_surface_size *sizes) 180{ 181 struct intel_fbdev *ifbdev = 182 container_of(helper, struct intel_fbdev, helper); 183 struct intel_framebuffer *intel_fb = ifbdev->fb; 184 struct drm_device *dev = helper->dev; 185 struct drm_i915_private *dev_priv = to_i915(dev); 186 struct i915_ggtt *ggtt = &dev_priv->ggtt; 187 struct fb_info *info; 188 struct drm_framebuffer *fb; 189 struct i915_vma *vma; 190 struct drm_i915_gem_object *obj; 191 bool prealloc = false; 192 void *vaddr; 193 int ret; 194 195 if (intel_fb && 196 (sizes->fb_width > intel_fb->base.width || 197 sizes->fb_height > intel_fb->base.height)) { 198 DRM_DEBUG_KMS("BIOS fb too small (%dx%d), we require (%dx%d)," 199 " releasing it\n", 200 intel_fb->base.width, intel_fb->base.height, 201 sizes->fb_width, sizes->fb_height); 202 drm_framebuffer_unreference(&intel_fb->base); 203 intel_fb = ifbdev->fb = NULL; 204 } 205 if (!intel_fb || WARN_ON(!intel_fb->obj)) { 206 DRM_DEBUG_KMS("no BIOS fb, allocating a new one\n"); 207 ret = intelfb_alloc(helper, sizes); 208 if (ret) 209 return ret; 210 intel_fb = ifbdev->fb; 211 } else { 212 DRM_DEBUG_KMS("re-using BIOS fb\n"); 213 prealloc = true; 214 sizes->fb_width = intel_fb->base.width; 215 sizes->fb_height = intel_fb->base.height; 216 } 217 218 obj = intel_fb->obj; 219 220 mutex_lock(&dev->struct_mutex); 221 222 /* Pin the GGTT vma for our access via info->screen_base. 223 * This also validates that any existing fb inherited from the 224 * BIOS is suitable for own access. 225 */ 226 ret = intel_pin_and_fence_fb_obj(&ifbdev->fb->base, BIT(DRM_ROTATE_0)); 227 if (ret) 228 goto out_unlock; 229 230 info = drm_fb_helper_alloc_fbi(helper); 231 if (IS_ERR(info)) { 232 DRM_ERROR("Failed to allocate fb_info\n"); 233 ret = PTR_ERR(info); 234 goto out_unpin; 235 } 236 237 info->par = helper; 238 239 fb = &ifbdev->fb->base; 240 241 ifbdev->helper.fb = fb; 242 243 strcpy(info->fix.id, "inteldrmfb"); 244 245 info->flags = FBINFO_DEFAULT | FBINFO_CAN_FORCE_OUTPUT; 246 info->fbops = &intelfb_ops; 247 248 vma = i915_gem_obj_to_ggtt(obj); 249 250 /* setup aperture base/size for vesafb takeover */ 251 info->apertures->ranges[0].base = dev->mode_config.fb_base; 252 info->apertures->ranges[0].size = ggtt->mappable_end; 253 254 info->fix.smem_start = dev->mode_config.fb_base + vma->node.start; 255 info->fix.smem_len = vma->node.size; 256 257 vaddr = i915_vma_pin_iomap(vma); 258 if (IS_ERR(vaddr)) { 259 DRM_ERROR("Failed to remap framebuffer into virtual memory\n"); 260 ret = PTR_ERR(vaddr); 261 goto out_destroy_fbi; 262 } 263 info->screen_base = vaddr; 264 info->screen_size = vma->node.size; 265 266 /* This driver doesn't need a VT switch to restore the mode on resume */ 267 info->skip_vt_switch = true; 268 269 drm_fb_helper_fill_fix(info, fb->pitches[0], fb->depth); 270 drm_fb_helper_fill_var(info, &ifbdev->helper, sizes->fb_width, sizes->fb_height); 271 272 /* If the object is shmemfs backed, it will have given us zeroed pages. 273 * If the object is stolen however, it will be full of whatever 274 * garbage was left in there. 275 */ 276 if (ifbdev->fb->obj->stolen && !prealloc) 277 memset_io(info->screen_base, 0, info->screen_size); 278 279 /* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */ 280 281 DRM_DEBUG_KMS("allocated %dx%d fb: 0x%08llx, bo %p\n", 282 fb->width, fb->height, 283 i915_gem_obj_ggtt_offset(obj), obj); 284 285 mutex_unlock(&dev->struct_mutex); 286 vga_switcheroo_client_fb_set(dev->pdev, info); 287 return 0; 288 289out_destroy_fbi: 290 drm_fb_helper_release_fbi(helper); 291out_unpin: 292 intel_unpin_fb_obj(&ifbdev->fb->base, BIT(DRM_ROTATE_0)); 293out_unlock: 294 mutex_unlock(&dev->struct_mutex); 295 return ret; 296} 297 298/** Sets the color ramps on behalf of RandR */ 299static void intel_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, 300 u16 blue, int regno) 301{ 302 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 303 304 intel_crtc->lut_r[regno] = red >> 8; 305 intel_crtc->lut_g[regno] = green >> 8; 306 intel_crtc->lut_b[regno] = blue >> 8; 307} 308 309static void intel_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green, 310 u16 *blue, int regno) 311{ 312 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 313 314 *red = intel_crtc->lut_r[regno] << 8; 315 *green = intel_crtc->lut_g[regno] << 8; 316 *blue = intel_crtc->lut_b[regno] << 8; 317} 318 319static struct drm_fb_helper_crtc * 320intel_fb_helper_crtc(struct drm_fb_helper *fb_helper, struct drm_crtc *crtc) 321{ 322 int i; 323 324 for (i = 0; i < fb_helper->crtc_count; i++) 325 if (fb_helper->crtc_info[i].mode_set.crtc == crtc) 326 return &fb_helper->crtc_info[i]; 327 328 return NULL; 329} 330 331/* 332 * Try to read the BIOS display configuration and use it for the initial 333 * fb configuration. 334 * 335 * The BIOS or boot loader will generally create an initial display 336 * configuration for us that includes some set of active pipes and displays. 337 * This routine tries to figure out which pipes and connectors are active 338 * and stuffs them into the crtcs and modes array given to us by the 339 * drm_fb_helper code. 340 * 341 * The overall sequence is: 342 * intel_fbdev_init - from driver load 343 * intel_fbdev_init_bios - initialize the intel_fbdev using BIOS data 344 * drm_fb_helper_init - build fb helper structs 345 * drm_fb_helper_single_add_all_connectors - more fb helper structs 346 * intel_fbdev_initial_config - apply the config 347 * drm_fb_helper_initial_config - call ->probe then register_framebuffer() 348 * drm_setup_crtcs - build crtc config for fbdev 349 * intel_fb_initial_config - find active connectors etc 350 * drm_fb_helper_single_fb_probe - set up fbdev 351 * intelfb_create - re-use or alloc fb, build out fbdev structs 352 * 353 * Note that we don't make special consideration whether we could actually 354 * switch to the selected modes without a full modeset. E.g. when the display 355 * is in VGA mode we need to recalculate watermarks and set a new high-res 356 * framebuffer anyway. 357 */ 358static bool intel_fb_initial_config(struct drm_fb_helper *fb_helper, 359 struct drm_fb_helper_crtc **crtcs, 360 struct drm_display_mode **modes, 361 struct drm_fb_offset *offsets, 362 bool *enabled, int width, int height) 363{ 364 struct drm_device *dev = fb_helper->dev; 365 unsigned long conn_configured, mask; 366 unsigned int count = min(fb_helper->connector_count, BITS_PER_LONG); 367 int i, j; 368 bool *save_enabled; 369 bool fallback = true; 370 int num_connectors_enabled = 0; 371 int num_connectors_detected = 0; 372 int pass = 0; 373 374 save_enabled = kcalloc(count, sizeof(bool), GFP_KERNEL); 375 if (!save_enabled) 376 return false; 377 378 memcpy(save_enabled, enabled, count); 379 mask = BIT(count) - 1; 380 conn_configured = 0; 381retry: 382 for (i = 0; i < count; i++) { 383 struct drm_fb_helper_connector *fb_conn; 384 struct drm_connector *connector; 385 struct drm_encoder *encoder; 386 struct drm_fb_helper_crtc *new_crtc; 387 struct intel_crtc *intel_crtc; 388 389 fb_conn = fb_helper->connector_info[i]; 390 connector = fb_conn->connector; 391 392 if (conn_configured & BIT(i)) 393 continue; 394 395 if (pass == 0 && !connector->has_tile) 396 continue; 397 398 if (connector->status == connector_status_connected) 399 num_connectors_detected++; 400 401 if (!enabled[i]) { 402 DRM_DEBUG_KMS("connector %s not enabled, skipping\n", 403 connector->name); 404 conn_configured |= BIT(i); 405 continue; 406 } 407 408 if (connector->force == DRM_FORCE_OFF) { 409 DRM_DEBUG_KMS("connector %s is disabled by user, skipping\n", 410 connector->name); 411 enabled[i] = false; 412 continue; 413 } 414 415 encoder = connector->state->best_encoder; 416 if (!encoder || WARN_ON(!connector->state->crtc)) { 417 if (connector->force > DRM_FORCE_OFF) 418 goto bail; 419 420 DRM_DEBUG_KMS("connector %s has no encoder or crtc, skipping\n", 421 connector->name); 422 enabled[i] = false; 423 conn_configured |= BIT(i); 424 continue; 425 } 426 427 num_connectors_enabled++; 428 429 intel_crtc = to_intel_crtc(connector->state->crtc); 430 for (j = 0; j < 256; j++) { 431 intel_crtc->lut_r[j] = j; 432 intel_crtc->lut_g[j] = j; 433 intel_crtc->lut_b[j] = j; 434 } 435 436 new_crtc = intel_fb_helper_crtc(fb_helper, 437 connector->state->crtc); 438 439 /* 440 * Make sure we're not trying to drive multiple connectors 441 * with a single CRTC, since our cloning support may not 442 * match the BIOS. 443 */ 444 for (j = 0; j < count; j++) { 445 if (crtcs[j] == new_crtc) { 446 DRM_DEBUG_KMS("fallback: cloned configuration\n"); 447 goto bail; 448 } 449 } 450 451 DRM_DEBUG_KMS("looking for cmdline mode on connector %s\n", 452 connector->name); 453 454 /* go for command line mode first */ 455 modes[i] = drm_pick_cmdline_mode(fb_conn, width, height); 456 457 /* try for preferred next */ 458 if (!modes[i]) { 459 DRM_DEBUG_KMS("looking for preferred mode on connector %s %d\n", 460 connector->name, connector->has_tile); 461 modes[i] = drm_has_preferred_mode(fb_conn, width, 462 height); 463 } 464 465 /* No preferred mode marked by the EDID? Are there any modes? */ 466 if (!modes[i] && !list_empty(&connector->modes)) { 467 DRM_DEBUG_KMS("using first mode listed on connector %s\n", 468 connector->name); 469 modes[i] = list_first_entry(&connector->modes, 470 struct drm_display_mode, 471 head); 472 } 473 474 /* last resort: use current mode */ 475 if (!modes[i]) { 476 /* 477 * IMPORTANT: We want to use the adjusted mode (i.e. 478 * after the panel fitter upscaling) as the initial 479 * config, not the input mode, which is what crtc->mode 480 * usually contains. But since our current 481 * code puts a mode derived from the post-pfit timings 482 * into crtc->mode this works out correctly. 483 * 484 * This is crtc->mode and not crtc->state->mode for the 485 * fastboot check to work correctly. crtc_state->mode has 486 * I915_MODE_FLAG_INHERITED, which we clear to force check 487 * state. 488 */ 489 DRM_DEBUG_KMS("looking for current mode on connector %s\n", 490 connector->name); 491 modes[i] = &connector->state->crtc->mode; 492 } 493 crtcs[i] = new_crtc; 494 495 DRM_DEBUG_KMS("connector %s on [CRTC:%d:%s]: %dx%d%s\n", 496 connector->name, 497 connector->state->crtc->base.id, 498 connector->state->crtc->name, 499 modes[i]->hdisplay, modes[i]->vdisplay, 500 modes[i]->flags & DRM_MODE_FLAG_INTERLACE ? "i" :""); 501 502 fallback = false; 503 conn_configured |= BIT(i); 504 } 505 506 if ((conn_configured & mask) != mask) { 507 pass++; 508 goto retry; 509 } 510 511 /* 512 * If the BIOS didn't enable everything it could, fall back to have the 513 * same user experiencing of lighting up as much as possible like the 514 * fbdev helper library. 515 */ 516 if (num_connectors_enabled != num_connectors_detected && 517 num_connectors_enabled < INTEL_INFO(dev)->num_pipes) { 518 DRM_DEBUG_KMS("fallback: Not all outputs enabled\n"); 519 DRM_DEBUG_KMS("Enabled: %i, detected: %i\n", num_connectors_enabled, 520 num_connectors_detected); 521 fallback = true; 522 } 523 524 if (fallback) { 525bail: 526 DRM_DEBUG_KMS("Not using firmware configuration\n"); 527 memcpy(enabled, save_enabled, count); 528 kfree(save_enabled); 529 return false; 530 } 531 532 kfree(save_enabled); 533 return true; 534} 535 536static const struct drm_fb_helper_funcs intel_fb_helper_funcs = { 537 .initial_config = intel_fb_initial_config, 538 .gamma_set = intel_crtc_fb_gamma_set, 539 .gamma_get = intel_crtc_fb_gamma_get, 540 .fb_probe = intelfb_create, 541}; 542 543static void intel_fbdev_destroy(struct intel_fbdev *ifbdev) 544{ 545 /* We rely on the object-free to release the VMA pinning for 546 * the info->screen_base mmaping. Leaking the VMA is simpler than 547 * trying to rectify all the possible error paths leading here. 548 */ 549 550 drm_fb_helper_unregister_fbi(&ifbdev->helper); 551 drm_fb_helper_release_fbi(&ifbdev->helper); 552 553 drm_fb_helper_fini(&ifbdev->helper); 554 555 if (ifbdev->fb) { 556 mutex_lock(&ifbdev->helper.dev->struct_mutex); 557 intel_unpin_fb_obj(&ifbdev->fb->base, BIT(DRM_ROTATE_0)); 558 mutex_unlock(&ifbdev->helper.dev->struct_mutex); 559 560 drm_framebuffer_remove(&ifbdev->fb->base); 561 } 562 563 kfree(ifbdev); 564} 565 566/* 567 * Build an intel_fbdev struct using a BIOS allocated framebuffer, if possible. 568 * The core display code will have read out the current plane configuration, 569 * so we use that to figure out if there's an object for us to use as the 570 * fb, and if so, we re-use it for the fbdev configuration. 571 * 572 * Note we only support a single fb shared across pipes for boot (mostly for 573 * fbcon), so we just find the biggest and use that. 574 */ 575static bool intel_fbdev_init_bios(struct drm_device *dev, 576 struct intel_fbdev *ifbdev) 577{ 578 struct intel_framebuffer *fb = NULL; 579 struct drm_crtc *crtc; 580 struct intel_crtc *intel_crtc; 581 unsigned int max_size = 0; 582 583 /* Find the largest fb */ 584 for_each_crtc(dev, crtc) { 585 struct drm_i915_gem_object *obj = 586 intel_fb_obj(crtc->primary->state->fb); 587 intel_crtc = to_intel_crtc(crtc); 588 589 if (!crtc->state->active || !obj) { 590 DRM_DEBUG_KMS("pipe %c not active or no fb, skipping\n", 591 pipe_name(intel_crtc->pipe)); 592 continue; 593 } 594 595 if (obj->base.size > max_size) { 596 DRM_DEBUG_KMS("found possible fb from plane %c\n", 597 pipe_name(intel_crtc->pipe)); 598 fb = to_intel_framebuffer(crtc->primary->state->fb); 599 max_size = obj->base.size; 600 } 601 } 602 603 if (!fb) { 604 DRM_DEBUG_KMS("no active fbs found, not using BIOS config\n"); 605 goto out; 606 } 607 608 /* Now make sure all the pipes will fit into it */ 609 for_each_crtc(dev, crtc) { 610 unsigned int cur_size; 611 612 intel_crtc = to_intel_crtc(crtc); 613 614 if (!crtc->state->active) { 615 DRM_DEBUG_KMS("pipe %c not active, skipping\n", 616 pipe_name(intel_crtc->pipe)); 617 continue; 618 } 619 620 DRM_DEBUG_KMS("checking plane %c for BIOS fb\n", 621 pipe_name(intel_crtc->pipe)); 622 623 /* 624 * See if the plane fb we found above will fit on this 625 * pipe. Note we need to use the selected fb's pitch and bpp 626 * rather than the current pipe's, since they differ. 627 */ 628 cur_size = intel_crtc->config->base.adjusted_mode.crtc_hdisplay; 629 cur_size = cur_size * fb->base.bits_per_pixel / 8; 630 if (fb->base.pitches[0] < cur_size) { 631 DRM_DEBUG_KMS("fb not wide enough for plane %c (%d vs %d)\n", 632 pipe_name(intel_crtc->pipe), 633 cur_size, fb->base.pitches[0]); 634 fb = NULL; 635 break; 636 } 637 638 cur_size = intel_crtc->config->base.adjusted_mode.crtc_vdisplay; 639 cur_size = intel_fb_align_height(dev, cur_size, 640 fb->base.pixel_format, 641 fb->base.modifier[0]); 642 cur_size *= fb->base.pitches[0]; 643 DRM_DEBUG_KMS("pipe %c area: %dx%d, bpp: %d, size: %d\n", 644 pipe_name(intel_crtc->pipe), 645 intel_crtc->config->base.adjusted_mode.crtc_hdisplay, 646 intel_crtc->config->base.adjusted_mode.crtc_vdisplay, 647 fb->base.bits_per_pixel, 648 cur_size); 649 650 if (cur_size > max_size) { 651 DRM_DEBUG_KMS("fb not big enough for plane %c (%d vs %d)\n", 652 pipe_name(intel_crtc->pipe), 653 cur_size, max_size); 654 fb = NULL; 655 break; 656 } 657 658 DRM_DEBUG_KMS("fb big enough for plane %c (%d >= %d)\n", 659 pipe_name(intel_crtc->pipe), 660 max_size, cur_size); 661 } 662 663 if (!fb) { 664 DRM_DEBUG_KMS("BIOS fb not suitable for all pipes, not using\n"); 665 goto out; 666 } 667 668 ifbdev->preferred_bpp = fb->base.bits_per_pixel; 669 ifbdev->fb = fb; 670 671 drm_framebuffer_reference(&ifbdev->fb->base); 672 673 /* Final pass to check if any active pipes don't have fbs */ 674 for_each_crtc(dev, crtc) { 675 intel_crtc = to_intel_crtc(crtc); 676 677 if (!crtc->state->active) 678 continue; 679 680 WARN(!crtc->primary->fb, 681 "re-used BIOS config but lost an fb on crtc %d\n", 682 crtc->base.id); 683 } 684 685 686 DRM_DEBUG_KMS("using BIOS fb for initial console\n"); 687 return true; 688 689out: 690 691 return false; 692} 693 694static void intel_fbdev_suspend_worker(struct work_struct *work) 695{ 696 intel_fbdev_set_suspend(&container_of(work, 697 struct drm_i915_private, 698 fbdev_suspend_work)->drm, 699 FBINFO_STATE_RUNNING, 700 true); 701} 702 703int intel_fbdev_init(struct drm_device *dev) 704{ 705 struct intel_fbdev *ifbdev; 706 struct drm_i915_private *dev_priv = to_i915(dev); 707 int ret; 708 709 if (WARN_ON(INTEL_INFO(dev)->num_pipes == 0)) 710 return -ENODEV; 711 712 ifbdev = kzalloc(sizeof(struct intel_fbdev), GFP_KERNEL); 713 if (ifbdev == NULL) 714 return -ENOMEM; 715 716 drm_fb_helper_prepare(dev, &ifbdev->helper, &intel_fb_helper_funcs); 717 718 if (!intel_fbdev_init_bios(dev, ifbdev)) 719 ifbdev->preferred_bpp = 32; 720 721 ret = drm_fb_helper_init(dev, &ifbdev->helper, 722 INTEL_INFO(dev)->num_pipes, 4); 723 if (ret) { 724 kfree(ifbdev); 725 return ret; 726 } 727 728 dev_priv->fbdev = ifbdev; 729 INIT_WORK(&dev_priv->fbdev_suspend_work, intel_fbdev_suspend_worker); 730 731 drm_fb_helper_single_add_all_connectors(&ifbdev->helper); 732 733 return 0; 734} 735 736static void intel_fbdev_initial_config(void *data, async_cookie_t cookie) 737{ 738 struct intel_fbdev *ifbdev = data; 739 740 /* Due to peculiar init order wrt to hpd handling this is separate. */ 741 if (drm_fb_helper_initial_config(&ifbdev->helper, 742 ifbdev->preferred_bpp)) 743 intel_fbdev_fini(ifbdev->helper.dev); 744} 745 746void intel_fbdev_initial_config_async(struct drm_device *dev) 747{ 748 struct intel_fbdev *ifbdev = to_i915(dev)->fbdev; 749 750 ifbdev->cookie = async_schedule(intel_fbdev_initial_config, ifbdev); 751} 752 753static void intel_fbdev_sync(struct intel_fbdev *ifbdev) 754{ 755 if (!ifbdev->cookie) 756 return; 757 758 /* Only serialises with all preceding async calls, hence +1 */ 759 async_synchronize_cookie(ifbdev->cookie + 1); 760 ifbdev->cookie = 0; 761} 762 763void intel_fbdev_fini(struct drm_device *dev) 764{ 765 struct drm_i915_private *dev_priv = to_i915(dev); 766 struct intel_fbdev *ifbdev = dev_priv->fbdev; 767 768 if (!ifbdev) 769 return; 770 771 flush_work(&dev_priv->fbdev_suspend_work); 772 if (!current_is_async()) 773 intel_fbdev_sync(ifbdev); 774 775 intel_fbdev_destroy(ifbdev); 776 dev_priv->fbdev = NULL; 777} 778 779void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous) 780{ 781 struct drm_i915_private *dev_priv = to_i915(dev); 782 struct intel_fbdev *ifbdev = dev_priv->fbdev; 783 struct fb_info *info; 784 785 if (!ifbdev || !ifbdev->fb) 786 return; 787 788 info = ifbdev->helper.fbdev; 789 790 if (synchronous) { 791 /* Flush any pending work to turn the console on, and then 792 * wait to turn it off. It must be synchronous as we are 793 * about to suspend or unload the driver. 794 * 795 * Note that from within the work-handler, we cannot flush 796 * ourselves, so only flush outstanding work upon suspend! 797 */ 798 if (state != FBINFO_STATE_RUNNING) 799 flush_work(&dev_priv->fbdev_suspend_work); 800 console_lock(); 801 } else { 802 /* 803 * The console lock can be pretty contented on resume due 804 * to all the printk activity. Try to keep it out of the hot 805 * path of resume if possible. 806 */ 807 WARN_ON(state != FBINFO_STATE_RUNNING); 808 if (!console_trylock()) { 809 /* Don't block our own workqueue as this can 810 * be run in parallel with other i915.ko tasks. 811 */ 812 schedule_work(&dev_priv->fbdev_suspend_work); 813 return; 814 } 815 } 816 817 /* On resume from hibernation: If the object is shmemfs backed, it has 818 * been restored from swap. If the object is stolen however, it will be 819 * full of whatever garbage was left in there. 820 */ 821 if (state == FBINFO_STATE_RUNNING && ifbdev->fb->obj->stolen) 822 memset_io(info->screen_base, 0, info->screen_size); 823 824 drm_fb_helper_set_suspend(&ifbdev->helper, state); 825 console_unlock(); 826} 827 828void intel_fbdev_output_poll_changed(struct drm_device *dev) 829{ 830 struct intel_fbdev *ifbdev = to_i915(dev)->fbdev; 831 832 if (ifbdev && ifbdev->fb) 833 drm_fb_helper_hotplug_event(&ifbdev->helper); 834} 835 836void intel_fbdev_restore_mode(struct drm_device *dev) 837{ 838 struct intel_fbdev *ifbdev = to_i915(dev)->fbdev; 839 840 if (!ifbdev) 841 return; 842 843 intel_fbdev_sync(ifbdev); 844 if (!ifbdev->fb) 845 return; 846 847 if (drm_fb_helper_restore_fbdev_mode_unlocked(&ifbdev->helper)) { 848 DRM_DEBUG("failed to restore crtc mode\n"); 849 } else { 850 mutex_lock(&dev->struct_mutex); 851 intel_fb_obj_invalidate(ifbdev->fb->obj, ORIGIN_GTT); 852 mutex_unlock(&dev->struct_mutex); 853 } 854}