From nobody Mon Dec 15 21:56:53 2025 Received: from relay2-d.mail.gandi.net (relay2-d.mail.gandi.net [217.70.183.194]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DAE981F12F7 for ; Tue, 21 Jan 2025 10:55:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.194 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737456949; cv=none; b=VDaAVZ8cLjFjJXMUlgUfb/4C8b8GbCtetiSIBq11ISV3hhxVKyNmAdD3y0PznOmBR5KATFjVbGWraRBgca1pN3hoGfD0XjzJS5VLXHT2MXNswIXWDZXuojZnd2FbrDOwiwC7Er32WEVXNgBpJdlQ6bPDgeJ6CrKDSRRDuIik42k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737456949; c=relaxed/simple; bh=TdAiaY7K4To7ayPwrxgH2o4ItNXyv04HwPf+t0hDlXQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KFhe/TSVe8WXdqg1FIXmribGoCfeBpM90UDiNp75VrI2ukJUz58vNff+Pl8HksJrfJQqIKRFvS09/Ei/VLA5xTP06Wki0bHReeWAXinJvq1GBcm49JbAlxrNDIs23DBePqZTBPkDoRIyTqTRo7YmplgsD7ArR+z7R9s4i0TSMlU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=JUyIfvh0; arc=none smtp.client-ip=217.70.183.194 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="JUyIfvh0" Received: by mail.gandi.net (Postfix) with ESMTPSA id AB25440017; Tue, 21 Jan 2025 10:55:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1737456943; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=pyoz6hGAiMXFfiBD2XG/lRALUOk86qPhSdruGkc+xRY=; b=JUyIfvh0nvn/aj8byXQJUYYj/x1+eLENlzwYKfWJQf1lB4waOxhzFSRm+sbJQBbGKqWJdu FUHel23dlpdnjk56WAaapODry/vy8i5+TdEKo0og1VVffjQMXPMNt2hwwm6dVk4ou7KQC9 9rBgiTOXsI9+Ppo1zlar4jjo7A3F8DBf4PdBUWzQwKoPmwWF2f2K65WSDBipoy+CPSu7zv To5kgjD2A4Qv/jdHmdJQu9gxVYxu8FmlhAsQQcTTGYHXp9FhCDEDnq01n0eYAXiwhCxPoZ Gc3YKa1Z9+Hl0/9brllmuTIGm92ggQ3AMESTcUs6TzexMdAZL/1TNfxg7qXB6g== From: Louis Chauvet Date: Tue, 21 Jan 2025 11:55:34 +0100 Subject: [PATCH v3 10/16] drm/vkms: Add test for config structure Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250121-google-remove-crtc-index-from-parameter-v3-10-cac00a3c3544@bootlin.com> References: <20250121-google-remove-crtc-index-from-parameter-v3-0-cac00a3c3544@bootlin.com> In-Reply-To: <20250121-google-remove-crtc-index-from-parameter-v3-0-cac00a3c3544@bootlin.com> To: =?utf-8?q?Ma=C3=ADra_Canal?= , Haneen Mohammed , Simona Vetter , Melissa Wen , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie Cc: arthurgrillo@riseup.net, jeremie.dautheribes@bootlin.com, miquel.raynal@bootlin.com, thomas.petazzoni@bootlin.com, seanpaul@google.com, nicolejadeyee@google.com, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Louis Chauvet X-Mailer: b4 0.15-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=7076; i=louis.chauvet@bootlin.com; h=from:subject:message-id; bh=TdAiaY7K4To7ayPwrxgH2o4ItNXyv04HwPf+t0hDlXQ=; b=owEBbQKS/ZANAwAIASCtLsZbECziAcsmYgBnj30je8wQP1UMU1zQ0+mMW3sui59CBDtI5FAeb JOM9mVrelWJAjMEAAEIAB0WIQRPj7g/vng8MQxQWQQgrS7GWxAs4gUCZ499IwAKCRAgrS7GWxAs 4uwYD/9I3wgiqhK37VvX20c28qoVmmFQ5I6h07ZoZqBqLp9vSsTe6wDM1xpHY9EXF7AgO5MuCAZ WwVpA9O4n3fkEyzddS7j8A57yNkNqEG72ouafiFBdNTQhuoNNoBfFYAtDJsVL6NPtSjIbNrY4xu tZx1JoeXdWkYgpL+ginfuS2g7qCGys/Nx8B3fsiFJOZ+3YCGV43SloMdafZd/+o/cZoQk/g5AIU LfZtwj1aE+dGOMpob5Eey70NspNzpYWeZz+ET8YP2d7Gt/A6HZDpBaZCc/V1zMXIMsiPW4sO6DN 9d1ARtv6pyw4g4PTf9vE/pRif2LImT73U9KSU4z1WazuNVBCvBUlU2jDfLinNLPYgyVP6NijKu9 ZLRuhEcTSObBvUPOnJKXSaMWCRii8iT0EMXTbZEJcAem1LOH/+m4/fVXigsOml30wSKk5jojwZ9 D2K+pTxvzlJFQFNhLV/s8LpjXpgjksFsZSYokSnCK1Srhva+dgKhAsqHxkj0gAHxZBW6ernRZdd iUVjM5EZUAdykDuis3IFT6VWOiE4egg7f+N/jhMPkTh0MOzue/OOvI2Lv0DN5sf8ez6AyJmPa5j e1WU0vMbgF7UtGLCxBxv++dlepjwlpxKY1DkJO/qiozMsJHKVKrTqzJPVV3uAkYtQzcZE43BR7I 2eG8ekubFXKEPXA== X-Developer-Key: i=louis.chauvet@bootlin.com; a=openpgp; fpr=8B7104AE9A272D6693F527F2EC1883F55E0B40A5 X-GND-Sasl: louis.chauvet@bootlin.com The config structure is a bit complex in term of memory management. Add basic test to avoid breaking it in the future. Signed-off-by: Louis Chauvet --- drivers/gpu/drm/vkms/tests/Makefile | 3 + drivers/gpu/drm/vkms/tests/vkms_config_test.c | 137 ++++++++++++++++++++++= ++++ 2 files changed, 140 insertions(+) diff --git a/drivers/gpu/drm/vkms/tests/Makefile b/drivers/gpu/drm/vkms/tes= ts/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..b78371d08aa9531a5151225cc33= e34452225832c --- /dev/null +++ b/drivers/gpu/drm/vkms/tests/Makefile @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: GPL-2.0-only + +obj-$(CONFIG_DRM_VKMS_KUNIT_TESTS) +=3D vkms_config_test.o diff --git a/drivers/gpu/drm/vkms/tests/vkms_config_test.c b/drivers/gpu/dr= m/vkms/tests/vkms_config_test.c new file mode 100644 index 0000000000000000000000000000000000000000..f7a2b8ecd4e1f791e9abc86659e= f459e3ea8be43 --- /dev/null +++ b/drivers/gpu/drm/vkms/tests/vkms_config_test.c @@ -0,0 +1,137 @@ +// SPDX-License-Identifier: GPL-2.0+ + +#include + +#include "../vkms_config.h" + +MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING"); + +static void vkms_config_test_basic_allocation(struct kunit *test) +{ + struct vkms_config *config =3D vkms_config_create(); + + KUNIT_EXPECT_TRUE_MSG(test, list_empty(&config->encoders), + "Encoder list is not empty after allocation"); + KUNIT_EXPECT_TRUE_MSG(test, list_empty(&config->crtcs), + "CRTC list is not empty after allocation"); + KUNIT_EXPECT_TRUE_MSG(test, list_empty(&config->planes), + "Plane list is not empty after allocation"); + + vkms_config_destroy(config); +} + +static void vkms_config_test_simple_config(struct kunit *test) +{ + struct vkms_config *config =3D vkms_config_create(); + + struct vkms_config_plane *plane_1 =3D vkms_config_create_plane(config); + struct vkms_config_plane *plane_2 =3D vkms_config_create_plane(config); + struct vkms_config_crtc *crtc =3D vkms_config_create_crtc(config); + struct vkms_config_encoder *encoder =3D vkms_config_create_encoder(config= ); + + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + KUNIT_EXPECT_EQ(test, list_count_nodes(&config->planes), 2); + KUNIT_EXPECT_EQ(test, list_count_nodes(&config->crtcs), 1); + KUNIT_EXPECT_EQ(test, list_count_nodes(&config->encoders), 1); + + plane_1->type =3D DRM_PLANE_TYPE_PRIMARY; + plane_2->type =3D DRM_PLANE_TYPE_CURSOR; + + KUNIT_EXPECT_EQ(test, vkms_config_plane_attach_crtc(plane_1, crtc), 0); + KUNIT_EXPECT_EQ(test, vkms_config_plane_attach_crtc(plane_2, crtc), 0); + KUNIT_EXPECT_EQ(test, vkms_config_encoder_attach_crtc(encoder, crtc), 0); + + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + vkms_config_delete_plane(plane_1, config); + KUNIT_EXPECT_EQ(test, list_count_nodes(&config->planes), 1); + KUNIT_EXPECT_EQ(test, list_count_nodes(&config->crtcs), 1); + KUNIT_EXPECT_EQ(test, list_count_nodes(&config->encoders), 1); + + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + + plane_2->type =3D DRM_PLANE_TYPE_PRIMARY; + + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + vkms_config_destroy(config); +} + +static void vkms_config_test_complex_config(struct kunit *test) +{ + struct vkms_config *config =3D vkms_config_create(); + + struct vkms_config_plane *plane_1 =3D vkms_config_create_plane(config); + struct vkms_config_plane *plane_2 =3D vkms_config_create_plane(config); + struct vkms_config_plane *plane_3 =3D vkms_config_create_plane(config); + struct vkms_config_plane *plane_4 =3D vkms_config_create_plane(config); + struct vkms_config_plane *plane_5 =3D vkms_config_create_plane(config); + struct vkms_config_plane *plane_6 =3D vkms_config_create_plane(config); + struct vkms_config_plane *plane_7 =3D vkms_config_create_plane(config); + struct vkms_config_plane *plane_8 =3D vkms_config_create_plane(config); + struct vkms_config_crtc *crtc_1 =3D vkms_config_create_crtc(config); + struct vkms_config_crtc *crtc_2 =3D vkms_config_create_crtc(config); + struct vkms_config_encoder *encoder_1 =3D vkms_config_create_encoder(conf= ig); + struct vkms_config_encoder *encoder_2 =3D vkms_config_create_encoder(conf= ig); + struct vkms_config_encoder *encoder_3 =3D vkms_config_create_encoder(conf= ig); + struct vkms_config_encoder *encoder_4 =3D vkms_config_create_encoder(conf= ig); + + KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config)); + KUNIT_EXPECT_EQ(test, list_count_nodes(&config->planes), 8); + KUNIT_EXPECT_EQ(test, list_count_nodes(&config->crtcs), 2); + KUNIT_EXPECT_EQ(test, list_count_nodes(&config->encoders), 4); + + plane_1->type =3D DRM_PLANE_TYPE_PRIMARY; + plane_2->type =3D DRM_PLANE_TYPE_CURSOR; + plane_3->type =3D DRM_PLANE_TYPE_OVERLAY; + plane_4->type =3D DRM_PLANE_TYPE_OVERLAY; + plane_5->type =3D DRM_PLANE_TYPE_PRIMARY; + plane_6->type =3D DRM_PLANE_TYPE_CURSOR; + plane_7->type =3D DRM_PLANE_TYPE_OVERLAY; + plane_8->type =3D DRM_PLANE_TYPE_OVERLAY; + + KUNIT_EXPECT_EQ(test, vkms_config_plane_attach_crtc(plane_1, crtc_1), 0); + KUNIT_EXPECT_EQ(test, vkms_config_plane_attach_crtc(plane_2, crtc_1), 0); + KUNIT_EXPECT_EQ(test, vkms_config_plane_attach_crtc(plane_3, crtc_1), 0); + KUNIT_EXPECT_EQ(test, vkms_config_plane_attach_crtc(plane_4, crtc_1), 0); + KUNIT_EXPECT_EQ(test, vkms_config_plane_attach_crtc(plane_5, crtc_2), 0); + KUNIT_EXPECT_EQ(test, vkms_config_plane_attach_crtc(plane_6, crtc_2), 0); + KUNIT_EXPECT_EQ(test, vkms_config_plane_attach_crtc(plane_7, crtc_2), 0); + KUNIT_EXPECT_EQ(test, vkms_config_plane_attach_crtc(plane_8, crtc_2), 0); + KUNIT_EXPECT_EQ(test, vkms_config_plane_attach_crtc(plane_3, crtc_2), 0); + KUNIT_EXPECT_EQ(test, vkms_config_plane_attach_crtc(plane_4, crtc_2), 0); + + KUNIT_EXPECT_EQ(test, vkms_config_encoder_attach_crtc(encoder_1, crtc_1),= 0); + KUNIT_EXPECT_EQ(test, vkms_config_encoder_attach_crtc(encoder_2, crtc_1),= 0); + KUNIT_EXPECT_EQ(test, vkms_config_encoder_attach_crtc(encoder_3, crtc_1),= 0); + KUNIT_EXPECT_EQ(test, vkms_config_encoder_attach_crtc(encoder_3, crtc_2),= 0); + KUNIT_EXPECT_EQ(test, vkms_config_encoder_attach_crtc(encoder_4, crtc_2),= 0); + + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + vkms_config_delete_plane(plane_4, config); + KUNIT_EXPECT_EQ(test, list_count_nodes(&config->planes), 7); + KUNIT_EXPECT_EQ(test, list_count_nodes(&config->crtcs), 2); + KUNIT_EXPECT_EQ(test, list_count_nodes(&config->encoders), 4); + + KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config)); + + vkms_config_destroy(config); +} + +static struct kunit_case vkms_config_test_cases[] =3D { + KUNIT_CASE(vkms_config_test_basic_allocation), + KUNIT_CASE(vkms_config_test_simple_config), + KUNIT_CASE(vkms_config_test_complex_config), + {} +}; + +static struct kunit_suite vkms_config_test_suite =3D { + .name =3D "vkms-config", + .test_cases =3D vkms_config_test_cases, +}; + +kunit_test_suite(vkms_config_test_suite); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Kunit test for vkms config utility"); --=20 2.47.1