aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
diff options
context:
space:
mode:
authorHuang Rui <ray.huang@amd.com>2017-06-11 06:57:08 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-07-14 11:06:13 -0400
commita1952da73f8951eeb6e99e2b4fd1b8680ed9d801 (patch)
treedc81fa55c6992e85d6a51a9e0afecb92ba9af3e8 /drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
parent311146c91a2fdb4de92a0769cc1e5359a49b4c04 (diff)
drm/amdgpu: make psp cmd buffer as a reserve memory
Signed-off-by: Huang Rui <ray.huang@amd.com> Acked-by: Christian König <christian.koenig@amd.com> Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c38
1 files changed, 18 insertions, 20 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index e54c8fe90288..5346f291f881 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -118,33 +118,18 @@ psp_cmd_submit_buf(struct psp_context *psp,
118 int index) 118 int index)
119{ 119{
120 int ret; 120 int ret;
121 struct amdgpu_bo *cmd_buf_bo;
122 uint64_t cmd_buf_mc_addr;
123 struct psp_gfx_cmd_resp *cmd_buf_mem;
124 struct amdgpu_device *adev = psp->adev;
125
126 ret = amdgpu_bo_create_kernel(adev, PSP_CMD_BUFFER_SIZE, PAGE_SIZE,
127 AMDGPU_GEM_DOMAIN_VRAM,
128 &cmd_buf_bo, &cmd_buf_mc_addr,
129 (void **)&cmd_buf_mem);
130 if (ret)
131 return ret;
132 121
133 memset(cmd_buf_mem, 0, PSP_CMD_BUFFER_SIZE); 122 memset(psp->cmd_buf_mem, 0, PSP_CMD_BUFFER_SIZE);
134 123
135 memcpy(cmd_buf_mem, cmd, sizeof(struct psp_gfx_cmd_resp)); 124 memcpy(psp->cmd_buf_mem, cmd, sizeof(struct psp_gfx_cmd_resp));
136 125
137 ret = psp_cmd_submit(psp, ucode, cmd_buf_mc_addr, 126 ret = psp_cmd_submit(psp, ucode, psp->cmd_buf_mc_addr,
138 fence_mc_addr, index); 127 fence_mc_addr, index);
139 128
140 while (*((unsigned int *)psp->fence_buf) != index) { 129 while (*((unsigned int *)psp->fence_buf) != index) {
141 msleep(1); 130 msleep(1);
142 } 131 }
143 132
144 amdgpu_bo_free_kernel(&cmd_buf_bo,
145 &cmd_buf_mc_addr,
146 (void **)&cmd_buf_mem);
147
148 return ret; 133 return ret;
149} 134}
150 135
@@ -352,13 +337,20 @@ static int psp_load_fw(struct amdgpu_device *adev)
352 &psp->fence_buf_mc_addr, 337 &psp->fence_buf_mc_addr,
353 &psp->fence_buf); 338 &psp->fence_buf);
354 if (ret) 339 if (ret)
340 goto failed_mem2;
341
342 ret = amdgpu_bo_create_kernel(adev, PSP_CMD_BUFFER_SIZE, PAGE_SIZE,
343 AMDGPU_GEM_DOMAIN_VRAM,
344 &psp->cmd_buf_bo, &psp->cmd_buf_mc_addr,
345 (void **)&psp->cmd_buf_mem);
346 if (ret)
355 goto failed_mem1; 347 goto failed_mem1;
356 348
357 memset(psp->fence_buf, 0, PSP_FENCE_BUFFER_SIZE); 349 memset(psp->fence_buf, 0, PSP_FENCE_BUFFER_SIZE);
358 350
359 ret = psp_ring_init(psp, PSP_RING_TYPE__KM); 351 ret = psp_ring_init(psp, PSP_RING_TYPE__KM);
360 if (ret) 352 if (ret)
361 goto failed_mem1; 353 goto failed_mem;
362 354
363 ret = psp_tmr_init(psp); 355 ret = psp_tmr_init(psp);
364 if (ret) 356 if (ret)
@@ -379,9 +371,13 @@ static int psp_load_fw(struct amdgpu_device *adev)
379 return 0; 371 return 0;
380 372
381failed_mem: 373failed_mem:
374 amdgpu_bo_free_kernel(&psp->cmd_buf_bo,
375 &psp->cmd_buf_mc_addr,
376 (void **)&psp->cmd_buf_mem);
377failed_mem1:
382 amdgpu_bo_free_kernel(&psp->fence_buf_bo, 378 amdgpu_bo_free_kernel(&psp->fence_buf_bo,
383 &psp->fence_buf_mc_addr, &psp->fence_buf); 379 &psp->fence_buf_mc_addr, &psp->fence_buf);
384failed_mem1: 380failed_mem2:
385 amdgpu_bo_free_kernel(&psp->fw_pri_bo, 381 amdgpu_bo_free_kernel(&psp->fw_pri_bo,
386 &psp->fw_pri_mc_addr, &psp->fw_pri_buf); 382 &psp->fw_pri_mc_addr, &psp->fw_pri_buf);
387failed: 383failed:
@@ -442,6 +438,8 @@ static int psp_hw_fini(void *handle)
442 &psp->fence_buf_mc_addr, &psp->fence_buf); 438 &psp->fence_buf_mc_addr, &psp->fence_buf);
443 amdgpu_bo_free_kernel(&psp->asd_shared_bo, &psp->asd_shared_mc_addr, 439 amdgpu_bo_free_kernel(&psp->asd_shared_bo, &psp->asd_shared_mc_addr,
444 &psp->asd_shared_buf); 440 &psp->asd_shared_buf);
441 amdgpu_bo_free_kernel(&psp->cmd_buf_bo, &psp->cmd_buf_mc_addr,
442 (void **)&psp->cmd_buf_mem);
445 443
446 kfree(psp->cmd); 444 kfree(psp->cmd);
447 psp->cmd = NULL; 445 psp->cmd = NULL;