Skip to content

Commit 07dbfc6

Browse files
superm1alexdeucher
authored andcommitted
drm/amd: Use amdgpu_ucode_* helpers for PSP
The `amdgpu_ucode_request` helper will ensure that the return code for missing firmware is -ENODEV so that early_init can fail. The `amdgpu_ucode_release` helper is for symmetry on unloading. Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Reviewed-by: Lijo Lazar <lijo.lazar@amd.com> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 2d39c7a commit 07dbfc6

File tree

1 file changed

+21
-59
lines changed

1 file changed

+21
-59
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c

Lines changed: 21 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -511,20 +511,11 @@ static int psp_sw_fini(void *handle)
511511

512512
psp_memory_training_fini(psp);
513513

514-
release_firmware(psp->sos_fw);
515-
psp->sos_fw = NULL;
516-
517-
release_firmware(psp->asd_fw);
518-
psp->asd_fw = NULL;
519-
520-
release_firmware(psp->ta_fw);
521-
psp->ta_fw = NULL;
522-
523-
release_firmware(psp->cap_fw);
524-
psp->cap_fw = NULL;
525-
526-
release_firmware(psp->toc_fw);
527-
psp->toc_fw = NULL;
514+
amdgpu_ucode_release(&psp->sos_fw);
515+
amdgpu_ucode_release(&psp->asd_fw);
516+
amdgpu_ucode_release(&psp->ta_fw);
517+
amdgpu_ucode_release(&psp->cap_fw);
518+
amdgpu_ucode_release(&psp->toc_fw);
528519

529520
if (adev->ip_versions[MP0_HWIP][0] == IP_VERSION(11, 0, 0) ||
530521
adev->ip_versions[MP0_HWIP][0] == IP_VERSION(11, 0, 7))
@@ -2918,11 +2909,7 @@ int psp_init_asd_microcode(struct psp_context *psp, const char *chip_name)
29182909
int err = 0;
29192910

29202911
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", chip_name);
2921-
err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev);
2922-
if (err)
2923-
goto out;
2924-
2925-
err = amdgpu_ucode_validate(adev->psp.asd_fw);
2912+
err = amdgpu_ucode_request(adev, &adev->psp.asd_fw, fw_name);
29262913
if (err)
29272914
goto out;
29282915

@@ -2934,9 +2921,7 @@ int psp_init_asd_microcode(struct psp_context *psp, const char *chip_name)
29342921
le32_to_cpu(asd_hdr->header.ucode_array_offset_bytes);
29352922
return 0;
29362923
out:
2937-
dev_err(adev->dev, "fail to initialize asd microcode\n");
2938-
release_firmware(adev->psp.asd_fw);
2939-
adev->psp.asd_fw = NULL;
2924+
amdgpu_ucode_release(&adev->psp.asd_fw);
29402925
return err;
29412926
}
29422927

@@ -2948,11 +2933,7 @@ int psp_init_toc_microcode(struct psp_context *psp, const char *chip_name)
29482933
int err = 0;
29492934

29502935
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_toc.bin", chip_name);
2951-
err = request_firmware(&adev->psp.toc_fw, fw_name, adev->dev);
2952-
if (err)
2953-
goto out;
2954-
2955-
err = amdgpu_ucode_validate(adev->psp.toc_fw);
2936+
err = amdgpu_ucode_request(adev, &adev->psp.toc_fw, fw_name);
29562937
if (err)
29572938
goto out;
29582939

@@ -2964,9 +2945,7 @@ int psp_init_toc_microcode(struct psp_context *psp, const char *chip_name)
29642945
le32_to_cpu(toc_hdr->header.ucode_array_offset_bytes);
29652946
return 0;
29662947
out:
2967-
dev_err(adev->dev, "fail to request/validate toc microcode\n");
2968-
release_firmware(adev->psp.toc_fw);
2969-
adev->psp.toc_fw = NULL;
2948+
amdgpu_ucode_release(&adev->psp.toc_fw);
29702949
return err;
29712950
}
29722951

@@ -3111,11 +3090,7 @@ int psp_init_sos_microcode(struct psp_context *psp, const char *chip_name)
31113090
int fw_index = 0;
31123091

31133092
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sos.bin", chip_name);
3114-
err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev);
3115-
if (err)
3116-
goto out;
3117-
3118-
err = amdgpu_ucode_validate(adev->psp.sos_fw);
3093+
err = amdgpu_ucode_request(adev, &adev->psp.sos_fw, fw_name);
31193094
if (err)
31203095
goto out;
31213096

@@ -3187,10 +3162,7 @@ int psp_init_sos_microcode(struct psp_context *psp, const char *chip_name)
31873162

31883163
return 0;
31893164
out:
3190-
dev_err(adev->dev,
3191-
"failed to init sos firmware\n");
3192-
release_firmware(adev->psp.sos_fw);
3193-
adev->psp.sos_fw = NULL;
3165+
amdgpu_ucode_release(&adev->psp.sos_fw);
31943166

31953167
return err;
31963168
}
@@ -3347,10 +3319,7 @@ int psp_init_ta_microcode(struct psp_context *psp, const char *chip_name)
33473319
int err;
33483320

33493321
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name);
3350-
err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev);
3351-
if (err)
3352-
return err;
3353-
err = amdgpu_ucode_validate(adev->psp.ta_fw);
3322+
err = amdgpu_ucode_request(adev, &adev->psp.ta_fw, fw_name);
33543323
if (err)
33553324
return err;
33563325

@@ -3367,11 +3336,8 @@ int psp_init_ta_microcode(struct psp_context *psp, const char *chip_name)
33673336
err = -EINVAL;
33683337
}
33693338

3370-
if (err) {
3371-
dev_err(adev->dev, "fail to initialize ta microcode\n");
3372-
release_firmware(adev->psp.ta_fw);
3373-
adev->psp.ta_fw = NULL;
3374-
}
3339+
if (err)
3340+
amdgpu_ucode_release(&adev->psp.ta_fw);
33753341

33763342
return err;
33773343
}
@@ -3390,17 +3356,14 @@ int psp_init_cap_microcode(struct psp_context *psp, const char *chip_name)
33903356
}
33913357

33923358
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_cap.bin", chip_name);
3393-
err = request_firmware(&adev->psp.cap_fw, fw_name, adev->dev);
3394-
if (err) {
3395-
dev_warn(adev->dev, "cap microcode does not exist, skip\n");
3396-
err = 0;
3397-
goto out;
3398-
}
3399-
3400-
err = amdgpu_ucode_validate(adev->psp.cap_fw);
3359+
err = amdgpu_ucode_request(adev, &adev->psp.cap_fw, fw_name);
34013360
if (err) {
3361+
if (err == -ENODEV) {
3362+
dev_warn(adev->dev, "cap microcode does not exist, skip\n");
3363+
err = 0;
3364+
goto out;
3365+
}
34023366
dev_err(adev->dev, "fail to initialize cap microcode\n");
3403-
goto out;
34043367
}
34053368

34063369
info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CAP];
@@ -3417,8 +3380,7 @@ int psp_init_cap_microcode(struct psp_context *psp, const char *chip_name)
34173380
return 0;
34183381

34193382
out:
3420-
release_firmware(adev->psp.cap_fw);
3421-
adev->psp.cap_fw = NULL;
3383+
amdgpu_ucode_release(&adev->psp.cap_fw);
34223384
return err;
34233385
}
34243386

0 commit comments

Comments
 (0)