Commit bc104d1f10eb6001f1b1003a5a92066a1b03f080

Authored by Chris Wilson
Committed by Daniel Vetter
1 parent c8431fda9f

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>

Showing 1 changed file with 21 additions and 8 deletions Side-by-side Diff

drivers/gpu/drm/i915/intel_fbdev.c
... ... @@ -518,16 +518,29 @@
518 518  
519 519 /*
520 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
522   - * than the current pipe's, since they could be different.
  521 + * pipe. Note we need to use the selected fb's pitch and bpp
  522 + * rather than the current pipe's, since they differ.
523 523 */
524   - cur_size = intel_crtc->config.adjusted_mode.crtc_hdisplay *
525   - intel_crtc->config.adjusted_mode.crtc_vdisplay;
526   - DRM_DEBUG_KMS("pipe %c area: %d\n", pipe_name(intel_crtc->pipe),
  524 + cur_size = intel_crtc->config.adjusted_mode.crtc_hdisplay;
  525 + cur_size = cur_size * fb->base.bits_per_pixel / 8;
  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 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 545 if (cur_size > max_size) {
533 546 DRM_DEBUG_KMS("fb not big enough for plane %c (%d vs %d)\n",