Igt-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: "Naladala, Ramanaidu" <Ramanaidu.naladala@intel.com>
To: "Golani,
	Mitulkumar Ajitkumar" <mitulkumar.ajitkumar.golani@intel.com>,
	"igt-dev@lists.freedesktop.org" <igt-dev@lists.freedesktop.org>
Cc: "Borah, Chaitanya Kumar" <chaitanya.kumar.borah@intel.com>
Subject: Re: [PATCH i-g-t v2 1/2] lib/igt_vrr:Add VRR helper library for display refresh rate testing
Date: Wed, 12 Aug 2026 00:53:09 +0530	[thread overview]
Message-ID: <1c98532e-e90a-473b-b9b7-955d2413148f@intel.com> (raw)
In-Reply-To: <IA1PR11MB63488312022E8E0B51A69DEDB2DD2@IA1PR11MB6348.namprd11.prod.outlook.com>

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 <ramanaidu.naladala@intel.com>
>> Sent: 11 August 2026 00:48
>> To: igt-dev@lists.freedesktop.org
>> Cc: Borah, Chaitanya Kumar <chaitanya.kumar.borah@intel.com>; Golani,
>> Mitulkumar Ajitkumar <mitulkumar.ajitkumar.golani@intel.com>; Naladala,
>> Ramanaidu <ramanaidu.naladala@intel.com>
>> 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 <ramanaidu.naladala@intel.com>
>> ---
>>   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

  reply	other threads:[~2026-08-11 19:24 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-10 19:17 [PATCH i-g-t v2 0/2] Add CMRR subtests Naladala Ramanaidu
2026-08-10 19:17 ` [PATCH i-g-t v2 1/2] lib/igt_vrr:Add VRR helper library for display refresh rate testing Naladala Ramanaidu
2026-08-11  5:31   ` Golani, Mitulkumar Ajitkumar
2026-08-11 19:23     ` Naladala, Ramanaidu [this message]
2026-08-10 19:17 ` [PATCH i-g-t v2 2/2] tests/kms_vrr: add CMRR fixed and video mode subtests Naladala Ramanaidu
2026-08-11  5:31   ` Golani, Mitulkumar Ajitkumar
2026-08-12  7:20     ` Naladala, Ramanaidu
2026-08-10 20:13 ` ✗ i915.CI.BAT: failure for Add CMRR subtests (rev2) Patchwork
2026-08-10 23:35 ` ✓ Xe.CI.FULL: success " Patchwork
2026-08-11  6:49 ` ✓ i915.CI.BAT: " Patchwork
2026-08-11 10:21 ` ✓ 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=1c98532e-e90a-473b-b9b7-955d2413148f@intel.com \
    --to=ramanaidu.naladala@intel.com \
    --cc=chaitanya.kumar.borah@intel.com \
    --cc=igt-dev@lists.freedesktop.org \
    --cc=mitulkumar.ajitkumar.golani@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox