drm/amdgpu: prepare the output buffer for GET_PEER_LINKS command
authorShiwu Zhang <shiwu.zhang@amd.com>
Wed, 20 Sep 2023 10:36:55 +0000 (18:36 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 20 Oct 2023 19:11:28 +0000 (15:11 -0400)
Per the xgmi ta implementation, KGD needs to fill in node_ids
in concern into the shared command output buffer rather than the
command input buffer.

Input buffer is not used for GET_PEER_LINKS command execution.

In this way, xgmi ta can reuse the node info in the output buffer
just filled in and populate the same buffer with link info directly.

Signed-off-by: Shiwu Zhang <shiwu.zhang@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

index bd398e10fa0aa5bf256caf2bc714201fb875ad49..37891042ce9fdb2359a428c6efd74e1ffb56bf1c 100644 (file)
@@ -1431,14 +1431,22 @@ int psp_xgmi_get_topology_info(struct psp_context *psp,
                        amdgpu_ip_version(psp->adev, MP0_HWIP, 0) ==
                                IP_VERSION(13, 0, 6);
 
-               xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_PEER_LINKS;
+               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
+                */
+               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, TA_COMMAND_XGMI__GET_PEER_LINKS);
 
                if (ret)
                        return ret;
 
-               link_info_output = &xgmi_cmd->xgmi_out_message.get_link_info;
                for (i = 0; i < topology->num_nodes; i++) {
                        /* accumulate num_links on extended data */
                        topology->nodes[i].num_links = get_extended_data ?