| @@ -5971,12 +5971,14 @@ static void drm_parse_cea_ext(struct drm_connector *connector, · 5970 unmodified lines |
| 5971 | 5971 | } |
| 5972 | 5972 | |
| 5973 | 5973 | static |
| 5974 | | −void get_monitor_range(const struct detailed_timing *timing, |
| 5975 | | − void *info_monitor_range) |
| 5974 | +void get_monitor_range(const struct detailed_timing *timing, void *c) |
| 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 | 5979 | const struct detailed_non_pixel *data = &timing->data.other_data; |
| 5979 | 5980 | const struct detailed_data_monitor_range *range = &data->data.range; |
| 5981 | + const struct edid *edid = closure->drm_edid->edid; |
| 5980 | 5982 | |
| 5981 | 5983 | if (!is_display_descriptor(timing, EDID_DETAIL_MONITOR_RANGE)) |
| 5982 | 5984 | return; |
| @@ -5992,18 +5994,28 @@ void get_monitor_range(const struct detailed_timing *timing, · 9 unmodified lines |
| 5992 | 5994 | |
| 5993 | 5995 | monitor_range->min_vfreq = range->min_vfreq; |
| 5994 | 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 | 6006 | static void drm_get_monitor_range(struct drm_connector *connector, |
| 5998 | 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 | 6015 | if (!version_greater(drm_edid, 1, 1)) |
| 6003 | 6016 | return; |
| 6004 | 6017 | |
| 6005 | | − drm_for_each_detailed_block(drm_edid, get_monitor_range, |
| 6006 | | − &info->monitor_range); |
| 6018 | + drm_for_each_detailed_block(drm_edid, get_monitor_range, &closure); |
| 6007 | 6019 | |
| 6008 | 6020 | DRM_DEBUG_KMS("Supported Monitor Refresh rate range is %d Hz - %d Hz\n", |
| 6009 | 6021 | info->monitor_range.min_vfreq, |