Re: [PATCH i-g-t v2 1/2] lib/igt_vrr:Add VRR helper library for display refresh rate testing

"Naladala, Ramanaidu" <[email protected]>
Newsgroups org.freedesktop.lists.igt-dev
Message-ID <[email protected]>
Hi Mitul,

Thanks for the feedback.
I will fix  review comments in next revision.

On 8/11/2026 11:01 AM, Golani, Mitulkumar Ajitkumar wrote:
>
>> -----Original Message-----
>> From: Naladala, Ramanaidu <[email protected]>
>> Sent: 11 August 2026 00:48
>> To: [email protected]
>> Cc: Borah, Chaitanya Kumar <[email protected]>; Golani,
>> Mitulkumar Ajitkumar <[email protected]>; Naladala,
>> Ramanaidu <[email protected]>
>> Subject: [PATCH i-g-t v2 1/2] lib/igt_vrr:Add VRR helper library for display
>> refresh rate testing
>>
>> Introduce a new helper library for Variable Refresh Rate (VRR).
>>
>> Add helpers to validate targeted refresh-rate testing.
>>
>> v2: Modify debugfs with helpers.
>>
>> Signed-off-by: Naladala Ramanaidu <[email protected]>
>> ---
>>   lib/igt_vrr.c   | 118
>> ++++++++++++++++++++++++++++++++++++++++++++++++
>>   lib/igt_vrr.h   |  46 +++++++++++++++++++
>>   lib/meson.build |   1 +
>>   3 files changed, 165 insertions(+)
>>   create mode 100644 lib/igt_vrr.c
>>   create mode 100644 lib/igt_vrr.h
>>
>> diff --git a/lib/igt_vrr.c b/lib/igt_vrr.c new file mode 100644 index
>> 000000000..09b008933
>> --- /dev/null
>> +++ b/lib/igt_vrr.c
>> @@ -0,0 +1,118 @@
>> +// SPDX-License-Identifier: MIT
>> +/*
>> + * Copyright © 2026 Intel Corporation
>> + */
>> +
>> +#include <inttypes.h>
>> +
>> +#include "igt_vrr.h"
>> +#include "igt_sysfs.h"
>> +
>> +/**
>> + * igt_target_rr_debugfs_write:
>> + * @fd: DRM file descriptor.
>> + * @crtc_index: Index of the CRTC.
>> + * @vrefresh: Target refresh rate to program.
>> + * @numerator: Numerator component of the target refresh rate fraction.
>> + * @denominator: Denominator component of the target refresh rate
>> fraction.
>> + *
>> + * Write the target refresh rate configuration to the per-CRTC
>> + * VRR debugfs interface.
>> + *
>> + * Returns: None.
>> + */
>> +void
>> +igt_target_rr_debugfs_write(int fd, int crtc_index,
>> +			    uint32_t vrefresh,
>> +			    uint32_t numerator,
>> +			    uint32_t denominator)
>> +{
>> +	char buf[32];
>> +	uint32_t ret, dir;
>> +	uint64_t val;
>> +
>> +	val = vrefresh * numerator;
>> +
>> +	snprintf(buf, sizeof(buf), "%" PRIu64 "/%u",
>> +		 val, denominator);
>> +
>> +	dir = igt_debugfs_crtc_dir(fd, crtc_index);
>> +	igt_require_fd(dir);
>> +
>> +	ret = igt_sysfs_write(dir, "intel_vrr_target_refresh_rate",
>> +			      buf, sizeof(buf) - 1);
>> +	 close(dir);
>> +	 igt_assert_f(ret == (sizeof(buf) - 1), "debugfs_write failed"); }
> NIT: Line 43 to 45, check for tab/space
>
>> +
>> +/**
>> + * igt_cmrr_debugfs_read:
>> + * @fd: DRM file descriptor.
>> + * @crtc_index: Index of the CRTC.
>> + *
>> + * Read the configured refresh rate from the per-CRTC VRR debugfs node.
>> + *
>> + * Return: None.
>> + */
>> +void
>> +igt_target_rr_debugfs_read(int fd, int crtc_index) {
>> +	char buf[32];
>> +	uint32_t ret, dir;
>> +
>> +	dir = igt_debugfs_crtc_dir(fd, crtc_index);
>> +	igt_require_fd(dir);
>> +
>> +	ret = igt_sysfs_read(dir, "intel_vrr_target_refresh_rate",
>> +			     buf,  sizeof(buf) - 1);
>> +	igt_assert_f(ret >= 0,
>> +		     "Failed to read intel_vrr_target_refresh_rate.\n");
> dir/ret are uint32_t; igt_require_fd(dir) (dir >= 0) can never fail, and igt_sysfs_write(..., sizeof(buf)-1) writes 31 uninitialized bytes and asserts the handler consumed exactly 31. Use int for the fd/return, and write strlen(buf) asserting the return equals that. Also, dead ret >= 0 check + OOB buf[ret]
>
>> +
>> +	buf[ret] = '\0';
>> +
>> +	igt_info("%s\n", buf);
>> +}
>> +
>> +/**
>> + * igt_vrr_mode_line_refresh_hz:
>> + * @mode: DRM display mode used for the calculation
>> + *
>> + * Compute the refresh rate directly from the mode timing parameters.
>> + *
>> + * Returns: Refresh rate in Hz as a floating-point value.
>> + */
>> +double igt_vrr_mode_line_refresh_hz(const drmModeModeInfo *mode) {
>> +	return (double)mode->clock * 1000.0 / ((double)mode->htotal *
>> +(double)mode->vtotal); }
>> +
>> +/**
>> + * igt_vrr_get_mode_with_video_timeing:
> typo "timing" -> "timing"
>
>> + * @output: Display output containing connector mode list
>> + * @fps: Requested integer refresh rate in Hz
>> + * @matched_mode: Returned mode that matches @fps
>> + *
>> + * Find and return a connector mode that matches the requested
>> + * video timing refresh rate in Hz.
>> + *
>> + * Returns: true when a mode is found, false otherwise  */
>> +
>> +bool igt_vrr_get_mode_with_video_timeing(igt_output_t *output,
>> +					 uint32_t fps,
>> +					 drmModeModeInfo
>> *matched_mode)
>> +{
>> +	drmModeConnectorPtr connector;
>> +
>> +	connector = output->config.connector;
>> +	if (!connector)
>> +		return false;
>> +
>> +	for (int i = 0; i < connector->count_modes; i++) {
>> +		if (connector->modes[i].vrefresh == fps) {
>> +			*matched_mode = connector->modes[i];
>> +			return true;
>> +		}
>> +	}
>> +	return false;
>> +}
>> diff --git a/lib/igt_vrr.h b/lib/igt_vrr.h new file mode 100644 index
>> 000000000..abea32a07
>> --- /dev/null
>> +++ b/lib/igt_vrr.h
>> @@ -0,0 +1,46 @@
>> +/* SPDX-License-Identifier: MIT */
>> +/*
>> + * Copyright © 2026 Intel Corporation
>> + */
>> +
>> +#ifndef IGT_VRR_H
>> +#define IGT_VRR_H
>> +
>> +#include <stdbool.h>
>> +#include <stdint.h>
>> +#include "igt.h"
>> +#include "igt_kms.h"
>> +
>> +#define CMRR_NUMERATOR 1000ULL
>> +#define CMRR_DENOMINATOR 1000ULL
>> +#define CMRR_VIDEO_MODE_DENOMINATOR 1001ULL #define
>> +TARGET_RR_SAMP_COUNT 100
>> +
>> +enum {
>> +	CMRR_VIDEO_MODE,
>> +	CMRR_NON_VIDEO_MODE,
>> +	CMRR_DISABLE,
>> +};
>> +
>> +const uint32_t igt_vrr_standard_video_timing_fps[] = {
>> +	24, 25, 30, 48, 50, 60, 75, 90, 96, 100, 120, 144, 165, 180, 200, 240,
>> +};
> const uint32_t igt_vrr_standard_video_timing_fps[] (and its count) have external linkage and will cause a multiple-definition link error as soon as a second .c includes this header. Define them once in igt_vrr.c and expose extern declarations here.
>
>> +
>> +const uint32_t igt_vrr_standard_video_timing_fps_count =
>> +	ARRAY_SIZE(igt_vrr_standard_video_timing_fps);
>> +
>> +void
>> +igt_target_rr_debugfs_write(int fd, int crtc_index,
>> +			    uint32_t vrefresh,
>> +			    uint32_t numerator,
>> +			    uint32_t denominator);
>> +void
>> +igt_target_rr_debugfs_read(int fd, int crtc_index);
>> +
>> +double igt_vrr_mode_line_refresh_hz(const drmModeModeInfo *mode);
>> +
>> +bool igt_vrr_get_mode_with_video_timeing(igt_output_t *output,
>> +					 uint32_t fps,
>> +					 drmModeModeInfo
>> *matched_mode);
>> +
>> +#endif
>> diff --git a/lib/meson.build b/lib/meson.build index 3001b473e..8675bd4a6
>> 100644
>> --- a/lib/meson.build
>> +++ b/lib/meson.build
>> @@ -22,6 +22,7 @@ lib_sources = [
>>   	'igt_configfs.c',
>>   	'igt_facts.c',
>>   	'igt_crc.c',
>> +        'igt_vrr.c',
>>   	'igt_debugfs.c',
>>   	'igt_device.c',
>>   	'igt_device_scan.c',
>> --
>> 2.43.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.