drm/i915: Align initial plane backing objects correctly
Some bios really like to joke and start the planes at an offset ... hooray! Align start and end to fix this. v2: Fixup calculation of size, spotted by Chris Wilson. v3: Fix serious fumble I've just spotted. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=86883 Cc: stable@vger.kernel.org Cc: Johannes W <jargon@molb.org> Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Jani Nikula <jani.nikula@linux.intel.com> Reported-and-tested-by: Johannes W <jargon@molb.org> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> [Jani: split WARN_ONs, rebase on v4.0-rc1] Signed-off-by: Jani Nikula <jani.nikula@intel.com>
This commit is contained in:
Родитель
2dd2a883aa
Коммит
f37b5c2be8
|
@ -485,10 +485,8 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
|
|||
stolen_offset, gtt_offset, size);
|
||||
|
||||
/* KISS and expect everything to be page-aligned */
|
||||
BUG_ON(stolen_offset & 4095);
|
||||
BUG_ON(size & 4095);
|
||||
|
||||
if (WARN_ON(size == 0))
|
||||
if (WARN_ON(size == 0) || WARN_ON(size & 4095) ||
|
||||
WARN_ON(stolen_offset & 4095))
|
||||
return NULL;
|
||||
|
||||
stolen = kzalloc(sizeof(*stolen), GFP_KERNEL);
|
||||
|
|
|
@ -2371,13 +2371,19 @@ intel_alloc_plane_obj(struct intel_crtc *crtc,
|
|||
struct drm_device *dev = crtc->base.dev;
|
||||
struct drm_i915_gem_object *obj = NULL;
|
||||
struct drm_mode_fb_cmd2 mode_cmd = { 0 };
|
||||
u32 base = plane_config->base;
|
||||
u32 base_aligned = round_down(plane_config->base, PAGE_SIZE);
|
||||
u32 size_aligned = round_up(plane_config->base + plane_config->size,
|
||||
PAGE_SIZE);
|
||||
|
||||
size_aligned -= base_aligned;
|
||||
|
||||
if (plane_config->size == 0)
|
||||
return false;
|
||||
|
||||
obj = i915_gem_object_create_stolen_for_preallocated(dev, base, base,
|
||||
plane_config->size);
|
||||
obj = i915_gem_object_create_stolen_for_preallocated(dev,
|
||||
base_aligned,
|
||||
base_aligned,
|
||||
size_aligned);
|
||||
if (!obj)
|
||||
return false;
|
||||
|
||||
|
@ -6636,7 +6642,7 @@ i9xx_get_initial_plane_config(struct intel_crtc *crtc,
|
|||
aligned_height = intel_fb_align_height(dev, fb->height,
|
||||
plane_config->tiling);
|
||||
|
||||
plane_config->size = PAGE_ALIGN(fb->pitches[0] * aligned_height);
|
||||
plane_config->size = fb->pitches[0] * aligned_height;
|
||||
|
||||
DRM_DEBUG_KMS("pipe/plane %c/%d with fb: size=%dx%d@%d, offset=%x, pitch %d, size 0x%x\n",
|
||||
pipe_name(pipe), plane, fb->width, fb->height,
|
||||
|
@ -7673,7 +7679,7 @@ skylake_get_initial_plane_config(struct intel_crtc *crtc,
|
|||
aligned_height = intel_fb_align_height(dev, fb->height,
|
||||
plane_config->tiling);
|
||||
|
||||
plane_config->size = ALIGN(fb->pitches[0] * aligned_height, PAGE_SIZE);
|
||||
plane_config->size = fb->pitches[0] * aligned_height;
|
||||
|
||||
DRM_DEBUG_KMS("pipe %c with fb: size=%dx%d@%d, offset=%x, pitch %d, size 0x%x\n",
|
||||
pipe_name(pipe), fb->width, fb->height,
|
||||
|
@ -7764,7 +7770,7 @@ ironlake_get_initial_plane_config(struct intel_crtc *crtc,
|
|||
aligned_height = intel_fb_align_height(dev, fb->height,
|
||||
plane_config->tiling);
|
||||
|
||||
plane_config->size = PAGE_ALIGN(fb->pitches[0] * aligned_height);
|
||||
plane_config->size = fb->pitches[0] * aligned_height;
|
||||
|
||||
DRM_DEBUG_KMS("pipe %c with fb: size=%dx%d@%d, offset=%x, pitch %d, size 0x%x\n",
|
||||
pipe_name(pipe), fb->width, fb->height,
|
||||
|
|
Загрузка…
Ссылка в новой задаче