From: Peichen Huang <peichen.hu...@amd.com>

[Why]
dc should have a flag for DM to enable usb4_bw_alloc in dptx

[How]
- Add usb4_bw_alloc_support flag in dc_config

Reviewed-by: Wayne Lin <wayne....@amd.com>
Reviewed-by: Meenakshikumar Somasundaram <meenakshikumar.somasunda...@amd.com>
Acked-by: Roman Li <roman...@amd.com>
Signed-off-by: Peichen Huang <peichen.hu...@amd.com>
---
 drivers/gpu/drm/amd/display/dc/dc.h           |  1 +
 .../drm/amd/display/dc/link/link_detection.c  | 18 ++++++
 .../gpu/drm/amd/display/dc/link/link_dpms.c   | 58 +++++++++++++++++++
 3 files changed, 77 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dc/dc.h 
b/drivers/gpu/drm/amd/display/dc/dc.h
index 432ae08462e4..e338576f95a9 100644
--- a/drivers/gpu/drm/amd/display/dc/dc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc.h
@@ -435,6 +435,7 @@ struct dc_config {
        bool enable_auto_dpm_test_logs;
        unsigned int disable_ips;
        unsigned int disable_ips_in_vpb;
+       bool usb4_bw_alloc_support;
 };
 
 enum visual_confirm {
diff --git a/drivers/gpu/drm/amd/display/dc/link/link_detection.c 
b/drivers/gpu/drm/amd/display/dc/link/link_detection.c
index 24153b0df503..b8c4a04dd175 100644
--- a/drivers/gpu/drm/amd/display/dc/link/link_detection.c
+++ b/drivers/gpu/drm/amd/display/dc/link/link_detection.c
@@ -41,6 +41,7 @@
 #include "protocols/link_dp_dpia.h"
 #include "protocols/link_dp_phy.h"
 #include "protocols/link_dp_training.h"
+#include "protocols/link_dp_dpia_bw.h"
 #include "accessories/link_dp_trace.h"
 
 #include "link_enc_cfg.h"
@@ -991,6 +992,23 @@ static bool detect_link_and_local_sink(struct dc_link 
*link,
                        if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA &&
                                        link->reported_link_cap.link_rate > 
LINK_RATE_HIGH3)
                                link->reported_link_cap.link_rate = 
LINK_RATE_HIGH3;
+
+                       /*
+                        * If this is DP over USB4 link then we need to:
+                        * - Enable BW ALLOC support on DPtx if applicable
+                        */
+                       if (dc->config.usb4_bw_alloc_support) {
+                               if 
(link_dp_dpia_set_dptx_usb4_bw_alloc_support(link)) {
+                                       /* update with non reduced link cap if 
bw allocation mode is supported */
+                                       if 
(link->dpia_bw_alloc_config.nrd_max_link_rate &&
+                                               
link->dpia_bw_alloc_config.nrd_max_lane_count) {
+                                               
link->reported_link_cap.link_rate =
+                                                       
link->dpia_bw_alloc_config.nrd_max_link_rate;
+                                               
link->reported_link_cap.lane_count =
+                                                       
link->dpia_bw_alloc_config.nrd_max_lane_count;
+                                       }
+                               }
+                       }
                        break;
                }
 
diff --git a/drivers/gpu/drm/amd/display/dc/link/link_dpms.c 
b/drivers/gpu/drm/amd/display/dc/link/link_dpms.c
index 3cbfbf8d107e..a72de44a5747 100644
--- a/drivers/gpu/drm/amd/display/dc/link/link_dpms.c
+++ b/drivers/gpu/drm/amd/display/dc/link/link_dpms.c
@@ -2197,6 +2197,64 @@ static enum dc_status enable_link(
 
 static bool allocate_usb4_bandwidth_for_stream(struct dc_stream_state *stream, 
int bw)
 {
+       struct dc_link *link = stream->sink->link;
+       int req_bw = bw;
+
+       DC_LOGGER_INIT(link->ctx->logger);
+
+       if (!link->dpia_bw_alloc_config.bw_alloc_enabled)
+               return false;
+
+       if (stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) {
+               int sink_index = 0;
+               int i = 0;
+
+               for (i = 0; i < link->sink_count; i++) {
+                       if (link->remote_sinks[i] == NULL)
+                               continue;
+
+                       if (stream->sink->sink_id != 
link->remote_sinks[i]->sink_id)
+                               req_bw += 
link->dpia_bw_alloc_config.remote_sink_req_bw[i];
+                       else
+                               sink_index = i;
+               }
+
+               link->dpia_bw_alloc_config.remote_sink_req_bw[sink_index] = bw;
+       }
+
+       /* get dp overhead for dp tunneling */
+       link->dpia_bw_alloc_config.dp_overhead = 
link_dp_dpia_get_dp_overhead_in_dp_tunneling(link);
+       req_bw += link->dpia_bw_alloc_config.dp_overhead;
+
+       if (link_dp_dpia_allocate_usb4_bandwidth_for_stream(link, req_bw)) {
+               if (req_bw <= link->dpia_bw_alloc_config.allocated_bw) {
+                       DC_LOG_DEBUG("%s, Success in allocate bw for link(%d), 
allocated_bw(%d), dp_overhead(%d)\n",
+                                       __func__, link->link_index, 
link->dpia_bw_alloc_config.allocated_bw,
+                                       link->dpia_bw_alloc_config.dp_overhead);
+               } else {
+                       // Cannot get the required bandwidth.
+                       DC_LOG_ERROR("%s, Failed to allocate bw for link(%d), 
allocated_bw(%d), dp_overhead(%d)\n",
+                                       __func__, link->link_index, 
link->dpia_bw_alloc_config.allocated_bw,
+                                       link->dpia_bw_alloc_config.dp_overhead);
+                       return false;
+               }
+       } else {
+               DC_LOG_DEBUG("%s, usb4 request bw timeout\n", __func__);
+               return false;
+       }
+
+       if (stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) {
+               int i = 0;
+
+               for (i = 0; i < link->sink_count; i++) {
+                       if (link->remote_sinks[i] == NULL)
+                               continue;
+                       DC_LOG_DEBUG("%s, remote_sink=%s, request_bw=%d\n", 
__func__,
+                                       (const char 
*)(&link->remote_sinks[i]->edid_caps.display_name[0]),
+                                       
link->dpia_bw_alloc_config.remote_sink_req_bw[i]);
+               }
+       }
+
        return true;
 }
 
-- 
2.34.1

Reply via email to