aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_fbdev.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2014-03-20 11:11:21 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-04-02 03:10:01 -0400
commitbc104d1f10eb6001f1b1003a5a92066a1b03f080 (patch)
tree8d8731387f3eabc060eaec15f6af63547cc7fac3 /drivers/gpu/drm/i915/intel_fbdev.c
parentc8431fda9f9f3c3b7490cb44bd5720b494a2421e (diff)
drm/i915: Fix the computation of required fb size for pipe
The computation of required framebuffer size in commit d978ef14456a38034f6c0e94a794129501f89200 Author: Jesse Barnes <jbarnes@virtuousgeek.org> Date: Fri Mar 7 08:57:51 2014 -0800 drm/i915: Wrap the preallocated BIOS framebuffer and preserve for KMS fbcon v12 is too optimistic, and would rely on the invariant fb being reconstructed to exactly fit each pipe (and probably ignore hardware limits). Instead, we want to compute the upper bound on what the display engine will access and ensure that is within the inherited framebuffer. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_fbdev.c')
-rw-r--r--drivers/gpu/drm/i915/intel_fbdev.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
index d6d78c86c232..86b012ca7217 100644
--- a/drivers/gpu/drm/i915/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/intel_fbdev.c
@@ -518,16 +518,29 @@ static bool intel_fbdev_init_bios(struct drm_device *dev,
518 518
519 /* 519 /*
520 * See if the plane fb we found above will fit on this 520 * See if the plane fb we found above will fit on this
521 * pipe. Note we need to use the selected fb's bpp rather 521 * pipe. Note we need to use the selected fb's pitch and bpp
522 * than the current pipe's, since they could be different. 522 * rather than the current pipe's, since they differ.
523 */ 523 */
524 cur_size = intel_crtc->config.adjusted_mode.crtc_hdisplay * 524 cur_size = intel_crtc->config.adjusted_mode.crtc_hdisplay;
525 intel_crtc->config.adjusted_mode.crtc_vdisplay; 525 cur_size = cur_size * fb->base.bits_per_pixel / 8;
526 DRM_DEBUG_KMS("pipe %c area: %d\n", pipe_name(intel_crtc->pipe), 526 if (fb->base.pitches[0] < cur_size) {
527 DRM_DEBUG_KMS("fb not wide enough for plane %c (%d vs %d)\n",
528 pipe_name(intel_crtc->pipe),
529 cur_size, fb->base.pitches[0]);
530 plane_config = NULL;
531 fb = NULL;
532 break;
533 }
534
535 cur_size = intel_crtc->config.adjusted_mode.crtc_vdisplay;
536 cur_size = ALIGN(cur_size, plane_config->tiled ? (IS_GEN2(dev) ? 16 : 8) : 1);
537 cur_size *= fb->base.pitches[0];
538 DRM_DEBUG_KMS("pipe %c area: %dx%d, bpp: %d, size: %d\n",
539 pipe_name(intel_crtc->pipe),
540 intel_crtc->config.adjusted_mode.crtc_hdisplay,
541 intel_crtc->config.adjusted_mode.crtc_vdisplay,
542 fb->base.bits_per_pixel,
527 cur_size); 543 cur_size);
528 cur_size *= fb->base.bits_per_pixel / 8;
529 DRM_DEBUG_KMS("total size %d (bpp %d)\n", cur_size,
530 fb->base.bits_per_pixel / 8);
531 544
532 if (cur_size > max_size) { 545 if (cur_size > max_size) {
533 DRM_DEBUG_KMS("fb not big enough for plane %c (%d vs %d)\n", 546 DRM_DEBUG_KMS("fb not big enough for plane %c (%d vs %d)\n",