if (radeon_connector->use_digital &&
                            (radeon_connector->audio == RADEON_AUDIO_ENABLE))
                                return ATOM_ENCODER_MODE_HDMI;
-                       else if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
+                       else if (drm_detect_hdmi_monitor(radeon_connector_edid(connector)) &&
                                 (radeon_connector->audio == RADEON_AUDIO_AUTO))
                                return ATOM_ENCODER_MODE_HDMI;
                        else if (radeon_connector->use_digital)
                if (radeon_audio != 0) {
                        if (radeon_connector->audio == RADEON_AUDIO_ENABLE)
                                return ATOM_ENCODER_MODE_HDMI;
-                       else if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
+                       else if (drm_detect_hdmi_monitor(radeon_connector_edid(connector)) &&
                                 (radeon_connector->audio == RADEON_AUDIO_AUTO))
                                return ATOM_ENCODER_MODE_HDMI;
                        else
                } else if (radeon_audio != 0) {
                        if (radeon_connector->audio == RADEON_AUDIO_ENABLE)
                                return ATOM_ENCODER_MODE_HDMI;
-                       else if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
+                       else if (drm_detect_hdmi_monitor(radeon_connector_edid(connector)) &&
                                 (radeon_connector->audio == RADEON_AUDIO_AUTO))
                                return ATOM_ENCODER_MODE_HDMI;
                        else
 
                return;
        }
 
-       sad_count = drm_edid_to_speaker_allocation(radeon_connector->edid, &sadb);
+       sad_count = drm_edid_to_speaker_allocation(radeon_connector_edid(connector), &sadb);
        if (sad_count <= 0) {
                DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count);
                return;
                return;
        }
 
-       sad_count = drm_edid_to_sad(radeon_connector->edid, &sads);
+       sad_count = drm_edid_to_sad(radeon_connector_edid(connector), &sads);
        if (sad_count <= 0) {
                DRM_ERROR("Couldn't read SADs: %d\n", sad_count);
                return;
 
                return;
        }
 
-       sad_count = drm_edid_to_speaker_allocation(radeon_connector->edid, &sadb);
+       sad_count = drm_edid_to_speaker_allocation(radeon_connector_edid(connector), &sadb);
        if (sad_count <= 0) {
                DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count);
                return;
                return;
        }
 
-       sad_count = drm_edid_to_sad(radeon_connector->edid, &sads);
+       sad_count = drm_edid_to_sad(radeon_connector_edid(connector), &sads);
        if (sad_count <= 0) {
                DRM_ERROR("Couldn't read SADs: %d\n", sad_count);
                return;
 
        case DRM_MODE_CONNECTOR_DVII:
        case DRM_MODE_CONNECTOR_HDMIB:
                if (radeon_connector->use_digital) {
-                       if (drm_detect_hdmi_monitor(radeon_connector->edid)) {
+                       if (drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
                                if (connector->display_info.bpc)
                                        bpc = connector->display_info.bpc;
                        }
                break;
        case DRM_MODE_CONNECTOR_DVID:
        case DRM_MODE_CONNECTOR_HDMIA:
-               if (drm_detect_hdmi_monitor(radeon_connector->edid)) {
+               if (drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
                        if (connector->display_info.bpc)
                                bpc = connector->display_info.bpc;
                }
                dig_connector = radeon_connector->con_priv;
                if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
                    (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) ||
-                   drm_detect_hdmi_monitor(radeon_connector->edid)) {
+                   drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
                        if (connector->display_info.bpc)
                                bpc = connector->display_info.bpc;
                }
                break;
        }
 
-       if (drm_detect_hdmi_monitor(radeon_connector->edid)) {
+       if (drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
                /* hdmi deep color only implemented on DCE4+ */
                if ((bpc > 8) && !ASIC_IS_DCE4(rdev)) {
                        DRM_DEBUG("%s: HDMI deep color %d bpc unsupported. Using 8 bpc.\n",
        return NULL;
 }
 
+struct edid *radeon_connector_edid(struct drm_connector *connector)
+{
+       struct radeon_connector *radeon_connector = to_radeon_connector(connector);
+       struct drm_property_blob *edid_blob = connector->edid_blob_ptr;
+
+       if (radeon_connector->edid) {
+               return radeon_connector->edid;
+       } else if (edid_blob) {
+               struct edid *edid = kmemdup(edid_blob->data, edid_blob->length, GFP_KERNEL);
+               if (edid)
+                       radeon_connector->edid = edid;
+       }
+       return radeon_connector->edid;
+}
+
 static void radeon_connector_get_edid(struct drm_connector *connector)
 {
        struct drm_device *dev = connector->dev;
                    (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) ||
                    (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B))
                        return MODE_OK;
-               else if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) {
+               else if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
                        /* HDMI 1.3+ supports max clock of 340 Mhz */
                        if (mode->clock > 340000)
                                return MODE_CLOCK_HIGH;
                    (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) {
                        return radeon_dp_mode_valid_helper(connector, mode);
                } else {
-                       if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) {
+                       if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
                                /* HDMI 1.3+ supports max clock of 340 Mhz */
                                if (mode->clock > 340000)
                                        return MODE_CLOCK_HIGH;
 
                            (!(mode->flags & DRM_MODE_FLAG_INTERLACE)) &&
                            ((radeon_encoder->underscan_type == UNDERSCAN_ON) ||
                             ((radeon_encoder->underscan_type == UNDERSCAN_AUTO) &&
-                             drm_detect_hdmi_monitor(radeon_connector->edid) &&
+                             drm_detect_hdmi_monitor(radeon_connector_edid(connector)) &&
                              is_hdtv_mode(mode)))) {
                                if (radeon_encoder->underscan_hborder != 0)
                                        radeon_crtc->h_border = radeon_encoder->underscan_hborder;
 
        case DRM_MODE_CONNECTOR_HDMIB:
                if (radeon_connector->use_digital) {
                        /* HDMI 1.3 supports up to 340 Mhz over single link */
-                       if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) {
+                       if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
                                if (pixel_clock > 340000)
                                        return true;
                                else
                        return false;
                else {
                        /* HDMI 1.3 supports up to 340 Mhz over single link */
-                       if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) {
+                       if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
                                if (pixel_clock > 340000)
                                        return true;
                                else
 
 extern bool radeon_connector_is_dp12_capable(struct drm_connector *connector);
 extern int radeon_get_monitor_bpc(struct drm_connector *connector);
 
+extern struct edid *radeon_connector_edid(struct drm_connector *connector);
+
 extern void radeon_connector_hotplug(struct drm_connector *connector);
 extern int radeon_dp_mode_valid_helper(struct drm_connector *connector,
                                       struct drm_display_mode *mode);