[igt-dev] [PATCH i-g-t 1/2] lib: Add DRRS helpers

Ville Syrjälä ville.syrjala at linux.intel.com
Wed Apr 13 19:59:54 UTC 2022


On Tue, Apr 05, 2022 at 12:12:14PM -0700, José Roberto de Souza wrote:
> Due to recent refactors in i915, it completely changed
> i915_drrs_status breaking all DRRS tests in kms_frontbuffer_tracking
> so here adding DRRS helpers to a separate file so it can be used by
> kms_frontbuffer_tracking and any future tests.
> 
> Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
> Signed-off-by: José Roberto de Souza <jose.souza at intel.com>
> ---
>  lib/igt_drrs.c  | 151 ++++++++++++++++++++++++++++++++++++++++++++++++
>  lib/igt_drrs.h  |  31 ++++++++++
>  lib/meson.build |   1 +
>  3 files changed, 183 insertions(+)
>  create mode 100644 lib/igt_drrs.c
>  create mode 100644 lib/igt_drrs.h
> 
> diff --git a/lib/igt_drrs.c b/lib/igt_drrs.c
> new file mode 100644
> index 0000000000..8c424c32e3
> --- /dev/null
> +++ b/lib/igt_drrs.c
> @@ -0,0 +1,151 @@
> +/*
> + * Copyright © 2022 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 "drmtest.h"
> +#include "igt_drrs.h"
> +
> +#define DRRS_ENABLE_STR "DRRS Enabled: "
> +#define DRRS_ACTIVE_STR "DRRS Active: "
> +#define DRRS_REFRESH_RATE_STR "DRRS refresh rate: "
> +
> +struct drrs_status {
> +	bool enabled;
> +	bool active;
> +	bool low_refresh_rate;
> +};
> +
> +static bool is_yes_or_no(char *ch)
> +{
> +	return strncmp(ch, "yes", 3) == 0;
> +}
> +
> +static const char *yes_or_no(bool r)
> +{
> +	return r ? "yes" : "no";
> +}
> +
> +static bool parse(int debugfs_fd, enum pipe pipe, struct drrs_status *status)
> +{
> +	char buf[1024], search[16], *ch;
> +	int ret;
> +
> +	ret = igt_debugfs_simple_read(debugfs_fd, "i915_drrs_status", buf,
> +				      sizeof(buf));
> +	if (ret < 0) {
> +		igt_info("Could not read i915_drrs_status: %s\n",
> +			 strerror(-ret));
> +		return false;
> +	}
> +
> +	snprintf(search, sizeof(search), ":pipe %s]:", kmstest_pipe_name(pipe));

We should probably just move DRRS over to per-crtc/connector
debugfs files. Would avoid nasty stuff like this.

> +	ch = strstr(buf, search);
> +	if (!ch)
> +		return false;
> +
> +	ch = strstr(buf, DRRS_ENABLE_STR);
> +	if (!ch)
> +		return false;
> +	ch += sizeof(DRRS_ENABLE_STR);
> +	status->enabled = is_yes_or_no(ch);
> +
> +	ch = strstr(buf, DRRS_ACTIVE_STR);
> +	if (!ch)
> +		return false;
> +	ch += sizeof(DRRS_ACTIVE_STR);
> +	status->active = is_yes_or_no(ch);
> +
> +	ch = strstr(buf, DRRS_REFRESH_RATE_STR);
> +	if (!ch)
> +		return false;
> +	ch += sizeof(DRRS_REFRESH_RATE_STR);
> +	status->low_refresh_rate = strncmp(ch, "low", 3) == 0;
> +
> +	return true;
> +}
> +
> +bool drrs_is_enabled(int debugfs_fd, enum pipe pipe)
> +{
> +	struct drrs_status status;
> +	bool ret;
> +
> +	ret = parse(debugfs_fd, pipe, &status);
> +	if (!ret)
> +		return false;
> +
> +	return status.enabled;
> +}
> +
> +bool drrs_is_active(int debugfs_fd, enum pipe pipe)
> +{
> +	struct drrs_status status;
> +	bool ret;
> +
> +	ret = parse(debugfs_fd, pipe, &status);
> +	if (!ret)
> +		return false;
> +
> +	return status.active;
> +}
> +
> +bool drrs_is_low_refresh_rate(int debugfs_fd, enum pipe pipe)
> +{
> +	struct drrs_status status;
> +	bool ret;
> +
> +	ret = parse(debugfs_fd, pipe, &status);
> +	if (!ret)
> +		return false;
> +
> +	return status.low_refresh_rate;
> +}
> +
> +bool drrs_write_status(int debugfs_fd, enum pipe pipe, char *buf, int len)
> +{
> +	struct drrs_status status;
> +	int ret, used = 0;
> +
> +	ret = parse(debugfs_fd, pipe, &status);
> +	if (!ret)
> +		return false;
> +
> +	ret = snprintf(buf, len - used, DRRS_ENABLE_STR "%s\n",
> +		       yes_or_no(status.enabled));
> +	if (ret < 0 || ret >= (len - used))
> +		return false;
> +	used += ret;
> +	buf += ret;
> +
> +	ret = snprintf(buf, len - used, DRRS_ACTIVE_STR "%s\n",
> +		       yes_or_no(status.active));
> +	if (ret < 0 || ret >= (len - used))
> +		return false;
> +	used += ret;
> +	buf += ret;
> +
> +	ret = snprintf(buf, len - used, DRRS_REFRESH_RATE_STR "%s\n",
> +		       status.low_refresh_rate ? "low" : "high");
> +	if (ret < 0 || ret >= (len - used))
> +		return false;
> +
> +	return true;
> +}
> \ No newline at end of file
> diff --git a/lib/igt_drrs.h b/lib/igt_drrs.h
> new file mode 100644
> index 0000000000..ff79fb20fb
> --- /dev/null
> +++ b/lib/igt_drrs.h
> @@ -0,0 +1,31 @@
> +/*
> + * Copyright © 2022 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.
> + */
> +
> +#pragma once
> +
> +#include "igt_kms.h"
> +
> +bool drrs_is_enabled(int debugfs_fd, enum pipe pipe);
> +bool drrs_is_active(int debugfs_fd, enum pipe pipe);
> +bool drrs_is_low_refresh_rate(int debugfs_fd, enum pipe pipe);
> +bool drrs_write_status(int debugfs_fd, enum pipe pipe, char *buf, int len);
> diff --git a/lib/meson.build b/lib/meson.build
> index ccee7a5965..3176b27813 100644
> --- a/lib/meson.build
> +++ b/lib/meson.build
> @@ -77,6 +77,7 @@ lib_sources = [
>  	'igt_dummyload.c',
>  	'igt_store.c',
>  	'uwildmat/uwildmat.c',
> +	'igt_drrs.c',
>  	'igt_kmod.c',
>  	'igt_panfrost.c',
>  	'igt_v3d.c',
> -- 
> 2.35.1

-- 
Ville Syrjälä
Intel


More information about the igt-dev mailing list