drm/amdgpu/psp: move PSP memory alloc from hw_init to sw_init
Memory allocations should be done in sw_init. hw_init should just be hardware programming needed to initialize the IP block. This is how most other IP blocks work. Move the GPU memory allocations from psp hw_init to psp sw_init and move the memory free to sw_fini. This also fixes a potential GPU memory leak if psp hw_init fails. Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
e6e405e048
commit
b95b539168
1 changed files with 48 additions and 49 deletions
|
@ -356,7 +356,39 @@ static int psp_sw_init(void *handle)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = amdgpu_bo_create_kernel(adev, PSP_1_MEG, PSP_1_MEG,
|
||||||
|
amdgpu_sriov_vf(adev) ?
|
||||||
|
AMDGPU_GEM_DOMAIN_VRAM : AMDGPU_GEM_DOMAIN_GTT,
|
||||||
|
&psp->fw_pri_bo,
|
||||||
|
&psp->fw_pri_mc_addr,
|
||||||
|
&psp->fw_pri_buf);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = amdgpu_bo_create_kernel(adev, PSP_FENCE_BUFFER_SIZE, PAGE_SIZE,
|
||||||
|
AMDGPU_GEM_DOMAIN_VRAM,
|
||||||
|
&psp->fence_buf_bo,
|
||||||
|
&psp->fence_buf_mc_addr,
|
||||||
|
&psp->fence_buf);
|
||||||
|
if (ret)
|
||||||
|
goto failed1;
|
||||||
|
|
||||||
|
ret = amdgpu_bo_create_kernel(adev, PSP_CMD_BUFFER_SIZE, PAGE_SIZE,
|
||||||
|
AMDGPU_GEM_DOMAIN_VRAM,
|
||||||
|
&psp->cmd_buf_bo, &psp->cmd_buf_mc_addr,
|
||||||
|
(void **)&psp->cmd_buf_mem);
|
||||||
|
if (ret)
|
||||||
|
goto failed2;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
failed2:
|
||||||
|
amdgpu_bo_free_kernel(&psp->fw_pri_bo,
|
||||||
|
&psp->fw_pri_mc_addr, &psp->fw_pri_buf);
|
||||||
|
failed1:
|
||||||
|
amdgpu_bo_free_kernel(&psp->fence_buf_bo,
|
||||||
|
&psp->fence_buf_mc_addr, &psp->fence_buf);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int psp_sw_fini(void *handle)
|
static int psp_sw_fini(void *handle)
|
||||||
|
@ -390,6 +422,13 @@ static int psp_sw_fini(void *handle)
|
||||||
kfree(cmd);
|
kfree(cmd);
|
||||||
cmd = NULL;
|
cmd = NULL;
|
||||||
|
|
||||||
|
amdgpu_bo_free_kernel(&psp->fw_pri_bo,
|
||||||
|
&psp->fw_pri_mc_addr, &psp->fw_pri_buf);
|
||||||
|
amdgpu_bo_free_kernel(&psp->fence_buf_bo,
|
||||||
|
&psp->fence_buf_mc_addr, &psp->fence_buf);
|
||||||
|
amdgpu_bo_free_kernel(&psp->cmd_buf_bo, &psp->cmd_buf_mc_addr,
|
||||||
|
(void **)&psp->cmd_buf_mem);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2469,51 +2508,18 @@ static int psp_load_fw(struct amdgpu_device *adev)
|
||||||
struct psp_context *psp = &adev->psp;
|
struct psp_context *psp = &adev->psp;
|
||||||
|
|
||||||
if (amdgpu_sriov_vf(adev) && amdgpu_in_reset(adev)) {
|
if (amdgpu_sriov_vf(adev) && amdgpu_in_reset(adev)) {
|
||||||
psp_ring_stop(psp, PSP_RING_TYPE__KM); /* should not destroy ring, only stop */
|
/* should not destroy ring, only stop */
|
||||||
goto skip_memalloc;
|
psp_ring_stop(psp, PSP_RING_TYPE__KM);
|
||||||
}
|
|
||||||
|
|
||||||
if (amdgpu_sriov_vf(adev)) {
|
|
||||||
ret = amdgpu_bo_create_kernel(adev, PSP_1_MEG, PSP_1_MEG,
|
|
||||||
AMDGPU_GEM_DOMAIN_VRAM,
|
|
||||||
&psp->fw_pri_bo,
|
|
||||||
&psp->fw_pri_mc_addr,
|
|
||||||
&psp->fw_pri_buf);
|
|
||||||
} else {
|
} else {
|
||||||
ret = amdgpu_bo_create_kernel(adev, PSP_1_MEG, PSP_1_MEG,
|
memset(psp->fence_buf, 0, PSP_FENCE_BUFFER_SIZE);
|
||||||
AMDGPU_GEM_DOMAIN_GTT,
|
|
||||||
&psp->fw_pri_bo,
|
ret = psp_ring_init(psp, PSP_RING_TYPE__KM);
|
||||||
&psp->fw_pri_mc_addr,
|
if (ret) {
|
||||||
&psp->fw_pri_buf);
|
DRM_ERROR("PSP ring init failed!\n");
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret)
|
|
||||||
goto failed;
|
|
||||||
|
|
||||||
ret = amdgpu_bo_create_kernel(adev, PSP_FENCE_BUFFER_SIZE, PAGE_SIZE,
|
|
||||||
AMDGPU_GEM_DOMAIN_VRAM,
|
|
||||||
&psp->fence_buf_bo,
|
|
||||||
&psp->fence_buf_mc_addr,
|
|
||||||
&psp->fence_buf);
|
|
||||||
if (ret)
|
|
||||||
goto failed;
|
|
||||||
|
|
||||||
ret = amdgpu_bo_create_kernel(adev, PSP_CMD_BUFFER_SIZE, PAGE_SIZE,
|
|
||||||
AMDGPU_GEM_DOMAIN_VRAM,
|
|
||||||
&psp->cmd_buf_bo, &psp->cmd_buf_mc_addr,
|
|
||||||
(void **)&psp->cmd_buf_mem);
|
|
||||||
if (ret)
|
|
||||||
goto failed;
|
|
||||||
|
|
||||||
memset(psp->fence_buf, 0, PSP_FENCE_BUFFER_SIZE);
|
|
||||||
|
|
||||||
ret = psp_ring_init(psp, PSP_RING_TYPE__KM);
|
|
||||||
if (ret) {
|
|
||||||
DRM_ERROR("PSP ring init failed!\n");
|
|
||||||
goto failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
skip_memalloc:
|
|
||||||
ret = psp_hw_start(psp);
|
ret = psp_hw_start(psp);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto failed;
|
goto failed;
|
||||||
|
@ -2631,13 +2637,6 @@ static int psp_hw_fini(void *handle)
|
||||||
psp_tmr_terminate(psp);
|
psp_tmr_terminate(psp);
|
||||||
psp_ring_destroy(psp, PSP_RING_TYPE__KM);
|
psp_ring_destroy(psp, PSP_RING_TYPE__KM);
|
||||||
|
|
||||||
amdgpu_bo_free_kernel(&psp->fw_pri_bo,
|
|
||||||
&psp->fw_pri_mc_addr, &psp->fw_pri_buf);
|
|
||||||
amdgpu_bo_free_kernel(&psp->fence_buf_bo,
|
|
||||||
&psp->fence_buf_mc_addr, &psp->fence_buf);
|
|
||||||
amdgpu_bo_free_kernel(&psp->cmd_buf_bo, &psp->cmd_buf_mc_addr,
|
|
||||||
(void **)&psp->cmd_buf_mem);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue