- Fix max memory region size calculation (Matt)
- Restore ILK-M RPS support, restoring performance (Ville) - Reject 90/270 degreerotated initial fbs (Ville) -----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEbSBwaO7dZQkcLOKj+mJfZA7rE8oFAl+bYZIACgkQ+mJfZA7r E8qGNwgAp3pI4N2pjsp1dBFVE81aKnM3kMnIzbR1D28wzAPYlwmVTWayMU4GTTfp /zbJrmsdu2aNO+ltgK5zusZj7G095CX9nJIZLB+KBlbIS/fUmdn3dAVIoImy+ZBz gAxhrurqR6+BuNIbFPvnMcUq4c0cZdzR/0hhW90Jyie6YfNIbKxJT4flPQDvTNvl CT3gnQy+5bIieoJHu6uwUD7ydkLA2p9FTLS4trs/4btCKEOX7ul5DtMccu+wUPM7 CFgwoEOHwF36c2uJ5qNwlqdKRc7WgalAU2UnHpMZftwq/hH9NnhXMoHqLhOoXgpu k+T+haAOWZOtd6TnLrNPRzbPQsd5bg== =CP74 -----END PGP SIGNATURE----- Merge tag 'drm-intel-fixes-2020-10-29' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes - Fix max memory region size calculation (Matt) - Restore ILK-M RPS support, restoring performance (Ville) - Reject 90/270 degreerotated initial fbs (Ville) Signed-off-by: Dave Airlie <airlied@redhat.com> From: Rodrigo Vivi <rodrigo.vivi@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20201030004442.GA146813@intel.com
This commit is contained in:
commit
7babd12632
5 changed files with 84 additions and 2 deletions
|
@ -10636,6 +10636,10 @@ skl_get_initial_plane_config(struct intel_crtc *crtc,
|
||||||
val & PLANE_CTL_FLIP_HORIZONTAL)
|
val & PLANE_CTL_FLIP_HORIZONTAL)
|
||||||
plane_config->rotation |= DRM_MODE_REFLECT_X;
|
plane_config->rotation |= DRM_MODE_REFLECT_X;
|
||||||
|
|
||||||
|
/* 90/270 degree rotation would require extra work */
|
||||||
|
if (drm_rotation_90_or_270(plane_config->rotation))
|
||||||
|
goto error;
|
||||||
|
|
||||||
base = intel_de_read(dev_priv, PLANE_SURF(pipe, plane_id)) & 0xfffff000;
|
base = intel_de_read(dev_priv, PLANE_SURF(pipe, plane_id)) & 0xfffff000;
|
||||||
plane_config->base = base;
|
plane_config->base = base;
|
||||||
|
|
||||||
|
|
|
@ -389,6 +389,7 @@ static const struct intel_device_info ilk_m_info = {
|
||||||
GEN5_FEATURES,
|
GEN5_FEATURES,
|
||||||
PLATFORM(INTEL_IRONLAKE),
|
PLATFORM(INTEL_IRONLAKE),
|
||||||
.is_mobile = 1,
|
.is_mobile = 1,
|
||||||
|
.has_rps = true,
|
||||||
.display.has_fbc = 1,
|
.display.has_fbc = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,7 @@ __intel_memory_region_get_pages_buddy(struct intel_memory_region *mem,
|
||||||
min_order = ilog2(size) - ilog2(mem->mm.chunk_size);
|
min_order = ilog2(size) - ilog2(mem->mm.chunk_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size > BIT(mem->mm.max_order) * mem->mm.chunk_size)
|
if (size > mem->mm.size)
|
||||||
return -E2BIG;
|
return -E2BIG;
|
||||||
|
|
||||||
n_pages = size >> ilog2(mem->mm.chunk_size);
|
n_pages = size >> ilog2(mem->mm.chunk_size);
|
||||||
|
|
|
@ -261,6 +261,82 @@ static int igt_mock_contiguous(void *arg)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int igt_mock_splintered_region(void *arg)
|
||||||
|
{
|
||||||
|
struct intel_memory_region *mem = arg;
|
||||||
|
struct drm_i915_private *i915 = mem->i915;
|
||||||
|
struct drm_i915_gem_object *obj;
|
||||||
|
unsigned int expected_order;
|
||||||
|
LIST_HEAD(objects);
|
||||||
|
u64 size;
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sanity check we can still allocate everything even if the
|
||||||
|
* mm.max_order != mm.size. i.e our starting address space size is not a
|
||||||
|
* power-of-two.
|
||||||
|
*/
|
||||||
|
|
||||||
|
size = (SZ_4G - 1) & PAGE_MASK;
|
||||||
|
mem = mock_region_create(i915, 0, size, PAGE_SIZE, 0);
|
||||||
|
if (IS_ERR(mem))
|
||||||
|
return PTR_ERR(mem);
|
||||||
|
|
||||||
|
if (mem->mm.size != size) {
|
||||||
|
pr_err("%s size mismatch(%llu != %llu)\n",
|
||||||
|
__func__, mem->mm.size, size);
|
||||||
|
err = -EINVAL;
|
||||||
|
goto out_put;
|
||||||
|
}
|
||||||
|
|
||||||
|
expected_order = get_order(rounddown_pow_of_two(size));
|
||||||
|
if (mem->mm.max_order != expected_order) {
|
||||||
|
pr_err("%s order mismatch(%u != %u)\n",
|
||||||
|
__func__, mem->mm.max_order, expected_order);
|
||||||
|
err = -EINVAL;
|
||||||
|
goto out_put;
|
||||||
|
}
|
||||||
|
|
||||||
|
obj = igt_object_create(mem, &objects, size, 0);
|
||||||
|
if (IS_ERR(obj)) {
|
||||||
|
err = PTR_ERR(obj);
|
||||||
|
goto out_close;
|
||||||
|
}
|
||||||
|
|
||||||
|
close_objects(mem, &objects);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* While we should be able allocate everything without any flag
|
||||||
|
* restrictions, if we consider I915_BO_ALLOC_CONTIGUOUS then we are
|
||||||
|
* actually limited to the largest power-of-two for the region size i.e
|
||||||
|
* max_order, due to the inner workings of the buddy allocator. So make
|
||||||
|
* sure that does indeed hold true.
|
||||||
|
*/
|
||||||
|
|
||||||
|
obj = igt_object_create(mem, &objects, size, I915_BO_ALLOC_CONTIGUOUS);
|
||||||
|
if (!IS_ERR(obj)) {
|
||||||
|
pr_err("%s too large contiguous allocation was not rejected\n",
|
||||||
|
__func__);
|
||||||
|
err = -EINVAL;
|
||||||
|
goto out_close;
|
||||||
|
}
|
||||||
|
|
||||||
|
obj = igt_object_create(mem, &objects, rounddown_pow_of_two(size),
|
||||||
|
I915_BO_ALLOC_CONTIGUOUS);
|
||||||
|
if (IS_ERR(obj)) {
|
||||||
|
pr_err("%s largest possible contiguous allocation failed\n",
|
||||||
|
__func__);
|
||||||
|
err = PTR_ERR(obj);
|
||||||
|
goto out_close;
|
||||||
|
}
|
||||||
|
|
||||||
|
out_close:
|
||||||
|
close_objects(mem, &objects);
|
||||||
|
out_put:
|
||||||
|
intel_memory_region_put(mem);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
static int igt_gpu_write_dw(struct intel_context *ce,
|
static int igt_gpu_write_dw(struct intel_context *ce,
|
||||||
struct i915_vma *vma,
|
struct i915_vma *vma,
|
||||||
u32 dword,
|
u32 dword,
|
||||||
|
@ -771,6 +847,7 @@ int intel_memory_region_mock_selftests(void)
|
||||||
static const struct i915_subtest tests[] = {
|
static const struct i915_subtest tests[] = {
|
||||||
SUBTEST(igt_mock_fill),
|
SUBTEST(igt_mock_fill),
|
||||||
SUBTEST(igt_mock_contiguous),
|
SUBTEST(igt_mock_contiguous),
|
||||||
|
SUBTEST(igt_mock_splintered_region),
|
||||||
};
|
};
|
||||||
struct intel_memory_region *mem;
|
struct intel_memory_region *mem;
|
||||||
struct drm_i915_private *i915;
|
struct drm_i915_private *i915;
|
||||||
|
|
|
@ -24,7 +24,7 @@ mock_object_create(struct intel_memory_region *mem,
|
||||||
struct drm_i915_private *i915 = mem->i915;
|
struct drm_i915_private *i915 = mem->i915;
|
||||||
struct drm_i915_gem_object *obj;
|
struct drm_i915_gem_object *obj;
|
||||||
|
|
||||||
if (size > BIT(mem->mm.max_order) * mem->mm.chunk_size)
|
if (size > mem->mm.size)
|
||||||
return ERR_PTR(-E2BIG);
|
return ERR_PTR(-E2BIG);
|
||||||
|
|
||||||
obj = i915_gem_object_alloc();
|
obj = i915_gem_object_alloc();
|
||||||
|
|
Loading…
Reference in a new issue