diff options
author | Huang Rui <ray.huang@amd.com> | 2017-06-11 06:57:08 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-07-14 11:06:13 -0400 |
commit | a1952da73f8951eeb6e99e2b4fd1b8680ed9d801 (patch) | |
tree | dc81fa55c6992e85d6a51a9e0afecb92ba9af3e8 /drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | |
parent | 311146c91a2fdb4de92a0769cc1e5359a49b4c04 (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.c | 38 |
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 | ||
381 | failed_mem: | 373 | failed_mem: |
374 | amdgpu_bo_free_kernel(&psp->cmd_buf_bo, | ||
375 | &psp->cmd_buf_mc_addr, | ||
376 | (void **)&psp->cmd_buf_mem); | ||
377 | failed_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); |
384 | failed_mem1: | 380 | failed_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); |
387 | failed: | 383 | failed: |
@@ -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; |