diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c index 5cc95f1a7dab..7a05f79818f1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c | |||
@@ -247,35 +247,28 @@ int amdgpu_ucode_init_bo(struct amdgpu_device *adev) | |||
247 | const struct common_firmware_header *header = NULL; | 247 | const struct common_firmware_header *header = NULL; |
248 | 248 | ||
249 | err = amdgpu_bo_create(adev, adev->firmware.fw_size, PAGE_SIZE, true, | 249 | err = amdgpu_bo_create(adev, adev->firmware.fw_size, PAGE_SIZE, true, |
250 | AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, bo); | 250 | AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, bo); |
251 | if (err) { | 251 | if (err) { |
252 | dev_err(adev->dev, "(%d) Firmware buffer allocate failed\n", err); | 252 | dev_err(adev->dev, "(%d) Firmware buffer allocate failed\n", err); |
253 | err = -ENOMEM; | ||
254 | goto failed; | 253 | goto failed; |
255 | } | 254 | } |
256 | 255 | ||
257 | err = amdgpu_bo_reserve(*bo, false); | 256 | err = amdgpu_bo_reserve(*bo, false); |
258 | if (err) { | 257 | if (err) { |
259 | amdgpu_bo_unref(bo); | ||
260 | dev_err(adev->dev, "(%d) Firmware buffer reserve failed\n", err); | 258 | dev_err(adev->dev, "(%d) Firmware buffer reserve failed\n", err); |
261 | goto failed; | 259 | goto failed_reserve; |
262 | } | 260 | } |
263 | 261 | ||
264 | err = amdgpu_bo_pin(*bo, AMDGPU_GEM_DOMAIN_GTT, &fw_mc_addr); | 262 | err = amdgpu_bo_pin(*bo, AMDGPU_GEM_DOMAIN_GTT, &fw_mc_addr); |
265 | if (err) { | 263 | if (err) { |
266 | amdgpu_bo_unreserve(*bo); | ||
267 | amdgpu_bo_unref(bo); | ||
268 | dev_err(adev->dev, "(%d) Firmware buffer pin failed\n", err); | 264 | dev_err(adev->dev, "(%d) Firmware buffer pin failed\n", err); |
269 | goto failed; | 265 | goto failed_pin; |
270 | } | 266 | } |
271 | 267 | ||
272 | err = amdgpu_bo_kmap(*bo, &fw_buf_ptr); | 268 | err = amdgpu_bo_kmap(*bo, &fw_buf_ptr); |
273 | if (err) { | 269 | if (err) { |
274 | dev_err(adev->dev, "(%d) Firmware buffer kmap failed\n", err); | 270 | dev_err(adev->dev, "(%d) Firmware buffer kmap failed\n", err); |
275 | amdgpu_bo_unpin(*bo); | 271 | goto failed_kmap; |
276 | amdgpu_bo_unreserve(*bo); | ||
277 | amdgpu_bo_unref(bo); | ||
278 | goto failed; | ||
279 | } | 272 | } |
280 | 273 | ||
281 | amdgpu_bo_unreserve(*bo); | 274 | amdgpu_bo_unreserve(*bo); |
@@ -290,10 +283,16 @@ int amdgpu_ucode_init_bo(struct amdgpu_device *adev) | |||
290 | fw_offset += ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); | 283 | fw_offset += ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); |
291 | } | 284 | } |
292 | } | 285 | } |
286 | return 0; | ||
293 | 287 | ||
288 | failed_kmap: | ||
289 | amdgpu_bo_unpin(*bo); | ||
290 | failed_pin: | ||
291 | amdgpu_bo_unreserve(*bo); | ||
292 | failed_reserve: | ||
293 | amdgpu_bo_unref(bo); | ||
294 | failed: | 294 | failed: |
295 | if (err) | 295 | adev->firmware.smu_load = false; |
296 | adev->firmware.smu_load = false; | ||
297 | 296 | ||
298 | return err; | 297 | return err; |
299 | } | 298 | } |