Commit 2fb3c5d0 authored by Kevin Wang's avatar Kevin Wang Committed by Alex Deucher

drm/amdgpu: change psp_rap_invoke() function return value

RAP TA is an optional firmware. if it doesn’t exist,
the driver should bypass psp_rap_invoke() function.

1. bypass psp_rap_invoke() when RAP TA is not loaded.
2. add new parameter (status) to query RAP TA status.
   (the status value is different with psp_ta_invoke(),
3. fix the 'rap_status' MThread critical problem.
   (used without lock)
Signed-off-by: default avatarKevin Wang <kevin1.wang@amd.com>
Reviewed-by: default avatarHawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 25049166
...@@ -1597,6 +1597,7 @@ static int psp_rap_unload(struct psp_context *psp) ...@@ -1597,6 +1597,7 @@ static int psp_rap_unload(struct psp_context *psp)
static int psp_rap_initialize(struct psp_context *psp) static int psp_rap_initialize(struct psp_context *psp)
{ {
int ret; int ret;
enum ta_rap_status status = TA_RAP_STATUS__SUCCESS;
/* /*
* TODO: bypass the initialize in sriov for now * TODO: bypass the initialize in sriov for now
...@@ -1620,8 +1621,8 @@ static int psp_rap_initialize(struct psp_context *psp) ...@@ -1620,8 +1621,8 @@ static int psp_rap_initialize(struct psp_context *psp)
if (ret) if (ret)
return ret; return ret;
ret = psp_rap_invoke(psp, TA_CMD_RAP__INITIALIZE); ret = psp_rap_invoke(psp, TA_CMD_RAP__INITIALIZE, &status);
if (ret != TA_RAP_STATUS__SUCCESS) { if (ret || status != TA_RAP_STATUS__SUCCESS) {
psp_rap_unload(psp); psp_rap_unload(psp);
amdgpu_bo_free_kernel(&psp->rap_context.rap_shared_bo, amdgpu_bo_free_kernel(&psp->rap_context.rap_shared_bo,
...@@ -1630,8 +1631,10 @@ static int psp_rap_initialize(struct psp_context *psp) ...@@ -1630,8 +1631,10 @@ static int psp_rap_initialize(struct psp_context *psp)
psp->rap_context.rap_initialized = false; psp->rap_context.rap_initialized = false;
dev_warn(psp->adev->dev, "RAP TA initialize fail.\n"); dev_warn(psp->adev->dev, "RAP TA initialize fail (%d) status %d.\n",
return -EINVAL; ret, status);
return ret;
} }
return 0; return 0;
...@@ -1656,13 +1659,13 @@ static int psp_rap_terminate(struct psp_context *psp) ...@@ -1656,13 +1659,13 @@ static int psp_rap_terminate(struct psp_context *psp)
return ret; return ret;
} }
int psp_rap_invoke(struct psp_context *psp, uint32_t ta_cmd_id) int psp_rap_invoke(struct psp_context *psp, uint32_t ta_cmd_id, enum ta_rap_status *status)
{ {
struct ta_rap_shared_memory *rap_cmd; struct ta_rap_shared_memory *rap_cmd;
int ret; int ret = 0;
if (!psp->rap_context.rap_initialized) if (!psp->rap_context.rap_initialized)
return -EINVAL; return 0;
if (ta_cmd_id != TA_CMD_RAP__INITIALIZE && if (ta_cmd_id != TA_CMD_RAP__INITIALIZE &&
ta_cmd_id != TA_CMD_RAP__VALIDATE_L0) ta_cmd_id != TA_CMD_RAP__VALIDATE_L0)
...@@ -1678,14 +1681,16 @@ int psp_rap_invoke(struct psp_context *psp, uint32_t ta_cmd_id) ...@@ -1678,14 +1681,16 @@ int psp_rap_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
rap_cmd->validation_method_id = METHOD_A; rap_cmd->validation_method_id = METHOD_A;
ret = psp_ta_invoke(psp, rap_cmd->cmd_id, psp->rap_context.session_id); ret = psp_ta_invoke(psp, rap_cmd->cmd_id, psp->rap_context.session_id);
if (ret) { if (ret)
mutex_unlock(&psp->rap_context.mutex); goto out_unlock;
return ret;
} if (status)
*status = rap_cmd->rap_status;
out_unlock:
mutex_unlock(&psp->rap_context.mutex); mutex_unlock(&psp->rap_context.mutex);
return rap_cmd->rap_status; return ret;
} }
// RAP end // RAP end
......
...@@ -399,7 +399,7 @@ int psp_ras_trigger_error(struct psp_context *psp, ...@@ -399,7 +399,7 @@ int psp_ras_trigger_error(struct psp_context *psp,
int psp_hdcp_invoke(struct psp_context *psp, uint32_t ta_cmd_id); 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); int psp_dtm_invoke(struct psp_context *psp, uint32_t ta_cmd_id);
int psp_rap_invoke(struct psp_context *psp, uint32_t ta_cmd_id); int psp_rap_invoke(struct psp_context *psp, uint32_t ta_cmd_id, enum ta_rap_status *status);
int psp_securedisplay_invoke(struct psp_context *psp, uint32_t ta_cmd_id); int psp_securedisplay_invoke(struct psp_context *psp, uint32_t ta_cmd_id);
int psp_rlc_autoload_start(struct psp_context *psp); int psp_rlc_autoload_start(struct psp_context *psp);
......
...@@ -48,6 +48,7 @@ static ssize_t amdgpu_rap_debugfs_write(struct file *f, const char __user *buf, ...@@ -48,6 +48,7 @@ static ssize_t amdgpu_rap_debugfs_write(struct file *f, const char __user *buf,
struct ta_rap_cmd_output_data *rap_cmd_output; struct ta_rap_cmd_output_data *rap_cmd_output;
struct drm_device *dev = adev_to_drm(adev); struct drm_device *dev = adev_to_drm(adev);
uint32_t op; uint32_t op;
enum ta_rap_status status;
int ret; int ret;
if (*pos || size != 2) if (*pos || size != 2)
...@@ -70,9 +71,8 @@ static ssize_t amdgpu_rap_debugfs_write(struct file *f, const char __user *buf, ...@@ -70,9 +71,8 @@ static ssize_t amdgpu_rap_debugfs_write(struct file *f, const char __user *buf,
switch (op) { switch (op) {
case 2: case 2:
ret = psp_rap_invoke(&adev->psp, op); ret = psp_rap_invoke(&adev->psp, op, &status);
if (!ret && status == TA_RAP_STATUS__SUCCESS) {
if (ret == TA_RAP_STATUS__SUCCESS) {
dev_info(adev->dev, "RAP L0 validate test success.\n"); dev_info(adev->dev, "RAP L0 validate test success.\n");
} else { } else {
rap_shared_mem = (struct ta_rap_shared_memory *) rap_shared_mem = (struct ta_rap_shared_memory *)
...@@ -97,6 +97,7 @@ static ssize_t amdgpu_rap_debugfs_write(struct file *f, const char __user *buf, ...@@ -97,6 +97,7 @@ static ssize_t amdgpu_rap_debugfs_write(struct file *f, const char __user *buf,
default: default:
dev_info(adev->dev, "Unsupported op id: %d, ", op); dev_info(adev->dev, "Unsupported op id: %d, ", op);
dev_info(adev->dev, "Only support op 2(L0 validate test).\n"); dev_info(adev->dev, "Only support op 2(L0 validate test).\n");
break;
} }
amdgpu_gfx_off_ctrl(adev, true); amdgpu_gfx_off_ctrl(adev, true);
......
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