]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/amd/display: Add dc cap for dp tunneling
authorPeichen Huang <PeiChen.Huang@amd.com>
Mon, 26 May 2025 08:04:10 +0000 (16:04 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 18 Jun 2025 16:59:45 +0000 (12:59 -0400)
[WHAT]
1. add dc cap for dp tunneling
2. add function to get index of host router

Cc: Mario Limonciello <mario.limonciello@amd.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Cruise Hung <cruise.hung@amd.com>
Signed-off-by: Peichen Huang <PeiChen.Huang@amd.com>
Signed-off-by: Alex Hung <alex.hung@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 29e178d13979cf6fdb42c5fe2dfec2da2306c4ad)
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/display/dc/core/dc.c
drivers/gpu/drm/amd/display/dc/dc.h
drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.c
drivers/gpu/drm/amd/display/dc/resource/dcn314/dcn314_resource.c
drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.c
drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c
drivers/gpu/drm/amd/display/dc/resource/dcn36/dcn36_resource.c

index 56d011a1323cfde0827016aa33846839afb6c762..b34b5b52236dce4b4c9270b175908c8d7c673497 100644 (file)
@@ -241,6 +241,7 @@ static bool create_links(
        DC_LOG_DC("BIOS object table - end");
 
        /* Create a link for each usb4 dpia port */
+       dc->lowest_dpia_link_index = MAX_LINKS;
        for (i = 0; i < dc->res_pool->usb4_dpia_count; i++) {
                struct link_init_data link_init_params = {0};
                struct dc_link *link;
@@ -253,6 +254,9 @@ static bool create_links(
 
                link = dc->link_srv->create_link(&link_init_params);
                if (link) {
+                       if (dc->lowest_dpia_link_index > dc->link_count)
+                               dc->lowest_dpia_link_index = dc->link_count;
+
                        dc->links[dc->link_count] = link;
                        link->dc = dc;
                        ++dc->link_count;
@@ -6376,6 +6380,35 @@ unsigned int dc_get_det_buffer_size_from_state(const struct dc_state *context)
        else
                return 0;
 }
+/**
+ ***********************************************************************************************
+ * dc_get_host_router_index: Get index of host router from a dpia link
+ *
+ * This function return a host router index of the target link. If the target link is dpia link.
+ *
+ * @param [in] link: target link
+ * @param [out] host_router_index: host router index of the target link
+ *
+ * @return: true if the host router index is found and valid.
+ *
+ ***********************************************************************************************
+ */
+bool dc_get_host_router_index(const struct dc_link *link, unsigned int *host_router_index)
+{
+       struct dc *dc = link->ctx->dc;
+
+       if (link->ep_type != DISPLAY_ENDPOINT_USB4_DPIA)
+               return false;
+
+       if (link->link_index < dc->lowest_dpia_link_index)
+               return false;
+
+       *host_router_index = (link->link_index - dc->lowest_dpia_link_index) / dc->caps.num_of_dpias_per_host_router;
+       if (*host_router_index < dc->caps.num_of_host_routers)
+               return true;
+       else
+               return false;
+}
 
 bool dc_is_cursor_limit_pending(struct dc *dc)
 {
index 1d917be36fc4376fd55ab856d9b2fb8126c8bbcd..f41073c0147e2379004a041c74a95c30aa7f6935 100644 (file)
@@ -66,7 +66,8 @@ struct dmub_notification;
 #define MAX_STREAMS 6
 #define MIN_VIEWPORT_SIZE 12
 #define MAX_NUM_EDP 2
-#define MAX_HOST_ROUTERS_NUM 2
+#define MAX_HOST_ROUTERS_NUM 3
+#define MAX_DPIA_PER_HOST_ROUTER 2
 
 /* Display Core Interfaces */
 struct dc_versions {
@@ -305,6 +306,8 @@ struct dc_caps {
        /* Conservative limit for DCC cases which require ODM4:1 to support*/
        uint32_t dcc_plane_width_limit;
        struct dc_scl_caps scl_caps;
+       uint8_t num_of_host_routers;
+       uint8_t num_of_dpias_per_host_router;
 };
 
 struct dc_bug_wa {
@@ -1603,6 +1606,7 @@ struct dc {
 
        uint8_t link_count;
        struct dc_link *links[MAX_LINKS];
+       uint8_t lowest_dpia_link_index;
        struct link_service *link_srv;
 
        struct dc_state *current_state;
@@ -2595,6 +2599,8 @@ struct dc_power_profile dc_get_power_profile_for_dc_state(const struct dc_state
 
 unsigned int dc_get_det_buffer_size_from_state(const struct dc_state *context);
 
+bool dc_get_host_router_index(const struct dc_link *link, unsigned int *host_router_index);
+
 /* DSC Interfaces */
 #include "dc_dsc.h"
 
index 7e0af5297dc425d880f5ef015e879a522dd22748..51ca0b2959fcc60b08a4c6224e0748b0b5d7ddde 100644 (file)
@@ -1954,6 +1954,9 @@ static bool dcn31_resource_construct(
        dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
        dc->caps.color.mpc.ocsc = 1;
 
+       dc->caps.num_of_host_routers = 2;
+       dc->caps.num_of_dpias_per_host_router = 2;
+
        /* Use pipe context based otg sync logic */
        dc->config.use_pipe_ctx_sync_logic = true;
        dc->config.disable_hbr_audio_dp2 = true;
index d96bc6cb73adcde383632ad634c0ad985a4e60c2..8383e2e59be5b4681f9a9f421eebeb1834983d40 100644 (file)
@@ -1885,6 +1885,9 @@ static bool dcn314_resource_construct(
 
        dc->caps.max_disp_clock_khz_at_vmin = 650000;
 
+       dc->caps.num_of_host_routers = 2;
+       dc->caps.num_of_dpias_per_host_router = 2;
+
        /* Use pipe context based otg sync logic */
        dc->config.use_pipe_ctx_sync_logic = true;
 
index 72c6cf047db06f4c9fc6bf0f9a7308d582a2f6b9..e01aa2f2e13ee3e44a3170884a74c3f3ac59ad88 100644 (file)
@@ -1894,6 +1894,9 @@ static bool dcn35_resource_construct(
        dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
        dc->caps.color.mpc.ocsc = 1;
 
+       dc->caps.num_of_host_routers = 2;
+       dc->caps.num_of_dpias_per_host_router = 2;
+
        /* max_disp_clock_khz_at_vmin is slightly lower than the STA value in order
         * to provide some margin.
         * It's expected for furture ASIC to have equal or higher value, in order to
index 989a270f7deaa02b2b23cd78afad675a17b1afae..4ebe4e00a4f8b49f63d3eadf45bf09db0c1184fd 100644 (file)
@@ -1866,6 +1866,9 @@ static bool dcn351_resource_construct(
        dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
        dc->caps.color.mpc.ocsc = 1;
 
+       dc->caps.num_of_host_routers = 2;
+       dc->caps.num_of_dpias_per_host_router = 2;
+
        /* max_disp_clock_khz_at_vmin is slightly lower than the STA value in order
         * to provide some margin.
         * It's expected for furture ASIC to have equal or higher value, in order to
index 48e1f234185ff96bab0b75469c791d1b2509494e..db36b8f9ce6531e61fb3693f838442450d942e5a 100644 (file)
@@ -1867,6 +1867,9 @@ static bool dcn36_resource_construct(
        dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
        dc->caps.color.mpc.ocsc = 1;
 
+       dc->caps.num_of_host_routers = 2;
+       dc->caps.num_of_dpias_per_host_router = 2;
+
        /* max_disp_clock_khz_at_vmin is slightly lower than the STA value in order
         * to provide some margin.
         * It's expected for furture ASIC to have equal or higher value, in order to