diff options
author | Bhanuprakash Modem <bhanuprakash.modem@intel.com> | 2022-04-11 15:11:43 +0530 |
---|---|---|
committer | Bhanuprakash Modem <bhanuprakash.modem@intel.com> | 2022-05-17 11:54:42 +0530 |
commit | 5b153cdcd18f07f35ac3c766ea669fd7d5c6f82d (patch) | |
tree | f3f9991debdc00807f3cd171f710590e52463ef4 | |
parent | f4731438344390afe165ac41ee9e2a2e77e3d932 (diff) |
lib/igt_kms: Add helper functions to read few debugfs
Add helper functions:
- Read maximum bpc from connector debugfs
- Read Current bpc from crtc debugfs
- Compare/Assert if Current & Requested bpc are not equal
V2:
* New function to compare current & requested bpc
Cc: Mark Yacoub <markyacoub@chromium.org>
Cc: Petri Latvala <petri.latvala@intel.com>
Cc: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
Reviewed-by: Swati Sharma <swati2.sharma@intel.com>
-rw-r--r-- | lib/igt_kms.c | 110 | ||||
-rw-r--r-- | lib/igt_kms.h | 7 |
2 files changed, 117 insertions, 0 deletions
diff --git a/lib/igt_kms.c b/lib/igt_kms.c index 7838ff28..014401f6 100644 --- a/lib/igt_kms.c +++ b/lib/igt_kms.c @@ -5379,3 +5379,113 @@ int igt_get_dsc_debugfs_fd(int drmfd, drmModeConnector *connector) return openat(igt_debugfs_dir(drmfd), file_name, O_WRONLY); } + +/* + * igt_get_output_max_bpc: + * @drmfd: A drm file descriptor + * @output_name: Name of the libdrm connector we're going to use + * + * Returns: The maximum bpc from the connector debugfs. + */ +unsigned int igt_get_output_max_bpc(int drmfd, char *connector_name) +{ + char buf[24]; + char *start_loc; + int fd, res; + unsigned int maximum; + + fd = igt_debugfs_connector_dir(drmfd, connector_name, O_RDONLY); + igt_assert(fd >= 0); + + res = igt_debugfs_simple_read(fd, "output_bpc", buf, sizeof(buf)); + igt_require(res > 0); + + close(fd); + + igt_assert(start_loc = strstr(buf, "Maximum: ")); + igt_assert_eq(sscanf(start_loc, "Maximum: %u", &maximum), 1); + + return maximum; +} + +/* + * igt_get_pipe_current_bpc: + * @drmfd: A drm file descriptor + * @pipe: Display pipe + * + * Returns: The current bpc from the crtc debugfs. + */ +unsigned int igt_get_pipe_current_bpc(int drmfd, enum pipe pipe) +{ + char buf[24]; + char debugfs_name[24]; + char *start_loc; + int fd, res; + unsigned int current; + + fd = igt_debugfs_pipe_dir(drmfd, pipe, O_RDONLY); + igt_assert(fd >= 0); + + if (is_i915_device(drmfd)) + strcpy(debugfs_name, "i915_current_bpc"); + else if (is_amdgpu_device(drmfd)) + strcpy(debugfs_name, "amdgpu_current_bpc"); + + res = igt_debugfs_simple_read(fd, debugfs_name, buf, sizeof(buf)); + igt_require(res > 0); + + close(fd); + + igt_assert(start_loc = strstr(buf, "Current: ")); + igt_assert_eq(sscanf(start_loc, "Current: %u", ¤t), 1); + + return current; +} + +static unsigned int get_current_bpc(int drmfd, enum pipe pipe, + char *output_name, unsigned int bpc) +{ + unsigned int maximum = igt_get_output_max_bpc(drmfd, output_name); + unsigned int current = igt_get_pipe_current_bpc(drmfd, pipe); + + igt_require_f(maximum >= bpc, + "Monitor doesn't support %u bpc, max is %u\n", bpc, + maximum); + + return current; +} + +/* + * igt_assert_output_bpc_equal: + * @drmfd: A drm file descriptor + * @pipe: Display pipe + * @output_name: Name of the libdrm connector we're going to use + * @bpc: BPC to compare with max & current bpc + * + * Assert if crtc's current bpc is not matched with the requested one. + */ +void igt_assert_output_bpc_equal(int drmfd, enum pipe pipe, + char *output_name, unsigned int bpc) +{ + unsigned int current = get_current_bpc(drmfd, pipe, output_name, bpc); + + igt_assert_eq(current, bpc); +} + +/* + * igt_check_output_bpc_equal: + * @drmfd: A drm file descriptor + * @pipe: Display pipe + * @output_name: Name of the libdrm connector we're going to use + * @bpc: BPC to compare with max & current bpc + * + * This is similar to igt_assert_output_bpc_equal, instead of assert + * it'll return True if crtc has the correct requested bpc, else False. + */ +bool igt_check_output_bpc_equal(int drmfd, enum pipe pipe, + char *output_name, unsigned int bpc) +{ + unsigned int current = get_current_bpc(drmfd, pipe, output_name, bpc); + + return (current == bpc); +} diff --git a/lib/igt_kms.h b/lib/igt_kms.h index e9ecd21e..26922095 100644 --- a/lib/igt_kms.h +++ b/lib/igt_kms.h @@ -948,4 +948,11 @@ int igt_force_dsc_enable_bpp(int drmfd, drmModeConnector *connector, int bpp); int igt_get_dsc_debugfs_fd(int drmfd, drmModeConnector *connector); +unsigned int igt_get_output_max_bpc(int drmfd, char *connector_name); +unsigned int igt_get_pipe_current_bpc(int drmfd, enum pipe pipe); +void igt_assert_output_bpc_equal(int drmfd, enum pipe pipe, + char *output_name, unsigned int bpc); +bool igt_check_output_bpc_equal(int drmfd, enum pipe pipe, + char *output_name, unsigned int bpc); + #endif /* __IGT_KMS_H__ */ |