diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_bios.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_bios.c | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index b235b6e88ead..b9022fa053d6 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c | |||
@@ -139,6 +139,11 @@ fill_detail_timing_data(struct drm_display_mode *panel_fixed_mode, | |||
139 | else | 139 | else |
140 | panel_fixed_mode->flags |= DRM_MODE_FLAG_NVSYNC; | 140 | panel_fixed_mode->flags |= DRM_MODE_FLAG_NVSYNC; |
141 | 141 | ||
142 | panel_fixed_mode->width_mm = (dvo_timing->himage_hi << 8) | | ||
143 | dvo_timing->himage_lo; | ||
144 | panel_fixed_mode->height_mm = (dvo_timing->vimage_hi << 8) | | ||
145 | dvo_timing->vimage_lo; | ||
146 | |||
142 | /* Some VBTs have bogus h/vtotal values */ | 147 | /* Some VBTs have bogus h/vtotal values */ |
143 | if (panel_fixed_mode->hsync_end > panel_fixed_mode->htotal) | 148 | if (panel_fixed_mode->hsync_end > panel_fixed_mode->htotal) |
144 | panel_fixed_mode->htotal = panel_fixed_mode->hsync_end + 1; | 149 | panel_fixed_mode->htotal = panel_fixed_mode->hsync_end + 1; |
@@ -1187,7 +1192,7 @@ parse_device_mapping(struct drm_i915_private *dev_priv, | |||
1187 | } | 1192 | } |
1188 | if (bdb->version < 106) { | 1193 | if (bdb->version < 106) { |
1189 | expected_size = 22; | 1194 | expected_size = 22; |
1190 | } else if (bdb->version < 109) { | 1195 | } else if (bdb->version < 111) { |
1191 | expected_size = 27; | 1196 | expected_size = 27; |
1192 | } else if (bdb->version < 195) { | 1197 | } else if (bdb->version < 195) { |
1193 | BUILD_BUG_ON(sizeof(struct old_child_dev_config) != 33); | 1198 | BUILD_BUG_ON(sizeof(struct old_child_dev_config) != 33); |
@@ -1546,6 +1551,45 @@ bool intel_bios_is_lvds_present(struct drm_i915_private *dev_priv, u8 *i2c_pin) | |||
1546 | } | 1551 | } |
1547 | 1552 | ||
1548 | /** | 1553 | /** |
1554 | * intel_bios_is_port_present - is the specified digital port present | ||
1555 | * @dev_priv: i915 device instance | ||
1556 | * @port: port to check | ||
1557 | * | ||
1558 | * Return true if the device in %port is present. | ||
1559 | */ | ||
1560 | bool intel_bios_is_port_present(struct drm_i915_private *dev_priv, enum port port) | ||
1561 | { | ||
1562 | static const struct { | ||
1563 | u16 dp, hdmi; | ||
1564 | } port_mapping[] = { | ||
1565 | [PORT_B] = { DVO_PORT_DPB, DVO_PORT_HDMIB, }, | ||
1566 | [PORT_C] = { DVO_PORT_DPC, DVO_PORT_HDMIC, }, | ||
1567 | [PORT_D] = { DVO_PORT_DPD, DVO_PORT_HDMID, }, | ||
1568 | [PORT_E] = { DVO_PORT_DPE, DVO_PORT_HDMIE, }, | ||
1569 | }; | ||
1570 | int i; | ||
1571 | |||
1572 | /* FIXME maybe deal with port A as well? */ | ||
1573 | if (WARN_ON(port == PORT_A) || port >= ARRAY_SIZE(port_mapping)) | ||
1574 | return false; | ||
1575 | |||
1576 | if (!dev_priv->vbt.child_dev_num) | ||
1577 | return false; | ||
1578 | |||
1579 | for (i = 0; i < dev_priv->vbt.child_dev_num; i++) { | ||
1580 | const union child_device_config *p_child = | ||
1581 | &dev_priv->vbt.child_dev[i]; | ||
1582 | if ((p_child->common.dvo_port == port_mapping[port].dp || | ||
1583 | p_child->common.dvo_port == port_mapping[port].hdmi) && | ||
1584 | (p_child->common.device_type & (DEVICE_TYPE_TMDS_DVI_SIGNALING | | ||
1585 | DEVICE_TYPE_DISPLAYPORT_OUTPUT))) | ||
1586 | return true; | ||
1587 | } | ||
1588 | |||
1589 | return false; | ||
1590 | } | ||
1591 | |||
1592 | /** | ||
1549 | * intel_bios_is_port_edp - is the device in given port eDP | 1593 | * intel_bios_is_port_edp - is the device in given port eDP |
1550 | * @dev_priv: i915 device instance | 1594 | * @dev_priv: i915 device instance |
1551 | * @port: port to check | 1595 | * @port: port to check |