[Intel-gfx] [PATCH i-g-t 1/2] lib: add functions to change connector states

Daniel Vetter daniel at ffwll.ch
Mon May 19 16:28:25 CEST 2014


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).

> +{
> +	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);

> +{
> +	drmModeRes *res;
> +	drmModeConnector *c;
> +
> +	res = drmModeGetResources(drm_fd);
> +
> +	/* find the vga connector */
> +	for (int i = 0; i < res->count_connectors; i++) {
> +
> +		c = drmModeGetConnector(drm_fd, res->connectors[i]);
> +
> +		if (c->connector_type == DRM_MODE_CONNECTOR_VGA)
> +			break;
> +
> +		drmModeFreeConnector(c);
> +	}
> +
> +	kmstest_force_connector(drm_fd, c, state);
> +
> +	drmModeFreeConnector(c);
> +}
> diff --git a/lib/igt_kms.h b/lib/igt_kms.h
> index 8e80d4b..71f6831 100644
> --- a/lib/igt_kms.h
> +++ b/lib/igt_kms.h
> @@ -75,11 +75,20 @@ struct kmstest_connector_config {
>  	int pipe;
>  };
>  
> +enum force_connector {
> +	FORCE_CONNECTOR_UNSPECIFIED,
> +	FORCE_CONNECTOR_ON,
> +	FORCE_CONNECTOR_DIGITAL,
> +	FORCE_CONNECTOR_OFF
> +};
> +
>  int kmstest_get_connector_default_mode(int drm_fd, drmModeConnector *connector,
>  				      drmModeModeInfo *mode);
>  int kmstest_get_connector_config(int drm_fd, uint32_t connector_id,
>  				 unsigned long crtc_idx_mask,
>  				 struct kmstest_connector_config *config);
> +void kmstest_force_connector(int fd, drmModeConnector *connector,
> +			     enum force_connector state);
>  void kmstest_free_connector_config(struct kmstest_connector_config *config);
>  
>  void kmstest_dump_mode(drmModeModeInfo *mode);
> @@ -175,5 +184,8 @@ void igt_wait_for_vblank(int drm_fd, enum pipe pipe);
>  
>  #define IGT_FIXED(i,f)	((i) << 16 | (f))
>  
> +
> +void igt_set_vga_connector_state(int drm_fd, enum force_connector state);
> +
>  #endif /* __IGT_KMS_H__ */
>  
> diff --git a/tests/Makefile.sources b/tests/Makefile.sources
> index fbf63e9..eff0124 100644
> --- a/tests/Makefile.sources
> +++ b/tests/Makefile.sources
> @@ -134,6 +134,7 @@ TESTS_progs = \
>  	gen3_render_tiledx_blits \
>  	gen3_render_tiledy_blits \
>  	gen7_forcewake_mt \
> +	kms_force_connector \
>  	kms_sink_crc_basic \
>  	pm_psr \
>  	pm_rc6_residency \
> diff --git a/tests/kms_force_connector.c b/tests/kms_force_connector.c
> new file mode 100644
> index 0000000..b2659ae
> --- /dev/null
> +++ b/tests/kms_force_connector.c
> @@ -0,0 +1,87 @@
> +/*
> + * Copyright © 2014 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + *
> + */
> +
> +#include "igt_core.h"
> +#include "igt_kms.h"
> +#include "drmtest.h"
> +
> +int
> +main (int argc, char **argv)
> +{
> +	/* force the VGA & HDMI output and test it worked */
> +	int drm_fd;
> +	drmModeRes *res;
> +	drmModeConnector *c, *temp;
> +
> +	igt_simple_init();
> +
> +	drm_fd = drm_open_any();
> +	res = drmModeGetResources(drm_fd);
> +
> +	/* find the vga connector */
> +	for (int i = 0; i < res->count_connectors; i++) {
> +
> +		c = drmModeGetConnector(drm_fd, res->connectors[i]);
> +
> +		if (c->connector_type == DRM_MODE_CONNECTOR_LVDS)
> +			break;
> +
> +		drmModeFreeConnector(c);
> +	}
> +
> +	/* force the connector state and check the reported value */
> +	kmstest_force_connector(drm_fd, c, FORCE_CONNECTOR_ON);
> +	temp = drmModeGetConnector(drm_fd, c->connector_id);
> +	igt_assert(temp->connection == DRM_MODE_CONNECTED);
> +	igt_assert(temp->count_modes > 0);
> +	drmModeFreeConnector(temp);
> +
> +	/* attempt to use the display */
> +	{
> +		igt_display_t display;
> +
> +		igt_set_vt_graphics_mode();
> +
> +		igt_display_init(&display, drm_fd);
> +		igt_display_commit(&display);
> +	}
> +
> +
> +	kmstest_force_connector(drm_fd, c, FORCE_CONNECTOR_OFF);
> +	temp = drmModeGetConnector(drm_fd, c->connector_id);
> +	igt_assert(temp->connection == DRM_MODE_DISCONNECTED);
> +	igt_assert(temp->count_modes = 0);
> +	drmModeFreeConnector(temp);
> +
> +
> +	/* check that the previous state is restored */
> +	kmstest_force_connector(drm_fd, c, FORCE_CONNECTOR_UNSPECIFIED);
> +	temp = drmModeGetConnector(drm_fd, c->connector_id);
> +	igt_assert(temp->connection == c->connection);
> +	drmModeFreeConnector(temp);
> +
> +	drmModeFreeConnector(c);
> +
> +	igt_success();
> +}
> -- 
> 1.9.0
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch



More information about the Intel-gfx mailing list