]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/amdgpu: switch to common xgmi ta helpers
authorHawking Zhang <Hawking.Zhang@amd.com>
Mon, 4 May 2020 11:39:24 +0000 (19:39 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 8 May 2020 18:31:37 +0000 (14:31 -0400)
get_hive_id/get_node_id/get_topology_info/set_topology_info
are common xgmi command supported by TA for all the ASICs
that support xgmi link. They should be implemented as common
helper functions to avoid duplicated code per IP generation

Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com>
Reviewed-by: Guchun Chen <guchun.chen@amd.com>
Reviewed-by: John Clements <john.clements@amd.com>
Reviewed-by: Tao Zhou <tao.zhou1@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
drivers/gpu/drm/amd/amdgpu/psp_v11_0.c

index cade87caed0b3fd2c03dab13cce0cb98ed8eb054..38a6f02a41a7648e14be5f1d7dd98c48675e50e4 100644 (file)
@@ -664,6 +664,121 @@ int psp_xgmi_initialize(struct psp_context *psp)
        return ret;
 }
 
+int psp_xgmi_get_hive_id(struct psp_context *psp, uint64_t *hive_id)
+{
+       struct ta_xgmi_shared_memory *xgmi_cmd;
+       int ret;
+
+       xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
+       memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
+
+       xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_HIVE_ID;
+
+       /* Invoke xgmi ta to get hive id */
+       ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
+       if (ret)
+               return ret;
+
+       *hive_id = xgmi_cmd->xgmi_out_message.get_hive_id.hive_id;
+
+       return 0;
+}
+
+int psp_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id)
+{
+       struct ta_xgmi_shared_memory *xgmi_cmd;
+       int ret;
+
+       xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
+       memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
+
+       xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_NODE_ID;
+
+       /* Invoke xgmi ta to get the node id */
+       ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
+       if (ret)
+               return ret;
+
+       *node_id = xgmi_cmd->xgmi_out_message.get_node_id.node_id;
+
+       return 0;
+}
+
+int psp_xgmi_get_topology_info(struct psp_context *psp,
+                              int number_devices,
+                              struct psp_xgmi_topology_info *topology)
+{
+       struct ta_xgmi_shared_memory *xgmi_cmd;
+       struct ta_xgmi_cmd_get_topology_info_input *topology_info_input;
+       struct ta_xgmi_cmd_get_topology_info_output *topology_info_output;
+       int i;
+       int ret;
+
+       if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES)
+               return -EINVAL;
+
+       xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
+       memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
+
+       /* Fill in the shared memory with topology information as input */
+       topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info;
+       xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO;
+       topology_info_input->num_nodes = number_devices;
+
+       for (i = 0; i < topology_info_input->num_nodes; i++) {
+               topology_info_input->nodes[i].node_id = topology->nodes[i].node_id;
+               topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops;
+               topology_info_input->nodes[i].is_sharing_enabled = topology->nodes[i].is_sharing_enabled;
+               topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine;
+       }
+
+       /* Invoke xgmi ta to get the topology information */
+       ret = psp_xgmi_invoke(psp, TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO);
+       if (ret)
+               return ret;
+
+       /* Read the output topology information from the shared memory */
+       topology_info_output = &xgmi_cmd->xgmi_out_message.get_topology_info;
+       topology->num_nodes = xgmi_cmd->xgmi_out_message.get_topology_info.num_nodes;
+       for (i = 0; i < topology->num_nodes; i++) {
+               topology->nodes[i].node_id = topology_info_output->nodes[i].node_id;
+               topology->nodes[i].num_hops = topology_info_output->nodes[i].num_hops;
+               topology->nodes[i].is_sharing_enabled = topology_info_output->nodes[i].is_sharing_enabled;
+               topology->nodes[i].sdma_engine = topology_info_output->nodes[i].sdma_engine;
+       }
+
+       return 0;
+}
+
+int psp_xgmi_set_topology_info(struct psp_context *psp,
+                              int number_devices,
+                              struct psp_xgmi_topology_info *topology)
+{
+       struct ta_xgmi_shared_memory *xgmi_cmd;
+       struct ta_xgmi_cmd_get_topology_info_input *topology_info_input;
+       int i;
+
+       if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES)
+               return -EINVAL;
+
+       xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
+       memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
+
+       topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info;
+       xgmi_cmd->cmd_id = TA_COMMAND_XGMI__SET_TOPOLOGY_INFO;
+       topology_info_input->num_nodes = number_devices;
+
+       for (i = 0; i < topology_info_input->num_nodes; i++) {
+               topology_info_input->nodes[i].node_id = topology->nodes[i].node_id;
+               topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops;
+               topology_info_input->nodes[i].is_sharing_enabled = 1;
+               topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine;
+       }
+
+       /* Invoke xgmi ta to set topology information */
+       return psp_xgmi_invoke(psp, TA_COMMAND_XGMI__SET_TOPOLOGY_INFO);
+}
+
 // ras begin
 static int psp_ras_init_shared_buf(struct psp_context *psp)
 {
index 7fcd63d5432cc088f23968a3b1f89be412ba3c09..263bd8e98ba41c397221625e8af2b0d2b6507623 100644 (file)
@@ -95,12 +95,6 @@ struct psp_funcs
                            enum psp_ring_type ring_type);
        bool (*smu_reload_quirk)(struct psp_context *psp);
        int (*mode1_reset)(struct psp_context *psp);
-       int (*xgmi_get_node_id)(struct psp_context *psp, uint64_t *node_id);
-       int (*xgmi_get_hive_id)(struct psp_context *psp, uint64_t *hive_id);
-       int (*xgmi_get_topology_info)(struct psp_context *psp, int number_devices,
-                                     struct psp_xgmi_topology_info *topology);
-       int (*xgmi_set_topology_info)(struct psp_context *psp, int number_devices,
-                                     struct psp_xgmi_topology_info *topology);
        int (*ras_trigger_error)(struct psp_context *psp,
                        struct ta_ras_trigger_error_input *info);
        int (*ras_cure_posion)(struct psp_context *psp, uint64_t *mode_ptr);
@@ -316,16 +310,6 @@ struct amdgpu_psp_funcs {
                ((psp)->funcs->smu_reload_quirk ? (psp)->funcs->smu_reload_quirk((psp)) : false)
 #define psp_mode1_reset(psp) \
                ((psp)->funcs->mode1_reset ? (psp)->funcs->mode1_reset((psp)) : false)
-#define psp_xgmi_get_node_id(psp, node_id) \
-               ((psp)->funcs->xgmi_get_node_id ? (psp)->funcs->xgmi_get_node_id((psp), (node_id)) : -EINVAL)
-#define psp_xgmi_get_hive_id(psp, hive_id) \
-               ((psp)->funcs->xgmi_get_hive_id ? (psp)->funcs->xgmi_get_hive_id((psp), (hive_id)) : -EINVAL)
-#define psp_xgmi_get_topology_info(psp, num_device, topology) \
-               ((psp)->funcs->xgmi_get_topology_info ? \
-               (psp)->funcs->xgmi_get_topology_info((psp), (num_device), (topology)) : -EINVAL)
-#define psp_xgmi_set_topology_info(psp, num_device, topology) \
-               ((psp)->funcs->xgmi_set_topology_info ?  \
-               (psp)->funcs->xgmi_set_topology_info((psp), (num_device), (topology)) : -EINVAL)
 #define psp_rlc_autoload(psp) \
                ((psp)->funcs->rlc_autoload_start ? (psp)->funcs->rlc_autoload_start((psp)) : 0)
 #define psp_mem_training_init(psp) \
@@ -369,6 +353,14 @@ int psp_update_vcn_sram(struct amdgpu_device *adev, int inst_idx,
 int psp_xgmi_initialize(struct psp_context *psp);
 int psp_xgmi_terminate(struct psp_context *psp);
 int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id);
+int psp_xgmi_get_hive_id(struct psp_context *psp, uint64_t *hive_id);
+int psp_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id);
+int psp_xgmi_get_topology_info(struct psp_context *psp,
+                              int number_devices,
+                              struct psp_xgmi_topology_info *topology);
+int psp_xgmi_set_topology_info(struct psp_context *psp,
+                              int number_devices,
+                              struct psp_xgmi_topology_info *topology);
 
 int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id);
 int psp_ras_enable_features(struct psp_context *psp,
index 97c80f1d5731dd5a7cad7bf750a328825f4fd498..4f6c0df5dedbdb5354ab5b68a8fc153686760449 100644 (file)
@@ -524,123 +524,6 @@ static int psp_v11_0_mode1_reset(struct psp_context *psp)
        return 0;
 }
 
-/* TODO: Fill in follow functions once PSP firmware interface for XGMI is ready.
- * For now, return success and hack the hive_id so high level code can
- * start testing
- */
-static int psp_v11_0_xgmi_get_topology_info(struct psp_context *psp,
-       int number_devices, struct psp_xgmi_topology_info *topology)
-{
-       struct ta_xgmi_shared_memory *xgmi_cmd;
-       struct ta_xgmi_cmd_get_topology_info_input *topology_info_input;
-       struct ta_xgmi_cmd_get_topology_info_output *topology_info_output;
-       int i;
-       int ret;
-
-       if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES)
-               return -EINVAL;
-
-       xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
-       memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
-
-       /* Fill in the shared memory with topology information as input */
-       topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info;
-       xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO;
-       topology_info_input->num_nodes = number_devices;
-
-       for (i = 0; i < topology_info_input->num_nodes; i++) {
-               topology_info_input->nodes[i].node_id = topology->nodes[i].node_id;
-               topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops;
-               topology_info_input->nodes[i].is_sharing_enabled = topology->nodes[i].is_sharing_enabled;
-               topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine;
-       }
-
-       /* Invoke xgmi ta to get the topology information */
-       ret = psp_xgmi_invoke(psp, TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO);
-       if (ret)
-               return ret;
-
-       /* Read the output topology information from the shared memory */
-       topology_info_output = &xgmi_cmd->xgmi_out_message.get_topology_info;
-       topology->num_nodes = xgmi_cmd->xgmi_out_message.get_topology_info.num_nodes;
-       for (i = 0; i < topology->num_nodes; i++) {
-               topology->nodes[i].node_id = topology_info_output->nodes[i].node_id;
-               topology->nodes[i].num_hops = topology_info_output->nodes[i].num_hops;
-               topology->nodes[i].is_sharing_enabled = topology_info_output->nodes[i].is_sharing_enabled;
-               topology->nodes[i].sdma_engine = topology_info_output->nodes[i].sdma_engine;
-       }
-
-       return 0;
-}
-
-static int psp_v11_0_xgmi_set_topology_info(struct psp_context *psp,
-       int number_devices, struct psp_xgmi_topology_info *topology)
-{
-       struct ta_xgmi_shared_memory *xgmi_cmd;
-       struct ta_xgmi_cmd_get_topology_info_input *topology_info_input;
-       int i;
-
-       if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES)
-               return -EINVAL;
-
-       xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
-       memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
-
-       topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info;
-       xgmi_cmd->cmd_id = TA_COMMAND_XGMI__SET_TOPOLOGY_INFO;
-       topology_info_input->num_nodes = number_devices;
-
-       for (i = 0; i < topology_info_input->num_nodes; i++) {
-               topology_info_input->nodes[i].node_id = topology->nodes[i].node_id;
-               topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops;
-               topology_info_input->nodes[i].is_sharing_enabled = 1;
-               topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine;
-       }
-
-       /* Invoke xgmi ta to set topology information */
-       return psp_xgmi_invoke(psp, TA_COMMAND_XGMI__SET_TOPOLOGY_INFO);
-}
-
-static int psp_v11_0_xgmi_get_hive_id(struct psp_context *psp, uint64_t *hive_id)
-{
-       struct ta_xgmi_shared_memory *xgmi_cmd;
-       int ret;
-
-       xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
-       memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
-
-       xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_HIVE_ID;
-
-       /* Invoke xgmi ta to get hive id */
-       ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
-       if (ret)
-               return ret;
-
-       *hive_id = xgmi_cmd->xgmi_out_message.get_hive_id.hive_id;
-
-       return 0;
-}
-
-static int psp_v11_0_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id)
-{
-       struct ta_xgmi_shared_memory *xgmi_cmd;
-       int ret;
-
-       xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
-       memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
-
-       xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_NODE_ID;
-
-       /* Invoke xgmi ta to get the node id */
-       ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
-       if (ret)
-               return ret;
-
-       *node_id = xgmi_cmd->xgmi_out_message.get_node_id.node_id;
-
-       return 0;
-}
-
 static int psp_v11_0_ras_trigger_error(struct psp_context *psp,
                struct ta_ras_trigger_error_input *info)
 {
@@ -995,10 +878,6 @@ static const struct psp_funcs psp_v11_0_funcs = {
        .ring_stop = psp_v11_0_ring_stop,
        .ring_destroy = psp_v11_0_ring_destroy,
        .mode1_reset = psp_v11_0_mode1_reset,
-       .xgmi_get_topology_info = psp_v11_0_xgmi_get_topology_info,
-       .xgmi_set_topology_info = psp_v11_0_xgmi_set_topology_info,
-       .xgmi_get_hive_id = psp_v11_0_xgmi_get_hive_id,
-       .xgmi_get_node_id = psp_v11_0_xgmi_get_node_id,
        .ras_trigger_error = psp_v11_0_ras_trigger_error,
        .ras_cure_posion = psp_v11_0_ras_cure_posion,
        .rlc_autoload_start = psp_v11_0_rlc_autoload_start,