Commit 331e7818 authored by Jonathan Kim's avatar Jonathan Kim Committed by Alex Deucher

drm/amdgpu: add psp command to get num xgmi links between direct peers

The TA can now be invoked to provide the number of xgmi links connecting
a direct source and destination peer.
Non-direct peers will report zero links.
Signed-off-by: default avatarJonathan Kim <jonathan.kim@amd.com>
Reviewed-by: default avatarFelix Kuehling <felix.kuehling@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent d8c33180
...@@ -1078,6 +1078,12 @@ int psp_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id) ...@@ -1078,6 +1078,12 @@ int psp_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id)
return 0; return 0;
} }
static bool psp_xgmi_peer_link_info_supported(struct psp_context *psp)
{
return psp->adev->asic_type == CHIP_ALDEBARAN &&
psp->ta_xgmi_ucode_version >= 0x2000000b;
}
int psp_xgmi_get_topology_info(struct psp_context *psp, int psp_xgmi_get_topology_info(struct psp_context *psp,
int number_devices, int number_devices,
struct psp_xgmi_topology_info *topology) struct psp_xgmi_topology_info *topology)
...@@ -1121,6 +1127,23 @@ int psp_xgmi_get_topology_info(struct psp_context *psp, ...@@ -1121,6 +1127,23 @@ int psp_xgmi_get_topology_info(struct psp_context *psp,
topology->nodes[i].sdma_engine = topology_info_output->nodes[i].sdma_engine; topology->nodes[i].sdma_engine = topology_info_output->nodes[i].sdma_engine;
} }
/* 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_output *link_info_output;
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++)
topology->nodes[i].num_links =
link_info_output->nodes[i].num_links;
}
return 0; return 0;
} }
......
...@@ -116,6 +116,7 @@ struct psp_xgmi_node_info { ...@@ -116,6 +116,7 @@ struct psp_xgmi_node_info {
uint8_t num_hops; uint8_t num_hops;
uint8_t is_sharing_enabled; uint8_t is_sharing_enabled;
enum ta_xgmi_assigned_sdma_engine sdma_engine; enum ta_xgmi_assigned_sdma_engine sdma_engine;
uint8_t num_links;
}; };
struct psp_xgmi_topology_info { struct psp_xgmi_topology_info {
......
...@@ -33,7 +33,8 @@ enum ta_command_xgmi { ...@@ -33,7 +33,8 @@ enum ta_command_xgmi {
TA_COMMAND_XGMI__GET_NODE_ID = 0x01, TA_COMMAND_XGMI__GET_NODE_ID = 0x01,
TA_COMMAND_XGMI__GET_HIVE_ID = 0x02, TA_COMMAND_XGMI__GET_HIVE_ID = 0x02,
TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO = 0x03, TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO = 0x03,
TA_COMMAND_XGMI__SET_TOPOLOGY_INFO = 0x04 TA_COMMAND_XGMI__SET_TOPOLOGY_INFO = 0x04,
TA_COMMAND_XGMI__GET_PEER_LINKS = 0x0B
}; };
/* XGMI related enumerations */ /* XGMI related enumerations */
...@@ -75,6 +76,11 @@ struct ta_xgmi_node_info { ...@@ -75,6 +76,11 @@ struct ta_xgmi_node_info {
enum ta_xgmi_assigned_sdma_engine sdma_engine; enum ta_xgmi_assigned_sdma_engine sdma_engine;
}; };
struct ta_xgmi_peer_link_info {
uint64_t node_id;
uint8_t num_links;
};
struct ta_xgmi_cmd_initialize_output { struct ta_xgmi_cmd_initialize_output {
uint32_t status; uint32_t status;
}; };
...@@ -97,6 +103,11 @@ struct ta_xgmi_cmd_get_topology_info_output { ...@@ -97,6 +103,11 @@ struct ta_xgmi_cmd_get_topology_info_output {
struct ta_xgmi_node_info nodes[TA_XGMI__MAX_CONNECTED_NODES]; struct ta_xgmi_node_info nodes[TA_XGMI__MAX_CONNECTED_NODES];
}; };
struct ta_xgmi_cmd_get_peer_link_info_output {
uint32_t num_nodes;
struct ta_xgmi_peer_link_info nodes[TA_XGMI__MAX_CONNECTED_NODES];
};
struct ta_xgmi_cmd_set_topology_info_input { struct ta_xgmi_cmd_set_topology_info_input {
uint32_t num_nodes; uint32_t num_nodes;
struct ta_xgmi_node_info nodes[TA_XGMI__MAX_CONNECTED_NODES]; struct ta_xgmi_node_info nodes[TA_XGMI__MAX_CONNECTED_NODES];
...@@ -115,6 +126,7 @@ union ta_xgmi_cmd_output { ...@@ -115,6 +126,7 @@ union ta_xgmi_cmd_output {
struct ta_xgmi_cmd_get_node_id_output get_node_id; struct ta_xgmi_cmd_get_node_id_output get_node_id;
struct ta_xgmi_cmd_get_hive_id_output get_hive_id; struct ta_xgmi_cmd_get_hive_id_output get_hive_id;
struct ta_xgmi_cmd_get_topology_info_output get_topology_info; struct ta_xgmi_cmd_get_topology_info_output get_topology_info;
struct ta_xgmi_cmd_get_peer_link_info_output get_link_info;
}; };
/**********************************************************/ /**********************************************************/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment