Commit a1eac5bd authored by Tao Zhou's avatar Tao Zhou Committed by Alex Deucher
Browse files

drm/amdgpu: add PSP RAS address query command



Convert mca address to physical address or vice versa via RAS TA.

Signed-off-by: default avatarTao Zhou <tao.zhou1@amd.com>
Reviewed-by: default avatarHawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent e4d65510
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -1782,6 +1782,31 @@ int psp_ras_trigger_error(struct psp_context *psp,

	return 0;
}

int psp_ras_query_address(struct psp_context *psp,
			  struct ta_ras_query_address_input *addr_in,
			  struct ta_ras_query_address_output *addr_out)
{
	struct ta_ras_shared_memory *ras_cmd;
	int ret;

	if (!psp->ras_context.context.initialized)
		return -EINVAL;

	ras_cmd = (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf;
	memset(ras_cmd, 0, sizeof(struct ta_ras_shared_memory));

	ras_cmd->cmd_id = TA_RAS_COMMAND__QUERY_ADDRESS;
	ras_cmd->ras_in_message.address = *addr_in;

	ret = psp_ras_invoke(psp, ras_cmd->cmd_id);
	if (ret || ras_cmd->ras_status || psp->cmd_buf_mem->resp.status)
		return -EINVAL;

	*addr_out = ras_cmd->ras_out_message.address;

	return 0;
}
// ras end

// HDCP start
+3 −0
Original line number Diff line number Diff line
@@ -502,6 +502,9 @@ int psp_ras_enable_features(struct psp_context *psp,
int psp_ras_trigger_error(struct psp_context *psp,
			  struct ta_ras_trigger_error_input *info, uint32_t instance_mask);
int psp_ras_terminate(struct psp_context *psp);
int psp_ras_query_address(struct psp_context *psp,
			  struct ta_ras_query_address_input *addr_in,
			  struct ta_ras_query_address_output *addr_out);

int psp_hdcp_invoke(struct psp_context *psp, uint32_t ta_cmd_id);
int psp_dtm_invoke(struct psp_context *psp, uint32_t ta_cmd_id);
+36 −0
Original line number Diff line number Diff line
@@ -36,6 +36,9 @@ enum ras_command {
	TA_RAS_COMMAND__ENABLE_FEATURES = 0,
	TA_RAS_COMMAND__DISABLE_FEATURES,
	TA_RAS_COMMAND__TRIGGER_ERROR,
	TA_RAS_COMMAND__QUERY_BLOCK_INFO,
	TA_RAS_COMMAND__QUERY_SUB_BLOCK_INFO,
	TA_RAS_COMMAND__QUERY_ADDRESS,
};

enum ta_ras_status {
@@ -105,6 +108,11 @@ enum ta_ras_error_type {
	TA_RAS_ERROR__POISON			= 8,
};

enum ta_ras_address_type {
	TA_RAS_MCA_TO_PA,
	TA_RAS_PA_TO_MCA,
};

/* Input/output structures for RAS commands */
/**********************************************************/

@@ -133,12 +141,38 @@ struct ta_ras_init_flags {
	uint8_t channel_dis_num;
};

struct ta_ras_mca_addr {
	uint64_t err_addr;
	uint32_t ch_inst;
	uint32_t umc_inst;
	uint32_t node_inst;
};

struct ta_ras_phy_addr {
	uint64_t pa;
	uint32_t bank;
	uint32_t channel_idx;
};

struct ta_ras_query_address_input {
	enum ta_ras_address_type addr_type;
	struct ta_ras_mca_addr ma;
	struct ta_ras_phy_addr pa;
};

struct ta_ras_output_flags {
	uint8_t ras_init_success_flag;
	uint8_t err_inject_switch_disable_flag;
	uint8_t reg_access_failure_flag;
};

struct ta_ras_query_address_output {
	/* don't use the flags here */
	struct ta_ras_output_flags flags;
	struct ta_ras_mca_addr ma;
	struct ta_ras_phy_addr pa;
};

/* Common input structure for RAS callbacks */
/**********************************************************/
union ta_ras_cmd_input {
@@ -146,12 +180,14 @@ union ta_ras_cmd_input {
	struct ta_ras_enable_features_input	enable_features;
	struct ta_ras_disable_features_input	disable_features;
	struct ta_ras_trigger_error_input	trigger_error;
	struct ta_ras_query_address_input	address;

	uint32_t reserve_pad[256];
};

union ta_ras_cmd_output {
	struct ta_ras_output_flags flags;
	struct ta_ras_query_address_output address;

	uint32_t reserve_pad[256];
};