Merge tag 'drm-intel-next-2023-11-23' of git://anongit.freedesktop.org/drm/drm-intel...
[sfrench/cifs-2.6.git] / drivers / gpu / drm / amd / display / amdgpu_dm / amdgpu_dm_helpers.c
index 53e323b71d26301980942bc53801a058a1e7745b..eb6121ad92fd2bf6ee31706569e930ce8c319531 100644 (file)
@@ -205,16 +205,16 @@ void dm_helpers_dp_update_branch_info(
 {}
 
 static void dm_helpers_construct_old_payload(
-                       struct dc_link *link,
-                       fixed20_12 pbn_per_slot_fp,
+                       struct drm_dp_mst_topology_mgr *mgr,
+                       struct drm_dp_mst_topology_state *mst_state,
                        struct drm_dp_mst_atomic_payload *new_payload,
                        struct drm_dp_mst_atomic_payload *old_payload)
 {
-       struct link_mst_stream_allocation_table current_link_table =
-                                                                       link->mst_stream_alloc_table;
-       struct link_mst_stream_allocation *dc_alloc;
-       int pbn_per_slot = dfixed_trunc(pbn_per_slot_fp);
-       int i;
+       struct drm_dp_mst_atomic_payload *pos;
+       int pbn_per_slot = dfixed_trunc(mst_state->pbn_div);
+       u8 next_payload_vc_start = mgr->next_start_slot;
+       u8 payload_vc_start = new_payload->vc_start_slot;
+       u8 allocated_time_slots;
 
        *old_payload = *new_payload;
 
@@ -223,20 +223,17 @@ static void dm_helpers_construct_old_payload(
         * struct drm_dp_mst_atomic_payload are don't care fields
         * while calling drm_dp_remove_payload_part2()
         */
-       for (i = 0; i < current_link_table.stream_count; i++) {
-               dc_alloc =
-                       &current_link_table.stream_allocations[i];
-
-               if (dc_alloc->vcp_id == new_payload->vcpi) {
-                       old_payload->time_slots = dc_alloc->slot_count;
-                       old_payload->pbn = dc_alloc->slot_count * pbn_per_slot;
-                       break;
-               }
+       list_for_each_entry(pos, &mst_state->payloads, next) {
+               if (pos != new_payload &&
+                   pos->vc_start_slot > payload_vc_start &&
+                   pos->vc_start_slot < next_payload_vc_start)
+                       next_payload_vc_start = pos->vc_start_slot;
        }
 
-       /* make sure there is an old payload*/
-       ASSERT(i != current_link_table.stream_count);
+       allocated_time_slots = next_payload_vc_start - payload_vc_start;
 
+       old_payload->time_slots = allocated_time_slots;
+       old_payload->pbn = allocated_time_slots * pbn_per_slot;
 }
 
 /*
@@ -274,8 +271,8 @@ bool dm_helpers_dp_mst_write_payload_allocation_table(
                drm_dp_add_payload_part1(mst_mgr, mst_state, new_payload);
        } else {
                /* construct old payload by VCPI*/
-               dm_helpers_construct_old_payload(stream->link, mst_state->pbn_div,
-                                               new_payload, &old_payload);
+               dm_helpers_construct_old_payload(mst_mgr, mst_state,
+                                                new_payload, &old_payload);
                target_payload = &old_payload;
 
                drm_dp_remove_payload_part1(mst_mgr, mst_state, new_payload);
@@ -368,7 +365,7 @@ bool dm_helpers_dp_mst_send_payload_allocation(
        if (enable) {
                ret = drm_dp_add_payload_part2(mst_mgr, mst_state->base.state, new_payload);
        } else {
-               dm_helpers_construct_old_payload(stream->link, mst_state->pbn_div,
+               dm_helpers_construct_old_payload(mst_mgr, mst_state,
                                                 new_payload, &old_payload);
                drm_dp_remove_payload_part2(mst_mgr, mst_state, &old_payload, new_payload);
        }
@@ -540,10 +537,8 @@ bool dm_helpers_dp_read_dpcd(
 
        struct amdgpu_dm_connector *aconnector = link->priv;
 
-       if (!aconnector) {
-               DC_LOG_DC("Failed to find connector for link!\n");
+       if (!aconnector)
                return false;
-       }
 
        return drm_dp_dpcd_read(&aconnector->dm_dp_aux.aux, address, data,
                                size) == size;
@@ -663,7 +658,7 @@ static bool execute_synaptics_rc_command(struct drm_dp_aux *aux,
                drm_dp_dpcd_read(aux, SYNAPTICS_RC_DATA, data, length);
        }
 
-       DC_LOG_DC("%s: success = %d\n", __func__, success);
+       drm_dbg_dp(aux->drm_dev, "success = %d\n", success);
 
        return success;
 }
@@ -672,7 +667,7 @@ static void apply_synaptics_fifo_reset_wa(struct drm_dp_aux *aux)
 {
        unsigned char data[16] = {0};
 
-       DC_LOG_DC("Start %s\n", __func__);
+       drm_dbg_dp(aux->drm_dev, "Start\n");
 
        // Step 2
        data[0] = 'P';
@@ -730,7 +725,7 @@ static void apply_synaptics_fifo_reset_wa(struct drm_dp_aux *aux)
        if (!execute_synaptics_rc_command(aux, true, 0x02, 0, 0, NULL))
                return;
 
-       DC_LOG_DC("Done %s\n", __func__);
+       drm_dbg_dp(aux->drm_dev, "Done\n");
 }
 
 /* MST Dock */
@@ -743,7 +738,8 @@ static uint8_t write_dsc_enable_synaptics_non_virtual_dpcd_mst(
 {
        uint8_t ret = 0;
 
-       DC_LOG_DC("Configure DSC to non-virtual dpcd synaptics\n");
+       drm_dbg_dp(aux->drm_dev,
+                  "Configure DSC to non-virtual dpcd synaptics\n");
 
        if (enable) {
                /* When DSC is enabled on previous boot and reboot with the hub,
@@ -781,7 +777,9 @@ bool dm_helpers_dp_write_dsc_enable(
        static const uint8_t DSC_DECODING = 0x01;
        static const uint8_t DSC_PASSTHROUGH = 0x02;
 
-       struct amdgpu_dm_connector *aconnector;
+       struct amdgpu_dm_connector *aconnector =
+               (struct amdgpu_dm_connector *)stream->dm_stream_context;
+       struct drm_device *dev = aconnector->base.dev;
        struct drm_dp_mst_port *port;
        uint8_t enable_dsc = enable ? DSC_DECODING : DSC_DISABLE;
        uint8_t enable_passthrough = enable ? DSC_PASSTHROUGH : DSC_DISABLE;
@@ -791,8 +789,6 @@ bool dm_helpers_dp_write_dsc_enable(
                return false;
 
        if (stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) {
-               aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context;
-
                if (!aconnector->dsc_aux)
                        return false;
 
@@ -809,30 +805,34 @@ bool dm_helpers_dp_write_dsc_enable(
                                ret = drm_dp_dpcd_write(port->passthrough_aux,
                                                        DP_DSC_ENABLE,
                                                        &enable_passthrough, 1);
-                               DC_LOG_DC("Sent DSC pass-through enable to virtual dpcd port, ret = %u\n",
-                                         ret);
+                               drm_dbg_dp(dev,
+                                          "Sent DSC pass-through enable to virtual dpcd port, ret = %u\n",
+                                          ret);
                        }
 
                        ret = drm_dp_dpcd_write(aconnector->dsc_aux,
                                                DP_DSC_ENABLE, &enable_dsc, 1);
-                       DC_LOG_DC("Sent DSC decoding enable to %s port, ret = %u\n",
-                                 (port->passthrough_aux) ? "remote RX" :
-                                 "virtual dpcd",
-                                 ret);
+                       drm_dbg_dp(dev,
+                                  "Sent DSC decoding enable to %s port, ret = %u\n",
+                                  (port->passthrough_aux) ? "remote RX" :
+                                  "virtual dpcd",
+                                  ret);
                } else {
                        ret = drm_dp_dpcd_write(aconnector->dsc_aux,
                                                DP_DSC_ENABLE, &enable_dsc, 1);
-                       DC_LOG_DC("Sent DSC decoding disable to %s port, ret = %u\n",
-                                 (port->passthrough_aux) ? "remote RX" :
-                                 "virtual dpcd",
-                                 ret);
+                       drm_dbg_dp(dev,
+                                  "Sent DSC decoding disable to %s port, ret = %u\n",
+                                  (port->passthrough_aux) ? "remote RX" :
+                                  "virtual dpcd",
+                                  ret);
 
                        if (port->passthrough_aux) {
                                ret = drm_dp_dpcd_write(port->passthrough_aux,
                                                        DP_DSC_ENABLE,
                                                        &enable_passthrough, 1);
-                               DC_LOG_DC("Sent DSC pass-through disable to virtual dpcd port, ret = %u\n",
-                                         ret);
+                               drm_dbg_dp(dev,
+                                          "Sent DSC pass-through disable to virtual dpcd port, ret = %u\n",
+                                          ret);
                        }
                }
        }
@@ -840,10 +840,14 @@ bool dm_helpers_dp_write_dsc_enable(
        if (stream->signal == SIGNAL_TYPE_DISPLAY_PORT || stream->signal == SIGNAL_TYPE_EDP) {
                if (stream->sink->link->dpcd_caps.dongle_type == DISPLAY_DONGLE_NONE) {
                        ret = dm_helpers_dp_write_dpcd(ctx, stream->link, DP_DSC_ENABLE, &enable_dsc, 1);
-                       DC_LOG_DC("Send DSC %s to SST RX\n", enable_dsc ? "enable" : "disable");
+                       drm_dbg_dp(dev,
+                                  "Send DSC %s to SST RX\n",
+                                  enable_dsc ? "enable" : "disable");
                } else if (stream->sink->link->dpcd_caps.dongle_type == DISPLAY_DONGLE_DP_HDMI_CONVERTER) {
                        ret = dm_helpers_dp_write_dpcd(ctx, stream->link, DP_DSC_ENABLE, &enable_dsc, 1);
-                       DC_LOG_DC("Send DSC %s to DP-HDMI PCON\n", enable_dsc ? "enable" : "disable");
+                       drm_dbg_dp(dev,
+                                  "Send DSC %s to DP-HDMI PCON\n",
+                                  enable_dsc ? "enable" : "disable");
                }
        }
 
@@ -1112,6 +1116,7 @@ bool dm_helpers_dp_handle_test_pattern_request(
        struct pipe_ctx *pipes = link->dc->current_state->res_ctx.pipe_ctx;
        struct pipe_ctx *pipe_ctx = NULL;
        struct amdgpu_dm_connector *aconnector = link->priv;
+       struct drm_device *dev = aconnector->base.dev;
        int i;
 
        for (i = 0; i < MAX_PIPES; i++) {
@@ -1189,12 +1194,12 @@ bool dm_helpers_dp_handle_test_pattern_request(
                && pipe_ctx->stream->timing.display_color_depth != requestColorDepth)
                || (requestPixelEncoding != PIXEL_ENCODING_UNDEFINED
                && pipe_ctx->stream->timing.pixel_encoding != requestPixelEncoding)) {
-               DC_LOG_DEBUG("%s: original bpc %d pix encoding %d, changing to %d  %d\n",
-                               __func__,
-                               pipe_ctx->stream->timing.display_color_depth,
-                               pipe_ctx->stream->timing.pixel_encoding,
-                               requestColorDepth,
-                               requestPixelEncoding);
+               drm_dbg(dev,
+                       "original bpc %d pix encoding %d, changing to %d  %d\n",
+                       pipe_ctx->stream->timing.display_color_depth,
+                       pipe_ctx->stream->timing.pixel_encoding,
+                       requestColorDepth,
+                       requestPixelEncoding);
                pipe_ctx->stream->timing.display_color_depth = requestColorDepth;
                pipe_ctx->stream->timing.pixel_encoding = requestPixelEncoding;
 
@@ -1205,10 +1210,13 @@ bool dm_helpers_dp_handle_test_pattern_request(
                if (aconnector->timing_requested)
                        *aconnector->timing_requested = pipe_ctx->stream->timing;
                else
-                       DC_LOG_ERROR("%s: timing storage failed\n", __func__);
+                       drm_err(dev, "timing storage failed\n");
 
        }
 
+       pipe_ctx->stream->test_pattern.type = test_pattern;
+       pipe_ctx->stream->test_pattern.color_space = test_pattern_color_space;
+
        dc_link_dp_set_test_pattern(
                (struct dc_link *) link,
                test_pattern,