aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2014-07-15 10:38:10 -0400
committerAlex Deucher <alexander.deucher@amd.com>2014-08-05 08:53:29 -0400
commit72a5c970a57b51f20f8876816869c937340176b5 (patch)
tree0ec8f5432e14015b29ee2198f030ba6b45d6d887
parent88fd4789cdc403a5fb0839fbb8ea8899d21c56bd (diff)
drm/radeon: restructure edid fetching
Split radeon_ddc_get_modes() and move it into radeon_connectors.c since that is the only place that uses it. Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/radeon/radeon_connectors.c162
-rw-r--r--drivers/gpu/drm/radeon/radeon_display.c58
-rw-r--r--drivers/gpu/drm/radeon/radeon_mode.h1
3 files changed, 110 insertions, 111 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
index ce50ea629c71..5b5d28ad9ba5 100644
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
@@ -262,6 +262,79 @@ static struct drm_encoder *radeon_find_encoder(struct drm_connector *connector,
262 return NULL; 262 return NULL;
263} 263}
264 264
265static void radeon_connector_get_edid(struct drm_connector *connector)
266{
267 struct drm_device *dev = connector->dev;
268 struct radeon_device *rdev = dev->dev_private;
269 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
270
271 if (radeon_connector->edid)
272 return;
273
274 /* on hw with routers, select right port */
275 if (radeon_connector->router.ddc_valid)
276 radeon_router_select_ddc_port(radeon_connector);
277
278 if ((radeon_connector_encoder_get_dp_bridge_encoder_id(connector) !=
279 ENCODER_OBJECT_ID_NONE) &&
280 radeon_connector->ddc_bus->has_aux) {
281 radeon_connector->edid = drm_get_edid(connector,
282 &radeon_connector->ddc_bus->aux.ddc);
283 } else if ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
284 (connector->connector_type == DRM_MODE_CONNECTOR_eDP)) {
285 struct radeon_connector_atom_dig *dig = radeon_connector->con_priv;
286
287 if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT ||
288 dig->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) &&
289 radeon_connector->ddc_bus->has_aux)
290 radeon_connector->edid = drm_get_edid(&radeon_connector->base,
291 &radeon_connector->ddc_bus->aux.ddc);
292 else if (radeon_connector->ddc_bus)
293 radeon_connector->edid = drm_get_edid(&radeon_connector->base,
294 &radeon_connector->ddc_bus->adapter);
295 } else if (radeon_connector->ddc_bus) {
296 radeon_connector->edid = drm_get_edid(&radeon_connector->base,
297 &radeon_connector->ddc_bus->adapter);
298 }
299
300 if (!radeon_connector->edid) {
301 if (rdev->is_atom_bios) {
302 /* some laptops provide a hardcoded edid in rom for LCDs */
303 if (((connector->connector_type == DRM_MODE_CONNECTOR_LVDS) ||
304 (connector->connector_type == DRM_MODE_CONNECTOR_eDP)))
305 radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev);
306 } else {
307 /* some servers provide a hardcoded edid in rom for KVMs */
308 radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev);
309 }
310 }
311}
312
313static void radeon_connector_free_edid(struct drm_connector *connector)
314{
315 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
316
317 if (radeon_connector->edid) {
318 kfree(radeon_connector->edid);
319 radeon_connector->edid = NULL;
320 }
321}
322
323static int radeon_ddc_get_modes(struct drm_connector *connector)
324{
325 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
326 int ret;
327
328 if (radeon_connector->edid) {
329 drm_mode_connector_update_edid_property(connector, radeon_connector->edid);
330 ret = drm_add_edid_modes(connector, radeon_connector->edid);
331 drm_edid_to_eld(connector, radeon_connector->edid);
332 return ret;
333 }
334 drm_mode_connector_update_edid_property(connector, NULL);
335 return 0;
336}
337
265static struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector) 338static struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector)
266{ 339{
267 int enc_id = connector->encoder_ids[0]; 340 int enc_id = connector->encoder_ids[0];
@@ -661,22 +734,20 @@ static void radeon_fixup_lvds_native_mode(struct drm_encoder *encoder,
661 734
662static int radeon_lvds_get_modes(struct drm_connector *connector) 735static int radeon_lvds_get_modes(struct drm_connector *connector)
663{ 736{
664 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
665 struct drm_encoder *encoder; 737 struct drm_encoder *encoder;
666 int ret = 0; 738 int ret = 0;
667 struct drm_display_mode *mode; 739 struct drm_display_mode *mode;
668 740
669 if (radeon_connector->ddc_bus) { 741 radeon_connector_get_edid(connector);
670 ret = radeon_ddc_get_modes(radeon_connector); 742 ret = radeon_ddc_get_modes(connector);
671 if (ret > 0) { 743 if (ret > 0) {
672 encoder = radeon_best_single_encoder(connector); 744 encoder = radeon_best_single_encoder(connector);
673 if (encoder) { 745 if (encoder) {
674 radeon_fixup_lvds_native_mode(encoder, connector); 746 radeon_fixup_lvds_native_mode(encoder, connector);
675 /* add scaled modes */ 747 /* add scaled modes */
676 radeon_add_common_modes(encoder, connector); 748 radeon_add_common_modes(encoder, connector);
677 }
678 return ret;
679 } 749 }
750 return ret;
680 } 751 }
681 752
682 encoder = radeon_best_single_encoder(connector); 753 encoder = radeon_best_single_encoder(connector);
@@ -751,16 +822,9 @@ radeon_lvds_detect(struct drm_connector *connector, bool force)
751 } 822 }
752 823
753 /* check for edid as well */ 824 /* check for edid as well */
825 radeon_connector_get_edid(connector);
754 if (radeon_connector->edid) 826 if (radeon_connector->edid)
755 ret = connector_status_connected; 827 ret = connector_status_connected;
756 else {
757 if (radeon_connector->ddc_bus) {
758 radeon_connector->edid = drm_get_edid(&radeon_connector->base,
759 &radeon_connector->ddc_bus->adapter);
760 if (radeon_connector->edid)
761 ret = connector_status_connected;
762 }
763 }
764 /* check acpi lid status ??? */ 828 /* check acpi lid status ??? */
765 829
766 radeon_connector_update_scratch_regs(connector, ret); 830 radeon_connector_update_scratch_regs(connector, ret);
@@ -773,8 +837,7 @@ static void radeon_connector_destroy(struct drm_connector *connector)
773{ 837{
774 struct radeon_connector *radeon_connector = to_radeon_connector(connector); 838 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
775 839
776 if (radeon_connector->edid) 840 radeon_connector_free_edid(connector);
777 kfree(radeon_connector->edid);
778 kfree(radeon_connector->con_priv); 841 kfree(radeon_connector->con_priv);
779 drm_connector_unregister(connector); 842 drm_connector_unregister(connector);
780 drm_connector_cleanup(connector); 843 drm_connector_cleanup(connector);
@@ -833,10 +896,10 @@ static const struct drm_connector_funcs radeon_lvds_connector_funcs = {
833 896
834static int radeon_vga_get_modes(struct drm_connector *connector) 897static int radeon_vga_get_modes(struct drm_connector *connector)
835{ 898{
836 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
837 int ret; 899 int ret;
838 900
839 ret = radeon_ddc_get_modes(radeon_connector); 901 radeon_connector_get_edid(connector);
902 ret = radeon_ddc_get_modes(connector);
840 903
841 radeon_get_native_mode(connector); 904 radeon_get_native_mode(connector);
842 905
@@ -881,28 +944,26 @@ radeon_vga_detect(struct drm_connector *connector, bool force)
881 dret = radeon_ddc_probe(radeon_connector, false); 944 dret = radeon_ddc_probe(radeon_connector, false);
882 if (dret) { 945 if (dret) {
883 radeon_connector->detected_by_load = false; 946 radeon_connector->detected_by_load = false;
884 if (radeon_connector->edid) { 947 radeon_connector_free_edid(connector);
885 kfree(radeon_connector->edid); 948 radeon_connector_get_edid(connector);
886 radeon_connector->edid = NULL;
887 }
888 radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
889 949
890 if (!radeon_connector->edid) { 950 if (!radeon_connector->edid) {
891 DRM_ERROR("%s: probed a monitor but no|invalid EDID\n", 951 DRM_ERROR("%s: probed a monitor but no|invalid EDID\n",
892 connector->name); 952 connector->name);
893 ret = connector_status_connected; 953 ret = connector_status_connected;
894 } else { 954 } else {
895 radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL); 955 radeon_connector->use_digital =
956 !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
896 957
897 /* some oems have boards with separate digital and analog connectors 958 /* some oems have boards with separate digital and analog connectors
898 * with a shared ddc line (often vga + hdmi) 959 * with a shared ddc line (often vga + hdmi)
899 */ 960 */
900 if (radeon_connector->use_digital && radeon_connector->shared_ddc) { 961 if (radeon_connector->use_digital && radeon_connector->shared_ddc) {
901 kfree(radeon_connector->edid); 962 radeon_connector_free_edid(connector);
902 radeon_connector->edid = NULL;
903 ret = connector_status_disconnected; 963 ret = connector_status_disconnected;
904 } else 964 } else {
905 ret = connector_status_connected; 965 ret = connector_status_connected;
966 }
906 } 967 }
907 } else { 968 } else {
908 969
@@ -1094,18 +1155,16 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
1094 dret = radeon_ddc_probe(radeon_connector, false); 1155 dret = radeon_ddc_probe(radeon_connector, false);
1095 if (dret) { 1156 if (dret) {
1096 radeon_connector->detected_by_load = false; 1157 radeon_connector->detected_by_load = false;
1097 if (radeon_connector->edid) { 1158 radeon_connector_free_edid(connector);
1098 kfree(radeon_connector->edid); 1159 radeon_connector_get_edid(connector);
1099 radeon_connector->edid = NULL;
1100 }
1101 radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
1102 1160
1103 if (!radeon_connector->edid) { 1161 if (!radeon_connector->edid) {
1104 DRM_ERROR("%s: probed a monitor but no|invalid EDID\n", 1162 DRM_ERROR("%s: probed a monitor but no|invalid EDID\n",
1105 connector->name); 1163 connector->name);
1106 /* rs690 seems to have a problem with connectors not existing and always 1164 /* rs690 seems to have a problem with connectors not existing and always
1107 * return a block of 0's. If we see this just stop polling on this output */ 1165 * return a block of 0's. If we see this just stop polling on this output */
1108 if ((rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) && radeon_connector->base.null_edid_counter) { 1166 if ((rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) &&
1167 radeon_connector->base.null_edid_counter) {
1109 ret = connector_status_disconnected; 1168 ret = connector_status_disconnected;
1110 DRM_ERROR("%s: detected RS690 floating bus bug, stopping ddc detect\n", 1169 DRM_ERROR("%s: detected RS690 floating bus bug, stopping ddc detect\n",
1111 connector->name); 1170 connector->name);
@@ -1115,18 +1174,18 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
1115 broken_edid = true; /* defer use_digital to later */ 1174 broken_edid = true; /* defer use_digital to later */
1116 } 1175 }
1117 } else { 1176 } else {
1118 radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL); 1177 radeon_connector->use_digital =
1178 !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
1119 1179
1120 /* some oems have boards with separate digital and analog connectors 1180 /* some oems have boards with separate digital and analog connectors
1121 * with a shared ddc line (often vga + hdmi) 1181 * with a shared ddc line (often vga + hdmi)
1122 */ 1182 */
1123 if ((!radeon_connector->use_digital) && radeon_connector->shared_ddc) { 1183 if ((!radeon_connector->use_digital) && radeon_connector->shared_ddc) {
1124 kfree(radeon_connector->edid); 1184 radeon_connector_free_edid(connector);
1125 radeon_connector->edid = NULL;
1126 ret = connector_status_disconnected; 1185 ret = connector_status_disconnected;
1127 } else 1186 } else {
1128 ret = connector_status_connected; 1187 ret = connector_status_connected;
1129 1188 }
1130 /* This gets complicated. We have boards with VGA + HDMI with a 1189 /* This gets complicated. We have boards with VGA + HDMI with a
1131 * shared DDC line and we have boards with DVI-D + HDMI with a shared 1190 * shared DDC line and we have boards with DVI-D + HDMI with a shared
1132 * DDC line. The latter is more complex because with DVI<->HDMI adapters 1191 * DDC line. The latter is more complex because with DVI<->HDMI adapters
@@ -1146,8 +1205,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
1146 if (list_connector->connector_type != DRM_MODE_CONNECTOR_VGA) { 1205 if (list_connector->connector_type != DRM_MODE_CONNECTOR_VGA) {
1147 /* hpd is our only option in this case */ 1206 /* hpd is our only option in this case */
1148 if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { 1207 if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
1149 kfree(radeon_connector->edid); 1208 radeon_connector_free_edid(connector);
1150 radeon_connector->edid = NULL;
1151 ret = connector_status_disconnected; 1209 ret = connector_status_disconnected;
1152 } 1210 }
1153 } 1211 }
@@ -1356,7 +1414,8 @@ static int radeon_dp_get_modes(struct drm_connector *connector)
1356 if (!radeon_dig_connector->edp_on) 1414 if (!radeon_dig_connector->edp_on)
1357 atombios_set_edp_panel_power(connector, 1415 atombios_set_edp_panel_power(connector,
1358 ATOM_TRANSMITTER_ACTION_POWER_ON); 1416 ATOM_TRANSMITTER_ACTION_POWER_ON);
1359 ret = radeon_ddc_get_modes(radeon_connector); 1417 radeon_connector_get_edid(connector);
1418 ret = radeon_ddc_get_modes(connector);
1360 if (!radeon_dig_connector->edp_on) 1419 if (!radeon_dig_connector->edp_on)
1361 atombios_set_edp_panel_power(connector, 1420 atombios_set_edp_panel_power(connector,
1362 ATOM_TRANSMITTER_ACTION_POWER_OFF); 1421 ATOM_TRANSMITTER_ACTION_POWER_OFF);
@@ -1367,7 +1426,8 @@ static int radeon_dp_get_modes(struct drm_connector *connector)
1367 if (encoder) 1426 if (encoder)
1368 radeon_atom_ext_encoder_setup_ddc(encoder); 1427 radeon_atom_ext_encoder_setup_ddc(encoder);
1369 } 1428 }
1370 ret = radeon_ddc_get_modes(radeon_connector); 1429 radeon_connector_get_edid(connector);
1430 ret = radeon_ddc_get_modes(connector);
1371 } 1431 }
1372 1432
1373 if (ret > 0) { 1433 if (ret > 0) {
@@ -1400,7 +1460,8 @@ static int radeon_dp_get_modes(struct drm_connector *connector)
1400 if (encoder) 1460 if (encoder)
1401 radeon_atom_ext_encoder_setup_ddc(encoder); 1461 radeon_atom_ext_encoder_setup_ddc(encoder);
1402 } 1462 }
1403 ret = radeon_ddc_get_modes(radeon_connector); 1463 radeon_connector_get_edid(connector);
1464 ret = radeon_ddc_get_modes(connector);
1404 1465
1405 radeon_get_native_mode(connector); 1466 radeon_get_native_mode(connector);
1406 } 1467 }
@@ -1493,10 +1554,7 @@ radeon_dp_detect(struct drm_connector *connector, bool force)
1493 goto out; 1554 goto out;
1494 } 1555 }
1495 1556
1496 if (radeon_connector->edid) { 1557 radeon_connector_free_edid(connector);
1497 kfree(radeon_connector->edid);
1498 radeon_connector->edid = NULL;
1499 }
1500 1558
1501 if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) || 1559 if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
1502 (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) { 1560 (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
index bf25061c8ac4..004f30c170f6 100644
--- a/drivers/gpu/drm/radeon/radeon_display.c
+++ b/drivers/gpu/drm/radeon/radeon_display.c
@@ -823,64 +823,6 @@ static bool radeon_setup_enc_conn(struct drm_device *dev)
823 return ret; 823 return ret;
824} 824}
825 825
826int radeon_ddc_get_modes(struct radeon_connector *radeon_connector)
827{
828 struct drm_device *dev = radeon_connector->base.dev;
829 struct radeon_device *rdev = dev->dev_private;
830 int ret = 0;
831
832 /* don't leak the edid if we already fetched it in detect() */
833 if (radeon_connector->edid)
834 goto got_edid;
835
836 /* on hw with routers, select right port */
837 if (radeon_connector->router.ddc_valid)
838 radeon_router_select_ddc_port(radeon_connector);
839
840 if (radeon_connector_encoder_get_dp_bridge_encoder_id(&radeon_connector->base) !=
841 ENCODER_OBJECT_ID_NONE) {
842 if (radeon_connector->ddc_bus->has_aux)
843 radeon_connector->edid = drm_get_edid(&radeon_connector->base,
844 &radeon_connector->ddc_bus->aux.ddc);
845 } else if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
846 (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)) {
847 struct radeon_connector_atom_dig *dig = radeon_connector->con_priv;
848
849 if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT ||
850 dig->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) &&
851 radeon_connector->ddc_bus->has_aux)
852 radeon_connector->edid = drm_get_edid(&radeon_connector->base,
853 &radeon_connector->ddc_bus->aux.ddc);
854 else if (radeon_connector->ddc_bus && !radeon_connector->edid)
855 radeon_connector->edid = drm_get_edid(&radeon_connector->base,
856 &radeon_connector->ddc_bus->adapter);
857 } else {
858 if (radeon_connector->ddc_bus && !radeon_connector->edid)
859 radeon_connector->edid = drm_get_edid(&radeon_connector->base,
860 &radeon_connector->ddc_bus->adapter);
861 }
862
863 if (!radeon_connector->edid) {
864 if (rdev->is_atom_bios) {
865 /* some laptops provide a hardcoded edid in rom for LCDs */
866 if (((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_LVDS) ||
867 (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)))
868 radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev);
869 } else
870 /* some servers provide a hardcoded edid in rom for KVMs */
871 radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev);
872 }
873 if (radeon_connector->edid) {
874got_edid:
875 drm_mode_connector_update_edid_property(&radeon_connector->base, radeon_connector->edid);
876 ret = drm_add_edid_modes(&radeon_connector->base, radeon_connector->edid);
877 drm_edid_to_eld(&radeon_connector->base, radeon_connector->edid);
878 return ret;
879 }
880 drm_mode_connector_update_edid_property(&radeon_connector->base, NULL);
881 return 0;
882}
883
884/* avivo */ 826/* avivo */
885 827
886/** 828/**
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
index 0592ddb0904b..9c2bfcd3576e 100644
--- a/drivers/gpu/drm/radeon/radeon_mode.h
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
@@ -738,7 +738,6 @@ extern void radeon_i2c_put_byte(struct radeon_i2c_chan *i2c,
738extern void radeon_router_select_ddc_port(struct radeon_connector *radeon_connector); 738extern void radeon_router_select_ddc_port(struct radeon_connector *radeon_connector);
739extern void radeon_router_select_cd_port(struct radeon_connector *radeon_connector); 739extern void radeon_router_select_cd_port(struct radeon_connector *radeon_connector);
740extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector, bool use_aux); 740extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector, bool use_aux);
741extern int radeon_ddc_get_modes(struct radeon_connector *radeon_connector);
742 741
743extern struct drm_encoder *radeon_best_encoder(struct drm_connector *connector); 742extern struct drm_encoder *radeon_best_encoder(struct drm_connector *connector);
744 743