|
@@ -430,6 +430,36 @@ int radeon_connector_set_property(struct drm_connector *connector, struct drm_pr
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Some integrated ATI Radeon chipset implementations (e. g.
|
|
|
+ * Asus M2A-VM HDMI) may indicate the availability of a DDC,
|
|
|
+ * even when there's no monitor connected. For these connectors
|
|
|
+ * following DDC probe extension will be applied: check also for the
|
|
|
+ * availability of EDID with at least a correct EDID header. Only then,
|
|
|
+ * DDC is assumed to be available. This prevents drm_get_edid() and
|
|
|
+ * drm_edid_block_valid() from periodically dumping data and kernel
|
|
|
+ * errors into the logs and onto the terminal.
|
|
|
+ */
|
|
|
+static bool radeon_connector_needs_extended_probe(struct radeon_device *dev,
|
|
|
+ uint32_t supported_device,
|
|
|
+ int connector_type)
|
|
|
+{
|
|
|
+ /* Asus M2A-VM HDMI board sends data to i2c bus even,
|
|
|
+ * if HDMI add-on card is not plugged in or HDMI is disabled in
|
|
|
+ * BIOS. Valid DDC can only be assumed, if also a valid EDID header
|
|
|
+ * can be retrieved via i2c bus during DDC probe */
|
|
|
+ if ((dev->pdev->device == 0x791e) &&
|
|
|
+ (dev->pdev->subsystem_vendor == 0x1043) &&
|
|
|
+ (dev->pdev->subsystem_device == 0x826d)) {
|
|
|
+ if ((connector_type == DRM_MODE_CONNECTOR_HDMIA) &&
|
|
|
+ (supported_device == ATOM_DEVICE_DFP2_SUPPORT))
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Default: no EDID header probe required for DDC probing */
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
static void radeon_fixup_lvds_native_mode(struct drm_encoder *encoder,
|
|
|
struct drm_connector *connector)
|
|
|
{
|
|
@@ -661,7 +691,8 @@ radeon_vga_detect(struct drm_connector *connector, bool force)
|
|
|
ret = connector_status_disconnected;
|
|
|
|
|
|
if (radeon_connector->ddc_bus)
|
|
|
- dret = radeon_ddc_probe(radeon_connector);
|
|
|
+ dret = radeon_ddc_probe(radeon_connector,
|
|
|
+ radeon_connector->requires_extended_probe);
|
|
|
if (dret) {
|
|
|
if (radeon_connector->edid) {
|
|
|
kfree(radeon_connector->edid);
|
|
@@ -833,7 +864,8 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
|
|
|
bool dret = false;
|
|
|
|
|
|
if (radeon_connector->ddc_bus)
|
|
|
- dret = radeon_ddc_probe(radeon_connector);
|
|
|
+ dret = radeon_ddc_probe(radeon_connector,
|
|
|
+ radeon_connector->requires_extended_probe);
|
|
|
if (dret) {
|
|
|
if (radeon_connector->edid) {
|
|
|
kfree(radeon_connector->edid);
|
|
@@ -1251,7 +1283,8 @@ radeon_dp_detect(struct drm_connector *connector, bool force)
|
|
|
if (radeon_dp_getdpcd(radeon_connector))
|
|
|
ret = connector_status_connected;
|
|
|
} else {
|
|
|
- if (radeon_ddc_probe(radeon_connector))
|
|
|
+ if (radeon_ddc_probe(radeon_connector,
|
|
|
+ radeon_connector->requires_extended_probe))
|
|
|
ret = connector_status_connected;
|
|
|
}
|
|
|
}
|
|
@@ -1406,6 +1439,9 @@ radeon_add_atom_connector(struct drm_device *dev,
|
|
|
radeon_connector->shared_ddc = shared_ddc;
|
|
|
radeon_connector->connector_object_id = connector_object_id;
|
|
|
radeon_connector->hpd = *hpd;
|
|
|
+ radeon_connector->requires_extended_probe =
|
|
|
+ radeon_connector_needs_extended_probe(rdev, supported_device,
|
|
|
+ connector_type);
|
|
|
radeon_connector->router = *router;
|
|
|
if (router->ddc_valid || router->cd_valid) {
|
|
|
radeon_connector->router_bus = radeon_i2c_lookup(rdev, &router->i2c_info);
|
|
@@ -1752,6 +1788,9 @@ radeon_add_legacy_connector(struct drm_device *dev,
|
|
|
radeon_connector->devices = supported_device;
|
|
|
radeon_connector->connector_object_id = connector_object_id;
|
|
|
radeon_connector->hpd = *hpd;
|
|
|
+ radeon_connector->requires_extended_probe =
|
|
|
+ radeon_connector_needs_extended_probe(rdev, supported_device,
|
|
|
+ connector_type);
|
|
|
switch (connector_type) {
|
|
|
case DRM_MODE_CONNECTOR_VGA:
|
|
|
drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
|