drm/amdgpu: support the port num info based on the capability flag
authorShiwu Zhang <shiwu.zhang@amd.com>
Thu, 21 Sep 2023 12:05:12 +0000 (20:05 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 20 Oct 2023 19:11:28 +0000 (15:11 -0400)
XGMI TA will set the capability flag to indicate whether the port_num
info is supported or not. KGD checks the flag and accordingly picks up
the right buffer format and send the right command to TA to retrieve
the info.

v2: simplify the code by reusing the same statement (lijo)

Signed-off-by: Shiwu Zhang <shiwu.zhang@amd.com>
Acked-by: Lijo Lazar <lijo.lazar@amd.com>
Reviewed-by: Le Ma <le.ma@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h

index 37891042ce9fdb2359a428c6efd74e1ffb56bf1c..648bd5e12830bce18a87afd496fea17fd7bf15de 100644 (file)
@@ -1267,6 +1267,8 @@ invoke:
        xgmi_cmd->cmd_id = TA_COMMAND_XGMI__INITIALIZE;
 
        ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
+       /* note down the capbility flag for XGMI TA */
+       psp->xgmi_context.xgmi_ta_caps = xgmi_cmd->caps_flag;
 
        return ret;
 }
@@ -1425,35 +1427,52 @@ int psp_xgmi_get_topology_info(struct psp_context *psp,
        /* Invoke xgmi ta again to get the link information */
        if (psp_xgmi_peer_link_info_supported(psp)) {
                struct ta_xgmi_cmd_get_peer_link_info *link_info_output;
+               struct ta_xgmi_cmd_get_extend_peer_link_info *link_extend_info_output;
                bool requires_reflection =
                        (psp->xgmi_context.supports_extended_data &&
                         get_extended_data) ||
                        amdgpu_ip_version(psp->adev, MP0_HWIP, 0) ==
                                IP_VERSION(13, 0, 6);
+               bool ta_port_num_support = psp->xgmi_context.xgmi_ta_caps &
+                                               EXTEND_PEER_LINK_INFO_CMD_FLAG;
 
-               link_info_output = &xgmi_cmd->xgmi_out_message.get_link_info;
                /* popluate the shared output buffer rather than the cmd input buffer
                 * with node_ids as the input for GET_PEER_LINKS command execution.
-                * This is required for GET_PEER_LINKS only per xgmi ta implementation
+                * This is required for GET_PEER_LINKS per xgmi ta implementation.
+                * The same requirement for GET_EXTEND_PEER_LINKS command.
                 */
-               for (i = 0; i < topology->num_nodes; i++) {
-                       link_info_output->nodes[i].node_id = topology->nodes[i].node_id;
-               }
-               link_info_output->num_nodes = topology->num_nodes;
+               if (ta_port_num_support) {
+                       link_extend_info_output = &xgmi_cmd->xgmi_out_message.get_extend_link_info;
+
+                       for (i = 0; i < topology->num_nodes; i++)
+                               link_extend_info_output->nodes[i].node_id = topology->nodes[i].node_id;
+
+                       link_extend_info_output->num_nodes = topology->num_nodes;
+                       xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_EXTEND_PEER_LINKS;
+               } else {
+                       link_info_output = &xgmi_cmd->xgmi_out_message.get_link_info;
 
-               xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_PEER_LINKS;
-               ret = psp_xgmi_invoke(psp, TA_COMMAND_XGMI__GET_PEER_LINKS);
+                       for (i = 0; i < topology->num_nodes; i++)
+                               link_info_output->nodes[i].node_id = topology->nodes[i].node_id;
 
+                       link_info_output->num_nodes = topology->num_nodes;
+                       xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_PEER_LINKS;
+               }
+
+               ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
                if (ret)
                        return ret;
 
                for (i = 0; i < topology->num_nodes; i++) {
+                       uint8_t node_num_links = ta_port_num_support ?
+                               link_extend_info_output->nodes[i].num_links : link_info_output->nodes[i].num_links;
                        /* accumulate num_links on extended data */
-                       topology->nodes[i].num_links = get_extended_data ?
-                                       topology->nodes[i].num_links +
-                                                       link_info_output->nodes[i].num_links :
-                                       ((requires_reflection && topology->nodes[i].num_links) ? topology->nodes[i].num_links :
-                                        link_info_output->nodes[i].num_links);
+                       if (get_extended_data) {
+                               topology->nodes[i].num_links = topology->nodes[i].num_links + node_num_links;
+                       } else {
+                               topology->nodes[i].num_links = (requires_reflection && topology->nodes[i].num_links) ?
+                                                               topology->nodes[i].num_links : node_num_links;
+                       }
 
                        /* reflect the topology information for bi-directionality */
                        if (requires_reflection && topology->nodes[i].num_hops)
index 3e67ed63e63853fadb3da7452592074687aa7dda..7111dd32e66f90e9ce1b55067ba0b4399cd3ba33 100644 (file)
@@ -189,6 +189,7 @@ struct psp_xgmi_context {
        struct ta_context               context;
        struct psp_xgmi_topology_info   top_info;
        bool                            supports_extended_data;
+       uint8_t                         xgmi_ta_caps;
 };
 
 struct psp_ras_context {