diff options
author | Bhanuprakash Modem <bhanuprakash.modem@intel.com> | 2022-05-31 17:28:03 +0530 |
---|---|---|
committer | Bhanuprakash Modem <bhanuprakash.modem@intel.com> | 2022-06-01 16:08:09 +0530 |
commit | 8c1fdd9bb2fc0a964dce72bbc43fe1f463374786 (patch) | |
tree | ffef02883c9d901fc6aaba393700f369348ad24f /lib | |
parent | a6a189fef321ee9230339d2ee8cc2acf8c9476b6 (diff) |
lib/igt_kms: Add helper functions to sort drm modes
Add helper function to sort drm modes based on the clock, resolution
in both ascending & descending order.
V2:
* Minor changes
V3:
* Added documentaion for helper functions
Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/igt_kms.c | 90 | ||||
-rw-r--r-- | lib/igt_kms.h | 10 |
2 files changed, 85 insertions, 15 deletions
diff --git a/lib/igt_kms.c b/lib/igt_kms.c index a25fac74..af4fb85b 100644 --- a/lib/igt_kms.c +++ b/lib/igt_kms.c @@ -1478,6 +1478,78 @@ void kmstest_force_edid(int drm_fd, drmModeConnector *connector, } /** + * sort_drm_modes_by_clk_dsc: + * @a: first element + * @b: second element + * + * Comparator function for sorting DRM modes in descending order by clock. + */ +int sort_drm_modes_by_clk_dsc(const void *a, const void *b) +{ + const drmModeModeInfo *mode1 = a, *mode2 = b; + + return (mode1->clock < mode2->clock) - (mode2->clock < mode1->clock); +} + +/** + * sort_drm_modes_by_clk_asc: + * @a: first element + * @b: second element + * + * Comparator function for sorting DRM modes in ascending order by clock. + */ +int sort_drm_modes_by_clk_asc(const void *a, const void *b) +{ + const drmModeModeInfo *mode1 = a, *mode2 = b; + + return (mode1->clock > mode2->clock) - (mode2->clock > mode1->clock); +} + +/** + * sort_drm_modes_by_res_dsc: + * @a: first element + * @b: second element + * + * Comparator function for sorting DRM modes in descending order by resolution. + */ +int sort_drm_modes_by_res_dsc(const void *a, const void *b) +{ + const drmModeModeInfo *mode1 = a, *mode2 = b; + + return (mode1->hdisplay < mode2->hdisplay) - (mode2->hdisplay < mode1->hdisplay); +} + +/** + * sort_drm_modes_by_res_asc: + * @a: first element + * @b: second element + * + * Comparator function for sorting DRM modes in ascending order by resolution. + */ +int sort_drm_modes_by_res_asc(const void *a, const void *b) +{ + const drmModeModeInfo *mode1 = a, *mode2 = b; + + return (mode1->hdisplay > mode2->hdisplay) - (mode2->hdisplay > mode1->hdisplay); +} + +/** + * igt_sort_connector_modes: + * @connector: libdrm connector + * @comparator: comparison function to compare two elements + * + * Sorts connector modes based on the @comparator. + */ +void igt_sort_connector_modes(drmModeConnector *connector, + int (*comparator)(const void *, const void*)) +{ + qsort(connector->modes, + connector->count_modes, + sizeof(drmModeModeInfo), + comparator); +} + +/** * kmstest_get_connector_default_mode: * @drm_fd: DRM fd * @connector: libdrm connector @@ -4204,16 +4276,6 @@ void igt_output_set_pipe(igt_output_t *output, enum pipe pipe) } } -#define for_each_connector_mode(output) \ - for (int i__ = 0; i__ < output->config.connector->count_modes; i__++) - -static int sort_drm_modes(const void *a, const void *b) -{ - const drmModeModeInfo *mode1 = a, *mode2 = b; - - return (mode1->clock < mode2->clock) - (mode2->clock < mode1->clock); -} - static bool __override_all_active_output_modes_to_fit_bw(igt_display_t *display, igt_output_t *outputs[IGT_MAX_PIPES], @@ -4230,7 +4292,7 @@ bool __override_all_active_output_modes_to_fit_bw(igt_display_t *display, for_each_connector_mode(output) { int ret; - igt_output_override_mode(output, &output->config.connector->modes[i__]); + igt_output_override_mode(output, &output->config.connector->modes[j__]); if (__override_all_active_output_modes_to_fit_bw(display, outputs, n_outputs, base + 1)) return true; @@ -4271,10 +4333,8 @@ bool igt_override_all_active_output_modes_to_fit_bw(igt_display_t *display) continue; /* Sort the modes in descending order by clock freq. */ - qsort(output->config.connector->modes, - output->config.connector->count_modes, - sizeof(drmModeModeInfo), - sort_drm_modes); + igt_sort_connector_modes(output->config.connector, + sort_drm_modes_by_clk_dsc); outputs[n_outputs++] = output; } diff --git a/lib/igt_kms.h b/lib/igt_kms.h index ba0bf4d6..0f12d825 100644 --- a/lib/igt_kms.h +++ b/lib/igt_kms.h @@ -637,6 +637,9 @@ igt_output_t **__igt_pipe_populate_outputs(igt_display_t *display, for (int j__ = 0; assert(igt_can_fail()), (plane) = &(display)->pipes[(pipe)].planes[j__], \ j__ < (display)->pipes[(pipe)].n_planes; j__++) +#define for_each_connector_mode(output) \ + for (int j__ = 0; j__ < output->config.connector->count_modes; j__++) + #define IGT_FIXED(i,f) ((i) << 16 | (f)) /** @@ -957,4 +960,11 @@ void igt_assert_output_bpc_equal(int drmfd, enum pipe pipe, bool igt_check_output_bpc_equal(int drmfd, enum pipe pipe, char *output_name, unsigned int bpc); +int sort_drm_modes_by_clk_dsc(const void *a, const void *b); +int sort_drm_modes_by_clk_asc(const void *a, const void *b); +int sort_drm_modes_by_res_dsc(const void *a, const void *b); +int sort_drm_modes_by_res_asc(const void *a, const void *b); +void igt_sort_connector_modes(drmModeConnector *connector, + int (*comparator)(const void *, const void*)); + #endif /* __IGT_KMS_H__ */ |