intel_fbdev.c 23.9 KB
Newer Older
J
Jesse Barnes 已提交
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
/*
 * Copyright © 2007 David Airlie
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 *
 * Authors:
 *     David Airlie
 */

27
#include <linux/async.h>
J
Jesse Barnes 已提交
28 29
#include <linux/module.h>
#include <linux/kernel.h>
30
#include <linux/console.h>
J
Jesse Barnes 已提交
31 32 33 34 35 36 37 38
#include <linux/errno.h>
#include <linux/string.h>
#include <linux/mm.h>
#include <linux/tty.h>
#include <linux/sysrq.h>
#include <linux/delay.h>
#include <linux/fb.h>
#include <linux/init.h>
39
#include <linux/vga_switcheroo.h>
J
Jesse Barnes 已提交
40

41 42 43
#include <drm/drmP.h>
#include <drm/drm_crtc.h>
#include <drm/drm_fb_helper.h>
J
Jesse Barnes 已提交
44
#include "intel_drv.h"
45
#include "intel_frontbuffer.h"
46
#include <drm/i915_drm.h>
J
Jesse Barnes 已提交
47 48
#include "i915_drv.h"

49 50 51 52 53 54 55 56 57 58 59
static int intel_fbdev_set_par(struct fb_info *info)
{
	struct drm_fb_helper *fb_helper = info->par;
	struct intel_fbdev *ifbdev =
		container_of(fb_helper, struct intel_fbdev, helper);
	int ret;

	ret = drm_fb_helper_set_par(info);

	if (ret == 0) {
		mutex_lock(&fb_helper->dev->struct_mutex);
60
		intel_fb_obj_invalidate(ifbdev->fb->obj, ORIGIN_GTT);
61 62 63 64 65 66
		mutex_unlock(&fb_helper->dev->struct_mutex);
	}

	return ret;
}

67 68 69 70 71 72 73 74 75 76 77
static int intel_fbdev_blank(int blank, struct fb_info *info)
{
	struct drm_fb_helper *fb_helper = info->par;
	struct intel_fbdev *ifbdev =
		container_of(fb_helper, struct intel_fbdev, helper);
	int ret;

	ret = drm_fb_helper_blank(blank, info);

	if (ret == 0) {
		mutex_lock(&fb_helper->dev->struct_mutex);
78
		intel_fb_obj_invalidate(ifbdev->fb->obj, ORIGIN_GTT);
79 80 81 82 83 84
		mutex_unlock(&fb_helper->dev->struct_mutex);
	}

	return ret;
}

85 86 87 88 89 90 91 92 93 94 95 96
static int intel_fbdev_pan_display(struct fb_var_screeninfo *var,
				   struct fb_info *info)
{
	struct drm_fb_helper *fb_helper = info->par;
	struct intel_fbdev *ifbdev =
		container_of(fb_helper, struct intel_fbdev, helper);

	int ret;
	ret = drm_fb_helper_pan_display(var, info);

	if (ret == 0) {
		mutex_lock(&fb_helper->dev->struct_mutex);
97
		intel_fb_obj_invalidate(ifbdev->fb->obj, ORIGIN_GTT);
98 99 100 101 102 103
		mutex_unlock(&fb_helper->dev->struct_mutex);
	}

	return ret;
}

J
Jesse Barnes 已提交
104 105
static struct fb_ops intelfb_ops = {
	.owner = THIS_MODULE,
106
	.fb_check_var = drm_fb_helper_check_var,
107
	.fb_set_par = intel_fbdev_set_par,
108 109 110
	.fb_fillrect = drm_fb_helper_cfb_fillrect,
	.fb_copyarea = drm_fb_helper_cfb_copyarea,
	.fb_imageblit = drm_fb_helper_cfb_imageblit,
111
	.fb_pan_display = intel_fbdev_pan_display,
112
	.fb_blank = intel_fbdev_blank,
113
	.fb_setcmap = drm_fb_helper_setcmap,
J
Jesse Barnes 已提交
114 115
	.fb_debug_enter = drm_fb_helper_debug_enter,
	.fb_debug_leave = drm_fb_helper_debug_leave,
J
Jesse Barnes 已提交
116 117
};

118 119
static int intelfb_alloc(struct drm_fb_helper *helper,
			 struct drm_fb_helper_surface_size *sizes)
J
Jesse Barnes 已提交
120
{
121 122
	struct intel_fbdev *ifbdev =
		container_of(helper, struct intel_fbdev, helper);
123
	struct drm_framebuffer *fb;
124
	struct drm_device *dev = helper->dev;
125
	struct drm_i915_private *dev_priv = to_i915(dev);
126
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
127
	struct drm_mode_fb_cmd2 mode_cmd = {};
128
	struct drm_i915_gem_object *obj = NULL;
129
	int size, ret;
J
Jesse Barnes 已提交
130

131
	/* we don't do packed 24bpp */
132 133
	if (sizes->surface_bpp == 24)
		sizes->surface_bpp = 32;
134

135 136
	mode_cmd.width = sizes->surface_width;
	mode_cmd.height = sizes->surface_height;
J
Jesse Barnes 已提交
137

138 139
	mode_cmd.pitches[0] = ALIGN(mode_cmd.width *
				    DIV_ROUND_UP(sizes->surface_bpp, 8), 64);
140 141
	mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp,
							  sizes->surface_depth);
J
Jesse Barnes 已提交
142

143 144
	mutex_lock(&dev->struct_mutex);

145
	size = mode_cmd.pitches[0] * mode_cmd.height;
146
	size = PAGE_ALIGN(size);
147 148 149 150

	/* If the FB is too big, just don't use it since fbdev is not very
	 * important and we should probably use that space with FBC or other
	 * features. */
151
	if (size * 2 < ggtt->stolen_usable_size)
152
		obj = i915_gem_object_create_stolen(dev, size);
153
	if (obj == NULL)
154
		obj = i915_gem_object_create(dev, size);
155
	if (IS_ERR(obj)) {
156
		DRM_ERROR("failed to allocate framebuffer\n");
157
		ret = PTR_ERR(obj);
J
Jesse Barnes 已提交
158 159 160
		goto out;
	}

161 162
	fb = __intel_framebuffer_create(dev, &mode_cmd, obj);
	if (IS_ERR(fb)) {
163
		i915_gem_object_put(obj);
164
		ret = PTR_ERR(fb);
165
		goto out;
166 167
	}

168 169
	mutex_unlock(&dev->struct_mutex);

170
	ifbdev->fb = to_intel_framebuffer(fb);
171 172 173 174

	return 0;

out:
175
	mutex_unlock(&dev->struct_mutex);
176 177 178 179 180 181 182 183
	return ret;
}

static int intelfb_create(struct drm_fb_helper *helper,
			  struct drm_fb_helper_surface_size *sizes)
{
	struct intel_fbdev *ifbdev =
		container_of(helper, struct intel_fbdev, helper);
184
	struct intel_framebuffer *intel_fb = ifbdev->fb;
185
	struct drm_device *dev = helper->dev;
186 187
	struct drm_i915_private *dev_priv = to_i915(dev);
	struct i915_ggtt *ggtt = &dev_priv->ggtt;
188 189
	struct fb_info *info;
	struct drm_framebuffer *fb;
190
	struct i915_vma *vma;
191
	struct drm_i915_gem_object *obj;
192
	bool prealloc = false;
193
	void __iomem *vaddr;
194
	int ret;
195

196 197 198 199 200 201 202 203 204 205
	if (intel_fb &&
	    (sizes->fb_width > intel_fb->base.width ||
	     sizes->fb_height > intel_fb->base.height)) {
		DRM_DEBUG_KMS("BIOS fb too small (%dx%d), we require (%dx%d),"
			      " releasing it\n",
			      intel_fb->base.width, intel_fb->base.height,
			      sizes->fb_width, sizes->fb_height);
		drm_framebuffer_unreference(&intel_fb->base);
		intel_fb = ifbdev->fb = NULL;
	}
206
	if (!intel_fb || WARN_ON(!intel_fb->obj)) {
207
		DRM_DEBUG_KMS("no BIOS fb, allocating a new one\n");
208 209
		ret = intelfb_alloc(helper, sizes);
		if (ret)
210
			return ret;
211
		intel_fb = ifbdev->fb;
212
	} else {
213
		DRM_DEBUG_KMS("re-using BIOS fb\n");
214
		prealloc = true;
215 216 217 218 219 220
		sizes->fb_width = intel_fb->base.width;
		sizes->fb_height = intel_fb->base.height;
	}

	obj = intel_fb->obj;

221 222
	mutex_lock(&dev->struct_mutex);

223 224 225 226
	/* Pin the GGTT vma for our access via info->screen_base.
	 * This also validates that any existing fb inherited from the
	 * BIOS is suitable for own access.
	 */
227
	ret = intel_pin_and_fence_fb_obj(&ifbdev->fb->base, BIT(DRM_ROTATE_0));
228 229 230
	if (ret)
		goto out_unlock;

231 232
	info = drm_fb_helper_alloc_fbi(helper);
	if (IS_ERR(info)) {
233
		DRM_ERROR("Failed to allocate fb_info\n");
234
		ret = PTR_ERR(info);
235
		goto out_unpin;
J
Jesse Barnes 已提交
236 237
	}

238
	info->par = helper;
J
Jesse Barnes 已提交
239

240
	fb = &ifbdev->fb->base;
J
Jesse Barnes 已提交
241

242
	ifbdev->helper.fb = fb;
243

J
Jesse Barnes 已提交
244 245
	strcpy(info->fix.id, "inteldrmfb");

246
	info->flags = FBINFO_DEFAULT | FBINFO_CAN_FORCE_OUTPUT;
J
Jesse Barnes 已提交
247 248
	info->fbops = &intelfb_ops;

249 250
	vma = i915_gem_obj_to_ggtt(obj);

251
	/* setup aperture base/size for vesafb takeover */
252
	info->apertures->ranges[0].base = dev->mode_config.fb_base;
253
	info->apertures->ranges[0].size = ggtt->mappable_end;
254

255 256
	info->fix.smem_start = dev->mode_config.fb_base + vma->node.start;
	info->fix.smem_len = vma->node.size;
J
Jesse Barnes 已提交
257

258 259
	vaddr = i915_vma_pin_iomap(vma);
	if (IS_ERR(vaddr)) {
260
		DRM_ERROR("Failed to remap framebuffer into virtual memory\n");
261
		ret = PTR_ERR(vaddr);
262
		goto out_destroy_fbi;
J
Jesse Barnes 已提交
263
	}
264 265
	info->screen_base = vaddr;
	info->screen_size = vma->node.size;
J
Jesse Barnes 已提交
266

267 268 269
	/* This driver doesn't need a VT switch to restore the mode on resume */
	info->skip_vt_switch = true;

270
	drm_fb_helper_fill_fix(info, fb->pitches[0], fb->depth);
271
	drm_fb_helper_fill_var(info, &ifbdev->helper, sizes->fb_width, sizes->fb_height);
J
Jesse Barnes 已提交
272

273 274 275 276
	/* If the object is shmemfs backed, it will have given us zeroed pages.
	 * If the object is stolen however, it will be full of whatever
	 * garbage was left in there.
	 */
277
	if (ifbdev->fb->obj->stolen && !prealloc)
278 279
		memset_io(info->screen_base, 0, info->screen_size);

280
	/* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */
J
Jesse Barnes 已提交
281

282
	DRM_DEBUG_KMS("allocated %dx%d fb: 0x%08llx, bo %p\n",
283
		      fb->width, fb->height,
284
		      i915_gem_obj_ggtt_offset(obj), obj);
J
Jesse Barnes 已提交
285 286

	mutex_unlock(&dev->struct_mutex);
287
	vga_switcheroo_client_fb_set(dev->pdev, info);
J
Jesse Barnes 已提交
288 289
	return 0;

290 291
out_destroy_fbi:
	drm_fb_helper_release_fbi(helper);
292
out_unpin:
293
	intel_unpin_fb_obj(&ifbdev->fb->base, BIT(DRM_ROTATE_0));
294
out_unlock:
J
Jesse Barnes 已提交
295 296 297 298
	mutex_unlock(&dev->struct_mutex);
	return ret;
}

299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319
/** Sets the color ramps on behalf of RandR */
static void intel_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
				    u16 blue, int regno)
{
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);

	intel_crtc->lut_r[regno] = red >> 8;
	intel_crtc->lut_g[regno] = green >> 8;
	intel_crtc->lut_b[regno] = blue >> 8;
}

static void intel_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green,
				    u16 *blue, int regno)
{
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);

	*red = intel_crtc->lut_r[regno] << 8;
	*green = intel_crtc->lut_g[regno] << 8;
	*blue = intel_crtc->lut_b[regno] << 8;
}

320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361
static struct drm_fb_helper_crtc *
intel_fb_helper_crtc(struct drm_fb_helper *fb_helper, struct drm_crtc *crtc)
{
	int i;

	for (i = 0; i < fb_helper->crtc_count; i++)
		if (fb_helper->crtc_info[i].mode_set.crtc == crtc)
			return &fb_helper->crtc_info[i];

	return NULL;
}

/*
 * Try to read the BIOS display configuration and use it for the initial
 * fb configuration.
 *
 * The BIOS or boot loader will generally create an initial display
 * configuration for us that includes some set of active pipes and displays.
 * This routine tries to figure out which pipes and connectors are active
 * and stuffs them into the crtcs and modes array given to us by the
 * drm_fb_helper code.
 *
 * The overall sequence is:
 *   intel_fbdev_init - from driver load
 *     intel_fbdev_init_bios - initialize the intel_fbdev using BIOS data
 *     drm_fb_helper_init - build fb helper structs
 *     drm_fb_helper_single_add_all_connectors - more fb helper structs
 *   intel_fbdev_initial_config - apply the config
 *     drm_fb_helper_initial_config - call ->probe then register_framebuffer()
 *         drm_setup_crtcs - build crtc config for fbdev
 *           intel_fb_initial_config - find active connectors etc
 *         drm_fb_helper_single_fb_probe - set up fbdev
 *           intelfb_create - re-use or alloc fb, build out fbdev structs
 *
 * Note that we don't make special consideration whether we could actually
 * switch to the selected modes without a full modeset. E.g. when the display
 * is in VGA mode we need to recalculate watermarks and set a new high-res
 * framebuffer anyway.
 */
static bool intel_fb_initial_config(struct drm_fb_helper *fb_helper,
				    struct drm_fb_helper_crtc **crtcs,
				    struct drm_display_mode **modes,
362
				    struct drm_fb_offset *offsets,
363 364
				    bool *enabled, int width, int height)
{
365
	struct drm_device *dev = fb_helper->dev;
366 367
	unsigned long conn_configured, mask;
	unsigned int count = min(fb_helper->connector_count, BITS_PER_LONG);
368
	int i, j;
369
	bool *save_enabled;
370
	bool fallback = true;
371 372
	int num_connectors_enabled = 0;
	int num_connectors_detected = 0;
373
	int pass = 0;
374

375
	save_enabled = kcalloc(count, sizeof(bool), GFP_KERNEL);
376 377 378
	if (!save_enabled)
		return false;

379 380 381
	memcpy(save_enabled, enabled, count);
	mask = BIT(count) - 1;
	conn_configured = 0;
382
retry:
383
	for (i = 0; i < count; i++) {
384 385 386 387
		struct drm_fb_helper_connector *fb_conn;
		struct drm_connector *connector;
		struct drm_encoder *encoder;
		struct drm_fb_helper_crtc *new_crtc;
388
		struct intel_crtc *intel_crtc;
389 390 391

		fb_conn = fb_helper->connector_info[i];
		connector = fb_conn->connector;
392

393
		if (conn_configured & BIT(i))
394 395 396 397 398
			continue;

		if (pass == 0 && !connector->has_tile)
			continue;

399 400 401
		if (connector->status == connector_status_connected)
			num_connectors_detected++;

402
		if (!enabled[i]) {
403
			DRM_DEBUG_KMS("connector %s not enabled, skipping\n",
404
				      connector->name);
405
			conn_configured |= BIT(i);
406 407 408
			continue;
		}

409 410 411 412 413 414 415
		if (connector->force == DRM_FORCE_OFF) {
			DRM_DEBUG_KMS("connector %s is disabled by user, skipping\n",
				      connector->name);
			enabled[i] = false;
			continue;
		}

416 417
		encoder = connector->state->best_encoder;
		if (!encoder || WARN_ON(!connector->state->crtc)) {
418 419 420
			if (connector->force > DRM_FORCE_OFF)
				goto bail;

421
			DRM_DEBUG_KMS("connector %s has no encoder or crtc, skipping\n",
422
				      connector->name);
423
			enabled[i] = false;
424
			conn_configured |= BIT(i);
425 426 427
			continue;
		}

428 429
		num_connectors_enabled++;

430 431 432 433 434 435 436
		intel_crtc = to_intel_crtc(connector->state->crtc);
		for (j = 0; j < 256; j++) {
			intel_crtc->lut_r[j] = j;
			intel_crtc->lut_g[j] = j;
			intel_crtc->lut_b[j] = j;
		}

437 438
		new_crtc = intel_fb_helper_crtc(fb_helper,
						connector->state->crtc);
439 440 441 442 443 444

		/*
		 * Make sure we're not trying to drive multiple connectors
		 * with a single CRTC, since our cloning support may not
		 * match the BIOS.
		 */
445
		for (j = 0; j < count; j++) {
446
			if (crtcs[j] == new_crtc) {
447
				DRM_DEBUG_KMS("fallback: cloned configuration\n");
448
				goto bail;
449
			}
450 451
		}

452
		DRM_DEBUG_KMS("looking for cmdline mode on connector %s\n",
453
			      connector->name);
454 455 456 457 458 459

		/* go for command line mode first */
		modes[i] = drm_pick_cmdline_mode(fb_conn, width, height);

		/* try for preferred next */
		if (!modes[i]) {
460 461
			DRM_DEBUG_KMS("looking for preferred mode on connector %s %d\n",
				      connector->name, connector->has_tile);
462 463 464 465
			modes[i] = drm_has_preferred_mode(fb_conn, width,
							  height);
		}

466 467 468
		/* No preferred mode marked by the EDID? Are there any modes? */
		if (!modes[i] && !list_empty(&connector->modes)) {
			DRM_DEBUG_KMS("using first mode listed on connector %s\n",
469
				      connector->name);
470 471 472 473 474
			modes[i] = list_first_entry(&connector->modes,
						    struct drm_display_mode,
						    head);
		}

475 476 477 478 479 480
		/* last resort: use current mode */
		if (!modes[i]) {
			/*
			 * IMPORTANT: We want to use the adjusted mode (i.e.
			 * after the panel fitter upscaling) as the initial
			 * config, not the input mode, which is what crtc->mode
481
			 * usually contains. But since our current
482
			 * code puts a mode derived from the post-pfit timings
483
			 * into crtc->mode this works out correctly.
484 485 486 487 488
			 *
			 * This is crtc->mode and not crtc->state->mode for the
			 * fastboot check to work correctly. crtc_state->mode has
			 * I915_MODE_FLAG_INHERITED, which we clear to force check
			 * state.
489
			 */
490
			DRM_DEBUG_KMS("looking for current mode on connector %s\n",
491
				      connector->name);
492
			modes[i] = &connector->state->crtc->mode;
493 494 495
		}
		crtcs[i] = new_crtc;

496
		DRM_DEBUG_KMS("connector %s on [CRTC:%d:%s]: %dx%d%s\n",
497
			      connector->name,
498
			      connector->state->crtc->base.id,
499
			      connector->state->crtc->name,
500 501
			      modes[i]->hdisplay, modes[i]->vdisplay,
			      modes[i]->flags & DRM_MODE_FLAG_INTERLACE ? "i" :"");
502

503
		fallback = false;
504
		conn_configured |= BIT(i);
505 506 507 508 509
	}

	if ((conn_configured & mask) != mask) {
		pass++;
		goto retry;
510 511
	}

512 513 514 515 516 517 518 519 520 521 522 523 524
	/*
	 * If the BIOS didn't enable everything it could, fall back to have the
	 * same user experiencing of lighting up as much as possible like the
	 * fbdev helper library.
	 */
	if (num_connectors_enabled != num_connectors_detected &&
	    num_connectors_enabled < INTEL_INFO(dev)->num_pipes) {
		DRM_DEBUG_KMS("fallback: Not all outputs enabled\n");
		DRM_DEBUG_KMS("Enabled: %i, detected: %i\n", num_connectors_enabled,
			      num_connectors_detected);
		fallback = true;
	}

525
	if (fallback) {
526
bail:
527
		DRM_DEBUG_KMS("Not using firmware configuration\n");
528
		memcpy(enabled, save_enabled, count);
529 530
		kfree(save_enabled);
		return false;
531 532
	}

533
	kfree(save_enabled);
534 535 536
	return true;
}

537
static const struct drm_fb_helper_funcs intel_fb_helper_funcs = {
538
	.initial_config = intel_fb_initial_config,
539 540
	.gamma_set = intel_crtc_fb_gamma_set,
	.gamma_get = intel_crtc_fb_gamma_get,
541
	.fb_probe = intelfb_create,
542
};
J
Jesse Barnes 已提交
543

544
static void intel_fbdev_destroy(struct intel_fbdev *ifbdev)
J
Jesse Barnes 已提交
545
{
546 547 548 549
	/* We rely on the object-free to release the VMA pinning for
	 * the info->screen_base mmaping. Leaking the VMA is simpler than
	 * trying to rectify all the possible error paths leading here.
	 */
550

551 552
	drm_fb_helper_unregister_fbi(&ifbdev->helper);
	drm_fb_helper_release_fbi(&ifbdev->helper);
J
Jesse Barnes 已提交
553

554
	drm_fb_helper_fini(&ifbdev->helper);
J
Jesse Barnes 已提交
555

556
	if (ifbdev->fb) {
557
		mutex_lock(&ifbdev->helper.dev->struct_mutex);
558
		intel_unpin_fb_obj(&ifbdev->fb->base, BIT(DRM_ROTATE_0));
559
		mutex_unlock(&ifbdev->helper.dev->struct_mutex);
560

561 562
		drm_framebuffer_remove(&ifbdev->fb->base);
	}
563 564

	kfree(ifbdev);
J
Jesse Barnes 已提交
565
}
566

567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584
/*
 * Build an intel_fbdev struct using a BIOS allocated framebuffer, if possible.
 * The core display code will have read out the current plane configuration,
 * so we use that to figure out if there's an object for us to use as the
 * fb, and if so, we re-use it for the fbdev configuration.
 *
 * Note we only support a single fb shared across pipes for boot (mostly for
 * fbcon), so we just find the biggest and use that.
 */
static bool intel_fbdev_init_bios(struct drm_device *dev,
				 struct intel_fbdev *ifbdev)
{
	struct intel_framebuffer *fb = NULL;
	struct drm_crtc *crtc;
	struct intel_crtc *intel_crtc;
	unsigned int max_size = 0;

	/* Find the largest fb */
585
	for_each_crtc(dev, crtc) {
586 587
		struct drm_i915_gem_object *obj =
			intel_fb_obj(crtc->primary->state->fb);
588 589
		intel_crtc = to_intel_crtc(crtc);

590
		if (!crtc->state->active || !obj) {
591 592 593 594 595
			DRM_DEBUG_KMS("pipe %c not active or no fb, skipping\n",
				      pipe_name(intel_crtc->pipe));
			continue;
		}

596
		if (obj->base.size > max_size) {
597 598
			DRM_DEBUG_KMS("found possible fb from plane %c\n",
				      pipe_name(intel_crtc->pipe));
599 600
			fb = to_intel_framebuffer(crtc->primary->state->fb);
			max_size = obj->base.size;
601 602 603 604 605 606 607 608 609
		}
	}

	if (!fb) {
		DRM_DEBUG_KMS("no active fbs found, not using BIOS config\n");
		goto out;
	}

	/* Now make sure all the pipes will fit into it */
610
	for_each_crtc(dev, crtc) {
611 612 613 614
		unsigned int cur_size;

		intel_crtc = to_intel_crtc(crtc);

615
		if (!crtc->state->active) {
616 617 618 619 620 621 622 623 624 625
			DRM_DEBUG_KMS("pipe %c not active, skipping\n",
				      pipe_name(intel_crtc->pipe));
			continue;
		}

		DRM_DEBUG_KMS("checking plane %c for BIOS fb\n",
			      pipe_name(intel_crtc->pipe));

		/*
		 * See if the plane fb we found above will fit on this
626 627
		 * pipe.  Note we need to use the selected fb's pitch and bpp
		 * rather than the current pipe's, since they differ.
628
		 */
629
		cur_size = intel_crtc->config->base.adjusted_mode.crtc_hdisplay;
630 631 632 633 634 635 636 637 638
		cur_size = cur_size * fb->base.bits_per_pixel / 8;
		if (fb->base.pitches[0] < cur_size) {
			DRM_DEBUG_KMS("fb not wide enough for plane %c (%d vs %d)\n",
				      pipe_name(intel_crtc->pipe),
				      cur_size, fb->base.pitches[0]);
			fb = NULL;
			break;
		}

639
		cur_size = intel_crtc->config->base.adjusted_mode.crtc_vdisplay;
640
		cur_size = intel_fb_align_height(dev, cur_size,
641 642
						 fb->base.pixel_format,
						 fb->base.modifier[0]);
643 644 645
		cur_size *= fb->base.pitches[0];
		DRM_DEBUG_KMS("pipe %c area: %dx%d, bpp: %d, size: %d\n",
			      pipe_name(intel_crtc->pipe),
646 647
			      intel_crtc->config->base.adjusted_mode.crtc_hdisplay,
			      intel_crtc->config->base.adjusted_mode.crtc_vdisplay,
648
			      fb->base.bits_per_pixel,
649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668
			      cur_size);

		if (cur_size > max_size) {
			DRM_DEBUG_KMS("fb not big enough for plane %c (%d vs %d)\n",
				      pipe_name(intel_crtc->pipe),
				      cur_size, max_size);
			fb = NULL;
			break;
		}

		DRM_DEBUG_KMS("fb big enough for plane %c (%d >= %d)\n",
			      pipe_name(intel_crtc->pipe),
			      max_size, cur_size);
	}

	if (!fb) {
		DRM_DEBUG_KMS("BIOS fb not suitable for all pipes, not using\n");
		goto out;
	}

669
	ifbdev->preferred_bpp = fb->base.bits_per_pixel;
670 671
	ifbdev->fb = fb;

672
	drm_framebuffer_reference(&ifbdev->fb->base);
673 674

	/* Final pass to check if any active pipes don't have fbs */
675
	for_each_crtc(dev, crtc) {
676 677
		intel_crtc = to_intel_crtc(crtc);

678
		if (!crtc->state->active)
679 680
			continue;

681
		WARN(!crtc->primary->fb,
682 683 684 685 686 687 688 689 690 691 692 693 694
		     "re-used BIOS config but lost an fb on crtc %d\n",
		     crtc->base.id);
	}


	DRM_DEBUG_KMS("using BIOS fb for initial console\n");
	return true;

out:

	return false;
}

695 696
static void intel_fbdev_suspend_worker(struct work_struct *work)
{
697 698 699
	intel_fbdev_set_suspend(&container_of(work,
					      struct drm_i915_private,
					      fbdev_suspend_work)->drm,
700 701 702 703
				FBINFO_STATE_RUNNING,
				true);
}

704 705
int intel_fbdev_init(struct drm_device *dev)
{
706
	struct intel_fbdev *ifbdev;
707
	struct drm_i915_private *dev_priv = to_i915(dev);
708
	int ret;
709

710 711 712 713 714
	if (WARN_ON(INTEL_INFO(dev)->num_pipes == 0))
		return -ENODEV;

	ifbdev = kzalloc(sizeof(struct intel_fbdev), GFP_KERNEL);
	if (ifbdev == NULL)
715 716
		return -ENOMEM;

717 718
	drm_fb_helper_prepare(dev, &ifbdev->helper, &intel_fb_helper_funcs);

719 720
	if (!intel_fbdev_init_bios(dev, ifbdev))
		ifbdev->preferred_bpp = 32;
721

722
	ret = drm_fb_helper_init(dev, &ifbdev->helper,
723
				 INTEL_INFO(dev)->num_pipes, 4);
724 725 726 727
	if (ret) {
		kfree(ifbdev);
		return ret;
	}
728

729
	dev_priv->fbdev = ifbdev;
730 731
	INIT_WORK(&dev_priv->fbdev_suspend_work, intel_fbdev_suspend_worker);

732
	drm_fb_helper_single_add_all_connectors(&ifbdev->helper);
733

J
Jesse Barnes 已提交
734 735
	return 0;
}
736

737
static void intel_fbdev_initial_config(void *data, async_cookie_t cookie)
738
{
739
	struct intel_fbdev *ifbdev = data;
740 741

	/* Due to peculiar init order wrt to hpd handling this is separate. */
742 743
	if (drm_fb_helper_initial_config(&ifbdev->helper,
					 ifbdev->preferred_bpp))
744
		intel_fbdev_fini(ifbdev->helper.dev);
745 746
}

747 748
void intel_fbdev_initial_config_async(struct drm_device *dev)
{
749 750 751 752 753 754 755 756 757 758 759 760 761
	struct intel_fbdev *ifbdev = to_i915(dev)->fbdev;

	ifbdev->cookie = async_schedule(intel_fbdev_initial_config, ifbdev);
}

static void intel_fbdev_sync(struct intel_fbdev *ifbdev)
{
	if (!ifbdev->cookie)
		return;

	/* Only serialises with all preceding async calls, hence +1 */
	async_synchronize_cookie(ifbdev->cookie + 1);
	ifbdev->cookie = 0;
762 763
}

764 765
void intel_fbdev_fini(struct drm_device *dev)
{
766
	struct drm_i915_private *dev_priv = to_i915(dev);
767 768 769
	struct intel_fbdev *ifbdev = dev_priv->fbdev;

	if (!ifbdev)
770 771
		return;

772
	cancel_work_sync(&dev_priv->fbdev_suspend_work);
773
	if (!current_is_async())
774 775 776
		intel_fbdev_sync(ifbdev);

	intel_fbdev_destroy(ifbdev);
777 778
	dev_priv->fbdev = NULL;
}
779

780
void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous)
781
{
782
	struct drm_i915_private *dev_priv = to_i915(dev);
783 784 785
	struct intel_fbdev *ifbdev = dev_priv->fbdev;
	struct fb_info *info;

786
	if (!ifbdev || !ifbdev->fb)
787 788
		return;

789 790
	info = ifbdev->helper.fbdev;

791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817
	if (synchronous) {
		/* Flush any pending work to turn the console on, and then
		 * wait to turn it off. It must be synchronous as we are
		 * about to suspend or unload the driver.
		 *
		 * Note that from within the work-handler, we cannot flush
		 * ourselves, so only flush outstanding work upon suspend!
		 */
		if (state != FBINFO_STATE_RUNNING)
			flush_work(&dev_priv->fbdev_suspend_work);
		console_lock();
	} else {
		/*
		 * The console lock can be pretty contented on resume due
		 * to all the printk activity.  Try to keep it out of the hot
		 * path of resume if possible.
		 */
		WARN_ON(state != FBINFO_STATE_RUNNING);
		if (!console_trylock()) {
			/* Don't block our own workqueue as this can
			 * be run in parallel with other i915.ko tasks.
			 */
			schedule_work(&dev_priv->fbdev_suspend_work);
			return;
		}
	}

818 819 820 821
	/* On resume from hibernation: If the object is shmemfs backed, it has
	 * been restored from swap. If the object is stolen however, it will be
	 * full of whatever garbage was left in there.
	 */
822
	if (state == FBINFO_STATE_RUNNING && ifbdev->fb->obj->stolen)
823 824
		memset_io(info->screen_base, 0, info->screen_size);

825
	drm_fb_helper_set_suspend(&ifbdev->helper, state);
826
	console_unlock();
827 828
}

829
void intel_fbdev_output_poll_changed(struct drm_device *dev)
830
{
831 832 833 834
	struct intel_fbdev *ifbdev = to_i915(dev)->fbdev;

	if (ifbdev && ifbdev->fb)
		drm_fb_helper_hotplug_event(&ifbdev->helper);
835
}
836

837
void intel_fbdev_restore_mode(struct drm_device *dev)
838
{
839
	struct intel_fbdev *ifbdev = to_i915(dev)->fbdev;
840

841
	if (!ifbdev)
B
Ben Widawsky 已提交
842 843
		return;

844
	intel_fbdev_sync(ifbdev);
845 846
	if (!ifbdev->fb)
		return;
847

848
	if (drm_fb_helper_restore_fbdev_mode_unlocked(&ifbdev->helper)) {
849
		DRM_DEBUG("failed to restore crtc mode\n");
850
	} else {
851
		mutex_lock(&dev->struct_mutex);
852
		intel_fb_obj_invalidate(ifbdev->fb->obj, ORIGIN_GTT);
853
		mutex_unlock(&dev->struct_mutex);
854
	}
855
}