From: "José Expósito" <jose.exposito89@gmail.com>
To: Louis Chauvet <louis.chauvet@bootlin.com>
Cc: igt-dev@lists.freedesktop.org
Subject: Re: [PATCH i-g-t 17/39] lib/vkms: Test attaching planes to CRTCs
Date: Thu, 13 Mar 2025 18:23:45 +0100 [thread overview]
Message-ID: <Z9MUoeXikUMyfyuw@fedora> (raw)
In-Reply-To: <afb75323-b874-470d-b059-ad500ad1008a@bootlin.com>
On Thu, Feb 27, 2025 at 02:15:01PM +0100, Louis Chauvet wrote:
>
>
> Le 18/02/2025 à 17:49, José Expósito a écrit :
> > Add helpers to attach and detach planes and CRTCs and a test checking
> > the different valid and invalid cases.
> >
> > Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> > ---
> > lib/igt_vkms.c | 91 ++++++++++++++++++++++++++++++++++++++
> > lib/igt_vkms.h | 4 ++
> > tests/vkms/vkms_configfs.c | 81 +++++++++++++++++++++++++++++++++
> > 3 files changed, 176 insertions(+)
> >
> > diff --git a/lib/igt_vkms.c b/lib/igt_vkms.c
> > index f5e193a1c..147234e5b 100644
> > --- a/lib/igt_vkms.c
> > +++ b/lib/igt_vkms.c
> > @@ -119,6 +119,22 @@ static const char *get_pipeline_item_dir_name(enum vkms_pipeline_item item)
> > igt_assert(!"Cannot be reached: Unknown VKMS pipeline item type");
> > }
> > +static const char *get_attach_dir_name(enum vkms_pipeline_item item)
> > +{
> > + switch (item) {
> > + case VKMS_PIPELINE_ITEM_PLANE:
> > + return "possible_crtcs";
> > + case VKMS_PIPELINE_ITEM_ENCODER:
> > + return "possible_crtcs";
> > + case VKMS_PIPELINE_ITEM_CONNECTOR:
> > + return "possible_encoders";
> > + default:
> > + break;
> > + }
> > +
> > + igt_assert(!"Cannot be reached: Unknown VKMS attach directory name");
> > +}
> > +
> > static void add_pipeline_item(igt_vkms_t *dev, enum vkms_pipeline_item item,
> > const char *name)
> > {
> > @@ -136,6 +152,51 @@ static void add_pipeline_item(igt_vkms_t *dev, enum vkms_pipeline_item item,
> > path, errno, strerror(errno));
> > }
> > +static bool attach_pipeline_item(igt_vkms_t *dev,
> > + enum vkms_pipeline_item src_item,
> > + const char *src_item_name,
> > + enum vkms_pipeline_item dst_item,
> > + const char *dst_item_name)
> > +{
> > + char src_path[PATH_MAX];
> > + char dst_path[PATH_MAX];
> > + const char *src_dir_name;
> > + const char *attach_dir_name;
> > + const char *dst_dir_name;
> > + int ret;
> > +
> > + src_dir_name = get_pipeline_item_dir_name(src_item);
> > + attach_dir_name = get_attach_dir_name(src_item);
> > + snprintf(src_path, sizeof(src_path), "%s/%s/%s/%s/%s", dev->path,
> > + src_dir_name, src_item_name, attach_dir_name, dst_item_name);
>
> The more I read those functions, the more I think my proposition of having
> full path for pipeline item is better than having only its name.
>
> Or maybe, to avoid the duplication a macro could help:
>
> #define ITEM_FMT "%s/%s/%s"
> #define ITEM_ARGS(dev, src_item, src_item_name) (dev),
> get_pipeline_item_dir_name((src_item)), (src_item_name)
>
> I don't see major drawbacks for both of my proposition, so take what you
> think is better.
>
> > +
> > + dst_dir_name = get_pipeline_item_dir_name(dst_item);
> > + snprintf(dst_path, sizeof(dst_path), "%s/%s/%s", dev->path,
> > + dst_dir_name, dst_item_name);
> > +
> > + ret = symlink(dst_path, src_path);
> > + return ret == 0;
>
> Why this function has a return value? For all the other igt_vkms_device_*
> functions, they return void, and do assertions to stop the test if it fails.
Attaching or detaching pipeline items can fail and I want to be able to test
both the success and the error cases from the tests.
While, it is true that this is not consistent with "igt_vkms_device_add_*()"
functions, adding new pipeline items is not expected to fail and returning a
boolean would add a bunch of additional assertions in the tests for no real
gain.
Jose
> > +}
> > +
> > +static bool detach_pipeline_item(igt_vkms_t *dev,
> > + enum vkms_pipeline_item src_item,
> > + const char *src_item_name,
> > + const char *dst_item_name)
> > +{
> > + char link_path[PATH_MAX];
> > + const char *src_dir_name;
> > + const char *attach_dir_name;
> > + int ret;
> > +
> > + src_dir_name = get_pipeline_item_dir_name(src_item);
> > + attach_dir_name = get_attach_dir_name(src_item);
> > + snprintf(link_path, sizeof(link_path), "%s/%s/%s/%s/%s", dev->path,
> > + src_dir_name, src_item_name, attach_dir_name, dst_item_name);
> > +
> > + ret = unlink(link_path);
> > + return ret == 0;
> > +}
> > +
> > /**
> > * igt_require_vkms_configfs:
> > *
> > @@ -368,6 +429,36 @@ void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type)
> > write_int(path, type);
> > }
> > +/**
> > + * igt_vkms_plane_attach_crtc:
> > + * @dev: Target device
> > + * @plane_name: Target plane name
> > + * @crtc_name: Destination CRTC name
> > + *
> > + * Attach a plane to a CRTC. Return true on success and false on error.
> > + */
> > +bool igt_vkms_plane_attach_crtc(igt_vkms_t *dev, const char *plane_name,
> > + const char *crtc_name)
> > +{
> > + return attach_pipeline_item(dev, VKMS_PIPELINE_ITEM_PLANE, plane_name,
> > + VKMS_PIPELINE_ITEM_CRTC, crtc_name);
> > +}
> > +
> > +/**
> > + * igt_vkms_plane_detach_crtc:
> > + * @dev: Target device
> > + * @plane_name: Target plane name
> > + * @crtc_name: Destination CRTC name
> > + *
> > + * Detach a plane from a CRTC. Return true on success and false on error.
> > + */
> > +bool igt_vkms_plane_detach_crtc(igt_vkms_t *dev, const char *plane_name,
> > + const char *crtc_name)
> > +{
> > + return detach_pipeline_item(dev, VKMS_PIPELINE_ITEM_PLANE, plane_name,
> > + crtc_name);
> > +}
> > +
> > /**
> > * igt_vkms_device_add_crtc:
> > * @dev: Device to add the CRTC to
> > diff --git a/lib/igt_vkms.h b/lib/igt_vkms.h
> > index 50f42aa4b..fc8db268b 100644
> > --- a/lib/igt_vkms.h
> > +++ b/lib/igt_vkms.h
> > @@ -32,6 +32,10 @@ void igt_vkms_device_set_enabled(igt_vkms_t *dev, bool enabled);
> > void igt_vkms_device_add_plane(igt_vkms_t *dev, const char *name);
> > int igt_vkms_plane_get_type(igt_vkms_t *dev, const char *name);
> > void igt_vkms_plane_set_type(igt_vkms_t *dev, const char *name, int type);
> > +bool igt_vkms_plane_attach_crtc(igt_vkms_t *dev, const char *plane_name,
> > + const char *crtc_name);
> > +bool igt_vkms_plane_detach_crtc(igt_vkms_t *dev, const char *plane_name,
> > + const char *crtc_name);
> > void igt_vkms_device_add_crtc(igt_vkms_t *dev, const char *name);
> > bool igt_vkms_crtc_is_writeback_enabled(igt_vkms_t *dev, const char *name);
> > diff --git a/tests/vkms/vkms_configfs.c b/tests/vkms/vkms_configfs.c
> > index ea84d9f82..e1572d65f 100644
> > --- a/tests/vkms/vkms_configfs.c
> > +++ b/tests/vkms/vkms_configfs.c
> > @@ -94,6 +94,20 @@ static void assert_wrong_bool_values(const char *path)
> > }
> > }
> > +static bool attach(const char *src_path, const char *dst_path,
> > + const char *link_name)
> > +{
> > + char link_path[PATH_MAX];
> > + int ret;
> > +
> > + ret = snprintf(link_path, sizeof(link_path), "%s/%s", src_path, link_name);
> > + igt_assert(ret >= 0 && ret < sizeof(link_path));
> > +
> > + ret = symlink(dst_path, link_path);
> > +
> > + return ret == 0;
> > +}
> > +
> > /**
> > * SUBTEST: device-default-files
> > * Description: Test that creating a VKMS device creates the default files and
> > @@ -476,6 +490,72 @@ static void test_connector_wrong_values(void)
> > igt_vkms_device_destroy(dev);
> > }
> > +/**
> > + * SUBTEST: attach-plane-to-crtc
> > + * Description: Check that errors are handled while attaching planes to CRTCs.
> > + */
> > +
> > +static void test_attach_plane_to_crtc(void)
> > +{
> > + igt_vkms_t *dev1;
> > + igt_vkms_t *dev2;
> > + char plane1[PATH_MAX];
> > + char crtc1[PATH_MAX];
> > + char connector1[PATH_MAX];
> > + char crtc2[PATH_MAX];
> > + char dev2_enabled_path[PATH_MAX];
> > + bool ok;
> > +
> > + dev1 = igt_vkms_device_create("test_attach_plane_to_crtc_1");
> > + igt_assert(dev1);
> > +
> > + dev2 = igt_vkms_device_create("test_attach_plane_to_crtc_2");
> > + igt_assert(dev2);
> > +
> > + igt_vkms_device_add_plane(dev1, "plane1");
> > + igt_vkms_device_add_crtc(dev1, "crtc1");
> > + igt_vkms_device_add_connector(dev1, "connector1");
> > + igt_vkms_device_add_crtc(dev2, "crtc2");
> > +
> > + snprintf(plane1, sizeof(plane1), "%s/planes/plane1/possible_crtcs",
> > + dev1->path);
> > + snprintf(crtc1, sizeof(crtc1), "%s/crtcs/crtc1", dev1->path);
> > + snprintf(connector1, sizeof(connector1), "%s/connectors/connector1",
> > + dev1->path);
> > + snprintf(crtc2, sizeof(crtc2), "%s/crtcs/crtc2", dev2->path);
> > + snprintf(dev2_enabled_path, sizeof(dev2_enabled_path), "%s/enabled",
> > + dev2->path);
> > +
> > + /* Error: Attach a plane to a connector */
> > + ok = attach(plane1, connector1, "connector");
> > + igt_assert_f(!ok, "Attaching plane1 to connector1 should fail\n");
> > +
> > + /* Error: Attach a plane to a random file */
> > + ok = attach(plane1, dev2_enabled_path, "file");
> > + igt_assert_f(!ok, "Attaching plane1 to a random file should fail\n");
> > +
> > + /* Error: Attach a plane to a CRTC from other device */
> > + ok = attach(plane1, crtc2, "crtc2");
> > + igt_assert_f(!ok, "Attaching plane1 to crtc2 should fail\n");
> > +
> > + /* OK: Attaching plane1 to crtc1 */
> > + ok = igt_vkms_plane_attach_crtc(dev1, "plane1", "crtc1");
> > + igt_assert_f(ok, "Error attaching plane1 to crtc1\n");
> > +
> > + /* Error: Attaching plane1 to crtc1 twice */
> > + ok = attach(plane1, crtc1, "crtc1_duplicated");
> > + igt_assert_f(!ok, "Error attaching plane1 to crtc1 twice should fail");
> > +
> > + /* OK: Detaching and attaching again */
> > + ok = igt_vkms_plane_detach_crtc(dev1, "plane1", "crtc1");
> > + igt_assert_f(ok, "Error detaching plane1 from crtc1\n");
> > + ok = igt_vkms_plane_attach_crtc(dev1, "plane1", "crtc1");
> > + igt_assert_f(ok, "Error attaching plane1 to crtc1\n");
> > +
> > + igt_vkms_device_destroy(dev1);
> > + igt_vkms_device_destroy(dev2);
> > +}
> > +
> > igt_main
> > {
> > struct {
> > @@ -495,6 +575,7 @@ igt_main
> > { "connector-default-files", test_connector_default_files },
> > { "connector-default-values", test_connector_default_values },
> > { "connector-wrong-values", test_connector_wrong_values },
> > + { "attach-plane-to-crtc", test_attach_plane_to_crtc },
> > };
> > igt_fixture {
>
> --
> Louis Chauvet, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
>
>
next prev parent reply other threads:[~2025-03-13 17:23 UTC|newest]
Thread overview: 84+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-18 16:49 [PATCH i-g-t 00/39] VKMS configfs tests José Expósito
2025-02-18 16:49 ` [PATCH i-g-t 01/39] lib/drmtest: Add VKMS as a known driver type José Expósito
2025-02-27 13:12 ` Louis Chauvet
2025-03-13 17:22 ` José Expósito
2025-02-18 16:49 ` [PATCH i-g-t 02/39] lib/igt_debugfs: Move is_mountpoint() to igt_aux José Expósito
2025-02-27 13:12 ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 03/39] lib/igt_configfs: Add helper to mount configfs José Expósito
2025-02-27 13:14 ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 04/39] lib/vkms: Add minimal VKMS library and test device default files José Expósito
2025-02-27 13:12 ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 05/39] lib/vkms: Allow to enable/disable VKMS devices José Expósito
2025-02-27 13:15 ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 06/39] tests/vkms_configfs: Test device invalid values José Expósito
2025-02-27 13:14 ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 07/39] lib/vkms: Test plane default files José Expósito
2025-02-27 13:15 ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 08/39] lib/vkms: Test plane default values José Expósito
2025-02-27 13:15 ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 09/39] lib/vkms: Test plane invalid values José Expósito
2025-02-27 13:14 ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 10/39] lib/vkms: Test CRTC default files José Expósito
2025-02-27 13:15 ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 11/39] lib/vkms: Test CRTC default values José Expósito
2025-02-27 13:12 ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 12/39] lib/vkms: Test CRTC invalid values José Expósito
2025-02-27 13:12 ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 13/39] lib/vkms: Test encoder default files José Expósito
2025-02-27 13:14 ` Louis Chauvet
2025-03-13 17:25 ` José Expósito
2025-02-18 16:49 ` [PATCH i-g-t 14/39] lib/vkms: Test connector " José Expósito
2025-02-18 16:49 ` [PATCH i-g-t 15/39] lib/vkms: Test connector default values José Expósito
2025-02-18 16:49 ` [PATCH i-g-t 16/39] lib/vkms: Test plane connector invalid values José Expósito
2025-02-27 13:12 ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 17/39] lib/vkms: Test attaching planes to CRTCs José Expósito
2025-02-27 13:15 ` Louis Chauvet
2025-03-13 17:23 ` José Expósito [this message]
2025-02-18 16:49 ` [PATCH i-g-t 18/39] lib/vkms: Test attaching encoders " José Expósito
2025-02-18 16:49 ` [PATCH i-g-t 19/39] lib/vkms: Test attaching connectors to encoders José Expósito
2025-02-18 16:49 ` [PATCH i-g-t 20/39] tests/vkms_configfs: Test enablement without pipeline items José Expósito
2025-02-27 13:06 ` Louis Chauvet
2025-02-28 1:47 ` Greg Kroah-Hartman
2025-02-28 11:58 ` José Expósito
2025-02-18 16:49 ` [PATCH i-g-t 21/39] lib/vkms: Create VKMS device from static config José Expósito
2025-02-27 14:30 ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 22/39] tests/vkms_configfs: Test adding too many planes José Expósito
2025-02-27 14:53 ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 23/39] tests/vkms_configfs: Test not adding a primary plane José Expósito
2025-02-27 14:54 ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 24/39] tests/vkms_configfs: Test adding multiple primary planes José Expósito
2025-02-27 15:00 ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 25/39] tests/vkms_configfs: Test adding multiple cursor planes José Expósito
2025-02-27 15:00 ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 26/39] tests/vkms_configfs: Test adding a plane without possible CRTCs José Expósito
2025-02-27 15:01 ` Louis Chauvet
2025-02-18 16:49 ` [PATCH i-g-t 27/39] tests/vkms_configfs: Test enabling a device without CRTCs José Expósito
2025-02-27 15:15 ` Louis Chauvet
2025-02-18 16:50 ` [PATCH i-g-t 28/39] tests/vkms_configfs: Test enabling a device with too many CRTCs José Expósito
2025-02-27 15:05 ` Louis Chauvet
2025-02-18 16:50 ` [PATCH i-g-t 29/39] tests/vkms_configfs: Test enabling a device without encoders José Expósito
2025-02-27 15:05 ` Louis Chauvet
2025-02-18 16:50 ` [PATCH i-g-t 30/39] tests/vkms_configfs: Test enabling a device with too many encoders José Expósito
2025-02-27 15:05 ` Louis Chauvet
2025-02-18 16:50 ` [PATCH i-g-t 31/39] tests/vkms_configfs: Test adding an encoder without possible CRTCs José Expósito
2025-02-27 15:15 ` Louis Chauvet
2025-02-18 16:50 ` [PATCH i-g-t 32/39] tests/vkms_configfs: Test adding a CRTC without encoders José Expósito
2025-02-27 15:15 ` Louis Chauvet
2025-02-18 16:50 ` [PATCH i-g-t 33/39] tests/vkms_configfs: Test enabling a device without connectors José Expósito
2025-02-27 15:15 ` Louis Chauvet
2025-02-18 16:50 ` [PATCH i-g-t 34/39] tests/vkms_configfs: Test enabling a device with too many connectors José Expósito
2025-02-27 15:15 ` Louis Chauvet
2025-02-18 16:50 ` [PATCH i-g-t 35/39] lib/vkms: Test changing enabled device planes José Expósito
2025-02-28 8:51 ` Louis Chauvet
2025-02-28 11:52 ` José Expósito
2025-02-28 22:15 ` Louis Chauvet
2025-02-18 16:50 ` [PATCH i-g-t 36/39] lib/vkms: Test changing enabled device CRTCs José Expósito
2025-02-18 16:50 ` [PATCH i-g-t 37/39] lib/vkms: Test changing enabled device encoders José Expósito
2025-02-18 16:50 ` [PATCH i-g-t 38/39] lib/vkms: Test changing enabled device connectors José Expósito
2025-02-18 16:50 ` [PATCH i-g-t 39/39] tests/vkms_configfs: Test connector hot-plug José Expósito
2025-02-28 8:51 ` Louis Chauvet
2025-02-27 13:11 ` [PATCH i-g-t 00/39] VKMS configfs tests Louis Chauvet
2025-02-28 21:22 ` ✓ Xe.CI.BAT: success for VKMS configfs tests (rev3) Patchwork
2025-02-28 21:25 ` ✓ i915.CI.BAT: " Patchwork
2025-03-01 5:04 ` ✗ Xe.CI.Full: failure " Patchwork
2025-03-01 9:43 ` ✗ i915.CI.Full: " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Z9MUoeXikUMyfyuw@fedora \
--to=jose.exposito89@gmail.com \
--cc=igt-dev@lists.freedesktop.org \
--cc=louis.chauvet@bootlin.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.