aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_modes.c
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2018-05-08 07:09:36 -0400
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>2018-05-11 02:59:09 -0400
commitdd7c2626329468c0344a794187b467d34c3640cb (patch)
treec53a8487464ebbfef72d803d4cf585be6693409c /drivers/gpu/drm/drm_modes.c
parent818c05d8e2679e27800b9ce5bc2b0a89ecd164e8 (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.c134
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}
940EXPORT_SYMBOL(drm_mode_duplicate); 940EXPORT_SYMBOL(drm_mode_duplicate);
941 941
942static 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
957static 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
970static 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
977static 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
984static 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 */
952bool drm_mode_equal(const struct drm_display_mode *mode1, const struct drm_display_mode *mode2) 1001bool 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}
1033EXPORT_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 */
1045bool 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}
970EXPORT_SYMBOL(drm_mode_equal); 1054EXPORT_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 */
983bool drm_mode_equal_no_clocks(const struct drm_display_mode *mode1, const struct drm_display_mode *mode2) 1067bool 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}
991EXPORT_SYMBOL(drm_mode_equal_no_clocks); 1075EXPORT_SYMBOL(drm_mode_equal_no_clocks);
992 1076
@@ -1004,21 +1088,9 @@ EXPORT_SYMBOL(drm_mode_equal_no_clocks);
1004bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1, 1088bool 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}
1023EXPORT_SYMBOL(drm_mode_equal_no_clocks_no_stereo); 1095EXPORT_SYMBOL(drm_mode_equal_no_clocks_no_stereo);
1024 1096