2022-06-15 14:29:57

by Maíra Canal

[permalink] [raw]
Subject: [PATCH 00/10] drm: selftest: Convert to KUnit

KUnit unifies the test structure and provides helper tools that simplify
the development of tests. The basic use case allows running tests as regular
processes, which makes it easier to run unit tests on a development machine
and to integrate the tests into a CI system.

That said, the conversion of selftests for DRM to KUnit tests is beneficial
as it unifies the testing API by using the KUnit API.

KUnit is beneficial for developers as it eases the process to run unit tests.
It is possible to run the tests by using the kunit-tool on userspace with the
following command:

./tools/testing/kunit/kunit.py run --kunitconfig=drivers/gpu/drm/tests --arch=x86_64

For CI system, it is possible to execute during the build. But, we also think
about IGT: we are developing a patch to introduce KUnit to IGT.

These patches were developed during a KUnit hackathon [0] last October. Now,
we believe that both the IGT side and the Kernel side are in good shape for
submission.

If you are willing to check the output, here is the Pastebin with the output
and execution times [1].

[0] https://groups.google.com/g/kunit-dev/c/YqFR1q2uZvk/m/IbvItSfHBAAJ
[1] https://pastebin.com/FJjLPKsC

- Arthur Grillo, Isabella Basso, and Maíra Canal

Arthur Grillo (2):
drm: selftest: refactor drm_cmdline_parser
drm: selftest: convert drm_mm selftest to KUnit

Maíra Canal (8):
drm: selftest: convert drm_damage_helper selftest to KUnit
drm: selftest: convert drm_cmdline_parser selftest to KUnit
drm: selftest: convert drm_rect selftest to KUnit
drm: selftest: convert drm_format selftest to KUnit
drm: selftest: convert drm_plane_helper selftest to KUnit
drm: selftest: convert drm_dp_mst_helper selftest to KUnit
drm: selftest: convert drm_framebuffer selftest to KUnit
drm: selftest: convert drm_buddy selftest to KUnit

drivers/gpu/drm/Kconfig | 20 +-
drivers/gpu/drm/Makefile | 2 +-
drivers/gpu/drm/selftests/Makefile | 8 -
.../gpu/drm/selftests/drm_buddy_selftests.h | 15 -
.../gpu/drm/selftests/drm_cmdline_selftests.h | 68 -
drivers/gpu/drm/selftests/drm_mm_selftests.h | 28 -
.../gpu/drm/selftests/drm_modeset_selftests.h | 40 -
drivers/gpu/drm/selftests/drm_selftest.c | 109 --
drivers/gpu/drm/selftests/drm_selftest.h | 41 -
drivers/gpu/drm/selftests/test-drm_buddy.c | 994 --------------
.../drm/selftests/test-drm_cmdline_parser.c | 1141 -----------------
.../drm/selftests/test-drm_damage_helper.c | 667 ----------
drivers/gpu/drm/selftests/test-drm_format.c | 280 ----
.../drm/selftests/test-drm_modeset_common.c | 32 -
.../drm/selftests/test-drm_modeset_common.h | 52 -
drivers/gpu/drm/tests/.kunitconfig | 3 +
drivers/gpu/drm/tests/Kconfig | 130 ++
drivers/gpu/drm/tests/Makefile | 10 +
drivers/gpu/drm/tests/test-drm_buddy.c | 748 +++++++++++
.../gpu/drm/tests/test-drm_cmdline_parser.c | 799 ++++++++++++
.../gpu/drm/tests/test-drm_damage_helper.c | 633 +++++++++
.../test-drm_dp_mst_helper.c | 82 +-
drivers/gpu/drm/tests/test-drm_format.c | 284 ++++
.../test-drm_framebuffer.c | 25 +-
.../drm/{selftests => tests}/test-drm_mm.c | 1135 +++++++---------
.../test-drm_plane_helper.c | 101 +-
.../drm/{selftests => tests}/test-drm_rect.c | 124 +-
27 files changed, 3240 insertions(+), 4331 deletions(-)
delete mode 100644 drivers/gpu/drm/selftests/Makefile
delete mode 100644 drivers/gpu/drm/selftests/drm_buddy_selftests.h
delete mode 100644 drivers/gpu/drm/selftests/drm_cmdline_selftests.h
delete mode 100644 drivers/gpu/drm/selftests/drm_mm_selftests.h
delete mode 100644 drivers/gpu/drm/selftests/drm_modeset_selftests.h
delete mode 100644 drivers/gpu/drm/selftests/drm_selftest.c
delete mode 100644 drivers/gpu/drm/selftests/drm_selftest.h
delete mode 100644 drivers/gpu/drm/selftests/test-drm_buddy.c
delete mode 100644 drivers/gpu/drm/selftests/test-drm_cmdline_parser.c
delete mode 100644 drivers/gpu/drm/selftests/test-drm_damage_helper.c
delete mode 100644 drivers/gpu/drm/selftests/test-drm_format.c
delete mode 100644 drivers/gpu/drm/selftests/test-drm_modeset_common.c
delete mode 100644 drivers/gpu/drm/selftests/test-drm_modeset_common.h
create mode 100644 drivers/gpu/drm/tests/.kunitconfig
create mode 100644 drivers/gpu/drm/tests/Kconfig
create mode 100644 drivers/gpu/drm/tests/Makefile
create mode 100644 drivers/gpu/drm/tests/test-drm_buddy.c
create mode 100644 drivers/gpu/drm/tests/test-drm_cmdline_parser.c
create mode 100644 drivers/gpu/drm/tests/test-drm_damage_helper.c
rename drivers/gpu/drm/{selftests => tests}/test-drm_dp_mst_helper.c (73%)
create mode 100644 drivers/gpu/drm/tests/test-drm_format.c
rename drivers/gpu/drm/{selftests => tests}/test-drm_framebuffer.c (96%)
rename drivers/gpu/drm/{selftests => tests}/test-drm_mm.c (58%)
rename drivers/gpu/drm/{selftests => tests}/test-drm_plane_helper.c (62%)
rename drivers/gpu/drm/{selftests => tests}/test-drm_rect.c (53%)

--
2.36.1


2022-06-15 14:34:09

by Maíra Canal

[permalink] [raw]
Subject: [PATCH 08/10] drm: selftest: convert drm_framebuffer selftest to KUnit

Considering the current adoption of the KUnit framework, convert the
DRM framebuffer selftest to the KUnit API.

Signed-off-by: Maíra Canal <[email protected]>
---
drivers/gpu/drm/selftests/Makefile | 5 +--
.../gpu/drm/selftests/drm_modeset_selftests.h | 9 ------
.../drm/selftests/test-drm_modeset_common.c | 32 -------------------
.../drm/selftests/test-drm_modeset_common.h | 21 ------------
drivers/gpu/drm/tests/Kconfig | 12 +++++++
drivers/gpu/drm/tests/Makefile | 1 +
.../test-drm_framebuffer.c | 25 ++++++++++-----
7 files changed, 31 insertions(+), 74 deletions(-)
delete mode 100644 drivers/gpu/drm/selftests/drm_modeset_selftests.h
delete mode 100644 drivers/gpu/drm/selftests/test-drm_modeset_common.c
delete mode 100644 drivers/gpu/drm/selftests/test-drm_modeset_common.h
rename drivers/gpu/drm/{selftests => tests}/test-drm_framebuffer.c (96%)

diff --git a/drivers/gpu/drm/selftests/Makefile b/drivers/gpu/drm/selftests/Makefile
index 1539f55db9a7..f7db628b60cb 100644
--- a/drivers/gpu/drm/selftests/Makefile
+++ b/drivers/gpu/drm/selftests/Makefile
@@ -1,5 +1,2 @@
# SPDX-License-Identifier: GPL-2.0-only
-test-drm_modeset-y := test-drm_modeset_common.o test-drm_framebuffer.o
-
-obj-$(CONFIG_DRM_DEBUG_SELFTEST) += test-drm_mm.o test-drm_modeset.o \
- test-drm_buddy.o
+obj-$(CONFIG_DRM_DEBUG_SELFTEST) += test-drm_mm.o test-drm_buddy.o
diff --git a/drivers/gpu/drm/selftests/drm_modeset_selftests.h b/drivers/gpu/drm/selftests/drm_modeset_selftests.h
deleted file mode 100644
index 40a29b8cf386..000000000000
--- a/drivers/gpu/drm/selftests/drm_modeset_selftests.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/* List each unit test as selftest(name, function)
- *
- * The name is used as both an enum and expanded as igt__name to create
- * a module parameter. It must be unique and legal for a C identifier.
- *
- * Tests are executed in order by igt/drm_selftests_helper
- */
-selftest(check_drm_framebuffer_create, igt_check_drm_framebuffer_create)
diff --git a/drivers/gpu/drm/selftests/test-drm_modeset_common.c b/drivers/gpu/drm/selftests/test-drm_modeset_common.c
deleted file mode 100644
index 2a7f93774006..000000000000
--- a/drivers/gpu/drm/selftests/test-drm_modeset_common.c
+++ /dev/null
@@ -1,32 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Common file for modeset selftests.
- */
-
-#include <linux/module.h>
-
-#include "test-drm_modeset_common.h"
-
-#define TESTS "drm_modeset_selftests.h"
-#include "drm_selftest.h"
-
-#include "drm_selftest.c"
-
-static int __init test_drm_modeset_init(void)
-{
- int err;
-
- err = run_selftests(selftests, ARRAY_SIZE(selftests), NULL);
-
- return err > 0 ? 0 : err;
-}
-
-static void __exit test_drm_modeset_exit(void)
-{
-}
-
-module_init(test_drm_modeset_init);
-module_exit(test_drm_modeset_exit);
-
-MODULE_AUTHOR("Intel Corporation");
-MODULE_LICENSE("GPL");
diff --git a/drivers/gpu/drm/selftests/test-drm_modeset_common.h b/drivers/gpu/drm/selftests/test-drm_modeset_common.h
deleted file mode 100644
index 3feb2fea1a6b..000000000000
--- a/drivers/gpu/drm/selftests/test-drm_modeset_common.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-
-#ifndef __TEST_DRM_MODESET_COMMON_H__
-#define __TEST_DRM_MODESET_COMMON_H__
-
-#include <linux/errno.h>
-#include <linux/printk.h>
-
-#define FAIL(test, msg, ...) \
- do { \
- if (test) { \
- pr_err("%s/%u: " msg, __FUNCTION__, __LINE__, ##__VA_ARGS__); \
- return -EINVAL; \
- } \
- } while (0)
-
-#define FAIL_ON(x) FAIL((x), "%s", "FAIL_ON(" __stringify(x) ")\n")
-
-int igt_check_drm_framebuffer_create(void *ignored);
-
-#endif
diff --git a/drivers/gpu/drm/tests/Kconfig b/drivers/gpu/drm/tests/Kconfig
index eea0783f981d..de44385f217e 100644
--- a/drivers/gpu/drm/tests/Kconfig
+++ b/drivers/gpu/drm/tests/Kconfig
@@ -86,4 +86,16 @@ config DRM_DP_MST_HELPER_KUNIT_TEST

If in doubt, say "N".

+config DRM_FRAMEBUFFER_KUNIT_TEST
+ tristate "KUnit tests for DRM framebuffer" if !DRM_KUNIT_TEST
+ select DRM_KMS_HELPER
+ default y if DRM_KUNIT_TEST
+ help
+ This option provides KUnit modules that can be used to run
+ various selftests on parts of the DRM framebuffer API. This
+ option is not useful for distributions or general kernels, but only
+ for kernel developers working on DRM and associated drivers.
+
+ If in doubt, say "N".
+
endmenu
diff --git a/drivers/gpu/drm/tests/Makefile b/drivers/gpu/drm/tests/Makefile
index 735ca8e4c446..d802ca0f1544 100644
--- a/drivers/gpu/drm/tests/Makefile
+++ b/drivers/gpu/drm/tests/Makefile
@@ -5,3 +5,4 @@ obj-$(CONFIG_DRM_RECT_KUNIT_TEST) += test-drm_rect.o
obj-$(CONFIG_DRM_FORMAT_KUNIT_TEST) += test-drm_format.o
obj-$(CONFIG_DRM_PLANE_HELPER_KUNIT_TEST) += test-drm_plane_helper.o
obj-$(CONFIG_DRM_DP_MST_HELPER_KUNIT_TEST) += test-drm_dp_mst_helper.o
+obj-$(CONFIG_DRM_FRAMEBUFFER_KUNIT_TEST) += test-drm_framebuffer.o
diff --git a/drivers/gpu/drm/selftests/test-drm_framebuffer.c b/drivers/gpu/drm/tests/test-drm_framebuffer.c
similarity index 96%
rename from drivers/gpu/drm/selftests/test-drm_framebuffer.c
rename to drivers/gpu/drm/tests/test-drm_framebuffer.c
index f6d66285c5fc..753e161ad57f 100644
--- a/drivers/gpu/drm/selftests/test-drm_framebuffer.c
+++ b/drivers/gpu/drm/tests/test-drm_framebuffer.c
@@ -3,8 +3,7 @@
* Test cases for the drm_framebuffer functions
*/

-#include <linux/kernel.h>
-
+#include <kunit/test.h>
#include <drm/drm_device.h>
#include <drm/drm_mode.h>
#include <drm/drm_fourcc.h>
@@ -12,8 +11,6 @@

#include "../drm_crtc_internal.h"

-#include "test-drm_modeset_common.h"
-
#define MIN_WIDTH 4
#define MAX_WIDTH 4096
#define MIN_HEIGHT 4
@@ -336,15 +333,27 @@ static int execute_drm_mode_fb_cmd2(struct drm_mode_fb_cmd2 *r)
return buffer_created;
}

-int igt_check_drm_framebuffer_create(void *ignored)
+static void igt_check_drm_framebuffer_create(struct kunit *test)
{
int i = 0;

for (i = 0; i < ARRAY_SIZE(createbuffer_tests); i++) {
- FAIL(createbuffer_tests[i].buffer_created !=
+ KUNIT_EXPECT_EQ_MSG(test, createbuffer_tests[i].buffer_created,
execute_drm_mode_fb_cmd2(&createbuffer_tests[i].cmd),
"Test %d: \"%s\" failed\n", i, createbuffer_tests[i].name);
}
-
- return 0;
}
+
+static struct kunit_case drm_framebuffer_tests[] = {
+ KUNIT_CASE(igt_check_drm_framebuffer_create),
+ { }
+};
+
+static struct kunit_suite drm_framebuffer_test_suite = {
+ .name = "drm_framebuffer_tests",
+ .test_cases = drm_framebuffer_tests,
+};
+
+kunit_test_suite(drm_framebuffer_test_suite);
+
+MODULE_LICENSE("GPL");
--
2.36.1

2022-06-15 14:34:27

by Maíra Canal

[permalink] [raw]
Subject: [PATCH 01/10] drm: selftest: convert drm_damage_helper selftest to KUnit

Considering the current adoption of the KUnit framework, convert the
DRM damage helper selftest to the KUnit API.

Co-developed-by: Arthur Grillo <[email protected]>
Signed-off-by: Arthur Grillo <[email protected]>
Signed-off-by: Maíra Canal <[email protected]>
---
drivers/gpu/drm/Kconfig | 2 +
drivers/gpu/drm/Makefile | 1 +
drivers/gpu/drm/selftests/Makefile | 3 +-
.../gpu/drm/selftests/drm_modeset_selftests.h | 21 -
.../drm/selftests/test-drm_damage_helper.c | 667 ------------------
.../drm/selftests/test-drm_modeset_common.h | 21 -
drivers/gpu/drm/tests/Kconfig | 28 +
drivers/gpu/drm/tests/Makefile | 2 +
.../gpu/drm/tests/test-drm_damage_helper.c | 633 +++++++++++++++++
9 files changed, 667 insertions(+), 711 deletions(-)
delete mode 100644 drivers/gpu/drm/selftests/test-drm_damage_helper.c
create mode 100644 drivers/gpu/drm/tests/Kconfig
create mode 100644 drivers/gpu/drm/tests/Makefile
create mode 100644 drivers/gpu/drm/tests/test-drm_damage_helper.c

diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index e88c497fa010..bd1b5d82c9cf 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -70,6 +70,8 @@ config DRM_DEBUG_SELFTEST

If in doubt, say "N".

+source "drivers/gpu/drm/tests/Kconfig"
+
config DRM_KMS_HELPER
tristate
depends on DRM
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 15fe3163f822..0f24aa542be0 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -76,6 +76,7 @@ obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o
#

obj-$(CONFIG_DRM_DEBUG_SELFTEST) += selftests/
+obj-y += tests/

obj-$(CONFIG_DRM_MIPI_DBI) += drm_mipi_dbi.o
obj-$(CONFIG_DRM_MIPI_DSI) += drm_mipi_dsi.o
diff --git a/drivers/gpu/drm/selftests/Makefile b/drivers/gpu/drm/selftests/Makefile
index 5ba5f9138c95..7a1a732e0a1b 100644
--- a/drivers/gpu/drm/selftests/Makefile
+++ b/drivers/gpu/drm/selftests/Makefile
@@ -1,8 +1,7 @@
# SPDX-License-Identifier: GPL-2.0-only
test-drm_modeset-y := test-drm_modeset_common.o test-drm_plane_helper.o \
test-drm_format.o test-drm_framebuffer.o \
- test-drm_damage_helper.o test-drm_dp_mst_helper.o \
- test-drm_rect.o
+ test-drm_dp_mst_helper.o test-drm_rect.o

obj-$(CONFIG_DRM_DEBUG_SELFTEST) += test-drm_mm.o test-drm_modeset.o test-drm_cmdline_parser.o \
test-drm_buddy.o
diff --git a/drivers/gpu/drm/selftests/drm_modeset_selftests.h b/drivers/gpu/drm/selftests/drm_modeset_selftests.h
index 782e285ca383..4787b3b70709 100644
--- a/drivers/gpu/drm/selftests/drm_modeset_selftests.h
+++ b/drivers/gpu/drm/selftests/drm_modeset_selftests.h
@@ -15,26 +15,5 @@ selftest(check_drm_format_block_width, igt_check_drm_format_block_width)
selftest(check_drm_format_block_height, igt_check_drm_format_block_height)
selftest(check_drm_format_min_pitch, igt_check_drm_format_min_pitch)
selftest(check_drm_framebuffer_create, igt_check_drm_framebuffer_create)
-selftest(damage_iter_no_damage, igt_damage_iter_no_damage)
-selftest(damage_iter_no_damage_fractional_src, igt_damage_iter_no_damage_fractional_src)
-selftest(damage_iter_no_damage_src_moved, igt_damage_iter_no_damage_src_moved)
-selftest(damage_iter_no_damage_fractional_src_moved, igt_damage_iter_no_damage_fractional_src_moved)
-selftest(damage_iter_no_damage_not_visible, igt_damage_iter_no_damage_not_visible)
-selftest(damage_iter_no_damage_no_crtc, igt_damage_iter_no_damage_no_crtc)
-selftest(damage_iter_no_damage_no_fb, igt_damage_iter_no_damage_no_fb)
-selftest(damage_iter_simple_damage, igt_damage_iter_simple_damage)
-selftest(damage_iter_single_damage, igt_damage_iter_single_damage)
-selftest(damage_iter_single_damage_intersect_src, igt_damage_iter_single_damage_intersect_src)
-selftest(damage_iter_single_damage_outside_src, igt_damage_iter_single_damage_outside_src)
-selftest(damage_iter_single_damage_fractional_src, igt_damage_iter_single_damage_fractional_src)
-selftest(damage_iter_single_damage_intersect_fractional_src, igt_damage_iter_single_damage_intersect_fractional_src)
-selftest(damage_iter_single_damage_outside_fractional_src, igt_damage_iter_single_damage_outside_fractional_src)
-selftest(damage_iter_single_damage_src_moved, igt_damage_iter_single_damage_src_moved)
-selftest(damage_iter_single_damage_fractional_src_moved, igt_damage_iter_single_damage_fractional_src_moved)
-selftest(damage_iter_damage, igt_damage_iter_damage)
-selftest(damage_iter_damage_one_intersect, igt_damage_iter_damage_one_intersect)
-selftest(damage_iter_damage_one_outside, igt_damage_iter_damage_one_outside)
-selftest(damage_iter_damage_src_moved, igt_damage_iter_damage_src_moved)
-selftest(damage_iter_damage_not_visible, igt_damage_iter_damage_not_visible)
selftest(dp_mst_calc_pbn_mode, igt_dp_mst_calc_pbn_mode)
selftest(dp_mst_sideband_msg_req_decode, igt_dp_mst_sideband_msg_req_decode)
diff --git a/drivers/gpu/drm/selftests/test-drm_damage_helper.c b/drivers/gpu/drm/selftests/test-drm_damage_helper.c
deleted file mode 100644
index 8d8d8e214c28..000000000000
--- a/drivers/gpu/drm/selftests/test-drm_damage_helper.c
+++ /dev/null
@@ -1,667 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Test case for drm_damage_helper functions
- */
-
-#define pr_fmt(fmt) "drm_damage_helper: " fmt
-
-#include <drm/drm_damage_helper.h>
-#include <drm/drm_plane.h>
-#include <drm/drm_drv.h>
-
-#include "test-drm_modeset_common.h"
-
-struct drm_driver mock_driver;
-static struct drm_device mock_device;
-static struct drm_object_properties mock_obj_props;
-static struct drm_plane mock_plane;
-static struct drm_property mock_prop;
-
-static void mock_setup(struct drm_plane_state *state)
-{
- static bool setup_done = false;
-
- state->plane = &mock_plane;
-
- if (setup_done)
- return;
-
- /* just enough so that drm_plane_enable_fb_damage_clips() works */
- mock_device.driver = &mock_driver;
- mock_device.mode_config.prop_fb_damage_clips = &mock_prop;
- mock_plane.dev = &mock_device;
- mock_obj_props.count = 0;
- mock_plane.base.properties = &mock_obj_props;
- mock_prop.base.id = 1; /* 0 is an invalid id */
- mock_prop.dev = &mock_device;
-
- drm_plane_enable_fb_damage_clips(&mock_plane);
-}
-
-static void set_plane_src(struct drm_plane_state *state, int x1, int y1, int x2,
- int y2)
-{
- state->src.x1 = x1;
- state->src.y1 = y1;
- state->src.x2 = x2;
- state->src.y2 = y2;
-}
-
-static void set_damage_clip(struct drm_mode_rect *r, int x1, int y1, int x2,
- int y2)
-{
- r->x1 = x1;
- r->y1 = y1;
- r->x2 = x2;
- r->y2 = y2;
-}
-
-static void set_damage_blob(struct drm_property_blob *damage_blob,
- struct drm_mode_rect *r, uint32_t size)
-{
- damage_blob->length = size;
- damage_blob->data = r;
-}
-
-static void set_plane_damage(struct drm_plane_state *state,
- struct drm_property_blob *damage_blob)
-{
- state->fb_damage_clips = damage_blob;
-}
-
-static bool check_damage_clip(struct drm_plane_state *state, struct drm_rect *r,
- int x1, int y1, int x2, int y2)
-{
- /*
- * Round down x1/y1 and round up x2/y2. This is because damage is not in
- * 16.16 fixed point so to catch all pixels.
- */
- int src_x1 = state->src.x1 >> 16;
- int src_y1 = state->src.y1 >> 16;
- int src_x2 = (state->src.x2 >> 16) + !!(state->src.x2 & 0xFFFF);
- int src_y2 = (state->src.y2 >> 16) + !!(state->src.y2 & 0xFFFF);
-
- if (x1 >= x2 || y1 >= y2) {
- pr_err("Cannot have damage clip with no dimension.\n");
- return false;
- }
-
- if (x1 < src_x1 || y1 < src_y1 || x2 > src_x2 || y2 > src_y2) {
- pr_err("Damage cannot be outside rounded plane src.\n");
- return false;
- }
-
- if (r->x1 != x1 || r->y1 != y1 || r->x2 != x2 || r->y2 != y2) {
- pr_err("Damage = %d %d %d %d\n", r->x1, r->y1, r->x2, r->y2);
- return false;
- }
-
- return true;
-}
-
-const struct drm_framebuffer fb = {
- .width = 2048,
- .height = 2048
-};
-
-/* common mocked structs many tests need */
-#define MOCK_VARIABLES() \
- struct drm_plane_state old_state; \
- struct drm_plane_state state = { \
- .crtc = ZERO_SIZE_PTR, \
- .fb = (struct drm_framebuffer *) &fb, \
- .visible = true, \
- }; \
- mock_setup(&old_state); \
- mock_setup(&state);
-
-int igt_damage_iter_no_damage(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- MOCK_VARIABLES();
-
- /* Plane src same as fb size. */
- set_plane_src(&old_state, 0, 0, fb.width << 16, fb.height << 16);
- set_plane_src(&state, 0, 0, fb.width << 16, fb.height << 16);
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip)
- num_hits++;
-
- FAIL(num_hits != 1, "Should return plane src as damage.");
- FAIL_ON(!check_damage_clip(&state, &clip, 0, 0, 2048, 2048));
-
- return 0;
-}
-
-int igt_damage_iter_no_damage_fractional_src(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- MOCK_VARIABLES();
-
- /* Plane src has fractional part. */
- set_plane_src(&old_state, 0x3fffe, 0x3fffe,
- 0x3fffe + (1024 << 16), 0x3fffe + (768 << 16));
- set_plane_src(&state, 0x3fffe, 0x3fffe,
- 0x3fffe + (1024 << 16), 0x3fffe + (768 << 16));
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip)
- num_hits++;
-
- FAIL(num_hits != 1, "Should return rounded off plane src as damage.");
- FAIL_ON(!check_damage_clip(&state, &clip, 3, 3, 1028, 772));
-
- return 0;
-}
-
-int igt_damage_iter_no_damage_src_moved(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- MOCK_VARIABLES();
-
- /* Plane src moved since old plane state. */
- set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
- set_plane_src(&state, 10 << 16, 10 << 16,
- (10 + 1024) << 16, (10 + 768) << 16);
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip)
- num_hits++;
-
- FAIL(num_hits != 1, "Should return plane src as damage.");
- FAIL_ON(!check_damage_clip(&state, &clip, 10, 10, 1034, 778));
-
- return 0;
-}
-
-int igt_damage_iter_no_damage_fractional_src_moved(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- MOCK_VARIABLES();
-
- /* Plane src has fractional part and it moved since old plane state. */
- set_plane_src(&old_state, 0x3fffe, 0x3fffe,
- 0x3fffe + (1024 << 16), 0x3fffe + (768 << 16));
- set_plane_src(&state, 0x40002, 0x40002,
- 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip)
- num_hits++;
-
- FAIL(num_hits != 1, "Should return plane src as damage.");
- FAIL_ON(!check_damage_clip(&state, &clip, 4, 4, 1029, 773));
-
- return 0;
-}
-
-int igt_damage_iter_no_damage_not_visible(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- MOCK_VARIABLES();
-
- state.visible = false;
-
- mock_setup(&old_state);
-
- set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
- set_plane_src(&state, 0, 0, 1024 << 16, 768 << 16);
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip)
- num_hits++;
-
- FAIL(num_hits != 0, "Should have no damage.");
-
- return 0;
-}
-
-int igt_damage_iter_no_damage_no_crtc(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- MOCK_VARIABLES();
-
- state.crtc = NULL;
-
- set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
- set_plane_src(&state, 0, 0, 1024 << 16, 768 << 16);
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip)
- num_hits++;
-
- FAIL(num_hits != 0, "Should have no damage.");
-
- return 0;
-}
-
-int igt_damage_iter_no_damage_no_fb(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_plane_state old_state;
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- struct drm_plane_state state = {
- .crtc = ZERO_SIZE_PTR,
- .fb = 0,
- };
-
- mock_setup(&old_state);
-
- set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
- set_plane_src(&state, 0, 0, 1024 << 16, 768 << 16);
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip)
- num_hits++;
-
- FAIL(num_hits != 0, "Should have no damage.");
-
- return 0;
-}
-
-int igt_damage_iter_simple_damage(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_property_blob damage_blob;
- struct drm_mode_rect damage;
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- MOCK_VARIABLES();
-
- set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
- set_plane_src(&state, 0, 0, 1024 << 16, 768 << 16);
- /* Damage set to plane src */
- set_damage_clip(&damage, 0, 0, 1024, 768);
- set_damage_blob(&damage_blob, &damage, sizeof(damage));
- set_plane_damage(&state, &damage_blob);
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip)
- num_hits++;
-
- FAIL(num_hits != 1, "Should return damage when set.");
- FAIL_ON(!check_damage_clip(&state, &clip, 0, 0, 1024, 768));
-
- return 0;
-}
-
-int igt_damage_iter_single_damage(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_property_blob damage_blob;
- struct drm_mode_rect damage;
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- MOCK_VARIABLES();
-
- set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
- set_plane_src(&state, 0, 0, 1024 << 16, 768 << 16);
- set_damage_clip(&damage, 256, 192, 768, 576);
- set_damage_blob(&damage_blob, &damage, sizeof(damage));
- set_plane_damage(&state, &damage_blob);
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip)
- num_hits++;
-
- FAIL(num_hits != 1, "Should return damage when set.");
- FAIL_ON(!check_damage_clip(&state, &clip, 256, 192, 768, 576));
-
- return 0;
-}
-
-int igt_damage_iter_single_damage_intersect_src(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_property_blob damage_blob;
- struct drm_mode_rect damage;
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- MOCK_VARIABLES();
-
- set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
- set_plane_src(&state, 0, 0, 1024 << 16, 768 << 16);
- /* Damage intersect with plane src. */
- set_damage_clip(&damage, 256, 192, 1360, 768);
- set_damage_blob(&damage_blob, &damage, sizeof(damage));
- set_plane_damage(&state, &damage_blob);
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip)
- num_hits++;
-
- FAIL(num_hits != 1, "Should return damage clipped to src.");
- FAIL_ON(!check_damage_clip(&state, &clip, 256, 192, 1024, 768));
-
- return 0;
-}
-
-int igt_damage_iter_single_damage_outside_src(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_property_blob damage_blob;
- struct drm_mode_rect damage;
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- MOCK_VARIABLES();
-
- set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
- set_plane_src(&state, 0, 0, 1024 << 16, 768 << 16);
- /* Damage clip outside plane src */
- set_damage_clip(&damage, 1360, 1360, 1380, 1380);
- set_damage_blob(&damage_blob, &damage, sizeof(damage));
- set_plane_damage(&state, &damage_blob);
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip)
- num_hits++;
-
- FAIL(num_hits != 0, "Should have no damage.");
-
- return 0;
-}
-
-int igt_damage_iter_single_damage_fractional_src(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_property_blob damage_blob;
- struct drm_mode_rect damage;
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- MOCK_VARIABLES();
-
- /* Plane src has fractional part. */
- set_plane_src(&old_state, 0x40002, 0x40002,
- 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
- set_plane_src(&state, 0x40002, 0x40002,
- 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
- set_damage_clip(&damage, 10, 10, 256, 330);
- set_damage_blob(&damage_blob, &damage, sizeof(damage));
- set_plane_damage(&state, &damage_blob);
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip)
- num_hits++;
-
- FAIL(num_hits != 1, "Should return damage when set.");
- FAIL_ON(!check_damage_clip(&state, &clip, 10, 10, 256, 330));
-
- return 0;
-}
-
-int igt_damage_iter_single_damage_intersect_fractional_src(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_property_blob damage_blob;
- struct drm_mode_rect damage;
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- MOCK_VARIABLES();
-
- /* Plane src has fractional part. */
- set_plane_src(&old_state, 0x40002, 0x40002,
- 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
- set_plane_src(&state, 0x40002, 0x40002,
- 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
- /* Damage intersect with plane src. */
- set_damage_clip(&damage, 10, 1, 1360, 330);
- set_damage_blob(&damage_blob, &damage, sizeof(damage));
- set_plane_damage(&state, &damage_blob);
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip)
- num_hits++;
-
- FAIL(num_hits != 1, "Should return damage clipped to rounded off src.");
- FAIL_ON(!check_damage_clip(&state, &clip, 10, 4, 1029, 330));
-
- return 0;
-}
-
-int igt_damage_iter_single_damage_outside_fractional_src(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_property_blob damage_blob;
- struct drm_mode_rect damage;
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- MOCK_VARIABLES();
-
- /* Plane src has fractional part. */
- set_plane_src(&old_state, 0x40002, 0x40002,
- 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
- set_plane_src(&state, 0x40002, 0x40002,
- 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
- /* Damage clip outside plane src */
- set_damage_clip(&damage, 1360, 1360, 1380, 1380);
- set_damage_blob(&damage_blob, &damage, sizeof(damage));
- set_plane_damage(&state, &damage_blob);
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip)
- num_hits++;
-
- FAIL(num_hits != 0, "Should have no damage.");
-
- return 0;
-}
-
-int igt_damage_iter_single_damage_src_moved(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_property_blob damage_blob;
- struct drm_mode_rect damage;
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- MOCK_VARIABLES();
-
- /* Plane src moved since old plane state. */
- set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
- set_plane_src(&state, 10 << 16, 10 << 16,
- (10 + 1024) << 16, (10 + 768) << 16);
- set_damage_clip(&damage, 20, 30, 256, 256);
- set_damage_blob(&damage_blob, &damage, sizeof(damage));
- set_plane_damage(&state, &damage_blob);
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip)
- num_hits++;
-
- FAIL(num_hits != 1, "Should return plane src as damage.");
- FAIL_ON(!check_damage_clip(&state, &clip, 10, 10, 1034, 778));
-
- return 0;
-}
-
-int igt_damage_iter_single_damage_fractional_src_moved(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_property_blob damage_blob;
- struct drm_mode_rect damage;
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- MOCK_VARIABLES();
-
- /* Plane src with fractional part moved since old plane state. */
- set_plane_src(&old_state, 0x3fffe, 0x3fffe,
- 0x3fffe + (1024 << 16), 0x3fffe + (768 << 16));
- set_plane_src(&state, 0x40002, 0x40002,
- 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
- /* Damage intersect with plane src. */
- set_damage_clip(&damage, 20, 30, 1360, 256);
- set_damage_blob(&damage_blob, &damage, sizeof(damage));
- set_plane_damage(&state, &damage_blob);
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip)
- num_hits++;
-
- FAIL(num_hits != 1, "Should return rounded off plane src as damage.");
- FAIL_ON(!check_damage_clip(&state, &clip, 4, 4, 1029, 773));
-
- return 0;
-}
-
-int igt_damage_iter_damage(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_property_blob damage_blob;
- struct drm_mode_rect damage[2];
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- MOCK_VARIABLES();
-
- set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
- set_plane_src(&state, 0, 0, 1024 << 16, 768 << 16);
- /* 2 damage clips. */
- set_damage_clip(&damage[0], 20, 30, 200, 180);
- set_damage_clip(&damage[1], 240, 200, 280, 250);
- set_damage_blob(&damage_blob, &damage[0], sizeof(damage));
- set_plane_damage(&state, &damage_blob);
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip) {
- if (num_hits == 0)
- FAIL_ON(!check_damage_clip(&state, &clip, 20, 30, 200, 180));
- if (num_hits == 1)
- FAIL_ON(!check_damage_clip(&state, &clip, 240, 200, 280, 250));
- num_hits++;
- }
-
- FAIL(num_hits != 2, "Should return damage when set.");
-
- return 0;
-}
-
-int igt_damage_iter_damage_one_intersect(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_property_blob damage_blob;
- struct drm_mode_rect damage[2];
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- MOCK_VARIABLES();
-
- set_plane_src(&old_state, 0x40002, 0x40002,
- 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
- set_plane_src(&state, 0x40002, 0x40002,
- 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
- /* 2 damage clips, one intersect plane src. */
- set_damage_clip(&damage[0], 20, 30, 200, 180);
- set_damage_clip(&damage[1], 2, 2, 1360, 1360);
- set_damage_blob(&damage_blob, &damage[0], sizeof(damage));
- set_plane_damage(&state, &damage_blob);
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip) {
- if (num_hits == 0)
- FAIL_ON(!check_damage_clip(&state, &clip, 20, 30, 200, 180));
- if (num_hits == 1)
- FAIL_ON(!check_damage_clip(&state, &clip, 4, 4, 1029, 773));
- num_hits++;
- }
-
- FAIL(num_hits != 2, "Should return damage when set.");
-
- return 0;
-}
-
-int igt_damage_iter_damage_one_outside(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_property_blob damage_blob;
- struct drm_mode_rect damage[2];
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- MOCK_VARIABLES();
-
- set_plane_src(&old_state, 0, 0, 1024 << 16, 768 << 16);
- set_plane_src(&state, 0, 0, 1024 << 16, 768 << 16);
- /* 2 damage clips, one outside plane src. */
- set_damage_clip(&damage[0], 1360, 1360, 1380, 1380);
- set_damage_clip(&damage[1], 240, 200, 280, 250);
- set_damage_blob(&damage_blob, &damage[0], sizeof(damage));
- set_plane_damage(&state, &damage_blob);
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip)
- num_hits++;
-
- FAIL(num_hits != 1, "Should return damage when set.");
- FAIL_ON(!check_damage_clip(&state, &clip, 240, 200, 280, 250));
-
- return 0;
-}
-
-int igt_damage_iter_damage_src_moved(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_property_blob damage_blob;
- struct drm_mode_rect damage[2];
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- MOCK_VARIABLES();
-
- set_plane_src(&old_state, 0x40002, 0x40002,
- 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
- set_plane_src(&state, 0x3fffe, 0x3fffe,
- 0x3fffe + (1024 << 16), 0x3fffe + (768 << 16));
- /* 2 damage clips, one outside plane src. */
- set_damage_clip(&damage[0], 1360, 1360, 1380, 1380);
- set_damage_clip(&damage[1], 240, 200, 280, 250);
- set_damage_blob(&damage_blob, &damage[0], sizeof(damage));
- set_plane_damage(&state, &damage_blob);
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip)
- num_hits++;
-
- FAIL(num_hits != 1, "Should return round off plane src as damage.");
- FAIL_ON(!check_damage_clip(&state, &clip, 3, 3, 1028, 772));
-
- return 0;
-}
-
-int igt_damage_iter_damage_not_visible(void *ignored)
-{
- struct drm_atomic_helper_damage_iter iter;
- struct drm_property_blob damage_blob;
- struct drm_mode_rect damage[2];
- struct drm_rect clip;
- uint32_t num_hits = 0;
-
- MOCK_VARIABLES();
-
- state.visible = false;
-
- set_plane_src(&old_state, 0x40002, 0x40002,
- 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
- set_plane_src(&state, 0x3fffe, 0x3fffe,
- 0x3fffe + (1024 << 16), 0x3fffe + (768 << 16));
- /* 2 damage clips, one outside plane src. */
- set_damage_clip(&damage[0], 1360, 1360, 1380, 1380);
- set_damage_clip(&damage[1], 240, 200, 280, 250);
- set_damage_blob(&damage_blob, &damage[0], sizeof(damage));
- set_plane_damage(&state, &damage_blob);
- drm_atomic_helper_damage_iter_init(&iter, &old_state, &state);
- drm_atomic_for_each_plane_damage(&iter, &clip)
- num_hits++;
-
- FAIL(num_hits != 0, "Should not return any damage.");
-
- return 0;
-}
diff --git a/drivers/gpu/drm/selftests/test-drm_modeset_common.h b/drivers/gpu/drm/selftests/test-drm_modeset_common.h
index cfb51d8da2bc..c29354e59cec 100644
--- a/drivers/gpu/drm/selftests/test-drm_modeset_common.h
+++ b/drivers/gpu/drm/selftests/test-drm_modeset_common.h
@@ -25,27 +25,6 @@ int igt_check_drm_format_block_width(void *ignored);
int igt_check_drm_format_block_height(void *ignored);
int igt_check_drm_format_min_pitch(void *ignored);
int igt_check_drm_framebuffer_create(void *ignored);
-int igt_damage_iter_no_damage(void *ignored);
-int igt_damage_iter_no_damage_fractional_src(void *ignored);
-int igt_damage_iter_no_damage_src_moved(void *ignored);
-int igt_damage_iter_no_damage_fractional_src_moved(void *ignored);
-int igt_damage_iter_no_damage_not_visible(void *ignored);
-int igt_damage_iter_no_damage_no_crtc(void *ignored);
-int igt_damage_iter_no_damage_no_fb(void *ignored);
-int igt_damage_iter_simple_damage(void *ignored);
-int igt_damage_iter_single_damage(void *ignored);
-int igt_damage_iter_single_damage_intersect_src(void *ignored);
-int igt_damage_iter_single_damage_outside_src(void *ignored);
-int igt_damage_iter_single_damage_fractional_src(void *ignored);
-int igt_damage_iter_single_damage_intersect_fractional_src(void *ignored);
-int igt_damage_iter_single_damage_outside_fractional_src(void *ignored);
-int igt_damage_iter_single_damage_src_moved(void *ignored);
-int igt_damage_iter_single_damage_fractional_src_moved(void *ignored);
-int igt_damage_iter_damage(void *ignored);
-int igt_damage_iter_damage_one_intersect(void *ignored);
-int igt_damage_iter_damage_one_outside(void *ignored);
-int igt_damage_iter_damage_src_moved(void *ignored);
-int igt_damage_iter_damage_not_visible(void *ignored);
int igt_dp_mst_calc_pbn_mode(void *ignored);
int igt_dp_mst_sideband_msg_req_decode(void *ignored);

diff --git a/drivers/gpu/drm/tests/Kconfig b/drivers/gpu/drm/tests/Kconfig
new file mode 100644
index 000000000000..686e134b88bf
--- /dev/null
+++ b/drivers/gpu/drm/tests/Kconfig
@@ -0,0 +1,28 @@
+menu "KUnit tests for DRM"
+ depends on DRM && KUNIT
+
+config DRM_KUNIT_TEST
+ tristate "KUnit tests for DRM" if !KUNIT_ALL_TESTS
+ select DRM_KMS_HELPER
+ default KUNIT_ALL_TESTS
+ help
+ This option provides a KUnit module that can be used to run
+ all unit tests on the DRM API. This option is not useful for
+ distributions or general kernels, but only for kernel
+ developers working on DRM and associated drivers.
+
+ If in doubt, say "N".
+
+config DRM_DAMAGE_HELPER_KUNIT_TEST
+ tristate "KUnit tests for DRM damage helper" if !DRM_KUNIT_TEST
+ select DRM_KMS_HELPER
+ default y if DRM_KUNIT_TEST
+ help
+ This option provides a KUnit module that can be used to run
+ an unit test on the DRM damage helper API. This option is not
+ useful for distributions or general kernels, but only for kernel
+ developers working on DRM and associated drivers.
+
+ If in doubt, say "N".
+
+endmenu
diff --git a/drivers/gpu/drm/tests/Makefile b/drivers/gpu/drm/tests/Makefile
new file mode 100644
index 000000000000..3fef656dffb9
--- /dev/null
+++ b/drivers/gpu/drm/tests/Makefile
@@ -0,0 +1,2 @@
+# SPDX-License-Identifier: GPL-2.0-only
+obj-$(CONFIG_DRM_DAMAGE_HELPER_KUNIT_TEST) += test-drm_damage_helper.o
diff --git a/drivers/gpu/drm/tests/test-drm_damage_helper.c b/drivers/gpu/drm/tests/test-drm_damage_helper.c
new file mode 100644
index 000000000000..5e170eb8753a
--- /dev/null
+++ b/drivers/gpu/drm/tests/test-drm_damage_helper.c
@@ -0,0 +1,633 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Test case for drm_damage_helper functions
+ */
+
+#include <kunit/test.h>
+#include <drm/drm_damage_helper.h>
+#include <drm/drm_plane.h>
+#include <drm/drm_drv.h>
+
+struct drm_damage_mock {
+ struct drm_driver driver;
+ struct drm_device device;
+ struct drm_object_properties obj_props;
+ struct drm_plane plane;
+ struct drm_property prop;
+ struct drm_framebuffer fb;
+ struct drm_plane_state state;
+ struct drm_plane_state old_state;
+};
+
+static int drm_damage_helper_init(struct kunit *test)
+{
+ struct drm_damage_mock *mock;
+
+ mock = kunit_kzalloc(test, sizeof(*mock), GFP_KERNEL);
+ KUNIT_ASSERT_NOT_ERR_OR_NULL(test, mock);
+
+ mock->fb.width = 2048;
+ mock->fb.height = 2048;
+
+ mock->state.crtc = ZERO_SIZE_PTR;
+ mock->state.fb = &mock->fb;
+ mock->state.visible = true;
+
+ mock->old_state.plane = &mock->plane;
+ mock->state.plane = &mock->plane;
+
+ /* just enough so that drm_plane_enable_fb_damage_clips() works */
+ mock->device.driver = &mock->driver;
+ mock->device.mode_config.prop_fb_damage_clips = &mock->prop;
+ mock->plane.dev = &mock->device;
+ mock->obj_props.count = 0;
+ mock->plane.base.properties = &mock->obj_props;
+ mock->prop.base.id = 1; /* 0 is an invalid id */
+ mock->prop.dev = &mock->device;
+
+ drm_plane_enable_fb_damage_clips(&mock->plane);
+
+ test->priv = mock;
+
+ return 0;
+}
+
+static void set_plane_src(struct drm_plane_state *state, int x1, int y1, int x2,
+ int y2)
+{
+ state->src.x1 = x1;
+ state->src.y1 = y1;
+ state->src.x2 = x2;
+ state->src.y2 = y2;
+}
+
+static void set_damage_clip(struct drm_mode_rect *r, int x1, int y1, int x2,
+ int y2)
+{
+ r->x1 = x1;
+ r->y1 = y1;
+ r->x2 = x2;
+ r->y2 = y2;
+}
+
+static void set_damage_blob(struct drm_property_blob *damage_blob,
+ struct drm_mode_rect *r, uint32_t size)
+{
+ damage_blob->length = size;
+ damage_blob->data = r;
+}
+
+static void set_plane_damage(struct drm_plane_state *state,
+ struct drm_property_blob *damage_blob)
+{
+ state->fb_damage_clips = damage_blob;
+}
+
+static void check_damage_clip(struct kunit *test, struct drm_rect *r,
+ int x1, int y1, int x2, int y2)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_plane_state state = mock->state;
+
+ /*
+ * Round down x1/y1 and round up x2/y2. This is because damage is not in
+ * 16.16 fixed point so to catch all pixels.
+ */
+ int src_x1 = state.src.x1 >> 16;
+ int src_y1 = state.src.y1 >> 16;
+ int src_x2 = (state.src.x2 >> 16) + !!(state.src.x2 & 0xFFFF);
+ int src_y2 = (state.src.y2 >> 16) + !!(state.src.y2 & 0xFFFF);
+
+ if (x1 >= x2 || y1 >= y2)
+ KUNIT_FAIL(test, "Cannot have damage clip with no dimension.");
+ if (x1 < src_x1 || y1 < src_y1 || x2 > src_x2 || y2 > src_y2)
+ KUNIT_FAIL(test, "Damage cannot be outside rounded plane src.");
+ if (r->x1 != x1 || r->y1 != y1 || r->x2 != x2 || r->y2 != y2)
+ KUNIT_FAIL(test, "Damage = %d %d %d %d, want = %d %d %d %d",
+ r->x1, r->y1, r->x2, r->y2, x1, y1, x2, y2);
+}
+
+static void igt_damage_iter_no_damage(struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ /* Plane src same as fb size. */
+ set_plane_src(&mock->old_state, 0, 0, mock->fb.width << 16, mock->fb.height << 16);
+ set_plane_src(&mock->state, 0, 0, mock->fb.width << 16, mock->fb.height << 16);
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip)
+ num_hits++;
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 1, "Should return plane src as damage.");
+ check_damage_clip(test, &clip, 0, 0, 2048, 2048);
+}
+
+static void igt_damage_iter_no_damage_fractional_src(struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ /* Plane src has fractional part. */
+ set_plane_src(&mock->old_state, 0x3fffe, 0x3fffe,
+ 0x3fffe + (1024 << 16), 0x3fffe + (768 << 16));
+ set_plane_src(&mock->state, 0x3fffe, 0x3fffe,
+ 0x3fffe + (1024 << 16), 0x3fffe + (768 << 16));
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip)
+ num_hits++;
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 1,
+ "Should return rounded off plane src as damage.");
+ check_damage_clip(test, &clip, 3, 3, 1028, 772);
+}
+
+static void igt_damage_iter_no_damage_src_moved(struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ /* Plane src moved since old plane state. */
+ set_plane_src(&mock->old_state, 0, 0, 1024 << 16, 768 << 16);
+ set_plane_src(&mock->state, 10 << 16, 10 << 16,
+ (10 + 1024) << 16, (10 + 768) << 16);
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip)
+ num_hits++;
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 1, "Should return plane src as damage.");
+ check_damage_clip(test, &clip, 10, 10, 1034, 778);
+}
+
+static void igt_damage_iter_no_damage_fractional_src_moved(struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ /* Plane src has fractional part and it moved since old plane state. */
+ set_plane_src(&mock->old_state, 0x3fffe, 0x3fffe,
+ 0x3fffe + (1024 << 16), 0x3fffe + (768 << 16));
+ set_plane_src(&mock->state, 0x40002, 0x40002,
+ 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip)
+ num_hits++;
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 1, "Should return plane src as damage.");
+ check_damage_clip(test, &clip, 4, 4, 1029, 773);
+}
+
+static void igt_damage_iter_no_damage_not_visible(struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ mock->state.visible = false;
+
+ set_plane_src(&mock->old_state, 0, 0, 1024 << 16, 768 << 16);
+ set_plane_src(&mock->state, 0, 0, 1024 << 16, 768 << 16);
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip)
+ num_hits++;
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 0, "Should have no damage.");
+}
+
+static void igt_damage_iter_no_damage_no_crtc(struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ mock->state.crtc = NULL;
+
+ set_plane_src(&mock->old_state, 0, 0, 1024 << 16, 768 << 16);
+ set_plane_src(&mock->state, 0, 0, 1024 << 16, 768 << 16);
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip)
+ num_hits++;
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 0, "Should have no damage.");
+}
+
+static void igt_damage_iter_no_damage_no_fb(struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ mock->state.fb = NULL;
+
+ set_plane_src(&mock->old_state, 0, 0, 1024 << 16, 768 << 16);
+ set_plane_src(&mock->state, 0, 0, 1024 << 16, 768 << 16);
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip)
+ num_hits++;
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 0, "Should have no damage.");
+}
+
+static void igt_damage_iter_simple_damage(struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_property_blob damage_blob;
+ struct drm_mode_rect damage;
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ set_plane_src(&mock->old_state, 0, 0, 1024 << 16, 768 << 16);
+ set_plane_src(&mock->state, 0, 0, 1024 << 16, 768 << 16);
+ /* Damage set to plane src */
+ set_damage_clip(&damage, 0, 0, 1024, 768);
+ set_damage_blob(&damage_blob, &damage, sizeof(damage));
+ set_plane_damage(&mock->state, &damage_blob);
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip)
+ num_hits++;
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 1, "Should return damage when set.");
+ check_damage_clip(test, &clip, 0, 0, 1024, 768);
+}
+
+static void igt_damage_iter_single_damage(struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_property_blob damage_blob;
+ struct drm_mode_rect damage;
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ set_plane_src(&mock->old_state, 0, 0, 1024 << 16, 768 << 16);
+ set_plane_src(&mock->state, 0, 0, 1024 << 16, 768 << 16);
+ set_damage_clip(&damage, 256, 192, 768, 576);
+ set_damage_blob(&damage_blob, &damage, sizeof(damage));
+ set_plane_damage(&mock->state, &damage_blob);
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip)
+ num_hits++;
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 1, "Should return damage when set.");
+ check_damage_clip(test, &clip, 256, 192, 768, 576);
+}
+
+static void igt_damage_iter_single_damage_intersect_src(struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_property_blob damage_blob;
+ struct drm_mode_rect damage;
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ set_plane_src(&mock->old_state, 0, 0, 1024 << 16, 768 << 16);
+ set_plane_src(&mock->state, 0, 0, 1024 << 16, 768 << 16);
+ /* Damage intersect with plane src. */
+ set_damage_clip(&damage, 256, 192, 1360, 768);
+ set_damage_blob(&damage_blob, &damage, sizeof(damage));
+ set_plane_damage(&mock->state, &damage_blob);
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip)
+ num_hits++;
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 1, "Should return damage clipped to src.");
+ check_damage_clip(test, &clip, 256, 192, 1024, 768);
+}
+
+static void igt_damage_iter_single_damage_outside_src(struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_property_blob damage_blob;
+ struct drm_mode_rect damage;
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ set_plane_src(&mock->old_state, 0, 0, 1024 << 16, 768 << 16);
+ set_plane_src(&mock->state, 0, 0, 1024 << 16, 768 << 16);
+ /* Damage clip outside plane src */
+ set_damage_clip(&damage, 1360, 1360, 1380, 1380);
+ set_damage_blob(&damage_blob, &damage, sizeof(damage));
+ set_plane_damage(&mock->state, &damage_blob);
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip)
+ num_hits++;
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 0, "Should have no damage.");
+}
+
+static void igt_damage_iter_single_damage_fractional_src(struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_property_blob damage_blob;
+ struct drm_mode_rect damage;
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ /* Plane src has fractional part. */
+ set_plane_src(&mock->old_state, 0x40002, 0x40002,
+ 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
+ set_plane_src(&mock->state, 0x40002, 0x40002,
+ 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
+ set_damage_clip(&damage, 10, 10, 256, 330);
+ set_damage_blob(&damage_blob, &damage, sizeof(damage));
+ set_plane_damage(&mock->state, &damage_blob);
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip)
+ num_hits++;
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 1, "Should return damage when set.");
+ check_damage_clip(test, &clip, 10, 10, 256, 330);
+}
+
+static void igt_damage_iter_single_damage_intersect_fractional_src(
+ struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_property_blob damage_blob;
+ struct drm_mode_rect damage;
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ /* Plane src has fractional part. */
+ set_plane_src(&mock->old_state, 0x40002, 0x40002,
+ 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
+ set_plane_src(&mock->state, 0x40002, 0x40002,
+ 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
+ /* Damage intersect with plane src. */
+ set_damage_clip(&damage, 10, 1, 1360, 330);
+ set_damage_blob(&damage_blob, &damage, sizeof(damage));
+ set_plane_damage(&mock->state, &damage_blob);
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip)
+ num_hits++;
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 1,
+ "Should return damage clipped to rounded off src.");
+ check_damage_clip(test, &clip, 10, 4, 1029, 330);
+}
+
+static void igt_damage_iter_single_damage_outside_fractional_src(
+ struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_property_blob damage_blob;
+ struct drm_mode_rect damage;
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ /* Plane src has fractional part. */
+ set_plane_src(&mock->old_state, 0x40002, 0x40002,
+ 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
+ set_plane_src(&mock->state, 0x40002, 0x40002,
+ 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
+ /* Damage clip outside plane src */
+ set_damage_clip(&damage, 1360, 1360, 1380, 1380);
+ set_damage_blob(&damage_blob, &damage, sizeof(damage));
+ set_plane_damage(&mock->state, &damage_blob);
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip)
+ num_hits++;
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 0, "Should have no damage.");
+}
+
+static void igt_damage_iter_single_damage_src_moved(struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_property_blob damage_blob;
+ struct drm_mode_rect damage;
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ /* Plane src moved since old plane state. */
+ set_plane_src(&mock->old_state, 0, 0, 1024 << 16, 768 << 16);
+ set_plane_src(&mock->state, 10 << 16, 10 << 16,
+ (10 + 1024) << 16, (10 + 768) << 16);
+ set_damage_clip(&damage, 20, 30, 256, 256);
+ set_damage_blob(&damage_blob, &damage, sizeof(damage));
+ set_plane_damage(&mock->state, &damage_blob);
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip)
+ num_hits++;
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 1,
+ "Should return plane src as damage.");
+ check_damage_clip(test, &clip, 10, 10, 1034, 778);
+}
+
+static void igt_damage_iter_single_damage_fractional_src_moved(
+ struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_property_blob damage_blob;
+ struct drm_mode_rect damage;
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ /* Plane src with fractional part moved since old plane state. */
+ set_plane_src(&mock->old_state, 0x3fffe, 0x3fffe,
+ 0x3fffe + (1024 << 16), 0x3fffe + (768 << 16));
+ set_plane_src(&mock->state, 0x40002, 0x40002,
+ 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
+ /* Damage intersect with plane src. */
+ set_damage_clip(&damage, 20, 30, 1360, 256);
+ set_damage_blob(&damage_blob, &damage, sizeof(damage));
+ set_plane_damage(&mock->state, &damage_blob);
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip)
+ num_hits++;
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 1,
+ "Should return rounded off plane as damage.");
+ check_damage_clip(test, &clip, 4, 4, 1029, 773);
+}
+
+static void igt_damage_iter_damage(struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_property_blob damage_blob;
+ struct drm_mode_rect damage[2];
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ set_plane_src(&mock->old_state, 0, 0, 1024 << 16, 768 << 16);
+ set_plane_src(&mock->state, 0, 0, 1024 << 16, 768 << 16);
+ /* 2 damage clips. */
+ set_damage_clip(&damage[0], 20, 30, 200, 180);
+ set_damage_clip(&damage[1], 240, 200, 280, 250);
+ set_damage_blob(&damage_blob, &damage[0], sizeof(damage));
+ set_plane_damage(&mock->state, &damage_blob);
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip) {
+ if (num_hits == 0)
+ check_damage_clip(test, &clip, 20, 30, 200, 180);
+ if (num_hits == 1)
+ check_damage_clip(test, &clip, 240, 200, 280, 250);
+ num_hits++;
+ }
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 2, "Should return damage when set.");
+}
+
+static void igt_damage_iter_damage_one_intersect(struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_property_blob damage_blob;
+ struct drm_mode_rect damage[2];
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ set_plane_src(&mock->old_state, 0x40002, 0x40002,
+ 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
+ set_plane_src(&mock->state, 0x40002, 0x40002,
+ 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
+ /* 2 damage clips, one intersect plane src. */
+ set_damage_clip(&damage[0], 20, 30, 200, 180);
+ set_damage_clip(&damage[1], 2, 2, 1360, 1360);
+ set_damage_blob(&damage_blob, &damage[0], sizeof(damage));
+ set_plane_damage(&mock->state, &damage_blob);
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip) {
+ if (num_hits == 0)
+ check_damage_clip(test, &clip, 20, 30, 200, 180);
+ if (num_hits == 1)
+ check_damage_clip(test, &clip, 4, 4, 1029, 773);
+ num_hits++;
+ }
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 2, "Should return damage when set.");
+}
+
+static void igt_damage_iter_damage_one_outside(struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_property_blob damage_blob;
+ struct drm_mode_rect damage[2];
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ set_plane_src(&mock->old_state, 0, 0, 1024 << 16, 768 << 16);
+ set_plane_src(&mock->state, 0, 0, 1024 << 16, 768 << 16);
+ /* 2 damage clips, one outside plane src. */
+ set_damage_clip(&damage[0], 1360, 1360, 1380, 1380);
+ set_damage_clip(&damage[1], 240, 200, 280, 250);
+ set_damage_blob(&damage_blob, &damage[0], sizeof(damage));
+ set_plane_damage(&mock->state, &damage_blob);
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip)
+ num_hits++;
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 1, "Should return damage when set.");
+ check_damage_clip(test, &clip, 240, 200, 280, 250);
+}
+
+static void igt_damage_iter_damage_src_moved(struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_property_blob damage_blob;
+ struct drm_mode_rect damage[2];
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ set_plane_src(&mock->old_state, 0x40002, 0x40002,
+ 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
+ set_plane_src(&mock->state, 0x3fffe, 0x3fffe,
+ 0x3fffe + (1024 << 16), 0x3fffe + (768 << 16));
+ /* 2 damage clips, one outside plane src. */
+ set_damage_clip(&damage[0], 1360, 1360, 1380, 1380);
+ set_damage_clip(&damage[1], 240, 200, 280, 250);
+ set_damage_blob(&damage_blob, &damage[0], sizeof(damage));
+ set_plane_damage(&mock->state, &damage_blob);
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip)
+ num_hits++;
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 1,
+ "Should return round off plane src as damage.");
+ check_damage_clip(test, &clip, 3, 3, 1028, 772);
+}
+
+static void igt_damage_iter_damage_not_visible(struct kunit *test)
+{
+ struct drm_damage_mock *mock = test->priv;
+ struct drm_atomic_helper_damage_iter iter;
+ struct drm_property_blob damage_blob;
+ struct drm_mode_rect damage[2];
+ struct drm_rect clip;
+ uint32_t num_hits = 0;
+
+ mock->state.visible = false;
+
+ set_plane_src(&mock->old_state, 0x40002, 0x40002,
+ 0x40002 + (1024 << 16), 0x40002 + (768 << 16));
+ set_plane_src(&mock->state, 0x3fffe, 0x3fffe,
+ 0x3fffe + (1024 << 16), 0x3fffe + (768 << 16));
+ /* 2 damage clips, one outside plane src. */
+ set_damage_clip(&damage[0], 1360, 1360, 1380, 1380);
+ set_damage_clip(&damage[1], 240, 200, 280, 250);
+ set_damage_blob(&damage_blob, &damage[0], sizeof(damage));
+ set_plane_damage(&mock->state, &damage_blob);
+ drm_atomic_helper_damage_iter_init(&iter, &mock->old_state, &mock->state);
+ drm_atomic_for_each_plane_damage(&iter, &clip)
+ num_hits++;
+
+ KUNIT_EXPECT_EQ_MSG(test, num_hits, 0, "Should not return any damage.");
+}
+
+static struct kunit_case drm_damage_helper_tests[] = {
+ KUNIT_CASE(igt_damage_iter_no_damage),
+ KUNIT_CASE(igt_damage_iter_no_damage_fractional_src),
+ KUNIT_CASE(igt_damage_iter_no_damage_src_moved),
+ KUNIT_CASE(igt_damage_iter_no_damage_fractional_src_moved),
+ KUNIT_CASE(igt_damage_iter_no_damage_not_visible),
+ KUNIT_CASE(igt_damage_iter_no_damage_no_crtc),
+ KUNIT_CASE(igt_damage_iter_no_damage_no_fb),
+ KUNIT_CASE(igt_damage_iter_simple_damage),
+ KUNIT_CASE(igt_damage_iter_single_damage),
+ KUNIT_CASE(igt_damage_iter_single_damage_intersect_src),
+ KUNIT_CASE(igt_damage_iter_single_damage_outside_src),
+ KUNIT_CASE(igt_damage_iter_single_damage_fractional_src),
+ KUNIT_CASE(igt_damage_iter_single_damage_intersect_fractional_src),
+ KUNIT_CASE(igt_damage_iter_single_damage_outside_fractional_src),
+ KUNIT_CASE(igt_damage_iter_single_damage_src_moved),
+ KUNIT_CASE(igt_damage_iter_single_damage_fractional_src_moved),
+ KUNIT_CASE(igt_damage_iter_damage),
+ KUNIT_CASE(igt_damage_iter_damage_one_intersect),
+ KUNIT_CASE(igt_damage_iter_damage_one_outside),
+ KUNIT_CASE(igt_damage_iter_damage_src_moved),
+ KUNIT_CASE(igt_damage_iter_damage_not_visible),
+ { }
+};
+
+static struct kunit_suite drm_damage_helper_test_suite = {
+ .name = "drm_damage_helper_tests",
+ .init = drm_damage_helper_init,
+ .test_cases = drm_damage_helper_tests,
+};
+
+kunit_test_suite(drm_damage_helper_test_suite);
+
+MODULE_LICENSE("GPL");
--
2.36.1

2022-06-15 14:36:55

by Maíra Canal

[permalink] [raw]
Subject: [PATCH 02/10] drm: selftest: refactor drm_cmdline_parser

From: Arthur Grillo <[email protected]>

Refactor the tests by modularizing the functions to avoid code repetition.

Co-developed-by: Maíra Canal <[email protected]>
Signed-off-by: Arthur Grillo <[email protected]>
Signed-off-by: Maíra Canal <[email protected]>
---
.../drm/selftests/test-drm_cmdline_parser.c | 579 +++++-------------
1 file changed, 156 insertions(+), 423 deletions(-)

diff --git a/drivers/gpu/drm/selftests/test-drm_cmdline_parser.c b/drivers/gpu/drm/selftests/test-drm_cmdline_parser.c
index d96cd890def6..57a229c5fc35 100644
--- a/drivers/gpu/drm/selftests/test-drm_cmdline_parser.c
+++ b/drivers/gpu/drm/selftests/test-drm_cmdline_parser.c
@@ -1,6 +1,8 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (c) 2019 Bootlin
+ * Copyright (c) 2021 Ma?ra Canal <[email protected]>,
+ * Copyright (c) 2021 Arthur Grillo <[email protected]>
*/

#define pr_fmt(fmt) "drm_cmdline: " fmt
@@ -17,13 +19,25 @@

static const struct drm_connector no_connector = {};

-static int drm_cmdline_test_force_e_only(void *ignored)
+static int drm_cmdline_test_properties(void *ignored,
+ struct drm_cmdline_mode *mode, enum drm_connector_force force)
+{
+ FAIL_ON(mode->rb);
+ FAIL_ON(mode->cvt);
+ FAIL_ON(mode->interlace);
+ FAIL_ON(mode->margins);
+ FAIL_ON(mode->force != force);
+
+ return 0;
+}
+
+static int drm_cmdline_test_force_only(void *ignored, char *cmdline,
+ const struct drm_connector *connector, enum drm_connector_force force)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("e",
- &no_connector,
- &mode));
+ FAIL_ON(!drm_mode_parse_command_line_for_connector(cmdline,
+ connector, &mode));
FAIL_ON(mode.specified);
FAIL_ON(mode.refresh_specified);
FAIL_ON(mode.bpp_specified);
@@ -32,95 +46,101 @@ static int drm_cmdline_test_force_e_only(void *ignored)
FAIL_ON(mode.cvt);
FAIL_ON(mode.interlace);
FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_ON);
+ FAIL_ON(mode.force != force);

return 0;
}

-static int drm_cmdline_test_force_D_only_not_digital(void *ignored)
+static int drm_cmdline_test_freestanding(void *ignored,
+ struct drm_cmdline_mode *mode, char *cmdline,
+ const struct drm_connector *connector)
{
- struct drm_cmdline_mode mode = { };
+ FAIL_ON(!drm_mode_parse_command_line_for_connector(cmdline,
+ connector, mode));
+ FAIL_ON(mode->specified);
+ FAIL_ON(mode->refresh_specified);
+ FAIL_ON(mode->bpp_specified);

- FAIL_ON(!drm_mode_parse_command_line_for_connector("D",
- &no_connector,
- &mode));
- FAIL_ON(mode.specified);
- FAIL_ON(mode.refresh_specified);
- FAIL_ON(mode.bpp_specified);
+ FAIL_ON(mode->tv_margins.right != 14);
+ FAIL_ON(mode->tv_margins.left != 24);
+ FAIL_ON(mode->tv_margins.bottom != 36);
+ FAIL_ON(mode->tv_margins.top != 42);

- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_ON);
+ return 0;
+}
+
+static int drm_cmdline_test_res_init(void *ignored,
+ struct drm_cmdline_mode *mode, char *cmdline)
+{
+ FAIL_ON(!drm_mode_parse_command_line_for_connector(cmdline,
+ &no_connector, mode));
+ FAIL_ON(!mode->specified);
+ FAIL_ON(mode->xres != 720);
+ FAIL_ON(mode->yres != 480);
+
+ return 0;
+}
+
+static int drm_cmdline_test_res_bpp_init(void *ignored,
+ struct drm_cmdline_mode *mode, char *cmdline)
+{
+ FAIL_ON(!drm_mode_parse_command_line_for_connector(cmdline,
+ &no_connector, mode));
+ FAIL_ON(!mode->specified);
+ FAIL_ON(mode->xres != 720);
+ FAIL_ON(mode->yres != 480);
+
+ FAIL_ON(!mode->refresh_specified);
+ FAIL_ON(mode->refresh != 60);
+ FAIL_ON(!mode->bpp_specified);
+ FAIL_ON(mode->bpp != 24);
+
+ return 0;
+}
+
+static int drm_cmdline_test_force_e_only(void *ignored)
+{
+ drm_cmdline_test_force_only(ignored, "e", &no_connector, DRM_FORCE_ON);
+
+ return 0;
+}
+
+static int drm_cmdline_test_force_D_only_not_digital(void *ignored)
+{
+ drm_cmdline_test_force_only(ignored, "D", &no_connector, DRM_FORCE_ON);

return 0;
}

static const struct drm_connector connector_hdmi = {
.connector_type = DRM_MODE_CONNECTOR_HDMIB,
+
};

static int drm_cmdline_test_force_D_only_hdmi(void *ignored)
{
- struct drm_cmdline_mode mode = { };
-
- FAIL_ON(!drm_mode_parse_command_line_for_connector("D",
- &connector_hdmi,
- &mode));
- FAIL_ON(mode.specified);
- FAIL_ON(mode.refresh_specified);
- FAIL_ON(mode.bpp_specified);
-
- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_ON_DIGITAL);
+ drm_cmdline_test_force_only(ignored, "D", &connector_hdmi,
+ DRM_FORCE_ON_DIGITAL);

return 0;
}

static const struct drm_connector connector_dvi = {
.connector_type = DRM_MODE_CONNECTOR_DVII,
+
};

static int drm_cmdline_test_force_D_only_dvi(void *ignored)
{
- struct drm_cmdline_mode mode = { };
-
- FAIL_ON(!drm_mode_parse_command_line_for_connector("D",
- &connector_dvi,
- &mode));
- FAIL_ON(mode.specified);
- FAIL_ON(mode.refresh_specified);
- FAIL_ON(mode.bpp_specified);
-
- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_ON_DIGITAL);
+ drm_cmdline_test_force_only(ignored, "D", &connector_dvi,
+ DRM_FORCE_ON_DIGITAL);

return 0;
}

static int drm_cmdline_test_force_d_only(void *ignored)
{
- struct drm_cmdline_mode mode = { };
-
- FAIL_ON(!drm_mode_parse_command_line_for_connector("d",
- &no_connector,
- &mode));
- FAIL_ON(mode.specified);
- FAIL_ON(mode.refresh_specified);
- FAIL_ON(mode.bpp_specified);
-
- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_OFF);
+ drm_cmdline_test_force_only(ignored, "d", &no_connector, DRM_FORCE_OFF);

return 0;
}
@@ -151,15 +171,9 @@ static int drm_cmdline_test_res(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
+ drm_cmdline_test_res_init(ignored, &mode, "720x480");

FAIL_ON(mode.refresh_specified);
-
FAIL_ON(mode.bpp_specified);

FAIL_ON(mode.rb);
@@ -219,15 +233,9 @@ static int drm_cmdline_test_res_vesa(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480M",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
+ drm_cmdline_test_res_init(ignored, &mode, "720x480M");

FAIL_ON(mode.refresh_specified);
-
FAIL_ON(mode.bpp_specified);

FAIL_ON(mode.rb);
@@ -243,15 +251,9 @@ static int drm_cmdline_test_res_vesa_rblank(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480MR",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
+ drm_cmdline_test_res_init(ignored, &mode, "720x480MR");

FAIL_ON(mode.refresh_specified);
-
FAIL_ON(mode.bpp_specified);

FAIL_ON(!mode.rb);
@@ -267,15 +269,9 @@ static int drm_cmdline_test_res_rblank(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480R",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
+ drm_cmdline_test_res_init(ignored, &mode, "720x480R");

FAIL_ON(mode.refresh_specified);
-
FAIL_ON(mode.bpp_specified);

FAIL_ON(!mode.rb);
@@ -291,23 +287,13 @@ static int drm_cmdline_test_res_bpp(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
+ drm_cmdline_test_res_init(ignored, &mode, "720x480-24");

FAIL_ON(mode.refresh_specified);
-
FAIL_ON(!mode.bpp_specified);
FAIL_ON(mode.bpp != 24);

- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
+ drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);

return 0;
}
@@ -327,23 +313,13 @@ static int drm_cmdline_test_res_refresh(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480@60",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
+ drm_cmdline_test_res_init(ignored, &mode, "720x480@60");

FAIL_ON(!mode.refresh_specified);
FAIL_ON(mode.refresh != 60);
-
FAIL_ON(mode.bpp_specified);

- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
+ drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);

return 0;
}
@@ -363,24 +339,8 @@ static int drm_cmdline_test_res_bpp_refresh(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
-
- FAIL_ON(!mode.refresh_specified);
- FAIL_ON(mode.refresh != 60);
-
- FAIL_ON(!mode.bpp_specified);
- FAIL_ON(mode.bpp != 24);
-
- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
+ drm_cmdline_test_res_bpp_init(ignored, &mode, "720x480-24@60");
+ drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);

return 0;
}
@@ -389,18 +349,7 @@ static int drm_cmdline_test_res_bpp_refresh_interlaced(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60i",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
-
- FAIL_ON(!mode.refresh_specified);
- FAIL_ON(mode.refresh != 60);
-
- FAIL_ON(!mode.bpp_specified);
- FAIL_ON(mode.bpp != 24);
+ drm_cmdline_test_res_bpp_init(ignored, &mode, "720x480-24@60i");

FAIL_ON(mode.rb);
FAIL_ON(mode.cvt);
@@ -415,18 +364,7 @@ static int drm_cmdline_test_res_bpp_refresh_margins(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60m",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
-
- FAIL_ON(!mode.refresh_specified);
- FAIL_ON(mode.refresh != 60);
-
- FAIL_ON(!mode.bpp_specified);
- FAIL_ON(mode.bpp != 24);
+ drm_cmdline_test_res_bpp_init(ignored, &mode, "720x480-24@60m");

FAIL_ON(mode.rb);
FAIL_ON(mode.cvt);
@@ -441,24 +379,8 @@ static int drm_cmdline_test_res_bpp_refresh_force_off(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60d",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
-
- FAIL_ON(!mode.refresh_specified);
- FAIL_ON(mode.refresh != 60);
-
- FAIL_ON(!mode.bpp_specified);
- FAIL_ON(mode.bpp != 24);
-
- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_OFF);
+ drm_cmdline_test_res_bpp_init(ignored, &mode, "720x480-24@60d");
+ drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_OFF);

return 0;
}
@@ -478,24 +400,8 @@ static int drm_cmdline_test_res_bpp_refresh_force_on(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60e",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
-
- FAIL_ON(!mode.refresh_specified);
- FAIL_ON(mode.refresh != 60);
-
- FAIL_ON(!mode.bpp_specified);
- FAIL_ON(mode.bpp != 24);
-
- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_ON);
+ drm_cmdline_test_res_bpp_init(ignored, &mode, "720x480-24@60e");
+ drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_ON);

return 0;
}
@@ -504,24 +410,8 @@ static int drm_cmdline_test_res_bpp_refresh_force_on_analog(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60D",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
-
- FAIL_ON(!mode.refresh_specified);
- FAIL_ON(mode.refresh != 60);
-
- FAIL_ON(!mode.bpp_specified);
- FAIL_ON(mode.bpp != 24);
-
- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_ON);
+ drm_cmdline_test_res_bpp_init(ignored, &mode, "720x480-24@60D");
+ drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_ON);

return 0;
}
@@ -534,8 +424,7 @@ static int drm_cmdline_test_res_bpp_refresh_force_on_digital(void *ignored)
};

FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60D",
- &connector,
- &mode));
+ &connector, &mode));
FAIL_ON(!mode.specified);
FAIL_ON(mode.xres != 720);
FAIL_ON(mode.yres != 480);
@@ -546,11 +435,7 @@ static int drm_cmdline_test_res_bpp_refresh_force_on_digital(void *ignored)
FAIL_ON(!mode.bpp_specified);
FAIL_ON(mode.bpp != 24);

- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_ON_DIGITAL);
+ drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_ON_DIGITAL);

return 0;
}
@@ -559,18 +444,7 @@ static int drm_cmdline_test_res_bpp_refresh_interlaced_margins_force_on(void *ig
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60ime",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
-
- FAIL_ON(!mode.refresh_specified);
- FAIL_ON(mode.refresh != 60);
-
- FAIL_ON(!mode.bpp_specified);
- FAIL_ON(mode.bpp != 24);
+ drm_cmdline_test_res_bpp_init(ignored, &mode, "720x480-24@60ime");

FAIL_ON(mode.rb);
FAIL_ON(mode.cvt);
@@ -585,15 +459,9 @@ static int drm_cmdline_test_res_margins_force_on(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480me",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
+ drm_cmdline_test_res_init(ignored, &mode, "720x480me");

FAIL_ON(mode.refresh_specified);
-
FAIL_ON(mode.bpp_specified);

FAIL_ON(mode.rb);
@@ -609,15 +477,9 @@ static int drm_cmdline_test_res_vesa_margins(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480Mm",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
+ drm_cmdline_test_res_init(ignored, &mode, "720x480Mm");

FAIL_ON(mode.refresh_specified);
-
FAIL_ON(mode.bpp_specified);

FAIL_ON(mode.rb);
@@ -673,10 +535,9 @@ static int drm_cmdline_test_name_bpp(void *ignored)
&no_connector,
&mode));
FAIL_ON(strcmp(mode.name, "NTSC"));
-
FAIL_ON(mode.refresh_specified);
-
FAIL_ON(!mode.bpp_specified);
+
FAIL_ON(mode.bpp != 24);

return 0;
@@ -760,23 +621,13 @@ static int drm_cmdline_test_rotate_0(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=0",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
- FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_0);
+ drm_cmdline_test_res_init(ignored, &mode, "720x480,rotate=0");

+ FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_0);
FAIL_ON(mode.refresh_specified);
-
FAIL_ON(mode.bpp_specified);

- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
+ drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);

return 0;
}
@@ -785,23 +636,13 @@ static int drm_cmdline_test_rotate_90(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=90",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
- FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_90);
+ drm_cmdline_test_res_init(ignored, &mode, "720x480,rotate=90");

+ FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_90);
FAIL_ON(mode.refresh_specified);
-
FAIL_ON(mode.bpp_specified);

- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
+ drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);

return 0;
}
@@ -810,23 +651,13 @@ static int drm_cmdline_test_rotate_180(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=180",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
- FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_180);
+ drm_cmdline_test_res_init(ignored, &mode, "720x480,rotate=180");

+ FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_180);
FAIL_ON(mode.refresh_specified);
-
FAIL_ON(mode.bpp_specified);

- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
+ drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);

return 0;
}
@@ -835,23 +666,13 @@ static int drm_cmdline_test_rotate_270(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=270",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
- FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_270);
+ drm_cmdline_test_res_init(ignored, &mode, "720x480,rotate=270");

+ FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_270);
FAIL_ON(mode.refresh_specified);
-
FAIL_ON(mode.bpp_specified);

- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
+ drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);

return 0;
}
@@ -860,9 +681,8 @@ static int drm_cmdline_test_rotate_multiple(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=0,rotate=90",
- &no_connector,
- &mode));
+ FAIL_ON(drm_mode_parse_command_line_for_connector(
+ "720x480,rotate=0,rotate=90", &no_connector, &mode));

return 0;
}
@@ -871,9 +691,8 @@ static int drm_cmdline_test_rotate_invalid_val(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=42",
- &no_connector,
- &mode));
+ FAIL_ON(drm_mode_parse_command_line_for_connector(
+ "720x480,rotate=42", &no_connector, &mode));

return 0;
}
@@ -882,9 +701,8 @@ static int drm_cmdline_test_rotate_truncated(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=",
- &no_connector,
- &mode));
+ FAIL_ON(drm_mode_parse_command_line_for_connector(
+ "720x480,rotate=", &no_connector, &mode));

return 0;
}
@@ -893,23 +711,13 @@ static int drm_cmdline_test_hmirror(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,reflect_x",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
- FAIL_ON(mode.rotation_reflection != (DRM_MODE_ROTATE_0 | DRM_MODE_REFLECT_X));
+ drm_cmdline_test_res_init(ignored, &mode, "720x480,reflect_x");

+ FAIL_ON(mode.rotation_reflection != (DRM_MODE_ROTATE_0 | DRM_MODE_REFLECT_X));
FAIL_ON(mode.refresh_specified);
-
FAIL_ON(mode.bpp_specified);

- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
+ drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);

return 0;
}
@@ -918,23 +726,13 @@ static int drm_cmdline_test_vmirror(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,reflect_y",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
- FAIL_ON(mode.rotation_reflection != (DRM_MODE_ROTATE_0 | DRM_MODE_REFLECT_Y));
+ drm_cmdline_test_res_init(ignored, &mode, "720x480,reflect_y");

+ FAIL_ON(mode.rotation_reflection != (DRM_MODE_ROTATE_0 | DRM_MODE_REFLECT_Y));
FAIL_ON(mode.refresh_specified);
-
FAIL_ON(mode.bpp_specified);

- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
+ drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);

return 0;
}
@@ -943,26 +741,18 @@ static int drm_cmdline_test_margin_options(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
+ drm_cmdline_test_res_init(ignored, &mode,
+ "720x480,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42");
+
FAIL_ON(mode.tv_margins.right != 14);
FAIL_ON(mode.tv_margins.left != 24);
FAIL_ON(mode.tv_margins.bottom != 36);
FAIL_ON(mode.tv_margins.top != 42);

FAIL_ON(mode.refresh_specified);
-
FAIL_ON(mode.bpp_specified);

- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
+ drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);

return 0;
}
@@ -971,23 +761,13 @@ static int drm_cmdline_test_multiple_options(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=270,reflect_x",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
- FAIL_ON(mode.rotation_reflection != (DRM_MODE_ROTATE_270 | DRM_MODE_REFLECT_X));
+ drm_cmdline_test_res_init(ignored, &mode, "720x480,rotate=270,reflect_x");

+ FAIL_ON(mode.rotation_reflection != (DRM_MODE_ROTATE_270 | DRM_MODE_REFLECT_X));
FAIL_ON(mode.refresh_specified);
-
FAIL_ON(mode.bpp_specified);

- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
+ drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);

return 0;
}
@@ -996,9 +776,8 @@ static int drm_cmdline_test_invalid_option(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,test=42",
- &no_connector,
- &mode));
+ FAIL_ON(drm_mode_parse_command_line_for_connector(
+ "720x480,test=42", &no_connector, &mode));

return 0;
}
@@ -1007,24 +786,14 @@ static int drm_cmdline_test_bpp_extra_and_option(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24e,rotate=180",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
- FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_180);
+ drm_cmdline_test_res_init(ignored, &mode, "720x480-24e,rotate=180");

+ FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_180);
FAIL_ON(mode.refresh_specified);
-
FAIL_ON(!mode.bpp_specified);
FAIL_ON(mode.bpp != 24);

- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_ON);
+ drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_ON);

return 0;
}
@@ -1033,22 +802,13 @@ static int drm_cmdline_test_extra_and_option(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480e,rotate=180",
- &no_connector,
- &mode));
- FAIL_ON(!mode.specified);
- FAIL_ON(mode.xres != 720);
- FAIL_ON(mode.yres != 480);
- FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_180);
+ drm_cmdline_test_res_init(ignored, &mode, "720x480e,rotate=180");

+ FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_180);
FAIL_ON(mode.refresh_specified);
FAIL_ON(mode.bpp_specified);

- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_ON);
+ drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_ON);

return 0;
}
@@ -1057,23 +817,11 @@ static int drm_cmdline_test_freestanding_options(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
- &no_connector,
- &mode));
- FAIL_ON(mode.specified);
- FAIL_ON(mode.refresh_specified);
- FAIL_ON(mode.bpp_specified);
+ drm_cmdline_test_freestanding(ignored, &mode,
+ "margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
+ &no_connector);

- FAIL_ON(mode.tv_margins.right != 14);
- FAIL_ON(mode.tv_margins.left != 24);
- FAIL_ON(mode.tv_margins.bottom != 36);
- FAIL_ON(mode.tv_margins.top != 42);
-
- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
+ drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);

return 0;
}
@@ -1082,23 +830,11 @@ static int drm_cmdline_test_freestanding_force_e_and_options(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("e,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
- &no_connector,
- &mode));
- FAIL_ON(mode.specified);
- FAIL_ON(mode.refresh_specified);
- FAIL_ON(mode.bpp_specified);
+ drm_cmdline_test_freestanding(ignored, &mode,
+ "e,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
+ &no_connector);

- FAIL_ON(mode.tv_margins.right != 14);
- FAIL_ON(mode.tv_margins.left != 24);
- FAIL_ON(mode.tv_margins.bottom != 36);
- FAIL_ON(mode.tv_margins.top != 42);
-
- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_ON);
+ drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_ON);

return 0;
}
@@ -1107,20 +843,17 @@ static int drm_cmdline_test_panel_orientation(void *ignored)
{
struct drm_cmdline_mode mode = { };

- FAIL_ON(!drm_mode_parse_command_line_for_connector("panel_orientation=upside_down",
- &no_connector,
- &mode));
+ FAIL_ON(!drm_mode_parse_command_line_for_connector(
+ "panel_orientation=upside_down", &no_connector, &mode));
+
FAIL_ON(mode.specified);
FAIL_ON(mode.refresh_specified);
FAIL_ON(mode.bpp_specified);

+
FAIL_ON(mode.panel_orientation != DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP);

- FAIL_ON(mode.rb);
- FAIL_ON(mode.cvt);
- FAIL_ON(mode.interlace);
- FAIL_ON(mode.margins);
- FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
+ drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);

return 0;
}
--
2.36.1

2022-06-16 14:57:17

by David Gow

[permalink] [raw]
Subject: Re: [PATCH 00/10] drm: selftest: Convert to KUnit

On Wed, Jun 15, 2022 at 9:59 PM Maíra Canal <[email protected]> wrote:
>
> KUnit unifies the test structure and provides helper tools that simplify
> the development of tests. The basic use case allows running tests as regular
> processes, which makes it easier to run unit tests on a development machine
> and to integrate the tests into a CI system.
>
> That said, the conversion of selftests for DRM to KUnit tests is beneficial
> as it unifies the testing API by using the KUnit API.
>
> KUnit is beneficial for developers as it eases the process to run unit tests.
> It is possible to run the tests by using the kunit-tool on userspace with the
> following command:
>
> ./tools/testing/kunit/kunit.py run --kunitconfig=drivers/gpu/drm/tests --arch=x86_64
>
> For CI system, it is possible to execute during the build. But, we also think
> about IGT: we are developing a patch to introduce KUnit to IGT.
>
> These patches were developed during a KUnit hackathon [0] last October. Now,
> we believe that both the IGT side and the Kernel side are in good shape for
> submission.
>
> If you are willing to check the output, here is the Pastebin with the output
> and execution times [1].
>
> [0] https://groups.google.com/g/kunit-dev/c/YqFR1q2uZvk/m/IbvItSfHBAAJ
> [1] https://pastebin.com/FJjLPKsC
>
> - Arthur Grillo, Isabella Basso, and Maíra Canal

Great to see these going upstream!

I've tested them on my machine, both with x86_64 qemu and with UML using:
./tools/testing/kunit/kunit.py run
--kunitconfig=drivers/gpu/drm/tests/.kunitconfig \
--kconfig_add CONFIG_UML_PCI_OVER_VIRTIO=y \
--kconfig_add CONFIG_VIRTIO_UML=y

And all 114 tests pass, and everything looks good. My only minor notes
(from a quick look at the results, rather than a detailed review of
the code) are that the test names have a few small oddities:
- The suites all end in _tests (or _test, in the case of
drm_plane_helper_test). This is a bit redundant (and while there is
only one drm_plane_helper_test, the inconsistency with the others is a
bit awkward), so removing the suffix may be cleaner. (Or at least
being optimistic, and making drm_plane_helper_test plural.)
- The drm_cmdline_parser_tests suite's tests have some inconsistencies
name-wise: they're the only ones to start with drm_, not igt_, and
they have a few capital letters in some of the
'drm_cmdline_test_force_D_' tests. (It's also technically redundant to
start all of the test names with drm_cmdline_test, given the suite
name.)

Of course, if you're trying to keep compatibility with existing tests
or tooling, or there's some deeper reason they're named like this,
it's definitely not a dealbreaker.

Either way, this whole series is:

Tested-by: David Gow <[email protected]>

Cheers,
-- David

2022-06-16 16:45:02

by Javier Martinez Canillas

[permalink] [raw]
Subject: Re: [PATCH 00/10] drm: selftest: Convert to KUnit

On 6/16/22 16:55, David Gow wrote:
> On Wed, Jun 15, 2022 at 9:59 PM Maíra Canal <[email protected]> wrote:
>>
>> KUnit unifies the test structure and provides helper tools that simplify
>> the development of tests. The basic use case allows running tests as regular
>> processes, which makes it easier to run unit tests on a development machine
>> and to integrate the tests into a CI system.
>>
>> That said, the conversion of selftests for DRM to KUnit tests is beneficial
>> as it unifies the testing API by using the KUnit API.
>>
>> KUnit is beneficial for developers as it eases the process to run unit tests.
>> It is possible to run the tests by using the kunit-tool on userspace with the
>> following command:
>>
>> ./tools/testing/kunit/kunit.py run --kunitconfig=drivers/gpu/drm/tests --arch=x86_64
>>
>> For CI system, it is possible to execute during the build. But, we also think
>> about IGT: we are developing a patch to introduce KUnit to IGT.
>>
>> These patches were developed during a KUnit hackathon [0] last October. Now,
>> we believe that both the IGT side and the Kernel side are in good shape for
>> submission.
>>
>> If you are willing to check the output, here is the Pastebin with the output
>> and execution times [1].
>>
>> [0] https://groups.google.com/g/kunit-dev/c/YqFR1q2uZvk/m/IbvItSfHBAAJ
>> [1] https://pastebin.com/FJjLPKsC
>>
>> - Arthur Grillo, Isabella Basso, and Maíra Canal
>
> Great to see these going upstream!
>

Indeed, this is pretty awesome!

I haven't reviewed the patches yet but just have a meta comment. There's a TODO
entry for this [0] in Documentation/gpu/todo.rst, so I think that you could add
a patch removing that as a part of this series.

[0]: https://cgit.freedesktop.org/drm/drm/tree/Documentation/gpu/todo.rst#n620

--
Best regards,

Javier Martinez Canillas
Linux Engineering
Red Hat

2022-06-17 23:08:01

by Shuah Khan

[permalink] [raw]
Subject: Re: [PATCH 02/10] drm: selftest: refactor drm_cmdline_parser

On 6/15/22 7:58 AM, Maíra Canal wrote:
> From: Arthur Grillo <[email protected]>
>
> Refactor the tests by modularizing the functions to avoid code repetition.
>

Tell me more about the refactor and how does it help. This patch seems
to combine refactor with some other formatting changes that aren't
necessary and making the code not easy to read.

Lot of code changes with no expalination on how and why this is being
refactored. Are these just refractor or are there any new tests being
added?

Please don't cobine formatting changes with refactoring. Also don't
break up the code into small chunks unless there is a good reason to
do so.

> Co-developed-by: Maíra Canal <[email protected]>
> Signed-off-by: Arthur Grillo <[email protected]>
> Signed-off-by: Maíra Canal <[email protected]>
> ---
> .../drm/selftests/test-drm_cmdline_parser.c | 579 +++++-------------
> 1 file changed, 156 insertions(+), 423 deletions(-)
>
> diff --git a/drivers/gpu/drm/selftests/test-drm_cmdline_parser.c b/drivers/gpu/drm/selftests/test-drm_cmdline_parser.c
> index d96cd890def6..57a229c5fc35 100644
> --- a/drivers/gpu/drm/selftests/test-drm_cmdline_parser.c
> +++ b/drivers/gpu/drm/selftests/test-drm_cmdline_parser.c
> @@ -1,6 +1,8 @@
> // SPDX-License-Identifier: GPL-2.0
> /*
> * Copyright (c) 2019 Bootlin
> + * Copyright (c) 2021 Ma�ra Canal <[email protected]>,
> + * Copyright (c) 2021 Arthur Grillo <[email protected]>
> */
>
> #define pr_fmt(fmt) "drm_cmdline: " fmt
> @@ -17,13 +19,25 @@
>
> static const struct drm_connector no_connector = {};
>
> -static int drm_cmdline_test_force_e_only(void *ignored)
> +static int drm_cmdline_test_properties(void *ignored,
> + struct drm_cmdline_mode *mode, enum drm_connector_force force)
> +{
> + FAIL_ON(mode->rb);
> + FAIL_ON(mode->cvt);
> + FAIL_ON(mode->interlace);
> + FAIL_ON(mode->margins);
> + FAIL_ON(mode->force != force);
> +
> + return 0;
> +}
> +
> +static int drm_cmdline_test_force_only(void *ignored, char *cmdline,
> + const struct drm_connector *connector, enum drm_connector_force force)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("e",
> - &no_connector,
> - &mode));
> + FAIL_ON(!drm_mode_parse_command_line_for_connector(cmdline,
> + connector, &mode));

This change for example.

> FAIL_ON(mode.specified);
> FAIL_ON(mode.refresh_specified);
> FAIL_ON(mode.bpp_specified);
> @@ -32,95 +46,101 @@ static int drm_cmdline_test_force_e_only(void *ignored)
> FAIL_ON(mode.cvt);
> FAIL_ON(mode.interlace);
> FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_ON);
> + FAIL_ON(mode.force != force);
>
> return 0;
> }
>
> -static int drm_cmdline_test_force_D_only_not_digital(void *ignored)
> +static int drm_cmdline_test_freestanding(void *ignored,
> + struct drm_cmdline_mode *mode, char *cmdline,
> + const struct drm_connector *connector)

These should be lined up with the first argument.

> {
> - struct drm_cmdline_mode mode = { };
> + FAIL_ON(!drm_mode_parse_command_line_for_connector(cmdline,
> + connector, mode));
> + FAIL_ON(mode->specified);
> + FAIL_ON(mode->refresh_specified);
> + FAIL_ON(mode->bpp_specified);
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("D",
> - &no_connector,
> - &mode));
> - FAIL_ON(mode.specified);
> - FAIL_ON(mode.refresh_specified);
> - FAIL_ON(mode.bpp_specified);
> + FAIL_ON(mode->tv_margins.right != 14);
> + FAIL_ON(mode->tv_margins.left != 24);
> + FAIL_ON(mode->tv_margins.bottom != 36);
> + FAIL_ON(mode->tv_margins.top != 42);
>

Whst are these constants for - please add defines for them with meaningful
names so it cna be maintained easily.

> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_ON);
> + return 0;
> +}
> +
> +static int drm_cmdline_test_res_init(void *ignored,
> + struct drm_cmdline_mode *mode, char *cmdline)
> +{
> + FAIL_ON(!drm_mode_parse_command_line_for_connector(cmdline,
> + &no_connector, mode));
> + FAIL_ON(!mode->specified);
> + FAIL_ON(mode->xres != 720);
> + FAIL_ON(mode->yres != 480);
> +
> + return 0;
> +}
> +
> +static int drm_cmdline_test_res_bpp_init(void *ignored,
> + struct drm_cmdline_mode *mode, char *cmdline)
> +{
> + FAIL_ON(!drm_mode_parse_command_line_for_connector(cmdline,
> + &no_connector, mode));
> + FAIL_ON(!mode->specified);
> + FAIL_ON(mode->xres != 720);
> + FAIL_ON(mode->yres != 480);
> +
> + FAIL_ON(!mode->refresh_specified);
> + FAIL_ON(mode->refresh != 60);
> + FAIL_ON(!mode->bpp_specified);
> + FAIL_ON(mode->bpp != 24);

Same here

> +
> + return 0;
> +}
> +
> +static int drm_cmdline_test_force_e_only(void *ignored)
> +{
> + drm_cmdline_test_force_only(ignored, "e", &no_connector, DRM_FORCE_ON);
> +
Get rid of the extra line.

> + return 0;

Same comment here on a new routine. Let's not add new routines
> +}
> +
> +static int drm_cmdline_test_force_D_only_not_digital(void *ignored)
> +{
> + drm_cmdline_test_force_only(ignored, "D", &no_connector, DRM_FORCE_ON);
>
same here. What is the need to add a whole new routine for this.
It you really want to make this a marco.


> return 0;
> }
>
> static const struct drm_connector connector_hdmi = {
> .connector_type = DRM_MODE_CONNECTOR_HDMIB,
> +
> };
>
> static int drm_cmdline_test_force_D_only_hdmi(void *ignored)
> {
> - struct drm_cmdline_mode mode = { };
> -
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("D",
> - &connector_hdmi,
> - &mode));
> - FAIL_ON(mode.specified);
> - FAIL_ON(mode.refresh_specified);
> - FAIL_ON(mode.bpp_specified);
> -
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_ON_DIGITAL);
> + drm_cmdline_test_force_only(ignored, "D", &connector_hdmi,
> + DRM_FORCE_ON_DIGITAL);
>
> return 0;
> }
>
> static const struct drm_connector connector_dvi = {
> .connector_type = DRM_MODE_CONNECTOR_DVII,
> +
> };
>
> static int drm_cmdline_test_force_D_only_dvi(void *ignored)
> {
> - struct drm_cmdline_mode mode = { };
> -
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("D",
> - &connector_dvi,
> - &mode));
> - FAIL_ON(mode.specified);
> - FAIL_ON(mode.refresh_specified);
> - FAIL_ON(mode.bpp_specified);
> -
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_ON_DIGITAL);
> + drm_cmdline_test_force_only(ignored, "D", &connector_dvi,
> + DRM_FORCE_ON_DIGITAL);
>
> return 0;
> }
>
> static int drm_cmdline_test_force_d_only(void *ignored)
> {
> - struct drm_cmdline_mode mode = { };
> -
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("d",
> - &no_connector,
> - &mode));
> - FAIL_ON(mode.specified);
> - FAIL_ON(mode.refresh_specified);
> - FAIL_ON(mode.bpp_specified);
> -
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_OFF);
> + drm_cmdline_test_force_only(ignored, "d", &no_connector, DRM_FORCE_OFF);
>
> return 0;
> }
> @@ -151,15 +171,9 @@ static int drm_cmdline_test_res(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> + drm_cmdline_test_res_init(ignored, &mode, "720x480");
>
> FAIL_ON(mode.refresh_specified);
> -
> FAIL_ON(mode.bpp_specified);
>
> FAIL_ON(mode.rb);
> @@ -219,15 +233,9 @@ static int drm_cmdline_test_res_vesa(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480M",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> + drm_cmdline_test_res_init(ignored, &mode, "720x480M");
>
> FAIL_ON(mode.refresh_specified);
> -
> FAIL_ON(mode.bpp_specified);
>
> FAIL_ON(mode.rb);
> @@ -243,15 +251,9 @@ static int drm_cmdline_test_res_vesa_rblank(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480MR",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> + drm_cmdline_test_res_init(ignored, &mode, "720x480MR");
>
> FAIL_ON(mode.refresh_specified);
> -
> FAIL_ON(mode.bpp_specified);
>
> FAIL_ON(!mode.rb);
> @@ -267,15 +269,9 @@ static int drm_cmdline_test_res_rblank(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480R",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> + drm_cmdline_test_res_init(ignored, &mode, "720x480R");
>
> FAIL_ON(mode.refresh_specified);
> -
> FAIL_ON(mode.bpp_specified);
>
> FAIL_ON(!mode.rb);
> @@ -291,23 +287,13 @@ static int drm_cmdline_test_res_bpp(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> + drm_cmdline_test_res_init(ignored, &mode, "720x480-24");
>
> FAIL_ON(mode.refresh_specified);
> -
> FAIL_ON(!mode.bpp_specified);
> FAIL_ON(mode.bpp != 24);
>
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
> + drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);
>
> return 0;
> }
> @@ -327,23 +313,13 @@ static int drm_cmdline_test_res_refresh(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480@60",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> + drm_cmdline_test_res_init(ignored, &mode, "720x480@60");
>
> FAIL_ON(!mode.refresh_specified);
> FAIL_ON(mode.refresh != 60);
> -
> FAIL_ON(mode.bpp_specified);
>
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
> + drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);
>
> return 0;
> }
> @@ -363,24 +339,8 @@ static int drm_cmdline_test_res_bpp_refresh(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> -
> - FAIL_ON(!mode.refresh_specified);
> - FAIL_ON(mode.refresh != 60);
> -
> - FAIL_ON(!mode.bpp_specified);
> - FAIL_ON(mode.bpp != 24);
> -
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
> + drm_cmdline_test_res_bpp_init(ignored, &mode, "720x480-24@60");
> + drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);
>
> return 0;
> }
> @@ -389,18 +349,7 @@ static int drm_cmdline_test_res_bpp_refresh_interlaced(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60i",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> -
> - FAIL_ON(!mode.refresh_specified);
> - FAIL_ON(mode.refresh != 60);
> -
> - FAIL_ON(!mode.bpp_specified);
> - FAIL_ON(mode.bpp != 24);
> + drm_cmdline_test_res_bpp_init(ignored, &mode, "720x480-24@60i");
>
> FAIL_ON(mode.rb);
> FAIL_ON(mode.cvt);
> @@ -415,18 +364,7 @@ static int drm_cmdline_test_res_bpp_refresh_margins(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60m",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> -
> - FAIL_ON(!mode.refresh_specified);
> - FAIL_ON(mode.refresh != 60);
> -
> - FAIL_ON(!mode.bpp_specified);
> - FAIL_ON(mode.bpp != 24);
> + drm_cmdline_test_res_bpp_init(ignored, &mode, "720x480-24@60m");
>
> FAIL_ON(mode.rb);
> FAIL_ON(mode.cvt);
> @@ -441,24 +379,8 @@ static int drm_cmdline_test_res_bpp_refresh_force_off(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60d",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> -
> - FAIL_ON(!mode.refresh_specified);
> - FAIL_ON(mode.refresh != 60);
> -
> - FAIL_ON(!mode.bpp_specified);
> - FAIL_ON(mode.bpp != 24);
> -
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_OFF);
> + drm_cmdline_test_res_bpp_init(ignored, &mode, "720x480-24@60d");
> + drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_OFF);
>
> return 0;
> }
> @@ -478,24 +400,8 @@ static int drm_cmdline_test_res_bpp_refresh_force_on(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60e",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> -
> - FAIL_ON(!mode.refresh_specified);
> - FAIL_ON(mode.refresh != 60);
> -
> - FAIL_ON(!mode.bpp_specified);
> - FAIL_ON(mode.bpp != 24);
> -
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_ON);
> + drm_cmdline_test_res_bpp_init(ignored, &mode, "720x480-24@60e");
> + drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_ON);
>
> return 0;
> }
> @@ -504,24 +410,8 @@ static int drm_cmdline_test_res_bpp_refresh_force_on_analog(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60D",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> -
> - FAIL_ON(!mode.refresh_specified);
> - FAIL_ON(mode.refresh != 60);
> -
> - FAIL_ON(!mode.bpp_specified);
> - FAIL_ON(mode.bpp != 24);
> -
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_ON);
> + drm_cmdline_test_res_bpp_init(ignored, &mode, "720x480-24@60D");
> + drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_ON);
>
> return 0;
> }
> @@ -534,8 +424,7 @@ static int drm_cmdline_test_res_bpp_refresh_force_on_digital(void *ignored)
> };
>
> FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60D",
> - &connector,
> - &mode));
> + &connector, &mode));

Why combine the lines here - the code was just fine earlier.

> FAIL_ON(!mode.specified);
> FAIL_ON(mode.xres != 720);
> FAIL_ON(mode.yres != 480);
> @@ -546,11 +435,7 @@ static int drm_cmdline_test_res_bpp_refresh_force_on_digital(void *ignored)
> FAIL_ON(!mode.bpp_specified);
> FAIL_ON(mode.bpp != 24);
>
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_ON_DIGITAL);
> + drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_ON_DIGITAL);
>
> return 0;
> }
> @@ -559,18 +444,7 @@ static int drm_cmdline_test_res_bpp_refresh_interlaced_margins_force_on(void *ig
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60ime",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> -
> - FAIL_ON(!mode.refresh_specified);
> - FAIL_ON(mode.refresh != 60);
> -
> - FAIL_ON(!mode.bpp_specified);
> - FAIL_ON(mode.bpp != 24);
> + drm_cmdline_test_res_bpp_init(ignored, &mode, "720x480-24@60ime");
>
> FAIL_ON(mode.rb);
> FAIL_ON(mode.cvt);
> @@ -585,15 +459,9 @@ static int drm_cmdline_test_res_margins_force_on(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480me",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> + drm_cmdline_test_res_init(ignored, &mode, "720x480me");
>
> FAIL_ON(mode.refresh_specified);
> -
> FAIL_ON(mode.bpp_specified);
>
> FAIL_ON(mode.rb);
> @@ -609,15 +477,9 @@ static int drm_cmdline_test_res_vesa_margins(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480Mm",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> + drm_cmdline_test_res_init(ignored, &mode, "720x480Mm");
>
> FAIL_ON(mode.refresh_specified);
> -
> FAIL_ON(mode.bpp_specified);
>
> FAIL_ON(mode.rb);
> @@ -673,10 +535,9 @@ static int drm_cmdline_test_name_bpp(void *ignored)
> &no_connector,
> &mode));
> FAIL_ON(strcmp(mode.name, "NTSC"));
> -
> FAIL_ON(mode.refresh_specified);
> -
> FAIL_ON(!mode.bpp_specified);
> +
> FAIL_ON(mode.bpp != 24);
>
> return 0;
> @@ -760,23 +621,13 @@ static int drm_cmdline_test_rotate_0(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=0",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> - FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_0);
> + drm_cmdline_test_res_init(ignored, &mode, "720x480,rotate=0");
>
> + FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_0);
> FAIL_ON(mode.refresh_specified);
> -
> FAIL_ON(mode.bpp_specified);
>
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
> + drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);
>
> return 0;
> }
> @@ -785,23 +636,13 @@ static int drm_cmdline_test_rotate_90(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=90",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> - FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_90);
> + drm_cmdline_test_res_init(ignored, &mode, "720x480,rotate=90");
>
> + FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_90);
> FAIL_ON(mode.refresh_specified);
> -
> FAIL_ON(mode.bpp_specified);
>
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
> + drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);
>
> return 0;
> }
> @@ -810,23 +651,13 @@ static int drm_cmdline_test_rotate_180(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=180",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> - FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_180);
> + drm_cmdline_test_res_init(ignored, &mode, "720x480,rotate=180");
>
> + FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_180);
> FAIL_ON(mode.refresh_specified);
> -
> FAIL_ON(mode.bpp_specified);
>
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
> + drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);
>
> return 0;
> }
> @@ -835,23 +666,13 @@ static int drm_cmdline_test_rotate_270(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=270",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> - FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_270);
> + drm_cmdline_test_res_init(ignored, &mode, "720x480,rotate=270");
>
> + FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_270);
> FAIL_ON(mode.refresh_specified);
> -
> FAIL_ON(mode.bpp_specified);
>
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
> + drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);
>
> return 0;
> }
> @@ -860,9 +681,8 @@ static int drm_cmdline_test_rotate_multiple(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=0,rotate=90",
> - &no_connector,
> - &mode));
> + FAIL_ON(drm_mode_parse_command_line_for_connector(
> + "720x480,rotate=0,rotate=90", &no_connector, &mode));
>
> return 0;
> }
> @@ -871,9 +691,8 @@ static int drm_cmdline_test_rotate_invalid_val(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=42",
> - &no_connector,
> - &mode));
> + FAIL_ON(drm_mode_parse_command_line_for_connector(
> + "720x480,rotate=42", &no_connector, &mode));
>
> return 0;
> }
> @@ -882,9 +701,8 @@ static int drm_cmdline_test_rotate_truncated(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=",
> - &no_connector,
> - &mode));
> + FAIL_ON(drm_mode_parse_command_line_for_connector(
> + "720x480,rotate=", &no_connector, &mode));
>
> return 0;
> }
> @@ -893,23 +711,13 @@ static int drm_cmdline_test_hmirror(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,reflect_x",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> - FAIL_ON(mode.rotation_reflection != (DRM_MODE_ROTATE_0 | DRM_MODE_REFLECT_X));
> + drm_cmdline_test_res_init(ignored, &mode, "720x480,reflect_x");
>
> + FAIL_ON(mode.rotation_reflection != (DRM_MODE_ROTATE_0 | DRM_MODE_REFLECT_X));
> FAIL_ON(mode.refresh_specified);
> -
> FAIL_ON(mode.bpp_specified);
>
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
> + drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);
>
> return 0;
> }
> @@ -918,23 +726,13 @@ static int drm_cmdline_test_vmirror(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,reflect_y",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> - FAIL_ON(mode.rotation_reflection != (DRM_MODE_ROTATE_0 | DRM_MODE_REFLECT_Y));
> + drm_cmdline_test_res_init(ignored, &mode, "720x480,reflect_y");
>
> + FAIL_ON(mode.rotation_reflection != (DRM_MODE_ROTATE_0 | DRM_MODE_REFLECT_Y));
> FAIL_ON(mode.refresh_specified);
> -
> FAIL_ON(mode.bpp_specified);
>
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
> + drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);
>
> return 0;
> }
> @@ -943,26 +741,18 @@ static int drm_cmdline_test_margin_options(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> + drm_cmdline_test_res_init(ignored, &mode,
> + "720x480,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42");
> +
> FAIL_ON(mode.tv_margins.right != 14);
> FAIL_ON(mode.tv_margins.left != 24);
> FAIL_ON(mode.tv_margins.bottom != 36);
> FAIL_ON(mode.tv_margins.top != 42);
>
> FAIL_ON(mode.refresh_specified);
> -
> FAIL_ON(mode.bpp_specified);
>
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
> + drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);
>
> return 0;
> }
> @@ -971,23 +761,13 @@ static int drm_cmdline_test_multiple_options(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=270,reflect_x",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> - FAIL_ON(mode.rotation_reflection != (DRM_MODE_ROTATE_270 | DRM_MODE_REFLECT_X));
> + drm_cmdline_test_res_init(ignored, &mode, "720x480,rotate=270,reflect_x");
>
> + FAIL_ON(mode.rotation_reflection != (DRM_MODE_ROTATE_270 | DRM_MODE_REFLECT_X));
> FAIL_ON(mode.refresh_specified);
> -
> FAIL_ON(mode.bpp_specified);
>
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
> + drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);
>
> return 0;
> }
> @@ -996,9 +776,8 @@ static int drm_cmdline_test_invalid_option(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,test=42",
> - &no_connector,
> - &mode));
> + FAIL_ON(drm_mode_parse_command_line_for_connector(
> + "720x480,test=42", &no_connector, &mode));
>
> return 0;
> }
> @@ -1007,24 +786,14 @@ static int drm_cmdline_test_bpp_extra_and_option(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24e,rotate=180",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> - FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_180);
> + drm_cmdline_test_res_init(ignored, &mode, "720x480-24e,rotate=180");
>
> + FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_180);
> FAIL_ON(mode.refresh_specified);
> -
> FAIL_ON(!mode.bpp_specified);
> FAIL_ON(mode.bpp != 24);
>
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_ON);
> + drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_ON);
>
> return 0;
> }
> @@ -1033,22 +802,13 @@ static int drm_cmdline_test_extra_and_option(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480e,rotate=180",
> - &no_connector,
> - &mode));
> - FAIL_ON(!mode.specified);
> - FAIL_ON(mode.xres != 720);
> - FAIL_ON(mode.yres != 480);
> - FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_180);
> + drm_cmdline_test_res_init(ignored, &mode, "720x480e,rotate=180");
>
> + FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_180);
> FAIL_ON(mode.refresh_specified);
> FAIL_ON(mode.bpp_specified);
>
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_ON);
> + drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_ON);
>
> return 0;
> }
> @@ -1057,23 +817,11 @@ static int drm_cmdline_test_freestanding_options(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
> - &no_connector,
> - &mode));
> - FAIL_ON(mode.specified);
> - FAIL_ON(mode.refresh_specified);
> - FAIL_ON(mode.bpp_specified);
> + drm_cmdline_test_freestanding(ignored, &mode,
> + "margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
> + &no_connector);
>
> - FAIL_ON(mode.tv_margins.right != 14);
> - FAIL_ON(mode.tv_margins.left != 24);
> - FAIL_ON(mode.tv_margins.bottom != 36);
> - FAIL_ON(mode.tv_margins.top != 42);
> -
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
> + drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);
>
> return 0;
> }
> @@ -1082,23 +830,11 @@ static int drm_cmdline_test_freestanding_force_e_and_options(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("e,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
> - &no_connector,
> - &mode));
> - FAIL_ON(mode.specified);
> - FAIL_ON(mode.refresh_specified);
> - FAIL_ON(mode.bpp_specified);
> + drm_cmdline_test_freestanding(ignored, &mode,
> + "e,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
> + &no_connector);
>
> - FAIL_ON(mode.tv_margins.right != 14);
> - FAIL_ON(mode.tv_margins.left != 24);
> - FAIL_ON(mode.tv_margins.bottom != 36);
> - FAIL_ON(mode.tv_margins.top != 42);
> -
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_ON);
> + drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_ON);
>
> return 0;
> }
> @@ -1107,20 +843,17 @@ static int drm_cmdline_test_panel_orientation(void *ignored)
> {
> struct drm_cmdline_mode mode = { };
>
> - FAIL_ON(!drm_mode_parse_command_line_for_connector("panel_orientation=upside_down",
> - &no_connector,
> - &mode));
> + FAIL_ON(!drm_mode_parse_command_line_for_connector(
> + "panel_orientation=upside_down", &no_connector, &mode));

Same here about changing the format.

> +
> FAIL_ON(mode.specified);
> FAIL_ON(mode.refresh_specified);
> FAIL_ON(mode.bpp_specified);
>
> +
> FAIL_ON(mode.panel_orientation != DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP);
>
> - FAIL_ON(mode.rb);
> - FAIL_ON(mode.cvt);
> - FAIL_ON(mode.interlace);
> - FAIL_ON(mode.margins);
> - FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
> + drm_cmdline_test_properties(ignored, &mode, DRM_FORCE_UNSPECIFIED);
>
> return 0;
> }
>

thanks,
-- Shuah

2022-06-19 15:47:32

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH 08/10] drm: selftest: convert drm_framebuffer selftest to KUnit

Hi "Ma?ra,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on drm/drm-next]
[also build test ERROR on linus/master v5.19-rc2 next-20220617]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url: https://github.com/intel-lab-lkp/linux/commits/Ma-ra-Canal/drm-selftest-Convert-to-KUnit/20220615-220404
base: git://anongit.freedesktop.org/drm/drm drm-next
config: mips-allmodconfig (https://download.01.org/0day-ci/archive/20220619/[email protected]/config)
compiler: mips-linux-gcc (GCC) 11.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/5109526a34e7196931f36b5537031eaa601de997
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Ma-ra-Canal/drm-selftest-Convert-to-KUnit/20220615-220404
git checkout 5109526a34e7196931f36b5537031eaa601de997
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.3.0 make.cross W=1 O=build_dir ARCH=mips SHELL=/bin/bash

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <[email protected]>

All errors (new ones prefixed by >>, old ones prefixed by <<):

ERROR: modpost: missing MODULE_LICENSE() in drivers/gpu/drm/tests/test-drm_plane_helper.o
ERROR: modpost: missing MODULE_LICENSE() in drivers/gpu/drm/tests/test-drm_dp_mst_helper.o
ERROR: modpost: "drm_dp_encode_sideband_req" [drivers/gpu/drm/tests/test-drm_dp_mst_helper.ko] undefined!
ERROR: modpost: "drm_dp_decode_sideband_req" [drivers/gpu/drm/tests/test-drm_dp_mst_helper.ko] undefined!
ERROR: modpost: "drm_dp_dump_sideband_msg_req_body" [drivers/gpu/drm/tests/test-drm_dp_mst_helper.ko] undefined!
>> ERROR: modpost: "drm_internal_framebuffer_create" [drivers/gpu/drm/tests/test-drm_framebuffer.ko] undefined!

--
0-DAY CI Kernel Test Service
https://01.org/lkp