Commit f5cfef98 authored by Huang Rui's avatar Huang Rui Committed by Alex Deucher

drm/amdgpu: split psp asd function

Rework in order to properly support suspend.
Signed-off-by: default avatarHuang Rui <ray.huang@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 2b0c3aee
...@@ -206,48 +206,43 @@ static void psp_prep_asd_cmd_buf(struct psp_gfx_cmd_resp *cmd, ...@@ -206,48 +206,43 @@ static void psp_prep_asd_cmd_buf(struct psp_gfx_cmd_resp *cmd,
cmd->cmd.cmd_load_ta.cmd_buf_len = shared_size; cmd->cmd.cmd_load_ta.cmd_buf_len = shared_size;
} }
static int psp_asd_init(struct psp_context *psp)
{
int ret;
/*
* Allocate 16k memory aligned to 4k from Frame Buffer (local
* physical) for shared ASD <-> Driver
*/
ret = amdgpu_bo_create_kernel(psp->adev, PSP_ASD_SHARED_MEM_SIZE,
PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
&psp->asd_shared_bo,
&psp->asd_shared_mc_addr,
&psp->asd_shared_buf);
return ret;
}
static int psp_asd_load(struct psp_context *psp) static int psp_asd_load(struct psp_context *psp)
{ {
int ret; int ret;
struct amdgpu_bo *asd_shared_bo;
uint64_t asd_shared_mc_addr;
void *asd_shared_buf;
struct psp_gfx_cmd_resp *cmd; struct psp_gfx_cmd_resp *cmd;
cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL); cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
if (!cmd) if (!cmd)
return -ENOMEM; return -ENOMEM;
/*
* Allocate 16k memory aligned to 4k from Frame Buffer (local
* physical) for shared ASD <-> Driver
*/
ret = amdgpu_bo_create_kernel(psp->adev, PSP_ASD_SHARED_MEM_SIZE, PAGE_SIZE,
AMDGPU_GEM_DOMAIN_VRAM,
&asd_shared_bo, &asd_shared_mc_addr, &asd_shared_buf);
if (ret)
goto failed;
memset(psp->fw_pri_buf, 0, PSP_1_MEG); memset(psp->fw_pri_buf, 0, PSP_1_MEG);
memcpy(psp->fw_pri_buf, psp->asd_start_addr, psp->asd_ucode_size); memcpy(psp->fw_pri_buf, psp->asd_start_addr, psp->asd_ucode_size);
psp_prep_asd_cmd_buf(cmd, psp->fw_pri_mc_addr, asd_shared_mc_addr, psp_prep_asd_cmd_buf(cmd, psp->fw_pri_mc_addr, psp->asd_shared_mc_addr,
psp->asd_ucode_size, PSP_ASD_SHARED_MEM_SIZE); psp->asd_ucode_size, PSP_ASD_SHARED_MEM_SIZE);
ret = psp_cmd_submit_buf(psp, NULL, cmd, ret = psp_cmd_submit_buf(psp, NULL, cmd,
psp->fence_buf_mc_addr, 2); psp->fence_buf_mc_addr, 2);
if (ret)
goto failed_mem;
amdgpu_bo_free_kernel(&asd_shared_bo, &asd_shared_mc_addr, &asd_shared_buf);
kfree(cmd); kfree(cmd);
return 0;
failed_mem:
amdgpu_bo_free_kernel(&asd_shared_bo, &asd_shared_mc_addr, &asd_shared_buf);
failed:
kfree(cmd);
return ret; return ret;
} }
...@@ -301,6 +296,10 @@ static int psp_load_fw(struct amdgpu_device *adev) ...@@ -301,6 +296,10 @@ static int psp_load_fw(struct amdgpu_device *adev)
if (ret) if (ret)
goto failed_mem; goto failed_mem;
ret = psp_asd_init(psp);
if (ret)
goto failed_mem;
ret = psp_asd_load(psp); ret = psp_asd_load(psp);
if (ret) if (ret)
goto failed_mem; goto failed_mem;
......
...@@ -90,12 +90,15 @@ struct psp_context ...@@ -90,12 +90,15 @@ struct psp_context
uint64_t tmr_mc_addr; uint64_t tmr_mc_addr;
void *tmr_buf; void *tmr_buf;
/* asd firmware */ /* asd firmware and buffer */
const struct firmware *asd_fw; const struct firmware *asd_fw;
uint32_t asd_fw_version; uint32_t asd_fw_version;
uint32_t asd_feature_version; uint32_t asd_feature_version;
uint32_t asd_ucode_size; uint32_t asd_ucode_size;
uint8_t *asd_start_addr; uint8_t *asd_start_addr;
struct amdgpu_bo *asd_shared_bo;
uint64_t asd_shared_mc_addr;
void *asd_shared_buf;
/* fence buffer */ /* fence buffer */
struct amdgpu_bo *fence_buf_bo; struct amdgpu_bo *fence_buf_bo;
......
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