diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2018-05-08 07:09:36 -0400 |
---|---|---|
committer | Maarten Lankhorst <maarten.lankhorst@linux.intel.com> | 2018-05-11 02:59:09 -0400 |
commit | dd7c2626329468c0344a794187b467d34c3640cb (patch) | |
tree | c53a8487464ebbfef72d803d4cf585be6693409c /drivers/gpu/drm/drm_modes.c | |
parent | 818c05d8e2679e27800b9ce5bc2b0a89ecd164e8 (diff) |
drm/modes: Introduce drm_mode_match()
Make mode matching less confusing by allowing the caller to specify
which parts of the modes should match via some flags.
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Shashank Sharma <shashank.sharma@intel.com>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/1525777785-9740-2-git-send-email-ankit.k.nautiyal@intel.com
Diffstat (limited to 'drivers/gpu/drm/drm_modes.c')
-rw-r--r-- | drivers/gpu/drm/drm_modes.c | 134 |
1 files changed, 103 insertions, 31 deletions
diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c index e82b61e08f8c..c395a244f665 100644 --- a/drivers/gpu/drm/drm_modes.c +++ b/drivers/gpu/drm/drm_modes.c | |||
@@ -939,17 +939,68 @@ struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev, | |||
939 | } | 939 | } |
940 | EXPORT_SYMBOL(drm_mode_duplicate); | 940 | EXPORT_SYMBOL(drm_mode_duplicate); |
941 | 941 | ||
942 | static bool drm_mode_match_timings(const struct drm_display_mode *mode1, | ||
943 | const struct drm_display_mode *mode2) | ||
944 | { | ||
945 | return mode1->hdisplay == mode2->hdisplay && | ||
946 | mode1->hsync_start == mode2->hsync_start && | ||
947 | mode1->hsync_end == mode2->hsync_end && | ||
948 | mode1->htotal == mode2->htotal && | ||
949 | mode1->hskew == mode2->hskew && | ||
950 | mode1->vdisplay == mode2->vdisplay && | ||
951 | mode1->vsync_start == mode2->vsync_start && | ||
952 | mode1->vsync_end == mode2->vsync_end && | ||
953 | mode1->vtotal == mode2->vtotal && | ||
954 | mode1->vscan == mode2->vscan; | ||
955 | } | ||
956 | |||
957 | static bool drm_mode_match_clock(const struct drm_display_mode *mode1, | ||
958 | const struct drm_display_mode *mode2) | ||
959 | { | ||
960 | /* | ||
961 | * do clock check convert to PICOS | ||
962 | * so fb modes get matched the same | ||
963 | */ | ||
964 | if (mode1->clock && mode2->clock) | ||
965 | return KHZ2PICOS(mode1->clock) == KHZ2PICOS(mode2->clock); | ||
966 | else | ||
967 | return mode1->clock == mode2->clock; | ||
968 | } | ||
969 | |||
970 | static bool drm_mode_match_flags(const struct drm_display_mode *mode1, | ||
971 | const struct drm_display_mode *mode2) | ||
972 | { | ||
973 | return (mode1->flags & ~DRM_MODE_FLAG_3D_MASK) == | ||
974 | (mode2->flags & ~DRM_MODE_FLAG_3D_MASK); | ||
975 | } | ||
976 | |||
977 | static bool drm_mode_match_3d_flags(const struct drm_display_mode *mode1, | ||
978 | const struct drm_display_mode *mode2) | ||
979 | { | ||
980 | return (mode1->flags & DRM_MODE_FLAG_3D_MASK) == | ||
981 | (mode2->flags & DRM_MODE_FLAG_3D_MASK); | ||
982 | } | ||
983 | |||
984 | static bool drm_mode_match_aspect_ratio(const struct drm_display_mode *mode1, | ||
985 | const struct drm_display_mode *mode2) | ||
986 | { | ||
987 | return mode1->picture_aspect_ratio == mode2->picture_aspect_ratio; | ||
988 | } | ||
989 | |||
942 | /** | 990 | /** |
943 | * drm_mode_equal - test modes for equality | 991 | * drm_mode_match - test modes for (partial) equality |
944 | * @mode1: first mode | 992 | * @mode1: first mode |
945 | * @mode2: second mode | 993 | * @mode2: second mode |
994 | * @match_flags: which parts need to match (DRM_MODE_MATCH_*) | ||
946 | * | 995 | * |
947 | * Check to see if @mode1 and @mode2 are equivalent. | 996 | * Check to see if @mode1 and @mode2 are equivalent. |
948 | * | 997 | * |
949 | * Returns: | 998 | * Returns: |
950 | * True if the modes are equal, false otherwise. | 999 | * True if the modes are (partially) equal, false otherwise. |
951 | */ | 1000 | */ |
952 | bool drm_mode_equal(const struct drm_display_mode *mode1, const struct drm_display_mode *mode2) | 1001 | bool drm_mode_match(const struct drm_display_mode *mode1, |
1002 | const struct drm_display_mode *mode2, | ||
1003 | unsigned int match_flags) | ||
953 | { | 1004 | { |
954 | if (!mode1 && !mode2) | 1005 | if (!mode1 && !mode2) |
955 | return true; | 1006 | return true; |
@@ -957,15 +1008,48 @@ bool drm_mode_equal(const struct drm_display_mode *mode1, const struct drm_displ | |||
957 | if (!mode1 || !mode2) | 1008 | if (!mode1 || !mode2) |
958 | return false; | 1009 | return false; |
959 | 1010 | ||
960 | /* do clock check convert to PICOS so fb modes get matched | 1011 | if (match_flags & DRM_MODE_MATCH_TIMINGS && |
961 | * the same */ | 1012 | !drm_mode_match_timings(mode1, mode2)) |
962 | if (mode1->clock && mode2->clock) { | ||
963 | if (KHZ2PICOS(mode1->clock) != KHZ2PICOS(mode2->clock)) | ||
964 | return false; | ||
965 | } else if (mode1->clock != mode2->clock) | ||
966 | return false; | 1013 | return false; |
967 | 1014 | ||
968 | return drm_mode_equal_no_clocks(mode1, mode2); | 1015 | if (match_flags & DRM_MODE_MATCH_CLOCK && |
1016 | !drm_mode_match_clock(mode1, mode2)) | ||
1017 | return false; | ||
1018 | |||
1019 | if (match_flags & DRM_MODE_MATCH_FLAGS && | ||
1020 | !drm_mode_match_flags(mode1, mode2)) | ||
1021 | return false; | ||
1022 | |||
1023 | if (match_flags & DRM_MODE_MATCH_3D_FLAGS && | ||
1024 | !drm_mode_match_3d_flags(mode1, mode2)) | ||
1025 | return false; | ||
1026 | |||
1027 | if (match_flags & DRM_MODE_MATCH_ASPECT_RATIO && | ||
1028 | !drm_mode_match_aspect_ratio(mode1, mode2)) | ||
1029 | return false; | ||
1030 | |||
1031 | return true; | ||
1032 | } | ||
1033 | EXPORT_SYMBOL(drm_mode_match); | ||
1034 | |||
1035 | /** | ||
1036 | * drm_mode_equal - test modes for equality | ||
1037 | * @mode1: first mode | ||
1038 | * @mode2: second mode | ||
1039 | * | ||
1040 | * Check to see if @mode1 and @mode2 are equivalent. | ||
1041 | * | ||
1042 | * Returns: | ||
1043 | * True if the modes are equal, false otherwise. | ||
1044 | */ | ||
1045 | bool drm_mode_equal(const struct drm_display_mode *mode1, | ||
1046 | const struct drm_display_mode *mode2) | ||
1047 | { | ||
1048 | return drm_mode_match(mode1, mode2, | ||
1049 | DRM_MODE_MATCH_TIMINGS | | ||
1050 | DRM_MODE_MATCH_CLOCK | | ||
1051 | DRM_MODE_MATCH_FLAGS | | ||
1052 | DRM_MODE_MATCH_3D_FLAGS); | ||
969 | } | 1053 | } |
970 | EXPORT_SYMBOL(drm_mode_equal); | 1054 | EXPORT_SYMBOL(drm_mode_equal); |
971 | 1055 | ||
@@ -980,13 +1064,13 @@ EXPORT_SYMBOL(drm_mode_equal); | |||
980 | * Returns: | 1064 | * Returns: |
981 | * True if the modes are equal, false otherwise. | 1065 | * True if the modes are equal, false otherwise. |
982 | */ | 1066 | */ |
983 | bool drm_mode_equal_no_clocks(const struct drm_display_mode *mode1, const struct drm_display_mode *mode2) | 1067 | bool drm_mode_equal_no_clocks(const struct drm_display_mode *mode1, |
1068 | const struct drm_display_mode *mode2) | ||
984 | { | 1069 | { |
985 | if ((mode1->flags & DRM_MODE_FLAG_3D_MASK) != | 1070 | return drm_mode_match(mode1, mode2, |
986 | (mode2->flags & DRM_MODE_FLAG_3D_MASK)) | 1071 | DRM_MODE_MATCH_TIMINGS | |
987 | return false; | 1072 | DRM_MODE_MATCH_FLAGS | |
988 | 1073 | DRM_MODE_MATCH_3D_FLAGS); | |
989 | return drm_mode_equal_no_clocks_no_stereo(mode1, mode2); | ||
990 | } | 1074 | } |
991 | EXPORT_SYMBOL(drm_mode_equal_no_clocks); | 1075 | EXPORT_SYMBOL(drm_mode_equal_no_clocks); |
992 | 1076 | ||
@@ -1004,21 +1088,9 @@ EXPORT_SYMBOL(drm_mode_equal_no_clocks); | |||
1004 | bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1, | 1088 | bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1, |
1005 | const struct drm_display_mode *mode2) | 1089 | const struct drm_display_mode *mode2) |
1006 | { | 1090 | { |
1007 | if (mode1->hdisplay == mode2->hdisplay && | 1091 | return drm_mode_match(mode1, mode2, |
1008 | mode1->hsync_start == mode2->hsync_start && | 1092 | DRM_MODE_MATCH_TIMINGS | |
1009 | mode1->hsync_end == mode2->hsync_end && | 1093 | DRM_MODE_MATCH_FLAGS); |
1010 | mode1->htotal == mode2->htotal && | ||
1011 | mode1->hskew == mode2->hskew && | ||
1012 | mode1->vdisplay == mode2->vdisplay && | ||
1013 | mode1->vsync_start == mode2->vsync_start && | ||
1014 | mode1->vsync_end == mode2->vsync_end && | ||
1015 | mode1->vtotal == mode2->vtotal && | ||
1016 | mode1->vscan == mode2->vscan && | ||
1017 | (mode1->flags & ~DRM_MODE_FLAG_3D_MASK) == | ||
1018 | (mode2->flags & ~DRM_MODE_FLAG_3D_MASK)) | ||
1019 | return true; | ||
1020 | |||
1021 | return false; | ||
1022 | } | 1094 | } |
1023 | EXPORT_SYMBOL(drm_mode_equal_no_clocks_no_stereo); | 1095 | EXPORT_SYMBOL(drm_mode_equal_no_clocks_no_stereo); |
1024 | 1096 | ||