[PATCH 1/4] drm/amdgpu: switch to common xgmi ta helpers

Zhou1, Tao Tao.Zhou1 at amd.com
Wed May 6 08:38:37 UTC 2020


[AMD Public Use]

The series is:

Reviewed-by: Tao Zhou <tao.zhou1 at amd.com>

> -----Original Message-----
> From: Hawking Zhang <Hawking.Zhang at amd.com>
> Sent: 2020年5月6日 14:39
> To: amd-gfx at lists.freedesktop.org; Deucher, Alexander
> <Alexander.Deucher at amd.com>; Clements, John
> <John.Clements at amd.com>; Gao, Likun <Likun.Gao at amd.com>; Chen,
> Guchun <Guchun.Chen at amd.com>; Li, Dennis <Dennis.Li at amd.com>;
> Zhou1, Tao <Tao.Zhou1 at amd.com>
> Cc: Zhang, Hawking <Hawking.Zhang at amd.com>
> Subject: [PATCH 1/4] drm/amdgpu: switch to common xgmi ta helpers
> 
> 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 at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 115
> ++++++++++++++++++++++++++++++
> drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h |  24 +++----
> drivers/gpu/drm/amd/amdgpu/psp_v11_0.c  | 121 --------------------------------
>  3 files changed, 123 insertions(+), 137 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> index f061ad6..bb5b510 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> @@ -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)  { diff --git
> a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
> index 7fcd63d..263bd8e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
> @@ -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, diff --git
> a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
> b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
> index 97c80f1..4f6c0df 100644
> --- a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
> @@ -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,
> --
> 2.7.4


More information about the amd-gfx mailing list