| @@ -5971,12 +5971,14 @@ static void drm_parse_cea_ext(struct drm_connector *connector, · 5970 unmodified lines |
| 5971 | } | 5971 | } |
| 5972 | | 5972 | |
| 5973 | static | 5973 | static |
| 5974 | void get_monitor_range(const struct detailed_timing *timing, | 5974 | void get_monitor_range(const struct detailed_timing *timing, void *c) |
| 5975 | void *info_monitor_range) | | |
| 5976 | { | 5975 | { |
| 5977 | struct drm_monitor_range_info *monitor_range = info_monitor_range; | 5976 | struct detailed_mode_closure *closure = c; |
| | 5977 | struct drm_display_info *info = &closure->connector->display_info; |
| | 5978 | struct drm_monitor_range_info *monitor_range = &info->monitor_range; |
| 5978 | const struct detailed_non_pixel *data = &timing->data.other_data; | 5979 | const struct detailed_non_pixel *data = &timing->data.other_data; |
| 5979 | const struct detailed_data_monitor_range *range = &data->data.range; | 5980 | const struct detailed_data_monitor_range *range = &data->data.range; |
| | 5981 | const struct edid *edid = closure->drm_edid->edid; |
| 5980 | | 5982 | |
| 5981 | if (!is_display_descriptor(timing, EDID_DETAIL_MONITOR_RANGE)) | 5983 | if (!is_display_descriptor(timing, EDID_DETAIL_MONITOR_RANGE)) |
| 5982 | return; | 5984 | return; |
| @@ -5992,18 +5994,28 @@ void get_monitor_range(const struct detailed_timing *timing, · 9 unmodified lines |
| 5992 | | 5994 | |
| 5993 | monitor_range->min_vfreq = range->min_vfreq; | 5995 | monitor_range->min_vfreq = range->min_vfreq; |
| 5994 | monitor_range->max_vfreq = range->max_vfreq; | 5996 | monitor_range->max_vfreq = range->max_vfreq; |
| | 5997 | |
| | 5998 | if (edid->revision >= 4) { |
| | 5999 | if (data->pad2 & DRM_EDID_RANGE_OFFSET_MIN_VFREQ) |
| | 6000 | monitor_range->min_vfreq += 255; |
| | 6001 | if (data->pad2 & DRM_EDID_RANGE_OFFSET_MAX_VFREQ) |
| | 6002 | monitor_range->max_vfreq += 255; |
| | 6003 | } |
| 5995 | } | 6004 | } |
| 5996 | | 6005 | |
| 5997 | static void drm_get_monitor_range(struct drm_connector *connector, | 6006 | static void drm_get_monitor_range(struct drm_connector *connector, |
| 5998 | const struct drm_edid *drm_edid) | 6007 | const struct drm_edid *drm_edid) |
| 5999 | { | 6008 | { |
| 6000 | struct drm_display_info *info = &connector->display_info; | 6009 | const struct drm_display_info *info = &connector->display_info; |
| | 6010 | struct detailed_mode_closure closure = { |
| | 6011 | .connector = connector, |
| | 6012 | .drm_edid = drm_edid, |
| | 6013 | }; |
| 6001 | | 6014 | |
| 6002 | if (!version_greater(drm_edid, 1, 1)) | 6015 | if (!version_greater(drm_edid, 1, 1)) |
| 6003 | return; | 6016 | return; |
| 6004 | | 6017 | |
| 6005 | drm_for_each_detailed_block(drm_edid, get_monitor_range, | 6018 | drm_for_each_detailed_block(drm_edid, get_monitor_range, &closure); |
| 6006 | &info->monitor_range); | | |
| 6007 | | 6019 | |
| 6008 | DRM_DEBUG_KMS("Supported Monitor Refresh rate range is %d Hz - %d Hz\n", | 6020 | DRM_DEBUG_KMS("Supported Monitor Refresh rate range is %d Hz - %d Hz\n", |
| 6009 | info->monitor_range.min_vfreq, | 6021 | info->monitor_range.min_vfreq, |