mirror of
https://github.com/torvalds/linux.git
synced 2026-04-19 23:34:00 -04:00
drm/vkms: Allow to attach encoders and CRTCs
Add a list of possible CRTCs to the encoder configuration and helpers to attach and detach them. Now that the default configuration has its encoder and CRTC correctly attached, configure the output following the configuration. Reviewed-by: Louis Chauvet <louis.chauvet@bootlin.com> Co-developed-by: Louis Chauvet <louis.chauvet@bootlin.com> Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com> Signed-off-by: José Expósito <jose.exposito89@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/20250218101214.5790-13-jose.exposito89@gmail.com Signed-off-by: Maxime Ripard <mripard@kernel.org>
This commit is contained in:
committed by
Maxime Ripard
parent
f60a183dc9
commit
b8776fc9b2
@@ -312,6 +312,7 @@ static void vkms_config_test_valid_plane_type(struct kunit *test)
|
||||
struct vkms_config *config;
|
||||
struct vkms_config_plane *plane_cfg;
|
||||
struct vkms_config_crtc *crtc_cfg;
|
||||
struct vkms_config_encoder *encoder_cfg;
|
||||
int err;
|
||||
|
||||
config = vkms_config_default_create(false, false, false);
|
||||
@@ -365,6 +366,9 @@ static void vkms_config_test_valid_plane_type(struct kunit *test)
|
||||
|
||||
/* Invalid: Second CRTC without primary plane */
|
||||
crtc_cfg = vkms_config_create_crtc(config);
|
||||
encoder_cfg = vkms_config_create_encoder(config);
|
||||
err = vkms_config_encoder_attach_crtc(encoder_cfg, crtc_cfg);
|
||||
KUNIT_EXPECT_EQ(test, err, 0);
|
||||
KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
|
||||
|
||||
/* Valid: Second CRTC with a primary plane */
|
||||
@@ -442,11 +446,57 @@ static void vkms_config_test_invalid_encoder_number(struct kunit *test)
|
||||
vkms_config_destroy(config);
|
||||
}
|
||||
|
||||
static void vkms_config_test_valid_encoder_possible_crtcs(struct kunit *test)
|
||||
{
|
||||
struct vkms_config *config;
|
||||
struct vkms_config_plane *plane_cfg;
|
||||
struct vkms_config_crtc *crtc_cfg1, *crtc_cfg2;
|
||||
struct vkms_config_encoder *encoder_cfg;
|
||||
int err;
|
||||
|
||||
config = vkms_config_default_create(false, false, false);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
|
||||
|
||||
crtc_cfg1 = get_first_crtc(config);
|
||||
|
||||
/* Invalid: Encoder without a possible CRTC */
|
||||
encoder_cfg = vkms_config_create_encoder(config);
|
||||
KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
|
||||
|
||||
/* Valid: Second CRTC with shared encoder */
|
||||
crtc_cfg2 = vkms_config_create_crtc(config);
|
||||
|
||||
plane_cfg = vkms_config_create_plane(config);
|
||||
vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY);
|
||||
err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg2);
|
||||
KUNIT_EXPECT_EQ(test, err, 0);
|
||||
|
||||
err = vkms_config_encoder_attach_crtc(encoder_cfg, crtc_cfg1);
|
||||
KUNIT_EXPECT_EQ(test, err, 0);
|
||||
|
||||
err = vkms_config_encoder_attach_crtc(encoder_cfg, crtc_cfg2);
|
||||
KUNIT_EXPECT_EQ(test, err, 0);
|
||||
|
||||
KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config));
|
||||
|
||||
/* Invalid: Second CRTC without encoders */
|
||||
vkms_config_encoder_detach_crtc(encoder_cfg, crtc_cfg2);
|
||||
KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
|
||||
|
||||
/* Valid: First CRTC with 2 possible encoder */
|
||||
vkms_config_destroy_plane(plane_cfg);
|
||||
vkms_config_destroy_crtc(config, crtc_cfg2);
|
||||
KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config));
|
||||
|
||||
vkms_config_destroy(config);
|
||||
}
|
||||
|
||||
static void vkms_config_test_attach_different_configs(struct kunit *test)
|
||||
{
|
||||
struct vkms_config *config1, *config2;
|
||||
struct vkms_config_plane *plane_cfg1, *plane_cfg2;
|
||||
struct vkms_config_crtc *crtc_cfg1, *crtc_cfg2;
|
||||
struct vkms_config_encoder *encoder_cfg1, *encoder_cfg2;
|
||||
int err;
|
||||
|
||||
config1 = vkms_config_create("test1");
|
||||
@@ -457,20 +507,29 @@ static void vkms_config_test_attach_different_configs(struct kunit *test)
|
||||
|
||||
plane_cfg1 = vkms_config_create_plane(config1);
|
||||
crtc_cfg1 = vkms_config_create_crtc(config1);
|
||||
encoder_cfg1 = vkms_config_create_encoder(config1);
|
||||
|
||||
plane_cfg2 = vkms_config_create_plane(config2);
|
||||
crtc_cfg2 = vkms_config_create_crtc(config2);
|
||||
encoder_cfg2 = vkms_config_create_encoder(config2);
|
||||
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg1);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg2);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg1);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg2);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder_cfg1);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder_cfg2);
|
||||
|
||||
err = vkms_config_plane_attach_crtc(plane_cfg1, crtc_cfg2);
|
||||
KUNIT_EXPECT_NE(test, err, 0);
|
||||
err = vkms_config_plane_attach_crtc(plane_cfg2, crtc_cfg1);
|
||||
KUNIT_EXPECT_NE(test, err, 0);
|
||||
|
||||
err = vkms_config_encoder_attach_crtc(encoder_cfg1, crtc_cfg2);
|
||||
KUNIT_EXPECT_NE(test, err, 0);
|
||||
err = vkms_config_encoder_attach_crtc(encoder_cfg2, crtc_cfg1);
|
||||
KUNIT_EXPECT_NE(test, err, 0);
|
||||
|
||||
vkms_config_destroy(config1);
|
||||
vkms_config_destroy(config2);
|
||||
}
|
||||
@@ -600,6 +659,70 @@ static void vkms_config_test_plane_get_possible_crtcs(struct kunit *test)
|
||||
vkms_config_destroy(config);
|
||||
}
|
||||
|
||||
static void vkms_config_test_encoder_get_possible_crtcs(struct kunit *test)
|
||||
{
|
||||
struct vkms_config *config;
|
||||
struct vkms_config_encoder *encoder_cfg1, *encoder_cfg2;
|
||||
struct vkms_config_crtc *crtc_cfg1, *crtc_cfg2;
|
||||
struct vkms_config_crtc *possible_crtc;
|
||||
unsigned long idx = 0;
|
||||
int n_crtcs = 0;
|
||||
int err;
|
||||
|
||||
config = vkms_config_create("test");
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
|
||||
|
||||
encoder_cfg1 = vkms_config_create_encoder(config);
|
||||
encoder_cfg2 = vkms_config_create_encoder(config);
|
||||
crtc_cfg1 = vkms_config_create_crtc(config);
|
||||
crtc_cfg2 = vkms_config_create_crtc(config);
|
||||
|
||||
/* No possible CRTCs */
|
||||
vkms_config_encoder_for_each_possible_crtc(encoder_cfg1, idx, possible_crtc)
|
||||
KUNIT_FAIL(test, "Unexpected possible CRTC");
|
||||
|
||||
vkms_config_encoder_for_each_possible_crtc(encoder_cfg2, idx, possible_crtc)
|
||||
KUNIT_FAIL(test, "Unexpected possible CRTC");
|
||||
|
||||
/* Encoder 1 attached to CRTC 1 and 2 */
|
||||
err = vkms_config_encoder_attach_crtc(encoder_cfg1, crtc_cfg1);
|
||||
KUNIT_EXPECT_EQ(test, err, 0);
|
||||
err = vkms_config_encoder_attach_crtc(encoder_cfg1, crtc_cfg2);
|
||||
KUNIT_EXPECT_EQ(test, err, 0);
|
||||
|
||||
vkms_config_encoder_for_each_possible_crtc(encoder_cfg1, idx, possible_crtc) {
|
||||
n_crtcs++;
|
||||
if (possible_crtc != crtc_cfg1 && possible_crtc != crtc_cfg2)
|
||||
KUNIT_FAIL(test, "Unexpected possible CRTC");
|
||||
}
|
||||
KUNIT_ASSERT_EQ(test, n_crtcs, 2);
|
||||
n_crtcs = 0;
|
||||
|
||||
vkms_config_encoder_for_each_possible_crtc(encoder_cfg2, idx, possible_crtc)
|
||||
KUNIT_FAIL(test, "Unexpected possible CRTC");
|
||||
|
||||
/* Encoder 1 attached to CRTC 1 and encoder 2 to CRTC 2 */
|
||||
vkms_config_encoder_detach_crtc(encoder_cfg1, crtc_cfg2);
|
||||
vkms_config_encoder_for_each_possible_crtc(encoder_cfg1, idx, possible_crtc) {
|
||||
n_crtcs++;
|
||||
if (possible_crtc != crtc_cfg1)
|
||||
KUNIT_FAIL(test, "Unexpected possible CRTC");
|
||||
}
|
||||
KUNIT_ASSERT_EQ(test, n_crtcs, 1);
|
||||
n_crtcs = 0;
|
||||
|
||||
err = vkms_config_encoder_attach_crtc(encoder_cfg2, crtc_cfg2);
|
||||
KUNIT_EXPECT_EQ(test, err, 0);
|
||||
vkms_config_encoder_for_each_possible_crtc(encoder_cfg2, idx, possible_crtc) {
|
||||
n_crtcs++;
|
||||
if (possible_crtc != crtc_cfg2)
|
||||
KUNIT_FAIL(test, "Unexpected possible CRTC");
|
||||
}
|
||||
KUNIT_ASSERT_EQ(test, n_crtcs, 1);
|
||||
|
||||
vkms_config_destroy(config);
|
||||
}
|
||||
|
||||
static struct kunit_case vkms_config_test_cases[] = {
|
||||
KUNIT_CASE(vkms_config_test_empty_config),
|
||||
KUNIT_CASE_PARAM(vkms_config_test_default_config,
|
||||
@@ -612,9 +735,11 @@ static struct kunit_case vkms_config_test_cases[] = {
|
||||
KUNIT_CASE(vkms_config_test_valid_plane_possible_crtcs),
|
||||
KUNIT_CASE(vkms_config_test_invalid_crtc_number),
|
||||
KUNIT_CASE(vkms_config_test_invalid_encoder_number),
|
||||
KUNIT_CASE(vkms_config_test_valid_encoder_possible_crtcs),
|
||||
KUNIT_CASE(vkms_config_test_attach_different_configs),
|
||||
KUNIT_CASE(vkms_config_test_plane_attach_crtc),
|
||||
KUNIT_CASE(vkms_config_test_plane_get_possible_crtcs),
|
||||
KUNIT_CASE(vkms_config_test_encoder_get_possible_crtcs),
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user