xref: /linux/drivers/gpu/drm/vc4/tests/vc4_test_pv_muxing.c (revision a940daa52167e9db8ecce82213813b735a9d9f23)
176ec18dcSMaxime Ripard // SPDX-License-Identifier: GPL-2.0
276ec18dcSMaxime Ripard 
376ec18dcSMaxime Ripard #include <drm/drm_atomic.h>
476ec18dcSMaxime Ripard #include <drm/drm_atomic_helper.h>
576ec18dcSMaxime Ripard #include <drm/drm_atomic_state_helper.h>
676ec18dcSMaxime Ripard #include <drm/drm_atomic_uapi.h>
776ec18dcSMaxime Ripard #include <drm/drm_crtc.h>
876ec18dcSMaxime Ripard #include <drm/drm_drv.h>
976ec18dcSMaxime Ripard #include <drm/drm_fourcc.h>
1076ec18dcSMaxime Ripard #include <drm/drm_kunit_helpers.h>
1176ec18dcSMaxime Ripard #include <drm/drm_mode.h>
1276ec18dcSMaxime Ripard #include <drm/drm_modeset_helper_vtables.h>
1376ec18dcSMaxime Ripard #include <drm/drm_plane.h>
1476ec18dcSMaxime Ripard 
1576ec18dcSMaxime Ripard #include <kunit/test.h>
1676ec18dcSMaxime Ripard 
1776ec18dcSMaxime Ripard #include "../vc4_drv.h"
1876ec18dcSMaxime Ripard 
1976ec18dcSMaxime Ripard #include "vc4_mock.h"
2076ec18dcSMaxime Ripard 
2176ec18dcSMaxime Ripard struct pv_muxing_priv {
2276ec18dcSMaxime Ripard 	struct vc4_dev *vc4;
2376ec18dcSMaxime Ripard 	struct drm_atomic_state *state;
2476ec18dcSMaxime Ripard };
2576ec18dcSMaxime Ripard 
check_fifo_conflict(struct kunit * test,const struct drm_atomic_state * state)2676ec18dcSMaxime Ripard static bool check_fifo_conflict(struct kunit *test,
2776ec18dcSMaxime Ripard 				const struct drm_atomic_state *state)
2876ec18dcSMaxime Ripard {
2976ec18dcSMaxime Ripard 	struct vc4_hvs_state *hvs_state;
3076ec18dcSMaxime Ripard 	unsigned int used_fifos = 0;
3176ec18dcSMaxime Ripard 	unsigned int i;
3276ec18dcSMaxime Ripard 
3376ec18dcSMaxime Ripard 	hvs_state = vc4_hvs_get_new_global_state(state);
3476ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, hvs_state);
3576ec18dcSMaxime Ripard 
3676ec18dcSMaxime Ripard 	for (i = 0; i < HVS_NUM_CHANNELS; i++) {
3776ec18dcSMaxime Ripard 		if (!hvs_state->fifo_state[i].in_use)
3876ec18dcSMaxime Ripard 			continue;
3976ec18dcSMaxime Ripard 
4076ec18dcSMaxime Ripard 		KUNIT_EXPECT_FALSE(test, used_fifos & BIT(i));
4176ec18dcSMaxime Ripard 		used_fifos |= BIT(i);
4276ec18dcSMaxime Ripard 	}
4376ec18dcSMaxime Ripard 
4476ec18dcSMaxime Ripard 	return true;
4576ec18dcSMaxime Ripard }
4676ec18dcSMaxime Ripard 
4776ec18dcSMaxime Ripard struct encoder_constraint {
4876ec18dcSMaxime Ripard 	enum vc4_encoder_type type;
4976ec18dcSMaxime Ripard 	unsigned int *channels;
5076ec18dcSMaxime Ripard 	size_t nchannels;
5176ec18dcSMaxime Ripard };
5276ec18dcSMaxime Ripard 
5376ec18dcSMaxime Ripard #define ENCODER_CONSTRAINT(_type, ...)					\
5476ec18dcSMaxime Ripard 	{								\
5576ec18dcSMaxime Ripard 		.type = _type,						\
5676ec18dcSMaxime Ripard 		.channels = (unsigned int[]) { __VA_ARGS__ },		\
5776ec18dcSMaxime Ripard 		.nchannels = sizeof((unsigned int[]) { __VA_ARGS__ }) /	\
5876ec18dcSMaxime Ripard 			     sizeof(unsigned int),			\
5976ec18dcSMaxime Ripard 	}
6076ec18dcSMaxime Ripard 
__check_encoder_constraints(const struct encoder_constraint * constraints,size_t nconstraints,enum vc4_encoder_type type,unsigned int channel)6176ec18dcSMaxime Ripard static bool __check_encoder_constraints(const struct encoder_constraint *constraints,
6276ec18dcSMaxime Ripard 					size_t nconstraints,
6376ec18dcSMaxime Ripard 					enum vc4_encoder_type type,
6476ec18dcSMaxime Ripard 					unsigned int channel)
6576ec18dcSMaxime Ripard {
6676ec18dcSMaxime Ripard 	unsigned int i;
6776ec18dcSMaxime Ripard 
6876ec18dcSMaxime Ripard 	for (i = 0; i < nconstraints; i++) {
6976ec18dcSMaxime Ripard 		const struct encoder_constraint *constraint = &constraints[i];
7076ec18dcSMaxime Ripard 		unsigned int j;
7176ec18dcSMaxime Ripard 
7276ec18dcSMaxime Ripard 		if (constraint->type != type)
7376ec18dcSMaxime Ripard 			continue;
7476ec18dcSMaxime Ripard 
7576ec18dcSMaxime Ripard 		for (j = 0; j < constraint->nchannels; j++) {
7676ec18dcSMaxime Ripard 			unsigned int _channel = constraint->channels[j];
7776ec18dcSMaxime Ripard 
7876ec18dcSMaxime Ripard 			if (channel != _channel)
7976ec18dcSMaxime Ripard 				continue;
8076ec18dcSMaxime Ripard 
8176ec18dcSMaxime Ripard 			return true;
8276ec18dcSMaxime Ripard 		}
8376ec18dcSMaxime Ripard 	}
8476ec18dcSMaxime Ripard 
8576ec18dcSMaxime Ripard 	return false;
8676ec18dcSMaxime Ripard }
8776ec18dcSMaxime Ripard 
8876ec18dcSMaxime Ripard static const struct encoder_constraint vc4_encoder_constraints[] = {
8976ec18dcSMaxime Ripard 	ENCODER_CONSTRAINT(VC4_ENCODER_TYPE_DPI, 0),
9076ec18dcSMaxime Ripard 	ENCODER_CONSTRAINT(VC4_ENCODER_TYPE_DSI0, 0),
9176ec18dcSMaxime Ripard 	ENCODER_CONSTRAINT(VC4_ENCODER_TYPE_HDMI0, 1),
9276ec18dcSMaxime Ripard 	ENCODER_CONSTRAINT(VC4_ENCODER_TYPE_VEC, 1),
9376ec18dcSMaxime Ripard 	ENCODER_CONSTRAINT(VC4_ENCODER_TYPE_TXP, 2),
9476ec18dcSMaxime Ripard 	ENCODER_CONSTRAINT(VC4_ENCODER_TYPE_DSI1, 2),
9576ec18dcSMaxime Ripard };
9676ec18dcSMaxime Ripard 
9776ec18dcSMaxime Ripard static const struct encoder_constraint vc5_encoder_constraints[] = {
9876ec18dcSMaxime Ripard 	ENCODER_CONSTRAINT(VC4_ENCODER_TYPE_DPI, 0),
9976ec18dcSMaxime Ripard 	ENCODER_CONSTRAINT(VC4_ENCODER_TYPE_DSI0, 0),
10076ec18dcSMaxime Ripard 	ENCODER_CONSTRAINT(VC4_ENCODER_TYPE_VEC, 1),
10176ec18dcSMaxime Ripard 	ENCODER_CONSTRAINT(VC4_ENCODER_TYPE_TXP, 0, 2),
10276ec18dcSMaxime Ripard 	ENCODER_CONSTRAINT(VC4_ENCODER_TYPE_DSI1, 0, 1, 2),
10376ec18dcSMaxime Ripard 	ENCODER_CONSTRAINT(VC4_ENCODER_TYPE_HDMI0, 0, 1, 2),
10476ec18dcSMaxime Ripard 	ENCODER_CONSTRAINT(VC4_ENCODER_TYPE_HDMI1, 0, 1, 2),
10576ec18dcSMaxime Ripard };
10676ec18dcSMaxime Ripard 
check_vc4_encoder_constraints(enum vc4_encoder_type type,unsigned int channel)10776ec18dcSMaxime Ripard static bool check_vc4_encoder_constraints(enum vc4_encoder_type type, unsigned int channel)
10876ec18dcSMaxime Ripard {
10976ec18dcSMaxime Ripard 	return __check_encoder_constraints(vc4_encoder_constraints,
11076ec18dcSMaxime Ripard 					   ARRAY_SIZE(vc4_encoder_constraints),
11176ec18dcSMaxime Ripard 					   type, channel);
11276ec18dcSMaxime Ripard }
11376ec18dcSMaxime Ripard 
check_vc5_encoder_constraints(enum vc4_encoder_type type,unsigned int channel)11476ec18dcSMaxime Ripard static bool check_vc5_encoder_constraints(enum vc4_encoder_type type, unsigned int channel)
11576ec18dcSMaxime Ripard {
11676ec18dcSMaxime Ripard 	return __check_encoder_constraints(vc5_encoder_constraints,
11776ec18dcSMaxime Ripard 					   ARRAY_SIZE(vc5_encoder_constraints),
11876ec18dcSMaxime Ripard 					   type, channel);
11976ec18dcSMaxime Ripard }
12076ec18dcSMaxime Ripard 
12176ec18dcSMaxime Ripard static struct vc4_crtc_state *
get_vc4_crtc_state_for_encoder(struct kunit * test,const struct drm_atomic_state * state,enum vc4_encoder_type type)12276ec18dcSMaxime Ripard get_vc4_crtc_state_for_encoder(struct kunit *test,
12376ec18dcSMaxime Ripard 			       const struct drm_atomic_state *state,
12476ec18dcSMaxime Ripard 			       enum vc4_encoder_type type)
12576ec18dcSMaxime Ripard {
12676ec18dcSMaxime Ripard 	struct drm_device *drm = state->dev;
12776ec18dcSMaxime Ripard 	struct drm_crtc_state *new_crtc_state;
12876ec18dcSMaxime Ripard 	struct drm_encoder *encoder;
12976ec18dcSMaxime Ripard 	struct drm_crtc *crtc;
13076ec18dcSMaxime Ripard 
13176ec18dcSMaxime Ripard 	encoder = vc4_find_encoder_by_type(drm, type);
13276ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder);
13376ec18dcSMaxime Ripard 
13476ec18dcSMaxime Ripard 	crtc = vc4_find_crtc_for_encoder(test, drm, encoder);
13576ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc);
13676ec18dcSMaxime Ripard 
13776ec18dcSMaxime Ripard 	new_crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
13876ec18dcSMaxime Ripard 	if (!new_crtc_state)
13976ec18dcSMaxime Ripard 		return NULL;
14076ec18dcSMaxime Ripard 
14176ec18dcSMaxime Ripard 	return to_vc4_crtc_state(new_crtc_state);
14276ec18dcSMaxime Ripard }
14376ec18dcSMaxime Ripard 
check_channel_for_encoder(struct kunit * test,const struct drm_atomic_state * state,enum vc4_encoder_type type,bool (* check_fn)(enum vc4_encoder_type type,unsigned int channel))14476ec18dcSMaxime Ripard static bool check_channel_for_encoder(struct kunit *test,
14576ec18dcSMaxime Ripard 				      const struct drm_atomic_state *state,
14676ec18dcSMaxime Ripard 				      enum vc4_encoder_type type,
14776ec18dcSMaxime Ripard 				      bool (*check_fn)(enum vc4_encoder_type type, unsigned int channel))
14876ec18dcSMaxime Ripard {
14976ec18dcSMaxime Ripard 	struct vc4_crtc_state *new_vc4_crtc_state;
15076ec18dcSMaxime Ripard 	struct vc4_hvs_state *new_hvs_state;
15176ec18dcSMaxime Ripard 	unsigned int channel;
15276ec18dcSMaxime Ripard 
15376ec18dcSMaxime Ripard 	new_hvs_state = vc4_hvs_get_new_global_state(state);
15476ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_hvs_state);
15576ec18dcSMaxime Ripard 
15676ec18dcSMaxime Ripard 	new_vc4_crtc_state = get_vc4_crtc_state_for_encoder(test, state, type);
15776ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_NULL(test, new_vc4_crtc_state);
15876ec18dcSMaxime Ripard 
15976ec18dcSMaxime Ripard 	channel = new_vc4_crtc_state->assigned_channel;
16076ec18dcSMaxime Ripard 	KUNIT_EXPECT_NE(test, channel, VC4_HVS_CHANNEL_DISABLED);
16176ec18dcSMaxime Ripard 
16276ec18dcSMaxime Ripard 	KUNIT_EXPECT_TRUE(test, new_hvs_state->fifo_state[channel].in_use);
16376ec18dcSMaxime Ripard 
16476ec18dcSMaxime Ripard 	KUNIT_EXPECT_TRUE(test, check_fn(type, channel));
16576ec18dcSMaxime Ripard 
16676ec18dcSMaxime Ripard 	return true;
16776ec18dcSMaxime Ripard }
16876ec18dcSMaxime Ripard 
16976ec18dcSMaxime Ripard struct pv_muxing_param {
17076ec18dcSMaxime Ripard 	const char *name;
17176ec18dcSMaxime Ripard 	struct vc4_dev *(*mock_fn)(struct kunit *test);
17276ec18dcSMaxime Ripard 	bool (*check_fn)(enum vc4_encoder_type type, unsigned int channel);
17376ec18dcSMaxime Ripard 	enum vc4_encoder_type *encoders;
17476ec18dcSMaxime Ripard 	size_t nencoders;
17576ec18dcSMaxime Ripard };
17676ec18dcSMaxime Ripard 
vc4_test_pv_muxing_desc(const struct pv_muxing_param * t,char * desc)17776ec18dcSMaxime Ripard static void vc4_test_pv_muxing_desc(const struct pv_muxing_param *t, char *desc)
17876ec18dcSMaxime Ripard {
17976ec18dcSMaxime Ripard 	strscpy(desc, t->name, KUNIT_PARAM_DESC_SIZE);
18076ec18dcSMaxime Ripard }
18176ec18dcSMaxime Ripard 
18276ec18dcSMaxime Ripard #define PV_MUXING_TEST(_name, _mock_fn, _check_fn, ...)					\
18376ec18dcSMaxime Ripard 	{										\
18476ec18dcSMaxime Ripard 		.name = _name,								\
18576ec18dcSMaxime Ripard 		.mock_fn = &_mock_fn,							\
18676ec18dcSMaxime Ripard 		.check_fn = &_check_fn,							\
18776ec18dcSMaxime Ripard 		.encoders = (enum vc4_encoder_type[]) { __VA_ARGS__ },			\
18876ec18dcSMaxime Ripard 		.nencoders = sizeof((enum vc4_encoder_type[]) { __VA_ARGS__ }) /	\
18976ec18dcSMaxime Ripard 			     sizeof(enum vc4_encoder_type),				\
19076ec18dcSMaxime Ripard 	}
19176ec18dcSMaxime Ripard 
19276ec18dcSMaxime Ripard #define VC4_PV_MUXING_TEST(_name, ...)		\
19376ec18dcSMaxime Ripard 	PV_MUXING_TEST(_name, vc4_mock_device, check_vc4_encoder_constraints, __VA_ARGS__)
19476ec18dcSMaxime Ripard 
19576ec18dcSMaxime Ripard #define VC5_PV_MUXING_TEST(_name, ...)		\
19676ec18dcSMaxime Ripard 	PV_MUXING_TEST(_name, vc5_mock_device, check_vc5_encoder_constraints, __VA_ARGS__)
19776ec18dcSMaxime Ripard 
19876ec18dcSMaxime Ripard static const struct pv_muxing_param vc4_test_pv_muxing_params[] = {
19976ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("1 output: DSI0",
20076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0),
20176ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("1 output: DPI",
20276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI),
20376ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("1 output: HDMI0",
20476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
20576ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("1 output: VEC",
20676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC),
20776ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("1 output: DSI1",
20876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
20976ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("1 output: TXP",
21076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP),
21176ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("2 outputs: DSI0, HDMI0",
21276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
21376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
21476ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("2 outputs: DSI0, VEC",
21576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
21676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC),
21776ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("2 outputs: DSI0, DSI1",
21876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
21976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
22076ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("2 outputs: DSI0, TXP",
22176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
22276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP),
22376ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("2 outputs: DPI, HDMI0",
22476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
22576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
22676ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("2 outputs: DPI, VEC",
22776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
22876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC),
22976ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("2 outputs: DPI, DSI1",
23076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
23176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
23276ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("2 outputs: DPI, TXP",
23376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
23476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP),
23576ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("2 outputs: HDMI0, DSI1",
23676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
23776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
23876ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("2 outputs: HDMI0, TXP",
23976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
24076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP),
24176ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("2 outputs: VEC, DSI1",
24276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
24376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
24476ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("2 outputs: VEC, TXP",
24576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
24676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP),
24776ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("3 outputs: DSI0, HDMI0, DSI1",
24876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
24976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
25076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
25176ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("3 outputs: DSI0, HDMI0, TXP",
25276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
25376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
25476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP),
25576ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("3 outputs: DSI0, VEC, DSI1",
25676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
25776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
25876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
25976ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("3 outputs: DSI0, VEC, TXP",
26076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
26176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
26276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP),
26376ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("3 outputs: DPI, HDMI0, DSI1",
26476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
26576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
26676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
26776ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("3 outputs: DPI, HDMI0, TXP",
26876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
26976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
27076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP),
27176ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("3 outputs: DPI, VEC, DSI1",
27276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
27376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
27476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
27576ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("3 outputs: DPI, VEC, TXP",
27676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
27776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
27876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP),
27976ec18dcSMaxime Ripard };
28076ec18dcSMaxime Ripard 
28176ec18dcSMaxime Ripard KUNIT_ARRAY_PARAM(vc4_test_pv_muxing,
28276ec18dcSMaxime Ripard 		  vc4_test_pv_muxing_params,
28376ec18dcSMaxime Ripard 		  vc4_test_pv_muxing_desc);
28476ec18dcSMaxime Ripard 
28576ec18dcSMaxime Ripard static const struct pv_muxing_param vc4_test_pv_muxing_invalid_params[] = {
28676ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("DPI/DSI0 Conflict",
28776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
28876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0),
28976ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("TXP/DSI1 Conflict",
29076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
29176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
29276ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("HDMI0/VEC Conflict",
29376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
29476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC),
29576ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("More than 3 outputs: DSI0, HDMI0, DSI1, TXP",
29676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
29776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
29876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
29976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP),
30076ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("More than 3 outputs: DSI0, VEC, DSI1, TXP",
30176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
30276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
30376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
30476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP),
30576ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("More than 3 outputs: DPI, HDMI0, DSI1, TXP",
30676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
30776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
30876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
30976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP),
31076ec18dcSMaxime Ripard 	VC4_PV_MUXING_TEST("More than 3 outputs: DPI, VEC, DSI1, TXP",
31176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
31276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
31376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
31476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP),
31576ec18dcSMaxime Ripard };
31676ec18dcSMaxime Ripard 
31776ec18dcSMaxime Ripard KUNIT_ARRAY_PARAM(vc4_test_pv_muxing_invalid,
31876ec18dcSMaxime Ripard 		  vc4_test_pv_muxing_invalid_params,
31976ec18dcSMaxime Ripard 		  vc4_test_pv_muxing_desc);
32076ec18dcSMaxime Ripard 
32176ec18dcSMaxime Ripard static const struct pv_muxing_param vc5_test_pv_muxing_params[] = {
32276ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("1 output: DPI",
32376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI),
32476ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("1 output: DSI0",
32576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0),
32676ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("1 output: DSI1",
32776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
32876ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("1 output: HDMI0",
32976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
33076ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("1 output: HDMI1",
33176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
33276ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("1 output: VEC",
33376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC),
33476ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: DPI, DSI1",
33576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
33676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
33776ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: DPI, HDMI0",
33876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
33976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
34076ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: DPI, HDMI1",
34176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
34276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
34376ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: DPI, TXP",
34476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
34576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP),
34676ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: DPI, VEC",
34776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
34876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC),
34976ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: DPI, DSI1",
35076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
35176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
35276ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: DSI0, DSI1",
35376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
35476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
35576ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: DSI0, HDMI0",
35676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
35776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
35876ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: DSI0, HDMI1",
35976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
36076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
36176ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: DSI0, TXP",
36276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
36376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP),
36476ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: DSI0, VEC",
36576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
36676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC),
36776ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: DSI0, DSI1",
36876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
36976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
37076ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: DSI1, VEC",
37176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
37276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC),
37376ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: DSI1, TXP",
37476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
37576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP),
37676ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: DSI1, HDMI0",
37776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
37876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
37976ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: DSI1, HDMI1",
38076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
38176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
38276ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: HDMI0, VEC",
38376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
38476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC),
38576ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: HDMI0, TXP",
38676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
38776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP),
38876ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: HDMI0, HDMI1",
38976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
39076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
39176ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: HDMI1, VEC",
39276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1,
39376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC),
39476ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: HDMI1, TXP",
39576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1,
39676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP),
39776ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("2 outputs: TXP, VEC",
39876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
39976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC),
40076ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("3 outputs: DPI, VEC, TXP",
40176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
40276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
40376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP),
40476ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("3 outputs: DPI, VEC, DSI1",
40576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
40676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
40776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
40876ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("3 outputs: DPI, VEC, HDMI0",
40976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
41076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
41176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
41276ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("3 outputs: DPI, VEC, HDMI1",
41376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
41476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
41576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
41676ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("3 outputs: DPI, TXP, DSI1",
41776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
41876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
41976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
42076ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("3 outputs: DPI, TXP, HDMI0",
42176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
42276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
42376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
42476ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("3 outputs: DPI, TXP, HDMI1",
42576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
42676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
42776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
42876ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("3 outputs: DPI, DSI1, HDMI0",
42976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
43076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
43176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
43276ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("3 outputs: DPI, DSI1, HDMI1",
43376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
43476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
43576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
43676ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("3 outputs: DPI, HDMI0, HDMI1",
43776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
43876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
43976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
44076ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("3 outputs: DSI0, VEC, TXP",
44176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
44276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
44376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP),
44476ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("3 outputs: DSI0, VEC, DSI1",
44576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
44676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
44776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
44876ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("3 outputs: DSI0, VEC, HDMI0",
44976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
45076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
45176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
45276ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("3 outputs: DSI0, VEC, HDMI1",
45376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
45476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
45576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
45676ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("3 outputs: DSI0, TXP, DSI1",
45776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
45876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
45976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
46076ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("3 outputs: DSI0, TXP, HDMI0",
46176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
46276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
46376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
46476ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("3 outputs: DSI0, TXP, HDMI1",
46576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
46676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
46776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
46876ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("3 outputs: DSI0, DSI1, HDMI0",
46976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
47076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
47176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
47276ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("3 outputs: DSI0, DSI1, HDMI1",
47376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
47476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
47576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
47676ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("3 outputs: DSI0, HDMI0, HDMI1",
47776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
47876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
47976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
48076ec18dcSMaxime Ripard };
48176ec18dcSMaxime Ripard 
48276ec18dcSMaxime Ripard KUNIT_ARRAY_PARAM(vc5_test_pv_muxing,
48376ec18dcSMaxime Ripard 		  vc5_test_pv_muxing_params,
48476ec18dcSMaxime Ripard 		  vc4_test_pv_muxing_desc);
48576ec18dcSMaxime Ripard 
48676ec18dcSMaxime Ripard static const struct pv_muxing_param vc5_test_pv_muxing_invalid_params[] = {
48776ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("DPI/DSI0 Conflict",
48876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
48976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0),
49076ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DPI, VEC, TXP, DSI1",
49176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
49276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
49376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
49476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
49576ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DPI, VEC, TXP, HDMI0",
49676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
49776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
49876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
49976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
50076ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DPI, VEC, TXP, HDMI1",
50176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
50276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
50376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
50476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
50576ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DPI, VEC, DSI1, HDMI0",
50676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
50776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
50876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
50976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
51076ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DPI, VEC, DSI1, HDMI1",
51176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
51276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
51376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
51476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
51576ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DPI, VEC, HDMI0, HDMI1",
51676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
51776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
51876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
51976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
52076ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DPI, TXP, DSI1, HDMI0",
52176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
52276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
52376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
52476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
52576ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DPI, TXP, DSI1, HDMI1",
52676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
52776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
52876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
52976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
53076ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DPI, TXP, HDMI0, HDMI1",
53176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
53276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
53376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
53476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
53576ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DPI, DSI1, HDMI0, HDMI1",
53676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
53776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
53876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
53976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
54076ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DPI, VEC, TXP, DSI1, HDMI0",
54176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
54276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
54376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
54476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
54576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
54676ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DPI, VEC, TXP, DSI1, HDMI1",
54776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
54876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
54976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
55076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
55176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
55276ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DPI, VEC, TXP, HDMI0, HDMI1",
55376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
55476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
55576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
55676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
55776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
55876ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DPI, VEC, DSI1, HDMI0, HDMI1",
55976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
56076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
56176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
56276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
56376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
56476ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DPI, TXP, DSI1, HDMI0, HDMI1",
56576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
56676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
56776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
56876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
56976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
57076ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DSI0, VEC, TXP, DSI1",
57176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
57276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
57376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
57476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1),
57576ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DSI0, VEC, TXP, HDMI0",
57676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
57776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
57876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
57976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
58076ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DSI0, VEC, TXP, HDMI1",
58176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
58276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
58376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
58476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
58576ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DSI0, VEC, DSI1, HDMI0",
58676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
58776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
58876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
58976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
59076ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DSI0, VEC, DSI1, HDMI1",
59176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
59276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
59376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
59476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
59576ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DSI0, VEC, HDMI0, HDMI1",
59676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
59776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
59876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
59976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
60076ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DSI0, TXP, DSI1, HDMI0",
60176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
60276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
60376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
60476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
60576ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DSI0, TXP, DSI1, HDMI1",
60676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
60776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
60876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
60976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
61076ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DSI0, TXP, HDMI0, HDMI1",
61176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
61276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
61376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
61476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
61576ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DSI0, DSI1, HDMI0, HDMI1",
61676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
61776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
61876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
61976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
62076ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DSI0, VEC, TXP, DSI1, HDMI0",
62176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
62276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
62376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
62476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
62576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0),
62676ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DSI0, VEC, TXP, DSI1, HDMI1",
62776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
62876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
62976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
63076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
63176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
63276ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DSI0, VEC, TXP, HDMI0, HDMI1",
63376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
63476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
63576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
63676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
63776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
63876ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DSI0, VEC, DSI1, HDMI0, HDMI1",
63976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
64076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
64176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
64276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
64376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
64476ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DSI0, TXP, DSI1, HDMI0, HDMI1",
64576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
64676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
64776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
64876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
64976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
65076ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: VEC, TXP, DSI1, HDMI0, HDMI1",
65176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
65276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
65376ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
65476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
65576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
65676ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DPI, VEC, TXP, DSI1, HDMI0, HDMI1",
65776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DPI,
65876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
65976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
66076ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
66176ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
66276ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
66376ec18dcSMaxime Ripard 	VC5_PV_MUXING_TEST("More than 3 outputs: DSI0, VEC, TXP, DSI1, HDMI0, HDMI1",
66476ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI0,
66576ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_VEC,
66676ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_TXP,
66776ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_DSI1,
66876ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI0,
66976ec18dcSMaxime Ripard 			   VC4_ENCODER_TYPE_HDMI1),
67076ec18dcSMaxime Ripard };
67176ec18dcSMaxime Ripard 
67276ec18dcSMaxime Ripard KUNIT_ARRAY_PARAM(vc5_test_pv_muxing_invalid,
67376ec18dcSMaxime Ripard 		  vc5_test_pv_muxing_invalid_params,
67476ec18dcSMaxime Ripard 		  vc4_test_pv_muxing_desc);
67576ec18dcSMaxime Ripard 
drm_vc4_test_pv_muxing(struct kunit * test)67676ec18dcSMaxime Ripard static void drm_vc4_test_pv_muxing(struct kunit *test)
67776ec18dcSMaxime Ripard {
67876ec18dcSMaxime Ripard 	const struct pv_muxing_param *params = test->param_value;
67976ec18dcSMaxime Ripard 	const struct pv_muxing_priv *priv = test->priv;
68076ec18dcSMaxime Ripard 	struct drm_atomic_state *state = priv->state;
68176ec18dcSMaxime Ripard 	unsigned int i;
68276ec18dcSMaxime Ripard 	int ret;
68376ec18dcSMaxime Ripard 
68476ec18dcSMaxime Ripard 	for (i = 0; i < params->nencoders; i++) {
68576ec18dcSMaxime Ripard 		enum vc4_encoder_type enc_type = params->encoders[i];
68676ec18dcSMaxime Ripard 
68776ec18dcSMaxime Ripard 		ret = vc4_mock_atomic_add_output(test, state, enc_type);
68876ec18dcSMaxime Ripard 		KUNIT_ASSERT_EQ(test, ret, 0);
68976ec18dcSMaxime Ripard 	}
69076ec18dcSMaxime Ripard 
69176ec18dcSMaxime Ripard 	ret = drm_atomic_check_only(state);
69276ec18dcSMaxime Ripard 	KUNIT_EXPECT_EQ(test, ret, 0);
69376ec18dcSMaxime Ripard 
69476ec18dcSMaxime Ripard 	KUNIT_EXPECT_TRUE(test,
69576ec18dcSMaxime Ripard 			  check_fifo_conflict(test, state));
69676ec18dcSMaxime Ripard 
69776ec18dcSMaxime Ripard 	for (i = 0; i < params->nencoders; i++) {
69876ec18dcSMaxime Ripard 		enum vc4_encoder_type enc_type = params->encoders[i];
69976ec18dcSMaxime Ripard 
70076ec18dcSMaxime Ripard 		KUNIT_EXPECT_TRUE(test, check_channel_for_encoder(test, state, enc_type,
70176ec18dcSMaxime Ripard 								  params->check_fn));
70276ec18dcSMaxime Ripard 	}
70376ec18dcSMaxime Ripard }
70476ec18dcSMaxime Ripard 
drm_vc4_test_pv_muxing_invalid(struct kunit * test)70576ec18dcSMaxime Ripard static void drm_vc4_test_pv_muxing_invalid(struct kunit *test)
70676ec18dcSMaxime Ripard {
70776ec18dcSMaxime Ripard 	const struct pv_muxing_param *params = test->param_value;
70876ec18dcSMaxime Ripard 	const struct pv_muxing_priv *priv = test->priv;
70976ec18dcSMaxime Ripard 	struct drm_atomic_state *state = priv->state;
71076ec18dcSMaxime Ripard 	unsigned int i;
71176ec18dcSMaxime Ripard 	int ret;
71276ec18dcSMaxime Ripard 
71376ec18dcSMaxime Ripard 	for (i = 0; i < params->nencoders; i++) {
71476ec18dcSMaxime Ripard 		enum vc4_encoder_type enc_type = params->encoders[i];
71576ec18dcSMaxime Ripard 
71676ec18dcSMaxime Ripard 		ret = vc4_mock_atomic_add_output(test, state, enc_type);
71776ec18dcSMaxime Ripard 		KUNIT_ASSERT_EQ(test, ret, 0);
71876ec18dcSMaxime Ripard 	}
71976ec18dcSMaxime Ripard 
72076ec18dcSMaxime Ripard 	ret = drm_atomic_check_only(state);
72176ec18dcSMaxime Ripard 	KUNIT_EXPECT_LT(test, ret, 0);
72276ec18dcSMaxime Ripard }
72376ec18dcSMaxime Ripard 
vc4_pv_muxing_test_init(struct kunit * test)72476ec18dcSMaxime Ripard static int vc4_pv_muxing_test_init(struct kunit *test)
72576ec18dcSMaxime Ripard {
72676ec18dcSMaxime Ripard 	const struct pv_muxing_param *params = test->param_value;
72755ab5e60SMaxime Ripard 	struct drm_modeset_acquire_ctx *ctx;
72876ec18dcSMaxime Ripard 	struct pv_muxing_priv *priv;
72976ec18dcSMaxime Ripard 	struct drm_device *drm;
73076ec18dcSMaxime Ripard 	struct vc4_dev *vc4;
73176ec18dcSMaxime Ripard 
73276ec18dcSMaxime Ripard 	priv = kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL);
73376ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_NULL(test, priv);
73476ec18dcSMaxime Ripard 	test->priv = priv;
73576ec18dcSMaxime Ripard 
73676ec18dcSMaxime Ripard 	vc4 = params->mock_fn(test);
73776ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, vc4);
73876ec18dcSMaxime Ripard 	priv->vc4 = vc4;
73976ec18dcSMaxime Ripard 
74055ab5e60SMaxime Ripard 	ctx = drm_kunit_helper_acquire_ctx_alloc(test);
74155ab5e60SMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx);
74276ec18dcSMaxime Ripard 
74376ec18dcSMaxime Ripard 	drm = &vc4->base;
7441ef726c8SMaxime Ripard 	priv->state = drm_kunit_helper_atomic_state_alloc(test, drm, ctx);
7451ef726c8SMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->state);
74676ec18dcSMaxime Ripard 
74776ec18dcSMaxime Ripard 	return 0;
74876ec18dcSMaxime Ripard }
74976ec18dcSMaxime Ripard 
75076ec18dcSMaxime Ripard static struct kunit_case vc4_pv_muxing_tests[] = {
75176ec18dcSMaxime Ripard 	KUNIT_CASE_PARAM(drm_vc4_test_pv_muxing,
75276ec18dcSMaxime Ripard 			 vc4_test_pv_muxing_gen_params),
75376ec18dcSMaxime Ripard 	KUNIT_CASE_PARAM(drm_vc4_test_pv_muxing_invalid,
75476ec18dcSMaxime Ripard 			 vc4_test_pv_muxing_invalid_gen_params),
75576ec18dcSMaxime Ripard 	{}
75676ec18dcSMaxime Ripard };
75776ec18dcSMaxime Ripard 
75876ec18dcSMaxime Ripard static struct kunit_suite vc4_pv_muxing_test_suite = {
75976ec18dcSMaxime Ripard 	.name = "vc4-pv-muxing-combinations",
76076ec18dcSMaxime Ripard 	.init = vc4_pv_muxing_test_init,
76176ec18dcSMaxime Ripard 	.test_cases = vc4_pv_muxing_tests,
76276ec18dcSMaxime Ripard };
76376ec18dcSMaxime Ripard 
76476ec18dcSMaxime Ripard static struct kunit_case vc5_pv_muxing_tests[] = {
76576ec18dcSMaxime Ripard 	KUNIT_CASE_PARAM(drm_vc4_test_pv_muxing,
76676ec18dcSMaxime Ripard 			 vc5_test_pv_muxing_gen_params),
76776ec18dcSMaxime Ripard 	KUNIT_CASE_PARAM(drm_vc4_test_pv_muxing_invalid,
76876ec18dcSMaxime Ripard 			 vc5_test_pv_muxing_invalid_gen_params),
76976ec18dcSMaxime Ripard 	{}
77076ec18dcSMaxime Ripard };
77176ec18dcSMaxime Ripard 
77276ec18dcSMaxime Ripard static struct kunit_suite vc5_pv_muxing_test_suite = {
77376ec18dcSMaxime Ripard 	.name = "vc5-pv-muxing-combinations",
77476ec18dcSMaxime Ripard 	.init = vc4_pv_muxing_test_init,
77576ec18dcSMaxime Ripard 	.test_cases = vc5_pv_muxing_tests,
77676ec18dcSMaxime Ripard };
77776ec18dcSMaxime Ripard 
77876ec18dcSMaxime Ripard /* See
77976ec18dcSMaxime Ripard  * https://lore.kernel.org/all/3e113525-aa89-b1e2-56b7-ca55bd41d057@samsung.com/
78076ec18dcSMaxime Ripard  * and
78176ec18dcSMaxime Ripard  * https://lore.kernel.org/dri-devel/20200917121623.42023-1-maxime@cerno.tech/
78276ec18dcSMaxime Ripard  */
drm_test_vc5_pv_muxing_bugs_subsequent_crtc_enable(struct kunit * test)78376ec18dcSMaxime Ripard static void drm_test_vc5_pv_muxing_bugs_subsequent_crtc_enable(struct kunit *test)
78476ec18dcSMaxime Ripard {
78555ab5e60SMaxime Ripard 	struct drm_modeset_acquire_ctx *ctx;
78676ec18dcSMaxime Ripard 	struct drm_atomic_state *state;
78776ec18dcSMaxime Ripard 	struct vc4_crtc_state *new_vc4_crtc_state;
78876ec18dcSMaxime Ripard 	struct vc4_hvs_state *new_hvs_state;
78976ec18dcSMaxime Ripard 	unsigned int hdmi0_channel;
79076ec18dcSMaxime Ripard 	unsigned int hdmi1_channel;
79176ec18dcSMaxime Ripard 	struct drm_device *drm;
79276ec18dcSMaxime Ripard 	struct vc4_dev *vc4;
79376ec18dcSMaxime Ripard 	int ret;
79476ec18dcSMaxime Ripard 
79576ec18dcSMaxime Ripard 	vc4 = vc5_mock_device(test);
79676ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, vc4);
79776ec18dcSMaxime Ripard 
79855ab5e60SMaxime Ripard 	ctx = drm_kunit_helper_acquire_ctx_alloc(test);
79955ab5e60SMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx);
80076ec18dcSMaxime Ripard 
80176ec18dcSMaxime Ripard 	drm = &vc4->base;
8021ef726c8SMaxime Ripard 	state = drm_kunit_helper_atomic_state_alloc(test, drm, ctx);
80376ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state);
80476ec18dcSMaxime Ripard 
80576ec18dcSMaxime Ripard 	ret = vc4_mock_atomic_add_output(test, state, VC4_ENCODER_TYPE_HDMI0);
80676ec18dcSMaxime Ripard 	KUNIT_ASSERT_EQ(test, ret, 0);
80776ec18dcSMaxime Ripard 
80876ec18dcSMaxime Ripard 	ret = drm_atomic_check_only(state);
80976ec18dcSMaxime Ripard 	KUNIT_ASSERT_EQ(test, ret, 0);
81076ec18dcSMaxime Ripard 
81176ec18dcSMaxime Ripard 	new_hvs_state = vc4_hvs_get_new_global_state(state);
81276ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_hvs_state);
81376ec18dcSMaxime Ripard 
81476ec18dcSMaxime Ripard 	new_vc4_crtc_state = get_vc4_crtc_state_for_encoder(test, state,
81576ec18dcSMaxime Ripard 							    VC4_ENCODER_TYPE_HDMI0);
81676ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_NULL(test, new_vc4_crtc_state);
81776ec18dcSMaxime Ripard 
81876ec18dcSMaxime Ripard 	hdmi0_channel = new_vc4_crtc_state->assigned_channel;
81976ec18dcSMaxime Ripard 	KUNIT_ASSERT_NE(test, hdmi0_channel, VC4_HVS_CHANNEL_DISABLED);
82076ec18dcSMaxime Ripard 	KUNIT_ASSERT_TRUE(test, new_hvs_state->fifo_state[hdmi0_channel].in_use);
82176ec18dcSMaxime Ripard 
82276ec18dcSMaxime Ripard 	ret = drm_atomic_helper_swap_state(state, false);
82376ec18dcSMaxime Ripard 	KUNIT_ASSERT_EQ(test, ret, 0);
82476ec18dcSMaxime Ripard 
8251ef726c8SMaxime Ripard 	state = drm_kunit_helper_atomic_state_alloc(test, drm, ctx);
82676ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state);
82776ec18dcSMaxime Ripard 
82876ec18dcSMaxime Ripard 	ret = vc4_mock_atomic_add_output(test, state, VC4_ENCODER_TYPE_HDMI1);
82976ec18dcSMaxime Ripard 	KUNIT_ASSERT_EQ(test, ret, 0);
83076ec18dcSMaxime Ripard 
83176ec18dcSMaxime Ripard 	ret = drm_atomic_check_only(state);
83276ec18dcSMaxime Ripard 	KUNIT_ASSERT_EQ(test, ret, 0);
83376ec18dcSMaxime Ripard 
83476ec18dcSMaxime Ripard 	new_hvs_state = vc4_hvs_get_new_global_state(state);
83576ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_hvs_state);
83676ec18dcSMaxime Ripard 
83776ec18dcSMaxime Ripard 	new_vc4_crtc_state = get_vc4_crtc_state_for_encoder(test, state,
83876ec18dcSMaxime Ripard 							    VC4_ENCODER_TYPE_HDMI1);
83976ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_NULL(test, new_vc4_crtc_state);
84076ec18dcSMaxime Ripard 
84176ec18dcSMaxime Ripard 	hdmi1_channel = new_vc4_crtc_state->assigned_channel;
84276ec18dcSMaxime Ripard 	KUNIT_ASSERT_NE(test, hdmi1_channel, VC4_HVS_CHANNEL_DISABLED);
84376ec18dcSMaxime Ripard 	KUNIT_ASSERT_TRUE(test, new_hvs_state->fifo_state[hdmi1_channel].in_use);
84476ec18dcSMaxime Ripard 
84576ec18dcSMaxime Ripard 	KUNIT_EXPECT_NE(test, hdmi0_channel, hdmi1_channel);
84676ec18dcSMaxime Ripard }
84776ec18dcSMaxime Ripard 
848*b229ea58SMaxime Ripard /*
849*b229ea58SMaxime Ripard  * This test makes sure that we never change the FIFO of an active HVS
850*b229ea58SMaxime Ripard  * channel if we disable a FIFO with a lower index.
851*b229ea58SMaxime Ripard  *
852*b229ea58SMaxime Ripard  * Doing so would result in a FIFO stall and would disrupt an output
853*b229ea58SMaxime Ripard  * supposed to be unaffected by the commit.
854*b229ea58SMaxime Ripard  */
drm_test_vc5_pv_muxing_bugs_stable_fifo(struct kunit * test)85576ec18dcSMaxime Ripard static void drm_test_vc5_pv_muxing_bugs_stable_fifo(struct kunit *test)
85676ec18dcSMaxime Ripard {
85755ab5e60SMaxime Ripard 	struct drm_modeset_acquire_ctx *ctx;
85876ec18dcSMaxime Ripard 	struct drm_atomic_state *state;
85976ec18dcSMaxime Ripard 	struct vc4_crtc_state *new_vc4_crtc_state;
86076ec18dcSMaxime Ripard 	struct vc4_hvs_state *new_hvs_state;
86176ec18dcSMaxime Ripard 	unsigned int old_hdmi0_channel;
86276ec18dcSMaxime Ripard 	unsigned int old_hdmi1_channel;
86376ec18dcSMaxime Ripard 	struct drm_device *drm;
86476ec18dcSMaxime Ripard 	struct vc4_dev *vc4;
86576ec18dcSMaxime Ripard 	int ret;
86676ec18dcSMaxime Ripard 
86776ec18dcSMaxime Ripard 	vc4 = vc5_mock_device(test);
86876ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, vc4);
86976ec18dcSMaxime Ripard 
87055ab5e60SMaxime Ripard 	ctx = drm_kunit_helper_acquire_ctx_alloc(test);
87155ab5e60SMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx);
87276ec18dcSMaxime Ripard 
87376ec18dcSMaxime Ripard 	drm = &vc4->base;
8741ef726c8SMaxime Ripard 	state = drm_kunit_helper_atomic_state_alloc(test, drm, ctx);
87576ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state);
87676ec18dcSMaxime Ripard 
87776ec18dcSMaxime Ripard 	ret = vc4_mock_atomic_add_output(test, state, VC4_ENCODER_TYPE_HDMI0);
87876ec18dcSMaxime Ripard 	KUNIT_ASSERT_EQ(test, ret, 0);
87976ec18dcSMaxime Ripard 
88076ec18dcSMaxime Ripard 	ret = vc4_mock_atomic_add_output(test, state, VC4_ENCODER_TYPE_HDMI1);
88176ec18dcSMaxime Ripard 	KUNIT_ASSERT_EQ(test, ret, 0);
88276ec18dcSMaxime Ripard 
88376ec18dcSMaxime Ripard 	ret = drm_atomic_check_only(state);
88476ec18dcSMaxime Ripard 	KUNIT_ASSERT_EQ(test, ret, 0);
88576ec18dcSMaxime Ripard 
88676ec18dcSMaxime Ripard 	new_hvs_state = vc4_hvs_get_new_global_state(state);
88776ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_hvs_state);
88876ec18dcSMaxime Ripard 
88976ec18dcSMaxime Ripard 	new_vc4_crtc_state = get_vc4_crtc_state_for_encoder(test, state,
89076ec18dcSMaxime Ripard 							    VC4_ENCODER_TYPE_HDMI0);
89176ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_NULL(test, new_vc4_crtc_state);
89276ec18dcSMaxime Ripard 
89376ec18dcSMaxime Ripard 	old_hdmi0_channel = new_vc4_crtc_state->assigned_channel;
89476ec18dcSMaxime Ripard 	KUNIT_ASSERT_NE(test, old_hdmi0_channel, VC4_HVS_CHANNEL_DISABLED);
89576ec18dcSMaxime Ripard 	KUNIT_ASSERT_TRUE(test, new_hvs_state->fifo_state[old_hdmi0_channel].in_use);
89676ec18dcSMaxime Ripard 
89776ec18dcSMaxime Ripard 	new_vc4_crtc_state = get_vc4_crtc_state_for_encoder(test, state,
89876ec18dcSMaxime Ripard 							    VC4_ENCODER_TYPE_HDMI1);
89976ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_NULL(test, new_vc4_crtc_state);
90076ec18dcSMaxime Ripard 
90176ec18dcSMaxime Ripard 	old_hdmi1_channel = new_vc4_crtc_state->assigned_channel;
90276ec18dcSMaxime Ripard 	KUNIT_ASSERT_NE(test, old_hdmi1_channel, VC4_HVS_CHANNEL_DISABLED);
90376ec18dcSMaxime Ripard 	KUNIT_ASSERT_TRUE(test, new_hvs_state->fifo_state[old_hdmi1_channel].in_use);
90476ec18dcSMaxime Ripard 
90576ec18dcSMaxime Ripard 	ret = drm_atomic_helper_swap_state(state, false);
90676ec18dcSMaxime Ripard 	KUNIT_ASSERT_EQ(test, ret, 0);
90776ec18dcSMaxime Ripard 
9081ef726c8SMaxime Ripard 	state = drm_kunit_helper_atomic_state_alloc(test, drm, ctx);
90976ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state);
91076ec18dcSMaxime Ripard 
91176ec18dcSMaxime Ripard 	ret = vc4_mock_atomic_del_output(test, state, VC4_ENCODER_TYPE_HDMI0);
91276ec18dcSMaxime Ripard 	KUNIT_ASSERT_EQ(test, ret, 0);
91376ec18dcSMaxime Ripard 
91476ec18dcSMaxime Ripard 	ret = drm_atomic_check_only(state);
91576ec18dcSMaxime Ripard 	KUNIT_ASSERT_EQ(test, ret, 0);
91676ec18dcSMaxime Ripard 
91776ec18dcSMaxime Ripard 	new_hvs_state = vc4_hvs_get_new_global_state(state);
91876ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_hvs_state);
91976ec18dcSMaxime Ripard 
92076ec18dcSMaxime Ripard 	new_vc4_crtc_state = get_vc4_crtc_state_for_encoder(test, state,
92176ec18dcSMaxime Ripard 							    VC4_ENCODER_TYPE_HDMI1);
92276ec18dcSMaxime Ripard 
92376ec18dcSMaxime Ripard 	if (new_vc4_crtc_state) {
92476ec18dcSMaxime Ripard 		unsigned int hdmi1_channel;
92576ec18dcSMaxime Ripard 
92676ec18dcSMaxime Ripard 		hdmi1_channel = new_vc4_crtc_state->assigned_channel;
92776ec18dcSMaxime Ripard 		KUNIT_ASSERT_NE(test, hdmi1_channel, VC4_HVS_CHANNEL_DISABLED);
92876ec18dcSMaxime Ripard 		KUNIT_ASSERT_TRUE(test, new_hvs_state->fifo_state[hdmi1_channel].in_use);
92976ec18dcSMaxime Ripard 
93076ec18dcSMaxime Ripard 		KUNIT_EXPECT_EQ(test, old_hdmi1_channel, hdmi1_channel);
93176ec18dcSMaxime Ripard 	}
93276ec18dcSMaxime Ripard }
93376ec18dcSMaxime Ripard 
934*b229ea58SMaxime Ripard /*
935*b229ea58SMaxime Ripard  * Test that if we affect a single output, only the CRTC state of that
936*b229ea58SMaxime Ripard  * output will be pulled in the global atomic state.
937*b229ea58SMaxime Ripard  *
938*b229ea58SMaxime Ripard  * This is relevant for two things:
939*b229ea58SMaxime Ripard  *
940*b229ea58SMaxime Ripard  *   - If we don't have that state at all, we are unlikely to affect the
941*b229ea58SMaxime Ripard  *     FIFO muxing. This is somewhat redundant with
942*b229ea58SMaxime Ripard  *     drm_test_vc5_pv_muxing_bugs_stable_fifo()
943*b229ea58SMaxime Ripard  *
944*b229ea58SMaxime Ripard  *   - KMS waits for page flips to occur on all the CRTC found in the
945*b229ea58SMaxime Ripard  *     CRTC state. Since the CRTC is unaffected, we would over-wait, but
946*b229ea58SMaxime Ripard  *     most importantly run into corner cases like waiting on an
947*b229ea58SMaxime Ripard  *     inactive CRTC that never completes.
948*b229ea58SMaxime Ripard  */
94976ec18dcSMaxime Ripard static void
drm_test_vc5_pv_muxing_bugs_subsequent_crtc_enable_too_many_crtc_state(struct kunit * test)95076ec18dcSMaxime Ripard drm_test_vc5_pv_muxing_bugs_subsequent_crtc_enable_too_many_crtc_state(struct kunit *test)
95176ec18dcSMaxime Ripard {
95255ab5e60SMaxime Ripard 	struct drm_modeset_acquire_ctx *ctx;
95376ec18dcSMaxime Ripard 	struct drm_atomic_state *state;
95476ec18dcSMaxime Ripard 	struct vc4_crtc_state *new_vc4_crtc_state;
95576ec18dcSMaxime Ripard 	struct drm_device *drm;
95676ec18dcSMaxime Ripard 	struct vc4_dev *vc4;
95776ec18dcSMaxime Ripard 	int ret;
95876ec18dcSMaxime Ripard 
95976ec18dcSMaxime Ripard 	vc4 = vc5_mock_device(test);
96076ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, vc4);
96176ec18dcSMaxime Ripard 
96255ab5e60SMaxime Ripard 	ctx = drm_kunit_helper_acquire_ctx_alloc(test);
96355ab5e60SMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx);
96476ec18dcSMaxime Ripard 
96576ec18dcSMaxime Ripard 	drm = &vc4->base;
9661ef726c8SMaxime Ripard 	state = drm_kunit_helper_atomic_state_alloc(test, drm, ctx);
96776ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state);
96876ec18dcSMaxime Ripard 
96976ec18dcSMaxime Ripard 	ret = vc4_mock_atomic_add_output(test, state, VC4_ENCODER_TYPE_HDMI0);
97076ec18dcSMaxime Ripard 	KUNIT_ASSERT_EQ(test, ret, 0);
97176ec18dcSMaxime Ripard 
97276ec18dcSMaxime Ripard 	ret = drm_atomic_check_only(state);
97376ec18dcSMaxime Ripard 	KUNIT_ASSERT_EQ(test, ret, 0);
97476ec18dcSMaxime Ripard 
97576ec18dcSMaxime Ripard 	ret = drm_atomic_helper_swap_state(state, false);
97676ec18dcSMaxime Ripard 	KUNIT_ASSERT_EQ(test, ret, 0);
97776ec18dcSMaxime Ripard 
9781ef726c8SMaxime Ripard 	state = drm_kunit_helper_atomic_state_alloc(test, drm, ctx);
97976ec18dcSMaxime Ripard 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state);
98076ec18dcSMaxime Ripard 
98176ec18dcSMaxime Ripard 	ret = vc4_mock_atomic_add_output(test, state, VC4_ENCODER_TYPE_HDMI1);
98276ec18dcSMaxime Ripard 	KUNIT_ASSERT_EQ(test, ret, 0);
98376ec18dcSMaxime Ripard 
98476ec18dcSMaxime Ripard 	ret = drm_atomic_check_only(state);
98576ec18dcSMaxime Ripard 	KUNIT_ASSERT_EQ(test, ret, 0);
98676ec18dcSMaxime Ripard 
98776ec18dcSMaxime Ripard 	new_vc4_crtc_state = get_vc4_crtc_state_for_encoder(test, state,
98876ec18dcSMaxime Ripard 							    VC4_ENCODER_TYPE_HDMI0);
98976ec18dcSMaxime Ripard 	KUNIT_EXPECT_NULL(test, new_vc4_crtc_state);
99076ec18dcSMaxime Ripard }
99176ec18dcSMaxime Ripard 
99276ec18dcSMaxime Ripard static struct kunit_case vc5_pv_muxing_bugs_tests[] = {
99376ec18dcSMaxime Ripard 	KUNIT_CASE(drm_test_vc5_pv_muxing_bugs_subsequent_crtc_enable),
99476ec18dcSMaxime Ripard 	KUNIT_CASE(drm_test_vc5_pv_muxing_bugs_subsequent_crtc_enable_too_many_crtc_state),
99576ec18dcSMaxime Ripard 	KUNIT_CASE(drm_test_vc5_pv_muxing_bugs_stable_fifo),
99676ec18dcSMaxime Ripard 	{}
99776ec18dcSMaxime Ripard };
99876ec18dcSMaxime Ripard 
99976ec18dcSMaxime Ripard static struct kunit_suite vc5_pv_muxing_bugs_test_suite = {
100076ec18dcSMaxime Ripard 	.name = "vc5-pv-muxing-bugs",
100176ec18dcSMaxime Ripard 	.test_cases = vc5_pv_muxing_bugs_tests,
100276ec18dcSMaxime Ripard };
100376ec18dcSMaxime Ripard 
100476ec18dcSMaxime Ripard kunit_test_suites(
100576ec18dcSMaxime Ripard 	&vc4_pv_muxing_test_suite,
100676ec18dcSMaxime Ripard 	&vc5_pv_muxing_test_suite,
100776ec18dcSMaxime Ripard 	&vc5_pv_muxing_bugs_test_suite
100876ec18dcSMaxime Ripard );
1009