drm/i915: Extract physical display dimensions from VBT
The VBT has these mysterious H/V image sizes as part of the display timings. Looking at some dumps those appear to be the physical dimensions in mm. Which makes sense since the timing descriptor matches the format used by EDID detailed timing descriptor, which defines these as "H/V Addressable Video Image Size in mm". So let's use that information from the panel fixed mode to get the physical dimensions for LVDS/eDP/DSI displays. And with that we can fill out the display_info so that userspace can get at it via GetConnector. v2: Use (hi<<8)|lo instead of broken (hi<<4)+lo Handle LVDS and eDP too Cc: Stephen Just <stephenjust@gmail.com> Tested-by: Stephen Just <stephenjust@gmail.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=96255 Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1464685714-30507-1-git-send-email-ville.syrjala@linux.intel.com Reviewed-by: Mika Kahola <mika.kahola@intel.com>
This commit is contained in:
parent
fa05178c5d
commit
df457245b5
|
@ -139,6 +139,11 @@ fill_detail_timing_data(struct drm_display_mode *panel_fixed_mode,
|
|||
else
|
||||
panel_fixed_mode->flags |= DRM_MODE_FLAG_NVSYNC;
|
||||
|
||||
panel_fixed_mode->width_mm = (dvo_timing->himage_hi << 8) |
|
||||
dvo_timing->himage_lo;
|
||||
panel_fixed_mode->height_mm = (dvo_timing->vimage_hi << 8) |
|
||||
dvo_timing->vimage_lo;
|
||||
|
||||
/* Some VBTs have bogus h/vtotal values */
|
||||
if (panel_fixed_mode->hsync_end > panel_fixed_mode->htotal)
|
||||
panel_fixed_mode->htotal = panel_fixed_mode->hsync_end + 1;
|
||||
|
|
|
@ -5370,8 +5370,11 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
|
|||
if (!fixed_mode && dev_priv->vbt.lfp_lvds_vbt_mode) {
|
||||
fixed_mode = drm_mode_duplicate(dev,
|
||||
dev_priv->vbt.lfp_lvds_vbt_mode);
|
||||
if (fixed_mode)
|
||||
if (fixed_mode) {
|
||||
fixed_mode->type |= DRM_MODE_TYPE_PREFERRED;
|
||||
connector->display_info.width_mm = fixed_mode->width_mm;
|
||||
connector->display_info.height_mm = fixed_mode->height_mm;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&dev->mode_config.mutex);
|
||||
|
||||
|
|
|
@ -1578,6 +1578,9 @@ void intel_dsi_init(struct drm_device *dev)
|
|||
goto err;
|
||||
}
|
||||
|
||||
connector->display_info.width_mm = fixed_mode->width_mm;
|
||||
connector->display_info.height_mm = fixed_mode->height_mm;
|
||||
|
||||
intel_panel_init(&intel_connector->panel, fixed_mode, NULL);
|
||||
|
||||
intel_dsi_add_properties(intel_connector);
|
||||
|
|
|
@ -1082,6 +1082,8 @@ void intel_lvds_init(struct drm_device *dev)
|
|||
fixed_mode = drm_mode_duplicate(dev, dev_priv->vbt.lfp_lvds_vbt_mode);
|
||||
if (fixed_mode) {
|
||||
fixed_mode->type |= DRM_MODE_TYPE_PREFERRED;
|
||||
connector->display_info.width_mm = fixed_mode->width_mm;
|
||||
connector->display_info.height_mm = fixed_mode->height_mm;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -403,9 +403,10 @@ struct lvds_dvo_timing {
|
|||
u8 vsync_off:4;
|
||||
u8 rsvd0:6;
|
||||
u8 hsync_off_hi:2;
|
||||
u8 h_image;
|
||||
u8 v_image;
|
||||
u8 max_hv;
|
||||
u8 himage_lo;
|
||||
u8 vimage_lo;
|
||||
u8 vimage_hi:4;
|
||||
u8 himage_hi:4;
|
||||
u8 h_border;
|
||||
u8 v_border;
|
||||
u8 rsvd1:3;
|
||||
|
|
Loading…
Reference in New Issue