drm/vc4: tests: Add tests for BCM2712 PixelValve Muxing
authorMaxime Ripard <maxime@cerno.tech>
Fri, 14 Apr 2023 09:14:22 +0000 (11:14 +0200)
committerDom Cobley <popcornmix@gmail.com>
Mon, 19 Feb 2024 11:35:00 +0000 (11:35 +0000)
The BCM2712 has a simpler pipeline than the BCM2711, and thus the muxing
requirements are different. Create some tests to make sure we get proper
muxing decisions.

Signed-off-by: Maxime Ripard <maxime@cerno.tech>
drivers/gpu/drm/vc4/tests/vc4_test_pv_muxing.c

index d690ebb..77884ea 100644 (file)
@@ -104,6 +104,13 @@ static const struct encoder_constraint vc5_encoder_constraints[] = {
        ENCODER_CONSTRAINT(VC4_ENCODER_TYPE_HDMI1, 0, 1, 2),
 };
 
+static const struct encoder_constraint vc6_encoder_constraints[] = {
+       ENCODER_CONSTRAINT(VC4_ENCODER_TYPE_HDMI0, 0),
+       ENCODER_CONSTRAINT(VC4_ENCODER_TYPE_HDMI1, 1),
+       ENCODER_CONSTRAINT(VC4_ENCODER_TYPE_TXP1, 1),
+       ENCODER_CONSTRAINT(VC4_ENCODER_TYPE_TXP0, 2),
+};
+
 static bool check_vc4_encoder_constraints(enum vc4_encoder_type type, unsigned int channel)
 {
        return __check_encoder_constraints(vc4_encoder_constraints,
@@ -118,6 +125,13 @@ static bool check_vc5_encoder_constraints(enum vc4_encoder_type type, unsigned i
                                           type, channel);
 }
 
+static bool check_vc6_encoder_constraints(enum vc4_encoder_type type, unsigned int channel)
+{
+       return __check_encoder_constraints(vc6_encoder_constraints,
+                                          ARRAY_SIZE(vc6_encoder_constraints),
+                                          type, channel);
+}
+
 static struct vc4_crtc_state *
 get_vc4_crtc_state_for_encoder(struct kunit *test,
                               const struct drm_atomic_state *state,
@@ -195,6 +209,9 @@ static void vc4_test_pv_muxing_desc(const struct pv_muxing_param *t, char *desc)
 #define VC5_PV_MUXING_TEST(_name, ...)         \
        PV_MUXING_TEST(_name, vc5_mock_device, check_vc5_encoder_constraints, __VA_ARGS__)
 
+#define VC6_PV_MUXING_TEST(_name, ...)         \
+       PV_MUXING_TEST(_name, vc6_mock_device, check_vc6_encoder_constraints, __VA_ARGS__)
+
 static const struct pv_muxing_param vc4_test_pv_muxing_params[] = {
        VC4_PV_MUXING_TEST("1 output: DSI0",
                           VC4_ENCODER_TYPE_DSI0),
@@ -673,6 +690,54 @@ KUNIT_ARRAY_PARAM(vc5_test_pv_muxing_invalid,
                  vc5_test_pv_muxing_invalid_params,
                  vc4_test_pv_muxing_desc);
 
+static const struct pv_muxing_param vc6_test_pv_muxing_params[] = {
+       VC6_PV_MUXING_TEST("1 output: HDMI0",
+                          VC4_ENCODER_TYPE_HDMI0),
+       VC6_PV_MUXING_TEST("1 output: HDMI1",
+                          VC4_ENCODER_TYPE_HDMI1),
+       VC6_PV_MUXING_TEST("1 output: MOPLET",
+                          VC4_ENCODER_TYPE_TXP1),
+       VC6_PV_MUXING_TEST("1 output: MOP",
+                          VC4_ENCODER_TYPE_TXP0),
+       VC6_PV_MUXING_TEST("2 outputs: HDMI0, HDMI1",
+                          VC4_ENCODER_TYPE_HDMI0,
+                          VC4_ENCODER_TYPE_HDMI1),
+       VC6_PV_MUXING_TEST("2 outputs: HDMI0, MOPLET",
+                          VC4_ENCODER_TYPE_HDMI0,
+                          VC4_ENCODER_TYPE_TXP1),
+       VC6_PV_MUXING_TEST("2 outputs: HDMI0, MOP",
+                          VC4_ENCODER_TYPE_HDMI0,
+                          VC4_ENCODER_TYPE_TXP0),
+       VC6_PV_MUXING_TEST("2 outputs: HDMI1, MOP",
+                          VC4_ENCODER_TYPE_HDMI1,
+                          VC4_ENCODER_TYPE_TXP0),
+       VC6_PV_MUXING_TEST("2 outputs: MOPLET, MOP",
+                          VC4_ENCODER_TYPE_TXP1,
+                          VC4_ENCODER_TYPE_TXP0),
+       VC6_PV_MUXING_TEST("3 outputs: HDMI0, HDMI1, MOP",
+                          VC4_ENCODER_TYPE_HDMI0,
+                          VC4_ENCODER_TYPE_HDMI1,
+                          VC4_ENCODER_TYPE_TXP0),
+       VC6_PV_MUXING_TEST("3 outputs: HDMI0, MOPLET, MOP",
+                          VC4_ENCODER_TYPE_HDMI0,
+                          VC4_ENCODER_TYPE_TXP1,
+                          VC4_ENCODER_TYPE_TXP0),
+};
+
+KUNIT_ARRAY_PARAM(vc6_test_pv_muxing,
+                 vc6_test_pv_muxing_params,
+                 vc4_test_pv_muxing_desc);
+
+static const struct pv_muxing_param vc6_test_pv_muxing_invalid_params[] = {
+       VC6_PV_MUXING_TEST("HDMI1/MOPLET Conflict",
+                          VC4_ENCODER_TYPE_HDMI1,
+                          VC4_ENCODER_TYPE_TXP1),
+};
+
+KUNIT_ARRAY_PARAM(vc6_test_pv_muxing_invalid,
+                 vc6_test_pv_muxing_invalid_params,
+                 vc4_test_pv_muxing_desc);
+
 static void drm_vc4_test_pv_muxing(struct kunit *test)
 {
        const struct pv_muxing_param *params = test->param_value;
@@ -777,6 +842,21 @@ static struct kunit_suite vc5_pv_muxing_test_suite = {
        .test_cases = vc5_pv_muxing_tests,
 };
 
+static struct kunit_case vc6_pv_muxing_tests[] = {
+       KUNIT_CASE_PARAM(drm_vc4_test_pv_muxing,
+                        vc6_test_pv_muxing_gen_params),
+       KUNIT_CASE_PARAM(drm_vc4_test_pv_muxing_invalid,
+                        vc6_test_pv_muxing_invalid_gen_params),
+       {}
+};
+
+static struct kunit_suite vc6_pv_muxing_test_suite = {
+       .name = "vc6-pv-muxing-combinations",
+       .init = vc4_pv_muxing_test_init,
+       .exit = vc4_pv_muxing_test_exit,
+       .test_cases = vc6_pv_muxing_tests,
+};
+
 /* See
  * https://lore.kernel.org/all/3e113525-aa89-b1e2-56b7-ca55bd41d057@samsung.com/
  * and
@@ -1009,5 +1089,6 @@ static struct kunit_suite vc5_pv_muxing_bugs_test_suite = {
 kunit_test_suites(
        &vc4_pv_muxing_test_suite,
        &vc5_pv_muxing_test_suite,
+       &vc6_pv_muxing_test_suite,
        &vc5_pv_muxing_bugs_test_suite
 );