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