mirror of
https://github.com/torvalds/linux.git
synced 2026-04-24 17:42:27 -04:00
drm/vkms: Allow to attach connectors and encoders
Add a list of possible encoders to the connector configuration and helpers to attach and detach them. Now that the default configuration has its connector and encoder correctly, 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-15-jose.exposito89@gmail.com Signed-off-by: Maxime Ripard <mripard@kernel.org>
This commit is contained in:
committed by
Maxime Ripard
parent
da38c72018
commit
2c7aafc05c
@@ -584,12 +584,32 @@ static void vkms_config_test_invalid_connector_number(struct kunit *test)
|
||||
vkms_config_destroy(config);
|
||||
}
|
||||
|
||||
static void vkms_config_test_valid_connector_possible_encoders(struct kunit *test)
|
||||
{
|
||||
struct vkms_config *config;
|
||||
struct vkms_config_encoder *encoder_cfg;
|
||||
struct vkms_config_connector *connector_cfg;
|
||||
|
||||
config = vkms_config_default_create(false, false, false);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
|
||||
|
||||
encoder_cfg = get_first_encoder(config);
|
||||
connector_cfg = get_first_connector(config);
|
||||
|
||||
/* Invalid: Connector without a possible encoder */
|
||||
vkms_config_connector_detach_encoder(connector_cfg, encoder_cfg);
|
||||
KUNIT_EXPECT_FALSE(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;
|
||||
struct vkms_config_connector *connector_cfg1, *connector_cfg2;
|
||||
int err;
|
||||
|
||||
config1 = vkms_config_create("test1");
|
||||
@@ -601,10 +621,12 @@ 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);
|
||||
connector_cfg1 = vkms_config_create_connector(config1);
|
||||
|
||||
plane_cfg2 = vkms_config_create_plane(config2);
|
||||
crtc_cfg2 = vkms_config_create_crtc(config2);
|
||||
encoder_cfg2 = vkms_config_create_encoder(config2);
|
||||
connector_cfg2 = vkms_config_create_connector(config2);
|
||||
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg1);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg2);
|
||||
@@ -612,6 +634,8 @@ static void vkms_config_test_attach_different_configs(struct kunit *test)
|
||||
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);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg1);
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg2);
|
||||
|
||||
err = vkms_config_plane_attach_crtc(plane_cfg1, crtc_cfg2);
|
||||
KUNIT_EXPECT_NE(test, err, 0);
|
||||
@@ -623,6 +647,11 @@ static void vkms_config_test_attach_different_configs(struct kunit *test)
|
||||
err = vkms_config_encoder_attach_crtc(encoder_cfg2, crtc_cfg1);
|
||||
KUNIT_EXPECT_NE(test, err, 0);
|
||||
|
||||
err = vkms_config_connector_attach_encoder(connector_cfg1, encoder_cfg2);
|
||||
KUNIT_EXPECT_NE(test, err, 0);
|
||||
err = vkms_config_connector_attach_encoder(connector_cfg2, encoder_cfg1);
|
||||
KUNIT_EXPECT_NE(test, err, 0);
|
||||
|
||||
vkms_config_destroy(config1);
|
||||
vkms_config_destroy(config2);
|
||||
}
|
||||
@@ -816,6 +845,77 @@ static void vkms_config_test_encoder_get_possible_crtcs(struct kunit *test)
|
||||
vkms_config_destroy(config);
|
||||
}
|
||||
|
||||
static void vkms_config_test_connector_get_possible_encoders(struct kunit *test)
|
||||
{
|
||||
struct vkms_config *config;
|
||||
struct vkms_config_connector *connector_cfg1, *connector_cfg2;
|
||||
struct vkms_config_encoder *encoder_cfg1, *encoder_cfg2;
|
||||
struct vkms_config_encoder *possible_encoder;
|
||||
unsigned long idx = 0;
|
||||
int n_encoders = 0;
|
||||
int err;
|
||||
|
||||
config = vkms_config_create("test");
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
|
||||
|
||||
connector_cfg1 = vkms_config_create_connector(config);
|
||||
connector_cfg2 = vkms_config_create_connector(config);
|
||||
encoder_cfg1 = vkms_config_create_encoder(config);
|
||||
encoder_cfg2 = vkms_config_create_encoder(config);
|
||||
|
||||
/* No possible encoders */
|
||||
vkms_config_connector_for_each_possible_encoder(connector_cfg1, idx,
|
||||
possible_encoder)
|
||||
KUNIT_FAIL(test, "Unexpected possible encoder");
|
||||
|
||||
vkms_config_connector_for_each_possible_encoder(connector_cfg2, idx,
|
||||
possible_encoder)
|
||||
KUNIT_FAIL(test, "Unexpected possible encoder");
|
||||
|
||||
/* Connector 1 attached to encoders 1 and 2 */
|
||||
err = vkms_config_connector_attach_encoder(connector_cfg1, encoder_cfg1);
|
||||
KUNIT_EXPECT_EQ(test, err, 0);
|
||||
err = vkms_config_connector_attach_encoder(connector_cfg1, encoder_cfg2);
|
||||
KUNIT_EXPECT_EQ(test, err, 0);
|
||||
|
||||
vkms_config_connector_for_each_possible_encoder(connector_cfg1, idx,
|
||||
possible_encoder) {
|
||||
n_encoders++;
|
||||
if (possible_encoder != encoder_cfg1 &&
|
||||
possible_encoder != encoder_cfg2)
|
||||
KUNIT_FAIL(test, "Unexpected possible encoder");
|
||||
}
|
||||
KUNIT_ASSERT_EQ(test, n_encoders, 2);
|
||||
n_encoders = 0;
|
||||
|
||||
vkms_config_connector_for_each_possible_encoder(connector_cfg2, idx,
|
||||
possible_encoder)
|
||||
KUNIT_FAIL(test, "Unexpected possible encoder");
|
||||
|
||||
/* Connector 1 attached to encoder 1 and connector 2 to encoder 2 */
|
||||
vkms_config_connector_detach_encoder(connector_cfg1, encoder_cfg2);
|
||||
vkms_config_connector_for_each_possible_encoder(connector_cfg1, idx,
|
||||
possible_encoder) {
|
||||
n_encoders++;
|
||||
if (possible_encoder != encoder_cfg1)
|
||||
KUNIT_FAIL(test, "Unexpected possible encoder");
|
||||
}
|
||||
KUNIT_ASSERT_EQ(test, n_encoders, 1);
|
||||
n_encoders = 0;
|
||||
|
||||
err = vkms_config_connector_attach_encoder(connector_cfg2, encoder_cfg2);
|
||||
KUNIT_EXPECT_EQ(test, err, 0);
|
||||
vkms_config_connector_for_each_possible_encoder(connector_cfg2, idx,
|
||||
possible_encoder) {
|
||||
n_encoders++;
|
||||
if (possible_encoder != encoder_cfg2)
|
||||
KUNIT_FAIL(test, "Unexpected possible encoder");
|
||||
}
|
||||
KUNIT_ASSERT_EQ(test, n_encoders, 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,
|
||||
@@ -831,10 +931,12 @@ static struct kunit_case vkms_config_test_cases[] = {
|
||||
KUNIT_CASE(vkms_config_test_invalid_encoder_number),
|
||||
KUNIT_CASE(vkms_config_test_valid_encoder_possible_crtcs),
|
||||
KUNIT_CASE(vkms_config_test_invalid_connector_number),
|
||||
KUNIT_CASE(vkms_config_test_valid_connector_possible_encoders),
|
||||
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),
|
||||
KUNIT_CASE(vkms_config_test_connector_get_possible_encoders),
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user