15b5a56d9SJosé Expósito // SPDX-License-Identifier: GPL-2.0+ 25b5a56d9SJosé Expósito 35b5a56d9SJosé Expósito #include <kunit/test.h> 45b5a56d9SJosé Expósito 5d3ae1e39SJosé Expósito #include "../vkms_config.h" 6d3ae1e39SJosé Expósito 75b5a56d9SJosé Expósito MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING"); 85b5a56d9SJosé Expósito 9bc5b0d5dSJosé Expósito static size_t vkms_config_get_num_planes(struct vkms_config *config) 10bc5b0d5dSJosé Expósito { 11bc5b0d5dSJosé Expósito struct vkms_config_plane *plane_cfg; 12bc5b0d5dSJosé Expósito size_t count = 0; 13bc5b0d5dSJosé Expósito 14bc5b0d5dSJosé Expósito vkms_config_for_each_plane(config, plane_cfg) 15bc5b0d5dSJosé Expósito count++; 16bc5b0d5dSJosé Expósito 17bc5b0d5dSJosé Expósito return count; 18bc5b0d5dSJosé Expósito } 19bc5b0d5dSJosé Expósito 20f60a183dSJosé Expósito static size_t vkms_config_get_num_encoders(struct vkms_config *config) 21f60a183dSJosé Expósito { 22f60a183dSJosé Expósito struct vkms_config_encoder *encoder_cfg; 23f60a183dSJosé Expósito size_t count = 0; 24f60a183dSJosé Expósito 25f60a183dSJosé Expósito vkms_config_for_each_encoder(config, encoder_cfg) 26f60a183dSJosé Expósito count++; 27f60a183dSJosé Expósito 28f60a183dSJosé Expósito return count; 29f60a183dSJosé Expósito } 30f60a183dSJosé Expósito 31da38c720SJosé Expósito static size_t vkms_config_get_num_connectors(struct vkms_config *config) 32da38c720SJosé Expósito { 33da38c720SJosé Expósito struct vkms_config_connector *connector_cfg; 34da38c720SJosé Expósito size_t count = 0; 35da38c720SJosé Expósito 36da38c720SJosé Expósito vkms_config_for_each_connector(config, connector_cfg) 37da38c720SJosé Expósito count++; 38da38c720SJosé Expósito 39da38c720SJosé Expósito return count; 40da38c720SJosé Expósito } 41da38c720SJosé Expósito 42bc5b0d5dSJosé Expósito static struct vkms_config_plane *get_first_plane(struct vkms_config *config) 43bc5b0d5dSJosé Expósito { 44bc5b0d5dSJosé Expósito struct vkms_config_plane *plane_cfg; 45bc5b0d5dSJosé Expósito 46bc5b0d5dSJosé Expósito vkms_config_for_each_plane(config, plane_cfg) 47bc5b0d5dSJosé Expósito return plane_cfg; 48bc5b0d5dSJosé Expósito 49bc5b0d5dSJosé Expósito return NULL; 50bc5b0d5dSJosé Expósito } 51bc5b0d5dSJosé Expósito 52600df32dSJosé Expósito static struct vkms_config_crtc *get_first_crtc(struct vkms_config *config) 53600df32dSJosé Expósito { 54600df32dSJosé Expósito struct vkms_config_crtc *crtc_cfg; 55600df32dSJosé Expósito 56600df32dSJosé Expósito vkms_config_for_each_crtc(config, crtc_cfg) 57600df32dSJosé Expósito return crtc_cfg; 58600df32dSJosé Expósito 59600df32dSJosé Expósito return NULL; 60600df32dSJosé Expósito } 61600df32dSJosé Expósito 62f60a183dSJosé Expósito static struct vkms_config_encoder *get_first_encoder(struct vkms_config *config) 63f60a183dSJosé Expósito { 64f60a183dSJosé Expósito struct vkms_config_encoder *encoder_cfg; 65f60a183dSJosé Expósito 66f60a183dSJosé Expósito vkms_config_for_each_encoder(config, encoder_cfg) 67f60a183dSJosé Expósito return encoder_cfg; 68f60a183dSJosé Expósito 69f60a183dSJosé Expósito return NULL; 70f60a183dSJosé Expósito } 71f60a183dSJosé Expósito 72da38c720SJosé Expósito static struct vkms_config_connector *get_first_connector(struct vkms_config *config) 73da38c720SJosé Expósito { 74da38c720SJosé Expósito struct vkms_config_connector *connector_cfg; 75da38c720SJosé Expósito 76da38c720SJosé Expósito vkms_config_for_each_connector(config, connector_cfg) 77da38c720SJosé Expósito return connector_cfg; 78da38c720SJosé Expósito 79da38c720SJosé Expósito return NULL; 80da38c720SJosé Expósito } 81da38c720SJosé Expósito 828b059b0cSJosé Expósito struct default_config_case { 838b059b0cSJosé Expósito bool enable_cursor; 848b059b0cSJosé Expósito bool enable_writeback; 858b059b0cSJosé Expósito bool enable_overlay; 868b059b0cSJosé Expósito }; 878b059b0cSJosé Expósito 88d3ae1e39SJosé Expósito static void vkms_config_test_empty_config(struct kunit *test) 89d3ae1e39SJosé Expósito { 90d3ae1e39SJosé Expósito struct vkms_config *config; 91969a3a4eSJosé Expósito const char *dev_name = "test"; 92d3ae1e39SJosé Expósito 93969a3a4eSJosé Expósito config = vkms_config_create(dev_name); 94d3ae1e39SJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 95d3ae1e39SJosé Expósito 96969a3a4eSJosé Expósito /* The dev_name string and the config have different lifetimes */ 97969a3a4eSJosé Expósito dev_name = NULL; 98969a3a4eSJosé Expósito KUNIT_EXPECT_STREQ(test, vkms_config_get_device_name(config), "test"); 99969a3a4eSJosé Expósito 100bc5b0d5dSJosé Expósito KUNIT_EXPECT_EQ(test, vkms_config_get_num_planes(config), 0); 101600df32dSJosé Expósito KUNIT_EXPECT_EQ(test, vkms_config_get_num_crtcs(config), 0); 102f60a183dSJosé Expósito KUNIT_EXPECT_EQ(test, vkms_config_get_num_encoders(config), 0); 103da38c720SJosé Expósito KUNIT_EXPECT_EQ(test, vkms_config_get_num_connectors(config), 0); 104bc5b0d5dSJosé Expósito 105bc5b0d5dSJosé Expósito KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); 106bc5b0d5dSJosé Expósito 107d3ae1e39SJosé Expósito vkms_config_destroy(config); 108d3ae1e39SJosé Expósito } 109d3ae1e39SJosé Expósito 1108b059b0cSJosé Expósito static struct default_config_case default_config_cases[] = { 1118b059b0cSJosé Expósito { false, false, false }, 1128b059b0cSJosé Expósito { true, false, false }, 1138b059b0cSJosé Expósito { true, true, false }, 1148b059b0cSJosé Expósito { true, false, true }, 1158b059b0cSJosé Expósito { false, true, false }, 1168b059b0cSJosé Expósito { false, true, true }, 1178b059b0cSJosé Expósito { false, false, true }, 1188b059b0cSJosé Expósito { true, true, true }, 1198b059b0cSJosé Expósito }; 1208b059b0cSJosé Expósito 1218b059b0cSJosé Expósito KUNIT_ARRAY_PARAM(default_config, default_config_cases, NULL); 1228b059b0cSJosé Expósito 1238b059b0cSJosé Expósito static void vkms_config_test_default_config(struct kunit *test) 1248b059b0cSJosé Expósito { 1258b059b0cSJosé Expósito const struct default_config_case *params = test->param_value; 1268b059b0cSJosé Expósito struct vkms_config *config; 127bc5b0d5dSJosé Expósito struct vkms_config_plane *plane_cfg; 128600df32dSJosé Expósito struct vkms_config_crtc *crtc_cfg; 129bc5b0d5dSJosé Expósito int n_primaries = 0; 130bc5b0d5dSJosé Expósito int n_cursors = 0; 131bc5b0d5dSJosé Expósito int n_overlays = 0; 1328b059b0cSJosé Expósito 1338b059b0cSJosé Expósito config = vkms_config_default_create(params->enable_cursor, 1348b059b0cSJosé Expósito params->enable_writeback, 1358b059b0cSJosé Expósito params->enable_overlay); 1368b059b0cSJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 1378b059b0cSJosé Expósito 138bc5b0d5dSJosé Expósito /* Planes */ 139bc5b0d5dSJosé Expósito vkms_config_for_each_plane(config, plane_cfg) { 140bc5b0d5dSJosé Expósito switch (vkms_config_plane_get_type(plane_cfg)) { 141bc5b0d5dSJosé Expósito case DRM_PLANE_TYPE_PRIMARY: 142bc5b0d5dSJosé Expósito n_primaries++; 143bc5b0d5dSJosé Expósito break; 144bc5b0d5dSJosé Expósito case DRM_PLANE_TYPE_CURSOR: 145bc5b0d5dSJosé Expósito n_cursors++; 146bc5b0d5dSJosé Expósito break; 147bc5b0d5dSJosé Expósito case DRM_PLANE_TYPE_OVERLAY: 148bc5b0d5dSJosé Expósito n_overlays++; 149bc5b0d5dSJosé Expósito break; 150bc5b0d5dSJosé Expósito default: 151bc5b0d5dSJosé Expósito KUNIT_FAIL_AND_ABORT(test, "Unknown plane type"); 152bc5b0d5dSJosé Expósito } 153bc5b0d5dSJosé Expósito } 154bc5b0d5dSJosé Expósito KUNIT_EXPECT_EQ(test, n_primaries, 1); 155bc5b0d5dSJosé Expósito KUNIT_EXPECT_EQ(test, n_cursors, params->enable_cursor ? 1 : 0); 156bc5b0d5dSJosé Expósito KUNIT_EXPECT_EQ(test, n_overlays, params->enable_overlay ? 8 : 0); 157bc5b0d5dSJosé Expósito 158600df32dSJosé Expósito /* CRTCs */ 159600df32dSJosé Expósito KUNIT_EXPECT_EQ(test, vkms_config_get_num_crtcs(config), 1); 160600df32dSJosé Expósito 161600df32dSJosé Expósito crtc_cfg = get_first_crtc(config); 162600df32dSJosé Expósito KUNIT_EXPECT_EQ(test, vkms_config_crtc_get_writeback(crtc_cfg), 163600df32dSJosé Expósito params->enable_writeback); 164600df32dSJosé Expósito 165c204bf65SJosé Expósito vkms_config_for_each_plane(config, plane_cfg) { 166c204bf65SJosé Expósito struct vkms_config_crtc *possible_crtc; 167c204bf65SJosé Expósito int n_possible_crtcs = 0; 168c204bf65SJosé Expósito unsigned long idx = 0; 169c204bf65SJosé Expósito 170c204bf65SJosé Expósito vkms_config_plane_for_each_possible_crtc(plane_cfg, idx, possible_crtc) { 171c204bf65SJosé Expósito KUNIT_EXPECT_PTR_EQ(test, crtc_cfg, possible_crtc); 172c204bf65SJosé Expósito n_possible_crtcs++; 173c204bf65SJosé Expósito } 174c204bf65SJosé Expósito KUNIT_EXPECT_EQ(test, n_possible_crtcs, 1); 175c204bf65SJosé Expósito } 176c204bf65SJosé Expósito 177f60a183dSJosé Expósito /* Encoders */ 178f60a183dSJosé Expósito KUNIT_EXPECT_EQ(test, vkms_config_get_num_encoders(config), 1); 179f60a183dSJosé Expósito 180da38c720SJosé Expósito /* Connectors */ 181da38c720SJosé Expósito KUNIT_EXPECT_EQ(test, vkms_config_get_num_connectors(config), 1); 182da38c720SJosé Expósito 183bc5b0d5dSJosé Expósito KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); 184bc5b0d5dSJosé Expósito 185bc5b0d5dSJosé Expósito vkms_config_destroy(config); 186bc5b0d5dSJosé Expósito } 187bc5b0d5dSJosé Expósito 188bc5b0d5dSJosé Expósito static void vkms_config_test_get_planes(struct kunit *test) 189bc5b0d5dSJosé Expósito { 190bc5b0d5dSJosé Expósito struct vkms_config *config; 191bc5b0d5dSJosé Expósito struct vkms_config_plane *plane_cfg; 192bc5b0d5dSJosé Expósito struct vkms_config_plane *plane_cfg1, *plane_cfg2; 193bc5b0d5dSJosé Expósito int n_planes = 0; 194bc5b0d5dSJosé Expósito 195bc5b0d5dSJosé Expósito config = vkms_config_create("test"); 196bc5b0d5dSJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 197bc5b0d5dSJosé Expósito 198bc5b0d5dSJosé Expósito vkms_config_for_each_plane(config, plane_cfg) 199bc5b0d5dSJosé Expósito n_planes++; 200bc5b0d5dSJosé Expósito KUNIT_ASSERT_EQ(test, n_planes, 0); 201bc5b0d5dSJosé Expósito 202bc5b0d5dSJosé Expósito plane_cfg1 = vkms_config_create_plane(config); 203bc5b0d5dSJosé Expósito vkms_config_for_each_plane(config, plane_cfg) { 204bc5b0d5dSJosé Expósito n_planes++; 205bc5b0d5dSJosé Expósito if (plane_cfg != plane_cfg1) 206bc5b0d5dSJosé Expósito KUNIT_FAIL(test, "Unexpected plane"); 207bc5b0d5dSJosé Expósito } 208bc5b0d5dSJosé Expósito KUNIT_ASSERT_EQ(test, n_planes, 1); 209bc5b0d5dSJosé Expósito n_planes = 0; 210bc5b0d5dSJosé Expósito 211bc5b0d5dSJosé Expósito plane_cfg2 = vkms_config_create_plane(config); 212bc5b0d5dSJosé Expósito vkms_config_for_each_plane(config, plane_cfg) { 213bc5b0d5dSJosé Expósito n_planes++; 214bc5b0d5dSJosé Expósito if (plane_cfg != plane_cfg1 && plane_cfg != plane_cfg2) 215bc5b0d5dSJosé Expósito KUNIT_FAIL(test, "Unexpected plane"); 216bc5b0d5dSJosé Expósito } 217bc5b0d5dSJosé Expósito KUNIT_ASSERT_EQ(test, n_planes, 2); 218bc5b0d5dSJosé Expósito n_planes = 0; 219bc5b0d5dSJosé Expósito 220bc5b0d5dSJosé Expósito vkms_config_destroy_plane(plane_cfg1); 221bc5b0d5dSJosé Expósito vkms_config_for_each_plane(config, plane_cfg) { 222bc5b0d5dSJosé Expósito n_planes++; 223bc5b0d5dSJosé Expósito if (plane_cfg != plane_cfg2) 224bc5b0d5dSJosé Expósito KUNIT_FAIL(test, "Unexpected plane"); 225bc5b0d5dSJosé Expósito } 226bc5b0d5dSJosé Expósito KUNIT_ASSERT_EQ(test, n_planes, 1); 227bc5b0d5dSJosé Expósito 228bc5b0d5dSJosé Expósito vkms_config_destroy(config); 229bc5b0d5dSJosé Expósito } 230bc5b0d5dSJosé Expósito 231600df32dSJosé Expósito static void vkms_config_test_get_crtcs(struct kunit *test) 232600df32dSJosé Expósito { 233600df32dSJosé Expósito struct vkms_config *config; 234600df32dSJosé Expósito struct vkms_config_crtc *crtc_cfg; 235600df32dSJosé Expósito struct vkms_config_crtc *crtc_cfg1, *crtc_cfg2; 236600df32dSJosé Expósito 237600df32dSJosé Expósito config = vkms_config_create("test"); 238600df32dSJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 239600df32dSJosé Expósito 240600df32dSJosé Expósito KUNIT_ASSERT_EQ(test, vkms_config_get_num_crtcs(config), 0); 241600df32dSJosé Expósito vkms_config_for_each_crtc(config, crtc_cfg) 242600df32dSJosé Expósito KUNIT_FAIL(test, "Unexpected CRTC"); 243600df32dSJosé Expósito 244600df32dSJosé Expósito crtc_cfg1 = vkms_config_create_crtc(config); 245600df32dSJosé Expósito KUNIT_ASSERT_EQ(test, vkms_config_get_num_crtcs(config), 1); 246600df32dSJosé Expósito vkms_config_for_each_crtc(config, crtc_cfg) { 247600df32dSJosé Expósito if (crtc_cfg != crtc_cfg1) 248600df32dSJosé Expósito KUNIT_FAIL(test, "Unexpected CRTC"); 249600df32dSJosé Expósito } 250600df32dSJosé Expósito 251600df32dSJosé Expósito crtc_cfg2 = vkms_config_create_crtc(config); 252600df32dSJosé Expósito KUNIT_ASSERT_EQ(test, vkms_config_get_num_crtcs(config), 2); 253600df32dSJosé Expósito vkms_config_for_each_crtc(config, crtc_cfg) { 254600df32dSJosé Expósito if (crtc_cfg != crtc_cfg1 && crtc_cfg != crtc_cfg2) 255600df32dSJosé Expósito KUNIT_FAIL(test, "Unexpected CRTC"); 256600df32dSJosé Expósito } 257600df32dSJosé Expósito 258600df32dSJosé Expósito vkms_config_destroy_crtc(config, crtc_cfg2); 259600df32dSJosé Expósito KUNIT_ASSERT_EQ(test, vkms_config_get_num_crtcs(config), 1); 260600df32dSJosé Expósito vkms_config_for_each_crtc(config, crtc_cfg) { 261600df32dSJosé Expósito if (crtc_cfg != crtc_cfg1) 262600df32dSJosé Expósito KUNIT_FAIL(test, "Unexpected CRTC"); 263600df32dSJosé Expósito } 264600df32dSJosé Expósito 265600df32dSJosé Expósito vkms_config_destroy(config); 266600df32dSJosé Expósito } 267600df32dSJosé Expósito 268f60a183dSJosé Expósito static void vkms_config_test_get_encoders(struct kunit *test) 269f60a183dSJosé Expósito { 270f60a183dSJosé Expósito struct vkms_config *config; 271f60a183dSJosé Expósito struct vkms_config_encoder *encoder_cfg; 272f60a183dSJosé Expósito struct vkms_config_encoder *encoder_cfg1, *encoder_cfg2; 273f60a183dSJosé Expósito int n_encoders = 0; 274f60a183dSJosé Expósito 275f60a183dSJosé Expósito config = vkms_config_create("test"); 276f60a183dSJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 277f60a183dSJosé Expósito 278f60a183dSJosé Expósito vkms_config_for_each_encoder(config, encoder_cfg) 279f60a183dSJosé Expósito n_encoders++; 280f60a183dSJosé Expósito KUNIT_ASSERT_EQ(test, n_encoders, 0); 281f60a183dSJosé Expósito 282f60a183dSJosé Expósito encoder_cfg1 = vkms_config_create_encoder(config); 283f60a183dSJosé Expósito vkms_config_for_each_encoder(config, encoder_cfg) { 284f60a183dSJosé Expósito n_encoders++; 285f60a183dSJosé Expósito if (encoder_cfg != encoder_cfg1) 286f60a183dSJosé Expósito KUNIT_FAIL(test, "Unexpected encoder"); 287f60a183dSJosé Expósito } 288f60a183dSJosé Expósito KUNIT_ASSERT_EQ(test, n_encoders, 1); 289f60a183dSJosé Expósito n_encoders = 0; 290f60a183dSJosé Expósito 291f60a183dSJosé Expósito encoder_cfg2 = vkms_config_create_encoder(config); 292f60a183dSJosé Expósito vkms_config_for_each_encoder(config, encoder_cfg) { 293f60a183dSJosé Expósito n_encoders++; 294f60a183dSJosé Expósito if (encoder_cfg != encoder_cfg1 && encoder_cfg != encoder_cfg2) 295f60a183dSJosé Expósito KUNIT_FAIL(test, "Unexpected encoder"); 296f60a183dSJosé Expósito } 297f60a183dSJosé Expósito KUNIT_ASSERT_EQ(test, n_encoders, 2); 298f60a183dSJosé Expósito n_encoders = 0; 299f60a183dSJosé Expósito 300f60a183dSJosé Expósito vkms_config_destroy_encoder(config, encoder_cfg2); 301f60a183dSJosé Expósito vkms_config_for_each_encoder(config, encoder_cfg) { 302f60a183dSJosé Expósito n_encoders++; 303f60a183dSJosé Expósito if (encoder_cfg != encoder_cfg1) 304f60a183dSJosé Expósito KUNIT_FAIL(test, "Unexpected encoder"); 305f60a183dSJosé Expósito } 306f60a183dSJosé Expósito KUNIT_ASSERT_EQ(test, n_encoders, 1); 307f60a183dSJosé Expósito n_encoders = 0; 308f60a183dSJosé Expósito 309f60a183dSJosé Expósito vkms_config_destroy(config); 310f60a183dSJosé Expósito } 311f60a183dSJosé Expósito 312da38c720SJosé Expósito static void vkms_config_test_get_connectors(struct kunit *test) 313da38c720SJosé Expósito { 314da38c720SJosé Expósito struct vkms_config *config; 315da38c720SJosé Expósito struct vkms_config_connector *connector_cfg; 316da38c720SJosé Expósito struct vkms_config_connector *connector_cfg1, *connector_cfg2; 317da38c720SJosé Expósito int n_connectors = 0; 318da38c720SJosé Expósito 319da38c720SJosé Expósito config = vkms_config_create("test"); 320da38c720SJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 321da38c720SJosé Expósito 322da38c720SJosé Expósito vkms_config_for_each_connector(config, connector_cfg) 323da38c720SJosé Expósito n_connectors++; 324da38c720SJosé Expósito KUNIT_ASSERT_EQ(test, n_connectors, 0); 325da38c720SJosé Expósito 326da38c720SJosé Expósito connector_cfg1 = vkms_config_create_connector(config); 327da38c720SJosé Expósito vkms_config_for_each_connector(config, connector_cfg) { 328da38c720SJosé Expósito n_connectors++; 329da38c720SJosé Expósito if (connector_cfg != connector_cfg1) 330da38c720SJosé Expósito KUNIT_FAIL(test, "Unexpected connector"); 331da38c720SJosé Expósito } 332da38c720SJosé Expósito KUNIT_ASSERT_EQ(test, n_connectors, 1); 333da38c720SJosé Expósito n_connectors = 0; 334da38c720SJosé Expósito 335da38c720SJosé Expósito connector_cfg2 = vkms_config_create_connector(config); 336da38c720SJosé Expósito vkms_config_for_each_connector(config, connector_cfg) { 337da38c720SJosé Expósito n_connectors++; 338da38c720SJosé Expósito if (connector_cfg != connector_cfg1 && 339da38c720SJosé Expósito connector_cfg != connector_cfg2) 340da38c720SJosé Expósito KUNIT_FAIL(test, "Unexpected connector"); 341da38c720SJosé Expósito } 342da38c720SJosé Expósito KUNIT_ASSERT_EQ(test, n_connectors, 2); 343da38c720SJosé Expósito n_connectors = 0; 344da38c720SJosé Expósito 345da38c720SJosé Expósito vkms_config_destroy_connector(connector_cfg2); 346da38c720SJosé Expósito vkms_config_for_each_connector(config, connector_cfg) { 347da38c720SJosé Expósito n_connectors++; 348da38c720SJosé Expósito if (connector_cfg != connector_cfg1) 349da38c720SJosé Expósito KUNIT_FAIL(test, "Unexpected connector"); 350da38c720SJosé Expósito } 351da38c720SJosé Expósito KUNIT_ASSERT_EQ(test, n_connectors, 1); 352da38c720SJosé Expósito n_connectors = 0; 353da38c720SJosé Expósito 354da38c720SJosé Expósito vkms_config_destroy(config); 355da38c720SJosé Expósito } 356da38c720SJosé Expósito 357bc5b0d5dSJosé Expósito static void vkms_config_test_invalid_plane_number(struct kunit *test) 358bc5b0d5dSJosé Expósito { 359bc5b0d5dSJosé Expósito struct vkms_config *config; 360bc5b0d5dSJosé Expósito struct vkms_config_plane *plane_cfg; 361bc5b0d5dSJosé Expósito int n; 362bc5b0d5dSJosé Expósito 363bc5b0d5dSJosé Expósito config = vkms_config_default_create(false, false, false); 364bc5b0d5dSJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 365bc5b0d5dSJosé Expósito 366bc5b0d5dSJosé Expósito /* Invalid: No planes */ 367bc5b0d5dSJosé Expósito plane_cfg = get_first_plane(config); 368bc5b0d5dSJosé Expósito vkms_config_destroy_plane(plane_cfg); 369bc5b0d5dSJosé Expósito KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); 370bc5b0d5dSJosé Expósito 371bc5b0d5dSJosé Expósito /* Invalid: Too many planes */ 372bc5b0d5dSJosé Expósito for (n = 0; n <= 32; n++) 373bc5b0d5dSJosé Expósito vkms_config_create_plane(config); 374bc5b0d5dSJosé Expósito 375bc5b0d5dSJosé Expósito KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); 376bc5b0d5dSJosé Expósito 377bc5b0d5dSJosé Expósito vkms_config_destroy(config); 378bc5b0d5dSJosé Expósito } 379bc5b0d5dSJosé Expósito 380bc5b0d5dSJosé Expósito static void vkms_config_test_valid_plane_type(struct kunit *test) 381bc5b0d5dSJosé Expósito { 382bc5b0d5dSJosé Expósito struct vkms_config *config; 383bc5b0d5dSJosé Expósito struct vkms_config_plane *plane_cfg; 384c204bf65SJosé Expósito struct vkms_config_crtc *crtc_cfg; 385b8776fc9SJosé Expósito struct vkms_config_encoder *encoder_cfg; 386c204bf65SJosé Expósito int err; 387bc5b0d5dSJosé Expósito 388bc5b0d5dSJosé Expósito config = vkms_config_default_create(false, false, false); 389bc5b0d5dSJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 390bc5b0d5dSJosé Expósito 391bc5b0d5dSJosé Expósito plane_cfg = get_first_plane(config); 392bc5b0d5dSJosé Expósito vkms_config_destroy_plane(plane_cfg); 393bc5b0d5dSJosé Expósito 394c204bf65SJosé Expósito crtc_cfg = get_first_crtc(config); 395c204bf65SJosé Expósito 396bc5b0d5dSJosé Expósito /* Invalid: No primary plane */ 397bc5b0d5dSJosé Expósito plane_cfg = vkms_config_create_plane(config); 398bc5b0d5dSJosé Expósito vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_OVERLAY); 399c204bf65SJosé Expósito err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg); 400c204bf65SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 401bc5b0d5dSJosé Expósito KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); 402bc5b0d5dSJosé Expósito 403bc5b0d5dSJosé Expósito /* Invalid: Multiple primary planes */ 404bc5b0d5dSJosé Expósito plane_cfg = vkms_config_create_plane(config); 405bc5b0d5dSJosé Expósito vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY); 406c204bf65SJosé Expósito err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg); 407c204bf65SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 408c204bf65SJosé Expósito 409bc5b0d5dSJosé Expósito plane_cfg = vkms_config_create_plane(config); 410bc5b0d5dSJosé Expósito vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY); 411c204bf65SJosé Expósito err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg); 412c204bf65SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 413c204bf65SJosé Expósito 414bc5b0d5dSJosé Expósito KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); 415bc5b0d5dSJosé Expósito 416bc5b0d5dSJosé Expósito /* Valid: One primary plane */ 417bc5b0d5dSJosé Expósito vkms_config_destroy_plane(plane_cfg); 418bc5b0d5dSJosé Expósito KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); 419bc5b0d5dSJosé Expósito 420bc5b0d5dSJosé Expósito /* Invalid: Multiple cursor planes */ 421bc5b0d5dSJosé Expósito plane_cfg = vkms_config_create_plane(config); 422bc5b0d5dSJosé Expósito vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_CURSOR); 423c204bf65SJosé Expósito err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg); 424c204bf65SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 425c204bf65SJosé Expósito 426bc5b0d5dSJosé Expósito plane_cfg = vkms_config_create_plane(config); 427bc5b0d5dSJosé Expósito vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_CURSOR); 428c204bf65SJosé Expósito err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg); 429c204bf65SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 430c204bf65SJosé Expósito 431bc5b0d5dSJosé Expósito KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); 432bc5b0d5dSJosé Expósito 433bc5b0d5dSJosé Expósito /* Valid: One primary and one cursor plane */ 434bc5b0d5dSJosé Expósito vkms_config_destroy_plane(plane_cfg); 435d1386d72SLouis Chauvet KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); 436d1386d72SLouis Chauvet 437c204bf65SJosé Expósito /* Invalid: Second CRTC without primary plane */ 438c204bf65SJosé Expósito crtc_cfg = vkms_config_create_crtc(config); 439b8776fc9SJosé Expósito encoder_cfg = vkms_config_create_encoder(config); 440b8776fc9SJosé Expósito err = vkms_config_encoder_attach_crtc(encoder_cfg, crtc_cfg); 441b8776fc9SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 442c204bf65SJosé Expósito KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); 443c204bf65SJosé Expósito 444c204bf65SJosé Expósito /* Valid: Second CRTC with a primary plane */ 445c204bf65SJosé Expósito plane_cfg = vkms_config_create_plane(config); 446c204bf65SJosé Expósito vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY); 447c204bf65SJosé Expósito err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg); 448c204bf65SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 449c204bf65SJosé Expósito KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); 450c204bf65SJosé Expósito 451c204bf65SJosé Expósito vkms_config_destroy(config); 452c204bf65SJosé Expósito } 453c204bf65SJosé Expósito 454c204bf65SJosé Expósito static void vkms_config_test_valid_plane_possible_crtcs(struct kunit *test) 455c204bf65SJosé Expósito { 456c204bf65SJosé Expósito struct vkms_config *config; 457c204bf65SJosé Expósito struct vkms_config_plane *plane_cfg; 458c204bf65SJosé Expósito struct vkms_config_crtc *crtc_cfg; 459c204bf65SJosé Expósito 460c204bf65SJosé Expósito config = vkms_config_default_create(false, false, false); 461c204bf65SJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 462c204bf65SJosé Expósito 463c204bf65SJosé Expósito plane_cfg = get_first_plane(config); 464c204bf65SJosé Expósito crtc_cfg = get_first_crtc(config); 465c204bf65SJosé Expósito 466c204bf65SJosé Expósito /* Invalid: Primary plane without a possible CRTC */ 467c204bf65SJosé Expósito vkms_config_plane_detach_crtc(plane_cfg, crtc_cfg); 468c204bf65SJosé Expósito KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); 469c204bf65SJosé Expósito 4708b059b0cSJosé Expósito vkms_config_destroy(config); 4718b059b0cSJosé Expósito } 4728b059b0cSJosé Expósito 473600df32dSJosé Expósito static void vkms_config_test_invalid_crtc_number(struct kunit *test) 474600df32dSJosé Expósito { 475600df32dSJosé Expósito struct vkms_config *config; 476600df32dSJosé Expósito struct vkms_config_crtc *crtc_cfg; 477600df32dSJosé Expósito int n; 478600df32dSJosé Expósito 479600df32dSJosé Expósito config = vkms_config_default_create(false, false, false); 480600df32dSJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 481600df32dSJosé Expósito 482600df32dSJosé Expósito /* Invalid: No CRTCs */ 483600df32dSJosé Expósito crtc_cfg = get_first_crtc(config); 484600df32dSJosé Expósito vkms_config_destroy_crtc(config, crtc_cfg); 485600df32dSJosé Expósito KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); 486600df32dSJosé Expósito 487600df32dSJosé Expósito /* Invalid: Too many CRTCs */ 488600df32dSJosé Expósito for (n = 0; n <= 32; n++) 489600df32dSJosé Expósito vkms_config_create_crtc(config); 490600df32dSJosé Expósito 491600df32dSJosé Expósito KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); 492600df32dSJosé Expósito 493600df32dSJosé Expósito vkms_config_destroy(config); 494600df32dSJosé Expósito } 495600df32dSJosé Expósito 496f60a183dSJosé Expósito static void vkms_config_test_invalid_encoder_number(struct kunit *test) 497f60a183dSJosé Expósito { 498f60a183dSJosé Expósito struct vkms_config *config; 499f60a183dSJosé Expósito struct vkms_config_encoder *encoder_cfg; 500f60a183dSJosé Expósito int n; 501f60a183dSJosé Expósito 502f60a183dSJosé Expósito config = vkms_config_default_create(false, false, false); 503f60a183dSJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 504f60a183dSJosé Expósito 505f60a183dSJosé Expósito /* Invalid: No encoders */ 506f60a183dSJosé Expósito encoder_cfg = get_first_encoder(config); 507f60a183dSJosé Expósito vkms_config_destroy_encoder(config, encoder_cfg); 508f60a183dSJosé Expósito KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); 509f60a183dSJosé Expósito 510f60a183dSJosé Expósito /* Invalid: Too many encoders */ 511f60a183dSJosé Expósito for (n = 0; n <= 32; n++) 512f60a183dSJosé Expósito vkms_config_create_encoder(config); 513f60a183dSJosé Expósito 514f60a183dSJosé Expósito KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); 515f60a183dSJosé Expósito 516f60a183dSJosé Expósito vkms_config_destroy(config); 517f60a183dSJosé Expósito } 518f60a183dSJosé Expósito 519b8776fc9SJosé Expósito static void vkms_config_test_valid_encoder_possible_crtcs(struct kunit *test) 520b8776fc9SJosé Expósito { 521b8776fc9SJosé Expósito struct vkms_config *config; 522b8776fc9SJosé Expósito struct vkms_config_plane *plane_cfg; 523b8776fc9SJosé Expósito struct vkms_config_crtc *crtc_cfg1, *crtc_cfg2; 524b8776fc9SJosé Expósito struct vkms_config_encoder *encoder_cfg; 525b8776fc9SJosé Expósito int err; 526b8776fc9SJosé Expósito 527b8776fc9SJosé Expósito config = vkms_config_default_create(false, false, false); 528b8776fc9SJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 529b8776fc9SJosé Expósito 530b8776fc9SJosé Expósito crtc_cfg1 = get_first_crtc(config); 531b8776fc9SJosé Expósito 532b8776fc9SJosé Expósito /* Invalid: Encoder without a possible CRTC */ 533b8776fc9SJosé Expósito encoder_cfg = vkms_config_create_encoder(config); 534b8776fc9SJosé Expósito KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); 535b8776fc9SJosé Expósito 536b8776fc9SJosé Expósito /* Valid: Second CRTC with shared encoder */ 537b8776fc9SJosé Expósito crtc_cfg2 = vkms_config_create_crtc(config); 538b8776fc9SJosé Expósito 539b8776fc9SJosé Expósito plane_cfg = vkms_config_create_plane(config); 540b8776fc9SJosé Expósito vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY); 541b8776fc9SJosé Expósito err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg2); 542b8776fc9SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 543b8776fc9SJosé Expósito 544b8776fc9SJosé Expósito err = vkms_config_encoder_attach_crtc(encoder_cfg, crtc_cfg1); 545b8776fc9SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 546b8776fc9SJosé Expósito 547b8776fc9SJosé Expósito err = vkms_config_encoder_attach_crtc(encoder_cfg, crtc_cfg2); 548b8776fc9SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 549b8776fc9SJosé Expósito 550b8776fc9SJosé Expósito KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); 551b8776fc9SJosé Expósito 552b8776fc9SJosé Expósito /* Invalid: Second CRTC without encoders */ 553b8776fc9SJosé Expósito vkms_config_encoder_detach_crtc(encoder_cfg, crtc_cfg2); 554b8776fc9SJosé Expósito KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); 555b8776fc9SJosé Expósito 556b8776fc9SJosé Expósito /* Valid: First CRTC with 2 possible encoder */ 557b8776fc9SJosé Expósito vkms_config_destroy_plane(plane_cfg); 558b8776fc9SJosé Expósito vkms_config_destroy_crtc(config, crtc_cfg2); 559b8776fc9SJosé Expósito KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); 560b8776fc9SJosé Expósito 561b8776fc9SJosé Expósito vkms_config_destroy(config); 562b8776fc9SJosé Expósito } 563b8776fc9SJosé Expósito 564da38c720SJosé Expósito static void vkms_config_test_invalid_connector_number(struct kunit *test) 565da38c720SJosé Expósito { 566da38c720SJosé Expósito struct vkms_config *config; 567da38c720SJosé Expósito struct vkms_config_connector *connector_cfg; 568da38c720SJosé Expósito int n; 569da38c720SJosé Expósito 570da38c720SJosé Expósito config = vkms_config_default_create(false, false, false); 571da38c720SJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 572da38c720SJosé Expósito 573da38c720SJosé Expósito /* Invalid: No connectors */ 574da38c720SJosé Expósito connector_cfg = get_first_connector(config); 575da38c720SJosé Expósito vkms_config_destroy_connector(connector_cfg); 576da38c720SJosé Expósito KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); 577da38c720SJosé Expósito 578da38c720SJosé Expósito /* Invalid: Too many connectors */ 579da38c720SJosé Expósito for (n = 0; n <= 32; n++) 580da38c720SJosé Expósito connector_cfg = vkms_config_create_connector(config); 581da38c720SJosé Expósito 582da38c720SJosé Expósito KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); 583da38c720SJosé Expósito 584da38c720SJosé Expósito vkms_config_destroy(config); 585da38c720SJosé Expósito } 586da38c720SJosé Expósito 587*2c7aafc0SJosé Expósito static void vkms_config_test_valid_connector_possible_encoders(struct kunit *test) 588*2c7aafc0SJosé Expósito { 589*2c7aafc0SJosé Expósito struct vkms_config *config; 590*2c7aafc0SJosé Expósito struct vkms_config_encoder *encoder_cfg; 591*2c7aafc0SJosé Expósito struct vkms_config_connector *connector_cfg; 592*2c7aafc0SJosé Expósito 593*2c7aafc0SJosé Expósito config = vkms_config_default_create(false, false, false); 594*2c7aafc0SJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 595*2c7aafc0SJosé Expósito 596*2c7aafc0SJosé Expósito encoder_cfg = get_first_encoder(config); 597*2c7aafc0SJosé Expósito connector_cfg = get_first_connector(config); 598*2c7aafc0SJosé Expósito 599*2c7aafc0SJosé Expósito /* Invalid: Connector without a possible encoder */ 600*2c7aafc0SJosé Expósito vkms_config_connector_detach_encoder(connector_cfg, encoder_cfg); 601*2c7aafc0SJosé Expósito KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); 602*2c7aafc0SJosé Expósito 603*2c7aafc0SJosé Expósito vkms_config_destroy(config); 604*2c7aafc0SJosé Expósito } 605*2c7aafc0SJosé Expósito 606c204bf65SJosé Expósito static void vkms_config_test_attach_different_configs(struct kunit *test) 607c204bf65SJosé Expósito { 608c204bf65SJosé Expósito struct vkms_config *config1, *config2; 609c204bf65SJosé Expósito struct vkms_config_plane *plane_cfg1, *plane_cfg2; 610c204bf65SJosé Expósito struct vkms_config_crtc *crtc_cfg1, *crtc_cfg2; 611b8776fc9SJosé Expósito struct vkms_config_encoder *encoder_cfg1, *encoder_cfg2; 612*2c7aafc0SJosé Expósito struct vkms_config_connector *connector_cfg1, *connector_cfg2; 613c204bf65SJosé Expósito int err; 614c204bf65SJosé Expósito 615c204bf65SJosé Expósito config1 = vkms_config_create("test1"); 616c204bf65SJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config1); 617c204bf65SJosé Expósito 618c204bf65SJosé Expósito config2 = vkms_config_create("test2"); 619c204bf65SJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config2); 620c204bf65SJosé Expósito 621c204bf65SJosé Expósito plane_cfg1 = vkms_config_create_plane(config1); 622c204bf65SJosé Expósito crtc_cfg1 = vkms_config_create_crtc(config1); 623b8776fc9SJosé Expósito encoder_cfg1 = vkms_config_create_encoder(config1); 624*2c7aafc0SJosé Expósito connector_cfg1 = vkms_config_create_connector(config1); 625c204bf65SJosé Expósito 626c204bf65SJosé Expósito plane_cfg2 = vkms_config_create_plane(config2); 627c204bf65SJosé Expósito crtc_cfg2 = vkms_config_create_crtc(config2); 628b8776fc9SJosé Expósito encoder_cfg2 = vkms_config_create_encoder(config2); 629*2c7aafc0SJosé Expósito connector_cfg2 = vkms_config_create_connector(config2); 630c204bf65SJosé Expósito 631c204bf65SJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg1); 632c204bf65SJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg2); 633c204bf65SJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg1); 634c204bf65SJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg2); 635b8776fc9SJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder_cfg1); 636b8776fc9SJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder_cfg2); 637*2c7aafc0SJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg1); 638*2c7aafc0SJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg2); 639c204bf65SJosé Expósito 640c204bf65SJosé Expósito err = vkms_config_plane_attach_crtc(plane_cfg1, crtc_cfg2); 641c204bf65SJosé Expósito KUNIT_EXPECT_NE(test, err, 0); 642c204bf65SJosé Expósito err = vkms_config_plane_attach_crtc(plane_cfg2, crtc_cfg1); 643c204bf65SJosé Expósito KUNIT_EXPECT_NE(test, err, 0); 644c204bf65SJosé Expósito 645b8776fc9SJosé Expósito err = vkms_config_encoder_attach_crtc(encoder_cfg1, crtc_cfg2); 646b8776fc9SJosé Expósito KUNIT_EXPECT_NE(test, err, 0); 647b8776fc9SJosé Expósito err = vkms_config_encoder_attach_crtc(encoder_cfg2, crtc_cfg1); 648b8776fc9SJosé Expósito KUNIT_EXPECT_NE(test, err, 0); 649b8776fc9SJosé Expósito 650*2c7aafc0SJosé Expósito err = vkms_config_connector_attach_encoder(connector_cfg1, encoder_cfg2); 651*2c7aafc0SJosé Expósito KUNIT_EXPECT_NE(test, err, 0); 652*2c7aafc0SJosé Expósito err = vkms_config_connector_attach_encoder(connector_cfg2, encoder_cfg1); 653*2c7aafc0SJosé Expósito KUNIT_EXPECT_NE(test, err, 0); 654*2c7aafc0SJosé Expósito 655c204bf65SJosé Expósito vkms_config_destroy(config1); 656c204bf65SJosé Expósito vkms_config_destroy(config2); 657c204bf65SJosé Expósito } 658c204bf65SJosé Expósito 659c204bf65SJosé Expósito static void vkms_config_test_plane_attach_crtc(struct kunit *test) 660c204bf65SJosé Expósito { 661c204bf65SJosé Expósito struct vkms_config *config; 662c204bf65SJosé Expósito struct vkms_config_plane *overlay_cfg; 663c204bf65SJosé Expósito struct vkms_config_plane *primary_cfg; 664c204bf65SJosé Expósito struct vkms_config_plane *cursor_cfg; 665c204bf65SJosé Expósito struct vkms_config_crtc *crtc_cfg; 666c204bf65SJosé Expósito int err; 667c204bf65SJosé Expósito 668c204bf65SJosé Expósito config = vkms_config_create("test"); 669c204bf65SJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 670c204bf65SJosé Expósito 671c204bf65SJosé Expósito overlay_cfg = vkms_config_create_plane(config); 672c204bf65SJosé Expósito vkms_config_plane_set_type(overlay_cfg, DRM_PLANE_TYPE_OVERLAY); 673c204bf65SJosé Expósito primary_cfg = vkms_config_create_plane(config); 674c204bf65SJosé Expósito vkms_config_plane_set_type(primary_cfg, DRM_PLANE_TYPE_PRIMARY); 675c204bf65SJosé Expósito cursor_cfg = vkms_config_create_plane(config); 676c204bf65SJosé Expósito vkms_config_plane_set_type(cursor_cfg, DRM_PLANE_TYPE_CURSOR); 677c204bf65SJosé Expósito 678c204bf65SJosé Expósito crtc_cfg = vkms_config_create_crtc(config); 679c204bf65SJosé Expósito 680c204bf65SJosé Expósito /* No primary or cursor planes */ 681c204bf65SJosé Expósito KUNIT_EXPECT_NULL(test, vkms_config_crtc_primary_plane(config, crtc_cfg)); 682c204bf65SJosé Expósito KUNIT_EXPECT_NULL(test, vkms_config_crtc_cursor_plane(config, crtc_cfg)); 683c204bf65SJosé Expósito 684c204bf65SJosé Expósito /* Overlay plane, but no primary or cursor planes */ 685c204bf65SJosé Expósito err = vkms_config_plane_attach_crtc(overlay_cfg, crtc_cfg); 686c204bf65SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 687c204bf65SJosé Expósito KUNIT_EXPECT_NULL(test, vkms_config_crtc_primary_plane(config, crtc_cfg)); 688c204bf65SJosé Expósito KUNIT_EXPECT_NULL(test, vkms_config_crtc_cursor_plane(config, crtc_cfg)); 689c204bf65SJosé Expósito 690c204bf65SJosé Expósito /* Primary plane, attaching it twice must fail */ 691c204bf65SJosé Expósito err = vkms_config_plane_attach_crtc(primary_cfg, crtc_cfg); 692c204bf65SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 693c204bf65SJosé Expósito err = vkms_config_plane_attach_crtc(primary_cfg, crtc_cfg); 694c204bf65SJosé Expósito KUNIT_EXPECT_NE(test, err, 0); 695c204bf65SJosé Expósito KUNIT_EXPECT_PTR_EQ(test, 696c204bf65SJosé Expósito vkms_config_crtc_primary_plane(config, crtc_cfg), 697c204bf65SJosé Expósito primary_cfg); 698c204bf65SJosé Expósito KUNIT_EXPECT_NULL(test, vkms_config_crtc_cursor_plane(config, crtc_cfg)); 699c204bf65SJosé Expósito 700c204bf65SJosé Expósito /* Primary and cursor planes */ 701c204bf65SJosé Expósito err = vkms_config_plane_attach_crtc(cursor_cfg, crtc_cfg); 702c204bf65SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 703c204bf65SJosé Expósito KUNIT_EXPECT_PTR_EQ(test, 704c204bf65SJosé Expósito vkms_config_crtc_primary_plane(config, crtc_cfg), 705c204bf65SJosé Expósito primary_cfg); 706c204bf65SJosé Expósito KUNIT_EXPECT_PTR_EQ(test, 707c204bf65SJosé Expósito vkms_config_crtc_cursor_plane(config, crtc_cfg), 708c204bf65SJosé Expósito cursor_cfg); 709c204bf65SJosé Expósito 710c204bf65SJosé Expósito /* Detach primary and destroy cursor plane */ 711c204bf65SJosé Expósito vkms_config_plane_detach_crtc(overlay_cfg, crtc_cfg); 712c204bf65SJosé Expósito vkms_config_plane_detach_crtc(primary_cfg, crtc_cfg); 713c204bf65SJosé Expósito vkms_config_destroy_plane(cursor_cfg); 714c204bf65SJosé Expósito KUNIT_EXPECT_NULL(test, vkms_config_crtc_primary_plane(config, crtc_cfg)); 715c204bf65SJosé Expósito KUNIT_EXPECT_NULL(test, vkms_config_crtc_cursor_plane(config, crtc_cfg)); 716c204bf65SJosé Expósito 717c204bf65SJosé Expósito vkms_config_destroy(config); 718c204bf65SJosé Expósito } 719c204bf65SJosé Expósito 720c204bf65SJosé Expósito static void vkms_config_test_plane_get_possible_crtcs(struct kunit *test) 721c204bf65SJosé Expósito { 722c204bf65SJosé Expósito struct vkms_config *config; 723c204bf65SJosé Expósito struct vkms_config_plane *plane_cfg1, *plane_cfg2; 724c204bf65SJosé Expósito struct vkms_config_crtc *crtc_cfg1, *crtc_cfg2; 725c204bf65SJosé Expósito struct vkms_config_crtc *possible_crtc; 726c204bf65SJosé Expósito unsigned long idx = 0; 727c204bf65SJosé Expósito int n_crtcs = 0; 728c204bf65SJosé Expósito int err; 729c204bf65SJosé Expósito 730c204bf65SJosé Expósito config = vkms_config_create("test"); 731c204bf65SJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 732c204bf65SJosé Expósito 733c204bf65SJosé Expósito plane_cfg1 = vkms_config_create_plane(config); 734c204bf65SJosé Expósito plane_cfg2 = vkms_config_create_plane(config); 735c204bf65SJosé Expósito crtc_cfg1 = vkms_config_create_crtc(config); 736c204bf65SJosé Expósito crtc_cfg2 = vkms_config_create_crtc(config); 737c204bf65SJosé Expósito 738c204bf65SJosé Expósito /* No possible CRTCs */ 739c204bf65SJosé Expósito vkms_config_plane_for_each_possible_crtc(plane_cfg1, idx, possible_crtc) 740c204bf65SJosé Expósito KUNIT_FAIL(test, "Unexpected possible CRTC"); 741c204bf65SJosé Expósito 742c204bf65SJosé Expósito vkms_config_plane_for_each_possible_crtc(plane_cfg2, idx, possible_crtc) 743c204bf65SJosé Expósito KUNIT_FAIL(test, "Unexpected possible CRTC"); 744c204bf65SJosé Expósito 745c204bf65SJosé Expósito /* Plane 1 attached to CRTC 1 and 2 */ 746c204bf65SJosé Expósito err = vkms_config_plane_attach_crtc(plane_cfg1, crtc_cfg1); 747c204bf65SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 748c204bf65SJosé Expósito err = vkms_config_plane_attach_crtc(plane_cfg1, crtc_cfg2); 749c204bf65SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 750c204bf65SJosé Expósito 751c204bf65SJosé Expósito vkms_config_plane_for_each_possible_crtc(plane_cfg1, idx, possible_crtc) { 752c204bf65SJosé Expósito n_crtcs++; 753c204bf65SJosé Expósito if (possible_crtc != crtc_cfg1 && possible_crtc != crtc_cfg2) 754c204bf65SJosé Expósito KUNIT_FAIL(test, "Unexpected possible CRTC"); 755c204bf65SJosé Expósito } 756c204bf65SJosé Expósito KUNIT_ASSERT_EQ(test, n_crtcs, 2); 757c204bf65SJosé Expósito n_crtcs = 0; 758c204bf65SJosé Expósito 759c204bf65SJosé Expósito vkms_config_plane_for_each_possible_crtc(plane_cfg2, idx, possible_crtc) 760c204bf65SJosé Expósito KUNIT_FAIL(test, "Unexpected possible CRTC"); 761c204bf65SJosé Expósito 762c204bf65SJosé Expósito /* Plane 1 attached to CRTC 1 and plane 2 to CRTC 2 */ 763c204bf65SJosé Expósito vkms_config_plane_detach_crtc(plane_cfg1, crtc_cfg2); 764c204bf65SJosé Expósito vkms_config_plane_for_each_possible_crtc(plane_cfg1, idx, possible_crtc) { 765c204bf65SJosé Expósito n_crtcs++; 766c204bf65SJosé Expósito if (possible_crtc != crtc_cfg1) 767c204bf65SJosé Expósito KUNIT_FAIL(test, "Unexpected possible CRTC"); 768c204bf65SJosé Expósito } 769c204bf65SJosé Expósito KUNIT_ASSERT_EQ(test, n_crtcs, 1); 770c204bf65SJosé Expósito n_crtcs = 0; 771c204bf65SJosé Expósito 772c204bf65SJosé Expósito err = vkms_config_plane_attach_crtc(plane_cfg2, crtc_cfg2); 773c204bf65SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 774c204bf65SJosé Expósito vkms_config_plane_for_each_possible_crtc(plane_cfg2, idx, possible_crtc) { 775c204bf65SJosé Expósito n_crtcs++; 776c204bf65SJosé Expósito if (possible_crtc != crtc_cfg2) 777c204bf65SJosé Expósito KUNIT_FAIL(test, "Unexpected possible CRTC"); 778c204bf65SJosé Expósito } 779c204bf65SJosé Expósito KUNIT_ASSERT_EQ(test, n_crtcs, 1); 780c204bf65SJosé Expósito 781c204bf65SJosé Expósito vkms_config_destroy(config); 782c204bf65SJosé Expósito } 783c204bf65SJosé Expósito 784b8776fc9SJosé Expósito static void vkms_config_test_encoder_get_possible_crtcs(struct kunit *test) 785b8776fc9SJosé Expósito { 786b8776fc9SJosé Expósito struct vkms_config *config; 787b8776fc9SJosé Expósito struct vkms_config_encoder *encoder_cfg1, *encoder_cfg2; 788b8776fc9SJosé Expósito struct vkms_config_crtc *crtc_cfg1, *crtc_cfg2; 789b8776fc9SJosé Expósito struct vkms_config_crtc *possible_crtc; 790b8776fc9SJosé Expósito unsigned long idx = 0; 791b8776fc9SJosé Expósito int n_crtcs = 0; 792b8776fc9SJosé Expósito int err; 793b8776fc9SJosé Expósito 794b8776fc9SJosé Expósito config = vkms_config_create("test"); 795b8776fc9SJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 796b8776fc9SJosé Expósito 797b8776fc9SJosé Expósito encoder_cfg1 = vkms_config_create_encoder(config); 798b8776fc9SJosé Expósito encoder_cfg2 = vkms_config_create_encoder(config); 799b8776fc9SJosé Expósito crtc_cfg1 = vkms_config_create_crtc(config); 800b8776fc9SJosé Expósito crtc_cfg2 = vkms_config_create_crtc(config); 801b8776fc9SJosé Expósito 802b8776fc9SJosé Expósito /* No possible CRTCs */ 803b8776fc9SJosé Expósito vkms_config_encoder_for_each_possible_crtc(encoder_cfg1, idx, possible_crtc) 804b8776fc9SJosé Expósito KUNIT_FAIL(test, "Unexpected possible CRTC"); 805b8776fc9SJosé Expósito 806b8776fc9SJosé Expósito vkms_config_encoder_for_each_possible_crtc(encoder_cfg2, idx, possible_crtc) 807b8776fc9SJosé Expósito KUNIT_FAIL(test, "Unexpected possible CRTC"); 808b8776fc9SJosé Expósito 809b8776fc9SJosé Expósito /* Encoder 1 attached to CRTC 1 and 2 */ 810b8776fc9SJosé Expósito err = vkms_config_encoder_attach_crtc(encoder_cfg1, crtc_cfg1); 811b8776fc9SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 812b8776fc9SJosé Expósito err = vkms_config_encoder_attach_crtc(encoder_cfg1, crtc_cfg2); 813b8776fc9SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 814b8776fc9SJosé Expósito 815b8776fc9SJosé Expósito vkms_config_encoder_for_each_possible_crtc(encoder_cfg1, idx, possible_crtc) { 816b8776fc9SJosé Expósito n_crtcs++; 817b8776fc9SJosé Expósito if (possible_crtc != crtc_cfg1 && possible_crtc != crtc_cfg2) 818b8776fc9SJosé Expósito KUNIT_FAIL(test, "Unexpected possible CRTC"); 819b8776fc9SJosé Expósito } 820b8776fc9SJosé Expósito KUNIT_ASSERT_EQ(test, n_crtcs, 2); 821b8776fc9SJosé Expósito n_crtcs = 0; 822b8776fc9SJosé Expósito 823b8776fc9SJosé Expósito vkms_config_encoder_for_each_possible_crtc(encoder_cfg2, idx, possible_crtc) 824b8776fc9SJosé Expósito KUNIT_FAIL(test, "Unexpected possible CRTC"); 825b8776fc9SJosé Expósito 826b8776fc9SJosé Expósito /* Encoder 1 attached to CRTC 1 and encoder 2 to CRTC 2 */ 827b8776fc9SJosé Expósito vkms_config_encoder_detach_crtc(encoder_cfg1, crtc_cfg2); 828b8776fc9SJosé Expósito vkms_config_encoder_for_each_possible_crtc(encoder_cfg1, idx, possible_crtc) { 829b8776fc9SJosé Expósito n_crtcs++; 830b8776fc9SJosé Expósito if (possible_crtc != crtc_cfg1) 831b8776fc9SJosé Expósito KUNIT_FAIL(test, "Unexpected possible CRTC"); 832b8776fc9SJosé Expósito } 833b8776fc9SJosé Expósito KUNIT_ASSERT_EQ(test, n_crtcs, 1); 834b8776fc9SJosé Expósito n_crtcs = 0; 835b8776fc9SJosé Expósito 836b8776fc9SJosé Expósito err = vkms_config_encoder_attach_crtc(encoder_cfg2, crtc_cfg2); 837b8776fc9SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 838b8776fc9SJosé Expósito vkms_config_encoder_for_each_possible_crtc(encoder_cfg2, idx, possible_crtc) { 839b8776fc9SJosé Expósito n_crtcs++; 840b8776fc9SJosé Expósito if (possible_crtc != crtc_cfg2) 841b8776fc9SJosé Expósito KUNIT_FAIL(test, "Unexpected possible CRTC"); 842b8776fc9SJosé Expósito } 843b8776fc9SJosé Expósito KUNIT_ASSERT_EQ(test, n_crtcs, 1); 844b8776fc9SJosé Expósito 845b8776fc9SJosé Expósito vkms_config_destroy(config); 846b8776fc9SJosé Expósito } 847b8776fc9SJosé Expósito 848*2c7aafc0SJosé Expósito static void vkms_config_test_connector_get_possible_encoders(struct kunit *test) 849*2c7aafc0SJosé Expósito { 850*2c7aafc0SJosé Expósito struct vkms_config *config; 851*2c7aafc0SJosé Expósito struct vkms_config_connector *connector_cfg1, *connector_cfg2; 852*2c7aafc0SJosé Expósito struct vkms_config_encoder *encoder_cfg1, *encoder_cfg2; 853*2c7aafc0SJosé Expósito struct vkms_config_encoder *possible_encoder; 854*2c7aafc0SJosé Expósito unsigned long idx = 0; 855*2c7aafc0SJosé Expósito int n_encoders = 0; 856*2c7aafc0SJosé Expósito int err; 857*2c7aafc0SJosé Expósito 858*2c7aafc0SJosé Expósito config = vkms_config_create("test"); 859*2c7aafc0SJosé Expósito KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config); 860*2c7aafc0SJosé Expósito 861*2c7aafc0SJosé Expósito connector_cfg1 = vkms_config_create_connector(config); 862*2c7aafc0SJosé Expósito connector_cfg2 = vkms_config_create_connector(config); 863*2c7aafc0SJosé Expósito encoder_cfg1 = vkms_config_create_encoder(config); 864*2c7aafc0SJosé Expósito encoder_cfg2 = vkms_config_create_encoder(config); 865*2c7aafc0SJosé Expósito 866*2c7aafc0SJosé Expósito /* No possible encoders */ 867*2c7aafc0SJosé Expósito vkms_config_connector_for_each_possible_encoder(connector_cfg1, idx, 868*2c7aafc0SJosé Expósito possible_encoder) 869*2c7aafc0SJosé Expósito KUNIT_FAIL(test, "Unexpected possible encoder"); 870*2c7aafc0SJosé Expósito 871*2c7aafc0SJosé Expósito vkms_config_connector_for_each_possible_encoder(connector_cfg2, idx, 872*2c7aafc0SJosé Expósito possible_encoder) 873*2c7aafc0SJosé Expósito KUNIT_FAIL(test, "Unexpected possible encoder"); 874*2c7aafc0SJosé Expósito 875*2c7aafc0SJosé Expósito /* Connector 1 attached to encoders 1 and 2 */ 876*2c7aafc0SJosé Expósito err = vkms_config_connector_attach_encoder(connector_cfg1, encoder_cfg1); 877*2c7aafc0SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 878*2c7aafc0SJosé Expósito err = vkms_config_connector_attach_encoder(connector_cfg1, encoder_cfg2); 879*2c7aafc0SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 880*2c7aafc0SJosé Expósito 881*2c7aafc0SJosé Expósito vkms_config_connector_for_each_possible_encoder(connector_cfg1, idx, 882*2c7aafc0SJosé Expósito possible_encoder) { 883*2c7aafc0SJosé Expósito n_encoders++; 884*2c7aafc0SJosé Expósito if (possible_encoder != encoder_cfg1 && 885*2c7aafc0SJosé Expósito possible_encoder != encoder_cfg2) 886*2c7aafc0SJosé Expósito KUNIT_FAIL(test, "Unexpected possible encoder"); 887*2c7aafc0SJosé Expósito } 888*2c7aafc0SJosé Expósito KUNIT_ASSERT_EQ(test, n_encoders, 2); 889*2c7aafc0SJosé Expósito n_encoders = 0; 890*2c7aafc0SJosé Expósito 891*2c7aafc0SJosé Expósito vkms_config_connector_for_each_possible_encoder(connector_cfg2, idx, 892*2c7aafc0SJosé Expósito possible_encoder) 893*2c7aafc0SJosé Expósito KUNIT_FAIL(test, "Unexpected possible encoder"); 894*2c7aafc0SJosé Expósito 895*2c7aafc0SJosé Expósito /* Connector 1 attached to encoder 1 and connector 2 to encoder 2 */ 896*2c7aafc0SJosé Expósito vkms_config_connector_detach_encoder(connector_cfg1, encoder_cfg2); 897*2c7aafc0SJosé Expósito vkms_config_connector_for_each_possible_encoder(connector_cfg1, idx, 898*2c7aafc0SJosé Expósito possible_encoder) { 899*2c7aafc0SJosé Expósito n_encoders++; 900*2c7aafc0SJosé Expósito if (possible_encoder != encoder_cfg1) 901*2c7aafc0SJosé Expósito KUNIT_FAIL(test, "Unexpected possible encoder"); 902*2c7aafc0SJosé Expósito } 903*2c7aafc0SJosé Expósito KUNIT_ASSERT_EQ(test, n_encoders, 1); 904*2c7aafc0SJosé Expósito n_encoders = 0; 905*2c7aafc0SJosé Expósito 906*2c7aafc0SJosé Expósito err = vkms_config_connector_attach_encoder(connector_cfg2, encoder_cfg2); 907*2c7aafc0SJosé Expósito KUNIT_EXPECT_EQ(test, err, 0); 908*2c7aafc0SJosé Expósito vkms_config_connector_for_each_possible_encoder(connector_cfg2, idx, 909*2c7aafc0SJosé Expósito possible_encoder) { 910*2c7aafc0SJosé Expósito n_encoders++; 911*2c7aafc0SJosé Expósito if (possible_encoder != encoder_cfg2) 912*2c7aafc0SJosé Expósito KUNIT_FAIL(test, "Unexpected possible encoder"); 913*2c7aafc0SJosé Expósito } 914*2c7aafc0SJosé Expósito KUNIT_ASSERT_EQ(test, n_encoders, 1); 915*2c7aafc0SJosé Expósito 916*2c7aafc0SJosé Expósito vkms_config_destroy(config); 917*2c7aafc0SJosé Expósito } 918*2c7aafc0SJosé Expósito 9195b5a56d9SJosé Expósito static struct kunit_case vkms_config_test_cases[] = { 920d3ae1e39SJosé Expósito KUNIT_CASE(vkms_config_test_empty_config), 9218b059b0cSJosé Expósito KUNIT_CASE_PARAM(vkms_config_test_default_config, 9228b059b0cSJosé Expósito default_config_gen_params), 923bc5b0d5dSJosé Expósito KUNIT_CASE(vkms_config_test_get_planes), 924600df32dSJosé Expósito KUNIT_CASE(vkms_config_test_get_crtcs), 925f60a183dSJosé Expósito KUNIT_CASE(vkms_config_test_get_encoders), 926da38c720SJosé Expósito KUNIT_CASE(vkms_config_test_get_connectors), 927bc5b0d5dSJosé Expósito KUNIT_CASE(vkms_config_test_invalid_plane_number), 928bc5b0d5dSJosé Expósito KUNIT_CASE(vkms_config_test_valid_plane_type), 929c204bf65SJosé Expósito KUNIT_CASE(vkms_config_test_valid_plane_possible_crtcs), 930600df32dSJosé Expósito KUNIT_CASE(vkms_config_test_invalid_crtc_number), 931f60a183dSJosé Expósito KUNIT_CASE(vkms_config_test_invalid_encoder_number), 932b8776fc9SJosé Expósito KUNIT_CASE(vkms_config_test_valid_encoder_possible_crtcs), 933da38c720SJosé Expósito KUNIT_CASE(vkms_config_test_invalid_connector_number), 934*2c7aafc0SJosé Expósito KUNIT_CASE(vkms_config_test_valid_connector_possible_encoders), 935c204bf65SJosé Expósito KUNIT_CASE(vkms_config_test_attach_different_configs), 936c204bf65SJosé Expósito KUNIT_CASE(vkms_config_test_plane_attach_crtc), 937c204bf65SJosé Expósito KUNIT_CASE(vkms_config_test_plane_get_possible_crtcs), 938b8776fc9SJosé Expósito KUNIT_CASE(vkms_config_test_encoder_get_possible_crtcs), 939*2c7aafc0SJosé Expósito KUNIT_CASE(vkms_config_test_connector_get_possible_encoders), 9405b5a56d9SJosé Expósito {} 9415b5a56d9SJosé Expósito }; 9425b5a56d9SJosé Expósito 9435b5a56d9SJosé Expósito static struct kunit_suite vkms_config_test_suite = { 9445b5a56d9SJosé Expósito .name = "vkms-config", 9455b5a56d9SJosé Expósito .test_cases = vkms_config_test_cases, 9465b5a56d9SJosé Expósito }; 9475b5a56d9SJosé Expósito 9485b5a56d9SJosé Expósito kunit_test_suite(vkms_config_test_suite); 9495b5a56d9SJosé Expósito 9505b5a56d9SJosé Expósito MODULE_LICENSE("GPL"); 9515b5a56d9SJosé Expósito MODULE_DESCRIPTION("Kunit test for vkms config utility"); 952