aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2014-07-15 11:00:47 -0400
committerAlex Deucher <alexander.deucher@amd.com>2014-08-05 08:53:30 -0400
commit377bd8a98d7dccd9b71a1cef259821389f09da38 (patch)
tree17372cd794e0b466c0d54232a4f2d3405fd8218e
parent72a5c970a57b51f20f8876816869c937340176b5 (diff)
drm/radeon: use a fetch function to get the edid
We keep a cached version of the edid in radeon_connector which we use for determining connectedness and when to enable certain features like hdmi audio, etc. When the user uses the firmware interface to override the driver with some other edid the driver's copy is never updated. The fetch function will check if there is a user supplied edid and update the driver's copy if there is. bug: https://bugs.freedesktop.org/show_bug.cgi?id=80691 Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/radeon/atombios_encoders.c6
-rw-r--r--drivers/gpu/drm/radeon/dce6_afmt.c4
-rw-r--r--drivers/gpu/drm/radeon/evergreen_hdmi.c4
-rw-r--r--drivers/gpu/drm/radeon/radeon_connectors.c27
-rw-r--r--drivers/gpu/drm/radeon/radeon_display.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon_encoders.c4
-rw-r--r--drivers/gpu/drm/radeon/radeon_mode.h2
7 files changed, 33 insertions, 16 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c
index 34fe641c3b51..a7f2ddf09a9d 100644
--- a/drivers/gpu/drm/radeon/atombios_encoders.c
+++ b/drivers/gpu/drm/radeon/atombios_encoders.c
@@ -716,7 +716,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
716 if (radeon_connector->use_digital && 716 if (radeon_connector->use_digital &&
717 (radeon_connector->audio == RADEON_AUDIO_ENABLE)) 717 (radeon_connector->audio == RADEON_AUDIO_ENABLE))
718 return ATOM_ENCODER_MODE_HDMI; 718 return ATOM_ENCODER_MODE_HDMI;
719 else if (drm_detect_hdmi_monitor(radeon_connector->edid) && 719 else if (drm_detect_hdmi_monitor(radeon_connector_edid(connector)) &&
720 (radeon_connector->audio == RADEON_AUDIO_AUTO)) 720 (radeon_connector->audio == RADEON_AUDIO_AUTO))
721 return ATOM_ENCODER_MODE_HDMI; 721 return ATOM_ENCODER_MODE_HDMI;
722 else if (radeon_connector->use_digital) 722 else if (radeon_connector->use_digital)
@@ -735,7 +735,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
735 if (radeon_audio != 0) { 735 if (radeon_audio != 0) {
736 if (radeon_connector->audio == RADEON_AUDIO_ENABLE) 736 if (radeon_connector->audio == RADEON_AUDIO_ENABLE)
737 return ATOM_ENCODER_MODE_HDMI; 737 return ATOM_ENCODER_MODE_HDMI;
738 else if (drm_detect_hdmi_monitor(radeon_connector->edid) && 738 else if (drm_detect_hdmi_monitor(radeon_connector_edid(connector)) &&
739 (radeon_connector->audio == RADEON_AUDIO_AUTO)) 739 (radeon_connector->audio == RADEON_AUDIO_AUTO))
740 return ATOM_ENCODER_MODE_HDMI; 740 return ATOM_ENCODER_MODE_HDMI;
741 else 741 else
@@ -755,7 +755,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
755 } else if (radeon_audio != 0) { 755 } else if (radeon_audio != 0) {
756 if (radeon_connector->audio == RADEON_AUDIO_ENABLE) 756 if (radeon_connector->audio == RADEON_AUDIO_ENABLE)
757 return ATOM_ENCODER_MODE_HDMI; 757 return ATOM_ENCODER_MODE_HDMI;
758 else if (drm_detect_hdmi_monitor(radeon_connector->edid) && 758 else if (drm_detect_hdmi_monitor(radeon_connector_edid(connector)) &&
759 (radeon_connector->audio == RADEON_AUDIO_AUTO)) 759 (radeon_connector->audio == RADEON_AUDIO_AUTO))
760 return ATOM_ENCODER_MODE_HDMI; 760 return ATOM_ENCODER_MODE_HDMI;
761 else 761 else
diff --git a/drivers/gpu/drm/radeon/dce6_afmt.c b/drivers/gpu/drm/radeon/dce6_afmt.c
index edcf1598da6b..ab29f953a767 100644
--- a/drivers/gpu/drm/radeon/dce6_afmt.c
+++ b/drivers/gpu/drm/radeon/dce6_afmt.c
@@ -175,7 +175,7 @@ void dce6_afmt_write_speaker_allocation(struct drm_encoder *encoder)
175 return; 175 return;
176 } 176 }
177 177
178 sad_count = drm_edid_to_speaker_allocation(radeon_connector->edid, &sadb); 178 sad_count = drm_edid_to_speaker_allocation(radeon_connector_edid(connector), &sadb);
179 if (sad_count <= 0) { 179 if (sad_count <= 0) {
180 DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count); 180 DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count);
181 return; 181 return;
@@ -238,7 +238,7 @@ void dce6_afmt_write_sad_regs(struct drm_encoder *encoder)
238 return; 238 return;
239 } 239 }
240 240
241 sad_count = drm_edid_to_sad(radeon_connector->edid, &sads); 241 sad_count = drm_edid_to_sad(radeon_connector_edid(connector), &sads);
242 if (sad_count <= 0) { 242 if (sad_count <= 0) {
243 DRM_ERROR("Couldn't read SADs: %d\n", sad_count); 243 DRM_ERROR("Couldn't read SADs: %d\n", sad_count);
244 return; 244 return;
diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c
index 1ec0e6e83f9f..278c7a139d74 100644
--- a/drivers/gpu/drm/radeon/evergreen_hdmi.c
+++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c
@@ -117,7 +117,7 @@ static void dce4_afmt_write_speaker_allocation(struct drm_encoder *encoder)
117 return; 117 return;
118 } 118 }
119 119
120 sad_count = drm_edid_to_speaker_allocation(radeon_connector->edid, &sadb); 120 sad_count = drm_edid_to_speaker_allocation(radeon_connector_edid(connector), &sadb);
121 if (sad_count <= 0) { 121 if (sad_count <= 0) {
122 DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count); 122 DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count);
123 return; 123 return;
@@ -172,7 +172,7 @@ static void evergreen_hdmi_write_sad_regs(struct drm_encoder *encoder)
172 return; 172 return;
173 } 173 }
174 174
175 sad_count = drm_edid_to_sad(radeon_connector->edid, &sads); 175 sad_count = drm_edid_to_sad(radeon_connector_edid(connector), &sads);
176 if (sad_count <= 0) { 176 if (sad_count <= 0) {
177 DRM_ERROR("Couldn't read SADs: %d\n", sad_count); 177 DRM_ERROR("Couldn't read SADs: %d\n", sad_count);
178 return; 178 return;
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
index 5b5d28ad9ba5..1651defb2df7 100644
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
@@ -107,7 +107,7 @@ int radeon_get_monitor_bpc(struct drm_connector *connector)
107 case DRM_MODE_CONNECTOR_DVII: 107 case DRM_MODE_CONNECTOR_DVII:
108 case DRM_MODE_CONNECTOR_HDMIB: 108 case DRM_MODE_CONNECTOR_HDMIB:
109 if (radeon_connector->use_digital) { 109 if (radeon_connector->use_digital) {
110 if (drm_detect_hdmi_monitor(radeon_connector->edid)) { 110 if (drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
111 if (connector->display_info.bpc) 111 if (connector->display_info.bpc)
112 bpc = connector->display_info.bpc; 112 bpc = connector->display_info.bpc;
113 } 113 }
@@ -115,7 +115,7 @@ int radeon_get_monitor_bpc(struct drm_connector *connector)
115 break; 115 break;
116 case DRM_MODE_CONNECTOR_DVID: 116 case DRM_MODE_CONNECTOR_DVID:
117 case DRM_MODE_CONNECTOR_HDMIA: 117 case DRM_MODE_CONNECTOR_HDMIA:
118 if (drm_detect_hdmi_monitor(radeon_connector->edid)) { 118 if (drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
119 if (connector->display_info.bpc) 119 if (connector->display_info.bpc)
120 bpc = connector->display_info.bpc; 120 bpc = connector->display_info.bpc;
121 } 121 }
@@ -124,7 +124,7 @@ int radeon_get_monitor_bpc(struct drm_connector *connector)
124 dig_connector = radeon_connector->con_priv; 124 dig_connector = radeon_connector->con_priv;
125 if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || 125 if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
126 (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) || 126 (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) ||
127 drm_detect_hdmi_monitor(radeon_connector->edid)) { 127 drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
128 if (connector->display_info.bpc) 128 if (connector->display_info.bpc)
129 bpc = connector->display_info.bpc; 129 bpc = connector->display_info.bpc;
130 } 130 }
@@ -148,7 +148,7 @@ int radeon_get_monitor_bpc(struct drm_connector *connector)
148 break; 148 break;
149 } 149 }
150 150
151 if (drm_detect_hdmi_monitor(radeon_connector->edid)) { 151 if (drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
152 /* hdmi deep color only implemented on DCE4+ */ 152 /* hdmi deep color only implemented on DCE4+ */
153 if ((bpc > 8) && !ASIC_IS_DCE4(rdev)) { 153 if ((bpc > 8) && !ASIC_IS_DCE4(rdev)) {
154 DRM_DEBUG("%s: HDMI deep color %d bpc unsupported. Using 8 bpc.\n", 154 DRM_DEBUG("%s: HDMI deep color %d bpc unsupported. Using 8 bpc.\n",
@@ -262,6 +262,21 @@ static struct drm_encoder *radeon_find_encoder(struct drm_connector *connector,
262 return NULL; 262 return NULL;
263} 263}
264 264
265struct edid *radeon_connector_edid(struct drm_connector *connector)
266{
267 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
268 struct drm_property_blob *edid_blob = connector->edid_blob_ptr;
269
270 if (radeon_connector->edid) {
271 return radeon_connector->edid;
272 } else if (edid_blob) {
273 struct edid *edid = kmemdup(edid_blob->data, edid_blob->length, GFP_KERNEL);
274 if (edid)
275 radeon_connector->edid = edid;
276 }
277 return radeon_connector->edid;
278}
279
265static void radeon_connector_get_edid(struct drm_connector *connector) 280static void radeon_connector_get_edid(struct drm_connector *connector)
266{ 281{
267 struct drm_device *dev = connector->dev; 282 struct drm_device *dev = connector->dev;
@@ -1366,7 +1381,7 @@ static int radeon_dvi_mode_valid(struct drm_connector *connector,
1366 (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) || 1381 (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) ||
1367 (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B)) 1382 (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B))
1368 return MODE_OK; 1383 return MODE_OK;
1369 else if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) { 1384 else if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
1370 /* HDMI 1.3+ supports max clock of 340 Mhz */ 1385 /* HDMI 1.3+ supports max clock of 340 Mhz */
1371 if (mode->clock > 340000) 1386 if (mode->clock > 340000)
1372 return MODE_CLOCK_HIGH; 1387 return MODE_CLOCK_HIGH;
@@ -1660,7 +1675,7 @@ static int radeon_dp_mode_valid(struct drm_connector *connector,
1660 (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) { 1675 (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) {
1661 return radeon_dp_mode_valid_helper(connector, mode); 1676 return radeon_dp_mode_valid_helper(connector, mode);
1662 } else { 1677 } else {
1663 if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) { 1678 if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
1664 /* HDMI 1.3+ supports max clock of 340 Mhz */ 1679 /* HDMI 1.3+ supports max clock of 340 Mhz */
1665 if (mode->clock > 340000) 1680 if (mode->clock > 340000)
1666 return MODE_CLOCK_HIGH; 1681 return MODE_CLOCK_HIGH;
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
index 004f30c170f6..a966074a4fba 100644
--- a/drivers/gpu/drm/radeon/radeon_display.c
+++ b/drivers/gpu/drm/radeon/radeon_display.c
@@ -1691,7 +1691,7 @@ bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc,
1691 (!(mode->flags & DRM_MODE_FLAG_INTERLACE)) && 1691 (!(mode->flags & DRM_MODE_FLAG_INTERLACE)) &&
1692 ((radeon_encoder->underscan_type == UNDERSCAN_ON) || 1692 ((radeon_encoder->underscan_type == UNDERSCAN_ON) ||
1693 ((radeon_encoder->underscan_type == UNDERSCAN_AUTO) && 1693 ((radeon_encoder->underscan_type == UNDERSCAN_AUTO) &&
1694 drm_detect_hdmi_monitor(radeon_connector->edid) && 1694 drm_detect_hdmi_monitor(radeon_connector_edid(connector)) &&
1695 is_hdtv_mode(mode)))) { 1695 is_hdtv_mode(mode)))) {
1696 if (radeon_encoder->underscan_hborder != 0) 1696 if (radeon_encoder->underscan_hborder != 0)
1697 radeon_crtc->h_border = radeon_encoder->underscan_hborder; 1697 radeon_crtc->h_border = radeon_encoder->underscan_hborder;
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c
index bd4959ca23aa..3c2094c25b53 100644
--- a/drivers/gpu/drm/radeon/radeon_encoders.c
+++ b/drivers/gpu/drm/radeon/radeon_encoders.c
@@ -343,7 +343,7 @@ bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder,
343 case DRM_MODE_CONNECTOR_HDMIB: 343 case DRM_MODE_CONNECTOR_HDMIB:
344 if (radeon_connector->use_digital) { 344 if (radeon_connector->use_digital) {
345 /* HDMI 1.3 supports up to 340 Mhz over single link */ 345 /* HDMI 1.3 supports up to 340 Mhz over single link */
346 if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) { 346 if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
347 if (pixel_clock > 340000) 347 if (pixel_clock > 340000)
348 return true; 348 return true;
349 else 349 else
@@ -365,7 +365,7 @@ bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder,
365 return false; 365 return false;
366 else { 366 else {
367 /* HDMI 1.3 supports up to 340 Mhz over single link */ 367 /* HDMI 1.3 supports up to 340 Mhz over single link */
368 if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) { 368 if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) {
369 if (pixel_clock > 340000) 369 if (pixel_clock > 340000)
370 return true; 370 return true;
371 else 371 else
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
index 9c2bfcd3576e..9ccae81c7d88 100644
--- a/drivers/gpu/drm/radeon/radeon_mode.h
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
@@ -689,6 +689,8 @@ extern bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector);
689extern bool radeon_connector_is_dp12_capable(struct drm_connector *connector); 689extern bool radeon_connector_is_dp12_capable(struct drm_connector *connector);
690extern int radeon_get_monitor_bpc(struct drm_connector *connector); 690extern int radeon_get_monitor_bpc(struct drm_connector *connector);
691 691
692extern struct edid *radeon_connector_edid(struct drm_connector *connector);
693
692extern void radeon_connector_hotplug(struct drm_connector *connector); 694extern void radeon_connector_hotplug(struct drm_connector *connector);
693extern int radeon_dp_mode_valid_helper(struct drm_connector *connector, 695extern int radeon_dp_mode_valid_helper(struct drm_connector *connector,
694 struct drm_display_mode *mode); 696 struct drm_display_mode *mode);