drm: kselftest for drm_mm_init()
Simple first test to just exercise initialisation of struct drm_mm. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: http://patchwork.freedesktop.org/patch/msgid/20161222083641.2691-8-chris@chris-wilson.co.uk
This commit is contained in:

committed by
Daniel Vetter

parent
50f0033d1a
commit
393b50f305
@@ -6,3 +6,4 @@
|
|||||||
* Tests are executed in order by igt/drm_mm
|
* Tests are executed in order by igt/drm_mm
|
||||||
*/
|
*/
|
||||||
selftest(sanitycheck, igt_sanitycheck) /* keep first (selfcheck for igt) */
|
selftest(sanitycheck, igt_sanitycheck) /* keep first (selfcheck for igt) */
|
||||||
|
selftest(init, igt_init)
|
||||||
|
@@ -27,6 +27,120 @@ static int igt_sanitycheck(void *ignored)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool assert_no_holes(const struct drm_mm *mm)
|
||||||
|
{
|
||||||
|
struct drm_mm_node *hole;
|
||||||
|
u64 hole_start, hole_end;
|
||||||
|
unsigned long count;
|
||||||
|
|
||||||
|
count = 0;
|
||||||
|
drm_mm_for_each_hole(hole, mm, hole_start, hole_end)
|
||||||
|
count++;
|
||||||
|
if (count) {
|
||||||
|
pr_err("Expected to find no holes (after reserve), found %lu instead\n", count);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
drm_mm_for_each_node(hole, mm) {
|
||||||
|
if (hole->hole_follows) {
|
||||||
|
pr_err("Hole follows node, expected none!\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool assert_one_hole(const struct drm_mm *mm, u64 start, u64 end)
|
||||||
|
{
|
||||||
|
struct drm_mm_node *hole;
|
||||||
|
u64 hole_start, hole_end;
|
||||||
|
unsigned long count;
|
||||||
|
bool ok = true;
|
||||||
|
|
||||||
|
if (end <= start)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
count = 0;
|
||||||
|
drm_mm_for_each_hole(hole, mm, hole_start, hole_end) {
|
||||||
|
if (start != hole_start || end != hole_end) {
|
||||||
|
if (ok)
|
||||||
|
pr_err("empty mm has incorrect hole, found (%llx, %llx), expect (%llx, %llx)\n",
|
||||||
|
hole_start, hole_end,
|
||||||
|
start, end);
|
||||||
|
ok = false;
|
||||||
|
}
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
if (count != 1) {
|
||||||
|
pr_err("Expected to find one hole, found %lu instead\n", count);
|
||||||
|
ok = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int igt_init(void *ignored)
|
||||||
|
{
|
||||||
|
const unsigned int size = 4096;
|
||||||
|
struct drm_mm mm;
|
||||||
|
struct drm_mm_node tmp;
|
||||||
|
int ret = -EINVAL;
|
||||||
|
|
||||||
|
/* Start with some simple checks on initialising the struct drm_mm */
|
||||||
|
memset(&mm, 0, sizeof(mm));
|
||||||
|
if (drm_mm_initialized(&mm)) {
|
||||||
|
pr_err("zeroed mm claims to be initialized\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&mm, 0xff, sizeof(mm));
|
||||||
|
drm_mm_init(&mm, 0, size);
|
||||||
|
if (!drm_mm_initialized(&mm)) {
|
||||||
|
pr_err("mm claims not to be initialized\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!drm_mm_clean(&mm)) {
|
||||||
|
pr_err("mm not empty on creation\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* After creation, it should all be one massive hole */
|
||||||
|
if (!assert_one_hole(&mm, 0, size)) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&tmp, 0, sizeof(tmp));
|
||||||
|
tmp.start = 0;
|
||||||
|
tmp.size = size;
|
||||||
|
ret = drm_mm_reserve_node(&mm, &tmp);
|
||||||
|
if (ret) {
|
||||||
|
pr_err("failed to reserve whole drm_mm\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* After filling the range entirely, there should be no holes */
|
||||||
|
if (!assert_no_holes(&mm)) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* And then after emptying it again, the massive hole should be back */
|
||||||
|
drm_mm_remove_node(&tmp);
|
||||||
|
if (!assert_one_hole(&mm, 0, size)) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (ret)
|
||||||
|
drm_mm_debug_table(&mm, __func__);
|
||||||
|
drm_mm_takedown(&mm);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#include "drm_selftest.c"
|
#include "drm_selftest.c"
|
||||||
|
|
||||||
static int __init test_drm_mm_init(void)
|
static int __init test_drm_mm_init(void)
|
||||||
|
Reference in New Issue
Block a user