drm/amdgpu: replace drm_detect_hdmi_monitor() with drm_display_info.is_hdmi
authorClaudio Suarez <cssk@net-c.es>
Sun, 17 Oct 2021 11:35:00 +0000 (13:35 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 7 Dec 2021 18:13:07 +0000 (13:13 -0500)
Once EDID is parsed, the monitor HDMI support information is available
through drm_display_info.is_hdmi. The amdgpu driver still calls
drm_detect_hdmi_monitor() to retrieve the same information, which
is less efficient. Change to drm_display_info.is_hdmi

This is a TODO task in Documentation/gpu/todo.rst

Reviewed-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Claudio Suarez <cssk@net-c.es>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c
drivers/gpu/drm/amd/amdgpu/atombios_encoders.c
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
drivers/gpu/drm/amd/display/dc/core/dc.c
drivers/gpu/drm/amd/display/dc/dm_helpers.h

index e5fc5a1ea394af94f3fb0292e59562ab29062006..c16a2704ced65a01da8b19ce2736d41b2da6848b 100644 (file)
@@ -108,7 +108,7 @@ int amdgpu_connector_get_monitor_bpc(struct drm_connector *connector)
        case DRM_MODE_CONNECTOR_DVII:
        case DRM_MODE_CONNECTOR_HDMIB:
                if (amdgpu_connector->use_digital) {
-                       if (drm_detect_hdmi_monitor(amdgpu_connector_edid(connector))) {
+                       if (connector->display_info.is_hdmi) {
                                if (connector->display_info.bpc)
                                        bpc = connector->display_info.bpc;
                        }
@@ -116,7 +116,7 @@ int amdgpu_connector_get_monitor_bpc(struct drm_connector *connector)
                break;
        case DRM_MODE_CONNECTOR_DVID:
        case DRM_MODE_CONNECTOR_HDMIA:
-               if (drm_detect_hdmi_monitor(amdgpu_connector_edid(connector))) {
+               if (connector->display_info.is_hdmi) {
                        if (connector->display_info.bpc)
                                bpc = connector->display_info.bpc;
                }
@@ -125,7 +125,7 @@ int amdgpu_connector_get_monitor_bpc(struct drm_connector *connector)
                dig_connector = amdgpu_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(amdgpu_connector_edid(connector))) {
+                   connector->display_info.is_hdmi) {
                        if (connector->display_info.bpc)
                                bpc = connector->display_info.bpc;
                }
@@ -149,7 +149,7 @@ int amdgpu_connector_get_monitor_bpc(struct drm_connector *connector)
                break;
        }
 
-       if (drm_detect_hdmi_monitor(amdgpu_connector_edid(connector))) {
+       if (connector->display_info.is_hdmi) {
                /*
                 * Pre DCE-8 hw can't handle > 12 bpc, and more than 12 bpc doesn't make
                 * much sense without support for > 12 bpc framebuffers. RGB 4:4:4 at
@@ -1180,7 +1180,7 @@ static enum drm_mode_status amdgpu_connector_dvi_mode_valid(struct drm_connector
                    (amdgpu_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) ||
                    (amdgpu_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B)) {
                        return MODE_OK;
-               } else if (drm_detect_hdmi_monitor(amdgpu_connector_edid(connector))) {
+               } else if (connector->display_info.is_hdmi) {
                        /* HDMI 1.3+ supports max clock of 340 Mhz */
                        if (mode->clock > 340000)
                                return MODE_CLOCK_HIGH;
@@ -1472,7 +1472,7 @@ static enum drm_mode_status amdgpu_connector_dp_mode_valid(struct drm_connector
                    (amdgpu_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) {
                        return amdgpu_atombios_dp_mode_valid_helper(connector, mode);
                } else {
-                       if (drm_detect_hdmi_monitor(amdgpu_connector_edid(connector))) {
+                       if (connector->display_info.is_hdmi) {
                                /* HDMI 1.3+ supports max clock of 340 Mhz */
                                if (mode->clock > 340000)
                                        return MODE_CLOCK_HIGH;
index 5faf3ef28080dab2b5c0d70249cfe87f937726d6..f52bc5da85d8ad587d1b6d4c2a1d56ae8fa32026 100644 (file)
@@ -1364,7 +1364,7 @@ bool amdgpu_display_crtc_scaling_mode_fixup(struct drm_crtc *crtc,
                if ((!(mode->flags & DRM_MODE_FLAG_INTERLACE)) &&
                    ((amdgpu_encoder->underscan_type == UNDERSCAN_ON) ||
                     ((amdgpu_encoder->underscan_type == UNDERSCAN_AUTO) &&
-                     drm_detect_hdmi_monitor(amdgpu_connector_edid(connector)) &&
+                     connector->display_info.is_hdmi &&
                      amdgpu_display_is_hdtv_mode(mode)))) {
                        if (amdgpu_encoder->underscan_hborder != 0)
                                amdgpu_crtc->h_border = amdgpu_encoder->underscan_hborder;
index af4ef84e27a7738a5a1226a472a4af9997efbe16..c96e458ed0889eb0065a409f85c26a6868d19ff0 100644 (file)
@@ -222,7 +222,7 @@ bool amdgpu_dig_monitor_is_duallink(struct drm_encoder *encoder,
        case DRM_MODE_CONNECTOR_HDMIB:
                if (amdgpu_connector->use_digital) {
                        /* HDMI 1.3 supports up to 340 Mhz over single link */
-                       if (drm_detect_hdmi_monitor(amdgpu_connector_edid(connector))) {
+                       if (connector->display_info.is_hdmi) {
                                if (pixel_clock > 340000)
                                        return true;
                                else
@@ -244,7 +244,7 @@ bool amdgpu_dig_monitor_is_duallink(struct drm_encoder *encoder,
                        return false;
                else {
                        /* HDMI 1.3 supports up to 340 Mhz over single link */
-                       if (drm_detect_hdmi_monitor(amdgpu_connector_edid(connector))) {
+                       if (connector->display_info.is_hdmi) {
                                if (pixel_clock > 340000)
                                        return true;
                                else
index 6134ed964027924d4f3e0f0485f00614adde1be2..a92d86e12718f69c5a5d27176600b0f382c9851e 100644 (file)
@@ -469,7 +469,7 @@ int amdgpu_atombios_encoder_get_encoder_mode(struct drm_encoder *encoder)
                        if (amdgpu_connector->use_digital &&
                            (amdgpu_connector->audio == AMDGPU_AUDIO_ENABLE))
                                return ATOM_ENCODER_MODE_HDMI;
-                       else if (drm_detect_hdmi_monitor(amdgpu_connector_edid(connector)) &&
+                       else if (connector->display_info.is_hdmi &&
                                 (amdgpu_connector->audio == AMDGPU_AUDIO_AUTO))
                                return ATOM_ENCODER_MODE_HDMI;
                        else if (amdgpu_connector->use_digital)
@@ -488,7 +488,7 @@ int amdgpu_atombios_encoder_get_encoder_mode(struct drm_encoder *encoder)
                if (amdgpu_audio != 0) {
                        if (amdgpu_connector->audio == AMDGPU_AUDIO_ENABLE)
                                return ATOM_ENCODER_MODE_HDMI;
-                       else if (drm_detect_hdmi_monitor(amdgpu_connector_edid(connector)) &&
+                       else if (connector->display_info.is_hdmi &&
                                 (amdgpu_connector->audio == AMDGPU_AUDIO_AUTO))
                                return ATOM_ENCODER_MODE_HDMI;
                        else
@@ -506,7 +506,7 @@ int amdgpu_atombios_encoder_get_encoder_mode(struct drm_encoder *encoder)
                } else if (amdgpu_audio != 0) {
                        if (amdgpu_connector->audio == AMDGPU_AUDIO_ENABLE)
                                return ATOM_ENCODER_MODE_HDMI;
-                       else if (drm_detect_hdmi_monitor(amdgpu_connector_edid(connector)) &&
+                       else if (connector->display_info.is_hdmi &&
                                 (amdgpu_connector->audio == AMDGPU_AUDIO_AUTO))
                                return ATOM_ENCODER_MODE_HDMI;
                        else
index 54c75866c0002209065082010adaac80ae9aafb7..29f07c26d080f94c58cc1f37fb5cc4105cea5bc4 100644 (file)
@@ -83,10 +83,12 @@ static int amdgpu_dm_patch_edid_caps(struct dc_edid_caps *edid_caps)
  *     void
  * */
 enum dc_edid_status dm_helpers_parse_edid_caps(
-               struct dc_context *ctx,
+               struct dc_link *link,
                const struct dc_edid *edid,
                struct dc_edid_caps *edid_caps)
 {
+       struct amdgpu_dm_connector *aconnector = link->priv;
+       struct drm_connector *connector = &aconnector->base;
        struct edid *edid_buf = (struct edid *) edid->raw_edid;
        struct cea_sad *sads;
        int sad_count = -1;
@@ -114,8 +116,7 @@ enum dc_edid_status dm_helpers_parse_edid_caps(
                                  edid_caps->display_name,
                                  AUDIO_INFO_DISPLAY_NAME_SIZE_IN_CHARS);
 
-       edid_caps->edid_hdmi = drm_detect_hdmi_monitor(
-                       (struct edid *) edid->raw_edid);
+       edid_caps->edid_hdmi = connector->display_info.is_hdmi;
 
        sad_count = drm_edid_to_sad((struct edid *) edid->raw_edid, &sads);
        if (sad_count <= 0)
@@ -647,14 +648,8 @@ enum dc_edid_status dm_helpers_read_local_edid(
                /* We don't need the original edid anymore */
                kfree(edid);
 
-               /* connector->display_info will be parsed from EDID and saved
-                * into drm_connector->display_info from edid by call stack
-                * below:
-                * drm_parse_ycbcr420_deep_color_info
-                * drm_parse_hdmi_forum_vsdb
-                * drm_parse_cea_ext
-                * drm_add_display_info
-                * drm_connector_update_edid_property
+               /* connector->display_info is parsed from EDID and saved
+                * into drm_connector->display_info
                 *
                 * drm_connector->display_info will be used by amdgpu_dm funcs,
                 * like fill_stream_properties_from_drm_display_mode
@@ -662,7 +657,7 @@ enum dc_edid_status dm_helpers_read_local_edid(
                amdgpu_dm_update_connector_after_detect(aconnector);
 
                edid_status = dm_helpers_parse_edid_caps(
-                                               ctx,
+                                               link,
                                                &sink->dc_edid,
                                                &sink->edid_caps);
 
index 7ee548ffbdaf7dc4fe1159b6c252ea17e9bde2cf..5987391824613b21e8d955895bcdd2ceaafbd0ce 100644 (file)
@@ -3448,7 +3448,7 @@ struct dc_sink *dc_link_add_remote_sink(
                goto fail_add_sink;
 
        edid_status = dm_helpers_parse_edid_caps(
-                       link->ctx,
+                       link,
                        &dc_sink->dc_edid,
                        &dc_sink->edid_caps);
 
index 0fe66b080a03fef7b318739a13124782423db83f..7f94e3f70d7f517bf5daae80c29aa54ff63b7a07 100644 (file)
@@ -59,7 +59,7 @@ void dm_helpers_free_gpu_mem(
                void *pvMem);
 
 enum dc_edid_status dm_helpers_parse_edid_caps(
-       struct dc_context *ctx,
+       struct dc_link *link,
        const struct dc_edid *edid,
        struct dc_edid_caps *edid_caps);