Merge tag 'amd-drm-next-6.7-2023-10-13' of https://gitlab.freedesktop.org/agd5f/linux...
[sfrench/cifs-2.6.git] / drivers / gpu / drm / amd / display / amdgpu_dm / amdgpu_dm.c
index 0a484c9acb6e1ec7b32c80559dfc115ad297cb2d..2ac940a38703c0d7407aa5912a9c9b7ce4e30d66 100644 (file)
@@ -54,7 +54,6 @@
 #include "amdgpu_dm_crtc.h"
 #include "amdgpu_dm_hdcp.h"
 #include <drm/display/drm_hdcp_helper.h>
-#include "amdgpu_dm_wb.h"
 #include "amdgpu_pm.h"
 #include "amdgpu_atombios.h"
 
@@ -66,6 +65,7 @@
 #include "amdgpu_dm_debugfs.h"
 #endif
 #include "amdgpu_dm_psr.h"
+#include "amdgpu_dm_replay.h"
 
 #include "ivsrcid/ivsrcid_vislands30.h"
 
@@ -725,10 +725,6 @@ static void dmub_hpd_callback(struct amdgpu_device *adev,
 
        drm_connector_list_iter_begin(dev, &iter);
        drm_for_each_connector_iter(connector, &iter) {
-
-               if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
-                       continue;
-
                aconnector = to_amdgpu_dm_connector(connector);
                if (link && aconnector->dc_link == link) {
                        if (notify->type == DMUB_NOTIFICATION_HPD)
@@ -953,10 +949,6 @@ static int amdgpu_dm_audio_component_get_eld(struct device *kdev, int port,
 
        drm_connector_list_iter_begin(dev, &conn_iter);
        drm_for_each_connector_iter(connector, &conn_iter) {
-
-               if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
-                       continue;
-
                aconnector = to_amdgpu_dm_connector(connector);
                if (aconnector->audio_inst != port)
                        continue;
@@ -1683,10 +1675,6 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
        init_data.nbio_reg_offsets = adev->reg_offset[NBIO_HWIP][0];
        init_data.clk_reg_offsets = adev->reg_offset[CLK_HWIP][0];
 
-       /* Enable DWB for tested platforms only */
-       if (adev->ip_versions[DCE_HWIP][0] >= IP_VERSION(3, 0, 0))
-               init_data.num_virtual_links = 0;
-
        INIT_LIST_HEAD(&adev->dm.da_list);
 
        retrieve_dmi_info(&adev->dm);
@@ -2280,10 +2268,6 @@ static int detect_mst_link_for_all_connectors(struct drm_device *dev)
 
        drm_connector_list_iter_begin(dev, &iter);
        drm_for_each_connector_iter(connector, &iter) {
-
-               if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
-                       continue;
-
                aconnector = to_amdgpu_dm_connector(connector);
                if (aconnector->dc_link->type == dc_connection_mst_branch &&
                    aconnector->mst_mgr.aux) {
@@ -2412,10 +2396,6 @@ static void s3_handle_mst(struct drm_device *dev, bool suspend)
 
        drm_connector_list_iter_begin(dev, &iter);
        drm_for_each_connector_iter(connector, &iter) {
-
-               if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
-                       continue;
-
                aconnector = to_amdgpu_dm_connector(connector);
                if (aconnector->dc_link->type != dc_connection_mst_branch ||
                    aconnector->mst_root)
@@ -2937,10 +2917,6 @@ static int dm_resume(void *handle)
        /* Do detection*/
        drm_connector_list_iter_begin(ddev, &iter);
        drm_for_each_connector_iter(connector, &iter) {
-
-               if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
-                       continue;
-
                aconnector = to_amdgpu_dm_connector(connector);
 
                if (!aconnector->dc_link)
@@ -3514,9 +3490,6 @@ static void register_hpd_handlers(struct amdgpu_device *adev)
        list_for_each_entry(connector,
                        &dev->mode_config.connector_list, head) {
 
-               if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
-                       continue;
-
                aconnector = to_amdgpu_dm_connector(connector);
                dc_link = aconnector->dc_link;
 
@@ -4371,6 +4344,7 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
        enum dc_connection_type new_connection_type = dc_connection_none;
        const struct dc_plane_cap *plane;
        bool psr_feature_enabled = false;
+       bool replay_feature_enabled = false;
        int max_overlay = dm->dc->caps.max_slave_planes;
 
        dm->display_indexes_num = dm->dc->caps.max_streams;
@@ -4482,6 +4456,20 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
                }
        }
 
+       if (!(amdgpu_dc_debug_mask & DC_DISABLE_REPLAY)) {
+               switch (adev->ip_versions[DCE_HWIP][0]) {
+               case IP_VERSION(3, 1, 4):
+               case IP_VERSION(3, 1, 5):
+               case IP_VERSION(3, 1, 6):
+               case IP_VERSION(3, 2, 0):
+               case IP_VERSION(3, 2, 1):
+                       replay_feature_enabled = true;
+                       break;
+               default:
+                       replay_feature_enabled = amdgpu_dc_feature_mask & DC_REPLAY_MASK;
+                       break;
+               }
+       }
        /* loops over all connectors on the board */
        for (i = 0; i < link_cnt; i++) {
                struct dc_link *link = NULL;
@@ -4493,28 +4481,6 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
                        continue;
                }
 
-               link = dc_get_link_at_index(dm->dc, i);
-
-               if (link->connector_signal == SIGNAL_TYPE_VIRTUAL) {
-                       struct drm_writeback_connector *wbcon = kzalloc(sizeof(*wbcon), GFP_KERNEL);
-
-                       if (!wbcon) {
-                               DRM_ERROR("KMS: Failed to allocate writeback connector\n");
-                               continue;
-                       }
-
-                       if (amdgpu_dm_wb_connector_init(dm, wbcon)) {
-                               DRM_ERROR("KMS: Failed to initialize writeback connector\n");
-                               kfree(wbcon);
-                               continue;
-                       }
-
-                       link->psr_settings.psr_feature_enabled = false;
-                       link->psr_settings.psr_version = DC_PSR_VERSION_UNSUPPORTED;
-
-                       continue;
-               }
-
                aconnector = kzalloc(sizeof(*aconnector), GFP_KERNEL);
                if (!aconnector)
                        goto fail;
@@ -4533,6 +4499,8 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
                        goto fail;
                }
 
+               link = dc_get_link_at_index(dm->dc, i);
+
                if (!dc_link_detect_connection_type(link, &new_connection_type))
                        DRM_ERROR("KMS: Failed to detect connector\n");
 
@@ -4550,6 +4518,12 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
                                amdgpu_dm_update_connector_after_detect(aconnector);
                                setup_backlight_device(dm, aconnector);
 
+                               /*
+                                * Disable psr if replay can be enabled
+                                */
+                               if (replay_feature_enabled && amdgpu_dm_setup_replay(link, aconnector))
+                                       psr_feature_enabled = false;
+
                                if (psr_feature_enabled)
                                        amdgpu_dm_set_psr_caps(link);
 
@@ -5533,13 +5507,10 @@ static void fill_stream_properties_from_drm_display_mode(
 {
        struct dc_crtc_timing *timing_out = &stream->timing;
        const struct drm_display_info *info = &connector->display_info;
-       struct amdgpu_dm_connector *aconnector = NULL;
+       struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
        struct hdmi_vendor_infoframe hv_frame;
        struct hdmi_avi_infoframe avi_frame;
 
-       if (connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK)
-               aconnector = to_amdgpu_dm_connector(connector);
-
        memset(&hv_frame, 0, sizeof(hv_frame));
        memset(&avi_frame, 0, sizeof(avi_frame));
 
@@ -6157,6 +6128,8 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
 
        if (recalculate_timing)
                drm_mode_set_crtcinfo(&saved_mode, 0);
+       else if (!old_stream)
+               drm_mode_set_crtcinfo(&mode, 0);
 
        /*
         * If scaling is enabled and refresh rate didn't change
@@ -6979,9 +6952,6 @@ static int dm_update_mst_vcpi_slots_for_dsc(struct drm_atomic_state *state,
 
        for_each_new_connector_in_state(state, connector, new_con_state, i) {
 
-               if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
-                       continue;
-
                aconnector = to_amdgpu_dm_connector(connector);
 
                if (!aconnector->mst_output_port)
@@ -8538,9 +8508,6 @@ static void amdgpu_dm_commit_audio(struct drm_device *dev,
                if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
                        continue;
 
-               if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
-                       continue;
-
 notify:
                aconnector = to_amdgpu_dm_connector(connector);
 
@@ -8574,9 +8541,6 @@ notify:
                if (!status)
                        continue;
 
-               if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
-                       continue;
-
                aconnector = to_amdgpu_dm_connector(connector);
 
                mutex_lock(&adev->dm.audio_lock);
@@ -8800,12 +8764,7 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
        for_each_oldnew_connector_in_state(state, connector, old_con_state, new_con_state, i) {
                struct dm_connector_state *dm_new_con_state = to_dm_connector_state(new_con_state);
                struct amdgpu_crtc *acrtc = to_amdgpu_crtc(dm_new_con_state->base.crtc);
-               struct amdgpu_dm_connector *aconnector;
-
-               if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
-                       continue;
-
-               aconnector = to_amdgpu_dm_connector(connector);
+               struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
 
                if (!adev->dm.hdcp_workqueue)
                        continue;
@@ -9199,15 +9158,10 @@ out:
 void dm_restore_drm_connector_state(struct drm_device *dev,
                                    struct drm_connector *connector)
 {
-       struct amdgpu_dm_connector *aconnector;
+       struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
        struct amdgpu_crtc *disconnected_acrtc;
        struct dm_crtc_state *acrtc_state;
 
-       if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
-               return;
-
-       aconnector = to_amdgpu_dm_connector(connector);
-
        if (!aconnector->dc_sink || !connector->state || !connector->encoder)
                return;
 
@@ -9284,16 +9238,12 @@ static void get_freesync_config_for_crtc(
        struct dm_connector_state *new_con_state)
 {
        struct mod_freesync_config config = {0};
-       struct amdgpu_dm_connector *aconnector;
+       struct amdgpu_dm_connector *aconnector =
+                       to_amdgpu_dm_connector(new_con_state->base.connector);
        struct drm_display_mode *mode = &new_crtc_state->base.mode;
        int vrefresh = drm_mode_vrefresh(mode);
        bool fs_vid_mode = false;
 
-       if (new_con_state->base.connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
-               return;
-
-       aconnector = to_amdgpu_dm_connector(new_con_state->base.connector);
-
        new_crtc_state->vrr_supported = new_con_state->freesync_capable &&
                                        vrefresh >= aconnector->min_vfreq &&
                                        vrefresh <= aconnector->max_vfreq;
@@ -10123,9 +10073,6 @@ static int add_affected_mst_dsc_crtcs(struct drm_atomic_state *state, struct drm
                if (conn_state->crtc != crtc)
                        continue;
 
-               if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
-                       continue;
-
                aconnector = to_amdgpu_dm_connector(connector);
                if (!aconnector->mst_output_port || !aconnector->mst_root)
                        aconnector = NULL;