[Intel-gfx] [PATCH i-g-t 1/2] lib: add functions to change connector states
Daniel Vetter
daniel at ffwll.ch
Mon May 19 17:16:29 CEST 2014
On Mon, May 19, 2014 at 03:57:36PM +0100, Thomas Wood wrote:
> On 19 May 2014 15:28, Daniel Vetter <daniel at ffwll.ch> wrote:
> > On Mon, May 19, 2014 at 02:42:07PM +0100, Thomas Wood wrote:
> >> Add a function to force a particular state on a connector and a
> >> convenience function to find and set the state on the VGA connector.
> >>
> >> Signed-off-by: Thomas Wood <thomas.wood at intel.com>
> >> ---
> >> lib/igt_kms.c | 78 ++++++++++++++++++++++++++++++++++++++++
> >> lib/igt_kms.h | 12 +++++++
> >> tests/Makefile.sources | 1 +
> >> tests/kms_force_connector.c | 87 +++++++++++++++++++++++++++++++++++++++++++++
> >> 4 files changed, 178 insertions(+)
> >> create mode 100644 tests/kms_force_connector.c
> >>
> >> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> >> index d00250d..90c3e56 100644
> >> --- a/lib/igt_kms.c
> >> +++ b/lib/igt_kms.c
> >> @@ -384,6 +384,61 @@ err1:
> >> return -1;
> >> }
> >>
> >> +static int get_card_number(int fd)
> >> +{
> >> + struct stat buf;
> >> +
> >> + /* find the minor number of the device */
> >> + fstat(fd, &buf);
> >> +
> >> + return minor(buf.st_rdev);
> >> +}
> >> +
> >> +/**
> >> + * kmstest_force_connector:
> >> + * @fd: drm file descriptor
> >> + * @connector: connector
> >> + * @state: state to force on @connector
> >> + *
> >> + * Force the specified state on the specified connector.
> >> + */
> >> +void kmstest_force_connector(int drm_fd, drmModeConnector *connector, enum
> >> + force_connector state)
> >
> > Hm, for the interface I've thought more about
> > kmsttest_force_connector(drm_fd, connector, edid) since most often we
> > don't just want to force the state, but set a specific EDID (for a
> > high-res mode or something similar).
>
> Many tests don't need a specific mode, so the default ones are fine.
> Obviously in those cases they may just be able to pass NULL for the
> edid in the prototype you suggested, but the main thing here is to be
> able to enable the connector and use it. Another consideration when
> setting edid would be to prevent arbitrary edid values being set on a
> connector that actually has a display connected.
Yeah, sanity checks are missing, too. Wrt the edid I've thought we could
just add some random 1080p panel with a pile of modes to keep things
interesting. 1024x756 is kinda low-res nowadays, so not really that
interesting for testing.
Same with hdmi/dp (if we get around to that): Imo the default injection
should be a really big panel so that we have lots of upscaled modes and
good chances to stress-test the watermark code a bit.
>
> >
> >> +{
> >> + char *path;
> >> + const char *value;
> >> + int sysfs_fd, ret;
> >> +
> >> + switch (state) {
> >> + case FORCE_CONNECTOR_UNSPECIFIED:
> >> + value = "unspecified";
> >> + break;
> >> + case FORCE_CONNECTOR_ON:
> >> + value = "on";
> >> + break;
> >> + case FORCE_CONNECTOR_DIGITAL:
> >> + value = "digital";
> >> + break;
> >> + case FORCE_CONNECTOR_OFF:
> >> + value = "off";
> >> + break;
> >> + }
> >> +
> >> + asprintf(&path, "/sys/class/drm/card%d-%s-%d/force",
> >> + get_card_number(drm_fd),
> >> + kmstest_connector_type_str(connector->connector_type),
> >> + connector->connector_type_id);
> >> + sysfs_fd = open(path, O_WRONLY | O_TRUNC);
> >> + free(path);
> >> +
> >> + igt_assert(sysfs_fd != -1);
> >> +
> >> + ret = write(sysfs_fd, value, strlen(value) + 1);
> >> + close(sysfs_fd);
> >> +
> >> + igt_assert(ret != -1);
> >> +}
> >
> > We need an exit handler to clean up this mess again ;-)
> >
> >> +
> >> void kmstest_free_connector_config(struct kmstest_connector_config *config)
> >> {
> >> drmModeFreeCrtc(config->crtc);
> >> @@ -1047,3 +1102,26 @@ void igt_wait_for_vblank(int drm_fd, enum pipe pipe)
> >>
> >> igt_assert(drmWaitVBlank(drm_fd, &wait_vbl) == 0);
> >> }
> >> +
> >> +void igt_set_vga_connector_state(int drm_fd, enum force_connector state)
> >
> > Hm, for the higher-level library I've thought we'd just force everything
> > we reaosonable can, so I'd drop the vga here and also the state. So maybe
> > just igt_enable_fake_connectors(drm_fd, flags);
>
> How would the state be reset? Using an exit handler?
Yeah, if the low-level code has some bookmarking + cleanup handlers the
high-level doesn't need to do much. Maybe we could expose a general reset
function, which could be used by tests to reset injection state if they
have special needs.
-Daniel
--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
More information about the Intel-gfx
mailing list